ZGlmZiAtLWdpdCBhL2ZpbmFsL0NNYWtlTGlzdHMudHh0IGIvZmluYWwvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAxMTE4NwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMiBAQAorY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuOCBGQVRBTF9FUlJPUikKK2FkZF9zdWJkaXJlY3RvcnkocnVudGltZSkKZGlmZiAtLWdpdCBhL2ZpbmFsL0NSRURJVFMudHh0IGIvZmluYWwvQ1JFRElUUy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgxZGEyMQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL0NSRURJVFMudHh0CkBAIC0wLDAgKzEsNTMgQEAKK1RoaXMgZmlsZSBpcyBhIHBhcnRpYWwgbGlzdCBvZiBwZW9wbGUgd2hvIGhhdmUgY29udHJpYnV0ZWQgdG8gdGhlIExMVk0vb3Blbm1wCitwcm9qZWN0LiAgSWYgeW91IGhhdmUgY29udHJpYnV0ZWQgYSBwYXRjaCBvciBtYWRlIHNvbWUgb3RoZXIgY29udHJpYnV0aW9uIHRvCitMTFZNL29wZW5tcCwgcGxlYXNlIHN1Ym1pdCBhIHBhdGNoIHRvIHRoaXMgZmlsZSB0byBhZGQgeW91cnNlbGYsIGFuZCBpdCB3aWxsIGJlCitkb25lIQorCitUaGUgbGlzdCBpcyBzb3J0ZWQgYnkgc3VybmFtZSBhbmQgZm9ybWF0dGVkIHRvIGFsbG93IGVhc3kgZ3JlcHBpbmcgYW5kCitiZWF1dGlmaWNhdGlvbiBieSBzY3JpcHRzLiAgVGhlIGZpZWxkcyBhcmU6IG5hbWUgKE4pLCBlbWFpbCAoRSksIHdlYi1hZGRyZXNzCisoVyksIFBHUCBrZXkgSUQgYW5kIGZpbmdlcnByaW50IChQKSwgZGVzY3JpcHRpb24gKEQpLCBhbmQgc25haWwtbWFpbCBhZGRyZXNzCisoUykuCisKK046IENhcmxvIEJlcnRvbGxpCitXOiBodHRwOi8vaWJtLmNvbQorRDogSUJNIGNvbnRyaWJ1dG9yIHRvIFBvd2VyUEMgc3VwcG9ydCBpbiBDTWFrZSBmaWxlcyBhbmQgZWxzZXdoZXJlLgorCitOOiBTdW5pdGEgQ2hhbmRyYXNla2FyYW4KK0Q6IENvbnRyaWJ1dG9yIHRvIHRlc3RzdWl0ZSBmcm9tIE9wZW5VSAorCitOOiBCYXJiYXJhIENoYXBtYW4KK0Q6IENvbnRyaWJ1dG9yIHRvIHRlc3RzdWl0ZSBmcm9tIE9wZW5VSAorCitOOiBVbml2ZXJzaXR5IG9mIEhvdXN0b24gCitXOiBodHRwOi8vd2ViLmNzLnVoLmVkdS9+b3BlbnVoL2Rvd25sb2FkLworRDogT3BlblVIIHRlc3Qgc3VpdGUKKworTjogSW50ZWwgQ29ycG9yYXRpb24gT3Blbk1QIHJ1bnRpbWUgdGVhbQorVzogaHR0cDovL29wZW5tcHJ0bC5vcmcKK0Q6IENyZWF0ZWQgdGhlIHJ1bnRpbWUuCisKK046IEpvaG4gTWVsbG9yLUNydW1tZXkgYW5kIG90aGVyIG1lbWJlcnMgb2YgdGhlIE9wZW5NUCBUb29scyBXb3JraW5nIEdyb3VwCitFOiBqb2hubWNAcmljZS5lZHUKK0Q6IE9wZW5NUCBUb29scyBJbnRlcmZhY2UgKE9NUFQpCisKK046IE1hdHRoaWFzIE11bGxlcgorRDogQ29udHJpYnV0b3IgdG8gdGVzdHN1aXRlIGZyb20gT3BlblVICisKK046IFRhbCBOZXZvCitFOiB0YWxAc2NhbGVtcC5jb20KK0Q6IFNjYWxlTVAgY29udHJpYnV0b3IgdG8gaW1wcm92ZSBydW50aW1lIHBlcmZvcm1hbmNlIHRoZXJlLgorVzogaHR0cDovL3NjYWxlbXAuY29tCisKK046IFBhdmVsIE5leXRjaGV2CitEOiBDb250cmlidXRvciB0byB0ZXN0c3VpdGUgZnJvbSBPcGVuVUgKKworTjogU3RldmVuIE5vb25hbgorRTogc3RldmVuQHVwbGlua2xhYnMubmV0CitEOiBQYXRjaGVzIGZvciB0aGUgQVJNIGFyY2hpdGVjdHVyZSBhbmQgcmVtb3ZhbCBvZiBzZXZlcmFsIGluY29uc2lzdGVuY2llcy4KKworTjogQWxwIFRva2VyCitFOiBhbHBAbnVhbnRpLmNvbQorRDogTWFraW5nIGJ1aWxkIHdvcmsgZm9yIEZyZWVCU0QuCisKK046IENoZW5nIFdhbmcgCitEOiBDb250cmlidXRvciB0byB0ZXN0c3VpdGUgZnJvbSBPcGVuVUgKZGlmZiAtLWdpdCBhL2ZpbmFsL0xJQ0VOU0UudHh0IGIvZmluYWwvTElDRU5TRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdkYzIwYwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL0xJQ0VOU0UudHh0CkBAIC0wLDAgKzEsMTI0IEBACis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIHNvZnR3YXJlIGNvbnRhaW5lZCBpbiB0aGlzIGRpcmVjdG9yeSB0cmVlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgYm90aCB0aGUKK1VuaXZlcnNpdHkgb2YgSWxsaW5vaXMgIkJTRC1MaWtlIiBsaWNlbnNlIGFuZCB0aGUgTUlUIGxpY2Vuc2UuICBBcyBhIHVzZXIgb2YKK3RoaXMgY29kZSB5b3UgbWF5IGNob29zZSB0byB1c2UgaXQgdW5kZXIgZWl0aGVyIGxpY2Vuc2UuICBBcyBhIGNvbnRyaWJ1dG9yLAoreW91IGFncmVlIHRvIGFsbG93IHlvdXIgY29kZSB0byBiZSB1c2VkIHVuZGVyIGJvdGguICBUaGUgZnVsbCB0ZXh0IG9mIHRoZQorcmVsZXZhbnQgbGljZW5zZXMgaXMgaW5jbHVkZWQgYmVsb3cuCisKK0luIGFkZGl0aW9uLCBhIGxpY2Vuc2UgYWdyZWVtZW50IGZyb20gdGhlIGNvcHlyaWdodC9wYXRlbnQgaG9sZGVycyBvZiB0aGUKK3NvZnR3YXJlIGNvbnRhaW5lZCBpbiB0aGlzIGRpcmVjdG9yeSB0cmVlIGlzIGluY2x1ZGVkIGJlbG93LgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVW5pdmVyc2l0eSBvZiBJbGxpbm9pcy9OQ1NBCitPcGVuIFNvdXJjZSBMaWNlbnNlCisKK0NvcHlyaWdodCAoYykgMTk5Ny0yMDE1IEludGVsIENvcnBvcmF0aW9uCisKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK0RldmVsb3BlZCBieToKKyAgICBPcGVuTVAgUnVudGltZSBUZWFtCisgICAgSW50ZWwgQ29ycG9yYXRpb24KKyAgICBodHRwOi8vd3d3Lm9wZW5tcHJ0bC5vcmcKKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgordGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgd2l0aAordGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bwordXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKK29mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbworc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVycy4KKworICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcnMgaW4gdGhlCisgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgKiBOZWl0aGVyIHRoZSBuYW1lcyBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBPcGVuTVAgUnVudGltZSBUZWFtIG5vciB0aGUKKyAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgICBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCitGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorQ09OVFJJQlVUT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBXSVRIIFRIRQorU09GVFdBUkUuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitDb3B5cmlnaHQgKGMpIDE5OTctMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbgorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CitvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAoraW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwordG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCitmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKK09VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KK1RIRSBTT0ZUV0FSRS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0ludGVsIENvcnBvcmF0aW9uCisKK1NvZnR3YXJlIEdyYW50IExpY2Vuc2UgQWdyZWVtZW50ICgiQWdyZWVtZW50IikKKworRXhjZXB0IGZvciB0aGUgbGljZW5zZSBncmFudGVkIGhlcmVpbiB0byB5b3UsIEludGVsIENvcnBvcmF0aW9uICgiSW50ZWwiKSByZXNlcnZlcworYWxsIHJpZ2h0LCB0aXRsZSwgYW5kIGludGVyZXN0IGluIGFuZCB0byB0aGUgU29mdHdhcmUgKGRlZmluZWQgYmVsb3cpLgorCitEZWZpbml0aW9uCisKKyJTb2Z0d2FyZSIgbWVhbnMgdGhlIGNvZGUgYW5kIGRvY3VtZW50YXRpb24gYXMgd2VsbCBhcyBhbnkgb3JpZ2luYWwgd29yayBvZgorYXV0aG9yc2hpcCwgaW5jbHVkaW5nIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucyB0byBhbiBleGlzdGluZyB3b3JrLCB0aGF0CitpcyBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBieSBJbnRlbCB0byBsbHZtLm9yZyAoaHR0cDovL2xsdm0ub3JnKSAoIkxMVk0iKSBmb3IKK2luY2x1c2lvbiBpbiwgb3IgZG9jdW1lbnRhdGlvbiBvZiwgYW55IG9mIHRoZSBwcm9kdWN0cyBvd25lZCBvciBtYW5hZ2VkIGJ5IExMVk0KKyh0aGUgIldvcmsiKS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiIG1lYW5zIGFueSBmb3JtIG9mCitlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50IHRvIExMVk0gb3IgaXRzCityZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljCittYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlCittYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIExMVk0gZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZwordGhlIFdvcmssIGJ1dCBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG90aGVyd2lzZS4KKworMS4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMKKyAgIEFncmVlbWVudCwgSW50ZWwgaGVyZWJ5IGdyYW50cyB0byB5b3UgYW5kIHRvIHJlY2lwaWVudHMgb2YgdGhlIFNvZnR3YXJlCisgICBkaXN0cmlidXRlZCBieSBMTFZNIGEgcGVycGV0dWFsLCB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwKKyAgIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUKKyAgIHdvcmtzIG9mLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgIFNvZnR3YXJlIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MuCisKKzIuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzCisgICBBZ3JlZW1lbnQsIEludGVsIGhlcmVieSBncmFudHMgeW91IGFuZCB0byByZWNpcGllbnRzIG9mIHRoZSBTb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgYnkgTExWTSBhIHBlcnBldHVhbCwgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsCisgICByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UKKyAgIHRvIG1ha2UsIGhhdmUgbWFkZSwgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIKKyAgIHRoZSBXb3JrLCB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgYnkgSW50ZWwgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IEludGVsJ3MgU29mdHdhcmUgYWxvbmUgb3IgYnkKKyAgIGNvbWJpbmF0aW9uIG9mIHRoZSBTb2Z0d2FyZSB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggU29mdHdhcmUgd2FzCisgICBzdWJtaXR0ZWQuIElmIGFueSBlbnRpdHkgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IEludGVsIG9yIGFueQorICAgb3RoZXIgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZworICAgdGhhdCBJbnRlbCdzIFNvZnR3YXJlLCBvciB0aGUgV29yayB0byB3aGljaCBJbnRlbCBoYXMgY29udHJpYnV0ZWQgY29uc3RpdHV0ZXMKKyAgIGRpcmVjdCBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzIGdyYW50ZWQKKyAgIHRvIHRoYXQgZW50aXR5IHVuZGVyIHRoaXMgQWdyZWVtZW50IGZvciB0aGUgU29mdHdhcmUgb3IgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCB0aGUgc29mdHdhcmUgaXMKK3Byb3ZpZGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELAorZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yCitjb25kaXRpb25zIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL01ha2VmaWxlIGIvZmluYWwvb2ZmbG9hZC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43NWUzNzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9NYWtlZmlsZQpAQCAtMCwwICsxLDIyNCBAQAorIw0KKyMjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisjLy8NCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQ0KKyMvLw0KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuDQorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLg0KKyMvLw0KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKyMNCisNCisjIE1BS0VGSUxFIFBBUkFNRVRFUlMNCisjDQorIyByb290X2RpciAtIHBhdGggdG8gcm9vdCBkaXJlY3Rvcnkgb2YgbGlib2ZmbG9hZA0KKyMgYnVpbGRfZGlyIC0gcGF0aCB0byBidWlsZCBkaXJlY3RvcnkNCisjIG1wc3NfZGlyIC0gcGF0aCB0byByb290IGRpcmVjdG9yeSBvZiBtcHNzDQorIyBtcHNzX3ZlcnNpb24gLSB2ZXJzaW9uIG9mIHRoZSBtcHNzIChlLmcuLCB2ZXJzaW9uICIzLjMueCIgd291bGQgYmUgIjMzIikNCisjIGxpYmlvbXBfaG9zdF9kaXIgLSBwYXRoIHRvIGhvc3QgbGliaW9tcCBkaXJlY3RvcnkgKHVubmVjZXNzYXJ5IGlmIGNvbXBpbGVyX2hvc3QgaXMgaWNjKQ0KKyMgbGliaW9tcF90YXJnZXRfZGlyIC0gcGF0aCB0byB0YXJnZXQgbGliaW9tcCBkaXJlY3RvcnkgKHVubmVjZXNhcnJ5IGlmIGNvbXBpbGVyX3RhcmdldCBpcyBpY2MpDQorIyBvbXBfaGVhZGVyX2RpciAtIHBhdGggdG8gb21wLmggKHVubmVjZXNzYXJ5IGlmIGNvbXBpbGVyX2hvc3QgYW5kIGNvbXBpbGVyX3RhcmdldCBhcmUgaWNjKQ0KKyMgb3NfaG9zdCAtIGhvc3Qgb3BlcmF0aW5nIHN5c3RlbQ0KKyMgb3NfdGFyZ2V0IC0gdGFyZ2V0IG9wZXJhdGluZyBzeXN0ZW0NCisjIGNvbXBpbGVyX2hvc3QgLSBob3N0IGNvbXBpbGVyDQorIyBjb21waWxlcl90YXJnZXQgLSB0YXJnZXQgY29tcGlsZXINCisjIG9wdGlvbnNfaG9zdCAtIGFkZGl0aW9uYWwgb3B0aW9ucyBmb3IgaG9zdCBjb21waWxlcg0KKyMgb3B0aW9uc190YXJnZXQgLSBhZGRpdGlvbmFsIG9wdGlvbnMgZm9yIHRhcmdldCBjb21waWxlcg0KKyMNCisNCisjIERpcmVjdG9yaWVzDQorcm9vdF9kaXI/PS4NCitidWlsZF9kaXI/PSQocm9vdF9kaXIpL2J1aWxkDQorYnVpbGRfaG9zdF9kaXI9JChidWlsZF9kaXIpL2hvc3QNCitidWlsZF90YXJnZXRfZGlyPSQoYnVpbGRfZGlyKS90YXJnZXQNCitvYmpfaG9zdF9kaXI9JChidWlsZF9kaXIpL29ial9ob3N0DQorb2JqX3RhcmdldF9kaXI9JChidWlsZF9kaXIpL29ial90YXJnZXQNCitzb3VyY2VfZGlyPSQocm9vdF9kaXIpL3NyYw0KK2ltcG9ydGVkX2Rpcj0kKHNvdXJjZV9kaXIpL2ltcG9ydGVkDQorDQorIyBPUw0KK29zX2hvc3Q/PWxpbnV4DQorb3NfdGFyZ2V0Pz1saW51eA0KK2lmbmVxICgkKG9zX2hvc3QpXyQob3NfdGFyZ2V0KSwgbGludXhfbGludXgpDQorICAkKGVycm9yICJPbmx5IGxpbnV4IGlzIHN1cHBvcnRlZCIpDQorZW5kaWYNCisNCisjIENvbXBpbGVycw0KK2NvbXBpbGVyX2hvc3Q/PWdjYw0KK2NvbXBpbGVyX3RhcmdldD89Z2NjDQorDQorIyBNUFNTDQorbXBzc192ZXJzaW9uPz0zMA0KK21wc3NfZGlyPz0vDQorbXBzc19wcmVzZW50PSQoc2hlbGwgaWYgdGVzdCAtZCAkKG1wc3NfZGlyKTsgdGhlbiBlY2hvIE9LOyBlbHNlIGVjaG8gS087IGZpKQ0KK2lmbmVxICgkKG1wc3NfcHJlc2VudCksIE9LKQ0KKyAgJChlcnJvciAiQ2Fubm90IGZpbmQgTVBTUyBkaXJlY3RvcnkgJChtcHNzX2RpcikiKQ0KK2VuZGlmDQorDQoraWZlcSAoJChzaGVsbCB0ZXN0ICQobXBzc192ZXJzaW9uKSAtZ3QgMzM7IGVjaG8gJCQ/KSwgMCkNCisgIGNvaV9kaXI9JChtcHNzX2Rpcikvc3lzcm9vdHMvazFvbS1tcHNzLWxpbnV4L3Vzcg0KKyAgY29pX2luY2x1ZGU9JChjb2lfZGlyKS9pbmNsdWRlL2ludGVsLWNvaQ0KKyAgY29pX2xpYl9ob3N0PSQobXBzc19kaXIpL2xpYjY0DQorICBjb2lfbGliX2RldmljZT0kKGNvaV9kaXIpL2xpYjY0DQorZWxzZQ0KKyAgY29pX2Rpcj0kKG1wc3NfZGlyKS9vcHQvaW50ZWwvbWljL2NvaQ0KKyAgY29pX2luY2x1ZGU9JChjb2lfZGlyKS9pbmNsdWRlDQorICBjb2lfbGliX2hvc3Q9JChjb2lfZGlyKS9ob3N0LWxpbnV4LXJlbGVhc2UvbGliDQorICBjb2lfbGliX2RldmljZT0kKGNvaV9kaXIpL2RldmljZS1saW51eC1yZWxlYXNlL2xpYg0KK2VuZGlmDQorbXlvX2Rpcj0kKG1wc3NfZGlyKS9vcHQvaW50ZWwvbWljL215bw0KKw0KKyMgU291cmNlcw0KK3NyY19saWJvZmZsb2FkX2NvbW1vbj1kdl91dGlsLmNwcCBsaWJvZmZsb2FkX2Vycm9yLmMgbGlib2ZmbG9hZF9tc2cuYyBvZmZsb2FkX2NvbW1vbi5jcHAgb2ZmbG9hZF90YWJsZS5jcHAgb2ZmbG9hZF90cmFjZS5jcHAgb2ZmbG9hZF91dGlsLmNwcA0KKw0KK3NyY19saWJvZmZsb2FkX2hvc3Q9JChzcmNfbGlib2ZmbG9hZF9jb21tb24pIGNlYW5fdXRpbC5jcHAgY29pL2NvaV9jbGllbnQuY3BwIGNvbXBpbGVyX2lmX2hvc3QuY3BwIG9mZmxvYWRfZW5naW5lLmNwcCBvZmZsb2FkX2Vudi5jcHAgb2ZmbG9hZF9ob3N0LmNwcCBvZmZsb2FkX29tcF9ob3N0LmNwcCBvZmZsb2FkX3RpbWVyX2hvc3QuY3BwIG9mZmxvYWRfb3JzbC5jcHAgb3JzbC1saXRlL2xpYi9vcnNsLWxpdGUuYyBvZmZsb2FkX215b19ob3N0LmNwcA0KK3NyY19saWJvZmZsb2FkX2hvc3Q6PSQoZm9yZWFjaCBmaWxlLCQoc3JjX2xpYm9mZmxvYWRfaG9zdCksJChzb3VyY2VfZGlyKS8kKGZpbGUpKQ0KKw0KK3NyY19saWJvZmZsb2FkX3RhcmdldD0kKHNyY19saWJvZmZsb2FkX2NvbW1vbikgY29pL2NvaV9zZXJ2ZXIuY3BwIGNvbXBpbGVyX2lmX3RhcmdldC5jcHAgb2ZmbG9hZF9vbXBfdGFyZ2V0LmNwcCBvZmZsb2FkX3RhcmdldC5jcHAgb2ZmbG9hZF90aW1lcl90YXJnZXQuY3BwIG9mZmxvYWRfbXlvX3RhcmdldC5jcHANCitzcmNfbGlib2ZmbG9hZF90YXJnZXQ6PSQoZm9yZWFjaCBmaWxlLCQoc3JjX2xpYm9mZmxvYWRfdGFyZ2V0KSwkKHNvdXJjZV9kaXIpLyQoZmlsZSkpDQorDQorc3JjX29mbGQ9b2ZsZGJlZ2luLmNwcCBvZmxkZW5kLmNwcA0KK3NyY19vZmxkOj0kKGZvcmVhY2ggZmlsZSwkKHNyY19vZmxkKSwkKHNvdXJjZV9kaXIpLyQoZmlsZSkpDQorDQoraGVhZGVycz0kKHdpbGRjYXJkICQoc291cmNlX2RpcikvKi5oKSAkKHdpbGRjYXJkICQoc291cmNlX2RpcikvY29pLyouaCkgJCh3aWxkY2FyZCAkKHNvdXJjZV9kaXIpL29yc2wtbGl0ZS9pbmNsdWRlLyouaCkNCitpZm5lcSAoJChvbXBfaGVhZGVyX2RpciksICkNCisgIGhlYWRlcnMrPSQoaW1wb3J0ZWRfZGlyKS9vbXAuaA0KK2VuZGlmDQorDQorIyBPYmplY3RzDQorb2JqX2xpYm9mZmxvYWRfaG9zdD0kKG5vdGRpciAkKHNyY19saWJvZmZsb2FkX2hvc3QpKQ0KK29ial9saWJvZmZsb2FkX2hvc3Q6PSQob2JqX2xpYm9mZmxvYWRfaG9zdDouY3BwPS5vKQ0KK29ial9saWJvZmZsb2FkX2hvc3Q6PSQob2JqX2xpYm9mZmxvYWRfaG9zdDouYz0ubykNCitvYmpfbGlib2ZmbG9hZF9ob3N0Oj0kKGZvcmVhY2ggZmlsZSwkKG9ial9saWJvZmZsb2FkX2hvc3QpLCQob2JqX2hvc3RfZGlyKS8kKGZpbGUpKQ0KKw0KK29ial9saWJvZmZsb2FkX3RhcmdldD0kKG5vdGRpciAkKHNyY19saWJvZmZsb2FkX3RhcmdldCkpDQorb2JqX2xpYm9mZmxvYWRfdGFyZ2V0Oj0kKG9ial9saWJvZmZsb2FkX3RhcmdldDouY3BwPS5vKQ0KK29ial9saWJvZmZsb2FkX3RhcmdldDo9JChvYmpfbGlib2ZmbG9hZF90YXJnZXQ6LmM9Lm8pDQorb2JqX2xpYm9mZmxvYWRfdGFyZ2V0Oj0kKGZvcmVhY2ggZmlsZSwkKG9ial9saWJvZmZsb2FkX3RhcmdldCksJChvYmpfdGFyZ2V0X2RpcikvJChmaWxlKSkNCisNCitvYmpfb2ZsZD0kKG5vdGRpciAkKHNyY19vZmxkKSkNCitvYmpfb2ZsZDo9JChvYmpfb2ZsZDouY3BwPS5vKQ0KK29ial9vZmxkX2hvc3Q9JChmb3JlYWNoIGZpbGUsJChvYmpfb2ZsZCksJChidWlsZF9ob3N0X2RpcikvJChmaWxlKSkNCitvYmpfb2ZsZF90YXJnZXQ9JChmb3JlYWNoIGZpbGUsJChvYmpfb2ZsZCksJChidWlsZF90YXJnZXRfZGlyKS8kKGZpbGUpKQ0KKw0KKyMgT3B0aW9ucw0KK29wdHNfY29tbW9uPS1PMiAtdyAtZnBpYyAtYyAtRENPSV9MSUJSQVJZX1ZFUlNJT049MiAtRE1ZT19TVVBQT1JUIC1ET0ZGTE9BRF9ERUJVRz0xIC1EU0VQX1NVUFBPUlQgLURUSU1JTkdfU1VQUE9SVCAtSSQoY29pX2luY2x1ZGUpIC1JJChteW9fZGlyKS9pbmNsdWRlIC1JJChzb3VyY2VfZGlyKQ0KK2lmbmVxICgkKG9tcF9oZWFkZXJfZGlyKSwgKQ0KKyAgb3B0c19jb21tb24rPS1JJChpbXBvcnRlZF9kaXIpDQorZW5kaWYNCisNCitvcHRzX2xpYm9mZmxvYWQ9LXNoYXJlZCAtV2wsLXNvbmFtZSxsaWJvZmZsb2FkLnNvLjUgLWxkbCAtbHN0ZGMrKyAtbGlvbXA1DQorDQorb3B0c19saWJvZmZsb2FkX2hvc3Q9JChvcHRzX2xpYm9mZmxvYWQpIC1MJChjb2lfbGliX2hvc3QpIC1sY29pX2hvc3QgLUwkKG15b19kaXIpL2xpYiAtbG15by1jbGllbnQNCitpZm5lcSAoJChsaWJpb21wX2hvc3RfZGlyKSwgKQ0KKyAgb3B0c19saWJvZmZsb2FkX2hvc3QrPS1MJChsaWJpb21wX2hvc3RfZGlyKQ0KK2VuZGlmDQorDQorb3B0c19saWJvZmZsb2FkX3RhcmdldD0kKG9wdHNfbGlib2ZmbG9hZCkgLUwkKGNvaV9saWJfZGV2aWNlKSAtbGNvaV9kZXZpY2UgLUwkKG15b19kaXIpL2xpYiAtbG15by1zZXJ2aWNlDQoraWZuZXEgKCQobGliaW9tcF90YXJnZXRfZGlyKSwgKQ0KKyAgb3B0c19saWJvZmZsb2FkX3RhcmdldCs9LUwkKGxpYmlvbXBfdGFyZ2V0X2RpcikNCitlbmRpZg0KKw0KK29wdGlvbnNfaG9zdD89DQorb3B0c19ob3N0PSQob3B0aW9uc19ob3N0KSAtREhPU1RfTElCUkFSWT0xIC1ETVBTU19WRVJTSU9OPSQobXBzc192ZXJzaW9uKQ0KK2lmZXEgKCQob3NfaG9zdCksIGxpbnV4KQ0KKyAgb3B0c19ob3N0Kz0tRExJTlVYDQorZW5kaWYNCisNCitvcHRpb25zX3RhcmdldD89DQorb3B0c190YXJnZXQ9JChvcHRpb25zX3RhcmdldCkgLURIT1NUX0xJQlJBUlk9MA0KK2lmZXEgKCQob3NfdGFyZ2V0KSwgbGludXgpDQorICBvcHRzX3RhcmdldCs9LURMSU5VWA0KK2VuZGlmDQoraWZlcSAoJChjb21waWxlcl90YXJnZXQpLCBpY2MpDQorICBvcHRzX3RhcmdldCs9LW1taWMNCitlbmRpZg0KKw0KKyMgTWFrZSB0YXJnZXRzDQorLlBIT05ZOiBhbGwgY2xlYW4gaW5mbw0KKw0KK2FsbDogaW5mbyAkKGJ1aWxkX2hvc3RfZGlyKS9saWJvZmZsb2FkLnNvICQoYnVpbGRfdGFyZ2V0X2RpcikvbGlib2ZmbG9hZC5zbyAkKG9ial9vZmxkX2hvc3QpICQob2JqX29mbGRfdGFyZ2V0KQ0KKw0KKw0KKyQoYnVpbGRfaG9zdF9kaXIpL2xpYm9mZmxvYWQuc286ICQoYnVpbGRfaG9zdF9kaXIpL2xpYm9mZmxvYWQuc28uNSB8ICQoYnVpbGRfaG9zdF9kaXIpDQorCWxuIC1mICQ8ICRADQorDQorJChidWlsZF9ob3N0X2RpcikvbGlib2ZmbG9hZC5zby41OiAkKG9ial9saWJvZmZsb2FkX2hvc3QpIHwgJChidWlsZF9ob3N0X2RpcikNCisJJChjb21waWxlcl9ob3N0KSAkKG9wdHNfbGlib2ZmbG9hZF9ob3N0KSAkKG9wdHNfaG9zdCkgJF4gLW8gJEANCisNCiskKG9ial9ob3N0X2RpcikvJS5vOiAkKHNvdXJjZV9kaXIpLyUuYyAkKGhlYWRlcnMpIHwgJChvYmpfaG9zdF9kaXIpDQorCSQoY29tcGlsZXJfaG9zdCkgJChvcHRzX2NvbW1vbikgJChvcHRzX2hvc3QpICQ8IC1vICRADQorDQorJChvYmpfaG9zdF9kaXIpLyUubzogJChzb3VyY2VfZGlyKS8lLmNwcCAkKGhlYWRlcnMpIHwgJChvYmpfaG9zdF9kaXIpDQorCSQoY29tcGlsZXJfaG9zdCkgJChvcHRzX2NvbW1vbikgJChvcHRzX2hvc3QpICQ8IC1vICRADQorDQorJChvYmpfaG9zdF9kaXIpLyUubzogJChzb3VyY2VfZGlyKS9jb2kvJS5jcHAgJChoZWFkZXJzKSB8ICQob2JqX2hvc3RfZGlyKQ0KKwkkKGNvbXBpbGVyX2hvc3QpICQob3B0c19jb21tb24pICQob3B0c19ob3N0KSAkPCAtbyAkQA0KKw0KKyQob2JqX2hvc3RfZGlyKS8lLm86ICQoc291cmNlX2Rpcikvb3JzbC1saXRlL2xpYi8lLmMgJChoZWFkZXJzKSB8ICQob2JqX2hvc3RfZGlyKQ0KKwkkKGNvbXBpbGVyX2hvc3QpICQob3B0c19jb21tb24pICQob3B0c19ob3N0KSAkPCAtbyAkQA0KKw0KKw0KKyQoYnVpbGRfdGFyZ2V0X2RpcikvbGlib2ZmbG9hZC5zbzogJChidWlsZF90YXJnZXRfZGlyKS9saWJvZmZsb2FkLnNvLjUgfCAkKGJ1aWxkX3RhcmdldF9kaXIpDQorCWxuIC1mICQ8ICRADQorDQorJChidWlsZF90YXJnZXRfZGlyKS9saWJvZmZsb2FkLnNvLjU6ICQob2JqX2xpYm9mZmxvYWRfdGFyZ2V0KSB8ICQoYnVpbGRfdGFyZ2V0X2RpcikNCisJJChjb21waWxlcl90YXJnZXQpICQob3B0c19saWJvZmZsb2FkX3RhcmdldCkgJChvcHRzX3RhcmdldCkgJF4gLW8gJEANCisNCiskKG9ial90YXJnZXRfZGlyKS8lLm86ICQoc291cmNlX2RpcikvJS5jICQoaGVhZGVycykgfCAkKG9ial90YXJnZXRfZGlyKQ0KKwkkKGNvbXBpbGVyX3RhcmdldCkgJChvcHRzX2NvbW1vbikgJChvcHRzX3RhcmdldCkgJDwgLW8gJEANCisNCiskKG9ial90YXJnZXRfZGlyKS8lLm86ICQoc291cmNlX2RpcikvJS5jcHAgJChoZWFkZXJzKSB8ICQob2JqX3RhcmdldF9kaXIpDQorCSQoY29tcGlsZXJfdGFyZ2V0KSAkKG9wdHNfY29tbW9uKSAkKG9wdHNfdGFyZ2V0KSAkPCAtbyAkQA0KKw0KKyQob2JqX3RhcmdldF9kaXIpLyUubzogJChzb3VyY2VfZGlyKS9jb2kvJS5jcHAgJChoZWFkZXJzKSB8ICQob2JqX3RhcmdldF9kaXIpDQorCSQoY29tcGlsZXJfdGFyZ2V0KSAkKG9wdHNfY29tbW9uKSAkKG9wdHNfdGFyZ2V0KSAkPCAtbyAkQA0KKw0KKyQob2JqX3RhcmdldF9kaXIpLyUubzogJChzb3VyY2VfZGlyKS9vcnNsLWxpdGUvbGliLyUuYyAkKGhlYWRlcnMpIHwgJChvYmpfdGFyZ2V0X2RpcikNCisJJChjb21waWxlcl90YXJnZXQpICQob3B0c19jb21tb24pICQob3B0c190YXJnZXQpICQ8IC1vICRADQorDQorDQorJChidWlsZF9ob3N0X2RpcikvJS5vOiAkKHNvdXJjZV9kaXIpLyUuY3BwICQoaGVhZGVycykgfCAkKGJ1aWxkX2hvc3RfZGlyKQ0KKwkkKGNvbXBpbGVyX2hvc3QpICQob3B0c19jb21tb24pICQob3B0c19ob3N0KSAkPCAtbyAkQA0KKw0KKyQoYnVpbGRfdGFyZ2V0X2RpcikvJS5vOiAkKHNvdXJjZV9kaXIpLyUuY3BwICQoaGVhZGVycykgfCAkKGJ1aWxkX3RhcmdldF9kaXIpDQorCSQoY29tcGlsZXJfdGFyZ2V0KSAkKG9wdHNfY29tbW9uKSAkKG9wdHNfdGFyZ2V0KSAkPCAtbyAkQA0KKw0KKw0KKyQoaW1wb3J0ZWRfZGlyKS9vbXAuaDogJChvbXBfaGVhZGVyX2Rpcikvb21wLmggfCAkKGltcG9ydGVkX2RpcikNCisJY3AgJDwgJEANCisNCisNCiskKGJ1aWxkX2hvc3RfZGlyKSAkKGJ1aWxkX3RhcmdldF9kaXIpICQob2JqX2hvc3RfZGlyKSAkKG9ial90YXJnZXRfZGlyKTogfCAkKGJ1aWxkX2RpcikNCisJJChzaGVsbCBta2RpciAtcCAkQCA+L2Rldi9udWxsIDI+L2Rldi9udWxsKQ0KKwlAZWNobyAiQ3JlYXRlZCAkQCBkaXJlY3RvcnkiDQorDQorJChidWlsZF9kaXIpOg0KKwkkKHNoZWxsIG1rZGlyIC1wICRAID4vZGV2L251bGwgMj4vZGV2L251bGwpDQorCUBlY2hvICJDcmVhdGVkICRAIGRpcmVjdG9yeSINCisNCiskKGltcG9ydGVkX2Rpcik6DQorCSQoc2hlbGwgbWtkaXIgLXAgJEAgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCkNCisJQGVjaG8gIkNyZWF0ZWQgJEAgZGlyZWN0b3J5Ig0KKw0KKw0KK2NsZWFuOg0KKwkkKHNoZWxsIHJtIC1yZiAkKGJ1aWxkX2RpcikpDQorCUBlY2hvICJSZW1vdmUgJChidWlsZF9kaXIpIGRpcmVjdG9yeSINCisNCisNCitpbmZvOg0KKwlAZWNobyAicm9vdF9kaXIgPSAkKHJvb3RfZGlyKSINCisJQGVjaG8gImJ1aWxkX2RpciA9ICQoYnVpbGRfZGlyKSINCisJQGVjaG8gIm1wc3NfZGlyID0gJChtcHNzX2RpcikiDQorCUBlY2hvICJtcHNzX3ZlcnNpb24gPSAkKG1wc3NfdmVyc2lvbikiDQorCUBlY2hvICJsaWJpb21wX2hvc3RfZGlyID0gJChsaWJpb21wX2hvc3RfZGlyKSINCisJQGVjaG8gImxpYmlvbXBfdGFyZ2V0X2RpciA9ICQobGliaW9tcF90YXJnZXRfZGlyKSINCisJQGVjaG8gIm9tcF9oZWFkZXJfZGlyID0gJChvbXBfaGVhZGVyX2RpcikiDQorCUBlY2hvICJvc19ob3N0ID0gJChvc19ob3N0KSINCisJQGVjaG8gIm9zX3RhcmdldCA9ICQob3NfdGFyZ2V0KSINCisJQGVjaG8gImNvbXBpbGVyX2hvc3QgPSAkKGNvbXBpbGVyX2hvc3QpIg0KKwlAZWNobyAiY29tcGlsZXJfdGFyZ2V0ID0gJChjb21waWxlcl90YXJnZXQpIg0KKwlAZWNobyAib3B0aW9uc19ob3N0ID0gJChvcHRpb25zX2hvc3QpIg0KKwlAZWNobyAib3B0aW9uc190YXJnZXQgPSAkKG9wdGlvbnNfdGFyZ2V0KSINCisNCmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL1JFQURNRS50eHQgYi9maW5hbC9vZmZsb2FkL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWI5ZmIxZAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvUkVBRE1FLnR4dApAQCAtMCwwICsxLDEyOSBAQAorDQorCSAgICAgICBSRUFETUUgZm9yIEludGVsKFIpIE9mZmxvYWQgUnVudGltZSBMaWJyYXJ5DQorCSAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorDQorSG93IHRvIEJ1aWxkIERvY3VtZW50YXRpb24NCis9PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKw0KK1RoZSBtYWluIGRvY3VtZW50YXRpb24gaXMgaW4gRG94eWdlbiogZm9ybWF0LCBhbmQgdGhpcyBkaXN0cmlidXRpb24NCitzaG91bGQgY29tZSB3aXRoIHByZS1idWlsdCBQREYgZG9jdW1lbnRhdGlvbiBpbiBkb2MvUmVmZXJlbmNlLnBkZi4NCitIb3dldmVyLCBhbiBIVE1MIHZlcnNpb24gY2FuIGJlIGJ1aWx0IGJ5IGV4ZWN1dGluZzoNCisNCislIGRveHlnZW4gZG9jL2RveHlnZW4vY29uZmlnDQorDQoraW4gdGhpcyBkaXJlY3RvcnkuDQorDQorVGhhdCB3aWxsIHByb2R1Y2UgSFRNTCBkb2N1bWVudGF0aW9uIGluIHRoZSBkb2MvZG94eWdlbi9nZW5lcmF0ZWQNCitkaXJlY3RvcnksIHdoaWNoIGNhbiBiZSBhY2Nlc3NlZCBieSBwb2ludGluZyBhIHdlYiBicm93c2VyIGF0IHRoZQ0KK2luZGV4Lmh0bWwgZmlsZSB0aGVyZS4NCisNCitJZiB5b3UgZG9uJ3QgaGF2ZSBEb3h5Z2VuIGluc3RhbGxlZCwgeW91IGNhbiBkb3dubG9hZCBpdCBmcm9tDQord3d3LmRveHlnZW4ub3JnLg0KKw0KKw0KK1NvZnR3YXJlIFJlcXVpcmVtZW50cw0KKz09PT09PT09PT09PT09PT09PT09PQ0KKw0KK0ludGVsKFIpIE9mZmxvYWQgUnVudGltZSBMaWJyYXJ5IHJlcXVpcmVzIGFkZGl0aW9uYWwgc29mdHdhcmU6DQorDQorMSkgSW50ZWwoUikgT3Blbk1QKiBSdW50aW1lIExpYnJhcnkuICBZb3UgY2FuIGVpdGhlciBkb3dubG9hZCB0aGUgc291cmNlDQorY29kZSBmb3IgdGhhdCAoZnJvbSBvcGVubXBydGwub3JnIG9yIG9wZW5tcC5sbHZtLm9yZykgb3Igc2ltcGx5IHVzZSB0aGUNCitjb21waWxlZCB2ZXJzaW9uIGRpc3RyaWJ1dGVkIHdpdGggdGhlIEludGVsIGNvbXBpbGVycy4NCisyKSBJbnRlbChSKSBDT0kgUnVudGltZSBMaWJyYXJ5IGFuZCBJbnRlbChSKSBNWU8gUnVudGltZSBMaWJyYXJ5LiAgVGhlc2UNCitsaWJyYXJpZXMgYXJlIHBhcnQgb2YgSW50ZWwoUikgTWFueWNvcmUgUGxhdGZvcm0gU29mdHdhcmUgU3RhY2sgKE1QU1MpLiAgWW91DQorY2FuIGRvd25sb2FkIE1QU1Mgc291cmNlIGNvZGUgb3IgYmluYXJpZXMgZnJvbQ0KK3NvZnR3YXJlLmludGVsLmNvbS9lbi11cy9hcnRpY2xlcy9pbnRlbC1tYW55Y29yZS1wbGF0Zm9ybS1zb2Z0d2FyZS1zdGFjay1tcHNzLg0KK0JpbmFyaWVzIGluY2x1ZGUgaG9zdCBsaWJyYXJpZXMgZm9yIEludGVsKFIpIDY0IEFyY2hpdGVjdHVyZSBhbmQgdGFyZ2V0DQorbGlicmFyaWVzIGZvciBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUuDQorDQorQWxzbyB5b3Ugd2lsbCByZXF1aXJlIGFsbCBvZiB0aGUgbGlicmFyaWVzIHRoYXQgZW5hYmxlIHRoZSB0YXJnZXQgY29kZSB0byBydW4NCitvbiBkZXZpY2UuICBJZiB5b3UgdGFyZ2V0IHRoZSBJbnRlbChSKSBYZW9uIFBoaSAoVE0pIGNvcHJvY2Vzc29yLCB0aGVzZQ0KK2xpYnJhcmllcyBjYW4gYmUgdGFrZW4gZnJvbSBNUFNTIHRvby4NCisNCisNCitIb3cgdG8gQnVpbGQgdGhlIEludGVsKFIpIE9mZmxvYWQgUnVudGltZSBMaWJyYXJ5DQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKw0KK1RoZSBNYWtlZmlsZSBhdCB0aGUgdG9wLWxldmVsIHdpbGwgYXR0ZW1wdCB0byBkZXRlY3Qgd2hhdCBpdCBuZWVkcyB0bw0KK2J1aWxkIHRoZSBJbnRlbChSKSBPZmZsb2FkIFJ1bnRpbWUgTGlicmFyeS4gIFRvIHNlZSB0aGUgZGVmYXVsdCBzZXR0aW5ncywNCit0eXBlOg0KKw0KK21ha2UgaW5mbw0KKw0KK1lvdSBjYW4gY2hhbmdlIHRoZSBNYWtlZmlsZSdzIGJlaGF2aW9yIHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb25zOg0KKw0KK3Jvb3RfZGlyOgkgICAgICBUaGUgcGF0aCB0byB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZQ0KKwkJICAgICAgdG9wLWxldmVsIE1ha2VmaWxlLiAgQnkgZGVmYXVsdCwgdGhpcyB3aWxsIHRha2Ugb24gdGhlDQorCQkgICAgICB2YWx1ZSBvZiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4NCisNCitidWlsZF9kaXI6CSAgICAgIFRoZSBwYXRoIHRvIHRoZSBidWlsZCBkaXJlY3RvcnkuICBCeSBkZWZhdWx0LCB0aGlzIHdpbGwNCisJCSAgICAgIHRha2Ugb24gdmFsdWUgW3Jvb3RfZGlyXS9idWlsZC4NCisNCittcHNzX2RpcjoJICAgICAgVGhlIHBhdGggdG8gdGhlIEludGVsKFIpIE1hbnljb3JlIFBsYXRmb3JtIFNvZnR3YXJlDQorCQkgICAgICBTdGFjayBpbnN0YWxsIGRpcmVjdG9yeS4gIEJ5IGRlZmF1bHQsIHRoaXMgd2lsbCB0YWtlIG9uDQorCQkgICAgICB0aGUgdmFsdWUgb2Ygb3BlcmF0aW5nIHN5c3RlbSdzIHJvb3QgZGlyZWN0b3J5Lg0KKw0KK2xpYmlvbXBfaG9zdF9kaXI6ICAgICBUaGUgcGF0aCB0byB0aGUgaG9zdCBJbnRlbChSKSBPcGVuTVAqIFJ1bnRpbWUgTGlicmFyeS4NCisJCSAgICAgIFRoaXMgb3B0aW9uIGlzIHJlcXVpcmVkIHdoZW4gdGhlIGhvc3QgY29tcGlsZXIgaXMgb3RoZXINCisJCSAgICAgIHRoYW4gaWNjLg0KKw0KK2xpYmlvbXBfdGFyZ2V0X2RpcjogICBUaGUgcGF0aCB0byB0aGUgdGFyZ2V0IEludGVsKFIpIE9wZW5NUCogUnVudGltZQ0KKwkJICAgICAgTGlicmFyeS4gIFRoaXMgb3B0aW9uIGlzIHJlcXVpcmVkIHdoZW4gdGhlIHRhcmdldA0KKwkJICAgICAgY29tcGlsZXIgaXMgb3RoZXIgdGhhbiBpY2MuDQorDQorb21wX2hlYWRlcl9kaXI6ICAgICAgIFRoZSBwYXRoIHRvIHRoZSBoZWFkZXIgZmlsZSA8b21wLmg+IG9mIEludGVsKFIpIE9wZW5NUCoNCisJCSAgICAgIFJ1bnRpbWUgTGlicmFyeS4gIFRoaXMgb3B0aW9uIGlzIHJlcXVpcmVkIGlmIGVpdGhlciBob3N0DQorCQkgICAgICBvciB0YXJnZXQgY29tcGlsZXIgaXMgb3RoZXIgdGhhbiBpY2MuDQorDQorb3NfaG9zdDoJICAgICAgT3BlcmF0aW5nIHN5c3RlbSBvbiBob3N0LiAgQ3VycmVudGx5IHN1cHBvcnRzIG9ubHkNCisJCSAgICAgICJsaW51eCIgd2hpY2ggaXMgc2V0IGJ5IGRlZmF1bHQuDQorDQorb3NfdGFyZ2V0OgkgICAgICBPcGVyYXRpbmcgc3lzdGVtIG9uIHRhcmdldCBkZXZpY2UuICBDdXJyZW50bHkgc3VwcG9ydHMNCisJCSAgICAgIG9ubHkgImxpbnV4IiB3aGljaCBpcyBzZXQgYnkgZGVmYXVsdC4NCisNCitjb21waWxlcl9ob3N0OgkgICAgICBXaGljaCBjb21waWxlciB0byB1c2UgZm9yIHRoZSBidWlsZCBvZiB0aGUgaG9zdCBwYXJ0Lg0KKwkJICAgICAgRGVmYXVsdHMgdG8gImdjYyIqLiAgQWxzbyBzdXBwb3J0cyAiaWNjIiBhbmQgImNsYW5nIiouDQorCQkgICAgICBZb3Ugc2hvdWxkIHByb3ZpZGUgdGhlIGZ1bGwgcGF0aCB0byB0aGUgY29tcGlsZXIgb3IgaXQNCisJCSAgICAgIHNob3VsZCBiZSBpbiB0aGUgdXNlcidzIHBhdGguDQorDQorY29tcGlsZXJfaG9zdDoJICAgICAgV2hpY2ggY29tcGlsZXIgdG8gdXNlIGZvciB0aGUgYnVpbGQgb2YgdGhlIHRhcmdldCBwYXJ0Lg0KKwkJICAgICAgRGVmYXVsdHMgdG8gImdjYyIqLiAgQWxzbyBzdXBwb3J0cyAiaWNjIiBhbmQgImNsYW5nIiouDQorCQkgICAgICBZb3Ugc2hvdWxkIHByb3ZpZGUgdGhlIGZ1bGwgcGF0aCB0byB0aGUgY29tcGlsZXIgb3IgaXQNCisJCSAgICAgIHNob3VsZCBiZSBpbiB0aGUgdXNlcidzIHBhdGguDQorDQorb3B0aW9uc19ob3N0OgkgICAgICBBZGRpdGlvbmFsIG9wdGlvbnMgZm9yIHRoZSBob3N0IGNvbXBpbGVyLg0KKw0KK29wdGlvbnNfdGFyZ2V0OiAgICAgICBBZGRpdGlvbmFsIG9wdGlvbnMgZm9yIHRoZSB0YXJnZXQgY29tcGlsZXIuDQorDQorVG8gdXNlIGFueSBvZiB0aGUgb3B0aW9ucyBhYm92ZSwgc2ltcGxlIGFkZCA8b3B0aW9uX25hbWU+PTx2YWx1ZT4uICBGb3INCitleGFtcGxlLCBpZiB5b3Ugd2FudCB0byBidWlsZCB3aXRoIGljYyBpbnN0ZWFkIG9mIGdjYywgdHlwZToNCisNCittYWtlIGNvbXBpbGVyX2hvc3Q9aWNjIGNvbXBpbGVyX3RhcmdldD1pY2MNCisNCisNCitTdXBwb3J0ZWQgUlRMIEJ1aWxkIENvbmZpZ3VyYXRpb25zDQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKw0KK1N1cHBvcnRlZCBBcmNoaXRlY3R1cmVzOiBJbnRlbChSKSA2NCwgYW5kIEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZA0KK0NvcmUgQXJjaGl0ZWN0dXJlDQorDQorCSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKwkgICAgICB8ICAgaWNjL2ljbCAgICAgfCAgICBnY2MgICAgICB8ICAgIGNsYW5nICAgIHwNCistLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KK3wgTGludXgqIE9TICAgfCAgICAgIFllcyAgICAgIHwgICAgIFllcygxKSAgfCAgICAgWWVzKDEpICB8DQorfCBPUyBYKiAgICAgICB8ICAgICAgIE5vICAgICAgfCAgICAgIE5vICAgICB8ICAgICAgTm8gICAgIHwNCit8IFdpbmRvd3MqIE9TIHwgICAgICAgTm8gICAgICB8ICAgICAgTm8gICAgIHwgICAgICBObyAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorKDEpIExpYm9mZmxvYWQgcmVxdWlyZXMgX3JkdHNjIGludHJpbnNpYywgd2hpY2ggbWF5IGJlIHVuc3VwcG9ydGVkIGJ5IHNvbWUNCisgICAgdmVyc2lvbnMgb2YgY29tcGlsZXIuICBJbiB0aGlzIGNhc2UgeW91IG5lZWQgdG8gaW5jbHVkZSBzcmMvcmR0c2MuaA0KKyAgICBtYW51YWxseSBieSB1c2luZyBNYWtlZmlsZSBvcHRpb25zIG9wdGlvbnNfaG9zdCBhbmQgb3B0aW9uc190YXJnZXQ6DQorDQorICAgIG1ha2Ugb3B0aW9uc19ob3N0PSItaW5jbHVkZSBzcmMvcmR0c2MuaCIgb3B0aW9uc190YXJnZXQ9Ii1pbmNsdWRlIHNyYy9yZHRzYy5oIg0KKw0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorTm90aWNlcw0KKz09PT09PT0NCisNCisqT3RoZXIgbmFtZXMgYW5kIGJyYW5kcyBtYXkgYmUgY2xhaW1lZCBhcyB0aGUgcHJvcGVydHkgb2Ygb3RoZXJzLg0KZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvZG9jL1JlZmVyZW5jZS5wZGYgYi9maW5hbC9vZmZsb2FkL2RvYy9SZWZlcmVuY2UucGRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MTc2ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL2RvYy9SZWZlcmVuY2UucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvZG9jL2RveHlnZW4vY29uZmlnIGIvZmluYWwvb2ZmbG9hZC9kb2MvZG94eWdlbi9jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDQ1YjY5NgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvZG9jL2RveHlnZW4vY29uZmlnCkBAIC0wLDAgKzEsMjMyOCBAQAorIyBEb3h5ZmlsZSAxLjguNgorCisjIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIHNldHRpbmdzIHRvIGJlIHVzZWQgYnkgdGhlIGRvY3VtZW50YXRpb24gc3lzdGVtCisjIGRveHlnZW4gKHd3dy5kb3h5Z2VuLm9yZykgZm9yIGEgcHJvamVjdC4KKyMKKyMgQWxsIHRleHQgYWZ0ZXIgYSBkb3VibGUgaGFzaCAoIyMpIGlzIGNvbnNpZGVyZWQgYSBjb21tZW50IGFuZCBpcyBwbGFjZWQgaW4KKyMgZnJvbnQgb2YgdGhlIFRBRyBpdCBpcyBwcmVjZWRpbmcuCisjCisjIEFsbCB0ZXh0IGFmdGVyIGEgc2luZ2xlIGhhc2ggKCMpIGlzIGNvbnNpZGVyZWQgYSBjb21tZW50IGFuZCB3aWxsIGJlIGlnbm9yZWQuCisjIFRoZSBmb3JtYXQgaXM6CisjIFRBRyA9IHZhbHVlIFt2YWx1ZSwgLi4uXQorIyBGb3IgbGlzdHMsIGl0ZW1zIGNhbiBhbHNvIGJlIGFwcGVuZGVkIHVzaW5nOgorIyBUQUcgKz0gdmFsdWUgW3ZhbHVlLCAuLi5dCisjIFZhbHVlcyB0aGF0IGNvbnRhaW4gc3BhY2VzIHNob3VsZCBiZSBwbGFjZWQgYmV0d2VlbiBxdW90ZXMgKFwiIFwiKS4KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBQcm9qZWN0IHJlbGF0ZWQgY29uZmlndXJhdGlvbiBvcHRpb25zCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVGhpcyB0YWcgc3BlY2lmaWVzIHRoZSBlbmNvZGluZyB1c2VkIGZvciBhbGwgY2hhcmFjdGVycyBpbiB0aGUgY29uZmlnIGZpbGUKKyMgdGhhdCBmb2xsb3cuIFRoZSBkZWZhdWx0IGlzIFVURi04IHdoaWNoIGlzIGFsc28gdGhlIGVuY29kaW5nIHVzZWQgZm9yIGFsbCB0ZXh0CisjIGJlZm9yZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGlzIHRhZy4gRG94eWdlbiB1c2VzIGxpYmljb252IChvciB0aGUgaWNvbnYKKyMgYnVpbHQgaW50byBsaWJjKSBmb3IgdGhlIHRyYW5zY29kaW5nLiBTZWUgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2xpYmljb252CisjIGZvciB0aGUgbGlzdCBvZiBwb3NzaWJsZSBlbmNvZGluZ3MuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBVVEYtOC4KKworRE9YWUZJTEVfRU5DT0RJTkcgICAgICA9IFVURi04CisKKyMgVGhlIFBST0pFQ1RfTkFNRSB0YWcgaXMgYSBzaW5nbGUgd29yZCAob3IgYSBzZXF1ZW5jZSBvZiB3b3JkcyBzdXJyb3VuZGVkIGJ5CisjIGRvdWJsZS1xdW90ZXMsIHVubGVzcyB5b3UgYXJlIHVzaW5nIERveHl3aXphcmQpIHRoYXQgc2hvdWxkIGlkZW50aWZ5IHRoZQorIyBwcm9qZWN0IGZvciB3aGljaCB0aGUgZG9jdW1lbnRhdGlvbiBpcyBnZW5lcmF0ZWQuIFRoaXMgbmFtZSBpcyB1c2VkIGluIHRoZQorIyB0aXRsZSBvZiBtb3N0IGdlbmVyYXRlZCBwYWdlcyBhbmQgaW4gYSBmZXcgb3RoZXIgcGxhY2VzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTXkgUHJvamVjdC4KKworUFJPSkVDVF9OQU1FICAgICAgICAgICA9ICJJbnRlbCZyZWc7Jm5ic3A7T2ZmbG9hZCBSdW50aW1lIExpYnJhcnkiCisKKyMgVGhlIFBST0pFQ1RfTlVNQkVSIHRhZyBjYW4gYmUgdXNlZCB0byBlbnRlciBhIHByb2plY3Qgb3IgcmV2aXNpb24gbnVtYmVyLiBUaGlzCisjIGNvdWxkIGJlIGhhbmR5IGZvciBhcmNoaXZpbmcgdGhlIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uIG9yIGlmIHNvbWUgdmVyc2lvbgorIyBjb250cm9sIHN5c3RlbSBpcyB1c2VkLgorCitQUk9KRUNUX05VTUJFUiAgICAgICAgID0gCisKKyMgVXNpbmcgdGhlIFBST0pFQ1RfQlJJRUYgdGFnIG9uZSBjYW4gcHJvdmlkZSBhbiBvcHRpb25hbCBvbmUgbGluZSBkZXNjcmlwdGlvbgorIyBmb3IgYSBwcm9qZWN0IHRoYXQgYXBwZWFycyBhdCB0aGUgdG9wIG9mIGVhY2ggcGFnZSBhbmQgc2hvdWxkIGdpdmUgdmlld2VyIGEKKyMgcXVpY2sgaWRlYSBhYm91dCB0aGUgcHVycG9zZSBvZiB0aGUgcHJvamVjdC4gS2VlcCB0aGUgZGVzY3JpcHRpb24gc2hvcnQuCisKK1BST0pFQ1RfQlJJRUYgICAgICAgICAgPSAKKworIyBXaXRoIHRoZSBQUk9KRUNUX0xPR08gdGFnIG9uZSBjYW4gc3BlY2lmeSBhbiBsb2dvIG9yIGljb24gdGhhdCBpcyBpbmNsdWRlZCBpbgorIyB0aGUgZG9jdW1lbnRhdGlvbi4gVGhlIG1heGltdW0gaGVpZ2h0IG9mIHRoZSBsb2dvIHNob3VsZCBub3QgZXhjZWVkIDU1IHBpeGVscworIyBhbmQgdGhlIG1heGltdW0gd2lkdGggc2hvdWxkIG5vdCBleGNlZWQgMjAwIHBpeGVscy4gRG94eWdlbiB3aWxsIGNvcHkgdGhlIGxvZ28KKyMgdG8gdGhlIG91dHB1dCBkaXJlY3RvcnkuCisKK1BST0pFQ1RfTE9HTyAgICAgICAgICAgPSAKKworIyBUaGUgT1VUUFVUX0RJUkVDVE9SWSB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSAocmVsYXRpdmUgb3IgYWJzb2x1dGUpIHBhdGgKKyMgaW50byB3aGljaCB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24gd2lsbCBiZSB3cml0dGVuLiBJZiBhIHJlbGF0aXZlIHBhdGggaXMKKyMgZW50ZXJlZCwgaXQgd2lsbCBiZSByZWxhdGl2ZSB0byB0aGUgbG9jYXRpb24gd2hlcmUgZG94eWdlbiB3YXMgc3RhcnRlZC4gSWYKKyMgbGVmdCBibGFuayB0aGUgY3VycmVudCBkaXJlY3Rvcnkgd2lsbCBiZSB1c2VkLgorCitPVVRQVVRfRElSRUNUT1JZICAgICAgID0gZG9jL2RveHlnZW4vZ2VuZXJhdGVkCisKKyMgSWYgdGhlIENSRUFURV9TVUJESVJTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGVuIGRveHlnZW4gd2lsbCBjcmVhdGUgNDA5NiBzdWItCisjIGRpcmVjdG9yaWVzIChpbiAyIGxldmVscykgdW5kZXIgdGhlIG91dHB1dCBkaXJlY3Rvcnkgb2YgZWFjaCBvdXRwdXQgZm9ybWF0IGFuZAorIyB3aWxsIGRpc3RyaWJ1dGUgdGhlIGdlbmVyYXRlZCBmaWxlcyBvdmVyIHRoZXNlIGRpcmVjdG9yaWVzLiBFbmFibGluZyB0aGlzCisjIG9wdGlvbiBjYW4gYmUgdXNlZnVsIHdoZW4gZmVlZGluZyBkb3h5Z2VuIGEgaHVnZSBhbW91bnQgb2Ygc291cmNlIGZpbGVzLCB3aGVyZQorIyBwdXR0aW5nIGFsbCBnZW5lcmF0ZWQgZmlsZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IHdvdWxkIG90aGVyd2lzZSBjYXVzZXMKKyMgcGVyZm9ybWFuY2UgcHJvYmxlbXMgZm9yIHRoZSBmaWxlIHN5c3RlbS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitDUkVBVEVfU1VCRElSUyAgICAgICAgID0gTk8KKworIyBUaGUgT1VUUFVUX0xBTkdVQUdFIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGxhbmd1YWdlIGluIHdoaWNoIGFsbAorIyBkb2N1bWVudGF0aW9uIGdlbmVyYXRlZCBieSBkb3h5Z2VuIGlzIHdyaXR0ZW4uIERveHlnZW4gd2lsbCB1c2UgdGhpcworIyBpbmZvcm1hdGlvbiB0byBnZW5lcmF0ZSBhbGwgY29uc3RhbnQgb3V0cHV0IGluIHRoZSBwcm9wZXIgbGFuZ3VhZ2UuCisjIFBvc3NpYmxlIHZhbHVlcyBhcmU6IEFmcmlrYWFucywgQXJhYmljLCBBcm1lbmlhbiwgQnJhemlsaWFuLCBDYXRhbGFuLCBDaGluZXNlLAorIyBDaGluZXNlLVRyYWRpdGlvbmFsLCBDcm9hdGlhbiwgQ3plY2gsIERhbmlzaCwgRHV0Y2gsIEVuZ2xpc2ggKFVuaXRlZCBTdGF0ZXMpLAorIyBFc3BlcmFudG8sIEZhcnNpIChQZXJzaWFuKSwgRmlubmlzaCwgRnJlbmNoLCBHZXJtYW4sIEdyZWVrLCBIdW5nYXJpYW4sCisjIEluZG9uZXNpYW4sIEl0YWxpYW4sIEphcGFuZXNlLCBKYXBhbmVzZS1lbiAoSmFwYW5lc2Ugd2l0aCBFbmdsaXNoIG1lc3NhZ2VzKSwKKyMgS29yZWFuLCBLb3JlYW4tZW4gKEtvcmVhbiB3aXRoIEVuZ2xpc2ggbWVzc2FnZXMpLCBMYXR2aWFuLCBMaXRodWFuaWFuLAorIyBNYWNlZG9uaWFuLCBOb3J3ZWdpYW4sIFBlcnNpYW4gKEZhcnNpKSwgUG9saXNoLCBQb3J0dWd1ZXNlLCBSb21hbmlhbiwgUnVzc2lhbiwKKyMgU2VyYmlhbiwgU2VyYmlhbi1DeXJpbGxpYywgU2xvdmFrLCBTbG92ZW5lLCBTcGFuaXNoLCBTd2VkaXNoLCBUdXJraXNoLAorIyBVa3JhaW5pYW4gYW5kIFZpZXRuYW1lc2UuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBFbmdsaXNoLgorCitPVVRQVVRfTEFOR1VBR0UgICAgICAgID0gRW5nbGlzaAorCisjIElmIHRoZSBCUklFRl9NRU1CRVJfREVTQyB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgaW5jbHVkZSBicmllZiBtZW1iZXIKKyMgZGVzY3JpcHRpb25zIGFmdGVyIHRoZSBtZW1iZXJzIHRoYXQgYXJlIGxpc3RlZCBpbiB0aGUgZmlsZSBhbmQgY2xhc3MKKyMgZG9jdW1lbnRhdGlvbiAoc2ltaWxhciB0byBKYXZhZG9jKS4gU2V0IHRvIE5PIHRvIGRpc2FibGUgdGhpcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworQlJJRUZfTUVNQkVSX0RFU0MgICAgICA9IFlFUworCisjIElmIHRoZSBSRVBFQVRfQlJJRUYgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIHByZXBlbmQgdGhlIGJyaWVmCisjIGRlc2NyaXB0aW9uIG9mIGEgbWVtYmVyIG9yIGZ1bmN0aW9uIGJlZm9yZSB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24KKyMKKyMgTm90ZTogSWYgYm90aCBISURFX1VORE9DX01FTUJFUlMgYW5kIEJSSUVGX01FTUJFUl9ERVNDIGFyZSBzZXQgdG8gTk8sIHRoZQorIyBicmllZiBkZXNjcmlwdGlvbnMgd2lsbCBiZSBjb21wbGV0ZWx5IHN1cHByZXNzZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1JFUEVBVF9CUklFRiAgICAgICAgICAgPSBZRVMKKworIyBUaGlzIHRhZyBpbXBsZW1lbnRzIGEgcXVhc2ktaW50ZWxsaWdlbnQgYnJpZWYgZGVzY3JpcHRpb24gYWJicmV2aWF0b3IgdGhhdCBpcworIyB1c2VkIHRvIGZvcm0gdGhlIHRleHQgaW4gdmFyaW91cyBsaXN0aW5ncy4gRWFjaCBzdHJpbmcgaW4gdGhpcyBsaXN0LCBpZiBmb3VuZAorIyBhcyB0aGUgbGVhZGluZyB0ZXh0IG9mIHRoZSBicmllZiBkZXNjcmlwdGlvbiwgd2lsbCBiZSBzdHJpcHBlZCBmcm9tIHRoZSB0ZXh0CisjIGFuZCB0aGUgcmVzdWx0LCBhZnRlciBwcm9jZXNzaW5nIHRoZSB3aG9sZSBsaXN0LCBpcyB1c2VkIGFzIHRoZSBhbm5vdGF0ZWQKKyMgdGV4dC4gT3RoZXJ3aXNlLCB0aGUgYnJpZWYgZGVzY3JpcHRpb24gaXMgdXNlZCBhcy1pcy4gSWYgbGVmdCBibGFuaywgdGhlCisjIGZvbGxvd2luZyB2YWx1ZXMgYXJlIHVzZWQgKCRuYW1lIGlzIGF1dG9tYXRpY2FsbHkgcmVwbGFjZWQgd2l0aCB0aGUgbmFtZSBvZgorIyB0aGUgZW50aXR5KTpUaGUgJG5hbWUgY2xhc3MsIFRoZSAkbmFtZSB3aWRnZXQsIFRoZSAkbmFtZSBmaWxlLCBpcywgcHJvdmlkZXMsCisjIHNwZWNpZmllcywgY29udGFpbnMsIHJlcHJlc2VudHMsIGEsIGFuIGFuZCB0aGUuCisKK0FCQlJFVklBVEVfQlJJRUYgICAgICAgPSAiVGhlICRuYW1lIGNsYXNzIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSAkbmFtZSB3aWRnZXQiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlICRuYW1lIGZpbGUiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHJlc2VudHMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGEgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGFuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aGUKKworIyBJZiB0aGUgQUxXQVlTX0RFVEFJTEVEX1NFQyBhbmQgUkVQRUFUX0JSSUVGIHRhZ3MgYXJlIGJvdGggc2V0IHRvIFlFUyB0aGVuCisjIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGRldGFpbGVkIHNlY3Rpb24gZXZlbiBpZiB0aGVyZSBpcyBvbmx5IGEgYnJpZWYKKyMgZGVzY3JpcHRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworQUxXQVlTX0RFVEFJTEVEX1NFQyAgICA9IE5PCisKKyMgSWYgdGhlIElOTElORV9JTkhFUklURURfTUVNQiB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIHNob3cgYWxsCisjIGluaGVyaXRlZCBtZW1iZXJzIG9mIGEgY2xhc3MgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgdGhhdCBjbGFzcyBhcyBpZiB0aG9zZQorIyBtZW1iZXJzIHdlcmUgb3JkaW5hcnkgY2xhc3MgbWVtYmVycy4gQ29uc3RydWN0b3JzLCBkZXN0cnVjdG9ycyBhbmQgYXNzaWdubWVudAorIyBvcGVyYXRvcnMgb2YgdGhlIGJhc2UgY2xhc3NlcyB3aWxsIG5vdCBiZSBzaG93bi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitJTkxJTkVfSU5IRVJJVEVEX01FTUIgID0gTk8KKworIyBJZiB0aGUgRlVMTF9QQVRIX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBwcmVwZW5kIHRoZSBmdWxsIHBhdGgKKyMgYmVmb3JlIGZpbGVzIG5hbWUgaW4gdGhlIGZpbGUgbGlzdCBhbmQgaW4gdGhlIGhlYWRlciBmaWxlcy4gSWYgc2V0IHRvIE5PIHRoZQorIyBzaG9ydGVzdCBwYXRoIHRoYXQgbWFrZXMgdGhlIGZpbGUgbmFtZSB1bmlxdWUgd2lsbCBiZSB1c2VkCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0ZVTExfUEFUSF9OQU1FUyAgICAgICAgPSBZRVMKKworIyBUaGUgU1RSSVBfRlJPTV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzdHJpcCBhIHVzZXItZGVmaW5lZCBwYXJ0IG9mIHRoZSBwYXRoLgorIyBTdHJpcHBpbmcgaXMgb25seSBkb25lIGlmIG9uZSBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZ3MgbWF0Y2hlcyB0aGUgbGVmdC1oYW5kCisjIHBhcnQgb2YgdGhlIHBhdGguIFRoZSB0YWcgY2FuIGJlIHVzZWQgdG8gc2hvdyByZWxhdGl2ZSBwYXRocyBpbiB0aGUgZmlsZSBsaXN0LgorIyBJZiBsZWZ0IGJsYW5rIHRoZSBkaXJlY3RvcnkgZnJvbSB3aGljaCBkb3h5Z2VuIGlzIHJ1biBpcyB1c2VkIGFzIHRoZSBwYXRoIHRvCisjIHN0cmlwLgorIworIyBOb3RlIHRoYXQgeW91IGNhbiBzcGVjaWZ5IGFic29sdXRlIHBhdGhzIGhlcmUsIGJ1dCBhbHNvIHJlbGF0aXZlIHBhdGhzLCB3aGljaAorIyB3aWxsIGJlIHJlbGF0aXZlIGZyb20gdGhlIGRpcmVjdG9yeSB3aGVyZSBkb3h5Z2VuIGlzIHN0YXJ0ZWQuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBGVUxMX1BBVEhfTkFNRVMgaXMgc2V0IHRvIFlFUy4KKworU1RSSVBfRlJPTV9QQVRIICAgICAgICA9IHNyYy8KKworIyBUaGUgU1RSSVBfRlJPTV9JTkNfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3RyaXAgYSB1c2VyLWRlZmluZWQgcGFydCBvZiB0aGUKKyMgcGF0aCBtZW50aW9uZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgYSBjbGFzcywgd2hpY2ggdGVsbHMgdGhlIHJlYWRlciB3aGljaAorIyBoZWFkZXIgZmlsZSB0byBpbmNsdWRlIGluIG9yZGVyIHRvIHVzZSBhIGNsYXNzLiBJZiBsZWZ0IGJsYW5rIG9ubHkgdGhlIG5hbWUgb2YKKyMgdGhlIGhlYWRlciBmaWxlIGNvbnRhaW5pbmcgdGhlIGNsYXNzIGRlZmluaXRpb24gaXMgdXNlZC4gT3RoZXJ3aXNlIG9uZSBzaG91bGQKKyMgc3BlY2lmeSB0aGUgbGlzdCBvZiBpbmNsdWRlIHBhdGhzIHRoYXQgYXJlIG5vcm1hbGx5IHBhc3NlZCB0byB0aGUgY29tcGlsZXIKKyMgdXNpbmcgdGhlIC1JIGZsYWcuCisKK1NUUklQX0ZST01fSU5DX1BBVEggICAgPSBzcmMvCisKKyMgSWYgdGhlIFNIT1JUX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgbXVjaCBzaG9ydGVyIChidXQKKyMgbGVzcyByZWFkYWJsZSkgZmlsZSBuYW1lcy4gVGhpcyBjYW4gYmUgdXNlZnVsIGlzIHlvdXIgZmlsZSBzeXN0ZW1zIGRvZXNuJ3QKKyMgc3VwcG9ydCBsb25nIG5hbWVzIGxpa2Ugb24gRE9TLCBNYWMsIG9yIENELVJPTS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitTSE9SVF9OQU1FUyAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgSkFWQURPQ19BVVRPQlJJRUYgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgaW50ZXJwcmV0IHRoZQorIyBmaXJzdCBsaW5lICh1bnRpbCB0aGUgZmlyc3QgZG90KSBvZiBhIEphdmFkb2Mtc3R5bGUgY29tbWVudCBhcyB0aGUgYnJpZWYKKyMgZGVzY3JpcHRpb24uIElmIHNldCB0byBOTywgdGhlIEphdmFkb2Mtc3R5bGUgd2lsbCBiZWhhdmUganVzdCBsaWtlIHJlZ3VsYXIgUXQtCisjIHN0eWxlIGNvbW1lbnRzICh0aHVzIHJlcXVpcmluZyBhbiBleHBsaWNpdCBAYnJpZWYgY29tbWFuZCBmb3IgYSBicmllZgorIyBkZXNjcmlwdGlvbi4pCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSkFWQURPQ19BVVRPQlJJRUYgICAgICA9IE5PCisKKyMgSWYgdGhlIFFUX0FVVE9CUklFRiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBpbnRlcnByZXQgdGhlIGZpcnN0CisjIGxpbmUgKHVudGlsIHRoZSBmaXJzdCBkb3QpIG9mIGEgUXQtc3R5bGUgY29tbWVudCBhcyB0aGUgYnJpZWYgZGVzY3JpcHRpb24uIElmCisjIHNldCB0byBOTywgdGhlIFF0LXN0eWxlIHdpbGwgYmVoYXZlIGp1c3QgbGlrZSByZWd1bGFyIFF0LXN0eWxlIGNvbW1lbnRzICh0aHVzCisjIHJlcXVpcmluZyBhbiBleHBsaWNpdCBcYnJpZWYgY29tbWFuZCBmb3IgYSBicmllZiBkZXNjcmlwdGlvbi4pCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworUVRfQVVUT0JSSUVGICAgICAgICAgICA9IE5PCisKKyMgVGhlIE1VTFRJTElORV9DUFBfSVNfQlJJRUYgdGFnIGNhbiBiZSBzZXQgdG8gWUVTIHRvIG1ha2UgZG94eWdlbiB0cmVhdCBhCisjIG11bHRpLWxpbmUgQysrIHNwZWNpYWwgY29tbWVudCBibG9jayAoaS5lLiBhIGJsb2NrIG9mIC8vISBvciAvLy8gY29tbWVudHMpIGFzCisjIGEgYnJpZWYgZGVzY3JpcHRpb24uIFRoaXMgdXNlZCB0byBiZSB0aGUgZGVmYXVsdCBiZWhhdmlvci4gVGhlIG5ldyBkZWZhdWx0IGlzCisjIHRvIHRyZWF0IGEgbXVsdGktbGluZSBDKysgY29tbWVudCBibG9jayBhcyBhIGRldGFpbGVkIGRlc2NyaXB0aW9uLiBTZXQgdGhpcworIyB0YWcgdG8gWUVTIGlmIHlvdSBwcmVmZXIgdGhlIG9sZCBiZWhhdmlvciBpbnN0ZWFkLgorIworIyBOb3RlIHRoYXQgc2V0dGluZyB0aGlzIHRhZyB0byBZRVMgYWxzbyBtZWFucyB0aGF0IHJhdGlvbmFsIHJvc2UgY29tbWVudHMgYXJlCisjIG5vdCByZWNvZ25pemVkIGFueSBtb3JlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK01VTFRJTElORV9DUFBfSVNfQlJJRUYgPSBOTworCisjIElmIHRoZSBJTkhFUklUX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBhbiB1bmRvY3VtZW50ZWQgbWVtYmVyIGluaGVyaXRzIHRoZQorIyBkb2N1bWVudGF0aW9uIGZyb20gYW55IGRvY3VtZW50ZWQgbWVtYmVyIHRoYXQgaXQgcmUtaW1wbGVtZW50cy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworSU5IRVJJVF9ET0NTICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBTRVBBUkFURV9NRU1CRVJfUEFHRVMgdGFnIGlzIHNldCB0byBZRVMsIHRoZW4gZG94eWdlbiB3aWxsIHByb2R1Y2UgYQorIyBuZXcgcGFnZSBmb3IgZWFjaCBtZW1iZXIuIElmIHNldCB0byBOTywgdGhlIGRvY3VtZW50YXRpb24gb2YgYSBtZW1iZXIgd2lsbCBiZQorIyBwYXJ0IG9mIHRoZSBmaWxlL2NsYXNzL25hbWVzcGFjZSB0aGF0IGNvbnRhaW5zIGl0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NFUEFSQVRFX01FTUJFUl9QQUdFUyAgPSBOTworCisjIFRoZSBUQUJfU0laRSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBudW1iZXIgb2Ygc3BhY2VzIGluIGEgdGFiLiBEb3h5Z2VuCisjIHVzZXMgdGhpcyB2YWx1ZSB0byByZXBsYWNlIHRhYnMgYnkgc3BhY2VzIGluIGNvZGUgZnJhZ21lbnRzLgorIyBNaW5pbXVtIHZhbHVlOiAxLCBtYXhpbXVtIHZhbHVlOiAxNiwgZGVmYXVsdCB2YWx1ZTogNC4KKworVEFCX1NJWkUgICAgICAgICAgICAgICA9IDgKKworIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbnVtYmVyIG9mIGFsaWFzZXMgdGhhdCBhY3QgYXMgY29tbWFuZHMgaW4KKyMgdGhlIGRvY3VtZW50YXRpb24uIEFuIGFsaWFzIGhhcyB0aGUgZm9ybToKKyMgbmFtZT12YWx1ZQorIyBGb3IgZXhhbXBsZSBhZGRpbmcKKyMgInNpZGVlZmZlY3Q9QHBhciBTaWRlIEVmZmVjdHM6XG4iCisjIHdpbGwgYWxsb3cgeW91IHRvIHB1dCB0aGUgY29tbWFuZCBcc2lkZWVmZmVjdCAob3IgQHNpZGVlZmZlY3QpIGluIHRoZQorIyBkb2N1bWVudGF0aW9uLCB3aGljaCB3aWxsIHJlc3VsdCBpbiBhIHVzZXItZGVmaW5lZCBwYXJhZ3JhcGggd2l0aCBoZWFkaW5nCisjICJTaWRlIEVmZmVjdHM6Ii4gWW91IGNhbiBwdXQgXG4ncyBpbiB0aGUgdmFsdWUgcGFydCBvZiBhbiBhbGlhcyB0byBpbnNlcnQKKyMgbmV3bGluZXMuCisKK0FMSUFTRVMgICAgICAgICAgICAgICAgPSAKKworIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbnVtYmVyIG9mIHdvcmQta2V5d29yZCBtYXBwaW5ncyAoVENMIG9ubHkpLgorIyBBIG1hcHBpbmcgaGFzIHRoZSBmb3JtICJuYW1lPXZhbHVlIi4gRm9yIGV4YW1wbGUgYWRkaW5nICJjbGFzcz1pdGNsOjpjbGFzcyIKKyMgd2lsbCBhbGxvdyB5b3UgdG8gdXNlIHRoZSBjb21tYW5kIGNsYXNzIGluIHRoZSBpdGNsOjpjbGFzcyBtZWFuaW5nLgorCitUQ0xfU1VCU1QgICAgICAgICAgICAgID0gCisKKyMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfRk9SX0MgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgQyBzb3VyY2VzCisjIG9ubHkuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIG1vcmUgdGFpbG9yZWQgZm9yIEMuIEZvcgorIyBpbnN0YW5jZSwgc29tZSBvZiB0aGUgbmFtZXMgdGhhdCBhcmUgdXNlZCB3aWxsIGJlIGRpZmZlcmVudC4gVGhlIGxpc3Qgb2YgYWxsCisjIG1lbWJlcnMgd2lsbCBiZSBvbWl0dGVkLCBldGMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworT1BUSU1JWkVfT1VUUFVUX0ZPUl9DICA9IE5PCisKKyMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfSkFWQSB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBKYXZhIG9yCisjIFB5dGhvbiBzb3VyY2VzIG9ubHkuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIG1vcmUgdGFpbG9yZWQKKyMgZm9yIHRoYXQgbGFuZ3VhZ2UuIEZvciBpbnN0YW5jZSwgbmFtZXNwYWNlcyB3aWxsIGJlIHByZXNlbnRlZCBhcyBwYWNrYWdlcywKKyMgcXVhbGlmaWVkIHNjb3BlcyB3aWxsIGxvb2sgZGlmZmVyZW50LCBldGMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworT1BUSU1JWkVfT1VUUFVUX0pBVkEgICA9IE5PCisKKyMgU2V0IHRoZSBPUFRJTUlaRV9GT1JfRk9SVFJBTiB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBGb3J0cmFuCisjIHNvdXJjZXMuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIHRhaWxvcmVkIGZvciBGb3J0cmFuLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK09QVElNSVpFX0ZPUl9GT1JUUkFOICAgPSBOTworCisjIFNldCB0aGUgT1BUSU1JWkVfT1VUUFVUX1ZIREwgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgVkhETAorIyBzb3VyY2VzLiBEb3h5Z2VuIHdpbGwgdGhlbiBnZW5lcmF0ZSBvdXRwdXQgdGhhdCBpcyB0YWlsb3JlZCBmb3IgVkhETC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitPUFRJTUlaRV9PVVRQVVRfVkhETCAgID0gTk8KKworIyBEb3h5Z2VuIHNlbGVjdHMgdGhlIHBhcnNlciB0byB1c2UgZGVwZW5kaW5nIG9uIHRoZSBleHRlbnNpb24gb2YgdGhlIGZpbGVzIGl0CisjIHBhcnNlcy4gV2l0aCB0aGlzIHRhZyB5b3UgY2FuIGFzc2lnbiB3aGljaCBwYXJzZXIgdG8gdXNlIGZvciBhIGdpdmVuCisjIGV4dGVuc2lvbi4gRG94eWdlbiBoYXMgYSBidWlsdC1pbiBtYXBwaW5nLCBidXQgeW91IGNhbiBvdmVycmlkZSBvciBleHRlbmQgaXQKKyMgdXNpbmcgdGhpcyB0YWcuIFRoZSBmb3JtYXQgaXMgZXh0PWxhbmd1YWdlLCB3aGVyZSBleHQgaXMgYSBmaWxlIGV4dGVuc2lvbiwgYW5kCisjIGxhbmd1YWdlIGlzIG9uZSBvZiB0aGUgcGFyc2VycyBzdXBwb3J0ZWQgYnkgZG94eWdlbjogSURMLCBKYXZhLCBKYXZhc2NyaXB0LAorIyBDIywgQywgQysrLCBELCBQSFAsIE9iamVjdGl2ZS1DLCBQeXRob24sIEZvcnRyYW4sIFZIREwuIEZvciBpbnN0YW5jZSB0byBtYWtlCisjIGRveHlnZW4gdHJlYXQgLmluYyBmaWxlcyBhcyBGb3J0cmFuIGZpbGVzIChkZWZhdWx0IGlzIFBIUCksIGFuZCAuZiBmaWxlcyBhcyBDCisjIChkZWZhdWx0IGlzIEZvcnRyYW4pLCB1c2U6IGluYz1Gb3J0cmFuIGY9Qy4KKyMKKyMgTm90ZSBGb3IgZmlsZXMgd2l0aG91dCBleHRlbnNpb24geW91IGNhbiB1c2Ugbm9fZXh0ZW5zaW9uIGFzIGEgcGxhY2Vob2xkZXIuCisjCisjIE5vdGUgdGhhdCBmb3IgY3VzdG9tIGV4dGVuc2lvbnMgeW91IGFsc28gbmVlZCB0byBzZXQgRklMRV9QQVRURVJOUyBvdGhlcndpc2UKKyMgdGhlIGZpbGVzIGFyZSBub3QgcmVhZCBieSBkb3h5Z2VuLgorCitFWFRFTlNJT05fTUFQUElORyAgICAgID0gCisKKyMgSWYgdGhlIE1BUktET1dOX1NVUFBPUlQgdGFnIGlzIGVuYWJsZWQgdGhlbiBkb3h5Z2VuIHByZS1wcm9jZXNzZXMgYWxsIGNvbW1lbnRzCisjIGFjY29yZGluZyB0byB0aGUgTWFya2Rvd24gZm9ybWF0LCB3aGljaCBhbGxvd3MgZm9yIG1vcmUgcmVhZGFibGUKKyMgZG9jdW1lbnRhdGlvbi4gU2VlIGh0dHA6Ly9kYXJpbmdmaXJlYmFsbC5uZXQvcHJvamVjdHMvbWFya2Rvd24vIGZvciBkZXRhaWxzLgorIyBUaGUgb3V0cHV0IG9mIG1hcmtkb3duIHByb2Nlc3NpbmcgaXMgZnVydGhlciBwcm9jZXNzZWQgYnkgZG94eWdlbiwgc28geW91IGNhbgorIyBtaXggZG94eWdlbiwgSFRNTCwgYW5kIFhNTCBjb21tYW5kcyB3aXRoIE1hcmtkb3duIGZvcm1hdHRpbmcuIERpc2FibGUgb25seSBpbgorIyBjYXNlIG9mIGJhY2t3YXJkIGNvbXBhdGliaWxpdGllcyBpc3N1ZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK01BUktET1dOX1NVUFBPUlQgICAgICAgPSBZRVMKKworIyBXaGVuIGVuYWJsZWQgZG94eWdlbiB0cmllcyB0byBsaW5rIHdvcmRzIHRoYXQgY29ycmVzcG9uZCB0byBkb2N1bWVudGVkCisjIGNsYXNzZXMsIG9yIG5hbWVzcGFjZXMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyBkb2N1bWVudGF0aW9uLiBTdWNoIGEgbGluayBjYW4KKyMgYmUgcHJldmVudGVkIGluIGluZGl2aWR1YWwgY2FzZXMgYnkgYnkgcHV0dGluZyBhICUgc2lnbiBpbiBmcm9udCBvZiB0aGUgd29yZAorIyBvciBnbG9iYWxseSBieSBzZXR0aW5nIEFVVE9MSU5LX1NVUFBPUlQgdG8gTk8uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0FVVE9MSU5LX1NVUFBPUlQgICAgICAgPSBZRVMKKworIyBJZiB5b3UgdXNlIFNUTCBjbGFzc2VzIChpLmUuIHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3RvciwgZXRjLikgYnV0IGRvIG5vdCB3YW50CisjIHRvIGluY2x1ZGUgKGEgdGFnIGZpbGUgZm9yKSB0aGUgU1RMIHNvdXJjZXMgYXMgaW5wdXQsIHRoZW4geW91IHNob3VsZCBzZXQgdGhpcworIyB0YWcgdG8gWUVTIGluIG9yZGVyIHRvIGxldCBkb3h5Z2VuIG1hdGNoIGZ1bmN0aW9ucyBkZWNsYXJhdGlvbnMgYW5kCisjIGRlZmluaXRpb25zIHdob3NlIGFyZ3VtZW50cyBjb250YWluIFNUTCBjbGFzc2VzIChlLmcuIGZ1bmMoc3RkOjpzdHJpbmcpOworIyB2ZXJzdXMgZnVuYyhzdGQ6OnN0cmluZykge30pLiBUaGlzIGFsc28gbWFrZSB0aGUgaW5oZXJpdGFuY2UgYW5kIGNvbGxhYm9yYXRpb24KKyMgZGlhZ3JhbXMgdGhhdCBpbnZvbHZlIFNUTCBjbGFzc2VzIG1vcmUgY29tcGxldGUgYW5kIGFjY3VyYXRlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0JVSUxUSU5fU1RMX1NVUFBPUlQgICAgPSBOTworCisjIElmIHlvdSB1c2UgTWljcm9zb2Z0J3MgQysrL0NMSSBsYW5ndWFnZSwgeW91IHNob3VsZCBzZXQgdGhpcyBvcHRpb24gdG8gWUVTIHRvCisjIGVuYWJsZSBwYXJzaW5nIHN1cHBvcnQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworQ1BQX0NMSV9TVVBQT1JUICAgICAgICA9IE5PCisKKyMgU2V0IHRoZSBTSVBfU1VQUE9SVCB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBzaXAgKHNlZToKKyMgaHR0cDovL3d3dy5yaXZlcmJhbmtjb21wdXRpbmcuY28udWsvc29mdHdhcmUvc2lwL2ludHJvKSBzb3VyY2VzIG9ubHkuIERveHlnZW4KKyMgd2lsbCBwYXJzZSB0aGVtIGxpa2Ugbm9ybWFsIEMrKyBidXQgd2lsbCBhc3N1bWUgYWxsIGNsYXNzZXMgdXNlIHB1YmxpYyBpbnN0ZWFkCisjIG9mIHByaXZhdGUgaW5oZXJpdGFuY2Ugd2hlbiBubyBleHBsaWNpdCBwcm90ZWN0aW9uIGtleXdvcmQgaXMgcHJlc2VudC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitTSVBfU1VQUE9SVCAgICAgICAgICAgID0gTk8KKworIyBGb3IgTWljcm9zb2Z0J3MgSURMIHRoZXJlIGFyZSBwcm9wZ2V0IGFuZCBwcm9wcHV0IGF0dHJpYnV0ZXMgdG8gaW5kaWNhdGUKKyMgZ2V0dGVyIGFuZCBzZXR0ZXIgbWV0aG9kcyBmb3IgYSBwcm9wZXJ0eS4gU2V0dGluZyB0aGlzIG9wdGlvbiB0byBZRVMgd2lsbCBtYWtlCisjIGRveHlnZW4gdG8gcmVwbGFjZSB0aGUgZ2V0IGFuZCBzZXQgbWV0aG9kcyBieSBhIHByb3BlcnR5IGluIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGlzIHdpbGwgb25seSB3b3JrIGlmIHRoZSBtZXRob2RzIGFyZSBpbmRlZWQgZ2V0dGluZyBvciBzZXR0aW5nIGEgc2ltcGxlCisjIHR5cGUuIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCBvciB5b3Ugd2FudCB0byBzaG93IHRoZSBtZXRob2RzIGFueXdheSwgeW91CisjIHNob3VsZCBzZXQgdGhpcyBvcHRpb24gdG8gTk8uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0lETF9QUk9QRVJUWV9TVVBQT1JUICAgPSBZRVMKKworIyBJZiBtZW1iZXIgZ3JvdXBpbmcgaXMgdXNlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQgdGhlIERJU1RSSUJVVEVfR1JPVVBfRE9DCisjIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGVuIGRveHlnZW4gd2lsbCByZXVzZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgZmlyc3QKKyMgbWVtYmVyIGluIHRoZSBncm91cCAoaWYgYW55KSBmb3IgdGhlIG90aGVyIG1lbWJlcnMgb2YgdGhlIGdyb3VwLiBCeSBkZWZhdWx0CisjIGFsbCBtZW1iZXJzIG9mIGEgZ3JvdXAgbXVzdCBiZSBkb2N1bWVudGVkIGV4cGxpY2l0bHkuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRElTVFJJQlVURV9HUk9VUF9ET0MgICA9IE5PCisKKyMgU2V0IHRoZSBTVUJHUk9VUElORyB0YWcgdG8gWUVTIHRvIGFsbG93IGNsYXNzIG1lbWJlciBncm91cHMgb2YgdGhlIHNhbWUgdHlwZQorIyAoZm9yIGluc3RhbmNlIGEgZ3JvdXAgb2YgcHVibGljIGZ1bmN0aW9ucykgdG8gYmUgcHV0IGFzIGEgc3ViZ3JvdXAgb2YgdGhhdAorIyB0eXBlIChlLmcuIHVuZGVyIHRoZSBQdWJsaWMgRnVuY3Rpb25zIHNlY3Rpb24pLiBTZXQgaXQgdG8gTk8gdG8gcHJldmVudAorIyBzdWJncm91cGluZy4gQWx0ZXJuYXRpdmVseSwgdGhpcyBjYW4gYmUgZG9uZSBwZXIgY2xhc3MgdXNpbmcgdGhlCisjIFxub3N1Ymdyb3VwaW5nIGNvbW1hbmQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1NVQkdST1VQSU5HICAgICAgICAgICAgPSBZRVMKKworIyBXaGVuIHRoZSBJTkxJTkVfR1JPVVBFRF9DTEFTU0VTIHRhZyBpcyBzZXQgdG8gWUVTLCBjbGFzc2VzLCBzdHJ1Y3RzIGFuZCB1bmlvbnMKKyMgYXJlIHNob3duIGluc2lkZSB0aGUgZ3JvdXAgaW4gd2hpY2ggdGhleSBhcmUgaW5jbHVkZWQgKGUuZy4gdXNpbmcgXGluZ3JvdXApCisjIGluc3RlYWQgb2Ygb24gYSBzZXBhcmF0ZSBwYWdlIChmb3IgSFRNTCBhbmQgTWFuIHBhZ2VzKSBvciBzZWN0aW9uIChmb3IgTGFUZVgKKyMgYW5kIFJURikuCisjCisjIE5vdGUgdGhhdCB0aGlzIGZlYXR1cmUgZG9lcyBub3Qgd29yayBpbiBjb21iaW5hdGlvbiB3aXRoCisjIFNFUEFSQVRFX01FTUJFUl9QQUdFUy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitJTkxJTkVfR1JPVVBFRF9DTEFTU0VTID0gTk8KKworIyBXaGVuIHRoZSBJTkxJTkVfU0lNUExFX1NUUlVDVFMgdGFnIGlzIHNldCB0byBZRVMsIHN0cnVjdHMsIGNsYXNzZXMsIGFuZCB1bmlvbnMKKyMgd2l0aCBvbmx5IHB1YmxpYyBkYXRhIGZpZWxkcyBvciBzaW1wbGUgdHlwZWRlZiBmaWVsZHMgd2lsbCBiZSBzaG93biBpbmxpbmUgaW4KKyMgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIHNjb3BlIGluIHdoaWNoIHRoZXkgYXJlIGRlZmluZWQgKGkuZS4gZmlsZSwKKyMgbmFtZXNwYWNlLCBvciBncm91cCBkb2N1bWVudGF0aW9uKSwgcHJvdmlkZWQgdGhpcyBzY29wZSBpcyBkb2N1bWVudGVkLiBJZiBzZXQKKyMgdG8gTk8sIHN0cnVjdHMsIGNsYXNzZXMsIGFuZCB1bmlvbnMgYXJlIHNob3duIG9uIGEgc2VwYXJhdGUgcGFnZSAoZm9yIEhUTUwgYW5kCisjIE1hbiBwYWdlcykgb3Igc2VjdGlvbiAoZm9yIExhVGVYIGFuZCBSVEYpLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0lOTElORV9TSU1QTEVfU1RSVUNUUyAgPSBOTworCisjIFdoZW4gVFlQRURFRl9ISURFU19TVFJVQ1QgdGFnIGlzIGVuYWJsZWQsIGEgdHlwZWRlZiBvZiBhIHN0cnVjdCwgdW5pb24sIG9yCisjIGVudW0gaXMgZG9jdW1lbnRlZCBhcyBzdHJ1Y3QsIHVuaW9uLCBvciBlbnVtIHdpdGggdGhlIG5hbWUgb2YgdGhlIHR5cGVkZWYuIFNvCisjIHR5cGVkZWYgc3RydWN0IFR5cGVTIHt9IFR5cGVULCB3aWxsIGFwcGVhciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhcyBhIHN0cnVjdAorIyB3aXRoIG5hbWUgVHlwZVQuIFdoZW4gZGlzYWJsZWQgdGhlIHR5cGVkZWYgd2lsbCBhcHBlYXIgYXMgYSBtZW1iZXIgb2YgYSBmaWxlLAorIyBuYW1lc3BhY2UsIG9yIGNsYXNzLiBBbmQgdGhlIHN0cnVjdCB3aWxsIGJlIG5hbWVkIFR5cGVTLiBUaGlzIGNhbiB0eXBpY2FsbHkgYmUKKyMgdXNlZnVsIGZvciBDIGNvZGUgaW4gY2FzZSB0aGUgY29kaW5nIGNvbnZlbnRpb24gZGljdGF0ZXMgdGhhdCBhbGwgY29tcG91bmQKKyMgdHlwZXMgYXJlIHR5cGVkZWYnZWQgYW5kIG9ubHkgdGhlIHR5cGVkZWYgaXMgcmVmZXJlbmNlZCwgbmV2ZXIgdGhlIHRhZyBuYW1lLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1RZUEVERUZfSElERVNfU1RSVUNUICAgPSBOTworCisjIFRoZSBzaXplIG9mIHRoZSBzeW1ib2wgbG9va3VwIGNhY2hlIGNhbiBiZSBzZXQgdXNpbmcgTE9PS1VQX0NBQ0hFX1NJWkUuIFRoaXMKKyMgY2FjaGUgaXMgdXNlZCB0byByZXNvbHZlIHN5bWJvbHMgZ2l2ZW4gdGhlaXIgbmFtZSBhbmQgc2NvcGUuIFNpbmNlIHRoaXMgY2FuIGJlCisjIGFuIGV4cGVuc2l2ZSBwcm9jZXNzIGFuZCBvZnRlbiB0aGUgc2FtZSBzeW1ib2wgYXBwZWFycyBtdWx0aXBsZSB0aW1lcyBpbiB0aGUKKyMgY29kZSwgZG94eWdlbiBrZWVwcyBhIGNhY2hlIG9mIHByZS1yZXNvbHZlZCBzeW1ib2xzLiBJZiB0aGUgY2FjaGUgaXMgdG9vIHNtYWxsCisjIGRveHlnZW4gd2lsbCBiZWNvbWUgc2xvd2VyLiBJZiB0aGUgY2FjaGUgaXMgdG9vIGxhcmdlLCBtZW1vcnkgaXMgd2FzdGVkLiBUaGUKKyMgY2FjaGUgc2l6ZSBpcyBnaXZlbiBieSB0aGlzIGZvcm11bGE6IDJeKDE2K0xPT0tVUF9DQUNIRV9TSVpFKS4gVGhlIHZhbGlkIHJhbmdlCisjIGlzIDAuLjksIHRoZSBkZWZhdWx0IGlzIDAsIGNvcnJlc3BvbmRpbmcgdG8gYSBjYWNoZSBzaXplIG9mIDJeMTY9NjU1MzYKKyMgc3ltYm9scy4gQXQgdGhlIGVuZCBvZiBhIHJ1biBkb3h5Z2VuIHdpbGwgcmVwb3J0IHRoZSBjYWNoZSB1c2FnZSBhbmQgc3VnZ2VzdAorIyB0aGUgb3B0aW1hbCBjYWNoZSBzaXplIGZyb20gYSBzcGVlZCBwb2ludCBvZiB2aWV3LgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiA5LCBkZWZhdWx0IHZhbHVlOiAwLgorCitMT09LVVBfQ0FDSEVfU0laRSAgICAgID0gMAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEJ1aWxkIHJlbGF0ZWQgY29uZmlndXJhdGlvbiBvcHRpb25zCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEVYVFJBQ1RfQUxMIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBhc3N1bWUgYWxsIGVudGl0aWVzIGluCisjIGRvY3VtZW50YXRpb24gYXJlIGRvY3VtZW50ZWQsIGV2ZW4gaWYgbm8gZG9jdW1lbnRhdGlvbiB3YXMgYXZhaWxhYmxlLiBQcml2YXRlCisjIGNsYXNzIG1lbWJlcnMgYW5kIHN0YXRpYyBmaWxlIG1lbWJlcnMgd2lsbCBiZSBoaWRkZW4gdW5sZXNzIHRoZQorIyBFWFRSQUNUX1BSSVZBVEUgcmVzcGVjdGl2ZWx5IEVYVFJBQ1RfU1RBVElDIHRhZ3MgYXJlIHNldCB0byBZRVMuCisjIE5vdGU6IFRoaXMgd2lsbCBhbHNvIGRpc2FibGUgdGhlIHdhcm5pbmdzIGFib3V0IHVuZG9jdW1lbnRlZCBtZW1iZXJzIHRoYXQgYXJlCisjIG5vcm1hbGx5IHByb2R1Y2VkIHdoZW4gV0FSTklOR1MgaXMgc2V0IHRvIFlFUy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWFRSQUNUX0FMTCAgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEVYVFJBQ1RfUFJJVkFURSB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgcHJpdmF0ZSBtZW1iZXJzIG9mIGEgY2xhc3Mgd2lsbAorIyBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWFRSQUNUX1BSSVZBVEUgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEVYVFJBQ1RfUEFDS0FHRSB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgbWVtYmVycyB3aXRoIHBhY2thZ2Ugb3IgaW50ZXJuYWwKKyMgc2NvcGUgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWFRSQUNUX1BBQ0tBR0UgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEVYVFJBQ1RfU1RBVElDIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBzdGF0aWMgbWVtYmVycyBvZiBhIGZpbGUgd2lsbCBiZQorIyBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWFRSQUNUX1NUQVRJQyAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEVYVFJBQ1RfTE9DQUxfQ0xBU1NFUyB0YWcgaXMgc2V0IHRvIFlFUyBjbGFzc2VzIChhbmQgc3RydWN0cykgZGVmaW5lZAorIyBsb2NhbGx5IGluIHNvdXJjZSBmaWxlcyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLiBJZiBzZXQgdG8gTk8KKyMgb25seSBjbGFzc2VzIGRlZmluZWQgaW4gaGVhZGVyIGZpbGVzIGFyZSBpbmNsdWRlZC4gRG9lcyBub3QgaGF2ZSBhbnkgZWZmZWN0CisjIGZvciBKYXZhIHNvdXJjZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0VYVFJBQ1RfTE9DQUxfQ0xBU1NFUyAgPSBZRVMKKworIyBUaGlzIGZsYWcgaXMgb25seSB1c2VmdWwgZm9yIE9iamVjdGl2ZS1DIGNvZGUuIFdoZW4gc2V0IHRvIFlFUyBsb2NhbCBtZXRob2RzLAorIyB3aGljaCBhcmUgZGVmaW5lZCBpbiB0aGUgaW1wbGVtZW50YXRpb24gc2VjdGlvbiBidXQgbm90IGluIHRoZSBpbnRlcmZhY2UgYXJlCisjIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLiBJZiBzZXQgdG8gTk8gb25seSBtZXRob2RzIGluIHRoZSBpbnRlcmZhY2UgYXJlCisjIGluY2x1ZGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0VYVFJBQ1RfTE9DQUxfTUVUSE9EUyAgPSBOTworCisjIElmIHRoaXMgZmxhZyBpcyBzZXQgdG8gWUVTLCB0aGUgbWVtYmVycyBvZiBhbm9ueW1vdXMgbmFtZXNwYWNlcyB3aWxsIGJlCisjIGV4dHJhY3RlZCBhbmQgYXBwZWFyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFzIGEgbmFtZXNwYWNlIGNhbGxlZAorIyAnYW5vbnltb3VzX25hbWVzcGFjZXtmaWxlfScsIHdoZXJlIGZpbGUgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZSBiYXNlIG5hbWUgb2YKKyMgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgYW5vbnltb3VzIG5hbWVzcGFjZS4gQnkgZGVmYXVsdCBhbm9ueW1vdXMgbmFtZXNwYWNlCisjIGFyZSBoaWRkZW4uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRVhUUkFDVF9BTk9OX05TUEFDRVMgICA9IE5PCisKKyMgSWYgdGhlIEhJREVfVU5ET0NfTUVNQkVSUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGhpZGUgYWxsCisjIHVuZG9jdW1lbnRlZCBtZW1iZXJzIGluc2lkZSBkb2N1bWVudGVkIGNsYXNzZXMgb3IgZmlsZXMuIElmIHNldCB0byBOTyB0aGVzZQorIyBtZW1iZXJzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHZhcmlvdXMgb3ZlcnZpZXdzLCBidXQgbm8gZG9jdW1lbnRhdGlvbgorIyBzZWN0aW9uIGlzIGdlbmVyYXRlZC4gVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBpZiBFWFRSQUNUX0FMTCBpcyBlbmFibGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0hJREVfVU5ET0NfTUVNQkVSUyAgICAgPSBOTworCisjIElmIHRoZSBISURFX1VORE9DX0NMQVNTRVMgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBoaWRlIGFsbAorIyB1bmRvY3VtZW50ZWQgY2xhc3NlcyB0aGF0IGFyZSBub3JtYWxseSB2aXNpYmxlIGluIHRoZSBjbGFzcyBoaWVyYXJjaHkuIElmIHNldAorIyB0byBOTyB0aGVzZSBjbGFzc2VzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHZhcmlvdXMgb3ZlcnZpZXdzLiBUaGlzIG9wdGlvbiBoYXMKKyMgbm8gZWZmZWN0IGlmIEVYVFJBQ1RfQUxMIGlzIGVuYWJsZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSElERV9VTkRPQ19DTEFTU0VTICAgICA9IE5PCisKKyMgSWYgdGhlIEhJREVfRlJJRU5EX0NPTVBPVU5EUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGhpZGUgYWxsIGZyaWVuZAorIyAoY2xhc3N8c3RydWN0fHVuaW9uKSBkZWNsYXJhdGlvbnMuIElmIHNldCB0byBOTyB0aGVzZSBkZWNsYXJhdGlvbnMgd2lsbCBiZQorIyBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitISURFX0ZSSUVORF9DT01QT1VORFMgID0gTk8KKworIyBJZiB0aGUgSElERV9JTl9CT0RZX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBoaWRlIGFueQorIyBkb2N1bWVudGF0aW9uIGJsb2NrcyBmb3VuZCBpbnNpZGUgdGhlIGJvZHkgb2YgYSBmdW5jdGlvbi4gSWYgc2V0IHRvIE5PIHRoZXNlCisjIGJsb2NrcyB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBmdW5jdGlvbidzIGRldGFpbGVkIGRvY3VtZW50YXRpb24gYmxvY2suCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSElERV9JTl9CT0RZX0RPQ1MgICAgICA9IE5PCisKKyMgVGhlIElOVEVSTkFMX0RPQ1MgdGFnIGRldGVybWluZXMgaWYgZG9jdW1lbnRhdGlvbiB0aGF0IGlzIHR5cGVkIGFmdGVyIGEKKyMgXGludGVybmFsIGNvbW1hbmQgaXMgaW5jbHVkZWQuIElmIHRoZSB0YWcgaXMgc2V0IHRvIE5PIHRoZW4gdGhlIGRvY3VtZW50YXRpb24KKyMgd2lsbCBiZSBleGNsdWRlZC4gU2V0IGl0IHRvIFlFUyB0byBpbmNsdWRlIHRoZSBpbnRlcm5hbCBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0lOVEVSTkFMX0RPQ1MgICAgICAgICAgPSBOTworCisjIElmIHRoZSBDQVNFX1NFTlNFX05BTUVTIHRhZyBpcyBzZXQgdG8gTk8gdGhlbiBkb3h5Z2VuIHdpbGwgb25seSBnZW5lcmF0ZSBmaWxlCisjIG5hbWVzIGluIGxvd2VyLWNhc2UgbGV0dGVycy4gSWYgc2V0IHRvIFlFUyB1cHBlci1jYXNlIGxldHRlcnMgYXJlIGFsc28KKyMgYWxsb3dlZC4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGhhdmUgY2xhc3NlcyBvciBmaWxlcyB3aG9zZSBuYW1lcyBvbmx5IGRpZmZlcgorIyBpbiBjYXNlIGFuZCBpZiB5b3VyIGZpbGUgc3lzdGVtIHN1cHBvcnRzIGNhc2Ugc2Vuc2l0aXZlIGZpbGUgbmFtZXMuIFdpbmRvd3MKKyMgYW5kIE1hYyB1c2VycyBhcmUgYWR2aXNlZCB0byBzZXQgdGhpcyBvcHRpb24gdG8gTk8uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBzeXN0ZW0gZGVwZW5kZW50LgorCitDQVNFX1NFTlNFX05BTUVTICAgICAgID0gTk8KKworIyBJZiB0aGUgSElERV9TQ09QRV9OQU1FUyB0YWcgaXMgc2V0IHRvIE5PIHRoZW4gZG94eWdlbiB3aWxsIHNob3cgbWVtYmVycyB3aXRoCisjIHRoZWlyIGZ1bGwgY2xhc3MgYW5kIG5hbWVzcGFjZSBzY29wZXMgaW4gdGhlIGRvY3VtZW50YXRpb24uIElmIHNldCB0byBZRVMgdGhlCisjIHNjb3BlIHdpbGwgYmUgaGlkZGVuLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0hJREVfU0NPUEVfTkFNRVMgICAgICAgPSBOTworCisjIElmIHRoZSBTSE9XX0lOQ0xVREVfRklMRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgcHV0IGEgbGlzdCBvZgorIyB0aGUgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgYnkgYSBmaWxlIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoYXQgZmlsZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworU0hPV19JTkNMVURFX0ZJTEVTICAgICA9IFlFUworCisKK1NIT1dfR1JPVVBFRF9NRU1CX0lOQyAgPSBOTworCisjIElmIHRoZSBGT1JDRV9MT0NBTF9JTkNMVURFUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBsaXN0IGluY2x1ZGUKKyMgZmlsZXMgd2l0aCBkb3VibGUgcXVvdGVzIGluIHRoZSBkb2N1bWVudGF0aW9uIHJhdGhlciB0aGFuIHdpdGggc2hhcnAgYnJhY2tldHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRk9SQ0VfTE9DQUxfSU5DTFVERVMgICA9IE5PCisKKyMgSWYgdGhlIElOTElORV9JTkZPIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gYSB0YWcgW2lubGluZV0gaXMgaW5zZXJ0ZWQgaW4gdGhlCisjIGRvY3VtZW50YXRpb24gZm9yIGlubGluZSBtZW1iZXJzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitJTkxJTkVfSU5GTyAgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFNPUlRfTUVNQkVSX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc29ydCB0aGUKKyMgKGRldGFpbGVkKSBkb2N1bWVudGF0aW9uIG9mIGZpbGUgYW5kIGNsYXNzIG1lbWJlcnMgYWxwaGFiZXRpY2FsbHkgYnkgbWVtYmVyCisjIG5hbWUuIElmIHNldCB0byBOTyB0aGUgbWVtYmVycyB3aWxsIGFwcGVhciBpbiBkZWNsYXJhdGlvbiBvcmRlci4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworU09SVF9NRU1CRVJfRE9DUyAgICAgICA9IFlFUworCisjIElmIHRoZSBTT1JUX0JSSUVGX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc29ydCB0aGUgYnJpZWYKKyMgZGVzY3JpcHRpb25zIG9mIGZpbGUsIG5hbWVzcGFjZSBhbmQgY2xhc3MgbWVtYmVycyBhbHBoYWJldGljYWxseSBieSBtZW1iZXIKKyMgbmFtZS4gSWYgc2V0IHRvIE5PIHRoZSBtZW1iZXJzIHdpbGwgYXBwZWFyIGluIGRlY2xhcmF0aW9uIG9yZGVyLiBOb3RlIHRoYXQKKyMgdGhpcyB3aWxsIGFsc28gaW5mbHVlbmNlIHRoZSBvcmRlciBvZiB0aGUgY2xhc3NlcyBpbiB0aGUgY2xhc3MgbGlzdC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitTT1JUX0JSSUVGX0RPQ1MgICAgICAgID0gTk8KKworIyBJZiB0aGUgU09SVF9NRU1CRVJTX0NUT1JTXzFTVCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBzb3J0IHRoZQorIyAoYnJpZWYgYW5kIGRldGFpbGVkKSBkb2N1bWVudGF0aW9uIG9mIGNsYXNzIG1lbWJlcnMgc28gdGhhdCBjb25zdHJ1Y3RvcnMgYW5kCisjIGRlc3RydWN0b3JzIGFyZSBsaXN0ZWQgZmlyc3QuIElmIHNldCB0byBOTyB0aGUgY29uc3RydWN0b3JzIHdpbGwgYXBwZWFyIGluIHRoZQorIyByZXNwZWN0aXZlIG9yZGVycyBkZWZpbmVkIGJ5IFNPUlRfQlJJRUZfRE9DUyBhbmQgU09SVF9NRU1CRVJfRE9DUy4KKyMgTm90ZTogSWYgU09SVF9CUklFRl9ET0NTIGlzIHNldCB0byBOTyB0aGlzIG9wdGlvbiBpcyBpZ25vcmVkIGZvciBzb3J0aW5nIGJyaWVmCisjIG1lbWJlciBkb2N1bWVudGF0aW9uLgorIyBOb3RlOiBJZiBTT1JUX01FTUJFUl9ET0NTIGlzIHNldCB0byBOTyB0aGlzIG9wdGlvbiBpcyBpZ25vcmVkIGZvciBzb3J0aW5nCisjIGRldGFpbGVkIG1lbWJlciBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NPUlRfTUVNQkVSU19DVE9SU18xU1QgPSBOTworCisjIElmIHRoZSBTT1JUX0dST1VQX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHNvcnQgdGhlIGhpZXJhcmNoeQorIyBvZiBncm91cCBuYW1lcyBpbnRvIGFscGhhYmV0aWNhbCBvcmRlci4gSWYgc2V0IHRvIE5PIHRoZSBncm91cCBuYW1lcyB3aWxsCisjIGFwcGVhciBpbiB0aGVpciBkZWZpbmVkIG9yZGVyLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NPUlRfR1JPVVBfTkFNRVMgICAgICAgPSBOTworCisjIElmIHRoZSBTT1JUX0JZX1NDT1BFX05BTUUgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBjbGFzcyBsaXN0IHdpbGwgYmUgc29ydGVkIGJ5CisjIGZ1bGx5LXF1YWxpZmllZCBuYW1lcywgaW5jbHVkaW5nIG5hbWVzcGFjZXMuIElmIHNldCB0byBOTywgdGhlIGNsYXNzIGxpc3Qgd2lsbAorIyBiZSBzb3J0ZWQgb25seSBieSBjbGFzcyBuYW1lLCBub3QgaW5jbHVkaW5nIHRoZSBuYW1lc3BhY2UgcGFydC4KKyMgTm90ZTogVGhpcyBvcHRpb24gaXMgbm90IHZlcnkgdXNlZnVsIGlmIEhJREVfU0NPUEVfTkFNRVMgaXMgc2V0IHRvIFlFUy4KKyMgTm90ZTogVGhpcyBvcHRpb24gYXBwbGllcyBvbmx5IHRvIHRoZSBjbGFzcyBsaXN0LCBub3QgdG8gdGhlIGFscGhhYmV0aWNhbAorIyBsaXN0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NPUlRfQllfU0NPUEVfTkFNRSAgICAgPSBOTworCisjIElmIHRoZSBTVFJJQ1RfUFJPVE9fTUFUQ0hJTkcgb3B0aW9uIGlzIGVuYWJsZWQgYW5kIGRveHlnZW4gZmFpbHMgdG8gZG8gcHJvcGVyCisjIHR5cGUgcmVzb2x1dGlvbiBvZiBhbGwgcGFyYW1ldGVycyBvZiBhIGZ1bmN0aW9uIGl0IHdpbGwgcmVqZWN0IGEgbWF0Y2ggYmV0d2VlbgorIyB0aGUgcHJvdG90eXBlIGFuZCB0aGUgaW1wbGVtZW50YXRpb24gb2YgYSBtZW1iZXIgZnVuY3Rpb24gZXZlbiBpZiB0aGVyZSBpcworIyBvbmx5IG9uZSBjYW5kaWRhdGUgb3IgaXQgaXMgb2J2aW91cyB3aGljaCBjYW5kaWRhdGUgdG8gY2hvb3NlIGJ5IGRvaW5nIGEKKyMgc2ltcGxlIHN0cmluZyBtYXRjaC4gQnkgZGlzYWJsaW5nIFNUUklDVF9QUk9UT19NQVRDSElORyBkb3h5Z2VuIHdpbGwgc3RpbGwKKyMgYWNjZXB0IGEgbWF0Y2ggYmV0d2VlbiBwcm90b3R5cGUgYW5kIGltcGxlbWVudGF0aW9uIGluIHN1Y2ggY2FzZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU1RSSUNUX1BST1RPX01BVENISU5HICA9IE5PCisKKyMgVGhlIEdFTkVSQVRFX1RPRE9MSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKCBZRVMpIG9yIGRpc2FibGUgKCBOTykgdGhlCisjIHRvZG8gbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZyBcdG9kbyBjb21tYW5kcyBpbiB0aGUKKyMgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworR0VORVJBVEVfVE9ET0xJU1QgICAgICA9IFlFUworCisjIFRoZSBHRU5FUkFURV9URVNUTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlICggWUVTKSBvciBkaXNhYmxlICggTk8pIHRoZQorIyB0ZXN0IGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgXHRlc3QgY29tbWFuZHMgaW4gdGhlCisjIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0dFTkVSQVRFX1RFU1RMSVNUICAgICAgPSBZRVMKKworIyBUaGUgR0VORVJBVEVfQlVHTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlICggWUVTKSBvciBkaXNhYmxlICggTk8pIHRoZSBidWcKKyMgbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZyBcYnVnIGNvbW1hbmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitHRU5FUkFURV9CVUdMSVNUICAgICAgID0gWUVTCisKKyMgVGhlIEdFTkVSQVRFX0RFUFJFQ0FURURMSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKCBZRVMpIG9yIGRpc2FibGUgKCBOTykKKyMgdGhlIGRlcHJlY2F0ZWQgbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZyBcZGVwcmVjYXRlZCBjb21tYW5kcyBpbgorIyB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworR0VORVJBVEVfREVQUkVDQVRFRExJU1Q9IFlFUworCisjIFRoZSBFTkFCTEVEX1NFQ1RJT05TIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgY29uZGl0aW9uYWwgZG9jdW1lbnRhdGlvbgorIyBzZWN0aW9ucywgbWFya2VkIGJ5IFxpZiA8c2VjdGlvbl9sYWJlbD4gLi4uIFxlbmRpZiBhbmQgXGNvbmQgPHNlY3Rpb25fbGFiZWw+CisjIC4uLiBcZW5kY29uZCBibG9ja3MuCisKK0VOQUJMRURfU0VDVElPTlMgICAgICAgPSAKKworIyBUaGUgTUFYX0lOSVRJQUxJWkVSX0xJTkVTIHRhZyBkZXRlcm1pbmVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0aGF0IHRoZQorIyBpbml0aWFsIHZhbHVlIG9mIGEgdmFyaWFibGUgb3IgbWFjcm8gLyBkZWZpbmUgY2FuIGhhdmUgZm9yIGl0IHRvIGFwcGVhciBpbiB0aGUKKyMgZG9jdW1lbnRhdGlvbi4gSWYgdGhlIGluaXRpYWxpemVyIGNvbnNpc3RzIG9mIG1vcmUgbGluZXMgdGhhbiBzcGVjaWZpZWQgaGVyZQorIyBpdCB3aWxsIGJlIGhpZGRlbi4gVXNlIGEgdmFsdWUgb2YgMCB0byBoaWRlIGluaXRpYWxpemVycyBjb21wbGV0ZWx5LiBUaGUKKyMgYXBwZWFyYW5jZSBvZiB0aGUgdmFsdWUgb2YgaW5kaXZpZHVhbCB2YXJpYWJsZXMgYW5kIG1hY3JvcyAvIGRlZmluZXMgY2FuIGJlCisjIGNvbnRyb2xsZWQgdXNpbmcgXHNob3dpbml0aWFsaXplciBvciBcaGlkZWluaXRpYWxpemVyIGNvbW1hbmQgaW4gdGhlCisjIGRvY3VtZW50YXRpb24gcmVnYXJkbGVzcyBvZiB0aGlzIHNldHRpbmcuCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDEwMDAwLCBkZWZhdWx0IHZhbHVlOiAzMC4KKworTUFYX0lOSVRJQUxJWkVSX0xJTkVTICA9IDMwCisKKyMgU2V0IHRoZSBTSE9XX1VTRURfRklMRVMgdGFnIHRvIE5PIHRvIGRpc2FibGUgdGhlIGxpc3Qgb2YgZmlsZXMgZ2VuZXJhdGVkIGF0CisjIHRoZSBib3R0b20gb2YgdGhlIGRvY3VtZW50YXRpb24gb2YgY2xhc3NlcyBhbmQgc3RydWN0cy4gSWYgc2V0IHRvIFlFUyB0aGUgbGlzdAorIyB3aWxsIG1lbnRpb24gdGhlIGZpbGVzIHRoYXQgd2VyZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitTSE9XX1VTRURfRklMRVMgICAgICAgID0gWUVTCisKKyMgU2V0IHRoZSBTSE9XX0ZJTEVTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBGaWxlcyBwYWdlLiBUaGlzCisjIHdpbGwgcmVtb3ZlIHRoZSBGaWxlcyBlbnRyeSBmcm9tIHRoZSBRdWljayBJbmRleCBhbmQgZnJvbSB0aGUgRm9sZGVyIFRyZWUgVmlldworIyAoaWYgc3BlY2lmaWVkKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworU0hPV19GSUxFUyAgICAgICAgICAgICA9IFlFUworCisjIFNldCB0aGUgU0hPV19OQU1FU1BBQ0VTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBOYW1lc3BhY2VzCisjIHBhZ2UuIFRoaXMgd2lsbCByZW1vdmUgdGhlIE5hbWVzcGFjZXMgZW50cnkgZnJvbSB0aGUgUXVpY2sgSW5kZXggYW5kIGZyb20gdGhlCisjIEZvbGRlciBUcmVlIFZpZXcgKGlmIHNwZWNpZmllZCkuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1NIT1dfTkFNRVNQQUNFUyAgICAgICAgPSBZRVMKKworIyBUaGUgRklMRV9WRVJTSU9OX0ZJTFRFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHByb2dyYW0gb3Igc2NyaXB0IHRoYXQKKyMgZG94eWdlbiBzaG91bGQgaW52b2tlIHRvIGdldCB0aGUgY3VycmVudCB2ZXJzaW9uIGZvciBlYWNoIGZpbGUgKHR5cGljYWxseSBmcm9tCisjIHRoZSB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtKS4gRG94eWdlbiB3aWxsIGludm9rZSB0aGUgcHJvZ3JhbSBieSBleGVjdXRpbmcgKHZpYQorIyBwb3BlbigpKSB0aGUgY29tbWFuZCBjb21tYW5kIGlucHV0LWZpbGUsIHdoZXJlIGNvbW1hbmQgaXMgdGhlIHZhbHVlIG9mIHRoZQorIyBGSUxFX1ZFUlNJT05fRklMVEVSIHRhZywgYW5kIGlucHV0LWZpbGUgaXMgdGhlIG5hbWUgb2YgYW4gaW5wdXQgZmlsZSBwcm92aWRlZAorIyBieSBkb3h5Z2VuLiBXaGF0ZXZlciB0aGUgcHJvZ3JhbSB3cml0ZXMgdG8gc3RhbmRhcmQgb3V0cHV0IGlzIHVzZWQgYXMgdGhlIGZpbGUKKyMgdmVyc2lvbi4gRm9yIGFuIGV4YW1wbGUgc2VlIHRoZSBkb2N1bWVudGF0aW9uLgorCitGSUxFX1ZFUlNJT05fRklMVEVSICAgID0gCisKKyMgVGhlIExBWU9VVF9GSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbGF5b3V0IGZpbGUgd2hpY2ggd2lsbCBiZSBwYXJzZWQKKyMgYnkgZG94eWdlbi4gVGhlIGxheW91dCBmaWxlIGNvbnRyb2xzIHRoZSBnbG9iYWwgc3RydWN0dXJlIG9mIHRoZSBnZW5lcmF0ZWQKKyMgb3V0cHV0IGZpbGVzIGluIGFuIG91dHB1dCBmb3JtYXQgaW5kZXBlbmRlbnQgd2F5LiBUbyBjcmVhdGUgdGhlIGxheW91dCBmaWxlCisjIHRoYXQgcmVwcmVzZW50cyBkb3h5Z2VuJ3MgZGVmYXVsdHMsIHJ1biBkb3h5Z2VuIHdpdGggdGhlIC1sIG9wdGlvbi4gWW91IGNhbgorIyBvcHRpb25hbGx5IHNwZWNpZnkgYSBmaWxlIG5hbWUgYWZ0ZXIgdGhlIG9wdGlvbiwgaWYgb21pdHRlZCBEb3h5Z2VuTGF5b3V0LnhtbAorIyB3aWxsIGJlIHVzZWQgYXMgdGhlIG5hbWUgb2YgdGhlIGxheW91dCBmaWxlLgorIworIyBOb3RlIHRoYXQgaWYgeW91IHJ1biBkb3h5Z2VuIGZyb20gYSBkaXJlY3RvcnkgY29udGFpbmluZyBhIGZpbGUgY2FsbGVkCisjIERveHlnZW5MYXlvdXQueG1sLCBkb3h5Z2VuIHdpbGwgcGFyc2UgaXQgYXV0b21hdGljYWxseSBldmVuIGlmIHRoZSBMQVlPVVRfRklMRQorIyB0YWcgaXMgbGVmdCBlbXB0eS4KKworTEFZT1VUX0ZJTEUgICAgICAgICAgICA9IAorCisjIFRoZSBDSVRFX0JJQl9GSUxFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBiaWIgZmlsZXMgY29udGFpbmluZworIyB0aGUgcmVmZXJlbmNlIGRlZmluaXRpb25zLiBUaGlzIG11c3QgYmUgYSBsaXN0IG9mIC5iaWIgZmlsZXMuIFRoZSAuYmliCisjIGV4dGVuc2lvbiBpcyBhdXRvbWF0aWNhbGx5IGFwcGVuZGVkIGlmIG9taXR0ZWQuIFRoaXMgcmVxdWlyZXMgdGhlIGJpYnRleCB0b29sCisjIHRvIGJlIGluc3RhbGxlZC4gU2VlIGFsc28gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CaWJUZVggZm9yIG1vcmUgaW5mby4KKyMgRm9yIExhVGVYIHRoZSBzdHlsZSBvZiB0aGUgYmlibGlvZ3JhcGh5IGNhbiBiZSBjb250cm9sbGVkIHVzaW5nCisjIExBVEVYX0JJQl9TVFlMRS4gVG8gdXNlIHRoaXMgZmVhdHVyZSB5b3UgbmVlZCBiaWJ0ZXggYW5kIHBlcmwgYXZhaWxhYmxlIGluIHRoZQorIyBzZWFyY2ggcGF0aC4gRG8gbm90IHVzZSBmaWxlIG5hbWVzIHdpdGggc3BhY2VzLCBiaWJ0ZXggY2Fubm90IGhhbmRsZSB0aGVtLiBTZWUKKyMgYWxzbyBcY2l0ZSBmb3IgaW5mbyBob3cgdG8gY3JlYXRlIHJlZmVyZW5jZXMuCisKK0NJVEVfQklCX0ZJTEVTICAgICAgICAgPSAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB3YXJuaW5nIGFuZCBwcm9ncmVzcyBtZXNzYWdlcworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFRoZSBRVUlFVCB0YWcgY2FuIGJlIHVzZWQgdG8gdHVybiBvbi9vZmYgdGhlIG1lc3NhZ2VzIHRoYXQgYXJlIGdlbmVyYXRlZCB0bworIyBzdGFuZGFyZCBvdXRwdXQgYnkgZG94eWdlbi4gSWYgUVVJRVQgaXMgc2V0IHRvIFlFUyB0aGlzIGltcGxpZXMgdGhhdCB0aGUKKyMgbWVzc2FnZXMgYXJlIG9mZi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitRVUlFVCAgICAgICAgICAgICAgICAgID0gTk8KKworIyBUaGUgV0FSTklOR1MgdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSB3YXJuaW5nIG1lc3NhZ2VzIHRoYXQgYXJlCisjIGdlbmVyYXRlZCB0byBzdGFuZGFyZCBlcnJvciAoIHN0ZGVycikgYnkgZG94eWdlbi4gSWYgV0FSTklOR1MgaXMgc2V0IHRvIFlFUworIyB0aGlzIGltcGxpZXMgdGhhdCB0aGUgd2FybmluZ3MgYXJlIG9uLgorIworIyBUaXA6IFR1cm4gd2FybmluZ3Mgb24gd2hpbGUgd3JpdGluZyB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworV0FSTklOR1MgICAgICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBXQVJOX0lGX1VORE9DVU1FTlRFRCB0YWcgaXMgc2V0IHRvIFlFUywgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUKKyMgd2FybmluZ3MgZm9yIHVuZG9jdW1lbnRlZCBtZW1iZXJzLiBJZiBFWFRSQUNUX0FMTCBpcyBzZXQgdG8gWUVTIHRoZW4gdGhpcyBmbGFnCisjIHdpbGwgYXV0b21hdGljYWxseSBiZSBkaXNhYmxlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworV0FSTl9JRl9VTkRPQ1VNRU5URUQgICA9IFlFUworCisjIElmIHRoZSBXQVJOX0lGX0RPQ19FUlJPUiB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIHdhcm5pbmdzIGZvcgorIyBwb3RlbnRpYWwgZXJyb3JzIGluIHRoZSBkb2N1bWVudGF0aW9uLCBzdWNoIGFzIG5vdCBkb2N1bWVudGluZyBzb21lIHBhcmFtZXRlcnMKKyMgaW4gYSBkb2N1bWVudGVkIGZ1bmN0aW9uLCBvciBkb2N1bWVudGluZyBwYXJhbWV0ZXJzIHRoYXQgZG9uJ3QgZXhpc3Qgb3IgdXNpbmcKKyMgbWFya3VwIGNvbW1hbmRzIHdyb25nbHkuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1dBUk5fSUZfRE9DX0VSUk9SICAgICAgPSBZRVMKKworIyBUaGlzIFdBUk5fTk9fUEFSQU1ET0Mgb3B0aW9uIGNhbiBiZSBlbmFibGVkIHRvIGdldCB3YXJuaW5ncyBmb3IgZnVuY3Rpb25zIHRoYXQKKyMgYXJlIGRvY3VtZW50ZWQsIGJ1dCBoYXZlIG5vIGRvY3VtZW50YXRpb24gZm9yIHRoZWlyIHBhcmFtZXRlcnMgb3IgcmV0dXJuCisjIHZhbHVlLiBJZiBzZXQgdG8gTk8gZG94eWdlbiB3aWxsIG9ubHkgd2FybiBhYm91dCB3cm9uZyBvciBpbmNvbXBsZXRlIHBhcmFtZXRlcgorIyBkb2N1bWVudGF0aW9uLCBidXQgbm90IGFib3V0IHRoZSBhYnNlbmNlIG9mIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworV0FSTl9OT19QQVJBTURPQyAgICAgICA9IE5PCisKKyMgVGhlIFdBUk5fRk9STUFUIHRhZyBkZXRlcm1pbmVzIHRoZSBmb3JtYXQgb2YgdGhlIHdhcm5pbmcgbWVzc2FnZXMgdGhhdCBkb3h5Z2VuCisjIGNhbiBwcm9kdWNlLiBUaGUgc3RyaW5nIHNob3VsZCBjb250YWluIHRoZSAkZmlsZSwgJGxpbmUsIGFuZCAkdGV4dCB0YWdzLCB3aGljaAorIyB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBmaWxlIGFuZCBsaW5lIG51bWJlciBmcm9tIHdoaWNoIHRoZSB3YXJuaW5nIG9yaWdpbmF0ZWQKKyMgYW5kIHRoZSB3YXJuaW5nIHRleHQuIE9wdGlvbmFsbHkgdGhlIGZvcm1hdCBtYXkgY29udGFpbiAkdmVyc2lvbiwgd2hpY2ggd2lsbAorIyBiZSByZXBsYWNlZCBieSB0aGUgdmVyc2lvbiBvZiB0aGUgZmlsZSAoaWYgaXQgY291bGQgYmUgb2J0YWluZWQgdmlhCisjIEZJTEVfVkVSU0lPTl9GSUxURVIpCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiAkZmlsZTokbGluZTogJHRleHQuCisKK1dBUk5fRk9STUFUICAgICAgICAgICAgPSAiJGZpbGU6JGxpbmU6ICR0ZXh0IgorCisjIFRoZSBXQVJOX0xPR0ZJTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBmaWxlIHRvIHdoaWNoIHdhcm5pbmcgYW5kIGVycm9yCisjIG1lc3NhZ2VzIHNob3VsZCBiZSB3cml0dGVuLiBJZiBsZWZ0IGJsYW5rIHRoZSBvdXRwdXQgaXMgd3JpdHRlbiB0byBzdGFuZGFyZAorIyBlcnJvciAoc3RkZXJyKS4KKworV0FSTl9MT0dGSUxFICAgICAgICAgICA9IAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBpbnB1dCBmaWxlcworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFRoZSBJTlBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlcyBhbmQvb3IgZGlyZWN0b3JpZXMgdGhhdCBjb250YWluCisjIGRvY3VtZW50ZWQgc291cmNlIGZpbGVzLiBZb3UgbWF5IGVudGVyIGZpbGUgbmFtZXMgbGlrZSBteWZpbGUuY3BwIG9yCisjIGRpcmVjdG9yaWVzIGxpa2UgL3Vzci9zcmMvbXlwcm9qZWN0LiBTZXBhcmF0ZSB0aGUgZmlsZXMgb3IgZGlyZWN0b3JpZXMgd2l0aAorIyBzcGFjZXMuCisjIE5vdGU6IElmIHRoaXMgdGFnIGlzIGVtcHR5IHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpcyBzZWFyY2hlZC4KKworSU5QVVQgICAgICAgICAgICAgICAgICA9IHNyYworCisjIFRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGNoYXJhY3RlciBlbmNvZGluZyBvZiB0aGUgc291cmNlIGZpbGVzCisjIHRoYXQgZG94eWdlbiBwYXJzZXMuIEludGVybmFsbHkgZG94eWdlbiB1c2VzIHRoZSBVVEYtOCBlbmNvZGluZy4gRG94eWdlbiB1c2VzCisjIGxpYmljb252IChvciB0aGUgaWNvbnYgYnVpbHQgaW50byBsaWJjKSBmb3IgdGhlIHRyYW5zY29kaW5nLiBTZWUgdGhlIGxpYmljb252CisjIGRvY3VtZW50YXRpb24gKHNlZTogaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2xpYmljb252KSBmb3IgdGhlIGxpc3Qgb2YKKyMgcG9zc2libGUgZW5jb2RpbmdzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogVVRGLTguCisKK0lOUFVUX0VOQ09ESU5HICAgICAgICAgPSBVVEYtOAorCisjIElmIHRoZSB2YWx1ZSBvZiB0aGUgSU5QVVQgdGFnIGNvbnRhaW5zIGRpcmVjdG9yaWVzLCB5b3UgY2FuIHVzZSB0aGUKKyMgRklMRV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZCBwYXR0ZXJucyAobGlrZSAqLmNwcCBhbmQKKyMgKi5oKSB0byBmaWx0ZXIgb3V0IHRoZSBzb3VyY2UtZmlsZXMgaW4gdGhlIGRpcmVjdG9yaWVzLiBJZiBsZWZ0IGJsYW5rIHRoZQorIyBmb2xsb3dpbmcgcGF0dGVybnMgYXJlIHRlc3RlZDoqLmMsICouY2MsICouY3h4LCAqLmNwcCwgKi5jKyssICouamF2YSwgKi5paSwKKyMgKi5peHgsICouaXBwLCAqLmkrKywgKi5pbmwsICouaWRsLCAqLmRkbCwgKi5vZGwsICouaCwgKi5oaCwgKi5oeHgsICouaHBwLAorIyAqLmgrKywgKi5jcywgKi5kLCAqLnBocCwgKi5waHA0LCAqLnBocDUsICoucGh0bWwsICouaW5jLCAqLm0sICoubWFya2Rvd24sCisjICoubWQsICoubW0sICouZG94LCAqLnB5LCAqLmY5MCwgKi5mLCAqLmZvciwgKi50Y2wsICoudmhkLCAqLnZoZGwsICoudWNmLAorIyAqLnFzZiwgKi5hcyBhbmQgKi5qcy4KKworRklMRV9QQVRURVJOUyAgICAgICAgICA9ICouYyAqLmggKi5jcHAgKi5mOTAKKworIyBUaGUgUkVDVVJTSVZFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHdoZXRoZXIgb3Igbm90IHN1YmRpcmVjdG9yaWVzIHNob3VsZAorIyBiZSBzZWFyY2hlZCBmb3IgaW5wdXQgZmlsZXMgYXMgd2VsbC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitSRUNVUlNJVkUgICAgICAgICAgICAgID0gWUVTCisKKyMgVGhlIEVYQ0xVREUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgZmlsZXMgYW5kL29yIGRpcmVjdG9yaWVzIHRoYXQgc2hvdWxkIGJlCisjIGV4Y2x1ZGVkIGZyb20gdGhlIElOUFVUIHNvdXJjZSBmaWxlcy4gVGhpcyB3YXkgeW91IGNhbiBlYXNpbHkgZXhjbHVkZSBhCisjIHN1YmRpcmVjdG9yeSBmcm9tIGEgZGlyZWN0b3J5IHRyZWUgd2hvc2Ugcm9vdCBpcyBzcGVjaWZpZWQgd2l0aCB0aGUgSU5QVVQgdGFnLgorIworIyBOb3RlIHRoYXQgcmVsYXRpdmUgcGF0aHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgZnJvbSB3aGljaCBkb3h5Z2VuIGlzCisjIHJ1bi4KKworRVhDTFVERSAgICAgICAgICAgICAgICA9IHNyYy9pbXBvcnRlZCBzcmMvcmR0c2MuaAorCisjIFRoZSBFWENMVURFX1NZTUxJTktTIHRhZyBjYW4gYmUgdXNlZCB0byBzZWxlY3Qgd2hldGhlciBvciBub3QgZmlsZXMgb3IKKyMgZGlyZWN0b3JpZXMgdGhhdCBhcmUgc3ltYm9saWMgbGlua3MgKGEgVW5peCBmaWxlIHN5c3RlbSBmZWF0dXJlKSBhcmUgZXhjbHVkZWQKKyMgZnJvbSB0aGUgaW5wdXQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRVhDTFVERV9TWU1MSU5LUyAgICAgICA9IE5PCisKKyMgSWYgdGhlIHZhbHVlIG9mIHRoZSBJTlBVVCB0YWcgY29udGFpbnMgZGlyZWN0b3JpZXMsIHlvdSBjYW4gdXNlIHRoZQorIyBFWENMVURFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkIHBhdHRlcm5zIHRvIGV4Y2x1ZGUKKyMgY2VydGFpbiBmaWxlcyBmcm9tIHRob3NlIGRpcmVjdG9yaWVzLgorIworIyBOb3RlIHRoYXQgdGhlIHdpbGRjYXJkcyBhcmUgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBmaWxlIHdpdGggYWJzb2x1dGUgcGF0aCwgc28gdG8KKyMgZXhjbHVkZSBhbGwgdGVzdCBkaXJlY3RvcmllcyBmb3IgZXhhbXBsZSB1c2UgdGhlIHBhdHRlcm4gKi90ZXN0LyoKKworRVhDTFVERV9QQVRURVJOUyAgICAgICA9IAorCisjIFRoZSBFWENMVURFX1NZTUJPTFMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgc3ltYm9sIG5hbWVzCisjIChuYW1lc3BhY2VzLCBjbGFzc2VzLCBmdW5jdGlvbnMsIGV0Yy4pIHRoYXQgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gdGhlCisjIG91dHB1dC4gVGhlIHN5bWJvbCBuYW1lIGNhbiBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lLCBhIHdvcmQsIG9yIGlmIHRoZQorIyB3aWxkY2FyZCAqIGlzIHVzZWQsIGEgc3Vic3RyaW5nLiBFeGFtcGxlczogQU5hbWVzcGFjZSwgQUNsYXNzLAorIyBBQ2xhc3M6OkFOYW1lc3BhY2UsIEFOYW1lc3BhY2U6OipUZXN0CisjCisjIE5vdGUgdGhhdCB0aGUgd2lsZGNhcmRzIGFyZSBtYXRjaGVkIGFnYWluc3QgdGhlIGZpbGUgd2l0aCBhYnNvbHV0ZSBwYXRoLCBzbyB0bworIyBleGNsdWRlIGFsbCB0ZXN0IGRpcmVjdG9yaWVzIHVzZSB0aGUgcGF0dGVybiAqL3Rlc3QvKgorCitFWENMVURFX1NZTUJPTFMgICAgICAgID0gCisKKyMgVGhlIEVYQU1QTEVfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBmaWxlcyBvciBkaXJlY3RvcmllcworIyB0aGF0IGNvbnRhaW4gZXhhbXBsZSBjb2RlIGZyYWdtZW50cyB0aGF0IGFyZSBpbmNsdWRlZCAoc2VlIHRoZSBcaW5jbHVkZQorIyBjb21tYW5kKS4KKworRVhBTVBMRV9QQVRIICAgICAgICAgICA9IAorCisjIElmIHRoZSB2YWx1ZSBvZiB0aGUgRVhBTVBMRV9QQVRIIHRhZyBjb250YWlucyBkaXJlY3RvcmllcywgeW91IGNhbiB1c2UgdGhlCisjIEVYQU1QTEVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgcGF0dGVybiAobGlrZSAqLmNwcCBhbmQKKyMgKi5oKSB0byBmaWx0ZXIgb3V0IHRoZSBzb3VyY2UtZmlsZXMgaW4gdGhlIGRpcmVjdG9yaWVzLiBJZiBsZWZ0IGJsYW5rIGFsbAorIyBmaWxlcyBhcmUgaW5jbHVkZWQuCisKK0VYQU1QTEVfUEFUVEVSTlMgICAgICAgPSAqCisKKyMgSWYgdGhlIEVYQU1QTEVfUkVDVVJTSVZFIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gc3ViZGlyZWN0b3JpZXMgd2lsbCBiZQorIyBzZWFyY2hlZCBmb3IgaW5wdXQgZmlsZXMgdG8gYmUgdXNlZCB3aXRoIHRoZSBcaW5jbHVkZSBvciBcZG9udGluY2x1ZGUgY29tbWFuZHMKKyMgaXJyZXNwZWN0aXZlIG9mIHRoZSB2YWx1ZSBvZiB0aGUgUkVDVVJTSVZFIHRhZy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWEFNUExFX1JFQ1VSU0lWRSAgICAgID0gTk8KKworIyBUaGUgSU1BR0VfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBmaWxlcyBvciBkaXJlY3RvcmllcworIyB0aGF0IGNvbnRhaW4gaW1hZ2VzIHRoYXQgYXJlIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uIChzZWUgdGhlCisjIFxpbWFnZSBjb21tYW5kKS4KKworSU1BR0VfUEFUSCAgICAgICAgICAgICA9IAorCisjIFRoZSBJTlBVVF9GSUxURVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwcm9ncmFtIHRoYXQgZG94eWdlbiBzaG91bGQKKyMgaW52b2tlIHRvIGZpbHRlciBmb3IgZWFjaCBpbnB1dCBmaWxlLiBEb3h5Z2VuIHdpbGwgaW52b2tlIHRoZSBmaWx0ZXIgcHJvZ3JhbQorIyBieSBleGVjdXRpbmcgKHZpYSBwb3BlbigpKSB0aGUgY29tbWFuZDoKKyMKKyMgPGZpbHRlcj4gPGlucHV0LWZpbGU+CisjCisjIHdoZXJlIDxmaWx0ZXI+IGlzIHRoZSB2YWx1ZSBvZiB0aGUgSU5QVVRfRklMVEVSIHRhZywgYW5kIDxpbnB1dC1maWxlPiBpcyB0aGUKKyMgbmFtZSBvZiBhbiBpbnB1dCBmaWxlLiBEb3h5Z2VuIHdpbGwgdGhlbiB1c2UgdGhlIG91dHB1dCB0aGF0IHRoZSBmaWx0ZXIKKyMgcHJvZ3JhbSB3cml0ZXMgdG8gc3RhbmRhcmQgb3V0cHV0LiBJZiBGSUxURVJfUEFUVEVSTlMgaXMgc3BlY2lmaWVkLCB0aGlzIHRhZworIyB3aWxsIGJlIGlnbm9yZWQuCisjCisjIE5vdGUgdGhhdCB0aGUgZmlsdGVyIG11c3Qgbm90IGFkZCBvciByZW1vdmUgbGluZXM7IGl0IGlzIGFwcGxpZWQgYmVmb3JlIHRoZQorIyBjb2RlIGlzIHNjYW5uZWQsIGJ1dCBub3Qgd2hlbiB0aGUgb3V0cHV0IGNvZGUgaXMgZ2VuZXJhdGVkLiBJZiBsaW5lcyBhcmUgYWRkZWQKKyMgb3IgcmVtb3ZlZCwgdGhlIGFuY2hvcnMgd2lsbCBub3QgYmUgcGxhY2VkIGNvcnJlY3RseS4KKworSU5QVVRfRklMVEVSICAgICAgICAgICA9IAorCisjIFRoZSBGSUxURVJfUEFUVEVSTlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgZmlsdGVycyBvbiBhIHBlciBmaWxlIHBhdHRlcm4KKyMgYmFzaXMuIERveHlnZW4gd2lsbCBjb21wYXJlIHRoZSBmaWxlIG5hbWUgd2l0aCBlYWNoIHBhdHRlcm4gYW5kIGFwcGx5IHRoZQorIyBmaWx0ZXIgaWYgdGhlcmUgaXMgYSBtYXRjaC4gVGhlIGZpbHRlcnMgYXJlIGEgbGlzdCBvZiB0aGUgZm9ybTogcGF0dGVybj1maWx0ZXIKKyMgKGxpa2UgKi5jcHA9bXlfY3BwX2ZpbHRlcikuIFNlZSBJTlBVVF9GSUxURVIgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gb24gaG93CisjIGZpbHRlcnMgYXJlIHVzZWQuIElmIHRoZSBGSUxURVJfUEFUVEVSTlMgdGFnIGlzIGVtcHR5IG9yIGlmIG5vbmUgb2YgdGhlCisjIHBhdHRlcm5zIG1hdGNoIHRoZSBmaWxlIG5hbWUsIElOUFVUX0ZJTFRFUiBpcyBhcHBsaWVkLgorCitGSUxURVJfUEFUVEVSTlMgICAgICAgID0gCisKKyMgSWYgdGhlIEZJTFRFUl9TT1VSQ0VfRklMRVMgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBpbnB1dCBmaWx0ZXIgKGlmIHNldCB1c2luZworIyBJTlBVVF9GSUxURVIgKSB3aWxsIGFsc28gYmUgdXNlZCB0byBmaWx0ZXIgdGhlIGlucHV0IGZpbGVzIHRoYXQgYXJlIHVzZWQgZm9yCisjIHByb2R1Y2luZyB0aGUgc291cmNlIGZpbGVzIHRvIGJyb3dzZSAoaS5lLiB3aGVuIFNPVVJDRV9CUk9XU0VSIGlzIHNldCB0byBZRVMpLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0ZJTFRFUl9TT1VSQ0VfRklMRVMgICAgPSBOTworCisjIFRoZSBGSUxURVJfU09VUkNFX1BBVFRFUk5TIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHNvdXJjZSBmaWx0ZXJzIHBlciBmaWxlCisjIHBhdHRlcm4uIEEgcGF0dGVybiB3aWxsIG92ZXJyaWRlIHRoZSBzZXR0aW5nIGZvciBGSUxURVJfUEFUVEVSTiAoaWYgYW55KSBhbmQKKyMgaXQgaXMgYWxzbyBwb3NzaWJsZSB0byBkaXNhYmxlIHNvdXJjZSBmaWx0ZXJpbmcgZm9yIGEgc3BlY2lmaWMgcGF0dGVybiB1c2luZworIyAqLmV4dD0gKHNvIHdpdGhvdXQgbmFtaW5nIGEgZmlsdGVyKS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEZJTFRFUl9TT1VSQ0VfRklMRVMgaXMgc2V0IHRvIFlFUy4KKworRklMVEVSX1NPVVJDRV9QQVRURVJOUyA9IAorCisjIElmIHRoZSBVU0VfTURGSUxFX0FTX01BSU5QQUdFIHRhZyByZWZlcnMgdG8gdGhlIG5hbWUgb2YgYSBtYXJrZG93biBmaWxlIHRoYXQKKyMgaXMgcGFydCBvZiB0aGUgaW5wdXQsIGl0cyBjb250ZW50cyB3aWxsIGJlIHBsYWNlZCBvbiB0aGUgbWFpbiBwYWdlCisjIChpbmRleC5odG1sKS4gVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSBoYXZlIGEgcHJvamVjdCBvbiBmb3IgaW5zdGFuY2UgR2l0SHViCisjIGFuZCB3YW50IHRvIHJldXNlIHRoZSBpbnRyb2R1Y3Rpb24gcGFnZSBhbHNvIGZvciB0aGUgZG94eWdlbiBvdXRwdXQuCisKK1VTRV9NREZJTEVfQVNfTUFJTlBBR0UgPSAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byBzb3VyY2UgYnJvd3NpbmcKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgU09VUkNFX0JST1dTRVIgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBhIGxpc3Qgb2Ygc291cmNlIGZpbGVzIHdpbGwgYmUKKyMgZ2VuZXJhdGVkLiBEb2N1bWVudGVkIGVudGl0aWVzIHdpbGwgYmUgY3Jvc3MtcmVmZXJlbmNlZCB3aXRoIHRoZXNlIHNvdXJjZXMuCisjCisjIE5vdGU6IFRvIGdldCByaWQgb2YgYWxsIHNvdXJjZSBjb2RlIGluIHRoZSBnZW5lcmF0ZWQgb3V0cHV0LCBtYWtlIHN1cmUgdGhhdAorIyBhbHNvIFZFUkJBVElNX0hFQURFUlMgaXMgc2V0IHRvIE5PLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NPVVJDRV9CUk9XU0VSICAgICAgICAgPSBZRVMKKworIyBTZXR0aW5nIHRoZSBJTkxJTkVfU09VUkNFUyB0YWcgdG8gWUVTIHdpbGwgaW5jbHVkZSB0aGUgYm9keSBvZiBmdW5jdGlvbnMsCisjIGNsYXNzZXMgYW5kIGVudW1zIGRpcmVjdGx5IGludG8gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSU5MSU5FX1NPVVJDRVMgICAgICAgICA9IE5PCisKKyMgU2V0dGluZyB0aGUgU1RSSVBfQ09ERV9DT01NRU5UUyB0YWcgdG8gWUVTIHdpbGwgaW5zdHJ1Y3QgZG94eWdlbiB0byBoaWRlIGFueQorIyBzcGVjaWFsIGNvbW1lbnQgYmxvY2tzIGZyb20gZ2VuZXJhdGVkIHNvdXJjZSBjb2RlIGZyYWdtZW50cy4gTm9ybWFsIEMsIEMrKyBhbmQKKyMgRm9ydHJhbiBjb21tZW50cyB3aWxsIGFsd2F5cyByZW1haW4gdmlzaWJsZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworU1RSSVBfQ09ERV9DT01NRU5UUyAgICA9IFlFUworCisjIElmIHRoZSBSRUZFUkVOQ0VEX0JZX1JFTEFUSU9OIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZm9yIGVhY2ggZG9jdW1lbnRlZAorIyBmdW5jdGlvbiBhbGwgZG9jdW1lbnRlZCBmdW5jdGlvbnMgcmVmZXJlbmNpbmcgaXQgd2lsbCBiZSBsaXN0ZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworUkVGRVJFTkNFRF9CWV9SRUxBVElPTiA9IFlFUworCisjIElmIHRoZSBSRUZFUkVOQ0VTX1JFTEFUSU9OIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZm9yIGVhY2ggZG9jdW1lbnRlZCBmdW5jdGlvbgorIyBhbGwgZG9jdW1lbnRlZCBlbnRpdGllcyBjYWxsZWQvdXNlZCBieSB0aGF0IGZ1bmN0aW9uIHdpbGwgYmUgbGlzdGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1JFRkVSRU5DRVNfUkVMQVRJT04gICAgPSBOTworCisjIElmIHRoZSBSRUZFUkVOQ0VTX0xJTktfU09VUkNFIHRhZyBpcyBzZXQgdG8gWUVTIGFuZCBTT1VSQ0VfQlJPV1NFUiB0YWcgaXMgc2V0CisjIHRvIFlFUywgdGhlbiB0aGUgaHlwZXJsaW5rcyBmcm9tIGZ1bmN0aW9ucyBpbiBSRUZFUkVOQ0VTX1JFTEFUSU9OIGFuZAorIyBSRUZFUkVOQ0VEX0JZX1JFTEFUSU9OIGxpc3RzIHdpbGwgbGluayB0byB0aGUgc291cmNlIGNvZGUuIE90aGVyd2lzZSB0aGV5IHdpbGwKKyMgbGluayB0byB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworUkVGRVJFTkNFU19MSU5LX1NPVVJDRSA9IFlFUworCisjIElmIFNPVVJDRV9UT09MVElQUyBpcyBlbmFibGVkICh0aGUgZGVmYXVsdCkgdGhlbiBob3ZlcmluZyBhIGh5cGVybGluayBpbiB0aGUKKyMgc291cmNlIGNvZGUgd2lsbCBzaG93IGEgdG9vbHRpcCB3aXRoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gc3VjaCBhcyBwcm90b3R5cGUsCisjIGJyaWVmIGRlc2NyaXB0aW9uIGFuZCBsaW5rcyB0byB0aGUgZGVmaW5pdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4gU2luY2UgdGhpcworIyB3aWxsIG1ha2UgdGhlIEhUTUwgZmlsZSBsYXJnZXIgYW5kIGxvYWRpbmcgb2YgbGFyZ2UgZmlsZXMgYSBiaXQgc2xvd2VyLCB5b3UKKyMgY2FuIG9wdCB0byBkaXNhYmxlIHRoaXMgZmVhdHVyZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNPVVJDRV9CUk9XU0VSIGlzIHNldCB0byBZRVMuCisKK1NPVVJDRV9UT09MVElQUyAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgVVNFX0hUQUdTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIHJlZmVyZW5jZXMgdG8gc291cmNlIGNvZGUgd2lsbAorIyBwb2ludCB0byB0aGUgSFRNTCBnZW5lcmF0ZWQgYnkgdGhlIGh0YWdzKDEpIHRvb2wgaW5zdGVhZCBvZiBkb3h5Z2VuIGJ1aWx0LWluCisjIHNvdXJjZSBicm93c2VyLiBUaGUgaHRhZ3MgdG9vbCBpcyBwYXJ0IG9mIEdOVSdzIGdsb2JhbCBzb3VyY2UgdGFnZ2luZyBzeXN0ZW0KKyMgKHNlZSBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZ2xvYmFsL2dsb2JhbC5odG1sKS4gWW91IHdpbGwgbmVlZCB2ZXJzaW9uCisjIDQuOC42IG9yIGhpZ2hlci4KKyMKKyMgVG8gdXNlIGl0IGRvIHRoZSBmb2xsb3dpbmc6CisjIC0gSW5zdGFsbCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgZ2xvYmFsCisjIC0gRW5hYmxlIFNPVVJDRV9CUk9XU0VSIGFuZCBVU0VfSFRBR1MgaW4gdGhlIGNvbmZpZyBmaWxlCisjIC0gTWFrZSBzdXJlIHRoZSBJTlBVVCBwb2ludHMgdG8gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlCisjIC0gUnVuIGRveHlnZW4gYXMgbm9ybWFsCisjCisjIERveHlnZW4gd2lsbCBpbnZva2UgaHRhZ3MgKGFuZCB0aGF0IHdpbGwgaW4gdHVybiBpbnZva2UgZ3RhZ3MpLCBzbyB0aGVzZQorIyB0b29scyBtdXN0IGJlIGF2YWlsYWJsZSBmcm9tIHRoZSBjb21tYW5kIGxpbmUgKGkuZS4gaW4gdGhlIHNlYXJjaCBwYXRoKS4KKyMKKyMgVGhlIHJlc3VsdDogaW5zdGVhZCBvZiB0aGUgc291cmNlIGJyb3dzZXIgZ2VuZXJhdGVkIGJ5IGRveHlnZW4sIHRoZSBsaW5rcyB0bworIyBzb3VyY2UgY29kZSB3aWxsIG5vdyBwb2ludCB0byB0aGUgb3V0cHV0IG9mIGh0YWdzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTT1VSQ0VfQlJPV1NFUiBpcyBzZXQgdG8gWUVTLgorCitVU0VfSFRBR1MgICAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgVkVSQkFUSU1fSEVBREVSUyB0YWcgaXMgc2V0IHRoZSBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQorIyB2ZXJiYXRpbSBjb3B5IG9mIHRoZSBoZWFkZXIgZmlsZSBmb3IgZWFjaCBjbGFzcyBmb3Igd2hpY2ggYW4gaW5jbHVkZSBpcworIyBzcGVjaWZpZWQuIFNldCB0byBOTyB0byBkaXNhYmxlIHRoaXMuCisjIFNlZSBhbHNvOiBTZWN0aW9uIFxjbGFzcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworVkVSQkFUSU1fSEVBREVSUyAgICAgICA9IFlFUworCisjIElmIHRoZSBDTEFOR19BU1NJU1RFRF9QQVJTSU5HIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGVuIGRveHlnZW4gd2lsbCB1c2UgdGhlCisjIGNsYW5nIHBhcnNlciAoc2VlOiBodHRwOi8vY2xhbmcubGx2bS5vcmcvKSBmb3IgbW9yZSBhY3VyYXRlIHBhcnNpbmcgYXQgdGhlCisjIGNvc3Qgb2YgcmVkdWNlZCBwZXJmb3JtYW5jZS4gVGhpcyBjYW4gYmUgcGFydGljdWxhcmx5IGhlbHBmdWwgd2l0aCB0ZW1wbGF0ZQorIyByaWNoIEMrKyBjb2RlIGZvciB3aGljaCBkb3h5Z2VuJ3MgYnVpbHQtaW4gcGFyc2VyIGxhY2tzIHRoZSBuZWNlc3NhcnkgdHlwZQorIyBpbmZvcm1hdGlvbi4KKyMgTm90ZTogVGhlIGF2YWlsYWJpbGl0eSBvZiB0aGlzIG9wdGlvbiBkZXBlbmRzIG9uIHdoZXRoZXIgb3Igbm90IGRveHlnZW4gd2FzCisjIGNvbXBpbGVkIHdpdGggdGhlIC0td2l0aC1saWJjbGFuZyBvcHRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworQ0xBTkdfQVNTSVNURURfUEFSU0lORyA9IE5PCisKKyMgSWYgY2xhbmcgYXNzaXN0ZWQgcGFyc2luZyBpcyBlbmFibGVkIHlvdSBjYW4gcHJvdmlkZSB0aGUgY29tcGlsZXIgd2l0aCBjb21tYW5kCisjIGxpbmUgb3B0aW9ucyB0aGF0IHlvdSB3b3VsZCBub3JtYWxseSB1c2Ugd2hlbiBpbnZva2luZyB0aGUgY29tcGlsZXIuIE5vdGUgdGhhdAorIyB0aGUgaW5jbHVkZSBwYXRocyB3aWxsIGFscmVhZHkgYmUgc2V0IGJ5IGRveHlnZW4gZm9yIHRoZSBmaWxlcyBhbmQgZGlyZWN0b3JpZXMKKyMgc3BlY2lmaWVkIHdpdGggSU5QVVQgYW5kIElOQ0xVREVfUEFUSC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIENMQU5HX0FTU0lTVEVEX1BBUlNJTkcgaXMgc2V0IHRvIFlFUy4KKworQ0xBTkdfT1BUSU9OUyAgICAgICAgICA9IAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBhbHBoYWJldGljYWwgY2xhc3MgaW5kZXgKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgQUxQSEFCRVRJQ0FMX0lOREVYIHRhZyBpcyBzZXQgdG8gWUVTLCBhbiBhbHBoYWJldGljYWwgaW5kZXggb2YgYWxsCisjIGNvbXBvdW5kcyB3aWxsIGJlIGdlbmVyYXRlZC4gRW5hYmxlIHRoaXMgaWYgdGhlIHByb2plY3QgY29udGFpbnMgYSBsb3Qgb2YKKyMgY2xhc3Nlcywgc3RydWN0cywgdW5pb25zIG9yIGludGVyZmFjZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0FMUEhBQkVUSUNBTF9JTkRFWCAgICAgPSBZRVMKKworIyBUaGUgQ09MU19JTl9BTFBIQV9JTkRFWCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4KKyMgd2hpY2ggdGhlIGFscGhhYmV0aWNhbCBpbmRleCBsaXN0IHdpbGwgYmUgc3BsaXQuCisjIE1pbmltdW0gdmFsdWU6IDEsIG1heGltdW0gdmFsdWU6IDIwLCBkZWZhdWx0IHZhbHVlOiA1LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgQUxQSEFCRVRJQ0FMX0lOREVYIGlzIHNldCB0byBZRVMuCisKK0NPTFNfSU5fQUxQSEFfSU5ERVggICAgPSA1CisKKyMgSW4gY2FzZSBhbGwgY2xhc3NlcyBpbiBhIHByb2plY3Qgc3RhcnQgd2l0aCBhIGNvbW1vbiBwcmVmaXgsIGFsbCBjbGFzc2VzIHdpbGwKKyMgYmUgcHV0IHVuZGVyIHRoZSBzYW1lIGhlYWRlciBpbiB0aGUgYWxwaGFiZXRpY2FsIGluZGV4LiBUaGUgSUdOT1JFX1BSRUZJWCB0YWcKKyMgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHByZWZpeCAob3IgYSBsaXN0IG9mIHByZWZpeGVzKSB0aGF0IHNob3VsZCBiZSBpZ25vcmVkCisjIHdoaWxlIGdlbmVyYXRpbmcgdGhlIGluZGV4IGhlYWRlcnMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBBTFBIQUJFVElDQUxfSU5ERVggaXMgc2V0IHRvIFlFUy4KKworSUdOT1JFX1BSRUZJWCAgICAgICAgICA9IAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBIVE1MIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9IVE1MIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBIVE1MIG91dHB1dAorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitHRU5FUkFURV9IVE1MICAgICAgICAgID0gWUVTCisKKyMgVGhlIEhUTUxfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIEhUTUwgZG9jcyB3aWxsIGJlIHB1dC4gSWYgYQorIyByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSBwdXQgaW4gZnJvbnQgb2YKKyMgaXQuCisjIFRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpczogaHRtbC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9PVVRQVVQgICAgICAgICAgICA9IGh0bWwKKworIyBUaGUgSFRNTF9GSUxFX0VYVEVOU0lPTiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZSBleHRlbnNpb24gZm9yIGVhY2gKKyMgZ2VuZXJhdGVkIEhUTUwgcGFnZSAoZm9yIGV4YW1wbGU6IC5odG0sIC5waHAsIC5hc3ApLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogLmh0bWwuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfRklMRV9FWFRFTlNJT04gICAgPSAuaHRtbAorCisjIFRoZSBIVE1MX0hFQURFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHVzZXItZGVmaW5lZCBIVE1MIGhlYWRlciBmaWxlIGZvcgorIyBlYWNoIGdlbmVyYXRlZCBIVE1MIHBhZ2UuIElmIHRoZSB0YWcgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQorIyBzdGFuZGFyZCBoZWFkZXIuCisjCisjIFRvIGdldCB2YWxpZCBIVE1MIHRoZSBoZWFkZXIgZmlsZSB0aGF0IGluY2x1ZGVzIGFueSBzY3JpcHRzIGFuZCBzdHlsZSBzaGVldHMKKyMgdGhhdCBkb3h5Z2VuIG5lZWRzLCB3aGljaCBpcyBkZXBlbmRlbnQgb24gdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB1c2VkIChlLmcuCisjIHRoZSBzZXR0aW5nIEdFTkVSQVRFX1RSRUVWSUVXKS4gSXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRvIHN0YXJ0IHdpdGggYQorIyBkZWZhdWx0IGhlYWRlciB1c2luZworIyBkb3h5Z2VuIC13IGh0bWwgbmV3X2hlYWRlci5odG1sIG5ld19mb290ZXIuaHRtbCBuZXdfc3R5bGVzaGVldC5jc3MKKyMgWW91ckNvbmZpZ0ZpbGUKKyMgYW5kIHRoZW4gbW9kaWZ5IHRoZSBmaWxlIG5ld19oZWFkZXIuaHRtbC4gU2VlIGFsc28gc2VjdGlvbiAiRG94eWdlbiB1c2FnZSIKKyMgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBnZW5lcmF0ZSB0aGUgZGVmYXVsdCBoZWFkZXIgdGhhdCBkb3h5Z2VuIG5vcm1hbGx5CisjIHVzZXMuCisjIE5vdGU6IFRoZSBoZWFkZXIgaXMgc3ViamVjdCB0byBjaGFuZ2Ugc28geW91IHR5cGljYWxseSBoYXZlIHRvIHJlZ2VuZXJhdGUgdGhlCisjIGRlZmF1bHQgaGVhZGVyIHdoZW4gdXBncmFkaW5nIHRvIGEgbmV3ZXIgdmVyc2lvbiBvZiBkb3h5Z2VuLiBGb3IgYSBkZXNjcmlwdGlvbgorIyBvZiB0aGUgcG9zc2libGUgbWFya2VycyBhbmQgYmxvY2sgbmFtZXMgc2VlIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0hFQURFUiAgICAgICAgICAgID0gCisKKyMgVGhlIEhUTUxfRk9PVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgdXNlci1kZWZpbmVkIEhUTUwgZm9vdGVyIGZvciBlYWNoCisjIGdlbmVyYXRlZCBIVE1MIHBhZ2UuIElmIHRoZSB0YWcgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBzdGFuZGFyZAorIyBmb290ZXIuIFNlZSBIVE1MX0hFQURFUiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8gZ2VuZXJhdGUgYSBkZWZhdWx0CisjIGZvb3RlciBhbmQgd2hhdCBzcGVjaWFsIGNvbW1hbmRzIGNhbiBiZSB1c2VkIGluc2lkZSB0aGUgZm9vdGVyLiBTZWUgYWxzbworIyBzZWN0aW9uICJEb3h5Z2VuIHVzYWdlIiBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGdlbmVyYXRlIHRoZSBkZWZhdWx0IGZvb3RlcgorIyB0aGF0IGRveHlnZW4gbm9ybWFsbHkgdXNlcy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9GT09URVIgICAgICAgICAgICA9IAorCisjIFRoZSBIVE1MX1NUWUxFU0hFRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSB1c2VyLWRlZmluZWQgY2FzY2FkaW5nIHN0eWxlCisjIHNoZWV0IHRoYXQgaXMgdXNlZCBieSBlYWNoIEhUTUwgcGFnZS4gSXQgY2FuIGJlIHVzZWQgdG8gZmluZS10dW5lIHRoZSBsb29rIG9mCisjIHRoZSBIVE1MIG91dHB1dC4gSWYgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBkZWZhdWx0IHN0eWxlIHNoZWV0LgorIyBTZWUgYWxzbyBzZWN0aW9uICJEb3h5Z2VuIHVzYWdlIiBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGdlbmVyYXRlIHRoZSBzdHlsZQorIyBzaGVldCB0aGF0IGRveHlnZW4gbm9ybWFsbHkgdXNlcy4KKyMgTm90ZTogSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIEhUTUxfRVhUUkFfU1RZTEVTSEVFVCBpbnN0ZWFkIG9mIHRoaXMgdGFnLCBhcworIyBpdCBpcyBtb3JlIHJvYnVzdCBhbmQgdGhpcyB0YWcgKEhUTUxfU1RZTEVTSEVFVCkgd2lsbCBpbiB0aGUgZnV0dXJlIGJlY29tZQorIyBvYnNvbGV0ZS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9TVFlMRVNIRUVUICAgICAgICA9IAorCisjIFRoZSBIVE1MX0VYVFJBX1NUWUxFU0hFRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYW4gYWRkaXRpb25hbCB1c2VyLQorIyBkZWZpbmVkIGNhc2NhZGluZyBzdHlsZSBzaGVldCB0aGF0IGlzIGluY2x1ZGVkIGFmdGVyIHRoZSBzdGFuZGFyZCBzdHlsZSBzaGVldHMKKyMgY3JlYXRlZCBieSBkb3h5Z2VuLiBVc2luZyB0aGlzIG9wdGlvbiBvbmUgY2FuIG92ZXJydWxlIGNlcnRhaW4gc3R5bGUgYXNwZWN0cy4KKyMgVGhpcyBpcyBwcmVmZXJyZWQgb3ZlciB1c2luZyBIVE1MX1NUWUxFU0hFRVQgc2luY2UgaXQgZG9lcyBub3QgcmVwbGFjZSB0aGUKKyMgc3RhbmRhcmQgc3R5bGUgc2hlZXQgYW5kIGlzIHRoZXJlZm9yIG1vcmUgcm9idXN0IGFnYWluc3QgZnV0dXJlIHVwZGF0ZXMuCisjIERveHlnZW4gd2lsbCBjb3B5IHRoZSBzdHlsZSBzaGVldCBmaWxlIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LiBGb3IgYW4gZXhhbXBsZQorIyBzZWUgdGhlIGRvY3VtZW50YXRpb24uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfRVhUUkFfU1RZTEVTSEVFVCAgPSAKKworIyBUaGUgSFRNTF9FWFRSQV9GSUxFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBleHRyYSBpbWFnZXMgb3IKKyMgb3RoZXIgc291cmNlIGZpbGVzIHdoaWNoIHNob3VsZCBiZSBjb3BpZWQgdG8gdGhlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeS4gTm90ZQorIyB0aGF0IHRoZXNlIGZpbGVzIHdpbGwgYmUgY29waWVkIHRvIHRoZSBiYXNlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeS4gVXNlIHRoZQorIyAkcmVscGF0aF4gbWFya2VyIGluIHRoZSBIVE1MX0hFQURFUiBhbmQvb3IgSFRNTF9GT09URVIgZmlsZXMgdG8gbG9hZCB0aGVzZQorIyBmaWxlcy4gSW4gdGhlIEhUTUxfU1RZTEVTSEVFVCBmaWxlLCB1c2UgdGhlIGZpbGUgbmFtZSBvbmx5LiBBbHNvIG5vdGUgdGhhdCB0aGUKKyMgZmlsZXMgd2lsbCBiZSBjb3BpZWQgYXMtaXM7IHRoZXJlIGFyZSBubyBjb21tYW5kcyBvciBtYXJrZXJzIGF2YWlsYWJsZS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9FWFRSQV9GSUxFUyAgICAgICA9IAorCisjIFRoZSBIVE1MX0NPTE9SU1RZTEVfSFVFIHRhZyBjb250cm9scyB0aGUgY29sb3Igb2YgdGhlIEhUTUwgb3V0cHV0LiBEb3h5Z2VuCisjIHdpbGwgYWRqdXN0IHRoZSBjb2xvcnMgaW4gdGhlIHN0eWxlc2hlZXQgYW5kIGJhY2tncm91bmQgaW1hZ2VzIGFjY29yZGluZyB0bworIyB0aGlzIGNvbG9yLiBIdWUgaXMgc3BlY2lmaWVkIGFzIGFuIGFuZ2xlIG9uIGEgY29sb3J3aGVlbCwgc2VlCisjIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSHVlIGZvciBtb3JlIGluZm9ybWF0aW9uLiBGb3IgaW5zdGFuY2UgdGhlIHZhbHVlCisjIDAgcmVwcmVzZW50cyByZWQsIDYwIGlzIHllbGxvdywgMTIwIGlzIGdyZWVuLCAxODAgaXMgY3lhbiwgMjQwIGlzIGJsdWUsIDMwMAorIyBwdXJwbGUsIGFuZCAzNjAgaXMgcmVkIGFnYWluLgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAzNTksIGRlZmF1bHQgdmFsdWU6IDIyMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9DT0xPUlNUWUxFX0hVRSAgICA9IDIyMAorCisjIFRoZSBIVE1MX0NPTE9SU1RZTEVfU0FUIHRhZyBjb250cm9scyB0aGUgcHVyaXR5IChvciBzYXR1cmF0aW9uKSBvZiB0aGUgY29sb3JzCisjIGluIHRoZSBIVE1MIG91dHB1dC4gRm9yIGEgdmFsdWUgb2YgMCB0aGUgb3V0cHV0IHdpbGwgdXNlIGdyYXlzY2FsZXMgb25seS4gQQorIyB2YWx1ZSBvZiAyNTUgd2lsbCBwcm9kdWNlIHRoZSBtb3N0IHZpdmlkIGNvbG9ycy4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMjU1LCBkZWZhdWx0IHZhbHVlOiAxMDAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfQ09MT1JTVFlMRV9TQVQgICAgPSAxMDAKKworIyBUaGUgSFRNTF9DT0xPUlNUWUxFX0dBTU1BIHRhZyBjb250cm9scyB0aGUgZ2FtbWEgY29ycmVjdGlvbiBhcHBsaWVkIHRvIHRoZQorIyBsdW1pbmFuY2UgY29tcG9uZW50IG9mIHRoZSBjb2xvcnMgaW4gdGhlIEhUTUwgb3V0cHV0LiBWYWx1ZXMgYmVsb3cgMTAwCisjIGdyYWR1YWxseSBtYWtlIHRoZSBvdXRwdXQgbGlnaHRlciwgd2hlcmVhcyB2YWx1ZXMgYWJvdmUgMTAwIG1ha2UgdGhlIG91dHB1dAorIyBkYXJrZXIuIFRoZSB2YWx1ZSBkaXZpZGVkIGJ5IDEwMCBpcyB0aGUgYWN0dWFsIGdhbW1hIGFwcGxpZWQsIHNvIDgwIHJlcHJlc2VudHMKKyMgYSBnYW1tYSBvZiAwLjgsIFRoZSB2YWx1ZSAyMjAgcmVwcmVzZW50cyBhIGdhbW1hIG9mIDIuMiwgYW5kIDEwMCBkb2VzIG5vdAorIyBjaGFuZ2UgdGhlIGdhbW1hLgorIyBNaW5pbXVtIHZhbHVlOiA0MCwgbWF4aW11bSB2YWx1ZTogMjQwLCBkZWZhdWx0IHZhbHVlOiA4MC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9DT0xPUlNUWUxFX0dBTU1BICA9IDgwCisKKyMgSWYgdGhlIEhUTUxfVElNRVNUQU1QIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIGZvb3RlciBvZiBlYWNoIGdlbmVyYXRlZCBIVE1MCisjIHBhZ2Ugd2lsbCBjb250YWluIHRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhlIHBhZ2Ugd2FzIGdlbmVyYXRlZC4gU2V0dGluZyB0aGlzCisjIHRvIE5PIGNhbiBoZWxwIHdoZW4gY29tcGFyaW5nIHRoZSBvdXRwdXQgb2YgbXVsdGlwbGUgcnVucy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9USU1FU1RBTVAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBIVE1MX0RZTkFNSUNfU0VDVElPTlMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgZ2VuZXJhdGVkIEhUTUwKKyMgZG9jdW1lbnRhdGlvbiB3aWxsIGNvbnRhaW4gc2VjdGlvbnMgdGhhdCBjYW4gYmUgaGlkZGVuIGFuZCBzaG93biBhZnRlciB0aGUKKyMgcGFnZSBoYXMgbG9hZGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfRFlOQU1JQ19TRUNUSU9OUyAgPSBOTworCisjIFdpdGggSFRNTF9JTkRFWF9OVU1fRU5UUklFUyBvbmUgY2FuIGNvbnRyb2wgdGhlIHByZWZlcnJlZCBudW1iZXIgb2YgZW50cmllcworIyBzaG93biBpbiB0aGUgdmFyaW91cyB0cmVlIHN0cnVjdHVyZWQgaW5kaWNlcyBpbml0aWFsbHk7IHRoZSB1c2VyIGNhbiBleHBhbmQKKyMgYW5kIGNvbGxhcHNlIGVudHJpZXMgZHluYW1pY2FsbHkgbGF0ZXIgb24uIERveHlnZW4gd2lsbCBleHBhbmQgdGhlIHRyZWUgdG8KKyMgc3VjaCBhIGxldmVsIHRoYXQgYXQgbW9zdCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBlbnRyaWVzIGFyZSB2aXNpYmxlICh1bmxlc3MKKyMgYSBmdWxseSBjb2xsYXBzZWQgdHJlZSBhbHJlYWR5IGV4Y2VlZHMgdGhpcyBhbW91bnQpLiBTbyBzZXR0aW5nIHRoZSBudW1iZXIgb2YKKyMgZW50cmllcyAxIHdpbGwgcHJvZHVjZSBhIGZ1bGwgY29sbGFwc2VkIHRyZWUgYnkgZGVmYXVsdC4gMCBpcyBhIHNwZWNpYWwgdmFsdWUKKyMgcmVwcmVzZW50aW5nIGFuIGluZmluaXRlIG51bWJlciBvZiBlbnRyaWVzIGFuZCB3aWxsIHJlc3VsdCBpbiBhIGZ1bGwgZXhwYW5kZWQKKyMgdHJlZSBieSBkZWZhdWx0LgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiA5OTk5LCBkZWZhdWx0IHZhbHVlOiAxMDAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfSU5ERVhfTlVNX0VOVFJJRVMgPSAxMDAKKworIyBJZiB0aGUgR0VORVJBVEVfRE9DU0VUIHRhZyBpcyBzZXQgdG8gWUVTLCBhZGRpdGlvbmFsIGluZGV4IGZpbGVzIHdpbGwgYmUKKyMgZ2VuZXJhdGVkIHRoYXQgY2FuIGJlIHVzZWQgYXMgaW5wdXQgZm9yIEFwcGxlJ3MgWGNvZGUgMyBpbnRlZ3JhdGVkIGRldmVsb3BtZW50CisjIGVudmlyb25tZW50IChzZWU6IGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL3Rvb2xzL3hjb2RlLyksIGludHJvZHVjZWQgd2l0aAorIyBPU1ggMTAuNSAoTGVvcGFyZCkuIFRvIGNyZWF0ZSBhIGRvY3VtZW50YXRpb24gc2V0LCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQorIyBNYWtlZmlsZSBpbiB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5LiBSdW5uaW5nIG1ha2Ugd2lsbCBwcm9kdWNlIHRoZSBkb2NzZXQgaW4KKyMgdGhhdCBkaXJlY3RvcnkgYW5kIHJ1bm5pbmcgbWFrZSBpbnN0YWxsIHdpbGwgaW5zdGFsbCB0aGUgZG9jc2V0IGluCisjIH4vTGlicmFyeS9EZXZlbG9wZXIvU2hhcmVkL0RvY3VtZW50YXRpb24vRG9jU2V0cyBzbyB0aGF0IFhjb2RlIHdpbGwgZmluZCBpdCBhdAorIyBzdGFydHVwLiBTZWUgaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vdG9vbHMvY3JlYXRpbmdkb2NzZXRzd2l0aGRveHlnZW4uaHRtbAorIyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitHRU5FUkFURV9ET0NTRVQgICAgICAgID0gTk8KKworIyBUaGlzIHRhZyBkZXRlcm1pbmVzIHRoZSBuYW1lIG9mIHRoZSBkb2NzZXQgZmVlZC4gQSBkb2N1bWVudGF0aW9uIGZlZWQgcHJvdmlkZXMKKyMgYW4gdW1icmVsbGEgdW5kZXIgd2hpY2ggbXVsdGlwbGUgZG9jdW1lbnRhdGlvbiBzZXRzIGZyb20gYSBzaW5nbGUgcHJvdmlkZXIKKyMgKHN1Y2ggYXMgYSBjb21wYW55IG9yIHByb2R1Y3Qgc3VpdGUpIGNhbiBiZSBncm91cGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogRG94eWdlbiBnZW5lcmF0ZWQgZG9jcy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0RPQ1NFVCBpcyBzZXQgdG8gWUVTLgorCitET0NTRVRfRkVFRE5BTUUgICAgICAgID0gIkRveHlnZW4gZ2VuZXJhdGVkIGRvY3MiCisKKyMgVGhpcyB0YWcgc3BlY2lmaWVzIGEgc3RyaW5nIHRoYXQgc2hvdWxkIHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSBkb2N1bWVudGF0aW9uCisjIHNldCBidW5kbGUuIFRoaXMgc2hvdWxkIGJlIGEgcmV2ZXJzZSBkb21haW4tbmFtZSBzdHlsZSBzdHJpbmcsIGUuZy4KKyMgY29tLm15Y29tcGFueS5NeURvY1NldC4gRG94eWdlbiB3aWxsIGFwcGVuZCAuZG9jc2V0IHRvIHRoZSBuYW1lLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogb3JnLmRveHlnZW4uUHJvamVjdC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0RPQ1NFVCBpcyBzZXQgdG8gWUVTLgorCitET0NTRVRfQlVORExFX0lEICAgICAgID0gb3JnLmRveHlnZW4uUHJvamVjdAorCisjIFRoZSBET0NTRVRfUFVCTElTSEVSX0lEIHRhZyBzcGVjaWZpZXMgYSBzdHJpbmcgdGhhdCBzaG91bGQgdW5pcXVlbHkgaWRlbnRpZnkKKyMgdGhlIGRvY3VtZW50YXRpb24gcHVibGlzaGVyLiBUaGlzIHNob3VsZCBiZSBhIHJldmVyc2UgZG9tYWluLW5hbWUgc3R5bGUKKyMgc3RyaW5nLCBlLmcuIGNvbS5teWNvbXBhbnkuTXlEb2NTZXQuZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IG9yZy5kb3h5Z2VuLlB1Ymxpc2hlci4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0RPQ1NFVCBpcyBzZXQgdG8gWUVTLgorCitET0NTRVRfUFVCTElTSEVSX0lEICAgID0gb3JnLmRveHlnZW4uUHVibGlzaGVyCisKKyMgVGhlIERPQ1NFVF9QVUJMSVNIRVJfTkFNRSB0YWcgaWRlbnRpZmllcyB0aGUgZG9jdW1lbnRhdGlvbiBwdWJsaXNoZXIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBQdWJsaXNoZXIuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9ET0NTRVQgaXMgc2V0IHRvIFlFUy4KKworRE9DU0VUX1BVQkxJU0hFUl9OQU1FICA9IFB1Ymxpc2hlcgorCisjIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gZ2VuZXJhdGVzIHRocmVlCisjIGFkZGl0aW9uYWwgSFRNTCBpbmRleCBmaWxlczogaW5kZXguaGhwLCBpbmRleC5oaGMsIGFuZCBpbmRleC5oaGsuIFRoZQorIyBpbmRleC5oaHAgaXMgYSBwcm9qZWN0IGZpbGUgdGhhdCBjYW4gYmUgcmVhZCBieSBNaWNyb3NvZnQncyBIVE1MIEhlbHAgV29ya3Nob3AKKyMgKHNlZTogaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL2VuLXVzL2Rvd25sb2FkL2RldGFpbHMuYXNweD9pZD0yMTEzOCkgb24KKyMgV2luZG93cy4KKyMKKyMgVGhlIEhUTUwgSGVscCBXb3Jrc2hvcCBjb250YWlucyBhIGNvbXBpbGVyIHRoYXQgY2FuIGNvbnZlcnQgYWxsIEhUTUwgb3V0cHV0CisjIGdlbmVyYXRlZCBieSBkb3h5Z2VuIGludG8gYSBzaW5nbGUgY29tcGlsZWQgSFRNTCBmaWxlICguY2htKS4gQ29tcGlsZWQgSFRNTAorIyBmaWxlcyBhcmUgbm93IHVzZWQgYXMgdGhlIFdpbmRvd3MgOTggaGVscCBmb3JtYXQsIGFuZCB3aWxsIHJlcGxhY2UgdGhlIG9sZAorIyBXaW5kb3dzIGhlbHAgZm9ybWF0ICguaGxwKSBvbiBhbGwgV2luZG93cyBwbGF0Zm9ybXMgaW4gdGhlIGZ1dHVyZS4gQ29tcHJlc3NlZAorIyBIVE1MIGZpbGVzIGFsc28gY29udGFpbiBhbiBpbmRleCwgYSB0YWJsZSBvZiBjb250ZW50cywgYW5kIHlvdSBjYW4gc2VhcmNoIGZvcgorIyB3b3JkcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gVGhlIEhUTUwgd29ya3Nob3AgYWxzbyBjb250YWlucyBhIHZpZXdlciBmb3IKKyMgY29tcHJlc3NlZCBIVE1MIGZpbGVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0dFTkVSQVRFX0hUTUxIRUxQICAgICAgPSBOTworCisjIFRoZSBDSE1fRklMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZSBuYW1lIG9mIHRoZSByZXN1bHRpbmcgLmNobQorIyBmaWxlLiBZb3UgY2FuIGFkZCBhIHBhdGggaW4gZnJvbnQgb2YgdGhlIGZpbGUgaWYgdGhlIHJlc3VsdCBzaG91bGQgbm90IGJlCisjIHdyaXR0ZW4gdG8gdGhlIGh0bWwgb3V0cHV0IGRpcmVjdG9yeS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUxIRUxQIGlzIHNldCB0byBZRVMuCisKK0NITV9GSUxFICAgICAgICAgICAgICAgPSAKKworIyBUaGUgSEhDX0xPQ0FUSU9OIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiAoYWJzb2x1dGUgcGF0aAorIyBpbmNsdWRpbmcgZmlsZSBuYW1lKSBvZiB0aGUgSFRNTCBoZWxwIGNvbXBpbGVyICggaGhjLmV4ZSkuIElmIG5vbi1lbXB0eQorIyBkb3h5Z2VuIHdpbGwgdHJ5IHRvIHJ1biB0aGUgSFRNTCBoZWxwIGNvbXBpbGVyIG9uIHRoZSBnZW5lcmF0ZWQgaW5kZXguaGhwLgorIyBUaGUgZmlsZSBoYXMgdG8gYmUgc3BlY2lmaWVkIHdpdGggZnVsbCBwYXRoLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTEhFTFAgaXMgc2V0IHRvIFlFUy4KKworSEhDX0xPQ0FUSU9OICAgICAgICAgICA9IAorCisjIFRoZSBHRU5FUkFURV9DSEkgZmxhZyBjb250cm9scyBpZiBhIHNlcGFyYXRlIC5jaGkgaW5kZXggZmlsZSBpcyBnZW5lcmF0ZWQgKAorIyBZRVMpIG9yIHRoYXQgaXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBtYXN0ZXIgLmNobSBmaWxlICggTk8pLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MSEVMUCBpcyBzZXQgdG8gWUVTLgorCitHRU5FUkFURV9DSEkgICAgICAgICAgID0gTk8KKworIyBUaGUgQ0hNX0lOREVYX0VOQ09ESU5HIGlzIHVzZWQgdG8gZW5jb2RlIEh0bWxIZWxwIGluZGV4ICggaGhrKSwgY29udGVudCAoIGhoYykKKyMgYW5kIHByb2plY3QgZmlsZSBjb250ZW50LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTEhFTFAgaXMgc2V0IHRvIFlFUy4KKworQ0hNX0lOREVYX0VOQ09ESU5HICAgICA9IAorCisjIFRoZSBCSU5BUllfVE9DIGZsYWcgY29udHJvbHMgd2hldGhlciBhIGJpbmFyeSB0YWJsZSBvZiBjb250ZW50cyBpcyBnZW5lcmF0ZWQgKAorIyBZRVMpIG9yIGEgbm9ybWFsIHRhYmxlIG9mIGNvbnRlbnRzICggTk8pIGluIHRoZSAuY2htIGZpbGUuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUxIRUxQIGlzIHNldCB0byBZRVMuCisKK0JJTkFSWV9UT0MgICAgICAgICAgICAgPSBOTworCisjIFRoZSBUT0NfRVhQQU5EIGZsYWcgY2FuIGJlIHNldCB0byBZRVMgdG8gYWRkIGV4dHJhIGl0ZW1zIGZvciBncm91cCBtZW1iZXJzIHRvCisjIHRoZSB0YWJsZSBvZiBjb250ZW50cyBvZiB0aGUgSFRNTCBoZWxwIGRvY3VtZW50YXRpb24gYW5kIHRvIHRoZSB0cmVlIHZpZXcuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUxIRUxQIGlzIHNldCB0byBZRVMuCisKK1RPQ19FWFBBTkQgICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBHRU5FUkFURV9RSFAgdGFnIGlzIHNldCB0byBZRVMgYW5kIGJvdGggUUhQX05BTUVTUEFDRSBhbmQKKyMgUUhQX1ZJUlRVQUxfRk9MREVSIGFyZSBzZXQsIGFuIGFkZGl0aW9uYWwgaW5kZXggZmlsZSB3aWxsIGJlIGdlbmVyYXRlZCB0aGF0CisjIGNhbiBiZSB1c2VkIGFzIGlucHV0IGZvciBRdCdzIHFoZWxwZ2VuZXJhdG9yIHRvIGdlbmVyYXRlIGEgUXQgQ29tcHJlc3NlZCBIZWxwCisjICgucWNoKSBvZiB0aGUgZ2VuZXJhdGVkIEhUTUwgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitHRU5FUkFURV9RSFAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgUUhHX0xPQ0FUSU9OIHRhZyBpcyBzcGVjaWZpZWQsIHRoZSBRQ0hfRklMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeQorIyB0aGUgZmlsZSBuYW1lIG9mIHRoZSByZXN1bHRpbmcgLnFjaCBmaWxlLiBUaGUgcGF0aCBzcGVjaWZpZWQgaXMgcmVsYXRpdmUgdG8KKyMgdGhlIEhUTUwgb3V0cHV0IGZvbGRlci4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1FIUCBpcyBzZXQgdG8gWUVTLgorCitRQ0hfRklMRSAgICAgICAgICAgICAgID0gCisKKyMgVGhlIFFIUF9OQU1FU1BBQ0UgdGFnIHNwZWNpZmllcyB0aGUgbmFtZXNwYWNlIHRvIHVzZSB3aGVuIGdlbmVyYXRpbmcgUXQgSGVscAorIyBQcm9qZWN0IG91dHB1dC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZSBRdCBIZWxwIFByb2plY3QgLyBOYW1lc3BhY2UKKyMgKHNlZTogaHR0cDovL3F0LXByb2plY3Qub3JnL2RvYy9xdC00LjgvcXRoZWxwcHJvamVjdC5odG1sI25hbWVzcGFjZSkuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBvcmcuZG94eWdlbi5Qcm9qZWN0LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCisKK1FIUF9OQU1FU1BBQ0UgICAgICAgICAgPSBvcmcuZG94eWdlbi5Qcm9qZWN0CisKKyMgVGhlIFFIUF9WSVJUVUFMX0ZPTERFUiB0YWcgc3BlY2lmaWVzIHRoZSBuYW1lc3BhY2UgdG8gdXNlIHdoZW4gZ2VuZXJhdGluZyBRdAorIyBIZWxwIFByb2plY3Qgb3V0cHV0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlIFF0IEhlbHAgUHJvamVjdCAvIFZpcnR1YWwKKyMgRm9sZGVycyAoc2VlOiBodHRwOi8vcXQtcHJvamVjdC5vcmcvZG9jL3F0LTQuOC9xdGhlbHBwcm9qZWN0Lmh0bWwjdmlydHVhbC0KKyMgZm9sZGVycykuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBkb2MuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KKworUUhQX1ZJUlRVQUxfRk9MREVSICAgICA9IGRvYworCisjIElmIHRoZSBRSFBfQ1VTVF9GSUxURVJfTkFNRSB0YWcgaXMgc2V0LCBpdCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSBjdXN0b20KKyMgZmlsdGVyIHRvIGFkZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZSBRdCBIZWxwIFByb2plY3QgLyBDdXN0b20KKyMgRmlsdGVycyAoc2VlOiBodHRwOi8vcXQtcHJvamVjdC5vcmcvZG9jL3F0LTQuOC9xdGhlbHBwcm9qZWN0Lmh0bWwjY3VzdG9tLQorIyBmaWx0ZXJzKS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1FIUCBpcyBzZXQgdG8gWUVTLgorCitRSFBfQ1VTVF9GSUxURVJfTkFNRSAgID0gCisKKyMgVGhlIFFIUF9DVVNUX0ZJTFRFUl9BVFRSUyB0YWcgc3BlY2lmaWVzIHRoZSBsaXN0IG9mIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZQorIyBjdXN0b20gZmlsdGVyIHRvIGFkZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZSBRdCBIZWxwIFByb2plY3QgLyBDdXN0b20KKyMgRmlsdGVycyAoc2VlOiBodHRwOi8vcXQtcHJvamVjdC5vcmcvZG9jL3F0LTQuOC9xdGhlbHBwcm9qZWN0Lmh0bWwjY3VzdG9tLQorIyBmaWx0ZXJzKS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1FIUCBpcyBzZXQgdG8gWUVTLgorCitRSFBfQ1VTVF9GSUxURVJfQVRUUlMgID0gCisKKyMgVGhlIFFIUF9TRUNUX0ZJTFRFUl9BVFRSUyB0YWcgc3BlY2lmaWVzIHRoZSBsaXN0IG9mIHRoZSBhdHRyaWJ1dGVzIHRoaXMKKyMgcHJvamVjdCdzIGZpbHRlciBzZWN0aW9uIG1hdGNoZXMuIFF0IEhlbHAgUHJvamVjdCAvIEZpbHRlciBBdHRyaWJ1dGVzIChzZWU6CisjIGh0dHA6Ly9xdC1wcm9qZWN0Lm9yZy9kb2MvcXQtNC44L3F0aGVscHByb2plY3QuaHRtbCNmaWx0ZXItYXR0cmlidXRlcykuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KKworUUhQX1NFQ1RfRklMVEVSX0FUVFJTICA9IAorCisjIFRoZSBRSEdfTE9DQVRJT04gdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIG9mIFF0J3MKKyMgcWhlbHBnZW5lcmF0b3IuIElmIG5vbi1lbXB0eSBkb3h5Z2VuIHdpbGwgdHJ5IHRvIHJ1biBxaGVscGdlbmVyYXRvciBvbiB0aGUKKyMgZ2VuZXJhdGVkIC5xaHAgZmlsZS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1FIUCBpcyBzZXQgdG8gWUVTLgorCitRSEdfTE9DQVRJT04gICAgICAgICAgID0gCisKKyMgSWYgdGhlIEdFTkVSQVRFX0VDTElQU0VIRUxQIHRhZyBpcyBzZXQgdG8gWUVTLCBhZGRpdGlvbmFsIGluZGV4IGZpbGVzIHdpbGwgYmUKKyMgZ2VuZXJhdGVkLCB0b2dldGhlciB3aXRoIHRoZSBIVE1MIGZpbGVzLCB0aGV5IGZvcm0gYW4gRWNsaXBzZSBoZWxwIHBsdWdpbi4gVG8KKyMgaW5zdGFsbCB0aGlzIHBsdWdpbiBhbmQgbWFrZSBpdCBhdmFpbGFibGUgdW5kZXIgdGhlIGhlbHAgY29udGVudHMgbWVudSBpbgorIyBFY2xpcHNlLCB0aGUgY29udGVudHMgb2YgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBIVE1MIGFuZCBYTUwgZmlsZXMgbmVlZHMKKyMgdG8gYmUgY29waWVkIGludG8gdGhlIHBsdWdpbnMgZGlyZWN0b3J5IG9mIGVjbGlwc2UuIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkKKyMgd2l0aGluIHRoZSBwbHVnaW5zIGRpcmVjdG9yeSBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhlIEVDTElQU0VfRE9DX0lEIHZhbHVlLgorIyBBZnRlciBjb3B5aW5nIEVjbGlwc2UgbmVlZHMgdG8gYmUgcmVzdGFydGVkIGJlZm9yZSB0aGUgaGVscCBhcHBlYXJzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0dFTkVSQVRFX0VDTElQU0VIRUxQICAgPSBOTworCisjIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBFY2xpcHNlIGhlbHAgcGx1Z2luLiBXaGVuIGluc3RhbGxpbmcgdGhlIHBsdWdpbgorIyB0aGUgZGlyZWN0b3J5IG5hbWUgY29udGFpbmluZyB0aGUgSFRNTCBhbmQgWE1MIGZpbGVzIHNob3VsZCBhbHNvIGhhdmUgdGhpcworIyBuYW1lLiBFYWNoIGRvY3VtZW50YXRpb24gc2V0IHNob3VsZCBoYXZlIGl0cyBvd24gaWRlbnRpZmllci4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IG9yZy5kb3h5Z2VuLlByb2plY3QuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9FQ0xJUFNFSEVMUCBpcyBzZXQgdG8gWUVTLgorCitFQ0xJUFNFX0RPQ19JRCAgICAgICAgID0gb3JnLmRveHlnZW4uUHJvamVjdAorCisjIElmIHlvdSB3YW50IGZ1bGwgY29udHJvbCBvdmVyIHRoZSBsYXlvdXQgb2YgdGhlIGdlbmVyYXRlZCBIVE1MIHBhZ2VzIGl0IG1pZ2h0CisjIGJlIG5lY2Vzc2FyeSB0byBkaXNhYmxlIHRoZSBpbmRleCBhbmQgcmVwbGFjZSBpdCB3aXRoIHlvdXIgb3duLiBUaGUKKyMgRElTQUJMRV9JTkRFWCB0YWcgY2FuIGJlIHVzZWQgdG8gdHVybiBvbi9vZmYgdGhlIGNvbmRlbnNlZCBpbmRleCAodGFicykgYXQgdG9wCisjIG9mIGVhY2ggSFRNTCBwYWdlLiBBIHZhbHVlIG9mIE5PIGVuYWJsZXMgdGhlIGluZGV4IGFuZCB0aGUgdmFsdWUgWUVTIGRpc2FibGVzCisjIGl0LiBTaW5jZSB0aGUgdGFicyBpbiB0aGUgaW5kZXggY29udGFpbiB0aGUgc2FtZSBpbmZvcm1hdGlvbiBhcyB0aGUgbmF2aWdhdGlvbgorIyB0cmVlLCB5b3UgY2FuIHNldCB0aGlzIG9wdGlvbiB0byBZRVMgaWYgeW91IGFsc28gc2V0IEdFTkVSQVRFX1RSRUVWSUVXIHRvIFlFUy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitESVNBQkxFX0lOREVYICAgICAgICAgID0gTk8KKworIyBUaGUgR0VORVJBVEVfVFJFRVZJRVcgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGV0aGVyIGEgdHJlZS1saWtlIGluZGV4CisjIHN0cnVjdHVyZSBzaG91bGQgYmUgZ2VuZXJhdGVkIHRvIGRpc3BsYXkgaGllcmFyY2hpY2FsIGluZm9ybWF0aW9uLiBJZiB0aGUgdGFnCisjIHZhbHVlIGlzIHNldCB0byBZRVMsIGEgc2lkZSBwYW5lbCB3aWxsIGJlIGdlbmVyYXRlZCBjb250YWluaW5nIGEgdHJlZS1saWtlCisjIGluZGV4IHN0cnVjdHVyZSAoanVzdCBsaWtlIHRoZSBvbmUgdGhhdCBpcyBnZW5lcmF0ZWQgZm9yIEhUTUwgSGVscCkuIEZvciB0aGlzCisjIHRvIHdvcmsgYSBicm93c2VyIHRoYXQgc3VwcG9ydHMgSmF2YVNjcmlwdCwgREhUTUwsIENTUyBhbmQgZnJhbWVzIGlzIHJlcXVpcmVkCisjIChpLmUuIGFueSBtb2Rlcm4gYnJvd3NlcikuIFdpbmRvd3MgdXNlcnMgYXJlIHByb2JhYmx5IGJldHRlciBvZmYgdXNpbmcgdGhlCisjIEhUTUwgaGVscCBmZWF0dXJlLiBWaWEgY3VzdG9tIHN0eWxlc2hlZXRzIChzZWUgSFRNTF9FWFRSQV9TVFlMRVNIRUVUKSBvbmUgY2FuCisjIGZ1cnRoZXIgZmluZS10dW5lIHRoZSBsb29rIG9mIHRoZSBpbmRleC4gQXMgYW4gZXhhbXBsZSwgdGhlIGRlZmF1bHQgc3R5bGUKKyMgc2hlZXQgZ2VuZXJhdGVkIGJ5IGRveHlnZW4gaGFzIGFuIGV4YW1wbGUgdGhhdCBzaG93cyBob3cgdG8gcHV0IGFuIGltYWdlIGF0CisjIHRoZSByb290IG9mIHRoZSB0cmVlIGluc3RlYWQgb2YgdGhlIFBST0pFQ1RfTkFNRS4gU2luY2UgdGhlIHRyZWUgYmFzaWNhbGx5IGhhcworIyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBhcyB0aGUgdGFiIGluZGV4LCB5b3UgY291bGQgY29uc2lkZXIgc2V0dGluZworIyBESVNBQkxFX0lOREVYIHRvIFlFUyB3aGVuIGVuYWJsaW5nIHRoaXMgb3B0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0dFTkVSQVRFX1RSRUVWSUVXICAgICAgPSBOTworCisjIFRoZSBFTlVNX1ZBTFVFU19QRVJfTElORSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBudW1iZXIgb2YgZW51bSB2YWx1ZXMgdGhhdAorIyBkb3h5Z2VuIHdpbGwgZ3JvdXAgb24gb25lIGxpbmUgaW4gdGhlIGdlbmVyYXRlZCBIVE1MIGRvY3VtZW50YXRpb24uCisjCisjIE5vdGUgdGhhdCBhIHZhbHVlIG9mIDAgd2lsbCBjb21wbGV0ZWx5IHN1cHByZXNzIHRoZSBlbnVtIHZhbHVlcyBmcm9tIGFwcGVhcmluZworIyBpbiB0aGUgb3ZlcnZpZXcgc2VjdGlvbi4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMjAsIGRlZmF1bHQgdmFsdWU6IDQuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0VOVU1fVkFMVUVTX1BFUl9MSU5FICAgPSA0CisKKyMgSWYgdGhlIHRyZWV2aWV3IGlzIGVuYWJsZWQgKHNlZSBHRU5FUkFURV9UUkVFVklFVykgdGhlbiB0aGlzIHRhZyBjYW4gYmUgdXNlZAorIyB0byBzZXQgdGhlIGluaXRpYWwgd2lkdGggKGluIHBpeGVscykgb2YgdGhlIGZyYW1lIGluIHdoaWNoIHRoZSB0cmVlIGlzIHNob3duLgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAxNTAwLCBkZWZhdWx0IHZhbHVlOiAyNTAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK1RSRUVWSUVXX1dJRFRIICAgICAgICAgPSAyNTAKKworIyBXaGVuIHRoZSBFWFRfTElOS1NfSU5fV0lORE9XIG9wdGlvbiBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBvcGVuIGxpbmtzIHRvCisjIGV4dGVybmFsIHN5bWJvbHMgaW1wb3J0ZWQgdmlhIHRhZyBmaWxlcyBpbiBhIHNlcGFyYXRlIHdpbmRvdy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitFWFRfTElOS1NfSU5fV0lORE9XICAgID0gTk8KKworIyBVc2UgdGhpcyB0YWcgdG8gY2hhbmdlIHRoZSBmb250IHNpemUgb2YgTGFUZVggZm9ybXVsYXMgaW5jbHVkZWQgYXMgaW1hZ2VzIGluCisjIHRoZSBIVE1MIGRvY3VtZW50YXRpb24uIFdoZW4geW91IGNoYW5nZSB0aGUgZm9udCBzaXplIGFmdGVyIGEgc3VjY2Vzc2Z1bAorIyBkb3h5Z2VuIHJ1biB5b3UgbmVlZCB0byBtYW51YWxseSByZW1vdmUgYW55IGZvcm1fKi5wbmcgaW1hZ2VzIGZyb20gdGhlIEhUTUwKKyMgb3V0cHV0IGRpcmVjdG9yeSB0byBmb3JjZSB0aGVtIHRvIGJlIHJlZ2VuZXJhdGVkLgorIyBNaW5pbXVtIHZhbHVlOiA4LCBtYXhpbXVtIHZhbHVlOiA1MCwgZGVmYXVsdCB2YWx1ZTogMTAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0ZPUk1VTEFfRk9OVFNJWkUgICAgICAgPSAxMAorCisjIFVzZSB0aGUgRk9STVVMQV9UUkFOUEFSRU5UIHRhZyB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgdGhlIGltYWdlcworIyBnZW5lcmF0ZWQgZm9yIGZvcm11bGFzIGFyZSB0cmFuc3BhcmVudCBQTkdzLiBUcmFuc3BhcmVudCBQTkdzIGFyZSBub3QKKyMgc3VwcG9ydGVkIHByb3Blcmx5IGZvciBJRSA2LjAsIGJ1dCBhcmUgc3VwcG9ydGVkIG9uIGFsbCBtb2Rlcm4gYnJvd3NlcnMuCisjCisjIE5vdGUgdGhhdCB3aGVuIGNoYW5naW5nIHRoaXMgb3B0aW9uIHlvdSBuZWVkIHRvIGRlbGV0ZSBhbnkgZm9ybV8qLnBuZyBmaWxlcyBpbgorIyB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5IGJlZm9yZSB0aGUgY2hhbmdlcyBoYXZlIGVmZmVjdC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworRk9STVVMQV9UUkFOU1BBUkVOVCAgICA9IFlFUworCisjIEVuYWJsZSB0aGUgVVNFX01BVEhKQVggb3B0aW9uIHRvIHJlbmRlciBMYVRlWCBmb3JtdWxhcyB1c2luZyBNYXRoSmF4IChzZWUKKyMgaHR0cDovL3d3dy5tYXRoamF4Lm9yZykgd2hpY2ggdXNlcyBjbGllbnQgc2lkZSBKYXZhc2NyaXB0IGZvciB0aGUgcmVuZGVyaW5nCisjIGluc3RlYWQgb2YgdXNpbmcgcHJlcmVuZGVyZWQgYml0bWFwcy4gVXNlIHRoaXMgaWYgeW91IGRvIG5vdCBoYXZlIExhVGVYCisjIGluc3RhbGxlZCBvciBpZiB5b3Ugd2FudCB0byBmb3JtdWxhcyBsb29rIHByZXR0aWVyIGluIHRoZSBIVE1MIG91dHB1dC4gV2hlbgorIyBlbmFibGVkIHlvdSBtYXkgYWxzbyBuZWVkIHRvIGluc3RhbGwgTWF0aEpheCBzZXBhcmF0ZWx5IGFuZCBjb25maWd1cmUgdGhlIHBhdGgKKyMgdG8gaXQgdXNpbmcgdGhlIE1BVEhKQVhfUkVMUEFUSCBvcHRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworVVNFX01BVEhKQVggICAgICAgICAgICA9IE5PCisKKyMgV2hlbiBNYXRoSmF4IGlzIGVuYWJsZWQgeW91IGNhbiBzZXQgdGhlIGRlZmF1bHQgb3V0cHV0IGZvcm1hdCB0byBiZSB1c2VkIGZvcgorIyB0aGUgTWF0aEpheCBvdXRwdXQuIFNlZSB0aGUgTWF0aEpheCBzaXRlIChzZWU6CisjIGh0dHA6Ly9kb2NzLm1hdGhqYXgub3JnL2VuL2xhdGVzdC9vdXRwdXQuaHRtbCkgZm9yIG1vcmUgZGV0YWlscy4KKyMgUG9zc2libGUgdmFsdWVzIGFyZTogSFRNTC1DU1MgKHdoaWNoIGlzIHNsb3dlciwgYnV0IGhhcyB0aGUgYmVzdAorIyBjb21wYXRpYmlsaXR5KSwgTmF0aXZlTU1MIChpLmUuIE1hdGhNTCkgYW5kIFNWRy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IEhUTUwtQ1NTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgVVNFX01BVEhKQVggaXMgc2V0IHRvIFlFUy4KKworTUFUSEpBWF9GT1JNQVQgICAgICAgICA9IEhUTUwtQ1NTCisKKyMgV2hlbiBNYXRoSmF4IGlzIGVuYWJsZWQgeW91IG5lZWQgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gcmVsYXRpdmUgdG8gdGhlIEhUTUwKKyMgb3V0cHV0IGRpcmVjdG9yeSB1c2luZyB0aGUgTUFUSEpBWF9SRUxQQVRIIG9wdGlvbi4gVGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeQorIyBzaG91bGQgY29udGFpbiB0aGUgTWF0aEpheC5qcyBzY3JpcHQuIEZvciBpbnN0YW5jZSwgaWYgdGhlIG1hdGhqYXggZGlyZWN0b3J5CisjIGlzIGxvY2F0ZWQgYXQgdGhlIHNhbWUgbGV2ZWwgYXMgdGhlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeSwgdGhlbgorIyBNQVRISkFYX1JFTFBBVEggc2hvdWxkIGJlIC4uL21hdGhqYXguIFRoZSBkZWZhdWx0IHZhbHVlIHBvaW50cyB0byB0aGUgTWF0aEpheAorIyBDb250ZW50IERlbGl2ZXJ5IE5ldHdvcmsgc28geW91IGNhbiBxdWlja2x5IHNlZSB0aGUgcmVzdWx0IHdpdGhvdXQgaW5zdGFsbGluZworIyBNYXRoSmF4LiBIb3dldmVyLCBpdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0byBpbnN0YWxsIGEgbG9jYWwgY29weSBvZgorIyBNYXRoSmF4IGZyb20gaHR0cDovL3d3dy5tYXRoamF4Lm9yZyBiZWZvcmUgZGVwbG95bWVudC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IGh0dHA6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBVU0VfTUFUSEpBWCBpcyBzZXQgdG8gWUVTLgorCitNQVRISkFYX1JFTFBBVEggICAgICAgID0gaHR0cDovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdAorCisjIFRoZSBNQVRISkFYX0VYVEVOU0lPTlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgTWF0aEpheAorIyBleHRlbnNpb24gbmFtZXMgdGhhdCBzaG91bGQgYmUgZW5hYmxlZCBkdXJpbmcgTWF0aEpheCByZW5kZXJpbmcuIEZvciBleGFtcGxlCisjIE1BVEhKQVhfRVhURU5TSU9OUyA9IFRlWC9BTVNtYXRoIFRlWC9BTVNzeW1ib2xzCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBVU0VfTUFUSEpBWCBpcyBzZXQgdG8gWUVTLgorCitNQVRISkFYX0VYVEVOU0lPTlMgICAgID0gCisKKyMgVGhlIE1BVEhKQVhfQ09ERUZJTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBmaWxlIHdpdGggamF2YXNjcmlwdCBwaWVjZXMKKyMgb2YgY29kZSB0aGF0IHdpbGwgYmUgdXNlZCBvbiBzdGFydHVwIG9mIHRoZSBNYXRoSmF4IGNvZGUuIFNlZSB0aGUgTWF0aEpheCBzaXRlCisjIChzZWU6IGh0dHA6Ly9kb2NzLm1hdGhqYXgub3JnL2VuL2xhdGVzdC9vdXRwdXQuaHRtbCkgZm9yIG1vcmUgZGV0YWlscy4gRm9yIGFuCisjIGV4YW1wbGUgc2VlIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgVVNFX01BVEhKQVggaXMgc2V0IHRvIFlFUy4KKworTUFUSEpBWF9DT0RFRklMRSAgICAgICA9IAorCisjIFdoZW4gdGhlIFNFQVJDSEVOR0lORSB0YWcgaXMgZW5hYmxlZCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBzZWFyY2ggYm94IGZvcgorIyB0aGUgSFRNTCBvdXRwdXQuIFRoZSB1bmRlcmx5aW5nIHNlYXJjaCBlbmdpbmUgdXNlcyBqYXZhc2NyaXB0IGFuZCBESFRNTCBhbmQKKyMgc2hvdWxkIHdvcmsgb24gYW55IG1vZGVybiBicm93c2VyLiBOb3RlIHRoYXQgd2hlbiB1c2luZyBIVE1MIGhlbHAKKyMgKEdFTkVSQVRFX0hUTUxIRUxQKSwgUXQgaGVscCAoR0VORVJBVEVfUUhQKSwgb3IgZG9jc2V0cyAoR0VORVJBVEVfRE9DU0VUKQorIyB0aGVyZSBpcyBhbHJlYWR5IGEgc2VhcmNoIGZ1bmN0aW9uIHNvIHRoaXMgb25lIHNob3VsZCB0eXBpY2FsbHkgYmUgZGlzYWJsZWQuCisjIEZvciBsYXJnZSBwcm9qZWN0cyB0aGUgamF2YXNjcmlwdCBiYXNlZCBzZWFyY2ggZW5naW5lIGNhbiBiZSBzbG93LCB0aGVuCisjIGVuYWJsaW5nIFNFUlZFUl9CQVNFRF9TRUFSQ0ggbWF5IHByb3ZpZGUgYSBiZXR0ZXIgc29sdXRpb24uIEl0IGlzIHBvc3NpYmxlIHRvCisjIHNlYXJjaCB1c2luZyB0aGUga2V5Ym9hcmQ7IHRvIGp1bXAgdG8gdGhlIHNlYXJjaCBib3ggdXNlIDxhY2Nlc3Mga2V5PiArIFMKKyMgKHdoYXQgdGhlIDxhY2Nlc3Mga2V5PiBpcyBkZXBlbmRzIG9uIHRoZSBPUyBhbmQgYnJvd3NlciwgYnV0IGl0IGlzIHR5cGljYWxseQorIyA8Q1RSTD4sIDxBTFQ+LzxvcHRpb24+LCBvciBib3RoKS4gSW5zaWRlIHRoZSBzZWFyY2ggYm94IHVzZSB0aGUgPGN1cnNvciBkb3duCisjIGtleT4gdG8ganVtcCBpbnRvIHRoZSBzZWFyY2ggcmVzdWx0cyB3aW5kb3csIHRoZSByZXN1bHRzIGNhbiBiZSBuYXZpZ2F0ZWQKKyMgdXNpbmcgdGhlIDxjdXJzb3Iga2V5cz4uIFByZXNzIDxFbnRlcj4gdG8gc2VsZWN0IGFuIGl0ZW0gb3IgPGVzY2FwZT4gdG8gY2FuY2VsCisjIHRoZSBzZWFyY2guIFRoZSBmaWx0ZXIgb3B0aW9ucyBjYW4gYmUgc2VsZWN0ZWQgd2hlbiB0aGUgY3Vyc29yIGlzIGluc2lkZSB0aGUKKyMgc2VhcmNoIGJveCBieSBwcmVzc2luZyA8U2hpZnQ+KzxjdXJzb3IgZG93bj4uIEFsc28gaGVyZSB1c2UgdGhlIDxjdXJzb3Iga2V5cz4KKyMgdG8gc2VsZWN0IGEgZmlsdGVyIGFuZCA8RW50ZXI+IG9yIDxlc2NhcGU+IHRvIGFjdGl2YXRlIG9yIGNhbmNlbCB0aGUgZmlsdGVyCisjIG9wdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworU0VBUkNIRU5HSU5FICAgICAgICAgICA9IFlFUworCisjIFdoZW4gdGhlIFNFUlZFUl9CQVNFRF9TRUFSQ0ggdGFnIGlzIGVuYWJsZWQgdGhlIHNlYXJjaCBlbmdpbmUgd2lsbCBiZQorIyBpbXBsZW1lbnRlZCB1c2luZyBhIHdlYiBzZXJ2ZXIgaW5zdGVhZCBvZiBhIHdlYiBjbGllbnQgdXNpbmcgSmF2YXNjcmlwdC4gVGhlcmUKKyMgYXJlIHR3byBmbGF2b3VycyBvZiB3ZWIgc2VydmVyIGJhc2VkIHNlYXJjaGluZyBkZXBlbmRpbmcgb24gdGhlCisjIEVYVEVSTkFMX1NFQVJDSCBzZXR0aW5nLiBXaGVuIGRpc2FibGVkLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBQSFAgc2NyaXB0IGZvcgorIyBzZWFyY2hpbmcgYW5kIGFuIGluZGV4IGZpbGUgdXNlZCBieSB0aGUgc2NyaXB0LiBXaGVuIEVYVEVSTkFMX1NFQVJDSCBpcworIyBlbmFibGVkIHRoZSBpbmRleGluZyBhbmQgc2VhcmNoaW5nIG5lZWRzIHRvIGJlIHByb3ZpZGVkIGJ5IGV4dGVybmFsIHRvb2xzLiBTZWUKKyMgdGhlIHNlY3Rpb24gIkV4dGVybmFsIEluZGV4aW5nIGFuZCBTZWFyY2hpbmciIGZvciBkZXRhaWxzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTRUFSQ0hFTkdJTkUgaXMgc2V0IHRvIFlFUy4KKworU0VSVkVSX0JBU0VEX1NFQVJDSCAgICA9IE5PCisKKyMgV2hlbiBFWFRFUk5BTF9TRUFSQ0ggdGFnIGlzIGVuYWJsZWQgZG94eWdlbiB3aWxsIG5vIGxvbmdlciBnZW5lcmF0ZSB0aGUgUEhQCisjIHNjcmlwdCBmb3Igc2VhcmNoaW5nLiBJbnN0ZWFkIHRoZSBzZWFyY2ggcmVzdWx0cyBhcmUgd3JpdHRlbiB0byBhbiBYTUwgZmlsZQorIyB3aGljaCBuZWVkcyB0byBiZSBwcm9jZXNzZWQgYnkgYW4gZXh0ZXJuYWwgaW5kZXhlci4gRG94eWdlbiB3aWxsIGludm9rZSBhbgorIyBleHRlcm5hbCBzZWFyY2ggZW5naW5lIHBvaW50ZWQgdG8gYnkgdGhlIFNFQVJDSEVOR0lORV9VUkwgb3B0aW9uIHRvIG9idGFpbiB0aGUKKyMgc2VhcmNoIHJlc3VsdHMuCisjCisjIERveHlnZW4gc2hpcHMgd2l0aCBhbiBleGFtcGxlIGluZGV4ZXIgKCBkb3h5aW5kZXhlcikgYW5kIHNlYXJjaCBlbmdpbmUKKyMgKGRveHlzZWFyY2guY2dpKSB3aGljaCBhcmUgYmFzZWQgb24gdGhlIG9wZW4gc291cmNlIHNlYXJjaCBlbmdpbmUgbGlicmFyeQorIyBYYXBpYW4gKHNlZTogaHR0cDovL3hhcGlhbi5vcmcvKS4KKyMKKyMgU2VlIHRoZSBzZWN0aW9uICJFeHRlcm5hbCBJbmRleGluZyBhbmQgU2VhcmNoaW5nIiBmb3IgZGV0YWlscy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU0VBUkNIRU5HSU5FIGlzIHNldCB0byBZRVMuCisKK0VYVEVSTkFMX1NFQVJDSCAgICAgICAgPSBOTworCisjIFRoZSBTRUFSQ0hFTkdJTkVfVVJMIHNob3VsZCBwb2ludCB0byBhIHNlYXJjaCBlbmdpbmUgaG9zdGVkIGJ5IGEgd2ViIHNlcnZlcgorIyB3aGljaCB3aWxsIHJldHVybiB0aGUgc2VhcmNoIHJlc3VsdHMgd2hlbiBFWFRFUk5BTF9TRUFSQ0ggaXMgZW5hYmxlZC4KKyMKKyMgRG94eWdlbiBzaGlwcyB3aXRoIGFuIGV4YW1wbGUgaW5kZXhlciAoIGRveHlpbmRleGVyKSBhbmQgc2VhcmNoIGVuZ2luZQorIyAoZG94eXNlYXJjaC5jZ2kpIHdoaWNoIGFyZSBiYXNlZCBvbiB0aGUgb3BlbiBzb3VyY2Ugc2VhcmNoIGVuZ2luZSBsaWJyYXJ5CisjIFhhcGlhbiAoc2VlOiBodHRwOi8veGFwaWFuLm9yZy8pLiBTZWUgdGhlIHNlY3Rpb24gIkV4dGVybmFsIEluZGV4aW5nIGFuZAorIyBTZWFyY2hpbmciIGZvciBkZXRhaWxzLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU0VBUkNIRU5HSU5FIGlzIHNldCB0byBZRVMuCisKK1NFQVJDSEVOR0lORV9VUkwgICAgICAgPSAKKworIyBXaGVuIFNFUlZFUl9CQVNFRF9TRUFSQ0ggYW5kIEVYVEVSTkFMX1NFQVJDSCBhcmUgYm90aCBlbmFibGVkIHRoZSB1bmluZGV4ZWQKKyMgc2VhcmNoIGRhdGEgaXMgd3JpdHRlbiB0byBhIGZpbGUgZm9yIGluZGV4aW5nIGJ5IGFuIGV4dGVybmFsIHRvb2wuIFdpdGggdGhlCisjIFNFQVJDSERBVEFfRklMRSB0YWcgdGhlIG5hbWUgb2YgdGhpcyBmaWxlIGNhbiBiZSBzcGVjaWZpZWQuCisjIFRoZSBkZWZhdWx0IGZpbGUgaXM6IHNlYXJjaGRhdGEueG1sLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU0VBUkNIRU5HSU5FIGlzIHNldCB0byBZRVMuCisKK1NFQVJDSERBVEFfRklMRSAgICAgICAgPSBzZWFyY2hkYXRhLnhtbAorCisjIFdoZW4gU0VSVkVSX0JBU0VEX1NFQVJDSCBhbmQgRVhURVJOQUxfU0VBUkNIIGFyZSBib3RoIGVuYWJsZWQgdGhlCisjIEVYVEVSTkFMX1NFQVJDSF9JRCB0YWcgY2FuIGJlIHVzZWQgYXMgYW4gaWRlbnRpZmllciBmb3IgdGhlIHByb2plY3QuIFRoaXMgaXMKKyMgdXNlZnVsIGluIGNvbWJpbmF0aW9uIHdpdGggRVhUUkFfU0VBUkNIX01BUFBJTkdTIHRvIHNlYXJjaCB0aHJvdWdoIG11bHRpcGxlCisjIHByb2plY3RzIGFuZCByZWRpcmVjdCB0aGUgcmVzdWx0cyBiYWNrIHRvIHRoZSByaWdodCBwcm9qZWN0LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU0VBUkNIRU5HSU5FIGlzIHNldCB0byBZRVMuCisKK0VYVEVSTkFMX1NFQVJDSF9JRCAgICAgPSAKKworIyBUaGUgRVhUUkFfU0VBUkNIX01BUFBJTkdTIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgc2VhcmNoaW5nIHRocm91Z2ggZG94eWdlbgorIyBwcm9qZWN0cyBvdGhlciB0aGFuIHRoZSBvbmUgZGVmaW5lZCBieSB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZSwgYnV0IHRoYXQgYXJlCisjIGFsbCBhZGRlZCB0byB0aGUgc2FtZSBleHRlcm5hbCBzZWFyY2ggaW5kZXguIEVhY2ggcHJvamVjdCBuZWVkcyB0byBoYXZlIGEKKyMgdW5pcXVlIGlkIHNldCB2aWEgRVhURVJOQUxfU0VBUkNIX0lELiBUaGUgc2VhcmNoIG1hcHBpbmcgdGhlbiBtYXBzIHRoZSBpZCBvZgorIyB0byBhIHJlbGF0aXZlIGxvY2F0aW9uIHdoZXJlIHRoZSBkb2N1bWVudGF0aW9uIGNhbiBiZSBmb3VuZC4gVGhlIGZvcm1hdCBpczoKKyMgRVhUUkFfU0VBUkNIX01BUFBJTkdTID0gdGFnbmFtZTE9bG9jMSB0YWduYW1lMj1sb2MyIC4uLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU0VBUkNIRU5HSU5FIGlzIHNldCB0byBZRVMuCisKK0VYVFJBX1NFQVJDSF9NQVBQSU5HUyAgPSAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgTGFUZVggb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBMYVRlWCBvdXRwdXQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0dFTkVSQVRFX0xBVEVYICAgICAgICAgPSBZRVMKKworIyBUaGUgTEFURVhfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIExhVGVYIGRvY3Mgd2lsbCBiZSBwdXQuIElmIGEKKyMgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgcHV0IGluIGZyb250IG9mCisjIGl0LgorIyBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaXM6IGxhdGV4LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfT1VUUFVUICAgICAgICAgICA9IGxhdGV4CisKKyMgVGhlIExBVEVYX0NNRF9OQU1FIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBMYVRlWCBjb21tYW5kIG5hbWUgdG8gYmUKKyMgaW52b2tlZC4KKyMKKyMgTm90ZSB0aGF0IHdoZW4gZW5hYmxpbmcgVVNFX1BERkxBVEVYIHRoaXMgb3B0aW9uIGlzIG9ubHkgdXNlZCBmb3IgZ2VuZXJhdGluZworIyBiaXRtYXBzIGZvciBmb3JtdWxhcyBpbiB0aGUgSFRNTCBvdXRwdXQsIGJ1dCBub3QgaW4gdGhlIE1ha2VmaWxlIHRoYXQgaXMKKyMgd3JpdHRlbiB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeS4KKyMgVGhlIGRlZmF1bHQgZmlsZSBpczogbGF0ZXguCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9DTURfTkFNRSAgICAgICAgID0gbGF0ZXgKKworIyBUaGUgTUFLRUlOREVYX0NNRF9OQU1FIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBjb21tYW5kIG5hbWUgdG8gZ2VuZXJhdGUKKyMgaW5kZXggZm9yIExhVGVYLgorIyBUaGUgZGVmYXVsdCBmaWxlIGlzOiBtYWtlaW5kZXguCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitNQUtFSU5ERVhfQ01EX05BTUUgICAgID0gbWFrZWluZGV4CisKKyMgSWYgdGhlIENPTVBBQ1RfTEFURVggdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiBnZW5lcmF0ZXMgbW9yZSBjb21wYWN0IExhVGVYCisjIGRvY3VtZW50cy4gVGhpcyBtYXkgYmUgdXNlZnVsIGZvciBzbWFsbCBwcm9qZWN0cyBhbmQgbWF5IGhlbHAgdG8gc2F2ZSBzb21lCisjIHRyZWVzIGluIGdlbmVyYWwuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0NPTVBBQ1RfTEFURVggICAgICAgICAgPSBOTworCisjIFRoZSBQQVBFUl9UWVBFIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIHBhcGVyIHR5cGUgdGhhdCBpcyB1c2VkIGJ5IHRoZQorIyBwcmludGVyLgorIyBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBhNCAoMjEwIHggMjk3IG1tKSwgbGV0dGVyICg4LjUgeCAxMSBpbmNoZXMpLCBsZWdhbCAoOC41IHgKKyMgMTQgaW5jaGVzKSBhbmQgZXhlY3V0aXZlICg3LjI1IHggMTAuNSBpbmNoZXMpLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogYTQuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitQQVBFUl9UWVBFICAgICAgICAgICAgID0gYTQKKworIyBUaGUgRVhUUkFfUEFDS0FHRVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgTGFUZVggcGFja2FnZSBuYW1lcworIyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgTGFUZVggb3V0cHV0LiBUbyBnZXQgdGhlIHRpbWVzIGZvbnQgZm9yCisjIGluc3RhbmNlIHlvdSBjYW4gc3BlY2lmeQorIyBFWFRSQV9QQUNLQUdFUz10aW1lcworIyBJZiBsZWZ0IGJsYW5rIG5vIGV4dHJhIHBhY2thZ2VzIHdpbGwgYmUgaW5jbHVkZWQuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitFWFRSQV9QQUNLQUdFUyAgICAgICAgID0gCisKKyMgVGhlIExBVEVYX0hFQURFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHBlcnNvbmFsIExhVGVYIGhlYWRlciBmb3IgdGhlCisjIGdlbmVyYXRlZCBMYVRlWCBkb2N1bWVudC4gVGhlIGhlYWRlciBzaG91bGQgY29udGFpbiBldmVyeXRoaW5nIHVudGlsIHRoZSBmaXJzdAorIyBjaGFwdGVyLiBJZiBpdCBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIHN0YW5kYXJkIGhlYWRlci4gU2VlCisjIHNlY3Rpb24gIkRveHlnZW4gdXNhZ2UiIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gbGV0IGRveHlnZW4gd3JpdGUgdGhlCisjIGRlZmF1bHQgaGVhZGVyIHRvIGEgc2VwYXJhdGUgZmlsZS4KKyMKKyMgTm90ZTogT25seSB1c2UgYSB1c2VyLWRlZmluZWQgaGVhZGVyIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyEgVGhlCisjIGZvbGxvd2luZyBjb21tYW5kcyBoYXZlIGEgc3BlY2lhbCBtZWFuaW5nIGluc2lkZSB0aGUgaGVhZGVyOiAkdGl0bGUsCisjICRkYXRldGltZSwgJGRhdGUsICRkb3h5Z2VudmVyc2lvbiwgJHByb2plY3RuYW1lLCAkcHJvamVjdG51bWJlci4gRG94eWdlbiB3aWxsCisjIHJlcGxhY2UgdGhlbSBieSByZXNwZWN0aXZlbHkgdGhlIHRpdGxlIG9mIHRoZSBwYWdlLCB0aGUgY3VycmVudCBkYXRlIGFuZCB0aW1lLAorIyBvbmx5IHRoZSBjdXJyZW50IGRhdGUsIHRoZSB2ZXJzaW9uIG51bWJlciBvZiBkb3h5Z2VuLCB0aGUgcHJvamVjdCBuYW1lIChzZWUKKyMgUFJPSkVDVF9OQU1FKSwgb3IgdGhlIHByb2plY3QgbnVtYmVyIChzZWUgUFJPSkVDVF9OVU1CRVIpLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfSEVBREVSICAgICAgICAgICA9IGRvYy9kb3h5Z2VuL2hlYWRlci50ZXgKKworIyBUaGUgTEFURVhfRk9PVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcGVyc29uYWwgTGFUZVggZm9vdGVyIGZvciB0aGUKKyMgZ2VuZXJhdGVkIExhVGVYIGRvY3VtZW50LiBUaGUgZm9vdGVyIHNob3VsZCBjb250YWluIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGxhc3QKKyMgY2hhcHRlci4gSWYgaXQgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBzdGFuZGFyZCBmb290ZXIuCisjCisjIE5vdGU6IE9ubHkgdXNlIGEgdXNlci1kZWZpbmVkIGZvb3RlciBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmchCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9GT09URVIgICAgICAgICAgID0gCisKKyMgVGhlIExBVEVYX0VYVFJBX0ZJTEVTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGV4dHJhIGltYWdlcyBvcgorIyBvdGhlciBzb3VyY2UgZmlsZXMgd2hpY2ggc2hvdWxkIGJlIGNvcGllZCB0byB0aGUgTEFURVhfT1VUUFVUIG91dHB1dAorIyBkaXJlY3RvcnkuIE5vdGUgdGhhdCB0aGUgZmlsZXMgd2lsbCBiZSBjb3BpZWQgYXMtaXM7IHRoZXJlIGFyZSBubyBjb21tYW5kcyBvcgorIyBtYXJrZXJzIGF2YWlsYWJsZS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX0VYVFJBX0ZJTEVTICAgICAgPSAKKworIyBJZiB0aGUgUERGX0hZUEVSTElOS1MgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBMYVRlWCB0aGF0IGlzIGdlbmVyYXRlZCBpcworIyBwcmVwYXJlZCBmb3IgY29udmVyc2lvbiB0byBQREYgKHVzaW5nIHBzMnBkZiBvciBwZGZsYXRleCkuIFRoZSBQREYgZmlsZSB3aWxsCisjIGNvbnRhaW4gbGlua3MgKGp1c3QgbGlrZSB0aGUgSFRNTCBvdXRwdXQpIGluc3RlYWQgb2YgcGFnZSByZWZlcmVuY2VzLiBUaGlzCisjIG1ha2VzIHRoZSBvdXRwdXQgc3VpdGFibGUgZm9yIG9ubGluZSBicm93c2luZyB1c2luZyBhIFBERiB2aWV3ZXIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitQREZfSFlQRVJMSU5LUyAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIExBVEVYX1BERkxBVEVYIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgdXNlIHBkZmxhdGV4IHRvIGdlbmVyYXRlCisjIHRoZSBQREYgZmlsZSBkaXJlY3RseSBmcm9tIHRoZSBMYVRlWCBmaWxlcy4gU2V0IHRoaXMgb3B0aW9uIHRvIFlFUyB0byBnZXQgYQorIyBoaWdoZXIgcXVhbGl0eSBQREYgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK1VTRV9QREZMQVRFWCAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgTEFURVhfQkFUQ0hNT0RFIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgYWRkIHRoZSBcYmF0Y2htb2RlCisjIGNvbW1hbmQgdG8gdGhlIGdlbmVyYXRlZCBMYVRlWCBmaWxlcy4gVGhpcyB3aWxsIGluc3RydWN0IExhVGVYIHRvIGtlZXAgcnVubmluZworIyBpZiBlcnJvcnMgb2NjdXIsIGluc3RlYWQgb2YgYXNraW5nIHRoZSB1c2VyIGZvciBoZWxwLiBUaGlzIG9wdGlvbiBpcyBhbHNvIHVzZWQKKyMgd2hlbiBnZW5lcmF0aW5nIGZvcm11bGFzIGluIEhUTUwuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX0JBVENITU9ERSAgICAgICAgPSBOTworCisjIElmIHRoZSBMQVRFWF9ISURFX0lORElDRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgbm90IGluY2x1ZGUgdGhlCisjIGluZGV4IGNoYXB0ZXJzIChzdWNoIGFzIEZpbGUgSW5kZXgsIENvbXBvdW5kIEluZGV4LCBldGMuKSBpbiB0aGUgb3V0cHV0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9ISURFX0lORElDRVMgICAgID0gTk8KKworIyBJZiB0aGUgTEFURVhfU09VUkNFX0NPREUgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgaW5jbHVkZSBzb3VyY2UKKyMgY29kZSB3aXRoIHN5bnRheCBoaWdobGlnaHRpbmcgaW4gdGhlIExhVGVYIG91dHB1dC4KKyMKKyMgTm90ZSB0aGF0IHdoaWNoIHNvdXJjZXMgYXJlIHNob3duIGFsc28gZGVwZW5kcyBvbiBvdGhlciBzZXR0aW5ncyBzdWNoIGFzCisjIFNPVVJDRV9CUk9XU0VSLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9TT1VSQ0VfQ09ERSAgICAgID0gTk8KKworIyBUaGUgTEFURVhfQklCX1NUWUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBzdHlsZSB0byB1c2UgZm9yIHRoZQorIyBiaWJsaW9ncmFwaHksIGUuZy4gcGxhaW5uYXQsIG9yIGllZWV0ci4gU2VlCisjIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmliVGVYIGFuZCBcY2l0ZSBmb3IgbW9yZSBpbmZvLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogcGxhaW4uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9CSUJfU1RZTEUgICAgICAgID0gcGxhaW4KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgUlRGIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9SVEYgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIFJURiBvdXRwdXQuIFRoZQorIyBSVEYgb3V0cHV0IGlzIG9wdGltaXplZCBmb3IgV29yZCA5NyBhbmQgbWF5IG5vdCBsb29rIHRvbyBwcmV0dHkgd2l0aCBvdGhlciBSVEYKKyMgcmVhZGVycy9lZGl0b3JzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0dFTkVSQVRFX1JURiAgICAgICAgICAgPSBOTworCisjIFRoZSBSVEZfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIFJURiBkb2NzIHdpbGwgYmUgcHV0LiBJZiBhCisjIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlIHB1dCBpbiBmcm9udCBvZgorIyBpdC4KKyMgVGhlIGRlZmF1bHQgZGlyZWN0b3J5IGlzOiBydGYuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9SVEYgaXMgc2V0IHRvIFlFUy4KKworUlRGX09VVFBVVCAgICAgICAgICAgICA9IHJ0ZgorCisjIElmIHRoZSBDT01QQUNUX1JURiB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIGdlbmVyYXRlcyBtb3JlIGNvbXBhY3QgUlRGCisjIGRvY3VtZW50cy4gVGhpcyBtYXkgYmUgdXNlZnVsIGZvciBzbWFsbCBwcm9qZWN0cyBhbmQgbWF5IGhlbHAgdG8gc2F2ZSBzb21lCisjIHRyZWVzIGluIGdlbmVyYWwuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1JURiBpcyBzZXQgdG8gWUVTLgorCitDT01QQUNUX1JURiAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgUlRGX0hZUEVSTElOS1MgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBSVEYgdGhhdCBpcyBnZW5lcmF0ZWQgd2lsbAorIyBjb250YWluIGh5cGVybGluayBmaWVsZHMuIFRoZSBSVEYgZmlsZSB3aWxsIGNvbnRhaW4gbGlua3MgKGp1c3QgbGlrZSB0aGUgSFRNTAorIyBvdXRwdXQpIGluc3RlYWQgb2YgcGFnZSByZWZlcmVuY2VzLiBUaGlzIG1ha2VzIHRoZSBvdXRwdXQgc3VpdGFibGUgZm9yIG9ubGluZQorIyBicm93c2luZyB1c2luZyBXb3JkIG9yIHNvbWUgb3RoZXIgV29yZCBjb21wYXRpYmxlIHJlYWRlcnMgdGhhdCBzdXBwb3J0IHRob3NlCisjIGZpZWxkcy4KKyMKKyMgTm90ZTogV29yZFBhZCAod3JpdGUpIGFuZCBvdGhlcnMgZG8gbm90IHN1cHBvcnQgbGlua3MuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1JURiBpcyBzZXQgdG8gWUVTLgorCitSVEZfSFlQRVJMSU5LUyAgICAgICAgID0gTk8KKworIyBMb2FkIHN0eWxlc2hlZXQgZGVmaW5pdGlvbnMgZnJvbSBmaWxlLiBTeW50YXggaXMgc2ltaWxhciB0byBkb3h5Z2VuJ3MgY29uZmlnCisjIGZpbGUsIGkuZS4gYSBzZXJpZXMgb2YgYXNzaWdubWVudHMuIFlvdSBvbmx5IGhhdmUgdG8gcHJvdmlkZSByZXBsYWNlbWVudHMsCisjIG1pc3NpbmcgZGVmaW5pdGlvbnMgYXJlIHNldCB0byB0aGVpciBkZWZhdWx0IHZhbHVlLgorIworIyBTZWUgYWxzbyBzZWN0aW9uICJEb3h5Z2VuIHVzYWdlIiBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGdlbmVyYXRlIHRoZQorIyBkZWZhdWx0IHN0eWxlIHNoZWV0IHRoYXQgZG94eWdlbiBub3JtYWxseSB1c2VzLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUlRGIGlzIHNldCB0byBZRVMuCisKK1JURl9TVFlMRVNIRUVUX0ZJTEUgICAgPSAKKworIyBTZXQgb3B0aW9uYWwgdmFyaWFibGVzIHVzZWQgaW4gdGhlIGdlbmVyYXRpb24gb2YgYW4gUlRGIGRvY3VtZW50LiBTeW50YXggaXMKKyMgc2ltaWxhciB0byBkb3h5Z2VuJ3MgY29uZmlnIGZpbGUuIEEgdGVtcGxhdGUgZXh0ZW5zaW9ucyBmaWxlIGNhbiBiZSBnZW5lcmF0ZWQKKyMgdXNpbmcgZG94eWdlbiAtZSBydGYgZXh0ZW5zaW9uRmlsZS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1JURiBpcyBzZXQgdG8gWUVTLgorCitSVEZfRVhURU5TSU9OU19GSUxFICAgID0gCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIG1hbiBwYWdlIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9NQU4gdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIG1hbiBwYWdlcyBmb3IKKyMgY2xhc3NlcyBhbmQgZmlsZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworR0VORVJBVEVfTUFOICAgICAgICAgICA9IE5PCisKKyMgVGhlIE1BTl9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgbWFuIHBhZ2VzIHdpbGwgYmUgcHV0LiBJZiBhCisjIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlIHB1dCBpbiBmcm9udCBvZgorIyBpdC4gQSBkaXJlY3RvcnkgbWFuMyB3aWxsIGJlIGNyZWF0ZWQgaW5zaWRlIHRoZSBkaXJlY3Rvcnkgc3BlY2lmaWVkIGJ5CisjIE1BTl9PVVRQVVQuCisjIFRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpczogbWFuLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTUFOIGlzIHNldCB0byBZRVMuCisKK01BTl9PVVRQVVQgICAgICAgICAgICAgPSBtYW4KKworIyBUaGUgTUFOX0VYVEVOU0lPTiB0YWcgZGV0ZXJtaW5lcyB0aGUgZXh0ZW5zaW9uIHRoYXQgaXMgYWRkZWQgdG8gdGhlIGdlbmVyYXRlZAorIyBtYW4gcGFnZXMuIEluIGNhc2UgdGhlIG1hbnVhbCBzZWN0aW9uIGRvZXMgbm90IHN0YXJ0IHdpdGggYSBudW1iZXIsIHRoZSBudW1iZXIKKyMgMyBpcyBwcmVwZW5kZWQuIFRoZSBkb3QgKC4pIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIE1BTl9FWFRFTlNJT04gdGFnIGlzCisjIG9wdGlvbmFsLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogLjMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9NQU4gaXMgc2V0IHRvIFlFUy4KKworTUFOX0VYVEVOU0lPTiAgICAgICAgICA9IC4zCisKKyMgSWYgdGhlIE1BTl9MSU5LUyB0YWcgaXMgc2V0IHRvIFlFUyBhbmQgZG94eWdlbiBnZW5lcmF0ZXMgbWFuIG91dHB1dCwgdGhlbiBpdAorIyB3aWxsIGdlbmVyYXRlIG9uZSBhZGRpdGlvbmFsIG1hbiBmaWxlIGZvciBlYWNoIGVudGl0eSBkb2N1bWVudGVkIGluIHRoZSByZWFsCisjIG1hbiBwYWdlKHMpLiBUaGVzZSBhZGRpdGlvbmFsIGZpbGVzIG9ubHkgc291cmNlIHRoZSByZWFsIG1hbiBwYWdlLCBidXQgd2l0aG91dAorIyB0aGVtIHRoZSBtYW4gY29tbWFuZCB3b3VsZCBiZSB1bmFibGUgdG8gZmluZCB0aGUgY29ycmVjdCBwYWdlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9NQU4gaXMgc2V0IHRvIFlFUy4KKworTUFOX0xJTktTICAgICAgICAgICAgICA9IE5PCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIFhNTCBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfWE1MIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhbiBYTUwgZmlsZSB0aGF0CisjIGNhcHR1cmVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGNvZGUgaW5jbHVkaW5nIGFsbCBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0dFTkVSQVRFX1hNTCAgICAgICAgICAgPSBOTworCisjIFRoZSBYTUxfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIFhNTCBwYWdlcyB3aWxsIGJlIHB1dC4gSWYgYQorIyByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSBwdXQgaW4gZnJvbnQgb2YKKyMgaXQuCisjIFRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpczogeG1sLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfWE1MIGlzIHNldCB0byBZRVMuCisKK1hNTF9PVVRQVVQgICAgICAgICAgICAgPSB4bWwKKworIyBUaGUgWE1MX1NDSEVNQSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIFhNTCBzY2hlbWEsIHdoaWNoIGNhbiBiZSB1c2VkIGJ5IGEKKyMgdmFsaWRhdGluZyBYTUwgcGFyc2VyIHRvIGNoZWNrIHRoZSBzeW50YXggb2YgdGhlIFhNTCBmaWxlcy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1hNTCBpcyBzZXQgdG8gWUVTLgorCitYTUxfU0NIRU1BICAgICAgICAgICAgID0gCisKKyMgVGhlIFhNTF9EVEQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBYTUwgRFRELCB3aGljaCBjYW4gYmUgdXNlZCBieSBhCisjIHZhbGlkYXRpbmcgWE1MIHBhcnNlciB0byBjaGVjayB0aGUgc3ludGF4IG9mIHRoZSBYTUwgZmlsZXMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9YTUwgaXMgc2V0IHRvIFlFUy4KKworWE1MX0RURCAgICAgICAgICAgICAgICA9IAorCisjIElmIHRoZSBYTUxfUFJPR1JBTUxJU1RJTkcgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGR1bXAgdGhlIHByb2dyYW0KKyMgbGlzdGluZ3MgKGluY2x1ZGluZyBzeW50YXggaGlnaGxpZ2h0aW5nIGFuZCBjcm9zcy1yZWZlcmVuY2luZyBpbmZvcm1hdGlvbikgdG8KKyMgdGhlIFhNTCBvdXRwdXQuIE5vdGUgdGhhdCBlbmFibGluZyB0aGlzIHdpbGwgc2lnbmlmaWNhbnRseSBpbmNyZWFzZSB0aGUgc2l6ZQorIyBvZiB0aGUgWE1MIG91dHB1dC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1hNTCBpcyBzZXQgdG8gWUVTLgorCitYTUxfUFJPR1JBTUxJU1RJTkcgICAgID0gWUVTCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIERPQ0JPT0sgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX0RPQ0JPT0sgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIERvY2Jvb2sgZmlsZXMKKyMgdGhhdCBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBQREYuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworR0VORVJBVEVfRE9DQk9PSyAgICAgICA9IE5PCisKKyMgVGhlIERPQ0JPT0tfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIERvY2Jvb2sgcGFnZXMgd2lsbCBiZSBwdXQuCisjIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgcHV0IGluCisjIGZyb250IG9mIGl0LgorIyBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaXM6IGRvY2Jvb2suCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9ET0NCT09LIGlzIHNldCB0byBZRVMuCisKK0RPQ0JPT0tfT1VUUFVUICAgICAgICAgPSBkb2Nib29rCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgQXV0b0dlbiBEZWZpbml0aW9ucyBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfQVVUT0dFTl9ERUYgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGFuIEF1dG9HZW4KKyMgRGVmaW5pdGlvbnMgKHNlZSBodHRwOi8vYXV0b2dlbi5zZi5uZXQpIGZpbGUgdGhhdCBjYXB0dXJlcyB0aGUgc3RydWN0dXJlIG9mCisjIHRoZSBjb2RlIGluY2x1ZGluZyBhbGwgZG9jdW1lbnRhdGlvbi4gTm90ZSB0aGF0IHRoaXMgZmVhdHVyZSBpcyBzdGlsbAorIyBleHBlcmltZW50YWwgYW5kIGluY29tcGxldGUgYXQgdGhlIG1vbWVudC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitHRU5FUkFURV9BVVRPR0VOX0RFRiAgID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgUGVybCBtb2R1bGUgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX1BFUkxNT0QgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgUGVybCBtb2R1bGUKKyMgZmlsZSB0aGF0IGNhcHR1cmVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGNvZGUgaW5jbHVkaW5nIGFsbCBkb2N1bWVudGF0aW9uLgorIworIyBOb3RlIHRoYXQgdGhpcyBmZWF0dXJlIGlzIHN0aWxsIGV4cGVyaW1lbnRhbCBhbmQgaW5jb21wbGV0ZSBhdCB0aGUgbW9tZW50LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0dFTkVSQVRFX1BFUkxNT0QgICAgICAgPSBOTworCisjIElmIHRoZSBQRVJMTU9EX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSB0aGUgbmVjZXNzYXJ5CisjIE1ha2VmaWxlIHJ1bGVzLCBQZXJsIHNjcmlwdHMgYW5kIExhVGVYIGNvZGUgdG8gYmUgYWJsZSB0byBnZW5lcmF0ZSBQREYgYW5kIERWSQorIyBvdXRwdXQgZnJvbSB0aGUgUGVybCBtb2R1bGUgb3V0cHV0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9QRVJMTU9EIGlzIHNldCB0byBZRVMuCisKK1BFUkxNT0RfTEFURVggICAgICAgICAgPSBOTworCisjIElmIHRoZSBQRVJMTU9EX1BSRVRUWSB0YWcgaXMgc2V0IHRvIFlFUyB0aGUgUGVybCBtb2R1bGUgb3V0cHV0IHdpbGwgYmUgbmljZWx5CisjIGZvcm1hdHRlZCBzbyBpdCBjYW4gYmUgcGFyc2VkIGJ5IGEgaHVtYW4gcmVhZGVyLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0bworIyB1bmRlcnN0YW5kIHdoYXQgaXMgZ29pbmcgb24uIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGlzIHRhZyBpcyBzZXQgdG8gTk8gdGhlCisjIHNpemUgb2YgdGhlIFBlcmwgbW9kdWxlIG91dHB1dCB3aWxsIGJlIG11Y2ggc21hbGxlciBhbmQgUGVybCB3aWxsIHBhcnNlIGl0CisjIGp1c3QgdGhlIHNhbWUuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9QRVJMTU9EIGlzIHNldCB0byBZRVMuCisKK1BFUkxNT0RfUFJFVFRZICAgICAgICAgPSBZRVMKKworIyBUaGUgbmFtZXMgb2YgdGhlIG1ha2UgdmFyaWFibGVzIGluIHRoZSBnZW5lcmF0ZWQgZG94eXJ1bGVzLm1ha2UgZmlsZSBhcmUKKyMgcHJlZml4ZWQgd2l0aCB0aGUgc3RyaW5nIGNvbnRhaW5lZCBpbiBQRVJMTU9EX01BS0VWQVJfUFJFRklYLiBUaGlzIGlzIHVzZWZ1bAorIyBzbyBkaWZmZXJlbnQgZG94eXJ1bGVzLm1ha2UgZmlsZXMgaW5jbHVkZWQgYnkgdGhlIHNhbWUgTWFrZWZpbGUgZG9uJ3QKKyMgb3ZlcndyaXRlIGVhY2ggb3RoZXIncyB2YXJpYWJsZXMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9QRVJMTU9EIGlzIHNldCB0byBZRVMuCisKK1BFUkxNT0RfTUFLRVZBUl9QUkVGSVggPSAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgcHJlcHJvY2Vzc29yCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEVOQUJMRV9QUkVQUk9DRVNTSU5HIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBldmFsdWF0ZSBhbGwKKyMgQy1wcmVwcm9jZXNzb3IgZGlyZWN0aXZlcyBmb3VuZCBpbiB0aGUgc291cmNlcyBhbmQgaW5jbHVkZSBmaWxlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworRU5BQkxFX1BSRVBST0NFU1NJTkcgICA9IFlFUworCisjIElmIHRoZSBNQUNST19FWFBBTlNJT04gdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGV4cGFuZCBhbGwgbWFjcm8gbmFtZXMKKyMgaW4gdGhlIHNvdXJjZSBjb2RlLiBJZiBzZXQgdG8gTk8gb25seSBjb25kaXRpb25hbCBjb21waWxhdGlvbiB3aWxsIGJlCisjIHBlcmZvcm1lZC4gTWFjcm8gZXhwYW5zaW9uIGNhbiBiZSBkb25lIGluIGEgY29udHJvbGxlZCB3YXkgYnkgc2V0dGluZworIyBFWFBBTkRfT05MWV9QUkVERUYgdG8gWUVTLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitNQUNST19FWFBBTlNJT04gICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEVYUEFORF9PTkxZX1BSRURFRiBhbmQgTUFDUk9fRVhQQU5TSU9OIHRhZ3MgYXJlIGJvdGggc2V0IHRvIFlFUyB0aGVuCisjIHRoZSBtYWNybyBleHBhbnNpb24gaXMgbGltaXRlZCB0byB0aGUgbWFjcm9zIHNwZWNpZmllZCB3aXRoIHRoZSBQUkVERUZJTkVEIGFuZAorIyBFWFBBTkRfQVNfREVGSU5FRCB0YWdzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitFWFBBTkRfT05MWV9QUkVERUYgICAgID0gWUVTCisKKyMgSWYgdGhlIFNFQVJDSF9JTkNMVURFUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGUgaW5jbHVkZXMgZmlsZXMgaW4gdGhlCisjIElOQ0xVREVfUEFUSCB3aWxsIGJlIHNlYXJjaGVkIGlmIGEgI2luY2x1ZGUgaXMgZm91bmQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitTRUFSQ0hfSU5DTFVERVMgICAgICAgID0gWUVTCisKKyMgVGhlIElOQ0xVREVfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBkaXJlY3RvcmllcyB0aGF0CisjIGNvbnRhaW4gaW5jbHVkZSBmaWxlcyB0aGF0IGFyZSBub3QgaW5wdXQgZmlsZXMgYnV0IHNob3VsZCBiZSBwcm9jZXNzZWQgYnkgdGhlCisjIHByZXByb2Nlc3Nvci4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSF9JTkNMVURFUyBpcyBzZXQgdG8gWUVTLgorCitJTkNMVURFX1BBVEggICAgICAgICAgID0gCisKKyMgWW91IGNhbiB1c2UgdGhlIElOQ0xVREVfRklMRV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZAorIyBwYXR0ZXJucyAobGlrZSAqLmggYW5kICouaHBwKSB0byBmaWx0ZXIgb3V0IHRoZSBoZWFkZXItZmlsZXMgaW4gdGhlCisjIGRpcmVjdG9yaWVzLiBJZiBsZWZ0IGJsYW5rLCB0aGUgcGF0dGVybnMgc3BlY2lmaWVkIHdpdGggRklMRV9QQVRURVJOUyB3aWxsIGJlCisjIHVzZWQuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitJTkNMVURFX0ZJTEVfUEFUVEVSTlMgID0gCisKKyMgVGhlIFBSRURFRklORUQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgbWFjcm8gbmFtZXMgdGhhdCBhcmUKKyMgZGVmaW5lZCBiZWZvcmUgdGhlIHByZXByb2Nlc3NvciBpcyBzdGFydGVkIChzaW1pbGFyIHRvIHRoZSAtRCBvcHRpb24gb2YgZS5nLgorIyBnY2MpLiBUaGUgYXJndW1lbnQgb2YgdGhlIHRhZyBpcyBhIGxpc3Qgb2YgbWFjcm9zIG9mIHRoZSBmb3JtOiBuYW1lIG9yCisjIG5hbWU9ZGVmaW5pdGlvbiAobm8gc3BhY2VzKS4gSWYgdGhlIGRlZmluaXRpb24gYW5kIHRoZSAiPSIgYXJlIG9taXR0ZWQsICI9MSIKKyMgaXMgYXNzdW1lZC4gVG8gcHJldmVudCBhIG1hY3JvIGRlZmluaXRpb24gZnJvbSBiZWluZyB1bmRlZmluZWQgdmlhICN1bmRlZiBvcgorIyByZWN1cnNpdmVseSBleHBhbmRlZCB1c2UgdGhlIDo9IG9wZXJhdG9yIGluc3RlYWQgb2YgdGhlID0gb3BlcmF0b3IuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitQUkVERUZJTkVEICAgICAgICAgICAgID0gQ09JX0xJQlJBUllfVkVSU0lPTj0yIC1ETVlPX1NVUFBPUlQgLURPRkZMT0FEX0RFQlVHPTEgLURTRVBfU1VQUE9SVCAtRFRJTUlOR19TVVBQT1JUCisKKyMgSWYgdGhlIE1BQ1JPX0VYUEFOU0lPTiBhbmQgRVhQQU5EX09OTFlfUFJFREVGIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiB0aGlzCisjIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbGlzdCBvZiBtYWNybyBuYW1lcyB0aGF0IHNob3VsZCBiZSBleHBhbmRlZC4gVGhlCisjIG1hY3JvIGRlZmluaXRpb24gdGhhdCBpcyBmb3VuZCBpbiB0aGUgc291cmNlcyB3aWxsIGJlIHVzZWQuIFVzZSB0aGUgUFJFREVGSU5FRAorIyB0YWcgaWYgeW91IHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50IG1hY3JvIGRlZmluaXRpb24gdGhhdCBvdmVycnVsZXMgdGhlCisjIGRlZmluaXRpb24gZm91bmQgaW4gdGhlIHNvdXJjZSBjb2RlLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KKworRVhQQU5EX0FTX0RFRklORUQgICAgICA9IAorCisjIElmIHRoZSBTS0lQX0ZVTkNUSU9OX01BQ1JPUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4ncyBwcmVwcm9jZXNzb3Igd2lsbAorIyByZW1vdmUgYWxsIHJlZmVyZW5jZXMgdG8gZnVuY3Rpb24tbGlrZSBtYWNyb3MgdGhhdCBhcmUgYWxvbmUgb24gYSBsaW5lLCBoYXZlIGFuCisjIGFsbCB1cHBlcmNhc2UgbmFtZSwgYW5kIGRvIG5vdCBlbmQgd2l0aCBhIHNlbWljb2xvbi4gU3VjaCBmdW5jdGlvbiBtYWNyb3MgYXJlCisjIHR5cGljYWxseSB1c2VkIGZvciBib2lsZXItcGxhdGUgY29kZSwgYW5kIHdpbGwgY29uZnVzZSB0aGUgcGFyc2VyIGlmIG5vdAorIyByZW1vdmVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KKworU0tJUF9GVU5DVElPTl9NQUNST1MgICA9IFlFUworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIGV4dGVybmFsIHJlZmVyZW5jZXMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUaGUgVEFHRklMRVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgdGFnIGZpbGVzLiBGb3IgZWFjaCB0YWcKKyMgZmlsZSB0aGUgbG9jYXRpb24gb2YgdGhlIGV4dGVybmFsIGRvY3VtZW50YXRpb24gc2hvdWxkIGJlIGFkZGVkLiBUaGUgZm9ybWF0IG9mCisjIGEgdGFnIGZpbGUgd2l0aG91dCB0aGlzIGxvY2F0aW9uIGlzIGFzIGZvbGxvd3M6CisjIFRBR0ZJTEVTID0gZmlsZTEgZmlsZTIgLi4uCisjIEFkZGluZyBsb2NhdGlvbiBmb3IgdGhlIHRhZyBmaWxlcyBpcyBkb25lIGFzIGZvbGxvd3M6CisjIFRBR0ZJTEVTID0gZmlsZTE9bG9jMSAiZmlsZTIgPSBsb2MyIiAuLi4KKyMgd2hlcmUgbG9jMSBhbmQgbG9jMiBjYW4gYmUgcmVsYXRpdmUgb3IgYWJzb2x1dGUgcGF0aHMgb3IgVVJMcy4gU2VlIHRoZQorIyBzZWN0aW9uICJMaW5raW5nIHRvIGV4dGVybmFsIGRvY3VtZW50YXRpb24iIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSB1c2UKKyMgb2YgdGFnIGZpbGVzLgorIyBOb3RlOiBFYWNoIHRhZyBmaWxlIG11c3QgaGF2ZSBhbiB1bmlxdWUgbmFtZSAod2hlcmUgdGhlIG5hbWUgZG9lcyBOT1QgaW5jbHVkZQorIyB0aGUgcGF0aCkuIElmIGEgdGFnIGZpbGUgaXMgbm90IGxvY2F0ZWQgaW4gdGhlIGRpcmVjdG9yeSBpbiB3aGljaCBkb3h5Z2VuIGlzCisjIHJ1biwgeW91IG11c3QgYWxzbyBzcGVjaWZ5IHRoZSBwYXRoIHRvIHRoZSB0YWdmaWxlIGhlcmUuCisKK1RBR0ZJTEVTICAgICAgICAgICAgICAgPSAKKworIyBXaGVuIGEgZmlsZSBuYW1lIGlzIHNwZWNpZmllZCBhZnRlciBHRU5FUkFURV9UQUdGSUxFLCBkb3h5Z2VuIHdpbGwgY3JlYXRlIGEKKyMgdGFnIGZpbGUgdGhhdCBpcyBiYXNlZCBvbiB0aGUgaW5wdXQgZmlsZXMgaXQgcmVhZHMuIFNlZSBzZWN0aW9uICJMaW5raW5nIHRvCisjIGV4dGVybmFsIGRvY3VtZW50YXRpb24iIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSB1c2FnZSBvZiB0YWcgZmlsZXMuCisKK0dFTkVSQVRFX1RBR0ZJTEUgICAgICAgPSAKKworIyBJZiB0aGUgQUxMRVhURVJOQUxTIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBleHRlcm5hbCBjbGFzcyB3aWxsIGJlIGxpc3RlZCBpbiB0aGUKKyMgY2xhc3MgaW5kZXguIElmIHNldCB0byBOTyBvbmx5IHRoZSBpbmhlcml0ZWQgZXh0ZXJuYWwgY2xhc3NlcyB3aWxsIGJlIGxpc3RlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitBTExFWFRFUk5BTFMgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgRVhURVJOQUxfR1JPVVBTIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBleHRlcm5hbCBncm91cHMgd2lsbCBiZSBsaXN0ZWQgaW4KKyMgdGhlIG1vZHVsZXMgaW5kZXguIElmIHNldCB0byBOTywgb25seSB0aGUgY3VycmVudCBwcm9qZWN0J3MgZ3JvdXBzIHdpbGwgYmUKKyMgbGlzdGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitFWFRFUk5BTF9HUk9VUFMgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEVYVEVSTkFMX1BBR0VTIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBleHRlcm5hbCBwYWdlcyB3aWxsIGJlIGxpc3RlZCBpbgorIyB0aGUgcmVsYXRlZCBwYWdlcyBpbmRleC4gSWYgc2V0IHRvIE5PLCBvbmx5IHRoZSBjdXJyZW50IHByb2plY3QncyBwYWdlcyB3aWxsCisjIGJlIGxpc3RlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworRVhURVJOQUxfUEFHRVMgICAgICAgICA9IFlFUworCisjIFRoZSBQRVJMX1BBVEggc2hvdWxkIGJlIHRoZSBhYnNvbHV0ZSBwYXRoIGFuZCBuYW1lIG9mIHRoZSBwZXJsIHNjcmlwdAorIyBpbnRlcnByZXRlciAoaS5lLiB0aGUgcmVzdWx0IG9mICd3aGljaCBwZXJsJykuCisjIFRoZSBkZWZhdWx0IGZpbGUgKHdpdGggYWJzb2x1dGUgcGF0aCkgaXM6IC91c3IvYmluL3BlcmwuCisKK1BFUkxfUEFUSCAgICAgICAgICAgICAgPSAvdXNyL2Jpbi9wZXJsCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGRvdCB0b29sCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIENMQVNTX0RJQUdSQU1TIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGNsYXNzIGRpYWdyYW0KKyMgKGluIEhUTUwgYW5kIExhVGVYKSBmb3IgY2xhc3NlcyB3aXRoIGJhc2Ugb3Igc3VwZXIgY2xhc3Nlcy4gU2V0dGluZyB0aGUgdGFnIHRvCisjIE5PIHR1cm5zIHRoZSBkaWFncmFtcyBvZmYuIE5vdGUgdGhhdCB0aGlzIG9wdGlvbiBhbHNvIHdvcmtzIHdpdGggSEFWRV9ET1QKKyMgZGlzYWJsZWQsIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBpbnN0YWxsIGFuZCB1c2UgZG90LCBzaW5jZSBpdCB5aWVsZHMgbW9yZQorIyBwb3dlcmZ1bCBncmFwaHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0NMQVNTX0RJQUdSQU1TICAgICAgICAgPSBZRVMKKworIyBZb3UgY2FuIGRlZmluZSBtZXNzYWdlIHNlcXVlbmNlIGNoYXJ0cyB3aXRoaW4gZG94eWdlbiBjb21tZW50cyB1c2luZyB0aGUgXG1zYworIyBjb21tYW5kLiBEb3h5Z2VuIHdpbGwgdGhlbiBydW4gdGhlIG1zY2dlbiB0b29sIChzZWU6CisjIGh0dHA6Ly93d3cubWN0ZXJuYW4ubWUudWsvbXNjZ2VuLykpIHRvIHByb2R1Y2UgdGhlIGNoYXJ0IGFuZCBpbnNlcnQgaXQgaW4gdGhlCisjIGRvY3VtZW50YXRpb24uIFRoZSBNU0NHRU5fUEFUSCB0YWcgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBkaXJlY3Rvcnkgd2hlcmUKKyMgdGhlIG1zY2dlbiB0b29sIHJlc2lkZXMuIElmIGxlZnQgZW1wdHkgdGhlIHRvb2wgaXMgYXNzdW1lZCB0byBiZSBmb3VuZCBpbiB0aGUKKyMgZGVmYXVsdCBzZWFyY2ggcGF0aC4KKworTVNDR0VOX1BBVEggICAgICAgICAgICA9IAorCisjIFlvdSBjYW4gaW5jbHVkZSBkaWFncmFtcyBtYWRlIHdpdGggZGlhIGluIGRveHlnZW4gZG9jdW1lbnRhdGlvbi4gRG94eWdlbiB3aWxsCisjIHRoZW4gcnVuIGRpYSB0byBwcm9kdWNlIHRoZSBkaWFncmFtIGFuZCBpbnNlcnQgaXQgaW4gdGhlIGRvY3VtZW50YXRpb24uIFRoZQorIyBESUFfUEFUSCB0YWcgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGRpYSBiaW5hcnkgcmVzaWRlcy4KKyMgSWYgbGVmdCBlbXB0eSBkaWEgaXMgYXNzdW1lZCB0byBiZSBmb3VuZCBpbiB0aGUgZGVmYXVsdCBzZWFyY2ggcGF0aC4KKworRElBX1BBVEggICAgICAgICAgICAgICA9IAorCisjIElmIHNldCB0byBZRVMsIHRoZSBpbmhlcml0YW5jZSBhbmQgY29sbGFib3JhdGlvbiBncmFwaHMgd2lsbCBoaWRlIGluaGVyaXRhbmNlCisjIGFuZCB1c2FnZSByZWxhdGlvbnMgaWYgdGhlIHRhcmdldCBpcyB1bmRvY3VtZW50ZWQgb3IgaXMgbm90IGEgY2xhc3MuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0hJREVfVU5ET0NfUkVMQVRJT05TICAgPSBZRVMKKworIyBJZiB5b3Ugc2V0IHRoZSBIQVZFX0RPVCB0YWcgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGFzc3VtZSB0aGUgZG90IHRvb2wgaXMKKyMgYXZhaWxhYmxlIGZyb20gdGhlIHBhdGguIFRoaXMgdG9vbCBpcyBwYXJ0IG9mIEdyYXBodml6IChzZWU6CisjIGh0dHA6Ly93d3cuZ3JhcGh2aXoub3JnLyksIGEgZ3JhcGggdmlzdWFsaXphdGlvbiB0b29sa2l0IGZyb20gQVQmVCBhbmQgTHVjZW50CisjIEJlbGwgTGFicy4gVGhlIG90aGVyIG9wdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGhhdmUgbm8gZWZmZWN0IGlmIHRoaXMgb3B0aW9uIGlzCisjIHNldCB0byBOTworIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0hBVkVfRE9UICAgICAgICAgICAgICAgPSBOTworCisjIFRoZSBET1RfTlVNX1RIUkVBRFMgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgZG90IGludm9jYXRpb25zIGRveHlnZW4gaXMgYWxsb3dlZAorIyB0byBydW4gaW4gcGFyYWxsZWwuIFdoZW4gc2V0IHRvIDAgZG94eWdlbiB3aWxsIGJhc2UgdGhpcyBvbiB0aGUgbnVtYmVyIG9mCisjIHByb2Nlc3NvcnMgYXZhaWxhYmxlIGluIHRoZSBzeXN0ZW0uIFlvdSBjYW4gc2V0IGl0IGV4cGxpY2l0bHkgdG8gYSB2YWx1ZQorIyBsYXJnZXIgdGhhbiAwIHRvIGdldCBjb250cm9sIG92ZXIgdGhlIGJhbGFuY2UgYmV0d2VlbiBDUFUgbG9hZCBhbmQgcHJvY2Vzc2luZworIyBzcGVlZC4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMzIsIGRlZmF1bHQgdmFsdWU6IDAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfTlVNX1RIUkVBRFMgICAgICAgID0gMAorCisjIFdoZW4geW91IHdhbnQgYSBkaWZmZXJlbnRseSBsb29raW5nIGZvbnQgbiB0aGUgZG90IGZpbGVzIHRoYXQgZG94eWdlbgorIyBnZW5lcmF0ZXMgeW91IGNhbiBzcGVjaWZ5IHRoZSBmb250IG5hbWUgdXNpbmcgRE9UX0ZPTlROQU1FLiBZb3UgbmVlZCB0byBtYWtlCisjIHN1cmUgZG90IGlzIGFibGUgdG8gZmluZCB0aGUgZm9udCwgd2hpY2ggY2FuIGJlIGRvbmUgYnkgcHV0dGluZyBpdCBpbiBhCisjIHN0YW5kYXJkIGxvY2F0aW9uIG9yIGJ5IHNldHRpbmcgdGhlIERPVEZPTlRQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlIG9yIGJ5CisjIHNldHRpbmcgRE9UX0ZPTlRQQVRIIHRvIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZm9udC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IEhlbHZldGljYS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9GT05UTkFNRSAgICAgICAgICAgPSBIZWx2ZXRpY2EKKworIyBUaGUgRE9UX0ZPTlRTSVpFIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIHNpemUgKGluIHBvaW50cykgb2YgdGhlIGZvbnQgb2YKKyMgZG90IGdyYXBocy4KKyMgTWluaW11bSB2YWx1ZTogNCwgbWF4aW11bSB2YWx1ZTogMjQsIGRlZmF1bHQgdmFsdWU6IDEwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX0ZPTlRTSVpFICAgICAgICAgICA9IDEwCisKKyMgQnkgZGVmYXVsdCBkb3h5Z2VuIHdpbGwgdGVsbCBkb3QgdG8gdXNlIHRoZSBkZWZhdWx0IGZvbnQgYXMgc3BlY2lmaWVkIHdpdGgKKyMgRE9UX0ZPTlROQU1FLiBJZiB5b3Ugc3BlY2lmeSBhIGRpZmZlcmVudCBmb250IHVzaW5nIERPVF9GT05UTkFNRSB5b3UgY2FuIHNldAorIyB0aGUgcGF0aCB3aGVyZSBkb3QgY2FuIGZpbmQgaXQgdXNpbmcgdGhpcyB0YWcuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfRk9OVFBBVEggICAgICAgICAgID0gCisKKyMgSWYgdGhlIENMQVNTX0dSQVBIIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yCisjIGVhY2ggZG9jdW1lbnRlZCBjbGFzcyBzaG93aW5nIHRoZSBkaXJlY3QgYW5kIGluZGlyZWN0IGluaGVyaXRhbmNlIHJlbGF0aW9ucy4KKyMgU2V0dGluZyB0aGlzIHRhZyB0byBZRVMgd2lsbCBmb3JjZSB0aGUgQ0xBU1NfRElBR1JBTVMgdGFnIHRvIE5PLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworQ0xBU1NfR1JBUEggICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBDT0xMQUJPUkFUSU9OX0dSQVBIIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEKKyMgZ3JhcGggZm9yIGVhY2ggZG9jdW1lbnRlZCBjbGFzcyBzaG93aW5nIHRoZSBkaXJlY3QgYW5kIGluZGlyZWN0IGltcGxlbWVudGF0aW9uCisjIGRlcGVuZGVuY2llcyAoaW5oZXJpdGFuY2UsIGNvbnRhaW5tZW50LCBhbmQgY2xhc3MgcmVmZXJlbmNlcyB2YXJpYWJsZXMpIG9mIHRoZQorIyBjbGFzcyB3aXRoIG90aGVyIGRvY3VtZW50ZWQgY2xhc3Nlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0NPTExBQk9SQVRJT05fR1JBUEggICAgPSBZRVMKKworIyBJZiB0aGUgR1JPVVBfR1JBUEhTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yCisjIGdyb3Vwcywgc2hvd2luZyB0aGUgZGlyZWN0IGdyb3VwcyBkZXBlbmRlbmNpZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitHUk9VUF9HUkFQSFMgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFVNTF9MT09LIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBpbmhlcml0YW5jZSBhbmQKKyMgY29sbGFib3JhdGlvbiBkaWFncmFtcyBpbiBhIHN0eWxlIHNpbWlsYXIgdG8gdGhlIE9NRydzIFVuaWZpZWQgTW9kZWxpbmcKKyMgTGFuZ3VhZ2UuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK1VNTF9MT09LICAgICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBVTUxfTE9PSyB0YWcgaXMgZW5hYmxlZCwgdGhlIGZpZWxkcyBhbmQgbWV0aG9kcyBhcmUgc2hvd24gaW5zaWRlIHRoZQorIyBjbGFzcyBub2RlLiBJZiB0aGVyZSBhcmUgbWFueSBmaWVsZHMgb3IgbWV0aG9kcyBhbmQgbWFueSBub2RlcyB0aGUgZ3JhcGggbWF5CisjIGJlY29tZSB0b28gYmlnIHRvIGJlIHVzZWZ1bC4gVGhlIFVNTF9MSU1JVF9OVU1fRklFTERTIHRocmVzaG9sZCBsaW1pdHMgdGhlCisjIG51bWJlciBvZiBpdGVtcyBmb3IgZWFjaCB0eXBlIHRvIG1ha2UgdGhlIHNpemUgbW9yZSBtYW5hZ2VhYmxlLiBTZXQgdGhpcyB0byAwCisjIGZvciBubyBsaW1pdC4gTm90ZSB0aGF0IHRoZSB0aHJlc2hvbGQgbWF5IGJlIGV4Y2VlZGVkIGJ5IDUwJSBiZWZvcmUgdGhlIGxpbWl0CisjIGlzIGVuZm9yY2VkLiBTbyB3aGVuIHlvdSBzZXQgdGhlIHRocmVzaG9sZCB0byAxMCwgdXAgdG8gMTUgZmllbGRzIG1heSBhcHBlYXIsCisjIGJ1dCBpZiB0aGUgbnVtYmVyIGV4Y2VlZHMgMTUsIHRoZSB0b3RhbCBhbW91bnQgb2YgZmllbGRzIHNob3duIGlzIGxpbWl0ZWQgdG8KKyMgMTAuCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDEwMCwgZGVmYXVsdCB2YWx1ZTogMTAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitVTUxfTElNSVRfTlVNX0ZJRUxEUyAgID0gMTAKKworIyBJZiB0aGUgVEVNUExBVEVfUkVMQVRJT05TIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIGluaGVyaXRhbmNlIGFuZAorIyBjb2xsYWJvcmF0aW9uIGdyYXBocyB3aWxsIHNob3cgdGhlIHJlbGF0aW9ucyBiZXR3ZWVuIHRlbXBsYXRlcyBhbmQgdGhlaXIKKyMgaW5zdGFuY2VzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitURU1QTEFURV9SRUxBVElPTlMgICAgID0gTk8KKworIyBJZiB0aGUgSU5DTFVERV9HUkFQSCwgRU5BQkxFX1BSRVBST0NFU1NJTkcgYW5kIFNFQVJDSF9JTkNMVURFUyB0YWdzIGFyZSBzZXQgdG8KKyMgWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yIGVhY2ggZG9jdW1lbnRlZCBmaWxlIHNob3dpbmcgdGhlCisjIGRpcmVjdCBhbmQgaW5kaXJlY3QgaW5jbHVkZSBkZXBlbmRlbmNpZXMgb2YgdGhlIGZpbGUgd2l0aCBvdGhlciBkb2N1bWVudGVkCisjIGZpbGVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworSU5DTFVERV9HUkFQSCAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBJTkNMVURFRF9CWV9HUkFQSCwgRU5BQkxFX1BSRVBST0NFU1NJTkcgYW5kIFNFQVJDSF9JTkNMVURFUyB0YWdzIGFyZQorIyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yIGVhY2ggZG9jdW1lbnRlZCBmaWxlIHNob3dpbmcKKyMgdGhlIGRpcmVjdCBhbmQgaW5kaXJlY3QgaW5jbHVkZSBkZXBlbmRlbmNpZXMgb2YgdGhlIGZpbGUgd2l0aCBvdGhlciBkb2N1bWVudGVkCisjIGZpbGVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworSU5DTFVERURfQllfR1JBUEggICAgICA9IFlFUworCisjIElmIHRoZSBDQUxMX0dSQVBIIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgY2FsbAorIyBkZXBlbmRlbmN5IGdyYXBoIGZvciBldmVyeSBnbG9iYWwgZnVuY3Rpb24gb3IgY2xhc3MgbWV0aG9kLgorIworIyBOb3RlIHRoYXQgZW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCBzaWduaWZpY2FudGx5IGluY3JlYXNlIHRoZSB0aW1lIG9mIGEgcnVuLgorIyBTbyBpbiBtb3N0IGNhc2VzIGl0IHdpbGwgYmUgYmV0dGVyIHRvIGVuYWJsZSBjYWxsIGdyYXBocyBmb3Igc2VsZWN0ZWQKKyMgZnVuY3Rpb25zIG9ubHkgdXNpbmcgdGhlIFxjYWxsZ3JhcGggY29tbWFuZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworQ0FMTF9HUkFQSCAgICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIENBTExFUl9HUkFQSCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGNhbGxlcgorIyBkZXBlbmRlbmN5IGdyYXBoIGZvciBldmVyeSBnbG9iYWwgZnVuY3Rpb24gb3IgY2xhc3MgbWV0aG9kLgorIworIyBOb3RlIHRoYXQgZW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCBzaWduaWZpY2FudGx5IGluY3JlYXNlIHRoZSB0aW1lIG9mIGEgcnVuLgorIyBTbyBpbiBtb3N0IGNhc2VzIGl0IHdpbGwgYmUgYmV0dGVyIHRvIGVuYWJsZSBjYWxsZXIgZ3JhcGhzIGZvciBzZWxlY3RlZAorIyBmdW5jdGlvbnMgb25seSB1c2luZyB0aGUgXGNhbGxlcmdyYXBoIGNvbW1hbmQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0NBTExFUl9HUkFQSCAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBHUkFQSElDQUxfSElFUkFSQ0hZIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdyYXBoaWNhbAorIyBoaWVyYXJjaHkgb2YgYWxsIGNsYXNzZXMgaW5zdGVhZCBvZiBhIHRleHR1YWwgb25lLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworR1JBUEhJQ0FMX0hJRVJBUkNIWSAgICA9IFlFUworCisjIElmIHRoZSBESVJFQ1RPUllfR1JBUEggdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc2hvdyB0aGUKKyMgZGVwZW5kZW5jaWVzIGEgZGlyZWN0b3J5IGhhcyBvbiBvdGhlciBkaXJlY3RvcmllcyBpbiBhIGdyYXBoaWNhbCB3YXkuIFRoZQorIyBkZXBlbmRlbmN5IHJlbGF0aW9ucyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgI2luY2x1ZGUgcmVsYXRpb25zIGJldHdlZW4gdGhlCisjIGZpbGVzIGluIHRoZSBkaXJlY3Rvcmllcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RJUkVDVE9SWV9HUkFQSCAgICAgICAgPSBZRVMKKworIyBUaGUgRE9UX0lNQUdFX0ZPUk1BVCB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBpbWFnZSBmb3JtYXQgb2YgdGhlIGltYWdlcworIyBnZW5lcmF0ZWQgYnkgZG90LgorIyBOb3RlOiBJZiB5b3UgY2hvb3NlIHN2ZyB5b3UgbmVlZCB0byBzZXQgSFRNTF9GSUxFX0VYVEVOU0lPTiB0byB4aHRtbCBpbiBvcmRlcgorIyB0byBtYWtlIHRoZSBTVkcgZmlsZXMgdmlzaWJsZSBpbiBJRSA5KyAob3RoZXIgYnJvd3NlcnMgZG8gbm90IGhhdmUgdGhpcworIyByZXF1aXJlbWVudCkuCisjIFBvc3NpYmxlIHZhbHVlcyBhcmU6IHBuZywganBnLCBnaWYgYW5kIHN2Zy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IHBuZy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9JTUFHRV9GT1JNQVQgICAgICAgPSBwbmcKKworIyBJZiBET1RfSU1BR0VfRk9STUFUIGlzIHNldCB0byBzdmcsIHRoZW4gdGhpcyBvcHRpb24gY2FuIGJlIHNldCB0byBZRVMgdG8KKyMgZW5hYmxlIGdlbmVyYXRpb24gb2YgaW50ZXJhY3RpdmUgU1ZHIGltYWdlcyB0aGF0IGFsbG93IHpvb21pbmcgYW5kIHBhbm5pbmcuCisjCisjIE5vdGUgdGhhdCB0aGlzIHJlcXVpcmVzIGEgbW9kZXJuIGJyb3dzZXIgb3RoZXIgdGhhbiBJbnRlcm5ldCBFeHBsb3Jlci4gVGVzdGVkCisjIGFuZCB3b3JraW5nIGFyZSBGaXJlZm94LCBDaHJvbWUsIFNhZmFyaSwgYW5kIE9wZXJhLgorIyBOb3RlOiBGb3IgSUUgOSsgeW91IG5lZWQgdG8gc2V0IEhUTUxfRklMRV9FWFRFTlNJT04gdG8geGh0bWwgaW4gb3JkZXIgdG8gbWFrZQorIyB0aGUgU1ZHIGZpbGVzIHZpc2libGUuIE9sZGVyIHZlcnNpb25zIG9mIElFIGRvIG5vdCBoYXZlIFNWRyBzdXBwb3J0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitJTlRFUkFDVElWRV9TVkcgICAgICAgID0gTk8KKworIyBUaGUgRE9UX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIHBhdGggd2hlcmUgdGhlIGRvdCB0b29sIGNhbiBiZQorIyBmb3VuZC4gSWYgbGVmdCBibGFuaywgaXQgaXMgYXNzdW1lZCB0aGUgZG90IHRvb2wgY2FuIGJlIGZvdW5kIGluIHRoZSBwYXRoLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX1BBVEggICAgICAgICAgICAgICA9IAorCisjIFRoZSBET1RGSUxFX0RJUlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZGlyZWN0b3JpZXMgdGhhdAorIyBjb250YWluIGRvdCBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAoc2VlIHRoZSBcZG90ZmlsZQorIyBjb21tYW5kKS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVEZJTEVfRElSUyAgICAgICAgICAgPSAKKworIyBUaGUgTVNDRklMRV9ESVJTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQKKyMgY29udGFpbiBtc2MgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSB0aGUgXG1zY2ZpbGUKKyMgY29tbWFuZCkuCisKK01TQ0ZJTEVfRElSUyAgICAgICAgICAgPSAKKworIyBUaGUgRElBRklMRV9ESVJTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQKKyMgY29udGFpbiBkaWEgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSB0aGUgXGRpYWZpbGUKKyMgY29tbWFuZCkuCisKK0RJQUZJTEVfRElSUyAgICAgICAgICAgPSAKKworIyBUaGUgRE9UX0dSQVBIX01BWF9OT0RFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBub2RlcworIyB0aGF0IHdpbGwgYmUgc2hvd24gaW4gdGhlIGdyYXBoLiBJZiB0aGUgbnVtYmVyIG9mIG5vZGVzIGluIGEgZ3JhcGggYmVjb21lcworIyBsYXJnZXIgdGhhbiB0aGlzIHZhbHVlLCBkb3h5Z2VuIHdpbGwgdHJ1bmNhdGUgdGhlIGdyYXBoLCB3aGljaCBpcyB2aXN1YWxpemVkCisjIGJ5IHJlcHJlc2VudGluZyBhIG5vZGUgYXMgYSByZWQgYm94LiBOb3RlIHRoYXQgZG94eWdlbiBpZiB0aGUgbnVtYmVyIG9mIGRpcmVjdAorIyBjaGlsZHJlbiBvZiB0aGUgcm9vdCBub2RlIGluIGEgZ3JhcGggaXMgYWxyZWFkeSBsYXJnZXIgdGhhbgorIyBET1RfR1JBUEhfTUFYX05PREVTIHRoZW4gdGhlIGdyYXBoIHdpbGwgbm90IGJlIHNob3duIGF0IGFsbC4gQWxzbyBub3RlIHRoYXQKKyMgdGhlIHNpemUgb2YgYSBncmFwaCBjYW4gYmUgZnVydGhlciByZXN0cmljdGVkIGJ5IE1BWF9ET1RfR1JBUEhfREVQVEguCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDEwMDAwLCBkZWZhdWx0IHZhbHVlOiA1MC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9HUkFQSF9NQVhfTk9ERVMgICAgPSA1MAorCisjIFRoZSBNQVhfRE9UX0dSQVBIX0RFUFRIIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG1heGltdW0gZGVwdGggb2YgdGhlIGdyYXBocworIyBnZW5lcmF0ZWQgYnkgZG90LiBBIGRlcHRoIHZhbHVlIG9mIDMgbWVhbnMgdGhhdCBvbmx5IG5vZGVzIHJlYWNoYWJsZSBmcm9tIHRoZQorIyByb290IGJ5IGZvbGxvd2luZyBhIHBhdGggdmlhIGF0IG1vc3QgMyBlZGdlcyB3aWxsIGJlIHNob3duLiBOb2RlcyB0aGF0IGxheQorIyBmdXJ0aGVyIGZyb20gdGhlIHJvb3Qgbm9kZSB3aWxsIGJlIG9taXR0ZWQuIE5vdGUgdGhhdCBzZXR0aW5nIHRoaXMgb3B0aW9uIHRvIDEKKyMgb3IgMiBtYXkgZ3JlYXRseSByZWR1Y2UgdGhlIGNvbXB1dGF0aW9uIHRpbWUgbmVlZGVkIGZvciBsYXJnZSBjb2RlIGJhc2VzLiBBbHNvCisjIG5vdGUgdGhhdCB0aGUgc2l6ZSBvZiBhIGdyYXBoIGNhbiBiZSBmdXJ0aGVyIHJlc3RyaWN0ZWQgYnkKKyMgRE9UX0dSQVBIX01BWF9OT0RFUy4gVXNpbmcgYSBkZXB0aCBvZiAwIG1lYW5zIG5vIGRlcHRoIHJlc3RyaWN0aW9uLgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAxMDAwLCBkZWZhdWx0IHZhbHVlOiAwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworTUFYX0RPVF9HUkFQSF9ERVBUSCAgICA9IDAKKworIyBTZXQgdGhlIERPVF9UUkFOU1BBUkVOVCB0YWcgdG8gWUVTIHRvIGdlbmVyYXRlIGltYWdlcyB3aXRoIGEgdHJhbnNwYXJlbnQKKyMgYmFja2dyb3VuZC4gVGhpcyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LCBiZWNhdXNlIGRvdCBvbiBXaW5kb3dzIGRvZXMgbm90IHNlZW0KKyMgdG8gc3VwcG9ydCB0aGlzIG91dCBvZiB0aGUgYm94LgorIworIyBXYXJuaW5nOiBEZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtIHVzZWQsIGVuYWJsaW5nIHRoaXMgb3B0aW9uIG1heSBsZWFkIHRvCisjIGJhZGx5IGFudGktYWxpYXNlZCBsYWJlbHMgb24gdGhlIGVkZ2VzIG9mIGEgZ3JhcGggKGkuZS4gdGhleSBiZWNvbWUgaGFyZCB0bworIyByZWFkKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX1RSQU5TUEFSRU5UICAgICAgICA9IE5PCisKKyMgU2V0IHRoZSBET1RfTVVMVElfVEFSR0VUUyB0YWcgdG8gWUVTIGFsbG93IGRvdCB0byBnZW5lcmF0ZSBtdWx0aXBsZSBvdXRwdXQKKyMgZmlsZXMgaW4gb25lIHJ1biAoaS5lLiBtdWx0aXBsZSAtbyBhbmQgLVQgb3B0aW9ucyBvbiB0aGUgY29tbWFuZCBsaW5lKS4gVGhpcworIyBtYWtlcyBkb3QgcnVuIGZhc3RlciwgYnV0IHNpbmNlIG9ubHkgbmV3ZXIgdmVyc2lvbnMgb2YgZG90ICg+MS44LjEwKSBzdXBwb3J0CisjIHRoaXMsIHRoaXMgZmVhdHVyZSBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfTVVMVElfVEFSR0VUUyAgICAgID0gTk8KKworIyBJZiB0aGUgR0VORVJBVEVfTEVHRU5EIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGxlZ2VuZCBwYWdlCisjIGV4cGxhaW5pbmcgdGhlIG1lYW5pbmcgb2YgdGhlIHZhcmlvdXMgYm94ZXMgYW5kIGFycm93cyBpbiB0aGUgZG90IGdlbmVyYXRlZAorIyBncmFwaHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitHRU5FUkFURV9MRUdFTkQgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIERPVF9DTEVBTlVQIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCByZW1vdmUgdGhlIGludGVybWVkaWF0ZSBkb3QKKyMgZmlsZXMgdGhhdCBhcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgdmFyaW91cyBncmFwaHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfQ0xFQU5VUCAgICAgICAgICAgID0gWUVTCmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL2RvYy9kb3h5Z2VuL2hlYWRlci50ZXggYi9maW5hbC9vZmZsb2FkL2RvYy9kb3h5Z2VuL2hlYWRlci50ZXgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWU5NjNjMgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvZG9jL2RveHlnZW4vaGVhZGVyLnRleApAQCAtMCwwICsxLDkwIEBACislIExhdGV4IGhlYWRlciBmb3IgZG94eWdlbiAxLjguMy4xDQorXGRvY3VtZW50Y2xhc3N7Ym9va30NCitcdXNlcGFja2FnZVthNHBhcGVyLHRvcD0yLjVjbSxib3R0b209Mi41Y20sbGVmdD0yLjVjbSxyaWdodD0yLjVjbV17Z2VvbWV0cnl9DQorXHVzZXBhY2thZ2V7bWFrZWlkeH0NCitcdXNlcGFja2FnZXtuYXRiaWJ9DQorXHVzZXBhY2thZ2V7Z3JhcGhpY3h9DQorXHVzZXBhY2thZ2V7bXVsdGljb2x9DQorXHVzZXBhY2thZ2V7ZmxvYXR9DQorXHVzZXBhY2thZ2V7bGlzdGluZ3N9DQorXHVzZXBhY2thZ2V7Y29sb3J9DQorXHVzZXBhY2thZ2V7aWZ0aGVufQ0KK1x1c2VwYWNrYWdlW3RhYmxlXXt4Y29sb3J9DQorXHVzZXBhY2thZ2V7dGV4dGNvbXB9DQorXHVzZXBhY2thZ2V7YWxsdHR9DQorXHVzZXBhY2thZ2V7aWZwZGZ9DQorXGlmcGRmDQorXHVzZXBhY2thZ2VbcGRmdGV4LA0KKyAgICAgICAgICAgIHBhZ2ViYWNrcmVmPXRydWUsDQorICAgICAgICAgICAgY29sb3JsaW5rcz10cnVlLA0KKyAgICAgICAgICAgIGxpbmtjb2xvcj1ibHVlLA0KKyAgICAgICAgICAgIHVuaWNvZGUNCisgICAgICAgICAgIF17aHlwZXJyZWZ9DQorXGVsc2UNCitcdXNlcGFja2FnZVtwczJwZGYsDQorICAgICAgICAgICAgcGFnZWJhY2tyZWY9dHJ1ZSwNCisgICAgICAgICAgICBjb2xvcmxpbmtzPXRydWUsDQorICAgICAgICAgICAgbGlua2NvbG9yPWJsdWUsDQorICAgICAgICAgICAgdW5pY29kZQ0KKyAgICAgICAgICAgXXtoeXBlcnJlZn0NCitcdXNlcGFja2FnZXtwc3BpY3R1cmV9DQorXGZpDQorXHVzZXBhY2thZ2VbdXRmOF17aW5wdXRlbmN9DQorXHVzZXBhY2thZ2V7bWF0aHB0bXh9DQorXHVzZXBhY2thZ2Vbc2NhbGVkPS45MF17aGVsdmV0fQ0KK1x1c2VwYWNrYWdle2NvdXJpZXJ9DQorXHVzZXBhY2thZ2V7c2VjdHN0eX0NCitcdXNlcGFja2FnZXthbXNzeW1ifQ0KK1x1c2VwYWNrYWdlW3RpdGxlc117dG9jbG9mdH0NCitcdXNlcGFja2FnZXtkb3h5Z2VufQ0KK1x1c2VwYWNrYWdle2ZhbmN5aGRyfQ0KK1xwYWdlc3R5bGV7ZmFuY3l9DQorXGxzdHNldHtsYW5ndWFnZT1DKyssaW5wdXRlbmNvZGluZz11dGY4LGJhc2ljc3R5bGU9XGZvb3Rub3Rlc2l6ZSxicmVha2xpbmVzPXRydWUsYnJlYWthdHdoaXRlc3BhY2U9dHJ1ZSx0YWJzaXplPTQsbnVtYmVycz1sZWZ0IH0NCitcbWFrZWluZGV4DQorXHNldGNvdW50ZXJ7dG9jZGVwdGh9ezN9DQorXHJlbmV3Y29tbWFuZHtcZm9vdHJ1bGV3aWR0aH17MC40cHR9DQorXHJlbmV3Y29tbWFuZHtcZmFtaWx5ZGVmYXVsdH17XHNmZGVmYXVsdH0NCitcaGZ1eno9MTVwdA0KK1xzZXRsZW5ndGh7XGVtZXJnZW5jeXN0cmV0Y2h9ezE1cHR9DQorXGhiYWRuZXNzPTc1MA0KK1x0b2xlcmFuY2U9NzUwDQorXGJlZ2lue2RvY3VtZW50fQ0KK1xoeXBlcnNldHVwe3BhZ2VhbmNob3I9ZmFsc2UsY2l0ZWNvbG9yPWJsdWV9DQorXGJlZ2lue3RpdGxlcGFnZX0NCitcdnNwYWNlKns3Y219DQorXGJlZ2lue2NlbnRlcn0NCit7XExhcmdlIEludGVsXHRleHRzdXBlcnNjcmlwdHtcdGV4dHJlZ2lzdGVyZWR9IE9mZmxvYWQgUnVudGltZSBMaWJyYXJ5IH1cXA0KK1x2c3BhY2UqezFjbX0NCit7XGxhcmdlIEdlbmVyYXRlZCBieSBEb3h5Z2VuICRkb3h5Z2VudmVyc2lvbiB9XFwNCitcdnNwYWNlKnswLjVjbX0NCit7XHNtYWxsICRkYXRldGltZSB9XFwNCitcZW5ke2NlbnRlcn0NCitcZW5ke3RpdGxlcGFnZX0NCisNCit7XGJmIEZUQyBPcHRpbWl6YXRpb24gTm90aWNlfQ0KKw0KK0ludGVsJ3MgY29tcGlsZXJzIG1heSBvciBtYXkgbm90IG9wdGltaXplIHRvIHRoZSBzYW1lIGRlZ3JlZSBmb3Igbm9uLUludGVsIG1pY3JvcHJvY2Vzc29ycyBmb3INCitvcHRpbWl6YXRpb25zIHRoYXQgYXJlIG5vdCB1bmlxdWUgdG8gSW50ZWwgbWljcm9wcm9jZXNzb3JzLiBUaGVzZSBvcHRpbWl6YXRpb25zIGluY2x1ZGUgU1NFMiwNCitTU0UzLCBhbmQgU1NTRTMgaW5zdHJ1Y3Rpb24gc2V0cyBhbmQgb3RoZXIgb3B0aW1pemF0aW9ucy4gSW50ZWwgZG9lcyBub3QgZ3VhcmFudGVlIHRoZQ0KK2F2YWlsYWJpbGl0eSwgZnVuY3Rpb25hbGl0eSwgb3IgZWZmZWN0aXZlbmVzcyBvZiBhbnkgb3B0aW1pemF0aW9uIG9uIG1pY3JvcHJvY2Vzc29ycyBub3QNCittYW51ZmFjdHVyZWQgYnkgSW50ZWwuDQorDQorTWljcm9wcm9jZXNzb3ItZGVwZW5kZW50IG9wdGltaXphdGlvbnMgaW4gdGhpcyBwcm9kdWN0IGFyZSBpbnRlbmRlZCBmb3IgdXNlIHdpdGggSW50ZWwNCittaWNyb3Byb2Nlc3NvcnMuIENlcnRhaW4gb3B0aW1pemF0aW9ucyBub3Qgc3BlY2lmaWMgdG8gSW50ZWwgbWljcm9hcmNoaXRlY3R1cmUgYXJlIHJlc2VydmVkIGZvcg0KK0ludGVsIG1pY3JvcHJvY2Vzc29ycy4gUGxlYXNlIHJlZmVyIHRvIHRoZSBhcHBsaWNhYmxlIHByb2R1Y3QgVXNlciBhbmQgUmVmZXJlbmNlIEd1aWRlcyBmb3INCittb3JlIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGUgc3BlY2lmaWMgaW5zdHJ1Y3Rpb24gc2V0cyBjb3ZlcmVkIGJ5IHRoaXMgbm90aWNlLg0KKw0KK05vdGljZSByZXZpc2lvbiBcIzIwMTEwODA0DQorDQorXHZzcGFjZSp7MC41Y219DQorDQore1xiZiBUcmFkZW1hcmtzfQ0KKw0KK0ludGVsLCBYZW9uLCBhbmQgSW50ZWwgWGVvbiBQaGkgYXJlIHRyYWRlbWFya3Mgb2YgSW50ZWwgQ29ycG9yYXRpb24gaW4gdGhlIFUuUy4gYW5kL29yIG90aGVyIGNvdW50cmllcy4NCisNCitUaGlzIGRvY3VtZW50IGlzIENvcHlyaWdodCBcdGV4dGNvcHlyaWdodCAyMDE0LCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gDQorDQorXHBhZ2VudW1iZXJpbmd7cm9tYW59DQorXHRhYmxlb2Zjb250ZW50cw0KK1xwYWdlbnVtYmVyaW5ne2FyYWJpY30NCitcaHlwZXJzZXR1cHtwYWdlYW5jaG9yPXRydWUsY2l0ZWNvbG9yPWJsdWV9DQpkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvY2Vhbl91dGlsLmNwcCBiL2ZpbmFsL29mZmxvYWQvc3JjL2NlYW5fdXRpbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUxODkwYgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL2NlYW5fdXRpbC5jcHAKQEAgLTAsMCArMSwzNDQgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImNlYW5fdXRpbC5oIgorI2luY2x1ZGUgIm9mZmxvYWRfY29tbW9uLmgiCisKKy8vIDEuIGFsbG9jYXRlIGVsZW1lbnQgb2YgQ2VhblJlYWRSYW5nZXMgdHlwZQorLy8gMi4gaW5pdGlhbGl6ZWQgaXQgZm9yIHJlYWRpbmcgY29uc2VxdWVudGx5IGNvbnRpZ3VvdXMgcmFuZ2VzCisvLyAgICBkZXNjcmliZWQgYnkgImFwIiBhcmd1bWVudAorQ2VhblJlYWRSYW5nZXMgKiBpbml0X3JlYWRfcmFuZ2VzX2Fycl9kZXNjKGNvbnN0IGFycl9kZXNjICphcCkKK3sKKyAgICBDZWFuUmVhZFJhbmdlcyAqIHJlczsKKworICAgIC8vIGZpbmQgdGhlIG1heCBjb250aWd1b3VzIHJhbmdlCisgICAgaW50NjRfdCByYW5rID0gYXAtPnJhbmsgLSAxOworICAgIGludDY0X3QgbGVuZ3RoID0gYXAtPmRpbVtyYW5rXS5zaXplOworICAgIGZvciAoOyByYW5rID49IDA7IHJhbmstLSkgeworICAgICAgICBpZiAoYXAtPmRpbVtyYW5rXS5zdHJpZGUgPT0gMSkgeworICAgICAgICAgICAgbGVuZ3RoICo9IChhcC0+ZGltW3JhbmtdLnVwcGVyIC0gYXAtPmRpbVtyYW5rXS5sb3dlciArIDEpOworICAgICAgICAgICAgaWYgKHJhbmsgPiAwICYmIGxlbmd0aCAhPSBhcC0+ZGltW3JhbmsgLSAxXS5zaXplKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJlcyA9KENlYW5SZWFkUmFuZ2VzICopbWFsbG9jKHNpemVvZihDZWFuUmVhZFJhbmdlcykgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhcC0+cmFuayAtIHJhbmspICogc2l6ZW9mKENlYW5SZWFkRGltKSk7CisgICAgcmVzLT5jdXJyZW50X251bWJlciA9IDA7CisgICAgcmVzLT5yYW5nZV9zaXplID0gbGVuZ3RoOworICAgIHJlcy0+bGFzdF9ub25jb250X2luZCA9IHJhbms7CisKKyAgICAvLyBjYWxjdWxhdGUgbnVtYmVyIG9mIGNvbnRpZ3VvdXMgcmFuZ2VzIGluc2lkZSBub25jb250aWd1b3VzIGRpbWVuc2lvbnMKKyAgICBpbnQgY291bnQgPSAxOworICAgIGJvb2wgcHJldl9pc19jb250ID0gdHJ1ZTsKKyAgICBpbnQ2NF90IG9mZnNldCA9IDA7CisKKyAgICBmb3IgKDsgcmFuayA+PSAwOyByYW5rLS0pIHsKKyAgICAgICAgcmVzLT5EaW1bcmFua10uY291bnQgPSBjb3VudDsKKyAgICAgICAgcmVzLT5EaW1bcmFua10uc2l6ZSA9IGFwLT5kaW1bcmFua10uc3RyaWRlICogYXAtPmRpbVtyYW5rXS5zaXplOworICAgICAgICBjb3VudCAqPSAocHJldl9pc19jb250ICYmIGFwLT5kaW1bcmFua10uc3RyaWRlID09IDE/IDEgOgorICAgICAgICAgICAgKGFwLT5kaW1bcmFua10udXBwZXIgLSBhcC0+ZGltW3JhbmtdLmxvd2VyICsKKyAgICAgICAgICAgIGFwLT5kaW1bcmFua10uc3RyaWRlKSAvIGFwLT5kaW1bcmFua10uc3RyaWRlKTsKKyAgICAgICAgcHJldl9pc19jb250ID0gZmFsc2U7CisgICAgICAgIG9mZnNldCArPShhcC0+ZGltW3JhbmtdLmxvd2VyIC0gYXAtPmRpbVtyYW5rXS5saW5kZXgpICoKKyAgICAgICAgICAgICAgICAgYXAtPmRpbVtyYW5rXS5zaXplOworICAgIH0KKyAgICByZXMtPnJhbmdlX21heF9udW1iZXIgPSBjb3VudDsKKyAgICByZXMgLT4gcHRyID0gKHZvaWQqKWFwLT5iYXNlOworICAgIHJlcyAtPiBpbml0X29mZnNldCA9IG9mZnNldDsKKyAgICByZXR1cm4gcmVzOworfQorCisvLyBjaGVjayBpZiByYW5nZXMgZGVzY3JpYmVkIGJ5IDEgYXJndW1lbnQgY291bGQgYmUgdHJhbnNmZXJyZWQgaW50byByYW5nZXMKKy8vIGRlc2NyaWJlZCBieSAyLW5kIG9uZQorYm9vbCBjZWFuX3Jhbmdlc19tYXRjaCgKKyAgICBDZWFuUmVhZFJhbmdlcyAqIHJlYWRfcm5nMSwKKyAgICBDZWFuUmVhZFJhbmdlcyAqIHJlYWRfcm5nMgorKQoreworICAgIHJldHVybiAoIHJlYWRfcm5nMSA9PSBOVUxMIHx8IHJlYWRfcm5nMiA9PSBOVUxMIHx8CisgICAgICAgICAgICAocmVhZF9ybmcxLT5yYW5nZV9zaXplICUgcmVhZF9ybmcyLT5yYW5nZV9zaXplID09IDAgfHwKKyAgICAgICAgICAgIHJlYWRfcm5nMi0+cmFuZ2Vfc2l6ZSAlIHJlYWRfcm5nMS0+cmFuZ2Vfc2l6ZSA9PSAwKSk7Cit9CisKKy8vIFNldCBuZXh0IG9mZnNldCBhbmQgbGVuZ3RoIGFuZCByZXR1cm5zIHRydWUgZm9yIG5leHQgcmFuZ2UuCisvLyBSZXR1cm5zIGZhbHNlIGlmIHRoZSByYW5nZXMgYXJlIG92ZXIuCitib29sIGdldF9uZXh0X3JhbmdlKAorICAgIENlYW5SZWFkUmFuZ2VzICogcmVhZF9ybmcsCisgICAgaW50NjRfdCAqb2Zmc2V0CispCit7CisgICAgaWYgKCsrcmVhZF9ybmctPmN1cnJlbnRfbnVtYmVyID4gcmVhZF9ybmctPnJhbmdlX21heF9udW1iZXIpIHsKKyAgICAgICAgcmVhZF9ybmctPmN1cnJlbnRfbnVtYmVyID0gMDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpbnQgcmFuayA9IDA7CisgICAgaW50IG51bSA9IHJlYWRfcm5nLT5jdXJyZW50X251bWJlciAtIDE7CisgICAgaW50NjRfdCBjdXJfb2Zmc2V0ID0gMDsKKyAgICBpbnQgbnVtX2xvYzsKKyAgICBmb3IgKDsgcmFuayA8PSByZWFkX3JuZy0+bGFzdF9ub25jb250X2luZDsgcmFuaysrKSB7CisgICAgICAgIG51bV9sb2MgPSBudW0gLyByZWFkX3JuZy0+RGltW3JhbmtdLmNvdW50OworICAgICAgICBjdXJfb2Zmc2V0ICs9IG51bV9sb2MgKiByZWFkX3JuZy0+RGltW3JhbmtdLnNpemU7CisgICAgICAgIG51bSA9IG51bSAlIHJlYWRfcm5nLT5EaW1bcmFua10uY291bnQ7CisgICAgfQorICAgICpvZmZzZXQgPSBjdXJfb2Zmc2V0ICsgcmVhZF9ybmctPmluaXRfb2Zmc2V0OworICAgIHJldHVybiB0cnVlOworfQorCitib29sIGlzX2Fycl9kZXNjX2NvbnRpZ3VvdXMoY29uc3QgYXJyX2Rlc2MgKmFwKQoreworICAgIGludDY0X3QgcmFuayA9IGFwLT5yYW5rIC0gMTsKKyAgICBpbnQ2NF90IGxlbmd0aCA9IGFwLT5kaW1bcmFua10uc2l6ZTsKKyAgICBmb3IgKDsgcmFuayA+PSAwOyByYW5rLS0pIHsKKyAgICAgICAgaWYgKGFwLT5kaW1bcmFua10uc3RyaWRlID4gMSAmJgorICAgICAgICAgICAgYXAtPmRpbVtyYW5rXS51cHBlciAtIGFwLT5kaW1bcmFua10ubG93ZXIgIT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChsZW5ndGggIT0gYXAtPmRpbVtyYW5rXS5zaXplKSB7CisgICAgICAgICAgICBmb3IgKDsgcmFuayA+PSAwOyByYW5rLS0pIHsKKyAgICAgICAgICAgICAgICBpZiAoYXAtPmRpbVtyYW5rXS51cHBlciAtIGFwLT5kaW1bcmFua10ubG93ZXIgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgbGVuZ3RoICo9IChhcC0+ZGltW3JhbmtdLnVwcGVyIC0gYXAtPmRpbVtyYW5rXS5sb3dlciArIDEpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworaW50NjRfdCBjZWFuX2dldF90cmFuc2Zfc2l6ZShDZWFuUmVhZFJhbmdlcyAqIHJlYWRfcm5nKQoreworICAgIHJldHVybihyZWFkX3JuZy0+cmFuZ2VfbWF4X251bWJlciAqIHJlYWRfcm5nLT5yYW5nZV9zaXplKTsKK30KKworc3RhdGljIHVpbnQ2NF90IGxhc3RfbGVmdCwgbGFzdF9yaWdodDsKK3R5cGVkZWYgdm9pZCAoKmZwcCkoY29uc3QgY2hhciAqc3BhY2VzLCB1aW50NjRfdCBsb3csIHVpbnQ2NF90IGhpZ2gsIGludCBlc2l6ZSk7CisKK3N0YXRpYyB2b2lkIGdlbmVyYXRlX29uZV9yYW5nZSgKKyAgICBjb25zdCBjaGFyICpzcGFjZXMsCisgICAgdWludDY0X3QgbHJhbmdlLAorICAgIHVpbnQ2NF90IHJyYW5nZSwKKyAgICBmcHAgZnAsCisgICAgaW50IGVzaXplCispCit7CisgICAgT0ZGTE9BRF9UUkFDRSgzLAorICAgICAgICAiJXMgICAgZ2VuZXJhdGVfb25lX3JhbmdlKGxyYW5nZT0lcCwgcnJhbmdlPSVwLCBlc2l6ZT0lZClcbiIsCisgICAgICAgIHNwYWNlcywgKHZvaWQqKWxyYW5nZSwgKHZvaWQqKXJyYW5nZSwgZXNpemUpOworICAgIGlmIChsYXN0X2xlZnQgPT0gLTEpIHsKKyAgICAgICAgLy8gRmlyc3QgcmFuZ2UKKyAgICAgICAgbGFzdF9sZWZ0ID0gbHJhbmdlOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKGxyYW5nZSA9PSBsYXN0X3JpZ2h0KzEpIHsKKyAgICAgICAgICAgIC8vIEV4dGVuZCBwcmV2aW91cyByYW5nZSwgZG9uJ3QgcHJpbnQKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICgqZnApKHNwYWNlcywgbGFzdF9sZWZ0LCBsYXN0X3JpZ2h0LCBlc2l6ZSk7CisgICAgICAgICAgICBsYXN0X2xlZnQgPSBscmFuZ2U7CisgICAgICAgIH0KKyAgICB9CisgICAgbGFzdF9yaWdodCA9IHJyYW5nZTsKK30KKworc3RhdGljIHZvaWQgZ2VuZXJhdGVfbWVtX3Jhbmdlc19vbmVfcmFuaygKKyAgICBjb25zdCBjaGFyICpzcGFjZXMsCisgICAgdWludDY0X3QgYmFzZSwKKyAgICB1aW50NjRfdCByYW5rLAorICAgIGNvbnN0IHN0cnVjdCBkaW1fZGVzYyAqZGRwLAorICAgIGZwcCBmcCwKKyAgICBpbnQgZXNpemUKKykKK3sKKyAgICB1aW50NjRfdCBsaW5kZXggPSBkZHAtPmxpbmRleDsKKyAgICB1aW50NjRfdCBsb3dlciA9IGRkcC0+bG93ZXI7CisgICAgdWludDY0X3QgdXBwZXIgPSBkZHAtPnVwcGVyOworICAgIHVpbnQ2NF90IHN0cmlkZSA9IGRkcC0+c3RyaWRlOworICAgIHVpbnQ2NF90IHNpemUgPSBkZHAtPnNpemU7CisgICAgT0ZGTE9BRF9UUkFDRSgzLAorICAgICAgICAiJXMgICAgIgorICAgICAgICAiZ2VuZXJhdGVfbWVtX3Jhbmdlc19vbmVfcmFuayhiYXNlPSVwLCByYW5rPSVsbGQsIGxpbmRleD0lbGxkLCAiCisgICAgICAgICJsb3dlcj0lbGxkLCB1cHBlcj0lbGxkLCBzdHJpZGU9JWxsZCwgc2l6ZT0lbGxkLCBlc2l6ZT0lZClcbiIsCisgICAgICAgIHNwYWNlcywgKHZvaWQqKWJhc2UsIHJhbmssIGxpbmRleCwgbG93ZXIsIHVwcGVyLCBzdHJpZGUsIHNpemUsIGVzaXplKTsKKyAgICBpZiAocmFuayA9PSAxKSB7CisgICAgICAgIHVpbnQ2NF90IGxyYW5nZSwgcnJhbmdlOworICAgICAgICBpZiAoc3RyaWRlID09IDEpIHsKKyAgICAgICAgICAgIGxyYW5nZSA9IGJhc2UgKyAobG93ZXItbGluZGV4KSpzaXplOworICAgICAgICAgICAgcnJhbmdlID0gbHJhbmdlICsgKHVwcGVyLWxvd2VyKzEpKnNpemUgLSAxOworICAgICAgICAgICAgZ2VuZXJhdGVfb25lX3JhbmdlKHNwYWNlcywgbHJhbmdlLCBycmFuZ2UsIGZwLCBlc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBmb3IgKGludCBpPWxvd2VyLWxpbmRleDsgaTw9dXBwZXItbGluZGV4OyBpKz1zdHJpZGUpIHsKKyAgICAgICAgICAgICAgICBscmFuZ2UgPSBiYXNlICsgaSpzaXplOworICAgICAgICAgICAgICAgIHJyYW5nZSA9IGxyYW5nZSArIHNpemUgLSAxOworICAgICAgICAgICAgICAgIGdlbmVyYXRlX29uZV9yYW5nZShzcGFjZXMsIGxyYW5nZSwgcnJhbmdlLCBmcCwgZXNpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBmb3IgKGludCBpPWxvd2VyLWxpbmRleDsgaTw9dXBwZXItbGluZGV4OyBpKz1zdHJpZGUpIHsKKyAgICAgICAgICAgIGdlbmVyYXRlX21lbV9yYW5nZXNfb25lX3JhbmsoCisgICAgICAgICAgICAgICAgc3BhY2VzLCBiYXNlK2kqc2l6ZSwgcmFuay0xLCBkZHArMSwgZnAsIGVzaXplKTsKKworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBnZW5lcmF0ZV9tZW1fcmFuZ2VzKAorICAgIGNvbnN0IGNoYXIgKnNwYWNlcywKKyAgICBjb25zdCBhcnJfZGVzYyAqYWRwLAorICAgIGJvb2wgZGVyZWYsCisgICAgZnBwIGZwCispCit7CisgICAgdWludDY0X3QgZXNpemU7CisKKyAgICBPRkZMT0FEX1RSQUNFKDMsCisgICAgICAgICIlcyAgICAiCisgICAgICAgICJnZW5lcmF0ZV9tZW1fcmFuZ2VzKGFkcD0lcCwgZGVyZWY9JWQsIGZwKVxuIiwKKyAgICAgICAgc3BhY2VzLCBhZHAsIGRlcmVmKTsKKyAgICBsYXN0X2xlZnQgPSAtMTsKKyAgICBsYXN0X3JpZ2h0ID0gLTI7CisKKyAgICAvLyBFbGVtZW50IHNpemUgaXMgZGVyaXZlZCBmcm9tIGxhc3QgZGltZW5zaW9uCisgICAgZXNpemUgPSBhZHAtPmRpbVthZHAtPnJhbmstMV0uc2l6ZTsKKworICAgIGdlbmVyYXRlX21lbV9yYW5nZXNfb25lX3JhbmsoCisgICAgICAgIC8vIEZvciBjX2NlYW5fdmFyIHRoZSBiYXNlIGFkZHIgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGRhdGEKKyAgICAgICAgLy8gRm9yIGNfY2Vhbl92YXJfcHRyIHRoZSBiYXNlIGFkZHIgaXMgZGVyZWZlcmVuY2VkIHRvIGdldCB0byB0aGUgZGF0YQorICAgICAgICBzcGFjZXMsIGRlcmVmID8gKigodWludDY0X3QqKShhZHAtPmJhc2UpKSA6IGFkcC0+YmFzZSwKKyAgICAgICAgYWRwLT5yYW5rLCAmYWRwLT5kaW1bMF0sIGZwLCBlc2l6ZSk7CisgICAgKCpmcCkoc3BhY2VzLCBsYXN0X2xlZnQsIGxhc3RfcmlnaHQsIGVzaXplKTsKK30KKworLy8gcmV0dXJucyBvZmZzZXQgYW5kIGxlbmd0aCBvZiB0aGUgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZAordm9pZCBfX2Fycl9kYXRhX29mZnNldF9hbmRfbGVuZ3RoKAorICAgIGNvbnN0IGFycl9kZXNjICphZHAsCisgICAgaW50NjRfdCAmb2Zmc2V0LAorICAgIGludDY0X3QgJmxlbmd0aAorKQoreworICAgIGludDY0X3QgcmFuayA9IGFkcC0+cmFuayAtIDE7CisgICAgaW50NjRfdCBzaXplID0gYWRwLT5kaW1bcmFua10uc2l6ZTsKKyAgICBpbnQ2NF90IHJfb2ZmID0gMDsgLy8gb2Zmc2V0IGZyb20gcmlnaHQgYm91bmRhcnkKKworICAgIC8vIGZpbmQgdGhlIHJpZ2h0bW9zdCBkaW1lbnNpb24gd2hpY2ggdGFrZXMganVzdCBwYXJ0IG9mIGl0cworICAgIC8vIHJhbmdlLiBXZSBkZWZpbmUgaXQgaWYgdGhlIHNpemUgb2YgbGVmdCByYW5rIGlzIG5vdCBlcXVhbAorICAgIC8vIHRoZSByYW5nZSdzIGxlbmd0aCBiZXR3ZWVuIHVwcGVyIGFuZCBsb3dlciBib3VuZ2FyaWVzCisgICAgd2hpbGUgKHJhbmsgPiAwKSB7CisgICAgICAgIHNpemUgKj0gKGFkcC0+ZGltW3JhbmtdLnVwcGVyIC0gYWRwLT5kaW1bcmFua10ubG93ZXIgKyAxKTsKKyAgICAgICAgaWYgKHNpemUgIT0gYWRwLT5kaW1bcmFuayAtIDFdLnNpemUpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJhbmstLTsKKyAgICB9CisKKyAgICBvZmZzZXQgPSAoYWRwLT5kaW1bcmFua10ubG93ZXIgLSBhZHAtPmRpbVtyYW5rXS5saW5kZXgpICoKKyAgICAgICAgICAgICBhZHAtPmRpbVtyYW5rXS5zaXplOworCisgICAgLy8gZmluZCBnYXBzIGJvdGggZnJvbSB0aGUgbGVmdCAtIG9mZnNldCBhbmQgZnJvbSB0aGUgcmlnaHQgLSByX29mZgorICAgIGZvciAocmFuay0tOyByYW5rID49IDA7IHJhbmstLSkgeworICAgICAgICBvZmZzZXQgKz0gKGFkcC0+ZGltW3JhbmtdLmxvd2VyIC0gYWRwLT5kaW1bcmFua10ubGluZGV4KSAqCisgICAgICAgICAgICAgICAgICBhZHAtPmRpbVtyYW5rXS5zaXplOworICAgICAgICByX29mZiArPSBhZHAtPmRpbVtyYW5rXS5zaXplIC0KKyAgICAgICAgICAgICAgICAgKGFkcC0+ZGltW3JhbmsgKyAxXS51cHBlciAtIGFkcC0+ZGltW3JhbmsgKyAxXS5saW5kZXggKyAxKSAqCisgICAgICAgICAgICAgICAgIGFkcC0+ZGltW3JhbmsgKyAxXS5zaXplOworICAgIH0KKyAgICBsZW5ndGggPSAoYWRwLT5kaW1bMF0udXBwZXIgLSBhZHAtPmRpbVswXS5saW5kZXggKyAxKSAqCisgICAgICAgICAgICAgYWRwLT5kaW1bMF0uc2l6ZSAtIG9mZnNldCAtIHJfb2ZmOworfQorCisjaWYgT0ZGTE9BRF9ERUJVRyA+IDAKKwordm9pZCBwcmludF9yYW5nZSgKKyAgICBjb25zdCBjaGFyICpzcGFjZXMsCisgICAgdWludDY0X3QgbG93LAorICAgIHVpbnQ2NF90IGhpZ2gsCisgICAgaW50IGVzaXplCispCit7CisgICAgY2hhciBidWZmZXJbMTAyNF07CisgICAgY2hhciBudW1iZXJbMzJdOworCisgICAgT0ZGTE9BRF9UUkFDRSgzLCAiJXMgICAgICAgIHByaW50X3JhbmdlKGxvdz0lcCwgaGlnaD0lcCwgZXNpemU9JWQpXG4iLAorICAgICAgICBzcGFjZXMsICh2b2lkKilsb3csICh2b2lkKiloaWdoLCBlc2l6ZSk7CisKKyAgICBpZiAoY29uc29sZV9lbmFibGVkIDwgNCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIE9GRkxPQURfVFJBQ0UoNCwgIiVzICAgICAgICAgICAgdmFsdWVzOlxuIiwgc3BhY2VzKTsKKyAgICBpbnQgY291bnQgPSAwOworICAgIGJ1ZmZlclswXSA9ICdcMCc7CisgICAgd2hpbGUgKGxvdyA8PSBoaWdoKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChlc2l6ZSkKKyAgICAgICAgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBzcHJpbnRmKG51bWJlciwgIiVkICIsICooKGNoYXIgKilsb3cpKTsKKyAgICAgICAgICAgIGxvdyArPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHNwcmludGYobnVtYmVyLCAiJWQgIiwgKigoc2hvcnQgKilsb3cpKTsKKyAgICAgICAgICAgIGxvdyArPSAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIHNwcmludGYobnVtYmVyLCAiJWQgIiwgKigoaW50ICopbG93KSk7CisgICAgICAgICAgICBsb3cgKz0gNDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgc3ByaW50ZihudW1iZXIsICIweCUwMTZ4ICIsICooKHVpbnQ2NF90ICopbG93KSk7CisgICAgICAgICAgICBsb3cgKz0gODsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHN0cmNhdChidWZmZXIsIG51bWJlcik7CisgICAgICAgIGNvdW50Kys7CisgICAgICAgIGlmIChjb3VudCA9PSAxMCkgeworICAgICAgICAgICAgT0ZGTE9BRF9UUkFDRSg0LCAiJXMgICAgICAgICAgICAlc1xuIiwgc3BhY2VzLCBidWZmZXIpOworICAgICAgICAgICAgY291bnQgPSAwOworICAgICAgICAgICAgYnVmZmVyWzBdID0gJ1wwJzsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoY291bnQgIT0gMCkgeworICAgICAgICBPRkZMT0FEX1RSQUNFKDQsICIlcyAgICAgICAgICAgICVzXG4iLCBzcGFjZXMsIGJ1ZmZlcik7CisgICAgfQorfQorCit2b2lkIF9fYXJyX2Rlc2NfZHVtcCgKKyAgICBjb25zdCBjaGFyICpzcGFjZXMsCisgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICBjb25zdCBhcnJfZGVzYyAqYWRwLAorICAgIGJvb2wgZGVyZWYKKykKK3sKKyAgICBPRkZMT0FEX1RSQUNFKDIsICIlcyVzIENFQU4gZXhwcmVzc2lvbiAlcFxuIiwgc3BhY2VzLCBuYW1lLCBhZHApOworCisgICAgaWYgKGFkcCAhPSAwKSB7CisgICAgICAgIE9GRkxPQURfVFJBQ0UoMiwgIiVzICAgIGJhc2U9JWxseCwgcmFuaz0lbGxkXG4iLAorICAgICAgICAgICAgc3BhY2VzLCBhZHAtPmJhc2UsIGFkcC0+cmFuayk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhZHAtPnJhbms7IGkrKykgeworICAgICAgICAgICAgT0ZGTE9BRF9UUkFDRSgyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgICAgZGltZW5zaW9uICVkOiBzaXplPSVsbGQsIGxpbmRleD0lbGxkLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJsb3dlcj0lbGxkLCB1cHBlcj0lbGxkLCBzdHJpZGU9JWxsZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2VzLCBpLCBhZHAtPmRpbVtpXS5zaXplLCBhZHAtPmRpbVtpXS5saW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFkcC0+ZGltW2ldLmxvd2VyLCBhZHAtPmRpbVtpXS51cHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYWRwLT5kaW1baV0uc3RyaWRlKTsKKyAgICAgICAgfQorICAgICAgICAvLyBGb3IgY19jZWFuX3ZhciB0aGUgYmFzZSBhZGRyIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBkYXRhCisgICAgICAgIC8vIEZvciBjX2NlYW5fdmFyX3B0ciB0aGUgYmFzZSBhZGRyIGlzIGRlcmVmZXJlbmNlZCB0byBnZXQgdG8gdGhlIGRhdGEKKyAgICAgICAgZ2VuZXJhdGVfbWVtX3JhbmdlcyhzcGFjZXMsIGFkcCwgZGVyZWYsICZwcmludF9yYW5nZSk7CisgICAgfQorfQorI2VuZGlmIC8vIE9GRkxPQURfREVCVUcKZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL2NlYW5fdXRpbC5oIGIvZmluYWwvb2ZmbG9hZC9zcmMvY2Vhbl91dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBkZWJjYwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL2NlYW5fdXRpbC5oCkBAIC0wLDAgKzEsMTAxIEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgQ0VBTl9VVElMX0hfSU5DTFVERUQKKyNkZWZpbmUgQ0VBTl9VVElMX0hfSU5DTFVERUQKKworI2lmIE1QU1NfVkVSU0lPTiA+IDMzCisjaW5jbHVkZSA8c291cmNlL0NPSUJ1ZmZlcl9zb3VyY2UuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaWYgTVBTU19WRVJTSU9OIDw9IDMzCisvLyBDRUFOIGV4cHJlc3Npb24gcmVwcmVzZW50YXRpb24KK3N0cnVjdCBkaW1fZGVzYyB7CisgICAgaW50NjRfdCBzaXplOyAgICAgICAvLyBMZW5ndGggb2YgZGF0YSB0eXBlCisgICAgaW50NjRfdCBsaW5kZXg7ICAgICAvLyBMb3dlciBpbmRleAorICAgIGludDY0X3QgbG93ZXI7ICAgICAgLy8gTG93ZXIgc2VjdGlvbiBib3VuZAorICAgIGludDY0X3QgdXBwZXI7ICAgICAgLy8gVXBwZXIgc2VjdGlvbiBib3VuZAorICAgIGludDY0X3Qgc3RyaWRlOyAgICAgLy8gU3RyaWRlCit9OworCitzdHJ1Y3QgYXJyX2Rlc2MgeworICAgIGludDY0X3QgYmFzZTsgICAgICAgLy8gQmFzZSBhZGRyZXNzCisgICAgaW50NjRfdCByYW5rOyAgICAgICAvLyBSYW5rIG9mIGFycmF5CisgICAgZGltX2Rlc2MgZGltWzFdOworfTsKKyNlbmRpZgorCitzdHJ1Y3QgQ2VhblJlYWREaW0geworICAgIGludDY0X3QgY291bnQ7IC8vIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBkaW1lbnNpb24KKyAgICBpbnQ2NF90IHNpemU7ICAvLyBUaGUgbnVtYmVyIG9mIGJ5dGVzIGJldHdlZW4gc3VjY2Vzc2l2ZQorICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnRzIGluIHRoaXMgZGltZW5zaW9uLgorfTsKKworc3RydWN0IENlYW5SZWFkUmFuZ2VzIHsKKyAgICB2b2lkICogIHB0cjsKKyAgICBpbnQ2NF90IGN1cnJlbnRfbnVtYmVyOyAgIC8vIHRoZSBudW1iZXIgb2YgcmFuZ2VzIHJlYWQKKyAgICBpbnQ2NF90IHJhbmdlX21heF9udW1iZXI7IC8vIG51bWJlciBvZiBjb250aWd1b3VzIHJhbmdlcworICAgIGludDY0X3QgcmFuZ2Vfc2l6ZTsgICAgICAgLy8gc2l6ZSBvZiBtYXggY29udGlndW91cyByYW5nZQorICAgIGludCAgICAgbGFzdF9ub25jb250X2luZDsgLy8gc2l6ZSBvZiBEaW0gYXJyYXkKKyAgICBpbnQ2NF90IGluaXRfb2Zmc2V0OyAgICAgIC8vIG9mZnNldCBvZiAxLXN0IGVsZW1lbnQgZnJvbSBhcnJheSBsZWZ0IGJvdW5kCisgICAgQ2VhblJlYWREaW0gRGltWzFdOworfTsKKworLy8gYXJyYXkgZGVzY3JpcHRvciBsZW5ndGgKKyNkZWZpbmUgX19hcnJfZGVzY19sZW5ndGgocmFuaykgXAorICAgIChzaXplb2YoaW50NjRfdCkgKyBzaXplb2YoZGltX2Rlc2MpICogKHJhbmspKQorCisvLyByZXR1cm5zIG9mZnNldCBhbmQgbGVuZ3RoIG9mIHRoZSBkYXRhIHRvIGJlIHRyYW5zZmVycmVkCit2b2lkIF9fYXJyX2RhdGFfb2Zmc2V0X2FuZF9sZW5ndGgoY29uc3QgYXJyX2Rlc2MgKmFkcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICZvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAmbGVuZ3RoKTsKKworLy8gZGVmaW5lIGlmIGRhdGEgYXJyYXkgZGVzY3JpYmVkIGJ5IGFyZ3VtZW50IGlzIGNvbnRpZ3VvdXMgb25lCitib29sIGlzX2Fycl9kZXNjX2NvbnRpZ3VvdXMoY29uc3QgYXJyX2Rlc2MgKmFwKTsKKworLy8gYWxsb2NhdGUgZWxlbWVudCBvZiBDZWFuUmVhZFJhbmdlcyB0eXBlIGluaXRpYWxpemVkCisvLyB0byByZWFkIGNvbnNlcXVlbnRseSBjb250aWd1b3VzIHJhbmdlcyBkZXNjcmliZWQgYnkgImFwIiBhcmd1bWVudAorQ2VhblJlYWRSYW5nZXMgKiBpbml0X3JlYWRfcmFuZ2VzX2Fycl9kZXNjKGNvbnN0IGFycl9kZXNjICphcCk7CisKKy8vIGNoZWNrIGlmIHJhbmdlcyBkZXNjcmliZWQgYnkgMSBhcmd1bWVudCBjb3VsZCBiZSB0cmFuc2ZlcnJlZCBpbnRvIHJhbmdlcworLy8gZGVzY3JpYmVkIGJ5IDItbmQgb25lCitib29sIGNlYW5fcmFuZ2VzX21hdGNoKAorICAgIENlYW5SZWFkUmFuZ2VzICogcmVhZF9ybmcxLAorICAgIENlYW5SZWFkUmFuZ2VzICogcmVhZF9ybmcyCispOworCisvLyBmaXJzdCBhcmd1bWVudCAtIHJldHVybmVkIHZhbHVlIGJ5IGNhbGwgdG8gaW5pdF9yZWFkX3Jhbmdlc19hcnJfZGVzYy4KKy8vIHJldHVybnMgdHJ1ZSBpZiBvZmZzZXQgYW5kIGxlbmd0aCBvZiBuZXh0IHJhbmdlIGlzIHNldCBzdWNjZXNzZnVseS4KKy8vIHJldHVybnMgZmFsc2UgaWYgdGhlIHJhbmdlcyBpcyBvdmVyLgorYm9vbCBnZXRfbmV4dF9yYW5nZSgKKyAgICBDZWFuUmVhZFJhbmdlcyAqIHJlYWRfcm5nLAorICAgIGludDY0X3QgKm9mZnNldAorKTsKKworLy8gcmV0dXJucyBudW1iZXIgb2YgdHJhbnNmZXJyZWQgYnl0ZXMKK2ludDY0X3QgY2Vhbl9nZXRfdHJhbnNmX3NpemUoQ2VhblJlYWRSYW5nZXMgKiByZWFkX3JuZyk7CisKKyNpZiBPRkZMT0FEX0RFQlVHID4gMAorLy8gcHJpbnRzIGFycmF5IGRlc2NyaXB0b3IgY29udGVudHMgdG8gc3RkZXJyCit2b2lkICAgIF9fYXJyX2Rlc2NfZHVtcCgKKyAgICBjb25zdCBjaGFyICpzcGFjZXMsCisgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICBjb25zdCBhcnJfZGVzYyAqYWRwLAorICAgIGJvb2wgZGVyZWZlcmVuY2UpOworI2Vsc2UKKyNkZWZpbmUgX19hcnJfZGVzY19kdW1wKAorICAgIHNwYWNlcywKKyAgICBuYW1lLAorICAgIGFkcCwKKyAgICBkZXJlZmVyZW5jZSkKKyNlbmRpZiAvLyBPRkZMT0FEX0RFQlVHCisKKyNlbmRpZiAvLyBDRUFOX1VUSUxfSF9JTkNMVURFRApkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvY29pL2NvaV9jbGllbnQuY3BwIGIvZmluYWwvb2ZmbG9hZC9zcmMvY29pL2NvaV9jbGllbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiOGM3ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9jb2kvY29pX2NsaWVudC5jcHAKQEAgLTAsMCArMSwzNTAgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLy8gVGhlIENPSSBob3N0IGludGVyZmFjZQorCisjaW5jbHVkZSAiY29pX2NsaWVudC5oIgorI2luY2x1ZGUgIi4uL29mZmxvYWRfY29tbW9uLmgiCisKK25hbWVzcGFjZSBDT0kgeworCisjZGVmaW5lIENPSV9WRVJTSU9OMSAgICAiQ09JXzEuMCIKKyNkZWZpbmUgQ09JX1ZFUlNJT04yICAgICJDT0lfMi4wIgorCitib29sICAgICAgICAgICAgaXNfYXZhaWxhYmxlOworc3RhdGljIHZvaWQqICAgIGxpYl9oYW5kbGU7CisKKy8vIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucyBmcm9tIENPSSBsaWJyYXJ5CitDT0lSRVNVTFQgKCpFbmdpbmVHZXRDb3VudCkoQ09JX0lTQV9UWVBFLCB1aW50MzJfdCopOworQ09JUkVTVUxUICgqRW5naW5lR2V0SGFuZGxlKShDT0lfSVNBX1RZUEUsIHVpbnQzMl90LCBDT0lFTkdJTkUqKTsKKworQ09JUkVTVUxUICgqUHJvY2Vzc0NyZWF0ZUZyb21NZW1vcnkpKENPSUVOR0lORSwgY29uc3QgY2hhciosIGNvbnN0IHZvaWQqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90LCBpbnQsIGNvbnN0IGNoYXIqKiwgdWludDhfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiosIHVpbnQ4X3QsIGNvbnN0IGNoYXIqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QsIENPSVBST0NFU1MqKTsKK0NPSVJFU1VMVCAoKlByb2Nlc3NEZXN0cm95KShDT0lQUk9DRVNTLCBpbnQzMl90LCB1aW50OF90LCBpbnQ4X3QqLCB1aW50MzJfdCopOworQ09JUkVTVUxUICgqUHJvY2Vzc0dldEZ1bmN0aW9uSGFuZGxlcykoQ09JUFJPQ0VTUywgdWludDMyX3QsIGNvbnN0IGNoYXIqKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSUZVTkNUSU9OKik7CitDT0lSRVNVTFQgKCpQcm9jZXNzTG9hZExpYnJhcnlGcm9tTWVtb3J5KShDT0lQUk9DRVNTLCBjb25zdCB2b2lkKiwgdWludDY0X3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiwgdWludDY0X3QsIHVpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JTElCUkFSWSopOworQ09JUkVTVUxUICgqUHJvY2Vzc1JlZ2lzdGVyTGlicmFyaWVzKSh1aW50MzJfdCwgY29uc3Qgdm9pZCoqLCBjb25zdCB1aW50NjRfdCosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqKiwgY29uc3QgdWludDY0X3QqKTsKKworQ09JUkVTVUxUICgqUGlwZWxpbmVDcmVhdGUpKENPSVBST0NFU1MsIENPSV9DUFVfTUFTSywgdWludDMyX3QsIENPSVBJUEVMSU5FKik7CitDT0lSRVNVTFQgKCpQaXBlbGluZURlc3Ryb3kpKENPSVBJUEVMSU5FKTsKK0NPSVJFU1VMVCAoKlBpcGVsaW5lUnVuRnVuY3Rpb24pKENPSVBJUEVMSU5FLCBDT0lGVU5DVElPTiwgdWludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDT0lCVUZGRVIqLCBjb25zdCBDT0lfQUNDRVNTX0ZMQUdTKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90LCBjb25zdCBDT0lFVkVOVCosIGNvbnN0IHZvaWQqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QsIHZvaWQqLCB1aW50MTZfdCwgQ09JRVZFTlQqKTsKKworQ09JUkVTVUxUICgqQnVmZmVyQ3JlYXRlKSh1aW50NjRfdCwgQ09JX0JVRkZFUl9UWVBFLCB1aW50MzJfdCwgY29uc3Qgdm9pZCosCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90LCBjb25zdCBDT0lQUk9DRVNTKiwgQ09JQlVGRkVSKik7CitDT0lSRVNVTFQgKCpCdWZmZXJDcmVhdGVGcm9tTWVtb3J5KSh1aW50NjRfdCwgQ09JX0JVRkZFUl9UWVBFLCB1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqLCB1aW50MzJfdCwgY29uc3QgQ09JUFJPQ0VTUyosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lCVUZGRVIqKTsKK0NPSVJFU1VMVCAoKkJ1ZmZlckRlc3Ryb3kpKENPSUJVRkZFUik7CitDT0lSRVNVTFQgKCpCdWZmZXJNYXApKENPSUJVRkZFUiwgdWludDY0X3QsIHVpbnQ2NF90LCBDT0lfTUFQX1RZUEUsIHVpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDT0lFVkVOVCosIENPSUVWRU5UKiwgQ09JTUFQSU5TVEFOQ0UqLCB2b2lkKiopOworQ09JUkVTVUxUICgqQnVmZmVyVW5tYXApKENPSU1BUElOU1RBTkNFLCB1aW50MzJfdCwgY29uc3QgQ09JRVZFTlQqLCBDT0lFVkVOVCopOworQ09JUkVTVUxUICgqQnVmZmVyV3JpdGUpKENPSUJVRkZFUiwgdWludDY0X3QsIGNvbnN0IHZvaWQqLCB1aW50NjRfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfQ09QWV9UWVBFLCB1aW50MzJfdCwgY29uc3QgQ09JRVZFTlQqLCBDT0lFVkVOVCopOworQ09JUkVTVUxUICgqQnVmZmVyUmVhZCkoQ09JQlVGRkVSLCB1aW50NjRfdCwgdm9pZCosIHVpbnQ2NF90LCBDT0lfQ09QWV9UWVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QsIGNvbnN0IENPSUVWRU5UKiwgQ09JRVZFTlQqKTsKK0NPSVJFU1VMVCAoKkJ1ZmZlckNvcHkpKENPSUJVRkZFUiwgQ09JQlVGRkVSLCB1aW50NjRfdCwgdWludDY0X3QsIHVpbnQ2NF90LAorICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0NPUFlfVFlQRSwgdWludDMyX3QsIGNvbnN0IENPSUVWRU5UKiwgQ09JRVZFTlQqKTsKK0NPSVJFU1VMVCAoKkJ1ZmZlckdldFNpbmtBZGRyZXNzKShDT0lCVUZGRVIsIHVpbnQ2NF90Kik7CitDT0lSRVNVTFQgKCpCdWZmZXJTZXRTdGF0ZSkoQ09JQlVGRkVSLCBDT0lQUk9DRVNTLCBDT0lfQlVGRkVSX1NUQVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9CVUZGRVJfTU9WRV9GTEFHLCB1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIENPSUVWRU5UKiwgQ09JRVZFTlQqKTsKKworQ09JUkVTVUxUICgqRXZlbnRXYWl0KSh1aW50MTZfdCwgY29uc3QgQ09JRVZFTlQqLCBpbnQzMl90LCB1aW50OF90LCB1aW50MzJfdCosCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90Kik7CisKK3VpbnQ2NF90ICAoKlBlcmZHZXRDeWNsZUZyZXF1ZW5jeSkodm9pZCk7CisKK2Jvb2wgaW5pdCh2b2lkKQoreworI2lmbmRlZiBUQVJHRVRfV0lOTlQKKyAgICBjb25zdCBjaGFyICpsaWJfbmFtZSA9ICJsaWJjb2lfaG9zdC5zby4wIjsKKyNlbHNlIC8vIFRBUkdFVF9XSU5OVAorICAgIGNvbnN0IGNoYXIgKmxpYl9uYW1lID0gImNvaV9ob3N0LmRsbCI7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJMb2FkaW5nIENPSSBsaWJyYXJ5ICVzIC4uLlxuIiwgbGliX25hbWUpOworICAgIGxpYl9oYW5kbGUgPSBETF9vcGVuKGxpYl9uYW1lKTsKKyAgICBpZiAobGliX2hhbmRsZSA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBsb2FkIHRoZSBsaWJyYXJ5XG4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEVuZ2luZUdldENvdW50ID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikoQ09JX0lTQV9UWVBFLCB1aW50MzJfdCopKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lFbmdpbmVHZXRDb3VudCIsIENPSV9WRVJTSU9OMSk7CisgICAgaWYgKEVuZ2luZUdldENvdW50ID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSUVuZ2luZUdldENvdW50Iik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEVuZ2luZUdldEhhbmRsZSA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKENPSV9JU0FfVFlQRSwgdWludDMyX3QsIENPSUVOR0lORSopKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lFbmdpbmVHZXRIYW5kbGUiLCBDT0lfVkVSU0lPTjEpOworICAgIGlmIChFbmdpbmVHZXRIYW5kbGUgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBDT0kgbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09JRW5naW5lR2V0SGFuZGxlIik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFByb2Nlc3NDcmVhdGVGcm9tTWVtb3J5ID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikoQ09JRU5HSU5FLCBjb25zdCBjaGFyKiwgY29uc3Qgdm9pZCosIHVpbnQ2NF90LCBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqKiwgdWludDhfdCwgY29uc3QgY2hhcioqLCB1aW50OF90LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiwgdWludDY0X3QsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QsIENPSVBST0NFU1MqKSkKKyAgICAgICAgICAgIERMX3N5bShsaWJfaGFuZGxlLCAiQ09JUHJvY2Vzc0NyZWF0ZUZyb21NZW1vcnkiLCBDT0lfVkVSU0lPTjEpOworICAgIGlmIChQcm9jZXNzQ3JlYXRlRnJvbU1lbW9yeSA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lQcm9jZXNzQ3JlYXRlRnJvbU1lbW9yeSIpOworICAgICAgICBmaW5pKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBQcm9jZXNzRGVzdHJveSA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKENPSVBST0NFU1MsIGludDMyX3QsIHVpbnQ4X3QsIGludDhfdCosCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSVByb2Nlc3NEZXN0cm95IiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoUHJvY2Vzc0Rlc3Ryb3kgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBDT0kgbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09JUHJvY2Vzc0Rlc3Ryb3kiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgUHJvY2Vzc0dldEZ1bmN0aW9uSGFuZGxlcyA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKENPSVBST0NFU1MsIHVpbnQzMl90LCBjb25zdCBjaGFyKiosIENPSUZVTkNUSU9OKikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSVByb2Nlc3NHZXRGdW5jdGlvbkhhbmRsZXMiLCBDT0lfVkVSU0lPTjEpOworICAgIGlmIChQcm9jZXNzR2V0RnVuY3Rpb25IYW5kbGVzID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSVByb2Nlc3NHZXRGdW5jdGlvbkhhbmRsZXMiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgUHJvY2Vzc0xvYWRMaWJyYXJ5RnJvbU1lbW9yeSA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKENPSVBST0NFU1MsIGNvbnN0IHZvaWQqLCB1aW50NjRfdCwgY29uc3QgY2hhciosCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgdWludDY0X3QsIHVpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICBDT0lMSUJSQVJZKikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSVByb2Nlc3NMb2FkTGlicmFyeUZyb21NZW1vcnkiLCBDT0lfVkVSU0lPTjIpOworICAgIGlmIChQcm9jZXNzTG9hZExpYnJhcnlGcm9tTWVtb3J5ID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSVByb2Nlc3NMb2FkTGlicmFyeUZyb21NZW1vcnkiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgUHJvY2Vzc1JlZ2lzdGVyTGlicmFyaWVzID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikodWludDMyX3QsIGNvbnN0IHZvaWQqKiwgY29uc3QgdWludDY0X3QqLCBjb25zdCBjaGFyKiosCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ2NF90KikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSVByb2Nlc3NSZWdpc3RlckxpYnJhcmllcyIsIENPSV9WRVJTSU9OMSk7CisgICAgaWYgKFByb2Nlc3NSZWdpc3RlckxpYnJhcmllcyA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lQcm9jZXNzUmVnaXN0ZXJMaWJyYXJpZXMiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgUGlwZWxpbmVDcmVhdGUgPQorICAgICAgICAoQ09JUkVTVUxUICgqKShDT0lQUk9DRVNTLCBDT0lfQ1BVX01BU0ssIHVpbnQzMl90LCBDT0lQSVBFTElORSopKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lQaXBlbGluZUNyZWF0ZSIsIENPSV9WRVJTSU9OMSk7CisgICAgaWYgKFBpcGVsaW5lQ3JlYXRlID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSVBpcGVsaW5lQ3JlYXRlIik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFBpcGVsaW5lRGVzdHJveSA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKENPSVBJUEVMSU5FKSkKKyAgICAgICAgICAgIERMX3N5bShsaWJfaGFuZGxlLCAiQ09JUGlwZWxpbmVEZXN0cm95IiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoUGlwZWxpbmVEZXN0cm95ID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSVBpcGVsaW5lRGVzdHJveSIpOworICAgICAgICBmaW5pKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBQaXBlbGluZVJ1bkZ1bmN0aW9uID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikoQ09JUElQRUxJTkUsIENPSUZVTkNUSU9OLCB1aW50MzJfdCwgY29uc3QgQ09JQlVGRkVSKiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ09JX0FDQ0VTU19GTEFHUyosIHVpbnQzMl90LCBjb25zdCBDT0lFVkVOVCosCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqLCB1aW50MTZfdCwgdm9pZCosIHVpbnQxNl90LCBDT0lFVkVOVCopKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lQaXBlbGluZVJ1bkZ1bmN0aW9uIiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoUGlwZWxpbmVSdW5GdW5jdGlvbiA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lQaXBlbGluZVJ1bkZ1bmN0aW9uIik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEJ1ZmZlckNyZWF0ZSA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKHVpbnQ2NF90LCBDT0lfQlVGRkVSX1RZUEUsIHVpbnQzMl90LCBjb25zdCB2b2lkKiwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QsIGNvbnN0IENPSVBST0NFU1MqLCBDT0lCVUZGRVIqKSkKKyAgICAgICAgICAgIERMX3N5bShsaWJfaGFuZGxlLCAiQ09JQnVmZmVyQ3JlYXRlIiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoQnVmZmVyQ3JlYXRlID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSUJ1ZmZlckNyZWF0ZSIpOworICAgICAgICBmaW5pKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBCdWZmZXJDcmVhdGVGcm9tTWVtb3J5ID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikodWludDY0X3QsIENPSV9CVUZGRVJfVFlQRSwgdWludDMyX3QsIHZvaWQqLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCwgY29uc3QgQ09JUFJPQ0VTUyosIENPSUJVRkZFUiopKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lCdWZmZXJDcmVhdGVGcm9tTWVtb3J5IiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoQnVmZmVyQ3JlYXRlRnJvbU1lbW9yeSA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lCdWZmZXJDcmVhdGVGcm9tTWVtb3J5Iik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEJ1ZmZlckRlc3Ryb3kgPQorICAgICAgICAoQ09JUkVTVUxUICgqKShDT0lCVUZGRVIpKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lCdWZmZXJEZXN0cm95IiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoQnVmZmVyRGVzdHJveSA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lCdWZmZXJEZXN0cm95Iik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEJ1ZmZlck1hcCA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKENPSUJVRkZFUiwgdWludDY0X3QsIHVpbnQ2NF90LCBDT0lfTUFQX1RZUEUsIHVpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDT0lFVkVOVCosIENPSUVWRU5UKiwgQ09JTUFQSU5TVEFOQ0UqLAorICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiopKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lCdWZmZXJNYXAiLCBDT0lfVkVSU0lPTjEpOworICAgIGlmIChCdWZmZXJNYXAgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBDT0kgbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09JQnVmZmVyTWFwIik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEJ1ZmZlclVubWFwID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikoQ09JTUFQSU5TVEFOQ0UsIHVpbnQzMl90LCBjb25zdCBDT0lFVkVOVCosCisgICAgICAgICAgICAgICAgICAgICAgIENPSUVWRU5UKikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSUJ1ZmZlclVubWFwIiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoQnVmZmVyVW5tYXAgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBDT0kgbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09JQnVmZmVyVW5tYXAiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQnVmZmVyV3JpdGUgPQorICAgICAgICAoQ09JUkVTVUxUICgqKShDT0lCVUZGRVIsIHVpbnQ2NF90LCBjb25zdCB2b2lkKiwgdWludDY0X3QsCisgICAgICAgICAgICAgICAgICAgICAgIENPSV9DT1BZX1RZUEUsIHVpbnQzMl90LCBjb25zdCBDT0lFVkVOVCosCisgICAgICAgICAgICAgICAgICAgICAgIENPSUVWRU5UKikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSUJ1ZmZlcldyaXRlIiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoQnVmZmVyV3JpdGUgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBDT0kgbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09JQnVmZmVyV3JpdGUiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQnVmZmVyUmVhZCA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKENPSUJVRkZFUiwgdWludDY0X3QsIHZvaWQqLCB1aW50NjRfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfQ09QWV9UWVBFLCB1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDT0lFVkVOVCosIENPSUVWRU5UKikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSUJ1ZmZlclJlYWQiLCBDT0lfVkVSU0lPTjEpOworICAgIGlmIChCdWZmZXJSZWFkID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSUJ1ZmZlclJlYWQiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQnVmZmVyQ29weSA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKENPSUJVRkZFUiwgQ09JQlVGRkVSLCB1aW50NjRfdCwgdWludDY0X3QsIHVpbnQ2NF90LAorICAgICAgICAgICAgICAgICAgICAgICBDT0lfQ09QWV9UWVBFLCB1aW50MzJfdCwgY29uc3QgQ09JRVZFTlQqLAorICAgICAgICAgICAgICAgICAgICAgICBDT0lFVkVOVCopKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lCdWZmZXJDb3B5IiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoQnVmZmVyQ29weSA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lCdWZmZXJDb3B5Iik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEJ1ZmZlckdldFNpbmtBZGRyZXNzID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikoQ09JQlVGRkVSLCB1aW50NjRfdCopKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lCdWZmZXJHZXRTaW5rQWRkcmVzcyIsIENPSV9WRVJTSU9OMSk7CisgICAgaWYgKEJ1ZmZlckdldFNpbmtBZGRyZXNzID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSUJ1ZmZlckdldFNpbmtBZGRyZXNzIik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEJ1ZmZlclNldFN0YXRlID0KKyAgICAgICAgKENPSVJFU1VMVCgqKShDT0lCVUZGRVIsIENPSVBST0NFU1MsIENPSV9CVUZGRVJfU1RBVEUsCisgICAgICAgICAgICAgICAgICAgICAgQ09JX0JVRkZFUl9NT1ZFX0ZMQUcsIHVpbnQzMl90LCBjb25zdCBDT0lFVkVOVCosCisgICAgICAgICAgICAgICAgICAgICAgQ09JRVZFTlQqKSkKKyAgICAgICAgICAgIERMX3N5bShsaWJfaGFuZGxlLCAiQ09JQnVmZmVyU2V0U3RhdGUiLCBDT0lfVkVSU0lPTjEpOworICAgIGlmIChCdWZmZXJTZXRTdGF0ZSA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lCdWZmZXJTZXRTdGF0ZSIpOworICAgICAgICBmaW5pKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBFdmVudFdhaXQgPQorICAgICAgICAoQ09JUkVTVUxUICgqKSh1aW50MTZfdCwgY29uc3QgQ09JRVZFTlQqLCBpbnQzMl90LCB1aW50OF90LAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCosIHVpbnQzMl90KikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSUV2ZW50V2FpdCIsIENPSV9WRVJTSU9OMSk7CisgICAgaWYgKEV2ZW50V2FpdCA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lFdmVudFdhaXQiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgUGVyZkdldEN5Y2xlRnJlcXVlbmN5ID0KKyAgICAgICAgKHVpbnQ2NF90ICgqKSh2b2lkKSkKKyAgICAgICAgICAgIERMX3N5bShsaWJfaGFuZGxlLCAiQ09JUGVyZkdldEN5Y2xlRnJlcXVlbmN5IiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoUGVyZkdldEN5Y2xlRnJlcXVlbmN5ID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSVBlcmZHZXRDeWNsZUZyZXF1ZW5jeSIpOworICAgICAgICBmaW5pKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpc19hdmFpbGFibGUgPSB0cnVlOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgZmluaSh2b2lkKQoreworICAgIGlzX2F2YWlsYWJsZSA9IGZhbHNlOworCisgICAgaWYgKGxpYl9oYW5kbGUgIT0gMCkgeworI2lmbmRlZiBUQVJHRVRfV0lOTlQKKyAgICAgICAgRExfY2xvc2UobGliX2hhbmRsZSk7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisgICAgICAgIGxpYl9oYW5kbGUgPSAwOworICAgIH0KK30KKworfSAvLyBuYW1lc3BhY2UgQ09JCmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9jb2kvY29pX2NsaWVudC5oIGIvZmluYWwvb2ZmbG9hZC9zcmMvY29pL2NvaV9jbGllbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Nzc1YThiCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvY29pL2NvaV9jbGllbnQuaApAQCAtMCwwICsxLDExOCBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisvLyBUaGUgaW50ZXJmYWNlIGJldHdlZW4gb2ZmbG9hZCBsaWJyYXJ5IGFuZCB0aGUgQ09JIEFQSSBvbiB0aGUgaG9zdAorCisjaWZuZGVmIENPSV9DTElFTlRfSF9JTkNMVURFRAorI2RlZmluZSBDT0lfQ0xJRU5UX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPGNvbW1vbi9DT0lQZXJmX2NvbW1vbi5oPgorI2luY2x1ZGUgPHNvdXJjZS9DT0lFbmdpbmVfc291cmNlLmg+CisjaW5jbHVkZSA8c291cmNlL0NPSVByb2Nlc3Nfc291cmNlLmg+CisjaW5jbHVkZSA8c291cmNlL0NPSVBpcGVsaW5lX3NvdXJjZS5oPgorI2luY2x1ZGUgPHNvdXJjZS9DT0lCdWZmZXJfc291cmNlLmg+CisjaW5jbHVkZSA8c291cmNlL0NPSUV2ZW50X3NvdXJjZS5oPgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICIuLi9saWJvZmZsb2FkX2Vycm9yX2NvZGVzLmgiCisjaW5jbHVkZSAiLi4vb2ZmbG9hZF91dGlsLmgiCisKKyNkZWZpbmUgTUlDX0VOR0lORVNfTUFYICAgICAxMjgKKworI2lmIE1JQ19FTkdJTkVTX01BWCA8IENPSV9NQVhfSVNBX01JQ19ERVZJQ0VTCisjZXJyb3IgTUlDX0VOR0lORVNfTUFYIG5lZWQgdG8gYmUgaW5jcmVhc2VkCisjZW5kaWYKKworLy8gQ09JIGxpYnJhcnkgaW50ZXJmYWNlCituYW1lc3BhY2UgQ09JIHsKKworZXh0ZXJuIGJvb2wgaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGZpbmkodm9pZCk7CisKK2V4dGVybiBib29sIGlzX2F2YWlsYWJsZTsKKworLy8gcG9pbnRlcnMgdG8gZnVuY3Rpb25zIGZyb20gQ09JIGxpYnJhcnkKK2V4dGVybiBDT0lSRVNVTFQgKCpFbmdpbmVHZXRDb3VudCkoQ09JX0lTQV9UWVBFLCB1aW50MzJfdCopOworZXh0ZXJuIENPSVJFU1VMVCAoKkVuZ2luZUdldEhhbmRsZSkoQ09JX0lTQV9UWVBFLCB1aW50MzJfdCwgQ09JRU5HSU5FKik7CisKK2V4dGVybiBDT0lSRVNVTFQgKCpQcm9jZXNzQ3JlYXRlRnJvbU1lbW9yeSkoQ09JRU5HSU5FLCBjb25zdCBjaGFyKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiwgdWludDY0X3QsIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiosIHVpbnQ4X3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhcioqLCB1aW50OF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqLCB1aW50NjRfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiwgdWludDY0X3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JUFJPQ0VTUyopOworZXh0ZXJuIENPSVJFU1VMVCAoKlByb2Nlc3NEZXN0cm95KShDT0lQUk9DRVNTLCBpbnQzMl90LCB1aW50OF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDhfdCosIHVpbnQzMl90Kik7CitleHRlcm4gQ09JUkVTVUxUICgqUHJvY2Vzc0dldEZ1bmN0aW9uSGFuZGxlcykoQ09JUFJPQ0VTUywgdWludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lGVU5DVElPTiopOworZXh0ZXJuIENPSVJFU1VMVCAoKlByb2Nlc3NMb2FkTGlicmFyeUZyb21NZW1vcnkpKENPSVBST0NFU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSUxJQlJBUlkqKTsKK2V4dGVybiBDT0lSRVNVTFQgKCpQcm9jZXNzUmVnaXN0ZXJMaWJyYXJpZXMpKHVpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ2NF90KiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhcioqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50NjRfdCopOworCitleHRlcm4gQ09JUkVTVUxUICgqUGlwZWxpbmVDcmVhdGUpKENPSVBST0NFU1MsIENPSV9DUFVfTUFTSywgdWludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JUElQRUxJTkUqKTsKK2V4dGVybiBDT0lSRVNVTFQgKCpQaXBlbGluZURlc3Ryb3kpKENPSVBJUEVMSU5FKTsKK2V4dGVybiBDT0lSRVNVTFQgKCpQaXBlbGluZVJ1bkZ1bmN0aW9uKShDT0lQSVBFTElORSwgQ09JRlVOQ1RJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCwgY29uc3QgQ09JQlVGRkVSKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENPSV9BQ0NFU1NfRkxBR1MqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QsIGNvbnN0IENPSUVWRU5UKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqLCB1aW50MTZfdCwgdm9pZCosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCwgQ09JRVZFTlQqKTsKKworZXh0ZXJuIENPSVJFU1VMVCAoKkJ1ZmZlckNyZWF0ZSkodWludDY0X3QsIENPSV9CVUZGRVJfVFlQRSwgdWludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqLCB1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ09JUFJPQ0VTUyosIENPSUJVRkZFUiopOworZXh0ZXJuIENPSVJFU1VMVCAoKkJ1ZmZlckNyZWF0ZUZyb21NZW1vcnkpKHVpbnQ2NF90LCBDT0lfQlVGRkVSX1RZUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCwgdm9pZCosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCwgY29uc3QgQ09JUFJPQ0VTUyosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lCVUZGRVIqKTsKK2V4dGVybiBDT0lSRVNVTFQgKCpCdWZmZXJEZXN0cm95KShDT0lCVUZGRVIpOworZXh0ZXJuIENPSVJFU1VMVCAoKkJ1ZmZlck1hcCkoQ09JQlVGRkVSLCB1aW50NjRfdCwgdWludDY0X3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9NQVBfVFlQRSwgdWludDMyX3QsIGNvbnN0IENPSUVWRU5UKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JRVZFTlQqLCBDT0lNQVBJTlNUQU5DRSosIHZvaWQqKik7CitleHRlcm4gQ09JUkVTVUxUICgqQnVmZmVyVW5tYXApKENPSU1BUElOU1RBTkNFLCB1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDT0lFVkVOVCosIENPSUVWRU5UKik7CitleHRlcm4gQ09JUkVTVUxUICgqQnVmZmVyV3JpdGUpKENPSUJVRkZFUiwgdWludDY0X3QsIGNvbnN0IHZvaWQqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90LCBDT0lfQ09QWV9UWVBFLCB1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDT0lFVkVOVCosIENPSUVWRU5UKik7CitleHRlcm4gQ09JUkVTVUxUICgqQnVmZmVyUmVhZCkoQ09JQlVGRkVSLCB1aW50NjRfdCwgdm9pZCosIHVpbnQ2NF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0NPUFlfVFlQRSwgdWludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDT0lFVkVOVCosIENPSUVWRU5UKik7CitleHRlcm4gQ09JUkVTVUxUICgqQnVmZmVyQ29weSkoQ09JQlVGRkVSLCBDT0lCVUZGRVIsIHVpbnQ2NF90LCB1aW50NjRfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90LCBDT0lfQ09QWV9UWVBFLCB1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENPSUVWRU5UKiwgQ09JRVZFTlQqKTsKK2V4dGVybiBDT0lSRVNVTFQgKCpCdWZmZXJHZXRTaW5rQWRkcmVzcykoQ09JQlVGRkVSLCB1aW50NjRfdCopOworZXh0ZXJuIENPSVJFU1VMVCAoKkJ1ZmZlclNldFN0YXRlKShDT0lCVUZGRVIsIENPSVBST0NFU1MsIENPSV9CVUZGRVJfU1RBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9CVUZGRVJfTU9WRV9GTEFHLCB1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBDT0lFVkVOVCosIENPSUVWRU5UKik7CisKK2V4dGVybiBDT0lSRVNVTFQgKCpFdmVudFdhaXQpKHVpbnQxNl90LCBjb25zdCBDT0lFVkVOVCosIGludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90LCB1aW50MzJfdCosIHVpbnQzMl90Kik7CisKK2V4dGVybiB1aW50NjRfdCAgKCpQZXJmR2V0Q3ljbGVGcmVxdWVuY3kpKHZvaWQpOworCit9IC8vIG5hbWVzcGFjZSBDT0kKKworI2VuZGlmIC8vIENPSV9DTElFTlRfSF9JTkNMVURFRApkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvY29pL2NvaV9zZXJ2ZXIuY3BwIGIvZmluYWwvb2ZmbG9hZC9zcmMvY29pL2NvaV9zZXJ2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZTZjMmQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9jb2kvY29pX3NlcnZlci5jcHAKQEAgLTAsMCArMSwxMzAgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLy8gVGhlIENPSSBpbnRlcmZhY2Ugb24gdGhlIHRhcmdldAorCisjaW5jbHVkZSAiY29pX3NlcnZlci5oIgorCisjaW5jbHVkZSAiLi4vb2ZmbG9hZF90YXJnZXQuaCIKKyNpbmNsdWRlICIuLi9vZmZsb2FkX3RpbWVyLmgiCisjaWZkZWYgTVlPX1NVUFBPUlQKKyNpbmNsdWRlICIuLi9vZmZsb2FkX215b190YXJnZXQuaCIgICAgICAvLyBmb3IgX19vZmZsb2FkX215b0xpYkluaXQvRmluaQorI2VuZGlmIC8vIE1ZT19TVVBQT1JUCisKK0NPSU5BVElWRUxJQkVYUE9SVAordm9pZCBzZXJ2ZXJfY29tcHV0ZSgKKyAgICB1aW50MzJfdCAgYnVmZmVyX2NvdW50LAorICAgIHZvaWQqKiAgICBidWZmZXJzLAorICAgIHVpbnQ2NF90KiBidWZmZXJzX2xlbiwKKyAgICB2b2lkKiAgICAgbWlzY19kYXRhLAorICAgIHVpbnQxNl90ICBtaXNjX2RhdGFfbGVuLAorICAgIHZvaWQqICAgICByZXR1cm5fZGF0YSwKKyAgICB1aW50MTZfdCAgcmV0dXJuX2RhdGFfbGVuCispCit7CisgICAgT2ZmbG9hZERlc2NyaXB0b3I6Om9mZmxvYWQoYnVmZmVyX2NvdW50LCBidWZmZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc2NfZGF0YSwgbWlzY19kYXRhX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5fZGF0YSwgcmV0dXJuX2RhdGFfbGVuKTsKK30KKworQ09JTkFUSVZFTElCRVhQT1JUCit2b2lkIHNlcnZlcl9pbml0KAorICAgIHVpbnQzMl90ICBidWZmZXJfY291bnQsCisgICAgdm9pZCoqICAgIGJ1ZmZlcnMsCisgICAgdWludDY0X3QqIGJ1ZmZlcnNfbGVuLAorICAgIHZvaWQqICAgICBtaXNjX2RhdGEsCisgICAgdWludDE2X3QgIG1pc2NfZGF0YV9sZW4sCisgICAgdm9pZCogICAgIHJldHVybl9kYXRhLAorICAgIHVpbnQxNl90ICByZXR1cm5fZGF0YV9sZW4KKykKK3sKKyAgICBzdHJ1Y3QgaW5pdF9kYXRhIHsKKyAgICAgICAgaW50ICBkZXZpY2VfaW5kZXg7CisgICAgICAgIGludCAgZGV2aWNlc190b3RhbDsKKyAgICAgICAgaW50ICBjb25zb2xlX2xldmVsOworICAgICAgICBpbnQgIG9mZmxvYWRfcmVwb3J0X2xldmVsOworICAgIH0gKmRhdGEgPSAoc3RydWN0IGluaXRfZGF0YSopIG1pc2NfZGF0YTsKKworICAgIC8vIHNldCBkZXZpY2UgaW5kZXggYW5kIG51bWJlciBvZiB0b3RhbCBkZXZpY2VzCisgICAgbWljX2luZGV4ID0gZGF0YS0+ZGV2aWNlX2luZGV4OworICAgIG1pY19lbmdpbmVzX3RvdGFsID0gZGF0YS0+ZGV2aWNlc190b3RhbDsKKworICAgIC8vIGluaXRpYWxpemUgdHJhY2UgbGV2ZWwKKyAgICBjb25zb2xlX2VuYWJsZWQgPSBkYXRhLT5jb25zb2xlX2xldmVsOworICAgIG9mZmxvYWRfcmVwb3J0X2xldmVsID0gZGF0YS0+b2ZmbG9hZF9yZXBvcnRfbGV2ZWw7CisKKyAgICAvLyByZXR1cm4gYmFjayB0aGUgcHJvY2VzcyBpZAorICAgICooKHBpZF90KikgcmV0dXJuX2RhdGEpID0gZ2V0cGlkKCk7Cit9CisKK0NPSU5BVElWRUxJQkVYUE9SVAordm9pZCBzZXJ2ZXJfdmFyX3RhYmxlX3NpemUoCisgICAgdWludDMyX3QgIGJ1ZmZlcl9jb3VudCwKKyAgICB2b2lkKiogICAgYnVmZmVycywKKyAgICB1aW50NjRfdCogYnVmZmVyc19sZW4sCisgICAgdm9pZCogICAgIG1pc2NfZGF0YSwKKyAgICB1aW50MTZfdCAgbWlzY19kYXRhX2xlbiwKKyAgICB2b2lkKiAgICAgcmV0dXJuX2RhdGEsCisgICAgdWludDE2X3QgIHJldHVybl9kYXRhX2xlbgorKQoreworICAgIHN0cnVjdCBQYXJhbXMgeworICAgICAgICBpbnQ2NF90IG5lbGVtczsKKyAgICAgICAgaW50NjRfdCBsZW5ndGg7CisgICAgfSAqcGFyYW1zOworCisgICAgcGFyYW1zID0gc3RhdGljX2Nhc3Q8UGFyYW1zKj4ocmV0dXJuX2RhdGEpOworICAgIHBhcmFtcy0+bGVuZ3RoID0gX19vZmZsb2FkX3ZhcnMudGFibGVfc2l6ZShwYXJhbXMtPm5lbGVtcyk7Cit9CisKK0NPSU5BVElWRUxJQkVYUE9SVAordm9pZCBzZXJ2ZXJfdmFyX3RhYmxlX2NvcHkoCisgICAgdWludDMyX3QgIGJ1ZmZlcl9jb3VudCwKKyAgICB2b2lkKiogICAgYnVmZmVycywKKyAgICB1aW50NjRfdCogYnVmZmVyc19sZW4sCisgICAgdm9pZCogICAgIG1pc2NfZGF0YSwKKyAgICB1aW50MTZfdCAgbWlzY19kYXRhX2xlbiwKKyAgICB2b2lkKiAgICAgcmV0dXJuX2RhdGEsCisgICAgdWludDE2X3QgIHJldHVybl9kYXRhX2xlbgorKQoreworICAgIF9fb2ZmbG9hZF92YXJzLnRhYmxlX2NvcHkoYnVmZmVyc1swXSwgKnN0YXRpY19jYXN0PGludDY0X3QqPihtaXNjX2RhdGEpKTsKK30KKworI2lmZGVmIE1ZT19TVVBQT1JUCisvLyB0ZW1wb3Jhcnkgd29ya2Fyb3VuZCBmb3IgYmxvY2tpbmcgYmVoYXZpb3Igb2YgbXlvaUxpYkluaXQvRmluaSBjYWxscworQ09JTkFUSVZFTElCRVhQT1JUCit2b2lkIHNlcnZlcl9teW9pbml0KAorICAgIHVpbnQzMl90ICBidWZmZXJfY291bnQsCisgICAgdm9pZCoqICAgIGJ1ZmZlcnMsCisgICAgdWludDY0X3QqIGJ1ZmZlcnNfbGVuLAorICAgIHZvaWQqICAgICBtaXNjX2RhdGEsCisgICAgdWludDE2X3QgIG1pc2NfZGF0YV9sZW4sCisgICAgdm9pZCogICAgIHJldHVybl9kYXRhLAorICAgIHVpbnQxNl90ICByZXR1cm5fZGF0YV9sZW4KKykKK3sKKyAgICBfX29mZmxvYWRfbXlvTGliSW5pdCgpOworfQorCitDT0lOQVRJVkVMSUJFWFBPUlQKK3ZvaWQgc2VydmVyX215b2ZpbmkoCisgICAgdWludDMyX3QgIGJ1ZmZlcl9jb3VudCwKKyAgICB2b2lkKiogICAgYnVmZmVycywKKyAgICB1aW50NjRfdCogYnVmZmVyc19sZW4sCisgICAgdm9pZCogICAgIG1pc2NfZGF0YSwKKyAgICB1aW50MTZfdCAgbWlzY19kYXRhX2xlbiwKKyAgICB2b2lkKiAgICAgcmV0dXJuX2RhdGEsCisgICAgdWludDE2X3QgIHJldHVybl9kYXRhX2xlbgorKQoreworICAgIF9fb2ZmbG9hZF9teW9MaWJGaW5pKCk7Cit9CisjZW5kaWYgLy8gTVlPX1NVUFBPUlQKZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL2NvaS9jb2lfc2VydmVyLmggYi9maW5hbC9vZmZsb2FkL3NyYy9jb2kvY29pX3NlcnZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NDRkOWUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9jb2kvY29pX3NlcnZlci5oCkBAIC0wLDAgKzEsNzQgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLy9UaGUgaW50ZXJmYWNlIGJldHdlZW4gb2ZmbG9hZCBsaWJyYXJ5IGFuZCB0aGUgQ09JIEFQSSBvbiB0aGUgdGFyZ2V0LgorCisjaWZuZGVmIENPSV9TRVJWRVJfSF9JTkNMVURFRAorI2RlZmluZSBDT0lfU0VSVkVSX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPGNvbW1vbi9DT0lFbmdpbmVfY29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbW9uL0NPSVBlcmZfY29tbW9uLmg+CisjaW5jbHVkZSA8c2luay9DT0lQcm9jZXNzX3NpbmsuaD4KKyNpbmNsdWRlIDxzaW5rL0NPSVBpcGVsaW5lX3NpbmsuaD4KKyNpbmNsdWRlIDxzaW5rL0NPSUJ1ZmZlcl9zaW5rLmg+CisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgIi4uL2xpYm9mZmxvYWRfZXJyb3JfY29kZXMuaCIKKworLy8gd3JhcHBlcnMgZm9yIENPSSBBUEkKKyNkZWZpbmUgUGlwZWxpbmVTdGFydEV4ZWN1dGluZ1J1bkZ1bmN0aW9ucygpIFwKKyAgICB7IFwKKyAgICAgICAgQ09JUkVTVUxUIHJlcyA9IENPSVBpcGVsaW5lU3RhcnRFeGVjdXRpbmdSdW5GdW5jdGlvbnMoKTsgXAorICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7IFwKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19waXBlbGluZV9zdGFydF9ydW5fZnVuY3MsIG1pY19pbmRleCwgcmVzKTsgXAorICAgICAgICAgICAgZXhpdCgxKTsgXAorICAgICAgICB9IFwKKyAgICB9CisKKyNkZWZpbmUgUHJvY2Vzc1dhaXRGb3JTaHV0ZG93bigpIFwKKyAgICB7IFwKKyAgICAgICAgQ09JUkVTVUxUIHJlcyA9IENPSVByb2Nlc3NXYWl0Rm9yU2h1dGRvd24oKTsgXAorICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7IFwKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19wcm9jZXNzX3dhaXRfc2h1dGRvd24sIG1pY19pbmRleCwgcmVzKTsgXAorICAgICAgICAgICAgZXhpdCgxKTsgXAorICAgICAgICB9IFwKKyAgICB9CisKKyNkZWZpbmUgQnVmZmVyQWRkUmVmKGJ1ZikgXAorICAgIHsgXAorICAgICAgICBDT0lSRVNVTFQgcmVzID0gQ09JQnVmZmVyQWRkUmVmKGJ1Zik7IFwKKyAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeyBcCisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfYnVmX2FkZF9yZWYsIG1pY19pbmRleCwgcmVzKTsgXAorICAgICAgICAgICAgZXhpdCgxKTsgXAorICAgICAgICB9IFwKKyAgICB9CisKKyNkZWZpbmUgQnVmZmVyUmVsZWFzZVJlZihidWYpIFwKKyAgICB7IFwKKyAgICAgICAgQ09JUkVTVUxUIHJlcyA9IENPSUJ1ZmZlclJlbGVhc2VSZWYoYnVmKTsgXAorICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7IFwKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19idWZfcmVsZWFzZV9yZWYsIG1pY19pbmRleCwgcmVzKTsgXAorICAgICAgICAgICAgZXhpdCgxKTsgXAorICAgICAgICB9IFwKKyAgICB9CisKKyNkZWZpbmUgRW5naW5lR2V0SW5kZXgoaW5kZXgpIFwKKyAgICB7IFwKKyAgICAgICAgQ09JX0lTQV9UWVBFIGlzYV90eXBlOyBcCisgICAgICAgIENPSVJFU1VMVCByZXMgPSBDT0lFbmdpbmVHZXRJbmRleCgmaXNhX3R5cGUsIGluZGV4KTsgXAorICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7IFwKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19nZXRfZW5naW5lX2luZGV4LCBtaWNfaW5kZXgsIHJlcyk7IFwKKyAgICAgICAgICAgIGV4aXQoMSk7IFwKKyAgICAgICAgfSBcCisgICAgfQorCisjZW5kaWYgLy8gQ09JX1NFUlZFUl9IX0lOQ0xVREVECmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9jb21waWxlcl9pZl9ob3N0LmNwcCBiL2ZpbmFsL29mZmxvYWQvc3JjL2NvbXBpbGVyX2lmX2hvc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiYzQzMGIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9jb21waWxlcl9pZl9ob3N0LmNwcApAQCAtMCwwICsxLDMyMyBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAiY29tcGlsZXJfaWZfaG9zdC5oIgorCisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaWZuZGVmIFRBUkdFVF9XSU5OVAorI2luY2x1ZGUgPGFsbG9jYS5oPgorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCisvLyBHbG9iYWwgY291bnRlciBvbiBob3N0LiAKKy8vIFRoaXMgdmFyaWFibGUgaXMgdXNlZCBpZiBQMk9QVF9vZmZsb2FkX2RvX2RhdGFfcGVyc2lzdGVuY2UgPT0gMi4KKy8vIFRoZSB2YXJpYWJsZSB1c2VkIHRvIGlkZW50aWZ5IG9mZmxvYWQgY29uc3RydWN0cyBjb250YWluZWQgaW4gb25lIHByb2NlZHVyZS4KKy8vIEluY3JlbWVudCBvZiBPRkZMT0FEX0NBTExfQ09VTlQgaXMgaW5zZXJ0ZWQgYXQgZW50cmllcyBvZiBIT1NUIHJvdXRpbmVzIHdpdGgKKy8vIG9mZmxvYWQgY29uc3RydWN0cy4KK3N0YXRpYyBpbnQgb2ZmbG9hZF9jYWxsX2NvdW50ID0gMDsKKworZXh0ZXJuICJDIiBPRkZMT0FEIE9GRkxPQURfVEFSR0VUX0FDUVVJUkUoCisgICAgVEFSR0VUX1RZUEUgICAgICB0YXJnZXRfdHlwZSwKKyAgICBpbnQgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsCisgICAgaW50ICAgICAgICAgICAgICBpc19vcHRpb25hbCwKKyAgICBfT2ZmbG9hZF9zdGF0dXMqIHN0YXR1cywKKyAgICBjb25zdCBjaGFyKiAgICAgIGZpbGUsCisgICAgdWludDY0X3QgICAgICAgICBsaW5lCispCit7CisgICAgYm9vbCByZXR2YWw7CisgICAgT0ZGTE9BRCBvZmxkOworCisgICAgLy8gaW5pdGlhbGl6ZSBzdGF0dXMKKyAgICBpZiAoc3RhdHVzICE9IDApIHsKKyAgICAgICAgc3RhdHVzLT5yZXN1bHQgPSBPRkZMT0FEX1VOQVZBSUxBQkxFOworICAgICAgICBzdGF0dXMtPmRldmljZV9udW1iZXIgPSAtMTsKKyAgICAgICAgc3RhdHVzLT5kYXRhX3NlbnQgPSAwOworICAgICAgICBzdGF0dXMtPmRhdGFfcmVjZWl2ZWQgPSAwOworICAgIH0KKworICAgIC8vIG1ha2Ugc3VyZSBsaWJyYXkgaXMgaW5pdGlhbGl6ZWQKKyAgICByZXR2YWwgPSBfX29mZmxvYWRfaW5pdF9saWJyYXJ5KCk7CisKKyAgICAvLyBPRkZMT0FEX1RJTUVSX0lOSVQgbXVzdCBmb2xsb3cgY2FsbCB0byBfX29mZmxvYWRfaW5pdF9saWJyYXJ5CisgICAgT2ZmbG9hZEhvc3RUaW1lckRhdGEgKiB0aW1lcl9kYXRhID0gT0ZGTE9BRF9USU1FUl9JTklUKGZpbGUsIGxpbmUpOworCisgICAgT0ZGTE9BRF9USU1FUl9TVEFSVCh0aW1lcl9kYXRhLCBjX29mZmxvYWRfaG9zdF90b3RhbF9vZmZsb2FkKTsKKworICAgIE9GRkxPQURfVElNRVJfU1RBUlQodGltZXJfZGF0YSwgY19vZmZsb2FkX2hvc3RfaW5pdGlhbGl6ZSk7CisKKyAgICAvLyBpbml0aWFsaXplIGFsbCBkZXZpY2VzIGlzIGluaXRfdHlwZSBpcyBvbl9vZmZsb2FkX2FsbAorICAgIGlmIChyZXR2YWwgJiYgX19vZmZsb2FkX2luaXRfdHlwZSA9PSBjX2luaXRfb25fb2ZmbG9hZF9hbGwpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtaWNfZW5naW5lc190b3RhbDsgaSsrKSB7CisgICAgICAgICAgICAgbWljX2VuZ2luZXNbaV0uaW5pdCgpOworICAgICAgICB9CisgICAgfQorICAgIE9GRkxPQURfVElNRVJfU1RPUCh0aW1lcl9kYXRhLCBjX29mZmxvYWRfaG9zdF9pbml0aWFsaXplKTsKKworICAgIE9GRkxPQURfVElNRVJfU1RBUlQodGltZXJfZGF0YSwgY19vZmZsb2FkX2hvc3RfdGFyZ2V0X2FjcXVpcmUpOworCisgICAgaWYgKHRhcmdldF90eXBlID09IFRBUkdFVF9IT1NUKSB7CisgICAgICAgIC8vIEhvc3QgYWx3YXlzIGF2YWlsYWJsZQorICAgICAgICByZXR2YWwgPSB0cnVlOworICAgIH0KKyAgICBlbHNlIGlmICh0YXJnZXRfdHlwZSA9PSBUQVJHRVRfTUlDKSB7CisgICAgICAgIGlmICh0YXJnZXRfbnVtYmVyID49IC0xKSB7CisgICAgICAgICAgICBpZiAocmV0dmFsKSB7CisgICAgICAgICAgICAgICAgaWYgKHRhcmdldF9udW1iZXIgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBVc2VyIHByb3ZpZGVkIHRoZSBkZXZpY2UgbnVtYmVyCisgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIgPSB0YXJnZXRfbnVtYmVyICUgbWljX2VuZ2luZXNfdG90YWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyB1c2UgZGV2aWNlIDAKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciA9IDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gcmVzZXJ2ZSBkZXZpY2UgaW4gT1JTTAorICAgICAgICAgICAgICAgIGlmIChpc19vcHRpb25hbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIU9SU0w6OnRyeV9yZXNlcnZlKHRhcmdldF9udW1iZXIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyID0gLTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghT1JTTDo6cmVzZXJ2ZSh0YXJnZXRfbnVtYmVyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciA9IC0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBkZXZpY2UKKyAgICAgICAgICAgICAgICBpZiAodGFyZ2V0X251bWJlciA+PSAwICYmCisgICAgICAgICAgICAgICAgICAgIF9fb2ZmbG9hZF9pbml0X3R5cGUgPT0gY19pbml0X29uX29mZmxvYWQpIHsKKyAgICAgICAgICAgICAgICAgICAgT0ZGTE9BRF9USU1FUl9TVEFSVCh0aW1lcl9kYXRhLCBjX29mZmxvYWRfaG9zdF9pbml0aWFsaXplKTsKKyAgICAgICAgICAgICAgICAgICAgbWljX2VuZ2luZXNbdGFyZ2V0X251bWJlcl0uaW5pdCgpOworICAgICAgICAgICAgICAgICAgICBPRkZMT0FEX1RJTUVSX1NUT1AodGltZXJfZGF0YSwgY19vZmZsb2FkX2hvc3RfaW5pdGlhbGl6ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gZmFsbGJhY2sgdG8gQ1BVCisgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciA9IC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodGFyZ2V0X251bWJlciA8IDAgfHwgIXJldHZhbCkgeworICAgICAgICAgICAgICAgIGlmICghaXNfb3B0aW9uYWwgJiYgc3RhdHVzID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2RldmljZV9pc19ub3RfYXZhaWxhYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR2YWwgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19pbnZhbGlkX2RldmljZV9udW1iZXIpOworICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChyZXR2YWwpIHsKKyAgICAgICAgb2ZsZCA9IG5ldyBPZmZsb2FkRGVzY3JpcHRvcih0YXJnZXRfbnVtYmVyLCBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWlzX29wdGlvbmFsLCBmYWxzZSwgdGltZXJfZGF0YSk7CisgICAgICAgIE9GRkxPQURfVElNRVJfSE9TVF9NSUNfTlVNKHRpbWVyX2RhdGEsIHRhcmdldF9udW1iZXIpOworICAgICAgICBPZmZsb2FkX1JlcG9ydF9Qcm9sb2codGltZXJfZGF0YSk7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0VfMSgyLCB0aW1lcl9kYXRhLT5vZmZsb2FkX251bWJlciwgY19vZmZsb2FkX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN0YXJ0aW5nIG9mZmxvYWQ6IHRhcmdldF90eXBlID0gJWQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJudW1iZXIgPSAlZCwgaXNfb3B0aW9uYWwgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCBpc19vcHRpb25hbCk7CisKKyAgICAgICAgT0ZGTE9BRF9USU1FUl9TVE9QKHRpbWVyX2RhdGEsIGNfb2ZmbG9hZF9ob3N0X3RhcmdldF9hY3F1aXJlKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIG9mbGQgPSBOVUxMOworCisgICAgICAgIE9GRkxPQURfVElNRVJfU1RPUCh0aW1lcl9kYXRhLCBjX29mZmxvYWRfaG9zdF90YXJnZXRfYWNxdWlyZSk7CisgICAgICAgIE9GRkxPQURfVElNRVJfU1RPUCh0aW1lcl9kYXRhLCBjX29mZmxvYWRfaG9zdF90b3RhbF9vZmZsb2FkKTsKKyAgICAgICAgb2ZmbG9hZF9yZXBvcnRfZnJlZV9kYXRhKHRpbWVyX2RhdGEpOworICAgIH0KKworICAgIHJldHVybiBvZmxkOworfQorCitleHRlcm4gIkMiIE9GRkxPQUQgT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRTEoCisgICAgY29uc3QgaW50KiAgZGV2aWNlX251bSwKKyAgICBjb25zdCBjaGFyKiBmaWxlLAorICAgIHVpbnQ2NF90ICAgIGxpbmUKKykKK3sKKyAgICBpbnQgdGFyZ2V0X251bWJlcjsKKworICAgIC8vIG1ha2Ugc3VyZSBsaWJyYXkgaXMgaW5pdGlhbGl6ZWQgYW5kIGF0IGxlYXN0IG9uZSBkZXZpY2UgaXMgYXZhaWxhYmxlCisgICAgaWYgKCFfX29mZmxvYWRfaW5pdF9saWJyYXJ5KCkpIHsKKyAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2RldmljZV9pc19ub3RfYXZhaWxhYmxlKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICAvLyBPRkZMT0FEX1RJTUVSX0lOSVQgbXVzdCBmb2xsb3cgY2FsbCB0byBfX29mZmxvYWRfaW5pdF9saWJyYXJ5CisKKyAgICBPZmZsb2FkSG9zdFRpbWVyRGF0YSAqIHRpbWVyX2RhdGEgPSBPRkZMT0FEX1RJTUVSX0lOSVQoZmlsZSwgbGluZSk7CisKKyAgICBPRkZMT0FEX1RJTUVSX1NUQVJUKHRpbWVyX2RhdGEsIGNfb2ZmbG9hZF9ob3N0X3RvdGFsX29mZmxvYWQpOworCisgICAgT0ZGTE9BRF9USU1FUl9TVEFSVCh0aW1lcl9kYXRhLCBjX29mZmxvYWRfaG9zdF9pbml0aWFsaXplKTsKKworICAgIGlmIChfX29mZmxvYWRfaW5pdF90eXBlID09IGNfaW5pdF9vbl9vZmZsb2FkX2FsbCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1pY19lbmdpbmVzX3RvdGFsOyBpKyspIHsKKyAgICAgICAgICAgICBtaWNfZW5naW5lc1tpXS5pbml0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBPRkZMT0FEX1RJTUVSX1NUT1AodGltZXJfZGF0YSwgY19vZmZsb2FkX2hvc3RfaW5pdGlhbGl6ZSk7CisKKyAgICBPRkZMT0FEX1RJTUVSX1NUQVJUKHRpbWVyX2RhdGEsIGNfb2ZmbG9hZF9ob3N0X3RhcmdldF9hY3F1aXJlKTsKKworICAgIC8vIHVzZSBkZWZhdWx0IGRldmljZSBudW1iZXIgaWYgaXQgaXMgbm90IHByb3ZpZGVkCisgICAgaWYgKGRldmljZV9udW0gIT0gMCkgeworICAgICAgICB0YXJnZXRfbnVtYmVyID0gKmRldmljZV9udW07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICB0YXJnZXRfbnVtYmVyID0gX19vbXBfZGV2aWNlX251bTsKKyAgICB9CisKKyAgICAvLyBkZXZpY2UgbnVtYmVyIHNob3VsZCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIHZhbHVlCisgICAgaWYgKHRhcmdldF9udW1iZXIgPCAwKSB7CisgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19vbXBfaW52YWxpZF9kZXZpY2VfbnVtKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICAvLyBzaG91bGQgd2UgZG8gdGhpcyBmb3IgT3Blbk1QPworICAgIHRhcmdldF9udW1iZXIgJT0gbWljX2VuZ2luZXNfdG90YWw7CisKKyAgICAvLyByZXNlcnZlIGRldmljZSBpbiBPUlNMCisgICAgaWYgKCFPUlNMOjpyZXNlcnZlKHRhcmdldF9udW1iZXIpKSB7CisgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19kZXZpY2VfaXNfbm90X2F2YWlsYWJsZSk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgLy8gaW5pdGlhbGl6ZSBkZXZpY2UocykKKyAgICBPRkZMT0FEX1RJTUVSX1NUQVJUKHRpbWVyX2RhdGEsIGNfb2ZmbG9hZF9ob3N0X2luaXRpYWxpemUpOworCisgICAgaWYgKF9fb2ZmbG9hZF9pbml0X3R5cGUgPT0gY19pbml0X29uX29mZmxvYWQpIHsKKyAgICAgICAgbWljX2VuZ2luZXNbdGFyZ2V0X251bWJlcl0uaW5pdCgpOworICAgIH0KKworICAgIE9GRkxPQURfVElNRVJfU1RPUCh0aW1lcl9kYXRhLCBjX29mZmxvYWRfaG9zdF9pbml0aWFsaXplKTsKKworICAgIE9GRkxPQUQgb2ZsZCA9CisgICAgICAgIG5ldyBPZmZsb2FkRGVzY3JpcHRvcih0YXJnZXRfbnVtYmVyLCAwLCB0cnVlLCB0cnVlLCB0aW1lcl9kYXRhKTsKKworICAgIE9GRkxPQURfVElNRVJfSE9TVF9NSUNfTlVNKHRpbWVyX2RhdGEsIHRhcmdldF9udW1iZXIpOworCisgICAgT2ZmbG9hZF9SZXBvcnRfUHJvbG9nKHRpbWVyX2RhdGEpOworCisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKDIsIHRpbWVyX2RhdGEtPm9mZmxvYWRfbnVtYmVyLCBjX29mZmxvYWRfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJTdGFydGluZyBPcGVuTVAgb2ZmbG9hZCwgZGV2aWNlID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIpOworCisgICAgT0ZGTE9BRF9USU1FUl9TVE9QKHRpbWVyX2RhdGEsIGNfb2ZmbG9hZF9ob3N0X3RhcmdldF9hY3F1aXJlKTsKKworICAgIHJldHVybiBvZmxkOworfQorCitpbnQgb2ZmbG9hZF9vZmZsb2FkX3dyYXAoCisgICAgT0ZGTE9BRCBvZmxkLAorICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgaW50IGlzX2VtcHR5LAorICAgIGludCBudW1fdmFycywKKyAgICBWYXJEZXNjICp2YXJzLAorICAgIFZhckRlc2MyICp2YXJzMiwKKyAgICBpbnQgbnVtX3dhaXRzLAorICAgIGNvbnN0IHZvaWQgKip3YWl0cywKKyAgICBjb25zdCB2b2lkICoqc2lnbmFsLAorICAgIGludCBlbnRyeV9pZCwKKyAgICBjb25zdCB2b2lkICpzdGFja19hZGRyCispCit7CisgICAgYm9vbCByZXQgPSBvZmxkLT5vZmZsb2FkKG5hbWUsIGlzX2VtcHR5LCB2YXJzLCB2YXJzMiwgbnVtX3ZhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRzLCBudW1fd2FpdHMsIHNpZ25hbCwgZW50cnlfaWQsIHN0YWNrX2FkZHIpOworICAgIGlmICghcmV0IHx8IHNpZ25hbCA9PSAwKSB7CisgICAgICAgIGRlbGV0ZSBvZmxkOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitleHRlcm4gIkMiIGludCBPRkZMT0FEX09GRkxPQUQxKAorICAgIE9GRkxPQUQgb2ZsZCwKKyAgICBjb25zdCBjaGFyICpuYW1lLAorICAgIGludCBpc19lbXB0eSwKKyAgICBpbnQgbnVtX3ZhcnMsCisgICAgVmFyRGVzYyAqdmFycywKKyAgICBWYXJEZXNjMiAqdmFyczIsCisgICAgaW50IG51bV93YWl0cywKKyAgICBjb25zdCB2b2lkICoqd2FpdHMsCisgICAgY29uc3Qgdm9pZCAqKnNpZ25hbAorKQoreworICAgIHJldHVybiBvZmZsb2FkX29mZmxvYWRfd3JhcChvZmxkLCBuYW1lLCBpc19lbXB0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fdmFycywgdmFycywgdmFyczIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3dhaXRzLCB3YWl0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYWwsIE5VTEwsIE5VTEwpOworfQorCitleHRlcm4gIkMiIGludCBPRkZMT0FEX09GRkxPQUQyKAorICAgIE9GRkxPQUQgb2ZsZCwKKyAgICBjb25zdCBjaGFyICpuYW1lLAorICAgIGludCBpc19lbXB0eSwKKyAgICBpbnQgbnVtX3ZhcnMsCisgICAgVmFyRGVzYyAqdmFycywKKyAgICBWYXJEZXNjMiAqdmFyczIsCisgICAgaW50IG51bV93YWl0cywKKyAgICBjb25zdCB2b2lkKiogd2FpdHMsCisgICAgY29uc3Qgdm9pZCoqIHNpZ25hbCwKKyAgICBpbnQgZW50cnlfaWQsCisgICAgY29uc3Qgdm9pZCAqc3RhY2tfYWRkcgorKQoreworICAgIHJldHVybiBvZmZsb2FkX29mZmxvYWRfd3JhcChvZmxkLCBuYW1lLCBpc19lbXB0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fdmFycywgdmFycywgdmFyczIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3dhaXRzLCB3YWl0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYWwsIGVudHJ5X2lkLCBzdGFja19hZGRyKTsKK30KKworZXh0ZXJuICJDIiBpbnQgT0ZGTE9BRF9PRkZMT0FEKAorICAgIE9GRkxPQUQgb2ZsZCwKKyAgICBjb25zdCBjaGFyICpuYW1lLAorICAgIGludCBpc19lbXB0eSwKKyAgICBpbnQgbnVtX3ZhcnMsCisgICAgVmFyRGVzYyAqdmFycywKKyAgICBWYXJEZXNjMiAqdmFyczIsCisgICAgaW50IG51bV93YWl0cywKKyAgICBjb25zdCB2b2lkICoqd2FpdHMsCisgICAgY29uc3Qgdm9pZCAqc2lnbmFsLAorICAgIGludCBlbnRyeV9pZCwKKyAgICBjb25zdCB2b2lkICpzdGFja19hZGRyCispCit7CisgICAgLy8gc2lnbmFsIGlzIHBhc3NlZCBieSByZWZlcmVuY2Ugbm93CisgICAgY29uc3Qgdm9pZCAqKnNpZ25hbF9uZXcgPSAoc2lnbmFsICE9IDApID8gJnNpZ25hbCA6IDA7CisgICAgY29uc3Qgdm9pZCAqKndhaXRzX25ldyA9IDA7CisgICAgaW50IG51bV93YWl0c19uZXcgPSAwOworCisgICAgLy8gcmVtb3ZlIE5VTEwgdmFsdWVzIGZyb20gdGhlIGxpc3Qgb2Ygc2lnbmFscyB0byB3YWl0IGZvcgorICAgIGlmIChudW1fd2FpdHMgPiAwKSB7CisgICAgICAgIHdhaXRzX25ldyA9IChjb25zdCB2b2lkKiopIGFsbG9jYShzaXplb2Yodm9pZCopICogbnVtX3dhaXRzKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fd2FpdHM7IGkrKykgeworICAgICAgICAgICAgaWYgKHdhaXRzW2ldICE9IDApIHsKKyAgICAgICAgICAgICAgICB3YWl0c19uZXdbbnVtX3dhaXRzX25ldysrXSA9IHdhaXRzW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9GRkxPQURfT0ZGTE9BRDEob2ZsZCwgbmFtZSwgaXNfZW1wdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3ZhcnMsIHZhcnMsIHZhcnMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV93YWl0c19uZXcsIHdhaXRzX25ldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYWxfbmV3KTsKK30KKworZXh0ZXJuICJDIiBpbnQgT0ZGTE9BRF9DQUxMX0NPVU5UKCkKK3sKKyAgICBvZmZsb2FkX2NhbGxfY291bnQrKzsKKyAgICByZXR1cm4gb2ZmbG9hZF9jYWxsX2NvdW50OworfQpkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvY29tcGlsZXJfaWZfaG9zdC5oIGIvZmluYWwvb2ZmbG9hZC9zcmMvY29tcGlsZXJfaWZfaG9zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMzRjNTEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9jb21waWxlcl9pZl9ob3N0LmgKQEAgLTAsMCArMSwxMzMgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLyohIFxmaWxlCisgICAgXGJyaWVmIFRoZSBpbnRlcmZhY2UgYmV0d2VlbiBjb21waWxlci1nZW5lcmF0ZWQgaG9zdCBjb2RlIGFuZCBydW50aW1lIGxpYnJhcnkKKyovCisKKyNpZm5kZWYgQ09NUElMRVJfSUZfSE9TVF9IX0lOQ0xVREVECisjZGVmaW5lIENPTVBJTEVSX0lGX0hPU1RfSF9JTkNMVURFRAorCisjaW5jbHVkZSAib2ZmbG9hZF9ob3N0LmgiCisKKyNkZWZpbmUgT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSAgICAgICAgICBPRkZMT0FEX1BSRUZJWCh0YXJnZXRfYWNxdWlyZSkKKyNkZWZpbmUgT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRTEgICAgICAgICBPRkZMT0FEX1BSRUZJWCh0YXJnZXRfYWNxdWlyZTEpCisjZGVmaW5lIE9GRkxPQURfT0ZGTE9BRCAgICAgICAgICAgICAgICAgT0ZGTE9BRF9QUkVGSVgob2ZmbG9hZCkKKyNkZWZpbmUgT0ZGTE9BRF9PRkZMT0FEMSAgICAgICAgICAgICAgICBPRkZMT0FEX1BSRUZJWChvZmZsb2FkMSkKKyNkZWZpbmUgT0ZGTE9BRF9PRkZMT0FEMiAgICAgICAgICAgICAgICBPRkZMT0FEX1BSRUZJWChvZmZsb2FkMikKKyNkZWZpbmUgT0ZGTE9BRF9DQUxMX0NPVU5UICAgICAgICAgICAgICBPRkZMT0FEX1BSRUZJWChvZmZsb2FkX2NhbGxfY291bnQpCisKKworLyohIFxmbiBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFCisgICAgXGJyaWVmIEF0dGVtcHQgdG8gYWNxdWlyZSB0aGUgdGFyZ2V0LgorICAgIFxwYXJhbSB0YXJnZXRfdHlwZSAgIFRoZSB0eXBlIG9mIHRhcmdldC4KKyAgICBccGFyYW0gdGFyZ2V0X251bWJlciBUaGUgZGV2aWNlIG51bWJlci4KKyAgICBccGFyYW0gaXNfb3B0aW9uYWwgICBXaGV0aGVyIENQVSBmYWxsLWJhY2sgaXMgYWxsb3dlZC4KKyAgICBccGFyYW0gc3RhdHVzICAgICAgICBBZGRyZXNzIG9mIHZhcmlhYmxlIHRvIGhvbGQgb2ZmbG9hZCBzdGF0dXMuCisgICAgXHBhcmFtIGZpbGUgICAgICAgICAgRmlsZW5hbWUgaW4gd2hpY2ggdGhpcyBvZmZsb2FkIG9jY3VycmVkLgorICAgIFxwYXJhbSBsaW5lICAgICAgICAgIExpbmUgbnVtYmVyIGluIHRoZSBmaWxlIHdoZXJlIHRoaXMgb2ZmbG9hZCBvY2N1cnJlZC4KKyovCitleHRlcm4gIkMiIE9GRkxPQUQgT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSgKKyAgICBUQVJHRVRfVFlQRSAgICAgIHRhcmdldF90eXBlLAorICAgIGludCAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgICAgICAgICAgICAgIGlzX29wdGlvbmFsLAorICAgIF9PZmZsb2FkX3N0YXR1cyogc3RhdHVzLAorICAgIGNvbnN0IGNoYXIqICAgICAgZmlsZSwKKyAgICB1aW50NjRfdCAgICAgICAgIGxpbmUKKyk7CisKKy8qISBcZm4gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRTEKKyAgICBcYnJpZWYgQWNxdWlyZSB0aGUgdGFyZ2V0IGZvciBvZmZsb2FkIChPcGVuTVApLgorICAgIFxwYXJhbSBkZXZpY2VfbnVtYmVyIERldmljZSBudW1iZXIgb3IgbnVsbCBpZiBub3Qgc3BlY2lmaWVkLgorICAgIFxwYXJhbSBmaWxlICAgICAgICAgIEZpbGVuYW1lIGluIHdoaWNoIHRoaXMgb2ZmbG9hZCBvY2N1cnJlZAorICAgIFxwYXJhbSBsaW5lICAgICAgICAgIExpbmUgbnVtYmVyIGluIHRoZSBmaWxlIHdoZXJlIHRoaXMgb2ZmbG9hZCBvY2N1cnJlZC4KKyovCitleHRlcm4gIkMiIE9GRkxPQUQgT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRTEoCisgICAgY29uc3QgaW50KiAgICAgIGRldmljZV9udW1iZXIsCisgICAgY29uc3QgY2hhciogICAgIGZpbGUsCisgICAgdWludDY0X3QgICAgICAgIGxpbmUKKyk7CisKKy8qISBcZm4gT0ZGTE9BRF9PRkZMT0FEMQorICAgIFxicmllZiBSdW4gZnVuY3Rpb24gb24gdGFyZ2V0IHVzaW5nIGludGVyZmFjZSBmb3Igb2xkIGRhdGEgcGVyc2lzdGVuY2UuCisgICAgXHBhcmFtIG8gT2ZmbG9hZCBkZXNjcmlwdG9yIGNyZWF0ZWQgYnkgT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRS4KKyAgICBccGFyYW0gbmFtZSBOYW1lIG9mIG9mZmxvYWQgZW50cnkgcG9pbnQuCisgICAgXHBhcmFtIGlzX2VtcHR5IElmIG5vIGNvZGUgdG8gZXhlY3V0ZSAoZS5nLiBvZmZsb2FkX3RyYW5zZmVyKQorICAgIFxwYXJhbSBudW1fdmFycyBOdW1iZXIgb2YgdmFyaWFibGUgZGVzY3JpcHRvcnMuCisgICAgXHBhcmFtIHZhcnMgUG9pbnRlciB0byBWYXJEZXNjIGFycmF5LgorICAgIFxwYXJhbSB2YXJzMiBQb2ludGVyIHRvIFZhckRlc2MyIGFycmF5LgorICAgIFxwYXJhbSBudW1fd2FpdHMgTnVtYmVyIG9mICJ3YWl0IiB2YWx1ZXMuCisgICAgXHBhcmFtIHdhaXRzIFBvaW50ZXIgdG8gYXJyYXkgb2Ygd2FpdCB2YWx1ZXMuCisgICAgXHBhcmFtIHNpZ25hbCBQb2ludGVyIHRvIHNpZ25hbCB2YWx1ZSBvciBOVUxMLgorKi8KK2V4dGVybiAiQyIgaW50IE9GRkxPQURfT0ZGTE9BRDEoCisgICAgT0ZGTE9BRCBvLAorICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgaW50IGlzX2VtcHR5LAorICAgIGludCBudW1fdmFycywKKyAgICBWYXJEZXNjICp2YXJzLAorICAgIFZhckRlc2MyICp2YXJzMiwKKyAgICBpbnQgbnVtX3dhaXRzLAorICAgIGNvbnN0IHZvaWQqKiB3YWl0cywKKyAgICBjb25zdCB2b2lkKiogc2lnbmFsCispOworCisvKiEgXGZuIE9GRkxPQURfT0ZGTE9BRDIKKyAgICBcYnJpZWYgUnVuIGZ1bmN0aW9uIG9uIHRhcmdldCB1c2luZyBpbnRlcmZhY2UgZm9yIG5ldyBkYXRhIHBlcnNpc3RlbmNlLgorICAgIFxwYXJhbSBvIE9mZmxvYWQgZGVzY3JpcHRvciBjcmVhdGVkIGJ5IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUuCisgICAgXHBhcmFtIG5hbWUgTmFtZSBvZiBvZmZsb2FkIGVudHJ5IHBvaW50LgorICAgIFxwYXJhbSBpc19lbXB0eSBJZiBubyBjb2RlIHRvIGV4ZWN1dGUgKGUuZy4gb2ZmbG9hZF90cmFuc2ZlcikKKyAgICBccGFyYW0gbnVtX3ZhcnMgTnVtYmVyIG9mIHZhcmlhYmxlIGRlc2NyaXB0b3JzLgorICAgIFxwYXJhbSB2YXJzIFBvaW50ZXIgdG8gVmFyRGVzYyBhcnJheS4KKyAgICBccGFyYW0gdmFyczIgUG9pbnRlciB0byBWYXJEZXNjMiBhcnJheS4KKyAgICBccGFyYW0gbnVtX3dhaXRzIE51bWJlciBvZiAid2FpdCIgdmFsdWVzLgorICAgIFxwYXJhbSB3YWl0cyBQb2ludGVyIHRvIGFycmF5IG9mIHdhaXQgdmFsdWVzLgorICAgIFxwYXJhbSBzaWduYWwgUG9pbnRlciB0byBzaWduYWwgdmFsdWUgb3IgTlVMTC4KKyAgICBccGFyYW0gZW50cnlfaWQgQSBzaWduYXR1cmUgZm9yIHRoZSBmdW5jdGlvbiBkb2luZyB0aGUgb2ZmbG9hZC4KKyAgICBccGFyYW0gc3RhY2tfYWRkciBUaGUgc3RhY2sgZnJhbWUgYWRkcmVzcyBvZiB0aGUgZnVuY3Rpb24gZG9pbmcgb2ZmbG9hZC4KKyovCitleHRlcm4gIkMiIGludCBPRkZMT0FEX09GRkxPQUQyKAorICAgIE9GRkxPQUQgbywKKyAgICBjb25zdCBjaGFyICpuYW1lLAorICAgIGludCBpc19lbXB0eSwKKyAgICBpbnQgbnVtX3ZhcnMsCisgICAgVmFyRGVzYyAqdmFycywKKyAgICBWYXJEZXNjMiAqdmFyczIsCisgICAgaW50IG51bV93YWl0cywKKyAgICBjb25zdCB2b2lkKiogd2FpdHMsCisgICAgY29uc3Qgdm9pZCoqIHNpZ25hbCwKKyAgICBpbnQgZW50cnlfaWQsCisgICAgY29uc3Qgdm9pZCAqc3RhY2tfYWRkcgorKTsKKworLy8gUnVuIGZ1bmN0aW9uIG9uIHRhcmdldCAob2Jzb2xldGUpLgorLy8gQHBhcmFtIG8gICAgT0ZGTE9BRCBvYmplY3QKKy8vIEBwYXJhbSBuYW1lIGZ1bmN0aW9uIG5hbWUKK2V4dGVybiAiQyIgaW50IE9GRkxPQURfT0ZGTE9BRCgKKyAgICBPRkZMT0FEIG8sCisgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICBpbnQgaXNfZW1wdHksCisgICAgaW50IG51bV92YXJzLAorICAgIFZhckRlc2MgKnZhcnMsCisgICAgVmFyRGVzYzIgKnZhcnMyLAorICAgIGludCBudW1fd2FpdHMsCisgICAgY29uc3Qgdm9pZCoqIHdhaXRzLAorICAgIGNvbnN0IHZvaWQqIHNpZ25hbCwKKyAgICBpbnQgZW50cnlfaWQgPSAwLAorICAgIGNvbnN0IHZvaWQgKnN0YWNrX2FkZHIgPSBOVUxMCispOworCisvLyBHbG9iYWwgY291bnRlciBvbiBob3N0LgorLy8gVGhpcyB2YXJpYWJsZSBpcyB1c2VkIGlmIFAyT1BUX29mZmxvYWRfZG9fZGF0YV9wZXJzaXN0ZW5jZSA9PSAyLgorLy8gVGhlIHZhcmlhYmxlIHVzZWQgdG8gaWRlbnRpZnkgb2ZmbG9hZCBjb25zdHJ1Y3RzIGNvbnRhaW5lZCBpbiBvbmUgcHJvY2VkdXJlLgorLy8gQ2FsbCB0byBPRkZMT0FEX0NBTExfQ09VTlQoKSBpcyBpbnNlcnRlZCBhdCBIT1NUIG9uIGVudHJ5IG9mIHRoZSByb3V0aW5lLgorZXh0ZXJuICJDIiBpbnQgIE9GRkxPQURfQ0FMTF9DT1VOVCgpOworCisjZW5kaWYgLy8gQ09NUElMRVJfSUZfSE9TVF9IX0lOQ0xVREVECmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9jb21waWxlcl9pZl90YXJnZXQuY3BwIGIvZmluYWwvb2ZmbG9hZC9zcmMvY29tcGlsZXJfaWZfdGFyZ2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWY4MmI4Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvY29tcGlsZXJfaWZfdGFyZ2V0LmNwcApAQCAtMCwwICsxLDQ0IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJjb21waWxlcl9pZl90YXJnZXQuaCIKKworZXh0ZXJuICJDIiB2b2lkIE9GRkxPQURfVEFSR0VUX0VOVEVSKAorICAgIE9GRkxPQUQgb2ZsZCwKKyAgICBpbnQgdmFyc190b3RhbCwKKyAgICBWYXJEZXNjICp2YXJzLAorICAgIFZhckRlc2MyICp2YXJzMgorKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzKCVwLCAlZCwgJXAsICVwKVxuIiwgX19mdW5jX18sIG9mbGQsCisgICAgICAgICAgICAgICAgICAgICAgICB2YXJzX3RvdGFsLCB2YXJzLCB2YXJzMik7CisgICAgb2ZsZC0+bWVyZ2VfdmFyX2Rlc2NzKHZhcnMsIHZhcnMyLCB2YXJzX3RvdGFsKTsKKyAgICBvZmxkLT5zY2F0dGVyX2NvcHlpbl9kYXRhKCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBPRkZMT0FEX1RBUkdFVF9MRUFWRSgKKyAgICBPRkZMT0FEIG9mbGQKKykKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlcyglcClcbiIsIF9fZnVuY19fLCBvZmxkKTsKKyAgICBvZmxkLT5nYXRoZXJfY29weW91dF9kYXRhKCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBPRkZMT0FEX1RBUkdFVF9NQUlOKHZvaWQpCit7CisgICAgLy8gaW5pdGlhbGl6ZSB0YXJnZXQgcGFydAorICAgIF9fb2ZmbG9hZF90YXJnZXRfaW5pdCgpOworCisgICAgLy8gcGFzcyBjb250cm9sIHRvIENPSQorICAgIFBpcGVsaW5lU3RhcnRFeGVjdXRpbmdSdW5GdW5jdGlvbnMoKTsKKyAgICBQcm9jZXNzV2FpdEZvclNodXRkb3duKCk7CisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJFeGl0aW5nIG1haW4uLi5cbiIpOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvY29tcGlsZXJfaWZfdGFyZ2V0LmggYi9maW5hbC9vZmZsb2FkL3NyYy9jb21waWxlcl9pZl90YXJnZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWQyYzFjCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvY29tcGlsZXJfaWZfdGFyZ2V0LmgKQEAgLTAsMCArMSw1MCBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisvKiEgXGZpbGUKKyAgICBcYnJpZWYgVGhlIGludGVyZmFjZSBiZXR3ZWVuIGNvbXBpbGVyLWdlbmVyYXRlZCB0YXJnZXQgY29kZSBhbmQgcnVudGltZSBsaWJyYXJ5CisqLworCisjaWZuZGVmIENPTVBJTEVSX0lGX1RBUkdFVF9IX0lOQ0xVREVECisjZGVmaW5lIENPTVBJTEVSX0lGX1RBUkdFVF9IX0lOQ0xVREVECisKKyNpbmNsdWRlICJvZmZsb2FkX3RhcmdldC5oIgorCisjZGVmaW5lIE9GRkxPQURfVEFSR0VUX0VOVEVSICAgICAgICAgICAgT0ZGTE9BRF9QUkVGSVgodGFyZ2V0X2VudGVyKQorI2RlZmluZSBPRkZMT0FEX1RBUkdFVF9MRUFWRSAgICAgICAgICAgIE9GRkxPQURfUFJFRklYKHRhcmdldF9sZWF2ZSkKKyNkZWZpbmUgT0ZGTE9BRF9UQVJHRVRfTUFJTiAgICAgICAgICAgICBPRkZMT0FEX1BSRUZJWCh0YXJnZXRfbWFpbikKKworLyohIFxmbiBPRkZMT0FEX1RBUkdFVF9FTlRFUgorICAgIFxicmllZiBGaWxsIGluIHZhcmlhYmxlIGFkZHJlc3NlcyB1c2luZyBWYXJEZXNjIGFycmF5LgorICAgIFxicmllZiBUaGVuIGNhbGwgYmFjayB0aGUgcnVudGltZSBsaWJyYXJ5IHRvIGZldGNoIGRhdGEuCisgICAgXHBhcmFtIG9mbGQgICAgICAgICBPZmZsb2FkIGRlc2NyaXB0b3IgY3JlYXRlZCBieSBydW50aW1lLgorICAgIFxwYXJhbSB2YXJfZGVzY19udW0gTnVtYmVyIG9mIHZhcmlhYmxlIGRlc2NyaXB0b3JzLgorICAgIFxwYXJhbSB2YXJfZGVzYyAgICAgUG9pbnRlciB0byBWYXJEZXNjIGFycmF5LgorICAgIFxwYXJhbSB2YXJfZGVzYzIgICAgUG9pbnRlciB0byBWYXJEZXNjMiBhcnJheS4KKyovCitleHRlcm4gIkMiIHZvaWQgT0ZGTE9BRF9UQVJHRVRfRU5URVIoCisgICAgT0ZGTE9BRCBvZmxkLAorICAgIGludCB2YXJfZGVzY19udW0sCisgICAgVmFyRGVzYyAqdmFyX2Rlc2MsCisgICAgVmFyRGVzYzIgKnZhcl9kZXNjMgorKTsKKworLyohIFxmbiBPRkZMT0FEX1RBUkdFVF9MRUFWRQorICAgIFxicmllZiBDYWxsIGJhY2sgdGhlIHJ1bnRpbWUgbGlicmFyeSB0byBnYXRoZXIgb3V0cHV0cyB1c2luZyBWYXJEZXNjIGFycmF5LgorICAgIFxwYXJhbSBvZmxkIE9mZmxvYWQgZGVzY3JpcHRvciBjcmVhdGVkIGJ5IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUuCisqLworZXh0ZXJuICJDIiB2b2lkIE9GRkxPQURfVEFSR0VUX0xFQVZFKAorICAgIE9GRkxPQUQgb2ZsZAorKTsKKworLy8gRW50cnkgcG9pbnQgZm9yIHRoZSB0YXJnZXQgYXBwbGljYXRpb24uCitleHRlcm4gIkMiIHZvaWQgT0ZGTE9BRF9UQVJHRVRfTUFJTih2b2lkKTsKKworI2VuZGlmIC8vIENPTVBJTEVSX0lGX1RBUkdFVF9IX0lOQ0xVREVECmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9kdl91dGlsLmNwcCBiL2ZpbmFsL29mZmxvYWQvc3JjL2R2X3V0aWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZDcyNzEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9kdl91dGlsLmNwcApAQCAtMCwwICsxLDEzMSBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAib2ZmbG9hZF9jb21tb24uaCIKKworYm9vbCBfX2R2X2lzX2NvbnRpZ3VvdXMoY29uc3QgQXJyRGVzYyAqZHZwKQoreworICAgIGlmIChkdnAtPkZsYWdzICYgQXJyRGVzY0ZsYWdzQ29udGlndW91cykgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoZHZwLT5SYW5rICE9IDApIHsKKyAgICAgICAgaWYgKGR2cC0+RGltWzBdLk11bHQgIT0gZHZwLT5MZW4pIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGR2cC0+UmFuazsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZHZwLT5EaW1baV0uTXVsdCAhPQorICAgICAgICAgICAgICAgIGR2cC0+RGltW2ktMV0uRXh0ZW50ICogZHZwLT5EaW1baS0xXS5NdWx0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIF9fZHZfaXNfYWxsb2NhdGVkKGNvbnN0IEFyckRlc2MgKmR2cCkKK3sKKyAgICByZXR1cm4gKGR2cC0+RmxhZ3MgJiBBcnJEZXNjRmxhZ3NEZWZpbmVkKTsKK30KKwordWludDY0X3QgX19kdl9kYXRhX2xlbmd0aChjb25zdCBBcnJEZXNjICpkdnApCit7CisgICAgdWludDY0X3Qgc2l6ZTsKKworICAgIGlmIChkdnAtPlJhbmsgPT0gMCkgeworICAgICAgICBzaXplID0gZHZwLT5MZW47CisgICAgICAgIHJldHVybiBzaXplOworICAgIH0KKworICAgIHNpemUgPSBkdnAtPkxlbjsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGR2cC0+UmFuazsgKytpKSB7CisgICAgICAgIHNpemUgKz0gKGR2cC0+RGltW2ldLkV4dGVudC0xKSAqIGR2cC0+RGltW2ldLk11bHQ7CisgICAgfQorICAgIHJldHVybiBzaXplOworfQorCit1aW50NjRfdCBfX2R2X2RhdGFfbGVuZ3RoKGNvbnN0IEFyckRlc2MgKmR2cCwgaW50NjRfdCBjb3VudCkKK3sKKyAgICBpZiAoZHZwLT5SYW5rID09IDApIHsKKyAgICAgICAgcmV0dXJuIGNvdW50OworICAgIH0KKworICAgIHJldHVybiBjb3VudCAqIGR2cC0+RGltWzBdLk11bHQ7Cit9CisKKy8vIENyZWF0ZSBDZWFuUmVhZFJhbmdlcyBkYXRhIGZvciByZWFkaW5nIGNvbnRpZ3VvdXMgcmFuZ2VzIG9mCisvLyBub25jb250aWd1b3VzIGFycmF5IGRlZmluZWQgYnkgdGhlIGFyZ3VtZW50CitDZWFuUmVhZFJhbmdlcyAqIGluaXRfcmVhZF9yYW5nZXNfZHYoY29uc3QgQXJyRGVzYyAqZHZwKQoreworICAgIGludDY0X3QgICAgICAgICBsZW47CisgICAgaW50ICAgICAgICAgICAgIGNvdW50OworICAgIGludCAgICAgICAgICAgICByYW5rID0gZHZwLT5SYW5rOworICAgIENlYW5SZWFkUmFuZ2VzICpyZXMgPSBOVUxMOworCisgICAgaWYgKHJhbmsgIT0gMCkgeworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIGxlbiA9IGR2cC0+TGVuOworICAgICAgICBpZiAoZHZwLT5EaW1bMF0uTXVsdCA9PSBsZW4pIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCByYW5rOyBpKyspIHsKKyAgICAgICAgICAgICAgICBsZW4gKj0gZHZwLT5EaW1baS0xXS5FeHRlbnQ7CisgICAgICAgICAgICAgICAgaWYgKGR2cC0+RGltW2ldLk11bHQgIT0gbGVuKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXMgPSAoQ2VhblJlYWRSYW5nZXMgKiltYWxsb2MoCisgICAgICAgICAgICBzaXplb2YoQ2VhblJlYWRSYW5nZXMpICsgKHJhbmsgLSBpKSAqIHNpemVvZihDZWFuUmVhZERpbSkpOworICAgICAgICByZXMgLT4gbGFzdF9ub25jb250X2luZCA9IHJhbmsgLSBpIC0gMTsKKyAgICAgICAgY291bnQgPSAxOworICAgICAgICBmb3IgKDsgaSA8IHJhbms7IGkrKykgeworICAgICAgICAgICAgcmVzLT5EaW1bcmFuayAtIGkgLSAxXS5jb3VudCA9IGNvdW50OworICAgICAgICAgICAgcmVzLT5EaW1bcmFuayAtIGkgLSAxXS5zaXplID0gZHZwLT5EaW1baV0uTXVsdDsKKyAgICAgICAgICAgIGNvdW50ICo9IGR2cC0+RGltW2ldLkV4dGVudDsKKyAgICAgICAgfQorICAgICAgICByZXMgLT4gcmFuZ2VfbWF4X251bWJlciA9IGNvdW50OworICAgICAgICByZXMgLT4gcmFuZ2Vfc2l6ZSA9IGxlbjsKKyAgICAgICAgcmVzIC0+IHB0ciA9ICh2b2lkKilkdnAtPkJhc2U7CisgICAgICAgIHJlcyAtPiBjdXJyZW50X251bWJlciA9IDA7CisgICAgICAgIHJlcyAtPiBpbml0X29mZnNldCA9IDA7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKKyNpZiBPRkZMT0FEX0RFQlVHID4gMAordm9pZCBfX2R2X2Rlc2NfZHVtcChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBBcnJEZXNjICpkdnApCit7CisgICAgT0ZGTE9BRF9UUkFDRSgzLCAiJXMgRFYgJXBcbiIsIG5hbWUsIGR2cCk7CisKKyAgICBpZiAoZHZwICE9IDApIHsKKyAgICAgICAgT0ZGTE9BRF9UUkFDRSgzLAorICAgICAgICAgICAgICAgICAgICAgICIgICAgZHYtPkJhc2UgICA9IDB4JWx4XG4iCisgICAgICAgICAgICAgICAgICAgICAgIiAgICBkdi0+TGVuICAgID0gMHglbHhcbiIKKyAgICAgICAgICAgICAgICAgICAgICAiICAgIGR2LT5PZmZzZXQgPSAweCVseFxuIgorICAgICAgICAgICAgICAgICAgICAgICIgICAgZHYtPkZsYWdzICA9IDB4JWx4XG4iCisgICAgICAgICAgICAgICAgICAgICAgIiAgICBkdi0+UmFuayAgID0gMHglbHhcbiIKKyAgICAgICAgICAgICAgICAgICAgICAiICAgIGR2LT5SZXNydmQgPSAweCVseFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBkdnAtPkJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgZHZwLT5MZW4sCisgICAgICAgICAgICAgICAgICAgICAgZHZwLT5PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgZHZwLT5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICBkdnAtPlJhbmssCisgICAgICAgICAgICAgICAgICAgICAgZHZwLT5SZXNlcnZlZCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgZHZwLT5SYW5rOyBpKyspIHsKKyAgICAgICAgICAgIE9GRkxPQURfVFJBQ0UoMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAoJWQpIEV4dGVudD0lbGQsIE11bHRpcGxpZXI9JWxkLCBMb3dlckJvdW5kPSVsZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZHZwLT5EaW1baV0uRXh0ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBkdnAtPkRpbVtpXS5NdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBkdnAtPkRpbVtpXS5Mb3dlckJvdW5kKTsKKyAgICAgICAgfQorICAgIH0KK30KKyNlbmRpZiAvLyBPRkZMT0FEX0RFQlVHID4gMApkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvZHZfdXRpbC5oIGIvZmluYWwvb2ZmbG9hZC9zcmMvZHZfdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZmE3N2QKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9kdl91dGlsLmgKQEAgLTAsMCArMSw2MyBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIERWX1VUSUxfSF9JTkNMVURFRAorI2RlZmluZSBEVl9VVElMX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvLyBEb3BlIHZlY3RvciBkZWNsYXJhdGlvbnMKKyNkZWZpbmUgQXJyRGVzY01heEFycmF5UmFuayAgICAgICAgIDMxCisKKy8vIERvcGUgdmVjdG9yIGZsYWdzCisjZGVmaW5lIEFyckRlc2NGbGFnc0RlZmluZWQgICAgICAgICAxCisjZGVmaW5lIEFyckRlc2NGbGFnc05vZGVhbGxvYyAgICAgICAyCisjZGVmaW5lIEFyckRlc2NGbGFnc0NvbnRpZ3VvdXMgICAgICA0CisKK3R5cGVkZWYgaW50NjRfdCBkdl9zaXplOworCit0eXBlZGVmIHN0cnVjdCBEaW1EZXNjIHsKKyAgICBkdl9zaXplICAgICAgICBFeHRlbnQ7ICAgICAgLy8gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMgZGltZW5zaW9uCisgICAgZHZfc2l6ZSAgICAgICAgTXVsdDsgICAgICAgIC8vIE11bHRpcGxpZXIgZm9yIHRoaXMgZGltZW5zaW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgbnVtYmVyIG9mIGJ5dGVzIGJldHdlZW4gc3VjY2Vzc2l2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbGVtZW50cyBpbiB0aGlzIGRpbWVuc2lvbi4KKyAgICBkdl9zaXplICAgICAgICBMb3dlckJvdW5kOyAgLy8gTG93ZXJCb3VuZCBvZiB0aGlzIGRpbWVuc2lvbgorfSBEaW1EZXNjIDsKKwordHlwZWRlZiBzdHJ1Y3QgQXJyRGVzYyB7CisgICAgZHZfc2l6ZSAgICAgICAgQmFzZTsgICAgICAgIC8vIEJhc2UgYWRkcmVzcworICAgIGR2X3NpemUgICAgICAgIExlbjsgICAgICAgICAvLyBMZW5ndGggb2YgZGF0YSB0eXBlLCB1c2VkIG9ubHkgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoYXJhY3RlciBzdHJpbmdzLgorICAgIGR2X3NpemUgICAgICAgIE9mZnNldDsKKyAgICBkdl9zaXplICAgICAgICBGbGFnczsgICAgICAgLy8gRmxhZ3MKKyAgICBkdl9zaXplICAgICAgICBSYW5rOyAgICAgICAgLy8gUmFuayBvZiBwb2ludGVyCisgICAgZHZfc2l6ZSAgICAgICAgUmVzZXJ2ZWQ7ICAgIC8vIHJlc2VydmVkIGZvciBvcGVubXAgcmVxdWVzdHMKKyAgICBEaW1EZXNjIERpbVtBcnJEZXNjTWF4QXJyYXlSYW5rXTsKK30gQXJyRGVzYyA7CisKK3R5cGVkZWYgQXJyRGVzYyogcEFyckRlc2M7CisKK2Jvb2wgX19kdl9pc19jb250aWd1b3VzKGNvbnN0IEFyckRlc2MgKmR2cCk7CisKK2Jvb2wgX19kdl9pc19hbGxvY2F0ZWQoY29uc3QgQXJyRGVzYyAqZHZwKTsKKwordWludDY0X3QgX19kdl9kYXRhX2xlbmd0aChjb25zdCBBcnJEZXNjICpkdnApOworCit1aW50NjRfdCBfX2R2X2RhdGFfbGVuZ3RoKGNvbnN0IEFyckRlc2MgKmR2cCwgaW50NjRfdCBuZWxlbXMpOworCitDZWFuUmVhZFJhbmdlcyAqIGluaXRfcmVhZF9yYW5nZXNfZHYoY29uc3QgQXJyRGVzYyAqZHZwKTsKKworI2lmIE9GRkxPQURfREVCVUcgPiAwCit2b2lkICAgIF9fZHZfZGVzY19kdW1wKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IEFyckRlc2MgKmR2cCk7CisjZWxzZSAvLyBPRkZMT0FEX0RFQlVHCisjZGVmaW5lIF9fZHZfZGVzY19kdW1wKG5hbWUsIGR2cCkKKyNlbmRpZiAvLyBPRkZMT0FEX0RFQlVHCisKKyNlbmRpZiAvLyBEVl9VVElMX0hfSU5DTFVERUQKZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL2xpYm9mZmxvYWRfZXJyb3IuYyBiL2ZpbmFsL29mZmxvYWQvc3JjL2xpYm9mZmxvYWRfZXJyb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzE1ZjhiCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvbGlib2ZmbG9hZF9lcnJvci5jCkBAIC0wLDAgKzEsNDUyIEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2lmbmRlZiB2YV9jb3B5CisjZGVmaW5lIHZhX2NvcHkoZHN0LCBzcmMpICgoZHN0KSA9IChzcmMpKQorI2VuZGlmCisKKyNpbmNsdWRlICJsaWJvZmZsb2FkX21zZy5oIgorCisjaW5jbHVkZSAibGlib2ZmbG9hZF9lcnJvcl9jb2Rlcy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBlcnJvci1oYW5kbGluZyBmdW5jdGlvbiwgbGlib2ZmbG9hZF9lcnJvcl9zdXBwb3J0ICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgX19saWJvZmZsb2FkX2Vycm9yX3N1cHBvcnQoZXJyb3JfdHlwZXMgaW5wdXRfdGFnLCAuLi4pCit7CisgICAgdmFfbGlzdCBhcmdzOworICAgIHZhX3N0YXJ0KGFyZ3MsIGlucHV0X3RhZyk7CisKKyAgICBzd2l0Y2ggKGlucHV0X3RhZykgeworICAgICAgICBjYXNlIGNfZGV2aWNlX2lzX25vdF9hdmFpbGFibGU6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfZGV2aWNlX2lzX25vdF9hdmFpbGFibGUsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19pbnZhbGlkX2RldmljZV9udW1iZXI6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfaW52YWxpZF9kZXZpY2VfbnVtYmVyLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfc2VuZF9mdW5jX3B0cjoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19zZW5kX2Z1bmNfcHRyLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfcmVjZWl2ZV9mdW5jX3B0cjoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19yZWNlaXZlX2Z1bmNfcHRyLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9tYWxsb2M6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2Nfb2ZmbG9hZF9tYWxsb2MsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkMToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19vZmZsb2FkMSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX3Vua25vd25fdmFyX3R5cGU6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgY191bmtub3duX3Zhcl90eXBlLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfaW52YWxpZF9lbnZfdmFyX3ZhbHVlOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX2ludmFsaWRfZW52X3Zhcl92YWx1ZSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX2ludmFsaWRfZW52X3Zhcl9pbnRfdmFsdWU6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfaW52YWxpZF9lbnZfdmFyX2ludF92YWx1ZSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX2ludmFsaWRfZW52X3JlcG9ydF92YWx1ZToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19pbnZhbGlkX2Vudl9yZXBvcnRfdmFsdWUsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX3NpZ25hbGVkMToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19vZmZsb2FkX3NpZ25hbGVkMSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfc2lnbmFsZWQyOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX29mZmxvYWRfc2lnbmFsZWQyLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfbXlvd3JhcHBlcl9jaGVja3Jlc3VsdDoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19teW93cmFwcGVyX2NoZWNrcmVzdWx0LCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfbXlvdGFyZ2V0X2NoZWNrcmVzdWx0OgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX215b3RhcmdldF9jaGVja3Jlc3VsdCwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfZGVzY3JpcHRvcl9vZmZsb2FkOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX29mZmxvYWRfZGVzY3JpcHRvcl9vZmZsb2FkLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfbWVyZ2VfdmFyX2Rlc2NzMToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19tZXJnZV92YXJfZGVzY3MxLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfbWVyZ2VfdmFyX2Rlc2NzMjoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19tZXJnZV92YXJfZGVzY3MyLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfbWljX3BhcnNlX2Vudl92YXJfbGlzdDE6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfbWljX3BhcnNlX2Vudl92YXJfbGlzdDEsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19taWNfcGFyc2VfZW52X3Zhcl9saXN0MjoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19taWNfcGFyc2VfZW52X3Zhcl9saXN0MiwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX21pY19wcm9jZXNzX2V4aXRfcmV0OgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX21pY19wcm9jZXNzX2V4aXRfcmV0LCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfbWljX3Byb2Nlc3NfZXhpdF9zaWc6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfbWljX3Byb2Nlc3NfZXhpdF9zaWcsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19taWNfcHJvY2Vzc19leGl0OgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX21pY19wcm9jZXNzX2V4aXQsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19taWNfaW5pdDM6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfbWljX2luaXQzLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfbWljX2luaXQ0OgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX21pY19pbml0NCwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX21pY19pbml0NToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19taWNfaW5pdDUsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19taWNfaW5pdDY6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfbWljX2luaXQ2LCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfbm9fc3RhdGljX3Zhcl9kYXRhOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX25vX3N0YXRpY192YXJfZGF0YSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX25vX3B0cl9kYXRhOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX25vX3B0cl9kYXRhLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfZ2V0X2VuZ2luZV9oYW5kbGU6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfZ2V0X2VuZ2luZV9oYW5kbGUsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19nZXRfZW5naW5lX2luZGV4OgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX2dldF9lbmdpbmVfaW5kZXgsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19wcm9jZXNzX2NyZWF0ZToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19wcm9jZXNzX2NyZWF0ZSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX3Byb2Nlc3Nfd2FpdF9zaHV0ZG93bjoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19wcm9jZXNzX3dhaXRfc2h1dGRvd24sIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19wcm9jZXNzX3Byb3h5X2ZsdXNoOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX3Byb2Nlc3NfcHJveHlfZmx1c2gsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19wcm9jZXNzX2dldF9mdW5jX2hhbmRsZXM6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfcHJvY2Vzc19nZXRfZnVuY19oYW5kbGVzLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfbG9hZF9saWJyYXJ5OgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX2xvYWRfbGlicmFyeSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX2NvaXBpcGVfbWF4X251bWJlcjoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19jb2lfcGlwZWxpbmVfbWF4X251bWJlciwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX3BpcGVsaW5lX2NyZWF0ZToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19waXBlbGluZV9jcmVhdGUsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19waXBlbGluZV9ydW5fZnVuYzoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19waXBlbGluZV9ydW5fZnVuYywgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX3BpcGVsaW5lX3N0YXJ0X3J1bl9mdW5jczoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19waXBlbGluZV9zdGFydF9ydW5fZnVuY3MsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19idWZfY3JlYXRlOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX2J1Zl9jcmVhdGUsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19idWZfY3JlYXRlX291dF9vZl9tZW06CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfYnVmX2NyZWF0ZV9vdXRfb2ZfbWVtLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfYnVmX2NyZWF0ZV9mcm9tX21lbToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19idWZfY3JlYXRlX2Zyb21fbWVtLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfYnVmX2Rlc3Ryb3k6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfYnVmX2Rlc3Ryb3ksIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19idWZfbWFwOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX2J1Zl9tYXAsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19idWZfdW5tYXA6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfYnVmX3VubWFwLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfYnVmX3JlYWQ6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfYnVmX3JlYWQsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19idWZfd3JpdGU6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfYnVmX3dyaXRlLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfYnVmX2NvcHk6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfYnVmX2NvcHksIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19idWZfZ2V0X2FkZHJlc3M6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfYnVmX2dldF9hZGRyZXNzLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfYnVmX2FkZF9yZWY6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfYnVmX2FkZF9yZWYsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19idWZfcmVsZWFzZV9yZWY6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfYnVmX3JlbGVhc2VfcmVmLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfYnVmX3NldF9zdGF0ZToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19idWZfc2V0X3N0YXRlLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfZXZlbnRfd2FpdDoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19ldmVudF93YWl0LCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfemVyb19vcl9uZWdfcHRyX2xlbjoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY196ZXJvX29yX25lZ19wdHJfbGVuLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfemVyb19vcl9uZWdfdHJhbnNmZXJfc2l6ZToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY196ZXJvX29yX25lZ190cmFuc2Zlcl9zaXplLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfYmFkX3B0cl9tZW1fcmFuZ2U6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfYmFkX3B0cl9tZW1fcmFuZ2UsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19kaWZmZXJlbnRfc3JjX2FuZF9kc3RuX3NpemVzOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX2RpZmZlcmVudF9zcmNfYW5kX2RzdG5fc2l6ZXMsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19yYW5nZXNfZG9udF9tYXRjaDoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19yYW5nZXNfZG9udF9tYXRjaCwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX2Rlc3RpbmF0aW9uX2lzX292ZXI6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfZGVzdGluYXRpb25faXNfb3ZlciwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX3NsaWNlX29mX25vbmNvbnRfYXJyYXk6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2Nfc2xpY2Vfb2Zfbm9uY29udF9hcnJheSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX25vbl9jb250aWd1b3VzX2RvcGVfdmVjdG9yOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX25vbl9jb250aWd1b3VzX2RvcGVfdmVjdG9yLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfcG9pbnRlcl9hcnJheV9taXNtYXRjaDoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19wb2ludGVyX2FycmF5X21pc21hdGNoLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb21wX2ludmFsaWRfZGV2aWNlX251bV9lbnY6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2Nfb21wX2ludmFsaWRfZGV2aWNlX251bV9lbnYsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vbXBfaW52YWxpZF9kZXZpY2VfbnVtOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX29tcF9pbnZhbGlkX2RldmljZV9udW0sIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY191bmtub3duX2JpbmFyeV90eXBlOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX3Vua25vd25fYmluYXJ5X3R5cGUsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19tdWx0aXBsZV90YXJnZXRfZXhlczoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19tdWx0aXBsZV90YXJnZXRfZXhlcywgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX25vX3RhcmdldF9leGU6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2Nfbm9fdGFyZ2V0X2V4ZSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF91bmtub3duX3RpbWVyX25vZGU6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfcmVwb3J0X3Vua25vd25fdGltZXJfbm9kZSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF91bmtub3duX3RyYWNlX25vZGU6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfcmVwb3J0X3Vua25vd25fdHJhY2Vfbm9kZSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgdmFfZW5kKGFyZ3MpOworfQorCitjaGFyIGNvbnN0ICogcmVwb3J0X2dldF9tZXNzYWdlX3N0cihlcnJvcl90eXBlcyBpbnB1dF90YWcpCit7CisgICAgc3dpdGNoIChpbnB1dF90YWcpIHsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF90aXRsZToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3RpdGxlKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfZnJvbV9maWxlOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfZnJvbV9maWxlKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfb2ZmbG9hZDoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X29mZmxvYWQpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9taWM6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9taWMpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9maWxlOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfZmlsZSkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X2xpbmU6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9saW5lKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfaG9zdDoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2hvc3QpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF90YWc6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF90YWcpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9jcHVfdGltZToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2NwdV90aW1lKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfc2Vjb25kczoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3NlY29uZHMpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9jcHVfdG9fbWljX2RhdGE6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9jcHVfdG9fbWljX2RhdGEpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9ieXRlczoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2J5dGVzKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfbWljX3RpbWU6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9taWNfdGltZSkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X21pY190b19jcHVfZGF0YToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X21pY190b19jcHVfZGF0YSkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X2NvbXB1dGU6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9jb21wdXRlKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfY29weWluX2RhdGE6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9jb3B5aW5fZGF0YSkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X2NvcHlvdXRfZGF0YToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2NvcHlvdXRfZGF0YSkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X2NyZWF0ZV9idWZfaG9zdDoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfY3JlYXRlX2J1Zl9ob3N0KSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfY3JlYXRlX2J1Zl9taWM6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9jcmVhdGVfYnVmX21pYykpOworICAgICAgICBjYXNlIGNfcmVwb3J0X2Rlc3Ryb3k6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9kZXN0cm95KSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfZ2F0aGVyX2NvcHlpbl9kYXRhOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfZ2F0aGVyX2NvcHlpbl9kYXRhKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfZ2F0aGVyX2NvcHlvdXRfZGF0YToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2dhdGhlcl9jb3B5b3V0X2RhdGEpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9zdGF0ZV9zaWduYWw6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9zdGF0ZV9zaWduYWwpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9zaWduYWw6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9zaWduYWwpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF93YWl0OgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfd2FpdCkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X2luaXQ6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9pbml0KSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfaW5pdF9mdW5jOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfaW5pdF9mdW5jKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfbG9naWNhbF9jYXJkOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfbG9naWNhbF9jYXJkKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfbWljX215b19mcHRyOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfbWljX215b19mcHRyKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfbWljX215b19zaGFyZWQ6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9taWNfbXlvX3NoYXJlZCkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X215b2FjcXVpcmU6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9teW9hY3F1aXJlKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfbXlvZmluaToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X215b2ZpbmkpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9teW9pbml0OgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfbXlvaW5pdCkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X215b3JlZ2lzdGVyOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfbXlvcmVnaXN0ZXIpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9teW9yZWxlYXNlOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfbXlvcmVsZWFzZSkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X215b3NoYXJlZGFsaWduZWRmcmVlOgorICAgICAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgICAgICBvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfbXlvc2hhcmVkYWxpZ25lZGZyZWUpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9teW9zaGFyZWRhbGlnbmVkbWFsbG9jOgorICAgICAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgICAgICBvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfbXlvc2hhcmVkYWxpZ25lZG1hbGxvYykpOworICAgICAgICBjYXNlIGNfcmVwb3J0X215b3NoYXJlZGZyZWU6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9teW9zaGFyZWRmcmVlKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfbXlvc2hhcmVkbWFsbG9jOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfbXlvc2hhcmVkbWFsbG9jKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfcGh5c2ljYWxfY2FyZDoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3BoeXNpY2FsX2NhcmQpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9yZWNlaXZlX3BvaW50ZXJfZGF0YToKKyAgICAgICAgICAgIHJldHVybiAoCisgICAgICAgICAgICAgICAgb2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3JlY2VpdmVfcG9pbnRlcl9kYXRhKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfcmVjZWl2ZWRfcG9pbnRlcl9kYXRhOgorICAgICAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgICAgICBvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfcmVjZWl2ZWRfcG9pbnRlcl9kYXRhKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfcmVnaXN0ZXI6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9yZWdpc3RlcikpOworICAgICAgICBjYXNlIGNfcmVwb3J0X3NjYXR0ZXJfY29weWluX2RhdGE6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9zY2F0dGVyX2NvcHlpbl9kYXRhKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfc2NhdHRlcl9jb3B5b3V0X2RhdGE6CisgICAgICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgICAgIG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9zY2F0dGVyX2NvcHlvdXRfZGF0YSkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X3NlbmRfcG9pbnRlcl9kYXRhOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfc2VuZF9wb2ludGVyX2RhdGEpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9zZW50X3BvaW50ZXJfZGF0YToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3NlbnRfcG9pbnRlcl9kYXRhKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfc3RhcnQ6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9zdGFydCkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X3N0YXJ0X3RhcmdldF9mdW5jOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfc3RhcnRfdGFyZ2V0X2Z1bmMpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9zdGF0ZToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3N0YXRlKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfdW5yZWdpc3RlcjoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3VucmVnaXN0ZXIpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF92YXI6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF92YXIpKTsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3JlcG9ydF91bmtub3duX3RyYWNlX25vZGUpOworICAgICAgICAgICAgYWJvcnQoKTsKKyAgICB9Cit9CisKK2NoYXIgY29uc3QgKiByZXBvcnRfZ2V0X2hvc3Rfc3RhZ2Vfc3RyKGludCBpKQoreworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9ob3N0X3RvdGFsX29mZmxvYWQ6CisgICAgICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgICAgb2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2hvc3RfdG90YWxfb2ZmbG9hZF90aW1lKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2hvc3RfaW5pdGlhbGl6ZToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2hvc3RfaW5pdGlhbGl6ZSkpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9ob3N0X3RhcmdldF9hY3F1aXJlOgorICAgICAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgICAgICBvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfaG9zdF90YXJnZXRfYWNxdWlyZSkpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9ob3N0X3dhaXRfZGVwczoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2hvc3Rfd2FpdF9kZXBzKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2hvc3Rfc2V0dXBfYnVmZmVyczoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2hvc3Rfc2V0dXBfYnVmZmVycykpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9ob3N0X2FsbG9jX2J1ZmZlcnM6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9ob3N0X2FsbG9jX2J1ZmZlcnMpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfaG9zdF9zZXR1cF9taXNjX2RhdGE6CisgICAgICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgICAgIG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9ob3N0X3NldHVwX21pc2NfZGF0YSkpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9ob3N0X2FsbG9jX2RhdGFfYnVmZmVyOgorICAgICAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgICAgICBvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfaG9zdF9hbGxvY19kYXRhX2J1ZmZlcikpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9ob3N0X3NlbmRfcG9pbnRlcnM6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9ob3N0X3NlbmRfcG9pbnRlcnMpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfaG9zdF9nYXRoZXJfaW5wdXRzOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfaG9zdF9nYXRoZXJfaW5wdXRzKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2hvc3RfbWFwX2luX2RhdGFfYnVmZmVyOgorICAgICAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgICAgICBvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfaG9zdF9tYXBfaW5fZGF0YV9idWZmZXIpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfaG9zdF91bm1hcF9pbl9kYXRhX2J1ZmZlcjoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIoCisgICAgICAgICAgICAgICAgbXNnX2NfcmVwb3J0X2hvc3RfdW5tYXBfaW5fZGF0YV9idWZmZXIpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfaG9zdF9zdGFydF9jb21wdXRlOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfaG9zdF9zdGFydF9jb21wdXRlKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2hvc3Rfd2FpdF9jb21wdXRlOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfaG9zdF93YWl0X2NvbXB1dGUpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfaG9zdF9zdGFydF9idWZmZXJzX3JlYWRzOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cigKKyAgICAgICAgICAgICAgICBtc2dfY19yZXBvcnRfaG9zdF9zdGFydF9idWZmZXJzX3JlYWRzKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2hvc3Rfc2NhdHRlcl9vdXRwdXRzOgorICAgICAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgICAgICBvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfaG9zdF9zY2F0dGVyX291dHB1dHMpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfaG9zdF9tYXBfb3V0X2RhdGFfYnVmZmVyOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cigKKyAgICAgICAgICAgICAgICBtc2dfY19yZXBvcnRfaG9zdF9tYXBfb3V0X2RhdGFfYnVmZmVyKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2hvc3RfdW5tYXBfb3V0X2RhdGFfYnVmZmVyOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cigKKyAgICAgICAgICAgICAgICBtc2dfY19yZXBvcnRfaG9zdF91bm1hcF9vdXRfZGF0YV9idWZmZXIpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfaG9zdF93YWl0X2J1ZmZlcnNfcmVhZHM6CisgICAgICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgICAgIG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9ob3N0X3dhaXRfYnVmZmVyc19yZWFkcykpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9ob3N0X2Rlc3Ryb3lfYnVmZmVyczoKKyAgICAgICAgICAgIHJldHVybiAoCisgICAgICAgICAgICAgICAgb2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2hvc3RfZGVzdHJveV9idWZmZXJzKSk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcmVwb3J0X3Vua25vd25fdGltZXJfbm9kZSk7CisgICAgICAgICAgICBhYm9ydCgpOworICAgIH0KK30KKworY2hhciBjb25zdCAqIHJlcG9ydF9nZXRfdGFyZ2V0X3N0YWdlX3N0cihpbnQgaSkKK3sKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfdGFyZ2V0X3RvdGFsX3RpbWU6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF90YXJnZXRfdG90YWxfdGltZSkpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF90YXJnZXRfZGVzY3JpcHRvcl9zZXR1cDoKKyAgICAgICAgICAgIHJldHVybiAoCisgICAgICAgICAgICAgICAgb2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3RhcmdldF9kZXNjcmlwdG9yX3NldHVwKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX3RhcmdldF9mdW5jX2xvb2t1cDoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3RhcmdldF9mdW5jX2xvb2t1cCkpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF90YXJnZXRfZnVuY190aW1lOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfdGFyZ2V0X2Z1bmNfdGltZSkpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF90YXJnZXRfc2NhdHRlcl9pbnB1dHM6CisgICAgICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgICAgIG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF90YXJnZXRfc2NhdHRlcl9pbnB1dHMpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfdGFyZ2V0X2FkZF9idWZmZXJfcmVmczoKKyAgICAgICAgICAgIHJldHVybiAoCisgICAgICAgICAgICAgICAgb2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3RhcmdldF9hZGRfYnVmZmVyX3JlZnMpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfdGFyZ2V0X2NvbXB1dGU6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF90YXJnZXRfY29tcHV0ZSkpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF90YXJnZXRfZ2F0aGVyX291dHB1dHM6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyCisgICAgICAgICAgICAgICAgKG1zZ19jX3JlcG9ydF90YXJnZXRfZ2F0aGVyX291dHB1dHMpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfdGFyZ2V0X3JlbGVhc2VfYnVmZmVyX3JlZnM6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKAorICAgICAgICAgICAgICAgIG1zZ19jX3JlcG9ydF90YXJnZXRfcmVsZWFzZV9idWZmZXJfcmVmcykpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3JlcG9ydF91bmtub3duX3RpbWVyX25vZGUpOworICAgICAgICAgICAgYWJvcnQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9saWJvZmZsb2FkX2Vycm9yX2NvZGVzLmggYi9maW5hbC9vZmZsb2FkL3NyYy9saWJvZmZsb2FkX2Vycm9yX2NvZGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgyMTY3YgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL2xpYm9mZmxvYWRfZXJyb3JfY29kZXMuaApAQCAtMCwwICsxLDI3NiBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWYgIWRlZmluZWQoTElCT0ZGTE9BRF9FUlJPUl9DT0RFU19IKQorI2RlZmluZSBMSUJPRkZMT0FEX0VSUk9SX0NPREVTX0gKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCit0eXBlZGVmIGVudW0KK3sKKyAgICBjX2RldmljZV9pc19ub3RfYXZhaWxhYmxlID0gMCwKKyAgICBjX2ludmFsaWRfZGV2aWNlX251bWJlciwKKyAgICBjX29mZmxvYWQxLAorICAgIGNfdW5rbm93bl92YXJfdHlwZSwKKyAgICBjX3NlbmRfZnVuY19wdHIsCisgICAgY19yZWNlaXZlX2Z1bmNfcHRyLAorICAgIGNfb2ZmbG9hZF9tYWxsb2MsCisgICAgY19pbnZhbGlkX2Vudl92YXJfdmFsdWUsCisgICAgY19pbnZhbGlkX2Vudl92YXJfaW50X3ZhbHVlLAorICAgIGNfaW52YWxpZF9lbnZfcmVwb3J0X3ZhbHVlLAorICAgIGNfb2ZmbG9hZF9zaWduYWxlZDEsCisgICAgY19vZmZsb2FkX3NpZ25hbGVkMiwKKyAgICBjX215b3RhcmdldF9jaGVja3Jlc3VsdCwKKyAgICBjX215b3dyYXBwZXJfY2hlY2tyZXN1bHQsCisgICAgY19vZmZsb2FkX2Rlc2NyaXB0b3Jfb2ZmbG9hZCwKKyAgICBjX21lcmdlX3Zhcl9kZXNjczEsCisgICAgY19tZXJnZV92YXJfZGVzY3MyLAorICAgIGNfbWljX3BhcnNlX2Vudl92YXJfbGlzdDEsCisgICAgY19taWNfcGFyc2VfZW52X3Zhcl9saXN0MiwKKyAgICBjX21pY19wcm9jZXNzX2V4aXRfcmV0LAorICAgIGNfbWljX3Byb2Nlc3NfZXhpdF9zaWcsCisgICAgY19taWNfcHJvY2Vzc19leGl0LAorICAgIGNfbWljX2luaXQzLAorICAgIGNfbWljX2luaXQ0LAorICAgIGNfbWljX2luaXQ1LAorICAgIGNfbWljX2luaXQ2LAorICAgIGNfbm9fc3RhdGljX3Zhcl9kYXRhLAorICAgIGNfbm9fcHRyX2RhdGEsCisgICAgY19nZXRfZW5naW5lX2hhbmRsZSwKKyAgICBjX2dldF9lbmdpbmVfaW5kZXgsCisgICAgY19wcm9jZXNzX2NyZWF0ZSwKKyAgICBjX3Byb2Nlc3NfZ2V0X2Z1bmNfaGFuZGxlcywKKyAgICBjX3Byb2Nlc3Nfd2FpdF9zaHV0ZG93biwKKyAgICBjX3Byb2Nlc3NfcHJveHlfZmx1c2gsCisgICAgY19sb2FkX2xpYnJhcnksCisgICAgY19waXBlbGluZV9jcmVhdGUsCisgICAgY19waXBlbGluZV9ydW5fZnVuYywKKyAgICBjX3BpcGVsaW5lX3N0YXJ0X3J1bl9mdW5jcywKKyAgICBjX2J1Zl9jcmVhdGUsCisgICAgY19idWZfY3JlYXRlX291dF9vZl9tZW0sCisgICAgY19idWZfY3JlYXRlX2Zyb21fbWVtLAorICAgIGNfYnVmX2Rlc3Ryb3ksCisgICAgY19idWZfbWFwLAorICAgIGNfYnVmX3VubWFwLAorICAgIGNfYnVmX3JlYWQsCisgICAgY19idWZfd3JpdGUsCisgICAgY19idWZfY29weSwKKyAgICBjX2J1Zl9nZXRfYWRkcmVzcywKKyAgICBjX2J1Zl9hZGRfcmVmLAorICAgIGNfYnVmX3JlbGVhc2VfcmVmLAorICAgIGNfYnVmX3NldF9zdGF0ZSwKKyAgICBjX2V2ZW50X3dhaXQsCisgICAgY196ZXJvX29yX25lZ19wdHJfbGVuLAorICAgIGNfemVyb19vcl9uZWdfdHJhbnNmZXJfc2l6ZSwKKyAgICBjX2JhZF9wdHJfbWVtX3JhbmdlLAorICAgIGNfZGlmZmVyZW50X3NyY19hbmRfZHN0bl9zaXplcywKKyAgICBjX3Jhbmdlc19kb250X21hdGNoLAorICAgIGNfZGVzdGluYXRpb25faXNfb3ZlciwKKyAgICBjX3NsaWNlX29mX25vbmNvbnRfYXJyYXksCisgICAgY19ub25fY29udGlndW91c19kb3BlX3ZlY3RvciwKKyAgICBjX3BvaW50ZXJfYXJyYXlfbWlzbWF0Y2gsCisgICAgY19vbXBfaW52YWxpZF9kZXZpY2VfbnVtX2VudiwKKyAgICBjX29tcF9pbnZhbGlkX2RldmljZV9udW0sCisgICAgY191bmtub3duX2JpbmFyeV90eXBlLAorICAgIGNfbXVsdGlwbGVfdGFyZ2V0X2V4ZXMsCisgICAgY19ub190YXJnZXRfZXhlLAorICAgIGNfcmVwb3J0X2hvc3QsCisgICAgY19yZXBvcnRfdGFyZ2V0LAorICAgIGNfcmVwb3J0X3RpdGxlLAorICAgIGNfcmVwb3J0X2Zyb21fZmlsZSwKKyAgICBjX3JlcG9ydF9maWxlLAorICAgIGNfcmVwb3J0X2xpbmUsCisgICAgY19yZXBvcnRfdGFnLAorICAgIGNfcmVwb3J0X3NlY29uZHMsCisgICAgY19yZXBvcnRfYnl0ZXMsCisgICAgY19yZXBvcnRfbWljLAorICAgIGNfcmVwb3J0X2NwdV90aW1lLAorICAgIGNfcmVwb3J0X2NwdV90b19taWNfZGF0YSwKKyAgICBjX3JlcG9ydF9taWNfdGltZSwKKyAgICBjX3JlcG9ydF9taWNfdG9fY3B1X2RhdGEsCisgICAgY19yZXBvcnRfdW5rbm93bl90aW1lcl9ub2RlLAorICAgIGNfcmVwb3J0X3Vua25vd25fdHJhY2Vfbm9kZSwKKyAgICBjX3JlcG9ydF9vZmZsb2FkLAorICAgIGNfcmVwb3J0X3dfdGFnLAorICAgIGNfcmVwb3J0X3N0YXRlLAorICAgIGNfcmVwb3J0X3N0YXJ0LAorICAgIGNfcmVwb3J0X2luaXQsCisgICAgY19yZXBvcnRfbG9naWNhbF9jYXJkLAorICAgIGNfcmVwb3J0X3BoeXNpY2FsX2NhcmQsCisgICAgY19yZXBvcnRfcmVnaXN0ZXIsCisgICAgY19yZXBvcnRfaW5pdF9mdW5jLAorICAgIGNfcmVwb3J0X2NyZWF0ZV9idWZfaG9zdCwKKyAgICBjX3JlcG9ydF9jcmVhdGVfYnVmX21pYywKKyAgICBjX3JlcG9ydF9zZW5kX3BvaW50ZXJfZGF0YSwKKyAgICBjX3JlcG9ydF9zZW50X3BvaW50ZXJfZGF0YSwKKyAgICBjX3JlcG9ydF9nYXRoZXJfY29weWluX2RhdGEsCisgICAgY19yZXBvcnRfY29weWluX2RhdGEsCisgICAgY19yZXBvcnRfc3RhdGVfc2lnbmFsLAorICAgIGNfcmVwb3J0X3NpZ25hbCwKKyAgICBjX3JlcG9ydF93YWl0LAorICAgIGNfcmVwb3J0X2NvbXB1dGUsCisgICAgY19yZXBvcnRfcmVjZWl2ZV9wb2ludGVyX2RhdGEsCisgICAgY19yZXBvcnRfcmVjZWl2ZWRfcG9pbnRlcl9kYXRhLAorICAgIGNfcmVwb3J0X3N0YXJ0X3RhcmdldF9mdW5jLAorICAgIGNfcmVwb3J0X3ZhciwKKyAgICBjX3JlcG9ydF9zY2F0dGVyX2NvcHlpbl9kYXRhLAorICAgIGNfcmVwb3J0X2dhdGhlcl9jb3B5b3V0X2RhdGEsCisgICAgY19yZXBvcnRfc2NhdHRlcl9jb3B5b3V0X2RhdGEsCisgICAgY19yZXBvcnRfY29weW91dF9kYXRhLAorICAgIGNfcmVwb3J0X3VucmVnaXN0ZXIsCisgICAgY19yZXBvcnRfZGVzdHJveSwKKyAgICBjX3JlcG9ydF9teW9pbml0LAorICAgIGNfcmVwb3J0X215b3JlZ2lzdGVyLAorICAgIGNfcmVwb3J0X215b2ZpbmksCisgICAgY19yZXBvcnRfbWljX215b19zaGFyZWQsCisgICAgY19yZXBvcnRfbWljX215b19mcHRyLAorICAgIGNfcmVwb3J0X215b3NoYXJlZG1hbGxvYywKKyAgICBjX3JlcG9ydF9teW9zaGFyZWRmcmVlLAorICAgIGNfcmVwb3J0X215b3NoYXJlZGFsaWduZWRtYWxsb2MsCisgICAgY19yZXBvcnRfbXlvc2hhcmVkYWxpZ25lZGZyZWUsCisgICAgY19yZXBvcnRfbXlvYWNxdWlyZSwKKyAgICBjX3JlcG9ydF9teW9yZWxlYXNlLAorICAgIGNfY29pcGlwZV9tYXhfbnVtYmVyCit9IGVycm9yX3R5cGVzOworCitlbnVtIE9mZmxvYWRIb3N0UGhhc2UgeworICAgIC8vIFRvdGFsIHRpbWUgb24gaG9zdCBmb3IgZW50aXJlIG9mZmxvYWQKKyAgICBjX29mZmxvYWRfaG9zdF90b3RhbF9vZmZsb2FkID0gMCwKKworICAgIC8vIFRpbWUgdG8gbG9hZCB0YXJnZXQgYmluYXJ5CisgICAgY19vZmZsb2FkX2hvc3RfaW5pdGlhbGl6ZSwKKworICAgIC8vIFRpbWUgdG8gYWNxdWlyZSBscmIgYXZhaWxhYmlsaXR5IGR5bmFtaWNhbGx5CisgICAgY19vZmZsb2FkX2hvc3RfdGFyZ2V0X2FjcXVpcmUsCisKKyAgICAvLyBUaW1lIHRvIHdhaXQgZm9yIGRlcGVuZGVuY2llcworICAgIGNfb2ZmbG9hZF9ob3N0X3dhaXRfZGVwcywKKworICAgIC8vIFRpbWUgdG8gYWxsb2NhdGUgcG9pbnRlciBidWZmZXJzLCBpbml0aWF0ZSB3cml0ZXMgZm9yIHBvaW50ZXJzCisgICAgLy8gYW5kIGNhbGN1bGF0ZSBzaXplIG9mIGNvcHlpbi9jb3B5b3V0IGJ1ZmZlcgorICAgIGNfb2ZmbG9hZF9ob3N0X3NldHVwX2J1ZmZlcnMsCisKKyAgICAvLyBUaW1lIHRvIGFsbG9jYXRlIHBvaW50ZXIgYnVmZmVycworICAgIGNfb2ZmbG9hZF9ob3N0X2FsbG9jX2J1ZmZlcnMsCisKKyAgICAvLyBUaW1lIHRvIGluaXRpYWxpemUgbWlzYyBkYXRhCisgICAgY19vZmZsb2FkX2hvc3Rfc2V0dXBfbWlzY19kYXRhLAorCisgICAgLy8gVGltZSB0byBhbGxvY2F0ZSBjb3B5aW4vY29weW91dCBidWZmZXIKKyAgICBjX29mZmxvYWRfaG9zdF9hbGxvY19kYXRhX2J1ZmZlciwKKworICAgIC8vIFRpbWUgdG8gaW5pdGlhdGUgd3JpdGVzIGZyb20gaG9zdCBwb2ludGVycyB0byBidWZmZXJzCisgICAgY19vZmZsb2FkX2hvc3Rfc2VuZF9wb2ludGVycywKKworICAgIC8vIFRpbWUgdG8gR2F0aGVyIElOIGRhdGEgb2Ygb2ZmbG9hZCBpbnRvIGJ1ZmZlcgorICAgIGNfb2ZmbG9hZF9ob3N0X2dhdGhlcl9pbnB1dHMsCisKKyAgICAvLyBUaW1lIHRvIG1hcCBidWZmZXIKKyAgICBjX29mZmxvYWRfaG9zdF9tYXBfaW5fZGF0YV9idWZmZXIsCisKKyAgICAvLyBUaW1lIHRvIHVubWFwIGJ1ZmZlcgorICAgIGNfb2ZmbG9hZF9ob3N0X3VubWFwX2luX2RhdGFfYnVmZmVyLAorCisgICAgLy8gVGltZSB0byBzdGFydCByZW1vdGUgZnVuY3Rpb24gY2FsbCB0aGF0IGRvZXMgY29tcHV0YXRpb24gb24gbHJiCisgICAgY19vZmZsb2FkX2hvc3Rfc3RhcnRfY29tcHV0ZSwKKworICAgIC8vIFRpbWUgdG8gd2FpdCBmb3IgY29tcHV0ZSB0byBmaW5pc2gKKyAgICBjX29mZmxvYWRfaG9zdF93YWl0X2NvbXB1dGUsCisKKyAgICAvLyBUaW1lIHRvIGluaXRpYXRlIHJlYWRzIGZyb20gcG9pbnRlciBidWZmZXJzCisgICAgY19vZmZsb2FkX2hvc3Rfc3RhcnRfYnVmZmVyc19yZWFkcywKKworICAgIC8vIFRpbWUgdG8gdXBkYXRlIGhvc3QgdmFyaWFiZWxzIHdpdGggT1VUIGRhdGEgZnJvbSBidWZmZXIKKyAgICBjX29mZmxvYWRfaG9zdF9zY2F0dGVyX291dHB1dHMsCisKKyAgICAvLyBUaW1lIHRvIG1hcCBidWZmZXIKKyAgICBjX29mZmxvYWRfaG9zdF9tYXBfb3V0X2RhdGFfYnVmZmVyLAorCisgICAgLy8gVGltZSB0byB1bm1hcCBidWZmZXIKKyAgICBjX29mZmxvYWRfaG9zdF91bm1hcF9vdXRfZGF0YV9idWZmZXIsCisKKyAgICAvLyBUaW1lIHRvIHdhaXQgcmVhZHMgZnJvbSBidWZmZXJzIHRvIGZpbmlzaAorICAgIGNfb2ZmbG9hZF9ob3N0X3dhaXRfYnVmZmVyc19yZWFkcywKKworICAgIC8vIFRpbWUgdG8gZGVzdHJveSBidWZmZXJzIHRoYXQgYXJlIG5vIGxvbmdlciBuZWVkZWQKKyAgICBjX29mZmxvYWRfaG9zdF9kZXN0cm95X2J1ZmZlcnMsCisKKyAgICAvLyBMQVNUIFRJTUUgTU9OSVRPUgorICAgIGNfb2ZmbG9hZF9ob3N0X21heF9waGFzZQorfTsKKworZW51bSBPZmZsb2FkVGFyZ2V0UGhhc2UgeworICAgIC8vIFRvdGFsIHRpbWUgc3BlbnQgb24gdGhlIHRhcmdldAorICAgIGNfb2ZmbG9hZF90YXJnZXRfdG90YWxfdGltZSA9IDAsCisKKyAgICAvLyBUaW1lIHRvIGluaXRpYWxpemUgb2ZmbG9hZCBkZXNjcmlwdG9yCisgICAgY19vZmZsb2FkX3RhcmdldF9kZXNjcmlwdG9yX3NldHVwLAorCisgICAgLy8gVGltZSB0byBmaW5kIHRhcmdldCBlbnRyeSBwb2ludCBpbiBsb29rdXAgdGFibGUKKyAgICBjX29mZmxvYWRfdGFyZ2V0X2Z1bmNfbG9va3VwLAorCisgICAgLy8gVG90YWwgdGltZSBzcGVuZCBleGVjdXRpbmcgb2ZmbG9hZCBlbnRyeQorICAgIGNfb2ZmbG9hZF90YXJnZXRfZnVuY190aW1lLAorCisgICAgLy8gVGltZSB0byBpbml0aWFsaXplIHRhcmdldCB2YXJpYWJsZXMgd2l0aCBJTiB2YWx1ZXMgZnJvbSBidWZmZXIKKyAgICBjX29mZmxvYWRfdGFyZ2V0X3NjYXR0ZXJfaW5wdXRzLAorCisgICAgLy8gVGltZSB0byBhZGQgYnVmZmVyIHJlZmVyZW5jZSBmb3IgcG9pbnRlciBidWZmZXJzCisgICAgY19vZmZsb2FkX3RhcmdldF9hZGRfYnVmZmVyX3JlZnMsCisKKyAgICAvLyBUb3RhbCB0aW1lIG9uIGxyYiBmb3IgY29tcHV0YXRpb24KKyAgICBjX29mZmxvYWRfdGFyZ2V0X2NvbXB1dGUsCisKKyAgICAvLyBPbiBscmIsIHRpbWUgdG8gY29weSBPVVQgaW50byBidWZmZXIKKyAgICBjX29mZmxvYWRfdGFyZ2V0X2dhdGhlcl9vdXRwdXRzLAorCisgICAgLy8gVGltZSB0byByZWxlYXNlIGJ1ZmZlciByZWZlcmVuY2VzCisgICAgY19vZmZsb2FkX3RhcmdldF9yZWxlYXNlX2J1ZmZlcl9yZWZzLAorCisgICAgLy8gTEFTVCBUSU1FIE1PTklUT1IKKyAgICBjX29mZmxvYWRfdGFyZ2V0X21heF9waGFzZQorfTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgordm9pZCBfX2xpYm9mZmxvYWRfZXJyb3Jfc3VwcG9ydChlcnJvcl90eXBlcyBpbnB1dF90YWcsIC4uLik7Cit2b2lkIF9fbGlib2ZmbG9hZF9yZXBvcnRfc3VwcG9ydChlcnJvcl90eXBlcyBpbnB1dF90YWcsIC4uLik7CitjaGFyIGNvbnN0ICpvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihpbnQgbXNnQ29kZSk7CitjaGFyIGNvbnN0ICogcmVwb3J0X2dldF9tZXNzYWdlX3N0cihlcnJvcl90eXBlcyBpbnB1dF90YWcpOworY2hhciBjb25zdCAqIHJlcG9ydF9nZXRfaG9zdF9zdGFnZV9zdHIoaW50IGkpOworY2hhciBjb25zdCAqIHJlcG9ydF9nZXRfdGFyZ2V0X3N0YWdlX3N0cihpbnQgaSk7CisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZGVmaW5lIHRlc3RfbXNnX2NhdChubSwgbXNnKSBcCisgICAgZnByaW50ZihzdGRlcnIsICJcdCBURVNUIGZvciAlcyBcbiBcdCIsIG5tKTsgXAorICAgIF9fbGlib2ZmbG9hZF9lcnJvcl9zdXBwb3J0KG1zZyk7CisKKyNkZWZpbmUgdGVzdF9tc2dfY2F0MShubSwgbXNnLCAuLi4pIFwKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlx0IFRFU1QgZm9yICVzIFxuIFx0Iiwgbm0pOyBcCisgICAgX19saWJvZmZsb2FkX2Vycm9yX3N1cHBvcnQobXNnLCBfX1ZBX0FSR1NfXyk7CisKK3ZvaWQgd3JpdGVfbWVzc2FnZShGSUxFICogZmlsZSwgaW50IG1zZ0NvZGUsIHZhX2xpc3QgYXJnc19wKTsKKworI2RlZmluZSBMSUJPRkZMT0FEX0VSUk9SIF9fbGlib2ZmbG9hZF9lcnJvcl9zdXBwb3J0CisKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyNkZWZpbmUgTElCT0ZGTE9BRF9BQk9SVCBcCisgICAgICAgICBfc2V0X2Fib3J0X2JlaGF2aW9yKDAsIF9XUklURV9BQk9SVF9NU0cpOyBcCisgICAgICAgICBhYm9ydCgpCisjZWxzZQorI2RlZmluZSBMSUJPRkZMT0FEX0FCT1JUIFwKKyAgICAgICAgIGFib3J0KCkKKyNlbmRpZgorCisjZW5kaWYgLy8gIWRlZmluZWQoTElCT0ZGTE9BRF9FUlJPUl9DT0RFU19IKQpkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvbGlib2ZmbG9hZF9tc2cuYyBiL2ZpbmFsL29mZmxvYWQvc3JjL2xpYm9mZmxvYWRfbXNnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE2MDM5MgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL2xpYm9mZmxvYWRfbXNnLmMKQEAgLTAsMCArMSwzNSBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEJyaW5nIGluIHRoZSBzdGF0aWMgc3RyaW5nIHRhYmxlIGFuZCB0aGUgZW51bWVyYXRpb25zIGZvciBpbmRleGluZyBpbnRvCisvLyBpdC4KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaW5jbHVkZSAibGlib2ZmbG9hZF9tc2cuaCIKKworIyBkZWZpbmUgRFlOQVJUX1NUREVSUl9QVVRTKF9fbWVzc2FnZV90ZXh0X18pIGZwdXRzKChfX21lc3NhZ2VfdGV4dF9fKSxzdGRlcnIpCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gTm93IHRoZSBjb2RlIGZvciBhY2Nlc3NpbmcgdGhlIG1lc3NhZ2UgY2F0YWxvZ3MKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKKyAgICB2b2lkIHdyaXRlX21lc3NhZ2UoRklMRSAqIGZpbGUsIGludCBtc2dDb2RlKSB7CisgICAgICAgIGZwdXRzKE1FU1NBR0VfVEFCTEVfTkFNRVsgbXNnQ29kZSBdLCBmaWxlKTsKKyAgICAgICAgZmZsdXNoKGZpbGUpOworICAgIH0KKworICAgIGNoYXIgY29uc3QgKm9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKGludCBtc2dDb2RlKSB7CisgICAgICAgIHJldHVybiBNRVNTQUdFX1RBQkxFX05BTUVbIG1zZ0NvZGUgXTsKKyAgICB9CmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9saWJvZmZsb2FkX21zZy5oIGIvZmluYWwvb2ZmbG9hZC9zcmMvbGlib2ZmbG9hZF9tc2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTQ0NWY5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvbGlib2ZmbG9hZF9tc2cuaApAQCAtMCwwICsxLDMyNiBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gZmlsZTogbGlib2ZmbG9hZF9tc2cuaAorZW51bSB7CisJX19kdW1teV9fID0gMCwKKwltc2dfY19kZXZpY2VfaXNfbm90X2F2YWlsYWJsZSwKKwltc2dfY19pbnZhbGlkX2RldmljZV9udW1iZXIsCisJbXNnX2Nfc2VuZF9mdW5jX3B0ciwKKwltc2dfY19yZWNlaXZlX2Z1bmNfcHRyLAorCW1zZ19jX29mZmxvYWRfbWFsbG9jLAorCW1zZ19jX29mZmxvYWQxLAorCW1zZ19jX3Vua25vd25fdmFyX3R5cGUsCisJbXNnX2NfaW52YWxpZF9lbnZfdmFyX3ZhbHVlLAorCW1zZ19jX2ludmFsaWRfZW52X3Zhcl9pbnRfdmFsdWUsCisJbXNnX2NfaW52YWxpZF9lbnZfcmVwb3J0X3ZhbHVlLAorCW1zZ19jX29mZmxvYWRfc2lnbmFsZWQxLAorCW1zZ19jX29mZmxvYWRfc2lnbmFsZWQyLAorCW1zZ19jX215b3dyYXBwZXJfY2hlY2tyZXN1bHQsCisJbXNnX2NfbXlvdGFyZ2V0X2NoZWNrcmVzdWx0LAorCW1zZ19jX29mZmxvYWRfZGVzY3JpcHRvcl9vZmZsb2FkLAorCW1zZ19jX21lcmdlX3Zhcl9kZXNjczEsCisJbXNnX2NfbWVyZ2VfdmFyX2Rlc2NzMiwKKwltc2dfY19taWNfcGFyc2VfZW52X3Zhcl9saXN0MSwKKwltc2dfY19taWNfcGFyc2VfZW52X3Zhcl9saXN0MiwKKwltc2dfY19taWNfcHJvY2Vzc19leGl0X3JldCwKKwltc2dfY19taWNfcHJvY2Vzc19leGl0X3NpZywKKwltc2dfY19taWNfcHJvY2Vzc19leGl0LAorCW1zZ19jX21pY19pbml0MywKKwltc2dfY19taWNfaW5pdDQsCisJbXNnX2NfbWljX2luaXQ1LAorCW1zZ19jX21pY19pbml0NiwKKwltc2dfY19ub19zdGF0aWNfdmFyX2RhdGEsCisJbXNnX2Nfbm9fcHRyX2RhdGEsCisJbXNnX2NfZ2V0X2VuZ2luZV9oYW5kbGUsCisJbXNnX2NfZ2V0X2VuZ2luZV9pbmRleCwKKwltc2dfY19wcm9jZXNzX2NyZWF0ZSwKKwltc2dfY19wcm9jZXNzX2dldF9mdW5jX2hhbmRsZXMsCisJbXNnX2NfcHJvY2Vzc193YWl0X3NodXRkb3duLAorCW1zZ19jX3Byb2Nlc3NfcHJveHlfZmx1c2gsCisJbXNnX2NfbG9hZF9saWJyYXJ5LAorCW1zZ19jX3BpcGVsaW5lX2NyZWF0ZSwKKwltc2dfY19waXBlbGluZV9ydW5fZnVuYywKKwltc2dfY19waXBlbGluZV9zdGFydF9ydW5fZnVuY3MsCisJbXNnX2NfYnVmX2NyZWF0ZSwKKwltc2dfY19idWZfY3JlYXRlX291dF9vZl9tZW0sCisJbXNnX2NfYnVmX2NyZWF0ZV9mcm9tX21lbSwKKwltc2dfY19idWZfZGVzdHJveSwKKwltc2dfY19idWZfbWFwLAorCW1zZ19jX2J1Zl91bm1hcCwKKwltc2dfY19idWZfcmVhZCwKKwltc2dfY19idWZfd3JpdGUsCisJbXNnX2NfYnVmX2NvcHksCisJbXNnX2NfYnVmX2dldF9hZGRyZXNzLAorCW1zZ19jX2J1Zl9hZGRfcmVmLAorCW1zZ19jX2J1Zl9yZWxlYXNlX3JlZiwKKwltc2dfY19idWZfc2V0X3N0YXRlLAorCW1zZ19jX2V2ZW50X3dhaXQsCisJbXNnX2NfemVyb19vcl9uZWdfcHRyX2xlbiwKKwltc2dfY196ZXJvX29yX25lZ190cmFuc2Zlcl9zaXplLAorCW1zZ19jX2JhZF9wdHJfbWVtX3JhbmdlLAorCW1zZ19jX2RpZmZlcmVudF9zcmNfYW5kX2RzdG5fc2l6ZXMsCisJbXNnX2Nfbm9uX2NvbnRpZ3VvdXNfZG9wZV92ZWN0b3IsCisJbXNnX2Nfb21wX2ludmFsaWRfZGV2aWNlX251bV9lbnYsCisJbXNnX2Nfb21wX2ludmFsaWRfZGV2aWNlX251bSwKKwltc2dfY191bmtub3duX2JpbmFyeV90eXBlLAorCW1zZ19jX211bHRpcGxlX3RhcmdldF9leGVzLAorCW1zZ19jX25vX3RhcmdldF9leGUsCisJbXNnX2NfcmVwb3J0X3Vua25vd25fdGltZXJfbm9kZSwKKwltc2dfY19yZXBvcnRfdW5rbm93bl90cmFjZV9ub2RlLAorCW1zZ19jX3JlcG9ydF9ob3N0LAorCW1zZ19jX3JlcG9ydF9taWMsCisJbXNnX2NfcmVwb3J0X3RpdGxlLAorCW1zZ19jX3JlcG9ydF9zZWNvbmRzLAorCW1zZ19jX3JlcG9ydF9ieXRlcywKKwltc2dfY19yZXBvcnRfY3B1X3RpbWUsCisJbXNnX2NfcmVwb3J0X21pY190aW1lLAorCW1zZ19jX3JlcG9ydF90YWcsCisJbXNnX2NfcmVwb3J0X2Zyb21fZmlsZSwKKwltc2dfY19yZXBvcnRfZmlsZSwKKwltc2dfY19yZXBvcnRfbGluZSwKKwltc2dfY19yZXBvcnRfY3B1X3RvX21pY19kYXRhLAorCW1zZ19jX3JlcG9ydF9taWNfdG9fY3B1X2RhdGEsCisJbXNnX2NfcmVwb3J0X29mZmxvYWQsCisJbXNnX2NfcmVwb3J0X3dfdGFnLAorCW1zZ19jX3JlcG9ydF9zdGF0ZSwKKwltc2dfY19yZXBvcnRfc3RhcnQsCisJbXNnX2NfcmVwb3J0X2luaXQsCisJbXNnX2NfcmVwb3J0X2xvZ2ljYWxfY2FyZCwKKwltc2dfY19yZXBvcnRfcGh5c2ljYWxfY2FyZCwKKwltc2dfY19yZXBvcnRfcmVnaXN0ZXIsCisJbXNnX2NfcmVwb3J0X2luaXRfZnVuYywKKwltc2dfY19yZXBvcnRfY3JlYXRlX2J1Zl9ob3N0LAorCW1zZ19jX3JlcG9ydF9jcmVhdGVfYnVmX21pYywKKwltc2dfY19yZXBvcnRfc2VuZF9wb2ludGVyX2RhdGEsCisJbXNnX2NfcmVwb3J0X3NlbnRfcG9pbnRlcl9kYXRhLAorCW1zZ19jX3JlcG9ydF9nYXRoZXJfY29weWluX2RhdGEsCisJbXNnX2NfcmVwb3J0X2NvcHlpbl9kYXRhLAorCW1zZ19jX3JlcG9ydF9zdGF0ZV9zaWduYWwsCisJbXNnX2NfcmVwb3J0X3NpZ25hbCwKKwltc2dfY19yZXBvcnRfd2FpdCwKKwltc2dfY19yZXBvcnRfY29tcHV0ZSwKKwltc2dfY19yZXBvcnRfcmVjZWl2ZV9wb2ludGVyX2RhdGEsCisJbXNnX2NfcmVwb3J0X3JlY2VpdmVkX3BvaW50ZXJfZGF0YSwKKwltc2dfY19yZXBvcnRfc3RhcnRfdGFyZ2V0X2Z1bmMsCisJbXNnX2NfcmVwb3J0X3ZhciwKKwltc2dfY19yZXBvcnRfc2NhdHRlcl9jb3B5aW5fZGF0YSwKKwltc2dfY19yZXBvcnRfZ2F0aGVyX2NvcHlvdXRfZGF0YSwKKwltc2dfY19yZXBvcnRfc2NhdHRlcl9jb3B5b3V0X2RhdGEsCisJbXNnX2NfcmVwb3J0X2NvcHlvdXRfZGF0YSwKKwltc2dfY19yZXBvcnRfdW5yZWdpc3RlciwKKwltc2dfY19yZXBvcnRfZGVzdHJveSwKKwltc2dfY19yZXBvcnRfbXlvaW5pdCwKKwltc2dfY19yZXBvcnRfbXlvcmVnaXN0ZXIsCisJbXNnX2NfcmVwb3J0X215b2ZpbmksCisJbXNnX2NfcmVwb3J0X21pY19teW9fc2hhcmVkLAorCW1zZ19jX3JlcG9ydF9taWNfbXlvX2ZwdHIsCisJbXNnX2NfcmVwb3J0X215b3NoYXJlZG1hbGxvYywKKwltc2dfY19yZXBvcnRfbXlvc2hhcmVkZnJlZSwKKwltc2dfY19yZXBvcnRfbXlvc2hhcmVkYWxpZ25lZG1hbGxvYywKKwltc2dfY19yZXBvcnRfbXlvc2hhcmVkYWxpZ25lZGZyZWUsCisJbXNnX2NfcmVwb3J0X215b2FjcXVpcmUsCisJbXNnX2NfcmVwb3J0X215b3JlbGVhc2UsCisJbXNnX2NfcmVwb3J0X2hvc3RfdG90YWxfb2ZmbG9hZF90aW1lLAorCW1zZ19jX3JlcG9ydF9ob3N0X2luaXRpYWxpemUsCisJbXNnX2NfcmVwb3J0X2hvc3RfdGFyZ2V0X2FjcXVpcmUsCisJbXNnX2NfcmVwb3J0X2hvc3Rfd2FpdF9kZXBzLAorCW1zZ19jX3JlcG9ydF9ob3N0X3NldHVwX2J1ZmZlcnMsCisJbXNnX2NfcmVwb3J0X2hvc3RfYWxsb2NfYnVmZmVycywKKwltc2dfY19yZXBvcnRfaG9zdF9zZXR1cF9taXNjX2RhdGEsCisJbXNnX2NfcmVwb3J0X2hvc3RfYWxsb2NfZGF0YV9idWZmZXIsCisJbXNnX2NfcmVwb3J0X2hvc3Rfc2VuZF9wb2ludGVycywKKwltc2dfY19yZXBvcnRfaG9zdF9nYXRoZXJfaW5wdXRzLAorCW1zZ19jX3JlcG9ydF9ob3N0X21hcF9pbl9kYXRhX2J1ZmZlciwKKwltc2dfY19yZXBvcnRfaG9zdF91bm1hcF9pbl9kYXRhX2J1ZmZlciwKKwltc2dfY19yZXBvcnRfaG9zdF9zdGFydF9jb21wdXRlLAorCW1zZ19jX3JlcG9ydF9ob3N0X3dhaXRfY29tcHV0ZSwKKwltc2dfY19yZXBvcnRfaG9zdF9zdGFydF9idWZmZXJzX3JlYWRzLAorCW1zZ19jX3JlcG9ydF9ob3N0X3NjYXR0ZXJfb3V0cHV0cywKKwltc2dfY19yZXBvcnRfaG9zdF9tYXBfb3V0X2RhdGFfYnVmZmVyLAorCW1zZ19jX3JlcG9ydF9ob3N0X3VubWFwX291dF9kYXRhX2J1ZmZlciwKKwltc2dfY19yZXBvcnRfaG9zdF93YWl0X2J1ZmZlcnNfcmVhZHMsCisJbXNnX2NfcmVwb3J0X2hvc3RfZGVzdHJveV9idWZmZXJzLAorCW1zZ19jX3JlcG9ydF90YXJnZXRfdG90YWxfdGltZSwKKwltc2dfY19yZXBvcnRfdGFyZ2V0X2Rlc2NyaXB0b3Jfc2V0dXAsCisJbXNnX2NfcmVwb3J0X3RhcmdldF9mdW5jX2xvb2t1cCwKKwltc2dfY19yZXBvcnRfdGFyZ2V0X2Z1bmNfdGltZSwKKwltc2dfY19yZXBvcnRfdGFyZ2V0X3NjYXR0ZXJfaW5wdXRzLAorCW1zZ19jX3JlcG9ydF90YXJnZXRfYWRkX2J1ZmZlcl9yZWZzLAorCW1zZ19jX3JlcG9ydF90YXJnZXRfY29tcHV0ZSwKKwltc2dfY19yZXBvcnRfdGFyZ2V0X2dhdGhlcl9vdXRwdXRzLAorCW1zZ19jX3JlcG9ydF90YXJnZXRfcmVsZWFzZV9idWZmZXJfcmVmcywKKwltc2dfY19jb2lfcGlwZWxpbmVfbWF4X251bWJlciwKKwltc2dfY19yYW5nZXNfZG9udF9tYXRjaCwKKwltc2dfY19kZXN0aW5hdGlvbl9pc19vdmVyLAorCW1zZ19jX3NsaWNlX29mX25vbmNvbnRfYXJyYXksCisJbXNnX2NfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwKKwlsYXN0TXNnID0gMTUyLAorCWZpcnN0TXNnID0gMQorfTsKKworCisjaWYgIWRlZmluZWQoTUVTU0FHRV9UQUJMRV9OQU1FKQorIyAgICBkZWZpbmUgTUVTU0FHRV9UQUJMRV9OQU1FIF9fbGlib2ZmbG9hZF9tZXNzYWdlX3RhYmxlCisjZW5kaWYKKworc3RhdGljIGNoYXIgY29uc3QgKiBNRVNTQUdFX1RBQkxFX05BTUVbXSA9IHsKKwkvKiAgIDAgX19kdW1teV9fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICJVbi11c2VkIG1lc3NhZ2UiLAorCS8qICAgMSBtc2dfY19kZXZpY2VfaXNfbm90X2F2YWlsYWJsZSAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCBvZmZsb2FkIHRvIE1JQyAtIGRldmljZSBpcyBub3QgYXZhaWxhYmxlIiwKKwkvKiAgIDIgbXNnX2NfaW52YWxpZF9kZXZpY2VfbnVtYmVyICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBleHBlY3RlZCBhIG51bWJlciBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gLTEiLAorCS8qICAgMyBtc2dfY19zZW5kX2Z1bmNfcHRyICAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCBmaW5kIGZ1bmN0aW9uIG5hbWUgZm9yIGFkZHJlc3MgJXAiLAorCS8qICAgNCBtc2dfY19yZWNlaXZlX2Z1bmNfcHRyICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCBmaW5kIGFkZHJlc3Mgb2YgZnVuY3Rpb24gJXMiLAorCS8qICAgNSBtc2dfY19vZmZsb2FkX21hbGxvYyAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCAocmVxdWVzdGVkPSVsbGQgYnl0ZXMsIGFsaWduICVsbGQpIiwKKwkvKiAgIDYgbXNnX2Nfb2ZmbG9hZDEgICAgICAgICAgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBkZXZpY2UgJWQgZG9lcyBub3QgaGF2ZSBhIHBlbmRpbmcgc2lnbmFsIGZvciB3YWl0KCVwKSIsCisJLyogICA3IG1zZ19jX3Vua25vd25fdmFyX3R5cGUgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogdW5rbm93biB2YXJpYWJsZSB0eXBlICVkIiwKKwkvKiAgIDggbXNnX2NfaW52YWxpZF9lbnZfdmFyX3ZhbHVlICAgICAgICAgICAgICovICJvZmZsb2FkIHdhcm5pbmc6IGlnbm9yaW5nIGludmFsaWQgdmFsdWUgc3BlY2lmaWVkIGZvciAlcyIsCisJLyogICA5IG1zZ19jX2ludmFsaWRfZW52X3Zhcl9pbnRfdmFsdWUgICAgICAgICAqLyAib2ZmbG9hZCB3YXJuaW5nOiBzcGVjaWZ5IGFuIGludGVnZXIgdmFsdWUgZm9yICVzIiwKKwkvKiAgMTAgbXNnX2NfaW52YWxpZF9lbnZfcmVwb3J0X3ZhbHVlICAgICAgICAgICovICJvZmZsb2FkIHdhcm5pbmc6IGlnbm9yaW5nICVzIHNldHRpbmc7IHVzZSBhIHZhbHVlIGluIHJhbmdlIDEtMyIsCisJLyogIDExIG1zZ19jX29mZmxvYWRfc2lnbmFsZWQxICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogaW52YWxpZCBkZXZpY2UgbnVtYmVyICVkIHNwZWNpZmllZCBpbiBfT2ZmbG9hZF9zaWduYWxlZCIsCisJLyogIDEyIG1zZ19jX29mZmxvYWRfc2lnbmFsZWQyICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogaW52YWxpZCBzaWduYWwgJXAgc3BlY2lmaWVkIGZvciBfT2ZmbG9hZF9zaWduYWxlZCIsCisJLyogIDEzIG1zZ19jX215b3dyYXBwZXJfY2hlY2tyZXN1bHQgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogJXMgZmFpbGVkIHdpdGggZXJyb3IgJWQiLAorCS8qICAxNCBtc2dfY19teW90YXJnZXRfY2hlY2tyZXN1bHQgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6ICVzIGZhaWxlZCB3aXRoIGVycm9yICVkIiwKKwkvKiAgMTUgbXNnX2Nfb2ZmbG9hZF9kZXNjcmlwdG9yX29mZmxvYWQgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBjYW5ub3QgZmluZCBvZmZsb2FkIGVudHJ5ICVzIiwKKwkvKiAgMTYgbXNnX2NfbWVyZ2VfdmFyX2Rlc2NzMSAgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiB1bmV4cGVjdGVkIG51bWJlciBvZiB2YXJpYWJsZSBkZXNjcmlwdG9ycyIsCisJLyogIDE3IG1zZ19jX21lcmdlX3Zhcl9kZXNjczIgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogdW5leHBlY3RlZCB2YXJpYWJsZSB0eXBlIiwKKwkvKiAgMTggbXNnX2NfbWljX3BhcnNlX2Vudl92YXJfbGlzdDEgICAgICAgICAgICovICJvZmZsb2FkX2Vycm9yOiBNSUMgZW52aXJvbm1lbnQgdmFyaWFibGUgbXVzdCBiZWdpbiB3aXRoIGFuIGFscGFiZXRpYyBjaGFyYWN0ZXIiLAorCS8qICAxOSBtc2dfY19taWNfcGFyc2VfZW52X3Zhcl9saXN0MiAgICAgICAgICAgKi8gIm9mZmxvYWRfZXJyb3I6IE1JQyBlbnZpcm9ubWVudCB2YXJpYWJsZSB2YWx1ZSBtdXN0IGJlIHNwZWNpZmllZCB3aXRoIJE9kiIsCisJLyogIDIwIG1zZ19jX21pY19wcm9jZXNzX2V4aXRfcmV0ICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogcHJvY2VzcyBvbiB0aGUgZGV2aWNlICVkIHVuZXhwZWN0ZWRseSBleGl0ZWQgd2l0aCBjb2RlICVkIiwKKwkvKiAgMjEgbXNnX2NfbWljX3Byb2Nlc3NfZXhpdF9zaWcgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBwcm9jZXNzIG9uIHRoZSBkZXZpY2UgJWQgd2FzIHRlcm1pbmF0ZWQgYnkgc2lnbmFsICVkICglcykiLAorCS8qICAyMiBtc2dfY19taWNfcHJvY2Vzc19leGl0ICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IHByb2Nlc3Mgb24gdGhlIGRldmljZSAlZCB3YXMgdW5leHBlY3RlZGx5IHRlcm1pbmF0ZWQiLAorCS8qICAyMyBtc2dfY19taWNfaW5pdDMgICAgICAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgd2FybmluZzogaWdub3JpbmcgTUlDX1NUQUNLU0laRSBzZXR0aW5nOyB1c2UgYSB2YWx1ZSA+PSAxNksgYW5kIGEgbXVsdGlwbGUgb2YgNEsiLAorCS8qICAyNCBtc2dfY19taWNfaW5pdDQgICAgICAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IHRocmVhZCBrZXkgY3JlYXRlIGZhaWxlZCB3aXRoIGVycm9yICVkIiwKKwkvKiAgMjUgbXNnX2NfbWljX2luaXQ1ICAgICAgICAgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIHdhcm5pbmc6IHNwZWNpZnkgT0ZGTE9BRF9ERVZJQ0VTIGFzIGNvbW1hLXNlcGFyYXRlZCBwaHlzaWNhbCBkZXZpY2UgbnVtYmVycyBvciAnbm9uZSciLAorCS8qICAyNiBtc2dfY19taWNfaW5pdDYgICAgICAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgd2FybmluZzogT0ZGTE9BRF9ERVZJQ0VTIGRldmljZSBudW1iZXIgJWQgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhIHBoeXNpY2FsIGRldmljZSIsCisJLyogIDI3IG1zZ19jX25vX3N0YXRpY192YXJfZGF0YSAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogY2Fubm90IGZpbmQgZGF0YSBhc3NvY2lhdGVkIHdpdGggc3RhdGljYWxseSBhbGxvY2F0ZWQgdmFyaWFibGUgJXAiLAorCS8qICAyOCBtc2dfY19ub19wdHJfZGF0YSAgICAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCBmaW5kIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHBvaW50ZXIgdmFyaWFibGUgJXAiLAorCS8qICAyOSBtc2dfY19nZXRfZW5naW5lX2hhbmRsZSAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCBnZXQgZGV2aWNlICVkIGhhbmRsZSAoZXJyb3IgY29kZSAlZCkiLAorCS8qICAzMCBtc2dfY19nZXRfZW5naW5lX2luZGV4ICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCBnZXQgcGh5c2ljYWwgaW5kZXggZm9yIGxvZ2ljYWwgZGV2aWNlICVkIChlcnJvciBjb2RlICVkKSIsCisJLyogIDMxIG1zZ19jX3Byb2Nlc3NfY3JlYXRlICAgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogY2Fubm90IHN0YXJ0IHByb2Nlc3Mgb24gdGhlIGRldmljZSAlZCAoZXJyb3IgY29kZSAlZCkiLAorCS8qICAzMiBtc2dfY19wcm9jZXNzX2dldF9mdW5jX2hhbmRsZXMgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCBnZXQgZnVuY3Rpb24gaGFuZGxlcyBvbiB0aGUgZGV2aWNlICVkIChlcnJvciBjb2RlICVkKSIsCisJLyogIDMzIG1zZ19jX3Byb2Nlc3Nfd2FpdF9zaHV0ZG93biAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogd2FpdCBmb3IgcHJvY2VzcyBzaHV0ZG93biBmYWlsZWQgb24gZGV2aWNlICVkIChlcnJvciBjb2RlICVkKSIsCisJLyogIDM0IG1zZ19jX3Byb2Nlc3NfcHJveHlfZmx1c2ggICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogY2Fubm90IGZsdXNoIHByb2Nlc3Mgb3V0cHV0IG9uIGRldmljZSAlZCAoZXJyb3IgY29kZSAlZCkiLAorCS8qICAzNSBtc2dfY19sb2FkX2xpYnJhcnkgICAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCBsb2FkIGxpYnJhcnkgdG8gdGhlIGRldmljZSAlZCAoZXJyb3IgY29kZSAlZCkiLAorCS8qICAzNiBtc2dfY19waXBlbGluZV9jcmVhdGUgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCBjcmVhdGUgcGlwZWxpbmUgb24gdGhlIGRldmljZSAlZCAoZXJyb3IgY29kZSAlZCkiLAorCS8qICAzNyBtc2dfY19waXBlbGluZV9ydW5fZnVuYyAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCBleGVjdXRlIGZ1bmN0aW9uIG9uIHRoZSBkZXZpY2UgJWQgKGVycm9yIGNvZGUgJWQpIiwKKwkvKiAgMzggbXNnX2NfcGlwZWxpbmVfc3RhcnRfcnVuX2Z1bmNzICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBjYW5ub3Qgc3RhcnQgZXhlY3V0aW5nIHBpcGVsaW5lIGZ1bmN0aW9uIG9uIHRoZSBkZXZpY2UgJWQgKGVycm9yIGNvZGUgJWQpIiwKKwkvKiAgMzkgbXNnX2NfYnVmX2NyZWF0ZSAgICAgICAgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBjYW5ub3QgY3JlYXRlIGJ1ZmZlciBvbiBkZXZpY2UgJWQgKGVycm9yIGNvZGUgJWQpIiwKKwkvKiAgNDAgbXNnX2NfYnVmX2NyZWF0ZV9vdXRfb2ZfbWVtICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBjYW5ub3QgY3JlYXRlIGJ1ZmZlciBvbiBkZXZpY2UgJWQsIG91dCBvZiBtZW1vcnkiLAorCS8qICA0MSBtc2dfY19idWZfY3JlYXRlX2Zyb21fbWVtICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCBjcmVhdGUgYnVmZmVyIGZyb20gbWVtb3J5IG9uIGRldmljZSAlZCAoZXJyb3IgY29kZSAlZCkiLAorCS8qICA0MiBtc2dfY19idWZfZGVzdHJveSAgICAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGJ1ZmZlciBkZXN0cm95IGZhaWxlZCAoZXJyb3IgY29kZSAlZCkiLAorCS8qICA0MyBtc2dfY19idWZfbWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGJ1ZmZlciBtYXAgZmFpbGVkIChlcnJvciBjb2RlICVkKSIsCisJLyogIDQ0IG1zZ19jX2J1Zl91bm1hcCAgICAgICAgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogYnVmZmVyIHVubWFwIGZhaWxlZCAoZXJyb3IgY29kZSAlZCkiLAorCS8qICA0NSBtc2dfY19idWZfcmVhZCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGJ1ZmZlciByZWFkIGZhaWxlZCAoZXJyb3IgY29kZSAlZCkiLAorCS8qICA0NiBtc2dfY19idWZfd3JpdGUgICAgICAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGJ1ZmZlciB3cml0ZSBmYWlsZWQgKGVycm9yIGNvZGUgJWQpIiwKKwkvKiAgNDcgbXNnX2NfYnVmX2NvcHkgICAgICAgICAgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBidWZmZXIgY29weSBmYWlsZWQgKGVycm9yIGNvZGUgJWQpIiwKKwkvKiAgNDggbXNnX2NfYnVmX2dldF9hZGRyZXNzICAgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBjYW5ub3QgZ2V0IGJ1ZmZlciBhZGRyZXNzIG9uIGRldmljZSAlZCAoZXJyb3IgY29kZSAlZCkiLAorCS8qICA0OSBtc2dfY19idWZfYWRkX3JlZiAgICAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCByZXVzZSBidWZmZXIgbWVtb3J5IG9uIGRldmljZSAlZCAoZXJyb3IgY29kZSAlZCkiLAorCS8qICA1MCBtc2dfY19idWZfcmVsZWFzZV9yZWYgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCByZWxlYXNlIGJ1ZmZlciBtZW1vcnkgb24gZGV2aWNlICVkIChlcnJvciBjb2RlICVkKSIsCisJLyogIDUxIG1zZ19jX2J1Zl9zZXRfc3RhdGUgICAgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogYnVmZmVyIHNldCBzdGF0ZSBmYWlsZWQgKGVycm9yIGNvZGUgJWQpIiwKKwkvKiAgNTIgbXNnX2NfZXZlbnRfd2FpdCAgICAgICAgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiB3YWl0IGZvciBldmVudCB0byBiZWNvbWUgc2lnbmFsZWQgZmFpbGVkIChlcnJvciBjb2RlICVkKSIsCisJLyogIDUzIG1zZ19jX3plcm9fb3JfbmVnX3B0cl9sZW4gICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogbWVtb3J5IGFsbG9jYXRpb24gb2YgbmVnYXRpdmUgbGVuZ3RoIGlzIG5vdCBzdXBwb3J0ZWQiLAorCS8qICA1NCBtc2dfY196ZXJvX29yX25lZ190cmFuc2Zlcl9zaXplICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGRhdGEgdHJhbnNmZXIgb2YgemVybyBvciBuZWdhdGl2ZSBzaXplIGlzIG5vdCBzdXBwb3J0ZWQiLAorCS8qICA1NSBtc2dfY19iYWRfcHRyX21lbV9yYW5nZSAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGFkZHJlc3MgcmFuZ2UgcGFydGlhbGx5IG92ZXJsYXBzIHdpdGggZXhpc3RpbmcgYWxsb2NhdGlvbiIsCisJLyogIDU2IG1zZ19jX2RpZmZlcmVudF9zcmNfYW5kX2RzdG5fc2l6ZXMgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogc2l6ZSBvZiB0aGUgc291cmNlICVkIGRpZmZlcnMgZnJvbSBzaXplIG9mIHRoZSBkZXN0aW5hdGlvbiAlZCIsCisJLyogIDU3IG1zZ19jX25vbl9jb250aWd1b3VzX2RvcGVfdmVjdG9yICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogb2ZmbG9hZCBkYXRhIHRyYW5zZmVyIHN1cHBvcnRzIG9ubHkgYSBzaW5nbGUgY29udGlndW91cyBtZW1vcnkgcmFuZ2UgcGVyIHZhcmlhYmxlIiwKKwkvKiAgNTggbXNnX2Nfb21wX2ludmFsaWRfZGV2aWNlX251bV9lbnYgICAgICAgICovICJvZmZsb2FkIHdhcm5pbmc6IGlnbm9yaW5nICVzIHNldHRpbmc7IHVzZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIHZhbHVlIiwKKwkvKiAgNTkgbXNnX2Nfb21wX2ludmFsaWRfZGV2aWNlX251bSAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBkZXZpY2UgbnVtYmVyIHNob3VsZCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIHZhbHVlIiwKKwkvKiAgNjAgbXNnX2NfdW5rbm93bl9iaW5hcnlfdHlwZSAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiB1bmV4cGVjdGVkIGVtYmVkZGVkIHRhcmdldCBiaW5hcnkgdHlwZSwgZXhwZWN0ZWQgZWl0aGVyIGFuIGV4ZWN1dGFibGUgb3Igc2hhcmVkIGxpYnJhcnkiLAorCS8qICA2MSBtc2dfY19tdWx0aXBsZV90YXJnZXRfZXhlcyAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IG1vcmUgdGhhdCBvbmUgdGFyZ2V0IGV4ZWN1dGFibGUgZm91bmQiLAorCS8qICA2MiBtc2dfY19ub190YXJnZXRfZXhlICAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IHRhcmdldCBleGVjdXRhYmxlIGlzIG5vdCBhdmFpbGFibGUiLAorCS8qICA2MyBtc2dfY19yZXBvcnRfdW5rbm93bl90aW1lcl9ub2RlICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IHVua25vd24gdGltZXIgbm9kZSIsCisJLyogIDY0IG1zZ19jX3JlcG9ydF91bmtub3duX3RyYWNlX25vZGUgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogdW5rbm93biB0cmFjZSBub2RlIiwKKwkvKiAgNjUgbXNnX2NfcmVwb3J0X2hvc3QgICAgICAgICAgICAgICAgICAgICAgICovICJIT1NUIiwKKwkvKiAgNjYgbXNnX2NfcmVwb3J0X21pYyAgICAgICAgICAgICAgICAgICAgICAgICovICJNSUMiLAorCS8qICA2NyBtc2dfY19yZXBvcnRfdGl0bGUgICAgICAgICAgICAgICAgICAgICAgKi8gInRpbWVyIGRhdGEgICAgICAgKHNlYykiLAorCS8qICA2OCBtc2dfY19yZXBvcnRfc2Vjb25kcyAgICAgICAgICAgICAgICAgICAgKi8gIihzZWNvbmRzKSIsCisJLyogIDY5IG1zZ19jX3JlcG9ydF9ieXRlcyAgICAgICAgICAgICAgICAgICAgICAqLyAiKGJ5dGVzKSIsCisJLyogIDcwIG1zZ19jX3JlcG9ydF9jcHVfdGltZSAgICAgICAgICAgICAgICAgICAqLyAiQ1BVIFRpbWUiLAorCS8qICA3MSBtc2dfY19yZXBvcnRfbWljX3RpbWUgICAgICAgICAgICAgICAgICAgKi8gIk1JQyBUaW1lIiwKKwkvKiAgNzIgbXNnX2NfcmVwb3J0X3RhZyAgICAgICAgICAgICAgICAgICAgICAgICovICJUYWciLAorCS8qICA3MyBtc2dfY19yZXBvcnRfZnJvbV9maWxlICAgICAgICAgICAgICAgICAgKi8gIk9mZmxvYWQgZnJvbSBmaWxlIiwKKwkvKiAgNzQgbXNnX2NfcmVwb3J0X2ZpbGUgICAgICAgICAgICAgICAgICAgICAgICovICJGaWxlIiwKKwkvKiAgNzUgbXNnX2NfcmVwb3J0X2xpbmUgICAgICAgICAgICAgICAgICAgICAgICovICJMaW5lIiwKKwkvKiAgNzYgbXNnX2NfcmVwb3J0X2NwdV90b19taWNfZGF0YSAgICAgICAgICAgICovICJDUFUtPk1JQyBEYXRhIiwKKwkvKiAgNzcgbXNnX2NfcmVwb3J0X21pY190b19jcHVfZGF0YSAgICAgICAgICAgICovICJNSUMtPkNQVSBEYXRhIiwKKwkvKiAgNzggbXNnX2NfcmVwb3J0X29mZmxvYWQgICAgICAgICAgICAgICAgICAgICovICJPZmZsb2FkIiwKKwkvKiAgNzkgbXNnX2NfcmVwb3J0X3dfdGFnICAgICAgICAgICAgICAgICAgICAgICovICJUYWcgJWQiLAorCS8qICA4MCBtc2dfY19yZXBvcnRfc3RhdGUgICAgICAgICAgICAgICAgICAgICAgKi8gIlN0YXRlIiwKKwkvKiAgODEgbXNnX2NfcmVwb3J0X3N0YXJ0ICAgICAgICAgICAgICAgICAgICAgICovICJTdGFydCB0YXJnZXQiLAorCS8qICA4MiBtc2dfY19yZXBvcnRfaW5pdCAgICAgICAgICAgICAgICAgICAgICAgKi8gIkluaXRpYWxpemUiLAorCS8qICA4MyBtc2dfY19yZXBvcnRfbG9naWNhbF9jYXJkICAgICAgICAgICAgICAgKi8gImxvZ2ljYWwgY2FyZCIsCisJLyogIDg0IG1zZ19jX3JlcG9ydF9waHlzaWNhbF9jYXJkICAgICAgICAgICAgICAqLyAicGh5c2ljYWwgY2FyZCIsCisJLyogIDg1IG1zZ19jX3JlcG9ydF9yZWdpc3RlciAgICAgICAgICAgICAgICAgICAqLyAiUmVnaXN0ZXIgc3RhdGljIGRhdGEgdGFibGVzIiwKKwkvKiAgODYgbXNnX2NfcmVwb3J0X2luaXRfZnVuYyAgICAgICAgICAgICAgICAgICovICJTZXR1cCB0YXJnZXQgZW50cnkiLAorCS8qICA4NyBtc2dfY19yZXBvcnRfY3JlYXRlX2J1Zl9ob3N0ICAgICAgICAgICAgKi8gIkNyZWF0ZSBob3N0IGJ1ZmZlciIsCisJLyogIDg4IG1zZ19jX3JlcG9ydF9jcmVhdGVfYnVmX21pYyAgICAgICAgICAgICAqLyAiQ3JlYXRlIHRhcmdldCBidWZmZXIiLAorCS8qICA4OSBtc2dfY19yZXBvcnRfc2VuZF9wb2ludGVyX2RhdGEgICAgICAgICAgKi8gIlNlbmQgcG9pbnRlciBkYXRhIiwKKwkvKiAgOTAgbXNnX2NfcmVwb3J0X3NlbnRfcG9pbnRlcl9kYXRhICAgICAgICAgICovICJIb3N0LT50YXJnZXQgcG9pbnRlciBkYXRhIiwKKwkvKiAgOTEgbXNnX2NfcmVwb3J0X2dhdGhlcl9jb3B5aW5fZGF0YSAgICAgICAgICovICJHYXRoZXIgY29weWluIGRhdGEiLAorCS8qICA5MiBtc2dfY19yZXBvcnRfY29weWluX2RhdGEgICAgICAgICAgICAgICAgKi8gIkhvc3QtPnRhcmdldCBjb3B5aW4gZGF0YSIsCisJLyogIDkzIG1zZ19jX3JlcG9ydF9zdGF0ZV9zaWduYWwgICAgICAgICAgICAgICAqLyAiU2lnbmFsIiwKKwkvKiAgOTQgbXNnX2NfcmVwb3J0X3NpZ25hbCAgICAgICAgICAgICAgICAgICAgICovICJzaWduYWwgOiIsCisJLyogIDk1IG1zZ19jX3JlcG9ydF93YWl0ICAgICAgICAgICAgICAgICAgICAgICAqLyAid2FpdHMgIDoiLAorCS8qICA5NiBtc2dfY19yZXBvcnRfY29tcHV0ZSAgICAgICAgICAgICAgICAgICAgKi8gIkV4ZWN1dGUgdGFzayBvbiB0YXJnZXQiLAorCS8qICA5NyBtc2dfY19yZXBvcnRfcmVjZWl2ZV9wb2ludGVyX2RhdGEgICAgICAgKi8gIlJlY2VpdmUgcG9pbnRlciBkYXRhIiwKKwkvKiAgOTggbXNnX2NfcmVwb3J0X3JlY2VpdmVkX3BvaW50ZXJfZGF0YSAgICAgICovICJUYXJnZXQtPmhvc3QgcG9pbnRlciBkYXRhIiwKKwkvKiAgOTkgbXNnX2NfcmVwb3J0X3N0YXJ0X3RhcmdldF9mdW5jICAgICAgICAgICovICJTdGFydCB0YXJnZXQgZW50cnkiLAorCS8qIDEwMCBtc2dfY19yZXBvcnRfdmFyICAgICAgICAgICAgICAgICAgICAgICAgKi8gIlZhciIsCisJLyogMTAxIG1zZ19jX3JlcG9ydF9zY2F0dGVyX2NvcHlpbl9kYXRhICAgICAgICAqLyAiU2NhdHRlciBjb3B5aW4gZGF0YSIsCisJLyogMTAyIG1zZ19jX3JlcG9ydF9nYXRoZXJfY29weW91dF9kYXRhICAgICAgICAqLyAiR2F0aGVyIGNvcHlvdXQgZGF0YSIsCisJLyogMTAzIG1zZ19jX3JlcG9ydF9zY2F0dGVyX2NvcHlvdXRfZGF0YSAgICAgICAqLyAiU2NhdHRlciBjb3B5b3V0IGRhdGEiLAorCS8qIDEwNCBtc2dfY19yZXBvcnRfY29weW91dF9kYXRhICAgICAgICAgICAgICAgKi8gIlRhcmdldC0+aG9zdCBjb3B5b3V0IGRhdGEiLAorCS8qIDEwNSBtc2dfY19yZXBvcnRfdW5yZWdpc3RlciAgICAgICAgICAgICAgICAgKi8gIlVucmVnaXN0ZXIgZGF0YSB0YWJsZXMiLAorCS8qIDEwNiBtc2dfY19yZXBvcnRfZGVzdHJveSAgICAgICAgICAgICAgICAgICAgKi8gIkRlc3Ryb3kiLAorCS8qIDEwNyBtc2dfY19yZXBvcnRfbXlvaW5pdCAgICAgICAgICAgICAgICAgICAgKi8gIkluaXRpYWxpemUgTVlPIiwKKwkvKiAxMDggbXNnX2NfcmVwb3J0X215b3JlZ2lzdGVyICAgICAgICAgICAgICAgICovICJSZWdpc3RlciBNWU8gdGFibGVzIiwKKwkvKiAxMDkgbXNnX2NfcmVwb3J0X215b2ZpbmkgICAgICAgICAgICAgICAgICAgICovICJGaW5hbGl6ZSBNWU8iLAorCS8qIDExMCBtc2dfY19yZXBvcnRfbWljX215b19zaGFyZWQgICAgICAgICAgICAgKi8gIk1JQyBNWU8gc2hhcmVkIHRhYmxlIHJlZ2lzdGVyIiwKKwkvKiAxMTEgbXNnX2NfcmVwb3J0X21pY19teW9fZnB0ciAgICAgICAgICAgICAgICovICJNSUMgTVlPIGZwdHIgdGFibGUgcmVnaXN0ZXIiLAorCS8qIDExMiBtc2dfY19yZXBvcnRfbXlvc2hhcmVkbWFsbG9jICAgICAgICAgICAgKi8gIk1ZTyBzaGFyZWQgbWFsbG9jIiwKKwkvKiAxMTMgbXNnX2NfcmVwb3J0X215b3NoYXJlZGZyZWUgICAgICAgICAgICAgICovICJNWU8gc2hhcmVkIGZyZWUiLAorCS8qIDExNCBtc2dfY19yZXBvcnRfbXlvc2hhcmVkYWxpZ25lZG1hbGxvYyAgICAgKi8gIk1ZTyBzaGFyZWQgYWxpZ25lZCBtYWxsb2MiLAorCS8qIDExNSBtc2dfY19yZXBvcnRfbXlvc2hhcmVkYWxpZ25lZGZyZWUgICAgICAgKi8gIk1ZTyBzaGFyZWQgYWxpZ25lZCBmcmVlIiwKKwkvKiAxMTYgbXNnX2NfcmVwb3J0X215b2FjcXVpcmUgICAgICAgICAgICAgICAgICovICJNWU8gYWNxdWlyZSIsCisJLyogMTE3IG1zZ19jX3JlcG9ydF9teW9yZWxlYXNlICAgICAgICAgICAgICAgICAqLyAiTVlPIHJlbGVhc2UiLAorCS8qIDExOCBtc2dfY19yZXBvcnRfaG9zdF90b3RhbF9vZmZsb2FkX3RpbWUgICAgKi8gImhvc3Q6IHRvdGFsIG9mZmxvYWQgdGltZSIsCisJLyogMTE5IG1zZ19jX3JlcG9ydF9ob3N0X2luaXRpYWxpemUgICAgICAgICAgICAqLyAiaG9zdDogaW5pdGlhbGl6ZSB0YXJnZXQiLAorCS8qIDEyMCBtc2dfY19yZXBvcnRfaG9zdF90YXJnZXRfYWNxdWlyZSAgICAgICAgKi8gImhvc3Q6IGFjcXVpcmUgdGFyZ2V0IiwKKwkvKiAxMjEgbXNnX2NfcmVwb3J0X2hvc3Rfd2FpdF9kZXBzICAgICAgICAgICAgICovICJob3N0OiB3YWl0IGRlcGVuZGVuY2llcyIsCisJLyogMTIyIG1zZ19jX3JlcG9ydF9ob3N0X3NldHVwX2J1ZmZlcnMgICAgICAgICAqLyAiaG9zdDogc2V0dXAgYnVmZmVycyIsCisJLyogMTIzIG1zZ19jX3JlcG9ydF9ob3N0X2FsbG9jX2J1ZmZlcnMgICAgICAgICAqLyAiaG9zdDogYWxsb2NhdGUgYnVmZmVycyIsCisJLyogMTI0IG1zZ19jX3JlcG9ydF9ob3N0X3NldHVwX21pc2NfZGF0YSAgICAgICAqLyAiaG9zdDogc2V0dXAgbWlzY19kYXRhIiwKKwkvKiAxMjUgbXNnX2NfcmVwb3J0X2hvc3RfYWxsb2NfZGF0YV9idWZmZXIgICAgICovICJob3N0OiBhbGxvY2F0ZSBidWZmZXIiLAorCS8qIDEyNiBtc2dfY19yZXBvcnRfaG9zdF9zZW5kX3BvaW50ZXJzICAgICAgICAgKi8gImhvc3Q6IHNlbmQgcG9pbnRlcnMiLAorCS8qIDEyNyBtc2dfY19yZXBvcnRfaG9zdF9nYXRoZXJfaW5wdXRzICAgICAgICAgKi8gImhvc3Q6IGdhdGhlciBpbnB1dHMiLAorCS8qIDEyOCBtc2dfY19yZXBvcnRfaG9zdF9tYXBfaW5fZGF0YV9idWZmZXIgICAgKi8gImhvc3Q6IG1hcCBJTiBkYXRhIGJ1ZmZlciIsCisJLyogMTI5IG1zZ19jX3JlcG9ydF9ob3N0X3VubWFwX2luX2RhdGFfYnVmZmVyICAqLyAiaG9zdDogdW5tYXAgSU4gZGF0YSBidWZmZXIiLAorCS8qIDEzMCBtc2dfY19yZXBvcnRfaG9zdF9zdGFydF9jb21wdXRlICAgICAgICAgKi8gImhvc3Q6IGluaXRpYXRlIGNvbXB1dGUiLAorCS8qIDEzMSBtc2dfY19yZXBvcnRfaG9zdF93YWl0X2NvbXB1dGUgICAgICAgICAgKi8gImhvc3Q6IHdhaXQgY29tcHV0ZSIsCisJLyogMTMyIG1zZ19jX3JlcG9ydF9ob3N0X3N0YXJ0X2J1ZmZlcnNfcmVhZHMgICAqLyAiaG9zdDogaW5pdGlhdGUgcG9pbnRlciByZWFkcyIsCisJLyogMTMzIG1zZ19jX3JlcG9ydF9ob3N0X3NjYXR0ZXJfb3V0cHV0cyAgICAgICAqLyAiaG9zdDogc2NhdHRlciBvdXRwdXRzIiwKKwkvKiAxMzQgbXNnX2NfcmVwb3J0X2hvc3RfbWFwX291dF9kYXRhX2J1ZmZlciAgICovICJob3N0OiBtYXAgT1VUIGRhdGEgYnVmZmVyIiwKKwkvKiAxMzUgbXNnX2NfcmVwb3J0X2hvc3RfdW5tYXBfb3V0X2RhdGFfYnVmZmVyICovICJob3N0OiB1bm1hcCBPVVQgZGF0YSBidWZmZXIiLAorCS8qIDEzNiBtc2dfY19yZXBvcnRfaG9zdF93YWl0X2J1ZmZlcnNfcmVhZHMgICAgKi8gImhvc3Q6IHdhaXQgcG9pbnRlciByZWFkcyIsCisJLyogMTM3IG1zZ19jX3JlcG9ydF9ob3N0X2Rlc3Ryb3lfYnVmZmVycyAgICAgICAqLyAiaG9zdDogZGVzdHJveSBidWZmZXJzIiwKKwkvKiAxMzggbXNnX2NfcmVwb3J0X3RhcmdldF90b3RhbF90aW1lICAgICAgICAgICovICJ0YXJnZXQ6IHRvdGFsIHRpbWUiLAorCS8qIDEzOSBtc2dfY19yZXBvcnRfdGFyZ2V0X2Rlc2NyaXB0b3Jfc2V0dXAgICAgKi8gInRhcmdldDogc2V0dXAgb2ZmbG9hZCBkZXNjcmlwdG9yIiwKKwkvKiAxNDAgbXNnX2NfcmVwb3J0X3RhcmdldF9mdW5jX2xvb2t1cCAgICAgICAgICovICJ0YXJnZXQ6IGVudHJ5IGxvb2t1cCIsCisJLyogMTQxIG1zZ19jX3JlcG9ydF90YXJnZXRfZnVuY190aW1lICAgICAgICAgICAqLyAidGFyZ2V0OiBlbnRyeSB0aW1lIiwKKwkvKiAxNDIgbXNnX2NfcmVwb3J0X3RhcmdldF9zY2F0dGVyX2lucHV0cyAgICAgICovICJ0YXJnZXQ6IHNjYXR0ZXIgaW5wdXRzIiwKKwkvKiAxNDMgbXNnX2NfcmVwb3J0X3RhcmdldF9hZGRfYnVmZmVyX3JlZnMgICAgICovICJ0YXJnZXQ6IGFkZCBidWZmZXIgcmVmZXJlbmNlIiwKKwkvKiAxNDQgbXNnX2NfcmVwb3J0X3RhcmdldF9jb21wdXRlICAgICAgICAgICAgICovICJ0YXJnZXQ6IGNvbXB1dGUiLAorCS8qIDE0NSBtc2dfY19yZXBvcnRfdGFyZ2V0X2dhdGhlcl9vdXRwdXRzICAgICAgKi8gInRhcmdldDogZ2F0aGVyIG91dHB1dHMiLAorCS8qIDE0NiBtc2dfY19yZXBvcnRfdGFyZ2V0X3JlbGVhc2VfYnVmZmVyX3JlZnMgKi8gInRhcmdldDogcmVtb3ZlIGJ1ZmZlciByZWZlcmVuY2UiLAorCS8qIDE0NyBtc2dfY19jb2lfcGlwZWxpbmVfbWF4X251bWJlciAgICAgICAgICAgKi8gIm51bWJlciBvZiBob3N0IHRocmVhZHMgZG9pbmcgb2ZmbG9hZCBleGNlZWRzIG1heGltdW0gb2YgJWQiLAorCS8qIDE0OCBtc2dfY19yYW5nZXNfZG9udF9tYXRjaCAgICAgICAgICAgICAgICAgKi8gInJhbmdlcyBvZiBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGRvbid0IG1hdGNoIHRvZ2V0aGVyIiwKKwkvKiAxNDkgbXNnX2NfZGVzdGluYXRpb25faXNfb3ZlciAgICAgICAgICAgICAgICovICJpbnN1ZmZpY2llbnQgZGVzdGluYXRpb24gbWVtb3J5IHRvIHRyYW5zZmVyIHNvdXJjZSIsCisJLyogMTUwIG1zZ19jX3NsaWNlX29mX25vbmNvbnRfYXJyYXkgICAgICAgICAgICAqLyAiYSBub24tY29udGlndW91cyBzbGljZSBtYXkgYmUgdGFrZW4gb2YgY29udGlndW91cyBhcnJheXMgb25seSIsCisJLyogMTUxIG1zZ19jX3BvaW50ZXJfYXJyYXlfbWlzbWF0Y2ggICAgICAgICAgICAqLyAibnVtYmVyIG9mICVzIGVsZW1lbnRzIGlzIGxlc3MgdGhhbiBkZXNjcmliZWQgYnkgdGhlIHNvdXJjZSIsCit9OwpkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvbWljX2xpYi5mOTAgYi9maW5hbC9vZmZsb2FkL3NyYy9taWNfbGliLmY5MApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzJlNGRlCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvbWljX2xpYi5mOTAKQEAgLTAsMCArMSw0NDEgQEAKKyEKKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIS8vCishLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIS8vCishLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIS8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIS8vCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEKKworCishICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyEgKiBUaGlzIGZpbGUgaXMgaW50ZW5kZWQgdG8gc3VwcG9ydCB0aGUgSW50ZWwocikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlLgorISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCishIGZyZWUgZm9ybSBGb3J0cmFuIHNvdXJjZSAtIHNob3VsZCBiZSBuYW1lZCAuZjkwCishIGxpbmVzIGFyZSBsb25nZXIgdGhhbiA3MiBjaGFyYWN0ZXJzCisKK21vZHVsZSBtaWNfbGliCit1c2UsIGludHJpbnNpYyA6OiBpc29fY19iaW5kaW5nCisKK2ludGVnZXIsIHBhcmFtZXRlcjo6IHRhcmdldF9taWM9MgoraW50ZWdlciwgcGFyYW1ldGVyOjogZGVmYXVsdF90YXJnZXRfdHlwZT10YXJnZXRfbWljCitpbnRlZ2VyLCBwYXJhbWV0ZXI6OiBkZWZhdWx0X3RhcmdldF9udW1iZXI9MAorCitlbnVtLCBiaW5kKEMpCisgICAgZW51bWVyYXRvciA6OiBPRkZMT0FEX1NVQ0NFU1MgID0gMAorICAgIGVudW1lcmF0b3IgOjogT0ZGTE9BRF9ESVNBQkxFRCAgICAgICAgICAhIG9mZmxvYWQgaXMgZGlzYWJsZWQKKyAgICBlbnVtZXJhdG9yIDo6IE9GRkxPQURfVU5BVkFJTEFCTEUgICAgICAgISBjYXJkIGlzIG5vdCBhdmFpbGFibGUKKyAgICBlbnVtZXJhdG9yIDo6IE9GRkxPQURfT1VUX09GX01FTU9SWSAgICAgISBub3QgZW5vdWdoIG1lbW9yeSBvbiBkZXZpY2UKKyAgICBlbnVtZXJhdG9yIDo6IE9GRkxPQURfUFJPQ0VTU19ESUVEICAgICAgISB0YXJnZXQgcHJvY2VzcyBoYXMgZGllZAorICAgIGVudW1lcmF0b3IgOjogT0ZGTE9BRF9FUlJPUiAgICAgICAgICAgICAhIHVuc3BlY2lmaWVkIGVycm9yCitlbmQgZW51bQorCit0eXBlLCBiaW5kIChDKSA6OiBvZmZsb2FkX3N0YXR1cworICAgIGludGVnZXIoa2luZD1jX2ludCkgICAgOjogIHJlc3VsdCAgICAgICAgICA9IE9GRkxPQURfRElTQUJMRUQKKyAgICBpbnRlZ2VyKGtpbmQ9Y19pbnQpICAgIDo6ICBkZXZpY2VfbnVtYmVyICAgPSAtMQorICAgIGludGVnZXIoa2luZD1jX3NpemVfdCkgOjogIGRhdGFfc2VudCAgICAgICA9IDAKKyAgICBpbnRlZ2VyKGtpbmQ9Y19zaXplX3QpIDo6ICBkYXRhX3JlY2VpdmVkICAgPSAwCitlbmQgdHlwZSBvZmZsb2FkX3N0YXR1cworCitpbnRlcmZhY2UKK2Z1bmN0aW9uIG9mZmxvYWRfbnVtYmVyX29mX2RldmljZXMgKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gIl9PZmZsb2FkX251bWJlcl9vZl9kZXZpY2VzIikKKyFkZWMkIGF0dHJpYnV0ZXMgZGVmYXVsdCA6OiBvZmZsb2FkX251bWJlcl9vZl9kZXZpY2VzCisgIGltcG9ydCA6OiBjX2ludAorICBpbnRlZ2VyIChraW5kPWNfaW50KSAgICAgICAgOjogb2ZmbG9hZF9udW1iZXJfb2ZfZGV2aWNlcworIWRlYyQgYXR0cmlidXRlcyBvZmZsb2FkOm1pYyA6OiBvZmZsb2FkX251bWJlcl9vZl9kZXZpY2VzCishZGlyJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiAgb2ZmbG9hZF9udW1iZXJfb2ZfZGV2aWNlcworZW5kIGZ1bmN0aW9uIG9mZmxvYWRfbnVtYmVyX29mX2RldmljZXMKKworZnVuY3Rpb24gb2ZmbG9hZF9zaWduYWxlZCh0YXJnZXRfbnVtYmVyLCBzaWduYWwpICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAiX09mZmxvYWRfc2lnbmFsZWQiKQorIWRlYyQgYXR0cmlidXRlcyBkZWZhdWx0IDo6IG9mZmxvYWRfc2lnbmFsZWQKKyAgaW1wb3J0IDo6IGNfaW50LCBjX2ludDY0X3QKKyAgaW50ZWdlciAoa2luZD1jX2ludCkgOjogb2ZmbG9hZF9zaWduYWxlZAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X251bWJlcgorICBpbnRlZ2VyIChraW5kPWNfaW50NjRfdCksIHZhbHVlIDo6IHNpZ25hbAorIWRlYyQgYXR0cmlidXRlcyBvZmZsb2FkOm1pYyA6OiBvZmZsb2FkX3NpZ25hbGVkCitlbmQgZnVuY3Rpb24gb2ZmbG9hZF9zaWduYWxlZAorCitzdWJyb3V0aW5lIG9mZmxvYWRfcmVwb3J0KHZhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJfT2ZmbG9hZF9yZXBvcnQiKQorIWRlYyQgYXR0cmlidXRlcyBkZWZhdWx0IDo6IG9mZmxvYWRfcmVwb3J0CisgIGltcG9ydCA6OiBjX2ludAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdmFsCishZGVjJCBhdHRyaWJ1dGVzIG9mZmxvYWQ6bWljIDo6IG9mZmxvYWRfcmVwb3J0CitlbmQgc3Vicm91dGluZSBvZmZsb2FkX3JlcG9ydAorCitmdW5jdGlvbiBvZmZsb2FkX2dldF9kZXZpY2VfbnVtYmVyKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJfT2ZmbG9hZF9nZXRfZGV2aWNlX251bWJlciIpCishZGVjJCBhdHRyaWJ1dGVzIGRlZmF1bHQgOjogb2ZmbG9hZF9nZXRfZGV2aWNlX251bWJlcgorICBpbXBvcnQgOjogY19pbnQKKyAgaW50ZWdlciAoa2luZD1jX2ludCkgICAgICAgIDo6IG9mZmxvYWRfZ2V0X2RldmljZV9udW1iZXIKKyFkZWMkIGF0dHJpYnV0ZXMgb2ZmbG9hZDptaWMgOjogb2ZmbG9hZF9nZXRfZGV2aWNlX251bWJlcgorZW5kIGZ1bmN0aW9uIG9mZmxvYWRfZ2V0X2RldmljZV9udW1iZXIKKworZnVuY3Rpb24gb2ZmbG9hZF9nZXRfcGh5c2ljYWxfZGV2aWNlX251bWJlcigpICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAiX09mZmxvYWRfZ2V0X3BoeXNpY2FsX2RldmljZV9udW1iZXIiKQorIWRlYyQgYXR0cmlidXRlcyBkZWZhdWx0IDo6IG9mZmxvYWRfZ2V0X3BoeXNpY2FsX2RldmljZV9udW1iZXIKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpICAgICAgICA6OiBvZmZsb2FkX2dldF9waHlzaWNhbF9kZXZpY2VfbnVtYmVyCishZGVjJCBhdHRyaWJ1dGVzIG9mZmxvYWQ6bWljIDo6IG9mZmxvYWRfZ2V0X3BoeXNpY2FsX2RldmljZV9udW1iZXIKK2VuZCBmdW5jdGlvbiBvZmZsb2FkX2dldF9waHlzaWNhbF9kZXZpY2VfbnVtYmVyCisKKyEgT3Blbk1QIEFQSSB3cmFwcGVycworCitzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHNfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3RocmVhZHMpICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAib21wX3NldF9udW1fdGhyZWFkc190YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCBudW1fdGhyZWFkcworZW5kIHN1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkc190YXJnZXQKKworZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkc190YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlcikgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAib21wX2dldF9tYXhfdGhyZWFkc190YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQKKyAgaW50ZWdlciAoa2luZD1jX2ludCkgICAgICAgIDo6IG9tcF9nZXRfbWF4X3RocmVhZHNfdGFyZ2V0CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHNfdGFyZ2V0CisKK2Z1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyKSAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICBiaW5kIChDLCBuYW1lID0gIm9tcF9nZXRfbnVtX3Byb2NzX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludAorICBpbnRlZ2VyIChraW5kPWNfaW50KSAgICAgICAgOjogb21wX2dldF9udW1fcHJvY3NfdGFyZ2V0CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzX3RhcmdldAorCitzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pY190YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fdGhyZWFkcykgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAib21wX3NldF9keW5hbWljX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIG51bV90aHJlYWRzCitlbmQgc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWNfdGFyZ2V0CisKK2Z1bmN0aW9uIG9tcF9nZXRfZHluYW1pY190YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlcikgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICBiaW5kIChDLCBuYW1lID0gIm9tcF9nZXRfZHluYW1pY190YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQKKyAgaW50ZWdlciAoa2luZD1jX2ludCkgICAgICAgIDo6IG9tcF9nZXRfZHluYW1pY190YXJnZXQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCitlbmQgZnVuY3Rpb24gb21wX2dldF9keW5hbWljX3RhcmdldAorCitzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAib21wX3NldF9uZXN0ZWRfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgbmVzdGVkCitlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZF90YXJnZXQKKworZnVuY3Rpb24gb21wX2dldF9uZXN0ZWRfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIpICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAib21wX2dldF9uZXN0ZWRfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpICAgICAgICA6OiBvbXBfZ2V0X25lc3RlZF90YXJnZXQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCitlbmQgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWRfdGFyZ2V0CisKK3N1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZV90YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBraW5kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gIm9tcF9zZXRfc2NoZWR1bGVfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwga2luZCwgbW9kaWZpZXIKK2VuZCBzdWJyb3V0aW5lIG9tcF9zZXRfc2NoZWR1bGVfdGFyZ2V0CisKK3N1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZV90YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBraW5kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gIm9tcF9nZXRfc2NoZWR1bGVfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50LCBjX2ludHB0cl90CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorICBpbnRlZ2VyIChraW5kPWNfaW50cHRyX3QpLCB2YWx1ZSA6OiBraW5kLCBtb2RpZmllcgorZW5kIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZV90YXJnZXQKKworISBsb2NrIEFQSSBmdW5jdGlvbnMKKworc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2spICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gIm9tcF9pbml0X2xvY2tfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50LCBjX2ludHB0cl90CisgICFkaXIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6ICBvbXBfaW5pdF9sb2NrX3RhcmdldAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKKyAgaW50ZWdlciAoa2luZD1jX2ludHB0cl90KSwgdmFsdWUgOjogbG9jaworZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbG9ja190YXJnZXQKKworc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2spICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gIm9tcF9kZXN0cm95X2xvY2tfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50LCBjX2ludHB0cl90CisgICFkaXIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6ICBvbXBfZGVzdHJveV9sb2NrX3RhcmdldAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKKyAgaW50ZWdlciAoa2luZD1jX2ludHB0cl90KSwgdmFsdWUgOjogbG9jaworZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9ja190YXJnZXQKKworc3Vicm91dGluZSBvbXBfc2V0X2xvY2tfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gIm9tcF9zZXRfbG9ja190YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQsIGNfaW50cHRyX3QKKyAgIWRpciQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogIG9tcF9zZXRfbG9ja190YXJnZXQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCisgIGludGVnZXIgKGtpbmQ9Y19pbnRwdHJfdCksIHZhbHVlIDo6IGxvY2sKK2VuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbG9ja190YXJnZXQKKworc3Vicm91dGluZSBvbXBfdW5zZXRfbG9ja190YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gIm9tcF91bnNldF9sb2NrX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludCwgY19pbnRwdHJfdAorICAhZGlyJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiAgb21wX3Vuc2V0X2xvY2tfdGFyZ2V0CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorICBpbnRlZ2VyIChraW5kPWNfaW50cHRyX3QpLCB2YWx1ZSA6OiBsb2NrCitlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9ja190YXJnZXQKKworZnVuY3Rpb24gb21wX3Rlc3RfbG9ja190YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gIm9tcF90ZXN0X2xvY2tfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50LCBjX2ludHB0cl90CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpICAgICAgICA6OiBvbXBfdGVzdF9sb2NrX3RhcmdldAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKKyAgaW50ZWdlciAoa2luZD1jX2ludHB0cl90KSwgdmFsdWUgOjogbG9jaworZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2tfdGFyZ2V0CisKKyEgbmVzdGVkIGxvY2sgQVBJIGZ1bmN0aW9ucworCitzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9ja190YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAib21wX2luaXRfbmVzdF9sb2NrX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludCwgY19pbnRwdHJfdAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKKyAgaW50ZWdlciAoa2luZD1jX2ludHB0cl90KSwgdmFsdWUgOjogbG9jaworZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrX3RhcmdldAorCitzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9ja190YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrKSAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAib21wX2Rlc3Ryb3lfbmVzdF9sb2NrX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludCwgY19pbnRwdHJfdAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKKyAgaW50ZWdlciAoa2luZD1jX2ludHB0cl90KSwgdmFsdWUgOjogbG9jaworZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrX3RhcmdldAorCitzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2spICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAib21wX3NldF9uZXN0X2xvY2tfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50LCBjX2ludHB0cl90CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorICBpbnRlZ2VyIChraW5kPWNfaW50cHRyX3QpLCB2YWx1ZSA6OiBsb2NrCitlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RfbG9ja190YXJnZXQKKworc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2spICAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gIm9tcF91bnNldF9uZXN0X2xvY2tfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50LCBjX2ludHB0cl90CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorICBpbnRlZ2VyIChraW5kPWNfaW50cHRyX3QpLCB2YWx1ZSA6OiBsb2NrCitlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrX3RhcmdldAorCitmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2tfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAib21wX3Rlc3RfbmVzdF9sb2NrX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludCwgY19pbnRwdHJfdAorICBpbnRlZ2VyIChraW5kPWNfaW50KSAgICAgICAgOjogb21wX3Rlc3RfbmVzdF9sb2NrX3RhcmdldAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKKyAgaW50ZWdlciAoa2luZD1jX2ludHB0cl90KSwgdmFsdWUgOjogbG9jaworZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9ja190YXJnZXQKKworISBrbXAgQVBJIGZ1bmN0aW9ucworCitzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAia21wX3NldF9zdGFja3NpemVfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgc2l6ZQorZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfdGFyZ2V0CisKK2Z1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyKSAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICBiaW5kIChDLCBuYW1lID0gImttcF9nZXRfc3RhY2tzaXplX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludAorICBpbnRlZ2VyIChraW5kPWNfaW50KSAgICAgICAgOjoga21wX2dldF9zdGFja3NpemVfdGFyZ2V0CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3RhcmdldAorCitzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3NfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAia21wX3NldF9zdGFja3NpemVfc190YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCBzaXplCitlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zX3RhcmdldAorCitmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyKSAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJrbXBfZ2V0X3N0YWNrc2l6ZV9zX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludAorICBpbnRlZ2VyIChraW5kPWNfaW50KSAgICAgICAgOjoga21wX2dldF9zdGFja3NpemVfc190YXJnZXQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCitlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfc190YXJnZXQKKworc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZV90YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gImttcF9zZXRfYmxvY2t0aW1lX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIHRpbWUKK2VuZCBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lX3RhcmdldAorCitmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZV90YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlcikgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJrbXBfZ2V0X2Jsb2NrdGltZV90YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQKKyAgaW50ZWdlciAoa2luZD1jX2ludCkgICAgICAgIDo6IGttcF9nZXRfYmxvY2t0aW1lX3RhcmdldAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKK2VuZCBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZV90YXJnZXQKKworc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyKSAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJrbXBfc2V0X2xpYnJhcnlfc2VyaWFsX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKK2VuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWxfdGFyZ2V0CisKK3N1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIpICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAia21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfdGFyZ2V0CisKK3N1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXRfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIpICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAia21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXRfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXRfdGFyZ2V0CisKK3N1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJrbXBfc2V0X2xpYnJhcnlfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgbW9kZQorZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3RhcmdldAorCitmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnlfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIpICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJrbXBfZ2V0X2xpYnJhcnlfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpICAgICAgICA6OiBrbXBfZ2V0X2xpYnJhcnlfdGFyZ2V0CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorZW5kIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeV90YXJnZXQKKworc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRzKSAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gImttcF9zZXRfZGVmYXVsdHNfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50LCBjX2NoYXIKKyBjaGFyYWN0ZXIgKGtpbmQ9Y19jaGFyKSA6OiBkZWZhdWx0cygqKQorIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorZW5kIHN1YnJvdXRpbmUga21wX3NldF9kZWZhdWx0c190YXJnZXQKKworISBhZmZpbml0eSBBUEkgZnVuY3Rpb25zCisKK3N1YnJvdXRpbmUga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2spICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJrbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50LCBjX2ludHB0cl90CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorICBpbnRlZ2VyIChraW5kPWNfaW50cHRyX3QpLCB2YWx1ZSA6OiBtYXNrCitlbmQgc3Vicm91dGluZSBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfdGFyZ2V0CisKK3N1YnJvdXRpbmUga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza190YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrKSAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludCwgY19pbnRwdHJfdAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKKyAgaW50ZWdlciAoa2luZD1jX2ludHB0cl90KSwgdmFsdWUgOjogbWFzaworZW5kIHN1YnJvdXRpbmUga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza190YXJnZXQKKworZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV90YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gImttcF9zZXRfYWZmaW5pdHlfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50LCBjX2ludHB0cl90CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpICAgICAgICA6OiBrbXBfc2V0X2FmZmluaXR5X3RhcmdldAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKKyAgaW50ZWdlciAoa2luZD1jX2ludHB0cl90KSwgdmFsdWUgOjogbWFzaworZW5kIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfdGFyZ2V0CisKK2Z1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJrbXBfZ2V0X2FmZmluaXR5X3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludCwgY19pbnRwdHJfdAorICBpbnRlZ2VyIChraW5kPWNfaW50KSAgICAgICAgOjoga21wX2dldF9hZmZpbml0eV90YXJnZXQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCisgIGludGVnZXIgKGtpbmQ9Y19pbnRwdHJfdCksIHZhbHVlIDo6IG1hc2sKK2VuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X3RhcmdldAorCitmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyKSAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gImttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2NfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpICAgICAgICA6OiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jX3RhcmdldAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKK2VuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jX3RhcmdldAorCitmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jLCAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2spICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQsIGNfaW50cHRyX3QKKyAgaW50ZWdlciAoa2luZD1jX2ludCkgICAgICAgIDo6IGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIHByb2MKKyAgaW50ZWdlciAoa2luZD1jX2ludHB0cl90KSwgdmFsdWUgOjogbWFzaworZW5kIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldAorCitmdW5jdGlvbiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2MsICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzaykgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludCwgY19pbnRwdHJfdAorICBpbnRlZ2VyIChraW5kPWNfaW50KSAgICAgICAgOjoga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCBwcm9jCisgIGludGVnZXIgKGtpbmQ9Y19pbnRwdHJfdCksIHZhbHVlIDo6IG1hc2sKK2VuZCBmdW5jdGlvbiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldAorCitmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jLCAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2spICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQsIGNfaW50cHRyX3QKKyAgaW50ZWdlciAoa2luZD1jX2ludCkgICAgICAgIDo6IGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIHByb2MKKyAgaW50ZWdlciAoa2luZD1jX2ludHB0cl90KSwgdmFsdWUgOjogbWFzaworZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldAorCitlbmQgaW50ZXJmYWNlCitlbmQgbW9kdWxlIG1pY19saWIKZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWQuaCBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODkxNGI3Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZC5oCkBAIC0wLDAgKzEsNDc0IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKy8qCisgKiBJbmNsdWRlIGZpbGUgZm9yIE9mZmxvYWQgQVBJLgorICovCisKKyNpZm5kZWYgT0ZGTE9BRF9IX0lOQ0xVREVECisjZGVmaW5lIE9GRkxPQURfSF9JTkNMVURFRAorCisjaWYgZGVmaW5lZChMSU5VWCkgfHwgZGVmaW5lZChGUkVFQlNEKQorI2luY2x1ZGUgPGJpdHMvZnVuY3RleGNlcHQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8b21wLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBUQVJHRVRfQVRUUklCVVRFIF9fZGVjbHNwZWModGFyZ2V0KG1pYykpCisKKy8qCisgKiAgVGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCisgKi8KK3R5cGVkZWYgZW51bSBUQVJHRVRfVFlQRSB7CisgICAgVEFSR0VUX05PTkUsICAgIC8qIFVuZGVmaW5lIHRhcmdldCAqLworICAgIFRBUkdFVF9IT1NULCAgICAvKiBIb3N0IHVzZWQgYXMgdGFyZ2V0ICovCisgICAgVEFSR0VUX01JQyAgICAgIC8qIE1JQyB0YXJnZXQgKi8KK30gVEFSR0VUX1RZUEU7CisKKy8qCisgKiAgVGhlIGRlZmF1bHQgdGFyZ2V0IHR5cGUuCisgKi8KKyNkZWZpbmUgREVGQVVMVF9UQVJHRVRfVFlQRSBUQVJHRVRfTUlDCisKKy8qCisgKiAgVGhlIGRlZmF1bHQgdGFyZ2V0IG51bWJlci4KKyAqLworI2RlZmluZSBERUZBVUxUX1RBUkdFVF9OVU1CRVIgMAorCisvKgorICogIE9mZmxvYWQgc3RhdHVzLgorICovCit0eXBlZGVmIGVudW0geworICAgIE9GRkxPQURfU1VDQ0VTUyA9IDAsCisgICAgT0ZGTE9BRF9ESVNBQkxFRCwgICAgICAgICAgICAgICAvKiBvZmZsb2FkIGlzIGRpc2FibGVkICovCisgICAgT0ZGTE9BRF9VTkFWQUlMQUJMRSwgICAgICAgICAgICAvKiBjYXJkIGlzIG5vdCBhdmFpbGFibGUgKi8KKyAgICBPRkZMT0FEX09VVF9PRl9NRU1PUlksICAgICAgICAgIC8qIG5vdCBlbm91Z2ggbWVtb3J5IG9uIGRldmljZSAqLworICAgIE9GRkxPQURfUFJPQ0VTU19ESUVELCAgICAgICAgICAgLyogdGFyZ2V0IHByb2Nlc3MgaGFzIGRpZWQgKi8KKyAgICBPRkZMT0FEX0VSUk9SICAgICAgICAgICAgICAgICAgIC8qIHVuc3BlY2lmaWVkIGVycm9yICovCit9IF9PZmZsb2FkX3Jlc3VsdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIF9PZmZsb2FkX3Jlc3VsdCByZXN1bHQ7ICAgICAgICAgLyogcmVzdWx0LCBzZWUgYWJvdmUgKi8KKyAgICBpbnQgICAgICAgICAgICAgZGV2aWNlX251bWJlcjsgIC8qIGRldmljZSBudW1iZXIgKi8KKyAgICBzaXplX3QgICAgICAgICAgZGF0YV9zZW50OyAgICAgIC8qIG51bWJlciBvZiBieXRlcyBzZW50IHRvIHRoZSB0YXJnZXQgKi8KKyAgICBzaXplX3QgICAgICAgICAgZGF0YV9yZWNlaXZlZDsgIC8qIG51bWJlciBvZiBieXRlcyByZWNlaXZlZCBieSBob3N0ICovCit9IF9PZmZsb2FkX3N0YXR1czsKKworI2RlZmluZSBPRkZMT0FEX1NUQVRVU19JTklUKHgpIFwKKyAgICAoKHgpLnJlc3VsdCA9IE9GRkxPQURfRElTQUJMRUQpCisKKyNkZWZpbmUgT0ZGTE9BRF9TVEFUVVNfSU5JVElBTElaRVIgXAorICAgIHsgT0ZGTE9BRF9ESVNBQkxFRCwgLTEsIDAsIDAgfQorCisvKiBPZmZsb2FkIHJ1bnRpbWUgaW50ZXJmYWNlcyAqLworCitleHRlcm4gaW50IF9PZmZsb2FkX251bWJlcl9vZl9kZXZpY2VzKHZvaWQpOworZXh0ZXJuIGludCBfT2ZmbG9hZF9nZXRfZGV2aWNlX251bWJlcih2b2lkKTsKK2V4dGVybiBpbnQgX09mZmxvYWRfZ2V0X3BoeXNpY2FsX2RldmljZV9udW1iZXIodm9pZCk7CisKK2V4dGVybiB2b2lkKiBfT2ZmbG9hZF9zaGFyZWRfbWFsbG9jKHNpemVfdCBzaXplKTsKK2V4dGVybiB2b2lkICBfT2ZmbG9hZF9zaGFyZWRfZnJlZSh2b2lkICpwdHIpOworCitleHRlcm4gdm9pZCogX09mZmxvYWRfc2hhcmVkX2FsaWduZWRfbWFsbG9jKHNpemVfdCBzaXplLCBzaXplX3QgYWxpZ24pOworZXh0ZXJuIHZvaWQgIF9PZmZsb2FkX3NoYXJlZF9hbGlnbmVkX2ZyZWUodm9pZCAqcHRyKTsKKworZXh0ZXJuIGludCBfT2ZmbG9hZF9zaWduYWxlZChpbnQgaW5kZXgsIHZvaWQgKnNpZ25hbCk7CitleHRlcm4gdm9pZCBfT2ZmbG9hZF9yZXBvcnQoaW50IHZhbCk7CisKKy8qIE9wZW5NUCBBUEkgKi8KKworZXh0ZXJuIHZvaWQgb21wX3NldF9kZWZhdWx0X2RldmljZShpbnQgbnVtKTsKK2V4dGVybiBpbnQgIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2Uodm9pZCk7CitleHRlcm4gaW50ICBvbXBfZ2V0X251bV9kZXZpY2VzKHZvaWQpOworCisvKiBPcGVuTVAgQVBJIHdyYXBwZXJzICovCisKKy8qIFNldCBudW1fdGhyZWFkcyBvbiB0YXJnZXQgKi8KK2V4dGVybiB2b2lkIG9tcF9zZXRfbnVtX3RocmVhZHNfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBudW1fdGhyZWFkcworKTsKKworLyogR2V0IG1heF90aHJlYWRzIGZyb20gdGFyZ2V0ICovCitleHRlcm4gaW50IG9tcF9nZXRfbWF4X3RocmVhZHNfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispOworCisvKiBHZXQgbnVtX3Byb2NzIGZyb20gdGFyZ2V0ICovCitleHRlcm4gaW50IG9tcF9nZXRfbnVtX3Byb2NzX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKTsKKworLyogU2V0IGR5bmFtaWMgb24gdGFyZ2V0ICovCitleHRlcm4gdm9pZCBvbXBfc2V0X2R5bmFtaWNfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBudW1fdGhyZWFkcworKTsKKworLyogR2V0IGR5bmFtaWMgZnJvbSB0YXJnZXQgKi8KK2V4dGVybiBpbnQgb21wX2dldF9keW5hbWljX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKTsKKworLyogU2V0IG5lc3RlZCBvbiB0YXJnZXQgKi8KK2V4dGVybiB2b2lkIG9tcF9zZXRfbmVzdGVkX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgbmVzdGVkCispOworCisvKiBHZXQgbmVzdGVkIGZyb20gdGFyZ2V0ICovCitleHRlcm4gaW50IG9tcF9nZXRfbmVzdGVkX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKTsKKworZXh0ZXJuIHZvaWQgb21wX3NldF9udW1fdGhyZWFkc190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IG51bV90aHJlYWRzCispOworCitleHRlcm4gaW50IG9tcF9nZXRfbWF4X3RocmVhZHNfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispOworCitleHRlcm4gaW50IG9tcF9nZXRfbnVtX3Byb2NzX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKTsKKworZXh0ZXJuIHZvaWQgb21wX3NldF9keW5hbWljX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgbnVtX3RocmVhZHMKKyk7CisKK2V4dGVybiBpbnQgb21wX2dldF9keW5hbWljX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKTsKKworZXh0ZXJuIHZvaWQgb21wX3NldF9uZXN0ZWRfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBudW1fdGhyZWFkcworKTsKKworZXh0ZXJuIGludCBvbXBfZ2V0X25lc3RlZF90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKyk7CisKK2V4dGVybiB2b2lkIG9tcF9zZXRfc2NoZWR1bGVfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9zY2hlZF90IGtpbmQsCisgICAgaW50IG1vZGlmaWVyCispOworCitleHRlcm4gdm9pZCBvbXBfZ2V0X3NjaGVkdWxlX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfc2NoZWRfdCAqa2luZCwKKyAgICBpbnQgKm1vZGlmaWVyCispOworCisvKiBsb2NrIEFQSSBmdW5jdGlvbnMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIG9tcF9sb2NrX3QgbG9jazsKK30gb21wX2xvY2tfdGFyZ2V0X3Q7CisKK2V4dGVybiB2b2lkIG9tcF9pbml0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9sb2NrX3RhcmdldF90ICpsb2NrCispOworCitleHRlcm4gdm9pZCBvbXBfZGVzdHJveV9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbG9ja190YXJnZXRfdCAqbG9jaworKTsKKworZXh0ZXJuIHZvaWQgb21wX3NldF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbG9ja190YXJnZXRfdCAqbG9jaworKTsKKworZXh0ZXJuIHZvaWQgb21wX3Vuc2V0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9sb2NrX3RhcmdldF90ICpsb2NrCispOworCitleHRlcm4gaW50IG9tcF90ZXN0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9sb2NrX3RhcmdldF90ICpsb2NrCispOworCisvKiBuZXN0ZWQgbG9jayBBUEkgZnVuY3Rpb25zICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBvbXBfbmVzdF9sb2NrX3QgbG9jazsKK30gb21wX25lc3RfbG9ja190YXJnZXRfdDsKKworZXh0ZXJuIHZvaWQgb21wX2luaXRfbmVzdF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbmVzdF9sb2NrX3RhcmdldF90ICpsb2NrCispOworCitleHRlcm4gdm9pZCBvbXBfZGVzdHJveV9uZXN0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9uZXN0X2xvY2tfdGFyZ2V0X3QgKmxvY2sKKyk7CisKK2V4dGVybiB2b2lkIG9tcF9zZXRfbmVzdF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbmVzdF9sb2NrX3RhcmdldF90ICpsb2NrCispOworCitleHRlcm4gdm9pZCBvbXBfdW5zZXRfbmVzdF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbmVzdF9sb2NrX3RhcmdldF90ICpsb2NrCispOworCitleHRlcm4gaW50IG9tcF90ZXN0X25lc3RfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX25lc3RfbG9ja190YXJnZXRfdCAqbG9jaworKTsKKworLyoga21wIEFQSSBmdW5jdGlvbnMgKi8KKworZXh0ZXJuIHZvaWQga21wX3NldF9zdGFja3NpemVfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBzaXplCispOworCitleHRlcm4gaW50IGttcF9nZXRfc3RhY2tzaXplX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKTsKKworZXh0ZXJuIHZvaWQga21wX3NldF9zdGFja3NpemVfc190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgc2l6ZV90IHNpemUKKyk7CisKK2V4dGVybiBzaXplX3Qga21wX2dldF9zdGFja3NpemVfc190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKyk7CisKK2V4dGVybiB2b2lkIGttcF9zZXRfYmxvY2t0aW1lX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgdGltZQorKTsKKworZXh0ZXJuIGludCBrbXBfZ2V0X2Jsb2NrdGltZV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKyk7CisKK2V4dGVybiB2b2lkIGttcF9zZXRfbGlicmFyeV9zZXJpYWxfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispOworCitleHRlcm4gdm9pZCBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZF90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKyk7CisKK2V4dGVybiB2b2lkIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0X3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKTsKKworZXh0ZXJuIHZvaWQga21wX3NldF9saWJyYXJ5X3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgbW9kZQorKTsKKworZXh0ZXJuIGludCBrbXBfZ2V0X2xpYnJhcnlfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispOworCitleHRlcm4gdm9pZCBrbXBfc2V0X2RlZmF1bHRzX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBjaGFyIGNvbnN0ICpkZWZhdWx0cworKTsKKworLyogYWZmaW5pdHkgQVBJIGZ1bmN0aW9ucyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAga21wX2FmZmluaXR5X21hc2tfdCBtYXNrOworfSBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdDsKKworZXh0ZXJuIHZvaWQga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCAqbWFzaworKTsKKworZXh0ZXJuIHZvaWQga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgKm1hc2sKKyk7CisKK2V4dGVybiBpbnQga21wX3NldF9hZmZpbml0eV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgKm1hc2sKKyk7CisKK2V4dGVybiBpbnQga21wX2dldF9hZmZpbml0eV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgKm1hc2sKKyk7CisKK2V4dGVybiBpbnQga21wX2dldF9hZmZpbml0eV9tYXhfcHJvY190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKyk7CisKK2V4dGVybiBpbnQga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBwcm9jLAorICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90ICptYXNrCispOworCitleHRlcm4gaW50IGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBwcm9jLAorICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90ICptYXNrCispOworCitleHRlcm4gaW50IGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgcHJvYywKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCAqbWFzaworKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIGV4dGVybiAiQyIgKi8KKworLyogTmFtZXNwYWNlIGZvciB0aGUgc2hhcmVkX2FsbG9jYXRvci4gKi8KK25hbWVzcGFjZSBfX29mZmxvYWQgeworICAvKiBUaGlzIGZvbGxvd3MgdGhlIHNwZWNpZmljYXRpb24gZm9yIHN0ZDo6YWxsb2NhdG9yLiAqLworICAvKiBGb3J3YXJkIGRlY2xhcmF0aW9uIG9mIHRoZSBjbGFzcyB0ZW1wbGF0ZS4gKi8KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIGNsYXNzIHNoYXJlZF9hbGxvY2F0b3I7CisKKyAgLyogU3BlY2lhbGl6YXRpb24gZm9yIHNoYXJlZF9hbGxvY2F0b3I8dm9pZD4uICovCisgIHRlbXBsYXRlIDw+CisgIGNsYXNzIHNoYXJlZF9hbGxvY2F0b3I8dm9pZD4geworICBwdWJsaWM6CisgICAgdHlwZWRlZiB2b2lkICAgICAgICpwb2ludGVyOworICAgIHR5cGVkZWYgY29uc3Qgdm9pZCAqY29uc3RfcG9pbnRlcjsKKyAgICB0eXBlZGVmIHZvaWQgICAgICAgIHZhbHVlX3R5cGU7CisgICAgdGVtcGxhdGUgPGNsYXNzIFU+IHN0cnVjdCByZWJpbmQgeyB0eXBlZGVmIHNoYXJlZF9hbGxvY2F0b3I8VT4gb3RoZXI7IH07CisgIH07CisKKyAgLyogRGVmaW5pdGlvbiBvZiBzaGFyZWRfYWxsb2NhdG9yPFQ+LiAqLworICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgY2xhc3Mgc2hhcmVkX2FsbG9jYXRvciB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIHNpemVfdCAgICAgc2l6ZV90eXBlOworICAgIHR5cGVkZWYgcHRyZGlmZl90ICBkaWZmZXJlbmNlX3R5cGU7CisgICAgdHlwZWRlZiBUICAgICAgICAgKnBvaW50ZXI7CisgICAgdHlwZWRlZiBjb25zdCBUICAgKmNvbnN0X3BvaW50ZXI7CisgICAgdHlwZWRlZiBUICAgICAgICAgJnJlZmVyZW5jZTsKKyAgICB0eXBlZGVmIGNvbnN0IFQgICAmY29uc3RfcmVmZXJlbmNlOworICAgIHR5cGVkZWYgVCAgICAgICAgICB2YWx1ZV90eXBlOworICAgIHRlbXBsYXRlIDxjbGFzcyBVPiBzdHJ1Y3QgcmViaW5kIHsgdHlwZWRlZiBzaGFyZWRfYWxsb2NhdG9yPFU+IG90aGVyOyB9OworICAgIHNoYXJlZF9hbGxvY2F0b3IoKSB0aHJvdygpIHsgfQorICAgIHNoYXJlZF9hbGxvY2F0b3IoY29uc3Qgc2hhcmVkX2FsbG9jYXRvciYpIHRocm93KCkgeyB9CisgICAgdGVtcGxhdGUgPGNsYXNzIFU+IHNoYXJlZF9hbGxvY2F0b3IoY29uc3Qgc2hhcmVkX2FsbG9jYXRvcjxVPiYpIHRocm93KCkgeyB9CisgICAgfnNoYXJlZF9hbGxvY2F0b3IoKSB0aHJvdygpIHsgfQorICAgIHBvaW50ZXIgYWRkcmVzcyhyZWZlcmVuY2UgeCkgY29uc3QgeyByZXR1cm4gJng7IH0KKyAgICBjb25zdF9wb2ludGVyIGFkZHJlc3MoY29uc3RfcmVmZXJlbmNlIHgpIGNvbnN0IHsgcmV0dXJuICZ4OyB9CisgICAgcG9pbnRlciBhbGxvY2F0ZSgKKyAgICAgIHNpemVfdHlwZSwgc2hhcmVkX2FsbG9jYXRvcjx2b2lkPjo6Y29uc3RfcG9pbnRlciBoaW50ID0gMCk7CisgICAgdm9pZCBkZWFsbG9jYXRlKHBvaW50ZXIgcCwgc2l6ZV90eXBlIG4pOworICAgIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IHRocm93KCkgeworICAgICAgcmV0dXJuIHNpemVfdHlwZSgtMSkvc2l6ZW9mKFQpOworICAgIH0gLyogbWF4X3NpemUgKi8KKyAgICB2b2lkIGNvbnN0cnVjdChwb2ludGVyIHAsIGNvbnN0IFQmIGFyZykgeworICAgICAgOjpuZXcgKHApIFQoYXJnKTsKKyAgICB9IC8qIGNvbnN0cnVjdCAqLworICAgIHZvaWQgZGVzdHJveShwb2ludGVyIHApIHsKKyAgICAgIHAtPn5UKCk7CisgICAgfSAvKiBkZXN0cm95ICovCisgIH07CisKKyAgLyogRGVmaW5pdGlvbiBmb3IgYWxsb2NhdGUuICovCisgIHRlbXBsYXRlIDxjbGFzcyBUPgorICB0eXBlbmFtZSBzaGFyZWRfYWxsb2NhdG9yPFQ+Ojpwb2ludGVyCisgIHNoYXJlZF9hbGxvY2F0b3I8VD46OmFsbG9jYXRlKHNoYXJlZF9hbGxvY2F0b3I8VD46OnNpemVfdHlwZSBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfYWxsb2NhdG9yPHZvaWQ+Ojpjb25zdF9wb2ludGVyKSB7CisgICAgLyogQWxsb2NhdGUgZnJvbSBzaGFyZWQgbWVtb3J5LiAqLworICAgIHZvaWQgKnB0ciA9IF9PZmZsb2FkX3NoYXJlZF9tYWxsb2MocypzaXplb2YoVCkpOworICAgIGlmIChwdHIgPT0gMCkgc3RkOjpfX3Rocm93X2JhZF9hbGxvYygpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxwb2ludGVyPihwdHIpOworICB9IC8qIGFsbG9jYXRlICovCisKKyAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgIHZvaWQgc2hhcmVkX2FsbG9jYXRvcjxUPjo6ZGVhbGxvY2F0ZShwb2ludGVyIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfYWxsb2NhdG9yPFQ+OjpzaXplX3R5cGUpIHsKKyAgICAvKiBGcmVlIHRoZSBzaGFyZWQgbWVtb3J5LiAqLworICAgIF9PZmZsb2FkX3NoYXJlZF9mcmVlKHApOworICB9IC8qIGRlYWxsb2NhdGUgKi8KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1QxLCB0eXBlbmFtZSBfVDI+CisgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3Qgc2hhcmVkX2FsbG9jYXRvcjxfVDE+ICYsIAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9hbGxvY2F0b3I8X1QyPiAmKSB0aHJvdygpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSAgLyogb3BlcmF0b3I9PSAqLworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9UMj4KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBzaGFyZWRfYWxsb2NhdG9yPF9UMT4gJiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX2FsbG9jYXRvcjxfVDI+ICYpIHRocm93KCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfSAgLyogb3BlcmF0b3IhPSAqLworfSAgLyogX19vZmZsb2FkICovCisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmIC8qIE9GRkxPQURfSF9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9jb21tb24uY3BwIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9jb21tb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ODFiMDYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX2NvbW1vbi5jcHAKQEAgLTAsMCArMSwxNzAgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmIGRlZmluZWQoTElOVVgpIHx8IGRlZmluZWQoRlJFRUJTRCkKKyNpbmNsdWRlIDxtbV9tYWxsb2MuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAib2ZmbG9hZF9jb21tb24uaCIKKworLy8gVGhlIGRlYnVnIHJvdXRpbmVzCisKKyNpZiBPRkZMT0FEX0RFQlVHID4gMAorCit2b2lkIF9fZHVtcF9ieXRlcygKKyAgICBpbnQgdHJhY2VfbGV2ZWwsCisgICAgY29uc3Qgdm9pZCAqZGF0YSwKKyAgICBpbnQgbGVuCispCit7CisgICAgaWYgKGNvbnNvbGVfZW5hYmxlZCA+IHRyYWNlX2xldmVsKSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmFyciA9IChjb25zdCB1aW50OF90KikgZGF0YTsKKyAgICAgICAgY2hhciBidWZmZXJbNDA5Nl07CisgICAgICAgIGNoYXIgKmJ1ZmZlcnA7CisgICAgICAgIGludCBjb3VudCA9IDA7CisKKyAgICAgICAgYnVmZmVycCA9IGJ1ZmZlcjsKKyAgICAgICAgd2hpbGUgKGxlbi0tKSB7CisgICAgICAgICAgICBzcHJpbnRmKGJ1ZmZlcnAsICIlMDJ4IiwgKmFycisrKTsKKyAgICAgICAgICAgIGJ1ZmZlcnAgKz0gMjsKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICBpZiAoKGNvdW50JjMpID09IDApIHsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKGJ1ZmZlcnAsICIgIik7CisgICAgICAgICAgICAgICAgYnVmZmVycCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChjb3VudCY2MykgPT0gMCkgeworICAgICAgICAgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UodHJhY2VfbGV2ZWwsICIlc1xuIiwgYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBidWZmZXJwID0gYnVmZmVyOworICAgICAgICAgICAgICAgIGNvdW50ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY291bnQpIHsKKyAgICAgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UodHJhY2VfbGV2ZWwsICIlc1xuIiwgYnVmZmVyKTsKKyAgICAgICAgfQorICAgIH0KK30KKyNlbmRpZiAvLyBPRkZMT0FEX0RFQlVHCisKKy8vIFRoZSBNYXJzaGFsbGVyIGFuZCBhc3NvY2lhdGVkIHJvdXRpbmVzCisKK3ZvaWQgTWFyc2hhbGxlcjo6c2VuZF9kYXRhKAorICAgIGNvbnN0IHZvaWQgKmRhdGEsCisgICAgaW50NjRfdCBsZW5ndGgKKykKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJzZW5kX2RhdGEoJXAsICVsbGQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgbGVuZ3RoKTsKKyAgICBtZW1jcHkoYnVmZmVyX3B0ciwgZGF0YSwgKHNpemVfdClsZW5ndGgpOworICAgIGJ1ZmZlcl9wdHIgKz0gbGVuZ3RoOworICAgIHRmcl9zaXplICs9IGxlbmd0aDsKK30KKwordm9pZCBNYXJzaGFsbGVyOjpyZWNlaXZlX2RhdGEoCisgICAgdm9pZCAqZGF0YSwKKyAgICBpbnQ2NF90IGxlbmd0aAorKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgInJlY2VpdmVfZGF0YSglcCwgJWxsZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLCBsZW5ndGgpOworICAgIG1lbWNweShkYXRhLCBidWZmZXJfcHRyLCAoc2l6ZV90KWxlbmd0aCk7CisgICAgYnVmZmVyX3B0ciArPSBsZW5ndGg7CisgICAgdGZyX3NpemUgKz0gbGVuZ3RoOworfQorCisvLyBTZW5kIGZ1bmN0aW9uIHBvaW50ZXIKK3ZvaWQgTWFyc2hhbGxlcjo6c2VuZF9mdW5jX3B0cigKKyAgICBjb25zdCB2b2lkKiBkYXRhCispCit7CisgICAgY29uc3QgY2hhciogbmFtZTsKKyAgICBzaXplX3QgICAgICBsZW5ndGg7CisKKyAgICBpZiAoZGF0YSAhPSAwKSB7CisgICAgICAgIG5hbWUgPSBfX29mZmxvYWRfZnVuY3MuZmluZF9uYW1lKGRhdGEpOworICAgICAgICBpZiAobmFtZSA9PSAwKSB7CisjaWYgT0ZGTE9BRF9ERUJVRyA+IDAKKyAgICAgICAgICAgIGlmIChjb25zb2xlX2VuYWJsZWQgPiAyKSB7CisgICAgICAgICAgICAgICAgX19vZmZsb2FkX2Z1bmNzLmR1bXAoKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBPRkZMT0FEX0RFQlVHID4gMAorCisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfc2VuZF9mdW5jX3B0ciwgZGF0YSk7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgICAgIGxlbmd0aCA9IHN0cmxlbihuYW1lKSArIDE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBuYW1lID0gIiI7CisgICAgICAgIGxlbmd0aCA9IDE7CisgICAgfQorCisgICAgbWVtY3B5KGJ1ZmZlcl9wdHIsIG5hbWUsIGxlbmd0aCk7CisgICAgYnVmZmVyX3B0ciArPSBsZW5ndGg7CisgICAgdGZyX3NpemUgKz0gbGVuZ3RoOworfQorCisvLyBSZWNlaXZlIGZ1bmN0aW9uIHBvaW50ZXIKK3ZvaWQgTWFyc2hhbGxlcjo6cmVjZWl2ZV9mdW5jX3B0cigKKyAgICBjb25zdCB2b2lkKiogZGF0YQorKQoreworICAgIGNvbnN0IGNoYXIqIG5hbWU7CisgICAgc2l6ZV90ICAgICAgbGVuZ3RoOworCisgICAgbmFtZSA9IChjb25zdCBjaGFyKikgYnVmZmVyX3B0cjsKKyAgICBpZiAobmFtZVswXSAhPSAnXDAnKSB7CisgICAgICAgICpkYXRhID0gX19vZmZsb2FkX2Z1bmNzLmZpbmRfYWRkcihuYW1lKTsKKyAgICAgICAgaWYgKCpkYXRhID09IDApIHsKKyNpZiBPRkZMT0FEX0RFQlVHID4gMAorICAgICAgICAgICAgaWYgKGNvbnNvbGVfZW5hYmxlZCA+IDIpIHsKKyAgICAgICAgICAgICAgICBfX29mZmxvYWRfZnVuY3MuZHVtcCgpOworICAgICAgICAgICAgfQorI2VuZGlmIC8vIE9GRkxPQURfREVCVUcgPiAwCisKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19yZWNlaXZlX2Z1bmNfcHRyLCBuYW1lKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICAgICAgbGVuZ3RoID0gc3RybGVuKG5hbWUpICsgMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICpkYXRhID0gMDsKKyAgICAgICAgbGVuZ3RoID0gMTsKKyAgICB9CisKKyAgICBidWZmZXJfcHRyICs9IGxlbmd0aDsKKyAgICB0ZnJfc2l6ZSArPSBsZW5ndGg7Cit9CisKKy8vIEVuZCBvZiB0aGUgTWFyc2hhbGxlciBhbmQgYXNzb2NpYXRlZCByb3V0aW5lcworCitleHRlcm4gdm9pZCAqT0ZGTE9BRF9NQUxMT0MoCisgICAgc2l6ZV90IHNpemUsCisgICAgc2l6ZV90IGFsaWduCispCit7CisgICAgdm9pZCAqcHRyOworICAgIGludCAgIGVycjsKKworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIiVzKCVsbGQsICVsbGQpXG4iLCBfX2Z1bmNfXywgc2l6ZSwgYWxpZ24pOworCisgICAgaWYgKGFsaWduIDwgc2l6ZW9mKHZvaWQqKSkgeworICAgICAgICBhbGlnbiA9IHNpemVvZih2b2lkKik7CisgICAgfQorCisgICAgcHRyID0gX21tX21hbGxvYyhzaXplLCBhbGlnbik7CisgICAgaWYgKHB0ciA9PSBOVUxMKSB7CisgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19vZmZsb2FkX21hbGxvYywgc2l6ZSwgYWxpZ24pOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIiVzIHJldHVybmVkICVwXG4iLCBfX2Z1bmNfXywgcHRyKTsKKworICAgIHJldHVybiBwdHI7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX2NvbW1vbi5oIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWNiOGJiCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9jb21tb24uaApAQCAtMCwwICsxLDQ0NCBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisvKiEgXGZpbGUKKyAgICBcYnJpZWYgVGhlIHBhcnRzIG9mIHRoZSBydW50aW1lIGxpYnJhcnkgY29tbW9uIHRvIGhvc3QgYW5kIHRhcmdldAorKi8KKworI2lmbmRlZiBPRkZMT0FEX0NPTU1PTl9IX0lOQ0xVREVECisjZGVmaW5lIE9GRkxPQURfQ09NTU9OX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWVtb3J5Lmg+CisKKyNpbmNsdWRlICJvZmZsb2FkLmgiCisjaW5jbHVkZSAib2ZmbG9hZF90YWJsZS5oIgorI2luY2x1ZGUgIm9mZmxvYWRfdHJhY2UuaCIKKyNpbmNsdWRlICJvZmZsb2FkX3RpbWVyLmgiCisjaW5jbHVkZSAib2ZmbG9hZF91dGlsLmgiCisjaW5jbHVkZSAiY2Vhbl91dGlsLmgiCisjaW5jbHVkZSAiZHZfdXRpbC5oIgorI2luY2x1ZGUgImxpYm9mZmxvYWRfZXJyb3JfY29kZXMuaCIKKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisvLyBUaGUgZGVidWcgcm91dGluZXMKKworLy8gSG9zdCBjb25zb2xlIGFuZCBmaWxlIGxvZ2dpbmcKK2V4dGVybiBpbnQgY29uc29sZV9lbmFibGVkOworZXh0ZXJuIGludCBvZmZsb2FkX3JlcG9ydF9sZXZlbDsKKworI2RlZmluZSBPRkZMT0FEX0RPX1RSQUNFIChvZmZsb2FkX3JlcG9ydF9sZXZlbCA9PSAzKQorCitleHRlcm4gY29uc3QgY2hhciAqcHJlZml4OworZXh0ZXJuIGludCBvZmZsb2FkX251bWJlcjsKKyNpZiAhSE9TVF9MSUJSQVJZCitleHRlcm4gaW50IG1pY19pbmRleDsKKyNlbmRpZgorCisjaWYgSE9TVF9MSUJSQVJZCit2b2lkIE9mZmxvYWRfUmVwb3J0X1Byb2xvZyhPZmZsb2FkSG9zdFRpbWVyRGF0YSogdGltZXJfZGF0YSk7Cit2b2lkIE9mZmxvYWRfUmVwb3J0X0VwaWxvZyhPZmZsb2FkSG9zdFRpbWVyRGF0YSogdGltZXJfZGF0YSk7Cit2b2lkIG9mZmxvYWRfcmVwb3J0X2ZyZWVfZGF0YShPZmZsb2FkSG9zdFRpbWVyRGF0YSAqIHRpbWVyX2RhdGEpOwordm9pZCBPZmZsb2FkX1RpbWVyX1ByaW50KHZvaWQpOworCisjaWZuZGVmIFRBUkdFVF9XSU5OVAorI2RlZmluZSBPRkZMT0FEX0RFQlVHX0lOQ1JfT0ZMRF9OVU0oKSBcCisgICAgICAgIF9fc3luY19hZGRfYW5kX2ZldGNoKCZvZmZsb2FkX251bWJlciwgMSkKKyNlbHNlCisjZGVmaW5lIE9GRkxPQURfREVCVUdfSU5DUl9PRkxEX05VTSgpIFwKKyAgICAgICAgX0ludGVybG9ja2VkSW5jcmVtZW50KHJlaW50ZXJwcmV0X2Nhc3Q8bG9uZyo+KCZvZmZsb2FkX251bWJlcikpCisjZW5kaWYKKworI2RlZmluZSBPRkZMT0FEX0RFQlVHX1BSSU5UX1RBR19QUkVGSVgoKSBcCisgICAgICAgIHByaW50ZigiJXM6ICAiLCBwcmVmaXgpOworCisjZGVmaW5lIE9GRkxPQURfREVCVUdfUFJJTlRfUFJFRklYKCkgXAorICAgICAgICBwcmludGYoIiVzOiAgIiwgcHJlZml4KTsKKyNlbHNlCisjZGVmaW5lIE9GRkxPQURfREVCVUdfUFJJTlRfUFJFRklYKCkgXAorICAgICAgICBwcmludGYoIiVzJWQ6ICAiLCBwcmVmaXgsIG1pY19pbmRleCk7CisjZW5kaWYgLy8gSE9TVF9MSUJSQVJZCisKKyNkZWZpbmUgT0ZGTE9BRF9UUkFDRSh0cmFjZV9sZXZlbCwgLi4uKSAgXAorICAgIGlmIChjb25zb2xlX2VuYWJsZWQgPj0gdHJhY2VfbGV2ZWwpIHsgXAorICAgICAgICBPRkZMT0FEX0RFQlVHX1BSSU5UX1BSRUZJWCgpOyBcCisgICAgICAgIHByaW50ZihfX1ZBX0FSR1NfXyk7IFwKKyAgICAgICAgZmZsdXNoKE5VTEwpOyBcCisgICAgfQorCisjaWYgT0ZGTE9BRF9ERUJVRyA+IDAKKworI2RlZmluZSBPRkZMT0FEX0RFQlVHX1RSQUNFKGxldmVsLCAuLi4pIFwKKyAgICBPRkZMT0FEX1RSQUNFKGxldmVsLCBfX1ZBX0FSR1NfXykKKworI2RlZmluZSBPRkZMT0FEX1JFUE9SVChsZXZlbCwgb2ZmbG9hZF9udW1iZXIsIHN0YWdlLCAuLi4pIFwKKyAgICBpZiAoT0ZGTE9BRF9ET19UUkFDRSkgeyBcCisgICAgICAgIG9mZmxvYWRfc3RhZ2VfcHJpbnQoc3RhZ2UsIG9mZmxvYWRfbnVtYmVyLCBfX1ZBX0FSR1NfXyk7IFwKKyAgICAgICAgZmZsdXNoKE5VTEwpOyBcCisgICAgfQorCisjZGVmaW5lIE9GRkxPQURfREVCVUdfVFJBQ0VfMShsZXZlbCwgb2ZmbG9hZF9udW1iZXIsIHN0YWdlLCAuLi4pIFwKKyAgICBpZiAoT0ZGTE9BRF9ET19UUkFDRSkgeyBcCisgICAgICAgIG9mZmxvYWRfc3RhZ2VfcHJpbnQoc3RhZ2UsIG9mZmxvYWRfbnVtYmVyLCBfX1ZBX0FSR1NfXyk7IFwKKyAgICAgICAgZmZsdXNoKE5VTEwpOyBcCisgICAgfSBcCisgICAgaWYgKCFPRkZMT0FEX0RPX1RSQUNFKSB7IFwKKyAgICAgICAgT0ZGTE9BRF9UUkFDRShsZXZlbCwgX19WQV9BUkdTX18pIFwKKyAgICB9CisKKyNkZWZpbmUgT0ZGTE9BRF9ERUJVR19EVU1QX0JZVEVTKGxldmVsLCBhLCBiKSBcCisgICAgX19kdW1wX2J5dGVzKGxldmVsLCBhLCBiKQorCitleHRlcm4gdm9pZCBfX2R1bXBfYnl0ZXMoCisgICAgaW50IGxldmVsLAorICAgIGNvbnN0IHZvaWQgKmRhdGEsCisgICAgaW50IGxlbgorKTsKKworI2Vsc2UKKworI2RlZmluZSBPRkZMT0FEX0RFQlVHX0xPRyhsZXZlbCwgLi4uKQorI2RlZmluZSBPRkZMT0FEX0RFQlVHX0RVTVBfQllURVMobGV2ZWwsIGEsIGIpCisKKyNlbmRpZgorCisvLyBSdW50aW1lIGludGVyZmFjZQorCisjZGVmaW5lIE9GRkxPQURfUFJFRklYKGEpIF9fb2ZmbG9hZF8jI2EKKworI2RlZmluZSBPRkZMT0FEX01BTExPQyAgICAgICAgICAgIE9GRkxPQURfUFJFRklYKG1hbGxvYykKKyNkZWZpbmUgT0ZGTE9BRF9GUkVFKGEpICAgICAgICAgICBfbW1fZnJlZShhKQorCisvLyBGb3J3YXJkIGZ1bmN0aW9ucworCitleHRlcm4gdm9pZCAqT0ZGTE9BRF9NQUxMT0Moc2l6ZV90IHNpemUsIHNpemVfdCBhbGlnbik7CisKKy8vIFRoZSBNYXJzaGFsbGVyCisKKy8vISBcZW51bSBJbmRpY2F0b3IgZm9yIHRoZSB0eXBlIG9mIGVudHJ5IG9uIGFuIG9mZmxvYWQgaXRlbSBsaXN0LgorZW51bSBPZmZsb2FkSXRlbVR5cGUgeworICAgIGNfZGF0YSA9ICAgMSwgICAgICAgLy8hPCBQbGFpbiBkYXRhCisgICAgY19kYXRhX3B0ciwgICAgICAgICAvLyE8IFBvaW50ZXIgZGF0YQorICAgIGNfZnVuY19wdHIsICAgICAgICAgLy8hPCBGdW5jdGlvbiBwb2ludGVyCisgICAgY192b2lkX3B0ciwgICAgICAgICAvLyE8IHZvaWQqCisgICAgY19zdHJpbmdfcHRyLCAgICAgICAvLyE8IEMgc3RyaW5nCisgICAgY19kdiwgICAgICAgICAgICAgICAvLyE8IERvcGUgdmVjdG9yIHZhcmlhYmxlCisgICAgY19kdl9kYXRhLCAgICAgICAgICAvLyE8IERvcGUtdmVjdG9yIGRhdGEKKyAgICBjX2R2X2RhdGFfc2xpY2UsICAgIC8vITwgRG9wZS12ZWN0b3IgZGF0YSdzIHNsaWNlCisgICAgY19kdl9wdHIsICAgICAgICAgICAvLyE8IERvcGUtdmVjdG9yIHZhcmlhYmxlIHBvaW50ZXIKKyAgICBjX2R2X3B0cl9kYXRhLCAgICAgIC8vITwgRG9wZS12ZWN0b3IgcG9pbnRlciBkYXRhCisgICAgY19kdl9wdHJfZGF0YV9zbGljZSwvLyE8IERvcGUtdmVjdG9yIHBvaW50ZXIgZGF0YSdzIHNsaWNlCisgICAgY19jZWFuX3ZhciwgICAgICAgICAvLyE8IENFQU4gdmFyaWFibGUKKyAgICBjX2NlYW5fdmFyX3B0ciwgICAgIC8vITwgUG9pbnRlciB0byBDRUFOIHZhcmlhYmxlCisgICAgY19kYXRhX3B0cl9hcnJheSwgICAvLyE8IFBvaW50ZXIgdG8gZGF0YSBwb2ludGVyIGFycmF5CisgICAgY19mdW5jX3B0cl9hcnJheSwgICAvLyE8IFBvaW50ZXIgdG8gZnVuY3Rpb24gcG9pbnRlciBhcnJheQorICAgIGNfdm9pZF9wdHJfYXJyYXksICAgLy8hPCBQb2ludGVyIHRvIHZvaWQqIHBvaW50ZXIgYXJyYXkKKyAgICBjX3N0cmluZ19wdHJfYXJyYXkgIC8vITwgUG9pbnRlciB0byBjaGFyKiBwb2ludGVyIGFycmF5Cit9OworCisjZGVmaW5lIFZBUl9UWVBFX0lTX1BUUih0KSAoKHQpID09IGNfc3RyaW5nX3B0ciB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHQpID09IGNfZGF0YV9wdHIgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0KSA9PSBjX2NlYW5fdmFyX3B0ciB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHQpID09IGNfZHZfcHRyKQorCisjZGVmaW5lIFZBUl9UWVBFX0lTX1NDQUxBUih0KSAoKHQpID09IGNfZGF0YSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHQpID09IGNfdm9pZF9wdHIgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0KSA9PSBjX2NlYW5fdmFyIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodCkgPT0gY19kdikKKworI2RlZmluZSBWQVJfVFlQRV9JU19EVl9EQVRBKHQpICgodCkgPT0gY19kdl9kYXRhIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHQpID09IGNfZHZfcHRyX2RhdGEpCisKKyNkZWZpbmUgVkFSX1RZUEVfSVNfRFZfREFUQV9TTElDRSh0KSAoKHQpID09IGNfZHZfZGF0YV9zbGljZSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0KSA9PSBjX2R2X3B0cl9kYXRhX3NsaWNlKQorCisKKy8vISBcZW51bSBTcGVjaWZ5IGRpcmVjdGlvbiB0byBjb3B5IG9mZmxvYWRlZCB2YXJpYWJsZS4KK2VudW0gT2ZmbG9hZFBhcmFtZXRlclR5cGUgeworICAgIGNfcGFyYW1ldGVyX3Vua25vd24gPSAtMSwgLy8hPCBVbmtub3duIGNsYXVzZQorICAgIGNfcGFyYW1ldGVyX25vY29weSwgICAgICAgLy8hPCBWYXJpYWJsZSBsaXN0ZWQgaW4gIm5vY29weSIgY2xhdXNlCisgICAgY19wYXJhbWV0ZXJfaW4sICAgICAgICAgICAvLyE8IFZhcmlhYmxlIGxpc3RlZCBpbiAiaW4iIGNsYXVzZQorICAgIGNfcGFyYW1ldGVyX291dCwgICAgICAgICAgLy8hPCBWYXJpYWJsZSBsaXN0ZWQgaW4gIm91dCIgY2xhdXNlCisgICAgY19wYXJhbWV0ZXJfaW5vdXQgICAgICAgICAvLyE8IFZhcmlhYmxlIGxpc3RlZCBpbiAiaW5vdXQiIGNsYXVzZQorfTsKKworLy8hIEFuIE9mZmxvYWQgVmFyaWFibGUgZGVzY3JpcHRvcgorc3RydWN0IFZhckRlc2MgeworICAgIC8vISBPZmZsb2FkSXRlbVR5cGVzIG9mIHNvdXJjZSBhbmQgZGVzdGluYXRpb24KKyAgICB1bmlvbiB7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICB1aW50OF90IGRzdCA6IDQ7IC8vITwgT2ZmbG9hZEl0ZW1UeXBlIG9mIGRlc3RpbmF0aW9uCisgICAgICAgICAgICB1aW50OF90IHNyYyA6IDQ7IC8vITwgT2ZmbG9hZEl0ZW1UeXBlIG9mIHNvdXJjZQorICAgICAgICB9OworICAgICAgICB1aW50OF90IGJpdHM7CisgICAgfSB0eXBlOworCisgICAgLy8hIE9mZmxvYWRQYXJhbWV0ZXJUeXBlIHRoYXQgZGVzY3JpYmVzIGRpcmVjdGlvbiBvZiBkYXRhIHRyYW5zZmVyCisgICAgdW5pb24geworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgdWludDhfdCBpbiAgOiAxOyAvLyE8IFNldCBpZiBJTiBvciBJTk9VVAorICAgICAgICAgICAgdWludDhfdCBvdXQgOiAxOyAvLyE8IFNldCBpZiBPVVQgb3IgSU5PVVQKKyAgICAgICAgfTsKKyAgICAgICAgdWludDhfdCBiaXRzOworICAgIH0gZGlyZWN0aW9uOworCisgICAgdWludDhfdCBhbGxvY19pZjsgICAgICAgIC8vITwgYWxsb2NfaWYgbW9kaWZpZXIgdmFsdWUKKyAgICB1aW50OF90IGZyZWVfaWY7ICAgICAgICAgLy8hPCBmcmVlX2lmIG1vZGlmaWVyIHZhbHVlCisgICAgdWludDMyX3QgYWxpZ247ICAgICAgICAgIC8vITwgTUlDIGFsaWdubWVudCByZXF1ZXN0ZWQgZm9yIHBvaW50ZXIgZGF0YQorICAgIC8vISBOb3QgdXNlZCBieSBjb21waWxlcjsgc2V0IHRvIDAKKyAgICAvKiEgVXNlZCBieSBydW50aW1lIGFzIG9mZnNldCB0byBkYXRhIGZyb20gc3RhcnQgb2YgTUlDIGJ1ZmZlciAqLworICAgIHVpbnQzMl90IG1pY19vZmZzZXQ7CisgICAgLy8hIEZsYWdzIGRlc2NyaWJpbmcgdGhpcyB2YXJpYWJsZQorICAgIHVuaW9uIHsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIC8vISBzb3VyY2UgdmFyaWFibGUgaGFzIHBlcnNpc3RlbnQgc3RvcmFnZQorICAgICAgICAgICAgdWludDMyX3QgaXNfc3RhdGljIDogMTsKKyAgICAgICAgICAgIC8vISBkZXN0aW5hdGlvbiB2YXJpYWJsZSBoYXMgcGVyc2lzdGVudCBzdG9yYWdlCisgICAgICAgICAgICB1aW50MzJfdCBpc19zdGF0aWNfZHN0biA6IDE7CisgICAgICAgICAgICAvLyEgaGFzIGxlbmd0aCBmb3IgY19kdiAmJiBjX2R2X3B0cgorICAgICAgICAgICAgdWludDMyX3QgaGFzX2xlbmd0aCA6IDE7CisgICAgICAgICAgICAvLyEgcGVyc2lzdGVkIGxvY2FsIHNjYWxhciBpcyBpbiBzdGFjayBidWZmZXIKKyAgICAgICAgICAgIHVpbnQzMl90IGlzX3N0YWNrX2J1ZiA6IDE7CisgICAgICAgICAgICAvLyEgYnVmZmVyIGFkZHJlc3MgaXMgc2VudCBpbiBkYXRhCisgICAgICAgICAgICB1aW50MzJfdCBzaW5rX2FkZHIgOiAxOworICAgICAgICAgICAgLy8hIGFsbG9jIGRpc3BsYWNlbWVudCBpcyBzZW50IGluIGRhdGEKKyAgICAgICAgICAgIHVpbnQzMl90IGFsbG9jX2Rpc3AgOiAxOworICAgICAgICAgICAgLy8hIHNvdXJjZSBkYXRhIGlzIG5vbmNvbnRpZ3VvdXMKKyAgICAgICAgICAgIHVpbnQzMl90IGlzX25vbmNvbnRfc3JjIDogMTsKKyAgICAgICAgICAgIC8vISBkZXN0aW5hdGlvbiBkYXRhIGlzIG5vbmNvbnRpZ3VvdXMKKyAgICAgICAgICAgIHVpbnQzMl90IGlzX25vbmNvbnRfZHN0IDogMTsKKyAgICAgICAgfTsKKyAgICAgICAgdWludDMyX3QgYml0czsKKyAgICB9IGZsYWdzOworICAgIC8vISBOb3QgdXNlZCBieSBjb21waWxlcjsgc2V0IHRvIDAKKyAgICAvKiEgVXNlZCBieSBydW50aW1lIGFzIG9mZnNldCB0byBiYXNlIGZyb20gZGF0YSBzdG9yZWQgaW4gYSBidWZmZXIgKi8KKyAgICBpbnQ2NF90IG9mZnNldDsKKyAgICAvLyEgRWxlbWVudCBieXRlLXNpemUgb2YgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZAorICAgIC8qISBGb3IgZG9wZS12ZWN0b3IsIHRoZSBzaXplIG9mIHRoZSBkb3BlLXZlY3RvciAgICAgICovCisgICAgaW50NjRfdCBzaXplOworICAgIHVuaW9uIHsKKyAgICAgICAgLy8hIFNldCB0byAwIGZvciBhcnJheSBleHByZXNzaW9ucyBhbmQgZG9wZS12ZWN0b3JzCisgICAgICAgIC8qISBTZXQgdG8gMSBmb3Igc2NhbGFycyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyohIFNldCB0byB2YWx1ZSBvZiBsZW5ndGggbW9kaWZpZXIgZm9yIHBvaW50ZXJzICAqLworICAgICAgICBpbnQ2NF90IGNvdW50OworICAgICAgICAvLyEgRGlzcGxhY2VtZW50IG5vdCB1c2VkIGJ5IGNvbXBpbGVyCisgICAgICAgIGludDY0X3QgZGlzcDsKKyAgICB9OworCisgICAgLy8hIFRoaXMgZmllbGQgbm90IHVzZWQgYnkgT3Blbk1QIDQuMAorICAgIC8qISBUaGUgYWxsb2Mgc2VjdGlvbiBleHByZXNzaW9uIGluICNwcmFnbWEgb2ZmbG9hZCAgICovCisgICAgdW5pb24geworICAgICAgIHZvaWQgKmFsbG9jOworICAgICAgIGludDY0X3QgcHRyX2Fycl9vZmZzZXQ7CisgICAgfTsKKworICAgIC8vISBUaGlzIGZpZWxkIG5vdCB1c2VkIGJ5IE9wZW5NUCA0LjAKKyAgICAvKiEgVGhlIGludG8gc2VjdGlvbiBleHByZXNzaW9uIGluICNwcmFnbWEgb2ZmbG9hZCAgICAqLworICAgIC8qISBGb3IgY19kYXRhX3B0cl9hcnJheSB0aGlzIGlzIHRoZSBpbnRvIHB0ciBhcnJheSAgICovCisgICAgdm9pZCAqaW50bzsKKworICAgIC8vISBGb3IgYW4gb3JkaW5hcnkgdmFyaWFibGUsIGFkZHJlc3Mgb2YgdGhlIHZhcmlhYmxlCisgICAgLyohIEZvciBjX2NlYW5fdmFyIChDL0MrKyBhcnJheSBleHByZXNzaW9uKSwKKyAgICAgICAgcG9pbnRlciB0byBhcnJfZGVzYywgd2hpY2ggaXMgYW4gYXJyYXkgZGVzY3JpcHRvci4gKi8KKyAgICAvKiEgRm9yIGNfZGF0YV9wdHJfYXJyYXkgKGFycmF5IG9mIGRhdGEgcG9pbnRlcnMpLAorICAgICAgICBwb2ludGVyIHRvIHB0cl9hcnJheV9kZXNjcmlwdG9yLAorICAgICAgICB3aGljaCBpcyBhIGRlc2NyaXB0b3IgZm9yIHBvaW50ZXIgYXJyYXkgdHJhbnNmZXJzLiAqLworICAgIHZvaWQgKnB0cjsKK307CisKKy8vISBBdXhpbGlhcnkgc3RydWN0IHVzZWQgd2hlbiAtZyBpcyBlbmFibGVkIHRoYXQgaG9sZHMgdmFyaWFibGUgbmFtZXMKK3N0cnVjdCBWYXJEZXNjMiB7CisgICAgY29uc3QgY2hhciAqc25hbWU7IC8vITwgU291cmNlIG5hbWUKKyAgICBjb25zdCBjaGFyICpkbmFtZTsgLy8hPCBEZXN0aW5hdGlvbiBuYW1lICh3aGVuICJpbnRvIiBpcyB1c2VkKQorfTsKKworLyohIFdoZW4gdGhlIE9mZmxvYWRJdGVtVHlwZSBpcyBjX2RhdGFfcHRyX2FycmF5CisgICAgdGhlIHB0ciBmaWVsZCBvZiB0aGUgbWFpbiBkZXNjcmlwdG9yIHBvaW50cyB0byB0aGlzIHN0cnVjdC4gICAgICAgICAgKi8KKy8qISBUaGUgdHlwZSBpbiBWYXJEZXNjMSBtZXJlbHkgc2F5cyBjX2NlYW5fZGF0YV9wdHIsIGJ1dCB0aGUgcG9pbnRlcgorICAgIHR5cGUgY2FuIGJlIGNfZGF0YV9wdHIsIGNfZnVuY19wdHIsIGNfdm9pZF9wdHIsIG9yIGNfc3RyaW5nX3B0ci4KKyAgICBUaGVyZWZvcmUgdGhlIGFjdHVhbCBwb2ludGVyIHR5cGUgaXMgaW4gdGhlIGZsYWdzIGZpZWxkIG9mIFZhckRlc2MzLiAqLworLyohIElmIGZsYWdfYWxpZ25faXNfYXJyYXkvZmxhZ19hbGxvY19pZl9pc19hcnJheS9mbGFnX2ZyZWVfaWZfaXNfYXJyYXkKKyAgICBpcyAwIHRoZW4gYWxpZ25tZW50L2FsbG9jX2lmL2ZyZWVfaWYgYXJlIHNwZWNpZmllZCBpbiBWYXJEZXNjMS4gICAgICAqLworLyohIElmIGZsYWdfYWxpZ25faXNfYXJyYXkvZmxhZ19hbGxvY19pZl9pc19hcnJheS9mbGFnX2ZyZWVfaWZfaXNfYXJyYXkKKyAgICBpcyAxIHRoZW4gYWxpZ25fYXJyYXkvYWxsb2NfaWZfYXJyYXkvZnJlZV9pZl9hcnJheSBzcGVjaWZ5CisgICAgdGhlIHNldCBvZiBhbGlnbm1lbnQvYWxsb2NfaWYvZnJlZV9pZiB2YWx1ZXMuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qISBGb3IgdGhlIG90aGVyIGZpZWxkcywgaWYgbmVpdGhlciB0aGUgc2NhbGFyIG5vciB0aGUgYXJyYXkgZmxhZworICAgIGlzIHNldCwgdGhlbiB0aGF0IG1vZGlmaWVyIHdhcyBub3Qgc3BlY2lmaWVkLiBJZiB0aGUgYml0cyBhcmUgc2V0CisgICAgdGhleSBzcGVjaWZ5IHdoaWNoIG1vZGlmaWVyIHdhcyBzZXQgYW5kIHdoZXRoZXIgaXQgd2FzIGEKKyAgICBzY2FsYXIgb3IgYW4gYXJyYXkgZXhwcmVzc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworc3RydWN0IFZhckRlc2MzCit7CisgICAgdm9pZCAqcHRyX2FycmF5OyAgICAgICAgLy8hPCBQb2ludGVyIHRvIGFycl9kZXNjIG9mIGFycmF5IG9mIHBvaW50ZXJzCisgICAgdm9pZCAqYWxpZ25fYXJyYXk7ICAgICAgLy8hPCBTY2FsYXIgdmFsdWUgb3IgcG9pbnRlciB0byBhcnJfZGVzYworICAgIHZvaWQgKmFsbG9jX2lmX2FycmF5OyAgIC8vITwgU2NhbGFyIHZhbHVlIG9yIHBvaW50ZXIgdG8gYXJyX2Rlc2MKKyAgICB2b2lkICpmcmVlX2lmX2FycmF5OyAgICAvLyE8IFNjYWxhciB2YWx1ZSBvciBwb2ludGVyIHRvIGFycl9kZXNjCisgICAgdm9pZCAqZXh0ZW50X3N0YXJ0OyAgICAgLy8hPCBTY2FsYXIgdmFsdWUgb3IgcG9pbnRlciB0byBhcnJfZGVzYworICAgIHZvaWQgKmV4dGVudF9lbGVtZW50czsgIC8vITwgU2NhbGFyIHZhbHVlIG9yIHBvaW50ZXIgdG8gYXJyX2Rlc2MKKyAgICB2b2lkICppbnRvX3N0YXJ0OyAgICAgICAvLyE8IFNjYWxhciB2YWx1ZSBvciBwb2ludGVyIHRvIGFycl9kZXNjCisgICAgdm9pZCAqaW50b19lbGVtZW50czsgICAgLy8hPCBTY2FsYXIgdmFsdWUgb3IgcG9pbnRlciB0byBhcnJfZGVzYworICAgIHZvaWQgKmFsbG9jX3N0YXJ0OyAgICAgIC8vITwgU2NhbGFyIHZhbHVlIG9yIHBvaW50ZXIgdG8gYXJyX2Rlc2MKKyAgICB2b2lkICphbGxvY19lbGVtZW50czsgICAvLyE8IFNjYWxhciB2YWx1ZSBvciBwb2ludGVyIHRvIGFycl9kZXNjCisgICAgLyohIEZsYWdzIHRoYXQgZGVzY3JpYmUgdGhlIHBvaW50ZXIgdHlwZSBhbmQgd2hldGhlciBlYWNoIGZpZWxkCisgICAgICAgIGlzIGEgc2NhbGFyIHZhbHVlIG9yIGFuIGFycmF5IGV4cHJlc3Npb24uICAgICAgICAqLworICAgIC8qISBGaXJzdCA2IGJpdHMgYXJlIHBvaW50ZXIgYXJyYXkgZWxlbWVudCB0eXBlOgorICAgICAgICBjX2RhdGFfcHRyLCBjX2Z1bmNfcHRyLCBjX3ZvaWRfcHRyLCBjX3N0cmluZ19wdHIgKi8KKyAgICAvKiEgVGhlbiBzaW5nbGUgYml0cyBzcGVjaWZ5OiAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyohICAgICBhbGlnbl9hcnJheSBpcyBhbiBhcnJheSAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qISAgICAgYWxsb2NfaWZfYXJyYXkgaXMgYW4gYXJyYXkgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiEgICAgIGZyZWVfaWZfYXJyYXkgaXMgYW4gYXJyYXkgICAgICAgICAgICAgICAgICAgICovCisgICAgLyohICAgICBleHRlbnRfc3RhcnQgaXMgYSBzY2FsYXIgZXhwcmVzc2lvbiAgICAgICAgICAqLworICAgIC8qISAgICAgZXh0ZW50X3N0YXJ0IGlzIGFuIGFycmF5IGV4cHJlc3Npb24gICAgICAgICAgKi8KKyAgICAvKiEgICAgIGV4dGVudF9lbGVtZW50cyBpcyBhIHNjYWxhciBleHByZXNzaW9uICAgICAgICovCisgICAgLyohICAgICBleHRlbnRfZWxlbWVudHMgaXMgYW4gYXJyYXkgZXhwcmVzc2lvbiAgICAgICAqLworICAgIC8qISAgICAgaW50b19zdGFydCBpcyBhIHNjYWxhciBleHByZXNzaW9uICAgICAgICAgICAgKi8KKyAgICAvKiEgICAgIGludG9fc3RhcnQgaXMgYW4gYXJyYXkgZXhwcmVzc2lvbiAgICAgICAgICAgICovCisgICAgLyohICAgICBpbnRvX2VsZW1lbnRzIGlzIGEgc2NhbGFyIGV4cHJlc3Npb24gICAgICAgICAqLworICAgIC8qISAgICAgaW50b19lbGVtZW50cyBpcyBhbiBhcnJheSBleHByZXNzaW9uICAgICAgICAgKi8KKyAgICAvKiEgICAgIGFsbG9jX3N0YXJ0IGlzIGEgc2NhbGFyIGV4cHJlc3Npb24gICAgICAgICAgICovCisgICAgLyohICAgICBhbGxvY19zdGFydCBpcyBhbiBhcnJheSBleHByZXNzaW9uICAgICAgICAgICAqLworICAgIC8qISAgICAgYWxsb2NfZWxlbWVudHMgaXMgYSBzY2FsYXIgZXhwcmVzc2lvbiAgICAgICAgKi8KKyAgICAvKiEgICAgIGFsbG9jX2VsZW1lbnRzIGlzIGFuIGFycmF5IGV4cHJlc3Npb24gICAgICAgICovCisgICAgdWludDMyX3QgYXJyYXlfZmllbGRzOworfTsKK2NvbnN0IGludCBmbGFnX2FsaWduX2lzX2FycmF5ID0gNjsKK2NvbnN0IGludCBmbGFnX2FsbG9jX2lmX2lzX2FycmF5ID0gNzsKK2NvbnN0IGludCBmbGFnX2ZyZWVfaWZfaXNfYXJyYXkgPSA4OworY29uc3QgaW50IGZsYWdfZXh0ZW50X3N0YXJ0X2lzX3NjYWxhciA9IDk7Citjb25zdCBpbnQgZmxhZ19leHRlbnRfc3RhcnRfaXNfYXJyYXkgPSAxMDsKK2NvbnN0IGludCBmbGFnX2V4dGVudF9lbGVtZW50c19pc19zY2FsYXIgPSAxMTsKK2NvbnN0IGludCBmbGFnX2V4dGVudF9lbGVtZW50c19pc19hcnJheSA9IDEyOworY29uc3QgaW50IGZsYWdfaW50b19zdGFydF9pc19zY2FsYXIgPSAxMzsKK2NvbnN0IGludCBmbGFnX2ludG9fc3RhcnRfaXNfYXJyYXkgPSAxNDsKK2NvbnN0IGludCBmbGFnX2ludG9fZWxlbWVudHNfaXNfc2NhbGFyID0gMTU7Citjb25zdCBpbnQgZmxhZ19pbnRvX2VsZW1lbnRzX2lzX2FycmF5ID0gMTY7Citjb25zdCBpbnQgZmxhZ19hbGxvY19zdGFydF9pc19zY2FsYXIgPSAxNzsKK2NvbnN0IGludCBmbGFnX2FsbG9jX3N0YXJ0X2lzX2FycmF5ID0gMTg7Citjb25zdCBpbnQgZmxhZ19hbGxvY19lbGVtZW50c19pc19zY2FsYXIgPSAxOTsKK2NvbnN0IGludCBmbGFnX2FsbG9jX2VsZW1lbnRzX2lzX2FycmF5ID0gMjA7CisKKy8vIFRoZSBNYXJzaGFsbGVyCitjbGFzcyBNYXJzaGFsbGVyCit7Citwcml2YXRlOgorICAgIC8vIFN0YXJ0IGFkZHJlc3Mgb2YgYnVmZmVyCisgICAgY2hhciAqYnVmZmVyX3N0YXJ0OworCisgICAgLy8gQ3VycmVudCBwb2ludGVyIHdpdGhpbiBidWZmZXIKKyAgICBjaGFyICpidWZmZXJfcHRyOworCisgICAgLy8gUGh5c2ljYWwgc2l6ZSBvZiBkYXRhIHNlbnQgKGluY2x1ZGluZyBmbGFncykKKyAgICBsb25nIGxvbmcgYnVmZmVyX3NpemU7CisKKyAgICAvLyBVc2VyIGRhdGEgc2VudC9yZWNlaXZlZAorICAgIGxvbmcgbG9uZyB0ZnJfc2l6ZTsKKworcHVibGljOgorICAgIC8vIENvbnN0cnVjdG9yCisgICAgTWFyc2hhbGxlcigpIDoKKyAgICAgICAgYnVmZmVyX3N0YXJ0KDApLCBidWZmZXJfcHRyKDApLAorICAgICAgICBidWZmZXJfc2l6ZSgwKSwgdGZyX3NpemUoMCkKKyAgICB7CisgICAgfQorCisgICAgLy8gUmV0dXJuIGNvdW50IG9mIHVzZXIgZGF0YSBzZW50L3JlY2VpdmVkCisgICAgbG9uZyBsb25nIGdldF90ZnJfc2l6ZSgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gdGZyX3NpemU7CisgICAgfQorCisgICAgLy8gUmV0dXJuIHBvaW50ZXIgdG8gYnVmZmVyCisgICAgY2hhciAqZ2V0X2J1ZmZlcl9zdGFydCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gYnVmZmVyX3N0YXJ0OworICAgIH0KKworICAgIC8vIFJldHVybiBjdXJyZW50IHNpemUgb2YgZGF0YSBpbiBidWZmZXIKKyAgICBsb25nIGxvbmcgZ2V0X2J1ZmZlcl9zaXplKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBidWZmZXJfc2l6ZTsKKyAgICB9CisKKyAgICAvLyBTZXQgYnVmZmVyIHBvaW50ZXIKKyAgICB2b2lkIGluaXRfYnVmZmVyKAorICAgICAgICBjaGFyICpkLAorICAgICAgICBsb25nIGxvbmcgcworICAgICkKKyAgICB7CisgICAgICAgIGJ1ZmZlcl9zdGFydCA9IGJ1ZmZlcl9wdHIgPSBkOworICAgICAgICBidWZmZXJfc2l6ZSA9IHM7CisgICAgfQorCisgICAgLy8gU2VuZCBkYXRhCisgICAgdm9pZCBzZW5kX2RhdGEoCisgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsCisgICAgICAgIGludDY0X3QgbGVuZ3RoCisgICAgKTsKKworICAgIC8vIFJlY2VpdmUgZGF0YQorICAgIHZvaWQgcmVjZWl2ZV9kYXRhKAorICAgICAgICB2b2lkICpkYXRhLAorICAgICAgICBpbnQ2NF90IGxlbmd0aAorICAgICk7CisKKyAgICAvLyBTZW5kIGZ1bmN0aW9uIHBvaW50ZXIKKyAgICB2b2lkIHNlbmRfZnVuY19wdHIoCisgICAgICAgIGNvbnN0IHZvaWQqIGRhdGEKKyAgICApOworCisgICAgLy8gUmVjZWl2ZSBmdW5jdGlvbiBwb2ludGVyCisgICAgdm9pZCByZWNlaXZlX2Z1bmNfcHRyKAorICAgICAgICBjb25zdCB2b2lkKiogZGF0YQorICAgICk7Cit9OworCisvLyBFbmQgb2YgdGhlIE1hcnNoYWxsZXIKKworLy8gVGhlIG9mZmxvYWRlZCBmdW5jdGlvbiBkZXNjcmlwdG9yLgorLy8gU2VudCBmcm9tIGhvc3QgdG8gdGFyZ2V0IHRvIHNwZWNpZnkgd2hpY2ggZnVuY3Rpb24gdG8gcnVuLgorLy8gQWxzbywgc2V0cyBjb25zb2xlIGFuZCBmaWxlIHRyYWNpbmcgbGV2ZWxzLgorc3RydWN0IEZ1bmN0aW9uRGVzY3JpcHRvcgoreworICAgIC8vIElucHV0IGRhdGEgc2l6ZS4KKyAgICBsb25nIGxvbmcgaW5fZGF0YWxlbjsKKworICAgIC8vIE91dHB1dCBkYXRhIHNpemUuCisgICAgbG9uZyBsb25nIG91dF9kYXRhbGVuOworCisgICAgLy8gV2hldGhlciB0cmFjZSBpcyByZXF1ZXN0ZWQgb24gY29uc29sZS4KKyAgICAvLyBBIHZhbHVlIG9mIDEgcHJvZHVjZXMgb25seSBmdW5jdGlvbiBuYW1lIGFuZCBkYXRhIHNlbnQvcmVjZWl2ZWQuCisgICAgLy8gVmFsdWVzID4gMSBwcm9kdWNlIGNvcGlvdXMgdHJhY2UgaW5mb3JtYXRpb24uCisgICAgdWludDhfdCBjb25zb2xlX2VuYWJsZWQ7CisKKyAgICAvLyBGbGFnIGNvbnRyb2xsaW5nIHRpbWluZyBvbiB0aGUgdGFyZ2V0IHNpZGUuCisgICAgLy8gVmFsdWVzID4gMCBlbmFibGUgdGltaW5nIG9uIHNpbmsuCisgICAgdWludDhfdCB0aW1lcl9lbmFibGVkOworCisgICAgaW50IG9mZmxvYWRfcmVwb3J0X2xldmVsOworICAgIGludCBvZmZsb2FkX251bWJlcjsKKworICAgIC8vIG51bWJlciBvZiB2YXJpYWJsZSBkZXNjcmlwdG9ycworICAgIGludCB2YXJzX251bTsKKworICAgIC8vIGlub3V0IGRhdGEgb2Zmc2V0IGlmIGRhdGEgaXMgcGFzc2VkIGFzIG1pc2MvcmV0dXJuIGRhdGEKKyAgICAvLyBvdGhlcndpc2UgaXQgc2hvdWxkIGJlIHplcm8uCisgICAgaW50IGRhdGFfb2Zmc2V0OworCisgICAgLy8gVGhlIG5hbWUgb2YgdGhlIG9mZmxvYWRlZCBmdW5jdGlvbgorICAgIGNoYXIgZGF0YVtdOworfTsKKworLy8gdHlwZWRlZiBPRkZMT0FELgorLy8gUG9pbnRlciB0byBPZmZsb2FkRGVzY3JpcHRvci4KK3R5cGVkZWYgc3RydWN0IE9mZmxvYWREZXNjcmlwdG9yICpPRkZMT0FEOworCisjZW5kaWYgLy8gT0ZGTE9BRF9DT01NT05fSF9JTkNMVURFRApkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9lbmdpbmUuY3BwIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9lbmdpbmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2OWI2MDQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX2VuZ2luZS5jcHAKQEAgLTAsMCArMSw1MzEgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgIm9mZmxvYWRfZW5naW5lLmgiCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJvZmZsb2FkX2hvc3QuaCIKKyNpbmNsdWRlICJvZmZsb2FkX3RhYmxlLmgiCisKK2NvbnN0IGNoYXIqIEVuZ2luZTo6bV9mdW5jX25hbWVzW0VuZ2luZTo6Y19mdW5jc190b3RhbF0gPQoreworICAgICJzZXJ2ZXJfY29tcHV0ZSIsCisjaWZkZWYgTVlPX1NVUFBPUlQKKyAgICAic2VydmVyX215b2luaXQiLAorICAgICJzZXJ2ZXJfbXlvZmluaSIsCisjZW5kaWYgLy8gTVlPX1NVUFBPUlQKKyAgICAic2VydmVyX2luaXQiLAorICAgICJzZXJ2ZXJfdmFyX3RhYmxlX3NpemUiLAorICAgICJzZXJ2ZXJfdmFyX3RhYmxlX2NvcHkiCit9OworCisvLyBTeW1ib2xpYyByZXByZXNlbnRhdGlvbiBvZiBzeXN0ZW0gc2lnbmFscy4gRml4IGZvciBDUTIzMzU5MworY29uc3QgY2hhciogRW5naW5lOjpjX3NpZ25hbF9uYW1lc1tFbmdpbmU6OmNfc2lnbmFsX21heF0gPQoreworICAgICJVbmtub3duIFNJR05BTCIsCisgICAgIlNJR0hVUCIsICAgIC8qICAxLCBIYW5ndXAgKFBPU0lYKS4gICovCisgICAgIlNJR0lOVCIsICAgIC8qICAyLCBJbnRlcnJ1cHQgKEFOU0kpLiAgKi8KKyAgICAiU0lHUVVJVCIsICAgLyogIDMsIFF1aXQgKFBPU0lYKS4gICovCisgICAgIlNJR0lMTCIsICAgIC8qICA0LCBJbGxlZ2FsIGluc3RydWN0aW9uIChBTlNJKS4gICovCisgICAgIlNJR1RSQVAiLCAgIC8qICA1LCBUcmFjZSB0cmFwIChQT1NJWCkuICAqLworICAgICJTSUdBQlJUIiwgICAvKiAgNiwgQWJvcnQgKEFOU0kpLiAgKi8KKyAgICAiU0lHQlVTIiwgICAgLyogIDcsIEJVUyBlcnJvciAoNC4yIEJTRCkuICAqLworICAgICJTSUdGUEUiLCAgICAvKiAgOCwgRmxvYXRpbmctcG9pbnQgZXhjZXB0aW9uIChBTlNJKS4gICovCisgICAgIlNJR0tJTEwiLCAgIC8qICA5LCBLaWxsLCB1bmJsb2NrYWJsZSAoUE9TSVgpLiAgKi8KKyAgICAiU0lHVVNSMSIsICAgLyogMTAsIFVzZXItZGVmaW5lZCBzaWduYWwgMSAoUE9TSVgpLiAgKi8KKyAgICAiU0lHU0VHViIsICAgLyogMTEsIFNlZ21lbnRhdGlvbiB2aW9sYXRpb24gKEFOU0kpLiAgKi8KKyAgICAiU0lHVVNSMiIsICAgLyogMTIsIFVzZXItZGVmaW5lZCBzaWduYWwgMiAoUE9TSVgpLiAgKi8KKyAgICAiU0lHUElQRSIsICAgLyogMTMsIEJyb2tlbiBwaXBlIChQT1NJWCkuICAqLworICAgICJTSUdBTFJNIiwgICAvKiAxNCwgQWxhcm0gY2xvY2sgKFBPU0lYKS4gICovCisgICAgIlNJR1RFUk0iLCAgIC8qIDE1LCBUZXJtaW5hdGlvbiAoQU5TSSkuICAqLworICAgICJTSUdTVEtGTFQiLCAvKiAxNiwgU3RhY2sgZmF1bHQuICAqLworICAgICJTSUdDSExEIiwgICAvKiAxNywgQ2hpbGQgc3RhdHVzIGhhcyBjaGFuZ2VkIChQT1NJWCkuICAqLworICAgICJTSUdDT05UIiwgICAvKiAxOCwgQ29udGludWUgKFBPU0lYKS4gICovCisgICAgIlNJR1NUT1AiLCAgIC8qIDE5LCBTdG9wLCB1bmJsb2NrYWJsZSAoUE9TSVgpLiAgKi8KKyAgICAiU0lHVFNUUCIsICAgLyogMjAsIEtleWJvYXJkIHN0b3AgKFBPU0lYKS4gICovCisgICAgIlNJR1RUSU4iLCAgIC8qIDIxLCBCYWNrZ3JvdW5kIHJlYWQgZnJvbSB0dHkgKFBPU0lYKS4gICovCisgICAgIlNJR1RUT1UiLCAgIC8qIDIyLCBCYWNrZ3JvdW5kIHdyaXRlIHRvIHR0eSAoUE9TSVgpLiAgKi8KKyAgICAiU0lHVVJHIiwgICAgLyogMjMsIFVyZ2VudCBjb25kaXRpb24gb24gc29ja2V0ICg0LjIgQlNEKS4gICovCisgICAgIlNJR1hDUFUiLCAgIC8qIDI0LCBDUFUgbGltaXQgZXhjZWVkZWQgKDQuMiBCU0QpLiAgKi8KKyAgICAiU0lHWEZTWiIsICAgLyogMjUsIEZpbGUgc2l6ZSBsaW1pdCBleGNlZWRlZCAoNC4yIEJTRCkuICAqLworICAgICJTSUdWVEFMUk0iLCAvKiAyNiwgVmlydHVhbCBhbGFybSBjbG9jayAoNC4yIEJTRCkuICAqLworICAgICJTSUdQUk9GIiwgICAvKiAyNywgUHJvZmlsaW5nIGFsYXJtIGNsb2NrICg0LjIgQlNEKS4gICovCisgICAgIlNJR1dJTkNIIiwgIC8qIDI4LCBXaW5kb3cgc2l6ZSBjaGFuZ2UgKDQuMyBCU0QsIFN1bikuICAqLworICAgICJTSUdJTyIsICAgICAvKiAyOSwgSS9PIG5vdyBwb3NzaWJsZSAoNC4yIEJTRCkuICAqLworICAgICJTSUdQV1IiLCAgICAvKiAzMCwgUG93ZXIgZmFpbHVyZSByZXN0YXJ0IChTeXN0ZW0gVikuICAqLworICAgICJTSUdTWVMiICAgICAvKiAzMSwgQmFkIHN5c3RlbSBjYWxsLiAgKi8KK307CisKK3ZvaWQgRW5naW5lOjppbml0KHZvaWQpCit7CisgICAgaWYgKCFtX3JlYWR5KSB7CisgICAgICAgIG11dGV4X2xvY2tlcl90IGxvY2tlcihtX2xvY2spOworCisgICAgICAgIGlmICghbV9yZWFkeSkgeworICAgICAgICAgICAgLy8gc3RhcnQgcHJvY2VzcyBpZiBub3QgZG9uZSB5ZXQKKyAgICAgICAgICAgIGlmIChtX3Byb2Nlc3MgPT0gMCkgeworICAgICAgICAgICAgICAgIGluaXRfcHJvY2VzcygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBsb2FkIHBlbmdpbmcgaW1hZ2VzCisgICAgICAgICAgICBsb2FkX2xpYnJhcmllcygpOworCisgICAgICAgICAgICAvLyBhbmQgKHJlKWJ1aWxkIHBvaW50ZXIgdGFibGUKKyAgICAgICAgICAgIGluaXRfcHRyX2RhdGEoKTsKKworICAgICAgICAgICAgLy8gaXQgaXMgcmVhZHkgbm93CisgICAgICAgICAgICBtX3JlYWR5ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBFbmdpbmU6OmluaXRfcHJvY2Vzcyh2b2lkKQoreworICAgIENPSUVOR0lORSBlbmdpbmU7CisgICAgQ09JUkVTVUxUIHJlczsKKyAgICBjb25zdCBjaGFyICoqZW52aXJvbjsKKworICAgIC8vIGNyZWF0ZSBlbnZpcm9ubWVudCBmb3IgdGhlIHRhcmdldCBwcm9jZXNzCisgICAgZW52aXJvbiA9IChjb25zdCBjaGFyKiopIG1pY19lbnZfdmFycy5jcmVhdGVfZW52aXJvbl9mb3JfY2FyZChtX2luZGV4KTsKKyAgICBpZiAoZW52aXJvbiAhPSAwKSB7CisgICAgICAgIGZvciAoY29uc3QgY2hhciAqKnAgPSBlbnZpcm9uOyAqcCAhPSAwOyBwKyspIHsKKyAgICAgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIkVudiBWYXIgZm9yIGNhcmQgJWQ6ICVzXG4iLCBtX2luZGV4LCAqcCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDcmVhdGUgZXhlY3V0aW9uIGNvbnRleHQgaW4gdGhlIHNwZWNpZmllZCBkZXZpY2UKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJHZXR0aW5nIGRldmljZSAlZCAoZW5naW5lICVkKSBoYW5kbGVcbiIsIG1faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICBtX3BoeXNpY2FsX2luZGV4KTsKKyAgICByZXMgPSBDT0k6OkVuZ2luZUdldEhhbmRsZShDT0lfSVNBX0tOQywgbV9waHlzaWNhbF9pbmRleCwgJmVuZ2luZSk7CisgICAgY2hlY2tfcmVzdWx0KHJlcywgY19nZXRfZW5naW5lX2hhbmRsZSwgbV9pbmRleCwgcmVzKTsKKworICAgIC8vIFRhcmdldCBleGVjdXRhYmxlIHNob3VsZCBiZSBhdmFpbGFibGUgYnkgdGhlIHRpbWUgd2hlbiB3ZQorICAgIC8vIGF0dGVtcHQgdG8gaW5pdGlhbGl6ZSB0aGUgZGV2aWNlCisgICAgaWYgKF9fdGFyZ2V0X2V4ZSA9PSAwKSB7CisgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19ub190YXJnZXRfZXhlKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsCisgICAgICAgICJMb2FkaW5nIHRhcmdldCBleGVjdXRhYmxlIFwiJXNcIiBmcm9tICVwLCBzaXplICVsbGRcbiIsCisgICAgICAgIF9fdGFyZ2V0X2V4ZS0+bmFtZSwgX190YXJnZXRfZXhlLT5kYXRhLCBfX3RhcmdldF9leGUtPnNpemUpOworCisgICAgcmVzID0gQ09JOjpQcm9jZXNzQ3JlYXRlRnJvbU1lbW9yeSgKKyAgICAgICAgZW5naW5lLCAgICAgICAgICAgICAgICAgLy8gaW5fRW5naW5lCisgICAgICAgIF9fdGFyZ2V0X2V4ZS0+bmFtZSwgICAgIC8vIGluX3BCaW5hcnlOYW1lCisgICAgICAgIF9fdGFyZ2V0X2V4ZS0+ZGF0YSwgICAgIC8vIGluX3BCaW5hcnlCdWZmZXIKKyAgICAgICAgX190YXJnZXRfZXhlLT5zaXplLCAgICAgLy8gaW5fQmluYXJ5QnVmZmVyTGVuZ3RoLAorICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvLyBpbl9BcmdjCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8vIGluX3BwQXJndgorICAgICAgICBlbnZpcm9uID09IDAsICAgICAgICAgICAvLyBpbl9EdXBFbnYKKyAgICAgICAgZW52aXJvbiwgICAgICAgICAgICAgICAgLy8gaW5fcHBBZGRpdGlvbmFsRW52CisgICAgICAgIG1pY19wcm94eV9pbywgICAgICAgICAgIC8vIGluX1Byb3h5QWN0aXZlCisgICAgICAgIG1pY19wcm94eV9mc19yb290LCAgICAgIC8vIGluX1Byb3h5ZnNSb290CisgICAgICAgIG1pY19idWZmZXJfc2l6ZSwgICAgICAgIC8vIGluX0J1ZmZlclNwYWNlCisgICAgICAgIG1pY19saWJyYXJ5X3BhdGgsICAgICAgIC8vIGluX0xpYnJhcnlTZWFyY2hQYXRoCisgICAgICAgIF9fdGFyZ2V0X2V4ZS0+b3JpZ2luLCAgIC8vIGluX0ZpbGVPZk9yaWdpbgorICAgICAgICBfX3RhcmdldF9leGUtPm9mZnNldCwgICAvLyBpbl9GaWxlT2ZPcmlnaW5PZmZzZXQKKyAgICAgICAgJm1fcHJvY2VzcyAgICAgICAgICAgICAgLy8gb3V0X3BQcm9jZXNzCisgICAgKTsKKyAgICBjaGVja19yZXN1bHQocmVzLCBjX3Byb2Nlc3NfY3JlYXRlLCBtX2luZGV4LCByZXMpOworCisgICAgLy8gZ2V0IGZ1bmN0aW9uIGhhbmRsZXMKKyAgICByZXMgPSBDT0k6OlByb2Nlc3NHZXRGdW5jdGlvbkhhbmRsZXMobV9wcm9jZXNzLCBjX2Z1bmNzX3RvdGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2Z1bmNfbmFtZXMsIG1fZnVuY3MpOworICAgIGNoZWNrX3Jlc3VsdChyZXMsIGNfcHJvY2Vzc19nZXRfZnVuY19oYW5kbGVzLCBtX2luZGV4LCByZXMpOworCisgICAgLy8gaW5pdGlhbGl6ZSBkZXZpY2Ugc2lkZQorICAgIHBpZF90IHBpZCA9IGluaXRfZGV2aWNlKCk7CisKKyAgICAvLyBGb3IgSURCCisgICAgaWYgKF9fZGJnX2lzX2F0dGFjaGVkKSB7CisgICAgICAgIC8vIFRPRE86IHdlIGhhdmUgaW4tbWVtb3J5IGV4ZWN1dGFibGUgbm93LgorICAgICAgICAvLyBDaGVjayB3aXRoIElEQiB0ZWFtIHdoYXQgc2hvdWxkIHdlIHByb3ZpZGUgdGhlbSBub3c/CisgICAgICAgIGlmIChzdHJsZW4oX190YXJnZXRfZXhlLT5uYW1lKSA8IE1BWF9UQVJHRVRfTkFNRSkgeworICAgICAgICAgICAgc3RyY3B5KF9fZGJnX3RhcmdldF9leGVfbmFtZSwgX190YXJnZXRfZXhlLT5uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBfX2RiZ190YXJnZXRfc29fcGlkID0gcGlkOworICAgICAgICBfX2RiZ190YXJnZXRfaWQgPSBtX3BoeXNpY2FsX2luZGV4OworICAgICAgICBfX2RiZ190YXJnZXRfc29fbG9hZGVkKCk7CisgICAgfQorfQorCit2b2lkIEVuZ2luZTo6ZmluaV9wcm9jZXNzKGJvb2wgdmVyYm9zZSkKK3sKKyAgICBpZiAobV9wcm9jZXNzICE9IDApIHsKKyAgICAgICAgdWludDMyX3Qgc2lnOworICAgICAgICBpbnQ4X3QgcmV0OworCisgICAgICAgIC8vIGRlc3Ryb3kgdGFyZ2V0IHByb2Nlc3MKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRGVzdHJveWluZyBwcm9jZXNzIG9uIHRoZSBkZXZpY2UgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbmRleCk7CisKKyAgICAgICAgQ09JUkVTVUxUIHJlcyA9IENPSTo6UHJvY2Vzc0Rlc3Ryb3kobV9wcm9jZXNzLCAtMSwgMCwgJnJldCwgJnNpZyk7CisgICAgICAgIG1fcHJvY2VzcyA9IDA7CisKKyAgICAgICAgaWYgKHJlcyA9PSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiRGV2aWNlIHByb2Nlc3M6IHNpZ25hbCAlZCwgZXhpdCBjb2RlICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWcsIHJldCk7CisgICAgICAgICAgICBpZiAodmVyYm9zZSkgeworICAgICAgICAgICAgICAgIGlmIChzaWcgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKAorICAgICAgICAgICAgICAgICAgICAgICAgY19taWNfcHJvY2Vzc19leGl0X3NpZywgbV9pbmRleCwgc2lnLAorICAgICAgICAgICAgICAgICAgICAgICAgY19zaWduYWxfbmFtZXNbc2lnID49IGNfc2lnbmFsX21heCA/IDAgOiBzaWddKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19taWNfcHJvY2Vzc19leGl0X3JldCwgbV9pbmRleCwgcmV0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGZvciBpZGIKKyAgICAgICAgICAgIGlmIChfX2RiZ19pc19hdHRhY2hlZCkgeworICAgICAgICAgICAgICAgIF9fZGJnX3RhcmdldF9zb191bmxvYWRlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfbWljX3Byb2Nlc3NfZXhpdCwgbV9pbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgRW5naW5lOjpsb2FkX2xpYnJhcmllcygpCit7CisgICAgLy8gbG9hZCBsaWJyYXJpZXMgY29sbGVjdGVkIHNvIGZhcgorICAgIGZvciAoVGFyZ2V0SW1hZ2VMaXN0OjppdGVyYXRvciBpdCA9IG1faW1hZ2VzLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSBtX2ltYWdlcy5lbmQoKTsgaXQrKykgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJMb2FkaW5nIGxpYnJhcnkgXCIlc1wiIGZyb20gJXAsIHNpemUgJWxsdVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdC0+bmFtZSwgaXQtPmRhdGEsIGl0LT5zaXplKTsKKworICAgICAgICAvLyBsb2FkIGxpYnJhcnkgdG8gdGhlIGRldmljZQorICAgICAgICBDT0lMSUJSQVJZIGxpYjsKKyAgICAgICAgQ09JUkVTVUxUIHJlczsKKyAgICAgICAgcmVzID0gQ09JOjpQcm9jZXNzTG9hZExpYnJhcnlGcm9tTWVtb3J5KG1fcHJvY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0LT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQtPnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdC0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pY19saWJyYXJ5X3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdC0+b3JpZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQtPm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9MT0FETElCUkFSWV9WMV9GTEFHUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsaWIpOworCisgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MgJiYgcmVzICE9IENPSV9BTFJFQURZX0VYSVNUUykgeworICAgICAgICAgICAgY2hlY2tfcmVzdWx0KHJlcywgY19sb2FkX2xpYnJhcnksIG1faW5kZXgsIHJlcyk7CisgICAgICAgIH0KKyAgICB9CisgICAgbV9pbWFnZXMuY2xlYXIoKTsKK30KKworc3RhdGljIGJvb2wgdGFyZ2V0X2VudHJ5X2NtcCgKKyAgICBjb25zdCBWYXJMaXN0OjpCdWZFbnRyeSAmbCwKKyAgICBjb25zdCBWYXJMaXN0OjpCdWZFbnRyeSAmcgorKQoreworICAgIGNvbnN0IGNoYXIgKmxfbmFtZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGwubmFtZSk7CisgICAgY29uc3QgY2hhciAqcl9uYW1lID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oci5uYW1lKTsKKyAgICByZXR1cm4gc3RyY21wKGxfbmFtZSwgcl9uYW1lKSA8IDA7Cit9CisKK3N0YXRpYyBib29sIGhvc3RfZW50cnlfY21wKAorICAgIGNvbnN0IFZhclRhYmxlOjpFbnRyeSAqbCwKKyAgICBjb25zdCBWYXJUYWJsZTo6RW50cnkgKnIKKykKK3sKKyAgICByZXR1cm4gc3RyY21wKGwtPm5hbWUsIHItPm5hbWUpIDwgMDsKK30KKwordm9pZCBFbmdpbmU6OmluaXRfcHRyX2RhdGEodm9pZCkKK3sKKyAgICBDT0lSRVNVTFQgcmVzOworICAgIENPSUVWRU5UIGV2ZW50OworCisgICAgLy8gUHJlcGFyZSB0YWJsZSBvZiBob3N0IGVudHJpZXMKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCBWYXJUYWJsZTo6RW50cnkqPiBob3N0X3RhYmxlKF9fb2ZmbG9hZF92YXJzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX29mZmxvYWRfdmFycy5lbmQoKSk7CisKKyAgICAvLyBubyBuZWVkIHRvIGRvIGFueXRoaW5nIGZ1cnRoZXIgaXMgaG9zdCB0YWJsZSBpcyBlbXB0eQorICAgIGlmIChob3N0X3RhYmxlLnNpemUoKSA8PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBHZXQgdmFyIHRhYmxlIGVudHJpZXMgZnJvbSB0aGUgdGFyZ2V0LgorICAgIC8vIEZpcnN0IHdlIG5lZWQgdG8gZ2V0IHNpemUgZm9yIHRoZSBidWZmZXIgdG8gY29weSBkYXRhCisgICAgc3RydWN0IHsKKyAgICAgICAgaW50NjRfdCBuZWxlbXM7CisgICAgICAgIGludDY0X3QgbGVuZ3RoOworICAgIH0gcGFyYW1zOworCisgICAgcmVzID0gQ09JOjpQaXBlbGluZVJ1bkZ1bmN0aW9uKGdldF9waXBlbGluZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2Z1bmNzW2NfZnVuY192YXJfdGFibGVfc2l6ZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMsIHNpemVvZihwYXJhbXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXZlbnQpOworICAgIGNoZWNrX3Jlc3VsdChyZXMsIGNfcGlwZWxpbmVfcnVuX2Z1bmMsIG1faW5kZXgsIHJlcyk7CisKKyAgICByZXMgPSBDT0k6OkV2ZW50V2FpdCgxLCAmZXZlbnQsIC0xLCAxLCAwLCAwKTsKKyAgICBjaGVja19yZXN1bHQocmVzLCBjX2V2ZW50X3dhaXQsIHJlcyk7CisKKyAgICBpZiAocGFyYW1zLmxlbmd0aCA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBjcmVhdGUgYnVmZmVyIGZvciB0YXJnZXQgZW50cmllcyBhbmQgY29weSBkYXRhIHRvIGhvc3QKKyAgICBDT0lCVUZGRVIgYnVmZmVyOworICAgIHJlcyA9IENPSTo6QnVmZmVyQ3JlYXRlKHBhcmFtcy5sZW5ndGgsIENPSV9CVUZGRVJfTk9STUFMLCAwLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtX3Byb2Nlc3MsICZidWZmZXIpOworICAgIGNoZWNrX3Jlc3VsdChyZXMsIGNfYnVmX2NyZWF0ZSwgbV9pbmRleCwgcmVzKTsKKworICAgIENPSV9BQ0NFU1NfRkxBR1MgZmxhZ3MgPSBDT0lfU0lOS19XUklURTsKKyAgICByZXMgPSBDT0k6OlBpcGVsaW5lUnVuRnVuY3Rpb24oZ2V0X3BpcGVsaW5lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZnVuY3NbY19mdW5jX3Zhcl90YWJsZV9jb3B5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgJmJ1ZmZlciwgJmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zLm5lbGVtcywgc2l6ZW9mKHBhcmFtcy5uZWxlbXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXZlbnQpOworICAgIGNoZWNrX3Jlc3VsdChyZXMsIGNfcGlwZWxpbmVfcnVuX2Z1bmMsIG1faW5kZXgsIHJlcyk7CisKKyAgICByZXMgPSBDT0k6OkV2ZW50V2FpdCgxLCAmZXZlbnQsIC0xLCAxLCAwLCAwKTsKKyAgICBjaGVja19yZXN1bHQocmVzLCBjX2V2ZW50X3dhaXQsIHJlcyk7CisKKyAgICAvLyBwYXRjaCBuYW1lcyBpbiB0YXJnZXQgZGF0YQorICAgIFZhckxpc3Q6OkJ1ZkVudHJ5ICp0YXJnZXRfdGFibGU7CisgICAgQ09JTUFQSU5TVEFOQ0UgbWFwX2luc3Q7CisgICAgcmVzID0gQ09JOjpCdWZmZXJNYXAoYnVmZmVyLCAwLCBwYXJhbXMubGVuZ3RoLCBDT0lfTUFQX1JFQURfT05MWSwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAwLCAmbWFwX2luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkKio+KCZ0YXJnZXRfdGFibGUpKTsKKyAgICBjaGVja19yZXN1bHQocmVzLCBjX2J1Zl9tYXAsIHJlcyk7CisKKyAgICBWYXJMaXN0Ojp0YWJsZV9wYXRjaF9uYW1lcyh0YXJnZXRfdGFibGUsIHBhcmFtcy5uZWxlbXMpOworCisgICAgLy8gYW5kIHNvcnQgZW50cmllcworICAgIHN0ZDo6c29ydCh0YXJnZXRfdGFibGUsIHRhcmdldF90YWJsZSArIHBhcmFtcy5uZWxlbXMsIHRhcmdldF9lbnRyeV9jbXApOworICAgIHN0ZDo6c29ydChob3N0X3RhYmxlLmJlZ2luKCksIGhvc3RfdGFibGUuZW5kKCksIGhvc3RfZW50cnlfY21wKTsKKworICAgIC8vIG1lcmdlIGhvc3QgYW5kIHRhcmdldCBlbnRyaWVzIGFuZCBlbnRlciBtYXRjaGluZyB2YXJzIG1hcAorICAgIHN0ZDo6dmVjdG9yPGNvbnN0IFZhclRhYmxlOjpFbnRyeSo+Ojpjb25zdF9pdGVyYXRvciBoaSA9CisgICAgICAgIGhvc3RfdGFibGUuYmVnaW4oKTsKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCBWYXJUYWJsZTo6RW50cnkqPjo6Y29uc3RfaXRlcmF0b3IgaGUgPQorICAgICAgICBob3N0X3RhYmxlLmVuZCgpOworICAgIGNvbnN0IFZhckxpc3Q6OkJ1ZkVudHJ5ICp0aSA9IHRhcmdldF90YWJsZTsKKyAgICBjb25zdCBWYXJMaXN0OjpCdWZFbnRyeSAqdGUgPSB0YXJnZXRfdGFibGUgKyBwYXJhbXMubmVsZW1zOworCisgICAgd2hpbGUgKGhpICE9IGhlICYmIHRpICE9IHRlKSB7CisgICAgICAgIGludCByZXMgPSBzdHJjbXAoKCpoaSktPm5hbWUsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHRpLT5uYW1lKSk7CisgICAgICAgIGlmIChyZXMgPT0gMCkgeworICAgICAgICAgICAgLy8gYWRkIG1hdGNoaW5nIGVudHJ5IHRvIHZhciBtYXAKKyAgICAgICAgICAgIHN0ZDo6cGFpcjxQdHJTZXQ6Oml0ZXJhdG9yLCBib29sPiByZXMgPQorICAgICAgICAgICAgICAgIG1fcHRyX3NldC5pbnNlcnQoUHRyRGF0YSgoKmhpKS0+YWRkciwgKCpoaSktPnNpemUpKTsKKworICAgICAgICAgICAgLy8gc3RvcmUgYWRkcmVzcyBmb3IgbmV3IGVudHJpZXMKKyAgICAgICAgICAgIGlmIChyZXMuc2Vjb25kKSB7CisgICAgICAgICAgICAgICAgUHRyRGF0YSAqcHRyID0gY29uc3RfY2FzdDxQdHJEYXRhKj4ocmVzLmZpcnN0Lm9wZXJhdG9yLT4oKSk7CisgICAgICAgICAgICAgICAgcHRyLT5taWNfYWRkciA9IHRpLT5hZGRyOworICAgICAgICAgICAgICAgIHB0ci0+aXNfc3RhdGljID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaGkrKzsKKyAgICAgICAgICAgIHRpKys7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocmVzIDwgMCkgeworICAgICAgICAgICAgaGkrKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHRpKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBjbGVhbnVwCisgICAgcmVzID0gQ09JOjpCdWZmZXJVbm1hcChtYXBfaW5zdCwgMCwgMCwgMCk7CisgICAgY2hlY2tfcmVzdWx0KHJlcywgY19idWZfdW5tYXAsIHJlcyk7CisKKyAgICByZXMgPSBDT0k6OkJ1ZmZlckRlc3Ryb3koYnVmZmVyKTsKKyAgICBjaGVja19yZXN1bHQocmVzLCBjX2J1Zl9kZXN0cm95LCByZXMpOworfQorCitDT0lSRVNVTFQgRW5naW5lOjpjb21wdXRlKAorICAgIGNvbnN0IHN0ZDo6bGlzdDxDT0lCVUZGRVI+ICZidWZmZXJzLAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgZGF0YSwKKyAgICB1aW50MTZfdCAgICAgICAgICAgIGRhdGFfc2l6ZSwKKyAgICB2b2lkKiAgICAgICAgICAgICAgIHJldCwKKyAgICB1aW50MTZfdCAgICAgICAgICAgIHJldF9zaXplLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgbnVtX2RlcHMsCisgICAgY29uc3QgQ09JRVZFTlQqICAgICBkZXBzLAorICAgIENPSUVWRU5UKiAgICAgICAgICAgZXZlbnQKKykgLyogY29uc3QgKi8KK3sKKyAgICBDT0lCVUZGRVIgKmJ1ZnM7CisgICAgQ09JX0FDQ0VTU19GTEFHUyAqZmxhZ3M7CisgICAgQ09JUkVTVUxUIHJlczsKKworICAgIC8vIGNvbnZlcnQgYnVmZmVycyBsaXN0IHRvIGFycmF5CisgICAgaW50IG51bV9idWZzID0gYnVmZmVycy5zaXplKCk7CisgICAgaWYgKG51bV9idWZzID4gMCkgeworICAgICAgICBidWZzID0gKENPSUJVRkZFUiopIGFsbG9jYShudW1fYnVmcyAqIHNpemVvZihDT0lCVUZGRVIpKTsKKyAgICAgICAgZmxhZ3MgPSAoQ09JX0FDQ0VTU19GTEFHUyopIGFsbG9jYShudW1fYnVmcyAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKENPSV9BQ0NFU1NfRkxBR1MpKTsKKworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIGZvciAoc3RkOjpsaXN0PENPSUJVRkZFUj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYnVmZmVycy5iZWdpbigpOworICAgICAgICAgICAgIGl0ICE9IGJ1ZmZlcnMuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgICAgIGJ1ZnNbaV0gPSAqaXQ7CisKKyAgICAgICAgICAgIC8vIFRPRE86IHRoaXMgc2hvdWxkIGJlIGZpeGVkCisgICAgICAgICAgICBmbGFnc1tpKytdID0gQ09JX1NJTktfV1JJVEU7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGJ1ZnMgPSAwOworICAgICAgICBmbGFncyA9IDA7CisgICAgfQorCisgICAgLy8gc3RhcnQgY29tcHV0YXRpb24KKyAgICByZXMgPSBDT0k6OlBpcGVsaW5lUnVuRnVuY3Rpb24oZ2V0X3BpcGVsaW5lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZnVuY3NbY19mdW5jX2NvbXB1dGVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fYnVmcywgYnVmcywgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9kZXBzLCBkZXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCwgcmV0X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KTsKKyAgICByZXR1cm4gcmVzOworfQorCitwaWRfdCBFbmdpbmU6OmluaXRfZGV2aWNlKHZvaWQpCit7CisgICAgc3RydWN0IGluaXRfZGF0YSB7CisgICAgICAgIGludCAgZGV2aWNlX2luZGV4OworICAgICAgICBpbnQgIGRldmljZXNfdG90YWw7CisgICAgICAgIGludCAgY29uc29sZV9sZXZlbDsKKyAgICAgICAgaW50ICBvZmZsb2FkX3JlcG9ydF9sZXZlbDsKKyAgICB9IGRhdGE7CisgICAgQ09JUkVTVUxUIHJlczsKKyAgICBDT0lFVkVOVCBldmVudDsKKyAgICBwaWRfdCBwaWQ7CisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoMiwgMCwgY19vZmZsb2FkX2luaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJJbml0aWFsaXppbmcgZGV2aWNlIHdpdGggbG9naWNhbCBpbmRleCAlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmQgcGh5c2ljYWwgaW5kZXggJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luZGV4LCBtX3BoeXNpY2FsX2luZGV4KTsKKworICAgIC8vIHNldHVwIG1pc2MgZGF0YQorICAgIGRhdGEuZGV2aWNlX2luZGV4ID0gbV9pbmRleDsKKyAgICBkYXRhLmRldmljZXNfdG90YWwgPSBtaWNfZW5naW5lc190b3RhbDsKKyAgICBkYXRhLmNvbnNvbGVfbGV2ZWwgPSBjb25zb2xlX2VuYWJsZWQ7CisgICAgZGF0YS5vZmZsb2FkX3JlcG9ydF9sZXZlbCA9IG9mZmxvYWRfcmVwb3J0X2xldmVsOworCisgICAgcmVzID0gQ09JOjpQaXBlbGluZVJ1bkZ1bmN0aW9uKGdldF9waXBlbGluZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2Z1bmNzW2NfZnVuY19pbml0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEsIHNpemVvZihkYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBpZCwgc2l6ZW9mKHBpZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZldmVudCk7CisgICAgY2hlY2tfcmVzdWx0KHJlcywgY19waXBlbGluZV9ydW5fZnVuYywgbV9pbmRleCwgcmVzKTsKKworICAgIHJlcyA9IENPSTo6RXZlbnRXYWl0KDEsICZldmVudCwgLTEsIDEsIDAsIDApOworICAgIGNoZWNrX3Jlc3VsdChyZXMsIGNfZXZlbnRfd2FpdCwgcmVzKTsKKworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkRldmljZSBwcm9jZXNzIHBpZCBpcyAlZFxuIiwgcGlkKTsKKworICAgIHJldHVybiBwaWQ7Cit9CisKKy8vIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGVhY2ggdGhyZWFkCitzdHJ1Y3QgVGhyZWFkIHsKKyAgICBUaHJlYWQobG9uZyogYWRkcl9jb2lwaXBlX2NvdW50ZXIpIHsKKyAgICAgICAgbV9hZGRyX2NvaXBpcGVfY291bnRlciA9IGFkZHJfY29pcGlwZV9jb3VudGVyOworICAgICAgICBtZW1zZXQobV9waXBlbGluZXMsIDAsIHNpemVvZihtX3BpcGVsaW5lcykpOworICAgIH0KKworICAgIH5UaHJlYWQoKSB7CisjaWZuZGVmIFRBUkdFVF9XSU5OVAorICAgICAgICBfX3N5bmNfc3ViX2FuZF9mZXRjaChtX2FkZHJfY29pcGlwZV9jb3VudGVyLCAxKTsKKyNlbHNlIC8vIFRBUkdFVF9XSU5OVAorICAgICAgICBfSW50ZXJsb2NrZWREZWNyZW1lbnQobV9hZGRyX2NvaXBpcGVfY291bnRlcik7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWljX2VuZ2luZXNfdG90YWw7IGkrKykgeworICAgICAgICAgICAgaWYgKG1fcGlwZWxpbmVzW2ldICE9IDApIHsKKyAgICAgICAgICAgICAgICBDT0k6OlBpcGVsaW5lRGVzdHJveShtX3BpcGVsaW5lc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBDT0lQSVBFTElORSBnZXRfcGlwZWxpbmUoaW50IGluZGV4KSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX3BpcGVsaW5lc1tpbmRleF07CisgICAgfQorCisgICAgdm9pZCBzZXRfcGlwZWxpbmUoaW50IGluZGV4LCBDT0lQSVBFTElORSBwaXBlbGluZSkgeworICAgICAgICBtX3BpcGVsaW5lc1tpbmRleF0gPSBwaXBlbGluZTsKKyAgICB9CisKKyAgICBBdXRvU2V0JiBnZXRfYXV0b192YXJzKCkgeworICAgICAgICByZXR1cm4gbV9hdXRvX3ZhcnM7CisgICAgfQorCitwcml2YXRlOgorICAgIGxvbmcqICAgICAgIG1fYWRkcl9jb2lwaXBlX2NvdW50ZXI7CisgICAgQXV0b1NldCAgICAgbV9hdXRvX3ZhcnM7CisgICAgQ09JUElQRUxJTkUgbV9waXBlbGluZXNbTUlDX0VOR0lORVNfTUFYXTsKK307CisKK0NPSVBJUEVMSU5FIEVuZ2luZTo6Z2V0X3BpcGVsaW5lKHZvaWQpCit7CisgICAgVGhyZWFkKiB0aHJlYWQgPSAoVGhyZWFkKikgdGhyZWFkX2dldHNwZWNpZmljKG1pY190aHJlYWRfa2V5KTsKKyAgICBpZiAodGhyZWFkID09IDApIHsKKyAgICAgICAgdGhyZWFkID0gbmV3IFRocmVhZCgmbV9wcm9jX251bWJlcik7CisgICAgICAgIHRocmVhZF9zZXRzcGVjaWZpYyhtaWNfdGhyZWFkX2tleSwgdGhyZWFkKTsKKyAgICB9CisKKyAgICBDT0lQSVBFTElORSBwaXBlbGluZSA9IHRocmVhZC0+Z2V0X3BpcGVsaW5lKG1faW5kZXgpOworICAgIGlmIChwaXBlbGluZSA9PSAwKSB7CisgICAgICAgIENPSVJFU1VMVCByZXM7CisgICAgICAgIGludCBwcm9jX251bTsKKworI2lmbmRlZiBUQVJHRVRfV0lOTlQKKyAgICAgICAgcHJvY19udW0gPSBfX3N5bmNfZmV0Y2hfYW5kX2FkZCgmbV9wcm9jX251bWJlciwgMSk7CisjZWxzZSAvLyBUQVJHRVRfV0lOTlQKKyAgICAgICAgcHJvY19udW0gPSBfSW50ZXJsb2NrZWRJbmNyZW1lbnQoJm1fcHJvY19udW1iZXIpOworI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCisgICAgICAgIGlmIChwcm9jX251bSA+IENPSV9QSVBFTElORV9NQVhfUElQRUxJTkVTKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfY29pcGlwZV9tYXhfbnVtYmVyLCBDT0lfUElQRUxJTkVfTUFYX1BJUEVMSU5FUyk7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0FCT1JUOworICAgICAgICB9CisgICAgICAgIC8vIGNyZWF0ZSBwaXBlbGluZSBmb3IgdGhpcyB0aHJlYWQKKyAgICAgICAgcmVzID0gQ09JOjpQaXBlbGluZUNyZWF0ZShtX3Byb2Nlc3MsIDAsIG1pY19zdGFja19zaXplLCAmcGlwZWxpbmUpOworICAgICAgICBjaGVja19yZXN1bHQocmVzLCBjX3BpcGVsaW5lX2NyZWF0ZSwgbV9pbmRleCwgcmVzKTsKKworICAgICAgICB0aHJlYWQtPnNldF9waXBlbGluZShtX2luZGV4LCBwaXBlbGluZSk7CisgICAgfQorICAgIHJldHVybiBwaXBlbGluZTsKK30KKworQXV0b1NldCYgRW5naW5lOjpnZXRfYXV0b192YXJzKHZvaWQpCit7CisgICAgVGhyZWFkKiB0aHJlYWQgPSAoVGhyZWFkKikgdGhyZWFkX2dldHNwZWNpZmljKG1pY190aHJlYWRfa2V5KTsKKyAgICBpZiAodGhyZWFkID09IDApIHsKKyAgICAgICAgdGhyZWFkID0gbmV3IFRocmVhZCgmbV9wcm9jX251bWJlcik7CisgICAgICAgIHRocmVhZF9zZXRzcGVjaWZpYyhtaWNfdGhyZWFkX2tleSwgdGhyZWFkKTsKKyAgICB9CisKKyAgICByZXR1cm4gdGhyZWFkLT5nZXRfYXV0b192YXJzKCk7Cit9CisKK3ZvaWQgRW5naW5lOjpkZXN0cm95X3RocmVhZF9kYXRhKHZvaWQgKmRhdGEpCit7CisgICAgZGVsZXRlIHN0YXRpY19jYXN0PFRocmVhZCo+KGRhdGEpOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9lbmdpbmUuaCBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfZW5naW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFhOTYzMQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfZW5naW5lLmgKQEAgLTAsMCArMSw0ODIgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBPRkZMT0FEX0VOR0lORV9IX0lOQ0xVREVECisjZGVmaW5lIE9GRkxPQURfRU5HSU5FX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgIm9mZmxvYWRfY29tbW9uLmgiCisjaW5jbHVkZSAiY29pL2NvaV9jbGllbnQuaCIKKworLy8gQWRkcmVzcyByYW5nZQorY2xhc3MgTWVtUmFuZ2UgeworcHVibGljOgorICAgIE1lbVJhbmdlKCkgOiBtX3N0YXJ0KDApLCBtX2xlbmd0aCgwKSB7fQorICAgIE1lbVJhbmdlKGNvbnN0IHZvaWQgKmFkZHIsIHVpbnQ2NF90IGxlbikgOiBtX3N0YXJ0KGFkZHIpLCBtX2xlbmd0aChsZW4pIHt9CisKKyAgICBjb25zdCB2b2lkKiBzdGFydCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fc3RhcnQ7CisgICAgfQorCisgICAgY29uc3Qgdm9pZCogZW5kKCkgY29uc3QgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KG1fc3RhcnQpICsgbV9sZW5ndGg7CisgICAgfQorCisgICAgdWludDY0X3QgbGVuZ3RoKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9sZW5ndGg7CisgICAgfQorCisgICAgLy8gcmV0dXJucyB0cnVlIGlmIGdpdmVuIHJhbmdlIG92ZXJsYXBzIHdpdGggYW5vdGhlciBvbmUKKyAgICBib29sIG92ZXJsYXBzKGNvbnN0IE1lbVJhbmdlICZvKSBjb25zdCB7CisgICAgICAgIC8vIFR3byBhZGRyZXNzIHJhbmdlcyBBW3N0YXJ0LCBlbmQpIGFuZCBCW3N0YXJ0LGVuZCkgb3ZlcmxhcAorICAgICAgICAvLyBpZiBBLnN0YXJ0IDwgQi5lbmQgYW5kIEEuZW5kID4gQi5zdGFydC4KKyAgICAgICAgcmV0dXJuIHN0YXJ0KCkgPCBvLmVuZCgpICYmIGVuZCgpID4gby5zdGFydCgpOworICAgIH0KKworICAgIC8vIHJldHVybnMgdHJ1ZSBpZiBnaXZlbiByYW5nZSBjb250YWlucyB0aGUgb3RoZXIgcmFuZ2UKKyAgICBib29sIGNvbnRhaW5zKGNvbnN0IE1lbVJhbmdlICZvKSBjb25zdCB7CisgICAgICAgIHJldHVybiBzdGFydCgpIDw9IG8uc3RhcnQoKSAmJiBvLmVuZCgpIDw9IGVuZCgpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBjb25zdCB2b2lkKiBtX3N0YXJ0OworICAgIHVpbnQ2NF90ICAgIG1fbGVuZ3RoOworfTsKKworLy8gRGF0YSBhc3NvY2lhdGVkIHdpdGggYSBwb2ludGVyIHZhcmlhYmxlCitjbGFzcyBQdHJEYXRhIHsKK3B1YmxpYzoKKyAgICBQdHJEYXRhKGNvbnN0IHZvaWQgKmFkZHIsIHVpbnQ2NF90IGxlbikgOgorICAgICAgICBjcHVfYWRkcihhZGRyLCBsZW4pLCBjcHVfYnVmKDApLAorICAgICAgICBtaWNfYWRkcigwKSwgYWxsb2NfZGlzcCgwKSwgbWljX2J1ZigwKSwgbWljX29mZnNldCgwKSwKKyAgICAgICAgcmVmX2NvdW50KDApLCBpc19zdGF0aWMoZmFsc2UpCisgICAge30KKworICAgIC8vCisgICAgLy8gQ29weSBjb25zdHJ1Y3RvcgorICAgIC8vCisgICAgUHRyRGF0YShjb25zdCBQdHJEYXRhJiBwdHIpOgorICAgICAgICBjcHVfYWRkcihwdHIuY3B1X2FkZHIpLCBjcHVfYnVmKHB0ci5jcHVfYnVmKSwKKyAgICAgICAgbWljX2FkZHIocHRyLm1pY19hZGRyKSwgYWxsb2NfZGlzcChwdHIuYWxsb2NfZGlzcCksCisgICAgICAgIG1pY19idWYocHRyLm1pY19idWYpLCBtaWNfb2Zmc2V0KHB0ci5taWNfb2Zmc2V0KSwKKyAgICAgICAgcmVmX2NvdW50KHB0ci5yZWZfY291bnQpLCBpc19zdGF0aWMocHRyLmlzX3N0YXRpYykKKyAgICB7fQorCisgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgUHRyRGF0YSAmbykgY29uc3QgeworICAgICAgICAvLyBWYXJpYWJsZXMgYXJlIHNvcnRlZCBieSB0aGUgQ1BVIHN0YXJ0IGFkZHJlc3MuCisgICAgICAgIC8vIE92ZXJsYXBwaW5nIG1lbW9yeSByYW5nZXMgYXJlIGNvbnNpZGVyZWQgZXF1YWwuCisgICAgICAgIHJldHVybiAoY3B1X2FkZHIuc3RhcnQoKSA8IG8uY3B1X2FkZHIuc3RhcnQoKSkgJiYKKyAgICAgICAgICAgICAgICFjcHVfYWRkci5vdmVybGFwcyhvLmNwdV9hZGRyKTsKKyAgICB9CisKKyAgICBsb25nIGFkZF9yZWZlcmVuY2UoKSB7CisgICAgICAgIGlmIChpc19zdGF0aWMpIHsKKyAgICAgICAgICAgIHJldHVybiBMT05HX01BWDsKKyAgICAgICAgfQorI2lmbmRlZiBUQVJHRVRfV0lOTlQKKyAgICAgICAgcmV0dXJuIF9fc3luY19mZXRjaF9hbmRfYWRkKCZyZWZfY291bnQsIDEpOworI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCisgICAgICAgIHJldHVybiBfSW50ZXJsb2NrZWRJbmNyZW1lbnQoJnJlZl9jb3VudCkgLSAxOworI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorICAgIH0KKworICAgIGxvbmcgcmVtb3ZlX3JlZmVyZW5jZSgpIHsKKyAgICAgICAgaWYgKGlzX3N0YXRpYykgeworICAgICAgICAgICAgcmV0dXJuIExPTkdfTUFYOworICAgICAgICB9CisjaWZuZGVmIFRBUkdFVF9XSU5OVAorICAgICAgICByZXR1cm4gX19zeW5jX3N1Yl9hbmRfZmV0Y2goJnJlZl9jb3VudCwgMSk7CisjZWxzZSAvLyBUQVJHRVRfV0lOTlQKKyAgICAgICAgcmV0dXJuIF9JbnRlcmxvY2tlZERlY3JlbWVudCgmcmVmX2NvdW50KTsKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKyAgICB9CisKKyAgICBsb25nIGdldF9yZWZlcmVuY2UoKSBjb25zdCB7CisgICAgICAgIGlmIChpc19zdGF0aWMpIHsKKyAgICAgICAgICAgIHJldHVybiBMT05HX01BWDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVmX2NvdW50OworICAgIH0KKworcHVibGljOgorICAgIC8vIENQVSBhZGRyZXNzIHJhbmdlCisgICAgY29uc3QgTWVtUmFuZ2UgIGNwdV9hZGRyOworCisgICAgLy8gQ1BVIGFuZCBNSUMgYnVmZmVycworICAgIENPSUJVRkZFUiAgICAgICBjcHVfYnVmOworICAgIENPSUJVRkZFUiAgICAgICBtaWNfYnVmOworCisgICAgLy8gcGxhY2Vob2xkZXIgZm9yIGJ1ZmZlciBhZGRyZXNzIG9uIG1pYworICAgIHVpbnQ2NF90ICAgICAgICBtaWNfYWRkcjsKKworICAgIHVpbnQ2NF90ICAgICAgICBhbGxvY19kaXNwOworCisgICAgLy8gYWRkaXRpb25hbCBvZmZzZXQgdG8gcG9pbnRlciBkYXRhIG9uIE1JQyBmb3IgaW1wcm92aW5nIGJhbmR3aWR0aCBmb3IKKyAgICAvLyBkYXRhIHdoaWNoIGlzIG5vdCA0SyBhbGlnbmVkCisgICAgdWludDMyX3QgICAgICAgIG1pY19vZmZzZXQ7CisKKyAgICAvLyBpZiB0cnVlIGJ1ZmZlcnMgYXJlIGNyZWF0ZWQgZnJvbSBzdGF0aWMgbWVtb3J5CisgICAgYm9vbCAgICAgICAgICAgIGlzX3N0YXRpYzsKKyAgICBtdXRleF90ICAgICAgICAgYWxsb2NfcHRyX2RhdGFfbG9jazsKKworcHJpdmF0ZToKKyAgICAvLyByZWZlcmVuY2UgY291bnQgZm9yIHRoZSBlbnRyeQorICAgIGxvbmcgICAgICAgICAgICByZWZfY291bnQ7Cit9OworCit0eXBlZGVmIHN0ZDo6bGlzdDxQdHJEYXRhKj4gUHRyRGF0YUxpc3Q7CisKKy8vIERhdGEgYXNzb2NpYXRlZCB3aXRoIGF1dG9tYXRpYyB2YXJpYWJsZQorY2xhc3MgQXV0b0RhdGEgeworcHVibGljOgorICAgIEF1dG9EYXRhKGNvbnN0IHZvaWQgKmFkZHIsIHVpbnQ2NF90IGxlbikgOgorICAgICAgICBjcHVfYWRkcihhZGRyLCBsZW4pLCByZWZfY291bnQoMCkKKyAgICB7fQorCisgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgQXV0b0RhdGEgJm8pIGNvbnN0IHsKKyAgICAgICAgLy8gVmFyaWFibGVzIGFyZSBzb3J0ZWQgYnkgdGhlIENQVSBzdGFydCBhZGRyZXNzLgorICAgICAgICAvLyBPdmVybGFwcGluZyBtZW1vcnkgcmFuZ2VzIGFyZSBjb25zaWRlcmVkIGVxdWFsLgorICAgICAgICByZXR1cm4gKGNwdV9hZGRyLnN0YXJ0KCkgPCBvLmNwdV9hZGRyLnN0YXJ0KCkpICYmCisgICAgICAgICAgICAgICAhY3B1X2FkZHIub3ZlcmxhcHMoby5jcHVfYWRkcik7CisgICAgfQorCisgICAgbG9uZyBhZGRfcmVmZXJlbmNlKCkgeworI2lmbmRlZiBUQVJHRVRfV0lOTlQKKyAgICAgICAgcmV0dXJuIF9fc3luY19mZXRjaF9hbmRfYWRkKCZyZWZfY291bnQsIDEpOworI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCisgICAgICAgIHJldHVybiBfSW50ZXJsb2NrZWRJbmNyZW1lbnQoJnJlZl9jb3VudCkgLSAxOworI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorICAgIH0KKworICAgIGxvbmcgcmVtb3ZlX3JlZmVyZW5jZSgpIHsKKyNpZm5kZWYgVEFSR0VUX1dJTk5UCisgICAgICAgIHJldHVybiBfX3N5bmNfc3ViX2FuZF9mZXRjaCgmcmVmX2NvdW50LCAxKTsKKyNlbHNlIC8vIFRBUkdFVF9XSU5OVAorICAgICAgICByZXR1cm4gX0ludGVybG9ja2VkRGVjcmVtZW50KCZyZWZfY291bnQpOworI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorICAgIH0KKworICAgIGxvbmcgZ2V0X3JlZmVyZW5jZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHJlZl9jb3VudDsKKyAgICB9CisKK3B1YmxpYzoKKyAgICAvLyBDUFUgYWRkcmVzcyByYW5nZQorICAgIGNvbnN0IE1lbVJhbmdlIGNwdV9hZGRyOworCitwcml2YXRlOgorICAgIC8vIHJlZmVyZW5jZSBjb3VudCBmb3IgdGhlIGVudHJ5CisgICAgbG9uZyByZWZfY291bnQ7Cit9OworCisvLyBTZXQgb2YgYXV0aW1hdGljIHZhcmlhYmxlcwordHlwZWRlZiBzdGQ6OnNldDxBdXRvRGF0YT4gQXV0b1NldDsKKworLy8gVGFyZ2V0IGltYWdlIGRhdGEKK3N0cnVjdCBUYXJnZXRJbWFnZQoreworICAgIFRhcmdldEltYWdlKGNvbnN0IGNoYXIgKl9uYW1lLCBjb25zdCB2b2lkICpfZGF0YSwgdWludDY0X3QgX3NpemUsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqX29yaWdpbiwgdWludDY0X3QgX29mZnNldCkgOgorICAgICAgICBuYW1lKF9uYW1lKSwgZGF0YShfZGF0YSksIHNpemUoX3NpemUpLAorICAgICAgICBvcmlnaW4oX29yaWdpbiksIG9mZnNldChfb2Zmc2V0KQorICAgIHt9CisKKyAgICAvLyBsaWJyYXJ5IG5hbWUKKyAgICBjb25zdCBjaGFyKiBuYW1lOworCisgICAgLy8gY29udGVudHMgYW5kIHNpemUKKyAgICBjb25zdCB2b2lkKiBkYXRhOworICAgIHVpbnQ2NF90ICAgIHNpemU7CisKKyAgICAvLyBmaWxlIG9mIG9yaWdpbiBhbmQgb2Zmc2V0IHdpdGhpbiB0aGF0IGZpbGUKKyAgICBjb25zdCBjaGFyKiBvcmlnaW47CisgICAgdWludDY0X3QgICAgb2Zmc2V0OworfTsKKwordHlwZWRlZiBzdGQ6Omxpc3Q8VGFyZ2V0SW1hZ2U+IFRhcmdldEltYWdlTGlzdDsKKworLy8gRGF0YSBhc3NvY2lhdGVkIHdpdGggcGVyc2lzdGVudCBhdXRvIG9iamVjdHMKK3N0cnVjdCBQZXJzaXN0RGF0YQoreworICAgIFBlcnNpc3REYXRhKGNvbnN0IHZvaWQgKmFkZHIsIHVpbnQ2NF90IHJvdXRpbmVfbnVtLCB1aW50NjRfdCBzaXplKSA6CisgICAgICAgIHN0YWNrX2NwdV9hZGRyKGFkZHIpLCByb3V0aW5lX2lkKHJvdXRpbmVfbnVtKQorICAgIHsKKyAgICAgICAgc3RhY2tfcHRyX2RhdGEgPSBuZXcgUHRyRGF0YSgwLCBzaXplKTsKKyAgICB9CisgICAgLy8gMS1zdCBrZXkgdmFsdWUgLSBiZWdpbm5pbmcgb2YgdGhlIHN0YWNrIGF0IENQVQorICAgIGNvbnN0IHZvaWQgKiAgIHN0YWNrX2NwdV9hZGRyOworICAgIC8vIDItbmQga2V5IHZhbHVlIC0gaWRlbnRpZmllciBvZiByb3V0aW5lIGludm9jYXRpb24gYXQgQ1BVCisgICAgdWludDY0X3QgICByb3V0aW5lX2lkOworICAgIC8vIGNvcnJlc3BvbmRlZCBQdHJEYXRhOyBvbmx5IHN0YWNrX3B0cl9kYXRhLT5taWNfYnVmIGlzIHVzZWQKKyAgICBQdHJEYXRhICogc3RhY2tfcHRyX2RhdGE7CisgICAgLy8gdXNlZCB0byBnZXQgb2Zmc2V0IG9mIHRoZSB2YXJpYWJsZSBpbiBzdGFjayBidWZmZXIKKyAgICBjaGFyICogY3B1X3N0YWNrX2FkZHI7Cit9OworCit0eXBlZGVmIHN0ZDo6bGlzdDxQZXJzaXN0RGF0YT4gUGVyc2lzdERhdGFMaXN0OworCisvLyBjbGFzcyByZXByZXNlbnRpbmcgYSBzaW5nbGUgZW5naW5lCitzdHJ1Y3QgRW5naW5lIHsKKyAgICBmcmllbmQgdm9pZCBfX29mZmxvYWRfaW5pdF9saWJyYXJ5X29uY2Uodm9pZCk7CisgICAgZnJpZW5kIHZvaWQgX19vZmZsb2FkX2ZpbmlfbGlicmFyeSh2b2lkKTsKKworI2RlZmluZSBjaGVja19yZXN1bHQocmVzLCB0YWcsIC4uLikgXAorICAgIHsgXAorICAgICAgICBpZiAocmVzID09IENPSV9QUk9DRVNTX0RJRUQpIHsgXAorICAgICAgICAgICAgZmluaV9wcm9jZXNzKHRydWUpOyBcCisgICAgICAgICAgICBleGl0KDEpOyBcCisgICAgICAgIH0gXAorICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7IFwKKyAgICAgICAgICAgIF9fbGlib2ZmbG9hZF9lcnJvcl9zdXBwb3J0KHRhZywgX19WQV9BUkdTX18pOyBcCisgICAgICAgICAgICBleGl0KDEpOyBcCisgICAgICAgIH0gXAorICAgIH0KKworICAgIGludCBnZXRfbG9naWNhbF9pbmRleCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1faW5kZXg7CisgICAgfQorCisgICAgaW50IGdldF9waHlzaWNhbF9pbmRleCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fcGh5c2ljYWxfaW5kZXg7CisgICAgfQorCisgICAgY29uc3QgQ09JUFJPQ0VTUyYgZ2V0X3Byb2Nlc3MoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX3Byb2Nlc3M7CisgICAgfQorCisgICAgLy8gaW5pdGlhbGl6ZSBkZXZpY2UKKyAgICB2b2lkIGluaXQodm9pZCk7CisKKyAgICAvLyBhZGQgbmV3IGxpYnJhcnkKKyAgICB2b2lkIGFkZF9saWIoY29uc3QgVGFyZ2V0SW1hZ2UgJmxpYikKKyAgICB7CisgICAgICAgIG1fbG9jay5sb2NrKCk7CisgICAgICAgIG1fcmVhZHkgPSBmYWxzZTsKKyAgICAgICAgbV9pbWFnZXMucHVzaF9iYWNrKGxpYik7CisgICAgICAgIG1fbG9jay51bmxvY2soKTsKKyAgICB9CisKKyAgICBDT0lSRVNVTFQgY29tcHV0ZSgKKyAgICAgICAgY29uc3Qgc3RkOjpsaXN0PENPSUJVRkZFUj4gJmJ1ZmZlcnMsCisgICAgICAgIGNvbnN0IHZvaWQqICAgICAgICAgZGF0YSwKKyAgICAgICAgdWludDE2X3QgICAgICAgICAgICBkYXRhX3NpemUsCisgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgcmV0LAorICAgICAgICB1aW50MTZfdCAgICAgICAgICAgIHJldF9zaXplLAorICAgICAgICB1aW50MzJfdCAgICAgICAgICAgIG51bV9kZXBzLAorICAgICAgICBjb25zdCBDT0lFVkVOVCogICAgIGRlcHMsCisgICAgICAgIENPSUVWRU5UKiAgICAgICAgICAgZXZlbnQKKyAgICApOworCisjaWZkZWYgTVlPX1NVUFBPUlQKKyAgICAvLyB0ZW1wb3Jhcnkgd29ya2Fyb3VuZCBmb3IgYmxvY2tpbmcgYmVoYXZpb3IgZm9yIG15b2lMaWJJbml0L0ZpbmkgY2FsbHMKKyAgICB2b2lkIGluaXRfbXlvKENPSUVWRU5UICpldmVudCkgeworICAgICAgICBDT0lSRVNVTFQgcmVzOworICAgICAgICByZXMgPSBDT0k6OlBpcGVsaW5lUnVuRnVuY3Rpb24oZ2V0X3BpcGVsaW5lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2Z1bmNzW2NfZnVuY19teW9faW5pdF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQpOworICAgICAgICBjaGVja19yZXN1bHQocmVzLCBjX3BpcGVsaW5lX3J1bl9mdW5jLCBtX2luZGV4LCByZXMpOworICAgIH0KKworICAgIHZvaWQgZmluaV9teW8oQ09JRVZFTlQgKmV2ZW50KSB7CisgICAgICAgIENPSVJFU1VMVCByZXM7CisgICAgICAgIHJlcyA9IENPSTo6UGlwZWxpbmVSdW5GdW5jdGlvbihnZXRfcGlwZWxpbmUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZnVuY3NbY19mdW5jX215b19maW5pXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7CisgICAgICAgIGNoZWNrX3Jlc3VsdChyZXMsIGNfcGlwZWxpbmVfcnVuX2Z1bmMsIG1faW5kZXgsIHJlcyk7CisgICAgfQorI2VuZGlmIC8vIE1ZT19TVVBQT1JUCisKKyAgICAvLworICAgIC8vIE1lbW9yeSBhc3NvY2lhdGlvbiB0YWJsZQorICAgIC8vCisgICAgUHRyRGF0YSogZmluZF9wdHJfZGF0YShjb25zdCB2b2lkICpwdHIpIHsKKyAgICAgICAgbV9wdHJfbG9jay5sb2NrKCk7CisgICAgICAgIFB0clNldDo6aXRlcmF0b3IgcmVzID0gbV9wdHJfc2V0LmZpbmQoUHRyRGF0YShwdHIsIDApKTsKKyAgICAgICAgbV9wdHJfbG9jay51bmxvY2soKTsKKyAgICAgICAgaWYgKHJlcyA9PSBtX3B0cl9zZXQuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb25zdF9jYXN0PFB0ckRhdGEqPihyZXMub3BlcmF0b3ItPigpKTsKKyAgICB9CisKKyAgICBQdHJEYXRhKiBpbnNlcnRfcHRyX2RhdGEoY29uc3Qgdm9pZCAqcHRyLCB1aW50NjRfdCBsZW4sIGJvb2wgJmlzX25ldykgeworICAgICAgICBtX3B0cl9sb2NrLmxvY2soKTsKKyAgICAgICAgc3RkOjpwYWlyPFB0clNldDo6aXRlcmF0b3IsIGJvb2w+IHJlcyA9CisgICAgICAgICAgICBtX3B0cl9zZXQuaW5zZXJ0KFB0ckRhdGEocHRyLCBsZW4pKTsKKyAgICAgICAgUHRyRGF0YSogcHRyX2RhdGEgPSBjb25zdF9jYXN0PFB0ckRhdGEqPihyZXMuZmlyc3Qub3BlcmF0b3ItPigpKTsKKyAgICAgICAgbV9wdHJfbG9jay51bmxvY2soKTsKKworICAgICAgICBpc19uZXcgPSByZXMuc2Vjb25kOworICAgICAgICBpZiAoaXNfbmV3KSB7CisgICAgICAgICAgICAvLyBJdCdzIG5lY2Vzc2FyeSB0byBsb2NrIGFzIHNvb24gYXMgcG9zc2libGUuCisgICAgICAgICAgICAvLyB1bmxvY2sgbXVzdCBiZSBkb25lIGF0IGNhbGwgc2l0ZSBvZiBpbnNlcnRfcHRyX2RhdGEgYXQKKyAgICAgICAgICAgIC8vIGJyYW5jaCBmb3IgaXNfbmV3CisgICAgICAgICAgICBwdHJfZGF0YS0+YWxsb2NfcHRyX2RhdGFfbG9jay5sb2NrKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHB0cl9kYXRhOworICAgIH0KKworICAgIHZvaWQgcmVtb3ZlX3B0cl9kYXRhKGNvbnN0IHZvaWQgKnB0cikgeworICAgICAgICBtX3B0cl9sb2NrLmxvY2soKTsKKyAgICAgICAgbV9wdHJfc2V0LmVyYXNlKFB0ckRhdGEocHRyLCAwKSk7CisgICAgICAgIG1fcHRyX2xvY2sudW5sb2NrKCk7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBBdXRvbWF0aWMgdmFyaWFibGVzCisgICAgLy8KKyAgICBBdXRvRGF0YSogZmluZF9hdXRvX2RhdGEoY29uc3Qgdm9pZCAqcHRyKSB7CisgICAgICAgIEF1dG9TZXQgJmF1dG9fdmFycyA9IGdldF9hdXRvX3ZhcnMoKTsKKyAgICAgICAgQXV0b1NldDo6aXRlcmF0b3IgcmVzID0gYXV0b192YXJzLmZpbmQoQXV0b0RhdGEocHRyLCAwKSk7CisgICAgICAgIGlmIChyZXMgPT0gYXV0b192YXJzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29uc3RfY2FzdDxBdXRvRGF0YSo+KHJlcy5vcGVyYXRvci0+KCkpOworICAgIH0KKworICAgIEF1dG9EYXRhKiBpbnNlcnRfYXV0b19kYXRhKGNvbnN0IHZvaWQgKnB0ciwgdWludDY0X3QgbGVuKSB7CisgICAgICAgIEF1dG9TZXQgJmF1dG9fdmFycyA9IGdldF9hdXRvX3ZhcnMoKTsKKyAgICAgICAgc3RkOjpwYWlyPEF1dG9TZXQ6Oml0ZXJhdG9yLCBib29sPiByZXMgPQorICAgICAgICAgICAgYXV0b192YXJzLmluc2VydChBdXRvRGF0YShwdHIsIGxlbikpOworICAgICAgICByZXR1cm4gY29uc3RfY2FzdDxBdXRvRGF0YSo+KHJlcy5maXJzdC5vcGVyYXRvci0+KCkpOworICAgIH0KKworICAgIHZvaWQgcmVtb3ZlX2F1dG9fZGF0YShjb25zdCB2b2lkICpwdHIpIHsKKyAgICAgICAgZ2V0X2F1dG9fdmFycygpLmVyYXNlKEF1dG9EYXRhKHB0ciwgMCkpOworICAgIH0KKworICAgIC8vCisgICAgLy8gU2lnbmFscworICAgIC8vCisgICAgdm9pZCBhZGRfc2lnbmFsKGNvbnN0IHZvaWQgKnNpZ25hbCwgT2ZmbG9hZERlc2NyaXB0b3IgKmRlc2MpIHsKKyAgICAgICAgbV9zaWduYWxfbG9jay5sb2NrKCk7CisgICAgICAgIG1fc2lnbmFsX21hcFtzaWduYWxdID0gZGVzYzsKKyAgICAgICAgbV9zaWduYWxfbG9jay51bmxvY2soKTsKKyAgICB9CisKKyAgICBPZmZsb2FkRGVzY3JpcHRvciogZmluZF9zaWduYWwoY29uc3Qgdm9pZCAqc2lnbmFsLCBib29sIHJlbW92ZSkgeworICAgICAgICBPZmZsb2FkRGVzY3JpcHRvciAqZGVzYyA9IDA7CisKKyAgICAgICAgbV9zaWduYWxfbG9jay5sb2NrKCk7CisgICAgICAgIHsKKyAgICAgICAgICAgIFNpZ25hbE1hcDo6aXRlcmF0b3IgaXQgPSBtX3NpZ25hbF9tYXAuZmluZChzaWduYWwpOworICAgICAgICAgICAgaWYgKGl0ICE9IG1fc2lnbmFsX21hcC5lbmQoKSkgeworICAgICAgICAgICAgICAgIGRlc2MgPSBpdC0+c2Vjb25kOworICAgICAgICAgICAgICAgIGlmIChyZW1vdmUpIHsKKyAgICAgICAgICAgICAgICAgICAgbV9zaWduYWxfbWFwLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbV9zaWduYWxfbG9jay51bmxvY2soKTsKKworICAgICAgICByZXR1cm4gZGVzYzsKKyAgICB9CisKKyAgICAvLyBzdG9wIGRldmljZSBwcm9jZXNzCisgICAgdm9pZCBmaW5pX3Byb2Nlc3MoYm9vbCB2ZXJib3NlKTsKKworICAgIC8vIGxpc3Qgb2Ygc3RhY2tzIGFjdGl2ZSBhdCB0aGUgZW5naW5lCisgICAgUGVyc2lzdERhdGFMaXN0IG1fcGVyc2lzdF9saXN0OworCitwcml2YXRlOgorICAgIEVuZ2luZSgpIDogbV9pbmRleCgtMSksIG1fcGh5c2ljYWxfaW5kZXgoLTEpLCBtX3Byb2Nlc3MoMCksIG1fcmVhZHkoZmFsc2UpLAorICAgICAgICAgICAgICAgbV9wcm9jX251bWJlcigwKQorICAgIHt9CisKKyAgICB+RW5naW5lKCkgeworICAgICAgICBpZiAobV9wcm9jZXNzICE9IDApIHsKKyAgICAgICAgICAgIGZpbmlfcHJvY2VzcyhmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBzZXQgaW5kZXhlcworICAgIHZvaWQgc2V0X2luZGV4ZXMoaW50IGxvZ2ljYWxfaW5kZXgsIGludCBwaHlzaWNhbF9pbmRleCkgeworICAgICAgICBtX2luZGV4ID0gbG9naWNhbF9pbmRleDsKKyAgICAgICAgbV9waHlzaWNhbF9pbmRleCA9IHBoeXNpY2FsX2luZGV4OworICAgIH0KKworICAgIC8vIHN0YXJ0IHByb2Nlc3Mgb24gZGV2aWNlCisgICAgdm9pZCBpbml0X3Byb2Nlc3MoKTsKKworICAgIHZvaWQgbG9hZF9saWJyYXJpZXModm9pZCk7CisgICAgdm9pZCBpbml0X3B0cl9kYXRhKHZvaWQpOworCisgICAgLy8gcGVyZm9ybXMgbGlicmFyeSBpbnRpYWxpemF0aW9uIG9uIHRoZSBkZXZpY2Ugc2lkZQorICAgIHBpZF90IGluaXRfZGV2aWNlKHZvaWQpOworCitwcml2YXRlOgorICAgIC8vIGdldCBwaXBlbGluZSBhc3NvY2lhdGVkIHdpdGggYSBjYWxsaW5nIHRocmVhZAorICAgIENPSVBJUEVMSU5FIGdldF9waXBlbGluZSh2b2lkKTsKKworICAgIC8vIGdldCBhdXRvbWF0aWMgdmFycyBzZXQgYXNzb2NpYXRlZCB3aXRoIHRoZSBjYWxsaW5nIHRocmVhZAorICAgIEF1dG9TZXQmIGdldF9hdXRvX3ZhcnModm9pZCk7CisKKyAgICAvLyBkZXN0cnVjdG9yIGZvciB0aHJlYWQgZGF0YQorICAgIHN0YXRpYyB2b2lkIGRlc3Ryb3lfdGhyZWFkX2RhdGEodm9pZCAqZGF0YSk7CisKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBzdGQ6OnNldDxQdHJEYXRhPiBQdHJTZXQ7CisgICAgdHlwZWRlZiBzdGQ6Om1hcDxjb25zdCB2b2lkKiwgT2ZmbG9hZERlc2NyaXB0b3IqPiBTaWduYWxNYXA7CisKKyAgICAvLyBkZXZpY2UgaW5kZXhlcworICAgIGludCAgICAgICAgIG1faW5kZXg7CisgICAgaW50ICAgICAgICAgbV9waHlzaWNhbF9pbmRleDsKKworICAgIC8vIG51bWJlciBvZiBDT0kgcGlwZXMgY3JlYXRlZCBmb3IgdGhlIGVuZ2luZQorICAgIGxvbmcgICAgICAgIG1fcHJvY19udW1iZXI7CisKKyAgICAvLyBwcm9jZXNzIGhhbmRsZQorICAgIENPSVBST0NFU1MgIG1fcHJvY2VzczsKKworICAgIC8vIElmIGZhbHNlLCBkZXZpY2UgZWl0aGVyIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCBvciBuZXcgbGlicmFyaWVzCisgICAgLy8gaGF2ZSBiZWVuIGFkZGVkLgorICAgIGJvb2wgICAgICAgIG1fcmVhZHk7CisgICAgbXV0ZXhfdCAgICAgbV9sb2NrOworCisgICAgLy8gTGlzdCBvZiBsaWJyYXJpZXMgdG8gYmUgbG9hZGVkCisgICAgVGFyZ2V0SW1hZ2VMaXN0IG1faW1hZ2VzOworCisgICAgLy8gdmFyIHRhYmxlCisgICAgUHRyU2V0ICAgICAgbV9wdHJfc2V0OworICAgIG11dGV4X3QgICAgIG1fcHRyX2xvY2s7CisKKyAgICAvLyBzaWduYWxzCisgICAgU2lnbmFsTWFwIG1fc2lnbmFsX21hcDsKKyAgICBtdXRleF90ICAgbV9zaWduYWxfbG9jazsKKworICAgIC8vIGNvbnN0YW50cyBmb3IgYWNjZXNzaW5nIGRldmljZSBmdW5jdGlvbiBoYW5kbGVzCisgICAgZW51bSB7CisgICAgICAgIGNfZnVuY19jb21wdXRlID0gMCwKKyNpZmRlZiBNWU9fU1VQUE9SVAorICAgICAgICBjX2Z1bmNfbXlvX2luaXQsCisgICAgICAgIGNfZnVuY19teW9fZmluaSwKKyNlbmRpZiAvLyBNWU9fU1VQUE9SVAorICAgICAgICBjX2Z1bmNfaW5pdCwKKyAgICAgICAgY19mdW5jX3Zhcl90YWJsZV9zaXplLAorICAgICAgICBjX2Z1bmNfdmFyX3RhYmxlX2NvcHksCisgICAgICAgIGNfZnVuY3NfdG90YWwKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBtX2Z1bmNfbmFtZXNbY19mdW5jc190b3RhbF07CisKKyAgICAvLyBkZXZpY2UgZnVuY3Rpb24gaGFuZGxlcworICAgIENPSUZVTkNUSU9OIG1fZnVuY3NbY19mdW5jc190b3RhbF07CisKKyAgICAvLyBpbnQgLT4gbmFtZSBtYXBwaW5nIGZvciBkZXZpY2Ugc2lnbmFscworICAgIHN0YXRpYyBjb25zdCBpbnQgICBjX3NpZ25hbF9tYXggPSAzMjsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogY19zaWduYWxfbmFtZXNbY19zaWduYWxfbWF4XTsKK307CisKKyNlbmRpZiAvLyBPRkZMT0FEX0VOR0lORV9IX0lOQ0xVREVECmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX2Vudi5jcHAgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX2Vudi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAzNzMzOAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfZW52LmNwcApAQCAtMCwwICsxLDM1NCBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAib2ZmbG9hZF9lbnYuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgIm9mZmxvYWRfdXRpbC5oIgorI2luY2x1ZGUgImxpYm9mZmxvYWRfZXJyb3JfY29kZXMuaCIKKworLy8gZm9yIGVudmlyb25tZW50IHZhcmlhYmxlcyB2YWxpZCBvbiBhbGwgY2FyZHMKK2NvbnN0IGludCBNaWNFbnZWYXI6OmFueV9jYXJkID0gLTE7CisKK01pY0VudlZhcjo6fk1pY0VudlZhcigpCit7CisgICAgZm9yIChzdGQ6Omxpc3Q8TWljRW52VmFyOjpDYXJkRW52VmFycyo+Ojpjb25zdF9pdGVyYXRvcgorICAgICAgICAgaXQgPSBjYXJkX3NwZWNfbGlzdC5iZWdpbigpOworICAgICAgICAgaXQgIT0gY2FyZF9zcGVjX2xpc3QuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgQ2FyZEVudlZhcnMgKmNhcmRfZGF0YSA9ICppdDsKKyAgICAgICAgZGVsZXRlIGNhcmRfZGF0YTsKKyAgICB9Cit9CisKK01pY0VudlZhcjo6VmFyVmFsdWU6On5WYXJWYWx1ZSgpCit7CisgICAgZnJlZShlbnZfdmFyX3ZhbHVlKTsKK30KKworTWljRW52VmFyOjpDYXJkRW52VmFyczo6fkNhcmRFbnZWYXJzKCkKK3sKKyAgICBmb3IgKHN0ZDo6bGlzdDxNaWNFbnZWYXI6OlZhclZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZW52X3ZhcnMuYmVnaW4oKTsKKyAgICAgICAgaXQgIT0gZW52X3ZhcnMuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgICAgIFZhclZhbHVlICp2YXJfdmFsdWUgPSAqaXQ7CisgICAgICAgICAgICBkZWxldGUgdmFyX3ZhbHVlOworICAgIH0KK30KKworLy8gU2VhcmNoaW5nIGZvciBjYXJkIGluICJjYXJkX3NwZWNfbGlzdCIgbGlzdCB3aXRoIHRoZSBzYW1lICJudW1iZXIiCisKK01pY0VudlZhcjo6Q2FyZEVudlZhcnMqIE1pY0VudlZhcjo6Z2V0X2NhcmQoaW50IG51bWJlcikKK3sKKyAgICBpZiAobnVtYmVyID09IGFueV9jYXJkKSB7CisgICAgICAgIHJldHVybiAmY29tbW9uX3ZhcnM7CisgICAgfQorICAgIGZvciAoc3RkOjpsaXN0PE1pY0VudlZhcjo6Q2FyZEVudlZhcnMqPjo6Y29uc3RfaXRlcmF0b3IKKyAgICAgICAgIGl0ID0gY2FyZF9zcGVjX2xpc3QuYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IGNhcmRfc3BlY19saXN0LmVuZCgpOyBpdCsrKSB7CisgICAgICAgIENhcmRFbnZWYXJzICpjYXJkX2RhdGEgPSAqaXQ7CisgICAgICAgIGlmIChjYXJkX2RhdGEtPmNhcmRfbnVtYmVyID09IG51bWJlcikgeworICAgICAgICAgICAgcmV0dXJuIGNhcmRfZGF0YTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworLy8gU2VhcmNoaW5nIGZvciBlbnZpcm9ubWVudCB2YXJpYWJsZSBpbiAiZW52X3ZhciIgbGlzdCB3aXRoIHRoZSBzYW1lIG5hbWUKKworTWljRW52VmFyOjpWYXJWYWx1ZSogTWljRW52VmFyOjpDYXJkRW52VmFyczo6ZmluZF92YXIoCisgICAgY2hhciogZW52X3Zhcl9uYW1lLAorICAgIGludCBlbnZfdmFyX25hbWVfbGVuZ3RoCispCit7CisgICAgZm9yIChzdGQ6Omxpc3Q8TWljRW52VmFyOjpWYXJWYWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGVudl92YXJzLmJlZ2luKCk7CisgICAgICAgIGl0ICE9IGVudl92YXJzLmVuZCgpOyBpdCsrKSB7CisgICAgICAgICAgICBWYXJWYWx1ZSAqdmFyX3ZhbHVlID0gKml0OworICAgICAgICAgICAgaWYgKHZhcl92YWx1ZS0+bGVuZ3RoID09IGVudl92YXJfbmFtZV9sZW5ndGggJiYKKyAgICAgICAgICAgICAgICAhc3RybmNtcCh2YXJfdmFsdWUtPmVudl92YXIsIGVudl92YXJfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlbnZfdmFyX25hbWVfbGVuZ3RoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB2YXJfdmFsdWU7CisgICAgICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIE1pY0VudlZhcjo6YW5hbHl6ZV9lbnZfdmFyKGNoYXIgKmVudl92YXJfc3RyaW5nKQoreworICAgIGNoYXIgICAgICAgICAgKmVudl92YXJfbmFtZTsKKyAgICBjaGFyICAgICAgICAgICplbnZfdmFyX2RlZjsKKyAgICBpbnQgICAgICAgICAgIGNhcmRfbnVtYmVyOworICAgIGludCAgICAgICAgICAgZW52X3Zhcl9uYW1lX2xlbmd0aDsKKyAgICBNaWNFbnZWYXJLaW5kIGVudl92YXJfa2luZDsKKworICAgIGVudl92YXJfa2luZCA9IGdldF9lbnZfdmFyX2tpbmQoZW52X3Zhcl9zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2FyZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW52X3Zhcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVudl92YXJfbmFtZV9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW52X3Zhcl9kZWYpOworICAgIHN3aXRjaCAoZW52X3Zhcl9raW5kKSB7CisgICAgICAgIGNhc2UgY19taWNfdmFyOgorICAgICAgICBjYXNlIGNfbWljX2NhcmRfdmFyOgorICAgICAgICAgICAgYWRkX2Vudl92YXIoY2FyZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBlbnZfdmFyX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBlbnZfdmFyX25hbWVfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgZW52X3Zhcl9kZWYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19taWNfY2FyZF9lbnY6CisgICAgICAgICAgICBtaWNfcGFyc2VfZW52X3Zhcl9saXN0KGNhcmRfbnVtYmVyLCBlbnZfdmFyX2RlZik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX25vX21pYzoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZCBNaWNFbnZWYXI6OmFkZF9lbnZfdmFyKAorICAgIGludCBjYXJkX251bWJlciwKKyAgICBjaGFyICplbnZfdmFyX25hbWUsCisgICAgaW50IGVudl92YXJfbmFtZV9sZW5ndGgsCisgICAgY2hhciAqZW52X3Zhcl9kZWYKKykKK3sKKyAgICBWYXJWYWx1ZSAqdmFyOworICAgIENhcmRFbnZWYXJzICpjYXJkOworCisgICAgLy8gVGhlIGNhc2UgY29ycmVzcG9uZHMgdG8gY29tbW9uIGVudiB2YXIgZGVmaW5pdGlvbiBvZiBraW5kCisgICAgLy8gPG1pYy1wcmVmaXg+Xzx2YXI+CisgICAgaWYgKGNhcmRfbnVtYmVyID09IGFueV9jYXJkKSB7CisgICAgICAgIGNhcmQgPSAmY29tbW9uX3ZhcnM7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBjYXJkID0gZ2V0X2NhcmQoY2FyZF9udW1iZXIpOworICAgICAgICBpZiAoIWNhcmQpIHsKKyAgICAgICAgICAgIC8vIGRlZmluaXRpb24gZm9yIG5ldyBjYXJkIG9jY3VycmVkCisgICAgICAgICAgICBjYXJkID0gbmV3IENhcmRFbnZWYXJzKGNhcmRfbnVtYmVyKTsKKyAgICAgICAgICAgIGNhcmRfc3BlY19saXN0LnB1c2hfYmFjayhjYXJkKTsKKyAgICAgICAgfQorCisgICAgfQorICAgIHZhciA9IGNhcmQtPmZpbmRfdmFyKGVudl92YXJfbmFtZSwgZW52X3Zhcl9uYW1lX2xlbmd0aCk7CisgICAgaWYgKCF2YXIpIHsKKyAgICAgICAgLy8gcHV0IG5ldyBlbnYgdmFyIGRlZmluaXRpb24gaW4gImVudl92YXIiIGxpc3QKKyAgICAgICAgdmFyID0gbmV3IFZhclZhbHVlKGVudl92YXJfbmFtZSwgZW52X3Zhcl9uYW1lX2xlbmd0aCwgZW52X3Zhcl9kZWYpOworICAgICAgICBjYXJkLT5lbnZfdmFycy5wdXNoX2JhY2sodmFyKTsKKyAgICB9Cit9CisKKy8vIFRoZSByb3V0aW5lIGFuYWx5c2VzIHN0cmluZyBwb2ludGVkIGJ5ICJlbnZfdmFyX3N0cmluZyIgYXJndW1lbnQKKy8vIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIHN5bnRheDoKKy8vCisvLyBTcGVjaWZpY2F0aW9uIG9mIHByZWZpeCBmb3IgTUlDIGVudmlyb25tZW50IHZhcmlhYmxlcworLy8gTUlDX0VOVl9QUkVGSVg9PG1pYy1wcmVmaXg+CisvLworLy8gU2V0dGluZyBzaW5nbGUgTUlDIGVudmlyb25tZW50IHZhcmlhYmxlCisvLyA8bWljLXByZWZpeD5fPHZhcj49PHZhbHVlPgorLy8gPG1pYy1wcmVmaXg+XzxjYXJkLW51bWJlcj5fPHZhcj49PHZhbHVlPgorCisvLyBTZXR0aW5nIG11bHRpcGxlIE1JQyBlbnZpcm9ubWVudCB2YXJpYWJsZXMKKy8vIDxtaWMtcHJlZml4Pl88Y2FyZC1udW1iZXI+X0VOVj08ZW52LXZhcnM+CisKK01pY0VudlZhcktpbmQgTWljRW52VmFyOjpnZXRfZW52X3Zhcl9raW5kKAorICAgIGNoYXIgKmVudl92YXJfc3RyaW5nLAorICAgIGludCAqY2FyZF9udW1iZXIsCisgICAgY2hhciAqKmVudl92YXJfbmFtZSwKKyAgICBpbnQgKmVudl92YXJfbmFtZV9sZW5ndGgsCisgICAgY2hhciAqKmVudl92YXJfZGVmCispCit7CisgICAgaW50IGxlbiA9IHN0cmxlbihwcmVmaXgpOworICAgIGNoYXIgKmMgPSBlbnZfdmFyX3N0cmluZzsKKyAgICBpbnQgbnVtID0gMDsKKyAgICBib29sIGNhcmRfaXNfc2V0ID0gZmFsc2U7CisKKyAgICBpZiAoc3RybmNtcChjLCBwcmVmaXgsIGxlbikgIT0gMCB8fCBjW2xlbl0gIT0gJ18nKSB7CisgICAgICAgICAgICByZXR1cm4gY19ub19taWM7CisgICAgfQorICAgIGMgKz0gbGVuICsgMTsKKworICAgICpjYXJkX251bWJlciA9IGFueV9jYXJkOworICAgIGlmIChpc2RpZ2l0KCpjKSkgeworICAgICAgICB3aGlsZSAoaXNkaWdpdCAoKmMpKSB7CisgICAgICAgICAgICBudW0gPSAoKmMrKyAtICcwJykgKyAobnVtICogMTApOworICAgICAgICB9CisgICAgaWYgKCpjICE9ICdfJykgeworICAgICAgICByZXR1cm4gY19ub19taWM7CisgICAgfQorICAgIGMrKzsKKyAgICAgICAgKmNhcmRfbnVtYmVyID0gbnVtOworICAgICAgICBjYXJkX2lzX3NldCA9IHRydWU7CisgICAgfQorICAgIGlmICghaXNhbHBoYSgqYykpIHsKKyAgICAgICAgcmV0dXJuIGNfbm9fbWljOworICAgIH0KKyAgICAqZW52X3Zhcl9uYW1lID0gKmVudl92YXJfZGVmID0gYzsKKyAgICBpZiAoc3RybmNtcChjLCAiRU5WPSIsIDQpID09IDApIHsKKyAgICAgICAgaWYgKCFjYXJkX2lzX3NldCkgeworICAgICAgICAgICAgKmVudl92YXJfbmFtZV9sZW5ndGggPSAzOworICAgICAgICAgICAgKmVudl92YXJfbmFtZSA9ICplbnZfdmFyX2RlZiA9IGM7CisgICAgICAgICAgICAqZW52X3Zhcl9kZWYgPSBzdHJkdXAoKmVudl92YXJfZGVmKTsKKyAgICAgICAgICAgIHJldHVybiAgY19taWNfdmFyOworICAgICAgICB9CisgICAgICAgICplbnZfdmFyX2RlZiA9IGMgKyBzdHJsZW4oIkVOVj0iKTsKKyAgICAgICAgKmVudl92YXJfZGVmID0gc3RyZHVwKCplbnZfdmFyX2RlZik7CisgICAgICAgIHJldHVybiBjX21pY19jYXJkX2VudjsKKyAgICB9CisgICAgaWYgKGlzYWxwaGEoKmMpKSB7CisgICAgICAgICplbnZfdmFyX25hbWVfbGVuZ3RoID0gMDsKKyAgICAgICAgd2hpbGUgKGlzYWxudW0oKmMpIHx8ICpjID09ICdfJykgeworICAgICAgICAgICAgYysrOworICAgICAgICAgICAgKCplbnZfdmFyX25hbWVfbGVuZ3RoKSsrOworICAgICAgICB9CisgICAgfQorICAgIGlmICgqYyAhPSAnPScpIHsKKyAgICAgICAgcmV0dXJuIGNfbm9fbWljOworICAgIH0KKyAgICAqZW52X3Zhcl9kZWYgPSBzdHJkdXAoKmVudl92YXJfZGVmKTsKKyAgICByZXR1cm4gY2FyZF9pc19zZXQ/IGNfbWljX2NhcmRfdmFyIDogY19taWNfdmFyOworfQorCisvLyBhbmFseXNpbmcgPGVudi12YXJzPiBpbiBmb3JtOgorLy8gPG1pYy1wcmVmaXg+XzxjYXJkLW51bWJlcj5fRU5WPTxlbnYtdmFycz4KKy8vIHdoZXJlOgorLy8KKy8vIDxlbnYtdmFycz46CisvLyAgICAgICAgICAgICAgICA8ZW52LXZhcj4KKy8vICAgICAgICAgICAgICAgIDxlbnYtdmFycz4gfCA8ZW52LXZhcj4KKy8vCisvLyA8ZW52LXZhcj46CisvLyAgICAgICAgICAgICAgICB2YXJpYWJsZT12YWx1ZQorLy8gICAgICAgICAgICAgICAgdmFyaWFibGU9InZhbHVlIgorLy8gICAgICAgICAgICAgICAgdmFyaWFibGU9CisKK3ZvaWQgTWljRW52VmFyOjptaWNfcGFyc2VfZW52X3Zhcl9saXN0KAorICAgIGludCBjYXJkX251bWJlciwgY2hhciAqZW52X3ZhcnNfZGVmX2xpc3QpCit7CisgICAgY2hhciAqYyA9IGVudl92YXJzX2RlZl9saXN0OworICAgIGNoYXIgKmVudl92YXJfbmFtZTsKKyAgICBpbnQgIGVudl92YXJfbmFtZV9sZW5ndGg7CisgICAgY2hhciAqZW52X3Zhcl9kZWY7CisgICAgYm9vbCB2YXJfaXNfcXVvdGVkOworCisgICAgaWYgKCpjID09ICciJykgeworICAgICAgICBjKys7CisgICAgfQorICAgIHdoaWxlICgqYyAhPSAwKSB7CisgICAgICAgIHZhcl9pc19xdW90ZWQgPSBmYWxzZTsKKyAgICAgICAgZW52X3Zhcl9uYW1lID0gYzsKKyAgICAgICAgZW52X3Zhcl9uYW1lX2xlbmd0aCA9IDA7CisgICAgICAgIGlmIChpc2FscGhhKCpjKSkgeworICAgICAgICAgICAgd2hpbGUgKGlzYWxudW0oKmMpIHx8ICpjID09ICdfJykgeworICAgICAgICAgICAgICAgIGMrKzsKKyAgICAgICAgICAgICAgICBlbnZfdmFyX25hbWVfbGVuZ3RoKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfbWljX3BhcnNlX2Vudl92YXJfbGlzdDEpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICgqYyAhPSAnPScpIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19taWNfcGFyc2VfZW52X3Zhcl9saXN0Mik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYysrOworCisgICAgICAgIGlmICgqYyA9PSAnIicpIHsKKyAgICAgICAgICAgIHZhcl9pc19xdW90ZWQgPSB0cnVlOworICAgICAgICAgICAgYysrOworICAgICAgICB9CisgICAgICAgIC8vIEVudmlyb25tZW50IHZhcmlhYmxlIHZhbHVlcyB0aGF0IGNvbnRhaW4gfCB3aWxsIG5lZWQgdG8gYmUgZXNjYXBlZC4KKyAgICAgICAgd2hpbGUgKCpjICE9IDAgJiYgKmMgIT0gJ3wnICYmCisgICAgICAgICAgICAgICAoIXZhcl9pc19xdW90ZWQgfHwgKmMgIT0gJyInKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gc2tpcCBlc2NhcGVkIHN5bWJvbAorICAgICAgICAgICAgaWYgKCpjID09ICdcXCcpIHsKKyAgICAgICAgICAgICAgICBjKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZhcl9pc19xdW90ZWQpIHsKKyAgICAgICAgICAgIGMrKzsgLy8gZm9yICIKKyAgICAgICAgICAgIHdoaWxlICgqYyAhPSAwICYmICpjICE9ICd8JykgeworICAgICAgICAgICAgICAgIGMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGludCBzeiA9IGMgLSBlbnZfdmFyX25hbWU7CisgICAgICAgIGVudl92YXJfZGVmID0gKGNoYXIqKW1hbGxvYyhzeik7CisgICAgICAgIG1lbWNweShlbnZfdmFyX2RlZiwgZW52X3Zhcl9uYW1lLCBzeik7CisgICAgICAgIGVudl92YXJfZGVmW3N6XSA9IDA7CisKKyAgICAgICAgaWYgKCpjID09ICd8JykgeworICAgICAgICAgICAgYysrOworICAgICAgICAgICAgd2hpbGUgKCpjICE9IDAgJiYgKmMgPT0gJyAnKSB7CisgICAgICAgICAgICAgICAgYysrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFkZF9lbnZfdmFyKGNhcmRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICBlbnZfdmFyX25hbWUsCisgICAgICAgICAgICAgICAgICAgIGVudl92YXJfbmFtZV9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgIGVudl92YXJfZGVmKTsKKyAgICB9Cit9CisKKy8vIENvbGxlY3QgYWxsIGRlZmluaXRpb25zIGZvciB0aGUgY2FyZCB3aXRoIG51bWJlciAiY2FyZF9udW0iLgorLy8gVGhlIHJldHVybmVkIHJlc3VsdCBpcyB2ZWN0b3Igb2Ygc3RyaW5nIHBvaW50ZXJzIGRlZmluaW5nIG9uZQorLy8gZW52aXJvbm1lbnQgdmFyaWFibGUuIFRoZSB2ZWN0b3IgaXMgdGVybWluYXRlZCBieSBOVUxMIHBvaW50ZXIuCisvLyBJbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSB2ZWN0b3IgdGhlcmUgYXJlIGVudiB2YXJzIGRlZmluZWQgYXMKKy8vIDxtaWMtcHJlZml4Pl88Y2FyZC1udW1iZXI+Xzx2YXI+PTx2YWx1ZT4KKy8vIG9yCisvLyA8bWljLXByZWZpeD5fPGNhcmQtbnVtYmVyPl9FTlY9PGVudi12YXJzPgorLy8gd2hlcmUgPGNhcmQtbnVtYmVyPiBpcyBlcXVhbCB0byAiY2FyZF9udW0iCisvLyBUaGV5IGFyZSBmb2xsb3dlZCBieSBkZWZpbml0aW9ucyB2YWxpZCBmb3IgYW55IGNhcmQKKy8vIGFuZCBhYnNlbnQgaW4gcHJldmlvdXMgZGVmaW5pdGlvbnMuCisKK2NoYXIqKiBNaWNFbnZWYXI6OmNyZWF0ZV9lbnZpcm9uX2Zvcl9jYXJkKGludCBjYXJkX251bSkKK3sKKyAgICBWYXJWYWx1ZSAqdmFyX3ZhbHVlOworICAgIFZhclZhbHVlICp2YXJfdmFsdWVfZmluZDsKKyAgICBDYXJkRW52VmFycyAqY2FyZF9kYXRhID0gZ2V0X2NhcmQoY2FyZF9udW0pOworICAgIENhcmRFbnZWYXJzICpjYXJkX2RhdGFfY29tbW9uOworICAgIHN0ZDo6bGlzdDxjaGFyKj4gbmV3X2VudjsKKyAgICBjaGFyICoqcmV6OworCisgICAgaWYgKCFwcmVmaXgpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIC8vIFRoZXJlIGlzIG5vIHBlcnNvbmVsIGVudiB2YXIgZGVmaW5pdGlvbnMgZm9yIHRoZSBjYXJkIHdpdGgKKyAgICAvLyBudW1iZXIgImNhcmRfbnVtIgorICAgIGlmICghY2FyZF9kYXRhKSB7CisgICAgICAgIHJldHVybiBjcmVhdGVfZW52aXJvbl9mb3JfY2FyZChhbnlfY2FyZCk7CisgICAgfQorCisgICAgZm9yIChzdGQ6Omxpc3Q8TWljRW52VmFyOjpWYXJWYWx1ZSo+Ojpjb25zdF9pdGVyYXRvcgorICAgICAgICAgaXQgPSBjYXJkX2RhdGEtPmVudl92YXJzLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSBjYXJkX2RhdGEtPmVudl92YXJzLmVuZCgpOyBpdCsrKSB7CisgICAgICAgIHZhcl92YWx1ZSA9ICppdDsKKyAgICAgICAgbmV3X2Vudi5wdXNoX2JhY2sodmFyX3ZhbHVlLT5lbnZfdmFyX3ZhbHVlKTsKKyAgICB9CisKKyAgICBpZiAoY2FyZF9udW0gIT0gYW55X2NhcmQpIHsKKyAgICAgICAgY2FyZF9kYXRhX2NvbW1vbiA9IGdldF9jYXJkKGFueV9jYXJkKTsKKyAgICAgICAgZm9yIChzdGQ6Omxpc3Q8TWljRW52VmFyOjpWYXJWYWx1ZSo+Ojpjb25zdF9pdGVyYXRvcgorICAgICAgICAgICAgIGl0ID0gY2FyZF9kYXRhX2NvbW1vbi0+ZW52X3ZhcnMuYmVnaW4oKTsKKyAgICAgICAgICAgICBpdCAhPSBjYXJkX2RhdGFfY29tbW9uLT5lbnZfdmFycy5lbmQoKTsgaXQrKykgeworICAgICAgICAgICAgdmFyX3ZhbHVlID0gKml0OworICAgICAgICAgICAgdmFyX3ZhbHVlX2ZpbmQgPSBjYXJkX2RhdGEtPmZpbmRfdmFyKHZhcl92YWx1ZS0+ZW52X3ZhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJfdmFsdWUtPmxlbmd0aCk7CisgICAgICAgICAgICBpZiAoIXZhcl92YWx1ZV9maW5kKSB7CisgICAgICAgICAgICAgICAgbmV3X2Vudi5wdXNoX2JhY2sodmFyX3ZhbHVlLT5lbnZfdmFyX3ZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGludCBuZXdfZW52X3NpemUgPSBuZXdfZW52LnNpemUoKTsKKyAgICByZXogPSAoY2hhcioqKSBtYWxsb2MoKG5ld19lbnZfc2l6ZSArIDEpICogc2l6ZW9mKGNoYXIqKSk7CisgICAgc3RkOjpjb3B5KG5ld19lbnYuYmVnaW4oKSwgbmV3X2Vudi5lbmQoKSwgcmV6KTsKKyAgICByZXpbbmV3X2Vudl9zaXplXSA9IDA7CisgICAgcmV0dXJuIHJlejsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfZW52LmggYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX2Vudi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMzVmZjYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX2Vudi5oCkBAIC0wLDAgKzEsOTEgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBPRkZMT0FEX0VOVl9IX0lOQ0xVREVECisjZGVmaW5lIE9GRkxPQURfRU5WX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPGxpc3Q+CisKKy8vIGRhdGEgc3RydWN0dXJlIGFuZCByb3V0aW5lcyB0byBwYXJzZSBNSUMgdXNlciBlbnZpcm9ubWVudCBhbmQgcGFzcyB0byBNSUMKKworZW51bSBNaWNFbnZWYXJLaW5kCit7CisgICAgY19ub19taWMsICAgICAgICAgLy8gbm90IE1JQyBlbnYgdmFyCisgICAgY19taWNfdmFyLCAgICAgICAgLy8gZm9yIDxtaWMtcHJlZml4Pl88dmFyPgorICAgIGNfbWljX2NhcmRfdmFyLCAgIC8vIGZvciA8bWljLXByZWZpeD5fPGNhcmQtbnVtYmVyPl88dmFyPgorICAgIGNfbWljX2NhcmRfZW52ICAgIC8vIGZvciA8bWljLXByZWZpeD5fPGNhcmQtbnVtYmVyPl9FTlYKK307CisKK3N0cnVjdCBNaWNFbnZWYXIgeworcHVibGljOgorICAgIE1pY0VudlZhcigpIDogcHJlZml4KDApIHt9CisgICAgfk1pY0VudlZhcigpOworCisgICAgdm9pZCBhbmFseXplX2Vudl92YXIoY2hhciAqZW52X3Zhcl9zdHJpbmcpOworICAgIGNoYXIqKiBjcmVhdGVfZW52aXJvbl9mb3JfY2FyZChpbnQgY2FyZF9udW0pOworICAgIE1pY0VudlZhcktpbmQgZ2V0X2Vudl92YXJfa2luZCgKKyAgICAgICAgY2hhciAqZW52X3Zhcl9zdHJpbmcsCisgICAgICAgIGludCAqY2FyZF9udW1iZXIsCisgICAgICAgIGNoYXIgKiplbnZfdmFyX25hbWUsCisgICAgICAgIGludCAqZW52X3Zhcl9uYW1lX2xlbmd0aCwKKyAgICAgICAgY2hhciAqKmVudl92YXJfZGVmCisgICAgKTsKKyAgICB2b2lkIGFkZF9lbnZfdmFyKAorICAgICAgICBpbnQgY2FyZF9udW1iZXIsCisgICAgICAgIGNoYXIgKmVudl92YXJfbmFtZSwKKyAgICAgICAgaW50IGVudl92YXJfbmFtZV9sZW5ndGgsCisgICAgICAgIGNoYXIgKmVudl92YXJfZGVmCisgICAgKTsKKworICAgIHZvaWQgc2V0X3ByZWZpeChjb25zdCBjaGFyICpwcmVmKSB7CisgICAgICAgIHByZWZpeCA9IChwcmVmICYmICpwcmVmICE9ICdcMCcpID8gcHJlZiA6IDA7CisgICAgfQorCisgICAgc3RydWN0IFZhclZhbHVlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGNoYXIqIGVudl92YXI7CisgICAgICAgIGludCAgIGxlbmd0aDsKKyAgICAgICAgY2hhciogZW52X3Zhcl92YWx1ZTsKKworICAgICAgICBWYXJWYWx1ZShjaGFyKiB2YXIsIGludCBsbiwgY2hhciogdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVudl92YXIgPSB2YXI7CisgICAgICAgICAgICBsZW5ndGggPSBsbjsKKyAgICAgICAgICAgIGVudl92YXJfdmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICB+VmFyVmFsdWUoKTsKKyAgICB9OworCisgICAgc3RydWN0IENhcmRFbnZWYXJzIHsKKyAgICBwdWJsaWM6CisKKyAgICAgICAgaW50IGNhcmRfbnVtYmVyOworICAgICAgICBzdGQ6Omxpc3Q8c3RydWN0IFZhclZhbHVlKj4gZW52X3ZhcnM7CisKKyAgICAgICAgQ2FyZEVudlZhcnMoKSB7IGNhcmRfbnVtYmVyID0gYW55X2NhcmQ7IH0KKyAgICAgICAgQ2FyZEVudlZhcnMoaW50IG51bSkgeyBjYXJkX251bWJlciA9IG51bTsgfQorICAgICAgICB+Q2FyZEVudlZhcnMoKTsKKworICAgICAgICB2b2lkIGFkZF9uZXdfZW52X3ZhcihpbnQgbnVtYmVyLCBjaGFyICplbnZfdmFyLCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICplbnZfdmFyX3ZhbHVlKTsKKyAgICAgICAgVmFyVmFsdWUqIGZpbmRfdmFyKGNoYXIqIGVudl92YXJfbmFtZSwgaW50IGVudl92YXJfbmFtZV9sZW5ndGgpOworICAgIH07CisgICAgc3RhdGljIGNvbnN0IGludCBhbnlfY2FyZDsKKworcHJpdmF0ZToKKyAgICB2b2lkICAgICAgICAgbWljX3BhcnNlX2Vudl92YXJfbGlzdChpbnQgY2FyZF9udW1iZXIsIGNoYXIgKmVudl92YXJfZGVmKTsKKyAgICBDYXJkRW52VmFycyogZ2V0X2NhcmQoaW50IG51bWJlcik7CisKKyAgICBjb25zdCBjaGFyICpwcmVmaXg7CisgICAgc3RkOjpsaXN0PHN0cnVjdCBDYXJkRW52VmFycyAqPiBjYXJkX3NwZWNfbGlzdDsKKyAgICBDYXJkRW52VmFycyBjb21tb25fdmFyczsKK307CisKKyNlbmRpZiAvLyBPRkZMT0FEX0VOVl9IX0lOQ0xVREVECmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX2hvc3QuY3BwIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9ob3N0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGQ1MTM5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9ob3N0LmNwcApAQCAtMCwwICsxLDQzNjAgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLy8gRm9yd2FyZCBkZWNsYXJhdGlvbiBhcyB0aGUgZm9sbG93aW5nIDIgZnVuY3Rpb25zIGFyZSBkZWNsYXJlZCBhcyBmcmllbmQgaW4gb2ZmbG9hZF9lbmdpbmUuaAorLy8gQ0xBTkcgZG9lcyBub3QgbGlrZSBzdGF0aWMgdG8gYmVlbiBhZnRlciBmcmllbmQgZGVjbGFyYXRpb24uCitzdGF0aWMgdm9pZCBfX29mZmxvYWRfaW5pdF9saWJyYXJ5X29uY2Uodm9pZCk7CitzdGF0aWMgdm9pZCBfX29mZmxvYWRfZmluaV9saWJyYXJ5KHZvaWQpOworCisjaW5jbHVkZSAib2ZmbG9hZF9ob3N0LmgiCisjaWZkZWYgTVlPX1NVUFBPUlQKKyNpbmNsdWRlICJvZmZsb2FkX215b19ob3N0LmgiCisjZW5kaWYKKworI2luY2x1ZGUgPG1hbGxvYy5oPgorI2lmbmRlZiBUQVJHRVRfV0lOTlQKKyNpbmNsdWRlIDxhbGxvY2EuaD4KKyNpbmNsdWRlIDxlbGYuaD4KKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGJpdHNldD4KKworI2lmIGRlZmluZWQoSE9TVF9XSU5OVCkKKyNkZWZpbmUgUEFUSF9TRVBBUkFUT1IgIjsiCisjZWxzZQorI2RlZmluZSBQQVRIX1NFUEFSQVRPUiAiOiIKKyNlbmRpZgorCisjZGVmaW5lIEdFVF9PRkZMT0FEX05VTUJFUih0aW1lcl9kYXRhKSBcCisgICAgdGltZXJfZGF0YT8gdGltZXJfZGF0YS0+b2ZmbG9hZF9udW1iZXIgOiAwCisKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKy8vIFNtYWxsIHN1YnNldCBvZiBFTEYgZGVjbGFyYXRpb25zIGZvciBXaW5kb3dzIHdoaWNoIGlzIG5lZWRlZCB0byBjb21waWxlCisvLyB0aGlzIGZpbGUuIEVMRiBoZWFkZXIgaXMgdXNlZCB0byB1bmRlcnN0YW5kIHdoYXQgYmluYXJ5IHR5cGUgaXMgY29udGFpbmVkCisvLyBpbiB0aGUgdGFyZ2V0IGltYWdlIC0gc2hhcmVkIGxpYnJhcnkgb3IgZXhlY3V0YWJsZS4KKwordHlwZWRlZiB1aW50MTZfdCBFbGY2NF9IYWxmOwordHlwZWRlZiB1aW50MzJfdCBFbGY2NF9Xb3JkOwordHlwZWRlZiB1aW50NjRfdCBFbGY2NF9BZGRyOwordHlwZWRlZiB1aW50NjRfdCBFbGY2NF9PZmY7CisKKyNkZWZpbmUgRUlfTklERU5UICAgMTYKKworI2RlZmluZSBFVF9FWEVDICAgICAyCisjZGVmaW5lIEVUX0RZTiAgICAgIDMKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1bnNpZ25lZCBjaGFyIGVfaWRlbnRbRUlfTklERU5UXTsKKyAgICBFbGY2NF9IYWxmICAgIGVfdHlwZTsKKyAgICBFbGY2NF9IYWxmICAgIGVfbWFjaGluZTsKKyAgICBFbGY2NF9Xb3JkICAgIGVfdmVyc2lvbjsKKyAgICBFbGY2NF9BZGRyICAgIGVfZW50cnk7CisgICAgRWxmNjRfT2ZmICAgICBlX3Bob2ZmOworICAgIEVsZjY0X09mZiAgICAgZV9zaG9mZjsKKyAgICBFbGY2NF9Xb3JkICAgIGVfZmxhZ3M7CisgICAgRWxmNjRfSGFsZiAgICBlX2Voc2l6ZTsKKyAgICBFbGY2NF9IYWxmICAgIGVfcGhlbnRzaXplOworICAgIEVsZjY0X0hhbGYgICAgZV9waG51bTsKKyAgICBFbGY2NF9IYWxmICAgIGVfc2hlbnRzaXplOworICAgIEVsZjY0X0hhbGYgICAgZV9zaG51bTsKKyAgICBFbGY2NF9IYWxmICAgIGVfc2hzdHJuZHg7Cit9IEVsZjY0X0VoZHI7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKy8vIEhvc3QgY29uc29sZSBhbmQgZmlsZSBsb2dnaW5nCitjb25zdCBjaGFyICpwcmVmaXg7CitpbnQgY29uc29sZV9lbmFibGVkID0gMDsKK2ludCBvZmZsb2FkX251bWJlciA9IDA7CisKK3N0YXRpYyBjb25zdCBjaGFyICpodHJhY2VfZW52bmFtZSA9ICJIX1RSQUNFIjsKK3N0YXRpYyBjb25zdCBjaGFyICpvZmZsb2FkX3JlcG9ydF9lbnZuYW1lID0gIk9GRkxPQURfUkVQT1JUIjsKK3N0YXRpYyBjaGFyICp0aW1lcl9lbnZuYW1lID0gIkhfVElNRSI7CisKKy8vIFRyYWNlIGluZm9ybWF0aW9uCitzdGF0aWMgY29uc3QgY2hhciogdmFyZGVzY19kaXJlY3Rpb25fYXNfc3RyaW5nW10gPSB7CisgICAgIk5PQ09QWSIsCisgICAgIklOIiwKKyAgICAiT1VUIiwKKyAgICAiSU5PVVQiCit9Oworc3RhdGljIGNvbnN0IGNoYXIqIHZhcmRlc2NfdHlwZV9hc19zdHJpbmdbXSA9IHsKKyAgICAidW5rbm93biIsCisgICAgImRhdGEiLAorICAgICJkYXRhX3B0ciIsCisgICAgImZ1bmNfcHRyIiwKKyAgICAidm9pZF9wdHIiLAorICAgICJzdHJpbmdfcHRyIiwKKyAgICAiZHYiLAorICAgICJkdl9kYXRhIiwKKyAgICAiZHZfZGF0YV9zbGljZSIsCisgICAgImR2X3B0ciIsCisgICAgImR2X3B0cl9kYXRhIiwKKyAgICAiZHZfcHRyX2RhdGFfc2xpY2UiLAorICAgICJjZWFuX3ZhciIsCisgICAgImNlYW5fdmFyX3B0ciIsCisgICAgImNfZGF0YV9wdHJfYXJyYXkiLAorICAgICJjX2Z1bmNfcHRyX2FycmF5IiwKKyAgICAiY192b2lkX3B0cl9hcnJheSIsCisgICAgImNfc3RyaW5nX3B0cl9hcnJheSIKK307CisKK0VuZ2luZSogICAgICAgICBtaWNfZW5naW5lcyA9IDA7Cit1aW50MzJfdCAgICAgICAgbWljX2VuZ2luZXNfdG90YWwgPSAwOworcHRocmVhZF9rZXlfdCAgIG1pY190aHJlYWRfa2V5OworTWljRW52VmFyICAgICAgIG1pY19lbnZfdmFyczsKK3VpbnQ2NF90ICAgICAgICBjcHVfZnJlcXVlbmN5ID0gMDsKKworLy8gTUlDX1NUQUNLU0laRQordWludDMyX3QgbWljX3N0YWNrX3NpemUgPSAxMiAqIDEwMjQgKiAxMDI0OworCisvLyBNSUNfQlVGRkVSU0laRQordWludDY0X3QgbWljX2J1ZmZlcl9zaXplID0gMDsKKworLy8gTUlDX0xEX0xJQlJBUllfUEFUSAorY2hhciogbWljX2xpYnJhcnlfcGF0aCA9IDA7CisKKy8vIE1JQ19QUk9YWV9JTworYm9vbCBtaWNfcHJveHlfaW8gPSB0cnVlOworCisvLyBNSUNfUFJPWFlfRlNfUk9PVAorY2hhciogbWljX3Byb3h5X2ZzX3Jvb3QgPSAwOworCisvLyBUaHJlc2hvbGQgZm9yIGNyZWF0aW5nIGJ1ZmZlcnMgd2l0aCBsYXJnZSBwYWdlcy4gQnVmZmVyIGlzIGNyZWF0ZWQKKy8vIHdpdGggbGFyZ2UgcGFnZXMgaGludCBpZiBpdHMgc2l6ZSBleGNlZWRzIHRoZSB0aHJlc2hvbGQgdmFsdWUuCisvLyBCeSBkZWZhdWx0IGxhcmdlIHBhZ2VzIGFyZSBkaXNhYmxlZCByaWdodCBub3cgKGJ5IHNldHRpbmcgZGVmYXVsdAorLy8gdmFsdWUgZm9yIHRocmVzaG9sZCB0byBNQVgpIGR1ZSB0byBIU0QgNDExNDYyOS4KK3VpbnQ2NF90IF9fb2ZmbG9hZF91c2VfMm1iX2J1ZmZlcnMgPSAweGZmZmZmZmZmZmZmZmZmZmZVTEw7CitzdGF0aWMgY29uc3QgY2hhciAqbWljX3VzZV8ybWJfYnVmZmVyc19lbnZuYW1lICA9CisgICAgIk1JQ19VU0VfMk1CX0JVRkZFUlMiOworCitzdGF0aWMgdWludDY0X3QgX19vZmZsb2FkX3VzZV9hc3luY19idWZmZXJfd3JpdGUgPSAyICogMTAyNCAqIDEwMjQ7CitzdGF0aWMgY29uc3QgY2hhciAqbWljX3VzZV9hc3luY19idWZmZXJfd3JpdGVfZW52bmFtZSAgPQorICAgICJNSUNfVVNFX0FTWU5DX0JVRkZFUl9XUklURSI7CisKK3N0YXRpYyB1aW50NjRfdCBfX29mZmxvYWRfdXNlX2FzeW5jX2J1ZmZlcl9yZWFkID0gMiAqIDEwMjQgKiAxMDI0Oworc3RhdGljIGNvbnN0IGNoYXIgKm1pY191c2VfYXN5bmNfYnVmZmVyX3JlYWRfZW52bmFtZSAgPQorICAgICJNSUNfVVNFX0FTWU5DX0JVRkZFUl9SRUFEIjsKKworLy8gZGV2aWNlIGluaXRpYWxpemF0aW9uIHR5cGUKK09mZmxvYWRJbml0VHlwZSBfX29mZmxvYWRfaW5pdF90eXBlID0gY19pbml0X29uX29mZmxvYWRfYWxsOworc3RhdGljIGNvbnN0IGNoYXIgKm9mZmxvYWRfaW5pdF9lbnZuYW1lID0gIk9GRkxPQURfSU5JVCI7CisKKy8vIGFjdGl2ZSB3YWl0CitzdGF0aWMgYm9vbCBfX29mZmxvYWRfYWN0aXZlX3dhaXQgPSB0cnVlOworc3RhdGljIGNvbnN0IGNoYXIgKm9mZmxvYWRfYWN0aXZlX3dhaXRfZW52bmFtZSA9ICJPRkZMT0FEX0FDVElWRV9XQUlUIjsKKworLy8gT01QX0RFRkFVTFRfREVWSUNFCitpbnQgX19vbXBfZGV2aWNlX251bSA9IDA7CitzdGF0aWMgY29uc3QgY2hhciAqb21wX2RldmljZV9udW1fZW52bmFtZSA9ICJPTVBfREVGQVVMVF9ERVZJQ0UiOworCisvLyBUaGUgbGlzdCBvZiBwZW5kaW5nIHRhcmdldCBsaWJyYXJpZXMKK3N0YXRpYyBib29sICAgICAgICAgICAgX190YXJnZXRfbGliczsKK3N0YXRpYyBUYXJnZXRJbWFnZUxpc3QgX190YXJnZXRfbGlic19saXN0Oworc3RhdGljIG11dGV4X3QgICAgICAgICBfX3RhcmdldF9saWJzX2xvY2s7CitzdGF0aWMgbXV0ZXhfdCAgICAgICAgIHN0YWNrX2FsbG9jX2xvY2s7CisKKy8vIFRhcmdldCBleGVjdXRhYmxlCitUYXJnZXRJbWFnZSogICAgICAgICAgIF9fdGFyZ2V0X2V4ZTsKKworc3RhdGljIGNoYXIgKiBvZmZsb2FkX2dldF9zcmNfYmFzZSh2b2lkICogcHRyLCB1aW50OF90IHR5cGUpCit7CisgICAgY2hhciAqYmFzZTsKKyAgICBpZiAoVkFSX1RZUEVfSVNfUFRSKHR5cGUpKSB7CisgICAgICAgIGJhc2UgPSAqc3RhdGljX2Nhc3Q8Y2hhcioqPihwdHIpOworICAgIH0KKyAgICBlbHNlIGlmIChWQVJfVFlQRV9JU19TQ0FMQVIodHlwZSkpIHsKKyAgICAgICAgYmFzZSA9IHN0YXRpY19jYXN0PGNoYXIqPihwdHIpOworICAgIH0KKyAgICBlbHNlIGlmIChWQVJfVFlQRV9JU19EVl9EQVRBX1NMSUNFKHR5cGUpIHx8IFZBUl9UWVBFX0lTX0RWX0RBVEEodHlwZSkpIHsKKyAgICAgICAgQXJyRGVzYyAqZHZwOworICAgICAgICBpZiAoVkFSX1RZUEVfSVNfRFZfREFUQV9TTElDRSh0eXBlKSkgeworICAgICAgICAgICAgY29uc3QgYXJyX2Rlc2MgKmFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPihwdHIpOworICAgICAgICAgICAgZHZwID0gKHR5cGUgPT0gY19kdl9kYXRhX3NsaWNlKSA/CisgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PEFyckRlc2MqPihhcC0+YmFzZSkgOgorICAgICAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8QXJyRGVzYyoqPihhcC0+YmFzZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBkdnAgPSAodHlwZSA9PSBjX2R2X2RhdGEpID8KKyAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFyckRlc2MqPihwdHIpIDoKKyAgICAgICAgICAgICAgICAgICpzdGF0aWNfY2FzdDxBcnJEZXNjKio+KHB0cik7CisgICAgICAgIH0KKyAgICAgICAgYmFzZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGR2cC0+QmFzZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBiYXNlID0gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIGJhc2U7Cit9CisKK3ZvaWQgT2ZmbG9hZERlc2NyaXB0b3I6OnJlcG9ydF9jb2lfZXJyb3IoZXJyb3JfdHlwZXMgbXNnLCBDT0lSRVNVTFQgcmVzKQoreworICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgdGhlICdwcm9jZXNzIGRpZWQnIGVycm9yCisgICAgaWYgKHJlcyA9PSBDT0lfUFJPQ0VTU19ESUVEKSB7CisgICAgICAgIG1fZGV2aWNlLmZpbmlfcHJvY2Vzcyh0cnVlKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHN3aXRjaCAobXNnKSB7CisgICAgICAgICAgICBjYXNlIGNfYnVmX2NyZWF0ZToKKyAgICAgICAgICAgICAgICBpZiAocmVzID09IENPSV9PVVRfT0ZfTUVNT1JZKSB7CisgICAgICAgICAgICAgICAgICAgIG1zZyA9IGNfYnVmX2NyZWF0ZV9vdXRfb2ZfbWVtOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBmYWxsdGhydSAqLworCisgICAgICAgICAgICBjYXNlIGNfYnVmX2NyZWF0ZV9mcm9tX21lbToKKyAgICAgICAgICAgIGNhc2UgY19idWZfZ2V0X2FkZHJlc3M6CisgICAgICAgICAgICBjYXNlIGNfcGlwZWxpbmVfY3JlYXRlOgorICAgICAgICAgICAgY2FzZSBjX3BpcGVsaW5lX3J1bl9mdW5jOgorICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IobXNnLCBtX2RldmljZS5nZXRfbG9naWNhbF9pbmRleCgpLCByZXMpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGNfYnVmX3JlYWQ6CisgICAgICAgICAgICBjYXNlIGNfYnVmX3dyaXRlOgorICAgICAgICAgICAgY2FzZSBjX2J1Zl9jb3B5OgorICAgICAgICAgICAgY2FzZSBjX2J1Zl9tYXA6CisgICAgICAgICAgICBjYXNlIGNfYnVmX3VubWFwOgorICAgICAgICAgICAgY2FzZSBjX2J1Zl9kZXN0cm95OgorICAgICAgICAgICAgY2FzZSBjX2J1Zl9zZXRfc3RhdGU6CisgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihtc2csIHJlcyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBleGl0KDEpOworfQorCitfT2ZmbG9hZF9yZXN1bHQgT2ZmbG9hZERlc2NyaXB0b3I6OnRyYW5zbGF0ZV9jb2lfZXJyb3IoQ09JUkVTVUxUIHJlcykgY29uc3QKK3sKKyAgICBzd2l0Y2ggKHJlcykgeworICAgICAgICBjYXNlIENPSV9TVUNDRVNTOgorICAgICAgICAgICAgcmV0dXJuIE9GRkxPQURfU1VDQ0VTUzsKKworICAgICAgICBjYXNlIENPSV9QUk9DRVNTX0RJRUQ6CisgICAgICAgICAgICByZXR1cm4gT0ZGTE9BRF9QUk9DRVNTX0RJRUQ7CisKKyAgICAgICAgY2FzZSBDT0lfT1VUX09GX01FTU9SWToKKyAgICAgICAgICAgIHJldHVybiBPRkZMT0FEX09VVF9PRl9NRU1PUlk7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBPRkZMT0FEX0VSUk9SOworICAgIH0KK30KKworYm9vbCBPZmZsb2FkRGVzY3JpcHRvcjo6YWxsb2NfcHRyX2RhdGEoCisgICAgUHRyRGF0YSogJnB0cl9kYXRhLAorICAgIHZvaWQgKmJhc2UsCisgICAgaW50NjRfdCBkaXNwLAorICAgIGludDY0X3Qgc2l6ZSwKKyAgICBpbnQ2NF90IGFsbG9jX2Rpc3AsCisgICAgaW50IGFsaWduCispCit7CisgICAgLy8gdG90YWwgbGVuZ3RoIG9mIGJhc2UKKyAgICBpbnQ2NF90IGxlbmd0aCA9IGRpc3AgKyBzaXplOworICAgIGJvb2wgaXNfbmV3OworCisgICAgT0ZGTE9BRF9UUkFDRSgzLCAiQ3JlYXRpbmcgYXNzb2NpYXRpb24gZm9yIGRhdGE6IGFkZHIgJXAsIGxlbmd0aCAlbGxkXG4iLAorICAgICAgICAgICAgICAgICAgYmFzZSwgbGVuZ3RoKTsKKworICAgIC8vIGFkZCBuZXcgZW50cnkKKyAgICBwdHJfZGF0YSA9IG1fZGV2aWNlLmluc2VydF9wdHJfZGF0YShiYXNlLCBsZW5ndGgsIGlzX25ldyk7CisgICAgaWYgKGlzX25ldykgeworCisgICAgICAgIE9GRkxPQURfVFJBQ0UoMywgIkFkZGVkIG5ldyBhc3NvY2lhdGlvblxuIik7CisKKyAgICAgICAgaWYgKGxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIE9mZmxvYWRUaW1lciB0aW1lcihnZXRfdGltZXJfZGF0YSgpLCBjX29mZmxvYWRfaG9zdF9hbGxvY19idWZmZXJzKTsKKyAgICAgICAgICAgIENPSVJFU1VMVCByZXM7CisKKyAgICAgICAgICAgIC8vIGFsaWduIHNob3VsZCBiZSBhIHBvd2VyIG9mIDIKKyAgICAgICAgICAgIGlmIChhbGlnbiA+IDAgJiYgKGFsaWduICYgKGFsaWduIC0gMSkpID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBvZmZzZXQgd2l0aGluIG1pY19idWZmZXIuIENhbiBkbyBvZmZzZXQgb3B0aW1pemF0aW9uCisgICAgICAgICAgICAgICAgLy8gb25seSB3aGVuIHNvdXJjZSBhZGRyZXNzIGFsaWdubWVudCBzYXRpc2ZpZXMgcmVxdWVzdGVkCisgICAgICAgICAgICAgICAgLy8gYWxpZ25tZW50IG9uIHRoZSB0YXJnZXQgKGNxMTcyNzM2KS4KKyAgICAgICAgICAgICAgICBpZiAoKHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KGJhc2UpICYgKGFsaWduIC0gMSkpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPm1pY19vZmZzZXQgPSByZWludGVycHJldF9jYXN0PGludHB0cl90PihiYXNlKSAmIDQwOTU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBidWZmZXIgc2l6ZSBhbmQgZmxhZ3MKKyAgICAgICAgICAgIHVpbnQ2NF90IGJ1ZmZlcl9zaXplID0gbGVuZ3RoICsgcHRyX2RhdGEtPm1pY19vZmZzZXQ7CisgICAgICAgICAgICB1aW50MzJfdCBidWZmZXJfZmxhZ3MgPSAwOworCisgICAgICAgICAgICAvLyBjcmVhdGUgYnVmZmVyIHdpdGggbGFyZ2UgcGFnZXMgaWYgZGF0YSBsZW5ndGggZXhjZWVkcworICAgICAgICAgICAgLy8gbGFyZ2UgcGFnZSB0aHJlc2hvbGQKKyAgICAgICAgICAgIGlmIChsZW5ndGggPj0gX19vZmZsb2FkX3VzZV8ybWJfYnVmZmVycykgeworICAgICAgICAgICAgICAgIGJ1ZmZlcl9mbGFncyA9IENPSV9PUFRJTUlaRV9IVUdFX1BBR0VfU0laRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY3JlYXRlIENQVSBidWZmZXIKKyAgICAgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0VfMSgzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfT0ZGTE9BRF9OVU1CRVIoZ2V0X3RpbWVyX2RhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNfb2ZmbG9hZF9jcmVhdGVfYnVmX2hvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJDcmVhdGluZyBidWZmZXIgZnJvbSBzb3VyY2UgbWVtb3J5ICVwLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJsZW5ndGggJWxsZFxuIiwgYmFzZSwgbGVuZ3RoKTsKKworICAgICAgICAgICAgLy8gcmVzdWx0IGlzIG5vdCBjaGVja2VkIGJlY2F1c2Ugd2UgY2FuIGNvbnRpbnVlIHdpdGhvdXQgY3B1CisgICAgICAgICAgICAvLyBidWZmZXIuIEluIHRoaXMgY2FzZSB3ZSB3aWxsIHVzZSBDT0lCdWZmZXJSZWFkL1dyaXRlIGluc3RlYWQKKyAgICAgICAgICAgIC8vIG9mIENPSUJ1ZmZlckNvcHkuCisgICAgICAgICAgICBDT0k6OkJ1ZmZlckNyZWF0ZUZyb21NZW1vcnkobGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9CVUZGRVJfTk9STUFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtX2RldmljZS5nZXRfcHJvY2VzcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwdHJfZGF0YS0+Y3B1X2J1Zik7CisKKyAgICAgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0VfMSgzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfT0ZGTE9BRF9OVU1CRVIoZ2V0X3RpbWVyX2RhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNfb2ZmbG9hZF9jcmVhdGVfYnVmX21pYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkNyZWF0aW5nIGJ1ZmZlciBmb3Igc2luazogc2l6ZSAlbGxkLCBvZmZzZXQgJWQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImZsYWdzID0weCV4XG4iLCBidWZmZXJfc2l6ZSAtIGFsbG9jX2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5taWNfb2Zmc2V0LCBidWZmZXJfZmxhZ3MpOworCisgICAgICAgICAgICAvLyBjcmVhdGUgTUlDIGJ1ZmZlcgorICAgICAgICAgICAgcmVzID0gQ09JOjpCdWZmZXJDcmVhdGUoYnVmZmVyX3NpemUgLSBhbGxvY19kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0JVRkZFUl9OT1JNQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtX2RldmljZS5nZXRfcHJvY2VzcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnB0cl9kYXRhLT5taWNfYnVmKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChtX2lzX21hbmRhdG9yeSkgeworICAgICAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX2NyZWF0ZSwgcmVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHRyX2RhdGEtPmFsbG9jX3B0cl9kYXRhX2xvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBtYWtlIGJ1ZmZlciB2YWxpZCBvbiB0aGUgZGV2aWNlLgorICAgICAgICAgICAgcmVzID0gQ09JOjpCdWZmZXJTZXRTdGF0ZShwdHJfZGF0YS0+bWljX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kZXZpY2UuZ2V0X3Byb2Nlc3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0JVRkZFUl9WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0JVRkZFUl9OT19NT1ZFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChtX2lzX21hbmRhdG9yeSkgeworICAgICAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX3NldF9zdGF0ZSwgcmVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHRyX2RhdGEtPmFsbG9jX3B0cl9kYXRhX2xvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXMgPSBDT0k6OkJ1ZmZlclNldFN0YXRlKHB0cl9kYXRhLT5taWNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfUFJPQ0VTU19TT1VSQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9CVUZGRVJfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0JVRkZFUl9OT19NT1ZFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChtX2lzX21hbmRhdG9yeSkgeworICAgICAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX3NldF9zdGF0ZSwgcmVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHRyX2RhdGEtPmFsbG9jX3B0cl9kYXRhX2xvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHRyX2RhdGEtPmFsbG9jX2Rpc3AgPSBhbGxvY19kaXNwOworICAgICAgICBwdHJfZGF0YS0+YWxsb2NfcHRyX2RhdGFfbG9jay51bmxvY2soKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIG11dGV4X2xvY2tlcl90IGxvY2tlcihwdHJfZGF0YS0+YWxsb2NfcHRyX2RhdGFfbG9jayk7CisKKyAgICAgICAgT0ZGTE9BRF9UUkFDRSgzLCAiRm91bmQgZXhpc3RpbmcgYXNzb2NpYXRpb246IGFkZHIgJXAsIGxlbmd0aCAlbGxkLCAiCisgICAgICAgICAgICAgICAgICAgICAgImlzX3N0YXRpYyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YS0+Y3B1X2FkZHIuc3RhcnQoKSwgcHRyX2RhdGEtPmNwdV9hZGRyLmxlbmd0aCgpLAorICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5pc19zdGF0aWMpOworCisgICAgICAgIC8vIFRoaXMgaXMgbm90IGEgbmV3IGVudHJ5LiBNYWtlIHN1cmUgdGhhdCBwcm92aWRlZCBhZGRyZXNzIHJhbmdlIGZpdHMKKyAgICAgICAgLy8gaW50byBleGlzdGluZyBvbmUuCisgICAgICAgIE1lbVJhbmdlIGFkZHJfcmFuZ2UoYmFzZSwgbGVuZ3RoIC0gcHRyX2RhdGEtPmFsbG9jX2Rpc3ApOworICAgICAgICBpZiAoIXB0cl9kYXRhLT5jcHVfYWRkci5jb250YWlucyhhZGRyX3JhbmdlKSkgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2JhZF9wdHJfbWVtX3JhbmdlKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiB0aGUgZW50cnkgaXMgYXNzb2NpYXRlZCB3aXRoIHN0YXRpYyBkYXRhIGl0IG1heSBub3QgaGF2ZSBidWZmZXJzCisgICAgICAgIC8vIGNyZWF0ZWQgYmVjYXVzZSB0aGV5IGFyZSBjcmVhdGVkIG9uIGRlbWFuZC4KKyAgICAgICAgaWYgKHB0cl9kYXRhLT5pc19zdGF0aWMgJiYgIWluaXRfc3RhdGljX3B0cl9kYXRhKHB0cl9kYXRhKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgT2ZmbG9hZERlc2NyaXB0b3I6OmZpbmRfcHRyX2RhdGEoCisgICAgUHRyRGF0YSogJnB0cl9kYXRhLAorICAgIHZvaWQgKmJhc2UsCisgICAgaW50NjRfdCBkaXNwLAorICAgIGludDY0X3Qgc2l6ZSwKKyAgICBib29sIHJlcG9ydF9lcnJvcgorKQoreworICAgIC8vIHRvdGFsIGxlbmd0aCBvZiBiYXNlCisgICAgaW50NjRfdCBsZW5ndGggPSBkaXNwICsgc2l6ZTsKKworICAgIE9GRkxPQURfVFJBQ0UoMywgIkxvb2tpbmcgZm9yIGFzc29jaWF0aW9uIGZvciBkYXRhOiBhZGRyICVwLCAiCisgICAgICAgICAgICAgICAgICAibGVuZ3RoICVsbGRcbiIsIGJhc2UsIGxlbmd0aCk7CisKKyAgICAvLyBmaW5kIGV4aXN0aW5nIGFzc29jaWF0aW9uIGluIHBvaW50ZXIgdGFibGUKKyAgICBwdHJfZGF0YSA9IG1fZGV2aWNlLmZpbmRfcHRyX2RhdGEoYmFzZSk7CisgICAgaWYgKHB0cl9kYXRhID09IDApIHsKKyAgICAgICAgaWYgKHJlcG9ydF9lcnJvcikgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX25vX3B0cl9kYXRhLCBiYXNlKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICAgICAgT0ZGTE9BRF9UUkFDRSgzLCAiQXNzb2NpYXRpb24gZG9lcyBub3QgZXhpc3RcbiIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBPRkZMT0FEX1RSQUNFKDMsICJGb3VuZCBhc3NvY2lhdGlvbjogYmFzZSAlcCwgbGVuZ3RoICVsbGQsIGlzX3N0YXRpYyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5jcHVfYWRkci5zdGFydCgpLCBwdHJfZGF0YS0+Y3B1X2FkZHIubGVuZ3RoKCksCisgICAgICAgICAgICAgICAgICBwdHJfZGF0YS0+aXNfc3RhdGljKTsKKworICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHByb3ZpZGVkIGFkZHJlc3MgcmFuZ2UgZml0cyBpbnRvIGV4aXN0aW5nIG9uZQorICAgIE1lbVJhbmdlIGFkZHJfcmFuZ2UoYmFzZSwgbGVuZ3RoKTsKKyAgICBpZiAoIXB0cl9kYXRhLT5jcHVfYWRkci5jb250YWlucyhhZGRyX3JhbmdlKSkgeworICAgICAgICBpZiAocmVwb3J0X2Vycm9yKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfYmFkX3B0cl9tZW1fcmFuZ2UpOworICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorICAgICAgICBPRkZMT0FEX1RSQUNFKDMsICJFeGlzdGluZyBhc3NvY2lhdGlvbiBwYXJ0aWFsbHkgb3ZlcmxhcHMgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICAgImRhdGEgYWRkcmVzcyByYW5nZVxuIik7CisgICAgICAgIHB0cl9kYXRhID0gMDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gaWYgdGhlIGVudHJ5IGlzIGFzc29jaWF0ZWQgd2l0aCBzdGF0aWMgZGF0YSBpdCBtYXkgbm90IGhhdmUgYnVmZmVycworICAgIC8vIGNyZWF0ZWQgYmVjYXVzZSB0aGV5IGFyZSBjcmVhdGVkIG9uIGRlbWFuZC4KKyAgICBpZiAocHRyX2RhdGEtPmlzX3N0YXRpYyAmJiAhaW5pdF9zdGF0aWNfcHRyX2RhdGEocHRyX2RhdGEpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBPZmZsb2FkRGVzY3JpcHRvcjo6aW5pdF9zdGF0aWNfcHRyX2RhdGEoUHRyRGF0YSAqcHRyX2RhdGEpCit7CisgICAgT2ZmbG9hZFRpbWVyIHRpbWVyKGdldF90aW1lcl9kYXRhKCksIGNfb2ZmbG9hZF9ob3N0X2FsbG9jX2J1ZmZlcnMpOworCisgICAgaWYgKHB0cl9kYXRhLT5jcHVfYnVmID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9UUkFDRSgzLCAiQ3JlYXRpbmcgYnVmZmVyIGZyb20gc291cmNlIG1lbW9yeSAlbGx4XG4iLAorICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5jcHVfYWRkci5zdGFydCgpKTsKKworICAgICAgICBDT0lSRVNVTFQgcmVzID0gQ09JOjpCdWZmZXJDcmVhdGVGcm9tTWVtb3J5KAorICAgICAgICAgICAgcHRyX2RhdGEtPmNwdV9hZGRyLmxlbmd0aCgpLAorICAgICAgICAgICAgQ09JX0JVRkZFUl9OT1JNQUwsCisgICAgICAgICAgICAwLAorICAgICAgICAgICAgY29uc3RfY2FzdDx2b2lkKj4ocHRyX2RhdGEtPmNwdV9hZGRyLnN0YXJ0KCkpLAorICAgICAgICAgICAgMSwgJm1fZGV2aWNlLmdldF9wcm9jZXNzKCksCisgICAgICAgICAgICAmcHRyX2RhdGEtPmNwdV9idWYpOworCisgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX2NyZWF0ZV9mcm9tX21lbSwgcmVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwdHJfZGF0YS0+bWljX2J1ZiA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfVFJBQ0UoMywgIkNyZWF0aW5nIGJ1ZmZlciBmcm9tIHNpbmsgbWVtb3J5ICVsbHhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPm1pY19hZGRyKTsKKworICAgICAgICBDT0lSRVNVTFQgcmVzID0gQ09JOjpCdWZmZXJDcmVhdGVGcm9tTWVtb3J5KAorICAgICAgICAgICAgcHRyX2RhdGEtPmNwdV9hZGRyLmxlbmd0aCgpLAorICAgICAgICAgICAgQ09JX0JVRkZFUl9OT1JNQUwsCisgICAgICAgICAgICBDT0lfU0lOS19NRU1PUlksCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHZvaWQqPihwdHJfZGF0YS0+bWljX2FkZHIpLAorICAgICAgICAgICAgMSwgJm1fZGV2aWNlLmdldF9wcm9jZXNzKCksCisgICAgICAgICAgICAmcHRyX2RhdGEtPm1pY19idWYpOworCisgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX2NyZWF0ZV9mcm9tX21lbSwgcmVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE9mZmxvYWREZXNjcmlwdG9yOjppbml0X21pY19hZGRyZXNzKFB0ckRhdGEgKnB0cl9kYXRhKQoreworICAgIGlmIChwdHJfZGF0YS0+bWljX2J1ZiAhPSAwICYmIHB0cl9kYXRhLT5taWNfYWRkciA9PSAwKSB7CisgICAgICAgIENPSVJFU1VMVCByZXMgPSBDT0k6OkJ1ZmZlckdldFNpbmtBZGRyZXNzKHB0cl9kYXRhLT5taWNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHRyX2RhdGEtPm1pY19hZGRyKTsKKyAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobV9pc19tYW5kYXRvcnkpIHsKKyAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX2dldF9hZGRyZXNzLCByZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIE9mZmxvYWREZXNjcmlwdG9yOjpudWxsaWZ5X3RhcmdldF9zdGFjaygKKyAgICBDT0lCVUZGRVIgdGFyZ19idWYsCisgICAgdWludDY0X3Qgc2l6ZQorKQoreworICAgIGNoYXIgKiBwdHIgPSAoY2hhciopbWFsbG9jKHNpemUpOworICAgIENPSVJFU1VMVCByZXM7CisKKyAgICBtZW1zZXQocHRyLCAwLCBzaXplKTsKKyAgICByZXMgPSBDT0k6OkJ1ZmZlcldyaXRlKAorICAgICAgICB0YXJnX2J1ZiwKKyAgICAgICAgMCwKKyAgICAgICAgcHRyLAorICAgICAgICBzaXplLAorICAgICAgICBDT0lfQ09QWV9VTlNQRUNJRklFRCwKKyAgICAgICAgMCwgMCwgMCk7CisgICAgZnJlZShwdHIpOworICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl93cml0ZSwgcmVzKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgT2ZmbG9hZERlc2NyaXB0b3I6Om9mZmxvYWRfc3RhY2tfbWVtb3J5X21hbmFnZXIoCisgICAgY29uc3Qgdm9pZCAqIHN0YWNrX2JlZ2luLAorICAgIGludCAgcm91dGluZV9pZCwKKyAgICBpbnQgIGJ1Zl9zaXplLAorICAgIGludCAgYWxpZ24sCisgICAgYm9vbCAqaXNfbmV3KQoreworICAgIG11dGV4X2xvY2tlcl90IGxvY2tlcihzdGFja19hbGxvY19sb2NrKTsKKworICAgIFBlcnNpc3REYXRhICogbmV3X2VsOworICAgIFBlcnNpc3REYXRhTGlzdDo6aXRlcmF0b3IgaXRfYmVnaW4gPSBtX2RldmljZS5tX3BlcnNpc3RfbGlzdC5iZWdpbigpOworICAgIFBlcnNpc3REYXRhTGlzdDo6aXRlcmF0b3IgaXRfZW5kOworICAgIGludCBlcmFzZSA9IDA7CisKKyAgICAqaXNfbmV3ID0gZmFsc2U7CisKKyAgICBmb3IgKFBlcnNpc3REYXRhTGlzdDo6aXRlcmF0b3IgaXQgPSBtX2RldmljZS5tX3BlcnNpc3RfbGlzdC5iZWdpbigpOworICAgICAgICBpdCAhPSBtX2RldmljZS5tX3BlcnNpc3RfbGlzdC5lbmQoKTsgaXQrKykgeworICAgICAgICBQZXJzaXN0RGF0YSBjdXJfZWwgPSAqaXQ7CisKKyAgICAgICAgaWYgKHN0YWNrX2JlZ2luID4gaXQtPnN0YWNrX2NwdV9hZGRyKSB7CisgICAgICAgICAgICAvLyB0aGlzIHN0YWNrIGRhdGEgbXVzdCBiZSBkZXN0cm95ZWQKKyAgICAgICAgICAgIG1fZGVzdHJveV9zdGFjay5wdXNoX2Zyb250KGN1cl9lbC5zdGFja19wdHJfZGF0YSk7CisgICAgICAgICAgICBpdF9lbmQgPSBpdDsKKyAgICAgICAgICAgIGVyYXNlKys7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc3RhY2tfYmVnaW4gPT0gaXQtPnN0YWNrX2NwdV9hZGRyKSB7CisgICAgICAgICAgICBpZiAocm91dGluZV9pZCAhPSBpdC0+IHJvdXRpbmVfaWQpIHsKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHN0YWNrIGRhdGEgbXVzdCBiZSBkZXN0cm95ZWQKKyAgICAgICAgICAgICAgICBtX2Rlc3Ryb3lfc3RhY2sucHVzaF9mcm9udChjdXJfZWwuc3RhY2tfcHRyX2RhdGEpOworICAgICAgICAgICAgICAgIGl0X2VuZCA9IGl0OworICAgICAgICAgICAgICAgIGVyYXNlKys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBzdGFjayBkYXRhIGlzIHJldXNlZAorICAgICAgICAgICAgICAgIG1fc3RhY2tfcHRyX2RhdGEgPSBpdC0+c3RhY2tfcHRyX2RhdGE7CisgICAgICAgICAgICAgICAgaWYgKGVyYXNlID4gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBhbGwgb2Jzb2xldGUgc3RhY2sgc2VjdGlvbnMgbXVzdCBiZSBlcmFzZWQgZnJvbSB0aGUgbGlzdAorICAgICAgICAgICAgICAgICAgICBtX2RldmljZS5tX3BlcnNpc3RfbGlzdC5lcmFzZShpdF9iZWdpbiwgKytpdF9lbmQpOworCisgICAgICAgICAgICAgICAgICAgIG1faW5fZGF0YWxlbiArPQorICAgICAgICAgICAgICAgICAgICAgICAgZXJhc2UgKiBzaXplb2YobmV3X2VsLT5zdGFja19wdHJfZGF0YS0+bWljX2FkZHIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBPRkZMT0FEX1RSQUNFKDMsICJSZXVzZSBvZiBzdGFjayBidWZmZXIgd2l0aCBhZGRyICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zdGFja19wdHJfZGF0YS0+bWljX2FkZHIpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHN0YWNrX2JlZ2luIDwgaXQtPnN0YWNrX2NwdV9hZGRyKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChlcmFzZSA+IDApIHsKKyAgICAgICAgLy8gYWxsIG9ic29sZXRlIHN0YWNrIHNlY3Rpb25zIG11c3QgYmUgZXJhc2VkIGZyb20gdGhlIGxpc3QKKyAgICAgICAgbV9kZXZpY2UubV9wZXJzaXN0X2xpc3QuZXJhc2UoaXRfYmVnaW4sICsraXRfZW5kKTsKKyAgICAgICAgbV9pbl9kYXRhbGVuICs9IGVyYXNlICogc2l6ZW9mKG5ld19lbC0+c3RhY2tfcHRyX2RhdGEtPm1pY19hZGRyKTsKKyAgICB9CisgICAgLy8gbmV3IHN0YWNrIHRhYmxlIGlzIGNyZWF0ZWQKKyAgICBuZXdfZWwgPSBuZXcgUGVyc2lzdERhdGEoc3RhY2tfYmVnaW4sIHJvdXRpbmVfaWQsIGJ1Zl9zaXplKTsKKyAgICAvLyBjcmVhdGUgTUlDIGJ1ZmZlcgorICAgIENPSVJFU1VMVCByZXM7CisgICAgdWludDMyX3QgYnVmZmVyX2ZsYWdzID0gMDsKKworICAgIC8vIGNyZWF0ZSBidWZmZXIgd2l0aCBsYXJnZSBwYWdlcyBpZiBkYXRhIGxlbmd0aCBleGNlZWRzCisgICAgLy8gbGFyZ2UgcGFnZSB0aHJlc2hvbGQKKyAgICBpZiAoYnVmX3NpemUgPj0gX19vZmZsb2FkX3VzZV8ybWJfYnVmZmVycykgeworICAgICAgICBidWZmZXJfZmxhZ3MgPSBDT0lfT1BUSU1JWkVfSFVHRV9QQUdFX1NJWkU7CisgICAgfQorICAgIHJlcyA9IENPSTo6QnVmZmVyQ3JlYXRlKGJ1Zl9zaXplLAorICAgICAgICBDT0lfQlVGRkVSX05PUk1BTCwKKyAgICAgICAgYnVmZmVyX2ZsYWdzLAorICAgICAgICAwLAorICAgICAgICAxLAorICAgICAgICAmbV9kZXZpY2UuZ2V0X3Byb2Nlc3MoKSwKKyAgICAgICAgJm5ld19lbC0+c3RhY2tfcHRyX2RhdGEtPm1pY19idWYpOworICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobV9pc19tYW5kYXRvcnkpIHsKKyAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfY3JlYXRlLCByZXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLy8gbWFrZSBidWZmZXIgdmFsaWQgb24gdGhlIGRldmljZS4KKyAgICByZXMgPSBDT0k6OkJ1ZmZlclNldFN0YXRlKG5ld19lbC0+c3RhY2tfcHRyX2RhdGEtPm1pY19idWYsCisgICAgICAgIG1fZGV2aWNlLmdldF9wcm9jZXNzKCksCisgICAgICAgIENPSV9CVUZGRVJfVkFMSUQsCisgICAgICAgIENPSV9CVUZGRVJfTk9fTU9WRSwKKyAgICAgICAgMCwgMCwgMCk7CisgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChtX2lzX21hbmRhdG9yeSkgeworICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl9zZXRfc3RhdGUsIHJlcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXMgPSBDT0k6OkJ1ZmZlclNldFN0YXRlKG5ld19lbC0+c3RhY2tfcHRyX2RhdGEtPm1pY19idWYsCisgICAgICAgIENPSV9QUk9DRVNTX1NPVVJDRSwKKyAgICAgICAgQ09JX0JVRkZFUl9JTlZBTElELAorICAgICAgICBDT0lfQlVGRkVSX05PX01PVkUsCisgICAgICAgIDAsIDAsIDApOworICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobV9pc19tYW5kYXRvcnkpIHsKKyAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfc2V0X3N0YXRlLCByZXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLy8gcGVyc2lzdGVuY2UgYWxnb3JpdGhtIHJlcXVpcmVzIHRhcmdldCBzdGFjayBpbml0aWFseSB0byBiZSBudWxsaWZpZWQKKyAgICBpZiAoIW51bGxpZnlfdGFyZ2V0X3N0YWNrKG5ld19lbC0+c3RhY2tfcHRyX2RhdGEtPm1pY19idWYsIGJ1Zl9zaXplKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbV9zdGFja19wdHJfZGF0YSA9IG5ld19lbC0+c3RhY2tfcHRyX2RhdGE7CisgICAgaW5pdF9taWNfYWRkcmVzcyhtX3N0YWNrX3B0cl9kYXRhKTsKKyAgICBPRkZMT0FEX1RSQUNFKDMsICJBbGxvY2F0aW5nIHN0YWNrIGJ1ZmZlciB3aXRoIGFkZHIgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgbV9zdGFja19wdHJfZGF0YS0+bWljX2FkZHIpOworICAgIG1fZGV2aWNlLm1fcGVyc2lzdF9saXN0LnB1c2hfZnJvbnQoKm5ld19lbCk7CisgICAgaW5pdF9taWNfYWRkcmVzcyhuZXdfZWwtPnN0YWNrX3B0cl9kYXRhKTsKKyAgICAqaXNfbmV3ID0gdHJ1ZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBPZmZsb2FkRGVzY3JpcHRvcjo6c2V0dXBfZGVzY3JpcHRvcnMoCisgICAgVmFyRGVzYyAqdmFycywKKyAgICBWYXJEZXNjMiAqdmFyczIsCisgICAgaW50IHZhcnNfdG90YWwsCisgICAgaW50IGVudHJ5X2lkLAorICAgIGNvbnN0IHZvaWQgKnN0YWNrX2FkZHIKKykKK3sKKyAgICBDT0lSRVNVTFQgcmVzOworCisgICAgT2ZmbG9hZFRpbWVyIHRpbWVyKGdldF90aW1lcl9kYXRhKCksIGNfb2ZmbG9hZF9ob3N0X3NldHVwX2J1ZmZlcnMpOworCisgICAgLy8gbWFrZSBhIGNvcHkgb2YgdmFyaWFibGUgZGVzY3JpcHRvcnMKKyAgICBtX3ZhcnNfdG90YWwgPSB2YXJzX3RvdGFsOworICAgIGlmICh2YXJzX3RvdGFsID4gMCkgeworICAgICAgICBtX3ZhcnMgPSAoVmFyRGVzYyopIG1hbGxvYyhtX3ZhcnNfdG90YWwgKiBzaXplb2YoVmFyRGVzYykpOworICAgICAgICBtZW1jcHkobV92YXJzLCB2YXJzLCBtX3ZhcnNfdG90YWwgKiBzaXplb2YoVmFyRGVzYykpOworICAgICAgICBtX3ZhcnNfZXh0cmEgPSAoVmFyRXh0cmEqKSBtYWxsb2MobV92YXJzX3RvdGFsICogc2l6ZW9mKFZhckV4dHJhKSk7CisgICAgfQorCisgICAgLy8gZGVwZW5kZW5jaWVzCisgICAgbV9pbl9kZXBzID0gKENPSUVWRU5UKikgbWFsbG9jKHNpemVvZihDT0lFVkVOVCkgKiAobV92YXJzX3RvdGFsICArIDEpKTsKKyAgICBpZiAobV92YXJzX3RvdGFsID4gMCkgeworICAgICAgICBtX291dF9kZXBzID0gKENPSUVWRU5UKikgbWFsbG9jKHNpemVvZihDT0lFVkVOVCkgKiBtX3ZhcnNfdG90YWwpOworICAgIH0KKworICAgIC8vIGNvcHlpbi9jb3B5b3V0IGRhdGEgbGVuZ3RoCisgICAgbV9pbl9kYXRhbGVuID0gMDsKKyAgICBtX291dF9kYXRhbGVuID0gMDsKKworICAgIC8vIEZpcnN0IHBhc3Mgb3ZlciB2YXJpYWJsZSBkZXNjcmlwdG9ycworICAgIC8vIC0gQ2FsY3VsYXRlIHNpemUgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgbm9uLXBvaW50ZXIgZGF0YQorICAgIC8vIC0gQWxsb2NhdGUgYnVmZmVycyBmb3IgaW5wdXQgYW5kIG91dHB1dCBwb2ludGVycworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV92YXJzX3RvdGFsOyBpKyspIHsKKyAgICAgICAgdm9pZCogICBhbGxvY19iYXNlID0gTlVMTDsKKyAgICAgICAgaW50NjRfdCBhbGxvY19kaXNwID0gMDsKKyAgICAgICAgaW50NjRfdCBhbGxvY19zaXplOworICAgICAgICBib29sICAgIHNyY19pc19mb3JfbWljID0gKG1fdmFyc1tpXS5kaXJlY3Rpb24ub3V0IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmludG8gPT0gTlVMTCk7CisKKyAgICAgICAgY29uc3QgY2hhciAqdmFyX3NuYW1lID0gIiI7CisgICAgICAgIGlmICh2YXJzMiAhPSBOVUxMICYmIGkgPCB2YXJzX3RvdGFsKSB7CisgICAgICAgICAgICBpZiAodmFyczJbaV0uc25hbWUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHZhcl9zbmFtZSA9IHZhcnMyW2ldLnNuYW1lOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIE9GRkxPQURfVFJBQ0UoMiwgIiAgIFZhckRlc2MgJWQsIHZhcj0lcywgJXMsICVzXG4iLAorICAgICAgICAgICAgaSwgdmFyX3NuYW1lLAorICAgICAgICAgICAgdmFyZGVzY19kaXJlY3Rpb25fYXNfc3RyaW5nW21fdmFyc1tpXS5kaXJlY3Rpb24uYml0c10sCisgICAgICAgICAgICB2YXJkZXNjX3R5cGVfYXNfc3RyaW5nW21fdmFyc1tpXS50eXBlLnNyY10pOworICAgICAgICBpZiAodmFyczIgIT0gTlVMTCAmJiBpIDwgdmFyc190b3RhbCAmJiB2YXJzMltpXS5kbmFtZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBPRkZMT0FEX1RSQUNFKDIsICIgICAgICAgICAgICAgIGludG89JXMsICVzXG4iLCB2YXJzMltpXS5kbmFtZSwKKyAgICAgICAgICAgICAgICB2YXJkZXNjX3R5cGVfYXNfc3RyaW5nW21fdmFyc1tpXS50eXBlLmRzdF0pOworICAgICAgICB9CisgICAgICAgIE9GRkxPQURfVFJBQ0UoMiwKKyAgICAgICAgICAgICIgICAgICAgICAgICAgIHR5cGVfc3JjPSVkLCB0eXBlX2RzdG49JWQsIGRpcmVjdGlvbj0lZCwgIgorICAgICAgICAgICAgImFsbG9jX2lmPSVkLCBmcmVlX2lmPSVkLCBhbGlnbj0lZCwgbWljX29mZnNldD0lZCwgZmxhZ3M9MHgleCwgIgorICAgICAgICAgICAgIm9mZnNldD0lbGxkLCBzaXplPSVsbGQsIGNvdW50L2Rpc3A9JWxsZCwgcHRyPSVwLCBpbnRvPSVwXG4iLAorICAgICAgICAgICAgbV92YXJzW2ldLnR5cGUuc3JjLAorICAgICAgICAgICAgbV92YXJzW2ldLnR5cGUuZHN0LAorICAgICAgICAgICAgbV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzLAorICAgICAgICAgICAgbV92YXJzW2ldLmFsbG9jX2lmLAorICAgICAgICAgICAgbV92YXJzW2ldLmZyZWVfaWYsCisgICAgICAgICAgICBtX3ZhcnNbaV0uYWxpZ24sCisgICAgICAgICAgICBtX3ZhcnNbaV0ubWljX29mZnNldCwKKyAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5iaXRzLAorICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCwKKyAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplLAorICAgICAgICAgICAgbV92YXJzW2ldLmNvdW50LAorICAgICAgICAgICAgbV92YXJzW2ldLnB0ciwKKyAgICAgICAgICAgIG1fdmFyc1tpXS5pbnRvKTsKKworICAgICAgICBpZiAobV92YXJzW2ldLmFsbG9jICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8vIGFycmF5IGRlc2NyaXB0b3IKKyAgICAgICAgICAgIGNvbnN0IGFycl9kZXNjICphcCA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPihtX3ZhcnNbaV0uYWxsb2MpOworCisgICAgICAgICAgICAvLyBkZWJ1ZyBkdW1wCisgICAgICAgICAgICBfX2Fycl9kZXNjX2R1bXAoIiAgICAiLCAiQUxMT0MiLCBhcCwgMCk7CisKKyAgICAgICAgICAgIF9fYXJyX2RhdGFfb2Zmc2V0X2FuZF9sZW5ndGgoYXAsIGFsbG9jX2Rpc3AsIGFsbG9jX3NpemUpOworCisgICAgICAgICAgICBhbGxvY19iYXNlID0gcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oYXAtPmJhc2UpOworICAgICAgICB9CisKKyAgICAgICAgbV92YXJzX2V4dHJhW2ldLmNwdV9kaXNwID0gMDsKKyAgICAgICAgbV92YXJzX2V4dHJhW2ldLmNwdV9vZmZzZXQgPSAwOworICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGEgPSAwOworICAgICAgICBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfc3JjID0gMDsKKyAgICAgICAgbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX2RzdCA9IDA7CisgICAgICAgIC8vIGZsYWcgaXNfYXJyX3B0cl9lbCBpcyAxIG9ubHkgZm9yIHZhcl9kZXNjcyBnZW5lcmF0ZWQKKyAgICAgICAgLy8gZm9yIGNfZGF0YV9wdHJfYXJyYXkgdHlwZQorICAgICAgICBpZiAoaSA8IHZhcnNfdG90YWwpIHsKKyAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5pc19hcnJfcHRyX2VsID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAobV92YXJzW2ldLnR5cGUuc3JjKSB7CisgICAgICAgICAgICBjYXNlIGNfZGF0YV9wdHJfYXJyYXk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnJfZGVzYyAqYXA7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhckRlc2MzICp2ZDMgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgVmFyRGVzYzMqPihtX3ZhcnNbaV0ucHRyKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzID0gdmQzLT5hcnJheV9maWVsZHM7CisgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVFJBQ0UoMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgIHBvaW50ZXIgYXJyYXkgZmxhZ3MgPSAlMDR4XG4iLCBmbGFncyk7CisgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVFJBQ0UoMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgIHBvaW50ZXIgYXJyYXkgdHlwZSBpcyAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhcmRlc2NfdHlwZV9hc19zdHJpbmdbZmxhZ3MgJiAweDNmXSk7CisgICAgICAgICAgICAgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPih2ZDMtPnB0cl9hcnJheSk7CisgICAgICAgICAgICAgICAgICAgIF9fYXJyX2Rlc2NfZHVtcCgiICAgICAgICAgICAgICAiLCAicHRyIGFycmF5IiwgYXAsIDApOworICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmludG8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPihtX3ZhcnNbaV0uaW50byk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2Fycl9kZXNjX2R1bXAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgIiwgImludG8gYXJyYXkiLCBhcCwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKChmbGFncyAmICgxPDxmbGFnX2FsaWduX2lzX2FycmF5KSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXAgPSBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KHZkMy0+YWxpZ25fYXJyYXkpOworICAgICAgICAgICAgICAgICAgICAgICAgX19hcnJfZGVzY19kdW1wKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICIsICJhbGlnbiBhcnJheSIsIGFwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoKGZsYWdzICYgKDE8PGZsYWdfYWxsb2NfaWZfaXNfYXJyYXkpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4odmQzLT5hbGxvY19pZl9hcnJheSk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2Fycl9kZXNjX2R1bXAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgIiwgImFsbG9jX2lmIGFycmF5IiwgYXAsIDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICgoZmxhZ3MgJiAoMTw8ZmxhZ19mcmVlX2lmX2lzX2FycmF5KSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXAgPSBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KHZkMy0+ZnJlZV9pZl9hcnJheSk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2Fycl9kZXNjX2R1bXAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgIiwgImZyZWVfaWYgYXJyYXkiLCBhcCwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKChmbGFncyAmICgxPDxmbGFnX2V4dGVudF9zdGFydF9pc19hcnJheSkpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPih2ZDMtPmV4dGVudF9zdGFydCk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2Fycl9kZXNjX2R1bXAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgIiwgImV4dGVudF9zdGFydCBhcnJheSIsIGFwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoZmxhZ3MgJgorICAgICAgICAgICAgICAgICAgICAgICAgKDE8PGZsYWdfZXh0ZW50X3N0YXJ0X2lzX3NjYWxhcikpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVFJBQ0UoMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICBleHRlbnRfc3RhcnQgc2NhbGFyID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDY0X3QpdmQzLT5leHRlbnRfc3RhcnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICgoZmxhZ3MgJiAoMTw8ZmxhZ19leHRlbnRfZWxlbWVudHNfaXNfYXJyYXkpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmQzLT5leHRlbnRfZWxlbWVudHMpOworICAgICAgICAgICAgICAgICAgICAgICAgX19hcnJfZGVzY19kdW1wKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICIsICJleHRlbnRfZWxlbWVudHMgYXJyYXkiLCBhcCwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGZsYWdzICYKKyAgICAgICAgICAgICAgICAgICAgICAgICgxPDxmbGFnX2V4dGVudF9lbGVtZW50c19pc19zY2FsYXIpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBPRkZMT0FEX1RSQUNFKDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgZXh0ZW50X2VsZW1lbnRzIHNjYWxhciA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KXZkMy0+ZXh0ZW50X2VsZW1lbnRzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoKGZsYWdzICYgKDE8PGZsYWdfaW50b19zdGFydF9pc19hcnJheSkpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPih2ZDMtPmludG9fc3RhcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgX19hcnJfZGVzY19kdW1wKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICIsICJpbnRvX3N0YXJ0IGFycmF5IiwgYXAsIDApOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChmbGFncyAmCisgICAgICAgICAgICAgICAgICAgICAgICAoMTw8ZmxhZ19pbnRvX3N0YXJ0X2lzX3NjYWxhcikpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVFJBQ0UoMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICBpbnRvX3N0YXJ0IHNjYWxhciA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KXZkMy0+aW50b19zdGFydCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKChmbGFncyAmICgxPDxmbGFnX2ludG9fZWxlbWVudHNfaXNfYXJyYXkpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4odmQzLT5pbnRvX2VsZW1lbnRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fYXJyX2Rlc2NfZHVtcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAiLCAiaW50b19lbGVtZW50cyBhcnJheSIsIGFwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoZmxhZ3MgJgorICAgICAgICAgICAgICAgICAgICAgICAgKDE8PGZsYWdfaW50b19lbGVtZW50c19pc19zY2FsYXIpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBPRkZMT0FEX1RSQUNFKDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgaW50b19lbGVtZW50cyBzY2FsYXIgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCl2ZDMtPmludG9fZWxlbWVudHMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICgoZmxhZ3MgJiAoMTw8ZmxhZ19hbGxvY19zdGFydF9pc19hcnJheSkpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPih2ZDMtPmFsbG9jX3N0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fYXJyX2Rlc2NfZHVtcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAiLCAiYWxsb2Nfc3RhcnQgYXJyYXkiLCBhcCwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGZsYWdzICYKKyAgICAgICAgICAgICAgICAgICAgICAgICgxPDxmbGFnX2FsbG9jX3N0YXJ0X2lzX3NjYWxhcikpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVFJBQ0UoMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICBhbGxvY19zdGFydCBzY2FsYXIgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCl2ZDMtPmFsbG9jX3N0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoKGZsYWdzICYgKDE8PGZsYWdfYWxsb2NfZWxlbWVudHNfaXNfYXJyYXkpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4odmQzLT5hbGxvY19lbGVtZW50cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2Fycl9kZXNjX2R1bXAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgIiwgImFsbG9jX2VsZW1lbnRzIGFycmF5IiwgYXAsIDApOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChmbGFncyAmCisgICAgICAgICAgICAgICAgICAgICAgICAoMTw8ZmxhZ19hbGxvY19lbGVtZW50c19pc19zY2FsYXIpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBPRkZMT0FEX1RSQUNFKDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgYWxsb2NfZWxlbWVudHMgc2NhbGFyID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDY0X3QpdmQzLT5hbGxvY19lbGVtZW50cyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFnZW5fdmFyX2Rlc2NzX2Zvcl9wb2ludGVyX2FycmF5KGkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgY19kYXRhOgorICAgICAgICAgICAgY2FzZSBjX3ZvaWRfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2NlYW5fdmFyOgorICAgICAgICAgICAgICAgIC8vIEluIGFsbCB1c2VzIGxhdGVyCisgICAgICAgICAgICAgICAgLy8gVmFyRGVzYy5zaXplIHdpbGwgaGF2ZSB0aGUgbGVuZ3RoIG9mIHRoZSBkYXRhIHRvIGJlCisgICAgICAgICAgICAgICAgLy8gdHJhbnNmZXJyZWQKKyAgICAgICAgICAgICAgICAvLyBWYXJEZXNjLmRpc3Agd2lsbCBoYXZlIGFuIG9mZnNldCBmcm9tIGJhc2UKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLnR5cGUuc3JjID09IGNfY2Vhbl92YXIpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYXJyYXkgZGVzY3JpcHRvcgorICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnJfZGVzYyAqYXAgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPihtX3ZhcnNbaV0ucHRyKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBkZWJ1ZyBkdW1wCisgICAgICAgICAgICAgICAgICAgIF9fYXJyX2Rlc2NfZHVtcCgiIiwgIklOL09VVCIsIGFwLCAwKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQgYW5kIGxlbmd0aCBhcmUgZGVyaXZlZCBmcm9tIHRoZSBhcnJheSBkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgICAgIF9fYXJyX2RhdGFfb2Zmc2V0X2FuZF9sZW5ndGgoYXAsIG1fdmFyc1tpXS5kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpc19hcnJfZGVzY19jb250aWd1b3VzKGFwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX25vbmNvbnRfc3JjID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19zcmMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfcmVhZF9yYW5nZXNfYXJyX2Rlc2MoYXApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBuZWNlc3NhcnkgaW5mb3JtYXRpb24gYWJvdXQgbGVuZ3RoIGFuZCBvZmZzZXQgaXMKKyAgICAgICAgICAgICAgICAgICAgLy8gdHJhbnNmZXJyZWQgaW4gdmFyIGRlc2NyaXB0b3IuIFRoZXJlIGlzIG5vIG5lZWQgdG8gc2VuZAorICAgICAgICAgICAgICAgICAgICAvLyBhcnJheSBkZXNjcmlwdG9yIHRvIHRoZSB0YXJnZXQgc2lkZS4KKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGFwLT5iYXNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplICo9IG1fdmFyc1tpXS5jb3VudDsKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmRpc3AgPSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgdHJhbnNmZXIgc2l6ZSA+IDAKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5zaXplIDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY196ZXJvX29yX25lZ190cmFuc2Zlcl9zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpYykgeworICAgICAgICAgICAgICAgICAgICAgICAgUHRyRGF0YSAqcHRyX2RhdGE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgZGF0YSBhc3NvY2lhdGVkIHdpdGggdmFyaWFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmluZF9wdHJfZGF0YShwdHJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ucHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB0cl9kYXRhICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQgdG8gYmFzZSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lbW9yeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopIG1fdmFyc1tpXS5wdHIgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopIHB0cl9kYXRhLT5jcHVfYWRkci5zdGFydCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpYyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uaW50byA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWNfZHN0biA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YSA9IHB0cl9kYXRhOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1faXNfb3Blbm1wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpYykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0YXRpYyBkYXRhIGlzIHRyYW5zZmVycmVkIG9ubHkgYnkgb21wIHRhcmdldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBjb25zdHJ1Y3Qgd2hpY2ggcGFzc2VzIHplcm9zIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jX2lmIGFuZCBmcmVlX2lmLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uYWxsb2NfaWYgfHwgbV92YXJzW2ldLmZyZWVfaWYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfbm9jb3B5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dG9EYXRhICphdXRvX2RhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5hbGxvY19pZikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvX2RhdGEgPSBtX2RldmljZS5pbnNlcnRfYXV0b19kYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnB0ciwgbV92YXJzW2ldLnNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvX2RhdGEtPmFkZF9yZWZlcmVuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHdoYXQgc2hvdWxkIGJlIGRvbmUgaWYgdmFyIGlzIG5vdCBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdGFibGU/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9fZGF0YSA9IG1fZGV2aWNlLmZpbmRfYXV0b19kYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnB0cik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGF1dG9tYXRpYyB2YXJpYWJsZXMgZGF0YSBpcyB0cmFuc2ZlcnJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgaWYgYWxsb2NfaWYgPT0gMCAmJiBmcmVlX2lmID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciByZWZlcmVuY2UgY291bnQgaXMgMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobV92YXJzW2ldLmFsbG9jX2lmIHx8IG1fdmFyc1tpXS5mcmVlX2lmKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvX2RhdGEgIT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvX2RhdGEtPmdldF9yZWZlcmVuY2UoKSAhPSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX25vY29weTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzYXZlIGRhdGEgZm9yIGxhdGVyIHVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5hdXRvX2RhdGEgPSBhdXRvX2RhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5pbiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIW1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGF0YWxlbiArPSBtX3ZhcnNbaV0uc2l6ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIG5vbi1zdGF0aWMgdGFyZ2V0IGRlc3RpbmF0aW9uIGRlZmluZWQgYXMgQ0VBTgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwcmVzc2lvbiB3ZSBwYXNzIHRvIHRhcmdldCBpdHMgc2l6ZSBhbmQgZGlzdAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5pbnRvID09IE5VTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0udHlwZS5zcmMgPT0gY19jZWFuX3ZhcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGF0YWxlbiArPSAyICogc2l6ZW9mKHVpbnQ2NF90KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fbmVlZF9ydW5mdW5jdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24ub3V0ICYmCisgICAgICAgICAgICAgICAgICAgICAgICAhbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpYykgeworICAgICAgICAgICAgICAgICAgICAgICAgbV9vdXRfZGF0YWxlbiArPSBtX3ZhcnNbaV0uc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fbmVlZF9ydW5mdW5jdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgY19kdjoKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzIHx8CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5hbGxvY19pZiB8fAorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZnJlZV9pZikgeworICAgICAgICAgICAgICAgICAgICBBcnJEZXNjICpkdnAgPSBzdGF0aWNfY2FzdDxBcnJEZXNjKj4obV92YXJzW2ldLnB0cik7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZGVidWcgZHVtcAorICAgICAgICAgICAgICAgICAgICBfX2R2X2Rlc2NfZHVtcCgiSU4vT1VUIiwgZHZwKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBzZW5kIGRvcGUgdmVjdG9yIGNvbnRlbnRzIGV4Y2x1ZGluZyBiYXNlCisgICAgICAgICAgICAgICAgICAgIG1faW5fZGF0YWxlbiArPSBtX3ZhcnNbaV0uc2l6ZSAtIHNpemVvZih1aW50NjRfdCk7CisgICAgICAgICAgICAgICAgICAgIG1fbmVlZF9ydW5mdW5jdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGNfc3RyaW5nX3B0cjoKKyAgICAgICAgICAgICAgICBpZiAoKG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cyB8fAorICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmFsbG9jX2lmIHx8CisgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZnJlZV9pZikgJiYKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSA9IDE7CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5jb3VudCA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oKnN0YXRpY19jYXN0PGNoYXIqKj4obV92YXJzW2ldLnB0cikpICsgMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogZmFsbHRocnUgKi8KKworICAgICAgICAgICAgY2FzZSBjX2RhdGFfcHRyOgorICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhY2tfYnVmICYmCisgICAgICAgICAgICAgICAgICAgICFtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMgJiYKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmFsbG9jX2lmKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgdmFyX2Rlc2MgaXMgZm9yIHN0YWNrIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICBib29sIGlzX25ldzsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIW9mZmxvYWRfc3RhY2tfbWVtb3J5X21hbmFnZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tfYWRkciwgZW50cnlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmNvdW50LCBtX3ZhcnNbaV0uYWxpZ24sICZpc19uZXcpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzX25ldykgeworICAgICAgICAgICAgICAgICAgICAgICAgbV9jb21wdXRlX2J1ZmZlcnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3RhY2tfcHRyX2RhdGEtPm1pY19idWYpOworICAgICAgICAgICAgICAgICAgICAgICAgbV9kZXZpY2UubV9wZXJzaXN0X2xpc3QuZnJvbnQoKS5jcHVfc3RhY2tfYWRkciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2hhcio+KG1fdmFyc1tpXS5wdHIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLnNpbmtfYWRkciA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2luX2RhdGFsZW4gKz0gc2l6ZW9mKG1fc3RhY2tfcHRyX2RhdGEtPm1pY19hZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSA9IG1fZGVzdHJveV9zdGFjay5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YSA9IG1fc3RhY2tfcHRyX2RhdGE7CisgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gYWRkIHJlZmVyZW5jZSBmb3IgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgIG1fbmVlZF9ydW5mdW5jdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBmYWxsdGhydSAqLworCisgICAgICAgICAgICBjYXNlIGNfY2Vhbl92YXJfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2R2X3B0cjoKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLnR5cGUuc3JjID09IGNfY2Vhbl92YXJfcHRyKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGFycmF5IGRlc2NyaXB0b3IKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJyX2Rlc2MgKmFwID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4obV92YXJzW2ldLnB0cik7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZGVidWcgZHVtcAorICAgICAgICAgICAgICAgICAgICBfX2Fycl9kZXNjX2R1bXAoIiIsICJJTi9PVVQiLCBhcCwgMSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0IGFuZCBsZW5ndGggYXJlIGRlcml2ZWQgZnJvbSB0aGUgYXJyYXkgZGVzY3JpcHRvcgorICAgICAgICAgICAgICAgICAgICBfX2Fycl9kYXRhX29mZnNldF9hbmRfbGVuZ3RoKGFwLCBtX3ZhcnNbaV0uZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpc19hcnJfZGVzY19jb250aWd1b3VzKGFwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX25vbmNvbnRfc3JjID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19zcmMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfcmVhZF9yYW5nZXNfYXJyX2Rlc2MoYXApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBuZWNlc3NhcnkgaW5mb3JtYXRpb24gYWJvdXQgbGVuZ3RoIGFuZCBvZmZzZXQgaXMKKyAgICAgICAgICAgICAgICAgICAgLy8gdHJhbnNmZXJyZWQgaW4gdmFyIGRlc2NyaXB0b3IuIFRoZXJlIGlzIG5vIG5lZWQgdG8gc2VuZAorICAgICAgICAgICAgICAgICAgICAvLyBhcnJheSBkZXNjcmlwdG9yIHRvIHRoZSB0YXJnZXQgc2lkZS4KKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGFwLT5iYXNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobV92YXJzW2ldLnR5cGUuc3JjID09IGNfZHZfcHRyKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gc2VuZCBEViB0byB0aGUgZGV2aWNlIHVubGVzcyBpdCBpcyAnbm9jb3B5JworICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uYWxsb2NfaWYgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mcmVlX2lmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBcnJEZXNjICpkdnAgPSAqc3RhdGljX2Nhc3Q8QXJyRGVzYyoqPihtX3ZhcnNbaV0ucHRyKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVidWcgZHVtcAorICAgICAgICAgICAgICAgICAgICAgICAgX19kdl9kZXNjX2R1bXAoIklOL09VVCIsIGR2cCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gbm8gZGlzcGxhY2VtZW50CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5kaXNwID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNfZGF0YV9wdHIgb3IgY19zdHJpbmdfcHRyCisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplICo9IG1fdmFyc1tpXS5jb3VudDsKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmRpc3AgPSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMgfHwKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmFsbG9jX2lmIHx8CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mcmVlX2lmKSB7CisgICAgICAgICAgICAgICAgICAgIFB0ckRhdGEgKnB0cl9kYXRhOworCisgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRoYXQgYnVmZmVyIGxlbmd0aCA+PSAwCisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uYWxsb2NfaWYgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5kaXNwICsgbV92YXJzW2ldLnNpemUgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfemVyb19vcl9uZWdfcHRyX2xlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gYmFzZSBhZGRyZXNzCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJhc2UgPSAqc3RhdGljX2Nhc3Q8dm9pZCoqPihtX3ZhcnNbaV0ucHRyKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZSBidWZmZXIgaWYgd2UgaGF2ZSBubyBJTlRPIGFuZCBkb24ndCBuZWVkCisgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRpb24gZm9yIHRoZSBwdHIgYXQgdGFyZ2V0CisgICAgICAgICAgICAgICAgICAgIGlmIChzcmNfaXNfZm9yX21pYykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5pc19zdGFja19idWYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3Igc3RhY2sgcGVyc2lzdGVudCBvYmplY3RzIHB0ciBkYXRhIGlzIGNyZWF0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBieSB2YXJfZGVzYyB3aXRoIG51bWJlciAwLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEl0cyBwdHJfZGF0YSBpcyBzdG9yZWQgYXQgbV9zdGFja19wdHJfZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhID0gbV9zdGFja19wdHJfZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1fdmFyc1tpXS5hbGxvY19pZikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCBuZXcgZW50cnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFsbG9jX3B0cl9kYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsbG9jX2Jhc2UgIT0gTlVMTCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jX2Rpc3AgOiBtX3ZhcnNbaV0uZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbGxvY19iYXNlICE9IE5VTEwpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY19zaXplIDogbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY19kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsbG9jX2Jhc2UgIT0gTlVMTCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgOiBtX3ZhcnNbaV0uYWxpZ24pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEtPmFkZF9yZWZlcmVuY2UoKSA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5taWNfYnVmICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIGJ1ZmZlciB0byB0aGUgbGlzdCBvZiBidWZmZXJzIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJlIHBhc3NlZCB0byBkaXNwYXRjaCBjYWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fY29tcHV0ZV9idWZmZXJzLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5taWNfYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgc2VuZCBidWZmZXIgYWRkcmVzcyB0byBkZXZpY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLnNpbmtfYWRkciA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwdHJfZGF0YS0+aXNfc3RhdGljKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gYWRkIHJlZmVyZW5jZSBmb3IgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbmVlZF9ydW5mdW5jdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlcnJvcl9pZl9ub3RfZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2lzX29wZW5tcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3Igb21wIHRhcmdldCB1cGRhdGUgdmFyaWFibGUgaXMgaWdub3JlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBpdCBkb2VzIG5vdCBleGlzdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtX3ZhcnNbaV0uYWxsb2NfaWYgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFtX3ZhcnNbaV0uZnJlZV9pZikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfaWZfbm90X2ZvdW5kID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgZXhpc3RpbmcgYXNzb2NpYXRpb24gZnJvbSBwb2ludGVyIHRhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaW5kX3B0cl9kYXRhKHB0cl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX2lmX25vdF9mb3VuZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2lzX29wZW5tcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIHZhciBub2NvcHkgaWYgaXQgZG9lcyBub3QgZXhpc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB0cl9kYXRhID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19wYXJhbWV0ZXJfbm9jb3B5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB0cl9kYXRhICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLnNpbmtfYWRkciA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2lzX29wZW5tcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkYXRhIGlzIHRyYW5zZmVycmVkIG9ubHkgaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NfaWYgPT0gMCAmJiBmcmVlX2lmID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3IgcmVmZXJlbmNlIGNvdW50IGlzIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChtX3ZhcnNbaV0uYWxsb2NfaWYgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZnJlZV9pZikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5nZXRfcmVmZXJlbmNlKCkgIT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX3BhcmFtZXRlcl9ub2NvcHk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEtPmFsbG9jX2Rpc3AgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuYWxsb2NfZGlzcCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGF0YWxlbiArPSBzaXplb2YoYWxsb2NfZGlzcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5zaW5rX2FkZHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGJ1ZmZlcnMncyBhZGRyZXNzIG9uIHRoZSBzaW5rCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5pdF9taWNfYWRkcmVzcyhwdHJfZGF0YSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGF0YWxlbiArPSBzaXplb2YocHRyX2RhdGEtPm1pY19hZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXB0cl9kYXRhLT5pc19zdGF0aWMgJiYgbV92YXJzW2ldLmZyZWVfaWYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBkZWNyZW1lbnQgYnVmZmVyIHJlZmVyZW5jZSBvbiB0YXJnZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9uZWVkX3J1bmZ1bmN0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQgdG8gYmFzZSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lbW9yeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgPSAoY2hhciopIGJhc2UgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopIHB0cl9kYXRhLT5jcHVfYWRkci5zdGFydCgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29weSBvdGhlciBwb2ludGVyIHByb3BlcnRpZXMgdG8gdmFyIGRlc2NyaXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ubWljX29mZnNldCA9IHB0cl9kYXRhLT5taWNfb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWMgPSBwdHJfZGF0YS0+aXNfc3RhdGljOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaW5kX3B0cl9kYXRhKHB0cl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB0cl9kYXRhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKikgYmFzZSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKikgcHRyX2RhdGEtPmNwdV9hZGRyLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBzYXZlIHBvaW50ZXIgZGF0YQorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGEgPSBwdHJfZGF0YTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgY19mdW5jX3B0cjoKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5pbikgeworICAgICAgICAgICAgICAgICAgICBtX2luX2RhdGFsZW4gKz0gX19vZmZsb2FkX2Z1bmNzLm1heF9uYW1lX2xlbmd0aCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5vdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgbV9vdXRfZGF0YWxlbiArPSBfX29mZmxvYWRfZnVuY3MubWF4X25hbWVfbGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1fbmVlZF9ydW5mdW5jdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgY19kdl9kYXRhOgorICAgICAgICAgICAgY2FzZSBjX2R2X3B0cl9kYXRhOgorICAgICAgICAgICAgY2FzZSBjX2R2X2RhdGFfc2xpY2U6CisgICAgICAgICAgICBjYXNlIGNfZHZfcHRyX2RhdGFfc2xpY2U6CisgICAgICAgICAgICAgICAgQXJyRGVzYyAqZHZwOworICAgICAgICAgICAgICAgIGlmIChWQVJfVFlQRV9JU19EVl9EQVRBX1NMSUNFKG1fdmFyc1tpXS50eXBlLnNyYykpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJyX2Rlc2MgKmFwOworICAgICAgICAgICAgICAgICAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4obV92YXJzW2ldLnB0cik7CisKKyAgICAgICAgICAgICAgICAgICAgZHZwID0gKG1fdmFyc1tpXS50eXBlLnNyYyA9PSBjX2R2X2RhdGFfc2xpY2UpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxBcnJEZXNjKj4oYXAtPmJhc2UpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8QXJyRGVzYyoqPihhcC0+YmFzZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkdnAgPSAobV92YXJzW2ldLnR5cGUuc3JjID09IGNfZHZfZGF0YSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBcnJEZXNjKj4obV92YXJzW2ldLnB0cikgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAqc3RhdGljX2Nhc3Q8QXJyRGVzYyoqPihtX3ZhcnNbaV0ucHRyKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBpZiBhbGxvY2F0YWJsZSBkb3BlIHZlY3RvciBpc24ndCBhbGxvY2F0ZWQgZG9uJ3QKKyAgICAgICAgICAgICAgICAvLyB0cmFuc2ZlciBpdHMgZGF0YQorICAgICAgICAgICAgICAgIGlmICghX19kdl9pc19hbGxvY2F0ZWQoZHZwKSkgeworICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9ub2NvcHk7CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5hbGxvY19pZiA9IDA7CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mcmVlX2lmID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cyB8fAorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uYWxsb2NfaWYgfHwKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZyZWVfaWYpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJyX2Rlc2MgKmFwOworCisgICAgICAgICAgICAgICAgICAgIGlmIChWQVJfVFlQRV9JU19EVl9EQVRBX1NMSUNFKG1fdmFyc1tpXS50eXBlLnNyYykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPihtX3ZhcnNbaV0ucHRyKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVidWcgZHVtcAorICAgICAgICAgICAgICAgICAgICAgICAgX19hcnJfZGVzY19kdW1wKCIiLCAiSU4vT1VUIiwgYXAsIDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghX19kdl9pc19jb250aWd1b3VzKGR2cCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19ub25jb250X3NyYyA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfc3JjID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0X3JlYWRfcmFuZ2VzX2R2KGR2cCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBzaXplIGFuZCBkaXNwbGFjZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgaWYgKFZBUl9UWVBFX0lTX0RWX0RBVEFfU0xJQ0UobV92YXJzW2ldLnR5cGUuc3JjKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0IGFuZCBsZW5ndGggYXJlIGRlcml2ZWQgZnJvbSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFycmF5IGRlc2NyaXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fYXJyX2RhdGFfb2Zmc2V0X2FuZF9sZW5ndGgoYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc19hcnJfZGVzY19jb250aWd1b3VzKGFwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmlzX25vbmNvbnRfc3JjKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfc2xpY2Vfb2Zfbm9uY29udF9hcnJheSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX25vbmNvbnRfc3JjID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX3NyYyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0X3JlYWRfcmFuZ2VzX2Fycl9kZXNjKGFwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmhhc19sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZHZfZGF0YV9sZW5ndGgoZHZwLCBtX3ZhcnNbaV0uY291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUgPSBfX2R2X2RhdGFfbGVuZ3RoKGR2cCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZGlzcCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGF0IGxlbmd0aCA+PSAwCisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uYWxsb2NfaWYgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChtX3ZhcnNbaV0uZGlzcCArIG1fdmFyc1tpXS5zaXplIDwgMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY196ZXJvX29yX25lZ19wdHJfbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBiYXNlIGFkZHJlc3MKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqYmFzZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGR2cC0+QmFzZSk7CisgICAgICAgICAgICAgICAgICAgIFB0ckRhdGEgKnB0cl9kYXRhOworCisgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlIGJ1ZmZlciBpZiB3ZSBoYXZlIG5vIElOVE8gYW5kIGRvbid0IG5lZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGlvbiBmb3IgdGhlIHB0ciBhdCB0YXJnZXQKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19pc19mb3JfbWljKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmFsbG9jX2lmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIG5ldyBlbnRyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWxsb2NfcHRyX2RhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxsb2NfYmFzZSAhPSBOVUxMKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NfZGlzcCA6IG1fdmFyc1tpXS5kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsbG9jX2Jhc2UgIT0gTlVMTCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jX3NpemUgOiBtX3ZhcnNbaV0uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jX2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxsb2NfYmFzZSAhPSBOVUxMKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCA6IG1fdmFyc1tpXS5hbGlnbikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YS0+YWRkX3JlZmVyZW5jZSgpID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPm1pY19idWYgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgYnVmZmVyIHRvIHRoZSBsaXN0IG9mIGJ1ZmZlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBhcmUgcGFzc2VkIHRvIGRpc3BhdGNoIGNhbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9jb21wdXRlX2J1ZmZlcnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPm1pY19idWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBzZW5kIGJ1ZmZlciBhZGRyZXNzIHRvIGRldmljZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXB0cl9kYXRhLT5pc19zdGF0aWMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBhZGQgcmVmZXJlbmNlIGZvciBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9uZWVkX3J1bmZ1bmN0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGVycm9yX2lmX25vdF9mb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1faXNfb3Blbm1wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvciBvbXAgdGFyZ2V0IHVwZGF0ZSB2YXJpYWJsZSBpcyBpZ25vcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGl0IGRvZXMgbm90IGV4aXN0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1fdmFyc1tpXS5hbGxvY19pZiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIW1fdmFyc1tpXS5mcmVlX2lmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9pZl9ub3RfZm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSBleGlzdGluZyBhc3NvY2lhdGlvbiBmcm9tIHBvaW50ZXIgdGFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbmRfcHRyX2RhdGEocHRyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfaWZfbm90X2ZvdW5kKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1faXNfb3Blbm1wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1ha2UgdmFyIG5vY29weSBpZiBpdCBkb2VzIG5vdCBleGlzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX3BhcmFtZXRlcl9ub2NvcHk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIHVwZGF0ZSBiYXNlIGluIGRvcGUgdmVjdG9yIG9uIGRldmljZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1faXNfb3Blbm1wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRhdGEgaXMgdHJhbnNmZXJyZWQgb25seSBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY19pZiA9PSAwICYmIGZyZWVfaWYgPT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciByZWZlcmVuY2UgY291bnQgaXMgMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG1fdmFyc1tpXS5hbGxvY19pZiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mcmVlX2lmKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPmdldF9yZWZlcmVuY2UoKSAhPSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfcGFyYW1ldGVyX25vY29weTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YS0+YWxsb2NfZGlzcCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5hbGxvY19kaXNwID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbl9kYXRhbGVuICs9IHNpemVvZihhbGxvY19kaXNwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLnNpbmtfYWRkcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgYnVmZmVycydzIGFkZHJlc3Mgb24gdGhlIHNpbmsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbml0X21pY19hZGRyZXNzKHB0cl9kYXRhKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbl9kYXRhbGVuICs9IHNpemVvZihwdHJfZGF0YS0+bWljX2FkZHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHRyX2RhdGEtPmlzX3N0YXRpYyAmJiBtX3ZhcnNbaV0uZnJlZV9pZikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIGRlY3JlbWVudCBidWZmZXIgcmVmZXJlbmNlIG9uIHRhcmdldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX25lZWRfcnVuZnVuY3Rpb24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldCB0byBiYXNlIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVtb3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKikgYmFzZSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKikgcHRyX2RhdGEtPmNwdV9hZGRyLnN0YXJ0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IG90aGVyIHBvaW50ZXIgcHJvcGVydGllcyB0byB2YXIgZGVzY3JpcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0ID0gcHRyX2RhdGEtPm1pY19vZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpYyA9IHB0cl9kYXRhLT5pc19zdGF0aWM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7IC8vICFzcmNfaXNfZm9yX21pYworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaW5kX3B0cl9kYXRhKHB0cl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCA9ICFwdHJfZGF0YSA/IDAgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopIGJhc2UgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopIHB0cl9kYXRhLT5jcHVfYWRkci5zdGFydCgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSBwb2ludGVyIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhID0gcHRyX2RhdGE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY191bmtub3duX3Zhcl90eXBlLCBtX3ZhcnNbaV0udHlwZS5zcmMpOworICAgICAgICAgICAgICAgIExJQk9GRkxPQURfQUJPUlQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1fdmFyc1tpXS50eXBlLnNyYyA9PSBjX2RhdGFfcHRyX2FycmF5KSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzcmNfaXNfZm9yX21pYyAmJiBtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhY2tfYnVmKSB7CisgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0ID0gc3RhdGljX2Nhc3Q8Y2hhcio+KG1fdmFyc1tpXS5wdHIpIC0KKyAgICAgICAgICAgICAgICBtX2RldmljZS5tX3BlcnNpc3RfbGlzdC5mcm9udCgpLmNwdV9zdGFja19hZGRyOworICAgICAgICB9CisgICAgICAgIC8vIGlmIHNvdXJjZSBpcyB1c2VkIGF0IENQVSBzYXZlIGl0cyBvZmZzZXQgYW5kIGRpc3AKKyAgICAgICAgaWYgKG1fdmFyc1tpXS5pbnRvID09IE5VTEwgfHwgbV92YXJzW2ldLmRpcmVjdGlvbi5pbikgeworICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmNwdV9vZmZzZXQgPSBtX3ZhcnNbaV0ub2Zmc2V0OworICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmNwdV9kaXNwICAgPSBtX3ZhcnNbaV0uZGlzcDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmICJpbnRvIiBpcyBkZWZpbmUgd2UgbmVlZCB0byBkbyB0aGUgc2ltaWxhciB3b3JrIGZvciBpdAorICAgICAgICBpZiAoIW1fdmFyc1tpXS5pbnRvKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGludDY0X3QgaW50b19kaXNwID0wLCBpbnRvX29mZnNldCA9IDA7CisKKyAgICAgICAgc3dpdGNoIChtX3ZhcnNbaV0udHlwZS5kc3QpIHsKKyAgICAgICAgICAgIGNhc2UgY19kYXRhX3B0cl9hcnJheToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgY19kYXRhOgorICAgICAgICAgICAgY2FzZSBjX3ZvaWRfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2NlYW5fdmFyOiB7CisgICAgICAgICAgICAgICAgaW50NjRfdCBzaXplID0gbV92YXJzW2ldLnNpemU7CisKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLnR5cGUuZHN0ID09IGNfY2Vhbl92YXIpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYXJyYXkgZGVzY3JpcHRvcgorICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnJfZGVzYyAqYXAgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPihtX3ZhcnNbaV0uaW50byk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZGVidWcgZHVtcAorICAgICAgICAgICAgICAgICAgICBfX2Fycl9kZXNjX2R1bXAoIiAgICAiLCAiSU5UTyIsIGFwLCAwKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQgYW5kIGxlbmd0aCBhcmUgZGVyaXZlZCBmcm9tIHRoZSBhcnJheSBkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgICAgIF9fYXJyX2RhdGFfb2Zmc2V0X2FuZF9sZW5ndGgoYXAsIGludG9fZGlzcCwgc2l6ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpc19hcnJfZGVzY19jb250aWd1b3VzKGFwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX25vbmNvbnRfZHN0ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19kc3QgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfcmVhZF9yYW5nZXNfYXJyX2Rlc2MoYXApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjZWFuX3Jhbmdlc19tYXRjaCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19kc3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3Jhbmdlc19kb250X21hdGNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5pbnRvID0gcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oYXAtPmJhc2UpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGludDY0X3Qgc2l6ZV9zcmMgPSBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfc3JjID8KKyAgICAgICAgICAgICAgICAgICAgY2Vhbl9nZXRfdHJhbnNmX3NpemUobV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX3NyYykgOgorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZTsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHNpemVfZHN0ID0gbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX2RzdCA/CisgICAgICAgICAgICAgICAgICAgIGNlYW5fZ2V0X3RyYW5zZl9zaXplKG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19kc3QpIDoKKyAgICAgICAgICAgICAgICAgICAgc2l6ZTsKKyAgICAgICAgICAgICAgICAvLyBJdCdzIHN1cHBvc2VkIHRoYXQgImludG8iIHNpemUgbXVzdCBiZSBub3QgbGVzcworICAgICAgICAgICAgICAgIC8vIHRoYW4gc3JjIHNpemUKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZV9zcmMgPiBzaXplX2RzdCkgeworICAgICAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfZGlmZmVyZW50X3NyY19hbmRfZHN0bl9zaXplcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3NyYywgc2l6ZV9kc3QpOworICAgICAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWNfZHN0bikgeworICAgICAgICAgICAgICAgICAgICAgICAgUHRyRGF0YSAqcHRyX2RhdGE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgZGF0YSBhc3NvY2lhdGVkIHdpdGggdmFyaWFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmluZF9wdHJfZGF0YShwdHJfZGF0YSwgbV92YXJzW2ldLmludG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50b19kaXNwLCBzaXplLCBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldCB0byBiYXNlIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVtb3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50b19vZmZzZXQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopIG1fdmFyc1tpXS5pbnRvIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKSBwdHJfZGF0YS0+Y3B1X2FkZHIuc3RhcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWNfZHN0biA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmRzdF9kYXRhID0gcHRyX2RhdGE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5pbiAmJgorICAgICAgICAgICAgICAgICAgICAhbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpY19kc3RuKSB7CisgICAgICAgICAgICAgICAgICAgIG1faW5fZGF0YWxlbiArPSBtX3ZhcnNbaV0uc2l6ZTsKKworICAgICAgICAgICAgICAgICAgICAvLyBmb3Igbm9uLXN0YXRpYyB0YXJnZXQgZGVzdGluYXRpb24gZGVmaW5lZCBhcyBDRUFOCisgICAgICAgICAgICAgICAgICAgIC8vIGV4cHJlc3Npb24gd2UgcGFzcyB0byB0YXJnZXQgaXRzIHNpemUgYW5kIGRpc3QKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS50eXBlLmRzdCA9PSBjX2NlYW5fdmFyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2luX2RhdGFsZW4gKz0gMiAqIHNpemVvZih1aW50NjRfdCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbV9uZWVkX3J1bmZ1bmN0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgY19kdjoKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzIHx8CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5hbGxvY19pZiB8fAorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZnJlZV9pZikgeworICAgICAgICAgICAgICAgICAgICBBcnJEZXNjICpkdnAgPSBzdGF0aWNfY2FzdDxBcnJEZXNjKj4obV92YXJzW2ldLmludG8pOworCisgICAgICAgICAgICAgICAgICAgIC8vIGRlYnVnIGR1bXAKKyAgICAgICAgICAgICAgICAgICAgX19kdl9kZXNjX2R1bXAoIklOVE8iLCBkdnApOworCisgICAgICAgICAgICAgICAgICAgIC8vIHNlbmQgZG9wZSB2ZWN0b3IgY29udGVudHMgZXhjbHVkaW5nIGJhc2UKKyAgICAgICAgICAgICAgICAgICAgbV9pbl9kYXRhbGVuICs9IG1fdmFyc1tpXS5zaXplIC0gc2l6ZW9mKHVpbnQ2NF90KTsKKyAgICAgICAgICAgICAgICAgICAgbV9uZWVkX3J1bmZ1bmN0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgY19zdHJpbmdfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2RhdGFfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2NlYW5fdmFyX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19kdl9wdHI6IHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHNpemUgPSBtX3ZhcnNbaV0uc2l6ZTsKKworICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0udHlwZS5kc3QgPT0gY19jZWFuX3Zhcl9wdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYXJyYXkgZGVzY3JpcHRvcgorICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnJfZGVzYyAqYXAgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPihtX3ZhcnNbaV0uaW50byk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZGVidWcgZHVtcAorICAgICAgICAgICAgICAgICAgICBfX2Fycl9kZXNjX2R1bXAoIiAgICAiLCAiSU5UTyIsIGFwLCAxKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQgYW5kIGxlbmd0aCBhcmUgZGVyaXZlZCBmcm9tIHRoZSBhcnJheSBkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgICAgIF9fYXJyX2RhdGFfb2Zmc2V0X2FuZF9sZW5ndGgoYXAsIGludG9fZGlzcCwgc2l6ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpc19hcnJfZGVzY19jb250aWd1b3VzKGFwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX25vbmNvbnRfc3JjID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19kc3QgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfcmVhZF9yYW5nZXNfYXJyX2Rlc2MoYXApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjZWFuX3Jhbmdlc19tYXRjaCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19kc3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3Jhbmdlc19kb250X21hdGNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uaW50byA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcioqPihhcC0+YmFzZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1fdmFyc1tpXS50eXBlLmRzdCA9PSBjX2R2X3B0cikgeworICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIHNlbmQgRFYgdG8gdGhlIGRldmljZSB1bmxlc3MgaXQgaXMgJ25vY29weScKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmFsbG9jX2lmIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZnJlZV9pZikgeworICAgICAgICAgICAgICAgICAgICAgICAgQXJyRGVzYyAqZHZwID0gKnN0YXRpY19jYXN0PEFyckRlc2MqKj4obV92YXJzW2ldLmludG8pOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWJ1ZyBkdW1wCisgICAgICAgICAgICAgICAgICAgICAgICBfX2R2X2Rlc2NfZHVtcCgiSU5UTyIsIGR2cCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW50NjRfdCBzaXplX3NyYyA9IG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19zcmMgPworICAgICAgICAgICAgICAgICAgICBjZWFuX2dldF90cmFuc2Zfc2l6ZShtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfc3JjKSA6CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplOworICAgICAgICAgICAgICAgIGludDY0X3Qgc2l6ZV9kc3QgPSBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfZHN0ID8KKyAgICAgICAgICAgICAgICAgICAgY2Vhbl9nZXRfdHJhbnNmX3NpemUobV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX2RzdCkgOgorICAgICAgICAgICAgICAgICAgICBzaXplOworICAgICAgICAgICAgICAgIC8vIEl0J3Mgc3VwcG9zZWQgdGhhdCAiaW50byIgc2l6ZSBtdXN0IGJlIG5vdCBsZXNzIHRoYW4KKyAgICAgICAgICAgICAgICAvLyBzcmMgc2l6ZQorICAgICAgICAgICAgICAgIGlmIChzaXplX3NyYyA+IHNpemVfZHN0KSB7CisgICAgICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19kaWZmZXJlbnRfc3JjX2FuZF9kc3RuX3NpemVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfc3JjLCBzaXplX2RzdCk7CisgICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cykgeworICAgICAgICAgICAgICAgICAgICBQdHJEYXRhICpwdHJfZGF0YTsKKworICAgICAgICAgICAgICAgICAgICAvLyBiYXNlIGFkZHJlc3MKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqYmFzZSA9ICpzdGF0aWNfY2FzdDx2b2lkKio+KG1fdmFyc1tpXS5pbnRvKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5pbikgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGUgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmlzX3N0YWNrX2J1ZikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBzdGFjayBwZXJzaXN0ZW50IG9iamVjdHMgcHRyIGRhdGEgaXMgY3JlYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5IHZhcl9kZXNjIHdpdGggbnVtYmVyIDAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXRzIHB0cl9kYXRhIGlzIHN0b3JlZCBhdCBtX3N0YWNrX3B0cl9kYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEgPSBtX3N0YWNrX3B0cl9kYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5zaW5rX2FkZHIgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobV92YXJzW2ldLmFsbG9jX2lmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIG5ldyBlbnRyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWxsb2NfcHRyX2RhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxsb2NfYmFzZSAhPSBOVUxMKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NfZGlzcCA6IGludG9fZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbGxvY19iYXNlICE9IE5VTEwpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY19zaXplIDogc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jX2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxsb2NfYmFzZSAhPSBOVUxMKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCA6IG1fdmFyc1tpXS5hbGlnbikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YS0+YWRkX3JlZmVyZW5jZSgpID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPm1pY19idWYgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgYnVmZmVyIHRvIHRoZSBsaXN0IG9mIGJ1ZmZlcnMgdGhhdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcmUgcGFzc2VkIHRvIGRpc3BhdGNoIGNhbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9jb21wdXRlX2J1ZmZlcnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPm1pY19idWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBzZW5kIGJ1ZmZlciBhZGRyZXNzIHRvIGRldmljZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXB0cl9kYXRhLT5pc19zdGF0aWMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBhZGQgcmVmZXJlbmNlIGZvciBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9uZWVkX3J1bmZ1bmN0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgZXhpc3RpbmcgYXNzb2NpYXRpb24gZnJvbSBwb2ludGVyIHRhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaW5kX3B0cl9kYXRhKHB0cl9kYXRhLCBiYXNlLCBpbnRvX2Rpc3AsIHNpemUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLnNpbmtfYWRkciA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YS0+YWxsb2NfZGlzcCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmFsbG9jX2Rpc3AgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGF0YWxlbiArPSBzaXplb2YoYWxsb2NfZGlzcCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGJ1ZmZlcnMncyBhZGRyZXNzIG9uIHRoZSBzaW5rCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbml0X21pY19hZGRyZXNzKHB0cl9kYXRhKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbl9kYXRhbGVuICs9IHNpemVvZihwdHJfZGF0YS0+bWljX2FkZHIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXB0cl9kYXRhLT5pc19zdGF0aWMgJiYgbV92YXJzW2ldLmZyZWVfaWYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIGRlY3JlbWVudCBidWZmZXIgcmVmZXJlbmNlIG9uIHRhcmdldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbmVlZF9ydW5mdW5jdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgb3RoZXIgcG9pbnRlciBwcm9wZXJ0aWVzIHRvIHZhciBkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ubWljX29mZnNldCA9IHB0cl9kYXRhLT5taWNfb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpY19kc3RuID0gcHRyX2RhdGEtPmlzX3N0YXRpYzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmluZF9wdHJfZGF0YShwdHJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludG9fZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHB0cl9kYXRhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnRvX29mZnNldCA9IHB0cl9kYXRhID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopIGJhc2UgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKikgcHRyX2RhdGEtPmNwdV9hZGRyLnN0YXJ0KCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSBwb2ludGVyIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmRzdF9kYXRhID0gcHRyX2RhdGE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIGNfZnVuY19wdHI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgY19kdl9kYXRhOgorICAgICAgICAgICAgY2FzZSBjX2R2X3B0cl9kYXRhOgorICAgICAgICAgICAgY2FzZSBjX2R2X2RhdGFfc2xpY2U6CisgICAgICAgICAgICBjYXNlIGNfZHZfcHRyX2RhdGFfc2xpY2U6CisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cyB8fAorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uYWxsb2NfaWYgfHwKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZyZWVfaWYpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJyX2Rlc2MgKmFwOworICAgICAgICAgICAgICAgICAgICBBcnJEZXNjICpkdnA7CisgICAgICAgICAgICAgICAgICAgIFB0ckRhdGEgKnB0cl9kYXRhOworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGRpc3A7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgc2l6ZTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoVkFSX1RZUEVfSVNfRFZfREFUQV9TTElDRShtX3ZhcnNbaV0udHlwZS5kc3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4obV92YXJzW2ldLmludG8pOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWJ1ZyBkdW1wCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Fycl9kZXNjX2R1bXAoIiAgICAiLCAiSU5UTyIsIGFwLCAwKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZHZwID0gKG1fdmFyc1tpXS50eXBlLmRzdCA9PSBjX2R2X2RhdGFfc2xpY2UpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QXJyRGVzYyo+KGFwLT5iYXNlKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxBcnJEZXNjKio+KGFwLT5iYXNlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGR2cCA9IChtX3ZhcnNbaV0udHlwZS5kc3QgPT0gY19kdl9kYXRhKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBcnJEZXNjKj4obV92YXJzW2ldLmludG8pIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzdGF0aWNfY2FzdDxBcnJEZXNjKio+KG1fdmFyc1tpXS5pbnRvKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIV9fZHZfaXNfY29udGlndW91cyhkdnApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfbm9uY29udF9kc3QgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX2RzdCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdF9yZWFkX3Jhbmdlc19kdihkdnApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIHNpemUgYW5kIGRpc3BsYWNlbWVudAorICAgICAgICAgICAgICAgICAgICBpZiAoVkFSX1RZUEVfSVNfRFZfREFUQV9TTElDRShtX3ZhcnNbaV0udHlwZS5kc3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQgYW5kIGxlbmd0aCBhcmUgZGVyaXZlZCBmcm9tIHRoZSBhcnJheQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVzY3JpcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgX19hcnJfZGF0YV9vZmZzZXRfYW5kX2xlbmd0aChhcCwgaW50b19kaXNwLCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzX2Fycl9kZXNjX2NvbnRpZ3VvdXMoYXApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3MuaXNfbm9uY29udF9kc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19zbGljZV9vZl9ub25jb250X2FycmF5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfbm9uY29udF9kc3QgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfZHN0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfcmVhZF9yYW5nZXNfYXJyX2Rlc2MoYXApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNlYW5fcmFuZ2VzX21hdGNoKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX3NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19kc3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcmFuZ2VzX2RvbnRfbWF0Y2gpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5oYXNfbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IF9fZHZfZGF0YV9sZW5ndGgoZHZwLCBtX3ZhcnNbaV0uY291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IF9fZHZfZGF0YV9sZW5ndGgoZHZwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRpc3AgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBzaXplX3NyYyA9CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfc3JjID8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNlYW5fZ2V0X3RyYW5zZl9zaXplKG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19zcmMpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplOworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHNpemVfZHN0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19kc3QgPworICAgICAgICAgICAgICAgICAgICAgICAgY2Vhbl9nZXRfdHJhbnNmX3NpemUobV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX2RzdCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgLy8gSXQncyBzdXBwb3NlZCB0aGF0ICJpbnRvIiBzaXplIG11c3QgYmUgbm90IGxlc3MKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhhbiBzcmMgc2l6ZQorICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZV9zcmMgPiBzaXplX2RzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2RpZmZlcmVudF9zcmNfYW5kX2RzdG5fc2l6ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV9zcmMsIHNpemVfZHN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBiYXNlIGFkZHJlc3MKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqYmFzZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGR2cC0+QmFzZSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGUgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmluKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmFsbG9jX2lmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIG5ldyBlbnRyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWxsb2NfcHRyX2RhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxsb2NfYmFzZSAhPSBOVUxMKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NfZGlzcCA6IGludG9fZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbGxvY19iYXNlICE9IE5VTEwpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY19zaXplIDogc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jX2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxsb2NfYmFzZSAhPSBOVUxMKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCA6IG1fdmFyc1tpXS5hbGlnbikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEtPmFkZF9yZWZlcmVuY2UoKSA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5taWNfYnVmICE9MCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgYnVmZmVyIHRvIHRoZSBsaXN0IG9mIGJ1ZmZlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBhcmUgcGFzc2VkIHRvIGRpc3BhdGNoIGNhbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9jb21wdXRlX2J1ZmZlcnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPm1pY19idWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBzZW5kIGJ1ZmZlciBhZGRyZXNzIHRvIGRldmljZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXB0cl9kYXRhLT5pc19zdGF0aWMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBhZGQgcmVmZXJlbmNlIGZvciBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9uZWVkX3J1bmZ1bmN0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgZXhpc3RpbmcgYXNzb2NpYXRpb24gZnJvbSBwb2ludGVyIHRhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaW5kX3B0cl9kYXRhKHB0cl9kYXRhLCBiYXNlLCBpbnRvX2Rpc3AsIHNpemUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIHVwZGF0ZSBiYXNlIGluIGRvcGUgdmVjdG9yIG9uIGRldmljZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5zaW5rX2FkZHIgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEtPmFsbG9jX2Rpc3AgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5hbGxvY19kaXNwID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luX2RhdGFsZW4gKz0gc2l6ZW9mKGFsbG9jX2Rpc3ApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLnNpbmtfYWRkcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCBidWZmZXJzJ3MgYWRkcmVzcyBvbiB0aGUgc2luaworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5pdF9taWNfYWRkcmVzcyhwdHJfZGF0YSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luX2RhdGFsZW4gKz0gc2l6ZW9mKHB0cl9kYXRhLT5taWNfYWRkcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHRyX2RhdGEtPmlzX3N0YXRpYyAmJiBtX3ZhcnNbaV0uZnJlZV9pZikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gZGVjcmVtZW50IGJ1ZmZlciByZWZlcmVuY2Ugb24gdGFyZ2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9uZWVkX3J1bmZ1bmN0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0IHRvIGJhc2UgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lbW9yeQorICAgICAgICAgICAgICAgICAgICAgICAgaW50b19vZmZzZXQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKikgYmFzZSAtIChjaGFyKikgcHRyX2RhdGEtPmNwdV9hZGRyLnN0YXJ0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgb3RoZXIgcG9pbnRlciBwcm9wZXJ0aWVzIHRvIHZhciBkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ubWljX29mZnNldCA9IHB0cl9kYXRhLT5taWNfb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpY19kc3RuID0gcHRyX2RhdGEtPmlzX3N0YXRpYzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsgLy8gc3JjX2lzX2Zvcl9taWMKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmluZF9wdHJfZGF0YShwdHJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludG9fZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludG9fb2Zmc2V0ID0gIXB0cl9kYXRhID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopIGJhc2UgLSAoY2hhciopIHB0cl9kYXRhLT5jcHVfYWRkci5zdGFydCgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSBwb2ludGVyIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmRzdF9kYXRhID0gcHRyX2RhdGE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY191bmtub3duX3Zhcl90eXBlLCBtX3ZhcnNbaV0udHlwZS5zcmMpOworICAgICAgICAgICAgICAgIExJQk9GRkxPQURfQUJPUlQ7CisgICAgICAgIH0KKyAgICAgICAgLy8gaWYgaW50byBpcyB1c2VkIGF0IENQVSBzYXZlIGl0cyBvZmZzZXQgYW5kIGRpc3AKKyAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24ub3V0KSB7CisgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X29mZnNldCA9IGludG9fb2Zmc2V0OworICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmNwdV9kaXNwICAgPSBpbnRvX2Rpc3A7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmlzX3N0YWNrX2J1ZikgeworICAgICAgICAgICAgICAgIGludG9fb2Zmc2V0ID0gc3RhdGljX2Nhc3Q8Y2hhcio+KG1fdmFyc1tpXS5pbnRvKSAtCisgICAgICAgICAgICAgICAgICAgIG1fZGV2aWNlLm1fcGVyc2lzdF9saXN0LmZyb250KCkuY3B1X3N0YWNrX2FkZHI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0ID0gaW50b19vZmZzZXQ7CisgICAgICAgICAgICBtX3ZhcnNbaV0uZGlzcCAgID0gaW50b19kaXNwOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgT2ZmbG9hZERlc2NyaXB0b3I6OnNldHVwX21pc2NfZGF0YShjb25zdCBjaGFyICpuYW1lKQoreworICAgIE9mZmxvYWRUaW1lciB0aW1lcihnZXRfdGltZXJfZGF0YSgpLCBjX29mZmxvYWRfaG9zdF9zZXR1cF9taXNjX2RhdGEpOworCisgICAgLy8gd2UgY2FuIHNraXAgcnVuIGZ1bmN0b24gY2FsbCB0b2dldGhlciB3aXRoIHdhaXQgaWYgb2ZmbG9hZGVkCisgICAgLy8gcmVnaW9uIGlzIGVtcHR5IGFuZCB0aGVyZSBpcyBubyB1c2VyIGRlZmluZWQgbm9uLXBvaW50ZXIgSU4vT1VUIGRhdGEKKyAgICBpZiAobV9uZWVkX3J1bmZ1bmN0aW9uKSB7CisgICAgICAgIC8vIHZhcmlhYmxlIGRlc2NyaXB0b3JzIGFyZSBzZW50IGFzIGlucHV0IGRhdGEKKyAgICAgICAgbV9pbl9kYXRhbGVuICs9IG1fdmFyc190b3RhbCAqIHNpemVvZihWYXJEZXNjKTsKKworICAgICAgICAvLyB0aW1lciBkYXRhIGlzIHNlbnQgYXMgYSBwYXJ0IG9mIHRoZSBvdXRwdXQgZGF0YQorICAgICAgICBtX291dF9kYXRhbGVuICs9IE9GRkxPQURfVElNRVJfREFUQUxFTigpOworCisgICAgICAgIC8vIG1heCBmcm9tIGlucHV0IGRhdGEgYW5kIG91dHB1dCBkYXRhIGxlbmd0aAorICAgICAgICB1aW50NjRfdCBkYXRhX2xlbiA9IG1faW5fZGF0YWxlbiA+IG1fb3V0X2RhdGFsZW4gPyBtX2luX2RhdGFsZW4gOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX291dF9kYXRhbGVuOworCisgICAgICAgIC8vIE1pc2MgZGF0YSBoYXMgdGhlIGZvbGxvd2luZyBsYXlvdXQKKyAgICAgICAgLy8gICAgIDxGdW5jdGlvbiBEZXNjcmlwdG9yPgorICAgICAgICAvLyAgICAgPEZ1bmN0aW9uIE5hbWU+CisgICAgICAgIC8vICAgICA8SW4vT3V0IERhdGE+ICAgICAgICAgICAgKG9wdGlvbmFsKQorICAgICAgICAvLworICAgICAgICAvLyBXZSBjYW4gdHJhbnNmZXIgY29weWluL2NvcHlvdXQgZGF0YSBpbiBtaXNjL3JldHVybiBkYXRhIHdoaWNoIGNhbgorICAgICAgICAvLyBiZSBwYXNzZWQgdG8gcnVuIGZ1bmN0aW9uIGNhbGwgaWYgaXRzIHNpemUgZG9lcyBub3QgZXhjZWVkCisgICAgICAgIC8vIENPSV9QSVBFTElORV9NQVhfSU5fTUlTQ19EQVRBX0xFTi4gT3RoZXJ3aXNlIHdlIGhhdmUgdG8gYWxsb2NhdGUKKyAgICAgICAgLy8gYnVmZmVyIGZvciBpdC4KKworICAgICAgICBtX2Z1bmNfZGVzY19zaXplID0gc2l6ZW9mKEZ1bmN0aW9uRGVzY3JpcHRvcikgKyBzdHJsZW4obmFtZSkgKyAxOworICAgICAgICBtX2Z1bmNfZGVzY19zaXplID0gKG1fZnVuY19kZXNjX3NpemUgKyA3KSAmIH43OworCisgICAgICAgIGludCBtaXNjX2RhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgaW50IG1pc2NfZGF0YV9zaXplID0gMDsKKyAgICAgICAgaWYgKGRhdGFfbGVuID4gMCkgeworICAgICAgICAgICAgaWYgKG1fZnVuY19kZXNjX3NpemUgKworICAgICAgICAgICAgICAgIG1faW5fZGF0YWxlbiA8PSBDT0lfUElQRUxJTkVfTUFYX0lOX01JU0NfREFUQV9MRU4gJiYKKyAgICAgICAgICAgICAgICBtX291dF9kYXRhbGVuIDw9IENPSV9QSVBFTElORV9NQVhfSU5fTUlTQ19EQVRBX0xFTikgeworICAgICAgICAgICAgICAgIC8vIHVzZSBtaXNjL3JldHVybiBkYXRhIGZvciBjb3B5aW4vY29weW91dAorICAgICAgICAgICAgICAgIG1pc2NfZGF0YV9vZmZzZXQgPSBtX2Z1bmNfZGVzY19zaXplOworICAgICAgICAgICAgICAgIG1pc2NfZGF0YV9zaXplID0gZGF0YV9sZW47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBPZmZsb2FkVGltZXIgdGltZXJfYnVmKGdldF90aW1lcl9kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX29mZmxvYWRfaG9zdF9hbGxvY19kYXRhX2J1ZmZlcik7CisKKyAgICAgICAgICAgICAgICAvLyBzZW5kL3JlY2VpdmUgZGF0YSB1c2luZyBidWZmZXIKKyAgICAgICAgICAgICAgICBDT0lSRVNVTFQgcmVzID0gQ09JOjpCdWZmZXJDcmVhdGUoZGF0YV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9CVUZGRVJfTk9STUFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAmbV9kZXZpY2UuZ2V0X3Byb2Nlc3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1faW5vdXRfYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfY3JlYXRlLCByZXMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1fY29tcHV0ZV9idWZmZXJzLnB1c2hfYmFjayhtX2lub3V0X2J1Zik7CisgICAgICAgICAgICAgICAgbV9kZXN0cm95X2J1ZmZlcnMucHVzaF9iYWNrKG1faW5vdXRfYnVmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGluaXRpYWxpemUgZnVuY3Rpb24gZGVzY3JpcHRvcgorICAgICAgICBtX2Z1bmNfZGVzYyA9IChGdW5jdGlvbkRlc2NyaXB0b3IqKSBtYWxsb2MobV9mdW5jX2Rlc2Nfc2l6ZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNjX2RhdGFfc2l6ZSk7CisgICAgICAgIG1fZnVuY19kZXNjLT5jb25zb2xlX2VuYWJsZWQgPSBjb25zb2xlX2VuYWJsZWQ7CisgICAgICAgIG1fZnVuY19kZXNjLT50aW1lcl9lbmFibGVkID0KKyAgICAgICAgICAgIHRpbWVyX2VuYWJsZWQgfHwgKG9mZmxvYWRfcmVwb3J0X2xldmVsICYmIG9mZmxvYWRfcmVwb3J0X2VuYWJsZWQpOworICAgICAgICBtX2Z1bmNfZGVzYy0+b2ZmbG9hZF9yZXBvcnRfbGV2ZWwgPSBvZmZsb2FkX3JlcG9ydF9sZXZlbDsKKyAgICAgICAgbV9mdW5jX2Rlc2MtPm9mZmxvYWRfbnVtYmVyID0gR0VUX09GRkxPQURfTlVNQkVSKGdldF90aW1lcl9kYXRhKCkpOworICAgICAgICBtX2Z1bmNfZGVzYy0+aW5fZGF0YWxlbiA9IG1faW5fZGF0YWxlbjsKKyAgICAgICAgbV9mdW5jX2Rlc2MtPm91dF9kYXRhbGVuID0gbV9vdXRfZGF0YWxlbjsKKyAgICAgICAgbV9mdW5jX2Rlc2MtPnZhcnNfbnVtID0gbV92YXJzX3RvdGFsOworICAgICAgICBtX2Z1bmNfZGVzYy0+ZGF0YV9vZmZzZXQgPSBtaXNjX2RhdGFfb2Zmc2V0OworCisgICAgICAgIC8vIGFwcGVuZCBlbnRyeSBuYW1lCisgICAgICAgIHN0cmNweShtX2Z1bmNfZGVzYy0+ZGF0YSwgbmFtZSk7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgT2ZmbG9hZERlc2NyaXB0b3I6OndhaXRfZGVwZW5kZW5jaWVzKAorICAgIGNvbnN0IHZvaWQgKip3YWl0cywKKyAgICBpbnQgbnVtX3dhaXRzCispCit7CisgICAgT2ZmbG9hZFRpbWVyIHRpbWVyKGdldF90aW1lcl9kYXRhKCksIGNfb2ZmbG9hZF9ob3N0X3dhaXRfZGVwcyk7CisgICAgYm9vbCByZXQgPSB0cnVlOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fd2FpdHM7IGkrKykgeworCisgICAgICAgIE9mZmxvYWREZXNjcmlwdG9yICp0YXNrID0gbV9kZXZpY2UuZmluZF9zaWduYWwod2FpdHNbaV0sIHRydWUpOworICAgICAgICBpZiAodGFzayA9PSAwKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfb2ZmbG9hZDEsIG1fZGV2aWNlLmdldF9sb2dpY2FsX2luZGV4KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRzW2ldKTsKKyAgICAgICAgICAgIExJQk9GRkxPQURfQUJPUlQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXRhc2stPm9mZmxvYWRfZmluaXNoKCkpIHsKKyAgICAgICAgICAgIHJldCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgdGFzay0+Y2xlYW51cCgpOworICAgICAgICBkZWxldGUgdGFzazsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitib29sIE9mZmxvYWREZXNjcmlwdG9yOjpvZmZsb2FkKAorICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgYm9vbCBpc19lbXB0eSwKKyAgICBWYXJEZXNjICp2YXJzLAorICAgIFZhckRlc2MyICp2YXJzMiwKKyAgICBpbnQgdmFyc190b3RhbCwKKyAgICBjb25zdCB2b2lkICoqd2FpdHMsCisgICAgaW50IG51bV93YWl0cywKKyAgICBjb25zdCB2b2lkICoqc2lnbmFsLAorICAgIGludCBlbnRyeV9pZCwKKyAgICBjb25zdCB2b2lkICpzdGFja19hZGRyCispCit7CisgICAgaWYgKHNpZ25hbCA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0VfMSgxLAorICAgICAgICAgICAgICAgICAgICAgIEdFVF9PRkZMT0FEX05VTUJFUihnZXRfdGltZXJfZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICBjX29mZmxvYWRfaW5pdF9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICJPZmZsb2FkIGZ1bmN0aW9uICVzLCBpc19lbXB0eT0lZCwgI3ZhckRlc2NzPSVkLCAiCisgICAgICAgICAgICAgICAgICAgICAgIiN3YWl0cz0lZCwgc2lnbmFsPW5vbmVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgaXNfZW1wdHksIHZhcnNfdG90YWwsIG51bV93YWl0cyk7CisgICAgICAgIE9GRkxPQURfUkVQT1JUKDMsIEdFVF9PRkZMT0FEX05VTUJFUihnZXRfdGltZXJfZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICBjX29mZmxvYWRfc2VudF9wb2ludGVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIiNXYWl0IDogJWQgXG4iLCBudW1fd2FpdHMpOworICAgICAgICBPRkZMT0FEX1JFUE9SVCgzLCBHRVRfT0ZGTE9BRF9OVU1CRVIoZ2V0X3RpbWVyX2RhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgY19vZmZsb2FkX3NpZ25hbCwKKyAgICAgICAgICAgICAgICAgICAgICAibm9uZSAlZFxuIiwgMCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoMSwKKyAgICAgICAgICAgICAgICAgICAgICBHRVRfT0ZGTE9BRF9OVU1CRVIoZ2V0X3RpbWVyX2RhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgY19vZmZsb2FkX2luaXRfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAiT2ZmbG9hZCBmdW5jdGlvbiAlcywgaXNfZW1wdHk9JWQsICN2YXJEZXNjcz0lZCwgIgorICAgICAgICAgICAgICAgICAgICAgICIjd2FpdHM9JWQsIHNpZ25hbD0lcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBpc19lbXB0eSwgdmFyc190b3RhbCwgbnVtX3dhaXRzLAorICAgICAgICAgICAgICAgICAgICAgICpzaWduYWwpOworCisgICAgICAgIE9GRkxPQURfUkVQT1JUKDMsIEdFVF9PRkZMT0FEX05VTUJFUihnZXRfdGltZXJfZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICBjX29mZmxvYWRfc2lnbmFsLAorICAgICAgICAgICAgICAgICAgICAgICIlZFxuIiwgc2lnbmFsKTsKKyAgICB9CisgICAgT0ZGTE9BRF9SRVBPUlQoMywgR0VUX09GRkxPQURfTlVNQkVSKGdldF90aW1lcl9kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgIGNfb2ZmbG9hZF93YWl0LAorICAgICAgICAgICAgICAgICAgICAgICIjV2FpdCA6ICVkICAlcFxuIiwgbnVtX3dhaXRzLCB3YWl0cyk7CisKKyAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gT0ZGTE9BRF9TVUNDRVNTOworICAgICAgICBtX3N0YXR1cy0+ZGV2aWNlX251bWJlciA9IG1fZGV2aWNlLmdldF9sb2dpY2FsX2luZGV4KCk7CisgICAgfQorCisgICAgbV9uZWVkX3J1bmZ1bmN0aW9uID0gIWlzX2VtcHR5OworCisgICAgLy8gd2FpdCBmb3IgZGVwZW5kZW5jaWVzIHRvIGZpbmlzaAorICAgIGlmICghd2FpdF9kZXBlbmRlbmNpZXMod2FpdHMsIG51bV93YWl0cykpIHsKKyAgICAgICAgY2xlYW51cCgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gc2V0dXAgYnVmZmVycworICAgIGlmICghc2V0dXBfZGVzY3JpcHRvcnModmFycywgdmFyczIsIHZhcnNfdG90YWwsIGVudHJ5X2lkLCBzdGFja19hZGRyKSkgeworICAgICAgICBjbGVhbnVwKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBpbml0aWF0ZSBzZW5kIGZvciBwb2ludGVycy4gV2FudCB0byBkbyBpdCBhcyBlYXJseSBhcyBwb3NzaWJsZS4KKyAgICBpZiAoIXNlbmRfcG9pbnRlcl9kYXRhKHNpZ25hbCAhPSAwKSkgeworICAgICAgICBjbGVhbnVwKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBzZXR1cCBtaXNjIGRhdGEgZm9yIHJ1biBmdW5jdGlvbgorICAgIGlmICghc2V0dXBfbWlzY19kYXRhKG5hbWUpKSB7CisgICAgICAgIGNsZWFudXAoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIGdhdGhlciBjb3B5aW4gZGF0YSBpbnRvIGJ1ZmZlcgorICAgIGlmICghZ2F0aGVyX2NvcHlpbl9kYXRhKCkpIHsKKyAgICAgICAgY2xlYW51cCgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gU3RhcnQgdGhlIGNvbXB1dGF0aW9uCisgICAgaWYgKCFjb21wdXRlKCkpIHsKKyAgICAgICAgY2xlYW51cCgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gaW5pdGlhdGUgcmVjZWl2ZSBmb3IgcG9pbnRlcnMKKyAgICBpZiAoIXJlY2VpdmVfcG9pbnRlcl9kYXRhKHNpZ25hbCAhPSAwKSkgeworICAgICAgICBjbGVhbnVwKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBpZiB0aGVyZSBpcyBhIHNpZ25hbCBzYXZlIGRlc2NyaXB0b3IgZm9yIHRoZSBsYXRlciB1c2UuCisgICAgaWYgKHNpZ25hbCAhPSAwKSB7CisgICAgICAgIG1fZGV2aWNlLmFkZF9zaWduYWwoKnNpZ25hbCwgdGhpcyk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIHdhaXQgZm9yIHRoZSBvZmZsb2FkIHRvIGZpbmlzaC4KKyAgICBpZiAoIW9mZmxvYWRfZmluaXNoKCkpIHsKKyAgICAgICAgY2xlYW51cCgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY2xlYW51cCgpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE9mZmxvYWREZXNjcmlwdG9yOjpvZmZsb2FkX2ZpbmlzaCgpCit7CisgICAgQ09JUkVTVUxUIHJlczsKKworICAgIC8vIHdhaXQgZm9yIGNvbXB1dGUgZGVwZW5kZW5jaWVzIHRvIGJlY29tZSBzaWduYWxlZAorICAgIGlmIChtX2luX2RlcHNfdG90YWwgPiAwKSB7CisgICAgICAgIE9mZmxvYWRUaW1lciB0aW1lcihnZXRfdGltZXJfZGF0YSgpLCBjX29mZmxvYWRfaG9zdF93YWl0X2NvbXB1dGUpOworCisgICAgICAgIGlmIChfX29mZmxvYWRfYWN0aXZlX3dhaXQpIHsKKyAgICAgICAgICAgIC8vIGtlZXAgQ1BVIGJ1c3kKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICByZXMgPSBDT0k6OkV2ZW50V2FpdChtX2luX2RlcHNfdG90YWwsIG1faW5fZGVwcywgMCwgMSwgMCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAocmVzID09IENPSV9USU1FX09VVF9SRUFDSEVEKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJlcyA9IENPSTo6RXZlbnRXYWl0KG1faW5fZGVwc190b3RhbCwgbV9pbl9kZXBzLCAtMSwgMSwgMCwgMCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2V2ZW50X3dhaXQsIHJlcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBzY2F0dGVyIGNvcHlvdXQgZGF0YSByZWNlaXZlZCBmcm9tIHRhcmdldAorICAgIGlmICghc2NhdHRlcl9jb3B5b3V0X2RhdGEoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8vIHdhaXQgZm9yIHJlY2VpdmUgZGVwZW5kZW5jaWVzIHRvIGJlY29tZSBzaWduYWxlZAorICAgIGlmIChtX291dF9kZXBzX3RvdGFsID4gMCkgeworICAgICAgICBPZmZsb2FkVGltZXIgdGltZXIoZ2V0X3RpbWVyX2RhdGEoKSwgY19vZmZsb2FkX2hvc3Rfd2FpdF9idWZmZXJzX3JlYWRzKTsKKworICAgICAgICBpZiAoX19vZmZsb2FkX2FjdGl2ZV93YWl0KSB7CisgICAgICAgICAgICAvLyBrZWVwIENQVSBidXN5CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgcmVzID0gQ09JOjpFdmVudFdhaXQobV9vdXRfZGVwc190b3RhbCwgbV9vdXRfZGVwcywgMCwgMSwgMCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAocmVzID09IENPSV9USU1FX09VVF9SRUFDSEVEKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJlcyA9IENPSTo6RXZlbnRXYWl0KG1fb3V0X2RlcHNfdG90YWwsIG1fb3V0X2RlcHMsIC0xLCAxLCAwLCAwKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfZXZlbnRfd2FpdCwgcmVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGRlc3Ryb3kgYnVmZmVycworICAgIHsKKyAgICAgICAgT2ZmbG9hZFRpbWVyIHRpbWVyKGdldF90aW1lcl9kYXRhKCksIGNfb2ZmbG9hZF9ob3N0X2Rlc3Ryb3lfYnVmZmVycyk7CisKKyAgICAgICAgZm9yIChCdWZmZXJMaXN0Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fZGVzdHJveV9idWZmZXJzLmJlZ2luKCk7CisgICAgICAgICAgICAgaXQgIT0gbV9kZXN0cm95X2J1ZmZlcnMuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgICAgIHJlcyA9IENPSTo6QnVmZmVyRGVzdHJveSgqaXQpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl9kZXN0cm95LCByZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgT2ZmbG9hZERlc2NyaXB0b3I6OmNsZWFudXAoKQoreworICAgIC8vIHJlbGVhc2UgZGV2aWNlIGluIG9yc2wKKyAgICBPUlNMOjpyZWxlYXNlKG1fZGV2aWNlLmdldF9sb2dpY2FsX2luZGV4KCkpOworCisgICAgT0ZGTE9BRF9USU1FUl9TVE9QKGdldF90aW1lcl9kYXRhKCksIGNfb2ZmbG9hZF9ob3N0X3RvdGFsX29mZmxvYWQpOworCisgICAgLy8gcmVwb3J0IHN0dWZmCisgICAgT2ZmbG9hZF9SZXBvcnRfRXBpbG9nKGdldF90aW1lcl9kYXRhKCkpOworfQorCitib29sIE9mZmxvYWREZXNjcmlwdG9yOjppc19zaWduYWxlZCgpCit7CisgICAgYm9vbCBzaWduYWxlZCA9IHRydWU7CisgICAgQ09JUkVTVUxUIHJlczsKKworICAgIC8vIGNoZWNrIGNvbXB1dGUgYW5kIHJlY2VpdmUgZGVwZW5kZW5jaWVzCisgICAgaWYgKG1faW5fZGVwc190b3RhbCA+IDApIHsKKyAgICAgICAgcmVzID0gQ09JOjpFdmVudFdhaXQobV9pbl9kZXBzX3RvdGFsLCBtX2luX2RlcHMsIDAsIDEsIDAsIDApOworICAgICAgICBzaWduYWxlZCA9IHNpZ25hbGVkICYmIChyZXMgPT0gQ09JX1NVQ0NFU1MpOworICAgIH0KKyAgICBpZiAobV9vdXRfZGVwc190b3RhbCA+IDApIHsKKyAgICAgICAgcmVzID0gQ09JOjpFdmVudFdhaXQobV9vdXRfZGVwc190b3RhbCwgbV9vdXRfZGVwcywgMCwgMSwgMCwgMCk7CisgICAgICAgIHNpZ25hbGVkID0gc2lnbmFsZWQgJiYgKHJlcyA9PSBDT0lfU1VDQ0VTUyk7CisgICAgfQorCisgICAgcmV0dXJuIHNpZ25hbGVkOworfQorCisvLyBTZW5kIHBvaW50ZXIgZGF0YSBpZiBzb3VyY2Ugb3IgZGVzdGluYXRpb24gb3IgYm90aCBvZiB0aGVtIGFyZQorLy8gbm9uY29udGlndW91cy4gVGhlcmUgaXMgZ3VhcmFudGVlIHRoYXQgbGVuZ3RoIG9mIGRlc3RpbmF0aW9uIGVub3VnaCBmb3IKKy8vIHRyYW5zZmVycmVkIGRhdGEuCitib29sIE9mZmxvYWREZXNjcmlwdG9yOjpzZW5kX25vbmNvbnRpZ3VvdXNfcG9pbnRlcl9kYXRhKAorICAgIGludCBpLAorICAgIFB0ckRhdGEqIHNyY19kYXRhLAorICAgIFB0ckRhdGEqIGRzdF9kYXRhLAorICAgIENPSUVWRU5UICpldmVudAorICAgICkKK3sKKyAgICBpbnQ2NF90IG9mZnNldF9zcmMsIG9mZnNldF9kc3Q7CisgICAgaW50NjRfdCBsZW5ndGhfc3JjLCBsZW5ndGhfZHN0OworICAgIGludDY0X3QgbGVuZ3RoX3NyY19jdXIsIGxlbmd0aF9kc3RfY3VyOworICAgIGludDY0X3Qgc2VuZF9zaXplLCBkYXRhX3NlbnQgPSAwOworICAgIENPSVJFU1VMVCByZXM7CisgICAgYm9vbCBkc3RfaXNfZW1wdHkgPSB0cnVlOworICAgIGJvb2wgc3JjX2lzX2VtcHR5ID0gdHJ1ZTsKKworICAgIC8vIFNldCBsZW5ndGhfc3JjIGFuZCBsZW5ndGhfZHN0CisgICAgbGVuZ3RoX3NyYyA9IChtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfc3JjKSA/CisgICAgICAgIG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19zcmMtPnJhbmdlX3NpemUgOiBtX3ZhcnNbaV0uc2l6ZTsKKyAgICBsZW5ndGhfZHN0ID0gIW1fdmFyc1tpXS5pbnRvID8gbGVuZ3RoX3NyYyA6CisgICAgICAgICAgICAgICAgICAgICAobV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX2RzdCkgPworICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX2RzdC0+cmFuZ2Vfc2l6ZSA6IG1fdmFyc1tpXS5zaXplOworICAgIHNlbmRfc2l6ZSA9IChsZW5ndGhfc3JjIDwgbGVuZ3RoX2RzdCkgPyBsZW5ndGhfc3JjIDogbGVuZ3RoX2RzdDsKKworICAgIC8vIGNvbnNlcXVlbnRseSBnZXQgY29udGlndW91cyByYW5nZXMsCisgICAgLy8gZGVmaW5lIGNvcnJlc3BvbmRlZCBkZXN0aW5hdGlvbiBvZmZzZXQgYW5kIHNlbmQgZGF0YQorICAgIGRvIHsKKyAgICAgICAgaWYgKHNyY19pc19lbXB0eSkgeworICAgICAgICAgICAgaWYgKG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19zcmMpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWdldF9uZXh0X3JhbmdlKG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19zcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldF9zcmMpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHNvdXJjZSByYW5nZXMgYXJlIG92ZXIgLSBub3RoaW5nIHRvIHNlbmQKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoZGF0YV9zZW50ID09IDApIHsKKyAgICAgICAgICAgICAgICBvZmZzZXRfc3JjID0gbV92YXJzX2V4dHJhW2ldLmNwdV9kaXNwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsZW5ndGhfc3JjX2N1ciA9IGxlbmd0aF9zcmM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLyBpZiBzb3VyY2UgaXMgY29udGlndW91cyBvciBpdHMgY29udGlndW91cyByYW5nZSBpcyBncmVhdGVyCisgICAgICAgICAgICAvLyB0aGFuIGRlc3RpbmF0aW9uIG9uZQorICAgICAgICAgICAgb2Zmc2V0X3NyYyArPSBzZW5kX3NpemU7CisgICAgICAgIH0KKyAgICAgICAgbGVuZ3RoX3NyY19jdXIgLT0gc2VuZF9zaXplOworICAgICAgICBzcmNfaXNfZW1wdHkgPSBsZW5ndGhfc3JjX2N1ciA9PSAwOworCisgICAgICAgIGlmIChkc3RfaXNfZW1wdHkpIHsKKyAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uaW50bykgeworICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfZHN0KSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghZ2V0X25leHRfcmFuZ2UobV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX2RzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldF9kc3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXN0aW5hdGlvbiByYW5nZXMgYXJlIG92ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19kZXN0aW5hdGlvbl9pc19vdmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBpbnRvIGlzIGNvbnRpZ3VvdXMuCisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldF9kc3QgPSBtX3ZhcnNbaV0uZGlzcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGVuZ3RoX2RzdF9jdXIgPSBsZW5ndGhfZHN0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gc2FtZSBhcyBzb3VyY2UKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIG9mZnNldF9kc3QgPSBvZmZzZXRfc3JjOworICAgICAgICAgICAgICAgIGxlbmd0aF9kc3RfY3VyID0gbGVuZ3RoX3NyYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIGlmIGRlc3RpbmF0aW9uIGlzIGNvbnRpZ3VvdXMgb3IgaXRzIGNvbnRpZ3VvdXMgcmFuZ2UgaXMgZ3JlYXRlcgorICAgICAgICAgICAgLy8gdGhhbiBzb3VyY2Ugb25lCisgICAgICAgICAgICBvZmZzZXRfZHN0ICs9IHNlbmRfc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBsZW5ndGhfZHN0X2N1ciAtPSBzZW5kX3NpemU7CisgICAgICAgIGRzdF9pc19lbXB0eSA9IGxlbmd0aF9kc3RfY3VyID09IDA7CisKKyAgICAgICAgaWYgKHNyY19kYXRhICE9IDAgJiYgc3JjX2RhdGEtPmNwdV9idWYgIT0gMCkgeworICAgICAgICAgICAgcmVzID0gQ09JOjpCdWZmZXJDb3B5KAorICAgICAgICAgICAgICAgIGRzdF9kYXRhLT5taWNfYnVmLAorICAgICAgICAgICAgICAgIHNyY19kYXRhLT5jcHVfYnVmLAorICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0IC0gZHN0X2RhdGEtPmFsbG9jX2Rpc3AgKworICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgKyBvZmZzZXRfZHN0LAorICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5jcHVfb2Zmc2V0ICsgb2Zmc2V0X3NyYywKKyAgICAgICAgICAgICAgICBzZW5kX3NpemUsCisgICAgICAgICAgICAgICAgQ09JX0NPUFlfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgMCwgMCwKKyAgICAgICAgICAgICAgICBldmVudCk7CisgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX2NvcHksIHJlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjaGFyICpiYXNlID0gb2ZmbG9hZF9nZXRfc3JjX2Jhc2UobV92YXJzW2ldLnB0ciwKKyAgICAgICAgICAgICAgICBtX3ZhcnNbaV0udHlwZS5zcmMpOworCisgICAgICAgICAgICByZXMgPSBDT0k6OkJ1ZmZlcldyaXRlKAorICAgICAgICAgICAgICAgIGRzdF9kYXRhLT5taWNfYnVmLAorICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0IC0gZHN0X2RhdGEtPmFsbG9jX2Rpc3AgKworICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgKyBvZmZzZXRfZHN0LAorICAgICAgICAgICAgICAgIGJhc2UgKyBvZmZzZXRfc3JjLAorICAgICAgICAgICAgICAgIHNlbmRfc2l6ZSwKKyAgICAgICAgICAgICAgICBDT0lfQ09QWV9VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAwLCAwLAorICAgICAgICAgICAgICAgIGV2ZW50KTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfd3JpdGUsIHJlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZGF0YV9zZW50ICs9IGxlbmd0aF9zcmM7CisgICAgfQorICAgIHdoaWxlICh0cnVlKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBPZmZsb2FkRGVzY3JpcHRvcjo6c2VuZF9wb2ludGVyX2RhdGEoYm9vbCBpc19hc3luYykKK3sKKyAgICBPZmZsb2FkVGltZXIgdGltZXIoZ2V0X3RpbWVyX2RhdGEoKSwgY19vZmZsb2FkX2hvc3Rfc2VuZF9wb2ludGVycyk7CisKKyAgICB1aW50NjRfdCBwdHJfc2VudCA9IDA7CisgICAgQ09JUkVTVUxUIHJlczsKKworICAgIC8vIEluaXRpYXRlIHNlbmQgZm9yIHBvaW50ZXIgZGF0YQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV92YXJzX3RvdGFsOyBpKyspIHsKKyAgICAgICAgc3dpdGNoIChtX3ZhcnNbaV0udHlwZS5kc3QpIHsKKyAgICAgICAgICAgIGNhc2UgY19kYXRhX3B0cl9hcnJheToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgY19kYXRhOgorICAgICAgICAgICAgY2FzZSBjX3ZvaWRfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2NlYW5fdmFyOgorICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmluICYmCisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWNfZHN0bikgeworICAgICAgICAgICAgICAgICAgICBDT0lFVkVOVCAqZXZlbnQgPQorICAgICAgICAgICAgICAgICAgICAgICAgKGlzX2FzeW5jIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUgPj0gX19vZmZsb2FkX3VzZV9hc3luY19idWZmZXJfd3JpdGUpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICZtX2luX2RlcHNbbV9pbl9kZXBzX3RvdGFsKytdIDogMDsKKyAgICAgICAgICAgICAgICAgICAgUHRyRGF0YSogZHN0X2RhdGEgPSBtX3ZhcnNbaV0uaW50byA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5kc3RfZGF0YSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgUHRyRGF0YSogc3JjX2RhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAgVkFSX1RZUEVfSVNfUFRSKG1fdmFyc1tpXS50eXBlLnNyYykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZBUl9UWVBFX0lTX1NDQUxBUihtX3ZhcnNbaV0udHlwZS5zcmMpICYmCisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YSA6IDA7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5pc19ub25jb250X3NyYyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX25vbmNvbnRfZHN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbmRfbm9uY29udGlndW91c19wb2ludGVyX2RhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHNyY19kYXRhLCBkc3RfZGF0YSwgZXZlbnQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNyY19kYXRhICE9IDAgJiYgc3JjX2RhdGEtPmNwdV9idWYgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gQ09JOjpCdWZmZXJDb3B5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9kYXRhLT5taWNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19kYXRhLT5jcHVfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0IC0gZHN0X2RhdGEtPmFsbG9jX2Rpc3AgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgKyBtX3ZhcnNbaV0uZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X29mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmNwdV9kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9DT1BZX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl9jb3B5LCByZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqYmFzZSA9IG9mZmxvYWRfZ2V0X3NyY19iYXNlKG1fdmFyc1tpXS5wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnR5cGUuc3JjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IENPSTo6QnVmZmVyV3JpdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2RhdGEtPm1pY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm1pY19vZmZzZXQgLSBkc3RfZGF0YS0+YWxsb2NfZGlzcCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCArIG1fdmFyc1tpXS5kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgKyBtX3ZhcnNfZXh0cmFbaV0uY3B1X2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0NPUFlfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX3dyaXRlLCByZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB0cl9zZW50ICs9IG1fdmFyc1tpXS5zaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjX3N0cmluZ19wdHI6CisgICAgICAgICAgICBjYXNlIGNfZGF0YV9wdHI6CisgICAgICAgICAgICBjYXNlIGNfY2Vhbl92YXJfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2R2X3B0cjoKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5pbiAmJiBtX3ZhcnNbaV0uc2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQ09JRVZFTlQgKmV2ZW50ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChpc19hc3luYyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplID49IF9fb2ZmbG9hZF91c2VfYXN5bmNfYnVmZmVyX3dyaXRlKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAmbV9pbl9kZXBzW21faW5fZGVwc190b3RhbCsrXSA6IDA7CisgICAgICAgICAgICAgICAgICAgIFB0ckRhdGEqIGRzdF9kYXRhID0gbV92YXJzW2ldLmludG8gPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uZHN0X2RhdGEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGE7CisgICAgICAgICAgICAgICAgICAgIFB0ckRhdGEqIHNyY19kYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgIFZBUl9UWVBFX0lTX1BUUihtX3ZhcnNbaV0udHlwZS5zcmMpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBWQVJfVFlQRV9JU19TQ0FMQVIobV92YXJzW2ldLnR5cGUuc3JjKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpYyA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhIDogMDsKKworICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmlzX25vbmNvbnRfc3JjIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfbm9uY29udF9kc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRfbm9uY29udGlndW91c19wb2ludGVyX2RhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgc3JjX2RhdGEsIGRzdF9kYXRhLCBldmVudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3JjX2RhdGEgIT0gMCAmJiBzcmNfZGF0YS0+Y3B1X2J1ZiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBDT0k6OkJ1ZmZlckNvcHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2RhdGEtPm1pY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2RhdGEtPmNwdV9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm1pY19vZmZzZXQgLSBkc3RfZGF0YS0+YWxsb2NfZGlzcCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCArIG1fdmFyc1tpXS5kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5jcHVfb2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0NPUFlfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX2NvcHksIHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpiYXNlID0gb2ZmbG9hZF9nZXRfc3JjX2Jhc2UobV92YXJzW2ldLnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0udHlwZS5zcmMpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gQ09JOjpCdWZmZXJXcml0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfZGF0YS0+bWljX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ubWljX29mZnNldCAtIGRzdF9kYXRhLT5hbGxvY19kaXNwICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0ICsgbV92YXJzW2ldLmRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSArIG1fdmFyc19leHRyYVtpXS5jcHVfZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfQ09QWV9VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfd3JpdGUsIHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBwdHJfc2VudCArPSBtX3ZhcnNbaV0uc2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgY19kdl9kYXRhOgorICAgICAgICAgICAgY2FzZSBjX2R2X3B0cl9kYXRhOgorICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmluICYmCisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplID4gMCkgeworICAgICAgICAgICAgICAgICAgICBQdHJEYXRhICpwdHJfZGF0YSA9IG1fdmFyc1tpXS5pbnRvID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uZHN0X2RhdGEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgUHRyRGF0YSogc3JjX2RhdGEgPSBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGE7CisKKyAgICAgICAgICAgICAgICAgICAgQ09JRVZFTlQgKmV2ZW50ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChpc19hc3luYyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplID49IF9fb2ZmbG9hZF91c2VfYXN5bmNfYnVmZmVyX3dyaXRlKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAmbV9pbl9kZXBzW21faW5fZGVwc190b3RhbCsrXSA6IDA7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5pc19ub25jb250X3NyYyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX25vbmNvbnRfZHN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kX25vbmNvbnRpZ3VvdXNfcG9pbnRlcl9kYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHNyY19kYXRhLCBwdHJfZGF0YSwgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNyY19kYXRhICYmIHNyY19kYXRhLT5jcHVfYnVmICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IENPSTo6QnVmZmVyQ29weSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YS0+bWljX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfZGF0YS0+Y3B1X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0ICsgcHRyX2RhdGEtPm1pY19vZmZzZXQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5hbGxvY19kaXNwICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X29mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmNwdV9kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9DT1BZX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl9jb3B5LCByZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqYmFzZSA9IG9mZmxvYWRfZ2V0X3NyY19iYXNlKG1fdmFyc1tpXS5wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnR5cGUuc3JjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IENPSTo6QnVmZmVyV3JpdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPm1pY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPm1pY19vZmZzZXQgLSBwdHJfZGF0YS0+YWxsb2NfZGlzcCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCArIG1fdmFyc1tpXS5kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgKyBtX3ZhcnNfZXh0cmFbaV0uY3B1X2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0NPUFlfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX3dyaXRlLCByZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB0cl9zZW50ICs9IG1fdmFyc1tpXS5zaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjX2R2X2RhdGFfc2xpY2U6CisgICAgICAgICAgICBjYXNlIGNfZHZfcHRyX2RhdGFfc2xpY2U6CisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uaW4gJiYKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIFB0ckRhdGEgKmRzdF9kYXRhID0gbV92YXJzW2ldLmludG8gPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5kc3RfZGF0YSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhOworICAgICAgICAgICAgICAgICAgICBQdHJEYXRhKiBzcmNfZGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICAoVkFSX1RZUEVfSVNfUFRSKG1fdmFyc1tpXS50eXBlLnNyYykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZBUl9UWVBFX0lTX0RWX0RBVEEobV92YXJzW2ldLnR5cGUuc3JjKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgVkFSX1RZUEVfSVNfRFZfREFUQV9TTElDRShtX3ZhcnNbaV0udHlwZS5zcmMpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBWQVJfVFlQRV9JU19TQ0FMQVIobV92YXJzW2ldLnR5cGUuc3JjKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpYykgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YSA6IDA7CisgICAgICAgICAgICAgICAgICAgIENPSUVWRU5UICpldmVudCA9CisgICAgICAgICAgICAgICAgICAgICAgICAoaXNfYXN5bmMgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSA+PSBfX29mZmxvYWRfdXNlX2FzeW5jX2J1ZmZlcl93cml0ZSkgPworICAgICAgICAgICAgICAgICAgICAgICAgJm1faW5fZGVwc1ttX2luX2RlcHNfdG90YWwrK10gOiAwOworICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmlzX25vbmNvbnRfc3JjIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfbm9uY29udF9kc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRfbm9uY29udGlndW91c19wb2ludGVyX2RhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgc3JjX2RhdGEsIGRzdF9kYXRhLCBldmVudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3JjX2RhdGEgJiYgc3JjX2RhdGEtPmNwdV9idWYgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gQ09JOjpCdWZmZXJDb3B5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9kYXRhLT5taWNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19kYXRhLT5jcHVfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgLSBkc3RfZGF0YS0+YWxsb2NfZGlzcCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2RhdGEtPm1pY19vZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5jcHVfb2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0NPUFlfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX2NvcHksIHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpiYXNlID0gb2ZmbG9hZF9nZXRfc3JjX2Jhc2UobV92YXJzW2ldLnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0udHlwZS5zcmMpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gQ09JOjpCdWZmZXJXcml0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfZGF0YS0+bWljX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfZGF0YS0+bWljX29mZnNldCAtIGRzdF9kYXRhLT5hbGxvY19kaXNwICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0ICsgbV92YXJzW2ldLmRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSArIG1fdmFyc19leHRyYVtpXS5jcHVfZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfQ09QWV9VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfd3JpdGUsIHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBwdHJfc2VudCArPSBtX3ZhcnNbaV0uc2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBhbGxvYyBmaWVsZCBpc24ndCB1c2VkIGF0IHRhcmdldC4KKyAgICAgICAgLy8gV2UgY2FuIHJldXNlIGl0IGZvciBvZmZzZXQgb2YgYXJyYXkgcG9pbnRlcnMuCisgICAgICAgIGlmIChtX3ZhcnNfZXh0cmFbaV0uaXNfYXJyX3B0cl9lbCkgeworICAgICAgICAgICAgbV92YXJzW2ldLnB0cl9hcnJfb2Zmc2V0ID0gbV92YXJzX2V4dHJhW2ldLnB0cl9hcnJfb2Zmc2V0OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1fc3RhdHVzKSB7CisgICAgICAgIG1fc3RhdHVzLT5kYXRhX3NlbnQgKz0gcHRyX3NlbnQ7CisgICAgfQorCisgICAgT0ZGTE9BRF9USU1FUl9IT1NUX1NEQVRBKGdldF90aW1lcl9kYXRhKCksIHB0cl9zZW50KTsKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoMSwgR0VUX09GRkxPQURfTlVNQkVSKGdldF90aW1lcl9kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgY19vZmZsb2FkX3NlbnRfcG9pbnRlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgIlRvdGFsIHBvaW50ZXIgZGF0YSBzZW50IHRvIHRhcmdldDogWyVsbGRdIGJ5dGVzXG4iLAorICAgICAgICAgICAgICAgICAgcHRyX3NlbnQpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgT2ZmbG9hZERlc2NyaXB0b3I6OmdhdGhlcl9jb3B5aW5fZGF0YSgpCit7CisgICAgT2ZmbG9hZFRpbWVyIHRpbWVyKGdldF90aW1lcl9kYXRhKCksIGNfb2ZmbG9hZF9ob3N0X2dhdGhlcl9pbnB1dHMpOworCisgICAgaWYgKG1fbmVlZF9ydW5mdW5jdGlvbiAmJiBtX2luX2RhdGFsZW4gPiAwKSB7CisgICAgICAgIENPSU1BUElOU1RBTkNFIG1hcF9pbnN0OworICAgICAgICBjaGFyICpkYXRhOworCisgICAgICAgIC8vIGluaXQgbWFyc2hhbGxlcgorICAgICAgICBpZiAobV9pbm91dF9idWYgIT0gMCkgeworICAgICAgICAgICAgT2ZmbG9hZFRpbWVyIHRpbWVyX21hcChnZXRfdGltZXJfZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX29mZmxvYWRfaG9zdF9tYXBfaW5fZGF0YV9idWZmZXIpOworCisgICAgICAgICAgICBDT0lSRVNVTFQgcmVzID0gQ09JOjpCdWZmZXJNYXAobV9pbm91dF9idWYsIDAsIG1faW5fZGF0YWxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfTUFQX1dSSVRFX0VOVElSRV9CVUZGRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgJm1hcF9pbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCoqPigmZGF0YSkpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl9tYXAsIHJlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBkYXRhID0gKGNoYXIqKSBtX2Z1bmNfZGVzYyArIG1fZnVuY19kZXNjLT5kYXRhX29mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNlbmQgdmFyaWFibGUgZGVzY3JpcHRvcnMKKyAgICAgICAgbWVtY3B5KGRhdGEsIG1fdmFycywgbV92YXJzX3RvdGFsICogc2l6ZW9mKFZhckRlc2MpKTsKKyAgICAgICAgZGF0YSArPSBtX3ZhcnNfdG90YWwgKiBzaXplb2YoVmFyRGVzYyk7CisKKyAgICAgICAgLy8gaW5pdCBtYXJzaGFsbGVyCisgICAgICAgIG1faW4uaW5pdF9idWZmZXIoZGF0YSwgbV9pbl9kYXRhbGVuKTsKKworICAgICAgICAvLyBHYXRoZXIgY29weSBkYXRhIGludG8gYnVmZmVyCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV92YXJzX3RvdGFsOyBpKyspIHsKKyAgICAgICAgICAgIGJvb2wgc3JjX2lzX2Zvcl9taWMgPSAobV92YXJzW2ldLmRpcmVjdGlvbi5vdXQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmludG8gPT0gTlVMTCk7CisgICAgICAgICAgICBQdHJEYXRhKiBwdHJfZGF0YSA9IHNyY19pc19mb3JfbWljID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmRzdF9kYXRhOworICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5hbGxvY19kaXNwKSB7CisgICAgICAgICAgICAgICAgbV9pbi5zZW5kX2RhdGEoJnB0cl9kYXRhLT5hbGxvY19kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihwdHJfZGF0YS0+YWxsb2NfZGlzcCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzZW5kIHNpbmsgYWRkcmVzcyB0byB0aGUgdGFyZ2V0CisgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLnNpbmtfYWRkcikgeworICAgICAgICAgICAgICAgIG1faW4uc2VuZF9kYXRhKCZwdHJfZGF0YS0+bWljX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHB0cl9kYXRhLT5taWNfYWRkcikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKG1fdmFyc1tpXS50eXBlLmRzdCkgeworICAgICAgICAgICAgICAgIGNhc2UgY19kYXRhX3B0cl9hcnJheToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBjX2RhdGE6CisgICAgICAgICAgICAgICAgY2FzZSBjX3ZvaWRfcHRyOgorICAgICAgICAgICAgICAgIGNhc2UgY19jZWFuX3ZhcjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uaW4gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICFtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljX2RzdG4pIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcHRyID0gb2ZmbG9hZF9nZXRfc3JjX2Jhc2UobV92YXJzW2ldLnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS50eXBlLnNyYyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLnR5cGUuZHN0ID09IGNfY2Vhbl92YXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQgYW5kIGxlbmd0aCBhcmUgZGVyaXZlZCBmcm9tIHRoZSBhcnJheQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlc2NyaXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHNpemUgPSBtX3ZhcnNbaV0uc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGRpc3AgPSBtX3ZhcnNbaV0uZGlzcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luLnNlbmRfZGF0YShyZWludGVycHJldF9jYXN0PGNoYXIqPigmc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGludDY0X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luLnNlbmRfZGF0YShyZWludGVycHJldF9jYXN0PGNoYXIqPigmZGlzcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGludDY0X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgbV9pbi5zZW5kX2RhdGEocHRyICsgbV92YXJzX2V4dHJhW2ldLmNwdV9kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBjX2R2OgorICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uYWxsb2NfaWYgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mcmVlX2lmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZW5kIGRvcGUgdmVjdG9yIGV4Y2x1ZGluZyBiYXNlCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpwdHIgPSBzdGF0aWNfY2FzdDxjaGFyKj4obV92YXJzW2ldLnB0cik7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2luLnNlbmRfZGF0YShwdHIgKyBzaXplb2YodWludDY0X3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUgLSBzaXplb2YodWludDY0X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgY19kYXRhX3B0cjoKKyAgICAgICAgICAgICAgICAgICAgLy8gc2VuZCB0byB0YXJnZXQgYWRkcmVzc2VzIG9mIG9ic29sZXRlCisgICAgICAgICAgICAgICAgICAgIC8vIHN0YWNrcyB0byBiZSByZWxlYXNlZAorICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmlzX3N0YWNrX2J1ZiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIW1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmFsbG9jX2lmICYmCisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFB0ckRhdGFMaXN0OjppdGVyYXRvciBpdCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kZXN0cm95X3N0YWNrLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgIT0gbV9kZXN0cm95X3N0YWNrLmVuZCgpOyBpdCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyRGF0YSAqIHB0cl9kYXRhID0gKml0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW4uc2VuZF9kYXRhKCYocHRyX2RhdGEtPm1pY19hZGRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHB0cl9kYXRhLT5taWNfYWRkcikpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgY19mdW5jX3B0cjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uaW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1faW4uc2VuZF9mdW5jX3B0cigqKChjb25zdCB2b2lkKiopIG1fdmFyc1tpXS5wdHIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG1fc3RhdHVzKSB7CisgICAgICAgICAgICBtX3N0YXR1cy0+ZGF0YV9zZW50ICs9IG1faW4uZ2V0X3Rmcl9zaXplKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobV9mdW5jX2Rlc2MtPmRhdGFfb2Zmc2V0ID09IDApIHsKKyAgICAgICAgICAgIE9mZmxvYWRUaW1lciB0aW1lcl91bm1hcChnZXRfdGltZXJfZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfb2ZmbG9hZF9ob3N0X3VubWFwX2luX2RhdGFfYnVmZmVyKTsKKyAgICAgICAgICAgIENPSVJFU1VMVCByZXMgPSBDT0k6OkJ1ZmZlclVubWFwKG1hcF9pbnN0LCAwLCAwLCAwKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfdW5tYXAsIHJlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBPRkZMT0FEX1RJTUVSX0hPU1RfU0RBVEEoZ2V0X3RpbWVyX2RhdGEoKSwgbV9pbi5nZXRfdGZyX3NpemUoKSk7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKDEsCisgICAgICAgICAgICAgICAgICBHRVRfT0ZGTE9BRF9OVU1CRVIoZ2V0X3RpbWVyX2RhdGEoKSksIGNfb2ZmbG9hZF9jb3B5aW5fZGF0YSwKKyAgICAgICAgICAgICAgICAgICJUb3RhbCBjb3B5aW4gZGF0YSBzZW50IHRvIHRhcmdldDogWyVsbGRdIGJ5dGVzXG4iLAorICAgICAgICAgICAgICAgICAgbV9pbi5nZXRfdGZyX3NpemUoKSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBPZmZsb2FkRGVzY3JpcHRvcjo6Y29tcHV0ZSgpCit7CisgICAgT2ZmbG9hZFRpbWVyIHRpbWVyKGdldF90aW1lcl9kYXRhKCksIGNfb2ZmbG9hZF9ob3N0X3N0YXJ0X2NvbXB1dGUpOworCisgICAgaWYgKG1fbmVlZF9ydW5mdW5jdGlvbikgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoMiwgR0VUX09GRkxPQURfTlVNQkVSKGdldF90aW1lcl9kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19vZmZsb2FkX2NvbXB1dGUsICJDb21wdXRlIHRhc2sgb24gTUlDXG4iKTsKKworICAgICAgICB2b2lkKiBtaXNjID0gbV9mdW5jX2Rlc2M7CisgICAgICAgIGludCAgIG1pc2NfbGVuID0gbV9mdW5jX2Rlc2Nfc2l6ZTsKKyAgICAgICAgdm9pZCogcmV0ID0gMDsKKyAgICAgICAgaW50ICAgcmV0X2xlbiA9IDA7CisKKyAgICAgICAgaWYgKG1fZnVuY19kZXNjLT5kYXRhX29mZnNldCAhPSAwKSB7CisgICAgICAgICAgICBtaXNjX2xlbiArPSBtX2luX2RhdGFsZW47CisKKyAgICAgICAgICAgIGlmIChtX291dF9kYXRhbGVuID4gMCkgeworICAgICAgICAgICAgICAgIHJldCA9IChjaGFyKikgbV9mdW5jX2Rlc2MgKyBtX2Z1bmNfZGVzYy0+ZGF0YV9vZmZzZXQ7CisgICAgICAgICAgICAgICAgcmV0X2xlbiA9IG1fb3V0X2RhdGFsZW47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBkaXNwYXRjaCB0YXNrCisgICAgICAgIENPSVJFU1VMVCByZXM7CisgICAgICAgIENPSUVWRU5UIGV2ZW50OworICAgICAgICByZXMgPSBtX2RldmljZS5jb21wdXRlKG1fY29tcHV0ZV9idWZmZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc2MsIG1pc2NfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCwgcmV0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luX2RlcHNfdG90YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbl9kZXBzX3RvdGFsID4gMCA/IG1faW5fZGVwcyA6IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV2ZW50KTsKKyAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19waXBlbGluZV9ydW5fZnVuYywgcmVzKTsKKyAgICAgICAgfQorCisgICAgICAgIG1faW5fZGVwc190b3RhbCA9IDE7CisgICAgICAgIG1faW5fZGVwc1swXSA9IGV2ZW50OworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCisvLyByZWNlaXZlIHBvaW50ZXIgZGF0YSBpZiBzb3VyY2Ugb3IgZGVzdGluYXRpb24gb3IgYm90aCBvZiB0aGVtIGFyZQorLy8gbm9uY29udGlndW91cy4gVGhlcmUgaXMgZ3VhcmFudGVlIHRoYXQgbGVuZ3RoIG9mIGRlc3RpbmF0aW9uIGVub3VnaCBmb3IKKy8vIHRyYW5zZmVycmVkIGRhdGEuCitib29sIE9mZmxvYWREZXNjcmlwdG9yOjpyZWNlaXZlX25vbmNvbnRpZ3VvdXNfcG9pbnRlcl9kYXRhKAorICAgIGludCBpLAorICAgIGNoYXIqIGJhc2UsCisgICAgQ09JQlVGRkVSIGRzdF9idWYsCisgICAgQ09JRVZFTlQgKmV2ZW50CispCit7CisgICAgaW50NjRfdCBvZmZzZXRfc3JjLCBvZmZzZXRfZHN0OworICAgIGludDY0X3QgbGVuZ3RoX3NyYywgbGVuZ3RoX2RzdDsKKyAgICBpbnQ2NF90IGxlbmd0aF9zcmNfY3VyLCBsZW5ndGhfZHN0X2N1cjsKKyAgICBpbnQ2NF90IHJlY2VpdmVfc2l6ZSwgZGF0YV9yZWNlaXZlZCA9IDA7CisgICAgQ09JUkVTVUxUIHJlczsKKyAgICBib29sIGRzdF9pc19lbXB0eSA9IHRydWU7CisgICAgYm9vbCBzcmNfaXNfZW1wdHkgPSB0cnVlOworCisgICAgLy8gU2V0IGxlbmd0aF9zcmMgYW5kIGxlbmd0aF9kc3QKKyAgICBsZW5ndGhfc3JjID0gKG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19zcmMpID8KKyAgICAgICAgbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX3NyYy0+cmFuZ2Vfc2l6ZSA6IG1fdmFyc1tpXS5zaXplOworICAgIGxlbmd0aF9kc3QgPSAhbV92YXJzW2ldLmludG8gPyBsZW5ndGhfc3JjIDoKKyAgICAgICAgICAgICAgICAgICAgIChtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfZHN0KSA/CisgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfZHN0LT5yYW5nZV9zaXplIDogbV92YXJzW2ldLnNpemU7CisgICAgcmVjZWl2ZV9zaXplID0gKGxlbmd0aF9zcmMgPCBsZW5ndGhfZHN0KSA/IGxlbmd0aF9zcmMgOiBsZW5ndGhfZHN0OworCisgICAgLy8gY29uc2VxdWVudGx5IGdldCBjb250aWd1b3VzIHJhbmdlcywKKyAgICAvLyBkZWZpbmUgY29ycmVzcG9uZGVkIGRlc3RpbmF0aW9uIG9mZnNldCBhbmQgcmVjZWl2ZSBkYXRhCisgICAgZG8geworICAgICAgICAvLyBnZXQgc29yY2Ugb2Zmc2V0CisgICAgICAgIGlmIChzcmNfaXNfZW1wdHkpIHsKKyAgICAgICAgICAgIGlmIChtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfc3JjKSB7CisgICAgICAgICAgICAgICAgaWYgKCFnZXRfbmV4dF9yYW5nZShtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXRfc3JjKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBzb3VyY2UgcmFuZ2VzIGFyZSBvdmVyIC0gbm90aGluZyB0byBzZW5kCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGRhdGFfcmVjZWl2ZWQgPT0gMCkgeworICAgICAgICAgICAgICAgIG9mZnNldF9zcmMgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsZW5ndGhfc3JjX2N1ciA9IGxlbmd0aF9zcmM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLyBpZiBzb3VyY2UgaXMgY29udGlndW91cyBvciBpdHMgY29udGlndW91cyByYW5nZSBpcyBncmVhdGVyCisgICAgICAgICAgICAvLyB0aGFuIGRlc3RpbmF0aW9uIG9uZQorICAgICAgICAgICAgb2Zmc2V0X3NyYyArPSByZWNlaXZlX3NpemU7CisgICAgICAgIH0KKyAgICAgICAgbGVuZ3RoX3NyY19jdXIgLT0gcmVjZWl2ZV9zaXplOworICAgICAgICBzcmNfaXNfZW1wdHkgPSBsZW5ndGhfc3JjX2N1ciA9PSAwOworCisgICAgICAgIC8vIGdldCBkZXN0aW5hdGlvbiBvZmZzZXQKKyAgICAgICAgaWYgKGRzdF9pc19lbXB0eSkgeworICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5pbnRvKSB7CisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19kc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFnZXRfbmV4dF9yYW5nZShtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0X2RzdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlc3RpbmF0aW9uIHJhbmdlcyBhcmUgb3ZlcgorICAgICAgICAgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2Rlc3RpbmF0aW9uX2lzX292ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGRlc3RpbmF0aW9uIGlzIGNvbnRpZ3VvdXMuCisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldF9kc3QgPSBtX3ZhcnNfZXh0cmFbaV0uY3B1X2Rpc3A7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxlbmd0aF9kc3RfY3VyID0gbGVuZ3RoX2RzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHNhbWUgYXMgc291cmNlCisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBvZmZzZXRfZHN0ID0gb2Zmc2V0X3NyYzsKKyAgICAgICAgICAgICAgICBsZW5ndGhfZHN0X2N1ciA9IGxlbmd0aF9zcmM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLyBpZiBkZXN0aW5hdGlvbiBpcyBjb250aWd1b3VzIG9yIGl0cyBjb250aWd1b3VzIHJhbmdlIGlzIGdyZWF0ZXIKKyAgICAgICAgICAgIC8vIHRoYW4gc291cmNlIG9uZQorICAgICAgICAgICAgb2Zmc2V0X2RzdCArPSByZWNlaXZlX3NpemU7CisgICAgICAgIH0KKyAgICAgICAgbGVuZ3RoX2RzdF9jdXIgLT0gcmVjZWl2ZV9zaXplOworICAgICAgICBkc3RfaXNfZW1wdHkgPSBsZW5ndGhfZHN0X2N1ciA9PSAwOworCisgICAgICAgIGlmIChkc3RfYnVmICE9IDApIHsKKyAgICAgICAgICAgIHJlcyA9IENPSTo6QnVmZmVyQ29weSgKKyAgICAgICAgICAgICAgICBkc3RfYnVmLAorICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YS0+bWljX2J1ZiwKKyAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X29mZnNldCArIG9mZnNldF9kc3QsCisgICAgICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCArIG9mZnNldF9zcmMgKworICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0IC0KKyAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGEtPmFsbG9jX2Rpc3AsCisgICAgICAgICAgICAgICAgcmVjZWl2ZV9zaXplLAorICAgICAgICAgICAgICAgIENPSV9DT1BZX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgIG1faW5fZGVwc190b3RhbCwKKyAgICAgICAgICAgICAgICBtX2luX2RlcHNfdG90YWwgPiAwID8gbV9pbl9kZXBzIDogMCwKKyAgICAgICAgICAgICAgICBldmVudCk7CisgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX2NvcHksIHJlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXMgPSBDT0k6OkJ1ZmZlclJlYWQoCisgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhLT5taWNfYnVmLAorICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgKyBvZmZzZXRfc3JjICsKKyAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ubWljX29mZnNldCAtCisgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhLT5hbGxvY19kaXNwLAorICAgICAgICAgICAgICAgIGJhc2UgKyBvZmZzZXRfZHN0LAorICAgICAgICAgICAgICAgIHJlY2VpdmVfc2l6ZSwKKyAgICAgICAgICAgICAgICBDT0lfQ09QWV9VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICBtX2luX2RlcHNfdG90YWwsCisgICAgICAgICAgICAgICAgbV9pbl9kZXBzX3RvdGFsID4gMCA/IG1faW5fZGVwcyA6IDAsCisgICAgICAgICAgICAgICAgZXZlbnQpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl9yZWFkLCByZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRhdGFfcmVjZWl2ZWQgKz0gcmVjZWl2ZV9zaXplOworICAgIH0KKyAgICB3aGlsZSAodHJ1ZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgT2ZmbG9hZERlc2NyaXB0b3I6OnJlY2VpdmVfcG9pbnRlcl9kYXRhKGJvb2wgaXNfYXN5bmMpCit7CisgICAgT2ZmbG9hZFRpbWVyIHRpbWVyKGdldF90aW1lcl9kYXRhKCksIGNfb2ZmbG9hZF9ob3N0X3N0YXJ0X2J1ZmZlcnNfcmVhZHMpOworCisgICAgdWludDY0X3QgcHRyX3JlY2VpdmVkID0gMDsKKyAgICBDT0lSRVNVTFQgcmVzOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX3ZhcnNfdG90YWw7IGkrKykgeworICAgICAgICBzd2l0Y2ggKG1fdmFyc1tpXS50eXBlLnNyYykgeworICAgICAgICAgICAgY2FzZSBjX2RhdGFfcHRyX2FycmF5OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBjX2RhdGE6CisgICAgICAgICAgICBjYXNlIGNfdm9pZF9wdHI6CisgICAgICAgICAgICBjYXNlIGNfY2Vhbl92YXI6CisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24ub3V0ICYmCisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWMpIHsKKyAgICAgICAgICAgICAgICAgICAgQ09JRVZFTlQgKmV2ZW50ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChpc19hc3luYyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGVwc190b3RhbCA+IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSA+PSBfX29mZmxvYWRfdXNlX2FzeW5jX2J1ZmZlcl9yZWFkKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAmbV9vdXRfZGVwc1ttX291dF9kZXBzX3RvdGFsKytdIDogMDsKKyAgICAgICAgICAgICAgICAgICAgUHRyRGF0YSAqcHRyX2RhdGEgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBDT0lCVUZGRVIgZHN0X2J1ZiA9IE5VTEw7IC8vIGJ1ZmZlciBhdCBob3N0CisgICAgICAgICAgICAgICAgICAgIGNoYXIgKmJhc2U7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKFZBUl9UWVBFX0lTX1BUUihtX3ZhcnNbaV0udHlwZS5kc3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YSA9IG1fdmFyc1tpXS5pbnRvID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmRzdF9kYXRhIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKFZBUl9UWVBFX0lTX1NDQUxBUihtX3ZhcnNbaV0udHlwZS5kc3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpY19kc3RuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEgPSBtX3ZhcnNbaV0uaW50byA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uZHN0X2RhdGEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGRzdF9idWYgPSBwdHJfZGF0YSA/IHB0cl9kYXRhLT5jcHVfYnVmIDogTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRzdF9idWYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSA9IG9mZmxvYWRfZ2V0X3NyY19iYXNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5pbnRvID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjaGFyKj4obV92YXJzW2ldLmludG8pIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjaGFyKj4obV92YXJzW2ldLnB0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnR5cGUuZHN0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3MuaXNfbm9uY29udF9zcmMgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19ub25jb250X2RzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZV9ub25jb250aWd1b3VzX3BvaW50ZXJfZGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBiYXNlLCBkc3RfYnVmLCBldmVudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZHN0X2J1ZiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBDT0k6OkJ1ZmZlckNvcHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGEtPm1pY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmNwdV9vZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5jcHVfZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0ICsgbV92YXJzW2ldLmRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0NPUFlfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbl9kZXBzX3RvdGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGVwc190b3RhbCA+IDAgPyBtX2luX2RlcHMgOiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfY29weSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gQ09JOjpCdWZmZXJSZWFkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YS0+bWljX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0ICsgbV92YXJzW2ldLmRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSArIG1fdmFyc19leHRyYVtpXS5jcHVfb2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0NPUFlfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbl9kZXBzX3RvdGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGVwc190b3RhbCA+IDAgPyBtX2luX2RlcHMgOiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfcmVhZCwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdHJfcmVjZWl2ZWQgKz0gbV92YXJzW2ldLnNpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGNfc3RyaW5nX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19kYXRhX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19jZWFuX3Zhcl9wdHI6CisgICAgICAgICAgICBjYXNlIGNfZHZfZGF0YToKKyAgICAgICAgICAgIGNhc2UgY19kdl9wdHJfZGF0YToKKyAgICAgICAgICAgIGNhc2UgY19kdl9kYXRhX3NsaWNlOgorICAgICAgICAgICAgY2FzZSBjX2R2X3B0cl9kYXRhX3NsaWNlOgorICAgICAgICAgICAgY2FzZSBjX2R2X3B0cjogeworICAgICAgICAgICAgICAgIENPSUJVRkZFUiBkc3RfYnVmID0gTlVMTDsgLy8gYnVmZmVyIG9uIGhvc3QKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5vdXQgJiYgbV92YXJzW2ldLnNpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIENPSUVWRU5UICpldmVudCA9CisgICAgICAgICAgICAgICAgICAgICAgICAoaXNfYXN5bmMgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtX2luX2RlcHNfdG90YWwgPiAwIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUgPj0gX19vZmZsb2FkX3VzZV9hc3luY19idWZmZXJfcmVhZCkgPworICAgICAgICAgICAgICAgICAgICAgICAgJm1fb3V0X2RlcHNbbV9vdXRfZGVwc190b3RhbCsrXSA6IDA7CisKKyAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgZHN0X29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgKmJhc2UgPSBzdGF0aWNfY2FzdDxjaGFyKj4obV92YXJzW2ldLnB0cik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKFZBUl9UWVBFX0lTX1BUUihtX3ZhcnNbaV0udHlwZS5kc3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQdHJEYXRhICpwdHJfZGF0YSA9IG1fdmFyc1tpXS5pbnRvID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmRzdF9kYXRhIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2J1ZiA9IHB0cl9kYXRhID8gcHRyX2RhdGEtPmNwdV9idWYgOiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRzdF9idWYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgPSBtX3ZhcnNbaV0uaW50byA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzdGF0aWNfY2FzdDxjaGFyKio+KG1fdmFyc1tpXS5pbnRvKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzdGF0aWNfY2FzdDxjaGFyKio+KG1fdmFyc1tpXS5wdHIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZHN0X29mZnNldCA9IG1fdmFyc19leHRyYVtpXS5jcHVfb2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X2Rpc3A7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoVkFSX1RZUEVfSVNfU0NBTEFSKG1fdmFyc1tpXS50eXBlLmRzdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljX2RzdG4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfYnVmID0gbV92YXJzW2ldLmludG8gPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5kc3RfZGF0YS0+Y3B1X2J1ZiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhLT5jcHVfYnVmOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRzdF9idWYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgPSBvZmZsb2FkX2dldF9zcmNfYmFzZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmludG8gPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjaGFyKj4obV92YXJzW2ldLmludG8pIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2hhcio+KG1fdmFyc1tpXS5wdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0udHlwZS5kc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZHN0X29mZnNldCA9IG1fdmFyc19leHRyYVtpXS5jcHVfb2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X2Rpc3A7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoVkFSX1RZUEVfSVNfRFZfREFUQShtX3ZhcnNbaV0udHlwZS5kc3QpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBUl9UWVBFX0lTX0RWX0RBVEFfU0xJQ0UobV92YXJzW2ldLnR5cGUuZHN0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgUHRyRGF0YSAqcHRyX2RhdGEgPSBtX3ZhcnNbaV0uaW50byAhPSAwID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmRzdF9kYXRhIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2J1ZiA9IHB0cl9kYXRhICE9IDAgPyBwdHJfZGF0YS0+Y3B1X2J1ZiA6IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHN0X2J1ZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSA9IG9mZmxvYWRfZ2V0X3NyY19iYXNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uaW50byA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNoYXIqPihtX3ZhcnNbaV0uaW50bykgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjaGFyKj4obV92YXJzW2ldLnB0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS50eXBlLmRzdCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9vZmZzZXQgPSBtX3ZhcnNfZXh0cmFbaV0uY3B1X29mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmNwdV9kaXNwOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5pc19ub25jb250X3NyYyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX25vbmNvbnRfZHN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlX25vbmNvbnRpZ3VvdXNfcG9pbnRlcl9kYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGJhc2UsIGRzdF9idWYsIGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkc3RfYnVmICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IENPSTo6QnVmZmVyQ29weSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YS0+bWljX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3Rfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgKyBtX3ZhcnNbaV0uZGlzcCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhLT5hbGxvY19kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9DT1BZX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGVwc190b3RhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luX2RlcHNfdG90YWwgPiAwID8gbV9pbl9kZXBzIDogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX2NvcHksIHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBDT0k6OkJ1ZmZlclJlYWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhLT5taWNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgKyBtX3ZhcnNbaV0uZGlzcCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhLT5hbGxvY19kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgKyBkc3Rfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9DT1BZX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGVwc190b3RhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luX2RlcHNfdG90YWwgPiAwID8gbV9pbl9kZXBzIDogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX3JlYWQsIHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHRyX3JlY2VpdmVkICs9IG1fdmFyc1tpXS5zaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRlc3Ryb3kgYnVmZmVycyBmb3Igb2Jzb2xldGUgc3RhY2tzCisgICAgICAgIGlmIChtX2Rlc3Ryb3lfc3RhY2suc2l6ZSgpICE9IDApIHsKKyAgICAgICAgICAgIGZvciAoUHRyRGF0YUxpc3Q6Oml0ZXJhdG9yIGl0ID0gbV9kZXN0cm95X3N0YWNrLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gbV9kZXN0cm95X3N0YWNrLmVuZCgpOyBpdCsrKSB7CisgICAgICAgICAgICAgICAgUHRyRGF0YSAqcHRyX2RhdGEgPSAqaXQ7CisgICAgICAgICAgICAgICAgbV9kZXN0cm95X2J1ZmZlcnMucHVzaF9iYWNrKHB0cl9kYXRhLT5taWNfYnVmKTsKKyAgICAgICAgICAgICAgICBPRkZMT0FEX1RSQUNFKDMsICJSZW1vdmluZyBzdGFjayBidWZmZXIgd2l0aCBhZGRyICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5taWNfYWRkcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtX2Rlc3Ryb3lfc3RhY2suY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobV92YXJzW2ldLmZyZWVfaWYpIHsKKyAgICAgICAgICAgIC8vIHJlbW92ZSBhc3NvY2lhdGlvbiBmb3IgYXV0b21hdGljIHZhcmlhYmxlcworICAgICAgICAgICAgaWYgKG1faXNfb3Blbm1wICYmICFtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljICYmCisgICAgICAgICAgICAgICAgKG1fdmFyc1tpXS50eXBlLnNyYyA9PSBjX2RhdGEgfHwKKyAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnR5cGUuc3JjID09IGNfdm9pZF9wdHIgfHwKKyAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnR5cGUuc3JjID09IGNfY2Vhbl92YXIpKSB7CisgICAgICAgICAgICAgICAgQXV0b0RhdGEgKmF1dG9fZGF0YSA9IG1fdmFyc19leHRyYVtpXS5hdXRvX2RhdGE7CisgICAgICAgICAgICAgICAgaWYgKGF1dG9fZGF0YSAhPSAwICYmIGF1dG9fZGF0YS0+cmVtb3ZlX3JlZmVyZW5jZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbV9kZXZpY2UucmVtb3ZlX2F1dG9fZGF0YShhdXRvX2RhdGEtPmNwdV9hZGRyLnN0YXJ0KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gZGVzdHJveSBidWZmZXJzCisgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5vdXQgfHwgbV92YXJzW2ldLmludG8gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmICghVkFSX1RZUEVfSVNfUFRSKG1fdmFyc1tpXS50eXBlLnNyYykgJiYKKyAgICAgICAgICAgICAgICAgICAgIVZBUl9UWVBFX0lTX0RWX0RBVEFfU0xJQ0UobV92YXJzW2ldLnR5cGUuc3JjKSAmJgorICAgICAgICAgICAgICAgICAgICAhVkFSX1RZUEVfSVNfRFZfREFUQShtX3ZhcnNbaV0udHlwZS5zcmMpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFB0ckRhdGEgKnB0cl9kYXRhID0gbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhOworICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YS0+cmVtb3ZlX3JlZmVyZW5jZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZGVzdHJveSBidWZmZXJzCisgICAgICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YS0+Y3B1X2J1ZiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2Rlc3Ryb3lfYnVmZmVycy5wdXNoX2JhY2socHRyX2RhdGEtPmNwdV9idWYpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YS0+bWljX2J1ZiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2Rlc3Ryb3lfYnVmZmVycy5wdXNoX2JhY2socHRyX2RhdGEtPm1pY19idWYpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVFJBQ0UoMywgIlJlbW92aW5nIGFzc29jaWF0aW9uIGZvciBhZGRyICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5jcHVfYWRkci5zdGFydCgpKTsKKworICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgYXNzb2NpYXRpb24gZnJvbSBtYXAKKyAgICAgICAgICAgICAgICAgICAgbV9kZXZpY2UucmVtb3ZlX3B0cl9kYXRhKHB0cl9kYXRhLT5jcHVfYWRkci5zdGFydCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChWQVJfVFlQRV9JU19QVFIobV92YXJzW2ldLnR5cGUuZHN0KSB8fAorICAgICAgICAgICAgICAgICAgICAgVkFSX1RZUEVfSVNfRFZfREFUQV9TTElDRShtX3ZhcnNbaV0udHlwZS5kc3QpIHx8CisgICAgICAgICAgICAgICAgICAgICBWQVJfVFlQRV9JU19EVl9EQVRBKG1fdmFyc1tpXS50eXBlLmRzdCkpIHsKKyAgICAgICAgICAgICAgICBQdHJEYXRhICpwdHJfZGF0YSA9IG1fdmFyc19leHRyYVtpXS5kc3RfZGF0YTsKKyAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEtPnJlbW92ZV9yZWZlcmVuY2UoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGRlc3Ryb3kgYnVmZmVycworICAgICAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEtPmNwdV9idWYgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbV9kZXN0cm95X2J1ZmZlcnMucHVzaF9iYWNrKHB0cl9kYXRhLT5jcHVfYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEtPm1pY19idWYgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbV9kZXN0cm95X2J1ZmZlcnMucHVzaF9iYWNrKHB0cl9kYXRhLT5taWNfYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBPRkZMT0FEX1RSQUNFKDMsICJSZW1vdmluZyBhc3NvY2lhdGlvbiBmb3IgYWRkciAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YS0+Y3B1X2FkZHIuc3RhcnQoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGFzc29jaWF0aW9uIGZyb20gbWFwCisgICAgICAgICAgICAgICAgICAgIG1fZGV2aWNlLnJlbW92ZV9wdHJfZGF0YShwdHJfZGF0YS0+Y3B1X2FkZHIuc3RhcnQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1fc3RhdHVzKSB7CisgICAgICAgIG1fc3RhdHVzLT5kYXRhX3JlY2VpdmVkICs9IHB0cl9yZWNlaXZlZDsKKyAgICB9CisKKyAgICBPRkZMT0FEX1RJTUVSX0hPU1RfUkRBVEEoZ2V0X3RpbWVyX2RhdGEoKSwgcHRyX3JlY2VpdmVkKTsKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoMSwgR0VUX09GRkxPQURfTlVNQkVSKGdldF90aW1lcl9kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgY19vZmZsb2FkX3JlY2VpdmVkX3BvaW50ZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICJUb3RhbCBwb2ludGVyIGRhdGEgcmVjZWl2ZWQgZnJvbSB0YXJnZXQ6IFslbGxkXSBieXRlc1xuIiwKKyAgICAgICAgICAgICAgICAgIHB0cl9yZWNlaXZlZCk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBPZmZsb2FkRGVzY3JpcHRvcjo6c2NhdHRlcl9jb3B5b3V0X2RhdGEoKQoreworICAgIE9mZmxvYWRUaW1lciB0aW1lcihnZXRfdGltZXJfZGF0YSgpLCBjX29mZmxvYWRfaG9zdF9zY2F0dGVyX291dHB1dHMpOworCisgICAgaWYgKG1fbmVlZF9ydW5mdW5jdGlvbiAmJiBtX291dF9kYXRhbGVuID4gMCkgeworCisgICAgICAgIC8vIHRvdGFsIHNpemUgdGhhdCBuZWVkIHRvIGJlIHRyYW5zZmVycmVkIGZyb20gdGFyZ2V0IHRvIGhvc3QKKyAgICAgICAgQ09JTUFQSU5TVEFOQ0UgbWFwX2luc3Q7CisgICAgICAgIENPSVJFU1VMVCByZXM7CisgICAgICAgIGNoYXIgKmRhdGE7CisKKyAgICAgICAgLy8gb3V0cHV0IGRhdGEgYnVmZmVyCisgICAgICAgIGlmIChtX2Z1bmNfZGVzYy0+ZGF0YV9vZmZzZXQgPT0gMCkgeworICAgICAgICAgICAgT2ZmbG9hZFRpbWVyIHRpbWVyX21hcChnZXRfdGltZXJfZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX29mZmxvYWRfaG9zdF9tYXBfb3V0X2RhdGFfYnVmZmVyKTsKKworICAgICAgICAgICAgQ09JUkVTVUxUIHJlcyA9IENPSTo6QnVmZmVyTWFwKG1faW5vdXRfYnVmLCAwLCBtX291dF9kYXRhbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9NQVBfUkVBRF9PTkxZLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXBfaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkKio+KCZkYXRhKSk7CisgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX21hcCwgcmVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGRhdGEgPSAoY2hhciopIG1fZnVuY19kZXNjICsgbV9mdW5jX2Rlc2MtPmRhdGFfb2Zmc2V0OworICAgICAgICB9CisKKyAgICAgICAgLy8gZ2V0IHRpbWluZyBkYXRhCisgICAgICAgIE9GRkxPQURfVElNRVJfVEFSR0VUX0RBVEEoZ2V0X3RpbWVyX2RhdGEoKSwgZGF0YSk7CisgICAgICAgIGRhdGEgKz0gT0ZGTE9BRF9USU1FUl9EQVRBTEVOKCk7CisKKyAgICAgICAgLy8gaW5pdGlhbGl6ZSBvdXRwdXQgbWFyc2hhbGxlcgorICAgICAgICBtX291dC5pbml0X2J1ZmZlcihkYXRhLCBtX291dF9kYXRhbGVuKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fdmFyc190b3RhbDsgaSsrKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG1fdmFyc1tpXS50eXBlLnNyYykgeworICAgICAgICAgICAgICAgIGNhc2UgY19kYXRhX3B0cl9hcnJheToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBjX2RhdGE6CisgICAgICAgICAgICAgICAgY2FzZSBjX3ZvaWRfcHRyOgorICAgICAgICAgICAgICAgIGNhc2UgY19jZWFuX3ZhcjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24ub3V0ICYmCisgICAgICAgICAgICAgICAgICAgICAgICAhbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpYykgeworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmludG8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpwdHIgPSBvZmZsb2FkX2dldF9zcmNfYmFzZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2hhcio+KG1fdmFyc1tpXS5pbnRvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnR5cGUuZHN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX291dC5yZWNlaXZlX2RhdGEocHRyICsgbV92YXJzX2V4dHJhW2ldLmNwdV9kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX291dC5yZWNlaXZlX2RhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNoYXIqPihtX3ZhcnNbaV0ucHRyKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgY19mdW5jX3B0cjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24ub3V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX291dC5yZWNlaXZlX2Z1bmNfcHRyKChjb25zdCB2b2lkKiopIG1fdmFyc1tpXS5wdHIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobV9zdGF0dXMpIHsKKyAgICAgICAgICAgIG1fc3RhdHVzLT5kYXRhX3JlY2VpdmVkICs9IG1fb3V0LmdldF90ZnJfc2l6ZSgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1fZnVuY19kZXNjLT5kYXRhX29mZnNldCA9PSAwKSB7CisgICAgICAgICAgICBPZmZsb2FkVGltZXIgdGltZXJfdW5tYXAoZ2V0X3RpbWVyX2RhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX29mZmxvYWRfaG9zdF91bm1hcF9vdXRfZGF0YV9idWZmZXIpOworCisgICAgICAgICAgICBDT0lSRVNVTFQgcmVzID0gQ09JOjpCdWZmZXJVbm1hcChtYXBfaW5zdCwgMCwgMCwgMCk7CisgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX3VubWFwLCByZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgT0ZGTE9BRF9USU1FUl9IT1NUX1JEQVRBKGdldF90aW1lcl9kYXRhKCksIG1fb3V0LmdldF90ZnJfc2l6ZSgpKTsKKyAgICBPRkZMT0FEX1RSQUNFKDEsICJUb3RhbCBjb3B5b3V0IGRhdGEgcmVjZWl2ZWQgZnJvbSB0YXJnZXQ6IFslbGxkXSBieXRlc1xuIiwKKyAgICAgICAgICAgICAgICAgIG1fb3V0LmdldF90ZnJfc2l6ZSgpKTsKKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIGdldF9hcnJfZGVzY19udW1iZXJzKAorICAgIGNvbnN0IGFycl9kZXNjICphcCwKKyAgICBpbnQ2NF90IGVsX3NpemUsCisgICAgaW50NjRfdCAmb2Zmc2V0LAorICAgIGludDY0X3QgJnNpemUsCisgICAgaW50ICAgICAmZWxfbnVtYmVyLAorICAgIENlYW5SZWFkUmFuZ2VzKiAmcHRyX3JhbmdlcworKQoreworICAgIGlmIChpc19hcnJfZGVzY19jb250aWd1b3VzKGFwKSkgeworICAgICAgICBwdHJfcmFuZ2VzID0gTlVMTDsKKyAgICAgICAgX19hcnJfZGF0YV9vZmZzZXRfYW5kX2xlbmd0aChhcCwgb2Zmc2V0LCBzaXplKTsKKyAgICAgICAgZWxfbnVtYmVyID0gc2l6ZSAvIGVsX3NpemU7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBwdHJfcmFuZ2VzID0gaW5pdF9yZWFkX3Jhbmdlc19hcnJfZGVzYyhhcCk7CisgICAgICAgIGVsX251bWJlciA9IChwdHJfcmFuZ2VzLT5yYW5nZV9zaXplIC8gZWxfc2l6ZSkgKgorICAgICAgICAgICAgICAgICAgICBwdHJfcmFuZ2VzLT5yYW5nZV9tYXhfbnVtYmVyOworICAgICAgICBzaXplID0gcHRyX3Jhbmdlcy0+cmFuZ2Vfc2l6ZTsKKyAgICB9Cit9CisKK2Fycl9kZXNjICogbWFrZV9hcnJfZGVzYygKKyAgICB2b2lkKiAgIHB0cl92YWwsCisgICAgaW50NjRfdCBleHRlbnRfc3RhcnRfdmFsLAorICAgIGludDY0X3QgZXh0ZW50X2VsZW1lbnRzX3ZhbCwKKyAgICBpbnQ2NF90IHNpemUKKykKK3sKKyAgICBhcnJfZGVzYyAqcmVzOworICAgIHJlcyA9IChhcnJfZGVzYyAqKW1hbGxvYyhzaXplb2YoYXJyX2Rlc2MpKTsKKyAgICByZXMtPmJhc2UgPSByZWludGVycHJldF9jYXN0PGludDY0X3Q+KHB0cl92YWwpOworICAgIHJlcy0+cmFuayA9IDE7CisgICAgcmVzLT5kaW1bMF0uc2l6ZSA9IHNpemU7CisgICAgcmVzLT5kaW1bMF0ubGluZGV4ID0gMDsKKyAgICByZXMtPmRpbVswXS5sb3dlciA9IGV4dGVudF9zdGFydF92YWw7CisgICAgcmVzLT5kaW1bMF0udXBwZXIgPSBleHRlbnRfZWxlbWVudHNfdmFsICsgZXh0ZW50X3N0YXJ0X3ZhbCAtIDE7CisgICAgcmVzLT5kaW1bMF0uc3RyaWRlID0gMTsKKyAgICByZXR1cm4gcmVzOworfQorCitib29sIE9mZmxvYWREZXNjcmlwdG9yOjpnZW5fdmFyX2Rlc2NzX2Zvcl9wb2ludGVyX2FycmF5KGludCBpKQoreworICAgIGludCAgICAgICAgICAgICBwb2ludGVyc19udW1iZXI7CisgICAgaW50ICAgICAgICAgICAgIHRtcF92YWw7CisgICAgaW50ICAgICAgICAgICAgIG5ld19pbmRleCA9IG1fdmFyc190b3RhbDsKKyAgICBjb25zdCBhcnJfZGVzYyAqYXA7CisgICAgY29uc3QgVmFyRGVzYzMgKnZkMyA9IHN0YXRpY19jYXN0PGNvbnN0IFZhckRlc2MzKj4obV92YXJzW2ldLnB0cik7CisgICAgaW50ICAgICAgICAgICAgIGZsYWdzID0gdmQzLT5hcnJheV9maWVsZHM7CisgICAgYm9vbCAgICAgICAgICAgIHNyY19pc19mb3JfbWljID0gKG1fdmFyc1tpXS5kaXJlY3Rpb24ub3V0IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5pbnRvID09IE5VTEwpOworCisgICAgUmVhZEFyckVsZW1lbnRzPHZvaWQgKj4gIHB0cjsKKyAgICBSZWFkQXJyRWxlbWVudHM8dm9pZCAqPiAgaW50bzsKKyAgICBSZWFkQXJyRWxlbWVudHM8aW50NjRfdD4gZXh0X3N0YXJ0OworICAgIFJlYWRBcnJFbGVtZW50czxpbnQ2NF90PiBleHRfZWxlbWVudHM7CisgICAgUmVhZEFyckVsZW1lbnRzPGludDY0X3Q+IGFsaWduOworICAgIFJlYWRBcnJFbGVtZW50czxpbnQ2NF90PiBhbGxvY19pZjsKKyAgICBSZWFkQXJyRWxlbWVudHM8aW50NjRfdD4gZnJlZV9pZjsKKyAgICBSZWFkQXJyRWxlbWVudHM8aW50NjRfdD4gaW50b19zdGFydDsKKyAgICBSZWFkQXJyRWxlbWVudHM8aW50NjRfdD4gaW50b19lbGVtOworICAgIFJlYWRBcnJFbGVtZW50czxpbnQ2NF90PiBhbGxvY19zdGFydDsKKyAgICBSZWFkQXJyRWxlbWVudHM8aW50NjRfdD4gYWxsb2NfZWxlbTsKKworCisgICAgYXAgPSBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KHZkMy0+cHRyX2FycmF5KTsKKworICAgIC8vICJwb2ludGVyc19udW1iZXIiIGZvciB0b3RhbCBudW1iZXIgb2YgdHJhbnNmZXJyZWQgcG9pbnRlcnMuCisgICAgLy8gRm9yIGVhY2ggb2YgdGhlbSB3ZSBjcmVhdGUgbmV3IHZhcl9kZXNjIGFuZCBwdXQgaXQgYXQgdGhlIGJvdHRvbQorICAgIC8vIG9mIHRoZSB2YXJfZGVzYydzIGFycmF5CisgICAgZ2V0X2Fycl9kZXNjX251bWJlcnMoYXAsIHNpemVvZih2b2lkICopLCBwdHIub2Zmc2V0LCBwdHIuc2l6ZSwKKyAgICAgICAgcG9pbnRlcnNfbnVtYmVyLCBwdHIucmFuZ2VzKTsKKyAgICBwdHIuYmFzZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGFwLT5iYXNlKTsKKworICAgIC8vIDIuIHByZXBhcmUgbWVtb3J5IGZvciBuZXcgdmFyX2Rlc2NzCisgICAgbV92YXJzX3RvdGFsICs9IHBvaW50ZXJzX251bWJlcjsKKyAgICBtX3ZhcnMgICAgICAgPSAoVmFyRGVzYyopcmVhbGxvYyhtX3ZhcnMsIG1fdmFyc190b3RhbCAqIHNpemVvZihWYXJEZXNjKSk7CisgICAgbV92YXJzX2V4dHJhID0KKyAgICAgICAgKFZhckV4dHJhKilyZWFsbG9jKG1fdmFyc19leHRyYSwgbV92YXJzX3RvdGFsICogc2l6ZW9mKFZhckV4dHJhKSk7CisgICAgbV9pbl9kZXBzICAgID0KKyAgICAgICAgKENPSUVWRU5UKilyZWFsbG9jKG1faW5fZGVwcywgc2l6ZW9mKENPSUVWRU5UKSAqIChtX3ZhcnNfdG90YWwgKyAxKSk7CisgICAgbV9vdXRfZGVwcyAgID0KKyAgICAgICAgKENPSUVWRU5UKilyZWFsbG9jKG1fb3V0X2RlcHMsIHNpemVvZihDT0lFVkVOVCkgKiBtX3ZhcnNfdG90YWwpOworCisgICAgLy8gMy4gUHJlcGFyZSBmb3IgcmVhZGluZyBuZXcgdmFyX2Rlc2MncyBmaWVsZHMKKyAgICAvLyAgICBFWFRFTlQgU1RBUlQKKyAgICBpZiAoKGZsYWdzICYgKDE8PGZsYWdfZXh0ZW50X3N0YXJ0X2lzX2FycmF5KSkgIT0gMCkgeworICAgICAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4odmQzLT5leHRlbnRfc3RhcnQpOworICAgICAgICBnZXRfYXJyX2Rlc2NfbnVtYmVycyhhcCwgYXAtPmRpbVthcC0+cmFuayAtIDFdLnNpemUsIGV4dF9zdGFydC5vZmZzZXQsCisgICAgICAgICAgICBleHRfc3RhcnQuc2l6ZSwgdG1wX3ZhbCwgZXh0X3N0YXJ0LnJhbmdlcyk7CisgICAgICAgIGV4dF9zdGFydC5iYXNlID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYXAtPmJhc2UpOworICAgICAgICBleHRfc3RhcnQuZWxfc2l6ZSA9IGFwLT5kaW1bYXAtPnJhbmsgLSAxXS5zaXplOworCisgICAgICAgIGlmICh0bXBfdmFsIDwgcG9pbnRlcnNfbnVtYmVyKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwgImV4dGVudCBzdGFydCIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKChmbGFncyAmICgxPDxmbGFnX2V4dGVudF9zdGFydF9pc19zY2FsYXIpKSAhPSAwKSB7CisgICAgICAgIGV4dF9zdGFydC52YWwgPSAoaW50NjRfdCl2ZDMtPmV4dGVudF9zdGFydDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGV4dF9zdGFydC52YWwgPSAwOworICAgIH0KKworICAgIC8vICAgIEVYVEVOVCBFTEVNRU5UUyBOVU1CRVIKKyAgICBpZiAoKGZsYWdzICYgKDE8PGZsYWdfZXh0ZW50X2VsZW1lbnRzX2lzX2FycmF5KSkgIT0gMCkgeworICAgICAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4odmQzLT5leHRlbnRfZWxlbWVudHMpOworICAgICAgICBnZXRfYXJyX2Rlc2NfbnVtYmVycyhhcCwgYXAtPmRpbVthcC0+cmFuayAtIDFdLnNpemUsCisgICAgICAgICAgICBleHRfZWxlbWVudHMub2Zmc2V0LCBleHRfZWxlbWVudHMuc2l6ZSwKKyAgICAgICAgICAgIHRtcF92YWwsIGV4dF9lbGVtZW50cy5yYW5nZXMpOworICAgICAgICBleHRfZWxlbWVudHMuYmFzZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGFwLT5iYXNlKTsKKyAgICAgICAgZXh0X2VsZW1lbnRzLmVsX3NpemUgPSBhcC0+ZGltW2FwLT5yYW5rIC0gMV0uc2l6ZTsKKworICAgICAgICBpZiAodG1wX3ZhbCA8IHBvaW50ZXJzX251bWJlcikgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3BvaW50ZXJfYXJyYXlfbWlzbWF0Y2gsICJleHRlbnQgZWxlbWVudHMiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICgoZmxhZ3MgJiAoMTw8ZmxhZ19leHRlbnRfZWxlbWVudHNfaXNfc2NhbGFyKSkgIT0gMCkgeworICAgICAgICBleHRfZWxlbWVudHMudmFsID0gKGludDY0X3QpdmQzLT5leHRlbnRfZWxlbWVudHM7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBleHRfZWxlbWVudHMudmFsID0gbV92YXJzW2ldLmNvdW50OworICAgIH0KKworICAgIC8vICAgIEFMTE9DX0lGCisgICAgaWYgKChmbGFncyAmICgxPDxmbGFnX2FsbG9jX2lmX2lzX2FycmF5KSkgIT0gMCkgeworICAgICAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4odmQzLT5hbGxvY19pZl9hcnJheSk7CisgICAgICAgIGdldF9hcnJfZGVzY19udW1iZXJzKGFwLCBhcC0+ZGltW2FwLT5yYW5rIC0gMV0uc2l6ZSwgYWxsb2NfaWYub2Zmc2V0LAorICAgICAgICAgICAgYWxsb2NfaWYuc2l6ZSwgdG1wX3ZhbCwgYWxsb2NfaWYucmFuZ2VzKTsKKyAgICAgICAgYWxsb2NfaWYuYmFzZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGFwLT5iYXNlKTsKKyAgICAgICAgYWxsb2NfaWYuZWxfc2l6ZSA9IGFwLT5kaW1bYXAtPnJhbmsgLSAxXS5zaXplOworCisgICAgICAgIGlmICh0bXBfdmFsIDwgcG9pbnRlcnNfbnVtYmVyKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwgImFsbG9jX2lmIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGFsbG9jX2lmLnZhbCA9IG1fdmFyc1tpXS5jb3VudDsKKyAgICB9CisKKyAgICAvLyAgICBGUkVFX0lGCisgICAgaWYgKChmbGFncyAmICgxPDxmbGFnX2ZyZWVfaWZfaXNfYXJyYXkpKSAhPSAwKSB7CisgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPih2ZDMtPmZyZWVfaWZfYXJyYXkpOworICAgICAgICBnZXRfYXJyX2Rlc2NfbnVtYmVycyhhcCwgYXAtPmRpbVthcC0+cmFuayAtIDFdLnNpemUsIGZyZWVfaWYub2Zmc2V0LAorICAgICAgICAgICAgZnJlZV9pZi5zaXplLCB0bXBfdmFsLCBmcmVlX2lmLnJhbmdlcyk7CisgICAgICAgIGZyZWVfaWYuYmFzZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGFwLT5iYXNlKTsKKyAgICAgICAgZnJlZV9pZi5lbF9zaXplID0gYXAtPmRpbVthcC0+cmFuayAtIDFdLnNpemU7CisKKyAgICAgICAgaWYgKHRtcF92YWwgPCBwb2ludGVyc19udW1iZXIpIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19wb2ludGVyX2FycmF5X21pc21hdGNoLCAiZnJlZV9pZiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBmcmVlX2lmLnZhbCA9IG1fdmFyc1tpXS5jb3VudDsKKyAgICB9CisKKyAgICAvLyAgICBBTElHTgorCisgICAgaWYgKChmbGFncyAmICgxPDxmbGFnX2FsaWduX2lzX2FycmF5KSkgIT0gMCkgeworICAgICAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4odmQzLT5hbGlnbl9hcnJheSk7CisgICAgICAgIGdldF9hcnJfZGVzY19udW1iZXJzKGFwLCBhcC0+ZGltW2FwLT5yYW5rIC0gMV0uc2l6ZSwgYWxpZ24ub2Zmc2V0LAorICAgICAgICAgICAgYWxpZ24uc2l6ZSwgdG1wX3ZhbCwgYWxpZ24ucmFuZ2VzKTsKKyAgICAgICAgYWxpZ24uYmFzZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGFwLT5iYXNlKTsKKyAgICAgICAgYWxpZ24uZWxfc2l6ZSA9IGFwLT5kaW1bYXAtPnJhbmsgLSAxXS5zaXplOworCisgICAgICAgIGlmICh0bXBfdmFsIDwgcG9pbnRlcnNfbnVtYmVyKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwgImFsaWduIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGFsaWduLnZhbCA9IG1fdmFyc1tpXS5hbGlnbjsKKyAgICB9CisKKyAgICAvLyAzLjEgSU5UTworCisgICAgaWYgKG1fdmFyc1tpXS5pbnRvKSB7CisgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPihtX3ZhcnNbaV0uaW50byk7CisgICAgICAgIGdldF9hcnJfZGVzY19udW1iZXJzKGFwLCBhcC0+ZGltW2FwLT5yYW5rIC0gMV0uc2l6ZSwgaW50by5vZmZzZXQsCisgICAgICAgICAgICBpbnRvLnNpemUsIHRtcF92YWwsIGludG8ucmFuZ2VzKTsKKyAgICAgICAgaW50by5iYXNlID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYXAtPmJhc2UpOworCisgICAgICAgIGlmICh0bXBfdmFsIDwgcG9pbnRlcnNfbnVtYmVyKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwgImludG8iKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIDMuMiBJTlRPX1NUQVJUCisKKyAgICBpZiAoKGZsYWdzICYgKDE8PGZsYWdfaW50b19zdGFydF9pc19hcnJheSkpICE9IDApIHsKKyAgICAgICAgYXAgPSBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KHZkMy0+aW50b19zdGFydCk7CisgICAgICAgIGdldF9hcnJfZGVzY19udW1iZXJzKGFwLCBhcC0+ZGltW2FwLT5yYW5rIC0gMV0uc2l6ZSwgaW50b19zdGFydC5vZmZzZXQsCisgICAgICAgICAgICBpbnRvX3N0YXJ0LnNpemUsIHRtcF92YWwsIGludG9fc3RhcnQucmFuZ2VzKTsKKyAgICAgICAgaW50b19zdGFydC5iYXNlID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYXAtPmJhc2UpOworICAgICAgICBpbnRvX3N0YXJ0LmVsX3NpemUgPSBhcC0+ZGltW2FwLT5yYW5rIC0gMV0uc2l6ZTsKKworICAgICAgICBpZiAodG1wX3ZhbCA8IHBvaW50ZXJzX251bWJlcikgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3BvaW50ZXJfYXJyYXlfbWlzbWF0Y2gsICJpbnRvX2V4dGVudCBzdGFydCIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKChmbGFncyAmICgxPDxmbGFnX2ludG9fc3RhcnRfaXNfc2NhbGFyKSkgIT0gMCkgeworICAgICAgICBpbnRvX3N0YXJ0LnZhbCA9IChpbnQ2NF90KXZkMy0+aW50b19zdGFydDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGludG9fc3RhcnQudmFsID0gMDsKKyAgICB9CisKKyAgICAvLyAzLjMgSU5UT19FTEVNRU5UUworCisgICAgaWYgKChmbGFncyAmICgxPDxmbGFnX2ludG9fZWxlbWVudHNfaXNfYXJyYXkpKSAhPSAwKSB7CisgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPih2ZDMtPmludG9fZWxlbWVudHMpOworICAgICAgICBnZXRfYXJyX2Rlc2NfbnVtYmVycyhhcCwgYXAtPmRpbVthcC0+cmFuayAtIDFdLnNpemUsIGludG9fZWxlbS5vZmZzZXQsCisgICAgICAgICAgICBpbnRvX2VsZW0uc2l6ZSwgdG1wX3ZhbCwgaW50b19lbGVtLnJhbmdlcyk7CisgICAgICAgIGludG9fZWxlbS5iYXNlID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYXAtPmJhc2UpOworICAgICAgICBpbnRvX2VsZW0uZWxfc2l6ZSA9IGFwLT5kaW1bYXAtPnJhbmsgLSAxXS5zaXplOworCisgICAgICAgIGlmICh0bXBfdmFsIDwgcG9pbnRlcnNfbnVtYmVyKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwgImludG9fZXh0ZW50IGVsZW1lbnRzIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoKGZsYWdzICYgKDE8PGZsYWdfaW50b19lbGVtZW50c19pc19zY2FsYXIpKSAhPSAwKSB7CisgICAgICAgIGludG9fZWxlbS52YWwgPSAoaW50NjRfdCl2ZDMtPmludG9fZWxlbWVudHM7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpbnRvX2VsZW0udmFsID0gbV92YXJzW2ldLmNvdW50OworICAgIH0KKworICAgIC8vICAgIGFsbG9jX3N0YXJ0CisKKyAgICBpZiAoKGZsYWdzICYgKDE8PGZsYWdfYWxsb2Nfc3RhcnRfaXNfYXJyYXkpKSAhPSAwKSB7CisgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPih2ZDMtPmFsbG9jX3N0YXJ0KTsKKyAgICAgICAgZ2V0X2Fycl9kZXNjX251bWJlcnMoYXAsIGFwLT5kaW1bYXAtPnJhbmsgLSAxXS5zaXplLAorICAgICAgICAgICAgYWxsb2Nfc3RhcnQub2Zmc2V0LCBhbGxvY19zdGFydC5zaXplLCB0bXBfdmFsLAorICAgICAgICAgICAgYWxsb2Nfc3RhcnQucmFuZ2VzKTsKKyAgICAgICAgYWxsb2Nfc3RhcnQuYmFzZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGFwLT5iYXNlKTsKKyAgICAgICAgYWxsb2Nfc3RhcnQuZWxfc2l6ZSA9IGFwLT5kaW1bYXAtPnJhbmsgLSAxXS5zaXplOworCisgICAgICAgIGlmICh0bXBfdmFsIDwgcG9pbnRlcnNfbnVtYmVyKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwgImFsbG9jX2V4dGVudCBzdGFydCIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKChmbGFncyAmICgxPDxmbGFnX2FsbG9jX3N0YXJ0X2lzX3NjYWxhcikpICE9IDApIHsKKyAgICAgICAgYWxsb2Nfc3RhcnQudmFsID0gKGludDY0X3QpdmQzLT5hbGxvY19zdGFydDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGFsbG9jX3N0YXJ0LnZhbCA9IDA7CisgICAgfQorCisgICAgLy8gICAgYWxsb2NfZWxlbQorCisgICAgaWYgKChmbGFncyAmICgxPDxmbGFnX2FsbG9jX2VsZW1lbnRzX2lzX2FycmF5KSkgIT0gMCkgeworICAgICAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4odmQzLT5hbGxvY19lbGVtZW50cyk7CisgICAgICAgIGdldF9hcnJfZGVzY19udW1iZXJzKGFwLCBhcC0+ZGltW2FwLT5yYW5rIC0gMV0uc2l6ZSwgYWxsb2NfZWxlbS5vZmZzZXQsCisgICAgICAgICAgICBhbGxvY19lbGVtLnNpemUsIHRtcF92YWwsIGFsbG9jX2VsZW0ucmFuZ2VzKTsKKyAgICAgICAgYWxsb2NfZWxlbS5iYXNlID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYXAtPmJhc2UpOworICAgICAgICBhbGxvY19lbGVtLmVsX3NpemUgPSBhcC0+ZGltW2FwLT5yYW5rIC0gMV0uc2l6ZTsKKyAgICAgICAgaWYgKHRtcF92YWwgPCBwb2ludGVyc19udW1iZXIpIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19wb2ludGVyX2FycmF5X21pc21hdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWxsb2NfZXh0ZW50IGVsZW1lbnRzIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoKGZsYWdzICYgKDE8PGZsYWdfYWxsb2NfZWxlbWVudHNfaXNfc2NhbGFyKSkgIT0gMCkgeworICAgICAgICBhbGxvY19lbGVtLnZhbCA9IChpbnQ2NF90KXZkMy0+YWxsb2NfZWxlbWVudHM7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBhbGxvY19lbGVtLnZhbCA9IDA7CisgICAgfQorCisgICAgZm9yIChpbnQgayA9IDA7IGsgPCBwb2ludGVyc19udW1iZXI7IGsrKykgeworICAgICAgICBpbnQgdHlwZSA9IGZsYWdzICYgMHgzZjsKKyAgICAgICAgaW50IHR5cGVfc3JjLCB0eXBlX2RzdDsKKyAgICAgICAgLy8gIEdldCBuZXcgdmFsdWVzCisgICAgICAgIC8vIHR5cGVfc3JjLCB0eXBlX2RzdAorICAgICAgICB0eXBlX3NyYyA9IHR5cGVfZHN0ID0gKHR5cGUgPT0gY19kYXRhX3B0cl9hcnJheSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19kYXRhX3B0ciAgIDogKHR5cGUgPT0gY19mdW5jX3B0cl9hcnJheSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19mdW5jX3B0ciAgIDogKHR5cGUgPT0gY192b2lkX3B0cl9hcnJheSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY192b2lkX3B0ciAgIDogKHR5cGUgPT0gY19zdHJpbmdfcHRyX2FycmF5KSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX3N0cmluZ19wdHIgOiAwOworCisgICAgICAgIC8vIEdldCBwdHIgdmFsCisgICAgICAgIGlmICghcHRyLnJlYWRfbmV4dCh0cnVlKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBwdHIudmFsID0gKHZvaWQqKShwdHIuYmFzZSArIHB0ci5vZmZzZXQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gISEhIElmIHdlIGdvdCBlcnJvciBhdCBwaGFzZSBvZiByZWFkaW5nIC0gaXQncyBhbiBpbnRlcm5hbAorICAgICAgICAvLyAhISEgZXJyb3IsIGFzIHdlIG11c3QgZGV0ZWN0IG1pc21hdGNoIGJlZm9yZQorCisgICAgICAgIC8vIEdldCBpbnRvIHZhbAorICAgICAgICBpZiAobV92YXJzW2ldLmludG8pIHsKKyAgICAgICAgICAgIGlmICghaW50by5yZWFkX25leHQodHJ1ZSkpIHsKKyAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwgImludG8iKTsKKyAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0FCT1JUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaW50by52YWwgPSAodm9pZCopKGludG8uYmFzZSArIGludG8ub2Zmc2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEdldCBvdGhlciBjb21wb25lbnRzIG9mIHRoZSBjbGF1c2UKKyAgICAgICAgaWYgKCFleHRfc3RhcnQucmVhZF9uZXh0KGZsYWdzICYgKDE8PGZsYWdfZXh0ZW50X3N0YXJ0X2lzX2FycmF5KSkpIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19wb2ludGVyX2FycmF5X21pc21hdGNoLCAiZXh0ZW50IHN0YXJ0Iik7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0FCT1JUOworICAgICAgICB9CisgICAgICAgIGlmICghZXh0X2VsZW1lbnRzLnJlYWRfbmV4dCgKKyAgICAgICAgICAgICAgICBmbGFncyAmICgxPDxmbGFnX2V4dGVudF9lbGVtZW50c19pc19hcnJheSkpKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwgImV4dGVudCBlbGVtZW50cyIpOworICAgICAgICAgICAgTElCT0ZGTE9BRF9BQk9SVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWFsbG9jX2lmLnJlYWRfbmV4dChmbGFncyAmICgxPDxmbGFnX2FsbG9jX2lmX2lzX2FycmF5KSkpIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19wb2ludGVyX2FycmF5X21pc21hdGNoLCAiYWxsb2NfaWYiKTsKKyAgICAgICAgICAgIExJQk9GRkxPQURfQUJPUlQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmcmVlX2lmLnJlYWRfbmV4dChmbGFncyAmICgxPDxmbGFnX2ZyZWVfaWZfaXNfYXJyYXkpKSkgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3BvaW50ZXJfYXJyYXlfbWlzbWF0Y2gsICJmcmVlX2lmIik7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0FCT1JUOworICAgICAgICB9CisgICAgICAgIGlmICghYWxpZ24ucmVhZF9uZXh0KGZsYWdzICYgKDE8PGZsYWdfYWxpZ25faXNfYXJyYXkpKSkgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3BvaW50ZXJfYXJyYXlfbWlzbWF0Y2gsICJhbGlnbiIpOworICAgICAgICAgICAgTElCT0ZGTE9BRF9BQk9SVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWludG9fc3RhcnQucmVhZF9uZXh0KGZsYWdzICYgKDE8PGZsYWdfaW50b19zdGFydF9pc19hcnJheSkpKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwgImludG9fZXh0ZW50IHN0YXJ0Iik7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0FCT1JUOworICAgICAgICB9CisgICAgICAgIGlmICghaW50b19lbGVtLnJlYWRfbmV4dChmbGFncyAmICgxPDxmbGFnX2ludG9fZWxlbWVudHNfaXNfYXJyYXkpKSkgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3BvaW50ZXJfYXJyYXlfbWlzbWF0Y2gsICJpbnRvX2V4dGVudCBlbGVtZW50cyIpOworICAgICAgICAgICAgTElCT0ZGTE9BRF9BQk9SVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWFsbG9jX3N0YXJ0LnJlYWRfbmV4dChmbGFncyAmICgxPDxmbGFnX2FsbG9jX3N0YXJ0X2lzX2FycmF5KSkpIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19wb2ludGVyX2FycmF5X21pc21hdGNoLCAiYWxsb2NfZXh0ZW50IHN0YXJ0Iik7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0FCT1JUOworICAgICAgICB9CisgICAgICAgIGlmICghYWxsb2NfZWxlbS5yZWFkX25leHQoCisgICAgICAgICAgICAgICAgIGZsYWdzICYgKDE8PGZsYWdfYWxsb2NfZWxlbWVudHNfaXNfYXJyYXkpKSkgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3BvaW50ZXJfYXJyYXlfbWlzbWF0Y2gsICJhbGxvY19leHRlbnQgZWxlbWVudHMiKTsKKyAgICAgICAgICAgIExJQk9GRkxPQURfQUJPUlQ7CisgICAgICAgIH0KKworICAgICAgICBtX3ZhcnNbbmV3X2luZGV4ICsga10uZGlyZWN0aW9uLmJpdHMgPSBtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHM7CisgICAgICAgIG1fdmFyc1tuZXdfaW5kZXggKyBrXS5hbGxvY19pZiA9IGFsbG9jX2lmLnZhbDsKKyAgICAgICAgbV92YXJzW25ld19pbmRleCArIGtdLmZyZWVfaWYgPSBmcmVlX2lmLnZhbDsKKyAgICAgICAgbV92YXJzW25ld19pbmRleCArIGtdLmFsaWduID0gYWxpZ24udmFsOworICAgICAgICBtX3ZhcnNbbmV3X2luZGV4ICsga10ubWljX29mZnNldCA9IDA7CisgICAgICAgIG1fdmFyc1tuZXdfaW5kZXggKyBrXS5mbGFncy5iaXRzID0gbV92YXJzW2ldLmZsYWdzLmJpdHM7CisgICAgICAgIG1fdmFyc1tuZXdfaW5kZXggKyBrXS5vZmZzZXQgPSAwOworICAgICAgICBtX3ZhcnNbbmV3X2luZGV4ICsga10uc2l6ZSA9IG1fdmFyc1tpXS5zaXplOworCisgICAgICAgIGlmIChleHRfc3RhcnQudmFsID09IDApIHsKKyAgICAgICAgICAgIG1fdmFyc1tuZXdfaW5kZXggKyBrXS5jb3VudCA9IGV4dF9lbGVtZW50cy52YWw7CisgICAgICAgICAgICBtX3ZhcnNbbmV3X2luZGV4ICsga10ucHRyID0gcHRyLnZhbDsKKyAgICAgICAgICAgIGlmICh0eXBlX3NyYyA9PSBjX3N0cmluZ19wdHIpIHsKKyAgICAgICAgICAgICAgICBtX3ZhcnNbbmV3X2luZGV4ICsga10uc2l6ZSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBtX3ZhcnNbbmV3X2luZGV4ICsga10uY291bnQgPSAwOworICAgICAgICAgICAgbV92YXJzW25ld19pbmRleCArIGtdLnB0ciA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dm9pZCo+KG1ha2VfYXJyX2Rlc2MoCisgICAgICAgICAgICAgICAgcHRyLnZhbCwKKyAgICAgICAgICAgICAgICBleHRfc3RhcnQudmFsLAorICAgICAgICAgICAgICAgIGV4dF9lbGVtZW50cy52YWwsCisgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUpKTsKKworICAgICAgICAgICAgdHlwZV9zcmMgPSB0eXBlX3NyYyA9PSBjX2RhdGFfcHRyID8gY19jZWFuX3Zhcl9wdHIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX3N0cmluZ19wdHIgPyBjX2NlYW5fdmFyX3B0ciA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfc3JjOworICAgICAgICAgICAgaWYgKCFtX3ZhcnNbaV0uaW50bykgeworICAgICAgICAgICAgICAgIHR5cGVfZHN0ID0gdHlwZV9zcmM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobV92YXJzW2ldLmludG8gJiYgaW50b19lbGVtLnZhbCAhPSAwKSB7CisgICAgICAgICAgICBtX3ZhcnNbbmV3X2luZGV4ICsga10uaW50byA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dm9pZCo+KG1ha2VfYXJyX2Rlc2MoCisgICAgICAgICAgICAgICAgaW50by52YWwsCisgICAgICAgICAgICAgICAgaW50b19zdGFydC52YWwsCisgICAgICAgICAgICAgICAgaW50b19lbGVtLnZhbCwKKyAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSkpOworICAgICAgICAgICAgdHlwZV9kc3QgPSAodHlwZSA9PSBjX2RhdGFfcHRyX2FycmF5KSA/IGNfY2Vhbl92YXJfcHRyIDoKKyAgICAgICAgICAgICAgICAgICAgICAgKHR5cGUgPT0gY19zdHJpbmdfcHRyX2FycmF5KSA/IGNfY2Vhbl92YXJfcHRyIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfc3JjOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbV92YXJzW25ld19pbmRleCArIGtdLmludG8gPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGFsbG9jX2VsZW0udmFsICE9IDApIHsKKyAgICAgICAgICAgIG1fdmFyc1tuZXdfaW5kZXggKyBrXS5hbGxvYyA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dm9pZCo+KG1ha2VfYXJyX2Rlc2MoCisgICAgICAgICAgICAgICAgcHRyLnZhbCwKKyAgICAgICAgICAgICAgICBhbGxvY19zdGFydC52YWwsCisgICAgICAgICAgICAgICAgYWxsb2NfZWxlbS52YWwsCisgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG1fdmFyc1tuZXdfaW5kZXggKyBrXS5hbGxvYyA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBtX3ZhcnNbbmV3X2luZGV4ICsga10udHlwZS5zcmMgPSB0eXBlX3NyYzsKKyAgICAgICAgbV92YXJzW25ld19pbmRleCArIGtdLnR5cGUuZHN0ID0gdHlwZV9kc3Q7CisKKyAgICAgICAgbV92YXJzX2V4dHJhW25ld19pbmRleCArIGtdLmlzX2Fycl9wdHJfZWwgPSAxOworICAgICAgICBtX3ZhcnNfZXh0cmFbbmV3X2luZGV4ICsga10ucHRyX2Fycl9vZmZzZXQgPQorICAgICAgICAgICAgc3JjX2lzX2Zvcl9taWMgPyBwdHIub2Zmc2V0IDogaW50by5vZmZzZXQ7CisgICAgfQorICAgIC8vIGNvdW50IGFuZCBhbGxvYyBmaWVsZHMgYXJlIHVzZWxlc3MgYXQgdGFyZ2V0LiBUaGV5IGNhbiBiZSByZXVzZWQKKyAgICAvLyBmb3IgcG9pbnRlciBhcnJheXMuCisgICAgbV92YXJzW2ldLmNvdW50ID0gcG9pbnRlcnNfbnVtYmVyOworICAgIG1fdmFyc1tpXS5wdHJfYXJyX29mZnNldCA9IG5ld19pbmRleDsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgX19vZmZsb2FkX2ZpbmlfbGlicmFyeSh2b2lkKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkNsZWFudXAgb2ZmbG9hZCBsaWJyYXJ5IC4uLlxuIik7CisgICAgaWYgKG1pY19lbmdpbmVzX3RvdGFsID4gMCkgeworICAgICAgICBkZWxldGVbXSBtaWNfZW5naW5lczsKKworICAgICAgICBpZiAobWljX3Byb3h5X2ZzX3Jvb3QgIT0gMCkgeworICAgICAgICAgICAgZnJlZShtaWNfcHJveHlfZnNfcm9vdCk7CisgICAgICAgICAgICBtaWNfcHJveHlfZnNfcm9vdCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAobWljX2xpYnJhcnlfcGF0aCAhPSAwKSB7CisgICAgICAgICAgICBmcmVlKG1pY19saWJyYXJ5X3BhdGgpOworICAgICAgICAgICAgbWljX2xpYnJhcnlfcGF0aCA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvLyBkZXN0cm95IHRocmVhZCBrZXkKKyAgICAgICAgdGhyZWFkX2tleV9kZWxldGUobWljX3RocmVhZF9rZXkpOworICAgIH0KKworICAgIC8vIHVubG9hZCBDT0kgbGlicmFyeQorICAgIGlmIChDT0k6OmlzX2F2YWlsYWJsZSkgeworICAgICAgICBDT0k6OmZpbmkoKTsKKyAgICB9CisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJDbGVhbnVwIG9mZmxvYWQgbGlicmFyeSAuLi4gZG9uZVxuIik7Cit9CisKK3N0YXRpYyB2b2lkIF9fb2ZmbG9hZF9pbml0X2xpYnJhcnlfb25jZSh2b2lkKQoreworICAgIENPSVJFU1VMVCByZXM7CisgICAgdWludDMyX3QgbnVtX2RldmljZXM7CisgICAgc3RkOjpiaXRzZXQ8TUlDX0VOR0lORVNfTUFYPiBkZXZpY2VzOworCisgICAgcHJlZml4ID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9ob3N0KTsKKworICAgIC8vIGluaXRpYWxpemUgdHJhY2UKKyAgICBjb25zdCBjaGFyICplbnZfdmFyID0gZ2V0ZW52KGh0cmFjZV9lbnZuYW1lKTsKKyAgICBpZiAoZW52X3ZhciAhPSAwICYmICplbnZfdmFyICE9ICdcMCcpIHsKKyAgICAgICAgaW50NjRfdCBuZXdfdmFsOworICAgICAgICBpZiAoX19vZmZsb2FkX3BhcnNlX2ludF9zdHJpbmcoZW52X3ZhciwgbmV3X3ZhbCkpIHsKKyAgICAgICAgICAgIGNvbnNvbGVfZW5hYmxlZCA9IG5ld192YWwgJiAweDBmOworICAgICAgICB9CisgICAgfQorCisgICAgZW52X3ZhciA9IGdldGVudihvZmZsb2FkX3JlcG9ydF9lbnZuYW1lKTsKKyAgICBpZiAoZW52X3ZhciAhPSAwICYmICplbnZfdmFyICE9ICdcMCcpIHsKKyAgICAgICAgaW50NjRfdCBlbnZfdmFsOworICAgICAgICBpZiAoX19vZmZsb2FkX3BhcnNlX2ludF9zdHJpbmcoZW52X3ZhciwgZW52X3ZhbCkpIHsKKyAgICAgICAgICAgIGlmIChlbnZfdmFsID09IE9GRkxPQURfUkVQT1JUXzEgfHwKKyAgICAgICAgICAgICAgICBlbnZfdmFsID09IE9GRkxPQURfUkVQT1JUXzIgfHwKKyAgICAgICAgICAgICAgICBlbnZfdmFsID09IE9GRkxPQURfUkVQT1JUXzMpIHsKKyAgICAgICAgICAgICAgICBvZmZsb2FkX3JlcG9ydF9sZXZlbCA9IGVudl92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfaW52YWxpZF9lbnZfcmVwb3J0X3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmbG9hZF9yZXBvcnRfZW52bmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfaW52YWxpZF9lbnZfdmFyX2ludF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmbG9hZF9yZXBvcnRfZW52bmFtZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIW9mZmxvYWRfcmVwb3J0X2xldmVsKSB7CisgICAgICAgIGVudl92YXIgPSBnZXRlbnYodGltZXJfZW52bmFtZSk7CisgICAgICAgIGlmIChlbnZfdmFyICE9IDAgJiYgKmVudl92YXIgIT0gJ1wwJykgeworICAgICAgICAgICAgdGltZXJfZW5hYmxlZCA9IGF0b2koZW52X3Zhcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBpbml0aWFsaXplIENPSQorICAgIGlmICghQ09JOjppbml0KCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGdldCBudW1iZXIgb2YgZGV2aWNlcyBpbnN0YWxsZWQgaW4gdGhlIHN5c3RlbQorICAgIHJlcyA9IENPSTo6RW5naW5lR2V0Q291bnQoQ09JX0lTQV9LTkMsICZudW1fZGV2aWNlcyk7CisgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG51bV9kZXZpY2VzID4gTUlDX0VOR0lORVNfTUFYKSB7CisgICAgICAgIG51bV9kZXZpY2VzID0gTUlDX0VOR0lORVNfTUFYOworICAgIH0KKworICAgIC8vIGZpbGwgaW4gdGhlIGxpc3Qgb2YgZGV2aWNlcyB0aGF0IGNhbiBiZSB1c2VkIGZvciBvZmZsb2FkaW5nCisgICAgZW52X3ZhciA9IGdldGVudigiT0ZGTE9BRF9ERVZJQ0VTIik7CisgICAgaWYgKGVudl92YXIgIT0gMCkgeworICAgICAgICBpZiAoc3RyY2FzZWNtcChlbnZfdmFyLCAibm9uZSIpICE9IDApIHsKKyAgICAgICAgICAgIC8vIHZhbHVlIGlzIGNvbXBvc2VkIG9mIGNvbW1hIHNlcGFyYXRlZCBwaHlzaWNhbCBkZXZpY2UgaW5kZXhlcworICAgICAgICAgICAgY2hhciAqYnVmID0gc3RyZHVwKGVudl92YXIpOworICAgICAgICAgICAgY2hhciAqc3RyLCAqcHRyOworICAgICAgICAgICAgZm9yIChzdHIgPSBzdHJ0b2tfcihidWYsICIsIiwgJnB0cik7IHN0ciAhPSAwOworICAgICAgICAgICAgICAgICBzdHIgPSBzdHJ0b2tfcigwLCAiLCIsICZwdHIpKSB7CisgICAgICAgICAgICAgICAgLy8gY29udmVydCBzdHJpbmcgdG8gYW4gaW50CisgICAgICAgICAgICAgICAgaW50NjRfdCBudW07CisgICAgICAgICAgICAgICAgaWYgKCFfX29mZmxvYWRfcGFyc2VfaW50X3N0cmluZyhzdHIsIG51bSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX21pY19pbml0NSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZmFsbGJhY2sgdG8gdXNpbmcgYWxsIGluc3RhbGxlZCBkZXZpY2VzCisgICAgICAgICAgICAgICAgICAgIGRldmljZXMucmVzZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fZGV2aWNlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VzLnNldChpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG51bSA8IDAgfHwgbnVtID49IG51bV9kZXZpY2VzKSB7CisgICAgICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19taWNfaW5pdDYsIG51bSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZXZpY2VzLnNldChudW0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJlZShidWYpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvLyB1c2UgYWxsIGF2YWlsYWJsZSBkZXZpY2VzCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2RldmljZXM7IGkrKykgeworICAgICAgICAgICAgQ09JRU5HSU5FIGVuZ2luZTsKKyAgICAgICAgICAgIHJlcyA9IENPSTo6RW5naW5lR2V0SGFuZGxlKENPSV9JU0FfS05DLCBpLCAmZW5naW5lKTsKKyAgICAgICAgICAgIGlmIChyZXMgPT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2VzLnNldChpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIG1pY19lbmdpbmVzX3RvdGFsID0gZGV2aWNlcy5jb3VudCgpOworCisgICAgLy8gbm8gbmVlZCB0byBjb250aW51ZSBpZiB0aGVyZSBhcmUgbm8gZGV2aWNlcyB0byBvZmZsb2FkIHRvCisgICAgaWYgKG1pY19lbmdpbmVzX3RvdGFsIDw9IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGluaXRpYWxpemUgaW5kZXhlcyBmb3IgYXZhaWxhYmxlIGRldmljZXMKKyAgICBtaWNfZW5naW5lcyA9IG5ldyBFbmdpbmVbbWljX2VuZ2luZXNfdG90YWxdOworICAgIGZvciAoaW50IHBfaWR4ID0gMCwgbF9pZHggPSAwOyBwX2lkeCA8IG51bV9kZXZpY2VzOyBwX2lkeCsrKSB7CisgICAgICAgIGlmIChkZXZpY2VzW3BfaWR4XSkgeworICAgICAgICAgICAgbWljX2VuZ2luZXNbbF9pZHhdLnNldF9pbmRleGVzKGxfaWR4LCBwX2lkeCk7CisgICAgICAgICAgICBsX2lkeCsrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gbGlicmFyeSBzZWFyY2ggcGF0aCBmb3IgZGV2aWNlIGJpbmFyaWVzCisgICAgZW52X3ZhciA9IGdldGVudigiTUlDX0xEX0xJQlJBUllfUEFUSCIpOworICAgIGlmIChlbnZfdmFyICE9IDApIHsKKyAgICAgICAgbWljX2xpYnJhcnlfcGF0aCA9IHN0cmR1cChlbnZfdmFyKTsKKyAgICB9CisKKyAgICAvLyBtZW1vcnkgc2l6ZSByZXNlcnZlZCBmb3IgQ09JIGJ1ZmZlcnMKKyAgICBlbnZfdmFyID0gZ2V0ZW52KCJNSUNfQlVGRkVSU0laRSIpOworICAgIGlmIChlbnZfdmFyICE9IDApIHsKKyAgICAgICAgdWludDY0X3QgbmV3X3NpemU7CisgICAgICAgIGlmIChfX29mZmxvYWRfcGFyc2Vfc2l6ZV9zdHJpbmcoZW52X3ZhciwgbmV3X3NpemUpKSB7CisgICAgICAgICAgICBtaWNfYnVmZmVyX3NpemUgPSBuZXdfc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19pbnZhbGlkX2Vudl92YXJfdmFsdWUsICJNSUNfQlVGRkVSU0laRSIpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gZGV0ZXJtaW5lIHN0YWNrc2l6ZSBmb3IgdGhlIHBpcGVsaW5lIG9uIHRoZSBkZXZpY2UKKyAgICBlbnZfdmFyID0gZ2V0ZW52KCJNSUNfU1RBQ0tTSVpFIik7CisgICAgaWYgKGVudl92YXIgIT0gMCAmJiAqZW52X3ZhciAhPSAnXDAnKSB7CisgICAgICAgIHVpbnQ2NF90IG5ld19zaXplOworICAgICAgICBpZiAoX19vZmZsb2FkX3BhcnNlX3NpemVfc3RyaW5nKGVudl92YXIsIG5ld19zaXplKSAmJgorICAgICAgICAgICAgKG5ld19zaXplID49IDE2Mzg0KSAmJiAoKG5ld19zaXplICYgNDA5NSkgPT0gMCkpIHsKKyAgICAgICAgICAgIG1pY19zdGFja19zaXplID0gbmV3X3NpemU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfbWljX2luaXQzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHByb3h5IEkvTworICAgIGVudl92YXIgPSBnZXRlbnYoIk1JQ19QUk9YWV9JTyIpOworICAgIGlmIChlbnZfdmFyICE9IDAgJiYgKmVudl92YXIgIT0gJ1wwJykgeworICAgICAgICBpbnQ2NF90IG5ld192YWw7CisgICAgICAgIGlmIChfX29mZmxvYWRfcGFyc2VfaW50X3N0cmluZyhlbnZfdmFyLCBuZXdfdmFsKSkgeworICAgICAgICAgICAgbWljX3Byb3h5X2lvID0gbmV3X3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19pbnZhbGlkX2Vudl92YXJfaW50X3ZhbHVlLCAiTUlDX1BST1hZX0lPIik7CisgICAgICAgIH0KKyAgICB9CisgICAgZW52X3ZhciA9IGdldGVudigiTUlDX1BST1hZX0ZTX1JPT1QiKTsKKyAgICBpZiAoZW52X3ZhciAhPSAwICYmICplbnZfdmFyICE9ICdcMCcpIHsKKyAgICAgICAgbWljX3Byb3h5X2ZzX3Jvb3QgPSBzdHJkdXAoZW52X3Zhcik7CisgICAgfQorCisgICAgLy8gUHJlcGFyZSBlbnZpcm9ubWVudCBmb3IgdGhlIHRhcmdldCBwcm9jZXNzIHVzaW5nIHRoZSBmb2xsb3dpbmcKKyAgICAvLyBydWxlcworICAgIC8vIC0gSWYgTUlDX0VOVl9QUkVGSVggaXMgc2V0IHRoZW4gYW55IGVudmlyb25tZW50IHZhcmlhYmxlIG9uIHRoZQorICAgIC8vICAgaG9zdCB3aGljaCBoYXMgdGhhdCBwcmVmaXggYXJlIGNvcGllZCB0byB0aGUgZGV2aWNlIHdpdGhvdXQKKyAgICAvLyAgIHRoZSBwcmVmaXguCisgICAgLy8gICBBbGwgb3RoZXIgaG9zdCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIGlnbm9yZWQuCisgICAgLy8gLSBJZiBNSUNfRU5WX1BSRUZJWCBpcyBub3Qgc2V0IG9yIGlmIE1JQ19FTlZfUFJFRklYPSIiIHRoZW4gaG9zdAorICAgIC8vICAgZW52aXJvbm1lbnQgaXMgZHVwbGljYXRlZC4KKyAgICBlbnZfdmFyID0gZ2V0ZW52KCJNSUNfRU5WX1BSRUZJWCIpOworICAgIGlmIChlbnZfdmFyICE9IDAgJiYgKmVudl92YXIgIT0gJ1wwJykgeworICAgICAgICBtaWNfZW52X3ZhcnMuc2V0X3ByZWZpeChlbnZfdmFyKTsKKworICAgICAgICBpbnQgbGVuID0gc3RybGVuKGVudl92YXIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgZW52aXJvbltpXSAhPSAwOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzdHJuY21wKGVudmlyb25baV0sIGVudl92YXIsIGxlbikgPT0gMCAmJgorICAgICAgICAgICAgICAgIHN0cm5jbXAoZW52aXJvbltpXSwgIk1JQ19MRF9MSUJSQVJZX1BBVEgiLCAxOSkgIT0gMCAmJgorICAgICAgICAgICAgICAgIGVudmlyb25baV1bbGVuXSAhPSAnPScpIHsKKyAgICAgICAgICAgICAgICBtaWNfZW52X3ZhcnMuYW5hbHl6ZV9lbnZfdmFyKGVudmlyb25baV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gY3JlYXRlIGtleSBmb3IgdGhyZWFkIGRhdGEKKyAgICBpZiAodGhyZWFkX2tleV9jcmVhdGUoJm1pY190aHJlYWRfa2V5LCBFbmdpbmU6OmRlc3Ryb3lfdGhyZWFkX2RhdGEpKSB7CisgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19taWNfaW5pdDQsIGVycm5vKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGNwdSBmcmVxdWVuY3kKKyAgICBjcHVfZnJlcXVlbmN5ID0gQ09JOjpQZXJmR2V0Q3ljbGVGcmVxdWVuY3koKTsKKworICAgIGVudl92YXIgPSBnZXRlbnYobWljX3VzZV8ybWJfYnVmZmVyc19lbnZuYW1lKTsKKyAgICBpZiAoZW52X3ZhciAhPSAwICYmICplbnZfdmFyICE9ICdcMCcpIHsKKyAgICAgICAgdWludDY0X3QgbmV3X3NpemU7CisgICAgICAgIGlmIChfX29mZmxvYWRfcGFyc2Vfc2l6ZV9zdHJpbmcoZW52X3ZhciwgbmV3X3NpemUpKSB7CisgICAgICAgICAgICBfX29mZmxvYWRfdXNlXzJtYl9idWZmZXJzID0gbmV3X3NpemU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfaW52YWxpZF9lbnZfdmFyX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWNfdXNlXzJtYl9idWZmZXJzX2Vudm5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgZW52X3ZhciA9IGdldGVudihtaWNfdXNlX2FzeW5jX2J1ZmZlcl93cml0ZV9lbnZuYW1lKTsKKyAgICBpZiAoZW52X3ZhciAhPSAwICYmICplbnZfdmFyICE9ICdcMCcpIHsKKyAgICAgICAgdWludDY0X3QgbmV3X3NpemU7CisgICAgICAgIGlmIChfX29mZmxvYWRfcGFyc2Vfc2l6ZV9zdHJpbmcoZW52X3ZhciwgbmV3X3NpemUpKSB7CisgICAgICAgICAgICBfX29mZmxvYWRfdXNlX2FzeW5jX2J1ZmZlcl93cml0ZSA9IG5ld19zaXplOworICAgICAgICB9CisgICAgfQorCisgICAgZW52X3ZhciA9IGdldGVudihtaWNfdXNlX2FzeW5jX2J1ZmZlcl9yZWFkX2Vudm5hbWUpOworICAgIGlmIChlbnZfdmFyICE9IDAgJiYgKmVudl92YXIgIT0gJ1wwJykgeworICAgICAgICB1aW50NjRfdCBuZXdfc2l6ZTsKKyAgICAgICAgaWYgKF9fb2ZmbG9hZF9wYXJzZV9zaXplX3N0cmluZyhlbnZfdmFyLCBuZXdfc2l6ZSkpIHsKKyAgICAgICAgICAgIF9fb2ZmbG9hZF91c2VfYXN5bmNfYnVmZmVyX3JlYWQgPSBuZXdfc2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIG1pYyBpbml0aWFsaXphdGlvbiB0eXBlCisgICAgZW52X3ZhciA9IGdldGVudihvZmZsb2FkX2luaXRfZW52bmFtZSk7CisgICAgaWYgKGVudl92YXIgIT0gMCAmJiAqZW52X3ZhciAhPSAnXDAnKSB7CisgICAgICAgIGlmIChzdHJjbXAoZW52X3ZhciwgIm9uX29mZmxvYWQiKSA9PSAwKSB7CisgICAgICAgICAgICBfX29mZmxvYWRfaW5pdF90eXBlID0gY19pbml0X29uX29mZmxvYWQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKGVudl92YXIsICJvbl9vZmZsb2FkX2FsbCIpID09IDApIHsKKyAgICAgICAgICAgIF9fb2ZmbG9hZF9pbml0X3R5cGUgPSBjX2luaXRfb25fb2ZmbG9hZF9hbGw7CisgICAgICAgIH0KKyNpZm5kZWYgVEFSR0VUX1dJTk5UCisgICAgICAgIGVsc2UgaWYgKHN0cmNtcChlbnZfdmFyLCAib25fc3RhcnQiKSA9PSAwKSB7CisgICAgICAgICAgICBfX29mZmxvYWRfaW5pdF90eXBlID0gY19pbml0X29uX3N0YXJ0OworICAgICAgICB9CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2ludmFsaWRfZW52X3Zhcl92YWx1ZSwgb2ZmbG9hZF9pbml0X2Vudm5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gYWN0aXZlIHdhaXQKKyAgICBlbnZfdmFyID0gZ2V0ZW52KG9mZmxvYWRfYWN0aXZlX3dhaXRfZW52bmFtZSk7CisgICAgaWYgKGVudl92YXIgIT0gMCAmJiAqZW52X3ZhciAhPSAnXDAnKSB7CisgICAgICAgIGludDY0X3QgbmV3X3ZhbDsKKyAgICAgICAgaWYgKF9fb2ZmbG9hZF9wYXJzZV9pbnRfc3RyaW5nKGVudl92YXIsIG5ld192YWwpKSB7CisgICAgICAgICAgICBfX29mZmxvYWRfYWN0aXZlX3dhaXQgPSBuZXdfdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2ludmFsaWRfZW52X3Zhcl9pbnRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZmxvYWRfYWN0aXZlX3dhaXRfZW52bmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBvbXAgZGV2aWNlIG51bQorICAgIGVudl92YXIgPSBnZXRlbnYob21wX2RldmljZV9udW1fZW52bmFtZSk7CisgICAgaWYgKGVudl92YXIgIT0gMCAmJiAqZW52X3ZhciAhPSAnXDAnKSB7CisgICAgICAgIGludDY0X3QgbmV3X3ZhbDsKKyAgICAgICAgaWYgKF9fb2ZmbG9hZF9wYXJzZV9pbnRfc3RyaW5nKGVudl92YXIsIG5ld192YWwpICYmIG5ld192YWwgPj0gMCkgeworICAgICAgICAgICAgX19vbXBfZGV2aWNlX251bSA9IG5ld192YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfb21wX2ludmFsaWRfZGV2aWNlX251bV9lbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9tcF9kZXZpY2VfbnVtX2Vudm5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gaW5pdCBPUlNMCisgICAgT1JTTDo6aW5pdCgpOworfQorCitleHRlcm4gaW50IF9fb2ZmbG9hZF9pbml0X2xpYnJhcnkodm9pZCkKK3sKKyAgICAvLyBkbyBvbmUgdGltZSBpbnRpYWxpemF0aW9uCisgICAgc3RhdGljIE9mZmxvYWRPbmNlQ29udHJvbCBjdHJsID0gT0ZGTE9BRF9PTkNFX0NPTlRST0xfSU5JVDsKKyAgICBfX29mZmxvYWRfcnVuX29uY2UoJmN0cmwsIF9fb2ZmbG9hZF9pbml0X2xpYnJhcnlfb25jZSk7CisKKyAgICAvLyBvZmZsb2FkIGlzIGF2YWlsYWJsZSBpZiBDT0kgaXMgYXZhaWxhYmxlIGFuZCB0aGUgbnVtYmVyIG9mIGRldmljZXMgPiAwCisgICAgYm9vbCBpc19hdmFpbGFibGUgPSBDT0k6OmlzX2F2YWlsYWJsZSAmJiAobWljX2VuZ2luZXNfdG90YWwgPiAwKTsKKworICAgIC8vIHJlZ2lzdGVyIHBlbmRpbmcgbGlicmFyaWVzIGlmIHRoZXJlIGFyZSBhbnkKKyAgICBpZiAoaXNfYXZhaWxhYmxlICYmIF9fdGFyZ2V0X2xpYnMpIHsKKyAgICAgICAgbXV0ZXhfbG9ja2VyX3QgbG9ja2VyKF9fdGFyZ2V0X2xpYnNfbG9jayk7CisKKyAgICAgICAgZm9yIChUYXJnZXRJbWFnZUxpc3Q6Oml0ZXJhdG9yIGl0ID0gX190YXJnZXRfbGlic19saXN0LmJlZ2luKCk7CisgICAgICAgICAgICAgaXQgIT0gX190YXJnZXRfbGlic19saXN0LmVuZCgpOyBpdCsrKSB7CisgICAgICAgICAgICAvLyBSZWdpc3RlciBsaWJyYXJ5IGluIENPSQorICAgICAgICAgICAgQ09JOjpQcm9jZXNzUmVnaXN0ZXJMaWJyYXJpZXMoMSwgJml0LT5kYXRhLCAmaXQtPnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXQtPm9yaWdpbiwgJml0LT5vZmZzZXQpOworCisgICAgICAgICAgICAvLyBhZGQgbGliIHRvIGFsbCBlbmdpbmVzCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1pY19lbmdpbmVzX3RvdGFsOyBpKyspIHsKKyAgICAgICAgICAgICAgICBtaWNfZW5naW5lc1tpXS5hZGRfbGliKCppdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBfX3RhcmdldF9saWJzID0gZmFsc2U7CisgICAgICAgIF9fdGFyZ2V0X2xpYnNfbGlzdC5jbGVhcigpOworICAgIH0KKworICAgIHJldHVybiBpc19hdmFpbGFibGU7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBfX29mZmxvYWRfcmVnaXN0ZXJfaW1hZ2UoY29uc3Qgdm9pZCAqdGFyZ2V0X2ltYWdlKQoreworICAgIGNvbnN0IHN0cnVjdCBJbWFnZSAqaW1hZ2UgPSBzdGF0aWNfY2FzdDxjb25zdCBzdHJ1Y3QgSW1hZ2UqPih0YXJnZXRfaW1hZ2UpOworCisgICAgLy8gZGVjb2RlIGltYWdlCisgICAgY29uc3QgY2hhciAqbmFtZSA9IGltYWdlLT5kYXRhOworICAgIGNvbnN0IHZvaWQgKmRhdGEgPSBpbWFnZS0+ZGF0YSArIHN0cmxlbihpbWFnZS0+ZGF0YSkgKyAxOworICAgIHVpbnQ2NF90ICAgIHNpemUgPSBpbWFnZS0+c2l6ZTsKKyAgICBjb25zdCBjaGFyICpvcmlnaW4gPSAwOworICAgIHVpbnQ2NF90ICAgIG9mZnNldCA9IDA7CisKKyAgICAvLyBvdXIgYWN0aW9ucyBkZXBlbmQgb24gdGhlIGltYWdlIHR5cGUKKyAgICBjb25zdCBFbGY2NF9FaGRyICpoZHIgPSBzdGF0aWNfY2FzdDxjb25zdCBFbGY2NF9FaGRyKj4oZGF0YSk7CisgICAgc3dpdGNoIChoZHItPmVfdHlwZSkgeworICAgICAgICBjYXNlIEVUX0VYRUM6CisgICAgICAgICAgICAvLyBFYWNoIG9mZmxvYWQgYXBwbGljYXRpb24gaXMgc3VwcG9zZWQgdG8gaGF2ZSBvbmx5IG9uZSB0YXJnZXQKKyAgICAgICAgICAgIC8vIGltYWdlIHJlcHJlc2VudGluZyB0YXJnZXQgZXhlY3V0YWJsZS4KKyAgICAgICAgICAgIC8vIE5vIHRocmVhZCBzeW5jaHJvbml6YXRpb24gaXMgcmVxdWlyZWQgaGVyZSBhcyB0aGUgaW5pdGlhbGl6YXRpb24KKyAgICAgICAgICAgIC8vIGNvZGUgaXMgYWx3YXlzIGV4ZWN1dGVkIGluIGEgc2luZ2xlIHRocmVhZC4KKyAgICAgICAgICAgIGlmIChfX3RhcmdldF9leGUgIT0gMCkgeworICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19tdWx0aXBsZV90YXJnZXRfZXhlcyk7CisgICAgICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9fdGFyZ2V0X2V4ZSA9IG5ldyBUYXJnZXRJbWFnZShuYW1lLCBkYXRhLCBzaXplLCBvcmlnaW4sIG9mZnNldCk7CisKKyAgICAgICAgICAgIC8vIFJlZ2lzdHJhdGlvbiBjb2RlIGZvciBleGVjcyBpcyBhbHdheXMgY2FsbGVkIGZyb20gdGhlIGNvbnRleHQKKyAgICAgICAgICAgIC8vIG9mIG1haW4gYW5kIHRodXMgd2UgY2FuIHNhZmVseSBjYWxsIGFueSBmdW5jdGlvbiBoZXJlLAorICAgICAgICAgICAgLy8gaW5jbHVkaW5nIExvYWRMaWJyYXJ5IEFQSSBvbiB3aW5kb3dzLiBUaGlzIGlzIHRoZSBwbGFjZSB3aGVyZQorICAgICAgICAgICAgLy8gd2UgZG8gdGhlIG9mZmxvYWQgbGlicmFyeSBpbml0aWFsaXphdGlvbi4KKyAgICAgICAgICAgIGlmIChfX29mZmxvYWRfaW5pdF9saWJyYXJ5KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplIGVuZ2luZSBpZiBpbml0X3R5cGUgaXMgb25fc3RhcnQKKyAgICAgICAgICAgICAgICBpZiAoX19vZmZsb2FkX2luaXRfdHlwZSA9PSBjX2luaXRfb25fc3RhcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtaWNfZW5naW5lc190b3RhbDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtaWNfZW5naW5lc1tpXS5pbml0KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVUX0RZTjoKKyAgICAgICAgICAgIC8vIFJlZ2lzdHJhdGlvbiBjb2RlIGZvciBsaWJyYXJpZXMgaXMgY2FsbGVkIGZyb20gdGhlIERsbE1haW4KKyAgICAgICAgICAgIC8vIGNvbnRleHQgKG9uIHdpbmRvd3MpIGFuZCB0aHVzIHdlIGNhbm5vdCBkbyBhbnl0aGluZyB1c2VmdWwKKyAgICAgICAgICAgIC8vIGhlcmUuIFNvIHdlIGp1c3QgYWRkIGl0IHRvIHRoZSBsaXN0IG9mIHBlbmRpbmcgbGlicmFyaWVzIGZvcgorICAgICAgICAgICAgLy8gdGhlIGxhdGVyIHVzZS4KKyAgICAgICAgICAgIF9fdGFyZ2V0X2xpYnNfbG9jay5sb2NrKCk7CisgICAgICAgICAgICBfX3RhcmdldF9saWJzID0gdHJ1ZTsKKyAgICAgICAgICAgIF9fdGFyZ2V0X2xpYnNfbGlzdC5wdXNoX2JhY2soVGFyZ2V0SW1hZ2UobmFtZSwgZGF0YSwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luLCBvZmZzZXQpKTsKKyAgICAgICAgICAgIF9fdGFyZ2V0X2xpYnNfbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvLyBzb21ldGhpbmcgaXMgZGVmaW5pdGVseSB3cm9uZywgaXNzdWUgYW4gZXJyb3IgYW5kIGV4aXQKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY191bmtub3duX2JpbmFyeV90eXBlKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgfQorfQorCitleHRlcm4gIkMiIHZvaWQgX19vZmZsb2FkX3VucmVnaXN0ZXJfaW1hZ2UoY29uc3Qgdm9pZCAqdGFyZ2V0X2ltYWdlKQoreworICAgIC8vIFRhcmdldCBpbWFnZSBpcyBwYWNrZWQgYXMgZm9sbG93czoKKyAgICAvLyAgICAgIDggYnl0ZXMgICAgICAgICAgICAgICAgLSBzaXplIG9mIHRoZSB0YXJnZXQgYmluYXJ5CisgICAgLy8gICAgICBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIC0gYmluYXJ5IG5hbWUKKyAgICAvLyAgICAgIDxzaXplPiBieXRlcyAgICAgICAgICAgLSBiaW5hcnkgY29udGVudHMKKyAgICBjb25zdCBzdHJ1Y3QgSW1hZ2UgeworICAgICAgICAgaW50NjRfdCBzaXplOworICAgICAgICAgY2hhciBkYXRhW107CisgICAgfSAqaW1hZ2UgPSBzdGF0aWNfY2FzdDxjb25zdCBzdHJ1Y3QgSW1hZ2UqPih0YXJnZXRfaW1hZ2UpOworCisgICAgLy8gZGVjb2RlIGltYWdlCisgICAgY29uc3QgY2hhciAqbmFtZSA9IGltYWdlLT5kYXRhOworICAgIGNvbnN0IHZvaWQgKmRhdGEgPSBpbWFnZS0+ZGF0YSArIHN0cmxlbihpbWFnZS0+ZGF0YSkgKyAxOworCisgICAgLy8gb3VyIGFjdGlvbnMgZGVwZW5kIG9uIHRoZSBpbWFnZSB0eXBlCisgICAgY29uc3QgRWxmNjRfRWhkciAqaGRyID0gc3RhdGljX2Nhc3Q8Y29uc3QgRWxmNjRfRWhkcio+KGRhdGEpOworICAgIGlmIChoZHItPmVfdHlwZSA9PSBFVF9FWEVDKSB7CisgICAgICAgIC8vIFdlIGFyZSBleGVjdXRpbmcgZXhlYydzIGRlc2N0cnVjdG9ycy4KKyAgICAgICAgLy8gSXQgaXMgdGltZSB0byBkbyBhIGxpYnJhcnkgY2xlYW51cC4KKyAgICAgICAgaWYgKHRpbWVyX2VuYWJsZWQpIHsKKyAgICAgICAgICAgIE9mZmxvYWRfVGltZXJfUHJpbnQoKTsKKyAgICAgICAgfQorCisjaWZkZWYgTVlPX1NVUFBPUlQKKyAgICAgICAgX19vZmZsb2FkX215b0ZpbmkoKTsKKyNlbmRpZiAvLyBNWU9fU1VQUE9SVAorCisgICAgICAgIF9fb2ZmbG9hZF9maW5pX2xpYnJhcnkoKTsKKyAgICB9Cit9CisKKy8vIFJ1bnRpbWUgdHJhY2UgaW50ZXJmYWNlIGZvciB1c2VyIHByb2dyYW1zCisKK3ZvaWQgX19vZmZsb2FkX2NvbnNvbGVfdHJhY2UoaW50IGxldmVsKQoreworICAgIGNvbnNvbGVfZW5hYmxlZCA9IGxldmVsOworfQorCisvLyBVc2VyLXZpc2libGUgb2ZmbG9hZCBBUEkKKworaW50IF9PZmZsb2FkX251bWJlcl9vZl9kZXZpY2VzKHZvaWQpCit7CisgICAgX19vZmZsb2FkX2luaXRfbGlicmFyeSgpOworICAgIHJldHVybiBtaWNfZW5naW5lc190b3RhbDsKK30KKworaW50IF9PZmZsb2FkX2dldF9kZXZpY2VfbnVtYmVyKHZvaWQpCit7CisgICAgcmV0dXJuIC0xOworfQorCitpbnQgX09mZmxvYWRfZ2V0X3BoeXNpY2FsX2RldmljZV9udW1iZXIodm9pZCkKK3sKKyAgICByZXR1cm4gLTE7Cit9CisKK2ludCBfT2ZmbG9hZF9zaWduYWxlZChpbnQgaW5kZXgsIHZvaWQgKnNpZ25hbCkKK3sKKyAgICBfX29mZmxvYWRfaW5pdF9saWJyYXJ5KCk7CisKKyAgICAvLyBjaGVjayBpbmRleCB2YWx1ZQorICAgIGlmIChpbmRleCA8IDAgfHwgbWljX2VuZ2luZXNfdG90YWwgPD0gMCkgeworICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfb2ZmbG9hZF9zaWduYWxlZDEsIGluZGV4KTsKKyAgICAgICAgTElCT0ZGTE9BRF9BQk9SVDsKKyAgICB9CisKKyAgICAvLyBmaW5kIGFzc29jaWF0ZWQgYXN5bmMgdGFzaworICAgIE9mZmxvYWREZXNjcmlwdG9yICp0YXNrID0KKyAgICAgICAgbWljX2VuZ2luZXNbaW5kZXggJSBtaWNfZW5naW5lc190b3RhbF0uZmluZF9zaWduYWwoc2lnbmFsLCBmYWxzZSk7CisgICAgaWYgKHRhc2sgPT0gMCkgeworICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfb2ZmbG9hZF9zaWduYWxlZDIsIHNpZ25hbCk7CisgICAgICAgIExJQk9GRkxPQURfQUJPUlQ7CisgICAgfQorCisgICAgcmV0dXJuIHRhc2stPmlzX3NpZ25hbGVkKCk7Cit9CisKK3ZvaWQgX09mZmxvYWRfcmVwb3J0KGludCB2YWwpCit7CisgICAgaWYgKHZhbCA9PSBPRkZMT0FEX1JFUE9SVF9PTiB8fAorICAgICAgICB2YWwgPT0gT0ZGTE9BRF9SRVBPUlRfT0ZGKSB7CisgICAgICAgIG9mZmxvYWRfcmVwb3J0X2VuYWJsZWQgPSB2YWw7CisgICAgfQorfQorCisvLyBJREIgc3VwcG9ydAoraW50ICAgX19kYmdfaXNfYXR0YWNoZWQgPSAwOworaW50ICAgX19kYmdfdGFyZ2V0X2lkID0gLTE7CitwaWRfdCBfX2RiZ190YXJnZXRfc29fcGlkID0gLTE7CitjaGFyICBfX2RiZ190YXJnZXRfZXhlX25hbWVbTUFYX1RBUkdFVF9OQU1FXSA9IHswfTsKK2NvbnN0IGludCBfX2RiZ19hcGlfbWFqb3JfdmVyc2lvbiA9IDE7Citjb25zdCBpbnQgX19kYmdfYXBpX21pbm9yX3ZlcnNpb24gPSAwOworCit2b2lkIF9fZGJnX3RhcmdldF9zb19sb2FkZWQoKQoreworfQordm9pZCBfX2RiZ190YXJnZXRfc29fdW5sb2FkZWQoKQoreworfQpkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9ob3N0LmggYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX2hvc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTIzOTk2Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9ob3N0LmgKQEAgLTAsMCArMSwzNDMgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLyohIFxmaWxlCisgICAgXGJyaWVmIFRoZSBwYXJ0cyBvZiB0aGUgcnVudGltZSBsaWJyYXJ5IHVzZWQgb25seSBvbiB0aGUgaG9zdAorKi8KKworI2lmbmRlZiBPRkZMT0FEX0hPU1RfSF9JTkNMVURFRAorI2RlZmluZSBPRkZMT0FEX0hPU1RfSF9JTkNMVURFRAorCisjaWZuZGVmIFRBUkdFVF9XSU5OVAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorI2luY2x1ZGUgIm9mZmxvYWRfY29tbW9uLmgiCisjaW5jbHVkZSAib2ZmbG9hZF91dGlsLmgiCisjaW5jbHVkZSAib2ZmbG9hZF9lbmdpbmUuaCIKKyNpbmNsdWRlICJvZmZsb2FkX2Vudi5oIgorI2luY2x1ZGUgIm9mZmxvYWRfb3JzbC5oIgorI2luY2x1ZGUgImNvaS9jb2lfY2xpZW50LmgiCisKKy8vIE1JQyBlbmdpbmVzLgorZXh0ZXJuIEVuZ2luZSogIG1pY19lbmdpbmVzOworZXh0ZXJuIHVpbnQzMl90IG1pY19lbmdpbmVzX3RvdGFsOworCisvLyEgVGhlIHRhcmdldCBpbWFnZSBpcyBwYWNrZWQgYXMgZm9sbG93cy4KKy8qISAgICAgIDEuIDggYnl0ZXMgY29udGFpbmluZyB0aGUgc2l6ZSBvZiB0aGUgdGFyZ2V0IGJpbmFyeSAgICAgICAgICAqLworLyohICAgICAgMi4gYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIHdoaWNoIGlzIHRoZSBiaW5hcnkgbmFtZSAgICAgICAgICovCisvKiEgICAgICAzLiA8c2l6ZT4gbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYXJlIHRoZSBjb250ZW50cyBvZiB0aGUgaW1hZ2UgKi8KKy8qISAgICAgIFRoZSBhZGRyZXNzIG9mIHN5bWJvbCBfX29mZmxvYWRfdGFyZ2V0X2ltYWdlCisgICAgICAgICAgICAgaXMgdGhlIGFkZHJlc3Mgb2YgdGhpcyBzdHJ1Y3R1cmUuICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3N0cnVjdCBJbWFnZSB7CisgICAgIGludDY0X3Qgc2l6ZTsgLy8hPCBTaXplIGluIGJ5dGVzIG9mIHRoZSB0YXJnZXQgYmluYXJ5IG5hbWUgYW5kIGNvbnRlbnRzCisgICAgIGNoYXIgZGF0YVtdOyAgLy8hPCBUaGUgbmFtZSBhbmQgY29udGVudHMgb2YgdGhlIHRhcmdldCBpbWFnZQorfTsKKworLy8gVGhlIG9mZmxvYWQgZGVzY3JpcHRvci4KK2NsYXNzIE9mZmxvYWREZXNjcmlwdG9yCit7CitwdWJsaWM6CisgICAgT2ZmbG9hZERlc2NyaXB0b3IoCisgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgX09mZmxvYWRfc3RhdHVzICpzdGF0dXMsCisgICAgICAgIGJvb2wgaXNfbWFuZGF0b3J5LAorICAgICAgICBib29sIGlzX29wZW5tcCwKKyAgICAgICAgT2ZmbG9hZEhvc3RUaW1lckRhdGEgKiB0aW1lcl9kYXRhCisgICAgKSA6CisgICAgICAgIG1fZGV2aWNlKG1pY19lbmdpbmVzW2luZGV4ICUgbWljX2VuZ2luZXNfdG90YWxdKSwKKyAgICAgICAgbV9pc19tYW5kYXRvcnkoaXNfbWFuZGF0b3J5KSwKKyAgICAgICAgbV9pc19vcGVubXAoaXNfb3Blbm1wKSwKKyAgICAgICAgbV9pbm91dF9idWYoMCksCisgICAgICAgIG1fZnVuY19kZXNjKDApLAorICAgICAgICBtX2Z1bmNfZGVzY19zaXplKDApLAorICAgICAgICBtX2luX2RlcHMoMCksCisgICAgICAgIG1faW5fZGVwc190b3RhbCgwKSwKKyAgICAgICAgbV9vdXRfZGVwcygwKSwKKyAgICAgICAgbV9vdXRfZGVwc190b3RhbCgwKSwKKyAgICAgICAgbV92YXJzKDApLAorICAgICAgICBtX3ZhcnNfZXh0cmEoMCksCisgICAgICAgIG1fc3RhdHVzKHN0YXR1cyksCisgICAgICAgIG1fdGltZXJfZGF0YSh0aW1lcl9kYXRhKQorICAgIHt9CisKKyAgICB+T2ZmbG9hZERlc2NyaXB0b3IoKQorICAgIHsKKyAgICAgICAgaWYgKG1faW5fZGVwcyAhPSAwKSB7CisgICAgICAgICAgICBmcmVlKG1faW5fZGVwcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1fb3V0X2RlcHMgIT0gMCkgeworICAgICAgICAgICAgZnJlZShtX291dF9kZXBzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobV9mdW5jX2Rlc2MgIT0gMCkgeworICAgICAgICAgICAgZnJlZShtX2Z1bmNfZGVzYyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1fdmFycyAhPSAwKSB7CisgICAgICAgICAgICBmcmVlKG1fdmFycyk7CisgICAgICAgICAgICBmcmVlKG1fdmFyc19leHRyYSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIG9mZmxvYWQoY29uc3QgY2hhciAqbmFtZSwgYm9vbCBpc19lbXB0eSwKKyAgICAgICAgICAgICAgICAgVmFyRGVzYyAqdmFycywgVmFyRGVzYzIgKnZhcnMyLCBpbnQgdmFyc190b3RhbCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqKndhaXRzLCBpbnQgbnVtX3dhaXRzLCBjb25zdCB2b2lkICoqc2lnbmFsLAorICAgICAgICAgICAgICAgICBpbnQgZW50cnlfaWQsIGNvbnN0IHZvaWQgKnN0YWNrX2FkZHIpOworICAgIGJvb2wgb2ZmbG9hZF9maW5pc2goKTsKKworICAgIGJvb2wgaXNfc2lnbmFsZWQoKTsKKworICAgIE9mZmxvYWRIb3N0VGltZXJEYXRhKiBnZXRfdGltZXJfZGF0YSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fdGltZXJfZGF0YTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgYm9vbCB3YWl0X2RlcGVuZGVuY2llcyhjb25zdCB2b2lkICoqd2FpdHMsIGludCBudW1fd2FpdHMpOworICAgIGJvb2wgc2V0dXBfZGVzY3JpcHRvcnMoVmFyRGVzYyAqdmFycywgVmFyRGVzYzIgKnZhcnMyLCBpbnQgdmFyc190b3RhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbnRyeV9pZCwgY29uc3Qgdm9pZCAqc3RhY2tfYWRkcik7CisgICAgYm9vbCBzZXR1cF9taXNjX2RhdGEoY29uc3QgY2hhciAqbmFtZSk7CisgICAgYm9vbCBzZW5kX3BvaW50ZXJfZGF0YShib29sIGlzX2FzeW5jKTsKKyAgICBib29sIHNlbmRfbm9uY29udGlndW91c19wb2ludGVyX2RhdGEoCisgICAgICAgIGludCBpLAorICAgICAgICBQdHJEYXRhKiBzcmNfYnVmLAorICAgICAgICBQdHJEYXRhKiBkc3RfYnVmLAorICAgICAgICBDT0lFVkVOVCAqZXZlbnQpOworICAgIGJvb2wgcmVjZWl2ZV9ub25jb250aWd1b3VzX3BvaW50ZXJfZGF0YSgKKyAgICAgICAgaW50IGksCisgICAgICAgIGNoYXIqIHNyY19kYXRhLAorICAgICAgICBDT0lCVUZGRVIgZHN0X2J1ZiwKKyAgICAgICAgQ09JRVZFTlQgKmV2ZW50KTsKKworICAgIGJvb2wgZ2F0aGVyX2NvcHlpbl9kYXRhKCk7CisKKyAgICBib29sIGNvbXB1dGUoKTsKKworICAgIGJvb2wgcmVjZWl2ZV9wb2ludGVyX2RhdGEoYm9vbCBpc19hc3luYyk7CisgICAgYm9vbCBzY2F0dGVyX2NvcHlvdXRfZGF0YSgpOworCisgICAgdm9pZCBjbGVhbnVwKCk7CisKKyAgICBib29sIGZpbmRfcHRyX2RhdGEoUHRyRGF0YSogJnB0cl9kYXRhLCB2b2lkICpiYXNlLCBpbnQ2NF90IGRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgbGVuZ3RoLCBib29sIGVycm9yX2RvZXNfbm90X2V4aXN0ID0gdHJ1ZSk7CisgICAgYm9vbCBhbGxvY19wdHJfZGF0YShQdHJEYXRhKiAmcHRyX2RhdGEsIHZvaWQgKmJhc2UsIGludDY0X3QgZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgbGVuZ3RoLCBpbnQ2NF90IGFsbG9jX2Rpc3AsIGludCBhbGlnbik7CisgICAgYm9vbCBpbml0X3N0YXRpY19wdHJfZGF0YShQdHJEYXRhICpwdHJfZGF0YSk7CisgICAgYm9vbCBpbml0X21pY19hZGRyZXNzKFB0ckRhdGEgKnB0cl9kYXRhKTsKKyAgICBib29sIG9mZmxvYWRfc3RhY2tfbWVtb3J5X21hbmFnZXIoY29uc3Qgdm9pZCAqIHN0YWNrX2JlZ2luLCBpbnQgcm91dGluZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1Zl9zaXplLCBpbnQgYWxpZ24sIGJvb2wgKmlzX25ldyk7CisgICAgYm9vbCBudWxsaWZ5X3RhcmdldF9zdGFjayhDT0lCVUZGRVIgdGFyZ19idWYsIHVpbnQ2NF90IHNpemUpOworCisgICAgYm9vbCBnZW5fdmFyX2Rlc2NzX2Zvcl9wb2ludGVyX2FycmF5KGludCBpKTsKKworICAgIHZvaWQgcmVwb3J0X2NvaV9lcnJvcihlcnJvcl90eXBlcyBtc2csIENPSVJFU1VMVCByZXMpOworICAgIF9PZmZsb2FkX3Jlc3VsdCB0cmFuc2xhdGVfY29pX2Vycm9yKENPSVJFU1VMVCByZXMpIGNvbnN0OworCitwcml2YXRlOgorICAgIHR5cGVkZWYgc3RkOjpsaXN0PENPSUJVRkZFUj4gQnVmZmVyTGlzdDsKKworICAgIC8vIGV4dHJhIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGVhY2ggdmFyaWFibGUgZGVzY3JpcHRvcgorICAgIHN0cnVjdCBWYXJFeHRyYSB7CisgICAgICAgIFB0ckRhdGEqIHNyY19kYXRhOworICAgICAgICBQdHJEYXRhKiBkc3RfZGF0YTsKKyAgICAgICAgQXV0b0RhdGEqIGF1dG9fZGF0YTsKKyAgICAgICAgaW50NjRfdCBjcHVfZGlzcDsKKyAgICAgICAgaW50NjRfdCBjcHVfb2Zmc2V0OworICAgICAgICBDZWFuUmVhZFJhbmdlcyAqcmVhZF9ybmdfc3JjOworICAgICAgICBDZWFuUmVhZFJhbmdlcyAqcmVhZF9ybmdfZHN0OworICAgICAgICBpbnQ2NF90IHB0cl9hcnJfb2Zmc2V0OworICAgICAgICBib29sIGlzX2Fycl9wdHJfZWw7CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIFJlYWRBcnJFbGVtZW50cyB7CisgICAgcHVibGljOgorICAgICAgICBSZWFkQXJyRWxlbWVudHMoKToKKyAgICAgICAgICAgIHJhbmdlcyhOVUxMKSwKKyAgICAgICAgICAgIGVsX3NpemUoc2l6ZW9mKFQpKSwKKyAgICAgICAgICAgIG9mZnNldCgwKSwKKyAgICAgICAgICAgIGNvdW50KDApLAorICAgICAgICAgICAgaXNfZW1wdHkodHJ1ZSksCisgICAgICAgICAgICBiYXNlKE5VTEwpCisgICAgICAgIHt9CisKKyAgICAgICAgYm9vbCByZWFkX25leHQoYm9vbCBmbGFnKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZmxhZyAhPSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzX2VtcHR5KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChyYW5nZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZ2V0X25leHRfcmFuZ2UocmFuZ2VzLCAmb2Zmc2V0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJhbmdlcyBhcmUgb3ZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBhbGwgY29udGlndW91cyBlbGVtZW50cyBhcmUgb3ZlcgorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjb3VudCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBsZW5ndGhfY3VyID0gc2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBlbF9zaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YWwgPSAoVClnZXRfZWxfdmFsdWUoYmFzZSwgb2Zmc2V0LCBlbF9zaXplKTsKKyAgICAgICAgICAgICAgICBsZW5ndGhfY3VyIC09IGVsX3NpemU7CisgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgICAgICBpc19lbXB0eSA9IGxlbmd0aF9jdXIgPT0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgcHVibGljOgorICAgICAgICBDZWFuUmVhZFJhbmdlcyAqIHJhbmdlczsKKyAgICAgICAgVCAgICAgICB2YWw7CisgICAgICAgIGludCAgICAgZWxfc2l6ZTsKKyAgICAgICAgaW50NjRfdCBzaXplLAorICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgICAgICBsZW5ndGhfY3VyOworICAgICAgICBib29sICAgIGlzX2VtcHR5OworICAgICAgICBpbnQgICAgIGNvdW50OworICAgICAgICBjaGFyICAgKmJhc2U7CisgICAgfTsKKworICAgIC8vIHB0cl9kYXRhIGZvciBwZXJzaXN0ZW50IGF1dG8gb2JqZWN0cworICAgIFB0ckRhdGEqICAgIG1fc3RhY2tfcHRyX2RhdGE7CisgICAgUHRyRGF0YUxpc3QgbV9kZXN0cm95X3N0YWNrOworCisgICAgLy8gRW5naW5lCisgICAgRW5naW5lJiBtX2RldmljZTsKKworICAgIC8vIGlmIHRydWUgb2ZmbG9hZCBpcyBtYW5kYXRvcnkKKyAgICBib29sIG1faXNfbWFuZGF0b3J5OworCisgICAgLy8gaWYgdHJ1ZSBvZmZsb2FkIGhhcyBvcGVubXAgb3JpZ2luCisgICAgY29uc3QgYm9vbCBtX2lzX29wZW5tcDsKKworICAgIC8vIFRoZSBNYXJzaGFsbGVyIGZvciB0aGUgaW5wdXRzIG9mIHRoZSBvZmZsb2FkZWQgcmVnaW9uLgorICAgIE1hcnNoYWxsZXIgbV9pbjsKKworICAgIC8vIFRoZSBNYXJzaGFsbGVyIGZvciB0aGUgb3V0cHV0cyBvZiB0aGUgb2ZmbG9hZGVkIHJlZ2lvbi4KKyAgICBNYXJzaGFsbGVyIG1fb3V0OworCisgICAgLy8gTGlzdCBvZiBidWZmZXJzIHRoYXQgYXJlIHBhc3NlZCB0byBkaXNwYXRjaCBjYWxsCisgICAgQnVmZmVyTGlzdCBtX2NvbXB1dGVfYnVmZmVyczsKKworICAgIC8vIExpc3Qgb2YgYnVmZmVycyB0aGF0IG5lZWQgdG8gYmUgZGVzdHJveWVkIGF0IHRoZSBlbmQgb2Ygb2ZmbG9hZAorICAgIEJ1ZmZlckxpc3QgbV9kZXN0cm95X2J1ZmZlcnM7CisKKyAgICAvLyBWYXJpYWJsZSBkZXNjcmlwdG9ycworICAgIFZhckRlc2MqICBtX3ZhcnM7CisgICAgVmFyRXh0cmEqIG1fdmFyc19leHRyYTsKKyAgICBpbnQgICAgICAgbV92YXJzX3RvdGFsOworCisgICAgLy8gUG9pbnRlciB0byBhIHVzZXItc3BlY2lmaWVkIHN0YXR1cyB2YXJpYWJsZQorICAgIF9PZmZsb2FkX3N0YXR1cyAqbV9zdGF0dXM7CisKKyAgICAvLyBGdW5jdGlvbiBkZXNjcmlwdG9yCisgICAgRnVuY3Rpb25EZXNjcmlwdG9yKiBtX2Z1bmNfZGVzYzsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1fZnVuY19kZXNjX3NpemU7CisKKyAgICAvLyBCdWZmZXIgZm9yIHRyYW5zZmVycmluZyBjb3B5aW4vY29weW91dCBkYXRhCisgICAgQ09JQlVGRkVSIG1faW5vdXRfYnVmOworCisgICAgLy8gRGVwZW5kZW5jaWVzCisgICAgQ09JRVZFTlQgKm1faW5fZGVwczsKKyAgICB1aW50MzJfdCAgbV9pbl9kZXBzX3RvdGFsOworICAgIENPSUVWRU5UICptX291dF9kZXBzOworICAgIHVpbnQzMl90ICBtX291dF9kZXBzX3RvdGFsOworCisgICAgLy8gVGltZXIgZGF0YQorICAgIE9mZmxvYWRIb3N0VGltZXJEYXRhICptX3RpbWVyX2RhdGE7CisKKyAgICAvLyBjb3B5aW4vY29weW91dCBkYXRhIGxlbmd0aAorICAgIHVpbnQ2NF90IG1faW5fZGF0YWxlbjsKKyAgICB1aW50NjRfdCBtX291dF9kYXRhbGVuOworCisgICAgLy8gYSBib29sZWFuIHZhbHVlIGNhbGN1bGF0ZWQgaW4gc2V0dXBfZGVzY3JpcHRvcnMuIElmIHRydWUgd2UgbmVlZCB0byBkbworICAgIC8vIGEgcnVuIGZ1bmN0aW9uIG9uIHRoZSB0YXJnZXQuIE90aGVyd2lzZSBpdCBtYXkgYmUgb3B0aW1pemVkIGF3YXkuCisgICAgYm9vbCBtX25lZWRfcnVuZnVuY3Rpb247Cit9OworCisvLyBJbml0aWFsaXphdGlvbiB0eXBlcyBmb3IgTUlDCitlbnVtIE9mZmxvYWRJbml0VHlwZSB7CisgICAgY19pbml0X29uX3N0YXJ0LCAgICAgICAgIC8vIGFsbCBkZXZpY2VzIGJlZm9yZSBlbnRlcmluZyBtYWluCisgICAgY19pbml0X29uX29mZmxvYWQsICAgICAgIC8vIHNpbmdsZSBkZXZpY2UgYmVmb3JlIHN0YXJ0aW5nIHRoZSBmaXJzdCBvZmZsb2FkCisgICAgY19pbml0X29uX29mZmxvYWRfYWxsICAgIC8vIGFsbCBkZXZpY2VzIGJlZm9yZSBzdGFydGluZyB0aGUgZmlyc3Qgb2ZmbG9hZAorfTsKKworLy8gSW5pdGlhbGl6ZXMgbGlicmFyeSBhbmQgcmVnaXN0ZXJzIHNwZWNpZmllZCBvZmZsb2FkIGltYWdlLgorZXh0ZXJuICJDIiB2b2lkIF9fb2ZmbG9hZF9yZWdpc3Rlcl9pbWFnZShjb25zdCB2b2lkKiBpbWFnZSk7CitleHRlcm4gIkMiIHZvaWQgX19vZmZsb2FkX3VucmVnaXN0ZXJfaW1hZ2UoY29uc3Qgdm9pZCogaW1hZ2UpOworCisvLyBJbml0aWFsaXplcyBvZmZsb2FkIHJ1bnRpbWUgbGlicmFyeS4KK2V4dGVybiBpbnQgX19vZmZsb2FkX2luaXRfbGlicmFyeSh2b2lkKTsKKworLy8gdGhyZWFkIGRhdGEgZm9yIGFzc29jaWF0aW5nIHBpcGVsaW5lcyB3aXRoIHRocmVhZHMKK2V4dGVybiBwdGhyZWFkX2tleV90IG1pY190aHJlYWRfa2V5OworCisvLyBFbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIGRldmljZXMKK2V4dGVybiBNaWNFbnZWYXIgbWljX2Vudl92YXJzOworCisvLyBDUFUgZnJlcXVlbmN5CitleHRlcm4gdWludDY0X3QgY3B1X2ZyZXF1ZW5jeTsKKworLy8gTERfTElCUkFSWV9QQVRIIGZvciBNSUMgbGlicmFyaWVzCitleHRlcm4gY2hhciogbWljX2xpYnJhcnlfcGF0aDsKKworLy8gc3RhY2sgc2l6ZSBmb3IgdGFyZ2V0CitleHRlcm4gdWludDMyX3QgbWljX3N0YWNrX3NpemU7CisKKy8vIFByZWFsbG9jYXRlZCBtZW1vcnkgc2l6ZSBmb3IgYnVmZmVycyBvbiBNSUMKK2V4dGVybiB1aW50NjRfdCBtaWNfYnVmZmVyX3NpemU7CisKKy8vIFNldHRpbmcgY29udHJvbGxpbmcgaW5vdXQgcHJveHkKK2V4dGVybiBib29sICBtaWNfcHJveHlfaW87CitleHRlcm4gY2hhciogbWljX3Byb3h5X2ZzX3Jvb3Q7CisKKy8vIFRocmVzaG9sZCBmb3IgY3JlYXRpbmcgYnVmZmVycyB3aXRoIGxhcmdlIHBhZ2VzCitleHRlcm4gdWludDY0X3QgX19vZmZsb2FkX3VzZV8ybWJfYnVmZmVyczsKKworLy8gb2ZmbG9hZCBpbml0aWFsaXphdGlvbiB0eXBlCitleHRlcm4gT2ZmbG9hZEluaXRUeXBlIF9fb2ZmbG9hZF9pbml0X3R5cGU7CisKKy8vIERldmljZSBudW1iZXIgdG8gb2ZmbG9hZCB0byB3aGVuIGRldmljZSBpcyBub3QgZXhwbGljaXRseSBzcGVjaWZpZWQuCitleHRlcm4gaW50IF9fb21wX2RldmljZV9udW07CisKKy8vIHRhcmdldCBleGVjdXRhYmxlCitleHRlcm4gVGFyZ2V0SW1hZ2UqIF9fdGFyZ2V0X2V4ZTsKKworLy8gSURCIHN1cHBvcnQKKworLy8gQ2FsbGVkIGJ5IHRoZSBvZmZsb2FkIHJ1bnRpbWUgYWZ0ZXIgaW5pdGlhbGl6YXRpb24gb2Ygb2ZmbG9hZCBpbmZyYXN0cnVjdHVyZQorLy8gaGFzIGJlZW4gY29tcGxldGVkLgorZXh0ZXJuICJDIiB2b2lkICBfX2RiZ190YXJnZXRfc29fbG9hZGVkKCk7CisKKy8vIENhbGxlZCBieSB0aGUgb2ZmbG9hZCBydW50aW1lIHdoZW4gdGhlIG9mZmxvYWQgaW5mcmFzdHJ1Y3R1cmUgaXMgYWJvdXQgdG8gYmUKKy8vIHNodXQgZG93biwgY3VycmVudGx5IGF0IGFwcGxpY2F0aW9uIGV4aXQuCitleHRlcm4gIkMiIHZvaWQgIF9fZGJnX3RhcmdldF9zb191bmxvYWRlZCgpOworCisvLyBOdWxsLXRlcm1pbmF0ZWQgc3RyaW5nIGNvbnRhaW5pbmcgcGF0aCB0byB0aGUgcHJvY2VzcyBpbWFnZSBvZiB0aGUgaG9zdGluZworLy8gYXBwbGljYXRpb24gKG9mZmxvYWRfbWFpbikKKyNkZWZpbmUgTUFYX1RBUkdFVF9OQU1FIDUxMgorZXh0ZXJuICJDIiBjaGFyICBfX2RiZ190YXJnZXRfZXhlX25hbWVbTUFYX1RBUkdFVF9OQU1FXTsKKworLy8gSW50ZWdlciBzcGVjaWZ5aW5nIHRoZSBwcm9jZXNzIGlkCitleHRlcm4gIkMiIHBpZF90IF9fZGJnX3RhcmdldF9zb19waWQ7CisKKy8vIEludGVnZXIgc3BlY2lmeWluZyB0aGUgMC1iYXNlZCBkZXZpY2UgbnVtYmVyCitleHRlcm4gIkMiIGludCAgIF9fZGJnX3RhcmdldF9pZDsKKworLy8gU2V0IHRvIG5vbi16ZXJvIGJ5IHRoZSBob3N0LXNpZGUgZGVidWdnZXIgdG8gZW5hYmxlIG9mZmxvYWQgZGVidWdnaW5nCisvLyBzdXBwb3J0CitleHRlcm4gIkMiIGludCAgIF9fZGJnX2lzX2F0dGFjaGVkOworCisvLyBNYWpvciB2ZXJzaW9uIG9mIHRoZSBkZWJ1Z2dlciBzdXBwb3J0IEFQSQorZXh0ZXJuICJDIiBjb25zdCBpbnQgX19kYmdfYXBpX21ham9yX3ZlcnNpb247CisKKy8vIE1pbm9yIHZlcnNpb24gb2YgdGhlIGRlYnVnZ2VyIHN1cHBvcnQgQVBJCitleHRlcm4gIkMiIGNvbnN0IGludCBfX2RiZ19hcGlfbWlub3JfdmVyc2lvbjsKKworI2VuZGlmIC8vIE9GRkxPQURfSE9TVF9IX0lOQ0xVREVECmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX215b19ob3N0LmNwcCBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfbXlvX2hvc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMWMxODYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX215b19ob3N0LmNwcApAQCAtMCwwICsxLDgwNSBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAib2ZmbG9hZF9teW9faG9zdC5oIgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSAib2ZmbG9hZF9ob3N0LmgiCisKKyNpZiBkZWZpbmVkKExJTlVYKSB8fCBkZWZpbmVkKEZSRUVCU0QpCisjaW5jbHVkZSA8bW1fbWFsbG9jLmg+CisjZW5kaWYKKworI2RlZmluZSBNWU9fVkVSU0lPTjEgICAgIk1ZT18xLjAiCisKK2V4dGVybiAiQyIgdm9pZCBfX2NpbGtydHNfY2lsa19mb3JfMzIodm9pZCosIHZvaWQqLCB1aW50MzJfdCwgaW50MzJfdCk7CitleHRlcm4gIkMiIHZvaWQgX19jaWxrcnRzX2NpbGtfZm9yXzY0KHZvaWQqLCB2b2lkKiwgdWludDY0X3QsIGludDMyX3QpOworCisjaWZuZGVmIFRBUkdFVF9XSU5OVAorI3ByYWdtYSB3ZWFrIF9fY2lsa3J0c19jaWxrX2Zvcl8zMgorI3ByYWdtYSB3ZWFrIF9fY2lsa3J0c19jaWxrX2Zvcl82NAorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCisjaWZkZWYgVEFSR0VUX1dJTk5UCisjZGVmaW5lIE1ZT19UQUJMRV9FTkRfTUFSS0VSKCkgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oLTEpCisjZWxzZSAvLyBUQVJHRVRfV0lOTlQKKyNkZWZpbmUgTVlPX1RBQkxFX0VORF9NQVJLRVIoKSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigwKQorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCitjbGFzcyBNeW9XcmFwcGVyIHsKK3B1YmxpYzoKKyAgICBNeW9XcmFwcGVyKCkgOiBtX2xpYl9oYW5kbGUoMCksIG1faXNfYXZhaWxhYmxlKGZhbHNlKQorICAgIHt9CisKKyAgICBib29sIGlzX2F2YWlsYWJsZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1faXNfYXZhaWxhYmxlOworICAgIH0KKworICAgIGJvb2wgTG9hZExpYnJhcnkodm9pZCk7CisKKyAgICAvLyB1bmxvYWRzIHRoZSBsaWJyYXJ5CisgICAgdm9pZCBVbmxvYWRMaWJyYXJ5KHZvaWQpIHsKKy8vICAgICAgICBpZiAobV9saWJfaGFuZGxlICE9IDApIHsKKy8vICAgICAgICAgICAgRExfY2xvc2UobV9saWJfaGFuZGxlKTsKKy8vICAgICAgICAgICAgbV9saWJfaGFuZGxlID0gMDsKKy8vICAgICAgICB9CisgICAgfQorCisgICAgLy8gV3JhcHBlcnMgZm9yIE1ZTyBjbGllbnQgZnVuY3Rpb25zCisgICAgdm9pZCBMaWJJbml0KHZvaWQgKmFyZywgdm9pZCAqZnVuYykgY29uc3QgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoNCwgMCwgY19vZmZsb2FkX215b2luaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMoJXAsICVwKVxuIiwgX19mdW5jX18sIGFyZywgZnVuYyk7CisgICAgICAgIENoZWNrUmVzdWx0KF9fZnVuY19fLCBtX2xpYl9pbml0KGFyZywgZnVuYykpOworICAgIH0KKworICAgIHZvaWQgTGliRmluaSh2b2lkKSBjb25zdCB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0VfMSg0LCAwLCBjX29mZmxvYWRfbXlvZmluaSwgIiVzKClcbiIsIF9fZnVuY19fKTsKKyAgICAgICAgbV9saWJfZmluaSgpOworICAgIH0KKworICAgIHZvaWQqIFNoYXJlZE1hbGxvYyhzaXplX3Qgc2l6ZSkgY29uc3QgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoNCwgMCwgY19vZmZsb2FkX215b3NoYXJlZG1hbGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyglbGxkKVxuIiwgX19mdW5jX18sIHNpemUpOworICAgICAgICByZXR1cm4gbV9zaGFyZWRfbWFsbG9jKHNpemUpOworICAgIH0KKworICAgIHZvaWQgU2hhcmVkRnJlZSh2b2lkICpwdHIpIGNvbnN0IHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKDQsIDAsIGNfb2ZmbG9hZF9teW9zaGFyZWRmcmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCVwKVxuIiwgX19mdW5jX18sIHB0cik7CisgICAgICAgIG1fc2hhcmVkX2ZyZWUocHRyKTsKKyAgICB9CisKKyAgICB2b2lkKiBTaGFyZWRBbGlnbmVkTWFsbG9jKHNpemVfdCBzaXplLCBzaXplX3QgYWxpZ24pIGNvbnN0IHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKDQsIDAsIGNfb2ZmbG9hZF9teW9zaGFyZWRhbGlnbmVkbWFsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCVsbGQsICVsbGQpXG4iLCBfX2Z1bmNfXywgc2l6ZSwgYWxpZ24pOworICAgICAgICByZXR1cm4gbV9zaGFyZWRfYWxpZ25lZF9tYWxsb2Moc2l6ZSwgYWxpZ24pOworICAgIH0KKworICAgIHZvaWQgU2hhcmVkQWxpZ25lZEZyZWUodm9pZCAqcHRyKSBjb25zdCB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0VfMSg0LCAwLCBjX29mZmxvYWRfbXlvc2hhcmVkYWxpZ25lZGZyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMoJXApXG4iLCBfX2Z1bmNfXywgcHRyKTsKKyAgICAgICAgbV9zaGFyZWRfYWxpZ25lZF9mcmVlKHB0cik7CisgICAgfQorCisgICAgdm9pZCBBY3F1aXJlKHZvaWQpIGNvbnN0IHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKDQsIDAsIGNfb2ZmbG9hZF9teW9hY3F1aXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKClcbiIsIF9fZnVuY19fKTsKKyAgICAgICAgQ2hlY2tSZXN1bHQoX19mdW5jX18sIG1fYWNxdWlyZSgpKTsKKyAgICB9CisKKyAgICB2b2lkIFJlbGVhc2Uodm9pZCkgY29uc3QgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoNCwgMCwgY19vZmZsb2FkX215b3JlbGVhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKClcbiIsIF9fZnVuY19fKTsKKyAgICAgICAgQ2hlY2tSZXN1bHQoX19mdW5jX18sIG1fcmVsZWFzZSgpKTsKKyAgICB9CisKKyAgICB2b2lkIEhvc3RWYXJUYWJsZVByb3BhZ2F0ZSh2b2lkICp0YWJsZSwgaW50IG51bV9lbnRyaWVzKSBjb25zdCB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoNCwgIiVzKCVwLCAlZClcbiIsIF9fZnVuY19fLCB0YWJsZSwgbnVtX2VudHJpZXMpOworICAgICAgICBDaGVja1Jlc3VsdChfX2Z1bmNfXywgbV9ob3N0X3Zhcl90YWJsZV9wcm9wYWdhdGUodGFibGUsIG51bV9lbnRyaWVzKSk7CisgICAgfQorCisgICAgdm9pZCBIb3N0RnB0clRhYmxlUmVnaXN0ZXIodm9pZCAqdGFibGUsIGludCBudW1fZW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3JkZXJlZCkgY29uc3QgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoNCwgMCwgY19vZmZsb2FkX215b3JlZ2lzdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyglcCwgJWQsICVkKVxuIiwgX19mdW5jX18sIHRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9lbnRyaWVzLCBvcmRlcmVkKTsKKyAgICAgICAgQ2hlY2tSZXN1bHQoX19mdW5jX18sCisgICAgICAgICAgICAgICAgICAgIG1faG9zdF9mcHRyX3RhYmxlX3JlZ2lzdGVyKHRhYmxlLCBudW1fZW50cmllcywgb3JkZXJlZCkpOworICAgIH0KKworICAgIHZvaWQgUmVtb3RlVGh1bmtDYWxsKHZvaWQgKnRodW5rLCB2b2lkICphcmdzLCBpbnQgZGV2aWNlKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoNCwgIiVzKCVwLCAlcCwgJWQpXG4iLCBfX2Z1bmNfXywgdGh1bmssIGFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKTsKKyAgICAgICAgQ2hlY2tSZXN1bHQoX19mdW5jX18sIG1fcmVtb3RlX3RodW5rX2NhbGwodGh1bmssIGFyZ3MsIGRldmljZSkpOworICAgIH0KKworICAgIE15b2lSRnVuY0NhbGxIYW5kbGUgUmVtb3RlQ2FsbChjaGFyICpmdW5jLCB2b2lkICphcmdzLCBpbnQgZGV2aWNlKSBjb25zdCB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoNCwgIiVzKCVzLCAlcCwgJWQpXG4iLCBfX2Z1bmNfXywgZnVuYywgYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UpOworICAgICAgICByZXR1cm4gbV9yZW1vdGVfY2FsbChmdW5jLCBhcmdzLCBkZXZpY2UpOworICAgIH0KKworICAgIHZvaWQgR2V0UmVzdWx0KE15b2lSRnVuY0NhbGxIYW5kbGUgaGFuZGxlKSBjb25zdCB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoNCwgIiVzKCVwKVxuIiwgX19mdW5jX18sIGhhbmRsZSk7CisgICAgICAgIENoZWNrUmVzdWx0KF9fZnVuY19fLCBtX2dldF9yZXN1bHQoaGFuZGxlKSk7CisgICAgfQorCitwcml2YXRlOgorICAgIHZvaWQgQ2hlY2tSZXN1bHQoY29uc3QgY2hhciAqZnVuYywgTXlvRXJyb3IgZXJyb3IpIGNvbnN0IHsKKyAgICAgICAgaWYgKGVycm9yICE9IE1ZT19TVUNDRVNTKSB7CisgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX215b3dyYXBwZXJfY2hlY2tyZXN1bHQsIGZ1bmMsIGVycm9yKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICB9CisKK3ByaXZhdGU6CisgICAgdm9pZCogbV9saWJfaGFuZGxlOworICAgIGJvb2wgIG1faXNfYXZhaWxhYmxlOworCisgICAgLy8gcG9pbnRlcnMgdG8gZnVuY3Rpb25zIGZyb20gbXlvIGxpYnJhcnkKKyAgICBNeW9FcnJvciAoKm1fbGliX2luaXQpKHZvaWQqLCB2b2lkKik7CisgICAgdm9pZCAgICAgKCptX2xpYl9maW5pKSh2b2lkKTsKKyAgICB2b2lkKiAgICAoKm1fc2hhcmVkX21hbGxvYykoc2l6ZV90KTsKKyAgICB2b2lkICAgICAoKm1fc2hhcmVkX2ZyZWUpKHZvaWQqKTsKKyAgICB2b2lkKiAgICAoKm1fc2hhcmVkX2FsaWduZWRfbWFsbG9jKShzaXplX3QsIHNpemVfdCk7CisgICAgdm9pZCAgICAgKCptX3NoYXJlZF9hbGlnbmVkX2ZyZWUpKHZvaWQqKTsKKyAgICBNeW9FcnJvciAoKm1fYWNxdWlyZSkodm9pZCk7CisgICAgTXlvRXJyb3IgKCptX3JlbGVhc2UpKHZvaWQpOworICAgIE15b0Vycm9yICgqbV9ob3N0X3Zhcl90YWJsZV9wcm9wYWdhdGUpKHZvaWQqLCBpbnQpOworICAgIE15b0Vycm9yICgqbV9ob3N0X2ZwdHJfdGFibGVfcmVnaXN0ZXIpKHZvaWQqLCBpbnQsIGludCk7CisgICAgTXlvRXJyb3IgKCptX3JlbW90ZV90aHVua19jYWxsKSh2b2lkKiwgdm9pZCosIGludCk7CisgICAgTXlvaVJGdW5jQ2FsbEhhbmRsZSAoKm1fcmVtb3RlX2NhbGwpKGNoYXIqLCB2b2lkKiwgaW50KTsKKyAgICBNeW9FcnJvciAoKm1fZ2V0X3Jlc3VsdCkoTXlvaVJGdW5jQ2FsbEhhbmRsZSk7Cit9OworCitib29sIE15b1dyYXBwZXI6OkxvYWRMaWJyYXJ5KHZvaWQpCit7CisjaWZuZGVmIFRBUkdFVF9XSU5OVAorICAgIGNvbnN0IGNoYXIgKmxpYl9uYW1lID0gImxpYm15by1jbGllbnQuc28iOworI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCisgICAgY29uc3QgY2hhciAqbGliX25hbWUgPSAibXlvLWNsaWVudC5kbGwiOworI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiTG9hZGluZyBNWU8gbGlicmFyeSAlcyAuLi5cbiIsIGxpYl9uYW1lKTsKKworICAgIG1fbGliX2hhbmRsZSA9IERMX29wZW4obGliX25hbWUpOworICAgIGlmIChtX2xpYl9oYW5kbGUgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gbG9hZCB0aGUgbGlicmFyeS4gZXJybm8gPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJubyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtX2xpYl9pbml0ID0gKE15b0Vycm9yICgqKSh2b2lkKiwgdm9pZCopKQorICAgICAgICBETF9zeW0obV9saWJfaGFuZGxlLCAibXlvaUxpYkluaXQiLCBNWU9fVkVSU0lPTjEpOworICAgIGlmIChtX2xpYl9pbml0ID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gTVlPIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm15b2lMaWJJbml0Iik7CisgICAgICAgIFVubG9hZExpYnJhcnkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1fbGliX2ZpbmkgPSAodm9pZCAoKikodm9pZCkpCisgICAgICAgIERMX3N5bShtX2xpYl9oYW5kbGUsICJteW9pTGliRmluaSIsIE1ZT19WRVJTSU9OMSk7CisgICAgaWYgKG1fbGliX2ZpbmkgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBNWU8gbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXlvaUxpYkZpbmkiKTsKKyAgICAgICAgVW5sb2FkTGlicmFyeSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbV9zaGFyZWRfbWFsbG9jID0gKHZvaWQqICgqKShzaXplX3QpKQorICAgICAgICBETF9zeW0obV9saWJfaGFuZGxlLCAibXlvU2hhcmVkTWFsbG9jIiwgTVlPX1ZFUlNJT04xKTsKKyAgICBpZiAobV9zaGFyZWRfbWFsbG9jID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gTVlPIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm15b1NoYXJlZE1hbGxvYyIpOworICAgICAgICBVbmxvYWRMaWJyYXJ5KCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtX3NoYXJlZF9mcmVlID0gKHZvaWQgKCopKHZvaWQqKSkKKyAgICAgICAgRExfc3ltKG1fbGliX2hhbmRsZSwgIm15b1NoYXJlZEZyZWUiLCBNWU9fVkVSU0lPTjEpOworICAgIGlmIChtX3NoYXJlZF9mcmVlID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gTVlPIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm15b1NoYXJlZEZyZWUiKTsKKyAgICAgICAgVW5sb2FkTGlicmFyeSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbV9zaGFyZWRfYWxpZ25lZF9tYWxsb2MgPSAodm9pZCogKCopKHNpemVfdCwgc2l6ZV90KSkKKyAgICAgICAgRExfc3ltKG1fbGliX2hhbmRsZSwgIm15b1NoYXJlZEFsaWduZWRNYWxsb2MiLCBNWU9fVkVSU0lPTjEpOworICAgIGlmIChtX3NoYXJlZF9hbGlnbmVkX21hbGxvYyA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIE1ZTyBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJteW9TaGFyZWRBbGlnbmVkTWFsbG9jIik7CisgICAgICAgIFVubG9hZExpYnJhcnkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1fc2hhcmVkX2FsaWduZWRfZnJlZSA9ICh2b2lkICgqKSh2b2lkKikpCisgICAgICAgIERMX3N5bShtX2xpYl9oYW5kbGUsICJteW9TaGFyZWRBbGlnbmVkRnJlZSIsIE1ZT19WRVJTSU9OMSk7CisgICAgaWYgKG1fc2hhcmVkX2FsaWduZWRfZnJlZSA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIE1ZTyBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJteW9TaGFyZWRBbGlnbmVkRnJlZSIpOworICAgICAgICBVbmxvYWRMaWJyYXJ5KCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtX2FjcXVpcmUgPSAoTXlvRXJyb3IgKCopKHZvaWQpKQorICAgICAgICBETF9zeW0obV9saWJfaGFuZGxlLCAibXlvQWNxdWlyZSIsIE1ZT19WRVJTSU9OMSk7CisgICAgaWYgKG1fYWNxdWlyZSA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIE1ZTyBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJteW9BY3F1aXJlIik7CisgICAgICAgIFVubG9hZExpYnJhcnkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1fcmVsZWFzZSA9IChNeW9FcnJvciAoKikodm9pZCkpCisgICAgICAgIERMX3N5bShtX2xpYl9oYW5kbGUsICJteW9SZWxlYXNlIiwgTVlPX1ZFUlNJT04xKTsKKyAgICBpZiAobV9yZWxlYXNlID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gTVlPIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm15b1JlbGVhc2UiKTsKKyAgICAgICAgVW5sb2FkTGlicmFyeSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbV9ob3N0X3Zhcl90YWJsZV9wcm9wYWdhdGUgPSAoTXlvRXJyb3IgKCopKHZvaWQqLCBpbnQpKQorICAgICAgICBETF9zeW0obV9saWJfaGFuZGxlLCAibXlvaUhvc3RWYXJUYWJsZVByb3BhZ2F0ZSIsIE1ZT19WRVJTSU9OMSk7CisgICAgaWYgKG1faG9zdF92YXJfdGFibGVfcHJvcGFnYXRlID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gTVlPIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm15b2lIb3N0VmFyVGFibGVQcm9wYWdhdGUiKTsKKyAgICAgICAgVW5sb2FkTGlicmFyeSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbV9ob3N0X2ZwdHJfdGFibGVfcmVnaXN0ZXIgPSAoTXlvRXJyb3IgKCopKHZvaWQqLCBpbnQsIGludCkpCisgICAgICAgIERMX3N5bShtX2xpYl9oYW5kbGUsICJteW9pSG9zdEZwdHJUYWJsZVJlZ2lzdGVyIiwgTVlPX1ZFUlNJT04xKTsKKyAgICBpZiAobV9ob3N0X2ZwdHJfdGFibGVfcmVnaXN0ZXIgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBNWU8gbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXlvaUhvc3RGcHRyVGFibGVSZWdpc3RlciIpOworICAgICAgICBVbmxvYWRMaWJyYXJ5KCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtX3JlbW90ZV90aHVua19jYWxsID0gKE15b0Vycm9yICgqKSh2b2lkKiwgdm9pZCosIGludCkpCisgICAgICAgIERMX3N5bShtX2xpYl9oYW5kbGUsICJteW9pUmVtb3RlVGh1bmtDYWxsIiwgTVlPX1ZFUlNJT04xKTsKKyAgICBpZiAobV9yZW1vdGVfdGh1bmtfY2FsbCA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIE1ZTyBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJteW9pUmVtb3RlVGh1bmtDYWxsIik7CisgICAgICAgIFVubG9hZExpYnJhcnkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1fcmVtb3RlX2NhbGwgPSAoTXlvaVJGdW5jQ2FsbEhhbmRsZSAoKikoY2hhciosIHZvaWQqLCBpbnQpKQorICAgICAgICBETF9zeW0obV9saWJfaGFuZGxlLCAibXlvaVJlbW90ZUNhbGwiLCBNWU9fVkVSU0lPTjEpOworICAgIGlmIChtX3JlbW90ZV9jYWxsID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gTVlPIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm15b2lSZW1vdGVDYWxsIik7CisgICAgICAgIFVubG9hZExpYnJhcnkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1fZ2V0X3Jlc3VsdCA9IChNeW9FcnJvciAoKikoTXlvaVJGdW5jQ2FsbEhhbmRsZSkpCisgICAgICAgIERMX3N5bShtX2xpYl9oYW5kbGUsICJteW9pR2V0UmVzdWx0IiwgTVlPX1ZFUlNJT04xKTsKKyAgICBpZiAobV9nZXRfcmVzdWx0ID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gTVlPIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm15b2lHZXRSZXN1bHQiKTsKKyAgICAgICAgVW5sb2FkTGlicmFyeSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiVGhlIGxpYnJhcnkgd2FzIHN1Y2Nlc3NmdWxseSBsb2FkZWRcbiIpOworCisgICAgbV9pc19hdmFpbGFibGUgPSB0cnVlOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIG15b19pc19hdmFpbGFibGU7CitzdGF0aWMgTXlvV3JhcHBlciBteW9fd3JhcHBlcjsKKworc3RydWN0IE15b1RhYmxlCit7CisgICAgTXlvVGFibGUoU2hhcmVkVGFibGVFbnRyeSAqdGFiLCBpbnQgbGVuKSA6IHZhcl90YWIodGFiKSwgdmFyX3RhYl9sZW4obGVuKQorICAgIHt9CisKKyAgICBTaGFyZWRUYWJsZUVudHJ5KiAgIHZhcl90YWI7CisgICAgaW50ICAgICAgICAgICAgICAgICB2YXJfdGFiX2xlbjsKK307CisKK3R5cGVkZWYgc3RkOjpsaXN0PE15b1RhYmxlPiBNeW9UYWJsZUxpc3Q7CitzdGF0aWMgTXlvVGFibGVMaXN0IF9fbXlvX3RhYmxlX2xpc3Q7CitzdGF0aWMgbXV0ZXhfdCAgICAgIF9fbXlvX3RhYmxlX2xvY2s7CitzdGF0aWMgYm9vbCAgICAgICAgIF9fbXlvX3RhYmxlcyA9IGZhbHNlOworCitzdGF0aWMgdm9pZCBfX29mZmxvYWRfbXlvX3NoYXJlZF90YWJsZV9yZWdpc3RlcihTaGFyZWRUYWJsZUVudHJ5ICplbnRyeSk7CitzdGF0aWMgdm9pZCBfX29mZmxvYWRfbXlvX3NoYXJlZF9pbml0X3RhYmxlX3JlZ2lzdGVyKEluaXRUYWJsZUVudHJ5KiBlbnRyeSk7CitzdGF0aWMgdm9pZCBfX29mZmxvYWRfbXlvX2ZwdHJfdGFibGVfcmVnaXN0ZXIoRnB0clRhYmxlRW50cnkgKmVudHJ5KTsKKworc3RhdGljIHZvaWQgX19vZmZsb2FkX215b0xvYWRMaWJyYXJ5X29uY2Uodm9pZCkKK3sKKyAgICBpZiAoX19vZmZsb2FkX2luaXRfbGlicmFyeSgpKSB7CisgICAgICAgIG15b193cmFwcGVyLkxvYWRMaWJyYXJ5KCk7CisgICAgfQorfQorCitzdGF0aWMgYm9vbCBfX29mZmxvYWRfbXlvTG9hZExpYnJhcnkodm9pZCkKK3sKKyAgICBzdGF0aWMgT2ZmbG9hZE9uY2VDb250cm9sIGN0cmwgPSBPRkZMT0FEX09OQ0VfQ09OVFJPTF9JTklUOworICAgIF9fb2ZmbG9hZF9ydW5fb25jZSgmY3RybCwgX19vZmZsb2FkX215b0xvYWRMaWJyYXJ5X29uY2UpOworCisgICAgcmV0dXJuIG15b193cmFwcGVyLmlzX2F2YWlsYWJsZSgpOworfQorCitzdGF0aWMgdm9pZCBfX29mZmxvYWRfbXlvSW5pdF9vbmNlKHZvaWQpCit7CisgICAgaWYgKCFfX29mZmxvYWRfbXlvTG9hZExpYnJhcnkoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gaW5pdGlhbGl6ZSBhbGwgZGV2aWNlcworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWljX2VuZ2luZXNfdG90YWw7IGkrKykgeworICAgICAgICBtaWNfZW5naW5lc1tpXS5pbml0KCk7CisgICAgfQorCisgICAgLy8gbG9hZCBhbmQgaW5pdGlhbGl6ZSBNWU8gbGlicmFyeQorICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkluaXRpYWxpemluZyBNWU8gbGlicmFyeSAuLi5cbiIpOworCisgICAgQ09JRVZFTlQgZXZlbnRzW01JQ19FTkdJTkVTX01BWF07CisgICAgTXlvaVVzZXJQYXJhbXMgcGFyYW1zW01JQ19FTkdJTkVTX01BWCsxXTsKKworICAgIC8vIGxvYWQgdGFyZ2V0IGxpYnJhcnkgdG8gYWxsIGRldmljZXMKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1pY19lbmdpbmVzX3RvdGFsOyBpKyspIHsKKyAgICAgICAgbWljX2VuZ2luZXNbaV0uaW5pdF9teW8oJmV2ZW50c1tpXSk7CisKKyAgICAgICAgcGFyYW1zW2ldLnR5cGUgPSBNWU9JX1VTRVJQQVJBTVNfREVWSUQ7CisgICAgICAgIHBhcmFtc1tpXS5ub2RlaWQgPSBtaWNfZW5naW5lc1tpXS5nZXRfcGh5c2ljYWxfaW5kZXgoKSArIDE7CisgICAgfQorCisgICAgcGFyYW1zW21pY19lbmdpbmVzX3RvdGFsXS50eXBlID0gTVlPSV9VU0VSUEFSQU1TX0xBU1RfTVNHOworCisgICAgLy8gaW5pdGlhbGl6ZSBteW8gcnVudGltZSBvbiBob3N0CisgICAgbXlvX3dyYXBwZXIuTGliSW5pdChwYXJhbXMsIDApOworCisgICAgLy8gd2FpdCBmb3IgdGhlIHRhcmdldCBpbml0IGNhbGxzIHRvIGZpbmlzaAorICAgIENPSVJFU1VMVCByZXM7CisgICAgcmVzID0gQ09JOjpFdmVudFdhaXQobWljX2VuZ2luZXNfdG90YWwsIGV2ZW50cywgLTEsIDEsIDAsIDApOworICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2V2ZW50X3dhaXQsIHJlcyk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgbXlvX2lzX2F2YWlsYWJsZSA9IHRydWU7CisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJJbml0aWFsaXppbmcgTVlPIGxpYnJhcnkgLi4uIGRvbmVcbiIpOworfQorCitzdGF0aWMgYm9vbCBfX29mZmxvYWRfbXlvSW5pdCh2b2lkKQoreworICAgIHN0YXRpYyBPZmZsb2FkT25jZUNvbnRyb2wgY3RybCA9IE9GRkxPQURfT05DRV9DT05UUk9MX0lOSVQ7CisgICAgX19vZmZsb2FkX3J1bl9vbmNlKCZjdHJsLCBfX29mZmxvYWRfbXlvSW5pdF9vbmNlKTsKKworICAgIC8vIHJlZ2lzdGVyIHBlbmRpbmcgc2hhcmVkIHZhciB0YWJsZXMKKyAgICBpZiAobXlvX2lzX2F2YWlsYWJsZSAmJiBfX215b190YWJsZXMpIHsKKyAgICAgICAgbXV0ZXhfbG9ja2VyX3QgbG9ja2VyKF9fbXlvX3RhYmxlX2xvY2spOworCisgICAgICAgIGlmIChfX215b190YWJsZXMpIHsKKyAgICAgICAgICAgIC8vICBSZWdpc3RlciB0YWJsZXMgd2l0aCBNWU8gc28gaXQgY2FuIHByb3BhZ2F0ZSB0byB0YXJnZXQuCisgICAgICAgICAgICBmb3IoTXlvVGFibGVMaXN0Ojpjb25zdF9pdGVyYXRvciBpdCA9IF9fbXlvX3RhYmxlX2xpc3QuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBfX215b190YWJsZV9saXN0LmVuZCgpOyArK2l0KSB7CisjaWZkZWYgVEFSR0VUX1dJTk5UCisgICAgICAgICAgICAgICAgZm9yIChTaGFyZWRUYWJsZUVudHJ5ICplbnRyeSA9IGl0LT52YXJfdGFiOworICAgICAgICAgICAgICAgICAgICAgZW50cnktPnZhck5hbWUgIT0gTVlPX1RBQkxFX0VORF9NQVJLRVIoKTsgZW50cnkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnktPnZhck5hbWUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbXlvX3dyYXBwZXIuSG9zdFZhclRhYmxlUHJvcGFnYXRlKGVudHJ5LCAxKTsKKyAgICAgICAgICAgICAgICB9CisjZWxzZSAvLyBUQVJHRVRfV0lOTlQKKyAgICAgICAgICAgICAgICBteW9fd3JhcHBlci5Ib3N0VmFyVGFibGVQcm9wYWdhdGUoaXQtPnZhcl90YWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0LT52YXJfdGFiX2xlbik7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9fbXlvX3RhYmxlX2xpc3QuY2xlYXIoKTsKKyAgICAgICAgICAgIF9fbXlvX3RhYmxlcyA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG15b19pc19hdmFpbGFibGU7Cit9CisKK3N0YXRpYyBib29sIHNoYXJlZF90YWJsZV9lbnRyaWVzKAorICAgIFNoYXJlZFRhYmxlRW50cnkgKmVudHJ5CispCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXMoJXApXG4iLCBfX2Z1bmNfXywgZW50cnkpOworCisgICAgZm9yICg7IGVudHJ5LT52YXJOYW1lICE9IE1ZT19UQUJMRV9FTkRfTUFSS0VSKCk7IGVudHJ5KyspIHsKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyAgICAgICAgaWYgKGVudHJ5LT52YXJOYW1lID09IDApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBmcHRyX3RhYmxlX2VudHJpZXMoCisgICAgRnB0clRhYmxlRW50cnkgKmVudHJ5CispCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXMoJXApXG4iLCBfX2Z1bmNfXywgZW50cnkpOworCisgICAgZm9yICg7IGVudHJ5LT5mdW5jTmFtZSAhPSBNWU9fVEFCTEVfRU5EX01BUktFUigpOyBlbnRyeSsrKSB7CisjaWZkZWYgVEFSR0VUX1dJTk5UCisgICAgICAgIGlmIChlbnRyeS0+ZnVuY05hbWUgPT0gMCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBfX29mZmxvYWRfbXlvUmVnaXN0ZXJUYWJsZXMoCisgICAgSW5pdFRhYmxlRW50cnkqIGluaXRfdGFibGUsCisgICAgU2hhcmVkVGFibGVFbnRyeSAqc2hhcmVkX3RhYmxlLAorICAgIEZwdHJUYWJsZUVudHJ5ICpmcHRyX3RhYmxlCispCit7CisgICAgLy8gY2hlY2sgd2hldGhlciB3ZSBuZWVkIHRvIGluaXRpYWxpemUgTVlPIGxpYnJhcnkuIEl0IGlzCisgICAgLy8gaW5pdGlhbGl6ZWQgb25seSBpZiBhdCBsZWFzdCBvbmUgbXlvIHRhYmxlIGlzIG5vdCBlbXB0eQorICAgIGlmIChzaGFyZWRfdGFibGVfZW50cmllcyhzaGFyZWRfdGFibGUpIHx8IGZwdHJfdGFibGVfZW50cmllcyhmcHRyX3RhYmxlKSkgeworICAgICAgICAvLyBtYWtlIHN1cmUgbXlvIGxpYnJhcnkgaXMgbG9hZGVkCisgICAgICAgIF9fb2ZmbG9hZF9teW9Mb2FkTGlicmFyeSgpOworCisgICAgICAgIC8vIHJlZ2lzdGVyIHRhYmxlcworICAgICAgICBfX29mZmxvYWRfbXlvX3NoYXJlZF90YWJsZV9yZWdpc3RlcihzaGFyZWRfdGFibGUpOworICAgICAgICBfX29mZmxvYWRfbXlvX2ZwdHJfdGFibGVfcmVnaXN0ZXIoZnB0cl90YWJsZSk7CisgICAgICAgIF9fb2ZmbG9hZF9teW9fc2hhcmVkX2luaXRfdGFibGVfcmVnaXN0ZXIoaW5pdF90YWJsZSk7CisgICAgfQorfQorCit2b2lkIF9fb2ZmbG9hZF9teW9GaW5pKHZvaWQpCit7CisgICAgaWYgKG15b19pc19hdmFpbGFibGUpIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXNcbiIsIF9fZnVuY19fKTsKKworICAgICAgICBDT0lFVkVOVCBldmVudHNbTUlDX0VOR0lORVNfTUFYXTsKKworICAgICAgICAvLyBraWNrIG9mZiBteW9pTGliRmluaSBjYWxscyBvbiBhbGwgZGV2aWNlcworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1pY19lbmdpbmVzX3RvdGFsOyBpKyspIHsKKyAgICAgICAgICAgIG1pY19lbmdpbmVzW2ldLmZpbmlfbXlvKCZldmVudHNbaV0pOworICAgICAgICB9CisKKyAgICAgICAgLy8gY2xlYW51cCBteW8gcnVudGltZSBvbiBob3N0CisgICAgICAgIG15b193cmFwcGVyLkxpYkZpbmkoKTsKKworICAgICAgICAvLyB3YWl0IGZvciB0aGUgdGFyZ2V0IGZpbmkgY2FsbHMgdG8gZmluaXNoCisgICAgICAgIENPSVJFU1VMVCByZXM7CisgICAgICAgIHJlcyA9IENPSTo6RXZlbnRXYWl0KG1pY19lbmdpbmVzX3RvdGFsLCBldmVudHMsIC0xLCAxLCAwLCAwKTsKKyAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2V2ZW50X3dhaXQsIHJlcyk7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBfX29mZmxvYWRfbXlvX3NoYXJlZF90YWJsZV9yZWdpc3RlcigKKyAgICBTaGFyZWRUYWJsZUVudHJ5ICplbnRyeQorKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzKCVwKVxuIiwgX19mdW5jX18sIGVudHJ5KTsKKworICAgIFNoYXJlZFRhYmxlRW50cnkgKnN0YXJ0ID0gZW50cnk7CisgICAgaW50IGVudHJpZXMgPSAwOworCisgICAgLy8gYWxsb2NhdGUgc2hhcmVkIG1lbW9yeSBmb3IgdmFycworICAgIGZvciAoOyBlbnRyeS0+dmFyTmFtZSAhPSBNWU9fVEFCTEVfRU5EX01BUktFUigpOyBlbnRyeSsrKSB7CisjaWZkZWYgVEFSR0VUX1dJTk5UCisgICAgICAgIGlmIChlbnRyeS0+dmFyTmFtZSA9PSAwKSB7CisgICAgICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDQsICJza2lwIHJlZ2lzdGVyaW5nIGEgTlVMTCBNeW9TaGFyZWRUYWJsZSBlbnRyeVxuIik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoNCwgInJlZ2lzdGVyaW5nIE15b1NoYXJlZFRhYmxlIGVudHJ5IGZvciAlcyBAJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnktPnZhck5hbWUsIGVudHJ5KTsKKworICAgICAgICAvLyBJbnZva2UgdGhlIGZ1bmN0aW9uIHRvIGNyZWF0ZSBzaGFyZWQgbWVtb3J5CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCgqKSh2b2lkKT4oZW50cnktPnNoYXJlZEFkZHIpKCk7CisgICAgICAgIGVudHJpZXMrKzsKKyAgICB9CisKKyAgICAvLyBhbmQgdGFibGUgdG8gdGhlIGxpc3QgaWYgaXQgaXMgbm90IGVtcHR5CisgICAgaWYgKGVudHJpZXMgPiAwKSB7CisgICAgICAgIG11dGV4X2xvY2tlcl90IGxvY2tlcihfX215b190YWJsZV9sb2NrKTsKKyAgICAgICAgX19teW9fdGFibGVfbGlzdC5wdXNoX2JhY2soTXlvVGFibGUoc3RhcnQsIGVudHJpZXMpKTsKKyAgICAgICAgX19teW9fdGFibGVzID0gdHJ1ZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIF9fb2ZmbG9hZF9teW9fc2hhcmVkX2luaXRfdGFibGVfcmVnaXN0ZXIoSW5pdFRhYmxlRW50cnkqIGVudHJ5KQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzKCVwKVxuIiwgX19mdW5jX18sIGVudHJ5KTsKKworI2lmZGVmIFRBUkdFVF9XSU5OVAorICAgIGZvciAoOyBlbnRyeS0+ZnVuY05hbWUgIT0gTVlPX1RBQkxFX0VORF9NQVJLRVIoKTsgZW50cnkrKykgeworICAgICAgICBpZiAoZW50cnktPmZ1bmNOYW1lID09IDApIHsKKyAgICAgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoNCwgInNraXAgcmVnaXN0ZXJpbmcgYSBOVUxMIE15b1NoYXJlZEluaXQgZW50cnlcbiIpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyAgSW52b2tlIHRoZSBmdW5jdGlvbiB0byBpbml0IHRoZSBzaGFyZWQgbWVtb3J5CisgICAgICAgIGVudHJ5LT5mdW5jKCk7CisgICAgfQorI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCisgICAgZm9yICg7IGVudHJ5LT5mdW5jICE9IDA7IGVudHJ5KyspIHsKKyAgICAgICAgLy8gSW52b2tlIHRoZSBmdW5jdGlvbiB0byBpbml0IHRoZSBzaGFyZWQgbWVtb3J5CisgICAgICAgIGVudHJ5LT5mdW5jKCk7CisgICAgfQorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorfQorCitzdGF0aWMgdm9pZCBfX29mZmxvYWRfbXlvX2ZwdHJfdGFibGVfcmVnaXN0ZXIoCisgICAgRnB0clRhYmxlRW50cnkgKmVudHJ5CispCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXMoJXApXG4iLCBfX2Z1bmNfXywgZW50cnkpOworCisgICAgRnB0clRhYmxlRW50cnkgKnN0YXJ0ID0gZW50cnk7CisgICAgaW50IGVudHJpZXMgPSAwOworCisgICAgZm9yICg7IGVudHJ5LT5mdW5jTmFtZSAhPSBNWU9fVEFCTEVfRU5EX01BUktFUigpOyBlbnRyeSsrKSB7CisjaWZkZWYgVEFSR0VUX1dJTk5UCisgICAgICAgIGlmIChlbnRyeS0+ZnVuY05hbWUgPT0gMCkgeworICAgICAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSg0LCAic2tpcCByZWdpc3RlcmluZyBhIE5VTEwgTXlvRnB0clRhYmxlIGVudHJ5XG4iKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKyAgICAgICAgaWYgKCFteW9fd3JhcHBlci5pc19hdmFpbGFibGUoKSkgeworICAgICAgICAgICAgKihzdGF0aWNfY2FzdDx2b2lkKio+KGVudHJ5LT5sb2NhbFRodW5rQWRkcikpID0gZW50cnktPmZ1bmNBZGRyOworICAgICAgICB9CisKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSg0LCAicmVnaXN0ZXJpbmcgTXlvRnB0clRhYmxlIGVudHJ5IGZvciAlcyBAJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnktPmZ1bmNOYW1lLCBlbnRyeSk7CisKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyAgICAgICAgaWYgKG15b193cmFwcGVyLmlzX2F2YWlsYWJsZSgpKSB7CisgICAgICAgICAgICBteW9fd3JhcHBlci5Ib3N0RnB0clRhYmxlUmVnaXN0ZXIoZW50cnksIDEsIGZhbHNlKTsKKyAgICAgICAgfQorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCisgICAgICAgIGVudHJpZXMrKzsKKyAgICB9CisKKyNpZm5kZWYgVEFSR0VUX1dJTk5UCisgICAgaWYgKG15b193cmFwcGVyLmlzX2F2YWlsYWJsZSgpICYmIGVudHJpZXMgPiAwKSB7CisgICAgICAgIG15b193cmFwcGVyLkhvc3RGcHRyVGFibGVSZWdpc3RlcihzdGFydCwgZW50cmllcywgZmFsc2UpOworICAgIH0KKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKK30KKworZXh0ZXJuICJDIiBpbnQgX19vZmZsb2FkX215b0lzQXZhaWxhYmxlKGludCB0YXJnZXRfbnVtYmVyKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzKCVkKVxuIiwgX19mdW5jX18sIHRhcmdldF9udW1iZXIpOworCisgICAgaWYgKHRhcmdldF9udW1iZXIgPj0gLTIpIHsKKyAgICAgICAgYm9vbCBpc19kZWZhdWx0X251bWJlciA9ICh0YXJnZXRfbnVtYmVyID09IC0yKTsKKworICAgICAgICBpZiAoX19vZmZsb2FkX215b0luaXQoKSkgeworICAgICAgICAgICAgaWYgKHRhcmdldF9udW1iZXIgPj0gMCkgeworICAgICAgICAgICAgICAgIC8vIFVzZXIgcHJvdmlkZWQgdGhlIGRldmljZSBudW1iZXIKKyAgICAgICAgICAgICAgICBpbnQgbnVtID0gdGFyZ2V0X251bWJlciAlIG1pY19lbmdpbmVzX3RvdGFsOworCisgICAgICAgICAgICAgICAgLy8gcmVzZXJ2ZSBkZXZpY2UgaW4gT1JTTAorICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIgPSBPUlNMOjpyZXNlcnZlKG51bSkgPyBudW0gOiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHRyeSB0byB1c2UgZGV2aWNlIDAKKyAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyID0gT1JTTDo6cmVzZXJ2ZSgwKSA/IDAgOiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gbWFrZSBzdXJlIGRldmljZSBpcyBpbml0aWFsaXplZAorICAgICAgICAgICAgaWYgKHRhcmdldF9udW1iZXIgPj0gMCkgeworICAgICAgICAgICAgICAgIG1pY19lbmdpbmVzW3RhcmdldF9udW1iZXJdLmluaXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIGZhbGxiYWNrIHRvIENQVQorICAgICAgICAgICAgdGFyZ2V0X251bWJlciA9IC0xOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRhcmdldF9udW1iZXIgPCAwICYmICFpc19kZWZhdWx0X251bWJlcikgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2RldmljZV9pc19ub3RfYXZhaWxhYmxlKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19pbnZhbGlkX2RldmljZV9udW1iZXIpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIHJldHVybiB0YXJnZXRfbnVtYmVyOworfQorCitleHRlcm4gIkMiIHZvaWQgX19vZmZsb2FkX215b2lSZW1vdGVJVGh1bmtDYWxsKAorICAgIHZvaWQgKnRodW5rLAorICAgIHZvaWQgKmFyZywKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzKCVwLCAlcCwgJWQpXG4iLCBfX2Z1bmNfXywgdGh1bmssIGFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIpOworCisgICAgbXlvX3dyYXBwZXIuUmVsZWFzZSgpOworICAgIG15b193cmFwcGVyLlJlbW90ZVRodW5rQ2FsbCh0aHVuaywgYXJnLCB0YXJnZXRfbnVtYmVyKTsKKyAgICBteW9fd3JhcHBlci5BY3F1aXJlKCk7CisKKyAgICBPUlNMOjpyZWxlYXNlKHRhcmdldF9udW1iZXIpOworfQorCitleHRlcm4gIkMiIHZvaWQqIF9PZmZsb2FkX3NoYXJlZF9tYWxsb2Moc2l6ZV90IHNpemUpCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXMoJWxsZClcbiIsIF9fZnVuY19fLCBzaXplKTsKKworICAgIGlmIChfX29mZmxvYWRfbXlvTG9hZExpYnJhcnkoKSkgeworICAgICAgICByZXR1cm4gbXlvX3dyYXBwZXIuU2hhcmVkTWFsbG9jKHNpemUpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG1hbGxvYyhzaXplKTsKKyAgICB9Cit9CisKK2V4dGVybiAiQyIgdm9pZCBfT2ZmbG9hZF9zaGFyZWRfZnJlZSh2b2lkICpwdHIpCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXMoJXApXG4iLCBfX2Z1bmNfXywgcHRyKTsKKworICAgIGlmIChfX29mZmxvYWRfbXlvTG9hZExpYnJhcnkoKSkgeworICAgICAgICBteW9fd3JhcHBlci5TaGFyZWRGcmVlKHB0cik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBmcmVlKHB0cik7CisgICAgfQorfQorCitleHRlcm4gIkMiIHZvaWQqIF9PZmZsb2FkX3NoYXJlZF9hbGlnbmVkX21hbGxvYyhzaXplX3Qgc2l6ZSwgc2l6ZV90IGFsaWduKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzKCVsbGQsICVsbGQpXG4iLCBfX2Z1bmNfXywgc2l6ZSwgYWxpZ24pOworCisgICAgaWYgKF9fb2ZmbG9hZF9teW9Mb2FkTGlicmFyeSgpKSB7CisgICAgICAgIHJldHVybiBteW9fd3JhcHBlci5TaGFyZWRBbGlnbmVkTWFsbG9jKHNpemUsIGFsaWduKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmIChhbGlnbiA8IHNpemVvZih2b2lkKikpIHsKKyAgICAgICAgICAgIGFsaWduID0gc2l6ZW9mKHZvaWQqKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX21tX21hbGxvYyhzaXplLCBhbGlnbik7CisgICAgfQorfQorCitleHRlcm4gIkMiIHZvaWQgX09mZmxvYWRfc2hhcmVkX2FsaWduZWRfZnJlZSh2b2lkICpwdHIpCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXMoJXApXG4iLCBfX2Z1bmNfXywgcHRyKTsKKworICAgIGlmIChfX29mZmxvYWRfbXlvTG9hZExpYnJhcnkoKSkgeworICAgICAgICBteW9fd3JhcHBlci5TaGFyZWRBbGlnbmVkRnJlZShwdHIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX21tX2ZyZWUocHRyKTsKKyAgICB9Cit9CisKK2V4dGVybiAiQyIgdm9pZCBfX2ludGVsX2NpbGtfZm9yXzMyX29mZmxvYWQoCisgICAgaW50IHNpemUsCisgICAgdm9pZCAoKmNvcHlfY29uc3RydWN0b3IpKHZvaWQqLCB2b2lkKiksCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgdm9pZCAqcmFkZHIsCisgICAgdm9pZCAqY2xvc3VyZV9vYmplY3QsCisgICAgdW5zaWduZWQgaW50IGl0ZXJzLAorICAgIHVuc2lnbmVkIGludCBncmFpbl9zaXplKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzXG4iLCBfX2Z1bmNfXyk7CisKKyAgICB0YXJnZXRfbnVtYmVyID0gX19vZmZsb2FkX215b0lzQXZhaWxhYmxlKHRhcmdldF9udW1iZXIpOworICAgIGlmICh0YXJnZXRfbnVtYmVyID49IDApIHsKKyAgICAgICAgc3RydWN0IFMgeworICAgICAgICAgICAgdm9pZCAqTTE7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgTTI7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgTTM7CisgICAgICAgICAgICBjaGFyIGNsb3N1cmVbXTsKKyAgICAgICAgfSAqYXJnczsKKworICAgICAgICBhcmdzID0gKHN0cnVjdCBTKikgX09mZmxvYWRfc2hhcmVkX21hbGxvYyhzaXplb2Yoc3RydWN0IFMpICsgc2l6ZSk7CisgICAgICAgIGFyZ3MtPk0xID0gcmFkZHI7CisgICAgICAgIGFyZ3MtPk0yID0gaXRlcnM7CisgICAgICAgIGFyZ3MtPk0zID0gZ3JhaW5fc2l6ZTsKKworICAgICAgICBpZiAoY29weV9jb25zdHJ1Y3RvciA9PSAwKSB7CisgICAgICAgICAgICBtZW1jcHkoYXJncy0+Y2xvc3VyZSwgY2xvc3VyZV9vYmplY3QsIHNpemUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY29weV9jb25zdHJ1Y3RvcihhcmdzLT5jbG9zdXJlLCBjbG9zdXJlX29iamVjdCk7CisgICAgICAgIH0KKworICAgICAgICBteW9fd3JhcHBlci5SZWxlYXNlKCk7CisgICAgICAgIG15b193cmFwcGVyLkdldFJlc3VsdCgKKyAgICAgICAgICAgIG15b193cmFwcGVyLlJlbW90ZUNhbGwoIl9faW50ZWxfY2lsa19mb3JfMzJfb2ZmbG9hZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MsIHRhcmdldF9udW1iZXIpCisgICAgICAgICk7CisgICAgICAgIG15b193cmFwcGVyLkFjcXVpcmUoKTsKKworICAgICAgICBfT2ZmbG9hZF9zaGFyZWRfZnJlZShhcmdzKTsKKworICAgICAgICBPUlNMOjpyZWxlYXNlKHRhcmdldF9udW1iZXIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19jaWxrcnRzX2NpbGtfZm9yXzMyKHJhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc3VyZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYWluX3NpemUpOworICAgIH0KK30KKworZXh0ZXJuICJDIiB2b2lkIF9faW50ZWxfY2lsa19mb3JfNjRfb2ZmbG9hZCgKKyAgICBpbnQgc2l6ZSwKKyAgICB2b2lkICgqY29weV9jb25zdHJ1Y3Rvcikodm9pZCosIHZvaWQqKSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICB2b2lkICpyYWRkciwKKyAgICB2b2lkICpjbG9zdXJlX29iamVjdCwKKyAgICB1aW50NjRfdCBpdGVycywKKyAgICB1aW50NjRfdCBncmFpbl9zaXplKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzXG4iLCBfX2Z1bmNfXyk7CisKKyAgICB0YXJnZXRfbnVtYmVyID0gX19vZmZsb2FkX215b0lzQXZhaWxhYmxlKHRhcmdldF9udW1iZXIpOworICAgIGlmICh0YXJnZXRfbnVtYmVyID49IDApIHsKKyAgICAgICAgc3RydWN0IFMgeworICAgICAgICAgICAgdm9pZCAqTTE7CisgICAgICAgICAgICB1aW50NjRfdCBNMjsKKyAgICAgICAgICAgIHVpbnQ2NF90IE0zOworICAgICAgICAgICAgY2hhciBjbG9zdXJlW107CisgICAgICAgIH0gKmFyZ3M7CisKKyAgICAgICAgYXJncyA9IChzdHJ1Y3QgUyopIF9PZmZsb2FkX3NoYXJlZF9tYWxsb2Moc2l6ZW9mKHN0cnVjdCBTKSArIHNpemUpOworICAgICAgICBhcmdzLT5NMSA9IHJhZGRyOworICAgICAgICBhcmdzLT5NMiA9IGl0ZXJzOworICAgICAgICBhcmdzLT5NMyA9IGdyYWluX3NpemU7CisKKyAgICAgICAgaWYgKGNvcHlfY29uc3RydWN0b3IgPT0gMCkgeworICAgICAgICAgICAgbWVtY3B5KGFyZ3MtPmNsb3N1cmUsIGNsb3N1cmVfb2JqZWN0LCBzaXplKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGNvcHlfY29uc3RydWN0b3IoYXJncy0+Y2xvc3VyZSwgY2xvc3VyZV9vYmplY3QpOworICAgICAgICB9CisKKyAgICAgICAgbXlvX3dyYXBwZXIuUmVsZWFzZSgpOworICAgICAgICBteW9fd3JhcHBlci5HZXRSZXN1bHQoCisgICAgICAgICAgICBteW9fd3JhcHBlci5SZW1vdGVDYWxsKCJfX2ludGVsX2NpbGtfZm9yXzY0X29mZmxvYWQiLCBhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyKQorICAgICAgICApOworICAgICAgICBteW9fd3JhcHBlci5BY3F1aXJlKCk7CisKKyAgICAgICAgX09mZmxvYWRfc2hhcmVkX2ZyZWUoYXJncyk7CisKKyAgICAgICAgT1JTTDo6cmVsZWFzZSh0YXJnZXRfbnVtYmVyKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIF9fY2lsa3J0c19jaWxrX2Zvcl82NChyYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3N1cmVfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFpbl9zaXplKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX215b19ob3N0LmggYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX215b19ob3N0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJhNjFmNAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfbXlvX2hvc3QuaApAQCAtMCwwICsxLDgwIEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgT0ZGTE9BRF9NWU9fSE9TVF9IX0lOQ0xVREVECisjZGVmaW5lIE9GRkxPQURfTVlPX0hPU1RfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8bXlvdHlwZXMuaD4KKyNpbmNsdWRlIDxteW9pbXBsLmg+CisjaW5jbHVkZSA8bXlvLmg+CisjaW5jbHVkZSAib2ZmbG9hZC5oIgorCit0eXBlZGVmIE15b2lTaGFyZWRWYXJFbnRyeSAgICAgIFNoYXJlZFRhYmxlRW50cnk7CisvL3R5cGVkZWYgTXlvaUhvc3RTaGFyZWRGcHRyRW50cnkgRnB0clRhYmxlRW50cnk7Cit0eXBlZGVmIHN0cnVjdCB7CisgICAgLy8hIEZ1bmN0aW9uIE5hbWUKKyAgICBjb25zdCBjaGFyICpmdW5jTmFtZTsKKyAgICAvLyEgRnVuY3Rpb24gQWRkcmVzcworICAgIHZvaWQgKmZ1bmNBZGRyOworICAgIC8vISBMb2NhbCBUaHVuayBBZGRyZXNzCisgICAgdm9pZCAqbG9jYWxUaHVua0FkZHI7CisjaWZkZWYgVEFSR0VUX1dJTk5UCisgICAgLy8gRHVtbXkgdG8gcGFkIHVwIHRvIDMyIGJ5dGVzCisgICAgdm9pZCAqZHVtbXk7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCit9IEZwdHJUYWJsZUVudHJ5OworCitzdHJ1Y3QgSW5pdFRhYmxlRW50cnkgeworI2lmZGVmIFRBUkdFVF9XSU5OVAorICAgIC8vIER1bW15IHRvIHBhZCB1cCB0byAxNiBieXRlcworICAgIC8vIEZ1bmN0aW9uIE5hbWUKKyAgICBjb25zdCBjaGFyICpmdW5jTmFtZTsKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKyAgICB2b2lkICgqZnVuYykodm9pZCk7Cit9OworCisjaWZkZWYgVEFSR0VUX1dJTk5UCisjZGVmaW5lIE9GRkxPQURfTVlPX1NIQVJFRF9UQUJMRV9TRUNUSU9OX1NUQVJUICAgICAgICAgICIuTXlvU2hhcmVkVGFibGUkYSIKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fU0hBUkVEX1RBQkxFX1NFQ1RJT05fRU5EICAgICAgICAgICAgIi5NeW9TaGFyZWRUYWJsZSR6IgorCisjZGVmaW5lIE9GRkxPQURfTVlPX1NIQVJFRF9JTklUX1RBQkxFX1NFQ1RJT05fU1RBUlQgICAgICIuTXlvU2hhcmVkSW5pdFRhYmxlJGEiCisjZGVmaW5lIE9GRkxPQURfTVlPX1NIQVJFRF9JTklUX1RBQkxFX1NFQ1RJT05fRU5EICAgICAgICIuTXlvU2hhcmVkSW5pdFRhYmxlJHoiCisKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fRlBUUl9UQUJMRV9TRUNUSU9OX1NUQVJUICAgICAgICAgICAgIi5NeW9GcHRyVGFibGUkYSIKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fRlBUUl9UQUJMRV9TRUNUSU9OX0VORCAgICAgICAgICAgICAgIi5NeW9GcHRyVGFibGUkeiIKKyNlbHNlICAvLyBUQVJHRVRfV0lOTlQKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fU0hBUkVEX1RBQkxFX1NFQ1RJT05fU1RBUlQgICAgICAgICAgIi5NeW9TaGFyZWRUYWJsZS4iCisjZGVmaW5lIE9GRkxPQURfTVlPX1NIQVJFRF9UQUJMRV9TRUNUSU9OX0VORCAgICAgICAgICAgICIuTXlvU2hhcmVkVGFibGUuIgorCisjZGVmaW5lIE9GRkxPQURfTVlPX1NIQVJFRF9JTklUX1RBQkxFX1NFQ1RJT05fU1RBUlQgICAgICIuTXlvU2hhcmVkSW5pdFRhYmxlLiIKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fU0hBUkVEX0lOSVRfVEFCTEVfU0VDVElPTl9FTkQgICAgICAgIi5NeW9TaGFyZWRJbml0VGFibGUuIgorCisjZGVmaW5lIE9GRkxPQURfTVlPX0ZQVFJfVEFCTEVfU0VDVElPTl9TVEFSVCAgICAgICAgICAgICIuTXlvRnB0clRhYmxlLiIKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fRlBUUl9UQUJMRV9TRUNUSU9OX0VORCAgICAgICAgICAgICAgIi5NeW9GcHRyVGFibGUuIgorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCisjcHJhZ21hIHNlY3Rpb24oT0ZGTE9BRF9NWU9fU0hBUkVEX1RBQkxFX1NFQ1RJT05fU1RBUlQsIHJlYWQsIHdyaXRlKQorI3ByYWdtYSBzZWN0aW9uKE9GRkxPQURfTVlPX1NIQVJFRF9UQUJMRV9TRUNUSU9OX0VORCwgcmVhZCwgd3JpdGUpCisKKyNwcmFnbWEgc2VjdGlvbihPRkZMT0FEX01ZT19TSEFSRURfSU5JVF9UQUJMRV9TRUNUSU9OX1NUQVJULCByZWFkLCB3cml0ZSkKKyNwcmFnbWEgc2VjdGlvbihPRkZMT0FEX01ZT19TSEFSRURfSU5JVF9UQUJMRV9TRUNUSU9OX0VORCwgcmVhZCwgd3JpdGUpCisKKyNwcmFnbWEgc2VjdGlvbihPRkZMT0FEX01ZT19GUFRSX1RBQkxFX1NFQ1RJT05fU1RBUlQsIHJlYWQsIHdyaXRlKQorI3ByYWdtYSBzZWN0aW9uKE9GRkxPQURfTVlPX0ZQVFJfVEFCTEVfU0VDVElPTl9FTkQsIHJlYWQsIHdyaXRlKQorCitleHRlcm4gIkMiIHZvaWQgX19vZmZsb2FkX215b1JlZ2lzdGVyVGFibGVzKAorICAgIEluaXRUYWJsZUVudHJ5ICppbml0X3RhYmxlLAorICAgIFNoYXJlZFRhYmxlRW50cnkgKnNoYXJlZF90YWJsZSwKKyAgICBGcHRyVGFibGVFbnRyeSAqZnB0cl90YWJsZQorKTsKKworZXh0ZXJuIHZvaWQgX19vZmZsb2FkX215b0Zpbmkodm9pZCk7CisKKyNlbmRpZiAvLyBPRkZMT0FEX01ZT19IT1NUX0hfSU5DTFVERUQKZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfbXlvX3RhcmdldC5jcHAgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX215b190YXJnZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYjFjNGYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX215b190YXJnZXQuY3BwCkBAIC0wLDAgKzEsMTg0IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJvZmZsb2FkX215b190YXJnZXQuaCIKKyNpbmNsdWRlICJvZmZsb2FkX3RhcmdldC5oIgorCitleHRlcm4gIkMiIHZvaWQgX19jaWxrcnRzX2NpbGtfZm9yXzMyKHZvaWQqLCB2b2lkKiwgdWludDMyX3QsIGludDMyX3QpOworZXh0ZXJuICJDIiB2b2lkIF9fY2lsa3J0c19jaWxrX2Zvcl82NCh2b2lkKiwgdm9pZCosIHVpbnQ2NF90LCBpbnQzMl90KTsKKworI3ByYWdtYSB3ZWFrIF9fY2lsa3J0c19jaWxrX2Zvcl8zMgorI3ByYWdtYSB3ZWFrIF9fY2lsa3J0c19jaWxrX2Zvcl82NAorCitzdGF0aWMgdm9pZCBDaGVja1Jlc3VsdChjb25zdCBjaGFyICpmdW5jLCBNeW9FcnJvciBlcnJvcikgeworICAgIGlmIChlcnJvciAhPSBNWU9fU1VDQ0VTUykgeworICAgICAgIExJQk9GRkxPQURfRVJST1IoY19teW90YXJnZXRfY2hlY2tyZXN1bHQsIGZ1bmMsIGVycm9yKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIF9fb2ZmbG9hZF9teW9fc2hhcmVkX3RhYmxlX3JlZ2lzdGVyKFNoYXJlZFRhYmxlRW50cnkgKmVudHJ5KQoreworICAgIGludCBlbnRyaWVzID0gMDsKKyAgICBTaGFyZWRUYWJsZUVudHJ5ICp0X3N0YXJ0OworCisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXMoJXApXG4iLCBfX2Z1bmNfXywgZW50cnkpOworCisgICAgdF9zdGFydCA9IGVudHJ5OworICAgIHdoaWxlICh0X3N0YXJ0LT52YXJOYW1lICE9IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKDQsIDAsIGNfb2ZmbG9hZF9taWNfbXlvX3NoYXJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJteW8gc2hhcmVkIGVudHJ5IG5hbWUgPSBcIiVzXCIgYWRkciA9ICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdGFydC0+dmFyTmFtZSwgdF9zdGFydC0+c2hhcmVkQWRkcik7CisgICAgICAgIHRfc3RhcnQrKzsKKyAgICAgICAgZW50cmllcysrOworICAgIH0KKworICAgIGlmIChlbnRyaWVzID4gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICJteW9pTWljVmFyVGFibGVSZWdpc3RlciglcCwgJWQpXG4iLCBlbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyaWVzKTsKKyAgICAgICAgQ2hlY2tSZXN1bHQoIm15b2lNaWNWYXJUYWJsZVJlZ2lzdGVyIiwKKyAgICAgICAgICAgICAgICAgICAgbXlvaU1pY1ZhclRhYmxlUmVnaXN0ZXIoZW50cnksIGVudHJpZXMpKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIF9fb2ZmbG9hZF9teW9fZnB0cl90YWJsZV9yZWdpc3RlcigKKyAgICBGcHRyVGFibGVFbnRyeSAqZW50cnkKKykKK3sKKyAgICBpbnQgZW50cmllcyA9IDA7CisgICAgRnB0clRhYmxlRW50cnkgKnRfc3RhcnQ7CisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlcyglcClcbiIsIF9fZnVuY19fLCBlbnRyeSk7CisKKyAgICB0X3N0YXJ0ID0gZW50cnk7CisgICAgd2hpbGUgKHRfc3RhcnQtPmZ1bmNOYW1lICE9IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKDQsIDAsIGNfb2ZmbG9hZF9taWNfbXlvX2ZwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXlvIGZwdHIgZW50cnkgbmFtZSA9IFwiJXNcIiBhZGRyID0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0YXJ0LT5mdW5jTmFtZSwgdF9zdGFydC0+ZnVuY0FkZHIpOworICAgICAgICB0X3N0YXJ0Kys7CisgICAgICAgIGVudHJpZXMrKzsKKyAgICB9CisKKyAgICBpZiAoZW50cmllcyA+IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAibXlvaVRhcmdldEZwdHJUYWJsZVJlZ2lzdGVyKCVwLCAlZCwgMClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnksIGVudHJpZXMpOworICAgICAgICBDaGVja1Jlc3VsdCgibXlvaVRhcmdldEZwdHJUYWJsZVJlZ2lzdGVyIiwKKyAgICAgICAgICAgICAgICAgICAgbXlvaVRhcmdldEZwdHJUYWJsZVJlZ2lzdGVyKGVudHJ5LCBlbnRyaWVzLCAwKSk7CisgICAgfQorfQorCitleHRlcm4gIkMiIHZvaWQgX19vZmZsb2FkX215b0FjcXVpcmUodm9pZCkKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlc1xuIiwgX19mdW5jX18pOworICAgIENoZWNrUmVzdWx0KCJteW9BY3F1aXJlIiwgbXlvQWNxdWlyZSgpKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIF9fb2ZmbG9hZF9teW9SZWxlYXNlKHZvaWQpCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXNcbiIsIF9fZnVuY19fKTsKKyAgICBDaGVja1Jlc3VsdCgibXlvUmVsZWFzZSIsIG15b1JlbGVhc2UoKSk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBfX2ludGVsX2NpbGtfZm9yXzMyX29mZmxvYWRfd3JhcHBlcih2b2lkICphcmdzXykKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlc1xuIiwgX19mdW5jX18pOworCisgICAgc3RydWN0IFMgeworICAgICAgICB2b2lkICpNMTsKKyAgICAgICAgdW5zaWduZWQgaW50IE0yOworICAgICAgICB1bnNpZ25lZCBpbnQgTTM7CisgICAgICAgIGNoYXIgY2xvc3VyZVtdOworICAgIH0gKmFyZ3MgPSAoc3RydWN0IFMqKSBhcmdzXzsKKworICAgIF9fY2lsa3J0c19jaWxrX2Zvcl8zMihhcmdzLT5NMSwgYXJncy0+Y2xvc3VyZSwgYXJncy0+TTIsIGFyZ3MtPk0zKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIF9faW50ZWxfY2lsa19mb3JfNjRfb2ZmbG9hZF93cmFwcGVyKHZvaWQgKmFyZ3NfKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzXG4iLCBfX2Z1bmNfXyk7CisKKyAgICBzdHJ1Y3QgUyB7CisgICAgICAgIHZvaWQgKk0xOworICAgICAgICB1aW50NjRfdCBNMjsKKyAgICAgICAgdWludDY0X3QgTTM7CisgICAgICAgIGNoYXIgY2xvc3VyZVtdOworICAgIH0gKmFyZ3MgPSAoc3RydWN0IFMqKSBhcmdzXzsKKworICAgIF9fY2lsa3J0c19jaWxrX2Zvcl82NChhcmdzLT5NMSwgYXJncy0+Y2xvc3VyZSwgYXJncy0+TTIsIGFyZ3MtPk0zKTsKK30KKworc3RhdGljIHZvaWQgX19vZmZsb2FkX215b19vbmNlX2luaXQodm9pZCkKK3sKKyAgICBDaGVja1Jlc3VsdCgibXlvaVJlbW90ZUZ1bmNSZWdpc3RlciIsCisgICAgICAgICAgICAgICAgbXlvaVJlbW90ZUZ1bmNSZWdpc3RlcigKKyAgICAgICAgICAgICAgICAgICAgKE15b2lSZW1vdGVGdW5jVHlwZSkgX19pbnRlbF9jaWxrX2Zvcl8zMl9vZmZsb2FkX3dyYXBwZXIsCisgICAgICAgICAgICAgICAgICAgICJfX2ludGVsX2NpbGtfZm9yXzMyX29mZmxvYWQiKSk7CisgICAgQ2hlY2tSZXN1bHQoIm15b2lSZW1vdGVGdW5jUmVnaXN0ZXIiLAorICAgICAgICAgICAgICAgIG15b2lSZW1vdGVGdW5jUmVnaXN0ZXIoCisgICAgICAgICAgICAgICAgICAgIChNeW9pUmVtb3RlRnVuY1R5cGUpIF9faW50ZWxfY2lsa19mb3JfNjRfb2ZmbG9hZF93cmFwcGVyLAorICAgICAgICAgICAgICAgICAgICAiX19pbnRlbF9jaWxrX2Zvcl82NF9vZmZsb2FkIikpOworfQorCitleHRlcm4gIkMiIHZvaWQgX19vZmZsb2FkX215b1JlZ2lzdGVyVGFibGVzKAorICAgIFNoYXJlZFRhYmxlRW50cnkgKnNoYXJlZF90YWJsZSwKKyAgICBGcHRyVGFibGVFbnRyeSAqZnB0cl90YWJsZQorKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzXG4iLCBfX2Z1bmNfXyk7CisKKyAgICAvLyBvbmUgdGltZSByZWdpc3RyYXRpb24gb2YgSW50ZWwoUikgQ2lsayhUTSkgbGFuZ3VhZ2UgZW50cmllcworICAgIHN0YXRpYyBwdGhyZWFkX29uY2VfdCBvbmNlX2NvbnRyb2wgPSBQVEhSRUFEX09OQ0VfSU5JVDsKKyAgICBwdGhyZWFkX29uY2UoJm9uY2VfY29udHJvbCwgX19vZmZsb2FkX215b19vbmNlX2luaXQpOworCisgICAgLy8gcmVnaXN0ZXIgbW9kdWxlJ3MgdGFibGVzCisgICAgaWYgKHNoYXJlZF90YWJsZS0+dmFyTmFtZSA9PSAwICYmIGZwdHJfdGFibGUtPmZ1bmNOYW1lID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIF9fb2ZmbG9hZF9teW9fc2hhcmVkX3RhYmxlX3JlZ2lzdGVyKHNoYXJlZF90YWJsZSk7CisgICAgX19vZmZsb2FkX215b19mcHRyX3RhYmxlX3JlZ2lzdGVyKGZwdHJfdGFibGUpOworfQorCitleHRlcm4gIkMiIHZvaWQqIF9PZmZsb2FkX3NoYXJlZF9tYWxsb2Moc2l6ZV90IHNpemUpCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXMoJWxsZClcbiIsIF9fZnVuY19fLCBzaXplKTsKKyAgICByZXR1cm4gbXlvU2hhcmVkTWFsbG9jKHNpemUpOworfQorCitleHRlcm4gIkMiIHZvaWQgX09mZmxvYWRfc2hhcmVkX2ZyZWUodm9pZCAqcHRyKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzKCVwKVxuIiwgX19mdW5jX18sIHB0cik7CisgICAgbXlvU2hhcmVkRnJlZShwdHIpOworfQorCitleHRlcm4gIkMiIHZvaWQqIF9PZmZsb2FkX3NoYXJlZF9hbGlnbmVkX21hbGxvYyhzaXplX3Qgc2l6ZSwgc2l6ZV90IGFsaWduKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzKCVsbGQsICVsbGQpXG4iLCBfX2Z1bmNfXywgc2l6ZSwgYWxpZ24pOworICAgIHJldHVybiBteW9TaGFyZWRBbGlnbmVkTWFsbG9jKHNpemUsIGFsaWduKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIF9PZmZsb2FkX3NoYXJlZF9hbGlnbmVkX2ZyZWUodm9pZCAqcHRyKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzKCVwKVxuIiwgX19mdW5jX18sIHB0cik7CisgICAgbXlvU2hhcmVkQWxpZ25lZEZyZWUocHRyKTsKK30KKworLy8gdGVtcG9yYXJ5IHdvcmthcm91bmQgZm9yIGJsb2NraW5nIGJlaGF2aW9yIG9mIG15b2lMaWJJbml0L0ZpbmkgY2FsbHMKK2V4dGVybiAiQyIgdm9pZCBfX29mZmxvYWRfbXlvTGliSW5pdCgpCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXMoKVxuIiwgX19mdW5jX18pOworICAgIENoZWNrUmVzdWx0KCJteW9pTGliSW5pdCIsIG15b2lMaWJJbml0KDAsIDApKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIF9fb2ZmbG9hZF9teW9MaWJGaW5pKCkKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisgICAgbXlvaUxpYkZpbmkoKTsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfbXlvX3RhcmdldC5oIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9teW9fdGFyZ2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI3Zjc4OQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfbXlvX3RhcmdldC5oCkBAIC0wLDAgKzEsNTQgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBPRkZMT0FEX01ZT19UQVJHRVRfSF9JTkNMVURFRAorI2RlZmluZSBPRkZMT0FEX01ZT19UQVJHRVRfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8bXlvdHlwZXMuaD4KKyNpbmNsdWRlIDxteW9pbXBsLmg+CisjaW5jbHVkZSA8bXlvLmg+CisjaW5jbHVkZSAib2ZmbG9hZC5oIgorCit0eXBlZGVmIE15b2lTaGFyZWRWYXJFbnRyeSAgICAgICAgICBTaGFyZWRUYWJsZUVudHJ5OwordHlwZWRlZiBNeW9pVGFyZ2V0U2hhcmVkRnB0ckVudHJ5ICAgRnB0clRhYmxlRW50cnk7CisKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fU0hBUkVEX1RBQkxFX1NFQ1RJT05fU1RBUlQgICAgICAgICAgIi5NeW9TaGFyZWRUYWJsZSRhIgorI2RlZmluZSBPRkZMT0FEX01ZT19TSEFSRURfVEFCTEVfU0VDVElPTl9FTkQgICAgICAgICAgICAiLk15b1NoYXJlZFRhYmxlJHoiCisKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fRlBUUl9UQUJMRV9TRUNUSU9OX1NUQVJUICAgICAgICAgICAgIi5NeW9GcHRyVGFibGUkYSIKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fRlBUUl9UQUJMRV9TRUNUSU9OX0VORCAgICAgICAgICAgICAgIi5NeW9GcHRyVGFibGUkeiIKKyNlbHNlICAvLyBUQVJHRVRfV0lOTlQKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fU0hBUkVEX1RBQkxFX1NFQ1RJT05fU1RBUlQgICAgICAgICAgIi5NeW9TaGFyZWRUYWJsZS4iCisjZGVmaW5lIE9GRkxPQURfTVlPX1NIQVJFRF9UQUJMRV9TRUNUSU9OX0VORCAgICAgICAgICAgICIuTXlvU2hhcmVkVGFibGUuIgorCisjZGVmaW5lIE9GRkxPQURfTVlPX0ZQVFJfVEFCTEVfU0VDVElPTl9TVEFSVCAgICAgICAgICAgICIuTXlvRnB0clRhYmxlLiIKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fRlBUUl9UQUJMRV9TRUNUSU9OX0VORCAgICAgICAgICAgICAgIi5NeW9GcHRyVGFibGUuIgorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCisjcHJhZ21hIHNlY3Rpb24oT0ZGTE9BRF9NWU9fU0hBUkVEX1RBQkxFX1NFQ1RJT05fU1RBUlQsIHJlYWQsIHdyaXRlKQorI3ByYWdtYSBzZWN0aW9uKE9GRkxPQURfTVlPX1NIQVJFRF9UQUJMRV9TRUNUSU9OX0VORCwgcmVhZCwgd3JpdGUpCisKKyNwcmFnbWEgc2VjdGlvbihPRkZMT0FEX01ZT19GUFRSX1RBQkxFX1NFQ1RJT05fU1RBUlQsIHJlYWQsIHdyaXRlKQorI3ByYWdtYSBzZWN0aW9uKE9GRkxPQURfTVlPX0ZQVFJfVEFCTEVfU0VDVElPTl9FTkQsIHJlYWQsIHdyaXRlKQorCitleHRlcm4gIkMiIHZvaWQgX19vZmZsb2FkX215b1JlZ2lzdGVyVGFibGVzKAorICAgIFNoYXJlZFRhYmxlRW50cnkgKnNoYXJlZF90YWJsZSwKKyAgICBGcHRyVGFibGVFbnRyeSAqZnB0cl90YWJsZQorKTsKKworZXh0ZXJuICJDIiB2b2lkIF9fb2ZmbG9hZF9teW9BY3F1aXJlKHZvaWQpOworZXh0ZXJuICJDIiB2b2lkIF9fb2ZmbG9hZF9teW9SZWxlYXNlKHZvaWQpOworCisvLyB0ZW1wb3Jhcnkgd29ya2Fyb3VuZCBmb3IgYmxvY2tpbmcgYmVoYXZpb3IgZm9yIG15b2lMaWJJbml0L0ZpbmkgY2FsbHMKK2V4dGVybiAiQyIgdm9pZCBfX29mZmxvYWRfbXlvTGliSW5pdCgpOworZXh0ZXJuICJDIiB2b2lkIF9fb2ZmbG9hZF9teW9MaWJGaW5pKCk7CisKKyNlbmRpZiAvLyBPRkZMT0FEX01ZT19UQVJHRVRfSF9JTkNMVURFRApkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9vbXBfaG9zdC5jcHAgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX29tcF9ob3N0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGQ0NDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9vbXBfaG9zdC5jcHAKQEAgLTAsMCArMSw4NTEgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgPG9tcC5oPgorI2luY2x1ZGUgIm9mZmxvYWQuaCIKKyNpbmNsdWRlICJjb21waWxlcl9pZl9ob3N0LmgiCisKKy8vIE9wZW5NUCBBUEkKKwordm9pZCBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlKGludCBudW0pCit7CisgICAgaWYgKG51bSA+PSAwKSB7CisgICAgICAgIF9fb21wX2RldmljZV9udW0gPSBudW07CisgICAgfQorfQorCitpbnQgb21wX2dldF9kZWZhdWx0X2RldmljZSh2b2lkKQoreworICAgIHJldHVybiBfX29tcF9kZXZpY2VfbnVtOworfQorCitpbnQgb21wX2dldF9udW1fZGV2aWNlcygpCit7CisgICAgX19vZmZsb2FkX2luaXRfbGlicmFyeSgpOworICAgIHJldHVybiBtaWNfZW5naW5lc190b3RhbDsKK30KKworLy8gT3Blbk1QIEFQSSB3cmFwcGVycworCitzdGF0aWMgdm9pZCBvbXBfc2V0X2ludF90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IHNldHRpbmcsCisgICAgY29uc3QgY2hhciogZl9uYW1lCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZfbmFtZSwgMCk7CisgICAgaWYgKG9mbGQpIHsKKyAgICAgICAgVmFyRGVzYyB2YXJzWzFdID0gezB9OworCisgICAgICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICAgICAgdmFyc1swXS5zaXplID0gc2l6ZW9mKGludCk7CisgICAgICAgIHZhcnNbMF0uY291bnQgPSAxOworICAgICAgICB2YXJzWzBdLnB0ciA9ICZzZXR0aW5nOworCisgICAgICAgIE9GRkxPQURfT0ZGTE9BRChvZmxkLCBmX25hbWUsIDAsIDEsIHZhcnMsIE5VTEwsIDAsIDAsIDApOworICAgIH0KK30KKworc3RhdGljIGludCBvbXBfZ2V0X2ludF90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgY29uc3QgY2hhciAqIGZfbmFtZQorKQoreworICAgIGludCBzZXR0aW5nID0gMDsKKworICAgIE9GRkxPQUQgb2ZsZCA9IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmX25hbWUsIDApOworICAgIGlmIChvZmxkKSB7CisgICAgICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKworICAgICAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgICAgICB2YXJzWzBdLnNpemUgPSBzaXplb2YoaW50KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gJnNldHRpbmc7CisKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsIGZfbmFtZSwgMCwgMSwgdmFycywgTlVMTCwgMCwgMCwgMCk7CisgICAgfQorICAgIHJldHVybiBzZXR0aW5nOworfQorCit2b2lkIG9tcF9zZXRfbnVtX3RocmVhZHNfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBudW1fdGhyZWFkcworKQoreworICAgIG9tcF9zZXRfaW50X3RhcmdldCh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgbnVtX3RocmVhZHMsCisgICAgICAgICAgICAgICAgICAgICAgICJvbXBfc2V0X251bV90aHJlYWRzX3RhcmdldCIpOworfQorCitpbnQgb21wX2dldF9tYXhfdGhyZWFkc190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICByZXR1cm4gb21wX2dldF9pbnRfdGFyZ2V0KHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9tcF9nZXRfbWF4X3RocmVhZHNfdGFyZ2V0Iik7Cit9CisKK2ludCBvbXBfZ2V0X251bV9wcm9jc190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICByZXR1cm4gb21wX2dldF9pbnRfdGFyZ2V0KHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9tcF9nZXRfbnVtX3Byb2NzX3RhcmdldCIpOworfQorCit2b2lkIG9tcF9zZXRfZHluYW1pY190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IG51bV90aHJlYWRzCispCit7CisgICAgb21wX3NldF9pbnRfdGFyZ2V0KHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCBudW1fdGhyZWFkcywKKyAgICAgICAgICAgICAgICAgICAgICAgIm9tcF9zZXRfZHluYW1pY190YXJnZXQiKTsKK30KKworaW50IG9tcF9nZXRfZHluYW1pY190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICByZXR1cm4gb21wX2dldF9pbnRfdGFyZ2V0KHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9tcF9nZXRfZHluYW1pY190YXJnZXQiKTsKK30KKwordm9pZCBvbXBfc2V0X25lc3RlZF90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IG5lc3RlZAorKQoreworICAgIG9tcF9zZXRfaW50X3RhcmdldCh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgbmVzdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAib21wX3NldF9uZXN0ZWRfdGFyZ2V0Iik7Cit9CisKK2ludCBvbXBfZ2V0X25lc3RlZF90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICByZXR1cm4gb21wX2dldF9pbnRfdGFyZ2V0KHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9tcF9nZXRfbmVzdGVkX3RhcmdldCIpOworfQorCit2b2lkIG9tcF9zZXRfc2NoZWR1bGVfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9zY2hlZF90IGtpbmQsCisgICAgaW50IG1vZGlmaWVyCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAwKTsKKyAgICBpZiAob2ZsZCAhPSAwKSB7CisgICAgICAgIFZhckRlc2MgdmFyc1syXSA9IHswfTsKKworICAgICAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgICAgIHZhcnNbMF0uc2l6ZSA9IHNpemVvZihvbXBfc2NoZWRfdCk7CisgICAgICAgIHZhcnNbMF0uY291bnQgPSAxOworICAgICAgICB2YXJzWzBdLnB0ciA9ICZraW5kOworCisgICAgICAgIHZhcnNbMV0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMV0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMV0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICAgICAgdmFyc1sxXS5zaXplID0gc2l6ZW9mKGludCk7CisgICAgICAgIHZhcnNbMV0uY291bnQgPSAxOworICAgICAgICB2YXJzWzFdLnB0ciA9ICZtb2RpZmllcjsKKworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgIm9tcF9zZXRfc2NoZWR1bGVfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDIsIHZhcnMsIE5VTEwsIDAsIDAsIDApOworICAgIH0KK30KKwordm9pZCBvbXBfZ2V0X3NjaGVkdWxlX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfc2NoZWRfdCAqa2luZCwKKyAgICBpbnQgKm1vZGlmaWVyCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAwKTsKKyAgICBpZiAob2ZsZCAhPSAwKSB7CisgICAgICAgIFZhckRlc2MgdmFyc1syXSA9IHswfTsKKworICAgICAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgICAgICB2YXJzWzBdLnNpemUgPSBzaXplb2Yob21wX3NjaGVkX3QpOworICAgICAgICB2YXJzWzBdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1swXS5wdHIgPSBraW5kOworCisgICAgICAgIHZhcnNbMV0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMV0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMV0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgICAgIHZhcnNbMV0uc2l6ZSA9IHNpemVvZihpbnQpOworICAgICAgICB2YXJzWzFdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1sxXS5wdHIgPSBtb2RpZmllcjsKKworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgIm9tcF9nZXRfc2NoZWR1bGVfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDIsIHZhcnMsIE5VTEwsIDAsIDAsIDApOworICAgIH0KK30KKworLy8gbG9jayBBUEkgZnVuY3Rpb25zCisKK3ZvaWQgb21wX2luaXRfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX2xvY2tfdGFyZ2V0X3QgKmxvY2sKKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIDApOworICAgIGlmIChvZmxkICE9IDApIHsKKyAgICAgICAgVmFyRGVzYyB2YXJzWzFdID0gezB9OworCisgICAgICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgICAgIHZhcnNbMF0uc2l6ZSA9IHNpemVvZihvbXBfbG9ja190YXJnZXRfdCk7CisgICAgICAgIHZhcnNbMF0uY291bnQgPSAxOworICAgICAgICB2YXJzWzBdLnB0ciA9IGxvY2s7CisKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsICJvbXBfaW5pdF9sb2NrX3RhcmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAxLCB2YXJzLCBOVUxMLCAwLCAwLCAwKTsKKyAgICB9Cit9CisKK3ZvaWQgb21wX2Rlc3Ryb3lfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX2xvY2tfdGFyZ2V0X3QgKmxvY2sKKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIDApOworICAgIGlmIChvZmxkICE9IDApIHsKKyAgICAgICAgVmFyRGVzYyB2YXJzWzFdID0gezB9OworCisgICAgICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICAgICAgdmFyc1swXS5zaXplID0gc2l6ZW9mKG9tcF9sb2NrX3RhcmdldF90KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gbG9jazsKKworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgIm9tcF9kZXN0cm95X2xvY2tfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDEsIHZhcnMsIE5VTEwsIDAsIDAsIDApOworICAgIH0KK30KKwordm9pZCBvbXBfc2V0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9sb2NrX3RhcmdldF90ICpsb2NrCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAwKTsKKyAgICBpZiAob2ZsZCAhPSAwKSB7CisgICAgICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKworICAgICAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW5vdXQ7CisgICAgICAgIHZhcnNbMF0uc2l6ZSA9IHNpemVvZihvbXBfbG9ja190YXJnZXRfdCk7CisgICAgICAgIHZhcnNbMF0uY291bnQgPSAxOworICAgICAgICB2YXJzWzBdLnB0ciA9IGxvY2s7CisKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsICJvbXBfc2V0X2xvY2tfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDEsIHZhcnMsIE5VTEwsIDAsIDAsIDApOworICAgIH0KK30KKwordm9pZCBvbXBfdW5zZXRfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX2xvY2tfdGFyZ2V0X3QgKmxvY2sKKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIDApOworICAgIGlmIChvZmxkICE9IDApIHsKKyAgICAgICAgVmFyRGVzYyB2YXJzWzFdID0gezB9OworCisgICAgICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbm91dDsKKyAgICAgICAgdmFyc1swXS5zaXplID0gc2l6ZW9mKG9tcF9sb2NrX3RhcmdldF90KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gbG9jazsKKworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgIm9tcF91bnNldF9sb2NrX3RhcmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAxLCB2YXJzLCBOVUxMLCAwLCAwLCAwKTsKKyAgICB9Cit9CisKK2ludCBvbXBfdGVzdF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbG9ja190YXJnZXRfdCAqbG9jaworKQoreworICAgIGludCByZXN1bHQgPSAwOworCisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAwKTsKKyAgICBpZiAob2ZsZCAhPSAwKSB7CisgICAgICAgIFZhckRlc2MgdmFyc1syXSA9IHswfTsKKworICAgICAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW5vdXQ7CisgICAgICAgIHZhcnNbMF0uc2l6ZSA9IHNpemVvZihvbXBfbG9ja190YXJnZXRfdCk7CisgICAgICAgIHZhcnNbMF0uY291bnQgPSAxOworICAgICAgICB2YXJzWzBdLnB0ciA9IGxvY2s7CisKKyAgICAgICAgdmFyc1sxXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1sxXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1sxXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICAgICAgdmFyc1sxXS5zaXplID0gc2l6ZW9mKGludCk7CisgICAgICAgIHZhcnNbMV0uY291bnQgPSAxOworICAgICAgICB2YXJzWzFdLnB0ciA9ICZyZXN1bHQ7CisKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsICJvbXBfdGVzdF9sb2NrX3RhcmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAyLCB2YXJzLCBOVUxMLCAwLCAwLCAwKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gbmVzdGVkIGxvY2sgQVBJIGZ1bmN0aW9ucworCit2b2lkIG9tcF9pbml0X25lc3RfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX25lc3RfbG9ja190YXJnZXRfdCAqbG9jaworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgMCk7CisgICAgaWYgKG9mbGQgIT0gMCkgeworICAgICAgICBWYXJEZXNjIHZhcnNbMV0gPSB7MH07CisKKyAgICAgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICAgICAgdmFyc1swXS5zaXplID0gc2l6ZW9mKG9tcF9uZXN0X2xvY2tfdGFyZ2V0X3QpOworICAgICAgICB2YXJzWzBdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1swXS5wdHIgPSBsb2NrOworCisgICAgICAgIE9GRkxPQURfT0ZGTE9BRChvZmxkLCAib21wX2luaXRfbmVzdF9sb2NrX3RhcmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAxLCB2YXJzLCBOVUxMLCAwLCAwLCAwKTsKKyAgICB9Cit9CisKK3ZvaWQgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbmVzdF9sb2NrX3RhcmdldF90ICpsb2NrCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAwKTsKKyAgICBpZiAob2ZsZCAhPSAwKSB7CisgICAgICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKworICAgICAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgICAgIHZhcnNbMF0uc2l6ZSA9IHNpemVvZihvbXBfbmVzdF9sb2NrX3RhcmdldF90KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gbG9jazsKKworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgIm9tcF9kZXN0cm95X25lc3RfbG9ja190YXJnZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgdmFycywgTlVMTCwgMCwgMCwgMCk7CisgICAgfQorfQorCit2b2lkIG9tcF9zZXRfbmVzdF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbmVzdF9sb2NrX3RhcmdldF90ICpsb2NrCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAwKTsKKyAgICBpZiAob2ZsZCAhPSAwKSB7CisgICAgICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKworICAgICAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW5vdXQ7CisgICAgICAgIHZhcnNbMF0uc2l6ZSA9IHNpemVvZihvbXBfbmVzdF9sb2NrX3RhcmdldF90KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gbG9jazsKKworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgIm9tcF9zZXRfbmVzdF9sb2NrX3RhcmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAxLCB2YXJzLCBOVUxMLCAwLCAwLCAwKTsKKyAgICB9Cit9CisKK3ZvaWQgb21wX3Vuc2V0X25lc3RfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX25lc3RfbG9ja190YXJnZXRfdCAqbG9jaworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgMCk7CisgICAgaWYgKG9mbGQgIT0gMCkgeworICAgICAgICBWYXJEZXNjIHZhcnNbMV0gPSB7MH07CisKKyAgICAgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2lub3V0OworICAgICAgICB2YXJzWzBdLnNpemUgPSBzaXplb2Yob21wX25lc3RfbG9ja190YXJnZXRfdCk7CisgICAgICAgIHZhcnNbMF0uY291bnQgPSAxOworICAgICAgICB2YXJzWzBdLnB0ciA9IGxvY2s7CisKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsICJvbXBfdW5zZXRfbmVzdF9sb2NrX3RhcmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAxLCB2YXJzLCBOVUxMLCAwLCAwLCAwKTsKKyAgICB9Cit9CisKK2ludCBvbXBfdGVzdF9uZXN0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9uZXN0X2xvY2tfdGFyZ2V0X3QgKmxvY2sKKykKK3sKKyAgICBpbnQgcmVzdWx0ID0gMDsKKworICAgIE9GRkxPQUQgb2ZsZCA9IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgMCk7CisgICAgaWYgKG9mbGQgIT0gMCkgeworICAgICAgICBWYXJEZXNjIHZhcnNbMl0gPSB7MH07CisKKyAgICAgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2lub3V0OworICAgICAgICB2YXJzWzBdLnNpemUgPSBzaXplb2Yob21wX25lc3RfbG9ja190YXJnZXRfdCk7CisgICAgICAgIHZhcnNbMF0uY291bnQgPSAxOworICAgICAgICB2YXJzWzBdLnB0ciA9IGxvY2s7CisKKyAgICAgICAgdmFyc1sxXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1sxXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1sxXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICAgICAgdmFyc1sxXS5zaXplID0gc2l6ZW9mKGludCk7CisgICAgICAgIHZhcnNbMV0uY291bnQgPSAxOworICAgICAgICB2YXJzWzFdLnB0ciA9ICZyZXN1bHQ7CisKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsICJvbXBfdGVzdF9uZXN0X2xvY2tfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDIsIHZhcnMsIE5VTEwsIDAsIDAsIDApOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvLyBrbXAgQVBJIGZ1bmN0aW9ucworCit2b2lkIGttcF9zZXRfc3RhY2tzaXplX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgc2l6ZQorKQoreworICAgIG9tcF9zZXRfaW50X3RhcmdldCh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgImttcF9zZXRfc3RhY2tzaXplX3RhcmdldCIpOworfQorCitpbnQga21wX2dldF9zdGFja3NpemVfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispCit7CisgICAgcmV0dXJuIG9tcF9nZXRfaW50X3RhcmdldCh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJrbXBfZ2V0X3N0YWNrc2l6ZV90YXJnZXQiKTsKK30KKwordm9pZCBrbXBfc2V0X3N0YWNrc2l6ZV9zX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBzaXplX3Qgc2l6ZQorKQoreworICAgIG9tcF9zZXRfaW50X3RhcmdldCh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgImttcF9zZXRfc3RhY2tzaXplX3NfdGFyZ2V0Iik7Cit9CisKK3NpemVfdCBrbXBfZ2V0X3N0YWNrc2l6ZV9zX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworICAgIHJldHVybiBvbXBfZ2V0X2ludF90YXJnZXQodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAia21wX2dldF9zdGFja3NpemVfc190YXJnZXQiKTsKK30KKwordm9pZCBrbXBfc2V0X2Jsb2NrdGltZV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IHRpbWUKKykKK3sKKyAgICBvbXBfc2V0X2ludF90YXJnZXQodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIHRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICJrbXBfc2V0X2Jsb2NrdGltZV90YXJnZXQiKTsKK30KKworaW50IGttcF9nZXRfYmxvY2t0aW1lX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworICAgIHJldHVybiBvbXBfZ2V0X2ludF90YXJnZXQodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAia21wX2dldF9ibG9ja3RpbWVfdGFyZ2V0Iik7Cit9CisKK3ZvaWQga21wX3NldF9saWJyYXJ5X3NlcmlhbF90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIDApOworICAgIGlmIChvZmxkICE9IDApIHsKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsICJrbXBfc2V0X2xpYnJhcnlfc2VyaWFsX3RhcmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwKTsKKyAgICB9Cit9CisKK3ZvaWQga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAwKTsKKyAgICBpZiAob2ZsZCAhPSAwKSB7CisgICAgICAgIE9GRkxPQURfT0ZGTE9BRChvZmxkLCAia21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDApOworICAgIH0KK30KKwordm9pZCBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dF90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIDApOworICAgIGlmIChvZmxkICE9IDApIHsKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsICJrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dF90YXJnZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCk7CisgICAgfQorfQorCit2b2lkIGttcF9zZXRfbGlicmFyeV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IG1vZGUKKykKK3sKKyAgICBvbXBfc2V0X2ludF90YXJnZXQodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICJrbXBfc2V0X2xpYnJhcnlfdGFyZ2V0Iik7Cit9CisKK2ludCBrbXBfZ2V0X2xpYnJhcnlfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispCit7CisgICAgcmV0dXJuIG9tcF9nZXRfaW50X3RhcmdldCh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJrbXBfZ2V0X2xpYnJhcnlfdGFyZ2V0Iik7Cit9CisKK3ZvaWQga21wX3NldF9kZWZhdWx0c190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgY2hhciBjb25zdCAqZGVmYXVsdHMKKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIDApOworICAgIGlmIChvZmxkICE9IDApIHsKKyAgICAgICAgVmFyRGVzYyB2YXJzWzFdID0gezB9OworCisgICAgICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX3N0cmluZ19wdHI7CisgICAgICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX3N0cmluZ19wdHI7CisgICAgICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICAgICAgdmFyc1swXS5hbGxvY19pZiA9IDE7CisgICAgICAgIHZhcnNbMF0uZnJlZV9pZiA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gJmRlZmF1bHRzOworCisgICAgICAgIE9GRkxPQURfT0ZGTE9BRChvZmxkLCAia21wX3NldF9kZWZhdWx0c190YXJnZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgdmFycywgTlVMTCwgMCwgMCwgMCk7CisgICAgfQorfQorCisvLyBhZmZpbml0eSBBUEkgZnVuY3Rpb25zCisKK3ZvaWQga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCAqbWFzaworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgMCk7CisgICAgaWYgKG9mbGQgIT0gMCkgeworICAgICAgICBWYXJEZXNjIHZhcnNbMV0gPSB7MH07CisKKyAgICAgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICAgICAgdmFyc1swXS5zaXplID0gc2l6ZW9mKGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gbWFzazsKKworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgImttcF9jcmVhdGVfYWZmaW5pdHlfbWFza190YXJnZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgdmFycywgTlVMTCwgMCwgMCwgMCk7CisgICAgfQorfQorCit2b2lkIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90ICptYXNrCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAwKTsKKyAgICBpZiAob2ZsZCAhPSAwKSB7CisgICAgICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKworICAgICAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgICAgIHZhcnNbMF0uc2l6ZSA9IHNpemVvZihrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCk7CisgICAgICAgIHZhcnNbMF0uY291bnQgPSAxOworICAgICAgICB2YXJzWzBdLnB0ciA9IG1hc2s7CisKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsICJrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrX3RhcmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAxLCB2YXJzLCBOVUxMLCAwLCAwLCAwKTsKKyAgICB9Cit9CisKK2ludCBrbXBfc2V0X2FmZmluaXR5X3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCAqbWFzaworKQoreworICAgIGludCByZXN1bHQgPSAxOworCisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAwKTsKKyAgICBpZiAob2ZsZCAhPSAwKSB7CisgICAgICAgIFZhckRlc2MgdmFyc1syXSA9IHswfTsKKworICAgICAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgICAgIHZhcnNbMF0uc2l6ZSA9IHNpemVvZihrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCk7CisgICAgICAgIHZhcnNbMF0uY291bnQgPSAxOworICAgICAgICB2YXJzWzBdLnB0ciA9IG1hc2s7CisKKyAgICAgICAgdmFyc1sxXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1sxXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1sxXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICAgICAgdmFyc1sxXS5zaXplID0gc2l6ZW9mKGludCk7CisgICAgICAgIHZhcnNbMV0uY291bnQgPSAxOworICAgICAgICB2YXJzWzFdLnB0ciA9ICZyZXN1bHQ7CisKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsICJrbXBfc2V0X2FmZmluaXR5X3RhcmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAyLCB2YXJzLCBOVUxMLCAwLCAwLCAwKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworaW50IGttcF9nZXRfYWZmaW5pdHlfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90ICptYXNrCispCit7CisgICAgaW50IHJlc3VsdCA9IDE7CisKKyAgICBPRkZMT0FEIG9mbGQgPSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIDApOworICAgIGlmIChvZmxkICE9IDApIHsKKyAgICAgICAgVmFyRGVzYyB2YXJzWzJdID0gezB9OworCisgICAgICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbm91dDsKKyAgICAgICAgdmFyc1swXS5zaXplID0gc2l6ZW9mKGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gbWFzazsKKworICAgICAgICB2YXJzWzFdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzFdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzFdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgICAgICB2YXJzWzFdLnNpemUgPSBzaXplb2YoaW50KTsKKyAgICAgICAgdmFyc1sxXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMV0ucHRyID0gJnJlc3VsdDsKKworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgImttcF9nZXRfYWZmaW5pdHlfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDIsIHZhcnMsIE5VTEwsIDAsIDAsIDApOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitpbnQga21wX2dldF9hZmZpbml0eV9tYXhfcHJvY190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICByZXR1cm4gb21wX2dldF9pbnRfdGFyZ2V0KHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2NfdGFyZ2V0Iik7Cit9CisKK2ludCBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IHByb2MsCisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgKm1hc2sKKykKK3sKKyAgICBpbnQgcmVzdWx0ID0gMTsKKworICAgIE9GRkxPQUQgb2ZsZCA9IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgMCk7CisgICAgaWYgKG9mbGQgIT0gMCkgeworICAgICAgICBWYXJEZXNjIHZhcnNbM10gPSB7MH07CisKKyAgICAgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgICAgICB2YXJzWzBdLnNpemUgPSBzaXplb2YoaW50KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gJnByb2M7CisKKyAgICAgICAgdmFyc1sxXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1sxXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1sxXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2lub3V0OworICAgICAgICB2YXJzWzFdLnNpemUgPSBzaXplb2Yoa21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QpOworICAgICAgICB2YXJzWzFdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1sxXS5wdHIgPSBtYXNrOworCisgICAgICAgIHZhcnNbMl0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMl0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMl0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgICAgIHZhcnNbMl0uc2l6ZSA9IHNpemVvZihpbnQpOworICAgICAgICB2YXJzWzJdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1syXS5wdHIgPSAmcmVzdWx0OworCisgICAgICAgIE9GRkxPQURfT0ZGTE9BRChvZmxkLCAia21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDMsIHZhcnMsIE5VTEwsIDAsIDAsIDApOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitpbnQga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IHByb2MsCisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgKm1hc2sKKykKK3sKKyAgICBpbnQgcmVzdWx0ID0gMTsKKworICAgIE9GRkxPQUQgb2ZsZCA9IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgMCk7CisgICAgaWYgKG9mbGQgIT0gMCkgeworICAgICAgICBWYXJEZXNjIHZhcnNbM10gPSB7MH07CisKKyAgICAgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgICAgICB2YXJzWzBdLnNpemUgPSBzaXplb2YoaW50KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gJnByb2M7CisKKyAgICAgICAgdmFyc1sxXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1sxXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1sxXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2lub3V0OworICAgICAgICB2YXJzWzFdLnNpemUgPSBzaXplb2Yoa21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QpOworICAgICAgICB2YXJzWzFdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1sxXS5wdHIgPSBtYXNrOworCisgICAgICAgIHZhcnNbMl0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMl0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMl0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgICAgIHZhcnNbMl0uc2l6ZSA9IHNpemVvZihpbnQpOworICAgICAgICB2YXJzWzJdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1syXS5wdHIgPSAmcmVzdWx0OworCisgICAgICAgIE9GRkxPQURfT0ZGTE9BRChvZmxkLCAia21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMywgdmFycywgTlVMTCwgMCwgMCwgMCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IHByb2MsCisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgKm1hc2sKKykKK3sKKyAgICBpbnQgcmVzdWx0ID0gMTsKKworICAgIE9GRkxPQUQgb2ZsZCA9IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgMCk7CisgICAgaWYgKG9mbGQgIT0gMCkgeworICAgICAgICBWYXJEZXNjIHZhcnNbM10gPSB7MH07CisKKyAgICAgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgICAgICB2YXJzWzBdLnNpemUgPSBzaXplb2YoaW50KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gJnByb2M7CisKKyAgICAgICAgdmFyc1sxXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1sxXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1sxXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgICAgICB2YXJzWzFdLnNpemUgPSBzaXplb2Yoa21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QpOworICAgICAgICB2YXJzWzFdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1sxXS5wdHIgPSBtYXNrOworCisgICAgICAgIHZhcnNbMl0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMl0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMl0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgICAgIHZhcnNbMl0uc2l6ZSA9IHNpemVvZihpbnQpOworICAgICAgICB2YXJzWzJdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1syXS5wdHIgPSAmcmVzdWx0OworCisgICAgICAgIE9GRkxPQURfT0ZGTE9BRChvZmxkLCAia21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDMsIHZhcnMsIE5VTEwsIDAsIDAsIDApOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9vbXBfdGFyZ2V0LmNwcCBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfb21wX3RhcmdldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYyMDUyYQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfb21wX3RhcmdldC5jcHAKQEAgLTAsMCArMSwxMDIxIEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlIDxvbXAuaD4KKyNpbmNsdWRlICJvZmZsb2FkLmgiCisjaW5jbHVkZSAiY29tcGlsZXJfaWZfdGFyZ2V0LmgiCisKKy8vIE9wZW5NUCBBUEkKKwordm9pZCBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlKGludCBudW0pCit7Cit9CisKK2ludCBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlKHZvaWQpCit7CisgICAgcmV0dXJuIG1pY19pbmRleDsKK30KKworaW50IG9tcF9nZXRfbnVtX2RldmljZXMoKQoreworICAgIHJldHVybiBtaWNfZW5naW5lc190b3RhbDsKK30KKworLy8gT3Blbk1QIEFQSSB3cmFwcGVycworCitzdGF0aWMgdm9pZCBvbXBfc2VuZF9pbnRfdG9faG9zdCgKKyAgICB2b2lkICpvZmxkXywKKyAgICBpbnQgc2V0dGluZworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IChPRkZMT0FEKSBvZmxkXzsKKyAgICBWYXJEZXNjIHZhcnNbMV0gPSB7MH07CisKKyAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICB2YXJzWzBdLnB0ciA9ICZzZXR0aW5nOworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMSwgdmFycywgTlVMTCk7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7Cit9CisKK3N0YXRpYyBpbnQgb21wX2dldF9pbnRfZnJvbV9ob3N0KAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKyAgICBpbnQgc2V0dGluZzsKKworICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgdmFyc1swXS5wdHIgPSAmc2V0dGluZzsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDEsIHZhcnMsIE5VTEwpOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworCisgICAgcmV0dXJuIHNldHRpbmc7Cit9CisKK3ZvaWQgb21wX3NldF9udW1fdGhyZWFkc19scmIoCisgICAgdm9pZCAqb2ZsZAorKQoreworICAgIGludCBudW1fdGhyZWFkczsKKworICAgIG51bV90aHJlYWRzID0gb21wX2dldF9pbnRfZnJvbV9ob3N0KG9mbGQpOworICAgIG9tcF9zZXRfbnVtX3RocmVhZHMobnVtX3RocmVhZHMpOworfQorCit2b2lkIG9tcF9nZXRfbWF4X3RocmVhZHNfbHJiKAorICAgIHZvaWQgKm9mbGQKKykKK3sKKyAgICBpbnQgbnVtX3RocmVhZHM7CisKKyAgICBudW1fdGhyZWFkcyA9IG9tcF9nZXRfbWF4X3RocmVhZHMoKTsKKyAgICBvbXBfc2VuZF9pbnRfdG9faG9zdChvZmxkLCBudW1fdGhyZWFkcyk7Cit9CisKK3ZvaWQgb21wX2dldF9udW1fcHJvY3NfbHJiKAorICAgIHZvaWQgKm9mbGQKKykKK3sKKyAgICBpbnQgbnVtX3Byb2NzOworCisgICAgbnVtX3Byb2NzID0gb21wX2dldF9udW1fcHJvY3MoKTsKKyAgICBvbXBfc2VuZF9pbnRfdG9faG9zdChvZmxkLCBudW1fcHJvY3MpOworfQorCit2b2lkIG9tcF9zZXRfZHluYW1pY19scmIoCisgICAgdm9pZCAqb2ZsZAorKQoreworICAgIGludCBkeW5hbWljOworCisgICAgZHluYW1pYyA9IG9tcF9nZXRfaW50X2Zyb21faG9zdChvZmxkKTsKKyAgICBvbXBfc2V0X2R5bmFtaWMoZHluYW1pYyk7Cit9CisKK3ZvaWQgb21wX2dldF9keW5hbWljX2xyYigKKyAgICB2b2lkICpvZmxkCispCit7CisgICAgaW50IGR5bmFtaWM7CisKKyAgICBkeW5hbWljID0gb21wX2dldF9keW5hbWljKCk7CisgICAgb21wX3NlbmRfaW50X3RvX2hvc3Qob2ZsZCwgZHluYW1pYyk7Cit9CisKK3ZvaWQgb21wX3NldF9uZXN0ZWRfbHJiKAorICAgIHZvaWQgKm9mbGQKKykKK3sKKyAgICBpbnQgbmVzdGVkOworCisgICAgbmVzdGVkID0gb21wX2dldF9pbnRfZnJvbV9ob3N0KG9mbGQpOworICAgIG9tcF9zZXRfbmVzdGVkKG5lc3RlZCk7Cit9CisKK3ZvaWQgb21wX2dldF9uZXN0ZWRfbHJiKAorICAgIHZvaWQgKm9mbGQKKykKK3sKKyAgICBpbnQgbmVzdGVkOworCisgICAgbmVzdGVkID0gb21wX2dldF9uZXN0ZWQoKTsKKyAgICBvbXBfc2VuZF9pbnRfdG9faG9zdChvZmxkLCBuZXN0ZWQpOworfQorCit2b2lkIG9tcF9zZXRfc2NoZWR1bGVfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1syXSA9IHswfTsKKyAgICBvbXBfc2NoZWRfdCBraW5kOworICAgIGludCBtb2RpZmllcjsKKworICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgdmFyc1swXS5wdHIgPSAma2luZDsKKworICAgIHZhcnNbMV0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1sxXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzFdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgdmFyc1sxXS5wdHIgPSAmbW9kaWZpZXI7CisKKyAgICBPRkZMT0FEX1RBUkdFVF9FTlRFUihvZmxkLCAyLCB2YXJzLCBOVUxMKTsKKyAgICBvbXBfc2V0X3NjaGVkdWxlKGtpbmQsIG1vZGlmaWVyKTsKKyAgICBPRkZMT0FEX1RBUkdFVF9MRUFWRShvZmxkKTsKK30KKwordm9pZCBvbXBfZ2V0X3NjaGVkdWxlX2xyYigKKyAgICB2b2lkICpvZmxkXworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IChPRkZMT0FEKSBvZmxkXzsKKyAgICBWYXJEZXNjIHZhcnNbMl0gPSB7MH07CisgICAgb21wX3NjaGVkX3Qga2luZDsKKyAgICBpbnQgbW9kaWZpZXI7CisKKyAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICB2YXJzWzBdLnB0ciA9ICZraW5kOworCisgICAgdmFyc1sxXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzFdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMV0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgdmFyc1sxXS5wdHIgPSAmbW9kaWZpZXI7CisKKyAgICBPRkZMT0FEX1RBUkdFVF9FTlRFUihvZmxkLCAyLCB2YXJzLCBOVUxMKTsKKyAgICBvbXBfZ2V0X3NjaGVkdWxlKCZraW5kLCAmbW9kaWZpZXIpOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworfQorCisvLyBsb2NrIEFQSSBmdW5jdGlvbnMKKwordm9pZCBvbXBfaW5pdF9sb2NrX2xyYigKKyAgICB2b2lkICpvZmxkXworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IChPRkZMT0FEKSBvZmxkXzsKKyAgICBWYXJEZXNjIHZhcnNbMV0gPSB7MH07CisgICAgb21wX2xvY2tfdGFyZ2V0X3QgbG9jazsKKworICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgIHZhcnNbMF0ucHRyID0gJmxvY2s7CisKKyAgICBPRkZMT0FEX1RBUkdFVF9FTlRFUihvZmxkLCAxLCB2YXJzLCBOVUxMKTsKKyAgICBvbXBfaW5pdF9sb2NrKCZsb2NrLmxvY2spOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworfQorCit2b2lkIG9tcF9kZXN0cm95X2xvY2tfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKyAgICBvbXBfbG9ja190YXJnZXRfdCBsb2NrOworCisgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICB2YXJzWzBdLnB0ciA9ICZsb2NrOworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMSwgdmFycywgTlVMTCk7CisgICAgb21wX2Rlc3Ryb3lfbG9jaygmbG9jay5sb2NrKTsKKyAgICBPRkZMT0FEX1RBUkdFVF9MRUFWRShvZmxkKTsKK30KKwordm9pZCBvbXBfc2V0X2xvY2tfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKyAgICBvbXBfbG9ja190YXJnZXRfdCBsb2NrOworCisgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbm91dDsKKyAgICB2YXJzWzBdLnB0ciA9ICZsb2NrOworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMSwgdmFycywgTlVMTCk7CisgICAgb21wX3NldF9sb2NrKCZsb2NrLmxvY2spOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworfQorCit2b2lkIG9tcF91bnNldF9sb2NrX2xyYigKKyAgICB2b2lkICpvZmxkXworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IChPRkZMT0FEKSBvZmxkXzsKKyAgICBWYXJEZXNjIHZhcnNbMV0gPSB7MH07CisgICAgb21wX2xvY2tfdGFyZ2V0X3QgbG9jazsKKworICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW5vdXQ7CisgICAgdmFyc1swXS5wdHIgPSAmbG9jazsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDEsIHZhcnMsIE5VTEwpOworICAgIG9tcF91bnNldF9sb2NrKCZsb2NrLmxvY2spOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworfQorCit2b2lkIG9tcF90ZXN0X2xvY2tfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1syXSA9IHswfTsKKyAgICBvbXBfbG9ja190YXJnZXRfdCBsb2NrOworICAgIGludCByZXN1bHQ7CisKKyAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2lub3V0OworICAgIHZhcnNbMF0ucHRyID0gJmxvY2s7CisKKyAgICB2YXJzWzFdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMV0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1sxXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICB2YXJzWzFdLnB0ciA9ICZyZXN1bHQ7CisKKyAgICBPRkZMT0FEX1RBUkdFVF9FTlRFUihvZmxkLCAyLCB2YXJzLCBOVUxMKTsKKyAgICByZXN1bHQgPSBvbXBfdGVzdF9sb2NrKCZsb2NrLmxvY2spOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworfQorCisvLyBuZXN0ZWQgbG9jayBBUEkgZnVuY3Rpb25zCisKK3ZvaWQgb21wX2luaXRfbmVzdF9sb2NrX2xyYigKKyAgICB2b2lkICpvZmxkXworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IChPRkZMT0FEKSBvZmxkXzsKKyAgICBWYXJEZXNjIHZhcnNbMV0gPSB7MH07CisgICAgb21wX25lc3RfbG9ja190YXJnZXRfdCBsb2NrOworCisgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgdmFyc1swXS5wdHIgPSAmbG9jazsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDEsIHZhcnMsIE5VTEwpOworICAgIG9tcF9pbml0X25lc3RfbG9jaygmbG9jay5sb2NrKTsKKyAgICBPRkZMT0FEX1RBUkdFVF9MRUFWRShvZmxkKTsKK30KKwordm9pZCBvbXBfZGVzdHJveV9uZXN0X2xvY2tfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKyAgICBvbXBfbmVzdF9sb2NrX3RhcmdldF90IGxvY2s7CisKKyAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgIHZhcnNbMF0ucHRyID0gJmxvY2s7CisKKyAgICBPRkZMT0FEX1RBUkdFVF9FTlRFUihvZmxkLCAxLCB2YXJzLCBOVUxMKTsKKyAgICBvbXBfZGVzdHJveV9uZXN0X2xvY2soJmxvY2subG9jayk7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7Cit9CisKK3ZvaWQgb21wX3NldF9uZXN0X2xvY2tfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKyAgICBvbXBfbmVzdF9sb2NrX3RhcmdldF90IGxvY2s7CisKKyAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2lub3V0OworICAgIHZhcnNbMF0ucHRyID0gJmxvY2s7CisKKyAgICBPRkZMT0FEX1RBUkdFVF9FTlRFUihvZmxkLCAxLCB2YXJzLCBOVUxMKTsKKyAgICBvbXBfc2V0X25lc3RfbG9jaygmbG9jay5sb2NrKTsKKyAgICBPRkZMT0FEX1RBUkdFVF9MRUFWRShvZmxkKTsKK30KKwordm9pZCBvbXBfdW5zZXRfbmVzdF9sb2NrX2xyYigKKyAgICB2b2lkICpvZmxkXworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IChPRkZMT0FEKSBvZmxkXzsKKyAgICBWYXJEZXNjIHZhcnNbMV0gPSB7MH07CisgICAgb21wX25lc3RfbG9ja190YXJnZXRfdCBsb2NrOworCisgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbm91dDsKKyAgICB2YXJzWzBdLnB0ciA9ICZsb2NrOworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMSwgdmFycywgTlVMTCk7CisgICAgb21wX3Vuc2V0X25lc3RfbG9jaygmbG9jay5sb2NrKTsKKyAgICBPRkZMT0FEX1RBUkdFVF9MRUFWRShvZmxkKTsKK30KKwordm9pZCBvbXBfdGVzdF9uZXN0X2xvY2tfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1syXSA9IHswfTsKKyAgICBvbXBfbmVzdF9sb2NrX3RhcmdldF90IGxvY2s7CisgICAgaW50IHJlc3VsdDsKKworICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW5vdXQ7CisgICAgdmFyc1swXS5wdHIgPSAmbG9jazsKKworICAgIHZhcnNbMV0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1sxXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzFdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgIHZhcnNbMV0ucHRyID0gJnJlc3VsdDsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDIsIHZhcnMsIE5VTEwpOworICAgIHJlc3VsdCA9IG9tcF90ZXN0X25lc3RfbG9jaygmbG9jay5sb2NrKTsKKyAgICBPRkZMT0FEX1RBUkdFVF9MRUFWRShvZmxkKTsKK30KKworLy8ga21wIEFQSSBmdW5jdGlvbnMKKwordm9pZCBrbXBfc2V0X3N0YWNrc2l6ZV9scmIoCisgICAgdm9pZCAqb2ZsZAorKQoreworICAgIGludCBzaXplOworCisgICAgc2l6ZSA9IG9tcF9nZXRfaW50X2Zyb21faG9zdChvZmxkKTsKKyAgICBrbXBfc2V0X3N0YWNrc2l6ZShzaXplKTsKK30KKwordm9pZCBrbXBfZ2V0X3N0YWNrc2l6ZV9scmIoCisgICAgdm9pZCAqb2ZsZAorKQoreworICAgIGludCBzaXplOworCisgICAgc2l6ZSA9IGttcF9nZXRfc3RhY2tzaXplKCk7CisgICAgb21wX3NlbmRfaW50X3RvX2hvc3Qob2ZsZCwgc2l6ZSk7Cit9CisKK3ZvaWQga21wX3NldF9zdGFja3NpemVfc19scmIoCisgICAgdm9pZCAqb2ZsZAorKQoreworICAgIGludCBzaXplOworCisgICAgc2l6ZSA9IG9tcF9nZXRfaW50X2Zyb21faG9zdChvZmxkKTsKKyAgICBrbXBfc2V0X3N0YWNrc2l6ZV9zKHNpemUpOworfQorCit2b2lkIGttcF9nZXRfc3RhY2tzaXplX3NfbHJiKAorICAgIHZvaWQgKm9mbGQKKykKK3sKKyAgICBpbnQgc2l6ZTsKKworICAgIHNpemUgPSBrbXBfZ2V0X3N0YWNrc2l6ZV9zKCk7CisgICAgb21wX3NlbmRfaW50X3RvX2hvc3Qob2ZsZCwgc2l6ZSk7Cit9CisKK3ZvaWQga21wX3NldF9ibG9ja3RpbWVfbHJiKAorICAgIHZvaWQgKm9mbGQKKykKK3sKKyAgICBpbnQgdGltZTsKKworICAgIHRpbWUgPSBvbXBfZ2V0X2ludF9mcm9tX2hvc3Qob2ZsZCk7CisgICAga21wX3NldF9ibG9ja3RpbWUodGltZSk7Cit9CisKK3ZvaWQga21wX2dldF9ibG9ja3RpbWVfbHJiKAorICAgIHZvaWQgKm9mbGQKKykKK3sKKyAgICBpbnQgdGltZTsKKworICAgIHRpbWUgPSBrbXBfZ2V0X2Jsb2NrdGltZSgpOworICAgIG9tcF9zZW5kX2ludF90b19ob3N0KG9mbGQsIHRpbWUpOworfQorCit2b2lkIGttcF9zZXRfbGlicmFyeV9zZXJpYWxfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMCwgMCwgMCk7CisgICAga21wX3NldF9saWJyYXJ5X3NlcmlhbCgpOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworfQorCit2b2lkIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kX2xyYigKKyAgICB2b2lkICpvZmxkXworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IChPRkZMT0FEKSBvZmxkXzsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDAsIDAsIDApOworICAgIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kKCk7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7Cit9CisKK3ZvaWQga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXRfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMCwgMCwgMCk7CisgICAga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQoKTsKKyAgICBPRkZMT0FEX1RBUkdFVF9MRUFWRShvZmxkKTsKK30KKwordm9pZCBrbXBfc2V0X2xpYnJhcnlfbHJiKAorICAgIHZvaWQgKm9mbGQKKykKK3sKKyAgICBpbnQgbW9kZTsKKworICAgIG1vZGUgPSBvbXBfZ2V0X2ludF9mcm9tX2hvc3Qob2ZsZCk7CisgICAga21wX3NldF9saWJyYXJ5KG1vZGUpOworfQorCit2b2lkIGttcF9nZXRfbGlicmFyeV9scmIoCisgICAgdm9pZCAqb2ZsZAorKQoreworICAgIGludCBtb2RlOworCisgICAgbW9kZSA9IGttcF9nZXRfbGlicmFyeSgpOworICAgIG9tcF9zZW5kX2ludF90b19ob3N0KG9mbGQsIG1vZGUpOworfQorCit2b2lkIGttcF9zZXRfZGVmYXVsdHNfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKyAgICBjaGFyICpkZWZhdWx0cyA9IDA7CisKKyAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19zdHJpbmdfcHRyOworICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX3N0cmluZ19wdHI7CisgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgIHZhcnNbMF0ucHRyID0gJmRlZmF1bHRzOworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMSwgdmFycywgTlVMTCk7CisgICAga21wX3NldF9kZWZhdWx0cyhkZWZhdWx0cyk7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7Cit9CisKKy8vIGFmZmluaXR5IEFQSSBmdW5jdGlvbnMKKwordm9pZCBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCBtYXNrOworCisgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgdmFyc1swXS5wdHIgPSAmbWFzazsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDEsIHZhcnMsIE5VTEwpOworICAgIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaygmbWFzay5tYXNrKTsKKyAgICBPRkZMT0FEX1RBUkdFVF9MRUFWRShvZmxkKTsKK30KKwordm9pZCBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrX2xyYigKKyAgICB2b2lkICpvZmxkXworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IChPRkZMT0FEKSBvZmxkXzsKKyAgICBWYXJEZXNjIHZhcnNbMV0gPSB7MH07CisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgbWFzazsKKworICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgdmFyc1swXS5wdHIgPSAmbWFzazsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDEsIHZhcnMsIE5VTEwpOworICAgIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2soJm1hc2subWFzayk7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7Cit9CisKK3ZvaWQga21wX3NldF9hZmZpbml0eV9scmIoCisgICAgdm9pZCAqb2ZsZF8KKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSAoT0ZGTE9BRCkgb2ZsZF87CisgICAgVmFyRGVzYyB2YXJzWzJdID0gezB9OworICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90IG1hc2s7CisgICAgaW50IHJlc3VsdDsKKworICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgdmFyc1swXS5wdHIgPSAmbWFzazsKKworICAgIHZhcnNbMV0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1sxXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzFdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgIHZhcnNbMV0ucHRyID0gJnJlc3VsdDsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDIsIHZhcnMsIE5VTEwpOworICAgIHJlc3VsdCA9IGttcF9zZXRfYWZmaW5pdHkoJm1hc2subWFzayk7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7Cit9CisKK3ZvaWQga21wX2dldF9hZmZpbml0eV9scmIoCisgICAgdm9pZCAqb2ZsZF8KKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSAoT0ZGTE9BRCkgb2ZsZF87CisgICAgVmFyRGVzYyB2YXJzWzJdID0gezB9OworICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90IG1hc2s7CisgICAgaW50IHJlc3VsdDsKKworICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW5vdXQ7CisgICAgdmFyc1swXS5wdHIgPSAmbWFzazsKKworICAgIHZhcnNbMV0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1sxXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzFdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgIHZhcnNbMV0ucHRyID0gJnJlc3VsdDsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDIsIHZhcnMsIE5VTEwpOworICAgIHJlc3VsdCA9IGttcF9nZXRfYWZmaW5pdHkoJm1hc2subWFzayk7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7Cit9CisKK3ZvaWQga21wX2dldF9hZmZpbml0eV9tYXhfcHJvY19scmIoCisgICAgdm9pZCAqb2ZsZAorKQoreworICAgIGludCBtYXhfcHJvYzsKKworICAgIG1heF9wcm9jID0ga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYygpOworICAgIG9tcF9zZW5kX2ludF90b19ob3N0KG9mbGQsIG1heF9wcm9jKTsKK30KKwordm9pZCBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY19scmIoCisgICAgdm9pZCAqb2ZsZF8KKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSAoT0ZGTE9BRCkgb2ZsZF87CisgICAgVmFyRGVzYyB2YXJzWzNdID0gezB9OworICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90IG1hc2s7CisgICAgaW50IHByb2MsIHJlc3VsdDsKKworICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgdmFyc1swXS5wdHIgPSAmcHJvYzsKKworICAgIHZhcnNbMV0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1sxXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzFdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW5vdXQ7CisgICAgdmFyc1sxXS5wdHIgPSAmbWFzazsKKworICAgIHZhcnNbMl0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1syXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzJdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgIHZhcnNbMl0ucHRyID0gJnJlc3VsdDsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDMsIHZhcnMsIE5VTEwpOworICAgIHJlc3VsdCA9IGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsICZtYXNrLm1hc2spOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworfQorCit2b2lkIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2NfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1szXSA9IHswfTsKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCBtYXNrOworICAgIGludCBwcm9jLCByZXN1bHQ7CisKKyAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgIHZhcnNbMF0ucHRyID0gJnByb2M7CisKKyAgICB2YXJzWzFdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMV0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1sxXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2lub3V0OworICAgIHZhcnNbMV0ucHRyID0gJm1hc2s7CisKKyAgICB2YXJzWzJdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMl0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1syXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICB2YXJzWzJdLnB0ciA9ICZyZXN1bHQ7CisKKyAgICBPRkZMT0FEX1RBUkdFVF9FTlRFUihvZmxkLCAzLCB2YXJzLCBOVUxMKTsKKyAgICByZXN1bHQgPSBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsICZtYXNrLm1hc2spOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworfQorCit2b2lkIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jX2xyYigKKyAgICB2b2lkICpvZmxkXworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IChPRkZMT0FEKSBvZmxkXzsKKyAgICBWYXJEZXNjIHZhcnNbM10gPSB7MH07CisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgbWFzazsKKyAgICBpbnQgcHJvYywgcmVzdWx0OworCisgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICB2YXJzWzBdLnB0ciA9ICZwcm9jOworCisgICAgdmFyc1sxXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzFdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMV0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICB2YXJzWzFdLnB0ciA9ICZtYXNrOworCisgICAgdmFyc1syXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzJdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMl0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgdmFyc1syXS5wdHIgPSAmcmVzdWx0OworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMywgdmFycywgTlVMTCk7CisgICAgcmVzdWx0ID0ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgJm1hc2subWFzayk7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7Cit9CisKKy8vIFRhcmdldC1zaWRlIHN0dWJzIGZvciB0aGUgaG9zdCBmdW5jdGlvbnMgKHRvIGF2b2lkIHVucmVzb2x2ZWRzKQorLy8gVGhlc2UgYXJlIG5lZWRlZCBmb3IgdGhlIG9mZmxvYWRtIHRhYmxlCisKK3ZvaWQgb21wX3NldF9udW1fdGhyZWFkc190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IG51bV90aHJlYWRzCispCit7Cit9CisKK2ludCBvbXBfZ2V0X21heF90aHJlYWRzX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworICAgIHJldHVybiAwOworfQorCitpbnQgb21wX2dldF9udW1fcHJvY3NfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispCit7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgb21wX3NldF9keW5hbWljX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgbnVtX3RocmVhZHMKKykKK3sKK30KKworaW50IG9tcF9nZXRfZHluYW1pY190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBvbXBfc2V0X25lc3RlZF90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IG51bV90aHJlYWRzCispCit7Cit9CisKK2ludCBvbXBfZ2V0X25lc3RlZF90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBvbXBfc2V0X3NjaGVkdWxlX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfc2NoZWRfdCBraW5kLAorICAgIGludCBtb2RpZmllcgorKQoreworfQorCit2b2lkIG9tcF9nZXRfc2NoZWR1bGVfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9zY2hlZF90ICpraW5kLAorICAgIGludCAqbW9kaWZpZXIKKykKK3sKK30KKwordm9pZCBvbXBfaW5pdF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbG9ja190YXJnZXRfdCAqbG9jaworKQoreworfQorCit2b2lkIG9tcF9kZXN0cm95X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9sb2NrX3RhcmdldF90ICpsb2NrCispCit7Cit9CisKK3ZvaWQgb21wX3NldF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbG9ja190YXJnZXRfdCAqbG9jaworKQoreworfQorCit2b2lkIG9tcF91bnNldF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbG9ja190YXJnZXRfdCAqbG9jaworKQoreworfQorCitpbnQgb21wX3Rlc3RfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX2xvY2tfdGFyZ2V0X3QgKmxvY2sKKykKK3sKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBvbXBfaW5pdF9uZXN0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9uZXN0X2xvY2tfdGFyZ2V0X3QgKmxvY2sKKykKK3sKK30KKwordm9pZCBvbXBfZGVzdHJveV9uZXN0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9uZXN0X2xvY2tfdGFyZ2V0X3QgKmxvY2sKKykKK3sKK30KKwordm9pZCBvbXBfc2V0X25lc3RfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX25lc3RfbG9ja190YXJnZXRfdCAqbG9jaworKQoreworfQorCit2b2lkIG9tcF91bnNldF9uZXN0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9uZXN0X2xvY2tfdGFyZ2V0X3QgKmxvY2sKKykKK3sKK30KKworaW50IG9tcF90ZXN0X25lc3RfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX25lc3RfbG9ja190YXJnZXRfdCAqbG9jaworKQoreworICAgIHJldHVybiAwOworfQorCit2b2lkIGttcF9zZXRfc3RhY2tzaXplX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgc2l6ZQorKQoreworfQorCitpbnQga21wX2dldF9zdGFja3NpemVfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispCit7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQga21wX3NldF9zdGFja3NpemVfc190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgc2l6ZV90IHNpemUKKykKK3sKK30KKworc2l6ZV90IGttcF9nZXRfc3RhY2tzaXplX3NfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispCit7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQga21wX3NldF9ibG9ja3RpbWVfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCB0aW1lCispCit7Cit9CisKK2ludCBrbXBfZ2V0X2Jsb2NrdGltZV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworfQorCit2b2lkIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworfQorCit2b2lkIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0X3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworfQorCit2b2lkIGttcF9zZXRfbGlicmFyeV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IG1vZGUKKykKK3sKK30KKworaW50IGttcF9nZXRfbGlicmFyeV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBrbXBfc2V0X2RlZmF1bHRzX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBjaGFyIGNvbnN0ICpkZWZhdWx0cworKQoreworfQorCit2b2lkIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFza190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgKm1hc2sKKykKK3sKK30KKwordm9pZCBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCAqbWFzaworKQoreworfQorCitpbnQga21wX3NldF9hZmZpbml0eV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgKm1hc2sKKykKK3sKKyAgICByZXR1cm4gMDsKK30KKworaW50IGttcF9nZXRfYWZmaW5pdHlfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90ICptYXNrCispCit7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworICAgIHJldHVybiAwOworfQorCitpbnQga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBwcm9jLAorICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90ICptYXNrCispCit7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgcHJvYywKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCAqbWFzaworKQoreworICAgIHJldHVybiAwOworfQorCitpbnQga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBwcm9jLAorICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90ICptYXNrCispCit7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX29yc2wuY3BwIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9vcnNsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTYyZjhhCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9vcnNsLmNwcApAQCAtMCwwICsxLDg0IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJvZmZsb2FkX29yc2wuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJvZmZsb2FkX2hvc3QuaCIKKyNpbmNsdWRlICJvcnNsLWxpdGUvaW5jbHVkZS9vcnNsLWxpdGUuaCIKKworbmFtZXNwYWNlIE9SU0wgeworCitzdGF0aWMgYm9vbCAgICAgICAgICAgIGlzX2VuYWJsZWQgPSBmYWxzZTsKK3N0YXRpYyBjb25zdCBPUlNMVGFnICAgbXlfdGFnID0gIk9mZmxvYWQiOworCit2b2lkIGluaXQoKQoreworICAgIGNvbnN0IGNoYXIgKmVudl92YXIgPSBnZXRlbnYoIk9GRkxPQURfRU5BQkxFX09SU0wiKTsKKyAgICBpZiAoZW52X3ZhciAhPSAwICYmICplbnZfdmFyICE9ICdcMCcpIHsKKyAgICAgICAgaW50NjRfdCBuZXdfdmFsOworICAgICAgICBpZiAoX19vZmZsb2FkX3BhcnNlX2ludF9zdHJpbmcoZW52X3ZhciwgbmV3X3ZhbCkpIHsKKyAgICAgICAgICAgIGlzX2VuYWJsZWQgPSBuZXdfdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2ludmFsaWRfZW52X3Zhcl9pbnRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPRkZMT0FEX0VOQUJMRV9PUlNMIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaXNfZW5hYmxlZCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJPUlNMIGlzIGVuYWJsZWRcbiIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiT1JTTCBpcyBkaXNhYmxlZFxuIik7CisgICAgfQorfQorCitib29sIHJlc2VydmUoaW50IGRldmljZSkKK3sKKyAgICBpZiAoaXNfZW5hYmxlZCkgeworICAgICAgICBpbnQgcG51bSA9IG1pY19lbmdpbmVzW2RldmljZV0uZ2V0X3BoeXNpY2FsX2luZGV4KCk7CisgICAgICAgIE9SU0xCdXN5U2V0IGJzZXQ7CisKKyAgICAgICAgYnNldC50eXBlID0gQlVTWV9TRVRfRlVMTDsKKyAgICAgICAgaWYgKE9SU0xSZXNlcnZlKDEsICZwbnVtLCAmYnNldCwgbXlfdGFnKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgdHJ5X3Jlc2VydmUoaW50IGRldmljZSkKK3sKKyAgICBpZiAoaXNfZW5hYmxlZCkgeworICAgICAgICBpbnQgcG51bSA9IG1pY19lbmdpbmVzW2RldmljZV0uZ2V0X3BoeXNpY2FsX2luZGV4KCk7CisgICAgICAgIE9SU0xCdXN5U2V0IGJzZXQ7CisKKyAgICAgICAgYnNldC50eXBlID0gQlVTWV9TRVRfRlVMTDsKKyAgICAgICAgaWYgKE9SU0xUcnlSZXNlcnZlKDEsICZwbnVtLCAmYnNldCwgbXlfdGFnKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgcmVsZWFzZShpbnQgZGV2aWNlKQoreworICAgIGlmIChpc19lbmFibGVkKSB7CisgICAgICAgIGludCBwbnVtID0gbWljX2VuZ2luZXNbZGV2aWNlXS5nZXRfcGh5c2ljYWxfaW5kZXgoKTsKKyAgICAgICAgT1JTTEJ1c3lTZXQgYnNldDsKKworICAgICAgICBic2V0LnR5cGUgPSBCVVNZX1NFVF9GVUxMOworICAgICAgICBpZiAoT1JTTFJlbGVhc2UoMSwgJnBudW0sICZic2V0LCBteV90YWcpICE9IDApIHsKKyAgICAgICAgICAgIC8vIHNob3VsZCBuZXZlciBnZXQgaGVyZQorICAgICAgICB9CisgICAgfQorfQorCit9IC8vIG5hbWVzcGFjZSBPUlNMCmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX29yc2wuaCBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfb3JzbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkYjg2ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX29yc2wuaApAQCAtMCwwICsxLDI1IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgT0ZGTE9BRF9PUlNMX0hfSU5DTFVERUQKKyNkZWZpbmUgT0ZGTE9BRF9PUlNMX0hfSU5DTFVERUQKKworLy8gT1JTTCBpbnRlcmZhY2UKK25hbWVzcGFjZSBPUlNMIHsKKworZXh0ZXJuIHZvaWQgaW5pdCgpOworCitleHRlcm4gYm9vbCByZXNlcnZlKGludCBkZXZpY2UpOworZXh0ZXJuIGJvb2wgdHJ5X3Jlc2VydmUoaW50IGRldmljZSk7CitleHRlcm4gdm9pZCByZWxlYXNlKGludCBkZXZpY2UpOworCit9IC8vIG5hbWVzcGFjZSBPUlNMCisKKyNlbmRpZiAvLyBPRkZMT0FEX09SU0xfSF9JTkNMVURFRApkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90YWJsZS5jcHAgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3RhYmxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjE2NWRmCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90YWJsZS5jcHAKQEAgLTAsMCArMSwzNzUgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgIm9mZmxvYWRfdGFibGUuaCIKKyNpbmNsdWRlICJvZmZsb2FkX2NvbW1vbi5oIgorCisjaWYgIUhPU1RfTElCUkFSWQorLy8gUHJlZGVmaW5lZCBvZmZsb2FkIGVudHJpZXMKK2V4dGVybiB2b2lkIG9tcF9zZXRfbnVtX3RocmVhZHNfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIG9tcF9nZXRfbWF4X3RocmVhZHNfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIG9tcF9nZXRfbnVtX3Byb2NzX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBvbXBfc2V0X2R5bmFtaWNfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIG9tcF9nZXRfZHluYW1pY19scmIodm9pZCopOworZXh0ZXJuIHZvaWQgb21wX3NldF9uZXN0ZWRfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIG9tcF9nZXRfbmVzdGVkX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBvbXBfc2V0X3NjaGVkdWxlX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBvbXBfZ2V0X3NjaGVkdWxlX2xyYih2b2lkKik7CisKK2V4dGVybiB2b2lkIG9tcF9pbml0X2xvY2tfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIG9tcF9kZXN0cm95X2xvY2tfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIG9tcF9zZXRfbG9ja19scmIodm9pZCopOworZXh0ZXJuIHZvaWQgb21wX3Vuc2V0X2xvY2tfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIG9tcF90ZXN0X2xvY2tfbHJiKHZvaWQqKTsKKworZXh0ZXJuIHZvaWQgb21wX2luaXRfbmVzdF9sb2NrX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBvbXBfZGVzdHJveV9uZXN0X2xvY2tfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIG9tcF9zZXRfbmVzdF9sb2NrX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBvbXBfdW5zZXRfbmVzdF9sb2NrX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBvbXBfdGVzdF9uZXN0X2xvY2tfbHJiKHZvaWQqKTsKKworZXh0ZXJuIHZvaWQga21wX3NldF9zdGFja3NpemVfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIGttcF9nZXRfc3RhY2tzaXplX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBrbXBfc2V0X3N0YWNrc2l6ZV9zX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBrbXBfZ2V0X3N0YWNrc2l6ZV9zX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBrbXBfc2V0X2Jsb2NrdGltZV9scmIodm9pZCopOworZXh0ZXJuIHZvaWQga21wX2dldF9ibG9ja3RpbWVfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIGttcF9zZXRfbGlicmFyeV9zZXJpYWxfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dF9scmIodm9pZCopOworZXh0ZXJuIHZvaWQga21wX3NldF9saWJyYXJ5X2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBrbXBfZ2V0X2xpYnJhcnlfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIGttcF9zZXRfZGVmYXVsdHNfbHJiKHZvaWQqKTsKKworZXh0ZXJuIHZvaWQga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBrbXBfc2V0X2FmZmluaXR5X2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBrbXBfZ2V0X2FmZmluaXR5X2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY19scmIodm9pZCopOworZXh0ZXJuIHZvaWQga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY19scmIodm9pZCopOworZXh0ZXJuIHZvaWQga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2NfbHJiKHZvaWQqKTsKKworLy8gUHJlZGVmaW5lZCBlbnRyaWVzIG9uIHRoZSB0YXJnZXQgc2lkZQorc3RhdGljIEZ1bmNUYWJsZTo6RW50cnkgcHJlZGVmaW5lZF9lbnRyaWVzW10gPSB7CisgICAgIm9tcF9zZXRfbnVtX3RocmVhZHNfdGFyZ2V0IiwKKyAgICAodm9pZCopICZvbXBfc2V0X251bV90aHJlYWRzX2xyYiwKKyAgICAib21wX2dldF9tYXhfdGhyZWFkc190YXJnZXQiLAorICAgICh2b2lkKikgJm9tcF9nZXRfbWF4X3RocmVhZHNfbHJiLAorICAgICJvbXBfZ2V0X251bV9wcm9jc190YXJnZXQiLAorICAgICh2b2lkKikgJm9tcF9nZXRfbnVtX3Byb2NzX2xyYiwKKyAgICAib21wX3NldF9keW5hbWljX3RhcmdldCIsCisgICAgKHZvaWQqKSAmb21wX3NldF9keW5hbWljX2xyYiwKKyAgICAib21wX2dldF9keW5hbWljX3RhcmdldCIsCisgICAgKHZvaWQqKSAmb21wX2dldF9keW5hbWljX2xyYiwKKyAgICAib21wX3NldF9uZXN0ZWRfdGFyZ2V0IiwKKyAgICAodm9pZCopICZvbXBfc2V0X25lc3RlZF9scmIsCisgICAgIm9tcF9nZXRfbmVzdGVkX3RhcmdldCIsCisgICAgKHZvaWQqKSAmb21wX2dldF9uZXN0ZWRfbHJiLAorICAgICJvbXBfc2V0X3NjaGVkdWxlX3RhcmdldCIsCisgICAgKHZvaWQqKSAmb21wX3NldF9zY2hlZHVsZV9scmIsCisgICAgIm9tcF9nZXRfc2NoZWR1bGVfdGFyZ2V0IiwKKyAgICAodm9pZCopICZvbXBfZ2V0X3NjaGVkdWxlX2xyYiwKKworICAgICJvbXBfaW5pdF9sb2NrX3RhcmdldCIsCisgICAgKHZvaWQqKSAmb21wX2luaXRfbG9ja19scmIsCisgICAgIm9tcF9kZXN0cm95X2xvY2tfdGFyZ2V0IiwKKyAgICAodm9pZCopICZvbXBfZGVzdHJveV9sb2NrX2xyYiwKKyAgICAib21wX3NldF9sb2NrX3RhcmdldCIsCisgICAgKHZvaWQqKSAmb21wX3NldF9sb2NrX2xyYiwKKyAgICAib21wX3Vuc2V0X2xvY2tfdGFyZ2V0IiwKKyAgICAodm9pZCopICZvbXBfdW5zZXRfbG9ja19scmIsCisgICAgIm9tcF90ZXN0X2xvY2tfdGFyZ2V0IiwKKyAgICAodm9pZCopICZvbXBfdGVzdF9sb2NrX2xyYiwKKworICAgICJvbXBfaW5pdF9uZXN0X2xvY2tfdGFyZ2V0IiwKKyAgICAodm9pZCopICZvbXBfaW5pdF9uZXN0X2xvY2tfbHJiLAorICAgICJvbXBfZGVzdHJveV9uZXN0X2xvY2tfdGFyZ2V0IiwKKyAgICAodm9pZCopICZvbXBfZGVzdHJveV9uZXN0X2xvY2tfbHJiLAorICAgICJvbXBfc2V0X25lc3RfbG9ja190YXJnZXQiLAorICAgICh2b2lkKikgJm9tcF9zZXRfbmVzdF9sb2NrX2xyYiwKKyAgICAib21wX3Vuc2V0X25lc3RfbG9ja190YXJnZXQiLAorICAgICh2b2lkKikgJm9tcF91bnNldF9uZXN0X2xvY2tfbHJiLAorICAgICJvbXBfdGVzdF9uZXN0X2xvY2tfdGFyZ2V0IiwKKyAgICAodm9pZCopICZvbXBfdGVzdF9uZXN0X2xvY2tfbHJiLAorCisgICAgImttcF9zZXRfc3RhY2tzaXplX3RhcmdldCIsCisgICAgKHZvaWQqKSAma21wX3NldF9zdGFja3NpemVfbHJiLAorICAgICJrbXBfZ2V0X3N0YWNrc2l6ZV90YXJnZXQiLAorICAgICh2b2lkKikgJmttcF9nZXRfc3RhY2tzaXplX2xyYiwKKyAgICAia21wX3NldF9zdGFja3NpemVfc190YXJnZXQiLAorICAgICh2b2lkKikgJmttcF9zZXRfc3RhY2tzaXplX3NfbHJiLAorICAgICJrbXBfZ2V0X3N0YWNrc2l6ZV9zX3RhcmdldCIsCisgICAgKHZvaWQqKSAma21wX2dldF9zdGFja3NpemVfc19scmIsCisgICAgImttcF9zZXRfYmxvY2t0aW1lX3RhcmdldCIsCisgICAgKHZvaWQqKSAma21wX3NldF9ibG9ja3RpbWVfbHJiLAorICAgICJrbXBfZ2V0X2Jsb2NrdGltZV90YXJnZXQiLAorICAgICh2b2lkKikgJmttcF9nZXRfYmxvY2t0aW1lX2xyYiwKKyAgICAia21wX3NldF9saWJyYXJ5X3NlcmlhbF90YXJnZXQiLAorICAgICh2b2lkKikgJmttcF9zZXRfbGlicmFyeV9zZXJpYWxfbHJiLAorICAgICJrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZF90YXJnZXQiLAorICAgICh2b2lkKikgJmttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kX2xyYiwKKyAgICAia21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXRfdGFyZ2V0IiwKKyAgICAodm9pZCopICZrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dF9scmIsCisgICAgImttcF9zZXRfbGlicmFyeV90YXJnZXQiLAorICAgICh2b2lkKikgJmttcF9zZXRfbGlicmFyeV9scmIsCisgICAgImttcF9nZXRfbGlicmFyeV90YXJnZXQiLAorICAgICh2b2lkKikgJmttcF9nZXRfbGlicmFyeV9scmIsCisgICAgImttcF9zZXRfZGVmYXVsdHNfdGFyZ2V0IiwKKyAgICAodm9pZCopICZrbXBfc2V0X2RlZmF1bHRzX2xyYiwKKworICAgICJrbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfdGFyZ2V0IiwKKyAgICAodm9pZCopICZrbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfbHJiLAorICAgICJrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrX3RhcmdldCIsCisgICAgKHZvaWQqKSAma21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza19scmIsCisgICAgImttcF9zZXRfYWZmaW5pdHlfdGFyZ2V0IiwKKyAgICAodm9pZCopICZrbXBfc2V0X2FmZmluaXR5X2xyYiwKKyAgICAia21wX2dldF9hZmZpbml0eV90YXJnZXQiLAorICAgICh2b2lkKikgJmttcF9nZXRfYWZmaW5pdHlfbHJiLAorICAgICJrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jX3RhcmdldCIsCisgICAgKHZvaWQqKSAma21wX2dldF9hZmZpbml0eV9tYXhfcHJvY19scmIsCisgICAgImttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldCIsCisgICAgKHZvaWQqKSAma21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2NfbHJiLAorICAgICJrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldCIsCisgICAgKHZvaWQqKSAma21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY19scmIsCisgICAgImttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldCIsCisgICAgKHZvaWQqKSAma21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2NfbHJiLAorCisgICAgKGNvbnN0IGNoYXIqKSAtMSwKKyAgICAodm9pZCopIC0xCit9OworCitzdGF0aWMgRnVuY0xpc3Q6Ok5vZGUgcHJlZGVmaW5lZF90YWJsZSA9IHsKKyAgICB7IHByZWRlZmluZWRfZW50cmllcywgLTEgfSwKKyAgICAwLCAwCit9OworCisvLyBFbnRyeSB0YWJsZQorRnVuY0xpc3QgX19vZmZsb2FkX2VudHJpZXMoJnByZWRlZmluZWRfdGFibGUpOworI2Vsc2UKK0Z1bmNMaXN0IF9fb2ZmbG9hZF9lbnRyaWVzOworI2VuZGlmIC8vICFIT1NUX0xJQlJBUlkKKworLy8gRnVuY3Rpb24gdGFibGUuIE5vIHByZWRlZmluZWQgZW50cmllcy4KK0Z1bmNMaXN0IF9fb2ZmbG9hZF9mdW5jczsKKworLy8gVmFyIHRhYmxlCitWYXJMaXN0ICBfX29mZmxvYWRfdmFyczsKKworLy8gR2l2ZW4gdGhlIGZ1bmN0aW9uIG5hbWUgcmV0dXJucyB0aGUgYXNzb2NpdGF0ZWQgZnVuY3Rpb24gcG9pbnRlcgorY29uc3Qgdm9pZCogRnVuY0xpc3Q6OmZpbmRfYWRkcihjb25zdCBjaGFyICpuYW1lKQoreworICAgIGNvbnN0IHZvaWQqIGZ1bmMgPSAwOworCisgICAgbV9sb2NrLmxvY2soKTsKKworICAgIGZvciAoTm9kZSAqbiA9IG1faGVhZDsgbiAhPSAwOyBuID0gbi0+bmV4dCkgeworICAgICAgICBmb3IgKGNvbnN0IFRhYmxlOjpFbnRyeSAqZSA9IG4tPnRhYmxlLmVudHJpZXM7CisgICAgICAgICAgICAgZS0+bmFtZSAhPSAoY29uc3QgY2hhciopIC0xOyBlKyspIHsKKyAgICAgICAgICAgIGlmIChlLT5uYW1lICE9IDAgJiYgc3RyY21wKGUtPm5hbWUsIG5hbWUpID09IDApIHsKKyAgICAgICAgICAgICAgICBmdW5jID0gZS0+ZnVuYzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIG1fbG9jay51bmxvY2soKTsKKworICAgIHJldHVybiBmdW5jOworfQorCisvLyBHaXZlbiB0aGUgZnVuY3Rpb24gcG9pbnRlciByZXR1cm5zIHRoZSBhc3NvY2l0YXRlZCBmdW5jdGlvbiBuYW1lCitjb25zdCBjaGFyKiBGdW5jTGlzdDo6ZmluZF9uYW1lKGNvbnN0IHZvaWQgKmZ1bmMpCit7CisgICAgY29uc3QgY2hhciogbmFtZSA9IDA7CisKKyAgICBtX2xvY2subG9jaygpOworCisgICAgZm9yIChOb2RlICpuID0gbV9oZWFkOyBuICE9IDA7IG4gPSBuLT5uZXh0KSB7CisgICAgICAgIGZvciAoY29uc3QgVGFibGU6OkVudHJ5ICplID0gbi0+dGFibGUuZW50cmllczsKKyAgICAgICAgICAgICBlLT5uYW1lICE9IChjb25zdCBjaGFyKikgLTE7IGUrKykgeworICAgICAgICAgICAgaWYgKGUtPmZ1bmMgPT0gZnVuYykgeworICAgICAgICAgICAgICAgIG5hbWUgPSBlLT5uYW1lOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgbV9sb2NrLnVubG9jaygpOworCisgICAgcmV0dXJuIG5hbWU7Cit9CisKKy8vIFJldHVybnMgbWF4IG5hbWUgbGVuZ3RoIGZyb20gYWxsIHRhYmxlcworaW50NjRfdCBGdW5jTGlzdDo6bWF4X25hbWVfbGVuZ3RoKHZvaWQpCit7CisgICAgaWYgKG1fbWF4X25hbWVfbGVuIDwgMCkgeworICAgICAgICBtX2xvY2subG9jaygpOworCisgICAgICAgIG1fbWF4X25hbWVfbGVuID0gMDsKKyAgICAgICAgZm9yIChOb2RlICpuID0gbV9oZWFkOyBuICE9IDA7IG4gPSBuLT5uZXh0KSB7CisgICAgICAgICAgICBpZiAobi0+dGFibGUubWF4X25hbWVfbGVuIDwgMCkgeworICAgICAgICAgICAgICAgIG4tPnRhYmxlLm1heF9uYW1lX2xlbiA9IDA7CisKKyAgICAgICAgICAgICAgICAvLyBjYWxjdWxhdGUgbWF4IG5hbWUgbGVuZ3RoIGluIGEgc2luZ2xlIHRhYmxlCisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBUYWJsZTo6RW50cnkgKmUgPSBuLT50YWJsZS5lbnRyaWVzOworICAgICAgICAgICAgICAgICAgICAgZS0+bmFtZSAhPSAoY29uc3QgY2hhciopIC0xOyBlKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGUtPm5hbWUgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbihlLT5uYW1lKSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobi0+dGFibGUubWF4X25hbWVfbGVuIDwgbGVuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi0+dGFibGUubWF4X25hbWVfbGVuID0gbGVuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzZWxlY3QgbWF4IGZyb20gYWxsIHRhYmxlcworICAgICAgICAgICAgaWYgKG1fbWF4X25hbWVfbGVuIDwgbi0+dGFibGUubWF4X25hbWVfbGVuKSB7CisgICAgICAgICAgICAgICAgbV9tYXhfbmFtZV9sZW4gPSBuLT50YWJsZS5tYXhfbmFtZV9sZW47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtX2xvY2sudW5sb2NrKCk7CisgICAgfQorICAgIHJldHVybiBtX21heF9uYW1lX2xlbjsKK30KKworLy8gRGVidWdnaW5nIGR1bXAKK3ZvaWQgRnVuY0xpc3Q6OmR1bXAodm9pZCkKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGdW5jdGlvbiB0YWJsZTpcbiIpOworCisgICAgbV9sb2NrLmxvY2soKTsKKworICAgIGZvciAoTm9kZSAqbiA9IG1faGVhZDsgbiAhPSAwOyBuID0gbi0+bmV4dCkgeworICAgICAgICBmb3IgKGNvbnN0IFRhYmxlOjpFbnRyeSAqZSA9IG4tPnRhYmxlLmVudHJpZXM7CisgICAgICAgICAgICAgZS0+bmFtZSAhPSAoY29uc3QgY2hhciopIC0xOyBlKyspIHsKKyAgICAgICAgICAgIGlmIChlLT5uYW1lICE9IDApIHsKKyAgICAgICAgICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICIlcCAlc1xuIiwgZS0+ZnVuYywgZS0+bmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtX2xvY2sudW5sb2NrKCk7Cit9CisKKy8vIERlYnVnZ2luZyBkdW1wCit2b2lkIFZhckxpc3Q6OmR1bXAodm9pZCkKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJWYXIgdGFibGU6XG4iKTsKKworICAgIG1fbG9jay5sb2NrKCk7CisKKyAgICBmb3IgKE5vZGUgKm4gPSBtX2hlYWQ7IG4gIT0gMDsgbiA9IG4tPm5leHQpIHsKKyAgICAgICAgZm9yIChjb25zdCBUYWJsZTo6RW50cnkgKmUgPSBuLT50YWJsZS5lbnRyaWVzOworICAgICAgICAgICAgIGUtPm5hbWUgIT0gKGNvbnN0IGNoYXIqKSAtMTsgZSsrKSB7CisgICAgICAgICAgICBpZiAoZS0+bmFtZSAhPSAwKSB7CisjaWYgSE9TVF9MSUJSQVJZCisgICAgICAgICAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiJXMgJXAgJWxkXG4iLCBlLT5uYW1lLCBlLT5hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS0+c2l6ZSk7CisjZWxzZSAgLy8gSE9TVF9MSUJSQVJZCisgICAgICAgICAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiJXMgJXBcbiIsIGUtPm5hbWUsIGUtPmFkZHIpOworI2VuZGlmIC8vIEhPU1RfTElCUkFSWQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgbV9sb2NrLnVubG9jaygpOworfQorCisvLworaW50NjRfdCBWYXJMaXN0Ojp0YWJsZV9zaXplKGludDY0X3QgJm5lbGVtcykKK3sKKyAgICBpbnQ2NF90IGxlbmd0aCA9IDA7CisKKyAgICBuZWxlbXMgPSAwOworCisgICAgLy8gY2FsY3VsYXRlIHN0cmluZyB0YWJsZSBzaXplIGFuZCBudW1iZXIgb2YgZWxlbWVudHMKKyAgICBmb3IgKE5vZGUgKm4gPSBtX2hlYWQ7IG4gIT0gMDsgbiA9IG4tPm5leHQpIHsKKyAgICAgICAgZm9yIChjb25zdCBUYWJsZTo6RW50cnkgKmUgPSBuLT50YWJsZS5lbnRyaWVzOworICAgICAgICAgICAgIGUtPm5hbWUgIT0gKGNvbnN0IGNoYXIqKSAtMTsgZSsrKSB7CisgICAgICAgICAgICBpZiAoZS0+bmFtZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbGVuZ3RoICs9IHN0cmxlbihlLT5uYW1lKSArIDE7CisgICAgICAgICAgICAgICAgbmVsZW1zKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbmVsZW1zICogc2l6ZW9mKEJ1ZkVudHJ5KSArIGxlbmd0aDsKK30KKworLy8gY29weSB0YWJsZSB0byB0aGUgZ3ZlbiBidWZmZXIKK3ZvaWQgVmFyTGlzdDo6dGFibGVfY29weSh2b2lkICpidWYsIGludDY0X3QgbmVsZW1zKQoreworICAgIEJ1ZkVudHJ5KiBlbGVtcyA9IHN0YXRpY19jYXN0PEJ1ZkVudHJ5Kj4oYnVmKTsKKyAgICBjaGFyKiAgICAgbmFtZXMgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihlbGVtcyArIG5lbGVtcyk7CisKKyAgICAvLyBjb3B5IGVudHJpZXMgdG8gYnVmZmVyCisgICAgZm9yIChOb2RlICpuID0gbV9oZWFkOyBuICE9IDA7IG4gPSBuLT5uZXh0KSB7CisgICAgICAgIGZvciAoY29uc3QgVGFibGU6OkVudHJ5ICplID0gbi0+dGFibGUuZW50cmllczsKKyAgICAgICAgICAgICBlLT5uYW1lICE9IChjb25zdCBjaGFyKikgLTE7IGUrKykgeworICAgICAgICAgICAgaWYgKGUtPm5hbWUgIT0gMCkgeworICAgICAgICAgICAgICAgIC8vIG5hbWUgZmllbGQgY29udGFpbnMgb2Zmc2V0IHRvIHRoZSBuYW1lIGZyb20gdGhlIGJlZ2lubmluZworICAgICAgICAgICAgICAgIC8vIG9mIHRoZSBidWZmZXIKKyAgICAgICAgICAgICAgICBlbGVtcy0+bmFtZSA9IG5hbWVzIC0gc3RhdGljX2Nhc3Q8Y2hhcio+KGJ1Zik7CisgICAgICAgICAgICAgICAgZWxlbXMtPmFkZHIgPSByZWludGVycHJldF9jYXN0PGludHB0cl90PihlLT5hZGRyKTsKKworICAgICAgICAgICAgICAgIC8vIGNvcHkgbmFtZSB0byBzdHJpbmcgdGFibGUKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lID0gZS0+bmFtZTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKCpuYW1lcysrID0gKm5hbWUrKykgIT0gJ1wwJyk7CisKKyAgICAgICAgICAgICAgICBlbGVtcysrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvLyBwYXRjaCBuYW1lIG9mZnNldHMgaW4gYSBidWZmZXIKK3ZvaWQgVmFyTGlzdDo6dGFibGVfcGF0Y2hfbmFtZXModm9pZCAqYnVmLCBpbnQ2NF90IG5lbGVtcykKK3sKKyAgICBCdWZFbnRyeSogZWxlbXMgPSBzdGF0aWNfY2FzdDxCdWZFbnRyeSo+KGJ1Zik7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZWxlbXM7IGkrKykgeworICAgICAgICBlbGVtc1tpXS5uYW1lICs9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KGJ1Zik7CisgICAgfQorfQorCisvLyBBZGRzIGdpdmVuIGxpc3QgZWxlbWVudCB0byB0aGUgZ2xvYmFsIGxvb2t1cCB0YWJsZSBsaXN0CitleHRlcm4gIkMiIHZvaWQgX19vZmZsb2FkX3JlZ2lzdGVyX3RhYmxlcygKKyAgICBGdW5jTGlzdDo6Tm9kZSAqZW50cnlfdGFibGUsCisgICAgRnVuY0xpc3Q6Ok5vZGUgKmZ1bmNfdGFibGUsCisgICAgVmFyTGlzdDo6Tm9kZSAqdmFyX3RhYmxlCispCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiUmVnaXN0ZXJpbmcgb2ZmbG9hZCBmdW5jdGlvbiBlbnRyeSB0YWJsZSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5X3RhYmxlKTsKKyAgICBfX29mZmxvYWRfZW50cmllcy5hZGRfdGFibGUoZW50cnlfdGFibGUpOworCisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiUmVnaXN0ZXJpbmcgZnVuY3Rpb24gdGFibGUgJXBcbiIsIGZ1bmNfdGFibGUpOworICAgIF9fb2ZmbG9hZF9mdW5jcy5hZGRfdGFibGUoZnVuY190YWJsZSk7CisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJSZWdpc3RlcmluZyB2YXIgdGFibGUgJXBcbiIsIHZhcl90YWJsZSk7CisgICAgX19vZmZsb2FkX3ZhcnMuYWRkX3RhYmxlKHZhcl90YWJsZSk7Cit9CisKKy8vIFJlbW92ZXMgZ2l2ZW4gbGlzdCBlbGVtZW50IGZyb20gdGhlIGdsb2JhbCBsb29rdXAgdGFibGUgbGlzdAorZXh0ZXJuICJDIiB2b2lkIF9fb2ZmbG9hZF91bnJlZ2lzdGVyX3RhYmxlcygKKyAgICBGdW5jTGlzdDo6Tm9kZSAqZW50cnlfdGFibGUsCisgICAgRnVuY0xpc3Q6Ok5vZGUgKmZ1bmNfdGFibGUsCisgICAgVmFyTGlzdDo6Tm9kZSAqdmFyX3RhYmxlCispCit7CisgICAgX19vZmZsb2FkX2VudHJpZXMucmVtb3ZlX3RhYmxlKGVudHJ5X3RhYmxlKTsKKworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIlVucmVnaXN0ZXJpbmcgZnVuY3Rpb24gdGFibGUgJXBcbiIsIGZ1bmNfdGFibGUpOworICAgIF9fb2ZmbG9hZF9mdW5jcy5yZW1vdmVfdGFibGUoZnVuY190YWJsZSk7CisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJVbnJlZ2lzdGVyaW5nIHZhciB0YWJsZSAlcFxuIiwgdmFyX3RhYmxlKTsKKyAgICBfX29mZmxvYWRfdmFycy5yZW1vdmVfdGFibGUodmFyX3RhYmxlKTsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfdGFibGUuaCBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfdGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmNlZDNlCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90YWJsZS5oCkBAIC0wLDAgKzEsMzAxIEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKy8qISBcZmlsZQorICAgIFxicmllZiBGdW5jdGlvbiBhbmQgVmFyaWFibGUgdGFibGVzIHVzZWQgYnkgdGhlIHJ1bnRpbWUgbGlicmFyeQorKi8KKworI2lmbmRlZiBPRkZMT0FEX1RBQkxFX0hfSU5DTFVERUQKKyNkZWZpbmUgT0ZGTE9BRF9UQUJMRV9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlICJvZmZsb2FkX3V0aWwuaCIKKworLy8gVGVtcGxhdGUgcmVwcmVzZW50aW5nIGRvdWJsZSBsaW5rZWQgbGlzdCBvZiB0YWJsZXMKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBUYWJsZUxpc3QgeworcHVibGljOgorICAgIC8vIHRhYmxlIHR5cGUKKyAgICB0eXBlZGVmIFQgVGFibGU7CisKKyAgICAvLyBMaXN0IG5vZGUKKyAgICBzdHJ1Y3QgTm9kZSB7CisgICAgICAgIFRhYmxlICAgdGFibGU7CisgICAgICAgIE5vZGUqICAgcHJldjsKKyAgICAgICAgTm9kZSogICBuZXh0OworICAgIH07CisKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBUYWJsZUxpc3QoTm9kZSAqbm9kZSA9IDApIDogbV9oZWFkKG5vZGUpIHt9CisKKyAgICB2b2lkIGFkZF90YWJsZShOb2RlICpub2RlKSB7CisgICAgICAgIG1fbG9jay5sb2NrKCk7CisKKyAgICAgICAgaWYgKG1faGVhZCAhPSAwKSB7CisgICAgICAgICAgICBub2RlLT5uZXh0ID0gbV9oZWFkOworICAgICAgICAgICAgbV9oZWFkLT5wcmV2ID0gbm9kZTsKKyAgICAgICAgfQorICAgICAgICBtX2hlYWQgPSBub2RlOworCisgICAgICAgIG1fbG9jay51bmxvY2soKTsKKyAgICB9CisKKyAgICB2b2lkIHJlbW92ZV90YWJsZShOb2RlICpub2RlKSB7CisgICAgICAgIG1fbG9jay5sb2NrKCk7CisKKyAgICAgICAgaWYgKG5vZGUtPm5leHQgIT0gMCkgeworICAgICAgICAgICAgbm9kZS0+bmV4dC0+cHJldiA9IG5vZGUtPnByZXY7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5vZGUtPnByZXYgIT0gMCkgeworICAgICAgICAgICAgbm9kZS0+cHJldi0+bmV4dCA9IG5vZGUtPm5leHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1faGVhZCA9PSBub2RlKSB7CisgICAgICAgICAgICBtX2hlYWQgPSBub2RlLT5uZXh0OworICAgICAgICB9CisKKyAgICAgICAgbV9sb2NrLnVubG9jaygpOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIE5vZGUqICAgICAgICAgICBtX2hlYWQ7CisgICAgbXV0ZXhfdCAgICAgICAgIG1fbG9jazsKK307CisKKy8vIEZ1bmN0aW9uIGxvb2t1cCB0YWJsZS4KK3N0cnVjdCBGdW5jVGFibGUgeworICAgIC8vISBGdW5jdGlvbiB0YWJsZSBlbnRyeQorICAgIC8qISBUaGlzIHRhYmxlIGNvbnRhaW5zIGZ1bmN0aW9ucyBjcmVhdGVkIGZyb20gb2ZmbG9hZCByZWdpb25zLiAgICovCisgICAgLyohIEVhY2ggZW50cnkgY29uc2lzdHMgb2YgYSBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbidzICJrZXkiCisgICAgICAgIGFuZCB0aGUgZnVuY3Rpb24gYWRkcmVzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiEgRWFjaCBzaGFyZWQgbGlicmFyeSBvciBleGVjdXRhYmxlIG1heSBjb250YWluIG9uZSBzdWNoIHRhYmxlLiAqLworICAgIC8qISBUaGUgZW5kIG9mIHRoZSB0YWJsZSBpcyBtYXJrZWQgd2l0aCBhbiBlbnRyeSB3aG9zZSBuYW1lIGZpZWxkCisgICAgICAgIGhhcyB2YWx1ZSAtMS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBzdHJ1Y3QgRW50cnkgeworICAgICAgICBjb25zdCBjaGFyKiBuYW1lOyAvLyE8IE5hbWUgb2YgdGhlIGZ1bmN0aW9uCisgICAgICAgIHZvaWQqICAgICAgIGZ1bmM7IC8vITwgQWRkcmVzcyBvZiB0aGUgZnVuY3Rpb24KKyAgICB9OworCisgICAgLy8gZW50cmllcworICAgIGNvbnN0IEVudHJ5ICplbnRyaWVzOworCisgICAgLy8gbWF4IG5hbWUgbGVuZ3RoCisgICAgaW50NjRfdCBtYXhfbmFtZV9sZW47Cit9OworCisvLyBGdW5jdGlvbiB0YWJsZQorY2xhc3MgRnVuY0xpc3QgOiBwdWJsaWMgVGFibGVMaXN0PEZ1bmNUYWJsZT4geworcHVibGljOgorICAgIGV4cGxpY2l0IEZ1bmNMaXN0KE5vZGUgKm5vZGUgPSAwKSA6IFRhYmxlTGlzdDxUYWJsZT4obm9kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9tYXhfbmFtZV9sZW4oLTEpCisgICAge30KKworICAgIC8vIGFkZCB0YWJsZSB0byB0aGUgbGlzdAorICAgIHZvaWQgYWRkX3RhYmxlKE5vZGUgKm5vZGUpIHsKKyAgICAgICAgLy8gcmVjYWxjdWxhdGUgbWF4IGZ1bmN0aW9uIG5hbWUgbGVuZ3RoCisgICAgICAgIG1fbWF4X25hbWVfbGVuID0gLTE7CisKKyAgICAgICAgLy8gYWRkIHRhYmxlCisgICAgICAgIFRhYmxlTGlzdDxUYWJsZT46OmFkZF90YWJsZShub2RlKTsKKyAgICB9CisKKyAgICAvLyBmaW5kIGZ1bmN0aW9uIGFkZHJlc3MgZm9yIHRoZSBnaXZlbiBuYW1lCisgICAgY29uc3Qgdm9pZCogZmluZF9hZGRyKGNvbnN0IGNoYXIgKm5hbWUpOworCisgICAgLy8gZmluZCBmdW5jdGlvbiBuYW1lIGZvciB0aGUgZ2l2ZW4gYWRkcmVzcworICAgIGNvbnN0IGNoYXIqIGZpbmRfbmFtZShjb25zdCB2b2lkICphZGRyKTsKKworICAgIC8vIG1heCBuYW1lIGxlbmd0aCBmcm9tIGFsbCB0YWJsZXMgaW4gdGhlIGxpc3QKKyAgICBpbnQ2NF90IG1heF9uYW1lX2xlbmd0aCh2b2lkKTsKKworICAgIC8vIGRlYnVnIGR1bXAKKyAgICB2b2lkIGR1bXAodm9pZCk7CisKK3ByaXZhdGU6CisgICAgLy8gbWF4IG5hbWUgbGVuZ3RoIHdpdGhpbiBmcm9tIGFsbCB0YWJsZXMKKyAgICBpbnQ2NF90IG1fbWF4X25hbWVfbGVuOworfTsKKworLy8gVGFibGUgZW50cnkgZm9yIHN0YXRpYyB2YXJpYWJsZXMKK3N0cnVjdCBWYXJUYWJsZSB7CisgICAgLy8hIFZhcmlhYmxlIHRhYmxlIGVudHJ5CisgICAgLyohIFRoaXMgdGFibGUgY29udGFpbnMgc3RhdGljYWxseSBhbGxvY2F0ZWQgdmFyaWFibGVzIG1hcmtlZCB3aXRoCisgICAgICAgIF9fZGVjbHNwZWModGFyZ2V0KG1pYykgb3IgI3ByYWdtYSBvbXAgZGVjbGFyZSB0YXJnZXQuICAgICAgICAgICAqLworICAgIC8qISBFYWNoIGVudHJ5IGNvbnNpc3RzIG9mIGEgcG9pbnRlciB0byB0aGUgdmFyaWFibGUncyAia2V5IiwKKyAgICAgICAgdGhlIHZhcmlhYmxlIGFkZHJlc3MgYW5kIGl0cyBzaXplIGluIGJ5dGVzLiAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyohIEJlY2F1c2UgbWVtb3J5IGFsbG9jYXRpb24gaXMgZG9uZSBmcm9tIHRoZSBob3N0LAorICAgICAgICB0aGUgTUlDIHRhYmxlIGRvZXMgbm90IG5lZWQgdGhlIHNpemUgb2YgdGhlIHZhcmlhYmxlLiAgICAgICAgICAgKi8KKyAgICAvKiEgUGFkZGluZyB0byBtYWtlIHRoZSB0YWJsZSBlbnRyeSBzaXplIGEgcG93ZXIgb2YgMiBpcyBuZWNlc3NhcnkKKyAgICAgICAgdG8gYXZvaWQgImhvbGVzIiBiZXR3ZWVuIHRhYmxlIGNvbnRyaWJ1dGlvbnMgZnJvbSBkaWZmZXJlbnQgb2JqZWN0CisgICAgICAgIGZpbGVzIG9uIFdpbmRvd3Mgd2hlbiBkZWJ1ZyBpbmZvcm1hdGlvbiBpcyBzcGVjaWZpZWQgd2l0aCAvWmkuICAqLworICAgIHN0cnVjdCBFbnRyeSB7CisgICAgICAgIGNvbnN0IGNoYXIqIG5hbWU7IC8vITwgTmFtZSBvZiB0aGUgdmFyaWFibGUKKyAgICAgICAgdm9pZCogICAgICAgYWRkcjsgLy8hPCBBZGRyZXNzIG9mIHRoZSB2YXJpYWJsZQorCisjaWYgSE9TVF9MSUJSQVJZCisgICAgICAgIHVpbnQ2NF90ICAgIHNpemU7CisKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKwkJLy8gcGFkZGluZyB0byBtYWtlIGVudHJ5IHNpemUgYSBwb3dlciBvZiAyCisgICAgICAgIHVpbnQ2NF90ICAgIHBhZGRpbmc7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisjZW5kaWYKKyAgICB9OworCisgICAgLy8gVGFibGUgdGVybWluYXRlZCBieSBhbiBlbnRyeSB3aXRoIG5hbWUgPT0gLTEKKyAgICBjb25zdCBFbnRyeSAqZW50cmllczsKK307CisKKy8vIExpc3Qgb2YgdmFyIHRhYmxlcworY2xhc3MgVmFyTGlzdCA6IHB1YmxpYyBUYWJsZUxpc3Q8VmFyVGFibGU+IHsKK3B1YmxpYzoKKyAgICBWYXJMaXN0KCkgOiBUYWJsZUxpc3Q8VGFibGU+KCkKKyAgICB7fQorCisgICAgLy8gZGVidWcgZHVtcAorICAgIHZvaWQgZHVtcCgpOworCitwdWJsaWM6CisgICAgLy8gdmFyIHRhYmxlIGxpc3QgaXRlcmF0b3IKKyAgICBjbGFzcyBJdGVyYXRvciA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGU6OkVudHJ5PiB7CisgICAgcHVibGljOgorICAgICAgICBJdGVyYXRvcigpIDogbV9ub2RlKDApLCBtX2VudHJ5KDApIHt9CisKKyAgICAgICAgZXhwbGljaXQgSXRlcmF0b3IoTm9kZSAqbm9kZSkgeworICAgICAgICAgICAgbmV3X25vZGUobm9kZSk7CisgICAgICAgIH0KKworICAgICAgICBJdGVyYXRvciYgb3BlcmF0b3IrKygpIHsKKyAgICAgICAgICAgIGlmIChtX2VudHJ5ICE9IDApIHsKKyAgICAgICAgICAgICAgICBtX2VudHJ5Kys7CisgICAgICAgICAgICAgICAgd2hpbGUgKG1fZW50cnktPm5hbWUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtX2VudHJ5Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtX2VudHJ5LT5uYW1lID09IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KC0xKSkgeworICAgICAgICAgICAgICAgICAgICBuZXdfbm9kZShtX25vZGUtPm5leHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJdGVyYXRvciAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtX2VudHJ5ID09IG90aGVyLm1fZW50cnk7CisgICAgICAgIH0KKworICAgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgSXRlcmF0b3IgJm90aGVyKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbV9lbnRyeSAhPSBvdGhlci5tX2VudHJ5OworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgVGFibGU6OkVudHJ5KiBvcGVyYXRvciooKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbV9lbnRyeTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgdm9pZCBuZXdfbm9kZShOb2RlICpub2RlKSB7CisgICAgICAgICAgICBtX25vZGUgPSBub2RlOworICAgICAgICAgICAgbV9lbnRyeSA9IDA7CisgICAgICAgICAgICB3aGlsZSAobV9ub2RlICE9IDApIHsKKyAgICAgICAgICAgICAgICBtX2VudHJ5ID0gbV9ub2RlLT50YWJsZS5lbnRyaWVzOworICAgICAgICAgICAgICAgIHdoaWxlIChtX2VudHJ5LT5uYW1lID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbV9lbnRyeSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobV9lbnRyeS0+bmFtZSAhPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigtMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1fbm9kZSA9IG1fbm9kZS0+bmV4dDsKKyAgICAgICAgICAgICAgICBtX2VudHJ5ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgTm9kZSAgICAgICAgICAgICAgICAqbV9ub2RlOworICAgICAgICBjb25zdCBUYWJsZTo6RW50cnkgICptX2VudHJ5OworICAgIH07CisKKyAgICBJdGVyYXRvciBiZWdpbigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEl0ZXJhdG9yKG1faGVhZCk7CisgICAgfQorCisgICAgSXRlcmF0b3IgZW5kKCkgY29uc3QgeworICAgICAgICByZXR1cm4gSXRlcmF0b3IoKTsKKyAgICB9CisKK3B1YmxpYzoKKyAgICAvLyBFbnRyeSByZXByZXNlbnRhdGlvbiBpbiBhIGNvcHkgYnVmZmVyCisgICAgc3RydWN0IEJ1ZkVudHJ5IHsKKyAgICAgICAgaW50cHRyX3QgbmFtZTsKKyAgICAgICAgaW50cHRyX3QgYWRkcjsKKyAgICB9OworCisgICAgLy8gQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHRhYmxlIGFuZAorICAgIC8vIHJldHVybnMgdGhlIHNpemUgb2YgYnVmZmVyIGZvciB0aGUgdGFibGUKKyAgICBpbnQ2NF90IHRhYmxlX3NpemUoaW50NjRfdCAmbmVsZW1zKTsKKworICAgIC8vIENvcHkgdGFibGUgY29udGVudHMgdG8gZ2l2ZW4gYnVmZmVyLiBJdCBpcyBzdXBwb3NlZCB0byBiZSBsYXJnZQorICAgIC8vIGVub3VnaCB0byBob2xkIGFsbCBlbGVtZW50cyBhcyBzdHJpbmcgdGFibGUuCisgICAgdm9pZCB0YWJsZV9jb3B5KHZvaWQgKmJ1ZiwgaW50NjRfdCBuZWxlbXMpOworCisgICAgLy8gUGF0Y2ggbmFtZSBvZmZzZXRzIGluIGEgdGFibGUgYWZ0ZXIgaXQncyBiZWVuIGNvcGllZCB0byBvdGhlciBzaWRlCisgICAgc3RhdGljIHZvaWQgdGFibGVfcGF0Y2hfbmFtZXModm9pZCAqYnVmLCBpbnQ2NF90IG5lbGVtcyk7Cit9OworCitleHRlcm4gRnVuY0xpc3QgX19vZmZsb2FkX2VudHJpZXM7CitleHRlcm4gRnVuY0xpc3QgX19vZmZsb2FkX2Z1bmNzOworZXh0ZXJuIFZhckxpc3QgIF9fb2ZmbG9hZF92YXJzOworCisvLyBTZWN0aW9uIG5hbWVzIHdoZXJlIHRoZSBsb29rdXAgdGFibGVzIGFyZSBzdG9yZWQKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyNkZWZpbmUgT0ZGTE9BRF9FTlRSWV9UQUJMRV9TRUNUSU9OX1NUQVJUICAgIi5PZmZsb2FkRW50cnlUYWJsZSRhIgorI2RlZmluZSBPRkZMT0FEX0VOVFJZX1RBQkxFX1NFQ1RJT05fRU5EICAgICAiLk9mZmxvYWRFbnRyeVRhYmxlJHoiCisKKyNkZWZpbmUgT0ZGTE9BRF9GVU5DX1RBQkxFX1NFQ1RJT05fU1RBUlQgICAgIi5PZmZsb2FkRnVuY1RhYmxlJGEiCisjZGVmaW5lIE9GRkxPQURfRlVOQ19UQUJMRV9TRUNUSU9OX0VORCAgICAgICIuT2ZmbG9hZEZ1bmNUYWJsZSR6IgorCisjZGVmaW5lIE9GRkxPQURfVkFSX1RBQkxFX1NFQ1RJT05fU1RBUlQgICAgICIuT2ZmbG9hZFZhclRhYmxlJGEiCisjZGVmaW5lIE9GRkxPQURfVkFSX1RBQkxFX1NFQ1RJT05fRU5EICAgICAgICIuT2ZmbG9hZFZhclRhYmxlJHoiCisKKyNkZWZpbmUgT0ZGTE9BRF9DUlRJTklUX1NFQ1RJT05fU1RBUlQgICAgICAgIi5DUlQkWENUIgorCisjcHJhZ21hIHNlY3Rpb24oT0ZGTE9BRF9DUlRJTklUX1NFQ1RJT05fU1RBUlQsIHJlYWQpCisKKyNlbHNlICAvLyBUQVJHRVRfV0lOTlQKKworI2RlZmluZSBPRkZMT0FEX0VOVFJZX1RBQkxFX1NFQ1RJT05fU1RBUlQgICAiLk9mZmxvYWRFbnRyeVRhYmxlLiIKKyNkZWZpbmUgT0ZGTE9BRF9FTlRSWV9UQUJMRV9TRUNUSU9OX0VORCAgICAgIi5PZmZsb2FkRW50cnlUYWJsZS4iCisKKyNkZWZpbmUgT0ZGTE9BRF9GVU5DX1RBQkxFX1NFQ1RJT05fU1RBUlQgICAgIi5PZmZsb2FkRnVuY1RhYmxlLiIKKyNkZWZpbmUgT0ZGTE9BRF9GVU5DX1RBQkxFX1NFQ1RJT05fRU5EICAgICAgIi5PZmZsb2FkRnVuY1RhYmxlLiIKKworI2RlZmluZSBPRkZMT0FEX1ZBUl9UQUJMRV9TRUNUSU9OX1NUQVJUICAgICAiLk9mZmxvYWRWYXJUYWJsZS4iCisjZGVmaW5lIE9GRkxPQURfVkFSX1RBQkxFX1NFQ1RJT05fRU5EICAgICAgICIuT2ZmbG9hZFZhclRhYmxlLiIKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKworI3ByYWdtYSBzZWN0aW9uKE9GRkxPQURfRU5UUllfVEFCTEVfU0VDVElPTl9TVEFSVCwgcmVhZCwgd3JpdGUpCisjcHJhZ21hIHNlY3Rpb24oT0ZGTE9BRF9FTlRSWV9UQUJMRV9TRUNUSU9OX0VORCwgcmVhZCwgd3JpdGUpCisKKyNwcmFnbWEgc2VjdGlvbihPRkZMT0FEX0ZVTkNfVEFCTEVfU0VDVElPTl9TVEFSVCwgcmVhZCwgd3JpdGUpCisjcHJhZ21hIHNlY3Rpb24oT0ZGTE9BRF9GVU5DX1RBQkxFX1NFQ1RJT05fRU5ELCByZWFkLCB3cml0ZSkKKworI3ByYWdtYSBzZWN0aW9uKE9GRkxPQURfVkFSX1RBQkxFX1NFQ1RJT05fU1RBUlQsIHJlYWQsIHdyaXRlKQorI3ByYWdtYSBzZWN0aW9uKE9GRkxPQURfVkFSX1RBQkxFX1NFQ1RJT05fRU5ELCByZWFkLCB3cml0ZSkKKworCisvLyByZWdpc3Rlci91bnJlZ2lzdGVyIGdpdmVuIHRhYmxlcworZXh0ZXJuICJDIiB2b2lkIF9fb2ZmbG9hZF9yZWdpc3Rlcl90YWJsZXMoCisgICAgRnVuY0xpc3Q6Ok5vZGUgKmVudHJ5X3RhYmxlLAorICAgIEZ1bmNMaXN0OjpOb2RlICpmdW5jX3RhYmxlLAorICAgIFZhckxpc3Q6Ok5vZGUgKnZhcl90YWJsZQorKTsKKworZXh0ZXJuICJDIiB2b2lkIF9fb2ZmbG9hZF91bnJlZ2lzdGVyX3RhYmxlcygKKyAgICBGdW5jTGlzdDo6Tm9kZSAqZW50cnlfdGFibGUsCisgICAgRnVuY0xpc3Q6Ok5vZGUgKmZ1bmNfdGFibGUsCisgICAgVmFyTGlzdDo6Tm9kZSAqdmFyX3RhYmxlCispOworI2VuZGlmICAvLyBPRkZMT0FEX1RBQkxFX0hfSU5DTFVERUQKZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfdGFyZ2V0LmNwcCBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfdGFyZ2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmMxYjA0Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90YXJnZXQuY3BwCkBAIC0wLDAgKzEsNzU0IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJvZmZsb2FkX3RhcmdldC5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2lmZGVmIFNFUF9TVVBQT1JUCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNlbmRpZiAvLyBTRVBfU1VQUE9SVAorI2luY2x1ZGUgPG9tcC5oPgorI2luY2x1ZGUgPG1hcD4KKworLy8gdHlwZWRlZiBvZmZsb2FkX2Z1bmNfd2l0aF9wYXJtcy4KKy8vIFBvaW50ZXIgdG8gZnVuY3Rpb24gdGhhdCByZXByZXNlbnRzIGFuIG9mZmxvYWRlZCBlbnRyeSBwb2ludC4KKy8vIFRoZSBwYXJhbWV0ZXJzIGFyZSBhIHRlbXBvcmFyeSBmaXggZm9yIHBhcmFtZXRlcnMgb24gdGhlIHN0YWNrLgordHlwZWRlZiB2b2lkICgqb2ZmbG9hZF9mdW5jX3dpdGhfcGFybXMpKHZvaWQgKik7CisKKy8vIFRhcmdldCBjb25zb2xlIGFuZCBmaWxlIGxvZ2dpbmcKK2NvbnN0IGNoYXIgKnByZWZpeDsKK2ludCBjb25zb2xlX2VuYWJsZWQgPSAwOworaW50IG9mZmxvYWRfcmVwb3J0X2xldmVsID0gMDsKKworLy8gVHJhY2UgaW5mb3JtYXRpb24KK3N0YXRpYyBjb25zdCBjaGFyKiB2YXJkZXNjX2RpcmVjdGlvbl9hc19zdHJpbmdbXSA9IHsKKyAgICAiTk9DT1BZIiwKKyAgICAiSU4iLAorICAgICJPVVQiLAorICAgICJJTk9VVCIKK307CitzdGF0aWMgY29uc3QgY2hhciogdmFyZGVzY190eXBlX2FzX3N0cmluZ1tdID0geworICAgICJ1bmtub3duIiwKKyAgICAiZGF0YSIsCisgICAgImRhdGFfcHRyIiwKKyAgICAiZnVuY19wdHIiLAorICAgICJ2b2lkX3B0ciIsCisgICAgInN0cmluZ19wdHIiLAorICAgICJkdiIsCisgICAgImR2X2RhdGEiLAorICAgICJkdl9kYXRhX3NsaWNlIiwKKyAgICAiZHZfcHRyIiwKKyAgICAiZHZfcHRyX2RhdGEiLAorICAgICJkdl9wdHJfZGF0YV9zbGljZSIsCisgICAgImNlYW5fdmFyIiwKKyAgICAiY2Vhbl92YXJfcHRyIiwKKyAgICAiY19kYXRhX3B0cl9hcnJheSIKK307CisKK2ludCBtaWNfaW5kZXggPSAtMTsKK2ludCBtaWNfZW5naW5lc190b3RhbCA9IC0xOwordWludDY0X3QgbWljX2ZyZXF1ZW5jeSA9IDA7CitpbnQgb2ZmbG9hZF9udW1iZXIgPSAwOworc3RhdGljIHN0ZDo6bWFwPHZvaWQqLCBSZWZJbmZvKj4gcmVmX2RhdGE7CitzdGF0aWMgbXV0ZXhfdCBhZGRfcmVmX2xvY2s7CisKKyNpZmRlZiBTRVBfU1VQUE9SVAorc3RhdGljIGNvbnN0IGNoYXIqICBzZXBfbW9uaXRvcl9lbnYgPSAiU0VQX01PTklUT1IiOworc3RhdGljIGJvb2wgICAgICAgICBzZXBfbW9uaXRvciA9IGZhbHNlOworc3RhdGljIGNvbnN0IGNoYXIqICBzZXBfZGV2aWNlX2VudiA9ICJTRVBfREVWSUNFIjsKK3N0YXRpYyBjb25zdCBjaGFyKiAgc2VwX2RldmljZSA9ICAiL2Rldi9zZXAzLjgvYyI7CitzdGF0aWMgaW50ICAgICAgICAgIHNlcF9jb3VudGVyID0gMDsKKworI2RlZmluZSBTRVBfQVBJX0lPQ19NQUdJQyAgIDk5CisjZGVmaW5lIFNFUF9JT0NUTF9QQVVTRSAgICAgX0lPIChTRVBfQVBJX0lPQ19NQUdJQywgMzEpCisjZGVmaW5lIFNFUF9JT0NUTF9SRVNVTUUgICAgX0lPIChTRVBfQVBJX0lPQ19NQUdJQywgMzIpCisKK3N0YXRpYyB2b2lkIGFkZF9yZWZfY291bnQodm9pZCAqIGJ1ZiwgYm9vbCBjcmVhdGVkKQoreworICAgIG11dGV4X2xvY2tlcl90IGxvY2tlcihhZGRfcmVmX2xvY2spOworICAgIFJlZkluZm8gKiBpbmZvID0gcmVmX2RhdGFbYnVmXTsKKworICAgIGlmIChpbmZvKSB7CisgICAgICAgIGluZm8tPmNvdW50Kys7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpbmZvID0gbmV3IFJlZkluZm8oKGludCljcmVhdGVkLChsb25nKTEpOworICAgIH0KKyAgICBpbmZvLT5pc19hZGRlZCB8PSBjcmVhdGVkOworICAgIHJlZl9kYXRhW2J1Zl0gPSBpbmZvOworfQorCitzdGF0aWMgdm9pZCBCdWZSZWxlYXNlUmVmKHZvaWQgKiBidWYpCit7CisgICAgbXV0ZXhfbG9ja2VyX3QgbG9ja2VyKGFkZF9yZWZfbG9jayk7CisgICAgUmVmSW5mbyAqIGluZm8gPSByZWZfZGF0YVtidWZdOworCisgICAgaWYgKGluZm8pIHsKKyAgICAgICAgLS1pbmZvLT5jb3VudDsKKyAgICAgICAgaWYgKGluZm8tPmNvdW50ID09IDAgJiYgaW5mby0+aXNfYWRkZWQpIHsKKyAgICAgICAgICAgIEJ1ZmZlclJlbGVhc2VSZWYoYnVmKTsKKyAgICAgICAgICAgIGluZm8tPmlzX2FkZGVkID0gMDsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGludCBWVFBhdXNlU2FtcGxpbmcodm9pZCkKK3sKKyAgICBpbnQgcmV0ID0gLTE7CisgICAgaW50IGhhbmRsZSA9IG9wZW4oc2VwX2RldmljZSwgT19SRFdSKTsKKyAgICBpZiAoaGFuZGxlID4gMCkgeworICAgICAgICByZXQgPSBpb2N0bChoYW5kbGUsIFNFUF9JT0NUTF9QQVVTRSk7CisgICAgICAgIGNsb3NlKGhhbmRsZSk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgVlRSZXN1bWVTYW1wbGluZyh2b2lkKQoreworICAgIGludCByZXQgPSAtMTsKKyAgICBpbnQgaGFuZGxlID0gb3BlbihzZXBfZGV2aWNlLCBPX1JEV1IpOworICAgIGlmIChoYW5kbGUgPiAwKSB7CisgICAgICAgIHJldCA9IGlvY3RsKGhhbmRsZSwgU0VQX0lPQ1RMX1JFU1VNRSk7CisgICAgICAgIGNsb3NlKGhhbmRsZSk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisjZW5kaWYgLy8gU0VQX1NVUFBPUlQKKwordm9pZCBPZmZsb2FkRGVzY3JpcHRvcjo6b2ZmbG9hZCgKKyAgICB1aW50MzJfdCAgYnVmZmVyX2NvdW50LAorICAgIHZvaWQqKiAgICBidWZmZXJzLAorICAgIHZvaWQqICAgICBtaXNjX2RhdGEsCisgICAgdWludDE2X3QgIG1pc2NfZGF0YV9sZW4sCisgICAgdm9pZCogICAgIHJldHVybl9kYXRhLAorICAgIHVpbnQxNl90ICByZXR1cm5fZGF0YV9sZW4KKykKK3sKKyAgICBGdW5jdGlvbkRlc2NyaXB0b3IgKmZ1bmMgPSAoRnVuY3Rpb25EZXNjcmlwdG9yKikgbWlzY19kYXRhOworICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBmdW5jLT5kYXRhOworICAgIE9mZmxvYWREZXNjcmlwdG9yIG9mbGQ7CisgICAgY2hhciAqaW5fZGF0YSA9IDA7CisgICAgY2hhciAqb3V0X2RhdGEgPSAwOworICAgIGNoYXIgKnRpbWVyX2RhdGEgPSAwOworCisgICAgY29uc29sZV9lbmFibGVkID0gZnVuYy0+Y29uc29sZV9lbmFibGVkOworICAgIHRpbWVyX2VuYWJsZWQgPSBmdW5jLT50aW1lcl9lbmFibGVkOworICAgIG9mZmxvYWRfcmVwb3J0X2xldmVsID0gZnVuYy0+b2ZmbG9hZF9yZXBvcnRfbGV2ZWw7CisgICAgb2ZmbG9hZF9udW1iZXIgPSBmdW5jLT5vZmZsb2FkX251bWJlcjsKKyAgICBvZmxkLnNldF9vZmZsb2FkX251bWJlcihmdW5jLT5vZmZsb2FkX251bWJlcik7CisKKyNpZmRlZiBTRVBfU1VQUE9SVAorICAgIGlmIChzZXBfbW9uaXRvcikgeworICAgICAgICBpZiAoX19zeW5jX2ZldGNoX2FuZF9hZGQoJnNlcF9jb3VudGVyLCAxKSA9PSAwKSB7CisgICAgICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJWVFJlc3VtZVNhbXBsaW5nXG4iKTsKKyAgICAgICAgICAgIFZUUmVzdW1lU2FtcGxpbmcoKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvLyBTRVBfU1VQUE9SVAorCisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKDIsIG9mbGQuZ2V0X29mZmxvYWRfbnVtYmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNfb2ZmbG9hZF9zdGFydF90YXJnZXRfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIk9mZmxvYWQgXCIlc1wiIHN0YXJ0ZWRcbiIsIG5hbWUpOworCisgICAgLy8gaW5pdGlhbGl6ZSB0aW1lciBkYXRhCisgICAgT0ZGTE9BRF9USU1FUl9JTklUKCk7CisKKyAgICBPRkZMT0FEX1RJTUVSX1NUQVJUKGNfb2ZmbG9hZF90YXJnZXRfdG90YWxfdGltZSk7CisKKyAgICBPRkZMT0FEX1RJTUVSX1NUQVJUKGNfb2ZmbG9hZF90YXJnZXRfZGVzY3JpcHRvcl9zZXR1cCk7CisKKyAgICAvLyBnZXQgaW5wdXQvb3V0cHV0IGJ1ZmZlciBhZGRyZXNzZXMKKyAgICBpZiAoZnVuYy0+aW5fZGF0YWxlbiA+IDAgfHwgZnVuYy0+b3V0X2RhdGFsZW4gPiAwKSB7CisgICAgICAgIGlmIChmdW5jLT5kYXRhX29mZnNldCAhPSAwKSB7CisgICAgICAgICAgICBpbl9kYXRhID0gKGNoYXIqKSBtaXNjX2RhdGEgKyBmdW5jLT5kYXRhX29mZnNldDsKKyAgICAgICAgICAgIG91dF9kYXRhID0gKGNoYXIqKSByZXR1cm5fZGF0YTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGNoYXIgKmlub3V0X2J1ZiA9IChjaGFyKikgYnVmZmVyc1stLWJ1ZmZlcl9jb3VudF07CisgICAgICAgICAgICBpbl9kYXRhID0gaW5vdXRfYnVmOworICAgICAgICAgICAgb3V0X2RhdGEgPSBpbm91dF9idWY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBhc3NpZ24gdmFyaWFibGUgZGVzY3JpcHRvcnMKKyAgICBvZmxkLm1fdmFyc190b3RhbCA9IGZ1bmMtPnZhcnNfbnVtOworICAgIGlmIChvZmxkLm1fdmFyc190b3RhbCA+IDApIHsKKyAgICAgICAgdWludDY0X3QgdmFyX2RhdGFfbGVuID0gb2ZsZC5tX3ZhcnNfdG90YWwgKiBzaXplb2YoVmFyRGVzYyk7CisKKyAgICAgICAgb2ZsZC5tX3ZhcnMgPSAoVmFyRGVzYyopIG1hbGxvYyh2YXJfZGF0YV9sZW4pOworICAgICAgICBtZW1jcHkob2ZsZC5tX3ZhcnMsIGluX2RhdGEsIHZhcl9kYXRhX2xlbik7CisKKyAgICAgICAgaW5fZGF0YSArPSB2YXJfZGF0YV9sZW47CisgICAgICAgIGZ1bmMtPmluX2RhdGFsZW4gLT0gdmFyX2RhdGFfbGVuOworICAgIH0KKworICAgIC8vIHRpbWVyIGRhdGEKKyAgICBpZiAoZnVuYy0+dGltZXJfZW5hYmxlZCkgeworICAgICAgICB1aW50NjRfdCB0aW1lcl9kYXRhX2xlbiA9IE9GRkxPQURfVElNRVJfREFUQUxFTigpOworCisgICAgICAgIHRpbWVyX2RhdGEgPSBvdXRfZGF0YTsKKyAgICAgICAgb3V0X2RhdGEgKz0gdGltZXJfZGF0YV9sZW47CisgICAgICAgIGZ1bmMtPm91dF9kYXRhbGVuIC09IHRpbWVyX2RhdGFfbGVuOworICAgIH0KKworICAgIC8vIGluaXQgTWFyc2hhbGxlcnMKKyAgICBvZmxkLm1faW4uaW5pdF9idWZmZXIoaW5fZGF0YSwgZnVuYy0+aW5fZGF0YWxlbik7CisgICAgb2ZsZC5tX291dC5pbml0X2J1ZmZlcihvdXRfZGF0YSwgZnVuYy0+b3V0X2RhdGFsZW4pOworCisgICAgLy8gY29weSBidWZmZXJzIHRvIG9mZmxvYWQgZGVzY3JpcHRvcgorICAgIHN0ZDo6Y29weShidWZmZXJzLCBidWZmZXJzICsgYnVmZmVyX2NvdW50LAorICAgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIob2ZsZC5tX2J1ZmZlcnMpKTsKKworICAgIE9GRkxPQURfVElNRVJfU1RPUChjX29mZmxvYWRfdGFyZ2V0X2Rlc2NyaXB0b3Jfc2V0dXApOworCisgICAgLy8gZmluZCBvZmZsb2FkIGVudHJ5IGFkZHJlc3MKKyAgICBPRkZMT0FEX1RJTUVSX1NUQVJUKGNfb2ZmbG9hZF90YXJnZXRfZnVuY19sb29rdXApOworCisgICAgb2ZmbG9hZF9mdW5jX3dpdGhfcGFybXMgZW50cnkgPSAob2ZmbG9hZF9mdW5jX3dpdGhfcGFybXMpCisgICAgICAgIF9fb2ZmbG9hZF9lbnRyaWVzLmZpbmRfYWRkcihuYW1lKTsKKworICAgIGlmIChlbnRyeSA9PSBOVUxMKSB7CisjaWYgT0ZGTE9BRF9ERUJVRyA+IDAKKyAgICAgICAgaWYgKGNvbnNvbGVfZW5hYmxlZCA+IDIpIHsKKyAgICAgICAgICAgIF9fb2ZmbG9hZF9lbnRyaWVzLmR1bXAoKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19vZmZsb2FkX2Rlc2NyaXB0b3Jfb2ZmbG9hZCwgbmFtZSk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgT0ZGTE9BRF9USU1FUl9TVE9QKGNfb2ZmbG9hZF90YXJnZXRfZnVuY19sb29rdXApOworCisgICAgT0ZGTE9BRF9USU1FUl9TVEFSVChjX29mZmxvYWRfdGFyZ2V0X2Z1bmNfdGltZSk7CisKKyAgICAvLyBleGVjdXRlIG9mZmxvYWQgZW50cnkKKyAgICBlbnRyeSgmb2ZsZCk7CisKKyAgICBPRkZMT0FEX1RJTUVSX1NUT1AoY19vZmZsb2FkX3RhcmdldF9mdW5jX3RpbWUpOworCisgICAgT0ZGTE9BRF9USU1FUl9TVE9QKGNfb2ZmbG9hZF90YXJnZXRfdG90YWxfdGltZSk7CisKKyAgICAvLyBjb3B5IHRpbWVyIGRhdGEgdG8gdGhlIGJ1ZmZlcgorICAgIE9GRkxPQURfVElNRVJfVEFSR0VUX0RBVEEodGltZXJfZGF0YSk7CisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJPZmZsb2FkIFwiJXNcIiBmaW5pc2hlZFxuIiwgbmFtZSk7CisKKyNpZmRlZiBTRVBfU1VQUE9SVAorICAgIGlmIChzZXBfbW9uaXRvcikgeworICAgICAgICBpZiAoX19zeW5jX3N1Yl9hbmRfZmV0Y2goJnNlcF9jb3VudGVyLCAxKSA9PSAwKSB7CisgICAgICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJWVFBhdXNlU2FtcGxpbmdcbiIpOworICAgICAgICAgICAgVlRQYXVzZVNhbXBsaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLy8gU0VQX1NVUFBPUlQKK30KKwordm9pZCBPZmZsb2FkRGVzY3JpcHRvcjo6bWVyZ2VfdmFyX2Rlc2NzKAorICAgIFZhckRlc2MgKnZhcnMsCisgICAgVmFyRGVzYzIgKnZhcnMyLAorICAgIGludCB2YXJzX3RvdGFsCispCit7CisgICAgLy8gbnVtYmVyIG9mIHZhcmlhYmxlIGRlc2NyaXB0b3JzIHJlY2VpdmVkIGZyb20gaG9zdCBhbmQgZ2VuZXJhdGVkCisgICAgLy8gbG9jYWxseSBzaG91bGQgbWF0Y2gKKyAgICBpZiAobV92YXJzX3RvdGFsIDwgdmFyc190b3RhbCkgeworICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfbWVyZ2VfdmFyX2Rlc2NzMSk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX3ZhcnNfdG90YWw7IGkrKykgeworICAgICAgICBpZiAoaSA8IHZhcnNfdG90YWwpIHsKKyAgICAgICAgICAgIC8vIHZhcmlhYmxlIHR5cGUgbXVzdCBtYXRjaAorICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS50eXBlLmJpdHMgIT0gdmFyc1tpXS50eXBlLmJpdHMpIHsKKyAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfbWVyZ2VfdmFyX2Rlc2NzMik7CisgICAgICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbV92YXJzW2ldLnB0ciA9IHZhcnNbaV0ucHRyOworICAgICAgICAgICAgbV92YXJzW2ldLmludG8gPSB2YXJzW2ldLmludG87CisKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhcl9zbmFtZSA9ICIiOworICAgICAgICAgICAgaWYgKHZhcnMyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAodmFyczJbaV0uc25hbWUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICB2YXJfc25hbWUgPSB2YXJzMltpXS5zbmFtZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoMiwgZ2V0X29mZmxvYWRfbnVtYmVyKCksIGNfb2ZmbG9hZF92YXIsCisgICAgICAgICAgICAgICAgIiAgIFZhckRlc2MgJWQsIHZhcj0lcywgJXMsICVzXG4iLAorICAgICAgICAgICAgICAgIGksIHZhcl9zbmFtZSwKKyAgICAgICAgICAgICAgICB2YXJkZXNjX2RpcmVjdGlvbl9hc19zdHJpbmdbbV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzXSwKKyAgICAgICAgICAgICAgICB2YXJkZXNjX3R5cGVfYXNfc3RyaW5nW21fdmFyc1tpXS50eXBlLnNyY10pOworICAgICAgICAgICAgaWYgKHZhcnMyICE9IE5VTEwgJiYgdmFyczJbaV0uZG5hbWUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIE9GRkxPQURfVFJBQ0UoMiwgIiAgICAgICAgICAgICAgaW50bz0lcywgJXNcbiIsIHZhcnMyW2ldLmRuYW1lLAorICAgICAgICAgICAgICAgICAgICB2YXJkZXNjX3R5cGVfYXNfc3RyaW5nW21fdmFyc1tpXS50eXBlLmRzdF0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIE9GRkxPQURfVFJBQ0UoMiwKKyAgICAgICAgICAgICIgICAgICAgICAgICAgIHR5cGVfc3JjPSVkLCB0eXBlX2RzdG49JWQsIGRpcmVjdGlvbj0lZCwgIgorICAgICAgICAgICAgImFsbG9jX2lmPSVkLCBmcmVlX2lmPSVkLCBhbGlnbj0lZCwgbWljX29mZnNldD0lZCwgZmxhZ3M9MHgleCwgIgorICAgICAgICAgICAgIm9mZnNldD0lbGxkLCBzaXplPSVsbGQsIGNvdW50L2Rpc3A9JWxsZCwgcHRyPSVwIGludG89JXBcbiIsCisgICAgICAgICAgICBtX3ZhcnNbaV0udHlwZS5zcmMsCisgICAgICAgICAgICBtX3ZhcnNbaV0udHlwZS5kc3QsCisgICAgICAgICAgICBtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMsCisgICAgICAgICAgICBtX3ZhcnNbaV0uYWxsb2NfaWYsCisgICAgICAgICAgICBtX3ZhcnNbaV0uZnJlZV9pZiwKKyAgICAgICAgICAgIG1fdmFyc1tpXS5hbGlnbiwKKyAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0LAorICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmJpdHMsCisgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0LAorICAgICAgICAgICAgbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICBtX3ZhcnNbaV0uY291bnQsCisgICAgICAgICAgICBtX3ZhcnNbaV0ucHRyLAorICAgICAgICAgICAgbV92YXJzW2ldLmludG8pOworICAgIH0KK30KKwordm9pZCBPZmZsb2FkRGVzY3JpcHRvcjo6c2NhdHRlcl9jb3B5aW5fZGF0YSgpCit7CisgICAgT0ZGTE9BRF9USU1FUl9TVEFSVChjX29mZmxvYWRfdGFyZ2V0X3NjYXR0ZXJfaW5wdXRzKTsKKworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIklOICBidWZmZXIgQCAlcCBzaXplICVsbGRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBtX2luLmdldF9idWZmZXJfc3RhcnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1faW4uZ2V0X2J1ZmZlcl9zaXplKCkpOworICAgIE9GRkxPQURfREVCVUdfRFVNUF9CWVRFUygyLCBtX2luLmdldF9idWZmZXJfc3RhcnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbi5nZXRfYnVmZmVyX3NpemUoKSk7CisKKyAgICAvLyByZWNlaXZlIGRhdGEKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fdmFyc190b3RhbDsgaSsrKSB7CisgICAgICAgIGJvb2wgc3JjX2lzX2Zvcl9taWMgPSAobV92YXJzW2ldLmRpcmVjdGlvbi5vdXQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uaW50byA9PSBOVUxMKTsKKyAgICAgICAgdm9pZCoqIHB0cl9hZGRyID0gc3JjX2lzX2Zvcl9taWMgPworICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx2b2lkKio+KG1fdmFyc1tpXS5wdHIpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dm9pZCoqPihtX3ZhcnNbaV0uaW50byk7CisgICAgICAgIGludCB0eXBlID0gc3JjX2lzX2Zvcl9taWMgPyBtX3ZhcnNbaV0udHlwZS5zcmMgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnR5cGUuZHN0OworICAgICAgICBib29sIGlzX3N0YXRpYyA9IHNyY19pc19mb3JfbWljID8KKyAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljX2RzdG47CisgICAgICAgIHZvaWQgKnB0ciA9IE5VTEw7CisKKyAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5hbGxvY19kaXNwKSB7CisgICAgICAgICAgICBpbnQ2NF90IG9mZnNldCA9IDA7CisgICAgICAgICAgICBtX2luLnJlY2VpdmVfZGF0YSgmb2Zmc2V0LCBzaXplb2Yob2Zmc2V0KSk7CisgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0ID0gLW9mZnNldDsKKyAgICAgICAgfQorICAgICAgICBpZiAoVkFSX1RZUEVfSVNfRFZfREFUQV9TTElDRSh0eXBlKSB8fAorICAgICAgICAgICAgVkFSX1RZUEVfSVNfRFZfREFUQSh0eXBlKSkgeworICAgICAgICAgICAgQXJyRGVzYyAqZHZwID0gKHR5cGUgPT0gY19kdl9kYXRhX3NsaWNlIHx8IHR5cGUgPT0gY19kdl9kYXRhKT8KKyAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QXJyRGVzYyo+KHB0cl9hZGRyKSA6CisgICAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxBcnJEZXNjKio+KHB0cl9hZGRyKTsKKyAgICAgICAgICAgIHB0cl9hZGRyID0gcmVpbnRlcnByZXRfY2FzdDx2b2lkKio+KCZkdnAtPkJhc2UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2V0IHBvaW50ZXIgdmFsdWVzCisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSBjX2RhdGFfcHRyX2FycmF5OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGogPSBtX3ZhcnNbaV0ucHRyX2Fycl9vZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIGludCBtYXhfZWwgPSBqICsgbV92YXJzW2ldLmNvdW50OworICAgICAgICAgICAgICAgICAgICBjaGFyICpkc3RfYXJyX3B0ciA9IChzcmNfaXNfZm9yX21pYyk/CisgICAgICAgICAgICAgICAgICAgICAgICAqKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcioqPihtX3ZhcnNbaV0ucHRyKSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4obV92YXJzW2ldLmludG8pOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoOyBqIDwgbWF4X2VsOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcmNfaXNfZm9yX21pYykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tqXS5wdHIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfYXJyX3B0ciArIG1fdmFyc1tqXS5wdHJfYXJyX29mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tqXS5pbnRvID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2Fycl9wdHIgKyBtX3ZhcnNbal0ucHRyX2Fycl9vZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGNfZGF0YToKKyAgICAgICAgICAgIGNhc2UgY192b2lkX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19jZWFuX3ZhcjoKKyAgICAgICAgICAgIGNhc2UgY19kdjoKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjX3N0cmluZ19wdHI6CisgICAgICAgICAgICBjYXNlIGNfZGF0YV9wdHI6CisgICAgICAgICAgICBjYXNlIGNfY2Vhbl92YXJfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2R2X3B0cjoKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmFsbG9jX2lmKSB7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5zaW5rX2FkZHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1faW4ucmVjZWl2ZV9kYXRhKCZidWYsIHNpemVvZihidWYpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiA9IG1fYnVmZmVycy5mcm9udCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbV9idWZmZXJzLnBvcF9mcm9udCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChidWYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNfc3RhdGljKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluY3JlbWVudCBidWZmZXIgcmVmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVElNRVJfU1RBUlQoY19vZmZsb2FkX3RhcmdldF9hZGRfYnVmZmVyX3JlZnMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJBZGRSZWYoYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGTE9BRF9USU1FUl9TVE9QKGNfb2ZmbG9hZF90YXJnZXRfYWRkX2J1ZmZlcl9yZWZzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX3JlZl9jb3VudChidWYsIDAgPT0gbV92YXJzW2ldLmZsYWdzLnNpbmtfYWRkcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwdHIgPSBzdGF0aWNfY2FzdDxjaGFyKj4oYnVmKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm1pY19vZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhY2tfYnVmID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCA6IG1fdmFyc1tpXS5vZmZzZXQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICpwdHJfYWRkciA9IHB0cjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobV92YXJzW2ldLmZsYWdzLnNpbmtfYWRkcikgeworICAgICAgICAgICAgICAgICAgICB2b2lkICpidWY7CisgICAgICAgICAgICAgICAgICAgIG1faW4ucmVjZWl2ZV9kYXRhKCZidWYsIHNpemVvZihidWYpKTsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqcHRyID0gc3RhdGljX2Nhc3Q8Y2hhcio+KGJ1ZikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm1pY19vZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1fdmFyc1tpXS5mbGFncy5pc19zdGFja19idWYgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgOiBtX3ZhcnNbaV0ub2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgKnB0cl9hZGRyID0gcHRyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjX2Z1bmNfcHRyOgorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGNfZHZfZGF0YToKKyAgICAgICAgICAgIGNhc2UgY19kdl9wdHJfZGF0YToKKyAgICAgICAgICAgIGNhc2UgY19kdl9kYXRhX3NsaWNlOgorICAgICAgICAgICAgY2FzZSBjX2R2X3B0cl9kYXRhX3NsaWNlOgorICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uYWxsb2NfaWYpIHsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmOworICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLnNpbmtfYWRkcikgeworICAgICAgICAgICAgICAgICAgICAgICAgbV9pbi5yZWNlaXZlX2RhdGEoJmJ1Ziwgc2l6ZW9mKGJ1ZikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVmID0gbV9idWZmZXJzLmZyb250KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2J1ZmZlcnMucG9wX2Zyb250KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZikgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc19zdGF0aWMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1fdmFyc1tpXS5mbGFncy5zaW5rX2FkZHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5jcmVtZW50IGJ1ZmZlciByZWZlcmVuY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGTE9BRF9USU1FUl9TVEFSVChjX29mZmxvYWRfdGFyZ2V0X2FkZF9idWZmZXJfcmVmcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlckFkZFJlZihidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZMT0FEX1RJTUVSX1NUT1AoY19vZmZsb2FkX3RhcmdldF9hZGRfYnVmZmVyX3JlZnMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfcmVmX2NvdW50KGJ1ZiwgMCA9PSBtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHB0ciA9IHN0YXRpY19jYXN0PGNoYXIqPihidWYpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ubWljX29mZnNldCArIG1fdmFyc1tpXS5vZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKnB0cl9hZGRyID0gcHRyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyKSB7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZjsKKyAgICAgICAgICAgICAgICAgICAgbV9pbi5yZWNlaXZlX2RhdGEoJmJ1Ziwgc2l6ZW9mKGJ1ZikpOworICAgICAgICAgICAgICAgICAgICBwdHIgPSBzdGF0aWNfY2FzdDxjaGFyKj4oYnVmKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0ICsgbV92YXJzW2ldLm9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgKnB0cl9hZGRyID0gcHRyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfdW5rbm93bl92YXJfdHlwZSwgdHlwZSk7CisgICAgICAgICAgICAgICAgYWJvcnQoKTsKKyAgICAgICAgfQorICAgICAgICAvLyBSZWxlYXNlIG9ic29sZXRlIGJ1ZmZlcnMgZm9yIHN0YWNrIG9mIHBlcnNpc3RlbnQgb2JqZWN0cworICAgICAgICBpZiAodHlwZSA9IGNfZGF0YV9wdHIgJiYKKyAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19zdGFja19idWYgJiYKKyAgICAgICAgICAgICFtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMgJiYKKyAgICAgICAgICAgIG1fdmFyc1tpXS5hbGxvY19pZiAmJgorICAgICAgICAgICAgbV92YXJzW2ldLnNpemUgIT0gMCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGo9MDsgaiA8IG1fdmFyc1tpXS5zaXplOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmOworICAgICAgICAgICAgICAgICAgICBtX2luLnJlY2VpdmVfZGF0YSgmYnVmLCBzaXplb2YoYnVmKSk7CisgICAgICAgICAgICAgICAgICAgIEJ1ZmZlclJlbGVhc2VSZWYoYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgcmVmX2RhdGEuZXJhc2UoYnVmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gRG8gY29weWluCisgICAgICAgIHN3aXRjaCAobV92YXJzW2ldLnR5cGUuZHN0KSB7CisgICAgICAgICAgICBjYXNlIGNfZGF0YV9wdHJfYXJyYXk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGNfZGF0YToKKyAgICAgICAgICAgIGNhc2UgY192b2lkX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19jZWFuX3ZhcjoKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5pbiAmJgorICAgICAgICAgICAgICAgICAgICAhbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpY19kc3RuKSB7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBkaXNwOworICAgICAgICAgICAgICAgICAgICBjaGFyKiBwdHIgPSBtX3ZhcnNbaV0uaW50byA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjaGFyKj4obV92YXJzW2ldLmludG8pIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNoYXIqPihtX3ZhcnNbaV0ucHRyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS50eXBlLmRzdCA9PSBjX2NlYW5fdmFyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2luLnJlY2VpdmVfZGF0YSgoJnNpemUpLCBzaXplb2YoaW50NjRfdCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbV9pbi5yZWNlaXZlX2RhdGEoKCZkaXNwKSwgc2l6ZW9mKGludDY0X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBtX3ZhcnNbaV0uc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpc3AgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1faW4ucmVjZWl2ZV9kYXRhKHB0ciArIGRpc3AsIHNpemUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjX2R2OgorICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMgfHwKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmFsbG9jX2lmIHx8CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mcmVlX2lmKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIqIHB0ciA9IG1fdmFyc1tpXS5pbnRvID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNoYXIqPihtX3ZhcnNbaV0uaW50bykgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2hhcio+KG1fdmFyc1tpXS5wdHIpOworICAgICAgICAgICAgICAgICAgICBtX2luLnJlY2VpdmVfZGF0YShwdHIgKyBzaXplb2YodWludDY0X3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSAtIHNpemVvZih1aW50NjRfdCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjX3N0cmluZ19wdHI6CisgICAgICAgICAgICBjYXNlIGNfZGF0YV9wdHI6CisgICAgICAgICAgICBjYXNlIGNfY2Vhbl92YXJfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2R2X3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19kdl9kYXRhOgorICAgICAgICAgICAgY2FzZSBjX2R2X3B0cl9kYXRhOgorICAgICAgICAgICAgY2FzZSBjX2R2X2RhdGFfc2xpY2U6CisgICAgICAgICAgICBjYXNlIGNfZHZfcHRyX2RhdGFfc2xpY2U6CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgY19mdW5jX3B0cjoKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5pbikgeworICAgICAgICAgICAgICAgICAgICBtX2luLnJlY2VpdmVfZnVuY19wdHIoKGNvbnN0IHZvaWQqKikgbV92YXJzW2ldLnB0cik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY191bmtub3duX3Zhcl90eXBlLCBtX3ZhcnNbaV0udHlwZS5kc3QpOworICAgICAgICAgICAgICAgIGFib3J0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBPRkZMT0FEX1RSQUNFKDEsICJUb3RhbCBjb3B5aW4gZGF0YSByZWNlaXZlZCBmcm9tIGhvc3Q6IFslbGxkXSBieXRlc1xuIiwKKyAgICAgICAgICAgICAgICAgIG1faW4uZ2V0X3Rmcl9zaXplKCkpOworCisgICAgT0ZGTE9BRF9USU1FUl9TVE9QKGNfb2ZmbG9hZF90YXJnZXRfc2NhdHRlcl9pbnB1dHMpOworCisgICAgT0ZGTE9BRF9USU1FUl9TVEFSVChjX29mZmxvYWRfdGFyZ2V0X2NvbXB1dGUpOworfQorCit2b2lkIE9mZmxvYWREZXNjcmlwdG9yOjpnYXRoZXJfY29weW91dF9kYXRhKCkKK3sKKyAgICBPRkZMT0FEX1RJTUVSX1NUT1AoY19vZmZsb2FkX3RhcmdldF9jb21wdXRlKTsKKworICAgIE9GRkxPQURfVElNRVJfU1RBUlQoY19vZmZsb2FkX3RhcmdldF9nYXRoZXJfb3V0cHV0cyk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fdmFyc190b3RhbDsgaSsrKSB7CisgICAgICAgIGJvb2wgc3JjX2lzX2Zvcl9taWMgPSAobV92YXJzW2ldLmRpcmVjdGlvbi5vdXQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uaW50byA9PSBOVUxMKTsKKworICAgICAgICBzd2l0Y2ggKG1fdmFyc1tpXS50eXBlLnNyYykgeworICAgICAgICAgICAgY2FzZSBjX2RhdGFfcHRyX2FycmF5OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBjX2RhdGE6CisgICAgICAgICAgICBjYXNlIGNfdm9pZF9wdHI6CisgICAgICAgICAgICBjYXNlIGNfY2Vhbl92YXI6CisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24ub3V0ICYmCisgICAgICAgICAgICAgICAgICAgICFtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljKSB7CisgICAgICAgICAgICAgICAgICAgIG1fb3V0LnNlbmRfZGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNoYXIqPihtX3ZhcnNbaV0ucHRyKSArIG1fdmFyc1tpXS5kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjX2R2OgorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGNfc3RyaW5nX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19kYXRhX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19jZWFuX3Zhcl9wdHI6CisgICAgICAgICAgICBjYXNlIGNfZHZfcHRyOgorICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZnJlZV9pZiAmJgorICAgICAgICAgICAgICAgICAgICBzcmNfaXNfZm9yX21pYyAmJgorICAgICAgICAgICAgICAgICAgICAhbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpYykgeworICAgICAgICAgICAgICAgICAgICB2b2lkICpidWYgPSAqc3RhdGljX2Nhc3Q8Y2hhcioqPihtX3ZhcnNbaV0ucHRyKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ubWljX29mZnNldCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobV92YXJzW2ldLmZsYWdzLmlzX3N0YWNrX2J1Zj8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIDogbV92YXJzW2ldLm9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChidWYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gZGVjcmVtZW50IGJ1ZmZlciByZWZlcmVuY2UgY291bnQKKyAgICAgICAgICAgICAgICAgICAgT0ZGTE9BRF9USU1FUl9TVEFSVChjX29mZmxvYWRfdGFyZ2V0X3JlbGVhc2VfYnVmZmVyX3JlZnMpOworICAgICAgICAgICAgICAgICAgICBCdWZSZWxlYXNlUmVmKGJ1Zik7CisgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVElNRVJfU1RPUChjX29mZmxvYWRfdGFyZ2V0X3JlbGVhc2VfYnVmZmVyX3JlZnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjX2Z1bmNfcHRyOgorICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLm91dCkgeworICAgICAgICAgICAgICAgICAgICBtX291dC5zZW5kX2Z1bmNfcHRyKCooKHZvaWQqKikgbV92YXJzW2ldLnB0cikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjX2R2X2RhdGE6CisgICAgICAgICAgICBjYXNlIGNfZHZfcHRyX2RhdGE6CisgICAgICAgICAgICBjYXNlIGNfZHZfZGF0YV9zbGljZToKKyAgICAgICAgICAgIGNhc2UgY19kdl9wdHJfZGF0YV9zbGljZToKKyAgICAgICAgICAgICAgICBpZiAoc3JjX2lzX2Zvcl9taWMgJiYKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZyZWVfaWYgJiYKKyAgICAgICAgICAgICAgICAgICAgIW1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWMpIHsKKyAgICAgICAgICAgICAgICAgICAgQXJyRGVzYyAqZHZwID0gKG1fdmFyc1tpXS50eXBlLnNyYyA9PSBjX2R2X2RhdGEgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS50eXBlLnNyYyA9PSBjX2R2X2RhdGFfc2xpY2UpID8KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFyckRlc2MqPihtX3ZhcnNbaV0ucHRyKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAqc3RhdGljX2Nhc3Q8QXJyRGVzYyoqPihtX3ZhcnNbaV0ucHRyKTsKKworICAgICAgICAgICAgICAgICAgICB2b2lkICpidWYgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihkdnAtPkJhc2UpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm1pY19vZmZzZXQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0OworCisgICAgICAgICAgICAgICAgICAgIGlmIChidWYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBkZWNyZW1lbnQgYnVmZmVyIHJlZmVyZW5jZSBjb3VudAorICAgICAgICAgICAgICAgICAgICBPRkZMT0FEX1RJTUVSX1NUQVJUKGNfb2ZmbG9hZF90YXJnZXRfcmVsZWFzZV9idWZmZXJfcmVmcyk7CisgICAgICAgICAgICAgICAgICAgIEJ1ZlJlbGVhc2VSZWYoYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgT0ZGTE9BRF9USU1FUl9TVE9QKGNfb2ZmbG9hZF90YXJnZXRfcmVsZWFzZV9idWZmZXJfcmVmcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY191bmtub3duX3Zhcl90eXBlLCBtX3ZhcnNbaV0udHlwZS5kc3QpOworICAgICAgICAgICAgICAgIGFib3J0KCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobV92YXJzW2ldLmludG8pIHsKKyAgICAgICAgICAgIHN3aXRjaCAobV92YXJzW2ldLnR5cGUuZHN0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBjX2RhdGFfcHRyX2FycmF5OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGNfZGF0YToKKyAgICAgICAgICAgICAgICBjYXNlIGNfdm9pZF9wdHI6CisgICAgICAgICAgICAgICAgY2FzZSBjX2NlYW5fdmFyOgorICAgICAgICAgICAgICAgIGNhc2UgY19kdjoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIGNfc3RyaW5nX3B0cjoKKyAgICAgICAgICAgICAgICBjYXNlIGNfZGF0YV9wdHI6CisgICAgICAgICAgICAgICAgY2FzZSBjX2NlYW5fdmFyX3B0cjoKKyAgICAgICAgICAgICAgICBjYXNlIGNfZHZfcHRyOgorICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5pbiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZyZWVfaWYgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICFtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljX2RzdG4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZiA9ICpzdGF0aWNfY2FzdDxjaGFyKio+KG1fdmFyc1tpXS5pbnRvKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ubWljX29mZnNldCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobV92YXJzW2ldLmZsYWdzLmlzX3N0YWNrX2J1Zj8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIDogbV92YXJzW2ldLm9mZnNldCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidWYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVjcmVtZW50IGJ1ZmZlciByZWZlcmVuY2UgY291bnQKKyAgICAgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVElNRVJfU1RBUlQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19vZmZsb2FkX3RhcmdldF9yZWxlYXNlX2J1ZmZlcl9yZWZzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZlJlbGVhc2VSZWYoYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVElNRVJfU1RPUCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX29mZmxvYWRfdGFyZ2V0X3JlbGVhc2VfYnVmZmVyX3JlZnMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBjX2Z1bmNfcHRyOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgY19kdl9kYXRhOgorICAgICAgICAgICAgICAgIGNhc2UgY19kdl9wdHJfZGF0YToKKyAgICAgICAgICAgICAgICBjYXNlIGNfZHZfZGF0YV9zbGljZToKKyAgICAgICAgICAgICAgICBjYXNlIGNfZHZfcHRyX2RhdGFfc2xpY2U6CisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZnJlZV9pZiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmRpcmVjdGlvbi5pbiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIW1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWNfZHN0bikgeworICAgICAgICAgICAgICAgICAgICAgICAgQXJyRGVzYyAqZHZwID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobV92YXJzW2ldLnR5cGUuZHN0ID09IGNfZHZfZGF0YV9zbGljZSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0udHlwZS5kc3QgPT0gY19kdl9kYXRhKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QXJyRGVzYyo+KG1fdmFyc1tpXS5pbnRvKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0YXRpY19jYXN0PEFyckRlc2MqKj4obV92YXJzW2ldLmludG8pOworICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oZHZwLT5CYXNlKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ubWljX29mZnNldCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0OworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnVmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlY3JlbWVudCBidWZmZXIgcmVmZXJlbmNlIGNvdW50CisgICAgICAgICAgICAgICAgICAgICAgICBPRkZMT0FEX1RJTUVSX1NUQVJUKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfb2ZmbG9hZF90YXJnZXRfcmVsZWFzZV9idWZmZXJfcmVmcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBCdWZSZWxlYXNlUmVmKGJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICBPRkZMT0FEX1RJTUVSX1NUT1AoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19vZmZsb2FkX3RhcmdldF9yZWxlYXNlX2J1ZmZlcl9yZWZzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY191bmtub3duX3Zhcl90eXBlLCBtX3ZhcnNbaV0udHlwZS5kc3QpOworICAgICAgICAgICAgICAgICAgICBhYm9ydCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiT1VUIGJ1ZmZlciBAIHAgJXAgc2l6ZSAlbGxkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgbV9vdXQuZ2V0X2J1ZmZlcl9zdGFydCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgbV9vdXQuZ2V0X2J1ZmZlcl9zaXplKCkpOworCisgICAgT0ZGTE9BRF9ERUJVR19EVU1QX0JZVEVTKDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fb3V0LmdldF9idWZmZXJfc3RhcnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9vdXQuZ2V0X2J1ZmZlcl9zaXplKCkpOworCisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKDEsIGdldF9vZmZsb2FkX251bWJlcigpLCBjX29mZmxvYWRfY29weW91dF9kYXRhLAorICAgICAgICAgICAgICAgICAgIlRvdGFsIGNvcHlvdXQgZGF0YSBzZW50IHRvIGhvc3Q6IFslbGxkXSBieXRlc1xuIiwKKyAgICAgICAgICAgICAgICAgIG1fb3V0LmdldF90ZnJfc2l6ZSgpKTsKKworICAgIE9GRkxPQURfVElNRVJfU1RPUChjX29mZmxvYWRfdGFyZ2V0X2dhdGhlcl9vdXRwdXRzKTsKK30KKwordm9pZCBfX29mZmxvYWRfdGFyZ2V0X2luaXQodm9pZCkKK3sKKyNpZmRlZiBTRVBfU1VQUE9SVAorICAgIGNvbnN0IGNoYXIqIGVudl92YXIgPSBnZXRlbnYoc2VwX21vbml0b3JfZW52KTsKKyAgICBpZiAoZW52X3ZhciAhPSAwICYmICplbnZfdmFyICE9ICdcMCcpIHsKKyAgICAgICAgc2VwX21vbml0b3IgPSBhdG9pKGVudl92YXIpOworICAgIH0KKyAgICBlbnZfdmFyID0gZ2V0ZW52KHNlcF9kZXZpY2VfZW52KTsKKyAgICBpZiAoZW52X3ZhciAhPSAwICYmICplbnZfdmFyICE9ICdcMCcpIHsKKyAgICAgICAgc2VwX2RldmljZSA9IGVudl92YXI7CisgICAgfQorI2VuZGlmIC8vIFNFUF9TVVBQT1JUCisKKyAgICBwcmVmaXggPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X21pYyk7CisKKyAgICAvLyBpbml0IGZyZXF1ZW5jeQorICAgIG1pY19mcmVxdWVuY3kgPSBDT0lQZXJmR2V0Q3ljbGVGcmVxdWVuY3koKTsKK30KKworLy8gVXNlci12aXNpYmxlIG9mZmxvYWQgQVBJCisKK2ludCBfT2ZmbG9hZF9udW1iZXJfb2ZfZGV2aWNlcyh2b2lkKQoreworICAgIHJldHVybiBtaWNfZW5naW5lc190b3RhbDsKK30KKworaW50IF9PZmZsb2FkX2dldF9kZXZpY2VfbnVtYmVyKHZvaWQpCit7CisgICAgcmV0dXJuIG1pY19pbmRleDsKK30KKworaW50IF9PZmZsb2FkX2dldF9waHlzaWNhbF9kZXZpY2VfbnVtYmVyKHZvaWQpCit7CisgICAgdWludDMyX3QgaW5kZXg7CisgICAgRW5naW5lR2V0SW5kZXgoJmluZGV4KTsKKyAgICByZXR1cm4gaW5kZXg7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3RhcmdldC5oIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90YXJnZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGIzMTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90YXJnZXQuaApAQCAtMCwwICsxLDEwMCBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisvLyBUaGUgcGFydHMgb2YgdGhlIG9mZmxvYWQgbGlicmFyeSB1c2VkIG9ubHkgb24gdGhlIHRhcmdldAorCisjaWZuZGVmIE9GRkxPQURfVEFSR0VUX0hfSU5DTFVERUQKKyNkZWZpbmUgT0ZGTE9BRF9UQVJHRVRfSF9JTkNMVURFRAorCisjaW5jbHVkZSAib2ZmbG9hZF9jb21tb24uaCIKKyNpbmNsdWRlICJjb2kvY29pX3NlcnZlci5oIgorCisvLyBUaGUgb2ZmbG9hZCBkZXNjcmlwdG9yLgorY2xhc3MgT2ZmbG9hZERlc2NyaXB0b3IKK3sKK3B1YmxpYzoKKyAgICB+T2ZmbG9hZERlc2NyaXB0b3IoKSB7CisgICAgICAgIGlmIChtX3ZhcnMgIT0gMCkgeworICAgICAgICAgICAgZnJlZShtX3ZhcnMpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gRW50cnkgcG9pbnQgZm9yIENPSS4gU3luY2hyb25vdXNseSBleGVjdXRlIG9mZmxvYWRlZCByZWdpb24gZ2l2ZW4KKyAgICAvLyB0aGUgcHJvdmlkZWQgYnVmZmVycywgbWlzYyBhbmQgcmV0dXJuIGRhdGEuCisgICAgc3RhdGljIHZvaWQgb2ZmbG9hZCgKKyAgICAgICAgdWludDMyX3QgIGJ1ZmZlcl9jb3VudCwKKyAgICAgICAgdm9pZCoqICAgIGJ1ZmZlcnMsCisgICAgICAgIHZvaWQqICAgICBtaXNjX2RhdGEsCisgICAgICAgIHVpbnQxNl90ICBtaXNjX2RhdGFfbGVuLAorICAgICAgICB2b2lkKiAgICAgcmV0dXJuX2RhdGEsCisgICAgICAgIHVpbnQxNl90ICByZXR1cm5fZGF0YV9sZW4KKyAgICApOworCisgICAgLy8gc2NhdHRlcnMgaW5wdXQgZGF0YSBmcm9tIGluIGJ1ZmZlciB0byB0YXJnZXQgdmFyaWFibGVzCisgICAgdm9pZCBzY2F0dGVyX2NvcHlpbl9kYXRhKCk7CisKKyAgICAvLyBnYXRoZXJzIG91dHB1dCBkYXRhIHRvIHRoZSBidWZmZXIKKyAgICB2b2lkIGdhdGhlcl9jb3B5b3V0X2RhdGEoKTsKKworICAgIC8vIG1lcmdlcyBsb2NhbCB2YXJpYWJsZSBkZXNjcmlwdG9ycyB3aXRoIHRoZSBkZXNjcmlwdG9ycyByZWNlaXZlZCBmcm9tCisgICAgLy8gaG9zdAorICAgIHZvaWQgbWVyZ2VfdmFyX2Rlc2NzKFZhckRlc2MgKnZhcnMsIFZhckRlc2MyICp2YXJzMiwgaW50IHZhcnNfdG90YWwpOworCisgICAgaW50IGdldF9vZmZsb2FkX251bWJlcigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fb2ZmbG9hZF9udW1iZXI7CisgICAgfQorCisgICAgdm9pZCBzZXRfb2ZmbG9hZF9udW1iZXIoaW50IG51bWJlcikgeworICAgICAgICBtX29mZmxvYWRfbnVtYmVyID0gbnVtYmVyOworICAgIH0KKworcHJpdmF0ZToKKyAgICAvLyBDb25zdHJ1Y3RvcgorICAgIE9mZmxvYWREZXNjcmlwdG9yKCkgOiBtX3ZhcnMoMCkKKyAgICB7fQorCitwcml2YXRlOgorICAgIHR5cGVkZWYgc3RkOjpsaXN0PHZvaWQqPiBCdWZmZXJMaXN0OworCisgICAgLy8gVGhlIE1hcnNoYWxsZXIgZm9yIHRoZSBpbnB1dHMgb2YgdGhlIG9mZmxvYWRlZCByZWdpb24uCisgICAgTWFyc2hhbGxlciBtX2luOworCisgICAgLy8gVGhlIE1hcnNoYWxsZXIgZm9yIHRoZSBvdXRwdXRzIG9mIHRoZSBvZmZsb2FkZWQgcmVnaW9uLgorICAgIE1hcnNoYWxsZXIgbV9vdXQ7CisKKyAgICAvLyBMaXN0IG9mIGJ1ZmZlcnMgdGhhdCBhcmUgcGFzc2VkIHRvIGRpc3BhdGNoIGNhbGwKKyAgICBCdWZmZXJMaXN0IG1fYnVmZmVyczsKKworICAgIC8vIFZhcmlhYmxlIGRlc2NyaXB0b3JzIHJlY2VpdmVkIGZyb20gaG9zdAorICAgIFZhckRlc2MqIG1fdmFyczsKKyAgICBpbnQgICAgICBtX3ZhcnNfdG90YWw7CisgICAgaW50ICAgICAgbV9vZmZsb2FkX251bWJlcjsKK307CisKKy8vIG9uZSB0aW1lIHRhcmdldCBpbml0aWFsaXphdGlvbiBpbiBtYWluCitleHRlcm4gdm9pZCBfX29mZmxvYWRfdGFyZ2V0X2luaXQodm9pZCk7CisKKy8vIGxvZ2ljYWwgZGV2aWNlIGluZGV4CitleHRlcm4gaW50IG1pY19pbmRleDsKKworLy8gdG90YWwgbnVtYmVyIG9mIGF2YWlsYWJsZSBsb2dpY2FsIGRldmljZXMKK2V4dGVybiBpbnQgbWljX2VuZ2luZXNfdG90YWw7CisKKy8vIGRldmljZSBmcmVxdWVuY3kgKGZyb20gQ09JKQorZXh0ZXJuIHVpbnQ2NF90IG1pY19mcmVxdWVuY3k7CisKK3N0cnVjdCBSZWZJbmZvIHsKKyAgICBSZWZJbmZvKGJvb2wgaXNfYWRkLCBsb25nIGFtb3VudCk6aXNfYWRkZWQoaXNfYWRkKSxjb3VudChhbW91bnQpCisgICAge30KKyAgICBib29sIGlzX2FkZGVkOworICAgIGxvbmcgY291bnQ7Cit9OworCisjZW5kaWYgLy8gT0ZGTE9BRF9UQVJHRVRfSF9JTkNMVURFRApkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90YXJnZXRfbWFpbi5jcHAgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3RhcmdldF9tYWluLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDkyMWQyCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90YXJnZXRfbWFpbi5jcHAKQEAgLTAsMCArMSwxNyBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCitleHRlcm4gIkMiIHZvaWQgX19vZmZsb2FkX3RhcmdldF9tYWluKHZvaWQpOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKiBhcmd2KQoreworICAgIF9fb2ZmbG9hZF90YXJnZXRfbWFpbigpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90aW1lci5oIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90aW1lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MDFhOWQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3RpbWVyLmgKQEAgLTAsMCArMSwxNzIgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBPRkZMT0FEX1RJTUVSX0hfSU5DTFVERUQKKyNkZWZpbmUgT0ZGTE9BRF9USU1FUl9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgImxpYm9mZmxvYWRfZXJyb3JfY29kZXMuaCIKKworZXh0ZXJuIGludCB0aW1lcl9lbmFibGVkOworCisjaWZkZWYgVElNSU5HX1NVUFBPUlQKKworc3RydWN0IE9mZmxvYWRUYXJnZXRUaW1lckRhdGEgeworICAgIHVpbnQ2NF90IGZyZXF1ZW5jeTsKKyAgICBzdHJ1Y3QgeworICAgICAgICB1aW50NjRfdCBzdGFydDsKKyAgICAgICAgdWludDY0X3QgdG90YWw7CisgICAgfSBwaGFzZXNbY19vZmZsb2FkX3RhcmdldF9tYXhfcGhhc2VdOworfTsKKworc3RydWN0IE9mZmxvYWRIb3N0VGltZXJEYXRhIHsKKyAgICAvLyBzb3VyY2UgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlcgorICAgIGNvbnN0IGNoYXIqIGZpbGU7CisgICAgaW50ICAgICAgICAgbGluZTsKKworICAgIC8vIGhvc3QgdGltZXIgZGF0YQorICAgIHN0cnVjdCB7CisgICAgICAgIHVpbnQ2NF90IHN0YXJ0OworICAgICAgICB1aW50NjRfdCB0b3RhbDsKKyAgICB9IHBoYXNlc1tjX29mZmxvYWRfaG9zdF9tYXhfcGhhc2VdOworCisgICAgdWludDY0X3Qgc2VudF9ieXRlczsKKyAgICB1aW50NjRfdCByZWNlaXZlZF9ieXRlczsKKyAgICBpbnQgY2FyZF9udW1iZXI7CisgICAgaW50IG9mZmxvYWRfbnVtYmVyOworCisgICAgLy8gdGFyZ2V0IHRpbWVyIGRhdGEKKyAgICBPZmZsb2FkVGFyZ2V0VGltZXJEYXRhIHRhcmdldDsKKworICAgIC8vIG5leHQgZWxlbWVudAorICAgIE9mZmxvYWRIb3N0VGltZXJEYXRhICpuZXh0OworfTsKKworI2lmIEhPU1RfTElCUkFSWQorCitleHRlcm4gaW50IG9mZmxvYWRfcmVwb3J0X2xldmVsOworZXh0ZXJuIGludCBvZmZsb2FkX3JlcG9ydF9lbmFibGVkOworI2RlZmluZSBPRkZMT0FEX1JFUE9SVF8xIDEKKyNkZWZpbmUgT0ZGTE9BRF9SRVBPUlRfMiAyCisjZGVmaW5lIE9GRkxPQURfUkVQT1JUXzMgMworI2RlZmluZSBPRkZMT0FEX1JFUE9SVF9PTiAxCisjZGVmaW5lIE9GRkxPQURfUkVQT1JUX09GRiAwCisKKyNkZWZpbmUgT0ZGTE9BRF9USU1FUl9EQVRBTEVOKCkgXAorICAgICgodGltZXJfZW5hYmxlZCB8fCAob2ZmbG9hZF9yZXBvcnRfbGV2ZWwgJiYgb2ZmbG9hZF9yZXBvcnRfZW5hYmxlZCkpID8gXAorICAgICAoKDEgKyBjX29mZmxvYWRfdGFyZ2V0X21heF9waGFzZSkgKiBzaXplb2YodWludDY0X3QpKSA6IDApCisKKyNkZWZpbmUgT0ZGTE9BRF9USU1FUl9TVEFSVCh0aW1lcl9kYXRhLCBwbm9kZSkgXAorICAgIGlmICh0aW1lcl9lbmFibGVkIHx8IFwKKyAgICAgICAgKG9mZmxvYWRfcmVwb3J0X2xldmVsICYmIG9mZmxvYWRfcmVwb3J0X2VuYWJsZWQpKSB7IFwKKyAgICAgICAgb2ZmbG9hZF90aW1lcl9zdGFydCh0aW1lcl9kYXRhLCBwbm9kZSk7IFwKKyAgICB9CisKKyNkZWZpbmUgT0ZGTE9BRF9USU1FUl9TVE9QKHRpbWVyX2RhdGEsIHBub2RlKSBcCisgICAgaWYgKHRpbWVyX2VuYWJsZWQgfHwgXAorICAgICAgICAob2ZmbG9hZF9yZXBvcnRfbGV2ZWwgJiYgb2ZmbG9hZF9yZXBvcnRfZW5hYmxlZCkpIHsgXAorICAgICAgICBvZmZsb2FkX3RpbWVyX3N0b3AodGltZXJfZGF0YSwgcG5vZGUpOyBcCisgICAgfQorCisjZGVmaW5lIE9GRkxPQURfVElNRVJfSU5JVChmaWxlLCBsaW5lKSBcCisgICAgb2ZmbG9hZF90aW1lcl9pbml0KGZpbGUsIGxpbmUpOworCisjZGVmaW5lIE9GRkxPQURfVElNRVJfVEFSR0VUX0RBVEEodGltZXJfZGF0YSwgZGF0YSkgXAorICAgIGlmICh0aW1lcl9lbmFibGVkIHx8IFwKKyAgICAgICAgKG9mZmxvYWRfcmVwb3J0X2xldmVsICYmIG9mZmxvYWRfcmVwb3J0X2VuYWJsZWQpKSB7IFwKKyAgICAgICAgb2ZmbG9hZF90aW1lcl9maWxsX3RhcmdldF9kYXRhKHRpbWVyX2RhdGEsIGRhdGEpOyBcCisgICAgfQorCisjZGVmaW5lIE9GRkxPQURfVElNRVJfSE9TVF9TREFUQSh0aW1lcl9kYXRhLCBkYXRhKSBcCisgICAgaWYgKG9mZmxvYWRfcmVwb3J0X2xldmVsICYmIG9mZmxvYWRfcmVwb3J0X2VuYWJsZWQpIHsgXAorICAgICAgICBvZmZsb2FkX3RpbWVyX2ZpbGxfaG9zdF9zZGF0YSh0aW1lcl9kYXRhLCBkYXRhKTsgXAorICAgIH0KKworI2RlZmluZSBPRkZMT0FEX1RJTUVSX0hPU1RfUkRBVEEodGltZXJfZGF0YSwgZGF0YSkgXAorICAgIGlmIChvZmZsb2FkX3JlcG9ydF9sZXZlbCAmJiBvZmZsb2FkX3JlcG9ydF9lbmFibGVkKSB7IFwKKyAgICAgICAgb2ZmbG9hZF90aW1lcl9maWxsX2hvc3RfcmRhdGEodGltZXJfZGF0YSwgZGF0YSk7IFwKKyAgICB9CisKKyNkZWZpbmUgT0ZGTE9BRF9USU1FUl9IT1NUX01JQ19OVU0odGltZXJfZGF0YSwgZGF0YSkgXAorICAgIGlmIChvZmZsb2FkX3JlcG9ydF9sZXZlbCAmJiBvZmZsb2FkX3JlcG9ydF9lbmFibGVkKSB7IFwKKyAgICAgICAgb2ZmbG9hZF90aW1lcl9maWxsX2hvc3RfbWljX251bSh0aW1lcl9kYXRhLCBkYXRhKTsgXAorICAgIH0KKworZXh0ZXJuIHZvaWQgb2ZmbG9hZF90aW1lcl9zdGFydChPZmZsb2FkSG9zdFRpbWVyRGF0YSAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPZmZsb2FkSG9zdFBoYXNlIHRfbm9kZSk7CitleHRlcm4gdm9pZCBvZmZsb2FkX3RpbWVyX3N0b3AoT2ZmbG9hZEhvc3RUaW1lckRhdGEgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPZmZsb2FkSG9zdFBoYXNlIHRfbm9kZSk7CitleHRlcm4gT2ZmbG9hZEhvc3RUaW1lckRhdGEgKiBvZmZsb2FkX3RpbWVyX2luaXQoY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpOworZXh0ZXJuIHZvaWQgb2ZmbG9hZF90aW1lcl9maWxsX3RhcmdldF9kYXRhKE9mZmxvYWRIb3N0VGltZXJEYXRhICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSk7CitleHRlcm4gdm9pZCBvZmZsb2FkX3RpbWVyX2ZpbGxfaG9zdF9zZGF0YShPZmZsb2FkSG9zdFRpbWVyRGF0YSAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgc2VudF9ieXRlcyk7CitleHRlcm4gdm9pZCBvZmZsb2FkX3RpbWVyX2ZpbGxfaG9zdF9yZGF0YShPZmZsb2FkSG9zdFRpbWVyRGF0YSAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgc2VudF9ieXRlcyk7CitleHRlcm4gdm9pZCBvZmZsb2FkX3RpbWVyX2ZpbGxfaG9zdF9taWNfbnVtKE9mZmxvYWRIb3N0VGltZXJEYXRhICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYXJkX251bWJlcik7CisKKy8vIFV0aWxpdHkgc3RydWN0dXJlIGZvciBzdGFydGluZy9zdG9wcGluZyB0aW1lcgorc3RydWN0IE9mZmxvYWRUaW1lciB7CisgICAgT2ZmbG9hZFRpbWVyKE9mZmxvYWRIb3N0VGltZXJEYXRhICpkYXRhLCBPZmZsb2FkSG9zdFBoYXNlIHBoYXNlKSA6CisgICAgICAgIG1fZGF0YShkYXRhKSwKKyAgICAgICAgbV9waGFzZShwaGFzZSkKKyAgICB7CisgICAgICAgIE9GRkxPQURfVElNRVJfU1RBUlQobV9kYXRhLCBtX3BoYXNlKTsKKyAgICB9CisKKyAgICB+T2ZmbG9hZFRpbWVyKCkKKyAgICB7CisgICAgICAgIE9GRkxPQURfVElNRVJfU1RPUChtX2RhdGEsIG1fcGhhc2UpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBPZmZsb2FkSG9zdFRpbWVyRGF0YSogICBtX2RhdGE7CisgICAgT2ZmbG9hZEhvc3RQaGFzZSAgICAgICAgbV9waGFzZTsKK307CisKKyNlbHNlCisKKyNkZWZpbmUgT0ZGTE9BRF9USU1FUl9EQVRBTEVOKCkgXAorICAgICgodGltZXJfZW5hYmxlZCkgPyBcCisgICAgICgoMSArIGNfb2ZmbG9hZF90YXJnZXRfbWF4X3BoYXNlKSAqIHNpemVvZih1aW50NjRfdCkpIDogMCkKKworI2RlZmluZSBPRkZMT0FEX1RJTUVSX1NUQVJUKHBub2RlKSBcCisgICAgaWYgKHRpbWVyX2VuYWJsZWQpIG9mZmxvYWRfdGltZXJfc3RhcnQocG5vZGUpOworCisjZGVmaW5lIE9GRkxPQURfVElNRVJfU1RPUChwbm9kZSkgXAorICAgIGlmICh0aW1lcl9lbmFibGVkKSBvZmZsb2FkX3RpbWVyX3N0b3AocG5vZGUpOworCisjZGVmaW5lIE9GRkxPQURfVElNRVJfSU5JVCgpIFwKKyAgICBpZiAodGltZXJfZW5hYmxlZCkgb2ZmbG9hZF90aW1lcl9pbml0KCk7CisKKyNkZWZpbmUgT0ZGTE9BRF9USU1FUl9UQVJHRVRfREFUQShkYXRhKSBcCisgICAgaWYgKHRpbWVyX2VuYWJsZWQpIG9mZmxvYWRfdGltZXJfZmlsbF90YXJnZXRfZGF0YShkYXRhKTsKKworZXh0ZXJuIHZvaWQgb2ZmbG9hZF90aW1lcl9zdGFydChPZmZsb2FkVGFyZ2V0UGhhc2UgdF9ub2RlKTsKK2V4dGVybiB2b2lkIG9mZmxvYWRfdGltZXJfc3RvcChPZmZsb2FkVGFyZ2V0UGhhc2UgdF9ub2RlKTsKK2V4dGVybiB2b2lkIG9mZmxvYWRfdGltZXJfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIG9mZmxvYWRfdGltZXJfZmlsbF90YXJnZXRfZGF0YSh2b2lkICpkYXRhKTsKKworI2VuZGlmIC8vIEhPU1RfTElCUkFSWQorCisjZWxzZSAvLyBUSU1JTkdfU1VQUE9SVAorCisjZGVmaW5lIE9GRkxPQURfVElNRVJfU1RBUlQoLi4uKQorI2RlZmluZSBPRkZMT0FEX1RJTUVSX1NUT1AoLi4uKQorI2RlZmluZSBPRkZMT0FEX1RJTUVSX0lOSVQoLi4uKQorI2RlZmluZSBPRkZMT0FEX1RJTUVSX1RBUkdFVF9EQVRBKC4uLikKKyNkZWZpbmUgT0ZGTE9BRF9USU1FUl9EQVRBTEVOKC4uLikgICAgICAoMCkKKworI2VuZGlmIC8vIFRJTUlOR19TVVBQT1JUCisKKyNlbmRpZiAvLyBPRkZMT0FEX1RJTUVSX0hfSU5DTFVERUQKZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfdGltZXJfaG9zdC5jcHAgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3RpbWVyX2hvc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMjdkYjAKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3RpbWVyX2hvc3QuY3BwCkBAIC0wLDAgKzEsMzU5IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJvZmZsb2FkX3RpbWVyLmgiCisKKyNpZmRlZiBfX0lOVEVMX0NPTVBJTEVSCisjaW5jbHVkZSA8aWEzMmludHJpbi5oPgorI2Vsc2UgLy8gX19JTlRFTF9DT01QSUxFUgorI2luY2x1ZGUgPHg4NmludHJpbi5oPgorI2VuZGlmIC8vIF9fSU5URUxfQ09NUElMRVIKKworI2luY2x1ZGUgIm9mZmxvYWRfaG9zdC5oIgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8aW9tYW5pcD4KKworaW50IHRpbWVyX2VuYWJsZWQgPSAwOworCisjaWZkZWYgVElNSU5HX1NVUFBPUlQKKworaW50IG9mZmxvYWRfcmVwb3J0X2xldmVsID0gMDsKK2ludCBvZmZsb2FkX3JlcG9ydF9lbmFibGVkID0gMTsKKworc3RhdGljIGNvbnN0IGludCBob3N0X3RpbWVyX3ByZWZpeF9zcGFjZXNbXSA9IHsKKyAgICAvKmNfb2ZmbG9hZF9ob3N0X3NldHVwX2J1ZmZlcnMqLyAgICAgICAgIDAsCisgICAgLypjX29mZmxvYWRfaG9zdF9pbml0aWFsaXplKi8gICAgICAgICAgICAyLAorICAgIC8qY19vZmZsb2FkX2hvc3RfdGFyZ2V0X2FjcXVpcmUqLyAgICAgICAgMiwKKyAgICAvKmNfb2ZmbG9hZF9ob3N0X3dhaXRfZGVwcyovICAgICAgICAgICAgIDIsCisgICAgLypjX29mZmxvYWRfaG9zdF9zZXR1cF9idWZmZXJzKi8gICAgICAgICAyLAorICAgIC8qY19vZmZsb2FkX2hvc3RfYWxsb2NfYnVmZmVycyovICAgICAgICAgNCwKKyAgICAvKmNfb2ZmbG9hZF9ob3N0X3NldHVwX21pc2NfZGF0YSovICAgICAgIDIsCisgICAgLypjX29mZmxvYWRfaG9zdF9hbGxvY19kYXRhX2J1ZmZlciovICAgICA0LAorICAgIC8qY19vZmZsb2FkX2hvc3Rfc2VuZF9wb2ludGVycyovICAgICAgICAgMiwKKyAgICAvKmNfb2ZmbG9hZF9ob3N0X2dhdGhlcl9pbnB1dHMqLyAgICAgICAgIDIsCisgICAgLypjX29mZmxvYWRfaG9zdF9tYXBfaW5fZGF0YV9idWZmZXIqLyAgICA0LAorICAgIC8qY19vZmZsb2FkX2hvc3RfdW5tYXBfaW5fZGF0YV9idWZmZXIqLyAgNCwKKyAgICAvKmNfb2ZmbG9hZF9ob3N0X3N0YXJ0X2NvbXB1dGUqLyAgICAgICAgIDIsCisgICAgLypjX29mZmxvYWRfaG9zdF93YWl0X2NvbXB1dGUqLyAgICAgICAgICAyLAorICAgIC8qY19vZmZsb2FkX2hvc3Rfc3RhcnRfYnVmZmVyc19yZWFkcyovICAgMiwKKyAgICAvKmNfb2ZmbG9hZF9ob3N0X3NjYXR0ZXJfb3V0cHV0cyovICAgICAgIDIsCisgICAgLypjX29mZmxvYWRfaG9zdF9tYXBfb3V0X2RhdGFfYnVmZmVyKi8gICA0LAorICAgIC8qY19vZmZsb2FkX2hvc3RfdW5tYXBfb3V0X2RhdGFfYnVmZmVyKi8gNCwKKyAgICAvKmNfb2ZmbG9hZF9ob3N0X3dhaXRfYnVmZmVyc19yZWFkcyovICAgIDIsCisgICAgLypjX29mZmxvYWRfaG9zdF9kZXN0cm95X2J1ZmZlcnMqLyAgICAgICAyCit9OworCitjb25zdCBzdGF0aWMgaW50IHRhcmdldF90aW1lcl9wcmVmaXhfc3BhY2VzW10gPSB7CisvKmNfb2ZmbG9hZF90YXJnZXRfdG90YWxfdGltZSovICAgICAgICAgIDAsCisvKmNfb2ZmbG9hZF90YXJnZXRfZGVzY3JpcHRvcl9zZXR1cCovICAgIDIsCisvKmNfb2ZmbG9hZF90YXJnZXRfZnVuY19sb29rdXAqLyAgICAgICAgIDIsCisvKmNfb2ZmbG9hZF90YXJnZXRfZnVuY190aW1lKi8gICAgICAgICAgIDIsCisvKmNfb2ZmbG9hZF90YXJnZXRfc2NhdHRlcl9pbnB1dHMqLyAgICAgIDQsCisvKmNfb2ZmbG9hZF90YXJnZXRfYWRkX2J1ZmZlcl9yZWZzKi8gICAgIDYsCisvKmNfb2ZmbG9hZF90YXJnZXRfY29tcHV0ZSovICAgICAgICAgICAgIDQsCisvKmNfb2ZmbG9hZF90YXJnZXRfZ2F0aGVyX291dHB1dHMqLyAgICAgIDQsCisvKmNfb2ZmbG9hZF90YXJnZXRfcmVsZWFzZV9idWZmZXJfcmVmcyovIDYKK307CisKK3N0YXRpYyBPZmZsb2FkSG9zdFRpbWVyRGF0YSogdGltZXJfZGF0YV9oZWFkOworc3RhdGljIE9mZmxvYWRIb3N0VGltZXJEYXRhKiB0aW1lcl9kYXRhX3RhaWw7CitzdGF0aWMgbXV0ZXhfdCAgICAgICAgICAgICAgIHRpbWVyX2RhdGFfbXV0ZXg7CisKK3N0YXRpYyB2b2lkIG9mZmxvYWRfaG9zdF9waGFzZV9uYW1lKHN0ZDo6c3RyaW5nc3RyZWFtICZzcywgaW50IHBfbm9kZSk7CitzdGF0aWMgdm9pZCBvZmZsb2FkX3RhcmdldF9waGFzZV9uYW1lKHN0ZDo6c3RyaW5nc3RyZWFtICZzcywgaW50IHBfbm9kZSk7CisKK2V4dGVybiB2b2lkIE9mZmxvYWRfVGltZXJfUHJpbnQodm9pZCkKK3sKKyAgICBzdGQ6OnN0cmluZyAgICAgICBidWY7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgY29uc3QgY2hhciAqc3RhcnMgPQorICAgICAgICAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiOworCisgICAgc3MgPDwgIlxuXG4iIDw8IHN0YXJzIDw8ICJcbiI7CisgICAgc3MgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjsKKyAgICBzcyA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3RpdGxlKSA8PCAiXG4iOworICAgIHNzIDw8IHN0YXJzIDw8ICJcbiI7CisgICAgZG91YmxlIGZyZXF1ZW5jeSA9IGNwdV9mcmVxdWVuY3k7CisKKyAgICBmb3IgKE9mZmxvYWRIb3N0VGltZXJEYXRhICpwbm9kZSA9IHRpbWVyX2RhdGFfaGVhZDsKKyAgICAgICAgIHBub2RlICE9IDA7IHBub2RlID0gcG5vZGUtPm5leHQpIHsKKyAgICAgICAgc3MgPDwgIiAgICAgICI7CisgICAgICAgIHNzIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfZnJvbV9maWxlKSA8PCAiICI8PCBwbm9kZS0+ZmlsZTsKKyAgICAgICAgc3MgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9saW5lKSA8PCAiICIgPDwgcG5vZGUtPmxpbmU7CisgICAgICAgIHNzIDw8ICJcbiI7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY19vZmZsb2FkX2hvc3RfbWF4X3BoYXNlIDsgaSsrKSB7CisgICAgICAgICAgICBzcyA8PCAiICAgICAgICAgICI7CisgICAgICAgICAgICBvZmZsb2FkX2hvc3RfcGhhc2VfbmFtZShzcywgaSk7CisgICAgICAgICAgICBzcyA8PCAiICAgIiA8PCBzdGQ6OmZpeGVkIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKDUpOworICAgICAgICAgICAgc3MgPDwgKGRvdWJsZSlwbm9kZS0+cGhhc2VzW2ldLnRvdGFsIC8gZnJlcXVlbmN5IDw8ICJcbiI7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNfb2ZmbG9hZF90YXJnZXRfbWF4X3BoYXNlIDsgaSsrKSB7CisgICAgICAgICAgICBkb3VibGUgdGltZSA9IDA7CisgICAgICAgICAgICBpZiAocG5vZGUtPnRhcmdldC5mcmVxdWVuY3kgIT0gMCkgeworICAgICAgICAgICAgICAgIHRpbWUgPSAoZG91YmxlKSBwbm9kZS0+dGFyZ2V0LnBoYXNlc1tpXS50b3RhbCAvCisgICAgICAgICAgICAgICAgICAgICAgIChkb3VibGUpIHBub2RlLT50YXJnZXQuZnJlcXVlbmN5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3MgPDwgIiAgICAgICAgICAiOworICAgICAgICAgICAgb2ZmbG9hZF90YXJnZXRfcGhhc2VfbmFtZShzcywgaSk7CisgICAgICAgICAgICBzcyA8PCAiICAgIiA8PCBzdGQ6OmZpeGVkIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKDUpOworICAgICAgICAgICAgc3MgPDwgdGltZSA8PCAiXG4iOworICAgICAgICB9CisgICAgfQorCisgICAgYnVmID0gc3Muc3RyKCk7CisgICAgZnByaW50ZihzdGRvdXQsIGJ1Zi5kYXRhKCkpOworICAgIGZmbHVzaChzdGRvdXQpOworfQorCitleHRlcm4gdm9pZCBPZmZsb2FkX1JlcG9ydF9Qcm9sb2coT2ZmbG9hZEhvc3RUaW1lckRhdGEgKnBub2RlKQoreworICAgIGRvdWJsZSBmcmVxdWVuY3kgPSBjcHVfZnJlcXVlbmN5OworICAgIHN0ZDo6c3RyaW5nICAgICAgIGJ1ZjsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKworICAgIGlmIChwbm9kZSkgeworICAgICAgICAvLyBbT2ZmbG9hZF0gW01pYyAwXSBbRmlsZV0gICAgICAgICAgZmlsZS5jCisgICAgICAgIHNzIDw8ICJbIiA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X29mZmxvYWQpIDw8ICJdIFsiOworICAgICAgICBzcyA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X21pYykgPDwgIiAiOworICAgICAgICBzcyA8PCBwbm9kZS0+Y2FyZF9udW1iZXIgPDwgIl0gWyI7CisgICAgICAgIHNzIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfZmlsZSk7CisgICAgICAgIHNzIDw8ICJdICAgICAgICAgICAgICAgICAgICAiIDw8IHBub2RlLT5maWxlIDw8ICJcbiI7CisKKyAgICAgICAgLy8gW09mZmxvYWRdIFtNaWMgMF0gW0xpbmVdICAgICAgICAgIDEyMzQKKyAgICAgICAgc3MgPDwgIlsiIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfb2ZmbG9hZCkgPDwgIl0gWyI7CisgICAgICAgIHNzIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfbWljKSA8PCAiICI7CisgICAgICAgIHNzIDw8IHBub2RlLT5jYXJkX251bWJlciA8PCAiXSBbIjsKKyAgICAgICAgc3MgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9saW5lKTsKKyAgICAgICAgc3MgPDwgIl0gICAgICAgICAgICAgICAgICAgICIgPDwgcG5vZGUtPmxpbmUgPDwgIlxuIjsKKworICAgICAgICAvLyBbT2ZmbG9hZF0gW01pYyAwXSBbVGFnXSAgICAgICAgICBUYWcgMQorICAgICAgICBzcyA8PCAiWyIgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9vZmZsb2FkKSA8PCAiXSBbIjsKKyAgICAgICAgc3MgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9taWMpIDw8ICIgIjsKKyAgICAgICAgc3MgPDwgcG5vZGUtPmNhcmRfbnVtYmVyIDw8ICJdIFsiOworICAgICAgICBzcyA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3RhZyk7CisgICAgICAgIHNzIDw8ICJdICAgICAgICAgICAgICAgICAgICAgIiA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3RhZyk7CisgICAgICAgIHNzIDw8ICIgIiA8PCBwbm9kZS0+b2ZmbG9hZF9udW1iZXIgPDwgIlxuIjsKKworICAgICAgICBidWYgPSBzcy5zdHIoKTsKKyAgICAgICAgZnByaW50ZihzdGRvdXQsIGJ1Zi5kYXRhKCkpOworICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICB9Cit9CisKK2V4dGVybiB2b2lkIE9mZmxvYWRfUmVwb3J0X0VwaWxvZyhPZmZsb2FkSG9zdFRpbWVyRGF0YSAqIHRpbWVyX2RhdGEpCit7CisgICAgZG91YmxlIGZyZXF1ZW5jeSA9IGNwdV9mcmVxdWVuY3k7CisgICAgc3RkOjpzdHJpbmcgICAgICAgYnVmOworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworCisgICAgT2ZmbG9hZEhvc3RUaW1lckRhdGEgKnBub2RlID0gdGltZXJfZGF0YTsKKworICAgIGlmICghcG5vZGUpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzcyA8PCAiWyIgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9vZmZsb2FkKSA8PCAiXSBbIjsKKyAgICBzcyA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X2hvc3QpIDw8ICJdICBbIjsKKyAgICBzcyA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3RhZykgPDwgICIgIjsKKyAgICBzcyA8PCBwbm9kZS0+b2ZmbG9hZF9udW1iZXIgPDwgIl0gWyI7CisgICAgc3MgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9jcHVfdGltZSkgPDwgIl0gICAgICAgICI7CisgICAgc3MgPDwgc3RkOjpmaXhlZCA8PCBzdGQ6OnNldHByZWNpc2lvbig2KTsKKyAgICBzcyA8PCAoZG91YmxlKSBwbm9kZS0+cGhhc2VzWzBdLnRvdGFsIC8gZnJlcXVlbmN5OworICAgIHNzIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc2Vjb25kcykgPDwgIlxuIjsKKworICAgIGlmIChvZmZsb2FkX3JlcG9ydF9sZXZlbCA+PSBPRkZMT0FEX1JFUE9SVF8yKSB7CisgICAgICAgIHNzIDw8ICJbIiA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X29mZmxvYWQpIDw8ICJdIFsiOworICAgICAgICBzcyA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X21pYyk7CisgICAgICAgIHNzIDw8ICIgIiA8PCBwbm9kZS0+Y2FyZF9udW1iZXI7CisgICAgICAgIHNzIDw8ICJdIFsiIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfdGFnKSA8PCAiICI7CisgICAgICAgIHNzIDw8ICBwbm9kZS0+b2ZmbG9hZF9udW1iZXIgPDwgIl0gWyI7CisgICAgICAgIHNzIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfY3B1X3RvX21pY19kYXRhKSA8PCAiXSAgICI7CisgICAgICAgIHNzIDw8IHBub2RlLT5zZW50X2J5dGVzIDw8ICIgIjsKKyAgICAgICAgc3MgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9ieXRlcykgPDwgIlxuIjsKKyAgICB9CisKKyAgICBkb3VibGUgdGltZSA9IDA7CisgICAgaWYgKHBub2RlLT50YXJnZXQuZnJlcXVlbmN5ICE9IDApIHsKKyAgICAgICAgdGltZSA9IChkb3VibGUpIHBub2RlLT50YXJnZXQucGhhc2VzWzBdLnRvdGFsIC8KKyAgICAgICAgICAgIChkb3VibGUpIHBub2RlLT50YXJnZXQuZnJlcXVlbmN5OworICAgIH0KKyAgICBzcyA8PCAiWyIgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9vZmZsb2FkKSA8PCAiXSBbIjsKKyAgICBzcyA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X21pYykgPDwgIiAiOworICAgIHNzIDw8IHBub2RlLT5jYXJkX251bWJlcjw8ICJdIFsiOworICAgIHNzIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfdGFnKSA8PCAgIiAiOworICAgIHNzIDw8IHBub2RlLT5vZmZsb2FkX251bWJlciA8PCAiXSBbIjsKKyAgICBzcyA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X21pY190aW1lKSA8PCAiXSAgICAgICAgIjsKKyAgICBzcyA8PCBzdGQ6OmZpeGVkIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKDYpIDw8IHRpbWU7CisgICAgc3MgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zZWNvbmRzKSA8PCAiXG4iOworCisgICAgaWYgKG9mZmxvYWRfcmVwb3J0X2xldmVsID49IE9GRkxPQURfUkVQT1JUXzIpIHsKKyAgICAgICAgc3MgPDwgIlsiIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfb2ZmbG9hZCkgPDwgIl0gWyI7CisgICAgICAgIHNzIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfbWljKTsKKyAgICAgICAgc3MgPDwgIiAiIDw8IHBub2RlLT5jYXJkX251bWJlcjsKKyAgICAgICAgc3MgPDwgIl0gWyIgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF90YWcpIDw8ICIgIjsKKyAgICAgICAgc3MgPDwgIHBub2RlLT5vZmZsb2FkX251bWJlciA8PCAiXSBbIjsKKyAgICAgICAgc3MgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9taWNfdG9fY3B1X2RhdGEpIDw8ICJdICAgIjsKKyAgICAgICAgc3MgPDwgcG5vZGUtPnJlY2VpdmVkX2J5dGVzIDw8ICIgIjsKKyAgICAgICAgc3MgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9ieXRlcykgPDwgIlxuIjsKKyAgICB9CisgICAgc3MgPDwgIlxuIjsKKworICAgIGJ1ZiA9IHNzLnN0cigpOworICAgIGZwcmludGYoc3Rkb3V0LCBidWYuZGF0YSgpKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKKworICAgIG9mZmxvYWRfcmVwb3J0X2ZyZWVfZGF0YSh0aW1lcl9kYXRhKTsKK30KKworZXh0ZXJuIHZvaWQgb2ZmbG9hZF9yZXBvcnRfZnJlZV9kYXRhKE9mZmxvYWRIb3N0VGltZXJEYXRhICogdGltZXJfZGF0YSkKK3sKKyAgICBPZmZsb2FkSG9zdFRpbWVyRGF0YSAqcG5vZGVfbGFzdCA9IE5VTEw7CisKKyAgICBmb3IgKE9mZmxvYWRIb3N0VGltZXJEYXRhICpwbm9kZSA9IHRpbWVyX2RhdGFfaGVhZDsKKyAgICAgICAgIHBub2RlICE9IDA7IHBub2RlID0gcG5vZGUtPm5leHQpIHsKKyAgICAgICAgaWYgKHRpbWVyX2RhdGEgPT0gcG5vZGUpIHsKKyAgICAgICAgICAgIGlmIChwbm9kZV9sYXN0KSB7CisgICAgICAgICAgICAgICAgcG5vZGVfbGFzdC0+bmV4dCA9IHBub2RlLT5uZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgdGltZXJfZGF0YV9oZWFkID0gcG5vZGUtPm5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBPRkZMT0FEX0ZSRUUocG5vZGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcG5vZGVfbGFzdCA9IHBub2RlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZmlsbF9idWZfd2l0aF9zcGFjZXMoc3RkOjpzdHJpbmdzdHJlYW0gJnNzLCBpbnQgbnVtKQoreworICAgIGZvciAoOyBudW0gPiAwOyBudW0tLSkgeworICAgICAgICBzcyA8PCAiICI7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBvZmZsb2FkX2hvc3RfcGhhc2VfbmFtZShzdGQ6OnN0cmluZ3N0cmVhbSAmc3MsIGludCBwX25vZGUpCit7CisgICAgaW50IHByZWZpeF9zcGFjZXM7CisgICAgaW50IHN0cl9sZW5ndGg7CisgICAgaW50IHRhaWxfbGVuZ3RoOworICAgIGNvbnN0IGludCBtZXNzYWdlX2xlbmd0aCA9IDQwOworICAgIGNoYXIgY29uc3QgKnN0cjsKKworICAgIHN0ciA9IHJlcG9ydF9nZXRfaG9zdF9zdGFnZV9zdHIocF9ub2RlKTsKKyAgICBwcmVmaXhfc3BhY2VzID0gaG9zdF90aW1lcl9wcmVmaXhfc3BhY2VzW3Bfbm9kZV07CisgICAgZmlsbF9idWZfd2l0aF9zcGFjZXMoc3MsIHByZWZpeF9zcGFjZXMpOworICAgIHN0cl9sZW5ndGggPSBzdHJsZW4oc3RyKTsKKyAgICBzcyA8PCBzdHI7CisgICAgdGFpbF9sZW5ndGggPSBtZXNzYWdlX2xlbmd0aCAtIHByZWZpeF9zcGFjZXMgLSBzdHJfbGVuZ3RoOworICAgIHRhaWxfbGVuZ3RoID0gdGFpbF9sZW5ndGggPiAwPyB0YWlsX2xlbmd0aCA6IDE7CisgICAgZmlsbF9idWZfd2l0aF9zcGFjZXMoc3MsIHRhaWxfbGVuZ3RoKTsKK30KKworc3RhdGljIHZvaWQgb2ZmbG9hZF90YXJnZXRfcGhhc2VfbmFtZShzdGQ6OnN0cmluZ3N0cmVhbSAmc3MsIGludCBwX25vZGUpCit7CisgICAgaW50IHByZWZpeF9zcGFjZXM7CisgICAgaW50IHN0cl9sZW5ndGg7CisgICAgY29uc3QgaW50IG1lc3NhZ2VfbGVuZ3RoID0gNDA7CisgICAgaW50IHRhaWxfbGVuZ3RoOworICAgIGNoYXIgY29uc3QgKnN0cjsKKworICAgIHN0ciA9IHJlcG9ydF9nZXRfdGFyZ2V0X3N0YWdlX3N0cihwX25vZGUpOworICAgIHByZWZpeF9zcGFjZXMgPSB0YXJnZXRfdGltZXJfcHJlZml4X3NwYWNlc1twX25vZGVdOworICAgIGZpbGxfYnVmX3dpdGhfc3BhY2VzKHNzLCBwcmVmaXhfc3BhY2VzKTsKKyAgICBzdHJfbGVuZ3RoID0gc3RybGVuKHN0cik7CisgICAgc3MgPDwgc3RyOworICAgIHRhaWxfbGVuZ3RoID0gbWVzc2FnZV9sZW5ndGggLSBwcmVmaXhfc3BhY2VzIC0gc3RyX2xlbmd0aDsKKyAgICB0YWlsX2xlbmd0aCA9ICh0YWlsX2xlbmd0aCA+IDApPyB0YWlsX2xlbmd0aCA6IDE7CisgICAgZmlsbF9idWZfd2l0aF9zcGFjZXMoc3MsIHRhaWxfbGVuZ3RoKTsKK30KKwordm9pZCBvZmZsb2FkX3RpbWVyX3N0YXJ0KE9mZmxvYWRIb3N0VGltZXJEYXRhICogdGltZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPZmZsb2FkSG9zdFBoYXNlIHBfdHlwZSkKK3sKKyAgICB0aW1lcl9kYXRhLT5waGFzZXNbcF90eXBlXS5zdGFydCA9IF9yZHRzYygpOworfQorCit2b2lkIG9mZmxvYWRfdGltZXJfc3RvcChPZmZsb2FkSG9zdFRpbWVyRGF0YSAqIHRpbWVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBPZmZsb2FkSG9zdFBoYXNlIHBfdHlwZSkKK3sKKyAgICB0aW1lcl9kYXRhLT5waGFzZXNbcF90eXBlXS50b3RhbCArPSBfcmR0c2MoKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXJfZGF0YS0+cGhhc2VzW3BfdHlwZV0uc3RhcnQ7Cit9CisKK3ZvaWQgb2ZmbG9hZF90aW1lcl9maWxsX3RhcmdldF9kYXRhKE9mZmxvYWRIb3N0VGltZXJEYXRhICogdGltZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZikKK3sKKyAgICB1aW50NjRfdCAqZGF0YSA9ICh1aW50NjRfdCopIGJ1ZjsKKworICAgIHRpbWVyX2RhdGEtPnRhcmdldC5mcmVxdWVuY3kgPSAqZGF0YSsrOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY19vZmZsb2FkX3RhcmdldF9tYXhfcGhhc2U7IGkrKykgeworICAgICAgICB0aW1lcl9kYXRhLT50YXJnZXQucGhhc2VzW2ldLnRvdGFsID0gKmRhdGErKzsKKyAgICB9Cit9CisKK3ZvaWQgb2ZmbG9hZF90aW1lcl9maWxsX2hvc3Rfc2RhdGEoT2ZmbG9hZEhvc3RUaW1lckRhdGEgKiB0aW1lcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBzZW50X2J5dGVzKQoreworICAgIGlmICh0aW1lcl9kYXRhKSB7CisgICAgICAgIHRpbWVyX2RhdGEtPnNlbnRfYnl0ZXMgKz0gc2VudF9ieXRlczsKKyAgICB9Cit9CisKK3ZvaWQgb2ZmbG9hZF90aW1lcl9maWxsX2hvc3RfcmRhdGEoT2ZmbG9hZEhvc3RUaW1lckRhdGEgKiB0aW1lcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCByZWNlaXZlZF9ieXRlcykKK3sKKyAgICBpZiAodGltZXJfZGF0YSkgeworICAgICAgICB0aW1lcl9kYXRhLT5yZWNlaXZlZF9ieXRlcyArPSByZWNlaXZlZF9ieXRlczsKKyAgICB9Cit9CisKK3ZvaWQgb2ZmbG9hZF90aW1lcl9maWxsX2hvc3RfbWljX251bShPZmZsb2FkSG9zdFRpbWVyRGF0YSAqIHRpbWVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhcmRfbnVtYmVyKQoreworICAgIGlmICh0aW1lcl9kYXRhKSB7CisgICAgICAgIHRpbWVyX2RhdGEtPmNhcmRfbnVtYmVyID0gY2FyZF9udW1iZXI7CisgICAgfQorfQorCitPZmZsb2FkSG9zdFRpbWVyRGF0YSogb2ZmbG9hZF90aW1lcl9pbml0KGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKQoreworICAgIHN0YXRpYyBib29sIGZpcnN0X3RpbWUgPSB0cnVlOworICAgIE9mZmxvYWRIb3N0VGltZXJEYXRhKiB0aW1lcl9kYXRhID0gTlVMTDsKKworICAgIHRpbWVyX2RhdGFfbXV0ZXgubG9jaygpOworICAgIHsKKyAgICAgICAgaWYgKHRpbWVyX2VuYWJsZWQgfHwKKyAgICAgICAgICAgIChvZmZsb2FkX3JlcG9ydF9sZXZlbCAmJiBvZmZsb2FkX3JlcG9ydF9lbmFibGVkKSkgeworICAgICAgICAgICAgdGltZXJfZGF0YSA9IChPZmZsb2FkSG9zdFRpbWVyRGF0YSopCisgICAgICAgICAgICAgICAgT0ZGTE9BRF9NQUxMT0Moc2l6ZW9mKE9mZmxvYWRIb3N0VGltZXJEYXRhKSwgMCk7CisgICAgICAgICAgICBtZW1zZXQodGltZXJfZGF0YSwgMCwgc2l6ZW9mKE9mZmxvYWRIb3N0VGltZXJEYXRhKSk7CisKKyAgICAgICAgICAgIHRpbWVyX2RhdGEtPm9mZmxvYWRfbnVtYmVyID0gT0ZGTE9BRF9ERUJVR19JTkNSX09GTERfTlVNKCkgLSAxOworCisgICAgICAgICAgICBpZiAodGltZXJfZGF0YV9oZWFkID09IDApIHsKKyAgICAgICAgICAgICAgICB0aW1lcl9kYXRhX2hlYWQgPSB0aW1lcl9kYXRhOworICAgICAgICAgICAgICAgIHRpbWVyX2RhdGFfdGFpbCA9IHRpbWVyX2RhdGE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aW1lcl9kYXRhX3RhaWwtPm5leHQgPSB0aW1lcl9kYXRhOworICAgICAgICAgICAgICAgIHRpbWVyX2RhdGFfdGFpbCA9IHRpbWVyX2RhdGE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRpbWVyX2RhdGEtPmZpbGUgPSBmaWxlOworICAgICAgICAgICAgdGltZXJfZGF0YS0+bGluZSA9IGxpbmU7CisgICAgICAgIH0KKyAgICB9CisgICAgdGltZXJfZGF0YV9tdXRleC51bmxvY2soKTsKKyAgICByZXR1cm4gdGltZXJfZGF0YTsKK30KKworI2VuZGlmIC8vIFRJTUlOR19TVVBQT1JUCmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3RpbWVyX3RhcmdldC5jcHAgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3RpbWVyX3RhcmdldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBhNGM5MQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfdGltZXJfdGFyZ2V0LmNwcApAQCAtMCwwICsxLDY3IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJvZmZsb2FkX3RpbWVyLmgiCisjaW5jbHVkZSAib2ZmbG9hZF90YXJnZXQuaCIKKworI2lmZGVmIF9fSU5URUxfQ09NUElMRVIKKyNpbmNsdWRlIDxpYTMyaW50cmluLmg+CisjZWxzZSAvLyBfX0lOVEVMX0NPTVBJTEVSCisjaW5jbHVkZSA8eDg2aW50cmluLmg+CisjZW5kaWYgLy8gX19JTlRFTF9DT01QSUxFUgorCisKKworaW50IHRpbWVyX2VuYWJsZWQgPSAwOworCisjaWZkZWYgVElNSU5HX1NVUFBPUlQKKworI2lmIGRlZmluZWQoTElOVVgpIHx8IGRlZmluZWQoRlJFRUJTRCkKK3N0YXRpYyBfX3RocmVhZCBPZmZsb2FkVGFyZ2V0VGltZXJEYXRhIHRpbWVyX2RhdGE7CisjZWxzZSAvLyBXSU5OVAorc3RhdGljIF9fZGVjbHNwZWModGhyZWFkKSBPZmZsb2FkVGFyZ2V0VGltZXJEYXRhIHRpbWVyX2RhdGE7CisjZW5kaWYgLy8gZGVmaW5lZChMSU5VWCkgfHwgZGVmaW5lZChGUkVFQlNEKQorCisKK3ZvaWQgb2ZmbG9hZF90aW1lcl9zdGFydCgKKyAgICBPZmZsb2FkVGFyZ2V0UGhhc2UgcF90eXBlCispCit7CisgICAgdGltZXJfZGF0YS5waGFzZXNbcF90eXBlXS5zdGFydCA9IF9yZHRzYygpOworfQorCit2b2lkIG9mZmxvYWRfdGltZXJfc3RvcCgKKyAgICBPZmZsb2FkVGFyZ2V0UGhhc2UgcF90eXBlCispCit7CisgICAgdGltZXJfZGF0YS5waGFzZXNbcF90eXBlXS50b3RhbCArPSBfcmR0c2MoKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lcl9kYXRhLnBoYXNlc1twX3R5cGVdLnN0YXJ0OworfQorCit2b2lkIG9mZmxvYWRfdGltZXJfaW5pdCgpCit7CisgICAgbWVtc2V0KCZ0aW1lcl9kYXRhLCAwLCBzaXplb2YoT2ZmbG9hZFRhcmdldFRpbWVyRGF0YSkpOworfQorCit2b2lkIG9mZmxvYWRfdGltZXJfZmlsbF90YXJnZXRfZGF0YSgKKyAgICB2b2lkICpidWYKKykKK3sKKyAgICB1aW50NjRfdCAqZGF0YSA9ICh1aW50NjRfdCopIGJ1ZjsKKworICAgIHRpbWVyX2RhdGEuZnJlcXVlbmN5ID0gbWljX2ZyZXF1ZW5jeTsKKyAgICBtZW1jcHkoZGF0YSsrLCAmKHRpbWVyX2RhdGEuZnJlcXVlbmN5KSwgc2l6ZW9mKHVpbnQ2NF90KSk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNfb2ZmbG9hZF90YXJnZXRfbWF4X3BoYXNlOyBpKyspIHsKKyAgICAgICAgbWVtY3B5KGRhdGErKywgJih0aW1lcl9kYXRhLnBoYXNlc1tpXS50b3RhbCksIHNpemVvZih1aW50NjRfdCkpOworICAgIH0KK30KKworI2VuZGlmIC8vIFRJTUlOR19TVVBQT1JUCmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3RyYWNlLmNwcCBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfdHJhY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMDYyMDQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3RyYWNlLmNwcApAQCAtMCwwICsxLDMwOSBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAib2ZmbG9hZF90cmFjZS5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlICJsaWJvZmZsb2FkX2Vycm9yX2NvZGVzLmgiCisKK2V4dGVybiBjb25zdCBjaGFyICpwcmVmaXg7CisKKyNpZiAhSE9TVF9MSUJSQVJZCitleHRlcm4gaW50IG1pY19pbmRleDsKKyNlbmRpZgorCisvLyBUaGUgZGVidWcgcm91dGluZXMKKworc3RhdGljIGNvbnN0IGNoYXIgKiBvZmZsb2FkX3N0YWdlKHN0ZDo6c3RyaW5nc3RyZWFtICZzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2ZmbG9hZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwcmludF90YWcpCit7CisgICAgc3MgPDwgIlsiIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfb2ZmbG9hZCkgPDwgIl0iOworI2lmIEhPU1RfTElCUkFSWQorICAgIHNzIDw8ICIgWyIgPDwgcHJlZml4IDw8ICJdIjsKKyAgICBpZiAocHJpbnRfdGFnKSB7CisgICAgICAgIHNzIDw8ICIgIFsiIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfdGFnKTsKKyAgICAgICAgc3MgPDwgIiAiIDw8IG9mZmxvYWRfbnVtYmVyIDw8ICJdIjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHNzIDw8ICIgICAgICAgICAiOworICAgIH0KKyAgICBzcyA8PCAiIFsiIDw8IHRhZyA8PCAiXSI7CisgICAgc3MgPDwgIiAgICAgICAgICAgIiA8PCB0ZXh0OworI2Vsc2UKKyAgICBzcyA8PCAiIFsiIDw8IHByZWZpeCA8PCAiICIgPDwgbWljX2luZGV4IDw8ICJdIjsKKyAgICBpZiAocHJpbnRfdGFnKSB7CisgICAgICAgIHNzIDw8ICIgWyIgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF90YWcpOworICAgICAgICBzcyA8PCAiICIgPDwgb2ZmbG9hZF9udW1iZXIgPDwgIl0iOworICAgIH0KKyAgICBzcyA8PCAiIFsiIDw8IHRhZyA8PCAiXSI7CisgICAgc3MgPDwgIiAgICAgICAgICAgIiA8PCB0ZXh0OworI2VuZGlmCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogb2ZmbG9hZF9zaWduYWwoc3RkOjpzdHJpbmdzdHJlYW0gJnNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZsb2FkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdGV4dCkKK3sKKyAgICBzcyA8PCAiWyIgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9vZmZsb2FkKSA8PCAiXSI7CisgICAgc3MgPDwgIiBbIiA8PCBwcmVmaXggPDwgIl0iOworICAgIHNzIDw8ICIgIFsiIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfdGFnKTsKKyAgICBzcyA8PCAiICIgPDwgb2ZmbG9hZF9udW1iZXIgPDwgIl0iOworICAgIHNzIDw8ICIgWyIgPDwgdGFnIDw8ICJdIjsKKyAgICBzcyA8PCAiICAgICAgICAgICIgPDwgdGV4dDsKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBvZmZsb2FkX3N0YWdlX3ByaW50KGludCBzdGFnZSwgaW50IG9mZmxvYWRfbnVtYmVyLCAuLi4pCit7CisgICAgc3RkOjpzdHJpbmcgYnVmOworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgIGNoYXIgY29uc3QgKnN0cjE7CisgICAgY2hhciBjb25zdCAqc3RyMjsKKyAgICB2YV9saXN0IHZhX2FyZ3M7CisgICAgdmFfc3RhcnQodmFfYXJncywgb2ZmbG9hZF9udW1iZXIpOworICAgIHZhX2FyZyh2YV9hcmdzLCBjaGFyKik7CisKKyAgICBzd2l0Y2ggKHN0YWdlKSB7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX3N0YXJ0OgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhcnQpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIHRydWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2luaXQ6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9pbml0KTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCBmYWxzZSk7CisgICAgICAgICAgICBzcyA8PCAiICIgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9sb2dpY2FsX2NhcmQpOworICAgICAgICAgICAgc3MgPDwgIiAiIDw8IHZhX2FyZyh2YV9hcmdzLCBpbnQpOworICAgICAgICAgICAgc3MgPDwgIiA9ICIgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9waHlzaWNhbF9jYXJkKTsKKyAgICAgICAgICAgIHNzIDw8ICIgIiA8PCB2YV9hcmcodmFfYXJncywgaW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9yZWdpc3RlcjoKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3JlZ2lzdGVyKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCB0cnVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9pbml0X2Z1bmM6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9pbml0X2Z1bmMpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIHRydWUpOworICAgICAgICAgICAgc3MgPDwgIjogIiA8PCB2YV9hcmcodmFfYXJncywgY2hhciopOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2NyZWF0ZV9idWZfaG9zdDoKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X2NyZWF0ZV9idWZfaG9zdCk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgdHJ1ZSk7CisgICAgICAgICAgICBzcyA8PCAiOiBiYXNlPTB4IiA8PCBzdGQ6OmhleCA8PCB2YV9hcmcodmFfYXJncywgdWludDY0X3QpOworICAgICAgICAgICAgc3MgPDwgIiBsZW5ndGg9IiA8PCBzdGQ6OmRlYyA8PCB2YV9hcmcodmFfYXJncywgdWludDY0X3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2NyZWF0ZV9idWZfbWljOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfY3JlYXRlX2J1Zl9taWMpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIHRydWUpOworICAgICAgICAgICAgc3MgPDwgIjogc2l6ZT0iIDw8IHZhX2FyZyh2YV9hcmdzLCB1aW50NjRfdCk7CisgICAgICAgICAgICBzcyA8PCAiIG9mZnNldD0iIDw8IHZhX2FyZyh2YV9hcmdzLCBpbnQpOworICAgICAgICAgICAgaWYgKHZhX2FyZyh2YV9hcmdzLGludCkpCisgICAgICAgICAgICAgICBzcyA8PCAiICgyTSBwYWdlKSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfc2VuZF9wb2ludGVyX2RhdGE6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zZW5kX3BvaW50ZXJfZGF0YSk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgdHJ1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfc2VudF9wb2ludGVyX2RhdGE6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zZW50X3BvaW50ZXJfZGF0YSk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgdHJ1ZSk7CisgICAgICAgICAgICBzcyA8PCAiICIgPDwgdmFfYXJnKHZhX2FyZ3MsIHVpbnQ2NF90KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9nYXRoZXJfY29weWluX2RhdGE6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9nYXRoZXJfY29weWluX2RhdGEpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIHRydWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2NvcHlpbl9kYXRhOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfY29weWluX2RhdGEpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIHRydWUpOworICAgICAgICAgICAgc3MgPDwgIiAiIDw8IHZhX2FyZyh2YV9hcmdzLCB1aW50NjRfdCkgPDwgIiAiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2NvbXB1dGU6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9jb21wdXRlKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCB0cnVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9yZWNlaXZlX3BvaW50ZXJfZGF0YToKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3JlY2VpdmVfcG9pbnRlcl9kYXRhKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCB0cnVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9yZWNlaXZlZF9wb2ludGVyX2RhdGE6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9yZWNlaXZlZF9wb2ludGVyX2RhdGEpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIHRydWUpOworICAgICAgICAgICAgc3MgPDwgIiAiIDw8IHZhX2FyZyh2YV9hcmdzLCB1aW50NjRfdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfc3RhcnRfdGFyZ2V0X2Z1bmM6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGFydF90YXJnZXRfZnVuYyk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgdHJ1ZSk7CisgICAgICAgICAgICBzcyA8PCAiOiAiIDw8IHZhX2FyZyh2YV9hcmdzLCBjaGFyKik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfdmFyOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfdmFyKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCAiICAiLCB0cnVlKTsKKyAgICAgICAgICAgIHZhX2FyZyh2YV9hcmdzLCBpbnQpOworICAgICAgICAgICAgc3MgPDwgdmFfYXJnKHZhX2FyZ3MsIGNoYXIqKTsKKyAgICAgICAgICAgIHNzIDw8ICIgIiA8PCAiICIgPDwgdmFfYXJnKHZhX2FyZ3MsIGNoYXIqKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9zY2F0dGVyX2NvcHlpbl9kYXRhOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc2NhdHRlcl9jb3B5aW5fZGF0YSk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgdHJ1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfZ2F0aGVyX2NvcHlvdXRfZGF0YToKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X2dhdGhlcl9jb3B5b3V0X2RhdGEpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIHRydWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX3NjYXR0ZXJfY29weW91dF9kYXRhOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc2NhdHRlcl9jb3B5b3V0X2RhdGEpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIHRydWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2NvcHlvdXRfZGF0YToKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X2NvcHlvdXRfZGF0YSk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgdHJ1ZSk7CisgICAgICAgICAgICBzcyA8PCAiICAgIiA8PCB2YV9hcmcodmFfYXJncywgdWludDY0X3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX3NpZ25hbDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50NjRfdCAgKnNpZ25hbDsKKyAgICAgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZV9zaWduYWwpOworICAgICAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3NpZ25hbCk7CisgICAgICAgICAgICAgICAgb2ZmbG9hZF9zaWduYWwoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyKTsKKwkgICAgICAgIHNpZ25hbCA9IHZhX2FyZyh2YV9hcmdzLCB1aW50NjRfdCopOworCSAgICAgICAgaWYgKHNpZ25hbCkKKyAgICAgICAgICAgICAgICAgICBzcyA8PCAiIDB4IiA8PCBzdGQ6OmhleCA8PCAqc2lnbmFsOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICBzcyA8PCAiIG5vbmUiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX3dhaXQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGNvdW50OworICAgICAgICAgICAgICAgIHVpbnQ2NF90ICAqKnNpZ25hbDsKKyAgICAgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZV9zaWduYWwpOworICAgICAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3dhaXQpOworICAgICAgICAgICAgICAgIG9mZmxvYWRfc2lnbmFsKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMik7CisgICAgICAgICAgICAgICAgY291bnQgPSB2YV9hcmcodmFfYXJncywgaW50KTsKKyAgICAgICAgICAgICAgICBzaWduYWwgPSB2YV9hcmcodmFfYXJncywgdWludDY0X3QqKik7CisgICAgICAgICAgICAgICAgaWYgKGNvdW50KSB7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjb3VudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3MgPDwgIiAiIDw8IHN0ZDo6aGV4IDw8IHNpZ25hbFtjb3VudC0xXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50LS07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBzcyA8PCAiIG5vbmUiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX3VucmVnaXN0ZXI6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF91bnJlZ2lzdGVyKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCBmYWxzZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfZGVzdHJveToKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X2Rlc3Ryb3kpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIHRydWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX215b2luaXQ6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9teW9pbml0KTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCBmYWxzZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfbXlvcmVnaXN0ZXI6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9teW9yZWdpc3Rlcik7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgZmFsc2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX215b2Zpbmk6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9teW9maW5pKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCBmYWxzZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfbWljX215b19zaGFyZWQ6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9taWNfbXlvX3NoYXJlZCk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgZmFsc2UpOworICAgICAgICAgICAgc3MgPDwgIiAiIDw8IHZhX2FyZyh2YV9hcmdzLCBjaGFyKik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfbWljX215b19mcHRyOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfbWljX215b19mcHRyKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCBmYWxzZSk7CisgICAgICAgICAgICBzcyA8PCAiICIgPDwgdmFfYXJnKHZhX2FyZ3MsIGNoYXIqKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9teW9zaGFyZWRtYWxsb2M6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9teW9zaGFyZWRtYWxsb2MpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIGZhbHNlKTsKKyAgICAgICAgICAgIHZhX2FyZyh2YV9hcmdzLCBjaGFyKik7CisgICAgICAgICAgICBzcyA8PCAiICIgPDwgdmFfYXJnKHZhX2FyZ3MsIHNpemVfdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfbXlvc2hhcmVkZnJlZToKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X215b3NoYXJlZGZyZWUpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIGZhbHNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9teW9zaGFyZWRhbGlnbmVkbWFsbG9jOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfbXlvc2hhcmVkYWxpZ25lZG1hbGxvYyk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgZmFsc2UpOworICAgICAgICAgICAgdmFfYXJnKHZhX2FyZ3MsIGNoYXIqKTsKKyAgICAgICAgICAgIHNzIDw8ICIgIiA8PCB2YV9hcmcodmFfYXJncywgc2l6ZV90KTsKKyAgICAgICAgICAgIHNzIDw8ICIgIiA8PCB2YV9hcmcodmFfYXJncywgc2l6ZV90KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9teW9zaGFyZWRhbGlnbmVkZnJlZToKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X215b3NoYXJlZGFsaWduZWRmcmVlKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCBmYWxzZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfbXlvYWNxdWlyZToKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X215b2FjcXVpcmUpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIGZhbHNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9teW9yZWxlYXNlOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfbXlvcmVsZWFzZSk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgZmFsc2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcmVwb3J0X3Vua25vd25fdHJhY2Vfbm9kZSk7CisgICAgICAgICAgICBhYm9ydCgpOworICAgIH0KKyAgICBzcyA8PCAiXG4iOworICAgIGJ1ZiA9IHNzLnN0cigpOworICAgIGZwcmludGYoc3Rkb3V0LCBidWYuZGF0YSgpKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKKworICAgIHZhX2VuZCh2YV9hcmdzKTsKKyAgICByZXR1cm47Cit9CmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3RyYWNlLmggYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3RyYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVjMjhhNAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfdHJhY2UuaApAQCAtMCwwICsxLDUyIEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKy8vIFRoZSBwYXJ0cyBvZiB0aGUgb2ZmbG9hZCBsaWJyYXJ5IGNvbW1vbiB0byBob3N0IGFuZCB0YXJnZXQKKwordm9pZCBvZmZsb2FkX3N0YWdlX3ByaW50KGludCBzdGFnZSwgaW50IG9mZmxvYWRfbnVtYmVyLCAuLi4pOworCitlbnVtIE9mZmxvYWRUcmFjZVN0YWdlIHsKKyAgICAvLyBUb3RhbCB0aW1lIHNwZW50IG9uIHRoZSB0YXJnZXQKKyAgICBjX29mZmxvYWRfc3RhcnQgPSAwLAorICAgIGNfb2ZmbG9hZF9pbml0LAorICAgIGNfb2ZmbG9hZF9yZWdpc3RlciwKKyAgICBjX29mZmxvYWRfaW5pdF9mdW5jLAorICAgIGNfb2ZmbG9hZF9jcmVhdGVfYnVmX2hvc3QsCisgICAgY19vZmZsb2FkX2NyZWF0ZV9idWZfbWljLAorICAgIGNfb2ZmbG9hZF9zZW5kX3BvaW50ZXJfZGF0YSwKKyAgICBjX29mZmxvYWRfc2VudF9wb2ludGVyX2RhdGEsCisgICAgY19vZmZsb2FkX2dhdGhlcl9jb3B5aW5fZGF0YSwKKyAgICBjX29mZmxvYWRfY29weWluX2RhdGEsCisgICAgY19vZmZsb2FkX2NvbXB1dGUsCisgICAgY19vZmZsb2FkX3JlY2VpdmVfcG9pbnRlcl9kYXRhLAorICAgIGNfb2ZmbG9hZF9yZWNlaXZlZF9wb2ludGVyX2RhdGEsCisgICAgY19vZmZsb2FkX3N0YXJ0X3RhcmdldF9mdW5jLAorICAgIGNfb2ZmbG9hZF92YXIsCisgICAgY19vZmZsb2FkX3NjYXR0ZXJfY29weWluX2RhdGEsCisgICAgY19vZmZsb2FkX2dhdGhlcl9jb3B5b3V0X2RhdGEsCisgICAgY19vZmZsb2FkX3NjYXR0ZXJfY29weW91dF9kYXRhLAorICAgIGNfb2ZmbG9hZF9jb3B5b3V0X2RhdGEsCisgICAgY19vZmZsb2FkX3NpZ25hbCwKKyAgICBjX29mZmxvYWRfd2FpdCwKKyAgICBjX29mZmxvYWRfdW5yZWdpc3RlciwKKyAgICBjX29mZmxvYWRfZGVzdHJveSwKKyAgICBjX29mZmxvYWRfZmluaXNoLAorICAgIGNfb2ZmbG9hZF9teW9pbml0LAorICAgIGNfb2ZmbG9hZF9teW9yZWdpc3RlciwKKyAgICBjX29mZmxvYWRfbWljX215b19zaGFyZWQsCisgICAgY19vZmZsb2FkX21pY19teW9fZnB0ciwKKyAgICBjX29mZmxvYWRfbXlvc2hhcmVkbWFsbG9jLAorICAgIGNfb2ZmbG9hZF9teW9zaGFyZWRmcmVlLAorICAgIGNfb2ZmbG9hZF9teW9zaGFyZWRhbGlnbmVkbWFsbG9jLAorICAgIGNfb2ZmbG9hZF9teW9zaGFyZWRhbGlnbmVkZnJlZSwKKyAgICBjX29mZmxvYWRfbXlvYWNxdWlyZSwKKyAgICBjX29mZmxvYWRfbXlvcmVsZWFzZSwKKyAgICBjX29mZmxvYWRfbXlvZmluaQorfTsKZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfdXRpbC5jcHAgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3V0aWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NDYyYzgKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3V0aWwuY3BwCkBAIC0wLDAgKzEsMjA2IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJvZmZsb2FkX3V0aWwuaCIKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgImxpYm9mZmxvYWRfZXJyb3JfY29kZXMuaCIKKworI2lmZGVmIFRBUkdFVF9XSU5OVAordm9pZCAqdGhyZWFkX2dldHNwZWNpZmljKHB0aHJlYWRfa2V5X3Qga2V5KQoreworICAgIGlmIChrZXkgPT0gMCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiBUbHNHZXRWYWx1ZShrZXkpOworICAgIH0KK30KKworaW50IHRocmVhZF9zZXRzcGVjaWZpYyhwdGhyZWFkX2tleV90IGtleSwgY29uc3Qgdm9pZCAqdmFsdWUpCit7CisgICAgcmV0dXJuIChUbHNTZXRWYWx1ZShrZXksIChMUFZPSUQpdmFsdWUpKSA/IDAgOiBHZXRMYXN0RXJyb3IoKTsKK30KKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKworYm9vbCBfX29mZmxvYWRfcGFyc2Vfc2l6ZV9zdHJpbmcoY29uc3QgY2hhciAqc3RyLCB1aW50NjRfdCAmbmV3X3NpemUpCit7CisgICAgdWludDY0X3QgdmFsOworICAgIGNoYXIgKnN1ZmZpeDsKKworICAgIGVycm5vID0gMDsKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyAgICB2YWwgPSBzdHJ0b3VsKHN0ciwgJnN1ZmZpeCwgMTApOworI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCisgICAgdmFsID0gc3RydG91bGwoc3RyLCAmc3VmZml4LCAxMCk7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisgICAgaWYgKGVycm5vICE9IDAgfHwgc3VmZml4ID09IHN0cikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHN1ZmZpeFswXSA9PSAnXDAnKSB7CisgICAgICAgIC8vIGRlZmF1bHQgaXMgS2lsb2J5dGVzCisgICAgICAgIG5ld19zaXplID0gdmFsICogMTAyNDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGVsc2UgaWYgKHN1ZmZpeFsxXSA9PSAnXDAnKSB7CisgICAgICAgIC8vIE9wdGlvbmFsIHN1ZmZpeGVzOiBCIChieXRlcyksIEsgKEtpbG9ieXRlcyksIE0gKE1lZ2FieXRlcyksCisgICAgICAgIC8vIEcgKEdpZ2FieXRlcyksIG9yIFQgKFRlcmFieXRlcykgc3BlY2lmeSB0aGUgdW5pdHMuCisgICAgICAgIHN3aXRjaCAoc3VmZml4WzBdKSB7CisgICAgICAgICAgICBjYXNlICdiJzoKKyAgICAgICAgICAgIGNhc2UgJ0InOgorICAgICAgICAgICAgICAgIG5ld19zaXplID0gdmFsOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICdrJzoKKyAgICAgICAgICAgIGNhc2UgJ0snOgorICAgICAgICAgICAgICAgIG5ld19zaXplID0gdmFsICogMTAyNDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAnbSc6CisgICAgICAgICAgICBjYXNlICdNJzoKKyAgICAgICAgICAgICAgICBuZXdfc2l6ZSA9IHZhbCAqIDEwMjQgKiAxMDI0OworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICdnJzoKKyAgICAgICAgICAgIGNhc2UgJ0cnOgorICAgICAgICAgICAgICAgIG5ld19zaXplID0gdmFsICogMTAyNCAqIDEwMjQgKiAxMDI0OworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICd0JzoKKyAgICAgICAgICAgIGNhc2UgJ1QnOgorICAgICAgICAgICAgICAgIG5ld19zaXplID0gdmFsICogMTAyNCAqIDEwMjQgKiAxMDI0ICogMTAyNDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIF9fb2ZmbG9hZF9wYXJzZV9pbnRfc3RyaW5nKGNvbnN0IGNoYXIgKnN0ciwgaW50NjRfdCAmdmFsdWUpCit7CisgICAgaW50NjRfdCB2YWw7CisgICAgY2hhciAqc3VmZml4OworCisgICAgZXJybm8gPSAwOworI2lmZGVmIFRBUkdFVF9XSU5OVAorICAgIHZhbCA9IHN0cnRvbChzdHIsICZzdWZmaXgsIDApOworI2Vsc2UKKyAgICB2YWwgPSBzdHJ0b2xsKHN0ciwgJnN1ZmZpeCwgMCk7CisjZW5kaWYKKyAgICBpZiAoZXJybm8gPT0gMCAmJiBzdWZmaXggIT0gc3RyICYmICpzdWZmaXggPT0gJ1wwJykgeworICAgICAgICB2YWx1ZSA9IHZhbDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworI2lmZGVmIFRBUkdFVF9XSU5OVAorZXh0ZXJuIHZvaWQqIERMX29wZW4oY29uc3QgY2hhciAqcGF0aCkKK3sKKyAgICB2b2lkICpoYW5kbGU7CisgICAgaW50IGVycm9yX21vZGU7CisKKyAgICAvKgorICAgICAqIGRvIG5vdCBkaXNwbGF5IG1lc3NhZ2UgYm94IHdpdGggZXJyb3IgaWYgaXQgdGhlIGNhbGwgYmVsb3cgZmFpbHMgdG8KKyAgICAgKiBsb2FkIGR5bmFtaWMgbGlicmFyeS4KKyAgICAgKi8KKyAgICBlcnJvcl9tb2RlID0gU2V0RXJyb3JNb2RlKFNFTV9GQUlMQ1JJVElDQUxFUlJPUlMgfCBTRU1fTk9PUEVORklMRUVSUk9SQk9YKTsKKworICAgIC8qIGxvYWQgZHluYW1pYyBsaWJyYXJ5ICovCisgICAgaGFuZGxlID0gKHZvaWQqKSBMb2FkTGlicmFyeShwYXRoKTsKKworICAgIC8qIHJlc3RvcmUgZXJyb3IgbW9kZSAqLworICAgIFNldEVycm9yTW9kZShlcnJvcl9tb2RlKTsKKworICAgIHJldHVybiBoYW5kbGU7Cit9CisKK2V4dGVybiBpbnQgRExfYWRkcihjb25zdCB2b2lkICphZGRyLCBEbF9pbmZvICpkbF9pbmZvKQoreworICAgIE1FTU9SWV9CQVNJQ19JTkZPUk1BVElPTiBtZW1faW5mbzsKKyAgICBjaGFyIG1vZF9uYW1lW01BWF9QQVRIXTsKKyAgICBITU9EVUxFIG1vZF9oYW5kbGU7CisKKyAgICAvKiBGaWxsIE1FTU9SWV9CQVNJQ19JTkZPUk1BVElPTiBzdHJ1Y3QgKi8KKyAgICBpZiAoIVZpcnR1YWxRdWVyeShhZGRyLCAmbWVtX2luZm8sIHNpemVvZihtZW1faW5mbykpKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBtb2RfaGFuZGxlID0gKEhNT0RVTEUpbWVtX2luZm8uQWxsb2NhdGlvbkJhc2U7CisKKyAgICAvKiBBTlNJIGZpbGUgbmFtZSBmb3IgbW9kdWxlICovCisgICAgaWYgKCFHZXRNb2R1bGVGaWxlTmFtZUEobW9kX2hhbmRsZSwgKGNoYXIqKSBtb2RfbmFtZSwgc2l6ZW9mKG1vZF9uYW1lKSkpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHN0cmNweShkbF9pbmZvLT5kbGlfZm5hbWUsIG1vZF9uYW1lKTsKKyAgICBkbF9pbmZvLT5kbGlfZmJhc2UgPSBtZW1faW5mby5CYXNlQWRkcmVzczsKKyAgICBkbF9pbmZvLT5kbGlfc2FkZHIgPSBhZGRyOworICAgIHN0cmNweShkbF9pbmZvLT5kbGlfc25hbWUsIG1vZF9uYW1lKTsKKyAgICByZXR1cm4gMTsKK30KKworLy8gUnVuIG9uY2UKK3N0YXRpYyBCT09MIENBTExCQUNLIF9fb2ZmbG9hZF9ydW5fb25jZV93cmFwcGVyKAorICAgIFBJTklUX09OQ0UgaW5pdE9uY2UsCisgICAgUFZPSUQgcGFyYW1ldGVyLAorICAgIFBWT0lEICpjb250ZXh0CispCit7CisgICAgdm9pZCAoKmluaXRfcm91dGluZSkodm9pZCkgPSAodm9pZCgqKSh2b2lkKSkgcGFyYW1ldGVyOworICAgIGluaXRfcm91dGluZSgpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIF9fb2ZmbG9hZF9ydW5fb25jZShPZmZsb2FkT25jZUNvbnRyb2wgKmN0cmwsIHZvaWQgKCpmdW5jKSh2b2lkKSkKK3sKKyAgICBJbml0T25jZUV4ZWN1dGVPbmNlKGN0cmwsIF9fb2ZmbG9hZF9ydW5fb25jZV93cmFwcGVyLCAodm9pZCopIGZ1bmMsIDApOworfQorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCisvKiBBUkdTVVNFRCAqLyAvLyB2ZXJzaW9uIGlzIG5vdCB1c2VkIG9uIHdpbmRvd3MKK3ZvaWQqIERMX3N5bSh2b2lkICpoYW5kbGUsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZlcnNpb24pCit7CisjaWZkZWYgVEFSR0VUX1dJTk5UCisgICAgcmV0dXJuIEdldFByb2NBZGRyZXNzKChITU9EVUxFKSBoYW5kbGUsIG5hbWUpOworI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCisgICAgaWYgKHZlcnNpb24gPT0gMCkgeworICAgICAgICByZXR1cm4gZGxzeW0oaGFuZGxlLCBuYW1lKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiBkbHZzeW0oaGFuZGxlLCBuYW1lLCB2ZXJzaW9uKTsKKyAgICB9CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCit9CisKK2ludDY0X3QgZ2V0X2VsX3ZhbHVlKAorICAgICAgICAgICAgICAgICAgICAgY2hhciAqYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBzaXplKQoreworICAgIGludDY0X3QgdmFsID0gMDsKKyAgICBzd2l0Y2ggKHNpemUpIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgdmFsID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4oKigoY2hhciAqKShiYXNlICsgb2Zmc2V0KSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHZhbCA9IHN0YXRpY19jYXN0PGludDY0X3Q+KCooKHNob3J0ICopKGJhc2UgKyBvZmZzZXQpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgdmFsID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4oKigoaW50ICopKGJhc2UgKyBvZmZzZXQpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHZhbCA9ICooKGludDY0X3QgKikoYmFzZSArIG9mZnNldCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiB2YWw7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3V0aWwuaCBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MGQ3N2QKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3V0aWwuaApAQCAtMCwwICsxLDE1MyBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIE9GRkxPQURfVVRJTF9IX0lOQ0xVREVECisjZGVmaW5lIE9GRkxPQURfVVRJTF9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaWZkZWYgVEFSR0VUX1dJTk5UCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPHByb2Nlc3MuaD4KKyNlbHNlIC8vIFRBUkdFVF9XSU5OVAorI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCisjaWZkZWYgVEFSR0VUX1dJTk5UCit0eXBlZGVmIHVuc2lnbmVkIHB0aHJlYWRfa2V5X3Q7Cit0eXBlZGVmIGludCBwaWRfdDsKKworI2RlZmluZSBfX2Z1bmNfXyBfX0ZVTkNUSU9OX18KKyNkZWZpbmUgc3RydG9rX3IocyxkLHApIHN0cnRva19zKHMsZCxwKQorI2RlZmluZSBzdHJjYXNlY21wKGEsYikgc3RyaWNtcChhLGIpCisKKyNkZWZpbmUgdGhyZWFkX2tleV9jcmVhdGUoa2V5LCBkZXN0cnVjdG9yKSBcCisgICAgKCgoKmtleSA9IFRsc0FsbG9jKCkpID4gMCkgPyAwIDogR2V0TGFzdEVycm9yKCkpCisjZGVmaW5lIHRocmVhZF9rZXlfZGVsZXRlKGtleSkgVGxzRnJlZShrZXkpCisKKyNpZm5kZWYgU19JU1JFRworI2RlZmluZSBTX0lTUkVHKG1vZGUpICAoKChtb2RlKSAmIFNfSUZNVCkgPT0gU19JRlJFRykKKyNlbmRpZgorCit2b2lkKiAgIHRocmVhZF9nZXRzcGVjaWZpYyhwdGhyZWFkX2tleV90IGtleSk7CitpbnQgICAgIHRocmVhZF9zZXRzcGVjaWZpYyhwdGhyZWFkX2tleV90IGtleSwgY29uc3Qgdm9pZCAqdmFsdWUpOworI2Vsc2UKKyNkZWZpbmUgdGhyZWFkX2tleV9jcmVhdGUoa2V5LCBkZXN0cnVjdG9yKSBcCisgICAgICAgICAgICBwdGhyZWFkX2tleV9jcmVhdGUoKGtleSksIChkZXN0cnVjdG9yKSkKKyNkZWZpbmUgdGhyZWFkX2tleV9kZWxldGUoa2V5KSAgcHRocmVhZF9rZXlfZGVsZXRlKGtleSkKKyNkZWZpbmUgdGhyZWFkX2dldHNwZWNpZmljKGtleSkgcHRocmVhZF9nZXRzcGVjaWZpYyhrZXkpCisjZGVmaW5lIHRocmVhZF9zZXRzcGVjaWZpYyhrZXksIHZhbHVlKSBwdGhyZWFkX3NldHNwZWNpZmljKGtleSwgdmFsdWUpCisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKy8vIE11dGV4IGltcGxlbWVudGF0aW9uCitzdHJ1Y3QgbXV0ZXhfdCB7CisgICAgbXV0ZXhfdCgpIHsKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyAgICAgICAgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbigmbV9sb2NrKTsKKyNlbHNlIC8vIFRBUkdFVF9XSU5OVAorICAgICAgICBwdGhyZWFkX211dGV4X2luaXQoJm1fbG9jaywgMCk7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisgICAgfQorCisgICAgfm11dGV4X3QoKSB7CisjaWZkZWYgVEFSR0VUX1dJTk5UCisgICAgICAgIERlbGV0ZUNyaXRpY2FsU2VjdGlvbigmbV9sb2NrKTsKKyNlbHNlIC8vIFRBUkdFVF9XSU5OVAorICAgICAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm1fbG9jayk7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisgICAgfQorCisgICAgdm9pZCBsb2NrKCkgeworI2lmZGVmIFRBUkdFVF9XSU5OVAorICAgICAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmbV9sb2NrKTsKKyNlbHNlIC8vIFRBUkdFVF9XSU5OVAorICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm1fbG9jayk7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisgICAgfQorCisgICAgdm9pZCB1bmxvY2soKSB7CisjaWZkZWYgVEFSR0VUX1dJTk5UCisgICAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZtX2xvY2spOworI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtX2xvY2spOworI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorICAgIH0KKworcHJpdmF0ZToKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyAgICBDUklUSUNBTF9TRUNUSU9OICAgIG1fbG9jazsKKyNlbHNlCisgICAgcHRocmVhZF9tdXRleF90ICAgICBtX2xvY2s7CisjZW5kaWYKK307CisKK3N0cnVjdCBtdXRleF9sb2NrZXJfdCB7CisgICAgbXV0ZXhfbG9ja2VyX3QobXV0ZXhfdCAmbXV0ZXgpIDogbV9tdXRleChtdXRleCkgeworICAgICAgICBtX211dGV4LmxvY2soKTsKKyAgICB9CisKKyAgICB+bXV0ZXhfbG9ja2VyX3QoKSB7CisgICAgICAgIG1fbXV0ZXgudW5sb2NrKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIG11dGV4X3QgJm1fbXV0ZXg7Cit9OworCisvLyBEeW5hbWljIGxvYWRlciBpbnRlcmZhY2UKKyNpZmRlZiBUQVJHRVRfV0lOTlQKK3N0cnVjdCBEbF9pbmZvCit7CisgICAgY2hhciAgICAgICAgZGxpX2ZuYW1lW01BWF9QQVRIXTsKKyAgICB2b2lkICAgICAgICpkbGlfZmJhc2U7CisgICAgY2hhciAgICAgICAgZGxpX3NuYW1lW01BWF9QQVRIXTsKKyAgICBjb25zdCB2b2lkICpkbGlfc2FkZHI7Cit9OworCit2b2lkKiAgIERMX29wZW4oY29uc3QgY2hhciAqcGF0aCk7CisjZGVmaW5lIERMX2Nsb3NlKGhhbmRsZSkgICAgICAgIEZyZWVMaWJyYXJ5KChITU9EVUxFKSAoaGFuZGxlKSkKK2ludCAgICAgRExfYWRkcihjb25zdCB2b2lkICphZGRyLCBEbF9pbmZvICppbmZvKTsKKyNlbHNlCisjZGVmaW5lIERMX29wZW4ocGF0aCkgICAgICAgICAgIGRsb3BlbigocGF0aCksIFJUTERfTk9XKQorI2RlZmluZSBETF9jbG9zZShoYW5kbGUpICAgICAgICBkbGNsb3NlKGhhbmRsZSkKKyNkZWZpbmUgRExfYWRkcihhZGRyLCBpbmZvKSAgICAgZGxhZGRyKChhZGRyKSwgKGluZm8pKQorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCitleHRlcm4gdm9pZCogRExfc3ltKHZvaWQgKmhhbmRsZSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmVyc2lvbik7CisKKy8vIE9uZS10aW1lIGluaXRpYWxpemF0aW9uIEFQSQorI2lmZGVmIFRBUkdFVF9XSU5OVAordHlwZWRlZiBJTklUX09OQ0UgICAgICAgICAgICAgICAgICAgT2ZmbG9hZE9uY2VDb250cm9sOworI2RlZmluZSBPRkZMT0FEX09OQ0VfQ09OVFJPTF9JTklUICAgSU5JVF9PTkNFX1NUQVRJQ19JTklUCisKK2V4dGVybiB2b2lkIF9fb2ZmbG9hZF9ydW5fb25jZShPZmZsb2FkT25jZUNvbnRyb2wgKmN0cmwsIHZvaWQgKCpmdW5jKSh2b2lkKSk7CisjZWxzZQordHlwZWRlZiBwdGhyZWFkX29uY2VfdCAgICAgICAgICAgICAgT2ZmbG9hZE9uY2VDb250cm9sOworI2RlZmluZSBPRkZMT0FEX09OQ0VfQ09OVFJPTF9JTklUICAgUFRIUkVBRF9PTkNFX0lOSVQKKworI2RlZmluZSBfX29mZmxvYWRfcnVuX29uY2UoY3RybCwgZnVuYykgcHRocmVhZF9vbmNlKGN0cmwsIGZ1bmMpCisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKy8vIFBhcnNlcyBzaXplIHNwZWNpZmljYXRpb24gc3RyaW5nLgorZXh0ZXJuIGJvb2wgX19vZmZsb2FkX3BhcnNlX3NpemVfc3RyaW5nKGNvbnN0IGNoYXIgKnN0ciwgdWludDY0X3QgJm5ld19zaXplKTsKKworLy8gUGFyc2VzIHN0cmluZyB3aXRoIGludGVnZXIgdmFsdWUKK2V4dGVybiBib29sIF9fb2ZmbG9hZF9wYXJzZV9pbnRfc3RyaW5nKGNvbnN0IGNoYXIgKnN0ciwgaW50NjRfdCAmdmFsdWUpOworCisvLyBnZXQgdmFsdWUgYnkgaXRzIGJhc2UsIG9mZnNldCBhbmQgc2l6ZQoraW50NjRfdCBnZXRfZWxfdmFsdWUoCisgICAgY2hhciAgICpiYXNlLAorICAgIGludDY0X3Qgb2Zmc2V0LAorICAgIGludDY0X3Qgc2l6ZQorKTsKKyNlbmRpZiAvLyBPRkZMT0FEX1VUSUxfSF9JTkNMVURFRApkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvb2ZsZGJlZ2luLmNwcCBiL2ZpbmFsL29mZmxvYWQvc3JjL29mbGRiZWdpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ1Zjk4MgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL29mbGRiZWdpbi5jcHAKQEAgLTAsMCArMSwxNjQgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmIEhPU1RfTElCUkFSWQorI2luY2x1ZGUgIm9mZmxvYWRfaG9zdC5oIgorI2luY2x1ZGUgIm9mZmxvYWRfbXlvX2hvc3QuaCIKKyNlbHNlCisjaW5jbHVkZSAiY29tcGlsZXJfaWZfdGFyZ2V0LmgiCisjaW5jbHVkZSAib2ZmbG9hZF90YXJnZXQuaCIKKyNpbmNsdWRlICJvZmZsb2FkX215b190YXJnZXQuaCIKKyNlbmRpZgorCisjaWZkZWYgVEFSR0VUX1dJTk5UCisjZGVmaW5lIEFMTE9DQVRFKG5hbWUpIF9fZGVjbHNwZWMoYWxsb2NhdGUobmFtZSkpCisjZGVmaW5lIERMTF9MT0NBTAorI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCisjZGVmaW5lIEFMTE9DQVRFKG5hbWUpIF9fYXR0cmlidXRlX18oKHNlY3Rpb24obmFtZSkpKQorI2RlZmluZSBETExfTE9DQUwgIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImhpZGRlbiIpKSkKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKworI2lmIEhPU1RfTElCUkFSWQorLy8gdGhlIGhvc3QgcHJvZ3JhbS9zaGFyZWQgbGlicmFyeSBzaG91bGQgYWx3YXlzIGhhdmUgX19vZmZsb2FkX3RhcmdldF9pbWFnZQorLy8gc3ltYm9sIGRlZmluZWQuIFRoaXMgc3ltYm9sIHNwZWNpZmllcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0YXJnZXQgcHJvZ3JhbQorLy8gaW1hZ2UuCitleHRlcm4gIkMiIERMTF9MT0NBTCBjb25zdCB2b2lkKiBfX29mZmxvYWRfdGFyZ2V0X2ltYWdlOworI2Vsc2UgLy8gSE9TVF9MSUJSQVJZCisvLyBEZWZpbmUgYSB3ZWFrIG1haW4gd2hpY2ggd291bGQgYmUgdXNlZCBvbiB0YXJnZXQgc2lkZSBpbiBjYXNlIHVzZXJlJ3MKKy8vIHNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgbWFpbiBkb2VzIG5vdCBoYXZlIG9mZmxvYWQgY29kZS4KKyNwcmFnbWEgd2VhayBtYWluCitpbnQgbWFpbih2b2lkKQoreworICAgIE9GRkxPQURfVEFSR0VUX01BSU4oKTsKKyAgICByZXR1cm4gMDsKK30KKworI3ByYWdtYSB3ZWFrIE1BSU5fXworZXh0ZXJuICJDIiBpbnQgTUFJTl9fKHZvaWQpCit7CisgICAgT0ZGTE9BRF9UQVJHRVRfTUFJTigpOworICAgIHJldHVybiAwOworfQorI2VuZGlmIC8vIEhPU1RfTElCUkFSWQorCisvLyBvZmZsb2FkIHNlY3Rpb24gcHJvbG9nCitBTExPQ0FURShPRkZMT0FEX0VOVFJZX1RBQkxFX1NFQ1RJT05fU1RBUlQpCisjaWZkZWYgVEFSR0VUX1dJTk5UCitfX2RlY2xzcGVjKGFsaWduKHNpemVvZihGdW5jVGFibGU6OkVudHJ5KSkpCisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCitzdGF0aWMgRnVuY1RhYmxlOjpFbnRyeSBfX29mZmxvYWRfZW50cnlfdGFibGVfc3RhcnQgPSB7IDAgfTsKKworLy8gbGlzdCBlbGVtZW50IGZvciB0aGUgY3VycmVudCBtb2R1bGUKK3N0YXRpYyBGdW5jTGlzdDo6Tm9kZSBfX29mZmxvYWRfZW50cnlfbm9kZSA9IHsKKyAgICB7ICZfX29mZmxvYWRfZW50cnlfdGFibGVfc3RhcnQgKyAxLCAtMSB9LAorICAgIDAsIDAKK307CisKKy8vIG9mZmxvYWQgZnAgc2VjdGlvbiBwcm9sb2cKK0FMTE9DQVRFKE9GRkxPQURfRlVOQ19UQUJMRV9TRUNUSU9OX1NUQVJUKQorI2lmZGVmIFRBUkdFVF9XSU5OVAorX19kZWNsc3BlYyhhbGlnbihzaXplb2YoRnVuY1RhYmxlOjpFbnRyeSkpKQorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorc3RhdGljIEZ1bmNUYWJsZTo6RW50cnkgX19vZmZsb2FkX2Z1bmNfdGFibGVfc3RhcnQgPSB7IDAgfTsKKworLy8gbGlzdCBlbGVtZW50IGZvciB0aGUgY3VycmVudCBtb2R1bGUKK3N0YXRpYyBGdW5jTGlzdDo6Tm9kZSBfX29mZmxvYWRfZnVuY19ub2RlID0geworICAgIHsgJl9fb2ZmbG9hZF9mdW5jX3RhYmxlX3N0YXJ0ICsgMSwgLTEgfSwKKyAgICAwLCAwCit9OworCisvLyBvZmZsb2FkIGZwIHNlY3Rpb24gcHJvbG9nCitBTExPQ0FURShPRkZMT0FEX1ZBUl9UQUJMRV9TRUNUSU9OX1NUQVJUKQorI2lmZGVmIFRBUkdFVF9XSU5OVAorX19kZWNsc3BlYyhhbGlnbihzaXplb2YoVmFyVGFibGU6OkVudHJ5KSkpCisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCitzdGF0aWMgVmFyVGFibGU6OkVudHJ5IF9fb2ZmbG9hZF92YXJfdGFibGVfc3RhcnQgPSB7IDAgfTsKKworLy8gbGlzdCBlbGVtZW50IGZvciB0aGUgY3VycmVudCBtb2R1bGUKK3N0YXRpYyBWYXJMaXN0OjpOb2RlIF9fb2ZmbG9hZF92YXJfbm9kZSA9IHsKKyAgICB7ICZfX29mZmxvYWRfdmFyX3RhYmxlX3N0YXJ0ICsgMSB9LAorICAgIDAsIDAKK307CisKKyNpZmRlZiBNWU9fU1VQUE9SVAorCisvLyBvZmZsb2FkIG15byBzaGFyZWQgdmFyIHNlY3Rpb24gcHJvbG9nCitBTExPQ0FURShPRkZMT0FEX01ZT19TSEFSRURfVEFCTEVfU0VDVElPTl9TVEFSVCkKKyNpZmRlZiBUQVJHRVRfV0lOTlQKK19fZGVjbHNwZWMoYWxpZ24oc2l6ZW9mKFNoYXJlZFRhYmxlRW50cnkpKSkKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKK3N0YXRpYyBTaGFyZWRUYWJsZUVudHJ5IF9fb2ZmbG9hZF9teW9fc2hhcmVkX3RhYmxlX3N0YXJ0ID0geyAwIH07CisKKyNpZiBIT1NUX0xJQlJBUlkKKy8vIG9mZmxvYWQgbXlvIHNoYXJlZCB2YXIgaW5pdCBzZWN0aW9uIHByb2xvZworQUxMT0NBVEUoT0ZGTE9BRF9NWU9fU0hBUkVEX0lOSVRfVEFCTEVfU0VDVElPTl9TVEFSVCkKKyNpZmRlZiBUQVJHRVRfV0lOTlQKK19fZGVjbHNwZWMoYWxpZ24oc2l6ZW9mKEluaXRUYWJsZUVudHJ5KSkpCisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCitzdGF0aWMgSW5pdFRhYmxlRW50cnkgX19vZmZsb2FkX215b19zaGFyZWRfaW5pdF90YWJsZV9zdGFydCA9IHsgMCB9OworI2VuZGlmCisKKy8vIG9mZmxvYWQgbXlvIGZwdHIgc2VjdGlvbiBwcm9sb2cKK0FMTE9DQVRFKE9GRkxPQURfTVlPX0ZQVFJfVEFCTEVfU0VDVElPTl9TVEFSVCkKKyNpZmRlZiBUQVJHRVRfV0lOTlQKK19fZGVjbHNwZWMoYWxpZ24oc2l6ZW9mKEZwdHJUYWJsZUVudHJ5KSkpCisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCitzdGF0aWMgRnB0clRhYmxlRW50cnkgX19vZmZsb2FkX215b19mcHRyX3RhYmxlX3N0YXJ0ID0geyAwIH07CisKKyNlbmRpZiAvLyBNWU9fU1VQUE9SVAorCisvLyBpbml0L2ZpbmkgY29kZSB3aGljaCBhZGRzL3JlbW92ZXMgbG9jYWwgbG9va3VwIGRhdGEgdG8vZnJvbSB0aGUgZ2xvYmFsIGxpc3QKKworc3RhdGljIHZvaWQgb2ZmbG9hZF9maW5pKCk7CisKKyNpZm5kZWYgVEFSR0VUX1dJTk5UCitzdGF0aWMgdm9pZCBvZmZsb2FkX2luaXQoKSBfX2F0dHJpYnV0ZV9fKChjb25zdHJ1Y3RvcigxMDEpKSk7CisjZWxzZSAvLyBUQVJHRVRfV0lOTlQKK3N0YXRpYyB2b2lkIG9mZmxvYWRfaW5pdCgpOworCisvLyBQbGFjZSBvZmZsb2FkIGluaXRpYWxpemF0aW9uIGJlZm9yZSB1c2VyIGNvbnN0cnVjdG9ycworQUxMT0NBVEUoT0ZGTE9BRF9DUlRJTklUX1NFQ1RJT05fU1RBUlQpCitzdGF0aWMgdm9pZCAoKmFkZHJlc3NvZl9vZmZsb2FkX2luaXQpKCkgPSBvZmZsb2FkX2luaXQ7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKK3N0YXRpYyB2b2lkIG9mZmxvYWRfaW5pdCgpCit7CisgICAgLy8gcmVnaXN0ZXIgb2ZmbG9hZCB0YWJsZXMKKyAgICBfX29mZmxvYWRfcmVnaXN0ZXJfdGFibGVzKCZfX29mZmxvYWRfZW50cnlfbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZfX29mZmxvYWRfZnVuY19ub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9fb2ZmbG9hZF92YXJfbm9kZSk7CisKKyNpZiBIT1NUX0xJQlJBUlkKKyAgICBfX29mZmxvYWRfcmVnaXN0ZXJfaW1hZ2UoJl9fb2ZmbG9hZF90YXJnZXRfaW1hZ2UpOworICAgIGF0ZXhpdChvZmZsb2FkX2ZpbmkpOworI2VuZGlmIC8vIEhPU1RfTElCUkFSWQorCisjaWZkZWYgTVlPX1NVUFBPUlQKKyAgICBfX29mZmxvYWRfbXlvUmVnaXN0ZXJUYWJsZXMoCisjaWYgSE9TVF9MSUJSQVJZCisgICAgICAgICZfX29mZmxvYWRfbXlvX3NoYXJlZF9pbml0X3RhYmxlX3N0YXJ0ICsgMSwKKyNlbmRpZiAvLyBIT1NUX0xJQlJBUlkKKyAgICAgICAgJl9fb2ZmbG9hZF9teW9fc2hhcmVkX3RhYmxlX3N0YXJ0ICsgMSwKKyAgICAgICAgJl9fb2ZmbG9hZF9teW9fZnB0cl90YWJsZV9zdGFydCArIDEKKyAgICApOworI2VuZGlmIC8vIE1ZT19TVVBQT1JUCit9CisKK3N0YXRpYyB2b2lkIG9mZmxvYWRfZmluaSgpCit7CisjaWYgSE9TVF9MSUJSQVJZCisgICAgX19vZmZsb2FkX3VucmVnaXN0ZXJfaW1hZ2UoJl9fb2ZmbG9hZF90YXJnZXRfaW1hZ2UpOworI2VuZGlmIC8vIEhPU1RfTElCUkFSWQorCisgICAgLy8gdW5yZWdpc3RlciBvZmZsb2FkIHRhYmxlcworICAgIF9fb2ZmbG9hZF91bnJlZ2lzdGVyX3RhYmxlcygmX19vZmZsb2FkX2VudHJ5X25vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZfX29mZmxvYWRfZnVuY19ub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmX19vZmZsb2FkX3Zhcl9ub2RlKTsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL29mbGRlbmQuY3BwIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZsZGVuZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYxZmU1OQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL29mbGRlbmQuY3BwCkBAIC0wLDAgKzEsNzcgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmIEhPU1RfTElCUkFSWQorI2luY2x1ZGUgIm9mZmxvYWRfaG9zdC5oIgorI2luY2x1ZGUgIm9mZmxvYWRfbXlvX2hvc3QuaCIKKyNlbHNlCisjaW5jbHVkZSAib2ZmbG9hZF90YXJnZXQuaCIKKyNpbmNsdWRlICJvZmZsb2FkX215b190YXJnZXQuaCIKKyNlbmRpZgorCisjaWZkZWYgVEFSR0VUX1dJTk5UCisjZGVmaW5lIEFMTE9DQVRFKG5hbWUpIF9fZGVjbHNwZWMoYWxsb2NhdGUobmFtZSkpCisjZWxzZSAvLyBUQVJHRVRfV0lOTlQKKyNkZWZpbmUgQUxMT0NBVEUobmFtZSkgX19hdHRyaWJ1dGVfXygoc2VjdGlvbihuYW1lKSkpCisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKy8vIG9mZmxvYWQgZW50cnkgdGFibGUKK0FMTE9DQVRFKE9GRkxPQURfRU5UUllfVEFCTEVfU0VDVElPTl9FTkQpCisjaWZkZWYgVEFSR0VUX1dJTk5UCitfX2RlY2xzcGVjKGFsaWduKHNpemVvZihGdW5jVGFibGU6OkVudHJ5KSkpCisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCitzdGF0aWMgRnVuY1RhYmxlOjpFbnRyeSBfX29mZmxvYWRfZW50cnlfdGFibGVfZW5kID0geyAoY29uc3QgY2hhciopLTEgfTsKKworLy8gb2ZmbG9hZCBmdW5jdGlvbiB0YWJsZQorQUxMT0NBVEUoT0ZGTE9BRF9GVU5DX1RBQkxFX1NFQ1RJT05fRU5EKQorI2lmZGVmIFRBUkdFVF9XSU5OVAorX19kZWNsc3BlYyhhbGlnbihzaXplb2YoRnVuY1RhYmxlOjpFbnRyeSkpKQorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorc3RhdGljIEZ1bmNUYWJsZTo6RW50cnkgX19vZmZsb2FkX2Z1bmNfdGFibGVfZW5kID0geyAoY29uc3QgY2hhciopLTEgfTsKKworLy8gZGF0YSB0YWJsZQorQUxMT0NBVEUoT0ZGTE9BRF9WQVJfVEFCTEVfU0VDVElPTl9FTkQpCisjaWZkZWYgVEFSR0VUX1dJTk5UCitfX2RlY2xzcGVjKGFsaWduKHNpemVvZihWYXJUYWJsZTo6RW50cnkpKSkKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKK3N0YXRpYyBWYXJUYWJsZTo6RW50cnkgX19vZmZsb2FkX3Zhcl90YWJsZV9lbmQgPSB7IChjb25zdCBjaGFyKiktMSB9OworCisjaWZkZWYgTVlPX1NVUFBPUlQKKworLy8gb2ZmbG9hZCBteW8gc2hhcmVkIHZhciBzZWN0aW9uIGVwaWxvZworQUxMT0NBVEUoT0ZGTE9BRF9NWU9fU0hBUkVEX1RBQkxFX1NFQ1RJT05fRU5EKQorI2lmZGVmIFRBUkdFVF9XSU5OVAorX19kZWNsc3BlYyhhbGlnbihzaXplb2YoU2hhcmVkVGFibGVFbnRyeSkpKQorc3RhdGljIFNoYXJlZFRhYmxlRW50cnkgX19vZmZsb2FkX215b19zaGFyZWRfdGFibGVfZW5kID0geyAoY29uc3QgY2hhciopLTEsIDAgfTsKKyNlbHNlIC8vIFRBUkdFVF9XSU5OVAorc3RhdGljIFNoYXJlZFRhYmxlRW50cnkgX19vZmZsb2FkX215b19zaGFyZWRfdGFibGVfZW5kID0geyAwIH07CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKyNpZiBIT1NUX0xJQlJBUlkKKy8vIG9mZmxvYWQgbXlvIHNoYXJlZCB2YXIgaW5pdCBzZWN0aW9uIGVwaWxvZworQUxMT0NBVEUoT0ZGTE9BRF9NWU9fU0hBUkVEX0lOSVRfVEFCTEVfU0VDVElPTl9FTkQpCisjaWZkZWYgVEFSR0VUX1dJTk5UCitfX2RlY2xzcGVjKGFsaWduKHNpemVvZihJbml0VGFibGVFbnRyeSkpKQorc3RhdGljIEluaXRUYWJsZUVudHJ5IF9fb2ZmbG9hZF9teW9fc2hhcmVkX2luaXRfdGFibGVfZW5kID0geyAoY29uc3QgY2hhciopLTEsIDAgfTsKKyNlbHNlIC8vIFRBUkdFVF9XSU5OVAorc3RhdGljIEluaXRUYWJsZUVudHJ5IF9fb2ZmbG9hZF9teW9fc2hhcmVkX2luaXRfdGFibGVfZW5kID0geyAwIH07CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisjZW5kaWYgLy8gSE9TVF9MSUJSQVJZCisKKy8vIG9mZmxvYWQgbXlvIGZwdHIgc2VjdGlvbiBlcGlsb2cKK0FMTE9DQVRFKE9GRkxPQURfTVlPX0ZQVFJfVEFCTEVfU0VDVElPTl9FTkQpCisjaWZkZWYgVEFSR0VUX1dJTk5UCitfX2RlY2xzcGVjKGFsaWduKHNpemVvZihGcHRyVGFibGVFbnRyeSkpKQorc3RhdGljIEZwdHJUYWJsZUVudHJ5IF9fb2ZmbG9hZF9teW9fZnB0cl90YWJsZV9lbmQgPSB7IChjb25zdCBjaGFyKiktMSwgMCwgMCB9OworI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCitzdGF0aWMgRnB0clRhYmxlRW50cnkgX19vZmZsb2FkX215b19mcHRyX3RhYmxlX2VuZCA9IHsgMCB9OworI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCisjZW5kaWYgLy8gTVlPX1NVUFBPUlQKZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL29yc2wtbGl0ZS9pbmNsdWRlL29yc2wtbGl0ZS5oIGIvZmluYWwvb2ZmbG9hZC9zcmMvb3JzbC1saXRlL2luY2x1ZGUvb3JzbC1saXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI2YTMzNQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL29yc2wtbGl0ZS9pbmNsdWRlL29yc2wtbGl0ZS5oCkBAIC0wLDAgKzEsMjIxIEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgX09SU0xfTElURV9IXworI2RlZmluZSBfT1JTTF9MSVRFX0hfCisKKyNpZm5kZWYgVEFSR0VUX1dJTk5UCisjaW5jbHVkZSA8c2NoZWQuaD4KKyNlbHNlCisjZGVmaW5lIGNwdV9zZXRfdCBpbnQKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKiBUeXBlIG9mIGEgT1JTTEJ1c3lTZXQgKi8KK3R5cGVkZWYgZW51bSBPUlNMQnVzeVNldFR5cGUgeworICAgIEJVU1lfU0VUX0VNUFRZID0gMCwgICAgIC8qKjwgRW1wdHkgc2V0ICovCisgICAgQlVTWV9TRVRfUEFSVElBTCA9IDEsICAgLyoqPCBOb24tZW1wdHkgc2V0IHRoYXQgb21pdHMgc29tZSB0aHJlYWRzICovCisgICAgQlVTWV9TRVRfRlVMTCA9IDIgICAgICAgLyoqPCBBIHNldCB0aGF0IGluY2x1ZGVzIGFsbCB0aHJlYWRzIG9uIHRoZSBjYXJkICovCit9IEJ1c3lTZXRUeXBlOworCisvKiogT1JTTEJ1c3lTZXQgZW5jYXBzdWxhdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QgT1JTTEJ1c3lTZXQgeworICAgIEJ1c3lTZXRUeXBlIHR5cGU7ICAgLyoqPCBTZXQgdHlwZSAqLworI2lmZGVmIF9fbGludXhfXworICAgIGNwdV9zZXRfdCBjcHVfc2V0OyAgLyoqPCBDUFUgbWFzayAodW51c2VkIGZvciBCVVNZX1NFVF9FTVBUWSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJVU1lfU0VUX1BBUlRJQUwgc2V0cykgcmVwcmVzZW50ZWQgYnkgdGhlIHN0YW5kYXJkCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW51eCBDUFUgc2V0IHR5cGUgLS0gY3B1X3NldF90LiBUaHJlYWRzIGFyZSBudW1iZXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRpbmcgZnJvbSAwLiBUaGUgbWF4aW1hbCBwb3NzaWJsZSB0aHJlYWQgbnVtYmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBzeXN0ZW0tc3BlY2lmaWMuIFNlZSBDUFVfU0VUKDMpIGZhbWlseSBvZiBtYWNyb3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBtb3JlIGRldGFpbHMuIFVudXNlZCBpbiBPUlNMIExpdGUuICovCisjZW5kaWYKK30gT1JTTEJ1c3lTZXQ7CisKKy8qKiBDbGllbnQgdGFnICovCit0eXBlZGVmIGNoYXIqIE9SU0xUYWc7CisKKy8qKiBNYXhpbWFsIGxlbmd0aCBvZiB0YWcgaW4gY2hhcmFjdGVycyAqLworI2RlZmluZSBPUlNMX01BWF9UQUdfTEVOIDEyOAorCisvKiogTWF4aW1hbCBudW1iZXIgb2YgY2FyZHMgdGhhdCBjYW4gYmUgbWFuYWdlZCBieSBPUlNMICovCisjZGVmaW5lIE9SU0xfTUFYX0NBUkRTIDMyCisKKy8qKiBSZXNlcnZlcyBjb21wdXRhdGlvbmFsIHJlc291cmNlcyBvbiBhIHNldCBvZiBjYXJkcy4gQmxvY2tzLgorICoKKyAqIElmIGFueSBvZiB0aGUgcmVzb3VyY2VzIGNhbm5vdCBiZSByZXNlcnZlZCwgdGhpcyBmdW5jdGlvbiB3aWxsIGJsb2NrIHVudGlsCisgKiB0aGV5IGJlY29tZSBhdmFpbGFibGUuIFJlc2VydmF0aW9uIGNhbiBiZSByZWN1cnNpdmUgaWYgcGVyZm9ybWVkIGJ5IHRoZQorICogc2FtZSB0YWcuIEEgcmVjdXJzaXZlbHkgcmVzZXJ2ZWQgcmVzb3VyY2UgbXVzdCBiZSByZWxlYXNlZCB0aGUgc2FtZSBudW1iZXIKKyAqIG9mIHRpbWVzIGl0IHdhcyByZXNlcnZlZC4KKyAqCisgKiBAc2VlIE9SU0xUcnlSZXNlcnZlCisgKgorICogQHBhcmFtW2luXSAgbiAgICAgIE51bWJlciBvZiBjYXJkcyB0byByZXNlcnZlIHJlc291cmNlcyBvbi4gQ2Fubm90IGJlIDwgMAorICogICAgICAgICAgICAgICAgICAgIG9yID4gT1JTTF9NQVhfQ0FSRFMuCisgKgorICogQHBhcmFtW2luXSAgaW5kcyAgIEluZGljZXMgb2YgdGhlIGNhcmRzOiBhbiBpbnRlZ2VyIGFycmF5IHdpdGggbiBlbGVtZW50cy4KKyAqICAgICAgICAgICAgICAgICAgICBDYW5ub3QgYmUgTlVMTCBpZiBuID4gMC4gVmFsaWQgY2FyZCBpbmRpY2VzIGFyZSBmcm9tIDAKKyAqICAgICAgICAgICAgICAgICAgICB0byBPUlNMX01BWF9DQVJEUy0xLiBDYW5ub3QgY29udGFpbiBkdXBsaWNhdGUgZWxlbWVudHMuCisgKgorICogQHBhcmFtW2luXSAgYnNldHMgIFJlcXVlc3RlZCByZXNvdXJjZXMgb24gZWFjaCBvZiB0aGUgY2FyZC4gQ2Fubm90IGJlIE5VTEwKKyAqICAgICAgICAgICAgICAgICAgICBpZiBuID4gMC4KKyAqCisgKiBAcGFyYW1baW5dICB0YWcgICAgT1JTTFRhZyBvZiB0aGUgY2FsbGluZyBjbGllbnQuIENhbm5vdCBiZSBOVUxMLiBMZW5ndGgKKyAqICAgICAgICAgICAgICAgICAgICBtdXN0IG5vdCBleGVlZCBPUlNMX01BWF9UQUdfTEVOLgorICoKKyAqIEByZXR1cm5zICAgIDAgICAgICBpZiB0aGUgcmVzb3VyY2VzIHdlcmUgc3VjY2Vzc2Z1bGx5IHJlc2VydmVkCisgKgorICogQHJldHVybnMgICAgRUlOVkFMIGlmIGFueSBvZiB0aGUgYXJndW1lbnRzIGlzIGludmFsaWQKKyAqCisgKiBAcmV0dXJucyAgICBFQUdBSU4gbGltaXQgb2YgcmVjdXJzaXZlIHJlc2VydmF0aW9ucyByZWFjaGVkCisgKiAgICAgICAgICAgICAgICAgICAgKG5vdCBpbiBPUlNMIExpdGUpCisgKgorICogQHJldHVybnMgICAgRU5PU1lTIChpbiBPUlNMIExpdGUpIGlmIHR5cGUgb2YgYW55IG9mIHRoZSBidXN5IHNldHMgaXMKKyAqICAgICAgICAgICAgICAgICAgICBlcXVhbCB0byBCVVNZX1NFVF9QQVJUSUFMCisgKi8KK2ludCBPUlNMUmVzZXJ2ZShjb25zdCBpbnQgbiwgY29uc3QgaW50ICpfX3Jlc3RyaWN0IGluZHMsCisgICAgICAgICAgICAgICAgY29uc3QgT1JTTEJ1c3lTZXQgKl9fcmVzdHJpY3QgYnNldHMsCisgICAgICAgICAgICAgICAgY29uc3QgT1JTTFRhZyBfX3Jlc3RyaWN0IHRhZyk7CisKKy8qKiBSZXNlcnZlcyBjb21wdXRhdGlvbmFsIHJlc291cmNlcyBvbiBhIHNldCBvZiBjYXJkcy4gRG9lcyBub3QgYmxvY2suCisgKgorICogSWYgYW55IG9mIHRoZSByZXNvdXJjZXMgY2Fubm90IGJlIHJlc2VydmVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuCisgKiBpbW1lZGlhdGVseS4gUmVzZXJ2YXRpb24gY2FuIGJlIHJlY3Vyc2l2ZSBpZiBwZXJmb3JtZWQgYnkgdGhlIHNhbWUgdGFnLgorICogQSByZWN1cnNpdmVseSByZXNlcnZlZCByZXNvdXJjZSBtdXN0IGJlIHJlbGVhc2VkIHRoZSBzYW1lIG51bWJlciBvZiB0aW1lcworICogaXQgd2FzIHJlc2VydmVkLgorICoKKyAqIEBzZWUgT1JTTFJlc2VydmUKKyAqCisgKiBAcGFyYW1baW5dICBuICAgICAgTnVtYmVyIG9mIGNhcmRzIHRvIHJlc2VydmUgcmVzb3VyY2VzIG9uLiBDYW5ub3QgYmUgPCAwCisgKiAgICAgICAgICAgICAgICAgICAgb3IgPiBPUlNMX01BWF9DQVJEUy4KKyAqCisgKiBAcGFyYW1baW5dICBpbmRzICAgICBJbmRpY2VzIG9mIHRoZSBjYXJkczogYW4gaW50ZWdlciBhcnJheSB3aXRoIG4gZWxlbWVudHMuCisgKiAgICAgICAgICAgICAgICAgICAgICBDYW5ub3QgYmUgTlVMTCBpZiBuID4gMC4gVmFsaWQgY2FyZCBpbmRpY2VzIGFyZSBmcm9tIDAKKyAqICAgICAgICAgICAgICAgICAgICAgIHRvIE9SU0xfTUFYX0NBUkRTLTEuIENhbm5vdCBjb250YWluIGR1cGxpY2F0ZSBlbGVtZW50cy4KKyAqCisgKiBAcGFyYW1baW5vdXRdIGJzZXRzICBSZXF1ZXN0ZWQgcmVzb3VyY2VzIG9uIGVhY2ggb2YgdGhlIGNhcmQuIENhbm5vdCBiZQorICogICAgICAgICAgICAgICAgICAgICAgTlVMTCBpZiBuID4gMC4KKyAqCisgKiBAcGFyYW1baW5dICAgIHRhZyAgICBPUlNMVGFnIG9mIHRoZSBjYWxsaW5nIGNsaWVudC4gQ2Fubm90IGJlIE5VTEwuIExlbmd0aAorICogICAgICAgICAgICAgICAgICAgICAgbXVzdCBub3QgZXhjZWVkIE9SU0xfTUFYX1RBR19MRU4uCisgKgorICogQHJldHVybnMgICAgICAwICAgICAgaWYgdGhlIHJlc291cmNlcyB3ZXJlIHN1Y2Nlc3NmdWxseSByZXNlcnZlZAorICoKKyAqIEByZXR1cm5zICAgICAgRUJVU1kgIGlmIHNvbWUgb2YgdGhlIHJlcXVlc3RlZCByZXNvdXJjZXMgYXJlIGJ1c3kKKyAqCisgKiBAcmV0dXJucyAgICAgIEVJTlZBTCBpZiBhbnkgb2YgdGhlIGFyZ3VtZW50cyBpcyBpbnZhbGlkCisgKgorICogQHJldHVybnMgICAgICBFQUdBSU4gbGltaXQgb2YgcmVjdXJzaXZlIHJlc2VydmF0aW9ucyByZWFjaGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAobm90IGluIE9SU0wgTGl0ZSkKKyAqCisgKiBAcmV0dXJucyAgICAgIEVOT1NZUyAoaW4gT1JTTCBMaXRlKSBpZiB0eXBlIG9mIGFueSBvZiB0aGUgYnVzeSBzZXRzIGlzCisgKiAgICAgICAgICAgICAgICAgICAgICBlcXVhbCB0byBCVVNZX1NFVF9QQVJUSUFMCisgKi8KK2ludCBPUlNMVHJ5UmVzZXJ2ZShjb25zdCBpbnQgbiwgY29uc3QgaW50ICpfX3Jlc3RyaWN0IGluZHMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgT1JTTEJ1c3lTZXQgKl9fcmVzdHJpY3QgYnNldHMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgT1JTTFRhZyBfX3Jlc3RyaWN0IHRhZyk7CisKKy8qKiBHcmFudWxhcmlmeSBvZiBwYXJ0aWFsIHJlc2VydmF0aW9uICovCit0eXBlZGVmIGVudW0gT1JTTFBhcnRpYWxHcmFudWxhcml0eSB7CisgICAgR1JBTl9DQVJEID0gMCwgLyoqPCBDYXJkIGdyYW51bGFyaXR5ICovCisgICAgR1JBTl9USFJFQUQgPSAxIC8qKjwgVGhyZWFkIGdyYW51bGFyaXR5ICovCit9IE9SU0xQYXJ0aWFsR3JhbnVsYXJpdHk7CisKKy8qKiBSZXF1ZXN0cyByZXNlcnZhdGlvbiBvZiBzb21lIG9mIGNvbXB1dGF0aW9uYWwgcmVzb3VyY2VzIG9uIGEgc2V0IG9mIGNhcmRzLgorICogRG9lcyBub3QgYmxvY2suIFVwZGF0ZXMgdXNlci1wcm92aWRlZCBic2V0cyB0byBpbmRpY2F0ZSB3aGljaCByZXNvdXJjZXMKKyAqIHdlcmUgcmVzZXJ2ZWQuCisgKgorICogSWYgYW55IG9mIHRoZSByZXNvdXJjZXMgY2Fubm90IGJlIHJlc2VydmVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgdXBkYXRlIGJ1c3kKKyAqIHNldHMgcHJvdmlkZWQgYnkgdGhlIGNhbGxlciB0byByZWZsZWN0IHdoYXQgcmVzb3VyY2VzIHdlcmUgYWN0dWFsbHkKKyAqIHJlc2VydmVkLiBUaGlzIGZ1bmN0aW9uIHN1cHBvcnRzIHR3byBncmFudWxhcml0eSBtb2RlczogJ2NhcmQnIGFuZAorICogJ3RocmVhZCcuICBXaGVuIGdyYW51bGFyaXR5IGlzIHNldCB0byAnY2FyZCcsIGEgZmFpbHVyZSB0byByZXNlcnZlIGEgdGhyZWFkCisgKiBvbiB0aGUgY2FyZCB3aWxsIGltcGx5IHRoYXQgcmVzZXJ2YXRpb24gaGFzIGZhaWxlZCBmb3IgdGhlIHdob2xlIGNhcmQuIFdoZW4KKyAqIGdyYW51bGFyaXR5IGlzIHNldCB0byAndGhyZWFkJywgcmVzZXJ2YXRpb24gb24gYSBjYXJkIHdpbGwgYmUgY29uc2lkZXJlZAorICogc3VjY2Vzc2Z1bCBhcyBsb25nIGFzIGF0IGxlYXN0IG9uZSB0aHJlYWQgb24gdGhlIGNhcmQgd2FzIHN1Y2Nlc3NmdWxseQorICogcmVzZXJ2ZWQuIFJlc2VydmF0aW9uIGNhbiBiZSByZWN1cnNpdmUgaWYgcGVyZm9ybWVkIGJ5IHRoZSBzYW1lIHRhZy4gQQorICogcmVjdXJzaXZlbHkgcmVzZXJ2ZWQgcmVzb3VyY2UgbXVzdCBiZSByZWxlYXNlZCB0aGUgc2FtZSBudW1iZXIgb2YgdGltZXMgaXQKKyAqIHdhcyByZXNlcnZlZC4KKyAqCisgKiBAcGFyYW1baW5dICBncmFuICAgUmVzZXJ2YXRpb24gZ3JhbnVsYXJpdHkKKyAqCisgKiBAcGFyYW1baW5dICBuICAgICAgTnVtYmVyIG9mIGNhcmRzIHRvIHJlc2VydmUgcmVzb3VyY2VzIG9uLiBDYW5ub3QgYmUgPCAwCisgKiAgICAgICAgICAgICAgICAgICAgb3IgPiBPUlNMX01BWF9DQVJEUy4KKyAqCisgKiBAcGFyYW1baW5dICBpbmRzICAgSW5kaWNlcyBvZiB0aGUgY2FyZHM6IGFuIGludGVnZXIgYXJyYXkgd2l0aCBuIGVsZW1lbnRzLgorICogICAgICAgICAgICAgICAgICAgIENhbm5vdCBiZSBOVUxMIGlmIG4gPiAwLiBWYWxpZCBjYXJkIGluZGljZXMgYXJlIGZyb20gMAorICogICAgICAgICAgICAgICAgICAgIHRvIE9SU0xfTUFYX0NBUkRTLTEuIENhbm5vdCBjb250YWluIGR1cGxpY2F0ZSBlbGVtZW50cy4KKyAqCisgKiBAcGFyYW1baW5dICBic2V0cyAgUmVxdWVzdGVkIHJlc291cmNlcyBvbiBlYWNoIG9mIHRoZSBjYXJkLiBDYW5ub3QgYmUgTlVMTAorICogICAgICAgICAgICAgICAgICAgIGlmIG4gPiAwLgorICoKKyAqIEBwYXJhbVtpbl0gIHRhZyAgICBPUlNMVGFnIG9mIHRoZSBjYWxsaW5nIGNsaWVudC4gQ2Fubm90IGJlIE5VTEwuIExlbmd0aAorICogICAgICAgICAgICAgICAgICAgIG11c3Qgbm90IGV4Y2VlZCBPUlNMX01BWF9UQUdfTEVOLgorICoKKyAqIEByZXR1cm5zICAgIDAgICAgICBpZiBhdCBsZWFzdCBzb21lIG9mIHRoZSByZXNvdXJjZXMgd2VyZSBzdWNjZXNzZnVsbHkKKyAqICAgICAgICAgICAgICAgICAgICByZXNlcnZlZAorICoKKyAqIEByZXR1cm5zICAgIEVCVVNZICBpZiBhbGwgb2YgdGhlIHJlcXVlc3RlZCByZXNvdXJjZXMgYXJlIGJ1c3kKKyAqCisgKiBAcmV0dXJucyAgICBFSU5WQUwgaWYgYW55IG9mIHRoZSBhcmd1bWVudHMgaXMgaW52YWxpZAorICoKKyAqIEByZXR1cm5zICAgIEVBR0FJTiBsaW1pdCBvZiByZWN1cnNpdmUgcmVzZXJ2YXRpb25zIHJlYWNoZWQKKyAqICAgICAgICAgICAgICAgICAgICAobm90IGluIE9SU0wgTGl0ZSkKKyAqCisgKiBAcmV0dXJucyAgICBFTk9TWVMgKGluIE9SU0wgTGl0ZSkgaWYgdHlwZSBvZiBhbnkgb2YgdGhlIGJ1c3kgc2V0cyBpcworICogICAgICAgICAgICAgICAgICAgIGVxdWFsIHRvIEJVU1lfU0VUX1BBUlRJQUwKKyAqLworaW50IE9SU0xSZXNlcnZlUGFydGlhbChjb25zdCBPUlNMUGFydGlhbEdyYW51bGFyaXR5IGdyYW4sIGNvbnN0IGludCBuLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgKl9fcmVzdHJpY3QgaW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgT1JTTEJ1c3lTZXQgKl9fcmVzdHJpY3QgYnNldHMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9SU0xUYWcgX19yZXN0cmljdCB0YWcpOworCisvKiogUmVsZWFzZXMgcHJldmlvdXNseSByZXNlcnZlZCBjb21wdXRhdGlvbmFsIHJlc291cmNlcyBvbiBhIHNldCBvZiBjYXJkcy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZmFpbCBpZiBhbnkgb2YgdGhlIHJlc291cmNlcyB0byBiZSByZWxlYXNlZCB3ZXJlIG5vdAorICogcmVzZXJ2ZWQgYnkgdGhlIGNhbGxpbmcgY2xpZW50LgorICoKKyAqIEBzZWUgT1JTTFJlc2VydmUKKyAqIEBzZWUgT1JTTFRyeVJlc2VydmUKKyAqIEBzZWUgT1JTTFJlc2VydmVQYXJ0aWFsCisgKgorICogQHBhcmFtW2luXSAgbiAgICAgIE51bWJlciBvZiBjYXJkcyB0byByZXNlcnZlIHJlc291cmNlcyBvbi4gQ2Fubm90IGJlIDwgMAorICogICAgICAgICAgICAgICAgICAgIG9yID4gT1JTTF9NQVhfQ0FSRFMuCisgKgorICogQHBhcmFtW2luXSAgaW5kcyAgIEluZGljZXMgb2YgdGhlIGNhcmRzOiBhbiBpbnRlZ2VyIGFycmF5IHdpdGggbiBlbGVtZW50cy4KKyAqICAgICAgICAgICAgICAgICAgICBDYW5ub3QgYmUgTlVMTCBpZiBuID4gMC4gVmFsaWQgY2FyZCBpbmRpY2VzIGFyZSBmcm9tIDAKKyAqICAgICAgICAgICAgICAgICAgICB0byBPUlNMX01BWF9DQVJEUy0xLiBDYW5ub3QgY29udGFpbiBkdXBsaWNhdGUgZWxlbWVudHMuCisgKgorICogQHBhcmFtW2luXSAgYnNldHMgIFJlcXVlc3RlZCByZXNvdXJjZXMgb24gZWFjaCBvZiB0aGUgY2FyZC4gQ2Fubm90IGJlIE5VTEwKKyAqICAgICAgICAgICAgICAgICAgICBpZiBuID4gMC4KKyAqCisgKiBAcGFyYW1baW5dICB0YWcgICAgT1JTTFRhZyBvZiB0aGUgY2FsbGluZyBjbGllbnQuIENhbm5vdCBiZSBOVUxMLiBMZW5ndGgKKyAqICAgICAgICAgICAgICAgICAgICBtdXN0IG5vdCBleGNlZWQgT1JTTF9NQVhfVEFHX0xFTi4KKyAqCisgKiBAcmV0dXJucyAgICAwICAgICAgaWYgdGhlIHJlc291cmNlcyB3ZXJlIHN1Y2Nlc3NmdWxseSByZWxlYXNlZAorICoKKyAqIEByZXR1cm5zICAgIEVJTlZBTCBpZiBhbnkgb2YgdGhlIGFyZ3VtZW50cyBpcyBpbnZhbGlkCisgKgorICogQHJldHVybnMgICAgRVBFUk0gIHRoZSBjYWxsaW5nIGNsaWVudCBkaWQgbm90IHJlc2VydmUgc29tZSBvZiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMgaXQgaXMgdHJ5aW5nIHRvIHJlbGVhc2UuCisgKgorICogQHJldHVybnMgICAgRU5PU1lTIChpbiBPUlNMIExpdGUpIGlmIHR5cGUgb2YgYW55IG9mIHRoZSBidXN5IHNldHMgaXMKKyAqICAgICAgICAgICAgICAgICAgICBlcXVhbCB0byBCVVNZX1NFVF9QQVJUSUFMCisgKi8KK2ludCBPUlNMUmVsZWFzZShjb25zdCBpbnQgbiwgY29uc3QgaW50ICpfX3Jlc3RyaWN0IGluZHMsCisgICAgICAgICAgICAgICAgY29uc3QgT1JTTEJ1c3lTZXQgKl9fcmVzdHJpY3QgYnNldHMsCisgICAgICAgICAgICAgICAgY29uc3QgT1JTTFRhZyBfX3Jlc3RyaWN0IHRhZyk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvb3JzbC1saXRlL2xpYi9vcnNsLWxpdGUuYyBiL2ZpbmFsL29mZmxvYWQvc3JjL29yc2wtbGl0ZS9saWIvb3JzbC1saXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIxY2RhNwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL29yc2wtbGl0ZS9saWIvb3JzbC1saXRlLmMKQEAgLTAsMCArMSwzMzcgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlICJvcnNsLWxpdGUvaW5jbHVkZS9vcnNsLWxpdGUuaCIKKworI2RlZmluZSBESVNBQkxFX1NZTUJPTF9WRVJTSU9OSU5HCisKKyNpZiBkZWZpbmVkKF9fbGludXhfXykgJiYgIWRlZmluZWQoRElTQUJMRV9TWU1CT0xfVkVSU0lPTklORykKKyNkZWZpbmUgc3ltdmVyKHNyYywgdGd0LCB2ZXJzdHIpIF9fYXNtX18oIi5zeW12ZXIgIiAjc3JjICIsIiAjdGd0IHZlcnN0cikKK3N5bXZlcihPUlNMUmVzZXJ2ZTAsIE9SU0xSZXNlcnZlLCAiQEBPUlNMXzAuMCIpOworc3ltdmVyKE9SU0xUcnlSZXNlcnZlMCwgT1JTTFRyeVJlc2VydmUsICJAQE9SU0xfMC4wIik7CitzeW12ZXIoT1JTTFJlc2VydmVQYXJ0aWFsMCwgT1JTTFJlc2VydmVQYXJ0aWFsLCAiQEBPUlNMXzAuMCIpOworc3ltdmVyKE9SU0xSZWxlYXNlMCwgT1JTTFJlbGVhc2UsICJAQE9SU0xfMC4wIik7CisjZWxzZQorI2RlZmluZSBPUlNMUmVzZXJ2ZTAgT1JTTFJlc2VydmUKKyNkZWZpbmUgT1JTTFRyeVJlc2VydmUwIE9SU0xUcnlSZXNlcnZlCisjZGVmaW5lIE9SU0xSZXNlcnZlUGFydGlhbDAgT1JTTFJlc2VydmVQYXJ0aWFsCisjZGVmaW5lIE9SU0xSZWxlYXNlMCBPUlNMUmVsZWFzZQorI2VuZGlmCisKKyNpZmRlZiBfX2xpbnV4X18KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CitzdGF0aWMgcHRocmVhZF9tdXRleF90IGdsb2JhbF9tdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CitzdGF0aWMgcHRocmVhZF9jb25kX3QgcmVsZWFzZV9jb25kID0gUFRIUkVBRF9DT05EX0lOSVRJQUxJWkVSOworI2VuZGlmCisKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjcHJhZ21hIGludHJpbnNpYyhfUmVhZFdyaXRlQmFycmllcikKK3N0YXRpYyBTUldMT0NLIGdsb2JhbF9tdXRleCA9IFNSV0xPQ0tfSU5JVDsKK3N0YXRpYyB2b2xhdGlsZSBpbnQgcmVsZWFzZV9jb25kX2luaXRpYWxpemVkID0gMDsKK3N0YXRpYyBDT05ESVRJT05fVkFSSUFCTEUgcmVsZWFzZV9jb25kOworCitzdGF0aWMgdm9pZCBzdGF0ZV9sYXp5X2luaXRfc3luYygpCit7CisgICAgaWYgKCFyZWxlYXNlX2NvbmRfaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgQWNxdWlyZVNSV0xvY2tFeGNsdXNpdmUoJmdsb2JhbF9tdXRleCk7CisgICAgICAgIF9SZWFkV3JpdGVCYXJyaWVyKCk7CisgICAgICAgIGlmICghcmVsZWFzZV9jb25kX2luaXRpYWxpemVkKSB7CisgICAgICAgICAgICBJbml0aWFsaXplQ29uZGl0aW9uVmFyaWFibGUoJnJlbGVhc2VfY29uZCk7CisgICAgICAgICAgICByZWxlYXNlX2NvbmRfaW5pdGlhbGl6ZWQgPSAxOworICAgICAgICB9CisgICAgICAgIFJlbGVhc2VTUldMb2NrRXhjbHVzaXZlKCZnbG9iYWxfbXV0ZXgpOworICAgIH0KK30KKyNlbmRpZgorCitzdGF0aWMgaW50IHN0YXRlX2xvY2soKQoreworI2lmZGVmIF9fbGludXhfXworICAgIHJldHVybiBwdGhyZWFkX211dGV4X2xvY2soJmdsb2JhbF9tdXRleCk7CisjZW5kaWYKKworI2lmZGVmIF9XSU4zMgorICAgIEFjcXVpcmVTUldMb2NrRXhjbHVzaXZlKCZnbG9iYWxfbXV0ZXgpOworICAgIHJldHVybiAwOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgc3RhdGVfdW5sb2NrKCkKK3sKKyNpZmRlZiBfX2xpbnV4X18KKyAgICByZXR1cm4gcHRocmVhZF9tdXRleF91bmxvY2soJmdsb2JhbF9tdXRleCk7CisjZW5kaWYKKworI2lmZGVmIF9XSU4zMgorICAgIFJlbGVhc2VTUldMb2NrRXhjbHVzaXZlKCZnbG9iYWxfbXV0ZXgpOworICAgIHJldHVybiAwOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgc3RhdGVfd2FpdF9mb3JfcmVsZWFzZSgpCit7CisjaWZkZWYgX19saW51eF9fCisgICAgcmV0dXJuIHB0aHJlYWRfY29uZF93YWl0KCZyZWxlYXNlX2NvbmQsICZnbG9iYWxfbXV0ZXgpOworI2VuZGlmCisKKyNpZmRlZiBfV0lOMzIKKyAgICByZXR1cm4gU2xlZXBDb25kaXRpb25WYXJpYWJsZVNSVygmcmVsZWFzZV9jb25kLAorICAgICAgICAgICAgJmdsb2JhbF9tdXRleCwgSU5GSU5JVEUsIDApID09IDAgPyAxIDogMDsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50IHN0YXRlX3NpZ25hbF9yZWxlYXNlKCkKK3sKKyNpZmRlZiBfX2xpbnV4X18KKyAgICByZXR1cm4gcHRocmVhZF9jb25kX3NpZ25hbCgmcmVsZWFzZV9jb25kKTsKKyNlbmRpZgorCisjaWZkZWYgX1dJTjMyCisgICAgV2FrZUNvbmRpdGlvblZhcmlhYmxlKCZyZWxlYXNlX2NvbmQpOworICAgIHJldHVybiAwOworI2VuZGlmCit9CisKK3N0YXRpYyBzdHJ1Y3QgeworICAgIGNoYXIgb3duZXJbT1JTTF9NQVhfVEFHX0xFTiArIDFdOworICAgIHVuc2lnbmVkIGxvbmcgcnNydl9jbnQ7Cit9IHJzcnZfZGF0YVtPUlNMX01BWF9DQVJEU107CisKK3N0YXRpYyBpbnQgY2hlY2tfYXJncyhjb25zdCBpbnQgbiwgY29uc3QgaW50ICpfX3Jlc3RyaWN0IGluZHMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT1JTTEJ1c3lTZXQgKl9fcmVzdHJpY3QgYnNldHMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT1JTTFRhZyBfX3Jlc3RyaWN0IHRhZykKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgY2FyZF9zcGVjaWZpZWRbT1JTTF9NQVhfQ0FSRFNdOworICAgIGlmICh0YWcgPT0gTlVMTCkgcmV0dXJuIC0xOworICAgIGlmIChzdHJsZW4oKGNoYXIgKil0YWcpID4gT1JTTF9NQVhfVEFHX0xFTikgcmV0dXJuIC0xOworICAgIGlmIChuIDwgMCB8fCBuID49IE9SU0xfTUFYX0NBUkRTKSByZXR1cm4gLTE7CisgICAgaWYgKG4gIT0gMCAmJiAoaW5kcyA9PSBOVUxMIHx8IGJzZXRzID09IE5VTEwpKSByZXR1cm4gLTE7CisgICAgZm9yIChpID0gMDsgaSA8IE9SU0xfTUFYX0NBUkRTOyBpKyspCisgICAgICAgIGNhcmRfc3BlY2lmaWVkW2ldID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGludCBpbmQgPSBpbmRzW2ldOworICAgICAgICBpZiAoaW5kIDwgMCB8fCBpbmQgPj0gT1JTTF9NQVhfQ0FSRFMpIHJldHVybiAtMTsKKyAgICAgICAgaWYgKGNhcmRfc3BlY2lmaWVkW2luZF0pIHJldHVybiAtMTsKKyAgICAgICAgY2FyZF9zcGVjaWZpZWRbaW5kXSA9IDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNoZWNrX2JzZXRzKGNvbnN0IGludCBuLCBjb25zdCBPUlNMQnVzeVNldCAqYnNldHMpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgaWYgKGJzZXRzW2ldLnR5cGUgPT0gQlVTWV9TRVRfUEFSVElBTCkgcmV0dXJuIC0xOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNhbl9yZXNlcnZlX2NhcmQoaW50IGNhcmQsIGNvbnN0IE9SU0xCdXN5U2V0ICpfX3Jlc3RyaWN0IGJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT1JTTFRhZyBfX3Jlc3RyaWN0IHRhZykKK3sKKyAgICBhc3NlcnQodGFnICE9IE5VTEwpOworICAgIGFzc2VydChic2V0ICE9IE5VTEwpOworICAgIGFzc2VydChzdHJsZW4oKGNoYXIgKil0YWcpIDwgT1JTTF9NQVhfVEFHX0xFTik7CisgICAgYXNzZXJ0KGJzZXQtPnR5cGUgIT0gQlVTWV9TRVRfUEFSVElBTCk7CisKKyAgICByZXR1cm4gKGJzZXQtPnR5cGUgPT0gQlVTWV9TRVRfRU1QVFkgfHwKKyAgICAgICAgICAgICgocnNydl9kYXRhW2NhcmRdLnJzcnZfY250ID09IDAgfHwKKyAgICAgICAgICAgIHN0cm5jbXAoKGNoYXIgKil0YWcsCisgICAgICAgICAgICAgICAgcnNydl9kYXRhW2NhcmRdLm93bmVyLCBPUlNMX01BWF9UQUdfTEVOKSA9PSAwKSAmJgorICAgICAgICAgICAgcnNydl9kYXRhW2NhcmRdLnJzcnZfY250IDwgVUxPTkdfTUFYKSkgPyAwIDogLSAxOworfQorCitzdGF0aWMgdm9pZCByZXNlcnZlX2NhcmQoaW50IGNhcmQsIGNvbnN0IE9SU0xCdXN5U2V0ICpfX3Jlc3RyaWN0IGJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT1JTTFRhZyBfX3Jlc3RyaWN0IHRhZykKK3sKKyAgICBhc3NlcnQodGFnICE9IE5VTEwpOworICAgIGFzc2VydChic2V0ICE9IE5VTEwpOworICAgIGFzc2VydChzdHJsZW4oKGNoYXIgKil0YWcpIDwgT1JTTF9NQVhfVEFHX0xFTik7CisgICAgYXNzZXJ0KGJzZXQtPnR5cGUgIT0gQlVTWV9TRVRfUEFSVElBTCk7CisKKyAgICBpZiAoYnNldC0+dHlwZSA9PSBCVVNZX1NFVF9FTVBUWSkKKyAgICAgICAgcmV0dXJuOworCisgICAgYXNzZXJ0KHJzcnZfZGF0YVtjYXJkXS5yc3J2X2NudCA9PSAwIHx8CisgICAgICAgICAgICBzdHJuY21wKChjaGFyICopdGFnLAorICAgICAgICAgICAgICAgIHJzcnZfZGF0YVtjYXJkXS5vd25lciwgT1JTTF9NQVhfVEFHX0xFTikgPT0gMCk7CisgICAgYXNzZXJ0KHJzcnZfZGF0YVtjYXJkXS5yc3J2X2NudCA8IFVMT05HX01BWCk7CisKKyAgICBpZiAocnNydl9kYXRhW2NhcmRdLnJzcnZfY250ID09IDApCisgICAgICAgIHN0cm5jcHkocnNydl9kYXRhW2NhcmRdLm93bmVyLCAoY2hhciAqKXRhZywgT1JTTF9NQVhfVEFHX0xFTik7CisgICAgcnNydl9kYXRhW2NhcmRdLm93bmVyW09SU0xfTUFYX1RBR19MRU5dID0gJ1wwJzsKKyAgICByc3J2X2RhdGFbY2FyZF0ucnNydl9jbnQrKzsKK30KKworc3RhdGljIGludCBjYW5fcmVsZWFzZV9jYXJkKGludCBjYXJkLCBjb25zdCBPUlNMQnVzeVNldCAqX19yZXN0cmljdCBic2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9SU0xUYWcgX19yZXN0cmljdCB0YWcpCit7CisgICAgYXNzZXJ0KHRhZyAhPSBOVUxMKTsKKyAgICBhc3NlcnQoYnNldCAhPSBOVUxMKTsKKyAgICBhc3NlcnQoc3RybGVuKChjaGFyICopdGFnKSA8IE9SU0xfTUFYX1RBR19MRU4pOworICAgIGFzc2VydChic2V0LT50eXBlICE9IEJVU1lfU0VUX1BBUlRJQUwpOworCisgICAgcmV0dXJuIChic2V0LT50eXBlID09IEJVU1lfU0VUX0VNUFRZIHx8IChyc3J2X2RhdGFbY2FyZF0ucnNydl9jbnQgPiAwICYmCisgICAgICAgICAgICAgICAgc3RybmNtcCgoY2hhciAqKXRhZywKKyAgICAgICAgICAgICAgICAgICAgcnNydl9kYXRhW2NhcmRdLm93bmVyLCBPUlNMX01BWF9UQUdfTEVOKSA9PSAwKSkgPyAwIDogMTsKK30KKworc3RhdGljIHZvaWQgcmVsZWFzZV9jYXJkKGludCBjYXJkLCBjb25zdCBPUlNMQnVzeVNldCAqX19yZXN0cmljdCBic2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9SU0xUYWcgX19yZXN0cmljdCB0YWcpCit7CisgICAgYXNzZXJ0KHRhZyAhPSBOVUxMKTsKKyAgICBhc3NlcnQoYnNldCAhPSBOVUxMKTsKKyAgICBhc3NlcnQoc3RybGVuKChjaGFyICopdGFnKSA8IE9SU0xfTUFYX1RBR19MRU4pOworICAgIGFzc2VydChic2V0LT50eXBlICE9IEJVU1lfU0VUX1BBUlRJQUwpOworCisgICAgaWYgKGJzZXQtPnR5cGUgPT0gQlVTWV9TRVRfRU1QVFkpCisgICAgICAgIHJldHVybjsKKworICAgIGFzc2VydChzdHJuY21wKChjaGFyICopdGFnLAorICAgICAgICAgICAgICAgIHJzcnZfZGF0YVtjYXJkXS5vd25lciwgT1JTTF9NQVhfVEFHX0xFTikgPT0gMCk7CisgICAgYXNzZXJ0KHJzcnZfZGF0YVtjYXJkXS5yc3J2X2NudCA+IDApOworCisgICAgcnNydl9kYXRhW2NhcmRdLnJzcnZfY250LS07Cit9CisKK2ludCBPUlNMUmVzZXJ2ZTAoY29uc3QgaW50IG4sIGNvbnN0IGludCAqX19yZXN0cmljdCBpbmRzLAorICAgICAgICAgICAgICAgIGNvbnN0IE9SU0xCdXN5U2V0ICpfX3Jlc3RyaWN0IGJzZXRzLAorICAgICAgICAgICAgICAgIGNvbnN0IE9SU0xUYWcgX19yZXN0cmljdCB0YWcpCit7CisgICAgaW50IGksIG9rOworCisgICAgaWYgKG4gPT0gMCkgcmV0dXJuIDA7CisgICAgaWYgKGNoZWNrX2FyZ3MobiwgaW5kcywgYnNldHMsIHRhZykgIT0gMCkgcmV0dXJuIEVJTlZBTDsKKyAgICBpZiAoY2hlY2tfYnNldHMobiwgYnNldHMpICE9IDApIHJldHVybiBFTk9TWVM7CisKKyAgICBzdGF0ZV9sb2NrKCk7CisKKyAgICAvKiBMb29wIHVudGlsIHdlIGZpbmQgdGhhdCBhbGwgdGhlIHJlc291cmNlcyB3ZSB3YW50IGFyZSBhdmFpbGFibGUgKi8KKyAgICBkbyB7CisgICAgICAgIG9rID0gMTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgICAgIGlmIChjYW5fcmVzZXJ2ZV9jYXJkKGluZHNbaV0sICZic2V0c1tpXSwgdGFnKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgb2sgPSAwOworICAgICAgICAgICAgICAgIC8qIFdhaXQgZm9yIHNvbWVvbmUgdG8gcmVsZWFzZSBzb21lIHJlc291cmNlcyAqLworICAgICAgICAgICAgICAgIHN0YXRlX3dhaXRfZm9yX3JlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICB9IHdoaWxlICghb2spOworCisgICAgLyogQXQgdGhpcyBwb2ludCB3ZSBhcmUgZ29vZCB0byByZXNlcnZlX2NhcmQgdGhlIHJlc291cmNlcyB3ZSB3YW50ICovCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgcmVzZXJ2ZV9jYXJkKGluZHNbaV0sICZic2V0c1tpXSwgdGFnKTsKKworICAgIHN0YXRlX3VubG9jaygpOworICAgIHJldHVybiAwOworfQorCitpbnQgT1JTTFRyeVJlc2VydmUwKGNvbnN0IGludCBuLCBjb25zdCBpbnQgKl9fcmVzdHJpY3QgaW5kcywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBPUlNMQnVzeVNldCAqX19yZXN0cmljdCBic2V0cywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBPUlNMVGFnIF9fcmVzdHJpY3QgdGFnKQoreworICAgIGludCBpLCByYyA9IEVCVVNZOworCisgICAgaWYgKG4gPT0gMCkgcmV0dXJuIDA7CisgICAgaWYgKGNoZWNrX2FyZ3MobiwgaW5kcywgYnNldHMsIHRhZykgIT0gMCkgcmV0dXJuIEVJTlZBTDsKKyAgICBpZiAoY2hlY2tfYnNldHMobiwgYnNldHMpICE9IDApIHJldHVybiBFTk9TWVM7CisKKyAgICBzdGF0ZV9sb2NrKCk7CisKKyAgICAvKiBDaGVjayByZXNvdXJjZSBhdmFpbGFiaWxpdHkgb25jZSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgIGlmIChjYW5fcmVzZXJ2ZV9jYXJkKGluZHNbaV0sICZic2V0c1tpXSwgdGFnKSAhPSAwKQorICAgICAgICAgICAgZ290byBiYWlsX291dDsKKworICAgIC8qIEF0IHRoaXMgcG9pbnQgd2UgYXJlIGdvb2QgdG8gcmVzZXJ2ZSB0aGUgcmVzb3VyY2VzIHdlIHdhbnQgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICByZXNlcnZlX2NhcmQoaW5kc1tpXSwgJmJzZXRzW2ldLCB0YWcpOworCisgICAgcmMgPSAwOworCitiYWlsX291dDoKKyAgICBzdGF0ZV91bmxvY2soKTsKKyAgICByZXR1cm4gcmM7Cit9CisKK2ludCBPUlNMUmVzZXJ2ZVBhcnRpYWwwKGNvbnN0IE9SU0xQYXJ0aWFsR3JhbnVsYXJpdHkgZ3JhbiwgY29uc3QgaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAqX19yZXN0cmljdCBpbmRzLCBPUlNMQnVzeVNldCAqX19yZXN0cmljdCBic2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT1JTTFRhZyBfX3Jlc3RyaWN0IHRhZykKK3sKKyAgICBpbnQgcmMgPSBFQlVTWTsKKyAgICBpbnQgaSwgbnVtX2F2YWlsID0gbjsKKworICAgIGlmIChuID09IDApIHJldHVybiAwOworICAgIGlmIChncmFuICE9IEdSQU5fQ0FSRCAmJiBncmFuICE9IEdSQU5fVEhSRUFEKSByZXR1cm4gRUlOVkFMOworICAgIGlmIChncmFuICE9IEdSQU5fQ0FSRCkgcmV0dXJuIEVJTlZBTDsKKyAgICBpZiAoY2hlY2tfYXJncyhuLCBpbmRzLCBic2V0cywgdGFnKSAhPSAwKSByZXR1cm4gRUlOVkFMOworICAgIGlmIChjaGVja19ic2V0cyhuLCBic2V0cykgIT0gMCkgcmV0dXJuIEVOT1NZUzsKKworICAgIHN0YXRlX2xvY2soKTsKKworICAgIC8qIENoZWNrIHJlc291cmNlIGF2YWlsYWJpbGl0eSBvbmNlOyByZW1vdmUgdW5hdmFpbGFibGUgcmVzb3VyY2VzIGZyb20gdGhlCisgICAgICogdXNlci1wcm92aWRlZCBsaXN0ICovCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgaWYgKGNhbl9yZXNlcnZlX2NhcmQoaW5kc1tpXSwgJmJzZXRzW2ldLCB0YWcpICE9IDApIHsKKyAgICAgICAgICAgIG51bV9hdmFpbC0tOworICAgICAgICAgICAgYnNldHNbaV0udHlwZSA9IEJVU1lfU0VUX0VNUFRZOworICAgICAgICB9CisKKyAgICBpZiAobnVtX2F2YWlsID09IDApCisgICAgICAgIGdvdG8gYmFpbF9vdXQ7CisKKyAgICAvKiBBdCB0aGlzIHBvaW50IHdlIGFyZSBnb29kIHRvIHJlc2VydmUgdGhlIHJlc291cmNlcyB3ZSB3YW50ICovCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgcmVzZXJ2ZV9jYXJkKGluZHNbaV0sICZic2V0c1tpXSwgdGFnKTsKKworICAgIHJjID0gMDsKKworYmFpbF9vdXQ6CisgICAgc3RhdGVfdW5sb2NrKCk7CisgICAgcmV0dXJuIHJjOworfQorCitpbnQgT1JTTFJlbGVhc2UwKGNvbnN0IGludCBuLCBjb25zdCBpbnQgKl9fcmVzdHJpY3QgaW5kcywKKyAgICAgICAgICAgICAgICBjb25zdCBPUlNMQnVzeVNldCAqX19yZXN0cmljdCBic2V0cywKKyAgICAgICAgICAgICAgICBjb25zdCBPUlNMVGFnIF9fcmVzdHJpY3QgdGFnKQoreworICAgIGludCBpLCByYyA9IEVQRVJNOworCisgICAgaWYgKG4gPT0gMCkgcmV0dXJuIDA7CisgICAgaWYgKGNoZWNrX2FyZ3MobiwgaW5kcywgYnNldHMsIHRhZykgIT0gMCkgcmV0dXJuIEVJTlZBTDsKKyAgICBpZiAoY2hlY2tfYnNldHMobiwgYnNldHMpICE9IDApIHJldHVybiBFTk9TWVM7CisKKyAgICBzdGF0ZV9sb2NrKCk7CisKKyAgICAvKiBDaGVjayB0aGF0IHdlIGNhbiByZWxlYXNlIGFsbCB0aGUgcmVzb3VyY2VzICovCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgaWYgKGNhbl9yZWxlYXNlX2NhcmQoaW5kc1tpXSwgJmJzZXRzW2ldLCB0YWcpICE9IDApCisgICAgICAgICAgICBnb3RvIGJhaWxfb3V0OworCisgICAgLyogQXQgdGhpcyBwb2ludCB3ZSBhcmUgZ29vZCB0byByZWxlYXNlIHRoZSByZXNvdXJjZXMgd2Ugd2FudCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgIHJlbGVhc2VfY2FyZChpbmRzW2ldLCAmYnNldHNbaV0sIHRhZyk7CisKKyAgICBzdGF0ZV9zaWduYWxfcmVsZWFzZSgpOworCisgICAgcmMgPSAwOworCitiYWlsX291dDoKKyAgICBzdGF0ZV91bmxvY2soKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qIHZpbTpzZXQgZXQ6ICovCmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9vcnNsLWxpdGUvdmVyc2lvbi50eHQgYi9maW5hbC9vZmZsb2FkL3NyYy9vcnNsLWxpdGUvdmVyc2lvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI1ZjU5OQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL29yc2wtbGl0ZS92ZXJzaW9uLnR4dApAQCAtMCwwICsxIEBACitPUlNMLWxpdGUgMC43CmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9yZHRzYy5oIGIvZmluYWwvb2ZmbG9hZC9zcmMvcmR0c2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTkxZDcxCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvcmR0c2MuaApAQCAtMCwwICsxLDE3IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3VpbnQ2NF90IF9yZHRzYygpCit7CisgIHVpbnQzMl90IGVheCwgZWR4OworICBhc20gdm9sYXRpbGUgKCJyZHRzYyIgOiAiPWEiIChlYXgpLCAiPWQiIChlZHgpKTsKKyAgcmV0dXJuICgodWludDY0X3QpZWR4IDw8IDMyKSB8IGVheDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL3VzZV9tcHNzMi50eHQgYi9maW5hbC9vZmZsb2FkL3NyYy91c2VfbXBzczIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0OGY0ODMKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy91c2VfbXBzczIudHh0CkBAIC0wLDAgKzEgQEAKKzIuMS42NzIwLTEzCmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy91c2VfbXBzc193aW4udHh0IGIvZmluYWwvb2ZmbG9hZC9zcmMvdXNlX21wc3Nfd2luLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDhmNDgzCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvdXNlX21wc3Nfd2luLnR4dApAQCAtMCwwICsxIEBACisyLjEuNjcyMC0xMwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9CdWlsZF9XaXRoX0NNYWtlLnR4dCBiL2ZpbmFsL3J1bnRpbWUvQnVpbGRfV2l0aF9DTWFrZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM0NTQzMAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvQnVpbGRfV2l0aF9DTWFrZS50eHQKQEAgLTAsMCArMSwyMTYgQEAKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSG93IHRvIEJ1aWxkIHRoZSBMTFZNKiBPcGVuTVAqIFJ1bnRpbWUgTGlicmFyeSB1c2luZyBDTWFrZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCis9PT09IFZlcnNpb24gb2YgQ01ha2UgcmVxdWlyZWQ6IHYyLjguMCBvciBhYm92ZSA9PT09CisgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSG93IHRvIGNhbGwgY21ha2UgaW5pdGlhbGx5LCB0aGVuIHJlcGVhdGVkbHkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistIFdoZW4gY2FsbGluZyBjbWFrZSBmb3IgdGhlIGZpcnN0IHRpbWUsIGFsbCBuZWVkZWQgY29tcGlsZXIgb3B0aW9ucworICBtdXN0IGJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLiAgQWZ0ZXIgdGhpcyBpbml0aWFsIGNhbGwgdG8KKyAgY21ha2UsIHRoZSBjb21waWxlciBkZWZpbml0aW9ucyBtdXN0IG5vdCBiZSBpbmNsdWRlZCBmb3IgZnVydGhlciBjYWxscworICB0byBjbWFrZS4gIE90aGVyIG9wdGlvbnMgY2FuIGJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lIG11bHRpcGxlCisgIHRpbWVzIGluY2x1ZGluZyBhbGwgZGVmaW5pdGlvbnMgaW4gdGhlIEJ1aWxkIG9wdGlvbnMgc2VjdGlvbiBiZWxvdy4KKy0gRXhhbXBsZSBvZiBjb25maWd1cmluZywgYnVpbGRpbmcsIHJlY29uZmlndXJpbmcsIHJlYnVpbGRpbmc6CisgICQgbWtkaXIgYnVpbGQKKyAgJCBjZCBidWlsZAorICAkIGNtYWtlIC1EQ01BS0VfQ19DT01QSUxFUj1nY2MgLURDTUFLRV9DWFhfQ09NUElMRVI9ZysrIC1ETElCT01QX0FSQ0g9aTM4NiAuLiAgIyBJbml0aWFsIGNvbmZpZ3VyYXRpb24KKyAgJCBtYWtlCisgIC4uLgorICAkIG1ha2UgY2xlYW4KKyAgJCBjbWFrZSAtRExJQk9NUF9BUkNIPXg4Nl82NCAtRENNQUtFX0JVSUxEX1RZUEU9RGVidWcgLi4gICAgICAgICAgICAgICAgICAgICAgICMgU2Vjb25kIGNvbmZpZ3VyYXRpb24KKyAgJCBtYWtlCisgIC4uLgorICAkIHJtIC1yZiAqCisgICQgY21ha2UgLURDTUFLRV9DX0NPTVBJTEVSPWdjYyAtRENNQUtFX0NYWF9DT01QSUxFUj1nKysgLURMSUJPTVBfQVJDSD14ODZfNjQgLi4gIyBUaGlyZCBjb25maWd1cmF0aW9uCisgICQgbWFrZQorLSBOb3RpY2UgaW4gdGhlIGV4YW1wbGUgaG93IHRoZSBjb21waWxlciBkZWZpbml0aW9ucyBhcmUgb25seSBzcGVjaWZpZWQKKyAgZm9yIGFuIGVtcHR5IGJ1aWxkIGRpcmVjdG9yeSwgYnV0IG90aGVyIEJ1aWxkIG9wdGlvbnMgYXJlIHVzZWQgYXQgYW55IHRpbWUuCistIFRoZSBmaWxlIENNYWtlQ2FjaGUudHh0IHdoaWNoIGlzIGNyZWF0ZWQgYWZ0ZXIgdGhlIGZpcnN0IGNhbGwgdG8gY21ha2UKKyAgaXMgYSBjb25maWd1cmF0aW9uIGZpbGUgd2hpY2ggaG9sZHMgYWxsIHRoZSB2YWx1ZXMgZm9yIHRoZSBCdWlsZCBvcHRpb25zLgorICBUaGVzZSBjb25maWd1cmF0aW9uIHZhbHVlcyBjYW4gYmUgY2hhbmdlZCB1c2luZyBhIHRleHQgZWRpdG9yIHRvIG1vZGlmeSAKKyAgQ01ha2VDYWNoZS50eHQgYXMgb3Bwb3NlZCB0byB1c2luZyBkZWZpbml0aW9ucyBvbiB0aGUgY29tbWFuZCBsaW5lLgorLSBUbyBoYXZlIGNtYWtlIGNyZWF0ZSBhIHBhcnRpY3VsYXIgdHlwZSBvZiBidWlsZCBnZW5lcmF0b3IgZmlsZSBzaW1wbHkgCisgIGlubHVkZSB0aGUgLUcgPEdlbmVyYXRvciBuYW1lPiBvcHRpb246CisgICQgY21ha2UgLUcgIlVuaXggTWFrZWZpbGVzIiAuLi4KKyAgWW91IGNhbiBzZWUgYSBsaXN0IG9mIGdlbmVyYXRvcnMgY21ha2Ugc3VwcG9ydHMgYnkgZXhlY3V0aW5nIGNtYWtlIHdpdGgKKyAgbm8gYXJndW1lbnRzIGFuZCBhIGxpc3Qgd2lsbCBiZSBwcmludGVkLgorCis9PT09PT09PT09PT09PT09PT09PT0KK0luc3RydWN0aW9ucyB0byBCdWlsZAorPT09PT09PT09PT09PT09PT09PT09CisgJCBjZCBsaWJvbXBfdG9wX2xldmVsLyBbIGRpcmVjdG9yeSB3aXRoIHNyYy8gLCBleHBvcnRzLyAsIHRvb2xzLyAsIGV0Yy4gXQorICQgbWtkaXIgYnVpbGQKKyAkIGNkIGJ1aWxkCisKKyBbIFVuaXgqIExpYnJhcmllcyBdCisgJCBjbWFrZSAtRENNQUtFX0NfQ09NUElMRVI9PEMgQ29tcGlsZXI+IC1EQ01BS0VfQ1hYX0NPTVBJTEVSPTxDKysgQ29tcGlsZXI+IC4uCisKKyBbIEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIExpYnJhcnkgKEludGVsKFIpIE1JQyBMaWJyYXJ5KSBdCisgJCBjbWFrZSAtRENNQUtFX0NfQ09NUElMRVI9PEMgQ29tcGlsZXI+IC1EQ01BS0VfQ1hYX0NPTVBJTEVSPTxDKysgQ29tcGlsZXI+IC1ETElCT01QX0FSQ0g9bWljIC4uCisKKyBbIFdpbmRvd3MgTGlicmFyaWVzIF0KKyAkIGNtYWtlIC1HIDxHZW5lcmF0b3IgVHlwZT4gLURDTUFLRV9DX0NPTVBJTEVSPTxDIENvbXBpbGVyPiAtRENNQUtFX0NYWF9DT01QSUxFUj08QysrIENvbXBpbGVyPiAtRENNQUtFX0FTTV9NQVNNX0NPTVBJTEVSPVttbCB8IG1sNjRdIC1EQ01BS0VfQlVJTERfVFlQRT1SZWxlYXNlIC4uCisKKyAkIG1ha2UKKyAkIG1ha2UgaW5zdGFsbAorCis9PT09PT09PT09PT09PT09PT0KK01hYyogRmF0IExpYnJhcmllcworPT09PT09PT09PT09PT09PT09CitPbiBPUyBYKiBtYWNoaW5lcywgaXQgaXMgcG9zc2libGUgdG8gYnVpbGQgdW5pdmVyc2FsIChvciBmYXQpIGxpYnJhcmllcyB3aGljaAoraW5jbHVkZSBib3RoIGkzODYgYW5kIHg4Nl82NCBhcmNoaXRlY3R1cmUgb2JqZWN0cyBpbiBhCitzaW5nbGUgYXJjaGl2ZS4KKyAkIGNtYWtlIC1EQ01BS0VfQ19DT01QSUxFUj1jbGFuZyAtRENNQUtFX0NYWF9DT01QSUxFUj1jbGFuZysrIC1EQ01BS0VfT1NYX0FSQ0hJVEVDVFVSRVM9J2kzODY7eDg2XzY0JyAuLgorICQgbWFrZQorVGhlcmUgaXMgYWxzbyBhbiBvcHRpb24gLURMSUJPTVBfT1NYX0FSQ0hJVEVDVFVSRVMgd2hpY2ggY2FuIGJlIHNldCBpbiBjYXNlCit0aGlzIGlzIGFuIExMVk0gc291cmNlIHRyZWUgYnVpbGQgd2hpY2ggd2lsbCBvbmx5IHNldCB0aGUgbGlib21wIGxpYnJhcnkKK3RvIGEgdW5pdmVyc2FsIGZhdCBsaWJyYXJ5IGFuZCBwcmV2ZW50IGhhdmluZyB0aGUgZW50aXJlIGxsdm0vY2xhbmcgYnVpbGQKK3Byb2R1Y2UgdW5pdmVyc2FsIGJpbmFyaWVzLgorCis9PT09PT09PT09PQorTWljcm8gdGVzdHMKKz09PT09PT09PT09CitBZnRlciB0aGUgbGlicmFyeSBoYXMgYmVlbiBidWlsdCwgdGhlcmUgYXJlIGZpdmUgb3B0aW9uYWwgbWljcm90ZXN0cyB0aGF0CitjYW4gYmUgcGVyZm9ybWVkLiAgU29tZSB3aWxsIGJlIHNraXBwZWQgYmFzZWQgdXBvbiB0aGUgcGxhdGZvcm0uCitUbyBydW4gdGhlIHRlc3RzLAorJCBtYWtlIGxpYm9tcC1taWNyby10ZXN0cworCis9PT09PT09PT09PT09CitDTWFrZSBvcHRpb25zCis9PT09PT09PT09PT09CistRENNQUtFX0NfQ09NUElMRVI9PEMgY29tcGlsZXIgbmFtZT4KK1NwZWNpZnkgdGhlIEMgY29tcGlsZXIKKworLURDTUFLRV9DWFhfQ09NUElMRVI9PEMrKyBjb21waWxlciBuYW1lPgorU3BlY2lmeSB0aGUgQysrIGNvbXBpbGVyCisKKy1EQ01BS0VfRm9ydHJhbl9DT01QSUxFUj08Rm9ydHJhbiBjb21waWxlciBuYW1lPgorVGhpcyBvcHRpb24gaXMgb25seSBuZWVkZWQgd2hlbiAtRExJQk9NUF9GT1JUUkFOX01PRFVMRVMgaXMgb24uCitTbyB0eXBpY2FsbHksIGEgRm9ydHJhbiBjb21waWxlciBpcyBub3QgbmVlZGVkIGR1cmluZyB0aGUgYnVpbGQuCitTcGVjaWZ5IHRoZSBGb3J0cmFuIGNvbXBpbGVyCisKKy1EQ01BS0VfQVNNX01BU01fQ09NUElMRVI9W21sIHwgbWw2NCBdCitUaGlzIG9wdGlvbiBpcyBXaW5kb3dzKiBPbmx5CisKKy1ETElCT01QX0FSQ0g9aTM4Nnx4ODZfNjR8YXJtfHBwYzY0fHBwYzY0bGV8YWFyY2g2NHxtaWMKK1RoZSBkZWZhdWx0IGZvciB0aGUgb3B0aW9uIGlzIGNob3NlbiBiYXNlZCBvbiB0aGUgcHJvYmluZyB0aGUgY29tcGlsZXIgZm9yIAorYXJjaGl0ZWN0dXJlIG1hY3JvcyAoZS5nLiwgaXMgX194ODZfNjRfXyBwcmVkZWZpbmVkIGJ5IGNvbXBpbGVyPykuCisKKz09PT0gRmlyc3QgdmFsdWVzIGxpc3RlZCBhcmUgdGhlIGRlZmF1bHQgdmFsdWUgPT09PQorLURMSUJPTVBfTElCX1RZUEU9bm9ybWFsfHByb2ZpbGV8c3R1YnMKK0xpYnJhcnkgdHlwZSBjYW4gYmUgbm9ybWFsLCBwcm9maWxlLCBvciBzdHVicy4KKworLURDTUFLRV9CVUlMRF9UWVBFPVJlbGVhc2V8RGVidWd8UmVsV2l0aERlYkluZm8KK0J1aWxkIHR5cGUgY2FuIGJlIFJlbGVhc2UsIERlYnVnLCBvciBSZWxXaXRoRGViSW5mby4KKworLURMSUJPTVBfT01QX1ZFUlNJT049NDF8NDB8MzAKK09wZW5NUCB2ZXJzaW9uIGNhbiBiZSBlaXRoZXIgNDEsIDQwIG9yIDMwLgorCistRExJQk9NUF9NSUNfQVJDSD1rbmN8a25mCitUaGlzIHZhbHVlIGlzIGlnbm9yZWQgaWYgTElCT01QX0FSQ0ggIT0gbWljCitJbnRlbChSKSBNSUMgQXJjaGl0ZWN0dXJlLCBjYW4gYmUga25mIG9yIGtuYy4KKyAgCistRExJQk9NUF9GT1JUUkFOX01PRFVMRVM9b2ZmfG9uCitTaG91bGQgdGhlIEZvcnRyYW4gbW9kdWxlcyBiZSBjcmVhdGVkIChyZXF1aXJlcyBGb3J0cmFuIGNvbXBpbGVyKQorCistRExJQk9NUF9VU0VfQURBUFRJVkVfTE9DS1M9b258b2ZmICAgICAgIAorU2hvdWxkIGFkYXB0aXZlIChUU1gtYmFzZWQpIGxvY2tzIGJlIGluY2x1ZGVkPyAgCitUaGVzZSBhcmUgeDg2IHNwZWNpZmljLiAgVGhpcyBmZWF0dXJlIGlzIHR1cm5lZCBvbiBieSBkZWZhdWx0IAorZm9yIGkzODYgYW5kIHg4Nl82NC4gIE90aGVyd2lzZSwgaXQgaXMgdHVybmVkIG9mZi4KKworLURMSUJPTVBfVVNFX0lOVEVSTk9ERV9BTElHTk1FTlQ9b2ZmfG9uCitTaG91bGQgNDA5Ni1ieXRlIGFsaWdubWVudCBiZSB1c2VkIGZvciBjZXJ0YWluIGRhdGEgc3RydWN0dXJlcz8KK1RoaXMgb3B0aW9uIGlzIHVzZWZ1bCBvbiBtdWx0aW5vZGUgc3lzdGVtcyB3aGVyZSBhIHNtYWxsIENBQ0hFX0xJTkUKK3NldHRpbmcgbGVhZHMgdG8gZmFsc2Ugc2hhcmluZy4gIFRoaXMgb3B0aW9uIGlzIG9mZiBieSBkZWZhdWx0LgorCistRExJQk9NUF9VU0VfVkVSU0lPTl9TWU1CT0xTPW9ufG9mZgorU2hvdWxkIHZlcnNpb25lZCBzeW1ib2xzIGJlIHVzZWQgZm9yIGJ1aWxkaW5nIHRoZSBsaWJyYXJ5PworVGhpcyBvcHRpb24gb25seSBtYWtlcyBzZW5zZSBmb3IgRUxGIGJhc2VkIGxpYnJhcmllcyB3aGVyZSB2ZXJzaW9uCitzeW1ib2xzIGFyZSBzdXBwb3J0ZWQgKExpbnV4LCBzb21lIEJTRCogdmFyaWFudHMpLiAgSXQgaXMgb2ZmCitieSBkZWZhdWx0IGZvciBXaW5kb3dzIGFuZCBNYWMsIGJ1dCBvbiBmb3Igb3RoZXIgVW5peCBiYXNlZCBvcGVyYXRpbmcKK3N5c3RlbXMuCisKKy1ETElCT01QX09NUFRfU1VQUE9SVD1vZmZ8b24KK1Nob3VsZCBPTVBUIHN1cHBvcnQgYmUgaW5jbHVkZWQgaW4gdGhlIGJ1aWxkPyAoTm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzKQorSWYgTElCT01QX09NUFRfU1VQUE9SVCBpcyBvZmYsIHRoZW4gYm90aCBvbXB0X2JsYW1lIGFuZCBvbXB0X3RyYWNlIGFyZSBpZ25vcmVkLgorCistRExJQk9NUF9PTVBUX0JMQU1FPW9ufG9mZgorU2hvdWxkIE9NUFQgYmxhbWUgZnVuY3Rpb25hbGl0eSBiZSBpbmNsdWRlZCBpbiB0aGUgYnVpbGQ/CisKKy1ETElCT01QX09NUFRfVFJBQ0U9b258b2ZmCitTaG91bGQgT01QVCB0cmFjZSBmdW5jdGlvbmFsaXR5IGJlIGluY2x1ZGVkIGluIHRoZSBidWlsZD8KKworLURMSUJPTVBfU1RBVFM9b2ZmfG9uCitTaG91bGQgaW5jbHVkZSBzdGF0cy1nYXRoZXJpbmcgY29kZSBiZSBpbmNsdWRlZCBpbiB0aGUgYnVpbGQ/CisKKy1ETElCT01QX1VTRV9ERUJVR0dFUj1vZmZ8b24KK1Nob3VsZCB0aGUgZnJpZW5kbHkgZGVidWdnZXIgaW50ZXJmYWNlIGJlIGluY2x1ZGVkIGluIHRoZSBidWlsZD8KKworLURMSUJPTVBfVVNFX0hXTE9DPW9mZnxvbgorU2hvdWxkIHRoZSBId2xvYyBsaWJyYXJ5IGJlIHVzZWQgZm9yIGFmZmluaXR5PworVGhpcyBvcHRpb24gaXMgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzLgoraHR0cDovL3d3dy5vcGVuLW1waS5vcmcvcHJvamVjdHMvaHdsb2MKKworLURMSUJPTVBfSFdMT0NfSU5TVEFMTF9ESVI9L3BhdGgvdG8vaHdsb2MvaW5zdGFsbC9kaXIKK0RlZmF1bHQ6IC91c3IvbG9jYWwKK1RoaXMgb3B0aW9uIGlzIG9ubHkgdXNlZCBpZiBMSUJPTVBfVVNFX0hXTE9DIGlzIG9uLgorU3BlY2lmaWVzIGluc3RhbGwgbG9jYXRpb24gb2YgSHdsb2MuIFRoZSBjb25maWd1cmF0aW9uIHN5c3RlbSB3aWxsIGxvb2sgZm9yCitod2xvYy5oIGluICR7TElCT01QX0hXTE9DX0lOU1RBTExfRElSfS9pbmNsdWRlIGFuZCB0aGUgbGlicmFyeSBpbiAKKyR7TElCT01QX0hXTE9DX0lOU1RBTExfRElSfS9saWIuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitIb3cgdG8gYXBwZW5kIGZsYWdzIHRvIHRoZSBidWlsZAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0gVGhlc2UgZmxhZ3MgYXJlICphcHBlbmRlZCouICBUaGV5IGRvIG5vdCAKKyAgb3ZlcndyaXRlIGFueSBvZiB0aGUgcHJlc2V0IGZsYWdzLgorLURMSUJPTVBfQ1BQRkxBR1M9PHNwYWNlLXNlcGFyYXRlZCBmbGFncz4gLS0gQWRkaXRpb25hbCBDIHByZXByb2Nlc3NvciBmbGFncworLURMSUJPTVBfQ0ZMQUdTPTxzcGFjZS1zZXBhcmF0ZWQgZmxhZ3M+ICAgLS0gQWRkaXRpb25hbCBDIGNvbXBpbGVyIGZsYWdzCistRExJQk9NUF9DWFhGTEFHUz08c3BhY2Utc2VwYXJhdGVkIGZsYWdzPiAtLSBBZGRpdGlvbmFsIEMrKyBjb21waWxlciBmbGFncworLURMSUJPTVBfQVNNRkxBR1M9PHNwYWNlLXNlcGFyYXRlZCBmbGFncz4gLS0gQWRkaXRpb25hbCBhc3NlbWJseSBmbGFncworLURMSUJPTVBfTERGTEFHUz08c3BhY2Utc2VwYXJhdGVkIGZsYWdzPiAgLS0gQWRkaXRpb25hbCBsaW5rZXIgZmxhZ3MKKy1ETElCT01QX0xJQkZMQUdTPTxzcGFjZS1zZXBhcmF0ZWQgZmxhZ3M+IC0tIEFkZGl0aW9uYWwgbGlicmFyaWVzIHRvIGxpbmsKKy1ETElCT01QX0ZGTEFHUz08c3BhY2Utc2VwYXJhdGVkIGZsYWdzPiAgIC0tIEFkZGl0aW9uYWwgRm9ydHJhbiBjb21waWxlciBmbGFncworCis9PT09PT09PT09PT09PT09PT09PT09PQorRXhhbXBsZSB1c2FnZXMgb2YgQ01ha2UKKz09PT09PT09PT09PT09PT09PT09PT09CistLS0tIFR5cGljYWwgdXNhZ2UgLS0tLQorY21ha2UgLURDTUFLRV9DX0NPTVBJTEVSPWljYyAtRENNQUtFX0NYWF9DT01QSUxFUj1pY3BjIC4uCitjbWFrZSAtRENNQUtFX0NfQ09NUElMRVI9Z2NjIC1EQ01BS0VfQ1hYX0NPTVBJTEVSPWcrKyAuLgorY21ha2UgLURDTUFLRV9DX0NPTVBJTEVSPWNsYW5nIC1EQ01BS0VfQ1hYX0NPTVBJTEVSPWNsYW5nKysgLi4KKworLS0tLSBXaXRoIFZhcmlvdXMgT3B0aW9ucyAtLS0tCistIEJ1aWxkIHRoZSBpMzg2IExpbnV4IGxpYnJhcnkgdXNpbmcgR0NDKgorY21ha2UgLURDTUFLRV9DX0NPTVBJTEVSPWdjYyAtRENNQUtFX0NYWF9DT01QSUxFUj1nKysgLURMSUJPTVBfQVJDSD1pMzg2IC4uCisKKy0gQnVpbGQgdGhlIHg4Nl82NCBkZWJ1ZyBNYWMgbGlicmFyeSB1c2luZyBDbGFuZyoKK2NtYWtlIC1EQ01BS0VfQ19DT01QSUxFUj1jbGFuZyAtRENNQUtFX0NYWF9DT01QSUxFUj1jbGFuZysrIC1ETElCT01QX0FSQ0g9eDg2XzY0IC1EQ01BS0VfQlVJTERfVFlQRT1EZWJ1ZyAuLgorCistIEJ1aWxkIHRoZSBsaWJyYXJ5IChhcmNoaXRlY3R1cmUgZGV0ZXJtaW5lZCBieSBwcm9iaW5nIGNvbXBpbGVyKSB1c2luZyB0aGUKKyAgSW50ZWwoUikgQyBDb21waWxlciBhbmQgdGhlIEludGVsKFIpIEMrKyBDb21waWxlci4gQWxzbywgY3JlYXRlIHRoZSBmb3J0cmFuIG1vZHVsZXMgdXNpbmcKKyAgdGhlIEludGVsKFIpIEZvcnRyYW4gQ29tcGlsZXIuCitjbWFrZSAtRENNQUtFX0NfQ09NUElMRVI9aWNjIC1EQ01BS0VfQ1hYX0NPTVBJTEVSPWljcGMgLURDTUFLRV9Gb3J0cmFuX0NPTVBJTEVSPWlmb3J0IC1ETElCT01QX0ZPUlRSQU5fTU9EVUxFUz1vbiAuLgorCistIEhhdmUgQ01ha2UgRmluZCB0aGUgQy9DKysgY29tcGlsZXIsIGFuZCBzcGVjaWZ5IGFkZGl0aW9uYWwgZmxhZ3MgZm9yIHRoZSBDIGNvbXBpbGVyLCBwcmVwcm9jZXNzb3IsIGFuZCBDKysgY29tcGlsZXIuCitjbWFrZSAtRExJQk9NUF9DRkxBR1M9Jy1zcGVjaWZpYy1mbGFnJyAtRExJQk9NUF9DUFBGTEFHUz0nLURORVdfRkVBVFVSRT0xIC1ET0xEX0ZFQVRVUkU9MCcgLURMSUJPTVBfQ1hYRkxBR1M9Jy0tb25lLXNwZWNpZmljLWZsYWcgLS10d28tc3BlY2lmaWMtZmxhZycgLi4KKworLS0tLSBCdWlsZCB0aGUgc3R1YnMgbGlicmFyeSAtLS0tCitjbWFrZSAtRENNQUtFX0NfQ09NUElMRVI9Z2NjIC1EQ01BS0VfQ1hYX0NPTVBJTEVSPWcrKyAtRExJQk9NUF9MSUJfVFlQRT1zdHVicyAuLgorCis9PT09PT09PT0KK0Zvb3Rub3RlcworPT09PT09PT09CitbKl0gT3RoZXIgbmFtZXMgYW5kIGJyYW5kcyBtYXkgYmUgY2xhaW1lZCBhcyB0aGUgcHJvcGVydHkgb2Ygb3RoZXJzLgpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9DTWFrZUxpc3RzLnR4dCBiL2ZpbmFsL3J1bnRpbWUvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM4MGFiNQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwzNDEgQEAKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworIyBDTUFLRSBsaWJvbXAKK2NtYWtlX21pbmltdW1fcmVxdWlyZWQoVkVSU0lPTiAyLjggRkFUQUxfRVJST1IpCisKKyMgQWRkIGNtYWtlIGRpcmVjdG9yeSB0byBzZWFyY2ggZm9yIGN1c3RvbSBjbWFrZSBmdW5jdGlvbnMKK3NldChDTUFLRV9NT0RVTEVfUEFUSCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vY21ha2UgJHtDTUFLRV9NT0RVTEVfUEFUSH0pCisKKyMgU3RhbmRhbG9uZSBidWlsZCBvciBwYXJ0IG9mIExMVk0/CitzZXQoTElCT01QX1NUQU5EQUxPTkVfQlVJTEQgRkFMU0UpCitpZigiJHtDTUFLRV9TT1VSQ0VfRElSfSIgU1RSRVFVQUwgIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfSIgT1IKKyAgICIke0NNQUtFX1NPVVJDRV9ESVJ9L3J1bnRpbWUiIFNUUkVRVUFMICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0iKQorICBwcm9qZWN0KGxpYm9tcCBDIENYWCkKKyAgc2V0KExJQk9NUF9TVEFOREFMT05FX0JVSUxEIFRSVUUpCitlbmRpZigpCisKKyMgU2V0IGxpYm9tcCB2ZXJzaW9uCitzZXQoTElCT01QX1ZFUlNJT05fTUFKT1IgNSkKK3NldChMSUJPTVBfVkVSU0lPTl9NSU5PUiAwKQorCisjIFRoZXNlIGluY2x1ZGUgZmlsZXMgYXJlIGluIHRoZSBjbWFrZS8gc3ViZGlyZWN0b3J5CitpbmNsdWRlKExpYm9tcFV0aWxzKQoraW5jbHVkZShMaWJvbXBHZXRBcmNoaXRlY3R1cmUpCitpbmNsdWRlKExpYm9tcEhhbmRsZUZsYWdzKQoraW5jbHVkZShMaWJvbXBEZWZpbml0aW9ucykKKworIyBEZXRlcm1pbmUgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUKK2lmKCR7TElCT01QX1NUQU5EQUxPTkVfQlVJTER9KQorICAjIElmIGFkZGluZyBhIG5ldyBhcmNoaXRlY3R1cmUsIHRha2UgYSBsb29rIGF0IGNtYWtlL0xpYm9tcEdldEFyY2hpdGVjdHVyZS5jbWFrZQorICBsaWJvbXBfZ2V0X2FyY2hpdGVjdHVyZShMSUJPTVBfREVURUNURURfQVJDSCkKKyAgc2V0KExJQk9NUF9BUkNIICR7TElCT01QX0RFVEVDVEVEX0FSQ0h9IENBQ0hFIFNUUklORworICAgICJUaGUgYXJjaGl0ZWN0dXJlIHRvIGJ1aWxkIGZvciAoeDg2XzY0L2kzODYvYXJtL3BwYzY0L3BwYzY0bGUvYWFyY2g2NC9taWMpLiIpCisgICMgQWxsb3cgdXNlciB0byBjaG9vc2UgYSBzdWZmaXggZm9yIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LgorICBzZXQoTElCT01QX0xJQkRJUl9TVUZGSVggIiIgQ0FDSEUgU1RSSU5HCisgICAgInN1ZmZpeCBvZiBsaWIgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBlLmcuLCA2NCA9PiBsaWI2NCIpCisgICMgU2hvdWxkIGFzc2VydGlvbnMgYmUgZW5hYmxlZD8gIFRoZXkgYXJlIG9uIGJ5IGRlZmF1bHQuCisgIHNldChMSUJPTVBfRU5BQkxFX0FTU0VSVElPTlMgVFJVRSBDQUNIRSBCT09MCisgICAgImVuYWJsZSBhc3NlcnRpb25zPyIpCisgIHNldChMSUJPTVBfRU5BQkxFX1dFUlJPUiBGQUxTRSBDQUNIRSBCT09MCisgICAgIkVuYWJsZSAtV2Vycm9yIGZsYWdzIHRvIHR1cm4gd2FybmluZ3MgaW50byBlcnJvcnMgZm9yIHN1cHBvcnRpbmcgY29tcGlsZXJzLiIpCisgICMgQ01BS0VfQlVJTERfVFlQRSB3YXMgbm90IGRlZmluZWQsIHNldCBkZWZhdWx0IHRvIFJlbGVhc2UKKyAgaWYoTk9UIENNQUtFX0JVSUxEX1RZUEUpCisgICAgc2V0KENNQUtFX0JVSUxEX1RZUEUgUmVsZWFzZSkKKyAgZW5kaWYoKQorZWxzZSgpICMgUGFydCBvZiBMTFZNIGJ1aWxkCisgICMgRGV0ZXJtaW5lIHRoZSBuYXRpdmUgYXJjaGl0ZWN0dXJlIGZyb20gTExWTS4KKyAgc3RyaW5nKFRPTE9XRVIgIiR7TExWTV9UQVJHRVRfQVJDSH0iIExJQk9NUF9OQVRJVkVfQVJDSCkKKyAgaWYoIExJQk9NUF9OQVRJVkVfQVJDSCBTVFJFUVVBTCAiaG9zdCIgKQorICAgIHN0cmluZyhSRUdFWCBNQVRDSCAiXlteLV0qIiBMSUJPTVBfTkFUSVZFX0FSQ0ggJHtMTFZNX0hPU1RfVFJJUExFfSkKKyAgZW5kaWYgKCkKKyAgaWYoTElCT01QX05BVElWRV9BUkNIIE1BVENIRVMgImlbMi02XTg2IikKKyAgICBzZXQoTElCT01QX0FSQ0ggaTM4NikKKyAgZWxzZWlmKExJQk9NUF9OQVRJVkVfQVJDSCBTVFJFUVVBTCAieDg2IikKKyAgICBzZXQoTElCT01QX0FSQ0ggaTM4NikKKyAgZWxzZWlmKExJQk9NUF9OQVRJVkVfQVJDSCBTVFJFUVVBTCAiYW1kNjQiKQorICAgIHNldChMSUJPTVBfQVJDSCB4ODZfNjQpCisgIGVsc2VpZihMSUJPTVBfTkFUSVZFX0FSQ0ggU1RSRVFVQUwgIng4Nl82NCIpCisgICAgc2V0KExJQk9NUF9BUkNIIHg4Nl82NCkKKyAgZWxzZWlmKExJQk9NUF9OQVRJVkVfQVJDSCBNQVRDSEVTICJwb3dlcnBjIikKKyAgICBzZXQoTElCT01QX0FSQ0ggcHBjNjQpCisgIGVsc2VpZihMSUJPTVBfTkFUSVZFX0FSQ0ggTUFUQ0hFUyAiYWFyY2g2NCIpCisgICAgc2V0KExJQk9NUF9BUkNIIGFhcmNoNjQpCisgIGVsc2VpZihMSUJPTVBfTkFUSVZFX0FSQ0ggTUFUQ0hFUyAiYXJtNjQiKQorICAgIHNldChMSUJPTVBfQVJDSCBhYXJjaDY0KQorICBlbHNlaWYoTElCT01QX05BVElWRV9BUkNIIE1BVENIRVMgImFybSIpCisgICAgc2V0KExJQk9NUF9BUkNIIGFybSkKKyAgZWxzZSgpCisgICAgIyBsYXN0IGRpdGNoIGVmZm9ydAorICAgIGxpYm9tcF9nZXRfYXJjaGl0ZWN0dXJlKExJQk9NUF9BUkNIKQorICBlbmRpZiAoKQorICBzZXQoTElCT01QX0xJQkRJUl9TVUZGSVggJHtMTFZNX0xJQkRJUl9TVUZGSVh9KQorICBzZXQoTElCT01QX0VOQUJMRV9BU1NFUlRJT05TICR7TExWTV9FTkFCTEVfQVNTRVJUSU9OU30pCisgIHNldChMSUJPTVBfRU5BQkxFX1dFUlJPUiAke0xMVk1fRU5BQkxFX1dFUlJPUn0pCitlbmRpZigpCitsaWJvbXBfY2hlY2tfdmFyaWFibGUoTElCT01QX0FSQ0ggMzJlIHg4Nl82NCAzMiBpMzg2IGFybSBwcGM2NCBwcGM2NGxlIGFhcmNoNjQgbWljKQorCitzZXQoTElCT01QX0xJQl9UWVBFIG5vcm1hbCBDQUNIRSBTVFJJTkcKKyAgIlBlcmZvcm1hbmNlLFByb2ZpbGluZyxTdHVicyBsaWJyYXJ5IChub3JtYWwvcHJvZmlsZS9zdHVicykiKQorbGlib21wX2NoZWNrX3ZhcmlhYmxlKExJQk9NUF9MSUJfVFlQRSBub3JtYWwgcHJvZmlsZSBzdHVicykKK3NldChMSUJPTVBfT01QX1ZFUlNJT04gNDEgQ0FDSEUgU1RSSU5HCisgICJUaGUgT3Blbk1QIHZlcnNpb24gKDQxLzQwLzMwKSIpCitsaWJvbXBfY2hlY2tfdmFyaWFibGUoTElCT01QX09NUF9WRVJTSU9OIDQxIDQwIDMwKQorIyBTZXQgdGhlIE9wZW5NUCBZZWFyIGFuZCBNb250aCBhc3Npb2NpYXRlZCB3aXRoIHZlcnNpb24KK2lmKCR7TElCT01QX09NUF9WRVJTSU9OfSBHUkVBVEVSIDQwIE9SICR7TElCT01QX09NUF9WRVJTSU9OfSBFUVVBTCA0MCkKKyAgc2V0KExJQk9NUF9PTVBfWUVBUl9NT05USCAyMDEzMDcpCitlbHNlaWYoJHtMSUJPTVBfT01QX1ZFUlNJT059IEdSRUFURVIgMzAgT1IgJHtMSUJPTVBfT01QX1ZFUlNJT059IEVRVUFMIDMwKQorICBzZXQoTElCT01QX09NUF9ZRUFSX01PTlRIIDIwMTEwNykKK2Vsc2UoKQorICBzZXQoTElCT01QX09NUF9ZRUFSX01PTlRIIDIwMDUwNSkKK2VuZGlmKCkKK3NldChMSUJPTVBfTUlDX0FSQ0gga25jIENBQ0hFIFNUUklORworICAiSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlIChJbnRlbChSKSBNSUMgQXJjaGl0ZWN0dXJlKSAoa25mL2tuYykuICBJZ25vcmVkIGlmIG5vdCBJbnRlbChSKSBNSUMgQXJjaGl0ZWN0dXJlIGJ1aWxkLiIpCitpZigiJHtMSUJPTVBfQVJDSH0iIFNUUkVRVUFMICJtaWMiKQorICBsaWJvbXBfY2hlY2tfdmFyaWFibGUoTElCT01QX01JQ19BUkNIIGtuZiBrbmMpCitlbmRpZigpCitzZXQoTElCT01QX0ZPUlRSQU5fTU9EVUxFUyBGQUxTRSBDQUNIRSBCT09MCisgICJDcmVhdGUgRm9ydHJhbiBtb2R1bGUgZmlsZXM/IChyZXF1aXJlcyBmb3J0cmFuIGNvbXBpbGVyKSIpCisKKyMgLSBTdXBwb3J0IGZvciB1bml2ZXJzYWwgZmF0IGJpbmFyeSBidWlsZHMgb24gTWFjCisjIC0gSGF2aW5nIHRoaXMgZXh0cmEgdmFyaWFibGUgYWxsb3dzIHBlb3BsZSB0byBidWlsZCB0aGlzIGxpYnJhcnkgYXMgYSB1bml2ZXJzYWwgbGlicmFyeQorIyAgIHdpdGhvdXQgZm9yY2luZyBhIHVuaXZlcnNhbCBidWlsZCBvZiB0aGUgbGx2bS9jbGFuZyBjb21waWxlci4KK3NldChMSUJPTVBfT1NYX0FSQ0hJVEVDVFVSRVMgIiR7Q01BS0VfT1NYX0FSQ0hJVEVDVFVSRVN9IiBDQUNIRSBTVFJJTkcKKyAgIkZvciBNYWMgYnVpbGRzLCBzZW1pY29sb24gc2VwYXJhdGVkIGxpc3Qgb2YgYXJjaGl0ZWN0dXJlcyB0byBidWlsZCBmb3IgdW5pdmVyc2FsIGZhdCBiaW5hcnkuIikKK3NldChDTUFLRV9PU1hfQVJDSElURUNUVVJFUyAke0xJQk9NUF9PU1hfQVJDSElURUNUVVJFU30pCisKKyMgVXNlciBzcGVjaWZpZWQgZmxhZ3MuICBUaGVzZSBhcmUgYXBwZW5kZWQgdG8gdGhlIGNvbmZpZ3VyZWQgZmxhZ3MuCitzZXQoTElCT01QX0NGTEFHUyAiIiBDQUNIRSBTVFJJTkcKKyAgIkFwcGVuZGVkIHVzZXIgc3BlY2lmaWVkIEMgY29tcGlsZXIgZmxhZ3MuIikKK3NldChMSUJPTVBfQ1hYRkxBR1MgIiIgQ0FDSEUgU1RSSU5HCisgICJBcHBlbmRlZCB1c2VyIHNwZWNpZmllZCBDKysgY29tcGlsZXIgZmxhZ3MuIikKK3NldChMSUJPTVBfQ1BQRkxBR1MgIiIgQ0FDSEUgU1RSSU5HCisgICJBcHBlbmRlZCB1c2VyIHNwZWNpZmllZCBDIHByZXByb2Nlc3NvciBmbGFncy4iKQorc2V0KExJQk9NUF9BU01GTEFHUyAiIiBDQUNIRSBTVFJJTkcKKyAgIkFwcGVuZGVkIHVzZXIgc3BlY2lmaWVkIGFzc2VtYmxlciBmbGFncy4iKQorc2V0KExJQk9NUF9MREZMQUdTICIiIENBQ0hFIFNUUklORworICAiQXBwZW5kZWQgdXNlciBzcGVjaWZpZWQgbGlua2VyIGZsYWdzLiIpCitzZXQoTElCT01QX0xJQkZMQUdTICIiIENBQ0hFIFNUUklORworICAiQXBwZW5kZWQgdXNlciBzcGVjaWZpZWQgbGlua2VkIGxpYnMgZmxhZ3MuIChlLmcuLCAtbG0pIikKK3NldChMSUJPTVBfRkZMQUdTICIiIENBQ0hFIFNUUklORworICAiQXBwZW5kZWQgdXNlciBzcGVjaWZpZWQgRm9ydHJhbiBjb21waWxlciBmbGFncy4gIFRoZXNlIGFyZSBvbmx5IHVzZWQgaWYgTElCT01QX0ZPUlRSQU5fTU9EVUxFUz09VFJVRS4iKQorCisjIFNob3VsZCB0aGUgbGlib21wIGxpYnJhcnkgYW5kIGdlbmVyYXRlZCBoZWFkZXJzIGJlIGNvcGllZCBpbnRvIHRoZSBvcmlnaW5hbCBzb3VyY2UgZXhwb3J0cy8gZGlyZWN0b3J5CisjIFR1cm5pbmcgdGhpcyB0byBGQUxTRSBhaWRzIHBhcmFsbGVsIGJ1aWxkcyB0byBub3QgaW50ZXJmZXJlIHdpdGggZWFjaCBvdGhlci4KKyMgQ3VycmVudGx5LCB0aGUgdGVzdHN1aXRlIG1vZHVsZSBleHBlY3RzIHRoZSBqdXN0IGJ1aWx0IE9wZW5NUCBsaWJyYXJ5IHRvIGJlIGxvY2F0ZWQgaW5zaWRlIHRoZSBleHBvcnRzLworIyBkaXJlY3RvcnkuICBUT0RPOiBoYXZlIHRlc3RzdWl0ZSBydW4gdW5kZXIgbGx2bS1saXQgZGlyZWN0bHkuICBXZSBjYW4gdGhlbiBnZXQgcmlkIG9mIGNvcHlpbmcgdG8gZXhwb3J0cy8KK3NldChMSUJPTVBfQ09QWV9FWFBPUlRTIFRSVUUgQ0FDSEUgU1RSSU5HCisgICJTaG91bGQgZXhwb3J0cyBiZSBjb3BpZWQgaW50byBzb3VyY2UgZXhwb3J0cy8gZGlyZWN0b3J5PyIpCisKKyMgSFdMT0Mtc3VwcG9ydAorc2V0KExJQk9NUF9VU0VfSFdMT0MgRkFMU0UgQ0FDSEUgQk9PTAorICAiVXNlIEh3bG9jIChodHRwOi8vd3d3Lm9wZW4tbXBpLm9yZy9wcm9qZWN0cy9od2xvYy8pIGxpYnJhcnkgZm9yIGFmZmluaXR5PyIpCitzZXQoTElCT01QX0hXTE9DX0lOU1RBTExfRElSIC91c3IvbG9jYWwgQ0FDSEUgUEFUSAorICAiSW5zdGFsbCBwYXRoIGZvciBod2xvYyBsaWJyYXJ5IikKKworIyBHZXQgdGhlIGJ1aWxkIG51bWJlciBmcm9tIGttcF92ZXJzaW9uLmMKK2xpYm9tcF9nZXRfYnVpbGRfbnVtYmVyKCIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0iIExJQk9NUF9WRVJTSU9OX0JVSUxEKQorbWF0aChFWFBSIExJQk9NUF9WRVJTSU9OX0JVSUxEX1lFQVIgIiR7TElCT01QX1ZFUlNJT05fQlVJTER9LzEwMDAwIikKK21hdGgoRVhQUiBMSUJPTVBfVkVSU0lPTl9CVUlMRF9NT05USF9EQVkgIiR7TElCT01QX1ZFUlNJT05fQlVJTER9JTEwMDAwIikKKworIyBDdXJyZW50bHkgZG9uJ3QgcmVjb3JkIGFueSB0aW1lc3RhbXBzCitzZXQoTElCT01QX0JVSUxEX0RBVEUgIk5vX1RpbWVzdGFtcCIpCisKKyMgQXJjaGl0ZWN0dXJlCitzZXQoSUEzMiBGQUxTRSkKK3NldChJTlRFTDY0IEZBTFNFKQorc2V0KEFSTSBGQUxTRSkKK3NldChBQVJDSDY0IEZBTFNFKQorc2V0KFBQQzY0QkUgRkFMU0UpCitzZXQoUFBDNjRMRSBGQUxTRSkKK3NldChQUEM2NCBGQUxTRSkKK3NldChNSUMgRkFMU0UpCitpZigiJHtMSUJPTVBfQVJDSH0iIFNUUkVRVUFMICJpMzg2IiBPUiAiJHtMSUJPTVBfQVJDSH0iIFNUUkVRVUFMICIzMiIpICAgICMgSUEtMzIgYXJjaGl0ZWN0dXJlCisgIHNldChJQTMyIFRSVUUpCitlbHNlaWYoIiR7TElCT01QX0FSQ0h9IiBTVFJFUVVBTCAieDg2XzY0IiBPUiAiJHtMSUJPTVBfQVJDSH0iIFNUUkVRVUFMICIzMmUiKSAjIEludGVsKFIpIDY0IGFyY2hpdGVjdHVyZQorICBzZXQoSU5URUw2NCBUUlVFKQorZWxzZWlmKCIke0xJQk9NUF9BUkNIfSIgU1RSRVFVQUwgImFybSIpICMgQVJNIGFyY2hpdGVjdHVyZQorICBzZXQoQVJNIFRSVUUpCitlbHNlaWYoIiR7TElCT01QX0FSQ0h9IiBTVFJFUVVBTCAicHBjNjQiKSAjIFBQQzY0QkUgYXJjaGl0ZWN0dXJlCisgIHNldChQUEM2NEJFIFRSVUUpCisgIHNldChQUEM2NCBUUlVFKQorZWxzZWlmKCIke0xJQk9NUF9BUkNIfSIgU1RSRVFVQUwgInBwYzY0bGUiKSAjIFBQQzY0TEUgYXJjaGl0ZWN0dXJlCisgIHNldChQUEM2NExFIFRSVUUpCisgIHNldChQUEM2NCBUUlVFKQorZWxzZWlmKCIke0xJQk9NUF9BUkNIfSIgU1RSRVFVQUwgImFhcmNoNjQiKSAjIEFBUkNINjQgYXJjaGl0ZWN0dXJlCisgIHNldChBQVJDSDY0IFRSVUUpCitlbHNlaWYoIiR7TElCT01QX0FSQ0h9IiBTVFJFUVVBTCAibWljIikgIyBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUKKyAgc2V0KE1JQyBUUlVFKQorZW5kaWYoKQorCisjIFNldCBzb21lIGZsYWdzIGJhc2VkIG9uIGJ1aWxkX3R5cGUKK3NldChSRUxFQVNFX0JVSUxEIEZBTFNFKQorc2V0KERFQlVHX0JVSUxEIEZBTFNFKQorc2V0KFJFTFdJVEhERUJJTkZPX0JVSUxEIEZBTFNFKQorc2V0KE1JTlNJWkVSRUxfQlVJTEQgRkFMU0UpCitzdHJpbmcoVE9MT1dFUiAiJHtDTUFLRV9CVUlMRF9UWVBFfSIgbGlib21wX2J1aWxkX3R5cGVfbG93ZXJjYXNlKQoraWYoIiR7bGlib21wX2J1aWxkX3R5cGVfbG93ZXJjYXNlfSIgU1RSRVFVQUwgInJlbGVhc2UiKQorICBzZXQoUkVMRUFTRV9CVUlMRCBUUlVFKQorZWxzZWlmKCIke2xpYm9tcF9idWlsZF90eXBlX2xvd2VyY2FzZX0iIFNUUkVRVUFMICJkZWJ1ZyIpCisgIHNldChERUJVR19CVUlMRCBUUlVFKQorZWxzZWlmKCIke2xpYm9tcF9idWlsZF90eXBlX2xvd2VyY2FzZX0iIFNUUkVRVUFMICJyZWx3aXRoZGViaW5mbyIpCisgIHNldChSRUxXSVRIREVCSU5GT19CVUlMRCBUUlVFKQorZWxzZWlmKCIke2xpYm9tcF9idWlsZF90eXBlX2xvd2VyY2FzZX0iIFNUUkVRVUFMICJtaW5zaXplcmVsIikKKyAgc2V0KE1JTlNJWkVSRUxfQlVJTEQgVFJVRSkKK2VuZGlmKCkKKworIyBJbmNsdWRlIGl0dCBub3RpZnkgaW50ZXJmYWNlPyBSaWdodCBub3csIGFsd2F5cy4KK3NldChMSUJPTVBfVVNFX0lUVF9OT1RJRlkgVFJVRSkKKworIyBub3JtYWwsIHByb2ZpbGUsIHN0dWJzIGxpYnJhcnkuCitzZXQoTk9STUFMX0xJQlJBUlkgRkFMU0UpCitzZXQoU1RVQlNfTElCUkFSWSBGQUxTRSkKK3NldChQUk9GSUxFX0xJQlJBUlkgRkFMU0UpCitpZigiJHtMSUJPTVBfTElCX1RZUEV9IiBTVFJFUVVBTCAibm9ybWFsIikKKyAgc2V0KE5PUk1BTF9MSUJSQVJZIFRSVUUpCitlbHNlaWYoIiR7TElCT01QX0xJQl9UWVBFfSIgU1RSRVFVQUwgInByb2ZpbGUiKQorICBzZXQoUFJPRklMRV9MSUJSQVJZIFRSVUUpCitlbHNlaWYoIiR7TElCT01QX0xJQl9UWVBFfSIgU1RSRVFVQUwgInN0dWJzIikKKyAgc2V0KFNUVUJTX0xJQlJBUlkgVFJVRSkKK2VuZGlmKCkKKworIyBTZXR0aW5nIGRpcmVjdG9yeSBuYW1lcworc2V0KExJQk9NUF9CQVNFX0RJUiAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0pCitzZXQoTElCT01QX1NSQ19ESVIgJHtMSUJPTVBfQkFTRV9ESVJ9L3NyYykKK3NldChMSUJPTVBfVE9PTFNfRElSICR7TElCT01QX0JBU0VfRElSfS90b29scykKK3NldChMSUJPTVBfSU5DX0RJUiAke0xJQk9NUF9TUkNfRElSfS9pbmNsdWRlLyR7TElCT01QX09NUF9WRVJTSU9OfSkKK3NldChMSUJPTVBfQklOQVJZX0RJUiAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0pCisKKyMgRW5hYmxpbmcgRm9ydHJhbiBpZiBpdCBpcyBuZWVkZWQKK2lmKCR7TElCT01QX0ZPUlRSQU5fTU9EVUxFU30pCisgIGVuYWJsZV9sYW5ndWFnZShGb3J0cmFuKQorZW5kaWYoKQorIyBFbmFibGUgTUFTTSBDb21waWxlciBpZiBpdCBpcyBuZWVkZWQgKFdpbmRvd3Mgb25seSkKK2lmKFdJTjMyKQorICBlbmFibGVfbGFuZ3VhZ2UoQVNNX01BU00pCitlbmRpZigpCisKKyMgR2V0dGluZyBsZWdhbCB0eXBlL2FyY2gKK2xpYm9tcF9nZXRfbGVnYWxfdHlwZShMSUJPTVBfTEVHQUxfVFlQRSkKK2xpYm9tcF9nZXRfbGVnYWxfYXJjaChMSUJPTVBfTEVHQUxfQVJDSCkKKworIyBDb21waWxlciBmbGFnIGNoZWNrcywgbGlicmFyeSBjaGVja3MsIHRocmVhZGluZyBjaGVjaywgZXRjLgoraW5jbHVkZShjb25maWctaXgpCisKKyMgSXMgdGhlcmUgYSBxdWFkIHByZWNpc2lvbiBkYXRhIHR5cGUgYXZhaWxhYmxlPworIyBUT0RPOiBNYWtlIHRoaXMgYSByZWFsIGZlYXR1cmUgY2hlY2sKK3NldChMSUJPTVBfVVNFX1FVQURfUFJFQ0lTSU9OICIke0xJQk9NUF9IQVZFX1FVQURfUFJFQ0lTSU9OfSIgQ0FDSEUgQk9PTAorICAiU2hvdWxkIDEyOC1iaXQgcHJlY2lzaW9uIGVudHJ5IHBvaW50cyBiZSBidWlsdD8iKQoraWYoTElCT01QX1VTRV9RVUFEX1BSRUNJU0lPTiBBTkQgKE5PVCBMSUJPTVBfSEFWRV9RVUFEX1BSRUNJU0lPTikpCisgIGxpYm9tcF9lcnJvcl9zYXkoIjEyOC1iaXQgcXVhZCBwcmVjaXNpb24gZnVuY3Rpb25hbGl0eSByZXF1ZXN0ZWQgYnV0IG5vdCBhdmFpbGFibGUiKQorZW5kaWYoKQorCisjIGxpYmdvbXAgZHJvcC1pbiBjb21wYXRpYmlsaXR5IHJlcXVpcmVzIHZlcnNpb25lZCBzeW1ib2xzCitzZXQoTElCT01QX1VTRV9WRVJTSU9OX1NZTUJPTFMgIiR7TElCT01QX0hBVkVfVkVSU0lPTl9TWU1CT0xTfSIgQ0FDSEUgQk9PTAorICAiU2hvdWxkIHZlcnNpb24gc3ltYm9scyBiZSB1c2VkPyBUaGVzZSBwcm92aWRlIGJpbmFyeSBjb21wYXRpYmlsaXR5IHdpdGggbGliZ29tcC4iKQoraWYoTElCT01QX1VTRV9WRVJTSU9OX1NZTUJPTFMgQU5EIChOT1QgTElCT01QX0hBVkVfVkVSU0lPTl9TWU1CT0xTKSkKKyAgbGlib21wX2Vycm9yX3NheSgiVmVyc2lvbiBzeW1ib2xzIGZ1bmN0aW9uYWxpdHkgcmVxdWVzdGVkIGJ1dCBub3QgYXZhaWxhYmxlIikKK2VuZGlmKCkKKworIyBPbiBtdWx0aW5vZGUgc3lzdGVtcywgbGFyZ2VyIGFsaWdubWVudCBpcyBkZXNpcmVkIHRvIGF2b2lkIGZhbHNlIHNoYXJpbmcKK3NldChMSUJPTVBfVVNFX0lOVEVSTk9ERV9BTElHTk1FTlQgRkFMU0UgQ0FDSEUgQk9PTAorICAiU2hvdWxkIGxhcmdlciBhbGlnbm1lbnQgKDQwOTYgYnl0ZXMpIGJlIHVzZWQgZm9yIHNvbWUgbG9ja3MgYW5kIGRhdGEgc3RydWN0dXJlcz8iKQorCisjIEJ1aWxkIGNvZGUgdGhhdCBhbGxvd3MgdGhlIE9wZW5NUCBsaWJyYXJ5IHRvIGNvbnZlbmllbnRseSBpbnRlcmZhY2Ugd2l0aCBkZWJ1Z2dlcnMKK3NldChMSUJPTVBfVVNFX0RFQlVHR0VSIEZBTFNFIENBQ0hFIEJPT0wKKyAgIkVuYWJsZSBkZWJ1Z2dlciBpbnRlcmZhY2UgY29kZT8iKQorCisjIFNob3VsZCB3ZSBsaW5rIHRvIEMrKyBsaWJyYXJ5Pworc2V0KExJQk9NUF9VU0VfU1REQ1BQTElCIEZBTFNFIENBQ0hFIEJPT0wKKyAgIlNob3VsZCB3ZSBsaW5rIHRvIEMrKyBsaWJyYXJ5PyIpCisKKyMgVFNYICh4ODYpIGJhc2VkIGxvY2tzIGhhdmUgX19hc20gY29kZSB3aGljaCBjYW4gYmUgdHJvdWJsZXNvbWUgZm9yIHNvbWUgY29tcGlsZXJzLgorIyBUT0RPOiBNYWtlIHRoaXMgYSByZWFsIGZlYXR1cmUgY2hlY2sKK3NldChMSUJPTVBfVVNFX0FEQVBUSVZFX0xPQ0tTICIke0xJQk9NUF9IQVZFX0FEQVBUSVZFX0xPQ0tTfSIgQ0FDSEUgQk9PTAorICAiU2hvdWxkIFRTWC1iYXNlZCBsb2NrIGJlIGNvbXBpbGVkIChhZGFwdGl2ZSBsb2NrIGluIGttcF9sb2NrLmNwcCkuICBUaGVzZSBhcmUgeDg2IHNwZWNpZmljLiIpCitpZihMSUJPTVBfVVNFX0FEQVBUSVZFX0xPQ0tTIEFORCAoTk9UIExJQk9NUF9IQVZFX0FEQVBUSVZFX0xPQ0tTKSkKKyAgbGlib21wX2Vycm9yX3NheSgiQWRhcHRpdmUgbG9ja3MgKFRTWCkgZnVuY3Rpb25hbGl0eSByZXF1ZXN0ZWQgYnV0IG5vdCBhdmFpbGFibGUiKQorZW5kaWYoKQorCisjIC0gc3RhdHMtZ2F0aGVyaW5nIGVuYWJsZXMgT3Blbk1QIHN0YXRzIHdoZXJlIHRoaW5ncyBsaWtlIHRoZSBudW1iZXIgb2YKKyMgcGFyYWxsZWwgcmVnaW9ucywgY2xvY2sgdGlja3Mgc3BlbnQgaW4gcGFydGljdWxhciBvcGVubXAgcmVnaW9ucyBhcmUgcmVjb3JkZWQuCitzZXQoTElCT01QX1NUQVRTIEZBTFNFIENBQ0hFIEJPT0wKKyAgIlN0YXRzLUdhdGhlcmluZyBmdW5jdGlvbmFsaXR5PyIpCitpZihMSUJPTVBfU1RBVFMgQU5EIChOT1QgTElCT01QX0hBVkVfU1RBVFMpKQorICBsaWJvbXBfZXJyb3Jfc2F5KCJTdGF0cy1nYXRoZXJpbmcgZnVuY3Rpb25hbGl0eSByZXF1ZXN0ZWQgYnV0IG5vdCBhdmFpbGFibGUiKQorZW5kaWYoKQorIyBUaGUgc3RhdHMgZnVuY3Rpb25hbGl0eSByZXF1aXJlcyB0aGUgc3RkIGMrKyBsaWJyYXJ5CitpZihMSUJPTVBfU1RBVFMpCisgIHNldChMSUJPTVBfVVNFX1NURENQUExJQiBUUlVFKQorZW5kaWYoKQorCisjIE9NUFQtc3VwcG9ydAorc2V0KExJQk9NUF9PTVBUX0RFQlVHIEZBTFNFIENBQ0hFIEJPT0wKKyAgIlRyYWNlIE9NUFQgaW5pdGlhbGl6YXRpb24/IikKK3NldChMSUJPTVBfT01QVF9TVVBQT1JUIEZBTFNFIENBQ0hFIEJPT0wKKyAgIk9NUFQtc3VwcG9ydD8iKQorc2V0KExJQk9NUF9PTVBUX0JMQU1FIFRSVUUgQ0FDSEUgQk9PTAorICAiT01QVC1ibGFtZT8iKQorc2V0KExJQk9NUF9PTVBUX1RSQUNFIFRSVUUgQ0FDSEUgQk9PTAorICAiT01QVC10cmFjZT8iKQoraWYoTElCT01QX09NUFRfU1VQUE9SVCBBTkQgKE5PVCBMSUJPTVBfSEFWRV9PTVBUX1NVUFBPUlQpKQorICBsaWJvbXBfZXJyb3Jfc2F5KCJPcGVuTVAgVG9vbHMgSW50ZXJmYWNlIHJlcXVlc3RlZCBidXQgbm90IGF2YWlsYWJsZSIpCitlbmRpZigpCisKKyMgRXJyb3IgY2hlY2sgaHdsb2Mgc3VwcG9ydCBhZnRlciBjb25maWctaXggaGFzIHJ1bgoraWYoTElCT01QX1VTRV9IV0xPQyBBTkQgKE5PVCBMSUJPTVBfSEFWRV9IV0xPQykpCisgIGxpYm9tcF9lcnJvcl9zYXkoIkh3bG9jIHJlcXVlc3RlZCBidXQgbm90IGF2YWlsYWJsZSIpCitlbmRpZigpCisKKyMgU2V0dGluZyBmaW5hbCBsaWJyYXJ5IG5hbWUKK3NldChMSUJPTVBfREVGQVVMVF9MSUJfTkFNRSBsaWJvbXApCitpZigke1BST0ZJTEVfTElCUkFSWX0pCisgIHNldChMSUJPTVBfREVGQVVMVF9MSUJfTkFNRSAke0xJQk9NUF9ERUZBVUxUX0xJQl9OQU1FfXByb2YpCitlbmRpZigpCitpZigke1NUVUJTX0xJQlJBUll9KQorICBzZXQoTElCT01QX0RFRkFVTFRfTElCX05BTUUgJHtMSUJPTVBfREVGQVVMVF9MSUJfTkFNRX1zdHVicykKK2VuZGlmKCkKK3NldChMSUJPTVBfTElCX05BTUUgJHtMSUJPTVBfREVGQVVMVF9MSUJfTkFNRX0gQ0FDSEUgU1RSSU5HICJCYXNlIE9NUCBsaWJyYXJ5IG5hbWUiKQorc2V0KExJQk9NUF9MSUJfRklMRSAke0xJQk9NUF9MSUJfTkFNRX0ke0NNQUtFX1NIQVJFRF9MSUJSQVJZX1NVRkZJWH0pCisKKyMgUHJpbnQgY29uZmlndXJhdGlvbiBhZnRlciBhbGwgdmFyaWFibGVzIGFyZSBzZXQuCitpZigke0xJQk9NUF9TVEFOREFMT05FX0JVSUxEfSkKKyAgbGlib21wX3NheSgiT3BlcmF0aW5nIFN5c3RlbSAgICAgLS0gJHtDTUFLRV9TWVNURU1fTkFNRX0iKQorICBsaWJvbXBfc2F5KCJUYXJnZXQgQXJjaGl0ZWN0dXJlICAtLSAke0xJQk9NUF9BUkNIfSIpCisgIGlmKCR7TUlDfSkKKyAgICBsaWJvbXBfc2F5KCJJbnRlbChSKSBNSUMgQXJjaGl0ZWN0dXJlICAgIC0tICR7TElCT01QX01JQ19BUkNIfSIpCisgIGVuZGlmKCkKKyAgbGlib21wX3NheSgiQnVpbGQgVHlwZSAgICAgICAgICAgLS0gJHtDTUFLRV9CVUlMRF9UWVBFfSIpCisgIGxpYm9tcF9zYXkoIk9wZW5NUCBWZXJzaW9uICAgICAgIC0tICR7TElCT01QX09NUF9WRVJTSU9OfSIpCisgIGxpYm9tcF9zYXkoIkxpYiBUeXBlICAgICAgICAgICAgIC0tICR7TElCT01QX0xJQl9UWVBFfSIpCisgIGxpYm9tcF9zYXkoIkZvcnRyYW4gTW9kdWxlcyAgICAgIC0tICR7TElCT01QX0ZPUlRSQU5fTU9EVUxFU30iKQorICAjIHdpbGwgc2F5IGRldmVsb3BtZW50IGlmIGFsbCB6ZXJvcworICBpZigke0xJQk9NUF9WRVJTSU9OX0JVSUxEfSBTVFJFUVVBTCAwMDAwMDAwMCkKKyAgICBzZXQoTElCT01QX0JVSUxEIERldmVsb3BtZW50KQorICBlbHNlKCkKKyAgICBzZXQoTElCT01QX0JVSUxEICR7TElCT01QX1ZFUlNJT05fQlVJTER9KQorICBlbmRpZigpCisgIGxpYm9tcF9zYXkoIkJ1aWxkICAgICAgICAgICAgICAgIC0tICR7TElCT01QX0JVSUxEfSIpCisgIGxpYm9tcF9zYXkoIlVzZSBTdGF0cy1nYXRoZXJpbmcgIC0tICR7TElCT01QX1NUQVRTfSIpCisgIGxpYm9tcF9zYXkoIlVzZSBEZWJ1Z2dlci1zdXBwb3J0IC0tICR7TElCT01QX1VTRV9ERUJVR0dFUn0iKQorICBsaWJvbXBfc2F5KCJVc2UgT01QVC1zdXBwb3J0ICAgICAtLSAke0xJQk9NUF9PTVBUX1NVUFBPUlR9IikKKyAgaWYoJHtMSUJPTVBfT01QVF9TVVBQT1JUfSkKKyAgICBsaWJvbXBfc2F5KCJVc2UgT01QVC1ibGFtZSAgICAgICAtLSAke0xJQk9NUF9PTVBUX0JMQU1FfSIpCisgICAgbGlib21wX3NheSgiVXNlIE9NUFQtdHJhY2UgICAgICAgLS0gJHtMSUJPTVBfT01QVF9UUkFDRX0iKQorICBlbmRpZigpCisgIGxpYm9tcF9zYXkoIlVzZSBBZGFwdGl2ZSBsb2NrcyAgIC0tICR7TElCT01QX1VTRV9BREFQVElWRV9MT0NLU30iKQorICBsaWJvbXBfc2F5KCJVc2UgcXVhZCBwcmVjaXNpb24gICAtLSAke0xJQk9NUF9VU0VfUVVBRF9QUkVDSVNJT059IikKKyAgbGlib21wX3NheSgiVXNlIEh3bG9jIGxpYnJhcnkgICAgLS0gJHtMSUJPTVBfVVNFX0hXTE9DfSIpCitlbmRpZigpCisKK2FkZF9zdWJkaXJlY3Rvcnkoc3JjKQorYWRkX3N1YmRpcmVjdG9yeSh0ZXN0KQorCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL1JFQURNRS50eHQgYi9maW5hbC9ydW50aW1lL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRkM2JkOQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvUkVBRE1FLnR4dApAQCAtMCwwICsxLDExNSBAQAorCisgICAgICAgICAgICAgICBSRUFETUUgZm9yIHRoZSBMTFZNKiBPcGVuTVAqIFJ1bnRpbWUgTGlicmFyeQorICAgICAgICAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworSG93IHRvIEJ1aWxkIERvY3VtZW50YXRpb24KKz09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBtYWluIGRvY3VtZW50YXRpb24gaXMgaW4gRG94eWdlbiogZm9ybWF0LCBhbmQgdGhpcyBkaXN0cmlidXRpb24KK3Nob3VsZCBjb21lIHdpdGggcHJlLWJ1aWx0IFBERiBkb2N1bWVudGF0aW9uIGluIGRvYy9SZWZlcmVuY2UucGRmLiAgCitIb3dldmVyLCBhbiBIVE1MIHZlcnNpb24gY2FuIGJlIGJ1aWx0IGJ5IGV4ZWN1dGluZzoKKworJSBkb3h5Z2VuIGRvYy9kb3h5Z2VuL2NvbmZpZyAKKworaW4gdGhlIHJ1bnRpbWUgZGlyZWN0b3J5LgorCitUaGF0IHdpbGwgcHJvZHVjZSBIVE1MIGRvY3VtZW50YXRpb24gaW4gdGhlIGRvYy9kb3h5Z2VuL2dlbmVyYXRlZAorZGlyZWN0b3J5LCB3aGljaCBjYW4gYmUgYWNjZXNzZWQgYnkgcG9pbnRpbmcgYSB3ZWIgYnJvd3NlciBhdCB0aGUKK2luZGV4Lmh0bWwgZmlsZSB0aGVyZS4KKworSWYgeW91IGRvbid0IGhhdmUgRG94eWdlbiBpbnN0YWxsZWQsIHlvdSBjYW4gZG93bmxvYWQgaXQgZnJvbQord3d3LmRveHlnZW4ub3JnLgorCisKK0hvdyB0byBCdWlsZCB0aGUgTExWTSogT3Blbk1QKiBSdW50aW1lIExpYnJhcnkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0luLXRyZWUgYnVpbGQ6CisKKyQgY2Qgd2hlcmUteW91LXdhbnQtdG8tbGl2ZQorQ2hlY2sgb3V0IG9wZW5tcCBpbnRvIGxsdm0vcHJvamVjdHMKKyQgY2Qgd2hlcmUteW91LXdhbnQtdG8tYnVpbGQKKyQgbWtkaXIgYnVpbGQgJiYgY2QgYnVpbGQKKyQgY21ha2UgcGF0aC90by9sbHZtIC1EQ01BS0VfQ19DT01QSUxFUj08QyBjb21waWxlcj4gLURDTUFLRV9DWFhfQ09NUElMRVI9PEMrKyBjb21waWxlcj4KKyQgbWFrZSBvbXAKKworT3V0LW9mLXRyZWUgYnVpbGQ6CisKKyQgY2Qgd2hlcmUteW91LXdhbnQtdG8tbGl2ZQorQ2hlY2sgb3V0IG9wZW5tcAorJCBjZCB3aGVyZS15b3Utd2FudC10by1saXZlL29wZW5tcC9ydW50aW1lCiskIG1rZGlyIGJ1aWxkICYmIGNkIGJ1aWxkCiskIGNtYWtlIHBhdGgvdG8vb3Blbm1wIC1EQ01BS0VfQ19DT01QSUxFUj08QyBjb21waWxlcj4gLURDTUFLRV9DWFhfQ09NUElMRVI9PEMrKyBjb21waWxlcj4KKyQgbWFrZQorCitGb3IgZGV0YWlscyBhYm91dCBidWlsZGluZywgcGxlYXNlIGxvb2sgYXQgQnVpbGRfV2l0aF9DTWFrZS50eHQKKworQXJjaGl0ZWN0dXJlcyBTdXBwb3J0ZWQKKz09PT09PT09PT09PT09PT09PT09PT09CisqIElBLTMyIGFyY2hpdGVjdHVyZSAKKyogSW50ZWwoUikgNjQgYXJjaGl0ZWN0dXJlCisqIEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZQorKiBBUk0qIGFyY2hpdGVjdHVyZQorKiBBYXJjaDY0ICg2NC1iaXQgQVJNKSBhcmNoaXRlY3R1cmUKKyogSUJNKFIpIFBvd2VyIGFyY2hpdGVjdHVyZSAoYmlnIGVuZGlhbikKKyogSUJNKFIpIFBvd2VyIGFyY2hpdGVjdHVyZSAobGl0dGxlIGVuZGlhbikKKworU3VwcG9ydGVkIFJUTCBCdWlsZCBDb25maWd1cmF0aW9ucworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitTdXBwb3J0ZWQgQXJjaGl0ZWN0dXJlczogSUEtMzIgYXJjaGl0ZWN0dXJlLCBJbnRlbChSKSA2NCwgYW5kIAorSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlCisKKyAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICB8ICAgaWNjL2ljbCAgICAgfCAgICBnY2MgICAgICB8ICAgY2xhbmcgICAgICB8CistLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3wgTGludXgqIE9TICAgfCAgIFllcygxLDUpICAgIHwgIFllcygyLDQpICAgfCBZZXMoNCw2LDcpICAgfAorfCBGcmVlQlNEKiAgICB8ICAgTm8gICAgICAgICAgfCAgTm8gICAgICAgICB8IFllcyg0LDYsNyw4KSB8Cit8IE9TIFgqICAgICAgIHwgICBZZXMoMSwzLDQpICB8ICBObyAgICAgICAgIHwgWWVzKDQsNiw3KSAgIHwKK3wgV2luZG93cyogT1MgfCAgIFllcygxLDQpICAgIHwgIE5vICAgICAgICAgfCBObyAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKygxKSBPbiBJQS0zMiBhcmNoaXRlY3R1cmUgYW5kIEludGVsKFIpIDY0LCBpY2MvaWNsIHZlcnNpb25zIDEyLnggYXJlIAorICAgIHN1cHBvcnRlZCAoMTIuMSBpcyByZWNvbW1lbmRlZCkuCisoMikgR0NDKiB2ZXJzaW9uIDQuNyBpcyBzdXBwb3J0ZWQuCisoMykgRm9yIGljYyBvbiBPUyBYKiwgT1MgWCogdmVyc2lvbiAxMC41LjggaXMgc3VwcG9ydGVkLgorKDQpIEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZSBub3Qgc3VwcG9ydGVkLgorKDUpIE9uIEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZSwgaWNjL2ljbCB2ZXJzaW9ucyAxMy4wIAorICAgIG9yIGxhdGVyIGFyZSByZXF1aXJlZC4KKyg2KSBDbGFuZyogdmVyc2lvbiAzLjMgaXMgc3VwcG9ydGVkLgorKDcpIENsYW5nKiBjdXJyZW50bHkgZG9lcyBub3Qgb2ZmZXIgYSBzb2Z0d2FyZS1pbXBsZW1lbnRlZCAxMjggYml0IGV4dGVuZGVkIAorICAgIHByZWNpc2lvbiB0eXBlLiAgVGh1cywgYWxsIGVudHJ5IHBvaW50cyByZWxpYW50IG9uIHRoaXMgdHlwZSBhcmUgcmVtb3ZlZAorICAgIGZyb20gdGhlIGxpYnJhcnkgYW5kIGNhbm5vdCBiZSBjYWxsZWQgaW4gdGhlIHVzZXIgcHJvZ3JhbS4gIFRoZSBmb2xsb3dpbmcKKyAgICBmdW5jdGlvbnMgYXJlIG5vdCBhdmFpbGFibGU6CisgICAgX19rbXBjX2F0b21pY19jbXBseDE2XyoKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfKgorICAgIF9fa21wY19hdG9taWNfKl9mcAorKDgpIENvbW11bml0eSBjb250cmlidXRpb24gcHJvdmlkZWQgQVMgSVMsIG5vdCB0ZXN0ZWQgYnkgSW50ZWwuCisKK1N1cHBvcnRlZCBBcmNoaXRlY3R1cmVzOiBJQk0oUikgUG93ZXIgNyBhbmQgUG93ZXIgOAorCisgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgIHwgICBnY2MgICAgICB8ICAgY2xhbmcgICAgICB8CistLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS18Cit8IExpbnV4KiBPUyAgIHwgIFllcygxLDIpICB8IFllcygzLDQpICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKygxKSBPbiBQb3dlciA3LCBnY2MgdmVyc2lvbiA0LjguMiBpcyBzdXBwb3J0ZWQuCisoMikgT24gUG93ZXIgOCwgZ2NjIHZlcnNpb24gNC44LjIgaXMgc3VwcG9ydGVkLgorKDMpIE9uIFBvd2VyIDcsIGNsYW5nIHZlcnNpb24gMy43IGlzIHN1cHBvcnRlZC4KKyg0KSBPbiBQb3dlciA4LCBjbGFuZyB2ZXJzaW9uIDMuNyBpcyBzdXBwb3J0ZWQuCisKKworRnJvbnQtZW5kIENvbXBpbGVycyB0aGF0IHdvcmsgd2l0aCB0aGlzIFJUTAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgZm9sbG93aW5nIGNvbXBpbGVycyBhcmUga25vd24gdG8gZG8gY29tcGF0aWJsZSBjb2RlIGdlbmVyYXRpb24gZm9yCit0aGlzIFJUTDogY2xhbmcgKGZyb20gdGhlIE9wZW5NUCBkZXZlbG9wbWVudCBicmFuY2ggYXQKK2h0dHA6Ly9jbGFuZy1vbXAuZ2l0aHViLmlvLyApLCBJbnRlbCBjb21waWxlcnMsIEdDQy4gIFNlZSB0aGUgZG9jdW1lbnRhdGlvbgorZm9yIG1vcmUgZGV0YWlscy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTm90aWNlcworPT09PT09PQorCisqT3RoZXIgbmFtZXMgYW5kIGJyYW5kcyBtYXkgYmUgY2xhaW1lZCBhcyB0aGUgcHJvcGVydHkgb2Ygb3RoZXJzLgpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9jbWFrZS9MaWJvbXBDaGVja0ZvcnRyYW5GbGFnLmNtYWtlIGIvZmluYWwvcnVudGltZS9jbWFrZS9MaWJvbXBDaGVja0ZvcnRyYW5GbGFnLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzN2IzYWQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL2NtYWtlL0xpYm9tcENoZWNrRm9ydHJhbkZsYWcuY21ha2UKQEAgLTAsMCArMSw3MyBAQAorIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCisjIENoZWNraW5nIGEgZm9ydHJhbiBjb21waWxlciBmbGFnCisjIFRoZXJlIGlzIG5vIHJlYWwgdHJpdmlhbCB3YXkgdG8gZG8gdGhpcyBpbiBDTWFrZSwgc28gd2UgaW1wbGVtZW50IGl0IGhlcmUKKyMgdGhpcyB3aWxsIGhhdmUgJHtib29sZWFufSA9IFRSVUUgaWYgdGhlIGZsYWcgc3VjY2VlZHMsIG90aGVyd2lzZSBmYWxzZS4KK2Z1bmN0aW9uKGxpYm9tcF9jaGVja19mb3J0cmFuX2ZsYWcgZmxhZyBib29sZWFuKQorICBpZihOT1QgREVGSU5FRCAiJHtib29sZWFufSIpCisgICAgc2V0KHJldHZhbCBUUlVFKQorICAgIHNldChmb3J0cmFuX3NvdXJjZQorIiAgICAgIHByb2dyYW0gaGVsbG8KKyAgICAgICAgICAgcHJpbnQgKiwgXCJIZWxsbyBXb3JsZCFcIgorICAgICAgZW5kIHByb2dyYW0gaGVsbG8iKQorCisgIHNldChmYWlsZWRfcmVnZXhlcyAiW0VlXXJyb3I7W1V1XW5rbm93bjtbU3Nda2lwcGluZyIpCisgIGlmKENNQUtFX1ZFUlNJT04gVkVSU0lPTl9HUkVBVEVSIDMuMSBPUiBDTUFLRV9WRVJTSU9OIFZFUlNJT05fRVFVQUwgMy4xKQorICAgIGluY2x1ZGUoQ2hlY2tGb3J0cmFuU291cmNlQ29tcGlsZXMpCisgICAgY2hlY2tfZm9ydHJhbl9zb3VyY2VfY29tcGlsZXMoIiR7Zm9ydHJhbl9zb3VyY2V9IiAke2Jvb2xlYW59IEZBSUxfUkVHRVggIiR7ZmFpbGVkX3JlZ2V4ZXN9IikKKyAgICBzZXQoJHtib29sZWFufSAkeyR7Ym9vbGVhbn19IFBBUkVOVF9TQ09QRSkKKyAgICByZXR1cm4oKQorICBlbHNlKCkKKyAgICAjIE91ciBtYW51YWwgY2hlY2sgZm9yIGNtYWtlIHZlcnNpb25zIHRoYXQgZG9uJ3QgaGF2ZSBDaGVja0ZvcnRyYW5Tb3VyY2VDb21waWxlcworICAgIHNldChiYXNlX2RpciAke0NNQUtFX0JJTkFSWV9ESVJ9JHtDTUFLRV9GSUxFU19ESVJFQ1RPUll9L0NNYWtlVG1wL2ZvcnRyYW5fZmxhZ19jaGVjaykKKyAgICBmaWxlKE1BS0VfRElSRUNUT1JZICR7YmFzZV9kaXJ9KQorICAgIGZpbGUoV1JJVEUgJHtiYXNlX2Rpcn0vZm9ydHJhbl9zb3VyY2UuZiAiJHtmb3J0cmFuX3NvdXJjZX0iKQorCisgICAgbWVzc2FnZShTVEFUVVMgIlBlcmZvcm1pbmcgVGVzdCAke2Jvb2xlYW59IikKKyAgICBleGVjdXRlX3Byb2Nlc3MoCisgICAgICBDT01NQU5EICR7Q01BS0VfRm9ydHJhbl9DT01QSUxFUn0gIiR7ZmxhZ30iICR7YmFzZV9kaXJ9L2ZvcnRyYW5fc291cmNlLmYKKyAgICAgIFdPUktJTkdfRElSRUNUT1JZICR7YmFzZV9kaXJ9CisgICAgICBSRVNVTFRfVkFSSUFCTEUgZXhpdF9jb2RlCisgICAgICBPVVRQVVRfVkFSSUFCTEUgT1VUUFVUCisgICAgICBFUlJPUl9WQVJJQUJMRSBPVVRQVVQKKyAgICApCisKKyAgICBpZigke2V4aXRfY29kZX0gRVFVQUwgMCkKKyAgICAgIGZvcmVhY2gocmVnZXggSU4gTElTVFMgZmFpbGVkX3JlZ2V4ZXMpCisgICAgICAgIGlmKCIke09VVFBVVH0iIE1BVENIRVMgJHtyZWdleH0pCisgICAgICAgICAgc2V0KHJldHZhbCBGQUxTRSkKKyAgICAgICAgZW5kaWYoKQorICAgICAgZW5kZm9yZWFjaCgpCisgICAgZWxzZSgpCisgICAgICBzZXQocmV0dmFsIEZBTFNFKQorICAgIGVuZGlmKCkKKworICAgIGlmKCR7cmV0dmFsfSkKKyAgICAgIHNldCgke2Jvb2xlYW59IDEgQ0FDSEUgSU5URVJOQUwgIlRlc3QgJHtib29sZWFufSIpCisgICAgICBtZXNzYWdlKFNUQVRVUyAiUGVyZm9ybWluZyBUZXN0ICR7Ym9vbGVhbn0gLSBTdWNjZXNzIikKKyAgICAgIGZpbGUoQVBQRU5EICR7Q01BS0VfQklOQVJZX0RJUn0ke0NNQUtFX0ZJTEVTX0RJUkVDVE9SWX0vQ01ha2VPdXRwdXQubG9nCisgICAgICAgICJQZXJmb3JtaW5nIEZvcnRyYW4gQ29tcGlsZXIgRmxhZyB0ZXN0ICR7Ym9vbGVhbn0gc3VjY2VlZGVkIHdpdGggdGhlIGZvbGxvd2luZyBvdXRwdXQ6XG4iCisgICAgICAgICIke09VVFBVVH1cbiIKKyAgICAgICAgIlNvdXJjZSBmaWxlIHdhczpcbiR7Zm9ydHJhbl9zb3VyY2V9XG4iKQorICAgIGVsc2UoKQorICAgICAgc2V0KCR7Ym9vbGVhbn0gIiIgQ0FDSEUgSU5URVJOQUwgIlRlc3QgJHtib29sZWFufSIpCisgICAgICBtZXNzYWdlKFNUQVRVUyAiUGVyZm9ybWluZyBUZXN0ICR7Ym9vbGVhbn0gLSBGYWlsZWQiKQorICAgICAgZmlsZShBUFBFTkQgJHtDTUFLRV9CSU5BUllfRElSfSR7Q01BS0VfRklMRVNfRElSRUNUT1JZfS9DTWFrZUVycm9yLmxvZworICAgICAgICAiUGVyZm9ybWluZyBGb3J0cmFuIENvbXBpbGVyIEZsYWcgdGVzdCAke2Jvb2xlYW59IGZhaWxlZCB3aXRoIHRoZSBmb2xsb3dpbmcgb3V0cHV0OlxuIgorICAgICAgICAiJHtPVVRQVVR9XG4iCisgICAgICAgICJTb3VyY2UgZmlsZSB3YXM6XG4ke2ZvcnRyYW5fc291cmNlfVxuIikKKyAgICBlbmRpZigpCisgIGVuZGlmKCkKKworICBzZXQoJHtib29sZWFufSAke3JldHZhbH0gUEFSRU5UX1NDT1BFKQorICBlbmRpZigpCitlbmRmdW5jdGlvbigpCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL2NtYWtlL0xpYm9tcENoZWNrTGlua2VyRmxhZy5jbWFrZSBiL2ZpbmFsL3J1bnRpbWUvY21ha2UvTGlib21wQ2hlY2tMaW5rZXJGbGFnLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1YTM4ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL2NtYWtlL0xpYm9tcENoZWNrTGlua2VyRmxhZy5jbWFrZQpAQCAtMCwwICsxLDY4IEBACisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgQ2hlY2tpbmcgYSBsaW5rZXIgZmxhZyB0byBidWlsZCBhIHNoYXJlZCBsaWJyYXJ5CisjIFRoZXJlIGlzIG5vIHJlYWwgdHJpdmlhbCB3YXkgdG8gZG8gdGhpcyBpbiBDTWFrZSwgc28gd2UgaW1wbGVtZW50IGl0IGhlcmUKKyMgdGhpcyB3aWxsIGhhdmUgJHtib29sZWFufSA9IFRSVUUgaWYgdGhlIGZsYWcgc3VjY2VlZHMsIG90aGVyd2lzZSBGQUxTRS4KK2Z1bmN0aW9uKGxpYm9tcF9jaGVja19saW5rZXJfZmxhZyBmbGFnIGJvb2xlYW4pCisgIGlmKE5PVCBERUZJTkVEICIke2Jvb2xlYW59IikKKyAgc2V0KHJldHZhbCBUUlVFKQorICBzZXQobGlicmFyeV9zb3VyY2UKKyAgICAiaW50IGZvbyhpbnQgYSkgeyByZXR1cm4gYSphOyB9IikKKyAgc2V0KGNtYWtlX3NvdXJjZQorICAgICJjbWFrZV9taW5pbXVtX3JlcXVpcmVkKFZFUlNJT04gMi44KQorICAgICBwcm9qZWN0KGZvbyBDKQorICAgICBzZXQoQ01BS0VfU0hBUkVEX0xJTktFUl9GTEFHUyBcIiR7ZmxhZ31cIikKKyAgICAgYWRkX2xpYnJhcnkoZm9vIFNIQVJFRCBzcmNfdG9fbGluay5jKSIpCisgIHNldChmYWlsZWRfcmVnZXhlcyAiW0VlXXJyb3I7W1V1XW5rbm93bjtbU3Nda2lwcGluZztMSU5LIDogd2FybmluZyIpCisgIHNldChiYXNlX2RpciAke0NNQUtFX0JJTkFSWV9ESVJ9JHtDTUFLRV9GSUxFU19ESVJFQ1RPUll9L0NNYWtlVG1wL2xpbmtfZmxhZ19jaGVja18ke2Jvb2xlYW59KQorICBmaWxlKE1BS0VfRElSRUNUT1JZICR7YmFzZV9kaXJ9KQorICBmaWxlKE1BS0VfRElSRUNUT1JZICR7YmFzZV9kaXJ9L2J1aWxkKQorICBmaWxlKFdSSVRFICR7YmFzZV9kaXJ9L3NyY190b19saW5rLmMgIiR7bGlicmFyeV9zb3VyY2V9IikKKyAgZmlsZShXUklURSAke2Jhc2VfZGlyfS9DTWFrZUxpc3RzLnR4dCAiJHtjbWFrZV9zb3VyY2V9IikKKworICBtZXNzYWdlKFNUQVRVUyAiUGVyZm9ybWluZyBUZXN0ICR7Ym9vbGVhbn0iKQorICB0cnlfY29tcGlsZSgKKyAgICB0cnlfY29tcGlsZV9yZXN1bHQKKyAgICAke2Jhc2VfZGlyfS9idWlsZAorICAgICR7YmFzZV9kaXJ9CisgICAgZm9vCisgICAgT1VUUFVUX1ZBUklBQkxFIE9VVFBVVCkKKworICBpZih0cnlfY29tcGlsZV9yZXN1bHQpCisgICAgZm9yZWFjaChyZWdleCBJTiBMSVNUUyBmYWlsZWRfcmVnZXhlcykKKyAgICAgIGlmKCIke09VVFBVVH0iIE1BVENIRVMgJHtyZWdleH0pCisgICAgICAgIHNldChyZXR2YWwgRkFMU0UpCisgICAgICBlbmRpZigpCisgICAgZW5kZm9yZWFjaCgpCisgIGVsc2UoKQorICAgIHNldChyZXR2YWwgRkFMU0UpCisgIGVuZGlmKCkKKworICBpZigke3JldHZhbH0pCisgICAgc2V0KCR7Ym9vbGVhbn0gMSBDQUNIRSBJTlRFUk5BTCAiVGVzdCAke2Jvb2xlYW59IikKKyAgICBtZXNzYWdlKFNUQVRVUyAiUGVyZm9ybWluZyBUZXN0ICR7Ym9vbGVhbn0gLSBTdWNjZXNzIikKKyAgICBmaWxlKEFQUEVORCAke0NNQUtFX0JJTkFSWV9ESVJ9JHtDTUFLRV9GSUxFU19ESVJFQ1RPUll9L0NNYWtlT3V0cHV0LmxvZworICAgICAgIlBlcmZvcm1pbmcgQyBMaW5rZXIgRmxhZyB0ZXN0ICR7Ym9vbGVhbn0gc3VjY2VlZGVkIHdpdGggdGhlIGZvbGxvd2luZyBvdXRwdXQ6XG4iCisgICAgICAiJHtPVVRQVVR9XG4iCisgICAgICAiU291cmNlIGZpbGUgd2FzOlxuJHtsaWJyYXJ5X3NvdXJjZX1cbiIpCisgIGVsc2UoKQorICAgIHNldCgke2Jvb2xlYW59ICIiIENBQ0hFIElOVEVSTkFMICJUZXN0ICR7Ym9vbGVhbn0iKQorICAgIG1lc3NhZ2UoU1RBVFVTICJQZXJmb3JtaW5nIFRlc3QgJHtib29sZWFufSAtIEZhaWxlZCIpCisgICAgZmlsZShBUFBFTkQgJHtDTUFLRV9CSU5BUllfRElSfSR7Q01BS0VfRklMRVNfRElSRUNUT1JZfS9DTWFrZUVycm9yLmxvZworICAgICAgIlBlcmZvcm1pbmcgQyBMaW5rZXIgRmxhZyB0ZXN0ICR7Ym9vbGVhbn0gZmFpbGVkIHdpdGggdGhlIGZvbGxvd2luZyBvdXRwdXQ6XG4iCisgICAgICAiJHtPVVRQVVR9XG4iCisgICAgICAiU291cmNlIGZpbGUgd2FzOlxuJHtsaWJyYXJ5X3NvdXJjZX1cbiIpCisgIGVuZGlmKCkKKworICBzZXQoJHtib29sZWFufSAke3JldHZhbH0gUEFSRU5UX1NDT1BFKQorICBlbmRpZigpCitlbmRmdW5jdGlvbigpCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL2NtYWtlL0xpYm9tcERlZmluaXRpb25zLmNtYWtlIGIvZmluYWwvcnVudGltZS9jbWFrZS9MaWJvbXBEZWZpbml0aW9ucy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGNmYmI5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9jbWFrZS9MaWJvbXBEZWZpbml0aW9ucy5jbWFrZQpAQCAtMCwwICsxLDMyIEBACisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKK2Z1bmN0aW9uKGxpYm9tcF9nZXRfZGVmaW5pdGlvbnNfZmxhZ3MgY3BwZmxhZ3MpCisgIHNldChjcHBmbGFnc19sb2NhbCkKKworICBpZihXSU4zMikKKyAgICBsaWJvbXBfYXBwZW5kKGNwcGZsYWdzX2xvY2FsICItRCBfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUyIpCisgICAgbGlib21wX2FwcGVuZChjcHBmbGFnc19sb2NhbCAiLUQgX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIikKKyAgICBsaWJvbXBfYXBwZW5kKGNwcGZsYWdzX2xvY2FsICItRCBfV0lORE9XUyIpCisgICAgbGlib21wX2FwcGVuZChjcHBmbGFnc19sb2NhbCAiLUQgX1dJTk5UIikKKyAgICBsaWJvbXBfYXBwZW5kKGNwcGZsYWdzX2xvY2FsICItRCBfV0lOMzJfV0lOTlQ9MHgwNTAxIikKKyAgICBsaWJvbXBfYXBwZW5kKGNwcGZsYWdzX2xvY2FsICItRCBfVVNSRExMIikKKyAgICBsaWJvbXBfYXBwZW5kKGNwcGZsYWdzX2xvY2FsICItRCBfSVRFUkFUT1JfREVCVUdfTEVWRUw9MCIgSUZfVFJVRSBERUJVR19CVUlMRCkKKyAgICBsaWJvbXBfYXBwZW5kKGNwcGZsYWdzX2xvY2FsICItRCBfREVCVUciIElGX1RSVUUgREVCVUdfQlVJTEQpCisgIGVsc2UoKQorICAgIGxpYm9tcF9hcHBlbmQoY3BwZmxhZ3NfbG9jYWwgIi1EIF9HTlVfU09VUkNFIikKKyAgICBsaWJvbXBfYXBwZW5kKGNwcGZsYWdzX2xvY2FsICItRCBfUkVFTlRSQU5UIikKKyAgZW5kaWYoKQorCisgICMgQ01ha2UgZG9lc24ndCBpbmNsdWRlIENQUEZMQUdTIGZyb20gZW52aXJvbm1lbnQsIGJ1dCB3ZSB3aWxsLgorICBzZXQoJHtjcHBmbGFnc30gJHtjcHBmbGFnc19sb2NhbH0gJHtMSUJPTVBfQ1BQRkxBR1N9ICRFTlZ7Q1BQRkxBR1N9IFBBUkVOVF9TQ09QRSkKK2VuZGZ1bmN0aW9uKCkKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9jbWFrZS9MaWJvbXBFeHBvcnRzLmNtYWtlIGIvZmluYWwvcnVudGltZS9jbWFrZS9MaWJvbXBFeHBvcnRzLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZmNiMjAKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL2NtYWtlL0xpYm9tcEV4cG9ydHMuY21ha2UKQEAgLTAsMCArMSw5OCBAQAorIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCisjIExpYm9tcEV4cG9ydHMuY21ha2UKKyMgICBDb3B5IGxpYnJhcnkgYW5kIGhlYWRlciBmaWxlcyBpbnRvIHRoZSBleHBvcnRzLyBzdWJkaXJlY3RvcnkgYWZ0ZXIgbGlicmFyeSBidWlsZAorCisjIENyZWF0ZSB0aGUgc3VmZml4IGZvciB0aGUgZXhwb3J0IGRpcmVjdG9yeQorIyAtIE9ubHkgYWRkIHRvIHN1ZmZpeCB3aGVuIG5vdCBhIGRlZmF1bHQgdmFsdWUKKyMgLSBFeGFtcGxlIHN1ZmZpeDogLmRlYi4zMC5zMQorIyAgIGZpbmFsIGV4cG9ydCBkaXJlY3Rvcnk6IGV4cG9ydHMvbGluXzMyZS5kZWIuMzAuczEvbGliCisjIC0gVGhlc2Ugc3VmZml4ZXMgaW1wbHkgdGhlIGJ1aWxkIGlzIGEgRGVidWcsIE9wZW5NUCAzLjAsIFN0YXRzLUdhdGhlcmluZyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5CitzZXQobGlib21wX3N1ZmZpeCkKK2xpYm9tcF9hcHBlbmQobGlib21wX3N1ZmZpeCAuZGViIERFQlVHX0JVSUxEKQorbGlib21wX2FwcGVuZChsaWJvbXBfc3VmZml4IC5kaWEgUkVMV0lUSERFQklORk9fQlVJTEQpCitsaWJvbXBfYXBwZW5kKGxpYm9tcF9zdWZmaXggLm1pbiBNSU5TSVpFUkVMX0JVSUxEKQoraWYoTk9UICIke0xJQk9NUF9PTVBfVkVSU0lPTn0iIFNUUkVRVUFMICI0MSIpCisgIGxpYm9tcF9hcHBlbmQobGlib21wX3N1ZmZpeCAuJHtMSUJPTVBfT01QX1ZFUlNJT059KQorZW5kaWYoKQorbGlib21wX2FwcGVuZChsaWJvbXBfc3VmZml4IC5zMSBMSUJPTVBfU1RBVFMpCitsaWJvbXBfYXBwZW5kKGxpYm9tcF9zdWZmaXggLm9tcHQgTElCT01QX09NUFRfU1VQUE9SVCkKK2lmKCR7TElCT01QX09NUFRfU1VQUE9SVH0pCisgIGxpYm9tcF9hcHBlbmQobGlib21wX3N1ZmZpeCAubm8tb21wdC1ibGFtZSBJRl9GQUxTRSBMSUJPTVBfT01QVF9CTEFNRSkKKyAgbGlib21wX2FwcGVuZChsaWJvbXBfc3VmZml4IC5uby1vbXB0LXRyYWNlIElGX0ZBTFNFIExJQk9NUF9PTVBUX1RSQUNFKQorZW5kaWYoKQorc3RyaW5nKFJFUExBQ0UgIjsiICIiIGxpYm9tcF9zdWZmaXggIiR7bGlib21wX3N1ZmZpeH0iKQorCisjIFNldCBleHBvcnRzIGxvY2F0aW9ucworaWYoJHtNSUN9KQorICBzZXQobGlib21wX3BsYXRmb3JtICIke0xJQk9NUF9QRVJMX1NDUklQVF9PU31fJHtMSUJPTVBfTUlDX0FSQ0h9IikgIyBlLmcuLCBsaW5fa25mLCBsaW5fa25jCitlbHNlKCkKKyAgaWYoJHtJQTMyfSkKKyAgICBzZXQobGlib21wX3BsYXRmb3JtICIke0xJQk9NUF9QRVJMX1NDUklQVF9PU31fMzIiKQorICBlbHNlaWYoJHtJTlRFTDY0fSkKKyAgICBzZXQobGlib21wX3BsYXRmb3JtICIke0xJQk9NUF9QRVJMX1NDUklQVF9PU31fMzJlIikKKyAgZWxzZSgpCisgICAgc2V0KGxpYm9tcF9wbGF0Zm9ybSAiJHtMSUJPTVBfUEVSTF9TQ1JJUFRfT1N9XyR7TElCT01QX0FSQ0h9IikgIyBlLmcuLCBsaW5fYXJtLCBsaW5fcHBjNjQKKyAgZW5kaWYoKQorZW5kaWYoKQorc2V0KExJQk9NUF9FWFBPUlRTX0RJUiAiJHtMSUJPTVBfQkFTRV9ESVJ9L2V4cG9ydHMiKQorc2V0KExJQk9NUF9FWFBPUlRTX1BMQVRGT1JNX0RJUiAiJHtMSUJPTVBfRVhQT1JUU19ESVJ9LyR7bGlib21wX3BsYXRmb3JtfSR7bGlib21wX3N1ZmZpeH0iKQorc2V0KExJQk9NUF9FWFBPUlRTX0NNTl9ESVIgIiR7TElCT01QX0VYUE9SVFNfRElSfS9jb21tb24ke2xpYm9tcF9zdWZmaXh9L2luY2x1ZGUiKQorc2V0KExJQk9NUF9FWFBPUlRTX0lOQ19ESVIgIiR7TElCT01QX0VYUE9SVFNfUExBVEZPUk1fRElSfS9pbmNsdWRlIikKK3NldChMSUJPTVBfRVhQT1JUU19NT0RfRElSICIke0xJQk9NUF9FWFBPUlRTX1BMQVRGT1JNX0RJUn0vaW5jbHVkZV9jb21wYXQiKQorc2V0KExJQk9NUF9FWFBPUlRTX0xJQl9ESVIgIiR7TElCT01QX0VYUE9SVFNfRElSfS8ke2xpYm9tcF9wbGF0Zm9ybX0ke2xpYm9tcF9zdWZmaXh9L2xpYiIpCisKKyMgUHV0IGhlYWRlcnMgaW4gZXhwb3J0cy8gZGlyZWN0b3J5IHBvc3QgYnVpbGQKK2FkZF9jdXN0b21fY29tbWFuZChUQVJHRVQgb21wIFBPU1RfQlVJTEQKKyAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIG1ha2VfZGlyZWN0b3J5ICR7TElCT01QX0VYUE9SVFNfQ01OX0RJUn0KKyAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHkgb21wLmggJHtMSUJPTVBfRVhQT1JUU19DTU5fRElSfQorKQoraWYoJHtMSUJPTVBfT01QVF9TVVBQT1JUfSkKKyAgYWRkX2N1c3RvbV9jb21tYW5kKFRBUkdFVCBvbXAgUE9TVF9CVUlMRAorICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBjb3B5IG9tcHQuaCAke0xJQk9NUF9FWFBPUlRTX0NNTl9ESVJ9CisgICkKK2VuZGlmKCkKK2lmKCR7TElCT01QX0ZPUlRSQU5fTU9EVUxFU30pCisgIGFkZF9jdXN0b21fY29tbWFuZChUQVJHRVQgbGlib21wLW1vZCBQT1NUX0JVSUxECisgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIG1ha2VfZGlyZWN0b3J5ICR7TElCT01QX0VYUE9SVFNfTU9EX0RJUn0KKyAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY29weSBvbXBfbGliLmggJHtMSUJPTVBfRVhQT1JUU19DTU5fRElSfQorICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBjb3B5IG9tcF9saWIubW9kICR7TElCT01QX0VYUE9SVFNfTU9EX0RJUn0KKyAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY29weSBvbXBfbGliX2tpbmRzLm1vZCAke0xJQk9NUF9FWFBPUlRTX01PRF9ESVJ9CisgICkKK2VuZGlmKCkKKworIyBDb3B5IE9wZW5NUCBsaWJyYXJ5IGludG8gZXhwb3J0cy8gZGlyZWN0b3J5IHBvc3QgYnVpbGQKK2lmKFdJTjMyKQorICBnZXRfdGFyZ2V0X3Byb3BlcnR5KExJQk9NUF9PVVRQVVRfRElSRUNUT1JZIG9tcCBSVU5USU1FX09VVFBVVF9ESVJFQ1RPUlkpCitlbHNlKCkKKyAgZ2V0X3RhcmdldF9wcm9wZXJ0eShMSUJPTVBfT1VUUFVUX0RJUkVDVE9SWSBvbXAgTElCUkFSWV9PVVRQVVRfRElSRUNUT1JZKQorZW5kaWYoKQoraWYoTk9UIExJQk9NUF9PVVRQVVRfRElSRUNUT1JZKQorICBzZXQoTElCT01QX09VVFBVVF9ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9KQorZW5kaWYoKQorYWRkX2N1c3RvbV9jb21tYW5kKFRBUkdFVCBvbXAgUE9TVF9CVUlMRAorICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgbWFrZV9kaXJlY3RvcnkgJHtMSUJPTVBfRVhQT1JUU19MSUJfRElSfQorICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY29weSAke0xJQk9NUF9PVVRQVVRfRElSRUNUT1JZfS8ke0xJQk9NUF9MSUJfRklMRX0gJHtMSUJPTVBfRVhQT1JUU19MSUJfRElSfQorKQorCisjIENvcHkgV2luZG93cyBpbXBvcnQgbGlicmFyeSBpbnRvIGV4cG9ydHMvIGRpcmVjdG9yeSBwb3N0IGJ1aWxkCitpZihXSU4zMikKKyAgZ2V0X3RhcmdldF9wcm9wZXJ0eShMSUJPTVBJTVBfT1VUUFVUX0RJUkVDVE9SWSBvbXBpbXAgQVJDSElWRV9PVVRQVVRfRElSRUNUT1JZKQorICBpZihOT1QgTElCT01QSU1QX09VVFBVVF9ESVJFQ1RPUlkpCisgICAgc2V0KExJQk9NUElNUF9PVVRQVVRfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSkKKyAgZW5kaWYoKQorICBhZGRfY3VzdG9tX2NvbW1hbmQoVEFSR0VUIG9tcGltcCBQT1NUX0JVSUxECisgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIG1ha2VfZGlyZWN0b3J5ICR7TElCT01QX0VYUE9SVFNfTElCX0RJUn0KKyAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY29weSAke0xJQk9NUElNUF9PVVRQVVRfRElSRUNUT1JZfS8ke0xJQk9NUF9JTVBfTElCX0ZJTEV9ICR7TElCT01QX0VYUE9SVFNfTElCX0RJUn0KKyAgKQorZW5kaWYoKQorCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL2NtYWtlL0xpYm9tcEdldEFyY2hpdGVjdHVyZS5jbWFrZSBiL2ZpbmFsL3J1bnRpbWUvY21ha2UvTGlib21wR2V0QXJjaGl0ZWN0dXJlLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmM2M0YzYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL2NtYWtlL0xpYm9tcEdldEFyY2hpdGVjdHVyZS5jbWFrZQpAQCAtMCwwICsxLDY2IEBACisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgRGV0ZXJtaW5lIHRoZSBhcmNoaXRlY3R1cmUgZnJvbSBwcmVkZWZpbmVkIGNvbXBpbGVyIG1hY3JvcworIyBUaGUgYXJjaGl0ZWN0dXJlIG5hbWUgY2FuIG9ubHkgY29udGFpbiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBhbmQgdW5kZXJzY29yZXMgKGkuZS4sIEMgaWRlbnRpZmllcikKKworIyB2b2lkIGdldF9hcmNoaXRlY3R1cmUoc3RyaW5nKiByZXR1cm5fYXJjaCkKKyMgLSBSZXR1cm5zIHRoZSBhcmNoaXRlY3R1cmUgaW4gcmV0dXJuX2FyY2gKK2Z1bmN0aW9uKGxpYm9tcF9nZXRfYXJjaGl0ZWN0dXJlIHJldHVybl9hcmNoKQorICBzZXQoZGV0ZWN0X2FyY2hfc3JjX3R4dCAiCisgICAgI2lmIGRlZmluZWQoX19LTkNfXykKKyAgICAgICNlcnJvciBBUkNISVRFQ1RVUkU9bWljCisgICAgI2VsaWYgZGVmaW5lZChfX2FtZDY0X18pIHx8IGRlZmluZWQoX19hbWQ2NCkgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSB8fCBkZWZpbmVkKF9feDg2XzY0KSB8fCBkZWZpbmVkKF9NX1g2NCkgfHwgZGVmaW5lZChfTV9BTUQ2NCkKKyAgICAgICNlcnJvciBBUkNISVRFQ1RVUkU9eDg2XzY0CisgICAgI2VsaWYgZGVmaW5lZChfX2kzODYpIHx8IGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19JQTMyX18pIHx8IGRlZmluZWQoX01fSTg2KSB8fCBkZWZpbmVkKF9NX0lYODYpIHx8IGRlZmluZWQoX19YODZfXykgfHwgZGVmaW5lZChfWDg2XykKKyAgICAgICNlcnJvciBBUkNISVRFQ1RVUkU9aTM4NgorICAgICNlbGlmIGRlZmluZWQoX19BUk1fQVJDSF83X18pIHx8IGRlZmluZWQoX19BUk1fQVJDSF83Ul9fKSB8fCAgZGVmaW5lZChfX0FSTV9BUkNIXzdBX18pIHx8IGRlZmluZWQoX19BUk1fQVJDSF83TV9fKSAgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzdTX18pCisgICAgICAjZXJyb3IgQVJDSElURUNUVVJFPWFybQorICAgICNlbGlmIGRlZmluZWQoX19BUk1fQVJDSF82X18pIHx8IGRlZmluZWQoX19BUk1fQVJDSF82Sl9fKSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNktfXykgIHx8IGRlZmluZWQoX19BUk1fQVJDSF82Wl9fKSAgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzZUMl9fKSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNlpLX18pCisgICAgICAjZXJyb3IgQVJDSElURUNUVVJFPWFybQorICAgICNlbGlmIGRlZmluZWQoX19BUk1fQVJDSF81X18pIHx8IGRlZmluZWQoX19BUk1fQVJDSF81VF9fKSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNUVfXykgIHx8IGRlZmluZWQoX19BUk1fQVJDSF81VEVfXykgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzVURUpfXykKKyAgICAgICNlcnJvciBBUkNISVRFQ1RVUkU9YXJtCisgICAgI2VsaWYgZGVmaW5lZChfX0FSTV9BUkNIXzRfXykgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzRUX18pCisgICAgICAjZXJyb3IgQVJDSElURUNUVVJFPWFybQorICAgICNlbGlmIGRlZmluZWQoX19BUk1fQVJDSF8zX18pIHx8IGRlZmluZWQoX19BUk1fQVJDSF8zTV9fKQorICAgICAgI2Vycm9yIEFSQ0hJVEVDVFVSRT1hcm0KKyAgICAjZWxpZiBkZWZpbmVkKF9fQVJNX0FSQ0hfMl9fKQorICAgICAgI2Vycm9yIEFSQ0hJVEVDVFVSRT1hcm0KKyAgICAjZWxpZiBkZWZpbmVkKF9fYXJtX18pIHx8IGRlZmluZWQoX01fQVJNKSB8fCBkZWZpbmVkKF9BUk0pCisgICAgICAjZXJyb3IgQVJDSElURUNUVVJFPWFybQorICAgICNlbGlmIGRlZmluZWQoX19hYXJjaDY0X18pCisgICAgICAjZXJyb3IgQVJDSElURUNUVVJFPWFhcmNoNjQKKyAgICAjZWxpZiBkZWZpbmVkKF9fcG93ZXJwYzY0X18pICYmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX18pCisgICAgICAjZXJyb3IgQVJDSElURUNUVVJFPXBwYzY0bGUKKyAgICAjZWxpZiBkZWZpbmVkKF9fcG93ZXJwYzY0X18pCisgICAgICAjZXJyb3IgQVJDSElURUNUVVJFPXBwYzY0CisgICAgI2Vsc2UKKyAgICAgICNlcnJvciBBUkNISVRFQ1RVUkU9VW5rbm93bkFyY2hpdGVjdHVyZQorICAgICNlbmRpZgorICAiKQorICAjIFdyaXRlIG91dCAke2RldGVjdF9hcmNoX3NyY190eHR9IHRvIGEgZmlsZSB3aXRoaW4gdGhlIGNtYWtlLyBzdWJkaXJlY3RvcnkKKyAgZmlsZShXUklURSAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2xpYm9tcF9kZXRlY3RfYXJjaC5jIiAke2RldGVjdF9hcmNoX3NyY190eHR9KQorCisgICMgVHJ5IHRvIGNvbXBpbGUgdXNpbmcgdGhlIEMgQ29tcGlsZXIuICBJdCB3aWxsIGFsd2F5cyBlcnJvciBvdXQgd2l0aCBhbiAjZXJyb3IgZGlyZWN0aXZlLCBzbyBzdG9yZSBlcnJvciBvdXRwdXQgdG8gJHtsb2NhbF9hcmNoaXRlY3R1cmV9CisgIHRyeV9ydW4ocnVuX2R1bW15IGNvbXBpbGVfZHVtbXkgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSIgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9saWJvbXBfZGV0ZWN0X2FyY2guYyIgQ09NUElMRV9PVVRQVVRfVkFSSUFCTEUgbG9jYWxfYXJjaGl0ZWN0dXJlKQorCisgICMgTWF0Y2ggdGhlIGltcG9ydGFudCBhcmNoaXRlY3R1cmUgbGluZSBhbmQgc3RvcmUgb25seSB0aGF0IG1hdGNoaW5nIHN0cmluZyBpbiAke2xvY2FsX2FyY2hpdGVjdHVyZX0KKyAgc3RyaW5nKFJFR0VYIE1BVENIICJBUkNISVRFQ1RVUkU9KFthLXpBLVowLTlfXSspIiBsb2NhbF9hcmNoaXRlY3R1cmUgIiR7bG9jYWxfYXJjaGl0ZWN0dXJlfSIpCisKKyAgIyBHZXQgcmlkIG9mIHRoZSBBUkNISVRFQ1RVUkU9IHBhcnQgb2YgdGhlIHN0cmluZworICBzdHJpbmcoUkVQTEFDRSAiQVJDSElURUNUVVJFPSIgIiIgbG9jYWxfYXJjaGl0ZWN0dXJlICIke2xvY2FsX2FyY2hpdGVjdHVyZX0iKQorCisgICMgc2V0IHRoZSByZXR1cm4gdmFsdWUgdG8gdGhlIGFyY2hpdGVjdHVyZSBkZXRlY3RlZCAoZS5nLiwgMzJlLCAzMiwgYXJtLCBwcGM2NCwgZXRjLikKKyAgc2V0KCR7cmV0dXJuX2FyY2h9ICIke2xvY2FsX2FyY2hpdGVjdHVyZX0iIFBBUkVOVF9TQ09QRSkKKworICAjIFJlbW92ZSAke2RldGVjdF9hcmNoX3NyY190eHR9IGZyb20gY21ha2UvIHN1YmRpcmVjdG9yeQorICBmaWxlKFJFTU9WRSAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2xpYm9tcF9kZXRlY3RfYXJjaC5jIikKK2VuZGZ1bmN0aW9uKCkKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvY21ha2UvTGlib21wSGFuZGxlRmxhZ3MuY21ha2UgYi9maW5hbC9ydW50aW1lL2NtYWtlL0xpYm9tcEhhbmRsZUZsYWdzLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmYjUyNGYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL2NtYWtlL0xpYm9tcEhhbmRsZUZsYWdzLmNtYWtlCkBAIC0wLDAgKzEsMjA3IEBACisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgU2V0dXAgdGhlIGZsYWdzIGNvcnJlY3RseSBmb3IgY21ha2UgKGNvdmVydCB0byBzdHJpbmcpCisjIFByZXR0eSB0aGVtIHVwIChTVFJJUCBhbnkgYmVnaW5uaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLAorIyByZW1vdmUgZHVwbGljYXRlcywgcmVtb3ZlIGVtcHR5IGVudHJpZXMpCittYWNybyhsaWJvbXBfc2V0dXBfZmxhZ3MgZmxhZ3MpCisgIGlmKE5PVCAiJHske2ZsYWdzfX0iIFNUUkVRVUFMICIiKSAjIGlmIGZsYWdzIGFyZSBlbXB0eSwgZG9uJ3QgZG8gYW55dGhpbmcKKyAgICBzZXQoZmxhZ3NfbG9jYWwpCisgICAgbGlzdChSRU1PVkVfRFVQTElDQVRFUyAke2ZsYWdzfSkgIyByZW1vdmUgZHVwbGljYXRlcworICAgIGxpc3QoUkVNT1ZFX0lURU0gJHtmbGFnc30gIiIpICMgcmVtb3ZlIGVtcHR5IGl0ZW1zCisgICAgbGlib21wX2xpc3RfdG9fc3RyaW5nKCIkeyR7ZmxhZ3N9fSIgZmxhZ3NfbG9jYWwpCisgICAgc3RyaW5nKFNUUklQICIke2ZsYWdzX2xvY2FsfSIgZmxhZ3NfbG9jYWwpCisgICAgc2V0KCR7ZmxhZ3N9ICIke2ZsYWdzX2xvY2FsfSIpCisgIGVuZGlmKCkKK2VuZG1hY3JvKCkKKworIyBHZXRzIGZsYWdzIGNvbW1vbiB0byBib3RoIHRoZSBDIGFuZCBDKysgY29tcGlsZXIKK2Z1bmN0aW9uKGxpYm9tcF9nZXRfY19hbmRfY3h4ZmxhZ3NfY29tbW9uIGZsYWdzKQorICBzZXQoZmxhZ3NfbG9jYWwpCisgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgLXN0ZD1jKysxMSBMSUJPTVBfSEFWRV9TVERfQ1BQMTFfRkxBRykKKyAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAtZm5vLWV4Y2VwdGlvbnMgTElCT01QX0hBVkVfRk5PX0VYQ0VQVElPTlNfRkxBRykKKyAgaWYoJHtMSUJPTVBfRU5BQkxFX1dFUlJPUn0pCisgICAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAtV2Vycm9yIExJQk9NUF9IQVZFX1dFUlJPUl9GTEFHKQorICBlbmRpZigpCisgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgLVduby1zaWduLWNvbXBhcmUgTElCT01QX0hBVkVfV05PX1NJR05fQ09NUEFSRV9GTEFHKQorICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC1Xbm8tdW51c2VkLWZ1bmN0aW9uIExJQk9NUF9IQVZFX1dOT19VTlVTRURfRlVOQ1RJT05fRkxBRykKKyAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAtV25vLXVudXNlZC1sb2NhbC10eXBlZGVmIExJQk9NUF9IQVZFX1dOT19VTlVTRURfTE9DQUxfVFlQRURFRl9GTEFHKQorICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC1Xbm8tdW51c2VkLXZhbHVlIExJQk9NUF9IQVZFX1dOT19VTlVTRURfVkFMVUVfRkxBRykKKyAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAtV25vLXVudXNlZC12YXJpYWJsZSBMSUJPTVBfSEFWRV9XTk9fVU5VU0VEX1ZBUklBQkxFX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgLVduby1zd2l0Y2ggTElCT01QX0hBVkVfV05PX1NXSVRDSF9GTEFHKQorICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC1Xbm8tY292ZXJlZC1zd2l0Y2gtZGVmYXVsdCBMSUJPTVBfSEFWRV9XTk9fQ09WRVJFRF9TV0lUQ0hfREVGQVVMVF9GTEFHKQorICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC1Xbm8tZGVwcmVjYXRlZC1yZWdpc3RlciBMSUJPTVBfSEFWRV9XTk9fREVQUkVDQVRFRF9SRUdJU1RFUl9GTEFHKQorICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC1Xbm8tZ251LWFub255bW91cy1zdHJ1Y3QgTElCT01QX0hBVkVfV05PX0dOVV9BTk9OWU1PVVNfU1RSVUNUX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgLVduby11bmtub3duLXByYWdtYXMgTElCT01QX0hBVkVfV05PX1VOS05PV05fUFJBR01BU19GTEFHKQorICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC1Xbm8tbWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMgTElCT01QX0hBVkVfV05PX01JU1NJTkdfRklFTERfSU5JVElBTElaRVJTX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgLVduby1taXNzaW5nLWJyYWNlcyBMSUJPTVBfSEFWRV9XTk9fTUlTU0lOR19CUkFDRVNfRkxBRykKKyAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAtV25vLWNvbW1lbnQgTElCT01QX0hBVkVfV05PX0NPTU1FTlRfRkxBRykKKyAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAtV25vLXNlbGYtYXNzaWduIExJQk9NUF9IQVZFX1dOT19TRUxGX0FTU0lHTl9GTEFHKQorICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC1Xbm8tdmxhLWV4dGVuc2lvbiBMSUJPTVBfSEFWRV9XTk9fVkxBX0VYVEVOU0lPTl9GTEFHKQorICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC1Xbm8tZm9ybWF0LXBlZGFudGljIExJQk9NUF9IQVZFX1dOT19GT1JNQVRfUEVEQU5USUNfRkxBRykKKyAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAvR1MgTElCT01QX0hBVkVfR1NfRkxBRykKKyAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAvRUhzYyBMSUJPTVBfSEFWRV9FSFNDX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgL095LSBMSUJPTVBfSEFWRV9PWV9fRkxBRykKKyAgIyBJbnRlbChSKSBDIENvbXBpbGVyIGZsYWdzCisgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgL1FzYWZlc2VoIExJQk9NUF9IQVZFX1FTQUZFU0VIX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgLVFvcHRpb24sY3BwLC0tZXh0ZW5kZWRfZmxvYXRfdHlwZXMgTElCT01QX0hBVkVfRVhURU5ERURfRkxPQVRfVFlQRVNfRkxBRykKKyAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAtUWxvbmdfZG91YmxlIExJQk9NUF9IQVZFX0xPTkdfRE9VQkxFX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgLVFkaWFnLWRpc2FibGU6MTc3IExJQk9NUF9IQVZFX0RJQUdfRElTQUJMRV8xNzdfRkxBRykKKyAgaWYoJHtSRUxFQVNFX0JVSUxEfSBPUiAke1JFTFdJVEhERUJJTkZPX0JVSUxEfSkKKyAgICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC1RaW5saW5lLW1pbi1zaXplPTEgTElCT01QX0hBVkVfSU5MSU5FX01JTl9TSVpFX0ZMQUcpCisgIGVuZGlmKCkKKyAgIyBBcmNoaXRlY3R1cmFsIEMgYW5kIEMrKyBmbGFncworICBpZigke0lBMzJ9KQorICAgIGlmKENNQUtFX1NJWkVPRl9WT0lEX1AgRVFVQUwgOCkKKyAgICAgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgLW0zMiBMSUJPTVBfSEFWRV9NMzJfRkxBRykKKyAgICBlbmRpZigpCisgICAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAvYXJjaDpTU0UyIExJQk9NUF9IQVZFX0FSQ0hfU1NFMl9GTEFHKQorICAgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgLW1zc2UyIExJQk9NUF9IQVZFX01TU0UyX0ZMQUcpCisgICAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAtZmFsaWduLXN0YWNrPW1haW50YWluLTE2LWJ5dGUgTElCT01QX0hBVkVfRkFMSUdOX1NUQUNLX0ZMQUcpCisgIGVsc2VpZigke01JQ30pCisgICAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAtbW1pYyBMSUJPTVBfSEFWRV9NTUlDX0ZMQUcpCisgICAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAtZnRscy1tb2RlbD1pbml0aWFsLWV4ZWMgTElCT01QX0hBVkVfRlRMU19NT0RFTF9GTEFHKQorICAgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgIi1vcHQtc3RyZWFtaW5nLXN0b3JlcyBuZXZlciIgTElCT01QX0hBVkVfT1BUX1NUUkVBTUlOR19TVE9SRVNfRkxBRykKKyAgZW5kaWYoKQorICBzZXQoJHtmbGFnc30gJHtmbGFnc19sb2NhbH0gUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQorCisjIEMgY29tcGlsZXIgZmxhZ3MKK2Z1bmN0aW9uKGxpYm9tcF9nZXRfY2ZsYWdzIGNmbGFncykKKyAgc2V0KGNmbGFnc19sb2NhbCkKKyAgbGlib21wX2dldF9jX2FuZF9jeHhmbGFnc19jb21tb24oY2ZsYWdzX2xvY2FsKQorICAjIGZsYWdzIG9ubHkgZm9yIHRoZSBDIENvbXBpbGVyCisgIGxpYm9tcF9hcHBlbmQoY2ZsYWdzX2xvY2FsIC9UUCBMSUJPTVBfSEFWRV9UUF9GTEFHKQorICBsaWJvbXBfYXBwZW5kKGNmbGFnc19sb2NhbCAiLXggYysrIiBMSUJPTVBfSEFWRV9YX0NQUF9GTEFHKQorICBzZXQoY2ZsYWdzX2xvY2FsICR7Y2ZsYWdzX2xvY2FsfSAke0xJQk9NUF9DRkxBR1N9KQorICBsaWJvbXBfc2V0dXBfZmxhZ3MoY2ZsYWdzX2xvY2FsKQorICBzZXQoJHtjZmxhZ3N9ICR7Y2ZsYWdzX2xvY2FsfSBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCisKKyMgQysrIGNvbXBpbGVyIGZsYWdzCitmdW5jdGlvbihsaWJvbXBfZ2V0X2N4eGZsYWdzIGN4eGZsYWdzKQorICBzZXQoY3h4ZmxhZ3NfbG9jYWwpCisgIGxpYm9tcF9nZXRfY19hbmRfY3h4ZmxhZ3NfY29tbW9uKGN4eGZsYWdzX2xvY2FsKQorICBzZXQoY3h4ZmxhZ3NfbG9jYWwgJHtjeHhmbGFnc19sb2NhbH0gJHtMSUJPTVBfQ1hYRkxBR1N9KQorICBsaWJvbXBfc2V0dXBfZmxhZ3MoY3h4ZmxhZ3NfbG9jYWwpCisgIHNldCgke2N4eGZsYWdzfSAke2N4eGZsYWdzX2xvY2FsfSBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCisKKyMgQXNzZW1ibGVyIGZsYWdzCitmdW5jdGlvbihsaWJvbXBfZ2V0X2FzbWZsYWdzIGFzbWZsYWdzKQorICBzZXQoYXNtZmxhZ3NfbG9jYWwpCisgIGxpYm9tcF9hcHBlbmQoYXNtZmxhZ3NfbG9jYWwgIi14IGFzc2VtYmxlci13aXRoLWNwcCIgTElCT01QX0hBVkVfWF9BU1NFTUJMRVJfV0lUSF9DUFBfRkxBRykKKyAgIyBBcmNoaXRlY3R1cmFsIGFzc2VtYmxlciBmbGFncworICBpZigke0lBMzJ9KQorICAgIGlmKENNQUtFX1NJWkVPRl9WT0lEX1AgRVFVQUwgOCkKKyAgICAgIGxpYm9tcF9hcHBlbmQoYXNtZmxhZ3NfbG9jYWwgLW0zMiBMSUJPTVBfSEFWRV9NMzJfRkxBRykKKyAgICBlbmRpZigpCisgICAgbGlib21wX2FwcGVuZChhc21mbGFnc19sb2NhbCAvc2FmZXNlaCBMSUJPTVBfSEFWRV9TQUZFU0VIX01BU01fRkxBRykKKyAgICBsaWJvbXBfYXBwZW5kKGFzbWZsYWdzX2xvY2FsIC9jb2ZmIExJQk9NUF9IQVZFX0NPRkZfTUFTTV9GTEFHKQorICBlbHNlaWYoJHtNSUN9KQorICAgIGxpYm9tcF9hcHBlbmQoYXNtZmxhZ3NfbG9jYWwgLW1taWMgTElCT01QX0hBVkVfTU1JQ19GTEFHKQorICBlbmRpZigpCisgIHNldChhc21mbGFnc19sb2NhbCAke2FzbWZsYWdzX2xvY2FsfSAke0xJQk9NUF9BU01GTEFHU30pCisgIGxpYm9tcF9zZXR1cF9mbGFncyhhc21mbGFnc19sb2NhbCkKKyAgc2V0KCR7YXNtZmxhZ3N9ICR7YXNtZmxhZ3NfbG9jYWx9IFBBUkVOVF9TQ09QRSkKK2VuZGZ1bmN0aW9uKCkKKworIyBMaW5rZXIgZmxhZ3MKK2Z1bmN0aW9uKGxpYm9tcF9nZXRfbGRmbGFncyBsZGZsYWdzKQorICBzZXQobGRmbGFnc19sb2NhbCkKKyAgbGlib21wX2FwcGVuZChsZGZsYWdzX2xvY2FsICIke0NNQUtFX0xJTktfREVGX0ZJTEVfRkxBR30ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vJHtMSUJPTVBfTElCX05BTUV9LmRlZiIKKyAgICBJRl9ERUZJTkVEIENNQUtFX0xJTktfREVGX0ZJTEVfRkxBRykKKyAgbGlib21wX2FwcGVuZChsZGZsYWdzX2xvY2FsICIke0NNQUtFX0NfT1NYX0NVUlJFTlRfVkVSU0lPTl9GTEFHfSR7TElCT01QX1ZFUlNJT05fTUFKT1J9LiR7TElCT01QX1ZFUlNJT05fTUlOT1J9IgorICAgIElGX0RFRklORUQgQ01BS0VfQ19PU1hfQ1VSUkVOVF9WRVJTSU9OX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQobGRmbGFnc19sb2NhbCAiJHtDTUFLRV9DX09TWF9DT01QQVRJQklMSVRZX1ZFUlNJT05fRkxBR30ke0xJQk9NUF9WRVJTSU9OX01BSk9SfS4ke0xJQk9NUF9WRVJTSU9OX01JTk9SfSIKKyAgICBJRl9ERUZJTkVEIENNQUtFX0NfT1NYX0NPTVBBVElCSUxJVFlfVkVSU0lPTl9GTEFHKQorICBsaWJvbXBfYXBwZW5kKGxkZmxhZ3NfbG9jYWwgLVdsLC0td2Fybi1zaGFyZWQtdGV4dHJlbCBMSUJPTVBfSEFWRV9XQVJOX1NIQVJFRF9URVhUUkVMX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQobGRmbGFnc19sb2NhbCAtV2wsLS1hcy1uZWVkZWQgTElCT01QX0hBVkVfQVNfTkVFREVEX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQobGRmbGFnc19sb2NhbCAiLVdsLC0tdmVyc2lvbi1zY3JpcHQ9JHtMSUJPTVBfU1JDX0RJUn0vZXhwb3J0c19zby50eHQiIExJQk9NUF9IQVZFX1ZFUlNJT05fU0NSSVBUX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQobGRmbGFnc19sb2NhbCAtc3RhdGljLWxpYmdjYyBMSUJPTVBfSEFWRV9TVEFUSUNfTElCR0NDX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQobGRmbGFnc19sb2NhbCAtV2wsLXosbm9leGVjc3RhY2sgTElCT01QX0hBVkVfWl9OT0VYRUNTVEFDS19GTEFHKQorICBsaWJvbXBfYXBwZW5kKGxkZmxhZ3NfbG9jYWwgLVdsLC1maW5pPV9fa21wX2ludGVybmFsX2VuZF9maW5pIExJQk9NUF9IQVZFX0ZJTklfRkxBRykKKyAgbGlib21wX2FwcGVuZChsZGZsYWdzX2xvY2FsIC1uby1pbnRlbC1leHRlbnNpb25zIExJQk9NUF9IQVZFX05PX0lOVEVMX0VYVEVOU0lPTlNfRkxBRykKKyAgbGlib21wX2FwcGVuZChsZGZsYWdzX2xvY2FsIC1zdGF0aWMtaW50ZWwgTElCT01QX0hBVkVfU1RBVElDX0lOVEVMX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQobGRmbGFnc19sb2NhbCAvU0FGRVNFSCBMSUJPTVBfSEFWRV9TQUZFU0VIX0ZMQUcpCisgICMgQXJjaGl0ZWN0dXJhbCBsaW5rZXIgZmxhZ3MKKyAgaWYoJHtJQTMyfSkKKyAgICBpZihDTUFLRV9TSVpFT0ZfVk9JRF9QIEVRVUFMIDgpCisgICAgICBsaWJvbXBfYXBwZW5kKGxkZmxhZ3NfbG9jYWwgLW0zMiBMSUJPTVBfSEFWRV9NMzJfRkxBRykKKyAgICBlbmRpZigpCisgICAgbGlib21wX2FwcGVuZChsZGZsYWdzX2xvY2FsIC1tc3NlMiBMSUJPTVBfSEFWRV9NU1NFMl9GTEFHKQorICBlbHNlaWYoJHtNSUN9KQorICAgIGxpYm9tcF9hcHBlbmQobGRmbGFnc19sb2NhbCAtbW1pYyBMSUJPTVBfSEFWRV9NTUlDX0ZMQUcpCisgICAgbGlib21wX2FwcGVuZChsZGZsYWdzX2xvY2FsIC1XbCwteCBMSUJPTVBfSEFWRV9YX0ZMQUcpCisgIGVuZGlmKCkKKyAgc2V0KGxkZmxhZ3NfbG9jYWwgJHtsZGZsYWdzX2xvY2FsfSAke0xJQk9NUF9MREZMQUdTfSkKKyAgbGlib21wX3NldHVwX2ZsYWdzKGxkZmxhZ3NfbG9jYWwpCisgIHNldCgke2xkZmxhZ3N9ICR7bGRmbGFnc19sb2NhbH0gUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQorCisjIExpYnJhcnkgZmxhZ3MKK2Z1bmN0aW9uKGxpYm9tcF9nZXRfbGliZmxhZ3MgbGliZmxhZ3MpCisgIHNldChsaWJmbGFnc19sb2NhbCkKKyAgbGlib21wX2FwcGVuZChsaWJmbGFnc19sb2NhbCAiJHtDTUFLRV9USFJFQURfTElCU19JTklUfSIpCisgIGxpYm9tcF9hcHBlbmQobGliZmxhZ3NfbG9jYWwgIiR7TElCT01QX0hXTE9DX0xJQlJBUll9IiBMSUJPTVBfVVNFX0hXTE9DKQorICBpZigke0lBMzJ9KQorICAgIGxpYm9tcF9hcHBlbmQobGliZmxhZ3NfbG9jYWwgLWxpcmNfcGljIExJQk9NUF9IQVZFX0lSQ19QSUNfTElCUkFSWSkKKyAgZW5kaWYoKQorICBJRigke0NNQUtFX1NZU1RFTV9OQU1FfSBNQVRDSEVTICJOZXRCU0QiKQorICAgIGxpYm9tcF9hcHBlbmQobGliZmxhZ3NfbG9jYWwgLWxtKQorICBFTkRJRigke0NNQUtFX1NZU1RFTV9OQU1FfSBNQVRDSEVTICJOZXRCU0QiKQorICBzZXQobGliZmxhZ3NfbG9jYWwgJHtsaWJmbGFnc19sb2NhbH0gJHtMSUJPTVBfTElCRkxBR1N9KQorICBsaWJvbXBfc2V0dXBfZmxhZ3MobGliZmxhZ3NfbG9jYWwpCisgIHNldCgke2xpYmZsYWdzfSAke2xpYmZsYWdzX2xvY2FsfSBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCisKKyMgRm9ydHJhbiBmbGFncworZnVuY3Rpb24obGlib21wX2dldF9mZmxhZ3MgZmZsYWdzKQorICBzZXQoZmZsYWdzX2xvY2FsKQorICBpZigke0lBMzJ9KQorICAgIGxpYm9tcF9hcHBlbmQoZmZsYWdzX2xvY2FsIC1tMzIgTElCT01QX0hBVkVfTTMyX0ZPUlRSQU5fRkxBRykKKyAgZW5kaWYoKQorICBzZXQoZmZsYWdzX2xvY2FsICR7ZmZsYWdzX2xvY2FsfSAke0xJQk9NUF9GRkxBR1N9KQorICBsaWJvbXBfc2V0dXBfZmxhZ3MoZmZsYWdzX2xvY2FsKQorICBzZXQoJHtmZmxhZ3N9ICR7ZmZsYWdzX2xvY2FsfSBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCisKKyMgUGVybCBnZW5lcmF0ZS1kZWZzLnBsIGZsYWdzIChGb3IgV2luZG93cyBvbmx5KQorZnVuY3Rpb24obGlib21wX2dldF9nZGZsYWdzIGdkZmxhZ3MpCisgIHNldChnZGZsYWdzX2xvY2FsKQorICBpZigke0lBMzJ9KQorICAgIHNldChsaWJvbXBfZ2RmbGFnX2FyY2ggYXJjaF8zMikKKyAgZWxzZWlmKCR7SU5URUw2NH0pCisgICAgc2V0KGxpYm9tcF9nZGZsYWdfYXJjaCBhcmNoXzMyZSkKKyAgZWxzZSgpCisgICAgc2V0KGxpYm9tcF9nZGZsYWdfYXJjaCBhcmNoXyR7TElCT01QX0FSQ0h9KQorICBlbmRpZigpCisgIGxpYm9tcF9hcHBlbmQoZ2RmbGFnc19sb2NhbCAiLUQgJHtsaWJvbXBfZ2RmbGFnX2FyY2h9IikKKyAgbGlib21wX2FwcGVuZChnZGZsYWdzX2xvY2FsICItRCBtc3ZjX2NvbXBhdCIpCisgIGxpYm9tcF9hcHBlbmQoZ2RmbGFnc19sb2NhbCAiLUQgbm9ybSIgTk9STUFMX0xJQlJBUlkpCisgIGxpYm9tcF9hcHBlbmQoZ2RmbGFnc19sb2NhbCAiLUQgcHJvZiIgUFJPRklMRV9MSUJSQVJZKQorICBsaWJvbXBfYXBwZW5kKGdkZmxhZ3NfbG9jYWwgIi1EIHN0dWIiIFNUVUJTX0xJQlJBUlkpCisgIGxpYm9tcF9hcHBlbmQoZ2RmbGFnc19sb2NhbCAiLUQgSEFWRV9RVUFEIiBMSUJPTVBfVVNFX1FVQURfUFJFQ0lTSU9OKQorICBsaWJvbXBfYXBwZW5kKGdkZmxhZ3NfbG9jYWwgIi1EIFVTRV9ERUJVR0dFUiIgTElCT01QX1VTRV9ERUJVR0dFUikKKyAgaWYoJHtMSUJPTVBfT01QX1ZFUlNJT059IEdSRUFURVIgNDEgT1IgJHtMSUJPTVBfT01QX1ZFUlNJT059IEVRVUFMIDQxKQorICAgIGxpYm9tcF9hcHBlbmQoZ2RmbGFnc19sb2NhbCAiLUQgT01QXzQxIikKKyAgZW5kaWYoKQorICBpZigke0xJQk9NUF9PTVBfVkVSU0lPTn0gR1JFQVRFUiA0MCBPUiAke0xJQk9NUF9PTVBfVkVSU0lPTn0gRVFVQUwgNDApCisgICAgbGlib21wX2FwcGVuZChnZGZsYWdzX2xvY2FsICItRCBPTVBfNDAiKQorICBlbmRpZigpCisgIGlmKCR7TElCT01QX09NUF9WRVJTSU9OfSBHUkVBVEVSIDMwIE9SICR7TElCT01QX09NUF9WRVJTSU9OfSBFUVVBTCAzMCkKKyAgICBsaWJvbXBfYXBwZW5kKGdkZmxhZ3NfbG9jYWwgIi1EIE9NUF8zMCIpCisgIGVuZGlmKCkKKyAgaWYoJHtERUJVR19CVUlMRH0gT1IgJHtSRUxXSVRIREVCSU5GT19CVUlMRH0pCisgICAgbGlib21wX2FwcGVuZChnZGZsYWdzX2xvY2FsICItRCBLTVBfREVCVUciKQorICBlbmRpZigpCisgIHNldCgke2dkZmxhZ3N9ICR7Z2RmbGFnc19sb2NhbH0gUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9jbWFrZS9MaWJvbXBNaWNyb1Rlc3RzLmNtYWtlIGIvZmluYWwvcnVudGltZS9jbWFrZS9MaWJvbXBNaWNyb1Rlc3RzLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNWQyMzEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL2NtYWtlL0xpYm9tcE1pY3JvVGVzdHMuY21ha2UKQEAgLTAsMCArMSwyMjUgQEAKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworIyBUaGUgZm9sbG93aW5nIG1pY3JvLXRlc3RzIGFyZSBzbWFsbCB0ZXN0cyB0byBwZXJmb3JtIG9uIHRoZSBsaWJyYXJ5IGp1c3QgY3JlYXRlZC4KKyMgVGhlcmUgYXJlIGN1cnJlbnRseSBmaXZlIG1pY3JvLXRlc3RzOgorIyAoMSkgdGVzdC10b3VjaAorIyAgLSBDb21waWxlIGFuZCBydW4gYSBzbWFsbCBwcm9ncmFtIHVzaW5nIG5ld2x5IGNyZWF0ZWQgbGlib21wIGxpYnJhcnkKKyMgIC0gRmFpbHMgaWYgdGVzdC10b3VjaC5jIGRvZXMgbm90IGNvbXBpbGUgb3IgaWYgdGVzdC10b3VjaC5jIGRvZXMgbm90IHJ1biBhZnRlciBjb21waWxhdGlvbgorIyAgLSBQcm9ncmFtIGRlcGVuZGVuY2llczogZ2NjIG9yIGcrKywgZ3JlcCwgYm91cm5lIHNoZWxsCisjICAtIEF2YWlsYWJsZSBmb3IgYWxsIFVuaXgsTWFjLFdpbmRvd3MgYnVpbGRzLiAgTm90IGF2YWlsYWJsZSBvbiBJbnRlbChSKSBNSUMgQXJjaGl0ZWN0dXJlIGJ1aWxkcy4KKyMgKDIpIHRlc3QtcmVsbworIyAgLSBUZXN0cyBkeW5hbWljIGxpYnJhcmllcyBmb3IgcG9zaXRpb24tZGVwZW5kZW50IGNvZGUgKGNhbiBub3QgaGF2ZSBhbnkgcG9zaXRpb24gZGVwZW5kZW50IGNvZGUpCisjICAtIEZhaWxzIGlmIFRFWFRSRUwgaXMgaW4gb3V0cHV0IG9mIHJlYWRlbGYgLWQgbGlib21wLnNvIGNvbW1hbmQKKyMgIC0gUHJvZ3JhbSBkZXBlbmRlbmNpZXM6IHJlYWRlbGYsIGdyZXAsIGJvdXJuZSBzaGVsbAorIyAgLSBBdmFpbGFibGUgZm9yIFVuaXgsIEludGVsKFIpIE1JQyBBcmNoaXRlY3R1cmUgZHluYW1pYyBsaWJyYXJ5IGJ1aWxkcy4gTm90IGF2YWlsYWJsZSBvdGhlcndpc2UuCisjICgzKSB0ZXN0LWV4ZWNzdGFjaworIyAgLSBUZXN0cyBpZiBzdGFjayBpcyBleGVjdXRhYmxlCisjICAtIEZhaWxzIGlmIHN0YWNrIGlzIGV4ZWN1dGFibGUuIFNob3VsZCBvbmx5IGJlIHJlYWRhYmxlIGFuZCB3cml0YWJsZS4gTm90IGV4ZWN0dWFibGUuCisjICAtIFByb2dyYW0gZGVwZW5kZW5jaWVzOiBwZXJsLCByZWFkZWxmCisjICAtIEF2YWlsYWJsZSBmb3IgVW5peCBkeW5hbWljIGxpYnJhcnkgYnVpbGRzLiBOb3QgYXZhaWxhYmxlIG90aGVyd2lzZS4KKyMgKDQpIHRlc3QtaW5zdHIgKEludGVsKFIpIE1JQyBBcmNoaXRlY3V0cmUgb25seSkKKyMgIC0gVGVzdHMgSW50ZWwoUikgTUlDIEFyY2hpdGVjdHVyZSBsaWJyYXJpZXMgZm9yIHZhbGlkIGluc3RydWN0aW9uIHNldAorIyAgLSBGYWlscyBpZiBmaW5kcyBpbnZhbGlkIGluc3RydWN0aW9uIGZvciBJbnRlbChSKSBNSUMgQXJjaGl0ZWN0dXJlICh3YXNuJ3QgY29tcGlsZWQgd2l0aCBjb3JyZWN0IGZsYWdzKQorIyAgLSBQcm9ncmFtIGRlcGVuZGVuY2llczogcGVybCwgb2JqZHVtcAorIyAgLSBBdmFpbGFibGUgZm9yIEludGVsKFIpIE1JQyBBcmNoaXRlY3R1cmUgYW5kIGkzODYgYnVpbGRzLiBOb3QgYXZhaWxhYmxlIG90aGVyd2lzZS4KKyMgKDUpIHRlc3QtZGVwcworIyAgLSBUZXN0cyBuZXdseSBjcmVhdGVkIGxpYm9tcCBmb3IgbGlicmFyeSBkZXBlbmRlbmNpZXMKKyMgIC0gRmFpbHMgaWYgc2VlcyBhIGRlcGVuZGVuY2Ugbm90IGxpc3RlZCBpbiB0ZF9leHAgdmFyaWFibGUgYmVsb3cKKyMgIC0gUHJvZ3JhbSBkZXBlbmRlbmNpZXM6IHBlcmwsICh1bml4KXJlYWRlbGYsIChtYWMpb3Rvb2xbNjRdLCAod2luZG93cylsaW5rLmV4ZQorIyAgLSBBdmFpbGFibGUgZm9yIFVuaXgsTWFjLFdpbmRvd3MsIEludGVsKFIpIE1JQyBBcmNoaXRlY3R1cmUgZHluYW1pYyBidWlsZHMgYW5kIFdpbmRvd3MKKyMgICAgc3RhdGljIGJ1aWxkcy4gTm90IGF2YWlsYWJsZSBvdGhlcndpc2UuCisKKyMgZ2V0IGxpYnJhcnkgbG9jYXRpb24KK2lmKFdJTjMyKQorICBnZXRfdGFyZ2V0X3Byb3BlcnR5KExJQk9NUF9PVVRQVVRfRElSRUNUT1JZIG9tcCBSVU5USU1FX09VVFBVVF9ESVJFQ1RPUlkpCisgIGdldF90YXJnZXRfcHJvcGVydHkoTElCT01QSU1QX09VVFBVVF9ESVJFQ1RPUlkgb21waW1wIEFSQ0hJVkVfT1VUUFVUX0RJUkVDVE9SWSkKKyAgaWYoTk9UIExJQk9NUElNUF9PVVRQVVRfRElSRUNUT1JZKQorICAgIHNldChMSUJPTVBJTVBfT1VUUFVUX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0pCisgIGVuZGlmKCkKK2Vsc2UoKQorICBnZXRfdGFyZ2V0X3Byb3BlcnR5KExJQk9NUF9PVVRQVVRfRElSRUNUT1JZIG9tcCBMSUJSQVJZX09VVFBVVF9ESVJFQ1RPUlkpCitlbmRpZigpCitpZihOT1QgTElCT01QX09VVFBVVF9ESVJFQ1RPUlkpCisgIHNldChMSUJPTVBfT1VUUFVUX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0pCitlbmRpZigpCisKKyMgdGVzdC10b3VjaAorZmluZF9wcm9ncmFtKExJQk9NUF9TSEVMTCBzaCkKK2lmKFdJTjMyKQorICBpZihMSUJPTVBfU0hFTEwpCisgICAgc2V0KGxpYm9tcF90ZXN0X3RvdWNoX3RhcmdldHMgdGVzdC10b3VjaC1tZC8uc3VjY2VzcyB0ZXN0LXRvdWNoLW10Ly5zdWNjZXNzKQorICBlbmRpZigpCisgICMgcGljayB0ZXN0LXRvdWNoIGNvbXBpbGVyCisgIHNldChsaWJvbXBfdGVzdF90b3VjaF9jb21waWxlciAke0NNQUtFX0NfQ09NUElMRVJ9KQorICAjIHRlc3QtdG91Y2ggY29tcGlsYXRpb24gZmxhZ3MKKyAgbGlib21wX2FwcGVuZChsaWJvbXBfdGVzdF90b3VjaF9jZmxhZ3MgL25vbG9nbykKKyAgbGlib21wX2FwcGVuZChsaWJvbXBfdGVzdF90b3VjaF9saWJzICR7TElCT01QSU1QX09VVFBVVF9ESVJFQ1RPUll9LyR7TElCT01QX0lNUF9MSUJfRklMRX0pCisgIGlmKCR7SUEzMn0pCisgICAgbGlib21wX2FwcGVuZChsaWJvbXBfdGVzdF90b3VjaF9sZGZsYWdzIC9zYWZlc2VoKQorICBlbmRpZigpCitlbHNlKCkgIyAoVW5peCBiYXNlZCBzeXN0ZW1zLCBJbnRlbChSKSBNSUMgQXJjaGl0ZWN0dXJlLCBhbmQgTWFjKQorICBpZihMSUJPTVBfU0hFTEwpCisgICAgc2V0KGxpYm9tcF90ZXN0X3RvdWNoX3RhcmdldHMgdGVzdC10b3VjaC1ydC8uc3VjY2VzcykKKyAgZW5kaWYoKQorICAjIHBpY2sgdGVzdC10b3VjaCBjb21waWxlcgorICBpZigke0xJQk9NUF9VU0VfU1REQ1BQTElCfSkKKyAgICBzZXQobGlib21wX3Rlc3RfdG91Y2hfY29tcGlsZXIgJHtDTUFLRV9DWFhfQ09NUElMRVJ9KQorICBlbHNlKCkKKyAgICBzZXQobGlib21wX3Rlc3RfdG91Y2hfY29tcGlsZXIgJHtDTUFLRV9DX0NPTVBJTEVSfSkKKyAgZW5kaWYoKQorICAjIHRlc3QtdG91Y2ggY29tcGlsYXRpb24gZmxhZ3MKKyAgbGlib21wX2FwcGVuZChsaWJvbXBfdGVzdF90b3VjaF9saWJzICIke0NNQUtFX1RIUkVBRF9MSUJTX0lOSVR9IikKKyAgaWYoJHtJQTMyfSkKKyAgICBsaWJvbXBfYXBwZW5kKGxpYm9tcF90ZXN0X3RvdWNoX2NmbGFncyAtbTMyIExJQk9NUF9IQVZFX00zMl9GTEFHKQorICBlbmRpZigpCisgIGxpYm9tcF9hcHBlbmQobGlib21wX3Rlc3RfdG91Y2hfbGlicyAke0xJQk9NUF9PVVRQVVRfRElSRUNUT1JZfS8ke0xJQk9NUF9MSUJfRklMRX0pCisgIGxpYm9tcF9hcHBlbmQobGlib21wX3Rlc3RfdG91Y2hfbGlicyAiJHtMSUJPTVBfSFdMT0NfTElCUkFSWX0iIExJQk9NUF9VU0VfSFdMT0MpCisgIGlmKEFQUExFKQorICAgIHNldChsaWJvbXBfdGVzdF90b3VjaF9lbnYgIkRZTERfTElCUkFSWV9QQVRIPS46JHtMSUJPTVBfT1VUUFVUX0RJUkVDVE9SWX06JEVOVntEWUxEX0xJQlJBUllfUEFUSH0iKQorICAgIGxpYm9tcF9hcHBlbmQobGlib21wX3Rlc3RfdG91Y2hfbGRmbGFncyAiLVdsLC1ycGF0aCwke0xJQk9NUF9IV0xPQ19MSUJSQVJZX0RJUn0iIExJQk9NUF9VU0VfSFdMT0MpCisgIGVsc2UoKQorICAgIHNldChsaWJvbXBfdGVzdF90b3VjaF9lbnYgIkxEX0xJQlJBUllfUEFUSD0uOiR7TElCT01QX09VVFBVVF9ESVJFQ1RPUll9OiRFTlZ7TERfTElCUkFSWV9QQVRIfSIpCisgICAgbGlib21wX2FwcGVuZChsaWJvbXBfdGVzdF90b3VjaF9sZGZsYWdzICItV2wsLXJwYXRoPSR7TElCT01QX0hXTE9DX0xJQlJBUllfRElSfSIgTElCT01QX1VTRV9IV0xPQykKKyAgZW5kaWYoKQorZW5kaWYoKQorbWFjcm8obGlib21wX3Rlc3RfdG91Y2hfcmVjaXBlIHRlc3RfdG91Y2hfZGlyKQorICBzZXQobGlib21wX3Rlc3RfdG91Y2hfZGVwZW5kZW5jaWVzICR7TElCT01QX1NSQ19ESVJ9L3Rlc3QtdG91Y2guYyBvbXApCisgIHNldChsaWJvbXBfdGVzdF90b3VjaF9leGUgJHt0ZXN0X3RvdWNoX2Rpcn0vdGVzdC10b3VjaCR7Q01BS0VfRVhFQ1VUQUJMRV9TVUZGSVh9KQorICBzZXQobGlib21wX3Rlc3RfdG91Y2hfb2JqICR7dGVzdF90b3VjaF9kaXJ9L3Rlc3QtdG91Y2gke0NNQUtFX0NfT1VUUFVUX0VYVEVOU0lPTn0pCisgIGlmKFdJTjMyKQorICAgIGlmKCR7UkVMRUFTRV9CVUlMRH0gT1IgJHtSRUxXSVRIREVCSU5GT19CVUlMRH0pCisgICAgICBpZigke3Rlc3RfdG91Y2hfZGlyfSBNQVRDSEVTICJ0ZXN0LXRvdWNoLW10IikKKyAgICAgICAgbGlib21wX2FwcGVuZChsaWJvbXBfdGVzdF90b3VjaF9jZmxhZ3MgL01UKQorICAgICAgZWxzZSgpCisgICAgICAgIGxpYm9tcF9hcHBlbmQobGlib21wX3Rlc3RfdG91Y2hfY2ZsYWdzIC9NRCkKKyAgICAgIGVuZGlmKCkKKyAgICBlbHNlKCkKKyAgICAgIGlmKCR7dGVzdF90b3VjaF9kaXJ9IE1BVENIRVMgInRlc3QtdG91Y2gtbXQiKQorICAgICAgICBsaWJvbXBfYXBwZW5kKGxpYm9tcF90ZXN0X3RvdWNoX2NmbGFncyAvTVRkKQorICAgICAgZWxzZSgpCisgICAgICAgIGxpYm9tcF9hcHBlbmQobGlib21wX3Rlc3RfdG91Y2hfY2ZsYWdzIC9NRGQpCisgICAgICBlbmRpZigpCisgICAgZW5kaWYoKQorICAgIHNldChsaWJvbXBfdGVzdF90b3VjaF9vdXRfZmxhZ3MgLUZlJHtsaWJvbXBfdGVzdF90b3VjaF9leGV9IC1GbyR7bGlib21wX3Rlc3RfdG91Y2hfb2JqfSkKKyAgICBsaXN0KEFQUEVORCBsaWJvbXBfdGVzdF90b3VjaF9kZXBlbmRlbmNpZXMgb21waW1wKQorICBlbHNlKCkKKyAgICBzZXQobGlib21wX3Rlc3RfdG91Y2hfb3V0X2ZsYWdzIC1vICR7bGlib21wX3Rlc3RfdG91Y2hfZXhlfSkKKyAgZW5kaWYoKQorICBhZGRfY3VzdG9tX2NvbW1hbmQoCisgICAgT1VUUFVUICAke3Rlc3RfdG91Y2hfZGlyfS8uc3VjY2VzcyAke2xpYm9tcF90ZXN0X3RvdWNoX2V4ZX0gJHtsaWJvbXBfdGVzdF90b3VjaF9vYmp9CisgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIG1ha2VfZGlyZWN0b3J5ICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS8ke3Rlc3RfdG91Y2hfZGlyfQorICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSByZW1vdmUgLWYgJHt0ZXN0X3RvdWNoX2Rpcn0vKgorICAgIENPTU1BTkQgJHtsaWJvbXBfdGVzdF90b3VjaF9jb21waWxlcn0gJHtsaWJvbXBfdGVzdF90b3VjaF9vdXRfZmxhZ3N9ICR7bGlib21wX3Rlc3RfdG91Y2hfY2ZsYWdzfQorICAgICAgJHtMSUJPTVBfU1JDX0RJUn0vdGVzdC10b3VjaC5jICR7bGlib21wX3Rlc3RfdG91Y2hfbGRmbGFnc30gJHtsaWJvbXBfdGVzdF90b3VjaF9saWJzfQorICAgIENPTU1BTkQgJHtMSUJPTVBfU0hFTEx9IC1jIFwiJHtsaWJvbXBfdGVzdF90b3VjaF9lbnZ9ICR7bGlib21wX3Rlc3RfdG91Y2hfZXhlfVwiCisgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIHRvdWNoICR7dGVzdF90b3VjaF9kaXJ9Ly5zdWNjZXNzCisgICAgREVQRU5EUyAke2xpYm9tcF90ZXN0X3RvdWNoX2RlcGVuZGVuY2llc30KKyAgKQorZW5kbWFjcm8oKQorbGlib21wX2FwcGVuZChsaWJvbXBfdGVzdF90b3VjaF9lbnYgIktNUF9WRVJTSU9OPTEiKQorYWRkX2N1c3RvbV90YXJnZXQobGlib21wLXRlc3QtdG91Y2ggREVQRU5EUyAke2xpYm9tcF90ZXN0X3RvdWNoX3RhcmdldHN9KQoraWYoV0lOMzIpCisgIGxpYm9tcF90ZXN0X3RvdWNoX3JlY2lwZSh0ZXN0LXRvdWNoLW10KQorICBsaWJvbXBfdGVzdF90b3VjaF9yZWNpcGUodGVzdC10b3VjaC1tZCkKK2Vsc2UoKQorICBsaWJvbXBfdGVzdF90b3VjaF9yZWNpcGUodGVzdC10b3VjaC1ydCkKK2VuZGlmKCkKKworIyB0ZXN0LXJlbG8KK2FkZF9jdXN0b21fdGFyZ2V0KGxpYm9tcC10ZXN0LXJlbG8gREVQRU5EUyB0ZXN0LXJlbG8vLnN1Y2Nlc3MpCithZGRfY3VzdG9tX2NvbW1hbmQoCisgIE9VVFBVVCAgdGVzdC1yZWxvLy5zdWNjZXNzIHRlc3QtcmVsby9yZWFkZWxmLmxvZworICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgbWFrZV9kaXJlY3RvcnkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3Rlc3QtcmVsbworICBDT01NQU5EIHJlYWRlbGYgLWQgJHtMSUJPTVBfT1VUUFVUX0RJUkVDVE9SWX0vJHtMSUJPTVBfTElCX0ZJTEV9ID4gdGVzdC1yZWxvL3JlYWRlbGYubG9nCisgIENPTU1BTkQgZ3JlcCAtZSBURVhUUkVMIHRlc3QtcmVsby9yZWFkZWxmLmxvZyBcOyB0ZXN0ICQkPyAtZXEgMQorICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgdG91Y2ggdGVzdC1yZWxvLy5zdWNjZXNzCisgIERFUEVORFMgb21wCispCisKKyMgdGVzdC1leGVjc3RhY2sKK2FkZF9jdXN0b21fdGFyZ2V0KGxpYm9tcC10ZXN0LWV4ZWNzdGFjayBERVBFTkRTIHRlc3QtZXhlY3N0YWNrLy5zdWNjZXNzKQorYWRkX2N1c3RvbV9jb21tYW5kKAorICBPVVRQVVQgIHRlc3QtZXhlY3N0YWNrLy5zdWNjZXNzCisgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBtYWtlX2RpcmVjdG9yeSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGVzdC1leGVjc3RhY2sKKyAgQ09NTUFORCAke1BFUkxfRVhFQ1VUQUJMRX0gJHtMSUJPTVBfVE9PTFNfRElSfS9jaGVjay1leGVjc3RhY2sucGwgLS1vcz0ke0xJQk9NUF9QRVJMX1NDUklQVF9PU30KKyAgICAtLWFyY2g9JHtMSUJPTVBfQVJDSH0gJHtMSUJPTVBfT1VUUFVUX0RJUkVDVE9SWX0vJHtMSUJPTVBfTElCX0ZJTEV9CisgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSB0b3VjaCB0ZXN0LWV4ZWNzdGFjay8uc3VjY2VzcworICBERVBFTkRTIG9tcAorKQorCisjIHRlc3QtaW5zdHIKK2FkZF9jdXN0b21fdGFyZ2V0KGxpYm9tcC10ZXN0LWluc3RyIERFUEVORFMgdGVzdC1pbnN0ci8uc3VjY2VzcykKK2FkZF9jdXN0b21fY29tbWFuZCgKKyAgT1VUUFVUICB0ZXN0LWluc3RyLy5zdWNjZXNzCisgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBtYWtlX2RpcmVjdG9yeSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGVzdC1pbnN0cgorICBDT01NQU5EICR7UEVSTF9FWEVDVVRBQkxFfSAke0xJQk9NUF9UT09MU19ESVJ9L2NoZWNrLWluc3RydWN0aW9uLXNldC5wbCAtLW9zPSR7TElCT01QX1BFUkxfU0NSSVBUX09TfQorICAgIC0tYXJjaD0ke0xJQk9NUF9BUkNIfSAtLXNob3cgLS1taWMtYXJjaD0ke0xJQk9NUF9NSUNfQVJDSH0gJHtMSUJPTVBfT1VUUFVUX0RJUkVDVE9SWX0vJHtMSUJPTVBfTElCX0ZJTEV9CisgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSB0b3VjaCB0ZXN0LWluc3RyLy5zdWNjZXNzCisgIERFUEVORFMgb21wICR7TElCT01QX1RPT0xTX0RJUn0vY2hlY2staW5zdHJ1Y3Rpb24tc2V0LnBsCispCisKKyMgdGVzdC1kZXBzCithZGRfY3VzdG9tX3RhcmdldChsaWJvbXAtdGVzdC1kZXBzIERFUEVORFMgdGVzdC1kZXBzLy5zdWNjZXNzKQorc2V0KGxpYm9tcF9leHBlY3RlZF9saWJyYXJ5X2RlcHMpCitpZihDTUFLRV9TWVNURU1fTkFNRSBNQVRDSEVTICJGcmVlQlNEIikKKyAgc2V0KGxpYm9tcF9leHBlY3RlZF9saWJyYXJ5X2RlcHMgbGliYy5zby43IGxpYnRoci5zby4zKQorICBsaWJvbXBfYXBwZW5kKGxpYm9tcF9leHBlY3RlZF9saWJyYXJ5X2RlcHMgbGliaHdsb2Muc28uNSBMSUJPTVBfVVNFX0hXTE9DKQorZWxzZWlmKENNQUtFX1NZU1RFTV9OQU1FIE1BVENIRVMgIk5ldEJTRCIpCisgIHNldChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzIGxpYmMuc28uMTIgbGlicHRocmVhZC5zby4xIGxpYm0uc28uMCkKKyAgbGlib21wX2FwcGVuZChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzIGxpYmh3bG9jLnNvLjUgTElCT01QX1VTRV9IV0xPQykKK2Vsc2VpZihBUFBMRSkKKyAgc2V0KGxpYm9tcF9leHBlY3RlZF9saWJyYXJ5X2RlcHMgL3Vzci9saWIvbGliU3lzdGVtLkIuZHlsaWIpCitlbHNlaWYoV0lOMzIpCisgIHNldChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzIGtlcm5lbDMyLmRsbCkKKyAgbGlib21wX2FwcGVuZChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzIHBzYXBpLmRsbCBMSUJPTVBfT01QVF9TVVBQT1JUKQorZWxzZSgpCisgIGlmKCR7TUlDfSkKKyAgICBzZXQobGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwcyBsaWJjLnNvLjYgbGlicHRocmVhZC5zby4wIGxpYmRsLnNvLjIpCisgICAgaWYoIiR7TElCT01QX01JQ19BUkNIfSIgU1RSRVFVQUwgImtuZiIpCisgICAgICBsaWJvbXBfYXBwZW5kKGxpYm9tcF9leHBlY3RlZF9saWJyYXJ5X2RlcHMgbGQtbGludXgtbDFvbS5zby4yKQorICAgICAgbGlib21wX2FwcGVuZChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzIGxpYmdjY19zLnNvLjEpCisgICAgZWxzZWlmKCIke0xJQk9NUF9NSUNfQVJDSH0iIFNUUkVRVUFMICJrbmMiKQorICAgICAgbGlib21wX2FwcGVuZChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzIGxkLWxpbnV4LWsxb20uc28uMikKKyAgICBlbmRpZigpCisgIGVsc2UoKQorICAgIHNldChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzIGxpYmRsLnNvLjIgbGliZ2NjX3Muc28uMSkKKyAgICBpZigke0lBMzJ9KQorICAgICAgbGlib21wX2FwcGVuZChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzIGxpYmMuc28uNikKKyAgICAgIGxpYm9tcF9hcHBlbmQobGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwcyBsZC1saW51eC5zby4yKQorICAgIGVsc2VpZigke0lOVEVMNjR9KQorICAgICAgbGlib21wX2FwcGVuZChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzIGxpYmMuc28uNikKKyAgICAgIGxpYm9tcF9hcHBlbmQobGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwcyBsZC1saW51eC14ODYtNjQuc28uMikKKyAgICBlbHNlaWYoJHtBUk19KQorICAgICAgbGlib21wX2FwcGVuZChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzIGxpYmMuc28uNikKKyAgICAgIGxpYm9tcF9hcHBlbmQobGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwcyBsaWJmZmkuc28uNikKKyAgICAgIGxpYm9tcF9hcHBlbmQobGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwcyBsaWJmZmkuc28uNSkKKyAgICAgIGxpYm9tcF9hcHBlbmQobGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwcyBsZC1saW51eC1hcm1oZi5zby4zKQorICAgIGVsc2VpZigke1BQQzY0fSkKKyAgICAgIGxpYm9tcF9hcHBlbmQobGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwcyBsaWJjLnNvLjYpCisgICAgICBsaWJvbXBfYXBwZW5kKGxpYm9tcF9leHBlY3RlZF9saWJyYXJ5X2RlcHMgbGQ2NC5zby4xKQorICAgIGVuZGlmKCkKKyAgICBsaWJvbXBfYXBwZW5kKGxpYm9tcF9leHBlY3RlZF9saWJyYXJ5X2RlcHMgbGlicHRocmVhZC5zby4wIElGX0ZBTFNFIFNUVUJTX0xJQlJBUlkpCisgICAgbGlib21wX2FwcGVuZChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzIGxpYmh3bG9jLnNvLjUgTElCT01QX1VTRV9IV0xPQykKKyAgZW5kaWYoKQorICBsaWJvbXBfYXBwZW5kKGxpYm9tcF9leHBlY3RlZF9saWJyYXJ5X2RlcHMgbGlic3RkYysrLnNvLjYgTElCT01QX1VTRV9TVERDUFBMSUIpCisgIGxpYm9tcF9hcHBlbmQobGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwcyBsaWJtLnNvLjYgTElCT01QX1NUQVRTKQorZW5kaWYoKQorIyBQZXJsIHNjcmlwdCBleHBlY3RzIGNvbW1hIHNlcGFyYXRlZCBsaXN0CitzdHJpbmcoUkVQTEFDRSAiOyIgIiwiIGxpYm9tcF9leHBlY3RlZF9saWJyYXJ5X2RlcHMgIiR7bGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwc30iKQorYWRkX2N1c3RvbV9jb21tYW5kKAorICBPVVRQVVQgIHRlc3QtZGVwcy8uc3VjY2VzcworICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgbWFrZV9kaXJlY3RvcnkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3Rlc3QtZGVwcworICBDT01NQU5EICR7UEVSTF9FWEVDVVRBQkxFfSAke0xJQk9NUF9UT09MU19ESVJ9L2NoZWNrLWRlcGVuZHMucGwgLS1vcz0ke0xJQk9NUF9QRVJMX1NDUklQVF9PU30KKyAgICAtLWFyY2g9JHtMSUJPTVBfQVJDSH0gLS1leHBlY3RlZD0iJHtsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzfSIgJHtMSUJPTVBfT1VUUFVUX0RJUkVDVE9SWX0vJHtMSUJPTVBfTElCX0ZJTEV9CisgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSB0b3VjaCB0ZXN0LWRlcHMvLnN1Y2Nlc3MKKyAgREVQRU5EUyBvbXAgJHtMSUJPTVBfVE9PTFNfRElSfS9jaGVjay1kZXBlbmRzLnBsCispCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL2NtYWtlL0xpYm9tcFV0aWxzLmNtYWtlIGIvZmluYWwvcnVudGltZS9jbWFrZS9MaWJvbXBVdGlscy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTgxYTZjCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9jbWFrZS9MaWJvbXBVdGlscy5jbWFrZQpAQCAtMCwwICsxLDE5MSBAQAorIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCisjIHZvaWQgbGlib21wX3NheShzdHJpbmcgbWVzc2FnZV90b191c2VyKTsKKyMgLSBwcmludHMgb3V0IG1lc3NhZ2VfdG9fdXNlcgorbWFjcm8obGlib21wX3NheSBtZXNzYWdlX3RvX3VzZXIpCisgIG1lc3NhZ2UoU1RBVFVTICJMSUJPTVA6ICR7bWVzc2FnZV90b191c2VyfSIpCitlbmRtYWNybygpCisKKyMgdm9pZCBsaWJvbXBfd2FybmluZ19zYXkoc3RyaW5nIG1lc3NhZ2VfdG9fdXNlcik7CisjIC0gcHJpbnRzIG91dCBtZXNzYWdlX3RvX3VzZXIgd2l0aCBhIHdhcm5pbmcKK21hY3JvKGxpYm9tcF93YXJuaW5nX3NheSBtZXNzYWdlX3RvX3VzZXIpCisgIG1lc3NhZ2UoV0FSTklORyAiTElCT01QOiAke21lc3NhZ2VfdG9fdXNlcn0iKQorZW5kbWFjcm8oKQorCisjIHZvaWQgbGlib21wX2Vycm9yX3NheShzdHJpbmcgbWVzc2FnZV90b191c2VyKTsKKyMgLSBwcmludHMgb3V0IG1lc3NhZ2VfdG9fdXNlciB3aXRoIGFuIGVycm9yIGFuZCBleGl0cyBjbWFrZQorbWFjcm8obGlib21wX2Vycm9yX3NheSBtZXNzYWdlX3RvX3VzZXIpCisgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIkxJQk9NUDogJHttZXNzYWdlX3RvX3VzZXJ9IikKK2VuZG1hY3JvKCkKKworIyBsaWJvbXBfYXBwZW5kKDxmbGFnPiA8ZmxhZ3NfbGlzdD4gWyhJRl9UUlVFIHwgSUZfRkFMU0UgfCBJRl9UUlVFXzFfMCApIEJPT0xFQU5dKQorIworIyBsaWJvbXBfYXBwZW5kKDxmbGFnPiA8ZmxhZ3NfbGlzdD4pCisjICAgLSB1bmNvbmRpdGlvbmFsbHkgYXBwZW5kcyA8ZmxhZz4gdG8gdGhlIGxpc3Qgb2YgZGVmaW5pdGlvbnMKKyMKKyMgbGlib21wX2FwcGVuZCg8ZmxhZz4gPGZsYWdzX2xpc3Q+IDxCT09MRUFOPikKKyMgICAtIGFwcGVuZHMgPGZsYWc+IHRvIHRoZSBsaXN0IG9mIGRlZmluaXRpb25zIGlmIEJPT0xFQU4gaXMgdHJ1ZQorIworIyBsaWJvbXBfYXBwZW5kKDxmbGFnPiA8ZmxhZ3NfbGlzdD4gSUZfVFJVRSA8Qk9PTEVBTj4pCisjICAgLSBhcHBlbmRzIDxmbGFnPiB0byB0aGUgbGlzdCBvZiBkZWZpbml0aW9ucyBpZiBCT09MRUFOIGlzIHRydWUKKyMKKyMgbGlib21wX2FwcGVuZCg8ZmxhZz4gPGZsYWdzX2xpc3Q+IElGX0ZBTFNFIDxCT09MRUFOPikKKyMgICAtIGFwcGVuZHMgPGZsYWc+IHRvIHRoZSBsaXN0IG9mIGRlZmluaXRpb25zIGlmIEJPT0xFQU4gaXMgZmFsc2UKKyMKKyMgbGlib21wX2FwcGVuZCg8ZmxhZz4gPGZsYWdzX2xpc3Q+IElGX0RFRklORUQgPFZBUklBQkxFPikKKyMgICAtIGFwcGVuZHMgPGZsYWc+IHRvIHRoZSBsaXN0IG9mIGRlZmluaXRpb25zIGlmIFZBUklBQkxFIGlzIGRlZmluZWQKKyMKKyMgbGlib21wX2FwcGVuZCg8ZmxhZz4gPGZsYWdzX2xpc3Q+IElGX1RSVUVfMV8wIDxCT09MRUFOPikKKyMgICAtIGFwcGVuZHMgPGZsYWc+PTEgdG8gdGhlIGxpc3Qgb2YgZGVmaW5pdGlvbnMgaWYgPEJPT0xFQU4+IGlzIHRydWUsIDxmbGFnPj0wIG90aGVyd2lzZQorIyBlLmcuLCBsaWJvbXBfYXBwZW5kKCItRCBVU0VfRkVBVFVSRSIgSUZfVFJVRV8xXzAgSEFWRV9GRUFUVVJFKQorIyAgICAgYXBwZW5kcyAiLUQgVVNFX0ZFQVRVUkU9MSIgaWYgSEFWRV9GRUFUVVJFIGlzIHRydWUKKyMgICAgIG9yICItRCBVU0VfRkVBVFVSRT0wIiBpZiBIQVZFX0ZFQVRVUkUgaXMgZmFsc2UKK21hY3JvKGxpYm9tcF9hcHBlbmQgZmxhZ3MgZmxhZykKKyAgaWYoTk9UICgke0FSR0N9IEVRVUFMIDIgT1IgJHtBUkdDfSBFUVVBTCAzIE9SICR7QVJHQ30gRVFVQUwgNCkpCisgICAgbGlib21wX2Vycm9yX3NheSgibGlib21wX2FwcGVuZDogdGFrZXMgMiwgMywgb3IgNCBhcmd1bWVudHMiKQorICBlbmRpZigpCisgIGlmKCR7QVJHQ30gRVFVQUwgMikKKyAgICBsaXN0KEFQUEVORCAke2ZsYWdzfSAiJHtmbGFnfSIpCisgIGVsc2VpZigke0FSR0N9IEVRVUFMIDMpCisgICAgaWYoJHtBUkdWMn0pCisgICAgICBsaXN0KEFQUEVORCAke2ZsYWdzfSAiJHtmbGFnfSIpCisgICAgZW5kaWYoKQorICBlbHNlKCkKKyAgICBpZigke0FSR1YyfSBTVFJFUVVBTCAiSUZfVFJVRSIpCisgICAgICBpZigke0FSR1YzfSkKKyAgICAgICAgbGlzdChBUFBFTkQgJHtmbGFnc30gIiR7ZmxhZ30iKQorICAgICAgZW5kaWYoKQorICAgIGVsc2VpZigke0FSR1YyfSBTVFJFUVVBTCAiSUZfRkFMU0UiKQorICAgICAgaWYoTk9UICR7QVJHVjN9KQorICAgICAgICBsaXN0KEFQUEVORCAke2ZsYWdzfSAiJHtmbGFnfSIpCisgICAgICBlbmRpZigpCisgICAgZWxzZWlmKCR7QVJHVjJ9IFNUUkVRVUFMICJJRl9ERUZJTkVEIikKKyAgICAgIGlmKERFRklORUQgJHtBUkdWM30pCisgICAgICAgIGxpc3QoQVBQRU5EICR7ZmxhZ3N9ICIke2ZsYWd9IikKKyAgICAgIGVuZGlmKCkKKyAgICBlbHNlaWYoJHtBUkdWMn0gU1RSRVFVQUwgIklGX1RSVUVfMV8wIikKKyAgICAgIGlmKCR7QVJHVjN9KQorICAgICAgICBsaXN0KEFQUEVORCAke2ZsYWdzfSAiJHtmbGFnfT0xIikKKyAgICAgIGVsc2UoKQorICAgICAgICBsaXN0KEFQUEVORCAke2ZsYWdzfSAiJHtmbGFnfT0wIikKKyAgICAgIGVuZGlmKCkKKyAgICBlbHNlKCkKKyAgICAgIGxpYm9tcF9lcnJvcl9zYXkoImxpYm9tcF9hcHBlbmQ6IHRoaXJkIGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIElGX1RSVUUsIElGX0ZBTFNFLCBJRl9ERUZJTkVELCBJRl9UUlVFXzFfMCIpCisgICAgZW5kaWYoKQorICBlbmRpZigpCitlbmRtYWNybygpCisKKyMgdm9pZCBsaWJvbXBfZ2V0X2xlZ2FsX2FyY2goc3RyaW5nKiByZXR1cm5fYXJjaF9zdHJpbmcpOworIyAtIHJldHVybnMgKHRocm91Z2ggcmV0dXJuX2FyY2hfc3RyaW5nKSB0aGUgZm9ybWFsIGFyY2hpdGVjdHVyZQorIyAgIHN0cmluZyBvciB3YXJucyB1c2VyIG9mIHVua25vd24gYXJjaGl0ZWN0dXJlCitmdW5jdGlvbihsaWJvbXBfZ2V0X2xlZ2FsX2FyY2ggcmV0dXJuX2FyY2hfc3RyaW5nKQorICBpZigke0lBMzJ9KQorICAgIHNldCgke3JldHVybl9hcmNoX3N0cmluZ30gIklBLTMyIiBQQVJFTlRfU0NPUEUpCisgIGVsc2VpZigke0lOVEVMNjR9KQorICAgIHNldCgke3JldHVybl9hcmNoX3N0cmluZ30gIkludGVsKFIpIDY0IiBQQVJFTlRfU0NPUEUpCisgIGVsc2VpZigke01JQ30pCisgICAgc2V0KCR7cmV0dXJuX2FyY2hfc3RyaW5nfSAiSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlIiBQQVJFTlRfU0NPUEUpCisgIGVsc2VpZigke0FSTX0pCisgICAgc2V0KCR7cmV0dXJuX2FyY2hfc3RyaW5nfSAiQVJNIiBQQVJFTlRfU0NPUEUpCisgIGVsc2VpZigke1BQQzY0QkV9KQorICAgIHNldCgke3JldHVybl9hcmNoX3N0cmluZ30gIlBQQzY0QkUiIFBBUkVOVF9TQ09QRSkKKyAgZWxzZWlmKCR7UFBDNjRMRX0pCisgICAgc2V0KCR7cmV0dXJuX2FyY2hfc3RyaW5nfSAiUFBDNjRMRSIgUEFSRU5UX1NDT1BFKQorICBlbHNlaWYoJHtBQVJDSDY0fSkKKyAgICBzZXQoJHtyZXR1cm5fYXJjaF9zdHJpbmd9ICJBQVJDSDY0IiBQQVJFTlRfU0NPUEUpCisgIGVsc2UoKQorICAgIHNldCgke3JldHVybl9hcmNoX3N0cmluZ30gIiR7TElCT01QX0FSQ0h9IiBQQVJFTlRfU0NPUEUpCisgICAgbGlib21wX3dhcm5pbmdfc2F5KCJsaWJvbXBfZ2V0X2xlZ2FsX2FyY2goKTogV2FybmluZzogVW5rbm93biBhcmNoaXRlY3R1cmU6IFVzaW5nICR7TElCT01QX0FSQ0h9IikKKyAgZW5kaWYoKQorZW5kZnVuY3Rpb24oKQorCisjIHZvaWQgbGlib21wX2NoZWNrX3ZhcmlhYmxlKHN0cmluZyB2YXIsIC4uLik7CisjIC0gcnVucyB0aHJvdWdoIGFsbCB2YWx1ZXMgY2hlY2tpbmcgaWYgJHt2YXJ9ID09IHZhbHVlCisjIC0gdXBwZXJjYXNlIGFuZCBsb3dlcmNhc2UgZG8gbm90IG1hdHRlcgorIyAtIGlmIHRoZSB2YXIgaXMgZm91bmQsIHRoZW4ganVzdCBwcmludCBpdCBvdXQKKyMgLSBpZiB0aGUgdmFyIGlzIG5vdCBmb3VuZCwgdGhlbiBlcnJvciBvdXQKK2Z1bmN0aW9uKGxpYm9tcF9jaGVja192YXJpYWJsZSB2YXIpCisgIHNldCh2YWxpZF9mbGFnIDApCisgIHN0cmluZyhUT0xPV0VSICIkeyR7dmFyfX0iIHZhcl9sb3dlcikKKyAgZm9yZWFjaCh2YWx1ZSBJTiBMSVNUUyBBUkdOKQorICAgIHN0cmluZyhUT0xPV0VSICIke3ZhbHVlfSIgdmFsdWVfbG93ZXIpCisgICAgaWYoIiR7dmFyX2xvd2VyfSIgU1RSRVFVQUwgIiR7dmFsdWVfbG93ZXJ9IikKKyAgICAgIHNldCh2YWxpZF9mbGFnIDEpCisgICAgICBzZXQodGhlX3ZhbHVlICIke3ZhbHVlfSIpCisgICAgZW5kaWYoKQorICBlbmRmb3JlYWNoKCkKKyAgaWYoJHt2YWxpZF9mbGFnfSBFUVVBTCAwKQorICAgIGxpYm9tcF9lcnJvcl9zYXkoImxpYm9tcF9jaGVja192YXJpYWJsZSgpOiAke3Zhcn0gPSAkeyR7dmFyfX0gaXMgdW5rbm93biIpCisgIGVuZGlmKCkKK2VuZGZ1bmN0aW9uKCkKKworIyB2b2lkIGxpYm9tcF9nZXRfYnVpbGRfbnVtYmVyKHN0cmluZyBzcmNfZGlyLCBzdHJpbmcqIHJldHVybl9idWlsZF9udW1iZXIpOworIyAtIGdyYWIgdGhlIGVpZ2h0IGRpZ2l0IGJ1aWxkIG51bWJlciAob3IgMDAwMDAwMDApIGZyb20ga21wX3ZlcnNpb24uYworZnVuY3Rpb24obGlib21wX2dldF9idWlsZF9udW1iZXIgc3JjX2RpciByZXR1cm5fYnVpbGRfbnVtYmVyKQorICAjIHNldHMgZmlsZV9saW5lc19saXN0IHRvIGEgbGlzdCBvZiBhbGwgbGluZXMgaW4ga21wX3ZlcnNpb24uYworICBmaWxlKFNUUklOR1MgIiR7c3JjX2Rpcn0vc3JjL2ttcF92ZXJzaW9uLmMiIGZpbGVfbGluZXNfbGlzdCkKKworICAjIHJ1bnMgdGhyb3VnaCBlYWNoIGxpbmUgaW4ga21wX3ZlcnNpb24uYworICBmb3JlYWNoKGxpbmUgSU4gTElTVFMgZmlsZV9saW5lc19saXN0KQorICAgICMgaWYgdGhlIGxpbmUgYmVnaW5zIHdpdGggIiNkZWZpbmUgS01QX1ZFUlNJT05fQlVJTEQiIHRoZW4gd2UgdGFrZSBub3Qgb2YgdGhlIGJ1aWxkIG51bWJlcgorICAgIHN0cmluZyhSRUdFWCBNQVRDSCAiXlsgXHRdKiNkZWZpbmVbIFx0XStLTVBfVkVSU0lPTl9CVUlMRCIgdmFsaWQgIiR7bGluZX0iKQorICAgIGlmKE5PVCAiJHt2YWxpZH0iIFNUUkVRVUFMICIiKSAjIGlmIHdlIG1hdGNoZWQgIiNkZWZpbmUgS01QX1ZFUlNJT05fQlVJTEQiLCB0aGVuIGdyYWIgdGhlIGJ1aWxkIG51bWJlcgorICAgICAgc3RyaW5nKFJFR0VYIFJFUExBQ0UgIl5bIFx0XSojZGVmaW5lWyBcdF0rS01QX1ZFUlNJT05fQlVJTERbIFx0XSsoWzAtOV0rKSIgIlxcMSIKKyAgICAgICAgICAgYnVpbGRfbnVtYmVyICIke2xpbmV9IgorICAgICAgKQorICAgIGVuZGlmKCkKKyAgZW5kZm9yZWFjaCgpCisgIHNldCgke3JldHVybl9idWlsZF9udW1iZXJ9ICIke2J1aWxkX251bWJlcn0iIFBBUkVOVF9TQ09QRSkgIyByZXR1cm4gYnVpbGQgbnVtYmVyCitlbmRmdW5jdGlvbigpCisKKyMgdm9pZCBsaWJvbXBfZ2V0X2xlZ2FsX3R5cGUoc3RyaW5nKiByZXR1cm5fbGVnYWxfdHlwZSk7CisjIC0gc2V0IHRoZSBsZWdhbCB0eXBlIG5hbWUgUGVyZm9ybWFuY2UvUHJvZmlsaW5nL1N0dWIKK2Z1bmN0aW9uKGxpYm9tcF9nZXRfbGVnYWxfdHlwZSByZXR1cm5fbGVnYWxfdHlwZSkKKyAgaWYoJHtOT1JNQUxfTElCUkFSWX0pCisgICAgc2V0KCR7cmV0dXJuX2xlZ2FsX3R5cGV9ICJQZXJmb3JtYW5jZSIgUEFSRU5UX1NDT1BFKQorICBlbHNlaWYoJHtQUk9GSUxFX0xJQlJBUll9KQorICAgIHNldCgke3JldHVybl9sZWdhbF90eXBlfSAiUHJvZmlsaW5nIiBQQVJFTlRfU0NPUEUpCisgIGVsc2VpZigke1NUVUJTX0xJQlJBUll9KQorICAgIHNldCgke3JldHVybl9sZWdhbF90eXBlfSAiU3R1YiIgUEFSRU5UX1NDT1BFKQorICBlbmRpZigpCitlbmRmdW5jdGlvbigpCisKKyMgdm9pZCBsaWJvbXBfYWRkX3N1ZmZpeChzdHJpbmcgc3VmZml4LCBsaXN0PHN0cmluZz4qIGxpc3Rfb2ZfaXRlbXMpOworIyAtIHJldHVybnMgbGlzdF9vZl9pdGVtcyB3aXRoIHN1ZmZpeCBhcHBlbmRlZCB0byBhbGwgaXRlbXMKKyMgLSBvcmlnaW5hbCBsaXN0IGlzIG1vZGlmaWVkCitmdW5jdGlvbihsaWJvbXBfYWRkX3N1ZmZpeCBzdWZmaXggbGlzdF9vZl9pdGVtcykKKyAgc2V0KGxvY2FsX2xpc3QgIiIpCisgIGZvcmVhY2goaXRlbSBJTiBMSVNUUyAiJHtsaXN0X29mX2l0ZW1zfSIpCisgICAgaWYoTk9UICIke2l0ZW19IiBTVFJFUVVBTCAiIikKKyAgICAgIGxpc3QoQVBQRU5EIGxvY2FsX2xpc3QgIiR7aXRlbX0ke3N1ZmZpeH0iKQorICAgIGVuZGlmKCkKKyAgZW5kZm9yZWFjaCgpCisgIHNldCgke2xpc3Rfb2ZfaXRlbXN9ICIke2xvY2FsX2xpc3R9IiBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCisKKyMgdm9pZCBsaWJvbXBfbGlzdF90b19zdHJpbmcobGlzdDxzdHJpbmc+IGxpc3Rfb2ZfdGhpbmdzLCBzdHJpbmcqIHJldHVybl9zdHJpbmcpOworIyAtIGNvbnZlcnRzIGEgbGlzdCB0byBhIHNwYWNlIHNlcGFyYXRlZCBzdHJpbmcKK2Z1bmN0aW9uKGxpYm9tcF9saXN0X3RvX3N0cmluZyBsaXN0X29mX3RoaW5ncyByZXR1cm5fc3RyaW5nKQorICBzdHJpbmcoUkVQTEFDRSAiOyIgIiAiIG91dHB1dF92YXJpYWJsZSAiJHtsaXN0X29mX3RoaW5nc30iKQorICBzZXQoJHtyZXR1cm5fc3RyaW5nfSAiJHtvdXRwdXRfdmFyaWFibGV9IiBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCisKKyMgdm9pZCBsaWJvbXBfc3RyaW5nX3RvX2xpc3Qoc3RyaW5nIHN0ciwgbGlzdDxzdHJpbmc+KiByZXR1cm5fbGlzdCk7CisjIC0gY29udmVydHMgYSBzdHJpbmcgdG8gYSBzZW1pY29sb24gc2VwYXJhdGVkIGxpc3QKKyMgLSB3aGF0IGl0IHJlYWxseSBkb2VzIGlzIGp1c3Qgc3RyaW5nX3JlcGxhY2UgYWxsIHJ1bm5pbmcgd2hpdGVzcGFjZSB0byBhIHNlbWljb2xvbgorIyAtIGluIGNtYWtlLCBhIGxpc3QgaXMgc3RyaW5ncyBzZXBhcmF0ZWQgYnkgc2VtaWNvbG9uczogaS5lLiwgbGlzdCBvZiBmb3VyIGl0ZW1zLCBsaXN0ID0gIml0ZW0xO2l0ZW0yO2l0ZW0zO2l0ZW00IgorZnVuY3Rpb24obGlib21wX3N0cmluZ190b19saXN0IHN0ciByZXR1cm5fbGlzdCkKKyAgc2V0KG91dHN0cikKKyAgc3RyaW5nKFJFR0VYIFJFUExBQ0UgIlsgXHRdKyIgIjsiIG91dHN0ciAiJHtzdHJ9IikKKyAgc2V0KCR7cmV0dXJuX2xpc3R9ICIke291dHN0cn0iIFBBUkVOVF9TQ09QRSkKK2VuZGZ1bmN0aW9uKCkKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9jbWFrZS9jb25maWctaXguY21ha2UgYi9maW5hbC9ydW50aW1lL2NtYWtlL2NvbmZpZy1peC5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTc4YTdhCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9jbWFrZS9jb25maWctaXguY21ha2UKQEAgLTAsMCArMSwyNTkgQEAKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworaW5jbHVkZShDaGVja0NDb21waWxlckZsYWcpCitpbmNsdWRlKENoZWNrQ1NvdXJjZUNvbXBpbGVzKQoraW5jbHVkZShDaGVja0NYWENvbXBpbGVyRmxhZykKK2luY2x1ZGUoQ2hlY2tJbmNsdWRlRmlsZSkKK2luY2x1ZGUoQ2hlY2tMaWJyYXJ5RXhpc3RzKQoraW5jbHVkZShDaGVja0luY2x1ZGVGaWxlcykKK2luY2x1ZGUoTGlib21wQ2hlY2tMaW5rZXJGbGFnKQoraW5jbHVkZShMaWJvbXBDaGVja0ZvcnRyYW5GbGFnKQorCisjIENoZWNrIGZvciB2ZXJzaW9uZWQgc3ltYm9scworZnVuY3Rpb24obGlib21wX2NoZWNrX3ZlcnNpb25fc3ltYm9scyByZXR2YWwpCisgIHNldChzb3VyY2VfY29kZQorICAgICIjaW5jbHVkZSA8c3RkaW8uaD4KKyAgICB2b2lkIGZ1bmMxKCkgeyBwcmludGYoXCJIZWxsb1wiKTsgfQorICAgIHZvaWQgZnVuYzIoKSB7IHByaW50ZihcIldvcmxkXCIpOyB9CisgICAgX19hc21fXyhcIi5zeW12ZXIgZnVuYzEsIGZ1bmNAVkVSMVwiKTsKKyAgICBfX2FzbV9fKFwiLnN5bXZlciBmdW5jMiwgZnVuY0BWRVIyXCIpOworICAgIGludCBtYWluKCkgeworICAgICAgZnVuYzEoKTsKKyAgICAgIGZ1bmMyKCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9IikKKyAgc2V0KHZlcnNpb25fc2NyaXB0X3NvdXJjZSAiVkVSMSB7IH07IFZFUjIgeyB9IFZFUjE7IikKKyAgZmlsZShXUklURSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vX192ZXJzaW9uX3NjcmlwdC50eHQgIiR7dmVyc2lvbl9zY3JpcHRfc291cmNlfSIpCisgIHNldChDTUFLRV9SRVFVSVJFRF9GTEFHUyAtV2wsLS12ZXJzaW9uLXNjcmlwdD0ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vX192ZXJzaW9uX3NjcmlwdC50eHQpCisgIGNoZWNrX2Nfc291cmNlX2NvbXBpbGVzKCIke3NvdXJjZV9jb2RlfSIgJHtyZXR2YWx9KQorICBzZXQoJHtyZXR2YWx9ICR7JHtyZXR2YWx9fSBQQVJFTlRfU0NPUEUpCisgIGZpbGUoUkVNT1ZFICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9fX3ZlcnNpb25fc2NyaXB0LnR4dCkKK2VuZGZ1bmN0aW9uKCkKKworIyBJbmNsdWRlcyB0aGUgYXJjaGl0ZWN0dXJlIGZsYWcgaW4gYm90aCBjb21waWxlIGFuZCBsaW5rIHBoYXNlCitmdW5jdGlvbihsaWJvbXBfY2hlY2tfYXJjaGl0ZWN0dXJlX2ZsYWcgZmxhZyByZXR2YWwpCisgIHNldChDTUFLRV9SRVFVSVJFRF9GTEFHUyAiJHtmbGFnfSIpCisgIGNoZWNrX2NfY29tcGlsZXJfZmxhZygiJHtmbGFnfSIgJHtyZXR2YWx9KQorICBzZXQoJHtyZXR2YWx9ICR7JHtyZXR2YWx9fSBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCisKKyMgQ2hlY2tpbmcgQywgQ1hYLCBMaW5rZXIgRmxhZ3MKK2NoZWNrX2N4eF9jb21waWxlcl9mbGFnKC1zdGQ9YysrMTEgTElCT01QX0hBVkVfU1REX0NQUDExX0ZMQUcpCitjaGVja19jeHhfY29tcGlsZXJfZmxhZygtZm5vLWV4Y2VwdGlvbnMgTElCT01QX0hBVkVfRk5PX0VYQ0VQVElPTlNfRkxBRykKK2NoZWNrX2NfY29tcGlsZXJfZmxhZygiLXggYysrIiBMSUJPTVBfSEFWRV9YX0NQUF9GTEFHKQorY2hlY2tfY19jb21waWxlcl9mbGFnKC1XZXJyb3IgTElCT01QX0hBVkVfV0VSUk9SX0ZMQUcpCitjaGVja19jX2NvbXBpbGVyX2ZsYWcoLVd1bnVzZWQtZnVuY3Rpb24gTElCT01QX0hBVkVfV05PX1VOVVNFRF9GVU5DVElPTl9GTEFHKQorY2hlY2tfY19jb21waWxlcl9mbGFnKC1XdW51c2VkLWxvY2FsLXR5cGVkZWYgTElCT01QX0hBVkVfV05PX1VOVVNFRF9MT0NBTF9UWVBFREVGX0ZMQUcpCitjaGVja19jX2NvbXBpbGVyX2ZsYWcoLVd1bnVzZWQtdmFsdWUgTElCT01QX0hBVkVfV05PX1VOVVNFRF9WQUxVRV9GTEFHKQorY2hlY2tfY19jb21waWxlcl9mbGFnKC1XdW51c2VkLXZhcmlhYmxlIExJQk9NUF9IQVZFX1dOT19VTlVTRURfVkFSSUFCTEVfRkxBRykKK2NoZWNrX2NfY29tcGlsZXJfZmxhZygtV3N3aXRjaCBMSUJPTVBfSEFWRV9XTk9fU1dJVENIX0ZMQUcpCitjaGVja19jX2NvbXBpbGVyX2ZsYWcoLVdjb3ZlcmVkLXN3aXRjaC1kZWZhdWx0IExJQk9NUF9IQVZFX1dOT19DT1ZFUkVEX1NXSVRDSF9ERUZBVUxUX0ZMQUcpCitjaGVja19jX2NvbXBpbGVyX2ZsYWcoLVdkZXByZWNhdGVkLXJlZ2lzdGVyIExJQk9NUF9IQVZFX1dOT19ERVBSRUNBVEVEX1JFR0lTVEVSX0ZMQUcpCitjaGVja19jX2NvbXBpbGVyX2ZsYWcoLVdzaWduLWNvbXBhcmUgTElCT01QX0hBVkVfV05PX1NJR05fQ09NUEFSRV9GTEFHKQorY2hlY2tfY19jb21waWxlcl9mbGFnKC1XZ251LWFub255bW91cy1zdHJ1Y3QgTElCT01QX0hBVkVfV05PX0dOVV9BTk9OWU1PVVNfU1RSVUNUX0ZMQUcpCitjaGVja19jX2NvbXBpbGVyX2ZsYWcoLVd1bmtub3duLXByYWdtYXMgTElCT01QX0hBVkVfV05PX1VOS05PV05fUFJBR01BU19GTEFHKQorY2hlY2tfY19jb21waWxlcl9mbGFnKC1XbWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMgTElCT01QX0hBVkVfV05PX01JU1NJTkdfRklFTERfSU5JVElBTElaRVJTX0ZMQUcpCitjaGVja19jX2NvbXBpbGVyX2ZsYWcoLVdtaXNzaW5nLWJyYWNlcyBMSUJPTVBfSEFWRV9XTk9fTUlTU0lOR19CUkFDRVNfRkxBRykKK2NoZWNrX2NfY29tcGlsZXJfZmxhZygtV2NvbW1lbnQgTElCT01QX0hBVkVfV05PX0NPTU1FTlRfRkxBRykKK2NoZWNrX2NfY29tcGlsZXJfZmxhZygtV3NlbGYtYXNzaWduIExJQk9NUF9IQVZFX1dOT19TRUxGX0FTU0lHTl9GTEFHKQorY2hlY2tfY19jb21waWxlcl9mbGFnKC1XdmxhLWV4dGVuc2lvbiBMSUJPTVBfSEFWRV9XTk9fVkxBX0VYVEVOU0lPTl9GTEFHKQorY2hlY2tfY19jb21waWxlcl9mbGFnKC1XZm9ybWF0LXBlZGFudGljIExJQk9NUF9IQVZFX1dOT19GT1JNQVRfUEVEQU5USUNfRkxBRykKK2NoZWNrX2NfY29tcGlsZXJfZmxhZygtbXNzZTIgTElCT01QX0hBVkVfTVNTRTJfRkxBRykKK2NoZWNrX2NfY29tcGlsZXJfZmxhZygtZnRscy1tb2RlbD1pbml0aWFsLWV4ZWMgTElCT01QX0hBVkVfRlRMU19NT0RFTF9GTEFHKQorbGlib21wX2NoZWNrX2FyY2hpdGVjdHVyZV9mbGFnKC1tbWljIExJQk9NUF9IQVZFX01NSUNfRkxBRykKK2xpYm9tcF9jaGVja19hcmNoaXRlY3R1cmVfZmxhZygtbTMyIExJQk9NUF9IQVZFX00zMl9GTEFHKQoraWYoV0lOMzIpCisgICMgQ2hlY2sgV2luZG93cyBNU1ZDIHN0eWxlIGZsYWdzLgorICBjaGVja19jX2NvbXBpbGVyX2ZsYWcoL1RQIExJQk9NUF9IQVZFX1RQX0ZMQUcpCisgIGNoZWNrX2N4eF9jb21waWxlcl9mbGFnKC9FSHNjIExJQk9NUF9IQVZFX0VIU0NfRkxBRykKKyAgY2hlY2tfY3h4X2NvbXBpbGVyX2ZsYWcoL0dTIExJQk9NUF9IQVZFX0dTX0ZMQUcpCisgIGNoZWNrX2N4eF9jb21waWxlcl9mbGFnKC9PeS0gTElCT01QX0hBVkVfT3lfX0ZMQUcpCisgIGNoZWNrX2N4eF9jb21waWxlcl9mbGFnKC9hcmNoOlNTRTIgTElCT01QX0hBVkVfQVJDSF9TU0UyX0ZMQUcpCisgIGNoZWNrX2N4eF9jb21waWxlcl9mbGFnKC9Rc2FmZXNlaCBMSUJPTVBfSEFWRV9RU0FGRVNFSF9GTEFHKQorICAjIEl0IGlzIGRpZmZpY3VsdCB0byBjcmVhdGUgYSBkdW1teSBtYXNtIGFzc2VtYmx5IGZpbGUKKyAgIyBhbmQgdGhlbiBjaGVjayB0aGUgTUFTTSBhc3NlbWJsZXIgdG8gc2VlIGlmIHRoZXNlIGZsYWdzIGV4aXN0IGFuZCB3b3JrLAorICAjIHNvIHdlIGFzc3VtZSB0aGV5IGRvIGZvciBXaW5kb3dzLgorICBzZXQoTElCT01QX0hBVkVfU0FGRVNFSF9NQVNNX0ZMQUcgVFJVRSkKKyAgc2V0KExJQk9NUF9IQVZFX0NPRkZfTUFTTV9GTEFHIFRSVUUpCisgICMgQ2hhbmdlIFdpbmRvd3MgZmxhZ3MgL01EeCB0byAvTVR4CisgIGZvcmVhY2gobGlib21wX2xhbmcgSU4gSVRFTVMgQyBDWFgpCisgICAgZm9yZWFjaChsaWJvbXBfYnR5cGUgSU4gSVRFTVMgREVCVUcgUkVMV0lUSERFQklORk8gUkVMRUFTRSBNSU5TSVpFUkVMKQorICAgICAgc3RyaW5nKFJFUExBQ0UgIi9NRCIgIi9NVCIKKyAgICAgICAgQ01BS0VfJHtsaWJvbXBfbGFuZ31fRkxBR1NfJHtsaWJvbXBfYnR5cGV9CisgICAgICAgICIke0NNQUtFXyR7bGlib21wX2xhbmd9X0ZMQUdTXyR7bGlib21wX2J0eXBlfX0iCisgICAgICApCisgICAgZW5kZm9yZWFjaCgpCisgIGVuZGZvcmVhY2goKQorZWxzZSgpCisgICMgSXQgaXMgZGlmZmljdWx0IHRvIGNyZWF0ZSBhIGR1bW15IGFzc2VtYmx5IGZpbGUgdGhhdCBjb21waWxlcyBpbnRvIGFuCisgICMgZXhlY3R1YWJsZSBmb3IgZXZlcnkgYXJjaGl0ZWN0dXJlIGFuZCB0aGVuIGNoZWNrIHRoZSBDIGNvbXBpbGVyIHRvCisgICMgc2VlIGlmIC14IGFzc2VtYmxlci13aXRoLWNwcCBleGlzdHMgYW5kIHdvcmtzLCBzbyB3ZSBhc3N1bWUgaXQgZG9lcyBmb3Igbm9uLVdpbmRvd3MuCisgIHNldChMSUJPTVBfSEFWRV9YX0FTU0VNQkxFUl9XSVRIX0NQUF9GTEFHIFRSVUUpCitlbmRpZigpCitpZigke0xJQk9NUF9GT1JUUkFOX01PRFVMRVN9KQorICBsaWJvbXBfY2hlY2tfZm9ydHJhbl9mbGFnKC1tMzIgTElCT01QX0hBVkVfTTMyX0ZPUlRSQU5fRkxBRykKK2VuZGlmKCkKKworIyBDaGVjayBsaW5rZXIgZmxhZ3MKK2lmKFdJTjMyKQorICBsaWJvbXBfY2hlY2tfbGlua2VyX2ZsYWcoL1NBRkVTRUggTElCT01QX0hBVkVfU0FGRVNFSF9GTEFHKQorZWxzZWlmKE5PVCBBUFBMRSkKKyAgbGlib21wX2NoZWNrX2xpbmtlcl9mbGFnKC1XbCwteCBMSUJPTVBfSEFWRV9YX0ZMQUcpCisgIGxpYm9tcF9jaGVja19saW5rZXJfZmxhZygtV2wsLS13YXJuLXNoYXJlZC10ZXh0cmVsIExJQk9NUF9IQVZFX1dBUk5fU0hBUkVEX1RFWFRSRUxfRkxBRykKKyAgbGlib21wX2NoZWNrX2xpbmtlcl9mbGFnKC1XbCwtLWFzLW5lZWRlZCBMSUJPTVBfSEFWRV9BU19ORUVERURfRkxBRykKKyAgbGlib21wX2NoZWNrX2xpbmtlcl9mbGFnKCItV2wsLS12ZXJzaW9uLXNjcmlwdD0ke0xJQk9NUF9TUkNfRElSfS9leHBvcnRzX3NvLnR4dCIgTElCT01QX0hBVkVfVkVSU0lPTl9TQ1JJUFRfRkxBRykKKyAgbGlib21wX2NoZWNrX2xpbmtlcl9mbGFnKC1zdGF0aWMtbGliZ2NjIExJQk9NUF9IQVZFX1NUQVRJQ19MSUJHQ0NfRkxBRykKKyAgbGlib21wX2NoZWNrX2xpbmtlcl9mbGFnKC1XbCwteixub2V4ZWNzdGFjayBMSUJPTVBfSEFWRV9aX05PRVhFQ1NUQUNLX0ZMQUcpCisgIGxpYm9tcF9jaGVja19saW5rZXJfZmxhZygtV2wsLWZpbmk9X19rbXBfaW50ZXJuYWxfZW5kX2ZpbmkgTElCT01QX0hBVkVfRklOSV9GTEFHKQorZW5kaWYoKQorCisjIENoZWNrIEludGVsKFIpIEMgQ29tcGlsZXIgc3BlY2lmaWMgZmxhZ3MKK2lmKENNQUtFX0NfQ09NUElMRVJfSUQgU1RSRVFVQUwgIkludGVsIikKKyAgY2hlY2tfY3h4X2NvbXBpbGVyX2ZsYWcoL1Fsb25nX2RvdWJsZSBMSUJPTVBfSEFWRV9MT05HX0RPVUJMRV9GTEFHKQorICBjaGVja19jeHhfY29tcGlsZXJfZmxhZygvUWRpYWctZGlzYWJsZToxNzcgTElCT01QX0hBVkVfRElBR19ESVNBQkxFXzE3N19GTEFHKQorICBjaGVja19jeHhfY29tcGlsZXJfZmxhZygvUWlubGluZS1taW4tc2l6ZT0xIExJQk9NUF9IQVZFX0lOTElORV9NSU5fU0laRV9GTEFHKQorICBjaGVja19jeHhfY29tcGlsZXJfZmxhZygtUW9wdGlvbixjcHAsLS1leHRlbmRlZF9mbG9hdF90eXBlcyBMSUJPTVBfSEFWRV9FWFRFTkRFRF9GTE9BVF9UWVBFU19GTEFHKQorICBjaGVja19jeHhfY29tcGlsZXJfZmxhZygtZmFsaWduLXN0YWNrPW1haW50YWluLTE2LWJ5dGUgTElCT01QX0hBVkVfRkFMSUdOX1NUQUNLX0ZMQUcpCisgIGNoZWNrX2N4eF9jb21waWxlcl9mbGFnKCItb3B0LXN0cmVhbWluZy1zdG9yZXMgbmV2ZXIiIExJQk9NUF9IQVZFX09QVF9TVFJFQU1JTkdfU1RPUkVTX0ZMQUcpCisgIGxpYm9tcF9jaGVja19saW5rZXJfZmxhZygtc3RhdGljLWludGVsIExJQk9NUF9IQVZFX1NUQVRJQ19JTlRFTF9GTEFHKQorICBsaWJvbXBfY2hlY2tfbGlua2VyX2ZsYWcoLW5vLWludGVsLWV4dGVuc2lvbnMgTElCT01QX0hBVkVfTk9fSU5URUxfRVhURU5TSU9OU19GTEFHKQorICBjaGVja19saWJyYXJ5X2V4aXN0cyhpcmNfcGljIF9pbnRlbF9mYXN0X21lbWNweSAiIiBMSUJPTVBfSEFWRV9JUkNfUElDX0xJQlJBUlkpCitlbmRpZigpCisKKyMgQ2hlY2tpbmcgVGhyZWFkaW5nIHJlcXVpcmVtZW50cworZmluZF9wYWNrYWdlKFRocmVhZHMgUkVRVUlSRUQpCitpZihXSU4zMikKKyAgaWYoTk9UIENNQUtFX1VTRV9XSU4zMl9USFJFQURTX0lOSVQpCisgICAgbGlib21wX2Vycm9yX3NheSgiTmVlZCBXaW4zMiB0aHJlYWQgaW50ZXJmYWNlIG9uIFdpbmRvd3MuIikKKyAgZW5kaWYoKQorZWxzZSgpCisgIGlmKE5PVCBDTUFLRV9VU0VfUFRIUkVBRFNfSU5JVCkKKyAgICBsaWJvbXBfZXJyb3Jfc2F5KCJOZWVkIHB0aHJlYWQgaW50ZXJmYWNlIG9uIFVuaXgtbGlrZSBzeXN0ZW1zLiIpCisgIGVuZGlmKCkKK2VuZGlmKCkKKworIyBGaW5kIHBlcmwgZXhlY3V0YWJsZQorIyBQZXJsIGlzIHVzZWQgdG8gY3JlYXRlIG9tcC5oIChhbmQgb3RoZXIgaGVhZGVycykgYWxvbmcgd2l0aCBrbXBfaTE4bl9pZC5pbmMgYW5kIGttcF9pMThuX2RlZmF1bHQuaW5jCitmaW5kX3BhY2thZ2UoUGVybCBSRVFVSVJFRCkKKyMgVGhlIHBlcmwgc2NyaXB0cyB0YWtlIHRoZSAtLW9zPSBmbGFnIHdoaWNoIGV4cGVjdHMgYSBjZXJ0YWluIGZvcm1hdCBmb3Igb3BlcmF0aW5nIHN5c3RlbXMuICBVbnRpbCB0aGUKKyMgcGVybCBzY3JpcHRzIGFyZSByZW1vdmVkLCB0aGUgbW9zdCBwb3J0YWJsZSB3YXkgdG8gaGFuZGxlIHRoaXMgaXMgdG8gaGF2ZSBhbGwgb3BlcmF0aW5nIHN5c3RlbXMgdGhhdAorIyBhcmUgbmVpdGhlciBXaW5kb3dzIG5vciBNYWMgKE1vc3QgVW5peCBmbGF2b3JzKSBiZSBjb25zaWRlcmVkIGxpbiB0byB0aGUgcGVybCBzY3JpcHRzLiAgVGhpcyBpcyByb290ZWQKKyMgaW4gdGhhdCBhbGwgdGhlIFBlcmwgc2NyaXB0cyBjaGVjayB0aGUgb3BlcmF0aW5nIHN5c3RlbSBhbmQgd2lsbCBmYWlsIGlmIGl0IGlzbid0ICJ2YWxpZCIuICBUaGlzCisjIHRlbXBvcmFyeSBzb2x1dGlvbiBsZXRzIHVzIGF2b2lkIHRyeWluZyB0byBlbnVtZXJhdGUgYWxsIHRoZSBwb3NzaWJsZSBPUyB2YWx1ZXMgaW5zaWRlIHRoZSBQZXJsIG1vZHVsZXMuCitpZihXSU4zMikKKyAgc2V0KExJQk9NUF9QRVJMX1NDUklQVF9PUyB3aW4pCitlbHNlaWYoQVBQTEUpCisgIHNldChMSUJPTVBfUEVSTF9TQ1JJUFRfT1MgbWFjKQorZWxzZSgpCisgIHNldChMSUJPTVBfUEVSTF9TQ1JJUFRfT1MgbGluKQorZW5kaWYoKQorCisjIENoZWNraW5nIGZlYXR1cmVzCisjIENoZWNrIGlmIHZlcnNpb24gc3ltYm9sIGFzc2VtYmxlciBkaXJlY3RpdmVzIGFyZSBzdXBwb3J0ZWQKK2xpYm9tcF9jaGVja192ZXJzaW9uX3N5bWJvbHMoTElCT01QX0hBVkVfVkVSU0lPTl9TWU1CT0xTKQorCisjIENoZWNrIGlmIHF1YWQgcHJlY2lzaW9uIHR5cGVzIGFyZSBhdmFpbGFibGUKK2lmKENNQUtFX0NfQ09NUElMRVJfSUQgU1RSRVFVQUwgIkdOVSIpCisgIHNldChMSUJPTVBfSEFWRV9RVUFEX1BSRUNJU0lPTiBUUlVFKQorZWxzZWlmKENNQUtFX0NfQ09NUElMRVJfSUQgU1RSRVFVQUwgIkludGVsIikKKyAgaWYoTElCT01QX0hBVkVfRVhURU5ERURfRkxPQVRfVFlQRVNfRkxBRykKKyAgICBzZXQoTElCT01QX0hBVkVfUVVBRF9QUkVDSVNJT04gVFJVRSkKKyAgZWxzZSgpCisgICAgc2V0KExJQk9NUF9IQVZFX1FVQURfUFJFQ0lTSU9OIFRSVUUpCisgIGVuZGlmKCkKK2Vsc2UoKQorICBzZXQoTElCT01QX0hBVkVfUVVBRF9QUkVDSVNJT04gRkFMU0UpCitlbmRpZigpCisKKyMgQ2hlY2sgaWYgYWRhcHRpdmUgbG9ja3MgYXJlIGF2YWlsYWJsZQoraWYoKCR7SUEzMn0gT1IgJHtJTlRFTDY0fSkgQU5EIE5PVCBNU1ZDKQorICBzZXQoTElCT01QX0hBVkVfQURBUFRJVkVfTE9DS1MgVFJVRSkKK2Vsc2UoKQorICBzZXQoTElCT01QX0hBVkVfQURBUFRJVkVfTE9DS1MgRkFMU0UpCitlbmRpZigpCisKKyMgQ2hlY2sgaWYgc3RhdHMtZ2F0aGVyaW5nIGlzIGF2YWlsYWJsZQoraWYoJHtMSUJPTVBfU1RBVFN9KQorICBjaGVja19jX3NvdXJjZV9jb21waWxlcygKKyAgICAgIl9fdGhyZWFkIGludCB4OworICAgICBpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIAorICAgICB7IHggPSBhcmdjOyByZXR1cm4geDsgfSIKKyAgICAgTElCT01QX0hBVkVfX19USFJFQUQpCisgIGNoZWNrX2Nfc291cmNlX2NvbXBpbGVzKAorICAgICAiaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSAKKyAgICAgeyB1bnNpZ25lZCBsb25nIGxvbmcgdCA9IF9fYnVpbHRpbl9yZWFkY3ljbGVjb3VudGVyKCk7IHJldHVybiAwOyB9IgorICAgICBMSUJPTVBfSEFWRV9fX0JVSUxUSU5fUkVBRENZQ0xFQ09VTlRFUikKKyAgaWYoTk9UIExJQk9NUF9IQVZFX19fQlVJTFRJTl9SRUFEQ1lDTEVDT1VOVEVSKQorICAgIGlmKCR7SUEzMn0gT1IgJHtJTlRFTDY0fSkKKyAgICAgIGNoZWNrX2luY2x1ZGVfZmlsZSh4ODZpbnRyaW4uaCBMSUJPTVBfSEFWRV9YODZJTlRSSU5fSCkKKyAgICAgIGxpYm9tcF9hcHBlbmQoQ01BS0VfUkVRVUlSRURfREVGSU5JVElPTlMgLURMSUJPTVBfSEFWRV9YODZJTlRSSU5fSCBMSUJPTVBfSEFWRV9YODZJTlRSSU5fSCkKKyAgICAgIGNoZWNrX2Nfc291cmNlX2NvbXBpbGVzKAorICAgICAgICAiI2lmZGVmIExJQk9NUF9IQVZFX1g4NklOVFJJTl9ICisgICAgICAgICAjIGluY2x1ZGUgPHg4NmludHJpbi5oPgorICAgICAgICAgI2VuZGlmCisgICAgICAgICBpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsgdW5zaWduZWQgbG9uZyBsb25nIHQgPSBfX3JkdHNjKCk7IHJldHVybiAwOyB9IiBMSUJPTVBfSEFWRV9fX1JEVFNDKQorICAgICAgc2V0KENNQUtFX1JFUVVJUkVEX0RFRklOSVRJT05TKQorICAgIGVuZGlmKCkKKyAgZW5kaWYoKQorICBpZihMSUJPTVBfSEFWRV9fX1RIUkVBRCBBTkQgKExJQk9NUF9IQVZFX19fUkRUU0MgT1IgTElCT01QX0hBVkVfX19CVUlMVElOX1JFQURDWUNMRUNPVU5URVIpKQorICAgIHNldChMSUJPTVBfSEFWRV9TVEFUUyBUUlVFKQorICBlbHNlKCkKKyAgICBzZXQoTElCT01QX0hBVkVfU1RBVFMgRkFMU0UpCisgIGVuZGlmKCkKK2VuZGlmKCkKKworIyBDaGVjayBpZiBPTVBUIHN1cHBvcnQgaXMgYXZhaWxhYmxlCisjIEN1cnJlbnRseSwgX19idWlsdGluX2ZyYW1lX2FkZHJlc3MoKSBpcyByZXF1aXJlZCBmb3IgT01QVAorIyBXZWFrIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCBmb3IgVW5pY2VzLCBMSUJQU0FQSSBpcyB1c2VkIGZvciBXaW5kb3dzCitjaGVja19jX3NvdXJjZV9jb21waWxlcygiaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIHZvaWQqIHAgPSBfX2J1aWx0aW5fZnJhbWVfYWRkcmVzcygwKTsKKyAgcmV0dXJuIDA7fSIgTElCT01QX0hBVkVfX19CVUlMVElOX0ZSQU1FX0FERFJFU1MpCitjaGVja19jX3NvdXJjZV9jb21waWxlcygiX19hdHRyaWJ1dGVfXyAoKHdlYWspKSBpbnQgZm9vKGludCBhKSB7IHJldHVybiBhKmE7IH0KKyAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIHJldHVybiBmb28oYXJnYyk7fSIgTElCT01QX0hBVkVfV0VBS19BVFRSSUJVVEUpCitjaGVja19pbmNsdWRlX2ZpbGVzKCJ3aW5kb3dzLmg7cHNhcGkuaCIgTElCT01QX0hBVkVfUFNBUElfSCkKK2NoZWNrX2xpYnJhcnlfZXhpc3RzKHBzYXBpIEVudW1Qcm9jZXNzTW9kdWxlcyAiIiBMSUJPTVBfSEFWRV9MSUJQU0FQSSkKK2lmKExJQk9NUF9IQVZFX1BTQVBJX0ggQU5EIExJQk9NUF9IQVZFX0xJQlBTQVBJKQorICBzZXQoTElCT01QX0hBVkVfUFNBUEkgVFJVRSkKK2VuZGlmKCkKK2lmKE5PVCBMSUJPTVBfSEFWRV9fX0JVSUxUSU5fRlJBTUVfQUREUkVTUykKKyAgc2V0KExJQk9NUF9IQVZFX09NUFRfU1VQUE9SVCBGQUxTRSkKK2Vsc2UoKQorICBpZihMSUJPTVBfSEFWRV9XRUFLX0FUVFJJQlVURSBPUiBMSUJPTVBfSEFWRV9QU0FQSSkKKyAgICBzZXQoTElCT01QX0hBVkVfT01QVF9TVVBQT1JUIFRSVUUpCisgIGVsc2UoKQorICAgIHNldChMSUJPTVBfSEFWRV9PTVBUX1NVUFBPUlQgRkFMU0UpCisgIGVuZGlmKCkKK2VuZGlmKCkKKworIyBDaGVjayBpZiBIV0xPQyBzdXBwb3J0IGlzIGF2YWlsYWJsZQoraWYoJHtMSUJPTVBfVVNFX0hXTE9DfSkKKyAgaWYoV0lOMzIpCisgICAgc2V0KExJQk9NUF9IQVZFX0hXTE9DIEZBTFNFKQorICAgIGxpYm9tcF9zYXkoIlVzaW5nIGh3bG9jIG5vdCBzdXBwb3J0ZWQgb24gV2luZG93cyB5ZXQiKQorICBlbHNlKCkKKyAgICBzZXQoQ01BS0VfUkVRVUlSRURfSU5DTFVERVMgJHtMSUJPTVBfSFdMT0NfSU5TVEFMTF9ESVJ9L2luY2x1ZGUpCisgICAgY2hlY2tfaW5jbHVkZV9maWxlKGh3bG9jLmggTElCT01QX0hBVkVfSFdMT0NfSCkKKyAgICBzZXQoQ01BS0VfUkVRVUlSRURfSU5DTFVERVMpCisgICAgY2hlY2tfbGlicmFyeV9leGlzdHMoaHdsb2MgaHdsb2NfdG9wb2xvZ3lfaW5pdCAKKyAgICAgICR7TElCT01QX0hXTE9DX0lOU1RBTExfRElSfS9saWIgTElCT01QX0hBVkVfTElCSFdMT0MpCisgICAgZmluZF9saWJyYXJ5KExJQk9NUF9IV0xPQ19MSUJSQVJZIGh3bG9jICR7TElCT01QX0hXTE9DX0lOU1RBTExfRElSfS9saWIpCisgICAgZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChMSUJPTVBfSFdMT0NfTElCUkFSWV9ESVIgJHtMSUJPTVBfSFdMT0NfTElCUkFSWX0gUEFUSCkKKyAgICBpZihMSUJPTVBfSEFWRV9IV0xPQ19IIEFORCBMSUJPTVBfSEFWRV9MSUJIV0xPQyBBTkQgTElCT01QX0hXTE9DX0xJQlJBUlkpCisgICAgICBzZXQoTElCT01QX0hBVkVfSFdMT0MgVFJVRSkKKyAgICBlbHNlKCkKKyAgICAgIHNldChMSUJPTVBfSEFWRV9IV0xPQyBGQUxTRSkKKyAgICAgIGxpYm9tcF9zYXkoIkNvdWxkIG5vdCBmaW5kIGh3bG9jIikKKyAgICBlbmRpZigpCisgIGVuZGlmKCkKK2VuZGlmKCkKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9kb2MvUmVmZXJlbmNlLnBkZiBiL2ZpbmFsL3J1bnRpbWUvZG9jL1JlZmVyZW5jZS5wZGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk3YzQwYwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvZG9jL1JlZmVyZW5jZS5wZGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9kb2MvZG94eWdlbi9jb25maWcgYi9maW5hbC9ydW50aW1lL2RvYy9kb3h5Z2VuL2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjUzMTA0Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9kb2MvZG94eWdlbi9jb25maWcKQEAgLTAsMCArMSwxODIyIEBACisjIERveHlmaWxlIDEubzguMg0KKw0KKyMgVGhpcyBmaWxlIGRlc2NyaWJlcyB0aGUgc2V0dGluZ3MgdG8gYmUgdXNlZCBieSB0aGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0NCisjIGRveHlnZW4gKHd3dy5kb3h5Z2VuLm9yZykgZm9yIGEgcHJvamVjdC4NCisjDQorIyBBbGwgdGV4dCBhZnRlciBhIGhhc2ggKCMpIGlzIGNvbnNpZGVyZWQgYSBjb21tZW50IGFuZCB3aWxsIGJlIGlnbm9yZWQuDQorIyBUaGUgZm9ybWF0IGlzOg0KKyMgICAgICAgVEFHID0gdmFsdWUgW3ZhbHVlLCAuLi5dDQorIyBGb3IgbGlzdHMgaXRlbXMgY2FuIGFsc28gYmUgYXBwZW5kZWQgdXNpbmc6DQorIyAgICAgICBUQUcgKz0gdmFsdWUgW3ZhbHVlLCAuLi5dDQorIyBWYWx1ZXMgdGhhdCBjb250YWluIHNwYWNlcyBzaG91bGQgYmUgcGxhY2VkIGJldHdlZW4gcXVvdGVzICgiICIpLg0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIFByb2plY3QgcmVsYXRlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorIyBUaGlzIHRhZyBzcGVjaWZpZXMgdGhlIGVuY29kaW5nIHVzZWQgZm9yIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBjb25maWcgZmlsZQ0KKyMgdGhhdCBmb2xsb3cuIFRoZSBkZWZhdWx0IGlzIFVURi04IHdoaWNoIGlzIGFsc28gdGhlIGVuY29kaW5nIHVzZWQgZm9yIGFsbA0KKyMgdGV4dCBiZWZvcmUgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhpcyB0YWcuIERveHlnZW4gdXNlcyBsaWJpY29udiAob3IgdGhlDQorIyBpY29udiBidWlsdCBpbnRvIGxpYmMpIGZvciB0aGUgdHJhbnNjb2RpbmcuIFNlZQ0KKyMgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2xpYmljb252IGZvciB0aGUgbGlzdCBvZiBwb3NzaWJsZSBlbmNvZGluZ3MuDQorDQorRE9YWUZJTEVfRU5DT0RJTkcgICAgICA9IFVURi04DQorDQorIyBUaGUgUFJPSkVDVF9OQU1FIHRhZyBpcyBhIHNpbmdsZSB3b3JkIChvciBzZXF1ZW5jZSBvZiB3b3JkcykgdGhhdCBzaG91bGQNCisjIGlkZW50aWZ5IHRoZSBwcm9qZWN0LiBOb3RlIHRoYXQgaWYgeW91IGRvIG5vdCB1c2UgRG94eXdpemFyZCB5b3UgbmVlZA0KKyMgdG8gcHV0IHF1b3RlcyBhcm91bmQgdGhlIHByb2plY3QgbmFtZSBpZiBpdCBjb250YWlucyBzcGFjZXMuDQorDQorUFJPSkVDVF9OQU1FICAgICAgICAgICA9ICJMTFZNIE9wZW5NUCogUnVudGltZSBMaWJyYXJ5Ig0KKw0KKyMgVGhlIFBST0pFQ1RfTlVNQkVSIHRhZyBjYW4gYmUgdXNlZCB0byBlbnRlciBhIHByb2plY3Qgb3IgcmV2aXNpb24gbnVtYmVyLg0KKyMgVGhpcyBjb3VsZCBiZSBoYW5keSBmb3IgYXJjaGl2aW5nIHRoZSBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiBvcg0KKyMgaWYgc29tZSB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtIGlzIHVzZWQuDQorDQorUFJPSkVDVF9OVU1CRVIgICAgICAgICA9DQorDQorIyBVc2luZyB0aGUgUFJPSkVDVF9CUklFRiB0YWcgb25lIGNhbiBwcm92aWRlIGFuIG9wdGlvbmFsIG9uZSBsaW5lIGRlc2NyaXB0aW9uDQorIyBmb3IgYSBwcm9qZWN0IHRoYXQgYXBwZWFycyBhdCB0aGUgdG9wIG9mIGVhY2ggcGFnZSBhbmQgc2hvdWxkIGdpdmUgdmlld2VyDQorIyBhIHF1aWNrIGlkZWEgYWJvdXQgdGhlIHB1cnBvc2Ugb2YgdGhlIHByb2plY3QuIEtlZXAgdGhlIGRlc2NyaXB0aW9uIHNob3J0Lg0KKw0KK1BST0pFQ1RfQlJJRUYgICAgICAgICAgPQ0KKw0KKyMgV2l0aCB0aGUgUFJPSkVDVF9MT0dPIHRhZyBvbmUgY2FuIHNwZWNpZnkgYW4gbG9nbyBvciBpY29uIHRoYXQgaXMNCisjIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLiBUaGUgbWF4aW11bSBoZWlnaHQgb2YgdGhlIGxvZ28gc2hvdWxkIG5vdA0KKyMgZXhjZWVkIDU1IHBpeGVscyBhbmQgdGhlIG1heGltdW0gd2lkdGggc2hvdWxkIG5vdCBleGNlZWQgMjAwIHBpeGVscy4NCisjIERveHlnZW4gd2lsbCBjb3B5IHRoZSBsb2dvIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5Lg0KKw0KK1BST0pFQ1RfTE9HTyAgICAgICAgICAgPQ0KKw0KKyMgVGhlIE9VVFBVVF9ESVJFQ1RPUlkgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgKHJlbGF0aXZlIG9yIGFic29sdXRlKQ0KKyMgYmFzZSBwYXRoIHdoZXJlIHRoZSBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiB3aWxsIGJlIHB1dC4NCisjIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkLCBpdCB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoZSBsb2NhdGlvbg0KKyMgd2hlcmUgZG94eWdlbiB3YXMgc3RhcnRlZC4gSWYgbGVmdCBibGFuayB0aGUgY3VycmVudCBkaXJlY3Rvcnkgd2lsbCBiZSB1c2VkLg0KKw0KK09VVFBVVF9ESVJFQ1RPUlkgICAgICAgPSBkb2MvZG94eWdlbi9nZW5lcmF0ZWQNCisNCisjIElmIHRoZSBDUkVBVEVfU1VCRElSUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlbiBkb3h5Z2VuIHdpbGwgY3JlYXRlDQorIyA0MDk2IHN1Yi1kaXJlY3RvcmllcyAoaW4gMiBsZXZlbHMpIHVuZGVyIHRoZSBvdXRwdXQgZGlyZWN0b3J5IG9mIGVhY2ggb3V0cHV0DQorIyBmb3JtYXQgYW5kIHdpbGwgZGlzdHJpYnV0ZSB0aGUgZ2VuZXJhdGVkIGZpbGVzIG92ZXIgdGhlc2UgZGlyZWN0b3JpZXMuDQorIyBFbmFibGluZyB0aGlzIG9wdGlvbiBjYW4gYmUgdXNlZnVsIHdoZW4gZmVlZGluZyBkb3h5Z2VuIGEgaHVnZSBhbW91bnQgb2YNCisjIHNvdXJjZSBmaWxlcywgd2hlcmUgcHV0dGluZyBhbGwgZ2VuZXJhdGVkIGZpbGVzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSB3b3VsZA0KKyMgb3RoZXJ3aXNlIGNhdXNlIHBlcmZvcm1hbmNlIHByb2JsZW1zIGZvciB0aGUgZmlsZSBzeXN0ZW0uDQorDQorQ1JFQVRFX1NVQkRJUlMgICAgICAgICA9IE5PDQorDQorIyBUaGUgT1VUUFVUX0xBTkdVQUdFIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGxhbmd1YWdlIGluIHdoaWNoIGFsbA0KKyMgZG9jdW1lbnRhdGlvbiBnZW5lcmF0ZWQgYnkgZG94eWdlbiBpcyB3cml0dGVuLiBEb3h5Z2VuIHdpbGwgdXNlIHRoaXMNCisjIGluZm9ybWF0aW9uIHRvIGdlbmVyYXRlIGFsbCBjb25zdGFudCBvdXRwdXQgaW4gdGhlIHByb3BlciBsYW5ndWFnZS4NCisjIFRoZSBkZWZhdWx0IGxhbmd1YWdlIGlzIEVuZ2xpc2gsIG90aGVyIHN1cHBvcnRlZCBsYW5ndWFnZXMgYXJlOg0KKyMgQWZyaWthYW5zLCBBcmFiaWMsIEJyYXppbGlhbiwgQ2F0YWxhbiwgQ2hpbmVzZSwgQ2hpbmVzZS1UcmFkaXRpb25hbCwNCisjIENyb2F0aWFuLCBDemVjaCwgRGFuaXNoLCBEdXRjaCwgRXNwZXJhbnRvLCBGYXJzaSwgRmlubmlzaCwgRnJlbmNoLCBHZXJtYW4sDQorIyBHcmVlaywgSHVuZ2FyaWFuLCBJdGFsaWFuLCBKYXBhbmVzZSwgSmFwYW5lc2UtZW4gKEphcGFuZXNlIHdpdGggRW5nbGlzaA0KKyMgbWVzc2FnZXMpLCBLb3JlYW4sIEtvcmVhbi1lbiwgTGl0aHVhbmlhbiwgTm9yd2VnaWFuLCBNYWNlZG9uaWFuLCBQZXJzaWFuLA0KKyMgUG9saXNoLCBQb3J0dWd1ZXNlLCBSb21hbmlhbiwgUnVzc2lhbiwgU2VyYmlhbiwgU2VyYmlhbi1DeXJpbGxpYywgU2xvdmFrLA0KKyMgU2xvdmVuZSwgU3BhbmlzaCwgU3dlZGlzaCwgVWtyYWluaWFuLCBhbmQgVmlldG5hbWVzZS4NCisNCitPVVRQVVRfTEFOR1VBR0UgICAgICAgID0gRW5nbGlzaA0KKw0KKyMgSWYgdGhlIEJSSUVGX01FTUJFUl9ERVNDIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsDQorIyBpbmNsdWRlIGJyaWVmIG1lbWJlciBkZXNjcmlwdGlvbnMgYWZ0ZXIgdGhlIG1lbWJlcnMgdGhhdCBhcmUgbGlzdGVkIGluDQorIyB0aGUgZmlsZSBhbmQgY2xhc3MgZG9jdW1lbnRhdGlvbiAoc2ltaWxhciB0byBKYXZhRG9jKS4NCisjIFNldCB0byBOTyB0byBkaXNhYmxlIHRoaXMuDQorDQorQlJJRUZfTUVNQkVSX0RFU0MgICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIFJFUEVBVF9CUklFRiB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbCBwcmVwZW5kDQorIyB0aGUgYnJpZWYgZGVzY3JpcHRpb24gb2YgYSBtZW1iZXIgb3IgZnVuY3Rpb24gYmVmb3JlIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbi4NCisjIE5vdGU6IGlmIGJvdGggSElERV9VTkRPQ19NRU1CRVJTIGFuZCBCUklFRl9NRU1CRVJfREVTQyBhcmUgc2V0IHRvIE5PLCB0aGUNCisjIGJyaWVmIGRlc2NyaXB0aW9ucyB3aWxsIGJlIGNvbXBsZXRlbHkgc3VwcHJlc3NlZC4NCisNCitSRVBFQVRfQlJJRUYgICAgICAgICAgID0gWUVTDQorDQorIyBUaGlzIHRhZyBpbXBsZW1lbnRzIGEgcXVhc2ktaW50ZWxsaWdlbnQgYnJpZWYgZGVzY3JpcHRpb24gYWJicmV2aWF0b3INCisjIHRoYXQgaXMgdXNlZCB0byBmb3JtIHRoZSB0ZXh0IGluIHZhcmlvdXMgbGlzdGluZ3MuIEVhY2ggc3RyaW5nDQorIyBpbiB0aGlzIGxpc3QsIGlmIGZvdW5kIGFzIHRoZSBsZWFkaW5nIHRleHQgb2YgdGhlIGJyaWVmIGRlc2NyaXB0aW9uLCB3aWxsIGJlDQorIyBzdHJpcHBlZCBmcm9tIHRoZSB0ZXh0IGFuZCB0aGUgcmVzdWx0IGFmdGVyIHByb2Nlc3NpbmcgdGhlIHdob2xlIGxpc3QsIGlzDQorIyB1c2VkIGFzIHRoZSBhbm5vdGF0ZWQgdGV4dC4gT3RoZXJ3aXNlLCB0aGUgYnJpZWYgZGVzY3JpcHRpb24gaXMgdXNlZCBhcy1pcy4NCisjIElmIGxlZnQgYmxhbmssIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSB1c2VkICgiJG5hbWUiIGlzIGF1dG9tYXRpY2FsbHkNCisjIHJlcGxhY2VkIHdpdGggdGhlIG5hbWUgb2YgdGhlIGVudGl0eSk6ICJUaGUgJG5hbWUgY2xhc3MiICJUaGUgJG5hbWUgd2lkZ2V0Ig0KKyMgIlRoZSAkbmFtZSBmaWxlIiAiaXMiICJwcm92aWRlcyIgInNwZWNpZmllcyIgImNvbnRhaW5zIg0KKyMgInJlcHJlc2VudHMiICJhIiAiYW4iICJ0aGUiDQorDQorQUJCUkVWSUFURV9CUklFRiAgICAgICA9DQorDQorIyBJZiB0aGUgQUxXQVlTX0RFVEFJTEVEX1NFQyBhbmQgUkVQRUFUX0JSSUVGIHRhZ3MgYXJlIGJvdGggc2V0IHRvIFlFUyB0aGVuDQorIyBEb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBkZXRhaWxlZCBzZWN0aW9uIGV2ZW4gaWYgdGhlcmUgaXMgb25seSBhIGJyaWVmDQorIyBkZXNjcmlwdGlvbi4NCisNCitBTFdBWVNfREVUQUlMRURfU0VDICAgID0gTk8NCisNCisjIElmIHRoZSBJTkxJTkVfSU5IRVJJVEVEX01FTUIgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBzaG93IGFsbA0KKyMgaW5oZXJpdGVkIG1lbWJlcnMgb2YgYSBjbGFzcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGF0IGNsYXNzIGFzIGlmIHRob3NlDQorIyBtZW1iZXJzIHdlcmUgb3JkaW5hcnkgY2xhc3MgbWVtYmVycy4gQ29uc3RydWN0b3JzLCBkZXN0cnVjdG9ycyBhbmQgYXNzaWdubWVudA0KKyMgb3BlcmF0b3JzIG9mIHRoZSBiYXNlIGNsYXNzZXMgd2lsbCBub3QgYmUgc2hvd24uDQorDQorSU5MSU5FX0lOSEVSSVRFRF9NRU1CICA9IE5PDQorDQorIyBJZiB0aGUgRlVMTF9QQVRIX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gRG94eWdlbiB3aWxsIHByZXBlbmQgdGhlIGZ1bGwNCisjIHBhdGggYmVmb3JlIGZpbGVzIG5hbWUgaW4gdGhlIGZpbGUgbGlzdCBhbmQgaW4gdGhlIGhlYWRlciBmaWxlcy4gSWYgc2V0DQorIyB0byBOTyB0aGUgc2hvcnRlc3QgcGF0aCB0aGF0IG1ha2VzIHRoZSBmaWxlIG5hbWUgdW5pcXVlIHdpbGwgYmUgdXNlZC4NCisNCitGVUxMX1BBVEhfTkFNRVMgICAgICAgID0gTk8NCisNCisjIElmIHRoZSBGVUxMX1BBVEhfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgU1RSSVBfRlJPTV9QQVRIIHRhZw0KKyMgY2FuIGJlIHVzZWQgdG8gc3RyaXAgYSB1c2VyLWRlZmluZWQgcGFydCBvZiB0aGUgcGF0aC4gU3RyaXBwaW5nIGlzDQorIyBvbmx5IGRvbmUgaWYgb25lIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyBtYXRjaGVzIHRoZSBsZWZ0LWhhbmQgcGFydCBvZg0KKyMgdGhlIHBhdGguIFRoZSB0YWcgY2FuIGJlIHVzZWQgdG8gc2hvdyByZWxhdGl2ZSBwYXRocyBpbiB0aGUgZmlsZSBsaXN0Lg0KKyMgSWYgbGVmdCBibGFuayB0aGUgZGlyZWN0b3J5IGZyb20gd2hpY2ggZG94eWdlbiBpcyBydW4gaXMgdXNlZCBhcyB0aGUNCisjIHBhdGggdG8gc3RyaXAuIE5vdGUgdGhhdCB5b3Ugc3BlY2lmeSBhYnNvbHV0ZSBwYXRocyBoZXJlLCBidXQgYWxzbw0KKyMgcmVsYXRpdmUgcGF0aHMsIHdoaWNoIHdpbGwgYmUgcmVsYXRpdmUgZnJvbSB0aGUgZGlyZWN0b3J5IHdoZXJlIGRveHlnZW4gaXMNCisjIHN0YXJ0ZWQuDQorDQorU1RSSVBfRlJPTV9QQVRIICAgICAgICA9DQorDQorIyBUaGUgU1RSSVBfRlJPTV9JTkNfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3RyaXAgYSB1c2VyLWRlZmluZWQgcGFydCBvZg0KKyMgdGhlIHBhdGggbWVudGlvbmVkIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIGEgY2xhc3MsIHdoaWNoIHRlbGxzDQorIyB0aGUgcmVhZGVyIHdoaWNoIGhlYWRlciBmaWxlIHRvIGluY2x1ZGUgaW4gb3JkZXIgdG8gdXNlIGEgY2xhc3MuDQorIyBJZiBsZWZ0IGJsYW5rIG9ubHkgdGhlIG5hbWUgb2YgdGhlIGhlYWRlciBmaWxlIGNvbnRhaW5pbmcgdGhlIGNsYXNzDQorIyBkZWZpbml0aW9uIGlzIHVzZWQuIE90aGVyd2lzZSBvbmUgc2hvdWxkIHNwZWNpZnkgdGhlIGluY2x1ZGUgcGF0aHMgdGhhdA0KKyMgYXJlIG5vcm1hbGx5IHBhc3NlZCB0byB0aGUgY29tcGlsZXIgdXNpbmcgdGhlIC1JIGZsYWcuDQorDQorU1RSSVBfRlJPTV9JTkNfUEFUSCAgICA9DQorDQorIyBJZiB0aGUgU0hPUlRfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBtdWNoIHNob3J0ZXINCisjIChidXQgbGVzcyByZWFkYWJsZSkgZmlsZSBuYW1lcy4gVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdXIgZmlsZSBzeXN0ZW0NCisjIGRvZXNuJ3Qgc3VwcG9ydCBsb25nIG5hbWVzIGxpa2Ugb24gRE9TLCBNYWMsIG9yIENELVJPTS4NCisNCitTSE9SVF9OQU1FUyAgICAgICAgICAgID0gTk8NCisNCisjIElmIHRoZSBKQVZBRE9DX0FVVE9CUklFRiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIERveHlnZW4NCisjIHdpbGwgaW50ZXJwcmV0IHRoZSBmaXJzdCBsaW5lICh1bnRpbCB0aGUgZmlyc3QgZG90KSBvZiBhIEphdmFEb2Mtc3R5bGUNCisjIGNvbW1lbnQgYXMgdGhlIGJyaWVmIGRlc2NyaXB0aW9uLiBJZiBzZXQgdG8gTk8sIHRoZSBKYXZhRG9jDQorIyBjb21tZW50cyB3aWxsIGJlaGF2ZSBqdXN0IGxpa2UgcmVndWxhciBRdC1zdHlsZSBjb21tZW50cw0KKyMgKHRodXMgcmVxdWlyaW5nIGFuIGV4cGxpY2l0IEBicmllZiBjb21tYW5kIGZvciBhIGJyaWVmIGRlc2NyaXB0aW9uLikNCisNCitKQVZBRE9DX0FVVE9CUklFRiAgICAgID0gTk8NCisNCisjIElmIHRoZSBRVF9BVVRPQlJJRUYgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBEb3h5Z2VuIHdpbGwNCisjIGludGVycHJldCB0aGUgZmlyc3QgbGluZSAodW50aWwgdGhlIGZpcnN0IGRvdCkgb2YgYSBRdC1zdHlsZQ0KKyMgY29tbWVudCBhcyB0aGUgYnJpZWYgZGVzY3JpcHRpb24uIElmIHNldCB0byBOTywgdGhlIGNvbW1lbnRzDQorIyB3aWxsIGJlaGF2ZSBqdXN0IGxpa2UgcmVndWxhciBRdC1zdHlsZSBjb21tZW50cyAodGh1cyByZXF1aXJpbmcNCisjIGFuIGV4cGxpY2l0IFxicmllZiBjb21tYW5kIGZvciBhIGJyaWVmIGRlc2NyaXB0aW9uLikNCisNCitRVF9BVVRPQlJJRUYgICAgICAgICAgID0gTk8NCisNCisjIFRoZSBNVUxUSUxJTkVfQ1BQX0lTX0JSSUVGIHRhZyBjYW4gYmUgc2V0IHRvIFlFUyB0byBtYWtlIERveHlnZW4NCisjIHRyZWF0IGEgbXVsdGktbGluZSBDKysgc3BlY2lhbCBjb21tZW50IGJsb2NrIChpLmUuIGEgYmxvY2sgb2YgLy8hIG9yIC8vLw0KKyMgY29tbWVudHMpIGFzIGEgYnJpZWYgZGVzY3JpcHRpb24uIFRoaXMgdXNlZCB0byBiZSB0aGUgZGVmYXVsdCBiZWhhdmlvdXIuDQorIyBUaGUgbmV3IGRlZmF1bHQgaXMgdG8gdHJlYXQgYSBtdWx0aS1saW5lIEMrKyBjb21tZW50IGJsb2NrIGFzIGEgZGV0YWlsZWQNCisjIGRlc2NyaXB0aW9uLiBTZXQgdGhpcyB0YWcgdG8gWUVTIGlmIHlvdSBwcmVmZXIgdGhlIG9sZCBiZWhhdmlvdXIgaW5zdGVhZC4NCisNCitNVUxUSUxJTkVfQ1BQX0lTX0JSSUVGID0gTk8NCisNCisjIElmIHRoZSBJTkhFUklUX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGVuIGFuIHVuZG9jdW1lbnRlZA0KKyMgbWVtYmVyIGluaGVyaXRzIHRoZSBkb2N1bWVudGF0aW9uIGZyb20gYW55IGRvY3VtZW50ZWQgbWVtYmVyIHRoYXQgaXQNCisjIHJlLWltcGxlbWVudHMuDQorDQorSU5IRVJJVF9ET0NTICAgICAgICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIFNFUEFSQVRFX01FTUJFUl9QQUdFUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlbiBkb3h5Z2VuIHdpbGwgcHJvZHVjZQ0KKyMgYSBuZXcgcGFnZSBmb3IgZWFjaCBtZW1iZXIuIElmIHNldCB0byBOTywgdGhlIGRvY3VtZW50YXRpb24gb2YgYSBtZW1iZXIgd2lsbA0KKyMgYmUgcGFydCBvZiB0aGUgZmlsZS9jbGFzcy9uYW1lc3BhY2UgdGhhdCBjb250YWlucyBpdC4NCisNCitTRVBBUkFURV9NRU1CRVJfUEFHRVMgID0gTk8NCisNCisjIFRoZSBUQUJfU0laRSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBudW1iZXIgb2Ygc3BhY2VzIGluIGEgdGFiLg0KKyMgRG94eWdlbiB1c2VzIHRoaXMgdmFsdWUgdG8gcmVwbGFjZSB0YWJzIGJ5IHNwYWNlcyBpbiBjb2RlIGZyYWdtZW50cy4NCisNCitUQUJfU0laRSAgICAgICAgICAgICAgID0gOA0KKw0KKyMgVGhpcyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIG51bWJlciBvZiBhbGlhc2VzIHRoYXQgYWN0cw0KKyMgYXMgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uIEFuIGFsaWFzIGhhcyB0aGUgZm9ybSAibmFtZT12YWx1ZSIuDQorIyBGb3IgZXhhbXBsZSBhZGRpbmcgInNpZGVlZmZlY3Q9XHBhciBTaWRlIEVmZmVjdHM6XG4iIHdpbGwgYWxsb3cgeW91IHRvDQorIyBwdXQgdGhlIGNvbW1hbmQgXHNpZGVlZmZlY3QgKG9yIEBzaWRlZWZmZWN0KSBpbiB0aGUgZG9jdW1lbnRhdGlvbiwgd2hpY2gNCisjIHdpbGwgcmVzdWx0IGluIGEgdXNlci1kZWZpbmVkIHBhcmFncmFwaCB3aXRoIGhlYWRpbmcgIlNpZGUgRWZmZWN0czoiLg0KKyMgWW91IGNhbiBwdXQgXG4ncyBpbiB0aGUgdmFsdWUgcGFydCBvZiBhbiBhbGlhcyB0byBpbnNlcnQgbmV3bGluZXMuDQorDQorQUxJQVNFUyAgICAgICAgICAgICAgICA9ICJvdGhlcj08c3VwPio8L3N1cD4iDQorDQorIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbnVtYmVyIG9mIHdvcmQta2V5d29yZCBtYXBwaW5ncyAoVENMIG9ubHkpLg0KKyMgQSBtYXBwaW5nIGhhcyB0aGUgZm9ybSAibmFtZT12YWx1ZSIuIEZvciBleGFtcGxlIGFkZGluZw0KKyMgImNsYXNzPWl0Y2w6OmNsYXNzIiB3aWxsIGFsbG93IHlvdSB0byB1c2UgdGhlIGNvbW1hbmQgY2xhc3MgaW4gdGhlDQorIyBpdGNsOjpjbGFzcyBtZWFuaW5nLg0KKw0KK1RDTF9TVUJTVCAgICAgICAgICAgICAgPQ0KKw0KKyMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfRk9SX0MgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgQw0KKyMgc291cmNlcyBvbmx5LiBEb3h5Z2VuIHdpbGwgdGhlbiBnZW5lcmF0ZSBvdXRwdXQgdGhhdCBpcyBtb3JlIHRhaWxvcmVkIGZvciBDLg0KKyMgRm9yIGluc3RhbmNlLCBzb21lIG9mIHRoZSBuYW1lcyB0aGF0IGFyZSB1c2VkIHdpbGwgYmUgZGlmZmVyZW50LiBUaGUgbGlzdA0KKyMgb2YgYWxsIG1lbWJlcnMgd2lsbCBiZSBvbWl0dGVkLCBldGMuDQorDQorT1BUSU1JWkVfT1VUUFVUX0ZPUl9DICA9IE5PDQorDQorIyBTZXQgdGhlIE9QVElNSVpFX09VVFBVVF9KQVZBIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIEphdmENCisjIHNvdXJjZXMgb25seS4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgbW9yZSB0YWlsb3JlZCBmb3INCisjIEphdmEuIEZvciBpbnN0YW5jZSwgbmFtZXNwYWNlcyB3aWxsIGJlIHByZXNlbnRlZCBhcyBwYWNrYWdlcywgcXVhbGlmaWVkDQorIyBzY29wZXMgd2lsbCBsb29rIGRpZmZlcmVudCwgZXRjLg0KKw0KK09QVElNSVpFX09VVFBVVF9KQVZBICAgPSBOTw0KKw0KKyMgU2V0IHRoZSBPUFRJTUlaRV9GT1JfRk9SVFJBTiB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBGb3J0cmFuDQorIyBzb3VyY2VzIG9ubHkuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIG1vcmUgdGFpbG9yZWQgZm9yDQorIyBGb3J0cmFuLg0KKw0KK09QVElNSVpFX0ZPUl9GT1JUUkFOICAgPSBOTw0KKw0KKyMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfVkhETCB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBWSERMDQorIyBzb3VyY2VzLiBEb3h5Z2VuIHdpbGwgdGhlbiBnZW5lcmF0ZSBvdXRwdXQgdGhhdCBpcyB0YWlsb3JlZCBmb3INCisjIFZIREwuDQorDQorT1BUSU1JWkVfT1VUUFVUX1ZIREwgICA9IE5PDQorDQorIyBEb3h5Z2VuIHNlbGVjdHMgdGhlIHBhcnNlciB0byB1c2UgZGVwZW5kaW5nIG9uIHRoZSBleHRlbnNpb24gb2YgdGhlIGZpbGVzIGl0DQorIyBwYXJzZXMuIFdpdGggdGhpcyB0YWcgeW91IGNhbiBhc3NpZ24gd2hpY2ggcGFyc2VyIHRvIHVzZSBmb3IgYSBnaXZlbg0KKyMgZXh0ZW5zaW9uLiBEb3h5Z2VuIGhhcyBhIGJ1aWx0LWluIG1hcHBpbmcsIGJ1dCB5b3UgY2FuIG92ZXJyaWRlIG9yIGV4dGVuZCBpdA0KKyMgdXNpbmcgdGhpcyB0YWcuIFRoZSBmb3JtYXQgaXMgZXh0PWxhbmd1YWdlLCB3aGVyZSBleHQgaXMgYSBmaWxlIGV4dGVuc2lvbiwNCisjIGFuZCBsYW5ndWFnZSBpcyBvbmUgb2YgdGhlIHBhcnNlcnMgc3VwcG9ydGVkIGJ5IGRveHlnZW46IElETCwgSmF2YSwNCisjIEphdmFzY3JpcHQsIENTaGFycCwgQywgQysrLCBELCBQSFAsIE9iamVjdGl2ZS1DLCBQeXRob24sIEZvcnRyYW4sIFZIREwsIEMsDQorIyBDKysuIEZvciBpbnN0YW5jZSB0byBtYWtlIGRveHlnZW4gdHJlYXQgLmluYyBmaWxlcyBhcyBGb3J0cmFuIGZpbGVzIChkZWZhdWx0DQorIyBpcyBQSFApLCBhbmQgLmYgZmlsZXMgYXMgQyAoZGVmYXVsdCBpcyBGb3J0cmFuKSwgdXNlOiBpbmM9Rm9ydHJhbiBmPUMuIE5vdGUNCisjIHRoYXQgZm9yIGN1c3RvbSBleHRlbnNpb25zIHlvdSBhbHNvIG5lZWQgdG8gc2V0IEZJTEVfUEFUVEVSTlMgb3RoZXJ3aXNlIHRoZQ0KKyMgZmlsZXMgYXJlIG5vdCByZWFkIGJ5IGRveHlnZW4uDQorDQorRVhURU5TSU9OX01BUFBJTkcgICAgICA9DQorDQorIyBJZiBNQVJLRE9XTl9TVVBQT1JUIGlzIGVuYWJsZWQgKHRoZSBkZWZhdWx0KSB0aGVuIGRveHlnZW4gcHJlLXByb2Nlc3NlcyBhbGwNCisjIGNvbW1lbnRzIGFjY29yZGluZyB0byB0aGUgTWFya2Rvd24gZm9ybWF0LCB3aGljaCBhbGxvd3MgZm9yIG1vcmUgcmVhZGFibGUNCisjIGRvY3VtZW50YXRpb24uIFNlZSBodHRwOi8vZGFyaW5nZmlyZWJhbGwubmV0L3Byb2plY3RzL21hcmtkb3duLyBmb3IgZGV0YWlscy4NCisjIFRoZSBvdXRwdXQgb2YgbWFya2Rvd24gcHJvY2Vzc2luZyBpcyBmdXJ0aGVyIHByb2Nlc3NlZCBieSBkb3h5Z2VuLCBzbyB5b3UNCisjIGNhbiBtaXggZG94eWdlbiwgSFRNTCwgYW5kIFhNTCBjb21tYW5kcyB3aXRoIE1hcmtkb3duIGZvcm1hdHRpbmcuDQorIyBEaXNhYmxlIG9ubHkgaW4gY2FzZSBvZiBiYWNrd2FyZCBjb21wYXRpYmlsaXRpZXMgaXNzdWVzLg0KKw0KK01BUktET1dOX1NVUFBPUlQgICAgICAgPSBZRVMNCisNCisjIFdoZW4gZW5hYmxlZCBkb3h5Z2VuIHRyaWVzIHRvIGxpbmsgd29yZHMgdGhhdCBjb3JyZXNwb25kIHRvIGRvY3VtZW50ZWQgY2xhc3NlcywNCisjIG9yIG5hbWVzcGFjZXMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyBkb2N1bWVudGF0aW9uLiBTdWNoIGEgbGluayBjYW4gYmUNCisjIHByZXZlbnRlZCBpbiBpbmRpdmlkdWFsIGNhc2VzIGJ5IGJ5IHB1dHRpbmcgYSAlIHNpZ24gaW4gZnJvbnQgb2YgdGhlIHdvcmQgb3INCisjIGdsb2JhbGx5IGJ5IHNldHRpbmcgQVVUT0xJTktfU1VQUE9SVCB0byBOTy4NCisNCitBVVRPTElOS19TVVBQT1JUICAgICAgID0gWUVTDQorDQorIyBJZiB5b3UgdXNlIFNUTCBjbGFzc2VzIChpLmUuIHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3RvciwgZXRjLikgYnV0IGRvIG5vdCB3YW50DQorIyB0byBpbmNsdWRlIChhIHRhZyBmaWxlIGZvcikgdGhlIFNUTCBzb3VyY2VzIGFzIGlucHV0LCB0aGVuIHlvdSBzaG91bGQNCisjIHNldCB0aGlzIHRhZyB0byBZRVMgaW4gb3JkZXIgdG8gbGV0IGRveHlnZW4gbWF0Y2ggZnVuY3Rpb25zIGRlY2xhcmF0aW9ucyBhbmQNCisjIGRlZmluaXRpb25zIHdob3NlIGFyZ3VtZW50cyBjb250YWluIFNUTCBjbGFzc2VzIChlLmcuIGZ1bmMoc3RkOjpzdHJpbmcpOyB2LnMuDQorIyBmdW5jKHN0ZDo6c3RyaW5nKSB7fSkuIFRoaXMgYWxzbyBtYWtlcyB0aGUgaW5oZXJpdGFuY2UgYW5kIGNvbGxhYm9yYXRpb24NCisjIGRpYWdyYW1zIHRoYXQgaW52b2x2ZSBTVEwgY2xhc3NlcyBtb3JlIGNvbXBsZXRlIGFuZCBhY2N1cmF0ZS4NCisNCitCVUlMVElOX1NUTF9TVVBQT1JUICAgID0gTk8NCisNCisjIElmIHlvdSB1c2UgTWljcm9zb2Z0J3MgQysrL0NMSSBsYW5ndWFnZSwgeW91IHNob3VsZCBzZXQgdGhpcyBvcHRpb24gdG8gWUVTIHRvDQorIyBlbmFibGUgcGFyc2luZyBzdXBwb3J0Lg0KKw0KK0NQUF9DTElfU1VQUE9SVCAgICAgICAgPSBOTw0KKw0KKyMgU2V0IHRoZSBTSVBfU1VQUE9SVCB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBzaXAgc291cmNlcyBvbmx5Lg0KKyMgRG94eWdlbiB3aWxsIHBhcnNlIHRoZW0gbGlrZSBub3JtYWwgQysrIGJ1dCB3aWxsIGFzc3VtZSBhbGwgY2xhc3NlcyB1c2UgcHVibGljDQorIyBpbnN0ZWFkIG9mIHByaXZhdGUgaW5oZXJpdGFuY2Ugd2hlbiBubyBleHBsaWNpdCBwcm90ZWN0aW9uIGtleXdvcmQgaXMgcHJlc2VudC4NCisNCitTSVBfU1VQUE9SVCAgICAgICAgICAgID0gTk8NCisNCisjIEZvciBNaWNyb3NvZnQncyBJREwgdGhlcmUgYXJlIHByb3BnZXQgYW5kIHByb3BwdXQgYXR0cmlidXRlcyB0bw0KKyMgaW5kaWNhdGUgZ2V0dGVyIGFuZCBzZXR0ZXIgbWV0aG9kcyBmb3IgYSBwcm9wZXJ0eS4gU2V0dGluZyB0aGlzDQorIyBvcHRpb24gdG8gWUVTICh0aGUgZGVmYXVsdCkgd2lsbCBtYWtlIGRveHlnZW4gcmVwbGFjZSB0aGUgZ2V0IGFuZA0KKyMgc2V0IG1ldGhvZHMgYnkgYSBwcm9wZXJ0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gVGhpcyB3aWxsIG9ubHkgd29yaw0KKyMgaWYgdGhlIG1ldGhvZHMgYXJlIGluZGVlZCBnZXR0aW5nIG9yIHNldHRpbmcgYSBzaW1wbGUgdHlwZS4gSWYgdGhpcw0KKyMgaXMgbm90IHRoZSBjYXNlLCBvciB5b3Ugd2FudCB0byBzaG93IHRoZSBtZXRob2RzIGFueXdheSwgeW91IHNob3VsZA0KKyMgc2V0IHRoaXMgb3B0aW9uIHRvIE5PLg0KKw0KK0lETF9QUk9QRVJUWV9TVVBQT1JUICAgPSBZRVMNCisNCisjIElmIG1lbWJlciBncm91cGluZyBpcyB1c2VkIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZCB0aGUgRElTVFJJQlVURV9HUk9VUF9ET0MNCisjIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGVuIGRveHlnZW4gd2lsbCByZXVzZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgZmlyc3QNCisjIG1lbWJlciBpbiB0aGUgZ3JvdXAgKGlmIGFueSkgZm9yIHRoZSBvdGhlciBtZW1iZXJzIG9mIHRoZSBncm91cC4gQnkgZGVmYXVsdA0KKyMgYWxsIG1lbWJlcnMgb2YgYSBncm91cCBtdXN0IGJlIGRvY3VtZW50ZWQgZXhwbGljaXRseS4NCisNCitESVNUUklCVVRFX0dST1VQX0RPQyAgID0gTk8NCisNCisjIFNldCB0aGUgU1VCR1JPVVBJTkcgdGFnIHRvIFlFUyAodGhlIGRlZmF1bHQpIHRvIGFsbG93IGNsYXNzIG1lbWJlciBncm91cHMgb2YNCisjIHRoZSBzYW1lIHR5cGUgKGZvciBpbnN0YW5jZSBhIGdyb3VwIG9mIHB1YmxpYyBmdW5jdGlvbnMpIHRvIGJlIHB1dCBhcyBhDQorIyBzdWJncm91cCBvZiB0aGF0IHR5cGUgKGUuZy4gdW5kZXIgdGhlIFB1YmxpYyBGdW5jdGlvbnMgc2VjdGlvbikuIFNldCBpdCB0bw0KKyMgTk8gdG8gcHJldmVudCBzdWJncm91cGluZy4gQWx0ZXJuYXRpdmVseSwgdGhpcyBjYW4gYmUgZG9uZSBwZXIgY2xhc3MgdXNpbmcNCisjIHRoZSBcbm9zdWJncm91cGluZyBjb21tYW5kLg0KKw0KK1NVQkdST1VQSU5HICAgICAgICAgICAgPSBZRVMNCisNCisjIFdoZW4gdGhlIElOTElORV9HUk9VUEVEX0NMQVNTRVMgdGFnIGlzIHNldCB0byBZRVMsIGNsYXNzZXMsIHN0cnVjdHMgYW5kDQorIyB1bmlvbnMgYXJlIHNob3duIGluc2lkZSB0aGUgZ3JvdXAgaW4gd2hpY2ggdGhleSBhcmUgaW5jbHVkZWQgKGUuZy4gdXNpbmcNCisjIEBpbmdyb3VwKSBpbnN0ZWFkIG9mIG9uIGEgc2VwYXJhdGUgcGFnZSAoZm9yIEhUTUwgYW5kIE1hbiBwYWdlcykgb3INCisjIHNlY3Rpb24gKGZvciBMYVRlWCBhbmQgUlRGKS4NCisNCitJTkxJTkVfR1JPVVBFRF9DTEFTU0VTID0gTk8NCisNCisjIFdoZW4gdGhlIElOTElORV9TSU1QTEVfU1RSVUNUUyB0YWcgaXMgc2V0IHRvIFlFUywgc3RydWN0cywgY2xhc3NlcywgYW5kDQorIyB1bmlvbnMgd2l0aCBvbmx5IHB1YmxpYyBkYXRhIGZpZWxkcyB3aWxsIGJlIHNob3duIGlubGluZSBpbiB0aGUgZG9jdW1lbnRhdGlvbg0KKyMgb2YgdGhlIHNjb3BlIGluIHdoaWNoIHRoZXkgYXJlIGRlZmluZWQgKGkuZS4gZmlsZSwgbmFtZXNwYWNlLCBvciBncm91cA0KKyMgZG9jdW1lbnRhdGlvbiksIHByb3ZpZGVkIHRoaXMgc2NvcGUgaXMgZG9jdW1lbnRlZC4gSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCksDQorIyBzdHJ1Y3RzLCBjbGFzc2VzLCBhbmQgdW5pb25zIGFyZSBzaG93biBvbiBhIHNlcGFyYXRlIHBhZ2UgKGZvciBIVE1MIGFuZCBNYW4NCisjIHBhZ2VzKSBvciBzZWN0aW9uIChmb3IgTGFUZVggYW5kIFJURikuDQorDQorSU5MSU5FX1NJTVBMRV9TVFJVQ1RTICA9IE5PDQorDQorIyBXaGVuIFRZUEVERUZfSElERVNfU1RSVUNUIGlzIGVuYWJsZWQsIGEgdHlwZWRlZiBvZiBhIHN0cnVjdCwgdW5pb24sIG9yIGVudW0NCisjIGlzIGRvY3VtZW50ZWQgYXMgc3RydWN0LCB1bmlvbiwgb3IgZW51bSB3aXRoIHRoZSBuYW1lIG9mIHRoZSB0eXBlZGVmLiBTbw0KKyMgdHlwZWRlZiBzdHJ1Y3QgVHlwZVMge30gVHlwZVQsIHdpbGwgYXBwZWFyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFzIGEgc3RydWN0DQorIyB3aXRoIG5hbWUgVHlwZVQuIFdoZW4gZGlzYWJsZWQgdGhlIHR5cGVkZWYgd2lsbCBhcHBlYXIgYXMgYSBtZW1iZXIgb2YgYSBmaWxlLA0KKyMgbmFtZXNwYWNlLCBvciBjbGFzcy4gQW5kIHRoZSBzdHJ1Y3Qgd2lsbCBiZSBuYW1lZCBUeXBlUy4gVGhpcyBjYW4gdHlwaWNhbGx5DQorIyBiZSB1c2VmdWwgZm9yIEMgY29kZSBpbiBjYXNlIHRoZSBjb2RpbmcgY29udmVudGlvbiBkaWN0YXRlcyB0aGF0IGFsbCBjb21wb3VuZA0KKyMgdHlwZXMgYXJlIHR5cGVkZWYnZWQgYW5kIG9ubHkgdGhlIHR5cGVkZWYgaXMgcmVmZXJlbmNlZCwgbmV2ZXIgdGhlIHRhZyBuYW1lLg0KKw0KK1RZUEVERUZfSElERVNfU1RSVUNUICAgPSBOTw0KKw0KKyMgVGhlIFNZTUJPTF9DQUNIRV9TSVpFIGRldGVybWluZXMgdGhlIHNpemUgb2YgdGhlIGludGVybmFsIGNhY2hlIHVzZSB0bw0KKyMgZGV0ZXJtaW5lIHdoaWNoIHN5bWJvbHMgdG8ga2VlcCBpbiBtZW1vcnkgYW5kIHdoaWNoIHRvIGZsdXNoIHRvIGRpc2suDQorIyBXaGVuIHRoZSBjYWNoZSBpcyBmdWxsLCBsZXNzIG9mdGVuIHVzZWQgc3ltYm9scyB3aWxsIGJlIHdyaXR0ZW4gdG8gZGlzay4NCisjIEZvciBzbWFsbCB0byBtZWRpdW0gc2l6ZSBwcm9qZWN0cyAoPDEwMDAgaW5wdXQgZmlsZXMpIHRoZSBkZWZhdWx0IHZhbHVlIGlzDQorIyBwcm9iYWJseSBnb29kIGVub3VnaC4gRm9yIGxhcmdlciBwcm9qZWN0cyBhIHRvbyBzbWFsbCBjYWNoZSBzaXplIGNhbiBjYXVzZQ0KKyMgZG94eWdlbiB0byBiZSBidXN5IHN3YXBwaW5nIHN5bWJvbHMgdG8gYW5kIGZyb20gZGlzayBtb3N0IG9mIHRoZSB0aW1lDQorIyBjYXVzaW5nIGEgc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgcGVuYWx0eS4NCisjIElmIHRoZSBzeXN0ZW0gaGFzIGVub3VnaCBwaHlzaWNhbCBtZW1vcnkgaW5jcmVhc2luZyB0aGUgY2FjaGUgd2lsbCBpbXByb3ZlIHRoZQ0KKyMgcGVyZm9ybWFuY2UgYnkga2VlcGluZyBtb3JlIHN5bWJvbHMgaW4gbWVtb3J5LiBOb3RlIHRoYXQgdGhlIHZhbHVlIHdvcmtzIG9uDQorIyBhIGxvZ2FyaXRobWljIHNjYWxlIHNvIGluY3JlYXNpbmcgdGhlIHNpemUgYnkgb25lIHdpbGwgcm91Z2hseSBkb3VibGUgdGhlDQorIyBtZW1vcnkgdXNhZ2UuIFRoZSBjYWNoZSBzaXplIGlzIGdpdmVuIGJ5IHRoaXMgZm9ybXVsYToNCisjIDJeKDE2K1NZTUJPTF9DQUNIRV9TSVpFKS4gVGhlIHZhbGlkIHJhbmdlIGlzIDAuLjksIHRoZSBkZWZhdWx0IGlzIDAsDQorIyBjb3JyZXNwb25kaW5nIHRvIGEgY2FjaGUgc2l6ZSBvZiAyXjE2ID0gNjU1MzYgc3ltYm9scy4NCisNCitTWU1CT0xfQ0FDSEVfU0laRSAgICAgID0gMA0KKw0KKyMgU2ltaWxhciB0byB0aGUgU1lNQk9MX0NBQ0hFX1NJWkUgdGhlIHNpemUgb2YgdGhlIHN5bWJvbCBsb29rdXAgY2FjaGUgY2FuIGJlDQorIyBzZXQgdXNpbmcgTE9PS1VQX0NBQ0hFX1NJWkUuIFRoaXMgY2FjaGUgaXMgdXNlZCB0byByZXNvbHZlIHN5bWJvbHMgZ2l2ZW4NCisjIHRoZWlyIG5hbWUgYW5kIHNjb3BlLiBTaW5jZSB0aGlzIGNhbiBiZSBhbiBleHBlbnNpdmUgcHJvY2VzcyBhbmQgb2Z0ZW4gdGhlDQorIyBzYW1lIHN5bWJvbCBhcHBlYXIgbXVsdGlwbGUgdGltZXMgaW4gdGhlIGNvZGUsIGRveHlnZW4ga2VlcHMgYSBjYWNoZSBvZg0KKyMgcHJlLXJlc29sdmVkIHN5bWJvbHMuIElmIHRoZSBjYWNoZSBpcyB0b28gc21hbGwgZG94eWdlbiB3aWxsIGJlY29tZSBzbG93ZXIuDQorIyBJZiB0aGUgY2FjaGUgaXMgdG9vIGxhcmdlLCBtZW1vcnkgaXMgd2FzdGVkLiBUaGUgY2FjaGUgc2l6ZSBpcyBnaXZlbiBieSB0aGlzDQorIyBmb3JtdWxhOiAyXigxNitMT09LVVBfQ0FDSEVfU0laRSkuIFRoZSB2YWxpZCByYW5nZSBpcyAwLi45LCB0aGUgZGVmYXVsdCBpcyAwLA0KKyMgY29ycmVzcG9uZGluZyB0byBhIGNhY2hlIHNpemUgb2YgMl4xNiA9IDY1NTM2IHN5bWJvbHMuDQorDQorTE9PS1VQX0NBQ0hFX1NJWkUgICAgICA9IDANCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBCdWlsZCByZWxhdGVkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisjIElmIHRoZSBFWFRSQUNUX0FMTCB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgYXNzdW1lIGFsbCBlbnRpdGllcyBpbg0KKyMgZG9jdW1lbnRhdGlvbiBhcmUgZG9jdW1lbnRlZCwgZXZlbiBpZiBubyBkb2N1bWVudGF0aW9uIHdhcyBhdmFpbGFibGUuDQorIyBQcml2YXRlIGNsYXNzIG1lbWJlcnMgYW5kIHN0YXRpYyBmaWxlIG1lbWJlcnMgd2lsbCBiZSBoaWRkZW4gdW5sZXNzDQorIyB0aGUgRVhUUkFDVF9QUklWQVRFIGFuZCBFWFRSQUNUX1NUQVRJQyB0YWdzIGFyZSBzZXQgdG8gWUVTDQorDQorRVhUUkFDVF9BTEwgICAgICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgRVhUUkFDVF9QUklWQVRFIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBwcml2YXRlIG1lbWJlcnMgb2YgYSBjbGFzcw0KKyMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4NCisNCitFWFRSQUNUX1BSSVZBVEUgICAgICAgID0gWUVTDQorDQorIyBJZiB0aGUgRVhUUkFDVF9QQUNLQUdFIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBtZW1iZXJzIHdpdGggcGFja2FnZSBvciBpbnRlcm5hbA0KKyMgc2NvcGUgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4NCisNCitFWFRSQUNUX1BBQ0tBR0UgICAgICAgID0gTk8NCisNCisjIElmIHRoZSBFWFRSQUNUX1NUQVRJQyB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgc3RhdGljIG1lbWJlcnMgb2YgYSBmaWxlDQorIyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLg0KKw0KK0VYVFJBQ1RfU1RBVElDICAgICAgICAgPSBZRVMNCisNCisjIElmIHRoZSBFWFRSQUNUX0xPQ0FMX0NMQVNTRVMgdGFnIGlzIHNldCB0byBZRVMgY2xhc3NlcyAoYW5kIHN0cnVjdHMpDQorIyBkZWZpbmVkIGxvY2FsbHkgaW4gc291cmNlIGZpbGVzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uDQorIyBJZiBzZXQgdG8gTk8gb25seSBjbGFzc2VzIGRlZmluZWQgaW4gaGVhZGVyIGZpbGVzIGFyZSBpbmNsdWRlZC4NCisNCitFWFRSQUNUX0xPQ0FMX0NMQVNTRVMgID0gWUVTDQorDQorIyBUaGlzIGZsYWcgaXMgb25seSB1c2VmdWwgZm9yIE9iamVjdGl2ZS1DIGNvZGUuIFdoZW4gc2V0IHRvIFlFUyBsb2NhbA0KKyMgbWV0aG9kcywgd2hpY2ggYXJlIGRlZmluZWQgaW4gdGhlIGltcGxlbWVudGF0aW9uIHNlY3Rpb24gYnV0IG5vdCBpbg0KKyMgdGhlIGludGVyZmFjZSBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uDQorIyBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSBvbmx5IG1ldGhvZHMgaW4gdGhlIGludGVyZmFjZSBhcmUgaW5jbHVkZWQuDQorDQorRVhUUkFDVF9MT0NBTF9NRVRIT0RTICA9IE5PDQorDQorIyBJZiB0aGlzIGZsYWcgaXMgc2V0IHRvIFlFUywgdGhlIG1lbWJlcnMgb2YgYW5vbnltb3VzIG5hbWVzcGFjZXMgd2lsbCBiZQ0KKyMgZXh0cmFjdGVkIGFuZCBhcHBlYXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYXMgYSBuYW1lc3BhY2UgY2FsbGVkDQorIyAnYW5vbnltb3VzX25hbWVzcGFjZXtmaWxlfScsIHdoZXJlIGZpbGUgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZSBiYXNlDQorIyBuYW1lIG9mIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGFub255bW91cyBuYW1lc3BhY2UuIEJ5IGRlZmF1bHQNCisjIGFub255bW91cyBuYW1lc3BhY2VzIGFyZSBoaWRkZW4uDQorDQorRVhUUkFDVF9BTk9OX05TUEFDRVMgICA9IE5PDQorDQorIyBJZiB0aGUgSElERV9VTkRPQ19NRU1CRVJTIHRhZyBpcyBzZXQgdG8gWUVTLCBEb3h5Z2VuIHdpbGwgaGlkZSBhbGwNCisjIHVuZG9jdW1lbnRlZCBtZW1iZXJzIG9mIGRvY3VtZW50ZWQgY2xhc3NlcywgZmlsZXMgb3IgbmFtZXNwYWNlcy4NCisjIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIHRoZXNlIG1lbWJlcnMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUNCisjIHZhcmlvdXMgb3ZlcnZpZXdzLCBidXQgbm8gZG9jdW1lbnRhdGlvbiBzZWN0aW9uIGlzIGdlbmVyYXRlZC4NCisjIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3QgaWYgRVhUUkFDVF9BTEwgaXMgZW5hYmxlZC4NCisNCitISURFX1VORE9DX01FTUJFUlMgICAgID0gWUVTDQorDQorIyBJZiB0aGUgSElERV9VTkRPQ19DTEFTU0VTIHRhZyBpcyBzZXQgdG8gWUVTLCBEb3h5Z2VuIHdpbGwgaGlkZSBhbGwNCisjIHVuZG9jdW1lbnRlZCBjbGFzc2VzIHRoYXQgYXJlIG5vcm1hbGx5IHZpc2libGUgaW4gdGhlIGNsYXNzIGhpZXJhcmNoeS4NCisjIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIHRoZXNlIGNsYXNzZXMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgdmFyaW91cw0KKyMgb3ZlcnZpZXdzLiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IGlmIEVYVFJBQ1RfQUxMIGlzIGVuYWJsZWQuDQorDQorSElERV9VTkRPQ19DTEFTU0VTICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIEhJREVfRlJJRU5EX0NPTVBPVU5EUyB0YWcgaXMgc2V0IHRvIFlFUywgRG94eWdlbiB3aWxsIGhpZGUgYWxsDQorIyBmcmllbmQgKGNsYXNzfHN0cnVjdHx1bmlvbikgZGVjbGFyYXRpb25zLg0KKyMgSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgdGhlc2UgZGVjbGFyYXRpb25zIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlDQorIyBkb2N1bWVudGF0aW9uLg0KKw0KK0hJREVfRlJJRU5EX0NPTVBPVU5EUyAgPSBOTw0KKw0KKyMgSWYgdGhlIEhJREVfSU5fQk9EWV9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTLCBEb3h5Z2VuIHdpbGwgaGlkZSBhbnkNCisjIGRvY3VtZW50YXRpb24gYmxvY2tzIGZvdW5kIGluc2lkZSB0aGUgYm9keSBvZiBhIGZ1bmN0aW9uLg0KKyMgSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgdGhlc2UgYmxvY2tzIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlDQorIyBmdW5jdGlvbidzIGRldGFpbGVkIGRvY3VtZW50YXRpb24gYmxvY2suDQorDQorSElERV9JTl9CT0RZX0RPQ1MgICAgICA9IE5PDQorDQorIyBUaGUgSU5URVJOQUxfRE9DUyB0YWcgZGV0ZXJtaW5lcyBpZiBkb2N1bWVudGF0aW9uDQorIyB0aGF0IGlzIHR5cGVkIGFmdGVyIGEgXGludGVybmFsIGNvbW1hbmQgaXMgaW5jbHVkZWQuIElmIHRoZSB0YWcgaXMgc2V0DQorIyB0byBOTyAodGhlIGRlZmF1bHQpIHRoZW4gdGhlIGRvY3VtZW50YXRpb24gd2lsbCBiZSBleGNsdWRlZC4NCisjIFNldCBpdCB0byBZRVMgdG8gaW5jbHVkZSB0aGUgaW50ZXJuYWwgZG9jdW1lbnRhdGlvbi4NCisNCitJTlRFUk5BTF9ET0NTICAgICAgICAgID0gTk8NCisNCisjIElmIHRoZSBDQVNFX1NFTlNFX05BTUVTIHRhZyBpcyBzZXQgdG8gTk8gdGhlbiBEb3h5Z2VuIHdpbGwgb25seSBnZW5lcmF0ZQ0KKyMgZmlsZSBuYW1lcyBpbiBsb3dlci1jYXNlIGxldHRlcnMuIElmIHNldCB0byBZRVMgdXBwZXItY2FzZSBsZXR0ZXJzIGFyZSBhbHNvDQorIyBhbGxvd2VkLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UgaGF2ZSBjbGFzc2VzIG9yIGZpbGVzIHdob3NlIG5hbWVzIG9ubHkgZGlmZmVyDQorIyBpbiBjYXNlIGFuZCBpZiB5b3VyIGZpbGUgc3lzdGVtIHN1cHBvcnRzIGNhc2Ugc2Vuc2l0aXZlIGZpbGUgbmFtZXMuIFdpbmRvd3MNCisjIGFuZCBNYWMgdXNlcnMgYXJlIGFkdmlzZWQgdG8gc2V0IHRoaXMgb3B0aW9uIHRvIE5PLg0KKw0KK0NBU0VfU0VOU0VfTkFNRVMgICAgICAgPSBZRVMNCisNCisjIElmIHRoZSBISURFX1NDT1BFX05BTUVTIHRhZyBpcyBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVuIERveHlnZW4NCisjIHdpbGwgc2hvdyBtZW1iZXJzIHdpdGggdGhlaXIgZnVsbCBjbGFzcyBhbmQgbmFtZXNwYWNlIHNjb3BlcyBpbiB0aGUNCisjIGRvY3VtZW50YXRpb24uIElmIHNldCB0byBZRVMgdGhlIHNjb3BlIHdpbGwgYmUgaGlkZGVuLg0KKw0KK0hJREVfU0NPUEVfTkFNRVMgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIFNIT1dfSU5DTFVERV9GSUxFUyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIHRoZW4gRG94eWdlbg0KKyMgd2lsbCBwdXQgYSBsaXN0IG9mIHRoZSBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBieSBhIGZpbGUgaW4gdGhlIGRvY3VtZW50YXRpb24NCisjIG9mIHRoYXQgZmlsZS4NCisNCitTSE9XX0lOQ0xVREVfRklMRVMgICAgID0gWUVTDQorDQorIyBJZiB0aGUgRk9SQ0VfTE9DQUxfSU5DTFVERVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBEb3h5Z2VuDQorIyB3aWxsIGxpc3QgaW5jbHVkZSBmaWxlcyB3aXRoIGRvdWJsZSBxdW90ZXMgaW4gdGhlIGRvY3VtZW50YXRpb24NCisjIHJhdGhlciB0aGFuIHdpdGggc2hhcnAgYnJhY2tldHMuDQorDQorRk9SQ0VfTE9DQUxfSU5DTFVERVMgICA9IE5PDQorDQorIyBJZiB0aGUgSU5MSU5FX0lORk8gdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGVuIGEgdGFnIFtpbmxpbmVdDQorIyBpcyBpbnNlcnRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgaW5saW5lIG1lbWJlcnMuDQorDQorSU5MSU5FX0lORk8gICAgICAgICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIFNPUlRfTUVNQkVSX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGVuIGRveHlnZW4NCisjIHdpbGwgc29ydCB0aGUgKGRldGFpbGVkKSBkb2N1bWVudGF0aW9uIG9mIGZpbGUgYW5kIGNsYXNzIG1lbWJlcnMNCisjIGFscGhhYmV0aWNhbGx5IGJ5IG1lbWJlciBuYW1lLiBJZiBzZXQgdG8gTk8gdGhlIG1lbWJlcnMgd2lsbCBhcHBlYXIgaW4NCisjIGRlY2xhcmF0aW9uIG9yZGVyLg0KKw0KK1NPUlRfTUVNQkVSX0RPQ1MgICAgICAgPSBZRVMNCisNCisjIElmIHRoZSBTT1JUX0JSSUVGX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc29ydCB0aGUNCisjIGJyaWVmIGRvY3VtZW50YXRpb24gb2YgZmlsZSwgbmFtZXNwYWNlIGFuZCBjbGFzcyBtZW1iZXJzIGFscGhhYmV0aWNhbGx5DQorIyBieSBtZW1iZXIgbmFtZS4gSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgdGhlIG1lbWJlcnMgd2lsbCBhcHBlYXIgaW4NCisjIGRlY2xhcmF0aW9uIG9yZGVyLg0KKw0KK1NPUlRfQlJJRUZfRE9DUyAgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIFNPUlRfTUVNQkVSU19DVE9SU18xU1QgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuDQorIyB3aWxsIHNvcnQgdGhlIChicmllZiBhbmQgZGV0YWlsZWQpIGRvY3VtZW50YXRpb24gb2YgY2xhc3MgbWVtYmVycyBzbyB0aGF0DQorIyBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIGFyZSBsaXN0ZWQgZmlyc3QuIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpDQorIyB0aGUgY29uc3RydWN0b3JzIHdpbGwgYXBwZWFyIGluIHRoZSByZXNwZWN0aXZlIG9yZGVycyBkZWZpbmVkIGJ5DQorIyBTT1JUX01FTUJFUl9ET0NTIGFuZCBTT1JUX0JSSUVGX0RPQ1MuDQorIyBUaGlzIHRhZyB3aWxsIGJlIGlnbm9yZWQgZm9yIGJyaWVmIGRvY3MgaWYgU09SVF9CUklFRl9ET0NTIGlzIHNldCB0byBOTw0KKyMgYW5kIGlnbm9yZWQgZm9yIGRldGFpbGVkIGRvY3MgaWYgU09SVF9NRU1CRVJfRE9DUyBpcyBzZXQgdG8gTk8uDQorDQorU09SVF9NRU1CRVJTX0NUT1JTXzFTVCA9IE5PDQorDQorIyBJZiB0aGUgU09SVF9HUk9VUF9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBzb3J0IHRoZQ0KKyMgaGllcmFyY2h5IG9mIGdyb3VwIG5hbWVzIGludG8gYWxwaGFiZXRpY2FsIG9yZGVyLiBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KQ0KKyMgdGhlIGdyb3VwIG5hbWVzIHdpbGwgYXBwZWFyIGluIHRoZWlyIGRlZmluZWQgb3JkZXIuDQorDQorU09SVF9HUk9VUF9OQU1FUyAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgU09SVF9CWV9TQ09QRV9OQU1FIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgY2xhc3MgbGlzdCB3aWxsIGJlDQorIyBzb3J0ZWQgYnkgZnVsbHktcXVhbGlmaWVkIG5hbWVzLCBpbmNsdWRpbmcgbmFtZXNwYWNlcy4gSWYgc2V0IHRvDQorIyBOTyAodGhlIGRlZmF1bHQpLCB0aGUgY2xhc3MgbGlzdCB3aWxsIGJlIHNvcnRlZCBvbmx5IGJ5IGNsYXNzIG5hbWUsDQorIyBub3QgaW5jbHVkaW5nIHRoZSBuYW1lc3BhY2UgcGFydC4NCisjIE5vdGU6IFRoaXMgb3B0aW9uIGlzIG5vdCB2ZXJ5IHVzZWZ1bCBpZiBISURFX1NDT1BFX05BTUVTIGlzIHNldCB0byBZRVMuDQorIyBOb3RlOiBUaGlzIG9wdGlvbiBhcHBsaWVzIG9ubHkgdG8gdGhlIGNsYXNzIGxpc3QsIG5vdCB0byB0aGUNCisjIGFscGhhYmV0aWNhbCBsaXN0Lg0KKw0KK1NPUlRfQllfU0NPUEVfTkFNRSAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIFNUUklDVF9QUk9UT19NQVRDSElORyBvcHRpb24gaXMgZW5hYmxlZCBhbmQgZG94eWdlbiBmYWlscyB0bw0KKyMgZG8gcHJvcGVyIHR5cGUgcmVzb2x1dGlvbiBvZiBhbGwgcGFyYW1ldGVycyBvZiBhIGZ1bmN0aW9uIGl0IHdpbGwgcmVqZWN0IGENCisjIG1hdGNoIGJldHdlZW4gdGhlIHByb3RvdHlwZSBhbmQgdGhlIGltcGxlbWVudGF0aW9uIG9mIGEgbWVtYmVyIGZ1bmN0aW9uIGV2ZW4NCisjIGlmIHRoZXJlIGlzIG9ubHkgb25lIGNhbmRpZGF0ZSBvciBpdCBpcyBvYnZpb3VzIHdoaWNoIGNhbmRpZGF0ZSB0byBjaG9vc2UNCisjIGJ5IGRvaW5nIGEgc2ltcGxlIHN0cmluZyBtYXRjaC4gQnkgZGlzYWJsaW5nIFNUUklDVF9QUk9UT19NQVRDSElORyBkb3h5Z2VuDQorIyB3aWxsIHN0aWxsIGFjY2VwdCBhIG1hdGNoIGJldHdlZW4gcHJvdG90eXBlIGFuZCBpbXBsZW1lbnRhdGlvbiBpbiBzdWNoIGNhc2VzLg0KKw0KK1NUUklDVF9QUk9UT19NQVRDSElORyAgPSBOTw0KKw0KKyMgVGhlIEdFTkVSQVRFX1RPRE9MSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKFlFUykgb3INCisjIGRpc2FibGUgKE5PKSB0aGUgdG9kbyBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFx0b2RvDQorIyBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4NCisNCitHRU5FUkFURV9UT0RPTElTVCAgICAgID0gWUVTDQorDQorIyBUaGUgR0VORVJBVEVfVEVTVExJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoWUVTKSBvcg0KKyMgZGlzYWJsZSAoTk8pIHRoZSB0ZXN0IGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgXHRlc3QNCisjIGNvbW1hbmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLg0KKw0KK0dFTkVSQVRFX1RFU1RMSVNUICAgICAgPSBZRVMNCisNCisjIFRoZSBHRU5FUkFURV9CVUdMSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKFlFUykgb3INCisjIGRpc2FibGUgKE5PKSB0aGUgYnVnIGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgXGJ1Zw0KKyMgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uDQorDQorR0VORVJBVEVfQlVHTElTVCAgICAgICA9IFlFUw0KKw0KKyMgVGhlIEdFTkVSQVRFX0RFUFJFQ0FURURMSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKFlFUykgb3INCisjIGRpc2FibGUgKE5PKSB0aGUgZGVwcmVjYXRlZCBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nDQorIyBcZGVwcmVjYXRlZCBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4NCisNCitHRU5FUkFURV9ERVBSRUNBVEVETElTVD0gWUVTDQorDQorIyBUaGUgRU5BQkxFRF9TRUNUSU9OUyB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIGNvbmRpdGlvbmFsDQorIyBkb2N1bWVudGF0aW9uIHNlY3Rpb25zLCBtYXJrZWQgYnkgXGlmIHNlY3Rpb25uYW1lIC4uLiBcZW5kaWYuDQorDQorRU5BQkxFRF9TRUNUSU9OUyAgICAgICA9DQorDQorIyBUaGUgTUFYX0lOSVRJQUxJWkVSX0xJTkVTIHRhZyBkZXRlcm1pbmVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBsaW5lcw0KKyMgdGhlIGluaXRpYWwgdmFsdWUgb2YgYSB2YXJpYWJsZSBvciBtYWNybyBjb25zaXN0cyBvZiBmb3IgaXQgdG8gYXBwZWFyIGluDQorIyB0aGUgZG9jdW1lbnRhdGlvbi4gSWYgdGhlIGluaXRpYWxpemVyIGNvbnNpc3RzIG9mIG1vcmUgbGluZXMgdGhhbiBzcGVjaWZpZWQNCisjIGhlcmUgaXQgd2lsbCBiZSBoaWRkZW4uIFVzZSBhIHZhbHVlIG9mIDAgdG8gaGlkZSBpbml0aWFsaXplcnMgY29tcGxldGVseS4NCisjIFRoZSBhcHBlYXJhbmNlIG9mIHRoZSBpbml0aWFsaXplciBvZiBpbmRpdmlkdWFsIHZhcmlhYmxlcyBhbmQgbWFjcm9zIGluIHRoZQ0KKyMgZG9jdW1lbnRhdGlvbiBjYW4gYmUgY29udHJvbGxlZCB1c2luZyBcc2hvd2luaXRpYWxpemVyIG9yIFxoaWRlaW5pdGlhbGl6ZXINCisjIGNvbW1hbmQgaW4gdGhlIGRvY3VtZW50YXRpb24gcmVnYXJkbGVzcyBvZiB0aGlzIHNldHRpbmcuDQorDQorTUFYX0lOSVRJQUxJWkVSX0xJTkVTICA9IDMwDQorDQorIyBTZXQgdGhlIFNIT1dfVVNFRF9GSUxFUyB0YWcgdG8gTk8gdG8gZGlzYWJsZSB0aGUgbGlzdCBvZiBmaWxlcyBnZW5lcmF0ZWQNCisjIGF0IHRoZSBib3R0b20gb2YgdGhlIGRvY3VtZW50YXRpb24gb2YgY2xhc3NlcyBhbmQgc3RydWN0cy4gSWYgc2V0IHRvIFlFUyB0aGUNCisjIGxpc3Qgd2lsbCBtZW50aW9uIHRoZSBmaWxlcyB0aGF0IHdlcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgZG9jdW1lbnRhdGlvbi4NCisNCitTSE9XX1VTRURfRklMRVMgICAgICAgID0gWUVTDQorDQorIyBTZXQgdGhlIFNIT1dfRklMRVMgdGFnIHRvIE5PIHRvIGRpc2FibGUgdGhlIGdlbmVyYXRpb24gb2YgdGhlIEZpbGVzIHBhZ2UuDQorIyBUaGlzIHdpbGwgcmVtb3ZlIHRoZSBGaWxlcyBlbnRyeSBmcm9tIHRoZSBRdWljayBJbmRleCBhbmQgZnJvbSB0aGUNCisjIEZvbGRlciBUcmVlIFZpZXcgKGlmIHNwZWNpZmllZCkuIFRoZSBkZWZhdWx0IGlzIFlFUy4NCisNCisjIFdlIHByb2JhYmx5IHdpbGwgd2FudCB0aGlzLCBidXQgd2UgaGF2ZSBubyBmaWxlIGRvY3VtZW50YXRpb24geWV0IHNvIGl0J3Mgc2ltcGxlciB0byByZW1vdmUNCisjIGl0IGZvciBub3cuDQorU0hPV19GSUxFUyAgICAgICAgICAgICA9IE5PDQorDQorIyBTZXQgdGhlIFNIT1dfTkFNRVNQQUNFUyB0YWcgdG8gTk8gdG8gZGlzYWJsZSB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUNCisjIE5hbWVzcGFjZXMgcGFnZS4NCisjIFRoaXMgd2lsbCByZW1vdmUgdGhlIE5hbWVzcGFjZXMgZW50cnkgZnJvbSB0aGUgUXVpY2sgSW5kZXgNCisjIGFuZCBmcm9tIHRoZSBGb2xkZXIgVHJlZSBWaWV3IChpZiBzcGVjaWZpZWQpLiBUaGUgZGVmYXVsdCBpcyBZRVMuDQorDQorU0hPV19OQU1FU1BBQ0VTICAgICAgICA9IFlFUw0KKw0KKyMgVGhlIEZJTEVfVkVSU0lPTl9GSUxURVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwcm9ncmFtIG9yIHNjcmlwdCB0aGF0DQorIyBkb3h5Z2VuIHNob3VsZCBpbnZva2UgdG8gZ2V0IHRoZSBjdXJyZW50IHZlcnNpb24gZm9yIGVhY2ggZmlsZSAodHlwaWNhbGx5IGZyb20NCisjIHRoZSB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtKS4gRG94eWdlbiB3aWxsIGludm9rZSB0aGUgcHJvZ3JhbSBieSBleGVjdXRpbmcgKHZpYQ0KKyMgcG9wZW4oKSkgdGhlIGNvbW1hbmQgPGNvbW1hbmQ+IDxpbnB1dC1maWxlPiwgd2hlcmUgPGNvbW1hbmQ+IGlzIHRoZSB2YWx1ZSBvZg0KKyMgdGhlIEZJTEVfVkVSU0lPTl9GSUxURVIgdGFnLCBhbmQgPGlucHV0LWZpbGU+IGlzIHRoZSBuYW1lIG9mIGFuIGlucHV0IGZpbGUNCisjIHByb3ZpZGVkIGJ5IGRveHlnZW4uIFdoYXRldmVyIHRoZSBwcm9ncmFtIHdyaXRlcyB0byBzdGFuZGFyZCBvdXRwdXQNCisjIGlzIHVzZWQgYXMgdGhlIGZpbGUgdmVyc2lvbi4gU2VlIHRoZSBtYW51YWwgZm9yIGV4YW1wbGVzLg0KKw0KK0ZJTEVfVkVSU0lPTl9GSUxURVIgICAgPQ0KKw0KKyMgVGhlIExBWU9VVF9GSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbGF5b3V0IGZpbGUgd2hpY2ggd2lsbCBiZSBwYXJzZWQNCisjIGJ5IGRveHlnZW4uIFRoZSBsYXlvdXQgZmlsZSBjb250cm9scyB0aGUgZ2xvYmFsIHN0cnVjdHVyZSBvZiB0aGUgZ2VuZXJhdGVkDQorIyBvdXRwdXQgZmlsZXMgaW4gYW4gb3V0cHV0IGZvcm1hdCBpbmRlcGVuZGVudCB3YXkuIFRvIGNyZWF0ZSB0aGUgbGF5b3V0IGZpbGUNCisjIHRoYXQgcmVwcmVzZW50cyBkb3h5Z2VuJ3MgZGVmYXVsdHMsIHJ1biBkb3h5Z2VuIHdpdGggdGhlIC1sIG9wdGlvbi4NCisjIFlvdSBjYW4gb3B0aW9uYWxseSBzcGVjaWZ5IGEgZmlsZSBuYW1lIGFmdGVyIHRoZSBvcHRpb24sIGlmIG9taXR0ZWQNCisjIERveHlnZW5MYXlvdXQueG1sIHdpbGwgYmUgdXNlZCBhcyB0aGUgbmFtZSBvZiB0aGUgbGF5b3V0IGZpbGUuDQorDQorTEFZT1VUX0ZJTEUgICAgICAgICAgICA9DQorDQorIyBUaGUgQ0lURV9CSUJfRklMRVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgYmliIGZpbGVzDQorIyBjb250YWluaW5nIHRoZSByZWZlcmVuY2VzIGRhdGEuIFRoaXMgbXVzdCBiZSBhIGxpc3Qgb2YgLmJpYiBmaWxlcy4gVGhlDQorIyAuYmliIGV4dGVuc2lvbiBpcyBhdXRvbWF0aWNhbGx5IGFwcGVuZGVkIGlmIG9taXR0ZWQuIFVzaW5nIHRoaXMgY29tbWFuZA0KKyMgcmVxdWlyZXMgdGhlIGJpYnRleCB0b29sIHRvIGJlIGluc3RhbGxlZC4gU2VlIGFsc28NCisjIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmliVGVYIGZvciBtb3JlIGluZm8uIEZvciBMYVRlWCB0aGUgc3R5bGUNCisjIG9mIHRoZSBiaWJsaW9ncmFwaHkgY2FuIGJlIGNvbnRyb2xsZWQgdXNpbmcgTEFURVhfQklCX1NUWUxFLiBUbyB1c2UgdGhpcw0KKyMgZmVhdHVyZSB5b3UgbmVlZCBiaWJ0ZXggYW5kIHBlcmwgYXZhaWxhYmxlIGluIHRoZSBzZWFyY2ggcGF0aC4NCisNCitDSVRFX0JJQl9GSUxFUyAgICAgICAgID0NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB3YXJuaW5nIGFuZCBwcm9ncmVzcyBtZXNzYWdlcw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisjIFRoZSBRVUlFVCB0YWcgY2FuIGJlIHVzZWQgdG8gdHVybiBvbi9vZmYgdGhlIG1lc3NhZ2VzIHRoYXQgYXJlIGdlbmVyYXRlZA0KKyMgYnkgZG94eWdlbi4gUG9zc2libGUgdmFsdWVzIGFyZSBZRVMgYW5kIE5PLiBJZiBsZWZ0IGJsYW5rIE5PIGlzIHVzZWQuDQorDQorUVVJRVQgICAgICAgICAgICAgICAgICA9IE5PDQorDQorIyBUaGUgV0FSTklOR1MgdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSB3YXJuaW5nIG1lc3NhZ2VzIHRoYXQgYXJlDQorIyBnZW5lcmF0ZWQgYnkgZG94eWdlbi4gUG9zc2libGUgdmFsdWVzIGFyZSBZRVMgYW5kIE5PLiBJZiBsZWZ0IGJsYW5rDQorIyBOTyBpcyB1c2VkLg0KKw0KK1dBUk5JTkdTICAgICAgICAgICAgICAgPSBZRVMNCisNCisjIElmIFdBUk5fSUZfVU5ET0NVTUVOVEVEIGlzIHNldCB0byBZRVMsIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIHdhcm5pbmdzDQorIyBmb3IgdW5kb2N1bWVudGVkIG1lbWJlcnMuIElmIEVYVFJBQ1RfQUxMIGlzIHNldCB0byBZRVMgdGhlbiB0aGlzIGZsYWcgd2lsbA0KKyMgYXV0b21hdGljYWxseSBiZSBkaXNhYmxlZC4NCisNCitXQVJOX0lGX1VORE9DVU1FTlRFRCAgID0gWUVTDQorDQorIyBJZiBXQVJOX0lGX0RPQ19FUlJPUiBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgd2FybmluZ3MgZm9yDQorIyBwb3RlbnRpYWwgZXJyb3JzIGluIHRoZSBkb2N1bWVudGF0aW9uLCBzdWNoIGFzIG5vdCBkb2N1bWVudGluZyBzb21lDQorIyBwYXJhbWV0ZXJzIGluIGEgZG9jdW1lbnRlZCBmdW5jdGlvbiwgb3IgZG9jdW1lbnRpbmcgcGFyYW1ldGVycyB0aGF0DQorIyBkb24ndCBleGlzdCBvciB1c2luZyBtYXJrdXAgY29tbWFuZHMgd3JvbmdseS4NCisNCitXQVJOX0lGX0RPQ19FUlJPUiAgICAgID0gWUVTDQorDQorIyBUaGUgV0FSTl9OT19QQVJBTURPQyBvcHRpb24gY2FuIGJlIGVuYWJsZWQgdG8gZ2V0IHdhcm5pbmdzIGZvcg0KKyMgZnVuY3Rpb25zIHRoYXQgYXJlIGRvY3VtZW50ZWQsIGJ1dCBoYXZlIG5vIGRvY3VtZW50YXRpb24gZm9yIHRoZWlyIHBhcmFtZXRlcnMNCisjIG9yIHJldHVybiB2YWx1ZS4gSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgZG94eWdlbiB3aWxsIG9ubHkgd2FybiBhYm91dA0KKyMgd3Jvbmcgb3IgaW5jb21wbGV0ZSBwYXJhbWV0ZXIgZG9jdW1lbnRhdGlvbiwgYnV0IG5vdCBhYm91dCB0aGUgYWJzZW5jZSBvZg0KKyMgZG9jdW1lbnRhdGlvbi4NCisNCitXQVJOX05PX1BBUkFNRE9DICAgICAgID0gTk8NCisNCisjIFRoZSBXQVJOX0ZPUk1BVCB0YWcgZGV0ZXJtaW5lcyB0aGUgZm9ybWF0IG9mIHRoZSB3YXJuaW5nIG1lc3NhZ2VzIHRoYXQNCisjIGRveHlnZW4gY2FuIHByb2R1Y2UuIFRoZSBzdHJpbmcgc2hvdWxkIGNvbnRhaW4gdGhlICRmaWxlLCAkbGluZSwgYW5kICR0ZXh0DQorIyB0YWdzLCB3aGljaCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBmaWxlIGFuZCBsaW5lIG51bWJlciBmcm9tIHdoaWNoIHRoZQ0KKyMgd2FybmluZyBvcmlnaW5hdGVkIGFuZCB0aGUgd2FybmluZyB0ZXh0LiBPcHRpb25hbGx5IHRoZSBmb3JtYXQgbWF5IGNvbnRhaW4NCisjICR2ZXJzaW9uLCB3aGljaCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSB2ZXJzaW9uIG9mIHRoZSBmaWxlIChpZiBpdCBjb3VsZA0KKyMgYmUgb2J0YWluZWQgdmlhIEZJTEVfVkVSU0lPTl9GSUxURVIpDQorDQorV0FSTl9GT1JNQVQgICAgICAgICAgICA9DQorDQorIyBUaGUgV0FSTl9MT0dGSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgZmlsZSB0byB3aGljaCB3YXJuaW5nDQorIyBhbmQgZXJyb3IgbWVzc2FnZXMgc2hvdWxkIGJlIHdyaXR0ZW4uIElmIGxlZnQgYmxhbmsgdGhlIG91dHB1dCBpcyB3cml0dGVuDQorIyB0byBzdGRlcnIuDQorDQorV0FSTl9MT0dGSUxFICAgICAgICAgICA9DQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGlucHV0IGZpbGVzDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKyMgVGhlIElOUFVUIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlcyBhbmQvb3IgZGlyZWN0b3JpZXMgdGhhdCBjb250YWluDQorIyBkb2N1bWVudGVkIHNvdXJjZSBmaWxlcy4gWW91IG1heSBlbnRlciBmaWxlIG5hbWVzIGxpa2UgIm15ZmlsZS5jcHAiIG9yDQorIyBkaXJlY3RvcmllcyBsaWtlICIvdXNyL3NyYy9teXByb2plY3QiLiBTZXBhcmF0ZSB0aGUgZmlsZXMgb3IgZGlyZWN0b3JpZXMNCisjIHdpdGggc3BhY2VzLg0KKw0KK0lOUFVUICAgICAgICAgICAgICAgICAgPSBzcmMgIGRvYy9kb3h5Z2VuL2xpYm9tcF9pbnRlcmZhY2UuaCANCisjIFRoZSBpdHRub3RpZnkgY29kZSBhbHNvIGhhcyBkb3h5Z2VuIGRvY3VtZW50YXRpb24sIGJ1dCBpZiB3ZSBpbmNsdWRlIGl0IGhlcmUNCisjIGl0IHRha2VzIG92ZXIgZnJvbSB1cyENCisjIHNyYy90aGlyZHBhcnR5L2l0dG5vdGlmeSAgICAgICAgICAgICAgICAgICAgICAgICANCisNCisjIFRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGNoYXJhY3RlciBlbmNvZGluZyBvZiB0aGUgc291cmNlIGZpbGVzDQorIyB0aGF0IGRveHlnZW4gcGFyc2VzLiBJbnRlcm5hbGx5IGRveHlnZW4gdXNlcyB0aGUgVVRGLTggZW5jb2RpbmcsIHdoaWNoIGlzDQorIyBhbHNvIHRoZSBkZWZhdWx0IGlucHV0IGVuY29kaW5nLiBEb3h5Z2VuIHVzZXMgbGliaWNvbnYgKG9yIHRoZSBpY29udiBidWlsdA0KKyMgaW50byBsaWJjKSBmb3IgdGhlIHRyYW5zY29kaW5nLiBTZWUgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2xpYmljb252IGZvcg0KKyMgdGhlIGxpc3Qgb2YgcG9zc2libGUgZW5jb2RpbmdzLg0KKw0KK0lOUFVUX0VOQ09ESU5HICAgICAgICAgPSBVVEYtOA0KKw0KKyMgSWYgdGhlIHZhbHVlIG9mIHRoZSBJTlBVVCB0YWcgY29udGFpbnMgZGlyZWN0b3JpZXMsIHlvdSBjYW4gdXNlIHRoZQ0KKyMgRklMRV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZCBwYXR0ZXJuIChsaWtlICouY3BwDQorIyBhbmQgKi5oKSB0byBmaWx0ZXIgb3V0IHRoZSBzb3VyY2UtZmlsZXMgaW4gdGhlIGRpcmVjdG9yaWVzLiBJZiBsZWZ0DQorIyBibGFuayB0aGUgZm9sbG93aW5nIHBhdHRlcm5zIGFyZSB0ZXN0ZWQ6DQorIyAqLmMgKi5jYyAqLmN4eCAqLmNwcCAqLmMrKyAqLmQgKi5qYXZhICouaWkgKi5peHggKi5pcHAgKi5pKysgKi5pbmwgKi5oICouaGgNCisjICouaHh4ICouaHBwICouaCsrICouaWRsICoub2RsICouY3MgKi5waHAgKi5waHAzICouaW5jICoubSAqLm1tICouZG94ICoucHkNCisjICouZjkwICouZiAqLmZvciAqLnZoZCAqLnZoZGwNCisNCitGSUxFX1BBVFRFUk5TICAgICAgICAgID0gKi5jICouaCAqLmNwcCANCisjIFdlIG1heSBhbHNvIHdhbnQgdG8gaW5jbHVkZSB0aGUgYXNtIGZpbGVzIHdpdGggYXBwcm9wcmlhdGUgaWZkZWYgdG8gZW5zdXJlDQorIyBkb3h5Z2VuIGRvZXNuJ3Qgc2VlIHRoZSBjb250ZW50LCBqdXN0IHRoZSBkb2N1bWVudGF0aW9uLi4uDQorDQorIyBUaGUgUkVDVVJTSVZFIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIHNwZWNpZnkgd2hldGhlciBvciBub3Qgc3ViZGlyZWN0b3JpZXMNCisjIHNob3VsZCBiZSBzZWFyY2hlZCBmb3IgaW5wdXQgZmlsZXMgYXMgd2VsbC4gUG9zc2libGUgdmFsdWVzIGFyZSBZRVMgYW5kIE5PLg0KKyMgSWYgbGVmdCBibGFuayBOTyBpcyB1c2VkLg0KKw0KKyMgT25seSBsb29rIGluIHRoZSBvbmUgZGlyZWN0b3J5Lg0KK1JFQ1VSU0lWRSAgICAgICAgICAgICAgPSBOTw0KKw0KKyMgVGhlIEVYQ0xVREUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgZmlsZXMgYW5kL29yIGRpcmVjdG9yaWVzIHRoYXQgc2hvdWxkIGJlDQorIyBleGNsdWRlZCBmcm9tIHRoZSBJTlBVVCBzb3VyY2UgZmlsZXMuIFRoaXMgd2F5IHlvdSBjYW4gZWFzaWx5IGV4Y2x1ZGUgYQ0KKyMgc3ViZGlyZWN0b3J5IGZyb20gYSBkaXJlY3RvcnkgdHJlZSB3aG9zZSByb290IGlzIHNwZWNpZmllZCB3aXRoIHRoZSBJTlBVVCB0YWcuDQorIyBOb3RlIHRoYXQgcmVsYXRpdmUgcGF0aHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgZnJvbSB3aGljaCBkb3h5Z2VuIGlzDQorIyBydW4uDQorDQorRVhDTFVERSAgICAgICAgICAgICAgICA9IHNyYy90ZXN0LXRvdWNoLmMNCisNCisjIFRoZSBFWENMVURFX1NZTUxJTktTIHRhZyBjYW4gYmUgdXNlZCB0byBzZWxlY3Qgd2hldGhlciBvciBub3QgZmlsZXMgb3INCisjIGRpcmVjdG9yaWVzIHRoYXQgYXJlIHN5bWJvbGljIGxpbmtzIChhIFVuaXggZmlsZSBzeXN0ZW0gZmVhdHVyZSkgYXJlIGV4Y2x1ZGVkDQorIyBmcm9tIHRoZSBpbnB1dC4NCisNCitFWENMVURFX1NZTUxJTktTICAgICAgID0gTk8NCisNCisjIElmIHRoZSB2YWx1ZSBvZiB0aGUgSU5QVVQgdGFnIGNvbnRhaW5zIGRpcmVjdG9yaWVzLCB5b3UgY2FuIHVzZSB0aGUNCisjIEVYQ0xVREVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgcGF0dGVybnMgdG8gZXhjbHVkZQ0KKyMgY2VydGFpbiBmaWxlcyBmcm9tIHRob3NlIGRpcmVjdG9yaWVzLiBOb3RlIHRoYXQgdGhlIHdpbGRjYXJkcyBhcmUgbWF0Y2hlZA0KKyMgYWdhaW5zdCB0aGUgZmlsZSB3aXRoIGFic29sdXRlIHBhdGgsIHNvIHRvIGV4Y2x1ZGUgYWxsIHRlc3QgZGlyZWN0b3JpZXMNCisjIGZvciBleGFtcGxlIHVzZSB0aGUgcGF0dGVybiAqL3Rlc3QvKg0KKw0KK0VYQ0xVREVfUEFUVEVSTlMgICAgICAgPQ0KKw0KKyMgVGhlIEVYQ0xVREVfU1lNQk9MUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBzeW1ib2wgbmFtZXMNCisjIChuYW1lc3BhY2VzLCBjbGFzc2VzLCBmdW5jdGlvbnMsIGV0Yy4pIHRoYXQgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gdGhlDQorIyBvdXRwdXQuIFRoZSBzeW1ib2wgbmFtZSBjYW4gYmUgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSwgYSB3b3JkLCBvciBpZiB0aGUNCisjIHdpbGRjYXJkICogaXMgdXNlZCwgYSBzdWJzdHJpbmcuIEV4YW1wbGVzOiBBTmFtZXNwYWNlLCBBQ2xhc3MsDQorIyBBQ2xhc3M6OkFOYW1lc3BhY2UsIEFOYW1lc3BhY2U6OipUZXN0DQorDQorRVhDTFVERV9TWU1CT0xTICAgICAgICA9DQorDQorIyBUaGUgRVhBTVBMRV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGZpbGVzIG9yDQorIyBkaXJlY3RvcmllcyB0aGF0IGNvbnRhaW4gZXhhbXBsZSBjb2RlIGZyYWdtZW50cyB0aGF0IGFyZSBpbmNsdWRlZCAoc2VlDQorIyB0aGUgXGluY2x1ZGUgY29tbWFuZCkuDQorDQorRVhBTVBMRV9QQVRIICAgICAgICAgICA9DQorDQorIyBJZiB0aGUgdmFsdWUgb2YgdGhlIEVYQU1QTEVfUEFUSCB0YWcgY29udGFpbnMgZGlyZWN0b3JpZXMsIHlvdSBjYW4gdXNlIHRoZQ0KKyMgRVhBTVBMRV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZCBwYXR0ZXJuIChsaWtlICouY3BwDQorIyBhbmQgKi5oKSB0byBmaWx0ZXIgb3V0IHRoZSBzb3VyY2UtZmlsZXMgaW4gdGhlIGRpcmVjdG9yaWVzLiBJZiBsZWZ0DQorIyBibGFuayBhbGwgZmlsZXMgYXJlIGluY2x1ZGVkLg0KKw0KK0VYQU1QTEVfUEFUVEVSTlMgICAgICAgPQ0KKw0KKyMgSWYgdGhlIEVYQU1QTEVfUkVDVVJTSVZFIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gc3ViZGlyZWN0b3JpZXMgd2lsbCBiZQ0KKyMgc2VhcmNoZWQgZm9yIGlucHV0IGZpbGVzIHRvIGJlIHVzZWQgd2l0aCB0aGUgXGluY2x1ZGUgb3IgXGRvbnRpbmNsdWRlDQorIyBjb21tYW5kcyBpcnJlc3BlY3RpdmUgb2YgdGhlIHZhbHVlIG9mIHRoZSBSRUNVUlNJVkUgdGFnLg0KKyMgUG9zc2libGUgdmFsdWVzIGFyZSBZRVMgYW5kIE5PLiBJZiBsZWZ0IGJsYW5rIE5PIGlzIHVzZWQuDQorDQorRVhBTVBMRV9SRUNVUlNJVkUgICAgICA9IE5PDQorDQorIyBUaGUgSU1BR0VfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBmaWxlcyBvcg0KKyMgZGlyZWN0b3JpZXMgdGhhdCBjb250YWluIGltYWdlIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uIChzZWUNCisjIHRoZSBcaW1hZ2UgY29tbWFuZCkuDQorDQorSU1BR0VfUEFUSCAgICAgICAgICAgICA9DQorDQorIyBUaGUgSU5QVVRfRklMVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcHJvZ3JhbSB0aGF0IGRveHlnZW4gc2hvdWxkDQorIyBpbnZva2UgdG8gZmlsdGVyIGZvciBlYWNoIGlucHV0IGZpbGUuIERveHlnZW4gd2lsbCBpbnZva2UgdGhlIGZpbHRlciBwcm9ncmFtDQorIyBieSBleGVjdXRpbmcgKHZpYSBwb3BlbigpKSB0aGUgY29tbWFuZCA8ZmlsdGVyPiA8aW5wdXQtZmlsZT4sIHdoZXJlIDxmaWx0ZXI+DQorIyBpcyB0aGUgdmFsdWUgb2YgdGhlIElOUFVUX0ZJTFRFUiB0YWcsIGFuZCA8aW5wdXQtZmlsZT4gaXMgdGhlIG5hbWUgb2YgYW4NCisjIGlucHV0IGZpbGUuIERveHlnZW4gd2lsbCB0aGVuIHVzZSB0aGUgb3V0cHV0IHRoYXQgdGhlIGZpbHRlciBwcm9ncmFtIHdyaXRlcw0KKyMgdG8gc3RhbmRhcmQgb3V0cHV0Lg0KKyMgSWYgRklMVEVSX1BBVFRFUk5TIGlzIHNwZWNpZmllZCwgdGhpcyB0YWcgd2lsbCBiZQ0KKyMgaWdub3JlZC4NCisNCitJTlBVVF9GSUxURVIgICAgICAgICAgID0NCisNCisjIFRoZSBGSUxURVJfUEFUVEVSTlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgZmlsdGVycyBvbiBhIHBlciBmaWxlIHBhdHRlcm4NCisjIGJhc2lzLg0KKyMgRG94eWdlbiB3aWxsIGNvbXBhcmUgdGhlIGZpbGUgbmFtZSB3aXRoIGVhY2ggcGF0dGVybiBhbmQgYXBwbHkgdGhlDQorIyBmaWx0ZXIgaWYgdGhlcmUgaXMgYSBtYXRjaC4NCisjIFRoZSBmaWx0ZXJzIGFyZSBhIGxpc3Qgb2YgdGhlIGZvcm06DQorIyBwYXR0ZXJuPWZpbHRlciAobGlrZSAqLmNwcD1teV9jcHBfZmlsdGVyKS4gU2VlIElOUFVUX0ZJTFRFUiBmb3IgZnVydGhlcg0KKyMgaW5mbyBvbiBob3cgZmlsdGVycyBhcmUgdXNlZC4gSWYgRklMVEVSX1BBVFRFUk5TIGlzIGVtcHR5IG9yIGlmDQorIyBub24gb2YgdGhlIHBhdHRlcm5zIG1hdGNoIHRoZSBmaWxlIG5hbWUsIElOUFVUX0ZJTFRFUiBpcyBhcHBsaWVkLg0KKw0KK0ZJTFRFUl9QQVRURVJOUyAgICAgICAgPQ0KKw0KKyMgSWYgdGhlIEZJTFRFUl9TT1VSQ0VfRklMRVMgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBpbnB1dCBmaWx0ZXIgKGlmIHNldCB1c2luZw0KKyMgSU5QVVRfRklMVEVSKSB3aWxsIGJlIHVzZWQgdG8gZmlsdGVyIHRoZSBpbnB1dCBmaWxlcyB3aGVuIHByb2R1Y2luZyBzb3VyY2UNCisjIGZpbGVzIHRvIGJyb3dzZSAoaS5lLiB3aGVuIFNPVVJDRV9CUk9XU0VSIGlzIHNldCB0byBZRVMpLg0KKw0KK0ZJTFRFUl9TT1VSQ0VfRklMRVMgICAgPSBOTw0KKw0KKyMgVGhlIEZJTFRFUl9TT1VSQ0VfUEFUVEVSTlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgc291cmNlIGZpbHRlcnMgcGVyIGZpbGUNCisjIHBhdHRlcm4uIEEgcGF0dGVybiB3aWxsIG92ZXJyaWRlIHRoZSBzZXR0aW5nIGZvciBGSUxURVJfUEFUVEVSTiAoaWYgYW55KQ0KKyMgYW5kIGl0IGlzIGFsc28gcG9zc2libGUgdG8gZGlzYWJsZSBzb3VyY2UgZmlsdGVyaW5nIGZvciBhIHNwZWNpZmljIHBhdHRlcm4NCisjIHVzaW5nICouZXh0PSAoc28gd2l0aG91dCBuYW1pbmcgYSBmaWx0ZXIpLiBUaGlzIG9wdGlvbiBvbmx5IGhhcyBlZmZlY3Qgd2hlbg0KKyMgRklMVEVSX1NPVVJDRV9GSUxFUyBpcyBlbmFibGVkLg0KKw0KK0ZJTFRFUl9TT1VSQ0VfUEFUVEVSTlMgPQ0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHNvdXJjZSBicm93c2luZw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisjIElmIHRoZSBTT1VSQ0VfQlJPV1NFUiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGEgbGlzdCBvZiBzb3VyY2UgZmlsZXMgd2lsbA0KKyMgYmUgZ2VuZXJhdGVkLiBEb2N1bWVudGVkIGVudGl0aWVzIHdpbGwgYmUgY3Jvc3MtcmVmZXJlbmNlZCB3aXRoIHRoZXNlIHNvdXJjZXMuDQorIyBOb3RlOiBUbyBnZXQgcmlkIG9mIGFsbCBzb3VyY2UgY29kZSBpbiB0aGUgZ2VuZXJhdGVkIG91dHB1dCwgbWFrZSBzdXJlIGFsc28NCisjIFZFUkJBVElNX0hFQURFUlMgaXMgc2V0IHRvIE5PLg0KKw0KK1NPVVJDRV9CUk9XU0VSICAgICAgICAgPSBZRVMNCisNCisjIFNldHRpbmcgdGhlIElOTElORV9TT1VSQ0VTIHRhZyB0byBZRVMgd2lsbCBpbmNsdWRlIHRoZSBib2R5DQorIyBvZiBmdW5jdGlvbnMgYW5kIGNsYXNzZXMgZGlyZWN0bHkgaW4gdGhlIGRvY3VtZW50YXRpb24uDQorDQorSU5MSU5FX1NPVVJDRVMgICAgICAgICA9IE5PDQorDQorIyBTZXR0aW5nIHRoZSBTVFJJUF9DT0RFX0NPTU1FTlRTIHRhZyB0byBZRVMgKHRoZSBkZWZhdWx0KSB3aWxsIGluc3RydWN0DQorIyBkb3h5Z2VuIHRvIGhpZGUgYW55IHNwZWNpYWwgY29tbWVudCBibG9ja3MgZnJvbSBnZW5lcmF0ZWQgc291cmNlIGNvZGUNCisjIGZyYWdtZW50cy4gTm9ybWFsIEMsIEMrKyBhbmQgRm9ydHJhbiBjb21tZW50cyB3aWxsIGFsd2F5cyByZW1haW4gdmlzaWJsZS4NCisNCitTVFJJUF9DT0RFX0NPTU1FTlRTICAgID0gWUVTDQorDQorIyBJZiB0aGUgUkVGRVJFTkNFRF9CWV9SRUxBVElPTiB0YWcgaXMgc2V0IHRvIFlFUw0KKyMgdGhlbiBmb3IgZWFjaCBkb2N1bWVudGVkIGZ1bmN0aW9uIGFsbCBkb2N1bWVudGVkDQorIyBmdW5jdGlvbnMgcmVmZXJlbmNpbmcgaXQgd2lsbCBiZSBsaXN0ZWQuDQorDQorUkVGRVJFTkNFRF9CWV9SRUxBVElPTiA9IFlFUw0KKw0KKyMgSWYgdGhlIFJFRkVSRU5DRVNfUkVMQVRJT04gdGFnIGlzIHNldCB0byBZRVMNCisjIHRoZW4gZm9yIGVhY2ggZG9jdW1lbnRlZCBmdW5jdGlvbiBhbGwgZG9jdW1lbnRlZCBlbnRpdGllcw0KKyMgY2FsbGVkL3VzZWQgYnkgdGhhdCBmdW5jdGlvbiB3aWxsIGJlIGxpc3RlZC4NCisNCitSRUZFUkVOQ0VTX1JFTEFUSU9OICAgID0gTk8NCisNCisjIElmIHRoZSBSRUZFUkVOQ0VTX0xJTktfU09VUkNFIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkNCisjIGFuZCBTT1VSQ0VfQlJPV1NFUiB0YWcgaXMgc2V0IHRvIFlFUywgdGhlbiB0aGUgaHlwZXJsaW5rcyBmcm9tDQorIyBmdW5jdGlvbnMgaW4gUkVGRVJFTkNFU19SRUxBVElPTiBhbmQgUkVGRVJFTkNFRF9CWV9SRUxBVElPTiBsaXN0cyB3aWxsDQorIyBsaW5rIHRvIHRoZSBzb3VyY2UgY29kZS4NCisjIE90aGVyd2lzZSB0aGV5IHdpbGwgbGluayB0byB0aGUgZG9jdW1lbnRhdGlvbi4NCisNCitSRUZFUkVOQ0VTX0xJTktfU09VUkNFID0gWUVTDQorDQorIyBJZiB0aGUgVVNFX0hUQUdTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIHJlZmVyZW5jZXMgdG8gc291cmNlIGNvZGUNCisjIHdpbGwgcG9pbnQgdG8gdGhlIEhUTUwgZ2VuZXJhdGVkIGJ5IHRoZSBodGFncygxKSB0b29sIGluc3RlYWQgb2YgZG94eWdlbg0KKyMgYnVpbHQtaW4gc291cmNlIGJyb3dzZXIuIFRoZSBodGFncyB0b29sIGlzIHBhcnQgb2YgR05VJ3MgZ2xvYmFsIHNvdXJjZQ0KKyMgdGFnZ2luZyBzeXN0ZW0gKHNlZSBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZ2xvYmFsL2dsb2JhbC5odG1sKS4gWW91DQorIyB3aWxsIG5lZWQgdmVyc2lvbiA0LjguNiBvciBoaWdoZXIuDQorDQorVVNFX0hUQUdTICAgICAgICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgVkVSQkFUSU1fSEVBREVSUyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIHRoZW4gRG94eWdlbg0KKyMgd2lsbCBnZW5lcmF0ZSBhIHZlcmJhdGltIGNvcHkgb2YgdGhlIGhlYWRlciBmaWxlIGZvciBlYWNoIGNsYXNzIGZvcg0KKyMgd2hpY2ggYW4gaW5jbHVkZSBpcyBzcGVjaWZpZWQuIFNldCB0byBOTyB0byBkaXNhYmxlIHRoaXMuDQorDQorVkVSQkFUSU1fSEVBREVSUyAgICAgICA9IFlFUw0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBhbHBoYWJldGljYWwgY2xhc3MgaW5kZXgNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorIyBJZiB0aGUgQUxQSEFCRVRJQ0FMX0lOREVYIHRhZyBpcyBzZXQgdG8gWUVTLCBhbiBhbHBoYWJldGljYWwgaW5kZXgNCisjIG9mIGFsbCBjb21wb3VuZHMgd2lsbCBiZSBnZW5lcmF0ZWQuIEVuYWJsZSB0aGlzIGlmIHRoZSBwcm9qZWN0DQorIyBjb250YWlucyBhIGxvdCBvZiBjbGFzc2VzLCBzdHJ1Y3RzLCB1bmlvbnMgb3IgaW50ZXJmYWNlcy4NCisNCitBTFBIQUJFVElDQUxfSU5ERVggICAgID0gWUVTDQorDQorIyBJZiB0aGUgYWxwaGFiZXRpY2FsIGluZGV4IGlzIGVuYWJsZWQgKHNlZSBBTFBIQUJFVElDQUxfSU5ERVgpIHRoZW4NCisjIHRoZSBDT0xTX0lOX0FMUEhBX0lOREVYIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBudW1iZXIgb2YgY29sdW1ucw0KKyMgaW4gd2hpY2ggdGhpcyBsaXN0IHdpbGwgYmUgc3BsaXQgKGNhbiBiZSBhIG51bWJlciBpbiB0aGUgcmFuZ2UgWzEuLjIwXSkNCisNCitDT0xTX0lOX0FMUEhBX0lOREVYICAgID0gNQ0KKw0KKyMgSW4gY2FzZSBhbGwgY2xhc3NlcyBpbiBhIHByb2plY3Qgc3RhcnQgd2l0aCBhIGNvbW1vbiBwcmVmaXgsIGFsbA0KKyMgY2xhc3NlcyB3aWxsIGJlIHB1dCB1bmRlciB0aGUgc2FtZSBoZWFkZXIgaW4gdGhlIGFscGhhYmV0aWNhbCBpbmRleC4NCisjIFRoZSBJR05PUkVfUFJFRklYIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHByZWZpeGVzIHRoYXQNCisjIHNob3VsZCBiZSBpZ25vcmVkIHdoaWxlIGdlbmVyYXRpbmcgdGhlIGluZGV4IGhlYWRlcnMuDQorDQorSUdOT1JFX1BSRUZJWCAgICAgICAgICA9DQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIEhUTUwgb3V0cHV0DQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUwgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwNCisjIGdlbmVyYXRlIEhUTUwgb3V0cHV0Lg0KKw0KK0dFTkVSQVRFX0hUTUwgICAgICAgICAgPSBZRVMNCisNCisjIFRoZSBIVE1MX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBIVE1MIGRvY3Mgd2lsbCBiZSBwdXQuDQorIyBJZiBhIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlDQorIyBwdXQgaW4gZnJvbnQgb2YgaXQuIElmIGxlZnQgYmxhbmsgYGh0bWwnIHdpbGwgYmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBwYXRoLg0KKw0KK0hUTUxfT1VUUFVUICAgICAgICAgICAgPQ0KKw0KKyMgVGhlIEhUTUxfRklMRV9FWFRFTlNJT04gdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGUgZXh0ZW5zaW9uIGZvcg0KKyMgZWFjaCBnZW5lcmF0ZWQgSFRNTCBwYWdlIChmb3IgZXhhbXBsZTogLmh0bSwucGhwLC5hc3ApLiBJZiBpdCBpcyBsZWZ0IGJsYW5rDQorIyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgZmlsZXMgd2l0aCAuaHRtbCBleHRlbnNpb24uDQorDQorSFRNTF9GSUxFX0VYVEVOU0lPTiAgICA9IC5odG1sDQorDQorIyBUaGUgSFRNTF9IRUFERVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwZXJzb25hbCBIVE1MIGhlYWRlciBmb3INCisjIGVhY2ggZ2VuZXJhdGVkIEhUTUwgcGFnZS4gSWYgaXQgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQ0KKyMgc3RhbmRhcmQgaGVhZGVyLiBOb3RlIHRoYXQgd2hlbiB1c2luZyBhIGN1c3RvbSBoZWFkZXIgeW91IGFyZSByZXNwb25zaWJsZQ0KKyMgIGZvciB0aGUgcHJvcGVyIGluY2x1c2lvbiBvZiBhbnkgc2NyaXB0cyBhbmQgc3R5bGUgc2hlZXRzIHRoYXQgZG94eWdlbg0KKyMgbmVlZHMsIHdoaWNoIGlzIGRlcGVuZGVudCBvbiB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHVzZWQuDQorIyBJdCBpcyBhZHZpc2VkIHRvIGdlbmVyYXRlIGEgZGVmYXVsdCBoZWFkZXIgdXNpbmcgImRveHlnZW4gLXcgaHRtbA0KKyMgaGVhZGVyLmh0bWwgZm9vdGVyLmh0bWwgc3R5bGVzaGVldC5jc3MgWW91ckNvbmZpZ0ZpbGUiIGFuZCB0aGVuIG1vZGlmeQ0KKyMgdGhhdCBoZWFkZXIuIE5vdGUgdGhhdCB0aGUgaGVhZGVyIGlzIHN1YmplY3QgdG8gY2hhbmdlIHNvIHlvdSB0eXBpY2FsbHkNCisjIGhhdmUgdG8gcmVkbyB0aGlzIHdoZW4gdXBncmFkaW5nIHRvIGEgbmV3ZXIgdmVyc2lvbiBvZiBkb3h5Z2VuIG9yIHdoZW4NCisjIGNoYW5naW5nIHRoZSB2YWx1ZSBvZiBjb25maWd1cmF0aW9uIHNldHRpbmdzIHN1Y2ggYXMgR0VORVJBVEVfVFJFRVZJRVchDQorDQorSFRNTF9IRUFERVIgICAgICAgICAgICA9DQorDQorIyBUaGUgSFRNTF9GT09URVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwZXJzb25hbCBIVE1MIGZvb3RlciBmb3INCisjIGVhY2ggZ2VuZXJhdGVkIEhUTUwgcGFnZS4gSWYgaXQgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQ0KKyMgc3RhbmRhcmQgZm9vdGVyLg0KKw0KK0hUTUxfRk9PVEVSICAgICAgICAgICAgPQ0KKw0KKyMgVGhlIEhUTUxfU1RZTEVTSEVFVCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHVzZXItZGVmaW5lZCBjYXNjYWRpbmcNCisjIHN0eWxlIHNoZWV0IHRoYXQgaXMgdXNlZCBieSBlYWNoIEhUTUwgcGFnZS4gSXQgY2FuIGJlIHVzZWQgdG8NCisjIGZpbmUtdHVuZSB0aGUgbG9vayBvZiB0aGUgSFRNTCBvdXRwdXQuIElmIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsDQorIyBnZW5lcmF0ZSBhIGRlZmF1bHQgc3R5bGUgc2hlZXQuIE5vdGUgdGhhdCBpdCBpcyByZWNvbW1lbmRlZCB0byB1c2UNCisjIEhUTUxfRVhUUkFfU1RZTEVTSEVFVCBpbnN0ZWFkIG9mIHRoaXMgb25lLCBhcyBpdCBpcyBtb3JlIHJvYnVzdCBhbmQgdGhpcw0KKyMgdGFnIHdpbGwgaW4gdGhlIGZ1dHVyZSBiZWNvbWUgb2Jzb2xldGUuDQorDQorSFRNTF9TVFlMRVNIRUVUICAgICAgICA9DQorDQorIyBUaGUgSFRNTF9FWFRSQV9TVFlMRVNIRUVUIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGFuIGFkZGl0aW9uYWwNCisjIHVzZXItZGVmaW5lZCBjYXNjYWRpbmcgc3R5bGUgc2hlZXQgdGhhdCBpcyBpbmNsdWRlZCBhZnRlciB0aGUgc3RhbmRhcmQNCisjIHN0eWxlIHNoZWV0cyBjcmVhdGVkIGJ5IGRveHlnZW4uIFVzaW5nIHRoaXMgb3B0aW9uIG9uZSBjYW4gb3ZlcnJ1bGUNCisjIGNlcnRhaW4gc3R5bGUgYXNwZWN0cy4gVGhpcyBpcyBwcmVmZXJyZWQgb3ZlciB1c2luZyBIVE1MX1NUWUxFU0hFRVQNCisjIHNpbmNlIGl0IGRvZXMgbm90IHJlcGxhY2UgdGhlIHN0YW5kYXJkIHN0eWxlIHNoZWV0IGFuZCBpcyB0aGVyZWZvciBtb3JlDQorIyByb2J1c3QgYWdhaW5zdCBmdXR1cmUgdXBkYXRlcy4gRG94eWdlbiB3aWxsIGNvcHkgdGhlIHN0eWxlIHNoZWV0IGZpbGUgdG8NCisjIHRoZSBvdXRwdXQgZGlyZWN0b3J5Lg0KKw0KK0hUTUxfRVhUUkFfU1RZTEVTSEVFVCAgPQ0KKw0KKyMgVGhlIEhUTUxfRVhUUkFfRklMRVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZXh0cmEgaW1hZ2VzIG9yDQorIyBvdGhlciBzb3VyY2UgZmlsZXMgd2hpY2ggc2hvdWxkIGJlIGNvcGllZCB0byB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5LiBOb3RlDQorIyB0aGF0IHRoZXNlIGZpbGVzIHdpbGwgYmUgY29waWVkIHRvIHRoZSBiYXNlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeS4gVXNlIHRoZQ0KKyMgJHJlbHBhdGgkIG1hcmtlciBpbiB0aGUgSFRNTF9IRUFERVIgYW5kL29yIEhUTUxfRk9PVEVSIGZpbGVzIHRvIGxvYWQgdGhlc2UNCisjIGZpbGVzLiBJbiB0aGUgSFRNTF9TVFlMRVNIRUVUIGZpbGUsIHVzZSB0aGUgZmlsZSBuYW1lIG9ubHkuIEFsc28gbm90ZSB0aGF0DQorIyB0aGUgZmlsZXMgd2lsbCBiZSBjb3BpZWQgYXMtaXM7IHRoZXJlIGFyZSBubyBjb21tYW5kcyBvciBtYXJrZXJzIGF2YWlsYWJsZS4NCisNCitIVE1MX0VYVFJBX0ZJTEVTICAgICAgID0NCisNCisjIFRoZSBIVE1MX0NPTE9SU1RZTEVfSFVFIHRhZyBjb250cm9scyB0aGUgY29sb3Igb2YgdGhlIEhUTUwgb3V0cHV0Lg0KKyMgRG94eWdlbiB3aWxsIGFkanVzdCB0aGUgY29sb3JzIGluIHRoZSBzdHlsZSBzaGVldCBhbmQgYmFja2dyb3VuZCBpbWFnZXMNCisjIGFjY29yZGluZyB0byB0aGlzIGNvbG9yLiBIdWUgaXMgc3BlY2lmaWVkIGFzIGFuIGFuZ2xlIG9uIGEgY29sb3J3aGVlbCwNCisjIHNlZSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0h1ZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4NCisjIEZvciBpbnN0YW5jZSB0aGUgdmFsdWUgMCByZXByZXNlbnRzIHJlZCwgNjAgaXMgeWVsbG93LCAxMjAgaXMgZ3JlZW4sDQorIyAxODAgaXMgY3lhbiwgMjQwIGlzIGJsdWUsIDMwMCBwdXJwbGUsIGFuZCAzNjAgaXMgcmVkIGFnYWluLg0KKyMgVGhlIGFsbG93ZWQgcmFuZ2UgaXMgMCB0byAzNTkuDQorDQorSFRNTF9DT0xPUlNUWUxFX0hVRSAgICA9IDIyMA0KKw0KKyMgVGhlIEhUTUxfQ09MT1JTVFlMRV9TQVQgdGFnIGNvbnRyb2xzIHRoZSBwdXJpdHkgKG9yIHNhdHVyYXRpb24pIG9mDQorIyB0aGUgY29sb3JzIGluIHRoZSBIVE1MIG91dHB1dC4gRm9yIGEgdmFsdWUgb2YgMCB0aGUgb3V0cHV0IHdpbGwgdXNlDQorIyBncmF5c2NhbGVzIG9ubHkuIEEgdmFsdWUgb2YgMjU1IHdpbGwgcHJvZHVjZSB0aGUgbW9zdCB2aXZpZCBjb2xvcnMuDQorDQorSFRNTF9DT0xPUlNUWUxFX1NBVCAgICA9IDEwMA0KKw0KKyMgVGhlIEhUTUxfQ09MT1JTVFlMRV9HQU1NQSB0YWcgY29udHJvbHMgdGhlIGdhbW1hIGNvcnJlY3Rpb24gYXBwbGllZCB0bw0KKyMgdGhlIGx1bWluYW5jZSBjb21wb25lbnQgb2YgdGhlIGNvbG9ycyBpbiB0aGUgSFRNTCBvdXRwdXQuIFZhbHVlcyBiZWxvdw0KKyMgMTAwIGdyYWR1YWxseSBtYWtlIHRoZSBvdXRwdXQgbGlnaHRlciwgd2hlcmVhcyB2YWx1ZXMgYWJvdmUgMTAwIG1ha2UNCisjIHRoZSBvdXRwdXQgZGFya2VyLiBUaGUgdmFsdWUgZGl2aWRlZCBieSAxMDAgaXMgdGhlIGFjdHVhbCBnYW1tYSBhcHBsaWVkLA0KKyMgc28gODAgcmVwcmVzZW50cyBhIGdhbW1hIG9mIDAuOCwgVGhlIHZhbHVlIDIyMCByZXByZXNlbnRzIGEgZ2FtbWEgb2YgMi4yLA0KKyMgYW5kIDEwMCBkb2VzIG5vdCBjaGFuZ2UgdGhlIGdhbW1hLg0KKw0KK0hUTUxfQ09MT1JTVFlMRV9HQU1NQSAgPSA4MA0KKw0KKyMgSWYgdGhlIEhUTUxfVElNRVNUQU1QIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIGZvb3RlciBvZiBlYWNoIGdlbmVyYXRlZCBIVE1MDQorIyBwYWdlIHdpbGwgY29udGFpbiB0aGUgZGF0ZSBhbmQgdGltZSB3aGVuIHRoZSBwYWdlIHdhcyBnZW5lcmF0ZWQuIFNldHRpbmcNCisjIHRoaXMgdG8gTk8gY2FuIGhlbHAgd2hlbiBjb21wYXJpbmcgdGhlIG91dHB1dCBvZiBtdWx0aXBsZSBydW5zLg0KKw0KK0hUTUxfVElNRVNUQU1QICAgICAgICAgPSBZRVMNCisNCisjIElmIHRoZSBIVE1MX0RZTkFNSUNfU0VDVElPTlMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgZ2VuZXJhdGVkIEhUTUwNCisjIGRvY3VtZW50YXRpb24gd2lsbCBjb250YWluIHNlY3Rpb25zIHRoYXQgY2FuIGJlIGhpZGRlbiBhbmQgc2hvd24gYWZ0ZXIgdGhlDQorIyBwYWdlIGhhcyBsb2FkZWQuDQorDQorSFRNTF9EWU5BTUlDX1NFQ1RJT05TICA9IE5PDQorDQorIyBXaXRoIEhUTUxfSU5ERVhfTlVNX0VOVFJJRVMgb25lIGNhbiBjb250cm9sIHRoZSBwcmVmZXJyZWQgbnVtYmVyIG9mDQorIyBlbnRyaWVzIHNob3duIGluIHRoZSB2YXJpb3VzIHRyZWUgc3RydWN0dXJlZCBpbmRpY2VzIGluaXRpYWxseTsgdGhlIHVzZXINCisjIGNhbiBleHBhbmQgYW5kIGNvbGxhcHNlIGVudHJpZXMgZHluYW1pY2FsbHkgbGF0ZXIgb24uIERveHlnZW4gd2lsbCBleHBhbmQNCisjIHRoZSB0cmVlIHRvIHN1Y2ggYSBsZXZlbCB0aGF0IGF0IG1vc3QgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZW50cmllcyBhcmUNCisjIHZpc2libGUgKHVubGVzcyBhIGZ1bGx5IGNvbGxhcHNlZCB0cmVlIGFscmVhZHkgZXhjZWVkcyB0aGlzIGFtb3VudCkuDQorIyBTbyBzZXR0aW5nIHRoZSBudW1iZXIgb2YgZW50cmllcyAxIHdpbGwgcHJvZHVjZSBhIGZ1bGwgY29sbGFwc2VkIHRyZWUgYnkNCisjIGRlZmF1bHQuIDAgaXMgYSBzcGVjaWFsIHZhbHVlIHJlcHJlc2VudGluZyBhbiBpbmZpbml0ZSBudW1iZXIgb2YgZW50cmllcw0KKyMgYW5kIHdpbGwgcmVzdWx0IGluIGEgZnVsbCBleHBhbmRlZCB0cmVlIGJ5IGRlZmF1bHQuDQorDQorSFRNTF9JTkRFWF9OVU1fRU5UUklFUyA9IDEwMA0KKw0KKyMgSWYgdGhlIEdFTkVSQVRFX0RPQ1NFVCB0YWcgaXMgc2V0IHRvIFlFUywgYWRkaXRpb25hbCBpbmRleCBmaWxlcw0KKyMgd2lsbCBiZSBnZW5lcmF0ZWQgdGhhdCBjYW4gYmUgdXNlZCBhcyBpbnB1dCBmb3IgQXBwbGUncyBYY29kZSAzDQorIyBpbnRlZ3JhdGVkIGRldmVsb3BtZW50IGVudmlyb25tZW50LCBpbnRyb2R1Y2VkIHdpdGggT1NYIDEwLjUgKExlb3BhcmQpLg0KKyMgVG8gY3JlYXRlIGEgZG9jdW1lbnRhdGlvbiBzZXQsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIE1ha2VmaWxlIGluIHRoZQ0KKyMgSFRNTCBvdXRwdXQgZGlyZWN0b3J5LiBSdW5uaW5nIG1ha2Ugd2lsbCBwcm9kdWNlIHRoZSBkb2NzZXQgaW4gdGhhdA0KKyMgZGlyZWN0b3J5IGFuZCBydW5uaW5nICJtYWtlIGluc3RhbGwiIHdpbGwgaW5zdGFsbCB0aGUgZG9jc2V0IGluDQorIyB+L0xpYnJhcnkvRGV2ZWxvcGVyL1NoYXJlZC9Eb2N1bWVudGF0aW9uL0RvY1NldHMgc28gdGhhdCBYY29kZSB3aWxsIGZpbmQNCisjIGl0IGF0IHN0YXJ0dXAuDQorIyBTZWUgaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vdG9vbHMvY3JlYXRpbmdkb2NzZXRzd2l0aGRveHlnZW4uaHRtbA0KKyMgZm9yIG1vcmUgaW5mb3JtYXRpb24uDQorDQorR0VORVJBVEVfRE9DU0VUICAgICAgICA9IE5PDQorDQorIyBXaGVuIEdFTkVSQVRFX0RPQ1NFVCB0YWcgaXMgc2V0IHRvIFlFUywgdGhpcyB0YWcgZGV0ZXJtaW5lcyB0aGUgbmFtZSBvZiB0aGUNCisjIGZlZWQuIEEgZG9jdW1lbnRhdGlvbiBmZWVkIHByb3ZpZGVzIGFuIHVtYnJlbGxhIHVuZGVyIHdoaWNoIG11bHRpcGxlDQorIyBkb2N1bWVudGF0aW9uIHNldHMgZnJvbSBhIHNpbmdsZSBwcm92aWRlciAoc3VjaCBhcyBhIGNvbXBhbnkgb3IgcHJvZHVjdCBzdWl0ZSkNCisjIGNhbiBiZSBncm91cGVkLg0KKw0KK0RPQ1NFVF9GRUVETkFNRSAgICAgICAgPSAiRG94eWdlbiBnZW5lcmF0ZWQgZG9jcyINCisNCisjIFdoZW4gR0VORVJBVEVfRE9DU0VUIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGlzIHRhZyBzcGVjaWZpZXMgYSBzdHJpbmcgdGhhdA0KKyMgc2hvdWxkIHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSBkb2N1bWVudGF0aW9uIHNldCBidW5kbGUuIFRoaXMgc2hvdWxkIGJlIGENCisjIHJldmVyc2UgZG9tYWluLW5hbWUgc3R5bGUgc3RyaW5nLCBlLmcuIGNvbS5teWNvbXBhbnkuTXlEb2NTZXQuIERveHlnZW4NCisjIHdpbGwgYXBwZW5kIC5kb2NzZXQgdG8gdGhlIG5hbWUuDQorDQorRE9DU0VUX0JVTkRMRV9JRCAgICAgICA9IG9yZy5kb3h5Z2VuLlByb2plY3QNCisNCisjIFdoZW4gR0VORVJBVEVfUFVCTElTSEVSX0lEIHRhZyBzcGVjaWZpZXMgYSBzdHJpbmcgdGhhdCBzaG91bGQgdW5pcXVlbHkNCisjIGlkZW50aWZ5IHRoZSBkb2N1bWVudGF0aW9uIHB1Ymxpc2hlci4gVGhpcyBzaG91bGQgYmUgYSByZXZlcnNlIGRvbWFpbi1uYW1lDQorIyBzdHlsZSBzdHJpbmcsIGUuZy4gY29tLm15Y29tcGFueS5NeURvY1NldC5kb2N1bWVudGF0aW9uLg0KKw0KK0RPQ1NFVF9QVUJMSVNIRVJfSUQgICAgPSBvcmcuZG94eWdlbi5QdWJsaXNoZXINCisNCisjIFRoZSBHRU5FUkFURV9QVUJMSVNIRVJfTkFNRSB0YWcgaWRlbnRpZmllcyB0aGUgZG9jdW1lbnRhdGlvbiBwdWJsaXNoZXIuDQorDQorRE9DU0VUX1BVQkxJU0hFUl9OQU1FICA9IFB1Ymxpc2hlcg0KKw0KKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUxIRUxQIHRhZyBpcyBzZXQgdG8gWUVTLCBhZGRpdGlvbmFsIGluZGV4IGZpbGVzDQorIyB3aWxsIGJlIGdlbmVyYXRlZCB0aGF0IGNhbiBiZSB1c2VkIGFzIGlucHV0IGZvciB0b29scyBsaWtlIHRoZQ0KKyMgTWljcm9zb2Z0IEhUTUwgaGVscCB3b3Jrc2hvcCB0byBnZW5lcmF0ZSBhIGNvbXBpbGVkIEhUTUwgaGVscCBmaWxlICguY2htKQ0KKyMgb2YgdGhlIGdlbmVyYXRlZCBIVE1MIGRvY3VtZW50YXRpb24uDQorDQorR0VORVJBVEVfSFRNTEhFTFAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBDSE1fRklMRSB0YWcgY2FuDQorIyBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGUgbmFtZSBvZiB0aGUgcmVzdWx0aW5nIC5jaG0gZmlsZS4gWW91DQorIyBjYW4gYWRkIGEgcGF0aCBpbiBmcm9udCBvZiB0aGUgZmlsZSBpZiB0aGUgcmVzdWx0IHNob3VsZCBub3QgYmUNCisjIHdyaXR0ZW4gdG8gdGhlIGh0bWwgb3V0cHV0IGRpcmVjdG9yeS4NCisNCitDSE1fRklMRSAgICAgICAgICAgICAgID0NCisNCisjIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIEhIQ19MT0NBVElPTiB0YWcgY2FuDQorIyBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIChhYnNvbHV0ZSBwYXRoIGluY2x1ZGluZyBmaWxlIG5hbWUpIG9mDQorIyB0aGUgSFRNTCBoZWxwIGNvbXBpbGVyIChoaGMuZXhlKS4gSWYgbm9uLWVtcHR5IGRveHlnZW4gd2lsbCB0cnkgdG8gcnVuDQorIyB0aGUgSFRNTCBoZWxwIGNvbXBpbGVyIG9uIHRoZSBnZW5lcmF0ZWQgaW5kZXguaGhwLg0KKw0KK0hIQ19MT0NBVElPTiAgICAgICAgICAgPQ0KKw0KKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUxIRUxQIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgR0VORVJBVEVfQ0hJIGZsYWcNCisjIGNvbnRyb2xzIGlmIGEgc2VwYXJhdGUgLmNoaSBpbmRleCBmaWxlIGlzIGdlbmVyYXRlZCAoWUVTKSBvciB0aGF0DQorIyBpdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIG1hc3RlciAuY2htIGZpbGUgKE5PKS4NCisNCitHRU5FUkFURV9DSEkgICAgICAgICAgID0gTk8NCisNCisjIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIENITV9JTkRFWF9FTkNPRElORw0KKyMgaXMgdXNlZCB0byBlbmNvZGUgSHRtbEhlbHAgaW5kZXggKGhoayksIGNvbnRlbnQgKGhoYykgYW5kIHByb2plY3QgZmlsZQ0KKyMgY29udGVudC4NCisNCitDSE1fSU5ERVhfRU5DT0RJTkcgICAgID0NCisNCisjIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIEJJTkFSWV9UT0MgZmxhZw0KKyMgY29udHJvbHMgd2hldGhlciBhIGJpbmFyeSB0YWJsZSBvZiBjb250ZW50cyBpcyBnZW5lcmF0ZWQgKFlFUykgb3IgYQ0KKyMgbm9ybWFsIHRhYmxlIG9mIGNvbnRlbnRzIChOTykgaW4gdGhlIC5jaG0gZmlsZS4NCisNCitCSU5BUllfVE9DICAgICAgICAgICAgID0gTk8NCisNCisjIFRoZSBUT0NfRVhQQU5EIGZsYWcgY2FuIGJlIHNldCB0byBZRVMgdG8gYWRkIGV4dHJhIGl0ZW1zIGZvciBncm91cCBtZW1iZXJzDQorIyB0byB0aGUgY29udGVudHMgb2YgdGhlIEhUTUwgaGVscCBkb2N1bWVudGF0aW9uIGFuZCB0byB0aGUgdHJlZSB2aWV3Lg0KKw0KK1RPQ19FWFBBTkQgICAgICAgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIEdFTkVSQVRFX1FIUCB0YWcgaXMgc2V0IHRvIFlFUyBhbmQgYm90aCBRSFBfTkFNRVNQQUNFIGFuZA0KKyMgUUhQX1ZJUlRVQUxfRk9MREVSIGFyZSBzZXQsIGFuIGFkZGl0aW9uYWwgaW5kZXggZmlsZSB3aWxsIGJlIGdlbmVyYXRlZA0KKyMgdGhhdCBjYW4gYmUgdXNlZCBhcyBpbnB1dCBmb3IgUXQncyBxaGVscGdlbmVyYXRvciB0byBnZW5lcmF0ZSBhDQorIyBRdCBDb21wcmVzc2VkIEhlbHAgKC5xY2gpIG9mIHRoZSBnZW5lcmF0ZWQgSFRNTCBkb2N1bWVudGF0aW9uLg0KKw0KK0dFTkVSQVRFX1FIUCAgICAgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIFFIR19MT0NBVElPTiB0YWcgaXMgc3BlY2lmaWVkLCB0aGUgUUNIX0ZJTEUgdGFnIGNhbg0KKyMgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlIG5hbWUgb2YgdGhlIHJlc3VsdGluZyAucWNoIGZpbGUuDQorIyBUaGUgcGF0aCBzcGVjaWZpZWQgaXMgcmVsYXRpdmUgdG8gdGhlIEhUTUwgb3V0cHV0IGZvbGRlci4NCisNCitRQ0hfRklMRSAgICAgICAgICAgICAgID0NCisNCisjIFRoZSBRSFBfTkFNRVNQQUNFIHRhZyBzcGVjaWZpZXMgdGhlIG5hbWVzcGFjZSB0byB1c2Ugd2hlbiBnZW5lcmF0aW5nDQorIyBRdCBIZWxwIFByb2plY3Qgb3V0cHV0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlDQorIyBodHRwOi8vZG9jLnRyb2xsdGVjaC5jb20vcXRoZWxwcHJvamVjdC5odG1sI25hbWVzcGFjZQ0KKw0KK1FIUF9OQU1FU1BBQ0UgICAgICAgICAgPSBvcmcuZG94eWdlbi5Qcm9qZWN0DQorDQorIyBUaGUgUUhQX1ZJUlRVQUxfRk9MREVSIHRhZyBzcGVjaWZpZXMgdGhlIG5hbWVzcGFjZSB0byB1c2Ugd2hlbiBnZW5lcmF0aW5nDQorIyBRdCBIZWxwIFByb2plY3Qgb3V0cHV0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlDQorIyBodHRwOi8vZG9jLnRyb2xsdGVjaC5jb20vcXRoZWxwcHJvamVjdC5odG1sI3ZpcnR1YWwtZm9sZGVycw0KKw0KK1FIUF9WSVJUVUFMX0ZPTERFUiAgICAgPSBkb2MNCisNCisjIElmIFFIUF9DVVNUX0ZJTFRFUl9OQU1FIGlzIHNldCwgaXQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgY3VzdG9tIGZpbHRlciB0bw0KKyMgYWRkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlDQorIyBodHRwOi8vZG9jLnRyb2xsdGVjaC5jb20vcXRoZWxwcHJvamVjdC5odG1sI2N1c3RvbS1maWx0ZXJzDQorDQorUUhQX0NVU1RfRklMVEVSX05BTUUgICA9DQorDQorIyBUaGUgUUhQX0NVU1RfRklMVF9BVFRSUyB0YWcgc3BlY2lmaWVzIHRoZSBsaXN0IG9mIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZQ0KKyMgY3VzdG9tIGZpbHRlciB0byBhZGQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUNCisjIDxhIGhyZWY9Imh0dHA6Ly9kb2MudHJvbGx0ZWNoLmNvbS9xdGhlbHBwcm9qZWN0Lmh0bWwjY3VzdG9tLWZpbHRlcnMiPg0KKyMgUXQgSGVscCBQcm9qZWN0IC8gQ3VzdG9tIEZpbHRlcnM8L2E+Lg0KKw0KK1FIUF9DVVNUX0ZJTFRFUl9BVFRSUyAgPQ0KKw0KKyMgVGhlIFFIUF9TRUNUX0ZJTFRFUl9BVFRSUyB0YWcgc3BlY2lmaWVzIHRoZSBsaXN0IG9mIHRoZSBhdHRyaWJ1dGVzIHRoaXMNCisjIHByb2plY3Qncw0KKyMgZmlsdGVyIHNlY3Rpb24gbWF0Y2hlcy4NCisjIDxhIGhyZWY9Imh0dHA6Ly9kb2MudHJvbGx0ZWNoLmNvbS9xdGhlbHBwcm9qZWN0Lmh0bWwjZmlsdGVyLWF0dHJpYnV0ZXMiPg0KKyMgUXQgSGVscCBQcm9qZWN0IC8gRmlsdGVyIEF0dHJpYnV0ZXM8L2E+Lg0KKw0KK1FIUF9TRUNUX0ZJTFRFUl9BVFRSUyAgPQ0KKw0KKyMgSWYgdGhlIEdFTkVSQVRFX1FIUCB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIFFIR19MT0NBVElPTiB0YWcgY2FuDQorIyBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIG9mIFF0J3MgcWhlbHBnZW5lcmF0b3IuDQorIyBJZiBub24tZW1wdHkgZG94eWdlbiB3aWxsIHRyeSB0byBydW4gcWhlbHBnZW5lcmF0b3Igb24gdGhlIGdlbmVyYXRlZA0KKyMgLnFocCBmaWxlLg0KKw0KK1FIR19MT0NBVElPTiAgICAgICAgICAgPQ0KKw0KKyMgSWYgdGhlIEdFTkVSQVRFX0VDTElQU0VIRUxQIHRhZyBpcyBzZXQgdG8gWUVTLCBhZGRpdGlvbmFsIGluZGV4IGZpbGVzDQorIyAgd2lsbCBiZSBnZW5lcmF0ZWQsIHdoaWNoIHRvZ2V0aGVyIHdpdGggdGhlIEhUTUwgZmlsZXMsIGZvcm0gYW4gRWNsaXBzZSBoZWxwDQorIyBwbHVnaW4uIFRvIGluc3RhbGwgdGhpcyBwbHVnaW4gYW5kIG1ha2UgaXQgYXZhaWxhYmxlIHVuZGVyIHRoZSBoZWxwIGNvbnRlbnRzDQorIyBtZW51IGluIEVjbGlwc2UsIHRoZSBjb250ZW50cyBvZiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIEhUTUwgYW5kIFhNTA0KKyMgZmlsZXMgbmVlZHMgdG8gYmUgY29waWVkIGludG8gdGhlIHBsdWdpbnMgZGlyZWN0b3J5IG9mIGVjbGlwc2UuIFRoZSBuYW1lIG9mDQorIyB0aGUgZGlyZWN0b3J5IHdpdGhpbiB0aGUgcGx1Z2lucyBkaXJlY3Rvcnkgc2hvdWxkIGJlIHRoZSBzYW1lIGFzDQorIyB0aGUgRUNMSVBTRV9ET0NfSUQgdmFsdWUuIEFmdGVyIGNvcHlpbmcgRWNsaXBzZSBuZWVkcyB0byBiZSByZXN0YXJ0ZWQgYmVmb3JlDQorIyB0aGUgaGVscCBhcHBlYXJzLg0KKw0KK0dFTkVSQVRFX0VDTElQU0VIRUxQICAgPSBOTw0KKw0KKyMgQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGVjbGlwc2UgaGVscCBwbHVnaW4uIFdoZW4gaW5zdGFsbGluZyB0aGUgcGx1Z2luDQorIyB0aGUgZGlyZWN0b3J5IG5hbWUgY29udGFpbmluZyB0aGUgSFRNTCBhbmQgWE1MIGZpbGVzIHNob3VsZCBhbHNvIGhhdmUNCisjIHRoaXMgbmFtZS4NCisNCitFQ0xJUFNFX0RPQ19JRCAgICAgICAgID0gb3JnLmRveHlnZW4uUHJvamVjdA0KKw0KKyMgVGhlIERJU0FCTEVfSU5ERVggdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSBjb25kZW5zZWQgaW5kZXggKHRhYnMpDQorIyBhdCB0b3Agb2YgZWFjaCBIVE1MIHBhZ2UuIFRoZSB2YWx1ZSBOTyAodGhlIGRlZmF1bHQpIGVuYWJsZXMgdGhlIGluZGV4IGFuZA0KKyMgdGhlIHZhbHVlIFlFUyBkaXNhYmxlcyBpdC4gU2luY2UgdGhlIHRhYnMgaGF2ZSB0aGUgc2FtZSBpbmZvcm1hdGlvbiBhcyB0aGUNCisjIG5hdmlnYXRpb24gdHJlZSB5b3UgY2FuIHNldCB0aGlzIG9wdGlvbiB0byBOTyBpZiB5b3UgYWxyZWFkeSBzZXQNCisjIEdFTkVSQVRFX1RSRUVWSUVXIHRvIFlFUy4NCisNCitESVNBQkxFX0lOREVYICAgICAgICAgID0gTk8NCisNCisjIFRoZSBHRU5FUkFURV9UUkVFVklFVyB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXRoZXIgYSB0cmVlLWxpa2UgaW5kZXgNCisjIHN0cnVjdHVyZSBzaG91bGQgYmUgZ2VuZXJhdGVkIHRvIGRpc3BsYXkgaGllcmFyY2hpY2FsIGluZm9ybWF0aW9uLg0KKyMgSWYgdGhlIHRhZyB2YWx1ZSBpcyBzZXQgdG8gWUVTLCBhIHNpZGUgcGFuZWwgd2lsbCBiZSBnZW5lcmF0ZWQNCisjIGNvbnRhaW5pbmcgYSB0cmVlLWxpa2UgaW5kZXggc3RydWN0dXJlIChqdXN0IGxpa2UgdGhlIG9uZSB0aGF0DQorIyBpcyBnZW5lcmF0ZWQgZm9yIEhUTUwgSGVscCkuIEZvciB0aGlzIHRvIHdvcmsgYSBicm93c2VyIHRoYXQgc3VwcG9ydHMNCisjIEphdmFTY3JpcHQsIERIVE1MLCBDU1MgYW5kIGZyYW1lcyBpcyByZXF1aXJlZCAoaS5lLiBhbnkgbW9kZXJuIGJyb3dzZXIpLg0KKyMgV2luZG93cyB1c2VycyBhcmUgcHJvYmFibHkgYmV0dGVyIG9mZiB1c2luZyB0aGUgSFRNTCBoZWxwIGZlYXR1cmUuDQorIyBTaW5jZSB0aGUgdHJlZSBiYXNpY2FsbHkgaGFzIHRoZSBzYW1lIGluZm9ybWF0aW9uIGFzIHRoZSB0YWIgaW5kZXggeW91DQorIyBjb3VsZCBjb25zaWRlciB0byBzZXQgRElTQUJMRV9JTkRFWCB0byBOTyB3aGVuIGVuYWJsaW5nIHRoaXMgb3B0aW9uLg0KKw0KK0dFTkVSQVRFX1RSRUVWSUVXICAgICAgPSBOTw0KKw0KKyMgVGhlIEVOVU1fVkFMVUVTX1BFUl9MSU5FIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG51bWJlciBvZiBlbnVtIHZhbHVlcw0KKyMgKHJhbmdlIFswLDEuLjIwXSkgdGhhdCBkb3h5Z2VuIHdpbGwgZ3JvdXAgb24gb25lIGxpbmUgaW4gdGhlIGdlbmVyYXRlZCBIVE1MDQorIyBkb2N1bWVudGF0aW9uLiBOb3RlIHRoYXQgYSB2YWx1ZSBvZiAwIHdpbGwgY29tcGxldGVseSBzdXBwcmVzcyB0aGUgZW51bQ0KKyMgdmFsdWVzIGZyb20gYXBwZWFyaW5nIGluIHRoZSBvdmVydmlldyBzZWN0aW9uLg0KKw0KK0VOVU1fVkFMVUVTX1BFUl9MSU5FICAgPSA0DQorDQorIyBJZiB0aGUgdHJlZXZpZXcgaXMgZW5hYmxlZCAoc2VlIEdFTkVSQVRFX1RSRUVWSUVXKSB0aGVuIHRoaXMgdGFnIGNhbiBiZQ0KKyMgdXNlZCB0byBzZXQgdGhlIGluaXRpYWwgd2lkdGggKGluIHBpeGVscykgb2YgdGhlIGZyYW1lIGluIHdoaWNoIHRoZSB0cmVlDQorIyBpcyBzaG93bi4NCisNCitUUkVFVklFV19XSURUSCAgICAgICAgID0gMjUwDQorDQorIyBXaGVuIHRoZSBFWFRfTElOS1NfSU5fV0lORE9XIG9wdGlvbiBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBvcGVuDQorIyBsaW5rcyB0byBleHRlcm5hbCBzeW1ib2xzIGltcG9ydGVkIHZpYSB0YWcgZmlsZXMgaW4gYSBzZXBhcmF0ZSB3aW5kb3cuDQorDQorRVhUX0xJTktTX0lOX1dJTkRPVyAgICA9IE5PDQorDQorIyBVc2UgdGhpcyB0YWcgdG8gY2hhbmdlIHRoZSBmb250IHNpemUgb2YgTGF0ZXggZm9ybXVsYXMgaW5jbHVkZWQNCisjIGFzIGltYWdlcyBpbiB0aGUgSFRNTCBkb2N1bWVudGF0aW9uLiBUaGUgZGVmYXVsdCBpcyAxMC4gTm90ZSB0aGF0DQorIyB3aGVuIHlvdSBjaGFuZ2UgdGhlIGZvbnQgc2l6ZSBhZnRlciBhIHN1Y2Nlc3NmdWwgZG94eWdlbiBydW4geW91IG5lZWQNCisjIHRvIG1hbnVhbGx5IHJlbW92ZSBhbnkgZm9ybV8qLnBuZyBpbWFnZXMgZnJvbSB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5DQorIyB0byBmb3JjZSB0aGVtIHRvIGJlIHJlZ2VuZXJhdGVkLg0KKw0KK0ZPUk1VTEFfRk9OVFNJWkUgICAgICAgPSAxMA0KKw0KKyMgVXNlIHRoZSBGT1JNVUxBX1RSQU5QQVJFTlQgdGFnIHRvIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCB0aGUgaW1hZ2VzDQorIyBnZW5lcmF0ZWQgZm9yIGZvcm11bGFzIGFyZSB0cmFuc3BhcmVudCBQTkdzLiBUcmFuc3BhcmVudCBQTkdzIGFyZQ0KKyMgbm90IHN1cHBvcnRlZCBwcm9wZXJseSBmb3IgSUUgNi4wLCBidXQgYXJlIHN1cHBvcnRlZCBvbiBhbGwgbW9kZXJuIGJyb3dzZXJzLg0KKyMgTm90ZSB0aGF0IHdoZW4gY2hhbmdpbmcgdGhpcyBvcHRpb24geW91IG5lZWQgdG8gZGVsZXRlIGFueSBmb3JtXyoucG5nIGZpbGVzDQorIyBpbiB0aGUgSFRNTCBvdXRwdXQgYmVmb3JlIHRoZSBjaGFuZ2VzIGhhdmUgZWZmZWN0Lg0KKw0KK0ZPUk1VTEFfVFJBTlNQQVJFTlQgICAgPSBZRVMNCisNCisjIEVuYWJsZSB0aGUgVVNFX01BVEhKQVggb3B0aW9uIHRvIHJlbmRlciBMYVRlWCBmb3JtdWxhcyB1c2luZyBNYXRoSmF4DQorIyAoc2VlIGh0dHA6Ly93d3cubWF0aGpheC5vcmcpIHdoaWNoIHVzZXMgY2xpZW50IHNpZGUgSmF2YXNjcmlwdCBmb3IgdGhlDQorIyByZW5kZXJpbmcgaW5zdGVhZCBvZiB1c2luZyBwcmVyZW5kZXJlZCBiaXRtYXBzLiBVc2UgdGhpcyBpZiB5b3UgZG8gbm90DQorIyBoYXZlIExhVGVYIGluc3RhbGxlZCBvciBpZiB5b3Ugd2FudCB0byBmb3JtdWxhcyBsb29rIHByZXR0aWVyIGluIHRoZSBIVE1MDQorIyBvdXRwdXQuIFdoZW4gZW5hYmxlZCB5b3UgbWF5IGFsc28gbmVlZCB0byBpbnN0YWxsIE1hdGhKYXggc2VwYXJhdGVseSBhbmQNCisjIGNvbmZpZ3VyZSB0aGUgcGF0aCB0byBpdCB1c2luZyB0aGUgTUFUSEpBWF9SRUxQQVRIIG9wdGlvbi4NCisNCitVU0VfTUFUSEpBWCAgICAgICAgICAgID0gTk8NCisNCisjIFdoZW4gTWF0aEpheCBpcyBlbmFibGVkIHlvdSBuZWVkIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIHJlbGF0aXZlIHRvIHRoZQ0KKyMgSFRNTCBvdXRwdXQgZGlyZWN0b3J5IHVzaW5nIHRoZSBNQVRISkFYX1JFTFBBVEggb3B0aW9uLiBUaGUgZGVzdGluYXRpb24NCisjIGRpcmVjdG9yeSBzaG91bGQgY29udGFpbiB0aGUgTWF0aEpheC5qcyBzY3JpcHQuIEZvciBpbnN0YW5jZSwgaWYgdGhlIG1hdGhqYXgNCisjIGRpcmVjdG9yeSBpcyBsb2NhdGVkIGF0IHRoZSBzYW1lIGxldmVsIGFzIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnksIHRoZW4NCisjIE1BVEhKQVhfUkVMUEFUSCBzaG91bGQgYmUgLi4vbWF0aGpheC4gVGhlIGRlZmF1bHQgdmFsdWUgcG9pbnRzIHRvDQorIyB0aGUgTWF0aEpheCBDb250ZW50IERlbGl2ZXJ5IE5ldHdvcmsgc28geW91IGNhbiBxdWlja2x5IHNlZSB0aGUgcmVzdWx0IHdpdGhvdXQNCisjIGluc3RhbGxpbmcgTWF0aEpheC4NCisjIEhvd2V2ZXIsIGl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIGluc3RhbGwgYSBsb2NhbA0KKyMgY29weSBvZiBNYXRoSmF4IGZyb20gaHR0cDovL3d3dy5tYXRoamF4Lm9yZyBiZWZvcmUgZGVwbG95bWVudC4NCisNCitNQVRISkFYX1JFTFBBVEggICAgICAgID0gaHR0cDovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdA0KKw0KKyMgVGhlIE1BVEhKQVhfRVhURU5TSU9OUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgTWF0aEpheCBleHRlbnNpb24NCisjIG5hbWVzIHRoYXQgc2hvdWxkIGJlIGVuYWJsZWQgZHVyaW5nIE1hdGhKYXggcmVuZGVyaW5nLg0KKw0KK01BVEhKQVhfRVhURU5TSU9OUyAgICAgPQ0KKw0KKyMgV2hlbiB0aGUgU0VBUkNIRU5HSU5FIHRhZyBpcyBlbmFibGVkIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIHNlYXJjaCBib3gNCisjIGZvciB0aGUgSFRNTCBvdXRwdXQuIFRoZSB1bmRlcmx5aW5nIHNlYXJjaCBlbmdpbmUgdXNlcyBqYXZhc2NyaXB0DQorIyBhbmQgREhUTUwgYW5kIHNob3VsZCB3b3JrIG9uIGFueSBtb2Rlcm4gYnJvd3Nlci4gTm90ZSB0aGF0IHdoZW4gdXNpbmcNCisjIEhUTUwgaGVscCAoR0VORVJBVEVfSFRNTEhFTFApLCBRdCBoZWxwIChHRU5FUkFURV9RSFApLCBvciBkb2NzZXRzDQorIyAoR0VORVJBVEVfRE9DU0VUKSB0aGVyZSBpcyBhbHJlYWR5IGEgc2VhcmNoIGZ1bmN0aW9uIHNvIHRoaXMgb25lIHNob3VsZA0KKyMgdHlwaWNhbGx5IGJlIGRpc2FibGVkLiBGb3IgbGFyZ2UgcHJvamVjdHMgdGhlIGphdmFzY3JpcHQgYmFzZWQgc2VhcmNoIGVuZ2luZQ0KKyMgY2FuIGJlIHNsb3csIHRoZW4gZW5hYmxpbmcgU0VSVkVSX0JBU0VEX1NFQVJDSCBtYXkgcHJvdmlkZSBhIGJldHRlciBzb2x1dGlvbi4NCisNCitTRUFSQ0hFTkdJTkUgICAgICAgICAgID0gWUVTDQorDQorIyBXaGVuIHRoZSBTRVJWRVJfQkFTRURfU0VBUkNIIHRhZyBpcyBlbmFibGVkIHRoZSBzZWFyY2ggZW5naW5lIHdpbGwgYmUNCisjIGltcGxlbWVudGVkIHVzaW5nIGEgUEhQIGVuYWJsZWQgd2ViIHNlcnZlciBpbnN0ZWFkIG9mIGF0IHRoZSB3ZWIgY2xpZW50DQorIyB1c2luZyBKYXZhc2NyaXB0LiBEb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgdGhlIHNlYXJjaCBQSFAgc2NyaXB0IGFuZCBpbmRleA0KKyMgZmlsZSB0byBwdXQgb24gdGhlIHdlYiBzZXJ2ZXIuIFRoZSBhZHZhbnRhZ2Ugb2YgdGhlIHNlcnZlcg0KKyMgYmFzZWQgYXBwcm9hY2ggaXMgdGhhdCBpdCBzY2FsZXMgYmV0dGVyIHRvIGxhcmdlIHByb2plY3RzIGFuZCBhbGxvd3MNCisjIGZ1bGwgdGV4dCBzZWFyY2guIFRoZSBkaXNhZHZhbnRhZ2VzIGFyZSB0aGF0IGl0IGlzIG1vcmUgZGlmZmljdWx0IHRvIHNldHVwDQorIyBhbmQgZG9lcyBub3QgaGF2ZSBsaXZlIHNlYXJjaGluZyBjYXBhYmlsaXRpZXMuDQorDQorU0VSVkVSX0JBU0VEX1NFQVJDSCAgICA9IE5PDQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIExhVGVYIG91dHB1dA0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisjIElmIHRoZSBHRU5FUkFURV9MQVRFWCB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbA0KKyMgZ2VuZXJhdGUgTGF0ZXggb3V0cHV0Lg0KKw0KK0dFTkVSQVRFX0xBVEVYICAgICAgICAgPSBZRVMNCisNCisjIFRoZSBMQVRFWF9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgTGFUZVggZG9jcyB3aWxsIGJlIHB1dC4NCisjIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUNCisjIHB1dCBpbiBmcm9udCBvZiBpdC4gSWYgbGVmdCBibGFuayBgbGF0ZXgnIHdpbGwgYmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBwYXRoLg0KKw0KK0xBVEVYX09VVFBVVCAgICAgICAgICAgPQ0KKw0KKyMgVGhlIExBVEVYX0NNRF9OQU1FIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBMYVRlWCBjb21tYW5kIG5hbWUgdG8gYmUNCisjIGludm9rZWQuIElmIGxlZnQgYmxhbmsgYGxhdGV4JyB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgY29tbWFuZCBuYW1lLg0KKyMgTm90ZSB0aGF0IHdoZW4gZW5hYmxpbmcgVVNFX1BERkxBVEVYIHRoaXMgb3B0aW9uIGlzIG9ubHkgdXNlZCBmb3INCisjIGdlbmVyYXRpbmcgYml0bWFwcyBmb3IgZm9ybXVsYXMgaW4gdGhlIEhUTUwgb3V0cHV0LCBidXQgbm90IGluIHRoZQ0KKyMgTWFrZWZpbGUgdGhhdCBpcyB3cml0dGVuIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5Lg0KKw0KK0xBVEVYX0NNRF9OQU1FICAgICAgICAgPSBsYXRleA0KKw0KKyMgVGhlIE1BS0VJTkRFWF9DTURfTkFNRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgY29tbWFuZCBuYW1lIHRvDQorIyBnZW5lcmF0ZSBpbmRleCBmb3IgTGFUZVguIElmIGxlZnQgYmxhbmsgYG1ha2VpbmRleCcgd2lsbCBiZSB1c2VkIGFzIHRoZQ0KKyMgZGVmYXVsdCBjb21tYW5kIG5hbWUuDQorDQorTUFLRUlOREVYX0NNRF9OQU1FICAgICA9IG1ha2VpbmRleA0KKw0KKyMgSWYgdGhlIENPTVBBQ1RfTEFURVggdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiBnZW5lcmF0ZXMgbW9yZSBjb21wYWN0DQorIyBMYVRlWCBkb2N1bWVudHMuIFRoaXMgbWF5IGJlIHVzZWZ1bCBmb3Igc21hbGwgcHJvamVjdHMgYW5kIG1heSBoZWxwIHRvDQorIyBzYXZlIHNvbWUgdHJlZXMgaW4gZ2VuZXJhbC4NCisNCitDT01QQUNUX0xBVEVYICAgICAgICAgID0gTk8NCisNCisjIFRoZSBQQVBFUl9UWVBFIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIHBhcGVyIHR5cGUgdGhhdCBpcyB1c2VkDQorIyBieSB0aGUgcHJpbnRlci4gUG9zc2libGUgdmFsdWVzIGFyZTogYTQsIGxldHRlciwgbGVnYWwgYW5kDQorIyBleGVjdXRpdmUuIElmIGxlZnQgYmxhbmsgYTR3aWRlIHdpbGwgYmUgdXNlZC4NCisNCitQQVBFUl9UWVBFICAgICAgICAgICAgID0gYTR3aWRlDQorDQorIyBUaGUgRVhUUkFfUEFDS0FHRVMgdGFnIGNhbiBiZSB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIG5hbWVzIG9mIExhVGVYDQorIyBwYWNrYWdlcyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgTGFUZVggb3V0cHV0Lg0KKw0KK0VYVFJBX1BBQ0tBR0VTICAgICAgICAgPQ0KKw0KKyMgVGhlIExBVEVYX0hFQURFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHBlcnNvbmFsIExhVGVYIGhlYWRlciBmb3INCisjIHRoZSBnZW5lcmF0ZWQgbGF0ZXggZG9jdW1lbnQuIFRoZSBoZWFkZXIgc2hvdWxkIGNvbnRhaW4gZXZlcnl0aGluZyB1bnRpbA0KKyMgdGhlIGZpcnN0IGNoYXB0ZXIuIElmIGl0IGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGENCisjIHN0YW5kYXJkIGhlYWRlci4gTm90aWNlOiBvbmx5IHVzZSB0aGlzIHRhZyBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmchDQorDQorTEFURVhfSEVBREVSICAgICAgICAgICA9IGRvYy9kb3h5Z2VuL2hlYWRlci50ZXgNCisNCisjIFRoZSBMQVRFWF9GT09URVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwZXJzb25hbCBMYVRlWCBmb290ZXIgZm9yDQorIyB0aGUgZ2VuZXJhdGVkIGxhdGV4IGRvY3VtZW50LiBUaGUgZm9vdGVyIHNob3VsZCBjb250YWluIGV2ZXJ5dGhpbmcgYWZ0ZXINCisjIHRoZSBsYXN0IGNoYXB0ZXIuIElmIGl0IGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGENCisjIHN0YW5kYXJkIGZvb3Rlci4gTm90aWNlOiBvbmx5IHVzZSB0aGlzIHRhZyBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmchDQorDQorTEFURVhfRk9PVEVSICAgICAgICAgICA9DQorDQorIyBJZiB0aGUgUERGX0hZUEVSTElOS1MgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBMYVRlWCB0aGF0IGlzIGdlbmVyYXRlZA0KKyMgaXMgcHJlcGFyZWQgZm9yIGNvbnZlcnNpb24gdG8gcGRmICh1c2luZyBwczJwZGYpLiBUaGUgcGRmIGZpbGUgd2lsbA0KKyMgY29udGFpbiBsaW5rcyAoanVzdCBsaWtlIHRoZSBIVE1MIG91dHB1dCkgaW5zdGVhZCBvZiBwYWdlIHJlZmVyZW5jZXMNCisjIFRoaXMgbWFrZXMgdGhlIG91dHB1dCBzdWl0YWJsZSBmb3Igb25saW5lIGJyb3dzaW5nIHVzaW5nIGEgcGRmIHZpZXdlci4NCisNCitQREZfSFlQRVJMSU5LUyAgICAgICAgID0gWUVTDQorDQorIyBJZiB0aGUgVVNFX1BERkxBVEVYIHRhZyBpcyBzZXQgdG8gWUVTLCBwZGZsYXRleCB3aWxsIGJlIHVzZWQgaW5zdGVhZCBvZg0KKyMgcGxhaW4gbGF0ZXggaW4gdGhlIGdlbmVyYXRlZCBNYWtlZmlsZS4gU2V0IHRoaXMgb3B0aW9uIHRvIFlFUyB0byBnZXQgYQ0KKyMgaGlnaGVyIHF1YWxpdHkgUERGIGRvY3VtZW50YXRpb24uDQorDQorVVNFX1BERkxBVEVYICAgICAgICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIExBVEVYX0JBVENITU9ERSB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGFkZCB0aGUgXFxiYXRjaG1vZGUuDQorIyBjb21tYW5kIHRvIHRoZSBnZW5lcmF0ZWQgTGFUZVggZmlsZXMuIFRoaXMgd2lsbCBpbnN0cnVjdCBMYVRlWCB0byBrZWVwDQorIyBydW5uaW5nIGlmIGVycm9ycyBvY2N1ciwgaW5zdGVhZCBvZiBhc2tpbmcgdGhlIHVzZXIgZm9yIGhlbHAuDQorIyBUaGlzIG9wdGlvbiBpcyBhbHNvIHVzZWQgd2hlbiBnZW5lcmF0aW5nIGZvcm11bGFzIGluIEhUTUwuDQorDQorTEFURVhfQkFUQ0hNT0RFICAgICAgICA9IE5PDQorDQorIyBJZiBMQVRFWF9ISURFX0lORElDRVMgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBub3QNCisjIGluY2x1ZGUgdGhlIGluZGV4IGNoYXB0ZXJzIChzdWNoIGFzIEZpbGUgSW5kZXgsIENvbXBvdW5kIEluZGV4LCBldGMuKQ0KKyMgaW4gdGhlIG91dHB1dC4NCisNCitMQVRFWF9ISURFX0lORElDRVMgICAgID0gTk8NCisNCisjIElmIExBVEVYX1NPVVJDRV9DT0RFIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgaW5jbHVkZQ0KKyMgc291cmNlIGNvZGUgd2l0aCBzeW50YXggaGlnaGxpZ2h0aW5nIGluIHRoZSBMYVRlWCBvdXRwdXQuDQorIyBOb3RlIHRoYXQgd2hpY2ggc291cmNlcyBhcmUgc2hvd24gYWxzbyBkZXBlbmRzIG9uIG90aGVyIHNldHRpbmdzDQorIyBzdWNoIGFzIFNPVVJDRV9CUk9XU0VSLg0KKw0KK0xBVEVYX1NPVVJDRV9DT0RFICAgICAgPSBOTw0KKw0KKyMgVGhlIExBVEVYX0JJQl9TVFlMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgc3R5bGUgdG8gdXNlIGZvciB0aGUNCisjIGJpYmxpb2dyYXBoeSwgZS5nLiBwbGFpbm5hdCwgb3IgaWVlZXRyLiBUaGUgZGVmYXVsdCBzdHlsZSBpcyAicGxhaW4iLiBTZWUNCisjIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmliVGVYIGZvciBtb3JlIGluZm8uDQorDQorTEFURVhfQklCX1NUWUxFICAgICAgICA9IHBsYWluDQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIFJURiBvdXRwdXQNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorIyBJZiB0aGUgR0VORVJBVEVfUlRGIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gd2lsbCBnZW5lcmF0ZSBSVEYgb3V0cHV0DQorIyBUaGUgUlRGIG91dHB1dCBpcyBvcHRpbWl6ZWQgZm9yIFdvcmQgOTcgYW5kIG1heSBub3QgbG9vayB2ZXJ5IHByZXR0eSB3aXRoDQorIyBvdGhlciBSVEYgcmVhZGVycyBvciBlZGl0b3JzLg0KKw0KK0dFTkVSQVRFX1JURiAgICAgICAgICAgPSBOTw0KKw0KKyMgVGhlIFJURl9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgUlRGIGRvY3Mgd2lsbCBiZSBwdXQuDQorIyBJZiBhIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlDQorIyBwdXQgaW4gZnJvbnQgb2YgaXQuIElmIGxlZnQgYmxhbmsgYHJ0Zicgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHBhdGguDQorDQorUlRGX09VVFBVVCAgICAgICAgICAgICA9DQorDQorIyBJZiB0aGUgQ09NUEFDVF9SVEYgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiBnZW5lcmF0ZXMgbW9yZSBjb21wYWN0DQorIyBSVEYgZG9jdW1lbnRzLiBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIHNtYWxsIHByb2plY3RzIGFuZCBtYXkgaGVscCB0bw0KKyMgc2F2ZSBzb21lIHRyZWVzIGluIGdlbmVyYWwuDQorDQorQ09NUEFDVF9SVEYgICAgICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgUlRGX0hZUEVSTElOS1MgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBSVEYgdGhhdCBpcyBnZW5lcmF0ZWQNCisjIHdpbGwgY29udGFpbiBoeXBlcmxpbmsgZmllbGRzLiBUaGUgUlRGIGZpbGUgd2lsbA0KKyMgY29udGFpbiBsaW5rcyAoanVzdCBsaWtlIHRoZSBIVE1MIG91dHB1dCkgaW5zdGVhZCBvZiBwYWdlIHJlZmVyZW5jZXMuDQorIyBUaGlzIG1ha2VzIHRoZSBvdXRwdXQgc3VpdGFibGUgZm9yIG9ubGluZSBicm93c2luZyB1c2luZyBXT1JEIG9yIG90aGVyDQorIyBwcm9ncmFtcyB3aGljaCBzdXBwb3J0IHRob3NlIGZpZWxkcy4NCisjIE5vdGU6IHdvcmRwYWQgKHdyaXRlKSBhbmQgb3RoZXJzIGRvIG5vdCBzdXBwb3J0IGxpbmtzLg0KKw0KK1JURl9IWVBFUkxJTktTICAgICAgICAgPSBOTw0KKw0KKyMgTG9hZCBzdHlsZSBzaGVldCBkZWZpbml0aW9ucyBmcm9tIGZpbGUuIFN5bnRheCBpcyBzaW1pbGFyIHRvIGRveHlnZW4ncw0KKyMgY29uZmlnIGZpbGUsIGkuZS4gYSBzZXJpZXMgb2YgYXNzaWdubWVudHMuIFlvdSBvbmx5IGhhdmUgdG8gcHJvdmlkZQ0KKyMgcmVwbGFjZW1lbnRzLCBtaXNzaW5nIGRlZmluaXRpb25zIGFyZSBzZXQgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZS4NCisNCitSVEZfU1RZTEVTSEVFVF9GSUxFICAgID0NCisNCisjIFNldCBvcHRpb25hbCB2YXJpYWJsZXMgdXNlZCBpbiB0aGUgZ2VuZXJhdGlvbiBvZiBhbiBydGYgZG9jdW1lbnQuDQorIyBTeW50YXggaXMgc2ltaWxhciB0byBkb3h5Z2VuJ3MgY29uZmlnIGZpbGUuDQorDQorUlRGX0VYVEVOU0lPTlNfRklMRSAgICA9DQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIG1hbiBwYWdlIG91dHB1dA0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisjIElmIHRoZSBHRU5FUkFURV9NQU4gdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwNCisjIGdlbmVyYXRlIG1hbiBwYWdlcw0KKw0KK0dFTkVSQVRFX01BTiAgICAgICAgICAgPSBOTw0KKw0KKyMgVGhlIE1BTl9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgbWFuIHBhZ2VzIHdpbGwgYmUgcHV0Lg0KKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZQ0KKyMgcHV0IGluIGZyb250IG9mIGl0LiBJZiBsZWZ0IGJsYW5rIGBtYW4nIHdpbGwgYmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBwYXRoLg0KKw0KK01BTl9PVVRQVVQgICAgICAgICAgICAgPQ0KKw0KKyMgVGhlIE1BTl9FWFRFTlNJT04gdGFnIGRldGVybWluZXMgdGhlIGV4dGVuc2lvbiB0aGF0IGlzIGFkZGVkIHRvDQorIyB0aGUgZ2VuZXJhdGVkIG1hbiBwYWdlcyAoZGVmYXVsdCBpcyB0aGUgc3Vicm91dGluZSdzIHNlY3Rpb24gLjMpDQorDQorTUFOX0VYVEVOU0lPTiAgICAgICAgICA9DQorDQorIyBJZiB0aGUgTUFOX0xJTktTIHRhZyBpcyBzZXQgdG8gWUVTIGFuZCBEb3h5Z2VuIGdlbmVyYXRlcyBtYW4gb3V0cHV0LA0KKyMgdGhlbiBpdCB3aWxsIGdlbmVyYXRlIG9uZSBhZGRpdGlvbmFsIG1hbiBmaWxlIGZvciBlYWNoIGVudGl0eQ0KKyMgZG9jdW1lbnRlZCBpbiB0aGUgcmVhbCBtYW4gcGFnZShzKS4gVGhlc2UgYWRkaXRpb25hbCBmaWxlcw0KKyMgb25seSBzb3VyY2UgdGhlIHJlYWwgbWFuIHBhZ2UsIGJ1dCB3aXRob3V0IHRoZW0gdGhlIG1hbiBjb21tYW5kDQorIyB3b3VsZCBiZSB1bmFibGUgdG8gZmluZCB0aGUgY29ycmVjdCBwYWdlLiBUaGUgZGVmYXVsdCBpcyBOTy4NCisNCitNQU5fTElOS1MgICAgICAgICAgICAgID0gTk8NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgWE1MIG91dHB1dA0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisjIElmIHRoZSBHRU5FUkFURV9YTUwgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsDQorIyBnZW5lcmF0ZSBhbiBYTUwgZmlsZSB0aGF0IGNhcHR1cmVzIHRoZSBzdHJ1Y3R1cmUgb2YNCisjIHRoZSBjb2RlIGluY2x1ZGluZyBhbGwgZG9jdW1lbnRhdGlvbi4NCisNCitHRU5FUkFURV9YTUwgICAgICAgICAgID0gTk8NCisNCisjIFRoZSBYTUxfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIFhNTCBwYWdlcyB3aWxsIGJlIHB1dC4NCisjIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUNCisjIHB1dCBpbiBmcm9udCBvZiBpdC4gSWYgbGVmdCBibGFuayBgeG1sJyB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgcGF0aC4NCisNCitYTUxfT1VUUFVUICAgICAgICAgICAgID0geG1sDQorDQorIyBUaGUgWE1MX1NDSEVNQSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhbiBYTUwgc2NoZW1hLA0KKyMgd2hpY2ggY2FuIGJlIHVzZWQgYnkgYSB2YWxpZGF0aW5nIFhNTCBwYXJzZXIgdG8gY2hlY2sgdGhlDQorIyBzeW50YXggb2YgdGhlIFhNTCBmaWxlcy4NCisNCitYTUxfU0NIRU1BICAgICAgICAgICAgID0NCisNCisjIFRoZSBYTUxfRFREIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGFuIFhNTCBEVEQsDQorIyB3aGljaCBjYW4gYmUgdXNlZCBieSBhIHZhbGlkYXRpbmcgWE1MIHBhcnNlciB0byBjaGVjayB0aGUNCisjIHN5bnRheCBvZiB0aGUgWE1MIGZpbGVzLg0KKw0KK1hNTF9EVEQgICAgICAgICAgICAgICAgPQ0KKw0KKyMgSWYgdGhlIFhNTF9QUk9HUkFNTElTVElORyB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwNCisjIGR1bXAgdGhlIHByb2dyYW0gbGlzdGluZ3MgKGluY2x1ZGluZyBzeW50YXggaGlnaGxpZ2h0aW5nDQorIyBhbmQgY3Jvc3MtcmVmZXJlbmNpbmcgaW5mb3JtYXRpb24pIHRvIHRoZSBYTUwgb3V0cHV0LiBOb3RlIHRoYXQNCisjIGVuYWJsaW5nIHRoaXMgd2lsbCBzaWduaWZpY2FudGx5IGluY3JlYXNlIHRoZSBzaXplIG9mIHRoZSBYTUwgb3V0cHV0Lg0KKw0KK1hNTF9QUk9HUkFNTElTVElORyAgICAgPSBZRVMNCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBBdXRvR2VuIERlZmluaXRpb25zIG91dHB1dA0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisjIElmIHRoZSBHRU5FUkFURV9BVVRPR0VOX0RFRiB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwNCisjIGdlbmVyYXRlIGFuIEF1dG9HZW4gRGVmaW5pdGlvbnMgKHNlZSBhdXRvZ2VuLnNmLm5ldCkgZmlsZQ0KKyMgdGhhdCBjYXB0dXJlcyB0aGUgc3RydWN0dXJlIG9mIHRoZSBjb2RlIGluY2x1ZGluZyBhbGwNCisjIGRvY3VtZW50YXRpb24uIE5vdGUgdGhhdCB0aGlzIGZlYXR1cmUgaXMgc3RpbGwgZXhwZXJpbWVudGFsDQorIyBhbmQgaW5jb21wbGV0ZSBhdCB0aGUgbW9tZW50Lg0KKw0KK0dFTkVSQVRFX0FVVE9HRU5fREVGICAgPSBOTw0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorIyBJZiB0aGUgR0VORVJBVEVfUEVSTE1PRCB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwNCisjIGdlbmVyYXRlIGEgUGVybCBtb2R1bGUgZmlsZSB0aGF0IGNhcHR1cmVzIHRoZSBzdHJ1Y3R1cmUgb2YNCisjIHRoZSBjb2RlIGluY2x1ZGluZyBhbGwgZG9jdW1lbnRhdGlvbi4gTm90ZSB0aGF0IHRoaXMNCisjIGZlYXR1cmUgaXMgc3RpbGwgZXhwZXJpbWVudGFsIGFuZCBpbmNvbXBsZXRlIGF0IHRoZQ0KKyMgbW9tZW50Lg0KKw0KK0dFTkVSQVRFX1BFUkxNT0QgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIFBFUkxNT0RfTEFURVggdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsIGdlbmVyYXRlDQorIyB0aGUgbmVjZXNzYXJ5IE1ha2VmaWxlIHJ1bGVzLCBQZXJsIHNjcmlwdHMgYW5kIExhVGVYIGNvZGUgdG8gYmUgYWJsZQ0KKyMgdG8gZ2VuZXJhdGUgUERGIGFuZCBEVkkgb3V0cHV0IGZyb20gdGhlIFBlcmwgbW9kdWxlIG91dHB1dC4NCisNCitQRVJMTU9EX0xBVEVYICAgICAgICAgID0gTk8NCisNCisjIElmIHRoZSBQRVJMTU9EX1BSRVRUWSB0YWcgaXMgc2V0IHRvIFlFUyB0aGUgUGVybCBtb2R1bGUgb3V0cHV0IHdpbGwgYmUNCisjIG5pY2VseSBmb3JtYXR0ZWQgc28gaXQgY2FuIGJlIHBhcnNlZCBieSBhIGh1bWFuIHJlYWRlci4NCisjIFRoaXMgaXMgdXNlZnVsDQorIyBpZiB5b3Ugd2FudCB0byB1bmRlcnN0YW5kIHdoYXQgaXMgZ29pbmcgb24uDQorIyBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgdGhpcw0KKyMgdGFnIGlzIHNldCB0byBOTyB0aGUgc2l6ZSBvZiB0aGUgUGVybCBtb2R1bGUgb3V0cHV0IHdpbGwgYmUgbXVjaCBzbWFsbGVyDQorIyBhbmQgUGVybCB3aWxsIHBhcnNlIGl0IGp1c3QgdGhlIHNhbWUuDQorDQorUEVSTE1PRF9QUkVUVFkgICAgICAgICA9IFlFUw0KKw0KKyMgVGhlIG5hbWVzIG9mIHRoZSBtYWtlIHZhcmlhYmxlcyBpbiB0aGUgZ2VuZXJhdGVkIGRveHlydWxlcy5tYWtlIGZpbGUNCisjIGFyZSBwcmVmaXhlZCB3aXRoIHRoZSBzdHJpbmcgY29udGFpbmVkIGluIFBFUkxNT0RfTUFLRVZBUl9QUkVGSVguDQorIyBUaGlzIGlzIHVzZWZ1bCBzbyBkaWZmZXJlbnQgZG94eXJ1bGVzLm1ha2UgZmlsZXMgaW5jbHVkZWQgYnkgdGhlIHNhbWUNCisjIE1ha2VmaWxlIGRvbid0IG92ZXJ3cml0ZSBlYWNoIG90aGVyJ3MgdmFyaWFibGVzLg0KKw0KK1BFUkxNT0RfTUFLRVZBUl9QUkVGSVggPQ0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBwcmVwcm9jZXNzb3INCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorIyBJZiB0aGUgRU5BQkxFX1BSRVBST0NFU1NJTkcgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwNCisjIGV2YWx1YXRlIGFsbCBDLXByZXByb2Nlc3NvciBkaXJlY3RpdmVzIGZvdW5kIGluIHRoZSBzb3VyY2VzIGFuZCBpbmNsdWRlDQorIyBmaWxlcy4NCisNCitFTkFCTEVfUFJFUFJPQ0VTU0lORyAgID0gWUVTDQorDQorIyBJZiB0aGUgTUFDUk9fRVhQQU5TSU9OIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gd2lsbCBleHBhbmQgYWxsIG1hY3JvDQorIyBuYW1lcyBpbiB0aGUgc291cmNlIGNvZGUuIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIG9ubHkgY29uZGl0aW9uYWwNCisjIGNvbXBpbGF0aW9uIHdpbGwgYmUgcGVyZm9ybWVkLiBNYWNybyBleHBhbnNpb24gY2FuIGJlIGRvbmUgaW4gYSBjb250cm9sbGVkDQorIyB3YXkgYnkgc2V0dGluZyBFWFBBTkRfT05MWV9QUkVERUYgdG8gWUVTLg0KKw0KK01BQ1JPX0VYUEFOU0lPTiAgICAgICAgPSBZRVMNCisNCisjIElmIHRoZSBFWFBBTkRfT05MWV9QUkVERUYgYW5kIE1BQ1JPX0VYUEFOU0lPTiB0YWdzIGFyZSBib3RoIHNldCB0byBZRVMNCisjIHRoZW4gdGhlIG1hY3JvIGV4cGFuc2lvbiBpcyBsaW1pdGVkIHRvIHRoZSBtYWNyb3Mgc3BlY2lmaWVkIHdpdGggdGhlDQorIyBQUkVERUZJTkVEIGFuZCBFWFBBTkRfQVNfREVGSU5FRCB0YWdzLg0KKw0KK0VYUEFORF9PTkxZX1BSRURFRiAgICAgPSBZRVMNCisNCisjIElmIHRoZSBTRUFSQ0hfSU5DTFVERVMgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGUgaW5jbHVkZXMgZmlsZXMNCisjIHBvaW50ZWQgdG8gYnkgSU5DTFVERV9QQVRIIHdpbGwgYmUgc2VhcmNoZWQgd2hlbiBhICNpbmNsdWRlIGlzIGZvdW5kLg0KKw0KK1NFQVJDSF9JTkNMVURFUyAgICAgICAgPSBZRVMNCisNCisjIFRoZSBJTkNMVURFX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZGlyZWN0b3JpZXMgdGhhdA0KKyMgY29udGFpbiBpbmNsdWRlIGZpbGVzIHRoYXQgYXJlIG5vdCBpbnB1dCBmaWxlcyBidXQgc2hvdWxkIGJlIHByb2Nlc3NlZCBieQ0KKyMgdGhlIHByZXByb2Nlc3Nvci4NCisNCitJTkNMVURFX1BBVEggICAgICAgICAgID0NCisNCisjIFlvdSBjYW4gdXNlIHRoZSBJTkNMVURFX0ZJTEVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQNCisjIHBhdHRlcm5zIChsaWtlICouaCBhbmQgKi5ocHApIHRvIGZpbHRlciBvdXQgdGhlIGhlYWRlci1maWxlcyBpbiB0aGUNCisjIGRpcmVjdG9yaWVzLiBJZiBsZWZ0IGJsYW5rLCB0aGUgcGF0dGVybnMgc3BlY2lmaWVkIHdpdGggRklMRV9QQVRURVJOUyB3aWxsDQorIyBiZSB1c2VkLg0KKw0KK0lOQ0xVREVfRklMRV9QQVRURVJOUyAgPQ0KKw0KKyMgVGhlIFBSRURFRklORUQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgbWFjcm8gbmFtZXMgdGhhdA0KKyMgYXJlIGRlZmluZWQgYmVmb3JlIHRoZSBwcmVwcm9jZXNzb3IgaXMgc3RhcnRlZCAoc2ltaWxhciB0byB0aGUgLUQgb3B0aW9uIG9mDQorIyBnY2MpLiBUaGUgYXJndW1lbnQgb2YgdGhlIHRhZyBpcyBhIGxpc3Qgb2YgbWFjcm9zIG9mIHRoZSBmb3JtOiBuYW1lDQorIyBvciBuYW1lPWRlZmluaXRpb24gKG5vIHNwYWNlcykuIElmIHRoZSBkZWZpbml0aW9uIGFuZCB0aGUgPSBhcmUNCisjIG9taXR0ZWQgPTEgaXMgYXNzdW1lZC4gVG8gcHJldmVudCBhIG1hY3JvIGRlZmluaXRpb24gZnJvbSBiZWluZw0KKyMgdW5kZWZpbmVkIHZpYSAjdW5kZWYgb3IgcmVjdXJzaXZlbHkgZXhwYW5kZWQgdXNlIHRoZSA6PSBvcGVyYXRvcg0KKyMgaW5zdGVhZCBvZiB0aGUgPSBvcGVyYXRvci4NCisNCitQUkVERUZJTkVEICAgICAgICAgICAgID0gT01QXzMwX0VOQUJMRUQ9MSwgT01QXzQwX0VOQUJMRUQ9MSwgS01QX1NUQVRTX0VOQUJMRUQ9MQ0KKw0KKyMgSWYgdGhlIE1BQ1JPX0VYUEFOU0lPTiBhbmQgRVhQQU5EX09OTFlfUFJFREVGIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbg0KKyMgdGhpcyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGxpc3Qgb2YgbWFjcm8gbmFtZXMgdGhhdCBzaG91bGQgYmUgZXhwYW5kZWQuDQorIyBUaGUgbWFjcm8gZGVmaW5pdGlvbiB0aGF0IGlzIGZvdW5kIGluIHRoZSBzb3VyY2VzIHdpbGwgYmUgdXNlZC4NCisjIFVzZSB0aGUgUFJFREVGSU5FRCB0YWcgaWYgeW91IHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50IG1hY3JvIGRlZmluaXRpb24gdGhhdA0KKyMgb3ZlcnJ1bGVzIHRoZSBkZWZpbml0aW9uIGZvdW5kIGluIHRoZSBzb3VyY2UgY29kZS4NCisNCitFWFBBTkRfQVNfREVGSU5FRCAgICAgID0NCisNCisjIElmIHRoZSBTS0lQX0ZVTkNUSU9OX01BQ1JPUyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIHRoZW4NCisjIGRveHlnZW4ncyBwcmVwcm9jZXNzb3Igd2lsbCByZW1vdmUgYWxsIHJlZmVyZW5jZXMgdG8gZnVuY3Rpb24tbGlrZSBtYWNyb3MNCisjIHRoYXQgYXJlIGFsb25lIG9uIGEgbGluZSwgaGF2ZSBhbiBhbGwgdXBwZXJjYXNlIG5hbWUsIGFuZCBkbyBub3QgZW5kIHdpdGggYQ0KKyMgc2VtaWNvbG9uLCBiZWNhdXNlIHRoZXNlIHdpbGwgY29uZnVzZSB0aGUgcGFyc2VyIGlmIG5vdCByZW1vdmVkLg0KKw0KK1NLSVBfRlVOQ1RJT05fTUFDUk9TICAgPSBZRVMNCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBDb25maWd1cmF0aW9uOjphZGRpdGlvbnMgcmVsYXRlZCB0byBleHRlcm5hbCByZWZlcmVuY2VzDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKyMgVGhlIFRBR0ZJTEVTIG9wdGlvbiBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHRhZ2ZpbGVzLiBGb3IgZWFjaA0KKyMgdGFnIGZpbGUgdGhlIGxvY2F0aW9uIG9mIHRoZSBleHRlcm5hbCBkb2N1bWVudGF0aW9uIHNob3VsZCBiZSBhZGRlZC4gVGhlDQorIyBmb3JtYXQgb2YgYSB0YWcgZmlsZSB3aXRob3V0IHRoaXMgbG9jYXRpb24gaXMgYXMgZm9sbG93czoNCisjDQorIyBUQUdGSUxFUyA9IGZpbGUxIGZpbGUyIC4uLg0KKyMgQWRkaW5nIGxvY2F0aW9uIGZvciB0aGUgdGFnIGZpbGVzIGlzIGRvbmUgYXMgZm9sbG93czoNCisjDQorIyBUQUdGSUxFUyA9IGZpbGUxPWxvYzEgImZpbGUyID0gbG9jMiIgLi4uDQorIyB3aGVyZSAibG9jMSIgYW5kICJsb2MyIiBjYW4gYmUgcmVsYXRpdmUgb3IgYWJzb2x1dGUgcGF0aHMNCisjIG9yIFVSTHMuIE5vdGUgdGhhdCBlYWNoIHRhZyBmaWxlIG11c3QgaGF2ZSBhIHVuaXF1ZSBuYW1lICh3aGVyZSB0aGUgbmFtZSBkb2VzDQorIyBOT1QgaW5jbHVkZSB0aGUgcGF0aCkuIElmIGEgdGFnIGZpbGUgaXMgbm90IGxvY2F0ZWQgaW4gdGhlIGRpcmVjdG9yeSBpbiB3aGljaA0KKyMgZG94eWdlbiBpcyBydW4sIHlvdSBtdXN0IGFsc28gc3BlY2lmeSB0aGUgcGF0aCB0byB0aGUgdGFnZmlsZSBoZXJlLg0KKw0KK1RBR0ZJTEVTICAgICAgICAgICAgICAgPQ0KKw0KKyMgV2hlbiBhIGZpbGUgbmFtZSBpcyBzcGVjaWZpZWQgYWZ0ZXIgR0VORVJBVEVfVEFHRklMRSwgZG94eWdlbiB3aWxsIGNyZWF0ZQ0KKyMgYSB0YWcgZmlsZSB0aGF0IGlzIGJhc2VkIG9uIHRoZSBpbnB1dCBmaWxlcyBpdCByZWFkcy4NCisNCitHRU5FUkFURV9UQUdGSUxFICAgICAgID0NCisNCisjIElmIHRoZSBBTExFWFRFUk5BTFMgdGFnIGlzIHNldCB0byBZRVMgYWxsIGV4dGVybmFsIGNsYXNzZXMgd2lsbCBiZSBsaXN0ZWQNCisjIGluIHRoZSBjbGFzcyBpbmRleC4gSWYgc2V0IHRvIE5PIG9ubHkgdGhlIGluaGVyaXRlZCBleHRlcm5hbCBjbGFzc2VzDQorIyB3aWxsIGJlIGxpc3RlZC4NCisNCitBTExFWFRFUk5BTFMgICAgICAgICAgID0gTk8NCisNCisjIElmIHRoZSBFWFRFUk5BTF9HUk9VUFMgdGFnIGlzIHNldCB0byBZRVMgYWxsIGV4dGVybmFsIGdyb3VwcyB3aWxsIGJlIGxpc3RlZA0KKyMgaW4gdGhlIG1vZHVsZXMgaW5kZXguIElmIHNldCB0byBOTywgb25seSB0aGUgY3VycmVudCBwcm9qZWN0J3MgZ3JvdXBzIHdpbGwNCisjIGJlIGxpc3RlZC4NCisNCitFWFRFUk5BTF9HUk9VUFMgICAgICAgID0gWUVTDQorDQorIyBUaGUgUEVSTF9QQVRIIHNob3VsZCBiZSB0aGUgYWJzb2x1dGUgcGF0aCBhbmQgbmFtZSBvZiB0aGUgcGVybCBzY3JpcHQNCisjIGludGVycHJldGVyIChpLmUuIHRoZSByZXN1bHQgb2YgYHdoaWNoIHBlcmwnKS4NCisNCitQRVJMX1BBVEggICAgICAgICAgICAgID0NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgZG90IHRvb2wNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorIyBJZiB0aGUgQ0xBU1NfRElBR1JBTVMgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwNCisjIGdlbmVyYXRlIGEgaW5oZXJpdGFuY2UgZGlhZ3JhbSAoaW4gSFRNTCwgUlRGIGFuZCBMYVRlWCkgZm9yIGNsYXNzZXMgd2l0aCBiYXNlDQorIyBvciBzdXBlciBjbGFzc2VzLiBTZXR0aW5nIHRoZSB0YWcgdG8gTk8gdHVybnMgdGhlIGRpYWdyYW1zIG9mZi4gTm90ZSB0aGF0DQorIyB0aGlzIG9wdGlvbiBhbHNvIHdvcmtzIHdpdGggSEFWRV9ET1QgZGlzYWJsZWQsIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0bw0KKyMgaW5zdGFsbCBhbmQgdXNlIGRvdCwgc2luY2UgaXQgeWllbGRzIG1vcmUgcG93ZXJmdWwgZ3JhcGhzLg0KKw0KK0NMQVNTX0RJQUdSQU1TICAgICAgICAgPSBZRVMNCisNCisjIFlvdSBjYW4gZGVmaW5lIG1lc3NhZ2Ugc2VxdWVuY2UgY2hhcnRzIHdpdGhpbiBkb3h5Z2VuIGNvbW1lbnRzIHVzaW5nIHRoZSBcbXNjDQorIyBjb21tYW5kLiBEb3h5Z2VuIHdpbGwgdGhlbiBydW4gdGhlIG1zY2dlbiB0b29sIChzZWUNCisjIGh0dHA6Ly93d3cubWN0ZXJuYW4ubWUudWsvbXNjZ2VuLykgdG8gcHJvZHVjZSB0aGUgY2hhcnQgYW5kIGluc2VydCBpdCBpbiB0aGUNCisjIGRvY3VtZW50YXRpb24uIFRoZSBNU0NHRU5fUEFUSCB0YWcgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBkaXJlY3Rvcnkgd2hlcmUNCisjIHRoZSBtc2NnZW4gdG9vbCByZXNpZGVzLiBJZiBsZWZ0IGVtcHR5IHRoZSB0b29sIGlzIGFzc3VtZWQgdG8gYmUgZm91bmQgaW4gdGhlDQorIyBkZWZhdWx0IHNlYXJjaCBwYXRoLg0KKw0KK01TQ0dFTl9QQVRIICAgICAgICAgICAgPQ0KKw0KKyMgSWYgc2V0IHRvIFlFUywgdGhlIGluaGVyaXRhbmNlIGFuZCBjb2xsYWJvcmF0aW9uIGdyYXBocyB3aWxsIGhpZGUNCisjIGluaGVyaXRhbmNlIGFuZCB1c2FnZSByZWxhdGlvbnMgaWYgdGhlIHRhcmdldCBpcyB1bmRvY3VtZW50ZWQNCisjIG9yIGlzIG5vdCBhIGNsYXNzLg0KKw0KK0hJREVfVU5ET0NfUkVMQVRJT05TICAgPSBZRVMNCisNCisjIElmIHlvdSBzZXQgdGhlIEhBVkVfRE9UIHRhZyB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgYXNzdW1lIHRoZSBkb3QgdG9vbCBpcw0KKyMgYXZhaWxhYmxlIGZyb20gdGhlIHBhdGguIFRoaXMgdG9vbCBpcyBwYXJ0IG9mIEdyYXBodml6LCBhIGdyYXBoIHZpc3VhbGl6YXRpb24NCisjIHRvb2xraXQgZnJvbSBBVCZUIGFuZCBMdWNlbnQgQmVsbCBMYWJzLiBUaGUgb3RoZXIgb3B0aW9ucyBpbiB0aGlzIHNlY3Rpb24NCisjIGhhdmUgbm8gZWZmZWN0IGlmIHRoaXMgb3B0aW9uIGlzIHNldCB0byBOTyAodGhlIGRlZmF1bHQpDQorDQorSEFWRV9ET1QgICAgICAgICAgICAgICA9IE5PDQorDQorIyBUaGUgRE9UX05VTV9USFJFQURTIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGRvdCBpbnZvY2F0aW9ucyBkb3h5Z2VuIGlzDQorIyBhbGxvd2VkIHRvIHJ1biBpbiBwYXJhbGxlbC4gV2hlbiBzZXQgdG8gMCAodGhlIGRlZmF1bHQpIGRveHlnZW4gd2lsbA0KKyMgYmFzZSB0aGlzIG9uIHRoZSBudW1iZXIgb2YgcHJvY2Vzc29ycyBhdmFpbGFibGUgaW4gdGhlIHN5c3RlbS4gWW91IGNhbiBzZXQgaXQNCisjIGV4cGxpY2l0bHkgdG8gYSB2YWx1ZSBsYXJnZXIgdGhhbiAwIHRvIGdldCBjb250cm9sIG92ZXIgdGhlIGJhbGFuY2UNCisjIGJldHdlZW4gQ1BVIGxvYWQgYW5kIHByb2Nlc3Npbmcgc3BlZWQuDQorDQorRE9UX05VTV9USFJFQURTICAgICAgICA9IDANCisNCisjIEJ5IGRlZmF1bHQgZG94eWdlbiB3aWxsIHVzZSB0aGUgSGVsdmV0aWNhIGZvbnQgZm9yIGFsbCBkb3QgZmlsZXMgdGhhdA0KKyMgZG94eWdlbiBnZW5lcmF0ZXMuIFdoZW4geW91IHdhbnQgYSBkaWZmZXJlbnRseSBsb29raW5nIGZvbnQgeW91IGNhbiBzcGVjaWZ5DQorIyB0aGUgZm9udCBuYW1lIHVzaW5nIERPVF9GT05UTkFNRS4gWW91IG5lZWQgdG8gbWFrZSBzdXJlIGRvdCBpcyBhYmxlIHRvIGZpbmQNCisjIHRoZSBmb250LCB3aGljaCBjYW4gYmUgZG9uZSBieSBwdXR0aW5nIGl0IGluIGEgc3RhbmRhcmQgbG9jYXRpb24gb3IgYnkgc2V0dGluZw0KKyMgdGhlIERPVEZPTlRQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlIG9yIGJ5IHNldHRpbmcgRE9UX0ZPTlRQQVRIIHRvIHRoZQ0KKyMgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGZvbnQuDQorDQorRE9UX0ZPTlROQU1FICAgICAgICAgICA9IEhlbHZldGljYQ0KKw0KKyMgVGhlIERPVF9GT05UU0laRSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBzaXplIG9mIHRoZSBmb250IG9mIGRvdCBncmFwaHMuDQorIyBUaGUgZGVmYXVsdCBzaXplIGlzIDEwcHQuDQorDQorRE9UX0ZPTlRTSVpFICAgICAgICAgICA9IDEwDQorDQorIyBCeSBkZWZhdWx0IGRveHlnZW4gd2lsbCB0ZWxsIGRvdCB0byB1c2UgdGhlIEhlbHZldGljYSBmb250Lg0KKyMgSWYgeW91IHNwZWNpZnkgYSBkaWZmZXJlbnQgZm9udCB1c2luZyBET1RfRk9OVE5BTUUgeW91IGNhbiB1c2UgRE9UX0ZPTlRQQVRIIHRvDQorIyBzZXQgdGhlIHBhdGggd2hlcmUgZG90IGNhbiBmaW5kIGl0Lg0KKw0KK0RPVF9GT05UUEFUSCAgICAgICAgICAgPQ0KKw0KKyMgSWYgdGhlIENMQVNTX0dSQVBIIGFuZCBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbg0KKyMgd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvciBlYWNoIGRvY3VtZW50ZWQgY2xhc3Mgc2hvd2luZyB0aGUgZGlyZWN0IGFuZA0KKyMgaW5kaXJlY3QgaW5oZXJpdGFuY2UgcmVsYXRpb25zLiBTZXR0aW5nIHRoaXMgdGFnIHRvIFlFUyB3aWxsIGZvcmNlIHRoZQ0KKyMgQ0xBU1NfRElBR1JBTVMgdGFnIHRvIE5PLg0KKw0KK0NMQVNTX0dSQVBIICAgICAgICAgICAgPSBZRVMNCisNCisjIElmIHRoZSBDT0xMQUJPUkFUSU9OX0dSQVBIIGFuZCBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbg0KKyMgd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvciBlYWNoIGRvY3VtZW50ZWQgY2xhc3Mgc2hvd2luZyB0aGUgZGlyZWN0IGFuZA0KKyMgaW5kaXJlY3QgaW1wbGVtZW50YXRpb24gZGVwZW5kZW5jaWVzIChpbmhlcml0YW5jZSwgY29udGFpbm1lbnQsIGFuZA0KKyMgY2xhc3MgcmVmZXJlbmNlcyB2YXJpYWJsZXMpIG9mIHRoZSBjbGFzcyB3aXRoIG90aGVyIGRvY3VtZW50ZWQgY2xhc3Nlcy4NCisNCitDT0xMQUJPUkFUSU9OX0dSQVBIICAgID0gWUVTDQorDQorIyBJZiB0aGUgR1JPVVBfR1JBUEhTIGFuZCBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbg0KKyMgd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvciBncm91cHMsIHNob3dpbmcgdGhlIGRpcmVjdCBncm91cHMgZGVwZW5kZW5jaWVzDQorDQorR1JPVVBfR1JBUEhTICAgICAgICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIFVNTF9MT09LIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBpbmhlcml0YW5jZSBhbmQNCisjIGNvbGxhYm9yYXRpb24gZGlhZ3JhbXMgaW4gYSBzdHlsZSBzaW1pbGFyIHRvIHRoZSBPTUcncyBVbmlmaWVkIE1vZGVsaW5nDQorIyBMYW5ndWFnZS4NCisNCitVTUxfTE9PSyAgICAgICAgICAgICAgID0gTk8NCisNCisjIElmIHRoZSBVTUxfTE9PSyB0YWcgaXMgZW5hYmxlZCwgdGhlIGZpZWxkcyBhbmQgbWV0aG9kcyBhcmUgc2hvd24gaW5zaWRlDQorIyB0aGUgY2xhc3Mgbm9kZS4gSWYgdGhlcmUgYXJlIG1hbnkgZmllbGRzIG9yIG1ldGhvZHMgYW5kIG1hbnkgbm9kZXMgdGhlDQorIyBncmFwaCBtYXkgYmVjb21lIHRvbyBiaWcgdG8gYmUgdXNlZnVsLiBUaGUgVU1MX0xJTUlUX05VTV9GSUVMRFMNCisjIHRocmVzaG9sZCBsaW1pdHMgdGhlIG51bWJlciBvZiBpdGVtcyBmb3IgZWFjaCB0eXBlIHRvIG1ha2UgdGhlIHNpemUgbW9yZQ0KKyMgbWFuYWdlYWJsZS4gU2V0IHRoaXMgdG8gMCBmb3Igbm8gbGltaXQuIE5vdGUgdGhhdCB0aGUgdGhyZXNob2xkIG1heSBiZQ0KKyMgZXhjZWVkZWQgYnkgNTAlIGJlZm9yZSB0aGUgbGltaXQgaXMgZW5mb3JjZWQuDQorDQorVU1MX0xJTUlUX05VTV9GSUVMRFMgICA9IDEwDQorDQorIyBJZiBzZXQgdG8gWUVTLCB0aGUgaW5oZXJpdGFuY2UgYW5kIGNvbGxhYm9yYXRpb24gZ3JhcGhzIHdpbGwgc2hvdyB0aGUNCisjIHJlbGF0aW9ucyBiZXR3ZWVuIHRlbXBsYXRlcyBhbmQgdGhlaXIgaW5zdGFuY2VzLg0KKw0KK1RFTVBMQVRFX1JFTEFUSU9OUyAgICAgPSBZRVMNCisNCisjIElmIHRoZSBFTkFCTEVfUFJFUFJPQ0VTU0lORywgU0VBUkNIX0lOQ0xVREVTLCBJTkNMVURFX0dSQVBILCBhbmQgSEFWRV9ET1QNCisjIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkDQorIyBmaWxlIHNob3dpbmcgdGhlIGRpcmVjdCBhbmQgaW5kaXJlY3QgaW5jbHVkZSBkZXBlbmRlbmNpZXMgb2YgdGhlIGZpbGUgd2l0aA0KKyMgb3RoZXIgZG9jdW1lbnRlZCBmaWxlcy4NCisNCitJTkNMVURFX0dSQVBIICAgICAgICAgID0gWUVTDQorDQorIyBJZiB0aGUgRU5BQkxFX1BSRVBST0NFU1NJTkcsIFNFQVJDSF9JTkNMVURFUywgSU5DTFVERURfQllfR1JBUEgsIGFuZA0KKyMgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvciBlYWNoDQorIyBkb2N1bWVudGVkIGhlYWRlciBmaWxlIHNob3dpbmcgdGhlIGRvY3VtZW50ZWQgZmlsZXMgdGhhdCBkaXJlY3RseSBvcg0KKyMgaW5kaXJlY3RseSBpbmNsdWRlIHRoaXMgZmlsZS4NCisNCitJTkNMVURFRF9CWV9HUkFQSCAgICAgID0gWUVTDQorDQorIyBJZiB0aGUgQ0FMTF9HUkFQSCBhbmQgSEFWRV9ET1Qgb3B0aW9ucyBhcmUgc2V0IHRvIFlFUyB0aGVuDQorIyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBjYWxsIGRlcGVuZGVuY3kgZ3JhcGggZm9yIGV2ZXJ5IGdsb2JhbCBmdW5jdGlvbg0KKyMgb3IgY2xhc3MgbWV0aG9kLiBOb3RlIHRoYXQgZW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCBzaWduaWZpY2FudGx5IGluY3JlYXNlDQorIyB0aGUgdGltZSBvZiBhIHJ1bi4gU28gaW4gbW9zdCBjYXNlcyBpdCB3aWxsIGJlIGJldHRlciB0byBlbmFibGUgY2FsbCBncmFwaHMNCisjIGZvciBzZWxlY3RlZCBmdW5jdGlvbnMgb25seSB1c2luZyB0aGUgXGNhbGxncmFwaCBjb21tYW5kLg0KKw0KK0NBTExfR1JBUEggICAgICAgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIENBTExFUl9HUkFQSCBhbmQgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuDQorIyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBjYWxsZXIgZGVwZW5kZW5jeSBncmFwaCBmb3IgZXZlcnkgZ2xvYmFsIGZ1bmN0aW9uDQorIyBvciBjbGFzcyBtZXRob2QuIE5vdGUgdGhhdCBlbmFibGluZyB0aGlzIG9wdGlvbiB3aWxsIHNpZ25pZmljYW50bHkgaW5jcmVhc2UNCisjIHRoZSB0aW1lIG9mIGEgcnVuLiBTbyBpbiBtb3N0IGNhc2VzIGl0IHdpbGwgYmUgYmV0dGVyIHRvIGVuYWJsZSBjYWxsZXINCisjIGdyYXBocyBmb3Igc2VsZWN0ZWQgZnVuY3Rpb25zIG9ubHkgdXNpbmcgdGhlIFxjYWxsZXJncmFwaCBjb21tYW5kLg0KKw0KK0NBTExFUl9HUkFQSCAgICAgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIEdSQVBISUNBTF9ISUVSQVJDSFkgYW5kIEhBVkVfRE9UIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuDQorIyB3aWxsIGdlbmVyYXRlIGEgZ3JhcGhpY2FsIGhpZXJhcmNoeSBvZiBhbGwgY2xhc3NlcyBpbnN0ZWFkIG9mIGEgdGV4dHVhbCBvbmUuDQorDQorR1JBUEhJQ0FMX0hJRVJBUkNIWSAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIERJUkVDVE9SWV9HUkFQSCBhbmQgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUw0KKyMgdGhlbiBkb3h5Z2VuIHdpbGwgc2hvdyB0aGUgZGVwZW5kZW5jaWVzIGEgZGlyZWN0b3J5IGhhcyBvbiBvdGhlciBkaXJlY3Rvcmllcw0KKyMgaW4gYSBncmFwaGljYWwgd2F5LiBUaGUgZGVwZW5kZW5jeSByZWxhdGlvbnMgYXJlIGRldGVybWluZWQgYnkgdGhlICNpbmNsdWRlDQorIyByZWxhdGlvbnMgYmV0d2VlbiB0aGUgZmlsZXMgaW4gdGhlIGRpcmVjdG9yaWVzLg0KKw0KK0RJUkVDVE9SWV9HUkFQSCAgICAgICAgPSBZRVMNCisNCisjIFRoZSBET1RfSU1BR0VfRk9STUFUIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIGltYWdlIGZvcm1hdCBvZiB0aGUgaW1hZ2VzDQorIyBnZW5lcmF0ZWQgYnkgZG90LiBQb3NzaWJsZSB2YWx1ZXMgYXJlIHN2ZywgcG5nLCBqcGcsIG9yIGdpZi4NCisjIElmIGxlZnQgYmxhbmsgcG5nIHdpbGwgYmUgdXNlZC4gSWYgeW91IGNob29zZSBzdmcgeW91IG5lZWQgdG8gc2V0DQorIyBIVE1MX0ZJTEVfRVhURU5TSU9OIHRvIHhodG1sIGluIG9yZGVyIHRvIG1ha2UgdGhlIFNWRyBmaWxlcw0KKyMgdmlzaWJsZSBpbiBJRSA5KyAob3RoZXIgYnJvd3NlcnMgZG8gbm90IGhhdmUgdGhpcyByZXF1aXJlbWVudCkuDQorDQorRE9UX0lNQUdFX0ZPUk1BVCAgICAgICA9IHBuZw0KKw0KKyMgSWYgRE9UX0lNQUdFX0ZPUk1BVCBpcyBzZXQgdG8gc3ZnLCB0aGVuIHRoaXMgb3B0aW9uIGNhbiBiZSBzZXQgdG8gWUVTIHRvDQorIyBlbmFibGUgZ2VuZXJhdGlvbiBvZiBpbnRlcmFjdGl2ZSBTVkcgaW1hZ2VzIHRoYXQgYWxsb3cgem9vbWluZyBhbmQgcGFubmluZy4NCisjIE5vdGUgdGhhdCB0aGlzIHJlcXVpcmVzIGEgbW9kZXJuIGJyb3dzZXIgb3RoZXIgdGhhbiBJbnRlcm5ldCBFeHBsb3Jlci4NCisjIFRlc3RlZCBhbmQgd29ya2luZyBhcmUgRmlyZWZveCwgQ2hyb21lLCBTYWZhcmksIGFuZCBPcGVyYS4gRm9yIElFIDkrIHlvdQ0KKyMgbmVlZCB0byBzZXQgSFRNTF9GSUxFX0VYVEVOU0lPTiB0byB4aHRtbCBpbiBvcmRlciB0byBtYWtlIHRoZSBTVkcgZmlsZXMNCisjIHZpc2libGUuIE9sZGVyIHZlcnNpb25zIG9mIElFIGRvIG5vdCBoYXZlIFNWRyBzdXBwb3J0Lg0KKw0KK0lOVEVSQUNUSVZFX1NWRyAgICAgICAgPSBOTw0KKw0KKyMgVGhlIHRhZyBET1RfUEFUSCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBwYXRoIHdoZXJlIHRoZSBkb3QgdG9vbCBjYW4gYmUNCisjIGZvdW5kLiBJZiBsZWZ0IGJsYW5rLCBpdCBpcyBhc3N1bWVkIHRoZSBkb3QgdG9vbCBjYW4gYmUgZm91bmQgaW4gdGhlIHBhdGguDQorDQorRE9UX1BBVEggICAgICAgICAgICAgICA9DQorDQorIyBUaGUgRE9URklMRV9ESVJTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQNCisjIGNvbnRhaW4gZG90IGZpbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uIChzZWUgdGhlDQorIyBcZG90ZmlsZSBjb21tYW5kKS4NCisNCitET1RGSUxFX0RJUlMgICAgICAgICAgID0NCisNCisjIFRoZSBNU0NGSUxFX0RJUlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZGlyZWN0b3JpZXMgdGhhdA0KKyMgY29udGFpbiBtc2MgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSB0aGUNCisjIFxtc2NmaWxlIGNvbW1hbmQpLg0KKw0KK01TQ0ZJTEVfRElSUyAgICAgICAgICAgPQ0KKw0KKyMgVGhlIERPVF9HUkFQSF9NQVhfTk9ERVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbWF4aW11bSBudW1iZXIgb2YNCisjIG5vZGVzIHRoYXQgd2lsbCBiZSBzaG93biBpbiB0aGUgZ3JhcGguIElmIHRoZSBudW1iZXIgb2Ygbm9kZXMgaW4gYSBncmFwaA0KKyMgYmVjb21lcyBsYXJnZXIgdGhhbiB0aGlzIHZhbHVlLCBkb3h5Z2VuIHdpbGwgdHJ1bmNhdGUgdGhlIGdyYXBoLCB3aGljaCBpcw0KKyMgdmlzdWFsaXplZCBieSByZXByZXNlbnRpbmcgYSBub2RlIGFzIGEgcmVkIGJveC4gTm90ZSB0aGF0IGRveHlnZW4gaWYgdGhlDQorIyBudW1iZXIgb2YgZGlyZWN0IGNoaWxkcmVuIG9mIHRoZSByb290IG5vZGUgaW4gYSBncmFwaCBpcyBhbHJlYWR5IGxhcmdlciB0aGFuDQorIyBET1RfR1JBUEhfTUFYX05PREVTIHRoZW4gdGhlIGdyYXBoIHdpbGwgbm90IGJlIHNob3duIGF0IGFsbC4gQWxzbyBub3RlDQorIyB0aGF0IHRoZSBzaXplIG9mIGEgZ3JhcGggY2FuIGJlIGZ1cnRoZXIgcmVzdHJpY3RlZCBieSBNQVhfRE9UX0dSQVBIX0RFUFRILg0KKw0KK0RPVF9HUkFQSF9NQVhfTk9ERVMgICAgPSA1MA0KKw0KKyMgVGhlIE1BWF9ET1RfR1JBUEhfREVQVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbWF4aW11bSBkZXB0aCBvZiB0aGUNCisjIGdyYXBocyBnZW5lcmF0ZWQgYnkgZG90LiBBIGRlcHRoIHZhbHVlIG9mIDMgbWVhbnMgdGhhdCBvbmx5IG5vZGVzIHJlYWNoYWJsZQ0KKyMgZnJvbSB0aGUgcm9vdCBieSBmb2xsb3dpbmcgYSBwYXRoIHZpYSBhdCBtb3N0IDMgZWRnZXMgd2lsbCBiZSBzaG93bi4gTm9kZXMNCisjIHRoYXQgbGF5IGZ1cnRoZXIgZnJvbSB0aGUgcm9vdCBub2RlIHdpbGwgYmUgb21pdHRlZC4gTm90ZSB0aGF0IHNldHRpbmcgdGhpcw0KKyMgb3B0aW9uIHRvIDEgb3IgMiBtYXkgZ3JlYXRseSByZWR1Y2UgdGhlIGNvbXB1dGF0aW9uIHRpbWUgbmVlZGVkIGZvciBsYXJnZQ0KKyMgY29kZSBiYXNlcy4gQWxzbyBub3RlIHRoYXQgdGhlIHNpemUgb2YgYSBncmFwaCBjYW4gYmUgZnVydGhlciByZXN0cmljdGVkIGJ5DQorIyBET1RfR1JBUEhfTUFYX05PREVTLiBVc2luZyBhIGRlcHRoIG9mIDAgbWVhbnMgbm8gZGVwdGggcmVzdHJpY3Rpb24uDQorDQorTUFYX0RPVF9HUkFQSF9ERVBUSCAgICA9IDANCisNCisjIFNldCB0aGUgRE9UX1RSQU5TUEFSRU5UIHRhZyB0byBZRVMgdG8gZ2VuZXJhdGUgaW1hZ2VzIHdpdGggYSB0cmFuc3BhcmVudA0KKyMgYmFja2dyb3VuZC4gVGhpcyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LCBiZWNhdXNlIGRvdCBvbiBXaW5kb3dzIGRvZXMgbm90DQorIyBzZWVtIHRvIHN1cHBvcnQgdGhpcyBvdXQgb2YgdGhlIGJveC4gV2FybmluZzogRGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybSB1c2VkLA0KKyMgZW5hYmxpbmcgdGhpcyBvcHRpb24gbWF5IGxlYWQgdG8gYmFkbHkgYW50aS1hbGlhc2VkIGxhYmVscyBvbiB0aGUgZWRnZXMgb2YNCisjIGEgZ3JhcGggKGkuZS4gdGhleSBiZWNvbWUgaGFyZCB0byByZWFkKS4NCisNCitET1RfVFJBTlNQQVJFTlQgICAgICAgID0gTk8NCisNCisjIFNldCB0aGUgRE9UX01VTFRJX1RBUkdFVFMgdGFnIHRvIFlFUyBhbGxvdyBkb3QgdG8gZ2VuZXJhdGUgbXVsdGlwbGUgb3V0cHV0DQorIyBmaWxlcyBpbiBvbmUgcnVuIChpLmUuIG11bHRpcGxlIC1vIGFuZCAtVCBvcHRpb25zIG9uIHRoZSBjb21tYW5kIGxpbmUpLiBUaGlzDQorIyBtYWtlcyBkb3QgcnVuIGZhc3RlciwgYnV0IHNpbmNlIG9ubHkgbmV3ZXIgdmVyc2lvbnMgb2YgZG90ICg+MS44LjEwKQ0KKyMgc3VwcG9ydCB0aGlzLCB0aGlzIGZlYXR1cmUgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4NCisNCitET1RfTVVMVElfVEFSR0VUUyAgICAgID0gTk8NCisNCisjIElmIHRoZSBHRU5FUkFURV9MRUdFTkQgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwNCisjIGdlbmVyYXRlIGEgbGVnZW5kIHBhZ2UgZXhwbGFpbmluZyB0aGUgbWVhbmluZyBvZiB0aGUgdmFyaW91cyBib3hlcyBhbmQNCisjIGFycm93cyBpbiB0aGUgZG90IGdlbmVyYXRlZCBncmFwaHMuDQorDQorR0VORVJBVEVfTEVHRU5EICAgICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIERPVF9DTEVBTlVQIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsDQorIyByZW1vdmUgdGhlIGludGVybWVkaWF0ZSBkb3QgZmlsZXMgdGhhdCBhcmUgdXNlZCB0byBnZW5lcmF0ZQ0KKyMgdGhlIHZhcmlvdXMgZ3JhcGhzLg0KKw0KK0RPVF9DTEVBTlVQICAgICAgICAgICAgPSBZRVMNCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL2RvYy9kb3h5Z2VuL2hlYWRlci50ZXggYi9maW5hbC9ydW50aW1lL2RvYy9kb3h5Z2VuL2hlYWRlci50ZXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg3NDA3NwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvZG9jL2RveHlnZW4vaGVhZGVyLnRleApAQCAtMCwwICsxLDc3IEBACislIExhdGV4IGhlYWRlciBmb3IgZG94eWdlbiAxLjguMy4xCitcZG9jdW1lbnRjbGFzc3tib29rfQorXHVzZXBhY2thZ2VbYTRwYXBlcix0b3A9Mi41Y20sYm90dG9tPTIuNWNtLGxlZnQ9Mi41Y20scmlnaHQ9Mi41Y21de2dlb21ldHJ5fQorXHVzZXBhY2thZ2V7bWFrZWlkeH0KK1x1c2VwYWNrYWdle25hdGJpYn0KK1x1c2VwYWNrYWdle2dyYXBoaWN4fQorXHVzZXBhY2thZ2V7bXVsdGljb2x9CitcdXNlcGFja2FnZXtmbG9hdH0KK1x1c2VwYWNrYWdle2xpc3RpbmdzfQorXHVzZXBhY2thZ2V7Y29sb3J9CitcdXNlcGFja2FnZXtpZnRoZW59CitcdXNlcGFja2FnZVt0YWJsZV17eGNvbG9yfQorXHVzZXBhY2thZ2V7dGV4dGNvbXB9CitcdXNlcGFja2FnZXthbGx0dH0KK1x1c2VwYWNrYWdle2lmcGRmfQorXGlmcGRmCitcdXNlcGFja2FnZVtwZGZ0ZXgsCisgICAgICAgICAgICBwYWdlYmFja3JlZj10cnVlLAorICAgICAgICAgICAgY29sb3JsaW5rcz10cnVlLAorICAgICAgICAgICAgbGlua2NvbG9yPWJsdWUsCisgICAgICAgICAgICB1bmljb2RlCisgICAgICAgICAgIF17aHlwZXJyZWZ9CitcZWxzZQorXHVzZXBhY2thZ2VbcHMycGRmLAorICAgICAgICAgICAgcGFnZWJhY2tyZWY9dHJ1ZSwKKyAgICAgICAgICAgIGNvbG9ybGlua3M9dHJ1ZSwKKyAgICAgICAgICAgIGxpbmtjb2xvcj1ibHVlLAorICAgICAgICAgICAgdW5pY29kZQorICAgICAgICAgICBde2h5cGVycmVmfQorXHVzZXBhY2thZ2V7cHNwaWN0dXJlfQorXGZpCitcdXNlcGFja2FnZVt1dGY4XXtpbnB1dGVuY30KK1x1c2VwYWNrYWdle21hdGhwdG14fQorXHVzZXBhY2thZ2Vbc2NhbGVkPS45MF17aGVsdmV0fQorXHVzZXBhY2thZ2V7Y291cmllcn0KK1x1c2VwYWNrYWdle3NlY3RzdHl9CitcdXNlcGFja2FnZXthbXNzeW1ifQorXHVzZXBhY2thZ2VbdGl0bGVzXXt0b2Nsb2Z0fQorXHVzZXBhY2thZ2V7ZG94eWdlbn0KK1xsc3RzZXR7bGFuZ3VhZ2U9QysrLGlucHV0ZW5jb2Rpbmc9dXRmOCxiYXNpY3N0eWxlPVxmb290bm90ZXNpemUsYnJlYWtsaW5lcz10cnVlLGJyZWFrYXR3aGl0ZXNwYWNlPXRydWUsdGFic2l6ZT00LG51bWJlcnM9bGVmdCB9CitcbWFrZWluZGV4Citcc2V0Y291bnRlcnt0b2NkZXB0aH17M30KK1xyZW5ld2NvbW1hbmR7XGZvb3RydWxld2lkdGh9ezAuNHB0fQorXHJlbmV3Y29tbWFuZHtcZmFtaWx5ZGVmYXVsdH17XHNmZGVmYXVsdH0KK1xoZnV6ej0xNXB0Citcc2V0bGVuZ3Roe1xlbWVyZ2VuY3lzdHJldGNofXsxNXB0fQorXGhiYWRuZXNzPTc1MAorXHRvbGVyYW5jZT03NTAKK1xiZWdpbntkb2N1bWVudH0KK1xoeXBlcnNldHVwe3BhZ2VhbmNob3I9ZmFsc2UsY2l0ZWNvbG9yPWJsdWV9CitcYmVnaW57dGl0bGVwYWdlfQorXHZzcGFjZSp7N2NtfQorXGJlZ2lue2NlbnRlcn0KK3tcTGFyZ2UgTExWTSBPcGVuTVBcdGV4dHN1cGVyc2NyaXB0eyp9IFJ1bnRpbWUgTGlicmFyeSB9XFwKK1x2c3BhY2UqezFjbX0KK3tcbGFyZ2UgR2VuZXJhdGVkIGJ5IERveHlnZW4gJGRveHlnZW52ZXJzaW9uIH1cXAorXHZzcGFjZSp7MC41Y219Cit7XHNtYWxsICRkYXRldGltZSB9XFwKK1xlbmR7Y2VudGVyfQorXGVuZHt0aXRsZXBhZ2V9CisKK3tcYmYgVHJhZGVtYXJrc30KK1RoZSBPcGVuTVAgbmFtZSBhbmQgdGhlIE9wZW5NUCBsb2dvIGFyZSByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgdGhlIE9wZW5NUCBBcmNoaXRlY3R1cmUgUmV2aWV3IEJvYXJkLgorCitJbnRlbCwgWGVvbiwgYW5kIEludGVsIFhlb24gUGhpIGFyZSB0cmFkZW1hcmtzIG9mIEludGVsIENvcnBvcmF0aW9uIGluIHRoZSBVLlMuIGFuZC9vciBvdGhlciBjb3VudHJpZXMuCisKK1RoaXMgZG9jdW1lbnQgaXMgQ29weXJpZ2h0IFx0ZXh0Y29weXJpZ2h0flx0aGVceWVhciB0aGUgTExWTSBQcm9qZWN0LiBJdCBpcworc3ViamVjdCB0byB0aGUgc2FtZSBsaWNlbnNlIHRlcm1zIGFzIHRoZSBMTFZNIE9wZW5NUCBydW50aW1lLgorIAorXHRleHRzdXBlcnNjcmlwdHsqfSBPdGhlciBuYW1lcyBhbmQgYnJhbmRzIG1heSBiZSBjbGFpbWVkIGFzIHRoZSBwcm9wZXJ0eSBvZiBvdGhlcnMuCisKK1xjbGVhcmVtcHR5ZG91YmxlcGFnZQorXHBhZ2VudW1iZXJpbmd7cm9tYW59CitcdGFibGVvZmNvbnRlbnRzCitcY2xlYXJlbXB0eWRvdWJsZXBhZ2UKK1xwYWdlbnVtYmVyaW5ne2FyYWJpY30KK1xoeXBlcnNldHVwe3BhZ2VhbmNob3I9dHJ1ZSxjaXRlY29sb3I9Ymx1ZX0KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvZG9jL2RveHlnZW4vbGlib21wX2ludGVyZmFjZS5oIGIvZmluYWwvcnVudGltZS9kb2MvZG94eWdlbi9saWJvbXBfaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUxYWU5NQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvZG9jL2RveHlnZW4vbGlib21wX2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsMzMzIEBACisvLyBUaGlzIGZpbGUgZG9lcyBub3QgY29udGFpbiBhbnkgY29kZTsgaXQganVzdCBjb250YWlucyBhZGRpdGlvbmFsIHRleHQgYW5kIGZvcm1hdHRpbmcNCisvLyBmb3IgZG94eWdlbi4NCisNCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKw0KKy8qISBAbWFpbnBhZ2UgTExWTSZuYnNwOyBPcGVuTVAqIFJ1bnRpbWUgTGlicmFyeSBJbnRlcmZhY2UNCitAc2VjdGlvbiBzZWNfaW50cm8gSW50cm9kdWN0aW9uDQorDQorVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIGludGVyZmFjZSBwcm92aWRlZCBieSB0aGUNCitMTFZNICZuYnNwO09wZW5NUFxvdGhlciBydW50aW1lIGxpYnJhcnkgdG8gdGhlIGNvbXBpbGVyLg0KK1JvdXRpbmVzIHRoYXQgYXJlIGRpcmVjdGx5IGNhbGxlZCBhcyBzaW1wbGUgZnVuY3Rpb25zIGJ5IHVzZXIgY29kZSBhcmUNCitub3QgY3VycmVudGx5IGRlc2NyaWJlZCBoZXJlLCBzaW5jZSB0aGVpciBkZWZpbml0aW9uIGlzIGluIHRoZSBPcGVuTVANCitzcGVjaWZpY2F0aW9uIGF2YWlsYWJsZSBmcm9tIGh0dHA6Ly9vcGVubXAub3JnDQorDQorVGhlIGFpbSBoZXJlIGlzIHRvIGV4cGxhaW4gdGhlIGludGVyZmFjZSBmcm9tIHRoZSBjb21waWxlciB0byB0aGUgcnVudGltZS4NCisNCitUaGUgb3ZlcmFsbCBkZXNpZ24gaXMgZGVzY3JpYmVkLCBhbmQgZWFjaCBmdW5jdGlvbiBpbiB0aGUgaW50ZXJmYWNlDQoraGFzIGl0cyBvd24gZGVzY3JpcHRpb24uIChBdCBsZWFzdCwgdGhhdCdzIHRoZSBhbWJpdGlvbiwgd2UgbWF5IG5vdCBiZSB0aGVyZSB5ZXQpLg0KKw0KK0BzZWN0aW9uIHNlY19idWlsZGluZyBRdWlja2x5IEJ1aWxkaW5nIHRoZSBSdW50aW1lDQorRm9yIHRoZSBpbXBhdGllbnQsIHdlIGNvdmVyIGJ1aWxkaW5nIHRoZSBydW50aW1lIGFzIHRoZSBmaXJzdCB0b3BpYyBoZXJlLg0KKw0KK0NNYWtlIGlzIHVzZWQgdG8gYnVpbGQgdGhlIE9wZW5NUCBydW50aW1lLiAgRm9yIGRldGFpbHMgYW5kIGEgZnVsbCBsaXN0IG9mIG9wdGlvbnMgZm9yIHRoZSBDTWFrZSBidWlsZCBzeXN0ZW0sDQorc2VlIDx0dD5CdWlsZF9XaXRoX0NNYWtlLnR4dDwvdHQ+IGluc2lkZSB0aGUgPHR0PnJ1bnRpbWUvPC90dD4gc3ViZGlyZWN0b3J5LiAgVGhlc2UNCitpbnN0cnVjdGlvbnMgd2lsbCBwcm92aWRlIHRoZSBtb3N0IHR5cGljYWwgYnVpbGQuDQorDQorSW4tTExWTS10cmVlIGJ1aWxkOi4NCitAY29kZQ0KKyQgY2Qgd2hlcmUteW91LXdhbnQtdG8tbGl2ZQ0KK0NoZWNrIG91dCBvcGVubXAgaW50byBsbHZtL3Byb2plY3RzDQorJCBjZCB3aGVyZS15b3Utd2FudC10by1idWlsZA0KKyQgbWtkaXIgYnVpbGQgJiYgY2QgYnVpbGQNCiskIGNtYWtlIHBhdGgvdG8vbGx2bSAtRENNQUtFX0NfQ09NUElMRVI9PEMgY29tcGlsZXI+IC1EQ01BS0VfQ1hYX0NPTVBJTEVSPTxDKysgY29tcGlsZXI+DQorJCBtYWtlIG9tcA0KK0BlbmRjb2RlDQorT3V0LW9mLUxMVk0tdHJlZSBidWlsZDoNCitAY29kZQ0KKyQgY2Qgd2hlcmUteW91LXdhbnQtdG8tbGl2ZQ0KK0NoZWNrIG91dCBvcGVubXANCiskIGNkIHdoZXJlLXlvdS13YW50LXRvLWxpdmUvb3Blbm1wL3J1bnRpbWUNCiskIG1rZGlyIGJ1aWxkICYmIGNkIGJ1aWxkDQorJCBjbWFrZSBwYXRoL3RvL29wZW5tcCAtRENNQUtFX0NfQ09NUElMRVI9PEMgY29tcGlsZXI+IC1EQ01BS0VfQ1hYX0NPTVBJTEVSPTxDKysgY29tcGlsZXI+DQorJCBtYWtlDQorQGVuZGNvZGUNCisNCitAc2VjdGlvbiBzZWNfc3VwcG9ydGVkIFN1cHBvcnRlZCBSVEwgQnVpbGQgQ29uZmlndXJhdGlvbnMNCisNCitUaGUgYXJjaGl0ZWN0dXJlcyBzdXBwb3J0ZWQgYXJlIElBLTMyIGFyY2hpdGVjdHVyZSwgSW50ZWwmcmVnOyZuYnNwOyA2NCwgYW5kDQorSW50ZWwmcmVnOyZuYnNwOyBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUuICBUaGUgYnVpbGQgY29uZmlndXJhdGlvbnMNCitzdXBwb3J0ZWQgYXJlIHNob3duIGluIHRoZSB0YWJsZSBiZWxvdy4NCisNCis8dGFibGUgYm9yZGVyPTE+DQorPHRyPjx0aD4gPHRoPmljYy9pY2w8dGg+Z2NjPHRoPmNsYW5nDQorPHRyPjx0ZD5MaW51eFxvdGhlciBPUzx0ZD5ZZXMoMSw1KTx0ZD5ZZXMoMiw0KTx0ZD5ZZXMoNCw2LDcpDQorPHRyPjx0ZD5GcmVlQlNEXG90aGVyPHRkPlllcygxLDUpPHRkPlllcygyLDQpPHRkPlllcyg0LDYsNyw4KQ0KKzx0cj48dGQ+T1MgWFxvdGhlcjx0ZD5ZZXMoMSwzLDQpPHRkPk5vPHRkPlllcyg0LDYsNykNCis8dHI+PHRkPldpbmRvd3Ncb3RoZXIgT1M8dGQ+WWVzKDEsNCk8dGQ+Tm88dGQ+Tm8NCis8L3RhYmxlPg0KKygxKSBPbiBJQS0zMiBhcmNoaXRlY3R1cmUgYW5kIEludGVsJnJlZzsmbmJzcDsgNjQsIGljYy9pY2wgdmVyc2lvbnMgMTIueCANCisgICAgYXJlIHN1cHBvcnRlZCAoMTIuMSBpcyByZWNvbW1lbmRlZCkuPGJyPg0KKygyKSBnY2MgdmVyc2lvbiA0LjcgaXMgc3VwcG9ydGVkLjxicj4NCisoMykgRm9yIGljYyBvbiBPUyBYXG90aGVyLCBPUyBYXG90aGVyIHZlcnNpb24gMTAuNS44IGlzIHN1cHBvcnRlZC48YnI+DQorKDQpIEludGVsJnJlZzsmbmJzcDsgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlIG5vdCBzdXBwb3J0ZWQuPGJyPg0KKyg1KSBPbiBJbnRlbCZyZWc7Jm5ic3A7IE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZSwgaWNjL2ljbCB2ZXJzaW9ucyAxMy4wIG9yIGxhdGVyIGFyZSByZXF1aXJlZC48YnI+DQorKDYpIENsYW5nXG90aGVyIHZlcnNpb24gMy4zIGlzIHN1cHBvcnRlZC48YnI+DQorKDcpIENsYW5nXG90aGVyIGN1cnJlbnRseSBkb2VzIG5vdCBvZmZlciBhIHNvZnR3YXJlLWltcGxlbWVudGVkIDEyOCBiaXQgZXh0ZW5kZWQNCisgICAgcHJlY2lzaW9uIHR5cGUuICBUaHVzLCBhbGwgZW50cnkgcG9pbnRzIHJlbGlhbnQgb24gdGhpcyB0eXBlIGFyZSByZW1vdmVkDQorICAgIGZyb20gdGhlIGxpYnJhcnkgYW5kIGNhbm5vdCBiZSBjYWxsZWQgaW4gdGhlIHVzZXIgcHJvZ3JhbS4gIFRoZSBmb2xsb3dpbmcNCisgICAgZnVuY3Rpb25zIGFyZSBub3QgYXZhaWxhYmxlOg0KK0Bjb2RlDQorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl8qDQorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl8qDQorICAgIF9fa21wY19hdG9taWNfKl9mcA0KK0BlbmRjb2RlDQorKDgpIENvbW11bml0eSBjb250cmlidXRpb24gcHJvdmlkZWQgQVMgSVMsIG5vdCB0ZXN0ZWQgYnkgSW50ZWwuDQorDQorU3VwcG9ydGVkIEFyY2hpdGVjdHVyZXM6IElCTShSKSBQb3dlciA3IGFuZCBQb3dlciA4DQorPHRhYmxlIGJvcmRlcj0xPg0KKzx0cj48dGg+IDx0aD5nY2M8dGg+Y2xhbmcNCis8dHI+PHRkPkxpbnV4XG90aGVyIE9TPHRkPlllcygxLDIpPHRkPlllcygzLDQpDQorPC90YWJsZT4NCisoMSkgT24gUG93ZXIgNywgZ2NjIHZlcnNpb24gNC44LjIgaXMgc3VwcG9ydGVkLjxicj4NCisoMikgT24gUG93ZXIgOCwgZ2NjIHZlcnNpb24gNC44LjIgaXMgc3VwcG9ydGVkLjxicj4NCisoMykgT24gUG93ZXIgNywgY2xhbmcgdmVyc2lvbiAzLjcgaXMgc3VwcG9ydGVkLjxicj4NCisoNCkgT24gUG93ZXIgOCwgY2xhbmcgdmVyc2lvbiAzLjcgaXMgc3VwcG9ydGVkLjxicj4NCisNCitAc2VjdGlvbiBzZWNfZnJvbnRlbmQgRnJvbnQtZW5kIENvbXBpbGVycyB0aGF0IHdvcmsgd2l0aCB0aGlzIFJUTA0KKw0KK1RoZSBmb2xsb3dpbmcgY29tcGlsZXJzIGFyZSBrbm93biB0byBkbyBjb21wYXRpYmxlIGNvZGUgZ2VuZXJhdGlvbiBmb3INCit0aGlzIFJUTDogaWNjL2ljbCwgZ2NjLiAgQ29kZSBnZW5lcmF0aW9uIGlzIGRpc2N1c3NlZCBpbiBtb3JlIGRldGFpbA0KK2xhdGVyIGluIHRoaXMgZG9jdW1lbnQuDQorDQorQHNlY3Rpb24gc2VjX291dGxpbmluZyBPdXRsaW5pbmcNCisNCitUaGUgcnVudGltZSBpbnRlcmZhY2UgaXMgYmFzZWQgb24gdGhlIGlkZWEgdGhhdCB0aGUgY29tcGlsZXINCisib3V0bGluZXMiIHNlY3Rpb25zIG9mIGNvZGUgdGhhdCBhcmUgdG8gcnVuIGluIHBhcmFsbGVsIGludG8gc2VwYXJhdGUNCitmdW5jdGlvbnMgdGhhdCBjYW4gdGhlbiBiZSBpbnZva2VkIGluIG11bHRpcGxlIHRocmVhZHMuICBGb3IgaW5zdGFuY2UsDQorc2ltcGxlIGNvZGUgbGlrZSB0aGlzDQorDQorQGNvZGUNCit2b2lkIGZvbygpDQorew0KKyNwcmFnbWEgb21wIHBhcmFsbGVsDQorICAgIHsNCisgICAgICAgIC4uLiBkbyBzb21ldGhpbmcgLi4uDQorICAgIH0NCit9DQorQGVuZGNvZGUNCitpcyBjb252ZXJ0ZWQgaW50byBzb21ldGhpbmcgdGhhdCBsb29rcyBjb25jZXB0dWFsbHkgbGlrZSB0aGlzICh3aGVyZQ0KK3RoZSBuYW1lcyB1c2VkIGFyZSBtZXJlbHkgaWxsdXN0cmF0aXZlOyB0aGUgcmVhbCBsaWJyYXJ5IGZ1bmN0aW9uDQorbmFtZXMgd2lsbCBiZSB1c2VkIGxhdGVyIGFmdGVyIHdlJ3ZlIGRpc2N1c3NlZCBzb21lIG1vcmUgaXNzdWVzLi4uKQ0KKw0KK0Bjb2RlDQorc3RhdGljIHZvaWQgb3V0bGluZWRGb29Cb2R5KCkNCit7DQorICAgIC4uLiBkbyBzb21ldGhpbmcgLi4uDQorfQ0KKw0KK3ZvaWQgZm9vKCkNCit7DQorICAgIF9fT01QX3J1bnRpbWVfZm9yayhvdXRsaW5lZEZvb0JvZHksICh2b2lkKikwKTsgICAvLyBOb3QgdGhlIHJlYWwgZnVuY3Rpb24gbmFtZSENCit9DQorQGVuZGNvZGUNCisNCitAc3Vic2VjdGlvbiBTRUNfU0hBUkVEVkFSUyBBZGRyZXNzaW5nIHNoYXJlZCB2YXJpYWJsZXMNCisNCitJbiByZWFsIHVzZXMgb2YgdGhlIE9wZW5NUFxvdGhlciBBUEkgdGhlcmUgYXJlIG5vcm1hbGx5IHJlZmVyZW5jZXMgDQorZnJvbSB0aGUgb3V0bGluZWQgY29kZSAgdG8gc2hhcmVkIHZhcmlhYmxlcyB0aGF0IGFyZSBpbiBzY29wZSBpbiB0aGUgY29udGFpbmluZyBmdW5jdGlvbi4gDQorVGhlcmVmb3JlIHRoZSBjb250YWluaW5nIGZ1bmN0aW9uIG11c3QgYmUgYWJsZSB0byBhZGRyZXNzIA0KK3RoZXNlIHZhcmlhYmxlcy4gVGhlIHJ1bnRpbWUgc3VwcG9ydHMgdHdvIGFsdGVybmF0ZSB3YXlzIG9mIGRvaW5nDQordGhpcy4NCisNCitAc3Vic3Vic2VjdGlvbiBTRUNfU0VDX09UIEN1cnJlbnQgVGVjaG5pcXVlDQorVGhlIHRlY2huaXF1ZSBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IHRoZSBydW50aW1lIGxpYnJhcnkgaXMgdG8gcmVjZWl2ZQ0KK2Egc2VwYXJhdGUgcG9pbnRlciB0byBlYWNoIHNoYXJlZCB2YXJpYWJsZSB0aGF0IGNhbiBiZSBhY2Nlc3NlZCBmcm9tDQordGhlIG91dGxpbmVkIGZ1bmN0aW9uLiAgVGhpcyBpcyB3aGF0IGlzIHNob3duIGluIHRoZSBleGFtcGxlIGJlbG93Lg0KKw0KK1dlIGhvcGUgc29vbiB0byBwcm92aWRlIGFuIGFsdGVybmF0aXZlIGludGVyZmFjZSB0byBzdXBwb3J0IHRoZQ0KK2FsdGVybmF0ZSBpbXBsZW1lbnRhdGlvbiBkZXNjcmliZWQgaW4gdGhlIG5leHQgc2VjdGlvbi4gVGhlDQorYWx0ZXJuYXRpdmUgaW1wbGVtZW50YXRpb24gaGFzIHBlcmZvcm1hbmNlIGFkdmFudGFnZXMgZm9yIHNtYWxsDQorcGFyYWxsZWwgcmVnaW9ucyB0aGF0IGhhdmUgbWFueSBzaGFyZWQgdmFyaWFibGVzLg0KKw0KK0BzdWJzdWJzZWN0aW9uIFNFQ19TRUNfUFQgRnV0dXJlIFRlY2huaXF1ZQ0KK1RoZSBpZGVhIGlzIHRvIHRyZWF0IHRoZSBvdXRsaW5lZCBmdW5jdGlvbiBhcyB0aG91Z2ggaXQNCit3ZXJlIGEgbGV4aWNhbGx5IG5lc3RlZCBmdW5jdGlvbiwgYW5kIHBhc3MgaXQgYSBzaW5nbGUgYXJndW1lbnQgd2hpY2gNCitpcyB0aGUgcG9pbnRlciB0byB0aGUgcGFyZW50J3Mgc3RhY2sgZnJhbWUuIFByb3ZpZGVkIHRoYXQgdGhlIGNvbXBpbGVyDQora25vd3MgdGhlIGxheW91dCBvZiB0aGUgcGFyZW50IGZyYW1lIHdoZW4gaXQgaXMgZ2VuZXJhdGluZyB0aGUgb3V0bGluZWQNCitmdW5jdGlvbiBpdCBjYW4gdGhlbiBhY2Nlc3MgdGhlIHVwLWxldmVsIHZhcmlhYmxlcyBhdCBhcHByb3ByaWF0ZQ0KK29mZnNldHMgZnJvbSB0aGUgcGFyZW50IGZyYW1lLiAgVGhpcyBpcyBhIGNsYXNzaWNhbCBjb21waWxlciB0ZWNobmlxdWUNCitmcm9tIHRoZSAxOTYwcyB0byBzdXBwb3J0IGxhbmd1YWdlcyBsaWtlIEFsZ29sIChhbmQgaXRzIGRlc2NlbmRhbnRzKQ0KK3RoYXQgc3VwcG9ydCBsZXhpY2FsbHkgbmVzdGVkIGZ1bmN0aW9ucy4NCisNCitUaGUgbWFpbiBiZW5lZml0IG9mIHRoaXMgdGVjaG5pcXVlIGlzIHRoYXQgdGhlcmUgaXMgbm8gY29kZSByZXF1aXJlZA0KK2F0IHRoZSBmb3JrIHBvaW50IHRvIG1hcnNoYWwgdGhlIGFyZ3VtZW50cyB0byB0aGUgb3V0bGluZWQgZnVuY3Rpb24uDQorU2luY2UgdGhlIHJ1bnRpbWUga25vd3Mgc3RhdGljYWxseSBob3cgbWFueSBhcmd1bWVudHMgbXVzdCBiZSBwYXNzZWQgdG8gdGhlDQorb3V0bGluZWQgZnVuY3Rpb24sIGl0IGNhbiBlYXNpbHkgY29weSB0aGVtIHRvIHRoZSB0aHJlYWQncyBzdGFjaw0KK2ZyYW1lLiAgVGhlcmVmb3JlIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgZm9yayBjb2RlIGlzIGluZGVwZW5kZW50IG9mDQordGhlIG51bWJlciBvZiBzaGFyZWQgdmFyaWFibGVzIHRoYXQgYXJlIGFjY2Vzc2VkIGJ5IHRoZSBvdXRsaW5lZA0KK2Z1bmN0aW9uLg0KKw0KK0lmIGl0IGlzIGhhcmQgdG8gZGV0ZXJtaW5lIHRoZSBzdGFjayBsYXlvdXQgb2YgdGhlIHBhcmVudCB3aGlsZSBnZW5lcmF0aW5nIHRoZQ0KK291dGxpbmVkIGNvZGUsIGl0IGlzIHN0aWxsIHBvc3NpYmxlIHRvIHVzZSB0aGlzIGFwcHJvYWNoIGJ5IGNvbGxlY3RpbmcgYWxsIG9mDQordGhlIHZhcmlhYmxlcyBpbiB0aGUgcGFyZW50IHRoYXQgYXJlIGFjY2Vzc2VkIGZyb20gb3V0bGluZWQgZnVuY3Rpb25zIGludG8NCithIHNpbmdsZSBgc3RydWN0YCB3aGljaCBpcyBwbGFjZWQgb24gdGhlIHN0YWNrLCBhbmQgd2hvc2UgYWRkcmVzcyBpcyBwYXNzZWQNCit0byB0aGUgb3V0bGluZWQgZnVuY3Rpb25zLiBJbiB0aGlzIHdheSB0aGUgb2Zmc2V0cyBvZiB0aGUgc2hhcmVkIHZhcmlhYmxlcw0KK2FyZSBrbm93biAoc2luY2UgdGhleSBhcmUgaW5zaWRlIHRoZSBzdHJ1Y3QpIHdpdGhvdXQgbmVlZGluZyB0byBrbm93DQordGhlIGNvbXBsZXRlIGxheW91dCBvZiB0aGUgcGFyZW50IHN0YWNrLWZyYW1lLiBGcm9tIHRoZSBwb2ludCBvZiB2aWV3DQorb2YgdGhlIHJ1bnRpbWUgZWl0aGVyIG9mIHRoZXNlIHRlY2huaXF1ZXMgaXMgZXF1aXZhbGVudCwgc2luY2UgaW4gZWl0aGVyDQorY2FzZSBpdCBvbmx5IGhhcyB0byBwYXNzIGEgc2luZ2xlIGFyZ3VtZW50IHRvIHRoZSBvdXRsaW5lZCBmdW5jdGlvbiB0byBhbGxvdyANCitpdCB0byBhY2Nlc3Mgc2hhcmVkIHZhcmlhYmxlcy4NCisNCitBIHNjaGVtZSBsaWtlIHRoaXMgaXMgaG93IGdjY1xvdGhlciBnZW5lcmF0ZXMgb3V0bGluZWQgZnVuY3Rpb25zLg0KKw0KK0BzZWN0aW9uIFNFQ19JTlRFUkZBQ0VTIExpYnJhcnkgSW50ZXJmYWNlcw0KK1RoZSBsaWJyYXJ5IGZ1bmN0aW9ucyB1c2VkIGZvciBzcGVjaWZpYyBwYXJ0cyBvZiB0aGUgT3Blbk1QXG90aGVyIGxhbmd1YWdlIGltcGxlbWVudGF0aW9uDQorYXJlIGRvY3VtZW50ZWQgaW4gZGlmZmVyZW50IG1vZHVsZXMuDQorDQorIC0gQHJlZiBCQVNJQ19UWVBFUyBmdW5kYW1lbnRhbCB0eXBlcyB1c2VkIGJ5IHRoZSBydW50aW1lIGluIG1hbnkgcGxhY2VzDQorIC0gQHJlZiBERVBSRUNBVEVEICBmdW5jdGlvbnMgdGhhdCBhcmUgaW4gdGhlIGxpYnJhcnkgYnV0IGFyZSBubyBsb25nZXIgcmVxdWlyZWQNCisgLSBAcmVmIFNUQVJUVVBfU0hVVERPV04gZnVuY3Rpb25zIGZvciBpbml0aWFsaXppbmcgYW5kIGZpbmFsaXppbmcgdGhlIHJ1bnRpbWUNCisgLSBAcmVmIFBBUkFMTEVMIGZ1bmN0aW9ucyBmb3IgaW1wbGVtZW50aW5nIGBvbXAgcGFyYWxsZWxgDQorIC0gQHJlZiBUSFJFQURfU1RBVEVTIGZ1bmN0aW9ucyBmb3Igc3VwcG9ydGluZyB0aHJlYWQgc3RhdGUgaW5xdWlyaWVzDQorIC0gQHJlZiBXT1JLX1NIQVJJTkcgZnVuY3Rpb25zIGZvciB3b3JrIHNoYXJpbmcgY29uc3RydWN0cyBzdWNoIGFzIGBvbXAgZm9yYCwgYG9tcCBzZWN0aW9uc2ANCisgLSBAcmVmIFRIUkVBRFBSSVZBVEUgZnVuY3Rpb25zIHRvIHN1cHBvcnQgdGhyZWFkIHByaXZhdGUgZGF0YSwgY29weWluIGV0Yw0KKyAtIEByZWYgU1lOQ0hST05JWkFUSU9OIGZ1bmN0aW9ucyB0byBzdXBwb3J0IGBvbXAgY3JpdGljYWxgLCBgb21wIGJhcnJpZXJgLCBgb21wIG1hc3RlcmAsIHJlZHVjdGlvbnMgZXRjDQorIC0gQHJlZiBBVE9NSUNfT1BTIGZ1bmN0aW9ucyB0byBzdXBwb3J0IGF0b21pYyBvcGVyYXRpb25zDQorIC0gQHJlZiBTVEFUU19HQVRIRVJJTkcgbWFjcm9zIHRvIHN1cHBvcnQgZGV2ZWxvcGVyIHByb2ZpbGluZyBvZiBsaWJvbXANCisgLSBEb2N1bWVudGF0aW9uIG9uIHRhc2tpbmcgaGFzIHN0aWxsIHRvIGJlIHdyaXR0ZW4uLi4NCisNCitAc2VjdGlvbiBTRUNfRVhBTVBMRVMgRXhhbXBsZXMNCitAc3Vic2VjdGlvbiBTRUNfV09SS1NIQVJJTkdfRVhBTVBMRSBXb3JrIFNoYXJpbmcgRXhhbXBsZQ0KK1RoaXMgZXhhbXBsZSBzaG93cyB0aGUgY29kZSBnZW5lcmF0ZWQgZm9yIGEgcGFyYWxsZWwgZm9yIHdpdGggcmVkdWN0aW9uIGFuZCBkeW5hbWljIHNjaGVkdWxpbmcuDQorDQorQGNvZGUNCitleHRlcm4gZmxvYXQgZm9vKCB2b2lkICk7DQorDQoraW50IG1haW4gKCkgew0KKyAgICBpbnQgaTsgDQorICAgIGZsb2F0IHIgPSAwLjA7IA0KKyAgICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYykgcmVkdWN0aW9uKCs6cikgDQorICAgIGZvciAoIGkgPSAwOyBpIDwgMTA7IGkgKysgKSB7DQorICAgICAgICByICs9IGZvbygpOyANCisgICAgfQ0KK30NCitAZW5kY29kZQ0KKw0KK1RoZSB0cmFuc2Zvcm1lZCBjb2RlIGxvb2tzIGxpa2UgdGhpcy4NCitAY29kZQ0KK2V4dGVybiBmbG9hdCBmb28oIHZvaWQgKTsgDQorDQoraW50IG1haW4gKCkgew0KKyAgICBzdGF0aWMgaW50IHplcm8gPSAwOyANCisgICAgYXV0byBpbnQgZ3RpZDsgDQorICAgIGF1dG8gZmxvYXQgciA9IDAuMDsgDQorICAgIF9fa21wY19iZWdpbiggJiBsb2MzLCAwICk7IA0KKyAgICAvLyBUaGUgZ3RpZCBpcyBub3QgYWN0dWFsbHkgcmVxdWlyZWQgaW4gdGhpcyBleGFtcGxlIHNvIGNvdWxkIGJlIG9taXR0ZWQ7DQorICAgIC8vIFdlIHNob3cgaXRzIGluaXRpYWxpemF0aW9uIGhlcmUgYmVjYXVzZSBpdCBpcyBvZnRlbiByZXF1aXJlZCBmb3IgY2FsbHMgaW50bw0KKyAgICAvLyB0aGUgcnVudGltZSBhbmQgc2hvdWxkIGJlIGxvY2FsbHkgY2FjaGVkIGxpa2UgdGhpcy4NCisgICAgZ3RpZCA9IF9fa21wY19nbG9iYWwgdGhyZWFkIG51bSggJiBsb2MzICk7IA0KKyAgICBfX2ttcGNfZm9yayBjYWxsKCAmIGxvYzcsIDEsIG1haW5fN19wYXJhbGxlbF8zLCAmIHIgKTsgDQorICAgIF9fa21wY19lbmQoICYgbG9jMCApOyANCisgICAgcmV0dXJuIDA7IA0KK30NCisNCitzdHJ1Y3QgbWFpbl8xMF9yZWR1Y3Rpb25fdF81IHsgZmxvYXQgcl8xMF9ycHI7IH07IA0KKw0KK3N0YXRpYyBrbXBfY3JpdGljYWxfbmFtZSBsY2sgPSB7IDAgfTsNCitzdGF0aWMgaWRlbnRfdCBsb2MxMDsgLy8gbG9jMTAuZmxhZ3Mgc2hvdWxkIGNvbnRhaW4gS01QX0lERU5UX0FUT01JQ19SRURVQ0UgYml0IHNldCANCisgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgY29tcGlsZXIgaGFzIGdlbmVyYXRlZCBhbiBhdG9taWMgcmVkdWN0aW9uLg0KKw0KK3ZvaWQgbWFpbl83X3BhcmFsbGVsXzMoIGludCAqZ3RpZCwgaW50ICpidGlkLCBmbG9hdCAqcl83X3NocCApIHsNCisgICAgYXV0byBpbnQgaV83X3ByOyANCisgICAgYXV0byBpbnQgbG93ZXIsIHVwcGVyLCBsaXRlciwgaW5jcjsgDQorICAgIGF1dG8gc3RydWN0IG1haW5fMTBfcmVkdWN0aW9uX3RfNSByZWR1Y2U7IA0KKyAgICByZWR1Y2Uucl8xMF9ycHIgPSAwLkY7IA0KKyAgICBsaXRlciA9IDA7IA0KKyAgICBfX2ttcGNfZGlzcGF0Y2hfaW5pdF80KCAmIGxvYzcsKmd0aWQsIDM1LCAwLCA5LCAxLCAxICk7IA0KKyAgICB3aGlsZSAoIF9fa21wY19kaXNwYXRjaF9uZXh0XzQoICYgbG9jNywgKmd0aWQsICYgbGl0ZXIsICYgbG93ZXIsICYgdXBwZXIsICYgaW5jciApICkgew0KKyAgICAgICAgZm9yKCBpXzdfcHIgPSBsb3dlcjsgdXBwZXIgPj0gaV83X3ByOyBpXzdfcHIgKysgKSANCisgICAgICAgICAgcmVkdWNlLnJfMTBfcnByICs9IGZvbygpOyANCisgICAgfQ0KKyAgICBzd2l0Y2goIF9fa21wY19yZWR1Y2Vfbm93YWl0KCAmIGxvYzEwLCAqZ3RpZCwgMSwgNCwgJiByZWR1Y2UsIG1haW5fMTBfcmVkdWNlXzUsICYgbGNrICkgKSB7DQorICAgICAgICBjYXNlIDE6DQorICAgICAgICAgICAqcl83X3NocCArPSByZWR1Y2Uucl8xMF9ycHI7DQorICAgICAgICAgICBfX2ttcGNfZW5kX3JlZHVjZV9ub3dhaXQoICYgbG9jMTAsICpndGlkLCAmIGxjayApOw0KKyAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIDI6DQorICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGQoICYgbG9jMTAsICpndGlkLCByXzdfc2hwLCByZWR1Y2Uucl8xMF9ycHIgKTsNCisgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDo7DQorICAgIH0NCit9IA0KKw0KK3ZvaWQgbWFpbl8xMF9yZWR1Y2VfNSggc3RydWN0IG1haW5fMTBfcmVkdWN0aW9uX3RfNSAqcmVkdWNlX2xocywgDQorICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbWFpbl8xMF9yZWR1Y3Rpb25fdF81ICpyZWR1Y2VfcmhzICkgDQoreyANCisgICAgcmVkdWNlX2xocy0+cl8xMF9ycHIgKz0gcmVkdWNlX3Jocy0+cl8xMF9ycHI7IA0KK30NCitAZW5kY29kZQ0KKw0KK0BkZWZncm91cCBCQVNJQ19UWVBFUyBCYXNpYyBUeXBlcw0KK1R5cGVzIHRoYXQgYXJlIHVzZWQgdGhyb3VnaG91dCB0aGUgcnVudGltZS4NCisNCitAZGVmZ3JvdXAgREVQUkVDQVRFRCBEZXByZWNhdGVkIEZ1bmN0aW9ucw0KK0Z1bmN0aW9ucyBpbiB0aGlzIGdyb3VwIGFyZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgb25seSwgYW5kDQorc2hvdWxkIG5vdCBiZSB1c2VkIGluIG5ldyBjb2RlLg0KKw0KK0BkZWZncm91cCBTVEFSVFVQX1NIVVRET1dOIFN0YXJ0dXAgYW5kIFNodXRkb3duDQorVGhlc2UgZnVuY3Rpb25zIGFyZSBmb3IgbGlicmFyeSBpbml0aWFsaXphdGlvbiBhbmQgc2h1dGRvd24uDQorDQorQGRlZmdyb3VwIFBBUkFMTEVMIFBhcmFsbGVsIChmb3JrL2pvaW4pDQorVGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VkIGZvciBpbXBsZW1lbnRpbmcgPHR0PlwjcHJhZ21hIG9tcCBwYXJhbGxlbDwvdHQ+Lg0KKw0KK0BkZWZncm91cCBUSFJFQURfU1RBVEVTIFRocmVhZCBJbmZvcm1hdGlvbg0KK1RoZXNlIGZ1bmN0aW9ucyByZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgdGhyZWFkLg0KKw0KK0BkZWZncm91cCBXT1JLX1NIQVJJTkcgV29yayBTaGFyaW5nDQorVGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VkIGZvciBpbXBsZW1lbnRpbmcgDQorPHR0PlwjcHJhZ21hIG9tcCBmb3I8L3R0PiwgPHR0PlwjcHJhZ21hIG9tcCBzZWN0aW9uczwvdHQ+LCA8dHQ+XCNwcmFnbWEgb21wIHNpbmdsZTwvdHQ+IGFuZCANCis8dHQ+XCNwcmFnbWEgb21wIG1hc3RlcjwvdHQ+IGNvbnN0cnVjdHMuIA0KKw0KK1doZW4gaGFuZGxpbmcgbG9vcHMsIHRoZXJlIGFyZSBkaWZmZXJlbnQgZnVuY3Rpb25zIGZvciBlYWNoIG9mIHRoZSBzaWduZWQgYW5kIHVuc2lnbmVkIDMyIGFuZCA2NCBiaXQgaW50ZWdlciB0eXBlcw0KK3doaWNoIGhhdmUgdGhlIG5hbWUgc3VmZml4ZXMgYF80YCwgYF80dWAsIGBfOGAgYW5kIGBfOHVgLiBUaGUgc2VtYW50aWNzIG9mIGVhY2ggb2YgdGhlIGZ1bmN0aW9ucyBpcyB0aGUgc2FtZSwNCitzbyB0aGV5IGFyZSBvbmx5IGRlc2NyaWJlZCBvbmNlLg0KKw0KK1N0YXRpYyBsb29wIHNjaGVkdWxpbmcgaXMgaGFuZGxlZCBieSAgQHJlZiBfX2ttcGNfZm9yX3N0YXRpY19pbml0XzQgYW5kIGZyaWVuZHMuIE9ubHkgYSBzaW5nbGUgY2FsbCBpcyBuZWVkZWQsDQorc2luY2UgdGhlIGl0ZXJhdGlvbnMgdG8gYmUgZXhlY3V0ZWQgYnkgYW55IGdpdmUgdGhyZWFkIGNhbiBiZSBkZXRlcm1pbmVkIGFzIHNvb24gYXMgdGhlIGxvb3AgcGFyYW1ldGVycyBhcmUga25vd24uDQorDQorRHluYW1pYyBzY2hlZHVsaW5nIGlzIGhhbmRsZWQgYnkgdGhlIEByZWYgX19rbXBjX2Rpc3BhdGNoX2luaXRfNCBhbmQgQHJlZiBfX2ttcGNfZGlzcGF0Y2hfbmV4dF80IGZ1bmN0aW9ucy4gDQorVGhlIGluaXQgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgaW4gZWFjaCB0aHJlYWQgb3V0c2lkZSB0aGUgbG9vcCwgd2hpbGUgdGhlIG5leHQgZnVuY3Rpb24gaXMgY2FsbGVkIGVhY2gNCit0aW1lIHRoYXQgdGhlIHByZXZpb3VzIGNodW5rIG9mIHdvcmsgaGFzIGJlZW4gZXhoYXVzdGVkLiANCisNCitAZGVmZ3JvdXAgU1lOQ0hST05JWkFUSU9OIFN5bmNocm9uaXphdGlvbg0KK1RoZXNlIGZ1bmN0aW9ucyBhcmUgdXNlZCBmb3IgaW1wbGVtZW50aW5nIGJhcnJpZXJzLg0KKw0KK0BkZWZncm91cCBUSFJFQURQUklWQVRFIFRocmVhZCBwcml2YXRlIGRhdGEgc3VwcG9ydA0KK1RoZXNlIGZ1bmN0aW9ucyBzdXBwb3J0IGNvcHlpbi9vdXQgYW5kIHRocmVhZCBwcml2YXRlIGRhdGEuDQorDQorQGRlZmdyb3VwIFNUQVRTX0dBVEhFUklORyBTdGF0aXN0aWNzIEdhdGhlcmluZyBmcm9tIE9NUFRCDQorVGhlc2UgbWFjcm9zIHN1cHBvcnQgcHJvZmlsaW5nIHRoZSBsaWJvbXAgbGlicmFyeS4gIFVzZSAtLXN0YXRzPW9uIHdoZW4gYnVpbGRpbmcgd2l0aCBidWlsZC5wbCB0byBlbmFibGUNCithbmQgdGhlbiB1c2UgdGhlIEtNUF8qIG1hY3JvcyB0byBwcm9maWxlICh0aHJvdWdoIGNvdW50cyBvciBjbG9jayB0aWNrcykgbGlib21wIGR1cmluZyBleGVjdXRpb24gb2YgYW4gT3Blbk1QIHByb2dyYW0uDQorDQorQHNlY3Rpb24gc2VjX3N0YXRzX2Vudl92YXJzIEVudmlyb25tZW50IFZhcmlhYmxlcw0KKw0KK1RoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyByZWxldmFudCB0byBzdGF0cy1nYXRoZXJpbmcgaW4gbGlib21wDQorDQorQGNvZGUNCitLTVBfU1RBVFNfRklMRQ0KK0BlbmRjb2RlDQorVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQgdG8gYW4gb3V0cHV0IGZpbGVuYW1lIHRoYXQgd2lsbCBiZSBhcHBlbmRlZCAqTk9UIE9WRVJXUklUVEVOKiBpZiBpdCBleGlzdHMuICBJZiB0aGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHVuZGVmaW5lZCwgdGhlIHN0YXRpc3RpY3Mgd2lsbCBiZSBvdXRwdXQgdG8gc3RkZXJyDQorDQorQGNvZGUNCitLTVBfU1RBVFNfVEhSRUFEUw0KK0BlbmRjb2RlDQorVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpbmRpY2F0ZXMgdG8gcHJpbnQgdGhyZWFkLXNwZWNpZmljIHN0YXRpc3RpY3MgYXMgd2VsbCBhcyBhZ2dyZWdhdGUgc3RhdGlzdGljcy4gIEVhY2ggdGhyZWFkJ3Mgc3RhdGlzdGljcyB3aWxsIGJlIHNob3duIGFzIHdlbGwgYXMgdGhlIGNvbGxlY3RpdmUgc3VtIG9mIGFsbCB0aHJlYWRzLiAgVGhlIHZhbHVlcyAidHJ1ZSIsICJvbiIsICIxIiwgInllcyIgd2lsbCBhbGwgaW5kaWNhdGUgdG8gcHJpbnQgcGVyIHRocmVhZCBzdGF0aXN0aWNzLg0KKw0KK0BkZWZncm91cCBUQVNLSU5HIFRhc2tpbmcgc3VwcG9ydA0KK1RoZXNlIGZ1bmN0aW9ucyBzdXBwb3J0IHRhc2tpbmcgY29uc3RydWN0cy4NCisNCitAZGVmZ3JvdXAgVVNFUiBVc2VyIHZpc2libGUgZnVuY3Rpb25zDQorVGhlc2UgZnVuY3Rpb25zIGNhbiBiZSBjYWxsZWQgZGlyZWN0bHkgYnkgdGhlIHVzZXIsIGJ1dCBhcmUgcnVudGltZSBsaWJyYXJ5IHNwZWNpZmljLCByYXRoZXIgdGhhbiBiZWluZyBPcGVuTVAgaW50ZXJmYWNlcy4NCisNCisqLw0KKw0KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL0NNYWtlTGlzdHMudHh0IGIvZmluYWwvcnVudGltZS9zcmMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU4OTlmYwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMzE4IEBACisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgQ29uZmlndXJlIG9tcC5oLCBrbXBfY29uZmlnLmggYW5kIG9tcHQuaCBpZiBuZWNlc3NhcnkKK2NvbmZpZ3VyZV9maWxlKCR7TElCT01QX0lOQ19ESVJ9L29tcC5oLnZhciBvbXAuaCBAT05MWSkKK2NvbmZpZ3VyZV9maWxlKGttcF9jb25maWcuaC5jbWFrZSBrbXBfY29uZmlnLmggQE9OTFkpCitpZigke0xJQk9NUF9PTVBUX1NVUFBPUlR9KQorICBjb25maWd1cmVfZmlsZSgke0xJQk9NUF9JTkNfRElSfS9vbXB0LmgudmFyIG9tcHQuaCBAT05MWSkKK2VuZGlmKCkKKworIyBHZW5lcmF0ZSBtZXNzYWdlIGNhdGFsb2cgZmlsZXM6IGttcF9pMThuX2lkLmluYyBhbmQga21wX2kxOG5fZGVmYXVsdC5pbmMKK2FkZF9jdXN0b21fY29tbWFuZCgKKyAgT1VUUFVUICBrbXBfaTE4bl9pZC5pbmMKKyAgQ09NTUFORCAke1BFUkxfRVhFQ1VUQUJMRX0gJHtMSUJPTVBfVE9PTFNfRElSfS9tZXNzYWdlLWNvbnZlcnRlci5wbCAtLW9zPSR7TElCT01QX1BFUkxfU0NSSVBUX09TfQorICAgIC0tYXJjaD0ke0xJQk9NUF9BUkNIfSAtLXByZWZpeD1rbXBfaTE4biAtLWVudW09a21wX2kxOG5faWQuaW5jICR7TElCT01QX1NSQ19ESVJ9L2kxOG4vZW5fVVMudHh0CisgIERFUEVORFMgJHtMSUJPTVBfU1JDX0RJUn0vaTE4bi9lbl9VUy50eHQgJHtMSUJPTVBfVE9PTFNfRElSfS9tZXNzYWdlLWNvbnZlcnRlci5wbAorKQorYWRkX2N1c3RvbV9jb21tYW5kKAorICBPVVRQVVQgIGttcF9pMThuX2RlZmF1bHQuaW5jCisgIENPTU1BTkQgJHtQRVJMX0VYRUNVVEFCTEV9ICR7TElCT01QX1RPT0xTX0RJUn0vbWVzc2FnZS1jb252ZXJ0ZXIucGwgLS1vcz0ke0xJQk9NUF9QRVJMX1NDUklQVF9PU30KKyAgICAtLWFyY2g9JHtMSUJPTVBfQVJDSH0gLS1wcmVmaXg9a21wX2kxOG4gLS1kZWZhdWx0PWttcF9pMThuX2RlZmF1bHQuaW5jICR7TElCT01QX1NSQ19ESVJ9L2kxOG4vZW5fVVMudHh0CisgIERFUEVORFMgJHtMSUJPTVBfU1JDX0RJUn0vaTE4bi9lbl9VUy50eHQgJHtMSUJPTVBfVE9PTFNfRElSfS9tZXNzYWdlLWNvbnZlcnRlci5wbAorKQorCisjIFNldCB0aGUgLUQgZGVmaW5pdGlvbnMgZm9yIGFsbCBzb3VyY2VzCitsaWJvbXBfZ2V0X2RlZmluaXRpb25zX2ZsYWdzKExJQk9NUF9DT05GSUdVUkVEX0RFRklOSVRJT05TX0ZMQUdTKQorYWRkX2RlZmluaXRpb25zKCR7TElCT01QX0NPTkZJR1VSRURfREVGSU5JVElPTlNfRkxBR1N9KQorCisjIFNldCB0aGUgLUkgaW5jbHVkZXMgZm9yIGFsbCBzb3VyY2VzCitpbmNsdWRlX2RpcmVjdG9yaWVzKAorICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0KKyAgJHtMSUJPTVBfU1JDX0RJUn0KKyAgJHtMSUJPTVBfU1JDX0RJUn0vaTE4bgorICAke0xJQk9NUF9JTkNfRElSfQorICAke0xJQk9NUF9TUkNfRElSfS90aGlyZHBhcnR5L2l0dG5vdGlmeQorKQoraWYoJHtMSUJPTVBfVVNFX0hXTE9DfSkKKyAgaW5jbHVkZV9kaXJlY3Rvcmllcygke0xJQk9NUF9IV0xPQ19JTlNUQUxMX0RJUn0vaW5jbHVkZSkKK2VuZGlmKCkKKworIyBHZXR0aW5nIGNvcnJlY3Qgc291cmNlIGZpbGVzIHRvIGJ1aWxkIGxpYnJhcnkKK3NldChMSUJPTVBfQ0ZJTEVTKQorc2V0KExJQk9NUF9DWFhGSUxFUykKK3NldChMSUJPTVBfQVNNRklMRVMpCitpZigke1NUVUJTX0xJQlJBUll9KQorICBzZXQoTElCT01QX0NGSUxFUyBrbXBfc3R1Yi5jKQorZWxzZSgpCisgICMgR2V0IEMgZmlsZXMKKyAgc2V0KExJQk9NUF9DRklMRVMKKyAgICBrbXBfYWxsb2MuYworICAgIGttcF9hdG9taWMuYworICAgIGttcF9jc3VwcG9ydC5jCisgICAga21wX2RlYnVnLmMKKyAgICBrbXBfaXR0LmMKKyAgICBrbXBfZW52aXJvbm1lbnQuYworICAgIGttcF9lcnJvci5jCisgICAga21wX2dsb2JhbC5jCisgICAga21wX2kxOG4uYworICAgIGttcF9pby5jCisgICAga21wX3J1bnRpbWUuYworICAgIGttcF9zZXR0aW5ncy5jCisgICAga21wX3N0ci5jCisgICAga21wX3Rhc2tpbmcuYworICAgIGttcF90YXNrcS5jCisgICAga21wX3RocmVhZHByaXZhdGUuYworICAgIGttcF91dGlsaXR5LmMKKyAgKQorICBpZihXSU4zMikKKyAgICAjIFdpbmRvd3Mgc3BlY2lmaWMgZmlsZXMKKyAgICBsaWJvbXBfYXBwZW5kKExJQk9NUF9DRklMRVMgel9XaW5kb3dzX05UX3V0aWwuYykKKyAgICBsaWJvbXBfYXBwZW5kKExJQk9NUF9DRklMRVMgel9XaW5kb3dzX05ULTU4Nl91dGlsLmMpCisgICAgbGlib21wX2FwcGVuZChMSUJPTVBfQVNNRklMRVMgel9XaW5kb3dzX05ULTU4Nl9hc20uYXNtKSAjIFdpbmRvd3MgYXNzZW1ibHkgZmlsZQorICBlbHNlKCkKKyAgICAjIFVuaXggc3BlY2lmaWMgZmlsZXMKKyAgICBsaWJvbXBfYXBwZW5kKExJQk9NUF9DRklMRVMgel9MaW51eF91dGlsLmMpCisgICAgbGlib21wX2FwcGVuZChMSUJPTVBfQ0ZJTEVTIGttcF9nc3VwcG9ydC5jKQorICAgIGxpYm9tcF9hcHBlbmQoTElCT01QX0FTTUZJTEVTIHpfTGludXhfYXNtLnMpICMgVW5peCBhc3NlbWJseSBmaWxlCisgIGVuZGlmKCkKKyAgbGlib21wX2FwcGVuZChMSUJPTVBfQ0ZJTEVTIHRoaXJkcGFydHkvaXR0bm90aWZ5L2l0dG5vdGlmeV9zdGF0aWMuYyBMSUJPTVBfVVNFX0lUVF9OT1RJRlkpCisgIGxpYm9tcF9hcHBlbmQoTElCT01QX0NGSUxFUyBrbXBfZGVidWdnZXIuYyBMSUJPTVBfVVNFX0RFQlVHR0VSKQorICAjIEdldCBDKysgZmlsZXMKKyAgc2V0KExJQk9NUF9DWFhGSUxFUworICAgIGttcF9iYXJyaWVyLmNwcAorICAgIGttcF93YWl0X3JlbGVhc2UuY3BwCisgICAga21wX2FmZmluaXR5LmNwcAorICAgIGttcF9kaXNwYXRjaC5jcHAKKyAgICBrbXBfbG9jay5jcHAKKyAgICBrbXBfc2NoZWQuY3BwCisgICkKKyAgbGlib21wX2FwcGVuZChMSUJPTVBfQ1hYRklMRVMga21wX3N0YXRzLmNwcCBMSUJPTVBfU1RBVFMpCisgIGxpYm9tcF9hcHBlbmQoTElCT01QX0NYWEZJTEVTIGttcF9zdGF0c190aW1pbmcuY3BwIExJQk9NUF9TVEFUUykKKyAgaWYoJHtMSUJPTVBfT01QX1ZFUlNJT059IEdSRUFURVIgNDAgT1IgJHtMSUJPTVBfT01QX1ZFUlNJT059IEVRVUFMIDQwKQorICAgIGxpYm9tcF9hcHBlbmQoTElCT01QX0NYWEZJTEVTIGttcF90YXNrZGVwcy5jcHApCisgICAgbGlib21wX2FwcGVuZChMSUJPTVBfQ1hYRklMRVMga21wX2NhbmNlbC5jcHApCisgIGVuZGlmKCkKK2VuZGlmKCkKKyMgRmlsZXMgY29tbW9uIHRvIHN0dWJzIGFuZCBub3JtYWwgbGlicmFyeQorbGlib21wX2FwcGVuZChMSUJPTVBfQ0ZJTEVTIGttcF9mdG5fY2RlY2wuYykKK2xpYm9tcF9hcHBlbmQoTElCT01QX0NGSUxFUyBrbXBfZnRuX2V4dHJhLmMpCitsaWJvbXBfYXBwZW5kKExJQk9NUF9DRklMRVMga21wX3ZlcnNpb24uYykKK2xpYm9tcF9hcHBlbmQoTElCT01QX0NGSUxFUyBvbXB0LWdlbmVyYWwuYyBJRl9UUlVFIExJQk9NUF9PTVBUX1NVUFBPUlQpCisKK3NldChMSUJPTVBfU09VUkNFX0ZJTEVTICR7TElCT01QX0NGSUxFU30gJHtMSUJPTVBfQ1hYRklMRVN9ICR7TElCT01QX0FTTUZJTEVTfSkKKyMgRm9yIFdpbmRvd3MsIHRoZXJlIGlzIGEgcmVzb3VyY2UgZmlsZSAoLnJjIC0+IC5yZXMpIHRoYXQgaXMgYWxzbyBjb21waWxlZAorbGlib21wX2FwcGVuZChMSUJPTVBfU09VUkNFX0ZJTEVTIGxpYm9tcC5yYyBXSU4zMikKKworIyBHZXQgY29tcGlsZXIgYW5kIGFzc2VtYmxlciBmbGFncworbGlib21wX2dldF9jZmxhZ3MoTElCT01QX0NPTkZJR1VSRURfQ0ZMQUdTKQorbGlib21wX2dldF9jeHhmbGFncyhMSUJPTVBfQ09ORklHVVJFRF9DWFhGTEFHUykKK2xpYm9tcF9nZXRfYXNtZmxhZ3MoTElCT01QX0NPTkZJR1VSRURfQVNNRkxBR1MpCisjIFNldCB0aGUgY29tcGlsZXIgZmxhZ3MgZm9yIGVhY2ggdHlwZSBvZiBzb3VyY2UKK3NldF9zb3VyY2VfZmlsZXNfcHJvcGVydGllcygke0xJQk9NUF9DRklMRVN9IFBST1BFUlRJRVMgQ09NUElMRV9GTEFHUyAiJHtMSUJPTVBfQ09ORklHVVJFRF9DRkxBR1N9IikKK3NldF9zb3VyY2VfZmlsZXNfcHJvcGVydGllcygke0xJQk9NUF9DWFhGSUxFU30gUFJPUEVSVElFUyBDT01QSUxFX0ZMQUdTICIke0xJQk9NUF9DT05GSUdVUkVEX0NYWEZMQUdTfSIpCitzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXMoJHtMSUJPTVBfQVNNRklMRVN9IFBST1BFUlRJRVMgQ09NUElMRV9GTEFHUyAiJHtMSUJPTVBfQ09ORklHVVJFRF9BU01GTEFHU30iKQorIyBMZXQgdGhlIGNvbXBpbGVyIGhhbmRsZSB0aGUgYXNzZW1ibHkgZmlsZXMgb24gVW5peC1saWtlIHN5c3RlbXMKK2lmKE5PVCBXSU4zMikKKyAgc2V0X3NvdXJjZV9maWxlc19wcm9wZXJ0aWVzKCR7TElCT01QX0FTTUZJTEVTfSBQUk9QRVJUSUVTIExBTkdVQUdFIEMpCitlbmRpZigpCisKKyMgUmVtb3ZlIGFueSBjbWFrZS1hdXRvbWF0aWMgbGlua2luZyBvZiB0aGUgc3RhbmRhcmQgQysrIGxpYnJhcnkuCisjIFdlIG5laXRoZXIgbmVlZCAobm9yIHdhbnQpIHRoZSBzdGFuZGFyZCBDKysgbGlicmFyeSBkZXBlbmRlbmN5IGV2ZW4gdGhvdWdoIHdlIGNvbXBpbGUgYysrIGZpbGVzLgoraWYoTk9UICR7TElCT01QX1VTRV9TVERDUFBMSUJ9KQorICBzZXQoTElCT01QX0xJTktFUl9MQU5HVUFHRSBDKQorICBzZXQoQ01BS0VfQ1hYX0lNUExJQ0lUX0xJTktfTElCUkFSSUVTKQorZWxzZSgpCisgIHNldChMSUJPTVBfTElOS0VSX0xBTkdVQUdFIENYWCkKK2VuZGlmKCkKKworIyBBZGQgdGhlIE9wZW5NUCBsaWJyYXJ5CitsaWJvbXBfZ2V0X2xkZmxhZ3MoTElCT01QX0NPTkZJR1VSRURfTERGTEFHUykKK2FkZF9saWJyYXJ5KG9tcCBTSEFSRUQgJHtMSUJPTVBfU09VUkNFX0ZJTEVTfSkKK3NldF90YXJnZXRfcHJvcGVydGllcyhvbXAgUFJPUEVSVElFUworICBQUkVGSVggIiIgU1VGRklYICIiIE9VVFBVVF9OQU1FICIke0xJQk9NUF9MSUJfRklMRX0iCisgIExJTktfRkxBR1MgIiR7TElCT01QX0NPTkZJR1VSRURfTERGTEFHU30iCisgIExJTktFUl9MQU5HVUFHRSAke0xJQk9NUF9MSU5LRVJfTEFOR1VBR0V9CispCisKKyMgR2V0IHRoZSBsaWJyYXJ5J3MgbG9jYXRpb24gd2l0aGluIHRoZSBidWlsZCB0cmVlIGZvciB0aGUgdW5pdCB0ZXN0ZXIKK2dldF90YXJnZXRfcHJvcGVydHkoTElCT01QX0xJQlJBUllfRElSIG9tcCBMSUJSQVJZX09VVFBVVF9ESVJFQ1RPUlkpCitpZihOT1QgTElCT01QX0xJQlJBUllfRElSKQorICBzZXQoTElCT01QX0xJQlJBUllfRElSICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSkKKyAgc2V0KExJQk9NUF9MSUJSQVJZX0RJUiAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0gUEFSRU5UX1NDT1BFKQorZWxzZSgpCisgIHNldChMSUJPTVBfTElCUkFSWV9ESVIgJHtMSUJPTVBfTElCUkFSWV9ESVJ9IFBBUkVOVF9TQ09QRSkKK2VuZGlmKCkKKworIyBBZGQgc3ltYm9saWMgbGlua3MgdG8gbGlib21wCitpZihOT1QgV0lOMzIpCisgIGFkZF9jdXN0b21fY29tbWFuZChUQVJHRVQgb21wIFBPU1RfQlVJTEQKKyAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY3JlYXRlX3N5bWxpbmsgJHtMSUJPTVBfTElCX0ZJTEV9CisgICAgICBsaWJnb21wJHtDTUFLRV9TSEFSRURfTElCUkFSWV9TVUZGSVh9CisgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNyZWF0ZV9zeW1saW5rICR7TElCT01QX0xJQl9GSUxFfQorICAgICAgbGliaW9tcDUke0NNQUtFX1NIQVJFRF9MSUJSQVJZX1NVRkZJWH0KKyAgICBXT1JLSU5HX0RJUkVDVE9SWSAke0xJQk9NUF9MSUJSQVJZX0RJUn0KKyAgKQorZW5kaWYoKQorCisjIExpbmtpbmcgY29tbWFuZCB3aWxsIGluY2x1ZGUgbGlicmFyaWVzIGluIExJQk9NUF9DT05GSUdVUkVEX0xJQkZMQUdTCitsaWJvbXBfZ2V0X2xpYmZsYWdzKExJQk9NUF9DT05GSUdVUkVEX0xJQkZMQUdTKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKG9tcCAke0xJQk9NUF9DT05GSUdVUkVEX0xJQkZMQUdTfSAke0NNQUtFX0RMX0xJQlN9KQorCisjIENyZWF0ZSAqLmluYyBiZWZvcmUgY29tcGlsaW5nIGFueSBzb3VyY2VzCisjIG9iamVjdHMgZGVwZW5kIG9uIDogLmluYyBmaWxlcworYWRkX2N1c3RvbV90YXJnZXQobGlib21wLW5lZWRlZC1oZWFkZXJzIERFUEVORFMga21wX2kxOG5faWQuaW5jIGttcF9pMThuX2RlZmF1bHQuaW5jKQorYWRkX2RlcGVuZGVuY2llcyhvbXAgbGlib21wLW5lZWRlZC1oZWFkZXJzKQorCisjIFdpbmRvd3Mgc3BlY2lmaWMgYnVpbGQgcnVsZXMKK2lmKFdJTjMyKQorICBjb25maWd1cmVfZmlsZShsaWJvbXAucmMudmFyIGxpYm9tcC5yYyBAT05MWSkKKworICAjIENyZWF0ZSAuZGVmIGFuZCAucmMgZmlsZSBiZWZvcmUgY29tcGlsaW5nIGFueSBzb3VyY2VzCisgIGFkZF9jdXN0b21fdGFyZ2V0KGxpYm9tcC1uZWVkZWQtd2luZG93cy1maWxlcyBERVBFTkRTICR7TElCT01QX0xJQl9OQU1FfS5kZWYpCisgIGFkZF9kZXBlbmRlbmNpZXMob21wIGxpYm9tcC1uZWVkZWQtd2luZG93cy1maWxlcykKKyAgIyB6X1dpbmRvd3NfTlQtNTg2X2FzbS5hc20gcmVxdWlyZXMgZGVmaW5pdGlvbnMgdG8gYmUgc2VudCB2aWEgY29tbWFuZCBsaW5lCisgICMgSXQgb25seSBuZWVkcyB0aGUgYXJjaGl0ZWN1dHJlIG1hY3JvIGFuZCBPTVBUX1NVUFBPUlQ9MHwxCisgIGxpYm9tcF9hcHBlbmQoTElCT01QX01BU01fREVGSU5JVElPTlMgIl9NX0lBMzIiIElGX1RSVUUgSUEzMikKKyAgbGlib21wX2FwcGVuZChMSUJPTVBfTUFTTV9ERUZJTklUSU9OUyAiX01fQU1ENjQiIElGX1RSVUUgSU5URUw2NCkKKyAgbGlib21wX2FwcGVuZChMSUJPTVBfTUFTTV9ERUZJTklUSU9OUyAiT01QVF9TVVBQT1JUIiBJRl9UUlVFXzFfMCBMSUJPTVBfT01QVF9TVVBQT1JUKQorICBzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXMoel9XaW5kb3dzX05ULTU4Nl9hc20uYXNtIFBST1BFUlRJRVMgQ09NUElMRV9ERUZJTklUSU9OUyAiJHtMSUJPTVBfTUFTTV9ERUZJTklUSU9OU30iKQorICBzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXModGhpcmRwYXJ0eS9pdHRub3RpZnkvaXR0bm90aWZ5X3N0YXRpYy5jIFBST1BFUlRJRVMgQ09NUElMRV9ERUZJTklUSU9OUyAiVU5JQ09ERSIpCisKKyAgIyBDcmVhdGUgV2luZG93cyBpbXBvcnQgbGlicmFyeQorICAjIHRoZSBpbXBvcnQgbGlicmFyeSBpcyAicmUtbGlua2VkIiB0byBpbmNsdWRlIGttcF9pbXBvcnQuYyB3aGljaCBwcmV2ZW50cworICAjIGxpbmtpbmcgb2YgYm90aCBWaXN1YWwgU3R1ZGlvIE9wZW5NUCBhbmQgbmV3bHkgYnVpbHQgT3Blbk1QCisgIHNldF9zb3VyY2VfZmlsZXNfcHJvcGVydGllcyhrbXBfaW1wb3J0LmMgUFJPUEVSVElFUyBDT01QSUxFX0ZMQUdTICIke0xJQk9NUF9DT05GSUdVUkVEX0NGTEFHU30iKQorICBzZXQoTElCT01QX0lNUF9MSUJfRklMRSAke0xJQk9NUF9MSUJfTkFNRX0ke0NNQUtFX1NUQVRJQ19MSUJSQVJZX1NVRkZJWH0pCisgIHNldChMSUJPTVBfR0VORVJBVEVEX0lNUF9MSUJfRklMRU5BTUUgJHtMSUJPTVBfTElCX0ZJTEV9JHtDTUFLRV9TVEFUSUNfTElCUkFSWV9TVUZGSVh9KQorICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMob21wIFBST1BFUlRJRVMKKyAgICBWRVJTSU9OICR7TElCT01QX1ZFUlNJT05fTUFKT1J9LiR7TElCT01QX1ZFUlNJT05fTUlOT1J9ICMgdXNlcyAvdmVyc2lvbiBmbGFnCisgICAgSU1QT1JUX1BSRUZJWCAiIiBJTVBPUlRfU1VGRklYICIiICMgY29udHJvbCBnZW5lcmF0ZWQgaW1wb3J0IGxpYnJhcnkgbmFtZSB3aGVuIGJ1aWxkaW5nIG9tcAorICAgIEFSQ0hJVkVfT1VUUFVUX05BTUUgJHtMSUJPTVBfR0VORVJBVEVEX0lNUF9MSUJfRklMRU5BTUV9CisgICkKKyAgIyBHZXQgZ2VuZXJhdGVkIGltcG9ydCBsaWJyYXJ5IGZyb20gY3JlYXRpbmcgb21wCisgIGdldF90YXJnZXRfcHJvcGVydHkoTElCT01QX0lNUE9SVF9MSUJfRElSRUNUT1JZIG9tcCBBUkNISVZFX09VVFBVVF9ESVJFQ1RPUlkpCisgIGlmKExJQk9NUF9JTVBPUlRfTElCX0RJUkVDVE9SWSkKKyAgICBzZXQoTElCT01QX0dFTkVSQVRFRF9JTVBfTElCICR7TElCT01QX0lNUE9SVF9MSUJfRElSRUNUT1JZfS8ke0xJQk9NUF9HRU5FUkFURURfSU1QX0xJQl9GSUxFTkFNRX0pCisgIGVsc2UoKQorICAgIHNldChMSUJPTVBfR0VORVJBVEVEX0lNUF9MSUIgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9LyR7TElCT01QX0dFTkVSQVRFRF9JTVBfTElCX0ZJTEVOQU1FfSkKKyAgZW5kaWYoKQorICBzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXMoJHtMSUJPTVBfR0VORVJBVEVEX0lNUF9MSUJ9IFBST1BFUlRJRVMgR0VORVJBVEVEIFRSVUUgRVhURVJOQUxfT0JKRUNUIFRSVUUpCisgICMgQ3JlYXRlIG5ldyBpbXBvcnQgbGlicmFyeSB0aGF0IGlzIGp1c3QgdGhlIHByZXZpb3VzbHkgY3JlYXRlZCBvbmUgKyBrbXBfaW1wb3J0LmMKKyAgYWRkX2xpYnJhcnkob21waW1wIFNUQVRJQyAke0xJQk9NUF9HRU5FUkFURURfSU1QX0xJQn0ga21wX2ltcG9ydC5jKQorICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMob21waW1wIFBST1BFUlRJRVMKKyAgICBQUkVGSVggIiIgU1VGRklYICIiIE9VVFBVVF9OQU1FICIke0xJQk9NUF9JTVBfTElCX0ZJTEV9IgorICAgIExJTktFUl9MQU5HVUFHRSBDCisgICkKKyAgYWRkX2RlcGVuZGVuY2llcyhvbXBpbXAgb21wKSAjIGVuc3VyZSBnZW5lcmF0ZWQgaW1wb3J0IGxpYnJhcnkgaXMgY3JlYXRlZCBmaXJzdAorCisgICMgQ3JlYXRlIGRlZiBmaWxlIHRvIGRlc2lnbmF0ZSBleHBvcnRlZCBmdW5jdGlvbnMKKyAgbGlib21wX2dldF9nZGZsYWdzKExJQk9NUF9HREZMQUdTKSAjIGdlbmVyYXRlLWRlZi5wbCBmbGFncyAoV2luZG93cyBvbmx5KQorICBsaWJvbXBfc3RyaW5nX3RvX2xpc3QoIiR7TElCT01QX0dERkxBR1N9IiBMSUJPTVBfR0RGTEFHUykKKyAgYWRkX2N1c3RvbV9jb21tYW5kKAorICAgIE9VVFBVVCAgJHtMSUJPTVBfTElCX05BTUV9LmRlZgorICAgIENPTU1BTkQgJHtQRVJMX0VYRUNVVEFCTEV9ICR7TElCT01QX1RPT0xTX0RJUn0vZ2VuZXJhdGUtZGVmLnBsICR7TElCT01QX0dERkxBR1N9CisgICAgICAtbyAke0xJQk9NUF9MSUJfTkFNRX0uZGVmICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9kbGxleHBvcnRzCisgICAgREVQRU5EUyAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vZGxsZXhwb3J0cyAke0xJQk9NUF9UT09MU19ESVJ9L2dlbmVyYXRlLWRlZi5wbAorICApCitlbmRpZigpCisKKyMgQnVpbGRpbmcgdGhlIEZvcnRyYW4gbW9kdWxlIGZpbGVzCisjIE9uZSBjb21waWxhdGlvbiBzdGVwIGNyZWF0ZXMgYm90aCBvbXBfbGliLm1vZCBhbmQgb21wX2xpYl9raW5kcy5tb2QKK2lmKCR7TElCT01QX0ZPUlRSQU5fTU9EVUxFU30pCisgIGNvbmZpZ3VyZV9maWxlKCR7TElCT01QX0lOQ19ESVJ9L29tcF9saWIuaC52YXIgb21wX2xpYi5oIEBPTkxZKQorICBjb25maWd1cmVfZmlsZSgke0xJQk9NUF9JTkNfRElSfS9vbXBfbGliLmYudmFyIG9tcF9saWIuZiBAT05MWSkKKyAgY29uZmlndXJlX2ZpbGUoJHtMSUJPTVBfSU5DX0RJUn0vb21wX2xpYi5mOTAudmFyIG9tcF9saWIuZjkwIEBPTkxZKQorICBhZGRfY3VzdG9tX3RhcmdldChsaWJvbXAtbW9kIEFMTCBERVBFTkRTIG9tcF9saWIubW9kIG9tcF9saWJfa2luZHMubW9kKQorICBsaWJvbXBfZ2V0X2ZmbGFncyhMSUJPTVBfQ09ORklHVVJFRF9GRkxBR1MpCisgIGlmKENNQUtFX0ZvcnRyYW5fQ09NUElMRVJfU1VQUE9SVFNfRjkwKQorICAgIHNldChMSUJPTVBfRk9SVFJBTl9TT1VSQ0VfRklMRSBvbXBfbGliLmY5MCkKKyAgZWxzZSgpCisgICAgc2V0KExJQk9NUF9GT1JUUkFOX1NPVVJDRV9GSUxFIG9tcF9saWIuZikKKyAgZW5kaWYoKQorICBhZGRfY3VzdG9tX2NvbW1hbmQoCisgICAgT1VUUFVUIG9tcF9saWIubW9kIG9tcF9saWJfa2luZHMubW9kCisgICAgQ09NTUFORCAke0NNQUtFX0ZvcnRyYW5fQ09NUElMRVJ9IC1jICR7TElCT01QX0NPTkZJR1VSRURfRkZMQUdTfSAke0xJQk9NUF9GT1JUUkFOX1NPVVJDRV9GSUxFfQorICAgIERFUEVORFMgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9LyR7TElCT01QX0ZPUlRSQU5fU09VUkNFX0ZJTEV9CisgICAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vb21wX2xpYi5oCisgICkKKyAgc2V0X2RpcmVjdG9yeV9wcm9wZXJ0aWVzKFBST1BFUlRJRVMgQURESVRJT05BTF9NQUtFX0NMRUFOX0ZJTEVTIG9tcF9saWIke0NNQUtFX0NfT1VUUFVUX0VYVEVOU0lPTn0pCitlbmRpZigpCisKKyMgTW92ZSBmaWxlcyB0byBleHBvcnRzLyBkaXJlY3RvcnkgaWYgcmVxdWVzdGVkCitpZigke0xJQk9NUF9DT1BZX0VYUE9SVFN9KQorICBpbmNsdWRlKExpYm9tcEV4cG9ydHMpCitlbmRpZigpCisKKyMgTWljcm8gdGVzdCBydWxlcyBmb3IgYWZ0ZXIgbGlicmFyeSBoYXMgYmVlbiBidWlsdCAoY21ha2UvTGlib21wTWljcm9UZXN0cy5jbWFrZSkKK2luY2x1ZGUoTGlib21wTWljcm9UZXN0cykKK2FkZF9jdXN0b21fdGFyZ2V0KGxpYm9tcC1taWNyby10ZXN0cykKK2lmKE5PVCAke01JQ30gQU5EIE5PVCBDTUFLRV9DUk9TU0NPTVBJTElORykKKyAgYWRkX2RlcGVuZGVuY2llcyhsaWJvbXAtbWljcm8tdGVzdHMgbGlib21wLXRlc3QtdG91Y2gpCitlbmRpZigpCitpZihOT1QgV0lOMzIgQU5EIE5PVCBBUFBMRSkKKyAgYWRkX2RlcGVuZGVuY2llcyhsaWJvbXAtbWljcm8tdGVzdHMgbGlib21wLXRlc3QtcmVsbykKK2VuZGlmKCkKK2lmKE5PVCBXSU4zMiBBTkQgTk9UIEFQUExFKQorICBhZGRfZGVwZW5kZW5jaWVzKGxpYm9tcC1taWNyby10ZXN0cyBsaWJvbXAtdGVzdC1leGVjc3RhY2spCitlbmRpZigpCitpZigke01JQ30pCisgIGFkZF9kZXBlbmRlbmNpZXMobGlib21wLW1pY3JvLXRlc3RzIGxpYm9tcC10ZXN0LWluc3RyKQorZW5kaWYoKQorYWRkX2RlcGVuZGVuY2llcyhsaWJvbXAtbWljcm8tdGVzdHMgbGlib21wLXRlc3QtZGVwcykKKworIyBJbnN0YWxsIHJ1bGVzCisjIFdlIHdhbnQgdG8gaW5zdGFsbCBsaWJvbXAgaW4gREVTVERJUi9DTUFLRV9JTlNUQUxMX1BSRUZJWC9saWIKKyMgV2Ugd2FudCB0byBpbnN0YWxsIGhlYWRlcnMgaW4gREVTVERJUi9DTUFLRV9JTlNUQUxMX1BSRUZJWC9pbmNsdWRlCitpZigke0xJQk9NUF9TVEFOREFMT05FX0JVSUxEfSkKKyAgc2V0KExJQk9NUF9IRUFERVJTX0lOU1RBTExfUEFUSCBpbmNsdWRlKQorZWxzZSgpCisgIHN0cmluZyhSRUdFWCBNQVRDSCAiWzAtOV0rXFwuWzAtOV0rKFxcLlswLTldKyk/IiBDTEFOR19WRVJTSU9OICR7UEFDS0FHRV9WRVJTSU9OfSkKKyAgc2V0KExJQk9NUF9IRUFERVJTX0lOU1RBTExfUEFUSCBsaWIke0xJQk9NUF9MSUJESVJfU1VGRklYfS9jbGFuZy8ke0NMQU5HX1ZFUlNJT059L2luY2x1ZGUpCitlbmRpZigpCitpZihXSU4zMikKKyAgaW5zdGFsbChUQVJHRVRTIG9tcCBSVU5USU1FIERFU1RJTkFUSU9OIGJpbikKKyAgaW5zdGFsbChUQVJHRVRTIG9tcGltcCBBUkNISVZFIERFU1RJTkFUSU9OIGxpYiR7TElCT01QX0xJQkRJUl9TVUZGSVh9KQorICAjIENyZWF0ZSBhbGlhc2VzIChyZWd1bGFyIGNvcGllcykgb2YgdGhlIGxpYnJhcnkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CisgIHNldChMSUJPTVBfQUxJQVNFUyAibGliaW9tcDVtZCIpCisgIGZvcmVhY2goYWxpYXMgSU4gTElTVFMgTElCT01QX0FMSUFTRVMpCisgICAgaW5zdGFsbChDT0RFICJleGVjdXRlX3Byb2Nlc3MoQ09NTUFORCBcIlwke0NNQUtFX0NPTU1BTkR9XCIgLUUgY29weSBcIiR7TElCT01QX0xJQl9GSUxFfVwiCisgICAgICBcIiR7YWxpYXN9JHtDTUFLRV9TSEFSRURfTElCUkFSWV9TVUZGSVh9XCIgV09SS0lOR19ESVJFQ1RPUlkgXCR7Q01BS0VfSU5TVEFMTF9QUkVGSVh9L2JpbikiKQorICAgIGluc3RhbGwoQ09ERSAiZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgXCJcJHtDTUFLRV9DT01NQU5EfVwiIC1FIGNvcHkgXCIke0xJQk9NUF9JTVBfTElCX0ZJTEV9XCIKKyAgICAgIFwiJHthbGlhc30ke0NNQUtFX1NUQVRJQ19MSUJSQVJZX1NVRkZJWH1cIiBXT1JLSU5HX0RJUkVDVE9SWSBcJHtDTUFLRV9JTlNUQUxMX1BSRUZJWH0vbGliJHtMSUJPTVBfTElCRElSX1NVRkZJWH0pIikKKyAgZW5kZm9yZWFjaCgpCitlbHNlKCkKKyAgaW5zdGFsbChUQVJHRVRTIG9tcCBMSUJSQVJZIERFU1RJTkFUSU9OIGxpYiR7TElCT01QX0xJQkRJUl9TVUZGSVh9KQorICAjIENyZWF0ZSBhbGlhc2VzIChzeW1saW5rcykgb2YgdGhlIGxpYnJhcnkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CisgIHNldChMSUJPTVBfQUxJQVNFUyAibGliZ29tcDtsaWJpb21wNSIpCisgIGZvcmVhY2goYWxpYXMgSU4gTElTVFMgTElCT01QX0FMSUFTRVMpCisgICAgaW5zdGFsbChDT0RFICJleGVjdXRlX3Byb2Nlc3MoQ09NTUFORCBcIlwke0NNQUtFX0NPTU1BTkR9XCIgLUUgY3JlYXRlX3N5bWxpbmsgXCIke0xJQk9NUF9MSUJfRklMRX1cIgorICAgICAgXCIke2FsaWFzfSR7Q01BS0VfU0hBUkVEX0xJQlJBUllfU1VGRklYfVwiIFdPUktJTkdfRElSRUNUT1JZCisgICAgICBcJEVOVntERVNURElSfVwke0NNQUtFX0lOU1RBTExfUFJFRklYfS9saWIke0xJQk9NUF9MSUJESVJfU1VGRklYfSkiKQorICBlbmRmb3JlYWNoKCkKK2VuZGlmKCkKK2luc3RhbGwoCisgIEZJTEVTCisgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9vbXAuaAorICBERVNUSU5BVElPTiAke0xJQk9NUF9IRUFERVJTX0lOU1RBTExfUEFUSH0KKykKK2lmKCR7TElCT01QX09NUFRfU1VQUE9SVH0pCisgIGluc3RhbGwoRklMRVMgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L29tcHQuaCBERVNUSU5BVElPTiAke0xJQk9NUF9IRUFERVJTX0lOU1RBTExfUEFUSH0pCitlbmRpZigpCitpZigke0xJQk9NUF9GT1JUUkFOX01PRFVMRVN9KQorICBpbnN0YWxsKEZJTEVTCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L29tcF9saWIuaAorICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9vbXBfbGliLm1vZAorICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9vbXBfbGliX2tpbmRzLm1vZAorICAgIERFU1RJTkFUSU9OICR7TElCT01QX0hFQURFUlNfSU5TVEFMTF9QQVRIfQorICApCitlbmRpZigpCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2RsbGV4cG9ydHMgYi9maW5hbC9ydW50aW1lL3NyYy9kbGxleHBvcnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhN2Q3MzYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9kbGxleHBvcnRzCkBAIC0wLDAgKzEsOTgyIEBACisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgRGVwcmVjYXRlZCBlbnRyeSBwb2ludHMgKG51bWJlcnMgYXJlIHJlc2VydmVkKToKKy0gX19rbXBjX2JhcnJpZXJfcmVkdWNlX21hc3RlciAgICAgICAgICAgICAgMTA5CistIF9fa21wY19lbmRfYmFycmllcl9yZWR1Y2VfbWFzdGVyICAgICAgICAgIDEyMgorLSBfX2ttcGNfZm9yX2luaXRfNCAgICAgICAgICAgICAgICAgICAgICAgICAxMzEKKy0gX19rbXBjX2Zvcl9pbml0XzggICAgICAgICAgICAgICAgICAgICAgICAgMTMyCistIF9fa21wY19mb3JfbmV4dF80ICAgICAgICAgICAgICAgICAgICAgICAgIDEzMworLSBfX2ttcGNfZm9yX25leHRfOCAgICAgICAgICAgICAgICAgICAgICAgICAxMzQKKy0gX19rbXBjX2ZvcmtfY2FsbF9ib3VuZCAgICAgICAgICAgICAgICAgICAgMTM5CistIF9fa21wY19yZWR1Y2VfbWFzdGVyX25vd2FpdCAgICAgICAgICAgICAgIDE0OQorLSBfX2ttcGNfb21wX3Rhc2tfYmVnaW4gICAgICAgICAgICAgICAgICAgICAxOTQKKy0gX19rbXBjX29tcF90YXNrX2NvbXBsZXRlICAgICAgICAgICAgICAgICAgMTk1CistIGttcGNfc2hhcmFibGVfY2FsbG9jICAgICAgICAgICAgICAgICAgICAgIDIxOAorLSBrbXBjX3NoYXJhYmxlX2ZyZWUgICAgICAgICAgICAgICAgICAgICAgICAyMTkKKy0ga21wY19zaGFyYWJsZV9tYWxsb2MgICAgICAgICAgICAgICAgICAgICAgMjIwCistIGttcGNfc2hhcmFibGVfcmVhbGxvYyAgICAgICAgICAgICAgICAgICAgIDIyMQorLSBrbXBjX2FsaWduZWRfc2hhcmFibGVfbWFsbG9jICAgICAgICAgICAgICAyMjMKKy0gbXBhaTRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTAwCistIG1wYWk4YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwMQorLSBtcGFyNGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MDIKKy0gbXBhcjhhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTAzCistIG1wYXg0eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwNAorLSBtcGF4OHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MDUKKy0gbXBvYmFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTA2CistIG1wb2ViciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwNworLSBtcG9mb3JrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MDgKKy0gbXBvZnJrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTA5CistIG1wb2pvaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxMAorLSBtcG94YnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTEKKy0gbXBwYWRqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTEyCistIG1wcGFmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxMworLSBtcHBiYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTQKKy0gbXBwYmVnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTE1CistIG1wcGRlbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxNgorLSBtcHBkbnggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTcKKy0gbXBwZG54ZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTE4CistIG1wcGRvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxOQorLSBtcHBkeG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MjAKKy0gbXBwZWJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTIxCistIG1wcGVjcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUyMgorLSBtcHBlbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MjMKKy0gbXBwZW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTI0CistIG1wcGVuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUyNQorLSBtcHBlcGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MjYKKy0gbXBwZXNwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTI3CistIG1wcGZrZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUyOAorLSBtcHBma3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MjkKKy0gbXBwZm9yayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTMwCistIG1wcGZyayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUzMQorLSBtcHBpb2EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MzIKKy0gbXBwaXdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTMzCistIG1wcGpvaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUzNAorLSBtcHBudGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MzUKKy0gbXBwcHFhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTM2CistIG1wcHBxYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUzNworLSBtcHBwcXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MzgKKy0gbXBwdGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTM5CistIG1wcHRwYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU0MAorLSBtcHB0cGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NDEKKy0gbXBwdHB6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTQyCistIG1wcHZzeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU0MworLSBtcHB4YnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NDQKKy0gbXBweGNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTQ1CistIG1wcHhtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU0NgorLSBtcHB4bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NDcKKy0gbXBweHBhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTQ4CistIG1wcHhwciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU0OQorLSBtcHB4c3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NTAKKy0gbXBweHRoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTUxCistIG1wc2JhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU1MgorLSBtcHNjcHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1OTcKKy0gbXBzZWJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTUzCistIG1wc2VyZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU1NAorLSBtcHNmZDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NTUKKy0gbXBzZmQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTU2CistIG1wc2lkNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU1NworLSBtcHNpZDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NTgKKy0gbXBzbmQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTU5CistIG1wc25kOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU2MAorLSBtcHNvbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NjEKKy0gbXBzcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTYyCistIG1wc3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU2MworLSBtcHN4YnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NjQKKy0gbXBzeHJkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTY1CistIG1wdGFkaiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU2NgorLSBtcHRhZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NjcKKy0gbXB0YmFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTY4CistIG1wdGRlbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU2OQorLSBtcHRkaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NzAKKy0gbXB0ZGluZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTcxCistIG1wdGRueCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU3MgorLSBtcHRkbnhkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NzMKKy0gbXB0ZG9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTc0CistIG1wdGR4byAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU3NQorLSBtcHRlYnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NzYKKy0gbXB0ZWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTc3CistIG1wdGVtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU3OAorLSBtcHRlbmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NzkKKy0gbXB0ZXBhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTgwCistIG1wdGVzcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU4MQorLSBtcHRma2QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1ODIKKy0gbXB0cHBhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTgzCistIG1wdHBwYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU4NAorLSBtcHRwcHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1ODUKKy0gbXB0dHBhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTg2CistIG1wdHRwYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU4NworLSBtcHR0cHogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1ODgKKy0gbXB0dnN5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTg5CistIG1wdHhiciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU5MAorLSBtcHR4Y3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1OTEKKy0gbXB0eG1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTkyCistIG1wdHhuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU5MworLSBtcHR4cGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1OTQKKy0gbXB0eHNwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTk1CistIG1wcGNwciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU5NgorLSBmdG5fc2V0X2xpYnJhcnlfZ2FuZyAgICAgICAgICAgICAgICAgICAgICA3MzYKKy0ga21wX3NldF9saWJyYXJ5X2dhbmcKKy0ga21wX3NoYXJhYmxlX2NhbGxvYyAgICAgICAgICAgICAgICAgICAgICAgNzYwCistIGttcF9zaGFyYWJsZV9mcmVlICAgICAgICAgICAgICAgICAgICAgICAgIDc2MQorLSBrbXBfc2hhcmFibGVfbWFsbG9jICAgICAgICAgICAgICAgICAgICAgICA3NjIKKy0ga21wX3NoYXJhYmxlX3JlYWxsb2MgICAgICAgICAgICAgICAgICAgICAgNzYzCistIGttcF9hbGlnbmVkX3NoYXJhYmxlX21hbGxvYyAgICAgICAgICAgICAgIDc2NAorLSBrbXBfZGVmZXJyZWRfYXRvbWljX2FkZF9pNCAgICAgICAgICAgICAgICA3NjUKKy0ga21wX2RlZmVycmVkX2F0b21pY19hZGRfaTggICAgICAgICAgICAgICAgNzY2CistIGttcF9kZWZlcnJlZF9hdG9taWNfYWRkX3I0ICAgICAgICAgICAgICAgIDc2NworLSBrbXBfZGVmZXJyZWRfYXRvbWljX2FkZF9yOCAgICAgICAgICAgICAgICA3NjgKKy0ga21wX2xvY2tfY29uZF93YWl0ICAgICAgICAgICAgICAgICAgICAgICAgNzcwCistIGttcF9sb2NrX2NvbmRfc2lnbmFsICAgICAgICAgICAgICAgICAgICAgIDc3MQorLSBrbXBfbG9ja19jb25kX2Jyb2FkY2FzdCAgICAgICAgICAgICAgICAgICA3NzIKKy0ga21wX25lc3RfbG9ja19jb25kX3dhaXQgICAgICAgICAgICAgICAgICAgNzczCistIGttcF9uZXN0X2xvY2tfY29uZF9zaWduYWwgICAgICAgICAgICAgICAgIDc3NAorLSBrbXBfbmVzdF9sb2NrX2NvbmRfYnJvYWRjYXN0ICAgICAgICAgICAgICA3NzUKKy0ga21wX2dldF9wcm9jZXNzX251bSAgICAgICAgICAgICAgICAgICAgICAgNzgxCistIGttcF9nZXRfbnVtX3Byb2Nlc3NlcyAgICAgICAgICAgICAgICAgICAgIDc4MgorLSBrbXBfZ2V0X3Byb2Nlc3NfdGhyZWFkX251bSAgICAgICAgICAgICAgICA3ODMKKy0ga21wX3ByaXZhdGVfbW1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgNzg0ICAgIyBub3QgaW1wbGVtZW50ZWQ/CistIGttcF9zaGFyYWJsZV9tbWFwICAgICAgICAgICAgICAgICAgICAgICAgIDc4NSAgICMgbm90IGltcGxlbWVudGVkPworLSBrbXBfcHJpdmF0ZV9tdW5tYXAgICAgICAgICAgICAgICAgICAgICAgICA3ODYgICAjIG5vdCBpbXBsZW1lbnRlZD8KKy0ga21wX3NoYXJhYmxlX211bm1hcCAgICAgICAgICAgICAgICAgICAgICAgNzg3ICAgIyBub3QgaW1wbGVtZW50ZWQ/CistIGttcF9pc19zaGFyYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgIDc4OCAgICMgbm90IGltcGxlbWVudGVkPworCislaWZuZGVmIHN0dWIKKworCisgICAgIworICAgICMgVGhlIGZvbGxvd2luZyBlbnRyeSBwb2ludHMgYXJlIGFkZGVkIHNvIHRoYXQgdGhlIGJhY2t0cmFjZXMgZnJvbQorICAgICMgdGhlIHRvb2xzIGNvbnRhaW4gbWVhbmluZ2Z1bCBuYW1lcyBmb3IgYWxsIHRoZSBmdW5jdGlvbnMgdGhhdCBtaWdodAorICAgICMgYXBwZWFyIGluIGEgYmFja3RyYWNlIG9mIGEgdGhyZWFkIHdoaWNoIGlzIGJsb2NrZWQgaW4gdGhlIFJUTC4KKyAgICAjCisKKyAgICAjIFJlZ3VsYXIgZW50cnkgcG9pbnRzCisgICAgICAgIF9fa21wX3dhaXRfeWllbGRfNAorICAgICAgICBfX2ttcF9mb3JrX2NhbGwKKyAgICAgICAgX19rbXBfaW52b2tlX21pY3JvdGFzaworICAgICAgICBfX2ttcF9sYXVuY2hfbW9uaXRvcgorICAgICAgICBfX2ttcF9sYXVuY2hfd29ya2VyCisgICAgICAgIF9fa21wX3JlYXBfbW9uaXRvcgorICAgICAgICBfX2ttcF9yZWFwX3dvcmtlcgorICAgICAgICBfX2ttcF9hY3F1aXJlX3Rhc19sb2NrCisgICAgICAgIF9fa21wX2FjcXVpcmVfbmVzdGVkX3Rhc19sb2NrCisgICAgICAgIF9fa21wX2FjcXVpcmVfdGlja2V0X2xvY2sKKyAgICAgICAgX19rbXBfYWNxdWlyZV9uZXN0ZWRfdGlja2V0X2xvY2sKKyAgICAgICAgX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2sKKyAgICAgICAgX19rbXBfYWNxdWlyZV9uZXN0ZWRfcXVldWluZ19sb2NrCisgICAgICAgIF9fa21wX2FjcXVpcmVfZHJkcGFfbG9jaworICAgICAgICBfX2ttcF9hY3F1aXJlX25lc3RlZF9kcmRwYV9sb2NrCisKKyAgICAlaWZkZWYgS01QX0RFQlVHCisgICAgICAgICMgYWxsb3dzIGNvbnNvbGUgb3V0cHV0IGNhcGFiaWxpdHkgZm9yIGFwcGxpY2F0aW9ucyB0aG9zZSBkb24ndCBoYXZlIGl0CisgICAgICAgIF9fa21wX3ByaW50ZgorICAgICVlbmRpZgorCisKKyAgICAlaWZkZWYgVVNFX0RFQlVHR0VSCisgICAgICAgIF9fa21wX2RlYnVnZ2luZyAgICAgICAgICAgICAgICAgICAgICAgICBEQVRBCisgICAgICAgIF9fa21wX29tcF9kZWJ1Z19zdHJ1Y3RfaW5mbyAgICAgICAgICAgICBEQVRBCisgICAgJWVuZGlmIAorCisgICAgICAgICMgU3ltYm9scyBmb3IgTVMgbXV0dWFsIGRldGVjdGlvbjoKKyAgICAgICAgX1lvdV9tdXN0X2xpbmtfd2l0aF9leGFjdGx5X29uZV9PcGVuTVBfbGlicmFyeSAgICBEQVRBCisgICAgICAgIF9Zb3VfbXVzdF9saW5rX3dpdGhfSW50ZWxfT3Blbk1QX2xpYnJhcnkgICAgICAgICAgREFUQQorICAgICAgICAlaWZkZWYgbXN2Y19jb21wYXQKKyAgICAgICAgICAgIF9Zb3VfbXVzdF9saW5rX3dpdGhfTWljcm9zb2Z0X09wZW5NUF9saWJyYXJ5ICBEQVRBCisgICAgICAgICVlbmRpZgorCisgICAgICAgIF9fa21wX3dhaXRfMzIKKyAgICAgICAgX19rbXBfd2FpdF82NAorICAgICAgICBfX2ttcF93YWl0X29uY29yZQorICAgICAgICBfX2ttcF9yZWxlYXNlXzMyCisgICAgICAgIF9fa21wX3JlbGVhc2VfNjQKKyAgICAgICAgX19rbXBfcmVsZWFzZV9vbmNvcmUKKworCisjICAgIFZUX2dldHRoaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjICAgIHZ0Z3RoaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCisKKyAgICBfX2ttcGNfYXRvbWljXzQgICAgICAgICAgICAgICAgICAgICAgICAgMTAwCisgICAgX19rbXBjX2F0b21pY184ICAgICAgICAgICAgICAgICAgICAgICAgIDEwMQorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2FkZCAgICAgICAgICAgICAgICAxMDIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hZGQgICAgICAgICAgICAgICAgMTAzCisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfYWRkICAgICAgICAgICAgICAgIDEwNAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X2FkZCAgICAgICAgICAgICAgICAxMDUKKyAgICBfX2ttcGNfYmFycmllciAgICAgICAgICAgICAgICAgICAgICAgICAgMTA2CisgICAgX19rbXBjX2JhcnJpZXJfbWFzdGVyICAgICAgICAgICAgICAgICAgIDEwNworICAgIF9fa21wY19iYXJyaWVyX21hc3Rlcl9ub3dhaXQgICAgICAgICAgICAxMDgKKyAgICBfX2ttcGNfYmVnaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwCisgICAgX19rbXBjX2JvdW5kX251bV90aHJlYWRzICAgICAgICAgICAgICAgIDExMQorICAgIF9fa21wY19ib3VuZF90aHJlYWRfbnVtICAgICAgICAgICAgICAgICAxMTIKKyAgICBfX2ttcGNfY3JpdGljYWwgICAgICAgICAgICAgICAgICAgICAgICAgMTEzCisgICAgX19rbXBjX2Rpc3BhdGNoX2ZpbmlfNCAgICAgICAgICAgICAgICAgIDExNAorICAgIF9fa21wY19kaXNwYXRjaF9maW5pXzggICAgICAgICAgICAgICAgICAxMTUKKyAgICBfX2ttcGNfZGlzcGF0Y2hfaW5pdF80ICAgICAgICAgICAgICAgICAgMTE2CisgICAgX19rbXBjX2Rpc3BhdGNoX2luaXRfOCAgICAgICAgICAgICAgICAgIDExNworICAgIF9fa21wY19kaXNwYXRjaF9uZXh0XzQgICAgICAgICAgICAgICAgICAxMTgKKyAgICBfX2ttcGNfZGlzcGF0Y2hfbmV4dF84ICAgICAgICAgICAgICAgICAgMTE5CisgICAgX19rbXBjX2VuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMAorICAgIF9fa21wY19lbmRfYmFycmllcl9tYXN0ZXIgICAgICAgICAgICAgICAxMjEKKyAgICBfX2ttcGNfZW5kX2NyaXRpY2FsICAgICAgICAgICAgICAgICAgICAgMTIzCisgICAgX19rbXBjX2VuZF9tYXN0ZXIgICAgICAgICAgICAgICAgICAgICAgIDEyNAorICAgIF9fa21wY19lbmRfb3JkZXJlZCAgICAgICAgICAgICAgICAgICAgICAxMjUKKyAgICBfX2ttcGNfZW5kX3NlcmlhbGl6ZWRfcGFyYWxsZWwgICAgICAgICAgMTI2CisgICAgX19rbXBjX2VuZF9zaW5nbGUgICAgICAgICAgICAgICAgICAgICAgIDEyNworICAgIF9fa21wY19lbmRfdGFza3EgICAgICAgICAgICAgICAgICAgICAgICAxMjgKKyAgICBfX2ttcGNfZW5kX3Rhc2txX3Rhc2sgICAgICAgICAgICAgICAgICAgMTI5CisgICAgX19rbXBjX2ZsdXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzMAorICAgIF9fa21wY19mb3Jfc3RhdGljX2ZpbmkgICAgICAgICAgICAgICAgICAxMzUKKyAgICBfX2ttcGNfZm9yX3N0YXRpY19pbml0XzQgICAgICAgICAgICAgICAgMTM2CisgICAgX19rbXBjX2Zvcl9zdGF0aWNfaW5pdF84ICAgICAgICAgICAgICAgIDEzNworICAgIF9fa21wY19mb3JrX2NhbGwgICAgICAgICAgICAgICAgICAgICAgICAxMzgKKyAgICBfX2ttcGNfZ2xvYmFsX251bV90aHJlYWRzICAgICAgICAgICAgICAgMTQwCisgICAgX19rbXBjX2dsb2JhbF90aHJlYWRfbnVtICAgICAgICAgICAgICAgIDE0MQorICAgIF9fa21wY19pbl9wYXJhbGxlbCAgICAgICAgICAgICAgICAgICAgICAxNDIKKyAgICBfX2ttcGNfaW52b2tlX3Rhc2tfZnVuYyAgICAgICAgICAgICAgICAgMTQzCisgICAgX19rbXBjX21hc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0NAorICAgIF9fa21wY19va190b19mb3JrICAgICAgICAgICAgICAgICAgICAgICAxNDUKKyAgICBfX2ttcGNfb3JkZXJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgMTQ2CisgICAgX19rbXBjX3BvcF9udW1fdGhyZWFkcyAgICAgICAgICAgICAgICAgIDE0NworICAgIF9fa21wY19wdXNoX251bV90aHJlYWRzICAgICAgICAgICAgICAgICAxNDgKKyAgICBfX2ttcGNfc2VyaWFsaXplZF9wYXJhbGxlbCAgICAgICAgICAgICAgMTUwCisgICAgX19rbXBjX3NpbmdsZSAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1MQorICAgIF9fa21wY190YXNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTIKKyAgICBfX2ttcGNfdGFza19idWZmZXIgICAgICAgICAgICAgICAgICAgICAgMTUzCisgICAgX19rbXBjX3Rhc2txICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1NAorICAgIF9fa21wY190YXNrcV90YXNrICAgICAgICAgICAgICAgICAgICAgICAxNTUKKyAgICBfX2ttcGNfdGhyZWFkcHJpdmF0ZSAgICAgICAgICAgICAgICAgICAgMTU2CisgICAgX19rbXBjX3RocmVhZHByaXZhdGVfY2FjaGVkICAgICAgICAgICAgIDE1NworICAgIF9fa21wY190aHJlYWRwcml2YXRlX3JlZ2lzdGVyICAgICAgICAgICAxNTgKKyAgICBfX2ttcGNfdGhyZWFkcHJpdmF0ZV9yZWdpc3Rlcl92ZWMgICAgICAgMTU5CisjICAgIF9fa21wY19zc3BfYmVnaW4gICAgICAgICAgICAgICAgICAgICAgICAxNjAKKyMgICAgX19rbXBjX3NzcF9mb3JrICAgICAgICAgICAgICAgICAgICAgICAgIDE2MQorIyAgICBfX2ttcGNfc3NwX2VuZCAgICAgICAgICAgICAgICAgICAgICAgICAgMTYyCisjICAgIF9fa21wY19zc3BfcG9zdF80ICAgICAgICAgICAgICAgICAgICAgICAxNjMKKyMgICAgX19rbXBjX3NzcF9wb3N0XzggICAgICAgICAgICAgICAgICAgICAgIDE2NAorIyAgICBfX2ttcGNfc3NwX3dhaXRfNCAgICAgICAgICAgICAgICAgICAgICAgMTY1CisjICAgIF9fa21wY19zc3Bfd2FpdF84ICAgICAgICAgICAgICAgICAgICAgICAxNjYKKyMgICAgX19rbXBjX3NzcF9kaXN0YW5jZV80ICAgICAgICAgICAgICAgICAgIDE2NworIyAgICBfX2ttcGNfc3NwX2Rpc3RhbmNlXzggICAgICAgICAgICAgICAgICAgMTY4CisjICAgIF9fa21wY19pbl9zc3AgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjkKKyMgICAgX19rbXBjX3NzcF90aHJlYWRfbnVtICAgICAgICAgICAgICAgICAgIDE3MAorIyAgICBfX2ttcGNfc3NwX251bV90aHJlYWRzICAgICAgICAgICAgICAgICAgMTcxCisgICAgX19rbXBjX2NvcHlwcml2YXRlICAgICAgICAgICAgICAgICAgICAgIDE3MgorIyAgICBfX2ttcGNfc3NwX2dldF9tYXhfdGhyZWFkcyAgICAgICAgICAgICAgMTczCisjICAgIF9fa21wY19zc3Bfc2V0X21heF90aHJlYWRzICAgICAgICAgICAgICAxNzQKKyAgICBfX2ttcGNfaW5pdF9sb2NrICAgICAgICAgICAgICAgICAgICAgICAgMTc1CisgICAgX19rbXBjX2Rlc3Ryb3lfbG9jayAgICAgICAgICAgICAgICAgICAgIDE3NgorICAgIF9fa21wY19zZXRfbG9jayAgICAgICAgICAgICAgICAgICAgICAgICAxNzcKKyAgICBfX2ttcGNfdW5zZXRfbG9jayAgICAgICAgICAgICAgICAgICAgICAgMTc4CisgICAgX19rbXBjX3Rlc3RfbG9jayAgICAgICAgICAgICAgICAgICAgICAgIDE3OQorICAgIF9fa21wY19pbml0X25lc3RfbG9jayAgICAgICAgICAgICAgICAgICAxODAKKyAgICBfX2ttcGNfZGVzdHJveV9uZXN0X2xvY2sgICAgICAgICAgICAgICAgMTgxCisgICAgX19rbXBjX3NldF9uZXN0X2xvY2sgICAgICAgICAgICAgICAgICAgIDE4MgorICAgIF9fa21wY191bnNldF9uZXN0X2xvY2sgICAgICAgICAgICAgICAgICAxODMKKyAgICBfX2ttcGNfdGVzdF9uZXN0X2xvY2sgICAgICAgICAgICAgICAgICAgMTg0CisjICAgIF9fa21wY19zc3BfaW5pdF90aHJlYWQgICAgICAgICAgICAgICAgICAxODUKKyMgICAgX19rbXBjX3NzcF9zZXRfZXZlbnQgICAgICAgICAgICAgICAgICAgIDE4NgorICAgIF9fa21wY19yZWR1Y2Vfbm93YWl0ICAgICAgICAgICAgICAgICAgICAxODcKKyAgICBfX2ttcGNfZW5kX3JlZHVjZV9ub3dhaXQgICAgICAgICAgICAgICAgMTg4CisgICAgX19rbXBjX3JlZHVjZSAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4OQorICAgIF9fa21wY19lbmRfcmVkdWNlICAgICAgICAgICAgICAgICAgICAgICAxOTAKKworIyBPcGVuTVAgMy4wCisKKyVpZmRlZiBPTVBfMzAKKyAgICBfX2ttcGNfb21wX3Rhc2tfYWxsb2MgICAgICAgICAgICAgICAgICAgMTkxCisgICAgX19rbXBjX29tcF90YXNrICAgICAgICAgICAgICAgICAgICAgICAgIDE5MgorICAgIF9fa21wY19vbXBfdGFza3dhaXQgICAgICAgICAgICAgICAgICAgICAxOTMKKyAgICBfX2ttcGNfb21wX3Rhc2tfYmVnaW5faWYwICAgICAgICAgICAgICAgMTk2CisgICAgX19rbXBjX29tcF90YXNrX2NvbXBsZXRlX2lmMCAgICAgICAgICAgIDE5NworICAgIF9fa21wY19vbXBfdGFza19wYXJ0cyAgICAgICAgICAgICAgICAgICAxOTgKKyVlbmRpZiAjIE9NUF8zMAorCisjICAgX19vbXBfY29sbGVjdG9yX2FwaSAgICAgICAgICAgICAgICAgIDE5OQorCisgICAgIyBUaGVzZSBmdW5jdGlvbnMgYXJlIGZvciB0ZXN0aW5nIHB1cnBvc2VzLiBUaGVyZSBpcyBubyBuZWVkIGluIHN0YWJsZSBvcmRpbmFsIG51bWJlcjoKKyAgICBfX2ttcF9nZXRfcmVkdWNlX21ldGhvZAorCislZW5kaWYgICMgbm90IGRlZmluZWQgc3R1YgorCitrbXBjX2NhbGxvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMAora21wY19mcmVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDEKKyVpZm5kZWYgc3R1YgorICAgICMgVGhlc2UgZnVuY3Rpb25zIGFyZSBleHBvcnRlZCBmcm9tIGxpYmd1aWRlLCBidXQgZGVjbGFyZWQgbmVpdGhlciBpbiBvbXAuaCBub3QgaW4gb21wX2xpYi5oLgorIyAgICBrbXBjX2dldF9iYW5uZXIgICAgICAgICAgICAgICAgICAgICAgICAgMjAyCisjICAgIGttcGNfZ2V0X3Bvb2xtb2RlICAgICAgICAgICAgICAgICAgICAgICAyMDMKKyMgICAga21wY19nZXRfcG9vbHNpemUgICAgICAgICAgICAgICAgICAgICAgIDIwNAorIyAgICBrbXBjX2dldF9wb29sc3RhdCAgICAgICAgICAgICAgICAgICAgICAgMjA1CisjICAgIGttcGNfcG9vbHByaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAyMDcKKyMgICAga21wY19wcmludF9iYW5uZXIgICAgICAgICAgICAgICAgICAgICAgIDIwOAorIyAgICBrbXBjX3NldF9wb29sbW9kZSAgICAgICAgICAgICAgICAgICAgICAgMjE0CisjICAgIGttcGNfc2V0X3Bvb2xzaXplICAgICAgICAgICAgICAgICAgICAgICAyMTUKKyVlbmRpZgora21wY19tYWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDYKK2ttcGNfcmVhbGxvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA5CitrbXBjX3NldF9ibG9ja3RpbWUgICAgICAgICAgICAgICAgICAgICAgICAgIDIxMQora21wY19zZXRfbGlicmFyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMTIKKyMga21wY19zZXRfcGFyYWxsZWxfbmFtZSAgICAgICAgICAgICAgICAgICAgICAyMTMKK2ttcGNfc2V0X3N0YWNrc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgMjE2CitrbXBjX3NldF9zdGFja3NpemVfcyAgICAgICAgICAgICAgICAgICAgICAgIDIyMgorIyBrbXBjX3NldF9zdGF0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxNwora21wY19zZXRfZGVmYXVsdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjQKKworIyBPTVAgMy4wIGVudHJ5IHBvaW50cyBmb3IgdW5zaWduZWQgbG9vcCBpdGVyYXRpb24gdmFyaWFibGVzCislaWZuZGVmIHN0dWIKKyAgICAlaWZkZWYgT01QXzMwCisgICAgICAgIF9fa21wY19mb3Jfc3RhdGljX2luaXRfOHUgICAgICAgICAgIDIyNQorICAgICAgICBfX2ttcGNfZGlzcGF0Y2hfaW5pdF84dSAgICAgICAgICAgICAyMjYKKyAgICAgICAgX19rbXBjX2Rpc3BhdGNoX25leHRfOHUgICAgICAgICAgICAgMjI3CisgICAgICAgIF9fa21wY19kaXNwYXRjaF9maW5pXzh1ICAgICAgICAgICAgIDIyOAorICAgICAgICBfX2ttcGNfZm9yX3N0YXRpY19pbml0XzR1ICAgICAgICAgICAyMjkKKyAgICAgICAgX19rbXBjX2Rpc3BhdGNoX2luaXRfNHUgICAgICAgICAgICAgMjMwCisgICAgICAgIF9fa21wY19kaXNwYXRjaF9uZXh0XzR1ICAgICAgICAgICAgIDIzMQorICAgICAgICBfX2ttcGNfZGlzcGF0Y2hfZmluaV80dSAgICAgICAgICAgICAyMzIKKyAgICAlZW5kaWYgIyBPTVBfMzAKKyVlbmRpZgorCislaWZuZGVmIHN0dWIKKyAgICBfX2ttcGNfZ2V0X3Rhc2tpZCAgICAgICAgICAgICAgICAgICAgICAgMjMzCisgICAgX19rbXBjX2dldF9wYXJlbnRfdGFza2lkICAgICAgICAgICAgICAgIDIzNAorJWVuZGlmCisKKyMgT3Blbk1QIDMuMSBlbnRyeSBwb2ludHMKKyVpZm5kZWYgc3R1YgorICAgICVpZmRlZiBPTVBfMzAKKyAgICAgICAgX19rbXBjX29tcF90YXNreWllbGQgICAgICAgICAgICAgICAgMjM1CisgICAgJWVuZGlmICMgT01QXzMwCisgICAgX19rbXBjX3BsYWNlX3RocmVhZHMgICAgICAgICAgICAgICAgICAgIDIzNgorJWVuZGlmCisKKyMgT3Blbk1QIDQuMCBlbnRyeSBwb2ludHMKKyVpZm5kZWYgc3R1YgorICAgICVpZmRlZiBPTVBfNDAKKyAgICAgICAgX19rbXBjX3B1c2hfcHJvY19iaW5kICAgICAgICAgICAgICAgMjM3CisgICAgICAgIF9fa21wY190YXNrZ3JvdXAgICAgICAgICAgICAgICAgICAgIDIzOAorICAgICAgICBfX2ttcGNfZW5kX3Rhc2tncm91cCAgICAgICAgICAgICAgICAyMzkKKyAgICAgICAgX19rbXBjX3B1c2hfbnVtX3RlYW1zICAgICAgICAgICAgICAgMjQwCisgICAgICAgIF9fa21wY19mb3JrX3RlYW1zICAgICAgICAgICAgICAgICAgIDI0MQorICAgICAgICBfX2ttcGNfb21wX3Rhc2tfd2l0aF9kZXBzICAgICAgICAgICAyNDIKKyAgICAgICAgX19rbXBjX29tcF93YWl0X2RlcHMgICAgICAgICAgICAgICAgMjQzCisgICAgICAgIF9fa21wY19jYW5jZWwgICAgICAgICAgICAgICAgICAgICAgIDI0NAorICAgICAgICBfX2ttcGNfY2FuY2VsbGF0aW9ucG9pbnQgICAgICAgICAgICAyNDUKKyAgICAgICAgX19rbXBjX2NhbmNlbF9iYXJyaWVyICAgICAgICAgICAgICAgMjQ2CisgICAgICAgIF9fa21wY19kaXN0X2Zvcl9zdGF0aWNfaW5pdF80ICAgICAgIDI0NworICAgICAgICBfX2ttcGNfZGlzdF9mb3Jfc3RhdGljX2luaXRfNHUgICAgICAyNDgKKyAgICAgICAgX19rbXBjX2Rpc3RfZm9yX3N0YXRpY19pbml0XzggICAgICAgMjQ5CisgICAgICAgIF9fa21wY19kaXN0X2Zvcl9zdGF0aWNfaW5pdF84dSAgICAgIDI1MAorICAgICAgICBfX2ttcGNfZGlzdF9kaXNwYXRjaF9pbml0XzQgICAgICAgICAyNTEKKyAgICAgICAgX19rbXBjX2Rpc3RfZGlzcGF0Y2hfaW5pdF80dSAgICAgICAgMjUyCisgICAgICAgIF9fa21wY19kaXN0X2Rpc3BhdGNoX2luaXRfOCAgICAgICAgIDI1MworICAgICAgICBfX2ttcGNfZGlzdF9kaXNwYXRjaF9pbml0Xzh1ICAgICAgICAyNTQKKyAgICAgICAgX19rbXBjX3RlYW1fc3RhdGljX2luaXRfNCAgICAgICAgICAgMjU1CisgICAgICAgIF9fa21wY190ZWFtX3N0YXRpY19pbml0XzR1ICAgICAgICAgIDI1NgorICAgICAgICBfX2ttcGNfdGVhbV9zdGF0aWNfaW5pdF84ICAgICAgICAgICAyNTcKKyAgICAgICAgX19rbXBjX3RlYW1fc3RhdGljX2luaXRfOHUgICAgICAgICAgMjU4CisgICAgJWVuZGlmICMgT01QXzQwCislZW5kaWYKKworIyBPcGVuTVAgNC4xIGVudHJ5IHBvaW50cworJWlmbmRlZiBzdHViCisgICAgJWlmZGVmIE9NUF80MQorCV9fa21wY19wcm94eV90YXNrX2NvbXBsZXRlZAkgICAgMjU5CisJX19rbXBjX3Byb3h5X3Rhc2tfY29tcGxldGVkX29vbwkgICAgMjYwCisgICAgJWVuZGlmCislZW5kaWYKKworIyBVc2VyIEFQSSBlbnRyeSBwb2ludHMgdGhhdCBoYXZlIGJvdGggbG93ZXItIGFuZCB1cHBlci0gY2FzZSB2ZXJzaW9ucyBmb3IgRm9ydHJhbi4KKyMgTnVtYmVyIGZvciBsb3dlcmNhc2UgdmVyc2lvbiBpcyBpbmRpY2F0ZWQuICBOdW1iZXIgZm9yIHVwcGVyY2FzZSBpcyBvYnRhaW5lZCBieSBhZGRpbmcgMTAwMC4KKyMgVXNlciBBUEkgZW50cnkgcG9pbnRzIGFyZSBlbnRyeSBwb2ludHMgdGhhdCBzdGFydCB3aXRoICdrbXBfJyBvciAnb21wXycuCisKK29tcF9kZXN0cm95X2xvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzAwCitvbXBfZGVzdHJveV9uZXN0X2xvY2sgICAgICAgICAgICAgICAgICAgICAgIDcwMQorb21wX2dldF9keW5hbWljICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MDIKK29tcF9nZXRfbWF4X3RocmVhZHMgICAgICAgICAgICAgICAgICAgICAgICAgNzAzCitvbXBfZ2V0X25lc3RlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcwNAorb21wX2dldF9udW1fcHJvY3MgICAgICAgICAgICAgICAgICAgICAgICAgICA3MDUKK29tcF9nZXRfbnVtX3RocmVhZHMgICAgICAgICAgICAgICAgICAgICAgICAgNzA2CitvbXBfZ2V0X3RocmVhZF9udW0gICAgICAgICAgICAgICAgICAgICAgICAgIDcwNworb21wX2dldF93dGljayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MDgKK29tcF9nZXRfd3RpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzA5CitvbXBfaW5fcGFyYWxsZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcxMAorb21wX2luaXRfbG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MTEKK29tcF9pbml0X25lc3RfbG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgNzEyCitvbXBfc2V0X2R5bmFtaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcxMworb21wX3NldF9sb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MTQKK29tcF9zZXRfbmVzdF9sb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgNzE1CitvbXBfc2V0X25lc3RlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcxNgorb21wX3NldF9udW1fdGhyZWFkcyAgICAgICAgICAgICAgICAgICAgICAgICA3MTcKK29tcF90ZXN0X2xvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzE4CitvbXBfdGVzdF9uZXN0X2xvY2sgICAgICAgICAgICAgICAgICAgICAgICAgIDcxOQorb21wX3Vuc2V0X2xvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MjAKK29tcF91bnNldF9uZXN0X2xvY2sgICAgICAgICAgICAgICAgICAgICAgICAgNzIxCisKK29tcGNfc2V0X2R5bmFtaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzIyCitvbXBjX3NldF9uZXN0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyMworb21wY19zZXRfbnVtX3RocmVhZHMgICAgICAgICAgICAgICAgICAgICAgICA3MjQKKwora21wX2NhbGxvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MjUKK2ttcF9mcmVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzI2CitrbXBfZ2V0X2Jsb2NrdGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyNwora21wX2dldF9saWJyYXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MjgKK2ttcF9nZXRfc3RhY2tzaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgNzI5CitrbXBfbWFsbG9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDczMAorI2ttcF9wcmludF9iYW5uZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzMxCitrbXBfcmVhbGxvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDczMgora21wX3NldF9ibG9ja3RpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICA3MzQKK2ttcF9zZXRfbGlicmFyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzM1CitrbXBfc2V0X2xpYnJhcnlfc2VyaWFsICAgICAgICAgICAgICAgICAgICAgIDczNwora21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQgICAgICAgICAgICAgICAgICA3MzgKK2ttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kICAgICAgICAgICAgICAgICAgNzM5CisjIGttcF9zZXRfcGFyYWxsZWxfbmFtZSAgICAgICAgICAgICAgICAgICAgICAgNzQwCitrbXBfc2V0X3N0YWNrc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgIDc0MQorIyBrbXBfc2V0X3N0YXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc0Mgora21wX2dldF9udW1fa25vd25fdGhyZWFkcyAgICAgICAgICAgICAgICAgICA3NDMKK2ttcF9zZXRfc3RhY2tzaXplX3MgICAgICAgICAgICAgICAgICAgICAgICAgNzQ0CitrbXBfZ2V0X3N0YWNrc2l6ZV9zICAgICAgICAgICAgICAgICAgICAgICAgIDc0NQora21wX3NldF9kZWZhdWx0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICA3NDYKK2ttcF9zZXRfd2FybmluZ3Nfb24gICAgICAgICAgICAgICAgICAgICAgICAgNzc5CitrbXBfc2V0X3dhcm5pbmdzX29mZiAgICAgICAgICAgICAgICAgICAgICAgIDc4MAorCislaWZkZWYgT01QXzMwCisgICAgb21wX2dldF9hY3RpdmVfbGV2ZWwgICAgICAgICAgICAgICAgICAgIDc4OQorICAgIG9tcF9nZXRfbGV2ZWwgICAgICAgICAgICAgICAgICAgICAgICAgICA3OTAKKyAgICBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0gICAgICAgICAgICAgNzkxCisgICAgb21wX2dldF90ZWFtX3NpemUgICAgICAgICAgICAgICAgICAgICAgIDc5MgorICAgIG9tcF9nZXRfdGhyZWFkX2xpbWl0ICAgICAgICAgICAgICAgICAgICA3OTMKKyAgICBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzICAgICAgICAgICAgICAgNzk0CisgICAgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscyAgICAgICAgICAgICAgIDc5NQorICAgIG9tcF9nZXRfc2NoZWR1bGUgICAgICAgICAgICAgICAgICAgICAgICA3OTYKKyAgICBvbXBfc2V0X3NjaGVkdWxlICAgICAgICAgICAgICAgICAgICAgICAgNzk3CisgICAgb21wY19zZXRfbWF4X2FjdGl2ZV9sZXZlbHMgICAgICAgICAgICAgIDc5OAorICAgIG9tcGNfc2V0X3NjaGVkdWxlICAgICAgICAgICAgICAgICAgICAgICA3OTkKKyAgICBvbXBjX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtICAgICAgICAgICAgODAwCisgICAgb21wY19nZXRfdGVhbV9zaXplICAgICAgICAgICAgICAgICAgICAgIDgwMQorICAgIGttcF9zZXRfYWZmaW5pdHkgICAgICAgICAgICAgICAgICAgICAgICA4NTAKKyAgICBrbXBfZ2V0X2FmZmluaXR5ICAgICAgICAgICAgICAgICAgICAgICAgODUxCisgICAga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYyAgICAgICAgICAgICAgIDg1MgorICAgIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzayAgICAgICAgICAgICAgICA4NTMKKyAgICBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrICAgICAgICAgICAgICAgODU0CisgICAga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MgICAgICAgICAgICAgIDg1NQorICAgIGttcGNfc2V0X2FmZmluaXR5X21hc2tfcHJvYyAgICAgICAgICAgICA4NTYKKyAgICBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jICAgICAgICAgICAgODU3CisgICAga21wY191bnNldF9hZmZpbml0eV9tYXNrX3Byb2MgICAgICAgICAgIDg1OAorICAgIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jICAgICAgICAgICAgICA4NTkKKyAgICBrbXBjX2dldF9hZmZpbml0eV9tYXNrX3Byb2MgICAgICAgICAgICAgODYwCislZW5kaWYgIyBPTVBfMzAKKworIyBPcGVuTVAgMy4xCisKKyVpZmRlZiBPTVBfMzAKKyAgICBvbXBfaW5fZmluYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgODYxCislZW5kaWYgIyBPTVBfMzAKKworIyBPcGVuTVAgNDAKKworJWlmZGVmIE9NUF80MAorICAgIG9tcF9nZXRfcHJvY19iaW5kICAgICAgICAgICAgICAgICAgICAgICA4NjIKKyAgICNvbXBfc2V0X3Byb2NfYmluZCAgICAgICAgICAgICAgICAgICAgICAgODYzCisgICAjb21wX2N1cnJfcHJvY19iaW5kICAgICAgICAgICAgICAgICAgICAgIDg2NAorICAgIG9tcF9nZXRfbnVtX3RlYW1zICAgICAgICAgICAgICAgICAgICAgICA4NjUKKyAgICBvbXBfZ2V0X3RlYW1fbnVtICAgICAgICAgICAgICAgICAgICAgICAgODY2CisgICAgb21wX2dldF9jYW5jZWxsYXRpb24gICAgICAgICAgICAgICAgICAgIDg2NworICAgIGttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cyAgICAgICAgICAgICA4NjgKKyAgICBvbXBfaXNfaW5pdGlhbF9kZXZpY2UgICAgICAgICAgICAgICAgICAgODY5CislZW5kaWYgIyBPTVBfNDAKKworIyBPcGVuTVAgNDEKKworJWlmZGVmIE9NUF80MQorICAgIG9tcF9pbml0X2xvY2tfd2l0aF9oaW50ICAgICAgICAgICAgICAgICA4NzAKKyAgICBvbXBfaW5pdF9uZXN0X2xvY2tfd2l0aF9oaW50ICAgICAgICAgICAgODcxCislZW5kaWYgIyBPTVBfNDEKKworJWlmbmRlZiBzdHViCisgICAgIyBPcmRpbmFscyBiZXR3ZWVuIDkwMCBhbmQgOTk5IGFyZSByZXNlcnZlZAorCisgICAgIyBPcmRpbmFscyBiZXR3ZWVuIDEwMDAgYW5kIDE5OTkgYXJlIHJlc2VydmVkCisgICAgIyBmb3IgdXNlci1jYWxsYWJsZSB1cHBlcmNhc2UgRm9ydHJhbiBlbnRyaWVzLgorCisKKyAgICAjIEFUT01JQyBlbnRyaWVzCisKKyAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2RpdiAgICAgICAgICAgICAgMjAwMAorICAgICVlbmRpZgorCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfYWRkICAgICAgICAgICAgICAgMjAwMQorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGIgICAgICAgICAgICAgIDIwMDIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXYgICAgICAgICAgICAgICAyMDAzCisgICAgX19rbXBjX2F0b21pY19maXhlZDF1X2RpdiAgICAgICAgICAgICAgMjAwNAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX211bCAgICAgICAgICAgICAgIDIwMDUKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmIgICAgICAgICAgICAgICAyMDA2CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc2hsICAgICAgICAgICAgICAgMjAwNworICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3NociAgICAgICAgICAgICAgIDIwMDgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfc2hyICAgICAgICAgICAgICAyMDA5CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc3ViICAgICAgICAgICAgICAgMjAxMAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3hvciAgICAgICAgICAgICAgIDIwMTEKKworICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2FkZCAgICAgICAgICAgICAgIDIwMTIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hbmRiICAgICAgICAgICAgICAyMDEzCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfZGl2ICAgICAgICAgICAgICAgMjAxNAorICAgIF9fa21wY19hdG9taWNfZml4ZWQydV9kaXYgICAgICAgICAgICAgIDIwMTUKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tdWwgICAgICAgICAgICAgICAyMDE2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfb3JiICAgICAgICAgICAgICAgMjAxNworICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3NobCAgICAgICAgICAgICAgIDIwMTgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaHIgICAgICAgICAgICAgICAyMDE5CisgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X3NociAgICAgICAgICAgICAgMjAyMAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3N1YiAgICAgICAgICAgICAgIDIwMjEKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl94b3IgICAgICAgICAgICAgICAyMDIyCisKKyAgICNfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGQgICAgICAgICAgICMgZGVjbGFyZWQgYWJvdmUgIzEwMgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1YiAgICAgICAgICAgICAgIDIwMjQKKyAgICNfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGQgICAgICAgICAgICMgZGVjbGFyZWQgYWJvdmUgIzEwNAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1YiAgICAgICAgICAgICAgIDIwMjYKKyAgICNfX2ttcGNfYXRvbWljX2ZpeGVkOF9hZGQgICAgICAgICAgICMgZGVjbGFyZWQgYWJvdmUgIzEwMworICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1YiAgICAgICAgICAgICAgIDIwMjgKKyAgICNfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGQgICAgICAgICAgICMgZGVjbGFyZWQgYWJvdmUgIzEwNQorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X3N1YiAgICAgICAgICAgICAgIDIwMzAKKworICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2FuZGIgICAgICAgICAgICAgIDIwMzEKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXYgICAgICAgICAgICAgICAyMDMyCisgICAgX19rbXBjX2F0b21pY19maXhlZDR1X2RpdiAgICAgICAgICAgICAgMjAzMworICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X211bCAgICAgICAgICAgICAgIDIwMzQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9vcmIgICAgICAgICAgICAgICAyMDM1CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfc2hsICAgICAgICAgICAgICAgMjAzNgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3NociAgICAgICAgICAgICAgIDIwMzcKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfc2hyICAgICAgICAgICAgICAyMDM4CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfeG9yICAgICAgICAgICAgICAgMjAzOQorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FuZGIgICAgICAgICAgICAgIDIwNDAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXYgICAgICAgICAgICAgICAyMDQxCisgICAgX19rbXBjX2F0b21pY19maXhlZDh1X2RpdiAgICAgICAgICAgICAgMjA0MgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X211bCAgICAgICAgICAgICAgIDIwNDMKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9vcmIgICAgICAgICAgICAgICAyMDQ0CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfc2hsICAgICAgICAgICAgICAgMjA0NQorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3NociAgICAgICAgICAgICAgIDIwNDYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc2hyICAgICAgICAgICAgICAyMDQ3CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfeG9yICAgICAgICAgICAgICAgMjA0OAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X2RpdiAgICAgICAgICAgICAgIDIwNDkKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tdWwgICAgICAgICAgICAgICAyMDUwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfZGl2ICAgICAgICAgICAgICAgMjA1MQorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X211bCAgICAgICAgICAgICAgIDIwNTIKKworICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGwgICAgICAgICAgICAgIDIwNTMKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmwgICAgICAgICAgICAgICAyMDU0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfYW5kbCAgICAgICAgICAgICAgMjA1NQorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX29ybCAgICAgICAgICAgICAgIDIwNTYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hbmRsICAgICAgICAgICAgICAyMDU3CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfb3JsICAgICAgICAgICAgICAgMjA1OAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FuZGwgICAgICAgICAgICAgIDIwNTkKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9vcmwgICAgICAgICAgICAgICAyMDYwCisKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tYXggICAgICAgICAgICAgICAyMDYxCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfbWluICAgICAgICAgICAgICAgMjA2MgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX21heCAgICAgICAgICAgICAgIDIwNjMKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9taW4gICAgICAgICAgICAgICAyMDY0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfbWF4ICAgICAgICAgICAgICAgMjA2NQorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X21pbiAgICAgICAgICAgICAgIDIwNjYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tYXggICAgICAgICAgICAgICAyMDY3CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfbWluICAgICAgICAgICAgICAgMjA2OAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X21heCAgICAgICAgICAgICAgIDIwNjkKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9taW4gICAgICAgICAgICAgICAyMDcwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfbWF4ICAgICAgICAgICAgICAgMjA3MQorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X21pbiAgICAgICAgICAgICAgIDIwNzIKKworICAgIF9fa21wY19hdG9taWNfZml4ZWQxX25lcXYgICAgICAgICAgICAgIDIwNzMKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9uZXF2ICAgICAgICAgICAgICAyMDc0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfbmVxdiAgICAgICAgICAgICAgMjA3NQorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X25lcXYgICAgICAgICAgICAgIDIwNzYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9lcXYgICAgICAgICAgICAgICAyMDc3CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfZXF2ICAgICAgICAgICAgICAgMjA3OAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2VxdiAgICAgICAgICAgICAgIDIwNzkKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9lcXYgICAgICAgICAgICAgICAyMDgwCisKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfYWRkICAgICAgICAgICAgICAyMDgxCisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3N1YiAgICAgICAgICAgICAgMjA4MgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9tdWwgICAgICAgICAgICAgIDIwODMKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2ICAgICAgICAgICAgICAyMDg0CisKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9hZGQgICAgICAgICAgICAgICAyMDg1CisgICAgX19rbXBjX2F0b21pY19jbXBseDRfc3ViICAgICAgICAgICAgICAgMjA4NgorICAgIF9fa21wY19hdG9taWNfY21wbHg0X211bCAgICAgICAgICAgICAgIDIwODcKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXYgICAgICAgICAgICAgICAyMDg4CisgICAgX19rbXBjX2F0b21pY19jbXBseDhfYWRkICAgICAgICAgICAgICAgMjA4OQorICAgIF9fa21wY19hdG9taWNfY21wbHg4X3N1YiAgICAgICAgICAgICAgIDIwOTAKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9tdWwgICAgICAgICAgICAgICAyMDkxCisgICAgX19rbXBjX2F0b21pY19jbXBseDhfZGl2ICAgICAgICAgICAgICAgMjA5MgorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9hZGQgICAgICAgICAgICAgIDIwOTMKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3ViICAgICAgICAgICAgICAyMDk0CisgICAgX19rbXBjX2F0b21pY19jbXBseDEwX211bCAgICAgICAgICAgICAgMjA5NQorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9kaXYgICAgICAgICAgICAgIDIwOTYKKyAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2FkZCAgICAgICAgICAgICAgMjA5NworICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWIgICAgICAgICAgICAgIDIwOTgKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfbXVsICAgICAgICAgICAgICAyMDk5CisgICAjX19rbXBjX2F0b21pY19jbXBseDE2X2RpdiAgICAgICAgICAgICAgMjAwMCAjIG1vdmVkIHVwIGJlY2F1c2Ugb2YgbWlzdGFrZSBpbiBudW1iZXIgKHN1cHBvc2VkIHRvIGJlIDIxMDApCisKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYWRkICAgICAgICAgICAgICAyMTAxCisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X3N1YiAgICAgICAgICAgICAgMjEwMgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9tdWwgICAgICAgICAgICAgIDIxMDMKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2ICAgICAgICAgICAgICAyMTA0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X21heCAgICAgICAgICAgICAgMjEwNQorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9taW4gICAgICAgICAgICAgIDIxMDYKKworICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FkZF9mcCAgICAgICAgICAgIDIxMDcKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWJfZnAgICAgICAgICAgICAyMTA4CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfbXVsX2ZwICAgICAgICAgICAgMjEwOQorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9mcCAgICAgICAgICAgIDIxMTAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2X2ZwICAgICAgICAgICAyMTExCisKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hZGRfZnAgICAgICAgICAgICAyMTEyCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfc3ViX2ZwICAgICAgICAgICAgMjExMworICAgIF9fa21wY19hdG9taWNfZml4ZWQyX211bF9mcCAgICAgICAgICAgIDIxMTQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfZnAgICAgICAgICAgICAyMTE1CisgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9mcCAgICAgICAgICAgMjExNgorCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfYWRkX2ZwICAgICAgICAgICAgMjExNworICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9mcCAgICAgICAgICAgIDIxMTgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tdWxfZnAgICAgICAgICAgICAyMTE5CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfZGl2X2ZwICAgICAgICAgICAgMjEyMAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXZfZnAgICAgICAgICAgIDIxMjEKKworICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FkZF9mcCAgICAgICAgICAgIDIxMjIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfZnAgICAgICAgICAgICAyMTIzCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfbXVsX2ZwICAgICAgICAgICAgMjEyNAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9mcCAgICAgICAgICAgIDIxMjUKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2X2ZwICAgICAgICAgICAyMTI2CisKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGRfZnAgICAgICAgICAgICAyMTI3CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2ZwICAgICAgICAgICAgMjEyOAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X211bF9mcCAgICAgICAgICAgIDIxMjkKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfZnAgICAgICAgICAgICAyMTMwCisKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGRfZnAgICAgICAgICAgICAyMTMxCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2ZwICAgICAgICAgICAgMjEzMgorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X211bF9mcCAgICAgICAgICAgIDIxMzMKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfZnAgICAgICAgICAgICAyMTM0CisKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfYWRkX2ZwICAgICAgICAgICAyMTM1CisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9mcCAgICAgICAgICAgMjEzNgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9tdWxfZnAgICAgICAgICAgIDIxMzcKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2X2ZwICAgICAgICAgICAyMTM4CisgICAgJWVuZGlmCisKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tdWxfZmxvYXQ4ICAgICAgICAyMTY5CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfZGl2X2Zsb2F0OCAgICAgICAgMjE3MAorCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfbXVsX2Zsb2F0OCAgICAgICAgMjE3NAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9mbG9hdDggICAgICAgIDIxNzUKKworICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X211bF9mbG9hdDggICAgICAgIDIxNzkKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfZmxvYXQ4ICAgICAgICAyMTgwCisKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tdWxfZmxvYXQ4ICAgICAgICAyMTg0CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2Zsb2F0OCAgICAgICAgMjE4NQorCisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfYWRkX2Zsb2F0OCAgICAgICAgMjE4NworICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9mbG9hdDggICAgICAgIDIxODgKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tdWxfZmxvYXQ4ICAgICAgICAyMTg5CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X2Zsb2F0OCAgICAgICAgMjE5MAorCisgICAgX19rbXBjX2F0b21pY19jbXBseDRfYWRkX2NtcGx4OCAgICAgICAgMjIzMQorICAgIF9fa21wY19hdG9taWNfY21wbHg0X3N1Yl9jbXBseDggICAgICAgIDIyMzIKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9tdWxfY21wbHg4ICAgICAgICAyMjMzCisgICAgX19rbXBjX2F0b21pY19jbXBseDRfZGl2X2NtcGx4OCAgICAgICAgMjIzNAorCisgICAgX19rbXBjX2F0b21pY18xICAgICAgICAgICAgICAgICAgICAgICAgMjI0NworICAgIF9fa21wY19hdG9taWNfMiAgICAgICAgICAgICAgICAgICAgICAgIDIyNDgKKyAgICNfX2ttcGNfYXRvbWljXzQgICAgICAgICAgICAgICAgICAgICMgZGVjbGFyZWQgYWJvdmUgIzEwMAorICAgI19fa21wY19hdG9taWNfOCAgICAgICAgICAgICAgICAgICAgIyBkZWNsYXJlZCBhYm92ZSAjMTAxCisgICAgX19rbXBjX2F0b21pY18xMCAgICAgICAgICAgICAgICAgICAgICAgMjI1MQorICAgIF9fa21wY19hdG9taWNfMTYgICAgICAgICAgICAgICAgICAgICAgIDIyNTIKKyAgICBfX2ttcGNfYXRvbWljXzIwICAgICAgICAgICAgICAgICAgICAgICAyMjUzCisgICAgX19rbXBjX2F0b21pY18zMiAgICAgICAgICAgICAgICAgICAgICAgMjI1NAorCisgICAgJWlmZGVmIGFyY2hfMzIKKworICAgICAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9hZGRfYTE2ICAgICAgMjI1NQorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2ExNiAgICAgIDIyNTYKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X211bF9hMTYgICAgICAyMjU3CisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfYTE2ICAgICAgMjI1OAorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWF4X2ExNiAgICAgIDIyNTkKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X21pbl9hMTYgICAgICAyMjYwCisKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2FkZF9hMTYgICAgICAyMjYxCisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfYTE2ICAgICAgMjI2MgorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfbXVsX2ExNiAgICAgIDIyNjMKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9hMTYgICAgICAyMjY0CisgICAgICAgICVlbmRpZgorCisgICAgJWVuZGlmCisKKyAgICAlaWZuZGVmIGFyY2hfNjQKKworICAgICAgICAjIEFUT01JQyBleHRlbnNpb25zIGZvciBPcGVuTVAgMy4xIHNwZWMgKHg4NiBhbmQgeDY0IG9ubHkpCisKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfcmQgICAgICAgICAgICAgICAgMjI2NQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9yZCAgICAgICAgICAgICAgICAyMjY2CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3JkICAgICAgICAgICAgICAgIDIyNjcKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfcmQgICAgICAgICAgICAgICAgMjI2OAorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9yZCAgICAgICAgICAgICAgICAyMjY5CisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X3JkICAgICAgICAgICAgICAgIDIyNzAKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3JkICAgICAgICAgICAgICAgMjI3MQorICAgICAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9yZCAgICAgICAgICAgICAgIDIyNzIKKyAgICAgICAgJWVuZGlmCisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg0X3JkICAgICAgICAgICAgICAgIDIyNzMKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDhfcmQgICAgICAgICAgICAgICAgMjI3NAorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfcmQgICAgICAgICAgICAgICAyMjc1CisgICAgICAgICVpZmRlZiBIQVZFX1FVQUQKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3JkICAgICAgICAgICAgICAgMjI3NgorICAgICAgICAgICAgJWlmZGVmIGFyY2hfMzIKKyAgICAgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYTE2X3JkICAgICAgIDIyNzcKKyAgICAgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYTE2X3JkICAgICAgIDIyNzgKKyAgICAgICAgICAgICVlbmRpZgorICAgICAgICAlZW5kaWYKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfd3IgICAgICAgICAgICAgICAgMjI3OQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl93ciAgICAgICAgICAgICAgICAyMjgwCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3dyICAgICAgICAgICAgICAgIDIyODEKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfd3IgICAgICAgICAgICAgICAgMjI4MgorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF93ciAgICAgICAgICAgICAgICAyMjgzCisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X3dyICAgICAgICAgICAgICAgIDIyODQKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3dyICAgICAgICAgICAgICAgMjI4NQorICAgICAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl93ciAgICAgICAgICAgICAgIDIyODYKKyAgICAgICAgJWVuZGlmCisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg0X3dyICAgICAgICAgICAgICAgIDIyODcKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDhfd3IgICAgICAgICAgICAgICAgMjI4OAorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfd3IgICAgICAgICAgICAgICAyMjg5CisgICAgICAgICVpZmRlZiBIQVZFX1FVQUQKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3dyICAgICAgICAgICAgICAgMjI5MAorICAgICAgICAlaWZkZWYgYXJjaF8zMgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2ExNl93ciAgICAgICAyMjkxCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYTE2X3dyICAgICAgIDIyOTIKKyAgICAgICAgJWVuZGlmCisgICAgICAgICVlbmRpZgorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hZGRfY3B0ICAgICAgICAgICAyMjkzCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGJfY3B0ICAgICAgICAgIDIyOTQKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfZGl2X2NwdCAgICAgICAgICAgMjI5NQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2X2NwdCAgICAgICAgICAyMjk2CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX211bF9jcHQgICAgICAgICAgIDIyOTcKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfb3JiX2NwdCAgICAgICAgICAgMjI5OAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaGxfY3B0ICAgICAgICAgICAyMjk5CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3Nocl9jcHQgICAgICAgICAgIDIzMDAKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDF1X3Nocl9jcHQgICAgICAgICAgMjMwMQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWJfY3B0ICAgICAgICAgICAyMzAyCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3hvcl9jcHQgICAgICAgICAgIDIzMDMKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfYWRkX2NwdCAgICAgICAgICAgMjMwNAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hbmRiX2NwdCAgICAgICAgICAyMzA1CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9jcHQgICAgICAgICAgIDIzMDYKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9jcHQgICAgICAgICAgMjMwNworICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tdWxfY3B0ICAgICAgICAgICAyMzA4CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX29yYl9jcHQgICAgICAgICAgIDIzMDkKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfc2hsX2NwdCAgICAgICAgICAgMjMxMAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaHJfY3B0ICAgICAgICAgICAyMzExCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQydV9zaHJfY3B0ICAgICAgICAgIDIzMTIKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfc3ViX2NwdCAgICAgICAgICAgMjMxMworICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl94b3JfY3B0ICAgICAgICAgICAyMzE0CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2FkZF9jcHQgICAgICAgICAgIDIzMTUKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfc3ViX2NwdCAgICAgICAgICAgMjMxNgorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGRfY3B0ICAgICAgICAgICAyMzE3CisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9jcHQgICAgICAgICAgIDIzMTgKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfYWRkX2NwdCAgICAgICAgICAgMjMxOQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfY3B0ICAgICAgICAgICAyMzIwCisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X2FkZF9jcHQgICAgICAgICAgIDIzMjEKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2NwdCAgICAgICAgICAgMjMyMgorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hbmRiX2NwdCAgICAgICAgICAyMzIzCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9jcHQgICAgICAgICAgIDIzMjQKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDR1X2Rpdl9jcHQgICAgICAgICAgMjMyNQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tdWxfY3B0ICAgICAgICAgICAyMzI2CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X29yYl9jcHQgICAgICAgICAgIDIzMjcKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfc2hsX2NwdCAgICAgICAgICAgMjMyOAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaHJfY3B0ICAgICAgICAgICAyMzI5CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHJfY3B0ICAgICAgICAgIDIzMzAKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfeG9yX2NwdCAgICAgICAgICAgMjMzMQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hbmRiX2NwdCAgICAgICAgICAyMzMyCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9jcHQgICAgICAgICAgIDIzMzMKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDh1X2Rpdl9jcHQgICAgICAgICAgMjMzNAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tdWxfY3B0ICAgICAgICAgICAyMzM1CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X29yYl9jcHQgICAgICAgICAgIDIzMzYKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfc2hsX2NwdCAgICAgICAgICAgMjMzNworICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaHJfY3B0ICAgICAgICAgICAyMzM4CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zaHJfY3B0ICAgICAgICAgIDIzMzkKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfeG9yX2NwdCAgICAgICAgICAgMjM0MAorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfY3B0ICAgICAgICAgICAyMzQxCisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X211bF9jcHQgICAgICAgICAgIDIzNDIKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDhfZGl2X2NwdCAgICAgICAgICAgMjM0MworICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tdWxfY3B0ICAgICAgICAgICAyMzQ0CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGxfY3B0ICAgICAgICAgIDIzNDUKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfb3JsX2NwdCAgICAgICAgICAgMjM0NgorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hbmRsX2NwdCAgICAgICAgICAyMzQ3CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX29ybF9jcHQgICAgICAgICAgIDIzNDgKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfYW5kbF9jcHQgICAgICAgICAgMjM0OQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9vcmxfY3B0ICAgICAgICAgICAyMzUwCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FuZGxfY3B0ICAgICAgICAgIDIzNTEKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfb3JsX2NwdCAgICAgICAgICAgMjM1MgorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tYXhfY3B0ICAgICAgICAgICAyMzUzCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX21pbl9jcHQgICAgICAgICAgIDIzNTQKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfbWF4X2NwdCAgICAgICAgICAgMjM1NQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9taW5fY3B0ICAgICAgICAgICAyMzU2CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X21heF9jcHQgICAgICAgICAgIDIzNTcKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfbWluX2NwdCAgICAgICAgICAgMjM1OAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tYXhfY3B0ICAgICAgICAgICAyMzU5CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X21pbl9jcHQgICAgICAgICAgIDIzNjAKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDRfbWF4X2NwdCAgICAgICAgICAgMjM2MQorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9taW5fY3B0ICAgICAgICAgICAyMzYyCisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X21heF9jcHQgICAgICAgICAgIDIzNjMKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDhfbWluX2NwdCAgICAgICAgICAgMjM2NAorICAgICAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9tYXhfY3B0ICAgICAgICAgIDIzNjUKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X21pbl9jcHQgICAgICAgICAgMjM2NgorICAgICAgICAlZW5kaWYKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfbmVxdl9jcHQgICAgICAgICAgMjM2NworICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9uZXF2X2NwdCAgICAgICAgICAyMzY4CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X25lcXZfY3B0ICAgICAgICAgIDIzNjkKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfbmVxdl9jcHQgICAgICAgICAgMjM3MAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9lcXZfY3B0ICAgICAgICAgICAyMzcxCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2Vxdl9jcHQgICAgICAgICAgIDIzNzIKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfZXF2X2NwdCAgICAgICAgICAgMjM3MworICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9lcXZfY3B0ICAgICAgICAgICAyMzc0CisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9hZGRfY3B0ICAgICAgICAgIDIzNzUKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9jcHQgICAgICAgICAgMjM3NgorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfbXVsX2NwdCAgICAgICAgICAyMzc3CisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfY3B0ICAgICAgICAgIDIzNzgKKyAgICAgICAgJWlmZGVmIEhBVkVfUVVBRAorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYWRkX2NwdCAgICAgICAgICAyMzc5CisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfY3B0ICAgICAgICAgIDIzODAKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X211bF9jcHQgICAgICAgICAgMjM4MQorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2NwdCAgICAgICAgICAyMzgyCisgICAgICAgICVlbmRpZgorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9hZGRfY3B0ICAgICAgICAgICAyMzgzCisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg0X3N1Yl9jcHQgICAgICAgICAgIDIzODQKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDRfbXVsX2NwdCAgICAgICAgICAgMjM4NQorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXZfY3B0ICAgICAgICAgICAyMzg2CisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg4X2FkZF9jcHQgICAgICAgICAgIDIzODcKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDhfc3ViX2NwdCAgICAgICAgICAgMjM4OAorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9tdWxfY3B0ICAgICAgICAgICAyMzg5CisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg4X2Rpdl9jcHQgICAgICAgICAgIDIzOTAKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDEwX2FkZF9jcHQgICAgICAgICAgMjM5MQorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3ViX2NwdCAgICAgICAgICAyMzkyCisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9tdWxfY3B0ICAgICAgICAgIDIzOTMKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDEwX2Rpdl9jcHQgICAgICAgICAgMjM5NAorICAgICAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9hZGRfY3B0ICAgICAgICAgIDIzOTUKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9jcHQgICAgICAgICAgMjM5NgorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfbXVsX2NwdCAgICAgICAgICAyMzk3CisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfY3B0ICAgICAgICAgIDIzOTgKKyAgICAgICAgJWVuZGlmCisgICAgICAgI19fa21wY19hdG9taWNfY21wbHg0X2FkZF9jcHRfdG1wICAgICAgICAgICAgMjQwOQorCisgICAgICAgICVpZmRlZiBhcmNoXzMyCisgICAgICAgICVpZmRlZiBIQVZFX1FVQUQKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9hZGRfYTE2X2NwdCAgMjM5OQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9hMTZfY3B0ICAyNDAwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbXVsX2ExNl9jcHQgIDI0MDEKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfYTE2X2NwdCAgMjQwMgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X21heF9hMTZfY3B0ICAyNDAzCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWluX2ExNl9jcHQgIDI0MDQKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9hZGRfYTE2X2NwdCAgMjQwNQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9hMTZfY3B0ICAyNDA2CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfbXVsX2ExNl9jcHQgIDI0MDcKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfYTE2X2NwdCAgMjQwOAorICAgICAgICAlZW5kaWYKKyAgICAgICAgJWVuZGlmCisKKyAgICAgICAgX19rbXBjX2F0b21pY19zdGFydCAgICAgICAgICAgICAgICAgICAgMjQxMAorICAgICAgICBfX2ttcGNfYXRvbWljX2VuZCAgICAgICAgICAgICAgICAgICAgICAyNDExCisKKyAgICAgICAgJWlmZGVmIE9NUF80MAorCisgICAgICAgICAgICAjIEFUT01JQyBleHRlbnNpb25zIGZvciBPcGVuTVAgNC4wIHNwZWMgKHg4NiBhbmQgeDY0IG9ubHkpCisKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3N3cCAgICAgICAgICAgMjQxMgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfc3dwICAgICAgICAgICAyNDEzCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zd3AgICAgICAgICAgIDI0MTQKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3N3cCAgICAgICAgICAgMjQxNQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDRfc3dwICAgICAgICAgICAyNDE2CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zd3AgICAgICAgICAgIDI0MTcKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9zd3AgICAgICAgICAgMjQxOAorICAgICAgICAgICAgJWlmZGVmIEhBVkVfUVVBRAorICAgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3dwICAgICAgICAyNDE5CisgICAgICAgICAgICAlZW5kaWYKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg0X3N3cCAgICAgICAgICAgMjQyMAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDhfc3dwICAgICAgICAgICAyNDIxCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3dwICAgICAgICAgIDI0MjIKKyAgICAgICAgICAgICVpZmRlZiBIQVZFX1FVQUQKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9zd3AgICAgICAgICAgMjQyMworCisgICAgICAgICAgICAlaWZkZWYgYXJjaF8zMgorICAgICAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9hMTZfc3dwICAyNDI0CisgICAgICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2ExNl9zd3AgIDI0MjUKKyAgICAgICAgICAgICVlbmRpZgorICAgICAgICAgICAgJWVuZGlmCisKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3N1Yl9jcHRfcmV2ICAgMjQyNgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfZGl2X2NwdF9yZXYgICAyNDI3CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2X2NwdF9yZXYgIDI0MjgKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3NobF9jcHRfcmV2ICAgMjQyOQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfc2hyX2NwdF9yZXYgICAyNDMwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfc2hyX2NwdF9yZXYgIDI0MzEKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9jcHRfcmV2ICAgMjQzMgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfZGl2X2NwdF9yZXYgICAyNDMzCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2X2NwdF9yZXYgIDI0MzQKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3NobF9jcHRfcmV2ICAgMjQzNQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfc2hyX2NwdF9yZXYgICAyNDM2CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfc2hyX2NwdF9yZXYgIDI0MzcKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9jcHRfcmV2ICAgMjQzOAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfZGl2X2NwdF9yZXYgICAyNDM5CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X2NwdF9yZXYgIDI0NDAKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3NobF9jcHRfcmV2ICAgMjQ0MQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfc2hyX2NwdF9yZXYgICAyNDQyCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfc2hyX2NwdF9yZXYgIDI0NDMKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1Yl9jcHRfcmV2ICAgMjQ0NAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2NwdF9yZXYgICAyNDQ1CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2X2NwdF9yZXYgIDI0NDYKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3NobF9jcHRfcmV2ICAgMjQ0NworICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfc2hyX2NwdF9yZXYgICAyNDQ4CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc2hyX2NwdF9yZXYgIDI0NDkKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9jcHRfcmV2ICAgMjQ1MAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X2NwdF9yZXYgICAyNDUxCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWJfY3B0X3JldiAgIDI0NTIKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X2Rpdl9jcHRfcmV2ICAgMjQ1MworICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9jcHRfcmV2ICAyNDU0CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2X2NwdF9yZXYgIDI0NTUKKyAgICAgICAgICAgICVpZmRlZiBIQVZFX1FVQUQKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfY3B0X3JldiAgMjQ1NgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9jcHRfcmV2ICAyNDU3CisgICAgICAgICAgICAlZW5kaWYKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg0X3N1Yl9jcHRfcmV2ICAgMjQ1OAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDRfZGl2X2NwdF9yZXYgICAyNDU5CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9zdWJfY3B0X3JldiAgIDI0NjAKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg4X2Rpdl9jcHRfcmV2ICAgMjQ2MQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDEwX3N1Yl9jcHRfcmV2ICAyNDYyCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfZGl2X2NwdF9yZXYgIDI0NjMKKyAgICAgICAgICAgICVpZmRlZiBIQVZFX1FVQUQKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfY3B0X3JldiAgMjQ2NAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9jcHRfcmV2ICAyNDY1CisKKyAgICAgICAgICAgICVpZmRlZiBhcmNoXzMyCisgICAgICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9hMTZfY3B0X3JldiAgMjQ2NgorICAgICAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfYTE2X2NwdF9yZXYgIDI0NjcKKyAgICAgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2ExNl9jcHRfcmV2ICAyNDY4CisgICAgICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9hMTZfY3B0X3JldiAgMjQ2OQorICAgICAgICAgICAgJWVuZGlmCisgICAgICAgICAgICAlZW5kaWYKKworICAgICAgICAlZW5kaWYgICAjIE9NUF80MAorCisKKyAgICAlZW5kaWYgICAjIGFyY2hfNjQKKworJWVuZGlmCisKKyMgZW5kIG9mIGZpbGUgIwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvZXhwb3J0c19zby50eHQgYi9maW5hbC9ydW50aW1lL3NyYy9leHBvcnRzX3NvLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGI2MjcwCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvZXhwb3J0c19zby50eHQKQEAgLTAsMCArMSwxMzMgQEAKKyMgZXhwb3J0c19zby50eHQgIworCisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgVGhpcyBpcyB2ZXJzaW9uIHNjcmlwdCBmb3IgT01QIFJUTCBzaGFyZWQgbGlicmFyeSAobGlib21wKi5zbykKKworVkVSU0lPTiB7CisKKyAgICBnbG9iYWw6ICMgRXhwb3J0ZWQgc3ltYm9scy4KKworICAgICAgICAjCisgICAgICAgICMgIk5vcm1hbCIgc3ltYm9scy4KKyAgICAgICAgIworICAgICAgICBvbXBfKjsgICAgICMgU3RhbmRhcmQgT3Blbk1QIGZ1bmN0aW9ucy4KKworICAgICAgICAjCisgICAgICAgICMgT01QVCBBUEkKKyAgICAgICAgIworICAgICAgICBvbXB0X3Rvb2w7ICAgICAgICAgICAjIE9NUFQgaW5pdGlhbGl6YXRpb24gaW50ZXJmYWNlCisgICAgICAgIG9tcHRfY29udHJvbDsgICAgICAgICMgT01QVCBjb250cm9sIGludGVyZmFjZQorICAgICAgICAKKyAgICAgICAgIworICAgICAgICAjIE9NUFQgc3RhdGUgcGxhY2Vob2xkZXJzCisgICAgICAgICMKKyAgICAgICAgb21wdF9pZGxlOworICAgICAgICBvbXB0X292ZXJoZWFkOworICAgICAgICBvbXB0X2JhcnJpZXJfd2FpdDsKKyAgICAgICAgb21wdF90YXNrX3dhaXQ7CisgICAgICAgIG9tcHRfbXV0ZXhfd2FpdDsKKworICAgICAgICBvbXBjXyo7ICAgICMgb21wLmggcmVuYW1lcyBzb21lIHN0YW5kYXJkIGZ1bmN0aW9ucyB0byBvbXBjXyouCisgICAgICAgIGttcF8qOyAgICAgIyBJbnRlbCBleHRlbnNpb25zLgorICAgICAgICBrbXBjXyo7ICAgICMgSW50ZWwgZXh0ZW5zaW9ucy4KKyAgICAgICAgX19rbXBjXyo7ICAjIEZ1bmN0aW9ucyBjYWxsZWQgYnkgY29tcGlsZXItZ2VuZXJhdGVkIGNvZGUuCisgICAgICAgIEdPTVBfKjsgICAgIyBHTlUgQyBjb21wYXRpYmlsaXR5IGZ1bmN0aW9ucy4KKworICAgICAgICBfWW91X211c3RfbGlua193aXRoXyo7ICAgICAjIE11dHVhbCBkZXRlY3Rpb24vTVMgY29tcGF0aWJpbGl0eSBzeW1ib2xzLgorCisKKyAgICAgICAgIworICAgICAgICAjIERlYnVnZ2VyIHN1cHBvcnQuCisgICAgICAgICMKKyNpZiBVU0VfREVCVUdHRVIKKyAgICAgICAgX19rbXBfZGVidWdnaW5nOworICAgICAgICBfX2ttcF9vbXBfZGVidWdfc3RydWN0X2luZm87CisjZW5kaWYgLyogVVNFX0RFQlVHR0VSICovCisKKyAgICAgICAgIworICAgICAgICAjIEludGVybmFsIGZ1bmN0aW9ucyBleHBvcnRlZCBmb3IgdGVzdGluZyBwdXJwb3Nlcy4KKyAgICAgICAgIworICAgICAgICBfX2ttcF9nZXRfcmVkdWNlX21ldGhvZDsKKyAgICAgICAgX19fa21wX2FsbG9jYXRlOworICAgICAgICBfX19rbXBfZnJlZTsKKyAgICAgICAgX19rbXBfdGhyZWFkX3Bvb2w7CisgICAgICAgIF9fa21wX3RocmVhZF9wb29sX250aDsKKworCV9fa21wX3Jlc2V0X3N0YXRzOworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAjCisgICAgICAgICMgSVRUIHN1cHBvcnQuCisgICAgICAgICMKKyAgICAgICAgIyBUaGUgZm9sbG93aW5nIGVudHJ5IHBvaW50cyBhcmUgYWRkZWQgc28gdGhhdCB0aGUgYmFja3RyYWNlcyBmcm9tCisgICAgICAgICMgdGhlIHRvb2xzIGNvbnRhaW4gbWVhbmluZ2Z1bCBuYW1lcyBmb3IgYWxsIHRoZSBmdW5jdGlvbnMgdGhhdCBtaWdodAorICAgICAgICAjIGFwcGVhciBpbiBhIGJhY2t0cmFjZSBvZiBhIHRocmVhZCB3aGljaCBpcyBibG9ja2VkIGluIHRoZSBSVEwuCisgICAgICAgIF9fa21wX2FjcXVpcmVfZHJkcGFfbG9jazsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9uZXN0ZWRfZHJkcGFfbG9jazsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9uZXN0ZWRfcXVldWluZ19sb2NrOworICAgICAgICBfX2ttcF9hY3F1aXJlX25lc3RlZF90YXNfbG9jazsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9uZXN0ZWRfdGlja2V0X2xvY2s7CisgICAgICAgIF9fa21wX2FjcXVpcmVfcXVldWluZ19sb2NrOworICAgICAgICBfX2ttcF9hY3F1aXJlX3Rhc19sb2NrOworICAgICAgICBfX2ttcF9hY3F1aXJlX3RpY2tldF9sb2NrOworICAgICAgICBfX2ttcF9mb3JrX2NhbGw7CisgICAgICAgIF9fa21wX2dldF9yZWR1Y2VfbWV0aG9kOworICAgICAgICBfX2ttcF9pbnZva2VfbWljcm90YXNrOworICAgICAgICBfX2ttcF9pdHRfZmluaV9pdHRsaWI7CisgICAgICAgIF9fa21wX2l0dF9pbml0X2l0dGxpYjsKKyAgICAgICAgX19rbXBfbGF1bmNoX21vbml0b3I7CisgICAgICAgIF9fa21wX2xhdW5jaF93b3JrZXI7CisgICAgICAgIF9fa21wX3JlYXBfbW9uaXRvcjsKKyAgICAgICAgX19rbXBfcmVhcF93b3JrZXI7CisgICAgICAgIF9fa21wX3JlbGVhc2VfMzI7CisgICAgICAgIF9fa21wX3JlbGVhc2VfNjQ7CisgICAgICAgIF9fa21wX3JlbGVhc2Vfb25jb3JlOworICAgICAgICBfX2ttcF93YWl0XzMyOworICAgICAgICBfX2ttcF93YWl0XzY0OworICAgICAgICBfX2ttcF93YWl0X29uY29yZTsKKyAgICAgICAgX19rbXBfd2FpdF95aWVsZF80OworCisgICAgICAgICMgaXR0bm90aWZ5IHN5bWJvbHMgdG8gYmUgdXNlZCBieSBkZWJ1Z2dlcgorICAgICAgICBfX2ttcF9pdHRfZmluaV9pdHRsaWI7CisgICAgICAgIF9fa21wX2l0dF9pbml0X2l0dGxpYjsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICBsb2NhbDogIyBOb24tZXhwb3J0ZWQgc3ltYm9scy4KKworICAgICAgICAqOyAgICAgICAgICMgQWxsIG90aGVyIHN5bWJvbHMgYXJlIG5vdCBleHBvcnRlZC4KKworfTsgIyBWRVJTSU9OCisKKyMgc2V0cyB1cCBHQ0MgT01QXyB2ZXJzaW9uIGRlcGVuZGVuY3kgY2hhaW4KK09NUF8xLjAgeworfTsKK09NUF8yLjAgeworfSBPTVBfMS4wOworT01QXzMuMCB7Cit9IE9NUF8yLjA7CitPTVBfMy4xIHsKK30gT01QXzMuMDsKK09NUF80LjAgeworfSBPTVBfMy4xOworCisjIHNldHMgdXAgR0NDIEdPTVBfIHZlcnNpb24gZGVwZW5kZW5jeSBjaGFpbgorR09NUF8xLjAgeworfTsKK0dPTVBfMi4wIHsKK30gR09NUF8xLjA7CitHT01QXzMuMCB7Cit9IEdPTVBfMi4wOworR09NUF80LjAgeworfSBHT01QXzMuMDsKKworIyBlbmQgb2YgZmlsZSAjCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9leHRyYWN0RXh0ZXJuYWwuY3BwIGIvZmluYWwvcnVudGltZS9zcmMvZXh0cmFjdEV4dGVybmFsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTZmZGI3Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvZXh0cmFjdEV4dGVybmFsLmNwcApAQCAtMCwwICsxLDQ5NyBAQAorLyoKKyAqIGV4dHJhY3RFeHRlcm5hbC5jcHAKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHN0cnN0cmVhbT4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8bWFwPgorCisvKiBHaXZlbiBhIHNldCBvZiBuIG9iamVjdCBmaWxlcyBoICgnZXh0ZXJuYWwnIG9iamVjdCBmaWxlcykgYW5kIGEgc2V0IG9mIG0KKyAgIG9iamVjdCBmaWxlcyBvICgnaW50ZXJuYWwnIG9iamVjdCBmaWxlcyksCisgICAxLiBEZXRlcm1pbmVzIHIsIHRoZSBzdWJzZXQgb2YgaCB0aGF0IG8gZGVwZW5kcyBvbiwgZGlyZWN0bHkgb3IgaW5kaXJlY3RseQorICAgMi4gUmVtb3ZlcyB0aGUgZmlsZXMgaW4gaCAtIHIgZnJvbSB0aGUgZmlsZSBzeXN0ZW0KKyAgIDMuIEZvciBlYWNoIGV4dGVybmFsIHN5bWJvbCBkZWZpbmVkIGluIHNvbWUgZmlsZSBpbiByLCByZW5hbWUgaXQgaW4gciBVIG8KKyAgICAgIGJ5IHByZWZpeGluZyBpdCB3aXRoICJfX2ttcF9leHRlcm5hbF8iCisgICBVc2FnZToKKyAgIGhpZGUuZXhlIDxuPiA8ZmlsZW5hbWVzIGZvciBoPiA8ZmlsZW5hbWVzIGZvciBvPgorCisgICBUaHVzLCB0aGUgcHJlZml4ZWQgc3ltYm9scyBiZWNvbWUgaGlkZGVuIGluIHRoZSBzZW5zZSB0aGF0IHRoZXkgbm93IGhhdmUgYSBzcGVjaWFsCisgICBwcmVmaXguCisqLworCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCit2b2lkIHN0b3AoY2hhciogZXJyb3JNc2cpIHsKKyAgICBwcmludGYoIiVzXG4iLCBlcnJvck1zZyk7CisgICAgZXhpdCgxKTsKK30KKworLy8gYW4gZW50cnkgaW4gdGhlIHN5bWJvbCB0YWJsZSBvZiBhIC5PQkogZmlsZQorY2xhc3MgU3ltYm9sIHsKK3B1YmxpYzoKKyAgICBfX2ludDY0IG5hbWU7CisgICAgdW5zaWduZWQgdmFsdWU7CisgICAgdW5zaWduZWQgc2hvcnQgc2VjdGlvbk51bSwgdHlwZTsKKyAgICBjaGFyIHN0b3JhZ2VDbGFzcywgbkF1eDsKK307CisKK2NsYXNzIF9yc3RyZWFtIDogcHVibGljIGlzdHJzdHJlYW0geworcHJpdmF0ZToKKyAgICBjb25zdCBjaGFyICpidWY7Citwcm90ZWN0ZWQ6CisgICAgX3JzdHJlYW0ocGFpcjxjb25zdCBjaGFyKiwgc3RyZWFtc2l6ZT4gcCk6aXN0cnN0cmVhbShwLmZpcnN0LHAuc2Vjb25kKSxidWYocC5maXJzdCl7fQorICAgIH5fcnN0cmVhbSgpIHsKKwlkZWxldGVbXWJ1ZjsKKyAgICB9Cit9OworCisvKiBBIHN0cmVhbSBlbmNhcHVzbGF0aW5nIHRoZSBjb250ZW50IG9mIGEgZmlsZSBvciB0aGUgY29udGVudCBvZiBhIHN0cmluZywgb3ZlcnJpZGluZyB0aGUKKyAgID4+IG9wZXJhdG9yIHRvIHJlYWQgdmFyaW91cyBpbnRlZ2VyIHR5cGVzIGluIGJpbmFyeSBmb3JtLCBhcyB3ZWxsIGFzIGEgc3ltYm9sIHRhYmxlCisgICBlbnRyeS4KKyovCitjbGFzcyByc3RyZWFtIDogcHVibGljIF9yc3RyZWFtIHsKK3ByaXZhdGU6CisgICAgdGVtcGxhdGU8Y2xhc3MgVD4KKyAgICBpbmxpbmUgcnN0cmVhbSYgZG9SZWFkKFQgJngpIHsKKwlyZWFkKChjaGFyKikmeCwgc2l6ZW9mKFQpKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgfQorICAgIHN0YXRpYyBwYWlyPGNvbnN0IGNoYXIqLCBzdHJlYW1zaXplPiBnZXRCdWYoY29uc3QgY2hhciAqZmlsZU5hbWUpIHsKKwlpZnN0cmVhbSByYXcoZmlsZU5hbWUsaW9zOjpiaW5hcnkgfCBpb3M6OmluKTsKKwlpZighcmF3LmlzX29wZW4oKSkKKwkgICAgc3RvcCgicnN0cmVhbS5nZXRCdWY6IEVycm9yIG9wZW5pbmcgZmlsZSIpOworCXJhdy5zZWVrZygwLGlvczo6ZW5kKTsKKwlzdHJlYW1wb3MgZmlsZVNpemUgPSByYXcudGVsbGcoKTsKKwlpZihmaWxlU2l6ZSA8IDApCisJICAgIHN0b3AoInJzdHJlYW0uZ2V0QnVmOiBFcnJvciByZWFkaW5nIGZpbGUiKTsKKwljaGFyICpidWYgPSBuZXcgY2hhcltmaWxlU2l6ZV07CisJcmF3LnNlZWtnKDAsaW9zOjpiZWcpOworCXJhdy5yZWFkKGJ1ZiwgZmlsZVNpemUpOworCXJldHVybiBwYWlyPGNvbnN0IGNoYXIqLCBzdHJlYW1zaXplPihidWYsZmlsZVNpemUpOworICAgIH0KK3B1YmxpYzoKKyAgICAvLyBjb25zdHJ1Y3QgZnJvbSBhIHN0cmluZworICAgIHJzdHJlYW0oY29uc3QgY2hhciAqYnVmLHN0cmVhbXNpemUgc2l6ZSk6X3JzdHJlYW0ocGFpcjxjb25zdCBjaGFyKixzdHJlYW1zaXplPihidWYsIHNpemUpKXt9CisgICAgLyogY29uc3RydWN0IGZyb20gYSBmaWxlIHdob2xlIGNvbnRlbnQgaXMgZnVsbHkgcmVhZCBvbmNlIHRvIGluaXRpYWxpemUgdGhlIGNvbnRlbnQgb2YKKyAgICAgICB0aGlzIHN0cmVhbQorICAgICovCisgICAgcnN0cmVhbShjb25zdCBjaGFyICpmaWxlTmFtZSk6X3JzdHJlYW0oZ2V0QnVmKGZpbGVOYW1lKSl7fQorICAgIHJzdHJlYW0mIG9wZXJhdG9yPj4oaW50ICZ4KSB7CisJcmV0dXJuIGRvUmVhZCh4KTsKKyAgICB9CisgICAgcnN0cmVhbSYgb3BlcmF0b3I+Pih1bnNpZ25lZCAmeCkgeworCXJldHVybiBkb1JlYWQoeCk7CisgICAgfQorICAgIHJzdHJlYW0mIG9wZXJhdG9yPj4oc2hvcnQgJngpIHsKKwlyZXR1cm4gZG9SZWFkKHgpOworICAgIH0KKyAgICByc3RyZWFtJiBvcGVyYXRvcj4+KHVuc2lnbmVkIHNob3J0ICZ4KSB7CisJcmV0dXJuIGRvUmVhZCh4KTsKKyAgICB9CisgICAgcnN0cmVhbSYgb3BlcmF0b3I+PihTeW1ib2wgJmUpIHsKKwlyZWFkKChjaGFyKikmZSwgMTgpOworCXJldHVybiAqdGhpczsKKyAgICB9Cit9OworCisvLyBzdHJpbmcgdGFibGUgaW4gYSAuT0JKIGZpbGUKK2NsYXNzIFN0cmluZ1RhYmxlIHsKK3ByaXZhdGU6CisgICAgbWFwPHN0cmluZywgdW5zaWduZWQ+IGRpcmVjdG9yeTsKKyAgICBzaXplX3QgbGVuZ3RoOworICAgIGNoYXIgKmRhdGE7CisKKyAgICAvLyBtYWtlIDxkaXJlY3Rvcnk+IGZyb20gPGxlbmd0aD4gYnl0ZXMgaW4gPGRhdGE+CisgICAgdm9pZCBtYWtlRGlyZWN0b3J5KHZvaWQpIHsKKwl1bnNpZ25lZCBpID0gNDsKKwl3aGlsZShpIDwgbGVuZ3RoKSB7CisJICAgIHN0cmluZyBzID0gc3RyaW5nKGRhdGEgKyBpKTsKKwkgICAgZGlyZWN0b3J5Lmluc2VydChtYWtlX3BhaXIocywgaSkpOworCSAgICBpICs9IHMuc2l6ZSgpICsgMTsKKwl9CisgICAgfQorICAgIC8vIGluaXRpYWxpemUgPGxlbmd0aD4gYW5kIDxkYXRhPiB3aXRoIGNvbnRlbnRzIHNwZWNpZmllZCBieSB0aGUgYXJndW1lbnRzCisgICAgdm9pZCBpbml0KGNvbnN0IGNoYXIgKl9kYXRhKSB7CisJdW5zaWduZWQgX2xlbmd0aCA9ICoodW5zaWduZWQqKV9kYXRhOworCisJaWYoX2xlbmd0aCA8IHNpemVvZih1bnNpZ25lZCkgfHwgX2xlbmd0aCAhPSAqKHVuc2lnbmVkKilfZGF0YSkKKwkgICAgc3RvcCgiU3RyaW5nVGFibGUuaW5pdDogSW52YWxpZCBzeW1ib2wgdGFibGUiKTsKKwlpZihfZGF0YVtfbGVuZ3RoIC0gMV0pIHsKKwkgICAgLy8gdG8gcHJldmVudCBydW5hd2F5IHN0cmluZ3MsIG1ha2Ugc3VyZSB0aGUgZGF0YSBlbmRzIHdpdGggYSB6ZXJvCisJICAgIGRhdGEgPSBuZXcgY2hhcltsZW5ndGggPSBfbGVuZ3RoICsgMV07CisJICAgIGRhdGFbX2xlbmd0aF0gPSAwOworCX0gZWxzZSB7CisJICAgIGRhdGEgPSBuZXcgY2hhcltsZW5ndGggPSBfbGVuZ3RoXTsKKwl9CisJKih1bnNpZ25lZCopZGF0YSA9IGxlbmd0aDsKKwlLTVBfTUVNQ1BZKGRhdGEgKyBzaXplb2YodW5zaWduZWQpLCBfZGF0YSArIHNpemVvZih1bnNpZ25lZCksCisJICAgICAgICAgICBsZW5ndGggLSBzaXplb2YodW5zaWduZWQpKTsKKwltYWtlRGlyZWN0b3J5KCk7CisgICAgfQorcHVibGljOgorICAgIFN0cmluZ1RhYmxlKHJzdHJlYW0gJmYpIHsKKwkvKiBDb25zdHJ1Y3Qgc3RyaW5nIHRhYmxlIGJ5IHJlYWRpbmcgZnJvbSBmLgorCSAqLworCXN0cmVhbXBvcyBzOworCXVuc2lnbmVkIHN0clNpemU7CisJY2hhciAqc3RyRGF0YTsKKworCXMgPSBmLnRlbGxnKCk7CisJZj4+c3RyU2l6ZTsKKwlpZihzdHJTaXplIDwgc2l6ZW9mKHVuc2lnbmVkKSkKKwkgICAgc3RvcCgiU3RyaW5nVGFibGU6IEludmFsaWQgc3RyaW5nIHRhYmxlIik7CisJc3RyRGF0YSA9IG5ldyBjaGFyW3N0clNpemVdOworCSoodW5zaWduZWQqKXN0ckRhdGEgPSBzdHJTaXplOworCS8vIHJlYWQgdGhlIHJhdyBkYXRhIGludG8gPHN0ckRhdGE+CisJZi5yZWFkKHN0ckRhdGEgKyBzaXplb2YodW5zaWduZWQpLCBzdHJTaXplIC0gc2l6ZW9mKHVuc2lnbmVkKSk7CisJcyA9IGYudGVsbGcoKSAtIHM7CisJaWYocyA8IHN0clNpemUpCisJICAgIHN0b3AoIlN0cmluZ1RhYmxlOiBVbmV4cGVjdGVkIEVPRiIpOworCWluaXQoc3RyRGF0YSk7CisJZGVsZXRlW11zdHJEYXRhOworICAgIH0KKyAgICBTdHJpbmdUYWJsZShjb25zdCBzZXQ8c3RyaW5nPiAmc3RyaW5ncykgeworCS8qIENvbnN0cnVjdCBzdHJpbmcgdGFibGUgZnJvbSBnaXZlbiBzdHJpbmdzLgorCSAqLworCWNoYXIgKnA7CisJc2V0PHN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0OworCXNpemVfdCBzOworCisJLy8gY291bnQgcmVxdWlyZWQgc2l6ZSBmb3IgZGF0YQorCWZvcihsZW5ndGggPSBzaXplb2YodW5zaWduZWQpLCBpdCA9IHN0cmluZ3MuYmVnaW4oKTsgaXQgIT0gc3RyaW5ncy5lbmQoKTsgKytpdCkgeworCSAgICBzaXplX3QgbCA9ICgqaXQpLnNpemUoKTsKKworCSAgICBpZihsID4gKHVuc2lnbmVkKSAweEZGRkZGRkZGKQorCQlzdG9wKCJTdHJpbmdUYWJsZTogU3RyaW5nIHRvbyBsb25nIik7CisJICAgIGlmKGwgPiA4KSB7CisJCWxlbmd0aCArPSBsICsgMTsKKwkJaWYobGVuZ3RoID4gKHVuc2lnbmVkKSAweEZGRkZGRkZGKQorCQkgICAgc3RvcCgiU3RyaW5nVGFibGU6IFN5bWJvbCB0YWJsZSB0b28gbG9uZyIpOworCSAgICB9CisJfQorCWRhdGEgPSBuZXcgY2hhcltsZW5ndGhdOworCSoodW5zaWduZWQqKWRhdGEgPSBsZW5ndGg7CisJLy8gcG9wdWxhdGUgZGF0YSBhbmQgZGlyZWN0b3J5CisJZm9yKHAgPSBkYXRhICsgc2l6ZW9mKHVuc2lnbmVkKSwgaXQgPSBzdHJpbmdzLmJlZ2luKCk7IGl0ICE9IHN0cmluZ3MuZW5kKCk7ICsraXQpIHsKKwkgICAgY29uc3Qgc3RyaW5nICZzdHIgPSAqaXQ7CisJICAgIHNpemVfdCBsID0gc3RyLnNpemUoKTsKKwkgICAgaWYobCA+IDgpIHsKKwkJZGlyZWN0b3J5Lmluc2VydChtYWtlX3BhaXIoc3RyLCBwIC0gZGF0YSkpOworCQlLTVBfTUVNQ1BZKHAsIHN0ci5jX3N0cigpLCBsKTsKKwkJcFtsXSA9IDA7CisJCXAgKz0gbCArIDE7CisJICAgIH0KKwl9CisgICAgfQorICAgIH5TdHJpbmdUYWJsZSgpIHsKKwlkZWxldGVbXSBkYXRhOworICAgIH0KKyAgICAvKiBSZXR1cm5zIGVuY29kaW5nIGZvciBnaXZlbiBzdHJpbmcgYmFzZWQgb24gdGhpcyBzdHJpbmcgdGFibGUuCisgICAgICAgRXJyb3IgaWYgc3RyaW5nIGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gOCBidXQgc3RyaW5nIGlzIG5vdCBpbgorICAgICAgIHRoZSBzdHJpbmcgdGFibGUtLXJldHVybnMgMC4KKyAgICAqLworICAgIF9faW50NjQgZW5jb2RlKGNvbnN0IHN0cmluZyAmc3RyKSB7CisJX19pbnQ2NCByOworCisJaWYoc3RyLnNpemUoKSA8PSA4KSB7CisJICAgIC8vIGVuY29kZWQgZGlyZWN0bHkKKwkgICAgKChjaGFyKikmcilbN10gPSAwOworCSAgICBLTVBfU1RSTkNQWV9TKChjaGFyKikmciwgc2l6ZW9mKHIpLCBzdHIuY19zdHIoKSwgOCk7CisJICAgIHJldHVybiByOworCX0gZWxzZSB7CisJICAgIC8vIHJlcHJlc2VudGVkIGFzIGluZGV4IGludG8gdGFibGUKKwkgICAgbWFwPHN0cmluZyx1bnNpZ25lZD46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZGlyZWN0b3J5LmZpbmQoc3RyKTsKKwkgICAgaWYoaXQgPT0gZGlyZWN0b3J5LmVuZCgpKQorCQlzdG9wKCJTdHJpbmdUYWJsZTo6ZW5jb2RlOiBTdHJpbmcgbm93IGZvdW5kIGluIHN0cmluZyB0YWJsZSIpOworCSAgICAoKHVuc2lnbmVkKikmcilbMF0gPSAwOworCSAgICAoKHVuc2lnbmVkKikmcilbMV0gPSAoKml0KS5zZWNvbmQ7CisJICAgIHJldHVybiByOworCX0KKyAgICB9CisgICAgLyogUmV0dXJucyBzdHJpbmcgcmVwcmVzZW50ZWQgYnkgeCBiYXNlZCBvbiB0aGlzIHN0cmluZyB0YWJsZS4KKyAgICAgICBFcnJvciBpZiB4IHJlZmVyZW5jZXMgYW4gaW52YWxpZCBwb3NpdGlvbiBpbiB0aGUgdGFibGUtLXJldHVybnMKKyAgICAgICB0aGUgZW1wdHkgc3RyaW5nLgorICAgICovCisgICAgc3RyaW5nIGRlY29kZShfX2ludDY0IHgpIGNvbnN0IHsKKwlpZigqKHVuc2lnbmVkKikmeCA9PSAwKSB7CisJICAgIC8vIHJlcHJlc2VudGVkIGFzIGluZGV4IGludG8gdGFibGUKKwkgICAgdW5zaWduZWQgJnAgPSAoKHVuc2lnbmVkKikmeClbMV07CisJICAgIGlmKHAgPj0gbGVuZ3RoKQorCQlzdG9wKCJTdHJpbmdUYWJsZTo6ZGVjb2RlOiBJbnZhbGlkIHN0cmluZyB0YWJsZSBsb29rdXAiKTsKKwkgICAgcmV0dXJuIHN0cmluZyhkYXRhICsgcCk7CisJfSBlbHNlIHsKKwkgICAgLy8gZW5jb2RlZCBkaXJlY3RseQorCSAgICBjaGFyICpwID0gKGNoYXIqKSZ4OworCSAgICBpbnQgaTsKKworCSAgICBmb3IoaSA9IDA7IGkgPCA4ICYmIHBbaV07ICsraSk7CisJICAgIHJldHVybiBzdHJpbmcocCwgaSk7CisJfQorICAgIH0KKyAgICB2b2lkIHdyaXRlKG9zdHJlYW0gJm9zKSB7CisJb3Mud3JpdGUoZGF0YSwgbGVuZ3RoKTsKKyAgICB9Cit9OworCisvKiBmb3IgdGhlIG5hbWVkIG9iamVjdCBmaWxlLCBkZXRlcm1pbmVzIHRoZSBzZXQgb2YgZGVmaW5lZCBzeW1ib2xzIGFuZCB0aGUgc2V0IG9mIHVuZGVmaW5lZCBleHRlcm5hbCBzeW1ib2xzCisgICBhbmQgd3JpdGVzIHRoZW0gdG8gPGRlZmluZWQ+IGFuZCA8dW5kZWZpbmVkPiByZXNwZWN0aXZlbHkKKyovCit2b2lkIGNvbXB1dGVFeHRlcm5hbFN5bWJvbHMoY29uc3QgY2hhciAqZmlsZU5hbWUsIHNldDxzdHJpbmc+ICpkZWZpbmVkLCBzZXQ8c3RyaW5nPiAqdW5kZWZpbmVkKXsKKyAgICBzdHJlYW1wb3MgZmlsZVNpemU7CisgICAgc2l6ZV90IHN0clRhYlN0YXJ0OworICAgIHVuc2lnbmVkIHN5bVRhYlN0YXJ0LCBzeW1ORW50cmllczsKKyAgICByc3RyZWFtIGYoZmlsZU5hbWUpOworCisgICAgZi5zZWVrZygwLGlvczo6ZW5kKTsKKyAgICBmaWxlU2l6ZSA9IGYudGVsbGcoKTsKKworICAgIGYuc2Vla2coOCk7CisgICAgZiA+PiBzeW1UYWJTdGFydCA+PiBzeW1ORW50cmllczsKKyAgICAvLyBzZWVrIHRvIHRoZSBzdHJpbmcgdGFibGUKKyAgICBmLnNlZWtnKHN0clRhYlN0YXJ0ID0gc3ltVGFiU3RhcnQgKyAxOCAqIChzaXplX3Qpc3ltTkVudHJpZXMpOworICAgIGlmKGYuZW9mKCkpIHsKKwlwcmludGYoImNvbXB1dGVFeHRlcm5hbFN5bWJvbHM6IGZpbGVOYW1lPSclcycsIGZpbGVTaXplID0gJWx1LCBzeW1UYWJTdGFydCA9ICV1LCBzeW1ORW50cmllcyA9ICV1XG4iLAorCSAgICAgICBmaWxlTmFtZSwgKHVuc2lnbmVkIGxvbmcpIGZpbGVTaXplLCBzeW1UYWJTdGFydCwgc3ltTkVudHJpZXMpOworCXN0b3AoImNvbXB1dGVFeHRlcm5hbFN5bWJvbHM6IFVuZXhwZWN0ZWQgRU9GIDEiKTsKKyAgICB9CisgICAgU3RyaW5nVGFibGUgc3RyaW5nVGFibGUoZik7IC8vIHJlYWQgdGhlIHN0cmluZyB0YWJsZQorICAgIGlmKGYudGVsbGcoKSAhPSBmaWxlU2l6ZSkKKwlzdG9wKCJjb21wdXRlRXh0ZXJuYWxTeW1ib2xzOiBVbmV4cGVjdGVkIGRhdGEgYWZ0ZXIgc3RyaW5nIHRhYmxlIik7CisKKyAgICBmLmNsZWFyKCk7CisgICAgZi5zZWVrZyhzeW1UYWJTdGFydCk7IC8vIHNlZWsgdG8gdGhlIHN5bWJvbCB0YWJsZQorCisgICAgZGVmaW5lZC0+Y2xlYXIoKTsgdW5kZWZpbmVkLT5jbGVhcigpOworICAgIGZvcihpbnQgaSA9IDA7IGkgPCBzeW1ORW50cmllczsgKytpKSB7CisJLy8gcHJvY2VzcyBlYWNoIGVudHJ5CisJU3ltYm9sIGU7CisKKwlpZihmLmVvZigpKQorCSAgICBzdG9wKCJjb21wdXRlRXh0ZXJuYWxTeW1ib2xzOiBVbmV4cGVjdGVkIEVPRiAyIik7CisJZj4+ZTsKKwlpZihmLmZhaWwoKSkKKwkgICAgc3RvcCgiY29tcHV0ZUV4dGVybmFsU3ltYm9sczogRmlsZSByZWFkIGVycm9yIik7CisJaWYoZS5uQXV4KSB7IC8vIGF1eGlsaWFyeSBlbnRyeTogc2tpcAorCSAgICBmLnNlZWtnKGUubkF1eCAqIDE4LCBpb3M6OmN1cik7CisJICAgIGkgKz0gZS5uQXV4OworCX0KKwkvLyBpZiBzeW1ib2wgaXMgZXh0ZXJuIGFuZCBkZWZpbmVkIGluIHRoZSBjdXJyZW50IGZpbGUsIGluc2VydCBpdAorCWlmKGUuc3RvcmFnZUNsYXNzID09IDIpCisJICAgIGlmKGUuc2VjdGlvbk51bSkKKwkJZGVmaW5lZC0+aW5zZXJ0KHN0cmluZ1RhYmxlLmRlY29kZShlLm5hbWUpKTsKKwkgICAgZWxzZQorCQl1bmRlZmluZWQtPmluc2VydChzdHJpbmdUYWJsZS5kZWNvZGUoZS5uYW1lKSk7CisgICAgfQorfQorCisvKiBGb3IgZWFjaCBvY2N1cnJlbmNlIG9mIGFuIGV4dGVybmFsIHN5bWJvbCBpbiB0aGUgb2JqZWN0IGZpbGUgbmFtZWQgYnkKKyAgIGJ5IDxmaWxlTmFtZT4gdGhhdCBpcyBhIG1lbWJlciBvZiA8aGlkZT4sIHJlbmFtZXMgaXQgYnkgcHJlZml4aW5nCisgICB3aXRoICJfX2ttcF9leHRlcm5hbF8iLCB3cml0aW5nIGJhY2sgdGhlIGZpbGUgaW4tcGxhY2UKKyovCit2b2lkIGhpZGVTeW1ib2xzKGNoYXIgKmZpbGVOYW1lLCBjb25zdCBzZXQ8c3RyaW5nPiAmaGlkZSkgeworICAgIHN0YXRpYyBjb25zdCBzdHJpbmcgcHJlZml4KCJfX2ttcF9leHRlcm5hbF8iKTsKKyAgICBzZXQ8c3RyaW5nPiBzdHJpbmdzOyAvLyBzZXQgb2YgYWxsIG9jY3VycmluZyBzeW1ib2xzLCBhcHByb3ByaWF0ZWx5IHByZWZpeGVkCisgICAgc3RyZWFtcG9zIGZpbGVTaXplOworICAgIHNpemVfdCBzdHJUYWJTdGFydDsKKyAgICB1bnNpZ25lZCBzeW1UYWJTdGFydCwgc3ltTkVudHJpZXM7CisgICAgaW50IGk7CisgICAgcnN0cmVhbSBpbihmaWxlTmFtZSk7CisKKyAgICBpbi5zZWVrZygwLGlvczo6ZW5kKTsKKyAgICBmaWxlU2l6ZSA9IGluLnRlbGxnKCk7CisKKyAgICBpbi5zZWVrZyg4KTsKKyAgICBpbiA+PiBzeW1UYWJTdGFydCA+PiBzeW1ORW50cmllczsKKyAgICBpbi5zZWVrZyhzdHJUYWJTdGFydCA9IHN5bVRhYlN0YXJ0ICsgMTggKiAoc2l6ZV90KXN5bU5FbnRyaWVzKTsKKyAgICBpZihpbi5lb2YoKSkKKwlzdG9wKCJoaWRlU3ltYm9sczogVW5leHBlY3RlZCBFT0YiKTsKKyAgICBTdHJpbmdUYWJsZSBzdHJpbmdUYWJsZU9sZChpbik7IC8vIHJlYWQgb3JpZ2luYWwgc3RyaW5nIHRhYmxlCisKKyAgICBpZihpbi50ZWxsZygpICE9IGZpbGVTaXplKQorCXN0b3AoImhpZGVTeW1ib2xzOiBVbmV4cGVjdGVkIGRhdGEgYWZ0ZXIgc3RyaW5nIHRhYmxlIik7CisKKyAgICAvLyBjb21wdXRlIHNldCBvZiBvY2N1cnJpbmcgc3RyaW5ncyB3aXRoIHByZWZpeCBhZGRlZAorICAgIGZvcihpID0gMDsgaSA8IHN5bU5FbnRyaWVzOyArK2kpIHsKKwlTeW1ib2wgZTsKKworCWluLnNlZWtnKHN5bVRhYlN0YXJ0ICsgaSAqIDE4KTsKKwlpZihpbi5lb2YoKSkKKwkgICAgc3RvcCgiaGlkZVN5bWJvbHM6IFVuZXhwZWN0ZWQgRU9GIik7CisJaW4gPj4gZTsKKwlpZihpbi5mYWlsKCkpCisJICAgIHN0b3AoImhpZGVTeW1ib2xzOiBGaWxlIHJlYWQgZXJyb3IiKTsKKwlpZihlLm5BdXgpCisJICAgIGkgKz0gZS5uQXV4OworCWNvbnN0IHN0cmluZyAmcyA9IHN0cmluZ1RhYmxlT2xkLmRlY29kZShlLm5hbWUpOworCS8vIGlmIHN5bWJvbCBpcyBleHRlcm4gYW5kIGZvdW5kIGluIDxoaWRlPiwgcHJlZml4IGFuZCBpbnNlcnQgaW50byBzdHJpbmdzLAorCS8vIG90aGVyd2lzZSwganVzdCBpbnNlcnQgaW50byBzdHJpbmdzIHdpdGhvdXQgcHJlZml4CisJc3RyaW5ncy5pbnNlcnQoIChlLnN0b3JhZ2VDbGFzcyA9PSAyICYmIGhpZGUuZmluZChzKSAhPSBoaWRlLmVuZCgpKSA/CisJCQlwcmVmaXggKyBzIDogcyk7CisgICAgfQorCisgICAgb2ZzdHJlYW0gb3V0KGZpbGVOYW1lLCBpb3M6OnRydW5jIHwgaW9zOjpvdXQgfCBpb3M6OmJpbmFyeSk7CisgICAgaWYoIW91dC5pc19vcGVuKCkpCisJc3RvcCgiaGlkZVN5bWJvbHM6IEVycm9yIG9wZW5pbmcgb3V0cHV0IGZpbGUiKTsKKworICAgIC8vIG1ha2UgbmV3IHN0cmluZyB0YWJsZSBmcm9tIHN0cmluZyBzZXQKKyAgICBTdHJpbmdUYWJsZSBzdHJpbmdUYWJsZU5ldyA9IFN0cmluZ1RhYmxlKHN0cmluZ3MpOworCisgICAgLy8gY29weSBpbnB1dCBmaWxlIHRvIG91dHB1dCBmaWxlIHVwIHRvIGp1c3QgYmVmb3JlIHRoZSBzeW1ib2wgdGFibGUKKyAgICBpbi5zZWVrZygwKTsKKyAgICBjaGFyICpidWYgPSBuZXcgY2hhcltzeW1UYWJTdGFydF07CisgICAgaW4ucmVhZChidWYsIHN5bVRhYlN0YXJ0KTsKKyAgICBvdXQud3JpdGUoYnVmLCBzeW1UYWJTdGFydCk7CisgICAgZGVsZXRlIFtdYnVmOworCisgICAgLy8gY29weSBpbnB1dCBzeW1ib2wgdGFibGUgdG8gb3V0cHV0IHN5bWJvbCB0YWJsZSB3aXRoIG5hbWUgdHJhbnNsYXRpb24KKyAgICBmb3IoaSA9IDA7IGkgPCBzeW1ORW50cmllczsgKytpKSB7CisJU3ltYm9sIGU7CisKKwlpbi5zZWVrZyhzeW1UYWJTdGFydCArIGkqMTgpOworCWlmKGluLmVvZigpKQorCSAgICBzdG9wKCJoaWRlU3ltYm9sczogVW5leHBlY3RlZCBFT0YiKTsKKwlpbiA+PiBlOworCWlmKGluLmZhaWwoKSkKKwkgICAgc3RvcCgiaGlkZVN5bWJvbHM6IEZpbGUgcmVhZCBlcnJvciIpOworCWNvbnN0IHN0cmluZyAmcyA9IHN0cmluZ1RhYmxlT2xkLmRlY29kZShlLm5hbWUpOworCW91dC5zZWVrcChzeW1UYWJTdGFydCArIGkqMTgpOworCWUubmFtZSA9IHN0cmluZ1RhYmxlTmV3LmVuY29kZSggKGUuc3RvcmFnZUNsYXNzID09IDIgJiYgaGlkZS5maW5kKHMpICE9IGhpZGUuZW5kKCkpID8KKwkJCQkJcHJlZml4ICsgcyA6IHMpOworCW91dC53cml0ZSgoY2hhciopJmUsIDE4KTsKKwlpZihvdXQuZmFpbCgpKQorCSAgICBzdG9wKCJoaWRlU3ltYm9sczogRmlsZSB3cml0ZSBlcnJvciIpOworCWlmKGUubkF1eCkgeworCSAgICAvLyBjb3B5IGF1eGlsaWFyeSBzeW1ib2wgdGFibGUgZW50cmllcworCSAgICBpbnQgbkF1eCA9IGUubkF1eDsKKwkgICAgZm9yKGludCBqID0gMTsgaiA8PSBuQXV4OyArK2opIHsKKwkJaW4gPj4gZTsKKwkJb3V0LnNlZWtwKHN5bVRhYlN0YXJ0ICsgKGkgKyBqKSAqIDE4KTsKKwkJb3V0LndyaXRlKChjaGFyKikmZSwgMTgpOworCSAgICB9CisJICAgIGkgKz0gbkF1eDsKKwl9CisgICAgfQorICAgIC8vIG91dHB1dCBzdHJpbmcgdGFibGUKKyAgICBzdHJpbmdUYWJsZU5ldy53cml0ZShvdXQpOworfQorCisvLyByZXR1cm5zIHRydWUgaWZmIDxhPiBhbmQgPGI+IGhhdmUgbm8gY29tbW9uIGVsZW1lbnQKK3RlbXBsYXRlIDxjbGFzcyBUPgorYm9vbCBpc0Rpc2pvaW50KGNvbnN0IHNldDxUPiAmYSwgY29uc3Qgc2V0PFQ+ICZiKSB7CisgICAgc2V0PFQ+Ojpjb25zdF9pdGVyYXRvciBpdGEsIGl0YjsKKworICAgIGZvcihpdGEgPSBhLmJlZ2luKCksIGl0YiA9IGIuYmVnaW4oKTsgaXRhICE9IGEuZW5kKCkgJiYgaXRiICE9IGIuZW5kKCk7KSB7CisJY29uc3QgVCAmdGEgPSAqaXRhLCAmdGIgPSAqaXRiOworCWlmKHRhIDwgdGIpCisJICAgICsraXRhOworCWVsc2UgaWYgKHRiIDwgdGEpCisJICAgICsraXRiOworCWVsc2UKKwkgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyogcHJlY29uZGl0aW9uOiA8ZGVmaW5lZD4gYW5kIDx1bmRlZmluZWQ+IGFyZSBhcnJheXMgd2l0aCA8blRvdGFsPiBlbGVtZW50cyB3aGVyZQorICAgPG5Ub3RhbD4gPj0gPG5FeHRlcm5hbD4uICBUaGUgZmlyc3QgPG5FeHRlcm5hbD4gZWxlbWVudHMgY29ycmVzcG9uZCB0byB0aGUgZXh0ZXJuYWwgb2JqZWN0CisgICBmaWxlcyBhbmQgdGhlIHJlc3QgY29ycmVzcG9uZCB0byB0aGUgaW50ZXJuYWwgb2JqZWN0IGZpbGVzLgorICAgcG9zdGNvbmRpdGlvbjogZmlsZSB4IGlzIHNhaWQgdG8gZGVwZW5kIG9uIGZpbGUgeSBpZiB1bmRlZmluZWRbeF0gYW5kIGRlZmluZWRbeV0gYXJlIG5vdAorICAgZGlzam9pbnQuICBSZXR1cm5zIHRoZSB0cmFuc2l0aXZlIGNsb3N1cmUgb2YgdGhlIHNldCBvZiBpbnRlcm5hbCBvYmplY3QgZmlsZXMsIGFzIGEgc2V0IG9mCisgICBmaWxlIGluZGV4ZXMsIHVuZGVyIHRoZSAnZGVwZW5kcyBvbicgcmVsYXRpb24sIG1pbnVzIHRoZSBzZXQgb2YgaW50ZXJuYWwgb2JqZWN0IGZpbGVzLgorKi8KK3NldDxpbnQ+ICpmaW5kUmVxdWlyZWRFeHRlcm5hbChpbnQgbkV4dGVybmFsLCBpbnQgblRvdGFsLCBzZXQ8c3RyaW5nPiAqZGVmaW5lZCwgc2V0PHN0cmluZz4gKnVuZGVmaW5lZCkgeworICAgIHNldDxpbnQ+ICpyZXF1aXJlZCA9IG5ldyBzZXQ8aW50PjsKKyAgICBzZXQ8aW50PiBmcmVzaFsyXTsKKyAgICBpbnQgaSwgY3VyID0gMDsKKyAgICBib29sIGNoYW5nZWQ7CisKKyAgICBmb3IoaSA9IG5Ub3RhbCAtIDE7IGkgPj0gbkV4dGVybmFsOyAtLWkpCisJZnJlc2hbY3VyXS5pbnNlcnQoaSk7CisgICAgZG8geworCWNoYW5nZWQgPSBmYWxzZTsKKwlmb3Ioc2V0PGludD46Oml0ZXJhdG9yIGl0ID0gZnJlc2hbY3VyXS5iZWdpbigpOyBpdCAhPSBmcmVzaFtjdXJdLmVuZCgpOyArK2l0KSB7CisJICAgIHNldDxzdHJpbmc+ICZzID0gdW5kZWZpbmVkWyppdF07CisKKwkgICAgZm9yKGkgPSAwOyBpIDwgbkV4dGVybmFsOyArK2kpIHsKKwkJaWYocmVxdWlyZWQtPmZpbmQoaSkgPT0gcmVxdWlyZWQtPmVuZCgpKSB7CisJCSAgICBpZighaXNEaXNqb2ludChkZWZpbmVkW2ldLCBzKSkgeworCQkJLy8gZm91bmQgYSBuZXcgcXVhbGlmeWluZyBlbGVtZW50CisJCQlyZXF1aXJlZC0+aW5zZXJ0KGkpOworCQkJZnJlc2hbMSAtIGN1cl0uaW5zZXJ0KGkpOworCQkJY2hhbmdlZCA9IHRydWU7CisJCSAgICB9CisJCX0KKwkgICAgfQorCX0KKwlmcmVzaFtjdXJdLmNsZWFyKCk7CisJY3VyID0gMSAtIGN1cjsKKyAgICB9IHdoaWxlKGNoYW5nZWQpOworICAgIHJldHVybiByZXF1aXJlZDsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgaW50IG5FeHRlcm5hbCwgbkludGVybmFsLCBpOworICAgIHNldDxzdHJpbmc+ICpkZWZpbmVkLCAqdW5kZWZpbmVkOworICAgIHNldDxpbnQ+OjppdGVyYXRvciBpdDsKKworICAgIGlmKGFyZ2MgPCAzKQorCXN0b3AoIlBsZWFzZSBzcGVjaWZ5IGEgcG9zaXRpdmUgaW50ZWdlciBmb2xsb3dlZCBieSBhIGxpc3Qgb2Ygb2JqZWN0IGZpbGVuYW1lcyIpOworICAgIG5FeHRlcm5hbCA9IGF0b2koYXJndlsxXSk7CisgICAgaWYobkV4dGVybmFsIDw9IDApCisJc3RvcCgiUGxlYXNlIHNwZWNpZnkgYSBwb3NpdGl2ZSBpbnRlZ2VyIGZvbGxvd2VkIGJ5IGEgbGlzdCBvZiBvYmplY3QgZmlsZW5hbWVzIik7CisgICAgaWYobkV4dGVybmFsICsgIDIgPiBhcmdjKQorCXN0b3AoIlRvbyBmZXcgZXh0ZXJuYWwgb2JqZWN0cyIpOworICAgIG5JbnRlcm5hbCA9IGFyZ2MgLSBuRXh0ZXJuYWwgLSAyOworICAgIGRlZmluZWQgPSBuZXcgc2V0PHN0cmluZz5bYXJnYyAtIDJdOworICAgIHVuZGVmaW5lZCA9IG5ldyBzZXQ8c3RyaW5nPlthcmdjIC0gMl07CisKKyAgICAvLyBkZXRlcm1pbmUgdGhlIHNldCBvZiBkZWZpbmVkIGFuZCB1bmRlZmluZWQgZXh0ZXJuYWwgc3ltYm9scworICAgIGZvcihpID0gMjsgaSA8IGFyZ2M7ICsraSkKKwljb21wdXRlRXh0ZXJuYWxTeW1ib2xzKGFyZ3ZbaV0sIGRlZmluZWQgKyBpIC0gMiwgdW5kZWZpbmVkICsgaSAtIDIpOworCisgICAgLy8gZGV0ZXJtaW5lIHRoZSBzZXQgb2YgcmVxdWlyZWQgZXh0ZXJuYWwgZmlsZXMKKyAgICBzZXQ8aW50PiAqcmVxdWlyZWRFeHRlcm5hbCA9IGZpbmRSZXF1aXJlZEV4dGVybmFsKG5FeHRlcm5hbCwgYXJnYyAtIDIsIGRlZmluZWQsIHVuZGVmaW5lZCk7CisgICAgc2V0PHN0cmluZz4gaGlkZTsKKworICAgIC8qIGRldGVybWluZSB0aGUgc2V0IG9mIHN5bWJvbHMgdG8gaGlkZS0tbmFtZWx5IGRlZmluZWQgZXh0ZXJuYWwgc3ltYm9scyBvZiB0aGUKKyAgICAgICByZXF1aXJlZCBleHRlcm5hbCBmaWxlcworICAgICovCisgICAgZm9yKGl0ID0gcmVxdWlyZWRFeHRlcm5hbC0+YmVnaW4oKTsgaXQgIT0gcmVxdWlyZWRFeHRlcm5hbC0+ZW5kKCk7ICsraXQpIHsKKwlpbnQgaWR4ID0gKml0OworCXNldDxzdHJpbmc+OjppdGVyYXRvciBpdDI7CisJLyogV2UgaGF2ZSB0byBpbnNlcnQgb25lIGVsZW1lbnQgYXQgYSB0aW1lIGluc3RlYWQgb2YgaW5zZXJ0aW5nIGEgcmFuZ2UgYmVjYXVzZQorCSAgIHRoZSBpbnNlcnQgbWVtYmVyIGZ1bmN0aW9uIHRha2luZyBhIHJhbmdlIGRvZXNuJ3QgZXhpc3Qgb24gV2luZG93cyogT1MsIGF0IGxlYXN0CisJICAgYXQgdGhlIHRpbWUgb2YgdGhpcyB3cml0aW5nLgorCSovCisJZm9yKGl0MiA9IGRlZmluZWRbaWR4XS5iZWdpbigpOyBpdDIgIT0gZGVmaW5lZFtpZHhdLmVuZCgpOyArK2l0MikKKwkgICAgaGlkZS5pbnNlcnQoKml0Mik7CisgICAgfQorCisgICAgLyogcHJvY2VzcyB0aGUgZXh0ZXJuYWwgZmlsZXMtLXJlbW92aW5nIHRob3NlIHRoYXQgYXJlIG5vdCByZXF1aXJlZCBhbmQgaGlkaW5nCisgICAgICAgdGhlIGFwcHJvcHJpYXRlIHN5bWJvbHMgaW4gdGhlIG90aGVycworICAgICovCisgICAgZm9yKGkgPSAwOyBpIDwgbkV4dGVybmFsOyArK2kpCisJaWYocmVxdWlyZWRFeHRlcm5hbC0+ZmluZChpKSAhPSByZXF1aXJlZEV4dGVybmFsLT5lbmQoKSkKKwkgICAgaGlkZVN5bWJvbHMoYXJndlsyICsgaV0sIGhpZGUpOworCWVsc2UKKwkgICAgcmVtb3ZlKGFyZ3ZbMiArIGldKTsKKyAgICAvLyBoaWRlIHRoZSBhcHByb3ByaWF0ZSBzeW1ib2xzIGluIHRoZSBpbnRlcm5hbCBmaWxlcworICAgIGZvcihpID0gbkV4dGVybmFsICsgMjsgaSA8IGFyZ2M7ICsraSkKKwloaWRlU3ltYm9scyhhcmd2W2ldLCBoaWRlKTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2kxOG4vZW5fVVMudHh0IGIvZmluYWwvcnVudGltZS9zcmMvaTE4bi9lbl9VUy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFkNTdlYgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2kxOG4vZW5fVVMudHh0CkBAIC0wLDAgKzEsNDc1IEBACisjIGVuX1VTLnR4dCAjCisKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworIyBEZWZhdWx0IG1lc3NhZ2VzLCBlbWJlZGRlZCBpbnRvIHRoZSBPcGVuTVAgUlRMLCBhbmQgc291cmNlIGZvciBFbmdsaXNoIGNhdGFsb2cuCisKKworIyBDb21wYXRpYmxlIGNoYW5nZXMgKHdoaWNoIGRvZXMgbm90IHJlcXVpcmUgdmVyc2lvbiBidW1waW5nKToKKyMgICAgICogRWRpdGluZyBtZXNzYWdlIChudW1iZXIgYW5kIHR5cGUgb2YgcGxhY2Vob2xkZXJzIG11c3QgcmVtYWluLCByZWxhdGl2ZSBvcmRlciBvZgorIyAgICAgICBwbGFjZWhvbGRlcnMgbWF5IGJlIGNoYW5nZWQsIGUuZy4gIkZpbGUgJTEkcyBsaW5lICUyJGQiIG1heSBiZSBzYWZlbHkgZWRpdGVkIHRvCisjICAgICAgICJMaW5lICUyJGQgZmlsZSAlMSRzIikuCisjICAgICAqIEFkZGluZyBuZXcgbWVzc2FnZSB0byB0aGUgZW5kIG9mIHNlY3Rpb24uCisjIEluY29tcGF0aWJsZSBjaGFuZ2VzICh2ZXJzaW9uIG11c3QgYmUgYnVtYmVkIGJ5IDEpOgorIyAgICAgKiBJbnRyb2R1Y2luZyBuZXcgcGxhY2Vob2xkZXJzIHRvIGV4aXN0aW5nIG1lc3NhZ2VzLgorIyAgICAgKiBDaGFuZ2luZyB0eXBlIG9mIHBsYWNlaG9sZGVycyAoZS5nLiAibGluZSAlMSRkIiAtPiAibGluZSAlMSRzIikuCisjICAgICAqIFJlYXJyYW5naW5nIG9yZGVyIG9mIG1lc3NhZ2VzLgorIyAgICAgKiBEZWxldGluZyBtZXNzYWdlcy4KKyMgVXNlIHNwZWNpYWwgIk9CU09MRVRFIiBwc2V1ZG9pZGVudGlmaWVyIGZvciBvYnNvbGV0ZSBlbnRyaWVzLCB3aGljaCBpcyBrZXB0IG9ubHkgZm9yIGJhY2t3YXJkCisjIGNvbXBhdGliaWxpdHkuIFdoZW4gdmVyc2lvbiBpcyBidW1wZWQsIGRvIG5vdCBmb3JnZXQgdG8gZGVsZXRlIGFsbCBvYnNvbGV0ZSBlbnRyaWVzLgorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0qLSBNRVRBIC0qLQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIE1ldGEgaW5mb3JtYXRpb24gYWJvdXQgbWVzc2FnZSBjYXRhbG9nLgorCitMYW5ndWFnZSAiRW5nbGlzaCIKK0NvdW50cnkgICJVU0EiCitMYW5nSWQgICAiMTAzMyIKK1ZlcnNpb24gICIyIgorUmV2aXNpb24gIjIwMTQwODI3IgorCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLSotIFNUUklOR1MgLSotCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgU3RyaW5ncyBhcmUgbm90IGNvbXBsZXRlIG1lc3NhZ2VzLCBqdXN0IGZyYWdtZW50cy4gV2UgbmVlZCB0byB3b3JrIG9uIGl0IGFuZCByZWR1Y2UgbnVtYmVyIG9mCisjIHN0cmluZ3MgKHRvIHplcm8/KS4KKworRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IiCitVbmtub3duRmlsZSAgICAgICAgICAgICAgICAgICIodW5rbm93biBmaWxlKSIKK05vdEFOdW1iZXIgICAgICAgICAgICAgICAgICAgIm5vdCBhIG51bWJlciIKK0JhZFVuaXQgICAgICAgICAgICAgICAgICAgICAgImJhZCB1bml0IgorSWxsZWdhbENoYXJhY3RlcnMgICAgICAgICAgICAiaWxsZWdhbCBjaGFyYWN0ZXJzIgorVmFsdWVUb29MYXJnZSAgICAgICAgICAgICAgICAidmFsdWUgdG9vIGxhcmdlIgorVmFsdWVUb29TbWFsbCAgICAgICAgICAgICAgICAidmFsdWUgdG9vIHNtYWxsIgorTm90TXVsdGlwbGU0SyAgICAgICAgICAgICAgICAidmFsdWUgaXMgbm90IGEgbXVsdGlwbGUgb2YgNGsiCitVbmtub3duVG9wb2xvZ3kgICAgICAgICAgICAgICJVbmtub3duIHByb2Nlc3NvciB0b3BvbG9neSIKK0NhbnRPcGVuQ3B1aW5mbyAgICAgICAgICAgICAgIkNhbm5vdCBvcGVuIC9wcm9jL2NwdWluZm8iCitQcm9jQ3B1aW5mbyAgICAgICAgICAgICAgICAgICIvcHJvYy9jcHVpbmZvIgorTm9Qcm9jUmVjb3JkcyAgICAgICAgICAgICAgICAiY3B1aW5mbyBmaWxlIGludmFsaWQgKE5vIHByb2Nlc3NvciByZWNvcmRzKSIKK1Rvb01hbnlQcm9jUmVjb3JkcyAgICAgICAgICAgImNwdWluZm8gZmlsZSBpbnZhbGlkIChUb28gbWFueSBwcm9jZXNzb3IgcmVjb3JkcykiCitDYW50UmV3aW5kQ3B1aW5mbyAgICAgICAgICAgICJDYW5ub3QgcmV3aW5kIGNwdWluZm8gZmlsZSIKK0xvbmdMaW5lQ3B1aW5mbyAgICAgICAgICAgICAgImNwdWluZm8gZmlsZSBpbnZhbGlkIChsb25nIGxpbmUpIgorVG9vTWFueUVudHJpZXMgICAgICAgICAgICAgICAiY3B1aW5mbyBmaWxlIGNvbnRhaW5zIHRvbyBtYW55IGVudHJpZXMiCitNaXNzaW5nUHJvY0ZpZWxkICAgICAgICAgICAgICJjcHVpbmZvIGZpbGUgbWlzc2luZyBwcm9jZXNzb3IgZmllbGQiCitNaXNzaW5nUGh5c2ljYWxJREZpZWxkICAgICAgICJjcHVpbmZvIGZpbGUgbWlzc2luZyBwaHlzaWNhbCBpZCBmaWVsZCIKK01pc3NpbmdWYWxDcHVpbmZvICAgICAgICAgICAgImNwdWluZm8gZmlsZSBpbnZhbGlkIChtaXNzaW5nIHZhbCkiCitEdXBsaWNhdGVGaWVsZENwdWluZm8gICAgICAgICJjcHVpbmZvIGZpbGUgaW52YWxpZCAoZHVwbGljYXRlIGZpZWxkKSIKK1BoeXNpY2FsSURzTm90VW5pcXVlICAgICAgICAgIlBoeXNpY2FsIG5vZGUvcGtnL2NvcmUvdGhyZWFkIGlkcyBub3QgdW5pcXVlIgorQXBpY05vdFByZXNlbnQgICAgICAgICAgICAgICAiQVBJQyBub3QgcHJlc2VudCIKK0ludmFsaWRDcHVpZEluZm8gICAgICAgICAgICAgIkludmFsaWQgY3B1aWQgaW5mbyIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIkFQSUMgaWRzIG5vdCB1bmlxdWUiCitJbmNvbnNpc3RlbnRDcHVpZEluZm8gICAgICAgICJJbmNvbnNpc3RlbnQgY3B1aWQgaW5mbyIKK091dE9mSGVhcE1lbW9yeSAgICAgICAgICAgICAgIk91dCBvZiBoZWFwIG1lbW9yeSIKK01lbW9yeUFsbG9jRmFpbGVkICAgICAgICAgICAgIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIKK0NvcmUgICAgICAgICAgICAgICAgICAgICAgICAgImNvcmUiCitUaHJlYWQgICAgICAgICAgICAgICAgICAgICAgICJ0aHJlYWQiCitQYWNrYWdlICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlIgorTm9kZSAgICAgICAgICAgICAgICAgICAgICAgICAibm9kZSIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIjx1bmRlZj4iCitEZWNvZGluZ0xlZ2FjeUFQSUMgICAgICAgICAgICJkZWNvZGluZyBsZWdhY3kgQVBJQyBpZHMiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICJwYXJzaW5nIC9wcm9jL2NwdWluZm8iCitOb3REZWZpbmVkICAgICAgICAgICAgICAgICAgICJ2YWx1ZSBpcyBub3QgZGVmaW5lZCIKK0VmZmVjdGl2ZVNldHRpbmdzICAgICAgICAgICAgIkVmZmVjdGl2ZSBzZXR0aW5nczoiCitVc2VyU2V0dGluZ3MgICAgICAgICAgICAgICAgICJVc2VyIHNldHRpbmdzOiIKK1N0b3JhZ2VNYXBXYXJuaW5nICAgICAgICAgICAgIndhcm5pbmc6IHBvaW50ZXJzIG9yIHNpemUgZG9uJ3QgbWFrZSBzZW5zZSIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIkNQVSIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIlRQVSIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIlRQVXMgcGVyIHBhY2thZ2UiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICJIVCBlbmFibGVkIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiSFQgZGlzYWJsZWQiCitEZWNvZGluZ3gyQVBJQyAgICAgICAgICAgICAgICJkZWNvZGluZyB4MkFQSUMgaWRzIgorTm9MZWFmMTFTdXBwb3J0ICAgICAgICAgICAgICAiY3B1aWQgbGVhZiAxMSBub3Qgc3VwcG9ydGVkIgorTm9MZWFmNFN1cHBvcnQgICAgICAgICAgICAgICAiY3B1aWQgbGVhZiA0IG5vdCBzdXBwb3J0ZWQiCitUaHJlYWRJRHNOb3RVbmlxdWUgICAgICAgICAgICJ0aHJlYWQgaWRzIG5vdCB1bmlxdWUiCitVc2luZ1B0aHJlYWQgICAgICAgICAgICAgICAgICJ1c2luZyBwdGhyZWFkIGluZm8iCitMZWdhY3lBcGljSURzTm90VW5pcXVlICAgICAgICJsZWdhY3kgQVBJQyBpZHMgbm90IHVuaXF1ZSIKK3gyQXBpY0lEc05vdFVuaXF1ZSAgICAgICAgICAgIngyQVBJQyBpZHMgbm90IHVuaXF1ZSIKK0Rpc3BsYXlFbnZCZWdpbgkJICAgICAiT1BFTk1QIERJU1BMQVkgRU5WSVJPTk1FTlQgQkVHSU4iCitEaXNwbGF5RW52RW5kCQkgICAgICJPUEVOTVAgRElTUExBWSBFTlZJUk9OTUVOVCBFTkQiCitEZXZpY2UJCQkgICAgICJbZGV2aWNlXSIKK0hvc3QJCQkgICAgICJbaG9zdF0iCisKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistKi0gRk9STUFUUyAtKi0KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAiT01QOiBJbmZvICMlMSRkOiAlMiRzXG4iCitXYXJuaW5nICAgICAgICAgICAgICAgICAgICAgICJPTVA6IFdhcm5pbmcgIyUxJGQ6ICUyJHNcbiIKK0ZhdGFsICAgICAgICAgICAgICAgICAgICAgICAgIk9NUDogRXJyb3IgIyUxJGQ6ICUyJHNcbiIKK1N5c0VyciAgICAgICAgICAgICAgICAgICAgICAgIk9NUDogU3lzdGVtIGVycm9yICMlMSRkOiAlMiRzXG4iCitIaW50ICAgICAgICAgICAgICAgICAgICAgICAgICJPTVA6IEhpbnQ6ICUyJHNcbiIKKworUHJhZ21hICAgICAgICAgICAgICAgICAgICAgICAiJTEkcyBwcmFnbWEgKGF0ICUyJHM6JTMkcygpOiU0JHMpIgorICAgICMgJTEgaXMgcHJhZ21hIG5hbWUgKGxpa2UgInBhcmFsbGVsIiBvciAibWFzdGVyIiwKKyAgICAjICUyIGlzIGZpbGUgbmFtZSwKKyAgICAjICUzIGlzIGZ1bmN0aW9uIChyb3V0aW5lKSBuYW1lLAorICAgICMgJTQgaXMgdGhlIGxpbmUgbnVtYmVyIChhcyBzdHJpbmcsIHNvICJzIiB0eXBlIHNwZWNpZmllciBzaG91bGQgYmUgdXNlZCkuCisKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistKi0gTUVTU0FHRVMgLSotCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgTWVzc2FnZXMgb2YgYW55IHNldmVyaXR5OiBpbmZvcm1hdGlvbmFsLCB3YXJuaW5nLCBvciBmYXRhbC4KKyMgVG8gbWFpbnRhaW4gbWVzc2FnZSBudW1iZXJzICh0aGV5IGFyZSB2aXNpYmxlIHRvIGN1c3RvbWVycyksIGFkZCBuZXcgbWVzc2FnZXMgdG8gdGhlIGVuZC4KKworIyBVc2UgZm9sbG93aW5nIHByZWZpeGVzIGZvciBtZXNzYWdlcyBhbmQgaGludHMgd2hlbiBhcHByb3ByaWF0ZToKKyMgICAgQWZmIC0tIEFmZmluaXR5IG1lc3NhZ2VzLgorIyAgICBDbnMgLS0gQ29uc2lzdGVuY3kgY2hlY2sgZmFpbHVyZXMgKEtNUF9DT05TSVNURU5DWV9DSEVDSykuCisjICAgIEl0dCAtLSBJVFQgTm90aWZ5LXJlbGF0ZWQgbWVzc2FnZXMuCisKK0xpYnJhcnlJc1NlcmlhbCAgICAgICAgICAgICAgIkxpYnJhcnkgaXMgXCJzZXJpYWxcIi4iCitDYW50T3Blbk1lc3NhZ2VDYXRhbG9nICAgICAgICJDYW5ub3Qgb3BlbiBtZXNzYWdlIGNhdGFsb2cgXCIlMSRzXCI6IgorV2lsbFVzZURlZmF1bHRNZXNzYWdlcyAgICAgICAiRGVmYXVsdCBtZXNzYWdlcyB3aWxsIGJlIHVzZWQuIgorTG9ja0lzVW5pbml0aWFsaXplZCAgICAgICAgICAiJTEkczogTG9jayBpcyB1bmluaXRpYWxpemVkIgorTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlICAgICAiJTEkczogTG9jayB3YXMgaW5pdGlhbGl6ZWQgYXMgc2ltcGxlLCBidXQgdXNlZCBhcyBuZXN0YWJsZSIKK0xvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSAgICAgIiUxJHM6IExvY2sgd2FzIGluaXRpYWxpemVkIGFzIG5lc3RhYmxlLCBidXQgdXNlZCBhcyBzaW1wbGUiCitMb2NrSXNBbHJlYWR5T3duZWQgICAgICAgICAgICIlMSRzOiBMb2NrIGlzIGFscmVhZHkgb3duZWQgYnkgcmVxdWVzdGluZyB0aHJlYWQiCitMb2NrU3RpbGxPd25lZCAgICAgICAgICAgICAgICIlMSRzOiBMb2NrIGlzIHN0aWxsIG93bmVkIGJ5IGEgdGhyZWFkIgorTG9ja1Vuc2V0dGluZ0ZyZWUgICAgICAgICAgICAiJTEkczogQXR0ZW1wdCB0byByZWxlYXNlIGEgbG9jayBub3Qgb3duZWQgYnkgYW55IHRocmVhZCIKK0xvY2tVbnNldHRpbmdTZXRCeUFub3RoZXIgICAgIiUxJHM6IEF0dGVtcHQgdG8gcmVsZWFzZSBhIGxvY2sgb3duZWQgYnkgYW5vdGhlciB0aHJlYWQiCitTdGFja092ZXJmbG93ICAgICAgICAgICAgICAgICJTdGFjayBvdmVyZmxvdyBkZXRlY3RlZCBmb3IgT3Blbk1QIHRocmVhZCAjJTEkZCIKK1N0YWNrT3ZlcmxhcCAgICAgICAgICAgICAgICAgIlN0YWNrIG92ZXJsYXAgZGV0ZWN0ZWQuICIKK0Fzc2VydGlvbkZhaWx1cmUgICAgICAgICAgICAgIkFzc2VydGlvbiBmYWlsdXJlIGF0ICUxJHMoJTIkZCkuIgorQ2FudFJlZ2lzdGVyTmV3VGhyZWFkICAgICAgICAiVW5hYmxlIHRvIHJlZ2lzdGVyIGEgbmV3IHVzZXIgdGhyZWFkLiIKK0R1cGxpY2F0ZUxpYnJhcnkgICAgICAgICAgICAgIkluaXRpYWxpemluZyAlMSRzLCBidXQgZm91bmQgJTIkcyBhbHJlYWR5IGluaXRpYWxpemVkLiIKK0NhbnRPcGVuRmlsZUZvclJlYWRpbmcgICAgICAgIkNhbm5vdCBvcGVuIGZpbGUgXCIlMSRzXCIgZm9yIHJlYWRpbmc6IgorQ2FudEdldEVudlZhciAgICAgICAgICAgICAgICAiR2V0dGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZSBcIiUxJHNcIiBmYWlsZWQ6IgorQ2FudFNldEVudlZhciAgICAgICAgICAgICAgICAiU2V0dGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZSBcIiUxJHNcIiBmYWlsZWQ6IgorQ2FudEdldEVudmlyb25tZW50ICAgICAgICAgICAiR2V0dGluZyBlbnZpcm9ubWVudCBmYWlsZWQ6IgorQmFkQm9vbFZhbHVlICAgICAgICAgICAgICAgICAiJTEkcz1cIiUyJHNcIjogV3JvbmcgdmFsdWUsIGJvb2xlYW4gZXhwZWN0ZWQuIgorU1NQTm90QnVpbHRJbiAgICAgICAgICAgICAgICAiTm8gSGVscGVyIFRocmVhZCBzdXBwb3J0IGJ1aWx0IGluIHRoaXMgT01QIGxpYnJhcnkuIgorU1BQU290ZlRlcm1pbmF0ZUZhaWxlZCAgICAgICAiSGVscGVyIHRocmVhZCBmYWlsZWQgdG8gc29mdCB0ZXJtaW5hdGUuIgorQnVmZmVyT3ZlcmZsb3cgICAgICAgICAgICAgICAiQnVmZmVyIG92ZXJmbG93IGRldGVjdGVkLiIKK1JlYWxUaW1lU2NoZWROb3RTdXBwb3J0ZWQgICAgIlJlYWwtdGltZSBzY2hlZHVsaW5nIHBvbGljeSBpcyBub3Qgc3VwcG9ydGVkLiIKK1J1bm5pbmdBdE1heFByaW9yaXR5ICAgICAgICAgIk9NUCBhcHBsaWNhdGlvbiBpcyBydW5uaW5nIGF0IG1heGltdW0gcHJpb3JpdHkgd2l0aCByZWFsLXRpbWUgc2NoZWR1bGluZyBwb2xpY3kuICIKK0NhbnRDaGFuZ2VNb25pdG9yUHJpb3JpdHkgICAgIkNoYW5naW5nIHByaW9yaXR5IG9mIHRoZSBtb25pdG9yIHRocmVhZCBmYWlsZWQ6IgorTW9uaXRvcldpbGxTdGFydmUgICAgICAgICAgICAiRGVhZGxvY2tzIGFyZSBoaWdobHkgcG9zc2libGUgZHVlIHRvIG1vbml0b3IgdGhyZWFkIHN0YXJ2YXRpb24uIgorQ2FudFNldE1vbml0b3JTdGFja1NpemUgICAgICAiVW5hYmxlIHRvIHNldCBtb25pdG9yIHRocmVhZCBzdGFjayBzaXplIHRvICUxJGx1IGJ5dGVzOiIKK0NhbnRTZXRXb3JrZXJTdGFja1NpemUgICAgICAgIlVuYWJsZSB0byBzZXQgT01QIHRocmVhZCBzdGFjayBzaXplIHRvICUxJGx1IGJ5dGVzOiIKK0NhbnRJbml0VGhyZWFkQXR0cnMgICAgICAgICAgIlRocmVhZCBhdHRyaWJ1dGUgaW5pdGlhbGl6YXRpb24gZmFpbGVkOiIKK0NhbnREZXN0cm95VGhyZWFkQXR0cnMgICAgICAgIlRocmVhZCBhdHRyaWJ1dGUgZGVzdHJveWluZyBmYWlsZWQ6IgorQ2FudFNldFdvcmtlclN0YXRlICAgICAgICAgICAiT01QIHRocmVhZCBqb2luYWJsZSBzdGF0ZSBzZXR0aW5nIGZhaWxlZDoiCitDYW50U2V0TW9uaXRvclN0YXRlICAgICAgICAgICJNb25pdG9yIHRocmVhZCBqb2luYWJsZSBzdGF0ZSBzZXR0aW5nIGZhaWxlZDoiCitOb1Jlc291cmNlc0ZvcldvcmtlclRocmVhZCAgICJTeXN0ZW0gdW5hYmxlIHRvIGFsbG9jYXRlIG5lY2Vzc2FyeSByZXNvdXJjZXMgZm9yIE9NUCB0aHJlYWQ6IgorTm9SZXNvdXJjZXNGb3JNb25pdG9yVGhyZWFkICAiU3lzdGVtIHVuYWJsZSB0byBhbGxvY2F0ZSBuZWNlc3NhcnkgcmVzb3VyY2VzIGZvciB0aGUgbW9uaXRvciB0aHJlYWQ6IgorQ2FudFRlcm1pbmF0ZVdvcmtlclRocmVhZCAgICAiVW5hYmxlIHRvIHRlcm1pbmF0ZSBPTVAgdGhyZWFkOiIKK1NjaGVkdWxlS2luZE91dE9mUmFuZ2UgICAgICAgIldyb25nIHNjaGVkdWxlIHR5cGUgJTEkZCwgc2VlIDxvbXAuaD4gb3IgPG9tcF9saWIuaD4gZmlsZSBmb3IgdGhlIGxpc3Qgb2YgdmFsdWVzIHN1cHBvcnRlZC4iCitVbmtub3duU2NoZWR1bGluZ1R5cGUgICAgICAgICJVbmtub3duIHNjaGVkdWxpbmcgdHlwZSBcIiUxJGRcIi4iCitJbnZhbGlkVmFsdWUgICAgICAgICAgICAgICAgICIlMSRzIHZhbHVlIFwiJTIkc1wiIGlzIGludmFsaWQuIgorU21hbGxWYWx1ZSAgICAgICAgICAgICAgICAgICAiJTEkcyB2YWx1ZSBcIiUyJHNcIiBpcyB0b28gc21hbGwuIgorTGFyZ2VWYWx1ZSAgICAgICAgICAgICAgICAgICAiJTEkcyB2YWx1ZSBcIiUyJHNcIiBpcyB0b28gbGFyZ2UuIgorU3RnSW52YWxpZFZhbHVlICAgICAgICAgICAgICAiJTEkczogXCIlMiRzXCIgaXMgYW4gaW52YWxpZCB2YWx1ZTsgaWdub3JlZC4iCitCYXJyUmVsZWFzZVZhbHVlSW52YWxpZCAgICAgICIlMSRzIHJlbGVhc2UgdmFsdWUgXCIlMiRzXCIgaXMgaW52YWxpZC4iCitCYXJyR2F0aGVyVmFsdWVJbnZhbGlkICAgICAgICIlMSRzIGdhdGhlciB2YWx1ZSBcIiUyJHNcIiBpcyBpbnZhbGlkLiIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHMgc3VwcG9ydGVkIG9ubHkgb24gZGVidWcgYnVpbGRzOyBpZ25vcmVkLiIKK1BhclJhbmdlU3ludGF4ICAgICAgICAgICAgICAgIlN5bnRheCBlcnJvcjogVXNhZ2U6ICUxJHM9WyByb3V0aW5lPTxmdW5jPiB8IGZpbGVuYW1lPTxmaWxlPiB8IHJhbmdlPTxsYj46PHViPiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ8IGV4Y2xfcmFuZ2U9PGxiPjo8dWI+IF0sLi4uIgorVW5iYWxhbmNlZFF1b3RlcyAgICAgICAgICAgICAiVW5iYWxhbmNlZCBxdW90ZXMgaW4gJTEkcy4iCitFbXB0eVN0cmluZyAgICAgICAgICAgICAgICAgICJFbXB0eSBzdHJpbmcgc3BlY2lmaWVkIGZvciAlMSRzOyBpZ25vcmVkLiIKK0xvbmdWYWx1ZSAgICAgICAgICAgICAgICAgICAgIiUxJHMgdmFsdWUgaXMgdG9vIGxvbmc7IGlnbm9yZWQuIgorSW52YWxpZENsYXVzZSAgICAgICAgICAgICAgICAiJTEkczogSW52YWxpZCBjbGF1c2UgaW4gXCIlMiRzXCIuIgorRW1wdHlDbGF1c2UgICAgICAgICAgICAgICAgICAiRW1wdHkgY2xhdXNlIGluICUxJHMuIgorSW52YWxpZENodW5rICAgICAgICAgICAgICAgICAiJTEkcyB2YWx1ZSBcIiUyJHNcIiBpcyBpbnZhbGlkIGNodW5rIHNpemUuIgorTGFyZ2VDaHVuayAgICAgICAgICAgICAgICAgICAiJTEkcyB2YWx1ZSBcIiUyJHNcIiBpcyB0byBsYXJnZSBjaHVuayBzaXplLiIKK0lnbm9yZUNodW5rICAgICAgICAgICAgICAgICAgIiUxJHMgdmFsdWUgXCIlMiRzXCIgaXMgaWdub3JlZC4iCitDYW50R2V0UHJvY0ZyZXEgICAgICAgICAgICAgICJDYW5ub3QgZ2V0IHByb2Nlc3NvciBmcmVxdWVuY3ksIHVzaW5nIHplcm8gS01QX0lUVF9QUkVQQVJFX0RFTEFZLiIKK0VudlBhcmFsbGVsV2FybiAgICAgICAgICAgICAgIiUxJHMgbXVzdCBiZSBzZXQgcHJpb3IgdG8gZmlyc3QgcGFyYWxsZWwgcmVnaW9uOyBpZ25vcmVkLiIKK0FmZlBhcmFtRGVmaW5lZCAgICAgICAgICAgICAgIiUxJHM6IHBhcmFtZXRlciBoYXMgYmVlbiBzcGVjaWZpZWQgYWxyZWFkeSwgaWdub3JpbmcgXCIlMiRzXCIuIgorQWZmSW52YWxpZFBhcmFtICAgICAgICAgICAgICAiJTEkczogcGFyYW1ldGVyIGludmFsaWQsIGlnbm9yaW5nIFwiJTIkc1wiLiIKK0FmZk1hbnlQYXJhbXMgICAgICAgICAgICAgICAgIiUxJHM6IHRvbyBtYW55IGludGVnZXIgcGFyYW1ldGVycyBzcGVjaWZpZWQsIGlnbm9yaW5nIFwiJTIkc1wiLiIKK0FmZk1hbnlQYXJhbXNGb3JMb2dpYyAgICAgICAgIiUxJHM6IHRvbyBtYW55IGludGVnZXIgcGFyYW1ldGVycyBzcGVjaWZpZWQgZm9yIGxvZ2ljYWwgb3IgcGh5c2ljYWwgdHlwZSwgaWdub3JpbmcgXCIlMiRkXCIuIgorQWZmTm9QYXJhbSAgICAgICAgICAgICAgICAgICAiJTEkczogJyUyJHMnIHR5cGUgZG9lcyBub3QgdGFrZSBhbnkgaW50ZWdlciBwYXJhbWV0ZXJzLCBpZ25vcmluZyB0aGVtLiIKK0FmZk5vUHJvY0xpc3QgICAgICAgICAgICAgICAgIiUxJHM6IHByb2NsaXN0IG5vdCBzcGVjaWZpZWQgd2l0aCBleHBsaWNpdCBhZmZpbml0eSB0eXBlLCB1c2luZyBcIm5vbmVcIi4iCitBZmZQcm9jTGlzdE5vVHlwZSAgICAgICAgICAgICIlMSRzOiBwcm9jbGlzdCBzcGVjaWZpZWQsIHNldHRpbmcgYWZmaW5pdHkgdHlwZSB0byBcImV4cGxpY2l0XCIuIgorQWZmUHJvY0xpc3ROb3RFeHBsaWNpdCAgICAgICAiJTEkczogcHJvY2xpc3Qgc3BlY2lmaWVkIHdpdGhvdXQgXCJleHBsaWNpdFwiIGFmZmluaXR5IHR5cGUsIHByb2NsaXN0IGlnbm9yZWQuIgorQWZmU3ludGF4RXJyb3IgICAgICAgICAgICAgICAiJTEkczogc3ludGF4IGVycm9yLCBub3QgdXNpbmcgYWZmaW5pdHkuIgorQWZmWmVyb1N0cmlkZSAgICAgICAgICAgICAgICAiJTEkczogcmFuZ2UgZXJyb3IgKHplcm8gc3RyaWRlKSwgbm90IHVzaW5nIGFmZmluaXR5LiIKK0FmZlN0YXJ0R3JlYXRlckVuZCAgICAgICAgICAgIiUxJHM6IHJhbmdlIGVycm9yICglMiRkID4gJTMkZCksIG5vdCB1c2luZyBhZmZpbml0eS4iCitBZmZTdHJpZGVMZXNzWmVybyAgICAgICAgICAgICIlMSRzOiByYW5nZSBlcnJvciAoJTIkZCA8ICUzJGQgJiBzdHJpZGUgPCAwKSwgbm90IHVzaW5nIGFmZmluaXR5LiIKK0FmZlJhbmdlVG9vQmlnICAgICAgICAgICAgICAgIiUxJHM6IHJhbmdlIGVycm9yICgoJTIkZC0lMyRkKS8lNCRkIHRvbyBiaWcpLCBub3QgdXNpbmcgYWZmaW5pdHkuIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogJTIkcyBpcyBkZWZpbmVkLiAlMyRzIHdpbGwgYmUgaWdub3JlZC4iCitBZmZOb3RTdXBwb3J0ZWQgICAgICAgICAgICAgICIlMSRzOiBhZmZpbml0eSBub3Qgc3VwcG9ydGVkLCB1c2luZyBcImRpc2FibGVkXCIuIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogYWZmaW5pdHkgb25seSBzdXBwb3J0ZWQgZm9yIEludGVsKFIpIHByb2Nlc3NvcnMuIgorR2V0QWZmU3lzQ2FsbE5vdFN1cHBvcnRlZCAgICAiJTEkczogZ2V0YWZmaW5pdHkgc3lzdGVtIGNhbGwgbm90IHN1cHBvcnRlZC4iCitTZXRBZmZTeXNDYWxsTm90U3VwcG9ydGVkICAgICIlMSRzOiBzZXRhZmZpbml0eSBzeXN0ZW0gY2FsbCBub3Qgc3VwcG9ydGVkLiIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IHB0aHJlYWRfYWZmX3NldF9ucCBjYWxsIG5vdCBmb3VuZC4iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBwdGhyZWFkX2dldF9udW1fcmVzb3VyY2VzX25wIGNhbGwgbm90IGZvdW5kLiIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IHRoZSBPUyBrZXJuZWwgZG9lcyBub3Qgc3VwcG9ydCBhZmZpbml0eS4iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBwdGhyZWFkX2dldF9udW1fcmVzb3VyY2VzX25wIHJldHVybmVkICUyJGQuIgorQWZmQ2FudEdldE1hc2tTaXplICAgICAgICAgICAiJTEkczogY2Fubm90IGRldGVybWluZSBwcm9wZXIgYWZmaW5pdHkgbWFzayBzaXplLiIKK1BhcnNlU2l6ZUludFdhcm4gICAgICAgICAgICAgIiUxJHM9XCIlMiRzXCI6ICUzJHMuIgorUGFyc2VFeHRyYUNoYXJzV2FybiAgICAgICAgICAiJTEkczogZXh0cmEgdHJhaWxpbmcgY2hhcmFjdGVycyBpZ25vcmVkOiBcIiUyJHNcIi4iCitVbmtub3duRm9yY2VSZWR1Y3Rpb24gICAgICAgICIlMSRzOiB1bmtub3duIG1ldGhvZCBcIiUyJHNcIi4iCitUaW1lclVzZUdldHRpbWVvZmRheSAgICAgICAgICJLTVBfU1RBVFNfVElNRVI6IGNsb2NrX2dldHRpbWUgaXMgdW5kZWZpbmVkLCB1c2luZyBnZXR0aW1lb2ZkYXkuIgorVGltZXJOZWVkTW9yZVBhcmFtICAgICAgICAgICAiS01QX1NUQVRTX1RJTUVSOiBcIiUxJHNcIiBuZWVkcyBhZGRpdGlvbmFsIHBhcmFtZXRlciwgZS5nLiAnY2xvY2tfZ2V0dGltZSwyJy4gVXNpbmcgZ2V0dGltZW9mZGF5LiIKK1RpbWVySW52YWxpZFBhcmFtICAgICAgICAgICAgIktNUF9TVEFUU19USU1FUjogY2xvY2tfZ2V0dGltZSBwYXJhbWV0ZXIgXCIlMSRzXCIgaXMgaW52YWxpZCwgdXNpbmcgZ2V0dGltZW9mZGF5LiIKK1RpbWVyR2V0dGltZUZhaWxlZCAgICAgICAgICAgIktNUF9TVEFUU19USU1FUjogY2xvY2tfZ2V0dGltZSBmYWlsZWQsIHVzaW5nIGdldHRpbWVvZmRheS4iCitUaW1lclVua25vd25GdW5jdGlvbiAgICAgICAgICJLTVBfU1RBVFNfVElNRVI6IGNsb2NrIGZ1bmN0aW9uIHVua25vd24gKGlnbm9yaW5nIHZhbHVlIFwiJTEkc1wiKS4iCitVbmtub3duU2NoZWRUeXBlRGV0ZWN0ZWQgICAgICJVbmtub3duIHNjaGVkdWxpbmcgdHlwZSBkZXRlY3RlZC4iCitEaXNwYXRjaE1hbnlUaHJlYWRzICAgICAgICAgICJUb28gbWFueSB0aHJlYWRzIHRvIHVzZSBhbmFseXRpY2FsIGd1aWRlZCBzY2hlZHVsaW5nIC0gc3dpdGNoaW5nIHRvIGl0ZXJhdGl2ZSBndWlkZWQgc2NoZWR1bGluZy4iCitJdHRMb29rdXBGYWlsZWQgICAgICAgICAgICAgICJpdHRub3RpZnk6IExvb2t1cCBvZiBcIiUxJHNcIiBmdW5jdGlvbiBpbiBcIiUyJHNcIiBsaWJyYXJ5IGZhaWxlZC4iCitJdHRMb2FkTGliRmFpbGVkICAgICAgICAgICAgICJpdHRub3RpZnk6IExvYWRpbmcgXCIlMSRzXCIgbGlicmFyeSBmYWlsZWQuIgorSXR0QWxsTm90aWZEaXNhYmxlZCAgICAgICAgICAiaXR0bm90aWZ5OiBBbGwgaXR0IG5vdGlmaWNhdGlvbnMgZGlzYWJsZWQuIgorSXR0T2JqTm90aWZEaXNhYmxlZCAgICAgICAgICAiaXR0bm90aWZ5OiBPYmplY3Qgc3RhdGUgaXR0IG5vdGlmaWNhdGlvbnMgZGlzYWJsZWQuIgorSXR0TWFya05vdGlmRGlzYWJsZWQgICAgICAgICAiaXR0bm90aWZ5OiBNYXJrIGl0dCBub3RpZmljYXRpb25zIGRpc2FibGVkLiIKK0l0dFVubG9hZExpYkZhaWxlZCAgICAgICAgICAgIml0dG5vdGlmeTogVW5sb2FkaW5nIFwiJTEkc1wiIGxpYnJhcnkgZmFpbGVkLiIKK0NhbnRGb3JtVGhyVGVhbSAgICAgICAgICAgICAgIkNhbm5vdCBmb3JtIGEgdGVhbSB3aXRoICUxJGQgdGhyZWFkcywgdXNpbmcgJTIkZCBpbnN0ZWFkLiIKK0FjdGl2ZUxldmVsc05lZ2F0aXZlICAgICAgICAgIlJlcXVlc3RlZCBudW1iZXIgb2YgYWN0aXZlIHBhcmFsbGVsIGxldmVscyBcIiUxJGRcIiBpcyBuZWdhdGl2ZTsgaWdub3JlZC4iCitBY3RpdmVMZXZlbHNFeGNlZWRMaW1pdCAgICAgICJSZXF1ZXN0ZWQgbnVtYmVyIG9mIGFjdGl2ZSBwYXJhbGxlbCBsZXZlbHMgXCIlMSRkXCIgZXhjZWVkcyBzdXBwb3J0ZWQgbGltaXQ7ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBmb2xsb3dpbmcgbGltaXQgdmFsdWUgd2lsbCBiZSB1c2VkOiBcIiUxJGRcIi4iCitTZXRMaWJyYXJ5SW5jb3JyZWN0Q2FsbCAgICAgICJrbXBfc2V0X2xpYnJhcnkgbXVzdCBvbmx5IGJlIGNhbGxlZCBmcm9tIHRoZSB0b3AgbGV2ZWwgc2VyaWFsIHRocmVhZDsgaWdub3JlZC4iCitGYXRhbFN5c0Vycm9yICAgICAgICAgICAgICAgICJGYXRhbCBzeXN0ZW0gZXJyb3IgZGV0ZWN0ZWQuIgorT3V0T2ZIZWFwTWVtb3J5ICAgICAgICAgICAgICAiT3V0IG9mIGhlYXAgbWVtb3J5LiIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIkNsZWFyaW5nIF9fS01QX1JFR0lTVEVSRURfTElCIGVudiB2YXIgZmFpbGVkLiIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIlJlZ2lzdGVyaW5nIGxpYnJhcnkgd2l0aCBlbnYgdmFyIGZhaWxlZC4iCitVc2luZ19pbnRfVmFsdWUgICAgICAgICAgICAgICIlMSRzIHZhbHVlIFwiJTIkZFwiIHdpbGwgYmUgdXNlZC4iCitVc2luZ191aW50X1ZhbHVlICAgICAgICAgICAgICIlMSRzIHZhbHVlIFwiJTIkdVwiIHdpbGwgYmUgdXNlZC4iCitVc2luZ191aW50NjRfVmFsdWUgICAgICAgICAgICIlMSRzIHZhbHVlIFwiJTIkc1wiIHdpbGwgYmUgdXNlZC4iCitVc2luZ19zdHJfVmFsdWUgICAgICAgICAgICAgICIlMSRzIHZhbHVlIFwiJTIkc1wiIHdpbGwgYmUgdXNlZC4iCitNYXhWYWx1ZVVzaW5nICAgICAgICAgICAgICAgICIlMSRzIG1heGltdW0gdmFsdWUgXCIlMiRkXCIgd2lsbCBiZSB1c2VkLiIKK01pblZhbHVlVXNpbmcgICAgICAgICAgICAgICAgIiUxJHMgbWluaW11bSB2YWx1ZSBcIiUyJGRcIiB3aWxsIGJlIHVzZWQuIgorTWVtb3J5QWxsb2NGYWlsZWQgICAgICAgICAgICAiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLiIKK0ZpbGVOYW1lVG9vTG9uZyAgICAgICAgICAgICAgIkZpbGUgbmFtZSB0b28gbG9uZy4iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICJMb2NrIHRhYmxlIG92ZXJmbG93LiIKK01hbnlUaHJlYWRzRm9yVFBEaXJlY3RpdmUgICAgIlRvbyBtYW55IHRocmVhZHMgdG8gdXNlIHRocmVhZHByaXZhdGUgZGlyZWN0aXZlLiIKK0FmZmluaXR5SW52YWxpZE1hc2sgICAgICAgICAgIiUxJHM6IGludmFsaWQgbWFzay4iCitXcm9uZ0RlZmluaXRpb24gICAgICAgICAgICAgICJXcm9uZyBkZWZpbml0aW9uLiIKK1RMU1NldFZhbHVlRmFpbGVkICAgICAgICAgICAgIldpbmRvd3MqIE9TOiBUTFMgU2V0IFZhbHVlIGZhaWxlZC4iCitUTFNPdXRPZkluZGV4ZXMgICAgICAgICAgICAgICJXaW5kb3dzKiBPUzogVExTIG91dCBvZiBpbmRleGVzLiIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIlBET05FIGRpcmVjdGl2ZSBtdXN0IGJlIG5lc3RlZCB3aXRoaW4gYSBETyBkaXJlY3RpdmUuIgorQ2FudEdldE51bUF2YWlsQ1BVICAgICAgICAgICAiQ2Fubm90IGdldCBudW1iZXIgb2YgYXZhaWxhYmxlIENQVXMuIgorQXNzdW1lZE51bUNQVSAgICAgICAgICAgICAgICAiQXNzdW1lZCBudW1iZXIgb2YgQ1BVcyBpcyAyLiIKK0Vycm9ySW5pdGlhbGl6ZUFmZmluaXR5ICAgICAgIkVycm9yIGluaXRpYWxpemluZyBhZmZpbml0eSAtIG5vdCB1c2luZyBhZmZpbml0eS4iCitBZmZUaHJlYWRzTWF5TWlncmF0ZSAgICAgICAgICJUaHJlYWRzIG1heSBtaWdyYXRlIGFjcm9zcyBhbGwgYXZhaWxhYmxlIE9TIHByb2NzIChncmFudWxhcml0eSBzZXR0aW5nIHRvbyBjb2Fyc2UpLiIKK0FmZklnbm9yZUludmFsaWRQcm9jSUQgICAgICAgIklnbm9yaW5nIGludmFsaWQgT1MgcHJvYyBJRCAlMSRkLiIKK0FmZk5vVmFsaWRQcm9jSUQgICAgICAgICAgICAgIk5vIHZhbGlkIE9TIHByb2MgSURzIHNwZWNpZmllZCAtIG5vdCB1c2luZyBhZmZpbml0eS4iCitVc2luZ0ZsYXRPUyAgICAgICAgICAgICAgICAgICIlMSRzIC0gdXNpbmcgXCJmbGF0XCIgT1MgPC0+IHBoeXNpY2FsIHByb2MgbWFwcGluZy4iCitVc2luZ0ZsYXRPU0ZpbGUgICAgICAgICAgICAgICIlMSRzOiAlMiRzIC0gdXNpbmcgXCJmbGF0XCIgT1MgPC0+IHBoeXNpY2FsIHByb2MgbWFwcGluZy4iCitVc2luZ0ZsYXRPU0ZpbGVMaW5lICAgICAgICAgICIlMSRzLCBsaW5lICUyJGQ6ICUzJHMgLSB1c2luZyBcImZsYXRcIiBPUyA8LT4gcGh5c2ljYWwgcHJvYyBtYXBwaW5nLiIKK0ZpbGVNc2dFeGl0aW5nICAgICAgICAgICAgICAgIiUxJHM6ICUyJHMgLSBleGl0aW5nLiIKK0ZpbGVMaW5lTXNnRXhpdGluZyAgICAgICAgICAgIiUxJHMsIGxpbmUgJTIkZDogJTMkcyAtIGV4aXRpbmcuIgorQ29uc3RydWN0SWRlbnRJbnZhbGlkICAgICAgICAiQ29uc3RydWN0IGlkZW50aWZpZXIgaW52YWxpZC4iCitUaHJlYWRJZGVudEludmFsaWQgICAgICAgICAgICJUaHJlYWQgaWRlbnRpZmllciBpbnZhbGlkLiIKK1JUTE5vdEluaXRpYWxpemVkICAgICAgICAgICAgInJ1bnRpbWUgbGlicmFyeSBub3QgaW5pdGlhbGl6ZWQuIgorVFBDb21tb25CbG9ja3NJbmNvbnNpc3QgICAgICAiSW5jb25zaXN0ZW50IFRIUkVBRFBSSVZBVEUgY29tbW9uIGJsb2NrIGRlY2xhcmF0aW9ucyBhcmUgbm9uLWNvbmZvcm1pbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW5kIGFyZSB1bnN1cHBvcnRlZC4gRWl0aGVyIGFsbCB0aHJlYWRwcml2YXRlIGNvbW1vbiBibG9ja3MgbXVzdCBiZSBkZWNsYXJlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZGVudGljYWxseSwgb3IgdGhlIGxhcmdlc3QgaW5zdGFuY2Ugb2YgZWFjaCB0aHJlYWRwcml2YXRlIGNvbW1vbiBibG9jayAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtdXN0IGJlIHJlZmVyZW5jZWQgZmlyc3QgZHVyaW5nIHRoZSBydW4uIgorQ2FudFNldFRocmVhZEFmZk1hc2sgICAgICAgICAiQ2Fubm90IHNldCB0aHJlYWQgYWZmaW5pdHkgbWFzay4iCitDYW50U2V0VGhyZWFkUHJpb3JpdHkgICAgICAgICJDYW5ub3Qgc2V0IHRocmVhZCBwcmlvcml0eS4iCitDYW50Q3JlYXRlVGhyZWFkICAgICAgICAgICAgICJDYW5ub3QgY3JlYXRlIHRocmVhZC4iCitDYW50Q3JlYXRlRXZlbnQgICAgICAgICAgICAgICJDYW5ub3QgY3JlYXRlIGV2ZW50LiIKK0NhbnRTZXRFdmVudCAgICAgICAgICAgICAgICAgIkNhbm5vdCBzZXQgZXZlbnQuIgorQ2FudENsb3NlSGFuZGxlICAgICAgICAgICAgICAiQ2Fubm90IGNsb3NlIGhhbmRsZS4iCitVbmtub3duTGlicmFyeVR5cGUgICAgICAgICAgICJVbmtub3duIGxpYnJhcnkgdHlwZTogJTEkZC4iCitSZWFwTW9uaXRvckVycm9yICAgICAgICAgICAgICJNb25pdG9yIGRpZCBub3QgcmVhcCBwcm9wZXJseS4iCitSZWFwV29ya2VyRXJyb3IgICAgICAgICAgICAgICJXb3JrZXIgdGhyZWFkIGZhaWxlZCB0byBqb2luLiIKK0NoYW5nZVRocmVhZEFmZk1hc2tFcnJvciAgICAgIkNhbm5vdCBjaGFuZ2UgdGhyZWFkIGFmZmluaXR5IG1hc2suIgorVGhyZWFkc01pZ3JhdGUgICAgICAgICAgICAgICAiJTEkczogVGhyZWFkcyBtYXkgbWlncmF0ZSBhY3Jvc3MgJTIkZCBpbm5lcm1vc3QgbGV2ZWxzIG9mIG1hY2hpbmUiCitEZWNyZWFzZVRvVGhyZWFkcyAgICAgICAgICAgICIlMSRzOiBkZWNyZWFzZSB0byAlMiRkIHRocmVhZHMiCitJbmNyZWFzZVRvVGhyZWFkcyAgICAgICAgICAgICIlMSRzOiBpbmNyZWFzZSB0byAlMiRkIHRocmVhZHMiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBJbnRlcm5hbCB0aHJlYWQgJTIkZCBib3VuZCB0byBPUyBwcm9jIHNldCAlMyRzIgorQWZmQ2FwYWJsZVVzZUNwdWluZm8gICAgICAgICAiJTEkczogQWZmaW5pdHkgY2FwYWJsZSwgdXNpbmcgY3B1aW5mbyBmaWxlIgorQWZmVXNlR2xvYkNwdWlkICAgICAgICAgICAgICAiJTEkczogQWZmaW5pdHkgY2FwYWJsZSwgdXNpbmcgZ2xvYmFsIGNwdWlkIGluZm8iCitBZmZDYXBhYmxlVXNlRmxhdCAgICAgICAgICAgICIlMSRzOiBBZmZpbml0eSBjYXBhYmxlLCB1c2luZyBkZWZhdWx0IFwiZmxhdFwiIHRvcG9sb2d5IgorQWZmTm90Q2FwYWJsZVVzZUxvY0NwdWlkICAgICAiJTEkczogQWZmaW5pdHkgbm90IGNhcGFibGUsIHVzaW5nIGxvY2FsIGNwdWlkIGluZm8iCitBZmZOb3RDYXBhYmxlVXNlQ3B1aW5mbyAgICAgICIlMSRzOiBBZmZpbml0eSBub3QgY2FwYWJsZSwgdXNpbmcgY3B1aW5mbyBmaWxlIgorQWZmRmxhdFRvcG9sb2d5ICAgICAgICAgICAgICAiJTEkczogQWZmaW5pdHkgbm90IGNhcGFibGUsIGFzc3VtbWluZyBcImZsYXRcIiB0b3BvbG9neSIKK0luaXRPU1Byb2NTZXRSZXNwZWN0ICAgICAgICAgIiUxJHM6IEluaXRpYWwgT1MgcHJvYyBzZXQgcmVzcGVjdGVkOiAlMiRzIgorSW5pdE9TUHJvY1NldE5vdFJlc3BlY3QgICAgICAiJTEkczogSW5pdGlhbCBPUyBwcm9jIHNldCBub3QgcmVzcGVjdGVkOiAlMiRzIgorQXZhaWxhYmxlT1NQcm9jICAgICAgICAgICAgICAiJTEkczogJTIkZCBhdmFpbGFibGUgT1MgcHJvY3MiCitVbmlmb3JtICAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBVbmlmb3JtIHRvcG9sb2d5IgorTm9uVW5pZm9ybSAgICAgICAgICAgICAgICAgICAiJTEkczogTm9udW5pZm9ybSB0b3BvbG9neSIKK1RvcG9sb2d5ICAgICAgICAgICAgICAgICAgICAgIiUxJHM6ICUyJGQgcGFja2FnZXMgeCAlMyRkIGNvcmVzL3BrZyB4ICU0JGQgdGhyZWFkcy9jb3JlICglNSRkIHRvdGFsIGNvcmVzKSIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IE9TIHByb2MgdG8gcGh5c2ljYWwgdGhyZWFkIG1hcCAoW10gPT4gbGV2ZWwgbm90IGluIG1hcCk6IgorT1NQcm9jVG9QYWNrYWdlICAgICAgICAgICAgICAiJTEkczogT1MgcHJvYyA8bj4gbWFwcyB0byA8bj50aCBwYWNrYWdlIGNvcmUgMCIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IE9TIHByb2MgJTIkZCBtYXBzIHRvIHBhY2thZ2UgJTMkZCBbY29yZSAlNCRkXSBbdGhyZWFkICU1JGRdIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogT1MgcHJvYyAlMiRkIG1hcHMgdG8gW3BhY2thZ2UgJTMkZF0gW2NvcmUgJTQkZF0gW3RocmVhZCAlNSRkXSIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IE9TIHByb2MgJTIkZCBtYXBzIHRvIFtwYWNrYWdlICUzJGRdIFtjb3JlICU0JGRdIHRocmVhZCAlNSRkIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogT1MgcHJvYyAlMiRkIG1hcHMgdG8gW3BhY2thZ2UgJTMkZF0gY29yZSAlNCRkIFt0aHJlYWQgJTUkZF0iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBPUyBwcm9jICUyJGQgbWFwcyB0byBwYWNrYWdlICUzJGQgW2NvcmUgJTQkZF0gW3RocmVhZCAlNSRkXSIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IE9TIHByb2MgJTIkZCBtYXBzIHRvIFtwYWNrYWdlICUzJGRdIGNvcmUgJTQkZCB0aHJlYWQgJTUkZCIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IE9TIHByb2MgJTIkZCBtYXBzIHRvIHBhY2thZ2UgJTMkZCBjb3JlICU0JGQgW3RocmVhZCAlNSRkXSIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IE9TIHByb2MgJTIkZCBtYXBzIHRvIHBhY2thZ2UgJTMkZCBbY29yZSAlNCRkXSB0aHJlYWQgJTUkZCIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IE9TIHByb2MgJTIkZCBtYXBzIHRvIHBhY2thZ2UgJTMkZCBjb3JlICU0JGQgdGhyZWFkICU1JGQiCitPU1Byb2NNYXBUb1BhY2sgICAgICAgICAgICAgICIlMSRzOiBPUyBwcm9jICUyJGQgbWFwcyB0byAlMyRzIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogSW50ZXJuYWwgdGhyZWFkICUyJGQgY2hhbmdlZCBhZmZpbml0eSBtYXNrIGZyb20gJTMkcyB0byAlNCRzIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogT1MgcHJvYyAlMiRkIG1hcHMgdG8gcGFja2FnZSAlMyRkLCBDUFUgJTQkZCwgVFBVICU1JGQiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBPUyBwcm9jICUyJGQgbWFwcyB0byBwYWNrYWdlICUzJGQsIENQVSAlNCRkIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogSFQgZW5hYmxlZDsgJTIkZCBwYWNrYWdlczsgJTMkZCBUUFU7ICU0JGQgVFBVcyBwZXIgcGFja2FnZSIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IEhUIGRpc2FibGVkOyAlMiRkIHBhY2thZ2VzIgorQmFycmllcnNJbkRpZmZlcmVudE9yZGVyICAgICAiVGhyZWFkcyBlbmNvdW50ZXJlZCBiYXJyaWVycyBpbiBkaWZmZXJlbnQgb3JkZXIuICIKK0Z1bmN0aW9uRXJyb3IgICAgICAgICAgICAgICAgIkZ1bmN0aW9uICUxJHMgZmFpbGVkOiIKK1RvcG9sb2d5RXh0cmEgICAgICAgICAgICAgICAgIiUxJHM6ICUyJHMgcGFja2FnZXMgeCAlMyRkIGNvcmVzL3BrZyB4ICU0JGQgdGhyZWFkcy9jb3JlICglNSRkIHRvdGFsIGNvcmVzKSIKK1dyb25nTWVzc2FnZUNhdGFsb2cgICAgICAgICAgIkluY29tcGF0aWJsZSBtZXNzYWdlIGNhdGFsb2cgXCIlMSRzXCI6IFZlcnNpb24gXCIlMiRzXCIgZm91bmQsIHZlcnNpb24gXCIlMyRzXCIgZXhwZWN0ZWQuIgorU3RnSWdub3JlZCAgICAgICAgICAgICAgICAgICAiJTEkczogaWdub3JlZCBiZWNhdXNlICUyJHMgaGFzIGJlZW4gZGVmaW5lZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgJTEsIC0tIG5hbWUgb2YgaWdub3JlZCB2YXJpYWJsZSwgJTIgLS0gbmFtZSBvZiB2YXJpYWJsZSB3aXRoIGhpZ2hlciBwcmlvcml0eS4KK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IG92ZXJyaWRlcyAlMyRzIHNwZWNpZmllZCBiZWZvcmUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICUxLCAlMiAtLSBuYW1lIGFuZCB2YWx1ZSBvZiB0aGUgb3ZlcnJpZGluZyB2YXJpYWJsZSwgJTMgLS0gbmFtZSBvZiBvdmVycmlkZW4gdmFyaWFibGUuCisKKyMgLS0tIE9wZW5NUCBlcnJvcnMgZGV0ZWN0ZWQgYXQgcnVudGltZSAtLS0KKyMKKyMgICAgJTEgaXMgdGhlIG5hbWUgb2YgT3Blbk1QIGNvbnN0cnVjdCAoZm9ybWF0dGVkIHdpdGggIlByYWdtYSIgZm9ybWF0KS4KKyMKK0Nuc0JvdW5kVG9Xb3Jrc2hhcmluZyAgICAgICAgIiUxJHMgbXVzdCBiZSBib3VuZCB0byBhIHdvcmstc2hhcmluZyBvciB3b3JrLXF1ZXVpbmcgY29uc3RydWN0IHdpdGggYW4gXCJvcmRlcmVkXCIgY2xhdXNlIgorQ25zRGV0ZWN0ZWRFbmQgICAgICAgICAgICAgICAiRGV0ZWN0ZWQgZW5kIG9mICUxJHMgd2l0aG91dCBmaXJzdCBleGVjdXRpbmcgYSBjb3JyZXNwb25kaW5nIGJlZ2lubmluZy4iCitDbnNJdGVyYXRpb25SYW5nZVRvb0xhcmdlICAgICJJdGVyYXRpb24gcmFuZ2UgdG9vIGxhcmdlIGluICUxJHMuIgorQ25zTG9vcEluY3JaZXJvUHJvaGliaXRlZCAgICAiJTEkcyBtdXN0IG5vdCBoYXZlIGEgbG9vcCBpbmNyZW1lbnQgdGhhdCBldmFsdWF0ZXMgdG8gemVyby4iCisjCisjICAgICUxIGlzIHRoZSBuYW1lIG9mIHRoZSBmaXJzdCBPcGVuTVAgY29uc3RydWN0LCAlMiAtLSB0aGUgbmFtZSBvZiB0aGUgc2Vjb25kIG9uZSAoYm90aCBmb3JtYXR0ZWQgd2l0aCAiUHJhZ21hIiBmb3JtYXQpLgorIworQ25zRXhwZWN0ZWRFbmQgICAgICAgICAgICAgICAiRXhwZWN0ZWQgZW5kIG9mICUxJHM7ICUyJHMsIGhvd2V2ZXIsIGhhcyBtb3N0IHJlY2VudGx5IGJlZ3VuIGV4ZWN1dGlvbi4iCitDbnNJbnZhbGlkTmVzdGluZyAgICAgICAgICAgICIlMSRzIGlzIGluY29ycmVjdGx5IG5lc3RlZCB3aXRoaW4gJTIkcyIKK0Nuc011bHRpcGxlTmVzdGluZyAgICAgICAgICAgIiUxJHMgY2Fubm90IGJlIGV4ZWN1dGVkIG11bHRpcGxlIHRpbWVzIGR1cmluZyBleGVjdXRpb24gb2Ygb25lIHBhcmFsbGVsIGl0ZXJhdGlvbi9zZWN0aW9uIG9mICUyJHMiCitDbnNOZXN0aW5nU2FtZU5hbWUgICAgICAgICAgICIlMSRzIGlzIGluY29ycmVjdGx5IG5lc3RlZCB3aXRoaW4gJTIkcyBvZiB0aGUgc2FtZSBuYW1lIgorQ25zTm9PcmRlcmVkQ2xhdXNlICAgICAgICAgICAiJTEkcyBpcyBpbmNvcnJlY3RseSBuZXN0ZWQgd2l0aGluICUyJHMgdGhhdCBkb2VzIG5vdCBoYXZlIGFuIFwib3JkZXJlZFwiIGNsYXVzZSIKK0Nuc05vdEluVGFza0NvbnN0cnVjdCAgICAgICAgIiUxJHMgaXMgaW5jb3JyZWN0bHkgbmVzdGVkIHdpdGhpbiAlMiRzIGJ1dCBub3Qgd2l0aGluIGFueSBvZiBpdHMgXCJ0YXNrXCIgY29uc3RydWN0cyIKK0Nuc1RocmVhZHNBdEJhcnJpZXIgICAgICAgICAgIk9uZSB0aHJlYWQgYXQgJTEkcyB3aGlsZSBhbm90aGVyIHRocmVhZCBpcyBhdCAlMiRzLiIKKworIyBOZXcgZXJyb3JzCitDYW50Q29ubmVjdCAgICAgICAgICAgICAgICAgICJDYW5ub3QgY29ubmVjdCB0byAlMSRzIgorQ2FudENvbm5lY3RVc2luZyAgICAgICAgICAgICAiQ2Fubm90IGNvbm5lY3QgdG8gJTEkcyAtIFVzaW5nICUyJHMiCitMaWJOb3RTdXBwb3J0ICAgICAgICAgICAgICAgICIlMSRzIGRvZXMgbm90IHN1cHBvcnQgJTIkcy4gQ29udGludWluZyB3aXRob3V0IHVzaW5nICUyJHMuIgorTGliTm90U3VwcG9ydEZvciAgICAgICAgICAgICAiJTEkcyBkb2VzIG5vdCBzdXBwb3J0ICUyJHMgZm9yICUzJHMuIENvbnRpbnVpbmcgd2l0aG91dCB1c2luZyAlMiRzLiIKK1N0YXRpY0xpYk5vdFN1cHBvcnQgICAgICAgICAgIlN0YXRpYyAlMSRzIGRvZXMgbm90IHN1cHBvcnQgJTIkcy4gQ29udGludWluZyB3aXRob3V0IHVzaW5nICUyJHMuIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiS01QX0RZTkFNSUNfTU9ERT1pcm1sIGNhbm5vdCBiZSB1c2VkIHdpdGggS01QX1VTRV9JUk1MPTAiCitJdHRVbmtub3duR3JvdXAgICAgICAgICAgICAgICJpdHRub3RpZnk6IFVua25vd24gZ3JvdXAgXCIlMiRzXCIgc3BlY2lmaWVkIGluIGVudmlyb25tZW50IHZhcmlhYmxlIFwiJTEkc1wiLiIKK0l0dEVudlZhclRvb0xvbmcgICAgICAgICAgICAgIml0dG5vdGlmeTogRW52aXJvbm1lbnQgdmFyaWFibGUgXCIlMSRzXCIgdG9vIGxvbmc6IEFjdHVhbCBsZW5ndGhzIGlzICUyJGx1LCBtYXggYWxsb3dlZCBsZW5ndGggaXMgJTMkbHUuIgorQWZmVXNlR2xvYkNwdWlkTDExICAgICAgICAgICAiJTEkczogQWZmaW5pdHkgY2FwYWJsZSwgdXNpbmcgZ2xvYmFsIGNwdWlkIGxlYWYgMTEgaW5mbyIKK0FmZk5vdENhcGFibGVVc2VMb2NDcHVpZEwxMSAgIiUxJHM6IEFmZmluaXR5IG5vdCBjYXBhYmxlLCB1c2luZyBsb2NhbCBjcHVpZCBsZWFmIDExIGluZm8iCitBZmZJbmZvU3RyICAgICAgICAgICAgICAgICAgICIlMSRzOiAlMiRzLiIKK0FmZkluZm9TdHJTdHIgICAgICAgICAgICAgICAgIiUxJHM6ICUyJHMgLSAlMyRzLiIKK09TUHJvY1RvUGh5c2ljYWxUaHJlYWRNYXAgICAgIiUxJHM6IE9TIHByb2MgdG8gcGh5c2ljYWwgdGhyZWFkIG1hcDoiCitBZmZVc2luZ0ZsYXRPUyAgICAgICAgICAgICAgICIlMSRzOiB1c2luZyBcImZsYXRcIiBPUyA8LT4gcGh5c2ljYWwgcHJvYyBtYXBwaW5nLiIKK0FmZlBhcnNlRmlsZW5hbWUgICAgICAgICAgICAgIiUxJHM6IHBhcnNpbmcgJTIkcy4iCitNc2dFeGl0aW5nICAgICAgICAgICAgICAgICAgICIlMSRzIC0gZXhpdGluZy4iCitJbmNvbXBhdGlibGVMaWJyYXJ5ICAgICAgICAgICJJbmNvbXBhdGlibGUgJTEkcyBsaWJyYXJ5IHdpdGggdmVyc2lvbiAlMiRzIGZvdW5kLiIKK0l0dEZ1bmN0aW9uRXJyb3IgICAgICAgICAgICAgIml0dG5vdGlmeTogRnVuY3Rpb24gJTEkcyBmYWlsZWQ6IgorSXR0VW5rbm93bkVycm9yICAgICAgICAgICAgICAiaXR0bm9maWZ5OiBFcnJvciAjJTEkZC4iCitFbnZNaWRkbGVXYXJuICAgICAgICAgICAgICAgICIlMSRzIG11c3QgYmUgc2V0IHByaW9yIHRvIGZpcnN0IHBhcmFsbGVsIHJlZ2lvbiBvciBjZXJ0YWluIEFQSSBjYWxsczsgaWdub3JlZC4iCitDbnNMb2NrTm90RGVzdHJveWVkICAgICAgICAgICJMb2NrIGluaXRpYWxpemVkIGF0ICUxJHMoJTIkZCkgd2FzIG5vdCBkZXN0cm95ZWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICUxLCAlMiwgJTMsICU0IC0tIGZpbGUsIGxpbmUsIGZ1bmMsIGNvbAorQ2FudExvYWRCYWxVc2luZyAgICAgICAgICAgICAiQ2Fubm90IGRldGVybWluZSBtYWNoaW5lIGxvYWQgYmFsYW5jZSAtIFVzaW5nICUxJHMiCitBZmZOb3RDYXBhYmxlVXNlUHRocmVhZCAgICAgICIlMSRzOiBBZmZpbml0eSBub3QgY2FwYWJsZSwgdXNpbmcgcHRocmVhZCBpbmZvIgorQWZmVXNlUHRocmVhZCAgICAgICAgICAgICAgICAiJTEkczogQWZmaW5pdHkgY2FwYWJsZSwgdXNpbmcgcHRocmVhZCBpbmZvIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiTG9hZGluZyBcIiUxJHNcIiBsaWJyYXJ5IGZhaWxlZDoiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICJMb29rdXAgb2YgXCIlMSRzXCIgZnVuY3Rpb24gZmFpbGVkOiIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIkJ1ZmZlciB0b28gc21hbGwuIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgIyUxJGQuIgorTnRoU3ludGF4RXJyb3IgICAgICAgICAgICAgICAiJTEkczogSW52YWxpZCBzeW1ib2xzIGZvdW5kLiBDaGVjayB0aGUgdmFsdWUgXCIlMiRzXCIuIgorTnRoU3BhY2VzTm90QWxsb3dlZCAgICAgICAgICAiJTEkczogU3BhY2VzIGJldHdlZW4gZGlnaXRzIGFyZSBub3QgYWxsb3dlZCBcIiUyJHNcIi4iCitBZmZTdHJQYXJzZUZpbGVuYW1lICAgICAgICAgICIlMSRzOiAlMiRzIC0gcGFyc2luZyAlMyRzLiIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHMgY2Fubm90IGJlIHNwZWNpZmllZCB2aWEga21wX3NldF9kZWZhdWx0cygpIG9uIHRoaXMgbWFjaGluZSBiZWNhdXNlIGl0IGhhcyBtb3JlIHRoYW4gb25lIHByb2Nlc3NvciBncm91cC4iCitBZmZUeXBlQ2FudFVzZU11bHRHcm91cHMgICAgICJDYW5ub3QgdXNlIGFmZmluaXR5IHR5cGUgXCIlMSRzXCIgd2l0aCBtdWx0aXBsZSBXaW5kb3dzKiBPUyBwcm9jZXNzb3IgZ3JvdXBzLCB1c2luZyBcIiUyJHNcIi4iCitBZmZHcmFuQ2FudFVzZU11bHRHcm91cHMgICAgICJDYW5ub3QgdXNlIGFmZmluaXR5IGdyYW51bGFyaXR5IFwiJTEkc1wiIHdpdGggbXVsdGlwbGUgV2luZG93cyogT1MgcHJvY2Vzc29yIGdyb3VwcywgdXNpbmcgXCIlMiRzXCIuIgorQWZmV2luZG93c1Byb2NHcm91cE1hcCAgICAgICAiJTEkczogTWFwcGluZyBXaW5kb3dzKiBPUyBwcm9jZXNzb3IgZ3JvdXAgPGk+IHByb2MgPGo+IHRvIE9TIHByb2MgNjQqPGk+KzxqPi4iCitBZmZPU1Byb2NUb0dyb3VwICAgICAgICAgICAgICIlMSRzOiBPUyBwcm9jICUyJGQgbWFwcyB0byBXaW5kb3dzKiBPUyBwcm9jZXNzb3IgZ3JvdXAgJTMkZCBwcm9jICU0JGQiCitBZmZCYWxhbmNlZE5vdEF2YWlsICAgICAgICAgICIlMSRzOiBBZmZpbml0eSBiYWxhbmNlZCBpcyBub3QgYXZhaWxhYmxlLiIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IGdyYW51bGFyaXR5PWNvcmUgd2lsbCBiZSB1c2VkLiIKK0VudkxvY2tXYXJuICAgICAgICAgICAgICAgICAgIiUxJHMgbXVzdCBiZSBzZXQgcHJpb3IgdG8gZmlyc3QgT01QIGxvY2sgY2FsbCBvciBjcml0aWNhbCBzZWN0aW9uOyBpZ25vcmVkLiIKK0Z1dGV4Tm90U3VwcG9ydGVkICAgICAgICAgICAgImZ1dGV4IHN5c3RlbSBjYWxsIG5vdCBzdXBwb3J0ZWQ7ICUxJHM9JTIkcyBpZ25vcmVkLiIKK0FmZkdyYW5Vc2luZyAgICAgICAgICAgICAgICAgIiUxJHM6IGdyYW51bGFyaXR5PSUyJHMgd2lsbCBiZSB1c2VkLiIKK0FmZlRoclBsYWNlSW52YWxpZCAgICAgICAgICAgIiUxJHM6IGludmFsaWQgdmFsdWUgXCIlMiRzXCIsIHZhbGlkIGZvcm1hdCBpcyBcIk5zW0BOXSxOY1tATl0sTnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKG5Tb2NrZXRzQG9mZnNldCwgbkNvcmVzQG9mZnNldCwgblR0aHJlYWRzIHBlciBjb3JlKVwiLiIKK0FmZlRoclBsYWNlVW5zdXBwb3J0ZWQgICAgICAgIktNUF9QTEFDRV9USFJFQURTIGlnbm9yZWQ6IHVuc3VwcG9ydGVkIGFyY2hpdGVjdHVyZS4iCitBZmZUaHJQbGFjZU1hbnlDb3JlcyAgICAgICAgICJLTVBfUExBQ0VfVEhSRUFEUyBpZ25vcmVkOiB0b28gbWFueSBjb3JlcyByZXF1ZXN0ZWQuIgorU3ludGF4RXJyb3JVc2luZyAgICAgICAgICAgICAiJTEkczogc3ludGF4IGVycm9yLCB1c2luZyAlMiRzLiIKK0FkYXB0aXZlTm90U3VwcG9ydGVkICAgICAgICAgIiUxJHM6IEFkYXB0aXZlIGxvY2tzIGFyZSBub3Qgc3VwcG9ydGVkOyB1c2luZyBxdWV1aW5nLiIKK0VudlN5bnRheEVycm9yICAgICAgICAgICAgICAgIiUxJHM6IEludmFsaWQgc3ltYm9scyBmb3VuZC4gQ2hlY2sgdGhlIHZhbHVlIFwiJTIkc1wiLiIKK0VudlNwYWNlc05vdEFsbG93ZWQgICAgICAgICAgIiUxJHM6IFNwYWNlcyBiZXR3ZWVuIGRpZ2l0cyBhcmUgbm90IGFsbG93ZWQgXCIlMiRzXCIuIgorQm91bmRUb09TUHJvY1NldCAgICAgICAgICAgICAiJTEkczogcGlkICUyJGQgdGhyZWFkICUzJGQgYm91bmQgdG8gT1MgcHJvYyBzZXQgJTQkcyIKK0Nuc0xvb3BJbmNySWxsZWdhbCAgICAgICAgICAgIiUxJHMgZXJyb3I6IHBhcmFsbGVsIGxvb3AgaW5jcmVtZW50IGFuZCBjb25kaXRpb24gYXJlIGluY29uc2lzdGVudC4iCitOb0dvbXBDYW5jZWxsYXRpb24gICAgICAgICAgICJsaWJnb21wIGNhbmNlbGxhdGlvbiBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZC4iCitBZmZUaHJQbGFjZU5vblVuaWZvcm0gICAgICAgICJLTVBfUExBQ0VfVEhSRUFEUyBpZ25vcmVkOiBub24tdW5pZm9ybSB0b3BvbG9neS4iCitBZmZUaHJQbGFjZU5vblRocmVlTGV2ZWwgICAgICJLTVBfUExBQ0VfVEhSRUFEUyBpZ25vcmVkOiBvbmx5IHRocmVlLWxldmVsIHRvcG9sb2d5IGlzIHN1cHBvcnRlZC4iCitBZmZHcmFuVG9wR3JvdXAgICAgICAgICAgICAgICIlMSRzOiBncmFudWxhcml0eT0lMiRzIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCBLTVBfVE9QT0xPR1lfTUVUSE9EPWdyb3VwLiBVc2luZyBcImdyYW51bGFyaXR5PWZpbmVcIi4iCitBZmZHcmFuR3JvdXBUeXBlICAgICAgICAgICAgICIlMSRzOiBncmFudWxhcml0eT1ncm91cCBpcyBub3Qgc3VwcG9ydGVkIHdpdGggS01QX0FGRklOSVRZPSUyJHMuIFVzaW5nIFwiZ3JhbnVsYXJpdHk9Y29yZVwiLiIKK0FmZlRoclBsYWNlTWFueVNvY2tldHMgICAgICAgIktNUF9QTEFDRV9USFJFQURTIGlnbm9yZWQ6IHRvbyBtYW55IHNvY2tldHMgcmVxdWVzdGVkLiIKK0FmZlRoclBsYWNlRGVwcmVjYXRlZCAgICAgICAgIktNUF9QTEFDRV9USFJFQURTIFwib1wiIG9mZnNldCBkZXNpZ25hdG9yIGRlcHJlY2F0ZWQsIHBsZWFzZSB1c2UgQCBwcmVmaXggZm9yIG9mZnNldCB2YWx1ZS4iCitBZmZVc2luZ0h3bG9jICAgICAgICAgICAgICAgICIlMSRzOiBBZmZpbml0eSBjYXBhYmxlLCB1c2luZyBod2xvYy4iCitBZmZJZ25vcmluZ0h3bG9jICAgICAgICAgICAgICIlMSRzOiBJZ25vcmluZyBod2xvYyBtZWNoYW5pc20uIgorQWZmSHdsb2NFcnJvck9jY3VycmVkICAgICAgICAiJTEkczogSHdsb2MgZmFpbGVkIGluICUyJHMuIFJlbHlpbmcgb24gaW50ZXJuYWwgYWZmaW5pdHkgbWVjaGFuaXNtcy4iCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLSotIEhJTlRTIC0qLQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIEhpbnRzLiBIaW50IG1heSBiZSBwcmludGVkIGFmdGVyIGEgbWVzc2FnZS4gVXN1YWxseSBpdCBpcyBsb25nZXIgZXhwbGFuYXRpb24gdGV4dCBvciBzdWdnZXN0aW9uLgorIyBUbyBtYWludGFpbiBoaW50IG51bWJlcnMgKHRoZXkgYXJlIHZpc2libGUgdG8gY3VzdG9tZXJzKSwgYWRkIG5ldyBoaW50cyB0byB0aGUgZW5kLgorCitTdWJtaXRCdWdSZXBvcnQgICAgICAgICAgICAgICJQbGVhc2Ugc3VibWl0IGEgYnVnIHJlcG9ydCB3aXRoIHRoaXMgbWVzc2FnZSwgY29tcGlsZSBhbmQgcnVuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbW1hbmRzIHVzZWQsIGFuZCBtYWNoaW5lIGNvbmZpZ3VyYXRpb24gaW5mbyBpbmNsdWRpbmcgbmF0aXZlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBpbGVyIGFuZCBvcGVyYXRpbmcgc3lzdGVtIHZlcnNpb25zLiBGYXN0ZXIgcmVzcG9uc2Ugd2lsbCBiZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvYnRhaW5lZCBieSBpbmNsdWRpbmcgYWxsIHByb2dyYW0gc291cmNlcy4gRm9yIGluZm9ybWF0aW9uIG9uICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN1Ym1pdHRpbmcgdGhpcyBpc3N1ZSwgcGxlYXNlIHNlZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LmludGVsLmNvbS9zb2Z0d2FyZS9wcm9kdWN0cy9zdXBwb3J0Ly4iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICJDaGVjayBOTFNQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLCBpdHMgdmFsdWUgaXMgXCIlMSRzXCIuIgorQ2hhbmdlU3RhY2tMaW1pdCAgICAgICAgICAgICAiUGxlYXNlIHRyeSBjaGFuZ2luZyB0aGUgc2hlbGwgc3RhY2sgbGltaXQgb3IgYWRqdXN0aW5nIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPTVBfU1RBQ0tTSVpFIGVudmlyb25tZW50IHZhcmlhYmxlLiIKK1Vuc2V0X0FMTF9USFJFQURTICAgICAgICAgICAgIkNvbnNpZGVyIHVuc2V0dGluZyBLTVBfQUxMX1RIUkVBRFMgYW5kIE9NUF9USFJFQURfTElNSVQgKGlmIGVpdGhlciBpcyBzZXQpLiIKK1NldF9BTExfVEhSRUFEUFJJVkFURSAgICAgICAgIkNvbnNpZGVyIHNldHRpbmcgS01QX0FMTF9USFJFQURQUklWQVRFIHRvIGEgdmFsdWUgbGFyZ2VyIHRoYW4gJTEkZC4iCitQb3NzaWJsZVN5c3RlbUxpbWl0T25UaHJlYWRzICJUaGlzIGNvdWxkIGFsc28gYmUgZHVlIHRvIGEgc3lzdGVtLXJlbGF0ZWQgbGltaXQgb24gdGhlIG51bWJlciBvZiB0aHJlYWRzLiIKK0R1cGxpY2F0ZUxpYnJhcnkgICAgICAgICAgICAgIlRoaXMgbWVhbnMgdGhhdCBtdWx0aXBsZSBjb3BpZXMgb2YgdGhlIE9wZW5NUCBydW50aW1lIGhhdmUgYmVlbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaW5rZWQgaW50byB0aGUgcHJvZ3JhbS4gVGhhdCBpcyBkYW5nZXJvdXMsIHNpbmNlIGl0IGNhbiBkZWdyYWRlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBlcmZvcm1hbmNlIG9yIGNhdXNlIGluY29ycmVjdCByZXN1bHRzLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgYmVzdCB0aGluZyB0byBkbyBpcyB0byBlbnN1cmUgdGhhdCBvbmx5IGEgc2luZ2xlIE9wZW5NUCBydW50aW1lIGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpbmtlZCBpbnRvIHRoZSBwcm9jZXNzLCBlLmcuIGJ5IGF2b2lkaW5nIHN0YXRpYyBsaW5raW5nIG9mIHRoZSBPcGVuTVAgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicnVudGltZSBpbiBhbnkgbGlicmFyeS4gQXMgYW4gdW5zYWZlLCB1bnN1cHBvcnRlZCwgdW5kb2N1bWVudGVkIHdvcmthcm91bmQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieW91IGNhbiBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEtNUF9EVVBMSUNBVEVfTElCX09LPVRSVUUgdG8gYWxsb3cgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIHByb2dyYW0gdG8gY29udGludWUgdG8gZXhlY3V0ZSwgYnV0IHRoYXQgbWF5IGNhdXNlIGNyYXNoZXMgb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2lsZW50bHkgcHJvZHVjZSBpbmNvcnJlY3QgcmVzdWx0cy4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBzZWUgaHR0cDovL3d3dy5pbnRlbC5jb20vc29mdHdhcmUvcHJvZHVjdHMvc3VwcG9ydC8uIgorTmFtZUNvbWVzRnJvbV9DUFVJTkZPX0ZJTEUgICAiVGhpcyBuYW1lIGlzIHNwZWNpZmllZCBpbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBLTVBfQ1BVSU5GT19GSUxFLiIKK05vdEVub3VnaE1lbW9yeSAgICAgICAgICAgICAgIlNlZW1zIGFwcGxpY2F0aW9uIHJlcXVpcmVkIHRvbyBtdWNoIG1lbW9yeS4iCitWYWxpZEJvb2xWYWx1ZXMgICAgICAgICAgICAgICJVc2UgXCIwXCIsIFwiRkFMU0VcIi4gXCIuRi5cIiwgXCJvZmZcIiwgXCJub1wiIGFzIGZhbHNlIHZhbHVlcywgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIxXCIsIFwiVFJVRVwiLCBcIi5ULlwiLCBcIm9uXCIsIFwieWVzXCIgYXMgdHJ1ZSB2YWx1ZXMuIgorQnVmZmVyT3ZlcmZsb3cgICAgICAgICAgICAgICAiUGVyaGFwcyB0b28gbWFueSB0aHJlYWRzLiIKK1J1bm5pbmdBdE1heFByaW9yaXR5ICAgICAgICAgIkRlY3JlYXNlIHByaW9yaXR5IG9mIGFwcGxpY2F0aW9uLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIHdpbGwgYWxsb3cgdGhlIG1vbml0b3IgdGhyZWFkIHJ1biBhdCBoaWdoZXIgcHJpb3JpdHkgdGhhbiBvdGhlciB0aHJlYWRzLiIKK0NoYW5nZU1vbml0b3JTdGFja1NpemUgICAgICAgIlRyeSBjaGFuZ2luZyBLTVBfTU9OSVRPUl9TVEFDS1NJWkUgb3IgdGhlIHNoZWxsIHN0YWNrIGxpbWl0LiIKK0NoYW5nZVdvcmtlclN0YWNrU2l6ZSAgICAgICAgIlRyeSBjaGFuZ2luZyBPTVBfU1RBQ0tTSVpFIGFuZC9vciB0aGUgc2hlbGwgc3RhY2sgbGltaXQuIgorSW5jcmVhc2VXb3JrZXJTdGFja1NpemUgICAgICAiVHJ5IGluY3JlYXNpbmcgT01QX1NUQUNLU0laRSBvciB0aGUgc2hlbGwgc3RhY2sgbGltaXQuIgorRGVjcmVhc2VXb3JrZXJTdGFja1NpemUgICAgICAiVHJ5IGRlY3JlYXNpbmcgT01QX1NUQUNLU0laRS4iCitEZWNyZWFzZV9OVU1fVEhSRUFEUyAgICAgICAgICJUcnkgZGVjcmVhc2luZyB0aGUgdmFsdWUgb2YgT01QX05VTV9USFJFQURTLiIKK0luY3JlYXNlTW9uaXRvclN0YWNrU2l6ZSAgICAgIlRyeSBpbmNyZWFzaW5nIEtNUF9NT05JVE9SX1NUQUNLU0laRS4iCitEZWNyZWFzZU1vbml0b3JTdGFja1NpemUgICAgICJUcnkgZGVjcmVhc2luZyBLTVBfTU9OSVRPUl9TVEFDS1NJWkUuIgorRGVjcmVhc2VOdW1iZXJPZlRocmVhZHNJblVzZSAiVHJ5IGRlY3JlYXNpbmcgdGhlIG51bWJlciBvZiB0aHJlYWRzIGluIHVzZSBzaW11bHRhbmVvdXNseS4iCitEZWZhdWx0U2NoZWR1bGVLaW5kVXNlZCAgICAgICJXaWxsIHVzZSBkZWZhdWx0IHNjaGVkdWxlIHR5cGUgKCUxJHMpLiIKK0dldE5ld2VyTGlicmFyeSAgICAgICAgICAgICAgIkl0IGNvdWxkIGJlIGEgcmVzdWx0IG9mIHVzaW5nIGFuIG9sZGVyIE9NUCBsaWJyYXJ5IHdpdGggYSBuZXdlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21waWxlciBvciBtZW1vcnkgY29ycnVwdGlvbi4gWW91IG1heSBjaGVjayB0aGUgcHJvcGVyIE9NUCBsaWJyYXJ5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlzIGxpbmtlZCB0byB0aGUgYXBwbGljYXRpb24uIgorQ2hlY2tFbnZWYXIgICAgICAgICAgICAgICAgICAiQ2hlY2sgJTEkcyBlbnZpcm9ubWVudCB2YXJpYWJsZSwgaXRzIHZhbHVlIGlzIFwiJTIkc1wiLiIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIllvdSBtYXkgd2FudCB0byB1c2UgYW4gJTEkcyBsaWJyYXJ5IHRoYXQgc3VwcG9ydHMgJTIkcyBpbnRlcmZhY2Ugd2l0aCB2ZXJzaW9uICUzJHMuIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiWW91IG1heSB3YW50IHRvIHVzZSBhbiAlMSRzIGxpYnJhcnkgd2l0aCB2ZXJzaW9uICUyJHMuIgorQmFkRXhlRm9ybWF0ICAgICAgICAgICAgICAgICAiU3lzdGVtIGVycm9yICMxOTMgaXMgXCJCYWQgZm9ybWF0IG9mIEVYRSBvciBETEwgZmlsZVwiLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVc3VhbGx5IGl0IG1lYW5zIHRoZSBmaWxlIGlzIGZvdW5kLCBidXQgaXQgaXMgY29ycnVwdGVkIG9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImEgZmlsZSBmb3IgYW5vdGhlciBhcmNoaXRlY3R1cmUuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNoZWNrIHdoZXRoZXIgXCIlMSRzXCIgaXMgYSBmaWxlIGZvciAlMiRzIGFyY2hpdGVjdHVyZS4iCitTeXN0ZW1MaW1pdE9uVGhyZWFkcyAgICAgICAgICJTeXN0ZW0tcmVsYXRlZCBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIHRocmVhZHMuIgorCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBlbmQgb2YgZmlsZSAjCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvMzAvb21wLmgudmFyIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS8zMC9vbXAuaC52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZmY2ZiMgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvMzAvb21wLmgudmFyCkBAIC0wLDAgKzEsMTY0IEBACisvKgorICogaW5jbHVkZS8zMC9vbXAuaC52YXIKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBfX09NUF9ICisjICAgZGVmaW5lIF9fT01QX0gKKworIyAgIGRlZmluZSBLTVBfVkVSU0lPTl9NQUpPUiAgICBATElCT01QX1ZFUlNJT05fTUFKT1JACisjICAgZGVmaW5lIEtNUF9WRVJTSU9OX01JTk9SICAgIEBMSUJPTVBfVkVSU0lPTl9NSU5PUkAKKyMgICBkZWZpbmUgS01QX1ZFUlNJT05fQlVJTEQgICAgQExJQk9NUF9WRVJTSU9OX0JVSUxEQAorIyAgIGRlZmluZSBLTVBfQlVJTERfREFURSAgICAgICAiQExJQk9NUF9CVUlMRF9EQVRFQCIKKworIyAgIGlmZGVmIF9fY3BsdXNwbHVzCisgICAgZXh0ZXJuICJDIiB7CisjICAgZW5kaWYKKworIyAgICAgICBkZWZpbmUgb21wX3NldF9udW1fdGhyZWFkcyAgICAgICAgICBvbXBjX3NldF9udW1fdGhyZWFkcworIyAgICAgICBkZWZpbmUgb21wX3NldF9keW5hbWljICAgICAgICAgICAgICBvbXBjX3NldF9keW5hbWljCisjICAgICAgIGRlZmluZSBvbXBfc2V0X25lc3RlZCAgICAgICAgICAgICAgIG9tcGNfc2V0X25lc3RlZAorIyAgICAgICBkZWZpbmUgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscyAgICBvbXBjX3NldF9tYXhfYWN0aXZlX2xldmVscworIyAgICAgICBkZWZpbmUgb21wX3NldF9zY2hlZHVsZSAgICAgICAgICAgICBvbXBjX3NldF9zY2hlZHVsZQorIyAgICAgICBkZWZpbmUgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtICBvbXBjX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisjICAgICAgIGRlZmluZSBvbXBfZ2V0X3RlYW1fc2l6ZSAgICAgICAgICAgIG9tcGNfZ2V0X3RlYW1fc2l6ZQorCisKKyMgICAgICAgZGVmaW5lIGttcF9zZXRfc3RhY2tzaXplICAgICAgICAgICAga21wY19zZXRfc3RhY2tzaXplCisjICAgICAgIGRlZmluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zICAgICAgICAgIGttcGNfc2V0X3N0YWNrc2l6ZV9zCisjICAgICAgIGRlZmluZSBrbXBfc2V0X2Jsb2NrdGltZSAgICAgICAgICAgIGttcGNfc2V0X2Jsb2NrdGltZQorIyAgICAgICBkZWZpbmUga21wX3NldF9saWJyYXJ5ICAgICAgICAgICAgICBrbXBjX3NldF9saWJyYXJ5CisjICAgICAgIGRlZmluZSBrbXBfc2V0X2RlZmF1bHRzICAgICAgICAgICAgIGttcGNfc2V0X2RlZmF1bHRzCisjICAgICAgIGRlZmluZSBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyAgIGttcGNfc2V0X2FmZmluaXR5X21hc2tfcHJvYworIyAgICAgICBkZWZpbmUga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyBrbXBjX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworIyAgICAgICBkZWZpbmUga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MgICBrbXBjX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKworIyAgICAgICBkZWZpbmUga21wX21hbGxvYyAgICAgICAgICAgICAgICAgICBrbXBjX21hbGxvYworIyAgICAgICBkZWZpbmUga21wX2NhbGxvYyAgICAgICAgICAgICAgICAgICBrbXBjX2NhbGxvYworIyAgICAgICBkZWZpbmUga21wX3JlYWxsb2MgICAgICAgICAgICAgICAgICBrbXBjX3JlYWxsb2MKKyMgICAgICAgZGVmaW5lIGttcF9mcmVlICAgICAgICAgICAgICAgICAgICAga21wY19mcmVlCisKKworIyAgIGlmIGRlZmluZWQoX1dJTjMyKQorIyAgICAgICBkZWZpbmUgX19LQUlfS01QQ19DT05WRU5USU9OIF9fY2RlY2wKKyMgICBlbHNlCisjICAgICAgIGRlZmluZSBfX0tBSV9LTVBDX0NPTlZFTlRJT04KKyMgICBlbmRpZgorCisgICAgLyogc2NoZWR1bGUga2luZCBjb25zdGFudHMgKi8KKyAgICB0eXBlZGVmIGVudW0gb21wX3NjaGVkX3QgeworCW9tcF9zY2hlZF9zdGF0aWMgID0gMSwKKwlvbXBfc2NoZWRfZHluYW1pYyA9IDIsCisJb21wX3NjaGVkX2d1aWRlZCAgPSAzLAorCW9tcF9zY2hlZF9hdXRvICAgID0gNAorICAgIH0gb21wX3NjaGVkX3Q7CisKKyAgICAvKiBzZXQgQVBJIGZ1bmN0aW9ucyAqLworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X251bV90aHJlYWRzIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X2R5bmFtaWMgICAgIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X25lc3RlZCAgICAgIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X3NjaGVkdWxlICAgICAgICAgIChvbXBfc2NoZWRfdCwgaW50KTsKKworICAgIC8qIHF1ZXJ5IEFQSSBmdW5jdGlvbnMgKi8KKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9udW1fdGhyZWFkcyAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X2R5bmFtaWMgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbmVzdGVkICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9tYXhfdGhyZWFkcyAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3RocmVhZF9udW0gICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbnVtX3Byb2NzICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2luX3BhcmFsbGVsICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfaW5fZmluYWwgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfYWN0aXZlX2xldmVsICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbGV2ZWwgICAgICAgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bSAoaW50KTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF90ZWFtX3NpemUgICAgICAgICAgIChpbnQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3RocmVhZF9saW1pdCAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3NjaGVkdWxlICAgICAgICAgICAgKG9tcF9zY2hlZF90ICosIGludCAqKTsKKworICAgIC8qIGxvY2sgQVBJIGZ1bmN0aW9ucyAqLworICAgIHR5cGVkZWYgc3RydWN0IG9tcF9sb2NrX3QgeworICAgICAgICB2b2lkICogX2xrOworICAgIH0gb21wX2xvY2tfdDsKKworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfaW5pdF9sb2NrICAgIChvbXBfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X2xvY2sgICAgIChvbXBfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfdW5zZXRfbG9jayAgIChvbXBfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZGVzdHJveV9sb2NrIChvbXBfbG9ja190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfdGVzdF9sb2NrICAgIChvbXBfbG9ja190ICopOworCisgICAgLyogbmVzdGVkIGxvY2sgQVBJIGZ1bmN0aW9ucyAqLworICAgIHR5cGVkZWYgc3RydWN0IG9tcF9uZXN0X2xvY2tfdCB7CisgICAgICAgIHZvaWQgKiBfbGs7CisgICAgfSBvbXBfbmVzdF9sb2NrX3Q7CisKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2luaXRfbmVzdF9sb2NrICAgIChvbXBfbmVzdF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfbmVzdF9sb2NrICAgICAob21wX25lc3RfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfdW5zZXRfbmVzdF9sb2NrICAgKG9tcF9uZXN0X2xvY2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrIChvbXBfbmVzdF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF90ZXN0X25lc3RfbG9jayAgICAob21wX25lc3RfbG9ja190ICopOworCisgICAgLyogdGltZSBBUEkgZnVuY3Rpb25zICovCisgICAgZXh0ZXJuIGRvdWJsZSBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfd3RpbWUgKHZvaWQpOworICAgIGV4dGVybiBkb3VibGUgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3d0aWNrICh2b2lkKTsKKworIyAgIGluY2x1ZGUgPHN0ZGxpYi5oPgorICAgIC8qIGttcCBBUEkgZnVuY3Rpb25zICovCisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfc3RhY2tzaXplICAgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9zdGFja3NpemUgICAgICAgICAgKGludCk7CisgICAgZXh0ZXJuIHNpemVfdCBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfc3RhY2tzaXplX3MgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9zdGFja3NpemVfcyAgICAgICAgKHNpemVfdCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfYmxvY2t0aW1lICAgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9saWJyYXJ5ICAgICAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2Jsb2NrdGltZSAgICAgICAgICAoaW50KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9saWJyYXJ5ICAgICAgICAgICAgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfbGlicmFyeV9zZXJpYWwgICAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dCAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfZGVmYXVsdHMgICAgICAgICAgIChjaGFyIGNvbnN0ICopOworCisgICAgLyogYWZmaW5pdHkgQVBJIGZ1bmN0aW9ucyAqLworICAgIHR5cGVkZWYgdm9pZCAqIGttcF9hZmZpbml0eV9tYXNrX3Q7CisKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9hZmZpbml0eSAgICAgICAgICAgICAoa21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9hZmZpbml0eSAgICAgICAgICAgICAoa21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYyAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzayAgICAgKGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sgICAgKGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jICAgKGludCwga21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyAoaW50LCBrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyAgIChpbnQsIGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisKKyAgICBleHRlcm4gdm9pZCAqIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX21hbGxvYyAgKHNpemVfdCk7CisgICAgZXh0ZXJuIHZvaWQgKiBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9jYWxsb2MgIChzaXplX3QsIHNpemVfdCk7CisgICAgZXh0ZXJuIHZvaWQgKiBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9yZWFsbG9jICh2b2lkICosIHNpemVfdCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9mcmVlICAgICh2b2lkICopOworCisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfd2FybmluZ3Nfb24odm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfd2FybmluZ3Nfb2ZmKHZvaWQpOworCisjICAgdW5kZWYgX19LQUlfS01QQ19DT05WRU5USU9OCisKKyAgICAvKiBXYXJuaW5nOgorICAgICAgIFRoZSBmb2xsb3dpbmcgdHlwZWRlZnMgYXJlIG5vdCBzdGFuZGFyZCwgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuCisgICAgKi8KKyAgICB0eXBlZGVmIGludCAgICAgb21wX2ludF90OworICAgIHR5cGVkZWYgZG91YmxlICBvbXBfd3RpbWVfdDsKKworIyAgIGlmZGVmIF9fY3BsdXNwbHVzCisgICAgfQorIyAgIGVuZGlmCisKKyNlbmRpZiAvKiBfX09NUF9IICovCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvMzAvb21wX2xpYi5mLnZhciBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvMzAvb21wX2xpYi5mLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTEyMjA2Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS8zMC9vbXBfbGliLmYudmFyCkBAIC0wLDAgKzEsNjMzIEBACishIGluY2x1ZGUvMzAvb21wX2xpYi5mLnZhcgorCishCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEvLworIS8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyEvLworIS8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyEvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyEvLworIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishCisKKyEqKioKKyEqKiogU29tZSBvZiB0aGUgZGlyZWN0aXZlcyBmb3IgdGhlIGZvbGxvd2luZyByb3V0aW5lIGV4dGVuZCBwYXN0IGNvbHVtbiA3MiwKKyEqKiogc28gcHJvY2VzcyB0aGlzIGZpbGUgaW4gMTMyLWNvbHVtbiBtb2RlLgorISoqKgorCishZGVjJCBmaXhlZGZvcm1saW5lc2l6ZToxMzIKKworICAgICAgbW9kdWxlIG9tcF9saWJfa2luZHMKKworICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2ludGVnZXJfa2luZCAgICAgICA9IDQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2dpY2FsX2tpbmQgICAgICAgPSA0CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfcmVhbF9raW5kICAgICAgICAgID0gNAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvY2tfa2luZCAgICAgICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbmVzdF9sb2NrX2tpbmQgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9raW5kICAgICAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfcG9pbnRlcl9raW5kICAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9zaXplX3Rfa2luZCAgICAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX2FmZmluaXR5X21hc2tfa2luZCA9IGludF9wdHJfa2luZCgpCisKKyAgICAgIGVuZCBtb2R1bGUgb21wX2xpYl9raW5kcworCisgICAgICBtb2R1bGUgb21wX2xpYgorCisgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21ham9yID0gQExJQk9NUF9WRVJTSU9OX01BSk9SQAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWlub3IgPSBATElCT01QX1ZFUlNJT05fTUlOT1JACisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9idWlsZCA9IEBMSUJPTVBfVkVSU0lPTl9CVUlMREAKKyAgICAgICAgY2hhcmFjdGVyKCopLCBwYXJhbWV0ZXIgOjoga21wX2J1aWxkX2RhdGUgICAgPSAnQExJQk9NUF9CVUlMRF9EQVRFQCcKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IG9wZW5tcF92ZXJzaW9uICAgID0gQExJQk9NUF9PTVBfWUVBUl9NT05USEAKKworICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX3N0YXRpYyAgPSAxCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfZHluYW1pYyA9IDIKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9ndWlkZWQgID0gMworICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2F1dG8gICAgPSA0CisKKyAgICAgICAgaW50ZXJmYWNlCisKKyEgICAgICAgICAqKioKKyEgICAgICAgICAqKiogb21wXyogZW50cnkgcG9pbnRzCishICAgICAgICAgKioqCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMobnRocmVhZHMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBudGhyZWFkcworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljKGVuYWJsZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIGVuYWJsZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZChlbmFibGUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBlbmFibGUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV90aHJlYWRzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9tYXhfdGhyZWFkcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9udW0oKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90aHJlYWRfbnVtCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fcHJvY3MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfaW5fcGFyYWxsZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2R5bmFtaWMoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2dldF9keW5hbWljCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2dldF9uZXN0ZWQKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX2xpbWl0KCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGhyZWFkX2xpbWl0CisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX2xpbWl0CisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMobWF4X2xldmVscykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG1heF9sZXZlbHMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9sZXZlbCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2xldmVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbGV2ZWwKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfYWN0aXZlX2xldmVsKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfYWN0aXZlX2xldmVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfYWN0aXZlX2xldmVsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0obGV2ZWwpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBsZXZlbAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fc2l6ZShsZXZlbCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGxldmVsCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGVhbV9zaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9zaXplCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfc2NoZWR1bGUoa2luZCwgbW9kaWZpZXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfc2NoZWRfa2luZCkga2luZAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBtb2RpZmllcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfc2NoZWR1bGUKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZShraW5kLCBtb2RpZmllcikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9zY2hlZF9raW5kKSBraW5kCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG1vZGlmaWVyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGltZSgpCisgICAgICAgICAgICBkb3VibGUgcHJlY2lzaW9uIG9tcF9nZXRfd3RpbWUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGltZQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGljayAoKQorICAgICAgICAgICAgZG91YmxlIHByZWNpc2lvbiBvbXBfZ2V0X3d0aWNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jayhsb2NrdmFyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9jayhsb2NrdmFyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X2xvY2sKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF90ZXN0X2xvY2sKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jayhsb2NrdmFyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9jayhsb2NrdmFyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF90ZXN0X25lc3RfbG9jaworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrCisKKyEgICAgICAgICAqKioKKyEgICAgICAgICAqKioga21wXyogZW50cnkgcG9pbnRzCishICAgICAgICAgKioqCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplKHNpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBzaXplCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcyhzaXplKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBzaXplCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZShtc2VjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbXNlYworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWwoKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWwKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQoKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0KCkKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkobGlibnVtKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbGlibnVtCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5CisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMoc3RyaW5nKQorICAgICAgICAgICAgY2hhcmFjdGVyKigqKSBzdHJpbmcKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZSgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIGttcF9nZXRfc3RhY2tzaXplX3MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9ibG9ja3RpbWUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeSgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2xpYnJhcnkKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5CisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5KG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfc2V0X2FmZmluaXR5CisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eShtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHkKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzayhtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrKG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHByb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBwcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHByb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX21hbGxvYyhzaXplKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX21hbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX21hbGxvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2NhbGxvYyhuZWxlbSwgZWxzaXplKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX2NhbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIG5lbGVtCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgZWxzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9jYWxsb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9yZWFsbG9jKHB0ciwgc2l6ZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9yZWFsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIHB0cgorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3JlYWxsb2MKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX2ZyZWUocHRyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkgcHRyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2ZyZWUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbigpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbgorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29mZigpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYKKworICAgICAgICBlbmQgaW50ZXJmYWNlCisKKyFkZWMkIGlmIGRlZmluZWQoX1dJTjMyKQorIWRlYyQgICBpZiBkZWZpbmVkKF9XSU42NCkgLm9yLiBkZWZpbmVkKF9NX0FNRDY0KQorCishKioqCishKioqIFRoZSBGb3J0cmFuIGVudHJ5IHBvaW50cyBtdXN0IGJlIGluIHVwcGVyY2FzZSwgZXZlbiBpZiB0aGUgL1Fsb3dlcmNhc2UKKyEqKiogb3B0aW9uIGlzIHNwZWNpZmllZC4gIFRoZSBhbGlhcyBhdHRyaWJ1dGUgZW5zdXJlcyB0aGF0IHRoZSBzcGVjaWZpZWQKKyEqKiogc3RyaW5nIGlzIHVzZWQgYXMgdGhlIGVudHJ5IHBvaW50LgorISoqKgorISoqKiBPbiB0aGUgV2luZG93cyogT1MgSUEtMzIgYXJjaGl0ZWN0dXJlLCB0aGUgRm9ydHJhbiBlbnRyeSBwb2ludHMgaGF2ZSBhbgorISoqKiB1bmRlcnNjb3JlIHByZXBlbmRlZC4gIE9uIHRoZSBXaW5kb3dzKiBPUyBJbnRlbChSKSA2NAorISoqKiBhcmNoaXRlY3R1cmUsIG5vIHVuZGVyc2NvcmUgaXMgcHJlcGVuZGVkLgorISoqKgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX05VTV9USFJFQURTJyA6OiBvbXBfc2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX0RZTkFNSUMnIDo6IG9tcF9zZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9ORVNURUQnIDo6IG9tcF9zZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05VTV9USFJFQURTJyA6OiBvbXBfZ2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX01BWF9USFJFQURTJyA6OiBvbXBfZ2V0X21heF90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1RIUkVBRF9OVU0nIDo6IG9tcF9nZXRfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9OVU1fUFJPQ1MnIDo6IG9tcF9nZXRfbnVtX3Byb2NzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfSU5fUEFSQUxMRUwnIDo6IG9tcF9pbl9wYXJhbGxlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9EWU5BTUlDJyA6OiBvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTkVTVEVEJyA6OiBvbXBfZ2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9USFJFQURfTElNSVQnIDo6IG9tcF9nZXRfdGhyZWFkX2xpbWl0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX01BWF9BQ1RJVkVfTEVWRUxTJyA6OiBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX01BWF9BQ1RJVkVfTEVWRUxTJyA6OiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0xFVkVMJyA6OiBvbXBfZ2V0X2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0FDVElWRV9MRVZFTCcgOjogb21wX2dldF9hY3RpdmVfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfQU5DRVNUT1JfVEhSRUFEX05VTScgOjogb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1RFQU1fU0laRScgOjogb21wX2dldF90ZWFtX3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfU0NIRURVTEUnIDo6IG9tcF9zZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfU0NIRURVTEUnIDo6IG9tcF9nZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfV1RJTUUnIDo6IG9tcF9nZXRfd3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfV1RJQ0snIDo6IG9tcF9nZXRfd3RpY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbG9jaycgOjogb21wX2luaXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2Rlc3Ryb3lfbG9jaycgOjogb21wX2Rlc3Ryb3lfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9sb2NrJyA6OiBvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9sb2NrJyA6OiBvbXBfdW5zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Rlc3RfbG9jaycgOjogb21wX3Rlc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbmVzdF9sb2NrJyA6OiBvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9kZXN0cm95X25lc3RfbG9jaycgOjogb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X25lc3RfbG9jaycgOjogb21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9uZXN0X2xvY2snIDo6IG9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF90ZXN0X25lc3RfbG9jaycgOjogb21wX3Rlc3RfbmVzdF9sb2NrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfU1RBQ0tTSVpFJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfU1RBQ0tTSVpFX1MnOjprbXBfc2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0JMT0NLVElNRSc6OmttcF9zZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUllfU0VSSUFMJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkQnOjprbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVQnOjprbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9MSUJSQVJZJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX1NUQUNLU0laRSc6OmttcF9nZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX1NUQUNLU0laRV9TJzo6a21wX2dldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9CTE9DS1RJTUUnOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9MSUJSQVJZJzo6a21wX2dldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0FGRklOSVRZJzo6a21wX3NldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9BRkZJTklUWSc6OmttcF9nZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfQUZGSU5JVFlfTUFYX1BST0MnOjprbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfQ1JFQVRFX0FGRklOSVRZX01BU0snOjprbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9ERVNUUk9ZX0FGRklOSVRZX01BU0snOjprbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfVU5TRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX01BTExPQyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9DQUxMT0MnOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfUkVBTExPQyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfRlJFRSc6OmttcF9mcmVlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfV0FSTklOR1NfT04nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX1dBUk5JTkdTX09GRic6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyFkZWMkICAgZWxzZQorCishKioqCishKioqIE9uIFdpbmRvd3MqIE9TIElBLTMyIGFyY2hpdGVjdHVyZSwgdGhlIEZvcnRyYW4gZW50cnkgcG9pbnRzIGhhdmUgYW4gdW5kZXJzY29yZSBwcmVwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX05VTV9USFJFQURTJyA6OiBvbXBfc2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9EWU5BTUlDJyA6OiBvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX05FU1RFRCcgOjogb21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX05VTV9USFJFQURTJyA6OiBvbXBfZ2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9NQVhfVEhSRUFEUycgOjogb21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfVEhSRUFEX05VTScgOjogb21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9OVU1fUFJPQ1MnIDo6IG9tcF9nZXRfbnVtX3Byb2NzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0lOX1BBUkFMTEVMJyA6OiBvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0RZTkFNSUMnIDo6IG9tcF9nZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTkVTVEVEJyA6OiBvbXBfZ2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfVEhSRUFEX0xJTUlUJyA6OiBvbXBfZ2V0X3RocmVhZF9saW1pdAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfTUFYX0FDVElWRV9MRVZFTFMnIDo6IG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX01BWF9BQ1RJVkVfTEVWRUxTJyA6OiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9MRVZFTCcgOjogb21wX2dldF9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfQUNUSVZFX0xFVkVMJyA6OiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfQU5DRVNUT1JfVEhSRUFEX05VTScgOjogb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9URUFNX1NJWkUnIDo6IG9tcF9nZXRfdGVhbV9zaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9TQ0hFRFVMRScgOjogb21wX3NldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfU0NIRURVTEUnIDo6IG9tcF9nZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1dUSU1FJyA6OiBvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9XVElDSycgOjogb21wX2dldF93dGljaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luaXRfbG9jaycgOjogb21wX2luaXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9kZXN0cm95X2xvY2snIDo6IG9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X2xvY2snIDo6IG9tcF9zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF91bnNldF9sb2NrJyA6OiBvbXBfdW5zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF90ZXN0X2xvY2snIDo6IG9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9uZXN0X2xvY2snIDo6IG9tcF9pbml0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9kZXN0cm95X25lc3RfbG9jaycgOjogb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9uZXN0X2xvY2snIDo6IG9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X25lc3RfbG9jaycgOjogb21wX3Vuc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF90ZXN0X25lc3RfbG9jaycgOjogb21wX3Rlc3RfbmVzdF9sb2NrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX1NUQUNLU0laRSc6OmttcF9zZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9TVEFDS1NJWkVfUyc6OmttcF9zZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0JMT0NLVElNRSc6OmttcF9zZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9MSUJSQVJZX1NFUklBTCc6OmttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0xJQlJBUllfVFVSTkFST1VORCc6OmttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVQnOjprbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWSc6OmttcF9zZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfU1RBQ0tTSVpFJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX1NUQUNLU0laRV9TJzo6a21wX2dldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfQkxPQ0tUSU1FJzo6a21wX2dldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0xJQlJBUlknOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0FGRklOSVRZJzo6a21wX3NldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfQUZGSU5JVFknOjprbXBfZ2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9BRkZJTklUWV9NQVhfUFJPQyc6OmttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfQ1JFQVRFX0FGRklOSVRZX01BU0snOjprbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfREVTVFJPWV9BRkZJTklUWV9NQVNLJzo6a21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfVU5TRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfTUFMTE9DJzo6a21wX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9DQUxMT0MnOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1JFQUxMT0MnOjprbXBfcmVhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9GUkVFJzo6a21wX2ZyZWUKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfV0FSTklOR1NfT04nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9XQVJOSU5HU19PRkYnOjprbXBfc2V0X3dhcm5pbmdzX29mZgorCishZGVjJCAgIGVuZGlmCishZGVjJCBlbmRpZgorCishZGVjJCBpZiBkZWZpbmVkKF9fbGludXgpCisKKyEqKioKKyEqKiogVGhlIExpbnV4KiBPUyBlbnRyeSBwb2ludHMgYXJlIGluIGxvd2VyY2FzZSwgd2l0aCBhbiB1bmRlcnNjb3JlIGFwcGVuZGVkLgorISoqKgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X251bV90aHJlYWRzXyc6Om9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfZHluYW1pY18nOjpvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbmVzdGVkXyc6Om9tcF9zZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X251bV90aHJlYWRzXyc6Om9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbWF4X3RocmVhZHNfJzo6b21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF90aHJlYWRfbnVtXyc6Om9tcF9nZXRfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9udW1fcHJvY3NfJzo6b21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbl9wYXJhbGxlbF8nOjpvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfZHluYW1pY18nOjpvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbmVzdGVkXyc6Om9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3RocmVhZF9saW1pdF8nOjpvbXBfZ2V0X3RocmVhZF9saW1pdAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9tYXhfYWN0aXZlX2xldmVsc18nOjpvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzXyc6Om9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbGV2ZWxfJzo6b21wX2dldF9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9hY3RpdmVfbGV2ZWxfJzo6b21wX2dldF9hY3RpdmVfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bV8nOjpvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfdGVhbV9zaXplXyc6Om9tcF9nZXRfdGVhbV9zaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X3NjaGVkdWxlXyc6Om9tcF9zZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfc2NoZWR1bGVfJzo6b21wX2dldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF93dGltZV8nOjpvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3d0aWNrXyc6Om9tcF9nZXRfd3RpY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbG9ja18nOjpvbXBfaW5pdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZGVzdHJveV9sb2NrXyc6Om9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbG9ja18nOjpvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9sb2NrXyc6Om9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdGVzdF9sb2NrXyc6Om9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbml0X25lc3RfbG9ja18nOjpvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9kZXN0cm95X25lc3RfbG9ja18nOjpvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbmVzdF9sb2NrXyc6Om9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdW5zZXRfbmVzdF9sb2NrXyc6Om9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF90ZXN0X25lc3RfbG9ja18nOjpvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9zdGFja3NpemVfJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfc3RhY2tzaXplX3NfJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9ibG9ja3RpbWVfJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV9zZXJpYWxfJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0Xyc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2xpYnJhcnlfJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X3N0YWNrc2l6ZV8nOjprbXBfZ2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9zdGFja3NpemVfc18nOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2Jsb2NrdGltZV8nOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9saWJyYXJ5Xyc6OmttcF9nZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9hZmZpbml0eV8nOjprbXBfc2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2FmZmluaXR5Xyc6OmttcF9nZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2NfJzo6a21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrXyc6OmttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza18nOjprbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX21hbGxvY18nOjprbXBfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfY2FsbG9jXyc6OmttcF9jYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9yZWFsbG9jXyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZnJlZV8nOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X3dhcm5pbmdzX29uXyc6OmttcF9zZXRfd2FybmluZ3Nfb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfd2FybmluZ3Nfb2ZmXyc6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyFkZWMkIGVuZGlmCisKKyFkZWMkIGlmIGRlZmluZWQoX19BUFBMRV9fKQorCishKioqCishKioqIFRoZSBNYWMgZW50cnkgcG9pbnRzIGFyZSBpbiBsb3dlcmNhc2UsIHdpdGggYW4gYm90aCBhbiB1bmRlcnNjb3JlCishKioqIGFwcGVuZGVkIGFuZCBhbiB1bmRlcnNjb3JlIHByZXBlbmRlZC4KKyEqKioKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbnVtX3RocmVhZHNfJzo6b21wX3NldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfZHluYW1pY18nOjpvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X25lc3RlZF8nOjpvbXBfc2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbnVtX3RocmVhZHNfJzo6b21wX2dldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbWF4X3RocmVhZHNfJzo6b21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfdGhyZWFkX251bV8nOjpvbXBfZ2V0X3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X251bV9wcm9jc18nOjpvbXBfZ2V0X251bV9wcm9jcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbl9wYXJhbGxlbF8nOjpvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X2R5bmFtaWNfJzo6b21wX2dldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9uZXN0ZWRfJzo6b21wX2dldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3RocmVhZF9saW1pdF8nOjpvbXBfZ2V0X3RocmVhZF9saW1pdAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHNfJzo6b21wX3NldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHNfJzo6b21wX2dldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbGV2ZWxfJzo6b21wX2dldF9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfYWN0aXZlX2xldmVsXyc6Om9tcF9nZXRfYWN0aXZlX2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtXyc6Om9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfdGVhbV9zaXplXyc6Om9tcF9nZXRfdGVhbV9zaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9zY2hlZHVsZV8nOjpvbXBfc2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9zY2hlZHVsZV8nOjpvbXBfZ2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF93dGltZV8nOjpvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF93dGlja18nOjpvbXBfZ2V0X3d0aWNrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9sb2NrXyc6Om9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9sb2NrXyc6Om9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X2xvY2tfJzo6b21wX3NldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X2xvY2tfJzo6b21wX3Vuc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9sb2NrXyc6Om9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9uZXN0X2xvY2tfJzo6b21wX2luaXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2Rlc3Ryb3lfbmVzdF9sb2NrXyc6Om9tcF9kZXN0cm95X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbmVzdF9sb2NrXyc6Om9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X25lc3RfbG9ja18nOjpvbXBfdW5zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Rlc3RfbmVzdF9sb2NrXyc6Om9tcF90ZXN0X25lc3RfbG9jaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9zdGFja3NpemVfJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9zZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2Jsb2NrdGltZV8nOjprbXBfc2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV9zZXJpYWxfJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kXyc6OmttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXRfJzo6a21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2xpYnJhcnlfJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9zdGFja3NpemVfJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9nZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2Jsb2NrdGltZV8nOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfbGlicmFyeV8nOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2FmZmluaXR5Xyc6OmttcF9zZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2FmZmluaXR5Xyc6OmttcF9nZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jXyc6OmttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfJzo6a21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza18nOjprbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9tYWxsb2NfJzo6a21wX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9jYWxsb2NfJzo6a21wX2NhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9yZWFsbG9jXyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2ZyZWVfJzo6a21wX2ZyZWUKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfd2FybmluZ3Nfb25fJzo6a21wX3NldF93YXJuaW5nc19vbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfd2FybmluZ3Nfb2ZmXyc6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyFkZWMkIGVuZGlmCisKKyAgICAgIGVuZCBtb2R1bGUgb21wX2xpYgorCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzMwL29tcF9saWIuZjkwLnZhciBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvMzAvb21wX2xpYi5mOTAudmFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMjU0ODYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzMwL29tcF9saWIuZjkwLnZhcgpAQCAtMCwwICsxLDM1OCBAQAorISBpbmNsdWRlLzMwL29tcF9saWIuZjkwLnZhcgorCishCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEvLworIS8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyEvLworIS8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyEvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyEvLworIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishCisKKyAgICAgIG1vZHVsZSBvbXBfbGliX2tpbmRzCisKKyAgICAgICAgdXNlLCBpbnRyaW5zaWMgOjogaXNvX2NfYmluZGluZworCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfaW50ZWdlcl9raW5kICAgICAgID0gY19pbnQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2dpY2FsX2tpbmQgICAgICAgPSA0CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfcmVhbF9raW5kICAgICAgICAgID0gY19mbG9hdAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX2RvdWJsZV9raW5kICAgICAgICA9IGNfZG91YmxlCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbG9ja19raW5kICAgICAgICAgID0gY19pbnRwdHJfdAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX25lc3RfbG9ja19raW5kICAgICA9IGNfaW50cHRyX3QKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9raW5kICAgICAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfcG9pbnRlcl9raW5kICAgICAgID0gY19pbnRwdHJfdAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3NpemVfdF9raW5kICAgICAgICA9IGNfc2l6ZV90CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfYWZmaW5pdHlfbWFza19raW5kID0gY19pbnRwdHJfdAorCisgICAgICBlbmQgbW9kdWxlIG9tcF9saWJfa2luZHMKKworICAgICAgbW9kdWxlIG9tcF9saWIKKworICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBvcGVubXBfdmVyc2lvbiAgICA9IEBMSUJPTVBfT01QX1lFQVJfTU9OVEhACisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9tYWpvciA9IEBMSUJPTVBfVkVSU0lPTl9NQUpPUkAKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21pbm9yID0gQExJQk9NUF9WRVJTSU9OX01JTk9SQAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fYnVpbGQgPSBATElCT01QX1ZFUlNJT05fQlVJTERACisgICAgICAgIGNoYXJhY3RlcigqKSAgICAgICAgICAgICAgIGttcF9idWlsZF9kYXRlCisgICAgICAgIHBhcmFtZXRlcigga21wX2J1aWxkX2RhdGUgPSAnQExJQk9NUF9CVUlMRF9EQVRFQCcgKQorCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfc3RhdGljICA9IDEKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9keW5hbWljID0gMgorICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2d1aWRlZCAgPSAzCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfYXV0byAgICA9IDQKKworICAgICAgICBpbnRlcmZhY2UKKworISAgICAgICAgICoqKgorISAgICAgICAgICoqKiBvbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgICAqKioKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkcyhudGhyZWFkcykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IG50aHJlYWRzCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkcworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWMoZW5hYmxlKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSwgdmFsdWUgOjogZW5hYmxlCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkKGVuYWJsZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCksIHZhbHVlIDo6IGVuYWJsZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV90aHJlYWRzKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fdGhyZWFkcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV90aHJlYWRzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9tYXhfdGhyZWFkcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9udW0oKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RocmVhZF9udW0KKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV9wcm9jcygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3Byb2NzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfaW5fcGFyYWxsZWwoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfaW5fcGFyYWxsZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfaW5fZmluYWwoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfaW5fZmluYWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2luX2ZpbmFsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2R5bmFtaWMoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X2R5bmFtaWMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9keW5hbWljCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X25lc3RlZCgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfbmVzdGVkCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9saW1pdCgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGhyZWFkX2xpbWl0CisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX2xpbWl0CisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMobWF4X2xldmVscykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IG1heF9sZXZlbHMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2xldmVsKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgOjogb21wX2dldF9sZXZlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2xldmVsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbCgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIDo6IG9tcF9nZXRfYWN0aXZlX2xldmVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfYWN0aXZlX2xldmVsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0obGV2ZWwpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbGV2ZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fc2l6ZShsZXZlbCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90ZWFtX3NpemUKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGxldmVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9zaXplCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfc2NoZWR1bGUoa2luZCwgbW9kaWZpZXIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9zY2hlZF9raW5kKSwgdmFsdWUgOjoga2luZAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbW9kaWZpZXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X3NjaGVkdWxlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9nZXRfc2NoZWR1bGUoa2luZCwgbW9kaWZpZXIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9zY2hlZF9raW5kKSAgIDo6IGtpbmQKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgOjogbW9kaWZpZXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZ2V0X3NjaGVkdWxlCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3d0aW1lKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIHJlYWwgKGtpbmQ9a21wX2RvdWJsZV9raW5kKSBvbXBfZ2V0X3d0aW1lCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfd3RpbWUKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2soKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgcmVhbCAoa2luZD1rbXBfZG91YmxlX2tpbmQpIG9tcF9nZXRfd3RpY2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGljaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2sobG9ja3ZhcikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3Vuc2V0X2xvY2sobG9ja3ZhcikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF90ZXN0X2xvY2sKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X25lc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfdGVzdF9uZXN0X2xvY2sKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9jaworCishICAgICAgICAgKioqCishICAgICAgICAgKioqIGttcF8qIGVudHJ5IHBvaW50cworISAgICAgICAgICoqKgorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZShzaXplKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3Moc2l6ZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3MKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9ibG9ja3RpbWUobXNlYykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IG1zZWMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsKCkgYmluZChjKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWwKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQoKSBiaW5kKGMpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQoKSBiaW5kKGMpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5KGxpYm51bSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGxpYm51bQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzKHN0cmluZykgYmluZChjKQorICAgICAgICAgICAgdXNlLCBpbnRyaW5zaWMgOjogaXNvX2NfYmluZGluZworICAgICAgICAgICAgY2hhcmFjdGVyIChraW5kPWNfY2hhcikgOjogc3RyaW5nKCopCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9kZWZhdWx0cworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkga21wX2dldF9zdGFja3NpemVfcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYmxvY2t0aW1lCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2xpYnJhcnkKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5CisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5KG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9zZXRfYWZmaW5pdHkKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5CisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5KG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHkKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5CisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzayhtYXNrKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sobWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBwcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBwcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9tYWxsb2Moc2l6ZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX21hbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9tYWxsb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9jYWxsb2MobmVsZW0sIGVsc2l6ZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX2NhbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBuZWxlbQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBlbHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2NhbGxvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3JlYWxsb2MocHRyLCBzaXplKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfcmVhbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSwgdmFsdWUgOjogcHRyCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3JlYWxsb2MKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX2ZyZWUocHRyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSwgdmFsdWUgOjogcHRyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2ZyZWUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbigpIGJpbmQoYykKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29uCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmKCkgYmluZChjKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyAgICAgICAgZW5kIGludGVyZmFjZQorCisgICAgICBlbmQgbW9kdWxlIG9tcF9saWIKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvMzAvb21wX2xpYi5oLnZhciBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvMzAvb21wX2xpYi5oLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGVkMzliCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS8zMC9vbXBfbGliLmgudmFyCkBAIC0wLDAgKzEsNjM4IEBACishIGluY2x1ZGUvMzAvb21wX2xpYi5oLnZhcgorCishCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEvLworIS8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyEvLworIS8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyEvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyEvLworIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishCisKKyEqKioKKyEqKiogU29tZSBvZiB0aGUgZGlyZWN0aXZlcyBmb3IgdGhlIGZvbGxvd2luZyByb3V0aW5lIGV4dGVuZCBwYXN0IGNvbHVtbiA3MiwKKyEqKiogc28gcHJvY2VzcyB0aGlzIGZpbGUgaW4gMTMyLWNvbHVtbiBtb2RlLgorISoqKgorCishZGVjJCBmaXhlZGZvcm1saW5lc2l6ZToxMzIKKworICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9pbnRlZ2VyX2tpbmQgICAgICAgPSA0CisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvZ2ljYWxfa2luZCAgICAgICA9IDQKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfcmVhbF9raW5kICAgICAgICAgID0gNAorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2tpbmQgICAgICAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9uZXN0X2xvY2tfa2luZCAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9raW5kICAgICAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3BvaW50ZXJfa2luZCAgICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3NpemVfdF9raW5kICAgICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX2FmZmluaXR5X21hc2tfa2luZCA9IGludF9wdHJfa2luZCgpCisKKyAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfc3RhdGljICA9IDEKKyAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfZHluYW1pYyA9IDIKKyAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfZ3VpZGVkICA9IDMKKyAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfYXV0byAgICA9IDQKKworICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21ham9yID0gQExJQk9NUF9WRVJTSU9OX01BSk9SQAorICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21pbm9yID0gQExJQk9NUF9WRVJTSU9OX01JTk9SQAorICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX2J1aWxkID0gQExJQk9NUF9WRVJTSU9OX0JVSUxEQAorICAgICAgY2hhcmFjdGVyKCopICAgICAgICAgICAgICAga21wX2J1aWxkX2RhdGUKKyAgICAgIHBhcmFtZXRlcigga21wX2J1aWxkX2RhdGUgPSAnQExJQk9NUF9CVUlMRF9EQVRFQCcgKQorICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IG9wZW5tcF92ZXJzaW9uICAgID0gQExJQk9NUF9PTVBfWUVBUl9NT05USEAKKworICAgICAgaW50ZXJmYWNlCisKKyEgICAgICAgKioqCishICAgICAgICoqKiBvbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgKioqCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzKG50aHJlYWRzKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbnRocmVhZHMKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkcworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljKGVuYWJsZSkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIGVuYWJsZQorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWMKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkKGVuYWJsZSkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIGVuYWJsZQorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMoKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fdGhyZWFkcworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMoKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9tYXhfdGhyZWFkcworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkcworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bSgpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RocmVhZF9udW0KKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bQorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzKCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3Byb2NzCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV9wcm9jcworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbCgpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfaW5fcGFyYWxsZWwKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9pbl9maW5hbCgpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfaW5fZmluYWwKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9pbl9maW5hbAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYygpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X2R5bmFtaWMKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkKCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfbmVzdGVkCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X25lc3RlZAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX2xpbWl0KCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGhyZWFkX2xpbWl0CisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9saW1pdAorCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscyhtYXhfbGV2ZWxzKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbWF4X2xldmVscworICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfYWN0aXZlX2xldmVscygpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9sZXZlbCgpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2xldmVsCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2xldmVsCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9hY3RpdmVfbGV2ZWwoKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9hY3RpdmVfbGV2ZWwKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfYWN0aXZlX2xldmVsCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtKGxldmVsKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbGV2ZWwKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF90ZWFtX3NpemUobGV2ZWwpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBsZXZlbAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90ZWFtX3NpemUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9zaXplCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X3NjaGVkdWxlKGtpbmQsIG1vZGlmaWVyKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3NjaGVkX2tpbmQpIGtpbmQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG1vZGlmaWVyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfc2NoZWR1bGUKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9nZXRfc2NoZWR1bGUoa2luZCwgbW9kaWZpZXIpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfc2NoZWRfa2luZCkga2luZAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbW9kaWZpZXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZQorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfd3RpbWUoKQorICAgICAgICAgIGRvdWJsZSBwcmVjaXNpb24gb21wX2dldF93dGltZQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGltZQorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2sgKCkKKyAgICAgICAgICBkb3VibGUgcHJlY2lzaW9uIG9tcF9nZXRfd3RpY2sKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9jayhsb2NrdmFyKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9jayhsb2NrdmFyKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9jaworCisgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF90ZXN0X2xvY2sKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jayhsb2NrdmFyKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X25lc3RfbG9jayhsb2NrdmFyKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X25lc3RfbG9jaworCisgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9jayhsb2NrdmFyKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX3Rlc3RfbmVzdF9sb2NrCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9jaworCishICAgICAgICoqKgorISAgICAgICAqKioga21wXyogZW50cnkgcG9pbnRzCishICAgICAgICoqKgorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUoc2l6ZSkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHNpemUKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3Moc2l6ZSkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgc2l6ZQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZShtc2VjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbXNlYworICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZQorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbCgpCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWwKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kKCkKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0KCkKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeShsaWJudW0pCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBsaWJudW0KKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5CisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzKHN0cmluZykKKyAgICAgICAgICBjaGFyYWN0ZXIqKCopIHN0cmluZworICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUoKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9zdGFja3NpemUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcygpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIGttcF9nZXRfc3RhY2tzaXplX3MKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3MKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZSgpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2Jsb2NrdGltZQorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkoKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9saWJyYXJ5CisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkKKworICAgICAgICBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5KG1hc2spCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfc2V0X2FmZmluaXR5CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5CisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eShtYXNrKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eQorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eQorCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MoKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworCisgICAgICAgIHN1YnJvdXRpbmUga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrKG1hc2spCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworCisgICAgICAgIHN1YnJvdXRpbmUga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzayhtYXNrKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCisKKyAgICAgICAgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBwcm9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgIGZ1bmN0aW9uIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHByb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHByb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgZnVuY3Rpb24ga21wX21hbGxvYyhzaXplKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX21hbGxvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBzaXplCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfbWFsbG9jCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2NhbGxvYyhuZWxlbSwgZWxzaXplKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX2NhbGxvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBuZWxlbQorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBlbHNpemUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9jYWxsb2MKKworICAgICAgICBmdW5jdGlvbiBrbXBfcmVhbGxvYyhwdHIsIHNpemUpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfcmVhbGxvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkgcHRyCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIHNpemUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9yZWFsbG9jCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfZnJlZShwdHIpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBwdHIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2ZyZWUKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24oKQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29uCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29mZigpCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyAgICAgIGVuZCBpbnRlcmZhY2UKKworIWRlYyQgaWYgZGVmaW5lZChfV0lOMzIpCishZGVjJCAgIGlmIGRlZmluZWQoX1dJTjY0KSAub3IuIGRlZmluZWQoX01fQU1ENjQpCisKKyEqKioKKyEqKiogVGhlIEZvcnRyYW4gZW50cnkgcG9pbnRzIG11c3QgYmUgaW4gdXBwZXJjYXNlLCBldmVuIGlmIHRoZSAvUWxvd2VyY2FzZQorISoqKiBvcHRpb24gaXMgc3BlY2lmaWVkLiAgVGhlIGFsaWFzIGF0dHJpYnV0ZSBlbnN1cmVzIHRoYXQgdGhlIHNwZWNpZmllZAorISoqKiBzdHJpbmcgaXMgdXNlZCBhcyB0aGUgZW50cnkgcG9pbnQuCishKioqCishKioqIE9uIHRoZSBXaW5kb3dzKiBPUyBJQS0zMiBhcmNoaXRlY3R1cmUsIHRoZSBGb3J0cmFuIGVudHJ5IHBvaW50cyBoYXZlIGFuCishKioqIHVuZGVyc2NvcmUgcHJlcGVuZGVkLiAgT24gdGhlIFdpbmRvd3MqIE9TIEludGVsKFIpIDY0CishKioqIGFyY2hpdGVjdHVyZSwgbm8gdW5kZXJzY29yZSBpcyBwcmVwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfTlVNX1RIUkVBRFMnOjpvbXBfc2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX0RZTkFNSUMnOjpvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfTkVTVEVEJzo6b21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTlVNX1RIUkVBRFMnOjpvbXBfZ2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX01BWF9USFJFQURTJzo6b21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9USFJFQURfTlVNJzo6b21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05VTV9QUk9DUyc6Om9tcF9nZXRfbnVtX3Byb2NzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfSU5fUEFSQUxMRUwnOjpvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9JTl9GSU5BTCc6Om9tcF9pbl9maW5hbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9EWU5BTUlDJzo6b21wX2dldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05FU1RFRCc6Om9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1RIUkVBRF9MSU1JVCc6Om9tcF9nZXRfdGhyZWFkX2xpbWl0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX01BWF9BQ1RJVkVfTEVWRUxTJzo6b21wX3NldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9NQVhfQUNUSVZFX0xFVkVMUyc6Om9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTEVWRUwnOjpvbXBfZ2V0X2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0FDVElWRV9MRVZFTCc6Om9tcF9nZXRfYWN0aXZlX2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0FOQ0VTVE9SX1RIUkVBRF9OVU0nOjpvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfVEVBTV9TSVpFJzo6b21wX2dldF90ZWFtX3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfU0NIRURVTEUnOjpvbXBfc2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1NDSEVEVUxFJzo6b21wX2dldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9XVElNRSc6Om9tcF9nZXRfd3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfV1RJQ0snOjpvbXBfZ2V0X3d0aWNrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbml0X2xvY2snOjpvbXBfaW5pdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZGVzdHJveV9sb2NrJzo6b21wX2Rlc3Ryb3lfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9sb2NrJzo6b21wX3NldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdW5zZXRfbG9jayc6Om9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdGVzdF9sb2NrJzo6b21wX3Rlc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbmVzdF9sb2NrJzo6b21wX2luaXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZGVzdHJveV9uZXN0X2xvY2snOjpvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbmVzdF9sb2NrJzo6b21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9uZXN0X2xvY2snOjpvbXBfdW5zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdGVzdF9uZXN0X2xvY2snOjpvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9TVEFDS1NJWkUnOjprbXBfc2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9TVEFDS1NJWkVfUyc6OmttcF9zZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfQkxPQ0tUSU1FJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfTElCUkFSWV9TRVJJQUwnOjprbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUllfVFVSTkFST1VORCc6OmttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUllfVEhST1VHSFBVVCc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUlknOjprbXBfc2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfREVGQVVMVFMnOjprbXBfc2V0X2RlZmF1bHRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX1NUQUNLU0laRSc6OmttcF9nZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX1NUQUNLU0laRV9TJzo6a21wX2dldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9CTE9DS1RJTUUnOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9MSUJSQVJZJzo6a21wX2dldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0FGRklOSVRZJzo6a21wX3NldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9BRkZJTklUWSc6OmttcF9nZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfQUZGSU5JVFlfTUFYX1BST0MnOjprbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfQ1JFQVRFX0FGRklOSVRZX01BU0snOjprbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9ERVNUUk9ZX0FGRklOSVRZX01BU0snOjprbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfVU5TRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX01BTExPQyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9DQUxMT0MnOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfUkVBTExPQyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfRlJFRSc6OmttcF9mcmVlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfV0FSTklOR1NfT04nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX1dBUk5JTkdTX09GRic6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyFkZWMkICAgZWxzZQorCishKioqCishKioqIE9uIFdpbmRvd3MqIE9TIElBLTMyIGFyY2hpdGVjdHVyZSwgdGhlIEZvcnRyYW4gZW50cnkgcG9pbnRzIGhhdmUgYW4gdW5kZXJzY29yZSBwcmVwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX05VTV9USFJFQURTJzo6b21wX3NldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfRFlOQU1JQyc6Om9tcF9zZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfTkVTVEVEJzo6b21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX05VTV9USFJFQURTJzo6b21wX2dldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTUFYX1RIUkVBRFMnOjpvbXBfZ2V0X21heF90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9USFJFQURfTlVNJzo6b21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9OVU1fUFJPQ1MnOjpvbXBfZ2V0X251bV9wcm9jcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9JTl9QQVJBTExFTCc6Om9tcF9pbl9wYXJhbGxlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9JTl9GSU5BTCc6Om9tcF9pbl9maW5hbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfRFlOQU1JQyc6Om9tcF9nZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTkVTVEVEJzo6b21wX2dldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1RIUkVBRF9MSU1JVCc6Om9tcF9nZXRfdGhyZWFkX2xpbWl0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9NQVhfQUNUSVZFX0xFVkVMUyc6Om9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX01BWF9BQ1RJVkVfTEVWRUxTJzo6b21wX2dldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTEVWRUwnOjpvbXBfZ2V0X2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9BQ1RJVkVfTEVWRUwnOjpvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfQU5DRVNUT1JfVEhSRUFEX05VTSc6Om9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfVEVBTV9TSVpFJzo6b21wX2dldF90ZWFtX3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX1NDSEVEVUxFJzo6b21wX3NldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfU0NIRURVTEUnOjpvbXBfZ2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9XVElNRSc6Om9tcF9nZXRfd3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1dUSUNLJzo6b21wX2dldF93dGljaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luaXRfbG9jayc6Om9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9sb2NrJzo6b21wX2Rlc3Ryb3lfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbG9jayc6Om9tcF9zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF91bnNldF9sb2NrJzo6b21wX3Vuc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9sb2NrJzo6b21wX3Rlc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X25lc3RfbG9jayc6Om9tcF9pbml0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9kZXN0cm95X25lc3RfbG9jayc6Om9tcF9kZXN0cm95X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbmVzdF9sb2NrJzo6b21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdW5zZXRfbmVzdF9sb2NrJzo6b21wX3Vuc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF90ZXN0X25lc3RfbG9jayc6Om9tcF90ZXN0X25lc3RfbG9jaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9TVEFDS1NJWkUnOjprbXBfc2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfU1RBQ0tTSVpFX1MnOjprbXBfc2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9CTE9DS1RJTUUnOjprbXBfc2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWV9TRVJJQUwnOjprbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkQnOjprbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWV9USFJPVUdIUFVUJzo6a21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0xJQlJBUlknOjprbXBfc2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0RFRkFVTFRTJzo6a21wX3NldF9kZWZhdWx0cworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfU1RBQ0tTSVpFJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX1NUQUNLU0laRV9TJzo6a21wX2dldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfQkxPQ0tUSU1FJzo6a21wX2dldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0xJQlJBUlknOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0FGRklOSVRZJzo6a21wX3NldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfQUZGSU5JVFknOjprbXBfZ2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9BRkZJTklUWV9NQVhfUFJPQyc6OmttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfQ1JFQVRFX0FGRklOSVRZX01BU0snOjprbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfREVTVFJPWV9BRkZJTklUWV9NQVNLJzo6a21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfVU5TRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfTUFMTE9DJzo6a21wX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9DQUxMT0MnOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1JFQUxMT0MnOjprbXBfcmVhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9GUkVFJzo6a21wX2ZyZWUKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfV0FSTklOR1NfT04nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9XQVJOSU5HU19PRkYnOjprbXBfc2V0X3dhcm5pbmdzX29mZgorCishZGVjJCAgIGVuZGlmCishZGVjJCBlbmRpZgorCishZGVjJCBpZiBkZWZpbmVkKF9fbGludXgpCisKKyEqKioKKyEqKiogVGhlIExpbnV4KiBPUyBlbnRyeSBwb2ludHMgYXJlIGluIGxvd2VyY2FzZSwgd2l0aCBhbiB1bmRlcnNjb3JlIGFwcGVuZGVkLgorISoqKgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X251bV90aHJlYWRzXyc6Om9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfZHluYW1pY18nOjpvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbmVzdGVkXyc6Om9tcF9zZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X251bV90aHJlYWRzXyc6Om9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbWF4X3RocmVhZHNfJzo6b21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF90aHJlYWRfbnVtXyc6Om9tcF9nZXRfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9udW1fcHJvY3NfJzo6b21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbl9wYXJhbGxlbF8nOjpvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbl9maW5hbF8nOjpvbXBfaW5fZmluYWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfZHluYW1pY18nOjpvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbmVzdGVkXyc6Om9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3RocmVhZF9saW1pdF8nOjpvbXBfZ2V0X3RocmVhZF9saW1pdAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9tYXhfYWN0aXZlX2xldmVsc18nOjpvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzXyc6Om9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbGV2ZWxfJzo6b21wX2dldF9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9hY3RpdmVfbGV2ZWxfJzo6b21wX2dldF9hY3RpdmVfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bV8nOjpvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfdGVhbV9zaXplXyc6Om9tcF9nZXRfdGVhbV9zaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X3NjaGVkdWxlXyc6Om9tcF9zZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfc2NoZWR1bGVfJzo6b21wX2dldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF93dGltZV8nOjpvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3d0aWNrXyc6Om9tcF9nZXRfd3RpY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbG9ja18nOjpvbXBfaW5pdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZGVzdHJveV9sb2NrXyc6Om9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbG9ja18nOjpvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9sb2NrXyc6Om9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdGVzdF9sb2NrXyc6Om9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbml0X25lc3RfbG9ja18nOjpvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9kZXN0cm95X25lc3RfbG9ja18nOjpvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbmVzdF9sb2NrXyc6Om9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdW5zZXRfbmVzdF9sb2NrXyc6Om9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF90ZXN0X25lc3RfbG9ja18nOjpvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9zdGFja3NpemVfJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfc3RhY2tzaXplX3NfJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9ibG9ja3RpbWVfJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV9zZXJpYWxfJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0Xyc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2xpYnJhcnlfJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2RlZmF1bHRzXyc6OmttcF9zZXRfZGVmYXVsdHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfc3RhY2tzaXplXyc6OmttcF9nZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9nZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfYmxvY2t0aW1lXyc6OmttcF9nZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2xpYnJhcnlfJzo6a21wX2dldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2FmZmluaXR5Xyc6OmttcF9zZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfYWZmaW5pdHlfJzo6a21wX2dldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9hZmZpbml0eV9tYXhfcHJvY18nOjprbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfJzo6a21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrXyc6OmttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfbWFsbG9jXyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9jYWxsb2NfJzo6a21wX2NhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3JlYWxsb2NfJzo6a21wX3JlYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9mcmVlXyc6OmttcF9mcmVlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfd2FybmluZ3Nfb25fJzo6a21wX3NldF93YXJuaW5nc19vbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF93YXJuaW5nc19vZmZfJzo6a21wX3NldF93YXJuaW5nc19vZmYKKworIWRlYyQgZW5kaWYKKworIWRlYyQgaWYgZGVmaW5lZChfX0FQUExFX18pCisKKyEqKioKKyEqKiogVGhlIE1hYyBlbnRyeSBwb2ludHMgYXJlIGluIGxvd2VyY2FzZSwgd2l0aCBhbiBib3RoIGFuIHVuZGVyc2NvcmUKKyEqKiogYXBwZW5kZWQgYW5kIGFuIHVuZGVyc2NvcmUgcHJlcGVuZGVkLgorISoqKgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9udW1fdGhyZWFkc18nOjpvbXBfc2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9keW5hbWljXyc6Om9tcF9zZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbmVzdGVkXyc6Om9tcF9zZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9udW1fdGhyZWFkc18nOjpvbXBfZ2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9tYXhfdGhyZWFkc18nOjpvbXBfZ2V0X21heF90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF90aHJlYWRfbnVtXyc6Om9tcF9nZXRfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbnVtX3Byb2NzXyc6Om9tcF9nZXRfbnVtX3Byb2NzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luX3BhcmFsbGVsXyc6Om9tcF9pbl9wYXJhbGxlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbl9maW5hbF8nOjpvbXBfaW5fZmluYWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X2R5bmFtaWNfJzo6b21wX2dldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9uZXN0ZWRfJzo6b21wX2dldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3RocmVhZF9saW1pdF8nOjpvbXBfZ2V0X3RocmVhZF9saW1pdAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHNfJzo6b21wX3NldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHNfJzo6b21wX2dldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbGV2ZWxfJzo6b21wX2dldF9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfYWN0aXZlX2xldmVsXyc6Om9tcF9nZXRfYWN0aXZlX2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtXyc6Om9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfdGVhbV9zaXplXyc6Om9tcF9nZXRfdGVhbV9zaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9zY2hlZHVsZV8nOjpvbXBfc2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9zY2hlZHVsZV8nOjpvbXBfZ2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF93dGltZV8nOjpvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF93dGlja18nOjpvbXBfZ2V0X3d0aWNrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9sb2NrXyc6Om9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9sb2NrXyc6Om9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X2xvY2tfJzo6b21wX3NldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X2xvY2tfJzo6b21wX3Vuc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9sb2NrXyc6Om9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9uZXN0X2xvY2tfJzo6b21wX2luaXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2Rlc3Ryb3lfbmVzdF9sb2NrXyc6Om9tcF9kZXN0cm95X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbmVzdF9sb2NrXyc6Om9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X25lc3RfbG9ja18nOjpvbXBfdW5zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Rlc3RfbmVzdF9sb2NrXyc6Om9tcF90ZXN0X25lc3RfbG9jaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9zdGFja3NpemVfJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9zZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2Jsb2NrdGltZV8nOjprbXBfc2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV9zZXJpYWxfJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kXyc6OmttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXRfJzo6a21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2xpYnJhcnlfJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9kZWZhdWx0c18nOjprbXBfc2V0X2RlZmF1bHRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9zdGFja3NpemVfJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9nZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2Jsb2NrdGltZV8nOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfbGlicmFyeV8nOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2FmZmluaXR5Xyc6OmttcF9zZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2FmZmluaXR5Xyc6OmttcF9nZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jXyc6OmttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfJzo6a21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza18nOjprbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9tYWxsb2NfJzo6a21wX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9jYWxsb2NfJzo6a21wX2NhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9yZWFsbG9jXyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2ZyZWVfJzo6a21wX2ZyZWUKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfd2FybmluZ3Nfb25fJzo6a21wX3NldF93YXJuaW5nc19vbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfd2FybmluZ3Nfb2ZmXyc6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyFkZWMkIGVuZGlmCisKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS8zMC9vbXB0LmgudmFyIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS8zMC9vbXB0LmgudmFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzYjRmMWUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzMwL29tcHQuaC52YXIKQEAgLTAsMCArMSw0ODcgQEAKKy8qCisgKiBpbmNsdWRlLzMwL29tcHQuaC52YXIKKyAqLworCisjaWZuZGVmIF9fT01QVF9fCisjZGVmaW5lIF9fT01QVF9fCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogc3lzdGVtIGluY2x1ZGUgZmlsZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBpdGVyYXRpb24gbWFjcm9zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgRk9SRUFDSF9PTVBUX0lOUVVJUllfRk4obWFjcm8pICBcCisgICAgbWFjcm8gKG9tcHRfZW51bWVyYXRlX3N0YXRlKSAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zZXRfY2FsbGJhY2spICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZ2V0X2NhbGxiYWNrKSAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9nZXRfaWRsZV9mcmFtZSkgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZ2V0X3Rhc2tfZnJhbWUpICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9nZXRfc3RhdGUpICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2dldF9wYXJhbGxlbF9pZCkgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9nZXRfcGFyYWxsZWxfdGVhbV9zaXplKSBcCisgICAgbWFjcm8gKG9tcHRfZ2V0X3Rhc2tfaWQpICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2dldF90aHJlYWRfaWQpCisKKyNkZWZpbmUgRk9SRUFDSF9PTVBUX1BMQUNFSE9MREVSX0ZOKG1hY3JvKSAgXAorICAgIG1hY3JvIChvbXB0X2lkbGUpICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfb3ZlcmhlYWQpICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9iYXJyaWVyX3dhaXQpICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3Rhc2tfd2FpdCkgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfbXV0ZXhfd2FpdCkKKworI2RlZmluZSBGT1JFQUNIX09NUFRfU1RBVEUobWFjcm8pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIGZpcnN0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX2ZpcnN0LCAweDcxKSAgICAgICAgICAvKiBpbml0aWFsIGVudW1lcmF0aW9uIHN0YXRlICovICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIHdvcmsgc3RhdGVzICgwLi4xNSkgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dvcmtfc2VyaWFsLCAweDAwKSAgICAvKiB3b3JraW5nIG91dHNpZGUgcGFyYWxsZWwgKi8gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dvcmtfcGFyYWxsZWwsIDB4MDEpICAvKiB3b3JraW5nIHdpdGhpbiBwYXJhbGxlbCAqLyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dvcmtfcmVkdWN0aW9uLCAweDAyKSAvKiBwZXJmb3JtaW5nIGEgcmVkdWN0aW9uICovICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIGlkbGUgKDE2Li4zMSkgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX2lkbGUsIDB4MTApICAgICAgICAgICAgLyogd2FpdGluZyBmb3Igd29yayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIG92ZXJoZWFkIHN0YXRlcyAoMzIuLjYzKSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX292ZXJoZWFkLCAweDIwKSAgICAgICAgLyogb3ZlcmhlYWQgZXhjbHVkaW5nIHdhaXQgc3RhdGVzICovICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIGJhcnJpZXIgd2FpdCBzdGF0ZXMgKDY0Li43OSkgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfYmFycmllciwgMHg0MCkgICAgLyogd2FpdGluZyBhdCBhIGJhcnJpZXIgKi8gICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfYmFycmllcl9pbXBsaWNpdCwgMHg0MSkgICAgLyogaW1wbGljaXQgYmFycmllciAqLyAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfYmFycmllcl9leHBsaWNpdCwgMHg0MikgICAgLyogZXhwbGljaXQgYmFycmllciAqLyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIHRhc2sgd2FpdCBzdGF0ZXMgKDgwLi45NSkgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfdGFza3dhaXQsIDB4NTApICAgLyogd2FpdGluZyBhdCBhIHRhc2t3YWl0ICovICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfdGFza2dyb3VwLCAweDUxKSAgLyogd2FpdGluZyBhdCBhIHRhc2tncm91cCAqLyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIG11dGV4IHdhaXQgc3RhdGVzICg5Ni4uMTExKSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfbG9jaywgMHg2MCkgICAgICAgLyogd2FpdGluZyBmb3IgbG9jayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfbmVzdF9sb2NrLCAweDYxKSAgLyogd2FpdGluZyBmb3IgbmVzdCBsb2NrICovICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfY3JpdGljYWwsIDB4NjIpICAgLyogd2FpdGluZyBmb3IgY3JpdGljYWwgKi8gICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfYXRvbWljLCAweDYzKSAgICAgLyogd2FpdGluZyBmb3IgYXRvbWljICovICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfb3JkZXJlZCwgMHg2NCkgICAgLyogd2FpdGluZyBmb3Igb3JkZXJlZCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfc2luZ2xlLCAweDZGKSAgICAgLyogd2FpdGluZyBmb3Igc2luZ2xlIHJlZ2lvbiAobm9uLXN0YW5kYXJkISkgKi8gICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIG1pc2MgKDExMi4uMTI3KSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3VuZGVmaW5lZCwgMHg3MCkgICAgICAgLyogdW5kZWZpbmVkIHRocmVhZCBzdGF0ZSAqLworCisKKyNkZWZpbmUgRk9SRUFDSF9PTVBUX0VWRU5UKG1hY3JvKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qLS0tIE1hbmRhdG9yeSBFdmVudHMgLS0tKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9wYXJhbGxlbF9iZWdpbiwgICAgICAgICAgIG9tcHRfbmV3X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgMSkgLyogcGFyYWxsZWwgYmVnaW4gKi8gICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kLCAgICAgICAgICAgICBvbXB0X2VuZF9wYXJhbGxlbF9jYWxsYmFja190LCAgIDIpIC8qIHBhcmFsbGVsIGVuZCAqLyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF90YXNrX2JlZ2luLCAgICAgICAgICAgICAgIG9tcHRfbmV3X3Rhc2tfY2FsbGJhY2tfdCwgICAgICAgMykgLyogdGFzayBiZWdpbiAqLyAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGFza19lbmQsICAgICAgICAgICAgICAgICBvbXB0X3Rhc2tfY2FsbGJhY2tfdCwgICAgICAgICAgIDQpIC8qIHRhc2sgZGVzdHJveSAqLyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF90aHJlYWRfYmVnaW4sICAgICAgICAgICAgIG9tcHRfdGhyZWFkX3R5cGVfY2FsbGJhY2tfdCwgICAgNSkgLyogdGhyZWFkIGJlZ2luICovICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGhyZWFkX2VuZCwgICAgICAgICAgICAgICBvbXB0X3RocmVhZF90eXBlX2NhbGxiYWNrX3QsICAgIDYpIC8qIHRocmVhZCBlbmQgKi8gICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9jb250cm9sLCAgICAgICAgICAgICAgICAgIG9tcHRfY29udHJvbF9jYWxsYmFja190LCAgICAgICAgNykgLyogc3VwcG9ydCBjb250cm9sIGNhbGxzICovICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3J1bnRpbWVfc2h1dGRvd24sICAgICAgICAgb21wdF9jYWxsYmFja190LCAgICAgICAgICAgICAgICA4KSAvKiBydW50aW1lIHNodXRkb3duICovICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyotLS0gT3B0aW9uYWwgRXZlbnRzIChibGFtZSBzaGlmdGluZywgb21wdF9ldmVudF91bmltcGxlbWVudGVkKSAtLS0qLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2lkbGVfYmVnaW4sICAgICAgICAgICAgICAgb21wdF90aHJlYWRfY2FsbGJhY2tfdCwgICAgICAgICA5KSAvKiBiZWdpbiBpZGxlIHN0YXRlICovICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pZGxlX2VuZCwgICAgICAgICAgICAgICAgIG9tcHRfdGhyZWFkX2NhbGxiYWNrX3QsICAgICAgICAxMCkgLyogZW5kIGlkbGUgc3RhdGUgKi8gICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfYmFycmllcl9iZWdpbiwgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDExKSAvKiBiZWdpbiB3YWl0IGF0IGJhcnJpZXIgKi8gIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X2JhcnJpZXJfZW5kLCAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAxMikgLyogZW5kIHdhaXQgYXQgYmFycmllciAqLyAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfdGFza3dhaXRfYmVnaW4sICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDEzKSAvKiBiZWdpbiB3YWl0IGF0IHRhc2t3YWl0ICovIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X3Rhc2t3YWl0X2VuZCwgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAxNCkgLyogZW5kIHdhaXQgYXQgdGFza3dhaXQgKi8gICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfdGFza2dyb3VwX2JlZ2luLCAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDE1KSAvKiBiZWdpbiB3YWl0IGF0IHRhc2tncm91cCAqL1wKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X3Rhc2tncm91cF9lbmQsICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAxNikgLyogZW5kIHdhaXQgYXQgdGFza2dyb3VwICovICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3JlbGVhc2VfbG9jaywgICAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDE3KSAvKiBsb2NrIHJlbGVhc2UgKi8gICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9yZWxlYXNlX25lc3RfbG9ja19sYXN0LCAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICAxOCkgLyogbGFzdCBuZXN0IGxvY2sgcmVsZWFzZSAqLyBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfcmVsZWFzZV9jcml0aWNhbCwgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgMTkpIC8qIGNyaXRpY2FsIHJlbGVhc2UgKi8gICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9yZWxlYXNlX2F0b21pYywgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICAyMCkgLyogYXRvbWljIHJlbGVhc2UgKi8gICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3JlbGVhc2Vfb3JkZXJlZCwgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDIxKSAvKiBvcmRlcmVkIHJlbGVhc2UgKi8gICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyotLS0gT3B0aW9uYWwgRXZlbnRzIChzeW5jaHJvbm91cyBldmVudHMsIG9tcHRfZXZlbnRfdW5pbXBsZW1lbnRlZCkgLS0tICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW4sICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDIyKSAvKiBpbXBsaWNpdCB0YXNrIGJlZ2luICAgKi8gIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZCwgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAyMykgLyogaW1wbGljaXQgdGFzayBlbmQgICovICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2luaXRpYWxfdGFza19iZWdpbiwgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDI0KSAvKiBpbml0aWFsIHRhc2sgYmVnaW4gICAqLyAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pbml0aWFsX3Rhc2tfZW5kLCAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAyNSkgLyogaW5pdGlhbCB0YXNrIGVuZCAgKi8gICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3Rhc2tfc3dpdGNoLCAgICAgICAgICAgICAgb21wdF90YXNrX3BhaXJfY2FsbGJhY2tfdCwgICAgIDI2KSAvKiB0YXNrIHN3aXRjaCAqLyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfbG9vcF9iZWdpbiwgICAgICAgICAgICAgICBvbXB0X25ld193b3Jrc2hhcmVfY2FsbGJhY2tfdCwgMjcpIC8qIHRhc2sgYXQgbG9vcCBiZWdpbiAqLyAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2xvb3BfZW5kLCAgICAgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDI4KSAvKiB0YXNrIGF0IGxvb3AgZW5kICovICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfc2VjdGlvbnNfYmVnaW4sICAgICAgICAgICBvbXB0X25ld193b3Jrc2hhcmVfY2FsbGJhY2tfdCwgMjkpIC8qIHRhc2sgYXQgc2VjdGlvbnMgYmVnaW4gICovXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3NlY3Rpb25zX2VuZCwgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDMwKSAvKiB0YXNrIGF0IHNlY3Rpb25zIGVuZCAqLyAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfc2luZ2xlX2luX2Jsb2NrX2JlZ2luLCAgICBvbXB0X25ld193b3Jrc2hhcmVfY2FsbGJhY2tfdCwgMzEpIC8qIHRhc2sgYXQgc2luZ2xlIGJlZ2luKi8gICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3NpbmdsZV9pbl9ibG9ja19lbmQsICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDMyKSAvKiB0YXNrIGF0IHNpbmdsZSBlbmQgKi8gICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfc2luZ2xlX290aGVyc19iZWdpbiwgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMzMpIC8qIHRhc2sgYXQgc2luZ2xlIGJlZ2luICovICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3NpbmdsZV9vdGhlcnNfZW5kLCAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDM0KSAvKiB0YXNrIGF0IHNpbmdsZSBlbmQgKi8gICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd29ya3NoYXJlX2JlZ2luLCAgICAgICAgICBvbXB0X25ld193b3Jrc2hhcmVfY2FsbGJhY2tfdCwgMzUpIC8qIHRhc2sgYXQgd29ya3NoYXJlIGJlZ2luICovXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dvcmtzaGFyZV9lbmQsICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDM2KSAvKiB0YXNrIGF0IHdvcmtzaGFyZSBlbmQgKi8gIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfbWFzdGVyX2JlZ2luLCAgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMzcpIC8qIHRhc2sgYXQgbWFzdGVyIGJlZ2luICovICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X21hc3Rlcl9lbmQsICAgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDM4KSAvKiB0YXNrIGF0IG1hc3RlciBlbmQgKi8gICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbiwgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMzkpIC8qIHRhc2sgYXQgYmFycmllciBiZWdpbiAgKi8gXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2JhcnJpZXJfZW5kLCAgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDQwKSAvKiB0YXNrIGF0IGJhcnJpZXIgZW5kICovICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGFza3dhaXRfYmVnaW4sICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgNDEpIC8qIHRhc2sgYXQgdGFza3dhaXQgYmVnaW4gKi8gXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3Rhc2t3YWl0X2VuZCwgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDQyKSAvKiB0YXNrIGF0IHRhc2sgd2FpdCBlbmQgKi8gIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGFza2dyb3VwX2JlZ2luLCAgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgNDMpIC8qIHRhc2sgYXQgdGFza2dyb3VwIGJlZ2luICovXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3Rhc2tncm91cF9lbmQsICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDQ0KSAvKiB0YXNrIGF0IHRhc2tncm91cCBlbmQgKi8gIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfcmVsZWFzZV9uZXN0X2xvY2tfcHJldiwgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNDUpIC8qIHByZXYgbmVzdCBsb2NrIHJlbGVhc2UgKi8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X2xvY2ssICAgICAgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA0NikgLyogbG9jayB3YWl0ICovICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF9uZXN0X2xvY2ssICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNDcpIC8qIG5lc3QgbG9jayB3YWl0ICovICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfY3JpdGljYWwsICAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDQ4KSAvKiBjcml0aWNhbCB3YWl0ICovICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X2F0b21pYywgICAgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA0OSkgLyogYXRvbWljIHdhaXQgKi8gICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF9vcmRlcmVkLCAgICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTApIC8qIG9yZGVyZWQgd2FpdCAqLyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9hY3F1aXJlZF9sb2NrLCAgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA1MSkgLyogbG9jayBhY3F1aXJlZCAqLyAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfYWNxdWlyZWRfbmVzdF9sb2NrX2ZpcnN0LCBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTIpIC8qIDFzdCBuZXN0IGxvY2sgYWNxdWlyZWQgKi8gXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2FjcXVpcmVkX25lc3RfbG9ja19uZXh0LCAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDUzKSAvKiBuZXh0IG5lc3QgbG9jayBhY3F1aXJlZCovIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9hY3F1aXJlZF9jcml0aWNhbCwgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA1NCkgLyogY3JpdGljYWwgYWNxdWlyZWQgKi8gICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfYWNxdWlyZWRfYXRvbWljLCAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTUpIC8qIGF0b21pYyBhY3F1aXJlZCAqLyAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2FjcXVpcmVkX29yZGVyZWQsICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDU2KSAvKiBvcmRlcmVkIGFjcXVpcmVkICovICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfaW5pdF9sb2NrLCAgICAgICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTcpIC8qIGxvY2sgaW5pdCAqLyAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2luaXRfbmVzdF9sb2NrLCAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDU4KSAvKiBuZXN0IGxvY2sgaW5pdCAqLyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfZGVzdHJveV9sb2NrLCAgICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTkpIC8qIGxvY2sgZGVzdHJ1Y3Rpb24gKi8gICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2Rlc3Ryb3lfbmVzdF9sb2NrLCAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDYwKSAvKiBuZXN0IGxvY2sgZGVzdHJ1Y3Rpb24gKi8gIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfZmx1c2gsICAgICAgICAgICAgICAgICAgICBvbXB0X2NhbGxiYWNrX3QsICAgICAgICAgICAgICAgNjEpIC8qIGFmdGVyIGV4ZWN1dGluZyBmbHVzaCAqLworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBkYXRhIHR5cGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBpZGVudGlmaWVycworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIHVpbnQ2NF90IG9tcHRfdGhyZWFkX2lkX3Q7CisjZGVmaW5lIG9tcHRfdGhyZWFkX2lkX25vbmUgKChvbXB0X3RocmVhZF9pZF90KSAwKSAgICAgLyogbm9uLXN0YW5kYXJkICovCisKK3R5cGVkZWYgdWludDY0X3Qgb21wdF90YXNrX2lkX3Q7CisjZGVmaW5lIG9tcHRfdGFza19pZF9ub25lICgob21wdF90YXNrX2lkX3QpIDApICAgICAgICAgLyogbm9uLXN0YW5kYXJkICovCisKK3R5cGVkZWYgdWludDY0X3Qgb21wdF9wYXJhbGxlbF9pZF90OworI2RlZmluZSBvbXB0X3BhcmFsbGVsX2lkX25vbmUgKChvbXB0X3BhcmFsbGVsX2lkX3QpIDApIC8qIG5vbi1zdGFuZGFyZCAqLworCit0eXBlZGVmIHVpbnQ2NF90IG9tcHRfd2FpdF9pZF90OworI2RlZmluZSBvbXB0X3dhaXRfaWRfbm9uZSAoKG9tcHRfd2FpdF9pZF90KSAwKSAgICAgICAgIC8qIG5vbi1zdGFuZGFyZCAqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBvbXB0X2ZyYW1lX3QKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordHlwZWRlZiBzdHJ1Y3Qgb21wdF9mcmFtZV9zIHsKKyAgICB2b2lkICpleGl0X3J1bnRpbWVfZnJhbWU7ICAgIC8qIG5leHQgZnJhbWUgaXMgdXNlciBjb2RlICAgICAqLworICAgIHZvaWQgKnJlZW50ZXJfcnVudGltZV9mcmFtZTsgLyogcHJldmlvdXMgZnJhbWUgaXMgdXNlciBjb2RlICovCit9IG9tcHRfZnJhbWVfdDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGVudW1lcmF0aW9ucyBmb3IgdGhyZWFkIHN0YXRlcyBhbmQgcnVudGltZSBldmVudHMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHJ1bnRpbWUgc3RhdGVzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgZW51bSB7CisjZGVmaW5lIG9tcHRfc3RhdGVfbWFjcm8oc3RhdGUsIGNvZGUpIHN0YXRlID0gY29kZSwKKyAgICBGT1JFQUNIX09NUFRfU1RBVEUob21wdF9zdGF0ZV9tYWNybykKKyN1bmRlZiBvbXB0X3N0YXRlX21hY3JvCit9IG9tcHRfc3RhdGVfdDsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogcnVudGltZSBldmVudHMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordHlwZWRlZiBlbnVtIHsKKyNkZWZpbmUgb21wdF9ldmVudF9tYWNybyhldmVudCwgY2FsbGJhY2ssIGV2ZW50aWQpIGV2ZW50ID0gZXZlbnRpZCwKKyAgICBGT1JFQUNIX09NUFRfRVZFTlQob21wdF9ldmVudF9tYWNybykKKyN1bmRlZiBvbXB0X2V2ZW50X21hY3JvCit9IG9tcHRfZXZlbnRfdDsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogc2V0IGNhbGxiYWNrIHJlc3VsdHMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgZW51bSB7CisgICAgb21wdF9zZXRfcmVzdWx0X3JlZ2lzdHJhdGlvbl9lcnJvciAgICAgICAgICAgICAgPSAwLAorICAgIG9tcHRfc2V0X3Jlc3VsdF9ldmVudF9tYXlfb2NjdXJfbm9fY2FsbGJhY2sgICAgID0gMSwKKyAgICBvbXB0X3NldF9yZXN1bHRfZXZlbnRfbmV2ZXJfb2NjdXJzICAgICAgICAgICAgICA9IDIsCisgICAgb21wdF9zZXRfcmVzdWx0X2V2ZW50X21heV9vY2N1cl9jYWxsYmFja19zb21lICAgPSAzLAorICAgIG9tcHRfc2V0X3Jlc3VsdF9ldmVudF9tYXlfb2NjdXJfY2FsbGJhY2tfYWx3YXlzID0gNCwKK30gb21wdF9zZXRfcmVzdWx0X3Q7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGNhbGxiYWNrIHNpZ25hdHVyZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogaW5pdGlhbGl6YXRpb24gKi8KK3R5cGVkZWYgdm9pZCAoKm9tcHRfaW50ZXJmYWNlX2ZuX3QpKHZvaWQpOworCit0eXBlZGVmIG9tcHRfaW50ZXJmYWNlX2ZuX3QgKCpvbXB0X2Z1bmN0aW9uX2xvb2t1cF90KSgKKyAgICBjb25zdCBjaGFyICogICAgICAgICAgICAgICAgICAgICAgLyogZW50cnkgcG9pbnQgdG8gbG9vayB1cCAgICAgICAqLworKTsKKworLyogdGhyZWFkcyAqLwordHlwZWRlZiB2b2lkICgqb21wdF90aHJlYWRfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfdGhyZWFkX2lkX3QgdGhyZWFkX2lkICAgICAgICAvKiBJRCBvZiB0aHJlYWQgICAgICAgICAgICAgICAgICovCispOworCit0eXBlZGVmIGVudW0geworICAgIG9tcHRfdGhyZWFkX2luaXRpYWwgPSAxLCAvLyBzdGFydCB0aGUgZW51bWVyYXRpb24gYXQgMQorICAgIG9tcHRfdGhyZWFkX3dvcmtlciAgPSAyLAorICAgIG9tcHRfdGhyZWFkX290aGVyICAgPSAzCit9IG9tcHRfdGhyZWFkX3R5cGVfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBvbXB0X2ludm9rZXJfcHJvZ3JhbSA9IDAsICAgICAgICAgLyogcHJvZ3JhbSBpbnZva2VzIG1hc3RlciB0YXNrICAqLworICAgIG9tcHRfaW52b2tlcl9ydW50aW1lID0gMSAgICAgICAgICAvKiBydW50aW1lIGludm9rZXMgbWFzdGVyIHRhc2sgICovCit9IG9tcHRfaW52b2tlcl90OworCit0eXBlZGVmIHZvaWQgKCpvbXB0X3RocmVhZF90eXBlX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3RocmVhZF90eXBlX3QgdGhyZWFkX3R5cGUsICAgLyogdHlwZSBvZiB0aHJlYWQgICAgICAgICAgICAgICAqLworICAgIG9tcHRfdGhyZWFkX2lkX3QgdGhyZWFkX2lkICAgICAgICAvKiBJRCBvZiB0aHJlYWQgICAgICAgICAgICAgICAgICovCispOworCit0eXBlZGVmIHZvaWQgKCpvbXB0X3dhaXRfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfd2FpdF9pZF90IHdhaXRfaWQgICAgICAgICAgICAvKiB3YWl0IGlkICAgICAgICAgICAgICAgICAgICAgICovCispOworCisvKiBwYXJhbGxlbCBhbmQgd29ya3NoYXJlcyAqLwordHlwZWRlZiB2b2lkICgqb21wdF9wYXJhbGxlbF9jYWxsYmFja190KSAoCisgICAgb21wdF9wYXJhbGxlbF9pZF90IHBhcmFsbGVsX2lkLCAgICAvKiBpZCBvZiBwYXJhbGxlbCByZWdpb24gICAgICAgKi8KKyAgICBvbXB0X3Rhc2tfaWRfdCB0YXNrX2lkICAgICAgICAgICAgIC8qIGlkIG9mIHRhc2sgICAgICAgICAgICAgICAgICAqLworKTsKKwordHlwZWRlZiB2b2lkICgqb21wdF9uZXdfd29ya3NoYXJlX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3BhcmFsbGVsX2lkX3QgcGFyYWxsZWxfaWQsICAgLyogaWQgb2YgcGFyYWxsZWwgcmVnaW9uICAgICAgICAqLworICAgIG9tcHRfdGFza19pZF90IHBhcmVudF90YXNrX2lkLCAgICAvKiBpZCBvZiBwYXJlbnQgdGFzayAgICAgICAgICAgICovCisgICAgdm9pZCAqd29ya3NoYXJlX2Z1bmN0aW9uICAgICAgICAgIC8qIHBvaW50ZXIgdG8gb3V0bGluZWQgZnVuY3Rpb24gKi8KKyk7CisKK3R5cGVkZWYgdm9pZCAoKm9tcHRfbmV3X3BhcmFsbGVsX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3Rhc2tfaWRfdCBwYXJlbnRfdGFza19pZCwgICAgLyogaWQgb2YgcGFyZW50IHRhc2sgICAgICAgICAgICAqLworICAgIG9tcHRfZnJhbWVfdCAqcGFyZW50X3Rhc2tfZnJhbWUsICAvKiBmcmFtZSBkYXRhIG9mIHBhcmVudCB0YXNrICAgICovCisgICAgb21wdF9wYXJhbGxlbF9pZF90IHBhcmFsbGVsX2lkLCAgIC8qIGlkIG9mIHBhcmFsbGVsIHJlZ2lvbiAgICAgICAgKi8KKyAgICB1aW50MzJfdCByZXF1ZXN0ZWRfdGVhbV9zaXplLCAgICAgLyogbnVtYmVyIG9mIHRocmVhZHMgaW4gdGVhbSAgICAqLworICAgIHZvaWQgKnBhcmFsbGVsX2Z1bmN0aW9uLCAgICAgICAgICAvKiBwb2ludGVyIHRvIG91dGxpbmVkIGZ1bmN0aW9uICovCisgICAgb21wdF9pbnZva2VyX3QgaW52b2tlciAgICAgICAgICAgIC8qIHdobyBpbnZva2VzIG1hc3RlciB0YXNrPyAgICAgKi8KKyk7CisKK3R5cGVkZWYgdm9pZCAoKm9tcHRfZW5kX3BhcmFsbGVsX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3BhcmFsbGVsX2lkX3QgcGFyYWxsZWxfaWQsICAgLyogaWQgb2YgcGFyYWxsZWwgcmVnaW9uICAgICAgICovCisgICAgb21wdF90YXNrX2lkX3QgdGFza19pZCwgICAgICAgICAgIC8qIGlkIG9mIHRhc2sgICAgICAgICAgICAgICAgICAqLworICAgIG9tcHRfaW52b2tlcl90IGludm9rZXIgICAgICAgICAgICAvKiB3aG8gaW52b2tlcyBtYXN0ZXIgdGFzaz8gICAgKi8gCispOworCisvKiB0YXNrcyAqLwordHlwZWRlZiB2b2lkICgqb21wdF90YXNrX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3Rhc2tfaWRfdCB0YXNrX2lkICAgICAgICAgICAgLyogaWQgb2YgdGFzayAgICAgICAgICAgICAgICAgICAqLworKTsKKwordHlwZWRlZiB2b2lkICgqb21wdF90YXNrX3BhaXJfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfdGFza19pZF90IGZpcnN0X3Rhc2tfaWQsCisgICAgb21wdF90YXNrX2lkX3Qgc2Vjb25kX3Rhc2tfaWQKKyk7CisKK3R5cGVkZWYgdm9pZCAoKm9tcHRfbmV3X3Rhc2tfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfdGFza19pZF90IHBhcmVudF90YXNrX2lkLCAgICAvKiBpZCBvZiBwYXJlbnQgdGFzayAgICAgICAgICAgICovCisgICAgb21wdF9mcmFtZV90ICpwYXJlbnRfdGFza19mcmFtZSwgIC8qIGZyYW1lIGRhdGEgZm9yIHBhcmVudCB0YXNrICAgKi8KKyAgICBvbXB0X3Rhc2tfaWRfdCAgbmV3X3Rhc2tfaWQsICAgICAgLyogaWQgb2YgY3JlYXRlZCB0YXNrICAgICAgICAgICAqLworICAgIHZvaWQgKnRhc2tfZnVuY3Rpb24gICAgICAgICAgICAgICAvKiBwb2ludGVyIHRvIG91dGxpbmVkIGZ1bmN0aW9uICovCispOworCisvKiBwcm9ncmFtICovCit0eXBlZGVmIHZvaWQgKCpvbXB0X2NvbnRyb2xfY2FsbGJhY2tfdCkgKAorICAgIHVpbnQ2NF90IGNvbW1hbmQsICAgICAgICAgICAgICAgICAvKiBjb21tYW5kIG9mIGNvbnRyb2wgY2FsbCAgICAgICovCisgICAgdWludDY0X3QgbW9kaWZpZXIgICAgICAgICAgICAgICAgIC8qIG1vZGlmaWVyIG9mIGNvbnRyb2wgY2FsbCAgICAgKi8KKyk7CisKK3R5cGVkZWYgdm9pZCAoKm9tcHRfY2FsbGJhY2tfdCkodm9pZCk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIG9tcHQgQVBJCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIE9NUFRfQVBJX0ZOVFlQRShmbikgZm4jI190CisKKyNkZWZpbmUgT01QVF9BUElfRlVOQ1RJT04ocmV0dXJuX3R5cGUsIGZuLCBhcmdzKSAgXAorICAgIHR5cGVkZWYgcmV0dXJuX3R5cGUgKCpPTVBUX0FQSV9GTlRZUEUoZm4pKSBhcmdzCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSU5RVUlSWSBGVU5DVElPTlMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIHN0YXRlICovCitPTVBUX0FQSV9GVU5DVElPTihvbXB0X3N0YXRlX3QsIG9tcHRfZ2V0X3N0YXRlLCAoCisgICAgb21wdF93YWl0X2lkX3QgKm9tcHRfd2FpdF9pZAorKSk7CisKKy8qIHRocmVhZCAqLworT01QVF9BUElfRlVOQ1RJT04ob21wdF90aHJlYWRfaWRfdCwgb21wdF9nZXRfdGhyZWFkX2lkLCAodm9pZCkpOworCitPTVBUX0FQSV9GVU5DVElPTih2b2lkICosIG9tcHRfZ2V0X2lkbGVfZnJhbWUsICh2b2lkKSk7CisKKy8qIHBhcmFsbGVsIHJlZ2lvbiAqLworT01QVF9BUElfRlVOQ1RJT04ob21wdF9wYXJhbGxlbF9pZF90LCBvbXB0X2dldF9wYXJhbGxlbF9pZCwgKAorICAgIGludCBhbmNlc3Rvcl9sZXZlbAorKSk7CisKK09NUFRfQVBJX0ZVTkNUSU9OKGludCwgb21wdF9nZXRfcGFyYWxsZWxfdGVhbV9zaXplLCAoCisgICAgaW50IGFuY2VzdG9yX2xldmVsCispKTsKKworLyogdGFzayAqLworT01QVF9BUElfRlVOQ1RJT04ob21wdF90YXNrX2lkX3QsIG9tcHRfZ2V0X3Rhc2tfaWQsICgKKyAgICBpbnQgZGVwdGgKKykpOworCitPTVBUX0FQSV9GVU5DVElPTihvbXB0X2ZyYW1lX3QgKiwgb21wdF9nZXRfdGFza19mcmFtZSwgKAorICAgIGludCBkZXB0aAorKSk7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUExBQ0VIT0xERVJTIEZPUiBQRVJGT1JNQU5DRSBSRVBPUlRJTkcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGlkbGUgKi8KK09NUFRfQVBJX0ZVTkNUSU9OKHZvaWQsIG9tcHRfaWRsZSwgKAorICAgIHZvaWQKKykpOworCisvKiBvdmVyaGVhZCAqLworT01QVF9BUElfRlVOQ1RJT04odm9pZCwgb21wdF9vdmVyaGVhZCwgKAorICAgIHZvaWQKKykpOworCisvKiBiYXJyaWVyIHdhaXQgKi8KK09NUFRfQVBJX0ZVTkNUSU9OKHZvaWQsIG9tcHRfYmFycmllcl93YWl0LCAoCisgICAgdm9pZAorKSk7CisKKy8qIHRhc2sgd2FpdCAqLworT01QVF9BUElfRlVOQ1RJT04odm9pZCwgb21wdF90YXNrX3dhaXQsICgKKyAgICB2b2lkCispKTsKKworLyogbXV0ZXggd2FpdCAqLworT01QVF9BUElfRlVOQ1RJT04odm9pZCwgb21wdF9tdXRleF93YWl0LCAoCisgICAgdm9pZAorKSk7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSU5JVElBTElaQVRJT04gRlVOQ1RJT05TCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitPTVBUX0FQSV9GVU5DVElPTih2b2lkLCBvbXB0X2luaXRpYWxpemUsICgKKyAgICBvbXB0X2Z1bmN0aW9uX2xvb2t1cF90IG9tcHRfZm5fbG9va3VwLAorICAgIGNvbnN0IGNoYXIgKnJ1bnRpbWVfdmVyc2lvbiwKKyAgICB1bnNpZ25lZCBpbnQgb21wdF92ZXJzaW9uCispKTsKKworCisvKiBpbml0aWFsaXphdGlvbiBpbnRlcmZhY2UgdG8gYmUgZGVmaW5lZCBieSB0b29sICovCitvbXB0X2luaXRpYWxpemVfdCBvbXB0X3Rvb2wodm9pZCk7CisKK3R5cGVkZWYgZW51bSBvcHRfaW5pdF9tb2RlX2UgeworICAgIG9tcHRfaW5pdF9tb2RlX25ldmVyICA9IDAsCisgICAgb21wdF9pbml0X21vZGVfZmFsc2UgID0gMSwKKyAgICBvbXB0X2luaXRfbW9kZV90cnVlICAgPSAyLAorICAgIG9tcHRfaW5pdF9tb2RlX2Fsd2F5cyA9IDMKK30gb21wdF9pbml0X21vZGVfdDsKKworT01QVF9BUElfRlVOQ1RJT04oaW50LCBvbXB0X3NldF9jYWxsYmFjaywgKAorICAgIG9tcHRfZXZlbnRfdCBldmVudCwKKyAgICBvbXB0X2NhbGxiYWNrX3QgY2FsbGJhY2sKKykpOworCit0eXBlZGVmIGVudW0gb21wdF9zZXRfY2FsbGJhY2tfcmNfZSB7ICAvKiBub24tc3RhbmRhcmQgKi8KKyAgICBvbXB0X3NldF9jYWxsYmFja19lcnJvciAgICAgID0gMCwKKyAgICBvbXB0X2hhc19ldmVudF9ub19jYWxsYmFjayAgID0gMSwKKyAgICBvbXB0X25vX2V2ZW50X25vX2NhbGxiYWNrICAgID0gMiwKKyAgICBvbXB0X2hhc19ldmVudF9tYXlfY2FsbGJhY2sgID0gMywKKyAgICBvbXB0X2hhc19ldmVudF9tdXN0X2NhbGxiYWNrID0gNCwKK30gb21wdF9zZXRfY2FsbGJhY2tfcmNfdDsKKworCitPTVBUX0FQSV9GVU5DVElPTihpbnQsIG9tcHRfZ2V0X2NhbGxiYWNrLCAoCisgICAgb21wdF9ldmVudF90IGV2ZW50LAorICAgIG9tcHRfY2FsbGJhY2tfdCAqY2FsbGJhY2sKKykpOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1JU0NFTExBTkVPVVMgRlVOQ1RJT05TCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBjb250cm9sICovCisjaWYgZGVmaW5lZChfT1BFTk1QKSAmJiAoX09QRU5NUCA+PSAyMDEzMDcpCisjcHJhZ21hIG9tcCBkZWNsYXJlIHRhcmdldAorI2VuZGlmCit2b2lkIG9tcHRfY29udHJvbCgKKyAgICB1aW50NjRfdCBjb21tYW5kLAorICAgIHVpbnQ2NF90IG1vZGlmaWVyCispOworI2lmIGRlZmluZWQoX09QRU5NUCkgJiYgKF9PUEVOTVAgPj0gMjAxMzA3KQorI3ByYWdtYSBvbXAgZW5kIGRlY2xhcmUgdGFyZ2V0CisjZW5kaWYKKworLyogc3RhdGUgZW51bWVyYXRpb24gKi8KK09NUFRfQVBJX0ZVTkNUSU9OKGludCwgb21wdF9lbnVtZXJhdGVfc3RhdGUsICgKKyAgICBpbnQgY3VycmVudF9zdGF0ZSwKKyAgICBpbnQgKm5leHRfc3RhdGUsCisgICAgY29uc3QgY2hhciAqKm5leHRfc3RhdGVfbmFtZQorKSk7CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK307CisjZW5kaWYKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvb21wLmgudmFyIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS80MC9vbXAuaC52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM1MThlNwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvb21wLmgudmFyCkBAIC0wLDAgKzEsMTYwIEBACisvKgorICogaW5jbHVkZS80MC9vbXAuaC52YXIKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBfX09NUF9ICisjICAgZGVmaW5lIF9fT01QX0gKKworIyAgIGRlZmluZSBLTVBfVkVSU0lPTl9NQUpPUiAgICBATElCT01QX1ZFUlNJT05fTUFKT1JACisjICAgZGVmaW5lIEtNUF9WRVJTSU9OX01JTk9SICAgIEBMSUJPTVBfVkVSU0lPTl9NSU5PUkAKKyMgICBkZWZpbmUgS01QX1ZFUlNJT05fQlVJTEQgICAgQExJQk9NUF9WRVJTSU9OX0JVSUxEQAorIyAgIGRlZmluZSBLTVBfQlVJTERfREFURSAgICAgICAiQExJQk9NUF9CVUlMRF9EQVRFQCIKKworIyAgIGlmZGVmIF9fY3BsdXNwbHVzCisgICAgZXh0ZXJuICJDIiB7CisjICAgZW5kaWYKKworIyAgIGlmIGRlZmluZWQoX1dJTjMyKQorIyAgICAgICBkZWZpbmUgX19LQUlfS01QQ19DT05WRU5USU9OIF9fY2RlY2wKKyMgICBlbHNlCisjICAgICAgIGRlZmluZSBfX0tBSV9LTVBDX0NPTlZFTlRJT04KKyMgICBlbmRpZgorCisgICAgLyogc2NoZWR1bGUga2luZCBjb25zdGFudHMgKi8KKyAgICB0eXBlZGVmIGVudW0gb21wX3NjaGVkX3QgeworCW9tcF9zY2hlZF9zdGF0aWMgID0gMSwKKwlvbXBfc2NoZWRfZHluYW1pYyA9IDIsCisJb21wX3NjaGVkX2d1aWRlZCAgPSAzLAorCW9tcF9zY2hlZF9hdXRvICAgID0gNAorICAgIH0gb21wX3NjaGVkX3Q7CisKKyAgICAvKiBzZXQgQVBJIGZ1bmN0aW9ucyAqLworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X251bV90aHJlYWRzIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X2R5bmFtaWMgICAgIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X25lc3RlZCAgICAgIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X3NjaGVkdWxlICAgICAgICAgIChvbXBfc2NoZWRfdCwgaW50KTsKKworICAgIC8qIHF1ZXJ5IEFQSSBmdW5jdGlvbnMgKi8KKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9udW1fdGhyZWFkcyAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X2R5bmFtaWMgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbmVzdGVkICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9tYXhfdGhyZWFkcyAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3RocmVhZF9udW0gICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbnVtX3Byb2NzICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2luX3BhcmFsbGVsICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfaW5fZmluYWwgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfYWN0aXZlX2xldmVsICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbGV2ZWwgICAgICAgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bSAoaW50KTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF90ZWFtX3NpemUgICAgICAgICAgIChpbnQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3RocmVhZF9saW1pdCAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3NjaGVkdWxlICAgICAgICAgICAgKG9tcF9zY2hlZF90ICosIGludCAqKTsKKworICAgIC8qIGxvY2sgQVBJIGZ1bmN0aW9ucyAqLworICAgIHR5cGVkZWYgc3RydWN0IG9tcF9sb2NrX3QgeworICAgICAgICB2b2lkICogX2xrOworICAgIH0gb21wX2xvY2tfdDsKKworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfaW5pdF9sb2NrICAgIChvbXBfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X2xvY2sgICAgIChvbXBfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfdW5zZXRfbG9jayAgIChvbXBfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZGVzdHJveV9sb2NrIChvbXBfbG9ja190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfdGVzdF9sb2NrICAgIChvbXBfbG9ja190ICopOworCisgICAgLyogbmVzdGVkIGxvY2sgQVBJIGZ1bmN0aW9ucyAqLworICAgIHR5cGVkZWYgc3RydWN0IG9tcF9uZXN0X2xvY2tfdCB7CisgICAgICAgIHZvaWQgKiBfbGs7CisgICAgfSBvbXBfbmVzdF9sb2NrX3Q7CisKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2luaXRfbmVzdF9sb2NrICAgIChvbXBfbmVzdF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfbmVzdF9sb2NrICAgICAob21wX25lc3RfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfdW5zZXRfbmVzdF9sb2NrICAgKG9tcF9uZXN0X2xvY2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrIChvbXBfbmVzdF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF90ZXN0X25lc3RfbG9jayAgICAob21wX25lc3RfbG9ja190ICopOworCisgICAgLyogdGltZSBBUEkgZnVuY3Rpb25zICovCisgICAgZXh0ZXJuIGRvdWJsZSBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfd3RpbWUgKHZvaWQpOworICAgIGV4dGVybiBkb3VibGUgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3d0aWNrICh2b2lkKTsKKworICAgIC8qIE9wZW5NUCA0LjAgKi8KKyAgICBleHRlcm4gaW50ICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UgKHZvaWQpOworICAgIGV4dGVybiB2b2lkIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9kZWZhdWx0X2RldmljZSAoaW50KTsKKyAgICBleHRlcm4gaW50ICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9pc19pbml0aWFsX2RldmljZSAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X251bV9kZXZpY2VzICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbnVtX3RlYW1zICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfdGVhbV9udW0gKHZvaWQpOworICAgIGV4dGVybiBpbnQgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9jYW5jZWxsYXRpb24gKHZvaWQpOworCisjICAgaW5jbHVkZSA8c3RkbGliLmg+CisgICAgLyoga21wIEFQSSBmdW5jdGlvbnMgKi8KKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9zdGFja3NpemUgICAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X3N0YWNrc2l6ZSAgICAgICAgICAoaW50KTsKKyAgICBleHRlcm4gc2l6ZV90IF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9zdGFja3NpemVfcyAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X3N0YWNrc2l6ZV9zICAgICAgICAoc2l6ZV90KTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9ibG9ja3RpbWUgICAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2xpYnJhcnkgICAgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfYmxvY2t0aW1lICAgICAgICAgIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2xpYnJhcnkgICAgICAgICAgICAoaW50KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9saWJyYXJ5X3NlcmlhbCAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZCAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0ICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9kZWZhdWx0cyAgICAgICAgICAgKGNoYXIgY29uc3QgKik7CisKKyAgICAvKiBJbnRlbCBhZmZpbml0eSBBUEkgKi8KKyAgICB0eXBlZGVmIHZvaWQgKiBrbXBfYWZmaW5pdHlfbWFza190OworCisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfYWZmaW5pdHkgICAgICAgICAgICAgKGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfYWZmaW5pdHkgICAgICAgICAgICAgKGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sgICAgIChrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrICAgIChrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyAgIChpbnQsIGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MgKGludCwga21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MgICAoaW50LCBrbXBfYWZmaW5pdHlfbWFza190ICopOworCisgICAgLyogT3Blbk1QIDQuMCBhZmZpbml0eSBBUEkgKi8KKyAgICB0eXBlZGVmIGVudW0gb21wX3Byb2NfYmluZF90IHsKKyAgICAgICAgb21wX3Byb2NfYmluZF9mYWxzZSA9IDAsCisgICAgICAgIG9tcF9wcm9jX2JpbmRfdHJ1ZSA9IDEsCisgICAgICAgIG9tcF9wcm9jX2JpbmRfbWFzdGVyID0gMiwKKyAgICAgICAgb21wX3Byb2NfYmluZF9jbG9zZSA9IDMsCisgICAgICAgIG9tcF9wcm9jX2JpbmRfc3ByZWFkID0gNAorICAgIH0gb21wX3Byb2NfYmluZF90OworCisgICAgZXh0ZXJuIG9tcF9wcm9jX2JpbmRfdCBfX0tBSV9LTVBDX0NPTlZFTlRJT04gb21wX2dldF9wcm9jX2JpbmQgKHZvaWQpOworCisgICAgZXh0ZXJuIHZvaWQgKiBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9tYWxsb2MgIChzaXplX3QpOworICAgIGV4dGVybiB2b2lkICogX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfY2FsbG9jICAoc2l6ZV90LCBzaXplX3QpOworICAgIGV4dGVybiB2b2lkICogX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfcmVhbGxvYyAodm9pZCAqLCBzaXplX3QpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZnJlZSAgICAodm9pZCAqKTsKKworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X3dhcm5pbmdzX29uKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X3dhcm5pbmdzX29mZih2b2lkKTsKKworIyAgIHVuZGVmIF9fS0FJX0tNUENfQ09OVkVOVElPTgorCisgICAgLyogV2FybmluZzoKKyAgICAgICBUaGUgZm9sbG93aW5nIHR5cGVkZWZzIGFyZSBub3Qgc3RhbmRhcmQsIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLgorICAgICovCisgICAgdHlwZWRlZiBpbnQgICAgIG9tcF9pbnRfdDsKKyAgICB0eXBlZGVmIGRvdWJsZSAgb21wX3d0aW1lX3Q7CisKKyMgICBpZmRlZiBfX2NwbHVzcGx1cworICAgIH0KKyMgICBlbmRpZgorCisjZW5kaWYgLyogX19PTVBfSCAqLworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzQwL29tcF9saWIuZi52YXIgYi9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzQwL29tcF9saWIuZi52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E1OTE2MgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvb21wX2xpYi5mLnZhcgpAQCAtMCwwICsxLDc1OCBAQAorISBpbmNsdWRlLzQwL29tcF9saWIuZi52YXIKKworIQorIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishLy8KKyEvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCishLy8KKyEvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCishLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCishLy8KKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIQorCishKioqCishKioqIFNvbWUgb2YgdGhlIGRpcmVjdGl2ZXMgZm9yIHRoZSBmb2xsb3dpbmcgcm91dGluZSBleHRlbmQgcGFzdCBjb2x1bW4gNzIsCishKioqIHNvIHByb2Nlc3MgdGhpcyBmaWxlIGluIDEzMi1jb2x1bW4gbW9kZS4KKyEqKioKKworIWRlYyQgZml4ZWRmb3JtbGluZXNpemU6MTMyCisKKyAgICAgIG1vZHVsZSBvbXBfbGliX2tpbmRzCisKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9pbnRlZ2VyX2tpbmQgICAgICAgPSA0CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbG9naWNhbF9raW5kICAgICAgID0gNAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3JlYWxfa2luZCAgICAgICAgICA9IDQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2tpbmQgICAgICAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX25lc3RfbG9ja19raW5kICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfa2luZCAgICAgICAgID0gb21wX2ludGVnZXJfa2luZAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9raW5kICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9wb2ludGVyX2tpbmQgICAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3NpemVfdF9raW5kICAgICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfYWZmaW5pdHlfbWFza19raW5kID0gaW50X3B0cl9raW5kKCkKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9jYW5jZWxfa2luZCAgICAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisKKyAgICAgIGVuZCBtb2R1bGUgb21wX2xpYl9raW5kcworCisgICAgICBtb2R1bGUgb21wX2xpYgorCisgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21ham9yID0gQExJQk9NUF9WRVJTSU9OX01BSk9SQAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWlub3IgPSBATElCT01QX1ZFUlNJT05fTUlOT1JACisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9idWlsZCA9IEBMSUJPTVBfVkVSU0lPTl9CVUlMREAKKyAgICAgICAgY2hhcmFjdGVyKCopLCBwYXJhbWV0ZXIgOjoga21wX2J1aWxkX2RhdGUgICAgPSAnQExJQk9NUF9CVUlMRF9EQVRFQCcKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IG9wZW5tcF92ZXJzaW9uICAgID0gQExJQk9NUF9PTVBfWUVBUl9NT05USEAKKworICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX3N0YXRpYyAgPSAxCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfZHluYW1pYyA9IDIKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9ndWlkZWQgID0gMworICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2F1dG8gICAgPSA0CisKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9mYWxzZSA9IDAKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF90cnVlID0gMQorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX21hc3RlciA9IDIKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9jbG9zZSA9IDMKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9zcHJlYWQgPSA0CisKKyAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfY2FuY2VsX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF9wYXJhbGxlbCA9IDEKKyAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfY2FuY2VsX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF9sb29wID0gMgorICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX3NlY3Rpb25zID0gMworICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX3Rhc2tncm91cCA9IDQKKworICAgICAgICBpbnRlcmZhY2UKKworISAgICAgICAgICoqKgorISAgICAgICAgICoqKiBvbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgICAqKioKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkcyhudGhyZWFkcykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG50aHJlYWRzCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkcworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWMoZW5hYmxlKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgZW5hYmxlCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkKGVuYWJsZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIGVuYWJsZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV90aHJlYWRzKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3RocmVhZHMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkcygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF90aHJlYWRzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bSgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RocmVhZF9udW0KKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV9wcm9jcygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV9wcm9jcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV9wcm9jcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pbl9wYXJhbGxlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfaW5fcGFyYWxsZWwKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X2R5bmFtaWMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9keW5hbWljCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X25lc3RlZCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X25lc3RlZAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X25lc3RlZAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbGltaXQoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90aHJlYWRfbGltaXQKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbGltaXQKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscyhtYXhfbGV2ZWxzKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbWF4X2xldmVscworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2xldmVsKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbGV2ZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9sZXZlbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9hY3RpdmVfbGV2ZWwoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9hY3RpdmVfbGV2ZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9hY3RpdmVfbGV2ZWwKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bShsZXZlbCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGxldmVsCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9zaXplKGxldmVsKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbGV2ZWwKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90ZWFtX3NpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90ZWFtX3NpemUKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZShraW5kLCBtb2RpZmllcikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9zY2hlZF9raW5kKSBraW5kCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG1vZGlmaWVyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZQorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfZ2V0X3NjaGVkdWxlKGtpbmQsIG1vZGlmaWVyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3NjaGVkX2tpbmQpIGtpbmQKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbW9kaWZpZXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZ2V0X3NjaGVkdWxlCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3Byb2NfYmluZCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpIG9tcF9nZXRfcHJvY19iaW5kCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfcHJvY19iaW5kCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3d0aW1lKCkKKyAgICAgICAgICAgIGRvdWJsZSBwcmVjaXNpb24gb21wX2dldF93dGltZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3d0aW1lCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3d0aWNrICgpCisgICAgICAgICAgICBkb3VibGUgcHJlY2lzaW9uIG9tcF9nZXRfd3RpY2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGljaworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9kZWZhdWx0X2RldmljZSgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9kZWZhdWx0X2RldmljZShkZmx0X2RldmljZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGRmbHRfZGV2aWNlCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9kZWZhdWx0X2RldmljZQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fZGV2aWNlcygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV9kZXZpY2VzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX2RldmljZXMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RlYW1zKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3RlYW1zCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RlYW1zCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fbnVtKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGVhbV9udW0KKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90ZWFtX251bQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9jYW5jZWxsYXRpb24oKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9jYW5jZWxsYXRpb24KKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9jYW5jZWxsYXRpb24KKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9pc19pbml0aWFsX2RldmljZSgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfaXNfaW5pdGlhbF9kZXZpY2UKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2lzX2luaXRpYWxfZGV2aWNlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2sobG9ja3ZhcikKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9pbml0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrKGxvY2t2YXIpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfZGVzdHJveV9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrKGxvY2t2YXIpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfc2V0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrKGxvY2t2YXIpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfdW5zZXRfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9jaworCisgICAgICAgICAgZnVuY3Rpb24gb21wX3Rlc3RfbG9jayhsb2NrdmFyKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Rlc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF90ZXN0X2xvY2sKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jayhsb2NrdmFyKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2luaXRfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9jayhsb2NrdmFyKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrKGxvY2t2YXIpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfc2V0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sobG9ja3ZhcikKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF91bnNldF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sobG9ja3ZhcikKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF90ZXN0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF90ZXN0X25lc3RfbG9jaworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrCisKKyEgICAgICAgICAqKioKKyEgICAgICAgICAqKioga21wXyogZW50cnkgcG9pbnRzCishICAgICAgICAgKioqCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplKHNpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBzaXplCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcyhzaXplKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBzaXplCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZShtc2VjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbXNlYworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWwoKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWwKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQoKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0KCkKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkobGlibnVtKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbGlibnVtCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5CisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMoc3RyaW5nKQorICAgICAgICAgICAgY2hhcmFjdGVyKigqKSBzdHJpbmcKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZSgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIGttcF9nZXRfc3RhY2tzaXplX3MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9ibG9ja3RpbWUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeSgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2xpYnJhcnkKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5CisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5KG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfc2V0X2FmZmluaXR5CisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eShtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHkKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzayhtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrKG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHByb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBwcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHByb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX21hbGxvYyhzaXplKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX21hbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX21hbGxvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2NhbGxvYyhuZWxlbSwgZWxzaXplKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX2NhbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIG5lbGVtCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgZWxzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9jYWxsb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9yZWFsbG9jKHB0ciwgc2l6ZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9yZWFsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIHB0cgorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3JlYWxsb2MKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX2ZyZWUocHRyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkgcHRyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2ZyZWUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbigpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbgorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29mZigpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cyhjYW5jZWxraW5kKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2NhbmNlbF9raW5kKSBjYW5jZWxraW5kCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIGttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMKKworICAgICAgICBlbmQgaW50ZXJmYWNlCisKKyFkZWMkIGlmIGRlZmluZWQoX1dJTjMyKQorIWRlYyQgICBpZiBkZWZpbmVkKF9XSU42NCkgLm9yLiBkZWZpbmVkKF9NX0FNRDY0KQorCishKioqCishKioqIFRoZSBGb3J0cmFuIGVudHJ5IHBvaW50cyBtdXN0IGJlIGluIHVwcGVyY2FzZSwgZXZlbiBpZiB0aGUgL1Fsb3dlcmNhc2UKKyEqKiogb3B0aW9uIGlzIHNwZWNpZmllZC4gIFRoZSBhbGlhcyBhdHRyaWJ1dGUgZW5zdXJlcyB0aGF0IHRoZSBzcGVjaWZpZWQKKyEqKiogc3RyaW5nIGlzIHVzZWQgYXMgdGhlIGVudHJ5IHBvaW50LgorISoqKgorISoqKiBPbiB0aGUgV2luZG93cyogT1MgSUEtMzIgYXJjaGl0ZWN0dXJlLCB0aGUgRm9ydHJhbiBlbnRyeSBwb2ludHMgaGF2ZSBhbgorISoqKiB1bmRlcnNjb3JlIHByZXBlbmRlZC4gIE9uIHRoZSBXaW5kb3dzKiBPUyBJbnRlbChSKSA2NAorISoqKiBhcmNoaXRlY3R1cmUsIG5vIHVuZGVyc2NvcmUgaXMgcHJlcGVuZGVkLgorISoqKgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX05VTV9USFJFQURTJyA6OiBvbXBfc2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX0RZTkFNSUMnIDo6IG9tcF9zZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9ORVNURUQnIDo6IG9tcF9zZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05VTV9USFJFQURTJyA6OiBvbXBfZ2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX01BWF9USFJFQURTJyA6OiBvbXBfZ2V0X21heF90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1RIUkVBRF9OVU0nIDo6IG9tcF9nZXRfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9OVU1fUFJPQ1MnIDo6IG9tcF9nZXRfbnVtX3Byb2NzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfSU5fUEFSQUxMRUwnIDo6IG9tcF9pbl9wYXJhbGxlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9EWU5BTUlDJyA6OiBvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTkVTVEVEJyA6OiBvbXBfZ2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9USFJFQURfTElNSVQnIDo6IG9tcF9nZXRfdGhyZWFkX2xpbWl0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX01BWF9BQ1RJVkVfTEVWRUxTJyA6OiBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX01BWF9BQ1RJVkVfTEVWRUxTJyA6OiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0xFVkVMJyA6OiBvbXBfZ2V0X2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0FDVElWRV9MRVZFTCcgOjogb21wX2dldF9hY3RpdmVfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfQU5DRVNUT1JfVEhSRUFEX05VTScgOjogb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1RFQU1fU0laRScgOjogb21wX2dldF90ZWFtX3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfU0NIRURVTEUnIDo6IG9tcF9zZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfU0NIRURVTEUnIDo6IG9tcF9nZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfUFJPQ19CSU5EJyA6OiBvbXBfZ2V0X3Byb2NfYmluZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9XVElNRScgOjogb21wX2dldF93dGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9XVElDSycgOjogb21wX2dldF93dGljaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9ERUZBVUxUX0RFVklDRScgOjogb21wX2dldF9kZWZhdWx0X2RldmljZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9ERUZBVUxUX0RFVklDRScgOjogb21wX3NldF9kZWZhdWx0X2RldmljZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9OVU1fREVWSUNFUycgOjogb21wX2dldF9udW1fZGV2aWNlcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9OVU1fVEVBTVMnIDo6IG9tcF9nZXRfbnVtX3RlYW1zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1RFQU1fTlVNJyA6OiBvbXBfZ2V0X3RlYW1fbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0NBTkNFTExBVElPTicgOjogb21wX2dldF9jYW5jZWxsYXRpb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9JU19JTklUSUFMX0RFVklDRScgOjogb21wX2lzX2luaXRpYWxfZGV2aWNlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbml0X2xvY2snIDo6IG9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9kZXN0cm95X2xvY2snIDo6IG9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbG9jaycgOjogb21wX3NldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdW5zZXRfbG9jaycgOjogb21wX3Vuc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF90ZXN0X2xvY2snIDo6IG9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbml0X25lc3RfbG9jaycgOjogb21wX2luaXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZGVzdHJveV9uZXN0X2xvY2snIDo6IG9tcF9kZXN0cm95X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9uZXN0X2xvY2snIDo6IG9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdW5zZXRfbmVzdF9sb2NrJyA6OiBvbXBfdW5zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdGVzdF9uZXN0X2xvY2snIDo6IG9tcF90ZXN0X25lc3RfbG9jaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX1NUQUNLU0laRSc6OmttcF9zZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX1NUQUNLU0laRV9TJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9CTE9DS1RJTUUnOjprbXBfc2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9MSUJSQVJZX1NFUklBTCc6OmttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfTElCUkFSWV9UVVJOQVJPVU5EJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfTElCUkFSWV9USFJPVUdIUFVUJzo6a21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfTElCUkFSWSc6OmttcF9zZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9TVEFDS1NJWkUnOjprbXBfZ2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9TVEFDS1NJWkVfUyc6OmttcF9nZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfQkxPQ0tUSU1FJzo6a21wX2dldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfTElCUkFSWSc6OmttcF9nZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9BRkZJTklUWSc6OmttcF9zZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfQUZGSU5JVFknOjprbXBfZ2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0FGRklOSVRZX01BWF9QUk9DJzo6a21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0NSRUFURV9BRkZJTklUWV9NQVNLJzo6a21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfREVTVFJPWV9BRkZJTklUWV9NQVNLJzo6a21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1VOU0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9NQUxMT0MnOjprbXBfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfQ0FMTE9DJzo6a21wX2NhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1JFQUxMT0MnOjprbXBfcmVhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0ZSRUUnOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX1dBUk5JTkdTX09OJzo6a21wX3NldF93YXJuaW5nc19vbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9XQVJOSU5HU19PRkYnOjprbXBfc2V0X3dhcm5pbmdzX29mZgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0NBTkNFTExBVElPTl9TVEFUVVMnIDo6IGttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cworCishZGVjJCAgIGVsc2UKKworISoqKgorISoqKiBPbiBXaW5kb3dzKiBPUyBJQS0zMiBhcmNoaXRlY3R1cmUsIHRoZSBGb3J0cmFuIGVudHJ5IHBvaW50cyBoYXZlIGFuIHVuZGVyc2NvcmUgcHJlcGVuZGVkLgorISoqKgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9OVU1fVEhSRUFEUycgOjogb21wX3NldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfRFlOQU1JQycgOjogb21wX3NldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9ORVNURUQnIDo6IG9tcF9zZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9OVU1fVEhSRUFEUycgOjogb21wX2dldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTUFYX1RIUkVBRFMnIDo6IG9tcF9nZXRfbWF4X3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1RIUkVBRF9OVU0nIDo6IG9tcF9nZXRfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTlVNX1BST0NTJyA6OiBvbXBfZ2V0X251bV9wcm9jcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9JTl9QQVJBTExFTCcgOjogb21wX2luX3BhcmFsbGVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9EWU5BTUlDJyA6OiBvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX05FU1RFRCcgOjogb21wX2dldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1RIUkVBRF9MSU1JVCcgOjogb21wX2dldF90aHJlYWRfbGltaXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX01BWF9BQ1RJVkVfTEVWRUxTJyA6OiBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9NQVhfQUNUSVZFX0xFVkVMUycgOjogb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTEVWRUwnIDo6IG9tcF9nZXRfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0FDVElWRV9MRVZFTCcgOjogb21wX2dldF9hY3RpdmVfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0FOQ0VTVE9SX1RIUkVBRF9OVU0nIDo6IG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfVEVBTV9TSVpFJyA6OiBvbXBfZ2V0X3RlYW1fc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfU0NIRURVTEUnIDo6IG9tcF9zZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1NDSEVEVUxFJyA6OiBvbXBfZ2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9QUk9DX0JJTkQnIDo6IG9tcF9nZXRfcHJvY19iaW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9XVElNRScgOjogb21wX2dldF93dGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfV1RJQ0snIDo6IG9tcF9nZXRfd3RpY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0RFRkFVTFRfREVWSUNFJyA6OiBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9ERUZBVUxUX0RFVklDRScgOjogb21wX3NldF9kZWZhdWx0X2RldmljZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTlVNX0RFVklDRVMnIDo6IG9tcF9nZXRfbnVtX2RldmljZXMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX05VTV9URUFNUycgOjogb21wX2dldF9udW1fdGVhbXMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1RFQU1fTlVNJyA6OiBvbXBfZ2V0X3RlYW1fbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9DQU5DRUxMQVRJT04nIDo6IG9tcF9nZXRfY2FuY2VsbGF0aW9uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0lTX0lOSVRJQUxfREVWSUNFJyA6OiBvbXBfaXNfaW5pdGlhbF9kZXZpY2UKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X2xvY2snIDo6IG9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9sb2NrJyA6OiBvbXBfZGVzdHJveV9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9sb2NrJyA6OiBvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdW5zZXRfbG9jaycgOjogb21wX3Vuc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9sb2NrJyA6OiBvbXBfdGVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luaXRfbmVzdF9sb2NrJyA6OiBvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9uZXN0X2xvY2snIDo6IG9tcF9kZXN0cm95X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbmVzdF9sb2NrJyA6OiBvbXBfc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF91bnNldF9uZXN0X2xvY2snIDo6IG9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9uZXN0X2xvY2snIDo6IG9tcF90ZXN0X25lc3RfbG9jaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9TVEFDS1NJWkUnOjprbXBfc2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfU1RBQ0tTSVpFX1MnOjprbXBfc2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9CTE9DS1RJTUUnOjprbXBfc2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWV9TRVJJQUwnOjprbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkQnOjprbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWV9USFJPVUdIUFVUJzo6a21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0xJQlJBUlknOjprbXBfc2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX1NUQUNLU0laRSc6OmttcF9nZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9TVEFDS1NJWkVfUyc6OmttcF9nZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0JMT0NLVElNRSc6OmttcF9nZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9MSUJSQVJZJzo6a21wX2dldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9BRkZJTklUWSc6OmttcF9zZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0FGRklOSVRZJzo6a21wX2dldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfQUZGSU5JVFlfTUFYX1BST0MnOjprbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0NSRUFURV9BRkZJTklUWV9NQVNLJzo6a21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0RFU1RST1lfQUZGSU5JVFlfTUFTSyc6OmttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1VOU0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX01BTExPQyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfQ0FMTE9DJzo6a21wX2NhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9SRUFMTE9DJzo6a21wX3JlYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfRlJFRSc6OmttcF9mcmVlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX1dBUk5JTkdTX09OJzo6a21wX3NldF93YXJuaW5nc19vbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfV0FSTklOR1NfT0ZGJzo6a21wX3NldF93YXJuaW5nc19vZmYKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfQ0FOQ0VMTEFUSU9OX1NUQVRVUycgOjoga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzCisKKyFkZWMkICAgZW5kaWYKKyFkZWMkIGVuZGlmCisKKyFkZWMkIGlmIGRlZmluZWQoX19saW51eCkKKworISoqKgorISoqKiBUaGUgTGludXgqIE9TIGVudHJ5IHBvaW50cyBhcmUgaW4gbG93ZXJjYXNlLCB3aXRoIGFuIHVuZGVyc2NvcmUgYXBwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbnVtX3RocmVhZHNfJzo6b21wX3NldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9keW5hbWljXyc6Om9tcF9zZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9uZXN0ZWRfJzo6b21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbnVtX3RocmVhZHNfJzo6b21wX2dldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9tYXhfdGhyZWFkc18nOjpvbXBfZ2V0X21heF90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3RocmVhZF9udW1fJzo6b21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X251bV9wcm9jc18nOjpvbXBfZ2V0X251bV9wcm9jcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luX3BhcmFsbGVsXyc6Om9tcF9pbl9wYXJhbGxlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9keW5hbWljXyc6Om9tcF9nZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9uZXN0ZWRfJzo6b21wX2dldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfdGhyZWFkX2xpbWl0Xyc6Om9tcF9nZXRfdGhyZWFkX2xpbWl0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzXyc6Om9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHNfJzo6b21wX2dldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9sZXZlbF8nOjpvbXBfZ2V0X2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X2FjdGl2ZV9sZXZlbF8nOjpvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtXyc6Om9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF90ZWFtX3NpemVfJzo6b21wX2dldF90ZWFtX3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfc2NoZWR1bGVfJzo6b21wX3NldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9zY2hlZHVsZV8nOjpvbXBfZ2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3Byb2NfYmluZF8nIDo6IG9tcF9nZXRfcHJvY19iaW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3d0aW1lXyc6Om9tcF9nZXRfd3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfd3RpY2tfJzo6b21wX2dldF93dGljaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9kZWZhdWx0X2RldmljZV8nOjpvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X2RlZmF1bHRfZGV2aWNlXyc6Om9tcF9zZXRfZGVmYXVsdF9kZXZpY2UKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbnVtX2RldmljZXNfJzo6b21wX2dldF9udW1fZGV2aWNlcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9udW1fdGVhbXNfJzo6b21wX2dldF9udW1fdGVhbXMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfdGVhbV9udW1fJzo6b21wX2dldF90ZWFtX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9jYW5jZWxsYXRpb25fJzo6b21wX2dldF9jYW5jZWxsYXRpb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pc19pbml0aWFsX2RldmljZV8nOjpvbXBfaXNfaW5pdGlhbF9kZXZpY2UKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbG9ja18nOjpvbXBfaW5pdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZGVzdHJveV9sb2NrXyc6Om9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbG9ja18nOjpvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9sb2NrXyc6Om9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdGVzdF9sb2NrXyc6Om9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbml0X25lc3RfbG9ja18nOjpvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9kZXN0cm95X25lc3RfbG9ja18nOjpvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbmVzdF9sb2NrXyc6Om9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdW5zZXRfbmVzdF9sb2NrXyc6Om9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF90ZXN0X25lc3RfbG9ja18nOjpvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9zdGFja3NpemVfJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfc3RhY2tzaXplX3NfJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9ibG9ja3RpbWVfJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV9zZXJpYWxfJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0Xyc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2xpYnJhcnlfJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X3N0YWNrc2l6ZV8nOjprbXBfZ2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9zdGFja3NpemVfc18nOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2Jsb2NrdGltZV8nOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9saWJyYXJ5Xyc6OmttcF9nZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9hZmZpbml0eV8nOjprbXBfc2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2FmZmluaXR5Xyc6OmttcF9nZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2NfJzo6a21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrXyc6OmttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza18nOjprbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX21hbGxvY18nOjprbXBfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfY2FsbG9jXyc6OmttcF9jYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9yZWFsbG9jXyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZnJlZV8nOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X3dhcm5pbmdzX29uXyc6OmttcF9zZXRfd2FybmluZ3Nfb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfd2FybmluZ3Nfb2ZmXyc6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXNfJzo6a21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzCisKKyFkZWMkIGVuZGlmCisKKyFkZWMkIGlmIGRlZmluZWQoX19BUFBMRV9fKQorCishKioqCishKioqIFRoZSBNYWMgZW50cnkgcG9pbnRzIGFyZSBpbiBsb3dlcmNhc2UsIHdpdGggYW4gYm90aCBhbiB1bmRlcnNjb3JlCishKioqIGFwcGVuZGVkIGFuZCBhbiB1bmRlcnNjb3JlIHByZXBlbmRlZC4KKyEqKioKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbnVtX3RocmVhZHNfJzo6b21wX3NldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfZHluYW1pY18nOjpvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X25lc3RlZF8nOjpvbXBfc2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbnVtX3RocmVhZHNfJzo6b21wX2dldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbWF4X3RocmVhZHNfJzo6b21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfdGhyZWFkX251bV8nOjpvbXBfZ2V0X3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X251bV9wcm9jc18nOjpvbXBfZ2V0X251bV9wcm9jcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbl9wYXJhbGxlbF8nOjpvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X2R5bmFtaWNfJzo6b21wX2dldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9uZXN0ZWRfJzo6b21wX2dldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3RocmVhZF9saW1pdF8nOjpvbXBfZ2V0X3RocmVhZF9saW1pdAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHNfJzo6b21wX3NldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHNfJzo6b21wX2dldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbGV2ZWxfJzo6b21wX2dldF9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfYWN0aXZlX2xldmVsXyc6Om9tcF9nZXRfYWN0aXZlX2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtXyc6Om9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfdGVhbV9zaXplXyc6Om9tcF9nZXRfdGVhbV9zaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9zY2hlZHVsZV8nOjpvbXBfc2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9zY2hlZHVsZV8nOjpvbXBfZ2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9wcm9jX2JpbmRfJyA6OiBvbXBfZ2V0X3Byb2NfYmluZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfd3RpbWVfJzo6b21wX2dldF93dGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfd3RpY2tfJzo6b21wX2dldF93dGljaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbnVtX3RlYW1zXyc6Om9tcF9nZXRfbnVtX3RlYW1zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF90ZWFtX251bV8nOjpvbXBfZ2V0X3RlYW1fbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9jYW5jZWxsYXRpb25fJzo6b21wX2dldF9jYW5jZWxsYXRpb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaXNfaW5pdGlhbF9kZXZpY2VfJzo6b21wX2lzX2luaXRpYWxfZGV2aWNlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9sb2NrXyc6Om9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9sb2NrXyc6Om9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X2xvY2tfJzo6b21wX3NldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X2xvY2tfJzo6b21wX3Vuc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9sb2NrXyc6Om9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9uZXN0X2xvY2tfJzo6b21wX2luaXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2Rlc3Ryb3lfbmVzdF9sb2NrXyc6Om9tcF9kZXN0cm95X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbmVzdF9sb2NrXyc6Om9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X25lc3RfbG9ja18nOjpvbXBfdW5zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Rlc3RfbmVzdF9sb2NrXyc6Om9tcF90ZXN0X25lc3RfbG9jaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9zdGFja3NpemVfJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9zZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2Jsb2NrdGltZV8nOjprbXBfc2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV9zZXJpYWxfJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kXyc6OmttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXRfJzo6a21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2xpYnJhcnlfJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9zdGFja3NpemVfJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9nZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2Jsb2NrdGltZV8nOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfbGlicmFyeV8nOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2FmZmluaXR5Xyc6OmttcF9zZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2FmZmluaXR5Xyc6OmttcF9nZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jXyc6OmttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfJzo6a21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza18nOjprbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9tYWxsb2NfJzo6a21wX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9jYWxsb2NfJzo6a21wX2NhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9yZWFsbG9jXyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2ZyZWVfJzo6a21wX2ZyZWUKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfd2FybmluZ3Nfb25fJzo6a21wX3NldF93YXJuaW5nc19vbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfd2FybmluZ3Nfb2ZmXyc6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXNfJzo6a21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzCisKKyFkZWMkIGVuZGlmCisKKyAgICAgIGVuZCBtb2R1bGUgb21wX2xpYgorCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzQwL29tcF9saWIuZjkwLnZhciBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvb21wX2xpYi5mOTAudmFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZTgwMjYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzQwL29tcF9saWIuZjkwLnZhcgpAQCAtMCwwICsxLDQ0OCBAQAorISBpbmNsdWRlLzQwL29tcF9saWIuZjkwLnZhcgorCishCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEvLworIS8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyEvLworIS8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyEvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyEvLworIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishCisKKyAgICAgIG1vZHVsZSBvbXBfbGliX2tpbmRzCisKKyAgICAgICAgdXNlLCBpbnRyaW5zaWMgOjogaXNvX2NfYmluZGluZworCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfaW50ZWdlcl9raW5kICAgICAgID0gY19pbnQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2dpY2FsX2tpbmQgICAgICAgPSA0CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfcmVhbF9raW5kICAgICAgICAgID0gY19mbG9hdAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX2RvdWJsZV9raW5kICAgICAgICA9IGNfZG91YmxlCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbG9ja19raW5kICAgICAgICAgID0gY19pbnRwdHJfdAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX25lc3RfbG9ja19raW5kICAgICA9IGNfaW50cHRyX3QKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9raW5kICAgICAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX2tpbmQgICAgID0gb21wX2ludGVnZXJfa2luZAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3BvaW50ZXJfa2luZCAgICAgICA9IGNfaW50cHRyX3QKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9zaXplX3Rfa2luZCAgICAgICAgPSBjX3NpemVfdAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX2FmZmluaXR5X21hc2tfa2luZCA9IGNfaW50cHRyX3QKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9jYW5jZWxfa2luZCAgICAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisKKyAgICAgIGVuZCBtb2R1bGUgb21wX2xpYl9raW5kcworCisgICAgICBtb2R1bGUgb21wX2xpYgorCisgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IG9wZW5tcF92ZXJzaW9uICAgID0gQExJQk9NUF9PTVBfWUVBUl9NT05USEAKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21ham9yID0gQExJQk9NUF9WRVJTSU9OX01BSk9SQAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWlub3IgPSBATElCT01QX1ZFUlNJT05fTUlOT1JACisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9idWlsZCA9IEBMSUJPTVBfVkVSU0lPTl9CVUlMREAKKyAgICAgICAgY2hhcmFjdGVyKCopICAgICAgICAgICAgICAga21wX2J1aWxkX2RhdGUKKyAgICAgICAgcGFyYW1ldGVyKCBrbXBfYnVpbGRfZGF0ZSA9ICdATElCT01QX0JVSUxEX0RBVEVAJyApCisKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9zdGF0aWMgID0gMQorICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2R5bmFtaWMgPSAyCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfZ3VpZGVkICA9IDMKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9hdXRvICAgID0gNAorCisKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9mYWxzZSA9IDAKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF90cnVlID0gMQorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX21hc3RlciA9IDIKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9jbG9zZSA9IDMKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9zcHJlYWQgPSA0CisKKyAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfY2FuY2VsX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF9wYXJhbGxlbCA9IDEKKyAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfY2FuY2VsX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF9sb29wID0gMgorICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX3NlY3Rpb25zID0gMworICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX3Rhc2tncm91cCA9IDQKKworICAgICAgICBpbnRlcmZhY2UKKworISAgICAgICAgICoqKgorISAgICAgICAgICoqKiBvbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgICAqKioKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkcyhudGhyZWFkcykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IG50aHJlYWRzCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkcworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWMoZW5hYmxlKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSwgdmFsdWUgOjogZW5hYmxlCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkKGVuYWJsZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCksIHZhbHVlIDo6IGVuYWJsZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV90aHJlYWRzKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fdGhyZWFkcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV90aHJlYWRzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9tYXhfdGhyZWFkcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9udW0oKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RocmVhZF9udW0KKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV9wcm9jcygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3Byb2NzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfaW5fcGFyYWxsZWwoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfaW5fcGFyYWxsZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfaW5fZmluYWwoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfaW5fZmluYWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2luX2ZpbmFsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2R5bmFtaWMoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X2R5bmFtaWMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9keW5hbWljCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X25lc3RlZCgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfbmVzdGVkCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9saW1pdCgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGhyZWFkX2xpbWl0CisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX2xpbWl0CisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMobWF4X2xldmVscykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IG1heF9sZXZlbHMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2xldmVsKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9sZXZlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2xldmVsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbCgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfYWN0aXZlX2xldmVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfYWN0aXZlX2xldmVsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0obGV2ZWwpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbGV2ZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fc2l6ZShsZXZlbCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90ZWFtX3NpemUKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGxldmVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9zaXplCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfc2NoZWR1bGUoa2luZCwgbW9kaWZpZXIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9zY2hlZF9raW5kKSwgdmFsdWUgOjoga2luZAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbW9kaWZpZXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X3NjaGVkdWxlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9nZXRfc2NoZWR1bGUoa2luZCwgbW9kaWZpZXIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9zY2hlZF9raW5kKSBraW5kCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG1vZGlmaWVyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9wcm9jX2JpbmQoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpIG9tcF9nZXRfcHJvY19iaW5kCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfcHJvY19iaW5kCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3d0aW1lKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIHJlYWwgKGtpbmQ9a21wX2RvdWJsZV9raW5kKSBvbXBfZ2V0X3d0aW1lCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfd3RpbWUKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2soKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgcmVhbCAoa2luZD1rbXBfZG91YmxlX2tpbmQpIG9tcF9nZXRfd3RpY2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGljaworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9kZWZhdWx0X2RldmljZSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9kZWZhdWx0X2RldmljZQorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlKGRmbHRfZGV2aWNlKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogZGZsdF9kZXZpY2UKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV9kZXZpY2VzKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fZGV2aWNlcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV9kZXZpY2VzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV90ZWFtcygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3RlYW1zCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RlYW1zCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fbnVtKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90ZWFtX251bQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fbnVtCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2NhbmNlbGxhdGlvbigpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfY2FuY2VsbGF0aW9uCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfY2FuY2VsbGF0aW9uCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfaXNfaW5pdGlhbF9kZXZpY2UoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfaXNfaW5pdGlhbF9kZXZpY2UKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2lzX2luaXRpYWxfZGV2aWNlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2luaXRfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2Rlc3Ryb3lfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfc2V0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF91bnNldF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF90ZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfdGVzdF9sb2NrCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2luaXRfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3NldF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF91bnNldF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Rlc3RfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX3Rlc3RfbmVzdF9sb2NrCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sKKworISAgICAgICAgICoqKgorISAgICAgICAgICoqKiBrbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgICAqKioKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUoc2l6ZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zKHNpemUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lKG1zZWMpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBtc2VjCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9ibG9ja3RpbWUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbCgpIGJpbmQoYykKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kKCkgYmluZChjKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0KCkgYmluZChjKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeShsaWJudW0pIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBsaWJudW0KKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9kZWZhdWx0cyhzdHJpbmcpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSwgaW50cmluc2ljIDo6IGlzb19jX2JpbmRpbmcKKyAgICAgICAgICAgIGNoYXJhY3RlciAoa2luZD1jX2NoYXIpIDo6IHN0cmluZygqKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9zdGFja3NpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3MoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIGttcF9nZXRfc3RhY2tzaXplX3MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2Jsb2NrdGltZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5KCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9saWJyYXJ5CisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eShtYXNrKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfc2V0X2FmZmluaXR5CisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eShtYXNrKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5CisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sobWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrKG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHByb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfbWFsbG9jKHNpemUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9tYWxsb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfbWFsbG9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfY2FsbG9jKG5lbGVtLCBlbHNpemUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9jYWxsb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogbmVsZW0KKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogZWxzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9jYWxsb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9yZWFsbG9jKHB0ciwgc2l6ZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX3JlYWxsb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCksIHZhbHVlIDo6IHB0cgorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9yZWFsbG9jCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9mcmVlKHB0cikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCksIHZhbHVlIDo6IHB0cgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9mcmVlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24oKSBiaW5kKGMpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbgorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29mZigpIGJpbmQoYykKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29mZgorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzKGNhbmNlbGtpbmQpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCksIHZhbHVlIDo6IGNhbmNlbGtpbmQKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cworCisgICAgICAgIGVuZCBpbnRlcmZhY2UKKworICAgICAgZW5kIG1vZHVsZSBvbXBfbGliCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzQwL29tcF9saWIuaC52YXIgYi9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzQwL29tcF9saWIuaC52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MxMzRmZAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvb21wX2xpYi5oLnZhcgpAQCAtMCwwICsxLDU1OCBAQAorISBpbmNsdWRlLzQwL29tcF9saWIuaC52YXIKKworIQorIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishLy8KKyEvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCishLy8KKyEvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCishLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCishLy8KKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIQorCishKioqCishKioqIFNvbWUgb2YgdGhlIGRpcmVjdGl2ZXMgZm9yIHRoZSBmb2xsb3dpbmcgcm91dGluZSBleHRlbmQgcGFzdCBjb2x1bW4gNzIsCishKioqIHNvIHByb2Nlc3MgdGhpcyBmaWxlIGluIDEzMi1jb2x1bW4gbW9kZS4KKyEqKioKKworIURJUiQgZml4ZWRmb3JtbGluZXNpemU6MTMyCisKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfaW50ZWdlcl9raW5kICAgICAgID0gNAorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2dpY2FsX2tpbmQgICAgICAgPSA0CisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3JlYWxfa2luZCAgICAgICAgICA9IDQKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbG9ja19raW5kICAgICAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbmVzdF9sb2NrX2tpbmQgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfa2luZCAgICAgICAgID0gb21wX2ludGVnZXJfa2luZAorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfa2luZCAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3BvaW50ZXJfa2luZCAgICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3NpemVfdF9raW5kICAgICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX2FmZmluaXR5X21hc2tfa2luZCA9IGludF9wdHJfa2luZCgpCisKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBvcGVubXBfdmVyc2lvbiAgICA9IEBMSUJPTVBfT01QX1lFQVJfTU9OVEhACisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWFqb3IgPSBATElCT01QX1ZFUlNJT05fTUFKT1JACisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWlub3IgPSBATElCT01QX1ZFUlNJT05fTUlOT1JACisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fYnVpbGQgPSBATElCT01QX1ZFUlNJT05fQlVJTERACisgICAgICBjaGFyYWN0ZXIoKikgICAgICAgICAgICAgICBrbXBfYnVpbGRfZGF0ZQorICAgICAgcGFyYW1ldGVyKCBrbXBfYnVpbGRfZGF0ZSA9ICdATElCT01QX0JVSUxEX0RBVEVAJyApCisKKyAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfc3RhdGljICA9IDEKKyAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfZHluYW1pYyA9IDIKKyAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfZ3VpZGVkICA9IDMKKyAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfYXV0byAgICA9IDQKKworICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9mYWxzZSA9IDAKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfdHJ1ZSA9IDEKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfbWFzdGVyID0gMgorICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9jbG9zZSA9IDMKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfc3ByZWFkID0gNAorCisgICAgICBpbnRlcmZhY2UKKworISAgICAgICAqKioKKyEgICAgICAgKioqIG9tcF8qIGVudHJ5IHBvaW50cworISAgICAgICAqKioKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMobnRocmVhZHMpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBudGhyZWFkcworICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWMoZW5hYmxlKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSwgdmFsdWUgOjogZW5hYmxlCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0ZWQoZW5hYmxlKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSwgdmFsdWUgOjogZW5hYmxlCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcygpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3RocmVhZHMKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9tYXhfdGhyZWFkcworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkcworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bSgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGhyZWFkX251bQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV9wcm9jcworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MKKworICAgICAgICBmdW5jdGlvbiBvbXBfaW5fcGFyYWxsZWwoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfaW5fcGFyYWxsZWwKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9pbl9maW5hbCgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pbl9maW5hbAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2luX2ZpbmFsCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9keW5hbWljKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2dldF9keW5hbWljCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2R5bmFtaWMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X25lc3RlZCgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfbmVzdGVkCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X25lc3RlZAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX2xpbWl0KCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90aHJlYWRfbGltaXQKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX2xpbWl0CisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzKG1heF9sZXZlbHMpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBtYXhfbGV2ZWxzCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbGV2ZWwoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2xldmVsCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2xldmVsCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9hY3RpdmVfbGV2ZWwoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9hY3RpdmVfbGV2ZWwKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0obGV2ZWwpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGxldmVsCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fc2l6ZShsZXZlbCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90ZWFtX3NpemUKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBsZXZlbAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90ZWFtX3NpemUKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfc2NoZWR1bGUoa2luZCwgbW9kaWZpZXIpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9zY2hlZF9raW5kKSwgdmFsdWUgOjoga2luZAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IG1vZGlmaWVyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfc2NoZWR1bGUKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9nZXRfc2NoZWR1bGUoa2luZCwgbW9kaWZpZXIpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9zY2hlZF9raW5kKSBraW5kCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBtb2RpZmllcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZ2V0X3NjaGVkdWxlCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9wcm9jX2JpbmQoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpIG9tcF9nZXRfcHJvY19iaW5kCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3Byb2NfYmluZAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfd3RpbWUoKSBiaW5kKGMpCisgICAgICAgICAgZG91YmxlIHByZWNpc2lvbiBvbXBfZ2V0X3d0aW1lCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3d0aW1lCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGljaygpIGJpbmQoYykKKyAgICAgICAgICBkb3VibGUgcHJlY2lzaW9uIG9tcF9nZXRfd3RpY2sKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2sKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9kZWZhdWx0X2RldmljZQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9kZWZhdWx0X2RldmljZQorCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9kZWZhdWx0X2RldmljZShkZmx0X2RldmljZSkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGRmbHRfZGV2aWNlCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV9kZXZpY2VzKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fZGV2aWNlcworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fZGV2aWNlcworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RlYW1zKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fdGVhbXMKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RlYW1zCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF90ZWFtX251bSgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGVhbV9udW0KKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9udW0KKworICAgICAgICBmdW5jdGlvbiBvbXBfaXNfaW5pdGlhbF9kZXZpY2UoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfaXNfaW5pdGlhbF9kZXZpY2UKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9pc19pbml0aWFsX2RldmljZQorCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfaW5pdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9kZXN0cm95X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfc2V0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3Vuc2V0X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Vuc2V0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrCisKKyAgICAgICAgZnVuY3Rpb24gb21wX3Rlc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfdGVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX3Rlc3RfbG9jaworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9pbml0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X25lc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfc2V0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3Vuc2V0X25lc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfdW5zZXRfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sKKworICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Rlc3RfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX3Rlc3RfbmVzdF9sb2NrCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9jaworCishICAgICAgICoqKgorISAgICAgICAqKioga21wXyogZW50cnkgcG9pbnRzCishICAgICAgICoqKgorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUoc2l6ZSkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3Moc2l6ZSkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZShtc2VjKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbXNlYworICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZQorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbCgpIGJpbmQoYykKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbAorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQoKSBiaW5kKGMpCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dCgpIGJpbmQoYykKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeShsaWJudW0pIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBsaWJudW0KKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5CisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzKHN0cmluZykgYmluZChjKQorICAgICAgICAgIGNoYXJhY3RlciBzdHJpbmcoKikKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9kZWZhdWx0cworCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9zdGFja3NpemUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcygpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkga21wX2dldF9zdGFja3NpemVfcworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcworCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9ibG9ja3RpbWUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5KCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9saWJyYXJ5CisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkKKworICAgICAgICBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5KG1hc2spIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9zZXRfYWZmaW5pdHkKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHkKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5KG1hc2spIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHkKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHkKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworCisgICAgICAgIHN1YnJvdXRpbmUga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrKG1hc2spIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrKG1hc2spIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworCisgICAgICAgIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogcHJvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICBmdW5jdGlvbiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBwcm9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBwcm9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgIGZ1bmN0aW9uIGttcF9tYWxsb2Moc2l6ZSkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX21hbGxvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX21hbGxvYworCisgICAgICAgIGZ1bmN0aW9uIGttcF9jYWxsb2MobmVsZW0sIGVsc2l6ZSkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX2NhbGxvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogbmVsZW0KKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IGVsc2l6ZQorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2NhbGxvYworCisgICAgICAgIGZ1bmN0aW9uIGttcF9yZWFsbG9jKHB0ciwgc2l6ZSkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX3JlYWxsb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpLCB2YWx1ZSA6OiBwdHIKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9yZWFsbG9jCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfZnJlZShwdHIpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpLCB2YWx1ZSA6OiBwdHIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2ZyZWUKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24oKSBiaW5kKGMpCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24KKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmKCkgYmluZChjKQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29mZgorCisgICAgICBlbmQgaW50ZXJmYWNlCisKKyFESVIkIElGIERFRklORUQgKF9fSU5URUxfT0ZGTE9BRCkKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3NldF9udW1fdGhyZWFkcworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfc2V0X2R5bmFtaWMKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3NldF9uZXN0ZWQKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9udW1fdGhyZWFkcworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X21heF90aHJlYWRzCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfdGhyZWFkX251bQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X251bV9wcm9jcworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfaW5fcGFyYWxsZWwKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2luX2ZpbmFsCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfZHluYW1pYworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X25lc3RlZAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X3RocmVhZF9saW1pdAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9sZXZlbAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF90ZWFtX3NpemUKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3NldF9zY2hlZHVsZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X3NjaGVkdWxlCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfcHJvY19iaW5kCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfd3RpbWUKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF93dGljaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2lzX2luaXRpYWxfZGV2aWNlCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfbnVtX2RldmljZXMKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9udW1fdGVhbXMKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF90ZWFtX251bQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfaW5pdF9sb2NrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9kZXN0cm95X2xvY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3NldF9sb2NrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF91bnNldF9sb2NrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF90ZXN0X2xvY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2luaXRfbmVzdF9sb2NrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9kZXN0cm95X25lc3RfbG9jaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfc2V0X25lc3RfbG9jaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfdW5zZXRfbmVzdF9sb2NrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF90ZXN0X25lc3RfbG9jaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X3N0YWNrc2l6ZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X3N0YWNrc2l6ZV9zCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfYmxvY2t0aW1lCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF9saWJyYXJ5CishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfZGVmYXVsdHMKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2dldF9zdGFja3NpemUKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2dldF9zdGFja3NpemVfcworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfZ2V0X2Jsb2NrdGltZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfZ2V0X2xpYnJhcnkKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF9hZmZpbml0eQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfZ2V0X2FmZmluaXR5CishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfbWFsbG9jCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9jYWxsb2MKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3JlYWxsb2MKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2ZyZWUKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF93YXJuaW5nc19vbgorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X3dhcm5pbmdzX29mZgorCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfc2V0X251bV90aHJlYWRzICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9zZXRfZHluYW1pYyApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfc2V0X25lc3RlZCApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X251bV90aHJlYWRzICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfbWF4X3RocmVhZHMgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF90aHJlYWRfbnVtICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfbnVtX3Byb2NzICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9pbl9wYXJhbGxlbCApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfaW5fZmluYWwgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9keW5hbWljICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfbmVzdGVkICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfdGhyZWFkX2xpbWl0ICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9tYXhfYWN0aXZlX2xldmVscyApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X2xldmVsICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfYWN0aXZlX2xldmVsICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bSApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X3RlYW1fc2l6ZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfc2V0X3NjaGVkdWxlICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfc2NoZWR1bGUgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9wcm9jX2JpbmQgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF93dGltZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X3d0aWNrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3NldF9kZWZhdWx0X2RldmljZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfaXNfaW5pdGlhbF9kZXZpY2UgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9udW1fZGV2aWNlcyApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X251bV90ZWFtcyApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X3RlYW1fbnVtICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9pbml0X2xvY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2Rlc3Ryb3lfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfc2V0X2xvY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3Vuc2V0X2xvY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3Rlc3RfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfaW5pdF9uZXN0X2xvY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2Rlc3Ryb3lfbmVzdF9sb2NrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9zZXRfbmVzdF9sb2NrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF91bnNldF9uZXN0X2xvY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3Rlc3RfbmVzdF9sb2NrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfc3RhY2tzaXplICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfc3RhY2tzaXplX3MgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9ibG9ja3RpbWUgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9saWJyYXJ5X3NlcmlhbCApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZCApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dCApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X2xpYnJhcnkgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9kZWZhdWx0cyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfZ2V0X3N0YWNrc2l6ZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfZ2V0X3N0YWNrc2l6ZV9zICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9nZXRfYmxvY2t0aW1lICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9nZXRfbGlicmFyeSApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X2FmZmluaXR5ICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9nZXRfYWZmaW5pdHkgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2dldF9hZmZpbml0eV9tYXhfcHJvYyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzayApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9tYWxsb2MgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2NhbGxvYyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfcmVhbGxvYyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfZnJlZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X3dhcm5pbmdzX29uICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfd2FybmluZ3Nfb2ZmICkKKyFESVIkIEVORElGCishRElSJCBFTkRJRgorCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzQwL29tcHQuaC52YXIgYi9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzQwL29tcHQuaC52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E4YzMwYwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvb21wdC5oLnZhcgpAQCAtMCwwICsxLDQ4NyBAQAorLyoKKyAqIGluY2x1ZGUvNDAvb21wdC5oLnZhcgorICovCisKKyNpZm5kZWYgX19PTVBUX18KKyNkZWZpbmUgX19PTVBUX18KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBzeXN0ZW0gaW5jbHVkZSBmaWxlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGl0ZXJhdGlvbiBtYWNyb3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBGT1JFQUNIX09NUFRfSU5RVUlSWV9GTihtYWNybykgIFwKKyAgICBtYWNybyAob21wdF9lbnVtZXJhdGVfc3RhdGUpICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3NldF9jYWxsYmFjaykgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9nZXRfY2FsbGJhY2spICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2dldF9pZGxlX2ZyYW1lKSAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9nZXRfdGFza19mcmFtZSkgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2dldF9zdGF0ZSkgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZ2V0X3BhcmFsbGVsX2lkKSAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2dldF9wYXJhbGxlbF90ZWFtX3NpemUpIFwKKyAgICBtYWNybyAob21wdF9nZXRfdGFza19pZCkgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZ2V0X3RocmVhZF9pZCkKKworI2RlZmluZSBGT1JFQUNIX09NUFRfUExBQ0VIT0xERVJfRk4obWFjcm8pICBcCisgICAgbWFjcm8gKG9tcHRfaWRsZSkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9vdmVyaGVhZCkgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2JhcnJpZXJfd2FpdCkgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfdGFza193YWl0KSAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9tdXRleF93YWl0KQorCisjZGVmaW5lIEZPUkVBQ0hfT01QVF9TVEFURShtYWNybykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogZmlyc3QgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfZmlyc3QsIDB4NzEpICAgICAgICAgIC8qIGluaXRpYWwgZW51bWVyYXRpb24gc3RhdGUgKi8gICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogd29yayBzdGF0ZXMgKDAuLjE1KSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfd29ya19zZXJpYWwsIDB4MDApICAgIC8qIHdvcmtpbmcgb3V0c2lkZSBwYXJhbGxlbCAqLyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfd29ya19wYXJhbGxlbCwgMHgwMSkgIC8qIHdvcmtpbmcgd2l0aGluIHBhcmFsbGVsICovICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfd29ya19yZWR1Y3Rpb24sIDB4MDIpIC8qIHBlcmZvcm1pbmcgYSByZWR1Y3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogaWRsZSAoMTYuLjMxKSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfaWRsZSwgMHgxMCkgICAgICAgICAgICAvKiB3YWl0aW5nIGZvciB3b3JrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogb3ZlcmhlYWQgc3RhdGVzICgzMi4uNjMpICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfb3ZlcmhlYWQsIDB4MjApICAgICAgICAvKiBvdmVyaGVhZCBleGNsdWRpbmcgd2FpdCBzdGF0ZXMgKi8gICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogYmFycmllciB3YWl0IHN0YXRlcyAoNjQuLjc5KSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfd2FpdF9iYXJyaWVyLCAweDQwKSAgICAvKiB3YWl0aW5nIGF0IGEgYmFycmllciAqLyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfd2FpdF9iYXJyaWVyX2ltcGxpY2l0LCAweDQxKSAgICAvKiBpbXBsaWNpdCBiYXJyaWVyICovICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfd2FpdF9iYXJyaWVyX2V4cGxpY2l0LCAweDQyKSAgICAvKiBleHBsaWNpdCBiYXJyaWVyICovICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogdGFzayB3YWl0IHN0YXRlcyAoODAuLjk1KSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfd2FpdF90YXNrd2FpdCwgMHg1MCkgICAvKiB3YWl0aW5nIGF0IGEgdGFza3dhaXQgKi8gICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfd2FpdF90YXNrZ3JvdXAsIDB4NTEpICAvKiB3YWl0aW5nIGF0IGEgdGFza2dyb3VwICovICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogbXV0ZXggd2FpdCBzdGF0ZXMgKDk2Li4xMTEpICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfd2FpdF9sb2NrLCAweDYwKSAgICAgICAvKiB3YWl0aW5nIGZvciBsb2NrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfd2FpdF9uZXN0X2xvY2ssIDB4NjEpICAvKiB3YWl0aW5nIGZvciBuZXN0IGxvY2sgKi8gICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfd2FpdF9jcml0aWNhbCwgMHg2MikgICAvKiB3YWl0aW5nIGZvciBjcml0aWNhbCAqLyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfd2FpdF9hdG9taWMsIDB4NjMpICAgICAvKiB3YWl0aW5nIGZvciBhdG9taWMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfd2FpdF9vcmRlcmVkLCAweDY0KSAgICAvKiB3YWl0aW5nIGZvciBvcmRlcmVkICovICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfd2FpdF9zaW5nbGUsIDB4NkYpICAgICAvKiB3YWl0aW5nIGZvciBzaW5nbGUgcmVnaW9uIChub24tc3RhbmRhcmQhKSAqLyAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogbWlzYyAoMTEyLi4xMjcpICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfdW5kZWZpbmVkLCAweDcwKSAgICAgICAvKiB1bmRlZmluZWQgdGhyZWFkIHN0YXRlICovCisKKworI2RlZmluZSBGT1JFQUNIX09NUFRfRVZFTlQobWFjcm8pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyotLS0gTWFuZGF0b3J5IEV2ZW50cyAtLS0qLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3BhcmFsbGVsX2JlZ2luLCAgICAgICAgICAgb21wdF9uZXdfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAxKSAvKiBwYXJhbGxlbCBiZWdpbiAqLyAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9wYXJhbGxlbF9lbmQsICAgICAgICAgICAgIG9tcHRfZW5kX3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgMikgLyogcGFyYWxsZWwgZW5kICovICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3Rhc2tfYmVnaW4sICAgICAgICAgICAgICAgb21wdF9uZXdfdGFza19jYWxsYmFja190LCAgICAgICAzKSAvKiB0YXNrIGJlZ2luICovICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF90YXNrX2VuZCwgICAgICAgICAgICAgICAgIG9tcHRfdGFza19jYWxsYmFja190LCAgICAgICAgICAgNCkgLyogdGFzayBkZXN0cm95ICovICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3RocmVhZF9iZWdpbiwgICAgICAgICAgICAgb21wdF90aHJlYWRfdHlwZV9jYWxsYmFja190LCAgICA1KSAvKiB0aHJlYWQgYmVnaW4gKi8gICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF90aHJlYWRfZW5kLCAgICAgICAgICAgICAgIG9tcHRfdGhyZWFkX3R5cGVfY2FsbGJhY2tfdCwgICAgNikgLyogdGhyZWFkIGVuZCAqLyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2NvbnRyb2wsICAgICAgICAgICAgICAgICAgb21wdF9jb250cm9sX2NhbGxiYWNrX3QsICAgICAgICA3KSAvKiBzdXBwb3J0IGNvbnRyb2wgY2FsbHMgKi8gIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfcnVudGltZV9zaHV0ZG93biwgICAgICAgICBvbXB0X2NhbGxiYWNrX3QsICAgICAgICAgICAgICAgIDgpIC8qIHJ1bnRpbWUgc2h1dGRvd24gKi8gICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKi0tLSBPcHRpb25hbCBFdmVudHMgKGJsYW1lIHNoaWZ0aW5nLCBvbXB0X2V2ZW50X3VuaW1wbGVtZW50ZWQpIC0tLSovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfaWRsZV9iZWdpbiwgICAgICAgICAgICAgICBvbXB0X3RocmVhZF9jYWxsYmFja190LCAgICAgICAgIDkpIC8qIGJlZ2luIGlkbGUgc3RhdGUgKi8gICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2lkbGVfZW5kLCAgICAgICAgICAgICAgICAgb21wdF90aHJlYWRfY2FsbGJhY2tfdCwgICAgICAgIDEwKSAvKiBlbmQgaWRsZSBzdGF0ZSAqLyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF9iYXJyaWVyX2JlZ2luLCAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMTEpIC8qIGJlZ2luIHdhaXQgYXQgYmFycmllciAqLyAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfYmFycmllcl9lbmQsICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDEyKSAvKiBlbmQgd2FpdCBhdCBiYXJyaWVyICovICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF90YXNrd2FpdF9iZWdpbiwgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMTMpIC8qIGJlZ2luIHdhaXQgYXQgdGFza3dhaXQgKi8gXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfdGFza3dhaXRfZW5kLCAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDE0KSAvKiBlbmQgd2FpdCBhdCB0YXNrd2FpdCAqLyAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF90YXNrZ3JvdXBfYmVnaW4sICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMTUpIC8qIGJlZ2luIHdhaXQgYXQgdGFza2dyb3VwICovXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfdGFza2dyb3VwX2VuZCwgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDE2KSAvKiBlbmQgd2FpdCBhdCB0YXNrZ3JvdXAgKi8gIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfcmVsZWFzZV9sb2NrLCAgICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgMTcpIC8qIGxvY2sgcmVsZWFzZSAqLyAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3JlbGVhc2VfbmVzdF9sb2NrX2xhc3QsICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDE4KSAvKiBsYXN0IG5lc3QgbG9jayByZWxlYXNlICovIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9yZWxlYXNlX2NyaXRpY2FsLCAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICAxOSkgLyogY3JpdGljYWwgcmVsZWFzZSAqLyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3JlbGVhc2VfYXRvbWljLCAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDIwKSAvKiBhdG9taWMgcmVsZWFzZSAqLyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfcmVsZWFzZV9vcmRlcmVkLCAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgMjEpIC8qIG9yZGVyZWQgcmVsZWFzZSAqLyAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKi0tLSBPcHRpb25hbCBFdmVudHMgKHN5bmNocm9ub3VzIGV2ZW50cywgb21wdF9ldmVudF91bmltcGxlbWVudGVkKSAtLS0gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbiwgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMjIpIC8qIGltcGxpY2l0IHRhc2sgYmVnaW4gICAqLyAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kLCAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDIzKSAvKiBpbXBsaWNpdCB0YXNrIGVuZCAgKi8gICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfaW5pdGlhbF90YXNrX2JlZ2luLCAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMjQpIC8qIGluaXRpYWwgdGFzayBiZWdpbiAgICovICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2luaXRpYWxfdGFza19lbmQsICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDI1KSAvKiBpbml0aWFsIHRhc2sgZW5kICAqLyAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGFza19zd2l0Y2gsICAgICAgICAgICAgICBvbXB0X3Rhc2tfcGFpcl9jYWxsYmFja190LCAgICAgMjYpIC8qIHRhc2sgc3dpdGNoICovICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9sb29wX2JlZ2luLCAgICAgICAgICAgICAgIG9tcHRfbmV3X3dvcmtzaGFyZV9jYWxsYmFja190LCAyNykgLyogdGFzayBhdCBsb29wIGJlZ2luICovICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfbG9vcF9lbmQsICAgICAgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMjgpIC8qIHRhc2sgYXQgbG9vcCBlbmQgKi8gICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9zZWN0aW9uc19iZWdpbiwgICAgICAgICAgIG9tcHRfbmV3X3dvcmtzaGFyZV9jYWxsYmFja190LCAyOSkgLyogdGFzayBhdCBzZWN0aW9ucyBiZWdpbiAgKi9cCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfc2VjdGlvbnNfZW5kLCAgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMzApIC8qIHRhc2sgYXQgc2VjdGlvbnMgZW5kICovICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9zaW5nbGVfaW5fYmxvY2tfYmVnaW4sICAgIG9tcHRfbmV3X3dvcmtzaGFyZV9jYWxsYmFja190LCAzMSkgLyogdGFzayBhdCBzaW5nbGUgYmVnaW4qLyAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfc2luZ2xlX2luX2Jsb2NrX2VuZCwgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMzIpIC8qIHRhc2sgYXQgc2luZ2xlIGVuZCAqLyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9zaW5nbGVfb3RoZXJzX2JlZ2luLCAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAzMykgLyogdGFzayBhdCBzaW5nbGUgYmVnaW4gKi8gICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfc2luZ2xlX290aGVyc19lbmQsICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMzQpIC8qIHRhc2sgYXQgc2luZ2xlIGVuZCAqLyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93b3Jrc2hhcmVfYmVnaW4sICAgICAgICAgIG9tcHRfbmV3X3dvcmtzaGFyZV9jYWxsYmFja190LCAzNSkgLyogdGFzayBhdCB3b3Jrc2hhcmUgYmVnaW4gKi9cCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd29ya3NoYXJlX2VuZCwgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMzYpIC8qIHRhc2sgYXQgd29ya3NoYXJlIGVuZCAqLyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9tYXN0ZXJfYmVnaW4sICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAzNykgLyogdGFzayBhdCBtYXN0ZXIgYmVnaW4gKi8gICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfbWFzdGVyX2VuZCwgICAgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMzgpIC8qIHRhc2sgYXQgbWFzdGVyIGVuZCAqLyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9iYXJyaWVyX2JlZ2luLCAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAzOSkgLyogdGFzayBhdCBiYXJyaWVyIGJlZ2luICAqLyBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfYmFycmllcl9lbmQsICAgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgNDApIC8qIHRhc2sgYXQgYmFycmllciBlbmQgKi8gICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF90YXNrd2FpdF9iZWdpbiwgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICA0MSkgLyogdGFzayBhdCB0YXNrd2FpdCBiZWdpbiAqLyBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGFza3dhaXRfZW5kLCAgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgNDIpIC8qIHRhc2sgYXQgdGFzayB3YWl0IGVuZCAqLyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF90YXNrZ3JvdXBfYmVnaW4sICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICA0MykgLyogdGFzayBhdCB0YXNrZ3JvdXAgYmVnaW4gKi9cCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGFza2dyb3VwX2VuZCwgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgNDQpIC8qIHRhc2sgYXQgdGFza2dyb3VwIGVuZCAqLyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9yZWxlYXNlX25lc3RfbG9ja19wcmV2LCAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA0NSkgLyogcHJldiBuZXN0IGxvY2sgcmVsZWFzZSAqLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfbG9jaywgICAgICAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDQ2KSAvKiBsb2NrIHdhaXQgKi8gICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X25lc3RfbG9jaywgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA0NykgLyogbmVzdCBsb2NrIHdhaXQgKi8gICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF9jcml0aWNhbCwgICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNDgpIC8qIGNyaXRpY2FsIHdhaXQgKi8gICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfYXRvbWljLCAgICAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDQ5KSAvKiBhdG9taWMgd2FpdCAqLyAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X29yZGVyZWQsICAgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA1MCkgLyogb3JkZXJlZCB3YWl0ICovICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2FjcXVpcmVkX2xvY2ssICAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDUxKSAvKiBsb2NrIGFjcXVpcmVkICovICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9hY3F1aXJlZF9uZXN0X2xvY2tfZmlyc3QsIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA1MikgLyogMXN0IG5lc3QgbG9jayBhY3F1aXJlZCAqLyBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfYWNxdWlyZWRfbmVzdF9sb2NrX25leHQsICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTMpIC8qIG5leHQgbmVzdCBsb2NrIGFjcXVpcmVkKi8gXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2FjcXVpcmVkX2NyaXRpY2FsLCAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDU0KSAvKiBjcml0aWNhbCBhY3F1aXJlZCAqLyAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9hY3F1aXJlZF9hdG9taWMsICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA1NSkgLyogYXRvbWljIGFjcXVpcmVkICovICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfYWNxdWlyZWRfb3JkZXJlZCwgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTYpIC8qIG9yZGVyZWQgYWNxdWlyZWQgKi8gICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pbml0X2xvY2ssICAgICAgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA1NykgLyogbG9jayBpbml0ICovICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfaW5pdF9uZXN0X2xvY2ssICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTgpIC8qIG5lc3QgbG9jayBpbml0ICovICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9kZXN0cm95X2xvY2ssICAgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA1OSkgLyogbG9jayBkZXN0cnVjdGlvbiAqLyAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfZGVzdHJveV9uZXN0X2xvY2ssICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNjApIC8qIG5lc3QgbG9jayBkZXN0cnVjdGlvbiAqLyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9mbHVzaCwgICAgICAgICAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tfdCwgICAgICAgICAgICAgICA2MSkgLyogYWZ0ZXIgZXhlY3V0aW5nIGZsdXNoICovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGRhdGEgdHlwZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGlkZW50aWZpZXJzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgdWludDY0X3Qgb21wdF90aHJlYWRfaWRfdDsKKyNkZWZpbmUgb21wdF90aHJlYWRfaWRfbm9uZSAoKG9tcHRfdGhyZWFkX2lkX3QpIDApICAgICAvKiBub24tc3RhbmRhcmQgKi8KKwordHlwZWRlZiB1aW50NjRfdCBvbXB0X3Rhc2tfaWRfdDsKKyNkZWZpbmUgb21wdF90YXNrX2lkX25vbmUgKChvbXB0X3Rhc2tfaWRfdCkgMCkgICAgICAgICAvKiBub24tc3RhbmRhcmQgKi8KKwordHlwZWRlZiB1aW50NjRfdCBvbXB0X3BhcmFsbGVsX2lkX3Q7CisjZGVmaW5lIG9tcHRfcGFyYWxsZWxfaWRfbm9uZSAoKG9tcHRfcGFyYWxsZWxfaWRfdCkgMCkgLyogbm9uLXN0YW5kYXJkICovCisKK3R5cGVkZWYgdWludDY0X3Qgb21wdF93YWl0X2lkX3Q7CisjZGVmaW5lIG9tcHRfd2FpdF9pZF9ub25lICgob21wdF93YWl0X2lkX3QpIDApICAgICAgICAgLyogbm9uLXN0YW5kYXJkICovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIG9tcHRfZnJhbWVfdAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIHN0cnVjdCBvbXB0X2ZyYW1lX3MgeworICAgIHZvaWQgKmV4aXRfcnVudGltZV9mcmFtZTsgICAgLyogbmV4dCBmcmFtZSBpcyB1c2VyIGNvZGUgICAgICovCisgICAgdm9pZCAqcmVlbnRlcl9ydW50aW1lX2ZyYW1lOyAvKiBwcmV2aW91cyBmcmFtZSBpcyB1c2VyIGNvZGUgKi8KK30gb21wdF9mcmFtZV90OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZW51bWVyYXRpb25zIGZvciB0aHJlYWQgc3RhdGVzIGFuZCBydW50aW1lIGV2ZW50cworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogcnVudGltZSBzdGF0ZXMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordHlwZWRlZiBlbnVtIHsKKyNkZWZpbmUgb21wdF9zdGF0ZV9tYWNybyhzdGF0ZSwgY29kZSkgc3RhdGUgPSBjb2RlLAorICAgIEZPUkVBQ0hfT01QVF9TVEFURShvbXB0X3N0YXRlX21hY3JvKQorI3VuZGVmIG9tcHRfc3RhdGVfbWFjcm8KK30gb21wdF9zdGF0ZV90OworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBydW50aW1lIGV2ZW50cworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIGVudW0geworI2RlZmluZSBvbXB0X2V2ZW50X21hY3JvKGV2ZW50LCBjYWxsYmFjaywgZXZlbnRpZCkgZXZlbnQgPSBldmVudGlkLAorICAgIEZPUkVBQ0hfT01QVF9FVkVOVChvbXB0X2V2ZW50X21hY3JvKQorI3VuZGVmIG9tcHRfZXZlbnRfbWFjcm8KK30gb21wdF9ldmVudF90OworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBzZXQgY2FsbGJhY2sgcmVzdWx0cworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBlbnVtIHsKKyAgICBvbXB0X3NldF9yZXN1bHRfcmVnaXN0cmF0aW9uX2Vycm9yICAgICAgICAgICAgICA9IDAsCisgICAgb21wdF9zZXRfcmVzdWx0X2V2ZW50X21heV9vY2N1cl9ub19jYWxsYmFjayAgICAgPSAxLAorICAgIG9tcHRfc2V0X3Jlc3VsdF9ldmVudF9uZXZlcl9vY2N1cnMgICAgICAgICAgICAgID0gMiwKKyAgICBvbXB0X3NldF9yZXN1bHRfZXZlbnRfbWF5X29jY3VyX2NhbGxiYWNrX3NvbWUgICA9IDMsCisgICAgb21wdF9zZXRfcmVzdWx0X2V2ZW50X21heV9vY2N1cl9jYWxsYmFja19hbHdheXMgPSA0LAorfSBvbXB0X3NldF9yZXN1bHRfdDsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY2FsbGJhY2sgc2lnbmF0dXJlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBpbml0aWFsaXphdGlvbiAqLwordHlwZWRlZiB2b2lkICgqb21wdF9pbnRlcmZhY2VfZm5fdCkodm9pZCk7CisKK3R5cGVkZWYgb21wdF9pbnRlcmZhY2VfZm5fdCAoKm9tcHRfZnVuY3Rpb25fbG9va3VwX3QpKAorICAgIGNvbnN0IGNoYXIgKiAgICAgICAgICAgICAgICAgICAgICAvKiBlbnRyeSBwb2ludCB0byBsb29rIHVwICAgICAgICovCispOworCisvKiB0aHJlYWRzICovCit0eXBlZGVmIHZvaWQgKCpvbXB0X3RocmVhZF9jYWxsYmFja190KSAoCisgICAgb21wdF90aHJlYWRfaWRfdCB0aHJlYWRfaWQgICAgICAgIC8qIElEIG9mIHRocmVhZCAgICAgICAgICAgICAgICAgKi8KKyk7CisKK3R5cGVkZWYgZW51bSB7CisgICAgb21wdF90aHJlYWRfaW5pdGlhbCA9IDEsIC8vIHN0YXJ0IHRoZSBlbnVtZXJhdGlvbiBhdCAxCisgICAgb21wdF90aHJlYWRfd29ya2VyICA9IDIsCisgICAgb21wdF90aHJlYWRfb3RoZXIgICA9IDMKK30gb21wdF90aHJlYWRfdHlwZV90OworCit0eXBlZGVmIGVudW0geworICAgIG9tcHRfaW52b2tlcl9wcm9ncmFtID0gMCwgICAgICAgICAvKiBwcm9ncmFtIGludm9rZXMgbWFzdGVyIHRhc2sgICovCisgICAgb21wdF9pbnZva2VyX3J1bnRpbWUgPSAxICAgICAgICAgIC8qIHJ1bnRpbWUgaW52b2tlcyBtYXN0ZXIgdGFzayAgKi8KK30gb21wdF9pbnZva2VyX3Q7CisKK3R5cGVkZWYgdm9pZCAoKm9tcHRfdGhyZWFkX3R5cGVfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfdGhyZWFkX3R5cGVfdCB0aHJlYWRfdHlwZSwgICAvKiB0eXBlIG9mIHRocmVhZCAgICAgICAgICAgICAgICovCisgICAgb21wdF90aHJlYWRfaWRfdCB0aHJlYWRfaWQgICAgICAgIC8qIElEIG9mIHRocmVhZCAgICAgICAgICAgICAgICAgKi8KKyk7CisKK3R5cGVkZWYgdm9pZCAoKm9tcHRfd2FpdF9jYWxsYmFja190KSAoCisgICAgb21wdF93YWl0X2lkX3Qgd2FpdF9pZCAgICAgICAgICAgIC8qIHdhaXQgaWQgICAgICAgICAgICAgICAgICAgICAgKi8KKyk7CisKKy8qIHBhcmFsbGVsIGFuZCB3b3Jrc2hhcmVzICovCit0eXBlZGVmIHZvaWQgKCpvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3BhcmFsbGVsX2lkX3QgcGFyYWxsZWxfaWQsICAgIC8qIGlkIG9mIHBhcmFsbGVsIHJlZ2lvbiAgICAgICAqLworICAgIG9tcHRfdGFza19pZF90IHRhc2tfaWQgICAgICAgICAgICAgLyogaWQgb2YgdGFzayAgICAgICAgICAgICAgICAgICovCispOworCit0eXBlZGVmIHZvaWQgKCpvbXB0X25ld193b3Jrc2hhcmVfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBwYXJhbGxlbF9pZCwgICAvKiBpZCBvZiBwYXJhbGxlbCByZWdpb24gICAgICAgICovCisgICAgb21wdF90YXNrX2lkX3QgcGFyZW50X3Rhc2tfaWQsICAgIC8qIGlkIG9mIHBhcmVudCB0YXNrICAgICAgICAgICAgKi8KKyAgICB2b2lkICp3b3Jrc2hhcmVfZnVuY3Rpb24gICAgICAgICAgLyogcG9pbnRlciB0byBvdXRsaW5lZCBmdW5jdGlvbiAqLworKTsKKwordHlwZWRlZiB2b2lkICgqb21wdF9uZXdfcGFyYWxsZWxfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfdGFza19pZF90IHBhcmVudF90YXNrX2lkLCAgICAvKiBpZCBvZiBwYXJlbnQgdGFzayAgICAgICAgICAgICovCisgICAgb21wdF9mcmFtZV90ICpwYXJlbnRfdGFza19mcmFtZSwgIC8qIGZyYW1lIGRhdGEgb2YgcGFyZW50IHRhc2sgICAgKi8KKyAgICBvbXB0X3BhcmFsbGVsX2lkX3QgcGFyYWxsZWxfaWQsICAgLyogaWQgb2YgcGFyYWxsZWwgcmVnaW9uICAgICAgICAqLworICAgIHVpbnQzMl90IHJlcXVlc3RlZF90ZWFtX3NpemUsICAgICAvKiBudW1iZXIgb2YgdGhyZWFkcyBpbiB0ZWFtICAgICovCisgICAgdm9pZCAqcGFyYWxsZWxfZnVuY3Rpb24sICAgICAgICAgIC8qIHBvaW50ZXIgdG8gb3V0bGluZWQgZnVuY3Rpb24gKi8KKyAgICBvbXB0X2ludm9rZXJfdCBpbnZva2VyICAgICAgICAgICAgLyogd2hvIGludm9rZXMgbWFzdGVyIHRhc2s/ICAgICAqLworKTsKKwordHlwZWRlZiB2b2lkICgqb21wdF9lbmRfcGFyYWxsZWxfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBwYXJhbGxlbF9pZCwgICAvKiBpZCBvZiBwYXJhbGxlbCByZWdpb24gICAgICAgKi8KKyAgICBvbXB0X3Rhc2tfaWRfdCB0YXNrX2lkLCAgICAgICAgICAgLyogaWQgb2YgdGFzayAgICAgICAgICAgICAgICAgICovCisgICAgb21wdF9pbnZva2VyX3QgaW52b2tlciAgICAgICAgICAgIC8qIHdobyBpbnZva2VzIG1hc3RlciB0YXNrPyAgICAqLyAKKyk7CisKKy8qIHRhc2tzICovCit0eXBlZGVmIHZvaWQgKCpvbXB0X3Rhc2tfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfdGFza19pZF90IHRhc2tfaWQgICAgICAgICAgICAvKiBpZCBvZiB0YXNrICAgICAgICAgICAgICAgICAgICovCispOworCit0eXBlZGVmIHZvaWQgKCpvbXB0X3Rhc2tfcGFpcl9jYWxsYmFja190KSAoCisgICAgb21wdF90YXNrX2lkX3QgZmlyc3RfdGFza19pZCwKKyAgICBvbXB0X3Rhc2tfaWRfdCBzZWNvbmRfdGFza19pZAorKTsKKwordHlwZWRlZiB2b2lkICgqb21wdF9uZXdfdGFza19jYWxsYmFja190KSAoCisgICAgb21wdF90YXNrX2lkX3QgcGFyZW50X3Rhc2tfaWQsICAgIC8qIGlkIG9mIHBhcmVudCB0YXNrICAgICAgICAgICAgKi8KKyAgICBvbXB0X2ZyYW1lX3QgKnBhcmVudF90YXNrX2ZyYW1lLCAgLyogZnJhbWUgZGF0YSBmb3IgcGFyZW50IHRhc2sgICAqLworICAgIG9tcHRfdGFza19pZF90ICBuZXdfdGFza19pZCwgICAgICAvKiBpZCBvZiBjcmVhdGVkIHRhc2sgICAgICAgICAgICovCisgICAgdm9pZCAqdGFza19mdW5jdGlvbiAgICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gb3V0bGluZWQgZnVuY3Rpb24gKi8KKyk7CisKKy8qIHByb2dyYW0gKi8KK3R5cGVkZWYgdm9pZCAoKm9tcHRfY29udHJvbF9jYWxsYmFja190KSAoCisgICAgdWludDY0X3QgY29tbWFuZCwgICAgICAgICAgICAgICAgIC8qIGNvbW1hbmQgb2YgY29udHJvbCBjYWxsICAgICAgKi8KKyAgICB1aW50NjRfdCBtb2RpZmllciAgICAgICAgICAgICAgICAgLyogbW9kaWZpZXIgb2YgY29udHJvbCBjYWxsICAgICAqLworKTsKKwordHlwZWRlZiB2b2lkICgqb21wdF9jYWxsYmFja190KSh2b2lkKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogb21wdCBBUEkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgT01QVF9BUElfRk5UWVBFKGZuKSBmbiMjX3QKKworI2RlZmluZSBPTVBUX0FQSV9GVU5DVElPTihyZXR1cm5fdHlwZSwgZm4sIGFyZ3MpICBcCisgICAgdHlwZWRlZiByZXR1cm5fdHlwZSAoKk9NUFRfQVBJX0ZOVFlQRShmbikpIGFyZ3MKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJTlFVSVJZIEZVTkNUSU9OUworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogc3RhdGUgKi8KK09NUFRfQVBJX0ZVTkNUSU9OKG9tcHRfc3RhdGVfdCwgb21wdF9nZXRfc3RhdGUsICgKKyAgICBvbXB0X3dhaXRfaWRfdCAqb21wdF93YWl0X2lkCispKTsKKworLyogdGhyZWFkICovCitPTVBUX0FQSV9GVU5DVElPTihvbXB0X3RocmVhZF9pZF90LCBvbXB0X2dldF90aHJlYWRfaWQsICh2b2lkKSk7CisKK09NUFRfQVBJX0ZVTkNUSU9OKHZvaWQgKiwgb21wdF9nZXRfaWRsZV9mcmFtZSwgKHZvaWQpKTsKKworLyogcGFyYWxsZWwgcmVnaW9uICovCitPTVBUX0FQSV9GVU5DVElPTihvbXB0X3BhcmFsbGVsX2lkX3QsIG9tcHRfZ2V0X3BhcmFsbGVsX2lkLCAoCisgICAgaW50IGFuY2VzdG9yX2xldmVsCispKTsKKworT01QVF9BUElfRlVOQ1RJT04oaW50LCBvbXB0X2dldF9wYXJhbGxlbF90ZWFtX3NpemUsICgKKyAgICBpbnQgYW5jZXN0b3JfbGV2ZWwKKykpOworCisvKiB0YXNrICovCitPTVBUX0FQSV9GVU5DVElPTihvbXB0X3Rhc2tfaWRfdCwgb21wdF9nZXRfdGFza19pZCwgKAorICAgIGludCBkZXB0aAorKSk7CisKK09NUFRfQVBJX0ZVTkNUSU9OKG9tcHRfZnJhbWVfdCAqLCBvbXB0X2dldF90YXNrX2ZyYW1lLCAoCisgICAgaW50IGRlcHRoCispKTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQTEFDRUhPTERFUlMgRk9SIFBFUkZPUk1BTkNFIFJFUE9SVElORworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogaWRsZSAqLworT01QVF9BUElfRlVOQ1RJT04odm9pZCwgb21wdF9pZGxlLCAoCisgICAgdm9pZAorKSk7CisKKy8qIG92ZXJoZWFkICovCitPTVBUX0FQSV9GVU5DVElPTih2b2lkLCBvbXB0X292ZXJoZWFkLCAoCisgICAgdm9pZAorKSk7CisKKy8qIGJhcnJpZXIgd2FpdCAqLworT01QVF9BUElfRlVOQ1RJT04odm9pZCwgb21wdF9iYXJyaWVyX3dhaXQsICgKKyAgICB2b2lkCispKTsKKworLyogdGFzayB3YWl0ICovCitPTVBUX0FQSV9GVU5DVElPTih2b2lkLCBvbXB0X3Rhc2tfd2FpdCwgKAorICAgIHZvaWQKKykpOworCisvKiBtdXRleCB3YWl0ICovCitPTVBUX0FQSV9GVU5DVElPTih2b2lkLCBvbXB0X211dGV4X3dhaXQsICgKKyAgICB2b2lkCispKTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJTklUSUFMSVpBVElPTiBGVU5DVElPTlMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK09NUFRfQVBJX0ZVTkNUSU9OKHZvaWQsIG9tcHRfaW5pdGlhbGl6ZSwgKAorICAgIG9tcHRfZnVuY3Rpb25fbG9va3VwX3Qgb21wdF9mbl9sb29rdXAsCisgICAgY29uc3QgY2hhciAqcnVudGltZV92ZXJzaW9uLAorICAgIHVuc2lnbmVkIGludCBvbXB0X3ZlcnNpb24KKykpOworCisKKy8qIGluaXRpYWxpemF0aW9uIGludGVyZmFjZSB0byBiZSBkZWZpbmVkIGJ5IHRvb2wgKi8KK29tcHRfaW5pdGlhbGl6ZV90IG9tcHRfdG9vbCh2b2lkKTsKKwordHlwZWRlZiBlbnVtIG9wdF9pbml0X21vZGVfZSB7CisgICAgb21wdF9pbml0X21vZGVfbmV2ZXIgID0gMCwKKyAgICBvbXB0X2luaXRfbW9kZV9mYWxzZSAgPSAxLAorICAgIG9tcHRfaW5pdF9tb2RlX3RydWUgICA9IDIsCisgICAgb21wdF9pbml0X21vZGVfYWx3YXlzID0gMworfSBvbXB0X2luaXRfbW9kZV90OworCitPTVBUX0FQSV9GVU5DVElPTihpbnQsIG9tcHRfc2V0X2NhbGxiYWNrLCAoCisgICAgb21wdF9ldmVudF90IGV2ZW50LAorICAgIG9tcHRfY2FsbGJhY2tfdCBjYWxsYmFjaworKSk7CisKK3R5cGVkZWYgZW51bSBvbXB0X3NldF9jYWxsYmFja19yY19lIHsgIC8qIG5vbi1zdGFuZGFyZCAqLworICAgIG9tcHRfc2V0X2NhbGxiYWNrX2Vycm9yICAgICAgPSAwLAorICAgIG9tcHRfaGFzX2V2ZW50X25vX2NhbGxiYWNrICAgPSAxLAorICAgIG9tcHRfbm9fZXZlbnRfbm9fY2FsbGJhY2sgICAgPSAyLAorICAgIG9tcHRfaGFzX2V2ZW50X21heV9jYWxsYmFjayAgPSAzLAorICAgIG9tcHRfaGFzX2V2ZW50X211c3RfY2FsbGJhY2sgPSA0LAorfSBvbXB0X3NldF9jYWxsYmFja19yY190OworCisKK09NUFRfQVBJX0ZVTkNUSU9OKGludCwgb21wdF9nZXRfY2FsbGJhY2ssICgKKyAgICBvbXB0X2V2ZW50X3QgZXZlbnQsCisgICAgb21wdF9jYWxsYmFja190ICpjYWxsYmFjaworKSk7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTUlTQ0VMTEFORU9VUyBGVU5DVElPTlMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGNvbnRyb2wgKi8KKyNpZiBkZWZpbmVkKF9PUEVOTVApICYmIChfT1BFTk1QID49IDIwMTMwNykKKyNwcmFnbWEgb21wIGRlY2xhcmUgdGFyZ2V0CisjZW5kaWYKK3ZvaWQgb21wdF9jb250cm9sKAorICAgIHVpbnQ2NF90IGNvbW1hbmQsCisgICAgdWludDY0X3QgbW9kaWZpZXIKKyk7CisjaWYgZGVmaW5lZChfT1BFTk1QKSAmJiAoX09QRU5NUCA+PSAyMDEzMDcpCisjcHJhZ21hIG9tcCBlbmQgZGVjbGFyZSB0YXJnZXQKKyNlbmRpZgorCisvKiBzdGF0ZSBlbnVtZXJhdGlvbiAqLworT01QVF9BUElfRlVOQ1RJT04oaW50LCBvbXB0X2VudW1lcmF0ZV9zdGF0ZSwgKAorICAgIGludCBjdXJyZW50X3N0YXRlLAorICAgIGludCAqbmV4dF9zdGF0ZSwKKyAgICBjb25zdCBjaGFyICoqbmV4dF9zdGF0ZV9uYW1lCispKTsKKworI2lmZGVmICBfX2NwbHVzcGx1cworfTsKKyNlbmRpZgorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS80MS9vbXAuaC52YXIgYi9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzQxL29tcC5oLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDlmYTQzCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS80MS9vbXAuaC52YXIKQEAgLTAsMCArMSwxNzYgQEAKKy8qCisgKiBpbmNsdWRlLzQxL29tcC5oLnZhcgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIF9fT01QX0gKKyMgICBkZWZpbmUgX19PTVBfSAorCisjICAgZGVmaW5lIEtNUF9WRVJTSU9OX01BSk9SICAgIEBMSUJPTVBfVkVSU0lPTl9NQUpPUkAKKyMgICBkZWZpbmUgS01QX1ZFUlNJT05fTUlOT1IgICAgQExJQk9NUF9WRVJTSU9OX01JTk9SQAorIyAgIGRlZmluZSBLTVBfVkVSU0lPTl9CVUlMRCAgICBATElCT01QX1ZFUlNJT05fQlVJTERACisjICAgZGVmaW5lIEtNUF9CVUlMRF9EQVRFICAgICAgICJATElCT01QX0JVSUxEX0RBVEVAIgorCisjICAgaWZkZWYgX19jcGx1c3BsdXMKKyAgICBleHRlcm4gIkMiIHsKKyMgICBlbmRpZgorCisjICAgaWYgZGVmaW5lZChfV0lOMzIpCisjICAgICAgIGRlZmluZSBfX0tBSV9LTVBDX0NPTlZFTlRJT04gX19jZGVjbAorIyAgIGVsc2UKKyMgICAgICAgZGVmaW5lIF9fS0FJX0tNUENfQ09OVkVOVElPTgorIyAgIGVuZGlmCisKKyAgICAvKiBzY2hlZHVsZSBraW5kIGNvbnN0YW50cyAqLworICAgIHR5cGVkZWYgZW51bSBvbXBfc2NoZWRfdCB7CisJb21wX3NjaGVkX3N0YXRpYyAgPSAxLAorCW9tcF9zY2hlZF9keW5hbWljID0gMiwKKwlvbXBfc2NoZWRfZ3VpZGVkICA9IDMsCisJb21wX3NjaGVkX2F1dG8gICAgPSA0CisgICAgfSBvbXBfc2NoZWRfdDsKKworICAgIC8qIHNldCBBUEkgZnVuY3Rpb25zICovCisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfbnVtX3RocmVhZHMgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfZHluYW1pYyAgICAgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfbmVzdGVkICAgICAgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfc2NoZWR1bGUgICAgICAgICAgKG9tcF9zY2hlZF90LCBpbnQpOworCisgICAgLyogcXVlcnkgQVBJIGZ1bmN0aW9ucyAqLworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X251bV90aHJlYWRzICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfZHluYW1pYyAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9uZXN0ZWQgICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X21heF90aHJlYWRzICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfdGhyZWFkX251bSAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9udW1fcHJvY3MgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfaW5fcGFyYWxsZWwgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9pbl9maW5hbCAgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9hY3RpdmVfbGV2ZWwgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9sZXZlbCAgICAgICAgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtIChpbnQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3RlYW1fc2l6ZSAgICAgICAgICAgKGludCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfdGhyZWFkX2xpbWl0ICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfc2NoZWR1bGUgICAgICAgICAgICAob21wX3NjaGVkX3QgKiwgaW50ICopOworCisgICAgLyogbG9jayBBUEkgZnVuY3Rpb25zICovCisgICAgdHlwZWRlZiBzdHJ1Y3Qgb21wX2xvY2tfdCB7CisgICAgICAgIHZvaWQgKiBfbGs7CisgICAgfSBvbXBfbG9ja190OworCisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9pbml0X2xvY2sgICAgKG9tcF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfbG9jayAgICAgKG9tcF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF91bnNldF9sb2NrICAgKG9tcF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9kZXN0cm95X2xvY2sgKG9tcF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF90ZXN0X2xvY2sgICAgKG9tcF9sb2NrX3QgKik7CisKKyAgICAvKiBuZXN0ZWQgbG9jayBBUEkgZnVuY3Rpb25zICovCisgICAgdHlwZWRlZiBzdHJ1Y3Qgb21wX25lc3RfbG9ja190IHsKKyAgICAgICAgdm9pZCAqIF9sazsKKyAgICB9IG9tcF9uZXN0X2xvY2tfdDsKKworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfaW5pdF9uZXN0X2xvY2sgICAgKG9tcF9uZXN0X2xvY2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9uZXN0X2xvY2sgICAgIChvbXBfbmVzdF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF91bnNldF9uZXN0X2xvY2sgICAob21wX25lc3RfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZGVzdHJveV9uZXN0X2xvY2sgKG9tcF9uZXN0X2xvY2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3Rlc3RfbmVzdF9sb2NrICAgIChvbXBfbmVzdF9sb2NrX3QgKik7CisKKyAgICAvKiBsb2NrIGhpbnQgdHlwZSBmb3IgZHluYW1pYyB1c2VyIGxvY2sgKi8KKyAgICB0eXBlZGVmIGVudW0gb21wX2xvY2tfaGludF90IHsKKyAgICAgICAgb21wX2xvY2tfaGludF9ub25lICAgICAgICAgICA9IDAsCisgICAgICAgIG9tcF9sb2NrX2hpbnRfdW5jb250ZW5kZWQgICAgPSAxLAorICAgICAgICBvbXBfbG9ja19oaW50X2NvbnRlbmRlZCAgICAgID0gKDE8PDEgKSwKKyAgICAgICAgb21wX2xvY2tfaGludF9ub25zcGVjdWxhdGl2ZSA9ICgxPDwyICksCisgICAgICAgIG9tcF9sb2NrX2hpbnRfc3BlY3VsYXRpdmUgICAgPSAoMTw8MyApLAorICAgICAgICBrbXBfbG9ja19oaW50X2hsZSAgICAgICAgICAgID0gKDE8PDE2KSwKKyAgICAgICAga21wX2xvY2tfaGludF9ydG0gICAgICAgICAgICA9ICgxPDwxNyksCisgICAgICAgIGttcF9sb2NrX2hpbnRfYWRhcHRpdmUgICAgICAgPSAoMTw8MTgpCisgICAgfSBvbXBfbG9ja19oaW50X3Q7CisKKyAgICAvKiBoaW50ZWQgbG9jayBpbml0aWFsaXplcnMgKi8KKyAgICBleHRlcm4gdm9pZCBfX0tBSV9LTVBDX0NPTlZFTlRJT04gb21wX2luaXRfbG9ja193aXRoX2hpbnQob21wX2xvY2tfdCAqLCBvbXBfbG9ja19oaW50X3QpOworICAgIGV4dGVybiB2b2lkIF9fS0FJX0tNUENfQ09OVkVOVElPTiBvbXBfaW5pdF9uZXN0X2xvY2tfd2l0aF9oaW50KG9tcF9uZXN0X2xvY2tfdCAqLCBvbXBfbG9ja19oaW50X3QpOworCisgICAgLyogdGltZSBBUEkgZnVuY3Rpb25zICovCisgICAgZXh0ZXJuIGRvdWJsZSBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfd3RpbWUgKHZvaWQpOworICAgIGV4dGVybiBkb3VibGUgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3d0aWNrICh2b2lkKTsKKworICAgIC8qIE9wZW5NUCA0LjAgKi8KKyAgICBleHRlcm4gaW50ICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UgKHZvaWQpOworICAgIGV4dGVybiB2b2lkIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9kZWZhdWx0X2RldmljZSAoaW50KTsKKyAgICBleHRlcm4gaW50ICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9pc19pbml0aWFsX2RldmljZSAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X251bV9kZXZpY2VzICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbnVtX3RlYW1zICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfdGVhbV9udW0gKHZvaWQpOworICAgIGV4dGVybiBpbnQgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9jYW5jZWxsYXRpb24gKHZvaWQpOworCisjICAgaW5jbHVkZSA8c3RkbGliLmg+CisgICAgLyoga21wIEFQSSBmdW5jdGlvbnMgKi8KKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9zdGFja3NpemUgICAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X3N0YWNrc2l6ZSAgICAgICAgICAoaW50KTsKKyAgICBleHRlcm4gc2l6ZV90IF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9zdGFja3NpemVfcyAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X3N0YWNrc2l6ZV9zICAgICAgICAoc2l6ZV90KTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9ibG9ja3RpbWUgICAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2xpYnJhcnkgICAgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfYmxvY2t0aW1lICAgICAgICAgIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2xpYnJhcnkgICAgICAgICAgICAoaW50KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9saWJyYXJ5X3NlcmlhbCAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZCAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0ICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9kZWZhdWx0cyAgICAgICAgICAgKGNoYXIgY29uc3QgKik7CisKKyAgICAvKiBJbnRlbCBhZmZpbml0eSBBUEkgKi8KKyAgICB0eXBlZGVmIHZvaWQgKiBrbXBfYWZmaW5pdHlfbWFza190OworCisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfYWZmaW5pdHkgICAgICAgICAgICAgKGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfYWZmaW5pdHkgICAgICAgICAgICAgKGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sgICAgIChrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrICAgIChrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyAgIChpbnQsIGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MgKGludCwga21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MgICAoaW50LCBrbXBfYWZmaW5pdHlfbWFza190ICopOworCisgICAgLyogT3Blbk1QIDQuMCBhZmZpbml0eSBBUEkgKi8KKyAgICB0eXBlZGVmIGVudW0gb21wX3Byb2NfYmluZF90IHsKKyAgICAgICAgb21wX3Byb2NfYmluZF9mYWxzZSA9IDAsCisgICAgICAgIG9tcF9wcm9jX2JpbmRfdHJ1ZSA9IDEsCisgICAgICAgIG9tcF9wcm9jX2JpbmRfbWFzdGVyID0gMiwKKyAgICAgICAgb21wX3Byb2NfYmluZF9jbG9zZSA9IDMsCisgICAgICAgIG9tcF9wcm9jX2JpbmRfc3ByZWFkID0gNAorICAgIH0gb21wX3Byb2NfYmluZF90OworCisgICAgZXh0ZXJuIG9tcF9wcm9jX2JpbmRfdCBfX0tBSV9LTVBDX0NPTlZFTlRJT04gb21wX2dldF9wcm9jX2JpbmQgKHZvaWQpOworCisgICAgZXh0ZXJuIHZvaWQgKiBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9tYWxsb2MgIChzaXplX3QpOworICAgIGV4dGVybiB2b2lkICogX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfY2FsbG9jICAoc2l6ZV90LCBzaXplX3QpOworICAgIGV4dGVybiB2b2lkICogX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfcmVhbGxvYyAodm9pZCAqLCBzaXplX3QpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZnJlZSAgICAodm9pZCAqKTsKKworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X3dhcm5pbmdzX29uKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X3dhcm5pbmdzX29mZih2b2lkKTsKKworIyAgIHVuZGVmIF9fS0FJX0tNUENfQ09OVkVOVElPTgorCisgICAgLyogV2FybmluZzoKKyAgICAgICBUaGUgZm9sbG93aW5nIHR5cGVkZWZzIGFyZSBub3Qgc3RhbmRhcmQsIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLgorICAgICovCisgICAgdHlwZWRlZiBpbnQgICAgIG9tcF9pbnRfdDsKKyAgICB0eXBlZGVmIGRvdWJsZSAgb21wX3d0aW1lX3Q7CisKKyMgICBpZmRlZiBfX2NwbHVzcGx1cworICAgIH0KKyMgICBlbmRpZgorCisjZW5kaWYgLyogX19PTVBfSCAqLworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzQxL29tcF9saWIuZi52YXIgYi9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzQxL29tcF9saWIuZi52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgwMTkwOAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDEvb21wX2xpYi5mLnZhcgpAQCAtMCwwICsxLDc4OCBAQAorISBpbmNsdWRlLzQxL29tcF9saWIuZi52YXIKKworIQorIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishLy8KKyEvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCishLy8KKyEvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCishLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCishLy8KKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIQorCishKioqCishKioqIFNvbWUgb2YgdGhlIGRpcmVjdGl2ZXMgZm9yIHRoZSBmb2xsb3dpbmcgcm91dGluZSBleHRlbmQgcGFzdCBjb2x1bW4gNzIsCishKioqIHNvIHByb2Nlc3MgdGhpcyBmaWxlIGluIDEzMi1jb2x1bW4gbW9kZS4KKyEqKioKKworIWRlYyQgZml4ZWRmb3JtbGluZXNpemU6MTMyCisKKyAgICAgIG1vZHVsZSBvbXBfbGliX2tpbmRzCisKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9pbnRlZ2VyX2tpbmQgICAgICAgPSA0CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbG9naWNhbF9raW5kICAgICAgID0gNAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3JlYWxfa2luZCAgICAgICAgICA9IDQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2tpbmQgICAgICAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX25lc3RfbG9ja19raW5kICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfa2luZCAgICAgICAgID0gb21wX2ludGVnZXJfa2luZAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9raW5kICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9wb2ludGVyX2tpbmQgICAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3NpemVfdF9raW5kICAgICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfYWZmaW5pdHlfbWFza19raW5kID0gaW50X3B0cl9raW5kKCkKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9jYW5jZWxfa2luZCAgICAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X2tpbmQgICAgID0gb21wX2ludGVnZXJfa2luZAorCisgICAgICBlbmQgbW9kdWxlIG9tcF9saWJfa2luZHMKKworICAgICAgbW9kdWxlIG9tcF9saWIKKworICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9tYWpvciA9IEBMSUJPTVBfVkVSU0lPTl9NQUpPUkAKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21pbm9yID0gQExJQk9NUF9WRVJTSU9OX01JTk9SQAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fYnVpbGQgPSBATElCT01QX1ZFUlNJT05fQlVJTERACisgICAgICAgIGNoYXJhY3RlcigqKSwgcGFyYW1ldGVyIDo6IGttcF9idWlsZF9kYXRlICAgID0gJ0BMSUJPTVBfQlVJTERfREFURUAnCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBvcGVubXBfdmVyc2lvbiAgICA9IEBMSUJPTVBfT01QX1lFQVJfTU9OVEhACisKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9zdGF0aWMgID0gMQorICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2R5bmFtaWMgPSAyCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfZ3VpZGVkICA9IDMKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9hdXRvICAgID0gNAorCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfZmFsc2UgPSAwCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfdHJ1ZSA9IDEKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9tYXN0ZXIgPSAyCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfY2xvc2UgPSAzCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfc3ByZWFkID0gNAorCisgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2NhbmNlbF9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF9jYW5jZWxfcGFyYWxsZWwgPSAxCisgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2NhbmNlbF9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF9jYW5jZWxfbG9vcCA9IDIKKyAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfY2FuY2VsX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF9zZWN0aW9ucyA9IDMKKyAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfY2FuY2VsX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF90YXNrZ3JvdXAgPSA0CisKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19oaW50X2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX2xvY2tfaGludF9ub25lICAgICAgICAgICA9IDAKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19oaW50X2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX2xvY2tfaGludF91bmNvbnRlbmRlZCAgICA9IDEKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19oaW50X2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX2xvY2tfaGludF9jb250ZW5kZWQgICAgICA9IDIKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19oaW50X2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX2xvY2tfaGludF9ub25zcGVjdWxhdGl2ZSA9IDQKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19oaW50X2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX2xvY2tfaGludF9zcGVjdWxhdGl2ZSAgICA9IDgKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19oaW50X2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX2xvY2tfaGludF9obGUgICAgICAgICAgICA9IDY1NTM2CisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF9sb2NrX2hpbnRfcnRtICAgICAgICAgICAgPSAxMzEwNzIKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19oaW50X2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX2xvY2tfaGludF9hZGFwdGl2ZSAgICAgICA9IDI2MjE0NAorCisgICAgICAgIGludGVyZmFjZQorCishICAgICAgICAgKioqCishICAgICAgICAgKioqIG9tcF8qIGVudHJ5IHBvaW50cworISAgICAgICAgICoqKgorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzKG50aHJlYWRzKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbnRocmVhZHMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYyhlbmFibGUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBlbmFibGUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWMKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0ZWQoZW5hYmxlKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgZW5hYmxlCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0ZWQKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fdGhyZWFkcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV90aHJlYWRzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X3RocmVhZHMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGhyZWFkX251bQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9udW0KKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3Byb2NzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfaW5fcGFyYWxsZWwoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2luX3BhcmFsbGVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9keW5hbWljKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfZHluYW1pYworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2R5bmFtaWMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfbmVzdGVkCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9saW1pdCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RocmVhZF9saW1pdAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9saW1pdAorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzKG1heF9sZXZlbHMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBtYXhfbGV2ZWxzCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfYWN0aXZlX2xldmVscygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbGV2ZWwoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9sZXZlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2xldmVsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtKGxldmVsKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbGV2ZWwKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90ZWFtX3NpemUobGV2ZWwpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBsZXZlbAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RlYW1fc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fc2l6ZQorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X3NjaGVkdWxlKGtpbmQsIG1vZGlmaWVyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3NjaGVkX2tpbmQpIGtpbmQKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbW9kaWZpZXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X3NjaGVkdWxlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9nZXRfc2NoZWR1bGUoa2luZCwgbW9kaWZpZXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfc2NoZWRfa2luZCkga2luZAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBtb2RpZmllcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9nZXRfc2NoZWR1bGUKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfcHJvY19iaW5kKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCkgb21wX2dldF9wcm9jX2JpbmQKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9wcm9jX2JpbmQKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfd3RpbWUoKQorICAgICAgICAgICAgZG91YmxlIHByZWNpc2lvbiBvbXBfZ2V0X3d0aW1lCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfd3RpbWUKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2sgKCkKKyAgICAgICAgICAgIGRvdWJsZSBwcmVjaXNpb24gb21wX2dldF93dGljaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3d0aWNrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9kZWZhdWx0X2RldmljZQorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlKGRmbHRfZGV2aWNlKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgZGZsdF9kZXZpY2UKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV9kZXZpY2VzKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX2RldmljZXMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fZGV2aWNlcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fdGVhbXMoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fdGVhbXMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fdGVhbXMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9udW0oKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90ZWFtX251bQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fbnVtCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2NhbmNlbGxhdGlvbigpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2NhbmNlbGxhdGlvbgorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2NhbmNlbGxhdGlvbgorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2lzX2luaXRpYWxfZGV2aWNlKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pc19pbml0aWFsX2RldmljZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfaXNfaW5pdGlhbF9kZXZpY2UKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jayhsb2NrdmFyKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2luaXRfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2sobG9ja3ZhcikKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9kZXN0cm95X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2xvY2sobG9ja3ZhcikKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9zZXRfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3Vuc2V0X2xvY2sobG9ja3ZhcikKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF91bnNldF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrKGxvY2t2YXIpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfdGVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX3Rlc3RfbG9jaworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrKGxvY2t2YXIpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfaW5pdF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrKGxvY2t2YXIpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sobG9ja3ZhcikKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9zZXRfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3Vuc2V0X25lc3RfbG9jayhsb2NrdmFyKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Vuc2V0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9jayhsb2NrdmFyKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Rlc3RfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX3Rlc3RfbmVzdF9sb2NrCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sKKworISAgICAgICAgICoqKgorISAgICAgICAgICoqKiBrbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgICAqKioKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUoc2l6ZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHNpemUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zKHNpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIHNpemUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lKG1zZWMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBtc2VjCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9ibG9ja3RpbWUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbCgpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbAorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZCgpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQoKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeShsaWJudW0pCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBsaWJudW0KKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9kZWZhdWx0cyhzdHJpbmcpCisgICAgICAgICAgICBjaGFyYWN0ZXIqKCopIHN0cmluZworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfc3RhY2tzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkga21wX2dldF9zdGFja3NpemVfcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZSgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2Jsb2NrdGltZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5KCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfbGlicmFyeQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHkobWFzaykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9zZXRfYWZmaW5pdHkKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5CisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5KG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5CisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrKG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sobWFzaykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHByb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfbWFsbG9jKHNpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfbWFsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfbWFsbG9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfY2FsbG9jKG5lbGVtLCBlbHNpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfY2FsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgbmVsZW0KKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBlbHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2NhbGxvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3JlYWxsb2MocHRyLCBzaXplKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX3JlYWxsb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkgcHRyCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfcmVhbGxvYworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfZnJlZShwdHIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBwdHIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZnJlZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29uKCkKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29uCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmKCkKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29mZgorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzKGNhbmNlbGtpbmQpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfY2FuY2VsX2tpbmQpIGNhbmNlbGtpbmQKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfaW5pdF9sb2NrX3dpdGhfaGludChsb2NrdmFyLCBsb2NraGludCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSBsb2NraGludAorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9pbml0X2xvY2tfd2l0aF9oaW50CisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9pbml0X25lc3RfbG9ja193aXRoX2hpbnQobG9ja3ZhciwgbG9ja2hpbnQpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSBsb2NraGludAorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9pbml0X25lc3RfbG9ja193aXRoX2hpbnQKKworICAgICAgICBlbmQgaW50ZXJmYWNlCisKKyFkZWMkIGlmIGRlZmluZWQoX1dJTjMyKQorIWRlYyQgICBpZiBkZWZpbmVkKF9XSU42NCkgLm9yLiBkZWZpbmVkKF9NX0FNRDY0KQorCishKioqCishKioqIFRoZSBGb3J0cmFuIGVudHJ5IHBvaW50cyBtdXN0IGJlIGluIHVwcGVyY2FzZSwgZXZlbiBpZiB0aGUgL1Fsb3dlcmNhc2UKKyEqKiogb3B0aW9uIGlzIHNwZWNpZmllZC4gIFRoZSBhbGlhcyBhdHRyaWJ1dGUgZW5zdXJlcyB0aGF0IHRoZSBzcGVjaWZpZWQKKyEqKiogc3RyaW5nIGlzIHVzZWQgYXMgdGhlIGVudHJ5IHBvaW50LgorISoqKgorISoqKiBPbiB0aGUgV2luZG93cyogT1MgSUEtMzIgYXJjaGl0ZWN0dXJlLCB0aGUgRm9ydHJhbiBlbnRyeSBwb2ludHMgaGF2ZSBhbgorISoqKiB1bmRlcnNjb3JlIHByZXBlbmRlZC4gIE9uIHRoZSBXaW5kb3dzKiBPUyBJbnRlbChSKSA2NAorISoqKiBhcmNoaXRlY3R1cmUsIG5vIHVuZGVyc2NvcmUgaXMgcHJlcGVuZGVkLgorISoqKgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX05VTV9USFJFQURTJyA6OiBvbXBfc2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX0RZTkFNSUMnIDo6IG9tcF9zZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9ORVNURUQnIDo6IG9tcF9zZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05VTV9USFJFQURTJyA6OiBvbXBfZ2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX01BWF9USFJFQURTJyA6OiBvbXBfZ2V0X21heF90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1RIUkVBRF9OVU0nIDo6IG9tcF9nZXRfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9OVU1fUFJPQ1MnIDo6IG9tcF9nZXRfbnVtX3Byb2NzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfSU5fUEFSQUxMRUwnIDo6IG9tcF9pbl9wYXJhbGxlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9EWU5BTUlDJyA6OiBvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTkVTVEVEJyA6OiBvbXBfZ2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9USFJFQURfTElNSVQnIDo6IG9tcF9nZXRfdGhyZWFkX2xpbWl0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX01BWF9BQ1RJVkVfTEVWRUxTJyA6OiBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX01BWF9BQ1RJVkVfTEVWRUxTJyA6OiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0xFVkVMJyA6OiBvbXBfZ2V0X2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0FDVElWRV9MRVZFTCcgOjogb21wX2dldF9hY3RpdmVfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfQU5DRVNUT1JfVEhSRUFEX05VTScgOjogb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1RFQU1fU0laRScgOjogb21wX2dldF90ZWFtX3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfU0NIRURVTEUnIDo6IG9tcF9zZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfU0NIRURVTEUnIDo6IG9tcF9nZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfUFJPQ19CSU5EJyA6OiBvbXBfZ2V0X3Byb2NfYmluZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9XVElNRScgOjogb21wX2dldF93dGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9XVElDSycgOjogb21wX2dldF93dGljaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9ERUZBVUxUX0RFVklDRScgOjogb21wX2dldF9kZWZhdWx0X2RldmljZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9ERUZBVUxUX0RFVklDRScgOjogb21wX3NldF9kZWZhdWx0X2RldmljZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9OVU1fREVWSUNFUycgOjogb21wX2dldF9udW1fZGV2aWNlcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9OVU1fVEVBTVMnIDo6IG9tcF9nZXRfbnVtX3RlYW1zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1RFQU1fTlVNJyA6OiBvbXBfZ2V0X3RlYW1fbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0NBTkNFTExBVElPTicgOjogb21wX2dldF9jYW5jZWxsYXRpb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9JU19JTklUSUFMX0RFVklDRScgOjogb21wX2lzX2luaXRpYWxfZGV2aWNlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbml0X2xvY2snIDo6IG9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbml0X2xvY2tfd2l0aF9oaW50JyA6OiBvbXBfaW5pdF9sb2NrX3dpdGhfaGludAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2Rlc3Ryb3lfbG9jaycgOjogb21wX2Rlc3Ryb3lfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9sb2NrJyA6OiBvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9sb2NrJyA6OiBvbXBfdW5zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Rlc3RfbG9jaycgOjogb21wX3Rlc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbmVzdF9sb2NrJyA6OiBvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbml0X25lc3RfbG9ja193aXRoX2hpbnQnIDo6IG9tcF9pbml0X25lc3RfbG9ja193aXRoX2hpbnQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9kZXN0cm95X25lc3RfbG9jaycgOjogb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X25lc3RfbG9jaycgOjogb21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9uZXN0X2xvY2snIDo6IG9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF90ZXN0X25lc3RfbG9jaycgOjogb21wX3Rlc3RfbmVzdF9sb2NrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfU1RBQ0tTSVpFJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfU1RBQ0tTSVpFX1MnOjprbXBfc2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0JMT0NLVElNRSc6OmttcF9zZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUllfU0VSSUFMJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkQnOjprbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVQnOjprbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9MSUJSQVJZJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX1NUQUNLU0laRSc6OmttcF9nZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX1NUQUNLU0laRV9TJzo6a21wX2dldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9CTE9DS1RJTUUnOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9MSUJSQVJZJzo6a21wX2dldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0FGRklOSVRZJzo6a21wX3NldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9BRkZJTklUWSc6OmttcF9nZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfQUZGSU5JVFlfTUFYX1BST0MnOjprbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfQ1JFQVRFX0FGRklOSVRZX01BU0snOjprbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9ERVNUUk9ZX0FGRklOSVRZX01BU0snOjprbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfVU5TRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX01BTExPQyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9DQUxMT0MnOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfUkVBTExPQyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfRlJFRSc6OmttcF9mcmVlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfV0FSTklOR1NfT04nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX1dBUk5JTkdTX09GRic6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfQ0FOQ0VMTEFUSU9OX1NUQVRVUycgOjoga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzCisKKyFkZWMkICAgZWxzZQorCishKioqCishKioqIE9uIFdpbmRvd3MqIE9TIElBLTMyIGFyY2hpdGVjdHVyZSwgdGhlIEZvcnRyYW4gZW50cnkgcG9pbnRzIGhhdmUgYW4gdW5kZXJzY29yZSBwcmVwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX05VTV9USFJFQURTJyA6OiBvbXBfc2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9EWU5BTUlDJyA6OiBvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX05FU1RFRCcgOjogb21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX05VTV9USFJFQURTJyA6OiBvbXBfZ2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9NQVhfVEhSRUFEUycgOjogb21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfVEhSRUFEX05VTScgOjogb21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9OVU1fUFJPQ1MnIDo6IG9tcF9nZXRfbnVtX3Byb2NzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0lOX1BBUkFMTEVMJyA6OiBvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0RZTkFNSUMnIDo6IG9tcF9nZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTkVTVEVEJyA6OiBvbXBfZ2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfVEhSRUFEX0xJTUlUJyA6OiBvbXBfZ2V0X3RocmVhZF9saW1pdAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfTUFYX0FDVElWRV9MRVZFTFMnIDo6IG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX01BWF9BQ1RJVkVfTEVWRUxTJyA6OiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9MRVZFTCcgOjogb21wX2dldF9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfQUNUSVZFX0xFVkVMJyA6OiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfQU5DRVNUT1JfVEhSRUFEX05VTScgOjogb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9URUFNX1NJWkUnIDo6IG9tcF9nZXRfdGVhbV9zaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9TQ0hFRFVMRScgOjogb21wX3NldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfU0NIRURVTEUnIDo6IG9tcF9nZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1BST0NfQklORCcgOjogb21wX2dldF9wcm9jX2JpbmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1dUSU1FJyA6OiBvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9XVElDSycgOjogb21wX2dldF93dGljaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfREVGQVVMVF9ERVZJQ0UnIDo6IG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX0RFRkFVTFRfREVWSUNFJyA6OiBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9OVU1fREVWSUNFUycgOjogb21wX2dldF9udW1fZGV2aWNlcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTlVNX1RFQU1TJyA6OiBvbXBfZ2V0X251bV90ZWFtcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfVEVBTV9OVU0nIDo6IG9tcF9nZXRfdGVhbV9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0NBTkNFTExBVElPTicgOjogb21wX2dldF9jYW5jZWxsYXRpb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfSVNfSU5JVElBTF9ERVZJQ0UnIDo6IG9tcF9pc19pbml0aWFsX2RldmljZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luaXRfbG9jaycgOjogb21wX2luaXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X2xvY2tfd2l0aF9oaW50JyA6OiBvbXBfaW5pdF9sb2NrX3dpdGhfaGludAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9kZXN0cm95X2xvY2snIDo6IG9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X2xvY2snIDo6IG9tcF9zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF91bnNldF9sb2NrJyA6OiBvbXBfdW5zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF90ZXN0X2xvY2snIDo6IG9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9uZXN0X2xvY2snIDo6IG9tcF9pbml0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X25lc3RfbG9ja193aXRoX2hpbnQnIDo6IG9tcF9pbml0X25lc3RfbG9ja193aXRoX2hpbnQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9uZXN0X2xvY2snIDo6IG9tcF9kZXN0cm95X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbmVzdF9sb2NrJyA6OiBvbXBfc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF91bnNldF9uZXN0X2xvY2snIDo6IG9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9uZXN0X2xvY2snIDo6IG9tcF90ZXN0X25lc3RfbG9jaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9TVEFDS1NJWkUnOjprbXBfc2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfU1RBQ0tTSVpFX1MnOjprbXBfc2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9CTE9DS1RJTUUnOjprbXBfc2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWV9TRVJJQUwnOjprbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkQnOjprbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWV9USFJPVUdIUFVUJzo6a21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0xJQlJBUlknOjprbXBfc2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX1NUQUNLU0laRSc6OmttcF9nZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9TVEFDS1NJWkVfUyc6OmttcF9nZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0JMT0NLVElNRSc6OmttcF9nZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9MSUJSQVJZJzo6a21wX2dldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9BRkZJTklUWSc6OmttcF9zZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0FGRklOSVRZJzo6a21wX2dldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfQUZGSU5JVFlfTUFYX1BST0MnOjprbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0NSRUFURV9BRkZJTklUWV9NQVNLJzo6a21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0RFU1RST1lfQUZGSU5JVFlfTUFTSyc6OmttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1VOU0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX01BTExPQyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfQ0FMTE9DJzo6a21wX2NhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9SRUFMTE9DJzo6a21wX3JlYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfRlJFRSc6OmttcF9mcmVlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX1dBUk5JTkdTX09OJzo6a21wX3NldF93YXJuaW5nc19vbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfV0FSTklOR1NfT0ZGJzo6a21wX3NldF93YXJuaW5nc19vZmYKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfQ0FOQ0VMTEFUSU9OX1NUQVRVUycgOjoga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzCisKKyFkZWMkICAgZW5kaWYKKyFkZWMkIGVuZGlmCisKKyFkZWMkIGlmIGRlZmluZWQoX19saW51eCkKKworISoqKgorISoqKiBUaGUgTGludXgqIE9TIGVudHJ5IHBvaW50cyBhcmUgaW4gbG93ZXJjYXNlLCB3aXRoIGFuIHVuZGVyc2NvcmUgYXBwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbnVtX3RocmVhZHNfJzo6b21wX3NldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9keW5hbWljXyc6Om9tcF9zZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9uZXN0ZWRfJzo6b21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbnVtX3RocmVhZHNfJzo6b21wX2dldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9tYXhfdGhyZWFkc18nOjpvbXBfZ2V0X21heF90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3RocmVhZF9udW1fJzo6b21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X251bV9wcm9jc18nOjpvbXBfZ2V0X251bV9wcm9jcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luX3BhcmFsbGVsXyc6Om9tcF9pbl9wYXJhbGxlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9keW5hbWljXyc6Om9tcF9nZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9uZXN0ZWRfJzo6b21wX2dldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfdGhyZWFkX2xpbWl0Xyc6Om9tcF9nZXRfdGhyZWFkX2xpbWl0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzXyc6Om9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHNfJzo6b21wX2dldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9sZXZlbF8nOjpvbXBfZ2V0X2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X2FjdGl2ZV9sZXZlbF8nOjpvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtXyc6Om9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF90ZWFtX3NpemVfJzo6b21wX2dldF90ZWFtX3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfc2NoZWR1bGVfJzo6b21wX3NldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9zY2hlZHVsZV8nOjpvbXBfZ2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3Byb2NfYmluZF8nIDo6IG9tcF9nZXRfcHJvY19iaW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3d0aW1lXyc6Om9tcF9nZXRfd3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfd3RpY2tfJzo6b21wX2dldF93dGljaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9kZWZhdWx0X2RldmljZV8nOjpvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X2RlZmF1bHRfZGV2aWNlXyc6Om9tcF9zZXRfZGVmYXVsdF9kZXZpY2UKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbnVtX2RldmljZXNfJzo6b21wX2dldF9udW1fZGV2aWNlcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9udW1fdGVhbXNfJzo6b21wX2dldF9udW1fdGVhbXMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfdGVhbV9udW1fJzo6b21wX2dldF90ZWFtX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9jYW5jZWxsYXRpb25fJzo6b21wX2dldF9jYW5jZWxsYXRpb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pc19pbml0aWFsX2RldmljZV8nOjpvbXBfaXNfaW5pdGlhbF9kZXZpY2UKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbG9ja18nOjpvbXBfaW5pdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9sb2NrX3dpdGhfaGludF8nOjpvbXBfaW5pdF9sb2NrX3dpdGhfaGludAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2Rlc3Ryb3lfbG9ja18nOjpvbXBfZGVzdHJveV9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X2xvY2tfJzo6b21wX3NldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdW5zZXRfbG9ja18nOjpvbXBfdW5zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Rlc3RfbG9ja18nOjpvbXBfdGVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9uZXN0X2xvY2tfJzo6b21wX2luaXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9uZXN0X2xvY2tfd2l0aF9oaW50Xyc6Om9tcF9pbml0X25lc3RfbG9ja193aXRoX2hpbnQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9kZXN0cm95X25lc3RfbG9ja18nOjpvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbmVzdF9sb2NrXyc6Om9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdW5zZXRfbmVzdF9sb2NrXyc6Om9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF90ZXN0X25lc3RfbG9ja18nOjpvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9zdGFja3NpemVfJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfc3RhY2tzaXplX3NfJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9ibG9ja3RpbWVfJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV9zZXJpYWxfJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0Xyc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2xpYnJhcnlfJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X3N0YWNrc2l6ZV8nOjprbXBfZ2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9zdGFja3NpemVfc18nOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2Jsb2NrdGltZV8nOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9saWJyYXJ5Xyc6OmttcF9nZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9hZmZpbml0eV8nOjprbXBfc2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2FmZmluaXR5Xyc6OmttcF9nZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2NfJzo6a21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrXyc6OmttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza18nOjprbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX21hbGxvY18nOjprbXBfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfY2FsbG9jXyc6OmttcF9jYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9yZWFsbG9jXyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZnJlZV8nOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X3dhcm5pbmdzX29uXyc6OmttcF9zZXRfd2FybmluZ3Nfb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfd2FybmluZ3Nfb2ZmXyc6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXNfJzo6a21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzCisKKyFkZWMkIGVuZGlmCisKKyFkZWMkIGlmIGRlZmluZWQoX19BUFBMRV9fKQorCishKioqCishKioqIFRoZSBNYWMgZW50cnkgcG9pbnRzIGFyZSBpbiBsb3dlcmNhc2UsIHdpdGggYW4gYm90aCBhbiB1bmRlcnNjb3JlCishKioqIGFwcGVuZGVkIGFuZCBhbiB1bmRlcnNjb3JlIHByZXBlbmRlZC4KKyEqKioKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbnVtX3RocmVhZHNfJzo6b21wX3NldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfZHluYW1pY18nOjpvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X25lc3RlZF8nOjpvbXBfc2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbnVtX3RocmVhZHNfJzo6b21wX2dldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbWF4X3RocmVhZHNfJzo6b21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfdGhyZWFkX251bV8nOjpvbXBfZ2V0X3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X251bV9wcm9jc18nOjpvbXBfZ2V0X251bV9wcm9jcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbl9wYXJhbGxlbF8nOjpvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X2R5bmFtaWNfJzo6b21wX2dldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9uZXN0ZWRfJzo6b21wX2dldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3RocmVhZF9saW1pdF8nOjpvbXBfZ2V0X3RocmVhZF9saW1pdAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHNfJzo6b21wX3NldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHNfJzo6b21wX2dldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbGV2ZWxfJzo6b21wX2dldF9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfYWN0aXZlX2xldmVsXyc6Om9tcF9nZXRfYWN0aXZlX2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtXyc6Om9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfdGVhbV9zaXplXyc6Om9tcF9nZXRfdGVhbV9zaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9zY2hlZHVsZV8nOjpvbXBfc2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9zY2hlZHVsZV8nOjpvbXBfZ2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9wcm9jX2JpbmRfJyA6OiBvbXBfZ2V0X3Byb2NfYmluZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfd3RpbWVfJzo6b21wX2dldF93dGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfd3RpY2tfJzo6b21wX2dldF93dGljaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbnVtX3RlYW1zXyc6Om9tcF9nZXRfbnVtX3RlYW1zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF90ZWFtX251bV8nOjpvbXBfZ2V0X3RlYW1fbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9jYW5jZWxsYXRpb25fJzo6b21wX2dldF9jYW5jZWxsYXRpb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaXNfaW5pdGlhbF9kZXZpY2VfJzo6b21wX2lzX2luaXRpYWxfZGV2aWNlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9sb2NrXyc6Om9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9sb2NrX3dpdGhfaGludF8nOjpvbXBfaW5pdF9sb2NrX3dpdGhfaGludAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9kZXN0cm95X2xvY2tfJzo6b21wX2Rlc3Ryb3lfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbG9ja18nOjpvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdW5zZXRfbG9ja18nOjpvbXBfdW5zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF90ZXN0X2xvY2tfJzo6b21wX3Rlc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X25lc3RfbG9ja18nOjpvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9uZXN0X2xvY2tfd2l0aF9oaW50Xyc6Om9tcF9pbml0X25lc3RfbG9ja193aXRoX2hpbnQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9uZXN0X2xvY2tfJzo6b21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9uZXN0X2xvY2tfJzo6b21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdW5zZXRfbmVzdF9sb2NrXyc6Om9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9uZXN0X2xvY2tfJzo6b21wX3Rlc3RfbmVzdF9sb2NrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X3N0YWNrc2l6ZV8nOjprbXBfc2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfc3RhY2tzaXplX3NfJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfYmxvY2t0aW1lXyc6OmttcF9zZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9saWJyYXJ5X3NlcmlhbF8nOjprbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dF8nOjprbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV8nOjprbXBfc2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X3N0YWNrc2l6ZV8nOjprbXBfZ2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfc3RhY2tzaXplX3NfJzo6a21wX2dldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfYmxvY2t0aW1lXyc6OmttcF9nZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9saWJyYXJ5Xyc6OmttcF9nZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfYWZmaW5pdHlfJzo6a21wX3NldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfYWZmaW5pdHlfJzo6a21wX2dldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2NfJzo6a21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9jcmVhdGVfYWZmaW5pdHlfbWFza18nOjprbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrXyc6OmttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX21hbGxvY18nOjprbXBfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2NhbGxvY18nOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3JlYWxsb2NfJzo6a21wX3JlYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZnJlZV8nOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF93YXJuaW5nc19vbl8nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF93YXJuaW5nc19vZmZfJzo6a21wX3NldF93YXJuaW5nc19vZmYKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1c18nOjprbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMKKworIWRlYyQgZW5kaWYKKworICAgICAgZW5kIG1vZHVsZSBvbXBfbGliCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDEvb21wX2xpYi5mOTAudmFyIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS80MS9vbXBfbGliLmY5MC52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQyMzY2NwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDEvb21wX2xpYi5mOTAudmFyCkBAIC0wLDAgKzEsNDcwIEBACishIGluY2x1ZGUvNDEvb21wX2xpYi5mOTAudmFyCisKKyEKKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIS8vCishLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIS8vCishLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIS8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIS8vCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEKKworICAgICAgbW9kdWxlIG9tcF9saWJfa2luZHMKKworICAgICAgICB1c2UsIGludHJpbnNpYyA6OiBpc29fY19iaW5kaW5nCisKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9pbnRlZ2VyX2tpbmQgICAgICAgPSBjX2ludAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvZ2ljYWxfa2luZCAgICAgICA9IDQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9yZWFsX2tpbmQgICAgICAgICAgPSBjX2Zsb2F0CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfZG91YmxlX2tpbmQgICAgICAgID0gY19kb3VibGUKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2tpbmQgICAgICAgICAgPSBjX2ludHB0cl90CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbmVzdF9sb2NrX2tpbmQgICAgID0gY19pbnRwdHJfdAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2tpbmQgICAgICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfa2luZCAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfcG9pbnRlcl9raW5kICAgICAgID0gY19pbnRwdHJfdAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3NpemVfdF9raW5kICAgICAgICA9IGNfc2l6ZV90CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfYWZmaW5pdHlfbWFza19raW5kID0gY19pbnRwdHJfdAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF9raW5kICAgICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2hpbnRfa2luZCAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisKKyAgICAgIGVuZCBtb2R1bGUgb21wX2xpYl9raW5kcworCisgICAgICBtb2R1bGUgb21wX2xpYgorCisgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IG9wZW5tcF92ZXJzaW9uICAgID0gQExJQk9NUF9PTVBfWUVBUl9NT05USEAKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21ham9yID0gQExJQk9NUF9WRVJTSU9OX01BSk9SQAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWlub3IgPSBATElCT01QX1ZFUlNJT05fTUlOT1JACisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9idWlsZCA9IEBMSUJPTVBfVkVSU0lPTl9CVUlMREAKKyAgICAgICAgY2hhcmFjdGVyKCopICAgICAgICAgICAgICAga21wX2J1aWxkX2RhdGUKKyAgICAgICAgcGFyYW1ldGVyKCBrbXBfYnVpbGRfZGF0ZSA9ICdATElCT01QX0JVSUxEX0RBVEVAJyApCisKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9zdGF0aWMgID0gMQorICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2R5bmFtaWMgPSAyCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfZ3VpZGVkICA9IDMKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9hdXRvICAgID0gNAorCisKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9mYWxzZSA9IDAKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF90cnVlID0gMQorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX21hc3RlciA9IDIKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9jbG9zZSA9IDMKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9zcHJlYWQgPSA0CisKKyAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfY2FuY2VsX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF9wYXJhbGxlbCA9IDEKKyAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfY2FuY2VsX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF9sb29wID0gMgorICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX3NlY3Rpb25zID0gMworICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX3Rhc2tncm91cCA9IDQKKworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X25vbmUgICAgICAgICAgID0gMAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X3VuY29udGVuZGVkICAgID0gMQorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X2NvbnRlbmRlZCAgICAgID0gMgorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X25vbnNwZWN1bGF0aXZlID0gNAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X3NwZWN1bGF0aXZlICAgID0gOAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfbG9ja19oaW50X2hsZSAgICAgICAgICAgID0gNjU1MzYKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19oaW50X2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX2xvY2tfaGludF9ydG0gICAgICAgICAgICA9IDEzMTA3MgorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfbG9ja19oaW50X2FkYXB0aXZlICAgICAgID0gMjYyMTQ0CisKKyAgICAgICAgaW50ZXJmYWNlCisKKyEgICAgICAgICAqKioKKyEgICAgICAgICAqKiogb21wXyogZW50cnkgcG9pbnRzCishICAgICAgICAgKioqCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMobnRocmVhZHMpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBudGhyZWFkcworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljKGVuYWJsZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCksIHZhbHVlIDo6IGVuYWJsZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZChlbmFibGUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpLCB2YWx1ZSA6OiBlbmFibGUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3RocmVhZHMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkcygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X3RocmVhZHMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90aHJlYWRfbnVtCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV9wcm9jcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV9wcm9jcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2luX3BhcmFsbGVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2luX2ZpbmFsKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2luX2ZpbmFsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9pbl9maW5hbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9keW5hbWljKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2dldF9keW5hbWljCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X25lc3RlZAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X25lc3RlZAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbGltaXQoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RocmVhZF9saW1pdAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9saW1pdAorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzKG1heF9sZXZlbHMpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBtYXhfbGV2ZWxzCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfYWN0aXZlX2xldmVscygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9sZXZlbCgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbGV2ZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9sZXZlbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9hY3RpdmVfbGV2ZWwoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtKGxldmVsKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGxldmVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90ZWFtX3NpemUobGV2ZWwpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGVhbV9zaXplCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBsZXZlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fc2l6ZQorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X3NjaGVkdWxlKGtpbmQsIG1vZGlmaWVyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfc2NoZWRfa2luZCksIHZhbHVlIDo6IGtpbmQKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IG1vZGlmaWVyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZQorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfZ2V0X3NjaGVkdWxlKGtpbmQsIG1vZGlmaWVyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfc2NoZWRfa2luZCkga2luZAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBtb2RpZmllcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9nZXRfc2NoZWR1bGUKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfcHJvY19iaW5kKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSBvbXBfZ2V0X3Byb2NfYmluZAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3Byb2NfYmluZAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGltZSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICByZWFsIChraW5kPWttcF9kb3VibGVfa2luZCkgb21wX2dldF93dGltZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3d0aW1lCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3d0aWNrKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIHJlYWwgKGtpbmQ9a21wX2RvdWJsZV9raW5kKSBvbXBfZ2V0X3d0aWNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2sKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9kZWZhdWx0X2RldmljZShkZmx0X2RldmljZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGRmbHRfZGV2aWNlCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9kZWZhdWx0X2RldmljZQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fZGV2aWNlcygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX2RldmljZXMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fZGV2aWNlcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fdGVhbXMoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV90ZWFtcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV90ZWFtcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90ZWFtX251bSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGVhbV9udW0KKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90ZWFtX251bQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9jYW5jZWxsYXRpb24oKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2NhbmNlbGxhdGlvbgorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2NhbmNlbGxhdGlvbgorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2lzX2luaXRpYWxfZGV2aWNlKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2lzX2luaXRpYWxfZGV2aWNlCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9pc19pbml0aWFsX2RldmljZQorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9pbml0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9kZXN0cm95X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3NldF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfdW5zZXRfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9jaworCisgICAgICAgICAgZnVuY3Rpb24gb21wX3Rlc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfdGVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX3Rlc3RfbG9jaworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9pbml0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9zZXRfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3Vuc2V0X25lc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfdW5zZXRfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X25lc3RfbG9jaworCisgICAgICAgICAgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF90ZXN0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF90ZXN0X25lc3RfbG9jaworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrCisKKyEgICAgICAgICAqKioKKyEgICAgICAgICAqKioga21wXyogZW50cnkgcG9pbnRzCishICAgICAgICAgKioqCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplKHNpemUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcyhzaXplKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZShtc2VjKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbXNlYworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWwoKSBiaW5kKGMpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbAorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZCgpIGJpbmQoYykKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dCgpIGJpbmQoYykKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkobGlibnVtKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbGlibnVtCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5CisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMoc3RyaW5nKSBiaW5kKGMpCisgICAgICAgICAgICB1c2UsIGludHJpbnNpYyA6OiBpc29fY19iaW5kaW5nCisgICAgICAgICAgICBjaGFyYWN0ZXIgKGtpbmQ9Y19jaGFyKSA6OiBzdHJpbmcoKikKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfc3RhY2tzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9ibG9ja3RpbWUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfbGlicmFyeQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHkobWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3NldF9hZmZpbml0eQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHkKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHkobWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHkKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrKG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzayhtYXNrKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHByb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBwcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHByb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX21hbGxvYyhzaXplKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfbWFsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX21hbGxvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2NhbGxvYyhuZWxlbSwgZWxzaXplKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfY2FsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IG5lbGVtCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IGVsc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfY2FsbG9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfcmVhbGxvYyhwdHIsIHNpemUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9yZWFsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpLCB2YWx1ZSA6OiBwdHIKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfcmVhbGxvYworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfZnJlZShwdHIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpLCB2YWx1ZSA6OiBwdHIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZnJlZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29uKCkgYmluZChjKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24KKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYoKSBiaW5kKGMpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cyhjYW5jZWxraW5kKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfY2FuY2VsX2tpbmQpLCB2YWx1ZSA6OiBjYW5jZWxraW5kCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIGttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbG9ja193aXRoX2hpbnQobG9ja3ZhciwgbG9ja2hpbnQpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgdmFsdWUgOjogbG9ja2hpbnQKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrX3dpdGhfaGludAorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2tfd2l0aF9oaW50KGxvY2t2YXIsIGxvY2toaW50KSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHZhbHVlIDo6IGxvY2toaW50CisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludAorCisgICAgICAgIGVuZCBpbnRlcmZhY2UKKworICAgICAgZW5kIG1vZHVsZSBvbXBfbGliCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzQxL29tcF9saWIuaC52YXIgYi9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzQxL29tcF9saWIuaC52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY3YmNkOQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDEvb21wX2xpYi5oLnZhcgpAQCAtMCwwICsxLDU4NCBAQAorISBpbmNsdWRlLzQxL29tcF9saWIuaC52YXIKKworIQorIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishLy8KKyEvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCishLy8KKyEvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCishLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCishLy8KKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIQorCishKioqCishKioqIFNvbWUgb2YgdGhlIGRpcmVjdGl2ZXMgZm9yIHRoZSBmb2xsb3dpbmcgcm91dGluZSBleHRlbmQgcGFzdCBjb2x1bW4gNzIsCishKioqIHNvIHByb2Nlc3MgdGhpcyBmaWxlIGluIDEzMi1jb2x1bW4gbW9kZS4KKyEqKioKKworIURJUiQgZml4ZWRmb3JtbGluZXNpemU6MTMyCisKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfaW50ZWdlcl9raW5kICAgICAgID0gNAorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2dpY2FsX2tpbmQgICAgICAgPSA0CisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3JlYWxfa2luZCAgICAgICAgICA9IDQKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbG9ja19raW5kICAgICAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbmVzdF9sb2NrX2tpbmQgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfa2luZCAgICAgICAgID0gb21wX2ludGVnZXJfa2luZAorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfa2luZCAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3BvaW50ZXJfa2luZCAgICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3NpemVfdF9raW5kICAgICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX2FmZmluaXR5X21hc2tfa2luZCA9IGludF9wdHJfa2luZCgpCisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvY2tfaGludF9raW5kICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKworICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IG9wZW5tcF92ZXJzaW9uICAgID0gQExJQk9NUF9PTVBfWUVBUl9NT05USEAKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9tYWpvciA9IEBMSUJPTVBfVkVSU0lPTl9NQUpPUkAKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9taW5vciA9IEBMSUJPTVBfVkVSU0lPTl9NSU5PUkAKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9idWlsZCA9IEBMSUJPTVBfVkVSU0lPTl9CVUlMREAKKyAgICAgIGNoYXJhY3RlcigqKSAgICAgICAgICAgICAgIGttcF9idWlsZF9kYXRlCisgICAgICBwYXJhbWV0ZXIoIGttcF9idWlsZF9kYXRlID0gJ0BMSUJPTVBfQlVJTERfREFURUAnICkKKworICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9zdGF0aWMgID0gMQorICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9keW5hbWljID0gMgorICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9ndWlkZWQgID0gMworICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9hdXRvICAgID0gNAorCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX2ZhbHNlID0gMAorICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF90cnVlID0gMQorICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9tYXN0ZXIgPSAyCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX2Nsb3NlID0gMworICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9zcHJlYWQgPSA0CisKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2hpbnRfbm9uZSAgICAgICAgICAgPSAwCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X3VuY29udGVuZGVkICAgID0gMQorICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19oaW50X2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX2xvY2tfaGludF9jb250ZW5kZWQgICAgICA9IDIKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2hpbnRfbm9uc3BlY3VsYXRpdmUgPSA0CisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X3NwZWN1bGF0aXZlICAgID0gOAorICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19oaW50X2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX2xvY2tfaGludF9obGUgICAgICAgICAgICA9IDY1NTM2CisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfbG9ja19oaW50X3J0bSAgICAgICAgICAgID0gMTMxMDcyCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfbG9ja19oaW50X2FkYXB0aXZlICAgICAgID0gMjYyMTQ0CisKKyAgICAgIGludGVyZmFjZQorCishICAgICAgICoqKgorISAgICAgICAqKiogb21wXyogZW50cnkgcG9pbnRzCishICAgICAgICoqKgorCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkcyhudGhyZWFkcykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IG50aHJlYWRzCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYyhlbmFibGUpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpLCB2YWx1ZSA6OiBlbmFibGUKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZChlbmFibGUpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpLCB2YWx1ZSA6OiBlbmFibGUKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0ZWQKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV90aHJlYWRzKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fdGhyZWFkcworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF90aHJlYWRzCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90aHJlYWRfbnVtCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9udW0KKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV9wcm9jcygpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3Byb2NzCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV9wcm9jcworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbCgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pbl9wYXJhbGxlbAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2luX2ZpbmFsKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2luX2ZpbmFsCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfaW5fZmluYWwKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2R5bmFtaWMoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X2R5bmFtaWMKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2dldF9uZXN0ZWQKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbGltaXQoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RocmVhZF9saW1pdAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbGltaXQKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMobWF4X2xldmVscykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IG1heF9sZXZlbHMKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9sZXZlbCgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbGV2ZWwKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbGV2ZWwKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbCgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfYWN0aXZlX2xldmVsCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bShsZXZlbCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbGV2ZWwKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9zaXplKGxldmVsKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RlYW1fc2l6ZQorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGxldmVsCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fc2l6ZQorCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZShraW5kLCBtb2RpZmllcikgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCB2YWx1ZSA6OiBraW5kCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbW9kaWZpZXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZQorCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZShraW5kLCBtb2RpZmllcikgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3NjaGVkX2tpbmQpIGtpbmQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG1vZGlmaWVyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9nZXRfc2NoZWR1bGUKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3Byb2NfYmluZCgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCkgb21wX2dldF9wcm9jX2JpbmQKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfcHJvY19iaW5kCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGltZSgpIGJpbmQoYykKKyAgICAgICAgICBkb3VibGUgcHJlY2lzaW9uIG9tcF9nZXRfd3RpbWUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfd3RpbWUKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3d0aWNrKCkgYmluZChjKQorICAgICAgICAgIGRvdWJsZSBwcmVjaXNpb24gb21wX2dldF93dGljaworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGljaworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlKGRmbHRfZGV2aWNlKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogZGZsdF9kZXZpY2UKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9kZWZhdWx0X2RldmljZQorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX2RldmljZXMoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV9kZXZpY2VzCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV9kZXZpY2VzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fdGVhbXMoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV90ZWFtcworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fdGVhbXMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fbnVtKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90ZWFtX251bQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90ZWFtX251bQorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9pc19pbml0aWFsX2RldmljZSgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pc19pbml0aWFsX2RldmljZQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2lzX2luaXRpYWxfZGV2aWNlCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9pbml0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2Rlc3Ryb3lfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9zZXRfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfdW5zZXRfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X2xvY2sKKworICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF90ZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfdGVzdF9sb2NrCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2luaXRfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9kZXN0cm95X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9zZXRfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF91bnNldF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X25lc3RfbG9jaworCisgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfdGVzdF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfdGVzdF9uZXN0X2xvY2sKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrCisKKyEgICAgICAgKioqCishICAgICAgICoqKiBrbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgKioqCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZShzaXplKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZQorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcyhzaXplKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3MKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lKG1zZWMpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBtc2VjCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsKCkgYmluZChjKQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZCgpIGJpbmQoYykKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0KCkgYmluZChjKQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5KGxpYm51bSkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGxpYm51bQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMoc3RyaW5nKSBiaW5kKGMpCisgICAgICAgICAgY2hhcmFjdGVyIHN0cmluZygqKQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZQorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2Jsb2NrdGltZQorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2xpYnJhcnkKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeQorCisgICAgICAgIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHkobWFzaykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3NldF9hZmZpbml0eQorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eQorCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHkobWFzaykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eQorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eQorCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sobWFzaykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sobWFzaykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCisKKyAgICAgICAgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBwcm9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgIGZ1bmN0aW9uIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHByb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHByb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgZnVuY3Rpb24ga21wX21hbGxvYyhzaXplKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfbWFsbG9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfbWFsbG9jCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2NhbGxvYyhuZWxlbSwgZWxzaXplKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfY2FsbG9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBuZWxlbQorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogZWxzaXplCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfY2FsbG9jCisKKyAgICAgICAgZnVuY3Rpb24ga21wX3JlYWxsb2MocHRyLCBzaXplKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfcmVhbGxvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCksIHZhbHVlIDo6IHB0cgorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3JlYWxsb2MKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9mcmVlKHB0cikgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCksIHZhbHVlIDo6IHB0cgorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZnJlZQorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbigpIGJpbmQoYykKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbgorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYoKSBiaW5kKGMpCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrX3dpdGhfaGludChsb2NrdmFyLCBsb2NraGludCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgdmFsdWUgOjogbG9ja2hpbnQKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbG9ja193aXRoX2hpbnQKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9ja193aXRoX2hpbnQobG9ja3ZhciwgbG9ja2hpbnQpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHZhbHVlIDo6IGxvY2toaW50CisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9ja193aXRoX2hpbnQKKworICAgICAgZW5kIGludGVyZmFjZQorCishRElSJCBJRiBERUZJTkVEIChfX0lOVEVMX09GRkxPQUQpCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9zZXRfbnVtX3RocmVhZHMKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3NldF9keW5hbWljCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9zZXRfbmVzdGVkCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfbnVtX3RocmVhZHMKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9tYXhfdGhyZWFkcworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X3RocmVhZF9udW0KKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9udW1fcHJvY3MKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2luX3BhcmFsbGVsCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9pbl9maW5hbAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X2R5bmFtaWMKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9uZXN0ZWQKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF90aHJlYWRfbGltaXQKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3NldF9tYXhfYWN0aXZlX2xldmVscworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfbGV2ZWwKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9hY3RpdmVfbGV2ZWwKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfdGVhbV9zaXplCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9zZXRfc2NoZWR1bGUKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9zY2hlZHVsZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X3Byb2NfYmluZAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X3d0aW1lCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfd3RpY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9kZWZhdWx0X2RldmljZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9pc19pbml0aWFsX2RldmljZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X251bV9kZXZpY2VzCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfbnVtX3RlYW1zCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfdGVhbV9udW0KKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2luaXRfbG9jaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZGVzdHJveV9sb2NrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9zZXRfbG9jaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfdW5zZXRfbG9jaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfdGVzdF9sb2NrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9pbml0X25lc3RfbG9jaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3NldF9uZXN0X2xvY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3Vuc2V0X25lc3RfbG9jaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfdGVzdF9uZXN0X2xvY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF9zdGFja3NpemUKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF9zdGFja3NpemVfcworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X2Jsb2NrdGltZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfbGlicmFyeQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X2RlZmF1bHRzCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9nZXRfc3RhY2tzaXplCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9nZXRfc3RhY2tzaXplX3MKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2dldF9ibG9ja3RpbWUKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2dldF9saWJyYXJ5CishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfYWZmaW5pdHkKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2dldF9hZmZpbml0eQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX21hbGxvYworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfY2FsbG9jCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9yZWFsbG9jCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9mcmVlCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfd2FybmluZ3Nfb24KKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF93YXJuaW5nc19vZmYKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2luaXRfbG9ja193aXRoX2hpbnQKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludAorCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfc2V0X251bV90aHJlYWRzICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9zZXRfZHluYW1pYyApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfc2V0X25lc3RlZCApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X251bV90aHJlYWRzICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfbWF4X3RocmVhZHMgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF90aHJlYWRfbnVtICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfbnVtX3Byb2NzICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9pbl9wYXJhbGxlbCApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfaW5fZmluYWwgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9keW5hbWljICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfbmVzdGVkICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfdGhyZWFkX2xpbWl0ICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9tYXhfYWN0aXZlX2xldmVscyApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X2xldmVsICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfYWN0aXZlX2xldmVsICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bSApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X3RlYW1fc2l6ZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfc2V0X3NjaGVkdWxlICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfc2NoZWR1bGUgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9wcm9jX2JpbmQgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF93dGltZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X3d0aWNrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3NldF9kZWZhdWx0X2RldmljZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfaXNfaW5pdGlhbF9kZXZpY2UgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9udW1fZGV2aWNlcyApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X251bV90ZWFtcyApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X3RlYW1fbnVtICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9pbml0X2xvY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2Rlc3Ryb3lfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfc2V0X2xvY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3Vuc2V0X2xvY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3Rlc3RfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfaW5pdF9uZXN0X2xvY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2Rlc3Ryb3lfbmVzdF9sb2NrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9zZXRfbmVzdF9sb2NrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF91bnNldF9uZXN0X2xvY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3Rlc3RfbmVzdF9sb2NrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfc3RhY2tzaXplICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfc3RhY2tzaXplX3MgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9ibG9ja3RpbWUgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9saWJyYXJ5X3NlcmlhbCApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZCApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dCApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X2xpYnJhcnkgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9kZWZhdWx0cyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfZ2V0X3N0YWNrc2l6ZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfZ2V0X3N0YWNrc2l6ZV9zICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9nZXRfYmxvY2t0aW1lICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9nZXRfbGlicmFyeSApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X2FmZmluaXR5ICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9nZXRfYWZmaW5pdHkgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2dldF9hZmZpbml0eV9tYXhfcHJvYyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzayApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9tYWxsb2MgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2NhbGxvYyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfcmVhbGxvYyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfZnJlZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X3dhcm5pbmdzX29uICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfd2FybmluZ3Nfb2ZmICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9pbml0X2xvY2tfd2l0aF9oaW50ICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9pbml0X25lc3RfbG9ja193aXRoX2hpbnQgKQorIURJUiQgRU5ESUYKKyFESVIkIEVORElGCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDEvb21wdC5oLnZhciBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDEvb21wdC5oLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmQ5NWU4Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS80MS9vbXB0LmgudmFyCkBAIC0wLDAgKzEsNDg3IEBACisvKgorICogaW5jbHVkZS80MS9vbXB0LmgudmFyCisgKi8KKworI2lmbmRlZiBfX09NUFRfXworI2RlZmluZSBfX09NUFRfXworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHN5c3RlbSBpbmNsdWRlIGZpbGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogaXRlcmF0aW9uIG1hY3JvcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEZPUkVBQ0hfT01QVF9JTlFVSVJZX0ZOKG1hY3JvKSAgXAorICAgIG1hY3JvIChvbXB0X2VudW1lcmF0ZV9zdGF0ZSkgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc2V0X2NhbGxiYWNrKSAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2dldF9jYWxsYmFjaykgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZ2V0X2lkbGVfZnJhbWUpICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2dldF90YXNrX2ZyYW1lKSAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZ2V0X3N0YXRlKSAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9nZXRfcGFyYWxsZWxfaWQpICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZ2V0X3BhcmFsbGVsX3RlYW1fc2l6ZSkgXAorICAgIG1hY3JvIChvbXB0X2dldF90YXNrX2lkKSAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9nZXRfdGhyZWFkX2lkKQorCisjZGVmaW5lIEZPUkVBQ0hfT01QVF9QTEFDRUhPTERFUl9GTihtYWNybykgIFwKKyAgICBtYWNybyAob21wdF9pZGxlKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X292ZXJoZWFkKSAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfYmFycmllcl93YWl0KSAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF90YXNrX3dhaXQpICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X211dGV4X3dhaXQpCisKKyNkZWZpbmUgRk9SRUFDSF9PTVBUX1NUQVRFKG1hY3JvKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBmaXJzdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV9maXJzdCwgMHg3MSkgICAgICAgICAgLyogaW5pdGlhbCBlbnVtZXJhdGlvbiBzdGF0ZSAqLyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiB3b3JrIHN0YXRlcyAoMC4uMTUpICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93b3JrX3NlcmlhbCwgMHgwMCkgICAgLyogd29ya2luZyBvdXRzaWRlIHBhcmFsbGVsICovICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93b3JrX3BhcmFsbGVsLCAweDAxKSAgLyogd29ya2luZyB3aXRoaW4gcGFyYWxsZWwgKi8gICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93b3JrX3JlZHVjdGlvbiwgMHgwMikgLyogcGVyZm9ybWluZyBhIHJlZHVjdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBpZGxlICgxNi4uMzEpICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV9pZGxlLCAweDEwKSAgICAgICAgICAgIC8qIHdhaXRpbmcgZm9yIHdvcmsgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBvdmVyaGVhZCBzdGF0ZXMgKDMyLi42MykgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV9vdmVyaGVhZCwgMHgyMCkgICAgICAgIC8qIG92ZXJoZWFkIGV4Y2x1ZGluZyB3YWl0IHN0YXRlcyAqLyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBiYXJyaWVyIHdhaXQgc3RhdGVzICg2NC4uNzkpICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X2JhcnJpZXIsIDB4NDApICAgIC8qIHdhaXRpbmcgYXQgYSBiYXJyaWVyICovICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X2JhcnJpZXJfaW1wbGljaXQsIDB4NDEpICAgIC8qIGltcGxpY2l0IGJhcnJpZXIgKi8gICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X2JhcnJpZXJfZXhwbGljaXQsIDB4NDIpICAgIC8qIGV4cGxpY2l0IGJhcnJpZXIgKi8gICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiB0YXNrIHdhaXQgc3RhdGVzICg4MC4uOTUpICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X3Rhc2t3YWl0LCAweDUwKSAgIC8qIHdhaXRpbmcgYXQgYSB0YXNrd2FpdCAqLyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X3Rhc2tncm91cCwgMHg1MSkgIC8qIHdhaXRpbmcgYXQgYSB0YXNrZ3JvdXAgKi8gICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBtdXRleCB3YWl0IHN0YXRlcyAoOTYuLjExMSkgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X2xvY2ssIDB4NjApICAgICAgIC8qIHdhaXRpbmcgZm9yIGxvY2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X25lc3RfbG9jaywgMHg2MSkgIC8qIHdhaXRpbmcgZm9yIG5lc3QgbG9jayAqLyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X2NyaXRpY2FsLCAweDYyKSAgIC8qIHdhaXRpbmcgZm9yIGNyaXRpY2FsICovICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X2F0b21pYywgMHg2MykgICAgIC8qIHdhaXRpbmcgZm9yIGF0b21pYyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X29yZGVyZWQsIDB4NjQpICAgIC8qIHdhaXRpbmcgZm9yIG9yZGVyZWQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X3NpbmdsZSwgMHg2RikgICAgIC8qIHdhaXRpbmcgZm9yIHNpbmdsZSByZWdpb24gKG5vbi1zdGFuZGFyZCEpICovICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBtaXNjICgxMTIuLjEyNykgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV91bmRlZmluZWQsIDB4NzApICAgICAgIC8qIHVuZGVmaW5lZCB0aHJlYWQgc3RhdGUgKi8KKworCisjZGVmaW5lIEZPUkVBQ0hfT01QVF9FVkVOVChtYWNybykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKi0tLSBNYW5kYXRvcnkgRXZlbnRzIC0tLSovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfcGFyYWxsZWxfYmVnaW4sICAgICAgICAgICBvbXB0X25ld19wYXJhbGxlbF9jYWxsYmFja190LCAgIDEpIC8qIHBhcmFsbGVsIGJlZ2luICovICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3BhcmFsbGVsX2VuZCwgICAgICAgICAgICAgb21wdF9lbmRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAyKSAvKiBwYXJhbGxlbCBlbmQgKi8gICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGFza19iZWdpbiwgICAgICAgICAgICAgICBvbXB0X25ld190YXNrX2NhbGxiYWNrX3QsICAgICAgIDMpIC8qIHRhc2sgYmVnaW4gKi8gICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3Rhc2tfZW5kLCAgICAgICAgICAgICAgICAgb21wdF90YXNrX2NhbGxiYWNrX3QsICAgICAgICAgICA0KSAvKiB0YXNrIGRlc3Ryb3kgKi8gICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGhyZWFkX2JlZ2luLCAgICAgICAgICAgICBvbXB0X3RocmVhZF90eXBlX2NhbGxiYWNrX3QsICAgIDUpIC8qIHRocmVhZCBiZWdpbiAqLyAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3RocmVhZF9lbmQsICAgICAgICAgICAgICAgb21wdF90aHJlYWRfdHlwZV9jYWxsYmFja190LCAgICA2KSAvKiB0aHJlYWQgZW5kICovICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfY29udHJvbCwgICAgICAgICAgICAgICAgICBvbXB0X2NvbnRyb2xfY2FsbGJhY2tfdCwgICAgICAgIDcpIC8qIHN1cHBvcnQgY29udHJvbCBjYWxscyAqLyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9ydW50aW1lX3NodXRkb3duLCAgICAgICAgIG9tcHRfY2FsbGJhY2tfdCwgICAgICAgICAgICAgICAgOCkgLyogcnVudGltZSBzaHV0ZG93biAqLyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qLS0tIE9wdGlvbmFsIEV2ZW50cyAoYmxhbWUgc2hpZnRpbmcsIG9tcHRfZXZlbnRfdW5pbXBsZW1lbnRlZCkgLS0tKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pZGxlX2JlZ2luLCAgICAgICAgICAgICAgIG9tcHRfdGhyZWFkX2NhbGxiYWNrX3QsICAgICAgICAgOSkgLyogYmVnaW4gaWRsZSBzdGF0ZSAqLyAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfaWRsZV9lbmQsICAgICAgICAgICAgICAgICBvbXB0X3RocmVhZF9jYWxsYmFja190LCAgICAgICAgMTApIC8qIGVuZCBpZGxlIHN0YXRlICovICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X2JhcnJpZXJfYmVnaW4sICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAxMSkgLyogYmVnaW4gd2FpdCBhdCBiYXJyaWVyICovICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF9iYXJyaWVyX2VuZCwgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMTIpIC8qIGVuZCB3YWl0IGF0IGJhcnJpZXIgKi8gICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X3Rhc2t3YWl0X2JlZ2luLCAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAxMykgLyogYmVnaW4gd2FpdCBhdCB0YXNrd2FpdCAqLyBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF90YXNrd2FpdF9lbmQsICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMTQpIC8qIGVuZCB3YWl0IGF0IHRhc2t3YWl0ICovICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X3Rhc2tncm91cF9iZWdpbiwgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAxNSkgLyogYmVnaW4gd2FpdCBhdCB0YXNrZ3JvdXAgKi9cCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF90YXNrZ3JvdXBfZW5kLCAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMTYpIC8qIGVuZCB3YWl0IGF0IHRhc2tncm91cCAqLyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9yZWxlYXNlX2xvY2ssICAgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICAxNykgLyogbG9jayByZWxlYXNlICovICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfcmVsZWFzZV9uZXN0X2xvY2tfbGFzdCwgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgMTgpIC8qIGxhc3QgbmVzdCBsb2NrIHJlbGVhc2UgKi8gXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3JlbGVhc2VfY3JpdGljYWwsICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDE5KSAvKiBjcml0aWNhbCByZWxlYXNlICovICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfcmVsZWFzZV9hdG9taWMsICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgMjApIC8qIGF0b21pYyByZWxlYXNlICovICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9yZWxlYXNlX29yZGVyZWQsICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICAyMSkgLyogb3JkZXJlZCByZWxlYXNlICovICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qLS0tIE9wdGlvbmFsIEV2ZW50cyAoc3luY2hyb25vdXMgZXZlbnRzLCBvbXB0X2V2ZW50X3VuaW1wbGVtZW50ZWQpIC0tLSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luLCAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAyMikgLyogaW1wbGljaXQgdGFzayBiZWdpbiAgICovICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQsICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMjMpIC8qIGltcGxpY2l0IHRhc2sgZW5kICAqLyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pbml0aWFsX3Rhc2tfYmVnaW4sICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAyNCkgLyogaW5pdGlhbCB0YXNrIGJlZ2luICAgKi8gICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfaW5pdGlhbF90YXNrX2VuZCwgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMjUpIC8qIGluaXRpYWwgdGFzayBlbmQgICovICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF90YXNrX3N3aXRjaCwgICAgICAgICAgICAgIG9tcHRfdGFza19wYWlyX2NhbGxiYWNrX3QsICAgICAyNikgLyogdGFzayBzd2l0Y2ggKi8gICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2xvb3BfYmVnaW4sICAgICAgICAgICAgICAgb21wdF9uZXdfd29ya3NoYXJlX2NhbGxiYWNrX3QsIDI3KSAvKiB0YXNrIGF0IGxvb3AgYmVnaW4gKi8gICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9sb29wX2VuZCwgICAgICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAyOCkgLyogdGFzayBhdCBsb29wIGVuZCAqLyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3NlY3Rpb25zX2JlZ2luLCAgICAgICAgICAgb21wdF9uZXdfd29ya3NoYXJlX2NhbGxiYWNrX3QsIDI5KSAvKiB0YXNrIGF0IHNlY3Rpb25zIGJlZ2luICAqL1wKKyAgICBtYWNybyAob21wdF9ldmVudF9zZWN0aW9uc19lbmQsICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAzMCkgLyogdGFzayBhdCBzZWN0aW9ucyBlbmQgKi8gICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3NpbmdsZV9pbl9ibG9ja19iZWdpbiwgICAgb21wdF9uZXdfd29ya3NoYXJlX2NhbGxiYWNrX3QsIDMxKSAvKiB0YXNrIGF0IHNpbmdsZSBiZWdpbiovICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9zaW5nbGVfaW5fYmxvY2tfZW5kLCAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAzMikgLyogdGFzayBhdCBzaW5nbGUgZW5kICovICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3NpbmdsZV9vdGhlcnNfYmVnaW4sICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDMzKSAvKiB0YXNrIGF0IHNpbmdsZSBiZWdpbiAqLyAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9zaW5nbGVfb3RoZXJzX2VuZCwgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAzNCkgLyogdGFzayBhdCBzaW5nbGUgZW5kICovICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dvcmtzaGFyZV9iZWdpbiwgICAgICAgICAgb21wdF9uZXdfd29ya3NoYXJlX2NhbGxiYWNrX3QsIDM1KSAvKiB0YXNrIGF0IHdvcmtzaGFyZSBiZWdpbiAqL1wKKyAgICBtYWNybyAob21wdF9ldmVudF93b3Jrc2hhcmVfZW5kLCAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAzNikgLyogdGFzayBhdCB3b3Jrc2hhcmUgZW5kICovICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X21hc3Rlcl9iZWdpbiwgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDM3KSAvKiB0YXNrIGF0IG1hc3RlciBiZWdpbiAqLyAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9tYXN0ZXJfZW5kLCAgICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAzOCkgLyogdGFzayBhdCBtYXN0ZXIgZW5kICovICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW4sICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDM5KSAvKiB0YXNrIGF0IGJhcnJpZXIgYmVnaW4gICovIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9iYXJyaWVyX2VuZCwgICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICA0MCkgLyogdGFzayBhdCBiYXJyaWVyIGVuZCAqLyAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3Rhc2t3YWl0X2JlZ2luLCAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDQxKSAvKiB0YXNrIGF0IHRhc2t3YWl0IGJlZ2luICovIFwKKyAgICBtYWNybyAob21wdF9ldmVudF90YXNrd2FpdF9lbmQsICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICA0MikgLyogdGFzayBhdCB0YXNrIHdhaXQgZW5kICovICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3Rhc2tncm91cF9iZWdpbiwgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDQzKSAvKiB0YXNrIGF0IHRhc2tncm91cCBiZWdpbiAqL1wKKyAgICBtYWNybyAob21wdF9ldmVudF90YXNrZ3JvdXBfZW5kLCAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICA0NCkgLyogdGFzayBhdCB0YXNrZ3JvdXAgZW5kICovICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3JlbGVhc2VfbmVzdF9sb2NrX3ByZXYsICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDQ1KSAvKiBwcmV2IG5lc3QgbG9jayByZWxlYXNlICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF9sb2NrLCAgICAgICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNDYpIC8qIGxvY2sgd2FpdCAqLyAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfbmVzdF9sb2NrLCAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDQ3KSAvKiBuZXN0IGxvY2sgd2FpdCAqLyAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X2NyaXRpY2FsLCAgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA0OCkgLyogY3JpdGljYWwgd2FpdCAqLyAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF9hdG9taWMsICAgICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNDkpIC8qIGF0b21pYyB3YWl0ICovICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfb3JkZXJlZCwgICAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDUwKSAvKiBvcmRlcmVkIHdhaXQgKi8gICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfYWNxdWlyZWRfbG9jaywgICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTEpIC8qIGxvY2sgYWNxdWlyZWQgKi8gICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2FjcXVpcmVkX25lc3RfbG9ja19maXJzdCwgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDUyKSAvKiAxc3QgbmVzdCBsb2NrIGFjcXVpcmVkICovIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9hY3F1aXJlZF9uZXN0X2xvY2tfbmV4dCwgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA1MykgLyogbmV4dCBuZXN0IGxvY2sgYWNxdWlyZWQqLyBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfYWNxdWlyZWRfY3JpdGljYWwsICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTQpIC8qIGNyaXRpY2FsIGFjcXVpcmVkICovICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2FjcXVpcmVkX2F0b21pYywgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDU1KSAvKiBhdG9taWMgYWNxdWlyZWQgKi8gICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9hY3F1aXJlZF9vcmRlcmVkLCAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA1NikgLyogb3JkZXJlZCBhY3F1aXJlZCAqLyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2luaXRfbG9jaywgICAgICAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDU3KSAvKiBsb2NrIGluaXQgKi8gICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pbml0X25lc3RfbG9jaywgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA1OCkgLyogbmVzdCBsb2NrIGluaXQgKi8gICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2Rlc3Ryb3lfbG9jaywgICAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDU5KSAvKiBsb2NrIGRlc3RydWN0aW9uICovICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9kZXN0cm95X25lc3RfbG9jaywgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA2MCkgLyogbmVzdCBsb2NrIGRlc3RydWN0aW9uICovICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2ZsdXNoLCAgICAgICAgICAgICAgICAgICAgb21wdF9jYWxsYmFja190LCAgICAgICAgICAgICAgIDYxKSAvKiBhZnRlciBleGVjdXRpbmcgZmx1c2ggKi8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZGF0YSB0eXBlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogaWRlbnRpZmllcnMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordHlwZWRlZiB1aW50NjRfdCBvbXB0X3RocmVhZF9pZF90OworI2RlZmluZSBvbXB0X3RocmVhZF9pZF9ub25lICgob21wdF90aHJlYWRfaWRfdCkgMCkgICAgIC8qIG5vbi1zdGFuZGFyZCAqLworCit0eXBlZGVmIHVpbnQ2NF90IG9tcHRfdGFza19pZF90OworI2RlZmluZSBvbXB0X3Rhc2tfaWRfbm9uZSAoKG9tcHRfdGFza19pZF90KSAwKSAgICAgICAgIC8qIG5vbi1zdGFuZGFyZCAqLworCit0eXBlZGVmIHVpbnQ2NF90IG9tcHRfcGFyYWxsZWxfaWRfdDsKKyNkZWZpbmUgb21wdF9wYXJhbGxlbF9pZF9ub25lICgob21wdF9wYXJhbGxlbF9pZF90KSAwKSAvKiBub24tc3RhbmRhcmQgKi8KKwordHlwZWRlZiB1aW50NjRfdCBvbXB0X3dhaXRfaWRfdDsKKyNkZWZpbmUgb21wdF93YWl0X2lkX25vbmUgKChvbXB0X3dhaXRfaWRfdCkgMCkgICAgICAgICAvKiBub24tc3RhbmRhcmQgKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogb21wdF9mcmFtZV90CisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgc3RydWN0IG9tcHRfZnJhbWVfcyB7CisgICAgdm9pZCAqZXhpdF9ydW50aW1lX2ZyYW1lOyAgICAvKiBuZXh0IGZyYW1lIGlzIHVzZXIgY29kZSAgICAgKi8KKyAgICB2b2lkICpyZWVudGVyX3J1bnRpbWVfZnJhbWU7IC8qIHByZXZpb3VzIGZyYW1lIGlzIHVzZXIgY29kZSAqLworfSBvbXB0X2ZyYW1lX3Q7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBlbnVtZXJhdGlvbnMgZm9yIHRocmVhZCBzdGF0ZXMgYW5kIHJ1bnRpbWUgZXZlbnRzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBydW50aW1lIHN0YXRlcworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIGVudW0geworI2RlZmluZSBvbXB0X3N0YXRlX21hY3JvKHN0YXRlLCBjb2RlKSBzdGF0ZSA9IGNvZGUsCisgICAgRk9SRUFDSF9PTVBUX1NUQVRFKG9tcHRfc3RhdGVfbWFjcm8pCisjdW5kZWYgb21wdF9zdGF0ZV9tYWNybworfSBvbXB0X3N0YXRlX3Q7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHJ1bnRpbWUgZXZlbnRzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgZW51bSB7CisjZGVmaW5lIG9tcHRfZXZlbnRfbWFjcm8oZXZlbnQsIGNhbGxiYWNrLCBldmVudGlkKSBldmVudCA9IGV2ZW50aWQsCisgICAgRk9SRUFDSF9PTVBUX0VWRU5UKG9tcHRfZXZlbnRfbWFjcm8pCisjdW5kZWYgb21wdF9ldmVudF9tYWNybworfSBvbXB0X2V2ZW50X3Q7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHNldCBjYWxsYmFjayByZXN1bHRzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIGVudW0geworICAgIG9tcHRfc2V0X3Jlc3VsdF9yZWdpc3RyYXRpb25fZXJyb3IgICAgICAgICAgICAgID0gMCwKKyAgICBvbXB0X3NldF9yZXN1bHRfZXZlbnRfbWF5X29jY3VyX25vX2NhbGxiYWNrICAgICA9IDEsCisgICAgb21wdF9zZXRfcmVzdWx0X2V2ZW50X25ldmVyX29jY3VycyAgICAgICAgICAgICAgPSAyLAorICAgIG9tcHRfc2V0X3Jlc3VsdF9ldmVudF9tYXlfb2NjdXJfY2FsbGJhY2tfc29tZSAgID0gMywKKyAgICBvbXB0X3NldF9yZXN1bHRfZXZlbnRfbWF5X29jY3VyX2NhbGxiYWNrX2Fsd2F5cyA9IDQsCit9IG9tcHRfc2V0X3Jlc3VsdF90OworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjYWxsYmFjayBzaWduYXR1cmVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGluaXRpYWxpemF0aW9uICovCit0eXBlZGVmIHZvaWQgKCpvbXB0X2ludGVyZmFjZV9mbl90KSh2b2lkKTsKKwordHlwZWRlZiBvbXB0X2ludGVyZmFjZV9mbl90ICgqb21wdF9mdW5jdGlvbl9sb29rdXBfdCkoCisgICAgY29uc3QgY2hhciAqICAgICAgICAgICAgICAgICAgICAgIC8qIGVudHJ5IHBvaW50IHRvIGxvb2sgdXAgICAgICAgKi8KKyk7CisKKy8qIHRocmVhZHMgKi8KK3R5cGVkZWYgdm9pZCAoKm9tcHRfdGhyZWFkX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3RocmVhZF9pZF90IHRocmVhZF9pZCAgICAgICAgLyogSUQgb2YgdGhyZWFkICAgICAgICAgICAgICAgICAqLworKTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBvbXB0X3RocmVhZF9pbml0aWFsID0gMSwgLy8gc3RhcnQgdGhlIGVudW1lcmF0aW9uIGF0IDEKKyAgICBvbXB0X3RocmVhZF93b3JrZXIgID0gMiwKKyAgICBvbXB0X3RocmVhZF9vdGhlciAgID0gMworfSBvbXB0X3RocmVhZF90eXBlX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgb21wdF9pbnZva2VyX3Byb2dyYW0gPSAwLCAgICAgICAgIC8qIHByb2dyYW0gaW52b2tlcyBtYXN0ZXIgdGFzayAgKi8KKyAgICBvbXB0X2ludm9rZXJfcnVudGltZSA9IDEgICAgICAgICAgLyogcnVudGltZSBpbnZva2VzIG1hc3RlciB0YXNrICAqLworfSBvbXB0X2ludm9rZXJfdDsKKwordHlwZWRlZiB2b2lkICgqb21wdF90aHJlYWRfdHlwZV9jYWxsYmFja190KSAoCisgICAgb21wdF90aHJlYWRfdHlwZV90IHRocmVhZF90eXBlLCAgIC8qIHR5cGUgb2YgdGhyZWFkICAgICAgICAgICAgICAgKi8KKyAgICBvbXB0X3RocmVhZF9pZF90IHRocmVhZF9pZCAgICAgICAgLyogSUQgb2YgdGhyZWFkICAgICAgICAgICAgICAgICAqLworKTsKKwordHlwZWRlZiB2b2lkICgqb21wdF93YWl0X2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3dhaXRfaWRfdCB3YWl0X2lkICAgICAgICAgICAgLyogd2FpdCBpZCAgICAgICAgICAgICAgICAgICAgICAqLworKTsKKworLyogcGFyYWxsZWwgYW5kIHdvcmtzaGFyZXMgKi8KK3R5cGVkZWYgdm9pZCAoKm9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBwYXJhbGxlbF9pZCwgICAgLyogaWQgb2YgcGFyYWxsZWwgcmVnaW9uICAgICAgICovCisgICAgb21wdF90YXNrX2lkX3QgdGFza19pZCAgICAgICAgICAgICAvKiBpZCBvZiB0YXNrICAgICAgICAgICAgICAgICAgKi8KKyk7CisKK3R5cGVkZWYgdm9pZCAoKm9tcHRfbmV3X3dvcmtzaGFyZV9jYWxsYmFja190KSAoCisgICAgb21wdF9wYXJhbGxlbF9pZF90IHBhcmFsbGVsX2lkLCAgIC8qIGlkIG9mIHBhcmFsbGVsIHJlZ2lvbiAgICAgICAgKi8KKyAgICBvbXB0X3Rhc2tfaWRfdCBwYXJlbnRfdGFza19pZCwgICAgLyogaWQgb2YgcGFyZW50IHRhc2sgICAgICAgICAgICAqLworICAgIHZvaWQgKndvcmtzaGFyZV9mdW5jdGlvbiAgICAgICAgICAvKiBwb2ludGVyIHRvIG91dGxpbmVkIGZ1bmN0aW9uICovCispOworCit0eXBlZGVmIHZvaWQgKCpvbXB0X25ld19wYXJhbGxlbF9jYWxsYmFja190KSAoCisgICAgb21wdF90YXNrX2lkX3QgcGFyZW50X3Rhc2tfaWQsICAgIC8qIGlkIG9mIHBhcmVudCB0YXNrICAgICAgICAgICAgKi8KKyAgICBvbXB0X2ZyYW1lX3QgKnBhcmVudF90YXNrX2ZyYW1lLCAgLyogZnJhbWUgZGF0YSBvZiBwYXJlbnQgdGFzayAgICAqLworICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBwYXJhbGxlbF9pZCwgICAvKiBpZCBvZiBwYXJhbGxlbCByZWdpb24gICAgICAgICovCisgICAgdWludDMyX3QgcmVxdWVzdGVkX3RlYW1fc2l6ZSwgICAgIC8qIG51bWJlciBvZiB0aHJlYWRzIGluIHRlYW0gICAgKi8KKyAgICB2b2lkICpwYXJhbGxlbF9mdW5jdGlvbiwgICAgICAgICAgLyogcG9pbnRlciB0byBvdXRsaW5lZCBmdW5jdGlvbiAqLworICAgIG9tcHRfaW52b2tlcl90IGludm9rZXIgICAgICAgICAgICAvKiB3aG8gaW52b2tlcyBtYXN0ZXIgdGFzaz8gICAgKi8gCispOworCit0eXBlZGVmIHZvaWQgKCpvbXB0X2VuZF9wYXJhbGxlbF9jYWxsYmFja190KSAoCisgICAgb21wdF9wYXJhbGxlbF9pZF90IHBhcmFsbGVsX2lkLCAgIC8qIGlkIG9mIHBhcmFsbGVsIHJlZ2lvbiAgICAgICAqLworICAgIG9tcHRfdGFza19pZF90IHRhc2tfaWQsICAgICAgICAgICAvKiBpZCBvZiB0YXNrICAgICAgICAgICAgICAgICAgKi8KKyAgICBvbXB0X2ludm9rZXJfdCBpbnZva2VyICAgICAgICAgICAgLyogd2hvIGludm9rZXMgbWFzdGVyIHRhc2s/ICAgICovIAorKTsKKworLyogdGFza3MgKi8KK3R5cGVkZWYgdm9pZCAoKm9tcHRfdGFza19jYWxsYmFja190KSAoCisgICAgb21wdF90YXNrX2lkX3QgdGFza19pZCAgICAgICAgICAgIC8qIGlkIG9mIHRhc2sgICAgICAgICAgICAgICAgICAgKi8KKyk7CisKK3R5cGVkZWYgdm9pZCAoKm9tcHRfdGFza19wYWlyX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3Rhc2tfaWRfdCBmaXJzdF90YXNrX2lkLAorICAgIG9tcHRfdGFza19pZF90IHNlY29uZF90YXNrX2lkCispOworCit0eXBlZGVmIHZvaWQgKCpvbXB0X25ld190YXNrX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3Rhc2tfaWRfdCBwYXJlbnRfdGFza19pZCwgICAgLyogaWQgb2YgcGFyZW50IHRhc2sgICAgICAgICAgICAqLworICAgIG9tcHRfZnJhbWVfdCAqcGFyZW50X3Rhc2tfZnJhbWUsICAvKiBmcmFtZSBkYXRhIGZvciBwYXJlbnQgdGFzayAgICovCisgICAgb21wdF90YXNrX2lkX3QgIG5ld190YXNrX2lkLCAgICAgIC8qIGlkIG9mIGNyZWF0ZWQgdGFzayAgICAgICAgICAgKi8KKyAgICB2b2lkICp0YXNrX2Z1bmN0aW9uICAgICAgICAgICAgICAgLyogcG9pbnRlciB0byBvdXRsaW5lZCBmdW5jdGlvbiAqLworKTsKKworLyogcHJvZ3JhbSAqLwordHlwZWRlZiB2b2lkICgqb21wdF9jb250cm9sX2NhbGxiYWNrX3QpICgKKyAgICB1aW50NjRfdCBjb21tYW5kLCAgICAgICAgICAgICAgICAgLyogY29tbWFuZCBvZiBjb250cm9sIGNhbGwgICAgICAqLworICAgIHVpbnQ2NF90IG1vZGlmaWVyICAgICAgICAgICAgICAgICAvKiBtb2RpZmllciBvZiBjb250cm9sIGNhbGwgICAgICovCispOworCit0eXBlZGVmIHZvaWQgKCpvbXB0X2NhbGxiYWNrX3QpKHZvaWQpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBvbXB0IEFQSQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBPTVBUX0FQSV9GTlRZUEUoZm4pIGZuIyNfdAorCisjZGVmaW5lIE9NUFRfQVBJX0ZVTkNUSU9OKHJldHVybl90eXBlLCBmbiwgYXJncykgIFwKKyAgICB0eXBlZGVmIHJldHVybl90eXBlICgqT01QVF9BUElfRk5UWVBFKGZuKSkgYXJncworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElOUVVJUlkgRlVOQ1RJT05TCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBzdGF0ZSAqLworT01QVF9BUElfRlVOQ1RJT04ob21wdF9zdGF0ZV90LCBvbXB0X2dldF9zdGF0ZSwgKAorICAgIG9tcHRfd2FpdF9pZF90ICpvbXB0X3dhaXRfaWQKKykpOworCisvKiB0aHJlYWQgKi8KK09NUFRfQVBJX0ZVTkNUSU9OKG9tcHRfdGhyZWFkX2lkX3QsIG9tcHRfZ2V0X3RocmVhZF9pZCwgKHZvaWQpKTsKKworT01QVF9BUElfRlVOQ1RJT04odm9pZCAqLCBvbXB0X2dldF9pZGxlX2ZyYW1lLCAodm9pZCkpOworCisvKiBwYXJhbGxlbCByZWdpb24gKi8KK09NUFRfQVBJX0ZVTkNUSU9OKG9tcHRfcGFyYWxsZWxfaWRfdCwgb21wdF9nZXRfcGFyYWxsZWxfaWQsICgKKyAgICBpbnQgYW5jZXN0b3JfbGV2ZWwKKykpOworCitPTVBUX0FQSV9GVU5DVElPTihpbnQsIG9tcHRfZ2V0X3BhcmFsbGVsX3RlYW1fc2l6ZSwgKAorICAgIGludCBhbmNlc3Rvcl9sZXZlbAorKSk7CisKKy8qIHRhc2sgKi8KK09NUFRfQVBJX0ZVTkNUSU9OKG9tcHRfdGFza19pZF90LCBvbXB0X2dldF90YXNrX2lkLCAoCisgICAgaW50IGRlcHRoCispKTsKKworT01QVF9BUElfRlVOQ1RJT04ob21wdF9mcmFtZV90ICosIG9tcHRfZ2V0X3Rhc2tfZnJhbWUsICgKKyAgICBpbnQgZGVwdGgKKykpOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBMQUNFSE9MREVSUyBGT1IgUEVSRk9STUFOQ0UgUkVQT1JUSU5HCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBpZGxlICovCitPTVBUX0FQSV9GVU5DVElPTih2b2lkLCBvbXB0X2lkbGUsICgKKyAgICB2b2lkCispKTsKKworLyogb3ZlcmhlYWQgKi8KK09NUFRfQVBJX0ZVTkNUSU9OKHZvaWQsIG9tcHRfb3ZlcmhlYWQsICgKKyAgICB2b2lkCispKTsKKworLyogYmFycmllciB3YWl0ICovCitPTVBUX0FQSV9GVU5DVElPTih2b2lkLCBvbXB0X2JhcnJpZXJfd2FpdCwgKAorICAgIHZvaWQKKykpOworCisvKiB0YXNrIHdhaXQgKi8KK09NUFRfQVBJX0ZVTkNUSU9OKHZvaWQsIG9tcHRfdGFza193YWl0LCAoCisgICAgdm9pZAorKSk7CisKKy8qIG11dGV4IHdhaXQgKi8KK09NUFRfQVBJX0ZVTkNUSU9OKHZvaWQsIG9tcHRfbXV0ZXhfd2FpdCwgKAorICAgIHZvaWQKKykpOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElOSVRJQUxJWkFUSU9OIEZVTkNUSU9OUworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworT01QVF9BUElfRlVOQ1RJT04odm9pZCwgb21wdF9pbml0aWFsaXplLCAoCisgICAgb21wdF9mdW5jdGlvbl9sb29rdXBfdCBvbXB0X2ZuX2xvb2t1cCwKKyAgICBjb25zdCBjaGFyICpydW50aW1lX3ZlcnNpb24sCisgICAgdW5zaWduZWQgaW50IG9tcHRfdmVyc2lvbgorKSk7CisKKworLyogaW5pdGlhbGl6YXRpb24gaW50ZXJmYWNlIHRvIGJlIGRlZmluZWQgYnkgdG9vbCAqLworb21wdF9pbml0aWFsaXplX3Qgb21wdF90b29sKHZvaWQpOworCit0eXBlZGVmIGVudW0gb3B0X2luaXRfbW9kZV9lIHsKKyAgICBvbXB0X2luaXRfbW9kZV9uZXZlciAgPSAwLAorICAgIG9tcHRfaW5pdF9tb2RlX2ZhbHNlICA9IDEsCisgICAgb21wdF9pbml0X21vZGVfdHJ1ZSAgID0gMiwKKyAgICBvbXB0X2luaXRfbW9kZV9hbHdheXMgPSAzCit9IG9tcHRfaW5pdF9tb2RlX3Q7CisKK09NUFRfQVBJX0ZVTkNUSU9OKGludCwgb21wdF9zZXRfY2FsbGJhY2ssICgKKyAgICBvbXB0X2V2ZW50X3QgZXZlbnQsCisgICAgb21wdF9jYWxsYmFja190IGNhbGxiYWNrCispKTsKKwordHlwZWRlZiBlbnVtIG9tcHRfc2V0X2NhbGxiYWNrX3JjX2UgeyAgLyogbm9uLXN0YW5kYXJkICovCisgICAgb21wdF9zZXRfY2FsbGJhY2tfZXJyb3IgICAgICA9IDAsCisgICAgb21wdF9oYXNfZXZlbnRfbm9fY2FsbGJhY2sgICA9IDEsCisgICAgb21wdF9ub19ldmVudF9ub19jYWxsYmFjayAgICA9IDIsCisgICAgb21wdF9oYXNfZXZlbnRfbWF5X2NhbGxiYWNrICA9IDMsCisgICAgb21wdF9oYXNfZXZlbnRfbXVzdF9jYWxsYmFjayA9IDQsCit9IG9tcHRfc2V0X2NhbGxiYWNrX3JjX3Q7CisKKworT01QVF9BUElfRlVOQ1RJT04oaW50LCBvbXB0X2dldF9jYWxsYmFjaywgKAorICAgIG9tcHRfZXZlbnRfdCBldmVudCwKKyAgICBvbXB0X2NhbGxiYWNrX3QgKmNhbGxiYWNrCispKTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNSVNDRUxMQU5FT1VTIEZVTkNUSU9OUworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogY29udHJvbCAqLworI2lmIGRlZmluZWQoX09QRU5NUCkgJiYgKF9PUEVOTVAgPj0gMjAxMzA3KQorI3ByYWdtYSBvbXAgZGVjbGFyZSB0YXJnZXQKKyNlbmRpZgordm9pZCBvbXB0X2NvbnRyb2woCisgICAgdWludDY0X3QgY29tbWFuZCwKKyAgICB1aW50NjRfdCBtb2RpZmllcgorKTsKKyNpZiBkZWZpbmVkKF9PUEVOTVApICYmIChfT1BFTk1QID49IDIwMTMwNykKKyNwcmFnbWEgb21wIGVuZCBkZWNsYXJlIHRhcmdldAorI2VuZGlmCisKKy8qIHN0YXRlIGVudW1lcmF0aW9uICovCitPTVBUX0FQSV9GVU5DVElPTihpbnQsIG9tcHRfZW51bWVyYXRlX3N0YXRlLCAoCisgICAgaW50IGN1cnJlbnRfc3RhdGUsCisgICAgaW50ICpuZXh0X3N0YXRlLAorICAgIGNvbnN0IGNoYXIgKipuZXh0X3N0YXRlX25hbWUKKykpOworCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9OworI2VuZGlmCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXAuaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNjJlZjkKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXAuaApAQCAtMCwwICsxLDM1NTAgQEAKKy8qISBcZmlsZSAqLworLyoKKyAqIGttcC5oIC0tIEtQVFMgcnVudGltZSBoZWFkZXIgZmlsZS4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBLTVBfSAorI2RlZmluZSBLTVBfSAorCisjaW5jbHVkZSAia21wX2NvbmZpZy5oIgorCisvKiAjZGVmaW5lIEJVSUxEX1BBUkFMTEVMX09SREVSRUQgMSAqLworCisvKiBUaGlzIGZpeCByZXBsYWNlcyBnZXR0aW1lb2ZkYXkgd2l0aCBjbG9ja19nZXR0aW1lIGZvciBiZXR0ZXIgc2NhbGFiaWxpdHkgb24KKyAgIHRoZSBBbHRpeC4gIFJlcXVpcmVzIHVzZXIgY29kZSB0byBiZSBsaW5rZWQgd2l0aCAtbHJ0LgorKi8KKy8vI2RlZmluZSBGSVhfU0dJX0NMT0NLCisKKy8qIERlZmluZXMgZm9yIE9wZW5NUCAzLjAgdGFza2luZyBhbmQgYXV0byBzY2hlZHVsaW5nICovCisKKyMgaWZuZGVmIEtNUF9TVEFUSUNfU1RFQUxfRU5BQkxFRAorIyAgZGVmaW5lIEtNUF9TVEFUSUNfU1RFQUxfRU5BQkxFRCAxCisjIGVuZGlmCisKKyNkZWZpbmUgVEFTS19DVVJSRU5UX05PVF9RVUVVRUQgIDAKKyNkZWZpbmUgVEFTS19DVVJSRU5UX1FVRVVFRCAgICAgIDEKKworI2RlZmluZSBUQVNLX0RFUVVFX0JJVFMgICAgICAgICAgOCAgLy8gVXNlZCBzb2xlbHkgdG8gZGVmaW5lIFRBU0tfREVRVUVfU0laRSBhbmQgVEFTS19ERVFVRV9NQVNLLgorI2RlZmluZSBUQVNLX0RFUVVFX1NJWkUgICAgICAgICAgKCAxIDw8IFRBU0tfREVRVUVfQklUUyApCisjZGVmaW5lIFRBU0tfREVRVUVfTUFTSyAgICAgICAgICAoIFRBU0tfREVRVUVfU0laRSAtIDEgKQorCisjaWZkZWYgQlVJTERfVElFRF9UQVNLX1NUQUNLCisjZGVmaW5lIFRBU0tfU1RBQ0tfRU1QVFkgICAgICAgICAwICAvLyBlbnRyaWVzIHdoZW4gdGhlIHN0YWNrIGlzIGVtcHR5CisKKyNkZWZpbmUgVEFTS19TVEFDS19CTE9DS19CSVRTICAgIDUgIC8vIFVzZWQgdG8gZGVmaW5lIFRBU0tfU1RBQ0tfU0laRSBhbmQgVEFTS19TVEFDS19NQVNLCisjZGVmaW5lIFRBU0tfU1RBQ0tfQkxPQ0tfU0laRSAgICAoIDEgPDwgVEFTS19TVEFDS19CTE9DS19CSVRTICkgLy8gTnVtYmVyIG9mIGVudHJpZXMgaW4gZWFjaCB0YXNrIHN0YWNrIGFycmF5CisjZGVmaW5lIFRBU0tfU1RBQ0tfSU5ERVhfTUFTSyAgICAoIFRBU0tfU1RBQ0tfQkxPQ0tfU0laRSAtIDEgKSAgLy8gTWFzayBmb3IgZGV0ZXJtaW5pbmcgaW5kZXggaW50byBzdGFjayBibG9jaworI2VuZGlmIC8vIEJVSUxEX1RJRURfVEFTS19TVEFDSworCisjZGVmaW5lIFRBU0tfTk9UX1BVU0hFRCAgICAgICAgICAxCisjZGVmaW5lIFRBU0tfU1VDQ0VTU0ZVTExZX1BVU0hFRCAwCisjZGVmaW5lIFRBU0tfVElFRCAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFRBU0tfVU5USUVEICAgICAgICAgICAgICAwCisjZGVmaW5lIFRBU0tfRVhQTElDSVQgICAgICAgICAgICAxCisjZGVmaW5lIFRBU0tfSU1QTElDSVQgICAgICAgICAgICAwCisjZGVmaW5lIFRBU0tfUFJPWFkgICAgICAgICAgICAgICAxCisjZGVmaW5lIFRBU0tfRlVMTCAgICAgICAgICAgICAgICAwCisKKyNkZWZpbmUgS01QX0NBTkNFTF9USFJFQURTCisjZGVmaW5lIEtNUF9USFJFQURfQVRUUgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKy8qICBpbmNsdWRlIDxjdHlwZS5oPiBkb24ndCB1c2U7IHByb2JsZW1zIHdpdGggL01EIG9uIFdpbmRvd3MqIE9TIE5UIGR1ZSB0byBiYWQgTWljcm9zb2Z0IGxpYnJhcnkgICovCisvKiAgc29tZSBtYWNyb3MgcHJvdmlkZWQgYmVsb3cgdG8gcmVwbGFjZSBzb21lIG9mIHRoZXNlIGZ1bmN0aW9ucyAgKi8KKyNpZm5kZWYgX19BQlNPRlRfV0lOCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSAia21wX29zLmgiCisKKyNpbmNsdWRlICJrbXBfc2FmZV9jX2FwaS5oIgorCisjaWYgS01QX1NUQVRTX0VOQUJMRUQKK2NsYXNzIGttcF9zdGF0c19saXN0OworI2VuZGlmCisKKyNpZiBLTVBfVVNFX0hXTE9DCisjaW5jbHVkZSAiaHdsb2MuaCIKK2V4dGVybiBod2xvY190b3BvbG9neV90IF9fa21wX2h3bG9jX3RvcG9sb2d5OworZXh0ZXJuIGludCBfX2ttcF9od2xvY19lcnJvcjsKKyNlbmRpZgorCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorI2luY2x1ZGUgPHhtbWludHJpbi5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJrbXBfdmVyc2lvbi5oIgorI2luY2x1ZGUgImttcF9kZWJ1Zy5oIgorI2luY2x1ZGUgImttcF9sb2NrLmgiCisjaWYgVVNFX0RFQlVHR0VSCisjaW5jbHVkZSAia21wX2RlYnVnZ2VyLmgiCisjZW5kaWYKKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorCisjZGVmaW5lIEtNUF9IQU5ETEVfU0lHTkFMUyAoS01QX09TX1VOSVggfHwgS01QX09TX1dJTkRPV1MpCisKKyNpbmNsdWRlICJrbXBfd3JhcHBlcl9tYWxsb2MuaCIKKyNpZiBLTVBfT1NfVU5JWAorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgaWYgIWRlZmluZWQgTlNJRyAmJiBkZWZpbmVkIF9OU0lHCisjICBkZWZpbmUgTlNJRyBfTlNJRworIyBlbmRpZgorI2VuZGlmCisKKyNpZiBLTVBfT1NfTElOVVgKKyMgcHJhZ21hIHdlYWsgY2xvY2tfZ2V0dGltZQorI2VuZGlmCisKKyNpZiBPTVBUX1NVUFBPUlQKKyNpbmNsdWRlICJvbXB0LWludGVybmFsLmgiCisjZW5kaWYKKworLypTZWxlY3QgZGF0YSBwbGFjZW1lbnQgaW4gTlVNQSBtZW1vcnkgKi8KKyNkZWZpbmUgTk9fRklSU1RfVE9VQ0ggMAorI2RlZmluZSBGSVJTVF9UT1VDSCAxICAgICAgIC8qIEV4cGxvaXQgU0dJJ3MgZmlyc3QgdG91Y2ggcGFnZSBwbGFjZW1lbnQgYWxnbyAqLworCisvKiBJZiBub3Qgc3BlY2lmaWVkIG9uIGNvbXBpbGUgY29tbWFuZCBsaW5lLCBhc3N1bWUgbm8gZmlyc3QgdG91Y2ggKi8KKyNpZm5kZWYgQlVJTERfTUVNT1JZCisjZGVmaW5lIEJVSUxEX01FTU9SWSBOT19GSVJTVF9UT1VDSAorI2VuZGlmCisKKy8vIDAgLSBubyBmYXN0IG1lbW9yeSBhbGxvY2F0aW9uLCBhbGlnbm1lbnQ6IDgtYnl0ZSBvbiB4ODYsIDE2LWJ5dGUgb24geDY0LgorLy8gMyAtIGZhc3QgYWxsb2NhdGlvbiB1c2luZyBzeW5jLCBub24tc3luYyBmcmVlIGxpc3RzIG9mIGFueSBzaXplLCBub24tc2VsZiBmcmVlIGxpc3RzIG9mIGxpbWl0ZWQgc2l6ZS4KKyNpZm5kZWYgVVNFX0ZBU1RfTUVNT1JZCisjZGVmaW5lIFVTRV9GQVNUX01FTU9SWSAzCisjZW5kaWYKKworI2lmbmRlZiBLTVBfTkVTVEVEX0hPVF9URUFNUworIyBkZWZpbmUgS01QX05FU1RFRF9IT1RfVEVBTVMgMAorIyBkZWZpbmUgVVNFX05FU1RFRF9IT1RfQVJHKHgpCisjZWxzZQorIyBpZiBLTVBfTkVTVEVEX0hPVF9URUFNUworIyAgaWYgT01QXzQwX0VOQUJMRUQKKyMgICBkZWZpbmUgVVNFX05FU1RFRF9IT1RfQVJHKHgpICx4CisjICBlbHNlCisvLyBOZXN0ZWQgaG90IHRlYW1zIGZlYXR1cmUgZGVwZW5kcyBvbiBvbXAgNC4wLCBkaXNhYmxlIGl0IGZvciBlYXJsaWVyIHZlcnNpb25zCisjICAgdW5kZWYgS01QX05FU1RFRF9IT1RfVEVBTVMKKyMgICBkZWZpbmUgS01QX05FU1RFRF9IT1RfVEVBTVMgMAorIyAgIGRlZmluZSBVU0VfTkVTVEVEX0hPVF9BUkcoeCkKKyMgIGVuZGlmCisjIGVsc2UKKyMgIGRlZmluZSBVU0VfTkVTVEVEX0hPVF9BUkcoeCkKKyMgZW5kaWYKKyNlbmRpZgorCisvLyBBc3N1bWUgdXNpbmcgQkdFVCBjb21wYXJlX2V4Y2hhbmdlIGluc3RydWN0aW9uIGluc3RlYWQgb2YgbG9jayBieSBkZWZhdWx0LgorI2lmbmRlZiBVU0VfQ01QX1hDSEdfRk9SX0JHRVQKKyNkZWZpbmUgVVNFX0NNUF9YQ0hHX0ZPUl9CR0VUIDEKKyNlbmRpZgorCisvLyBUZXN0IHRvIHNlZSBpZiBxdWV1aW5nIGxvY2sgaXMgYmV0dGVyIHRoYW4gYm9vdHN0cmFwIGxvY2sgZm9yIGJnZXQKKy8vICNpZm5kZWYgVVNFX1FVRVVJTkdfTE9DS19GT1JfQkdFVAorLy8gI2RlZmluZSBVU0VfUVVFVUlOR19MT0NLX0ZPUl9CR0VUCisvLyAjZW5kaWYKKworI2RlZmluZSBLTVBfTlNFQ19QRVJfU0VDIDEwMDAwMDAwMDBMCisjZGVmaW5lIEtNUF9VU0VDX1BFUl9TRUMgMTAwMDAwMEwKKworLyohCitAaW5ncm91cCBCQVNJQ19UWVBFUworQHsKKyovCisKKy8vIEZJWE1FIERPWFlHRU4uLi4gbmVlZCB0byBncm91cCB0aGVzZSBmbGFncyBzb21laG93IChNYWtpbmcgdGhlbSBhbiBhbm9ueW1vdXMgZW51bSB3b3VsZCBkbyBpdC4uLikKKy8qIQorVmFsdWVzIGZvciBiaXQgZmxhZ3MgdXNlZCBpbiB0aGUgaWRlbnRfdCB0byBkZXNjcmliZSB0aGUgZmllbGRzLgorKi8KKy8qISBVc2UgdHJhbXBvbGluZSBmb3IgaW50ZXJuYWwgbWljcm90YXNrcyAqLworI2RlZmluZSBLTVBfSURFTlRfSU1CICAgICAgICAgICAgIDB4MDEKKy8qISBVc2UgYy1zdHlsZSBpZGVudCBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgS01QX0lERU5UX0tNUEMgICAgICAgICAgICAweDAyCisvKiAweDA0IGlzIG5vIGxvbmdlciB1c2VkICovCisvKiEgRW50cnkgcG9pbnQgZ2VuZXJhdGVkIGJ5IGF1dG8tcGFyYWxsZWxpemF0aW9uICovCisjZGVmaW5lIEtNUF9JREVOVF9BVVRPUEFSICAgICAgICAgMHgwOAorLyohIENvbXBpbGVyIGdlbmVyYXRlcyBhdG9taWMgcmVkdWN0aW9uIG9wdGlvbiBmb3Iga21wY19yZWR1Y2UqICovCisjZGVmaW5lIEtNUF9JREVOVF9BVE9NSUNfUkVEVUNFICAgMHgxMAorLyohIFRvIG1hcmsgYSAnYmFycmllcicgZGlyZWN0aXZlIGluIHVzZXIgY29kZSAqLworI2RlZmluZSBLTVBfSURFTlRfQkFSUklFUl9FWFBMICAgIDB4MjAKKy8qISBUbyBNYXJrIGltcGxpY2l0IGJhcnJpZXJzLiAqLworI2RlZmluZSBLTVBfSURFTlRfQkFSUklFUl9JTVBMICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgS01QX0lERU5UX0JBUlJJRVJfSU1QTF9NQVNLICAgICAgMHgwMUMwCisjZGVmaW5lIEtNUF9JREVOVF9CQVJSSUVSX0lNUExfRk9SICAgICAgIDB4MDA0MAorI2RlZmluZSBLTVBfSURFTlRfQkFSUklFUl9JTVBMX1NFQ1RJT05TICAweDAwQzAKKworI2RlZmluZSBLTVBfSURFTlRfQkFSUklFUl9JTVBMX1NJTkdMRSAgICAweDAxNDAKKyNkZWZpbmUgS01QX0lERU5UX0JBUlJJRVJfSU1QTF9XT1JLU0hBUkUgMHgwMUMwCisKKy8qIQorICogVGhlIGlkZW50IHN0cnVjdHVyZSB0aGF0IGRlc2NyaWJlcyBhIHNvdXJjZSBsb2NhdGlvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgaWRlbnQgeworICAgIGttcF9pbnQzMiByZXNlcnZlZF8xOyAgIC8qKjwgIG1pZ2h0IGJlIHVzZWQgaW4gRm9ydHJhbjsgc2VlIGFib3ZlICAqLworICAgIGttcF9pbnQzMiBmbGFnczsgICAgICAgIC8qKjwgIGFsc28gZi5mbGFnczsgS01QX0lERU5UX3h4eCBmbGFnczsgS01QX0lERU5UX0tNUEMgaWRlbnRpZmllcyB0aGlzIHVuaW9uIG1lbWJlciAgKi8KKyAgICBrbXBfaW50MzIgcmVzZXJ2ZWRfMjsgICAvKio8ICBub3QgcmVhbGx5IHVzZWQgaW4gRm9ydHJhbiBhbnkgbW9yZTsgc2VlIGFib3ZlICovCisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBidXQgY3VycmVudGx5IHVzZWQgZm9yIHN0b3JpbmcgcmVnaW9uLXNwZWNpZmljIElUVCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBjb250ZXh0dWFsIGluZm9ybWF0aW9uLiAqLworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICBrbXBfaW50MzIgcmVzZXJ2ZWRfMzsgICAvKio8IHNvdXJjZVs0XSBpbiBGb3J0cmFuLCBkbyBub3QgdXNlIGZvciBDKysgICovCisgICAgY2hhciBjb25zdCAqcHNvdXJjZTsgICAgLyoqPCBTdHJpbmcgZGVzY3JpYmluZyB0aGUgc291cmNlIGxvY2F0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBzdHJpbmcgaXMgY29tcG9zZWQgb2Ygc2VtaS1jb2xvbiBzZXBhcmF0ZWQgZmllbGRzIHdoaWNoIGRlc2NyaWJlIHRoZSBzb3VyY2UgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZnVuY3Rpb24gYW5kIGEgcGFpciBvZiBsaW5lIG51bWJlcnMgdGhhdCBkZWxpbWl0IHRoZSBjb25zdHJ1Y3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit9IGlkZW50X3Q7CisvKiEKK0B9CisqLworCisvLyBTb21lIGZvcndhcmQgZGVjbGFyYXRpb25zLgorCit0eXBlZGVmIHVuaW9uICBrbXBfdGVhbSAgICAgIGttcF90ZWFtX3Q7Cit0eXBlZGVmIHN0cnVjdCBrbXBfdGFza2RhdGEgIGttcF90YXNrZGF0YV90OwordHlwZWRlZiB1bmlvbiAga21wX3Rhc2tfdGVhbSBrbXBfdGFza190ZWFtX3Q7Cit0eXBlZGVmIHVuaW9uICBrbXBfdGVhbSAgICAgIGttcF90ZWFtX3A7Cit0eXBlZGVmIHVuaW9uICBrbXBfaW5mbyAgICAgIGttcF9pbmZvX3A7Cit0eXBlZGVmIHVuaW9uICBrbXBfcm9vdCAgICAgIGttcF9yb290X3A7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBQYWNrIHR3byAzMi1iaXQgc2lnbmVkIGludGVnZXJzIGludG8gYSA2NC1iaXQgc2lnbmVkIGludGVnZXIgKi8KKy8qIFRvRG86IEZpeCB3b3JkIG9yZGVyaW5nIGZvciBiaWctZW5kaWFuIG1hY2hpbmVzLiAqLworI2RlZmluZSBLTVBfUEFDS182NChISUdIXzMyLExPV18zMikgXAorICAgICggKGttcF9pbnQ2NCkgKCgoKGttcF91aW50NjQpKEhJR0hfMzIpKTw8MzIpIHwgKGttcF91aW50NjQpKExPV18zMikpICkKKworCisvKgorICogR2VuZXJpYyBzdHJpbmcgbWFuaXB1bGF0aW9uIG1hY3Jvcy4KKyAqIEFzc3VtZSB0aGF0IF94IGlzIG9mIHR5cGUgY2hhciAqCisgKi8KKyNkZWZpbmUgU0tJUF9XUyhfeCkgICAgIHsgd2hpbGUgKCooX3gpID09ICcgJyB8fCAqKF94KSA9PSAnXHQnKSAoX3gpKys7IH0KKyNkZWZpbmUgU0tJUF9ESUdJVFMoX3gpIHsgd2hpbGUgKCooX3gpID49ICcwJyAmJiAqKF94KSA8PSAnOScpIChfeCkrKzsgfQorI2RlZmluZSBTS0lQX1RPKF94LF9jKSAgeyB3aGlsZSAoKihfeCkgIT0gJ1wwJyAmJiAqKF94KSAhPSAoX2MpKSAoX3gpKys7IH0KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBLTVBfTUFYKCB4LCB5ICkgKCAoeCkgPiAoeSkgPyAoeCkgOiAoeSkgKQorI2RlZmluZSBLTVBfTUlOKCB4LCB5ICkgKCAoeCkgPCAoeSkgPyAoeCkgOiAoeSkgKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKy8qIEVudW1lcmF0aW9uIHR5cGVzICovCisKK2VudW0ga21wX3N0YXRlX3RpbWVyIHsKKyAgICB0c19zdG9wLAorICAgIHRzX3N0YXJ0LAorICAgIHRzX3BhdXNlLAorCisgICAgdHNfbGFzdF9zdGF0ZQorfTsKKworZW51bSBkeW5hbWljX21vZGUgeworICAgIGR5bmFtaWNfZGVmYXVsdCwKKyNpZmRlZiBVU0VfTE9BRF9CQUxBTkNFCisgICAgZHluYW1pY19sb2FkX2JhbGFuY2UsCisjZW5kaWYgLyogVVNFX0xPQURfQkFMQU5DRSAqLworICAgIGR5bmFtaWNfcmFuZG9tLAorICAgIGR5bmFtaWNfdGhyZWFkX2xpbWl0LAorICAgIGR5bmFtaWNfbWF4Cit9OworCisvKiBleHRlcm5hbCBzY2hlZHVsZSBjb25zdGFudHMsIGR1cGxpY2F0ZSBlbnVtIG9tcF9zY2hlZCBpbiBvbXAuaCBpbiBvcmRlciB0byBub3QgaW5jbHVkZSBpdCBoZXJlICovCisjaWZuZGVmIEtNUF9TQ0hFRF9UWVBFX0RFRklORUQKKyNkZWZpbmUgS01QX1NDSEVEX1RZUEVfREVGSU5FRAordHlwZWRlZiBlbnVtIGttcF9zY2hlZCB7CisgICAga21wX3NjaGVkX2xvd2VyICAgICAgICAgICAgID0gMCwgICAgIC8vIGxvd2VyIGFuZCB1cHBlciBib3VuZHMgYXJlIGZvciByb3V0aW5lIHBhcmFtZXRlciBjaGVjaworICAgIC8vIE5vdGU6IG5lZWQgdG8gYWRqdXN0IF9fa21wX3NjaF9tYXAgZ2xvYmFsIGFycmF5IGluIGNhc2UgdGhpcyBlbnVtIGlzIGNoYW5nZWQKKyAgICBrbXBfc2NoZWRfc3RhdGljICAgICAgICAgICAgPSAxLCAgICAgLy8gbWFwcGVkIHRvIGttcF9zY2hfc3RhdGljX2NodW5rZWQgICAgICAgICAgICgzMykKKyAgICBrbXBfc2NoZWRfZHluYW1pYyAgICAgICAgICAgPSAyLCAgICAgLy8gbWFwcGVkIHRvIGttcF9zY2hfZHluYW1pY19jaHVua2VkICAgICAgICAgICgzNSkKKyAgICBrbXBfc2NoZWRfZ3VpZGVkICAgICAgICAgICAgPSAzLCAgICAgLy8gbWFwcGVkIHRvIGttcF9zY2hfZ3VpZGVkX2NodW5rZWQgICAgICAgICAgICgzNikKKyAgICBrbXBfc2NoZWRfYXV0byAgICAgICAgICAgICAgPSA0LCAgICAgLy8gbWFwcGVkIHRvIGttcF9zY2hfYXV0byAgICAgICAgICAgICAgICAgICAgICgzOCkKKyAgICBrbXBfc2NoZWRfdXBwZXJfc3RkICAgICAgICAgPSA1LCAgICAgLy8gdXBwZXIgYm91bmQgZm9yIHN0YW5kYXJkIHNjaGVkdWxlcworICAgIGttcF9zY2hlZF9sb3dlcl9leHQgICAgICAgICA9IDEwMCwgICAvLyBsb3dlciBib3VuZCBvZiBJbnRlbCBleHRlbnNpb24gc2NoZWR1bGVzCisgICAga21wX3NjaGVkX3RyYXBlem9pZGFsICAgICAgID0gMTAxLCAgIC8vIG1hcHBlZCB0byBrbXBfc2NoX3RyYXBlem9pZGFsICAgICAgICAgICAgICAoMzkpCisvLyAga21wX3NjaGVkX3N0YXRpY19zdGVhbCAgICAgID0gMTAyLCAgIC8vIG1hcHBlZCB0byBrbXBfc2NoX3N0YXRpY19zdGVhbCAgICAgICAgICAgICAoNDQpCisgICAga21wX3NjaGVkX3VwcGVyICAgICAgICAgICAgID0gMTAyLAorICAgIGttcF9zY2hlZF9kZWZhdWx0ID0ga21wX3NjaGVkX3N0YXRpYyAvLyBkZWZhdWx0IHNjaGVkdWxpbmcKK30ga21wX3NjaGVkX3Q7CisjZW5kaWYKKworLyohCisgQGluZ3JvdXAgV09SS19TSEFSSU5HCisgKiBEZXNjcmliZXMgdGhlIGxvb3Agc2NoZWR1bGUgdG8gYmUgdXNlZCBmb3IgYSBwYXJhbGxlbCBmb3IgbG9vcC4KKyAqLworZW51bSBzY2hlZF90eXBlIHsKKyAgICBrbXBfc2NoX2xvd2VyICAgICAgICAgICAgICAgICAgICAgPSAzMiwgICAvKio8IGxvd2VyIGJvdW5kIGZvciB1bm9yZGVyZWQgdmFsdWVzICovCisgICAga21wX3NjaF9zdGF0aWNfY2h1bmtlZCAgICAgICAgICAgID0gMzMsCisgICAga21wX3NjaF9zdGF0aWMgICAgICAgICAgICAgICAgICAgID0gMzQsICAgLyoqPCBzdGF0aWMgdW5zcGVjaWFsaXplZCAqLworICAgIGttcF9zY2hfZHluYW1pY19jaHVua2VkICAgICAgICAgICA9IDM1LAorICAgIGttcF9zY2hfZ3VpZGVkX2NodW5rZWQgICAgICAgICAgICA9IDM2LCAgIC8qKjwgZ3VpZGVkIHVuc3BlY2lhbGl6ZWQgKi8KKyAgICBrbXBfc2NoX3J1bnRpbWUgICAgICAgICAgICAgICAgICAgPSAzNywKKyAgICBrbXBfc2NoX2F1dG8gICAgICAgICAgICAgICAgICAgICAgPSAzOCwgICAvKio8IGF1dG8gKi8KKyAgICBrbXBfc2NoX3RyYXBlem9pZGFsICAgICAgICAgICAgICAgPSAzOSwKKworICAgIC8qIGFjY2Vzc2libGUgb25seSB0aHJvdWdoIEtNUF9TQ0hFRFVMRSBlbnZpcm9ubWVudCB2YXJpYWJsZSAqLworICAgIGttcF9zY2hfc3RhdGljX2dyZWVkeSAgICAgICAgICAgICA9IDQwLAorICAgIGttcF9zY2hfc3RhdGljX2JhbGFuY2VkICAgICAgICAgICA9IDQxLAorICAgIC8qIGFjY2Vzc2libGUgb25seSB0aHJvdWdoIEtNUF9TQ0hFRFVMRSBlbnZpcm9ubWVudCB2YXJpYWJsZSAqLworICAgIGttcF9zY2hfZ3VpZGVkX2l0ZXJhdGl2ZV9jaHVua2VkICA9IDQyLAorICAgIGttcF9zY2hfZ3VpZGVkX2FuYWx5dGljYWxfY2h1bmtlZCA9IDQzLAorCisgICAga21wX3NjaF9zdGF0aWNfc3RlYWwgICAgICAgICAgICAgID0gNDQsICAgLyoqPCBhY2Nlc3NpYmxlIG9ubHkgdGhyb3VnaCBLTVBfU0NIRURVTEUgZW52aXJvbm1lbnQgdmFyaWFibGUgKi8KKworICAgIC8qIGFjY2Vzc2libGUgb25seSB0aHJvdWdoIEtNUF9TQ0hFRFVMRSBlbnZpcm9ubWVudCB2YXJpYWJsZSAqLworICAgIGttcF9zY2hfdXBwZXIgICAgICAgICAgICAgICAgICAgICA9IDQ1LCAgIC8qKjwgdXBwZXIgYm91bmQgZm9yIHVub3JkZXJlZCB2YWx1ZXMgKi8KKworICAgIGttcF9vcmRfbG93ZXIgICAgICAgICAgICAgICAgICAgICA9IDY0LCAgIC8qKjwgbG93ZXIgYm91bmQgZm9yIG9yZGVyZWQgdmFsdWVzLCBtdXN0IGJlIHBvd2VyIG9mIDIgKi8KKyAgICBrbXBfb3JkX3N0YXRpY19jaHVua2VkICAgICAgICAgICAgPSA2NSwKKyAgICBrbXBfb3JkX3N0YXRpYyAgICAgICAgICAgICAgICAgICAgPSA2NiwgICAvKio8IG9yZGVyZWQgc3RhdGljIHVuc3BlY2lhbGl6ZWQgKi8KKyAgICBrbXBfb3JkX2R5bmFtaWNfY2h1bmtlZCAgICAgICAgICAgPSA2NywKKyAgICBrbXBfb3JkX2d1aWRlZF9jaHVua2VkICAgICAgICAgICAgPSA2OCwKKyAgICBrbXBfb3JkX3J1bnRpbWUgICAgICAgICAgICAgICAgICAgPSA2OSwKKyAgICBrbXBfb3JkX2F1dG8gICAgICAgICAgICAgICAgICAgICAgPSA3MCwgICAvKio8IG9yZGVyZWQgYXV0byAqLworICAgIGttcF9vcmRfdHJhcGV6b2lkYWwgICAgICAgICAgICAgICA9IDcxLAorICAgIGttcF9vcmRfdXBwZXIgICAgICAgICAgICAgICAgICAgICA9IDcyLCAgIC8qKjwgdXBwZXIgYm91bmQgZm9yIG9yZGVyZWQgdmFsdWVzICovCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIC8qIFNjaGVkdWxlcyBmb3IgRGlzdHJpYnV0ZSBjb25zdHJ1Y3QgKi8KKyAgICBrbXBfZGlzdHJpYnV0ZV9zdGF0aWNfY2h1bmtlZCAgICAgPSA5MSwgICAvKio8IGRpc3RyaWJ1dGUgc3RhdGljIGNodW5rZWQgKi8KKyAgICBrbXBfZGlzdHJpYnV0ZV9zdGF0aWMgICAgICAgICAgICAgPSA5MiwgICAvKio8IGRpc3RyaWJ1dGUgc3RhdGljIHVuc3BlY2lhbGl6ZWQgKi8KKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBGb3IgdGhlICJub21lcmdlIiB2ZXJzaW9ucywga21wX2Rpc3BhdGNoX25leHQqKCkgd2lsbCBhbHdheXMgcmV0dXJuCisgICAgICogYSBzaW5nbGUgaXRlcmF0aW9uL2NodW5rLCBldmVuIGlmIHRoZSBsb29wIGlzIHNlcmlhbGl6ZWQuICBGb3IgdGhlCisgICAgICogc2NoZWR1bGUgdHlwZXMgbGlzdGVkIGFib3ZlLCB0aGUgZW50aXJlIGl0ZXJhdGlvbiB2ZWN0b3IgaXMgcmV0dXJuZWQKKyAgICAgKiBpZiB0aGUgbG9vcCBpcyBzZXJpYWxpemVkLiAgVGhpcyBkb2Vzbid0IHdvcmsgZm9yIGdjYy9nY29tcCBzZWN0aW9ucy4KKyAgICAgKi8KKyAgICBrbXBfbm1fbG93ZXIgICAgICAgICAgICAgICAgICAgICAgPSAxNjAsICAvKio8IGxvd2VyIGJvdW5kIGZvciBub21lcmdlIHZhbHVlcyAqLworCisgICAga21wX25tX3N0YXRpY19jaHVua2VkICAgICAgICAgICAgID0gKGttcF9zY2hfc3RhdGljX2NodW5rZWQgLSBrbXBfc2NoX2xvd2VyICsga21wX25tX2xvd2VyKSwKKyAgICBrbXBfbm1fc3RhdGljICAgICAgICAgICAgICAgICAgICAgPSAxNjIsICAvKio8IHN0YXRpYyB1bnNwZWNpYWxpemVkICovCisgICAga21wX25tX2R5bmFtaWNfY2h1bmtlZCAgICAgICAgICAgID0gMTYzLAorICAgIGttcF9ubV9ndWlkZWRfY2h1bmtlZCAgICAgICAgICAgICA9IDE2NCwgIC8qKjwgZ3VpZGVkIHVuc3BlY2lhbGl6ZWQgKi8KKyAgICBrbXBfbm1fcnVudGltZSAgICAgICAgICAgICAgICAgICAgPSAxNjUsCisgICAga21wX25tX2F1dG8gICAgICAgICAgICAgICAgICAgICAgID0gMTY2LCAgLyoqPCBhdXRvICovCisgICAga21wX25tX3RyYXBlem9pZGFsICAgICAgICAgICAgICAgID0gMTY3LAorCisgICAgLyogYWNjZXNzaWJsZSBvbmx5IHRocm91Z2ggS01QX1NDSEVEVUxFIGVudmlyb25tZW50IHZhcmlhYmxlICovCisgICAga21wX25tX3N0YXRpY19ncmVlZHkgICAgICAgICAgICAgID0gMTY4LAorICAgIGttcF9ubV9zdGF0aWNfYmFsYW5jZWQgICAgICAgICAgICA9IDE2OSwKKyAgICAvKiBhY2Nlc3NpYmxlIG9ubHkgdGhyb3VnaCBLTVBfU0NIRURVTEUgZW52aXJvbm1lbnQgdmFyaWFibGUgKi8KKyAgICBrbXBfbm1fZ3VpZGVkX2l0ZXJhdGl2ZV9jaHVua2VkICAgPSAxNzAsCisgICAga21wX25tX2d1aWRlZF9hbmFseXRpY2FsX2NodW5rZWQgID0gMTcxLAorICAgIGttcF9ubV9zdGF0aWNfc3RlYWwgICAgICAgICAgICAgICA9IDE3MiwgIC8qIGFjY2Vzc2libGUgb25seSB0aHJvdWdoIE9NUF9TQ0hFRFVMRSBlbnZpcm9ubWVudCB2YXJpYWJsZSAqLworCisgICAga21wX25tX29yZF9zdGF0aWNfY2h1bmtlZCAgICAgICAgID0gMTkzLAorICAgIGttcF9ubV9vcmRfc3RhdGljICAgICAgICAgICAgICAgICA9IDE5NCwgIC8qKjwgb3JkZXJlZCBzdGF0aWMgdW5zcGVjaWFsaXplZCAqLworICAgIGttcF9ubV9vcmRfZHluYW1pY19jaHVua2VkICAgICAgICA9IDE5NSwKKyAgICBrbXBfbm1fb3JkX2d1aWRlZF9jaHVua2VkICAgICAgICAgPSAxOTYsCisgICAga21wX25tX29yZF9ydW50aW1lICAgICAgICAgICAgICAgID0gMTk3LAorICAgIGttcF9ubV9vcmRfYXV0byAgICAgICAgICAgICAgICAgICA9IDE5OCwgIC8qKjwgYXV0byAqLworICAgIGttcF9ubV9vcmRfdHJhcGV6b2lkYWwgICAgICAgICAgICA9IDE5OSwKKyAgICBrbXBfbm1fdXBwZXIgICAgICAgICAgICAgICAgICAgICAgPSAyMDAsICAvKio8IHVwcGVyIGJvdW5kIGZvciBub21lcmdlIHZhbHVlcyAqLworCisgICAga21wX3NjaF9kZWZhdWx0ID0ga21wX3NjaF9zdGF0aWMgIC8qKjwgZGVmYXVsdCBzY2hlZHVsaW5nIGFsZ29yaXRobSAqLworfTsKKworLyogVHlwZSB0byBrZWVwIHJ1bnRpbWUgc2NoZWR1bGUgc2V0IHZpYSBPTVBfU0NIRURVTEUgb3Igb21wX3NldF9zY2hlZHVsZSgpICovCit0eXBlZGVmIHN0cnVjdCBrbXBfcl9zY2hlZCB7CisgICAgZW51bSBzY2hlZF90eXBlIHJfc2NoZWRfdHlwZTsKKyAgICBpbnQgICAgICAgICAgICAgY2h1bms7Cit9IGttcF9yX3NjaGVkX3Q7CisKK2V4dGVybiBlbnVtIHNjaGVkX3R5cGUgX19rbXBfc2NoX21hcFtdOyAvLyBtYXAgT01QIDMuMCBzY2hlZHVsZSB0eXBlcyB3aXRoIG91ciBpbnRlcm5hbCBzY2hlZHVsZSB0eXBlcworCitlbnVtIGxpYnJhcnlfdHlwZSB7CisgICAgbGlicmFyeV9ub25lLAorICAgIGxpYnJhcnlfc2VyaWFsLAorICAgIGxpYnJhcnlfdHVybmFyb3VuZCwKKyAgICBsaWJyYXJ5X3Rocm91Z2hwdXQKK307CisKKyNpZiBLTVBfT1NfTElOVVgKK2VudW0gY2xvY2tfZnVuY3Rpb25fdHlwZSB7CisgICAgY2xvY2tfZnVuY3Rpb25fZ2V0dGltZW9mZGF5LAorICAgIGNsb2NrX2Z1bmN0aW9uX2Nsb2NrX2dldHRpbWUKK307CisjZW5kaWYgLyogS01QX09TX0xJTlVYICovCisKKyNpZiBLTVBfQVJDSF9YODZfNjQgJiYgKEtNUF9PU19MSU5VWCB8fCBLTVBfT1NfV0lORE9XUykKK2VudW0gbWljX3R5cGUgeworICAgIG5vbl9taWMsCisgICAgbWljMSwKKyAgICBtaWMyLAorICAgIG1pYzMsCisgICAgZHVtbXkKK307CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLSBmYXN0IHJlZHVjdGlvbiBzdHVmZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI3VuZGVmIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisjZGVmaW5lIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSIDEKKworI3VuZGVmIEtNUF9GQVNUX1JFRFVDVElPTl9DT1JFX0RVTworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyAgICAjZGVmaW5lIEtNUF9GQVNUX1JFRFVDVElPTl9DT1JFX0RVTyAxCisjZW5kaWYKKworZW51bSBfcmVkdWN0aW9uX21ldGhvZCB7CisgICAgcmVkdWN0aW9uX21ldGhvZF9ub3RfZGVmaW5lZCA9IDAsCisgICAgY3JpdGljYWxfcmVkdWNlX2Jsb2NrICAgICAgICA9ICggMSA8PCA4ICksCisgICAgYXRvbWljX3JlZHVjZV9ibG9jayAgICAgICAgICA9ICggMiA8PCA4ICksCisgICAgdHJlZV9yZWR1Y2VfYmxvY2sgICAgICAgICAgICA9ICggMyA8PCA4ICksCisgICAgZW1wdHlfcmVkdWNlX2Jsb2NrICAgICAgICAgICA9ICggNCA8PCA4ICkKK307CisKKy8vIGRlc2NyaXB0aW9uIG9mIHRoZSBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCB2YXJpYWJsZQorLy8gdGhlIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kIHZhcmlhYmxlIGNvbnNpc3RzIG9mIHR3byBlbnVtIHR5cGVzIHZhcmlhYmxlcyB0aGF0IGFyZSBwYWNrZWQgdG9nZXRoZXIgaW50byAwLXRoIGJ5dGUgYW5kIDEtc3QgYnl0ZToKKy8vIDA6ICggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgJiAweDAwMDAwMEZGICkgaXMgYSAnZW51bSBiYXJyaWVyX3R5cGUnIHZhbHVlIG9mIGJhcnJpZXIgdGhhdCB3aWxsIGJlIHVzZWQgaW4gZmFzdCByZWR1Y3Rpb246IGJzX3BsYWluX2JhcnJpZXIgb3IgYnNfcmVkdWN0aW9uX2JhcnJpZXIKKy8vIDE6ICggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgJiAweDAwMDBGRjAwICkgaXMgYSByZWR1Y3Rpb24gbWV0aG9kIHRoYXQgd2lsbCBiZSB1c2VkIGluIGZhc3QgcmVkdWN0aW9uOworLy8gcmVkdWN0aW9uIG1ldGhvZCBpcyBvZiAnZW51bSBfcmVkdWN0aW9uX21ldGhvZCcgdHlwZSBhbmQgaXQncyBkZWZpbmVkIHRoZSB3YXkgc28gdGhhdCB0aGUgYml0cyBvZiAwLXRoIGJ5dGUgYXJlIGVtcHR5LAorLy8gc28gbm8gbmVlZCB0byBleGVjdXRlIGEgc2hpZnQgaW5zdHJ1Y3Rpb24gd2hpbGUgcGFja2luZy91bnBhY2tpbmcKKworI2lmIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgI2RlZmluZSBQQUNLX1JFRFVDVElPTl9NRVRIT0RfQU5EX0JBUlJJRVIocmVkdWN0aW9uX21ldGhvZCxiYXJyaWVyX3R5cGUpIFwKKyAgICAgICAgICAgICggKCByZWR1Y3Rpb25fbWV0aG9kICkgfCAoIGJhcnJpZXJfdHlwZSApICkKKworICAgICNkZWZpbmUgVU5QQUNLX1JFRFVDVElPTl9NRVRIT0QocGFja2VkX3JlZHVjdGlvbl9tZXRob2QpIFwKKyAgICAgICAgICAgICggKCBlbnVtIF9yZWR1Y3Rpb25fbWV0aG9kICkoICggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgKSAmICggMHgwMDAwRkYwMCApICkgKQorCisgICAgI2RlZmluZSBVTlBBQ0tfUkVEVUNUSU9OX0JBUlJJRVIocGFja2VkX3JlZHVjdGlvbl9tZXRob2QpIFwKKyAgICAgICAgICAgICggKCBlbnVtIGJhcnJpZXJfdHlwZSApKCAgICAgICggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgKSAmICggMHgwMDAwMDBGRiApICkgKQorI2Vsc2UKKyAgICAjZGVmaW5lIFBBQ0tfUkVEVUNUSU9OX01FVEhPRF9BTkRfQkFSUklFUihyZWR1Y3Rpb25fbWV0aG9kLGJhcnJpZXJfdHlwZSkgXAorICAgICAgICAgICAgKCByZWR1Y3Rpb25fbWV0aG9kICkKKworICAgICNkZWZpbmUgVU5QQUNLX1JFRFVDVElPTl9NRVRIT0QocGFja2VkX3JlZHVjdGlvbl9tZXRob2QpIFwKKyAgICAgICAgICAgICggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgKQorCisgICAgI2RlZmluZSBVTlBBQ0tfUkVEVUNUSU9OX0JBUlJJRVIocGFja2VkX3JlZHVjdGlvbl9tZXRob2QpIFwKKyAgICAgICAgICAgICggYnNfcGxhaW5fYmFycmllciApCisjZW5kaWYKKworI2RlZmluZSBURVNUX1JFRFVDVElPTl9NRVRIT0QocGFja2VkX3JlZHVjdGlvbl9tZXRob2Qsd2hpY2hfcmVkdWN0aW9uX2Jsb2NrKSBcCisgICAgICAgICAgICAoICggVU5QQUNLX1JFRFVDVElPTl9NRVRIT0QoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kICkgKSA9PSAoIHdoaWNoX3JlZHVjdGlvbl9ibG9jayApICkKKworI2lmIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgI2RlZmluZSBUUkVFX1JFRFVDRV9CTE9DS19XSVRIX1JFRFVDVElPTl9CQVJSSUVSIFwKKyAgICAgICAgICAgICggUEFDS19SRURVQ1RJT05fTUVUSE9EX0FORF9CQVJSSUVSKCB0cmVlX3JlZHVjZV9ibG9jaywgYnNfcmVkdWN0aW9uX2JhcnJpZXIgKSApCisKKyAgICAjZGVmaW5lIFRSRUVfUkVEVUNFX0JMT0NLX1dJVEhfUExBSU5fQkFSUklFUiBcCisgICAgICAgICAgICAoIFBBQ0tfUkVEVUNUSU9OX01FVEhPRF9BTkRfQkFSUklFUiggdHJlZV9yZWR1Y2VfYmxvY2ssIGJzX3BsYWluX2JhcnJpZXIgKSApCisjZW5kaWYKKwordHlwZWRlZiBpbnQgUEFDS0VEX1JFRFVDVElPTl9NRVRIT0RfVDsKKworLyogLS0gZW5kIG9mIGZhc3QgcmVkdWN0aW9uIHN0dWZmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBLTVBfT1NfV0lORE9XUworIyBkZWZpbmUgVVNFX0NCTEtEQVRBCisjIHByYWdtYSB3YXJuaW5nKCBwdXNoICkKKyMgcHJhZ21hIHdhcm5pbmcoIGRpc2FibGU6IDI3MSAzMTAgKQorIyBpbmNsdWRlIDx3aW5kb3dzLmg+CisjIHByYWdtYSB3YXJuaW5nKCBwb3AgKQorI2VuZGlmCisKKyNpZiBLTVBfT1NfVU5JWAorIyBpbmNsdWRlIDxwdGhyZWFkLmg+CisjIGluY2x1ZGUgPGRsZmNuLmg+CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIE9ubHkgTGludXgqIE9TIGFuZCBXaW5kb3dzKiBPUyBzdXBwb3J0IHRocmVhZCBhZmZpbml0eS4KKyAqLworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKworZXh0ZXJuIHNpemVfdCBfX2ttcF9hZmZpbl9tYXNrX3NpemU7CisjIGRlZmluZSBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpIChfX2ttcF9hZmZpbl9tYXNrX3NpemUgPiAwKQorIyBkZWZpbmUgS01QX0FGRklOSVRZX0RJU0FCTEUoKSAoX19rbXBfYWZmaW5fbWFza19zaXplID0gMCkKKyMgZGVmaW5lIEtNUF9BRkZJTklUWV9FTkFCTEUobWFza19zaXplKSAoX19rbXBfYWZmaW5fbWFza19zaXplID0gbWFza19zaXplKQorIyBkZWZpbmUgS01QX0NQVV9TRVRTSVpFICAgICAgICAoX19rbXBfYWZmaW5fbWFza19zaXplICogQ0hBUl9CSVQpCisKKyNpZiBLTVBfVVNFX0hXTE9DCisKK3R5cGVkZWYgaHdsb2NfY3B1c2V0X3Qga21wX2FmZmluX21hc2tfdDsKKyMgZGVmaW5lIEtNUF9DUFVfU0VUKGksbWFzaykgICAgICAgaHdsb2NfYml0bWFwX3NldCgoaHdsb2NfY3B1c2V0X3QpbWFzaywgKHVuc2lnbmVkKWkpCisjIGRlZmluZSBLTVBfQ1BVX0lTU0VUKGksbWFzaykgICAgIGh3bG9jX2JpdG1hcF9pc3NldCgoaHdsb2NfY3B1c2V0X3QpbWFzaywgKHVuc2lnbmVkKWkpCisjIGRlZmluZSBLTVBfQ1BVX0NMUihpLG1hc2spICAgICAgIGh3bG9jX2JpdG1hcF9jbHIoKGh3bG9jX2NwdXNldF90KW1hc2ssICh1bnNpZ25lZClpKQorIyBkZWZpbmUgS01QX0NQVV9aRVJPKG1hc2spICAgICAgICBod2xvY19iaXRtYXBfemVybygoaHdsb2NfY3B1c2V0X3QpbWFzaykKKyMgZGVmaW5lIEtNUF9DUFVfQ09QWShkZXN0LCBzcmMpICAgaHdsb2NfYml0bWFwX2NvcHkoKGh3bG9jX2NwdXNldF90KWRlc3QsIChod2xvY19jcHVzZXRfdClzcmMpCisjIGRlZmluZSBLTVBfQ1BVX0NPTVBMRU1FTlQobWF4X2JpdF9udW1iZXIsIG1hc2spIFwKKyAgICB7IFwKKyAgICAgICAgdW5zaWduZWQgaTsgXAorICAgICAgICBmb3IoaT0wO2k8KHVuc2lnbmVkKW1heF9iaXRfbnVtYmVyKzE7aSsrKSB7IFwKKyAgICAgICAgICAgIGlmKGh3bG9jX2JpdG1hcF9pc3NldCgoaHdsb2NfY3B1c2V0X3QpbWFzaywgaSkpIHsgXAorICAgICAgICAgICAgICAgIGh3bG9jX2JpdG1hcF9jbHIoKGh3bG9jX2NwdXNldF90KW1hc2ssIGkpOyBcCisgICAgICAgICAgICB9IGVsc2UgeyBcCisgICAgICAgICAgICAgICAgaHdsb2NfYml0bWFwX3NldCgoaHdsb2NfY3B1c2V0X3QpbWFzaywgaSk7IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICB9IFwKKyAgICB9IFwKKworIyBkZWZpbmUgS01QX0NQVV9VTklPTihkZXN0LCBzcmMpICBod2xvY19iaXRtYXBfb3IoKGh3bG9jX2NwdXNldF90KWRlc3QsIChod2xvY19jcHVzZXRfdClkZXN0LCAoaHdsb2NfY3B1c2V0X3Qpc3JjKQorIyBkZWZpbmUgS01QX0NQVV9TRVRfSVRFUkFURShpLG1hc2spIFwKKyAgICBmb3IoaSA9IGh3bG9jX2JpdG1hcF9maXJzdCgoaHdsb2NfY3B1c2V0X3QpbWFzayk7IChpbnQpaSAhPSAtMTsgaSA9IGh3bG9jX2JpdG1hcF9uZXh0KChod2xvY19jcHVzZXRfdCltYXNrLCBpKSkKKworIyBkZWZpbmUgS01QX0NQVV9BTExPQyhwdHIpIHB0ciA9IChrbXBfYWZmaW5fbWFza190Kilod2xvY19iaXRtYXBfYWxsb2MoKQorIyBkZWZpbmUgS01QX0NQVV9GUkVFKHB0cikgaHdsb2NfYml0bWFwX2ZyZWUoKGh3bG9jX2JpdG1hcF90KXB0cik7CisjIGRlZmluZSBLTVBfQ1BVX0FMTE9DX09OX1NUQUNLKHB0cikgS01QX0NQVV9BTExPQyhwdHIpCisjIGRlZmluZSBLTVBfQ1BVX0ZSRUVfRlJPTV9TVEFDSyhwdHIpIEtNUF9DUFVfRlJFRShwdHIpCisjIGRlZmluZSBLTVBfQ1BVX0lOVEVSTkFMX0FMTE9DKHB0cikgS01QX0NQVV9BTExPQyhwdHIpCisjIGRlZmluZSBLTVBfQ1BVX0lOVEVSTkFMX0ZSRUUocHRyKSBLTVBfQ1BVX0ZSRUUocHRyKQorCisvLworLy8gVGhlIGZvbGxvd2luZyBtYWNybyBzaG91bGQgYmUgdXNlZCB0byBpbmRleCBhbiBhcnJheSBvZiBtYXNrcy4KKy8vIFRoZSBhcnJheSBzaG91bGQgYmUgZGVjbGFyZWQgYXMgImttcF9hZmZpbml0eV90ICoiIGFuZCBhbGxvY2F0ZWQgd2l0aAorLy8gc2l6ZSAiX19rbXBfYWZmaW5pdHlfbWFza19zaXplICogbGVuIi4gIFRoZSBtYWNybyB0YWtlcyBjYXJlIG9mIHRoZSBmYWN0CisvLyB0aGF0IG9uIFdpbmRvd3MqIE9TLCBzaXplb2Yoa21wX2FmZmluX3QpIGlzIHJlYWxseSB0aGUgc2l6ZSBvZiB0aGUgbWFzaywgYnV0CisvLyBvbiBMaW51eCogT1MsIHNpemVvZihrbXBfYWZmaW5fdCkgaXMgMS4KKy8vCisjIGRlZmluZSBLTVBfQ1BVX0lOREVYKGFycmF5LGkpICgoa21wX2FmZmluX21hc2tfdCopKGFycmF5W2ldKSkKKyMgZGVmaW5lIEtNUF9DUFVfQUxMT0NfQVJSQVkoYXJyLCBuKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXJyID0gKGttcF9hZmZpbl9tYXNrX3QgKilfX2ttcF9hbGxvY2F0ZShuKnNpemVvZihrbXBfYWZmaW5fbWFza190KSk7IFwKKyAgICB1bnNpZ25lZCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvcihpPTA7aTwodW5zaWduZWQpbjtpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGFycltpXSA9IGh3bG9jX2JpdG1hcF9hbGxvYygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfQorIyBkZWZpbmUgS01QX0NQVV9GUkVFX0FSUkFZKGFyciwgbikgeyBcCisgICAgdW5zaWduZWQgaTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKGk9MDtpPCh1bnNpZ25lZCluO2krKykgeyAgICAgICBcCisgICAgICAgIGh3bG9jX2JpdG1hcF9mcmVlKGFycltpXSk7ICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfZnJlZShhcnIpOyAgICAgICAgICAgICAgICAgICBcCisgICB9CisjIGRlZmluZSBLTVBfQ1BVX0lOVEVSTkFMX0FMTE9DX0FSUkFZKGFyciwgbikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXJyID0gKGttcF9hZmZpbl9tYXNrX3QgKilLTVBfSU5URVJOQUxfTUFMTE9DKG4qc2l6ZW9mKGttcF9hZmZpbl9tYXNrX3QpKTsgXAorICAgIHVuc2lnbmVkIGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoaT0wO2k8KHVuc2lnbmVkKW47aSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGFycltpXSA9IGh3bG9jX2JpdG1hcF9hbGxvYygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIH0KKyMgZGVmaW5lIEtNUF9DUFVfSU5URVJOQUxfRlJFRV9BUlJBWShhcnIsIG4pIHsgXAorICAgIHVuc2lnbmVkIGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvcihpPTA7aTwodW5zaWduZWQpbjtpKyspIHsgICAgICAgICAgICAgICAgXAorICAgICAgICBod2xvY19iaXRtYXBfZnJlZShhcnJbaV0pOyAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9JTlRFUk5BTF9GUkVFKGFycik7ICAgICAgICAgICAgICAgICAgICAgXAorICAgfQorCisjZWxzZSAvKiBLTVBfVVNFX0hXTE9DICovCisjICBkZWZpbmUgS01QX0NQVV9TRVRfSVRFUkFURShpLG1hc2spIFwKKyAgICBmb3IoaSA9IDA7IChzaXplX3QpaSA8IEtNUF9DUFVfU0VUU0laRTsgKytpKQorCisjIGlmIEtNUF9PU19MSU5VWAorLy8KKy8vIE9uIExpbnV4KiBPUywgdGhlIG1hc2sgaXMgYWN0dWFsbHkgYSB2ZWN0b3Igb2YgbGVuZ3RoIF9fa21wX2FmZmluX21hc2tfc2l6ZQorLy8gKGluIGJ5dGVzKS4gIEl0IHNob3VsZCBiZSBhbGxvY2F0ZWQgb24gYSB3b3JkIGJvdW5kYXJ5LgorLy8KKy8vIFdBUk5JTkchISEgIFdlIGhhdmUgbWFkZSB0aGUgYmFzZSB0eXBlIG9mIHRoZSBhZmZpbml0eSBtYXNrIHVuc2lnbmVkIGNoYXIsCisvLyBpbiBvcmRlciB0byBlbGltaW5hdGUgYSBsb3Qgb2YgY2hlY2tzIHRoYXQgdGhlIHRydWUgc3lzdGVtIG1hc2sgc2l6ZSBpcworLy8gcmVhbGx5IGEgbXVsdGlwbGUgb2YgNCBieXRlcyAob24gTGludXgqIE9TKS4KKy8vCisvLyBUSEVTRSBNQUNST1MgV09OJ1QgV09SSyBQUk9QRVJMWSBPTiBCSUcgRU5ESUFOIE1BQ0hJTkVTISEhCisvLworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIga21wX2FmZmluX21hc2tfdDsKKworIyAgZGVmaW5lIF9LTVBfQ1BVX1NFVChpLG1hc2spICAgKG1hc2tbaS9DSEFSX0JJVF0gfD0gKCgoa21wX2FmZmluX21hc2tfdCkxKSA8PCAoaSAlIENIQVJfQklUKSkpCisjICBkZWZpbmUgS01QX0NQVV9TRVQoaSxtYXNrKSAgICBfS01QX0NQVV9TRVQoKGkpLCAoKGttcF9hZmZpbl9tYXNrX3QgKikobWFzaykpKQorIyAgZGVmaW5lIF9LTVBfQ1BVX0lTU0VUKGksbWFzaykgKCEhKG1hc2tbaS9DSEFSX0JJVF0gJiAoKChrbXBfYWZmaW5fbWFza190KTEpIDw8IChpICUgQ0hBUl9CSVQpKSkpCisjICBkZWZpbmUgS01QX0NQVV9JU1NFVChpLG1hc2spICBfS01QX0NQVV9JU1NFVCgoaSksICgoa21wX2FmZmluX21hc2tfdCAqKShtYXNrKSkpCisjICBkZWZpbmUgX0tNUF9DUFVfQ0xSKGksbWFzaykgICAobWFza1tpL0NIQVJfQklUXSAmPSB+KCgoa21wX2FmZmluX21hc2tfdCkxKSA8PCAoaSAlIENIQVJfQklUKSkpCisjICBkZWZpbmUgS01QX0NQVV9DTFIoaSxtYXNrKSAgICBfS01QX0NQVV9DTFIoKGkpLCAoKGttcF9hZmZpbl9tYXNrX3QgKikobWFzaykpKQorCisjICBkZWZpbmUgS01QX0NQVV9aRVJPKG1hc2spIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc2l6ZV90IF9faTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IgKF9faSA9IDA7IF9faSA8IF9fa21wX2FmZmluX21hc2tfc2l6ZTsgX19pKyspIHsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAoKGttcF9hZmZpbl9tYXNrX3QgKikobWFzaykpW19faV0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0KKworIyAgZGVmaW5lIEtNUF9DUFVfQ09QWShkZXN0LCBzcmMpIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc2l6ZV90IF9faTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IgKF9faSA9IDA7IF9faSA8IF9fa21wX2FmZmluX21hc2tfc2l6ZTsgX19pKyspIHsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAoKGttcF9hZmZpbl9tYXNrX3QgKikoZGVzdCkpW19faV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgPSAoKGttcF9hZmZpbl9tYXNrX3QgKikoc3JjKSlbX19pXTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfQorCisjICBkZWZpbmUgS01QX0NQVV9DT01QTEVNRU5UKG1heF9iaXRfbnVtYmVyLCBtYXNrKSBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHNpemVfdCBfX2k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yIChfX2kgPSAwOyBfX2kgPCBfX2ttcF9hZmZpbl9tYXNrX3NpemU7IF9faSsrKSB7ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKChrbXBfYWZmaW5fbWFza190ICopKG1hc2spKVtfX2ldICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgID0gfigoa21wX2FmZmluX21hc2tfdCAqKShtYXNrKSlbX19pXTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0KKworIyAgZGVmaW5lIEtNUF9DUFVfVU5JT04oZGVzdCwgc3JjKSBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHNpemVfdCBfX2k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yIChfX2kgPSAwOyBfX2kgPCBfX2ttcF9hZmZpbl9tYXNrX3NpemU7IF9faSsrKSB7ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKChrbXBfYWZmaW5fbWFza190ICopKGRlc3QpKVtfX2ldICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIHw9ICgoa21wX2FmZmluX21hc2tfdCAqKShzcmMpKVtfX2ldOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0KKworIyBlbmRpZiAvKiBLTVBfT1NfTElOVVggKi8KKworIyBpZiBLTVBfT1NfV0lORE9XUworLy8KKy8vIE9uIFdpbmRvd3MqIE9TLCB0aGUgbWFzayBzaXplIGlzIDQgYnl0ZXMgZm9yIElBLTMyIGFyY2hpdGVjdHVyZSwgYW5kIG9uCisvLyBJbnRlbChSKSA2NCBpdCBpcyA4IGJ5dGVzIHRpbWVzIHRoZSBudW1iZXIgb2YgcHJvY2Vzc29yIGdyb3Vwcy4KKy8vCisKKyMgIGlmIEtNUF9HUk9VUF9BRkZJTklUWQorCisvLyBHUk9VUF9BRkZJTklUWSBpcyBhbHJlYWR5IGRlZmluZWQgZm9yIF9NU0NfVkVSPj0xNjAwIChWUzIwMTAgYW5kIGxhdGVyKS4KKyMgICBpZiBfTVNDX1ZFUiA8IDE2MDAKK3R5cGVkZWYgc3RydWN0IEdST1VQX0FGRklOSVRZIHsKKyAgICBLQUZGSU5JVFkgTWFzazsKKyAgICBXT1JEIEdyb3VwOworICAgIFdPUkQgUmVzZXJ2ZWRbM107Cit9IEdST1VQX0FGRklOSVRZOworIyAgIGVuZGlmCisKK3R5cGVkZWYgRFdPUkRfUFRSIGttcF9hZmZpbl9tYXNrX3Q7CisKK2V4dGVybiBpbnQgX19rbXBfbnVtX3Byb2NfZ3JvdXBzOworCisjICAgZGVmaW5lIF9LTVBfQ1BVX1NFVChpLG1hc2spIFwKKyAgICAgICAgKG1hc2tbaS8oQ0hBUl9CSVQgKiBzaXplb2Yoa21wX2FmZmluX21hc2tfdCkpXSB8PSAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKChrbXBfYWZmaW5fbWFza190KTEpIDw8IChpICUgKENIQVJfQklUICogc2l6ZW9mKGttcF9hZmZpbl9tYXNrX3QpKSkpKQorCisjICAgZGVmaW5lIEtNUF9DUFVfU0VUKGksbWFzaykgXAorICAgICAgICBfS01QX0NQVV9TRVQoKGkpLCAoKGttcF9hZmZpbl9tYXNrX3QgKikobWFzaykpKQorCisjICAgZGVmaW5lIF9LTVBfQ1BVX0lTU0VUKGksbWFzaykgXAorICAgICAgICAoISEobWFza1tpLyhDSEFSX0JJVCAqIHNpemVvZihrbXBfYWZmaW5fbWFza190KSldICYgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgoKGttcF9hZmZpbl9tYXNrX3QpMSkgPDwgKGkgJSAoQ0hBUl9CSVQgKiBzaXplb2Yoa21wX2FmZmluX21hc2tfdCkpKSkpKQorCisjICAgZGVmaW5lIEtNUF9DUFVfSVNTRVQoaSxtYXNrKSBcCisgICAgICAgIF9LTVBfQ1BVX0lTU0VUKChpKSwgKChrbXBfYWZmaW5fbWFza190ICopKG1hc2spKSkKKworIyAgIGRlZmluZSBfS01QX0NQVV9DTFIoaSxtYXNrKSBcCisgICAgICAgIChtYXNrW2kvKENIQVJfQklUICogc2l6ZW9mKGttcF9hZmZpbl9tYXNrX3QpKV0gJj0gICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfigoKGttcF9hZmZpbl9tYXNrX3QpMSkgPDwgKGkgJSAoQ0hBUl9CSVQgKiBzaXplb2Yoa21wX2FmZmluX21hc2tfdCkpKSkpCisKKyMgICBkZWZpbmUgS01QX0NQVV9DTFIoaSxtYXNrKSBcCisgICAgICAgIF9LTVBfQ1BVX0NMUigoaSksICgoa21wX2FmZmluX21hc2tfdCAqKShtYXNrKSkpCisKKyMgICBkZWZpbmUgS01QX0NQVV9aRVJPKG1hc2spIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW50IF9faTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IgKF9faSA9IDA7IF9faSA8IF9fa21wX251bV9wcm9jX2dyb3VwczsgX19pKyspIHsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAoKGttcF9hZmZpbl9tYXNrX3QgKikobWFzaykpW19faV0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0KKworIyAgIGRlZmluZSBLTVBfQ1BVX0NPUFkoZGVzdCwgc3JjKSBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGludCBfX2k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yIChfX2kgPSAwOyBfX2kgPCBfX2ttcF9udW1fcHJvY19ncm91cHM7IF9faSsrKSB7ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKChrbXBfYWZmaW5fbWFza190ICopKGRlc3QpKVtfX2ldICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgID0gKChrbXBfYWZmaW5fbWFza190ICopKHNyYykpW19faV07ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0KKworIyAgIGRlZmluZSBLTVBfQ1BVX0NPTVBMRU1FTlQobWF4X2JpdF9udW1iZXIsIG1hc2spIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW50IF9faTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IgKF9faSA9IDA7IF9faSA8IF9fa21wX251bV9wcm9jX2dyb3VwczsgX19pKyspIHsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAoKGttcF9hZmZpbl9tYXNrX3QgKikobWFzaykpW19faV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgPSB+KChrbXBfYWZmaW5fbWFza190ICopKG1hc2spKVtfX2ldOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfQorCisjICAgZGVmaW5lIEtNUF9DUFVfVU5JT04oZGVzdCwgc3JjKSBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGludCBfX2k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yIChfX2kgPSAwOyBfX2kgPCBfX2ttcF9udW1fcHJvY19ncm91cHM7IF9faSsrKSB7ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKChrbXBfYWZmaW5fbWFza190ICopKGRlc3QpKVtfX2ldICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIHw9ICgoa21wX2FmZmluX21hc2tfdCAqKShzcmMpKVtfX2ldOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0KKwordHlwZWRlZiBEV09SRCAoKmttcF9HZXRBY3RpdmVQcm9jZXNzb3JDb3VudF90KShXT1JEKTsKK2V4dGVybiBrbXBfR2V0QWN0aXZlUHJvY2Vzc29yQ291bnRfdCBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JDb3VudDsKKwordHlwZWRlZiBXT1JEICgqa21wX0dldEFjdGl2ZVByb2Nlc3Nvckdyb3VwQ291bnRfdCkodm9pZCk7CitleHRlcm4ga21wX0dldEFjdGl2ZVByb2Nlc3Nvckdyb3VwQ291bnRfdCBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JHcm91cENvdW50OworCit0eXBlZGVmIEJPT0wgKCprbXBfR2V0VGhyZWFkR3JvdXBBZmZpbml0eV90KShIQU5ETEUsIEdST1VQX0FGRklOSVRZICopOworZXh0ZXJuIGttcF9HZXRUaHJlYWRHcm91cEFmZmluaXR5X3QgX19rbXBfR2V0VGhyZWFkR3JvdXBBZmZpbml0eTsKKwordHlwZWRlZiBCT09MICgqa21wX1NldFRocmVhZEdyb3VwQWZmaW5pdHlfdCkoSEFORExFLCBjb25zdCBHUk9VUF9BRkZJTklUWSAqLCBHUk9VUF9BRkZJTklUWSAqKTsKK2V4dGVybiBrbXBfU2V0VGhyZWFkR3JvdXBBZmZpbml0eV90IF9fa21wX1NldFRocmVhZEdyb3VwQWZmaW5pdHk7CisKK2V4dGVybiBpbnQgX19rbXBfZ2V0X3Byb2NfZ3JvdXAoa21wX2FmZmluX21hc2tfdCBjb25zdCAqbWFzayk7CisKKyMgIGVsc2UgLyogS01QX0dST1VQX0FGRklOSVRZICovCisKK3R5cGVkZWYgRFdPUkQga21wX2FmZmluX21hc2tfdDsgLyogZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciB3aW5iYXNlLmggKi8KKworIyAgIGRlZmluZSBLTVBfQ1BVX1NFVChpLG1hc2spICAgICAgKCoobWFzaykgfD0gKCgoa21wX2FmZmluX21hc2tfdCkxKSA8PCAoaSkpKQorIyAgIGRlZmluZSBLTVBfQ1BVX0lTU0VUKGksbWFzaykgICAgKCEhKCoobWFzaykgJiAoKChrbXBfYWZmaW5fbWFza190KTEpIDw8IChpKSkpKQorIyAgIGRlZmluZSBLTVBfQ1BVX0NMUihpLG1hc2spICAgICAgKCoobWFzaykgJj0gfigoKGttcF9hZmZpbl9tYXNrX3QpMSkgPDwgKGkpKSkKKyMgICBkZWZpbmUgS01QX0NQVV9aRVJPKG1hc2spICAgICAgICgqKG1hc2spID0gMCkKKyMgICBkZWZpbmUgS01QX0NQVV9DT1BZKGRlc3QsIHNyYykgICgqKGRlc3QpID0gKihzcmMpKQorIyAgIGRlZmluZSBLTVBfQ1BVX0NPTVBMRU1FTlQobWF4X2JpdF9udW1iZXIsIG1hc2spICgqKG1hc2spID0gfioobWFzaykpCisjICAgZGVmaW5lIEtNUF9DUFVfVU5JT04oZGVzdCwgc3JjKSAoKihkZXN0KSB8PSAqKHNyYykpCisKKyMgIGVuZGlmIC8qIEtNUF9HUk9VUF9BRkZJTklUWSAqLworCisjIGVuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCisKKy8vCisvLyBfX2ttcF9hbGxvY2F0ZSgpIHdpbGwgcmV0dXJuIG1lbW9yeSBhbGxvY2F0ZWQgb24gYSA0LWJ5dGVzIGJvdW5kYXJ5LgorLy8gYWZ0ZXIgemVyb2luZyBpdCAtIGl0IHRha2VzIGNhcmUgb2YgdGhvc2UgYXNzdW1wdGlvbnMgc3RhdGVkIGFib3ZlLgorLy8KKyMgZGVmaW5lIEtNUF9DUFVfQUxMT0MocHRyKSBcCisgICAgICAgIChwdHIgPSAoKGttcF9hZmZpbl9tYXNrX3QgKilfX2ttcF9hbGxvY2F0ZShfX2ttcF9hZmZpbl9tYXNrX3NpemUpKSkKKyMgZGVmaW5lIEtNUF9DUFVfRlJFRShwdHIpIF9fa21wX2ZyZWUocHRyKQorIyBkZWZpbmUgS01QX0NQVV9BTExPQ19PTl9TVEFDSyhwdHIpIChwdHIgPSAoKGttcF9hZmZpbl9tYXNrX3QgKilLTVBfQUxMT0NBKF9fa21wX2FmZmluX21hc2tfc2l6ZSkpKQorIyBkZWZpbmUgS01QX0NQVV9GUkVFX0ZST01fU1RBQ0socHRyKSAvKiBOb3RoaW5nICovCisjIGRlZmluZSBLTVBfQ1BVX0lOVEVSTkFMX0FMTE9DKHB0cikgKHB0ciA9ICgoa21wX2FmZmluX21hc2tfdCAqKUtNUF9JTlRFUk5BTF9NQUxMT0MoX19rbXBfYWZmaW5fbWFza19zaXplKSkpCisjIGRlZmluZSBLTVBfQ1BVX0lOVEVSTkFMX0ZSRUUocHRyKSAgS01QX0lOVEVSTkFMX0ZSRUUocHRyKQorCisvLworLy8gVGhlIGZvbGxvd2luZyBtYWNybyBzaG91bGQgYmUgdXNlZCB0byBpbmRleCBhbiBhcnJheSBvZiBtYXNrcy4KKy8vIFRoZSBhcnJheSBzaG91bGQgYmUgZGVjbGFyZWQgYXMgImttcF9hZmZpbml0eV90ICoiIGFuZCBhbGxvY2F0ZWQgd2l0aAorLy8gc2l6ZSAiX19rbXBfYWZmaW5pdHlfbWFza19zaXplICogbGVuIi4gIFRoZSBtYWNybyB0YWtlcyBjYXJlIG9mIHRoZSBmYWN0CisvLyB0aGF0IG9uIFdpbmRvd3MqIE9TLCBzaXplb2Yoa21wX2FmZmluX3QpIGlzIHJlYWxseSB0aGUgc2l6ZSBvZiB0aGUgbWFzaywgYnV0CisvLyBvbiBMaW51eCogT1MsIHNpemVvZihrbXBfYWZmaW5fdCkgaXMgMS4KKy8vCisjIGRlZmluZSBLTVBfQ1BVX0lOREVYKGFycmF5LGkpIFwKKyAgICAgICAgKChrbXBfYWZmaW5fbWFza190ICopKCgoY2hhciAqKShhcnJheSkpICsgKGkpICogX19rbXBfYWZmaW5fbWFza19zaXplKSkKKyMgZGVmaW5lIEtNUF9DUFVfQUxMT0NfQVJSQVkoYXJyLCBuKSAgYXJyID0gKGttcF9hZmZpbl9tYXNrX3QgKilfX2ttcF9hbGxvY2F0ZShuICogX19rbXBfYWZmaW5fbWFza19zaXplKQorIyBkZWZpbmUgS01QX0NQVV9GUkVFX0FSUkFZKGFyciwgbikgX19rbXBfZnJlZShhcnIpOworIyBkZWZpbmUgS01QX0NQVV9JTlRFUk5BTF9BTExPQ19BUlJBWShhcnIsIG4pICBhcnIgPSAoa21wX2FmZmluX21hc2tfdCAqKUtNUF9JTlRFUk5BTF9NQUxMT0MobiAqIF9fa21wX2FmZmluX21hc2tfc2l6ZSkKKyMgZGVmaW5lIEtNUF9DUFVfSU5URVJOQUxfRlJFRV9BUlJBWShhcnIsIG4pIEtNUF9JTlRFUk5BTF9GUkVFKGFycik7CisKKyNlbmRpZiAvKiBLTVBfVVNFX0hXTE9DICovCisKKy8vCisvLyBEZWNsYXJlIGxvY2FsIGNoYXIgYnVmZmVycyB3aXRoIHRoaXMgc2l6ZSBmb3IgcHJpbnRpbmcgZGVidWcgYW5kIGluZm8KKy8vIG1lc3NhZ2VzLCB1c2luZyBfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKCkuCisvLworI2RlZmluZSBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4gICAgICAgIDEwMjQKKworZW51bSBhZmZpbml0eV90eXBlIHsKKyAgICBhZmZpbml0eV9ub25lID0gMCwKKyAgICBhZmZpbml0eV9waHlzaWNhbCwKKyAgICBhZmZpbml0eV9sb2dpY2FsLAorICAgIGFmZmluaXR5X2NvbXBhY3QsCisgICAgYWZmaW5pdHlfc2NhdHRlciwKKyAgICBhZmZpbml0eV9leHBsaWNpdCwKKyAgICBhZmZpbml0eV9iYWxhbmNlZCwKKyAgICBhZmZpbml0eV9kaXNhYmxlZCwgIC8vIG5vdCB1c2VkIG91dHNpemUgdGhlIGVudiB2YXIgcGFyc2VyCisgICAgYWZmaW5pdHlfZGVmYXVsdAorfTsKKworZW51bSBhZmZpbml0eV9ncmFuIHsKKyAgICBhZmZpbml0eV9ncmFuX2ZpbmUgPSAwLAorICAgIGFmZmluaXR5X2dyYW5fdGhyZWFkLAorICAgIGFmZmluaXR5X2dyYW5fY29yZSwKKyAgICBhZmZpbml0eV9ncmFuX3BhY2thZ2UsCisgICAgYWZmaW5pdHlfZ3Jhbl9ub2RlLAorI2lmIEtNUF9HUk9VUF9BRkZJTklUWQorICAgIC8vCisgICAgLy8gVGhlICJncm91cCIgZ3JhbnVsYXJpdHkgaXNuJ3QgbmVjZXNzc2FyaWx5IGNvYXJzZXIgdGhhbiBhbGwgb2YgdGhlCisgICAgLy8gb3RoZXIgbGV2ZWxzLCBidXQgd2UgcHV0IGl0IGxhc3QgaW4gdGhlIGVudW0uCisgICAgLy8KKyAgICBhZmZpbml0eV9ncmFuX2dyb3VwLAorI2VuZGlmIC8qIEtNUF9HUk9VUF9BRkZJTklUWSAqLworICAgIGFmZmluaXR5X2dyYW5fZGVmYXVsdAorfTsKKworZW51bSBhZmZpbml0eV90b3BfbWV0aG9kIHsKKyAgICBhZmZpbml0eV90b3BfbWV0aG9kX2FsbCA9IDAsIC8vIHRyeSBhbGwgKHN1cHBvcnRlZCkgbWV0aG9kcywgaW4gb3JkZXIKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisgICAgYWZmaW5pdHlfdG9wX21ldGhvZF9hcGljaWQsCisgICAgYWZmaW5pdHlfdG9wX21ldGhvZF94MmFwaWNpZCwKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisgICAgYWZmaW5pdHlfdG9wX21ldGhvZF9jcHVpbmZvLCAvLyBLTVBfQ1BVSU5GT19GSUxFIGlzIHVzYWJsZSBvbiBXaW5kb3dzKiBPUywgdG9vCisjaWYgS01QX0dST1VQX0FGRklOSVRZCisgICAgYWZmaW5pdHlfdG9wX21ldGhvZF9ncm91cCwKKyNlbmRpZiAvKiBLTVBfR1JPVVBfQUZGSU5JVFkgKi8KKyAgICBhZmZpbml0eV90b3BfbWV0aG9kX2ZsYXQsCisjaWYgS01QX1VTRV9IV0xPQworICAgIGFmZmluaXR5X3RvcF9tZXRob2RfaHdsb2MsCisjZW5kaWYKKyAgICBhZmZpbml0eV90b3BfbWV0aG9kX2RlZmF1bHQKK307CisKKyNkZWZpbmUgYWZmaW5pdHlfcmVzcGVjdF9tYXNrX2RlZmF1bHQgICAoLTEpCisKK2V4dGVybiBlbnVtIGFmZmluaXR5X3R5cGUgX19rbXBfYWZmaW5pdHlfdHlwZTsgLyogQWZmaW5pdHkgdHlwZSAqLworZXh0ZXJuIGVudW0gYWZmaW5pdHlfZ3JhbiBfX2ttcF9hZmZpbml0eV9ncmFuOyAvKiBBZmZpbml0eSBncmFudWxhcml0eSAqLworZXh0ZXJuIGludCBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVsczsgLyogY29ycmVzcG9uZGluZyBpbnQgdmFsdWUgKi8KK2V4dGVybiBpbnQgX19rbXBfYWZmaW5pdHlfZHVwczsgLyogQWZmaW5pdHkgZHVwbGljYXRlIG1hc2tzICovCitleHRlcm4gZW51bSBhZmZpbml0eV90b3BfbWV0aG9kIF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2Q7CitleHRlcm4gaW50IF9fa21wX2FmZmluaXR5X2NvbXBhY3Q7IC8qIEFmZmluaXR5ICdjb21wYWN0JyB2YWx1ZSAqLworZXh0ZXJuIGludCBfX2ttcF9hZmZpbml0eV9vZmZzZXQ7IC8qIEFmZmluaXR5IG9mZnNldCB2YWx1ZSAgKi8KK2V4dGVybiBpbnQgX19rbXBfYWZmaW5pdHlfdmVyYm9zZTsgLyogV2FzIHZlcmJvc2Ugc3BlY2lmaWVkIGZvciBLTVBfQUZGSU5JVFk/ICovCitleHRlcm4gaW50IF9fa21wX2FmZmluaXR5X3dhcm5pbmdzOyAvKiBLTVBfQUZGSU5JVFkgd2FybmluZ3MgZW5hYmxlZCA/ICovCitleHRlcm4gaW50IF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzazsgLyogUmVzcGVjdCBwcm9jZXNzJyBpbml0aWFsIGFmZmluaXR5IG1hc2s/ICovCitleHRlcm4gY2hhciAqIF9fa21wX2FmZmluaXR5X3Byb2NsaXN0OyAvKiBwcm9jIElEIGxpc3QgKi8KK2V4dGVybiBrbXBfYWZmaW5fbWFza190ICpfX2ttcF9hZmZpbml0eV9tYXNrczsKK2V4dGVybiB1bnNpZ25lZCBfX2ttcF9hZmZpbml0eV9udW1fbWFza3M7CitleHRlcm4gaW50IF9fa21wX2dldF9zeXN0ZW1fYWZmaW5pdHkoa21wX2FmZmluX21hc2tfdCAqbWFzaywgaW50IGFib3J0X29uX2Vycm9yKTsKK2V4dGVybiBpbnQgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eShrbXBfYWZmaW5fbWFza190IGNvbnN0ICptYXNrLCBpbnQgYWJvcnRfb25fZXJyb3IpOworZXh0ZXJuIHZvaWQgX19rbXBfYWZmaW5pdHlfYmluZF90aHJlYWQoaW50IHdoaWNoKTsKKworIyBpZiBLTVBfT1NfTElOVVgKK2V4dGVybiBrbXBfYWZmaW5fbWFza190ICpfX2ttcF9hZmZpbml0eV9nZXRfZnVsbE1hc2soKTsKKyMgZW5kaWYgLyogS01QX09TX0xJTlVYICovCitleHRlcm4gY2hhciBjb25zdCAqIF9fa21wX2NwdWluZm9fZmlsZTsKKworI2VuZGlmIC8qIEtNUF9BRkZJTklUWV9TVVBQT1JURUQgKi8KKworI2lmIE9NUF80MF9FTkFCTEVECisKKy8vCisvLyBUaGlzIG5lZWRzIHRvIGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSB2YWx1ZXMgaW4gb21wLmggISEhCisvLwordHlwZWRlZiBlbnVtIGttcF9wcm9jX2JpbmRfdCB7CisgICAgcHJvY19iaW5kX2ZhbHNlID0gMCwKKyAgICBwcm9jX2JpbmRfdHJ1ZSwKKyAgICBwcm9jX2JpbmRfbWFzdGVyLAorICAgIHByb2NfYmluZF9jbG9zZSwKKyAgICBwcm9jX2JpbmRfc3ByZWFkLAorICAgIHByb2NfYmluZF9pbnRlbCwgICAgLy8gdXNlIEtNUF9BRkZJTklUWSBpbnRlcmZhY2UKKyAgICBwcm9jX2JpbmRfZGVmYXVsdAorfSBrbXBfcHJvY19iaW5kX3Q7CisKK3R5cGVkZWYgc3RydWN0IGttcF9uZXN0ZWRfcHJvY19iaW5kX3QgeworICAgIGttcF9wcm9jX2JpbmRfdCAqYmluZF90eXBlczsKKyAgICBpbnQgc2l6ZTsKKyAgICBpbnQgdXNlZDsKK30ga21wX25lc3RlZF9wcm9jX2JpbmRfdDsKKworZXh0ZXJuIGttcF9uZXN0ZWRfcHJvY19iaW5kX3QgX19rbXBfbmVzdGVkX3Byb2NfYmluZDsKKworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKyMgaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorIyAgZGVmaW5lIEtNUF9QTEFDRV9BTEwgICAgICAgKC0xKQorIyAgZGVmaW5lIEtNUF9QTEFDRV9VTkRFRklORUQgKC0yKQorIyBlbmRpZiAvKiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEICovCisKK2V4dGVybiBpbnQgX19rbXBfYWZmaW5pdHlfbnVtX3BsYWNlczsKKworCisjaWYgT01QXzQwX0VOQUJMRUQKK3R5cGVkZWYgZW51bSBrbXBfY2FuY2VsX2tpbmRfdCB7CisgICAgY2FuY2VsX25vcmVxID0gMCwKKyAgICBjYW5jZWxfcGFyYWxsZWwgPSAxLAorICAgIGNhbmNlbF9sb29wID0gMiwKKyAgICBjYW5jZWxfc2VjdGlvbnMgPSAzLAorICAgIGNhbmNlbF90YXNrZ3JvdXAgPSA0Cit9IGttcF9jYW5jZWxfa2luZF90OworI2VuZGlmIC8vIE9NUF80MF9FTkFCTEVECisKK2V4dGVybiBpbnQgX19rbXBfcGxhY2VfbnVtX3NvY2tldHM7CitleHRlcm4gaW50IF9fa21wX3BsYWNlX3NvY2tldF9vZmZzZXQ7CitleHRlcm4gaW50IF9fa21wX3BsYWNlX251bV9jb3JlczsKK2V4dGVybiBpbnQgX19rbXBfcGxhY2VfY29yZV9vZmZzZXQ7CitleHRlcm4gaW50IF9fa21wX3BsYWNlX251bV90aHJlYWRzX3Blcl9jb3JlOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEtNUF9QQUQodHlwZSwgc3opICAgICAoc2l6ZW9mKHR5cGUpICsgKHN6IC0gKChzaXplb2YodHlwZSkgLSAxKSAlIChzeikpIC0gMSkpCisKKy8vCisvLyBXZSBuZWVkIHRvIGF2b2lkIHVzaW5nIC0xIGFzIGEgR1RJRCBhcyArMSBpcyBhZGRlZCB0byB0aGUgZ3RpZAorLy8gd2hlbiBzdG9yaW5nIGl0IGluIGEgbG9jaywgYW5kIHRoZSB2YWx1ZSAwIGlzIHJlc2VydmVkLgorLy8KKyNkZWZpbmUgS01QX0dUSURfRE5FICAgICAgICAgICAgKC0yKSAgICAvKiBEb2VzIG5vdCBleGlzdCAqLworI2RlZmluZSBLTVBfR1RJRF9TSFVURE9XTiAgICAgICAoLTMpICAgIC8qIExpYnJhcnkgaXMgc2h1dHRpbmcgZG93biAqLworI2RlZmluZSBLTVBfR1RJRF9NT05JVE9SICAgICAgICAoLTQpICAgIC8qIE1vbml0b3IgdGhyZWFkIElEICovCisjZGVmaW5lIEtNUF9HVElEX1VOS05PV04gICAgICAgICgtNSkgICAgLyogSXMgbm90IGtub3duICovCisjZGVmaW5lIEtNUF9HVElEX01JTiAgICAgICAgICAgICgtNikgICAgLyogTWluaW1hbCBndGlkIGZvciBsb3cgYm91bmQgY2hlY2sgaW4gREVCVUcgKi8KKworI2RlZmluZSBfX2ttcF9nZXRfZ3RpZCgpICAgICAgICAgICAgICAgX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWQoKQorI2RlZmluZSBfX2ttcF9lbnRyeV9ndGlkKCkgICAgICAgICAgICAgX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWRfcmVnKCkKKworI2RlZmluZSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpICAgICAoIEtNUF9ERUJVR19BU1NFUlQoIChndGlkKSA+PSAwICksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF90aHJlYWRzWyAoZ3RpZCkgXS0+dGgudGhfaW5mby5kcy5kc190aWQgKQorCisjZGVmaW5lIF9fa21wX2dldF90aWQoKSAgICAgICAgICAgICAgICggX19rbXBfdGlkX2Zyb21fZ3RpZCggX19rbXBfZ2V0X2d0aWQoKSApICkKKyNkZWZpbmUgX19rbXBfZ3RpZF9mcm9tX3RpZCh0aWQsdGVhbSkgKCBLTVBfREVCVUdfQVNTRVJUKCAodGlkKSA+PSAwICYmICh0ZWFtKSAhPSBOVUxMICksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtIC0+IHQudF90aHJlYWRzWyAodGlkKSBdIC0+IHRoLnRoX2luZm8gLmRzLmRzX2d0aWQgKQorCisjZGVmaW5lIF9fa21wX2dldF90ZWFtKCkgICAgICAgICAgICAgICggX19rbXBfdGhyZWFkc1sgKF9fa21wX2dldF9ndGlkKCkpIF0tPiB0aC50aF90ZWFtICkKKyNkZWZpbmUgX19rbXBfdGVhbV9mcm9tX2d0aWQoZ3RpZCkgICAgKCBLTVBfREVCVUdfQVNTRVJUKCAoZ3RpZCkgPj0gMCApLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfdGhyZWFkc1sgKGd0aWQpIF0tPiB0aC50aF90ZWFtICkKKworI2RlZmluZSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKGd0aWQpICAoIEtNUF9ERUJVR19BU1NFUlQoIChndGlkKSA+PSAwICksIF9fa21wX3RocmVhZHNbIChndGlkKSBdICkKKyNkZWZpbmUgX19rbXBfZ2V0X3RocmVhZCgpICAgICAgICAgICAgKCBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKCBfX2ttcF9nZXRfZ3RpZCgpICkgKQorCisgICAgLy8gUmV0dXJucyBjdXJyZW50IHRocmVhZCAocG9pbnRlciB0byBrbXBfaW5mb190KS4gSW4gY29udHJhc3QgdG8gX19rbXBfZ2V0X3RocmVhZCgpLCBpdCB3b3JrcworICAgIC8vIHdpdGggcmVnaXN0ZXJlZCBhbmQgbm90LXlldC1yZWdpc3RlcmVkIHRocmVhZHMuCisjZGVmaW5lIF9fa21wX2d0aWRfZnJvbV90aHJlYWQodGhyKSAgICggS01QX0RFQlVHX0FTU0VSVCggKHRocikgIT0gTlVMTCApLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRociktPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCApCisKKy8vIEFUOiBXaGljaCB3YXkgaXMgY29ycmVjdD8KKy8vIEFUOiAxLiBucHJvYyA9IF9fa21wX3RocmVhZHNbICggZ3RpZCApIF0gLT4gdGgudGhfdGVhbSAtPiB0LnRfbnByb2M7CisvLyBBVDogMi4gbnByb2MgPSBfX2ttcF90aHJlYWRzWyAoIGd0aWQgKSBdIC0+IHRoLnRoX3RlYW1fbnByb2M7CisjZGVmaW5lIF9fa21wX2dldF90ZWFtX251bV90aHJlYWRzKGd0aWQpICggX19rbXBfdGhyZWFkc1sgKCBndGlkICkgXSAtPiB0aC50aF90ZWFtIC0+IHQudF9ucHJvYyApCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBLTVBfVUlOVDY0X01BWCAgICAgICAgICh+KChrbXBfdWludDY0KTE8PCgoc2l6ZW9mKGttcF91aW50NjQpKigxPDwzKSktMSkpKQorCisjZGVmaW5lIEtNUF9NSU5fTlRIICAgICAgICAgICAxCisKKyNpZm5kZWYgS01QX01BWF9OVEgKKyMgIGlmIGRlZmluZWQoUFRIUkVBRF9USFJFQURTX01BWCkgJiYgUFRIUkVBRF9USFJFQURTX01BWCA8IElOVF9NQVgKKyMgICAgZGVmaW5lIEtNUF9NQVhfTlRIICAgICAgICAgIFBUSFJFQURfVEhSRUFEU19NQVgKKyMgIGVsc2UKKyMgICAgZGVmaW5lIEtNUF9NQVhfTlRIICAgICAgICAgIElOVF9NQVgKKyMgIGVuZGlmCisjZW5kaWYgLyogS01QX01BWF9OVEggKi8KKworI2lmZGVmIFBUSFJFQURfU1RBQ0tfTUlOCisjIGRlZmluZSBLTVBfTUlOX1NUS1NJWkUgICAgICAgICBQVEhSRUFEX1NUQUNLX01JTgorI2Vsc2UKKyMgZGVmaW5lIEtNUF9NSU5fU1RLU0laRSAgICAgICAgICgoc2l6ZV90KSgzMiAqIDEwMjQpKQorI2VuZGlmCisKKyNkZWZpbmUgS01QX01BWF9TVEtTSVpFICAgICAgICAgICh+KChzaXplX3QpMTw8KChzaXplb2Yoc2l6ZV90KSooMTw8MykpLTEpKSkKKworI2lmIEtNUF9BUkNIX1g4NgorIyBkZWZpbmUgS01QX0RFRkFVTFRfU1RLU0laRSAgICAgKChzaXplX3QpKDIgKiAxMDI0ICogMTAyNCkpCisjZWxpZiBLTVBfQVJDSF9YODZfNjQKKyMgZGVmaW5lIEtNUF9ERUZBVUxUX1NUS1NJWkUgICAgICgoc2l6ZV90KSg0ICogMTAyNCAqIDEwMjQpKQorIyBkZWZpbmUgS01QX0JBQ0tVUF9TVEtTSVpFICAgICAgKChzaXplX3QpKDIgKiAxMDI0ICogMTAyNCkpCisjZWxzZQorIyBkZWZpbmUgS01QX0RFRkFVTFRfU1RLU0laRSAgICAgKChzaXplX3QpKDEwMjQgKiAxMDI0KSkKKyNlbmRpZgorCisjZGVmaW5lIEtNUF9ERUZBVUxUX01PTklUT1JfU1RLU0laRSAgICAgKChzaXplX3QpKDY0ICogMTAyNCkpCisKKyNkZWZpbmUgS01QX0RFRkFVTFRfTUFMTE9DX1BPT0xfSU5DUiAgICAoKHNpemVfdCkgKDEwMjQgKiAxMDI0KSkKKyNkZWZpbmUgS01QX01JTl9NQUxMT0NfUE9PTF9JTkNSICAgICAgICAoKHNpemVfdCkgKDQgKiAxMDI0KSkKKyNkZWZpbmUgS01QX01BWF9NQUxMT0NfUE9PTF9JTkNSICAgICAgICAofigoc2l6ZV90KTE8PCgoc2l6ZW9mKHNpemVfdCkqKDE8PDMpKS0xKSkpCisKKyNkZWZpbmUgS01QX01JTl9TVEtPRkZTRVQgICAgICAgKDApCisjZGVmaW5lIEtNUF9NQVhfU1RLT0ZGU0VUICAgICAgIEtNUF9NQVhfU1RLU0laRQorI2lmIEtNUF9PU19EQVJXSU4KKyMgZGVmaW5lIEtNUF9ERUZBVUxUX1NUS09GRlNFVCAgS01QX01JTl9TVEtPRkZTRVQKKyNlbHNlCisjIGRlZmluZSBLTVBfREVGQVVMVF9TVEtPRkZTRVQgIENBQ0hFX0xJTkUKKyNlbmRpZgorCisjZGVmaW5lIEtNUF9NSU5fU1RLUEFERElORyAgICAgICgwKQorI2RlZmluZSBLTVBfTUFYX1NUS1BBRERJTkcgICAgICAoMiAqIDEwMjQgKiAxMDI0KQorCisjZGVmaW5lIEtNUF9NSU5fTU9OSVRPUl9XQUtFVVBTICAgICAgKDEpICAgICAgIC8qIG1pbiBudW1iZXIgb2YgdGltZXMgbW9uaXRvciB3YWtlcyB1cCBwZXIgc2Vjb25kICovCisjZGVmaW5lIEtNUF9NQVhfTU9OSVRPUl9XQUtFVVBTICAgICAgKDEwMDApICAgIC8qIG1heGltdW0gbnVtYmVyIG9mIHRpbWVzIG1vbml0b3IgY2FuIHdha2UgdXAgcGVyIHNlY29uZCAqLworI2RlZmluZSBLTVBfQkxPQ0tUSU1FX01VTFRJUExJRVIgICAgICgxMDAwKSAgICAvKiBudW1iZXIgb2YgYmxvY2t0aW1lIHVuaXRzIHBlciBzZWNvbmQgKi8KKyNkZWZpbmUgS01QX01JTl9CTE9DS1RJTUUgICAgICAgICAgICAoMCkKKyNkZWZpbmUgS01QX01BWF9CTE9DS1RJTUUgICAgICAgICAgICAoSU5UX01BWCkgLyogTXVzdCBiZSB0aGlzIGZvciAiaW5maW5pdGUiIHNldHRpbmcgdGhlIHdvcmsgKi8KKyNkZWZpbmUgS01QX0RFRkFVTFRfQkxPQ0tUSU1FICAgICAgICAoMjAwKSAgICAgLyogIF9fa21wX2Jsb2NrdGltZSBpcyBpbiBtaWxsaXNlY29uZHMgICovCisvKiBDYWxjdWxhdGUgbmV3IG51bWJlciBvZiBtb25pdG9yIHdha2V1cHMgZm9yIGEgc3BlY2lmaWMgYmxvY2sgdGltZSBiYXNlZCBvbiBwcmV2aW91cyBtb25pdG9yX3dha2V1cHMgKi8KKy8qIE9ubHkgYWxsb3cgaW5jcmVhc2luZyBudW1iZXIgb2Ygd2FrZXVwcyAqLworI2RlZmluZSBLTVBfV0FLRVVQU19GUk9NX0JMT0NLVElNRShibG9ja3RpbWUsIG1vbml0b3Jfd2FrZXVwcykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAoKGJsb2NrdGltZSkgPT0gS01QX01BWF9CTE9DS1RJTUUpID8gKG1vbml0b3Jfd2FrZXVwcykgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYmxvY2t0aW1lKSA9PSBLTVBfTUlOX0JMT0NLVElNRSkgPyBLTVBfTUFYX01PTklUT1JfV0FLRVVQUyA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtb25pdG9yX3dha2V1cHMpID4gKEtNUF9CTE9DS1RJTUVfTVVMVElQTElFUiAvIChibG9ja3RpbWUpKSkgPyAobW9uaXRvcl93YWtldXBzKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChLTVBfQkxPQ0tUSU1FX01VTFRJUExJRVIpIC8gKGJsb2NrdGltZSkgKQorCisvKiBDYWxjdWxhdGUgbnVtYmVyIG9mIGludGVydmFscyBmb3IgYSBzcGVjaWZpYyBibG9jayB0aW1lIGJhc2VkIG9uIG1vbml0b3Jfd2FrZXVwcyAqLworI2RlZmluZSBLTVBfSU5URVJWQUxTX0ZST01fQkxPQ0tUSU1FKGJsb2NrdGltZSwgbW9uaXRvcl93YWtldXBzKSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAoIChibG9ja3RpbWUpICsgKEtNUF9CTE9DS1RJTUVfTVVMVElQTElFUiAvIChtb25pdG9yX3dha2V1cHMpKSAtIDEgKSAvICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChLTVBfQkxPQ0tUSU1FX01VTFRJUExJRVIgLyAobW9uaXRvcl93YWtldXBzKSkgKQorCisjZGVmaW5lIEtNUF9NSU5fU1RBVFNDT0xTICAgICAgIDQwCisjZGVmaW5lIEtNUF9NQVhfU1RBVFNDT0xTICAgICAgIDQwOTYKKyNkZWZpbmUgS01QX0RFRkFVTFRfU1RBVFNDT0xTICAgODAKKworI2RlZmluZSBLTVBfTUlOX0lOVEVSVkFMICAgICAgICAwCisjZGVmaW5lIEtNUF9NQVhfSU5URVJWQUwgICAgICAgIChJTlRfTUFYLTEpCisjZGVmaW5lIEtNUF9ERUZBVUxUX0lOVEVSVkFMICAgIDAKKworI2RlZmluZSBLTVBfTUlOX0NIVU5LICAgICAgICAgICAxCisjZGVmaW5lIEtNUF9NQVhfQ0hVTksgICAgICAgICAgIChJTlRfTUFYLTEpCisjZGVmaW5lIEtNUF9ERUZBVUxUX0NIVU5LICAgICAgIDEKKworI2RlZmluZSBLTVBfTUlOX0lOSVRfV0FJVCAgICAgICAxCisjZGVmaW5lIEtNUF9NQVhfSU5JVF9XQUlUICAgICAgIChJTlRfTUFYLzIpCisjZGVmaW5lIEtNUF9ERUZBVUxUX0lOSVRfV0FJVCAgIDIwNDhVCisKKyNkZWZpbmUgS01QX01JTl9ORVhUX1dBSVQgICAgICAgMQorI2RlZmluZSBLTVBfTUFYX05FWFRfV0FJVCAgICAgICAoSU5UX01BWC8yKQorI2RlZmluZSBLTVBfREVGQVVMVF9ORVhUX1dBSVQgICAxMDI0VQorCisvLyBtYXggcG9zc2libGUgZHluYW1pYyBsb29wcyBpbiBjb25jdXJyZW50IGV4ZWN1dGlvbiBwZXIgdGVhbQorI2RlZmluZSBLTVBfTUFYX0RJU1BfQlVGICAgICAgICA3CisjZGVmaW5lIEtNUF9NQVhfT1JERVJFRCAgICAgICAgIDgKKworI2RlZmluZSBLTVBfTUFYX0ZJRUxEUyAgICAgICAgICAzMgorCisjZGVmaW5lIEtNUF9NQVhfQlJBTkNIX0JJVFMgICAgIDMxCisKKyNkZWZpbmUgS01QX01BWF9BQ1RJVkVfTEVWRUxTX0xJTUlUIElOVF9NQVgKKworLyogTWluaW11bSBudW1iZXIgb2YgdGhyZWFkcyBiZWZvcmUgc3dpdGNoIHRvIFRMUyBndGlkIChleHBlcmltZW50YWxseSBkZXRlcm1pbmVkKSAqLworLyogam9zaCBUT0RPOiB3aGF0IGFib3V0IE9TIFgqIHR1bmluZz8gKi8KKyNpZiAgIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyMgZGVmaW5lIEtNUF9UTFNfR1RJRF9NSU4gICAgIDUKKyNlbHNlCisjIGRlZmluZSBLTVBfVExTX0dUSURfTUlOICAgICBJTlRfTUFYCisjZW5kaWYKKworI2RlZmluZSBLTVBfTUFTVEVSX1RJRCh0aWQpICAgICAgKCAodGlkKSA9PSAwICkKKyNkZWZpbmUgS01QX1dPUktFUl9USUQodGlkKSAgICAgICggKHRpZCkgIT0gMCApCisKKyNkZWZpbmUgS01QX01BU1RFUl9HVElEKGd0aWQpICAgICggX19rbXBfdGlkX2Zyb21fZ3RpZCgoZ3RpZCkpID09IDAgKQorI2RlZmluZSBLTVBfV09SS0VSX0dUSUQoZ3RpZCkgICAgKCBfX2ttcF90aWRfZnJvbV9ndGlkKChndGlkKSkgIT0gMCApCisjZGVmaW5lIEtNUF9VQkVSX0dUSUQoZ3RpZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggKGd0aWQpID49IEtNUF9HVElEX01JTiApLCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIChndGlkKSA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHkgKSwgICAgICAgICAgXAorICAgICAgICAoZ3RpZCkgPj0gMCAmJiBfX2ttcF9yb290WyhndGlkKV0gJiYgX19rbXBfdGhyZWFkc1soZ3RpZCldICYmIFwKKyAgICAgICAgKF9fa21wX3RocmVhZHNbKGd0aWQpXSA9PSBfX2ttcF9yb290WyhndGlkKV0tPnIucl91YmVyX3RocmVhZClcCisgICAgKQorI2RlZmluZSBLTVBfSU5JVElBTF9HVElEKGd0aWQpICAgKCAoZ3RpZCkgPT0gMCApCisKKyNpZm5kZWYgVFJVRQorI2RlZmluZSBGQUxTRSAgIDAKKyNkZWZpbmUgVFJVRSAgICAoISBGQUxTRSkKKyNlbmRpZgorCisvKiBOT1RFOiBhbGwgb2YgdGhlIGZvbGxvd2luZyBjb25zdGFudHMgbXVzdCBiZSBldmVuICovCisKKyNpZiBLTVBfT1NfV0lORE9XUworIyAgZGVmaW5lIEtNUF9JTklUX1dBSVQgICAgNjRVICAgICAgICAgIC8qIGluaXRpYWwgbnVtYmVyIG9mIHNwaW4tdGVzdHMgICAqLworIyAgZGVmaW5lIEtNUF9ORVhUX1dBSVQgICAgMzJVICAgICAgICAgIC8qIHN1c2VxdWVudCBudW1iZXIgb2Ygc3Bpbi10ZXN0cyAqLworI2VsaWYgS01QX09TX0NOSworIyAgZGVmaW5lIEtNUF9JTklUX1dBSVQgICAgMTZVICAgICAgICAgIC8qIGluaXRpYWwgbnVtYmVyIG9mIHNwaW4tdGVzdHMgICAqLworIyAgZGVmaW5lIEtNUF9ORVhUX1dBSVQgICAgIDhVICAgICAgICAgIC8qIHN1c2VxdWVudCBudW1iZXIgb2Ygc3Bpbi10ZXN0cyAqLworI2VsaWYgS01QX09TX0xJTlVYCisjICBkZWZpbmUgS01QX0lOSVRfV0FJVCAgMTAyNFUgICAgICAgICAgLyogaW5pdGlhbCBudW1iZXIgb2Ygc3Bpbi10ZXN0cyAgICovCisjICBkZWZpbmUgS01QX05FWFRfV0FJVCAgIDUxMlUgICAgICAgICAgLyogc3VzZXF1ZW50IG51bWJlciBvZiBzcGluLXRlc3RzICovCisjZWxpZiBLTVBfT1NfREFSV0lOCisvKiBUT0RPOiB0dW5lIGZvciBLTVBfT1NfREFSV0lOICovCisjICBkZWZpbmUgS01QX0lOSVRfV0FJVCAgMTAyNFUgICAgICAgICAgLyogaW5pdGlhbCBudW1iZXIgb2Ygc3Bpbi10ZXN0cyAgICovCisjICBkZWZpbmUgS01QX05FWFRfV0FJVCAgIDUxMlUgICAgICAgICAgLyogc3VzZXF1ZW50IG51bWJlciBvZiBzcGluLXRlc3RzICovCisjZWxpZiBLTVBfT1NfRlJFRUJTRAorLyogVE9ETzogdHVuZSBmb3IgS01QX09TX0ZSRUVCU0QgKi8KKyMgIGRlZmluZSBLTVBfSU5JVF9XQUlUICAxMDI0VSAgICAgICAgICAvKiBpbml0aWFsIG51bWJlciBvZiBzcGluLXRlc3RzICAgKi8KKyMgIGRlZmluZSBLTVBfTkVYVF9XQUlUICAgNTEyVSAgICAgICAgICAvKiBzdXNlcXVlbnQgbnVtYmVyIG9mIHNwaW4tdGVzdHMgKi8KKyNlbGlmIEtNUF9PU19ORVRCU0QKKy8qIFRPRE86IHR1bmUgZm9yIEtNUF9PU19ORVRCU0QgKi8KKyMgIGRlZmluZSBLTVBfSU5JVF9XQUlUICAxMDI0VSAgICAgICAgICAvKiBpbml0aWFsIG51bWJlciBvZiBzcGluLXRlc3RzICAgKi8KKyMgIGRlZmluZSBLTVBfTkVYVF9XQUlUICAgNTEyVSAgICAgICAgICAvKiBzdXNlcXVlbnQgbnVtYmVyIG9mIHNwaW4tdGVzdHMgKi8KKyNlbmRpZgorCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAordHlwZWRlZiBzdHJ1Y3Qga21wX2NwdWlkIHsKKyAgICBrbXBfdWludDMyICBlYXg7CisgICAga21wX3VpbnQzMiAgZWJ4OworICAgIGttcF91aW50MzIgIGVjeDsKKyAgICBrbXBfdWludDMyICBlZHg7Cit9IGttcF9jcHVpZF90OworZXh0ZXJuIHZvaWQgX19rbXBfeDg2X2NwdWlkKCBpbnQgbW9kZSwgaW50IG1vZGUyLCBzdHJ1Y3Qga21wX2NwdWlkICpwICk7CisjIGlmIEtNUF9BUkNIX1g4NgorICBleHRlcm4gdm9pZCBfX2ttcF94ODZfcGF1c2UoIHZvaWQgKTsKKyMgZWxpZiBLTVBfTUlDCisgIHN0YXRpYyB2b2lkIF9fa21wX3g4Nl9wYXVzZSggdm9pZCApIHsgX21tX2RlbGF5XzMyKCAxMDAgKTsgfTsKKyMgZWxzZQorICBzdGF0aWMgdm9pZCBfX2ttcF94ODZfcGF1c2UoIHZvaWQgKSB7IF9tbV9wYXVzZSgpOyB9OworIyBlbmRpZgorIyBkZWZpbmUgS01QX0NQVV9QQVVTRSgpIF9fa21wX3g4Nl9wYXVzZSgpCisjZWxpZiBLTVBfQVJDSF9QUEM2NAorIyBkZWZpbmUgS01QX1BQQzY0X1BSSV9MT1coKSBfX2FzbV9fIHZvbGF0aWxlICgib3IgMSwgMSwgMSIpCisjIGRlZmluZSBLTVBfUFBDNjRfUFJJX01FRCgpIF9fYXNtX18gdm9sYXRpbGUgKCJvciAyLCAyLCAyIikKKyMgZGVmaW5lIEtNUF9QUEM2NF9QUklfTE9DX01CKCkgX19hc21fXyB2b2xhdGlsZSAoIiIgOiA6IDogIm1lbW9yeSIpCisjIGRlZmluZSBLTVBfQ1BVX1BBVVNFKCkgZG8geyBLTVBfUFBDNjRfUFJJX0xPVygpOyBLTVBfUFBDNjRfUFJJX01FRCgpOyBLTVBfUFBDNjRfUFJJX0xPQ19NQigpOyB9IHdoaWxlICgwKQorI2Vsc2UKKyMgZGVmaW5lIEtNUF9DUFVfUEFVU0UoKSAgICAgICAgLyogbm90aGluZyB0byBkbyAqLworI2VuZGlmCisKKyNkZWZpbmUgS01QX0lOSVRfWUlFTEQoY291bnQpICAgICAgICAgICB7IChjb3VudCkgPSBfX2ttcF95aWVsZF9pbml0OyB9CisKKyNkZWZpbmUgS01QX1lJRUxEKGNvbmQpICAgICAgICAgICAgICAgICB7IEtNUF9DUFVfUEFVU0UoKTsgX19rbXBfeWllbGQoIChjb25kKSApOyB9CisKKy8vIE5vdGUgdGhlIGRlY3JlbWVudCBvZiAyIGluIHRoZSBmb2xsb3dpbmcgTWFjcm9zLiAgV2l0aCBLTVBfTElCUkFSWT10dXJuYXJvdW5kLAorLy8gdGhlcmUgc2hvdWxkIGJlIG5vIHlpZWxkaW5nIHNpbmNlIHRoZSBzdGFydGluZyB2YWx1ZSBmcm9tIEtNUF9JTklUX1lJRUxEKCkgaXMgb2RkLgorCisjZGVmaW5lIEtNUF9ZSUVMRF9XSEVOKGNvbmQsY291bnQpICAgICAgeyBLTVBfQ1BVX1BBVVNFKCk7IChjb3VudCkgLT0gMjsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoY291bnQpKSB7IEtNUF9ZSUVMRChjb25kKTsgKGNvdW50KSA9IF9fa21wX3lpZWxkX25leHQ7IH0gfQorI2RlZmluZSBLTVBfWUlFTERfU1BJTihjb3VudCkgICAgICAgICAgIHsgS01QX0NQVV9QQVVTRSgpOyAoY291bnQpIC09MjsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoY291bnQpKSB7IEtNUF9ZSUVMRCgxKTsgKGNvdW50KSA9IF9fa21wX3lpZWxkX25leHQ7IH0gfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIFN1cHBvcnQgZGF0YXR5cGVzIGZvciB0aGUgb3JwaGFuZWQgY29uc3RydWN0IG5lc3RpbmcgY2hlY2tzLiAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2VudW0gY29uc190eXBlIHsKKyAgICBjdF9ub25lLAorICAgIGN0X3BhcmFsbGVsLAorICAgIGN0X3BkbywKKyAgICBjdF9wZG9fb3JkZXJlZCwKKyAgICBjdF9wc2VjdGlvbnMsCisgICAgY3RfcHNpbmdsZSwKKworICAgIC8qIHRoZSBmb2xsb3dpbmcgbXVzdCBiZSBsZWZ0IGluIG9yZGVyIGFuZCBub3Qgc3BsaXQgdXAgKi8KKyAgICBjdF90YXNrcSwKKyAgICBjdF90YXNrLCAgICAgICAgICAgICAgICAgICAgLyogcmVhbGx5IHRhc2sgaW5zaWRlIG5vbi1vcmRlcmVkIHRhc2txLCBjb25zaWRlcmVkIGEgd29ya3NoYXJpbmcgdHlwZSAqLworICAgIGN0X3Rhc2tfb3JkZXJlZCwgICAgICAgICAgICAvKiByZWFsbHkgdGFzayBpbnNpZGUgb3JkZXJlZCB0YXNrcSwgY29uc2lkZXJlZCBhIHdvcmtzaGFyaW5nIHR5cGUgKi8KKyAgICAvKiB0aGUgcHJlY2VkaW5nIG11c3QgYmUgbGVmdCBpbiBvcmRlciBhbmQgbm90IHNwbGl0IHVwICovCisKKyAgICBjdF9jcml0aWNhbCwKKyAgICBjdF9vcmRlcmVkX2luX3BhcmFsbGVsLAorICAgIGN0X29yZGVyZWRfaW5fcGRvLAorICAgIGN0X29yZGVyZWRfaW5fdGFza3EsCisgICAgY3RfbWFzdGVyLAorICAgIGN0X3JlZHVjZSwKKyAgICBjdF9iYXJyaWVyCit9OworCisvKiB0ZXN0IHRvIHNlZSBpZiB3ZSBhcmUgaW4gYSB0YXNrcSBjb25zdHJ1Y3QgKi8KKyMgZGVmaW5lIElTX0NPTlNfVFlQRV9UQVNLUSggY3QgKSAgICAgICAoICgoaW50KShjdCkpID49ICgoaW50KWN0X3Rhc2txKSAmJiAoKGludCkoY3QpKSA8PSAoKGludCljdF90YXNrX29yZGVyZWQpICkKKyMgZGVmaW5lIElTX0NPTlNfVFlQRV9PUkRFUkVEKCBjdCApICAgICAoKGN0KSA9PSBjdF9wZG9fb3JkZXJlZCB8fCAoY3QpID09IGN0X3Rhc2tfb3JkZXJlZCkKKworc3RydWN0IGNvbnNfZGF0YSB7CisgICAgaWRlbnRfdCBjb25zdCAgICAgKmlkZW50OworICAgIGVudW0gY29uc190eXBlICAgICB0eXBlOworICAgIGludCAgICAgICAgICAgICAgICBwcmV2OworICAgIGttcF91c2VyX2xvY2tfcCAgICBuYW1lOyAgICAvKiBhZGRyZXNzIGV4Y2x1c2l2ZWx5IGZvciBjcml0aWNhbCBzZWN0aW9uIG5hbWUgY29tcGFyaXNvbiAqLworfTsKKworc3RydWN0IGNvbnNfaGVhZGVyIHsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHBfdG9wLCB3X3RvcCwgc190b3A7CisgICAgaW50ICAgICAgICAgICAgICAgICBzdGFja19zaXplLCBzdGFja190b3A7CisgICAgc3RydWN0IGNvbnNfZGF0YSAgICpzdGFja19kYXRhOworfTsKKworc3RydWN0IGttcF9yZWdpb25faW5mbyB7CisgICAgY2hhciAgICAgICAgICAgICAgICAqdGV4dDsKKyAgICBpbnQgICAgICAgICAgICAgICAgIG9mZnNldFtLTVBfTUFYX0ZJRUxEU107CisgICAgaW50ICAgICAgICAgICAgICAgICBsZW5ndGhbS01QX01BWF9GSUVMRFNdOworfTsKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBLTVBfT1NfV0lORE9XUworICAgIHR5cGVkZWYgSEFORExFICAgICAgICAgICAgICBrbXBfdGhyZWFkX3Q7CisgICAgdHlwZWRlZiBEV09SRCAgICAgICAgICAgICAgIGttcF9rZXlfdDsKKyNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworCisjaWYgS01QX09TX1VOSVgKKyAgICB0eXBlZGVmIHB0aHJlYWRfdCAgICAgICAgICAga21wX3RocmVhZF90OworICAgIHR5cGVkZWYgcHRocmVhZF9rZXlfdCAgICAgICBrbXBfa2V5X3Q7CisjZW5kaWYKKworZXh0ZXJuIGttcF9rZXlfdCAgX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleTsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX3N5c19pbmZvIHsKKyAgICBsb25nIG1heHJzczsgICAgICAgICAgLyogdGhlIG1heGltdW0gcmVzaWRlbnQgc2V0IHNpemUgdXRpbGl6ZWQgKGluIGtpbG9ieXRlcykgICAgICovCisgICAgbG9uZyBtaW5mbHQ7ICAgICAgICAgIC8qIHRoZSBudW1iZXIgb2YgcGFnZSBmYXVsdHMgc2VydmljZWQgd2l0aG91dCBhbnkgSS9PICAgICAgICAqLworICAgIGxvbmcgbWFqZmx0OyAgICAgICAgICAvKiB0aGUgbnVtYmVyIG9mIHBhZ2UgZmF1bHRzIHNlcnZpY2VkIHRoYXQgcmVxdWlyZWQgSS9PICAgICAgKi8KKyAgICBsb25nIG5zd2FwOyAgICAgICAgICAgLyogdGhlIG51bWJlciBvZiB0aW1lcyBhIHByb2Nlc3Mgd2FzICJzd2FwcGVkIiBvdXQgb2YgbWVtb3J5ICovCisgICAgbG9uZyBpbmJsb2NrOyAgICAgICAgIC8qIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGZpbGUgc3lzdGVtIGhhZCB0byBwZXJmb3JtIGlucHV0ICAqLworICAgIGxvbmcgb3VibG9jazsgICAgICAgICAvKiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBmaWxlIHN5c3RlbSBoYWQgdG8gcGVyZm9ybSBvdXRwdXQgKi8KKyAgICBsb25nIG52Y3N3OyAgICAgICAgICAgLyogdGhlIG51bWJlciBvZiB0aW1lcyBhIGNvbnRleHQgc3dpdGNoIHdhcyB2b2x1bnRhcmlseSAgICAgICovCisgICAgbG9uZyBuaXZjc3c7ICAgICAgICAgIC8qIHRoZSBudW1iZXIgb2YgdGltZXMgYSBjb250ZXh0IHN3aXRjaCB3YXMgZm9yY2VkICAgICAgICAgICAqLworfSBrbXBfc3lzX2luZm9fdDsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2NwdWluZm8geworICAgIGludCAgICAgICAgaW5pdGlhbGl6ZWQ7ICAvLyBJZiAwLCBvdGhlciBmaWVsZHMgYXJlIG5vdCBpbml0aWFsaXplZC4KKyAgICBpbnQgICAgICAgIHNpZ25hdHVyZTsgICAgLy8gQ1BVSUQoMSkuRUFYCisgICAgaW50ICAgICAgICBmYW1pbHk7ICAgICAgIC8vIENQVUlEKDEpLkVBWFsyNzoyMF0gKyBDUFVJRCgxKS5FQVhbMTE6OF0gKCBFeHRlbmRlZCBGYW1pbHkgKyBGYW1pbHkgKQorICAgIGludCAgICAgICAgbW9kZWw7ICAgICAgICAvLyAoIENQVUlEKDEpLkVBWFsxOToxNl0gPDwgNCApICsgQ1BVSUQoMSkuRUFYWzc6NF0gKCAoIEV4dGVuZGVkIE1vZGVsIDw8IDQgKSArIE1vZGVsKQorICAgIGludCAgICAgICAgc3RlcHBpbmc7ICAgICAvLyBDUFVJRCgxKS5FQVhbMzowXSAoIFN0ZXBwaW5nICkKKyAgICBpbnQgICAgICAgIHNzZTI7ICAgICAgICAgLy8gMCBpZiBTU0UyIGluc3RydWN0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCwgMSBvdGhlcndpc2UuCisgICAgaW50ICAgICAgICBydG07ICAgICAgICAgIC8vIDAgaWYgUlRNIGluc3RydWN0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCwgMSBvdGhlcndpc2UuCisgICAgaW50ICAgICAgICBjcHVfc3RhY2tvZmZzZXQ7CisgICAgaW50ICAgICAgICBhcGljX2lkOworICAgIGludCAgICAgICAgcGh5c2ljYWxfaWQ7CisgICAgaW50ICAgICAgICBsb2dpY2FsX2lkOworICAgIGttcF91aW50NjQgZnJlcXVlbmN5OyAgICAvLyBOb21pbmFsIENQVSBmcmVxdWVuY3kgaW4gSHouCit9IGttcF9jcHVpbmZvX3Q7CisKKworI2lmZGVmIEJVSUxEX1RWCisKK3N0cnVjdCB0dl90aHJlYWRwcml2YXRlIHsKKyAgICAvKiBSZWNvcmQgdHlwZSAjMSAqLworICAgIHZvaWQgICAgICAgICpnbG9iYWxfYWRkcjsKKyAgICB2b2lkICAgICAgICAqdGhyZWFkX2FkZHI7Cit9OworCitzdHJ1Y3QgdHZfZGF0YSB7CisgICAgc3RydWN0IHR2X2RhdGEgICAgICAqbmV4dDsKKyAgICB2b2lkICAgICAgICAgICAgICAgICp0eXBlOworICAgIHVuaW9uIHR2X3VuaW9uIHsKKyAgICAgICAgc3RydWN0IHR2X3RocmVhZHByaXZhdGUgdHA7CisgICAgfSB1OworfTsKKworZXh0ZXJuIGttcF9rZXlfdCBfX2ttcF90dl9rZXk7CisKKyNlbmRpZiAvKiBCVUlMRF9UViAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIFVTRV9JVFRfQlVJTEQKKy8vIFdlIGNhbm5vdCBpbmNsdWRlICJrbXBfaXR0LmgiIGR1ZSB0byBjaXJjdWxhciBkZXBlbmRlbmN5LiBEZWNsYXJlIHRoZSBvbmx5IHJlcXVpcmVkIHR5cGUgaGVyZS4KKy8vIExhdGVyIHdlIHdpbGwgY2hlY2sgdGhlIHR5cGUgbWVldHMgcmVxdWlyZW1lbnRzLgordHlwZWRlZiBpbnQga21wX2l0dF9tYXJrX3Q7CisjZGVmaW5lIEtNUF9JVFRfREVCVUcgMAorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBUYXNrcSBkYXRhIHN0cnVjdHVyZXMKKyAqLworCisjZGVmaW5lIEhJR0hfV0FURVJfTUFSSyhuc2xvdHMpICAgICAgICAgKCgobnNsb3RzKSAqIDMpIC8gNCkKKyNkZWZpbmUgX19LTVBfVEFTS1FfVEhVTktTX1BFUl9USCAgICAgICAgMSAgICAgIC8qIG51bSB0aHVua3MgdGhhdCBlYWNoIHRocmVhZCBjYW4gc2ltdWx0YW5lb3VzbHkgZXhlY3V0ZSBmcm9tIGEgdGFzayBxdWV1ZSAqLworCisvKiAgZmxhZ3MgZm9yIHRhc2txX2dsb2JhbF9mbGFncywga21wX3Rhc2tfcXVldWVfdCB0cV9mbGFncywga21wY190aHVua190IHRoX2ZsYWdzICAqLworCisjZGVmaW5lIFRRRl9JU19PUkRFUkVEICAgICAgICAgIDB4MDAwMSAgLyogIF9fa21wY190YXNrcSBpbnRlcmZhY2UsIHRhc2txIG9yZGVyZWQgICovCisjZGVmaW5lIFRRRl9JU19MQVNUUFJJVkFURSAgICAgIDB4MDAwMiAgLyogIF9fa21wY190YXNrcSBpbnRlcmZhY2UsIHRhc2txIHdpdGggbGFzdHByaXZhdGUgbGlzdCAgKi8KKyNkZWZpbmUgVFFGX0lTX05PV0FJVCAgICAgICAgICAgMHgwMDA0ICAvKiAgX19rbXBjX3Rhc2txIGludGVyZmFjZSwgZW5kIHRhc2txIG5vd2FpdCAgKi8KKyNkZWZpbmUgVFFGX0hFVVJJU1RJQ1MgICAgICAgICAgMHgwMDA4ICAvKiAgX19rbXBjX3Rhc2txIGludGVyZmFjZSwgdXNlIGhldXJpc3RpY3MgdG8gZGVjaWRlIHRhc2sgcXVldWUgc2l6ZSAgKi8KKyNkZWZpbmUgVFFGX0lOVEVSRkFDRV9SRVNFUlZFRDEgMHgwMDEwICAvKiAgX19rbXBjX3Rhc2txIGludGVyZmFjZSwgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgICovCisjZGVmaW5lIFRRRl9JTlRFUkZBQ0VfUkVTRVJWRUQyIDB4MDAyMCAgLyogIF9fa21wY190YXNrcSBpbnRlcmZhY2UsIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICAqLworI2RlZmluZSBUUUZfSU5URVJGQUNFX1JFU0VSVkVEMyAweDAwNDAgIC8qICBfX2ttcGNfdGFza3EgaW50ZXJmYWNlLCByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAgKi8KKyNkZWZpbmUgVFFGX0lOVEVSRkFDRV9SRVNFUlZFRDQgMHgwMDgwICAvKiAgX19rbXBjX3Rhc2txIGludGVyZmFjZSwgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgICovCisKKyNkZWZpbmUgVFFGX0lOVEVSRkFDRV9GTEFHUyAgICAgMHgwMGZmICAvKiAgYWxsIHRoZSBfX2ttcGNfdGFza3EgaW50ZXJmYWNlIGZsYWdzICAqLworCisjZGVmaW5lIFRRRl9JU19MQVNUX1RBU0sgICAgICAgIDB4MDEwMCAgLyogIGludGVybmFsL3JlYWQgYnkgaW5zdHJ1bWVudGF0aW9uOyBvbmx5IHVzZWQgd2l0aCBUUUZfSVNfTEFTVFBSSVZBVEUgICovCisjZGVmaW5lIFRRRl9UQVNLUV9UQVNLICAgICAgICAgIDB4MDIwMCAgLyogIGludGVybmFsIHVzZSBvbmx5OyB0aGlzIHRodW5rLT50aF90YXNrIGlzIHRoZSB0YXNrcV90YXNrICAqLworI2RlZmluZSBUUUZfUkVMRUFTRV9XT1JLRVJTICAgICAweDA0MDAgIC8qICBpbnRlcm5hbCB1c2Ugb25seTsgbXVzdCByZWxlYXNlIHdvcmtlciB0aHJlYWRzIG9uY2UgQU5ZIHF1ZXVlZCB0YXNrIGV4aXN0cyAoZ2xvYmFsKSAqLworI2RlZmluZSBUUUZfQUxMX1RBU0tTX1FVRVVFRCAgICAweDA4MDAgIC8qICBpbnRlcm5hbCB1c2Ugb25seTsgbm90aWZ5IHdvcmtlcnMgdGhhdCBtYXN0ZXIgaGFzIGZpbmlzaGVkIGVucXVldWluZyB0YXNrcyAqLworI2RlZmluZSBUUUZfUEFSQUxMRUxfQ09OVEVYVCAgICAweDEwMDAgIC8qICBpbnRlcm5hbCB1c2Ugb25seTogdGhpcyBxdWV1ZSBlbmNvdW50ZXJlZCBpbiBhIHBhcmFsbGVsIGNvbnRleHQ6IG5vdCBzZXJpYWxpemVkICovCisjZGVmaW5lIFRRRl9ERUFMTE9DQVRFRCAgICAgICAgIDB4MjAwMCAgLyogIGludGVybmFsIHVzZSBvbmx5OyB0aGlzIHF1ZXVlIGlzIG9uIHRoZSBmcmVlbGlzdCBhbmQgbm90IGluIHVzZSAqLworCisjZGVmaW5lIFRRRl9JTlRFUk5BTF9GTEFHUyAgICAgIDB4M2YwMCAgLyogIGFsbCB0aGUgaW50ZXJuYWwgdXNlIG9ubHkgZmxhZ3MgICovCisKK3R5cGVkZWYgc3RydWN0IEtNUF9BTElHTl9DQUNIRSBrbXBjX2FsaWduZWRfaW50MzJfdCB7CisgICAga21wX2ludDMyICAgICAgICAgICAgICAgICAgICAgIGFpX2RhdGE7Cit9IGttcGNfYWxpZ25lZF9pbnQzMl90OworCit0eXBlZGVmIHN0cnVjdCBLTVBfQUxJR05fQ0FDSEUga21wY19hbGlnbmVkX3F1ZXVlX3Nsb3RfdCB7CisgICAgc3RydWN0IGttcGNfdGh1bmtfdCAgICpxc190aHVuazsKK30ga21wY19hbGlnbmVkX3F1ZXVlX3Nsb3RfdDsKKwordHlwZWRlZiBzdHJ1Y3Qga21wY190YXNrX3F1ZXVlX3QgeworICAgICAgICAvKiB0YXNrIHF1ZXVlIGxpbmthZ2UgZmllbGRzIGZvciBuLWFyeSB0cmVlIG9mIHF1ZXVlcyAobG9ja2VkIHdpdGggZ2xvYmFsIHRhc2txX3RyZWVfbGNrKSAqLworICAgIGttcF9sb2NrX3QgICAgICAgICAgICAgICAgICAgIHRxX2xpbmtfbGNrOyAgICAgICAgICAvKiAgbG9jayBmb3IgY2hpbGQgbGluaywgY2hpbGQgbmV4dC9wcmV2IGxpbmtzIGFuZCBjaGlsZCByZWYgY291bnRzICovCisgICAgdW5pb24geworICAgICAgICBzdHJ1Y3Qga21wY190YXNrX3F1ZXVlX3QgKnRxX3BhcmVudDsgICAgICAgICAgICAvKiAgcG9pbnRlciB0byBwYXJlbnQgdGFza3EsIG5vdCBsb2NrZWQgKi8KKyAgICAgICAgc3RydWN0IGttcGNfdGFza19xdWV1ZV90ICp0cV9uZXh0X2ZyZWU7ICAgICAgICAgLyogIGZvciB0YXNrcSBpbnRlcm5hbCBmcmVlbGlzdHMsIGxvY2tlZCB3aXRoIGdsb2JhbCB0YXNrcV9mcmVlbGlzdF9sY2sgKi8KKyAgICB9IHRxOworICAgIHZvbGF0aWxlIHN0cnVjdCBrbXBjX3Rhc2tfcXVldWVfdCAqdHFfZmlyc3RfY2hpbGQ7ICAvKiAgcG9pbnRlciB0byBsaW5rZWQtbGlzdCBvZiBjaGlsZHJlbiwgbG9ja2VkIGJ5IHRxJ3MgdHFfbGlua19sY2sgKi8KKyAgICBzdHJ1Y3Qga21wY190YXNrX3F1ZXVlX3QgICAgICp0cV9uZXh0X2NoaWxkOyAgICAgICAgLyogIG5leHQgY2hpbGQgaW4gbGlua2VkLWxpc3QsIGxvY2tlZCBieSBwYXJlbnQgdHEncyB0cV9saW5rX2xjayAqLworICAgIHN0cnVjdCBrbXBjX3Rhc2tfcXVldWVfdCAgICAgKnRxX3ByZXZfY2hpbGQ7ICAgICAgICAvKiAgcHJldmlvdXMgY2hpbGQgaW4gbGlua2VkLWxpc3QsIGxvY2tlZCBieSBwYXJlbnQgdHEncyB0cV9saW5rX2xjayAqLworICAgIHZvbGF0aWxlIGttcF9pbnQzMiAgICAgICAgICAgIHRxX3JlZl9jb3VudDsgICAgICAgICAvKiAgcmVmZXJlbmNlIGNvdW50IG9mIHRocmVhZHMgd2l0aCBhY2Nlc3MgdG8gdGhpcyB0YXNrIHF1ZXVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAob3RoZXIgdGhhbiB0aGUgdGhyZWFkIGV4ZWN1dGluZyB0aGUga21wY19lbmRfdGFza3EgY2FsbCkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGxvY2tlZCBieSBwYXJlbnQgdHEncyB0cV9saW5rX2xjayAqLworCisgICAgICAgIC8qIHNoYXJlZCBkYXRhIGZvciB0YXNrIHF1ZXVlICovCisgICAgc3RydWN0IGttcGNfYWxpZ25lZF9zaGFyZWRfdmFyc190ICAgICp0cV9zaGFyZWRzOyAgIC8qICBwZXItdGhyZWFkIGFycmF5IG9mIHBvaW50ZXJzIHRvIHNoYXJlZCB2YXJpYWJsZSBzdHJ1Y3R1cmVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBvbmx5IG9uZSBhcnJheSBlbGVtZW50IGV4aXN0cyBmb3IgYWxsIGJ1dCBvdXRlcm1vc3QgdGFza3EgKi8KKworICAgICAgICAvKiBib29ra2VlcGluZyBmb3Igb3JkZXJlZCB0YXNrIHF1ZXVlICovCisgICAga21wX3VpbnQzMiAgICAgICAgICAgICAgICAgICAgdHFfdGFza251bV9xdWV1aW5nOyAgIC8qICBvcmRlcmVkIHRhc2sgbnVtYmVyIGFzc2lnbmVkIHdoaWxlIHF1ZXVpbmcgdGFza3MgKi8KKyAgICB2b2xhdGlsZSBrbXBfdWludDMyICAgICAgICAgICB0cV90YXNrbnVtX3NlcnZpbmc7ICAgLyogIG9yZGVyZWQgbnVtYmVyIG9mIG5leHQgdGFzayB0byBiZSBzZXJ2ZWQgKGV4ZWN1dGVkKSAqLworCisgICAgICAgIC8qIHRodW5rIHN0b3JhZ2UgbWFuYWdlbWVudCBmb3IgdGFzayBxdWV1ZSAqLworICAgIGttcF9sb2NrX3QgICAgICAgICAgICAgICAgICAgIHRxX2ZyZWVfdGh1bmtzX2xjazsgICAvKiAgbG9jayBmb3IgdGh1bmsgZnJlZWxpc3QgbWFuaXB1bGF0aW9uICovCisgICAgc3RydWN0IGttcGNfdGh1bmtfdCAgICAgICAgICAqdHFfZnJlZV90aHVua3M7ICAgICAgIC8qICB0aHVuayBmcmVlbGlzdCwgY2hhaW5lZCB2aWEgdGgudGhfbmV4dF9mcmVlICAqLworICAgIHN0cnVjdCBrbXBjX3RodW5rX3QgICAgICAgICAgKnRxX3RodW5rX3NwYWNlOyAgICAgICAvKiAgc3BhY2UgYWxsb2NhdGVkIGZvciB0aHVua3MgZm9yIHRoaXMgdGFzayBxdWV1ZSAgKi8KKworICAgICAgICAvKiBkYXRhIGZpZWxkcyBmb3IgcXVldWUgaXRzZWxmICovCisgICAga21wX2xvY2tfdCAgICAgICAgICAgICAgICAgICAgdHFfcXVldWVfbGNrOyAgICAgICAgIC8qICBsb2NrIGZvciBbZGVdZW5xdWV1ZSBvcGVyYXRpb25zOiB0cV9xdWV1ZSwgdHFfaGVhZCwgdHFfdGFpbCwgdHFfbmZ1bGwgKi8KKyAgICBrbXBjX2FsaWduZWRfcXVldWVfc2xvdF90ICAgICp0cV9xdWV1ZTsgICAgICAgICAgICAgLyogIGFycmF5IG9mIHF1ZXVlIHNsb3RzIHRvIGhvbGQgdGh1bmtzIGZvciB0YXNrcyAqLworICAgIHZvbGF0aWxlIHN0cnVjdCBrbXBjX3RodW5rX3QgKnRxX3Rhc2txX3Nsb3Q7ICAgICAgICAvKiAgc3BlY2lhbCBzbG90IGZvciB0YXNrcSB0YXNrIHRodW5rLCBvY2N1cGllZCBpZiBub3QgTlVMTCAgKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICAgICAgICB0cV9uc2xvdHM7ICAgICAgICAgICAgLyogICMgb2YgdHFfdGh1bmtfc3BhY2UgdGh1bmtzIGFsbG9jJ2QgKG5vdCBpbmNsLiB0cV90YXNrcV9zbG90IHNwYWNlKSAgKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICAgICAgICB0cV9oZWFkOyAgICAgICAgICAgICAgLyogIGVucXVldWUgcHV0cyBuZXh0IGl0ZW0gaW4gaGVyZSAoaW5kZXggaW50byB0cV9xdWV1ZSBhcnJheSkgKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICAgICAgICB0cV90YWlsOyAgICAgICAgICAgICAgLyogIGRlcXVldWUgdGFrZXMgbmV4dCBpdGVtIG91dCBvZiBoZXJlIChpbmRleCBpbnRvIHRxX3F1ZXVlIGFycmF5KSAqLworICAgIHZvbGF0aWxlIGttcF9pbnQzMiAgICAgICAgICAgIHRxX25mdWxsOyAgICAgICAgICAgICAvKiAgIyBvZiBvY2N1cGllZCBlbnRyaWVzIGluIHRhc2sgcXVldWUgcmlnaHQgbm93ICAqLworICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgICAgICAgIHRxX2hpd2F0OyAgICAgICAgICAgICAvKiAgaGlnaC13YXRlciBtYXJrIGZvciB0cV9uZnVsbCBhbmQgcXVldWUgc2NoZWR1bGluZyAgKi8KKyAgICB2b2xhdGlsZSBrbXBfaW50MzIgICAgICAgICAgICB0cV9mbGFnczsgICAgICAgICAgICAgLyogIFRRRl94eHggICovCisKKyAgICAgICAgLyogYm9va2tlZXBpbmcgZm9yIG91dHN0YW5kaW5nIHRodW5rcyAqLworICAgIHN0cnVjdCBrbXBjX2FsaWduZWRfaW50MzJfdCAgKnRxX3RoX3RodW5rczsgICAgICAgICAvKiAgcGVyLXRocmVhZCBhcnJheSBmb3IgIyBvZiByZWd1bGFyIHRodW5rcyBjdXJyZW50bHkgYmVpbmcgZXhlY3V0ZWQgKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICAgICAgICB0cV9ucHJvYzsgICAgICAgICAgICAgLyogIG51bWJlciBvZiB0aHVua3MgaW4gdGhlIHRoX3RodW5rcyBhcnJheSAqLworCisgICAgICAgIC8qIHN0YXRpc3RpY3MgbGlicmFyeSBib29ra2VlcGluZyAqLworICAgIGlkZW50X3QgICAgICAgICAgICAgICAgICAgICAgICp0cV9sb2M7ICAgICAgICAgICAgICAvKiAgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uIGZvciB0YXNrcSBkaXJlY3RpdmUgKi8KK30ga21wY190YXNrX3F1ZXVlX3Q7CisKK3R5cGVkZWYgdm9pZCAoKmttcGNfdGFza190KSAoa21wX2ludDMyIGdsb2JhbF90aWQsIHN0cnVjdCBrbXBjX3RodW5rX3QgKnRodW5rKTsKKworLyogIHNpemVvZl9zaGFyZWRzIHBhc3NlZCBhcyBhcmcgdG8gX19rbXBjX3Rhc2txIGNhbGwgICovCit0eXBlZGVmIHN0cnVjdCBrbXBjX3NoYXJlZF92YXJzX3QgeyAgICAgICAgICAgICAvKiAgYWxpZ25lZCBkdXJpbmcgZHluYW1pYyBhbGxvY2F0aW9uICovCisgICAga21wY190YXNrX3F1ZXVlX3QgICAgICAgICAqc3ZfcXVldWU7CisgICAgLyogIChwb2ludGVycyB0bykgc2hhcmVkIHZhcnMgICovCit9IGttcGNfc2hhcmVkX3ZhcnNfdDsKKwordHlwZWRlZiBzdHJ1Y3QgS01QX0FMSUdOX0NBQ0hFIGttcGNfYWxpZ25lZF9zaGFyZWRfdmFyc190IHsKKyAgICB2b2xhdGlsZSBzdHJ1Y3Qga21wY19zaGFyZWRfdmFyc190ICAgICAqYWlfZGF0YTsKK30ga21wY19hbGlnbmVkX3NoYXJlZF92YXJzX3Q7CisKKy8qICBzaXplb2ZfdGh1bmsgcGFzc2VkIGFzIGFyZyB0byBrbXBjX3Rhc2txIGNhbGwgICovCit0eXBlZGVmIHN0cnVjdCBrbXBjX3RodW5rX3QgeyAgICAgICAgICAgICAgICAgICAvKiAgYWxpZ25lZCBkdXJpbmcgZHluYW1pYyBhbGxvY2F0aW9uICovCisgICAgdW5pb24geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgZmllbGQgdXNlZCBmb3IgaW50ZXJuYWwgZnJlZWxpc3RzIHRvbyAgKi8KKyAgICAgICAga21wY19zaGFyZWRfdmFyc190ICAqdGhfc2hhcmVkczsKKyAgICAgICAgc3RydWN0IGttcGNfdGh1bmtfdCAqdGhfbmV4dF9mcmVlOyAgICAgIC8qICBmcmVlbGlzdCBvZiBpbmRpdmlkdWFsIHRodW5rcyB3aXRoaW4gcXVldWUsIGhlYWQgYXQgdHFfZnJlZV90aHVua3MgICovCisgICAgfSB0aDsKKyAgICBrbXBjX3Rhc2tfdCB0aF90YXNrOyAgICAgICAgICAgICAgICAgICAgICAgIC8qICB0YXNrcV90YXNrIGlmIGZsYWdzICYgVFFGX1RBU0tRX1RBU0sgICovCisgICAgc3RydWN0IGttcGNfdGh1bmtfdCAqdGhfZW5jbF90aHVuazsgICAgICAgICAvKiAgcG9pbnRlciB0byBkeW5hbWljYWxseSBlbmNsb3NpbmcgdGh1bmsgb24gdGhpcyB0aHJlYWQncyBjYWxsIHN0YWNrICovCisgICAga21wX2ludDMyIHRoX2ZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgVFFGX3h4eCAodHFfZmxhZ3MgaW50ZXJmYWNlIHBsdXMgcG9zc2libGUgaW50ZXJuYWwgZmxhZ3MpICAqLworICAgIGttcF9pbnQzMiB0aF9zdGF0dXM7CisgICAga21wX3VpbnQzMiB0aF90YXNrbnVtOyAgICAgICAgICAgICAgICAgICAgICAvKiAgdGFzayBudW1iZXIgYXNzaWduZWQgaW4gb3JkZXIgb2YgcXVldWluZywgdXNlZCBmb3Igb3JkZXJlZCBzZWN0aW9ucyAqLworICAgIC8qICBwcml2YXRlIHZhcnMgICovCit9IGttcGNfdGh1bmtfdDsKKwordHlwZWRlZiBzdHJ1Y3QgS01QX0FMSUdOX0NBQ0hFIGttcF90YXNrcSB7CisgICAgaW50ICAgICAgICAgICAgICAgICB0cV9jdXJyX3RodW5rX2NhcGFjaXR5OworCisgICAga21wY190YXNrX3F1ZXVlX3QgICp0cV9yb290OworICAgIGttcF9pbnQzMiAgICAgICAgICAgdHFfZ2xvYmFsX2ZsYWdzOworCisgICAga21wX2xvY2tfdCAgICAgICAgICB0cV9mcmVlbGlzdF9sY2s7CisgICAga21wY190YXNrX3F1ZXVlX3QgICp0cV9mcmVlbGlzdDsKKworICAgIGttcGNfdGh1bmtfdCAgICAgICoqdHFfY3Vycl90aHVuazsKK30ga21wX3Rhc2txX3Q7CisKKy8qIEVORCBUYXNrcSBkYXRhIHN0cnVjdHVyZXMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit0eXBlZGVmIGttcF9pbnQzMiBrbXBfY3JpdGljYWxfbmFtZVs4XTsKKworLyohCitAaW5ncm91cCBQQVJBTExFTAorVGhlIHR5cGUgZm9yIGEgbWljcm90YXNrIHdoaWNoIGdldHMgcGFzc2VkIHRvIEByZWYgX19rbXBjX2ZvcmtfY2FsbCgpLgorVGhlIGFyZ3VtZW50cyB0byB0aGUgb3V0bGluZWQgZnVuY3Rpb24gYXJlCitAcGFyYW0gZ2xvYmFsX3RpZCB0aGUgZ2xvYmFsIHRocmVhZCBpZGVudGl0eSBvZiB0aGUgdGhyZWFkIGV4ZWN1dGluZyB0aGUgZnVuY3Rpb24uCitAcGFyYW0gYm91bmRfdGlkICB0aGUgbG9jYWwgaWRlbnRpdGl5IG9mIHRoZSB0aHJlYWQgZXhlY3V0aW5nIHRoZSBmdW5jdGlvbgorQHBhcmFtIC4uLiBwb2ludGVycyB0byBzaGFyZWQgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHRoZSBmdW5jdGlvbi4KKyovCit0eXBlZGVmIHZvaWQgKCprbXBjX21pY3JvKSAgICAgICAgICAgICAgKCBrbXBfaW50MzIgKiBnbG9iYWxfdGlkLCBrbXBfaW50MzIgKiBib3VuZF90aWQsIC4uLiApOwordHlwZWRlZiB2b2lkICgqa21wY19taWNyb19ib3VuZCkgICAgICAgICgga21wX2ludDMyICogYm91bmRfdGlkLCBrbXBfaW50MzIgKiBib3VuZF9udGgsIC4uLiApOworCisvKiEKK0Bpbmdyb3VwIFRIUkVBRFBSSVZBVEUKK0B7CisqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBUaHJlYWRwcml2YXRlIGluaXRpYWxpemF0aW9uL2ZpbmFsaXphdGlvbiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgKi8KKworLyogIGZvciBub24tYXJyYXkgb2JqZWN0czogIF9fa21wY190aHJlYWRwcml2YXRlX3JlZ2lzdGVyKCkgICovCisKKy8qIQorIFBvaW50ZXIgdG8gdGhlIGNvbnN0cnVjdG9yIGZ1bmN0aW9uLgorIFRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgPHR0PnRoaXM8L3R0PiBwb2ludGVyCisqLwordHlwZWRlZiB2b2lkICooKmttcGNfY3RvcikgICAgKHZvaWQgKik7CisKKy8qIQorIFBvaW50ZXIgdG8gdGhlIGRlc3RydWN0b3IgZnVuY3Rpb24uCisgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSA8dHQ+dGhpczwvdHQ+IHBvaW50ZXIKKyovCit0eXBlZGVmIHZvaWQgKCprbXBjX2R0b3IpICAgICAodm9pZCAqIC8qLCBzaXplX3QgKi8pOyAvKiAybmQgYXJnOiBtYWdpYyBudW1iZXIgZm9yIEtDQyB1bnVzZWQgYnkgSW50ZWwgY29tcGlsZXIgKi8KKy8qIQorIFBvaW50ZXIgdG8gYW4gYWx0ZXJuYXRlIGNvbnN0cnVjdG9yLgorIFRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgPHR0PnRoaXM8L3R0PiBwb2ludGVyLgorKi8KK3R5cGVkZWYgdm9pZCAqKCprbXBjX2NjdG9yKSAgICh2b2lkICosIHZvaWQgKik7CisKKy8qICBmb3IgYXJyYXkgb2JqZWN0czogX19rbXBjX3RocmVhZHByaXZhdGVfcmVnaXN0ZXJfdmVjKCkgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpcnN0IGFyZzogInRoaXMiIHBvaW50ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGFzdCBhcmc6IG51bWJlciBvZiBhcnJheSBlbGVtZW50cyAqLworLyohCisgQXJyYXkgY29uc3RydWN0b3IuCisgRmlyc3QgYXJndW1lbnQgaXMgdGhlIDx0dD50aGlzPC90dD4gcG9pbnRlcgorIFNlY29uZCBhcmd1bWVudCB0aGUgbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzLgorKi8KK3R5cGVkZWYgdm9pZCAqKCprbXBjX2N0b3JfdmVjKSAgKHZvaWQgKiwgc2l6ZV90KTsKKy8qIQorIFBvaW50ZXIgdG8gdGhlIGFycmF5IGRlc3RydWN0b3IgZnVuY3Rpb24uCisgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSA8dHQ+dGhpczwvdHQ+IHBvaW50ZXIKKyBTZWNvbmQgYXJndW1lbnQgdGhlIG51bWJlciBvZiBhcnJheSBlbGVtZW50cy4KKyovCit0eXBlZGVmIHZvaWQgKCprbXBjX2R0b3JfdmVjKSAgICh2b2lkICosIHNpemVfdCk7CisvKiEKKyBBcnJheSBjb25zdHJ1Y3Rvci4KKyBGaXJzdCBhcmd1bWVudCBpcyB0aGUgPHR0PnRoaXM8L3R0PiBwb2ludGVyCisgVGhpcmQgYXJndW1lbnQgdGhlIG51bWJlciBvZiBhcnJheSBlbGVtZW50cy4KKyovCit0eXBlZGVmIHZvaWQgKigqa21wY19jY3Rvcl92ZWMpICh2b2lkICosIHZvaWQgKiwgc2l6ZV90KTsgLyogZnVuY3Rpb24gdW51c2VkIGJ5IGNvbXBpbGVyICovCisKKy8qIQorQH0KKyovCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIGtlZXBzIHRyYWNrZWQgb2YgdGhyZWFkcHJpdmF0ZSBjYWNoZSBhbGxvY2F0aW9ucyBmb3IgY2xlYW51cCBsYXRlciAqLwordHlwZWRlZiBzdHJ1Y3Qga21wX2NhY2hlZF9hZGRyIHsKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICoqYWRkcjsgICAgICAgICAgIC8qIGFkZHJlc3Mgb2YgYWxsb2NhdGVkIGNhY2hlICovCisgICAgc3RydWN0IGttcF9jYWNoZWRfYWRkciAgICAgKm5leHQ7ICAgICAgICAgICAvKiBwb2ludGVyIHRvIG5leHQgY2FjaGVkIGFkZHJlc3MgKi8KK30ga21wX2NhY2hlZF9hZGRyX3Q7CisKK3N0cnVjdCBwcml2YXRlX2RhdGEgeworICAgIHN0cnVjdCBwcml2YXRlX2RhdGEgKm5leHQ7ICAgICAgICAgIC8qIFRoZSBuZXh0IGRlc2NyaXB0b3IgaW4gdGhlIGxpc3QgICAgICAqLworICAgIHZvaWQgICAgICAgICAgICAgICAgKmRhdGE7ICAgICAgICAgIC8qIFRoZSBkYXRhIGJ1ZmZlciBmb3IgdGhpcyBkZXNjcmlwdG9yICAqLworICAgIGludCAgICAgICAgICAgICAgICAgIG1vcmU7ICAgICAgICAgIC8qIFRoZSByZXBlYXQgY291bnQgZm9yIHRoaXMgZGVzY3JpcHRvciAqLworICAgIHNpemVfdCAgICAgICAgICAgICAgIHNpemU7ICAgICAgICAgIC8qIFRoZSBkYXRhIHNpemUgZm9yIHRoaXMgZGVzY3JpcHRvciAgICAqLworfTsKKworc3RydWN0IHByaXZhdGVfY29tbW9uIHsKKyAgICBzdHJ1Y3QgcHJpdmF0ZV9jb21tb24gICAgICpuZXh0OworICAgIHN0cnVjdCBwcml2YXRlX2NvbW1vbiAgICAgKmxpbms7CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqZ2JsX2FkZHI7CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqcGFyX2FkZHI7ICAgICAgICAvKiBwYXJfYWRkciA9PSBnYmxfYWRkciBmb3IgTUFTVEVSIHRocmVhZCAqLworICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgIGNtbl9zaXplOworfTsKKworc3RydWN0IHNoYXJlZF9jb21tb24KK3sKKyAgICBzdHJ1Y3Qgc2hhcmVkX2NvbW1vbiAgICAgICpuZXh0OworICAgIHN0cnVjdCBwcml2YXRlX2RhdGEgICAgICAgKnBvZF9pbml0OworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKm9ial9pbml0OworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKmdibF9hZGRyOworICAgIHVuaW9uIHsKKyAgICAgICAga21wY19jdG9yICAgICAgICAgICAgICBjdG9yOworICAgICAgICBrbXBjX2N0b3JfdmVjICAgICAgICAgIGN0b3J2OworICAgIH0gY3Q7CisgICAgdW5pb24geworICAgICAgICBrbXBjX2NjdG9yICAgICAgICAgICAgIGNjdG9yOworICAgICAgICBrbXBjX2NjdG9yX3ZlYyAgICAgICAgIGNjdG9ydjsKKyAgICB9IGNjdDsKKyAgICB1bmlvbiB7CisgICAgICAgIGttcGNfZHRvciAgICAgICAgICAgICAgZHRvcjsKKyAgICAgICAga21wY19kdG9yX3ZlYyAgICAgICAgICBkdG9ydjsKKyAgICB9IGR0OworICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgIHZlY19sZW47CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgaXNfdmVjOworICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgIGNtbl9zaXplOworfTsKKworI2RlZmluZSBLTVBfSEFTSF9UQUJMRV9MT0cyICAgICA5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxvZzIgb2YgdGhlIGhhc2ggdGFibGUgc2l6ZSAqLworI2RlZmluZSBLTVBfSEFTSF9UQUJMRV9TSVpFICAgICAoMSA8PCBLTVBfSEFTSF9UQUJMRV9MT0cyKSAgICAgIC8qIHNpemUgb2YgdGhlIGhhc2ggdGFibGUgKi8KKyNkZWZpbmUgS01QX0hBU0hfU0hJRlQgICAgICAgICAgMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aHJvdyBhd2F5IHRoaXMgbWFueSBsb3cgYml0cyBmcm9tIHRoZSBhZGRyZXNzICovCisjZGVmaW5lIEtNUF9IQVNIKHgpICAgICAgICAgICAgICgoKChrbXBfdWludHB0cl90KSB4KSA+PiBLTVBfSEFTSF9TSElGVCkgJiAoS01QX0hBU0hfVEFCTEVfU0laRS0xKSkKKworc3RydWN0IGNvbW1vbl90YWJsZSB7CisgICAgc3RydWN0ICBwcml2YXRlX2NvbW1vbiAgICAgICpkYXRhWyBLTVBfSEFTSF9UQUJMRV9TSVpFIF07Cit9OworCitzdHJ1Y3Qgc2hhcmVkX3RhYmxlIHsKKyAgICBzdHJ1Y3QgIHNoYXJlZF9jb21tb24gICAgICAgKmRhdGFbIEtNUF9IQVNIX1RBQkxFX1NJWkUgXTsKK307CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgS01QX1NUQVRJQ19TVEVBTF9FTkFCTEVECit0eXBlZGVmIHN0cnVjdCBLTVBfQUxJR05fQ0FDSEUgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvMzIgeworICAgIGttcF9pbnQzMiBjb3VudDsKKyAgICBrbXBfaW50MzIgdWI7CisgICAgLyogQWRkaW5nIEtNUF9BTElHTl9DQUNIRSBoZXJlIGRvZXNuJ3QgaGVscCAvIGNhbiBodXJ0IHBlcmZvcm1hbmNlICovCisgICAga21wX2ludDMyIGxiOworICAgIGttcF9pbnQzMiBzdDsKKyAgICBrbXBfaW50MzIgdGM7CisgICAga21wX2ludDMyIHN0YXRpY19zdGVhbF9jb3VudGVyOyAvKiBmb3Igc3RhdGljX3N0ZWFsIG9ubHk7IG1heWJlIGJldHRlciB0byBwdXQgYWZ0ZXIgdWIgKi8KKworICAgIC8vIEtNUF9BTElHTiggMTYgKSBlbnN1cmVzICggaWYgdGhlIEtNUF9BTElHTiBtYWNybyBpcyB0dXJuZWQgb24gKQorICAgIC8vICAgIGEpIHBhcm0zIGlzIHByb3Blcmx5IGFsaWduZWQgYW5kCisgICAgLy8gICAgYikgYWxsIHBhcm0xLTQgYXJlIGluIHRoZSBzYW1lIGNhY2hlIGxpbmUuCisgICAgLy8gQmVjYXVzZSBvZiBwYXJtMS00IGFyZSB1c2VkIHRvZ2V0aGVyLCBwZXJmb3JtYW5jZSBzZWVtcyB0byBiZSBiZXR0ZXIKKyAgICAvLyBpZiB0aGV5IGFyZSBpbiB0aGUgc2FtZSBsaW5lIChub3QgbWVhc3VyZWQgdGhvdWdoKS4KKworICAgIHN0cnVjdCBLTVBfQUxJR04oIDMyICkgeyAvLyBBQzogY2hhbmdlZCAxNiB0byAzMiBpbiBvcmRlciB0byBzaW1wbGlmeSB0ZW1wbGF0ZQorICAgICAgICBrbXBfaW50MzIgcGFybTE7ICAgICAvLyAgICAgc3RydWN0dXJlcyBpbiBrbXBfZGlzcGF0Y2guY3BwLiBUaGlzIHNob3VsZAorICAgICAgICBrbXBfaW50MzIgcGFybTI7ICAgICAvLyAgICAgbWFrZSBubyByZWFsIGNoYW5nZSBhdCBsZWFzdCB3aGlsZSBwYWRkaW5nIGlzIG9mZi4KKyAgICAgICAga21wX2ludDMyIHBhcm0zOworICAgICAgICBrbXBfaW50MzIgcGFybTQ7CisgICAgfTsKKworICAgIGttcF91aW50MzIgb3JkZXJlZF9sb3dlcjsKKyAgICBrbXBfdWludDMyIG9yZGVyZWRfdXBwZXI7CisjaWYgS01QX09TX1dJTkRPV1MKKyAgICAvLyBUaGlzIHZhciBjYW4gYmUgcGxhY2VkIGluIHRoZSBob2xlIGJldHdlZW4gJ3RjJyBhbmQgJ3Bhcm0xJywgaW5zdGVhZCBvZiAnc3RhdGljX3N0ZWFsX2NvdW50ZXInLgorICAgIC8vIEl0IHdvdWxkIGJlIG5pY2UgdG8gbWVhc3VyZSBleGVjdXRpb24gdGltZXMuCisgICAgLy8gQ29uZGl0aW9uYWwgaWYvZW5kaWYgY2FuIGJlIHJlbW92ZWQgYXQgYWxsLgorICAgIGttcF9pbnQzMiBsYXN0X3VwcGVyOworI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCit9IGRpc3BhdGNoX3ByaXZhdGVfaW5mbzMyX3Q7CisKK3R5cGVkZWYgc3RydWN0IEtNUF9BTElHTl9DQUNIRSBkaXNwYXRjaF9wcml2YXRlX2luZm82NCB7CisgICAga21wX2ludDY0IGNvdW50OyAgIC8qIGN1cnJlbnQgY2h1bmsgbnVtYmVyIGZvciBzdGF0aWMgYW5kIHN0YXRpYy1zdGVhbCBzY2hlZHVsaW5nKi8KKyAgICBrbXBfaW50NjQgdWI7ICAgICAgLyogdXBwZXItYm91bmQgKi8KKyAgICAvKiBBZGRpbmcgS01QX0FMSUdOX0NBQ0hFIGhlcmUgZG9lc24ndCBoZWxwIC8gY2FuIGh1cnQgcGVyZm9ybWFuY2UgKi8KKyAgICBrbXBfaW50NjQgbGI7ICAgICAgLyogbG93ZXItYm91bmQgKi8KKyAgICBrbXBfaW50NjQgc3Q7ICAgICAgLyogc3RyaWRlICovCisgICAga21wX2ludDY0IHRjOyAgICAgIC8qIHRyaXAgY291bnQgKG51bWJlciBvZiBpdGVyYXRpb25zKSAqLworICAgIGttcF9pbnQ2NCBzdGF0aWNfc3RlYWxfY291bnRlcjsgLyogZm9yIHN0YXRpY19zdGVhbCBvbmx5OyBtYXliZSBiZXR0ZXIgdG8gcHV0IGFmdGVyIHViICovCisKKyAgICAvKiBwYXJtWzEtNF0gYXJlIHVzZWQgaW4gZGlmZmVyZW50IHdheXMgYnkgZGlmZmVyZW50IHNjaGVkdWxpbmcgYWxnb3JpdGhtcyAqLworCisgICAgLy8gS01QX0FMSUdOKCAzMiApIGVuc3VyZXMgKCBpZiB0aGUgS01QX0FMSUdOIG1hY3JvIGlzIHR1cm5lZCBvbiApCisgICAgLy8gICAgYSkgcGFybTMgaXMgcHJvcGVybHkgYWxpZ25lZCBhbmQKKyAgICAvLyAgICBiKSBhbGwgcGFybTEtNCBhcmUgaW4gdGhlIHNhbWUgY2FjaGUgbGluZS4KKyAgICAvLyBCZWNhdXNlIG9mIHBhcm0xLTQgYXJlIHVzZWQgdG9nZXRoZXIsIHBlcmZvcm1hbmNlIHNlZW1zIHRvIGJlIGJldHRlcgorICAgIC8vIGlmIHRoZXkgYXJlIGluIHRoZSBzYW1lIGxpbmUgKG5vdCBtZWFzdXJlZCB0aG91Z2gpLgorCisgICAgc3RydWN0IEtNUF9BTElHTiggMzIgKSB7CisgICAgICAgIGttcF9pbnQ2NCBwYXJtMTsKKyAgICAgICAga21wX2ludDY0IHBhcm0yOworICAgICAgICBrbXBfaW50NjQgcGFybTM7CisgICAgICAgIGttcF9pbnQ2NCBwYXJtNDsKKyAgICB9OworCisgICAga21wX3VpbnQ2NCBvcmRlcmVkX2xvd2VyOworICAgIGttcF91aW50NjQgb3JkZXJlZF91cHBlcjsKKyNpZiBLTVBfT1NfV0lORE9XUworICAgIC8vIFRoaXMgdmFyIGNhbiBiZSBwbGFjZWQgaW4gdGhlIGhvbGUgYmV0d2VlbiAndGMnIGFuZCAncGFybTEnLCBpbnN0ZWFkIG9mICdzdGF0aWNfc3RlYWxfY291bnRlcicuCisgICAgLy8gSXQgd291bGQgYmUgbmljZSB0byBtZWFzdXJlIGV4ZWN1dGlvbiB0aW1lcy4KKyAgICAvLyBDb25kaXRpb25hbCBpZi9lbmRpZiBjYW4gYmUgcmVtb3ZlZCBhdCBhbGwuCisgICAga21wX2ludDY0IGxhc3RfdXBwZXI7CisjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KK30gZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvNjRfdDsKKyNlbHNlIC8qIEtNUF9TVEFUSUNfU1RFQUxfRU5BQkxFRCAqLwordHlwZWRlZiBzdHJ1Y3QgS01QX0FMSUdOX0NBQ0hFIGRpc3BhdGNoX3ByaXZhdGVfaW5mbzMyIHsKKyAgICBrbXBfaW50MzIgbGI7CisgICAga21wX2ludDMyIHViOworICAgIGttcF9pbnQzMiBzdDsKKyAgICBrbXBfaW50MzIgdGM7CisKKyAgICBrbXBfaW50MzIgcGFybTE7CisgICAga21wX2ludDMyIHBhcm0yOworICAgIGttcF9pbnQzMiBwYXJtMzsKKyAgICBrbXBfaW50MzIgcGFybTQ7CisKKyAgICBrbXBfaW50MzIgY291bnQ7CisKKyAgICBrbXBfdWludDMyIG9yZGVyZWRfbG93ZXI7CisgICAga21wX3VpbnQzMiBvcmRlcmVkX3VwcGVyOworI2lmIEtNUF9PU19XSU5ET1dTCisgICAga21wX2ludDMyIGxhc3RfdXBwZXI7CisjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KK30gZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvMzJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgS01QX0FMSUdOX0NBQ0hFIGRpc3BhdGNoX3ByaXZhdGVfaW5mbzY0IHsKKyAgICBrbXBfaW50NjQgbGI7ICAgICAgLyogbG93ZXItYm91bmQgKi8KKyAgICBrbXBfaW50NjQgdWI7ICAgICAgLyogdXBwZXItYm91bmQgKi8KKyAgICBrbXBfaW50NjQgc3Q7ICAgICAgLyogc3RyaWRlICovCisgICAga21wX2ludDY0IHRjOyAgICAgIC8qIHRyaXAgY291bnQgKG51bWJlciBvZiBpdGVyYXRpb25zKSAqLworCisgICAgLyogcGFybVsxLTRdIGFyZSB1c2VkIGluIGRpZmZlcmVudCB3YXlzIGJ5IGRpZmZlcmVudCBzY2hlZHVsaW5nIGFsZ29yaXRobXMgKi8KKyAgICBrbXBfaW50NjQgcGFybTE7CisgICAga21wX2ludDY0IHBhcm0yOworICAgIGttcF9pbnQ2NCBwYXJtMzsKKyAgICBrbXBfaW50NjQgcGFybTQ7CisKKyAgICBrbXBfaW50NjQgY291bnQ7ICAgLyogY3VycmVudCBjaHVuayBudW1iZXIgZm9yIHN0YXRpYyBzY2hlZHVsaW5nICovCisKKyAgICBrbXBfdWludDY0IG9yZGVyZWRfbG93ZXI7CisgICAga21wX3VpbnQ2NCBvcmRlcmVkX3VwcGVyOworI2lmIEtNUF9PU19XSU5ET1dTCisgICAga21wX2ludDY0IGxhc3RfdXBwZXI7CisjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KK30gZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvNjRfdDsKKyNlbmRpZiAvKiBLTVBfU1RBVElDX1NURUFMX0VOQUJMRUQgKi8KKwordHlwZWRlZiBzdHJ1Y3QgS01QX0FMSUdOX0NBQ0hFIGRpc3BhdGNoX3ByaXZhdGVfaW5mbyB7CisgICAgdW5pb24gcHJpdmF0ZV9pbmZvIHsKKyAgICAgICAgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvMzJfdCAgcDMyOworICAgICAgICBkaXNwYXRjaF9wcml2YXRlX2luZm82NF90ICBwNjQ7CisgICAgfSB1OworICAgIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZTsgIC8qIHNjaGVkdWxpbmcgYWxnb3JpdGhtICovCisgICAga21wX2ludDMyICAgICAgIG9yZGVyZWQ7ICAgLyogb3JkZXJlZCBjbGF1c2Ugc3BlY2lmaWVkICovCisgICAga21wX2ludDMyICAgICAgIG9yZGVyZWRfYnVtcGVkOworICAgIGttcF9pbnQzMiAgIG9yZGVyZWRfZHVtbXlbS01QX01BWF9PUkRFUkVELTNdOyAvLyB0byByZXRhaW4gdGhlIHN0cnVjdHVyZSBzaXplIGFmdGVyIG1ha2luZyBvcmRlcmVkX2l0ZXJhdGlvbiBzY2FsYXIKKyAgICBzdHJ1Y3QgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvICogbmV4dDsgLyogc3RhY2sgb2YgYnVmZmVycyBmb3IgbmVzdCBvZiBzZXJpYWwgcmVnaW9ucyAqLworICAgIGttcF9pbnQzMiAgICAgICBub21lcmdlOyAgIC8qIGRvbid0IG1lcmdlIGl0ZXJzIGlmIHNlcmlhbGl6ZWQgKi8KKyAgICBrbXBfaW50MzIgICAgICAgdHlwZV9zaXplOyAvKiB0aGUgc2l6ZSBvZiB0eXBlcyBpbiBwcml2YXRlX2luZm8gKi8KKyAgICBlbnVtIGNvbnNfdHlwZSAgcHVzaGVkX3dzOworfSBkaXNwYXRjaF9wcml2YXRlX2luZm9fdDsKKwordHlwZWRlZiBzdHJ1Y3QgZGlzcGF0Y2hfc2hhcmVkX2luZm8zMiB7CisgICAgLyogY2h1bmsgaW5kZXggdW5kZXIgZHluYW1pYywgbnVtYmVyIG9mIGlkbGUgdGhyZWFkcyB1bmRlciBzdGF0aWMtc3RlYWw7CisgICAgICAgaXRlcmF0aW9uIGluZGV4IG90aGVyd2lzZSAqLworICAgIHZvbGF0aWxlIGttcF91aW50MzIgICAgICBpdGVyYXRpb247CisgICAgdm9sYXRpbGUga21wX3VpbnQzMiAgICAgIG51bV9kb25lOworICAgIHZvbGF0aWxlIGttcF91aW50MzIgICAgICBvcmRlcmVkX2l0ZXJhdGlvbjsKKyAgICBrbXBfaW50MzIgICBvcmRlcmVkX2R1bW15W0tNUF9NQVhfT1JERVJFRC0xXTsgLy8gdG8gcmV0YWluIHRoZSBzdHJ1Y3R1cmUgc2l6ZSBhZnRlciBtYWtpbmcgb3JkZXJlZF9pdGVyYXRpb24gc2NhbGFyCit9IGRpc3BhdGNoX3NoYXJlZF9pbmZvMzJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZGlzcGF0Y2hfc2hhcmVkX2luZm82NCB7CisgICAgLyogY2h1bmsgaW5kZXggdW5kZXIgZHluYW1pYywgbnVtYmVyIG9mIGlkbGUgdGhyZWFkcyB1bmRlciBzdGF0aWMtc3RlYWw7CisgICAgICAgaXRlcmF0aW9uIGluZGV4IG90aGVyd2lzZSAqLworICAgIHZvbGF0aWxlIGttcF91aW50NjQgICAgICBpdGVyYXRpb247CisgICAgdm9sYXRpbGUga21wX3VpbnQ2NCAgICAgIG51bV9kb25lOworICAgIHZvbGF0aWxlIGttcF91aW50NjQgICAgICBvcmRlcmVkX2l0ZXJhdGlvbjsKKyAgICBrbXBfaW50NjQgICBvcmRlcmVkX2R1bW15W0tNUF9NQVhfT1JERVJFRC0xXTsgLy8gdG8gcmV0YWluIHRoZSBzdHJ1Y3R1cmUgc2l6ZSBhZnRlciBtYWtpbmcgb3JkZXJlZF9pdGVyYXRpb24gc2NhbGFyCit9IGRpc3BhdGNoX3NoYXJlZF9pbmZvNjRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZGlzcGF0Y2hfc2hhcmVkX2luZm8geworICAgIHVuaW9uIHNoYXJlZF9pbmZvIHsKKyAgICAgICAgZGlzcGF0Y2hfc2hhcmVkX2luZm8zMl90ICBzMzI7CisgICAgICAgIGRpc3BhdGNoX3NoYXJlZF9pbmZvNjRfdCAgczY0OworICAgIH0gdTsKKy8qICAgIHZvbGF0aWxlIGttcF9pbnQzMiAgICAgIGRpc3BhdGNoX2Fib3J0OyAgZGVwcmljYXRlZCAqLworICAgIHZvbGF0aWxlIGttcF91aW50MzIgICAgIGJ1ZmZlcl9pbmRleDsKK30gZGlzcGF0Y2hfc2hhcmVkX2luZm9fdDsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2Rpc3AgeworICAgIC8qIFZlY3RvciBmb3IgT1JERVJFRCBTRUNUSU9OICovCisgICAgdm9pZCAoKnRoX2Rlb19mY24pKCBpbnQgKiBndGlkLCBpbnQgKiBjaWQsIGlkZW50X3QgKik7CisgICAgLyogVmVjdG9yIGZvciBFTkQgT1JERVJFRCBTRUNUSU9OICovCisgICAgdm9pZCAoKnRoX2R4b19mY24pKCBpbnQgKiBndGlkLCBpbnQgKiBjaWQsIGlkZW50X3QgKik7CisKKyAgICBkaXNwYXRjaF9zaGFyZWRfaW5mb190ICAqdGhfZGlzcGF0Y2hfc2hfY3VycmVudDsKKyAgICBkaXNwYXRjaF9wcml2YXRlX2luZm9fdCAqdGhfZGlzcGF0Y2hfcHJfY3VycmVudDsKKworICAgIGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ICp0aF9kaXNwX2J1ZmZlcjsKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICAgdGhfZGlzcF9pbmRleDsKKyAgICB2b2lkKiBkdW1teV9wYWRkaW5nWzJdOyAvLyBtYWtlIGl0IDY0IGJ5dGVzIG9uIEludGVsKFIpIDY0CisjaWYgS01QX1VTRV9JTlRFUk5PREVfQUxJR05NRU5UCisgICAgY2hhciBtb3JlX3BhZGRpbmdbSU5URVJOT0RFX0NBQ0hFX0xJTkVdOworI2VuZGlmCit9IGttcF9kaXNwX3Q7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIEJhcnJpZXIgc3R1ZmYgKi8KKworLyogY29uc3RhbnRzIGZvciBiYXJyaWVyIHN0YXRlIHVwZGF0ZSAqLworI2RlZmluZSBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFICAwICAgICAgIC8qIHNob3VsZCBwcm9iYWJseSBzdGFydCBmcm9tIHplcm8gKi8KKyNkZWZpbmUgS01QX0JBUlJJRVJfU0xFRVBfQklUICAgMCAgICAgICAvKiBiaXQgdXNlZCBmb3Igc3VzcGVuZC9zbGVlcCBwYXJ0IG9mIHN0YXRlICovCisjZGVmaW5lIEtNUF9CQVJSSUVSX1VOVVNFRF9CSVQgIDEgICAgICAgLyogYml0IHRoYXQgbXVzdCBuZXZlciBiZSBzZXQgZm9yIHZhbGlkIHN0YXRlICovCisjZGVmaW5lIEtNUF9CQVJSSUVSX0JVTVBfQklUICAgIDIgICAgICAgLyogbHNiIHVzZWQgZm9yIGJ1bXAgb2YgZ28vYXJyaXZlZCBzdGF0ZSAqLworCisjZGVmaW5lIEtNUF9CQVJSSUVSX1NMRUVQX1NUQVRFICAgICAgICAgKDEgPDwgS01QX0JBUlJJRVJfU0xFRVBfQklUKQorI2RlZmluZSBLTVBfQkFSUklFUl9VTlVTRURfU1RBVEUgICAgICAgICgxIDw8IEtNUF9CQVJSSUVSX1VOVVNFRF9CSVQpCisjZGVmaW5lIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVAgICAgICAgICAgKDEgPDwgS01QX0JBUlJJRVJfQlVNUF9CSVQpCisKKyNpZiAoS01QX0JBUlJJRVJfU0xFRVBfQklUID49IEtNUF9CQVJSSUVSX0JVTVBfQklUKQorIyBlcnJvciAiQmFycmllciBzbGVlcCBiaXQgbXVzdCBiZSBzbWFsbGVyIHRoYW4gYmFycmllciBidW1wIGJpdCIKKyNlbmRpZgorI2lmIChLTVBfQkFSUklFUl9VTlVTRURfQklUID49IEtNUF9CQVJSSUVSX0JVTVBfQklUKQorIyBlcnJvciAiQmFycmllciB1bnVzZWQgYml0IG11c3QgYmUgc21hbGxlciB0aGFuIGJhcnJpZXIgYnVtcCBiaXQiCisjZW5kaWYKKworLy8gQ29uc3RhbnRzIGZvciByZWxlYXNlIGJhcnJpZXIgd2FpdCBzdGF0ZTogY3VycmVudGx5LCBoaWVyYXJjaGljYWwgb25seQorI2RlZmluZSBLTVBfQkFSUklFUl9OT1RfV0FJVElORyAgICAgICAgMCAgLy8gTm9ybWFsIHN0YXRlOyB3b3JrZXIgbm90IGluIHdhaXRfc2xlZXAKKyNkZWZpbmUgS01QX0JBUlJJRVJfT1dOX0ZMQUcgICAgICAgICAgIDEgIC8vIE5vcm1hbCBzdGF0ZTsgd29ya2VyIHdhaXRpbmcgb24gb3duIGJfZ28gZmxhZyBpbiByZWxlYXNlCisjZGVmaW5lIEtNUF9CQVJSSUVSX1BBUkVOVF9GTEFHICAgICAgICAyICAvLyBTcGVjaWFsIHN0YXRlOyB3b3JrZXIgd2FpdGluZyBvbiBwYXJlbnQncyBiX2dvIGZsYWcgaW4gcmVsZWFzZQorI2RlZmluZSBLTVBfQkFSUklFUl9TV0lUQ0hfVE9fT1dOX0ZMQUcgMyAgLy8gU3BlY2lhbCBzdGF0ZTsgdGVsbHMgd29ya2VyIHRvIHNoaWZ0IGZyb20gcGFyZW50IHRvIG93biBiX2dvCisjZGVmaW5lIEtNUF9CQVJSSUVSX1NXSVRDSElORyAgICAgICAgICA0ICAvLyBTcGVjaWFsIHN0YXRlOyB3b3JrZXIgcmVzZXRzIGFwcHJvcHJpYXRlIGZsYWcgb24gd2FrZS11cAorCitlbnVtIGJhcnJpZXJfdHlwZSB7CisgICAgYnNfcGxhaW5fYmFycmllciA9IDAsICAgICAgIC8qIDAsIEFsbCBub24tZm9yay9qb2luIGJhcnJpZXJzIChleGNlcHQgcmVkdWN0aW9uIGJhcnJpZXJzIGlmIGVuYWJsZWQpICovCisgICAgYnNfZm9ya2pvaW5fYmFycmllciwgICAgICAgIC8qIDEsIEFsbCBmb3JrL2pvaW4gKHBhcmFsbGVsIHJlZ2lvbikgYmFycmllcnMgKi8KKyAgICAjaWYgS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgICAgICAgYnNfcmVkdWN0aW9uX2JhcnJpZXIsICAgLyogMiwgQWxsIGJhcnJpZXJzIHRoYXQgYXJlIHVzZWQgaW4gcmVkdWN0aW9uICovCisgICAgI2VuZGlmIC8vIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgYnNfbGFzdF9iYXJyaWVyICAgICAgICAgICAgIC8qIEp1c3QgYSBwbGFjZWhvbGRlciB0byBtYXJrIHRoZSBlbmQgKi8KK307CisKKy8vIHRvIHdvcmsgd2l0aCByZWR1Y3Rpb24gYmFycmllcnMganVzdCBsaWtlIHdpdGggcGxhaW4gYmFycmllcnMKKyNpZiAhS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgICAjZGVmaW5lIGJzX3JlZHVjdGlvbl9iYXJyaWVyIGJzX3BsYWluX2JhcnJpZXIKKyNlbmRpZiAvLyBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorCit0eXBlZGVmIGVudW0ga21wX2Jhcl9wYXQgeyAgICAgIC8qIEJhcnJpZXIgY29tbXVuaWNhdGlvbiBwYXR0ZXJucyAqLworICAgIGJwX2xpbmVhcl9iYXIgPSAwLCAgICAgICAgICAvKiBTaW5nbGUgbGV2ZWwgKGRlZ2VuZXJhdGUpIHRyZWUgKi8KKyAgICBicF90cmVlX2JhciA9IDEsICAgICAgICAgICAgLyogQmFsYW5jZWQgdHJlZSB3aXRoIGJyYW5jaGluZyBmYWN0b3IgMl5uICovCisgICAgYnBfaHlwZXJfYmFyID0gMiwgICAgICAgICAgIC8qIEh5cGVyY3ViZS1lbWJlZGRlZCB0cmVlIHdpdGggbWluIGJyYW5jaGluZyBmYWN0b3IgMl5uICovCisgICAgYnBfaGllcmFyY2hpY2FsX2JhciA9IDMsICAgIC8qIE1hY2hpbmUgaGllcmFyY2h5IHRyZWUgKi8KKyAgICBicF9sYXN0X2JhciA9IDQgICAgICAgICAgICAgLyogUGxhY2Vob2xkZXIgdG8gbWFyayB0aGUgZW5kICovCit9IGttcF9iYXJfcGF0X2U7CisKKyMgZGVmaW5lIEtNUF9CQVJSSUVSX0lDVl9QVVNIICAgMQorCisvKiBSZWNvcmQgZm9yIGhvbGRpbmcgdGhlIHZhbHVlcyBvZiB0aGUgaW50ZXJuYWwgY29udHJvbHMgc3RhY2sgcmVjb3JkcyAqLwordHlwZWRlZiBzdHJ1Y3Qga21wX2ludGVybmFsX2NvbnRyb2wgeworICAgIGludCAgICAgICAgICAgc2VyaWFsX25lc3RpbmdfbGV2ZWw7ICAvKiBjb3JyZXNwb25kcyB0byB0aGUgdmFsdWUgb2YgdGhlIHRoX3RlYW1fc2VyaWFsaXplZCBmaWVsZCAqLworICAgIGttcF9pbnQ4ICAgICAgbmVzdGVkOyAgICAgICAgICAgICAgICAvKiBpbnRlcm5hbCBjb250cm9sIGZvciBuZXN0ZWQgcGFyYWxsZWxpc20gKHBlciB0aHJlYWQpICovCisgICAga21wX2ludDggICAgICBkeW5hbWljOyAgICAgICAgICAgICAgIC8qIGludGVybmFsIGNvbnRyb2wgZm9yIGR5bmFtaWMgYWRqdXN0bWVudCBvZiB0aHJlYWRzIChwZXIgdGhyZWFkKSAqLworICAgIGttcF9pbnQ4ICAgICAgYnRfc2V0OyAgICAgICAgICAgICAgICAvKiBpbnRlcm5hbCBjb250cm9sIGZvciB3aGV0aGVyIGJsb2NrdGltZSBpcyBleHBsaWNpdGx5IHNldCAqLworICAgIGludCAgICAgICAgICAgYmxvY2t0aW1lOyAgICAgICAgICAgICAvKiBpbnRlcm5hbCBjb250cm9sIGZvciBibG9ja3RpbWUgKi8KKyAgICBpbnQgICAgICAgICAgIGJ0X2ludGVydmFsczsgICAgICAgICAgLyogaW50ZXJuYWwgY29udHJvbCBmb3IgYmxvY2t0aW1lIGludGVydmFscyAqLworICAgIGludCAgICAgICAgICAgbnByb2M7ICAgICAgICAgICAgICAgICAvKiBpbnRlcm5hbCBjb250cm9sIGZvciAjdGhyZWFkcyBmb3IgbmV4dCBwYXJhbGxlbCByZWdpb24gKHBlciB0aHJlYWQpICovCisgICAgaW50ICAgICAgICAgICBtYXhfYWN0aXZlX2xldmVsczsgICAgIC8qIGludGVybmFsIGNvbnRyb2wgZm9yIG1heF9hY3RpdmVfbGV2ZWxzICovCisgICAga21wX3Jfc2NoZWRfdCBzY2hlZDsgICAgICAgICAgICAgICAgIC8qIGludGVybmFsIGNvbnRyb2wgZm9yIHJ1bnRpbWUgc2NoZWR1bGUge3NjaGVkLGNodW5rfSBwYWlyICovCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBrbXBfcHJvY19iaW5kX3QgcHJvY19iaW5kOyAgICAgICAgICAgLyogaW50ZXJuYWwgY29udHJvbCBmb3IgYWZmaW5pdHkgICovCisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKyAgICBzdHJ1Y3Qga21wX2ludGVybmFsX2NvbnRyb2wgKm5leHQ7Cit9IGttcF9pbnRlcm5hbF9jb250cm9sX3Q7CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorY29weV9pY3ZzKCBrbXBfaW50ZXJuYWxfY29udHJvbF90ICpkc3QsIGttcF9pbnRlcm5hbF9jb250cm9sX3QgKnNyYyApIHsKKyAgICAqZHN0ID0gKnNyYzsKK30KKworLyogVGhyZWFkIGJhcnJpZXIgbmVlZHMgdm9sYXRpbGUgYmFycmllciBmaWVsZHMgKi8KK3R5cGVkZWYgc3RydWN0IEtNUF9BTElHTl9DQUNIRSBrbXBfYnN0YXRlIHsKKyAgICAvLyB0aF9maXhlZF9pY3ZzIGlzIGFsaWduZWQgYnkgdmlydHVlIG9mIGttcF9ic3RhdGUgYmVpbmcgYWxpZ25lZCAoYW5kIGFsbCB1c2VzIG9mIGl0KS4KKyAgICAvLyBJdCBpcyBub3QgZXhwbGljaXRseSBhbGlnbmVkIGJlbG93LCBiZWNhdXNlIHdlICpkb24ndCogd2FudCBpdCB0byBiZSBwYWRkZWQgLS0gaW5zdGVhZCwKKyAgICAvLyB3ZSBmaXQgYl9nbyBpbnRvIHRoZSBzYW1lIGNhY2hlIGxpbmUgd2l0aCB0aF9maXhlZF9pY3ZzLCBlbmFibGluZyBOR08gY2FjaGUgbGluZXMKKyAgICAvLyBzdG9yZXMgaW4gdGhlIGhpZXJhcmNoaWNhbCBiYXJyaWVyLgorICAgIGttcF9pbnRlcm5hbF9jb250cm9sX3QgdGhfZml4ZWRfaWN2czsgICAgICAgICAgLy8gSW5pdGlhbCBJQ1ZzIGZvciB0aGUgdGhyZWFkCisgICAgLy8gVHVjayBiX2dvIGludG8gZW5kIG9mIHRoX2ZpeGVkX2ljdnMgY2FjaGUgbGluZSwgc28gaXQgY2FuIGJlIHN0b3JlZCB3aXRoIHNhbWUgTkdPIHN0b3JlCisgICAgdm9sYXRpbGUga21wX3VpbnQ2NCBiX2dvOyAgICAgICAgICAgICAgICAgICAgICAvLyBTVEFURSA9PiB0YXNrIHNob3VsZCBwcm9jZWVkIChoaWVyYXJjaGljYWwpCisgICAgS01QX0FMSUdOX0NBQ0hFIHZvbGF0aWxlIGttcF91aW50NjQgYl9hcnJpdmVkOyAvLyBTVEFURSA9PiB0YXNrIHJlYWNoZWQgc3luY2ggcG9pbnQuCisgICAga21wX3VpbnQzMiAqc2tpcF9wZXJfbGV2ZWw7CisgICAga21wX3VpbnQzMiBteV9sZXZlbDsKKyAgICBrbXBfaW50MzIgcGFyZW50X3RpZDsKKyAgICBrbXBfaW50MzIgb2xkX3RpZDsKKyAgICBrbXBfdWludDMyIGRlcHRoOworICAgIHN0cnVjdCBrbXBfYnN0YXRlICpwYXJlbnRfYmFyOworICAgIGttcF90ZWFtX3QgKnRlYW07CisgICAga21wX3VpbnQ2NCBsZWFmX3N0YXRlOworICAgIGttcF91aW50MzIgbnByb2M7CisgICAga21wX3VpbnQ4IGJhc2VfbGVhZl9raWRzOworICAgIGttcF91aW50OCBsZWFmX2tpZHM7CisgICAga21wX3VpbnQ4IG9mZnNldDsKKyAgICBrbXBfdWludDggd2FpdF9mbGFnOworICAgIGttcF91aW50OCB1c2Vfb25jb3JlX2JhcnJpZXI7CisjaWYgVVNFX0RFQlVHR0VSCisgICAgLy8gVGhlIGZvbGxvd2luZyBmaWVsZCBpcyBpbnRlbmRlZCBmb3IgdGhlIGRlYnVnZ2VyIHNvbGVseS4gT25seSB0aGUgd29ya2VyIHRocmVhZCBpdHNlbGYgYWNjZXNzZXMgdGhpcworICAgIC8vIGZpZWxkOiB0aGUgd29ya2VyIGluY3JlYXNlcyBpdCBieSAxIHdoZW4gaXQgYXJyaXZlcyB0byBhIGJhcnJpZXIuCisgICAgS01QX0FMSUdOX0NBQ0hFIGttcF91aW50IGJfd29ya2VyX2Fycml2ZWQ7CisjZW5kaWYgLyogVVNFX0RFQlVHR0VSICovCit9IGttcF9ic3RhdGVfdDsKKwordW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF9iYXJyaWVyX3VuaW9uIHsKKyAgICBkb3VibGUgICAgICAgYl9hbGlnbjsgICAgICAgIC8qIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudCAqLworICAgIGNoYXIgICAgICAgICBiX3BhZFsgS01QX1BBRChrbXBfYnN0YXRlX3QsIENBQ0hFX0xJTkUpIF07CisgICAga21wX2JzdGF0ZV90IGJiOworfTsKKwordHlwZWRlZiB1bmlvbiBrbXBfYmFycmllcl91bmlvbiBrbXBfYmFsaWduX3Q7CisKKy8qIFRlYW0gYmFycmllciBuZWVkcyBvbmx5IG5vbi12b2xhdGlsZSBhcnJpdmVkIGNvdW50ZXIgKi8KK3VuaW9uIEtNUF9BTElHTl9DQUNIRSBrbXBfYmFycmllcl90ZWFtX3VuaW9uIHsKKyAgICBkb3VibGUgICAgICAgYl9hbGlnbjsgICAgICAgIC8qIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudCAqLworICAgIGNoYXIgICAgICAgICBiX3BhZFsgQ0FDSEVfTElORSBdOworICAgIHN0cnVjdCB7CisgICAgICAgIGttcF91aW50NjQgICBiX2Fycml2ZWQ7ICAgICAgIC8qIFNUQVRFID0+IHRhc2sgcmVhY2hlZCBzeW5jaCBwb2ludC4gKi8KKyNpZiBVU0VfREVCVUdHRVIKKyAgICAgICAgLy8gVGhlIGZvbGxvd2luZyB0d28gZmllbGRzIGFyZSBpbmRlbmRlZCBmb3IgdGhlIGRlYnVnZ2VyIHNvbGVseS4gT25seSBtYXN0ZXIgb2YgdGhlIHRlYW0gYWNjZXNzZXMKKyAgICAgICAgLy8gdGhlc2UgZmllbGRzOiB0aGUgZmlyc3Qgb25lIGlzIGluY3JlYXNlZCBieSAxIHdoZW4gbWFzdGVyIGFycml2ZXMgdG8gYSBiYXJyaWVyLCB0aGUKKyAgICAgICAgLy8gc2Vjb25kIG9uZSBpcyBpbmNyZWFzZWQgYnkgb25lIHdoZW4gYWxsIHRoZSB0aHJlYWRzIGFycml2ZWQuCisgICAgICAgIGttcF91aW50ICAgICBiX21hc3Rlcl9hcnJpdmVkOworICAgICAgICBrbXBfdWludCAgICAgYl90ZWFtX2Fycml2ZWQ7CisjZW5kaWYKKyAgICB9OworfTsKKwordHlwZWRlZiB1bmlvbiBrbXBfYmFycmllcl90ZWFtX3VuaW9uIGttcF9iYWxpZ25fdGVhbV90OworCisvKgorICogUGFkZGluZyBmb3IgTGludXgqIE9TIHB0aHJlYWRzIGNvbmRpdGlvbiB2YXJpYWJsZXMgYW5kIG11dGV4ZXMgdXNlZCB0byBzaWduYWwKKyAqIHRocmVhZHMgd2hlbiBhIGNvbmRpdGlvbiBjaGFuZ2VzLiAgVGhpcyBpcyB0byB3b3JrYXJvdW5kIGFuIE5QVEwgYnVnCisgKiB3aGVyZSBwYWRkaW5nIHdhcyBhZGRlZCB0byBwdGhyZWFkX2NvbmRfdCB3aGljaCBjYXVzZWQgdGhlIGluaXRpYWxpemF0aW9uCisgKiByb3V0aW5lIHRvIHdyaXRlIG91dHNpZGUgb2YgdGhlIHN0cnVjdHVyZSBpZiBjb21waWxlZCBvbiBwcmUtTlBUTCB0aHJlYWRzLgorICovCisKKyNpZiBLTVBfT1NfV0lORE9XUwordHlwZWRlZiBzdHJ1Y3Qga21wX3dpbjMyX211dGV4Cit7CisgICAgLyogVGhlIExvY2sgKi8KKyAgICBDUklUSUNBTF9TRUNUSU9OIGNzOworfSBrbXBfd2luMzJfbXV0ZXhfdDsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX3dpbjMyX2NvbmQKK3sKKyAgICAvKiBDb3VudCBvZiB0aGUgbnVtYmVyIG9mIHdhaXRlcnMuICovCisgICAgaW50IHdhaXRlcnNfY291bnRfOworCisgICAgLyogU2VyaWFsaXplIGFjY2VzcyB0byA8d2FpdGVyc19jb3VudF8+ICovCisgICAga21wX3dpbjMyX211dGV4X3Qgd2FpdGVyc19jb3VudF9sb2NrXzsKKworICAgIC8qIE51bWJlciBvZiB0aHJlYWRzIHRvIHJlbGVhc2UgdmlhIGEgPGNvbmRfYnJvYWRjYXN0PiBvciBhICovCisgICAgLyogPGNvbmRfc2lnbmFsPiAqLworICAgIGludCByZWxlYXNlX2NvdW50XzsKKworICAgIC8qIEtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50ICJnZW5lcmF0aW9uIiBzbyB0aGF0IHdlIGRvbid0IGFsbG93ICovCisgICAgLyogb25lIHRocmVhZCB0byBzdGVhbCBhbGwgdGhlICJyZWxlYXNlcyIgZnJvbSB0aGUgYnJvYWRjYXN0LiAqLworICAgIGludCB3YWl0X2dlbmVyYXRpb25fY291bnRfOworCisgICAgLyogQSBtYW51YWwtcmVzZXQgZXZlbnQgdGhhdCdzIHVzZWQgdG8gYmxvY2sgYW5kIHJlbGVhc2Ugd2FpdGluZyAqLworICAgIC8qIHRocmVhZHMuICovCisgICAgSEFORExFIGV2ZW50XzsKK30ga21wX3dpbjMyX2NvbmRfdDsKKyNlbmRpZgorCisjaWYgS01QX09TX1VOSVgKKwordW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF9jb25kX3VuaW9uIHsKKyAgICBkb3VibGUgICAgICAgICAgICAgIGNfYWxpZ247CisgICAgY2hhciAgICAgICAgICAgICAgICBjX3BhZFsgQ0FDSEVfTElORSBdOworICAgIHB0aHJlYWRfY29uZF90ICAgICAgY19jb25kOworfTsKKwordHlwZWRlZiB1bmlvbiBrbXBfY29uZF91bmlvbiBrbXBfY29uZF9hbGlnbl90OworCit1bmlvbiBLTVBfQUxJR05fQ0FDSEUga21wX211dGV4X3VuaW9uIHsKKyAgICBkb3VibGUgICAgICAgICAgICAgIG1fYWxpZ247CisgICAgY2hhciAgICAgICAgICAgICAgICBtX3BhZFsgQ0FDSEVfTElORSBdOworICAgIHB0aHJlYWRfbXV0ZXhfdCAgICAgbV9tdXRleDsKK307CisKK3R5cGVkZWYgdW5pb24ga21wX211dGV4X3VuaW9uIGttcF9tdXRleF9hbGlnbl90OworCisjZW5kaWYgLyogS01QX09TX1VOSVggKi8KKwordHlwZWRlZiBzdHJ1Y3Qga21wX2Rlc2NfYmFzZSB7CisgICAgdm9pZCAgICAqZHNfc3RhY2tiYXNlOworICAgIHNpemVfdCAgICAgICAgICAgIGRzX3N0YWNrc2l6ZTsKKyAgICBpbnQgICAgICAgICAgICAgICBkc19zdGFja2dyb3c7CisgICAga21wX3RocmVhZF90ICAgICAgZHNfdGhyZWFkOworICAgIHZvbGF0aWxlIGludCAgICAgIGRzX3RpZDsKKyAgICBpbnQgICAgICAgICAgICAgICBkc19ndGlkOworI2lmIEtNUF9PU19XSU5ET1dTCisgICAgdm9sYXRpbGUgaW50ICAgICAgZHNfYWxpdmU7CisgICAgRFdPUkQgICAgICAgICAgICAgZHNfdGhyZWFkX2lkOworICAgICAgICAvKgorICAgICAgICAgICAgZHNfdGhyZWFkIGtlZXBzIHRocmVhZCBoYW5kbGUgb24gV2luZG93cyogT1MuIEl0IGlzIGVub3VnaCBmb3IgUlRMIHB1cnBvc2VzLiBIb3dldmVyLAorICAgICAgICAgICAgZGVidWdnZXIgc3VwcG9ydCAobGlib21wX2RiKSBjYW5ub3Qgd29yayB3aXRoIGhhbmRsZXMsIGJlY2F1c2UgdGhleSB1bmNvbXBhcmFibGUuIEZvcgorICAgICAgICAgICAgZXhhbXBsZSwgZGVidWdnZXIgcmVxdWVzdHMgaW5mbyBhYm91dCB0aHJlYWQgd2l0aCBoYW5kbGUgaC4gaCBpcyB2YWxpZCB3aXRoaW4gZGVidWdnZXIKKyAgICAgICAgICAgIHByb2Nlc3MsIGFuZCBtZWFuaW5nbGVzcyB3aXRoaW4gZGVidWdlZSBwcm9jZXNzLiBFdmVuIGlmIGggaXMgZHVwZWQgYnkgY2FsbCB0bworICAgICAgICAgICAgRHVwbGljYXRlSGFuZGxlKCksIHNvIHRoZSByZXN1bHQgaCcgaXMgdmFsaWQgd2l0aGluIGRlYnVnZWUgcHJvY2VzcywgYnV0IGl0IGlzIGEgKm5ldyoKKyAgICAgICAgICAgIGhhbmRsZSB3aGljaCBkb2VzICpub3QqIGVxdWFsIHRvIGFueSBvdGhlciBoYW5kbGUgaW4gZGVidWdlZS4uLiBUaGUgb25seSB3YXkgdG8KKyAgICAgICAgICAgIGNvbXBhcmUgaGFuZGxlcyBpcyBjb252ZXJ0IHRoZW0gdG8gc3lzdGVtLXdpZGUgaWRzLiBHZXRUaHJlYWRJZCgpIGZ1bmN0aW9uIGlzCisgICAgICAgICAgICBhdmFpbGFibGUgb25seSBpbiBMb25naG9ybiBhbmQgU2VydmVyIDIwMDMuIDotKCBJbiBjb250cmFzdCwgR2V0Q3VycmVudFRocmVhZElkKCkgaXMKKyAgICAgICAgICAgIGF2YWlsYWJsZSBvbiBhbGwgV2luZG93cyogT1MgZmxhdm91cnMgKGluY2x1ZGluZyBXaW5kb3dzKiA5NSkuIFRodXMsIHdlIGhhdmUgdG8gZ2V0IHRocmVhZCBpZCBieQorICAgICAgICAgICAgY2FsbCB0byBHZXRDdXJyZW50VGhyZWFkSWQoKSBmcm9tIHdpdGhpbiB0aGUgdGhyZWFkIGFuZCBzYXZlIGl0IHRvIGxldCBsaWJvbXBfZGIKKyAgICAgICAgICAgIGlkZW50aWZ5IHRocmVhZHMuCisgICAgICAgICovCisjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KK30ga21wX2Rlc2NfYmFzZV90OworCit0eXBlZGVmIHVuaW9uIEtNUF9BTElHTl9DQUNIRSBrbXBfZGVzYyB7CisgICAgZG91YmxlICAgICAgICAgICBkc19hbGlnbjsgICAgICAgIC8qIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudCAqLworICAgIGNoYXIgICAgICAgICAgICAgZHNfcGFkWyBLTVBfUEFEKGttcF9kZXNjX2Jhc2VfdCwgQ0FDSEVfTElORSkgXTsKKyAgICBrbXBfZGVzY19iYXNlX3QgIGRzOworfSBrbXBfZGVzY190OworCisKK3R5cGVkZWYgc3RydWN0IGttcF9sb2NhbCB7CisgICAgdm9sYXRpbGUgaW50ICAgICAgICAgICB0aGlzX2NvbnN0cnVjdDsgLyogY291bnQgb2Ygc2luZ2xlJ3MgZW5jb3VudGVyZWQgYnkgdGhyZWFkICovCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICpyZWR1Y2VfZGF0YTsKKyNpZiBLTVBfVVNFX0JHRVQKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgKmJnZXRfZGF0YTsKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgKmJnZXRfbGlzdDsKKyNpZiAhIFVTRV9DTVBfWENIR19GT1JfQkdFVAorI2lmZGVmIFVTRV9RVUVVSU5HX0xPQ0tfRk9SX0JHRVQKKyAgICBrbXBfbG9ja190ICAgICAgICAgICAgIGJnZXRfbG9jazsgICAgICAvKiBMb2NrIGZvciBhY2Nlc3NpbmcgYmdldCBmcmVlIGxpc3QgKi8KKyNlbHNlCisgICAga21wX2Jvb3RzdHJhcF9sb2NrX3QgICBiZ2V0X2xvY2s7ICAgICAgLyogTG9jayBmb3IgYWNjZXNzaW5nIGJnZXQgZnJlZSBsaXN0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTXVzdCBiZSBib290c3RyYXAgbG9jayBzbyB3ZSBjYW4gdXNlIGl0IGF0IGxpYnJhcnkgc2h1dGRvd24gKi8KKyNlbmRpZiAvKiBVU0VfTE9DS19GT1JfQkdFVCAqLworI2VuZGlmIC8qICEgVVNFX0NNUF9YQ0hHX0ZPUl9CR0VUICovCisjZW5kaWYgLyogS01QX1VTRV9CR0VUICovCisKKyNpZmRlZiBCVUlMRF9UVgorICAgIHN0cnVjdCB0dl9kYXRhICAgICAgICAqdHZfZGF0YTsKKyNlbmRpZgorCisgICAgUEFDS0VEX1JFRFVDVElPTl9NRVRIT0RfVCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZDsgLyogc3RvcmVkIGJ5IF9fa21wY19yZWR1Y2UqKCksIHVzZWQgYnkgX19rbXBjX2VuZF9yZWR1Y2UqKCkgKi8KKworfSBrbXBfbG9jYWxfdDsKKworI2RlZmluZSBnZXRfX2Jsb2NrdGltZSggeHRlYW0sIHh0aWQgKSAgICAgKCh4dGVhbSktPnQudF90aHJlYWRzWyh4dGlkKV0tPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5ibG9ja3RpbWUpCisjZGVmaW5lIGdldF9fYnRfc2V0KCB4dGVhbSwgeHRpZCApICAgICAgICAoKHh0ZWFtKS0+dC50X3RocmVhZHNbKHh0aWQpXS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLmJ0X3NldCkKKyNkZWZpbmUgZ2V0X19idF9pbnRlcnZhbHMoIHh0ZWFtLCB4dGlkICkgICgoeHRlYW0pLT50LnRfdGhyZWFkc1soeHRpZCldLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMuYnRfaW50ZXJ2YWxzKQorCisjZGVmaW5lIGdldF9fbmVzdGVkXzIoeHRlYW0seHRpZCkgICAgICAgICAoKHh0ZWFtKS0+dC50X3RocmVhZHNbKHh0aWQpXS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLm5lc3RlZCkKKyNkZWZpbmUgZ2V0X19keW5hbWljXzIoeHRlYW0seHRpZCkgICAgICAgICgoeHRlYW0pLT50LnRfdGhyZWFkc1soeHRpZCldLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMuZHluYW1pYykKKyNkZWZpbmUgZ2V0X19ucHJvY18yKHh0ZWFtLHh0aWQpICAgICAgICAgICgoeHRlYW0pLT50LnRfdGhyZWFkc1soeHRpZCldLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMubnByb2MpCisjZGVmaW5lIGdldF9fc2NoZWRfMih4dGVhbSx4dGlkKSAgICAgICAgICAoKHh0ZWFtKS0+dC50X3RocmVhZHNbKHh0aWQpXS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLnNjaGVkKQorCisjZGVmaW5lIHNldF9fYmxvY2t0aW1lX3RlYW0oIHh0ZWFtLCB4dGlkLCB4dmFsICkgXAorICAgICAgICAoICggKHh0ZWFtKS0+dC50X3RocmVhZHNbKHh0aWQpXS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLmJsb2NrdGltZSApICAgID0gKHh2YWwpICkKKworI2RlZmluZSBzZXRfX2J0X2ludGVydmFsc190ZWFtKCB4dGVhbSwgeHRpZCwgeHZhbCApIFwKKyAgICAgICAgKCAoICh4dGVhbSktPnQudF90aHJlYWRzWyh4dGlkKV0tPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5idF9pbnRlcnZhbHMgKSA9ICh4dmFsKSApCisKKyNkZWZpbmUgc2V0X19idF9zZXRfdGVhbSggeHRlYW0sIHh0aWQsIHh2YWwgKSBcCisgICAgICAgICggKCAoeHRlYW0pLT50LnRfdGhyZWFkc1soeHRpZCldLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMuYnRfc2V0ICkgICAgICAgPSAoeHZhbCkgKQorCisKKyNkZWZpbmUgc2V0X19uZXN0ZWQoIHh0aHJlYWQsIHh2YWwgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICggKCAoeHRocmVhZCktPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5uZXN0ZWQgKSA9ICh4dmFsKSApCisjZGVmaW5lIGdldF9fbmVzdGVkKCB4dGhyZWFkICkgXAorICAgICAgICAoICggKHh0aHJlYWQpLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMubmVzdGVkICkgPyAoRlROX1RSVUUpIDogKEZUTl9GQUxTRSkgKQorCisjZGVmaW5lIHNldF9fZHluYW1pYyggeHRocmVhZCwgeHZhbCApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCAoICh4dGhyZWFkKS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLmR5bmFtaWMgKSA9ICh4dmFsKSApCisjZGVmaW5lIGdldF9fZHluYW1pYyggeHRocmVhZCApIFwKKyAgICAgICAgKCAoICh4dGhyZWFkKS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLmR5bmFtaWMgKSA/IChGVE5fVFJVRSkgOiAoRlROX0ZBTFNFKSApCisKKyNkZWZpbmUgc2V0X19ucHJvYyggeHRocmVhZCwgeHZhbCApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCAoICh4dGhyZWFkKS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLm5wcm9jICkgPSAoeHZhbCkgKQorCisjZGVmaW5lIHNldF9fbWF4X2FjdGl2ZV9sZXZlbHMoIHh0aHJlYWQsIHh2YWwgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICggKCAoeHRocmVhZCktPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5tYXhfYWN0aXZlX2xldmVscyApID0gKHh2YWwpICkKKworI2RlZmluZSBzZXRfX3NjaGVkKCB4dGhyZWFkLCB4dmFsICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoICggKHh0aHJlYWQpLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMuc2NoZWQgKSA9ICh4dmFsKSApCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorCisjZGVmaW5lIHNldF9fcHJvY19iaW5kKCB4dGhyZWFkLCB4dmFsICkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCAoICh4dGhyZWFkKS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLnByb2NfYmluZCApID0gKHh2YWwpICkKKyNkZWZpbmUgZ2V0X19wcm9jX2JpbmQoIHh0aHJlYWQgKSBcCisgICAgICAgICggKHh0aHJlYWQpLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMucHJvY19iaW5kICkKKworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvLyBPcGVuTVAgdGFza2luZyBkYXRhIHN0cnVjdHVyZXMKKy8vCisKK3R5cGVkZWYgZW51bSBrbXBfdGFza2luZ19tb2RlIHsKKyAgICB0c2ttX2ltbWVkaWF0ZV9leGVjID0gMCwKKyAgICB0c2ttX2V4dHJhX2JhcnJpZXIgPSAxLAorICAgIHRza21fdGFza190ZWFtcyA9IDIsCisgICAgdHNrbV9tYXggPSAyCit9IGttcF90YXNraW5nX21vZGVfdDsKKworZXh0ZXJuIGttcF90YXNraW5nX21vZGVfdCBfX2ttcF90YXNraW5nX21vZGU7ICAgICAgICAgLyogZGV0ZXJtaW5lcyBob3cvd2hlbiB0byBleGVjdXRlIHRhc2tzICovCitleHRlcm4ga21wX2ludDMyIF9fa21wX3Rhc2tfc3RlYWxpbmdfY29uc3RyYWludDsKKworLyogTk9URToga21wX3Rhc2tkYXRhX3QgYW5kIGttcF90YXNrX3Qgc3RydWN0dXJlcyBhbGxvY2F0ZWQgaW4gc2luZ2xlIGJsb2NrIHdpdGggdGFza2RhdGEgZmlyc3QgKi8KKyNkZWZpbmUgS01QX1RBU0tfVE9fVEFTS0RBVEEodGFzaykgICAgICgoKGttcF90YXNrZGF0YV90ICopIHRhc2spIC0gMSkKKyNkZWZpbmUgS01QX1RBU0tEQVRBX1RPX1RBU0sodGFza2RhdGEpIChrbXBfdGFza190ICopICh0YXNrZGF0YSArIDEpCisKKy8vIFRoZSB0dF9mb3VuZF90YXNrcyBmbGFnIGlzIGEgc2lnbmFsIHRvIGFsbCB0aHJlYWRzIGluIHRoZSB0ZWFtIHRoYXQgdGFza3Mgd2VyZSBzcGF3bmVkIGFuZAorLy8gcXVldWVkIHNpbmNlIHRoZSBwcmV2aW91cyBiYXJyaWVyIHJlbGVhc2UuCisjZGVmaW5lIEtNUF9UQVNLSU5HX0VOQUJMRUQodGFza190ZWFtKSBcCisgICAgKFRDUl9TWU5DXzQoKHRhc2tfdGVhbSktPnR0LnR0X2ZvdW5kX3Rhc2tzKSA9PSBUUlVFKQorLyohCitAaW5ncm91cCBCQVNJQ19UWVBFUworQHsKKyovCisKKy8qIQorICovCit0eXBlZGVmIGttcF9pbnQzMiAoKiBrbXBfcm91dGluZV9lbnRyeV90KSgga21wX2ludDMyLCB2b2lkICogKTsKKworLyogIHNpemVvZl9rbXBfdGFza190IHBhc3NlZCBhcyBhcmcgdG8ga21wY19vbXBfdGFzayBjYWxsICAqLworLyohCisgKi8KK3R5cGVkZWYgc3RydWN0IGttcF90YXNrIHsgICAgICAgICAgICAgICAgICAgLyogR0VIOiBTaG91bGRuJ3QgdGhpcyBiZSBhbGlnbmVkIHNvbWVob3c/ICovCisgICAgdm9pZCAqICAgICAgICAgICAgICBzaGFyZWRzOyAgICAgICAgICAgIC8qKjwgcG9pbnRlciB0byBibG9jayBvZiBwb2ludGVycyB0byBzaGFyZWQgdmFycyAgICovCisgICAga21wX3JvdXRpbmVfZW50cnlfdCByb3V0aW5lOyAgICAgICAgICAgIC8qKjwgcG9pbnRlciB0byByb3V0aW5lIHRvIGNhbGwgZm9yIGV4ZWN1dGluZyB0YXNrICovCisgICAga21wX2ludDMyICAgICAgICAgICBwYXJ0X2lkOyAgICAgICAgICAgIC8qKjwgcGFydCBpZCBmb3IgdGhlIHRhc2sgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBrbXBfcm91dGluZV9lbnRyeV90IGRlc3RydWN0b3JzOyAgICAgICAgLyogcG9pbnRlciB0byBmdW5jdGlvbiB0byBpbnZva2UgZGVjb25zdHJ1Y3RvcnMgb2YgZmlyc3Rwcml2YXRlIEMrKyBvYmplY3RzICovCisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKyAgICAvKiAgcHJpdmF0ZSB2YXJzICAqLworfSBrbXBfdGFza190OworCisvKiEKK0B9CisqLworCisjaWYgT01QXzQwX0VOQUJMRUQKK3R5cGVkZWYgc3RydWN0IGttcF90YXNrZ3JvdXAgeworICAgIGttcF91aW50MzIgICAgICAgICAgICBjb3VudDsgICAvLyBudW1iZXIgb2YgYWxsb2NhdGVkIGFuZCBub3QgeWV0IGNvbXBsZXRlIHRhc2tzCisgICAga21wX2ludDMyICAgICAgICAgICAgIGNhbmNlbF9yZXF1ZXN0OyAvLyByZXF1ZXN0IGZvciBjYW5jZWxsYXRpb24gb2YgdGhpcyB0YXNrZ3JvdXAKKyAgICBzdHJ1Y3Qga21wX3Rhc2tncm91cCAqcGFyZW50OyAgLy8gcGFyZW50IHRhc2tncm91cAorfSBrbXBfdGFza2dyb3VwX3Q7CisKKworLy8gZm9yd2FyZCBkZWNsYXJhdGlvbnMKK3R5cGVkZWYgdW5pb24ga21wX2RlcG5vZGUgICAgICAga21wX2RlcG5vZGVfdDsKK3R5cGVkZWYgc3RydWN0IGttcF9kZXBub2RlX2xpc3QgIGttcF9kZXBub2RlX2xpc3RfdDsKK3R5cGVkZWYgc3RydWN0IGttcF9kZXBoYXNoX2VudHJ5IGttcF9kZXBoYXNoX2VudHJ5X3Q7CisKK3R5cGVkZWYgc3RydWN0IGttcF9kZXBlbmRfaW5mbyB7CisgICAgIGttcF9pbnRwdHJfdCAgICAgICAgICAgICAgIGJhc2VfYWRkcjsKKyAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgbGVuOworICAgICBzdHJ1Y3QgeworICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICBpbjoxOworICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICBvdXQ6MTsKKyAgICAgfSBmbGFnczsKK30ga21wX2RlcGVuZF9pbmZvX3Q7CisKK3N0cnVjdCBrbXBfZGVwbm9kZV9saXN0IHsKKyAgIGttcF9kZXBub2RlX3QgKiAgICAgICAgICAgICAgbm9kZTsKKyAgIGttcF9kZXBub2RlX2xpc3RfdCAqICAgICAgICAgbmV4dDsKK307CisKK3R5cGVkZWYgc3RydWN0IGttcF9iYXNlX2RlcG5vZGUgeworICAgIGttcF9kZXBub2RlX2xpc3RfdCAgICAgICAgKiBzdWNjZXNzb3JzOworICAgIGttcF90YXNrX3QgICAgICAgICAgICAgICAgKiB0YXNrOworCisgICAga21wX2xvY2tfdCAgICAgICAgICAgICAgICAgIGxvY2s7CisKKyNpZiBLTVBfU1VQUE9SVF9HUkFQSF9PVVRQVVQKKyAgICBrbXBfdWludDMyICAgICAgICAgICAgICAgICAgaWQ7CisjZW5kaWYKKworICAgIHZvbGF0aWxlIGttcF9pbnQzMiAgICAgICAgICBucHJlZGVjZXNzb3JzOworICAgIHZvbGF0aWxlIGttcF9pbnQzMiAgICAgICAgICBucmVmczsKK30ga21wX2Jhc2VfZGVwbm9kZV90OworCit1bmlvbiBLTVBfQUxJR05fQ0FDSEUga21wX2RlcG5vZGUgeworICAgIGRvdWJsZSAgICAgICAgICBkbl9hbGlnbjsgICAgICAgIC8qIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudCAqLworICAgIGNoYXIgICAgICAgICAgICBkbl9wYWRbIEtNUF9QQUQoa21wX2Jhc2VfZGVwbm9kZV90LCBDQUNIRV9MSU5FKSBdOworICAgIGttcF9iYXNlX2RlcG5vZGVfdCBkbjsKK307CisKK3N0cnVjdCBrbXBfZGVwaGFzaF9lbnRyeSB7CisgICAga21wX2ludHB0cl90ICAgICAgICAgICAgICAgYWRkcjsKKyAgICBrbXBfZGVwbm9kZV90ICAgICAgICAgICAgKiBsYXN0X291dDsKKyAgICBrbXBfZGVwbm9kZV9saXN0X3QgICAgICAgKiBsYXN0X2luczsKKyAgICBrbXBfZGVwaGFzaF9lbnRyeV90ICAgICAgKiBuZXh0X2luX2J1Y2tldDsKK307CisKK3R5cGVkZWYgc3RydWN0IGttcF9kZXBoYXNoIHsKKyAgIGttcF9kZXBoYXNoX2VudHJ5X3QgICAgICoqIGJ1Y2tldHM7CisjaWZkZWYgS01QX0RFQlVHCisgICBrbXBfdWludDMyICAgICAgICAgICAgICAgICBuZWxlbWVudHM7CisgICBrbXBfdWludDMyICAgICAgICAgICAgICAgICBuY29uZmxpY3RzOworI2VuZGlmCit9IGttcF9kZXBoYXNoX3Q7CisKKyNlbmRpZgorCisjaWZkZWYgQlVJTERfVElFRF9UQVNLX1NUQUNLCisKKy8qIFRpZWQgVGFzayBzdGFjayBkZWZpbml0aW9ucyAqLwordHlwZWRlZiBzdHJ1Y3Qga21wX3N0YWNrX2Jsb2NrIHsKKyAgICBrbXBfdGFza2RhdGFfdCAqICAgICAgICAgIHNiX2Jsb2NrWyBUQVNLX1NUQUNLX0JMT0NLX1NJWkUgXTsKKyAgICBzdHJ1Y3Qga21wX3N0YWNrX2Jsb2NrICogIHNiX25leHQ7CisgICAgc3RydWN0IGttcF9zdGFja19ibG9jayAqICBzYl9wcmV2OworfSBrbXBfc3RhY2tfYmxvY2tfdDsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX3Rhc2tfc3RhY2sgeworICAgIGttcF9zdGFja19ibG9ja190ICAgICAgICAgdHNfZmlyc3RfYmxvY2s7ICAvLyBmaXJzdCBibG9jayBvZiBzdGFjayBlbnRyaWVzCisgICAga21wX3Rhc2tkYXRhX3QgKiogICAgICAgICB0c190b3A7ICAgICAgICAgIC8vIHBvaW50ZXIgdG8gdGhlIHRvcCBvZiBzdGFjaworICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgICAgdHNfZW50cmllczsgICAgICAvLyBudW1iZXIgb2YgZW50cmllcyBvbiB0aGUgc3RhY2sKK30ga21wX3Rhc2tfc3RhY2tfdDsKKworI2VuZGlmIC8vIEJVSUxEX1RJRURfVEFTS19TVEFDSworCit0eXBlZGVmIHN0cnVjdCBrbXBfdGFza2luZ19mbGFncyB7ICAgICAgICAgIC8qIFRvdGFsIHN0cnVjdCBtdXN0IGJlIGV4YWN0bHkgMzIgYml0cyAqLworICAgIC8qIENvbXBpbGVyIGZsYWdzICovICAgICAgICAgICAgICAgICAgICAvKiBUb3RhbCBjb21waWxlciBmbGFncyBtdXN0IGJlIDE2IGJpdHMgKi8KKyAgICB1bnNpZ25lZCB0aWVkbmVzcyAgICA6IDE7ICAgICAgICAgICAgICAgLyogdGFzayBpcyBlaXRoZXIgdGllZCAoMSkgb3IgdW50aWVkICgwKSAqLworICAgIHVuc2lnbmVkIGZpbmFsICAgICAgIDogMTsgICAgICAgICAgICAgICAvKiB0YXNrIGlzIGZpbmFsKDEpIHNvIGV4ZWN1dGUgaW1tZWRpYXRlbHkgKi8KKyAgICB1bnNpZ25lZCBtZXJnZWRfaWYwICA6IDE7ICAgICAgICAgICAgICAgLyogbm8gX19rbXBjX3Rhc2tfe2JlZ2luL2NvbXBsZXRlfV9pZjAgY2FsbHMgaW4gaWYwIGNvZGUgcGF0aCAqLworI2lmIE9NUF80MF9FTkFCTEVECisgICAgdW5zaWduZWQgZGVzdHJ1Y3RvcnNfdGh1bmsgOiAxOyAgICAgICAgIC8qIHNldCBpZiB0aGUgY29tcGlsZXIgY3JlYXRlcyBhIHRodW5rIHRvIGludm9rZSBkZXN0cnVjdG9ycyBmcm9tIHRoZSBydW50aW1lICovCisjaWYgT01QXzQxX0VOQUJMRUQKKyAgICB1bnNpZ25lZCBwcm94eSAgICAgICA6IDE7ICAgICAgICAgICAgICAgLyogdGFzayBpcyBhIHByb3h5IHRhc2sgKGl0IHdpbGwgYmUgZXhlY3V0ZWQgb3V0c2lkZSB0aGUgY29udGV4dCBvZiB0aGUgUlRMKSAqLworICAgIHVuc2lnbmVkIHJlc2VydmVkICAgIDogMTE7ICAgICAgICAgICAgICAvKiByZXNlcnZlZCBmb3IgY29tcGlsZXIgdXNlICovCisjZWxzZQorICAgIHVuc2lnbmVkIHJlc2VydmVkICAgIDogMTI7ICAgICAgICAgICAgICAvKiByZXNlcnZlZCBmb3IgY29tcGlsZXIgdXNlICovCisjZW5kaWYKKyNlbHNlIC8vIE9NUF80MF9FTkFCTEVECisgICAgdW5zaWduZWQgcmVzZXJ2ZWQgICAgOiAxMzsgICAgICAgICAgICAgIC8qIHJlc2VydmVkIGZvciBjb21waWxlciB1c2UgKi8KKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorCisgICAgLyogTGlicmFyeSBmbGFncyAqLyAgICAgICAgICAgICAgICAgICAgIC8qIFRvdGFsIGxpYnJhcnkgZmxhZ3MgbXVzdCBiZSAxNiBiaXRzICovCisgICAgdW5zaWduZWQgdGFza3R5cGUgICAgOiAxOyAgICAgICAgICAgICAgIC8qIHRhc2sgaXMgZWl0aGVyIGV4cGxpY2l0KDEpIG9yIGltcGxpY2l0ICgwKSAqLworICAgIHVuc2lnbmVkIHRhc2tfc2VyaWFsIDogMTsgICAgICAgICAgICAgICAvKiB0aGlzIHRhc2sgaXMgZXhlY3V0ZWQgaW1tZWRpYXRlbHkgKDEpIG9yIGRlZmVycmVkICgwKSAqLworICAgIHVuc2lnbmVkIHRhc2tpbmdfc2VyIDogMTsgICAgICAgICAgICAgICAvKiBhbGwgdGFza3MgaW4gdGVhbSBhcmUgZWl0aGVyIGV4ZWN1dGVkIGltbWVkaWF0ZWx5ICgxKSBvciBtYXkgYmUgZGVmZXJyZWQgKDApICovCisgICAgdW5zaWduZWQgdGVhbV9zZXJpYWwgOiAxOyAgICAgICAgICAgICAgIC8qIGVudGlyZSB0ZWFtIGlzIHNlcmlhbCAoMSkgWzEgdGhyZWFkXSBvciBwYXJhbGxlbCAoMCkgWz49IDIgdGhyZWFkc10gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgZWl0aGVyIHRlYW1fc2VyaWFsIG9yIHRhc2tpbmdfc2VyIGlzIHNldCwgdGFzayB0ZWFtIG1heSBiZSBOVUxMICovCisgICAgLyogVGFzayBTdGF0ZSBGbGFnczogKi8KKyAgICB1bnNpZ25lZCBzdGFydGVkICAgICA6IDE7ICAgICAgICAgICAgICAgLyogMT09c3RhcnRlZCwgMD09bm90IHN0YXJ0ZWQgICAgICovCisgICAgdW5zaWduZWQgZXhlY3V0aW5nICAgOiAxOyAgICAgICAgICAgICAgIC8qIDE9PWV4ZWN1dGluZywgMD09bm90IGV4ZWN1dGluZyAqLworICAgIHVuc2lnbmVkIGNvbXBsZXRlICAgIDogMTsgICAgICAgICAgICAgICAvKiAxPT1jb21wbGV0ZSwgMD09bm90IGNvbXBsZXRlICAgKi8KKyAgICB1bnNpZ25lZCBmcmVlZCAgICAgICA6IDE7ICAgICAgICAgICAgICAgLyogMT09ZnJlZWQsIDA9PWFsbG9jYXRlZWQgICAgICAgICovCisgICAgdW5zaWduZWQgbmF0aXZlICAgICAgOiAxOyAgICAgICAgICAgICAgIC8qIDE9PWdjYy1jb21waWxlZCB0YXNrLCAwPT1pbnRlbCAqLworICAgIHVuc2lnbmVkIHJlc2VydmVkMzEgIDogNzsgICAgICAgICAgICAgICAvKiByZXNlcnZlZCBmb3IgbGlicmFyeSB1c2UgKi8KKworfSBrbXBfdGFza2luZ19mbGFnc190OworCisKK3N0cnVjdCBrbXBfdGFza2RhdGEgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFsaWduZWQgZHVyaW5nIGR5bmFtaWMgYWxsb2NhdGlvbiAgICAgICAqLworICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgIHRkX3Rhc2tfaWQ7ICAgICAgICAgICAgICAgLyogaWQsIGFzc2lnbmVkIGJ5IGRlYnVnZ2VyICAgICAgICAgICAgICAgICovCisgICAga21wX3Rhc2tpbmdfZmxhZ3NfdCAgICAgdGRfZmxhZ3M7ICAgICAgICAgICAgICAgICAvKiB0YXNrIGZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBrbXBfdGVhbV90ICogICAgICAgICAgICB0ZF90ZWFtOyAgICAgICAgICAgICAgICAgIC8qIHRlYW0gZm9yIHRoaXMgdGFzayAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGttcF9pbmZvX3AgKiAgICAgICAgICAgIHRkX2FsbG9jX3RocmVhZDsgICAgICAgICAgLyogdGhyZWFkIHRoYXQgYWxsb2NhdGVkIGRhdGEgc3RydWN0dXJlcyAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50bHkgbm90IHVzZWQgZXhjZXB0IGZvciBwZXJoYXBzIElEQiAqLworICAgIGttcF90YXNrZGF0YV90ICogICAgICAgIHRkX3BhcmVudDsgICAgICAgICAgICAgICAgLyogcGFyZW50IHRhc2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgdGRfbGV2ZWw7ICAgICAgICAgICAgICAgICAvKiB0YXNrIG5lc3RpbmcgbGV2ZWwgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZGVudF90ICogICAgICAgICAgICAgICB0ZF9pZGVudDsgICAgICAgICAgICAgICAgIC8qIHRhc2sgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRhc2t3YWl0IGRhdGEuCisgICAgaWRlbnRfdCAqICAgICAgICAgICAgICAgdGRfdGFza3dhaXRfaWRlbnQ7CisgICAga21wX3VpbnQzMiAgICAgICAgICAgICAgdGRfdGFza3dhaXRfY291bnRlcjsKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICB0ZF90YXNrd2FpdF90aHJlYWQ7ICAgICAgIC8qIGd0aWQgKyAxIG9mIHRocmVhZCBlbmNvdW50ZXJlZCB0YXNrd2FpdCAqLworICAgIEtNUF9BTElHTl9DQUNIRSBrbXBfaW50ZXJuYWxfY29udHJvbF90ICB0ZF9pY3ZzOyAgLyogSW50ZXJuYWwgY29udHJvbCB2YXJpYWJsZXMgZm9yIHRoZSB0YXNrICovCisgICAgdm9sYXRpbGUga21wX3VpbnQzMiAgICAgdGRfYWxsb2NhdGVkX2NoaWxkX3Rhc2tzOyAgLyogQ2hpbGQgdGFza3MgKCsgY3VycmVudCB0YXNrKSBub3QgeWV0IGRlYWxsb2NhdGVkICovCisgICAgdm9sYXRpbGUga21wX3VpbnQzMiAgICAgdGRfaW5jb21wbGV0ZV9jaGlsZF90YXNrczsgLyogQ2hpbGQgdGFza3Mgbm90IHlldCBjb21wbGV0ZSAqLworI2lmIE9NUF80MF9FTkFCTEVECisgICAga21wX3Rhc2tncm91cF90ICogICAgICAgdGRfdGFza2dyb3VwOyAgICAgICAgIC8vIEVhY2ggdGFzayBrZWVwcyBwb2ludGVyIHRvIGl0cyBjdXJyZW50IHRhc2tncm91cAorICAgIGttcF9kZXBoYXNoX3QgKiAgICAgICAgIHRkX2RlcGhhc2g7ICAgICAgICAgICAvLyBEZXBlbmRlbmNpZXMgZm9yIGNoaWxkcmVuIHRhc2tzIGFyZSB0cmFja2VkIGZyb20gaGVyZQorICAgIGttcF9kZXBub2RlX3QgKiAgICAgICAgIHRkX2RlcG5vZGU7ICAgICAgICAgICAvLyBQb2ludGVyIHRvIGdyYXBoIG5vZGUgaWYgdGhpcyB0YXNrIGhhcyBkZXBlbmRlbmNpZXMKKyNlbmRpZgorI2lmIE9NUFRfU1VQUE9SVAorICAgIG9tcHRfdGFza19pbmZvX3QgICAgICAgIG9tcHRfdGFza19pbmZvOworI2VuZGlmCisjaWYgS01QX0hBVkVfUVVBRAorICAgIF9RdWFkICAgICAgICAgICAgICAgICAgIHRkX2R1bW15OyAgICAgICAgICAgICAvLyBBbGlnbiBzdHJ1Y3R1cmUgMTYtYnl0ZSBzaXplIHNpbmNlIGFsbG9jYXRlZCBqdXN0IGJlZm9yZSBrbXBfdGFza190CisjZWxzZQorICAgIGttcF91aW50MzIgICAgICAgICAgICAgIHRkX2R1bW15WzJdOworI2VuZGlmCit9OyAvLyBzdHJ1Y3Qga21wX3Rhc2tkYXRhCisKKy8vIE1ha2Ugc3VyZSBwYWRkaW5nIGFib3ZlIHdvcmtlZAorS01QX0JVSUxEX0FTU0VSVCggc2l6ZW9mKGttcF90YXNrZGF0YV90KSAlIHNpemVvZih2b2lkICopID09IDAgKTsKKworLy8gRGF0YSBmb3IgdGFzayB0ZWFtIGJ1dCBwZXIgdGhyZWFkCit0eXBlZGVmIHN0cnVjdCBrbXBfYmFzZV90aHJlYWRfZGF0YSB7CisgICAga21wX2luZm9fcCAqICAgICAgICAgICAgdGRfdGhyOyAgICAgICAgICAgICAgICAvLyBQb2ludGVyIGJhY2sgdG8gdGhyZWFkIGluZm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZWQgb25seSBpbiBfX2ttcF9leGVjdXRlX3Rhc2tzX3RlbXBsYXRlLCBtYXliZSBub3QgYXZhaWwgdW50aWwgdGFzayBpcyBxdWV1ZWQ/CisgICAga21wX2Jvb3RzdHJhcF9sb2NrX3QgICAgdGRfZGVxdWVfbG9jazsgICAgICAgICAvLyBMb2NrIGZvciBhY2Nlc3NpbmcgZGVxdWUKKyAgICBrbXBfdGFza2RhdGFfdCAqKiAgICAgICB0ZF9kZXF1ZTsgICAgICAgICAgICAgIC8vIERlcXVlIG9mIHRhc2tzIGVuY291bnRlcmVkIGJ5IHRkX3RociwgZHluYW1pY2FsbHkgYWxsb2NhdGVkCisgICAga21wX3VpbnQzMiAgICAgICAgICAgICAgdGRfZGVxdWVfaGVhZDsgICAgICAgICAvLyBIZWFkIG9mIGRlcXVlICh3aWxsIHdyYXApCisgICAga21wX3VpbnQzMiAgICAgICAgICAgICAgdGRfZGVxdWVfdGFpbDsgICAgICAgICAvLyBUYWlsIG9mIGRlcXVlICh3aWxsIHdyYXApCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgdGRfZGVxdWVfbnRhc2tzOyAgICAgICAvLyBOdW1iZXIgb2YgdGFza3MgaW4gZGVxdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdFSDogc2hvdWxkbid0IHRoaXMgYmUgdm9sYXRpbGUgc2luY2UgdXNlZCBpbiB3aGlsZS1zcGluPworICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgIHRkX2RlcXVlX2xhc3Rfc3RvbGVuOyAgLy8gVGhyZWFkIG51bWJlciBvZiBsYXN0IHN1Y2Nlc3NmdWwgc3RlYWwKKyNpZmRlZiBCVUlMRF9USUVEX1RBU0tfU1RBQ0sKKyAgICBrbXBfdGFza19zdGFja190ICAgICAgICB0ZF9zdXNwX3RpZWRfdGFza3M7ICAgIC8vIFN0YWNrIG9mIHN1c3BlbmRlZCB0aWVkIHRhc2tzIGZvciB0YXNrIHNjaGVkdWxpbmcgY29uc3RyYWludAorI2VuZGlmIC8vIEJVSUxEX1RJRURfVEFTS19TVEFDSworfSBrbXBfYmFzZV90aHJlYWRfZGF0YV90OworCit0eXBlZGVmIHVuaW9uIEtNUF9BTElHTl9DQUNIRSBrbXBfdGhyZWFkX2RhdGEgeworICAgIGttcF9iYXNlX3RocmVhZF9kYXRhX3QgIHRkOworICAgIGRvdWJsZSAgICAgICAgICAgICAgICAgIHRkX2FsaWduOyAgICAgICAvKiB1c2Ugd29yc3QgY2FzZSBhbGlnbm1lbnQgKi8KKyAgICBjaGFyICAgICAgICAgICAgICAgICAgICB0ZF9wYWRbIEtNUF9QQUQoa21wX2Jhc2VfdGhyZWFkX2RhdGFfdCwgQ0FDSEVfTElORSkgXTsKK30ga21wX3RocmVhZF9kYXRhX3Q7CisKKworLy8gRGF0YSBmb3IgdGFzayB0ZWFtcyB3aGljaCBhcmUgdXNlZCB3aGVuIHRhc2tpbmcgaXMgZW5hYmxlZCBmb3IgdGhlIHRlYW0KK3R5cGVkZWYgc3RydWN0IGttcF9iYXNlX3Rhc2tfdGVhbSB7CisgICAga21wX2Jvb3RzdHJhcF9sb2NrX3QgICAgdHRfdGhyZWFkc19sb2NrOyAgICAgICAvKiBMb2NrIHVzZWQgdG8gYWxsb2NhdGUgcGVyLXRocmVhZCBwYXJ0IG9mIHRhc2sgdGVhbSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbXVzdCBiZSBib290c3RyYXAgbG9jayBzaW5jZSB1c2VkIGF0IGxpYnJhcnkgc2h1dGRvd24qLworICAgIGttcF90YXNrX3RlYW1fdCAqICAgICAgIHR0X25leHQ7ICAgICAgICAgICAgICAgLyogRm9yIGxpbmtpbmcgdGhlIHRhc2sgdGVhbSBmcmVlIGxpc3QgKi8KKyAgICBrbXBfdGhyZWFkX2RhdGFfdCAqICAgICB0dF90aHJlYWRzX2RhdGE7ICAgICAgIC8qIEFycmF5IG9mIHBlci10aHJlYWQgc3RydWN0dXJlcyBmb3IgdGFzayB0ZWFtICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEYXRhIHN1cnZpdmVzIHRhc2sgdGVhbSBkZWFsbG9jYXRpb24gKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICB0dF9mb3VuZF90YXNrczsgICAgICAgIC8qIEhhdmUgd2UgZm91bmQgdGFza3MgYW5kIHF1ZXVlZCB0aGVtIHdoaWxlIGV4ZWN1dGluZyB0aGlzIHRlYW0/ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUUlVFIG1lYW5zIHR0X3RocmVhZHNfZGF0YSBpcyBzZXQgdXAgYW5kIGluaXRpYWxpemVkICovCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgdHRfbnByb2M7ICAgICAgICAgICAgICAvKiAjdGhyZWFkcyBpbiB0ZWFtICAgICAgICAgICAqLworICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgIHR0X21heF90aHJlYWRzOyAgICAgICAgLyogbnVtYmVyIG9mIGVudHJpZXMgYWxsb2NhdGVkIGZvciB0aHJlYWRzX2RhdGEgYXJyYXkgKi8KKyNpZiBPTVBfNDFfRU5BQkxFRAorICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgIHR0X2ZvdW5kX3Byb3h5X3Rhc2tzOyAgLyogSGF2ZSB3ZSBmb3VuZCBwcm94eSB0YXNrcyBzaW5jZSBsYXN0IGJhcnJpZXIgKi8KKyNlbmRpZgorCisgICAgS01QX0FMSUdOX0NBQ0hFCisgICAgdm9sYXRpbGUga21wX3VpbnQzMiAgICAgdHRfdW5maW5pc2hlZF90aHJlYWRzOyAvKiAjdGhyZWFkcyBzdGlsbCBhY3RpdmUgICAgICAqLworCisgICAgS01QX0FMSUdOX0NBQ0hFCisgICAgdm9sYXRpbGUga21wX3VpbnQzMiAgICAgdHRfYWN0aXZlOyAgICAgICAgICAgICAvKiBpcyB0aGUgdGVhbSBzdGlsbCBhY3RpdmVseSBleGVjdXRpbmcgdGFza3MgKi8KK30ga21wX2Jhc2VfdGFza190ZWFtX3Q7CisKK3VuaW9uIEtNUF9BTElHTl9DQUNIRSBrbXBfdGFza190ZWFtIHsKKyAgICBrbXBfYmFzZV90YXNrX3RlYW1fdCB0dDsKKyAgICBkb3VibGUgICAgICAgICAgICAgICB0dF9hbGlnbjsgICAgICAgLyogdXNlIHdvcnN0IGNhc2UgYWxpZ25tZW50ICovCisgICAgY2hhciAgICAgICAgICAgICAgICAgdHRfcGFkWyBLTVBfUEFEKGttcF9iYXNlX3Rhc2tfdGVhbV90LCBDQUNIRV9MSU5FKSBdOworfTsKKworI2lmICggVVNFX0ZBU1RfTUVNT1JZID09IDMgKSB8fCAoIFVTRV9GQVNUX01FTU9SWSA9PSA1ICkKKy8vIEZyZWUgbGlzdHMga2VlcCBzYW1lLXNpemUgZnJlZSBtZW1vcnkgc2xvdHMgZm9yIGZhc3QgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMKK3R5cGVkZWYgc3RydWN0IGttcF9mcmVlX2xpc3QgeworICAgIHZvaWQgICAgICAgICAgICAgKnRoX2ZyZWVfbGlzdF9zZWxmOyAgIC8vIFNlbGYtYWxsb2NhdGVkIHRhc2tzIGZyZWUgbGlzdAorICAgIHZvaWQgICAgICAgICAgICAgKnRoX2ZyZWVfbGlzdF9zeW5jOyAgIC8vIFNlbGYtYWxsb2NhdGVkIHRhc2tzIHN0b2xlbi9yZXR1cm5lZCBieSBvdGhlciB0aHJlYWRzCisgICAgdm9pZCAgICAgICAgICAgICAqdGhfZnJlZV9saXN0X290aGVyOyAgLy8gTm9uLXNlbGYgZnJlZSBsaXN0ICh0byBiZSByZXR1cm5lZCB0byBvd25lcidzIHN5bmMgbGlzdCkKK30ga21wX2ZyZWVfbGlzdF90OworI2VuZGlmCisjaWYgS01QX05FU1RFRF9IT1RfVEVBTVMKKy8vIEhvdCB0ZWFtcyBhcnJheSBrZWVwcyBob3QgdGVhbXMgYW5kIHRoZWlyIHNpemVzIGZvciBnaXZlbiB0aHJlYWQuCisvLyBIb3QgdGVhbXMgYXJlIG5vdCBwdXQgaW4gdGVhbXMgcG9vbCwgYW5kIHRoZXkgZG9uJ3QgcHV0IHRocmVhZHMgaW4gdGhyZWFkcyBwb29sLgordHlwZWRlZiBzdHJ1Y3Qga21wX2hvdF90ZWFtX3B0ciB7CisgICAga21wX3RlYW1fcCAqaG90X3RlYW07ICAgICAgLy8gcG9pbnRlciB0byBob3RfdGVhbSBvZiBnaXZlbiBuZXN0aW5nIGxldmVsCisgICAga21wX2ludDMyICAgaG90X3RlYW1fbnRoOyAgLy8gbnVtYmVyIG9mIHRocmVhZHMgYWxsb2NhdGVkIGZvciB0aGUgaG90X3RlYW0KK30ga21wX2hvdF90ZWFtX3B0cl90OworI2VuZGlmCisjaWYgT01QXzQwX0VOQUJMRUQKK3R5cGVkZWYgc3RydWN0IGttcF90ZWFtc19zaXplIHsKKyAgICBrbXBfaW50MzIgICBudGVhbXM7ICAgICAgICAvLyBudW1iZXIgb2YgdGVhbXMgaW4gYSBsZWFndWUKKyAgICBrbXBfaW50MzIgICBudGg7ICAgICAgICAgICAvLyBudW1iZXIgb2YgdGhyZWFkcyBpbiBlYWNoIHRlYW0gb2YgdGhlIGxlYWd1ZQorfSBrbXBfdGVhbXNfc2l6ZV90OworI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLy8gT3Blbk1QIHRocmVhZCBkYXRhIHN0cnVjdHVyZXMKKy8vCisKK3R5cGVkZWYgc3RydWN0IEtNUF9BTElHTl9DQUNIRSBrbXBfYmFzZV9pbmZvIHsKKy8qCisgKiBTdGFydCB3aXRoIHRoZSByZWFkb25seSBkYXRhIHdoaWNoIGlzIGNhY2hlIGFsaWduZWQgYW5kIHBhZGRlZC4KKyAqIHRoaXMgaXMgd3JpdHRlbiBiZWZvcmUgdGhlIHRocmVhZCBzdGFydHMgd29ya2luZyBieSB0aGUgbWFzdGVyLgorICogKHViZXIgbWFzdGVycyBtYXkgdXBkYXRlIHRoZW1zZWx2ZXMgbGF0ZXIpCisgKiAodXNhZ2UgZG9lcyBub3QgY29uc2lkZXIgc2VyaWFsaXplZCByZWdpb25zKQorICovCisgICAga21wX2Rlc2NfdCAgICAgICAgdGhfaW5mbzsKKyAgICBrbXBfdGVhbV9wICAgICAgICp0aF90ZWFtOyAgICAgICAvKiB0ZWFtIHdlIGJlbG9uZyB0byAqLworICAgIGttcF9yb290X3AgICAgICAgKnRoX3Jvb3Q7ICAgICAgIC8qIHBvaW50ZXIgdG8gcm9vdCBvZiB0YXNrIGhpZXJhcmNoeSAqLworICAgIGttcF9pbmZvX3AgICAgICAgKnRoX25leHRfcG9vbDsgIC8qIG5leHQgYXZhaWxhYmxlIHRocmVhZCBpbiB0aGUgcG9vbCAqLworICAgIGttcF9kaXNwX3QgICAgICAgKnRoX2Rpc3BhdGNoOyAgIC8qIHRocmVhZCdzIGRpc3BhdGNoIGRhdGEgKi8KKyAgICBpbnQgICAgICAgICAgICAgICB0aF9pbl9wb29sOyAgICAvKiBpbiB0aHJlYWQgcG9vbCAoMzIgYml0cyBmb3IgVENSL1RDVykgKi8KKworICAgIC8qIFRoZSBmb2xsb3dpbmcgYXJlIGNhY2hlZCBmcm9tIHRoZSB0ZWFtIGluZm8gc3RydWN0dXJlICovCisgICAgLyogVE9ETyB1c2UgdGhlc2UgaW4gbW9yZSBwbGFjZXMgYXMgZGV0ZXJtaW5lZCB0byBiZSBuZWVkZWQgdmlhIHByb2ZpbGluZyAqLworICAgIGludCAgICAgICAgICAgICAgIHRoX3RlYW1fbnByb2M7ICAgICAgLyogbnVtYmVyIG9mIHRocmVhZHMgaW4gYSB0ZWFtICovCisgICAga21wX2luZm9fcCAgICAgICAqdGhfdGVhbV9tYXN0ZXI7ICAgICAvKiB0aGUgdGVhbSdzIG1hc3RlciB0aHJlYWQgKi8KKyAgICBpbnQgICAgICAgICAgICAgICB0aF90ZWFtX3NlcmlhbGl6ZWQ7IC8qIHRlYW0gaXMgc2VyaWFsaXplZCAqLworI2lmIE9NUF80MF9FTkFCTEVECisgICAgbWljcm90YXNrX3QgICAgICAgdGhfdGVhbXNfbWljcm90YXNrOyAvKiBzYXZlIGVudHJ5IGFkZHJlc3MgZm9yIHRlYW1zIGNvbnN0cnVjdCAqLworICAgIGludCAgICAgICAgICAgICAgIHRoX3RlYW1zX2xldmVsOyAgICAgLyogc2F2ZSBpbml0aWFsIGxldmVsIG9mIHRlYW1zIGNvbnN0cnVjdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaXQgaXMgMCBvbiBkZXZpY2UgYnV0IG1heSBiZSBhbnkgb24gaG9zdCAqLworI2VuZGlmCisKKyAgICAvKiBUaGUgYmxvY2t0aW1lIGluZm8gaXMgY29waWVkIGZyb20gdGhlIHRlYW0gc3RydWN0IHRvIHRoZSB0aHJlYWQgc3J1Y3QgKi8KKyAgICAvKiBhdCB0aGUgc3RhcnQgb2YgYSBiYXJyaWVyLCBhbmQgdGhlIHZhbHVlcyBzdG9yZWQgaW4gdGhlIHRlYW0gYXJlIHVzZWQgKi8KKyAgICAvKiBhdCBwb2ludHMgaW4gdGhlIGNvZGUgd2hlcmUgdGhlIHRlYW0gc3RydWN0IGlzIG5vIGxvbmdlciBndWFyYW50ZWVkICAgKi8KKyAgICAvKiB0byBleGlzdCAoZnJvbSB0aGUgUE9WIG9mIHdvcmtlciB0aHJlYWRzKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgICAgICAgICAgICAgICB0aF90ZWFtX2J0X2ludGVydmFsczsKKyAgICBpbnQgICAgICAgICAgICAgICB0aF90ZWFtX2J0X3NldDsKKworCisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIGttcF9hZmZpbl9tYXNrX3QgICp0aF9hZmZpbl9tYXNrOyAvKiB0aHJlYWQncyBjdXJyZW50IGFmZmluaXR5IG1hc2sgKi8KKyNlbmRpZgorCisvKgorICogVGhlIGRhdGEgc2V0IGJ5IHRoZSBtYXN0ZXIgYXQgcmVpbml0LCB0aGVuIFIvVyBieSB0aGUgd29ya2VyCisgKi8KKyAgICBLTVBfQUxJR05fQ0FDSEUgaW50ICAgICB0aF9zZXRfbnByb2M7ICAvKiBpZiA+IDAsIHRoZW4gb25seSB1c2UgdGhpcyByZXF1ZXN0IGZvciB0aGUgbmV4dCBmb3JrICovCisjaWYgS01QX05FU1RFRF9IT1RfVEVBTVMKKyAgICBrbXBfaG90X3RlYW1fcHRyX3QgICAgICp0aF9ob3RfdGVhbXM7ICAgICAvKiBhcnJheSBvZiBob3QgdGVhbXMgKi8KKyNlbmRpZgorI2lmIE9NUF80MF9FTkFCTEVECisgICAga21wX3Byb2NfYmluZF90ICAgICAgICAgdGhfc2V0X3Byb2NfYmluZDsgLyogaWYgIT0gcHJvY19iaW5kX2RlZmF1bHQsIHVzZSByZXF1ZXN0IGZvciBuZXh0IGZvcmsgKi8KKyAgICBrbXBfdGVhbXNfc2l6ZV90ICAgICAgICB0aF90ZWFtc19zaXplOyAgICAvKiBudW1iZXIgb2YgdGVhbXMvdGhyZWFkcyBpbiB0ZWFtcyBjb25zdHJ1Y3QgKi8KKyMgaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIGludCAgICAgICAgICAgICAgICAgICAgIHRoX2N1cnJlbnRfcGxhY2U7IC8qIHBsYWNlIGN1cnJlbnRseSBib3VuZCB0byAqLworICAgIGludCAgICAgICAgICAgICAgICAgICAgIHRoX25ld19wbGFjZTsgICAgIC8qIHBsYWNlIHRvIGJpbmQgdG8gaW4gcGFyIHJlZyAqLworICAgIGludCAgICAgICAgICAgICAgICAgICAgIHRoX2ZpcnN0X3BsYWNlOyAgIC8qIGZpcnN0IHBsYWNlIGluIHBhcnRpdGlvbiAqLworICAgIGludCAgICAgICAgICAgICAgICAgICAgIHRoX2xhc3RfcGxhY2U7ICAgIC8qIGxhc3QgcGxhY2UgaW4gcGFydGl0aW9uICovCisjIGVuZGlmCisjZW5kaWYKKyNpZiBVU0VfSVRUX0JVSUxECisgICAga21wX3VpbnQ2NCAgICAgICAgICAgICAgdGhfYmFyX2Fycml2ZV90aW1lOyAgICAgICAgICAgLyogYXJyaXZhbCB0byBiYXJyaWVyIHRpbWVzdGFtcCAqLworICAgIGttcF91aW50NjQgICAgICAgICAgICAgIHRoX2Jhcl9taW5fdGltZTsgICAgICAgICAgICAgIC8qIG1pbmltdW0gYXJyaXZhbCB0aW1lIGF0IHRoZSBiYXJyaWVyICovCisgICAga21wX3VpbnQ2NCAgICAgICAgICAgICAgdGhfZnJhbWVfdGltZTsgICAgICAgICAgICAgICAgLyogZnJhbWUgdGltZXN0YW1wICovCisgICAga21wX3VpbnQ2NCAgICAgICAgICAgICAgdGhfZnJhbWVfdGltZV9zZXJpYWxpemVkOyAgICAgLyogZnJhbWUgdGltZXN0YW1wIGluIHNlcmlhbGl6ZWQgcGFyYWxsZWwgKi8KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAga21wX2xvY2FsX3QgICAgICAgICAgICAgdGhfbG9jYWw7CisgICAgc3RydWN0IHByaXZhdGVfY29tbW9uICAqdGhfcHJpX2hlYWQ7CisKKy8qCisgKiBOb3cgdGhlIGRhdGEgb25seSB1c2VkIGJ5IHRoZSB3b3JrZXIgKGFmdGVyIGluaXRpYWwgYWxsb2NhdGlvbikKKyAqLworICAgIC8qIFRPRE8gdGhlIGZpcnN0IHNlcmlhbCB0ZWFtIHNob3VsZCBhY3R1YWxseSBiZSBzdG9yZWQgaW4gdGhlIGluZm9fdAorICAgICAqIHN0cnVjdHVyZS4gIHRoaXMgd2lsbCBoZWxwIHJlZHVjZSBpbml0aWFsIGFsbG9jYXRpb24gb3ZlcmhlYWQgKi8KKyAgICBLTVBfQUxJR05fQ0FDSEUga21wX3RlYW1fcCAqdGhfc2VyaWFsX3RlYW07IC8qc2VyaWFsaXplZCB0ZWFtIGhlbGQgaW4gcmVzZXJ2ZSovCisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBvbXB0X3RocmVhZF9pbmZvX3QgICAgICBvbXB0X3RocmVhZF9pbmZvOworI2VuZGlmCisKKy8qIFRoZSBmb2xsb3dpbmcgYXJlIGFsc28gcmVhZCBieSB0aGUgbWFzdGVyIGR1cmluZyByZWluaXQgKi8KKyAgICBzdHJ1Y3QgY29tbW9uX3RhYmxlICAgICp0aF9wcmlfY29tbW9uOworCisgICAgdm9sYXRpbGUga21wX3VpbnQzMiAgICAgdGhfc3Bpbl9oZXJlOyAgIC8qIHRocmVhZC1sb2NhbCBsb2NhdGlvbiBmb3Igc3Bpbm5pbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd2hpbGUgYXdhaXRpbmcgcXVldWluZyBsb2NrIGFjcXVpcmUgKi8KKworICAgIHZvbGF0aWxlIHZvaWQgICAgICAgICAgKnRoX3NsZWVwX2xvYzsgICAvLyB0aGlzIHBvaW50cyBhdCBhIGttcF9mbGFnPFQ+CisKKyAgICBpZGVudF90ICAgICAgICAgICp0aF9pZGVudDsKKyAgICB1bnNpZ25lZCAgICAgICAgIHRoX3g7ICAgICAgICAgICAgICAgICAgICAgLy8gUmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZGF0YQorICAgIHVuc2lnbmVkICAgICAgICAgdGhfYTsgICAgICAgICAgICAgICAgICAgICAvLyBSYW5kb20gbnVtYmVyIGdlbmVyYXRvciBkYXRhCisKKy8qCisgKiBUYXNraW5nLXJlbGF0ZWQgZGF0YSBmb3IgdGhlIHRocmVhZAorICovCisgICAga21wX3Rhc2tfdGVhbV90ICAgICogdGhfdGFza190ZWFtOyAgICAgICAgICAgLy8gVGFzayB0ZWFtIHN0cnVjdAorICAgIGttcF90YXNrZGF0YV90ICAgICAqIHRoX2N1cnJlbnRfdGFzazsgICAgICAgIC8vIElubmVybW9zdCBUYXNrIGJlaW5nIGV4ZWN1dGVkCisgICAga21wX3VpbnQ4ICAgICAgICAgICAgdGhfdGFza19zdGF0ZTsgICAgICAgICAgLy8gYWx0ZXJuYXRpbmcgMC8xIGZvciB0YXNrIHRlYW0gaWRlbnRpZmljYXRpb24KKyAgICBrbXBfdWludDggICAgICAgICAgKiB0aF90YXNrX3N0YXRlX21lbW9fc3RhY2s7ICAvLyBTdGFjayBob2xkaW5nIG1lbW9zIG9mIHRoX3Rhc2tfc3RhdGUgYXQgbmVzdGVkIGxldmVscworICAgIGttcF91aW50MzIgICAgICAgICAgIHRoX3Rhc2tfc3RhdGVfdG9wOyAgICAgICAgIC8vIFRvcCBlbGVtZW50IG9mIHRoX3Rhc2tfc3RhdGVfbWVtb19zdGFjaworICAgIGttcF91aW50MzIgICAgICAgICAgIHRoX3Rhc2tfc3RhdGVfc3RhY2tfc3o7ICAgIC8vIFNpemUgb2YgdGhfdGFza19zdGF0ZV9tZW1vX3N0YWNrCisKKyAgICAvKgorICAgICAqIE1vcmUgc3R1ZmYgZm9yIGtlZXBpbmcgdHJhY2sgb2YgYWN0aXZlL3NsZWVwaW5nIHRocmVhZHMKKyAgICAgKiAodGhpcyBwYXJ0IGlzIHdyaXR0ZW4gYnkgdGhlIHdvcmtlciB0aHJlYWQpCisgICAgICovCisgICAga21wX3VpbnQ4ICAgICAgICAgICAgdGhfYWN0aXZlX2luX3Bvb2w7ICAgICAgLy8gaW5jbHVkZWQgaW4gY291bnQgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAjYWN0aXZlIHRocmVhZHMgaW4gcG9vbAorICAgIGludCAgICAgICAgICAgICAgICAgIHRoX2FjdGl2ZTsgICAgICAgICAgICAgIC8vICEgc2xlZXBpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAzMiBiaXRzIGZvciBUQ1IvVENXCisKKworICAgIHN0cnVjdCBjb25zX2hlYWRlciAqIHRoX2NvbnM7IC8vIHVzZWQgZm9yIGNvbnNpc3RlbmN5IGNoZWNrCisKKy8qCisgKiBBZGQgdGhlIHN5bmNyb25pemluZyBkYXRhIHdoaWNoIGlzIGNhY2hlIGFsaWduZWQgYW5kIHBhZGRlZC4KKyAqLworICAgIEtNUF9BTElHTl9DQUNIRSBrbXBfYmFsaWduX3QgICAgICB0aF9iYXJbIGJzX2xhc3RfYmFycmllciBdOworCisgICAgS01QX0FMSUdOX0NBQ0hFIHZvbGF0aWxlICAgICBrbXBfaW50MzIgICAgdGhfbmV4dF93YWl0aW5nOyAgLyogZ3RpZCsxIG9mIG5leHQgdGhyZWFkIG9uIGxvY2sgd2FpdCBxdWV1ZSwgMCBpZiBub25lICovCisKKyNpZiAoIFVTRV9GQVNUX01FTU9SWSA9PSAzICkgfHwgKCBVU0VfRkFTVF9NRU1PUlkgPT0gNSApCisgICAgI2RlZmluZSBOVU1fTElTVFMgNAorICAgIGttcF9mcmVlX2xpc3RfdCAgIHRoX2ZyZWVfbGlzdHNbTlVNX0xJU1RTXTsgICAvLyBGcmVlIGxpc3RzIGZvciBmYXN0IG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzCisjZW5kaWYKKworI2lmIEtNUF9PU19XSU5ET1dTCisgICAga21wX3dpbjMyX2NvbmRfdCAgdGhfc3VzcGVuZF9jdjsKKyAgICBrbXBfd2luMzJfbXV0ZXhfdCB0aF9zdXNwZW5kX214OworICAgIGludCAgICAgICAgICAgICAgIHRoX3N1c3BlbmRfaW5pdDsKKyNlbmRpZgorI2lmIEtNUF9PU19VTklYCisgICAga21wX2NvbmRfYWxpZ25fdCAgdGhfc3VzcGVuZF9jdjsKKyAgICBrbXBfbXV0ZXhfYWxpZ25fdCB0aF9zdXNwZW5kX214OworICAgIGludCAgICAgICAgICAgICAgIHRoX3N1c3BlbmRfaW5pdF9jb3VudDsKKyNlbmRpZgorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIGttcF9pdHRfbWFya190ICAgICAgICB0aF9pdHRfbWFya19zaW5nbGU7CisgICAgLy8gYWxpZ25tZW50ID8/PworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyNpZiBLTVBfU1RBVFNfRU5BQkxFRAorICAgIGttcF9zdGF0c19saXN0KiB0aF9zdGF0czsKKyNlbmRpZgorfSBrbXBfYmFzZV9pbmZvX3Q7CisKK3R5cGVkZWYgdW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF9pbmZvIHsKKyAgICBkb3VibGUgICAgICAgICAgdGhfYWxpZ247ICAgICAgICAvKiB1c2Ugd29yc3QgY2FzZSBhbGlnbm1lbnQgKi8KKyAgICBjaGFyICAgICAgICAgICAgdGhfcGFkWyBLTVBfUEFEKGttcF9iYXNlX2luZm9fdCwgQ0FDSEVfTElORSkgXTsKKyAgICBrbXBfYmFzZV9pbmZvX3QgdGg7Cit9IGttcF9pbmZvX3Q7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLy8gT3Blbk1QIHRocmVhZCB0ZWFtIGRhdGEgc3RydWN0dXJlcworLy8KK3R5cGVkZWYgc3RydWN0IGttcF9iYXNlX2RhdGEgeworICAgIHZvbGF0aWxlIGttcF91aW50MzIgdF92YWx1ZTsKK30ga21wX2Jhc2VfZGF0YV90OworCit0eXBlZGVmIHVuaW9uIEtNUF9BTElHTl9DQUNIRSBrbXBfc2xlZXBfdGVhbSB7CisgICAgZG91YmxlICAgICAgICAgICAgICBkdF9hbGlnbjsgICAgICAgIC8qIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudCAqLworICAgIGNoYXIgICAgICAgICAgICAgICAgZHRfcGFkWyBLTVBfUEFEKGttcF9iYXNlX2RhdGFfdCwgQ0FDSEVfTElORSkgXTsKKyAgICBrbXBfYmFzZV9kYXRhX3QgICAgIGR0OworfSBrbXBfc2xlZXBfdGVhbV90OworCit0eXBlZGVmIHVuaW9uIEtNUF9BTElHTl9DQUNIRSBrbXBfb3JkZXJlZF90ZWFtIHsKKyAgICBkb3VibGUgICAgICAgICAgICAgIGR0X2FsaWduOyAgICAgICAgLyogdXNlIHdvcnN0IGNhc2UgYWxpZ25tZW50ICovCisgICAgY2hhciAgICAgICAgICAgICAgICBkdF9wYWRbIEtNUF9QQUQoa21wX2Jhc2VfZGF0YV90LCBDQUNIRV9MSU5FKSBdOworICAgIGttcF9iYXNlX2RhdGFfdCAgICAgZHQ7Cit9IGttcF9vcmRlcmVkX3RlYW1fdDsKKwordHlwZWRlZiBpbnQgICAgICgqbGF1bmNoX3QpKCBpbnQgZ3RpZCApOworCisvKiBNaW5pbXVtIG51bWJlciBvZiBBUkdWIGVudHJpZXMgdG8gbWFsbG9jIGlmIG5lY2Vzc2FyeSAqLworI2RlZmluZSBLTVBfTUlOX01BTExPQ19BUkdWX0VOVFJJRVMgICAgIDEwMAorCisvLyBTZXQgdXAgaG93IG1hbnkgYXJndiBwb2ludGVycyB3aWxsIGZpdCBpbiBjYWNoZSBsaW5lcyBjb250YWluaW5nIHRfaW5saW5lX2FyZ3YuIEhpc3RvcmljYWxseSwgd2UKKy8vIGhhdmUgc3VwcG9ydGVkIGF0IGxlYXN0IDk2IGJ5dGVzLiBVc2luZyBhIGxhcmdlciB2YWx1ZSBmb3IgbW9yZSBzcGFjZSBiZXR3ZWVuIHRoZSBtYXN0ZXIgd3JpdGUvd29ya2VyCisvLyByZWFkIHNlY3Rpb24gYW5kIHJlYWQvd3JpdGUgYnkgYWxsIHNlY3Rpb24gc2VlbXMgdG8gYnV5IG1vcmUgcGVyZm9ybWFuY2Ugb24gRVBDQyBQQVJBTExFTC4KKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisjIGRlZmluZSBLTVBfSU5MSU5FX0FSR1ZfQllURVMgICAgICAgICAoIDQgKiBDQUNIRV9MSU5FIC0gKCAoIDMgKiBLTVBfUFRSX1NLSVAgKyAyICogc2l6ZW9mKGludCkgKyAyICogc2l6ZW9mKGttcF9pbnQ4KSArIHNpemVvZihrbXBfaW50MTYpICsgc2l6ZW9mKGttcF91aW50MzIpICkgJSBDQUNIRV9MSU5FICkgKQorI2Vsc2UKKyMgZGVmaW5lIEtNUF9JTkxJTkVfQVJHVl9CWVRFUyAgICAgICAgICggMiAqIENBQ0hFX0xJTkUgLSAoICggMyAqIEtNUF9QVFJfU0tJUCArIDIgKiBzaXplb2YoaW50KSApICUgQ0FDSEVfTElORSApICkKKyNlbmRpZgorI2RlZmluZSBLTVBfSU5MSU5FX0FSR1ZfRU5UUklFUyAgICAgICAgKGludCkoIEtNUF9JTkxJTkVfQVJHVl9CWVRFUyAvIEtNUF9QVFJfU0tJUCApCisKK3R5cGVkZWYgc3RydWN0IEtNUF9BTElHTl9DQUNIRSBrbXBfYmFzZV90ZWFtIHsKKyAgICAvLyBTeW5jaHJvbml6YXRpb24gRGF0YSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBLTVBfQUxJR05fQ0FDSEUga21wX29yZGVyZWRfdGVhbV90IHRfb3JkZXJlZDsKKyAgICBrbXBfYmFsaWduX3RlYW1fdCAgICAgICAgdF9iYXJbIGJzX2xhc3RfYmFycmllciBdOworICAgIHZvbGF0aWxlIGludCAgICAgICAgICAgICB0X2NvbnN0cnVjdDsgICAgLy8gY291bnQgb2Ygc2luZ2xlIGRpcmVjdGl2ZSBlbmNvdW50ZXJlZCBieSB0ZWFtCisgICAga21wX2xvY2tfdCAgICAgICAgICAgICAgIHRfc2luZ2xlX2xvY2s7ICAvLyB0ZWFtIHNwZWNpZmljIGxvY2sKKworICAgIC8vIE1hc3RlciBvbmx5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgS01QX0FMSUdOX0NBQ0hFIGludCAgICAgIHRfbWFzdGVyX3RpZDsgICAvLyB0aWQgb2YgbWFzdGVyIGluIHBhcmVudCB0ZWFtCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgIHRfbWFzdGVyX3RoaXNfY29uczsgLy8gInRoaXNfY29uc3RydWN0IiBzaW5nbGUgY291bnRlciBvZiBtYXN0ZXIgaW4gcGFyZW50IHRlYW0KKyAgICBpZGVudF90ICAgICAgICAgICAgICAgICAqdF9pZGVudDsgICAgICAgIC8vIGlmIHZvbGF0aWxlLCBoYXZlIHRvIGNoYW5nZSB0b28gbXVjaCBvdGhlciBjcnVkIHRvIHZvbGF0aWxlIHRvbworICAgIGttcF90ZWFtX3AgICAgICAgICAgICAgICp0X3BhcmVudDsgICAgICAgLy8gcGFyZW50IHRlYW0KKyAgICBrbXBfdGVhbV9wICAgICAgICAgICAgICAqdF9uZXh0X3Bvb2w7ICAgIC8vIG5leHQgZnJlZSB0ZWFtIGluIHRoZSB0ZWFtIHBvb2wKKyAgICBrbXBfZGlzcF90ICAgICAgICAgICAgICAqdF9kaXNwYXRjaDsgICAgIC8vIHRocmVhZCdzIGRpc3BhdGNoIGRhdGEKKyAgICBrbXBfdGFza190ZWFtX3QgICAgICAgICAqdF90YXNrX3RlYW1bMl07IC8vIFRhc2sgdGVhbSBzdHJ1Y3Q7IHN3aXRjaCBiZXR3ZWVuIDIKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGttcF9wcm9jX2JpbmRfdCAgICAgICAgICB0X3Byb2NfYmluZDsgICAgLy8gYmluZCB0eXBlIGZvciBwYXIgcmVnaW9uCisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKyNpZiBVU0VfSVRUX0JVSUxECisgICAga21wX3VpbnQ2NCAgICAgICAgICAgICAgIHRfcmVnaW9uX3RpbWU7ICAvLyByZWdpb24gYmVnaW4gdGltZXN0YW1wCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgLy8gTWFzdGVyIHdyaXRlLCB3b3JrZXJzIHJlYWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBLTVBfQUxJR05fQ0FDSEUgdm9pZCAgICoqdF9hcmd2OworICAgIGludCAgICAgICAgICAgICAgICAgICAgICB0X2FyZ2M7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgIHRfbnByb2M7ICAgICAgICAvLyBudW1iZXIgb2YgdGhyZWFkcyBpbiB0ZWFtCisgICAgbWljcm90YXNrX3QgICAgICAgICAgICAgIHRfcGtmbjsKKyAgICBsYXVuY2hfdCAgICAgICAgICAgICAgICAgdF9pbnZva2U7ICAgICAgIC8vIHByb2NlZHVyZSB0byBsYXVuY2ggdGhlIG1pY3JvdGFzaworCisjaWYgT01QVF9TVVBQT1JUCisgICAgb21wdF90ZWFtX2luZm9fdCAgICAgICAgIG9tcHRfdGVhbV9pbmZvOworICAgIG9tcHRfbHdfdGFza3RlYW1fdCAgICAgICpvbXB0X3NlcmlhbGl6ZWRfdGVhbV9pbmZvOworI2VuZGlmCisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisgICAga21wX2ludDggICAgICAgICAgICAgICAgIHRfZnBfY29udHJvbF9zYXZlZDsKKyAgICBrbXBfaW50OCAgICAgICAgICAgICAgICAgdF9wYWQyYjsKKyAgICBrbXBfaW50MTYgICAgICAgICAgICAgICAgdF94ODdfZnB1X2NvbnRyb2xfd29yZDsgLy8gRlAgY29udHJvbCByZWdzCisgICAga21wX3VpbnQzMiAgICAgICAgICAgICAgIHRfbXhjc3I7CisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgKnRfaW5saW5lX2FyZ3ZbIEtNUF9JTkxJTkVfQVJHVl9FTlRSSUVTIF07CisKKyAgICBLTVBfQUxJR05fQ0FDSEUga21wX2luZm9fdCAqKnRfdGhyZWFkczsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgdF9tYXhfYXJnYzsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgdF9tYXhfbnByb2M7ICAgIC8vIG1heGltdW0gdGhyZWFkcyB0aGlzIHRlYW0gY2FuIGhhbmRsZSAoZHluYW1pY2x5IGV4cGFuZGFibGUpCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgIHRfc2VyaWFsaXplZDsgICAvLyBsZXZlbHMgZGVlcCBvZiBzZXJpYWxpemVkIHRlYW1zCisgICAgZGlzcGF0Y2hfc2hhcmVkX2luZm9fdCAgKnRfZGlzcF9idWZmZXI7ICAvLyBidWZmZXJzIGZvciBkaXNwYXRjaCBzeXN0ZW0KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgdF9pZDsgICAgICAgICAgIC8vIHRlYW0ncyBpZCwgYXNzaWduZWQgYnkgZGVidWdnZXIuCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgIHRfbGV2ZWw7ICAgICAgICAvLyBuZXN0ZWQgcGFyYWxsZWwgbGV2ZWwKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgdF9hY3RpdmVfbGV2ZWw7IC8vIG5lc3RlZCBhY3RpdmUgcGFyYWxsZWwgbGV2ZWwKKyAgICBrbXBfcl9zY2hlZF90ICAgICAgICAgICAgdF9zY2hlZDsgICAgICAgIC8vIHJ1bi10aW1lIHNjaGVkdWxlIGZvciB0aGUgdGVhbQorI2lmIE9NUF80MF9FTkFCTEVEICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgdF9maXJzdF9wbGFjZTsgIC8vIGZpcnN0ICYgbGFzdCBwbGFjZSBpbiBwYXJlbnQgdGhyZWFkJ3MgcGFydGl0aW9uLgorICAgIGludCAgICAgICAgICAgICAgICAgICAgICB0X2xhc3RfcGxhY2U7ICAgLy8gUmVzdG9yZSB0aGVzZSB2YWx1ZXMgdG8gbWFzdGVyIGFmdGVyIHBhciByZWdpb24uCisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQgJiYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIGludCB0X3NpemVfY2hhbmdlZDsgLy8gdGVhbSBzaXplIHdhcyBjaGFuZ2VkPzogMDogbm8sIDE6IHllcywgLTE6IGNoYW5nZWQgdmlhIG9tcF9zZXRfbnVtX3RocmVhZHMoKSBjYWxsCisKKyAgICAvLyBSZWFkL3dyaXRlIGJ5IHdvcmtlcnMgYXMgd2VsbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyAgICAvLyBVc2luZyBDQUNIRV9MSU5FPTY0IHJlZHVjZXMgbWVtb3J5IGZvb3RwcmludCwgYnV0IGNhdXNlcyBhIGJpZyBwZXJmIHJlZ3Jlc3Npb24gb2YgZXBjYyAncGFyYWxsZWwnCisgICAgLy8gYW5kICdiYXJyaWVyJyBvbiBmeGUyNTZsaW4wMS4gVGhpcyBleHRyYSBwYWRkaW5nIHNlcnZlcyB0byBmaXggdGhlIHBlcmZvcm1hbmNlIG9mIGVwY2MgJ3BhcmFsbGVsJworICAgIC8vIGFuZCAnYmFycmllcicgd2hlbiBDQUNIRV9MSU5FPTY0LiBUT0RPOiBpbnZlc3RpZ2F0ZSBtb3JlIGFuZCBnZXQgcmlkIGlmIHRoaXMgcGFkZGluZy4KKyAgICBjaGFyIGR1bW15X3BhZGRpbmdbMTAyNF07CisjZW5kaWYKKyAgICBLTVBfQUxJR05fQ0FDSEUga21wX3Rhc2tkYXRhX3QgKnRfaW1wbGljaXRfdGFza190YXNrZGF0YTsgIC8vIFRhc2tkYXRhIGZvciB0aGUgdGhyZWFkJ3MgaW1wbGljaXQgdGFzaworICAgIGttcF9pbnRlcm5hbF9jb250cm9sX3QgICp0X2NvbnRyb2xfc3RhY2tfdG9wOyAgLy8gaW50ZXJuYWwgY29udHJvbCBzdGFjayBmb3IgYWRkaXRpb25hbCBuZXN0ZWQgdGVhbXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgU0VSSUFMSVpFRCB0ZWFtcyBuZXN0ZWQgMiBvciBtb3JlIGxldmVscyBkZWVwCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICAgdF9jYW5jZWxfcmVxdWVzdDsgLy8gdHlwZWQgZmxhZyB0byBzdG9yZSByZXF1ZXN0IHN0YXRlIG9mIGNhbmNlbGxhdGlvbgorI2VuZGlmCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgIHRfbWFzdGVyX2FjdGl2ZTsgIC8vIHNhdmUgb24gZm9yaywgcmVzdG9yZSBvbiBqb2luCisgICAga21wX3Rhc2txX3QgICAgICAgICAgICAgIHRfdGFza3E7ICAgICAgICAgIC8vIHRoaXMgdGVhbSdzIHRhc2sgcXVldWUKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAqdF9jb3B5cHJpdl9kYXRhOyAgLy8gdGVhbSBzcGVjaWZpYyBwb2ludGVyIHRvIGNvcHlwcml2YXRlIGRhdGEgYXJyYXkKKyAgICBrbXBfdWludDMyICAgICAgICAgICAgICAgdF9jb3B5aW5fY291bnRlcjsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgKnRfc3RhY2tfaWQ7ICAgICAgIC8vIHRlYW0gc3BlY2lmaWMgc3RhY2sgc3RpdGNoaW5nIGlkIChmb3IgaXR0bm90aWZ5KQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KK30ga21wX2Jhc2VfdGVhbV90OworCit1bmlvbiBLTVBfQUxJR05fQ0FDSEUga21wX3RlYW0geworICAgIGttcF9iYXNlX3RlYW1fdCAgICAgdDsKKyAgICBkb3VibGUgICAgICAgICAgICAgIHRfYWxpZ247ICAgICAgIC8qIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudCAqLworICAgIGNoYXIgICAgICAgICAgICAgICAgdF9wYWRbIEtNUF9QQUQoa21wX2Jhc2VfdGVhbV90LCBDQUNIRV9MSU5FKSBdOworfTsKKworCit0eXBlZGVmIHVuaW9uIEtNUF9BTElHTl9DQUNIRSBrbXBfdGltZV9nbG9iYWwgeworICAgIGRvdWJsZSAgICAgICAgICAgICAgZHRfYWxpZ247ICAgICAgICAvKiB1c2Ugd29yc3QgY2FzZSBhbGlnbm1lbnQgKi8KKyAgICBjaGFyICAgICAgICAgICAgICAgIGR0X3BhZFsgS01QX1BBRChrbXBfYmFzZV9kYXRhX3QsIENBQ0hFX0xJTkUpIF07CisgICAga21wX2Jhc2VfZGF0YV90ICAgICBkdDsKK30ga21wX3RpbWVfZ2xvYmFsX3Q7CisKK3R5cGVkZWYgc3RydWN0IGttcF9iYXNlX2dsb2JhbCB7CisgICAgLyogY2FjaGUtYWxpZ25lZCAqLworICAgIGttcF90aW1lX2dsb2JhbF90ICAgZ190aW1lOworCisgICAgLyogbm9uIGNhY2hlLWFsaWduZWQgKi8KKyAgICB2b2xhdGlsZSBpbnQgICAgICAgIGdfYWJvcnQ7CisgICAgdm9sYXRpbGUgaW50ICAgICAgICBnX2RvbmU7CisKKyAgICBpbnQgICAgICAgICAgICAgICAgIGdfZHluYW1pYzsKKyAgICBlbnVtIGR5bmFtaWNfbW9kZSAgIGdfZHluYW1pY19tb2RlOworfSBrbXBfYmFzZV9nbG9iYWxfdDsKKwordHlwZWRlZiB1bmlvbiBLTVBfQUxJR05fQ0FDSEUga21wX2dsb2JhbCB7CisgICAga21wX2Jhc2VfZ2xvYmFsX3QgICBnOworICAgIGRvdWJsZSAgICAgICAgICAgICAgZ19hbGlnbjsgICAgICAgIC8qIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudCAqLworICAgIGNoYXIgICAgICAgICAgICAgICAgZ19wYWRbIEtNUF9QQUQoa21wX2Jhc2VfZ2xvYmFsX3QsIENBQ0hFX0xJTkUpIF07Cit9IGttcF9nbG9iYWxfdDsKKworCit0eXBlZGVmIHN0cnVjdCBrbXBfYmFzZV9yb290IHsKKyAgICAvLyBUT0RPOiBHRUggLSBjb21iaW5lIHJfYWN0aXZlIHdpdGggcl9pbl9wYXJhbGxlbCB0aGVuIHJfYWN0aXZlID09IChyX2luX3BhcmFsbGVsPj0gMCkKKyAgICAvLyBUT0RPOiBHRUggLSB0aGVuIHJlcGxhY2Ugcl9hY3RpdmUgd2l0aCB0X2FjdGl2ZV9sZXZlbHMgaWYgd2UgY2FuIHRvIHJlZHVjZSB0aGUgc3luY2gKKyAgICAvLyAgICAgICAgICAgICBvdmVyaGVhZCBvciBrZWVwaW5nIHJfYWN0aXZlCisKKyAgICB2b2xhdGlsZSBpbnQgICAgICAgIHJfYWN0aXZlOyAgICAgICAvKiBUUlVFIGlmIHNvbWUgcmVnaW9uIGluIGEgbmVzdCBoYXMgPiAxIHRocmVhZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdFSDogVGhpcyBpcyBtaXNuYW1lZCwgc2hvdWxkIGJlIHJfaW5fcGFyYWxsZWwKKyAgICB2b2xhdGlsZSBpbnQgICAgICAgIHJfbmVzdGVkOyAgICAgICAvLyBUT0RPOiBHRUggLSBUaGlzIGlzIHVudXNlZCwganVzdCByZW1vdmUgaXQgZW50aXJlbHkuCisgICAgaW50ICAgICAgICAgICAgICAgICByX2luX3BhcmFsbGVsOyAgLyoga2VlcHMgYSBjb3VudCBvZiBhY3RpdmUgcGFyYWxsZWwgcmVnaW9ucyBwZXIgcm9vdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdFSDogVGhpcyBpcyBtaXNuYW1lZCwgc2hvdWxkIGJlIHJfYWN0aXZlX2xldmVscworICAgIGttcF90ZWFtX3QgICAgICAgICAqcl9yb290X3RlYW07CisgICAga21wX3RlYW1fdCAgICAgICAgICpyX2hvdF90ZWFtOworICAgIGttcF9pbmZvX3QgICAgICAgICAqcl91YmVyX3RocmVhZDsKKyAgICBrbXBfbG9ja190ICAgICAgICAgIHJfYmVnaW5fbG9jazsKKyAgICB2b2xhdGlsZSBpbnQgICAgICAgIHJfYmVnaW47CisgICAgaW50ICAgICAgICAgICAgICAgICByX2Jsb2NrdGltZTsgLyogYmxvY2t0aW1lIGZvciB0aGlzIHJvb3QgYW5kIGRlc2NlbmRhbnRzICovCit9IGttcF9iYXNlX3Jvb3RfdDsKKwordHlwZWRlZiB1bmlvbiBLTVBfQUxJR05fQ0FDSEUga21wX3Jvb3QgeworICAgIGttcF9iYXNlX3Jvb3RfdCAgICAgcjsKKyAgICBkb3VibGUgICAgICAgICAgICAgIHJfYWxpZ247ICAgICAgICAvKiB1c2Ugd29yc3QgY2FzZSBhbGlnbm1lbnQgKi8KKyAgICBjaGFyICAgICAgICAgICAgICAgIHJfcGFkWyBLTVBfUEFEKGttcF9iYXNlX3Jvb3RfdCwgQ0FDSEVfTElORSkgXTsKK30ga21wX3Jvb3RfdDsKKworc3RydWN0IGZvcnRyYW5faW54X2luZm8geworICAgIGttcF9pbnQzMiAgIGRhdGE7Cit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworZXh0ZXJuIGludCAgICAgIF9fa21wX3NldHRpbmdzOworZXh0ZXJuIGludCAgICAgIF9fa21wX2R1cGxpY2F0ZV9saWJyYXJ5X29rOworI2lmIFVTRV9JVFRfQlVJTEQKK2V4dGVybiBpbnQgICAgICBfX2ttcF9mb3Jram9pbl9mcmFtZXM7CitleHRlcm4gaW50ICAgICAgX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGU7CisjZW5kaWYKK2V4dGVybiBQQUNLRURfUkVEVUNUSU9OX01FVEhPRF9UIF9fa21wX2ZvcmNlX3JlZHVjdGlvbl9tZXRob2Q7CitleHRlcm4gaW50ICAgICAgX19rbXBfZGV0ZXJtX3JlZDsKKworI2lmZGVmIEtNUF9ERUJVRworZXh0ZXJuIGludCAgICAgIGttcF9hX2RlYnVnOworZXh0ZXJuIGludCAgICAgIGttcF9iX2RlYnVnOworZXh0ZXJuIGludCAgICAgIGttcF9jX2RlYnVnOworZXh0ZXJuIGludCAgICAgIGttcF9kX2RlYnVnOworZXh0ZXJuIGludCAgICAgIGttcF9lX2RlYnVnOworZXh0ZXJuIGludCAgICAgIGttcF9mX2RlYnVnOworI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworCisvKiBGb3IgZGVidWcgaW5mb3JtYXRpb24gbG9nZ2luZyB1c2luZyByb3RhdGluZyBidWZmZXIgKi8KKyNkZWZpbmUgS01QX0RFQlVHX0JVRl9MSU5FU19JTklUICAgICAgICA1MTIKKyNkZWZpbmUgS01QX0RFQlVHX0JVRl9MSU5FU19NSU4gICAgICAgICAxCisKKyNkZWZpbmUgS01QX0RFQlVHX0JVRl9DSEFSU19JTklUICAgICAgICAxMjgKKyNkZWZpbmUgS01QX0RFQlVHX0JVRl9DSEFSU19NSU4gICAgICAgICAyCisKK2V4dGVybiBpbnQgICAgIF9fa21wX2RlYnVnX2J1ZjsgICAgICAgICAgICAvKiBUUlVFIG1lYW5zIHVzZSBidWZmZXIsIEZBTFNFIG1lYW5zIHByaW50IHRvIHN0ZGVyciAqLworZXh0ZXJuIGludCAgICAgX19rbXBfZGVidWdfYnVmX2xpbmVzOyAgICAgIC8qIEhvdyBtYW55IGxpbmVzIG9mIGRlYnVnIHN0b3JlZCBpbiBidWZmZXIgKi8KK2V4dGVybiBpbnQgICAgIF9fa21wX2RlYnVnX2J1Zl9jaGFyczsgICAgICAvKiBIb3cgbWFueSBjaGFyYWN0ZXJzIGFsbG93ZWQgcGVyIGxpbmUgaW4gYnVmZmVyICovCitleHRlcm4gaW50ICAgICBfX2ttcF9kZWJ1Z19idWZfYXRvbWljOyAgICAgLyogVFJVRSBtZWFucyB1c2UgYXRvbWljIHVwZGF0ZSBvZiBidWZmZXIgZW50cnkgcG9pbnRlciAqLworCitleHRlcm4gY2hhciAgICpfX2ttcF9kZWJ1Z19idWZmZXI7ICAgICAgICAgLyogRGVidWcgYnVmZmVyIGl0c2VsZiAqLworZXh0ZXJuIGludCAgICAgX19rbXBfZGVidWdfY291bnQ7ICAgICAgICAgIC8qIENvdW50ZXIgZm9yIG51bWJlciBvZiBsaW5lcyBwcmludGVkIGluIGJ1ZmZlciBzbyBmYXIgKi8KK2V4dGVybiBpbnQgICAgIF9fa21wX2RlYnVnX2J1Zl93YXJuX2NoYXJzOyAvKiBLZWVwIHRyYWNrIG9mIGNoYXIgaW5jcmVhc2UgcmVjb21tZW5kZWQgaW4gd2FybmluZ3MgKi8KKy8qIGVuZCByb3RhdGluZyBkZWJ1ZyBidWZmZXIgKi8KKworI2lmZGVmIEtNUF9ERUJVRworZXh0ZXJuIGludCAgICAgIF9fa21wX3Bhcl9yYW5nZTsgICAgICAgICAgIC8qICsxID0+IG9ubHkgZ28gcGFyIGZvciBjb25zdHJ1Y3RzIGluIHJhbmdlICovCisKKyNkZWZpbmUgS01QX1BBUl9SQU5HRV9ST1VUSU5FX0xFTiAgICAgICAxMDI0CitleHRlcm4gY2hhciAgICAgX19rbXBfcGFyX3JhbmdlX3JvdXRpbmVbS01QX1BBUl9SQU5HRV9ST1VUSU5FX0xFTl07CisjZGVmaW5lIEtNUF9QQVJfUkFOR0VfRklMRU5BTUVfTEVOICAgICAgMTAyNAorZXh0ZXJuIGNoYXIgICAgIF9fa21wX3Bhcl9yYW5nZV9maWxlbmFtZVtLTVBfUEFSX1JBTkdFX0ZJTEVOQU1FX0xFTl07CitleHRlcm4gaW50ICAgICAgX19rbXBfcGFyX3JhbmdlX2xiOworZXh0ZXJuIGludCAgICAgIF9fa21wX3Bhcl9yYW5nZV91YjsKKyNlbmRpZgorCisvKiBGb3IgcHJpbnRpbmcgb3V0IGR5bmFtaWMgc3RvcmFnZSBtYXAgZm9yIHRocmVhZHMgYW5kIHRlYW1zICovCitleHRlcm4gaW50ICAgICAgX19rbXBfc3RvcmFnZV9tYXA7ICAgICAgICAgLyogVHJ1ZSBtZWFucyBwcmludCBzdG9yYWdlIG1hcCBmb3IgdGhyZWFkcyBhbmQgdGVhbXMgKi8KK2V4dGVybiBpbnQgICAgICBfX2ttcF9zdG9yYWdlX21hcF92ZXJib3NlOyAvKiBUcnVlIG1lYW5zIHN0b3JhZ2UgbWFwIGluY2x1ZGVzIHBsYWNlbWVudCBpbmZvICovCitleHRlcm4gaW50ICAgICAgX19rbXBfc3RvcmFnZV9tYXBfdmVyYm9zZV9zcGVjaWZpZWQ7CisKK2V4dGVybiBrbXBfY3B1aW5mb190ICAgIF9fa21wX2NwdWluZm87CisKK2V4dGVybiB2b2xhdGlsZSBpbnQgX19rbXBfaW5pdF9zZXJpYWw7CitleHRlcm4gdm9sYXRpbGUgaW50IF9fa21wX2luaXRfZ3RpZDsKK2V4dGVybiB2b2xhdGlsZSBpbnQgX19rbXBfaW5pdF9jb21tb247CitleHRlcm4gdm9sYXRpbGUgaW50IF9fa21wX2luaXRfbWlkZGxlOworZXh0ZXJuIHZvbGF0aWxlIGludCBfX2ttcF9pbml0X3BhcmFsbGVsOworZXh0ZXJuIHZvbGF0aWxlIGludCBfX2ttcF9pbml0X21vbml0b3I7CitleHRlcm4gdm9sYXRpbGUgaW50IF9fa21wX2luaXRfdXNlcl9sb2NrczsKK2V4dGVybiBpbnQgX19rbXBfaW5pdF9jb3VudGVyOworZXh0ZXJuIGludCBfX2ttcF9yb290X2NvdW50ZXI7CitleHRlcm4gaW50IF9fa21wX3ZlcnNpb247CisKKy8qIGxpc3Qgb2YgYWRkcmVzcyBvZiBhbGxvY2F0ZWQgY2FjaGVzIGZvciBjb21tb25zICovCitleHRlcm4ga21wX2NhY2hlZF9hZGRyX3QgKl9fa21wX3RocmVhZHByaXZfY2FjaGVfbGlzdDsKKworLyogQmFycmllciBhbGdvcml0aG0gdHlwZXMgYW5kIG9wdGlvbnMgKi8KK2V4dGVybiBrbXBfdWludDMyICAgIF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JiX2RmbHQ7CitleHRlcm4ga21wX3VpbnQzMiAgICBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYmJfZGZsdDsKK2V4dGVybiBrbXBfYmFyX3BhdF9lIF9fa21wX2JhcnJpZXJfZ2F0aGVyX3BhdF9kZmx0OworZXh0ZXJuIGttcF9iYXJfcGF0X2UgX19rbXBfYmFycmllcl9yZWxlYXNlX3BhdF9kZmx0OworZXh0ZXJuIGttcF91aW50MzIgICAgX19rbXBfYmFycmllcl9nYXRoZXJfYnJhbmNoX2JpdHMgIFsgYnNfbGFzdF9iYXJyaWVyIF07CitleHRlcm4ga21wX3VpbnQzMiAgICBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHMgWyBic19sYXN0X2JhcnJpZXIgXTsKK2V4dGVybiBrbXBfYmFyX3BhdF9lIF9fa21wX2JhcnJpZXJfZ2F0aGVyX3BhdHRlcm4gICAgICBbIGJzX2xhc3RfYmFycmllciBdOworZXh0ZXJuIGttcF9iYXJfcGF0X2UgX19rbXBfYmFycmllcl9yZWxlYXNlX3BhdHRlcm4gICAgIFsgYnNfbGFzdF9iYXJyaWVyIF07CitleHRlcm4gY2hhciBjb25zdCAgICpfX2ttcF9iYXJyaWVyX2JyYW5jaF9iaXRfZW52X25hbWUgWyBic19sYXN0X2JhcnJpZXIgXTsKK2V4dGVybiBjaGFyIGNvbnN0ICAgKl9fa21wX2JhcnJpZXJfcGF0dGVybl9lbnZfbmFtZSAgICBbIGJzX2xhc3RfYmFycmllciBdOworZXh0ZXJuIGNoYXIgY29uc3QgICAqX19rbXBfYmFycmllcl90eXBlX25hbWUgICAgICAgICAgIFsgYnNfbGFzdF9iYXJyaWVyIF07CitleHRlcm4gY2hhciBjb25zdCAgICpfX2ttcF9iYXJyaWVyX3BhdHRlcm5fbmFtZSAgICAgICAgWyBicF9sYXN0X2JhciBdOworCisvKiBHbG9iYWwgTG9ja3MgKi8KK2V4dGVybiBrbXBfYm9vdHN0cmFwX2xvY2tfdCBfX2ttcF9pbml0el9sb2NrOyAgICAgLyogY29udHJvbCBpbml0aWFsaXphdGlvbiAqLworZXh0ZXJuIGttcF9ib290c3RyYXBfbG9ja190IF9fa21wX2Zvcmtqb2luX2xvY2s7ICAvKiBjb250cm9sIGZvcmsvam9pbiBhY2Nlc3MgKi8KK2V4dGVybiBrbXBfYm9vdHN0cmFwX2xvY2tfdCBfX2ttcF9leGl0X2xvY2s7ICAgICAgLyogZXhpdCgpIGlzIG5vdCBhbHdheXMgdGhyZWFkLXNhZmUgKi8KK2V4dGVybiBrbXBfYm9vdHN0cmFwX2xvY2tfdCBfX2ttcF9tb25pdG9yX2xvY2s7ICAgLyogY29udHJvbCBtb25pdG9yIHRocmVhZCBjcmVhdGlvbiAqLworZXh0ZXJuIGttcF9ib290c3RyYXBfbG9ja190IF9fa21wX3RwX2NhY2hlZF9sb2NrOyAvKiB1c2VkIGZvciB0aGUgaGFjayB0byBhbGxvdyB0aHJlYWRwcml2YXRlIGNhY2hlIGFuZCBfX2ttcF90aHJlYWRzIGV4cGFuc2lvbiB0byBjby1leGlzdCAqLworCitleHRlcm4ga21wX2xvY2tfdCBfX2ttcF9nbG9iYWxfbG9jazsgICAgLyogY29udHJvbCBPUy9nbG9iYWwgYWNjZXNzICAqLworZXh0ZXJuIGttcF9xdWV1aW5nX2xvY2tfdCBfX2ttcF9kaXNwYXRjaF9sb2NrOyAgLyogY29udHJvbCBkaXNwYXRjaCBhY2Nlc3MgICovCitleHRlcm4ga21wX2xvY2tfdCBfX2ttcF9kZWJ1Z19sb2NrOyAgICAgLyogY29udHJvbCBJL08gYWNjZXNzIGZvciBLTVBfREVCVUcgKi8KKworLyogdXNlZCBmb3IgeWllbGRpbmcgc3Bpbi13YWl0cyAqLworZXh0ZXJuIHVuc2lnbmVkIGludCBfX2ttcF9pbml0X3dhaXQ7ICAgIC8qIGluaXRpYWwgbnVtYmVyIG9mIHNwaW4tdGVzdHMgICAqLworZXh0ZXJuIHVuc2lnbmVkIGludCBfX2ttcF9uZXh0X3dhaXQ7ICAgIC8qIHN1c2VxdWVudCBudW1iZXIgb2Ygc3Bpbi10ZXN0cyAqLworCitleHRlcm4gZW51bSBsaWJyYXJ5X3R5cGUgX19rbXBfbGlicmFyeTsKKworZXh0ZXJuIGVudW0gc2NoZWRfdHlwZSAgX19rbXBfc2NoZWQ7ICAgIC8qIGRlZmF1bHQgcnVudGltZSBzY2hlZHVsaW5nICovCitleHRlcm4gZW51bSBzY2hlZF90eXBlICBfX2ttcF9zdGF0aWM7ICAgLyogZGVmYXVsdCBzdGF0aWMgc2NoZWR1bGluZyBtZXRob2QgKi8KK2V4dGVybiBlbnVtIHNjaGVkX3R5cGUgIF9fa21wX2d1aWRlZDsgICAvKiBkZWZhdWx0IGd1aWRlZCBzY2hlZHVsaW5nIG1ldGhvZCAqLworZXh0ZXJuIGVudW0gc2NoZWRfdHlwZSAgX19rbXBfYXV0bzsgICAgIC8qIGRlZmF1bHQgYXV0byBzY2hlZHVsaW5nIG1ldGhvZCAqLworZXh0ZXJuIGludCAgICAgICAgICAgICAgX19rbXBfY2h1bms7ICAgIC8qIGRlZmF1bHQgcnVudGltZSBjaHVuayBzaXplICovCisKK2V4dGVybiBzaXplX3QgICAgIF9fa21wX3N0a3NpemU7ICAgICAgICAvKiBzdGFjayBzaXplIHBlciB0aHJlYWQgICAgICAgICAqLworZXh0ZXJuIHNpemVfdCAgICAgX19rbXBfbW9uaXRvcl9zdGtzaXplOy8qIHN0YWNrIHNpemUgZm9yIG1vbml0b3IgdGhyZWFkICovCitleHRlcm4gc2l6ZV90ICAgICBfX2ttcF9zdGtvZmZzZXQ7ICAgICAgLyogc3RhY2sgb2Zmc2V0IHBlciB0aHJlYWQgICAgICAgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX3N0a3BhZGRpbmc7ICAgICAvKiBTaG91bGQgd2UgcGFkIHJvb3QgdGhyZWFkKHMpIHN0YWNrICovCisKK2V4dGVybiBzaXplX3QgICAgIF9fa21wX21hbGxvY19wb29sX2luY3I7IC8qIGluY3JlbWVudGFsIHNpemUgb2YgcG9vbCBmb3Iga21wX21hbGxvYygpICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9lbnZfY2h1bms7ICAgICAgLyogd2FzIEtNUF9DSFVOSyBzcGVjaWZpZWQ/ICAgICAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfZW52X3N0a3NpemU7ICAgIC8qIHdhcyBLTVBfU1RBQ0tTSVpFIHNwZWNpZmllZD8gKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2Vudl9vbXBfc3Rrc2l6ZTsvKiB3YXMgT01QX1NUQUNLU0laRSBzcGVjaWZpZWQ/ICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9lbnZfYWxsX3RocmVhZHM7ICAgIC8qIHdhcyBLTVBfQUxMX1RIUkVBRFMgb3IgS01QX01BWF9USFJFQURTIHNwZWNpZmllZD8gKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2Vudl9vbXBfYWxsX3RocmVhZHM7Lyogd2FzIE9NUF9USFJFQURfTElNSVQgc3BlY2lmaWVkPyAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfZW52X2Jsb2NrdGltZTsgIC8qIHdhcyBLTVBfQkxPQ0tUSU1FIHNwZWNpZmllZD8gKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2Vudl9jaGVja3M7ICAgICAvKiB3YXMgS01QX0NIRUNLUyBzcGVjaWZpZWQ/ICAgICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2s7ICAgICAvKiB3YXMgS01QX0NPTlNJU1RFTkNZX0NIRUNLIHNwZWNpZmllZD8gICAgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzOyAvKiBzaG91bGQgd2UgaXNzdWUgd2FybmluZ3M/ICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9yZXNlcnZlX3dhcm47ICAgLyogaGF2ZSB3ZSBpc3N1ZWQgcmVzZXJ2ZV90aHJlYWRzIHdhcm5pbmc/ICovCisKKyNpZmRlZiBERUJVR19TVVNQRU5ECitleHRlcm4gaW50ICAgICAgICBfX2ttcF9zdXNwZW5kX2NvdW50OyAgLyogY291bnQgaW5zaWRlIF9fa21wX3N1c3BlbmRfdGVtcGxhdGUoKSAqLworI2VuZGlmCisKK2V4dGVybiBrbXBfdWludDMyIF9fa21wX3lpZWxkX2luaXQ7CitleHRlcm4ga21wX3VpbnQzMiBfX2ttcF95aWVsZF9uZXh0OworZXh0ZXJuIGttcF91aW50MzIgX19rbXBfeWllbGRpbmdfb247CitleHRlcm4ga21wX3VpbnQzMiBfX2ttcF95aWVsZF9jeWNsZTsKK2V4dGVybiBrbXBfaW50MzIgIF9fa21wX3lpZWxkX29uX2NvdW50OworZXh0ZXJuIGttcF9pbnQzMiAgX19rbXBfeWllbGRfb2ZmX2NvdW50OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9hbGxUaHJlYWRzU3BlY2lmaWVkOworCitleHRlcm4gc2l6ZV90ICAgICBfX2ttcF9hbGlnbl9hbGxvYzsKKy8qIGZvbGxvd2luZyBkYXRhIHByb3RlY3RlZCBieSBpbml0aWFsaXphdGlvbiByb3V0aW5lcyAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfeHByb2M7ICAgICAgICAgIC8qIG51bWJlciBvZiBwcm9jZXNzb3JzIGluIHRoZSBzeXN0ZW0gKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2F2YWlsX3Byb2M7ICAgICAgLyogbnVtYmVyIG9mIHByb2Nlc3NvcnMgYXZhaWxhYmxlIHRvIHRoZSBwcm9jZXNzICovCitleHRlcm4gc2l6ZV90ICAgICBfX2ttcF9zeXNfbWluX3N0a3NpemU7IC8qIHN5c3RlbS1kZWZpbmVkIG1pbmltdW0gc3RhY2sgc2l6ZSAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfc3lzX21heF9udGg7ICAgIC8qIHN5c3RlbS1pbXBvc2VkIG1heGltdW0gbnVtYmVyIG9mIHRocmVhZHMgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX21heF9udGg7ICAgICAgICAvKiBtYXhpbXVtIHRvdGFsIG51bWJlciBvZiBjb25jdXJyZW50bHktZXhpc3RpbmcgdGhyZWFkcyAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfdGhyZWFkc19jYXBhY2l0eTsgLyogY2FwYWNpdHkgb2YgdGhlIGFycmF5cyBfX2ttcF90aHJlYWRzIGFuZCBfX2ttcF9yb290ICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9kZmx0X3RlYW1fbnRoOyAgLyogZGVmYXVsdCBudW1iZXIgb2YgdGhyZWFkcyBpbiBhIHBhcmFsbGVsIHJlZ2lvbiBhIGxhIE9NUF9OVU1fVEhSRUFEUyAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfZGZsdF90ZWFtX250aF91YjsgLyogdXBwZXIgYm91bmQgb24gIiIgZGV0ZXJtaW5lZCBhdCBzZXJpYWwgaW5pdGlhbGl6YXRpb24gKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX3RwX2NhcGFjaXR5OyAgICAvKiBjYXBhY2l0eSBvZiBfX2ttcF90aHJlYWRzIGlmIHRocmVhZHByaXZhdGUgaXMgdXNlZCAoZml4ZWQpICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF90cF9jYWNoZWQ7ICAgICAgLyogd2hldGhlciB0aHJlYWRwcml2YXRlIGNhY2hlIGhhcyBiZWVuIGNyZWF0ZWQgKF9fa21wY190aHJlYWRwcml2YXRlX2NhY2hlZCgpKSAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfZGZsdF9uZXN0ZWQ7ICAgIC8qIG5lc3RlZCBwYXJhbGxlbGlzbSBlbmFibGVkIGJ5IGRlZmF1bHQgYSBsYSBPTVBfTkVTVEVEICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9kZmx0X2Jsb2NrdGltZTsgLyogbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IGJlZm9yZSBibG9ja2luZyAoZW52IHNldHRpbmcpICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9tb25pdG9yX3dha2V1cHM7LyogbnVtYmVyIG9mIHRpbWVzIG1vbml0b3Igd2FrZXMgdXAgcGVyIHNlY29uZCAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfYnRfaW50ZXJ2YWxzOyAgIC8qIG51bWJlciBvZiBtb25pdG9yIHRpbWVzdGFtcCBpbnRlcnZhbHMgYmVmb3JlIGJsb2NraW5nICovCisjaWZkZWYgS01QX0FESlVTVF9CTE9DS1RJTUUKK2V4dGVybiBpbnQgICAgICAgIF9fa21wX3plcm9fYnQ7ICAgICAgICAvKiB3aGV0aGVyIGJsb2NrdGltZSBoYXMgYmVlbiBmb3JjZWQgdG8gemVybyAqLworI2VuZGlmIC8qIEtNUF9BREpVU1RfQkxPQ0tUSU1FICovCisjaWZkZWYgS01QX0RGTFRfTlRIX0NPUkVTCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9uY29yZXM7ICAgICAgICAgLyogVG90YWwgbnVtYmVyIG9mIGNvcmVzIGZvciB0aHJlYWRzIHBsYWNlbWVudCAqLworI2VuZGlmCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9hYm9ydF9kZWxheTsgICAgLyogTnVtYmVyIG9mIG1pbGxpc2VjcyB0byBkZWxheSBvbiBhYm9ydCBmb3IgVlR1bmUgKi8KKworZXh0ZXJuIGludCAgICAgICAgX19rbXBfbmVlZF9yZWdpc3Rlcl9hdGZvcmtfc3BlY2lmaWVkOworZXh0ZXJuIGludCAgICAgICAgX19rbXBfbmVlZF9yZWdpc3Rlcl9hdGZvcms7LyogQXQgaW5pdGlhbGl6YXRpb24sIGNhbGwgcHRocmVhZF9hdGZvcmsgdG8gaW5zdGFsbCBmb3JrIGhhbmRsZXIgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2d0aWRfbW9kZTsgICAgICAvKiBNZXRob2Qgb2YgZ2V0dGluZyBndGlkLCB2YWx1ZXM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAtIG5vdCBzZXQsIHdpbGwgYmUgc2V0IGF0IHJ1bnRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC0gdXNpbmcgc3RhY2sgc2VhcmNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAtIGR5bmFtaWMgVExTIChwdGhyZWFkX2dldHNwZWNpZmljKExpbnV4KiBPUy9PUyBYKikgb3IgVGxzR2V0VmFsdWUoV2luZG93cyogT1MpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgLSBzdGF0aWMgVExTIChfX2RlY2xzcGVjKHRocmVhZCkgX19rbXBfZ3RpZCksIExpbnV4KiBPUyAuc28gb25seS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2FkanVzdF9ndGlkX21vZGU7IC8qIElmIHRydWUsIGFkanVzdCBtZXRob2QgYmFzZWQgb24gI3RocmVhZHMgKi8KKyNpZmRlZiBLTVBfVERBVEFfR1RJRAorI2lmIEtNUF9PU19XSU5ET1dTCitleHRlcm4gX19kZWNsc3BlYyh0aHJlYWQpIGludCBfX2ttcF9ndGlkOyAvKiBUaGlzIHRocmVhZCdzIGd0aWQsIGlmIF9fa21wX2d0aWRfbW9kZSA9PSAzICovCisjZWxzZQorZXh0ZXJuIF9fdGhyZWFkIGludCBfX2ttcF9ndGlkOworI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTIC0gd29ya2Fyb3VuZCBiZWNhdXNlIEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIGNvbXBpbGVyIDIwMTEwMzE2IGRvZXNuJ3QgYWNjZXB0IF9fZGVjbHNwZWMgKi8KKyNlbmRpZgorZXh0ZXJuIGludCAgICAgICAgX19rbXBfdGxzX2d0aWRfbWluOyAgIC8qICN0aHJlYWRzIGJlbG93IHdoaWNoIHVzZSBzcCBzZWFyY2ggZm9yIGd0aWQgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2ZvcmVpZ25fdHA7ICAgICAvKiBJZiB0cnVlLCBzZXBhcmF0ZSBUUCB2YXIgZm9yIGVhY2ggZm9yZWlnbiB0aHJlYWQgKi8KKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CitleHRlcm4gaW50ICAgICAgICBfX2ttcF9pbmhlcml0X2ZwX2NvbnRyb2w7IC8qIGNvcHkgZnAgY3JlZyhzKSBwYXJlbnQtPndvcmtlcnMgYXQgZm9yayAqLworZXh0ZXJuIGttcF9pbnQxNiAgX19rbXBfaW5pdF94ODdfZnB1X2NvbnRyb2xfd29yZDsgLyogaW5pdCB0aHJlYWQncyBGUCBjb250cm9sIHJlZyAqLworZXh0ZXJuIGttcF91aW50MzIgX19rbXBfaW5pdF9teGNzcjsgICAgICAvKiBpbml0IHRocmVhZCdzIG14c2NyICovCisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9kZmx0X21heF9hY3RpdmVfbGV2ZWxzOyAvKiBtYXhfYWN0aXZlX2xldmVscyBmb3IgbmVzdGVkIHBhcmFsbGVsaXNtIGVuYWJsZWQgYnkgZGVmYXVsdCBhIGxhIE9NUF9NQVhfQUNUSVZFX0xFVkVMUyAqLworI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9ob3RfdGVhbXNfbW9kZTsKK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2hvdF90ZWFtc19tYXhfbGV2ZWw7CisjZW5kaWYKKworIyBpZiBLTVBfT1NfTElOVVgKK2V4dGVybiBlbnVtIGNsb2NrX2Z1bmN0aW9uX3R5cGUgX19rbXBfY2xvY2tfZnVuY3Rpb247CitleHRlcm4gaW50IF9fa21wX2Nsb2NrX2Z1bmN0aW9uX3BhcmFtOworIyBlbmRpZiAvKiBLTVBfT1NfTElOVVggKi8KKworI2lmIEtNUF9BUkNIX1g4Nl82NCAmJiAoS01QX09TX0xJTlVYIHx8IEtNUF9PU19XSU5ET1dTKQorZXh0ZXJuIGVudW0gbWljX3R5cGUgX19rbXBfbWljX3R5cGU7CisjZW5kaWYKKworIyBpZmRlZiBVU0VfTE9BRF9CQUxBTkNFCitleHRlcm4gZG91YmxlICAgICAgX19rbXBfbG9hZF9iYWxhbmNlX2ludGVydmFsOyAgIC8qIEludGVydmFsIGZvciB0aGUgbG9hZCBiYWxhbmNlIGFsZ29yaXRobSAqLworIyBlbmRpZiAvKiBVU0VfTE9BRF9CQUxBTkNFICovCisKKy8vIE9wZW5NUCAzLjEgLSBOZXN0ZWQgbnVtIHRocmVhZHMgYXJyYXkKK3R5cGVkZWYgc3RydWN0IGttcF9uZXN0ZWRfbnRocmVhZHNfdCB7CisgICAgaW50ICogbnRoOworICAgIGludCAgIHNpemU7CisgICAgaW50ICAgdXNlZDsKK30ga21wX25lc3RlZF9udGhyZWFkc190OworCitleHRlcm4ga21wX25lc3RlZF9udGhyZWFkc190IF9fa21wX25lc3RlZF9udGg7CisKKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisKKy8vIFBhcmFtZXRlcnMgZm9yIHRoZSBzcGVjdWxhdGl2ZSBsb2NrIGJhY2tvZmYgc3lzdGVtLgorc3RydWN0IGttcF9hZGFwdGl2ZV9iYWNrb2ZmX3BhcmFtc190IHsKKyAgICAvLyBOdW1iZXIgb2Ygc29mdCByZXRyaWVzIGJlZm9yZSBpdCBjb3VudHMgYXMgYSBoYXJkIHJldHJ5LgorICAgIGttcF91aW50MzIgbWF4X3NvZnRfcmV0cmllczsKKyAgICAvLyBCYWRuZXNzIGlzIGEgYml0IG1hc2sgOiAwLDEsMyw3LDE1LC4uLiBvbiBlYWNoIGhhcmQgZmFpbHVyZSB3ZSBtb3ZlIG9uZSB0byB0aGUgcmlnaHQKKyAgICBrbXBfdWludDMyIG1heF9iYWRuZXNzOworfTsKKworZXh0ZXJuIGttcF9hZGFwdGl2ZV9iYWNrb2ZmX3BhcmFtc190IF9fa21wX2FkYXB0aXZlX2JhY2tvZmZfcGFyYW1zOworCisjaWYgS01QX0RFQlVHX0FEQVBUSVZFX0xPQ0tTCitleHRlcm4gY2hhciAqIF9fa21wX3NwZWN1bGF0aXZlX3N0YXRzZmlsZTsKKyNlbmRpZgorCisjZW5kaWYgLy8gS01QX1VTRV9BREFQVElWRV9MT0NLUworCisjaWYgT01QXzQwX0VOQUJMRUQKK2V4dGVybiBpbnQgX19rbXBfZGlzcGxheV9lbnY7ICAgICAgICAgICAvKiBUUlVFIG9yIEZBTFNFICovCitleHRlcm4gaW50IF9fa21wX2Rpc3BsYXlfZW52X3ZlcmJvc2U7ICAgLyogVFJVRSBpZiBPTVBfRElTUExBWV9FTlY9VkVSQk9TRSAqLworZXh0ZXJuIGludCBfX2ttcF9vbXBfY2FuY2VsbGF0aW9uOyAgICAgIC8qIFRSVUUgb3IgRkFMU0UgKi8KKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogdGhlIGZvbGxvd2luZyBhcmUgcHJvdGVjdGVkIGJ5IHRoZSBmb3JrL2pvaW4gbG9jayAqLworLyogd3JpdGU6IGxvY2sgIHJlYWQ6IGFueXRpbWUgKi8KK2V4dGVybiAgICAgICAgICBrbXBfaW5mb190ICoqX19rbXBfdGhyZWFkczsgICAgICAvKiBEZXNjcmlwdG9ycyBmb3IgdGhlIHRocmVhZHMgKi8KKy8qIHJlYWQvd3JpdGU6IGxvY2sgKi8KK2V4dGVybiB2b2xhdGlsZSBrbXBfdGVhbV90ICAqICAgICBfX2ttcF90ZWFtX3Bvb2w7CitleHRlcm4gdm9sYXRpbGUga21wX2luZm9fdCAgKiAgICAgX19rbXBfdGhyZWFkX3Bvb2w7CisKKy8qIHRvdGFsIG51bWJlciBvZiB0aHJlYWRzIHJlYWNoYWJsZSBmcm9tIHNvbWUgcm9vdCB0aHJlYWQgaW5jbHVkaW5nIGFsbCByb290IHRocmVhZHMqLworZXh0ZXJuIHZvbGF0aWxlIGludCBfX2ttcF9udGg7CisvKiB0b3RhbCBudW1iZXIgb2YgdGhyZWFkcyByZWFjaGFibGUgZnJvbSBzb21lIHJvb3QgdGhyZWFkIGluY2x1ZGluZyBhbGwgcm9vdCB0aHJlYWRzLAorICAgYW5kIHRob3NlIGluIHRoZSB0aHJlYWQgcG9vbCAqLworZXh0ZXJuIHZvbGF0aWxlIGludCBfX2ttcF9hbGxfbnRoOworZXh0ZXJuIGludCBfX2ttcF90aHJlYWRfcG9vbF9udGg7CitleHRlcm4gdm9sYXRpbGUgaW50IF9fa21wX3RocmVhZF9wb29sX2FjdGl2ZV9udGg7CisKK2V4dGVybiBrbXBfcm9vdF90ICoqX19rbXBfcm9vdDsgICAgICAgICAvKiByb290IG9mIHRocmVhZCBoaWVyYXJjaHkgKi8KKy8qIGVuZCBkYXRhIHByb3RlY3RlZCBieSBmb3JrL2pvaW4gbG9jayAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2V4dGVybiBrbXBfZ2xvYmFsX3QgIF9fa21wX2dsb2JhbDsgICAgICAgICAvKiBnbG9iYWwgc3RhdHVzICovCisKK2V4dGVybiBrbXBfaW5mb190IF9fa21wX21vbml0b3I7CitleHRlcm4gdm9sYXRpbGUga21wX3VpbnQzMiBfX2ttcF90ZWFtX2NvdW50ZXI7ICAgICAgLy8gVXNlZCBieSBEZWJ1Z2dpbmcgU3VwcG9ydCBMaWJyYXJ5LgorZXh0ZXJuIHZvbGF0aWxlIGttcF91aW50MzIgX19rbXBfdGFza19jb3VudGVyOyAgICAgIC8vIFVzZWQgYnkgRGVidWdnaW5nIFN1cHBvcnQgTGlicmFyeS4KKworI2lmIFVTRV9ERUJVR0dFUgorCisjZGVmaW5lIF9LTVBfR0VOX0lEKCBjb3VudGVyICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfX2ttcF9kZWJ1Z2dpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgID8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX1RFU1RfVEhFTl9JTkMzMiggKHZvbGF0aWxlIGttcF9pbnQzMiAqKSAmIGNvdW50ZXIgKSArIDEgICAgXAorICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH4gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICApCisjZWxzZQorI2RlZmluZSBfS01QX0dFTl9JRCggY291bnRlciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfiAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICkKKyNlbmRpZiAvKiBVU0VfREVCVUdHRVIgKi8KKworI2RlZmluZSBLTVBfR0VOX1RBU0tfSUQoKSAgICBfS01QX0dFTl9JRCggX19rbXBfdGFza19jb3VudGVyICkKKyNkZWZpbmUgS01QX0dFTl9URUFNX0lEKCkgICAgX0tNUF9HRU5fSUQoIF9fa21wX3RlYW1fY291bnRlciApCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2V4dGVybiB2b2lkIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIGludCBndGlkLCB2b2lkICpwMSwgdm9pZCogcDIsIHNpemVfdCBzaXplLCBjaGFyIGNvbnN0ICpmb3JtYXQsIC4uLiApOworCitleHRlcm4gdm9pZCBfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZSggdm9pZCApOworZXh0ZXJuIHZvaWQgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoIHZvaWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoIHZvaWQgKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfaW50ZXJuYWxfYmVnaW4oIHZvaWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5KCBpbnQgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZCggaW50IGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2ludGVybmFsX2VuZF9hdGV4aXQoIHZvaWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2ludGVybmFsX2VuZF9maW5pKCB2b2lkICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbnRlcm5hbF9lbmRfZHRvciggdm9pZCApOworZXh0ZXJuIHZvaWQgX19rbXBfaW50ZXJuYWxfZW5kX2Rlc3QoIHZvaWQqICk7CisKK2V4dGVybiBpbnQgIF9fa21wX3JlZ2lzdGVyX3Jvb3QoIGludCBpbml0aWFsX3RocmVhZCApOworZXh0ZXJuIHZvaWQgX19rbXBfdW5yZWdpc3Rlcl9yb290KCBpbnQgZ3RpZCApOworCitleHRlcm4gaW50ICBfX2ttcF9pZ25vcmVfbXBwYmVnKCB2b2lkICk7CitleHRlcm4gaW50ICBfX2ttcF9pZ25vcmVfbXBwZW5kKCB2b2lkICk7CisKK2V4dGVybiBpbnQgIF9fa21wX2VudGVyX3NpbmdsZSggaW50IGd0aWQsIGlkZW50X3QgKmlkX3JlZiwgaW50IHB1c2hfd3MgKTsKK2V4dGVybiB2b2lkIF9fa21wX2V4aXRfc2luZ2xlKCBpbnQgZ3RpZCApOworCitleHRlcm4gdm9pZCBfX2ttcF9wYXJhbGxlbF9kZW8oIGludCAqZ3RpZF9yZWYsIGludCAqY2lkX3JlZiwgaWRlbnRfdCAqbG9jX3JlZiApOworZXh0ZXJuIHZvaWQgX19rbXBfcGFyYWxsZWxfZHhvKCBpbnQgKmd0aWRfcmVmLCBpbnQgKmNpZF9yZWYsIGlkZW50X3QgKmxvY19yZWYgKTsKKworI2lmZGVmIFVTRV9MT0FEX0JBTEFOQ0UKK2V4dGVybiBpbnQgIF9fa21wX2dldF9sb2FkX2JhbGFuY2UoIGludCApOworI2VuZGlmCisKKyNpZmRlZiBCVUlMRF9UVgorZXh0ZXJuIHZvaWQgX19rbXBfdHZfdGhyZWFkcHJpdmF0ZV9zdG9yZSgga21wX2luZm9fdCAqdGgsIHZvaWQgKmdsb2JhbF9hZGRyLCB2b2lkICp0aHJlYWRfYWRkciApOworI2VuZGlmCisKK2V4dGVybiBpbnQgIF9fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkKCB2b2lkICk7CitleHRlcm4gaW50ICBfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZF9yZWcoIHZvaWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2V4aXRfdGhyZWFkKCBpbnQgZXhpdF9zdGF0dXMgKTsKK2V4dGVybiB2b2lkIF9fa21wX2Fib3J0KCBjaGFyIGNvbnN0ICogZm9ybWF0LCAuLi4gKTsKK2V4dGVybiB2b2lkIF9fa21wX2Fib3J0X3RocmVhZCggdm9pZCApOworZXh0ZXJuIHZvaWQgX19rbXBfYWJvcnRfcHJvY2Vzcyggdm9pZCApOworZXh0ZXJuIHZvaWQgX19rbXBfd2FybiggY2hhciBjb25zdCAqIGZvcm1hdCwgLi4uICk7CisKK2V4dGVybiB2b2lkIF9fa21wX3NldF9udW1fdGhyZWFkcyggaW50IG5ld19udGgsIGludCBndGlkICk7CisKKy8vIFJldHVybnMgY3VycmVudCB0aHJlYWQgKHBvaW50ZXIgdG8ga21wX2luZm9fdCkuIEN1cnJlbnQgdGhyZWFkICptdXN0KiBiZSByZWdpc3RlcmVkLgorc3RhdGljIGlubGluZSBrbXBfaW5mb190ICogX19rbXBfZW50cnlfdGhyZWFkKCkKK3sKKyAgICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworCisgICAgICByZXR1cm4gX19rbXBfdGhyZWFkc1tndGlkXTsKK30KKworZXh0ZXJuIHZvaWQgX19rbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzKCBpbnQgZ3RpZCwgaW50IG5ld19tYXhfYWN0aXZlX2xldmVscyApOworZXh0ZXJuIGludCAgX19rbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzKCBpbnQgZ3RpZCApOworZXh0ZXJuIGludCAgX19rbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0oIGludCBndGlkLCBpbnQgbGV2ZWwgKTsKK2V4dGVybiBpbnQgIF9fa21wX2dldF90ZWFtX3NpemUoIGludCBndGlkLCBpbnQgbGV2ZWwgKTsKK2V4dGVybiB2b2lkIF9fa21wX3NldF9zY2hlZHVsZSggaW50IGd0aWQsIGttcF9zY2hlZF90IG5ld19zY2hlZCwgaW50IGNodW5rICk7CitleHRlcm4gdm9pZCBfX2ttcF9nZXRfc2NoZWR1bGUoIGludCBndGlkLCBrbXBfc2NoZWRfdCAqIHNjaGVkLCBpbnQgKiBjaHVuayApOworCitleHRlcm4gdW5zaWduZWQgc2hvcnQgX19rbXBfZ2V0X3JhbmRvbSgga21wX2luZm9fdCAqIHRocmVhZCApOworZXh0ZXJuIHZvaWQgX19rbXBfaW5pdF9yYW5kb20oIGttcF9pbmZvX3QgKiB0aHJlYWQgKTsKKworZXh0ZXJuIGttcF9yX3NjaGVkX3QgX19rbXBfZ2V0X3NjaGVkdWxlX2dsb2JhbCggdm9pZCApOworZXh0ZXJuIHZvaWQgX19rbXBfYWRqdXN0X251bV90aHJlYWRzKCBpbnQgbmV3X25wcm9jICk7CisKK2V4dGVybiB2b2lkICogX19fa21wX2FsbG9jYXRlKCBzaXplX3Qgc2l6ZSBLTVBfU1JDX0xPQ19ERUNMICk7CitleHRlcm4gdm9pZCAqIF9fX2ttcF9wYWdlX2FsbG9jYXRlKCBzaXplX3Qgc2l6ZSBLTVBfU1JDX0xPQ19ERUNMICk7CitleHRlcm4gdm9pZCAgIF9fX2ttcF9mcmVlKCB2b2lkICogcHRyIEtNUF9TUkNfTE9DX0RFQ0wgKTsKKyNkZWZpbmUgX19rbXBfYWxsb2NhdGUoIHNpemUgKSAgICAgIF9fX2ttcF9hbGxvY2F0ZSggKHNpemUpIEtNUF9TUkNfTE9DX0NVUlIgKQorI2RlZmluZSBfX2ttcF9wYWdlX2FsbG9jYXRlKCBzaXplICkgX19fa21wX3BhZ2VfYWxsb2NhdGUoIChzaXplKSBLTVBfU1JDX0xPQ19DVVJSICkKKyNkZWZpbmUgX19rbXBfZnJlZSggcHRyICkgICAgICAgICAgIF9fX2ttcF9mcmVlKCAocHRyKSBLTVBfU1JDX0xPQ19DVVJSICkKKworI2lmIFVTRV9GQVNUX01FTU9SWQorZXh0ZXJuIHZvaWQgKiBfX19rbXBfZmFzdF9hbGxvY2F0ZSgga21wX2luZm9fdCAqdGhpc190aHIsIHNpemVfdCBzaXplIEtNUF9TUkNfTE9DX0RFQ0wgKTsKK2V4dGVybiB2b2lkICAgX19fa21wX2Zhc3RfZnJlZSgga21wX2luZm9fdCAqdGhpc190aHIsIHZvaWQgKnB0ciBLTVBfU1JDX0xPQ19ERUNMICk7CitleHRlcm4gdm9pZCAgIF9fa21wX2ZyZWVfZmFzdF9tZW1vcnkoIGttcF9pbmZvX3QgKnRoaXNfdGhyICk7CitleHRlcm4gdm9pZCAgIF9fa21wX2luaXRpYWxpemVfZmFzdF9tZW1vcnkoIGttcF9pbmZvX3QgKnRoaXNfdGhyICk7CisjZGVmaW5lIF9fa21wX2Zhc3RfYWxsb2NhdGUoIHRoaXNfdGhyLCBzaXplICkgX19fa21wX2Zhc3RfYWxsb2NhdGUoICh0aGlzX3RociksIChzaXplKSBLTVBfU1JDX0xPQ19DVVJSICkKKyNkZWZpbmUgX19rbXBfZmFzdF9mcmVlKCB0aGlzX3RociwgcHRyICkgICAgICBfX19rbXBfZmFzdF9mcmVlKCAodGhpc190aHIpLCAocHRyKSBLTVBfU1JDX0xPQ19DVVJSICkKKyNlbmRpZgorCitleHRlcm4gdm9pZCAqIF9fX2ttcF90aHJlYWRfbWFsbG9jKCBrbXBfaW5mb190ICp0aCwgc2l6ZV90IHNpemUgS01QX1NSQ19MT0NfREVDTCApOworZXh0ZXJuIHZvaWQgKiBfX19rbXBfdGhyZWFkX2NhbGxvYygga21wX2luZm9fdCAqdGgsIHNpemVfdCBuZWxlbSwgc2l6ZV90IGVsc2l6ZSBLTVBfU1JDX0xPQ19ERUNMICk7CitleHRlcm4gdm9pZCAqIF9fX2ttcF90aHJlYWRfcmVhbGxvYygga21wX2luZm9fdCAqdGgsIHZvaWQgKnB0ciwgc2l6ZV90IHNpemUgS01QX1NSQ19MT0NfREVDTCApOworZXh0ZXJuIHZvaWQgICBfX19rbXBfdGhyZWFkX2ZyZWUoIGttcF9pbmZvX3QgKnRoLCB2b2lkICpwdHIgS01QX1NSQ19MT0NfREVDTCApOworI2RlZmluZSBfX2ttcF90aHJlYWRfbWFsbG9jKCAgdGgsIHNpemUgKSAgICAgICAgICBfX19rbXBfdGhyZWFkX21hbGxvYyggICh0aCksIChzaXplKSAgICAgICAgICAgIEtNUF9TUkNfTE9DX0NVUlIgKQorI2RlZmluZSBfX2ttcF90aHJlYWRfY2FsbG9jKCAgdGgsIG5lbGVtLCBlbHNpemUgKSBfX19rbXBfdGhyZWFkX2NhbGxvYyggICh0aCksIChuZWxlbSksIChlbHNpemUpIEtNUF9TUkNfTE9DX0NVUlIgKQorI2RlZmluZSBfX2ttcF90aHJlYWRfcmVhbGxvYyggdGgsIHB0ciwgc2l6ZSApICAgICBfX19rbXBfdGhyZWFkX3JlYWxsb2MoICh0aCksIChwdHIpLCAoc2l6ZSkgICAgIEtNUF9TUkNfTE9DX0NVUlIgKQorI2RlZmluZSBfX2ttcF90aHJlYWRfZnJlZSggICAgdGgsIHB0ciApICAgICAgICAgICBfX19rbXBfdGhyZWFkX2ZyZWUoICAgICh0aCksIChwdHIpICAgICAgICAgICAgIEtNUF9TUkNfTE9DX0NVUlIgKQorCisjZGVmaW5lIEtNUF9JTlRFUk5BTF9NQUxMT0Moc3opICAgIG1hbGxvYyhzeikKKyNkZWZpbmUgS01QX0lOVEVSTkFMX0ZSRUUocCkgICAgICAgZnJlZShwKQorI2RlZmluZSBLTVBfSU5URVJOQUxfUkVBTExPQyhwLHN6KSByZWFsbG9jKChwKSwoc3opKQorI2RlZmluZSBLTVBfSU5URVJOQUxfQ0FMTE9DKG4sc3opICBjYWxsb2MoKG4pLChzeikpCisKK2V4dGVybiB2b2lkIF9fa21wX3B1c2hfbnVtX3RocmVhZHMoIGlkZW50X3QgKmxvYywgaW50IGd0aWQsIGludCBudW1fdGhyZWFkcyApOworCisjaWYgT01QXzQwX0VOQUJMRUQKK2V4dGVybiB2b2lkIF9fa21wX3B1c2hfcHJvY19iaW5kKCBpZGVudF90ICpsb2MsIGludCBndGlkLCBrbXBfcHJvY19iaW5kX3QgcHJvY19iaW5kICk7CitleHRlcm4gdm9pZCBfX2ttcF9wdXNoX251bV90ZWFtcyggaWRlbnRfdCAqbG9jLCBpbnQgZ3RpZCwgaW50IG51bV90ZWFtcywgaW50IG51bV90aHJlYWRzICk7CisjZW5kaWYKKworZXh0ZXJuIHZvaWQgX19rbXBfeWllbGQoIGludCBjb25kICk7CisKK2V4dGVybiB2b2lkIF9fa21wY19kaXNwYXRjaF9pbml0XzQoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLCBrbXBfaW50MzIgbGIsIGttcF9pbnQzMiB1Yiwga21wX2ludDMyIHN0LAorICAgIGttcF9pbnQzMiBjaHVuayApOworZXh0ZXJuIHZvaWQgX19rbXBjX2Rpc3BhdGNoX2luaXRfNHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLCBrbXBfdWludDMyIGxiLCBrbXBfdWludDMyIHViLCBrbXBfaW50MzIgc3QsCisgICAga21wX2ludDMyIGNodW5rICk7CitleHRlcm4gdm9pZCBfX2ttcGNfZGlzcGF0Y2hfaW5pdF84KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLAorICAgIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwga21wX2ludDY0IGxiLCBrbXBfaW50NjQgdWIsIGttcF9pbnQ2NCBzdCwKKyAgICBrbXBfaW50NjQgY2h1bmsgKTsKK2V4dGVybiB2b2lkIF9fa21wY19kaXNwYXRjaF9pbml0Xzh1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLAorICAgIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwga21wX3VpbnQ2NCBsYiwga21wX3VpbnQ2NCB1Yiwga21wX2ludDY0IHN0LAorICAgIGttcF9pbnQ2NCBjaHVuayApOworCitleHRlcm4gaW50IF9fa21wY19kaXNwYXRjaF9uZXh0XzQoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAga21wX2ludDMyICpwX2xhc3QsIGttcF9pbnQzMiAqcF9sYiwga21wX2ludDMyICpwX3ViLCBrbXBfaW50MzIgKnBfc3QgKTsKK2V4dGVybiBpbnQgX19rbXBjX2Rpc3BhdGNoX25leHRfNHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAga21wX2ludDMyICpwX2xhc3QsIGttcF91aW50MzIgKnBfbGIsIGttcF91aW50MzIgKnBfdWIsIGttcF9pbnQzMiAqcF9zdCApOworZXh0ZXJuIGludCBfX2ttcGNfZGlzcGF0Y2hfbmV4dF84KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLAorICAgIGttcF9pbnQzMiAqcF9sYXN0LCBrbXBfaW50NjQgKnBfbGIsIGttcF9pbnQ2NCAqcF91Yiwga21wX2ludDY0ICpwX3N0ICk7CitleHRlcm4gaW50IF9fa21wY19kaXNwYXRjaF9uZXh0Xzh1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLAorICAgIGttcF9pbnQzMiAqcF9sYXN0LCBrbXBfdWludDY0ICpwX2xiLCBrbXBfdWludDY0ICpwX3ViLCBrbXBfaW50NjQgKnBfc3QgKTsKKworZXh0ZXJuIHZvaWQgX19rbXBjX2Rpc3BhdGNoX2ZpbmlfNCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBjX2Rpc3BhdGNoX2ZpbmlfOCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBjX2Rpc3BhdGNoX2ZpbmlfNHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wY19kaXNwYXRjaF9maW5pXzh1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkICk7CisKKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorCitleHRlcm4gdm9pZCBfX2ttcF9hdXhfZGlzcGF0Y2hfaW5pdF80KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLAorICAgIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwga21wX2ludDMyIGxiLCBrbXBfaW50MzIgdWIsIGttcF9pbnQzMiBzdCwKKyAgICBrbXBfaW50MzIgY2h1bmssIGludCBwdXNoX3dzICk7CitleHRlcm4gdm9pZCBfX2ttcF9hdXhfZGlzcGF0Y2hfaW5pdF80dSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwKKyAgICBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsIGttcF91aW50MzIgbGIsIGttcF91aW50MzIgdWIsIGttcF9pbnQzMiBzdCwKKyAgICBrbXBfaW50MzIgY2h1bmssIGludCBwdXNoX3dzICk7CitleHRlcm4gdm9pZCBfX2ttcF9hdXhfZGlzcGF0Y2hfaW5pdF84KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLAorICAgIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwga21wX2ludDY0IGxiLCBrbXBfaW50NjQgdWIsIGttcF9pbnQ2NCBzdCwKKyAgICBrbXBfaW50NjQgY2h1bmssIGludCBwdXNoX3dzICk7CitleHRlcm4gdm9pZCBfX2ttcF9hdXhfZGlzcGF0Y2hfaW5pdF84dSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwKKyAgICBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsIGttcF91aW50NjQgbGIsIGttcF91aW50NjQgdWIsIGttcF9pbnQ2NCBzdCwKKyAgICBrbXBfaW50NjQgY2h1bmssIGludCBwdXNoX3dzICk7CitleHRlcm4gdm9pZCBfX2ttcF9hdXhfZGlzcGF0Y2hfZmluaV9jaHVua180KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9hdXhfZGlzcGF0Y2hfZmluaV9jaHVua184KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9hdXhfZGlzcGF0Y2hfZmluaV9jaHVua180dSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBfYXV4X2Rpc3BhdGNoX2ZpbmlfY2h1bmtfOHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQgKTsKKworI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCisKK2V4dGVybiBrbXBfdWludDMyIF9fa21wX2VxXzQoICBrbXBfdWludDMyIHZhbHVlLCBrbXBfdWludDMyIGNoZWNrZXIgKTsKK2V4dGVybiBrbXBfdWludDMyIF9fa21wX25lcV80KCBrbXBfdWludDMyIHZhbHVlLCBrbXBfdWludDMyIGNoZWNrZXIgKTsKK2V4dGVybiBrbXBfdWludDMyIF9fa21wX2x0XzQoICBrbXBfdWludDMyIHZhbHVlLCBrbXBfdWludDMyIGNoZWNrZXIgKTsKK2V4dGVybiBrbXBfdWludDMyIF9fa21wX2dlXzQoICBrbXBfdWludDMyIHZhbHVlLCBrbXBfdWludDMyIGNoZWNrZXIgKTsKK2V4dGVybiBrbXBfdWludDMyIF9fa21wX2xlXzQoICBrbXBfdWludDMyIHZhbHVlLCBrbXBfdWludDMyIGNoZWNrZXIgKTsKK2V4dGVybiBrbXBfdWludDMyIF9fa21wX3dhaXRfeWllbGRfNCgga21wX3VpbnQzMiB2b2xhdGlsZSAqIHNwaW5uZXIsIGttcF91aW50MzIgY2hlY2tlciwga21wX3VpbnQzMiAoKnByZWQpIChrbXBfdWludDMyLCBrbXBfdWludDMyKSwgdm9pZCAqIG9iaiApOworCitjbGFzcyBrbXBfZmxhZ18zMjsKK2NsYXNzIGttcF9mbGFnXzY0OworY2xhc3Mga21wX2ZsYWdfb25jb3JlOworZXh0ZXJuIHZvaWQgX19rbXBfd2FpdF8zMihrbXBfaW5mb190ICp0aGlzX3Rociwga21wX2ZsYWdfMzIgKmZsYWcsIGludCBmaW5hbF9zcGluCisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAgICAgICAgICAgICwgdm9pZCAqIGl0dF9zeW5jX29iagorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgKTsKK2V4dGVybiB2b2lkIF9fa21wX3JlbGVhc2VfMzIoa21wX2ZsYWdfMzIgKmZsYWcpOworZXh0ZXJuIHZvaWQgX19rbXBfd2FpdF82NChrbXBfaW5mb190ICp0aGlzX3Rociwga21wX2ZsYWdfNjQgKmZsYWcsIGludCBmaW5hbF9zcGluCisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAgICAgICAgICAgICwgdm9pZCAqIGl0dF9zeW5jX29iagorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgKTsKK2V4dGVybiB2b2lkIF9fa21wX3JlbGVhc2VfNjQoa21wX2ZsYWdfNjQgKmZsYWcpOworZXh0ZXJuIHZvaWQgX19rbXBfd2FpdF9vbmNvcmUoa21wX2luZm9fdCAqdGhpc190aHIsIGttcF9mbGFnX29uY29yZSAqZmxhZywgaW50IGZpbmFsX3NwaW4KKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICAgICAgICAgLCB2b2lkICogaXR0X3N5bmNfb2JqCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICApOworZXh0ZXJuIHZvaWQgX19rbXBfcmVsZWFzZV9vbmNvcmUoa21wX2ZsYWdfb25jb3JlICpmbGFnKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfaW5maW5pdGVfbG9vcCggdm9pZCApOworCitleHRlcm4gdm9pZCBfX2ttcF9jbGVhbnVwKCB2b2lkICk7CisKKyNpZiBLTVBfSEFORExFX1NJR05BTFMKKyAgICBleHRlcm4gaW50ICBfX2ttcF9oYW5kbGVfc2lnbmFsczsKKyAgICBleHRlcm4gdm9pZCBfX2ttcF9pbnN0YWxsX3NpZ25hbHMoIGludCBwYXJhbGxlbF9pbml0ICk7CisgICAgZXh0ZXJuIHZvaWQgX19rbXBfcmVtb3ZlX3NpZ25hbHMoIHZvaWQgKTsKKyNlbmRpZgorCitleHRlcm4gdm9pZCBfX2ttcF9jbGVhcl9zeXN0ZW1fdGltZSggdm9pZCApOworZXh0ZXJuIHZvaWQgX19rbXBfcmVhZF9zeXN0ZW1fdGltZSggZG91YmxlICpkZWx0YSApOworCitleHRlcm4gdm9pZCBfX2ttcF9jaGVja19zdGFja19vdmVybGFwKCBrbXBfaW5mb190ICp0aHIgKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfZXhwYW5kX2hvc3RfbmFtZSggY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSApOworZXh0ZXJuIHZvaWQgX19rbXBfZXhwYW5kX2ZpbGVfbmFtZSggY2hhciAqcmVzdWx0LCBzaXplX3QgcmxlbiwgY2hhciAqcGF0dGVybiApOworCisjaWYgS01QX09TX1dJTkRPV1MKK2V4dGVybiB2b2lkIF9fa21wX2luaXRpYWxpemVfc3lzdGVtX3RpY2soIHZvaWQgKTsgIC8qIEluaXRpYWxpemUgdGltZXIgdGljayB2YWx1ZSAqLworI2VuZGlmCisKK2V4dGVybiB2b2lkIF9fa21wX3J1bnRpbWVfaW5pdGlhbGl6ZSggdm9pZCApOyAgLyogbWFjaGluZSBzcGVjaWZpYyBpbml0aWFsaXphdGlvbiAqLworZXh0ZXJuIHZvaWQgX19rbXBfcnVudGltZV9kZXN0cm95KCB2b2lkICk7CisKKyNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECitleHRlcm4gY2hhciAqX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhjaGFyICpidWYsIGludCBidWZfbGVuLCBrbXBfYWZmaW5fbWFza190ICptYXNrKTsKK2V4dGVybiB2b2lkIF9fa21wX2FmZmluaXR5X2luaXRpYWxpemUodm9pZCk7CitleHRlcm4gdm9pZCBfX2ttcF9hZmZpbml0eV91bmluaXRpYWxpemUodm9pZCk7CitleHRlcm4gdm9pZCBfX2ttcF9hZmZpbml0eV9zZXRfaW5pdF9tYXNrKGludCBndGlkLCBpbnQgaXNhX3Jvb3QpOyAvKiBzZXQgYWZmaW5pdHkgYWNjb3JkaW5nIHRvIEtNUF9BRkZJTklUWSAqLworI2lmIE9NUF80MF9FTkFCTEVECitleHRlcm4gdm9pZCBfX2ttcF9hZmZpbml0eV9zZXRfcGxhY2UoaW50IGd0aWQpOworI2VuZGlmCitleHRlcm4gdm9pZCBfX2ttcF9hZmZpbml0eV9kZXRlcm1pbmVfY2FwYWJsZSggY29uc3QgY2hhciAqZW52X3ZhciApOworZXh0ZXJuIGludCBfX2ttcF9hdXhfc2V0X2FmZmluaXR5KHZvaWQgKiptYXNrKTsKK2V4dGVybiBpbnQgX19rbXBfYXV4X2dldF9hZmZpbml0eSh2b2lkICoqbWFzayk7CitleHRlcm4gaW50IF9fa21wX2F1eF9zZXRfYWZmaW5pdHlfbWFza19wcm9jKGludCBwcm9jLCB2b2lkICoqbWFzayk7CitleHRlcm4gaW50IF9fa21wX2F1eF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MoaW50IHByb2MsIHZvaWQgKiptYXNrKTsKK2V4dGVybiBpbnQgX19rbXBfYXV4X2dldF9hZmZpbml0eV9tYXNrX3Byb2MoaW50IHByb2MsIHZvaWQgKiptYXNrKTsKK2V4dGVybiB2b2lkIF9fa21wX2JhbGFuY2VkX2FmZmluaXR5KCBpbnQgdGlkLCBpbnQgdGVhbV9zaXplICk7CisjZW5kaWYgLyogS01QX0FGRklOSVRZX1NVUFBPUlRFRCAqLworCitleHRlcm4gdm9pZCBfX2ttcF9jbGVhbnVwX2hpZXJhcmNoeSgpOworZXh0ZXJuIHZvaWQgX19rbXBfZ2V0X2hpZXJhcmNoeShrbXBfdWludDMyIG5wcm9jLCBrbXBfYnN0YXRlX3QgKnRocl9iYXIpOworCisjaWYgS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KQorCitleHRlcm4gaW50IF9fa21wX2Z1dGV4X2RldGVybWluZV9jYXBhYmxlKCB2b2lkICk7CisKKyNlbmRpZiAvLyBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpCisKK2V4dGVybiB2b2lkIF9fa21wX2d0aWRfc2V0X3NwZWNpZmljKCBpbnQgZ3RpZCApOworZXh0ZXJuIGludCAgX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoIHZvaWQgKTsKKworZXh0ZXJuIGRvdWJsZSBfX2ttcF9yZWFkX2NwdV90aW1lKCB2b2lkICk7CisKK2V4dGVybiBpbnQgIF9fa21wX3JlYWRfc3lzdGVtX2luZm8oIHN0cnVjdCBrbXBfc3lzX2luZm8gKmluZm8gKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfY3JlYXRlX21vbml0b3IoIGttcF9pbmZvX3QgKnRoICk7CisKK2V4dGVybiB2b2lkICpfX2ttcF9sYXVuY2hfdGhyZWFkKCBrbXBfaW5mb190ICp0aHIgKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfY3JlYXRlX3dvcmtlciggaW50IGd0aWQsIGttcF9pbmZvX3QgKnRoLCBzaXplX3Qgc3RhY2tfc2l6ZSApOworCisjaWYgS01QX09TX1dJTkRPV1MKK2V4dGVybiBpbnQgIF9fa21wX3N0aWxsX3J1bm5pbmcoa21wX2luZm9fdCAqdGgpOworZXh0ZXJuIGludCAgX19rbXBfaXNfdGhyZWFkX2FsaXZlKCBrbXBfaW5mb190ICogdGgsIERXT1JEICpleGl0X3ZhbCApOworZXh0ZXJuIHZvaWQgX19rbXBfZnJlZV9oYW5kbGUoIGttcF90aHJlYWRfdCB0SGFuZGxlICk7CisjZW5kaWYKKworZXh0ZXJuIHZvaWQgX19rbXBfcmVhcF9tb25pdG9yKCBrbXBfaW5mb190ICp0aCApOworZXh0ZXJuIHZvaWQgX19rbXBfcmVhcF93b3JrZXIoIGttcF9pbmZvX3QgKnRoICk7CitleHRlcm4gdm9pZCBfX2ttcF90ZXJtaW5hdGVfdGhyZWFkKCBpbnQgZ3RpZCApOworCitleHRlcm4gdm9pZCBfX2ttcF9zdXNwZW5kXzMyKCBpbnQgdGhfZ3RpZCwga21wX2ZsYWdfMzIgKmZsYWcgKTsKK2V4dGVybiB2b2lkIF9fa21wX3N1c3BlbmRfNjQoIGludCB0aF9ndGlkLCBrbXBfZmxhZ182NCAqZmxhZyApOworZXh0ZXJuIHZvaWQgX19rbXBfc3VzcGVuZF9vbmNvcmUoIGludCB0aF9ndGlkLCBrbXBfZmxhZ19vbmNvcmUgKmZsYWcgKTsKK2V4dGVybiB2b2lkIF9fa21wX3Jlc3VtZV8zMiggaW50IHRhcmdldF9ndGlkLCBrbXBfZmxhZ18zMiAqZmxhZyApOworZXh0ZXJuIHZvaWQgX19rbXBfcmVzdW1lXzY0KCBpbnQgdGFyZ2V0X2d0aWQsIGttcF9mbGFnXzY0ICpmbGFnICk7CitleHRlcm4gdm9pZCBfX2ttcF9yZXN1bWVfb25jb3JlKCBpbnQgdGFyZ2V0X2d0aWQsIGttcF9mbGFnX29uY29yZSAqZmxhZyApOworCitleHRlcm4gdm9pZCBfX2ttcF9lbGFwc2VkKCBkb3VibGUgKiApOworZXh0ZXJuIHZvaWQgX19rbXBfZWxhcHNlZF90aWNrKCBkb3VibGUgKiApOworCitleHRlcm4gdm9pZCBfX2ttcF9lbmFibGUoIGludCBvbGRfc3RhdGUgKTsKK2V4dGVybiB2b2lkIF9fa21wX2Rpc2FibGUoIGludCAqb2xkX3N0YXRlICk7CisKK2V4dGVybiB2b2lkIF9fa21wX3RocmVhZF9zbGVlcCggaW50IG1pbGxpcyApOworCitleHRlcm4gdm9pZCBfX2ttcF9jb21tb25faW5pdGlhbGl6ZSggdm9pZCApOworZXh0ZXJuIHZvaWQgX19rbXBfY29tbW9uX2Rlc3Ryb3koIHZvaWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2NvbW1vbl9kZXN0cm95X2d0aWQoIGludCBndGlkICk7CisKKyNpZiBLTVBfT1NfVU5JWAorZXh0ZXJuIHZvaWQgX19rbXBfcmVnaXN0ZXJfYXRmb3JrKCB2b2lkICk7CisjZW5kaWYKK2V4dGVybiB2b2lkIF9fa21wX3N1c3BlbmRfaW5pdGlhbGl6ZSggdm9pZCApOworZXh0ZXJuIHZvaWQgX19rbXBfc3VzcGVuZF91bmluaXRpYWxpemVfdGhyZWFkKCBrbXBfaW5mb190ICp0aCApOworCitleHRlcm4ga21wX2luZm9fdCAqIF9fa21wX2FsbG9jYXRlX3RocmVhZCgga21wX3Jvb3RfdCAqcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdGVhbV90ICp0ZWFtLCBpbnQgdGlkKTsKKyNpZiBPTVBfNDBfRU5BQkxFRAorZXh0ZXJuIGttcF90ZWFtX3QgKiBfX2ttcF9hbGxvY2F0ZV90ZWFtKCBrbXBfcm9vdF90ICpyb290LCBpbnQgbmV3X25wcm9jLCBpbnQgbWF4X25wcm9jLAorI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2lkX3Qgb21wdF9wYXJhbGxlbF9pZCwKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfcHJvY19iaW5kX3QgcHJvY19iaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50ZXJuYWxfY29udHJvbF90ICpuZXdfaWN2cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZ2MgVVNFX05FU1RFRF9IT1RfQVJHKGttcF9pbmZvX3QgKnRocikgKTsKKyNlbHNlCitleHRlcm4ga21wX3RlYW1fdCAqIF9fa21wX2FsbG9jYXRlX3RlYW0oIGttcF9yb290X3QgKnJvb3QsIGludCBuZXdfbnByb2MsIGludCBtYXhfbnByb2MsCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBvbXB0X3BhcmFsbGVsX2lkLAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnRlcm5hbF9jb250cm9sX3QgKm5ld19pY3ZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJnYyBVU0VfTkVTVEVEX0hPVF9BUkcoa21wX2luZm9fdCAqdGhyKSApOworI2VuZGlmIC8vIE9NUF80MF9FTkFCTEVECitleHRlcm4gdm9pZCBfX2ttcF9mcmVlX3RocmVhZCgga21wX2luZm9fdCAqICk7CitleHRlcm4gdm9pZCBfX2ttcF9mcmVlX3RlYW0oIGttcF9yb290X3QgKiwga21wX3RlYW1fdCAqICBVU0VfTkVTVEVEX0hPVF9BUkcoa21wX2luZm9fdCAqKSApOworZXh0ZXJuIGttcF90ZWFtX3QgKiBfX2ttcF9yZWFwX3RlYW0oIGttcF90ZWFtX3QgKiApOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworZXh0ZXJuIHZvaWQgX19rbXBfaW5pdGlhbGl6ZV9iZ2V0KCBrbXBfaW5mb190ICp0aCApOworZXh0ZXJuIHZvaWQgX19rbXBfZmluYWxpemVfYmdldCgga21wX2luZm9fdCAqdGggKTsKKworS01QX0VYUE9SVCB2b2lkICprbXBjX21hbGxvYyggc2l6ZV90IHNpemUgKTsKK0tNUF9FWFBPUlQgdm9pZCAqa21wY19jYWxsb2MoIHNpemVfdCBuZWxlbSwgc2l6ZV90IGVsc2l6ZSApOworS01QX0VYUE9SVCB2b2lkICprbXBjX3JlYWxsb2MoIHZvaWQgKnB0ciwgc2l6ZV90IHNpemUgKTsKK0tNUF9FWFBPUlQgdm9pZCAga21wY19mcmVlKCB2b2lkICpwdHIgKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBkZWNsYXJhdGlvbnMgZm9yIGludGVybmFsIHVzZSAqLworCitleHRlcm4gaW50ICBfX2ttcF9iYXJyaWVyKCBlbnVtIGJhcnJpZXJfdHlwZSBidCwgaW50IGd0aWQsIGludCBpc19zcGxpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCByZWR1Y2Vfc2l6ZSwgdm9pZCAqcmVkdWNlX2RhdGEsIHZvaWQgKCpyZWR1Y2UpKHZvaWQgKiwgdm9pZCAqKSApOworZXh0ZXJuIHZvaWQgX19rbXBfZW5kX3NwbGl0X2JhcnJpZXIgKCBlbnVtIGJhcnJpZXJfdHlwZSBidCwgaW50IGd0aWQgKTsKKworLyohCisgKiBUZWxsIHRoZSBmb3JrIGNhbGwgd2hpY2ggY29tcGlsZXIgZ2VuZXJhdGVkIHRoZSBmb3JrIGNhbGwsIGFuZCB0aGVyZWZvcmUgaG93IHRvIGRlYWwgd2l0aCB0aGUgY2FsbC4KKyAqLworZW51bSBmb3JrX2NvbnRleHRfZQoreworICAgIGZvcmtfY29udGV4dF9nbnUsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBDYWxsZWQgZnJvbSBHTlUgZ2VuZXJhdGVkIGNvZGUsIHNvIG11c3Qgbm90IGludm9rZSB0aGUgbWljcm90YXNrIGludGVybmFsbHkuICovCisgICAgZm9ya19jb250ZXh0X2ludGVsLCAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IENhbGxlZCBmcm9tIEludGVsIGdlbmVyYXRlZCBjb2RlLiAgKi8KKyAgICBmb3JrX2NvbnRleHRfbGFzdAorfTsKK2V4dGVybiBpbnQgX19rbXBfZm9ya19jYWxsKCBpZGVudF90ICpsb2MsIGludCBndGlkLCBlbnVtIGZvcmtfY29udGV4dF9lIGZvcmtfY29udGV4dCwKKyAga21wX2ludDMyIGFyZ2MsCisjaWYgT01QVF9TVVBQT1JUCisgIHZvaWQgKnVud3JhcHBlZF90YXNrLAorI2VuZGlmCisgIG1pY3JvdGFza190IG1pY3JvdGFzaywgbGF1bmNoX3QgaW52b2tlciwKKy8qIFRPRE86IHJldmVydCB3b3JrYXJvdW5kIGZvciBJbnRlbChSKSA2NCB0cmFja2VyICM5NiAqLworI2lmIChLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FBUkNINjQpICYmIEtNUF9PU19MSU5VWAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0ICphcAorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKK2V4dGVybiB2b2lkIF9fa21wX2pvaW5fY2FsbCggaWRlbnRfdCAqbG9jLCBpbnQgZ3RpZAorI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBlbnVtIGZvcmtfY29udGV4dF9lIGZvcmtfY29udGV4dAorI2VuZGlmCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICwgaW50IGV4aXRfdGVhbXMgPSAwCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKK2V4dGVybiB2b2lkIF9fa21wX3NlcmlhbGl6ZWRfcGFyYWxsZWwoaWRlbnRfdCAqaWQsIGttcF9pbnQzMiBndGlkKTsKK2V4dGVybiB2b2lkIF9fa21wX2ludGVybmFsX2ZvcmsoIGlkZW50X3QgKmlkLCBpbnQgZ3RpZCwga21wX3RlYW1fdCAqdGVhbSApOworZXh0ZXJuIHZvaWQgX19rbXBfaW50ZXJuYWxfam9pbiggaWRlbnRfdCAqaWQsIGludCBndGlkLCBrbXBfdGVhbV90ICp0ZWFtICk7CitleHRlcm4gaW50IF9fa21wX2ludm9rZV90YXNrX2Z1bmMoIGludCBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9ydW5fYmVmb3JlX2ludm9rZWRfdGFzayggaW50IGd0aWQsIGludCB0aWQsIGttcF9pbmZvX3QgKnRoaXNfdGhyLCBrbXBfdGVhbV90ICp0ZWFtICk7CitleHRlcm4gdm9pZCBfX2ttcF9ydW5fYWZ0ZXJfaW52b2tlZF90YXNrKCBpbnQgZ3RpZCwgaW50IHRpZCwga21wX2luZm9fdCAqdGhpc190aHIsIGttcF90ZWFtX3QgKnRlYW0gKTsKKworLy8gc2hvdWxkIG5ldmVyIGhhdmUgYmVlbiBleHBvcnRlZAorS01QX0VYUE9SVCBpbnQgX19rbXBjX2ludm9rZV90YXNrX2Z1bmMoIGludCBndGlkICk7CisjaWYgT01QXzQwX0VOQUJMRUQKK2V4dGVybiBpbnQgIF9fa21wX2ludm9rZV90ZWFtc19tYXN0ZXIoIGludCBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF90ZWFtc19tYXN0ZXIoIGludCBndGlkICk7CisjZW5kaWYKK2V4dGVybiB2b2lkIF9fa21wX3NhdmVfaW50ZXJuYWxfY29udHJvbHMoIGttcF9pbmZvX3QgKiB0aHJlYWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX3VzZXJfc2V0X2xpYnJhcnkgKGVudW0gbGlicmFyeV90eXBlIGFyZyk7CitleHRlcm4gdm9pZCBfX2ttcF9hdXhfc2V0X2xpYnJhcnkgKGVudW0gbGlicmFyeV90eXBlIGFyZyk7CitleHRlcm4gdm9pZCBfX2ttcF9hdXhfc2V0X3N0YWNrc2l6ZSggc2l6ZV90IGFyZyk7CitleHRlcm4gdm9pZCBfX2ttcF9hdXhfc2V0X2Jsb2NrdGltZSAoaW50IGFyZywga21wX2luZm9fdCAqdGhyZWFkLCBpbnQgdGlkKTsKK2V4dGVybiB2b2lkIF9fa21wX2F1eF9zZXRfZGVmYXVsdHMoIGNoYXIgY29uc3QgKiBzdHIsIGludCBsZW4gKTsKKworLyogRnVuY3Rpb25zIGJlbG93IHB1dCBoZXJlIHRvIGNhbGwgdGhlbSBmcm9tIF9fa21wX2F1eF9lbnZfaW5pdGlhbGl6ZSgpIGluIGttcF9zZXR0aW5ncy5jICovCit2b2lkIGttcGNfc2V0X2Jsb2NrdGltZSAoaW50IGFyZyk7Cit2b2lkIG9tcGNfc2V0X25lc3RlZCggaW50IGZsYWcgKTsKK3ZvaWQgb21wY19zZXRfZHluYW1pYyggaW50IGZsYWcgKTsKK3ZvaWQgb21wY19zZXRfbnVtX3RocmVhZHMoIGludCBhcmcgKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfcHVzaF9jdXJyZW50X3Rhc2tfdG9fdGhyZWFkKCBrbXBfaW5mb190ICp0aGlzX3RociwKKyAgICAgICAgICAgICAgICAgIGttcF90ZWFtX3QgKnRlYW0sIGludCB0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX3BvcF9jdXJyZW50X3Rhc2tfZnJvbV90aHJlYWQoIGttcF9pbmZvX3QgKnRoaXNfdGhyICk7CitleHRlcm4ga21wX3Rhc2tfdCogX19rbXBfdGFza19hbGxvYyggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsCisgIGttcF90YXNraW5nX2ZsYWdzX3QgKmZsYWdzLCBzaXplX3Qgc2l6ZW9mX2ttcF90YXNrX3QsIHNpemVfdCBzaXplb2Zfc2hhcmVkcywKKyAga21wX3JvdXRpbmVfZW50cnlfdCB0YXNrX2VudHJ5ICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbml0X2ltcGxpY2l0X3Rhc2soIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbmZvX3QgKnRoaXNfdGhyLAorICAgICAgICAgICAgICAgICAga21wX3RlYW1fdCAqdGVhbSwgaW50IHRpZCwgaW50IHNldF9jdXJyX3Rhc2sgKTsKKworaW50IF9fa21wX2V4ZWN1dGVfdGFza3NfMzIoa21wX2luZm9fdCAqdGhyZWFkLCBrbXBfaW50MzIgZ3RpZCwga21wX2ZsYWdfMzIgKmZsYWcsIGludCBmaW5hbF9zcGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp0aHJlYWRfZmluaXNoZWQsCisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIGl0dF9zeW5jX29iaiwKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgaXNfY29uc3RyYWluZWQpOworaW50IF9fa21wX2V4ZWN1dGVfdGFza3NfNjQoa21wX2luZm9fdCAqdGhyZWFkLCBrbXBfaW50MzIgZ3RpZCwga21wX2ZsYWdfNjQgKmZsYWcsIGludCBmaW5hbF9zcGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp0aHJlYWRfZmluaXNoZWQsCisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIGl0dF9zeW5jX29iaiwKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgaXNfY29uc3RyYWluZWQpOworaW50IF9fa21wX2V4ZWN1dGVfdGFza3Nfb25jb3JlKGttcF9pbmZvX3QgKnRocmVhZCwga21wX2ludDMyIGd0aWQsIGttcF9mbGFnX29uY29yZSAqZmxhZywgaW50IGZpbmFsX3NwaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp0aHJlYWRfZmluaXNoZWQsCisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiBpdHRfc3luY19vYmosCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBpc19jb25zdHJhaW5lZCk7CisKK2V4dGVybiB2b2lkIF9fa21wX2ZyZWVfdGFza190ZWFtKCBrbXBfaW5mb190ICp0aHJlYWQsIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtICk7CitleHRlcm4gdm9pZCBfX2ttcF9yZWFwX3Rhc2tfdGVhbXMoIHZvaWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX3dhaXRfdG9fdW5yZWZfdGFza190ZWFtcyggdm9pZCApOworZXh0ZXJuIHZvaWQgX19rbXBfdGFza190ZWFtX3NldHVwICgga21wX2luZm9fdCAqdGhpc190aHIsIGttcF90ZWFtX3QgKnRlYW0sIGludCBhbHdheXMgKTsKK2V4dGVybiB2b2lkIF9fa21wX3Rhc2tfdGVhbV9zeW5jICAoIGttcF9pbmZvX3QgKnRoaXNfdGhyLCBrbXBfdGVhbV90ICp0ZWFtICk7CitleHRlcm4gdm9pZCBfX2ttcF90YXNrX3RlYW1fd2FpdCAgKCBrbXBfaW5mb190ICp0aGlzX3Rociwga21wX3RlYW1fdCAqdGVhbQorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgdm9pZCAqIGl0dF9zeW5jX29iagorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgaW50IHdhaXQ9MQorKTsKK2V4dGVybiB2b2lkIF9fa21wX3Rhc2tpbmdfYmFycmllcigga21wX3RlYW1fdCAqdGVhbSwga21wX2luZm9fdCAqdGhyZWFkLCBpbnQgZ3RpZCApOworCitleHRlcm4gaW50ICBfX2ttcF9pc19hZGRyZXNzX21hcHBlZCggdm9pZCAqYWRkciApOworZXh0ZXJuIGttcF91aW50NjQgX19rbXBfaGFyZHdhcmVfdGltZXN0YW1wKHZvaWQpOworCisjaWYgS01QX09TX1VOSVgKK2V4dGVybiBpbnQgIF9fa21wX3JlYWRfZnJvbV9maWxlKCBjaGFyIGNvbnN0ICpwYXRoLCBjaGFyIGNvbnN0ICpmb3JtYXQsIC4uLiApOworI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLy8KKy8vIEFzc2VtYmx5IHJvdXRpbmVzIHRoYXQgaGF2ZSBubyBjb21waWxlciBpbnRyaW5zaWMgcmVwbGFjZW1lbnQKKy8vCisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisKK2V4dGVybiB2b2lkICAgICAgIF9fa21wX3F1ZXJ5X2NwdWlkKCBrbXBfY3B1aW5mb190ICpwICk7CisKKyNkZWZpbmUgX19rbXBfbG9hZF9teGNzcihwKSBfbW1fc2V0Y3NyKCoocCkpCitzdGF0aWMgaW5saW5lIHZvaWQgX19rbXBfc3RvcmVfbXhjc3IoIGttcF91aW50MzIgKnAgKSB7ICpwID0gX21tX2dldGNzcigpOyB9CisKK2V4dGVybiB2b2lkIF9fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQoIGttcF9pbnQxNiAqcCApOworZXh0ZXJuIHZvaWQgX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQoIGttcF9pbnQxNiAqcCApOworZXh0ZXJuIHZvaWQgX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZCgpOworIyBkZWZpbmUgS01QX1g4Nl9NWENTUl9NQVNLICAgICAgMHhmZmZmZmZjMCAgIC8qIGlnbm9yZSBzdGF0dXMgZmxhZ3MgKDYgbHNiKSAqLworCisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCitleHRlcm4gaW50IF9fa21wX2ludm9rZV9taWNyb3Rhc2soIG1pY3JvdGFza190IHBrZm4sIGludCBndGlkLCBpbnQgbnByLCBpbnQgYXJnYywgdm9pZCAqYXJndltdCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgdm9pZCAqKmV4aXRfZnJhbWVfcHRyCisjZW5kaWYKKyk7CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK0tNUF9FWFBPUlQgdm9pZCAgIF9fa21wY19iZWdpbiAgICAgICAgICAgICAgICAoIGlkZW50X3QgKiwga21wX2ludDMyIGZsYWdzICk7CitLTVBfRVhQT1JUIHZvaWQgICBfX2ttcGNfZW5kICAgICAgICAgICAgICAgICAgKCBpZGVudF90ICogKTsKKworS01QX0VYUE9SVCB2b2lkICAgX19rbXBjX3RocmVhZHByaXZhdGVfcmVnaXN0ZXJfdmVjICggaWRlbnRfdCAqLCB2b2lkICogZGF0YSwga21wY19jdG9yX3ZlYyBjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBjX2NjdG9yX3ZlYyBjY3Rvciwga21wY19kdG9yX3ZlYyBkdG9yLCBzaXplX3QgdmVjdG9yX2xlbmd0aCApOworS01QX0VYUE9SVCB2b2lkICAgX19rbXBjX3RocmVhZHByaXZhdGVfcmVnaXN0ZXIgICAgICggaWRlbnRfdCAqLCB2b2lkICogZGF0YSwga21wY19jdG9yIGN0b3IsIGttcGNfY2N0b3IgY2N0b3IsIGttcGNfZHRvciBkdG9yICk7CitLTVBfRVhQT1JUIHZvaWQgKiBfX2ttcGNfdGhyZWFkcHJpdmF0ZSAgICAgICAgICAgICAgKCBpZGVudF90ICosIGttcF9pbnQzMiBnbG9iYWxfdGlkLCB2b2lkICogZGF0YSwgc2l6ZV90IHNpemUgKTsKKworS01QX0VYUE9SVCBrbXBfaW50MzIgIF9fa21wY19nbG9iYWxfdGhyZWFkX251bSAgKCBpZGVudF90ICogKTsKK0tNUF9FWFBPUlQga21wX2ludDMyICBfX2ttcGNfZ2xvYmFsX251bV90aHJlYWRzICggaWRlbnRfdCAqICk7CitLTVBfRVhQT1JUIGttcF9pbnQzMiAgX19rbXBjX2JvdW5kX3RocmVhZF9udW0gICAoIGlkZW50X3QgKiApOworS01QX0VYUE9SVCBrbXBfaW50MzIgIF9fa21wY19ib3VuZF9udW1fdGhyZWFkcyAgKCBpZGVudF90ICogKTsKKworS01QX0VYUE9SVCBrbXBfaW50MzIgIF9fa21wY19va190b19mb3JrICAgICAoIGlkZW50X3QgKiApOworS01QX0VYUE9SVCB2b2lkICAgX19rbXBjX2ZvcmtfY2FsbCAgICAgICAgICAoIGlkZW50X3QgKiwga21wX2ludDMyIG5hcmdzLCBrbXBjX21pY3JvIG1pY3JvdGFzaywgLi4uICk7CisKK0tNUF9FWFBPUlQgdm9pZCAgIF9fa21wY19zZXJpYWxpemVkX3BhcmFsbGVsICAgICAoIGlkZW50X3QgKiwga21wX2ludDMyIGdsb2JhbF90aWQgKTsKK0tNUF9FWFBPUlQgdm9pZCAgIF9fa21wY19lbmRfc2VyaWFsaXplZF9wYXJhbGxlbCAoIGlkZW50X3QgKiwga21wX2ludDMyIGdsb2JhbF90aWQgKTsKKworS01QX0VYUE9SVCB2b2lkICAgX19rbXBjX2ZsdXNoICAgICAgICAgICAgICAoIGlkZW50X3QgKik7CitLTVBfRVhQT1JUIHZvaWQgICBfX2ttcGNfYmFycmllciAgICAgICAgICAgICggaWRlbnRfdCAqLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApOworS01QX0VYUE9SVCBrbXBfaW50MzIgIF9fa21wY19tYXN0ZXIgICAgICAgICAoIGlkZW50X3QgKiwga21wX2ludDMyIGdsb2JhbF90aWQgKTsKK0tNUF9FWFBPUlQgdm9pZCAgIF9fa21wY19lbmRfbWFzdGVyICAgICAgICAgKCBpZGVudF90ICosIGttcF9pbnQzMiBnbG9iYWxfdGlkICk7CitLTVBfRVhQT1JUIHZvaWQgICBfX2ttcGNfb3JkZXJlZCAgICAgICAgICAgICggaWRlbnRfdCAqLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApOworS01QX0VYUE9SVCB2b2lkICAgX19rbXBjX2VuZF9vcmRlcmVkICAgICAgICAoIGlkZW50X3QgKiwga21wX2ludDMyIGdsb2JhbF90aWQgKTsKK0tNUF9FWFBPUlQgdm9pZCAgIF9fa21wY19jcml0aWNhbCAgICAgICAgICAgKCBpZGVudF90ICosIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBfY3JpdGljYWxfbmFtZSAqICk7CitLTVBfRVhQT1JUIHZvaWQgICBfX2ttcGNfZW5kX2NyaXRpY2FsICAgICAgICggaWRlbnRfdCAqLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wX2NyaXRpY2FsX25hbWUgKiApOworCisjaWYgT01QXzQxX0VOQUJMRUQKK0tNUF9FWFBPUlQgdm9pZCAgIF9fa21wY19jcml0aWNhbF93aXRoX2hpbnQgKCBpZGVudF90ICosIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBfY3JpdGljYWxfbmFtZSAqLCB1aW50cHRyX3QgaGludCApOworI2VuZGlmCisKK0tNUF9FWFBPUlQga21wX2ludDMyICBfX2ttcGNfYmFycmllcl9tYXN0ZXIgKCBpZGVudF90ICosIGttcF9pbnQzMiBnbG9iYWxfdGlkICk7CitLTVBfRVhQT1JUIHZvaWQgICBfX2ttcGNfZW5kX2JhcnJpZXJfbWFzdGVyICggaWRlbnRfdCAqLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApOworCitLTVBfRVhQT1JUIGttcF9pbnQzMiAgX19rbXBjX2JhcnJpZXJfbWFzdGVyX25vd2FpdCAoIGlkZW50X3QgKiwga21wX2ludDMyIGdsb2JhbF90aWQgKTsKKworS01QX0VYUE9SVCBrbXBfaW50MzIgIF9fa21wY19zaW5nbGUgICAgICAgICAoIGlkZW50X3QgKiwga21wX2ludDMyIGdsb2JhbF90aWQgKTsKK0tNUF9FWFBPUlQgdm9pZCAgIF9fa21wY19lbmRfc2luZ2xlICAgICAgICAgKCBpZGVudF90ICosIGttcF9pbnQzMiBnbG9iYWxfdGlkICk7CisKK0tNUF9FWFBPUlQgdm9pZCBLTVBDX0ZPUl9TVEFUSUNfSU5JVCAgICAoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcF9pbnQzMiBzY2hlZHR5cGUsIGttcF9pbnQzMiAqcGxhc3RpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludCAqcGxvd2VyLCBrbXBfaW50ICpwdXBwZXIsIGttcF9pbnQgKnBzdHJpZGUsIGttcF9pbnQgaW5jciwga21wX2ludCBjaHVuayApOworCitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX2Zvcl9zdGF0aWNfZmluaSAgKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkICk7CisKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfY29weXByaXZhdGUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIHNpemVfdCBjcHlfc2l6ZSwgdm9pZCAqY3B5X2RhdGEsIHZvaWQoKmNweV9mdW5jKSh2b2lkKix2b2lkKiksIGttcF9pbnQzMiBkaWRpdCApOworCitleHRlcm4gdm9pZCBLTVBDX1NFVF9OVU1fVEhSRUFEUyAgICAgICAgKCBpbnQgYXJnICk7CitleHRlcm4gdm9pZCBLTVBDX1NFVF9EWU5BTUlDICAgICAgICAgICAgKCBpbnQgZmxhZyApOworZXh0ZXJuIHZvaWQgS01QQ19TRVRfTkVTVEVEICAgICAgICAgICAgICggaW50IGZsYWcgKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBUYXNrcSBpbnRlcmZhY2Ugcm91dGluZXMKKyAqLworCitLTVBfRVhQT1JUIGttcGNfdGh1bmtfdCAqIF9fa21wY190YXNrcSAoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190YXNrX3QgdGFza3FfdGFzaywgc2l6ZV90IHNpemVvZl90aHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZW9mX3NoYXJlZHMsIGttcF9pbnQzMiBmbGFncywga21wY19zaGFyZWRfdmFyc190ICoqc2hhcmVkcyk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX2VuZF90YXNrcSAoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190aHVua190ICp0aHVuayk7CitLTVBfRVhQT1JUIGttcF9pbnQzMiBfX2ttcGNfdGFzayAoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190aHVua190ICp0aHVuayk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX3Rhc2txX3Rhc2sgKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcGNfdGh1bmtfdCAqdGh1bmssIGttcF9pbnQzMiBzdGF0dXMpOworS01QX0VYUE9SVCB2b2lkIF9fa21wY19lbmRfdGFza3FfdGFzayAoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190aHVua190ICp0aHVuayk7CitLTVBfRVhQT1JUIGttcGNfdGh1bmtfdCAqIF9fa21wY190YXNrX2J1ZmZlciAoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190aHVua190ICp0YXNrcV90aHVuaywga21wY190YXNrX3QgdGFzayk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogT01QIDMuMCB0YXNraW5nIGludGVyZmFjZSByb3V0aW5lcworICovCisKK0tNUF9FWFBPUlQga21wX2ludDMyCitfX2ttcGNfb21wX3Rhc2soIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICogbmV3X3Rhc2sgKTsKK0tNUF9FWFBPUlQga21wX3Rhc2tfdCoKK19fa21wY19vbXBfdGFza19hbGxvYyggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemVvZl9rbXBfdGFza190LCBzaXplX3Qgc2l6ZW9mX3NoYXJlZHMsCisgICAgICAgICAgICAgICAgICAgICAgIGttcF9yb3V0aW5lX2VudHJ5X3QgdGFza19lbnRyeSApOworS01QX0VYUE9SVCB2b2lkCitfX2ttcGNfb21wX3Rhc2tfYmVnaW5faWYwKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqIHRhc2sgKTsKK0tNUF9FWFBPUlQgdm9pZAorX19rbXBjX29tcF90YXNrX2NvbXBsZXRlX2lmMCggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKnRhc2sgKTsKK0tNUF9FWFBPUlQga21wX2ludDMyCitfX2ttcGNfb21wX3Rhc2tfcGFydHMoIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICogbmV3X3Rhc2sgKTsKK0tNUF9FWFBPUlQga21wX2ludDMyCitfX2ttcGNfb21wX3Rhc2t3YWl0KCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCApOworCitLTVBfRVhQT1JUIGttcF9pbnQzMgorX19rbXBjX29tcF90YXNreWllbGQoIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBpbnQgZW5kX3BhcnQgKTsKKworI2lmIFRBU0tfVU5VU0VECit2b2lkIF9fa21wY19vbXBfdGFza19iZWdpbiggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKiB0YXNrICk7Cit2b2lkIF9fa21wY19vbXBfdGFza19jb21wbGV0ZSggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKnRhc2sgKTsKKyNlbmRpZiAvLyBUQVNLX1VOVVNFRAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIE9NUF80MF9FTkFCTEVECisKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfdGFza2dyb3VwKCBpZGVudF90ICogbG9jLCBpbnQgZ3RpZCApOworS01QX0VYUE9SVCB2b2lkIF9fa21wY19lbmRfdGFza2dyb3VwKCBpZGVudF90ICogbG9jLCBpbnQgZ3RpZCApOworCitLTVBfRVhQT1JUIGttcF9pbnQzMiBfX2ttcGNfb21wX3Rhc2tfd2l0aF9kZXBzICggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKiBuZXdfdGFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgbmRlcHMsIGttcF9kZXBlbmRfaW5mb190ICpkZXBfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgbmRlcHNfbm9hbGlhcywga21wX2RlcGVuZF9pbmZvX3QgKm5vYWxpYXNfZGVwX2xpc3QgKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfb21wX3dhaXRfZGVwcyAoIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgbmRlcHMsIGttcF9kZXBlbmRfaW5mb190ICpkZXBfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBuZGVwc19ub2FsaWFzLCBrbXBfZGVwZW5kX2luZm9fdCAqbm9hbGlhc19kZXBfbGlzdCApOworZXh0ZXJuIHZvaWQgX19rbXBfcmVsZWFzZV9kZXBzICgga21wX2ludDMyIGd0aWQsIGttcF90YXNrZGF0YV90ICp0YXNrICk7CisKK2V4dGVybiBrbXBfaW50MzIgX19rbXBfb21wX3Rhc2soIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICogbmV3X3Rhc2ssIGJvb2wgc2VyaWFsaXplX2ltbWVkaWF0ZSApOworCitLTVBfRVhQT1JUIGttcF9pbnQzMiBfX2ttcGNfY2FuY2VsKGlkZW50X3QqIGxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgY25jbF9raW5kKTsKK0tNUF9FWFBPUlQga21wX2ludDMyIF9fa21wY19jYW5jZWxsYXRpb25wb2ludChpZGVudF90KiBsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyIGNuY2xfa2luZCk7CitLTVBfRVhQT1JUIGttcF9pbnQzMiBfX2ttcGNfY2FuY2VsX2JhcnJpZXIoaWRlbnRfdCogbG9jX3JlZiwga21wX2ludDMyIGd0aWQpOworS01QX0VYUE9SVCBpbnQgX19rbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMoaW50IGNhbmNlbF9raW5kKTsKKworI2lmIE9NUF80MV9FTkFCTEVECisKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfcHJveHlfdGFza19jb21wbGV0ZWQoIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICpwdGFzayApOworS01QX0VYUE9SVCB2b2lkIF9fa21wY19wcm94eV90YXNrX2NvbXBsZXRlZF9vb28gKCBrbXBfdGFza190ICpwdGFzayApOworCisjZW5kaWYKKworI2VuZGlmCisKKworLyoKKyAqIExvY2sgaW50ZXJmYWNlIHJvdXRpbmVzIChmYXN0IHZlcnNpb25zIHdpdGggZ3RpZCBwYXNzZWQgaW4pCisgKi8KK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfaW5pdF9sb2NrKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCAgdm9pZCAqKnVzZXJfbG9jayApOworS01QX0VYUE9SVCB2b2lkIF9fa21wY19pbml0X25lc3RfbG9jayggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKnVzZXJfbG9jayApOworS01QX0VYUE9SVCB2b2lkIF9fa21wY19kZXN0cm95X2xvY2soIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKip1c2VyX2xvY2sgKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfZGVzdHJveV9uZXN0X2xvY2soIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKip1c2VyX2xvY2sgKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfc2V0X2xvY2soIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKip1c2VyX2xvY2sgKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfc2V0X25lc3RfbG9jayggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKnVzZXJfbG9jayApOworS01QX0VYUE9SVCB2b2lkIF9fa21wY191bnNldF9sb2NrKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCB2b2lkICoqdXNlcl9sb2NrICk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX3Vuc2V0X25lc3RfbG9jayggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKnVzZXJfbG9jayApOworS01QX0VYUE9SVCBpbnQgX19rbXBjX3Rlc3RfbG9jayggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKnVzZXJfbG9jayApOworS01QX0VYUE9SVCBpbnQgX19rbXBjX3Rlc3RfbmVzdF9sb2NrKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCB2b2lkICoqdXNlcl9sb2NrICk7CisKKyNpZiBPTVBfNDFfRU5BQkxFRAorS01QX0VYUE9SVCB2b2lkIF9fa21wY19pbml0X2xvY2tfd2l0aF9oaW50KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCB2b2lkICoqdXNlcl9sb2NrLCB1aW50cHRyX3QgaGludCApOworS01QX0VYUE9SVCB2b2lkIF9fa21wY19pbml0X25lc3RfbG9ja193aXRoX2hpbnQoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKip1c2VyX2xvY2ssIHVpbnRwdHJfdCBoaW50ICk7CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBJbnRlcmZhY2UgdG8gZmFzdCBzY2FsYWJsZSByZWR1Y2UgbWV0aG9kcyByb3V0aW5lcworICovCisKK0tNUF9FWFBPUlQga21wX2ludDMyIF9fa21wY19yZWR1Y2Vfbm93YWl0KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBudW1fdmFycywgc2l6ZV90IHJlZHVjZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnJlZHVjZV9kYXRhLCB2b2lkICgqcmVkdWNlX2Z1bmMpKHZvaWQgKmxoc19kYXRhLCB2b2lkICpyaHNfZGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2NyaXRpY2FsX25hbWUgKmxjayApOworS01QX0VYUE9SVCB2b2lkIF9fa21wY19lbmRfcmVkdWNlX25vd2FpdCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wX2NyaXRpY2FsX25hbWUgKmxjayApOworS01QX0VYUE9SVCBrbXBfaW50MzIgX19rbXBjX3JlZHVjZSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBudW1fdmFycywgc2l6ZV90IHJlZHVjZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcmVkdWNlX2RhdGEsIHZvaWQgKCpyZWR1Y2VfZnVuYykodm9pZCAqbGhzX2RhdGEsIHZvaWQgKnJoc19kYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9jcml0aWNhbF9uYW1lICpsY2sgKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfZW5kX3JlZHVjZSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wX2NyaXRpY2FsX25hbWUgKmxjayApOworCisvKgorICogaW50ZXJuYWwgZmFzdCByZWR1Y3Rpb24gcm91dGluZXMKKyAqLworCitleHRlcm4gUEFDS0VEX1JFRFVDVElPTl9NRVRIT0RfVAorX19rbXBfZGV0ZXJtaW5lX3JlZHVjdGlvbl9tZXRob2QoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIG51bV92YXJzLCBzaXplX3QgcmVkdWNlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcmVkdWNlX2RhdGEsIHZvaWQgKCpyZWR1Y2VfZnVuYykodm9pZCAqbGhzX2RhdGEsIHZvaWQgKnJoc19kYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfY3JpdGljYWxfbmFtZSAqbGNrICk7CisKKy8vIHRoaXMgZnVuY3Rpb24gaXMgZm9yIHRlc3Rpbmcgc2V0L2dldC9kZXRlcm1pbmUgcmVkdWNlIG1ldGhvZAorS01QX0VYUE9SVCBrbXBfaW50MzIgX19rbXBfZ2V0X3JlZHVjZV9tZXRob2QoIHZvaWQgKTsKKworS01QX0VYUE9SVCBrbXBfdWludDY0IF9fa21wY19nZXRfdGFza2lkKCk7CitLTVBfRVhQT1JUIGttcF91aW50NjQgX19rbXBjX2dldF9wYXJlbnRfdGFza2lkKCk7CisKKy8vIHRoaXMgZnVuY3Rpb24gZXhwb3J0ZWQgZm9yIHRlc3Rpbmcgb2YgS01QX1BMQUNFX1RIUkVBRFMgZnVuY3Rpb25hbGl0eQorS01QX0VYUE9SVCB2b2lkIF9fa21wY19wbGFjZV90aHJlYWRzKGludCxpbnQsaW50LGludCxpbnQpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvLyBDKysgcG9ydAorLy8gbWlzc2luZyAnZXh0ZXJuICJDIicgZGVjbGFyYXRpb25zCisKK0tNUF9FWFBPUlQga21wX2ludDMyIF9fa21wY19pbl9wYXJhbGxlbCggaWRlbnRfdCAqbG9jICk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX3BvcF9udW1fdGhyZWFkcyggIGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQgKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfcHVzaF9udW1fdGhyZWFkcyggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wX2ludDMyIG51bV90aHJlYWRzICk7CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorS01QX0VYUE9SVCB2b2lkIF9fa21wY19wdXNoX3Byb2NfYmluZCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwgaW50IHByb2NfYmluZCApOworS01QX0VYUE9SVCB2b2lkIF9fa21wY19wdXNoX251bV90ZWFtcyggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wX2ludDMyIG51bV90ZWFtcywga21wX2ludDMyIG51bV90aHJlYWRzICk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX2ZvcmtfdGVhbXMoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgYXJnYywga21wY19taWNybyBtaWNyb3Rhc2ssIC4uLik7CisKKyNlbmRpZgorCitLTVBfRVhQT1JUIHZvaWQqCitfX2ttcGNfdGhyZWFkcHJpdmF0ZV9jYWNoZWQoIGlkZW50X3QgKiBsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogZGF0YSwgc2l6ZV90IHNpemUsIHZvaWQgKioqIGNhY2hlICk7CisKKy8vIFN5bWJvbHMgZm9yIE1TIG11dHVhbCBkZXRlY3Rpb24uCitleHRlcm4gaW50IF9Zb3VfbXVzdF9saW5rX3dpdGhfZXhhY3RseV9vbmVfT3Blbk1QX2xpYnJhcnk7CitleHRlcm4gaW50IF9Zb3VfbXVzdF9saW5rX3dpdGhfSW50ZWxfT3Blbk1QX2xpYnJhcnk7CisjaWYgS01QX09TX1dJTkRPV1MgJiYgKCBLTVBfVkVSU0lPTl9NQUpPUiA+IDQgKQorICAgIGV4dGVybiBpbnQgX1lvdV9tdXN0X2xpbmtfd2l0aF9NaWNyb3NvZnRfT3Blbk1QX2xpYnJhcnk7CisjZW5kaWYKKworCisvLyBUaGUgcm91dGluZXMgYmVsb3cgYXJlIG5vdCBleHBvcnRlZC4KKy8vIENvbnNpZGVyIG1ha2luZyB0aGVtICdzdGF0aWMnIGluIGNvcnJlc3BvbmRpbmcgc291cmNlIGZpbGVzLgordm9pZAora21wX3RocmVhZHByaXZhdGVfaW5zZXJ0X3ByaXZhdGVfZGF0YSggaW50IGd0aWQsIHZvaWQgKnBjX2FkZHIsIHZvaWQgKmRhdGFfYWRkciwgc2l6ZV90IHBjX3NpemUgKTsKK3N0cnVjdCBwcml2YXRlX2NvbW1vbiAqCitrbXBfdGhyZWFkcHJpdmF0ZV9pbnNlcnQoIGludCBndGlkLCB2b2lkICpwY19hZGRyLCB2b2lkICpkYXRhX2FkZHIsIHNpemVfdCBwY19zaXplICk7CisKKy8vCisvLyBvbXBjXywga21wY18gZW50cmllcyBtb3ZlZCBmcm9tIG9tcC5oLgorLy8KKyNpZiBLTVBfT1NfV0lORE9XUworIyAgIGRlZmluZSBLTVBDX0NPTlZFTlRJT04gX19jZGVjbAorI2Vsc2UKKyMgICBkZWZpbmUgS01QQ19DT05WRU5USU9OCisjZW5kaWYKKworI2lmbmRlZiBfX09NUF9ICit0eXBlZGVmIGVudW0gb21wX3NjaGVkX3QgeworICAgIG9tcF9zY2hlZF9zdGF0aWMgID0gMSwKKyAgICBvbXBfc2NoZWRfZHluYW1pYyA9IDIsCisgICAgb21wX3NjaGVkX2d1aWRlZCAgPSAzLAorICAgIG9tcF9zY2hlZF9hdXRvICAgID0gNAorfSBvbXBfc2NoZWRfdDsKK3R5cGVkZWYgdm9pZCAqIGttcF9hZmZpbml0eV9tYXNrX3Q7CisjZW5kaWYKKworS01QX0VYUE9SVCB2b2lkIEtNUENfQ09OVkVOVElPTiBvbXBjX3NldF9tYXhfYWN0aXZlX2xldmVscyhpbnQpOworS01QX0VYUE9SVCB2b2lkIEtNUENfQ09OVkVOVElPTiBvbXBjX3NldF9zY2hlZHVsZShvbXBfc2NoZWRfdCwgaW50KTsKK0tNUF9FWFBPUlQgaW50ICBLTVBDX0NPTlZFTlRJT04gb21wY19nZXRfYW5jZXN0b3JfdGhyZWFkX251bShpbnQpOworS01QX0VYUE9SVCBpbnQgIEtNUENfQ09OVkVOVElPTiBvbXBjX2dldF90ZWFtX3NpemUoaW50KTsKK0tNUF9FWFBPUlQgaW50ICBLTVBDX0NPTlZFTlRJT04ga21wY19zZXRfYWZmaW5pdHlfbWFza19wcm9jKGludCwga21wX2FmZmluaXR5X21hc2tfdCAqKTsKK0tNUF9FWFBPUlQgaW50ICBLTVBDX0NPTlZFTlRJT04ga21wY191bnNldF9hZmZpbml0eV9tYXNrX3Byb2MoaW50LCBrbXBfYWZmaW5pdHlfbWFza190ICopOworS01QX0VYUE9SVCBpbnQgIEtNUENfQ09OVkVOVElPTiBrbXBjX2dldF9hZmZpbml0eV9tYXNrX3Byb2MoaW50LCBrbXBfYWZmaW5pdHlfbWFza190ICopOworCitLTVBfRVhQT1JUIHZvaWQgS01QQ19DT05WRU5USU9OIGttcGNfc2V0X3N0YWNrc2l6ZShpbnQpOworS01QX0VYUE9SVCB2b2lkIEtNUENfQ09OVkVOVElPTiBrbXBjX3NldF9zdGFja3NpemVfcyhzaXplX3QpOworS01QX0VYUE9SVCB2b2lkIEtNUENfQ09OVkVOVElPTiBrbXBjX3NldF9saWJyYXJ5KGludCk7CitLTVBfRVhQT1JUIHZvaWQgS01QQ19DT05WRU5USU9OIGttcGNfc2V0X2RlZmF1bHRzKGNoYXIgY29uc3QgKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBLTVBfSCAqLworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfYWZmaW5pdHkuY3BwIGIvZmluYWwvcnVudGltZS9zcmMva21wX2FmZmluaXR5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGM2ZjczCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2FmZmluaXR5LmNwcApAQCAtMCwwICsxLDQ3NzMgQEAKKy8qCisgKiBrbXBfYWZmaW5pdHkuY3BwIC0tIGFmZmluaXR5IG1hbmFnZW1lbnQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9pMThuLmgiCisjaW5jbHVkZSAia21wX2lvLmgiCisjaW5jbHVkZSAia21wX3N0ci5oIgorI2luY2x1ZGUgImttcF93cmFwcGVyX2dldHBpZC5oIgorI2luY2x1ZGUgImttcF9hZmZpbml0eS5oIgorCisvLyBTdG9yZSB0aGUgcmVhbCBvciBpbWFnaW5lZCBtYWNoaW5lIGhpZXJhcmNoeSBoZXJlCitzdGF0aWMgaGllcmFyY2h5X2luZm8gbWFjaGluZV9oaWVyYXJjaHk7CisKK3ZvaWQgX19rbXBfY2xlYW51cF9oaWVyYXJjaHkoKSB7CisgICAgbWFjaGluZV9oaWVyYXJjaHkuZmluaSgpOworfQorCit2b2lkIF9fa21wX2dldF9oaWVyYXJjaHkoa21wX3VpbnQzMiBucHJvYywga21wX2JzdGF0ZV90ICp0aHJfYmFyKSB7CisgICAga21wX3VpbnQzMiBkZXB0aDsKKyAgICAvLyBUaGUgdGVzdCBiZWxvdyBpcyB0cnVlIGlmIGFmZmluaXR5IGlzIGF2YWlsYWJsZSwgYnV0IHNldCB0byAibm9uZSIuIE5lZWQgdG8gaW5pdCBvbiBmaXJzdCB1c2Ugb2YgaGllcmFyY2hpY2FsIGJhcnJpZXIuCisgICAgaWYgKFRDUl8xKG1hY2hpbmVfaGllcmFyY2h5LnVuaW5pdGlhbGl6ZWQpKQorICAgICAgICBtYWNoaW5lX2hpZXJhcmNoeS5pbml0KE5VTEwsIG5wcm9jKTsKKworICAgIC8vIEFkanVzdCB0aGUgaGllcmFyY2h5IGluIGNhc2UgbnVtIHRocmVhZHMgZXhjZWVkcyBvcmlnaW5hbAorICAgIGlmIChucHJvYyA+IG1hY2hpbmVfaGllcmFyY2h5LmJhc2VfbnVtX3RocmVhZHMpCisgICAgICAgIG1hY2hpbmVfaGllcmFyY2h5LnJlc2l6ZShucHJvYyk7CisKKyAgICBkZXB0aCA9IG1hY2hpbmVfaGllcmFyY2h5LmRlcHRoOworICAgIEtNUF9ERUJVR19BU1NFUlQoZGVwdGggPiAwKTsKKworICAgIHRocl9iYXItPmRlcHRoID0gZGVwdGg7CisgICAgdGhyX2Jhci0+YmFzZV9sZWFmX2tpZHMgPSAoa21wX3VpbnQ4KW1hY2hpbmVfaGllcmFyY2h5Lm51bVBlckxldmVsWzBdLTE7CisgICAgdGhyX2Jhci0+c2tpcF9wZXJfbGV2ZWwgPSBtYWNoaW5lX2hpZXJhcmNoeS5za2lwUGVyTGV2ZWw7Cit9CisKKyNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisKKy8vCisvLyBQcmludCB0aGUgYWZmaW5pdHkgbWFzayB0byB0aGUgY2hhcmFjdGVyIGFycmF5IGluIGEgcHJldHR5IGZvcm1hdC4KKy8vCisjaWYgS01QX1VTRV9IV0xPQworY2hhciAqCitfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKGNoYXIgKmJ1ZiwgaW50IGJ1Zl9sZW4sIGttcF9hZmZpbl9tYXNrX3QgKm1hc2spCit7CisgICAgaW50IG51bV9jaGFyc190b193cml0ZSwgbnVtX2NoYXJzX3dyaXR0ZW47CisgICAgY2hhciogc2NhbjsKKyAgICBLTVBfQVNTRVJUKGJ1Zl9sZW4gPj0gNDApOworCisgICAgLy8gYnVmc2l6ZSBvZiAwIGp1c3QgcmV0cmlldmVzIHRoZSBuZWVkZWQgYnVmZmVyIHNpemUuCisgICAgbnVtX2NoYXJzX3RvX3dyaXRlID0gaHdsb2NfYml0bWFwX2xpc3Rfc25wcmludGYoYnVmLCAwLCAoaHdsb2NfYml0bWFwX3QpbWFzayk7CisKKyAgICAvLyBuZWVkICd7JywgInh4eHh4eHh4Li4ueHgiLCAnfScsICdcMCcgPSBudW1fY2hhcnNfdG9fd3JpdGUgKyAzIGJ5dGVzCisgICAgLy8gKiBudW1fY2hhcnNfdG9fd3JpdGUgcmV0dXJuZWQgYnkgaHdsb2NfYml0bWFwX2xpc3Rfc25wcmludGYgZG9lcyBub3QKKyAgICAvLyAgIHRha2UgaW50byBhY2NvdW50IHRoZSAnXDAnIGNoYXJhY3Rlci4KKyAgICBpZihod2xvY19iaXRtYXBfaXN6ZXJvKChod2xvY19iaXRtYXBfdCltYXNrKSkgeworICAgICAgICBLTVBfU05QUklOVEYoYnVmLCBidWZfbGVuLCAiezxlbXB0eT59Iik7CisgICAgfSBlbHNlIGlmKG51bV9jaGFyc190b193cml0ZSA8IGJ1Zl9sZW4gLSAzKSB7CisgICAgICAgIC8vIG5vIHByb2JsZW0gZml0dGluZyB0aGUgbWFzayBpbnRvIGJ1Zl9sZW4gbnVtYmVyIG9mIGNoYXJhY3RlcnMKKyAgICAgICAgYnVmWzBdID0gJ3snOworICAgICAgICAvLyB1c2UgYnVmX2xlbi0zIGJlY2F1c2Ugd2UgaGF2ZSB0aGUgdGhyZWUgY2hhcmFjdGVyczogJ3snICd9JyAnXDAnIHRvIGFkZCB0byB0aGUgYnVmZmVyCisgICAgICAgIG51bV9jaGFyc193cml0dGVuID0gaHdsb2NfYml0bWFwX2xpc3Rfc25wcmludGYoYnVmKzEsIGJ1Zl9sZW4tMywgKGh3bG9jX2JpdG1hcF90KW1hc2spOworICAgICAgICBidWZbbnVtX2NoYXJzX3dyaXR0ZW4rMV0gPSAnfSc7CisgICAgICAgIGJ1ZltudW1fY2hhcnNfd3JpdHRlbisyXSA9ICdcMCc7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gTmVlZCB0byB0cnVuY2F0ZSB0aGUgYWZmaW5pdHkgbWFzayBzdHJpbmcgYW5kIGFkZCBlbGxpcHNpcy4KKyAgICAgICAgLy8gVG8gZG8gdGhpcywgd2UgZmlyc3Qgd3JpdGUgb3V0IHRoZSAneycgKyBzdHIobWFzaykKKyAgICAgICAgYnVmWzBdID0gJ3snOworICAgICAgICBod2xvY19iaXRtYXBfbGlzdF9zbnByaW50ZihidWYrMSwgYnVmX2xlbi03LCAoaHdsb2NfYml0bWFwX3QpbWFzayk7CisgICAgICAgIC8vIHRoZW4sIHdoYXQgd2UgZG8gaGVyZSBpcyBnbyB0byB0aGUgN3RoIHRvIGxhc3QgY2hhcmFjdGVyLCB0aGVuIGdvIGJhY2t3YXJkcyB1bnRpbCB3ZSBhcmUgTk9UCisgICAgICAgIC8vIG9uIGEgZGlnaXQgdGhlbiB3cml0ZSAiLi4ufVwwIi4gIFRoaXMgd2F5IGl0IGlzIGEgY2xlYW4gZWxsaXBzaXMgYWRkaXRpb24gYW5kIHdlIGRvbid0CisgICAgICAgIC8vIG92ZXJ3cml0ZSBwYXJ0IG9mIGFuIGFmZmluaXR5IG51bWJlci4gaS5lLiwgd2UgYXZvaWQgc29tZXRoaW5nIGxpa2UgeyA0NSwgNjcsIDguLi59IGFuZCBnZXQKKyAgICAgICAgLy8geyA0NSwgNjcsLi4ufSBpbnN0ZWFkLgorICAgICAgICBzY2FuID0gYnVmICsgYnVmX2xlbiAtIDc7CisgICAgICAgIHdoaWxlKCpzY2FuID49ICcwJyAmJiAqc2NhbiA8PSAnOScgJiYgc2NhbiA+PSBidWYpCisgICAgICAgICAgICBzY2FuLS07CisgICAgICAgICooc2NhbisxKSA9ICcuJzsKKyAgICAgICAgKihzY2FuKzIpID0gJy4nOworICAgICAgICAqKHNjYW4rMykgPSAnLic7CisgICAgICAgICooc2Nhbis0KSA9ICd9JzsKKyAgICAgICAgKihzY2FuKzUpID0gJ1wwJzsKKyAgICB9CisgICAgcmV0dXJuIGJ1ZjsKK30KKyNlbHNlCitjaGFyICoKK19fa21wX2FmZmluaXR5X3ByaW50X21hc2soY2hhciAqYnVmLCBpbnQgYnVmX2xlbiwga21wX2FmZmluX21hc2tfdCAqbWFzaykKK3sKKyAgICBLTVBfQVNTRVJUKGJ1Zl9sZW4gPj0gNDApOworICAgIGNoYXIgKnNjYW4gPSBidWY7CisgICAgY2hhciAqZW5kID0gYnVmICsgYnVmX2xlbiAtIDE7CisKKyAgICAvLworICAgIC8vIEZpbmQgZmlyc3QgZWxlbWVudCAvIGNoZWNrIGZvciBlbXB0eSBzZXQuCisgICAgLy8KKyAgICBzaXplX3QgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgS01QX0NQVV9TRVRTSVpFOyBpKyspIHsKKyAgICAgICAgaWYgKEtNUF9DUFVfSVNTRVQoaSwgbWFzaykpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpID09IEtNUF9DUFVfU0VUU0laRSkgeworICAgICAgICBLTVBfU05QUklOVEYoc2NhbiwgZW5kLXNjYW4rMSwgIns8ZW1wdHk+fSIpOworICAgICAgICB3aGlsZSAoKnNjYW4gIT0gJ1wwJykgc2NhbisrOworICAgICAgICBLTVBfQVNTRVJUKHNjYW4gPD0gZW5kKTsKKyAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICB9CisKKyAgICBLTVBfU05QUklOVEYoc2NhbiwgZW5kLXNjYW4rMSwgInslbGQiLCAobG9uZylpKTsKKyAgICB3aGlsZSAoKnNjYW4gIT0gJ1wwJykgc2NhbisrOworICAgIGkrKzsKKyAgICBmb3IgKDsgaSA8IEtNUF9DUFVfU0VUU0laRTsgaSsrKSB7CisgICAgICAgIGlmICghIEtNUF9DUFVfSVNTRVQoaSwgbWFzaykpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQ2hlY2sgZm9yIGJ1ZmZlciBvdmVyZmxvdy4gIEEgc3RyaW5nIG9mIHRoZSBmb3JtICIsPG4+IiB3aWxsIGhhdmUKKyAgICAgICAgLy8gYXQgbW9zdCAxMCBjaGFyYWN0ZXJzLCBwbHVzIHdlIHdhbnQgdG8gbGVhdmUgcm9vbSB0byBwcmludCAiLC4uLn0iCisgICAgICAgIC8vIGlmIHRoZSBzZXQgaXMgdG9vIGxhcmdlIHRvIHByaW50IGZvciBhIHRvdGFsIG9mIDE1IGNoYXJhY3RlcnMuCisgICAgICAgIC8vIFdlIGFscmVhZHkgbGVmdCByb29tIGZvciAnXDAnIGluIHNldHRpbmcgZW5kLgorICAgICAgICAvLworICAgICAgICBpZiAoZW5kIC0gc2NhbiA8IDE1KSB7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIEtNUF9TTlBSSU5URihzY2FuLCBlbmQtc2NhbisxLCAiLCUtbGQiLCAobG9uZylpKTsKKyAgICAgICAgd2hpbGUgKCpzY2FuICE9ICdcMCcpIHNjYW4rKzsKKyAgICB9CisgICAgaWYgKGkgPCBLTVBfQ1BVX1NFVFNJWkUpIHsKKyAgICAgICAgS01QX1NOUFJJTlRGKHNjYW4sIGVuZC1zY2FuKzEsICAiLC4uLiIpOworICAgICAgICB3aGlsZSAoKnNjYW4gIT0gJ1wwJykgc2NhbisrOworICAgIH0KKyAgICBLTVBfU05QUklOVEYoc2NhbiwgZW5kLXNjYW4rMSwgIn0iKTsKKyAgICB3aGlsZSAoKnNjYW4gIT0gJ1wwJykgc2NhbisrOworICAgIEtNUF9BU1NFUlQoc2NhbiA8PSBlbmQpOworICAgIHJldHVybiBidWY7Cit9CisjZW5kaWYgLy8gS01QX1VTRV9IV0xPQworCisKK3ZvaWQKK19fa21wX2FmZmluaXR5X2VudGlyZV9tYWNoaW5lX21hc2soa21wX2FmZmluX21hc2tfdCAqbWFzaykKK3sKKyAgICBLTVBfQ1BVX1pFUk8obWFzayk7CisKKyMgaWYgS01QX0dST1VQX0FGRklOSVRZCisKKyAgICBpZiAoX19rbXBfbnVtX3Byb2NfZ3JvdXBzID4gMSkgeworICAgICAgICBpbnQgZ3JvdXA7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfR2V0QWN0aXZlUHJvY2Vzc29yQ291bnQgIT0gTlVMTCk7CisgICAgICAgIGZvciAoZ3JvdXAgPSAwOyBncm91cCA8IF9fa21wX251bV9wcm9jX2dyb3VwczsgZ3JvdXArKykgeworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBpbnQgbnVtID0gX19rbXBfR2V0QWN0aXZlUHJvY2Vzc29yQ291bnQoZ3JvdXApOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CisgICAgICAgICAgICAgICAgS01QX0NQVV9TRVQoaSArIGdyb3VwICogKENIQVJfQklUICogc2l6ZW9mKERXT1JEX1BUUikpLCBtYXNrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisKKyMgZW5kaWYgLyogS01QX0dST1VQX0FGRklOSVRZICovCisKKyAgICB7CisgICAgICAgIGludCBwcm9jOworICAgICAgICBmb3IgKHByb2MgPSAwOyBwcm9jIDwgX19rbXBfeHByb2M7IHByb2MrKykgeworICAgICAgICAgICAgS01QX0NQVV9TRVQocHJvYywgbWFzayk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vCisvLyBXaGVuIHNvcnRpbmcgYnkgbGFiZWxzLCBfX2ttcF9hZmZpbml0eV9hc3NpZ25fY2hpbGRfbnVtcygpIG11c3QgZmlyc3QgYmUKKy8vIGNhbGxlZCB0byByZW51bWJlciB0aGUgbGFiZWxzIGZyb20gWzAuLm5dIGFuZCBwbGFjZSB0aGVtIGludG8gdGhlIGNoaWxkX251bQorLy8gdmVjdG9yIG9mIHRoZSBhZGRyZXNzIG9iamVjdC4gIFRoaXMgaXMgZG9uZSBpbiBjYXNlIHRoZSBsYWJlbHMgdXNlZCBmb3IKKy8vIHRoZSBjaGlsZHJlbiBhdCBvbmUgbm9kZSBvZiB0aGUgaGllcmFyY2h5IGRpZmZlciBmcm9tIHRob3NlIHVzZWQgZm9yCisvLyBhbm90aGVyIG5vZGUgYXQgdGhlIHNhbWUgbGV2ZWwuICBFeGFtcGxlOiAgc3VwcG9zZSB0aGUgbWFjaGluZSBoYXMgMiBub2RlcworLy8gd2l0aCAyIHBhY2thZ2VzIGVhY2guICBUaGUgZmlyc3Qgbm9kZSBjb250YWlucyBwYWNrYWdlcyA2MDEgYW5kIDYwMiwgYW5kCisvLyBzZWNvbmQgbm9kZSBjb250YWlucyBwYWNrYWdlcyA2MDMgYW5kIDYwNC4gIElmIHdlIHRyeSB0byBzb3J0IHRoZSB0YWJsZQorLy8gZm9yICJzY2F0dGVyIiBhZmZpbml0eSwgdGhlIHRhYmxlIHdpbGwgc3RpbGwgYmUgc29ydGVkIDYwMSwgNjAyLCA2MDMsIDYwNAorLy8gYmVjYXVzZSB3ZSBhcmUgcGF5aW5nIGF0dGVudGlvbiB0byB0aGUgbGFiZWxzIHRoZW1zZWx2ZXMsIG5vdCB0aGUgb3JkaW5hbAorLy8gY2hpbGQgbnVtYmVycy4gIEJ5IHVzaW5nIHRoZSBjaGlsZCBudW1iZXJzIGluIHRoZSBzb3J0LCB0aGUgcmVzdWx0IGlzCisvLyB7MCwwfT02MDEsIHswLDF9PTYwMywgezEsMH09NjAyLCB7MSwxfT02MDQuCisvLworc3RhdGljIHZvaWQKK19fa21wX2FmZmluaXR5X2Fzc2lnbl9jaGlsZF9udW1zKEFkZHJVbnNQYWlyICphZGRyZXNzMm9zLAorICBpbnQgbnVtQWRkcnMpCit7CisgICAgS01QX0RFQlVHX0FTU0VSVChudW1BZGRycyA+IDApOworICAgIGludCBkZXB0aCA9IGFkZHJlc3Myb3MtPmZpcnN0LmRlcHRoOworICAgIHVuc2lnbmVkICpjb3VudHMgPSAodW5zaWduZWQgKilfX2ttcF9hbGxvY2F0ZShkZXB0aCAqIHNpemVvZih1bnNpZ25lZCkpOworICAgIHVuc2lnbmVkICpsYXN0TGFiZWwgPSAodW5zaWduZWQgKilfX2ttcF9hbGxvY2F0ZShkZXB0aAorICAgICAgKiBzaXplb2YodW5zaWduZWQpKTsKKyAgICBpbnQgbGFiQ3Q7CisgICAgZm9yIChsYWJDdCA9IDA7IGxhYkN0IDwgZGVwdGg7IGxhYkN0KyspIHsKKyAgICAgICAgYWRkcmVzczJvc1swXS5maXJzdC5jaGlsZE51bXNbbGFiQ3RdID0gY291bnRzW2xhYkN0XSA9IDA7CisgICAgICAgIGxhc3RMYWJlbFtsYWJDdF0gPSBhZGRyZXNzMm9zWzBdLmZpcnN0LmxhYmVsc1tsYWJDdF07CisgICAgfQorICAgIGludCBpOworICAgIGZvciAoaSA9IDE7IGkgPCBudW1BZGRyczsgaSsrKSB7CisgICAgICAgIGZvciAobGFiQ3QgPSAwOyBsYWJDdCA8IGRlcHRoOyBsYWJDdCsrKSB7CisgICAgICAgICAgICBpZiAoYWRkcmVzczJvc1tpXS5maXJzdC5sYWJlbHNbbGFiQ3RdICE9IGxhc3RMYWJlbFtsYWJDdF0pIHsKKyAgICAgICAgICAgICAgICBpbnQgbGFiQ3QyOworICAgICAgICAgICAgICAgIGZvciAobGFiQ3QyID0gbGFiQ3QgKyAxOyBsYWJDdDIgPCBkZXB0aDsgbGFiQ3QyKyspIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnRzW2xhYkN0Ml0gPSAwOworICAgICAgICAgICAgICAgICAgICBsYXN0TGFiZWxbbGFiQ3QyXSA9IGFkZHJlc3Myb3NbaV0uZmlyc3QubGFiZWxzW2xhYkN0Ml07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvdW50c1tsYWJDdF0rKzsKKyAgICAgICAgICAgICAgICBsYXN0TGFiZWxbbGFiQ3RdID0gYWRkcmVzczJvc1tpXS5maXJzdC5sYWJlbHNbbGFiQ3RdOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAobGFiQ3QgPSAwOyBsYWJDdCA8IGRlcHRoOyBsYWJDdCsrKSB7CisgICAgICAgICAgICBhZGRyZXNzMm9zW2ldLmZpcnN0LmNoaWxkTnVtc1tsYWJDdF0gPSBjb3VudHNbbGFiQ3RdOworICAgICAgICB9CisgICAgICAgIGZvciAoOyBsYWJDdCA8IChpbnQpQWRkcmVzczo6bWF4RGVwdGg7IGxhYkN0KyspIHsKKyAgICAgICAgICAgIGFkZHJlc3Myb3NbaV0uZmlyc3QuY2hpbGROdW1zW2xhYkN0XSA9IDA7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworLy8KKy8vIEFsbCBvZiB0aGUgX19rbXBfYWZmaW5pdHlfY3JlYXRlXypfbWFwKCkgcm91dGluZXMgc2hvdWxkIHNldAorLy8gX19rbXBfYWZmaW5pdHlfbWFza3MgdG8gYSB2ZWN0b3Igb2YgYWZmaW5pdHkgbWFzayBvYmplY3RzIG9mIGxlbmd0aAorLy8gX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzLCBpZiBfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUsIGFuZAorLy8gcmV0dXJuIHRoZSBudW1iZXIgb2YgbGV2ZWxzIGluIHRoZSBtYWNoaW5lIHRvcG9sb2d5IHRyZWUgKHplcm8gaWYKKy8vIF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSkuCisvLworLy8gQWxsIG9mIHRoZSBfX2ttcF9hZmZpbml0eV9jcmVhdGVfKl9tYXAoKSByb3V0aW5lcyBzaG91bGQgc2V0ICpmdWxsTWFzaworLy8gdG8gdGhlIGFmZmluaXR5IG1hc2sgZm9yIHRoZSBpbml0aWFsaXphdGlvbiB0aHJlYWQuICBUaGV5IG5lZWQgdG8gc2F2ZSBhbmQKKy8vIHJlc3RvcmUgdGhlIG1hc2ssIGFuZCBpdCBjb3VsZCBiZSBuZWVkZWQgbGF0ZXIsIHNvIHNhdmluZyBpdCBpcyBqdXN0IGFuCisvLyBvcHRpbWl6YXRpb24gdG8gYXZvaWQgY2FsbGluZyBrbXBfZ2V0X3N5c3RlbV9hZmZpbml0eSgpIGFnYWluLgorLy8KK3N0YXRpYyBrbXBfYWZmaW5fbWFza190ICpmdWxsTWFzayA9IE5VTEw7CisKK2ttcF9hZmZpbl9tYXNrX3QgKgorX19rbXBfYWZmaW5pdHlfZ2V0X2Z1bGxNYXNrKCkgeyByZXR1cm4gZnVsbE1hc2s7IH0KKworCitzdGF0aWMgaW50IG5Db3Jlc1BlclBrZywgblBhY2thZ2VzOworc3RhdGljIGludCBfX2ttcF9uVGhyZWFkc1BlckNvcmU7CisjaWZuZGVmIEtNUF9ERkxUX05USF9DT1JFUworc3RhdGljIGludCBfX2ttcF9uY29yZXM7CisjZW5kaWYKKworLy8KKy8vIF9fa21wX2FmZmluaXR5X3VuaWZvcm1fdG9wb2xvZ3koKSBkb2Vzbid0IHdvcmsgd2hlbiBjYWxsZWQgZnJvbQorLy8gcGxhY2VzIHdoaWNoIHN1cHBvcnQgYXJiaXRyYXJpbHkgbWFueSBsZXZlbHMgaW4gdGhlIG1hY2hpbmUgdG9wb2xvZ3kKKy8vIG1hcCwgaS5lLiB0aGUgbm9uLWRlZmF1bHQgY2FzZXMgaW4gX19rbXBfYWZmaW5pdHlfY3JlYXRlX2NwdWluZm9fbWFwKCkKKy8vIF9fa21wX2FmZmluaXR5X2NyZWF0ZV94MmFwaWNpZF9tYXAoKS4KKy8vCitpbmxpbmUgc3RhdGljIGJvb2wKK19fa21wX2FmZmluaXR5X3VuaWZvcm1fdG9wb2xvZ3koKQoreworICAgIHJldHVybiBfX2ttcF9hdmFpbF9wcm9jID09IChfX2ttcF9uVGhyZWFkc1BlckNvcmUgKiBuQ29yZXNQZXJQa2cgKiBuUGFja2FnZXMpOworfQorCisKKy8vCisvLyBQcmludCBvdXQgdGhlIGRldGFpbGVkIG1hY2hpbmUgdG9wb2xvZ3kgbWFwLCBpLmUuIHRoZSBwaHlzaWNhbCBsb2NhdGlvbnMKKy8vIG9mIGVhY2ggT1MgcHJvYy4KKy8vCitzdGF0aWMgdm9pZAorX19rbXBfYWZmaW5pdHlfcHJpbnRfdG9wb2xvZ3koQWRkclVuc1BhaXIgKmFkZHJlc3Myb3MsIGludCBsZW4sIGludCBkZXB0aCwKKyAgaW50IHBrZ0xldmVsLCBpbnQgY29yZUxldmVsLCBpbnQgdGhyZWFkTGV2ZWwpCit7CisgICAgaW50IHByb2M7CisKKyAgICBLTVBfSU5GT1JNKE9TUHJvY1RvUGh5c2ljYWxUaHJlYWRNYXAsICJLTVBfQUZGSU5JVFkiKTsKKyAgICBmb3IgKHByb2MgPSAwOyBwcm9jIDwgbGVuOyBwcm9jKyspIHsKKyAgICAgICAgaW50IGxldmVsOworICAgICAgICBrbXBfc3RyX2J1Zl90IGJ1ZjsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9pbml0KCZidWYpOworICAgICAgICBmb3IgKGxldmVsID0gMDsgbGV2ZWwgPCBkZXB0aDsgbGV2ZWwrKykgeworICAgICAgICAgICAgaWYgKGxldmVsID09IHRocmVhZExldmVsKSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiJXMgIiwgS01QX0kxOE5fU1RSKFRocmVhZCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobGV2ZWwgPT0gY29yZUxldmVsKSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiJXMgIiwgS01QX0kxOE5fU1RSKENvcmUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGxldmVsID09IHBrZ0xldmVsKSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiJXMgIiwgS01QX0kxOE5fU1RSKFBhY2thZ2UpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGxldmVsID4gcGtnTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICIlc18lZCAiLCBLTVBfSTE4Tl9TVFIoTm9kZSksCisgICAgICAgICAgICAgICAgICBsZXZlbCAtIHBrZ0xldmVsIC0gMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICJMJWQgIiwgbGV2ZWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiJWQgIiwKKyAgICAgICAgICAgICAgYWRkcmVzczJvc1twcm9jXS5maXJzdC5sYWJlbHNbbGV2ZWxdKTsKKyAgICAgICAgfQorICAgICAgICBLTVBfSU5GT1JNKE9TUHJvY01hcFRvUGFjaywgIktNUF9BRkZJTklUWSIsIGFkZHJlc3Myb3NbcHJvY10uc2Vjb25kLAorICAgICAgICAgIGJ1Zi5zdHIpOworICAgICAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoJmJ1Zik7CisgICAgfQorfQorCisjaWYgS01QX1VTRV9IV0xPQworc3RhdGljIGludAorX19rbXBfYWZmaW5pdHlfY3JlYXRlX2h3bG9jX21hcChBZGRyVW5zUGFpciAqKmFkZHJlc3Myb3MsCisgIGttcF9pMThuX2lkX3QgKmNvbnN0IG1zZ19pZCkKK3sKKyAgICAqYWRkcmVzczJvcyA9IE5VTEw7CisgICAgKm1zZ19pZCA9IGttcF9pMThuX251bGw7CisKKyAgICAvLworICAgIC8vIFNhdmUgdGhlIGFmZmluaXR5IG1hc2sgZm9yIHRoZSBjdXJyZW50IHRocmVhZC4KKyAgICAvLworICAgIGttcF9hZmZpbl9tYXNrX3QgKm9sZE1hc2s7CisgICAgS01QX0NQVV9BTExPQyhvbGRNYXNrKTsKKyAgICBfX2ttcF9nZXRfc3lzdGVtX2FmZmluaXR5KG9sZE1hc2ssIFRSVUUpOworCisgICAgdW5zaWduZWQgZGVwdGggPSBod2xvY190b3BvbG9neV9nZXRfZGVwdGgoX19rbXBfaHdsb2NfdG9wb2xvZ3kpOworICAgIGludCB0aHJlYWRMZXZlbCA9IGh3bG9jX2dldF90eXBlX2RlcHRoKF9fa21wX2h3bG9jX3RvcG9sb2d5LCBIV0xPQ19PQkpfUFUpOworICAgIGludCBjb3JlTGV2ZWwgPSBod2xvY19nZXRfdHlwZV9kZXB0aChfX2ttcF9od2xvY190b3BvbG9neSwgSFdMT0NfT0JKX0NPUkUpOworICAgIGludCBwa2dMZXZlbCA9IGh3bG9jX2dldF90eXBlX2RlcHRoKF9fa21wX2h3bG9jX3RvcG9sb2d5LCBIV0xPQ19PQkpfU09DS0VUKTsKKyAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSBuQ29yZXNQZXJQa2cgPSBuUGFja2FnZXMgPSAwOworCisgICAgLy8KKyAgICAvLyBUaGlzIG1ha2VzIGFuIGFzc3VtcHRpb24gYWJvdXQgdGhlIHRvcG9sb2d5IGJlaW5nIGZvdXIgbGV2ZWxzOgorICAgIC8vIG1hY2hpbmVzIC0+IHBhY2thZ2VzIC0+IGNvcmVzIC0+IGhhcmR3YXJlIHRocmVhZHMKKyAgICAvLworICAgIGh3bG9jX29ial90IGN1cnJlbnRfbGV2ZWxfaXRlcmF0b3IgPSBod2xvY19nZXRfcm9vdF9vYmooX19rbXBfaHdsb2NfdG9wb2xvZ3kpOworICAgIGh3bG9jX29ial90IGNoaWxkX2l0ZXJhdG9yOworICAgIGZvcihjaGlsZF9pdGVyYXRvciA9IGh3bG9jX2dldF9uZXh0X2NoaWxkKF9fa21wX2h3bG9jX3RvcG9sb2d5LCBjdXJyZW50X2xldmVsX2l0ZXJhdG9yLCBOVUxMKTsKKyAgICAgICAgY2hpbGRfaXRlcmF0b3IgIT0gTlVMTDsKKyAgICAgICAgY2hpbGRfaXRlcmF0b3IgPSBod2xvY19nZXRfbmV4dF9jaGlsZChfX2ttcF9od2xvY190b3BvbG9neSwgY3VycmVudF9sZXZlbF9pdGVyYXRvciwgY2hpbGRfaXRlcmF0b3IpKQorICAgIHsKKyAgICAgICAgblBhY2thZ2VzKys7CisgICAgfQorICAgIGN1cnJlbnRfbGV2ZWxfaXRlcmF0b3IgPSBod2xvY19nZXRfb2JqX2J5X2RlcHRoKF9fa21wX2h3bG9jX3RvcG9sb2d5LCBwa2dMZXZlbCwgMCk7CisgICAgZm9yKGNoaWxkX2l0ZXJhdG9yID0gaHdsb2NfZ2V0X25leHRfY2hpbGQoX19rbXBfaHdsb2NfdG9wb2xvZ3ksIGN1cnJlbnRfbGV2ZWxfaXRlcmF0b3IsIE5VTEwpOworICAgICAgICBjaGlsZF9pdGVyYXRvciAhPSBOVUxMOworICAgICAgICBjaGlsZF9pdGVyYXRvciA9IGh3bG9jX2dldF9uZXh0X2NoaWxkKF9fa21wX2h3bG9jX3RvcG9sb2d5LCBjdXJyZW50X2xldmVsX2l0ZXJhdG9yLCBjaGlsZF9pdGVyYXRvcikpCisgICAgeworICAgICAgICBuQ29yZXNQZXJQa2crKzsKKyAgICB9CisgICAgY3VycmVudF9sZXZlbF9pdGVyYXRvciA9IGh3bG9jX2dldF9vYmpfYnlfZGVwdGgoX19rbXBfaHdsb2NfdG9wb2xvZ3ksIGNvcmVMZXZlbCwgMCk7CisgICAgZm9yKGNoaWxkX2l0ZXJhdG9yID0gaHdsb2NfZ2V0X25leHRfY2hpbGQoX19rbXBfaHdsb2NfdG9wb2xvZ3ksIGN1cnJlbnRfbGV2ZWxfaXRlcmF0b3IsIE5VTEwpOworICAgICAgICBjaGlsZF9pdGVyYXRvciAhPSBOVUxMOworICAgICAgICBjaGlsZF9pdGVyYXRvciA9IGh3bG9jX2dldF9uZXh0X2NoaWxkKF9fa21wX2h3bG9jX3RvcG9sb2d5LCBjdXJyZW50X2xldmVsX2l0ZXJhdG9yLCBjaGlsZF9pdGVyYXRvcikpCisgICAgeworICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUrKzsKKyAgICB9CisKKyAgICBpZiAoISBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpKQorICAgIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gSGFjayB0byB0cnkgYW5kIGluZmVyIHRoZSBtYWNoaW5lIHRvcG9sb2d5IHVzaW5nIG9ubHkgdGhlIGRhdGEKKyAgICAgICAgLy8gYXZhaWxhYmxlIGZyb20gY3B1aWQgb24gdGhlIGN1cnJlbnQgdGhyZWFkLCBhbmQgX19rbXBfeHByb2MuCisgICAgICAgIC8vCisgICAgICAgIEtNUF9BU1NFUlQoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKTsKKworICAgICAgICBfX2ttcF9uY29yZXMgPSBfX2ttcF94cHJvYyAvIF9fa21wX25UaHJlYWRzUGVyQ29yZTsKKyAgICAgICAgblBhY2thZ2VzID0gKF9fa21wX3hwcm9jICsgbkNvcmVzUGVyUGtnIC0gMSkgLyBuQ29yZXNQZXJQa2c7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZk5vdENhcGFibGVVc2VMb2NDcHVpZEwxMSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgS01QX0lORk9STShBdmFpbGFibGVPU1Byb2MsICJLTVBfQUZGSU5JVFkiLCBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV91bmlmb3JtX3RvcG9sb2d5KCkpIHsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKFVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgS01QX0lORk9STShOb25Vbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBLTVBfSU5GT1JNKFRvcG9sb2d5LCAiS01QX0FGRklOSVRZIiwgblBhY2thZ2VzLCBuQ29yZXNQZXJQa2csCisgICAgICAgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSwgX19rbXBfbmNvcmVzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLworICAgIC8vIEFsbG9jYXRlIHRoZSBkYXRhIHN0cnVjdHVyZSB0byBiZSByZXR1cm5lZC4KKyAgICAvLworICAgIEFkZHJVbnNQYWlyICpyZXR2YWwgPSAoQWRkclVuc1BhaXIgKilfX2ttcF9hbGxvY2F0ZShzaXplb2YoQWRkclVuc1BhaXIpICogX19rbXBfYXZhaWxfcHJvYyk7CisKKyAgICB1bnNpZ25lZCBudW1faGFyZHdhcmVfdGhyZWFkcyA9IGh3bG9jX2dldF9uYm9ianNfYnlfZGVwdGgoX19rbXBfaHdsb2NfdG9wb2xvZ3ksIHRocmVhZExldmVsKTsKKyAgICB1bnNpZ25lZCBpOworICAgIGh3bG9jX29ial90IGhhcmR3YXJlX3RocmVhZF9pdGVyYXRvcjsKKyAgICBpbnQgbkFjdGl2ZVRocmVhZHMgPSAwOworICAgIGZvcihpPTA7aTxudW1faGFyZHdhcmVfdGhyZWFkcztpKyspIHsKKyAgICAgICAgaGFyZHdhcmVfdGhyZWFkX2l0ZXJhdG9yID0gaHdsb2NfZ2V0X29ial9ieV9kZXB0aChfX2ttcF9od2xvY190b3BvbG9neSwgdGhyZWFkTGV2ZWwsIGkpOworICAgICAgICBBZGRyZXNzIGFkZHIoMyk7CisgICAgICAgIGlmKCEgS01QX0NQVV9JU1NFVChpLCBmdWxsTWFzaykpIGNvbnRpbnVlOworICAgICAgICBhZGRyLmxhYmVsc1swXSA9IGhhcmR3YXJlX3RocmVhZF9pdGVyYXRvci0+cGFyZW50LT5wYXJlbnQtPmxvZ2ljYWxfaW5kZXg7CisgICAgICAgIGFkZHIubGFiZWxzWzFdID0gaGFyZHdhcmVfdGhyZWFkX2l0ZXJhdG9yLT5wYXJlbnQtPmxvZ2ljYWxfaW5kZXggJSBuQ29yZXNQZXJQa2c7CisgICAgICAgIGFkZHIubGFiZWxzWzJdID0gaGFyZHdhcmVfdGhyZWFkX2l0ZXJhdG9yLT5sb2dpY2FsX2luZGV4ICUgX19rbXBfblRocmVhZHNQZXJDb3JlOworICAgICAgICByZXR2YWxbbkFjdGl2ZVRocmVhZHNdID0gQWRkclVuc1BhaXIoYWRkciwgaGFyZHdhcmVfdGhyZWFkX2l0ZXJhdG9yLT5vc19pbmRleCk7CisgICAgICAgIG5BY3RpdmVUaHJlYWRzKys7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBJZiB0aGVyZSdzIG9ubHkgb25lIHRocmVhZCBjb250ZXh0IHRvIGJpbmQgdG8sIHJldHVybiBub3cuCisgICAgLy8KKyAgICBLTVBfQVNTRVJUKG5BY3RpdmVUaHJlYWRzID4gMCk7CisgICAgaWYgKG5BY3RpdmVUaHJlYWRzID09IDEpIHsKKyAgICAgICAgX19rbXBfbmNvcmVzID0gblBhY2thZ2VzID0gMTsKKyAgICAgICAgX19rbXBfblRocmVhZHNQZXJDb3JlID0gbkNvcmVzUGVyUGtnID0gMTsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgIGNoYXIgYnVmW0tNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTl07CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKGJ1ZiwgS01QX0FGRklOX01BU0tfUFJJTlRfTEVOLCBvbGRNYXNrKTsKKworICAgICAgICAgICAgS01QX0lORk9STShBZmZVc2luZ0h3bG9jLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrKSB7CisgICAgICAgICAgICAgICAgS01QX0lORk9STShJbml0T1NQcm9jU2V0UmVzcGVjdCwgIktNUF9BRkZJTklUWSIsIGJ1Zik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldE5vdFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBidWYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgS01QX0lORk9STShBdmFpbGFibGVPU1Byb2MsICJLTVBfQUZGSU5JVFkiLCBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgS01QX0lORk9STShUb3BvbG9neSwgIktNUF9BRkZJTklUWSIsIG5QYWNrYWdlcywgbkNvcmVzUGVyUGtnLAorICAgICAgICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUsIF9fa21wX25jb3Jlcyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKSB7CisgICAgICAgICAgICBfX2ttcF9mcmVlKHJldHZhbCk7CisgICAgICAgICAgICBLTVBfQ1BVX0ZSRUUob2xkTWFzayk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIEZvcm0gYW4gQWRkcmVzcyBvYmplY3Qgd2hpY2ggb25seSBpbmNsdWRlcyB0aGUgcGFja2FnZSBsZXZlbC4KKyAgICAgICAgLy8KKyAgICAgICAgQWRkcmVzcyBhZGRyKDEpOworICAgICAgICBhZGRyLmxhYmVsc1swXSA9IHJldHZhbFswXS5maXJzdC5sYWJlbHNbcGtnTGV2ZWwtMV07CisgICAgICAgIHJldHZhbFswXS5maXJzdCA9IGFkZHI7CisKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzIDwgMCkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X3RvcG9sb2d5KHJldHZhbCwgMSwgMSwgMCwgLTEsIC0xKTsKKyAgICAgICAgfQorCisgICAgICAgICphZGRyZXNzMm9zID0gcmV0dmFsOworICAgICAgICBLTVBfQ1BVX0ZSRUUob2xkTWFzayk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIC8vCisgICAgLy8gU29ydCB0aGUgdGFibGUgYnkgcGh5c2ljYWwgSWQuCisgICAgLy8KKyAgICBxc29ydChyZXR2YWwsIG5BY3RpdmVUaHJlYWRzLCBzaXplb2YoKnJldHZhbCksIF9fa21wX2FmZmluaXR5X2NtcF9BZGRyZXNzX2xhYmVscyk7CisKKyAgICAvLworICAgIC8vIFdoZW4gYWZmaW5pdHkgaXMgb2ZmLCB0aGlzIHJvdXRpbmUgd2lsbCBzdGlsbCBiZSBjYWxsZWQgdG8gc2V0CisgICAgLy8gX19rbXBfbmNvcmVzLCBhcyB3ZWxsIGFzIF9fa21wX25UaHJlYWRzUGVyQ29yZSwKKyAgICAvLyBuQ29yZXNQZXJQa2csICYgblBhY2thZ2VzLiAgTWFrZSBzdXJlIGFsbCB0aGVzZSB2YXJzIGFyZSBzZXQKKyAgICAvLyBjb3JyZWN0bHksIGFuZCByZXR1cm4gaWYgYWZmaW5pdHkgaXMgbm90IGVuYWJsZWQuCisgICAgLy8KKyAgICBfX2ttcF9uY29yZXMgPSBod2xvY19nZXRfbmJvYmpzX2J5X2RlcHRoKF9fa21wX2h3bG9jX3RvcG9sb2d5LCBjb3JlTGV2ZWwpOworCisgICAgLy8KKyAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIG1hY2hpbmUgdG9wb2xvZ3kgaXMgdW5pZm9ybQorICAgIC8vCisgICAgdW5zaWduZWQgbnBhY2thZ2VzID0gaHdsb2NfZ2V0X25ib2Jqc19ieV9kZXB0aChfX2ttcF9od2xvY190b3BvbG9neSwgcGtnTGV2ZWwpOworICAgIHVuc2lnbmVkIG5jb3JlcyA9IF9fa21wX25jb3JlczsKKyAgICB1bnNpZ25lZCBudGhyZWFkcyA9IGh3bG9jX2dldF9uYm9ianNfYnlfZGVwdGgoX19rbXBfaHdsb2NfdG9wb2xvZ3ksIHRocmVhZExldmVsKTsKKyAgICB1bnNpZ25lZCB1bmlmb3JtID0gKG5wYWNrYWdlcyAqIG5Db3Jlc1BlclBrZyAqIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9PSBudGhyZWFkcyk7CisKKyAgICAvLworICAgIC8vIFByaW50IHRoZSBtYWNoaW5lIHRvcG9sb2d5IHN1bW1hcnkuCisgICAgLy8KKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICBjaGFyIG1hc2tbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhtYXNrLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sIG9sZE1hc2spOworCisgICAgICAgIEtNUF9JTkZPUk0oQWZmVXNpbmdId2xvYywgIktNUF9BRkZJTklUWSIpOworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrKSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEluaXRPU1Byb2NTZXRSZXNwZWN0LCAiS01QX0FGRklOSVRZIiwgbWFzayk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEluaXRPU1Byb2NTZXROb3RSZXNwZWN0LCAiS01QX0FGRklOSVRZIiwgbWFzayk7CisgICAgICAgIH0KKyAgICAgICAgS01QX0lORk9STShBdmFpbGFibGVPU1Byb2MsICJLTVBfQUZGSU5JVFkiLCBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICAgICAgaWYgKHVuaWZvcm0pIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgS01QX0lORk9STShOb25Vbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgIH0KKworICAgICAgICBrbXBfc3RyX2J1Zl90IGJ1ZjsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9pbml0KCZidWYpOworCisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoJmJ1ZiwgIiVkIiwgbnBhY2thZ2VzKTsKKyAgICAgICAgLy9mb3IgKGxldmVsID0gMTsgbGV2ZWwgPD0gcGtnTGV2ZWw7IGxldmVsKyspIHsKKyAgICAgICAgLy8gICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiIHggJWQiLCBtYXhDdFtsZXZlbF0pOworICAgICAgIC8vIH0KKyAgICAgICAgS01QX0lORk9STShUb3BvbG9neUV4dHJhLCAiS01QX0FGRklOSVRZIiwgYnVmLnN0ciwgbkNvcmVzUGVyUGtnLAorICAgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSwgX19rbXBfbmNvcmVzKTsKKworICAgICAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoJmJ1Zik7CisgICAgfQorCisgICAgaWYgKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSkgeworICAgICAgICBLTVBfQ1BVX0ZSRUUob2xkTWFzayk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vCisgICAgLy8gRmluZCBhbnkgbGV2ZWxzIHdpdGggcmFkaWl4IDEsIGFuZCByZW1vdmUgdGhlbSBmcm9tIHRoZSBtYXAKKyAgICAvLyAoZXhjZXB0IGZvciB0aGUgcGFja2FnZSBsZXZlbCkuCisgICAgLy8KKyAgICBpbnQgbmV3X2RlcHRoID0gMDsKKyAgICBpbnQgbGV2ZWw7CisgICAgdW5zaWduZWQgcHJvYzsKKyAgICBmb3IgKGxldmVsID0gMTsgbGV2ZWwgPCAoaW50KWRlcHRoOyBsZXZlbCsrKSB7CisgICAgICAgIGlmICgoaHdsb2NfZ2V0X25ib2Jqc19ieV9kZXB0aChfX2ttcF9od2xvY190b3BvbG9neSxsZXZlbCkgPT0gMSkgJiYgKGxldmVsICE9IHBrZ0xldmVsKSkgeworICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBuZXdfZGVwdGgrKzsKKyAgICB9CisKKyAgICAvLworICAgIC8vIElmIHdlIGFyZSByZW1vdmluZyBhbnkgbGV2ZWxzLCBhbGxvY2F0ZSBhIG5ldyB2ZWN0b3IgdG8gcmV0dXJuLAorICAgIC8vIGFuZCBjb3B5IHRoZSByZWxldmFudCBpbmZvcm1hdGlvbiB0byBpdC4KKyAgICAvLworICAgIGlmIChuZXdfZGVwdGggIT0gZGVwdGgtMSkgeworICAgICAgICBBZGRyVW5zUGFpciAqbmV3X3JldHZhbCA9IChBZGRyVW5zUGFpciAqKV9fa21wX2FsbG9jYXRlKAorICAgICAgICAgIHNpemVvZihBZGRyVW5zUGFpcikgKiBuQWN0aXZlVGhyZWFkcyk7CisgICAgICAgIGZvciAocHJvYyA9IDA7IChpbnQpcHJvYyA8IG5BY3RpdmVUaHJlYWRzOyBwcm9jKyspIHsKKyAgICAgICAgICAgIEFkZHJlc3MgYWRkcihuZXdfZGVwdGgpOworICAgICAgICAgICAgbmV3X3JldHZhbFtwcm9jXSA9IEFkZHJVbnNQYWlyKGFkZHIsIHJldHZhbFtwcm9jXS5zZWNvbmQpOworICAgICAgICB9CisgICAgICAgIGludCBuZXdfbGV2ZWwgPSAwOworICAgICAgICBmb3IgKGxldmVsID0gMTsgbGV2ZWwgPCAoaW50KWRlcHRoOyBsZXZlbCsrKSB7CisgICAgICAgICAgICBpZiAoKGh3bG9jX2dldF9uYm9ianNfYnlfZGVwdGgoX19rbXBfaHdsb2NfdG9wb2xvZ3ksbGV2ZWwpID09IDEpICYmIChsZXZlbCAhPSBwa2dMZXZlbCkpIHsKKyAgICAgICAgICAgICAgIGlmIChsZXZlbCA9PSB0aHJlYWRMZXZlbCkgeworICAgICAgICAgICAgICAgICAgIHRocmVhZExldmVsID0gLTE7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBlbHNlIGlmICgodGhyZWFkTGV2ZWwgPj0gMCkgJiYgKGxldmVsIDwgdGhyZWFkTGV2ZWwpKSB7CisgICAgICAgICAgICAgICAgICAgdGhyZWFkTGV2ZWwtLTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGlmIChsZXZlbCA9PSBjb3JlTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICAgICBjb3JlTGV2ZWwgPSAtMTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGVsc2UgaWYgKChjb3JlTGV2ZWwgPj0gMCkgJiYgKGxldmVsIDwgY29yZUxldmVsKSkgeworICAgICAgICAgICAgICAgICAgIGNvcmVMZXZlbC0tOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgaWYgKGxldmVsIDwgcGtnTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICAgICBwa2dMZXZlbC0tOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKHByb2MgPSAwOyAoaW50KXByb2MgPCBuQWN0aXZlVGhyZWFkczsgcHJvYysrKSB7CisgICAgICAgICAgICAgICAgbmV3X3JldHZhbFtwcm9jXS5maXJzdC5sYWJlbHNbbmV3X2xldmVsXQorICAgICAgICAgICAgICAgICAgPSByZXR2YWxbcHJvY10uZmlyc3QubGFiZWxzW2xldmVsXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5ld19sZXZlbCsrOworICAgICAgICB9CisKKyAgICAgICAgX19rbXBfZnJlZShyZXR2YWwpOworICAgICAgICByZXR2YWwgPSBuZXdfcmV0dmFsOworICAgICAgICBkZXB0aCA9IG5ld19kZXB0aDsKKyAgICB9CisKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPCAwKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIFNldCB0aGUgZ3JhbnVsYXJpdHkgbGV2ZWwgYmFzZWQgb24gd2hhdCBsZXZlbHMgYXJlIG1vZGVsZWQKKyAgICAgICAgLy8gaW4gdGhlIG1hY2hpbmUgdG9wb2xvZ3kgbWFwLgorICAgICAgICAvLworICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA9IDA7CisgICAgICAgIGlmICgodGhyZWFkTGV2ZWwtMSA+PSAwKSAmJiAoX19rbXBfYWZmaW5pdHlfZ3JhbiA+IGFmZmluaXR5X2dyYW5fdGhyZWFkKSkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGNvcmVMZXZlbC0xID49IDApICYmIChfX2ttcF9hZmZpbml0eV9ncmFuID4gYWZmaW5pdHlfZ3Jhbl9jb3JlKSkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3JhbiA+IGFmZmluaXR5X2dyYW5fcGFja2FnZSkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X3RvcG9sb2d5KHJldHZhbCwgbkFjdGl2ZVRocmVhZHMsIGRlcHRoLTEsIHBrZ0xldmVsLTEsCisgICAgICAgICAgY29yZUxldmVsLTEsIHRocmVhZExldmVsLTEpOworICAgIH0KKworICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICAqYWRkcmVzczJvcyA9IHJldHZhbDsKKyAgICBpZihkZXB0aCA9PSAwKSByZXR1cm4gMDsKKyAgICBlbHNlIHJldHVybiBkZXB0aC0xOworfQorI2VuZGlmIC8vIEtNUF9VU0VfSFdMT0MKKworLy8KKy8vIElmIHdlIGRvbid0IGtub3cgaG93IHRvIHJldHJpZXZlIHRoZSBtYWNoaW5lJ3MgcHJvY2Vzc29yIHRvcG9sb2d5LCBvcgorLy8gZW5jb3VudGVyIGFuIGVycm9yIGluIGRvaW5nIHNvLCB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIGZvcm0gYSAiZmxhdCIKKy8vIG1hcHBpbmcgb2Ygb3MgdGhyZWFkIGlkJ3MgPC0+IHByb2Nlc3NvciBpZCdzLgorLy8KK3N0YXRpYyBpbnQKK19fa21wX2FmZmluaXR5X2NyZWF0ZV9mbGF0X21hcChBZGRyVW5zUGFpciAqKmFkZHJlc3Myb3MsCisgIGttcF9pMThuX2lkX3QgKmNvbnN0IG1zZ19pZCkKK3sKKyAgICAqYWRkcmVzczJvcyA9IE5VTEw7CisgICAgKm1zZ19pZCA9IGttcF9pMThuX251bGw7CisKKyAgICAvLworICAgIC8vIEV2ZW4gaWYgX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lLCB0aGlzIHJvdXRpbmUgbWlnaHQgc3RpbGwKKyAgICAvLyBjYWxsZWQgdG8gc2V0IF9fa21wX25jb3JlcywgYXMgd2VsbCBhcworICAgIC8vIF9fa21wX25UaHJlYWRzUGVyQ29yZSwgbkNvcmVzUGVyUGtnLCAmIG5QYWNrYWdlcy4KKyAgICAvLworICAgIGlmICghIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkpIHsKKyAgICAgICAgS01QX0FTU0VSVChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpOworICAgICAgICBfX2ttcF9uY29yZXMgPSBuUGFja2FnZXMgPSBfX2ttcF94cHJvYzsKKyAgICAgICAgX19rbXBfblRocmVhZHNQZXJDb3JlID0gbkNvcmVzUGVyUGtnID0gMTsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmRmxhdFRvcG9sb2d5LCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEF2YWlsYWJsZU9TUHJvYywgIktNUF9BRkZJTklUWSIsIF9fa21wX2F2YWlsX3Byb2MpOworICAgICAgICAgICAgS01QX0lORk9STShVbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICBLTVBfSU5GT1JNKFRvcG9sb2d5LCAiS01QX0FGRklOSVRZIiwgblBhY2thZ2VzLCBuQ29yZXNQZXJQa2csCisgICAgICAgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSwgX19rbXBfbmNvcmVzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLworICAgIC8vIFdoZW4gYWZmaW5pdHkgaXMgb2ZmLCB0aGlzIHJvdXRpbmUgd2lsbCBzdGlsbCBiZSBjYWxsZWQgdG8gc2V0CisgICAgLy8gX19rbXBfbmNvcmVzLCBhcyB3ZWxsIGFzIF9fa21wX25UaHJlYWRzUGVyQ29yZSwKKyAgICAvLyBuQ29yZXNQZXJQa2csICYgblBhY2thZ2VzLiAgTWFrZSBzdXJlIGFsbCB0aGVzZSB2YXJzIGFyZSBzZXQKKyAgICAvLyAgY29ycmVjdGx5LCBhbmQgcmV0dXJuIG5vdyBpZiBhZmZpbml0eSBpcyBub3QgZW5hYmxlZC4KKyAgICAvLworICAgIF9fa21wX25jb3JlcyA9IG5QYWNrYWdlcyA9IF9fa21wX2F2YWlsX3Byb2M7CisgICAgX19rbXBfblRocmVhZHNQZXJDb3JlID0gbkNvcmVzUGVyUGtnID0gMTsKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKGJ1ZiwgS01QX0FGRklOX01BU0tfUFJJTlRfTEVOLCBmdWxsTWFzayk7CisKKyAgICAgICAgS01QX0lORk9STShBZmZDYXBhYmxlVXNlRmxhdCwgIktNUF9BRkZJTklUWSIpOworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrKSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEluaXRPU1Byb2NTZXRSZXNwZWN0LCAiS01QX0FGRklOSVRZIiwgYnVmKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldE5vdFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBidWYpOworICAgICAgICB9CisgICAgICAgIEtNUF9JTkZPUk0oQXZhaWxhYmxlT1NQcm9jLCAiS01QX0FGRklOSVRZIiwgX19rbXBfYXZhaWxfcHJvYyk7CisgICAgICAgIEtNUF9JTkZPUk0oVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICBLTVBfSU5GT1JNKFRvcG9sb2d5LCAiS01QX0FGRklOSVRZIiwgblBhY2thZ2VzLCBuQ29yZXNQZXJQa2csCisgICAgICAgICAgX19rbXBfblRocmVhZHNQZXJDb3JlLCBfX2ttcF9uY29yZXMpOworICAgIH0KKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vCisgICAgLy8gQ29udHJ1Y3QgdGhlIGRhdGEgc3RydWN0dXJlIHRvIGJlIHJldHVybmVkLgorICAgIC8vCisgICAgKmFkZHJlc3Myb3MgPSAoQWRkclVuc1BhaXIqKQorICAgICAgX19rbXBfYWxsb2NhdGUoc2l6ZW9mKCoqYWRkcmVzczJvcykgKiBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICBpbnQgYXZhaWxfY3QgPSAwOworICAgIHVuc2lnbmVkIGludCBpOworICAgIEtNUF9DUFVfU0VUX0lURVJBVEUoaSwgZnVsbE1hc2spIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gU2tpcCB0aGlzIHByb2MgaWYgaXQgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBtYWNoaW5lIG1vZGVsLgorICAgICAgICAvLworICAgICAgICBpZiAoISBLTVBfQ1BVX0lTU0VUKGksIGZ1bGxNYXNrKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBBZGRyZXNzIGFkZHIoMSk7CisgICAgICAgIGFkZHIubGFiZWxzWzBdID0gaTsKKyAgICAgICAgKCphZGRyZXNzMm9zKVthdmFpbF9jdCsrXSA9IEFkZHJVbnNQYWlyKGFkZHIsaSk7CisgICAgfQorICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgIEtNUF9JTkZPUk0oT1NQcm9jVG9QYWNrYWdlLCAiS01QX0FGRklOSVRZIik7CisgICAgfQorCisgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzIDwgMCkgeworICAgICAgICAvLworICAgICAgICAvLyBPbmx5IHRoZSBwYWNrYWdlIGxldmVsIGlzIG1vZGVsZWQgaW4gdGhlIG1hY2hpbmUgdG9wb2xvZ3kgbWFwLAorICAgICAgICAvLyBzbyB0aGUgI2xldmVscyBvZiBncmFudWxhcml0eSBpcyBlaXRoZXIgMCBvciAxLgorICAgICAgICAvLworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3JhbiA+IGFmZmluaXR5X2dyYW5fcGFja2FnZSkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPSAwOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAxOworfQorCisKKyMgaWYgS01QX0dST1VQX0FGRklOSVRZCisKKy8vCisvLyBJZiBtdWx0aXBsZSBXaW5kb3dzKiBPUyBwcm9jZXNzb3IgZ3JvdXBzIGV4aXN0LCB3ZSBjYW4gY3JlYXRlIGEgMi1sZXZlbAorLy8gdG9wb2xvZ3kgbWFwIHdpdGggdGhlIGdyb3VwcyBhdCBsZXZlbCAwIGFuZCB0aGUgaW5kaXZpZHVhbCBwcm9jcyBhdAorLy8gbGV2ZWwgMS4KKy8vCisvLyBUaGlzIGZhY2lsaXRhdGVzIGxldHRpbmcgdGhlIHRocmVhZHMgZmxvYXQgYW1vbmcgYWxsIHByb2NzIGluIGEgZ3JvdXAsCisvLyBpZiBncmFudWxhcml0eT1ncm91cCAodGhlIGRlZmF1bHQgd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgZ3JvdXBzKS4KKy8vCitzdGF0aWMgaW50CitfX2ttcF9hZmZpbml0eV9jcmVhdGVfcHJvY19ncm91cF9tYXAoQWRkclVuc1BhaXIgKiphZGRyZXNzMm9zLAorICBrbXBfaTE4bl9pZF90ICpjb25zdCBtc2dfaWQpCit7CisgICAgKmFkZHJlc3Myb3MgPSBOVUxMOworICAgICptc2dfaWQgPSBrbXBfaTE4bl9udWxsOworCisgICAgLy8KKyAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIG11bHRpcGxlIHByb2Nlc3NvciBncm91cHMsIHJldHVybiBub3cuCisgICAgLy8gVGhlIGZsYXQgbWFwcGluZyB3aWxsIGJlIHVzZWQuCisgICAgLy8KKyAgICBpZiAoKCEgS01QX0FGRklOSVRZX0NBUEFCTEUoKSkgfHwgKF9fa21wX2dldF9wcm9jX2dyb3VwKGZ1bGxNYXNrKSA+PSAwKSkgeworICAgICAgICAvLyBGSVhNRSBzZXQgKm1zZ19pZAorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBDb250cnVjdCB0aGUgZGF0YSBzdHJ1Y3R1cmUgdG8gYmUgcmV0dXJuZWQuCisgICAgLy8KKyAgICAqYWRkcmVzczJvcyA9IChBZGRyVW5zUGFpciopCisgICAgICBfX2ttcF9hbGxvY2F0ZShzaXplb2YoKiphZGRyZXNzMm9zKSAqIF9fa21wX2F2YWlsX3Byb2MpOworICAgIGludCBhdmFpbF9jdCA9IDA7CisgICAgaW50IGk7CisgICAgS01QX0NQVV9TRVRfSVRFUkFURShpLCBmdWxsTWFzaykgeworICAgICAgICAvLworICAgICAgICAvLyBTa2lwIHRoaXMgcHJvYyBpZiBpdCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIG1hY2hpbmUgbW9kZWwuCisgICAgICAgIC8vCisgICAgICAgIGlmICghIEtNUF9DUFVfSVNTRVQoaSwgZnVsbE1hc2spKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEFkZHJlc3MgYWRkcigyKTsKKyAgICAgICAgYWRkci5sYWJlbHNbMF0gPSBpIC8gKENIQVJfQklUICogc2l6ZW9mKERXT1JEX1BUUikpOworICAgICAgICBhZGRyLmxhYmVsc1sxXSA9IGkgJSAoQ0hBUl9CSVQgKiBzaXplb2YoRFdPUkRfUFRSKSk7CisgICAgICAgICgqYWRkcmVzczJvcylbYXZhaWxfY3QrK10gPSBBZGRyVW5zUGFpcihhZGRyLGkpOworCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZk9TUHJvY1RvR3JvdXAsICJLTVBfQUZGSU5JVFkiLCBpLCBhZGRyLmxhYmVsc1swXSwKKyAgICAgICAgICAgICAgYWRkci5sYWJlbHNbMV0pOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzIDwgMCkgeworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX2dyb3VwKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9maW5lKQorICAgICAgICAgIHx8IChfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fdGhyZWFkKSkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY29uc3QgY2hhciAqZ3Jhbl9zdHIgPSBOVUxMOworICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9jb3JlKSB7CisgICAgICAgICAgICAgICAgZ3Jhbl9zdHIgPSAiY29yZSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fcGFja2FnZSkgeworICAgICAgICAgICAgICAgIGdyYW5fc3RyID0gInBhY2thZ2UiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX25vZGUpIHsKKyAgICAgICAgICAgICAgICBncmFuX3N0ciA9ICJub2RlIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoMCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFdhcm5pbmc6IGNhbid0IHVzZSBhZmZpbml0eSBncmFudWxhcml0eSBcImdyYW5cIiB3aXRoIGdyb3VwIHRvcG9sb2d5IG1ldGhvZCwgdXNpbmcgInRocmVhZCIKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMjsKK30KKworIyBlbmRpZiAvKiBLTVBfR1JPVVBfQUZGSU5JVFkgKi8KKworCisjIGlmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworc3RhdGljIGludAorX19rbXBfY3B1aWRfbWFza193aWR0aChpbnQgY291bnQpIHsKKyAgICBpbnQgciA9IDA7CisKKyAgICB3aGlsZSgoMTw8cikgPCBjb3VudCkKKyAgICAgICAgKytyOworICAgIHJldHVybiByOworfQorCisKK2NsYXNzIGFwaWNUaHJlYWRJbmZvIHsKK3B1YmxpYzoKKyAgICB1bnNpZ25lZCBvc0lkOyAgICAgICAgICAgICAgLy8gcGFyYW0gdG8gX19rbXBfYWZmaW5pdHlfYmluZF90aHJlYWQKKyAgICB1bnNpZ25lZCBhcGljSWQ7ICAgICAgICAgICAgLy8gZnJvbSBjcHVpZCBhZnRlciBiaW5kaW5nCisgICAgdW5zaWduZWQgbWF4Q29yZXNQZXJQa2c7ICAgIC8vICAgICAgIiIKKyAgICB1bnNpZ25lZCBtYXhUaHJlYWRzUGVyUGtnOyAgLy8gICAgICAiIgorICAgIHVuc2lnbmVkIHBrZ0lkOyAgICAgICAgICAgICAvLyBpbmZlcnJlZCBmcm9tIGFib3ZlIHZhbHVlcworICAgIHVuc2lnbmVkIGNvcmVJZDsgICAgICAgICAgICAvLyAgICAgICIiCisgICAgdW5zaWduZWQgdGhyZWFkSWQ7ICAgICAgICAgIC8vICAgICAgIiIKK307CisKKworc3RhdGljIGludAorX19rbXBfYWZmaW5pdHlfY21wX2FwaWNUaHJlYWRJbmZvX29zX2lkKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisgICAgY29uc3QgYXBpY1RocmVhZEluZm8gKmFhID0gKGNvbnN0IGFwaWNUaHJlYWRJbmZvICopYTsKKyAgICBjb25zdCBhcGljVGhyZWFkSW5mbyAqYmIgPSAoY29uc3QgYXBpY1RocmVhZEluZm8gKiliOworICAgIGlmIChhYS0+b3NJZCA8IGJiLT5vc0lkKSByZXR1cm4gLTE7CisgICAgaWYgKGFhLT5vc0lkID4gYmItPm9zSWQpIHJldHVybiAxOworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQKK19fa21wX2FmZmluaXR5X2NtcF9hcGljVGhyZWFkSW5mb19waHlzX2lkKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisgICAgY29uc3QgYXBpY1RocmVhZEluZm8gKmFhID0gKGNvbnN0IGFwaWNUaHJlYWRJbmZvICopYTsKKyAgICBjb25zdCBhcGljVGhyZWFkSW5mbyAqYmIgPSAoY29uc3QgYXBpY1RocmVhZEluZm8gKiliOworICAgIGlmIChhYS0+cGtnSWQgPCBiYi0+cGtnSWQpIHJldHVybiAtMTsKKyAgICBpZiAoYWEtPnBrZ0lkID4gYmItPnBrZ0lkKSByZXR1cm4gMTsKKyAgICBpZiAoYWEtPmNvcmVJZCA8IGJiLT5jb3JlSWQpIHJldHVybiAtMTsKKyAgICBpZiAoYWEtPmNvcmVJZCA+IGJiLT5jb3JlSWQpIHJldHVybiAxOworICAgIGlmIChhYS0+dGhyZWFkSWQgPCBiYi0+dGhyZWFkSWQpIHJldHVybiAtMTsKKyAgICBpZiAoYWEtPnRocmVhZElkID4gYmItPnRocmVhZElkKSByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKK30KKworCisvLworLy8gT24gSUEtMzIgYXJjaGl0ZWN0dXJlIGFuZCBJbnRlbChSKSA2NCBhcmNoaXRlY3R1cmUsIHdlIGF0dGVtcHQgdG8gdXNlCisvLyBhbiBhbGdvcml0aG0gd2hpY2ggY3ljbGVzIHRocm91Z2ggdGhlIGF2YWlsYWJsZSBvcyB0aHJlYWRzLCBzZXR0aW5nCisvLyB0aGUgY3VycmVudCB0aHJlYWQncyBhZmZpbml0eSBtYXNrIHRvIHRoYXQgdGhyZWFkLCBhbmQgdGhlbiByZXRyaWV2ZXMKKy8vIHRoZSBBcGljIElkIGZvciBlYWNoIHRocmVhZCBjb250ZXh0IHVzaW5nIHRoZSBjcHVpZCBpbnN0cnVjdGlvbi4KKy8vCitzdGF0aWMgaW50CitfX2ttcF9hZmZpbml0eV9jcmVhdGVfYXBpY2lkX21hcChBZGRyVW5zUGFpciAqKmFkZHJlc3Myb3MsCisgIGttcF9pMThuX2lkX3QgKmNvbnN0IG1zZ19pZCkKK3sKKyAgICBrbXBfY3B1aWQgYnVmOworICAgIGludCByYzsKKyAgICAqYWRkcmVzczJvcyA9IE5VTEw7CisgICAgKm1zZ19pZCA9IGttcF9pMThuX251bGw7CisKKyAgICAvLworICAgIC8vIENoZWNrIGlmIGNwdWlkIGxlYWYgNCBpcyBzdXBwb3J0ZWQuCisgICAgLy8KKyAgICAgICAgX19rbXBfeDg2X2NwdWlkKDAsIDAsICZidWYpOworICAgICAgICBpZiAoYnVmLmVheCA8IDQpIHsKKyAgICAgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfTm9MZWFmNFN1cHBvcnQ7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgIC8vCisgICAgLy8gVGhlIGFsZ29yaXRobSB1c2VkIHN0YXJ0cyBieSBzZXR0aW5nIHRoZSBhZmZpbml0eSB0byBlYWNoIGF2YWlsYWJsZQorICAgIC8vIHRocmVhZCBhbmQgcmV0cmlldmluZyBpbmZvIGZyb20gdGhlIGNwdWlkIGluc3RydWN0aW9uLCBzbyBpZiB3ZSBhcmUKKyAgICAvLyBub3QgY2FwYWJsZSBvZiBjYWxsaW5nIF9fa21wX2dldF9zeXN0ZW1fYWZmaW5pdHkoKSBhbmQKKyAgICAvLyBfa21wX2dldF9zeXN0ZW1fYWZmaW5pdHkoKSwgdGhlbiB3ZSBuZWVkIHRvIGRvIHNvbWV0aGluZyBlbHNlIC0gdXNlCisgICAgLy8gdGhlIGRlZmF1bHRzIHRoYXQgd2UgY2FsY3VsYXRlZCBmcm9tIGlzc3VpbmcgY3B1aWQgd2l0aG91dCBiaW5kaW5nCisgICAgLy8gdG8gZWFjaCBwcm9jLgorICAgIC8vCisgICAgaWYgKCEgS01QX0FGRklOSVRZX0NBUEFCTEUoKSkgeworICAgICAgICAvLworICAgICAgICAvLyBIYWNrIHRvIHRyeSBhbmQgaW5mZXIgdGhlIG1hY2hpbmUgdG9wb2xvZ3kgdXNpbmcgb25seSB0aGUgZGF0YQorICAgICAgICAvLyBhdmFpbGFibGUgZnJvbSBjcHVpZCBvbiB0aGUgY3VycmVudCB0aHJlYWQsIGFuZCBfX2ttcF94cHJvYy4KKyAgICAgICAgLy8KKyAgICAgICAgS01QX0FTU0VSVChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpOworCisgICAgICAgIC8vCisgICAgICAgIC8vIEdldCBhbiB1cHBlciBib3VuZCBvbiB0aGUgbnVtYmVyIG9mIHRocmVhZHMgcGVyIHBhY2thZ2UgdXNpbmcKKyAgICAgICAgLy8gY3B1aWQoMSkuCisgICAgICAgIC8vCisgICAgICAgIC8vIE9uIHNvbWUgT1MvY2hwcyBjb21iaW5hdGlvbnMgd2hlcmUgSFQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBjaGlwCisgICAgICAgIC8vIGJ1dCBpcyBkaXNhYmxlZCwgdGhpcyB2YWx1ZSB3aWxsIGJlIDIgb24gYSBzaW5nbGUgY29yZSBjaGlwLgorICAgICAgICAvLyBVc3VhbGx5LCBpdCB3aWxsIGJlIDIgaWYgSFQgaXMgZW5hYmxlZCBhbmQgMSBpZiBIVCBpcyBkaXNhYmxlZC4KKyAgICAgICAgLy8KKyAgICAgICAgX19rbXBfeDg2X2NwdWlkKDEsIDAsICZidWYpOworICAgICAgICBpbnQgbWF4VGhyZWFkc1BlclBrZyA9IChidWYuZWJ4ID4+IDE2KSAmIDB4ZmY7CisgICAgICAgIGlmIChtYXhUaHJlYWRzUGVyUGtnID09IDApIHsKKyAgICAgICAgICAgIG1heFRocmVhZHNQZXJQa2cgPSAxOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlIG51bSBjb3JlcyBwZXIgcGtnIGNvbWVzIGZyb20gY3B1aWQoNCkuCisgICAgICAgIC8vIDEgbXVzdCBiZSBhZGRlZCB0byB0aGUgZW5jb2RlZCB2YWx1ZS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlIGF1dGhvciBvZiBjcHVfY291bnQuY3BwIHRyZWF0ZWQgdGhpcyBvbmx5IGFuIHVwcGVyIGJvdW5kCisgICAgICAgIC8vIG9uIHRoZSBudW1iZXIgb2YgY29yZXMsIGJ1dCBJIGhhdmVuJ3Qgc2VlbiBhbnkgY2FzZXMgd2hlcmUgaXQKKyAgICAgICAgLy8gd2FzIGdyZWF0ZXIgdGhhbiB0aGUgYWN0dWFsIG51bWJlciBvZiBjb3Jlcywgc28gd2Ugd2lsbCB0cmVhdAorICAgICAgICAvLyBpdCBhcyBleGFjdCBpbiB0aGlzIGJsb2NrIG9mIGNvZGUuCisgICAgICAgIC8vCisgICAgICAgIC8vIEZpcnN0LCB3ZSBuZWVkIHRvIGNoZWNrIGlmIGNwdWlkKDQpIGlzIHN1cHBvcnRlZCBvbiB0aGlzIGNoaXAuCisgICAgICAgIC8vIFRvIHNlZSBpZiBjcHVpZChuKSBpcyBzdXBwb3J0ZWQsIGlzc3VlIGNwdWlkKDApIGFuZCBjaGVjayBpZiBlYXgKKyAgICAgICAgLy8gaGFzIHRoZSB2YWx1ZSBuIG9yIGdyZWF0ZXIuCisgICAgICAgIC8vCisgICAgICAgIF9fa21wX3g4Nl9jcHVpZCgwLCAwLCAmYnVmKTsKKyAgICAgICAgaWYgKGJ1Zi5lYXggPj0gNCkgeworICAgICAgICAgICAgX19rbXBfeDg2X2NwdWlkKDQsIDAsICZidWYpOworICAgICAgICAgICAgbkNvcmVzUGVyUGtnID0gKChidWYuZWF4ID4+IDI2KSAmIDB4M2YpICsgMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG5Db3Jlc1BlclBrZyA9IDE7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBUaGVyZSBpcyBubyB3YXkgdG8gcmVsaWFibHkgdGVsbCBpZiBIVCBpcyBlbmFibGVkIHdpdGhvdXQgaXNzdWluZworICAgICAgICAvLyB0aGUgY3B1aWQgaW5zdHJ1Y3Rpb24gZnJvbSBldmVyeSB0aHJlYWQsIGNhbiBjb3JyZWxhdGluZyB0aGUgY3B1aWQKKyAgICAgICAgLy8gaW5mbywgc28gaWYgdGhlIG1hY2hpbmUgaXMgbm90IGFmZmluaXR5IGNhcGFibGUsIHdlIGFzc3VtZSB0aGF0IEhUCisgICAgICAgIC8vIGlzIG9mZi4gIFdlIGhhdmUgc2VlbiBxdWl0ZSBhIGZldyBtYWNoaW5lcyB3aGVyZSBtYXhUaHJlYWRzUGVyUGtnCisgICAgICAgIC8vIGlzIDIsIHlldCB0aGUgbWFjaGluZSBkb2VzIG5vdCBzdXBwb3J0IEhULgorICAgICAgICAvLworICAgICAgICAvLyAtIE9sZGVyIE9TZXMgYXJlIHVzdWFsbHkgZm91bmQgb24gbWFjaGluZXMgd2l0aCBvbGRlciBjaGlwcywgd2hpY2gKKyAgICAgICAgLy8gICBkbyBub3Qgc3VwcG9ydCBIVC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gLSBUaGUgcGVyZm9ybWFuY2UgcGVuYWx0eSBmb3IgbWlzdGFrZW5seSBpZGVudGlmeWluZyBhIG1hY2hpbmUgYXMKKyAgICAgICAgLy8gICBIVCB3aGVuIGl0IGlzbid0ICh3aGljaCByZXN1bHRzIGluIGJsb2NrdGltZSBiZWluZyBpbmNvcnJlY2x5IHNldAorICAgICAgICAvLyAgIHRvIDApIGlzIGdyZWF0ZXIgdGhhbiB0aGUgcGVuYWx0eSB3aGVuIGZvciBtaXN0YWtlbmx5IGlkZW50aWZ5aW5nCisgICAgICAgIC8vICAgYSBtYWNoaW5lIGFzIGJlaW5nIDEgdGhyZWFkL2NvcmUgd2hlbiBpdCBpcyByZWFsbHkgSFQgZW5hYmxlZAorICAgICAgICAvLyAgICh3aGljaCByZXN1bHRzIGluIGJsb2NrdGltZSBiZWluZyBpbmNvcnJlY3RseSBzZXQgdG8gYSBwb3NpdGl2ZQorICAgICAgICAvLyAgIHZhbHVlKS4KKyAgICAgICAgLy8KKyAgICAgICAgX19rbXBfbmNvcmVzID0gX19rbXBfeHByb2M7CisgICAgICAgIG5QYWNrYWdlcyA9IChfX2ttcF94cHJvYyArIG5Db3Jlc1BlclBrZyAtIDEpIC8gbkNvcmVzUGVyUGtnOworICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSAxOworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgS01QX0lORk9STShBZmZOb3RDYXBhYmxlVXNlTG9jQ3B1aWQsICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oQXZhaWxhYmxlT1NQcm9jLCAiS01QX0FGRklOSVRZIiwgX19rbXBfYXZhaWxfcHJvYyk7CisgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdW5pZm9ybV90b3BvbG9neSgpKSB7CisgICAgICAgICAgICAgICAgS01QX0lORk9STShVbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oTm9uVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgS01QX0lORk9STShUb3BvbG9neSwgIktNUF9BRkZJTklUWSIsIG5QYWNrYWdlcywgbkNvcmVzUGVyUGtnLAorICAgICAgICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUsIF9fa21wX25jb3Jlcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8KKyAgICAvLworICAgIC8vIEZyb20gaGVyZSBvbiwgd2UgY2FuIGFzc3VtZSB0aGF0IGl0IGlzIHNhZmUgdG8gY2FsbAorICAgIC8vIF9fa21wX2dldF9zeXN0ZW1fYWZmaW5pdHkoKSBhbmQgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eSgpLAorICAgIC8vIGV2ZW4gaWYgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X25vbmUuCisgICAgLy8KKworICAgIC8vCisgICAgLy8gU2F2ZSB0aGUgYWZmaW5pdHkgbWFzayBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLgorICAgIC8vCisgICAga21wX2FmZmluX21hc2tfdCAqb2xkTWFzazsKKyAgICBLTVBfQ1BVX0FMTE9DKG9sZE1hc2spOworICAgIEtNUF9BU1NFUlQob2xkTWFzayAhPSBOVUxMKTsKKyAgICBfX2ttcF9nZXRfc3lzdGVtX2FmZmluaXR5KG9sZE1hc2ssIFRSVUUpOworCisgICAgLy8KKyAgICAvLyBSdW4gdGhyb3VnaCBlYWNoIG9mIHRoZSBhdmFpbGFibGUgY29udGV4dHMsIGJpbmRpbmcgdGhlIGN1cnJlbnQgdGhyZWFkCisgICAgLy8gdG8gaXQsIGFuZCBvYnRhaW5pbmcgdGhlIHBlcnRpbmVudCBpbmZvcm1hdGlvbiB1c2luZyB0aGUgY3B1aWQgaW5zdHIuCisgICAgLy8KKyAgICAvLyBUaGUgcmVsZXZhbnQgaW5mb3JtYXRpb24gaXM6CisgICAgLy8KKyAgICAvLyBBcGljIElkOiBCaXRzIDI0OjMxIG9mIGVieCBhZnRlciBpc3N1aW5nIGNwdWlkKDEpIC0gZWFjaCB0aHJlYWQgY29udGV4dAorICAgIC8vICAgIGhhcyBhIHVuaXFpZSBBcGljIElkLCB3aGljaCBpcyBvZiB0aGUgZm9ybSBwa2cjIDogY29yZSMgOiB0aHJlYWQjLgorICAgIC8vCisgICAgLy8gTWF4IFRocmVhZHMgUGVyIFBrZzogQml0cyAxNjoyMyBvZiBlYnggYWZ0ZXIgaXNzdWluZyBjcHVpZCgxKS4gIFRoZQorICAgIC8vICAgIHZhbHVlIG9mIHRoaXMgZmllbGQgZGV0ZXJtaW5lcyB0aGUgd2lkdGggb2YgdGhlIGNvcmUjICsgdGhyZWFkIworICAgIC8vICAgIGZpZWxkcyBpbiB0aGUgQXBpYyBJZC4gIEl0IGlzIGFsc28gYW4gdXBwZXIgYm91bmQgb24gdGhlIG51bWJlcgorICAgIC8vICAgIG9mIHRocmVhZHMgcGVyIHBhY2thZ2UsIGJ1dCBpdCBoYXMgYmVlbiB2ZXJpZmllZCB0aGF0IHNpdHVhdGlvbnMKKyAgICAvLyAgICBoYXBwZW4gd2VyZSBpdCBpcyBub3QgZXhhY3QuICBJbiBwYXJ0aWN1bGFyLCBvbiBjZXJ0YWluIE9TL2NoaXAKKyAgICAvLyAgICBjb21iaW5hdGlvbnMgd2hlcmUgSW50ZWwoUikgSHlwZXItVGhyZWFkaW5nIFRlY2hub2xvZ3kgaXMgc3VwcG9ydGVkCisgICAgLy8gICAgYnkgdGhlIGNoaXAgYnV0IGhhcworICAgIC8vICAgIGJlZW4gZGlzYWJsZWQsIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIHdpbGwgYmUgMiAoZm9yIGEgc2luZ2xlIGNvcmUKKyAgICAvLyAgICBjaGlwKS4gIE9uIG90aGVyIE9TL2NoaXAgY29tYmluYXRpb25zIHN1cHBvcnRpbmcKKyAgICAvLyAgICBJbnRlbChSKSBIeXBlci1UaHJlYWRpbmcgVGVjaG5vbG9neSwgdGhlIHZhbHVlIG9mCisgICAgLy8gICAgdGhpcyBmaWVsZCB3aWxsIGJlIDEgd2hlbiBJbnRlbChSKSBIeXBlci1UaHJlYWRpbmcgVGVjaG5vbG9neSBpcworICAgIC8vICAgIGRpc2FibGVkIGFuZCAyIHdoZW4gaXQgaXMgZW5hYmxlZC4KKyAgICAvLworICAgIC8vIE1heCBDb3JlcyBQZXIgUGtnOiAgQml0cyAyNjozMSBvZiBlYXggYWZ0ZXIgaXNzdWluZyBjcHVpZCg0KS4gIFRoZQorICAgIC8vICAgIHZhbHVlIG9mIHRoaXMgZmllbGQgKCsxKSBkZXRlcm1pbmVzIHRoZSB3aWR0aCBvZiB0aGUgY29yZSMgZmllbGQgaW4KKyAgICAvLyAgICB0aGUgQXBpYyBJZC4gIFRoZSBjb21tZW50cyBpbiAiY3B1Y291bnQuY3BwIiBzYXkgdGhhdCB0aGlzIHZhbHVlIGlzCisgICAgLy8gICAgYW4gdXBwZXIgYm91bmQsIGJ1dCB0aGUgSUEtMzIgYXJjaGl0ZWN0dXJlIG1hbnVhbCBzYXlzIHRoYXQgaXQgaXMKKyAgICAvLyAgICBleGFjdGx5IHRoZSBudW1iZXIgb2YgY29yZXMgcGVyIHBhY2thZ2UsIGFuZCBJIGhhdmVuJ3Qgc2VlbiBhbnkKKyAgICAvLyAgICBjYXNlIHdoZXJlIGl0IHdhc24ndC4KKyAgICAvLworICAgIC8vIEZyb20gdGhpcyBpbmZvcm1hdGlvbiwgZGVkdWNlIHRoZSBwYWNrYWdlIElkLCBjb3JlIElkLCBhbmQgdGhyZWFkIElkLAorICAgIC8vIGFuZCBzZXQgdGhlIGNvcnJlc3BvbmRpbmcgZmllbGRzIGluIHRoZSBhcGljVGhyZWFkSW5mbyBzdHJ1Y3QuCisgICAgLy8KKyAgICB1bnNpZ25lZCBpOworICAgIGFwaWNUaHJlYWRJbmZvICp0aHJlYWRJbmZvID0gKGFwaWNUaHJlYWRJbmZvICopX19rbXBfYWxsb2NhdGUoCisgICAgICBfX2ttcF9hdmFpbF9wcm9jICogc2l6ZW9mKGFwaWNUaHJlYWRJbmZvKSk7CisgICAgdW5zaWduZWQgbkFwaWNzID0gMDsKKyAgICBLTVBfQ1BVX1NFVF9JVEVSQVRFKGksIGZ1bGxNYXNrKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIFNraXAgdGhpcyBwcm9jIGlmIGl0IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgbWFjaGluZSBtb2RlbC4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCEgS01QX0NQVV9JU1NFVChpLCBmdWxsTWFzaykpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoKGludCluQXBpY3MgPCBfX2ttcF9hdmFpbF9wcm9jKTsKKworICAgICAgICBfX2ttcF9hZmZpbml0eV9iaW5kX3RocmVhZChpKTsKKyAgICAgICAgdGhyZWFkSW5mb1tuQXBpY3NdLm9zSWQgPSBpOworCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoZSBhcGljIGlkIGFuZCBtYXggdGhyZWFkcyBwZXIgcGtnIGNvbWUgZnJvbSBjcHVpZCgxKS4KKyAgICAgICAgLy8KKyAgICAgICAgX19rbXBfeDg2X2NwdWlkKDEsIDAsICZidWYpOworICAgICAgICBpZiAoISAoYnVmLmVkeCA+PiA5KSAmIDEpIHsKKyAgICAgICAgICAgIF9fa21wX3NldF9zeXN0ZW1fYWZmaW5pdHkob2xkTWFzaywgVFJVRSk7CisgICAgICAgICAgICBfX2ttcF9mcmVlKHRocmVhZEluZm8pOworICAgICAgICAgICAgS01QX0NQVV9GUkVFKG9sZE1hc2spOworICAgICAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9BcGljTm90UHJlc2VudDsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICB0aHJlYWRJbmZvW25BcGljc10uYXBpY0lkID0gKGJ1Zi5lYnggPj4gMjQpICYgMHhmZjsKKyAgICAgICAgdGhyZWFkSW5mb1tuQXBpY3NdLm1heFRocmVhZHNQZXJQa2cgPSAoYnVmLmVieCA+PiAxNikgJiAweGZmOworICAgICAgICBpZiAodGhyZWFkSW5mb1tuQXBpY3NdLm1heFRocmVhZHNQZXJQa2cgPT0gMCkgeworICAgICAgICAgICAgdGhyZWFkSW5mb1tuQXBpY3NdLm1heFRocmVhZHNQZXJQa2cgPSAxOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gTWF4IGNvcmVzIHBlciBwa2cgY29tZXMgZnJvbSBjcHVpZCg0KS4KKyAgICAgICAgLy8gMSBtdXN0IGJlIGFkZGVkIHRvIHRoZSBlbmNvZGVkIHZhbHVlLgorICAgICAgICAvLworICAgICAgICAvLyBGaXJzdCwgd2UgbmVlZCB0byBjaGVjayBpZiBjcHVpZCg0KSBpcyBzdXBwb3J0ZWQgb24gdGhpcyBjaGlwLgorICAgICAgICAvLyBUbyBzZWUgaWYgY3B1aWQobikgaXMgc3VwcG9ydGVkLCBpc3N1ZSBjcHVpZCgwKSBhbmQgY2hlY2sgaWYgZWF4CisgICAgICAgIC8vIGhhcyB0aGUgdmFsdWUgbiBvciBncmVhdGVyLgorICAgICAgICAvLworICAgICAgICBfX2ttcF94ODZfY3B1aWQoMCwgMCwgJmJ1Zik7CisgICAgICAgIGlmIChidWYuZWF4ID49IDQpIHsKKyAgICAgICAgICAgIF9fa21wX3g4Nl9jcHVpZCg0LCAwLCAmYnVmKTsKKyAgICAgICAgICAgIHRocmVhZEluZm9bbkFwaWNzXS5tYXhDb3Jlc1BlclBrZyA9ICgoYnVmLmVheCA+PiAyNikgJiAweDNmKSArIDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB0aHJlYWRJbmZvW25BcGljc10ubWF4Q29yZXNQZXJQa2cgPSAxOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gSW5mZXIgdGhlIHBrZ0lkIC8gY29yZUlkIC8gdGhyZWFkSWQgdXNpbmcgb25seSB0aGUgaW5mbworICAgICAgICAvLyBvYnRhaW5lZCBsb2NhbGx5LgorICAgICAgICAvLworICAgICAgICBpbnQgd2lkdGhDVCA9IF9fa21wX2NwdWlkX21hc2tfd2lkdGgoCisgICAgICAgICAgdGhyZWFkSW5mb1tuQXBpY3NdLm1heFRocmVhZHNQZXJQa2cpOworICAgICAgICB0aHJlYWRJbmZvW25BcGljc10ucGtnSWQgPSB0aHJlYWRJbmZvW25BcGljc10uYXBpY0lkID4+IHdpZHRoQ1Q7CisKKyAgICAgICAgaW50IHdpZHRoQyA9IF9fa21wX2NwdWlkX21hc2tfd2lkdGgoCisgICAgICAgICAgdGhyZWFkSW5mb1tuQXBpY3NdLm1heENvcmVzUGVyUGtnKTsKKyAgICAgICAgaW50IHdpZHRoVCA9IHdpZHRoQ1QgLSB3aWR0aEM7CisgICAgICAgIGlmICh3aWR0aFQgPCAwKSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gSSd2ZSBuZXZlciBzZWVuIHRoaXMgb25lIGhhcHBlbiwgYnV0IEkgc3VwcG9zZSBpdCBjb3VsZCwgaWYKKyAgICAgICAgICAgIC8vIHRoZSBjcHVpZCBpbnN0cnVjdGlvbiBvbiBhIGNoaXAgd2FzIHJlYWxseSBzY3Jld2VkIHVwLgorICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRvIHJlc3RvcmUgdGhlIGFmZmluaXR5IG1hc2sgYmVmb3JlIHRoZSB0YWlsIGNhbGwuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eShvbGRNYXNrLCBUUlVFKTsKKyAgICAgICAgICAgIF9fa21wX2ZyZWUodGhyZWFkSW5mbyk7CisgICAgICAgICAgICBLTVBfQ1BVX0ZSRUUob2xkTWFzayk7CisgICAgICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX0ludmFsaWRDcHVpZEluZm87CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBpbnQgbWFza0MgPSAoMSA8PCB3aWR0aEMpIC0gMTsKKyAgICAgICAgdGhyZWFkSW5mb1tuQXBpY3NdLmNvcmVJZCA9ICh0aHJlYWRJbmZvW25BcGljc10uYXBpY0lkID4+IHdpZHRoVCkKKyAgICAgICAgICAmbWFza0M7CisKKyAgICAgICAgaW50IG1hc2tUID0gKDEgPDwgd2lkdGhUKSAtIDE7CisgICAgICAgIHRocmVhZEluZm9bbkFwaWNzXS50aHJlYWRJZCA9IHRocmVhZEluZm9bbkFwaWNzXS5hcGljSWQgJm1hc2tUOworCisgICAgICAgIG5BcGljcysrOworICAgIH0KKworICAgIC8vCisgICAgLy8gV2UndmUgY29sbGVjdGVkIGFsbCB0aGUgaW5mbyB3ZSBuZWVkLgorICAgIC8vIFJlc3RvcmUgdGhlIG9sZCBhZmZpbml0eSBtYXNrIGZvciB0aGlzIHRocmVhZC4KKyAgICAvLworICAgIF9fa21wX3NldF9zeXN0ZW1fYWZmaW5pdHkob2xkTWFzaywgVFJVRSk7CisKKyAgICAvLworICAgIC8vIElmIHRoZXJlJ3Mgb25seSBvbmUgdGhyZWFkIGNvbnRleHQgdG8gYmluZCB0bywgZm9ybSBhbiBBZGRyZXNzIG9iamVjdAorICAgIC8vIHdpdGggZGVwdGggMSBhbmQgcmV0dXJuIGltbWVkaWF0ZWx5IChvciwgaWYgYWZmaW5pdHkgaXMgb2ZmLCBzZXQKKyAgICAvLyBhZGRyZXNzMm9zIHRvIE5VTEwgYW5kIHJldHVybikuCisgICAgLy8KKyAgICAvLyBJZiBpdCBpcyBjb25maWd1cmVkIHRvIG9taXQgdGhlIHBhY2thZ2UgbGV2ZWwgd2hlbiB0aGVyZSBpcyBvbmx5IGEKKyAgICAvLyBzaW5nbGUgcGFja2FnZSwgdGhlIGxvZ2ljIGF0IHRoZSBlbmQgb2YgdGhpcyByb3V0aW5lIHdvbid0IHdvcmsgaWYKKyAgICAvLyB0aGVyZSBpcyBvbmx5IGEgc2luZ2xlIHRocmVhZCAtIGl0IHdvdWxkIHRyeSB0byBmb3JtIGFuIEFkZHJlc3MKKyAgICAvLyBvYmplY3Qgd2l0aCBkZXB0aCAwLgorICAgIC8vCisgICAgS01QX0FTU0VSVChuQXBpY3MgPiAwKTsKKyAgICBpZiAobkFwaWNzID09IDEpIHsKKyAgICAgICAgX19rbXBfbmNvcmVzID0gblBhY2thZ2VzID0gMTsKKyAgICAgICAgX19rbXBfblRocmVhZHNQZXJDb3JlID0gbkNvcmVzUGVyUGtnID0gMTsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgIGNoYXIgYnVmW0tNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTl07CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKGJ1ZiwgS01QX0FGRklOX01BU0tfUFJJTlRfTEVOLCBvbGRNYXNrKTsKKworICAgICAgICAgICAgS01QX0lORk9STShBZmZVc2VHbG9iQ3B1aWQsICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2spIHsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEluaXRPU1Byb2NTZXRSZXNwZWN0LCAiS01QX0FGRklOSVRZIiwgYnVmKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgS01QX0lORk9STShJbml0T1NQcm9jU2V0Tm90UmVzcGVjdCwgIktNUF9BRkZJTklUWSIsIGJ1Zik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBLTVBfSU5GT1JNKEF2YWlsYWJsZU9TUHJvYywgIktNUF9BRkZJTklUWSIsIF9fa21wX2F2YWlsX3Byb2MpOworICAgICAgICAgICAgS01QX0lORk9STShVbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICBLTVBfSU5GT1JNKFRvcG9sb2d5LCAiS01QX0FGRklOSVRZIiwgblBhY2thZ2VzLCBuQ29yZXNQZXJQa2csCisgICAgICAgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSwgX19rbXBfbmNvcmVzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpIHsKKyAgICAgICAgICAgIF9fa21wX2ZyZWUodGhyZWFkSW5mbyk7CisgICAgICAgICAgICBLTVBfQ1BVX0ZSRUUob2xkTWFzayk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgICphZGRyZXNzMm9zID0gKEFkZHJVbnNQYWlyKilfX2ttcF9hbGxvY2F0ZShzaXplb2YoQWRkclVuc1BhaXIpKTsKKyAgICAgICAgQWRkcmVzcyBhZGRyKDEpOworICAgICAgICBhZGRyLmxhYmVsc1swXSA9IHRocmVhZEluZm9bMF0ucGtnSWQ7CisgICAgICAgICgqYWRkcmVzczJvcylbMF0gPSBBZGRyVW5zUGFpcihhZGRyLCB0aHJlYWRJbmZvWzBdLm9zSWQpOworCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA8IDApIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF90b3BvbG9neSgqYWRkcmVzczJvcywgMSwgMSwgMCwgLTEsIC0xKTsKKyAgICAgICAgfQorCisgICAgICAgIF9fa21wX2ZyZWUodGhyZWFkSW5mbyk7CisgICAgICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBTb3J0IHRoZSB0aHJlYWRJbmZvIHRhYmxlIGJ5IHBoeXNpY2FsIElkLgorICAgIC8vCisgICAgcXNvcnQodGhyZWFkSW5mbywgbkFwaWNzLCBzaXplb2YoKnRocmVhZEluZm8pLAorICAgICAgX19rbXBfYWZmaW5pdHlfY21wX2FwaWNUaHJlYWRJbmZvX3BoeXNfaWQpOworCisgICAgLy8KKyAgICAvLyBUaGUgdGFibGUgaXMgbm93IHNvcnRlZCBieSBwa2dJZCAvIGNvcmVJZCAvIHRocmVhZElkLCBidXQgd2UgcmVhbGx5CisgICAgLy8gZG9uJ3Qga25vdyB0aGUgcmFkaXggb2YgYW55IG9mIHRoZSBmaWVsZHMuICBwa2dJZCdzIG1heSBiZSBzcGFyc2VseQorICAgIC8vIGFzc2lnbmVkIGFtb25nIHRoZSBjaGlwcyBvbiBhIHN5c3RlbS4gIEFsdGhvdWdoIGNvcmVJZCdzIGFyZSB1c3VhbGx5CisgICAgLy8gYXNzaWduZWQgWzAgLi4gY29yZXNQZXJQa2ctMV0gYW5kIHRocmVhZElkJ3MgYXJlIHVzdWFsbHkgYXNzaWduZWQKKyAgICAvLyBbMC4udGhyZWFkc1BlckNvcmUtMV0sIHdlIGRvbid0IHdhbnQgdG8gbWFrZSBhbnkgc3VjaCBhc3N1bXB0aW9ucy4KKyAgICAvLworICAgIC8vIEZvciB0aGF0IG1hdHRlciwgd2UgZG9uJ3Qga25vdyB3aGF0IGNvcmVzUGVyUGtnIGFuZCB0aHJlYWRzUGVyQ29yZQorICAgIC8vIChvciB0aGUgdG90YWwgIyBwYWNrYWdlcykgYXJlIGF0IHRoaXMgcG9pbnQgLSB3ZSB3YW50IHRvIGRldGVybWluZQorICAgIC8vIHRoYXQgbm93LiAgV2Ugb25seSBoYXZlIGFuIHVwcGVyIGJvdW5kIG9uIHRoZSBmaXJzdCB0d28gZmlndXJlcy4KKyAgICAvLworICAgIC8vIFdlIGFsc28gcGVyZm9ybSBhIGNvbnNpc3RlbmN5IGNoZWNrIGF0IHRoaXMgcG9pbnQ6IHRoZSB2YWx1ZXMgcmV0dXJuZWQKKyAgICAvLyBieSB0aGUgY3B1aWQgaW5zdHJ1Y3Rpb24gZm9yIGFueSB0aHJlYWQgYm91bmQgdG8gYSBnaXZlbiBwYWNrYWdlIGhhZAorICAgIC8vIGJldHRlciByZXR1cm4gdGhlIHNhbWUgaW5mbyBmb3IgbWF4VGhyZWFkc1BlclBrZyBhbmQgbWF4Q29yZXNQZXJQa2cuCisgICAgLy8KKyAgICBuUGFja2FnZXMgPSAxOworICAgIG5Db3Jlc1BlclBrZyA9IDE7CisgICAgX19rbXBfblRocmVhZHNQZXJDb3JlID0gMTsKKyAgICB1bnNpZ25lZCBuQ29yZXMgPSAxOworCisgICAgdW5zaWduZWQgcGtnQ3QgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgcmFkaWkKKyAgICB1bnNpZ25lZCBsYXN0UGtnSWQgPSB0aHJlYWRJbmZvWzBdLnBrZ0lkOworICAgIHVuc2lnbmVkIGNvcmVDdCA9IDE7CisgICAgdW5zaWduZWQgbGFzdENvcmVJZCA9IHRocmVhZEluZm9bMF0uY29yZUlkOworICAgIHVuc2lnbmVkIHRocmVhZEN0ID0gMTsKKyAgICB1bnNpZ25lZCBsYXN0VGhyZWFkSWQgPSB0aHJlYWRJbmZvWzBdLnRocmVhZElkOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRyYS1wa2cgY29uc2lzdCBjaGVja3MKKyAgICB1bnNpZ25lZCBwcmV2TWF4Q29yZXNQZXJQa2cgPSB0aHJlYWRJbmZvWzBdLm1heENvcmVzUGVyUGtnOworICAgIHVuc2lnbmVkIHByZXZNYXhUaHJlYWRzUGVyUGtnID0gdGhyZWFkSW5mb1swXS5tYXhUaHJlYWRzUGVyUGtnOworCisgICAgZm9yIChpID0gMTsgaSA8IG5BcGljczsgaSsrKSB7CisgICAgICAgIGlmICh0aHJlYWRJbmZvW2ldLnBrZ0lkICE9IGxhc3RQa2dJZCkgeworICAgICAgICAgICAgbkNvcmVzKys7CisgICAgICAgICAgICBwa2dDdCsrOworICAgICAgICAgICAgbGFzdFBrZ0lkID0gdGhyZWFkSW5mb1tpXS5wa2dJZDsKKyAgICAgICAgICAgIGlmICgoaW50KWNvcmVDdCA+IG5Db3Jlc1BlclBrZykgbkNvcmVzUGVyUGtnID0gY29yZUN0OworICAgICAgICAgICAgY29yZUN0ID0gMTsKKyAgICAgICAgICAgIGxhc3RDb3JlSWQgPSB0aHJlYWRJbmZvW2ldLmNvcmVJZDsKKyAgICAgICAgICAgIGlmICgoaW50KXRocmVhZEN0ID4gX19rbXBfblRocmVhZHNQZXJDb3JlKSBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSB0aHJlYWRDdDsKKyAgICAgICAgICAgIHRocmVhZEN0ID0gMTsKKyAgICAgICAgICAgIGxhc3RUaHJlYWRJZCA9IHRocmVhZEluZm9baV0udGhyZWFkSWQ7CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBUaGlzIGlzIGEgZGlmZmVyZW50IHBhY2thZ2UsIHNvIGdvIG9uIHRvIHRoZSBuZXh0IGl0ZXJhdGlvbgorICAgICAgICAgICAgLy8gd2l0aG91dCBkb2luZyBhbnkgY29uc2lzdGVuY3kgY2hlY2tzLiAgUmVzZXQgdGhlIGNvbnNpc3RlbmN5CisgICAgICAgICAgICAvLyBjaGVjayB2YXJzLCB0aG91Z2guCisgICAgICAgICAgICAvLworICAgICAgICAgICAgcHJldk1heENvcmVzUGVyUGtnID0gdGhyZWFkSW5mb1tpXS5tYXhDb3Jlc1BlclBrZzsKKyAgICAgICAgICAgIHByZXZNYXhUaHJlYWRzUGVyUGtnID0gdGhyZWFkSW5mb1tpXS5tYXhUaHJlYWRzUGVyUGtnOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGhyZWFkSW5mb1tpXS5jb3JlSWQgIT0gbGFzdENvcmVJZCkgeworICAgICAgICAgICAgbkNvcmVzKys7CisgICAgICAgICAgICBjb3JlQ3QrKzsKKyAgICAgICAgICAgIGxhc3RDb3JlSWQgPSB0aHJlYWRJbmZvW2ldLmNvcmVJZDsKKyAgICAgICAgICAgIGlmICgoaW50KXRocmVhZEN0ID4gX19rbXBfblRocmVhZHNQZXJDb3JlKSBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSB0aHJlYWRDdDsKKyAgICAgICAgICAgIHRocmVhZEN0ID0gMTsKKyAgICAgICAgICAgIGxhc3RUaHJlYWRJZCA9IHRocmVhZEluZm9baV0udGhyZWFkSWQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodGhyZWFkSW5mb1tpXS50aHJlYWRJZCAhPSBsYXN0VGhyZWFkSWQpIHsKKyAgICAgICAgICAgIHRocmVhZEN0Kys7CisgICAgICAgICAgICBsYXN0VGhyZWFkSWQgPSB0aHJlYWRJbmZvW2ldLnRocmVhZElkOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgX19rbXBfZnJlZSh0aHJlYWRJbmZvKTsKKyAgICAgICAgICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICAgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfTGVnYWN5QXBpY0lEc05vdFVuaXF1ZTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIENoZWNrIHRvIG1ha2UgY2VydGFpbiB0aGF0IHRoZSBtYXhDb3Jlc1BlclBrZyBhbmQgbWF4VGhyZWFkc1BlclBrZworICAgICAgICAvLyBmaWVsZHMgYWdyZWUgYmV0d2VlbiBhbGwgdGhlIHRocmVhZHMgYm91bmRzIHRvIGEgZ2l2ZW4gcGFja2FnZS4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKChwcmV2TWF4Q29yZXNQZXJQa2cgIT0gdGhyZWFkSW5mb1tpXS5tYXhDb3Jlc1BlclBrZykKKyAgICAgICAgICB8fCAocHJldk1heFRocmVhZHNQZXJQa2cgIT0gdGhyZWFkSW5mb1tpXS5tYXhUaHJlYWRzUGVyUGtnKSkgeworICAgICAgICAgICAgX19rbXBfZnJlZSh0aHJlYWRJbmZvKTsKKyAgICAgICAgICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICAgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfSW5jb25zaXN0ZW50Q3B1aWRJbmZvOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorICAgIG5QYWNrYWdlcyA9IHBrZ0N0OworICAgIGlmICgoaW50KWNvcmVDdCA+IG5Db3Jlc1BlclBrZykgbkNvcmVzUGVyUGtnID0gY29yZUN0OworICAgIGlmICgoaW50KXRocmVhZEN0ID4gX19rbXBfblRocmVhZHNQZXJDb3JlKSBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSB0aHJlYWRDdDsKKworICAgIC8vCisgICAgLy8gV2hlbiBhZmZpbml0eSBpcyBvZmYsIHRoaXMgcm91dGluZSB3aWxsIHN0aWxsIGJlIGNhbGxlZCB0byBzZXQKKyAgICAvLyBfX2ttcF9uY29yZXMsIGFzIHdlbGwgYXMgX19rbXBfblRocmVhZHNQZXJDb3JlLAorICAgIC8vIG5Db3Jlc1BlclBrZywgJiBuUGFja2FnZXMuICBNYWtlIHN1cmUgYWxsIHRoZXNlIHZhcnMgYXJlIHNldAorICAgIC8vIGNvcnJlY3RseSwgYW5kIHJldHVybiBub3cgaWYgYWZmaW5pdHkgaXMgbm90IGVuYWJsZWQuCisgICAgLy8KKyAgICBfX2ttcF9uY29yZXMgPSBuQ29yZXM7CisgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwgb2xkTWFzayk7CisKKyAgICAgICAgS01QX0lORk9STShBZmZVc2VHbG9iQ3B1aWQsICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzaykgeworICAgICAgICAgICAgS01QX0lORk9STShJbml0T1NQcm9jU2V0UmVzcGVjdCwgIktNUF9BRkZJTklUWSIsIGJ1Zik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEluaXRPU1Byb2NTZXROb3RSZXNwZWN0LCAiS01QX0FGRklOSVRZIiwgYnVmKTsKKyAgICAgICAgfQorICAgICAgICBLTVBfSU5GT1JNKEF2YWlsYWJsZU9TUHJvYywgIktNUF9BRkZJTklUWSIsIF9fa21wX2F2YWlsX3Byb2MpOworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdW5pZm9ybV90b3BvbG9neSgpKSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKFVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oTm9uVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICB9CisgICAgICAgIEtNUF9JTkZPUk0oVG9wb2xvZ3ksICJLTVBfQUZGSU5JVFkiLCBuUGFja2FnZXMsIG5Db3Jlc1BlclBrZywKKyAgICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUsIF9fa21wX25jb3Jlcyk7CisKKyAgICB9CisKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKSB7CisgICAgICAgIF9fa21wX2ZyZWUodGhyZWFkSW5mbyk7CisgICAgICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBOb3cgdGhhdCB3ZSd2ZSBkZXRlcm1pbmVkIHRoZSBudW1iZXIgb2YgcGFja2FnZXMsIHRoZSBudW1iZXIgb2YgY29yZXMKKyAgICAvLyBwZXIgcGFja2FnZSwgYW5kIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBwZXIgY29yZSwgd2UgY2FuIGNvbnN0cnVjdCB0aGUKKyAgICAvLyBkYXRhIHN0cnVjdHVyZSB0aGF0IGlzIHRvIGJlIHJldHVybmVkLgorICAgIC8vCisgICAgaW50IHBrZ0xldmVsID0gMDsKKyAgICBpbnQgY29yZUxldmVsID0gKG5Db3Jlc1BlclBrZyA8PSAxKSA/IC0xIDogMTsKKyAgICBpbnQgdGhyZWFkTGV2ZWwgPSAoX19rbXBfblRocmVhZHNQZXJDb3JlIDw9IDEpID8gLTEgOiAoKGNvcmVMZXZlbCA+PSAwKSA/IDIgOiAxKTsKKyAgICB1bnNpZ25lZCBkZXB0aCA9IChwa2dMZXZlbCA+PSAwKSArIChjb3JlTGV2ZWwgPj0gMCkgKyAodGhyZWFkTGV2ZWwgPj0gMCk7CisKKyAgICBLTVBfQVNTRVJUKGRlcHRoID4gMCk7CisgICAgKmFkZHJlc3Myb3MgPSAoQWRkclVuc1BhaXIqKV9fa21wX2FsbG9jYXRlKHNpemVvZihBZGRyVW5zUGFpcikgKiBuQXBpY3MpOworCisgICAgZm9yIChpID0gMDsgaSA8IG5BcGljczsgKytpKSB7CisgICAgICAgIEFkZHJlc3MgYWRkcihkZXB0aCk7CisgICAgICAgIHVuc2lnbmVkIG9zID0gdGhyZWFkSW5mb1tpXS5vc0lkOworICAgICAgICBpbnQgZCA9IDA7CisKKyAgICAgICAgaWYgKHBrZ0xldmVsID49IDApIHsKKyAgICAgICAgICAgIGFkZHIubGFiZWxzW2QrK10gPSB0aHJlYWRJbmZvW2ldLnBrZ0lkOworICAgICAgICB9CisgICAgICAgIGlmIChjb3JlTGV2ZWwgPj0gMCkgeworICAgICAgICAgICAgYWRkci5sYWJlbHNbZCsrXSA9IHRocmVhZEluZm9baV0uY29yZUlkOworICAgICAgICB9CisgICAgICAgIGlmICh0aHJlYWRMZXZlbCA+PSAwKSB7CisgICAgICAgICAgICBhZGRyLmxhYmVsc1tkKytdID0gdGhyZWFkSW5mb1tpXS50aHJlYWRJZDsKKyAgICAgICAgfQorICAgICAgICAoKmFkZHJlc3Myb3MpW2ldID0gQWRkclVuc1BhaXIoYWRkciwgb3MpOworICAgIH0KKworICAgIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA8IDApIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gU2V0IHRoZSBncmFudWxhcml0eSBsZXZlbCBiYXNlZCBvbiB3aGF0IGxldmVscyBhcmUgbW9kZWxlZAorICAgICAgICAvLyBpbiB0aGUgbWFjaGluZSB0b3BvbG9neSBtYXAuCisgICAgICAgIC8vCisgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzID0gMDsKKyAgICAgICAgaWYgKCh0aHJlYWRMZXZlbCA+PSAwKQorICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV9ncmFuID4gYWZmaW5pdHlfZ3Jhbl90aHJlYWQpKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscysrOworICAgICAgICB9CisgICAgICAgIGlmICgoY29yZUxldmVsID49IDApICYmIChfX2ttcF9hZmZpbml0eV9ncmFuID4gYWZmaW5pdHlfZ3Jhbl9jb3JlKSkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHBrZ0xldmVsID49IDApICYmIChfX2ttcF9hZmZpbml0eV9ncmFuID4gYWZmaW5pdHlfZ3Jhbl9wYWNrYWdlKSkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X3RvcG9sb2d5KCphZGRyZXNzMm9zLCBuQXBpY3MsIGRlcHRoLCBwa2dMZXZlbCwKKyAgICAgICAgICBjb3JlTGV2ZWwsIHRocmVhZExldmVsKTsKKyAgICB9CisKKyAgICBfX2ttcF9mcmVlKHRocmVhZEluZm8pOworICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICByZXR1cm4gZGVwdGg7Cit9CisKKworLy8KKy8vIEludGVsKFIpIG1pY3JvYXJjaGl0ZWN0dXJlIGNvZGUgbmFtZSBOZWhhbGVtLCBEdW5uaW5ndG9uIGFuZCBsYXRlcgorLy8gYXJjaGl0ZWN0dXJlcyBzdXBwb3J0IGEgbmV3ZXIgaW50ZXJmYWNlIGZvciBzcGVjaWZ5aW5nIHRoZSB4MkFQSUMgSWRzLAorLy8gYmFzZWQgb24gY3B1aWQgbGVhZiAxMS4KKy8vCitzdGF0aWMgaW50CitfX2ttcF9hZmZpbml0eV9jcmVhdGVfeDJhcGljaWRfbWFwKEFkZHJVbnNQYWlyICoqYWRkcmVzczJvcywKKyAga21wX2kxOG5faWRfdCAqY29uc3QgbXNnX2lkKQoreworICAgIGttcF9jcHVpZCBidWY7CisKKyAgICAqYWRkcmVzczJvcyA9IE5VTEw7CisgICAgKm1zZ19pZCA9IGttcF9pMThuX251bGw7CisKKyAgICAvLworICAgIC8vIENoZWNrIHRvIHNlZSBpZiBjcHVpZCBsZWFmIDExIGlzIHN1cHBvcnRlZC4KKyAgICAvLworICAgIF9fa21wX3g4Nl9jcHVpZCgwLCAwLCAmYnVmKTsKKyAgICBpZiAoYnVmLmVheCA8IDExKSB7CisgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfTm9MZWFmMTFTdXBwb3J0OworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIF9fa21wX3g4Nl9jcHVpZCgxMSwgMCwgJmJ1Zik7CisgICAgaWYgKGJ1Zi5lYnggPT0gMCkgeworICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX05vTGVhZjExU3VwcG9ydDsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8vCisgICAgLy8gRmluZCB0aGUgbnVtYmVyIG9mIGxldmVscyBpbiB0aGUgbWFjaGluZSB0b3BvbG9neS4gIFdoaWxlIHdlJ3JlIGF0IGl0LAorICAgIC8vIGdldCB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIF9fa21wX25UaHJlYWRzUGVyQ29yZSAmIG5Db3Jlc1BlclBrZy4gIFdlIHdpbGwKKyAgICAvLyB0cnkgdG8gZ2V0IG1vcmUgYWNjdXJhdGUgdmFsdWVzIGxhdGVyIGJ5IGV4cGxpY2l0bHkgY291bnRpbmcgdGhlbSwKKyAgICAvLyBidXQgZ2V0IHJlYXNvbmFibGUgZGVmYXVsdHMgbm93LCBpbiBjYXNlIHdlIHJldHVybiBlYXJseS4KKyAgICAvLworICAgIGludCBsZXZlbDsKKyAgICBpbnQgdGhyZWFkTGV2ZWwgPSAtMTsKKyAgICBpbnQgY29yZUxldmVsID0gLTE7CisgICAgaW50IHBrZ0xldmVsID0gLTE7CisgICAgX19rbXBfblRocmVhZHNQZXJDb3JlID0gbkNvcmVzUGVyUGtnID0gblBhY2thZ2VzID0gMTsKKworICAgIGZvciAobGV2ZWwgPSAwOzsgbGV2ZWwrKykgeworICAgICAgICBpZiAobGV2ZWwgPiAzMSkgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIEZJWE1FOiBIYWNrIGZvciBEUEQyMDAxNjMxODAKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBJZiBsZXZlbCBpcyBiaWcgdGhlbiBzb21ldGhpbmcgd2VudCB3cm9uZyAtPiBleGl0aW5nCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gVGhlcmUgY291bGQgYWN0dWFsbHkgYmUgMzIgdmFsaWQgbGV2ZWxzIGluIHRoZSBtYWNoaW5lIHRvcG9sb2d5LAorICAgICAgICAgICAgLy8gYnV0IHNvIGZhciwgdGhlIG9ubHkgbWFjaGluZSB3ZSBoYXZlIHNlZW4gd2hpY2ggZG9lcyBub3QgZXhpdAorICAgICAgICAgICAgLy8gdGhpcyBsb29wIGJlZm9yZSBpdGVyYXRpb24gMzIgaGFzIGZ1YmFyIHgyQVBJQyBzZXR0aW5ncy4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBGb3Igbm93LCBqdXN0IHJlamVjdCB0aGlzIGNhc2UgYmFzZWQgdXBvbiBsb29wIHRyaXAgY291bnQuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9JbnZhbGlkQ3B1aWRJbmZvOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIF9fa21wX3g4Nl9jcHVpZCgxMSwgbGV2ZWwsICZidWYpOworICAgICAgICBpZiAoYnVmLmVieCA9PSAwKSB7CisgICAgICAgICAgICBpZiAocGtnTGV2ZWwgPCAwKSB7CisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBXaWxsIGluZmVyIG5QYWNrYWdlcyBmcm9tIF9fa21wX3hwcm9jCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBwa2dMZXZlbCA9IGxldmVsOworICAgICAgICAgICAgICAgIGxldmVsKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpbnQga2luZCA9IChidWYuZWN4ID4+IDgpICYgMHhmZjsKKyAgICAgICAgaWYgKGtpbmQgPT0gMSkgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFNNVCBsZXZlbAorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIHRocmVhZExldmVsID0gbGV2ZWw7CisgICAgICAgICAgICBjb3JlTGV2ZWwgPSAtMTsKKyAgICAgICAgICAgIHBrZ0xldmVsID0gLTE7CisgICAgICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSBidWYuZWJ4ICYgMHhmZjsKKyAgICAgICAgICAgIGlmIChfX2ttcF9uVGhyZWFkc1BlckNvcmUgPT0gMCkgeworICAgICAgICAgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfSW52YWxpZENwdWlkSW5mbzsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoa2luZCA9PSAyKSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gY29yZSBsZXZlbAorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGNvcmVMZXZlbCA9IGxldmVsOworICAgICAgICAgICAgcGtnTGV2ZWwgPSAtMTsKKyAgICAgICAgICAgIG5Db3Jlc1BlclBrZyA9IGJ1Zi5lYnggJiAweGZmOworICAgICAgICAgICAgaWYgKG5Db3Jlc1BlclBrZyA9PSAwKSB7CisgICAgICAgICAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9JbnZhbGlkQ3B1aWRJbmZvOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChsZXZlbCA8PSAwKSB7CisgICAgICAgICAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9JbnZhbGlkQ3B1aWRJbmZvOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwa2dMZXZlbCA+PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwa2dMZXZlbCA9IGxldmVsOworICAgICAgICAgICAgblBhY2thZ2VzID0gYnVmLmVieCAmIDB4ZmY7CisgICAgICAgICAgICBpZiAoblBhY2thZ2VzID09IDApIHsKKyAgICAgICAgICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX0ludmFsaWRDcHVpZEluZm87CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGludCBkZXB0aCA9IGxldmVsOworCisgICAgLy8KKyAgICAvLyBJbiB0aGUgYWJvdmUgbG9vcCwgImxldmVsIiB3YXMgY291bnRlZCBmcm9tIHRoZSBmaW5lc3QgbGV2ZWwgKHVzdWFsbHkKKyAgICAvLyB0aHJlYWQpIHRvIHRoZSBjb2Fyc2VzdC4gIFRoZSBjYWxsZXIgZXhwZWN0cyB0aGF0IHdlIHdpbGwgcGxhY2UgdGhlCisgICAgLy8gbGFiZWxzIGluICgqYWRkcmVzczJvcylbXS5maXJzdC5sYWJlbHNbXSBpbiB0aGUgaW52ZXJzZSBvcmRlciwgc28KKyAgICAvLyB3ZSBuZWVkIHRvIGludmVydCB0aGUgdmFycyBzYXlpbmcgd2hpY2ggbGV2ZWwgbWVhbnMgd2hhdC4KKyAgICAvLworICAgIGlmICh0aHJlYWRMZXZlbCA+PSAwKSB7CisgICAgICAgIHRocmVhZExldmVsID0gZGVwdGggLSB0aHJlYWRMZXZlbCAtIDE7CisgICAgfQorICAgIGlmIChjb3JlTGV2ZWwgPj0gMCkgeworICAgICAgICBjb3JlTGV2ZWwgPSBkZXB0aCAtIGNvcmVMZXZlbCAtIDE7CisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQocGtnTGV2ZWwgPj0gMCk7CisgICAgcGtnTGV2ZWwgPSBkZXB0aCAtIHBrZ0xldmVsIC0gMTsKKworICAgIC8vCisgICAgLy8gVGhlIGFsZ29yaXRobSB1c2VkIHN0YXJ0cyBieSBzZXR0aW5nIHRoZSBhZmZpbml0eSB0byBlYWNoIGF2YWlsYWJsZQorICAgIC8vIHRocmVhZCBhbmQgcmV0cmlldmluZyBpbmZvIGZyb20gdGhlIGNwdWlkIGluc3RydWN0aW9uLCBzbyBpZiB3ZSBhcmUKKyAgICAvLyBub3QgY2FwYWJsZSBvZiBjYWxsaW5nIF9fa21wX2dldF9zeXN0ZW1fYWZmaW5pdHkoKSBhbmQKKyAgICAvLyBfa21wX2dldF9zeXN0ZW1fYWZmaW5pdHkoKSwgdGhlbiB3ZSBuZWVkIHRvIGRvIHNvbWV0aGluZyBlbHNlIC0gdXNlCisgICAgLy8gdGhlIGRlZmF1bHRzIHRoYXQgd2UgY2FsY3VsYXRlZCBmcm9tIGlzc3VpbmcgY3B1aWQgd2l0aG91dCBiaW5kaW5nCisgICAgLy8gdG8gZWFjaCBwcm9jLgorICAgIC8vCisgICAgaWYgKCEgS01QX0FGRklOSVRZX0NBUEFCTEUoKSkKKyAgICB7CisgICAgICAgIC8vCisgICAgICAgIC8vIEhhY2sgdG8gdHJ5IGFuZCBpbmZlciB0aGUgbWFjaGluZSB0b3BvbG9neSB1c2luZyBvbmx5IHRoZSBkYXRhCisgICAgICAgIC8vIGF2YWlsYWJsZSBmcm9tIGNwdWlkIG9uIHRoZSBjdXJyZW50IHRocmVhZCwgYW5kIF9fa21wX3hwcm9jLgorICAgICAgICAvLworICAgICAgICBLTVBfQVNTRVJUKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSk7CisKKyAgICAgICAgX19rbXBfbmNvcmVzID0gX19rbXBfeHByb2MgLyBfX2ttcF9uVGhyZWFkc1BlckNvcmU7CisgICAgICAgIG5QYWNrYWdlcyA9IChfX2ttcF94cHJvYyArIG5Db3Jlc1BlclBrZyAtIDEpIC8gbkNvcmVzUGVyUGtnOworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgS01QX0lORk9STShBZmZOb3RDYXBhYmxlVXNlTG9jQ3B1aWRMMTEsICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oQXZhaWxhYmxlT1NQcm9jLCAiS01QX0FGRklOSVRZIiwgX19rbXBfYXZhaWxfcHJvYyk7CisgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdW5pZm9ybV90b3BvbG9neSgpKSB7CisgICAgICAgICAgICAgICAgS01QX0lORk9STShVbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oTm9uVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgS01QX0lORk9STShUb3BvbG9neSwgIktNUF9BRkZJTklUWSIsIG5QYWNrYWdlcywgbkNvcmVzUGVyUGtnLAorICAgICAgICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUsIF9fa21wX25jb3Jlcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8KKyAgICAvLworICAgIC8vIEZyb20gaGVyZSBvbiwgd2UgY2FuIGFzc3VtZSB0aGF0IGl0IGlzIHNhZmUgdG8gY2FsbAorICAgIC8vIF9fa21wX2dldF9zeXN0ZW1fYWZmaW5pdHkoKSBhbmQgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eSgpLAorICAgIC8vIGV2ZW4gaWYgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X25vbmUuCisgICAgLy8KKworICAgIC8vCisgICAgLy8gU2F2ZSB0aGUgYWZmaW5pdHkgbWFzayBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLgorICAgIC8vCisgICAga21wX2FmZmluX21hc2tfdCAqb2xkTWFzazsKKyAgICBLTVBfQ1BVX0FMTE9DKG9sZE1hc2spOworICAgIF9fa21wX2dldF9zeXN0ZW1fYWZmaW5pdHkob2xkTWFzaywgVFJVRSk7CisKKyAgICAvLworICAgIC8vIEFsbG9jYXRlIHRoZSBkYXRhIHN0cnVjdHVyZSB0byBiZSByZXR1cm5lZC4KKyAgICAvLworICAgIEFkZHJVbnNQYWlyICpyZXR2YWwgPSAoQWRkclVuc1BhaXIgKikKKyAgICAgIF9fa21wX2FsbG9jYXRlKHNpemVvZihBZGRyVW5zUGFpcikgKiBfX2ttcF9hdmFpbF9wcm9jKTsKKworICAgIC8vCisgICAgLy8gUnVuIHRocm91Z2ggZWFjaCBvZiB0aGUgYXZhaWxhYmxlIGNvbnRleHRzLCBiaW5kaW5nIHRoZSBjdXJyZW50IHRocmVhZAorICAgIC8vIHRvIGl0LCBhbmQgb2J0YWluaW5nIHRoZSBwZXJ0aW5lbnQgaW5mb3JtYXRpb24gdXNpbmcgdGhlIGNwdWlkIGluc3RyLgorICAgIC8vCisgICAgdW5zaWduZWQgaW50IHByb2M7CisgICAgaW50IG5BcGljcyA9IDA7CisgICAgS01QX0NQVV9TRVRfSVRFUkFURShwcm9jLCBmdWxsTWFzaykgeworICAgICAgICAvLworICAgICAgICAvLyBTa2lwIHRoaXMgcHJvYyBpZiBpdCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIG1hY2hpbmUgbW9kZWwuCisgICAgICAgIC8vCisgICAgICAgIGlmICghIEtNUF9DUFVfSVNTRVQocHJvYywgZnVsbE1hc2spKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKG5BcGljcyA8IF9fa21wX2F2YWlsX3Byb2MpOworCisgICAgICAgIF9fa21wX2FmZmluaXR5X2JpbmRfdGhyZWFkKHByb2MpOworCisgICAgICAgIC8vCisgICAgICAgIC8vIEV4dHJhY2ggdGhlIGxhYmVscyBmb3IgZWFjaCBsZXZlbCBpbiB0aGUgbWFjaGluZSB0b3BvbG9neSBtYXAKKyAgICAgICAgLy8gZnJvbSB0aGUgQXBpYyBJRC4KKyAgICAgICAgLy8KKyAgICAgICAgQWRkcmVzcyBhZGRyKGRlcHRoKTsKKyAgICAgICAgaW50IHByZXZfc2hpZnQgPSAwOworCisgICAgICAgIGZvciAobGV2ZWwgPSAwOyBsZXZlbCA8IGRlcHRoOyBsZXZlbCsrKSB7CisgICAgICAgICAgICBfX2ttcF94ODZfY3B1aWQoMTEsIGxldmVsLCAmYnVmKTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGFwaWNJZCA9IGJ1Zi5lZHg7CisgICAgICAgICAgICBpZiAoYnVmLmVieCA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGxldmVsICE9IGRlcHRoIC0gMSkgeworICAgICAgICAgICAgICAgICAgICBLTVBfQ1BVX0ZSRUUob2xkTWFzayk7CisgICAgICAgICAgICAgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfSW5jb25zaXN0ZW50Q3B1aWRJbmZvOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFkZHIubGFiZWxzW2RlcHRoIC0gbGV2ZWwgLSAxXSA9IGFwaWNJZCA+PiBwcmV2X3NoaWZ0OworICAgICAgICAgICAgICAgIGxldmVsKys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgc2hpZnQgPSBidWYuZWF4ICYgMHgxZjsKKyAgICAgICAgICAgIGludCBtYXNrID0gKDEgPDwgc2hpZnQpIC0gMTsKKyAgICAgICAgICAgIGFkZHIubGFiZWxzW2RlcHRoIC0gbGV2ZWwgLSAxXSA9IChhcGljSWQgJiBtYXNrKSA+PiBwcmV2X3NoaWZ0OworICAgICAgICAgICAgcHJldl9zaGlmdCA9IHNoaWZ0OworICAgICAgICB9CisgICAgICAgIGlmIChsZXZlbCAhPSBkZXB0aCkgeworICAgICAgICAgICAgS01QX0NQVV9GUkVFKG9sZE1hc2spOworICAgICAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9JbmNvbnNpc3RlbnRDcHVpZEluZm87CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICByZXR2YWxbbkFwaWNzXSA9IEFkZHJVbnNQYWlyKGFkZHIsIHByb2MpOworICAgICAgICBuQXBpY3MrKzsKKyAgICB9CisKKyAgICAvLworICAgIC8vIFdlJ3ZlIGNvbGxlY3RlZCBhbGwgdGhlIGluZm8gd2UgbmVlZC4KKyAgICAvLyBSZXN0b3JlIHRoZSBvbGQgYWZmaW5pdHkgbWFzayBmb3IgdGhpcyB0aHJlYWQuCisgICAgLy8KKyAgICBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KG9sZE1hc2ssIFRSVUUpOworCisgICAgLy8KKyAgICAvLyBJZiB0aGVyZSdzIG9ubHkgb25lIHRocmVhZCBjb250ZXh0IHRvIGJpbmQgdG8sIHJldHVybiBub3cuCisgICAgLy8KKyAgICBLTVBfQVNTRVJUKG5BcGljcyA+IDApOworICAgIGlmIChuQXBpY3MgPT0gMSkgeworICAgICAgICBfX2ttcF9uY29yZXMgPSBuUGFja2FnZXMgPSAxOworICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSBuQ29yZXNQZXJQa2cgPSAxOworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2soYnVmLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sIG9sZE1hc2spOworCisgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZlVzZUdsb2JDcHVpZEwxMSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzaykgeworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBidWYpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEluaXRPU1Byb2NTZXROb3RSZXNwZWN0LCAiS01QX0FGRklOSVRZIiwgYnVmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEtNUF9JTkZPUk0oQXZhaWxhYmxlT1NQcm9jLCAiS01QX0FGRklOSVRZIiwgX19rbXBfYXZhaWxfcHJvYyk7CisgICAgICAgICAgICBLTVBfSU5GT1JNKFVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oVG9wb2xvZ3ksICJLTVBfQUZGSU5JVFkiLCBuUGFja2FnZXMsIG5Db3Jlc1BlclBrZywKKyAgICAgICAgICAgICAgX19rbXBfblRocmVhZHNQZXJDb3JlLCBfX2ttcF9uY29yZXMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSkgeworICAgICAgICAgICAgX19rbXBfZnJlZShyZXR2YWwpOworICAgICAgICAgICAgS01QX0NQVV9GUkVFKG9sZE1hc2spOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBGb3JtIGFuIEFkZHJlc3Mgb2JqZWN0IHdoaWNoIG9ubHkgaW5jbHVkZXMgdGhlIHBhY2thZ2UgbGV2ZWwuCisgICAgICAgIC8vCisgICAgICAgIEFkZHJlc3MgYWRkcigxKTsKKyAgICAgICAgYWRkci5sYWJlbHNbMF0gPSByZXR2YWxbMF0uZmlyc3QubGFiZWxzW3BrZ0xldmVsXTsKKyAgICAgICAgcmV0dmFsWzBdLmZpcnN0ID0gYWRkcjsKKworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPCAwKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfdG9wb2xvZ3kocmV0dmFsLCAxLCAxLCAwLCAtMSwgLTEpOworICAgICAgICB9CisKKyAgICAgICAgKmFkZHJlc3Myb3MgPSByZXR2YWw7CisgICAgICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBTb3J0IHRoZSB0YWJsZSBieSBwaHlzaWNhbCBJZC4KKyAgICAvLworICAgIHFzb3J0KHJldHZhbCwgbkFwaWNzLCBzaXplb2YoKnJldHZhbCksIF9fa21wX2FmZmluaXR5X2NtcF9BZGRyZXNzX2xhYmVscyk7CisKKyAgICAvLworICAgIC8vIEZpbmQgdGhlIHJhZGl4IGF0IGVhY2ggb2YgdGhlIGxldmVscy4KKyAgICAvLworICAgIHVuc2lnbmVkICp0b3RhbHMgPSAodW5zaWduZWQgKilfX2ttcF9hbGxvY2F0ZShkZXB0aCAqIHNpemVvZih1bnNpZ25lZCkpOworICAgIHVuc2lnbmVkICpjb3VudHMgPSAodW5zaWduZWQgKilfX2ttcF9hbGxvY2F0ZShkZXB0aCAqIHNpemVvZih1bnNpZ25lZCkpOworICAgIHVuc2lnbmVkICptYXhDdCA9ICh1bnNpZ25lZCAqKV9fa21wX2FsbG9jYXRlKGRlcHRoICogc2l6ZW9mKHVuc2lnbmVkKSk7CisgICAgdW5zaWduZWQgKmxhc3QgPSAodW5zaWduZWQgKilfX2ttcF9hbGxvY2F0ZShkZXB0aCAqIHNpemVvZih1bnNpZ25lZCkpOworICAgIGZvciAobGV2ZWwgPSAwOyBsZXZlbCA8IGRlcHRoOyBsZXZlbCsrKSB7CisgICAgICAgIHRvdGFsc1tsZXZlbF0gPSAxOworICAgICAgICBtYXhDdFtsZXZlbF0gPSAxOworICAgICAgICBjb3VudHNbbGV2ZWxdID0gMTsKKyAgICAgICAgbGFzdFtsZXZlbF0gPSByZXR2YWxbMF0uZmlyc3QubGFiZWxzW2xldmVsXTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIEZyb20gaGVyZSBvbiwgdGhlIGl0ZXJhdGlvbiB2YXJpYWJsZSAibGV2ZWwiIHJ1bnMgZnJvbSB0aGUgZmluZXN0CisgICAgLy8gbGV2ZWwgdG8gdGhlIGNvYXJzZXN0LCBpLmUuIHdlIGl0ZXJhdGUgZm9yd2FyZCB0aHJvdWdoCisgICAgLy8gKCphZGRyZXNzMm9zKVtdLmZpcnN0LmxhYmVsc1tdIC0gaW4gdGhlIHByZXZpb3VzIGxvb3BzLCB3ZSBpdGVyYXRlZAorICAgIC8vIGJhY2t3YXJkcy4KKyAgICAvLworICAgIGZvciAocHJvYyA9IDE7IChpbnQpcHJvYyA8IG5BcGljczsgcHJvYysrKSB7CisgICAgICAgIGludCBsZXZlbDsKKyAgICAgICAgZm9yIChsZXZlbCA9IDA7IGxldmVsIDwgZGVwdGg7IGxldmVsKyspIHsKKyAgICAgICAgICAgIGlmIChyZXR2YWxbcHJvY10uZmlyc3QubGFiZWxzW2xldmVsXSAhPSBsYXN0W2xldmVsXSkgeworICAgICAgICAgICAgICAgIGludCBqOworICAgICAgICAgICAgICAgIGZvciAoaiA9IGxldmVsICsgMTsgaiA8IGRlcHRoOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdG90YWxzW2pdKys7CisgICAgICAgICAgICAgICAgICAgIGNvdW50c1tqXSA9IDE7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBsaW5lIGJlbG93IGNhdXNlcyBwcmludGluZyBpbmNvcnJlY3QgdG9wb2xvZ3kgaW5mb3JtYXRpb24KKyAgICAgICAgICAgICAgICAgICAgLy8gaW4gY2FzZSB0aGUgbWF4IHZhbHVlIGZvciBzb21lIGxldmVsIChtYXhDdFtsZXZlbF0pIGlzIGVuY291bnRlcmVkIGVhcmxpZXIgdGhhbgorICAgICAgICAgICAgICAgICAgICAvLyBzb21lIGxlc3MgdmFsdWUgd2hpbGUgZ29pbmcgdGhyb3VnaCB0aGUgYXJyYXkuCisgICAgICAgICAgICAgICAgICAgIC8vIEZvciBleGFtcGxlLCBsZXQgcGtnMCBoYXMgNCBjb3JlcyBhbmQgcGtnMSBoYXMgMiBjb3Jlcy4gVGhlbiBtYXhDdFsxXSA9PSAyCisgICAgICAgICAgICAgICAgICAgIC8vIHdoZXJlYXMgaXQgbXVzdCBiZSA0LgorICAgICAgICAgICAgICAgICAgICAvLyBUT0RPISEhIENoZWNrIGlmIGl0IGNhbiBiZSBjb21tZW50ZWQgc2FmZWx5CisgICAgICAgICAgICAgICAgICAgIC8vbWF4Q3Rbal0gPSAxOworICAgICAgICAgICAgICAgICAgICBsYXN0W2pdID0gcmV0dmFsW3Byb2NdLmZpcnN0LmxhYmVsc1tqXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdG90YWxzW2xldmVsXSsrOworICAgICAgICAgICAgICAgIGNvdW50c1tsZXZlbF0rKzsKKyAgICAgICAgICAgICAgICBpZiAoY291bnRzW2xldmVsXSA+IG1heEN0W2xldmVsXSkgeworICAgICAgICAgICAgICAgICAgICBtYXhDdFtsZXZlbF0gPSBjb3VudHNbbGV2ZWxdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsYXN0W2xldmVsXSA9IHJldHZhbFtwcm9jXS5maXJzdC5sYWJlbHNbbGV2ZWxdOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobGV2ZWwgPT0gZGVwdGggLSAxKSB7CisgICAgICAgICAgICAgICAgX19rbXBfZnJlZShsYXN0KTsKKyAgICAgICAgICAgICAgICBfX2ttcF9mcmVlKG1heEN0KTsKKyAgICAgICAgICAgICAgICBfX2ttcF9mcmVlKGNvdW50cyk7CisgICAgICAgICAgICAgICAgX19rbXBfZnJlZSh0b3RhbHMpOworICAgICAgICAgICAgICAgIF9fa21wX2ZyZWUocmV0dmFsKTsKKyAgICAgICAgICAgICAgICBLTVBfQ1BVX0ZSRUUob2xkTWFzayk7CisgICAgICAgICAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl94MkFwaWNJRHNOb3RVbmlxdWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8KKyAgICAvLyBXaGVuIGFmZmluaXR5IGlzIG9mZiwgdGhpcyByb3V0aW5lIHdpbGwgc3RpbGwgYmUgY2FsbGVkIHRvIHNldAorICAgIC8vIF9fa21wX25jb3JlcywgYXMgd2VsbCBhcyBfX2ttcF9uVGhyZWFkc1BlckNvcmUsCisgICAgLy8gbkNvcmVzUGVyUGtnLCAmIG5QYWNrYWdlcy4gIE1ha2Ugc3VyZSBhbGwgdGhlc2UgdmFycyBhcmUgc2V0CisgICAgLy8gY29ycmVjdGx5LCBhbmQgcmV0dXJuIGlmIGFmZmluaXR5IGlzIG5vdCBlbmFibGVkLgorICAgIC8vCisgICAgaWYgKHRocmVhZExldmVsID49IDApIHsKKyAgICAgICAgX19rbXBfblRocmVhZHNQZXJDb3JlID0gbWF4Q3RbdGhyZWFkTGV2ZWxdOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfblRocmVhZHNQZXJDb3JlID0gMTsKKyAgICB9CisgICAgblBhY2thZ2VzID0gdG90YWxzW3BrZ0xldmVsXTsKKworICAgIGlmIChjb3JlTGV2ZWwgPj0gMCkgeworICAgICAgICBfX2ttcF9uY29yZXMgPSB0b3RhbHNbY29yZUxldmVsXTsKKyAgICAgICAgbkNvcmVzUGVyUGtnID0gbWF4Q3RbY29yZUxldmVsXTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIF9fa21wX25jb3JlcyA9IG5QYWNrYWdlczsKKyAgICAgICAgbkNvcmVzUGVyUGtnID0gMTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgbWFjaGluZSB0b3BvbG9neSBpcyB1bmlmb3JtCisgICAgLy8KKyAgICB1bnNpZ25lZCBwcm9kID0gbWF4Q3RbMF07CisgICAgZm9yIChsZXZlbCA9IDE7IGxldmVsIDwgZGVwdGg7IGxldmVsKyspIHsKKyAgICAgICBwcm9kICo9IG1heEN0W2xldmVsXTsKKyAgICB9CisgICAgYm9vbCB1bmlmb3JtID0gKHByb2QgPT0gdG90YWxzW2xldmVsIC0gMV0pOworCisgICAgLy8KKyAgICAvLyBQcmludCB0aGUgbWFjaGluZSB0b3BvbG9neSBzdW1tYXJ5LgorICAgIC8vCisgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgY2hhciBtYXNrW0tNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTl07CisgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2sobWFzaywgS01QX0FGRklOX01BU0tfUFJJTlRfTEVOLCBvbGRNYXNrKTsKKworICAgICAgICBLTVBfSU5GT1JNKEFmZlVzZUdsb2JDcHVpZEwxMSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrKSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEluaXRPU1Byb2NTZXRSZXNwZWN0LCAiS01QX0FGRklOSVRZIiwgbWFzayk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEluaXRPU1Byb2NTZXROb3RSZXNwZWN0LCAiS01QX0FGRklOSVRZIiwgbWFzayk7CisgICAgICAgIH0KKyAgICAgICAgS01QX0lORk9STShBdmFpbGFibGVPU1Byb2MsICJLTVBfQUZGSU5JVFkiLCBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICAgICAgaWYgKHVuaWZvcm0pIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgS01QX0lORk9STShOb25Vbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgIH0KKworICAgICAgICBrbXBfc3RyX2J1Zl90IGJ1ZjsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9pbml0KCZidWYpOworCisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoJmJ1ZiwgIiVkIiwgdG90YWxzWzBdKTsKKyAgICAgICAgZm9yIChsZXZlbCA9IDE7IGxldmVsIDw9IHBrZ0xldmVsOyBsZXZlbCsrKSB7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICIgeCAlZCIsIG1heEN0W2xldmVsXSk7CisgICAgICAgIH0KKyAgICAgICAgS01QX0lORk9STShUb3BvbG9neUV4dHJhLCAiS01QX0FGRklOSVRZIiwgYnVmLnN0ciwgbkNvcmVzUGVyUGtnLAorICAgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSwgX19rbXBfbmNvcmVzKTsKKworICAgICAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoJmJ1Zik7CisgICAgfQorCisgICAgaWYgKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSkgeworICAgICAgICBfX2ttcF9mcmVlKGxhc3QpOworICAgICAgICBfX2ttcF9mcmVlKG1heEN0KTsKKyAgICAgICAgX19rbXBfZnJlZShjb3VudHMpOworICAgICAgICBfX2ttcF9mcmVlKHRvdGFscyk7CisgICAgICAgIF9fa21wX2ZyZWUocmV0dmFsKTsKKyAgICAgICAgS01QX0NQVV9GUkVFKG9sZE1hc2spOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLworICAgIC8vIEZpbmQgYW55IGxldmVscyB3aXRoIHJhZGlpeCAxLCBhbmQgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgbWFwCisgICAgLy8gKGV4Y2VwdCBmb3IgdGhlIHBhY2thZ2UgbGV2ZWwpLgorICAgIC8vCisgICAgaW50IG5ld19kZXB0aCA9IDA7CisgICAgZm9yIChsZXZlbCA9IDA7IGxldmVsIDwgZGVwdGg7IGxldmVsKyspIHsKKyAgICAgICAgaWYgKChtYXhDdFtsZXZlbF0gPT0gMSkgJiYgKGxldmVsICE9IHBrZ0xldmVsKSkgeworICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBuZXdfZGVwdGgrKzsKKyAgICB9CisKKyAgICAvLworICAgIC8vIElmIHdlIGFyZSByZW1vdmluZyBhbnkgbGV2ZWxzLCBhbGxvY2F0ZSBhIG5ldyB2ZWN0b3IgdG8gcmV0dXJuLAorICAgIC8vIGFuZCBjb3B5IHRoZSByZWxldmFudCBpbmZvcm1hdGlvbiB0byBpdC4KKyAgICAvLworICAgIGlmIChuZXdfZGVwdGggIT0gZGVwdGgpIHsKKyAgICAgICAgQWRkclVuc1BhaXIgKm5ld19yZXR2YWwgPSAoQWRkclVuc1BhaXIgKilfX2ttcF9hbGxvY2F0ZSgKKyAgICAgICAgICBzaXplb2YoQWRkclVuc1BhaXIpICogbkFwaWNzKTsKKyAgICAgICAgZm9yIChwcm9jID0gMDsgKGludClwcm9jIDwgbkFwaWNzOyBwcm9jKyspIHsKKyAgICAgICAgICAgIEFkZHJlc3MgYWRkcihuZXdfZGVwdGgpOworICAgICAgICAgICAgbmV3X3JldHZhbFtwcm9jXSA9IEFkZHJVbnNQYWlyKGFkZHIsIHJldHZhbFtwcm9jXS5zZWNvbmQpOworICAgICAgICB9CisgICAgICAgIGludCBuZXdfbGV2ZWwgPSAwOworICAgICAgICBpbnQgbmV3UGtnTGV2ZWwgPSAtMTsKKyAgICAgICAgaW50IG5ld0NvcmVMZXZlbCA9IC0xOworICAgICAgICBpbnQgbmV3VGhyZWFkTGV2ZWwgPSAtMTsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAobGV2ZWwgPSAwOyBsZXZlbCA8IGRlcHRoOyBsZXZlbCsrKSB7CisgICAgICAgICAgICBpZiAoKG1heEN0W2xldmVsXSA9PSAxKQorICAgICAgICAgICAgICAmJiAobGV2ZWwgIT0gcGtnTGV2ZWwpKSB7CisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhpcyBsZXZlbC4gTmV2ZXIgcmVtb3ZlIHRoZSBwYWNrYWdlIGxldmVsCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsZXZlbCA9PSBwa2dMZXZlbCkgeworICAgICAgICAgICAgICAgIG5ld1BrZ0xldmVsID0gbGV2ZWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGV2ZWwgPT0gY29yZUxldmVsKSB7CisgICAgICAgICAgICAgICAgbmV3Q29yZUxldmVsID0gbGV2ZWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGV2ZWwgPT0gdGhyZWFkTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICBuZXdUaHJlYWRMZXZlbCA9IGxldmVsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChwcm9jID0gMDsgKGludClwcm9jIDwgbkFwaWNzOyBwcm9jKyspIHsKKyAgICAgICAgICAgICAgICBuZXdfcmV0dmFsW3Byb2NdLmZpcnN0LmxhYmVsc1tuZXdfbGV2ZWxdCisgICAgICAgICAgICAgICAgICA9IHJldHZhbFtwcm9jXS5maXJzdC5sYWJlbHNbbGV2ZWxdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmV3X2xldmVsKys7CisgICAgICAgIH0KKworICAgICAgICBfX2ttcF9mcmVlKHJldHZhbCk7CisgICAgICAgIHJldHZhbCA9IG5ld19yZXR2YWw7CisgICAgICAgIGRlcHRoID0gbmV3X2RlcHRoOworICAgICAgICBwa2dMZXZlbCA9IG5ld1BrZ0xldmVsOworICAgICAgICBjb3JlTGV2ZWwgPSBuZXdDb3JlTGV2ZWw7CisgICAgICAgIHRocmVhZExldmVsID0gbmV3VGhyZWFkTGV2ZWw7CisgICAgfQorCisgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzIDwgMCkgeworICAgICAgICAvLworICAgICAgICAvLyBTZXQgdGhlIGdyYW51bGFyaXR5IGxldmVsIGJhc2VkIG9uIHdoYXQgbGV2ZWxzIGFyZSBtb2RlbGVkCisgICAgICAgIC8vIGluIHRoZSBtYWNoaW5lIHRvcG9sb2d5IG1hcC4KKyAgICAgICAgLy8KKyAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPSAwOworICAgICAgICBpZiAoKHRocmVhZExldmVsID49IDApICYmIChfX2ttcF9hZmZpbml0eV9ncmFuID4gYWZmaW5pdHlfZ3Jhbl90aHJlYWQpKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscysrOworICAgICAgICB9CisgICAgICAgIGlmICgoY29yZUxldmVsID49IDApICYmIChfX2ttcF9hZmZpbml0eV9ncmFuID4gYWZmaW5pdHlfZ3Jhbl9jb3JlKSkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3JhbiA+IGFmZmluaXR5X2dyYW5fcGFja2FnZSkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X3RvcG9sb2d5KHJldHZhbCwgbkFwaWNzLCBkZXB0aCwgcGtnTGV2ZWwsCisgICAgICAgICAgY29yZUxldmVsLCB0aHJlYWRMZXZlbCk7CisgICAgfQorCisgICAgX19rbXBfZnJlZShsYXN0KTsKKyAgICBfX2ttcF9mcmVlKG1heEN0KTsKKyAgICBfX2ttcF9mcmVlKGNvdW50cyk7CisgICAgX19rbXBfZnJlZSh0b3RhbHMpOworICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICAqYWRkcmVzczJvcyA9IHJldHZhbDsKKyAgICByZXR1cm4gZGVwdGg7Cit9CisKKworIyBlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKworI2RlZmluZSBvc0lkSW5kZXggICAgICAgMAorI2RlZmluZSB0aHJlYWRJZEluZGV4ICAgMQorI2RlZmluZSBjb3JlSWRJbmRleCAgICAgMgorI2RlZmluZSBwa2dJZEluZGV4ICAgICAgMworI2RlZmluZSBub2RlSWRJbmRleCAgICAgNAorCit0eXBlZGVmIHVuc2lnbmVkICpQcm9jQ3B1SW5mbzsKK3N0YXRpYyB1bnNpZ25lZCBtYXhJbmRleCA9IHBrZ0lkSW5kZXg7CisKKworc3RhdGljIGludAorX19rbXBfYWZmaW5pdHlfY21wX1Byb2NDcHVJbmZvX29zX2lkKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisgICAgY29uc3QgdW5zaWduZWQgKmFhID0gKGNvbnN0IHVuc2lnbmVkICopYTsKKyAgICBjb25zdCB1bnNpZ25lZCAqYmIgPSAoY29uc3QgdW5zaWduZWQgKiliOworICAgIGlmIChhYVtvc0lkSW5kZXhdIDwgYmJbb3NJZEluZGV4XSkgcmV0dXJuIC0xOworICAgIGlmIChhYVtvc0lkSW5kZXhdID4gYmJbb3NJZEluZGV4XSkgcmV0dXJuIDE7CisgICAgcmV0dXJuIDA7Cit9OworCisKK3N0YXRpYyBpbnQKK19fa21wX2FmZmluaXR5X2NtcF9Qcm9jQ3B1SW5mb19waHlzX2lkKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisgICAgdW5zaWduZWQgaTsKKyAgICBjb25zdCB1bnNpZ25lZCAqYWEgPSAqKChjb25zdCB1bnNpZ25lZCAqKilhKTsKKyAgICBjb25zdCB1bnNpZ25lZCAqYmIgPSAqKChjb25zdCB1bnNpZ25lZCAqKiliKTsKKyAgICBmb3IgKGkgPSBtYXhJbmRleDsgOyBpLS0pIHsKKyAgICAgICAgaWYgKGFhW2ldIDwgYmJbaV0pIHJldHVybiAtMTsKKyAgICAgICAgaWYgKGFhW2ldID4gYmJbaV0pIHJldHVybiAxOworICAgICAgICBpZiAoaSA9PSBvc0lkSW5kZXgpIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworCisvLworLy8gUGFyc2UgL3Byb2MvY3B1aW5mbyAob3IgYW4gYWx0ZXJuYXRlIGZpbGUgaW4gdGhlIHNhbWUgZm9ybWF0KSB0byBvYnRhaW4gdGhlCisvLyBhZmZpbml0eSBtYXAuCisvLworc3RhdGljIGludAorX19rbXBfYWZmaW5pdHlfY3JlYXRlX2NwdWluZm9fbWFwKEFkZHJVbnNQYWlyICoqYWRkcmVzczJvcywgaW50ICpsaW5lLAorICBrbXBfaTE4bl9pZF90ICpjb25zdCBtc2dfaWQsIEZJTEUgKmYpCit7CisgICAgKmFkZHJlc3Myb3MgPSBOVUxMOworICAgICptc2dfaWQgPSBrbXBfaTE4bl9udWxsOworCisgICAgLy8KKyAgICAvLyBTY2FuIG9mIHRoZSBmaWxlLCBhbmQgY291bnQgdGhlIG51bWJlciBvZiAicHJvY2Vzc29yIiAob3NJZCkgZmllbGRzLAorICAgIC8vIGFuZCBmaW5kIHRoZSBoaWdoZXN0IHZhbHVlIG9mIDxuPiBmb3IgYSBub2RlXzxuPiBmaWVsZC4KKyAgICAvLworICAgIGNoYXIgYnVmWzI1Nl07CisgICAgdW5zaWduZWQgbnVtX3JlY29yZHMgPSAwOworICAgIHdoaWxlICghIGZlb2YoZikpIHsKKyAgICAgICAgYnVmW3NpemVvZihidWYpIC0gMV0gPSAxOworICAgICAgICBpZiAoISBmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmKSkgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFJlYWQgZXJyb3JzIHByZXN1bWFibHkgYmVjYXVzZSBvZiBFT0YKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNoYXIgczFbXSA9ICJwcm9jZXNzb3IiOworICAgICAgICBpZiAoc3RybmNtcChidWYsIHMxLCBzaXplb2YoczEpIC0gMSkgPT0gMCkgeworICAgICAgICAgICAgbnVtX3JlY29yZHMrKzsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRklYTUUgLSB0aGlzIHdpbGwgbWF0Y2ggIm5vZGVfPG4+IDxnYXJiYWdlPiIKKyAgICAgICAgLy8KKyAgICAgICAgdW5zaWduZWQgbGV2ZWw7CisgICAgICAgIGlmIChLTVBfU1NDQU5GKGJ1ZiwgIm5vZGVfJWQgaWQiLCAmbGV2ZWwpID09IDEpIHsKKyAgICAgICAgICAgIGlmIChub2RlSWRJbmRleCArIGxldmVsID49IG1heEluZGV4KSB7CisgICAgICAgICAgICAgICAgbWF4SW5kZXggPSBub2RlSWRJbmRleCArIGxldmVsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLworICAgIC8vIENoZWNrIGZvciBlbXB0eSBmaWxlIC8gbm8gdmFsaWQgcHJvY2Vzc29yIHJlY29yZHMsIG9yIHRvbyBtYW55LgorICAgIC8vIFRoZSBudW1iZXIgb2YgcmVjb3JkcyBjYW4ndCBleGNlZWQgdGhlIG51bWJlciBvZiB2YWxpZCBiaXRzIGluIHRoZQorICAgIC8vIGFmZmluaXR5IG1hc2suCisgICAgLy8KKyAgICBpZiAobnVtX3JlY29yZHMgPT0gMCkgeworICAgICAgICAqbGluZSA9IDA7CisgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfTm9Qcm9jUmVjb3JkczsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAobnVtX3JlY29yZHMgPiAodW5zaWduZWQpX19rbXBfeHByb2MpIHsKKyAgICAgICAgKmxpbmUgPSAwOworICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX1Rvb01hbnlQcm9jUmVjb3JkczsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8vCisgICAgLy8gU2V0IHRoZSBmaWxlIHBvaW50ZXIgYmFjayB0byB0aGUgYmVnZ2lubmluZywgc28gdGhhdCB3ZSBjYW4gc2NhbiB0aGUKKyAgICAvLyBmaWxlIGFnYWluLCB0aGlzIHRpbWUgcGVyZm9ybWluZyBhIGZ1bGwgcGFyc2Ugb2YgdGhlIGRhdGEuCisgICAgLy8gQWxsb2NhdGUgYSB2ZWN0b3Igb2YgUHJvY0NwdUluZm8gb2JqZWN0LCB3aGVyZSB3ZSB3aWxsIHBsYWNlIHRoZSBkYXRhLgorICAgIC8vIEFkZGluZyBhbiBleHRyYSBlbGVtZW50IGF0IHRoZSBlbmQgYWxsb3dzIHVzIHRvIHJlbW92ZSBhIGxvdCBvZiBleHRyYQorICAgIC8vIGNoZWNrcyBmb3IgdGVybWluYXRpb24gY29uZGl0aW9ucy4KKyAgICAvLworICAgIGlmIChmc2VlayhmLCAwLCBTRUVLX1NFVCkgIT0gMCkgeworICAgICAgICAqbGluZSA9IDA7CisgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfQ2FudFJld2luZENwdWluZm87CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIEFsbG9jYXRlIHRoZSBhcnJheSBvZiByZWNvcmRzIHRvIHN0b3JlIHRoZSBwcm9jIGluZm8gaW4uICBUaGUgZHVtbXkKKyAgICAvLyBlbGVtZW50IGF0IHRoZSBlbmQgbWFrZXMgdGhlIGxvZ2ljIGluIGZpbGxpbmcgdGhlbSBvdXQgZWFzaWVyIHRvIGNvZGUuCisgICAgLy8KKyAgICB1bnNpZ25lZCAqKnRocmVhZEluZm8gPSAodW5zaWduZWQgKiopX19rbXBfYWxsb2NhdGUoKG51bV9yZWNvcmRzICsgMSkKKyAgICAgICogc2l6ZW9mKHVuc2lnbmVkICopKTsKKyAgICB1bnNpZ25lZCBpOworICAgIGZvciAoaSA9IDA7IGkgPD0gbnVtX3JlY29yZHM7IGkrKykgeworICAgICAgICB0aHJlYWRJbmZvW2ldID0gKHVuc2lnbmVkICopX19rbXBfYWxsb2NhdGUoKG1heEluZGV4ICsgMSkKKyAgICAgICAgICAqIHNpemVvZih1bnNpZ25lZCkpOworICAgIH0KKworI2RlZmluZSBDTEVBTlVQX1RIUkVBRF9JTkZPIFwKKyAgICBmb3IgKGkgPSAwOyBpIDw9IG51bV9yZWNvcmRzOyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX19rbXBfZnJlZSh0aHJlYWRJbmZvW2ldKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9mcmVlKHRocmVhZEluZm8pOworCisgICAgLy8KKyAgICAvLyBBIHZhbHVlIG9mIFVJTlRfTUFYIG1lYW5zIHRoYXQgd2UgZGlkbid0IGZpbmQgdGhlIGZpZWxkCisgICAgLy8KKyAgICB1bnNpZ25lZCBfX2luZGV4OworCisjZGVmaW5lIElOSVRfUFJPQ19JTkZPKHApIFwKKyAgICBmb3IgKF9faW5kZXggPSAwOyBfX2luZGV4IDw9IG1heEluZGV4OyBfX2luZGV4KyspIHsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKHApW19faW5kZXhdID0gVUlOVF9NQVg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDw9IG51bV9yZWNvcmRzOyBpKyspIHsKKyAgICAgICAgSU5JVF9QUk9DX0lORk8odGhyZWFkSW5mb1tpXSk7CisgICAgfQorCisgICAgdW5zaWduZWQgbnVtX2F2YWlsID0gMDsKKyAgICAqbGluZSA9IDA7CisgICAgd2hpbGUgKCEgZmVvZihmKSkgeworICAgICAgICAvLworICAgICAgICAvLyBDcmVhdGUgYW4gaW5uZXIgc2NvcGluZyBsZXZlbCwgc28gdGhhdCBhbGwgdGhlIGdvdG8gdGFyZ2V0cyBhdCB0aGUKKyAgICAgICAgLy8gZW5kIG9mIHRoZSBsb29wIGFwcGVhciBpbiBhbiBvdXRlciBzY29waW5nIGxldmVsLiAgVGhpcyBhdm9pZHMKKyAgICAgICAgLy8gd2FybmluZ3MgYWJvdXQganVtcGluZyBwYXN0IGFuIGluaXRpYWxpemF0aW9uIHRvIGEgdGFyZ2V0IGluIHRoZQorICAgICAgICAvLyBzYW1lIGJsb2NrLgorICAgICAgICAvLworICAgICAgICB7CisgICAgICAgICAgICBidWZbc2l6ZW9mKGJ1ZikgLSAxXSA9IDE7CisgICAgICAgICAgICBib29sIGxvbmdfbGluZSA9IGZhbHNlOworICAgICAgICAgICAgaWYgKCEgZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZikpIHsKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIFJlYWQgZXJyb3JzIHByZXN1bWFibHkgYmVjYXVzZSBvZiBFT0YKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIHZhbGlkIGRhdGEgaW4gdGhyZWFkSW5mb1tudW1fYXZhaWxdLCB0aGVuIGZha2UKKyAgICAgICAgICAgICAgICAvLyBhIGJsYW5rIGxpbmUgaW4gZW5zdXJlIHRoYXQgdGhlIGxhc3QgYWRkcmVzcyBnZXRzIHBhcnNlZC4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIGJvb2wgdmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IG1heEluZGV4OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRocmVhZEluZm9bbnVtX2F2YWlsXVtpXSAhPSBVSU5UX01BWCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghIHZhbGlkKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBidWZbMF0gPSAwOworICAgICAgICAgICAgfSBlbHNlIGlmICghYnVmW3NpemVvZihidWYpIC0gMV0pIHsKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIFRoZSBsaW5lIGlzIGxvbmdlciB0aGFuIHRoZSBidWZmZXIuICBTZXQgYSBmbGFnIGFuZCBkb24ndAorICAgICAgICAgICAgICAgIC8vIGVtaXQgYW4gZXJyb3IgaWYgd2Ugd2VyZSBnb2luZyB0byBpZ25vcmUgdGhlIGxpbmUsIGFueXdheS4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIGxvbmdfbGluZSA9IHRydWU7CisKKyNkZWZpbmUgQ0hFQ0tfTElORSBcCisgICAgaWYgKGxvbmdfbGluZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIENMRUFOVVBfVEhSRUFEX0lORk87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfTG9uZ0xpbmVDcHVpbmZvOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgKCpsaW5lKSsrOworCisgICAgICAgICAgICBjaGFyIHMxW10gPSAicHJvY2Vzc29yIjsKKyAgICAgICAgICAgIGlmIChzdHJuY21wKGJ1ZiwgczEsIHNpemVvZihzMSkgLSAxKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgQ0hFQ0tfTElORTsKKyAgICAgICAgICAgICAgICBjaGFyICpwID0gc3RyY2hyKGJ1ZiArIHNpemVvZihzMSkgLSAxLCAnOicpOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIHZhbDsKKyAgICAgICAgICAgICAgICBpZiAoKHAgPT0gTlVMTCkgfHwgKEtNUF9TU0NBTkYocCArIDEsICIldVxuIiwgJnZhbCkgIT0gMSkpIGdvdG8gbm9fdmFsOworICAgICAgICAgICAgICAgIGlmICh0aHJlYWRJbmZvW251bV9hdmFpbF1bb3NJZEluZGV4XSAhPSBVSU5UX01BWCkgZ290byBkdXBfZmllbGQ7CisgICAgICAgICAgICAgICAgdGhyZWFkSW5mb1tudW1fYXZhaWxdW29zSWRJbmRleF0gPSB2YWw7CisjaWYgS01QX09TX0xJTlVYICYmIFVTRV9TWVNGU19JTkZPCisgICAgICAgICAgICAgICAgY2hhciBwYXRoWzI1Nl07CisgICAgICAgICAgICAgICAgS01QX1NOUFJJTlRGKHBhdGgsIHNpemVvZihwYXRoKSwKKyAgICAgICAgICAgICAgICAgICAgIi9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdSV1L3RvcG9sb2d5L3BoeXNpY2FsX3BhY2thZ2VfaWQiLAorICAgICAgICAgICAgICAgICAgICB0aHJlYWRJbmZvW251bV9hdmFpbF1bb3NJZEluZGV4XSk7CisgICAgICAgICAgICAgICAgX19rbXBfcmVhZF9mcm9tX2ZpbGUocGF0aCwgIiV1IiwgJnRocmVhZEluZm9bbnVtX2F2YWlsXVtwa2dJZEluZGV4XSk7CisKKyAgICAgICAgICAgICAgICBLTVBfU05QUklOVEYocGF0aCwgc2l6ZW9mKHBhdGgpLAorICAgICAgICAgICAgICAgICAgICAiL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvY3B1JXUvdG9wb2xvZ3kvY29yZV9pZCIsCisgICAgICAgICAgICAgICAgICAgIHRocmVhZEluZm9bbnVtX2F2YWlsXVtvc0lkSW5kZXhdKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9yZWFkX2Zyb21fZmlsZShwYXRoLCAiJXUiLCAmdGhyZWFkSW5mb1tudW1fYXZhaWxdW2NvcmVJZEluZGV4XSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisjZWxzZQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2hhciBzMltdID0gInBoeXNpY2FsIGlkIjsKKyAgICAgICAgICAgIGlmIChzdHJuY21wKGJ1ZiwgczIsIHNpemVvZihzMikgLSAxKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgQ0hFQ0tfTElORTsKKyAgICAgICAgICAgICAgICBjaGFyICpwID0gc3RyY2hyKGJ1ZiArIHNpemVvZihzMikgLSAxLCAnOicpOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIHZhbDsKKyAgICAgICAgICAgICAgICBpZiAoKHAgPT0gTlVMTCkgfHwgKEtNUF9TU0NBTkYocCArIDEsICIldVxuIiwgJnZhbCkgIT0gMSkpIGdvdG8gbm9fdmFsOworICAgICAgICAgICAgICAgIGlmICh0aHJlYWRJbmZvW251bV9hdmFpbF1bcGtnSWRJbmRleF0gIT0gVUlOVF9NQVgpIGdvdG8gZHVwX2ZpZWxkOworICAgICAgICAgICAgICAgIHRocmVhZEluZm9bbnVtX2F2YWlsXVtwa2dJZEluZGV4XSA9IHZhbDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoYXIgczNbXSA9ICJjb3JlIGlkIjsKKyAgICAgICAgICAgIGlmIChzdHJuY21wKGJ1ZiwgczMsIHNpemVvZihzMykgLSAxKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgQ0hFQ0tfTElORTsKKyAgICAgICAgICAgICAgICBjaGFyICpwID0gc3RyY2hyKGJ1ZiArIHNpemVvZihzMykgLSAxLCAnOicpOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIHZhbDsKKyAgICAgICAgICAgICAgICBpZiAoKHAgPT0gTlVMTCkgfHwgKEtNUF9TU0NBTkYocCArIDEsICIldVxuIiwgJnZhbCkgIT0gMSkpIGdvdG8gbm9fdmFsOworICAgICAgICAgICAgICAgIGlmICh0aHJlYWRJbmZvW251bV9hdmFpbF1bY29yZUlkSW5kZXhdICE9IFVJTlRfTUFYKSBnb3RvIGR1cF9maWVsZDsKKyAgICAgICAgICAgICAgICB0aHJlYWRJbmZvW251bV9hdmFpbF1bY29yZUlkSW5kZXhdID0gdmFsOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworI2VuZGlmIC8vIEtNUF9PU19MSU5VWCAmJiBVU0VfU1lTRlNfSU5GTworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2hhciBzNFtdID0gInRocmVhZCBpZCI7CisgICAgICAgICAgICBpZiAoc3RybmNtcChidWYsIHM0LCBzaXplb2YoczQpIC0gMSkgPT0gMCkgeworICAgICAgICAgICAgICAgIENIRUNLX0xJTkU7CisgICAgICAgICAgICAgICAgY2hhciAqcCA9IHN0cmNocihidWYgKyBzaXplb2YoczQpIC0gMSwgJzonKTsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCB2YWw7CisgICAgICAgICAgICAgICAgaWYgKChwID09IE5VTEwpIHx8IChLTVBfU1NDQU5GKHAgKyAxLCAiJXVcbiIsICZ2YWwpICE9IDEpKSBnb3RvIG5vX3ZhbDsKKyAgICAgICAgICAgICAgICBpZiAodGhyZWFkSW5mb1tudW1fYXZhaWxdW3RocmVhZElkSW5kZXhdICE9IFVJTlRfTUFYKSBnb3RvIGR1cF9maWVsZDsKKyAgICAgICAgICAgICAgICB0aHJlYWRJbmZvW251bV9hdmFpbF1bdGhyZWFkSWRJbmRleF0gPSB2YWw7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1bnNpZ25lZCBsZXZlbDsKKyAgICAgICAgICAgIGlmIChLTVBfU1NDQU5GKGJ1ZiwgIm5vZGVfJWQgaWQiLCAmbGV2ZWwpID09IDEpIHsKKyAgICAgICAgICAgICAgICBDSEVDS19MSU5FOworICAgICAgICAgICAgICAgIGNoYXIgKnAgPSBzdHJjaHIoYnVmICsgc2l6ZW9mKHM0KSAtIDEsICc6Jyk7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgdmFsOworICAgICAgICAgICAgICAgIGlmICgocCA9PSBOVUxMKSB8fCAoS01QX1NTQ0FORihwICsgMSwgIiV1XG4iLCAmdmFsKSAhPSAxKSkgZ290byBub192YWw7CisgICAgICAgICAgICAgICAgS01QX0FTU0VSVChub2RlSWRJbmRleCArIGxldmVsIDw9IG1heEluZGV4KTsKKyAgICAgICAgICAgICAgICBpZiAodGhyZWFkSW5mb1tudW1fYXZhaWxdW25vZGVJZEluZGV4ICsgbGV2ZWxdICE9IFVJTlRfTUFYKSBnb3RvIGR1cF9maWVsZDsKKyAgICAgICAgICAgICAgICB0aHJlYWRJbmZvW251bV9hdmFpbF1bbm9kZUlkSW5kZXggKyBsZXZlbF0gPSB2YWw7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBXZSBkaWRuJ3QgcmVjb2duaXplIHRoZSBsZWFkaW5nIHRva2VuIG9uIHRoZSBsaW5lLgorICAgICAgICAgICAgLy8gVGhlcmUgYXJlIGxvdHMgb2YgbGVhZGluZyB0b2tlbnMgdGhhdCB3ZSBkb24ndCByZWNvZ25pemUgLQorICAgICAgICAgICAgLy8gaWYgdGhlIGxpbmUgaXNuJ3QgZW1wdHksIGdvIG9uIHRvIHRoZSBuZXh0IGxpbmUuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgaWYgKCgqYnVmICE9IDApICYmICgqYnVmICE9ICdcbicpKSB7CisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbGluZSBpcyBsb25nZXIgdGhhbiB0aGUgYnVmZmVyLCByZWFkIGNoYXJhY3RlcnMKKyAgICAgICAgICAgICAgICAvLyB1bnRpbCB3ZSBmaW5kIGEgbmV3bGluZS4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIGlmIChsb25nX2xpbmUpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNoOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKChjaCA9IGZnZXRjKGYpKSAhPSBFT0YpICYmIChjaCAhPSAnXG4nKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gQSBuZXdsaW5lIGhhcyBzaWduYWxsZWQgdGhlIGVuZCBvZiB0aGUgcHJvY2Vzc29yIHJlY29yZC4KKyAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgdGhlcmUgYXJlbid0IHRvbyBtYW55IHByb2NzIHNwZWNpZmllZC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBpZiAoKGludCludW1fYXZhaWwgPT0gX19rbXBfeHByb2MpIHsKKyAgICAgICAgICAgICAgICBDTEVBTlVQX1RIUkVBRF9JTkZPOworICAgICAgICAgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfVG9vTWFueUVudHJpZXM7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIG1pc3NpbmcgZmllbGRzLiAgVGhlIG9zSWQgZmllbGQgbXVzdCBiZSB0aGVyZSwgYW5kIHdlCisgICAgICAgICAgICAvLyBjdXJyZW50bHkgcmVxdWlyZSB0aGF0IHRoZSBwaHlzaWNhbCBpZCBmaWVsZCBpcyBzcGVjaWZpZWQsIGFsc28uCisgICAgICAgICAgICAvLworICAgICAgICAgICAgaWYgKHRocmVhZEluZm9bbnVtX2F2YWlsXVtvc0lkSW5kZXhdID09IFVJTlRfTUFYKSB7CisgICAgICAgICAgICAgICAgQ0xFQU5VUF9USFJFQURfSU5GTzsKKyAgICAgICAgICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX01pc3NpbmdQcm9jRmllbGQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRocmVhZEluZm9bMF1bcGtnSWRJbmRleF0gPT0gVUlOVF9NQVgpIHsKKyAgICAgICAgICAgICAgICBDTEVBTlVQX1RIUkVBRF9JTkZPOworICAgICAgICAgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfTWlzc2luZ1BoeXNpY2FsSURGaWVsZDsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBTa2lwIHRoaXMgcHJvYyBpZiBpdCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIG1hY2hpbmUgbW9kZWwuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgaWYgKCEgS01QX0NQVV9JU1NFVCh0aHJlYWRJbmZvW251bV9hdmFpbF1bb3NJZEluZGV4XSwgZnVsbE1hc2spKSB7CisgICAgICAgICAgICAgICAgSU5JVF9QUk9DX0lORk8odGhyZWFkSW5mb1tudW1fYXZhaWxdKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFdlIGhhdmUgYSBzdWNjZXNzZnVsIHBhcnNlIG9mIHRoaXMgcHJvYydzIGluZm8uCisgICAgICAgICAgICAvLyBJbmNyZW1lbnQgdGhlIGNvdW50ZXIsIGFuZCBwcmVwYXJlIGZvciB0aGUgbmV4dCBwcm9jLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIG51bV9hdmFpbCsrOworICAgICAgICAgICAgS01QX0FTU0VSVChudW1fYXZhaWwgPD0gbnVtX3JlY29yZHMpOworICAgICAgICAgICAgSU5JVF9QUk9DX0lORk8odGhyZWFkSW5mb1tudW1fYXZhaWxdKTsKKyAgICAgICAgfQorICAgICAgICBjb250aW51ZTsKKworICAgICAgICBub192YWw6CisgICAgICAgIENMRUFOVVBfVEhSRUFEX0lORk87CisgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfTWlzc2luZ1ZhbENwdWluZm87CisgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICBkdXBfZmllbGQ6CisgICAgICAgIENMRUFOVVBfVEhSRUFEX0lORk87CisgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfRHVwbGljYXRlRmllbGRDcHVpbmZvOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgICpsaW5lID0gMDsKKworIyBpZiBLTVBfTUlDICYmIFJFRFVDRV9URUFNX1NJWkUKKyAgICB1bnNpZ25lZCB0ZWFtU2l6ZSA9IDA7CisjIGVuZGlmIC8vIEtNUF9NSUMgJiYgUkVEVUNFX1RFQU1fU0laRQorCisgICAgLy8gY2hlY2sgZm9yIG51bV9yZWNvcmRzID09IF9fa21wX3hwcm9jID8/PworCisgICAgLy8KKyAgICAvLyBJZiB0aGVyZSdzIG9ubHkgb25lIHRocmVhZCBjb250ZXh0IHRvIGJpbmQgdG8sIGZvcm0gYW4gQWRkcmVzcyBvYmplY3QKKyAgICAvLyB3aXRoIGRlcHRoIDEgYW5kIHJldHVybiBpbW1lZGlhdGVseSAob3IsIGlmIGFmZmluaXR5IGlzIG9mZiwgc2V0CisgICAgLy8gYWRkcmVzczJvcyB0byBOVUxMIGFuZCByZXR1cm4pLgorICAgIC8vCisgICAgLy8gSWYgaXQgaXMgY29uZmlndXJlZCB0byBvbWl0IHRoZSBwYWNrYWdlIGxldmVsIHdoZW4gdGhlcmUgaXMgb25seSBhCisgICAgLy8gc2luZ2xlIHBhY2thZ2UsIHRoZSBsb2dpYyBhdCB0aGUgZW5kIG9mIHRoaXMgcm91dGluZSB3b24ndCB3b3JrIGlmCisgICAgLy8gdGhlcmUgaXMgb25seSBhIHNpbmdsZSB0aHJlYWQgLSBpdCB3b3VsZCB0cnkgdG8gZm9ybSBhbiBBZGRyZXNzCisgICAgLy8gb2JqZWN0IHdpdGggZGVwdGggMC4KKyAgICAvLworICAgIEtNUF9BU1NFUlQobnVtX2F2YWlsID4gMCk7CisgICAgS01QX0FTU0VSVChudW1fYXZhaWwgPD0gbnVtX3JlY29yZHMpOworICAgIGlmIChudW1fYXZhaWwgPT0gMSkgeworICAgICAgICBfX2ttcF9uY29yZXMgPSAxOworICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSBuQ29yZXNQZXJQa2cgPSBuUGFja2FnZXMgPSAxOworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgaWYgKCEgS01QX0FGRklOSVRZX0NBUEFCTEUoKSkgeworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmTm90Q2FwYWJsZVVzZUNwdWluZm8sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEF2YWlsYWJsZU9TUHJvYywgIktNUF9BRkZJTklUWSIsIF9fa21wX2F2YWlsX3Byb2MpOworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKGJ1ZiwgS01QX0FGRklOX01BU0tfUFJJTlRfTEVOLAorICAgICAgICAgICAgICAgICAgZnVsbE1hc2spOworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmQ2FwYWJsZVVzZUNwdWluZm8sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBidWYpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldE5vdFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBidWYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEF2YWlsYWJsZU9TUHJvYywgIktNUF9BRkZJTklUWSIsIF9fa21wX2F2YWlsX3Byb2MpOworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IGluZGV4OworICAgICAgICAgICAga21wX3N0cl9idWZfdCBidWY7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX2luaXQoJmJ1Zik7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICIxIik7CisgICAgICAgICAgICBmb3IgKGluZGV4ID0gbWF4SW5kZXggLSAxOyBpbmRleCA+IHBrZ0lkSW5kZXg7IGluZGV4LS0pIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICIgeCAxIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBLTVBfSU5GT1JNKFRvcG9sb2d5RXh0cmEsICJLTVBfQUZGSU5JVFkiLCBidWYuc3RyLCAxLCAxLCAxKTsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSgmYnVmKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpIHsKKyAgICAgICAgICAgIENMRUFOVVBfVEhSRUFEX0lORk87CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgICphZGRyZXNzMm9zID0gKEFkZHJVbnNQYWlyKilfX2ttcF9hbGxvY2F0ZShzaXplb2YoQWRkclVuc1BhaXIpKTsKKyAgICAgICAgQWRkcmVzcyBhZGRyKDEpOworICAgICAgICBhZGRyLmxhYmVsc1swXSA9IHRocmVhZEluZm9bMF1bcGtnSWRJbmRleF07CisgICAgICAgICgqYWRkcmVzczJvcylbMF0gPSBBZGRyVW5zUGFpcihhZGRyLCB0aHJlYWRJbmZvWzBdW29zSWRJbmRleF0pOworCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA8IDApIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF90b3BvbG9neSgqYWRkcmVzczJvcywgMSwgMSwgMCwgLTEsIC0xKTsKKyAgICAgICAgfQorCisgICAgICAgIENMRUFOVVBfVEhSRUFEX0lORk87CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIC8vCisgICAgLy8gU29ydCB0aGUgdGhyZWFkSW5mbyB0YWJsZSBieSBwaHlzaWNhbCBJZC4KKyAgICAvLworICAgIHFzb3J0KHRocmVhZEluZm8sIG51bV9hdmFpbCwgc2l6ZW9mKCp0aHJlYWRJbmZvKSwKKyAgICAgIF9fa21wX2FmZmluaXR5X2NtcF9Qcm9jQ3B1SW5mb19waHlzX2lkKTsKKworICAgIC8vCisgICAgLy8gVGhlIHRhYmxlIGlzIG5vdyBzb3J0ZWQgYnkgcGtnSWQgLyBjb3JlSWQgLyB0aHJlYWRJZCwgYnV0IHdlIHJlYWxseQorICAgIC8vIGRvbid0IGtub3cgdGhlIHJhZGl4IG9mIGFueSBvZiB0aGUgZmllbGRzLiAgcGtnSWQncyBtYXkgYmUgc3BhcnNlbHkKKyAgICAvLyBhc3NpZ25lZCBhbW9uZyB0aGUgY2hpcHMgb24gYSBzeXN0ZW0uICBBbHRob3VnaCBjb3JlSWQncyBhcmUgdXN1YWxseQorICAgIC8vIGFzc2lnbmVkIFswIC4uIGNvcmVzUGVyUGtnLTFdIGFuZCB0aHJlYWRJZCdzIGFyZSB1c3VhbGx5IGFzc2lnbmVkCisgICAgLy8gWzAuLnRocmVhZHNQZXJDb3JlLTFdLCB3ZSBkb24ndCB3YW50IHRvIG1ha2UgYW55IHN1Y2ggYXNzdW1wdGlvbnMuCisgICAgLy8KKyAgICAvLyBGb3IgdGhhdCBtYXR0ZXIsIHdlIGRvbid0IGtub3cgd2hhdCBjb3Jlc1BlclBrZyBhbmQgdGhyZWFkc1BlckNvcmUKKyAgICAvLyAob3IgdGhlIHRvdGFsICMgcGFja2FnZXMpIGFyZSBhdCB0aGlzIHBvaW50IC0gd2Ugd2FudCB0byBkZXRlcm1pbmUKKyAgICAvLyB0aGF0IG5vdy4gIFdlIG9ubHkgaGF2ZSBhbiB1cHBlciBib3VuZCBvbiB0aGUgZmlyc3QgdHdvIGZpZ3VyZXMuCisgICAgLy8KKyAgICB1bnNpZ25lZCAqY291bnRzID0gKHVuc2lnbmVkICopX19rbXBfYWxsb2NhdGUoKG1heEluZGV4ICsgMSkKKyAgICAgICogc2l6ZW9mKHVuc2lnbmVkKSk7CisgICAgdW5zaWduZWQgKm1heEN0ID0gKHVuc2lnbmVkICopX19rbXBfYWxsb2NhdGUoKG1heEluZGV4ICsgMSkKKyAgICAgICogc2l6ZW9mKHVuc2lnbmVkKSk7CisgICAgdW5zaWduZWQgKnRvdGFscyA9ICh1bnNpZ25lZCAqKV9fa21wX2FsbG9jYXRlKChtYXhJbmRleCArIDEpCisgICAgICAqIHNpemVvZih1bnNpZ25lZCkpOworICAgIHVuc2lnbmVkICpsYXN0SWQgPSAodW5zaWduZWQgKilfX2ttcF9hbGxvY2F0ZSgobWF4SW5kZXggKyAxKQorICAgICAgKiBzaXplb2YodW5zaWduZWQpKTsKKworICAgIGJvb2wgYXNzaWduX3RocmVhZF9pZHMgPSBmYWxzZTsKKyAgICB1bnNpZ25lZCB0aHJlYWRJZEN0OworICAgIHVuc2lnbmVkIGluZGV4OworCisgICAgcmVzdGFydF9yYWRpeF9jaGVjazoKKyAgICB0aHJlYWRJZEN0ID0gMDsKKworICAgIC8vCisgICAgLy8gSW5pdGlhbGl6ZSB0aGUgY291bnRlciBhcnJheXMgd2l0aCBkYXRhIGZyb20gdGhyZWFkSW5mb1swXS4KKyAgICAvLworICAgIGlmIChhc3NpZ25fdGhyZWFkX2lkcykgeworICAgICAgICBpZiAodGhyZWFkSW5mb1swXVt0aHJlYWRJZEluZGV4XSA9PSBVSU5UX01BWCkgeworICAgICAgICAgICAgdGhyZWFkSW5mb1swXVt0aHJlYWRJZEluZGV4XSA9IHRocmVhZElkQ3QrKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0aHJlYWRJZEN0IDw9IHRocmVhZEluZm9bMF1bdGhyZWFkSWRJbmRleF0pIHsKKyAgICAgICAgICAgIHRocmVhZElkQ3QgPSB0aHJlYWRJbmZvWzBdW3RocmVhZElkSW5kZXhdICsgMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPD0gbWF4SW5kZXg7IGluZGV4KyspIHsKKyAgICAgICAgY291bnRzW2luZGV4XSA9IDE7CisgICAgICAgIG1heEN0W2luZGV4XSA9IDE7CisgICAgICAgIHRvdGFsc1tpbmRleF0gPSAxOworICAgICAgICBsYXN0SWRbaW5kZXhdID0gdGhyZWFkSW5mb1swXVtpbmRleF07OworICAgIH0KKworICAgIC8vCisgICAgLy8gUnVuIHRocm91Z2ggdGhlIHJlc3Qgb2YgdGhlIE9TIHByb2NzLgorICAgIC8vCisgICAgZm9yIChpID0gMTsgaSA8IG51bV9hdmFpbDsgaSsrKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIEZpbmQgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgaW5kZXggd2hvc2UgaWQgZGlmZmVycworICAgICAgICAvLyBmcm9tIHRoZSBpZCBmb3IgdGhlIHByZXZpb3VzIE9TIHByb2MuCisgICAgICAgIC8vCisgICAgICAgIGZvciAoaW5kZXggPSBtYXhJbmRleDsgaW5kZXggPj0gdGhyZWFkSWRJbmRleDsgaW5kZXgtLSkgeworICAgICAgICAgICAgaWYgKGFzc2lnbl90aHJlYWRfaWRzICYmIChpbmRleCA9PSB0aHJlYWRJZEluZGV4KSkgeworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gQXV0by1hc3NpZ24gdGhlIHRocmVhZCBpZCBmaWVsZCBpZiBpdCB3YXNuJ3Qgc3BlY2lmaWVkLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgaWYgKHRocmVhZEluZm9baV1bdGhyZWFkSWRJbmRleF0gPT0gVUlOVF9NQVgpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkSW5mb1tpXVt0aHJlYWRJZEluZGV4XSA9IHRocmVhZElkQ3QrKzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIEFwYXJyZW50bHkgdGhlIHRocmVhZCBpZCBmaWVsZCB3YXMgc3BlY2lmaWVkIGZvciBzb21lCisgICAgICAgICAgICAgICAgLy8gZW50cmllcyBhbmQgbm90IG90aGVycy4gIFN0YXJ0IHRoZSB0aHJlYWQgaWQgY291bnRlcgorICAgICAgICAgICAgICAgIC8vIG9mZiBhdCB0aGUgbmV4dCBoaWdoZXIgdGhyZWFkIGlkLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhyZWFkSWRDdCA8PSB0aHJlYWRJbmZvW2ldW3RocmVhZElkSW5kZXhdKSB7CisgICAgICAgICAgICAgICAgICAgIHRocmVhZElkQ3QgPSB0aHJlYWRJbmZvW2ldW3RocmVhZElkSW5kZXhdICsgMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodGhyZWFkSW5mb1tpXVtpbmRleF0gIT0gbGFzdElkW2luZGV4XSkgeworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gUnVuIHRocm91Z2ggYWxsIGluZGljZXMgd2hpY2ggYXJlIGxlc3Mgc2lnbmlmaWNhbnQsCisgICAgICAgICAgICAgICAgLy8gYW5kIHJlc2V0IHRoZSBjb3VudHMgdG8gMS4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIEF0IGFsbCBsZXZlbHMgdXAgdG8gYW5kIGluY2x1ZGluZyBpbmRleCwgd2UgbmVlZCB0bworICAgICAgICAgICAgICAgIC8vIGluY3JlbWVudCB0aGUgdG90YWxzIGFuZCByZWNvcmQgdGhlIGxhc3QgaWQuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbmRleDI7CisgICAgICAgICAgICAgICAgZm9yIChpbmRleDIgPSB0aHJlYWRJZEluZGV4OyBpbmRleDIgPCBpbmRleDsgaW5kZXgyKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdG90YWxzW2luZGV4Ml0rKzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50c1tpbmRleDJdID4gbWF4Q3RbaW5kZXgyXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWF4Q3RbaW5kZXgyXSA9IGNvdW50c1tpbmRleDJdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvdW50c1tpbmRleDJdID0gMTsKKyAgICAgICAgICAgICAgICAgICAgbGFzdElkW2luZGV4Ml0gPSB0aHJlYWRJbmZvW2ldW2luZGV4Ml07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvdW50c1tpbmRleF0rKzsKKyAgICAgICAgICAgICAgICB0b3RhbHNbaW5kZXhdKys7CisgICAgICAgICAgICAgICAgbGFzdElkW2luZGV4XSA9IHRocmVhZEluZm9baV1baW5kZXhdOworCisgICAgICAgICAgICAgICAgaWYgKGFzc2lnbl90aHJlYWRfaWRzICYmIChpbmRleCA+IHRocmVhZElkSW5kZXgpKSB7CisKKyMgaWYgS01QX01JQyAmJiBSRURVQ0VfVEVBTV9TSVpFCisgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBkZWZhdWx0IHRlYW0gc2l6ZSBpcyB0aGUgdG90YWwgI3RocmVhZHMgaW4gdGhlIG1hY2hpbmUKKyAgICAgICAgICAgICAgICAgICAgLy8gbWludXMgMSB0aHJlYWQgZm9yIGV2ZXJ5IGNvcmUgdGhhdCBoYXMgMyBvciBtb3JlIHRocmVhZHMuCisgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgIHRlYW1TaXplICs9ICggdGhyZWFkSWRDdCA8PSAyICkgPyAoIHRocmVhZElkQ3QgKSA6ICggdGhyZWFkSWRDdCAtIDEgKTsKKyMgZW5kaWYgLy8gS01QX01JQyAmJiBSRURVQ0VfVEVBTV9TSVpFCisKKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgLy8gUmVzdGFydCB0aGUgdGhyZWFkIGNvdW50ZXIsIGFzIHdlIGFyZSBvbiBhIG5ldyBjb3JlLgorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICB0aHJlYWRJZEN0ID0gMDsKKworICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAvLyBBdXRvLWFzc2lnbiB0aGUgdGhyZWFkIGlkIGZpZWxkIGlmIGl0IHdhc24ndCBzcGVjaWZpZWQuCisgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgIGlmICh0aHJlYWRJbmZvW2ldW3RocmVhZElkSW5kZXhdID09IFVJTlRfTUFYKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRJbmZvW2ldW3RocmVhZElkSW5kZXhdID0gdGhyZWFkSWRDdCsrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgLy8gQXBhcnJlbnRseSB0aGUgdGhyZWFkIGlkIGZpZWxkIHdhcyBzcGVjaWZpZWQgZm9yIHNvbWUKKyAgICAgICAgICAgICAgICAgICAgLy8gZW50cmllcyBhbmQgbm90IG90aGVycy4gIFN0YXJ0IHRoZSB0aHJlYWQgaWQgY291bnRlcgorICAgICAgICAgICAgICAgICAgICAvLyBvZmYgYXQgdGhlIG5leHQgaGlnaGVyIHRocmVhZCBpZC4KKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhyZWFkSWRDdCA8PSB0aHJlYWRJbmZvW2ldW3RocmVhZElkSW5kZXhdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRJZEN0ID0gdGhyZWFkSW5mb1tpXVt0aHJlYWRJZEluZGV4XSArIDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGluZGV4IDwgdGhyZWFkSWRJbmRleCkgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIElmIHRocmVhZCBpZHMgd2VyZSBzcGVjaWZpZWQsIGl0IGlzIGFuIGVycm9yIGlmIHRoZXkgYXJlIG5vdAorICAgICAgICAgICAgLy8gdW5pcXVlLiAgQWxzbywgY2hlY2sgdGhhdCB3ZSB3YXZlbid0IGFscmVhZHkgcmVzdGFydGVkIHRoZQorICAgICAgICAgICAgLy8gbG9vcCAodG8gYmUgc2FmZSAtIHNob3VsZG4ndCBuZWVkIHRvKS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBpZiAoKHRocmVhZEluZm9baV1bdGhyZWFkSWRJbmRleF0gIT0gVUlOVF9NQVgpCisgICAgICAgICAgICAgIHx8IGFzc2lnbl90aHJlYWRfaWRzKSB7CisgICAgICAgICAgICAgICAgX19rbXBfZnJlZShsYXN0SWQpOworICAgICAgICAgICAgICAgIF9fa21wX2ZyZWUodG90YWxzKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9mcmVlKG1heEN0KTsKKyAgICAgICAgICAgICAgICBfX2ttcF9mcmVlKGNvdW50cyk7CisgICAgICAgICAgICAgICAgQ0xFQU5VUF9USFJFQURfSU5GTzsKKyAgICAgICAgICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX1BoeXNpY2FsSURzTm90VW5pcXVlOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIElmIHRoZSB0aHJlYWQgaWRzIHdlcmUgbm90IHNwZWNpZmllZCBhbmQgd2Ugc2VlIGVudHJpZXMKKyAgICAgICAgICAgIC8vIGVudHJpZXMgdGhhdCBhcmUgZHVwbGljYXRlcywgc3RhcnQgdGhlIGxvb3Agb3ZlciBhbmQKKyAgICAgICAgICAgIC8vIGFzc2lnbiB0aGUgdGhyZWFkIGlkcyBtYW51YWxseS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBhc3NpZ25fdGhyZWFkX2lkcyA9IHRydWU7CisgICAgICAgICAgICBnb3RvIHJlc3RhcnRfcmFkaXhfY2hlY2s7CisgICAgICAgIH0KKyAgICB9CisKKyMgaWYgS01QX01JQyAmJiBSRURVQ0VfVEVBTV9TSVpFCisgICAgLy8KKyAgICAvLyBUaGUgZGVmYXVsdCB0ZWFtIHNpemUgaXMgdGhlIHRvdGFsICN0aHJlYWRzIGluIHRoZSBtYWNoaW5lCisgICAgLy8gbWludXMgMSB0aHJlYWQgZm9yIGV2ZXJ5IGNvcmUgdGhhdCBoYXMgMyBvciBtb3JlIHRocmVhZHMuCisgICAgLy8KKyAgICB0ZWFtU2l6ZSArPSAoIHRocmVhZElkQ3QgPD0gMiApID8gKCB0aHJlYWRJZEN0ICkgOiAoIHRocmVhZElkQ3QgLSAxICk7CisjIGVuZGlmIC8vIEtNUF9NSUMgJiYgUkVEVUNFX1RFQU1fU0laRQorCisgICAgZm9yIChpbmRleCA9IHRocmVhZElkSW5kZXg7IGluZGV4IDw9IG1heEluZGV4OyBpbmRleCsrKSB7CisgICAgICAgIGlmIChjb3VudHNbaW5kZXhdID4gbWF4Q3RbaW5kZXhdKSB7CisgICAgICAgICAgICBtYXhDdFtpbmRleF0gPSBjb3VudHNbaW5kZXhdOworICAgICAgICB9CisgICAgfQorCisgICAgX19rbXBfblRocmVhZHNQZXJDb3JlID0gbWF4Q3RbdGhyZWFkSWRJbmRleF07CisgICAgbkNvcmVzUGVyUGtnID0gbWF4Q3RbY29yZUlkSW5kZXhdOworICAgIG5QYWNrYWdlcyA9IHRvdGFsc1twa2dJZEluZGV4XTsKKworICAgIC8vCisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBtYWNoaW5lIHRvcG9sb2d5IGlzIHVuaWZvcm0KKyAgICAvLworICAgIHVuc2lnbmVkIHByb2QgPSB0b3RhbHNbbWF4SW5kZXhdOworICAgIGZvciAoaW5kZXggPSB0aHJlYWRJZEluZGV4OyBpbmRleCA8IG1heEluZGV4OyBpbmRleCsrKSB7CisgICAgICAgcHJvZCAqPSBtYXhDdFtpbmRleF07CisgICAgfQorICAgIGJvb2wgdW5pZm9ybSA9IChwcm9kID09IHRvdGFsc1t0aHJlYWRJZEluZGV4XSk7CisKKyAgICAvLworICAgIC8vIFdoZW4gYWZmaW5pdHkgaXMgb2ZmLCB0aGlzIHJvdXRpbmUgd2lsbCBzdGlsbCBiZSBjYWxsZWQgdG8gc2V0CisgICAgLy8gX19rbXBfbmNvcmVzLCBhcyB3ZWxsIGFzIF9fa21wX25UaHJlYWRzUGVyQ29yZSwKKyAgICAvLyBuQ29yZXNQZXJQa2csICYgblBhY2thZ2VzLiAgTWFrZSBzdXJlIGFsbCB0aGVzZSB2YXJzIGFyZSBzZXQKKyAgICAvLyBjb3JyZWN0bHksIGFuZCByZXR1cm4gbm93IGlmIGFmZmluaXR5IGlzIG5vdCBlbmFibGVkLgorICAgIC8vCisgICAgX19rbXBfbmNvcmVzID0gdG90YWxzW2NvcmVJZEluZGV4XTsKKworICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgIGlmICghIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkpIHsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZk5vdENhcGFibGVVc2VDcHVpbmZvLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICAgICAgS01QX0lORk9STShBdmFpbGFibGVPU1Byb2MsICJLTVBfQUZGSU5JVFkiLCBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICAgICAgICAgICAgICBpZiAodW5pZm9ybSkgeworICAgICAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKFVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKE5vblVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwgZnVsbE1hc2spOworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmQ2FwYWJsZVVzZUNwdWluZm8sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBidWYpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldE5vdFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBidWYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEF2YWlsYWJsZU9TUHJvYywgIktNUF9BRkZJTklUWSIsIF9fa21wX2F2YWlsX3Byb2MpOworICAgICAgICAgICAgICAgIGlmICh1bmlmb3JtKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oTm9uVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBrbXBfc3RyX2J1Zl90IGJ1ZjsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9pbml0KCZidWYpOworCisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoJmJ1ZiwgIiVkIiwgdG90YWxzW21heEluZGV4XSk7CisgICAgICAgIGZvciAoaW5kZXggPSBtYXhJbmRleCAtIDE7IGluZGV4ID49IHBrZ0lkSW5kZXg7IGluZGV4LS0pIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoJmJ1ZiwgIiB4ICVkIiwgbWF4Q3RbaW5kZXhdKTsKKyAgICAgICAgfQorICAgICAgICBLTVBfSU5GT1JNKFRvcG9sb2d5RXh0cmEsICJLTVBfQUZGSU5JVFkiLCBidWYuc3RyLCAgbWF4Q3RbY29yZUlkSW5kZXhdLAorICAgICAgICAgIG1heEN0W3RocmVhZElkSW5kZXhdLCBfX2ttcF9uY29yZXMpOworCisgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSgmYnVmKTsKKyAgICB9CisKKyMgaWYgS01QX01JQyAmJiBSRURVQ0VfVEVBTV9TSVpFCisgICAgLy8KKyAgICAvLyBTZXQgdGhlIGRlZmF1bHQgdGVhbSBzaXplLgorICAgIC8vCisgICAgaWYgKChfX2ttcF9kZmx0X3RlYW1fbnRoID09IDApICYmICh0ZWFtU2l6ZSA+IDApKSB7CisgICAgICAgIF9fa21wX2RmbHRfdGVhbV9udGggPSB0ZWFtU2l6ZTsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfYWZmaW5pdHlfY3JlYXRlX2NwdWluZm9fbWFwOiBzZXR0aW5nIF9fa21wX2RmbHRfdGVhbV9udGggPSAlZFxuIiwKKyAgICAgICAgICBfX2ttcF9kZmx0X3RlYW1fbnRoKSk7CisgICAgfQorIyBlbmRpZiAvLyBLTVBfTUlDICYmIFJFRFVDRV9URUFNX1NJWkUKKworICAgIGlmIChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpIHsKKyAgICAgICAgX19rbXBfZnJlZShsYXN0SWQpOworICAgICAgICBfX2ttcF9mcmVlKHRvdGFscyk7CisgICAgICAgIF9fa21wX2ZyZWUobWF4Q3QpOworICAgICAgICBfX2ttcF9mcmVlKGNvdW50cyk7CisgICAgICAgIENMRUFOVVBfVEhSRUFEX0lORk87CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vCisgICAgLy8gQ291bnQgdGhlIG51bWJlciBvZiBsZXZlbHMgd2hpY2ggaGF2ZSBtb3JlIG5vZGVzIGF0IHRoYXQgbGV2ZWwgdGhhbgorICAgIC8vIGF0IHRoZSBwYXJlbnQncyBsZXZlbCAod2l0aCB0aGVyZSBiZWluZyBhbiBpbXBsaWNpdCByb290IG5vZGUgb2YKKyAgICAvLyB0aGUgdG9wIGxldmVsKS4gIFRoaXMgaXMgZXF1aXZhbGVudCB0byBzYXlpbmcgdGhhdCB0aGVyZSBpcyBhdCBsZWFzdAorICAgIC8vIG9uZSBub2RlIGF0IHRoaXMgbGV2ZWwgd2hpY2ggaGFzIGEgc2libGluZy4gIFRoZXNlIGxldmVscyBhcmUgaW4gdGhlCisgICAgLy8gbWFwLCBhbmQgdGhlIHBhY2thZ2UgbGV2ZWwgaXMgYWx3YXlzIGluIHRoZSBtYXAuCisgICAgLy8KKyAgICBib29sICppbk1hcCA9IChib29sICopX19rbXBfYWxsb2NhdGUoKG1heEluZGV4ICsgMSkgKiBzaXplb2YoYm9vbCkpOworICAgIGludCBsZXZlbCA9IDA7CisgICAgZm9yIChpbmRleCA9IHRocmVhZElkSW5kZXg7IGluZGV4IDwgbWF4SW5kZXg7IGluZGV4KyspIHsKKyAgICAgICAgS01QX0FTU0VSVCh0b3RhbHNbaW5kZXhdID49IHRvdGFsc1tpbmRleCArIDFdKTsKKyAgICAgICAgaW5NYXBbaW5kZXhdID0gKHRvdGFsc1tpbmRleF0gPiB0b3RhbHNbaW5kZXggKyAxXSk7CisgICAgfQorICAgIGluTWFwW21heEluZGV4XSA9ICh0b3RhbHNbbWF4SW5kZXhdID4gMSk7CisgICAgaW5NYXBbcGtnSWRJbmRleF0gPSB0cnVlOworCisgICAgaW50IGRlcHRoID0gMDsKKyAgICBmb3IgKGluZGV4ID0gdGhyZWFkSWRJbmRleDsgaW5kZXggPD0gbWF4SW5kZXg7IGluZGV4KyspIHsKKyAgICAgICAgaWYgKGluTWFwW2luZGV4XSkgeworICAgICAgICAgICAgZGVwdGgrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBLTVBfQVNTRVJUKGRlcHRoID4gMCk7CisKKyAgICAvLworICAgIC8vIENvbnN0cnVjdCB0aGUgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBpcyB0byBiZSByZXR1cm5lZC4KKyAgICAvLworICAgICphZGRyZXNzMm9zID0gKEFkZHJVbnNQYWlyKikKKyAgICAgIF9fa21wX2FsbG9jYXRlKHNpemVvZihBZGRyVW5zUGFpcikgKiBudW1fYXZhaWwpOworICAgIGludCBwa2dMZXZlbCA9IC0xOworICAgIGludCBjb3JlTGV2ZWwgPSAtMTsKKyAgICBpbnQgdGhyZWFkTGV2ZWwgPSAtMTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fYXZhaWw7ICsraSkgeworICAgICAgICBBZGRyZXNzIGFkZHIoZGVwdGgpOworICAgICAgICB1bnNpZ25lZCBvcyA9IHRocmVhZEluZm9baV1bb3NJZEluZGV4XTsKKyAgICAgICAgaW50IHNyY19pbmRleDsKKyAgICAgICAgaW50IGRzdF9pbmRleCA9IDA7CisKKyAgICAgICAgZm9yIChzcmNfaW5kZXggPSBtYXhJbmRleDsgc3JjX2luZGV4ID49IHRocmVhZElkSW5kZXg7IHNyY19pbmRleC0tKSB7CisgICAgICAgICAgICBpZiAoISBpbk1hcFtzcmNfaW5kZXhdKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhZGRyLmxhYmVsc1tkc3RfaW5kZXhdID0gdGhyZWFkSW5mb1tpXVtzcmNfaW5kZXhdOworICAgICAgICAgICAgaWYgKHNyY19pbmRleCA9PSBwa2dJZEluZGV4KSB7CisgICAgICAgICAgICAgICAgcGtnTGV2ZWwgPSBkc3RfaW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChzcmNfaW5kZXggPT0gY29yZUlkSW5kZXgpIHsKKyAgICAgICAgICAgICAgICBjb3JlTGV2ZWwgPSBkc3RfaW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChzcmNfaW5kZXggPT0gdGhyZWFkSWRJbmRleCkgeworICAgICAgICAgICAgICAgIHRocmVhZExldmVsID0gZHN0X2luZGV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZHN0X2luZGV4Kys7CisgICAgICAgIH0KKyAgICAgICAgKCphZGRyZXNzMm9zKVtpXSA9IEFkZHJVbnNQYWlyKGFkZHIsIG9zKTsKKyAgICB9CisKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPCAwKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIFNldCB0aGUgZ3JhbnVsYXJpdHkgbGV2ZWwgYmFzZWQgb24gd2hhdCBsZXZlbHMgYXJlIG1vZGVsZWQKKyAgICAgICAgLy8gaW4gdGhlIG1hY2hpbmUgdG9wb2xvZ3kgbWFwLgorICAgICAgICAvLworICAgICAgICB1bnNpZ25lZCBzcmNfaW5kZXg7CisgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzID0gMDsKKyAgICAgICAgZm9yIChzcmNfaW5kZXggPSB0aHJlYWRJZEluZGV4OyBzcmNfaW5kZXggPD0gbWF4SW5kZXg7IHNyY19pbmRleCsrKSB7CisgICAgICAgICAgICBpZiAoISBpbk1hcFtzcmNfaW5kZXhdKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKHNyY19pbmRleCkgeworICAgICAgICAgICAgICAgIGNhc2UgdGhyZWFkSWRJbmRleDoKKyAgICAgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3JhbiA+IGFmZmluaXR5X2dyYW5fdGhyZWFkKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzKys7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBjb3JlSWRJbmRleDoKKyAgICAgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3JhbiA+IGFmZmluaXR5X2dyYW5fY29yZSkgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgcGtnSWRJbmRleDoKKyAgICAgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3JhbiA+IGFmZmluaXR5X2dyYW5fcGFja2FnZSkgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X3RvcG9sb2d5KCphZGRyZXNzMm9zLCBudW1fYXZhaWwsIGRlcHRoLCBwa2dMZXZlbCwKKyAgICAgICAgICBjb3JlTGV2ZWwsIHRocmVhZExldmVsKTsKKyAgICB9CisKKyAgICBfX2ttcF9mcmVlKGluTWFwKTsKKyAgICBfX2ttcF9mcmVlKGxhc3RJZCk7CisgICAgX19rbXBfZnJlZSh0b3RhbHMpOworICAgIF9fa21wX2ZyZWUobWF4Q3QpOworICAgIF9fa21wX2ZyZWUoY291bnRzKTsKKyAgICBDTEVBTlVQX1RIUkVBRF9JTkZPOworICAgIHJldHVybiBkZXB0aDsKK30KKworCisvLworLy8gQ3JlYXRlIGFuZCByZXR1cm4gYSB0YWJsZSBvZiBhZmZpbml0eSBtYXNrcywgaW5kZXhlZCBieSBPUyB0aHJlYWQgSUQuCisvLyBUaGlzIHJvdXRpbmUgaGFuZGxlcyBPUidpbmcgdG9nZXRoZXIgYWxsIHRoZSBhZmZpbml0eSBtYXNrcyBvZiB0aHJlYWRzCisvLyB0aGF0IGFyZSBzdWZmaWNpZW50bHkgY2xvc2UsIGlmIGdyYW51bGFyaXR5ID4gZmluZS4KKy8vCitzdGF0aWMga21wX2FmZmluX21hc2tfdCAqCitfX2ttcF9jcmVhdGVfbWFza3ModW5zaWduZWQgKm1heEluZGV4LCB1bnNpZ25lZCAqbnVtVW5pcXVlLAorICBBZGRyVW5zUGFpciAqYWRkcmVzczJvcywgdW5zaWduZWQgbnVtQWRkcnMpCit7CisgICAgLy8KKyAgICAvLyBGaXJzdCBmb3JtIGEgdGFibGUgb2YgYWZmaW5pdHkgbWFza3MgaW4gb3JkZXIgb2YgT1MgdGhyZWFkIGlkLgorICAgIC8vCisgICAgdW5zaWduZWQgZGVwdGg7CisgICAgdW5zaWduZWQgbWF4T3NJZDsKKyAgICB1bnNpZ25lZCBpOworCisgICAgS01QX0FTU0VSVChudW1BZGRycyA+IDApOworICAgIGRlcHRoID0gYWRkcmVzczJvc1swXS5maXJzdC5kZXB0aDsKKworICAgIG1heE9zSWQgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBudW1BZGRyczsgaSsrKSB7CisgICAgICAgIHVuc2lnbmVkIG9zSWQgPSBhZGRyZXNzMm9zW2ldLnNlY29uZDsKKyAgICAgICAgaWYgKG9zSWQgPiBtYXhPc0lkKSB7CisgICAgICAgICAgICBtYXhPc0lkID0gb3NJZDsKKyAgICAgICAgfQorICAgIH0KKyAgICBrbXBfYWZmaW5fbWFza190ICpvc0lkMk1hc2s7CisgICAgS01QX0NQVV9BTExPQ19BUlJBWShvc0lkMk1hc2ssIChtYXhPc0lkKzEpKTsKKworICAgIC8vCisgICAgLy8gU29ydCB0aGUgYWRkcmVzczJvcyB0YWJsZSBhY2NvcmRpbmcgdG8gcGh5c2ljYWwgb3JkZXIuICBEb2luZyBzbworICAgIC8vIHdpbGwgcHV0IGFsbCB0aHJlYWRzIG9uIHRoZSBzYW1lIGNvcmUvcGFja2FnZS9ub2RlIGluIGNvbnNlY3V0aXZlCisgICAgLy8gbG9jYXRpb25zLgorICAgIC8vCisgICAgcXNvcnQoYWRkcmVzczJvcywgbnVtQWRkcnMsIHNpemVvZigqYWRkcmVzczJvcyksCisgICAgICBfX2ttcF9hZmZpbml0eV9jbXBfQWRkcmVzc19sYWJlbHMpOworCisgICAgS01QX0FTU0VSVChfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA+PSAwKTsKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSAmJiAoX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPiAwKSkgeworICAgICAgICBLTVBfSU5GT1JNKFRocmVhZHNNaWdyYXRlLCAiS01QX0FGRklOSVRZIiwgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzKTsKKyAgICB9CisgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzID49IChpbnQpZGVwdGgpIHsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgKF9fa21wX2FmZmluaXR5X3dhcm5pbmdzCisgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkpKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyhBZmZUaHJlYWRzTWF5TWlncmF0ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLworICAgIC8vIFJ1biB0aHJvdWdoIHRoZSB0YWJsZSwgZm9ybWluZyB0aGUgbWFza3MgZm9yIGFsbCB0aHJlYWRzIG9uIGVhY2gKKyAgICAvLyBjb3JlLiAgVGhyZWFkcyBvbiB0aGUgc2FtZSBjb3JlIHdpbGwgaGF2ZSBpZGVudGljYWwgIkFkZHJlc3MiCisgICAgLy8gb2JqZWN0cywgbm90IGNvbnNpZGVyaW5nIHRoZSBsYXN0IGxldmVsLCB3aGljaCBtdXN0IGJlIHRoZSB0aHJlYWQKKyAgICAvLyBpZC4gIEFsbCB0aHJlYWRzIG9uIGEgY29yZSB3aWxsIGFwcGVhciBjb25zZWN1dGl2ZWx5LgorICAgIC8vCisgICAgdW5zaWduZWQgdW5pcXVlID0gMDsKKyAgICB1bnNpZ25lZCBqID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZGV4IG9mIDFzdCB0aHJlYWQgb24gY29yZQorICAgIHVuc2lnbmVkIGxlYWRlciA9IDA7CisgICAgQWRkcmVzcyAqbGVhZGVyQWRkciA9ICYoYWRkcmVzczJvc1swXS5maXJzdCk7CisgICAga21wX2FmZmluX21hc2tfdCAqc3VtOworICAgIEtNUF9DUFVfQUxMT0NfT05fU1RBQ0soc3VtKTsKKyAgICBLTVBfQ1BVX1pFUk8oc3VtKTsKKyAgICBLTVBfQ1BVX1NFVChhZGRyZXNzMm9zWzBdLnNlY29uZCwgc3VtKTsKKyAgICBmb3IgKGkgPSAxOyBpIDwgbnVtQWRkcnM7IGkrKykgeworICAgICAgICAvLworICAgICAgICAvLyBJZiB0aGlzIHRocmVhZCBpcyBzdWZmaWNpZW50bHkgY2xvc2UgdG8gdGhlIGxlYWRlciAod2l0aGluIHRoZQorICAgICAgICAvLyBncmFudWxhcml0eSBzZXR0aW5nKSwgdGhlbiBzZXQgdGhlIGJpdCBmb3IgdGhpcyBvcyB0aHJlYWQgaW4gdGhlCisgICAgICAgIC8vIGFmZmluaXR5IG1hc2sgZm9yIHRoaXMgZ3JvdXAsIGFuZCBnbyBvbiB0byB0aGUgbmV4dCB0aHJlYWQuCisgICAgICAgIC8vCisgICAgICAgIGlmIChsZWFkZXJBZGRyLT5pc0Nsb3NlKGFkZHJlc3Myb3NbaV0uZmlyc3QsCisgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMpKSB7CisgICAgICAgICAgICBLTVBfQ1BVX1NFVChhZGRyZXNzMm9zW2ldLnNlY29uZCwgc3VtKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRm9yIGV2ZXJ5IHRocmVhZCBpbiB0aGlzIGdyb3VwLCBjb3B5IHRoZSBtYXNrIHRvIHRoZSB0aHJlYWQncworICAgICAgICAvLyBlbnRyeSBpbiB0aGUgb3NJZDJNYXNrIHRhYmxlLiAgTWFyayB0aGUgZmlyc3QgYWRkcmVzcyBhcyBhCisgICAgICAgIC8vIGxlYWRlci4KKyAgICAgICAgLy8KKyAgICAgICAgZm9yICg7IGogPCBpOyBqKyspIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIG9zSWQgPSBhZGRyZXNzMm9zW2pdLnNlY29uZDsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQob3NJZCA8PSBtYXhPc0lkKTsKKyAgICAgICAgICAgIGttcF9hZmZpbl9tYXNrX3QgKm1hc2sgPSBLTVBfQ1BVX0lOREVYKG9zSWQyTWFzaywgb3NJZCk7CisgICAgICAgICAgICBLTVBfQ1BVX0NPUFkobWFzaywgc3VtKTsKKyAgICAgICAgICAgIGFkZHJlc3Myb3Nbal0uZmlyc3QubGVhZGVyID0gKGogPT0gbGVhZGVyKTsKKyAgICAgICAgfQorICAgICAgICB1bmlxdWUrKzsKKworICAgICAgICAvLworICAgICAgICAvLyBTdGFydCBhIG5ldyBtYXNrLgorICAgICAgICAvLworICAgICAgICBsZWFkZXIgPSBpOworICAgICAgICBsZWFkZXJBZGRyID0gJihhZGRyZXNzMm9zW2ldLmZpcnN0KTsKKyAgICAgICAgS01QX0NQVV9aRVJPKHN1bSk7CisgICAgICAgIEtNUF9DUFVfU0VUKGFkZHJlc3Myb3NbaV0uc2Vjb25kLCBzdW0pOworICAgIH0KKworICAgIC8vCisgICAgLy8gRm9yIGV2ZXJ5IHRocmVhZCBpbiBsYXN0IGdyb3VwLCBjb3B5IHRoZSBtYXNrIHRvIHRoZSB0aHJlYWQncworICAgIC8vIGVudHJ5IGluIHRoZSBvc0lkMk1hc2sgdGFibGUuCisgICAgLy8KKyAgICBmb3IgKDsgaiA8IGk7IGorKykgeworICAgICAgICB1bnNpZ25lZCBvc0lkID0gYWRkcmVzczJvc1tqXS5zZWNvbmQ7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQob3NJZCA8PSBtYXhPc0lkKTsKKyAgICAgICAga21wX2FmZmluX21hc2tfdCAqbWFzayA9IEtNUF9DUFVfSU5ERVgob3NJZDJNYXNrLCBvc0lkKTsKKyAgICAgICAgS01QX0NQVV9DT1BZKG1hc2ssIHN1bSk7CisgICAgICAgIGFkZHJlc3Myb3Nbal0uZmlyc3QubGVhZGVyID0gKGogPT0gbGVhZGVyKTsKKyAgICB9CisgICAgdW5pcXVlKys7CisgICAgS01QX0NQVV9GUkVFX0ZST01fU1RBQ0soc3VtKTsKKworICAgICptYXhJbmRleCA9IG1heE9zSWQ7CisgICAgKm51bVVuaXF1ZSA9IHVuaXF1ZTsKKyAgICByZXR1cm4gb3NJZDJNYXNrOworfQorCisKKy8vCisvLyBTdHVmZiBmb3IgdGhlIGFmZmluaXR5IHByb2NsaXN0IHBhcnNlcnMuICBJdCdzIGVhc2llciB0byBkZWNsYXJlIHRoZXNlIHZhcnMKKy8vIGFzIGZpbGUtc3RhdGljIHRoYW4gdG8gdHJ5IGFuZCBwYXNzIHRoZW0gdGhyb3VnaCB0aGUgY2FsbGluZyBzZXF1ZW5jZSBvZgorLy8gdGhlIHJlY3Vyc2l2ZS1kZXNjZW50IE9NUF9QTEFDRVMgcGFyc2VyLgorLy8KK3N0YXRpYyBrbXBfYWZmaW5fbWFza190ICpuZXdNYXNrczsKK3N0YXRpYyBpbnQgbnVtTmV3TWFza3M7CitzdGF0aWMgaW50IG5leHROZXdNYXNrOworCisjZGVmaW5lIEFERF9NQVNLKF9tYXNrKSBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChuZXh0TmV3TWFzayA+PSBudW1OZXdNYXNrcykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBudW1OZXdNYXNrcyAqPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBrbXBfYWZmaW5fbWFza190KiB0ZW1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfQ1BVX0lOVEVSTkFMX0FMTE9DX0FSUkFZKHRlbXAsIG51bU5ld01hc2tzKTsgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IoaT0wO2k8bnVtTmV3TWFza3MvMjtpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAga21wX2FmZmluX21hc2tfdCogc3JjICA9IEtNUF9DUFVfSU5ERVgobmV3TWFza3MsIGkpOyAgICBcCisgICAgICAgICAgICAgICAga21wX2FmZmluX21hc2tfdCogZGVzdCA9IEtNUF9DUFVfSU5ERVgodGVtcCwgaSk7ICAgICAgICBcCisgICAgICAgICAgICAgICAgS01QX0NQVV9DT1BZKGRlc3QsIHNyYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfQ1BVX0lOVEVSTkFMX0ZSRUVfQVJSQVkobmV3TWFza3MsIG51bU5ld01hc2tzLzIpOyAgICAgICBcCisgICAgICAgICAgICBuZXdNYXNrcyA9IHRlbXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9DUFVfQ09QWShLTVBfQ1BVX0lOREVYKG5ld01hc2tzLCBuZXh0TmV3TWFzayksIChfbWFzaykpOyAgICBcCisgICAgICAgIG5leHROZXdNYXNrKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisjZGVmaW5lIEFERF9NQVNLX09TSUQoX29zSWQsX29zSWQyTWFzayxfbWF4T3NJZCkgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoKChfb3NJZCkgPiBfbWF4T3NJZCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICghIEtNUF9DUFVfSVNTRVQoKF9vc0lkKSwgS01QX0NQVV9JTkRFWCgoX29zSWQyTWFzayksIChfb3NJZCkpKSkpIHsgXAorICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgKF9fa21wX2FmZmluaXR5X3dhcm5pbmdzICAgICAgXAorICAgICAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9ub25lKSkpIHsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKEFmZklnbm9yZUludmFsaWRQcm9jSUQsIF9vc0lkKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUREX01BU0soS01QX0NQVV9JTkRFWChfb3NJZDJNYXNrLCAoX29zSWQpKSk7ICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworCisvLworLy8gUmUtcGFyc2UgdGhlIHByb2NsaXN0IChmb3IgdGhlIGV4cGxpY2l0IGFmZmluaXR5IHR5cGUpLCBhbmQgZm9ybSB0aGUgbGlzdAorLy8gb2YgYWZmaW5pdHkgbmV3TWFza3MgaW5kZXhlZCBieSBndGlkLgorLy8KK3N0YXRpYyB2b2lkCitfX2ttcF9hZmZpbml0eV9wcm9jZXNzX3Byb2NsaXN0KGttcF9hZmZpbl9tYXNrX3QgKipvdXRfbWFza3MsCisgIHVuc2lnbmVkIGludCAqb3V0X251bU1hc2tzLCBjb25zdCBjaGFyICpwcm9jbGlzdCwKKyAga21wX2FmZmluX21hc2tfdCAqb3NJZDJNYXNrLCBpbnQgbWF4T3NJZCkKK3sKKyAgICBpbnQgaTsKKyAgICBjb25zdCBjaGFyICpzY2FuID0gcHJvY2xpc3Q7CisgICAgY29uc3QgY2hhciAqbmV4dCA9IHByb2NsaXN0OworCisgICAgLy8KKyAgICAvLyBXZSB1c2UgbWFsbG9jKCkgZm9yIHRoZSB0ZW1wb3JhcnkgbWFzayB2ZWN0b3IsCisgICAgLy8gc28gdGhhdCB3ZSBjYW4gdXNlIHJlYWxsb2MoKSB0byBleHRlbmQgaXQuCisgICAgLy8KKyAgICBudW1OZXdNYXNrcyA9IDI7CisgICAgS01QX0NQVV9JTlRFUk5BTF9BTExPQ19BUlJBWShuZXdNYXNrcywgbnVtTmV3TWFza3MpOworICAgIG5leHROZXdNYXNrID0gMDsKKyAgICBrbXBfYWZmaW5fbWFza190ICpzdW1NYXNrOworICAgIEtNUF9DUFVfQUxMT0Moc3VtTWFzayk7CisgICAgaW50IHNldFNpemUgPSAwOworCisgICAgZm9yICg7OykgeworICAgICAgICBpbnQgc3RhcnQsIGVuZCwgc3RyaWRlOworCisgICAgICAgIFNLSVBfV1Moc2Nhbik7CisgICAgICAgIG5leHQgPSBzY2FuOworICAgICAgICBpZiAoKm5leHQgPT0gJ1wwJykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKm5leHQgPT0gJ3snKSB7CisgICAgICAgICAgICBpbnQgbnVtOworICAgICAgICAgICAgc2V0U2l6ZSA9IDA7CisgICAgICAgICAgICBuZXh0Kys7ICAgICAvLyBza2lwICd7JworICAgICAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgICAgIHNjYW4gPSBuZXh0OworCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gUmVhZCB0aGUgZmlyc3QgaW50ZWdlciBpbiB0aGUgc2V0LgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIEtNUF9BU1NFUlQyKCgqbmV4dCA+PSAnMCcpICYmICgqbmV4dCA8PSAnOScpLAorICAgICAgICAgICAgICAiYmFkIHByb2NsaXN0Iik7CisgICAgICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgICAgIG51bSA9IF9fa21wX3N0cl90b19pbnQoc2NhbiwgKm5leHQpOworICAgICAgICAgICAgS01QX0FTU0VSVDIobnVtID49IDAsICJiYWQgZXhwbGljaXQgcHJvYyBsaXN0Iik7CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBDb3B5IHRoZSBtYXNrIGZvciB0aGF0IG9zSWQgdG8gdGhlIHN1bSAodW5pb24pIG1hc2suCisgICAgICAgICAgICAvLworICAgICAgICAgICAgaWYgKChudW0gPiBtYXhPc0lkKSB8fAorICAgICAgICAgICAgICAoISBLTVBfQ1BVX0lTU0VUKG51bSwgS01QX0NQVV9JTkRFWChvc0lkMk1hc2ssIG51bSkpKSkgeworICAgICAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IChfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkpKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKEFmZklnbm9yZUludmFsaWRQcm9jSUQsIG51bSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEtNUF9DUFVfWkVSTyhzdW1NYXNrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEtNUF9DUFVfQ09QWShzdW1NYXNrLCBLTVBfQ1BVX0lOREVYKG9zSWQyTWFzaywgbnVtKSk7CisgICAgICAgICAgICAgICAgc2V0U2l6ZSA9IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBlbmQgb2Ygc2V0LgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgICAgICAgICBpZiAoKm5leHQgPT0gJ30nKSB7CisgICAgICAgICAgICAgICAgICAgIG5leHQrKzsgICAgIC8vIHNraXAgJ30nCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gU2tpcCBvcHRpb25hbCBjb21tYS4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIGlmICgqbmV4dCA9PSAnLCcpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV4dCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTS0lQX1dTKG5leHQpOworCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBSZWFkIHRoZSBuZXh0IGludGVnZXIgaW4gdGhlIHNldC4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIHNjYW4gPSBuZXh0OworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQyKCgqbmV4dCA+PSAnMCcpICYmICgqbmV4dCA8PSAnOScpLAorICAgICAgICAgICAgICAgICAgImJhZCBleHBsaWNpdCBwcm9jIGxpc3QiKTsKKworICAgICAgICAgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICAgICAgICAgIG51bSA9IF9fa21wX3N0cl90b19pbnQoc2NhbiwgKm5leHQpOworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQyKG51bSA+PSAwLCAiYmFkIGV4cGxpY2l0IHByb2MgbGlzdCIpOworCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIG1hc2sgZm9yIHRoYXQgb3NJZCB0byB0aGUgc3VtIG1hc2suCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBpZiAoKG51bSA+IG1heE9zSWQpIHx8CisgICAgICAgICAgICAgICAgICAoISBLTVBfQ1BVX0lTU0VUKG51bSwgS01QX0NQVV9JTkRFWChvc0lkMk1hc2ssIG51bSkpKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCAoX19rbXBfYWZmaW5pdHlfd2FybmluZ3MKKyAgICAgICAgICAgICAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9ub25lKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKEFmZklnbm9yZUludmFsaWRQcm9jSUQsIG51bSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9DUFVfVU5JT04oc3VtTWFzaywgS01QX0NQVV9JTkRFWChvc0lkMk1hc2ssIG51bSkpOworICAgICAgICAgICAgICAgICAgICBzZXRTaXplKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNldFNpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgQUREX01BU0soc3VtTWFzayk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgICAgICBpZiAoKm5leHQgPT0gJywnKSB7CisgICAgICAgICAgICAgICAgbmV4dCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2NhbiA9IG5leHQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIFJlYWQgdGhlIGZpcnN0IGludGVnZXIuCisgICAgICAgIC8vCisgICAgICAgIEtNUF9BU1NFUlQyKCgqbmV4dCA+PSAnMCcpICYmICgqbmV4dCA8PSAnOScpLCAiYmFkIGV4cGxpY2l0IHByb2MgbGlzdCIpOworICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgc3RhcnQgPSBfX2ttcF9zdHJfdG9faW50KHNjYW4sICpuZXh0KTsKKyAgICAgICAgS01QX0FTU0VSVDIoc3RhcnQgPj0gMCwgImJhZCBleHBsaWNpdCBwcm9jIGxpc3QiKTsKKyAgICAgICAgU0tJUF9XUyhuZXh0KTsKKworICAgICAgICAvLworICAgICAgICAvLyBJZiB0aGlzIGlzbid0IGEgcmFuZ2UsIHRoZW4gYWRkIGEgbWFzayB0byB0aGUgbGlzdCBhbmQgZ28gb24uCisgICAgICAgIC8vCisgICAgICAgIGlmICgqbmV4dCAhPSAnLScpIHsKKyAgICAgICAgICAgIEFERF9NQVNLX09TSUQoc3RhcnQsIG9zSWQyTWFzaywgbWF4T3NJZCk7CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBTa2lwIG9wdGlvbmFsIGNvbW1hLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmICgqbmV4dCA9PSAnLCcpIHsKKyAgICAgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzY2FuID0gbmV4dDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhpcyBpcyBhIHJhbmdlLiAgU2tpcCBvdmVyIHRoZSAnLScgYW5kIHJlYWQgaW4gdGhlIDJuZCBpbnQuCisgICAgICAgIC8vCisgICAgICAgIG5leHQrKzsgICAgICAgICAvLyBza2lwICctJworICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICBzY2FuID0gbmV4dDsKKyAgICAgICAgS01QX0FTU0VSVDIoKCpuZXh0ID49ICcwJykgJiYgKCpuZXh0IDw9ICc5JyksICJiYWQgZXhwbGljaXQgcHJvYyBsaXN0Iik7CisgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICBlbmQgPSBfX2ttcF9zdHJfdG9faW50KHNjYW4sICpuZXh0KTsKKyAgICAgICAgS01QX0FTU0VSVDIoZW5kID49IDAsICJiYWQgZXhwbGljaXQgcHJvYyBsaXN0Iik7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQ2hlY2sgZm9yIGEgc3RyaWRlIHBhcmFtZXRlcgorICAgICAgICAvLworICAgICAgICBzdHJpZGUgPSAxOworICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICBpZiAoKm5leHQgPT0gJzonKSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gQSBzdHJpZGUgaXMgc3BlY2lmaWVkLiAgU2tpcCBvdmVyIHRoZSAnOiIgYW5kIHJlYWQgdGhlIDNyZCBpbnQuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgaW50IHNpZ24gPSArMTsKKyAgICAgICAgICAgIG5leHQrKzsgICAgICAgICAvLyBza2lwICc6JworICAgICAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgICAgIHNjYW4gPSBuZXh0OworICAgICAgICAgICAgaWYgKCpuZXh0ID09ICctJykgeworICAgICAgICAgICAgICAgIHNpZ24gPSAtMTsKKyAgICAgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgICAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgICAgICAgICBzY2FuID0gbmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEtNUF9BU1NFUlQyKCgqbmV4dCA+PSAgJzAnKSAmJiAoKm5leHQgPD0gJzknKSwKKyAgICAgICAgICAgICAgImJhZCBleHBsaWNpdCBwcm9jIGxpc3QiKTsKKyAgICAgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICAgICAgc3RyaWRlID0gX19rbXBfc3RyX3RvX2ludChzY2FuLCAqbmV4dCk7CisgICAgICAgICAgICBLTVBfQVNTRVJUMihzdHJpZGUgPj0gMCwgImJhZCBleHBsaWNpdCBwcm9jIGxpc3QiKTsKKyAgICAgICAgICAgIHN0cmlkZSAqPSBzaWduOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRG8gc29tZSByYW5nZSBjaGVja3MuCisgICAgICAgIC8vCisgICAgICAgIEtNUF9BU1NFUlQyKHN0cmlkZSAhPSAwLCAiYmFkIGV4cGxpY2l0IHByb2MgbGlzdCIpOworICAgICAgICBpZiAoc3RyaWRlID4gMCkgeworICAgICAgICAgICAgS01QX0FTU0VSVDIoc3RhcnQgPD0gZW5kLCAiYmFkIGV4cGxpY2l0IHByb2MgbGlzdCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgS01QX0FTU0VSVDIoc3RhcnQgPj0gZW5kLCAiYmFkIGV4cGxpY2l0IHByb2MgbGlzdCIpOworICAgICAgICB9CisgICAgICAgIEtNUF9BU1NFUlQyKChlbmQgLSBzdGFydCkgLyBzdHJpZGUgPD0gNjU1MzYsICJiYWQgZXhwbGljaXQgcHJvYyBsaXN0Iik7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQWRkIHRoZSBtYXNrIGZvciBlYWNoIE9TIHByb2MgIyB0byB0aGUgbGlzdC4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKHN0cmlkZSA+IDApIHsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBBRERfTUFTS19PU0lEKHN0YXJ0LCBvc0lkMk1hc2ssIG1heE9zSWQpOworICAgICAgICAgICAgICAgIHN0YXJ0ICs9IHN0cmlkZTsKKyAgICAgICAgICAgIH0gd2hpbGUgKHN0YXJ0IDw9IGVuZCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgQUREX01BU0tfT1NJRChzdGFydCwgb3NJZDJNYXNrLCBtYXhPc0lkKTsKKyAgICAgICAgICAgICAgICBzdGFydCArPSBzdHJpZGU7CisgICAgICAgICAgICB9IHdoaWxlIChzdGFydCA+PSBlbmQpOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gU2tpcCBvcHRpb25hbCBjb21tYS4KKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgaWYgKCpuZXh0ID09ICcsJykgeworICAgICAgICAgICAgbmV4dCsrOworICAgICAgICB9CisgICAgICAgIHNjYW4gPSBuZXh0OworICAgIH0KKworICAgICpvdXRfbnVtTWFza3MgPSBuZXh0TmV3TWFzazsKKyAgICBpZiAobmV4dE5ld01hc2sgPT0gMCkgeworICAgICAgICAqb3V0X21hc2tzID0gTlVMTDsKKyAgICAgICAgS01QX0NQVV9JTlRFUk5BTF9GUkVFX0FSUkFZKG5ld01hc2tzLCBudW1OZXdNYXNrcyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgS01QX0NQVV9BTExPQ19BUlJBWSgoKm91dF9tYXNrcyksIG5leHROZXdNYXNrKTsKKyAgICBmb3IoaSA9IDA7IGkgPCBuZXh0TmV3TWFzazsgaSsrKSB7CisgICAgICAgIGttcF9hZmZpbl9tYXNrX3QqIHNyYyAgPSBLTVBfQ1BVX0lOREVYKG5ld01hc2tzLCBpKTsKKyAgICAgICAga21wX2FmZmluX21hc2tfdCogZGVzdCA9IEtNUF9DUFVfSU5ERVgoKCpvdXRfbWFza3MpLCBpKTsKKyAgICAgICAgS01QX0NQVV9DT1BZKGRlc3QsIHNyYyk7CisgICAgfQorICAgIEtNUF9DUFVfSU5URVJOQUxfRlJFRV9BUlJBWShuZXdNYXNrcywgbnVtTmV3TWFza3MpOworICAgIEtNUF9DUFVfRlJFRShzdW1NYXNrKTsKK30KKworCisjIGlmIE9NUF80MF9FTkFCTEVECisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUmUtcGFyc2UgdGhlIE9NUF9QTEFDRVMgcHJvYyBpZCBsaXN0LCBmb3JtaW5nIHRoZSBuZXdNYXNrcyBmb3IgdGhlIGRpZmZlcmVudAorcGxhY2VzLiAgQWdhaW4sIEhlcmUgaXMgdGhlIGdyYW1tYXI6CisKK3BsYWNlX2xpc3QgOj0gcGxhY2UKK3BsYWNlX2xpc3QgOj0gcGxhY2UgLCBwbGFjZV9saXN0CitwbGFjZSA6PSBudW0KK3BsYWNlIDo9IHBsYWNlIDogbnVtCitwbGFjZSA6PSBwbGFjZSA6IG51bSA6IHNpZ25lZAorcGxhY2UgOj0geyBzdWJwbGFjZWxpc3QgfQorcGxhY2UgOj0gISBwbGFjZSAgICAgICAgICAgICAgICAgIC8vIChsb3dlc3QgcHJpb3JpdHkpCitzdWJwbGFjZV9saXN0IDo9IHN1YnBsYWNlCitzdWJwbGFjZV9saXN0IDo9IHN1YnBsYWNlICwgc3VicGxhY2VfbGlzdAorc3VicGxhY2UgOj0gbnVtCitzdWJwbGFjZSA6PSBudW0gOiBudW0KK3N1YnBsYWNlIDo9IG51bSA6IG51bSA6IHNpZ25lZAorc2lnbmVkIDo9IG51bQorc2lnbmVkIDo9ICsgc2lnbmVkCitzaWduZWQgOj0gLSBzaWduZWQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZAorX19rbXBfcHJvY2Vzc19zdWJwbGFjZV9saXN0KGNvbnN0IGNoYXIgKipzY2FuLCBrbXBfYWZmaW5fbWFza190ICpvc0lkMk1hc2ssCisgIGludCBtYXhPc0lkLCBrbXBfYWZmaW5fbWFza190ICp0ZW1wTWFzaywgaW50ICpzZXRTaXplKQoreworICAgIGNvbnN0IGNoYXIgKm5leHQ7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGludCBzdGFydCwgY291bnQsIHN0cmlkZSwgaTsKKworICAgICAgICAvLworICAgICAgICAvLyBSZWFkIGluIHRoZSBzdGFydGluZyBwcm9jIGlkCisgICAgICAgIC8vCisgICAgICAgIFNLSVBfV1MoKnNjYW4pOworICAgICAgICBLTVBfQVNTRVJUMigoKipzY2FuID49ICcwJykgJiYgKCoqc2NhbiA8PSAnOScpLAorICAgICAgICAgICJiYWQgZXhwbGljaXQgcGxhY2VzIGxpc3QiKTsKKyAgICAgICAgbmV4dCA9ICpzY2FuOworICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgc3RhcnQgPSBfX2ttcF9zdHJfdG9faW50KCpzY2FuLCAqbmV4dCk7CisgICAgICAgIEtNUF9BU1NFUlQoc3RhcnQgPj0gMCk7CisgICAgICAgICpzY2FuID0gbmV4dDsKKworICAgICAgICAvLworICAgICAgICAvLyB2YWxpZCBmb2xsb3cgc2V0cyBhcmUgJywnICc6JyBhbmQgJ30nCisgICAgICAgIC8vCisgICAgICAgIFNLSVBfV1MoKnNjYW4pOworICAgICAgICBpZiAoKipzY2FuID09ICd9JyB8fCAqKnNjYW4gPT0gJywnKSB7CisgICAgICAgICAgICBpZiAoKHN0YXJ0ID4gbWF4T3NJZCkgfHwKKyAgICAgICAgICAgICAgKCEgS01QX0NQVV9JU1NFVChzdGFydCwgS01QX0NQVV9JTkRFWChvc0lkMk1hc2ssIHN0YXJ0KSkpKSB7CisgICAgICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgKF9fa21wX2FmZmluaXR5X3dhcm5pbmdzCisgICAgICAgICAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9ub25lKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmSWdub3JlSW52YWxpZFByb2NJRCwgc3RhcnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEtNUF9DUFVfVU5JT04odGVtcE1hc2ssIEtNUF9DUFVfSU5ERVgob3NJZDJNYXNrLCBzdGFydCkpOworICAgICAgICAgICAgICAgICgqc2V0U2l6ZSkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgqKnNjYW4gPT0gJ30nKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAoKnNjYW4pKys7ICAvLyBza2lwICcsJworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgS01QX0FTU0VSVDIoKipzY2FuID09ICc6JywgImJhZCBleHBsaWNpdCBwbGFjZXMgbGlzdCIpOworICAgICAgICAoKnNjYW4pKys7ICAgICAgLy8gc2tpcCAnOicKKworICAgICAgICAvLworICAgICAgICAvLyBSZWFkIGNvdW50IHBhcmFtZXRlcgorICAgICAgICAvLworICAgICAgICBTS0lQX1dTKCpzY2FuKTsKKyAgICAgICAgS01QX0FTU0VSVDIoKCoqc2NhbiA+PSAnMCcpICYmICgqKnNjYW4gPD0gJzknKSwKKyAgICAgICAgICAiYmFkIGV4cGxpY2l0IHBsYWNlcyBsaXN0Iik7CisgICAgICAgIG5leHQgPSAqc2NhbjsKKyAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgIGNvdW50ID0gX19rbXBfc3RyX3RvX2ludCgqc2NhbiwgKm5leHQpOworICAgICAgICBLTVBfQVNTRVJUKGNvdW50ID49IDApOworICAgICAgICAqc2NhbiA9IG5leHQ7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gdmFsaWQgZm9sbG93IHNldHMgYXJlICcsJyAnOicgYW5kICd9JworICAgICAgICAvLworICAgICAgICBTS0lQX1dTKCpzY2FuKTsKKyAgICAgICAgaWYgKCoqc2NhbiA9PSAnfScgfHwgKipzY2FuID09ICcsJykgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoKHN0YXJ0ID4gbWF4T3NJZCkgfHwKKyAgICAgICAgICAgICAgICAgICghIEtNUF9DUFVfSVNTRVQoc3RhcnQsIEtNUF9DUFVfSU5ERVgob3NJZDJNYXNrLCBzdGFydCkpKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCAoX19rbXBfYWZmaW5pdHlfd2FybmluZ3MKKyAgICAgICAgICAgICAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9ub25lKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKEFmZklnbm9yZUludmFsaWRQcm9jSUQsIHN0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsgIC8vIGRvbid0IHByb2xpZmVyYXRlIHdhcm5pbmdzIGZvciBsYXJnZSBjb3VudAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0NQVV9VTklPTih0ZW1wTWFzaywgS01QX0NQVV9JTkRFWChvc0lkMk1hc2ssIHN0YXJ0KSk7CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0Kys7CisgICAgICAgICAgICAgICAgICAgICgqc2V0U2l6ZSkrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKipzY2FuID09ICd9JykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKCpzY2FuKSsrOyAgLy8gc2tpcCAnLCcKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIEtNUF9BU1NFUlQyKCoqc2NhbiA9PSAnOicsICJiYWQgZXhwbGljaXQgcGxhY2VzIGxpc3QiKTsKKyAgICAgICAgKCpzY2FuKSsrOyAgICAgIC8vIHNraXAgJzonCisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gUmVhZCBzdHJpZGUgcGFyYW1ldGVyCisgICAgICAgIC8vCisgICAgICAgIGludCBzaWduID0gKzE7CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIFNLSVBfV1MoKnNjYW4pOworICAgICAgICAgICAgaWYgKCoqc2NhbiA9PSAnKycpIHsKKyAgICAgICAgICAgICAgICAoKnNjYW4pKys7IC8vIHNraXAgJysnCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKipzY2FuID09ICctJykgeworICAgICAgICAgICAgICAgIHNpZ24gKj0gLTE7CisgICAgICAgICAgICAgICAgKCpzY2FuKSsrOyAvLyBza2lwICctJworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgU0tJUF9XUygqc2Nhbik7CisgICAgICAgIEtNUF9BU1NFUlQyKCgqKnNjYW4gPj0gJzAnKSAmJiAoKipzY2FuIDw9ICc5JyksCisgICAgICAgICAgImJhZCBleHBsaWNpdCBwbGFjZXMgbGlzdCIpOworICAgICAgICBuZXh0ID0gKnNjYW47CisgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICBzdHJpZGUgPSBfX2ttcF9zdHJfdG9faW50KCpzY2FuLCAqbmV4dCk7CisgICAgICAgIEtNUF9BU1NFUlQoc3RyaWRlID49IDApOworICAgICAgICAqc2NhbiA9IG5leHQ7CisgICAgICAgIHN0cmlkZSAqPSBzaWduOworCisgICAgICAgIC8vCisgICAgICAgIC8vIHZhbGlkIGZvbGxvdyBzZXRzIGFyZSAnLCcgYW5kICd9JworICAgICAgICAvLworICAgICAgICBTS0lQX1dTKCpzY2FuKTsKKyAgICAgICAgaWYgKCoqc2NhbiA9PSAnfScgfHwgKipzY2FuID09ICcsJykgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoKHN0YXJ0ID4gbWF4T3NJZCkgfHwKKyAgICAgICAgICAgICAgICAgICghIEtNUF9DUFVfSVNTRVQoc3RhcnQsIEtNUF9DUFVfSU5ERVgob3NJZDJNYXNrLCBzdGFydCkpKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCAoX19rbXBfYWZmaW5pdHlfd2FybmluZ3MKKyAgICAgICAgICAgICAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9ub25lKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKEFmZklnbm9yZUludmFsaWRQcm9jSUQsIHN0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsgIC8vIGRvbid0IHByb2xpZmVyYXRlIHdhcm5pbmdzIGZvciBsYXJnZSBjb3VudAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0NQVV9VTklPTih0ZW1wTWFzaywgS01QX0NQVV9JTkRFWChvc0lkMk1hc2ssIHN0YXJ0KSk7CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICs9IHN0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgKCpzZXRTaXplKSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgqKnNjYW4gPT0gJ30nKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAoKnNjYW4pKys7ICAvLyBza2lwICcsJworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBLTVBfQVNTRVJUMigwLCAiYmFkIGV4cGxpY2l0IHBsYWNlcyBsaXN0Iik7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCitfX2ttcF9wcm9jZXNzX3BsYWNlKGNvbnN0IGNoYXIgKipzY2FuLCBrbXBfYWZmaW5fbWFza190ICpvc0lkMk1hc2ssCisgIGludCBtYXhPc0lkLCBrbXBfYWZmaW5fbWFza190ICp0ZW1wTWFzaywgaW50ICpzZXRTaXplKQoreworICAgIGNvbnN0IGNoYXIgKm5leHQ7CisKKyAgICAvLworICAgIC8vIHZhbGlkIGZvbGxvdyBzZXRzIGFyZSAneycgJyEnIGFuZCBudW0KKyAgICAvLworICAgIFNLSVBfV1MoKnNjYW4pOworICAgIGlmICgqKnNjYW4gPT0gJ3snKSB7CisgICAgICAgICgqc2NhbikrKzsgICAgICAvLyBza2lwICd7JworICAgICAgICBfX2ttcF9wcm9jZXNzX3N1YnBsYWNlX2xpc3Qoc2Nhbiwgb3NJZDJNYXNrLCBtYXhPc0lkICwgdGVtcE1hc2ssCisgICAgICAgICAgc2V0U2l6ZSk7CisgICAgICAgIEtNUF9BU1NFUlQyKCoqc2NhbiA9PSAnfScsICJiYWQgZXhwbGljaXQgcGxhY2VzIGxpc3QiKTsKKyAgICAgICAgKCpzY2FuKSsrOyAgICAgIC8vIHNraXAgJ30nCisgICAgfQorICAgIGVsc2UgaWYgKCoqc2NhbiA9PSAnIScpIHsKKyAgICAgICAgKCpzY2FuKSsrOyAgICAgIC8vIHNraXAgJyEnCisgICAgICAgIF9fa21wX3Byb2Nlc3NfcGxhY2Uoc2Nhbiwgb3NJZDJNYXNrLCBtYXhPc0lkLCB0ZW1wTWFzaywgc2V0U2l6ZSk7CisgICAgICAgIEtNUF9DUFVfQ09NUExFTUVOVChtYXhPc0lkLCB0ZW1wTWFzayk7CisgICAgfQorICAgIGVsc2UgaWYgKCgqKnNjYW4gPj0gJzAnKSAmJiAoKipzY2FuIDw9ICc5JykpIHsKKyAgICAgICAgbmV4dCA9ICpzY2FuOworICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgaW50IG51bSA9IF9fa21wX3N0cl90b19pbnQoKnNjYW4sICpuZXh0KTsKKyAgICAgICAgS01QX0FTU0VSVChudW0gPj0gMCk7CisgICAgICAgIGlmICgobnVtID4gbWF4T3NJZCkgfHwKKyAgICAgICAgICAoISBLTVBfQ1BVX0lTU0VUKG51bSwgS01QX0NQVV9JTkRFWChvc0lkMk1hc2ssIG51bSkpKSkgeworICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgKF9fa21wX2FmZmluaXR5X3dhcm5pbmdzCisgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpKSkgeworICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKEFmZklnbm9yZUludmFsaWRQcm9jSUQsIG51bSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBLTVBfQ1BVX1VOSU9OKHRlbXBNYXNrLCBLTVBfQ1BVX0lOREVYKG9zSWQyTWFzaywgbnVtKSk7CisgICAgICAgICAgICAoKnNldFNpemUpKys7CisgICAgICAgIH0KKyAgICAgICAgKnNjYW4gPSBuZXh0OyAgLy8gc2tpcCBudW0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEtNUF9BU1NFUlQyKDAsICJiYWQgZXhwbGljaXQgcGxhY2VzIGxpc3QiKTsKKyAgICB9Cit9CisKKworLy9zdGF0aWMgdm9pZAordm9pZAorX19rbXBfYWZmaW5pdHlfcHJvY2Vzc19wbGFjZWxpc3Qoa21wX2FmZmluX21hc2tfdCAqKm91dF9tYXNrcywKKyAgdW5zaWduZWQgaW50ICpvdXRfbnVtTWFza3MsIGNvbnN0IGNoYXIgKnBsYWNlbGlzdCwKKyAga21wX2FmZmluX21hc2tfdCAqb3NJZDJNYXNrLCBpbnQgbWF4T3NJZCkKK3sKKyAgICBpbnQgaSxqLGNvdW50LHN0cmlkZSxzaWduOworICAgIGNvbnN0IGNoYXIgKnNjYW4gPSBwbGFjZWxpc3Q7CisgICAgY29uc3QgY2hhciAqbmV4dCA9IHBsYWNlbGlzdDsKKworICAgIG51bU5ld01hc2tzID0gMjsKKyAgICBLTVBfQ1BVX0lOVEVSTkFMX0FMTE9DX0FSUkFZKG5ld01hc2tzLCBudW1OZXdNYXNrcyk7CisgICAgbmV4dE5ld01hc2sgPSAwOworCisgICAgLy8gdGVtcE1hc2sgaXMgbW9kaWZpZWQgYmFzZWQgb24gdGhlIHByZXZpb3VzIG9yIGluaXRpYWwKKyAgICAvLyAgIHBsYWNlIHRvIGZvcm0gdGhlIGN1cnJlbnQgcGxhY2UKKyAgICAvLyBwcmV2aW91c01hc2sgY29udGFpbnMgdGhlIHByZXZpb3VzIHBsYWNlCisgICAga21wX2FmZmluX21hc2tfdCAqdGVtcE1hc2s7CisgICAga21wX2FmZmluX21hc2tfdCAqcHJldmlvdXNNYXNrOworICAgIEtNUF9DUFVfQUxMT0ModGVtcE1hc2spOworICAgIEtNUF9DUFVfWkVSTyh0ZW1wTWFzayk7CisgICAgS01QX0NQVV9BTExPQyhwcmV2aW91c01hc2spOworICAgIEtNUF9DUFVfWkVSTyhwcmV2aW91c01hc2spOworICAgIGludCBzZXRTaXplID0gMDsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgX19rbXBfcHJvY2Vzc19wbGFjZSgmc2Nhbiwgb3NJZDJNYXNrLCBtYXhPc0lkLCB0ZW1wTWFzaywgJnNldFNpemUpOworCisgICAgICAgIC8vCisgICAgICAgIC8vIHZhbGlkIGZvbGxvdyBzZXRzIGFyZSAnLCcgJzonIGFuZCBFT0wKKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUyhzY2FuKTsKKyAgICAgICAgaWYgKCpzY2FuID09ICdcMCcgfHwgKnNjYW4gPT0gJywnKSB7CisgICAgICAgICAgICBpZiAoc2V0U2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICBBRERfTUFTSyh0ZW1wTWFzayk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBLTVBfQ1BVX1pFUk8odGVtcE1hc2spOworICAgICAgICAgICAgc2V0U2l6ZSA9IDA7CisgICAgICAgICAgICBpZiAoKnNjYW4gPT0gJ1wwJykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2NhbisrOyAgICAgLy8gc2tpcCAnLCcKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgS01QX0FTU0VSVDIoKnNjYW4gPT0gJzonLCAiYmFkIGV4cGxpY2l0IHBsYWNlcyBsaXN0Iik7CisgICAgICAgIHNjYW4rKzsgICAgICAgICAvLyBza2lwICc6JworCisgICAgICAgIC8vCisgICAgICAgIC8vIFJlYWQgY291bnQgcGFyYW1ldGVyCisgICAgICAgIC8vCisgICAgICAgIFNLSVBfV1Moc2Nhbik7CisgICAgICAgIEtNUF9BU1NFUlQyKCgqc2NhbiA+PSAnMCcpICYmICgqc2NhbiA8PSAnOScpLAorICAgICAgICAgICJiYWQgZXhwbGljaXQgcGxhY2VzIGxpc3QiKTsKKyAgICAgICAgbmV4dCA9IHNjYW47CisgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICBjb3VudCA9IF9fa21wX3N0cl90b19pbnQoc2NhbiwgKm5leHQpOworICAgICAgICBLTVBfQVNTRVJUKGNvdW50ID49IDApOworICAgICAgICBzY2FuID0gbmV4dDsKKworICAgICAgICAvLworICAgICAgICAvLyB2YWxpZCBmb2xsb3cgc2V0cyBhcmUgJywnICc6JyBhbmQgRU9MCisgICAgICAgIC8vCisgICAgICAgIFNLSVBfV1Moc2Nhbik7CisgICAgICAgIGlmICgqc2NhbiA9PSAnXDAnIHx8ICpzY2FuID09ICcsJykgeworICAgICAgICAgICAgc3RyaWRlID0gKzE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBLTVBfQVNTRVJUMigqc2NhbiA9PSAnOicsICJiYWQgZXhwbGljaXQgcGxhY2VzIGxpc3QiKTsKKyAgICAgICAgICAgIHNjYW4rKzsgICAgICAgICAvLyBza2lwICc6JworCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gUmVhZCBzdHJpZGUgcGFyYW1ldGVyCisgICAgICAgICAgICAvLworICAgICAgICAgICAgc2lnbiA9ICsxOworICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgIFNLSVBfV1Moc2Nhbik7CisgICAgICAgICAgICAgICAgaWYgKCpzY2FuID09ICcrJykgeworICAgICAgICAgICAgICAgICAgICBzY2FuKys7IC8vIHNraXAgJysnCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKnNjYW4gPT0gJy0nKSB7CisgICAgICAgICAgICAgICAgICAgIHNpZ24gKj0gLTE7CisgICAgICAgICAgICAgICAgICAgIHNjYW4rKzsgLy8gc2tpcCAnLScKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU0tJUF9XUyhzY2FuKTsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQyKCgqc2NhbiA+PSAnMCcpICYmICgqc2NhbiA8PSAnOScpLAorICAgICAgICAgICAgICAiYmFkIGV4cGxpY2l0IHBsYWNlcyBsaXN0Iik7CisgICAgICAgICAgICBuZXh0ID0gc2NhbjsKKyAgICAgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICAgICAgc3RyaWRlID0gX19rbXBfc3RyX3RvX2ludChzY2FuLCAqbmV4dCk7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHN0cmlkZSA+PSAwKTsKKyAgICAgICAgICAgIHNjYW4gPSBuZXh0OworICAgICAgICAgICAgc3RyaWRlICo9IHNpZ247CisgICAgICAgIH0KKworICAgICAgICAvLyBBZGQgcGxhY2VzIGRldGVybWluZWQgYnkgaW5pdGlhbF9wbGFjZSA6IGNvdW50IDogc3RyaWRlCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoc2V0U2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBBZGQgdGhlIGN1cnJlbnQgcGxhY2UsIHRoZW4gYnVpbGQgdGhlIG5leHQgcGxhY2UgKHRlbXBNYXNrKSBmcm9tIHRoYXQKKyAgICAgICAgICAgIEtNUF9DUFVfQ09QWShwcmV2aW91c01hc2ssIHRlbXBNYXNrKTsKKyAgICAgICAgICAgIEFERF9NQVNLKHByZXZpb3VzTWFzayk7CisgICAgICAgICAgICBLTVBfQ1BVX1pFUk8odGVtcE1hc2spOworICAgICAgICAgICAgc2V0U2l6ZSA9IDA7CisgICAgICAgICAgICBLTVBfQ1BVX1NFVF9JVEVSQVRFKGosIHByZXZpb3VzTWFzaykgeworICAgICAgICAgICAgICAgIGlmICghIEtNUF9DUFVfSVNTRVQoaiwgcHJldmlvdXNNYXNrKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoKGorc3RyaWRlID4gbWF4T3NJZCkgfHwgKGorc3RyaWRlIDwgMCkgfHwKKyAgICAgICAgICAgICAgICAgICghIEtNUF9DUFVfSVNTRVQoaitzdHJpZGUsIEtNUF9DUFVfSU5ERVgob3NJZDJNYXNrLCBqK3N0cmlkZSkpKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgKF9fa21wX2FmZmluaXR5X3dhcm5pbmdzCisgICAgICAgICAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkpKSAmJiBpIDwgY291bnQgLSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfV0FSTklORyhBZmZJZ25vcmVJbnZhbGlkUHJvY0lELCBqK3N0cmlkZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9DUFVfU0VUKGorc3RyaWRlLCB0ZW1wTWFzayk7CisgICAgICAgICAgICAgICAgICAgIHNldFNpemUrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgS01QX0NQVV9aRVJPKHRlbXBNYXNrKTsKKyAgICAgICAgc2V0U2l6ZSA9IDA7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gdmFsaWQgZm9sbG93IHNldHMgYXJlICcsJyBhbmQgRU9MCisgICAgICAgIC8vCisgICAgICAgIFNLSVBfV1Moc2Nhbik7CisgICAgICAgIGlmICgqc2NhbiA9PSAnXDAnKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoKnNjYW4gPT0gJywnKSB7CisgICAgICAgICAgICBzY2FuKys7ICAgICAvLyBza2lwICcsJworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBLTVBfQVNTRVJUMigwLCAiYmFkIGV4cGxpY2l0IHBsYWNlcyBsaXN0Iik7CisgICAgfQorCisgICAgKm91dF9udW1NYXNrcyA9IG5leHROZXdNYXNrOworICAgIGlmIChuZXh0TmV3TWFzayA9PSAwKSB7CisgICAgICAgICpvdXRfbWFza3MgPSBOVUxMOworICAgICAgICBLTVBfQ1BVX0lOVEVSTkFMX0ZSRUVfQVJSQVkobmV3TWFza3MsIG51bU5ld01hc2tzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBLTVBfQ1BVX0FMTE9DX0FSUkFZKCgqb3V0X21hc2tzKSwgbmV4dE5ld01hc2spOworICAgIEtNUF9DUFVfRlJFRSh0ZW1wTWFzayk7CisgICAgS01QX0NQVV9GUkVFKHByZXZpb3VzTWFzayk7CisgICAgZm9yKGkgPSAwOyBpIDwgbmV4dE5ld01hc2s7IGkrKykgeworICAgICAgICBrbXBfYWZmaW5fbWFza190KiBzcmMgID0gS01QX0NQVV9JTkRFWChuZXdNYXNrcywgaSk7CisgICAgICAgIGttcF9hZmZpbl9tYXNrX3QqIGRlc3QgPSBLTVBfQ1BVX0lOREVYKCgqb3V0X21hc2tzKSwgaSk7CisgICAgICAgIEtNUF9DUFVfQ09QWShkZXN0LCBzcmMpOworICAgIH0KKyAgICBLTVBfQ1BVX0lOVEVSTkFMX0ZSRUVfQVJSQVkobmV3TWFza3MsIG51bU5ld01hc2tzKTsKK30KKworIyBlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisjdW5kZWYgQUREX01BU0sKKyN1bmRlZiBBRERfTUFTS19PU0lECisKK3N0YXRpYyB2b2lkCitfX2ttcF9hcHBseV90aHJlYWRfcGxhY2VzKEFkZHJVbnNQYWlyICoqcEFkZHIsIGludCBkZXB0aCkKK3sKKyAgICBpZiAoX19rbXBfcGxhY2VfbnVtX3NvY2tldHMgPT0gMCAmJgorICAgICAgICBfX2ttcF9wbGFjZV9udW1fY29yZXMgPT0gMCAmJgorICAgICAgICBfX2ttcF9wbGFjZV9udW1fdGhyZWFkc19wZXJfY29yZSA9PSAwICkKKyAgICAgICAgcmV0dXJuOyAgIC8vIG5vIHRvcG9sb2d5IGxpbWl0aW5nIGFjdGlvbnMgcmVxdWVzdGVkLCBleGl0CisgICAgaWYgKF9fa21wX3BsYWNlX251bV9zb2NrZXRzID09IDApCisgICAgICAgIF9fa21wX3BsYWNlX251bV9zb2NrZXRzID0gblBhY2thZ2VzOyAgICAvLyB1c2UgYWxsIGF2YWlsYWJsZSBzb2NrZXRzCisgICAgaWYgKF9fa21wX3BsYWNlX251bV9jb3JlcyA9PSAwKQorICAgICAgICBfX2ttcF9wbGFjZV9udW1fY29yZXMgPSBuQ29yZXNQZXJQa2c7ICAgLy8gdXNlIGFsbCBhdmFpbGFibGUgY29yZXMKKyAgICBpZiAoX19rbXBfcGxhY2VfbnVtX3RocmVhZHNfcGVyX2NvcmUgPT0gMCB8fAorICAgICAgICBfX2ttcF9wbGFjZV9udW1fdGhyZWFkc19wZXJfY29yZSA+IF9fa21wX25UaHJlYWRzUGVyQ29yZSkKKyAgICAgICAgX19rbXBfcGxhY2VfbnVtX3RocmVhZHNfcGVyX2NvcmUgPSBfX2ttcF9uVGhyZWFkc1BlckNvcmU7IC8vIHVzZSBhbGwgSFcgY29udGV4dHMKKworICAgIGlmICggIV9fa21wX2FmZmluaXR5X3VuaWZvcm1fdG9wb2xvZ3koKSApIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIEFmZlRoclBsYWNlTm9uVW5pZm9ybSApOworICAgICAgICByZXR1cm47IC8vIGRvbid0IHN1cHBvcnQgbm9uLXVuaWZvcm0gdG9wb2xvZ3kKKyAgICB9CisgICAgaWYgKCBkZXB0aCAhPSAzICkgeworICAgICAgICBLTVBfV0FSTklORyggQWZmVGhyUGxhY2VOb25UaHJlZUxldmVsICk7CisgICAgICAgIHJldHVybjsgLy8gZG9uJ3Qgc3VwcG9ydCBub3QtMy1sZXZlbCB0b3BvbG9neQorICAgIH0KKyAgICBpZiAoX19rbXBfcGxhY2Vfc29ja2V0X29mZnNldCArIF9fa21wX3BsYWNlX251bV9zb2NrZXRzID4gblBhY2thZ2VzKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKEFmZlRoclBsYWNlTWFueVNvY2tldHMpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICggX19rbXBfcGxhY2VfY29yZV9vZmZzZXQgKyBfX2ttcF9wbGFjZV9udW1fY29yZXMgPiBuQ29yZXNQZXJQa2cgKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZUaHJQbGFjZU1hbnlDb3JlcyApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQWRkclVuc1BhaXIgKm5ld0FkZHIgPSAoQWRkclVuc1BhaXIgKilfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKEFkZHJVbnNQYWlyKSAqCisgICAgICAgIF9fa21wX3BsYWNlX251bV9zb2NrZXRzICogX19rbXBfcGxhY2VfbnVtX2NvcmVzICogX19rbXBfcGxhY2VfbnVtX3RocmVhZHNfcGVyX2NvcmUpOworCisgICAgaW50IGksIGosIGssIG5fb2xkID0gMCwgbl9uZXcgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBuUGFja2FnZXM7ICsraSkKKyAgICAgICAgaWYgKGkgPCBfX2ttcF9wbGFjZV9zb2NrZXRfb2Zmc2V0IHx8CisgICAgICAgICAgICBpID49IF9fa21wX3BsYWNlX3NvY2tldF9vZmZzZXQgKyBfX2ttcF9wbGFjZV9udW1fc29ja2V0cykKKyAgICAgICAgICAgIG5fb2xkICs9IG5Db3Jlc1BlclBrZyAqIF9fa21wX25UaHJlYWRzUGVyQ29yZTsgLy8gc2tpcCBub3QtcmVxdWVzdGVkIHNvY2tldAorICAgICAgICBlbHNlCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbkNvcmVzUGVyUGtnOyArK2opIC8vIHdhbGsgdGhyb3VnaCByZXF1ZXN0ZWQgc29ja2V0CisgICAgICAgICAgICAgICAgaWYgKGogPCBfX2ttcF9wbGFjZV9jb3JlX29mZnNldCB8fAorICAgICAgICAgICAgICAgICAgICBqID49IF9fa21wX3BsYWNlX2NvcmVfb2Zmc2V0ICsgX19rbXBfcGxhY2VfbnVtX2NvcmVzKQorICAgICAgICAgICAgICAgICAgICBuX29sZCArPSBfX2ttcF9uVGhyZWFkc1BlckNvcmU7IC8vIHNraXAgbm90LXJlcXVlc3RlZCBjb3JlCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgX19rbXBfblRocmVhZHNQZXJDb3JlOyArK2spIHsgLy8gd2FsayB0aHJvdWdoIHJlcXVlc3RlZCBjb3JlCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoayA8IF9fa21wX3BsYWNlX251bV90aHJlYWRzX3Blcl9jb3JlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3QWRkcltuX25ld10gPSAoKnBBZGRyKVtuX29sZF07IC8vIGNvbGxlY3QgcmVxdWVzdGVkIHRocmVhZCdzIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuX25ldysrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbl9vbGQrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQobl9vbGQgPT0gblBhY2thZ2VzICogbkNvcmVzUGVyUGtnICogX19rbXBfblRocmVhZHNQZXJDb3JlKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKG5fbmV3ID09IF9fa21wX3BsYWNlX251bV9zb2NrZXRzICogX19rbXBfcGxhY2VfbnVtX2NvcmVzICoKKyAgICAgICAgICAgICAgICAgICAgIF9fa21wX3BsYWNlX251bV90aHJlYWRzX3Blcl9jb3JlKTsKKworICAgIG5QYWNrYWdlcyA9IF9fa21wX3BsYWNlX251bV9zb2NrZXRzOyAgICAgICAgICAgICAgICAgICAgICAvLyBjb3JyZWN0IG5QYWNrYWdlcworICAgIG5Db3Jlc1BlclBrZyA9IF9fa21wX3BsYWNlX251bV9jb3JlczsgICAgICAgICAgICAgICAgICAgICAvLyBjb3JyZWN0IG5Db3Jlc1BlclBrZworICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IF9fa21wX3BsYWNlX251bV90aHJlYWRzX3Blcl9jb3JlOyAvLyBjb3JyZWN0IF9fa21wX25UaHJlYWRzUGVyQ29yZQorICAgIF9fa21wX2F2YWlsX3Byb2MgPSBuX25ldzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3JyZWN0IGF2YWlsX3Byb2MKKyAgICBfX2ttcF9uY29yZXMgPSBuUGFja2FnZXMgKiBfX2ttcF9wbGFjZV9udW1fY29yZXM7ICAgICAgICAgLy8gY29ycmVjdCBuY29yZXMKKworICAgIF9fa21wX2ZyZWUoICpwQWRkciApOworICAgICpwQWRkciA9IG5ld0FkZHI7ICAgICAgLy8gcmVwbGFjZSBvbGQgdG9wb2xvZ3kgd2l0aCBuZXcgb25lCit9CisKKworc3RhdGljIEFkZHJVbnNQYWlyICphZGRyZXNzMm9zID0gTlVMTDsKK3N0YXRpYyBpbnQgICAgICAgICAgICogcHJvY2FyciA9IE5VTEw7CitzdGF0aWMgaW50ICAgICBfX2ttcF9hZmZfZGVwdGggPSAwOworCitzdGF0aWMgdm9pZAorX19rbXBfYXV4X2FmZmluaXR5X2luaXRpYWxpemUodm9pZCkKK3sKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfbWFza3MgIT0gTlVMTCkgeworICAgICAgICBLTVBfQVNTRVJUKGZ1bGxNYXNrICE9IE5VTEwpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8KKyAgICAvLyBDcmVhdGUgdGhlICJmdWxsIiBtYXNrIC0gdGhpcyBkZWZpbmVzIGFsbCBvZiB0aGUgcHJvY2Vzc29ycyB0aGF0IHdlCisgICAgLy8gY29uc2lkZXIgdG8gYmUgaW4gdGhlIG1hY2hpbmUgbW9kZWwuICBJZiByZXNwZWN0IGlzIHNldCwgdGhlbiBpdCBpcworICAgIC8vIHRoZSBpbml0aWFsaXphdGlvbiB0aHJlYWQncyBhZmZpbml0eSBtYXNrLiAgT3RoZXJ3aXNlLCBpdCBpcyBhbGwKKyAgICAvLyBwcm9jZXNzb3JzIHRoYXQgd2Uga25vdyBhYm91dCBvbiB0aGUgbWFjaGluZS4KKyAgICAvLworICAgIGlmIChmdWxsTWFzayA9PSBOVUxMKSB7CisgICAgICAgIEtNUF9DUFVfQUxMT0MoZnVsbE1hc2spOworICAgIH0KKyAgICBpZiAoS01QX0FGRklOSVRZX0NBUEFCTEUoKSkgeworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrKSB7CisgICAgICAgICAgICBfX2ttcF9nZXRfc3lzdGVtX2FmZmluaXR5KGZ1bGxNYXNrLCBUUlVFKTsKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIENvdW50IHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIHByb2Nlc3NvcnMuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgdW5zaWduZWQgaTsKKyAgICAgICAgICAgIF9fa21wX2F2YWlsX3Byb2MgPSAwOworICAgICAgICAgICAgS01QX0NQVV9TRVRfSVRFUkFURShpLCBmdWxsTWFzaykgeworICAgICAgICAgICAgICAgIGlmICghIEtNUF9DUFVfSVNTRVQoaSwgZnVsbE1hc2spKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfX2ttcF9hdmFpbF9wcm9jKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoX19rbXBfYXZhaWxfcHJvYyA+IF9fa21wX3hwcm9jKSB7CisgICAgICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgKF9fa21wX2FmZmluaXR5X3dhcm5pbmdzCisgICAgICAgICAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9ub25lKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoRXJyb3JJbml0aWFsaXplQWZmaW5pdHkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfbm9uZTsKKyAgICAgICAgICAgICAgICBLTVBfQUZGSU5JVFlfRElTQUJMRSgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2VudGlyZV9tYWNoaW5lX21hc2soZnVsbE1hc2spOworICAgICAgICAgICAgX19rbXBfYXZhaWxfcHJvYyA9IF9fa21wX3hwcm9jOworICAgICAgICB9CisgICAgfQorCisgICAgaW50IGRlcHRoID0gLTE7CisgICAga21wX2kxOG5faWRfdCBtc2dfaWQgPSBrbXBfaTE4bl9udWxsOworCisgICAgLy8KKyAgICAvLyBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgc2V0dGluZyBLTVBfQ1BVSU5GT19GSUxFID0+CisgICAgLy8gS01QX1RPUE9MT0dZX01FVEhPRD1jcHVpbmZvCisgICAgLy8KKyAgICBpZiAoKF9fa21wX2NwdWluZm9fZmlsZSAhPSBOVUxMKSAmJgorICAgICAgKF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPT0gYWZmaW5pdHlfdG9wX21ldGhvZF9hbGwpKSB7CisgICAgICAgIF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPSBhZmZpbml0eV90b3BfbWV0aG9kX2NwdWluZm87CisgICAgfQorCisgICAgaWYgKF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPT0gYWZmaW5pdHlfdG9wX21ldGhvZF9hbGwpIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gSW4gdGhlIGRlZmF1bHQgY29kZSBwYXRoLCBlcnJvcnMgYXJlIG5vdCBmYXRhbCAtIHdlIGp1c3QgdHJ5IHVzaW5nCisgICAgICAgIC8vIGFub3RoZXIgbWV0aG9kLiAgV2Ugb25seSBlbWl0IGEgd2FybmluZyBtZXNzYWdlIGlmIGFmZmluaXR5IGlzIG9uLAorICAgICAgICAvLyBvciB0aGUgdmVyYm9zZSBmbGFnIGlzIHNldCwgYW4gdGhlIG5vd2FybmluZ3MgZmxhZyB3YXMgbm90IHNldC4KKyAgICAgICAgLy8KKyAgICAgICAgY29uc3QgY2hhciAqZmlsZV9uYW1lID0gTlVMTDsKKyAgICAgICAgaW50IGxpbmUgPSAwOworIyBpZiBLTVBfVVNFX0hXTE9DCisgICAgICAgIGlmIChkZXB0aCA8IDApIHsKKyAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICAgICAgS01QX0lORk9STShBZmZVc2luZ0h3bG9jLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZighX19rbXBfaHdsb2NfZXJyb3IpIHsKKyAgICAgICAgICAgICAgICBkZXB0aCA9IF9fa21wX2FmZmluaXR5X2NyZWF0ZV9od2xvY19tYXAoJmFkZHJlc3Myb3MsICZtc2dfaWQpOworICAgICAgICAgICAgICAgIGlmIChkZXB0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKTsKKyAgICAgICAgICAgICAgICAgICAgS01QX0FTU0VSVChhZGRyZXNzMm9zID09IE5VTEwpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmKGRlcHRoIDwgMCAmJiBfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmSWdub3JpbmdId2xvYywgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZihfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICAgICAgS01QX0lORk9STShBZmZJZ25vcmluZ0h3bG9jLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyMgZW5kaWYKKworIyBpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisKKyAgICAgICAgaWYgKGRlcHRoIDwgMCkgeworICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZkluZm9TdHIsICJLTVBfQUZGSU5JVFkiLCBLTVBfSTE4Tl9TVFIoRGVjb2Rpbmd4MkFQSUMpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmlsZV9uYW1lID0gTlVMTDsKKyAgICAgICAgICAgIGRlcHRoID0gX19rbXBfYWZmaW5pdHlfY3JlYXRlX3gyYXBpY2lkX21hcCgmYWRkcmVzczJvcywgJm1zZ19pZCk7CisgICAgICAgICAgICBpZiAoZGVwdGggPT0gMCkgeworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKTsKKyAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKGFkZHJlc3Myb3MgPT0gTlVMTCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZGVwdGggPCAwKSB7CisgICAgICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1zZ19pZCAhPSBrbXBfaTE4bl9udWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZkluZm9TdHJTdHIsICJLTVBfQUZGSU5JVFkiLCBfX2ttcF9pMThuX2NhdGdldHMobXNnX2lkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0kxOE5fU1RSKERlY29kaW5nTGVnYWN5QVBJQykpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgS01QX0lORk9STShBZmZJbmZvU3RyLCAiS01QX0FGRklOSVRZIiwgS01QX0kxOE5fU1RSKERlY29kaW5nTGVnYWN5QVBJQykpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZmlsZV9uYW1lID0gTlVMTDsKKyAgICAgICAgICAgICAgICBkZXB0aCA9IF9fa21wX2FmZmluaXR5X2NyZWF0ZV9hcGljaWRfbWFwKCZhZGRyZXNzMm9zLCAmbXNnX2lkKTsKKyAgICAgICAgICAgICAgICBpZiAoZGVwdGggPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSk7CisgICAgICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoYWRkcmVzczJvcyA9PSBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisjIGVuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworIyBpZiBLTVBfT1NfTElOVVgKKworICAgICAgICBpZiAoZGVwdGggPCAwKSB7CisgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgICAgIGlmIChtc2dfaWQgIT0ga21wX2kxOG5fbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZlN0clBhcnNlRmlsZW5hbWUsICJLTVBfQUZGSU5JVFkiLCBfX2ttcF9pMThuX2NhdGdldHMobXNnX2lkKSwgIi9wcm9jL2NwdWluZm8iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmUGFyc2VGaWxlbmFtZSwgIktNUF9BRkZJTklUWSIsICIvcHJvYy9jcHVpbmZvIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBGSUxFICpmID0gZm9wZW4oIi9wcm9jL2NwdWluZm8iLCAiciIpOworICAgICAgICAgICAgaWYgKGYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1zZ19pZCA9IGttcF9pMThuX3N0cl9DYW50T3BlbkNwdWluZm87CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBmaWxlX25hbWUgPSAiL3Byb2MvY3B1aW5mbyI7CisgICAgICAgICAgICAgICAgZGVwdGggPSBfX2ttcF9hZmZpbml0eV9jcmVhdGVfY3B1aW5mb19tYXAoJmFkZHJlc3Myb3MsICZsaW5lLCAmbXNnX2lkLCBmKTsKKyAgICAgICAgICAgICAgICBmY2xvc2UoZik7CisgICAgICAgICAgICAgICAgaWYgKGRlcHRoID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0FTU0VSVChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpOworICAgICAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKGFkZHJlc3Myb3MgPT0gTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworIyBlbmRpZiAvKiBLTVBfT1NfTElOVVggKi8KKworIyBpZiBLTVBfR1JPVVBfQUZGSU5JVFkKKworICAgICAgICBpZiAoKGRlcHRoIDwgMCkgJiYgKF9fa21wX251bV9wcm9jX2dyb3VwcyA+IDEpKSB7CisgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmV2luZG93c1Byb2NHcm91cE1hcCwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZXB0aCA9IF9fa21wX2FmZmluaXR5X2NyZWF0ZV9wcm9jX2dyb3VwX21hcCgmYWRkcmVzczJvcywgJm1zZ19pZCk7CisgICAgICAgICAgICBLTVBfQVNTRVJUKGRlcHRoICE9IDApOworICAgICAgICB9CisKKyMgZW5kaWYgLyogS01QX0dST1VQX0FGRklOSVRZICovCisKKyAgICAgICAgaWYgKGRlcHRoIDwgMCkgeworICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgJiYgKG1zZ19pZCAhPSBrbXBfaTE4bl9udWxsKSkgeworICAgICAgICAgICAgICAgIGlmIChmaWxlX25hbWUgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKFVzaW5nRmxhdE9TLCBfX2ttcF9pMThuX2NhdGdldHMobXNnX2lkKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxpbmUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKFVzaW5nRmxhdE9TRmlsZSwgZmlsZV9uYW1lLCBfX2ttcF9pMThuX2NhdGdldHMobXNnX2lkKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKFVzaW5nRmxhdE9TRmlsZUxpbmUsIGZpbGVfbmFtZSwgbGluZSwgX19rbXBfaTE4bl9jYXRnZXRzKG1zZ19pZCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEZJWE1FIC0gcHJpbnQgbXNnIGlmIG1zZ19pZCA9IGttcF9pMThuX251bGwgPz8/CisKKyAgICAgICAgICAgIGZpbGVfbmFtZSA9ICIiOworICAgICAgICAgICAgZGVwdGggPSBfX2ttcF9hZmZpbml0eV9jcmVhdGVfZmxhdF9tYXAoJmFkZHJlc3Myb3MsICZtc2dfaWQpOworICAgICAgICAgICAgaWYgKGRlcHRoID09IDApIHsKKyAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSk7CisgICAgICAgICAgICAgICAgS01QX0FTU0VSVChhZGRyZXNzMm9zID09IE5VTEwpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEtNUF9BU1NFUlQoZGVwdGggPiAwKTsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoYWRkcmVzczJvcyAhPSBOVUxMKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vCisgICAgLy8gSWYgdGhlIHVzZXIgaGFzIHNwZWNpZmllZCB0aGF0IGEgcGFyaWN1bGFyIHRvcG9sb2d5IGRpc2NvdmVyeSBtZXRob2QKKyAgICAvLyBpcyB0byBiZSB1c2VkLCB0aGVuIHdlIGFib3J0IGlmIHRoYXQgbWV0aG9kIGZhaWxzLiAgVGhlIGV4Y2VwdGlvbiBpcworICAgIC8vIGdyb3VwIGFmZmluaXR5LCB3aGljaCBtaWdodCBoYXZlIGJlZW4gaW1wbGljaXRseSBzZXQuCisgICAgLy8KKworIyBpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisKKyAgICBlbHNlIGlmIChfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID09IGFmZmluaXR5X3RvcF9tZXRob2RfeDJhcGljaWQpIHsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmSW5mb1N0ciwgIktNUF9BRkZJTklUWSIsCisgICAgICAgICAgICAgIEtNUF9JMThOX1NUUihEZWNvZGluZ3gyQVBJQykpOworICAgICAgICB9CisKKyAgICAgICAgZGVwdGggPSBfX2ttcF9hZmZpbml0eV9jcmVhdGVfeDJhcGljaWRfbWFwKCZhZGRyZXNzMm9zLCAmbXNnX2lkKTsKKyAgICAgICAgaWYgKGRlcHRoID09IDApIHsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKTsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoYWRkcmVzczJvcyA9PSBOVUxMKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVwdGggPCAwKSB7CisgICAgICAgICAgICBLTVBfQVNTRVJUKG1zZ19pZCAhPSBrbXBfaTE4bl9udWxsKTsKKyAgICAgICAgICAgIEtNUF9GQVRBTChNc2dFeGl0aW5nLCBfX2ttcF9pMThuX2NhdGdldHMobXNnX2lkKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9PSBhZmZpbml0eV90b3BfbWV0aG9kX2FwaWNpZCkgeworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgS01QX0lORk9STShBZmZJbmZvU3RyLCAiS01QX0FGRklOSVRZIiwKKyAgICAgICAgICAgICAgS01QX0kxOE5fU1RSKERlY29kaW5nTGVnYWN5QVBJQykpOworICAgICAgICB9CisKKyAgICAgICAgZGVwdGggPSBfX2ttcF9hZmZpbml0eV9jcmVhdGVfYXBpY2lkX21hcCgmYWRkcmVzczJvcywgJm1zZ19pZCk7CisgICAgICAgIGlmIChkZXB0aCA9PSAwKSB7CisgICAgICAgICAgICBLTVBfQVNTRVJUKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSk7CisgICAgICAgICAgICBLTVBfQVNTRVJUKGFkZHJlc3Myb3MgPT0gTlVMTCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlcHRoIDwgMCkgeworICAgICAgICAgICAgS01QX0FTU0VSVChtc2dfaWQgIT0ga21wX2kxOG5fbnVsbCk7CisgICAgICAgICAgICBLTVBfRkFUQUwoTXNnRXhpdGluZywgX19rbXBfaTE4bl9jYXRnZXRzKG1zZ19pZCkpOworICAgICAgICB9CisgICAgfQorCisjIGVuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworICAgIGVsc2UgaWYgKF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPT0gYWZmaW5pdHlfdG9wX21ldGhvZF9jcHVpbmZvKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOworICAgICAgICBpZiAoX19rbXBfY3B1aW5mb19maWxlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGZpbGVuYW1lID0gX19rbXBfY3B1aW5mb19maWxlOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZmlsZW5hbWUgPSAiL3Byb2MvY3B1aW5mbyI7CisgICAgICAgIH0KKworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgS01QX0lORk9STShBZmZQYXJzZUZpbGVuYW1lLCAiS01QX0FGRklOSVRZIiwgZmlsZW5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgRklMRSAqZiA9IGZvcGVuKGZpbGVuYW1lLCAiciIpOworICAgICAgICBpZiAoZiA9PSBOVUxMKSB7CisgICAgICAgICAgICBpbnQgY29kZSA9IGVycm5vOworICAgICAgICAgICAgaWYgKF9fa21wX2NwdWluZm9fZmlsZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coQ2FudE9wZW5GaWxlRm9yUmVhZGluZywgZmlsZW5hbWUpLAorICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKGNvZGUpLAorICAgICAgICAgICAgICAgICAgICBLTVBfSE5UKE5hbWVDb21lc0Zyb21fQ1BVSU5GT19GSUxFKSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coQ2FudE9wZW5GaWxlRm9yUmVhZGluZywgZmlsZW5hbWUpLAorICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKGNvZGUpLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50IGxpbmUgPSAwOworICAgICAgICBkZXB0aCA9IF9fa21wX2FmZmluaXR5X2NyZWF0ZV9jcHVpbmZvX21hcCgmYWRkcmVzczJvcywgJmxpbmUsICZtc2dfaWQsIGYpOworICAgICAgICBmY2xvc2UoZik7CisgICAgICAgIGlmIChkZXB0aCA8IDApIHsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQobXNnX2lkICE9IGttcF9pMThuX251bGwpOworICAgICAgICAgICAgaWYgKGxpbmUgPiAwKSB7CisgICAgICAgICAgICAgICAgS01QX0ZBVEFMKEZpbGVMaW5lTXNnRXhpdGluZywgZmlsZW5hbWUsIGxpbmUsIF9fa21wX2kxOG5fY2F0Z2V0cyhtc2dfaWQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEtNUF9GQVRBTChGaWxlTXNnRXhpdGluZywgZmlsZW5hbWUsIF9fa21wX2kxOG5fY2F0Z2V0cyhtc2dfaWQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKSB7CisgICAgICAgICAgICBLTVBfQVNTRVJUKGRlcHRoID09IDApOworICAgICAgICAgICAgS01QX0FTU0VSVChhZGRyZXNzMm9zID09IE5VTEwpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisjIGlmIEtNUF9HUk9VUF9BRkZJTklUWQorCisgICAgZWxzZSBpZiAoX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9PSBhZmZpbml0eV90b3BfbWV0aG9kX2dyb3VwKSB7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZldpbmRvd3NQcm9jR3JvdXBNYXAsICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgfQorCisgICAgICAgIGRlcHRoID0gX19rbXBfYWZmaW5pdHlfY3JlYXRlX3Byb2NfZ3JvdXBfbWFwKCZhZGRyZXNzMm9zLCAmbXNnX2lkKTsKKyAgICAgICAgS01QX0FTU0VSVChkZXB0aCAhPSAwKTsKKyAgICAgICAgaWYgKGRlcHRoIDwgMCkgeworICAgICAgICAgICAgS01QX0FTU0VSVChtc2dfaWQgIT0ga21wX2kxOG5fbnVsbCk7CisgICAgICAgICAgICBLTVBfRkFUQUwoTXNnRXhpdGluZywgX19rbXBfaTE4bl9jYXRnZXRzKG1zZ19pZCkpOworICAgICAgICB9CisgICAgfQorCisjIGVuZGlmIC8qIEtNUF9HUk9VUF9BRkZJTklUWSAqLworCisgICAgZWxzZSBpZiAoX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9PSBhZmZpbml0eV90b3BfbWV0aG9kX2ZsYXQpIHsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmVXNpbmdGbGF0T1MsICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgfQorCisgICAgICAgIGRlcHRoID0gX19rbXBfYWZmaW5pdHlfY3JlYXRlX2ZsYXRfbWFwKCZhZGRyZXNzMm9zLCAmbXNnX2lkKTsKKyAgICAgICAgaWYgKGRlcHRoID09IDApIHsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKTsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoYWRkcmVzczJvcyA9PSBOVUxMKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBzaG91bGQgbm90IGZhaWwKKyAgICAgICAgS01QX0FTU0VSVChkZXB0aCA+IDApOworICAgICAgICBLTVBfQVNTRVJUKGFkZHJlc3Myb3MgIT0gTlVMTCk7CisgICAgfQorCisjIGlmIEtNUF9VU0VfSFdMT0MKKyAgICBlbHNlIGlmIChfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID09IGFmZmluaXR5X3RvcF9tZXRob2RfaHdsb2MpIHsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmVXNpbmdId2xvYywgIktNUF9BRkZJTklUWSIpOworICAgICAgICB9CisgICAgICAgIGRlcHRoID0gX19rbXBfYWZmaW5pdHlfY3JlYXRlX2h3bG9jX21hcCgmYWRkcmVzczJvcywgJm1zZ19pZCk7CisgICAgICAgIGlmIChkZXB0aCA9PSAwKSB7CisgICAgICAgICAgICBLTVBfQVNTRVJUKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSk7CisgICAgICAgICAgICBLTVBfQVNTRVJUKGFkZHJlc3Myb3MgPT0gTlVMTCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyMgIGlmIEtNUF9ERUJVRworICAgICAgICBBZGRyVW5zUGFpciAqb3RoZXJhZGRyZXNzMm9zID0gTlVMTDsKKyAgICAgICAgaW50IG90aGVyZGVwdGggPSAtMTsKKyMgICBpZiBLTVBfTUlDCisgICAgICAgIG90aGVyZGVwdGggPSBfX2ttcF9hZmZpbml0eV9jcmVhdGVfYXBpY2lkX21hcCgmb3RoZXJhZGRyZXNzMm9zLCAmbXNnX2lkKTsKKyMgICBlbHNlCisgICAgICAgIG90aGVyZGVwdGggPSBfX2ttcF9hZmZpbml0eV9jcmVhdGVfeDJhcGljaWRfbWFwKCZvdGhlcmFkZHJlc3Myb3MsICZtc2dfaWQpOworIyAgIGVuZGlmCisgICAgICAgIGlmKG90aGVyYWRkcmVzczJvcyAhPSBOVUxMICYmIGFkZHJlc3Myb3MgIT0gTlVMTCkgeworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICB1bnNpZ25lZCBhcmVudF9lcXVhbF9mbGFnID0gMDsKKyAgICAgICAgICAgIGZvcihpPTA7aTxfX2ttcF9hdmFpbF9wcm9jO2krKykgeworICAgICAgICAgICAgICAgIGlmKG90aGVyYWRkcmVzczJvc1tpXSAhPSBhZGRyZXNzMm9zW2ldKSBhcmVudF9lcXVhbF9mbGFnID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKGFyZW50X2VxdWFsX2ZsYWcpIHsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9hdXhfYWZmaW5pdHlfaW5pdGlhbGl6ZTogSHdsb2MgYWZmaW5pdHkgcGxhY2VzIGFyZSBkaWZmZXJlbnQgZnJvbSBBUElDSURcbiIpKTsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9hdXhfYWZmaW5pdHlfaW5pdGlhbGl6ZTogQVBJQ0lEIFRhYmxlOlxuIikpOworICAgICAgICAgICAgICAgIGZvcihpPTA7aTxfX2ttcF9hdmFpbF9wcm9jO2krKykgeworICAgICAgICAgICAgICAgICAgICBvdGhlcmFkZHJlc3Myb3NbaV0ucHJpbnQoKTsgX19rbXBfcHJpbnRmKCJcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9hdXhfYWZmaW5pdHlfaW5pdGlhbGl6ZTogSHdsb2MgVGFibGU6XG4iKSk7CisgICAgICAgICAgICAgICAgZm9yKGk9MDtpPF9fa21wX2F2YWlsX3Byb2M7aSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Myb3NbaV0ucHJpbnQoKTsgX19rbXBfcHJpbnRmKCJcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX2F1eF9hZmZpbml0eV9pbml0aWFsaXplOiBId2xvYyBhZmZpbml0eSBwbGFjZXMgYXJlIHNhbWUgYXMgQVBJQ0lEXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyMgIGVuZGlmIC8vIEtNUF9ERUJVRworICAgIH0KKyMgZW5kaWYgLy8gS01QX1VTRV9IV0xPQworCisgICAgaWYgKGFkZHJlc3Myb3MgPT0gTlVMTCkgeworICAgICAgICBpZiAoS01QX0FGRklOSVRZX0NBUEFCTEUoKQorICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IChfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpKSkpIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKEVycm9ySW5pdGlhbGl6ZUFmZmluaXR5KTsKKyAgICAgICAgfQorICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfbm9uZTsKKyAgICAgICAgS01QX0FGRklOSVRZX0RJU0FCTEUoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIF9fa21wX2FwcGx5X3RocmVhZF9wbGFjZXMoJmFkZHJlc3Myb3MsIGRlcHRoKTsKKworICAgIC8vCisgICAgLy8gQ3JlYXRlIHRoZSB0YWJsZSBvZiBtYXNrcywgaW5kZXhlZCBieSB0aHJlYWQgSWQuCisgICAgLy8KKyAgICB1bnNpZ25lZCBtYXhJbmRleDsKKyAgICB1bnNpZ25lZCBudW1VbmlxdWU7CisgICAga21wX2FmZmluX21hc2tfdCAqb3NJZDJNYXNrID0gX19rbXBfY3JlYXRlX21hc2tzKCZtYXhJbmRleCwgJm51bVVuaXF1ZSwKKyAgICAgIGFkZHJlc3Myb3MsIF9fa21wX2F2YWlsX3Byb2MpOworICAgIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA9PSAwKSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoKGludCludW1VbmlxdWUgPT0gX19rbXBfYXZhaWxfcHJvYyk7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBTZXQgdGhlIGNoaWxkTnVtcyB2ZWN0b3IgaW4gYWxsIEFkZHJlc3Mgb2JqZWN0cy4gIFRoaXMgbXVzdCBiZSBkb25lCisgICAgLy8gYmVmb3JlIHdlIGNhbiBzb3J0IHVzaW5nIF9fa21wX2FmZmluaXR5X2NtcF9BZGRyZXNzX2NoaWxkX251bSgpLAorICAgIC8vIHdoaWNoIHRha2VzIGludG8gYWNjb3VudCB0aGUgc2V0dGluZyBvZiBfX2ttcF9hZmZpbml0eV9jb21wYWN0LgorICAgIC8vCisgICAgX19rbXBfYWZmaW5pdHlfYXNzaWduX2NoaWxkX251bXMoYWRkcmVzczJvcywgX19rbXBfYXZhaWxfcHJvYyk7CisKKyAgICBzd2l0Y2ggKF9fa21wX2FmZmluaXR5X3R5cGUpIHsKKworICAgICAgICBjYXNlIGFmZmluaXR5X2V4cGxpY2l0OgorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2FmZmluaXR5X3Byb2NsaXN0ICE9IE5VTEwpOworIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICBpZiAoX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID09IHByb2NfYmluZF9pbnRlbCkKKyMgZW5kaWYKKyAgICAgICAgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJvY2Vzc19wcm9jbGlzdCgmX19rbXBfYWZmaW5pdHlfbWFza3MsCisgICAgICAgICAgICAgICZfX2ttcF9hZmZpbml0eV9udW1fbWFza3MsIF9fa21wX2FmZmluaXR5X3Byb2NsaXN0LCBvc0lkMk1hc2ssCisgICAgICAgICAgICAgIG1heEluZGV4KTsKKyAgICAgICAgfQorIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3Byb2Nlc3NfcGxhY2VsaXN0KCZfX2ttcF9hZmZpbml0eV9tYXNrcywKKyAgICAgICAgICAgICAgJl9fa21wX2FmZmluaXR5X251bV9tYXNrcywgX19rbXBfYWZmaW5pdHlfcHJvY2xpc3QsIG9zSWQyTWFzaywKKyAgICAgICAgICAgICAgbWF4SW5kZXgpOworICAgICAgICB9CisjIGVuZGlmCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgPT0gMCkgeworICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgKF9fa21wX2FmZmluaXR5X3dhcm5pbmdzCisgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpKSkgeworICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKEFmZk5vVmFsaWRQcm9jSUQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X25vbmU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlIG90aGVyIGFmZmluaXR5IHR5cGVzIHJlbHkgb24gc29ydGluZyB0aGUgQWRkcmVzc2VzIGFjY29yZGluZworICAgICAgICAvLyB0byBzb21lIHBlcm11dGF0aW9uIG9mIHRoZSBtYWNoaW5lIHRvcG9sb2d5IHRyZWUuICBTZXQKKyAgICAgICAgLy8gX19rbXBfYWZmaW5pdHlfY29tcGFjdCBhbmQgX19rbXBfYWZmaW5pdHlfb2Zmc2V0IGFwcHJvcHJpYXRlbHksCisgICAgICAgIC8vIHRoZW4ganVtcCB0byBhIGNvbW1vbiBjb2RlIGZyYWdtZW50IHRvIGRvIHRoZSBzb3J0IGFuZCBjcmVhdGUKKyAgICAgICAgLy8gdGhlIGFycmF5IG9mIGFmZmluaXR5IG1hc2tzLgorICAgICAgICAvLworCisgICAgICAgIGNhc2UgYWZmaW5pdHlfbG9naWNhbDoKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfY29tcGFjdCA9IDA7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9vZmZzZXQpIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X29mZnNldCA9IF9fa21wX25UaHJlYWRzUGVyQ29yZSAqIF9fa21wX2FmZmluaXR5X29mZnNldAorICAgICAgICAgICAgICAlIF9fa21wX2F2YWlsX3Byb2M7CisgICAgICAgIH0KKyAgICAgICAgZ290byBzb3J0QWRkcmVzc2VzOworCisgICAgICAgIGNhc2UgYWZmaW5pdHlfcGh5c2ljYWw6CisgICAgICAgIGlmIChfX2ttcF9uVGhyZWFkc1BlckNvcmUgPiAxKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9jb21wYWN0ID0gMTsKKyAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9jb21wYWN0ID49IGRlcHRoKSB7CisgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfY29tcGFjdCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9jb21wYWN0ID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfb2Zmc2V0KSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9vZmZzZXQgPSBfX2ttcF9uVGhyZWFkc1BlckNvcmUgKiBfX2ttcF9hZmZpbml0eV9vZmZzZXQKKyAgICAgICAgICAgICAgJSBfX2ttcF9hdmFpbF9wcm9jOworICAgICAgICB9CisgICAgICAgIGdvdG8gc29ydEFkZHJlc3NlczsKKworICAgICAgICBjYXNlIGFmZmluaXR5X3NjYXR0ZXI6CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9jb21wYWN0ID49IGRlcHRoKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9jb21wYWN0ID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2NvbXBhY3QgPSBkZXB0aCAtIDEgLSBfX2ttcF9hZmZpbml0eV9jb21wYWN0OworICAgICAgICB9CisgICAgICAgIGdvdG8gc29ydEFkZHJlc3NlczsKKworICAgICAgICBjYXNlIGFmZmluaXR5X2NvbXBhY3Q6CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9jb21wYWN0ID49IGRlcHRoKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9jb21wYWN0ID0gZGVwdGggLSAxOworICAgICAgICB9CisgICAgICAgIGdvdG8gc29ydEFkZHJlc3NlczsKKworICAgICAgICBjYXNlIGFmZmluaXR5X2JhbGFuY2VkOgorICAgICAgICAvLyBCYWxhbmNlZCB3b3JrcyBvbmx5IGZvciB0aGUgY2FzZSBvZiBhIHNpbmdsZSBwYWNrYWdlCisgICAgICAgIGlmKCBuUGFja2FnZXMgPiAxICkgeworICAgICAgICAgICAgaWYoIF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgX19rbXBfYWZmaW5pdHlfd2FybmluZ3MgKSB7CisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZkJhbGFuY2VkTm90QXZhaWwsICJLTVBfQUZGSU5JVFkiICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfbm9uZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmKCBfX2ttcF9hZmZpbml0eV91bmlmb3JtX3RvcG9sb2d5KCkgKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsgLy8gTm9uLXVuaWZvcm0gdG9wb2xvZ3kKKworICAgICAgICAgICAgLy8gU2F2ZSB0aGUgZGVwdGggZm9yIGZ1cnRoZXIgdXNhZ2UKKyAgICAgICAgICAgIF9fa21wX2FmZl9kZXB0aCA9IGRlcHRoOworCisgICAgICAgICAgICAvLyBOdW1iZXIgb2YgaHlwZXIgdGhyZWFkcyBwZXIgY29yZSBpbiBIVCBtYWNoaW5lCisgICAgICAgICAgICBpbnQgbnRoX3Blcl9jb3JlID0gX19rbXBfblRocmVhZHNQZXJDb3JlOworCisgICAgICAgICAgICBpbnQgY29yZV9sZXZlbDsKKyAgICAgICAgICAgIGlmKCBudGhfcGVyX2NvcmUgPiAxICkgeworICAgICAgICAgICAgICAgIGNvcmVfbGV2ZWwgPSBkZXB0aCAtIDI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvcmVfbGV2ZWwgPSBkZXB0aCAtIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgbmNvcmVzID0gYWRkcmVzczJvc1sgX19rbXBfYXZhaWxfcHJvYyAtIDEgXS5maXJzdC5sYWJlbHNbIGNvcmVfbGV2ZWwgXSArIDE7CisgICAgICAgICAgICBpbnQgbnByb2MgPSBudGhfcGVyX2NvcmUgKiBuY29yZXM7CisKKyAgICAgICAgICAgIHByb2NhcnIgPSAoIGludCAqIClfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKCBpbnQgKSAqIG5wcm9jICk7CisgICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IG5wcm9jOyBpKysgKSB7CisgICAgICAgICAgICAgICAgcHJvY2FyclsgaSBdID0gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgX19rbXBfYXZhaWxfcHJvYzsgaSsrICkgeworICAgICAgICAgICAgICAgIGludCBwcm9jID0gYWRkcmVzczJvc1sgaSBdLnNlY29uZDsKKyAgICAgICAgICAgICAgICAvLyBJZiBkZXB0aCA9PSAzIHRoZW4gbGV2ZWw9MCAtIHBhY2thZ2UsIGxldmVsPTEgLSBjb3JlLCBsZXZlbD0yIC0gdGhyZWFkLgorICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIG9ubHkgb25lIHRocmVhZCBwZXIgY29yZSB0aGVuIGRlcHRoID09IDI6IGxldmVsIDAgLSBwYWNrYWdlLAorICAgICAgICAgICAgICAgIC8vIGxldmVsIDEgLSBjb3JlLgorICAgICAgICAgICAgICAgIGludCBsZXZlbCA9IGRlcHRoIC0gMTsKKworICAgICAgICAgICAgICAgIC8vIF9fa21wX250aF9wZXJfY29yZSA9PSAxCisgICAgICAgICAgICAgICAgaW50IHRocmVhZCA9IDA7CisgICAgICAgICAgICAgICAgaW50IGNvcmUgPSBhZGRyZXNzMm9zWyBpIF0uZmlyc3QubGFiZWxzWyBsZXZlbCBdOworICAgICAgICAgICAgICAgIC8vIElmIHRoZSB0aHJlYWQgbGV2ZWwgZXhpc3RzLCB0aGF0IGlzIHdlIGhhdmUgbW9yZSB0aGFuIG9uZSB0aHJlYWQgY29udGV4dCBwZXIgY29yZQorICAgICAgICAgICAgICAgIGlmKCBudGhfcGVyX2NvcmUgPiAxICkgeworICAgICAgICAgICAgICAgICAgICB0aHJlYWQgPSBhZGRyZXNzMm9zWyBpIF0uZmlyc3QubGFiZWxzWyBsZXZlbCBdICUgbnRoX3Blcl9jb3JlOworICAgICAgICAgICAgICAgICAgICBjb3JlID0gYWRkcmVzczJvc1sgaSBdLmZpcnN0LmxhYmVsc1sgbGV2ZWwgLSAxIF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByb2NhcnJbIGNvcmUgKiBudGhfcGVyX2NvcmUgKyB0aHJlYWQgXSA9IHByb2M7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc29ydEFkZHJlc3NlczoKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQWxsb2NhdGUgdGhlIGd0aWQtPmFmZmluaXR5IG1hc2sgdGFibGUuCisgICAgICAgIC8vCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9kdXBzKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgPSBfX2ttcF9hdmFpbF9wcm9jOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzID0gbnVtVW5pcXVlOworICAgICAgICB9CisKKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgaWYgKCAoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSAhPSBwcm9jX2JpbmRfaW50ZWwgKQorICAgICAgICAgICYmICggX19rbXBfYWZmaW5pdHlfbnVtX3BsYWNlcyA+IDAgKQorICAgICAgICAgICYmICggKHVuc2lnbmVkKV9fa21wX2FmZmluaXR5X251bV9wbGFjZXMgPCBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgKSApIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X251bV9tYXNrcyA9IF9fa21wX2FmZmluaXR5X251bV9wbGFjZXM7CisgICAgICAgIH0KKyMgZW5kaWYKKworICAgICAgICBLTVBfQ1BVX0FMTE9DX0FSUkFZKF9fa21wX2FmZmluaXR5X21hc2tzLCBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MpOworCisgICAgICAgIC8vCisgICAgICAgIC8vIFNvcnQgdGhlIGFkZHJlc3Myb3MgdGFibGUgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IHNldHRpbmcgb2YKKyAgICAgICAgLy8gX19rbXBfYWZmaW5pdHlfY29tcGFjdCwgdGhlbiBmaWxsIG91dCBfX2ttcF9hZmZpbml0eV9tYXNrcy4KKyAgICAgICAgLy8KKyAgICAgICAgcXNvcnQoYWRkcmVzczJvcywgX19rbXBfYXZhaWxfcHJvYywgc2l6ZW9mKCphZGRyZXNzMm9zKSwKKyAgICAgICAgICBfX2ttcF9hZmZpbml0eV9jbXBfQWRkcmVzc19jaGlsZF9udW0pOworICAgICAgICB7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGo7CisgICAgICAgICAgICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IF9fa21wX2F2YWlsX3Byb2M7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICgoISBfX2ttcF9hZmZpbml0eV9kdXBzKSAmJiAoISBhZGRyZXNzMm9zW2ldLmZpcnN0LmxlYWRlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHVuc2lnbmVkIG9zSWQgPSBhZGRyZXNzMm9zW2ldLnNlY29uZDsKKyAgICAgICAgICAgICAgICBrbXBfYWZmaW5fbWFza190ICpzcmMgPSBLTVBfQ1BVX0lOREVYKG9zSWQyTWFzaywgb3NJZCk7CisgICAgICAgICAgICAgICAga21wX2FmZmluX21hc2tfdCAqZGVzdAorICAgICAgICAgICAgICAgICAgPSBLTVBfQ1BVX0lOREVYKF9fa21wX2FmZmluaXR5X21hc2tzLCBqKTsKKyAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKEtNUF9DUFVfSVNTRVQob3NJZCwgc3JjKSk7CisgICAgICAgICAgICAgICAgS01QX0NQVV9DT1BZKGRlc3QsIHNyYyk7CisgICAgICAgICAgICAgICAgaWYgKCsraiA+PSBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChqID09IF9fa21wX2FmZmluaXR5X251bV9tYXNrcyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgS01QX0FTU0VSVDIoMCwgIlVuZXhwZWN0ZWQgYWZmaW5pdHkgc2V0dGluZyIpOworICAgIH0KKworICAgIF9fa21wX2ZyZWUob3NJZDJNYXNrKTsKKyAgICBtYWNoaW5lX2hpZXJhcmNoeS5pbml0KGFkZHJlc3Myb3MsIF9fa21wX2F2YWlsX3Byb2MpOworfQorCisKK3ZvaWQKK19fa21wX2FmZmluaXR5X2luaXRpYWxpemUodm9pZCkKK3sKKyAgICAvLworICAgIC8vIE11Y2ggb2YgdGhlIGNvZGUgYWJvdmUgd2FzIHdyaXR0ZW4gYXNzdW1taW5nIHRoYXQgaWYgYSBtYWNoaW5lIHdhcyBub3QKKyAgICAvLyBhZmZpbml0eSBjYXBhYmxlLCB0aGVuIF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZS4gIFdlIG5vdworICAgIC8vIGV4cGxpY2l0bHkgcmVwcmVzZW50IHRoaXMgYXMgX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9kaXNhYmxlZC4KKyAgICAvLworICAgIC8vIFRoZXJlIGFyZSB0b28gbWFueSBjaGVja3MgZm9yIF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZQorICAgIC8vIGluIHRoaXMgY29kZS4gIEluc3RlYWQgb2YgdHJ5aW5nIHRvIGNoYW5nZSB0aGVtIGFsbCwgY2hlY2sgaWYKKyAgICAvLyBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X2Rpc2FibGVkLCBhbmQgaWYgc28sIHNsYW0gaXQgd2l0aAorICAgIC8vIGFmZmluaXR5X25vbmUsIGNhbGwgdGhlIHJlYWwgaW5pdGlhbGl6YXRpb24gcm91dGluZSwgdGhlbiByZXN0b3JlCisgICAgLy8gX19rbXBfYWZmaW5pdHlfdHlwZSB0byBhZmZpbml0eV9kaXNhYmxlZC4KKyAgICAvLworICAgIGludCBkaXNhYmxlZCA9IChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X2Rpc2FibGVkKTsKKyAgICBpZiAoISBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpKSB7CisgICAgICAgIEtNUF9BU1NFUlQoZGlzYWJsZWQpOworICAgIH0KKyAgICBpZiAoZGlzYWJsZWQpIHsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X25vbmU7CisgICAgfQorICAgIF9fa21wX2F1eF9hZmZpbml0eV9pbml0aWFsaXplKCk7CisgICAgaWYgKGRpc2FibGVkKSB7CisgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9kaXNhYmxlZDsKKyAgICB9Cit9CisKKwordm9pZAorX19rbXBfYWZmaW5pdHlfdW5pbml0aWFsaXplKHZvaWQpCit7CisgICAgaWYgKF9fa21wX2FmZmluaXR5X21hc2tzICE9IE5VTEwpIHsKKyAgICAgICAgS01QX0NQVV9GUkVFX0FSUkFZKF9fa21wX2FmZmluaXR5X21hc2tzLCBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MpOworICAgICAgICBfX2ttcF9hZmZpbml0eV9tYXNrcyA9IE5VTEw7CisgICAgfQorICAgIGlmIChmdWxsTWFzayAhPSBOVUxMKSB7CisgICAgICAgIEtNUF9DUFVfRlJFRShmdWxsTWFzayk7CisgICAgICAgIGZ1bGxNYXNrID0gTlVMTDsKKyAgICB9CisgICAgX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzID0gMDsKKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICBfX2ttcF9hZmZpbml0eV9udW1fcGxhY2VzID0gMDsKKyMgZW5kaWYKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfcHJvY2xpc3QgIT0gTlVMTCkgeworICAgICAgICBfX2ttcF9mcmVlKF9fa21wX2FmZmluaXR5X3Byb2NsaXN0KTsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJvY2xpc3QgPSBOVUxMOworICAgIH0KKyAgICBpZiggYWRkcmVzczJvcyAhPSBOVUxMICkgeworICAgICAgICBfX2ttcF9mcmVlKCBhZGRyZXNzMm9zICk7CisgICAgICAgIGFkZHJlc3Myb3MgPSBOVUxMOworICAgIH0KKyAgICBpZiggcHJvY2FyciAhPSBOVUxMICkgeworICAgICAgICBfX2ttcF9mcmVlKCBwcm9jYXJyICk7CisgICAgICAgIHByb2NhcnIgPSBOVUxMOworICAgIH0KK30KKworCit2b2lkCitfX2ttcF9hZmZpbml0eV9zZXRfaW5pdF9tYXNrKGludCBndGlkLCBpbnQgaXNhX3Jvb3QpCit7CisgICAgaWYgKCEgS01QX0FGRklOSVRZX0NBUEFCTEUoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAga21wX2luZm9fdCAqdGggPSAoa21wX2luZm9fdCAqKVRDUl9TWU5DX1BUUihfX2ttcF90aHJlYWRzW2d0aWRdKTsKKyAgICBpZiAodGgtPnRoLnRoX2FmZmluX21hc2sgPT0gTlVMTCkgeworICAgICAgICBLTVBfQ1BVX0FMTE9DKHRoLT50aC50aF9hZmZpbl9tYXNrKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEtNUF9DUFVfWkVSTyh0aC0+dGgudGhfYWZmaW5fbWFzayk7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBDb3B5IHRoZSB0aHJlYWQgbWFzayB0byB0aGUga21wX2luZm9fdCBzdHJ1Y3V0dXJlLgorICAgIC8vIElmIF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSwgY29weSB0aGUgImZ1bGwiIG1hc2ssIGkuZS4gb25lCisgICAgLy8gdGhhdCBoYXMgYWxsIG9mIHRoZSBPUyBwcm9jIGlkcyBzZXQsIG9yIGlmIF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzaworICAgIC8vIGlzIHNldCwgdGhlbiB0aGUgZnVsbCBtYXNrIGlzIHRoZSBzYW1lIGFzIHRoZSBtYXNrIG9mIHRoZSBpbml0aWFsaXphdGlvbgorICAgIC8vIHRocmVhZC4KKyAgICAvLworICAgIGttcF9hZmZpbl9tYXNrX3QgKm1hc2s7CisgICAgaW50IGk7CisKKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICBpZiAoX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID09IHByb2NfYmluZF9pbnRlbCkKKyMgZW5kaWYKKyAgICB7CisgICAgICAgIGlmICgoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKSB8fCAoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9iYWxhbmNlZCkKKyAgICAgICAgICApIHsKKyMgaWYgS01QX0dST1VQX0FGRklOSVRZCisgICAgICAgICAgICBpZiAoX19rbXBfbnVtX3Byb2NfZ3JvdXBzID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyMgZW5kaWYKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoZnVsbE1hc2sgIT0gTlVMTCk7CisgICAgICAgICAgICBpID0gS01QX1BMQUNFX0FMTDsKKyAgICAgICAgICAgIG1hc2sgPSBmdWxsTWFzazsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2FmZmluaXR5X251bV9tYXNrcyA+IDAgKTsKKyAgICAgICAgICAgIGkgPSAoZ3RpZCArIF9fa21wX2FmZmluaXR5X29mZnNldCkgJSBfX2ttcF9hZmZpbml0eV9udW1fbWFza3M7CisgICAgICAgICAgICBtYXNrID0gS01QX0NQVV9JTkRFWChfX2ttcF9hZmZpbml0eV9tYXNrcywgaSk7CisgICAgICAgIH0KKyAgICB9CisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgZWxzZSB7CisgICAgICAgIGlmICgoISBpc2Ffcm9vdCkKKyAgICAgICAgICB8fCAoX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID09IHByb2NfYmluZF9mYWxzZSkpIHsKKyMgIGlmIEtNUF9HUk9VUF9BRkZJTklUWQorICAgICAgICAgICAgaWYgKF9fa21wX251bV9wcm9jX2dyb3VwcyA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisjICBlbmRpZgorICAgICAgICAgICAgS01QX0FTU0VSVChmdWxsTWFzayAhPSBOVUxMKTsKKyAgICAgICAgICAgIGkgPSBLTVBfUExBQ0VfQUxMOworICAgICAgICAgICAgbWFzayA9IGZ1bGxNYXNrOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIGludCBpID0gc29tZSBoYXNoIGZ1bmN0aW9uIG9yIGp1c3QgYSBjb3VudGVyIHRoYXQgZG9lc24ndAorICAgICAgICAgICAgLy8gYWx3YXlzIHN0YXJ0IGF0IDAuICBVc2UgZ3RpZCBmb3Igbm93LgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2FmZmluaXR5X251bV9tYXNrcyA+IDAgKTsKKyAgICAgICAgICAgIGkgPSAoZ3RpZCArIF9fa21wX2FmZmluaXR5X29mZnNldCkgJSBfX2ttcF9hZmZpbml0eV9udW1fbWFza3M7CisgICAgICAgICAgICBtYXNrID0gS01QX0NQVV9JTkRFWChfX2ttcF9hZmZpbml0eV9tYXNrcywgaSk7CisgICAgICAgIH0KKyAgICB9CisjIGVuZGlmCisKKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICB0aC0+dGgudGhfY3VycmVudF9wbGFjZSA9IGk7CisgICAgaWYgKGlzYV9yb290KSB7CisgICAgICAgIHRoLT50aC50aF9uZXdfcGxhY2UgPSBpOworICAgICAgICB0aC0+dGgudGhfZmlyc3RfcGxhY2UgPSAwOworICAgICAgICB0aC0+dGgudGhfbGFzdF9wbGFjZSA9IF9fa21wX2FmZmluaXR5X251bV9tYXNrcyAtIDE7CisgICAgfQorCisgICAgaWYgKGkgPT0gS01QX1BMQUNFX0FMTCkgeworICAgICAgICBLQV9UUkFDRSgxMDAsICgiX19rbXBfYWZmaW5pdHlfc2V0X2luaXRfbWFzazogYmluZGluZyBUIyVkIHRvIGFsbCBwbGFjZXNcbiIsCisgICAgICAgICAgZ3RpZCkpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgS0FfVFJBQ0UoMTAwLCAoIl9fa21wX2FmZmluaXR5X3NldF9pbml0X21hc2s6IGJpbmRpbmcgVCMlZCB0byBwbGFjZSAlZFxuIiwKKyAgICAgICAgICBndGlkLCBpKSk7CisgICAgfQorIyBlbHNlCisgICAgaWYgKGkgPT0gLTEpIHsKKyAgICAgICAgS0FfVFJBQ0UoMTAwLCAoIl9fa21wX2FmZmluaXR5X3NldF9pbml0X21hc2s6IGJpbmRpbmcgVCMlZCB0byBmdWxsTWFza1xuIiwKKyAgICAgICAgICBndGlkKSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBLQV9UUkFDRSgxMDAsICgiX19rbXBfYWZmaW5pdHlfc2V0X2luaXRfbWFzazogYmluZGluZyBUIyVkIHRvIG1hc2sgJWRcbiIsCisgICAgICAgICAgZ3RpZCwgaSkpOworICAgIH0KKyMgZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworICAgIEtNUF9DUFVfQ09QWSh0aC0+dGgudGhfYWZmaW5fbWFzaywgbWFzayk7CisKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKGJ1ZiwgS01QX0FGRklOX01BU0tfUFJJTlRfTEVOLAorICAgICAgICAgIHRoLT50aC50aF9hZmZpbl9tYXNrKTsKKyAgICAgICAgS01QX0lORk9STShCb3VuZFRvT1NQcm9jU2V0LCAiS01QX0FGRklOSVRZIiwgKGttcF9pbnQzMilnZXRwaWQoKSwgZ3RpZCwKKyAgICAgICAgICBidWYpOworICAgIH0KKworIyBpZiBLTVBfT1NfV0lORE9XUworICAgIC8vCisgICAgLy8gT24gV2luZG93cyogT1MsIHRoZSBwcm9jZXNzIGFmZmluaXR5IG1hc2sgbWlnaHQgaGF2ZSBjaGFuZ2VkLgorICAgIC8vIElmIHRoZSB1c2VyIGRpZG4ndCByZXF1ZXN0IGFmZmluaXR5IGFuZCB0aGlzIGNhbGwgZmFpbHMsCisgICAgLy8ganVzdCBjb250aW51ZSBzaWxlbnRseS4gIFNlZSBDUTE3MTM5My4KKyAgICAvLworICAgIGlmICggX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lICkgeworICAgICAgICBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KHRoLT50aC50aF9hZmZpbl9tYXNrLCBGQUxTRSk7CisgICAgfQorICAgIGVsc2UKKyMgZW5kaWYKKyAgICBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KHRoLT50aC50aF9hZmZpbl9tYXNrLCBUUlVFKTsKK30KKworCisjIGlmIE9NUF80MF9FTkFCTEVECisKK3ZvaWQKK19fa21wX2FmZmluaXR5X3NldF9wbGFjZShpbnQgZ3RpZCkKK3sKKyAgICBpbnQgcmV0dmFsOworCisgICAgaWYgKCEgS01QX0FGRklOSVRZX0NBUEFCTEUoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAga21wX2luZm9fdCAqdGggPSAoa21wX2luZm9fdCAqKVRDUl9TWU5DX1BUUihfX2ttcF90aHJlYWRzW2d0aWRdKTsKKworICAgIEtBX1RSQUNFKDEwMCwgKCJfX2ttcF9hZmZpbml0eV9zZXRfcGxhY2U6IGJpbmRpbmcgVCMlZCB0byBwbGFjZSAlZCAoY3VycmVudCBwbGFjZSA9ICVkKVxuIiwKKyAgICAgIGd0aWQsIHRoLT50aC50aF9uZXdfcGxhY2UsIHRoLT50aC50aF9jdXJyZW50X3BsYWNlKSk7CisKKyAgICAvLworICAgIC8vIENoZWNrIHRoYXQgdGhlIG5ldyBwbGFjZSBpcyB3aXRoaW4gdGhpcyB0aHJlYWQncyBwYXJ0aXRpb24uCisgICAgLy8KKyAgICBLTVBfREVCVUdfQVNTRVJUKHRoLT50aC50aF9hZmZpbl9tYXNrICE9IE5VTEwpOworICAgIEtNUF9BU1NFUlQodGgtPnRoLnRoX25ld19wbGFjZSA+PSAwKTsKKyAgICBLTVBfQVNTRVJUKCh1bnNpZ25lZCl0aC0+dGgudGhfbmV3X3BsYWNlIDw9IF9fa21wX2FmZmluaXR5X251bV9tYXNrcyk7CisgICAgaWYgKHRoLT50aC50aF9maXJzdF9wbGFjZSA8PSB0aC0+dGgudGhfbGFzdF9wbGFjZSkgeworICAgICAgICBLTVBfQVNTRVJUKCh0aC0+dGgudGhfbmV3X3BsYWNlID49IHRoLT50aC50aF9maXJzdF9wbGFjZSkKKyAgICAgICAgICYmICh0aC0+dGgudGhfbmV3X3BsYWNlIDw9IHRoLT50aC50aF9sYXN0X3BsYWNlKSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBLTVBfQVNTRVJUKCh0aC0+dGgudGhfbmV3X3BsYWNlIDw9IHRoLT50aC50aF9maXJzdF9wbGFjZSkKKyAgICAgICAgIHx8ICh0aC0+dGgudGhfbmV3X3BsYWNlID49IHRoLT50aC50aF9sYXN0X3BsYWNlKSk7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBDb3B5IHRoZSB0aHJlYWQgbWFzayB0byB0aGUga21wX2luZm9fdCBzdHJ1Y3V0dXJlLAorICAgIC8vIGFuZCBzZXQgdGhpcyB0aHJlYWQncyBhZmZpbml0eS4KKyAgICAvLworICAgIGttcF9hZmZpbl9tYXNrX3QgKm1hc2sgPSBLTVBfQ1BVX0lOREVYKF9fa21wX2FmZmluaXR5X21hc2tzLAorICAgICAgdGgtPnRoLnRoX25ld19wbGFjZSk7CisgICAgS01QX0NQVV9DT1BZKHRoLT50aC50aF9hZmZpbl9tYXNrLCBtYXNrKTsKKyAgICB0aC0+dGgudGhfY3VycmVudF9wbGFjZSA9IHRoLT50aC50aF9uZXdfcGxhY2U7CisKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKGJ1ZiwgS01QX0FGRklOX01BU0tfUFJJTlRfTEVOLAorICAgICAgICAgIHRoLT50aC50aF9hZmZpbl9tYXNrKTsKKyAgICAgICAgS01QX0lORk9STShCb3VuZFRvT1NQcm9jU2V0LCAiT01QX1BST0NfQklORCIsIChrbXBfaW50MzIpZ2V0cGlkKCksCisgICAgICAgICAgZ3RpZCwgYnVmKTsKKyAgICB9CisgICAgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eSh0aC0+dGgudGhfYWZmaW5fbWFzaywgVFJVRSk7Cit9CisKKyMgZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworCitpbnQKK19fa21wX2F1eF9zZXRfYWZmaW5pdHkodm9pZCAqKm1hc2spCit7CisgICAgaW50IGd0aWQ7CisgICAga21wX2luZm9fdCAqdGg7CisgICAgaW50IHJldHZhbDsKKworICAgIGlmICghIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgS0FfVFJBQ0UoMTAwMCwgO3sKKyAgICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwKKyAgICAgICAgICAoa21wX2FmZmluX21hc2tfdCAqKSgqbWFzaykpOworICAgICAgICBfX2ttcF9kZWJ1Z19wcmludGYoImttcF9zZXRfYWZmaW5pdHk6IHNldHRpbmcgYWZmaW5pdHkgbWFzayBmb3IgdGhyZWFkICVkID0gJXNcbiIsCisgICAgICAgICAgZ3RpZCwgYnVmKTsKKyAgICB9KTsKKworICAgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICAgICAgaWYgKChtYXNrID09IE5VTEwpIHx8ICgqbWFzayA9PSBOVUxMKSkgeworICAgICAgICAgICAgS01QX0ZBVEFMKEFmZmluaXR5SW52YWxpZE1hc2ssICJrbXBfc2V0X2FmZmluaXR5Iik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB1bnNpZ25lZCBwcm9jOworICAgICAgICAgICAgaW50IG51bV9wcm9jcyA9IDA7CisKKyAgICAgICAgICAgIEtNUF9DUFVfU0VUX0lURVJBVEUocHJvYywgKChrbXBfYWZmaW5fbWFza190KikoKm1hc2spKSkgeworICAgICAgICAgICAgICAgIGlmICghIEtNUF9DUFVfSVNTRVQocHJvYywgKGttcF9hZmZpbl9tYXNrX3QgKikoKm1hc2spKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbnVtX3Byb2NzKys7CisgICAgICAgICAgICAgICAgaWYgKCEgS01QX0NQVV9JU1NFVChwcm9jLCBmdWxsTWFzaykpIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0ZBVEFMKEFmZmluaXR5SW52YWxpZE1hc2ssICJrbXBfc2V0X2FmZmluaXR5Iik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChudW1fcHJvY3MgPT0gMCkgeworICAgICAgICAgICAgICAgIEtNUF9GQVRBTChBZmZpbml0eUludmFsaWRNYXNrLCAia21wX3NldF9hZmZpbml0eSIpOworICAgICAgICAgICAgfQorCisjIGlmIEtNUF9HUk9VUF9BRkZJTklUWQorICAgICAgICAgICAgaWYgKF9fa21wX2dldF9wcm9jX2dyb3VwKChrbXBfYWZmaW5fbWFza190ICopKCptYXNrKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgS01QX0ZBVEFMKEFmZmluaXR5SW52YWxpZE1hc2ssICJrbXBfc2V0X2FmZmluaXR5Iik7CisgICAgICAgICAgICB9CisjIGVuZGlmIC8qIEtNUF9HUk9VUF9BRkZJTklUWSAqLworCisgICAgICAgIH0KKyAgICB9CisKKyAgICB0aCA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgICAgS01QX0RFQlVHX0FTU0VSVCh0aC0+dGgudGhfYWZmaW5fbWFzayAhPSBOVUxMKTsKKyAgICByZXR2YWwgPSBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KChrbXBfYWZmaW5fbWFza190ICopKCptYXNrKSwgRkFMU0UpOworICAgIGlmIChyZXR2YWwgPT0gMCkgeworICAgICAgICBLTVBfQ1BVX0NPUFkodGgtPnRoLnRoX2FmZmluX21hc2ssIChrbXBfYWZmaW5fbWFza190ICopKCptYXNrKSk7CisgICAgfQorCisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgdGgtPnRoLnRoX2N1cnJlbnRfcGxhY2UgPSBLTVBfUExBQ0VfVU5ERUZJTkVEOworICAgIHRoLT50aC50aF9uZXdfcGxhY2UgPSBLTVBfUExBQ0VfVU5ERUZJTkVEOworICAgIHRoLT50aC50aF9maXJzdF9wbGFjZSA9IDA7CisgICAgdGgtPnRoLnRoX2xhc3RfcGxhY2UgPSBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgLSAxOworCisgICAgLy8KKyAgICAvLyBUdXJuIG9mZiA0LjAgYWZmaW5pdHkgZm9yIHRoZSBjdXJyZW50IHRyZWFkIGF0IHRoaXMgcGFyYWxsZWwgbGV2ZWwuCisgICAgLy8KKyAgICB0aC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLnByb2NfYmluZCA9IHByb2NfYmluZF9mYWxzZTsKKyMgZW5kaWYKKworICAgIHJldHVybiByZXR2YWw7Cit9CisKKworaW50CitfX2ttcF9hdXhfZ2V0X2FmZmluaXR5KHZvaWQgKiptYXNrKQoreworICAgIGludCBndGlkOworICAgIGludCByZXR2YWw7CisgICAga21wX2luZm9fdCAqdGg7CisKKyAgICBpZiAoISBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICAgIHRoID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRoLT50aC50aF9hZmZpbl9tYXNrICE9IE5VTEwpOworCisgICAgS0FfVFJBQ0UoMTAwMCwgO3sKKyAgICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwKKyAgICAgICAgICB0aC0+dGgudGhfYWZmaW5fbWFzayk7CisgICAgICAgIF9fa21wX3ByaW50Zigia21wX2dldF9hZmZpbml0eTogc3RvcmVkIGFmZmluaXR5IG1hc2sgZm9yIHRocmVhZCAlZCA9ICVzXG4iLCBndGlkLCBidWYpOworICAgIH0pOworCisgICAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgICBpZiAoKG1hc2sgPT0gTlVMTCkgfHwgKCptYXNrID09IE5VTEwpKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoQWZmaW5pdHlJbnZhbGlkTWFzaywgImttcF9nZXRfYWZmaW5pdHkiKTsKKyAgICAgICAgfQorICAgIH0KKworIyBpZiAhS01QX09TX1dJTkRPV1MKKworICAgIHJldHZhbCA9IF9fa21wX2dldF9zeXN0ZW1fYWZmaW5pdHkoKGttcF9hZmZpbl9tYXNrX3QgKikoKm1hc2spLCBGQUxTRSk7CisgICAgS0FfVFJBQ0UoMTAwMCwgO3sKKyAgICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwKKyAgICAgICAgICAoa21wX2FmZmluX21hc2tfdCAqKSgqbWFzaykpOworICAgICAgICBfX2ttcF9wcmludGYoImttcF9nZXRfYWZmaW5pdHk6IHN5c3RlbSBhZmZpbml0eSBtYXNrIGZvciB0aHJlYWQgJWQgPSAlc1xuIiwgZ3RpZCwgYnVmKTsKKyAgICB9KTsKKyAgICByZXR1cm4gcmV0dmFsOworCisjIGVsc2UKKworICAgIEtNUF9DUFVfQ09QWSgoa21wX2FmZmluX21hc2tfdCAqKSgqbWFzayksIHRoLT50aC50aF9hZmZpbl9tYXNrKTsKKyAgICByZXR1cm4gMDsKKworIyBlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworCit9CisKK2ludAorX19rbXBfYXV4X3NldF9hZmZpbml0eV9tYXNrX3Byb2MoaW50IHByb2MsIHZvaWQgKiptYXNrKQoreworICAgIGludCByZXR2YWw7CisKKyAgICBpZiAoISBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBLQV9UUkFDRSgxMDAwLCA7eworICAgICAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwKKyAgICAgICAgICAoa21wX2FmZmluX21hc2tfdCAqKSgqbWFzaykpOworICAgICAgICBfX2ttcF9kZWJ1Z19wcmludGYoImttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jOiBzZXR0aW5nIHByb2MgJWQgaW4gYWZmaW5pdHkgbWFzayBmb3IgdGhyZWFkICVkID0gJXNcbiIsCisgICAgICAgICAgcHJvYywgZ3RpZCwgYnVmKTsKKyAgICB9KTsKKworICAgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICAgICAgaWYgKChtYXNrID09IE5VTEwpIHx8ICgqbWFzayA9PSBOVUxMKSkgeworICAgICAgICAgICAgS01QX0ZBVEFMKEFmZmluaXR5SW52YWxpZE1hc2ssICJrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyIpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChwcm9jIDwgMCkKKyMgaWYgIUtNUF9VU0VfSFdMT0MKKyAgICAgICAgIHx8ICgodW5zaWduZWQpcHJvYyA+PSBLTVBfQ1BVX1NFVFNJWkUpCisjIGVuZGlmCisgICAgICAgKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCEgS01QX0NQVV9JU1NFVChwcm9jLCBmdWxsTWFzaykpIHsKKyAgICAgICAgcmV0dXJuIC0yOworICAgIH0KKworICAgIEtNUF9DUFVfU0VUKHByb2MsIChrbXBfYWZmaW5fbWFza190ICopKCptYXNrKSk7CisgICAgcmV0dXJuIDA7Cit9CisKKworaW50CitfX2ttcF9hdXhfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jKGludCBwcm9jLCB2b2lkICoqbWFzaykKK3sKKyAgICBpbnQgcmV0dmFsOworCisgICAgaWYgKCEgS01QX0FGRklOSVRZX0NBUEFCTEUoKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgS0FfVFJBQ0UoMTAwMCwgO3sKKyAgICAgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgICAgIGNoYXIgYnVmW0tNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTl07CisgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2soYnVmLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sCisgICAgICAgICAgKGttcF9hZmZpbl9tYXNrX3QgKikoKm1hc2spKTsKKyAgICAgICAgX19rbXBfZGVidWdfcHJpbnRmKCJrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jOiB1bnNldHRpbmcgcHJvYyAlZCBpbiBhZmZpbml0eSBtYXNrIGZvciB0aHJlYWQgJWQgPSAlc1xuIiwKKyAgICAgICAgICBwcm9jLCBndGlkLCBidWYpOworICAgIH0pOworCisgICAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgICBpZiAoKG1hc2sgPT0gTlVMTCkgfHwgKCptYXNrID09IE5VTEwpKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoQWZmaW5pdHlJbnZhbGlkTWFzaywgImttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgocHJvYyA8IDApCisjIGlmICFLTVBfVVNFX0hXTE9DCisgICAgICAgICB8fCAoKHVuc2lnbmVkKXByb2MgPj0gS01QX0NQVV9TRVRTSVpFKQorIyBlbmRpZgorICAgICAgICkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghIEtNUF9DUFVfSVNTRVQocHJvYywgZnVsbE1hc2spKSB7CisgICAgICAgIHJldHVybiAtMjsKKyAgICB9CisKKyAgICBLTVBfQ1BVX0NMUihwcm9jLCAoa21wX2FmZmluX21hc2tfdCAqKSgqbWFzaykpOworICAgIHJldHVybiAwOworfQorCisKK2ludAorX19rbXBfYXV4X2dldF9hZmZpbml0eV9tYXNrX3Byb2MoaW50IHByb2MsIHZvaWQgKiptYXNrKQoreworICAgIGludCByZXR2YWw7CisKKyAgICBpZiAoISBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBLQV9UUkFDRSgxMDAwLCA7eworICAgICAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwKKyAgICAgICAgICAoa21wX2FmZmluX21hc2tfdCAqKSgqbWFzaykpOworICAgICAgICBfX2ttcF9kZWJ1Z19wcmludGYoImttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jOiBnZXR0aW5nIHByb2MgJWQgaW4gYWZmaW5pdHkgbWFzayBmb3IgdGhyZWFkICVkID0gJXNcbiIsCisgICAgICAgICAgcHJvYywgZ3RpZCwgYnVmKTsKKyAgICB9KTsKKworICAgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICAgICAgaWYgKChtYXNrID09IE5VTEwpIHx8ICgqbWFzayA9PSBOVUxMKSkgeworICAgICAgICAgICAgS01QX0ZBVEFMKEFmZmluaXR5SW52YWxpZE1hc2ssICJrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyIpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChwcm9jIDwgMCkKKyMgaWYgIUtNUF9VU0VfSFdMT0MKKyAgICAgICAgIHx8ICgodW5zaWduZWQpcHJvYyA+PSBLTVBfQ1BVX1NFVFNJWkUpCisjIGVuZGlmCisgICAgICAgKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCEgS01QX0NQVV9JU1NFVChwcm9jLCBmdWxsTWFzaykpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIEtNUF9DUFVfSVNTRVQocHJvYywgKGttcF9hZmZpbl9tYXNrX3QgKikoKm1hc2spKTsKK30KKworCisvLyBEeW5hbWljIGFmZmluaXR5IHNldHRpbmdzIC0gQWZmaW5pdHkgYmFsYW5jZWQKK3ZvaWQgX19rbXBfYmFsYW5jZWRfYWZmaW5pdHkoIGludCB0aWQsIGludCBudGhyZWFkcyApCit7CisgICAgaWYoIF9fa21wX2FmZmluaXR5X3VuaWZvcm1fdG9wb2xvZ3koKSApIHsKKyAgICAgICAgaW50IGNvcmVJRDsKKyAgICAgICAgaW50IHRocmVhZElEOworICAgICAgICAvLyBOdW1iZXIgb2YgaHlwZXIgdGhyZWFkcyBwZXIgY29yZSBpbiBIVCBtYWNoaW5lCisgICAgICAgIGludCBfX2ttcF9udGhfcGVyX2NvcmUgPSBfX2ttcF9hdmFpbF9wcm9jIC8gX19rbXBfbmNvcmVzOworICAgICAgICAvLyBOdW1iZXIgb2YgY29yZXMKKyAgICAgICAgaW50IG5jb3JlcyA9IF9fa21wX25jb3JlczsKKyAgICAgICAgLy8gSG93IG1hbnkgdGhyZWFkcyB3aWxsIGJlIGJvdW5kIHRvIGVhY2ggY29yZQorICAgICAgICBpbnQgY2h1bmsgPSBudGhyZWFkcyAvIG5jb3JlczsKKyAgICAgICAgLy8gSG93IG1hbnkgY29yZXMgd2lsbCBoYXZlIGFuIGFkZGl0aW9uYWwgdGhyZWFkIGJvdW5kIHRvIGl0IC0gImJpZyBjb3JlcyIKKyAgICAgICAgaW50IGJpZ19jb3JlcyA9IG50aHJlYWRzICUgbmNvcmVzOworICAgICAgICAvLyBOdW1iZXIgb2YgdGhyZWFkcyBvbiB0aGUgYmlnIGNvcmVzCisgICAgICAgIGludCBiaWdfbnRoID0gKCBjaHVuayArIDEgKSAqIGJpZ19jb3JlczsKKyAgICAgICAgaWYoIHRpZCA8IGJpZ19udGggKSB7CisgICAgICAgICAgICBjb3JlSUQgPSB0aWQgLyAoY2h1bmsgKyAxICk7CisgICAgICAgICAgICB0aHJlYWRJRCA9ICggdGlkICUgKGNodW5rICsgMSApICkgJSBfX2ttcF9udGhfcGVyX2NvcmUgOworICAgICAgICB9IGVsc2UgeyAvL3RpZCA+PSBiaWdfbnRoCisgICAgICAgICAgICBjb3JlSUQgPSAoIHRpZCAtIGJpZ19jb3JlcyApIC8gY2h1bms7CisgICAgICAgICAgICB0aHJlYWRJRCA9ICggKCB0aWQgLSBiaWdfY29yZXMgKSAlIGNodW5rICkgJSBfX2ttcF9udGhfcGVyX2NvcmUgOworICAgICAgICB9CisKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVDIoS01QX0FGRklOSVRZX0NBUEFCTEUoKSwKKyAgICAgICAgICAiSWxsZWdhbCBzZXQgYWZmaW5pdHkgb3BlcmF0aW9uIHdoZW4gbm90IGNhcGFibGUiKTsKKworICAgICAgICBrbXBfYWZmaW5fbWFza190ICptYXNrOworICAgICAgICBLTVBfQ1BVX0FMTE9DX09OX1NUQUNLKG1hc2spOworICAgICAgICBLTVBfQ1BVX1pFUk8obWFzayk7CisKKyAgICAgICAgLy8gR3JhbnVsYXJpdHkgPT0gdGhyZWFkCisgICAgICAgIGlmKCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fZmluZSB8fCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fdGhyZWFkKSB7CisgICAgICAgICAgICBpbnQgb3NJRCA9IGFkZHJlc3Myb3NbIGNvcmVJRCAqIF9fa21wX250aF9wZXJfY29yZSArIHRocmVhZElEIF0uc2Vjb25kOworICAgICAgICAgICAgS01QX0NQVV9TRVQoIG9zSUQsIG1hc2spOworICAgICAgICB9IGVsc2UgaWYoIF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9jb3JlICkgeyAvLyBHcmFudWxhcml0eSA9PSBjb3JlCisgICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IF9fa21wX250aF9wZXJfY29yZTsgaSsrICkgeworICAgICAgICAgICAgICAgIGludCBvc0lEOworICAgICAgICAgICAgICAgIG9zSUQgPSBhZGRyZXNzMm9zWyBjb3JlSUQgKiBfX2ttcF9udGhfcGVyX2NvcmUgKyBpIF0uc2Vjb25kOworICAgICAgICAgICAgICAgIEtNUF9DUFVfU0VUKCBvc0lELCBtYXNrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2soYnVmLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sIG1hc2spOworICAgICAgICAgICAgS01QX0lORk9STShCb3VuZFRvT1NQcm9jU2V0LCAiS01QX0FGRklOSVRZIiwgKGttcF9pbnQzMilnZXRwaWQoKSwKKyAgICAgICAgICAgICAgdGlkLCBidWYpOworICAgICAgICB9CisgICAgICAgIF9fa21wX3NldF9zeXN0ZW1fYWZmaW5pdHkoIG1hc2ssIFRSVUUgKTsKKyAgICAgICAgS01QX0NQVV9GUkVFX0ZST01fU1RBQ0sobWFzayk7CisgICAgfSBlbHNlIHsgLy8gTm9uLXVuaWZvcm0gdG9wb2xvZ3kKKworICAgICAgICBrbXBfYWZmaW5fbWFza190ICptYXNrOworICAgICAgICBLTVBfQ1BVX0FMTE9DX09OX1NUQUNLKG1hc2spOworICAgICAgICBLTVBfQ1BVX1pFUk8obWFzayk7CisKKyAgICAgICAgLy8gTnVtYmVyIG9mIGh5cGVyIHRocmVhZHMgcGVyIGNvcmUgaW4gSFQgbWFjaGluZQorICAgICAgICBpbnQgbnRoX3Blcl9jb3JlID0gX19rbXBfblRocmVhZHNQZXJDb3JlOworICAgICAgICBpbnQgY29yZV9sZXZlbDsKKyAgICAgICAgaWYoIG50aF9wZXJfY29yZSA+IDEgKSB7CisgICAgICAgICAgICBjb3JlX2xldmVsID0gX19rbXBfYWZmX2RlcHRoIC0gMjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvcmVfbGV2ZWwgPSBfX2ttcF9hZmZfZGVwdGggLSAxOworICAgICAgICB9CisKKyAgICAgICAgLy8gTnVtYmVyIG9mIGNvcmVzIC0gbWF4aW11bSB2YWx1ZTsgaXQgZG9lcyBub3QgY291bnQgdHJhaWwgY29yZXMgd2l0aCAwIHByb2Nlc3NvcnMKKyAgICAgICAgaW50IG5jb3JlcyA9IGFkZHJlc3Myb3NbIF9fa21wX2F2YWlsX3Byb2MgLSAxIF0uZmlyc3QubGFiZWxzWyBjb3JlX2xldmVsIF0gKyAxOworCisgICAgICAgIC8vIEZvciBwZXJmb3JtYW5jZSBnYWluIGNvbnNpZGVyIHRoZSBzcGVjaWFsIGNhc2UgbnRocmVhZHMgPT0gX19rbXBfYXZhaWxfcHJvYworICAgICAgICBpZiggbnRocmVhZHMgPT0gX19rbXBfYXZhaWxfcHJvYyApIHsKKyAgICAgICAgICAgIGlmKCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fZmluZSB8fCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fdGhyZWFkKSB7CisgICAgICAgICAgICAgICAgaW50IG9zSUQgPSBhZGRyZXNzMm9zWyB0aWQgXS5zZWNvbmQ7CisgICAgICAgICAgICAgICAgS01QX0NQVV9TRVQoIG9zSUQsIG1hc2spOworICAgICAgICAgICAgfSBlbHNlIGlmKCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fY29yZSApIHsgLy8gR3JhbnVsYXJpdHkgPT0gY29yZQorICAgICAgICAgICAgICAgIGludCBjb3JlSUQgPSBhZGRyZXNzMm9zWyB0aWQgXS5maXJzdC5sYWJlbHNbIGNvcmVfbGV2ZWwgXTsKKyAgICAgICAgICAgICAgICAvLyBXZSdsbCBjb3VudCBmb3VuZCBvc0lEcyBmb3IgdGhlIGN1cnJlbnQgY29yZTsgdGhleSBjYW4gYmUgbm90IG1vcmUgdGhhbiBudGhfcGVyX2NvcmU7CisgICAgICAgICAgICAgICAgLy8gc2luY2UgdGhlIGFkZHJlc3Myb3MgaXMgc29ydGllZCB3ZSBjYW4gYnJlYWsgd2hlbiBjbnQ9PW50aF9wZXJfY29yZQorICAgICAgICAgICAgICAgIGludCBjbnQgPSAwOworICAgICAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgX19rbXBfYXZhaWxfcHJvYzsgaSsrICkgeworICAgICAgICAgICAgICAgICAgICBpbnQgb3NJRCA9IGFkZHJlc3Myb3NbIGkgXS5zZWNvbmQ7CisgICAgICAgICAgICAgICAgICAgIGludCBjb3JlID0gYWRkcmVzczJvc1sgaSBdLmZpcnN0LmxhYmVsc1sgY29yZV9sZXZlbCBdOworICAgICAgICAgICAgICAgICAgICBpZiggY29yZSA9PSBjb3JlSUQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfQ1BVX1NFVCggb3NJRCwgbWFzayk7CisgICAgICAgICAgICAgICAgICAgICAgICBjbnQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjbnQgPT0gbnRoX3Blcl9jb3JlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYoIG50aHJlYWRzIDw9IF9fa21wX25jb3JlcyApIHsKKworICAgICAgICAgICAgaW50IGNvcmUgPSAwOworICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBuY29yZXM7IGkrKyApIHsKKyAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGNvcmUgZnJvbSBwcm9jYXJyW10gaXMgaW4gdGhlIG1hc2sKKyAgICAgICAgICAgICAgICBpbnQgaW5fbWFzayA9IDA7CisgICAgICAgICAgICAgICAgZm9yKCBpbnQgaiA9IDA7IGogPCBudGhfcGVyX2NvcmU7IGorKyApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHByb2NhcnJbIGkgKiBudGhfcGVyX2NvcmUgKyBqIF0gIT0gLSAxICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5fbWFzayA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiggaW5fbWFzayApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHRpZCA9PSBjb3JlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCBpbnQgaiA9IDA7IGogPCBudGhfcGVyX2NvcmU7IGorKyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3NJRCA9IHByb2NhcnJbIGkgKiBudGhfcGVyX2NvcmUgKyBqIF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIG9zSUQgIT0gLTEgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9DUFVfU0VUKCBvc0lELCBtYXNrICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvciBncmFudWxhcml0eT10aHJlYWQgaXQgaXMgZW5vdWdoIHRvIHNldCB0aGUgZmlyc3QgYXZhaWxhYmxlIG9zSUQgZm9yIHRoaXMgY29yZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX2ZpbmUgfHwgX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX3RocmVhZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvcmUrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UgeyAvLyBudGhyZWFkcyA+IF9fa21wX25jb3JlcworCisgICAgICAgICAgICAvLyBBcnJheSB0byBzYXZlIHRoZSBudW1iZXIgb2YgcHJvY2Vzc29ycyBhdCBlYWNoIGNvcmUKKyAgICAgICAgICAgIGludCogbnByb2NfYXRfY29yZSA9IChpbnQqKUtNUF9BTExPQ0Eoc2l6ZW9mKGludCkqbmNvcmVzKTsKKyAgICAgICAgICAgIC8vIEFycmF5IHRvIHNhdmUgdGhlIG51bWJlciBvZiBjb3JlcyB3aXRoICJ4IiBhdmFpbGFibGUgcHJvY2Vzc29yczsKKyAgICAgICAgICAgIGludCogbmNvcmVzX3dpdGhfeF9wcm9jcyA9IChpbnQqKUtNUF9BTExPQ0Eoc2l6ZW9mKGludCkqKG50aF9wZXJfY29yZSsxKSk7CisgICAgICAgICAgICAvLyBBcnJheSB0byBzYXZlIHRoZSBudW1iZXIgb2YgY29yZXMgd2l0aCAjIHByb2NzIGZyb20geCB0byBudGhfcGVyX2NvcmUKKyAgICAgICAgICAgIGludCogbmNvcmVzX3dpdGhfeF90b19tYXhfcHJvY3MgPSAoaW50KilLTVBfQUxMT0NBKHNpemVvZihpbnQpKihudGhfcGVyX2NvcmUrMSkpOworCisgICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8PSBudGhfcGVyX2NvcmU7IGkrKyApIHsKKyAgICAgICAgICAgICAgICBuY29yZXNfd2l0aF94X3Byb2NzWyBpIF0gPSAwOworICAgICAgICAgICAgICAgIG5jb3Jlc193aXRoX3hfdG9fbWF4X3Byb2NzWyBpIF0gPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IG5jb3JlczsgaSsrICkgeworICAgICAgICAgICAgICAgIGludCBjbnQgPSAwOworICAgICAgICAgICAgICAgIGZvciggaW50IGogPSAwOyBqIDwgbnRoX3Blcl9jb3JlOyBqKysgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBwcm9jYXJyWyBpICogbnRoX3Blcl9jb3JlICsgaiBdICE9IC0xICkgeworICAgICAgICAgICAgICAgICAgICAgICAgY250Kys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbnByb2NfYXRfY29yZVsgaSBdID0gY250OworICAgICAgICAgICAgICAgIG5jb3Jlc193aXRoX3hfcHJvY3NbIGNudCBdKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDw9IG50aF9wZXJfY29yZTsgaSsrICkgeworICAgICAgICAgICAgICAgIGZvciggaW50IGogPSBpOyBqIDw9IG50aF9wZXJfY29yZTsgaisrICkgeworICAgICAgICAgICAgICAgICAgICBuY29yZXNfd2l0aF94X3RvX21heF9wcm9jc1sgaSBdICs9IG5jb3Jlc193aXRoX3hfcHJvY3NbIGogXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE1heCBudW1iZXIgb2YgcHJvY2Vzc29ycworICAgICAgICAgICAgaW50IG5wcm9jID0gbnRoX3Blcl9jb3JlICogbmNvcmVzOworICAgICAgICAgICAgLy8gQW4gYXJyYXkgdG8ga2VlcCBudW1iZXIgb2YgdGhyZWFkcyBwZXIgZWFjaCBjb250ZXh0CisgICAgICAgICAgICBpbnQgKiBuZXdhcnIgPSAoIGludCAqIClfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKCBpbnQgKSAqIG5wcm9jICk7CisgICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IG5wcm9jOyBpKysgKSB7CisgICAgICAgICAgICAgICAgbmV3YXJyWyBpIF0gPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgbnRoID0gbnRocmVhZHM7CisgICAgICAgICAgICBpbnQgZmxhZyA9IDA7CisgICAgICAgICAgICB3aGlsZSggbnRoID4gMCApIHsKKyAgICAgICAgICAgICAgICBmb3IoIGludCBqID0gMTsgaiA8PSBudGhfcGVyX2NvcmU7IGorKyApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNudCA9IG5jb3Jlc193aXRoX3hfdG9fbWF4X3Byb2NzWyBqIF07CisgICAgICAgICAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgbmNvcmVzOyBpKysgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIHRoZSBjb3JlIHdpdGggMCBwcm9jZXNzb3JzCisgICAgICAgICAgICAgICAgICAgICAgICBpZiggbnByb2NfYXRfY29yZVsgaSBdID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIGludCBrID0gMDsgayA8IG50aF9wZXJfY29yZTsgaysrICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwcm9jYXJyWyBpICogbnRoX3Blcl9jb3JlICsgayBdICE9IC0xICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggbmV3YXJyWyBpICogbnRoX3Blcl9jb3JlICsgayBdID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdhcnJbIGkgKiBudGhfcGVyX2NvcmUgKyBrIF0gPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY250LS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudGgtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGZsYWcgIT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdhcnJbIGkgKiBudGhfcGVyX2NvcmUgKyBrIF0gKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY250LS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnRoLS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggY250ID09IDAgfHwgbnRoID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYoIG50aCA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmxhZyA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgc3VtID0gMDsKKyAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgbnByb2M7IGkrKyApIHsKKyAgICAgICAgICAgICAgICBzdW0gKz0gbmV3YXJyWyBpIF07CisgICAgICAgICAgICAgICAgaWYoIHN1bSA+IHRpZCApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gR3JhbnVsYXJpdHkgPT0gdGhyZWFkCisgICAgICAgICAgICAgICAgICAgIGlmKCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fZmluZSB8fCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fdGhyZWFkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3NJRCA9IHByb2NhcnJbIGkgXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9DUFVfU0VUKCBvc0lELCBtYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fY29yZSApIHsgLy8gR3JhbnVsYXJpdHkgPT0gY29yZQorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvcmVJRCA9IGkgLyBudGhfcGVyX2NvcmU7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIGludCBpaSA9IDA7IGlpIDwgbnRoX3Blcl9jb3JlOyBpaSsrICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvc0lEID0gcHJvY2FyclsgY29yZUlEICogbnRoX3Blcl9jb3JlICsgaWkgXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggb3NJRCAhPSAtMSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0NQVV9TRVQoIG9zSUQsIG1hc2spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfX2ttcF9mcmVlKCBuZXdhcnIgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwgbWFzayk7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEJvdW5kVG9PU1Byb2NTZXQsICJLTVBfQUZGSU5JVFkiLCAoa21wX2ludDMyKWdldHBpZCgpLAorICAgICAgICAgICAgICB0aWQsIGJ1Zik7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eSggbWFzaywgVFJVRSApOworICAgICAgICBLTVBfQ1BVX0ZSRUVfRlJPTV9TVEFDSyhtYXNrKTsKKyAgICB9Cit9CisKKyNpZiBLTVBfT1NfTElOVVgKKy8vIFdlIGRvbid0IG5lZWQgdGhpcyBlbnRyeSBmb3IgV2luZG93cyBiZWNhdXNlCisvLyB0aGVyZSBpcyBHZXRQcm9jZXNzQWZmaW5pdHlNYXNrKCkgYXBpCisvLworLy8gVGhlIGludGVuZGVkIHVzYWdlIGlzIGluZGljYXRlZCBieSB0aGVzZSBzdGVwczoKKy8vIDEpIFRoZSB1c2VyIGdldHMgdGhlIGN1cnJlbnQgYWZmaW5pdHkgbWFzaworLy8gMikgVGhlbiBzZXRzIHRoZSBhZmZpbml0eSBieSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24KKy8vIDMpIEVycm9yIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUKKy8vIDQpIFVzZSBub24tT3Blbk1QIHBhcmFsbGVsaXphdGlvbgorLy8gNSkgUmVzZXQgdGhlIGFmZmluaXR5IHRvIHdoYXQgd2FzIHN0b3JlZCBpbiBzdGVwIDEpCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgoraW50CitrbXBfc2V0X3RocmVhZF9hZmZpbml0eV9tYXNrX2luaXRpYWwoKQorLy8gdGhlIGZ1bmN0aW9uIHJldHVybnMgMCBvbiBzdWNjZXNzLAorLy8gICAtMSBpZiB3ZSBjYW5ub3QgYmluZCB0aHJlYWQKKy8vICAgPjAgKGVycm5vKSBpZiBhbiBlcnJvciBoYXBwZW5lZCBkdXJpbmcgYmluZGluZworeworICAgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgICBpZiAoZ3RpZCA8IDApIHsKKyAgICAgICAgLy8gRG8gbm90IHRvdWNoIG5vbi1vbXAgdGhyZWFkcworICAgICAgICBLQV9UUkFDRSgzMCwgKCAia21wX3NldF90aHJlYWRfYWZmaW5pdHlfbWFza19pbml0aWFsOiAiCisgICAgICAgICAgICAibm9uLW9tcCB0aHJlYWQsIHJldHVybmluZ1xuIikpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghS01QX0FGRklOSVRZX0NBUEFCTEUoKSB8fCAhX19rbXBfaW5pdF9taWRkbGUpIHsKKyAgICAgICAgS0FfVFJBQ0UoMzAsICggImttcF9zZXRfdGhyZWFkX2FmZmluaXR5X21hc2tfaW5pdGlhbDogIgorICAgICAgICAgICAgImFmZmluaXR5IG5vdCBpbml0aWFsaXplZCwgcmV0dXJuaW5nXG4iKSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgS0FfVFJBQ0UoMzAsICggImttcF9zZXRfdGhyZWFkX2FmZmluaXR5X21hc2tfaW5pdGlhbDogIgorICAgICAgICAic2V0IGZ1bGwgbWFzayBmb3IgdGhyZWFkICVkXG4iLCBndGlkKSk7CisgICAgS01QX0RFQlVHX0FTU0VSVChmdWxsTWFzayAhPSBOVUxMKTsKKyAgICByZXR1cm4gX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eShmdWxsTWFzaywgRkFMU0UpOworfQorI2VuZGlmCisKKyNlbmRpZiAvLyBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfYWZmaW5pdHkuaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9hZmZpbml0eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlZDM0MTUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfYWZmaW5pdHkuaApAQCAtMCwwICsxLDMxOSBAQAorLyoKKyAqIGttcF9hZmZpbml0eS5oIC0tIGhlYWRlciBmb3IgYWZmaW5pdHkgbWFuYWdlbWVudAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBLTVBfQUZGSU5JVFlfSAorI2RlZmluZSBLTVBfQUZGSU5JVFlfSAorCitleHRlcm4gaW50IF9fa21wX2FmZmluaXR5X2NvbXBhY3Q7IC8qIEFmZmluaXR5ICdjb21wYWN0JyB2YWx1ZSAqLworCitjbGFzcyBBZGRyZXNzIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgbWF4RGVwdGggPSAzMjsKKyAgICB1bnNpZ25lZCBsYWJlbHNbbWF4RGVwdGhdOworICAgIHVuc2lnbmVkIGNoaWxkTnVtc1ttYXhEZXB0aF07CisgICAgdW5zaWduZWQgZGVwdGg7CisgICAgdW5zaWduZWQgbGVhZGVyOworICAgIEFkZHJlc3ModW5zaWduZWQgX2RlcHRoKQorICAgICAgOiBkZXB0aChfZGVwdGgpLCBsZWFkZXIoRkFMU0UpIHsKKyAgICB9CisgICAgQWRkcmVzcyAmb3BlcmF0b3I9KGNvbnN0IEFkZHJlc3MgJmIpIHsKKyAgICAgICAgZGVwdGggPSBiLmRlcHRoOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZGVwdGg7IGkrKykgeworICAgICAgICAgICAgbGFiZWxzW2ldID0gYi5sYWJlbHNbaV07CisgICAgICAgICAgICBjaGlsZE51bXNbaV0gPSBiLmNoaWxkTnVtc1tpXTsKKyAgICAgICAgfQorICAgICAgICBsZWFkZXIgPSBGQUxTRTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgQWRkcmVzcyAmYikgY29uc3QgeworICAgICAgICBpZiAoZGVwdGggIT0gYi5kZXB0aCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGRlcHRoOyBpKyspCisgICAgICAgICAgICBpZihsYWJlbHNbaV0gIT0gYi5sYWJlbHNbaV0pCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgYm9vbCBpc0Nsb3NlKGNvbnN0IEFkZHJlc3MgJmIsIGludCBsZXZlbCkgY29uc3QgeworICAgICAgICBpZiAoZGVwdGggIT0gYi5kZXB0aCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCh1bnNpZ25lZClsZXZlbCA+PSBkZXB0aCkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgKGRlcHRoIC0gbGV2ZWwpOyBpKyspCisgICAgICAgICAgICBpZihsYWJlbHNbaV0gIT0gYi5sYWJlbHNbaV0pCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEFkZHJlc3MgJmIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICFvcGVyYXRvcj09KGIpOworICAgIH0KKyAgICB2b2lkIHByaW50KCkgY29uc3QgeworICAgICAgICB1bnNpZ25lZCBpOworICAgICAgICBwcmludGYoIkRlcHRoOiAldSAtLS0gIiwgZGVwdGgpOworICAgICAgICBmb3IoaT0wO2k8ZGVwdGg7aSsrKSB7CisgICAgICAgICAgICBwcmludGYoIiV1ICIsIGxhYmVsc1tpXSk7CisgICAgICAgIH0KKyAgICB9Cit9OworCitjbGFzcyBBZGRyVW5zUGFpciB7CitwdWJsaWM6CisgICAgQWRkcmVzcyBmaXJzdDsKKyAgICB1bnNpZ25lZCBzZWNvbmQ7CisgICAgQWRkclVuc1BhaXIoQWRkcmVzcyBfZmlyc3QsIHVuc2lnbmVkIF9zZWNvbmQpCisgICAgICA6IGZpcnN0KF9maXJzdCksIHNlY29uZChfc2Vjb25kKSB7CisgICAgfQorICAgIEFkZHJVbnNQYWlyICZvcGVyYXRvcj0oY29uc3QgQWRkclVuc1BhaXIgJmIpCisgICAgeworICAgICAgICBmaXJzdCA9IGIuZmlyc3Q7CisgICAgICAgIHNlY29uZCA9IGIuc2Vjb25kOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIHZvaWQgcHJpbnQoKSBjb25zdCB7CisgICAgICAgIHByaW50ZigiZmlyc3QgPSAiKTsgZmlyc3QucHJpbnQoKTsKKyAgICAgICAgcHJpbnRmKCIgLS0tIHNlY29uZCA9ICV1Iiwgc2Vjb25kKTsKKyAgICB9CisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEFkZHJVbnNQYWlyICZiKSBjb25zdCB7CisgICAgICAgIGlmKGZpcnN0ICE9IGIuZmlyc3QpIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYoc2Vjb25kICE9IGIuc2Vjb25kKSByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgQWRkclVuc1BhaXIgJmIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICFvcGVyYXRvcj09KGIpOworICAgIH0KK307CisKKworc3RhdGljIGludAorX19rbXBfYWZmaW5pdHlfY21wX0FkZHJlc3NfbGFiZWxzKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisgICAgY29uc3QgQWRkcmVzcyAqYWEgPSAoY29uc3QgQWRkcmVzcyAqKSYoKChBZGRyVW5zUGFpciAqKWEpCisgICAgICAtPmZpcnN0KTsKKyAgICBjb25zdCBBZGRyZXNzICpiYiA9IChjb25zdCBBZGRyZXNzICopJigoKEFkZHJVbnNQYWlyICopYikKKyAgICAgIC0+Zmlyc3QpOworICAgIHVuc2lnbmVkIGRlcHRoID0gYWEtPmRlcHRoOworICAgIHVuc2lnbmVkIGk7CisgICAgS01QX0RFQlVHX0FTU0VSVChkZXB0aCA9PSBiYi0+ZGVwdGgpOworICAgIGZvciAoaSAgPSAwOyBpIDwgZGVwdGg7IGkrKykgeworICAgICAgICBpZiAoYWEtPmxhYmVsc1tpXSA8IGJiLT5sYWJlbHNbaV0pIHJldHVybiAtMTsKKyAgICAgICAgaWYgKGFhLT5sYWJlbHNbaV0gPiBiYi0+bGFiZWxzW2ldKSByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludAorX19rbXBfYWZmaW5pdHlfY21wX0FkZHJlc3NfY2hpbGRfbnVtKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisgICAgY29uc3QgQWRkcmVzcyAqYWEgPSAoY29uc3QgQWRkcmVzcyAqKSYoKChBZGRyVW5zUGFpciAqKWEpCisgICAgICAtPmZpcnN0KTsKKyAgICBjb25zdCBBZGRyZXNzICpiYiA9IChjb25zdCBBZGRyZXNzICopJigoKEFkZHJVbnNQYWlyICopYikKKyAgICAgIC0+Zmlyc3QpOworICAgIHVuc2lnbmVkIGRlcHRoID0gYWEtPmRlcHRoOworICAgIHVuc2lnbmVkIGk7CisgICAgS01QX0RFQlVHX0FTU0VSVChkZXB0aCA9PSBiYi0+ZGVwdGgpOworICAgIEtNUF9ERUJVR19BU1NFUlQoKHVuc2lnbmVkKV9fa21wX2FmZmluaXR5X2NvbXBhY3QgPD0gZGVwdGgpOworICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfYWZmaW5pdHlfY29tcGFjdCA+PSAwKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgKHVuc2lnbmVkKV9fa21wX2FmZmluaXR5X2NvbXBhY3Q7IGkrKykgeworICAgICAgICBpbnQgaiA9IGRlcHRoIC0gaSAtIDE7CisgICAgICAgIGlmIChhYS0+Y2hpbGROdW1zW2pdIDwgYmItPmNoaWxkTnVtc1tqXSkgcmV0dXJuIC0xOworICAgICAgICBpZiAoYWEtPmNoaWxkTnVtc1tqXSA+IGJiLT5jaGlsZE51bXNbal0pIHJldHVybiAxOworICAgIH0KKyAgICBmb3IgKDsgaSA8IGRlcHRoOyBpKyspIHsKKyAgICAgICAgaW50IGogPSBpIC0gX19rbXBfYWZmaW5pdHlfY29tcGFjdDsKKyAgICAgICAgaWYgKGFhLT5jaGlsZE51bXNbal0gPCBiYi0+Y2hpbGROdW1zW2pdKSByZXR1cm4gLTE7CisgICAgICAgIGlmIChhYS0+Y2hpbGROdW1zW2pdID4gYmItPmNoaWxkTnVtc1tqXSkgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisKKy8qKiBBIHN0cnVjdHVyZSBmb3IgaG9sZGluZyBtYWNoaW5lLXNwZWNpZmljIGhpZXJhcmNoeSBpbmZvIHRvIGJlIGNvbXB1dGVkIG9uY2UgYXQgaW5pdC4KKyAgICBUaGlzIHN0cnVjdHVyZSByZXByZXNlbnRzIGEgbWFwcGluZyBvZiB0aHJlYWRzIHRvIHRoZSBhY3R1YWwgbWFjaGluZSBoaWVyYXJjaHksIG9yIHRvCisgICAgb3VyIGJlc3QgZ3Vlc3MgYXQgd2hhdCB0aGUgaGllcmFyY2h5IG1pZ2h0IGJlLCBmb3IgdGhlIHB1cnBvc2Ugb2YgcGVyZm9ybWluZyBhbgorICAgIGVmZmljaWVudCBiYXJyaWVyLiAgSW4gdGhlIHdvcnN0IGNhc2UsIHdoZW4gdGhlcmUgaXMgbm8gbWFjaGluZSBoaWVyYXJjaHkgaW5mb3JtYXRpb24sCisgICAgaXQgcHJvZHVjZXMgYSB0cmVlIHN1aXRhYmxlIGZvciBhIGJhcnJpZXIsIHNpbWlsYXIgdG8gdGhlIHRyZWUgdXNlZCBpbiB0aGUgaHlwZXIgYmFycmllci4gKi8KK2NsYXNzIGhpZXJhcmNoeV9pbmZvIHsKK3B1YmxpYzoKKyAgICAvKiogR29vZCBkZWZhdWx0IHZhbHVlcyBmb3IgbnVtYmVyIG9mIGxlYXZlcyBhbmQgYnJhbmNoaW5nIGZhY3RvciwgZ2l2ZW4gbm8gYWZmaW5pdHkgaW5mb3JtYXRpb24uCisJQmVoYXZlcyBhIGJpdCBsaWtlIGh5cGVyIGJhcnJpZXIuICovCisgICAgc3RhdGljIGNvbnN0IGttcF91aW50MzIgbWF4TGVhdmVzPTQ7CisgICAgc3RhdGljIGNvbnN0IGttcF91aW50MzIgbWluQnJhbmNoPTQ7CisgICAgLyoqIE51bWJlciBvZiBsZXZlbHMgaW4gdGhlIGhpZXJhcmNoeS4gVHlwaWNhbCBsZXZlbHMgYXJlIHRocmVhZHMvY29yZSwgY29yZXMvcGFja2FnZQorCW9yIHNvY2tldCwgcGFja2FnZXMvbm9kZSwgbm9kZXMvbWFjaGluZSwgZXRjLiAgV2UgZG9uJ3Qgd2FudCB0byBnZXQgc3BlY2lmaWMgd2l0aAorCW5vbWVuY2xhdHVyZS4gIFdoZW4gdGhlIG1hY2hpbmUgaXMgb3ZlcnN1YnNjcmliZWQgd2UgYWRkIGxldmVscyB0byBkdXBsaWNhdGUgdGhlCisJaGllcmFyY2h5LCBkb3VibGluZyB0aGUgdGhyZWFkIGNhcGFjaXR5IG9mIHRoZSBoaWVyYXJjaHkgZWFjaCB0aW1lIHdlIGFkZCBhIGxldmVsLiAqLworICAgIGttcF91aW50MzIgbWF4TGV2ZWxzOworCisgICAgLyoqIFRoaXMgaXMgc3BlY2lmaWNhbGx5IHRoZSBkZXB0aCBvZiB0aGUgbWFjaGluZSBjb25maWd1cmF0aW9uIGhpZXJhcmNoeSwgaW4gdGVybXMgb2YgdGhlCisgICAgICAgIG51bWJlciBvZiBsZXZlbHMgYWxvbmcgdGhlIGxvbmdlc3QgcGF0aCBmcm9tIHJvb3QgdG8gYW55IGxlYWYuIEl0IGNvcnJlc3BvbmRzIHRvIHRoZQorICAgICAgICBudW1iZXIgb2YgZW50cmllcyBpbiBudW1QZXJMZXZlbCBpZiB3ZSBleGNsdWRlIGFsbCBidXQgb25lIHRyYWlsaW5nIDEuICovCisgICAga21wX3VpbnQzMiBkZXB0aDsKKyAgICBrbXBfdWludDMyIGJhc2VfbnVtX3RocmVhZHM7CisgICAgZW51bSBpbml0X3N0YXR1cyB7IGluaXRpYWxpemVkPTAsIG5vdF9pbml0aWFsaXplZD0xLCBpbml0aWFsaXppbmc9MiB9OworICAgIHZvbGF0aWxlIGttcF9pbnQ4IHVuaW5pdGlhbGl6ZWQ7IC8vIDA9aW5pdGlhbGl6ZWQsIDE9bm90IGluaXRpYWxpemVkLCAyPWluaXRpYWxpemF0aW9uIGluIHByb2dyZXNzCisgICAgdm9sYXRpbGUga21wX2ludDggcmVzaXppbmc7IC8vIDA9bm90IHJlc2l6aW5nLCAxPXJlc2l6aW5nCisKKyAgICAvKiogTGV2ZWwgMCBjb3JyZXNwb25kcyB0byBsZWF2ZXMuIG51bVBlckxldmVsW2ldIGlzIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gdGhlIHBhcmVudCBvZiBhCisgICAgICAgIG5vZGUgYXQgbGV2ZWwgaSBoYXMuIEZvciBleGFtcGxlLCBpZiB3ZSBoYXZlIGEgbWFjaGluZSB3aXRoIDQgcGFja2FnZXMsIDQgY29yZXMvcGFja2FnZQorICAgICAgICBhbmQgMiBIVCBwZXIgY29yZSwgdGhlbiBudW1QZXJMZXZlbCA9IHsyLCA0LCA0LCAxLCAxfS4gQWxsIGVtcHR5IGxldmVscyBhcmUgc2V0IHRvIDEuICovCisgICAga21wX3VpbnQzMiAqbnVtUGVyTGV2ZWw7CisgICAga21wX3VpbnQzMiAqc2tpcFBlckxldmVsOworCisgICAgdm9pZCBkZXJpdmVMZXZlbHMoQWRkclVuc1BhaXIgKmFkcjJvcywgaW50IG51bV9hZGRycykgeworICAgICAgICBpbnQgaGllcl9kZXB0aCA9IGFkcjJvc1swXS5maXJzdC5kZXB0aDsKKyAgICAgICAgaW50IGxldmVsID0gMDsKKyAgICAgICAgZm9yIChpbnQgaT1oaWVyX2RlcHRoLTE7IGk+PTA7IC0taSkgeworICAgICAgICAgICAgaW50IG1heCA9IC0xOworICAgICAgICAgICAgZm9yIChpbnQgaj0wOyBqPG51bV9hZGRyczsgKytqKSB7CisgICAgICAgICAgICAgICAgaW50IG5leHQgPSBhZHIyb3Nbal0uZmlyc3QuY2hpbGROdW1zW2ldOworICAgICAgICAgICAgICAgIGlmIChuZXh0ID4gbWF4KSBtYXggPSBuZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgbnVtUGVyTGV2ZWxbbGV2ZWxdID0gbWF4KzE7CisgICAgICAgICAgICArK2xldmVsOworICAgICAgICB9CisgICAgfQorCisgICAgaGllcmFyY2h5X2luZm8oKSA6IG1heExldmVscyg3KSwgZGVwdGgoMSksIHVuaW5pdGlhbGl6ZWQobm90X2luaXRpYWxpemVkKSwgcmVzaXppbmcoMCkge30KKworICAgIHZvaWQgZmluaSgpIHsgaWYgKCF1bmluaXRpYWxpemVkICYmIG51bVBlckxldmVsKSBfX2ttcF9mcmVlKG51bVBlckxldmVsKTsgfQorCisgICAgdm9pZCBpbml0KEFkZHJVbnNQYWlyICphZHIyb3MsIGludCBudW1fYWRkcnMpCisgICAgeworICAgICAgICBrbXBfaW50OCBib29sX3Jlc3VsdCA9IEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1E4KCZ1bmluaXRpYWxpemVkLCBub3RfaW5pdGlhbGl6ZWQsIGluaXRpYWxpemluZyk7CisgICAgICAgIGlmIChib29sX3Jlc3VsdCA9PSAwKSB7IC8vIFdhaXQgZm9yIGluaXRpYWxpemF0aW9uCisgICAgICAgICAgICB3aGlsZSAoVENSXzEodW5pbml0aWFsaXplZCkgIT0gaW5pdGlhbGl6ZWQpIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGJvb2xfcmVzdWx0PT0xKTsKKworICAgICAgICAvKiBBZGRlZCBleHBsaWNpdCBpbml0aWFsaXphdGlvbiBvZiB0aGUgZGF0YSBmaWVsZHMgaGVyZSB0byBwcmV2ZW50IHVzYWdlIG9mIGRpcnR5IHZhbHVlCisgICAgICAgICAgIG9ic2VydmVkIHdoZW4gc3RhdGljIGxpYnJhcnkgaXMgcmUtaW5pdGlhbGl6ZWQgbXVsdGlwbGUgdGltZXMgKGUuZy4gd2hlbgorICAgICAgICAgICBub24tT3Blbk1QIHRocmVhZCByZXBlYXRlZGx5IGxhdW5jaGVzL2pvaW5zIHRocmVhZCB0aGF0IHVzZXMgT3Blbk1QKS4gKi8KKyAgICAgICAgZGVwdGggPSAxOworICAgICAgICByZXNpemluZyA9IDA7CisgICAgICAgIG1heExldmVscyA9IDc7CisgICAgICAgIG51bVBlckxldmVsID0gKGttcF91aW50MzIgKilfX2ttcF9hbGxvY2F0ZShtYXhMZXZlbHMqMipzaXplb2Yoa21wX3VpbnQzMikpOworICAgICAgICBza2lwUGVyTGV2ZWwgPSAmKG51bVBlckxldmVsW21heExldmVsc10pOworICAgICAgICBmb3IgKGttcF91aW50MzIgaT0wOyBpPG1heExldmVsczsgKytpKSB7IC8vIGluaXQgbnVtUGVyTGV2ZWxbKl0gdG8gMSBpdGVtIHBlciBsZXZlbAorICAgICAgICAgICAgbnVtUGVyTGV2ZWxbaV0gPSAxOworICAgICAgICAgICAgc2tpcFBlckxldmVsW2ldID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNvcnQgdGFibGUgYnkgcGh5c2ljYWwgSUQKKyAgICAgICAgaWYgKGFkcjJvcykgeworICAgICAgICAgICAgcXNvcnQoYWRyMm9zLCBudW1fYWRkcnMsIHNpemVvZigqYWRyMm9zKSwgX19rbXBfYWZmaW5pdHlfY21wX0FkZHJlc3NfbGFiZWxzKTsKKyAgICAgICAgICAgIGRlcml2ZUxldmVscyhhZHIyb3MsIG51bV9hZGRycyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBudW1QZXJMZXZlbFswXSA9IG1heExlYXZlczsKKyAgICAgICAgICAgIG51bVBlckxldmVsWzFdID0gbnVtX2FkZHJzL21heExlYXZlczsKKyAgICAgICAgICAgIGlmIChudW1fYWRkcnMlbWF4TGVhdmVzKSBudW1QZXJMZXZlbFsxXSsrOworICAgICAgICB9CisKKyAgICAgICAgYmFzZV9udW1fdGhyZWFkcyA9IG51bV9hZGRyczsKKyAgICAgICAgZm9yIChpbnQgaT1tYXhMZXZlbHMtMTsgaT49MDsgLS1pKSAvLyBjb3VudCBub24tZW1wdHkgbGV2ZWxzIHRvIGdldCBkZXB0aAorICAgICAgICAgICAgaWYgKG51bVBlckxldmVsW2ldICE9IDEgfHwgZGVwdGggPiAxKSAvLyBvbmx5IGNvdW50IG9uZSB0b3AtbGV2ZWwgJzEnCisgICAgICAgICAgICAgICAgZGVwdGgrKzsKKworICAgICAgICBrbXBfdWludDMyIGJyYW5jaCA9IG1pbkJyYW5jaDsKKyAgICAgICAgaWYgKG51bVBlckxldmVsWzBdID09IDEpIGJyYW5jaCA9IG51bV9hZGRycy9tYXhMZWF2ZXM7CisgICAgICAgIGlmIChicmFuY2g8bWluQnJhbmNoKSBicmFuY2g9bWluQnJhbmNoOworICAgICAgICBmb3IgKGttcF91aW50MzIgZD0wOyBkPGRlcHRoLTE7ICsrZCkgeyAvLyBvcHRpbWl6ZSBoaWVyYXJjaHkgd2lkdGgKKyAgICAgICAgICAgIHdoaWxlIChudW1QZXJMZXZlbFtkXSA+IGJyYW5jaCB8fCAoZD09MCAmJiBudW1QZXJMZXZlbFtkXT5tYXhMZWF2ZXMpKSB7IC8vIG1heCA0IG9uIGxldmVsIDAhCisgICAgICAgICAgICAgICAgaWYgKG51bVBlckxldmVsW2RdICYgMSkgbnVtUGVyTGV2ZWxbZF0rKzsKKyAgICAgICAgICAgICAgICBudW1QZXJMZXZlbFtkXSA9IG51bVBlckxldmVsW2RdID4+IDE7CisgICAgICAgICAgICAgICAgaWYgKG51bVBlckxldmVsW2QrMV0gPT0gMSkgZGVwdGgrKzsKKyAgICAgICAgICAgICAgICBudW1QZXJMZXZlbFtkKzFdID0gbnVtUGVyTGV2ZWxbZCsxXSA8PCAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYobnVtUGVyTGV2ZWxbMF0gPT0gMSkgeworICAgICAgICAgICAgICAgIGJyYW5jaCA9IGJyYW5jaCA+PiAxOworICAgICAgICAgICAgICAgIGlmIChicmFuY2g8NCkgYnJhbmNoID0gbWluQnJhbmNoOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChrbXBfdWludDMyIGk9MTsgaTxkZXB0aDsgKytpKQorICAgICAgICAgICAgc2tpcFBlckxldmVsW2ldID0gbnVtUGVyTGV2ZWxbaS0xXSAqIHNraXBQZXJMZXZlbFtpLTFdOworICAgICAgICAvLyBGaWxsIGluIGhpZXJhcmNoeSBpbiB0aGUgY2FzZSBvZiBvdmVyc3Vic2NyaXB0aW9uCisgICAgICAgIGZvciAoa21wX3VpbnQzMiBpPWRlcHRoOyBpPG1heExldmVsczsgKytpKQorICAgICAgICAgICAgc2tpcFBlckxldmVsW2ldID0gMipza2lwUGVyTGV2ZWxbaS0xXTsKKworICAgICAgICB1bmluaXRpYWxpemVkID0gaW5pdGlhbGl6ZWQ7IC8vIE9uZSB3cml0ZXIKKworICAgIH0KKworICAgIC8vIFJlc2l6ZSB0aGUgaGllcmFyY2h5IGlmIG5wcm9jIGNoYW5nZXMgdG8gc29tZXRoaW5nIGxhcmdlciB0aGFuIGJlZm9yZQorICAgIHZvaWQgcmVzaXplKGttcF91aW50MzIgbnByb2MpCisgICAgeworICAgICAgICBrbXBfaW50OCBib29sX3Jlc3VsdCA9IEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1E4KCZyZXNpemluZywgMCwgMSk7CisgICAgICAgIHdoaWxlIChib29sX3Jlc3VsdCA9PSAwKSB7IC8vIHNvbWVvbmUgZWxzZSBpcyB0cnlpbmcgdG8gcmVzaXplCisgICAgICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgICAgICBpZiAobnByb2MgPD0gYmFzZV9udW1fdGhyZWFkcykgIC8vIGhhcHB5IHdpdGggb3RoZXIgdGhyZWFkJ3MgcmVzaXplCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgZWxzZSAvLyB0cnkgdG8gcmVzaXplCisgICAgICAgICAgICAgICAgYm9vbF9yZXN1bHQgPSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNROCgmcmVzaXppbmcsIDAsIDEpOworICAgICAgICB9CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoYm9vbF9yZXN1bHQhPTApOworICAgICAgICBpZiAobnByb2MgPD0gYmFzZV9udW1fdGhyZWFkcykgcmV0dXJuOyAvLyBoYXBweSB3aXRoIG90aGVyIHRocmVhZCdzIHJlc2l6ZQorCisgICAgICAgIC8vIENhbGN1bGF0ZSBuZXcgbWF4TGV2ZWxzCisgICAgICAgIGttcF91aW50MzIgb2xkX3N6ID0gc2tpcFBlckxldmVsW2RlcHRoLTFdOworICAgICAgICBrbXBfdWludDMyIGluY3MgPSAwLCBvbGRfbWF4TGV2ZWxzID0gbWF4TGV2ZWxzOworICAgICAgICAvLyBGaXJzdCBzZWUgaWYgb2xkIG1heExldmVscyBpcyBlbm91Z2ggdG8gY29udGFpbiBuZXcgc2l6ZQorICAgICAgICBmb3IgKGttcF91aW50MzIgaT1kZXB0aDsgaTxtYXhMZXZlbHMgJiYgbnByb2M+b2xkX3N6OyArK2kpIHsKKyAgICAgICAgICAgIHNraXBQZXJMZXZlbFtpXSA9IDIqc2tpcFBlckxldmVsW2ktMV07CisgICAgICAgICAgICBudW1QZXJMZXZlbFtpLTFdICo9IDI7CisgICAgICAgICAgICBvbGRfc3ogKj0gMjsKKyAgICAgICAgICAgIGRlcHRoKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5wcm9jID4gb2xkX3N6KSB7IC8vIE5vdCBlbm91Z2ggc3BhY2UsIG5lZWQgdG8gZXhwYW5kIGhpZXJhcmNoeQorICAgICAgICAgICAgd2hpbGUgKG5wcm9jID4gb2xkX3N6KSB7CisgICAgICAgICAgICAgICAgb2xkX3N6ICo9MjsKKyAgICAgICAgICAgICAgICBpbmNzKys7CisgICAgICAgICAgICAgICAgZGVwdGgrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1heExldmVscyArPSBpbmNzOworCisgICAgICAgICAgICAvLyBSZXNpemUgYXJyYXlzCisgICAgICAgICAgICBrbXBfdWludDMyICpvbGRfbnVtUGVyTGV2ZWwgPSBudW1QZXJMZXZlbDsKKyAgICAgICAgICAgIGttcF91aW50MzIgKm9sZF9za2lwUGVyTGV2ZWwgPSBza2lwUGVyTGV2ZWw7CisgICAgICAgICAgICBudW1QZXJMZXZlbCA9IHNraXBQZXJMZXZlbCA9IE5VTEw7CisgICAgICAgICAgICBudW1QZXJMZXZlbCA9IChrbXBfdWludDMyICopX19rbXBfYWxsb2NhdGUobWF4TGV2ZWxzKjIqc2l6ZW9mKGttcF91aW50MzIpKTsKKyAgICAgICAgICAgIHNraXBQZXJMZXZlbCA9ICYobnVtUGVyTGV2ZWxbbWF4TGV2ZWxzXSk7CisKKyAgICAgICAgICAgIC8vIENvcHkgb2xkIGVsZW1lbnRzIGZyb20gb2xkIGFycmF5cworICAgICAgICAgICAgZm9yIChrbXBfdWludDMyIGk9MDsgaTxvbGRfbWF4TGV2ZWxzOyArK2kpIHsgLy8gaW5pdCBudW1QZXJMZXZlbFsqXSB0byAxIGl0ZW0gcGVyIGxldmVsCisgICAgICAgICAgICAgICAgbnVtUGVyTGV2ZWxbaV0gPSBvbGRfbnVtUGVyTGV2ZWxbaV07CisgICAgICAgICAgICAgICAgc2tpcFBlckxldmVsW2ldID0gb2xkX3NraXBQZXJMZXZlbFtpXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSW5pdCBuZXcgZWxlbWVudHMgaW4gYXJyYXlzIHRvIDEKKyAgICAgICAgICAgIGZvciAoa21wX3VpbnQzMiBpPW9sZF9tYXhMZXZlbHM7IGk8bWF4TGV2ZWxzOyArK2kpIHsgLy8gaW5pdCBudW1QZXJMZXZlbFsqXSB0byAxIGl0ZW0gcGVyIGxldmVsCisgICAgICAgICAgICAgICAgbnVtUGVyTGV2ZWxbaV0gPSAxOworICAgICAgICAgICAgICAgIHNraXBQZXJMZXZlbFtpXSA9IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEZyZWUgb2xkIGFycmF5cworICAgICAgICAgICAgX19rbXBfZnJlZShvbGRfbnVtUGVyTGV2ZWwpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRmlsbCBpbiBvdmVyc3Vic2NyaXB0aW9uIGxldmVscyBvZiBoaWVyYXJjaHkKKyAgICAgICAgZm9yIChrbXBfdWludDMyIGk9b2xkX21heExldmVsczsgaTxtYXhMZXZlbHM7ICsraSkKKyAgICAgICAgICAgIHNraXBQZXJMZXZlbFtpXSA9IDIqc2tpcFBlckxldmVsW2ktMV07CisKKyAgICAgICAgYmFzZV9udW1fdGhyZWFkcyA9IG5wcm9jOworICAgICAgICByZXNpemluZyA9IDA7IC8vIE9uZSB3cml0ZXIKKworICAgIH0KK307CisjZW5kaWYgLy8gS01QX0FGRklOSVRZX0gKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9hbGxvYy5jIGIvZmluYWwvcnVudGltZS9zcmMva21wX2FsbG9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE1MThjOQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9hbGxvYy5jCkBAIC0wLDAgKzEsMjA0OCBAQAorLyoKKyAqIGttcF9hbGxvYy5jIC0tIHByaXZhdGUvc2hhcmVkIGR5YW5taWMgbWVtb3J5IGFsbG9jYXRpb24gYW5kIG1hbmFnZW1lbnQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF93cmFwcGVyX21hbGxvYy5oIgorI2luY2x1ZGUgImttcF9pby5oIgorCisvLyBEaXNhYmxlIGJnZXQgd2hlbiBpdCBpcyBub3QgdXNlZAorI2lmIEtNUF9VU0VfQkdFVAorCisvKiBUaHJlYWQgcHJpdmF0ZSBidWZmZXIgbWFuYWdlbWVudCBjb2RlICovCisKK3R5cGVkZWYgaW50ICAgKCpiZ2V0X2NvbXBhY3RfdCkoc2l6ZV90LCBpbnQpOwordHlwZWRlZiB2b2lkICooKmJnZXRfYWNxdWlyZV90KShzaXplX3QpOwordHlwZWRlZiB2b2lkICAoKmJnZXRfcmVsZWFzZV90KSh2b2lkICopOworCisvKiBOT1RFOiBidWZzaXplIG11c3QgYmUgYSBzaWduZWQgZGF0YXR5cGUgKi8KKworI2lmIEtNUF9PU19XSU5ET1dTCisjIGlmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9BUk0KKyAgIHR5cGVkZWYga21wX2ludDMyIGJ1ZnNpemU7CisjIGVsc2UKKyAgIHR5cGVkZWYga21wX2ludDY0IGJ1ZnNpemU7CisjIGVuZGlmCisjZWxzZQorICB0eXBlZGVmIHNzaXplX3QgYnVmc2l6ZTsKKyNlbmRpZgorCisvKiBUaGUgdGhyZWUgbW9kZXMgb2Ygb3BlcmF0aW9uIGFyZSwgZmlmbyBzZWFyY2gsIGxpZm8gc2VhcmNoLCBhbmQgYmVzdC1maXQgKi8KKwordHlwZWRlZiBlbnVtIGJnZXRfbW9kZSB7CisgICAgYmdldF9tb2RlX2ZpZm8gPSAwLAorICAgIGJnZXRfbW9kZV9saWZvID0gMSwKKyAgICBiZ2V0X21vZGVfYmVzdCA9IDIKK30gYmdldF9tb2RlX3Q7CisKKworc3RhdGljIHZvaWQgICAgYnBvb2woIGttcF9pbmZvX3QgKnRoLCB2b2lkICpidWZmZXIsIGJ1ZnNpemUgbGVuKTsKK3N0YXRpYyB2b2lkICAgKmJnZXQoIGttcF9pbmZvX3QgKnRoLCBidWZzaXplIHNpemUpOworc3RhdGljIHZvaWQgICAqYmdldHooIGttcF9pbmZvX3QgKnRoLCBidWZzaXplIHNpemUpOworc3RhdGljIHZvaWQgICAqYmdldHIoIGttcF9pbmZvX3QgKnRoLCB2b2lkICpidWZmZXIsIGJ1ZnNpemUgbmV3c2l6ZSk7CitzdGF0aWMgdm9pZCAgICBicmVsKCBrbXBfaW5mb190ICp0aCwgdm9pZCAqYnVmKTsKK3N0YXRpYyB2b2lkICAgIGJlY3RsKCAga21wX2luZm9fdCAqdGgsIGJnZXRfY29tcGFjdF90IGNvbXBhY3QsIGJnZXRfYWNxdWlyZV90IGFjcXVpcmUsIGJnZXRfcmVsZWFzZV90IHJlbGVhc2UsIGJ1ZnNpemUgcG9vbF9pbmNyICk7CisKKyNpZmRlZiBLTVBfREVCVUcKK3N0YXRpYyB2b2lkICAgIGJzdGF0cygga21wX2luZm9fdCAqdGgsIGJ1ZnNpemUgKmN1cmFsbG9jLCBidWZzaXplICp0b3RmcmVlLCBidWZzaXplICptYXhmcmVlLCBsb25nICpuZ2V0LCBsb25nICpucmVsKTsKK3N0YXRpYyB2b2lkICAgIGJzdGF0c2UoIGttcF9pbmZvX3QgKnRoLCBidWZzaXplICpwb29sX2luY3IsIGxvbmcgKm5wb29sLCBsb25nICpucGdldCwgbG9uZyAqbnByZWwsIGxvbmcgKm5kZ2V0LCBsb25nICpuZHJlbCk7CitzdGF0aWMgdm9pZCAgICBidWZkdW1wKCBrbXBfaW5mb190ICp0aCwgdm9pZCAqYnVmKTsKK3N0YXRpYyB2b2lkICAgIGJwb29sZCgga21wX2luZm9fdCAqdGgsIHZvaWQgKnBvb2wsIGludCBkdW1wYWxsb2MsIGludCBkdW1wZnJlZSk7CitzdGF0aWMgaW50ICAgICBicG9vbHYoIGttcF9pbmZvX3QgKnRoLCB2b2lkICpwb29sKTsKKyNlbmRpZgorCisvKiBCR0VUIENPTkZJR1VSQVRJT04gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQnVmZmVyIGFsbG9jYXRpb24gc2l6ZSBxdWFudHVtOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGwgYnVmZmVycyBhbGxvY2F0ZWQgYXJlIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGUgb2YgdGhpcyBzaXplLiAgVGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVVNUIGJlIGEgcG93ZXIgb2YgdHdvLiAqLworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9uIElBLTMyIGFyY2hpdGVjdHVyZSB3aXRoICBMaW51eCogT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbGxvYygpIGRvZXMgbm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuc3VyZSAxNiBieXRlIGFsaWdubW5lbnQgKi8KKworI2lmIEtNUF9BUkNIX1g4NiB8fCAhS01QX0hBVkVfUVVBRAorCisjZGVmaW5lIFNpemVRdWFudCAgIDgKKyNkZWZpbmUgQWxpZ25UeXBlICAgZG91YmxlCisKKyNlbHNlCisKKyNkZWZpbmUgU2l6ZVF1YW50ICAgMTYKKyNkZWZpbmUgQWxpZ25UeXBlICAgX1F1YWQKKworI2VuZGlmCisKKyNkZWZpbmUgQnVmU3RhdHMgICAgMSAgICAgICAgICAgICAgICAgLyogRGVmaW5lIHRoaXMgc3ltYm9sIHRvIGVuYWJsZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnN0YXRzKCkgZnVuY3Rpb24gd2hpY2ggY2FsY3VsYXRlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdG90YWwgZnJlZSBzcGFjZSBpbiB0aGUgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvb2wsIHRoZSBsYXJnZXN0IGF2YWlsYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIGFuZCB0aGUgdG90YWwgc3BhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudGx5IGFsbG9jYXRlZC4gKi8KKworI2lmZGVmIEtNUF9ERUJVRworCisjZGVmaW5lIEJ1ZkR1bXAgICAgIDEgICAgICAgICAgICAgICAgIC8qIERlZmluZSB0aGlzIHN5bWJvbCB0byBlbmFibGUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJwb29sZCgpIGZ1bmN0aW9uIHdoaWNoIGR1bXBzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJzIGluIGEgYnVmZmVyIHBvb2wuICovCisKKyNkZWZpbmUgQnVmVmFsaWQgICAgMSAgICAgICAgICAgICAgICAgLyogRGVmaW5lIHRoaXMgc3ltYm9sIHRvIGVuYWJsZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnBvb2x2KCkgZnVuY3Rpb24gZm9yIHZhbGlkYXRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBidWZmZXIgcG9vbC4gKi8KKworI2RlZmluZSBEdW1wRGF0YSAgICAxICAgICAgICAgICAgICAgICAvKiBEZWZpbmUgdGhpcyBzeW1ib2wgdG8gZW5hYmxlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZkdW1wKCkgZnVuY3Rpb24gd2hpY2ggYWxsb3dzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1bXBpbmcgdGhlIGNvbnRlbnRzIG9mIGFuIGFsbG9jYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBmcmVlIGJ1ZmZlci4gKi8KKyNpZmRlZiBOT1RfVVNFRF9OT1cKKworI2RlZmluZSBGcmVlV2lwZSAgICAxICAgICAgICAgICAgICAgICAvKiBXaXBlIGZyZWUgYnVmZmVycyB0byBhIGd1YXJhbnRlZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiBvZiBnYXJiYWdlIHRvIHRyaXAgdXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzY3JlYW50cyB3aG8gYXR0ZW1wdCB0byB1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcnMgaW50byByZWxlYXNlZCBidWZmZXJzLiAqLworCisjZGVmaW5lIEJlc3RGaXQgICAgIDEgICAgICAgICAgICAgICAgIC8qIFVzZSBhIGJlc3QgZml0IGFsZ29yaXRobSB3aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaGluZyBmb3Igc3BhY2UgZm9yIGFuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRpb24gcmVxdWVzdC4gIFRoaXMgdXNlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkgbW9yZSBlZmZpY2llbnRseSwgYnV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRpb24gd2lsbCBiZSBtdWNoIHNsb3dlci4gKi8KKyNlbmRpZiAvKiBOT1RfVVNFRF9OT1cgKi8KKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKworCitzdGF0aWMgYnVmc2l6ZSBiZ2V0X2Jpbl9zaXplWyBdID0geworICAgIDAsCisvLyAgICAxIDw8IDYsICAgIC8qIC41IENhY2hlIGxpbmUgKi8KKyAgICAxIDw8IDcsICAgIC8qIDEgQ2FjaGUgbGluZSwgbmV3ICovCisgICAgMSA8PCA4LCAgICAvKiAyIENhY2hlIGxpbmVzICovCisgICAgMSA8PCA5LCAgICAvKiA0IENhY2hlIGxpbmVzLCBuZXcgKi8KKyAgICAxIDw8IDEwLCAgIC8qIDggQ2FjaGUgbGluZXMgKi8KKyAgICAxIDw8IDExLCAgIC8qIDE2IENhY2hlIGxpbmVzLCBuZXcgKi8KKyAgICAxIDw8IDEyLAorICAgIDEgPDwgMTMsICAgLyogbmV3ICovCisgICAgMSA8PCAxNCwKKyAgICAxIDw8IDE1LCAgIC8qIG5ldyAqLworICAgIDEgPDwgMTYsCisgICAgMSA8PCAxNywKKyAgICAxIDw8IDE4LAorICAgIDEgPDwgMTksCisgICAgMSA8PCAyMCwgICAgLyogIDFNQiAqLworICAgIDEgPDwgMjEsICAgIC8qICAyTUIgKi8KKyAgICAxIDw8IDIyLCAgICAvKiAgNE1CICovCisgICAgMSA8PCAyMywgICAgLyogIDhNQiAqLworICAgIDEgPDwgMjQsICAgIC8qIDE2TUIgKi8KKyAgICAxIDw8IDI1LCAgICAvKiAzMk1CICovCit9OworCisjZGVmaW5lIE1BWF9CR0VUX0JJTlMgICAoaW50KShzaXplb2YoYmdldF9iaW5fc2l6ZSkgLyBzaXplb2YoYnVmc2l6ZSkpCisKK3N0cnVjdCBiZmhlYWQ7CisKKy8qICBEZWNsYXJlIHRoZSBpbnRlcmZhY2UsIGluY2x1ZGluZyB0aGUgcmVxdWVzdGVkIGJ1ZmZlciBzaXplIHR5cGUsCisgICAgYnVmc2l6ZS4gICovCisKKy8qIFF1ZXVlIGxpbmtzICovCisKK3R5cGVkZWYgc3RydWN0IHFsaW5rcyB7CisgICAgc3RydWN0IGJmaGVhZCAqZmxpbms7ICAgICAgICAgICAgIC8qIEZvcndhcmQgbGluayAqLworICAgIHN0cnVjdCBiZmhlYWQgKmJsaW5rOyAgICAgICAgICAgICAvKiBCYWNrd2FyZCBsaW5rICovCit9IHFsaW5rc190OworCisvKiBIZWFkZXIgaW4gYWxsb2NhdGVkIGFuZCBmcmVlIGJ1ZmZlcnMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgYmhlYWQyIHsKKyAgICBrbXBfaW5mb190ICpidGhyOyAgICAgICAgICAgICAgICAgLyogVGhlIHRocmVhZCB3aGljaCBvd25zIHRoZSBidWZmZXIgcG9vbCAqLworICAgIGJ1ZnNpemUgICAgIHByZXZmcmVlOyAgICAgICAgICAgICAvKiBSZWxhdGl2ZSBsaW5rIGJhY2sgdG8gcHJldmlvdXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSBidWZmZXIgaW4gbWVtb3J5IG9yIDAgaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMgYnVmZmVyIGlzIGFsbG9jYXRlZC4gICovCisgICAgYnVmc2l6ZSAgICAgYnNpemU7ICAgICAgICAgICAgICAgIC8qIEJ1ZmZlciBzaXplOiBwb3NpdGl2ZSBpZiBmcmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWdhdGl2ZSBpZiBhbGxvY2F0ZWQuICovCit9IGJoZWFkMl90OworCisvKiBNYWtlIHN1cmUgdGhlIGJoZWFkIHN0cnVjdHVyZSBpcyBhIG11bHRpcGxlIG9mIFNpemVRdWFudCBpbiBzaXplLiAqLworCit0eXBlZGVmIHVuaW9uIGJoZWFkIHsKKyAgICBLTVBfQUxJR04oIFNpemVRdWFudCApCisgICAgQWxpZ25UeXBlICAgICAgICAgICBiX2FsaWduOworICAgIGNoYXIgICAgICAgICAgICAgICAgYl9wYWRbIHNpemVvZihiaGVhZDJfdCkgKyAoU2l6ZVF1YW50IC0gKHNpemVvZihiaGVhZDJfdCkgJSBTaXplUXVhbnQpKSBdOworICAgIGJoZWFkMl90ICAgICAgICAgICAgYmI7Cit9IGJoZWFkX3Q7CisjZGVmaW5lIEJIKHApICAgKChiaGVhZF90ICopIChwKSkKKworLyogIEhlYWRlciBpbiBkaXJlY3RseSBhbGxvY2F0ZWQgYnVmZmVycyAoYnkgYWNxZmNuKSAqLworCit0eXBlZGVmIHN0cnVjdCBiZGhlYWQKK3sKKyAgICBidWZzaXplIHRzaXplOyAgICAgICAgICAgICAgICAgICAgLyogVG90YWwgc2l6ZSwgaW5jbHVkaW5nIG92ZXJoZWFkICovCisgICAgYmhlYWRfdCBiaDsgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbW1vbiBoZWFkZXIgKi8KK30gYmRoZWFkX3Q7CisjZGVmaW5lIEJESChwKSAgKChiZGhlYWRfdCAqKSAocCkpCisKKy8qIEhlYWRlciBpbiBmcmVlIGJ1ZmZlcnMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgYmZoZWFkIHsKKyAgICBiaGVhZF90ICBiaDsgICAgICAgICAgICAgICAgICAgICAgLyogQ29tbW9uIGFsbG9jYXRlZC9mcmVlIGhlYWRlciAqLworICAgIHFsaW5rc190IHFsOyAgICAgICAgICAgICAgICAgICAgICAvKiBMaW5rcyBvbiBmcmVlIGxpc3QgKi8KK30gYmZoZWFkX3Q7CisjZGVmaW5lIEJGSChwKSAgKChiZmhlYWRfdCAqKSAocCkpCisKK3R5cGVkZWYgc3RydWN0IHRocl9kYXRhIHsKKyAgICBiZmhlYWRfdCBmcmVlbGlzdFsgTUFYX0JHRVRfQklOUyBdOworI2lmIEJ1ZlN0YXRzCisgICAgc2l6ZV90IHRvdGFsbG9jOyAgICAgICAgICAgICAgIC8qIFRvdGFsIHNwYWNlIGN1cnJlbnRseSBhbGxvY2F0ZWQgKi8KKyAgICBsb25nIG51bWdldCwgbnVtcmVsOyAgICAgICAgICAgLyogTnVtYmVyIG9mIGJnZXQoKSBhbmQgYnJlbCgpIGNhbGxzICovCisgICAgbG9uZyBudW1wYmxrOyAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBwb29sIGJsb2NrcyAqLworICAgIGxvbmcgbnVtcGdldCwgbnVtcHJlbDsgICAgICAgICAvKiBOdW1iZXIgb2YgYmxvY2sgZ2V0cyBhbmQgcmVscyAqLworICAgIGxvbmcgbnVtZGdldCwgbnVtZHJlbDsgICAgICAgICAvKiBOdW1iZXIgb2YgZGlyZWN0IGdldHMgYW5kIHJlbHMgKi8KKyNlbmRpZiAvKiBCdWZTdGF0cyAqLworCisgICAgLyogQXV0b21hdGljIGV4cGFuc2lvbiBibG9jayBtYW5hZ2VtZW50IGZ1bmN0aW9ucyAqLworICAgIGJnZXRfY29tcGFjdF90IGNvbXBmY247CisgICAgYmdldF9hY3F1aXJlX3QgYWNxZmNuOworICAgIGJnZXRfcmVsZWFzZV90IHJlbGZjbjsKKworICAgIGJnZXRfbW9kZV90ICAgIG1vZGU7ICAgICAgICAgICAgICAvKiB3aGF0IGFsbG9jYXRpb24gbW9kZSB0byB1c2U/ICovCisKKyAgICBidWZzaXplIGV4cF9pbmNyOyAgICAgICAgICAgICAgICAgLyogRXhwYW5zaW9uIGJsb2NrIHNpemUgKi8KKyAgICBidWZzaXplIHBvb2xfbGVuOyAgICAgICAgICAgICAgICAgLyogMDogbm8gYnBvb2wgY2FsbHMgaGF2ZSBiZWVuIG1hZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTE6IG5vdCBhbGwgcG9vbCBibG9ja3MgYXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc2FtZSBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4wOiAoY29tbW9uKSBibG9jayBzaXplIGZvciBhbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJwb29sIGNhbGxzIG1hZGUgc28gZmFyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgYmZoZWFkX3QgKiBsYXN0X3Bvb2w7ICAgICAgICAgICAgIC8qIExhc3QgcG9vbCBvd25lZCBieSB0aGlzIHRocmVhZCAoZGVsYXkgZGVhbG9jYXRpb24pICovCit9IHRocl9kYXRhX3Q7CisKKy8qICBNaW5pbXVtIGFsbG9jYXRpb24gcXVhbnR1bTogKi8KKworI2RlZmluZSBRTFNpemUgIChzaXplb2YocWxpbmtzX3QpKQorI2RlZmluZSBTaXplUSAgICgoU2l6ZVF1YW50ID4gUUxTaXplKSA/IFNpemVRdWFudCA6IFFMU2l6ZSkKKyNkZWZpbmUgTWF4U2l6ZSAoYnVmc2l6ZSkoIH4gKCAoIChidWZzaXplKSggMSApIDw8ICggc2l6ZW9mKCBidWZzaXplICkgKiBDSEFSX0JJVCAtIDEgKSApIHwgKCBTaXplUXVhbnQgLSAxICkgKSApCisgICAgLy8gTWF4aW11biBmb3IgdGhlIHJlcXVlc3RlZCBzaXplLgorCisvKiBFbmQgc2VudGluZWw6IHZhbHVlIHBsYWNlZCBpbiBic2l6ZSBmaWVsZCBvZiBkdW1teSBibG9jayBkZWxpbWl0aW5nCisgICBlbmQgb2YgcG9vbCBibG9jay4gIFRoZSBtb3N0IG5lZ2F0aXZlIG51bWJlciB3aGljaCB3aWxsICBmaXQgIGluICBhCisgICBidWZzaXplLCBkZWZpbmVkIGluIGEgd2F5IHRoYXQgdGhlIGNvbXBpbGVyIHdpbGwgYWNjZXB0LiAqLworCisjZGVmaW5lIEVTZW50ICAgKChidWZzaXplKSAoLSgoKCgoYnVmc2l6ZSkxKTw8KChpbnQpc2l6ZW9mKGJ1ZnNpemUpKjgtMikpLTEpKjIpLTIpKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogVGhyZWFkIERhdGEgbWFuYWdlbWVudCByb3V0aW5lcyAqLworCitzdGF0aWMgaW50CitiZ2V0X2dldF9iaW4oIGJ1ZnNpemUgc2l6ZSApCit7CisgICAgLy8gYmluYXJ5IGNob3AgYmlucworICAgIGludCBsbyA9IDAsIGhpID0gTUFYX0JHRVRfQklOUyAtIDE7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzaXplID4gMCApOworCisgICAgd2hpbGUgKCAoaGkgLSBsbykgPiAxICkgeworICAgICAgICBpbnQgbWlkID0gKGxvICsgaGkpID4+IDE7CisgICAgICAgIGlmIChzaXplIDwgYmdldF9iaW5fc2l6ZVsgbWlkIF0pCisgICAgICAgICAgICBoaSA9IG1pZCAtIDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGxvID0gbWlkOworICAgIH0KKworICAgIEtNUF9ERUJVR19BU1NFUlQoIChsbyA+PSAwKSAmJiAobG8gPCBNQVhfQkdFVF9CSU5TKSApOworCisgICAgcmV0dXJuIGxvOworfQorCitzdGF0aWMgdm9pZAorc2V0X3Rocl9kYXRhKCBrbXBfaW5mb190ICp0aCApCit7CisgICAgaW50IGk7CisgICAgdGhyX2RhdGFfdCAqZGF0YTsKKworICAgIGRhdGEgPQorICAgICAgICAodGhyX2RhdGFfdCAqKSgKKyAgICAgICAgICAgICggISB0aC0+dGgudGhfbG9jYWwuYmdldF9kYXRhICkgPyBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKCAqZGF0YSApICkgOiB0aC0+dGgudGhfbG9jYWwuYmdldF9kYXRhCisgICAgICAgICk7CisKKyAgICBtZW1zZXQoIGRhdGEsICdcMCcsIHNpemVvZiggKmRhdGEgKSApOworCisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9CR0VUX0JJTlM7ICsraSkgeworICAgICAgICBkYXRhLT5mcmVlbGlzdFsgaSBdLnFsLmZsaW5rID0gJiBkYXRhLT5mcmVlbGlzdFsgaSBdOworICAgICAgICBkYXRhLT5mcmVlbGlzdFsgaSBdLnFsLmJsaW5rID0gJiBkYXRhLT5mcmVlbGlzdFsgaSBdOworICAgIH0KKworICAgIHRoLT50aC50aF9sb2NhbC5iZ2V0X2RhdGEgPSBkYXRhOworICAgIHRoLT50aC50aF9sb2NhbC5iZ2V0X2xpc3QgPSAwOworI2lmICEgVVNFX0NNUF9YQ0hHX0ZPUl9CR0VUCisjaWZkZWYgVVNFX1FVRVVJTkdfTE9DS19GT1JfQkdFVAorICAgIF9fa21wX2luaXRfbG9jayggJiB0aC0+dGgudGhfbG9jYWwuYmdldF9sb2NrICk7CisjZWxzZQorICAgIF9fa21wX2luaXRfYm9vdHN0cmFwX2xvY2soICYgdGgtPnRoLnRoX2xvY2FsLmJnZXRfbG9jayApOworI2VuZGlmIC8qIFVTRV9MT0NLX0ZPUl9CR0VUICovCisjZW5kaWYgLyogISBVU0VfQ01QX1hDSEdfRk9SX0JHRVQgKi8KK30KKworc3RhdGljIHRocl9kYXRhX3QgKgorZ2V0X3Rocl9kYXRhKCBrbXBfaW5mb190ICp0aCApCit7CisgICAgdGhyX2RhdGFfdCAqZGF0YTsKKworICAgIGRhdGEgPSAodGhyX2RhdGFfdCAqKSB0aC0+dGgudGhfbG9jYWwuYmdldF9kYXRhOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggZGF0YSAhPSAwICk7CisKKyAgICByZXR1cm4gZGF0YTsKK30KKworCisjaWZkZWYgS01QX0RFQlVHCisKK3N0YXRpYyB2b2lkCitfX2ttcF9iZ2V0X3ZhbGlkYXRlX3F1ZXVlKCBrbXBfaW5mb190ICp0aCApCit7CisgICAgLyogTk9URTogYXNzdW1lIHRoYXQgdGhlIGdsb2JhbF9sb2NrIGlzIGhlbGQgKi8KKworICAgIHZvaWQgKnAgPSAodm9pZCAqKSB0aC0+dGgudGhfbG9jYWwuYmdldF9saXN0OworCisgICAgd2hpbGUgKHAgIT0gMCkgeworICAgICAgICBiZmhlYWRfdCAqYiA9IEJGSCgoKGNoYXIgKikgcCkgLSBzaXplb2YoYmhlYWRfdCkpOworCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoYi0+YmguYmIuYnNpemUgIT0gMCk7CisgICAgICAgIHAgPSAodm9pZCAqKSBiLT5xbC5mbGluazsKKyAgICB9Cit9CisKKyNlbmRpZgorCisvKiBXYWxrIHRoZSBmcmVlIGxpc3QgYW5kIHJlbGVhc2UgdGhlIGVucXVldWVkIGJ1ZmZlcnMgKi8KKworc3RhdGljIHZvaWQKK19fa21wX2JnZXRfZGVxdWV1ZSgga21wX2luZm9fdCAqdGggKQoreworICAgIHZvaWQgKnAgPSBUQ1JfU1lOQ19QVFIodGgtPnRoLnRoX2xvY2FsLmJnZXRfbGlzdCk7CisKKyAgICBpZiAocCAhPSAwKSB7CisgICAgICAgICNpZiBVU0VfQ01QX1hDSEdfRk9SX0JHRVQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2b2xhdGlsZSB2b2lkICpvbGRfdmFsdWUgPSBUQ1JfU1lOQ19QVFIodGgtPnRoLnRoX2xvY2FsLmJnZXRfbGlzdCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9QVFIoCisgICAgICAgICAgICAgICAgICAgICYgdGgtPnRoLnRoX2xvY2FsLmJnZXRfbGlzdCwgb2xkX3ZhbHVlLCBOVUxMICkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgICAgICAgICAgICAgICAgICBvbGRfdmFsdWUgPSBUQ1JfU1lOQ19QVFIodGgtPnRoLnRoX2xvY2FsLmJnZXRfbGlzdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHAgPSAodm9pZCAqKSBvbGRfdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICNlbHNlIC8qICEgVVNFX0NNUF9YQ0hHX0ZPUl9CR0VUICovCisgICAgICAgICAgICAjaWZkZWYgVVNFX1FVRVVJTkdfTE9DS19GT1JfQkdFVAorICAgICAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jayggJiB0aC0+dGgudGhfbG9jYWwuYmdldF9sb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCh0aCkgKTsKKyAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiB0aC0+dGgudGhfbG9jYWwuYmdldF9sb2NrICk7CisgICAgICAgICAgICAjZW5kaWYgLyogVVNFX1FVRVVJTkdfTE9DS19GT1JfQkdFVCAqLworCisgICAgICAgICAgICAgcCA9ICh2b2lkICopIHRoLT50aC50aF9sb2NhbC5iZ2V0X2xpc3Q7CisgICAgICAgICAgICAgdGgtPnRoLnRoX2xvY2FsLmJnZXRfbGlzdCA9IDA7CisKKyAgICAgICAgICAgICNpZmRlZiBVU0VfUVVFVUlOR19MT0NLX0ZPUl9CR0VUCisgICAgICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCAmIHRoLT50aC50aF9sb2NhbC5iZ2V0X2xvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKHRoKSApOworICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIHRoLT50aC50aF9sb2NhbC5iZ2V0X2xvY2sgKTsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICAjZW5kaWYgLyogVVNFX0NNUF9YQ0hHX0ZPUl9CR0VUICovCisKKyAgICAgICAgLyogQ2hlY2sgYWdhaW4gdG8gbWFrZSBzdXJlIHRoZSBsaXN0IGlzIG5vdCBlbXB0eSAqLworCisgICAgICAgIHdoaWxlIChwICE9IDApIHsKKyAgICAgICAgICAgIHZvaWQgKmJ1ZiA9IHA7CisgICAgICAgICAgICBiZmhlYWRfdCAqYiA9IEJGSCgoKGNoYXIgKikgcCkgLSBzaXplb2YoYmhlYWRfdCkpOworCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBiLT5iaC5iYi5ic2l6ZSAhPSAwICk7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAoIChrbXBfdWludHB0cl90KVRDUl9QVFIoYi0+YmguYmIuYnRocikgJiB+MSApID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrbXBfdWludHB0cl90KXRoICk7IC8vIGNsZWFyIHBvc3NpYmxlIG1hcmsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGItPnFsLmJsaW5rID09IDAgKTsKKworICAgICAgICAgICAgcCA9ICh2b2lkICopIGItPnFsLmZsaW5rOworCisgICAgICAgICAgICBicmVsKCB0aCwgYnVmICk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIENoYWluIHRvZ2V0aGVyIHRoZSBmcmVlIGJ1ZmZlcnMgYnkgdXNpbmcgdGhlIHRocmVhZCBvd25lciBmaWVsZCAqLworCitzdGF0aWMgdm9pZAorX19rbXBfYmdldF9lbnF1ZXVlKCBrbXBfaW5mb190ICp0aCwgdm9pZCAqYnVmCisjaWZkZWYgVVNFX1FVRVVJTkdfTE9DS19GT1JfQkdFVAorICAgICAgICAgICAgICAgICAgICAsIGttcF9pbnQzMiByZWxfZ3RpZAorI2VuZGlmCisgICAgICAgICAgICAgICAgICApCit7CisgICAgYmZoZWFkX3QgKmIgPSBCRkgoKChjaGFyICopIGJ1ZikgLSBzaXplb2YoYmhlYWRfdCkpOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggYi0+YmguYmIuYnNpemUgIT0gMCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoICggKGttcF91aW50cHRyX3QpVENSX1BUUihiLT5iaC5iYi5idGhyKSAmIH4xICkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgIChrbXBfdWludHB0cl90KXRoICk7IC8vIGNsZWFyIHBvc3NpYmxlIG1hcmsKKworICAgIGItPnFsLmJsaW5rID0gMDsKKworICAgIEtDX1RSQUNFKCAxMCwgKCAiX19rbXBfYmdldF9lbnF1ZXVlOiBtb3ZpbmcgYnVmZmVyIHRvIFQjJWQgbGlzdFxuIiwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGggKSApICk7CisKKyNpZiBVU0VfQ01QX1hDSEdfRk9SX0JHRVQKKyAgICB7CisgICAgICAgIHZvbGF0aWxlIHZvaWQgKm9sZF92YWx1ZSA9IFRDUl9QVFIodGgtPnRoLnRoX2xvY2FsLmJnZXRfbGlzdCk7CisgICAgICAgIC8qIHRoZSBuZXh0IHBvaW50ZXIgbXVzdCBiZSBzZXQgYmVmb3JlIHNldHRpbmcgYmdldF9saXN0IHRvIGJ1ZiB0byBhdm9pZAorICAgICAgICAgICBleHBvc2luZyBhIGJyb2tlbiBsaXN0IHRvIG90aGVyIHRocmVhZHMsIGV2ZW4gZm9yIGFuIGluc3RhbnQuICovCisgICAgICAgIGItPnFsLmZsaW5rID0gQkZIKCBvbGRfdmFsdWUgKTsKKworICAgICAgICB3aGlsZSAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1BUUigKKyAgICAgICAgICAgICYgdGgtPnRoLnRoX2xvY2FsLmJnZXRfbGlzdCwgb2xkX3ZhbHVlLCBidWYgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgICAgIG9sZF92YWx1ZSA9IFRDUl9QVFIodGgtPnRoLnRoX2xvY2FsLmJnZXRfbGlzdCk7CisgICAgICAgICAgICAvKiB0aGUgbmV4dCBwb2ludGVyIG11c3QgYmUgc2V0IGJlZm9yZSBzZXR0aW5nIGJnZXRfbGlzdCB0byBidWYgdG8gYXZvaWQKKyAgICAgICAgICAgICAgIGV4cG9zaW5nIGEgYnJva2VuIGxpc3QgdG8gb3RoZXIgdGhyZWFkcywgZXZlbiBmb3IgYW4gaW5zdGFudC4gKi8KKyAgICAgICAgICAgIGItPnFsLmZsaW5rID0gQkZIKCBvbGRfdmFsdWUgKTsKKyAgICAgICAgfQorICAgIH0KKyNlbHNlIC8qICEgVVNFX0NNUF9YQ0hHX0ZPUl9CR0VUICovCisjIGlmZGVmIFVTRV9RVUVVSU5HX0xPQ0tfRk9SX0JHRVQKKyAgICBfX2ttcF9hY3F1aXJlX2xvY2soICYgdGgtPnRoLnRoX2xvY2FsLmJnZXRfbG9jaywgcmVsX2d0aWQgKTsKKyMgZWxzZQorICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgdGgtPnRoLnRoX2xvY2FsLmJnZXRfbG9jayApOworICMgZW5kaWYKKworICAgIGItPnFsLmZsaW5rID0gQkZIKCB0aC0+dGgudGhfbG9jYWwuYmdldF9saXN0ICk7CisgICAgdGgtPnRoLnRoX2xvY2FsLmJnZXRfbGlzdCA9ICh2b2lkICopIGJ1ZjsKKworIyBpZmRlZiBVU0VfUVVFVUlOR19MT0NLX0ZPUl9CR0VUCisgICAgX19rbXBfcmVsZWFzZV9sb2NrKCAmIHRoLT50aC50aF9sb2NhbC5iZ2V0X2xvY2ssIHJlbF9ndGlkICk7CisjIGVsc2UKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIHRoLT50aC50aF9sb2NhbC5iZ2V0X2xvY2sgKTsKKyMgZW5kaWYKKyNlbmRpZiAvKiBVU0VfQ01QX1hDSEdfRk9SX0JHRVQgKi8KK30KKworLyogaW5zZXJ0IGJ1ZmZlciBiYWNrIG9udG8gYSBuZXcgZnJlZWxpc3QgKi8KKworc3RhdGljIHZvaWQKK19fa21wX2JnZXRfaW5zZXJ0X2ludG9fZnJlZWxpc3QoIHRocl9kYXRhX3QgKnRociwgYmZoZWFkX3QgKmIgKQoreworICAgIGludCBiaW47CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCAoKHNpemVfdCliICkgJSBTaXplUXVhbnQgPT0gMCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIGItPmJoLmJiLmJzaXplICUgU2l6ZVF1YW50ID09IDAgKTsKKworICAgIGJpbiA9IGJnZXRfZ2V0X2JpbiggYi0+YmguYmIuYnNpemUgKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQodGhyLT5mcmVlbGlzdFsgYmluIF0ucWwuYmxpbmstPnFsLmZsaW5rID09ICZ0aHItPmZyZWVsaXN0WyBiaW4gXSk7CisgICAgS01QX0RFQlVHX0FTU0VSVCh0aHItPmZyZWVsaXN0WyBiaW4gXS5xbC5mbGluay0+cWwuYmxpbmsgPT0gJnRoci0+ZnJlZWxpc3RbIGJpbiBdKTsKKworICAgIGItPnFsLmZsaW5rID0gJnRoci0+ZnJlZWxpc3RbIGJpbiBdOworICAgIGItPnFsLmJsaW5rID0gdGhyLT5mcmVlbGlzdFsgYmluIF0ucWwuYmxpbms7CisKKyAgICB0aHItPmZyZWVsaXN0WyBiaW4gXS5xbC5ibGluayA9IGI7CisgICAgYi0+cWwuYmxpbmstPnFsLmZsaW5rID0gYjsKK30KKworLyogdW5saW5rIHRoZSBidWZmZXIgZnJvbSB0aGUgb2xkIGZyZWVsaXN0ICovCisKK3N0YXRpYyB2b2lkCitfX2ttcF9iZ2V0X3JlbW92ZV9mcm9tX2ZyZWVsaXN0KCBiZmhlYWRfdCAqYiApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVChiLT5xbC5ibGluay0+cWwuZmxpbmsgPT0gYik7CisgICAgS01QX0RFQlVHX0FTU0VSVChiLT5xbC5mbGluay0+cWwuYmxpbmsgPT0gYik7CisKKyAgICBiLT5xbC5ibGluay0+cWwuZmxpbmsgPSBiLT5xbC5mbGluazsKKyAgICBiLT5xbC5mbGluay0+cWwuYmxpbmsgPSBiLT5xbC5ibGluazsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qICBHRVQgU1RBVFMgLS0gY2hlY2sgaW5mbyBvbiBmcmVlIGxpc3QgKi8KKworc3RhdGljIHZvaWQKK2JjaGVjayggIGttcF9pbmZvX3QgKnRoLCBidWZzaXplICptYXhfZnJlZSwgYnVmc2l6ZSAqdG90YWxfZnJlZSApCit7CisgICAgdGhyX2RhdGFfdCAqdGhyID0gZ2V0X3Rocl9kYXRhKCB0aCApOworICAgIGludCBiaW47CisKKyAgICAqdG90YWxfZnJlZSA9ICptYXhfZnJlZSA9IDA7CisKKyAgICBmb3IgKGJpbiA9IDA7IGJpbiA8IE1BWF9CR0VUX0JJTlM7ICsrYmluKSB7CisgICAgICAgIGJmaGVhZF90ICpiLCAqYmVzdDsKKworICAgICAgICBiZXN0ID0gJnRoci0+ZnJlZWxpc3RbIGJpbiBdOworICAgICAgICBiID0gYmVzdC0+cWwuZmxpbms7CisKKyAgICAgICAgd2hpbGUgKGIgIT0gJnRoci0+ZnJlZWxpc3RbIGJpbiBdKSB7CisgICAgICAgICAgICAqdG90YWxfZnJlZSArPSAoYi0+YmguYmIuYnNpemUgLSBzaXplb2YoIGJoZWFkX3QgKSk7CisgICAgICAgICAgICBpZiAoKGJlc3QgPT0gJnRoci0+ZnJlZWxpc3RbIGJpbiBdKSB8fCAoYi0+YmguYmIuYnNpemUgPCBiZXN0LT5iaC5iYi5ic2l6ZSkpCisgICAgICAgICAgICAgICAgYmVzdCA9IGI7CisKKyAgICAgICAgICAgIC8qIExpbmsgdG8gbmV4dCBidWZmZXIgKi8KKyAgICAgICAgICAgIGIgPSBiLT5xbC5mbGluazsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgqbWF4X2ZyZWUgPCBiZXN0LT5iaC5iYi5ic2l6ZSkKKyAgICAgICAgICAgICptYXhfZnJlZSA9IGJlc3QtPmJoLmJiLmJzaXplOworICAgIH0KKworICAgIGlmICgqbWF4X2ZyZWUgPiAoYnVmc2l6ZSlzaXplb2YoIGJoZWFkX3QgKSkKKyAgICAgICAgKm1heF9mcmVlIC09IHNpemVvZiggYmhlYWRfdCApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogIEJHRVQgIC0tICBBbGxvY2F0ZSBhIGJ1ZmZlci4gICovCisKK3N0YXRpYyB2b2lkICoKK2JnZXQoICBrbXBfaW5mb190ICp0aCwgYnVmc2l6ZSByZXF1ZXN0ZWRfc2l6ZSApCit7CisgICAgdGhyX2RhdGFfdCAqdGhyID0gZ2V0X3Rocl9kYXRhKCB0aCApOworICAgIGJ1ZnNpemUgc2l6ZSA9IHJlcXVlc3RlZF9zaXplOworICAgIGJmaGVhZF90ICpiOworICAgIHZvaWQgKmJ1ZjsKKyAgICBpbnQgY29tcGFjdHNlcSA9IDA7CisgICAgaW50IHVzZV9ibGluayA9IDA7CisvKiBGb3IgQmVzdEZpdCAqLworICAgIGJmaGVhZF90ICpiZXN0OworCisgICAgaWYgKCBzaXplIDwgMCB8fCBzaXplICsgc2l6ZW9mKCBiaGVhZF90ICkgPiBNYXhTaXplICkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9OyAvLyBpZgorCisgICAgX19rbXBfYmdldF9kZXF1ZXVlKCB0aCApOyAgICAgICAgIC8qIFJlbGVhc2UgYW55IHF1ZXVlZCBidWZmZXJzICovCisKKyAgICBpZiAoc2l6ZSA8IChidWZzaXplKVNpemVRKSB7ICAgICAgLyogTmVlZCBhdCBsZWFzdCByb29tIGZvciB0aGUgKi8KKyAgICAgICAgc2l6ZSA9IFNpemVROyAgICAgICAgICAgICAgICAgLyogICAgcXVldWUgbGlua3MuICAqLworICAgIH0KKyAgICAjaWYgZGVmaW5lZCggU2l6ZVF1YW50ICkgJiYgKCBTaXplUXVhbnQgPiAxICkKKyAgICAgICAgc2l6ZSA9IChzaXplICsgKFNpemVRdWFudCAtIDEpKSAmICh+KFNpemVRdWFudCAtIDEpKTsKKyAgICAjZW5kaWYKKworICAgIHNpemUgKz0gc2l6ZW9mKGJoZWFkX3QpOyAgICAgLyogQWRkIG92ZXJoZWFkIGluIGFsbG9jYXRlZCBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gc2l6ZSByZXF1aXJlZC4gKi8KKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzaXplID49IDAgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzaXplICUgU2l6ZVF1YW50ID09IDAgKTsKKworICAgIHVzZV9ibGluayA9ICggdGhyLT5tb2RlID09IGJnZXRfbW9kZV9saWZvICk7CisKKyAgICAvKiBJZiBhIGNvbXBhY3QgZnVuY3Rpb24gd2FzIHByb3ZpZGVkIGluIHRoZSBjYWxsIHRvIGJlY3RsKCksIHdyYXAKKyAgICAgICBhIGxvb3AgYXJvdW5kIHRoZSBhbGxvY2F0aW9uIHByb2Nlc3MgIHRvICBhbGxvdyAgY29tcGFjdGlvbiAgdG8KKyAgICAgICBpbnRlcnZlbmUgaW4gY2FzZSB3ZSBkb24ndCBmaW5kIGEgc3VpdGFibGUgYnVmZmVyIGluIHRoZSBjaGFpbi4gKi8KKworICAgIGZvciAoOzspIHsKKyAgICAgICAgaW50IGJpbjsKKworICAgICAgICBmb3IgKGJpbiA9IGJnZXRfZ2V0X2Jpbiggc2l6ZSApOyBiaW4gPCBNQVhfQkdFVF9CSU5TOyArK2JpbikgeworICAgICAgICAgICAgLyogTGluayB0byBuZXh0IGJ1ZmZlciAqLworICAgICAgICAgICAgYiA9ICggdXNlX2JsaW5rID8gdGhyLT5mcmVlbGlzdFsgYmluIF0ucWwuYmxpbmsgOiB0aHItPmZyZWVsaXN0WyBiaW4gXS5xbC5mbGluayApOworCisgICAgICAgICAgICBpZiAodGhyLT5tb2RlID09IGJnZXRfbW9kZV9iZXN0KSB7CisgICAgICAgICAgICAgICAgYmVzdCA9ICZ0aHItPmZyZWVsaXN0WyBiaW4gXTsKKworICAgICAgICAgICAgICAgIC8qIFNjYW4gdGhlIGZyZWUgbGlzdCBzZWFyY2hpbmcgZm9yIHRoZSBmaXJzdCBidWZmZXIgYmlnIGVub3VnaAorICAgICAgICAgICAgICAgICAgIHRvIGhvbGQgdGhlIHJlcXVlc3RlZCBzaXplIGJ1ZmZlci4gKi8KKworICAgICAgICAgICAgICAgIHdoaWxlIChiICE9ICZ0aHItPmZyZWVsaXN0WyBiaW4gXSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYi0+YmguYmIuYnNpemUgPj0gKGJ1ZnNpemUpIHNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYmVzdCA9PSAmdGhyLT5mcmVlbGlzdFsgYmluIF0pIHx8IChiLT5iaC5iYi5ic2l6ZSA8IGJlc3QtPmJoLmJiLmJzaXplKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3QgPSBiOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLyogTGluayB0byBuZXh0IGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgICBiID0gKCB1c2VfYmxpbmsgPyBiLT5xbC5ibGluayA6IGItPnFsLmZsaW5rICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGIgPSBiZXN0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3aGlsZSAoYiAhPSAmdGhyLT5mcmVlbGlzdFsgYmluIF0pIHsKKyAgICAgICAgICAgICAgICBpZiAoKGJ1ZnNpemUpIGItPmJoLmJiLmJzaXplID49IChidWZzaXplKSBzaXplKSB7CisKKyAgICAgICAgICAgICAgICAgICAgLyogQnVmZmVyICBpcyBiaWcgZW5vdWdoIHRvIHNhdGlzZnkgIHRoZSByZXF1ZXN0LiAgQWxsb2NhdGUgaXQKKyAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIGNhbGxlci4gIFdlIG11c3QgZGVjaWRlIHdoZXRoZXIgdGhlIGJ1ZmZlciBpcyAgbGFyZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgZW5vdWdoICB0byAgc3BsaXQgIGludG8gIHRoZSBwYXJ0IGdpdmVuIHRvIHRoZSBjYWxsZXIgYW5kIGEKKyAgICAgICAgICAgICAgICAgICAgICAgZnJlZSBidWZmZXIgdGhhdCByZW1haW5zIG9uIHRoZSBmcmVlIGxpc3QsIG9yICB3aGV0aGVyICB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgZW50aXJlICBidWZmZXIgIHNob3VsZCAgYmUgIHJlbW92ZWQgIGZyb20gdGhlIGZyZWUgbGlzdCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgZ2l2ZW4gdG8gdGhlIGNhbGxlciBpbiBpdHMgZW50aXJldHkuICAgV2UgIG9ubHkgIHNwbGl0ICB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyIGlmIGVub3VnaCByb29tIHJlbWFpbnMgZm9yIGEgaGVhZGVyIHBsdXMgdGhlIG1pbmltdW0KKyAgICAgICAgICAgICAgICAgICAgICAgcXVhbnR1bSBvZiBhbGxvY2F0aW9uLiAqLworCisgICAgICAgICAgICAgICAgICAgIGlmICgoYi0+YmguYmIuYnNpemUgLSAoYnVmc2l6ZSkgc2l6ZSkgPiAoYnVmc2l6ZSkoU2l6ZVEgKyAoc2l6ZW9mKGJoZWFkX3QpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJoZWFkX3QgKmJhLCAqYm47CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhID0gQkgoKChjaGFyICopIGIpICsgKGItPmJoLmJiLmJzaXplIC0gKGJ1ZnNpemUpIHNpemUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJuID0gQkgoKChjaGFyICopIGJhKSArIHNpemUpOworCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGJuLT5iYi5wcmV2ZnJlZSA9PSBiLT5iaC5iYi5ic2l6ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN1YnRyYWN0IHNpemUgZnJvbSBsZW5ndGggb2YgZnJlZSBibG9jay4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGItPmJoLmJiLmJzaXplIC09IChidWZzaXplKSBzaXplOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBMaW5rIGFsbG9jYXRlZCBidWZmZXIgdG8gdGhlIHByZXZpb3VzIGZyZWUgYnVmZmVyLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgYmEtPmJiLnByZXZmcmVlID0gYi0+YmguYmIuYnNpemU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBsdWcgbmVnYXRpdmUgc2l6ZSBpbnRvIHVzZXIgYnVmZmVyLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgYmEtPmJiLmJzaXplID0gLXNpemU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hcmsgdGhpcyBidWZmZXIgYXMgb3duZWQgYnkgdGhpcyB0aHJlYWQuICovCisgICAgICAgICAgICAgICAgICAgICAgICBUQ1dfUFRSKGJhLT5iYi5idGhyLCB0aCk7ICAgLy8gbm90IGFuIGFsbG9jYXRlZCBhZGRyZXNzIChkbyBub3QgbWFyayBpdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hcmsgYnVmZmVyIGFmdGVyIHRoaXMgb25lIG5vdCBwcmVjZWRlZCBieSBmcmVlIGJsb2NrLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgYm4tPmJiLnByZXZmcmVlID0gMDsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogdW5saW5rIHRoZSBidWZmZXIgZnJvbSB0aGUgb2xkIGZyZWVsaXN0LCBhbmQgcmVpbnNlcnQgaXQgaW50byB0aGUgbmV3IGZyZWVsaXN0ICovCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9iZ2V0X3JlbW92ZV9mcm9tX2ZyZWVsaXN0KCBiICk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9iZ2V0X2luc2VydF9pbnRvX2ZyZWVsaXN0KCB0aHIsIGIgKTsKKyNpZiBCdWZTdGF0cworICAgICAgICAgICAgICAgICAgICAgICAgdGhyLT50b3RhbGxvYyArPSAoc2l6ZV90KSBzaXplOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyLT5udW1nZXQrKzsgICAgICAgIC8qIEluY3JlbWVudCBudW1iZXIgb2YgYmdldCgpIGNhbGxzICovCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiA9ICh2b2lkICopICgoKChjaGFyICopIGJhKSArIHNpemVvZihiaGVhZF90KSkpOworICAgICAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggKChzaXplX3QpYnVmKSAlIFNpemVRdWFudCA9PSAwICk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnVmOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYmhlYWRfdCAqYmE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhID0gQkgoKChjaGFyICopIGIpICsgYi0+YmguYmIuYnNpemUpOworCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGJhLT5iYi5wcmV2ZnJlZSA9PSBiLT5iaC5iYi5ic2l6ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBidWZmZXIgaXNuJ3QgYmlnIGVub3VnaCB0byBzcGxpdC4gIEdpdmUgIHRoZSAgd2hvbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoZWJhbmcgdG8gdGhlIGNhbGxlciBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIGZyZWUgbGlzdC4gKi8KKworICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9iZ2V0X3JlbW92ZV9mcm9tX2ZyZWVsaXN0KCBiICk7CisjaWYgQnVmU3RhdHMKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoci0+dG90YWxsb2MgKz0gKHNpemVfdCkgYi0+YmguYmIuYnNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHItPm51bWdldCsrOyAgICAgICAgLyogSW5jcmVtZW50IG51bWJlciBvZiBiZ2V0KCkgY2FsbHMgKi8KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgLyogTmVnYXRlIHNpemUgdG8gbWFyayBidWZmZXIgYWxsb2NhdGVkLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgYi0+YmguYmIuYnNpemUgPSAtKGItPmJoLmJiLmJzaXplKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogTWFyayB0aGlzIGJ1ZmZlciBhcyBvd25lZCBieSB0aGlzIHRocmVhZC4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIFRDV19QVFIoYmEtPmJiLmJ0aHIsIHRoKTsgICAvLyBub3QgYW4gYWxsb2NhdGVkIGFkZHJlc3MgKGRvIG5vdCBtYXJrIGl0KQorICAgICAgICAgICAgICAgICAgICAgICAgLyogWmVybyB0aGUgYmFjayBwb2ludGVyIGluIHRoZSBuZXh0IGJ1ZmZlciBpbiBtZW1vcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGluZGljYXRlIHRoYXQgdGhpcyBidWZmZXIgaXMgYWxsb2NhdGVkLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgYmEtPmJiLnByZXZmcmVlID0gMDsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogR2l2ZSB1c2VyIGJ1ZmZlciBzdGFydGluZyBhdCBxdWV1ZSBsaW5rcy4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiA9ICAodm9pZCAqKSAmKGItPnFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoICgoc2l6ZV90KWJ1ZikgJSBTaXplUXVhbnQgPT0gMCApOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIExpbmsgdG8gbmV4dCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICBiID0gKCB1c2VfYmxpbmsgPyBiLT5xbC5ibGluayA6IGItPnFsLmZsaW5rICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBXZSBmYWlsZWQgdG8gZmluZCBhIGJ1ZmZlci4gIElmIHRoZXJlJ3MgYSBjb21wYWN0ICBmdW5jdGlvbgorICAgICAgICAgICBkZWZpbmVkLCAgbm90aWZ5ICBpdCAgb2YgdGhlIHNpemUgcmVxdWVzdGVkLiAgSWYgaXQgcmV0dXJucworICAgICAgICAgICBUUlVFLCB0cnkgdGhlIGFsbG9jYXRpb24gYWdhaW4uICovCisKKyAgICAgICAgaWYgKCh0aHItPmNvbXBmY24gPT0gMCkgfHwgKCEoKnRoci0+Y29tcGZjbikoc2l6ZSwgKytjb21wYWN0c2VxKSkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLyogTm8gYnVmZmVyIGF2YWlsYWJsZSB3aXRoIHJlcXVlc3RlZCBzaXplIGZyZWUuICovCisKKyAgICAvKiBEb24ndCBnaXZlIHVwIHlldCAtLSBsb29rIGluIHRoZSByZXNlcnZlIHN1cHBseS4gKi8KKworICAgIGlmICh0aHItPmFjcWZjbiAhPSAwKSB7CisgICAgICAgIGlmIChzaXplID4gKGJ1ZnNpemUpICh0aHItPmV4cF9pbmNyIC0gc2l6ZW9mKGJoZWFkX3QpKSkgeworCisgICAgICAgICAgICAvKiBSZXF1ZXN0ICBpcyAgdG9vICBsYXJnZSAgdG8gIGZpdCBpbiBhIHNpbmdsZSBleHBhbnNpb24KKyAgICAgICAgICAgICAgIGJsb2NrLiAgVHJ5IHRvIHNhdGlzeSBpdCBieSBhIGRpcmVjdCBidWZmZXIgYWNxdWlzaXRpb24uICovCisKKyAgICAgICAgICAgIGJkaGVhZF90ICpiZGg7CisKKyAgICAgICAgICAgIHNpemUgKz0gc2l6ZW9mKGJkaGVhZF90KSAtIHNpemVvZihiaGVhZF90KTsKKworICAgICAgICAgICAgS0VfVFJBQ0UoIDEwLCAoIiUlJSUlJSBNQUxMT0MoICVkIClcbiIsIChpbnQpIHNpemUgKSApOworCisgICAgICAgICAgICAvKiByaWNocnlhbiAqLworICAgICAgICAgICAgYmRoID0gQkRIKCgqdGhyLT5hY3FmY24pKChidWZzaXplKSBzaXplKSk7CisgICAgICAgICAgICBpZiAoYmRoICE9IE5VTEwpIHsKKworICAgICAgICAgICAgICAgIC8qICBNYXJrIHRoZSBidWZmZXIgc3BlY2lhbCBieSBzZXR0aW5nIHRoZSBzaXplIGZpZWxkCisgICAgICAgICAgICAgICAgICAgIG9mIGl0cyBoZWFkZXIgdG8gemVyby4gICovCisgICAgICAgICAgICAgICAgYmRoLT5iaC5iYi5ic2l6ZSA9IDA7CisKKyAgICAgICAgICAgICAgICAvKiBNYXJrIHRoaXMgYnVmZmVyIGFzIG93bmVkIGJ5IHRoaXMgdGhyZWFkLiAqLworICAgICAgICAgICAgICAgIFRDV19QVFIoYmRoLT5iaC5iYi5idGhyLCB0aCk7ICAvLyBkb24ndCBtYXJrIGJ1ZmZlciBhcyBhbGxvY2F0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgZGlyZWN0IGJ1ZmZlciBuZXZlciBnb2VzIHRvIGZyZWUgbGlzdAorICAgICAgICAgICAgICAgIGJkaC0+YmguYmIucHJldmZyZWUgPSAwOworICAgICAgICAgICAgICAgIGJkaC0+dHNpemUgPSBzaXplOworI2lmIEJ1ZlN0YXRzCisgICAgICAgICAgICAgICAgdGhyLT50b3RhbGxvYyArPSAoc2l6ZV90KSBzaXplOworICAgICAgICAgICAgICAgIHRoci0+bnVtZ2V0Kys7ICAgICAgICAvKiBJbmNyZW1lbnQgbnVtYmVyIG9mIGJnZXQoKSBjYWxscyAqLworICAgICAgICAgICAgICAgIHRoci0+bnVtZGdldCsrOyAgICAgICAvKiBEaXJlY3QgYmdldCgpIGNhbGwgY291bnQgKi8KKyNlbmRpZgorICAgICAgICAgICAgICAgIGJ1ZiA9ICAodm9pZCAqKSAoYmRoICsgMSk7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggKChzaXplX3QpYnVmKSAlIFNpemVRdWFudCA9PSAwICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAvKiAgVHJ5IHRvIG9idGFpbiBhIG5ldyBleHBhbnNpb24gYmxvY2sgKi8KKworICAgICAgICAgICAgdm9pZCAqbmV3cG9vbDsKKworICAgICAgICAgICAgS0VfVFJBQ0UoIDEwLCAoIiUlJSUlJSBNQUxMT0NCKCAlZCApXG4iLCAoaW50KSB0aHItPmV4cF9pbmNyICkgKTsKKworICAgICAgICAgICAgLyogcmljaHJ5YW4gKi8KKyAgICAgICAgICAgIG5ld3Bvb2wgPSAoKnRoci0+YWNxZmNuKSgoYnVmc2l6ZSkgdGhyLT5leHBfaW5jcik7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAoKHNpemVfdCluZXdwb29sKSAlIFNpemVRdWFudCA9PSAwICk7CisgICAgICAgICAgICBpZiAobmV3cG9vbCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgYnBvb2woIHRoLCBuZXdwb29sLCB0aHItPmV4cF9pbmNyKTsKKyAgICAgICAgICAgICAgICBidWYgPSAgYmdldCggdGgsIHJlcXVlc3RlZF9zaXplKTsgIC8qIFRoaXMgY2FuJ3QsIEkgc2F5LCBjYW4ndCBnZXQgaW50byBhIGxvb3AuICovCisgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qICBTdGlsbCBubyBidWZmZXIgYXZhaWxhYmxlICovCisKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyogIEJHRVRaICAtLSAgQWxsb2NhdGUgYSBidWZmZXIgYW5kIGNsZWFyIGl0cyBjb250ZW50cyB0byB6ZXJvLiAgV2UgY2xlYXIKKyAgICAgICAgICAgICAgIHRoZSAgZW50aXJlICBjb250ZW50cyAgb2YgIHRoZSBidWZmZXIgdG8gemVybywgbm90IGp1c3QgdGhlCisgICAgICAgICAgICAgICByZWdpb24gcmVxdWVzdGVkIGJ5IHRoZSBjYWxsZXIuICovCisKK3N0YXRpYyB2b2lkICoKK2JnZXR6KCAga21wX2luZm9fdCAqdGgsIGJ1ZnNpemUgc2l6ZSApCit7CisgICAgY2hhciAqYnVmID0gKGNoYXIgKikgYmdldCggdGgsIHNpemUpOworCisgICAgaWYgKGJ1ZiAhPSBOVUxMKSB7CisgICAgICAgIGJoZWFkX3QgKmI7CisgICAgICAgIGJ1ZnNpemUgcnNpemU7CisKKyAgICAgICAgYiA9IEJIKGJ1ZiAtIHNpemVvZihiaGVhZF90KSk7CisgICAgICAgIHJzaXplID0gLShiLT5iYi5ic2l6ZSk7CisgICAgICAgIGlmIChyc2l6ZSA9PSAwKSB7CisgICAgICAgICAgICBiZGhlYWRfdCAqYmQ7CisKKyAgICAgICAgICAgIGJkID0gQkRIKGJ1ZiAtIHNpemVvZihiZGhlYWRfdCkpOworICAgICAgICAgICAgcnNpemUgPSBiZC0+dHNpemUgLSAoYnVmc2l6ZSkgc2l6ZW9mKGJkaGVhZF90KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJzaXplIC09IHNpemVvZihiaGVhZF90KTsKKyAgICAgICAgfQorCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQocnNpemUgPj0gc2l6ZSk7CisKKyAgICAgICAgKHZvaWQpIG1lbXNldChidWYsIDAsIChidWZzaXplKSByc2l6ZSk7CisgICAgfQorICAgIHJldHVybiAoKHZvaWQgKikgYnVmKTsKK30KKworLyogIEJHRVRSICAtLSAgUmVhbGxvY2F0ZSBhIGJ1ZmZlci4gIFRoaXMgaXMgYSBtaW5pbWFsIGltcGxlbWVudGF0aW9uLAorICAgICAgICAgICAgICAgc2ltcGx5IGluIHRlcm1zIG9mIGJyZWwoKSAgYW5kICBiZ2V0KCkuICAgSXQgIGNvdWxkICBiZQorICAgICAgICAgICAgICAgZW5oYW5jZWQgdG8gYWxsb3cgdGhlIGJ1ZmZlciB0byBncm93IGludG8gYWRqYWNlbnQgZnJlZQorICAgICAgICAgICAgICAgYmxvY2tzIGFuZCB0byBhdm9pZCBtb3ZpbmcgZGF0YSB1bm5lY2Vzc2FyaWx5LiAgKi8KKworc3RhdGljIHZvaWQgKgorYmdldHIoICBrbXBfaW5mb190ICp0aCwgdm9pZCAqYnVmLCBidWZzaXplIHNpemUpCit7CisgICAgdm9pZCAqbmJ1ZjsKKyAgICBidWZzaXplIG9zaXplOyAgICAgICAgICAgICAgICAgICAgLyogT2xkIHNpemUgb2YgYnVmZmVyICovCisgICAgYmhlYWRfdCAqYjsKKworICAgIG5idWYgPSBiZ2V0KCB0aCwgc2l6ZSApOworICAgIGlmICggbmJ1ZiA9PSBOVUxMICkgeyAvKiBBY3F1aXJlIG5ldyBidWZmZXIgKi8KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICggYnVmID09IE5VTEwgKSB7CisgICAgICAgIHJldHVybiBuYnVmOworICAgIH0KKyAgICBiID0gQkgoKChjaGFyICopIGJ1ZikgLSBzaXplb2YoYmhlYWRfdCkpOworICAgIG9zaXplID0gLWItPmJiLmJzaXplOworICAgIGlmIChvc2l6ZSA9PSAwKSB7CisgICAgICAgIC8qICBCdWZmZXIgYWNxdWlyZWQgZGlyZWN0bHkgdGhyb3VnaCBhY3FmY24uICovCisgICAgICAgIGJkaGVhZF90ICpiZDsKKworICAgICAgICBiZCA9IEJESCgoKGNoYXIgKikgYnVmKSAtIHNpemVvZihiZGhlYWRfdCkpOworICAgICAgICBvc2l6ZSA9IGJkLT50c2l6ZSAtIChidWZzaXplKSBzaXplb2YoYmRoZWFkX3QpOworICAgIH0gZWxzZSB7CisgICAgICAgIG9zaXplIC09IHNpemVvZihiaGVhZF90KTsKKyAgICB9OworCisgICAgS01QX0RFQlVHX0FTU0VSVChvc2l6ZSA+IDApOworCisgICAgKHZvaWQpIEtNUF9NRU1DUFkoKGNoYXIgKikgbmJ1ZiwgKGNoYXIgKikgYnVmLCAvKiBDb3B5IHRoZSBkYXRhICovCisgICAgICAgICAgICAgKHNpemVfdCkgKChzaXplIDwgb3NpemUpID8gc2l6ZSA6IG9zaXplKSk7CisgICAgYnJlbCggdGgsIGJ1ZiApOworCisgICAgcmV0dXJuIG5idWY7Cit9CisKKy8qICBCUkVMICAtLSAgUmVsZWFzZSBhIGJ1ZmZlci4gICovCisKK3N0YXRpYyB2b2lkCiticmVsKCAga21wX2luZm9fdCAqdGgsIHZvaWQgKmJ1ZiApCit7CisgICAgdGhyX2RhdGFfdCAqdGhyID0gZ2V0X3Rocl9kYXRhKCB0aCApOworICAgIGJmaGVhZF90ICpiLCAqYm47CisgICAga21wX2luZm9fdCAqYnRoOworCisgICAgS01QX0RFQlVHX0FTU0VSVChidWYgIT0gTlVMTCk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggKChzaXplX3QpYnVmKSAlIFNpemVRdWFudCA9PSAwICk7CisKKyAgICBiID0gQkZIKCgoY2hhciAqKSBidWYpIC0gc2l6ZW9mKGJoZWFkX3QpKTsKKworICAgIGlmIChiLT5iaC5iYi5ic2l6ZSA9PSAwKSB7ICAgICAgICAvKiBEaXJlY3RseS1hY3F1aXJlZCBidWZmZXI/ICovCisgICAgICAgIGJkaGVhZF90ICpiZGg7CisKKyAgICAgICAgYmRoID0gQkRIKCgoY2hhciAqKSBidWYpIC0gc2l6ZW9mKGJkaGVhZF90KSk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoYi0+YmguYmIucHJldmZyZWUgPT0gMCk7CisjaWYgQnVmU3RhdHMKKyAgICAgICAgdGhyLT50b3RhbGxvYyAtPSAoc2l6ZV90KSBiZGgtPnRzaXplOworICAgICAgICB0aHItPm51bWRyZWwrKzsgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgZGlyZWN0IHJlbGVhc2VzICovCisgICAgICAgIHRoci0+bnVtcmVsKys7ICAgICAgICAgICAgICAgIC8qIEluY3JlbWVudCBudW1iZXIgb2YgYnJlbCgpIGNhbGxzICovCisjZW5kaWYgLyogQnVmU3RhdHMgKi8KKyNpZmRlZiBGcmVlV2lwZQorICAgICAgICAodm9pZCkgbWVtc2V0KChjaGFyICopIGJ1ZiwgMHg1NSwKKyAgICAgICAgICAgICAgICAgKHNpemVfdCkgKGJkaC0+dHNpemUgLSBzaXplb2YoYmRoZWFkX3QpKSk7CisjZW5kaWYgLyogRnJlZVdpcGUgKi8KKworICAgICAgICBLRV9UUkFDRSggMTAsICgiJSUlJSUlIEZSRUUoICVwIClcbiIsICh2b2lkICopIGJkaCApICk7CisKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGhyLT5yZWxmY24gIT0gMCApOworICAgICAgICAoKnRoci0+cmVsZmNuKSgodm9pZCAqKSBiZGgpOyAgICAgIC8qIFJlbGVhc2UgaXQgZGlyZWN0bHkuICovCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBidGggPSAoa21wX2luZm9fdCAqKSggKGttcF91aW50cHRyX3QpVENSX1BUUihiLT5iaC5iYi5idGhyKSAmIH4xICk7IC8vIGNsZWFyIHBvc3NpYmxlIG1hcmsgYmVmb3JlIGNvbXBhcmlzb24KKyAgICBpZiAoIGJ0aCAhPSB0aCApIHsKKyAgICAgICAgLyogQWRkIHRoaXMgYnVmZmVyIHRvIGJlIHJlbGVhc2VkIGJ5IHRoZSBvd25pbmcgdGhyZWFkIGxhdGVyICovCisgICAgICAgIF9fa21wX2JnZXRfZW5xdWV1ZSggYnRoLCBidWYKKyNpZmRlZiBVU0VfUVVFVUlOR19MT0NLX0ZPUl9CR0VUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aCApCisjZW5kaWYKKyAgICAgICAgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIEJ1ZmZlciBzaXplIG11c3QgYmUgbmVnYXRpdmUsIGluZGljYXRpbmcgdGhhdCB0aGUgYnVmZmVyIGlzCisgICAgICAgYWxsb2NhdGVkLiAqLworCisgICAgaWYgKGItPmJoLmJiLmJzaXplID49IDApIHsKKyAgICAgICAgYm4gPSBOVUxMOworICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKGItPmJoLmJiLmJzaXplIDwgMCk7CisKKyAgICAvKiAgQmFjayBwb2ludGVyIGluIG5leHQgYnVmZmVyIG11c3QgYmUgemVybywgaW5kaWNhdGluZyB0aGUKKyAgICAgICAgc2FtZSB0aGluZzogKi8KKworICAgIEtNUF9ERUJVR19BU1NFUlQoQkgoKGNoYXIgKikgYiAtIGItPmJoLmJiLmJzaXplKS0+YmIucHJldmZyZWUgPT0gMCk7CisKKyNpZiBCdWZTdGF0cworICAgIHRoci0+bnVtcmVsKys7ICAgICAgICAgICAgICAgICAgICAvKiBJbmNyZW1lbnQgbnVtYmVyIG9mIGJyZWwoKSBjYWxscyAqLworICAgIHRoci0+dG90YWxsb2MgKz0gKHNpemVfdCkgYi0+YmguYmIuYnNpemU7CisjZW5kaWYKKworICAgIC8qIElmIHRoZSBiYWNrIGxpbmsgaXMgbm9uemVybywgdGhlIHByZXZpb3VzIGJ1ZmZlciBpcyBmcmVlLiAgKi8KKworICAgIGlmIChiLT5iaC5iYi5wcmV2ZnJlZSAhPSAwKSB7CisgICAgICAgIC8qIFRoZSBwcmV2aW91cyBidWZmZXIgaXMgZnJlZS4gIENvbnNvbGlkYXRlIHRoaXMgYnVmZmVyICB3aXRoICBpdAorICAgICAgICAgICBieSAgYWRkaW5nICB0aGUgIGxlbmd0aCAgb2YgIHRoaXMgIGJ1ZmZlciAgdG8gdGhlIHByZXZpb3VzIGZyZWUKKyAgICAgICAgICAgYnVmZmVyLiAgTm90ZSB0aGF0IHdlIHN1YnRyYWN0IHRoZSBzaXplICBpbiAgdGhlICBidWZmZXIgIGJlaW5nCisgICAgICAgICAgIHJlbGVhc2VkLCAgc2luY2UgIGl0J3MgIG5lZ2F0aXZlIHRvIGluZGljYXRlIHRoYXQgdGhlIGJ1ZmZlciBpcworICAgICAgICAgICBhbGxvY2F0ZWQuICovCisKKyAgICAgICAgcmVnaXN0ZXIgYnVmc2l6ZSBzaXplID0gYi0+YmguYmIuYnNpemU7CisKKyAgICAgICAgLyogTWFrZSB0aGUgcHJldmlvdXMgYnVmZmVyIHRoZSBvbmUgd2UncmUgd29ya2luZyBvbi4gKi8KKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChCSCgoY2hhciAqKSBiIC0gYi0+YmguYmIucHJldmZyZWUpLT5iYi5ic2l6ZSA9PSBiLT5iaC5iYi5wcmV2ZnJlZSk7CisgICAgICAgIGIgPSBCRkgoKChjaGFyICopIGIpIC0gYi0+YmguYmIucHJldmZyZWUpOworICAgICAgICBiLT5iaC5iYi5ic2l6ZSAtPSBzaXplOworCisgICAgICAgIC8qIHVubGluayB0aGUgYnVmZmVyIGZyb20gdGhlIG9sZCBmcmVlbGlzdCAqLworICAgICAgICBfX2ttcF9iZ2V0X3JlbW92ZV9mcm9tX2ZyZWVsaXN0KCBiICk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBUaGUgcHJldmlvdXMgYnVmZmVyIGlzbid0IGFsbG9jYXRlZC4gIE1hcmsgdGhpcyBidWZmZXIKKyAgICAgICAgICAgc2l6ZSBhcyBwb3NpdGl2ZSAoaS5lLiBmcmVlKSBhbmQgZmFsbCB0aHJvdWdoIHRvIHBsYWNlCisgICAgICAgICAgIHRoZSBidWZmZXIgb24gdGhlIGZyZWUgbGlzdCBhcyBhbiBpc29sYXRlZCBmcmVlIGJsb2NrLiAqLworCisgICAgICAgIGItPmJoLmJiLmJzaXplID0gLWItPmJoLmJiLmJzaXplOworICAgIH0KKworICAgIC8qIGluc2VydCBidWZmZXIgYmFjayBvbnRvIGEgbmV3IGZyZWVsaXN0ICovCisgICAgX19rbXBfYmdldF9pbnNlcnRfaW50b19mcmVlbGlzdCggdGhyLCBiICk7CisKKworICAgIC8qIE5vdyB3ZSBsb29rIGF0IHRoZSBuZXh0IGJ1ZmZlciBpbiBtZW1vcnksIGxvY2F0ZWQgYnkgYWR2YW5jaW5nIGZyb20KKyAgICAgICB0aGUgIHN0YXJ0ICBvZiAgdGhpcyAgYnVmZmVyICBieSBpdHMgc2l6ZSwgdG8gc2VlIGlmIHRoYXQgYnVmZmVyIGlzCisgICAgICAgZnJlZS4gIElmIGl0IGlzLCB3ZSBjb21iaW5lICB0aGlzICBidWZmZXIgIHdpdGggIHRoZSAgbmV4dCAgb25lICBpbgorICAgICAgIG1lbW9yeSwgZGVjaGFpbmluZyB0aGUgc2Vjb25kIGJ1ZmZlciBmcm9tIHRoZSBmcmVlIGxpc3QuICovCisKKyAgICBibiA9ICBCRkgoKChjaGFyICopIGIpICsgYi0+YmguYmIuYnNpemUpOworICAgIGlmIChibi0+YmguYmIuYnNpemUgPiAwKSB7CisKKyAgICAgICAgLyogVGhlIGJ1ZmZlciBpcyBmcmVlLiAgUmVtb3ZlIGl0IGZyb20gdGhlIGZyZWUgbGlzdCBhbmQgYWRkCisgICAgICAgICAgIGl0cyBzaXplIHRvIHRoYXQgb2Ygb3VyIGJ1ZmZlci4gKi8KKworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKEJIKChjaGFyICopIGJuICsgYm4tPmJoLmJiLmJzaXplKS0+YmIucHJldmZyZWUgPT0gYm4tPmJoLmJiLmJzaXplKTsKKworICAgICAgICBfX2ttcF9iZ2V0X3JlbW92ZV9mcm9tX2ZyZWVsaXN0KCBibiApOworCisgICAgICAgIGItPmJoLmJiLmJzaXplICs9IGJuLT5iaC5iYi5ic2l6ZTsKKworICAgICAgICAvKiB1bmxpbmsgdGhlIGJ1ZmZlciBmcm9tIHRoZSBvbGQgZnJlZWxpc3QsIGFuZCByZWluc2VydCBpdCBpbnRvIHRoZSBuZXcgZnJlZWxpc3QgKi8KKworICAgICAgICBfX2ttcF9iZ2V0X3JlbW92ZV9mcm9tX2ZyZWVsaXN0KCBiICk7CisgICAgICAgIF9fa21wX2JnZXRfaW5zZXJ0X2ludG9fZnJlZWxpc3QoIHRociwgYiApOworCisgICAgICAgIC8qIEZpbmFsbHksICBhZHZhbmNlICB0byAgIHRoZSAgYnVmZmVyICB0aGF0ICAgZm9sbG93cyAgdGhlICBuZXdseQorICAgICAgICAgICBjb25zb2xpZGF0ZWQgZnJlZSBibG9jay4gIFdlIG11c3Qgc2V0IGl0cyAgYmFja3BvaW50ZXIgIHRvICB0aGUKKyAgICAgICAgICAgaGVhZCAgb2YgIHRoZSAgY29uc29saWRhdGVkIGZyZWUgYmxvY2suICBXZSBrbm93IHRoZSBuZXh0IGJsb2NrCisgICAgICAgICAgIG11c3QgYmUgYW4gYWxsb2NhdGVkIGJsb2NrIGJlY2F1c2UgdGhlIHByb2Nlc3Mgb2YgcmVjb21iaW5hdGlvbgorICAgICAgICAgICBndWFyYW50ZWVzICB0aGF0ICB0d28gIGZyZWUgIGJsb2NrcyB3aWxsIG5ldmVyIGJlIGNvbnRpZ3VvdXMgaW4KKyAgICAgICAgICAgbWVtb3J5LiAgKi8KKworICAgICAgICBibiA9IEJGSCgoKGNoYXIgKikgYikgKyBiLT5iaC5iYi5ic2l6ZSk7CisgICAgfQorI2lmZGVmIEZyZWVXaXBlCisgICAgKHZvaWQpIG1lbXNldCgoKGNoYXIgKikgYikgKyBzaXplb2YoYmZoZWFkX3QpLCAweDU1LAorICAgICAgICAgICAgKHNpemVfdCkgKGItPmJoLmJiLmJzaXplIC0gc2l6ZW9mKGJmaGVhZF90KSkpOworI2VuZGlmCisgICAgS01QX0RFQlVHX0FTU0VSVChibi0+YmguYmIuYnNpemUgPCAwKTsKKworICAgIC8qIFRoZSBuZXh0IGJ1ZmZlciBpcyBhbGxvY2F0ZWQuICBTZXQgdGhlIGJhY2twb2ludGVyIGluIGl0ICB0byAgcG9pbnQKKyAgICAgICB0byB0aGlzIGJ1ZmZlcjsgdGhlIHByZXZpb3VzIGZyZWUgYnVmZmVyIGluIG1lbW9yeS4gKi8KKworICAgIGJuLT5iaC5iYi5wcmV2ZnJlZSA9IGItPmJoLmJiLmJzaXplOworCisgICAgLyogIElmICBhICBibG9jay1yZWxlYXNlIGZ1bmN0aW9uIGlzIGRlZmluZWQsIGFuZCB0aGlzIGZyZWUgYnVmZmVyCisgICAgICAgIGNvbnN0aXR1dGVzIHRoZSBlbnRpcmUgYmxvY2ssIHJlbGVhc2UgaXQuICBOb3RlIHRoYXQgIHBvb2xfbGVuCisgICAgICAgIGlzICBkZWZpbmVkICBpbiAgc3VjaCBhIHdheSB0aGF0IHRoZSB0ZXN0IHdpbGwgZmFpbCB1bmxlc3MgYWxsCisgICAgICAgIHBvb2wgYmxvY2tzIGFyZSB0aGUgc2FtZSBzaXplLiAgKi8KKworICAgIGlmICh0aHItPnJlbGZjbiAhPSAwICYmCisgICAgICAgIGItPmJoLmJiLmJzaXplID09IChidWZzaXplKSh0aHItPnBvb2xfbGVuIC0gc2l6ZW9mKGJoZWFkX3QpKSkKKyAgICB7CisjaWYgQnVmU3RhdHMKKyAgICAgICAgaWYgKHRoci0+bnVtcGJsayAhPSAxKSB7ICAgICAgICAvKiBEbyBub3QgcmVsZWFzZSB0aGUgbGFzdCBidWZmZXIgdW50aWwgZmluYWxpemF0aW9uIHRpbWUgKi8KKyNlbmRpZgorCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGItPmJoLmJiLnByZXZmcmVlID09IDApOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChCSCgoY2hhciAqKSBiICsgYi0+YmguYmIuYnNpemUpLT5iYi5ic2l6ZSA9PSBFU2VudCk7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKEJIKChjaGFyICopIGIgKyBiLT5iaC5iYi5ic2l6ZSktPmJiLnByZXZmcmVlID09IGItPmJoLmJiLmJzaXplKTsKKworICAgICAgICAgICAgLyogIFVubGluayB0aGUgYnVmZmVyIGZyb20gdGhlIGZyZWUgbGlzdCAgKi8KKyAgICAgICAgICAgIF9fa21wX2JnZXRfcmVtb3ZlX2Zyb21fZnJlZWxpc3QoIGIgKTsKKworICAgICAgICAgICAgS0VfVFJBQ0UoIDEwLCAoIiUlJSUlJSBGUkVFKCAlcCApXG4iLCAodm9pZCAqKSBiICkgKTsKKworICAgICAgICAgICAgKCp0aHItPnJlbGZjbikoYik7CisjaWYgQnVmU3RhdHMKKyAgICAgICAgICAgIHRoci0+bnVtcHJlbCsrOyAgICAgICAgICAgICAgIC8qIE5yIG9mIGV4cGFuc2lvbiBibG9jayByZWxlYXNlcyAqLworICAgICAgICAgICAgdGhyLT5udW1wYmxrLS07ICAgICAgICAgICAgICAgLyogVG90YWwgbnVtYmVyIG9mIGJsb2NrcyAqLworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0aHItPm51bXBibGsgPT0gdGhyLT5udW1wZ2V0IC0gdGhyLT5udW1wcmVsKTsKKworICAgICAgICAgICAgLyogYXZvaWQgbGVhdmluZyBzdGFsZSBsYXN0X3Bvb2wgcG9pbnRlciBhcm91bmQgaWYgaXQgaXMgYmVpbmcgZGVhbGxvY2VkICovCisgICAgICAgICAgICBpZiAodGhyLT5sYXN0X3Bvb2wgPT0gYikgdGhyLT5sYXN0X3Bvb2wgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdGhyLT5sYXN0X3Bvb2wgPSBiOworICAgICAgICB9CisjZW5kaWYgLyogQnVmU3RhdHMgKi8KKyAgICB9Cit9CisKKy8qICBCRUNUTCAgLS0gIEVzdGFibGlzaCBhdXRvbWF0aWMgcG9vbCBleHBhbnNpb24gY29udHJvbCAgKi8KKworc3RhdGljIHZvaWQKK2JlY3RsKCAga21wX2luZm9fdCAqdGgsIGJnZXRfY29tcGFjdF90IGNvbXBhY3QsIGJnZXRfYWNxdWlyZV90IGFjcXVpcmUsIGJnZXRfcmVsZWFzZV90IHJlbGVhc2UsIGJ1ZnNpemUgcG9vbF9pbmNyKQoreworICAgIHRocl9kYXRhX3QgKnRociA9IGdldF90aHJfZGF0YSggdGggKTsKKworICAgIHRoci0+Y29tcGZjbiA9IGNvbXBhY3Q7CisgICAgdGhyLT5hY3FmY24gPSBhY3F1aXJlOworICAgIHRoci0+cmVsZmNuID0gcmVsZWFzZTsKKyAgICB0aHItPmV4cF9pbmNyID0gcG9vbF9pbmNyOworfQorCisvKiAgQlBPT0wgIC0tICBBZGQgYSByZWdpb24gb2YgbWVtb3J5IHRvIHRoZSBidWZmZXIgcG9vbC4gICovCisKK3N0YXRpYyB2b2lkCiticG9vbCggIGttcF9pbmZvX3QgKnRoLCB2b2lkICpidWYsIGJ1ZnNpemUgbGVuKQoreworLyogICAgaW50IGJpbiA9IDA7ICovCisgICAgdGhyX2RhdGFfdCAqdGhyID0gZ2V0X3Rocl9kYXRhKCB0aCApOworICAgIGJmaGVhZF90ICpiID0gQkZIKGJ1Zik7CisgICAgYmhlYWRfdCAqYm47CisKKyAgICBfX2ttcF9iZ2V0X2RlcXVldWUoIHRoICk7ICAgICAgICAgLyogUmVsZWFzZSBhbnkgcXVldWVkIGJ1ZmZlcnMgKi8KKworI2lmZGVmIFNpemVRdWFudAorICAgIGxlbiAmPSB+KFNpemVRdWFudCAtIDEpOworI2VuZGlmCisgICAgaWYgKHRoci0+cG9vbF9sZW4gPT0gMCkgeworICAgICAgICB0aHItPnBvb2xfbGVuID0gbGVuOworICAgIH0gZWxzZSBpZiAobGVuICE9IHRoci0+cG9vbF9sZW4pIHsKKyAgICAgICAgdGhyLT5wb29sX2xlbiA9IC0xOworICAgIH0KKyNpZiBCdWZTdGF0cworICAgIHRoci0+bnVtcGdldCsrOyAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgYmxvY2sgYWNxdWlzaXRpb25zICovCisgICAgdGhyLT5udW1wYmxrKys7ICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBibG9ja3MgdG90YWwgKi8KKyAgICBLTVBfREVCVUdfQVNTRVJUKHRoci0+bnVtcGJsayA9PSB0aHItPm51bXBnZXQgLSB0aHItPm51bXByZWwpOworI2VuZGlmIC8qIEJ1ZlN0YXRzICovCisKKyAgICAvKiBTaW5jZSB0aGUgYmxvY2sgaXMgaW5pdGlhbGx5IG9jY3VwaWVkIGJ5IGEgc2luZ2xlIGZyZWUgIGJ1ZmZlciwKKyAgICAgICBpdCAgaGFkICBiZXR0ZXIgIG5vdCAgYmUgIChtdWNoKSBsYXJnZXIgdGhhbiB0aGUgbGFyZ2VzdCBidWZmZXIKKyAgICAgICB3aG9zZSBzaXplIHdlIGNhbiBzdG9yZSBpbiBiaGVhZC5iYi5ic2l6ZS4gKi8KKworICAgIEtNUF9ERUJVR19BU1NFUlQobGVuIC0gc2l6ZW9mKGJoZWFkX3QpIDw9IC0oKGJ1ZnNpemUpIEVTZW50ICsgMSkpOworCisgICAgLyogQ2xlYXIgIHRoZSAgYmFja3BvaW50ZXIgYXQgIHRoZSBzdGFydCBvZiB0aGUgYmxvY2sgdG8gaW5kaWNhdGUgdGhhdAorICAgICAgIHRoZXJlICBpcyAgbm8gIGZyZWUgIGJsb2NrICBwcmlvciAgdG8gIHRoaXMgICBvbmUuICAgIFRoYXQgICBibG9ja3MKKyAgICAgICByZWNvbWJpbmF0aW9uIHdoZW4gdGhlIGZpcnN0IGJsb2NrIGluIG1lbW9yeSBpcyByZWxlYXNlZC4gKi8KKworICAgIGItPmJoLmJiLnByZXZmcmVlID0gMDsKKworICAgIC8qIENyZWF0ZSBhIGR1bW15IGFsbG9jYXRlZCBidWZmZXIgYXQgdGhlIGVuZCBvZiB0aGUgcG9vbC4gIFRoaXMgZHVtbXkKKyAgICAgICBidWZmZXIgaXMgc2VlbiB3aGVuIGEgYnVmZmVyIGF0IHRoZSBlbmQgb2YgdGhlIHBvb2wgaXMgcmVsZWFzZWQgYW5kCisgICAgICAgYmxvY2tzICByZWNvbWJpbmF0aW9uICBvZiAgdGhlIGxhc3QgYnVmZmVyIHdpdGggdGhlIGR1bW15IGJ1ZmZlciBhdAorICAgICAgIHRoZSBlbmQuICBUaGUgbGVuZ3RoIGluIHRoZSBkdW1teSBidWZmZXIgIGlzICBzZXQgIHRvICB0aGUgIGxhcmdlc3QKKyAgICAgICBuZWdhdGl2ZSAgbnVtYmVyICB0byAgZGVub3RlICB0aGUgIGVuZCAgb2YgIHRoZSBwb29sIGZvciBkaWFnbm9zdGljCisgICAgICAgcm91dGluZXMgKHRoaXMgc3BlY2lmaWMgdmFsdWUgaXMgIG5vdCAgY291bnRlZCAgb24gIGJ5ICB0aGUgIGFjdHVhbAorICAgICAgIGFsbG9jYXRpb24gYW5kIHJlbGVhc2UgZnVuY3Rpb25zKS4gKi8KKworICAgIGxlbiAtPSBzaXplb2YoYmhlYWRfdCk7CisgICAgYi0+YmguYmIuYnNpemUgPSAoYnVmc2l6ZSkgbGVuOworICAgIC8qIFNldCB0aGUgb3duZXIgb2YgdGhpcyBidWZmZXIgKi8KKyAgICBUQ1dfUFRSKCBiLT5iaC5iYi5idGhyLCAoa21wX2luZm9fdCopKChrbXBfdWludHB0cl90KXRoIHwgMSkgKTsgLy8gbWFyayB0aGUgYnVmZmVyIGFzIGFsbG9jYXRlZCBhZGRyZXNzCisKKyAgICAvKiBDaGFpbiB0aGUgbmV3IGJsb2NrIHRvIHRoZSBmcmVlIGxpc3QuICovCisgICAgX19rbXBfYmdldF9pbnNlcnRfaW50b19mcmVlbGlzdCggdGhyLCBiICk7CisKKyNpZmRlZiBGcmVlV2lwZQorICAgICh2b2lkKSBtZW1zZXQoKChjaGFyICopIGIpICsgc2l6ZW9mKGJmaGVhZF90KSwgMHg1NSwKKyAgICAgICAgICAgICAoc2l6ZV90KSAobGVuIC0gc2l6ZW9mKGJmaGVhZF90KSkpOworI2VuZGlmCisgICAgYm4gPSBCSCgoKGNoYXIgKikgYikgKyBsZW4pOworICAgIGJuLT5iYi5wcmV2ZnJlZSA9IChidWZzaXplKSBsZW47CisgICAgLyogRGVmaW5pdGlvbiBvZiBFU2VudCBhc3N1bWVzIHR3bydzIGNvbXBsZW1lbnQhICovCisgICAgS01QX0RFQlVHX0FTU0VSVCggKH4wKSA9PSAtMSAmJiAoYm4gIT0gMCkgKTsKKworICAgIGJuLT5iYi5ic2l6ZSA9IEVTZW50OworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogIEJGUkVFRCAgLS0gIER1bXAgdGhlIGZyZWUgbGlzdHMgZm9yIHRoaXMgdGhyZWFkLiAqLworCitzdGF0aWMgdm9pZAorYmZyZWVkKCAga21wX2luZm9fdCAqdGggKQoreworICAgIGludCBiaW4gPSAwLCBjb3VudCA9IDA7CisgICAgaW50IGd0aWQgPSBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aCApOworICAgIHRocl9kYXRhX3QgKnRociA9IGdldF90aHJfZGF0YSggdGggKTsKKworI2lmIEJ1ZlN0YXRzCisgICAgX19rbXBfcHJpbnRmX25vX2xvY2soIl9fa21wX3ByaW50cG9vbDogVCMlZCB0b3RhbD0lIiBLTVBfVUlOVDY0X1NQRUMgIiBnZXQ9JSIgS01QX0lOVDY0X1NQRUMgIiByZWw9JSIgXAorICAgICAgICAgICBLTVBfSU5UNjRfU1BFQyAiIHBibGs9JSIgS01QX0lOVDY0X1NQRUMgIiBwZ2V0PSUiIEtNUF9JTlQ2NF9TUEVDICIgcHJlbD0lIiBLTVBfSU5UNjRfU1BFQyBcCisgICAgICAgICAgICIgZGdldD0lIiBLTVBfSU5UNjRfU1BFQyAiIGRyZWw9JSIgS01QX0lOVDY0X1NQRUMgIlxuIiwKKyAgICAgICAgICAgZ3RpZCwgKGttcF91aW50NjQpIHRoci0+dG90YWxsb2MsCisgICAgICAgICAgIChrbXBfaW50NjQpIHRoci0+bnVtZ2V0LCAgKGttcF9pbnQ2NCkgdGhyLT5udW1yZWwsCisgICAgICAgICAgIChrbXBfaW50NjQpIHRoci0+bnVtcGJsaywKKyAgICAgICAgICAgKGttcF9pbnQ2NCkgdGhyLT5udW1wZ2V0LCAoa21wX2ludDY0KSB0aHItPm51bXByZWwsCisgICAgICAgICAgIChrbXBfaW50NjQpIHRoci0+bnVtZGdldCwgKGttcF9pbnQ2NCkgdGhyLT5udW1kcmVsICk7CisjZW5kaWYKKworICAgIGZvciAoYmluID0gMDsgYmluIDwgTUFYX0JHRVRfQklOUzsgKytiaW4pIHsKKyAgICAgICAgYmZoZWFkX3QgKmI7CisKKyAgICAgICAgZm9yIChiID0gdGhyLT5mcmVlbGlzdFsgYmluIF0ucWwuZmxpbms7IGIgIT0gJnRoci0+ZnJlZWxpc3RbIGJpbiBdOyBiID0gYi0+cWwuZmxpbmspIHsKKyAgICAgICAgICAgIGJ1ZnNpemUgYnMgPSBiLT5iaC5iYi5ic2l6ZTsKKworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggYi0+cWwuYmxpbmstPnFsLmZsaW5rID09IGIgKTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGItPnFsLmZsaW5rLT5xbC5ibGluayA9PSBiICk7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBicyA+IDAgKTsKKworICAgICAgICAgICAgY291bnQgKz0gMTsKKworICAgICAgICAgICAgX19rbXBfcHJpbnRmX25vX2xvY2soIl9fa21wX3ByaW50cG9vbDogVCMlZCBGcmVlIGJsb2NrOiAweCVwIHNpemUgJTZsZCBieXRlcy5cbiIsIGd0aWQsIGIsIChsb25nKSBicyApOworI2lmZGVmIEZyZWVXaXBlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hhciAqbGVyciA9ICgoY2hhciAqKSBiKSArIHNpemVvZihiZmhlYWRfdCk7CisgICAgICAgICAgICAgICAgaWYgKChicyA+IHNpemVvZihiZmhlYWRfdCkpICYmICgoKmxlcnIgIT0gMHg1NSkgfHwgKG1lbWNtcChsZXJyLCBsZXJyICsgMSwgKHNpemVfdCkgKGJzIC0gKHNpemVvZihiZmhlYWRfdCkgKyAxKSkpICE9IDApKSkgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9wcmludGZfbm9fbG9jayggIl9fa21wX3ByaW50cG9vbDogVCMlZCAgICAgKENvbnRlbnRzIG9mIGFib3ZlIGZyZWUgYmxvY2sgaGF2ZSBiZWVuIG92ZXJzdG9yZWQuKVxuIiwgZ3RpZCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGNvdW50ID09IDApCisgICAgICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCJfX2ttcF9wcmludHBvb2w6IFQjJWQgTm8gZnJlZSBibG9ja3NcbiIsIGd0aWQgKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZmRlZiBLTVBfREVCVUcKKworI2lmIEJ1ZlN0YXRzCisKKy8qICBCU1RBVFMgIC0tICBSZXR1cm4gYnVmZmVyIGFsbG9jYXRpb24gZnJlZSBzcGFjZSBzdGF0aXN0aWNzLiAgKi8KKworc3RhdGljIHZvaWQKK2JzdGF0cyggIGttcF9pbmZvX3QgKnRoLCBidWZzaXplICpjdXJhbGxvYywgIGJ1ZnNpemUgKnRvdGZyZWUsICBidWZzaXplICptYXhmcmVlLCBsb25nICpuZ2V0LCBsb25nICpucmVsKQoreworICAgIGludCBiaW4gPSAwOworICAgIHRocl9kYXRhX3QgKnRociA9IGdldF90aHJfZGF0YSggdGggKTsKKworICAgICpuZ2V0ID0gdGhyLT5udW1nZXQ7CisgICAgKm5yZWwgPSB0aHItPm51bXJlbDsKKyAgICAqY3VyYWxsb2MgPSAoYnVmc2l6ZSkgdGhyLT50b3RhbGxvYzsKKyAgICAqdG90ZnJlZSA9IDA7CisgICAgKm1heGZyZWUgPSAtMTsKKworICAgIGZvciAoYmluID0gMDsgYmluIDwgTUFYX0JHRVRfQklOUzsgKytiaW4pIHsKKyAgICAgICAgYmZoZWFkX3QgKmIgPSB0aHItPmZyZWVsaXN0WyBiaW4gXS5xbC5mbGluazsKKworICAgICAgICB3aGlsZSAoYiAhPSAmdGhyLT5mcmVlbGlzdFsgYmluIF0pIHsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoYi0+YmguYmIuYnNpemUgPiAwKTsKKyAgICAgICAgICAgICp0b3RmcmVlICs9IGItPmJoLmJiLmJzaXplOworICAgICAgICAgICAgaWYgKGItPmJoLmJiLmJzaXplID4gKm1heGZyZWUpIHsKKyAgICAgICAgICAgICAgICAqbWF4ZnJlZSA9IGItPmJoLmJiLmJzaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYiA9IGItPnFsLmZsaW5rOyAgICAgICAgICAgICAgLyogTGluayB0byBuZXh0IGJ1ZmZlciAqLworICAgICAgICB9CisgICAgfQorfQorCisvKiAgQlNUQVRTRSAgLS0gIFJldHVybiBleHRlbmRlZCBzdGF0aXN0aWNzICAqLworCitzdGF0aWMgdm9pZAorYnN0YXRzZSggIGttcF9pbmZvX3QgKnRoLCBidWZzaXplICpwb29sX2luY3IsIGxvbmcgKm5wb29sLCBsb25nICpucGdldCwgbG9uZyAqbnByZWwsIGxvbmcgKm5kZ2V0LCBsb25nICpuZHJlbCkKK3sKKyAgICB0aHJfZGF0YV90ICp0aHIgPSBnZXRfdGhyX2RhdGEoIHRoICk7CisKKyAgICAqcG9vbF9pbmNyID0gKHRoci0+cG9vbF9sZW4gPCAwKSA/IC10aHItPmV4cF9pbmNyIDogdGhyLT5leHBfaW5jcjsKKyAgICAqbnBvb2wgPSB0aHItPm51bXBibGs7CisgICAgKm5wZ2V0ID0gdGhyLT5udW1wZ2V0OworICAgICpucHJlbCA9IHRoci0+bnVtcHJlbDsKKyAgICAqbmRnZXQgPSB0aHItPm51bWRnZXQ7CisgICAgKm5kcmVsID0gdGhyLT5udW1kcmVsOworfQorCisjZW5kaWYgLyogQnVmU3RhdHMgKi8KKworLyogIEJVRkRVTVAgIC0tICBEdW1wIHRoZSBkYXRhIGluIGEgYnVmZmVyLiAgVGhpcyBpcyBjYWxsZWQgd2l0aCB0aGUgIHVzZXIKKyAgICAgICAgICAgICAgICAgZGF0YSBwb2ludGVyLCBhbmQgYmFja3MgdXAgdG8gdGhlIGJ1ZmZlciBoZWFkZXIuICBJdCB3aWxsCisgICAgICAgICAgICAgICAgIGR1bXAgZWl0aGVyIGEgZnJlZSBibG9jayBvciBhbiBhbGxvY2F0ZWQgb25lLiAgKi8KKworc3RhdGljIHZvaWQKK2J1ZmR1bXAoICBrbXBfaW5mb190ICp0aCwgdm9pZCAqYnVmICkKK3sKKyAgICBiZmhlYWRfdCAqYjsKKyAgICB1bnNpZ25lZCBjaGFyICpiZHVtcDsKKyAgICBidWZzaXplIGJkbGVuOworCisgICAgYiA9IEJGSCgoKGNoYXIgKikgYnVmKSAtIHNpemVvZihiaGVhZF90KSk7CisgICAgS01QX0RFQlVHX0FTU0VSVChiLT5iaC5iYi5ic2l6ZSAhPSAwKTsKKyAgICBpZiAoYi0+YmguYmIuYnNpemUgPCAwKSB7CisgICAgICAgIGJkdW1wID0gKHVuc2lnbmVkIGNoYXIgKikgYnVmOworICAgICAgICBiZGxlbiA9ICgtYi0+YmguYmIuYnNpemUpIC0gKGJ1ZnNpemUpIHNpemVvZihiaGVhZF90KTsKKyAgICB9IGVsc2UgeworICAgICAgICBiZHVtcCA9ICh1bnNpZ25lZCBjaGFyICopICgoKGNoYXIgKikgYikgKyBzaXplb2YoYmZoZWFkX3QpKTsKKyAgICAgICAgYmRsZW4gPSBiLT5iaC5iYi5ic2l6ZSAtIChidWZzaXplKSBzaXplb2YoYmZoZWFkX3QpOworICAgIH0KKworICAgIHdoaWxlIChiZGxlbiA+IDApIHsKKyAgICAgICAgaW50IGksIGR1cGVzID0gMDsKKyAgICAgICAgYnVmc2l6ZSBsID0gYmRsZW47CisgICAgICAgIGNoYXIgYmhleFs1MF0sIGJhc2NpaVsyMF07CisKKyAgICAgICAgaWYgKGwgPiAxNikgeworICAgICAgICAgICAgbCA9IDE2OworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGw7IGkrKykgeworICAgICAgICAgICAgKHZvaWQpIEtNUF9TTlBSSU5URihiaGV4ICsgaSAqIDMsIHNpemVvZihiaGV4KSAtIGkgKiAzLCAiJTAyWCAiLCBiZHVtcFtpXSk7CisgICAgICAgICAgICBpZiAoYmR1bXBbaV0gPiAweDIwICYmIGJkdW1wW2ldIDwgMHg3RikKKyAgICAgICAgICAgICAgICBiYXNjaWlbIGkgXSA9IGJkdW1wWyBpIF07CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYmFzY2lpWyBpIF0gPSAnICc7CisgICAgICAgIH0KKyAgICAgICAgYmFzY2lpW2ldID0gMDsKKyAgICAgICAgKHZvaWQpIF9fa21wX3ByaW50Zl9ub19sb2NrKCIlLTQ4cyAgICVzXG4iLCBiaGV4LCBiYXNjaWkpOworICAgICAgICBiZHVtcCArPSBsOworICAgICAgICBiZGxlbiAtPSBsOworICAgICAgICB3aGlsZSAoKGJkbGVuID4gMTYpICYmIChtZW1jbXAoKGNoYXIgKikgKGJkdW1wIC0gMTYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgYmR1bXAsIDE2KSA9PSAwKSkgeworICAgICAgICAgICAgZHVwZXMrKzsKKyAgICAgICAgICAgIGJkdW1wICs9IDE2OworICAgICAgICAgICAgYmRsZW4gLT0gMTY7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGR1cGVzID4gMSkgeworICAgICAgICAgICAgKHZvaWQpIF9fa21wX3ByaW50Zl9ub19sb2NrKAorICAgICAgICAgICAgICAgICIgICAgICglZCBsaW5lcyBbJWQgYnl0ZXNdIGlkZW50aWNhbCB0byBhYm92ZSBsaW5lIHNraXBwZWQpXG4iLAorICAgICAgICAgICAgICAgIGR1cGVzLCBkdXBlcyAqIDE2KTsKKyAgICAgICAgfSBlbHNlIGlmIChkdXBlcyA9PSAxKSB7CisgICAgICAgICAgICBiZHVtcCAtPSAxNjsKKyAgICAgICAgICAgIGJkbGVuICs9IDE2OworICAgICAgICB9CisgICAgfQorfQorCisvKiAgQlBPT0xEICAtLSAgRHVtcCBhIGJ1ZmZlciBwb29sLiAgVGhlIGJ1ZmZlciBoZWFkZXJzIGFyZSBhbHdheXMgbGlzdGVkLgorICAgICAgICAgICAgICAgIElmIERVTVBBTExPQyBpcyBub256ZXJvLCB0aGUgY29udGVudHMgb2YgYWxsb2NhdGVkIGJ1ZmZlcnMKKyAgICAgICAgICAgICAgICBhcmUgIGR1bXBlZC4gICBJZiAgRFVNUEZSRUUgIGlzICBub256ZXJvLCAgZnJlZSBibG9ja3MgYXJlCisgICAgICAgICAgICAgICAgZHVtcGVkIGFzIHdlbGwuICBJZiBGcmVlV2lwZSAgY2hlY2tpbmcgIGlzICBlbmFibGVkLCAgZnJlZQorICAgICAgICAgICAgICAgIGJsb2NrcyAgd2hpY2ggIGhhdmUgIGJlZW4gY2xvYmJlcmVkIHdpbGwgYWx3YXlzIGJlIGR1bXBlZC4gKi8KKworc3RhdGljIHZvaWQKK2Jwb29sZCggIGttcF9pbmZvX3QgKnRoLCB2b2lkICpidWYsIGludCBkdW1wYWxsb2MsIGludCBkdW1wZnJlZSkKK3sKKyAgICBiZmhlYWRfdCAqYiA9IEJGSCggKGNoYXIqKWJ1ZiAtIHNpemVvZihiaGVhZF90KSk7CisKKyAgICB3aGlsZSAoYi0+YmguYmIuYnNpemUgIT0gRVNlbnQpIHsKKyAgICAgICAgYnVmc2l6ZSBicyA9IGItPmJoLmJiLmJzaXplOworCisgICAgICAgIGlmIChicyA8IDApIHsKKyAgICAgICAgICAgIGJzID0gLWJzOworICAgICAgICAgICAgKHZvaWQpIF9fa21wX3ByaW50Zl9ub19sb2NrKCJBbGxvY2F0ZWQgYnVmZmVyOiBzaXplICU2bGQgYnl0ZXMuXG4iLCAobG9uZykgYnMpOworICAgICAgICAgICAgaWYgKGR1bXBhbGxvYykgeworICAgICAgICAgICAgICAgIGJ1ZmR1bXAoIHRoLCAodm9pZCAqKSAoKChjaGFyICopIGIpICsgc2l6ZW9mKGJoZWFkX3QpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpsZXJyID0gIiI7CisKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoYnMgPiAwKTsKKyAgICAgICAgICAgIGlmICgoYi0+cWwuYmxpbmstPnFsLmZsaW5rICE9IGIpIHx8IChiLT5xbC5mbGluay0+cWwuYmxpbmsgIT0gYikpIHsKKyAgICAgICAgICAgICAgICBsZXJyID0gIiAgKEJhZCBmcmVlIGxpc3QgbGlua3MpIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICh2b2lkKSBfX2ttcF9wcmludGZfbm9fbG9jaygiRnJlZSBibG9jazogICAgICAgc2l6ZSAlNmxkIGJ5dGVzLiVzXG4iLAorICAgICAgICAgICAgICAgIChsb25nKSBicywgbGVycik7CisjaWZkZWYgRnJlZVdpcGUKKyAgICAgICAgICAgIGxlcnIgPSAoKGNoYXIgKikgYikgKyBzaXplb2YoYmZoZWFkX3QpOworICAgICAgICAgICAgaWYgKChicyA+IHNpemVvZihiZmhlYWRfdCkpICYmICgoKmxlcnIgIT0gMHg1NSkgfHwKKyAgICAgICAgICAgICAgICAobWVtY21wKGxlcnIsIGxlcnIgKyAxLAorICAgICAgICAgICAgICAgICAgKHNpemVfdCkgKGJzIC0gKHNpemVvZihiZmhlYWRfdCkgKyAxKSkpICE9IDApKSkgeworICAgICAgICAgICAgICAgICh2b2lkKSBfX2ttcF9wcmludGZfbm9fbG9jaygKKyAgICAgICAgICAgICAgICAgICAgIihDb250ZW50cyBvZiBhYm92ZSBmcmVlIGJsb2NrIGhhdmUgYmVlbiBvdmVyc3RvcmVkLilcbiIpOworICAgICAgICAgICAgICAgIGJ1ZmR1bXAoIHRoLCAodm9pZCAqKSAoKChjaGFyICopIGIpICsgc2l6ZW9mKGJoZWFkX3QpKSk7CisgICAgICAgICAgICB9IGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgaWYgKGR1bXBmcmVlKSB7CisgICAgICAgICAgICAgICAgYnVmZHVtcCggdGgsICh2b2lkICopICgoKGNoYXIgKikgYikgKyBzaXplb2YoYmhlYWRfdCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBiID0gQkZIKCgoY2hhciAqKSBiKSArIGJzKTsKKyAgICB9Cit9CisKKy8qICBCUE9PTFYgIC0tICBWYWxpZGF0ZSBhIGJ1ZmZlciBwb29sLiAqLworCitzdGF0aWMgaW50CiticG9vbHYoICBrbXBfaW5mb190ICp0aCwgdm9pZCAqYnVmICkKK3sKKyAgICBiZmhlYWRfdCAqYiA9IEJGSChidWYpOworCisgICAgd2hpbGUgKGItPmJoLmJiLmJzaXplICE9IEVTZW50KSB7CisgICAgICAgIGJ1ZnNpemUgYnMgPSBiLT5iaC5iYi5ic2l6ZTsKKworICAgICAgICBpZiAoYnMgPCAwKSB7CisgICAgICAgICAgICBicyA9IC1iczsKKyAgICAgICAgfSBlbHNlIHsKKyNpZmRlZiBGcmVlV2lwZQorICAgICAgICAgICAgY2hhciAqbGVyciA9ICIiOworI2VuZGlmCisKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoYnMgPiAwKTsKKyAgICAgICAgICAgIGlmIChicyA8PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGItPnFsLmJsaW5rLT5xbC5mbGluayAhPSBiKSB8fCAoYi0+cWwuZmxpbmstPnFsLmJsaW5rICE9IGIpKSB7CisgICAgICAgICAgICAgICAgKHZvaWQpIF9fa21wX3ByaW50Zl9ub19sb2NrKCJGcmVlIGJsb2NrOiBzaXplICU2bGQgYnl0ZXMuICAoQmFkIGZyZWUgbGlzdCBsaW5rcylcbiIsCisgICAgICAgICAgICAgICAgICAgICAobG9uZykgYnMpOworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoMCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisjaWZkZWYgRnJlZVdpcGUKKyAgICAgICAgICAgIGxlcnIgPSAoKGNoYXIgKikgYikgKyBzaXplb2YoYmZoZWFkX3QpOworICAgICAgICAgICAgaWYgKChicyA+IHNpemVvZihiZmhlYWRfdCkpICYmICgoKmxlcnIgIT0gMHg1NSkgfHwKKyAgICAgICAgICAgICAgICAobWVtY21wKGxlcnIsIGxlcnIgKyAxLAorICAgICAgICAgICAgICAgICAgKHNpemVfdCkgKGJzIC0gKHNpemVvZihiZmhlYWRfdCkgKyAxKSkpICE9IDApKSkgeworICAgICAgICAgICAgICAgICh2b2lkKSBfX2ttcF9wcmludGZfbm9fbG9jaygKKyAgICAgICAgICAgICAgICAgICAgIihDb250ZW50cyBvZiBhYm92ZSBmcmVlIGJsb2NrIGhhdmUgYmVlbiBvdmVyc3RvcmVkLilcbiIpOworICAgICAgICAgICAgICAgIGJ1ZmR1bXAoIHRoLCAodm9pZCAqKSAoKChjaGFyICopIGIpICsgc2l6ZW9mKGJoZWFkX3QpKSk7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCgwKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBGcmVlV2lwZSAqLworICAgICAgICB9CisgICAgICAgIGIgPSBCRkgoKChjaGFyICopIGIpICsgYnMpOworICAgIH0KKyAgICByZXR1cm4gMTsKK30KKworI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZAorX19rbXBfaW5pdGlhbGl6ZV9iZ2V0KCBrbXBfaW5mb190ICp0aCApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggU2l6ZVF1YW50ID49IHNpemVvZiggdm9pZCAqICkgJiYgKHRoICE9IDApICk7CisKKyAgICBzZXRfdGhyX2RhdGEoIHRoICk7CisKKyAgICBiZWN0bCggdGgsIChiZ2V0X2NvbXBhY3RfdCkgMCwgKGJnZXRfYWNxdWlyZV90KSBtYWxsb2MsIChiZ2V0X3JlbGVhc2VfdCkgZnJlZSwKKyAgICAgICAgICAgKGJ1ZnNpemUpIF9fa21wX21hbGxvY19wb29sX2luY3IgKTsKK30KKwordm9pZAorX19rbXBfZmluYWxpemVfYmdldCgga21wX2luZm9fdCAqdGggKQoreworICAgIHRocl9kYXRhX3QgKnRocjsKKyAgICBiZmhlYWRfdCAqYjsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoICE9IDAgKTsKKworI2lmIEJ1ZlN0YXRzCisgICAgdGhyID0gKHRocl9kYXRhX3QgKikgdGgtPnRoLnRoX2xvY2FsLmJnZXRfZGF0YTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aHIgIT0gTlVMTCApOworICAgIGIgPSB0aHItPmxhc3RfcG9vbDsKKworICAgIC8qICBJZiAgYSAgYmxvY2stcmVsZWFzZSBmdW5jdGlvbiBpcyBkZWZpbmVkLCBhbmQgdGhpcyBmcmVlIGJ1ZmZlcgorICAgICAgICBjb25zdGl0dXRlcyB0aGUgZW50aXJlIGJsb2NrLCByZWxlYXNlIGl0LiAgTm90ZSB0aGF0ICBwb29sX2xlbgorICAgICAgICBpcyAgZGVmaW5lZCAgaW4gIHN1Y2ggYSB3YXkgdGhhdCB0aGUgdGVzdCB3aWxsIGZhaWwgdW5sZXNzIGFsbAorICAgICAgICBwb29sIGJsb2NrcyBhcmUgdGhlIHNhbWUgc2l6ZS4gICovCisKKyAgICAvKiBEZWFsbG9jYXRlIHRoZSBsYXN0IHBvb2wgaWYgb25lIGV4aXN0cyBiZWNhdXNlIHdlIG5vIGxvbmdlciBkbyBpdCBpbiBicmVsKCkgKi8KKyAgICBpZiAodGhyLT5yZWxmY24gIT0gMCAmJiBiICE9IDAgJiYgdGhyLT5udW1wYmxrICE9IDAgJiYKKyAgICAgICAgYi0+YmguYmIuYnNpemUgPT0gKGJ1ZnNpemUpKHRoci0+cG9vbF9sZW4gLSBzaXplb2YoYmhlYWRfdCkpKQorICAgIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChiLT5iaC5iYi5wcmV2ZnJlZSA9PSAwKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChCSCgoY2hhciAqKSBiICsgYi0+YmguYmIuYnNpemUpLT5iYi5ic2l6ZSA9PSBFU2VudCk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoQkgoKGNoYXIgKikgYiArIGItPmJoLmJiLmJzaXplKS0+YmIucHJldmZyZWUgPT0gYi0+YmguYmIuYnNpemUpOworCisgICAgICAgIC8qICBVbmxpbmsgdGhlIGJ1ZmZlciBmcm9tIHRoZSBmcmVlIGxpc3QgICovCisgICAgICAgIF9fa21wX2JnZXRfcmVtb3ZlX2Zyb21fZnJlZWxpc3QoIGIgKTsKKworICAgICAgICBLRV9UUkFDRSggMTAsICgiJSUlJSUlIEZSRUUoICVwIClcbiIsICh2b2lkICopIGIgKSApOworCisgICAgICAgICgqdGhyLT5yZWxmY24pKGIpOworICAgICAgICB0aHItPm51bXByZWwrKzsgICAgICAgICAgICAgICAvKiBOciBvZiBleHBhbnNpb24gYmxvY2sgcmVsZWFzZXMgKi8KKyAgICAgICAgdGhyLT5udW1wYmxrLS07ICAgICAgICAgICAgICAgLyogVG90YWwgbnVtYmVyIG9mIGJsb2NrcyAqLworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHRoci0+bnVtcGJsayA9PSB0aHItPm51bXBnZXQgLSB0aHItPm51bXByZWwpOworICAgIH0KKyNlbmRpZiAvKiBCdWZTdGF0cyAqLworCisgICAgLyogRGVhbGxvY2F0ZSBiZ2V0X2RhdGEgKi8KKyAgICBpZiAoIHRoLT50aC50aF9sb2NhbC5iZ2V0X2RhdGEgIT0gTlVMTCApIHsKKyAgICAgICAgX19rbXBfZnJlZSggdGgtPnRoLnRoX2xvY2FsLmJnZXRfZGF0YSApOworICAgICAgICB0aC0+dGgudGhfbG9jYWwuYmdldF9kYXRhID0gTlVMTDsKKyAgICB9OyAvLyBpZgorfQorCit2b2lkCitrbXBjX3NldF9wb29sc2l6ZSggc2l6ZV90IHNpemUgKQoreworICAgIGJlY3RsKCBfX2ttcF9nZXRfdGhyZWFkKCksIChiZ2V0X2NvbXBhY3RfdCkgMCwgKGJnZXRfYWNxdWlyZV90KSBtYWxsb2MsCisgICAgICAgICAgIChiZ2V0X3JlbGVhc2VfdCkgZnJlZSwgKGJ1ZnNpemUpIHNpemUgKTsKK30KKworc2l6ZV90CitrbXBjX2dldF9wb29sc2l6ZSggdm9pZCApCit7CisgICAgdGhyX2RhdGFfdCAqcDsKKworICAgIHAgPSBnZXRfdGhyX2RhdGEoIF9fa21wX2dldF90aHJlYWQoKSApOworCisgICAgcmV0dXJuIHAtPmV4cF9pbmNyOworfQorCit2b2lkCitrbXBjX3NldF9wb29sbW9kZSggaW50IG1vZGUgKQoreworICAgIHRocl9kYXRhX3QgKnA7CisKKyAgICBpZiAobW9kZSA9PSBiZ2V0X21vZGVfZmlmbyB8fCBtb2RlID09IGJnZXRfbW9kZV9saWZvIHx8IG1vZGUgPT0gYmdldF9tb2RlX2Jlc3QpIHsKKyAgICAgICAgcCA9IGdldF90aHJfZGF0YSggX19rbXBfZ2V0X3RocmVhZCgpICk7CisgICAgICAgIHAtPm1vZGUgPSAoYmdldF9tb2RlX3QpIG1vZGU7CisgICAgfQorfQorCitpbnQKK2ttcGNfZ2V0X3Bvb2xtb2RlKCB2b2lkICkKK3sKKyAgICB0aHJfZGF0YV90ICpwOworCisgICAgcCA9IGdldF90aHJfZGF0YSggX19rbXBfZ2V0X3RocmVhZCgpICk7CisKKyAgICByZXR1cm4gcC0+bW9kZTsKK30KKwordm9pZAora21wY19nZXRfcG9vbHN0YXQoIHNpemVfdCAqbWF4bWVtLCBzaXplX3QgKmFsbG1lbSApCit7CisgICAga21wX2luZm9fdCAqdGggPSBfX2ttcF9nZXRfdGhyZWFkKCk7CisgICAgYnVmc2l6ZSBhLCBiOworCisgICAgX19rbXBfYmdldF9kZXF1ZXVlKCB0aCApOyAgICAgICAgIC8qIFJlbGVhc2UgYW55IHF1ZXVlZCBidWZmZXJzICovCisKKyAgICBiY2hlY2soIHRoLCAmYSwgJmIgKTsKKworICAgICptYXhtZW0gPSBhOworICAgICphbGxtZW0gPSBiOworfQorCit2b2lkCitrbXBjX3Bvb2xwcmludCggdm9pZCApCit7CisgICAga21wX2luZm9fdCAqdGggPSBfX2ttcF9nZXRfdGhyZWFkKCk7CisKKyAgICBfX2ttcF9iZ2V0X2RlcXVldWUoIHRoICk7ICAgICAgICAgLyogUmVsZWFzZSBhbnkgcXVldWVkIGJ1ZmZlcnMgKi8KKworICAgIGJmcmVlZCggdGggKTsKK30KKworI2VuZGlmIC8vICNpZiBLTVBfVVNFX0JHRVQKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgKgora21wY19tYWxsb2MoIHNpemVfdCBzaXplICkKK3sKKyAgICB2b2lkICogcHRyOworICAgICAgICBwdHIgPSBiZ2V0KCBfX2ttcF9lbnRyeV90aHJlYWQoKSwgKGJ1ZnNpemUpIHNpemUgKTsKKworICAgIHJldHVybiBwdHI7Cit9CisKK3ZvaWQgKgora21wY19jYWxsb2MoIHNpemVfdCBuZWxlbSwgc2l6ZV90IGVsc2l6ZSApCit7CisgICAgdm9pZCAqIHB0cjsKKyAgICAgICAgcHRyID0gYmdldHooIF9fa21wX2VudHJ5X3RocmVhZCgpLCAoYnVmc2l6ZSkgKG5lbGVtICogZWxzaXplKSApOworCisgICAgcmV0dXJuIHB0cjsKK30KKwordm9pZCAqCitrbXBjX3JlYWxsb2MoIHZvaWQgKiBwdHIsIHNpemVfdCBzaXplICkKK3sKKyAgICB2b2lkICogcmVzdWx0ID0gTlVMTDsKKworICAgICAgICBpZiAoIHB0ciA9PSBOVUxMICkgeworICAgICAgICAgICAgLy8gSWYgcG9pbnRlciBpcyBOVUxMLCByZWFsbG9jIGJlaGF2ZXMgbGlrZSBtYWxsb2MuCisgICAgICAgICAgICByZXN1bHQgPSBiZ2V0KCBfX2ttcF9lbnRyeV90aHJlYWQoKSwgKGJ1ZnNpemUpIHNpemUgKTsKKyAgICAgICAgfSBlbHNlIGlmICggc2l6ZSA9PSAwICkgeworICAgICAgICAgICAgLy8gSWYgc2l6ZSBpcyAwLCByZWFsbG9jIGJlaGF2ZXMgbGlrZSBmcmVlLgorICAgICAgICAgICAgLy8gVGhlIHRocmVhZCBtdXN0IGJlIHJlZ2lzdGVyZWQgYnkgdGhlIGNhbGwgdG8ga21wY19tYWxsb2MoKSBvciBrbXBjX2NhbGxvYygpIGJlZm9yZS4KKyAgICAgICAgICAgIC8vIFNvIGl0IHNob3VsZCBiZSBzYWZlIHRvIGNhbGwgX19rbXBfZ2V0X3RocmVhZCgpLCBub3QgX19rbXBfZW50cnlfdGhyZWFkKCkuCisgICAgICAgICAgICBicmVsKCBfX2ttcF9nZXRfdGhyZWFkKCksIHB0ciApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzdWx0ID0gYmdldHIoIF9fa21wX2VudHJ5X3RocmVhZCgpLCBwdHIsIChidWZzaXplKSBzaXplICk7CisgICAgICAgIH07IC8vIGlmCisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKiBOT1RFOiB0aGUgbGlicmFyeSBtdXN0IGhhdmUgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIGJ5IGEgcHJldmlvdXMgYWxsb2NhdGUgKi8KKwordm9pZAora21wY19mcmVlKCB2b2lkICogcHRyICkKK3sKKyAgICBpZiAoICEgX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9OyAvLyBpZgorICAgIGlmICggcHRyICE9IE5VTEwgKSB7CisgICAgICAgICAgICBrbXBfaW5mb190ICp0aCA9IF9fa21wX2dldF90aHJlYWQoKTsKKyAgICAgICAgICAgIF9fa21wX2JnZXRfZGVxdWV1ZSggdGggKTsgICAgICAgICAvKiBSZWxlYXNlIGFueSBxdWV1ZWQgYnVmZmVycyAqLworICAgICAgICAgICAgYnJlbCggdGgsIHB0ciApOworICAgIH07Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgKgorX19fa21wX3RocmVhZF9tYWxsb2MoIGttcF9pbmZvX3QgKnRoLCBzaXplX3Qgc2l6ZSBLTVBfU1JDX0xPQ19ERUNMICkKK3sKKyAgICB2b2lkICogcHRyOworICAgIEtFX1RSQUNFKCAzMCwgKAorICAgICAgICAiLT4gX19rbXBfdGhyZWFkX21hbGxvYyggJXAsICVkICkgY2FsbGVkIGZyb20gJXM6JWRcbiIsCisgICAgICAgIHRoLAorICAgICAgICAoaW50KSBzaXplCisgICAgICAgIEtNUF9TUkNfTE9DX1BBUk0KKyAgICApICk7CisgICAgICAgIHB0ciA9IGJnZXQoIHRoLCAoYnVmc2l6ZSkgc2l6ZSApOworICAgIEtFX1RSQUNFKCAzMCwgKCAiPC0gX19rbXBfdGhyZWFkX21hbGxvYygpIHJldHVybnMgJXBcbiIsIHB0ciApICk7CisgICAgcmV0dXJuIHB0cjsKK30KKwordm9pZCAqCitfX19rbXBfdGhyZWFkX2NhbGxvYygga21wX2luZm9fdCAqdGgsIHNpemVfdCBuZWxlbSwgc2l6ZV90IGVsc2l6ZSBLTVBfU1JDX0xPQ19ERUNMICkKK3sKKyAgICB2b2lkICogcHRyOworICAgIEtFX1RSQUNFKCAzMCwgKAorICAgICAgICAiLT4gX19rbXBfdGhyZWFkX2NhbGxvYyggJXAsICVkLCAlZCApIGNhbGxlZCBmcm9tICVzOiVkXG4iLAorICAgICAgICB0aCwKKyAgICAgICAgKGludCkgbmVsZW0sCisgICAgICAgIChpbnQpIGVsc2l6ZQorICAgICAgICBLTVBfU1JDX0xPQ19QQVJNCisgICAgKSApOworICAgICAgICBwdHIgPSBiZ2V0eiggdGgsIChidWZzaXplKSAobmVsZW0gKiBlbHNpemUpICk7CisgICAgS0VfVFJBQ0UoIDMwLCAoICI8LSBfX2ttcF90aHJlYWRfY2FsbG9jKCkgcmV0dXJucyAlcFxuIiwgcHRyICkgKTsKKyAgICByZXR1cm4gcHRyOworfQorCit2b2lkICoKK19fX2ttcF90aHJlYWRfcmVhbGxvYygga21wX2luZm9fdCAqdGgsIHZvaWQgKnB0ciwgc2l6ZV90IHNpemUgS01QX1NSQ19MT0NfREVDTCApCit7CisgICAgS0VfVFJBQ0UoIDMwLCAoCisgICAgICAgICItPiBfX2ttcF90aHJlYWRfcmVhbGxvYyggJXAsICVwLCAlZCApIGNhbGxlZCBmcm9tICVzOiVkXG4iLAorICAgICAgICB0aCwKKyAgICAgICAgcHRyLAorICAgICAgICAoaW50KSBzaXplCisgICAgICAgIEtNUF9TUkNfTE9DX1BBUk0KKyAgICApICk7CisgICAgICAgIHB0ciA9IGJnZXRyKCB0aCwgcHRyLCAoYnVmc2l6ZSkgc2l6ZSApOworICAgIEtFX1RSQUNFKCAzMCwgKCAiPC0gX19rbXBfdGhyZWFkX3JlYWxsb2MoKSByZXR1cm5zICVwXG4iLCBwdHIgKSApOworICAgIHJldHVybiBwdHI7Cit9CisKK3ZvaWQKK19fX2ttcF90aHJlYWRfZnJlZSgga21wX2luZm9fdCAqdGgsIHZvaWQgKnB0ciBLTVBfU1JDX0xPQ19ERUNMICkKK3sKKyAgICBLRV9UUkFDRSggMzAsICgKKyAgICAgICAgIi0+IF9fa21wX3RocmVhZF9mcmVlKCAlcCwgJXAgKSBjYWxsZWQgZnJvbSAlczolZFxuIiwKKyAgICAgICAgdGgsCisgICAgICAgIHB0cgorICAgICAgICBLTVBfU1JDX0xPQ19QQVJNCisgICAgKSApOworICAgIGlmICggcHRyICE9IE5VTEwgKSB7CisgICAgICAgICAgICBfX2ttcF9iZ2V0X2RlcXVldWUoIHRoICk7ICAgICAgICAgLyogUmVsZWFzZSBhbnkgcXVldWVkIGJ1ZmZlcnMgKi8KKyAgICAgICAgICAgIGJyZWwoIHRoLCBwdHIgKTsKKyAgICB9CisgICAgS0VfVFJBQ0UoIDMwLCAoICI8LSBfX2ttcF90aHJlYWRfZnJlZSgpXG4iICkgKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgICAgSWYgTEVBS19NRU1PUlkgaXMgZGVmaW5lZCwgX19rbXBfZnJlZSgpIHdpbGwgKm5vdCogZnJlZSBtZW1vcnkuIEl0IGNhdXNlcyBtZW1vcnkgbGVha3MsIGJ1dCBpdAorICAgIG1heSBiZSB1c2VmdWwgZm9yIGRlYnVnZ2luZyBtZW1vcnkgY29ycnVwdGlvbnMsIHVzZWQgZnJlZWQgcG9pbnRlcnMsIGV0Yy4KKyovCisvKiAjZGVmaW5lIExFQUtfTUVNT1JZICovCisKK3N0cnVjdCBrbXBfbWVtX2Rlc2NyIHsgICAgICAvLyBNZW1vcnkgYmxvY2sgZGVzY3JpcHRvci4KKyAgICB2b2lkICogcHRyX2FsbG9jYXRlZDsgICAvLyBQb2ludGVyIHJldHVybmVkIGJ5IG1hbGxvYygpLCBzdWJqZWN0IGZvciBmcmVlKCkuCisgICAgc2l6ZV90IHNpemVfYWxsb2NhdGVkOyAgLy8gU2l6ZSBvZiBhbGxvY2F0ZWQgbWVtb3J5IGJsb2NrLgorICAgIHZvaWQgKiBwdHJfYWxpZ25lZDsgICAgIC8vIFBvaW50ZXIgdG8gYWxpZ25lZCBtZW1vcnksIHRvIGJlIHVzZWQgYnkgY2xpZW50IGNvZGUuCisgICAgc2l6ZV90IHNpemVfYWxpZ25lZDsgICAgLy8gU2l6ZSBvZiBhbGlnbmVkIG1lbW9yeSBibG9jay4KK307Cit0eXBlZGVmIHN0cnVjdCBrbXBfbWVtX2Rlc2NyIGttcF9tZW1fZGVzY3JfdDsKKworLyoKKyAgICBBbGxvY2F0ZSBtZW1vcnkgb24gcmVxdWVzdGVkIGJvdW5kYXJ5LCBmaWxsIGFsbG9jYXRlZCBtZW1vcnkgd2l0aCAweDAwLgorICAgIE5VTEwgaXMgTkVWRVIgcmV0dXJuZWQsIF9fa21wX2Fib3J0KCkgaXMgY2FsbGVkIGluIGNhc2Ugb2YgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IuCisgICAgTXVzdCB1c2UgX19rbXBfZnJlZSB3aGVuIGZyZWVpbmcgbWVtb3J5IGFsbG9jYXRlZCBieSB0aGlzIHJvdXRpbmUhCisgKi8KK3N0YXRpYwordm9pZCAqCitfX19rbXBfYWxsb2NhdGVfYWxpZ24oIHNpemVfdCBzaXplLCBzaXplX3QgYWxpZ25tZW50IEtNUF9TUkNfTE9DX0RFQ0wgKQoreworICAgIC8qCisgICAgICAgICAgICBfX2ttcF9hbGxvY2F0ZSgpIGFsbG9jYXRlcyAoYnkgY2FsbCB0byBtYWxsb2MoKSkgYmlnZ2VyIG1lbW9yeSBibG9jayB0aGFuIHJlcXVlc3RlZCB0bworICAgICAgICByZXR1cm4gcHJvcGVybHkgYWxpZ25lZCBwb2ludGVyLiBPcmlnaW5hbCBwb2ludGVyIHJldHVybmVkIGJ5IG1hbGxvYygpIGFuZCBzaXplIG9mIGFsbG9jYXRlZAorICAgICAgICBibG9jayBpcyBzYXZlZCBpbiBkZXNjcmlwdG9yIGp1c3QgYmVmb3JlIHRoZSBhbGlnbmVkIHBvaW50ZXIuIFRoaXMgaW5mb3JtYXRpb24gdXNlZCBieQorICAgICAgICBfX2ttcF9mcmVlKCkgLS0gaXQgaGFzIHRvIHBhc3MgdG8gZnJlZSgpIG9yaWdpbmFsIHBvaW50ZXIsIG5vdCBhbGlnbmVkIG9uZS4KKworICAgICAgICAgICAgKy0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKworICAgICAgICAgICAgfCBwYWRkaW5nIHwgZGVzY3JpcHRvciB8ICAgICAgICAgICBhbGlnbmVkIGJsb2NrICAgICAgICAgICB8IHBhZGRpbmcgfAorICAgICAgICAgICAgKy0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKworICAgICAgICAgICAgXiAgICAgICAgICAgICAgICAgICAgICBeCisgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgKy0gQWxpZ25lZCBwb2ludGVyIHJldHVybmVkIHRvIGNhbGxlcgorICAgICAgICAgICAgKy0gUG9pbnRlciByZXR1cm5lZCBieSBtYWxsb2MoKQorCisgICAgICAgIEFsaWduZWQgYmxvY2sgaXMgZmlsbGVkIHdpdGggemVyb3MsIHBhZGRpbmdzIGFyZSBmaWxsZWQgd2l0aCAweEVGLgorICAgICovCisKKyAgICBrbXBfbWVtX2Rlc2NyX3QgIGRlc2NyOworICAgIGttcF91aW50cHRyX3QgICAgYWRkcl9hbGxvY2F0ZWQ7ICAgICAgICAvLyBBZGRyZXNzIHJldHVybmVkIGJ5IG1hbGxvYygpLgorICAgIGttcF91aW50cHRyX3QgICAgYWRkcl9hbGlnbmVkOyAgICAgICAgICAvLyBBbGlnbmVkIGFkZHJlc3MgdG8gcmV0dXJuIHRvIGNhbGxlci4KKyAgICBrbXBfdWludHB0cl90ICAgIGFkZHJfZGVzY3I7ICAgICAgICAgICAgLy8gQWRkcmVzcyBvZiBtZW1vcnkgYmxvY2sgZGVzY3JpcHRvci4KKworICAgIEtFX1RSQUNFKCAyNSwgKAorICAgICAgICAiLT4gX19fa21wX2FsbG9jYXRlX2FsaWduKCAlZCwgJWQgKSBjYWxsZWQgZnJvbSAlczolZFxuIiwKKyAgICAgICAgKGludCkgc2l6ZSwKKyAgICAgICAgKGludCkgYWxpZ25tZW50CisgICAgICAgIEtNUF9TUkNfTE9DX1BBUk0KKyAgICApICk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBhbGlnbm1lbnQgPCAzMiAqIDEwMjQgKTsgLy8gQWxpZ25tZW50IHNob3VsZCBub3QgYmUgdG9vCisgICAgS01QX0RFQlVHX0FTU0VSVCggc2l6ZW9mKCB2b2lkICogKSA8PSBzaXplb2YoIGttcF91aW50cHRyX3QgKSApOworICAgICAgICAvLyBNYWtlIHN1cmUga21wX3VpbnRwdHJfdCBpcyBlbm91Z2ggdG8gc3RvcmUgYWRkcmVzc2VzLgorCisgICAgZGVzY3Iuc2l6ZV9hbGlnbmVkID0gc2l6ZTsKKyAgICBkZXNjci5zaXplX2FsbG9jYXRlZCA9IGRlc2NyLnNpemVfYWxpZ25lZCArIHNpemVvZigga21wX21lbV9kZXNjcl90ICkgKyBhbGlnbm1lbnQ7CisKKyAgICAjaWYgS01QX0RFQlVHCisgICAgICAgIGRlc2NyLnB0cl9hbGxvY2F0ZWQgPSBfbWFsbG9jX3NyY19sb2MoIGRlc2NyLnNpemVfYWxsb2NhdGVkLCBfZmlsZV8sIF9saW5lXyApOworICAgICNlbHNlCisgICAgZGVzY3IucHRyX2FsbG9jYXRlZCA9IG1hbGxvY19zcmNfbG9jKCBkZXNjci5zaXplX2FsbG9jYXRlZCBLTVBfU1JDX0xPQ19QQVJNICk7CisgICAgI2VuZGlmCisgICAgS0VfVFJBQ0UoIDEwLCAoCisgICAgICAgICIgICBtYWxsb2MoICVkICkgcmV0dXJuZWQgJXBcbiIsCisgICAgICAgIChpbnQpIGRlc2NyLnNpemVfYWxsb2NhdGVkLAorICAgICAgICBkZXNjci5wdHJfYWxsb2NhdGVkCisgICAgKSApOworICAgIGlmICggZGVzY3IucHRyX2FsbG9jYXRlZCA9PSBOVUxMICkgeworICAgICAgICBLTVBfRkFUQUwoIE91dE9mSGVhcE1lbW9yeSApOworICAgIH07CisKKyAgICBhZGRyX2FsbG9jYXRlZCA9IChrbXBfdWludHB0cl90KSBkZXNjci5wdHJfYWxsb2NhdGVkOworICAgIGFkZHJfYWxpZ25lZCA9CisgICAgICAgICggYWRkcl9hbGxvY2F0ZWQgKyBzaXplb2YoIGttcF9tZW1fZGVzY3JfdCApICsgYWxpZ25tZW50ICkKKyAgICAgICAgJiB+ICggYWxpZ25tZW50IC0gMSApOworICAgIGFkZHJfZGVzY3IgPSBhZGRyX2FsaWduZWQgLSBzaXplb2YoIGttcF9tZW1fZGVzY3JfdCApOworCisgICAgZGVzY3IucHRyX2FsaWduZWQgPSAodm9pZCAqKSBhZGRyX2FsaWduZWQ7CisKKyAgICBLRV9UUkFDRSggMjYsICgKKyAgICAgICAgIiAgIF9fX2ttcF9hbGxvY2F0ZV9hbGlnbjogIgorICAgICAgICAgICAgInB0cl9hbGxvY2F0ZWQ9JXAsIHNpemVfYWxsb2NhdGVkPSVkLCAiCisgICAgICAgICAgICAicHRyX2FsaWduZWQ9JXAsIHNpemVfYWxpZ25lZD0lZFxuIiwKKyAgICAgICAgZGVzY3IucHRyX2FsbG9jYXRlZCwKKyAgICAgICAgKGludCkgZGVzY3Iuc2l6ZV9hbGxvY2F0ZWQsCisgICAgICAgIGRlc2NyLnB0cl9hbGlnbmVkLAorICAgICAgICAoaW50KSBkZXNjci5zaXplX2FsaWduZWQKKyAgICApICk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBhZGRyX2FsbG9jYXRlZCA8PSBhZGRyX2Rlc2NyICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggYWRkcl9kZXNjciArIHNpemVvZigga21wX21lbV9kZXNjcl90ICkgPT0gYWRkcl9hbGlnbmVkICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggYWRkcl9hbGlnbmVkICsgZGVzY3Iuc2l6ZV9hbGlnbmVkIDw9IGFkZHJfYWxsb2NhdGVkICsgZGVzY3Iuc2l6ZV9hbGxvY2F0ZWQgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBhZGRyX2FsaWduZWQgJSBhbGlnbm1lbnQgPT0gMCApOworCisgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICBtZW1zZXQoIGRlc2NyLnB0cl9hbGxvY2F0ZWQsIDB4RUYsIGRlc2NyLnNpemVfYWxsb2NhdGVkICk7CisgICAgICAgICAgICAvLyBGaWxsIGFsbG9jYXRlZCBtZW1vcnkgYmxvY2sgd2l0aCAweEVGLgorICAgICNlbmRpZgorICAgIG1lbXNldCggZGVzY3IucHRyX2FsaWduZWQsIDB4MDAsIGRlc2NyLnNpemVfYWxpZ25lZCApOworICAgICAgICAvLyBGaWxsIHRoZSBhbGlnbmVkIG1lbW9yeSBibG9jayAod2hpY2ggaXMgaW50ZW5kZWQgZm9yIHVzaW5nIGJ5IGNhbGxlcikgd2l0aCAweDAwLiBEbyBub3QKKyAgICAgICAgLy8gcHV0IHRoaXMgZmlsbGluZyB1bmRlciBLTVBfREVCVUcgY29uZGl0aW9uISBNYW55IGNhbGxlcnMgZXhwZWN0IHplcm9lZCBtZW1vcnkuIChQYWRkaW5nCisgICAgICAgIC8vIGJ5dGVzIHJlbWFpbiBmaWxsZWQgd2l0aCAweEVGIGluIGRlYnVnZ2luZyBsaWJyYXJ5LikKKyAgICAqICggKGttcF9tZW1fZGVzY3JfdCAqKSBhZGRyX2Rlc2NyICkgPSBkZXNjcjsKKworICAgIEtNUF9NQigpOworCisgICAgS0VfVFJBQ0UoIDI1LCAoICI8LSBfX19rbXBfYWxsb2NhdGVfYWxpZ24oKSByZXR1cm5zICVwXG4iLCBkZXNjci5wdHJfYWxpZ25lZCApICk7CisgICAgcmV0dXJuIGRlc2NyLnB0cl9hbGlnbmVkOworCit9IC8vIGZ1bmMgX19fa21wX2FsbG9jYXRlX2FsaWduCisKKworLyoKKyAgICBBbGxvY2F0ZSBtZW1vcnkgb24gY2FjaGUgbGluZSBib3VuZGFyeSwgZmlsbCBhbGxvY2F0ZWQgbWVtb3J5IHdpdGggMHgwMC4KKyAgICBEbyBub3QgY2FsbCB0aGlzIGZ1bmMgZGlyZWN0bHkhIFVzZSBfX2ttcF9hbGxvY2F0ZSBtYWNybyBpbnN0ZWFkLgorICAgIE5VTEwgaXMgTkVWRVIgcmV0dXJuZWQsIF9fa21wX2Fib3J0KCkgaXMgY2FsbGVkIGluIGNhc2Ugb2YgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IuCisgICAgTXVzdCB1c2UgX19rbXBfZnJlZSB3aGVuIGZyZWVpbmcgbWVtb3J5IGFsbG9jYXRlZCBieSB0aGlzIHJvdXRpbmUhCisgKi8KK3ZvaWQgKgorX19fa21wX2FsbG9jYXRlKCBzaXplX3Qgc2l6ZSBLTVBfU1JDX0xPQ19ERUNMICkKK3sKKworICAgIHZvaWQgKiBwdHI7CisgICAgS0VfVFJBQ0UoIDI1LCAoICItPiBfX2ttcF9hbGxvY2F0ZSggJWQgKSBjYWxsZWQgZnJvbSAlczolZFxuIiwgKGludCkgc2l6ZSBLTVBfU1JDX0xPQ19QQVJNICkgKTsKKyAgICAgICAgcHRyID0gX19fa21wX2FsbG9jYXRlX2FsaWduKCBzaXplLCBfX2ttcF9hbGlnbl9hbGxvYyBLTVBfU1JDX0xPQ19QQVJNICk7CisgICAgS0VfVFJBQ0UoIDI1LCAoICI8LSBfX2ttcF9hbGxvY2F0ZSgpIHJldHVybnMgJXBcbiIsIHB0ciApICk7CisgICAgcmV0dXJuIHB0cjsKKworfSAvLyBmdW5jIF9fX2ttcF9hbGxvY2F0ZQorCisjaWYgKEJVSUxEX01FTU9SWT09RklSU1RfVE9VQ0gpCit2b2lkICoKK19fa21wX2Z0X3BhZ2VfYWxsb2NhdGUoc2l6ZV90IHNpemUpCit7CisgIHZvaWQgKmFkciwgKmFhZHI7CisjaWYgS01QX09TX0xJTlVYCisgIC8qIFRPRE86IFVzZSB0aGlzIGZ1bmN0aW9uIHRvIGdldCBwYWdlIHNpemUgZXZlcnl3aGVyZSAqLworICBpbnQgcGFnZV9zaXplID0gZ2V0cGFnZXNpemUoKTsKKyNlbHNlCisgIC8qIFRPRE86IEZpbmQgd2luZG93cyBmdW5jdGlvbiB0byBnZXQgcGFnZSBzaXplIGFuZCB1c2UgaXQgZXZlcnl3aGVyZSAqLworICBpbnQgcGFnZV9zaXplID0gUEFHRV9TSVpFOworI2VuZGlmIC8qIEtNUF9PU19MSU5VWCAqLworCisgIGFkciA9ICh2b2lkICopIF9fa21wX3RocmVhZF9tYWxsb2MoIF9fa21wX2dldF90aHJlYWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgKyBwYWdlX3NpemUgKyBLTVBfUFRSX1NLSVApOworICBpZiAoIGFkciA9PSAwICkKKyAgICBLTVBfRkFUQUwoIE91dE9mSGVhcE1lbW9yeSApOworCisgIC8qIGNoZWNrIHRvIHNlZSBpZiBhZHIgaXMgb24gYSBwYWdlIGJvdW5kYXJ5LiAqLworICBpZiAoICggKGttcF91aW50cHRyX3QpIGFkciAmIChwYWdlX3NpemUgLSAxKSkgPT0gMCkKKyAgICAvKiBub3RoaW5nIHRvIGRvIGlmIGFkciBpcyBhbHJlYWR5IG9uIGEgcGFnZSBib3VuZGFyeS4gKi8KKyAgICBhYWRyID0gYWRyOworICBlbHNlCisgICAgLyogZWxzZSBzZXQgYWFkciB0byB0aGUgZmlyc3QgcGFnZSBib3VuZGFyeSBpbiB0aGUgYWxsb2NhdGVkIG1lbW9yeS4gKi8KKyAgICBhYWRyID0gKHZvaWQgKikgKCAoIChrbXBfdWludHB0cl90KSBhZHIgKyBwYWdlX3NpemUpICYgfihwYWdlX3NpemUgLSAxKSApOworCisgIC8qIHRoZSBmaXJzdCB0b3VjaCBieSB0aGUgb3duZXIgdGhyZWFkLiAqLworICAqKCh2b2lkKiopYWFkcikgPSBhZHI7CisKKyAgLyogc2tpcCB0aGUgbWVtb3J5IHNwYWNlIHVzZWQgZm9yIHN0b3JpbmcgYWRyIGFib3ZlLiAqLworICByZXR1cm4gKHZvaWQqKSgoY2hhciopYWFkciArIEtNUF9QVFJfU0tJUCk7Cit9CisjZW5kaWYKKworLyoKKyAgICBBbGxvY2F0ZSBtZW1vcnkgb24gcGFnZSBib3VuZGFyeSwgZmlsbCBhbGxvY2F0ZWQgbWVtb3J5IHdpdGggMHgwMC4KKyAgICBEb2VzIG5vdCBjYWxsIHRoaXMgZnVuYyBkaXJlY3RseSEgVXNlIF9fa21wX3BhZ2VfYWxsb2NhdGUgbWFjcm8gaW5zdGVhZC4KKyAgICBOVUxMIGlzIE5FVkVSIHJldHVybmVkLCBfX2ttcF9hYm9ydCgpIGlzIGNhbGxlZCBpbiBjYXNlIG9mIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yLgorICAgIE11c3QgdXNlIF9fa21wX2ZyZWUgd2hlbiBmcmVlaW5nIG1lbW9yeSBhbGxvY2F0ZWQgYnkgdGhpcyByb3V0aW5lIQorICovCit2b2lkICoKK19fX2ttcF9wYWdlX2FsbG9jYXRlKCBzaXplX3Qgc2l6ZSBLTVBfU1JDX0xPQ19ERUNMICkKK3sKKyAgICBpbnQgICAgcGFnZV9zaXplID0gOCAqIDEwMjQ7CisgICAgdm9pZCAqIHB0cjsKKworICAgIEtFX1RSQUNFKCAyNSwgKAorICAgICAgICAiLT4gX19rbXBfcGFnZV9hbGxvY2F0ZSggJWQgKSBjYWxsZWQgZnJvbSAlczolZFxuIiwKKyAgICAgICAgKGludCkgc2l6ZQorICAgICAgICBLTVBfU1JDX0xPQ19QQVJNCisgICAgKSApOworICAgICAgICBwdHIgPSBfX19rbXBfYWxsb2NhdGVfYWxpZ24oIHNpemUsIHBhZ2Vfc2l6ZSBLTVBfU1JDX0xPQ19QQVJNICk7CisgICAgS0VfVFJBQ0UoIDI1LCAoICI8LSBfX2ttcF9wYWdlX2FsbG9jYXRlKCAlZCApIHJldHVybnMgJXBcbiIsIChpbnQpIHNpemUsIHB0ciApICk7CisgICAgcmV0dXJuIHB0cjsKK30gLy8gX19fa21wX3BhZ2VfYWxsb2NhdGUKKworLyoKKyAgICBGcmVlIG1lbW9yeSBhbGxvY2F0ZWQgYnkgX19rbXBfYWxsb2NhdGUoKSBhbmQgX19rbXBfcGFnZV9hbGxvY2F0ZSgpLgorICAgIEluIGRlYnVnIG1vZGUsIGZpbGwgdGhlIG1lbW9yeSBibG9jayB3aXRoIDB4RUYgYmVmb3JlIGNhbGwgdG8gZnJlZSgpLgorKi8KK3ZvaWQKK19fX2ttcF9mcmVlKCB2b2lkICogcHRyIEtNUF9TUkNfTE9DX0RFQ0wgKQoreworCisgICAgICAgIGttcF9tZW1fZGVzY3JfdCBkZXNjcjsKKyAgICAgICAga21wX3VpbnRwdHJfdCAgIGFkZHJfYWxsb2NhdGVkOyAgICAgICAgLy8gQWRkcmVzcyByZXR1cm5lZCBieSBtYWxsb2MoKS4KKyAgICAgICAga21wX3VpbnRwdHJfdCAgIGFkZHJfYWxpZ25lZDsgICAgICAgICAgLy8gQWxpZ25lZCBhZGRyZXNzIHBhc3NlZCBieSBjYWxsZXIuCisKKyAgICAgICAgS0VfVFJBQ0UoIDI1LCAoICItPiBfX2ttcF9mcmVlKCAlcCApIGNhbGxlZCBmcm9tICVzOiVkXG4iLCBwdHIgS01QX1NSQ19MT0NfUEFSTSApICk7CisgICAgICAgIEtNUF9BU1NFUlQoIHB0ciAhPSBOVUxMICk7CisKKyAgICAgICAgZGVzY3IgPSAqICgga21wX21lbV9kZXNjcl90ICopICggKGttcF91aW50cHRyX3QpIHB0ciAtIHNpemVvZigga21wX21lbV9kZXNjcl90ICkgKTsKKworICAgICAgICBLRV9UUkFDRSggMjYsICggIiAgIF9fa21wX2ZyZWU6ICAgICAiCisgICAgICAgICAgICAgICAgICAgICAgICAicHRyX2FsbG9jYXRlZD0lcCwgc2l6ZV9hbGxvY2F0ZWQ9JWQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJwdHJfYWxpZ25lZD0lcCwgc2l6ZV9hbGlnbmVkPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3IucHRyX2FsbG9jYXRlZCwgKGludCkgZGVzY3Iuc2l6ZV9hbGxvY2F0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjci5wdHJfYWxpZ25lZCwgKGludCkgZGVzY3Iuc2l6ZV9hbGlnbmVkICkpOworCisgICAgICAgIGFkZHJfYWxsb2NhdGVkID0gKGttcF91aW50cHRyX3QpIGRlc2NyLnB0cl9hbGxvY2F0ZWQ7CisgICAgICAgIGFkZHJfYWxpZ25lZCAgID0gKGttcF91aW50cHRyX3QpIGRlc2NyLnB0cl9hbGlnbmVkOworCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGFkZHJfYWxpZ25lZCAlIENBQ0hFX0xJTkUgPT0gMCApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBkZXNjci5wdHJfYWxpZ25lZCA9PSBwdHIgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggYWRkcl9hbGxvY2F0ZWQgKyBzaXplb2YoIGttcF9tZW1fZGVzY3JfdCApIDw9IGFkZHJfYWxpZ25lZCApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBkZXNjci5zaXplX2FsaWduZWQgPCBkZXNjci5zaXplX2FsbG9jYXRlZCApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBhZGRyX2FsaWduZWQgKyBkZXNjci5zaXplX2FsaWduZWQgPD0gYWRkcl9hbGxvY2F0ZWQgKyBkZXNjci5zaXplX2FsbG9jYXRlZCApOworCisgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgIG1lbXNldCggZGVzY3IucHRyX2FsbG9jYXRlZCwgMHhFRiwgZGVzY3Iuc2l6ZV9hbGxvY2F0ZWQgKTsKKyAgICAgICAgICAgICAgICAvLyBGaWxsIG1lbW9yeSBibG9jayB3aXRoIDB4RUYsIGl0IGhlbHBzIGNhdGNoIHVzaW5nIGZyZWVkIG1lbW9yeS4KKyAgICAgICAgI2VuZGlmCisKKyAgICAgICAgI2lmbmRlZiBMRUFLX01FTU9SWQorICAgICAgICAgICAgS0VfVFJBQ0UoIDEwLCAoICIgICBmcmVlKCAlcCApXG4iLCBkZXNjci5wdHJfYWxsb2NhdGVkICkgKTsKKyAgICAgICAgIyBpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgIF9mcmVlX3NyY19sb2MoIGRlc2NyLnB0cl9hbGxvY2F0ZWQsIF9maWxlXywgX2xpbmVfICk7CisgICAgICAgICMgZWxzZQorICAgICAgICAgICAgZnJlZV9zcmNfbG9jKCBkZXNjci5wdHJfYWxsb2NhdGVkIEtNUF9TUkNfTE9DX1BBUk0gKTsKKyAgICAgICAgIyBlbmRpZgorICAgICAgICAjZW5kaWYKKworICAgIEtNUF9NQigpOworCisgICAgS0VfVFJBQ0UoIDI1LCAoICI8LSBfX2ttcF9mcmVlKCkgcmV0dXJuc1xuIiApICk7CisKK30gLy8gZnVuYyBfX19rbXBfZnJlZQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgVVNFX0ZBU1RfTUVNT1JZID09IDMKKy8vIEFsbG9jYXRlIGZhc3QgbWVtb3J5IGJ5IGZpcnN0IHNjYW5uaW5nIHRoZSB0aHJlYWQncyBmcmVlIGxpc3RzCisvLyBJZiBhIGNodW5rIHRoZSByaWdodCBzaXplIGV4aXN0cywgZ3JhYiBpdCBvZmYgdGhlIGZyZWUgbGlzdC4KKy8vIE90aGVyd2lzZSBhbGxvY2F0ZSBub3JtYWxseSB1c2luZyBrbXBfdGhyZWFkX21hbGxvYy4KKworLy8gQUM6IEhvdyB0byBjaG9vc2UgdGhlIGxpbWl0PyBKdXN0IGdldCAxNiBmb3Igbm93Li4uCisjZGVmaW5lIEtNUF9GUkVFX0xJU1RfTElNSVQgMTYKKworLy8gQWx3YXlzIHVzZSAxMjggYnl0ZXMgZm9yIGRldGVybWluaW5nIGJ1Y2tldHMgZm9yIGNhY2hpbmcgbWVtb3J5IGJsb2NrcworI2RlZmluZSBEQ0FDSEVfTElORSAgMTI4CisKK3ZvaWQgKgorX19fa21wX2Zhc3RfYWxsb2NhdGUoIGttcF9pbmZvX3QgKnRoaXNfdGhyLCBzaXplX3Qgc2l6ZSBLTVBfU1JDX0xPQ19ERUNMICkKK3sKKyAgICB2b2lkICAgICAgICAgICAgKiBwdHI7CisgICAgaW50ICAgICAgICAgICAgICAgbnVtX2xpbmVzOworICAgIGludCAgICAgICAgICAgICAgIGlkeDsKKyAgICBpbnQgICAgICAgICAgICAgICBpbmRleDsKKyAgICB2b2lkICAgICAgICAgICAgKiBhbGxvY19wdHI7CisgICAgc2l6ZV90ICAgICAgICAgICAgYWxsb2Nfc2l6ZTsKKyAgICBrbXBfbWVtX2Rlc2NyX3QgKiBkZXNjcjsKKworICAgIEtFX1RSQUNFKCAyNSwgKCAiLT4gX19rbXBfZmFzdF9hbGxvY2F0ZSggVCMlZCwgJWQgKSBjYWxsZWQgZnJvbSAlczolZFxuIiwKKyAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQodGhpc190aHIpLCAoaW50KSBzaXplIEtNUF9TUkNfTE9DX1BBUk0gKSApOworCisgICAgbnVtX2xpbmVzID0gKCBzaXplICsgRENBQ0hFX0xJTkUgLSAxICkgLyBEQ0FDSEVfTElORTsKKyAgICBpZHggPSBudW1fbGluZXMgLSAxOworICAgIEtNUF9ERUJVR19BU1NFUlQoIGlkeCA+PSAwICk7CisgICAgaWYgKCBpZHggPCAyICkgeworICAgICAgICBpbmRleCA9IDA7ICAgICAgIC8vIGlkeCBpcyBbIDAsIDEgXSwgdXNlIGZpcnN0IGZyZWUgbGlzdAorICAgICAgICBudW1fbGluZXMgPSAyOyAgIC8vIDEsIDIgY2FjaGUgbGluZXMgb3IgbGVzcyB0aGFuIGNhY2hlIGxpbmUKKyAgICB9IGVsc2UgaWYgKCAoIGlkeCA+Pj0gMiApID09IDAgKSB7CisgICAgICAgIGluZGV4ID0gMTsgICAgICAgLy8gaWR4IGlzIFsgMiwgMyBdLCB1c2Ugc2Vjb25kIGZyZWUgbGlzdAorICAgICAgICBudW1fbGluZXMgPSA0OyAgIC8vIDMsIDQgY2FjaGUgbGluZXMKKyAgICB9IGVsc2UgaWYgKCAoIGlkeCA+Pj0gMiApID09IDAgKSB7CisgICAgICAgIGluZGV4ID0gMjsgICAgICAgLy8gaWR4IGlzIFsgNCwgMTUgXSwgdXNlIHRoaXJkIGZyZWUgbGlzdAorICAgICAgICBudW1fbGluZXMgPSAxNjsgIC8vIDUsIDYsIC4uLiwgMTYgY2FjaGUgbGluZXMKKyAgICB9IGVsc2UgaWYgKCAoIGlkeCA+Pj0gMiApID09IDAgKSB7CisgICAgICAgIGluZGV4ID0gMzsgICAgICAgLy8gaWR4IGlzIFsgMTYsIDYzIF0sIHVzZSBmb3VydGggZnJlZSBsaXN0CisgICAgICAgIG51bV9saW5lcyA9IDY0OyAgLy8gMTcsIDE4LCAuLi4sIDY0IGNhY2hlIGxpbmVzCisgICAgfSBlbHNlIHsKKyAgICAgICAgZ290byBhbGxvY19jYWxsOyAvLyA2NSBvciBtb3JlIGNhY2hlIGxpbmVzICggPiA4S0IgKSwgZG9uJ3QgdXNlIGZyZWUgbGlzdHMKKyAgICB9CisKKyAgICBwdHIgPSB0aGlzX3Roci0+dGgudGhfZnJlZV9saXN0c1tpbmRleF0udGhfZnJlZV9saXN0X3NlbGY7CisgICAgaWYgKCBwdHIgIT0gTlVMTCApIHsKKyAgICAgICAgLy8gcG9wIHRoZSBoZWFkIG9mIG5vLXN5bmMgZnJlZSBsaXN0CisgICAgICAgIHRoaXNfdGhyLT50aC50aF9mcmVlX2xpc3RzW2luZGV4XS50aF9mcmVlX2xpc3Rfc2VsZiA9ICooKHZvaWQgKiopcHRyKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGhpc190aHIgPT0KKyAgICAgICAgICAgICgoa21wX21lbV9kZXNjcl90ICopKCAoa21wX3VpbnRwdHJfdClwdHIgLSBzaXplb2Yoa21wX21lbV9kZXNjcl90KSApKS0+cHRyX2FsaWduZWQgKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfTsKKyAgICBwdHIgPSBUQ1JfU1lOQ19QVFIoIHRoaXNfdGhyLT50aC50aF9mcmVlX2xpc3RzW2luZGV4XS50aF9mcmVlX2xpc3Rfc3luYyApOworICAgIGlmICggcHRyICE9IE5VTEwgKSB7CisgICAgICAgIC8vIG5vLXN5bmMgZnJlZSBsaXN0IGlzIGVtcHR5LCB1c2Ugc3luYyBmcmVlIGxpc3QgKGZpbGxlZCBpbiBieSBvdGhlciB0aHJlYWRzIG9ubHkpCisgICAgICAgIC8vIHBvcCB0aGUgaGVhZCBvZiB0aGUgc3luYyBmcmVlIGxpc3QsIHB1c2ggTlVMTCBpbnN0ZWFkCisgICAgICAgIHdoaWxlICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUFRSKAorICAgICAgICAgICAgJnRoaXNfdGhyLT50aC50aF9mcmVlX2xpc3RzW2luZGV4XS50aF9mcmVlX2xpc3Rfc3luYywgcHRyLCBOVUxMICkgKQorICAgICAgICB7CisgICAgICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgICAgICBwdHIgPSBUQ1JfU1lOQ19QVFIoIHRoaXNfdGhyLT50aC50aF9mcmVlX2xpc3RzW2luZGV4XS50aF9mcmVlX2xpc3Rfc3luYyApOworICAgICAgICB9CisgICAgICAgIC8vIHB1c2ggdGhlIHJlc3Qgb2YgY2hhaW4gaW50byBuby1zeW5jIGZyZWUgbGlzdCAoY2FuIGJlIE5VTEwgaWYgdGhlcmUgd2FzIHRoZSBvbmx5IGJsb2NrKQorICAgICAgICB0aGlzX3Roci0+dGgudGhfZnJlZV9saXN0c1tpbmRleF0udGhfZnJlZV9saXN0X3NlbGYgPSAqKCh2b2lkICoqKXB0cik7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoaXNfdGhyID09CisgICAgICAgICAgICAoKGttcF9tZW1fZGVzY3JfdCAqKSggKGttcF91aW50cHRyX3QpcHRyIC0gc2l6ZW9mKGttcF9tZW1fZGVzY3JfdCkgKSktPnB0cl9hbGlnbmVkICk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIGFsbG9jX2NhbGw6CisgICAgLy8gaGF2ZW4ndCBmb3VuZCBibG9jayBpbiB0aGUgZnJlZSBsaXN0cywgdGh1cyBhbGxvY2F0ZSBpdAorICAgIHNpemUgPSBudW1fbGluZXMgKiBEQ0FDSEVfTElORTsKKworICAgIGFsbG9jX3NpemUgPSBzaXplICsgc2l6ZW9mKCBrbXBfbWVtX2Rlc2NyX3QgKSArIERDQUNIRV9MSU5FOworICAgIEtFX1RSQUNFKCAyNSwgKCAiX19rbXBfZmFzdF9hbGxvY2F0ZTogVCMlZCBDYWxsaW5nIF9fa21wX3RocmVhZF9tYWxsb2Mgd2l0aCBhbGxvY19zaXplICVkXG4iLAorICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRoaXNfdGhyICksIGFsbG9jX3NpemUgKSApOworICAgIGFsbG9jX3B0ciA9IGJnZXQoIHRoaXNfdGhyLCAoYnVmc2l6ZSkgYWxsb2Nfc2l6ZSApOworCisgICAgLy8gYWxpZ24gcHRyIHRvIERDQUNIRV9MSU5FCisgICAgcHRyID0gKHZvaWQgKikoKCAoKGttcF91aW50cHRyX3QpYWxsb2NfcHRyKSArIHNpemVvZihrbXBfbWVtX2Rlc2NyX3QpICsgRENBQ0hFX0xJTkUgKSAmIH4oIERDQUNIRV9MSU5FIC0gMSApKTsKKyAgICBkZXNjciA9IChrbXBfbWVtX2Rlc2NyX3QgKikoICgoa21wX3VpbnRwdHJfdClwdHIpIC0gc2l6ZW9mKGttcF9tZW1fZGVzY3JfdCkgKTsKKworICAgIGRlc2NyLT5wdHJfYWxsb2NhdGVkID0gYWxsb2NfcHRyOyAgICAgICAgLy8gcmVtZW1iZXIgYWxsb2NhdGVkIHBvaW50ZXIKKyAgICAvLyB3ZSBkb24ndCBuZWVkIHNpemVfYWxsb2NhdGVkCisgICAgZGVzY3ItPnB0cl9hbGlnbmVkICAgPSAodm9pZCAqKXRoaXNfdGhyOyAvLyByZW1lbWJlciBhbGxvY2F0aW5nIHRocmVhZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGl0IGlzIGFscmVhZHkgc2F2ZWQgaW4gYmdldCBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidXQgd2UgbWF5IHdhbnQgdG8gdXNlIGFub3RoZXIgYWxsb2NhdG9yIGluIGZ1dHVyZSkKKyAgICBkZXNjci0+c2l6ZV9hbGlnbmVkICA9IHNpemU7CisKKyAgICBlbmQ6CisgICAgS0VfVFJBQ0UoIDI1LCAoICI8LSBfX2ttcF9mYXN0X2FsbG9jYXRlKCBUIyVkICkgcmV0dXJucyAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhpc190aHIgKSwgcHRyICkgKTsKKyAgICByZXR1cm4gcHRyOworfSAvLyBmdW5jIF9fa21wX2Zhc3RfYWxsb2NhdGUKKworLy8gRnJlZSBmYXN0IG1lbW9yeSBhbmQgcGxhY2UgaXQgb24gdGhlIHRocmVhZCdzIGZyZWUgbGlzdCBpZiBpdCBpcyBvZgorLy8gdGhlIGNvcnJlY3Qgc2l6ZS4KK3ZvaWQKK19fX2ttcF9mYXN0X2ZyZWUoIGttcF9pbmZvX3QgKnRoaXNfdGhyLCB2b2lkICogcHRyIEtNUF9TUkNfTE9DX0RFQ0wgKQoreworICAgIGttcF9tZW1fZGVzY3JfdCAqIGRlc2NyOworICAgIGttcF9pbmZvX3QgICAgICAqIGFsbG9jX3RocjsKKyAgICBzaXplX3QgICAgICAgICAgICBzaXplOworICAgIHNpemVfdCAgICAgICAgICAgIGlkeDsKKyAgICBpbnQgICAgICAgICAgICAgICBpbmRleDsKKworICAgIEtFX1RSQUNFKCAyNSwgKCAiLT4gX19rbXBfZmFzdF9mcmVlKCBUIyVkLCAlcCApIGNhbGxlZCBmcm9tICVzOiVkXG4iLAorICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCh0aGlzX3RociksIHB0ciBLTVBfU1JDX0xPQ19QQVJNICkgKTsKKyAgICBLTVBfQVNTRVJUKCBwdHIgIT0gTlVMTCApOworCisgICAgZGVzY3IgPSAoa21wX21lbV9kZXNjcl90ICopKCAoKGttcF91aW50cHRyX3QpcHRyKSAtIHNpemVvZihrbXBfbWVtX2Rlc2NyX3QpICk7CisKKyAgICBLRV9UUkFDRSgyNiwgKCIgICBfX2ttcF9mYXN0X2ZyZWU6ICAgICBzaXplX2FsaWduZWQ9JWRcbiIsCisgICAgICAgICAgICAgICAgICAoaW50KSBkZXNjci0+c2l6ZV9hbGlnbmVkICkgKTsKKworICAgIHNpemUgPSBkZXNjci0+c2l6ZV9hbGlnbmVkOyAvLyAyLCA0LCAxNiwgNjQsIDY1LCA2NiwgLi4uIGNhY2hlIGxpbmVzCisKKyAgICBpZHggPSBEQ0FDSEVfTElORSAqIDI7IC8vIDIgY2FjaGUgbGluZXMgaXMgbWluaW1hbCBzaXplIG9mIGJsb2NrCisgICAgaWYgKCBpZHggPT0gc2l6ZSApIHsKKyAgICAgICAgaW5kZXggPSAwOyAgICAgICAvLyAyIGNhY2hlIGxpbmVzCisgICAgfSBlbHNlIGlmICggKCBpZHggPDw9IDEgKSA9PSBzaXplICkgeworICAgICAgICBpbmRleCA9IDE7ICAgICAgIC8vIDQgY2FjaGUgbGluZXMKKyAgICB9IGVsc2UgaWYgKCAoIGlkeCA8PD0gMiApID09IHNpemUgKSB7CisgICAgICAgIGluZGV4ID0gMjsgICAgICAgLy8gMTYgY2FjaGUgbGluZXMKKyAgICB9IGVsc2UgaWYgKCAoIGlkeCA8PD0gMiApID09IHNpemUgKSB7CisgICAgICAgIGluZGV4ID0gMzsgICAgICAgLy8gNjQgY2FjaGUgbGluZXMKKyAgICB9IGVsc2UgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBzaXplID4gRENBQ0hFX0xJTkUgKiA2NCApOworICAgICAgICBnb3RvIGZyZWVfY2FsbDsgIC8vIDY1IG9yIG1vcmUgY2FjaGUgbGluZXMgKCA+IDhLQiApCisgICAgfQorCisgICAgYWxsb2NfdGhyID0gKGttcF9pbmZvX3QgKilkZXNjci0+cHRyX2FsaWduZWQ7IC8vIGdldCB0aHJlYWQgb3duaW5nIHRoZSBibG9jaworICAgIGlmICggYWxsb2NfdGhyID09IHRoaXNfdGhyICkgeworICAgICAgICAvLyBwdXNoIGJsb2NrIHRvIHNlbGYgbm8tc3luYyBmcmVlIGxpc3QsIGxpbmtpbmcgcHJldmlvdXMgaGVhZCAoTElGTykKKyAgICAgICAgKigodm9pZCAqKilwdHIpID0gdGhpc190aHItPnRoLnRoX2ZyZWVfbGlzdHNbaW5kZXhdLnRoX2ZyZWVfbGlzdF9zZWxmOworICAgICAgICB0aGlzX3Roci0+dGgudGhfZnJlZV9saXN0c1tpbmRleF0udGhfZnJlZV9saXN0X3NlbGYgPSBwdHI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdm9pZCAqIGhlYWQgPSB0aGlzX3Roci0+dGgudGhfZnJlZV9saXN0c1tpbmRleF0udGhfZnJlZV9saXN0X290aGVyOworICAgICAgICBpZiAoIGhlYWQgPT0gTlVMTCApIHsKKyAgICAgICAgICAgIC8vIENyZWF0ZSBuZXcgZnJlZSBsaXN0CisgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfZnJlZV9saXN0c1tpbmRleF0udGhfZnJlZV9saXN0X290aGVyID0gcHRyOworICAgICAgICAgICAgKigodm9pZCAqKilwdHIpID0gTlVMTDsgICAgICAgICAgICAgLy8gbWFyayB0aGUgdGFpbCBvZiB0aGUgbGlzdAorICAgICAgICAgICAgZGVzY3ItPnNpemVfYWxsb2NhdGVkID0gKHNpemVfdCkxOyAgLy8gaGVhZCBvZiB0aGUgbGlzdCBrZWVwcyBpdHMgbGVuZ3RoCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBuZWVkIHRvIGNoZWNrIGV4aXN0ZWQgIm90aGVyIiBsaXN0J3Mgb3duZXIgdGhyZWFkIGFuZCBzaXplIG9mIHF1ZXVlCisgICAgICAgICAgICBrbXBfbWVtX2Rlc2NyX3QgKiBkc2MgID0gKGttcF9tZW1fZGVzY3JfdCAqKSggKGNoYXIqKWhlYWQgLSBzaXplb2Yoa21wX21lbV9kZXNjcl90KSApOworICAgICAgICAgICAga21wX2luZm9fdCAgICAgICogcV90aCA9IChrbXBfaW5mb190ICopKGRzYy0+cHRyX2FsaWduZWQpOyAvLyBhbGxvY2F0aW5nIHRocmVhZCwgc2FtZSBmb3IgYWxsIHF1ZXVlIG5vZGVzCisgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICBxX3N6ID0gZHNjLT5zaXplX2FsbG9jYXRlZCArIDE7ICAgICAgICAgIC8vIG5ldyBzaXplIGluIGNhc2Ugd2UgYWRkIGN1cnJlbnQgdGFzaworICAgICAgICAgICAgaWYgKCBxX3RoID09IGFsbG9jX3RociAmJiBxX3N6IDw9IEtNUF9GUkVFX0xJU1RfTElNSVQgKSB7CisgICAgICAgICAgICAgICAgLy8gd2UgY2FuIGFkZCBjdXJyZW50IHRhc2sgdG8gIm90aGVyIiBsaXN0LCBubyBzeW5jIG5lZWRlZAorICAgICAgICAgICAgICAgICooKHZvaWQgKiopcHRyKSA9IGhlYWQ7CisgICAgICAgICAgICAgICAgZGVzY3ItPnNpemVfYWxsb2NhdGVkID0gcV9zejsKKyAgICAgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfZnJlZV9saXN0c1tpbmRleF0udGhfZnJlZV9saXN0X290aGVyID0gcHRyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBlaXRoZXIgcXVldWUgYmxvY2tzIG93bmVyIGlzIGNoYW5naW5nIG9yIHNpemUgbGltaXQgZXhjZWVkZWQKKyAgICAgICAgICAgICAgICAvLyByZXR1cm4gb2xkIHF1ZXVlIHRvIGFsbG9jYXRpbmcgdGhyZWFkIChxX3RoKSBzeW5jaHJvbmVvdXNseSwKKyAgICAgICAgICAgICAgICAvLyBhbmQgc3RhcnQgbmV3IGxpc3QgZm9yIGFsbG9jX3RocidzIHRhc2tzCisgICAgICAgICAgICAgICAgdm9pZCAqIG9sZF9wdHI7CisgICAgICAgICAgICAgICAgdm9pZCAqIHRhaWwgPSBoZWFkOworICAgICAgICAgICAgICAgIHZvaWQgKiBuZXh0ID0gKigodm9pZCAqKiloZWFkKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoIG5leHQgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCgKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1ZXVlIHNpemUgc2hvdWxkIGRlY3JlYXNlIGJ5IDEgZWFjaCBzdGVwIHRocm91Z2ggdGhlIGxpc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICgoa21wX21lbV9kZXNjcl90KikoKGNoYXIqKW5leHQgLSBzaXplb2Yoa21wX21lbV9kZXNjcl90KSkpLT5zaXplX2FsbG9jYXRlZCArIDEgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICgoa21wX21lbV9kZXNjcl90KikoKGNoYXIqKXRhaWwgLSBzaXplb2Yoa21wX21lbV9kZXNjcl90KSkpLT5zaXplX2FsbG9jYXRlZCApOworICAgICAgICAgICAgICAgICAgICB0YWlsID0gbmV4dDsgICAvLyByZW1lbWJlciB0YWlsIG5vZGUKKyAgICAgICAgICAgICAgICAgICAgbmV4dCA9ICooKHZvaWQgKiopbmV4dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHFfdGggIT0gTlVMTCApOworICAgICAgICAgICAgICAgIC8vIHB1c2ggYmxvY2sgdG8gb3duZXIncyBzeW5jIGZyZWUgbGlzdAorICAgICAgICAgICAgICAgIG9sZF9wdHIgPSBUQ1JfUFRSKCBxX3RoLT50aC50aF9mcmVlX2xpc3RzW2luZGV4XS50aF9mcmVlX2xpc3Rfc3luYyApOworICAgICAgICAgICAgICAgIC8qIHRoZSBuZXh0IHBvaW50ZXIgbXVzdCBiZSBzZXQgYmVmb3JlIHNldHRpbmcgZnJlZV9saXN0IHRvIHB0ciB0byBhdm9pZAorICAgICAgICAgICAgICAgICAgIGV4cG9zaW5nIGEgYnJva2VuIGxpc3QgdG8gb3RoZXIgdGhyZWFkcywgZXZlbiBmb3IgYW4gaW5zdGFudC4gKi8KKyAgICAgICAgICAgICAgICAqKCh2b2lkICoqKXRhaWwpID0gb2xkX3B0cjsKKworICAgICAgICAgICAgICAgIHdoaWxlICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUFRSKAorICAgICAgICAgICAgICAgICAgICAmcV90aC0+dGgudGhfZnJlZV9saXN0c1tpbmRleF0udGhfZnJlZV9saXN0X3N5bmMsCisgICAgICAgICAgICAgICAgICAgIG9sZF9wdHIsCisgICAgICAgICAgICAgICAgICAgIGhlYWQgKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgICAgICAgICAgICAgIG9sZF9wdHIgPSBUQ1JfUFRSKCBxX3RoLT50aC50aF9mcmVlX2xpc3RzW2luZGV4XS50aF9mcmVlX2xpc3Rfc3luYyApOworICAgICAgICAgICAgICAgICAgICAqKCh2b2lkICoqKXRhaWwpID0gb2xkX3B0cjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBzdGFydCBuZXcgbGlzdCBvZiBub3Qtc2VsdCB0YXNrcworICAgICAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9mcmVlX2xpc3RzW2luZGV4XS50aF9mcmVlX2xpc3Rfb3RoZXIgPSBwdHI7CisgICAgICAgICAgICAgICAgKigodm9pZCAqKilwdHIpID0gTlVMTDsKKyAgICAgICAgICAgICAgICBkZXNjci0+c2l6ZV9hbGxvY2F0ZWQgPSAoc2l6ZV90KTE7ICAvLyBoZWFkIG9mIHF1ZXVlIGtlZXBzIGl0cyBsZW5ndGgKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBnb3RvIGVuZDsKKworICAgIGZyZWVfY2FsbDoKKyAgICBLRV9UUkFDRSgyNSwgKCAiX19rbXBfZmFzdF9mcmVlOiBUIyVkIENhbGxpbmcgX19rbXBfdGhyZWFkX2ZyZWUgZm9yIHNpemUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhpc190aHIpLCBzaXplICkgKTsKKyAgICBfX2ttcF9iZ2V0X2RlcXVldWUoIHRoaXNfdGhyICk7ICAgICAgICAgLyogUmVsZWFzZSBhbnkgcXVldWVkIGJ1ZmZlcnMgKi8KKyAgICBicmVsKCB0aGlzX3RociwgZGVzY3ItPnB0cl9hbGxvY2F0ZWQgKTsKKworICAgIGVuZDoKKyAgICBLRV9UUkFDRSggMjUsICggIjwtIF9fa21wX2Zhc3RfZnJlZSgpIHJldHVybnNcbiIgKSApOworCit9IC8vIGZ1bmMgX19rbXBfZmFzdF9mcmVlCisKKworLy8gSW5pdGlhbGl6ZSB0aGUgdGhyZWFkIGZyZWUgbGlzdHMgcmVsYXRlZCB0byBmYXN0IG1lbW9yeQorLy8gT25seSBkbyB0aGlzIHdoZW4gYSB0aHJlYWQgaXMgaW5pdGlhbGx5IGNyZWF0ZWQuCit2b2lkCitfX2ttcF9pbml0aWFsaXplX2Zhc3RfbWVtb3J5KCBrbXBfaW5mb190ICp0aGlzX3RociApCit7CisgICAgS0VfVFJBQ0UoMTAsICggIl9fa21wX2luaXRpYWxpemVfZmFzdF9tZW1vcnk6IENhbGxlZCBmcm9tIHRoICVwXG4iLCB0aGlzX3RociApICk7CisKKyAgICBtZW1zZXQgKCB0aGlzX3Roci0+dGgudGhfZnJlZV9saXN0cywgMCwgTlVNX0xJU1RTICogc2l6ZW9mKCBrbXBfZnJlZV9saXN0X3QgKSApOworfQorCisvLyBGcmVlIHRoZSBtZW1vcnkgaW4gdGhlIHRocmVhZCBmcmVlIGxpc3RzIHJlbGF0ZWQgdG8gZmFzdCBtZW1vcnkKKy8vIE9ubHkgZG8gdGhpcyB3aGVuIGEgdGhyZWFkIGlzIGJlaW5nIHJlYXBlZCAoZGVzdHJveWVkKS4KK3ZvaWQKK19fa21wX2ZyZWVfZmFzdF9tZW1vcnkoIGttcF9pbmZvX3QgKnRoICkKK3sKKyAgICAvLyBTdXBwb3NlIHdlIHVzZSBCR0VUIHVuZGVybHlpbmcgYWxsb2NhdG9yLCB3YWxrIHRocm91Z2ggaXRzIHN0cnVjdHVyZXMuLi4KKyAgICBpbnQgICAgICAgICAgYmluOworICAgIHRocl9kYXRhX3QgKiB0aHIgPSBnZXRfdGhyX2RhdGEoIHRoICk7CisgICAgdm9pZCAgICAgICoqIGxzdCA9IE5VTEw7CisKKyAgICBLRV9UUkFDRSg1LCAoICJfX2ttcF9mcmVlX2Zhc3RfbWVtb3J5OiBDYWxsZWQgVCMlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aCApICkgKTsKKworICAgIF9fa21wX2JnZXRfZGVxdWV1ZSggdGggKTsgICAgICAgICAvLyBSZWxlYXNlIGFueSBxdWV1ZWQgYnVmZmVycworCisgICAgLy8gRGlnIHRocm91Z2ggZnJlZSBsaXN0cyBhbmQgZXh0cmFjdCBhbGwgYWxsb2NhdGVkIGJsb2NrcworICAgIGZvciAoIGJpbiA9IDA7IGJpbiA8IE1BWF9CR0VUX0JJTlM7ICsrYmluICkgeworICAgICAgICBiZmhlYWRfdCAqIGIgPSB0aHItPmZyZWVsaXN0WyBiaW4gXS5xbC5mbGluazsKKyAgICAgICAgd2hpbGUgKCBiICE9ICZ0aHItPmZyZWVsaXN0WyBiaW4gXSApIHsKKyAgICAgICAgICAgIGlmICggKGttcF91aW50cHRyX3QpYi0+YmguYmIuYnRociAmIDEgKSB7ICAgLy8gaWYgdGhlIGJ1ZmZlciBpcyBhbiBhbGxvY2F0ZWQgYWRkcmVzcz8KKyAgICAgICAgICAgICAgICAqKCh2b2lkKiopYikgPSBsc3Q7ICAgLy8gbGluayB0aGUgbGlzdCAob3ZlcnJpZGUgYnRociwgYnV0IGtlZXAgZmxpbmsgeWV0KQorICAgICAgICAgICAgICAgIGxzdCA9ICh2b2lkKiopYjsgICAgICAvLyBwdXNoIGIgaW50byBsc3QKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGIgPSBiLT5xbC5mbGluazsgICAgICAgICAgLy8gZ2V0IG5leHQgYnVmZmVyCisgICAgICAgIH0KKyAgICB9CisgICAgd2hpbGUgKCBsc3QgIT0gTlVMTCApIHsKKyAgICAgICAgdm9pZCAqIG5leHQgPSAqbHN0OworICAgICAgICBLRV9UUkFDRSgxMCwgKCAiX19rbXBfZnJlZV9mYXN0X21lbW9yeTogZnJlZWluZyAlcCwgbmV4dD0lcCB0aCAlcCAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGxzdCwgbmV4dCwgdGgsIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRoICkgKSApOworICAgICAgICAoKnRoci0+cmVsZmNuKShsc3QpOworICAgICAgICAjaWYgQnVmU3RhdHMKKyAgICAgICAgICAgIC8vIGNvdW50IGJsb2NrcyB0byBwcmV2ZW50IHByb2JsZW1zIGluIF9fa21wX2ZpbmFsaXplX2JnZXQoKQorICAgICAgICAgICAgdGhyLT5udW1wcmVsKys7ICAgICAgIC8qIE5yIG9mIGV4cGFuc2lvbiBibG9jayByZWxlYXNlcyAqLworICAgICAgICAgICAgdGhyLT5udW1wYmxrLS07ICAgICAgIC8qIFRvdGFsIG51bWJlciBvZiBibG9ja3MgKi8KKyAgICAgICAgI2VuZGlmCisgICAgICAgIGxzdCA9ICh2b2lkKiopbmV4dDsKKyAgICB9CisKKyAgICBLRV9UUkFDRSg1LCAoICJfX2ttcF9mcmVlX2Zhc3RfbWVtb3J5OiBGcmVlZCBUIyVkXG4iLAorICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGggKSApICk7Cit9CisKKyNlbmRpZiAvLyBVU0VfRkFTVF9NRU1PUlkKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9hdG9taWMuYyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9hdG9taWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDVkMzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2F0b21pYy5jCkBAIC0wLDAgKzEsMjkwNyBAQAorLyoKKyAqIGttcF9hdG9taWMuYyAtLSBBVE9NSUMgaW1wbGVtZW50YXRpb24gcm91dGluZXMKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcF9hdG9taWMuaCIKKyNpbmNsdWRlICJrbXAuaCIgICAgICAgICAgICAgICAgICAvLyBUUlVFLCBhc20gcm91dGluZXMgcHJvdG90eXBlcworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdWNoYXI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVzaG9ydDsKKworLyohCitAZGVmZ3JvdXAgQVRPTUlDX09QUyBBdG9taWMgT3BlcmF0aW9ucworVGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VkIGZvciBpbXBsZW1lbnRpbmcgdGhlIG1hbnkgZGlmZmVyZW50IHZhcmlldGllcyBvZiBhdG9taWMgb3BlcmF0aW9ucy4KKworVGhlIGNvbXBpbGVyIGlzIGF0IGxpYmVydHkgdG8gaW5saW5lIGF0b21pYyBvcGVyYXRpb25zIHRoYXQgYXJlIG5hdHVyYWxseSBzdXBwb3J0ZWQKK2J5IHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLiBGb3IgaW5zdGFuY2Ugb24gSUEtMzIgYXJjaGl0ZWN0dXJlIGFuIGF0b21pYyBsaWtlIHRoaXMgY2FuIGJlIGlubGluZWQKK0Bjb2RlCitzdGF0aWMgaW50IHMgPSAwOworI3ByYWdtYSBvbXAgYXRvbWljCisgICAgcysrOworQGVuZGNvZGUKK3VzaW5nIHRoZSBzaW5nbGUgaW5zdHJ1Y3Rpb246IGBsb2NrOyBpbmNsIHNgCisKK0hvd2V2ZXIgdGhlIHJ1bnRpbWUgZG9lcyBwcm92aWRlIGVudHJ5cG9pbnRzIGZvciB0aGVzZSBvcGVyYXRpb25zIHRvIHN1cHBvcnQgY29tcGlsZXJzIHRoYXQgY2hvb3NlCitub3QgdG8gaW5saW5lIHRoZW0uIChGb3IgaW5zdGFuY2UsIGBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGRgIGNvdWxkIGJlIHVzZWQgdG8gcGVyZm9ybSB0aGUKK2luY3JlbWVudCBhYm92ZS4pCisKK1RoZSBuYW1lcyBvZiB0aGUgZnVuY3Rpb25zIGFyZSBlbmNvZGVkIGJ5IHVzaW5nIHRoZSBkYXRhIHR5cGUgbmFtZSBhbmQgdGhlIG9wZXJhdGlvbiBuYW1lLCBhcyBpbiB0aGVzZSB0YWJsZXMuCisKK0RhdGEgVHlwZSAgfCBEYXRhIHR5cGUgZW5jb2RpbmcKKy0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLQoraW50OF90ICAgICB8IGBmaXhlZDFgCit1aW50OF90ICAgIHwgYGZpeGVkMXVgCitpbnQxNl90ICAgIHwgYGZpeGVkMmAKK3VpbnQxNl90ICAgfCBgZml4ZWQydWAKK2ludDMyX3QgICAgfCBgZml4ZWQ0YAordWludDMyX3QgICB8IGBmaXhlZDR1YAoraW50MzJfdCAgICB8IGBmaXhlZDhgCit1aW50MzJfdCAgIHwgYGZpeGVkOHVgCitmbG9hdCAgICAgIHwgYGZsb2F0NGAKK2RvdWJsZSAgICAgfCBgZmxvYXQ4YAorZmxvYXQgMTAgKDgwODcgZWlnaHR5IGJpdCBmbG9hdCkgIHwgYGZsb2F0MTBgCitjb21wbGV4PGZsb2F0PiAgIHwgIGBjbXBseDRgCitjb21wbGV4PGRvdWJsZT4gIHwgYGNtcGx4OGAKK2NvbXBsZXg8ZmxvYXQxMD4gfCBgY21wbHgxMGAKKzxicj4KKworT3BlcmF0aW9uIHwgT3BlcmF0aW9uIGVuY29kaW5nCistLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0KKysgfCBhZGQKKy0gfCBzdWIKK1wqIHwgbXVsCisvIHwgZGl2CismIHwgYW5kYgorPDwgfCBzaGwKK1w+XD4gfCBzaHIKK1x8IHwgb3JiCiteICB8IHhvcgorJiYgfCBhbmRsCitcfFx8IHwgb3JsCittYXhpbXVtIHwgbWF4CittaW5pbXVtIHwgbWluCisuZXF2LiAgIHwgZXF2CisubmVxdi4gIHwgbmVxdgorCis8YnI+CitGb3Igbm9uLWNvbW11dGF0aXZlIG9wZXJhdGlvbnMsIGBfcmV2YCBjYW4gYWxzbyBiZSBhZGRlZCBmb3IgdGhlIHJldmVyc2VkIG9wZXJhdGlvbi4KK0ZvciB0aGUgZnVuY3Rpb25zIHRoYXQgY2FwdHVyZSB0aGUgcmVzdWx0LCB0aGUgc3VmZml4IGBfY3B0YCBpcyBhZGRlZC4KKworVXBkYXRlIEZ1bmN0aW9ucworPT09PT09PT09PT09PT09PQorVGhlIGdlbmVyYWwgZm9ybSBvZiBhbiBhdG9taWMgZnVuY3Rpb24gdGhhdCBqdXN0IHBlcmZvcm1zIGFuIHVwZGF0ZSAod2l0aG91dCBhIGBjYXB0dXJlYCkKK0Bjb2RlCit2b2lkIF9fa21wY19hdG9taWNfPGRhdGF0eXBlPl88b3BlcmF0aW9uPiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgVFlQRSAqIGxocywgVFlQRSByaHMgKTsKK0BlbmRjb2RlCitAcGFyYW0gaWRlbnRfdCAgYSBwb2ludGVyIHRvIHNvdXJjZSBsb2NhdGlvbgorQHBhcmFtIGd0aWQgIHRoZSBnbG9iYWwgdGhyZWFkIGlkCitAcGFyYW0gbGhzICAgYSBwb2ludGVyIHRvIHRoZSBsZWZ0IG9wZXJhbmQKK0BwYXJhbSByaHMgICB0aGUgcmlnaHQgb3BlcmFuZAorCitgY2FwdHVyZWAgZnVuY3Rpb25zCis9PT09PT09PT09PT09PT09PT09CitUaGUgY2FwdHVyZSBmdW5jdGlvbnMgcGVyZm9ybSBhbiBhdG9taWMgdXBkYXRlIGFuZCByZXR1cm4gYSByZXN1bHQsIHdoaWNoIGlzIGVpdGhlciB0aGUgdmFsdWUKK2JlZm9yZSB0aGUgY2FwdHVyZSwgb3IgdGhhdCBhZnRlci4gVGhleSB0YWtlIGFuIGFkZGl0aW9uYWwgYXJndW1lbnQgdG8gZGV0ZXJtaW5lIHdoaWNoIHJlc3VsdCBpcyByZXR1cm5lZC4KK1RoZWlyIGdlbmVyYWwgZm9ybSBpcyB0aGVyZWZvcmUKK0Bjb2RlCitUWVBFIF9fa21wY19hdG9taWNfPGRhdGF0eXBlPl88b3BlcmF0aW9uPl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFRZUEUgKiBsaHMsIFRZUEUgcmhzLCBpbnQgZmxhZyApOworQGVuZGNvZGUKK0BwYXJhbSBpZGVudF90ICBhIHBvaW50ZXIgdG8gc291cmNlIGxvY2F0aW9uCitAcGFyYW0gZ3RpZCAgdGhlIGdsb2JhbCB0aHJlYWQgaWQKK0BwYXJhbSBsaHMgICBhIHBvaW50ZXIgdG8gdGhlIGxlZnQgb3BlcmFuZAorQHBhcmFtIHJocyAgIHRoZSByaWdodCBvcGVyYW5kCitAcGFyYW0gZmxhZyAgb25lIGlmIHRoZSByZXN1bHQgaXMgdG8gYmUgY2FwdHVyZWQgKmFmdGVyKiB0aGUgb3BlcmF0aW9uLCB6ZXJvIGlmIGNhcHR1cmVkICpiZWZvcmUqLgorCitUaGUgb25lIHNldCBvZiBleGNlcHRpb25zIHRvIHRoaXMgaXMgdGhlIGBjb21wbGV4PGZsb2F0PmAgdHlwZSB3aGVyZSB0aGUgdmFsdWUgaXMgbm90IHJldHVybmVkLAorcmF0aGVyIGFuIGV4dHJhIGFyZ3VtZW50IHBvaW50ZXIgaXMgcGFzc2VkLgorCitUaGV5IGxvb2sgbGlrZQorQGNvZGUKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDRfPG9wPl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4MzIgcmhzLCBrbXBfY21wbHgzMiAqIG91dCwgaW50IGZsYWcgKTsKK0BlbmRjb2RlCisKK1JlYWQgYW5kIFdyaXRlIE9wZXJhdGlvbnMKKz09PT09PT09PT09PT09PT09PT09PT09PT0KK1RoZSBPcGVuTVA8c3VwPio8L3N1cD4gc3RhbmRhcmQgbm93IHN1cHBvcnRzIGF0b21pYyBvcGVyYXRpb25zIHRoYXQgc2ltcGx5IGVuc3VyZSB0aGF0IHRoZQordmFsdWUgaXMgcmVhZCBvciB3cml0dGVuIGF0b21pY2FsbHksIHdpdGggbm8gbW9kaWZpY2F0aW9uCitwZXJmb3JtZWQuIEluIG1hbnkgY2FzZXMgb24gSUEtMzIgYXJjaGl0ZWN0dXJlIHRoZXNlIG9wZXJhdGlvbnMgY2FuIGJlIGlubGluZWQgc2luY2UKK3RoZSBhcmNoaXRlY3R1cmUgZ3VhcmFudGVlcyB0aGF0IG5vIHRlYXJpbmcgb2NjdXJzIG9uIGFsaWduZWQgb2JqZWN0cworYWNjZXNzZWQgd2l0aCBhIHNpbmdsZSBtZW1vcnkgb3BlcmF0aW9uIG9mIHVwIHRvIDY0IGJpdHMgaW4gc2l6ZS4KKworVGhlIGdlbmVyYWwgZm9ybSBvZiB0aGUgcmVhZCBvcGVyYXRpb25zIGlzCitAY29kZQorVFlQRSBfX2ttcGNfYXRvbWljXzx0eXBlPl9yZCAoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFRZUEUgKiBsb2MgKTsKK0BlbmRjb2RlCisKK0ZvciB0aGUgd3JpdGUgb3BlcmF0aW9ucyB0aGUgZm9ybSBpcworQGNvZGUKK3ZvaWQgX19rbXBjX2F0b21pY188dHlwZT5fd3IgKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBUWVBFICogbGhzLCBUWVBFIHJocyApOworQGVuZGNvZGUKKworRnVsbCBsaXN0IG9mIGZ1bmN0aW9ucworPT09PT09PT09PT09PT09PT09PT09PQorVGhpcyBsZWFkcyB0byB0aGUgZ2VuZXJhdGlvbiBvZiAzNzYgYXRvbWljIGZ1bmN0aW9ucywgYXMgZm9sbG93cy4KKworRnVuY3RvbnMgZm9yIGludGVnZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoZXJlIGFyZSB2ZXJzaW9ucyBoZXJlIGZvciBpbnRlZ2VycyBvZiBzaXplIDEsMiw0IGFuZCA4IGJ5dGVzIGJvdGggc2lnbmVkIGFuZCB1bnNpZ25lZCAod2hlcmUgdGhhdCBtYXR0ZXJzKS4KK0Bjb2RlCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfYWRkCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfYWRkX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FkZF9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hbmRiX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGwKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hbmRsX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2RpdgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9mbG9hdDgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfZXF2CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfZXF2X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX21heAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX21heF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9taW4KKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9taW5fY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfbXVsCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfbXVsX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX211bF9mbG9hdDgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tdWxfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9uZXF2CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfbmVxdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfb3JsCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfb3JsX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3JkCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc2hsCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc2hsX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3NobF9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc2hsX3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3NocgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3Nocl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaHJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3Nocl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc3ViX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWJfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWJfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc3dwCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfd3IKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV94b3IKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV94b3JfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDF1X2RpdgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXZfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDF1X2Rpdl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDF1X2Rpdl9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXZfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDF1X3NocgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9zaHJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDF1X3Nocl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDF1X3Nocl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hZGQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hZGRfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfYWRkX2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfYW5kYgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2FuZGJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfYW5kbAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2FuZGxfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfZGl2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfZGl2X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfZGl2X2Zsb2F0OAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9lcXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9lcXZfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfbWF4CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfbWF4X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX21pbgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX21pbl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tdWwKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tdWxfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfbXVsX2Zsb2F0OAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX211bF9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX25lcXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9uZXF2X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX29yYgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX29yYl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9vcmwKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9vcmxfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfcmQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaGwKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaGxfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfc2hsX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaGxfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfc2hyCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfc2hyX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3Nocl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfc2hyX3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3N1YgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zd3AKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl93cgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3hvcgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3hvcl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2X2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2X2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfc2hyCisgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X3Nocl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfc2hyX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfc2hyX3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2FkZAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2FkZF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGRfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hbmRiCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfYW5kYl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hbmRsCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfYW5kbF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfZGl2X2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfZmxvYXQ4CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfZGl2X2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfZGl2X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2VxdgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2Vxdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tYXgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tYXhfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfbWluCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfbWluX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X211bAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X211bF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tdWxfZmxvYXQ4CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfbXVsX2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfbmVxdgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X25lcXZfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfb3JiCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfb3JiX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X29ybAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X29ybF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9yZAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3NobAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3NobF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaGxfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3NobF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaHIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaHJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfc2hyX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaHJfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfc3ViCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfc3ViX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfc3ViX2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfc3ViX3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3N3cAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3dyCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfeG9yCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfeG9yX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXZfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXZfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfc2hyX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHJfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfYWRkCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfYWRkX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FkZF9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FuZGIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hbmRiX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FuZGwKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hbmRsX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2RpdgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9mbG9hdDgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfZXF2CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfZXF2X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X21heAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X21heF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9taW4KKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9taW5fY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfbXVsCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfbXVsX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X211bF9mbG9hdDgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tdWxfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9uZXF2CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfbmVxdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9vcmIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9vcmJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfb3JsCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfb3JsX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3JkCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfc2hsCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfc2hsX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3NobF9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfc2hsX3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3NocgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3Nocl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaHJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3Nocl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfc3ViX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfc3dwCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfd3IKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF94b3IKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF94b3JfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDh1X2RpdgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDh1X2Rpdl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDh1X2Rpdl9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDh1X3NocgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zaHJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDh1X3Nocl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDh1X3Nocl9yZXYKK0BlbmRjb2RlCisKK0Z1bmN0aW9ucyBmb3IgZmxvYXRpbmcgcG9pbnQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoZXJlIGFyZSB2ZXJzaW9ucyBoZXJlIGZvciBmbG9hdGluZyBwb2ludCBudW1iZXJzIG9mIHNpemUgNCwgOCwgMTAgYW5kIDE2IGJ5dGVzLgorKFRlbiBieXRlIGZsb2F0cyBhcmUgdXNlZCBieSBYODcsIGJ1dCBhcmUgbm93IHJhcmUpLgorQGNvZGUKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGRfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfYWRkX2Zsb2F0OAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X2FkZF9mcAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X2RpdgorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X2Rpdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X2Rpdl9mbG9hdDgKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfZnAKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfcmV2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfbWF4CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfbWF4X2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X21pbgorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X21pbl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tdWwKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tdWxfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfbXVsX2Zsb2F0OAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X211bF9mcAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3JkCisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfc3ViCisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2Zsb2F0OAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9mcAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zd3AKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF93cgorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X2FkZAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X2FkZF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGRfZnAKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfZGl2X2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfZnAKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfcmV2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfbWF4CisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfbWF4X2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X21pbgorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X21pbl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tdWwKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tdWxfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfbXVsX2ZwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfcmQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWIKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWJfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWJfZnAKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWJfcmV2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfc3dwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfd3IKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfYWRkCisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX2FkZF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfYWRkX2ZwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX2RpdgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX2Rpdl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX2Rpdl9mcAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfcmV2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX211bAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9tdWxfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX211bF9mcAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9yZAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWIKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViX2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWJfZnAKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViX3JldgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9zd3AKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfd3IKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYWRkCisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2FkZF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X3JldgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9tYXgKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWF4X2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9taW4KKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWluX2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9tdWwKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbXVsX2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9yZAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWIKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfcmV2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X3N3cAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl93cgorQGVuZGNvZGUKKworRnVuY3Rpb25zIGZvciBDb21wbGV4IHR5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0Z1bmN0aW9ucyBmb3IgY29tcGxleCB0eXBlcyB3aG9zZSBjb21wb25lbnQgZmxvYXRpbmcgcG9pbnQgdmFyaWFibGVzIGFyZSBvZiBzaXplIDQsOCwxMCBvciAxNiBieXRlcy4KK1RoZSBuYW1lcyBoZXJlIGFyZSBiYXNlZCBvbiB0aGUgc2l6ZSBvZiB0aGUgY29tcG9uZW50IGZsb2F0LCAqbm90KiB0aGUgc2l6ZSBvZiB0aGUgY29tcGxleCB0eXBlLiBTbworYF9fa21wY19hdG9tY19jbXBseDhfYWRkYCBpcyBhbiBvcGVyYXRpb24gb24gYSBgY29tcGxleDxkb3VibGU+YCBvciBgY29tcGxleChraW5kPTgpYCwgKm5vdCogYGNvbXBsZXg8ZmxvYXQ+YC4KKworQGNvZGUKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9hZGQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9hZGRfY21wbHg4CisgICAgX19rbXBjX2F0b21pY19jbXBseDRfYWRkX2NwdAorICAgIF9fa21wY19hdG9taWNfY21wbHg0X2RpdgorICAgIF9fa21wY19hdG9taWNfY21wbHg0X2Rpdl9jbXBseDgKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXZfY3B0CisgICAgX19rbXBjX2F0b21pY19jbXBseDRfZGl2X2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXZfcmV2CisgICAgX19rbXBjX2F0b21pY19jbXBseDRfbXVsCisgICAgX19rbXBjX2F0b21pY19jbXBseDRfbXVsX2NtcGx4OAorICAgIF9fa21wY19hdG9taWNfY21wbHg0X211bF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9yZAorICAgIF9fa21wY19hdG9taWNfY21wbHg0X3N1YgorICAgIF9fa21wY19hdG9taWNfY21wbHg0X3N1Yl9jbXBseDgKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9zdWJfY3B0CisgICAgX19rbXBjX2F0b21pY19jbXBseDRfc3ViX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9zdWJfcmV2CisgICAgX19rbXBjX2F0b21pY19jbXBseDRfc3dwCisgICAgX19rbXBjX2F0b21pY19jbXBseDRfd3IKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9hZGQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9hZGRfY3B0CisgICAgX19rbXBjX2F0b21pY19jbXBseDhfZGl2CisgICAgX19rbXBjX2F0b21pY19jbXBseDhfZGl2X2NwdAorICAgIF9fa21wY19hdG9taWNfY21wbHg4X2Rpdl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19jbXBseDhfZGl2X3JldgorICAgIF9fa21wY19hdG9taWNfY21wbHg4X211bAorICAgIF9fa21wY19hdG9taWNfY21wbHg4X211bF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9yZAorICAgIF9fa21wY19hdG9taWNfY21wbHg4X3N1YgorICAgIF9fa21wY19hdG9taWNfY21wbHg4X3N1Yl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9zdWJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfY21wbHg4X3N1Yl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9zd3AKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF93cgorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9hZGQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfYWRkX2NwdAorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9kaXYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfZGl2X2NwdAorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9kaXZfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9kaXZfcmV2CisgICAgX19rbXBjX2F0b21pY19jbXBseDEwX211bAorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9tdWxfY3B0CisgICAgX19rbXBjX2F0b21pY19jbXBseDEwX3JkCisgICAgX19rbXBjX2F0b21pY19jbXBseDEwX3N1YgorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9zdWJfY3B0CisgICAgX19rbXBjX2F0b21pY19jbXBseDEwX3N1Yl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19jbXBseDEwX3N1Yl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3dwCisgICAgX19rbXBjX2F0b21pY19jbXBseDEwX3dyCisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2FkZAorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9hZGRfY3B0CisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2RpdgorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfY3B0CisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfbXVsCisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X211bF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfcmQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViCisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3dwCisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3dyCitAZW5kY29kZQorKi8KKworLyohCitAaW5ncm91cCBBVE9NSUNfT1BTCitAeworKi8KKworLyoKKyAqIEdsb2JhbCB2YXJzCisgKi8KKworI2lmbmRlZiBLTVBfR09NUF9DT01QQVQKK2ludCBfX2ttcF9hdG9taWNfbW9kZSA9IDE7ICAgICAgLy8gSW50ZWwgcGVyZgorI2Vsc2UKK2ludCBfX2ttcF9hdG9taWNfbW9kZSA9IDI7ICAgICAgLy8gR09NUCBjb21wYXRpYmlsaXR5CisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisKK0tNUF9BTElHTigxMjgpCisKK2ttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrOyAgICAgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBpbiBHbnUgY29tcGF0IG1vZGUgICAqLwora21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfMWk7ICAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciAxLWJ5dGUgZml4ZWQgZGF0YSB0eXBlcyAqLwora21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfMmk7ICAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciAyLWJ5dGUgZml4ZWQgZGF0YSB0eXBlcyAqLwora21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfNGk7ICAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciA0LWJ5dGUgZml4ZWQgZGF0YSB0eXBlcyAqLwora21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfNHI7ICAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciBrbXBfcmVhbDMyIGRhdGEgdHlwZSAgICAqLwora21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfOGk7ICAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciA4LWJ5dGUgZml4ZWQgZGF0YSB0eXBlcyAqLwora21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfOHI7ICAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciBrbXBfcmVhbDY0IGRhdGEgdHlwZSAgICAqLwora21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfOGM7ICAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciBjb21wbGV4IGJ5dGUgZGF0YSB0eXBlICAqLwora21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfMTByOyAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciBsb25nIGRvdWJsZSBkYXRhIHR5cGUgICAqLwora21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfMTZyOyAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciBfUXVhZCBkYXRhIHR5cGUgICAgICAgICAqLwora21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfMTZjOyAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciBkb3VibGUgY29tcGxleCBkYXRhIHR5cGUqLwora21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfMjBjOyAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciBsb25nIGRvdWJsZSBjb21wbGV4IHR5cGUqLwora21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfMzJjOyAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciBfUXVhZCBjb21wbGV4IGRhdGEgdHlwZSAqLworCisKKy8qCisgIDIwMDctMDMtMDI6CisgIFdpdGhvdXQgInZvbGF0aWxlIiBzcGVjaWZpZXIgaW4gT1BfQ01QWENIRyBhbmQgTUlOX01BWF9DTVBYQ0hHIHdlIGhhdmUgYQorICBidWcgb24gKl8zMiBhbmQgKl8zMmUuIFRoaXMgaXMganVzdCBhIHRlbXBvcmFyeSB3b3JrYXJvdW5kIGZvciB0aGUgcHJvYmxlbS4KKyAgSXQgc2VlbXMgdGhlIHJpZ2h0IHNvbHV0aW9uIGlzIHdyaXRpbmcgT1BfQ01QWENIRyBhbmQgTUlOX01BWF9DTVBYQ0hHCisgIHJvdXRpbmVzIGluIGFzc2VtYmxlciBsYW5ndWFnZS4KKyovCisjZGVmaW5lIEtNUF9BVE9NSUNfVk9MQVRJTEUgdm9sYXRpbGUKKworI2lmICggS01QX0FSQ0hfWDg2ICkgJiYgS01QX0hBVkVfUVVBRAorCisgICAgc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yICs9KCBRdWFkX2E0X3QgJiBsaHMsIFF1YWRfYTRfdCAmIHJocyApIHsgbGhzLnEgKz0gcmhzLnE7IH07CisgICAgc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yIC09KCBRdWFkX2E0X3QgJiBsaHMsIFF1YWRfYTRfdCAmIHJocyApIHsgbGhzLnEgLT0gcmhzLnE7IH07CisgICAgc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yICo9KCBRdWFkX2E0X3QgJiBsaHMsIFF1YWRfYTRfdCAmIHJocyApIHsgbGhzLnEgKj0gcmhzLnE7IH07CisgICAgc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yIC89KCBRdWFkX2E0X3QgJiBsaHMsIFF1YWRfYTRfdCAmIHJocyApIHsgbGhzLnEgLz0gcmhzLnE7IH07CisgICAgc3RhdGljIGlubGluZSBib29sIG9wZXJhdG9yIDwgKCBRdWFkX2E0X3QgJiBsaHMsIFF1YWRfYTRfdCAmIHJocyApIHsgcmV0dXJuIGxocy5xIDwgcmhzLnE7IH0KKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgb3BlcmF0b3IgPiAoIFF1YWRfYTRfdCAmIGxocywgUXVhZF9hNF90ICYgcmhzICkgeyByZXR1cm4gbGhzLnEgPiByaHMucTsgfQorCisgICAgc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yICs9KCBRdWFkX2ExNl90ICYgbGhzLCBRdWFkX2ExNl90ICYgcmhzICkgeyBsaHMucSArPSByaHMucTsgfTsKKyAgICBzdGF0aWMgaW5saW5lIHZvaWQgb3BlcmF0b3IgLT0oIFF1YWRfYTE2X3QgJiBsaHMsIFF1YWRfYTE2X3QgJiByaHMgKSB7IGxocy5xIC09IHJocy5xOyB9OworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvciAqPSggUXVhZF9hMTZfdCAmIGxocywgUXVhZF9hMTZfdCAmIHJocyApIHsgbGhzLnEgKj0gcmhzLnE7IH07CisgICAgc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yIC89KCBRdWFkX2ExNl90ICYgbGhzLCBRdWFkX2ExNl90ICYgcmhzICkgeyBsaHMucSAvPSByaHMucTsgfTsKKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgb3BlcmF0b3IgPCAoIFF1YWRfYTE2X3QgJiBsaHMsIFF1YWRfYTE2X3QgJiByaHMgKSB7IHJldHVybiBsaHMucSA8IHJocy5xOyB9CisgICAgc3RhdGljIGlubGluZSBib29sIG9wZXJhdG9yID4gKCBRdWFkX2ExNl90ICYgbGhzLCBRdWFkX2ExNl90ICYgcmhzICkgeyByZXR1cm4gbGhzLnEgPiByaHMucTsgfQorCisgICAgc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yICs9KCBrbXBfY21wbHgxMjhfYTRfdCAmIGxocywga21wX2NtcGx4MTI4X2E0X3QgJiByaHMgKSB7IGxocy5xICs9IHJocy5xOyB9OworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvciAtPSgga21wX2NtcGx4MTI4X2E0X3QgJiBsaHMsIGttcF9jbXBseDEyOF9hNF90ICYgcmhzICkgeyBsaHMucSAtPSByaHMucTsgfTsKKyAgICBzdGF0aWMgaW5saW5lIHZvaWQgb3BlcmF0b3IgKj0oIGttcF9jbXBseDEyOF9hNF90ICYgbGhzLCBrbXBfY21wbHgxMjhfYTRfdCAmIHJocyApIHsgbGhzLnEgKj0gcmhzLnE7IH07CisgICAgc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yIC89KCBrbXBfY21wbHgxMjhfYTRfdCAmIGxocywga21wX2NtcGx4MTI4X2E0X3QgJiByaHMgKSB7IGxocy5xIC89IHJocy5xOyB9OworCisgICAgc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yICs9KCBrbXBfY21wbHgxMjhfYTE2X3QgJiBsaHMsIGttcF9jbXBseDEyOF9hMTZfdCAmIHJocyApIHsgbGhzLnEgKz0gcmhzLnE7IH07CisgICAgc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yIC09KCBrbXBfY21wbHgxMjhfYTE2X3QgJiBsaHMsIGttcF9jbXBseDEyOF9hMTZfdCAmIHJocyApIHsgbGhzLnEgLT0gcmhzLnE7IH07CisgICAgc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yICo9KCBrbXBfY21wbHgxMjhfYTE2X3QgJiBsaHMsIGttcF9jbXBseDEyOF9hMTZfdCAmIHJocyApIHsgbGhzLnEgKj0gcmhzLnE7IH07CisgICAgc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yIC89KCBrbXBfY21wbHgxMjhfYTE2X3QgJiBsaHMsIGttcF9jbXBseDEyOF9hMTZfdCAmIHJocyApIHsgbGhzLnEgLz0gcmhzLnE7IH07CisKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIEFUT01JQyBpbXBsZW1lbnRhdGlvbiByb3V0aW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogb25lIHJvdXRpbmUgZm9yIGVhY2ggb3BlcmF0aW9uIGFuZCBvcGVyYW5kIHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLy8gQWxsIHJvdXRpbmVzIGRlY2xhcmF0aW9ucyBsb29rcyBsaWtlCisvLyB2b2lkIF9fa21wY19hdG9taWNfUlRZUEVfT1AoIGlkZW50X3QqLCBpbnQsIFRZUEUgKmxocywgVFlQRSByaHMgKTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIEtNUF9DSEVDS19HVElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIGd0aWQgPT0gS01QX0dUSURfVU5LTk9XTiApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAvLyBjaGVjayBhbmQgZ2V0IGd0aWQgd2hlbiBuZWVkZWQKKworLy8gQmVnaW5uaW5nIG9mIGEgZGVmaW5pdGlvbiAocHJvdmlkZXMgbmFtZSwgcGFyYW1ldGVycywgZ2VidWcgdHJhY2UpCisvLyAgICAgVFlQRV9JRCAtIG9wZXJhbmRzIHR5cGUgYW5kIHNpemUgKGZpeGVkKiwgZml4ZWQqdSBmb3Igc2lnbmVkLCB1bnNpZ25lZCBmaXhlZCkKKy8vICAgICBPUF9JRCAgIC0gb3BlcmF0aW9uIGlkZW50aWZpZXIgKGFkZCwgc3ViLCBtdWwsIC4uLikKKy8vICAgICBUWVBFICAgIC0gb3BlcmFuZHMnIHR5cGUKKyNkZWZpbmUgQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSwgUkVUX1RZUEUpIFwKK1JFVF9UWVBFIF9fa21wY19hdG9taWNfIyNUWVBFX0lEIyNfIyNPUF9JRCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgVFlQRSAqIGxocywgVFlQRSByaHMgKSBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS0FfVFJBQ0UoMTAwLCgiX19rbXBjX2F0b21pY18iICNUWVBFX0lEICJfIiAjT1BfSUQgIjogVCMlZFxuIiwgZ3RpZCApKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBMb2NrIHZhcmlhYmxlcyB1c2VkIGZvciBjcml0aWNhbCBzZWN0aW9ucyBmb3IgdmFyaW91cyBzaXplIG9wZXJhbmRzCisjZGVmaW5lIEFUT01JQ19MT0NLMCAgIF9fa21wX2F0b21pY19sb2NrICAgICAgIC8vIGFsbCB0eXBlcywgZm9yIEdudSBjb21wYXQKKyNkZWZpbmUgQVRPTUlDX0xPQ0sxaSAgX19rbXBfYXRvbWljX2xvY2tfMWkgICAgLy8gY2hhcgorI2RlZmluZSBBVE9NSUNfTE9DSzJpICBfX2ttcF9hdG9taWNfbG9ja18yaSAgICAvLyBzaG9ydAorI2RlZmluZSBBVE9NSUNfTE9DSzRpICBfX2ttcF9hdG9taWNfbG9ja180aSAgICAvLyBsb25nIGludAorI2RlZmluZSBBVE9NSUNfTE9DSzRyICBfX2ttcF9hdG9taWNfbG9ja180ciAgICAvLyBmbG9hdAorI2RlZmluZSBBVE9NSUNfTE9DSzhpICBfX2ttcF9hdG9taWNfbG9ja184aSAgICAvLyBsb25nIGxvbmcgaW50CisjZGVmaW5lIEFUT01JQ19MT0NLOHIgIF9fa21wX2F0b21pY19sb2NrXzhyICAgIC8vIGRvdWJsZQorI2RlZmluZSBBVE9NSUNfTE9DSzhjICBfX2ttcF9hdG9taWNfbG9ja184YyAgICAvLyBmbG9hdCBjb21wbGV4CisjZGVmaW5lIEFUT01JQ19MT0NLMTByIF9fa21wX2F0b21pY19sb2NrXzEwciAgIC8vIGxvbmcgZG91YmxlCisjZGVmaW5lIEFUT01JQ19MT0NLMTZyIF9fa21wX2F0b21pY19sb2NrXzE2ciAgIC8vIF9RdWFkCisjZGVmaW5lIEFUT01JQ19MT0NLMTZjIF9fa21wX2F0b21pY19sb2NrXzE2YyAgIC8vIGRvdWJsZSBjb21wbGV4CisjZGVmaW5lIEFUT01JQ19MT0NLMjBjIF9fa21wX2F0b21pY19sb2NrXzIwYyAgIC8vIGxvbmcgZG91YmxlIGNvbXBsZXgKKyNkZWZpbmUgQVRPTUlDX0xPQ0szMmMgX19rbXBfYXRvbWljX2xvY2tfMzJjICAgLy8gX1F1YWQgY29tcGxleAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9wZXJhdGlvbiBvbiAqbGhzLCByaHMgYm91bmQgYnkgY3JpdGljYWwgc2VjdGlvbgorLy8gICAgIE9QICAgICAtIG9wZXJhdG9yIChpdCdzIHN1cHBvc2VkIHRvIGNvbnRhaW4gYW4gYXNzaWdubWVudCkKKy8vICAgICBMQ0tfSUQgLSBsb2NrIGlkZW50aWZpZXIKKy8vIE5vdGU6IGRvbid0IGNoZWNrIGd0aWQgYXMgaXQgc2hvdWxkIGFsd2F5cyBiZSB2YWxpZAorLy8gMSwgMi1ieXRlIC0gZXhwZWN0IHZhbGlkIHBhcmFtZXRlciwgb3RoZXIgLSBjaGVjayBiZWZvcmUgdGhpcyBtYWNybworI2RlZmluZSBPUF9DUklUSUNBTChPUCxMQ0tfSUQpIFwKKyAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgqbGhzKSBPUCAocmhzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGb3IgR05VIGNvbXBhdGliaWxpdHksIHdlIG1heSBuZWVkIHRvIHVzZSBhIGNyaXRpY2FsIHNlY3Rpb24sCisvLyBldmVuIHRob3VnaCBpdCBpcyBub3QgcmVxdWlyZWQgYnkgdGhlIElTQS4KKy8vCisvLyBPbiBJQS0zMiBhcmNoaXRlY3R1cmUsIGFsbCBhdG9taWMgb3BlcmF0aW9ucyBleGNlcHQgZm9yIGZpeGVkIDQgYnl0ZSBhZGQsCisvLyBzdWIsIGFuZCBiaXR3aXNlIGxvZ2ljYWwgb3BzLCBhbmQgMSAmIDIgYnl0ZSBsb2dpY2FsIG9wcyB1c2UgYSBjb21tb24KKy8vIGNyaXRpY2FsIHNlY3Rpb24uICBPbiBJbnRlbChSKSA2NCwgYWxsIGF0b21pYyBvcGVyYXRpb25zIGFyZSBkb25lIHdpdGggZmV0Y2gKKy8vIGFuZCBhZGQgb3IgY29tcGFyZSBhbmQgZXhjaGFuZ2UuICBUaGVyZWZvcmUsIHRoZSBGTEFHIHBhcmFtZXRlciB0byB0aGlzCisvLyBtYWNybyBpcyBlaXRoZXIgS01QX0FSQ0hfWDg2IG9yIDAgKG9yIDEsIGZvciBJbnRlbC1zcGVjaWZpYyBleHRlbnNpb24gd2hpY2gKKy8vIHJlcXVpcmUgYSBjcml0aWNhbCBzZWN0aW9uLCB3aGVyZSB3ZSBwcmVkaWN0IHRoYXQgdGhleSB3aWxsIGJlIGltcGxlbWVudGVkCisvLyBpbiB0aGUgR251IGNvZGVnZW4gYnkgY2FsbGluZyBHT01QX2F0b21pY19zdGFydCgpIC8gR09NUF9hdG9taWNfZW5kKCkpLgorLy8KKy8vIFdoZW4gdGhlIE9QX0dPTVBfQ1JJVElDQUwgbWFjcm8gaXMgdXNlZCBpbiBhICpDUklUSUNBTCogbWFjcm8gY29uc3RydWN0LAorLy8gdGhlIEZMQUcgcGFyYW1ldGVyIHNob3VsZCBhbHdheXMgYmUgMS4gIElmIHdlIGtub3cgdGhhdCB3ZSB3aWxsIGJlIHVzaW5nCisvLyBhIGNyaXRpY2FsIHNlY3Rpb24sIHRoZW4gd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4gdGhhdCB3ZSB1c2UgdGhlIGdlbmVyaWMKKy8vIGxvY2sgX19rbXBfYXRvbWljX2xvY2sgdG8gcHJvdGVjdCB0aGUgYXRvbWljIHVwZGF0ZSwgYW5kIG5vdCBvZiBvZiB0aGUKKy8vIGxvY2tzIHRoYXQgYXJlIHNwZWNpYWxpemVkIGJhc2VkIHVwb24gdGhlIHNpemUgb3IgdHlwZSBvZiB0aGUgZGF0YS4KKy8vCisvLyBJZiBGTEFHIGlzIDAsIHRoZW4gd2UgYXJlIHJlbHlpbmcgb24gZGVhZCBjb2RlIGVsaW1pbmF0aW9uIGJ5IHRoZSBidWlsZAorLy8gY29tcGlsZXIgdG8gZ2V0IHJpZCBvZiB0aGUgdXNlbGVzcyBibG9jayBvZiBjb2RlLCBhbmQgc2F2ZSBhIG5lZWRsZXNzCisvLyBicmFuY2ggYXQgcnVudGltZS4KKy8vCisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyMgZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUwoT1AsRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggKEZMQUcpICYmIChfX2ttcF9hdG9taWNfbW9kZSA9PSAyKSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ1JJVElDQUwoIE9QLCAwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorIyBlbHNlCisjIGRlZmluZSBPUF9HT01QX0NSSVRJQ0FMKE9QLEZMQUcpCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisKKyNpZiBLTVBfTUlDCisjIGRlZmluZSBLTVBfRE9fUEFVU0UgX21tX2RlbGF5XzMyKCAxICkKKyNlbHNlCisjIGRlZmluZSBLTVBfRE9fUEFVU0UgS01QX0NQVV9QQVVTRSgpCisjZW5kaWYgLyogS01QX01JQyAqLworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9wZXJhdGlvbiBvbiAqbGhzLCByaHMgdXNpbmcgImNvbXBhcmVfYW5kX3N0b3JlIiByb3V0aW5lCisvLyAgICAgVFlQRSAgICAtIG9wZXJhbmRzJyB0eXBlCisvLyAgICAgQklUUyAgICAtIHNpemUgaW4gYml0cywgdXNlZCB0byBkaXN0aW5ndWlzaCBsb3cgbGV2ZWwgY2FsbHMKKy8vICAgICBPUCAgICAgIC0gb3BlcmF0b3IKKyNkZWZpbmUgT1BfQ01QWENIRyhUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRZUEUgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgb2xkX3ZhbHVlID0gKihUWVBFIHZvbGF0aWxlICopbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgT1AgcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHdoaWxlICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRIyNCSVRTKCAoa21wX2ludCMjQklUUyAqKSBsaHMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICZvbGRfdmFsdWUsICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQjI0JJVFMgKikgJm5ld192YWx1ZSApICkgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBLTVBfRE9fUEFVU0U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBvbGRfdmFsdWUgPSAqKFRZUEUgdm9sYXRpbGUgKilsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSBPUCByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisjaWYgVVNFX0NNUFhDSEdfRklYCisvLyAyMDA3LTA2LTI1OgorLy8gd29ya2Fyb3VuZCBmb3IgQzc4Mjg3IChjb21wbGV4KGtpbmQ9NCkgZGF0YSB0eXBlKQorLy8gbGluXzMyLCBsaW5fMzJlLCB3aW5fMzIgYW5kIHdpbl8zMmUgYXJlIGFmZmVjdGVkIChJIHZlcmlmaWVkIHRoZSBhc20pCisvLyBDb21waWxlciBpZ25vcmVzIHRoZSB2b2xhdGlsZSBxdWFsaWZpZXIgb2YgdGhlIHRlbXBfdmFsIGluIHRoZSBPUF9DTVBYQ0hHIG1hY3JvLgorLy8gVGhpcyBpcyBhIHByb2JsZW0gb2YgdGhlIGNvbXBpbGVyLgorLy8gUmVsYXRlZCB0cmFja2VyIGlzIEM3NjAwNSwgdGFyZ2V0ZWQgdG8gMTEuMC4KKy8vIEkgdmVyaWZpZWQgdGhlIGFzbSBvZiB0aGUgd29ya2Fyb3VuZC4KKyNkZWZpbmUgT1BfQ01QWENIR19XT1JLQVJPVU5EKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJc3RydWN0IF9zc3MgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICBUWVBFICAgICAgICAgICAgY21wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAga21wX2ludCMjQklUUyAgICp2dnY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdHJ1Y3QgX3NzcyBvbGRfdmFsdWUsIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG9sZF92YWx1ZS52dnYgPSAoIGttcF9pbnQjI0JJVFMgKiApJm9sZF92YWx1ZS5jbXA7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbmV3X3ZhbHVlLnZ2diA9ICgga21wX2ludCMjQklUUyAqICkmbmV3X3ZhbHVlLmNtcDsgICAgICAgICAgICAgICAgXAorICAgICAgICAqb2xkX3ZhbHVlLnZ2diA9ICogKCB2b2xhdGlsZSBrbXBfaW50IyNCSVRTICogKSBsaHM7ICAgICAgICAgICAgICBcCisgICAgICAgIG5ld192YWx1ZS5jbXAgPSBvbGRfdmFsdWUuY21wIE9QIHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgd2hpbGUgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EjI0JJVFMoIChrbXBfaW50IyNCSVRTICopIGxocywgXAorICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQjI0JJVFMgKikgb2xkX3ZhbHVlLnZ2diwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSBuZXdfdmFsdWUudnZ2ICkgKSAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgS01QX0RPX1BBVVNFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgKm9sZF92YWx1ZS52dnYgPSAqICggdm9sYXRpbGUga21wX2ludCMjQklUUyAqICkgbGhzOyAgICAgICAgICBcCisJICAgIG5ld192YWx1ZS5jbXAgPSBvbGRfdmFsdWUuY21wIE9QIHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorLy8gZW5kIG9mIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSB3b3JrYXJvdW5kIGZvciBDNzgyODcKKyNlbmRpZiAvLyBVU0VfQ01QWENIR19GSVgKKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBYODYgb3IgWDg2XzY0OiBubyBhbGlnbm1lbnQgcHJvYmxlbXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjZGVmaW5lIEFUT01JQ19GSVhFRF9BREQoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsTENLX0lELE1BU0ssR09NUF9GTEFHKSBcCitBVE9NSUNfQkVHSU4oVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTChPUCMjPSxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogT1AgdXNlZCBhcyBhIHNpZ24gZm9yIHN1YnRyYWN0aW9uOiAobGhzLXJocykgLS0+IChsaHMrLXJocykgKi8gICAgICBcCisgICAgS01QX1RFU1RfVEhFTl9BREQjI0JJVFMoIGxocywgT1AgcmhzICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEFUT01JQ19DTVBYQ0hHKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLExDS19JRCxNQVNLLEdPTVBfRkxBRykgICBcCitBVE9NSUNfQkVHSU4oVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTChPUCMjPSxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ01QWENIRyhUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjaWYgVVNFX0NNUFhDSEdfRklYCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB3b3JrYXJvdW5kIGZvciBDNzgyODcgKGNvbXBsZXgoa2luZD00KSBkYXRhIHR5cGUpCisjZGVmaW5lIEFUT01JQ19DTVBYQ0hHX1dPUktBUk9VTkQoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsTENLX0lELE1BU0ssR09NUF9GTEFHKSAgIFwKK0FUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoT1AjIz0sR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ01QWENIR19XT1JLQVJPVU5EKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKy8vIGVuZCBvZiB0aGUgc2Vjb25kIHBhcnQgb2YgdGhlIHdvcmthcm91bmQgZm9yIEM3ODI4NworI2VuZGlmCisKKyNlbHNlCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb2RlIGZvciBvdGhlciBhcmNoaXRlY3R1cmVzIHRoYXQgZG9uJ3QgaGFuZGxlIHVuYWxpZ25lZCBhY2Nlc3Nlcy4KKyNkZWZpbmUgQVRPTUlDX0ZJWEVEX0FERChUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxMQ0tfSUQsTUFTSyxHT01QX0ZMQUcpIFwKK0FUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKE9QIyM9LEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoICEgKCAoa21wX3VpbnRwdHJfdCkgbGhzICYgMHgjI01BU0spICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgLyogT1AgdXNlZCBhcyBhIHNpZ24gZm9yIHN1YnRyYWN0aW9uOiAobGhzLXJocykgLS0+IChsaHMrLXJocykgKi8gIFwKKyAgICAgICAgS01QX1RFU1RfVEhFTl9BREQjI0JJVFMoIGxocywgT1AgcmhzICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ1JJVElDQUwoT1AjIz0sTENLX0lEKSAgLyogdW5hbGlnbmVkIGFkZHJlc3MgLSB1c2UgY3JpdGljYWwgKi8gIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX0NNUFhDSEcoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsTENLX0lELE1BU0ssR09NUF9GTEFHKSAgIFwKK0FUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKE9QIyM9LEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoICEgKCAoa21wX3VpbnRwdHJfdCkgbGhzICYgMHgjI01BU0spICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ01QWENIRyhUWVBFLEJJVFMsT1ApICAgICAvKiBhbGlnbmVkIGFkZHJlc3MgKi8gICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ1JJVElDQUwoT1AjIz0sTENLX0lEKSAgLyogdW5hbGlnbmVkIGFkZHJlc3MgLSB1c2UgY3JpdGljYWwgKi8gIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNpZiBVU0VfQ01QWENIR19GSVgKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHdvcmthcm91bmQgZm9yIEM3ODI4NyAoY29tcGxleChraW5kPTQpIGRhdGEgdHlwZSkKKyNkZWZpbmUgQVRPTUlDX0NNUFhDSEdfV09SS0FST1VORChUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxMQ0tfSUQsTUFTSyxHT01QX0ZMQUcpICAgXAorQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTChPUCMjPSxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoICEgKCAoa21wX3VpbnRwdHJfdCkgbGhzICYgMHgjI01BU0spICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DTVBYQ0hHKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgLyogYWxpZ25lZCBhZGRyZXNzICovICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DUklUSUNBTChPUCMjPSxMQ0tfSUQpICAvKiB1bmFsaWduZWQgYWRkcmVzcyAtIHVzZSBjcml0aWNhbCAqLyAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKy8vIGVuZCBvZiB0aGUgc2Vjb25kIHBhcnQgb2YgdGhlIHdvcmthcm91bmQgZm9yIEM3ODI4NworI2VuZGlmIC8vIFVTRV9DTVBYQ0hHX0ZJWAorI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworLy8gUm91dGluZXMgZm9yIEFUT01JQyA0LWJ5dGUgb3BlcmFuZHMgYWRkaXRpb24gYW5kIHN1YnRyYWN0aW9uCitBVE9NSUNfRklYRURfQUREKCBmaXhlZDQsIGFkZCwga21wX2ludDMyLCAgMzIsICssIDRpLCAzLCAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfYWRkCitBVE9NSUNfRklYRURfQUREKCBmaXhlZDQsIHN1Yiwga21wX2ludDMyLCAgMzIsIC0sIDRpLCAzLCAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfc3ViCisKK0FUT01JQ19DTVBYQ0hHKCBmbG9hdDQsICBhZGQsIGttcF9yZWFsMzIsIDMyLCArLCAgNHIsIDMsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGQKK0FUT01JQ19DTVBYQ0hHKCBmbG9hdDQsICBzdWIsIGttcF9yZWFsMzIsIDMyLCAtLCAgNHIsIDMsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWIKKworLy8gUm91dGluZXMgZm9yIEFUT01JQyA4LWJ5dGUgb3BlcmFuZHMgYWRkaXRpb24gYW5kIHN1YnRyYWN0aW9uCitBVE9NSUNfRklYRURfQUREKCBmaXhlZDgsIGFkZCwga21wX2ludDY0LCAgNjQsICssIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfYWRkCitBVE9NSUNfRklYRURfQUREKCBmaXhlZDgsIHN1Yiwga21wX2ludDY0LCAgNjQsIC0sIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfc3ViCisKK0FUT01JQ19DTVBYQ0hHKCBmbG9hdDgsICBhZGQsIGttcF9yZWFsNjQsIDY0LCArLCAgOHIsIDcsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGQKK0FUT01JQ19DTVBYQ0hHKCBmbG9hdDgsICBzdWIsIGttcF9yZWFsNjQsIDY0LCAtLCAgOHIsIDcsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWIKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyaWVzIGRlZmluaXRpb24gZm9yIGludGVnZXIgb3BlcmFuZHMKKy8vICAgICBUWVBFX0lEIC0gb3BlcmFuZHMgdHlwZSBhbmQgc2l6ZSAoZml4ZWQ0LCBmbG9hdDQpCisvLyAgICAgT1BfSUQgICAtIG9wZXJhdGlvbiBpZGVudGlmaWVyIChhZGQsIHN1YiwgbXVsLCAuLi4pCisvLyAgICAgVFlQRSAgICAtIG9wZXJhbmQgdHlwZQorLy8gICAgIEJJVFMgICAgLSBzaXplIGluIGJpdHMsIHVzZWQgdG8gZGlzdGluZ3Vpc2ggbG93IGxldmVsIGNhbGxzCisvLyAgICAgT1AgICAgICAtIG9wZXJhdG9yICh1c2VkIGluIGNyaXRpY2FsIHNlY3Rpb24pCisvLyAgICAgTENLX0lEICAtIGxvY2sgaWRlbnRpZmllciwgdXNlZCB0byBwb3NzaWJseSBkaXN0aW5ndWlzaCBsb2NrIHZhcmlhYmxlCisvLyAgICAgTUFTSyAgICAtIHVzZWQgZm9yIGFsaWdubWVudCBjaGVjaworCisvLyAgICAgICAgICAgICAgIFRZUEVfSUQsT1BfSUQsICBUWVBFLCAgIEJJVFMsT1AsTENLX0lELE1BU0ssR09NUF9GTEFHCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJvdXRpbmVzIGZvciBBVE9NSUMgaW50ZWdlciBvcGVyYW5kcywgb3RoZXIgb3BlcmF0b3JzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgICAgICAgICAgICBUWVBFX0lELE9QX0lELCBUWVBFLCAgICAgICAgICBPUCwgTENLX0lELCBHT01QX0ZMQUcKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDEsICBhZGQsIGttcF9pbnQ4LCAgICA4LCArLCAgMWksIDAsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hZGQKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDEsIGFuZGIsIGttcF9pbnQ4LCAgICA4LCAmLCAgMWksIDAsIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hbmRiCitBVE9NSUNfQ01QWENIRyggZml4ZWQxLCAgZGl2LCBrbXBfaW50OCwgICAgOCwgLywgIDFpLCAwLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfZGl2CitBVE9NSUNfQ01QWENIRyggZml4ZWQxdSwgZGl2LCBrbXBfdWludDgsICAgOCwgLywgIDFpLCAwLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDF1X2RpdgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMSwgIG11bCwga21wX2ludDgsICAgIDgsICosICAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX211bAorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMSwgIG9yYiwga21wX2ludDgsICAgIDgsIHwsICAxaSwgMCwgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX29yYgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMSwgIHNobCwga21wX2ludDgsICAgIDgsIDw8LCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3NobAorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMSwgIHNociwga21wX2ludDgsICAgIDgsID4+LCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3NocgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMXUsIHNociwga21wX3VpbnQ4LCAgIDgsID4+LCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxdV9zaHIKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDEsICBzdWIsIGttcF9pbnQ4LCAgICA4LCAtLCAgMWksIDAsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWIKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDEsICB4b3IsIGttcF9pbnQ4LCAgICA4LCBeLCAgMWksIDAsIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV94b3IKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDIsICBhZGQsIGttcF9pbnQxNiwgIDE2LCArLCAgMmksIDEsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hZGQKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDIsIGFuZGIsIGttcF9pbnQxNiwgIDE2LCAmLCAgMmksIDEsIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hbmRiCitBVE9NSUNfQ01QWENIRyggZml4ZWQyLCAgZGl2LCBrbXBfaW50MTYsICAxNiwgLywgIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfZGl2CitBVE9NSUNfQ01QWENIRyggZml4ZWQydSwgZGl2LCBrbXBfdWludDE2LCAxNiwgLywgIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJ1X2RpdgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMiwgIG11bCwga21wX2ludDE2LCAgMTYsICosICAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX211bAorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMiwgIG9yYiwga21wX2ludDE2LCAgMTYsIHwsICAyaSwgMSwgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX29yYgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMiwgIHNobCwga21wX2ludDE2LCAgMTYsIDw8LCAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3NobAorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMiwgIHNociwga21wX2ludDE2LCAgMTYsID4+LCAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3NocgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMnUsIHNociwga21wX3VpbnQxNiwgMTYsID4+LCAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQydV9zaHIKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDIsICBzdWIsIGttcF9pbnQxNiwgIDE2LCAtLCAgMmksIDEsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWIKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDIsICB4b3IsIGttcF9pbnQxNiwgIDE2LCBeLCAgMmksIDEsIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl94b3IKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDQsIGFuZGIsIGttcF9pbnQzMiwgIDMyLCAmLCAgNGksIDMsIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hbmRiCitBVE9NSUNfQ01QWENIRyggZml4ZWQ0LCAgZGl2LCBrbXBfaW50MzIsICAzMiwgLywgIDRpLCAzLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfZGl2CitBVE9NSUNfQ01QWENIRyggZml4ZWQ0dSwgZGl2LCBrbXBfdWludDMyLCAzMiwgLywgIDRpLCAzLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDR1X2RpdgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkNCwgIG11bCwga21wX2ludDMyLCAgMzIsICosICA0aSwgMywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X211bAorQVRPTUlDX0NNUFhDSEcoIGZpeGVkNCwgIG9yYiwga21wX2ludDMyLCAgMzIsIHwsICA0aSwgMywgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X29yYgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkNCwgIHNobCwga21wX2ludDMyLCAgMzIsIDw8LCA0aSwgMywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3NobAorQVRPTUlDX0NNUFhDSEcoIGZpeGVkNCwgIHNociwga21wX2ludDMyLCAgMzIsID4+LCA0aSwgMywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3NocgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkNHUsIHNociwga21wX3VpbnQzMiwgMzIsID4+LCA0aSwgMywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHIKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDQsICB4b3IsIGttcF9pbnQzMiwgIDMyLCBeLCAgNGksIDMsIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF94b3IKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDgsIGFuZGIsIGttcF9pbnQ2NCwgIDY0LCAmLCAgOGksIDcsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hbmRiCitBVE9NSUNfQ01QWENIRyggZml4ZWQ4LCAgZGl2LCBrbXBfaW50NjQsICA2NCwgLywgIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfZGl2CitBVE9NSUNfQ01QWENIRyggZml4ZWQ4dSwgZGl2LCBrbXBfdWludDY0LCA2NCwgLywgIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDh1X2RpdgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkOCwgIG11bCwga21wX2ludDY0LCAgNjQsICosICA4aSwgNywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X211bAorQVRPTUlDX0NNUFhDSEcoIGZpeGVkOCwgIG9yYiwga21wX2ludDY0LCAgNjQsIHwsICA4aSwgNywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X29yYgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkOCwgIHNobCwga21wX2ludDY0LCAgNjQsIDw8LCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3NobAorQVRPTUlDX0NNUFhDSEcoIGZpeGVkOCwgIHNociwga21wX2ludDY0LCAgNjQsID4+LCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3NocgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkOHUsIHNociwga21wX3VpbnQ2NCwgNjQsID4+LCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zaHIKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDgsICB4b3IsIGttcF9pbnQ2NCwgIDY0LCBeLCAgOGksIDcsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF94b3IKK0FUT01JQ19DTVBYQ0hHKCBmbG9hdDQsICBkaXYsIGttcF9yZWFsMzIsIDMyLCAvLCAgNHIsIDMsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXYKK0FUT01JQ19DTVBYQ0hHKCBmbG9hdDQsICBtdWwsIGttcF9yZWFsMzIsIDMyLCAqLCAgNHIsIDMsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tdWwKK0FUT01JQ19DTVBYQ0hHKCBmbG9hdDgsICBkaXYsIGttcF9yZWFsNjQsIDY0LCAvLCAgOHIsIDcsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXYKK0FUT01JQ19DTVBYQ0hHKCBmbG9hdDgsICBtdWwsIGttcF9yZWFsNjQsIDY0LCAqLCAgOHIsIDcsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tdWwKKy8vICAgICAgICAgICAgICBUWVBFX0lELE9QX0lELCBUWVBFLCAgICAgICAgICBPUCwgTENLX0lELCBHT01QX0ZMQUcKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIFJvdXRpbmVzIGZvciBDL0MrKyBSZWR1Y3Rpb24gb3BlcmF0b3JzICYmIGFuZCB8fCAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTmVlZCBzZXBhcmF0ZSBtYWNyb3MgZm9yICYmLCB8fCBiZWNhdXNlIHRoZXJlIGlzIG5vIGNvbWJpbmVkIGFzc2lnbm1lbnQKKy8vICAgVE9ETzogZWxpbWluYXRlIEFUT01JQ19DUklUX3tMLEVRVn0gbWFjcm9zIGFzIG5vdCB1c2VkCisjZGVmaW5lIEFUT01JQ19DUklUX0woVFlQRV9JRCxPUF9JRCxUWVBFLE9QLExDS19JRCxHT01QX0ZMQUcpICAgICAgICAgICAgIFwKK0FUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoID0gKmxocyBPUCwgR09NUF9GTEFHICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ1JJVElDQUwoID0gKmxocyBPUCwgTENLX0lEICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBYODYgb3IgWDg2XzY0OiBubyBhbGlnbm1lbnQgcHJvYmxlbXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNkZWZpbmUgQVRPTUlDX0NNUFhfTChUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxMQ0tfSUQsTUFTSyxHT01QX0ZMQUcpICAgXAorQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTCggPSAqbGhzIE9QLCBHT01QX0ZMQUcgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DTVBYQ0hHKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZWxzZQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb2RlIGZvciBvdGhlciBhcmNoaXRlY3R1cmVzIHRoYXQgZG9uJ3QgaGFuZGxlIHVuYWxpZ25lZCBhY2Nlc3Nlcy4KKyNkZWZpbmUgQVRPTUlDX0NNUFhfTChUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxMQ0tfSUQsTUFTSyxHT01QX0ZMQUcpICAgXAorQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTCg9ICpsaHMgT1AsR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoICEgKCAoa21wX3VpbnRwdHJfdCkgbGhzICYgMHgjI01BU0spICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DTVBYQ0hHKFRZUEUsQklUUyxPUCkgICAgICAgLyogYWxpZ25lZCBhZGRyZXNzICovICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DUklUSUNBTCg9ICpsaHMgT1AsTENLX0lEKSAgLyogdW5hbGlnbmVkIC0gdXNlIGNyaXRpY2FsICovICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKK0FUT01JQ19DTVBYX0woIGZpeGVkMSwgYW5kbCwgY2hhciwgICAgICAgOCwgJiYsIDFpLCAwLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfYW5kbAorQVRPTUlDX0NNUFhfTCggZml4ZWQxLCAgb3JsLCBjaGFyLCAgICAgICA4LCB8fCwgMWksIDAsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmwKK0FUT01JQ19DTVBYX0woIGZpeGVkMiwgYW5kbCwgc2hvcnQsICAgICAxNiwgJiYsIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfYW5kbAorQVRPTUlDX0NNUFhfTCggZml4ZWQyLCAgb3JsLCBzaG9ydCwgICAgIDE2LCB8fCwgMmksIDEsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9vcmwKK0FUT01JQ19DTVBYX0woIGZpeGVkNCwgYW5kbCwga21wX2ludDMyLCAzMiwgJiYsIDRpLCAzLCAwICkgICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfYW5kbAorQVRPTUlDX0NNUFhfTCggZml4ZWQ0LCAgb3JsLCBrbXBfaW50MzIsIDMyLCB8fCwgNGksIDMsIDAgKSAgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9vcmwKK0FUT01JQ19DTVBYX0woIGZpeGVkOCwgYW5kbCwga21wX2ludDY0LCA2NCwgJiYsIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfYW5kbAorQVRPTUlDX0NNUFhfTCggZml4ZWQ4LCAgb3JsLCBrbXBfaW50NjQsIDY0LCB8fCwgOGksIDcsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9vcmwKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBSb3V0aW5lcyBmb3IgRm9ydHJhbiBvcGVyYXRvcnMgdGhhdCBtYXRjaGVkIG5vIG9uZSBpbiBDOiAgICAgICAgICAgICAgICAgICovCisvKiBNQVgsIE1JTiwgLkVRVi4sIC5ORVFWLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPcGVyYXRvcnMgLkFORC4sIC5PUi4gYXJlIGNvdmVyZWQgYnkgX19rbXBjX2F0b21pY18qX3thbmRsLG9ybH0gICAgICAgICAgICovCisvKiBJbnRyaW5zaWNzIElBTkQsIElPUiwgSUVPUiBhcmUgY292ZXJlZCBieSBfX2ttcGNfYXRvbWljXypfe2FuZGIsb3JiLHhvcn0gICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1JTiBhbmQgTUFYIG5lZWQgc2VwYXJhdGUgbWFjcm9zCisvLyBPUCAtIG9wZXJhdG9yIHRvIGNoZWNrIGlmIHdlIG5lZWQgYW55IGFjdGlvbnM/CisjZGVmaW5lIE1JTl9NQVhfQ1JJVFNFQ1QoT1AsTENLX0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggKmxocyBPUCByaHMgKSB7ICAgICAgICAgICAgICAgICAvKiBzdGlsbCBuZWVkIGFjdGlvbnM/ICovICAgICAgICAgXAorICAgICAgICAqbGhzID0gcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisjZGVmaW5lIEdPTVBfTUlOX01BWF9DUklUU0VDVChPUCxGTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCggRkxBRyApICYmICggX19rbXBfYXRvbWljX21vZGUgPT0gMiApKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1JTl9NQVhfQ1JJVFNFQ1QoIE9QLCAwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorI2Vsc2UKKyNkZWZpbmUgR09NUF9NSU5fTUFYX0NSSVRTRUNUKE9QLEZMQUcpCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgTUlOX01BWF9DTVBYQ0hHKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVFlQRSBLTVBfQVRPTUlDX1ZPTEFUSUxFIHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVFlQRSBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcF92YWwgPSAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgb2xkX3ZhbHVlID0gdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgd2hpbGUgKCBvbGRfdmFsdWUgT1AgcmhzICYmICAgICAgICAgIC8qIHN0aWxsIG5lZWQgYWN0aW9ucz8gKi8gICAgIFwKKyAgICAgICAgICAgICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUSMjQklUUyggKGttcF9pbnQjI0JJVFMgKikgbGhzLCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICZvbGRfdmFsdWUsICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICZyaHMgKSApICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHRlbXBfdmFsID0gKmxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG9sZF92YWx1ZSA9IHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIDEtYnl0ZSwgMi1ieXRlIG9wZXJhbmRzIC0gdXNlIGNyaXRpY2FsIHNlY3Rpb24KKyNkZWZpbmUgTUlOX01BWF9DUklUSUNBTChUWVBFX0lELE9QX0lELFRZUEUsT1AsTENLX0lELEdPTVBfRkxBRykgICAgICAgICAgIFwKK0FUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoICpsaHMgT1AgcmhzICkgeyAgICAgLyogbmVlZCBhY3Rpb25zPyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgR09NUF9NSU5fTUFYX0NSSVRTRUNUKE9QLEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTUlOX01BWF9DUklUU0VDVChPUCxMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gWDg2IG9yIFg4Nl82NDogbm8gYWxpZ25tZW50IHByb2JsZW1zID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2RlZmluZSBNSU5fTUFYX0NPTVBYQ0hHKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLExDS19JRCxNQVNLLEdPTVBfRkxBRykgXAorQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggKmxocyBPUCByaHMgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBHT01QX01JTl9NQVhfQ1JJVFNFQ1QoT1AsR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNSU5fTUFYX0NNUFhDSEcoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZWxzZQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29kZSBmb3Igb3RoZXIgYXJjaGl0ZWN0dXJlcyB0aGF0IGRvbid0IGhhbmRsZSB1bmFsaWduZWQgYWNjZXNzZXMuCisjZGVmaW5lIE1JTl9NQVhfQ09NUFhDSEcoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsTENLX0lELE1BU0ssR09NUF9GTEFHKSBcCitBVE9NSUNfQkVHSU4oVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAqbGhzIE9QIHJocyApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEdPTVBfTUlOX01BWF9DUklUU0VDVChPUCxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICggISAoIChrbXBfdWludHB0cl90KSBsaHMgJiAweCMjTUFTSykgKSB7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBNSU5fTUFYX0NNUFhDSEcoVFlQRSxCSVRTLE9QKSAvKiBhbGlnbmVkIGFkZHJlc3MgKi8gICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBNSU5fTUFYX0NSSVRTRUNUKE9QLExDS19JRCkgICAvKiB1bmFsaWduZWQgYWRkcmVzcyAqLyAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCitNSU5fTUFYX0NPTVBYQ0hHKCBmaXhlZDEsICBtYXgsIGNoYXIsICAgICAgICA4LCA8LCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDFfbWF4CitNSU5fTUFYX0NPTVBYQ0hHKCBmaXhlZDEsICBtaW4sIGNoYXIsICAgICAgICA4LCA+LCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDFfbWluCitNSU5fTUFYX0NPTVBYQ0hHKCBmaXhlZDIsICBtYXgsIHNob3J0LCAgICAgIDE2LCA8LCAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDJfbWF4CitNSU5fTUFYX0NPTVBYQ0hHKCBmaXhlZDIsICBtaW4sIHNob3J0LCAgICAgIDE2LCA+LCAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDJfbWluCitNSU5fTUFYX0NPTVBYQ0hHKCBmaXhlZDQsICBtYXgsIGttcF9pbnQzMiwgIDMyLCA8LCA0aSwgMywgMCApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfbWF4CitNSU5fTUFYX0NPTVBYQ0hHKCBmaXhlZDQsICBtaW4sIGttcF9pbnQzMiwgIDMyLCA+LCA0aSwgMywgMCApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfbWluCitNSU5fTUFYX0NPTVBYQ0hHKCBmaXhlZDgsICBtYXgsIGttcF9pbnQ2NCwgIDY0LCA8LCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDhfbWF4CitNSU5fTUFYX0NPTVBYQ0hHKCBmaXhlZDgsICBtaW4sIGttcF9pbnQ2NCwgIDY0LCA+LCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDhfbWluCitNSU5fTUFYX0NPTVBYQ0hHKCBmbG9hdDQsICBtYXgsIGttcF9yZWFsMzIsIDMyLCA8LCA0ciwgMywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfbWF4CitNSU5fTUFYX0NPTVBYQ0hHKCBmbG9hdDQsICBtaW4sIGttcF9yZWFsMzIsIDMyLCA+LCA0ciwgMywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfbWluCitNSU5fTUFYX0NPTVBYQ0hHKCBmbG9hdDgsICBtYXgsIGttcF9yZWFsNjQsIDY0LCA8LCA4ciwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfbWF4CitNSU5fTUFYX0NPTVBYQ0hHKCBmbG9hdDgsICBtaW4sIGttcF9yZWFsNjQsIDY0LCA+LCA4ciwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfbWluCisjaWYgS01QX0hBVkVfUVVBRAorTUlOX01BWF9DUklUSUNBTCggZmxvYXQxNiwgbWF4LCAgICAgUVVBRF9MRUdBQ1ksICAgICAgPCwgMTZyLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9tYXgKK01JTl9NQVhfQ1JJVElDQUwoIGZsb2F0MTYsIG1pbiwgICAgIFFVQURfTEVHQUNZLCAgICAgID4sIDE2ciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWluCisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIE1JTl9NQVhfQ1JJVElDQUwoIGZsb2F0MTYsIG1heF9hMTYsIFF1YWRfYTE2X3QsICAgICA8LCAxNnIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X21heF9hMTYKKyAgICBNSU5fTUFYX0NSSVRJQ0FMKCBmbG9hdDE2LCBtaW5fYTE2LCBRdWFkX2ExNl90LCAgICAgPiwgMTZyLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9taW5fYTE2CisjZW5kaWYKKyNlbmRpZgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBOZWVkIHNlcGFyYXRlIG1hY3JvcyBmb3IgLkVRVi4gYmVjYXVzZSBvZiB0aGUgbmVlZCBvZiBjb21wbGVtZW50ICh+KQorLy8gT1AgaWdub3JlZCBmb3IgY3JpdGljYWwgc2VjdGlvbnMsIF49fiB1c2VkIGluc3RlYWQKKyNkZWZpbmUgQVRPTUlDX0NSSVRfRVFWKFRZUEVfSUQsT1BfSUQsVFlQRSxPUCxMQ0tfSUQsR09NUF9GTEFHKSAgICAgICAgICAgXAorQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTChePX4sR09NUF9GTEFHKSAgLyogc2VuZCBhc3NpZ25tZW50ICovICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DUklUSUNBTChePX4sTENLX0lEKSAgICAvKiBzZW5kIGFzc2lnbm1lbnQgYW5kIGNvbXBsZW1lbnQgKi8gICAgICAgXAorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFg4NiBvciBYODZfNjQ6IG5vIGFsaWdubWVudCBwcm9ibGVtcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2RlZmluZSBBVE9NSUNfQ01QWF9FUVYoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsTENLX0lELE1BU0ssR09NUF9GTEFHKSBcCitBVE9NSUNfQkVHSU4oVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKF49fixHT01QX0ZMQUcpICAvKiBzZW5kIGFzc2lnbm1lbnQgKi8gICAgICAgICAgICAgICAgXAorICAgIE9QX0NNUFhDSEcoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNlbHNlCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvZGUgZm9yIG90aGVyIGFyY2hpdGVjdHVyZXMgdGhhdCBkb24ndCBoYW5kbGUgdW5hbGlnbmVkIGFjY2Vzc2VzLgorI2RlZmluZSBBVE9NSUNfQ01QWF9FUVYoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsTENLX0lELE1BU0ssR09NUF9GTEFHKSBcCitBVE9NSUNfQkVHSU4oVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKF49fixHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggISAoIChrbXBfdWludHB0cl90KSBsaHMgJiAweCMjTUFTSykgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NNUFhDSEcoVFlQRSxCSVRTLE9QKSAgIC8qIGFsaWduZWQgYWRkcmVzcyAqLyAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NSSVRJQ0FMKF49fixMQ0tfSUQpICAgIC8qIHVuYWxpZ25lZCBhZGRyZXNzIC0gdXNlIGNyaXRpY2FsICovIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworQVRPTUlDX0NNUFhDSEcoICBmaXhlZDEsIG5lcXYsIGttcF9pbnQ4LCAgIDgsICAgXiwgMWksIDAsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX25lcXYKK0FUT01JQ19DTVBYQ0hHKCAgZml4ZWQyLCBuZXF2LCBrbXBfaW50MTYsIDE2LCAgIF4sIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9uZXF2CitBVE9NSUNfQ01QWENIRyggIGZpeGVkNCwgbmVxdiwga21wX2ludDMyLCAzMiwgICBeLCA0aSwgMywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDRfbmVxdgorQVRPTUlDX0NNUFhDSEcoICBmaXhlZDgsIG5lcXYsIGttcF9pbnQ2NCwgNjQsICAgXiwgOGksIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X25lcXYKK0FUT01JQ19DTVBYX0VRViggZml4ZWQxLCBlcXYsICBrbXBfaW50OCwgICA4LCAgXn4sIDFpLCAwLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9lcXYKK0FUT01JQ19DTVBYX0VRViggZml4ZWQyLCBlcXYsICBrbXBfaW50MTYsIDE2LCAgXn4sIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9lcXYKK0FUT01JQ19DTVBYX0VRViggZml4ZWQ0LCBlcXYsICBrbXBfaW50MzIsIDMyLCAgXn4sIDRpLCAzLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9lcXYKK0FUT01JQ19DTVBYX0VRViggZml4ZWQ4LCBlcXYsICBrbXBfaW50NjQsIDY0LCAgXn4sIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9lcXYKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJvdXRpbmVzIGZvciBFeHRlbmRlZCB0eXBlczogbG9uZyBkb3VibGUsIF9RdWFkLCBjb21wbGV4IGZsYXZvdXJzICh1c2UgY3JpdGljYWwgc2VjdGlvbikKKy8vICAgICBUWVBFX0lELCBPUF9JRCwgVFlQRSAtIGRldGFpbGVkIGFib3ZlCisvLyAgICAgT1AgICAgICAtIG9wZXJhdG9yCisvLyAgICAgTENLX0lEICAtIGxvY2sgaWRlbnRpZmllciwgdXNlZCB0byBwb3NzaWJseSBkaXN0aW5ndWlzaCBsb2NrIHZhcmlhYmxlCisjZGVmaW5lIEFUT01JQ19DUklUSUNBTChUWVBFX0lELE9QX0lELFRZUEUsT1AsTENLX0lELEdPTVBfRkxBRykgICAgICAgICAgIFwKK0FUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoT1AjIz0sR09NUF9GTEFHKSAgLyogc2VuZCBhc3NpZ25tZW50ICovICAgICAgICAgICAgICBcCisgICAgT1BfQ1JJVElDQUwoT1AjIz0sTENLX0lEKSAgICAgICAgICAvKiBzZW5kIGFzc2lnbm1lbnQgKi8gICAgICAgICAgICAgIFwKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLy8gcm91dGluZXMgZm9yIGxvbmcgZG91YmxlIHR5cGUKK0FUT01JQ19DUklUSUNBTCggZmxvYXQxMCwgYWRkLCBsb25nIGRvdWJsZSwgICAgICssIDEwciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfYWRkCitBVE9NSUNfQ1JJVElDQUwoIGZsb2F0MTAsIHN1YiwgbG9uZyBkb3VibGUsICAgICAtLCAxMHIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX3N1YgorQVRPTUlDX0NSSVRJQ0FMKCBmbG9hdDEwLCBtdWwsIGxvbmcgZG91YmxlLCAgICAgKiwgMTByLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF9tdWwKK0FUT01JQ19DUklUSUNBTCggZmxvYXQxMCwgZGl2LCBsb25nIGRvdWJsZSwgICAgIC8sIDEwciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2CisjaWYgS01QX0hBVkVfUVVBRAorLy8gcm91dGluZXMgZm9yIF9RdWFkIHR5cGUKK0FUT01JQ19DUklUSUNBTCggZmxvYXQxNiwgYWRkLCBRVUFEX0xFR0FDWSwgICAgICssIDE2ciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYWRkCitBVE9NSUNfQ1JJVElDQUwoIGZsb2F0MTYsIHN1YiwgUVVBRF9MRUdBQ1ksICAgICAtLCAxNnIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X3N1YgorQVRPTUlDX0NSSVRJQ0FMKCBmbG9hdDE2LCBtdWwsIFFVQURfTEVHQUNZLCAgICAgKiwgMTZyLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9tdWwKK0FUT01JQ19DUklUSUNBTCggZmxvYXQxNiwgZGl2LCBRVUFEX0xFR0FDWSwgICAgIC8sIDE2ciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2CisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIEFUT01JQ19DUklUSUNBTCggZmxvYXQxNiwgYWRkX2ExNiwgUXVhZF9hMTZfdCwgKywgMTZyLCAxICkgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9hZGRfYTE2CisgICAgQVRPTUlDX0NSSVRJQ0FMKCBmbG9hdDE2LCBzdWJfYTE2LCBRdWFkX2ExNl90LCAtLCAxNnIsIDEgKSAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9hMTYKKyAgICBBVE9NSUNfQ1JJVElDQUwoIGZsb2F0MTYsIG11bF9hMTYsIFF1YWRfYTE2X3QsICosIDE2ciwgMSApICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbXVsX2ExNgorICAgIEFUT01JQ19DUklUSUNBTCggZmxvYXQxNiwgZGl2X2ExNiwgUXVhZF9hMTZfdCwgLywgMTZyLCAxICkgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfYTE2CisjZW5kaWYKKyNlbmRpZgorLy8gcm91dGluZXMgZm9yIGNvbXBsZXggdHlwZXMKKworI2lmIFVTRV9DTVBYQ0hHX0ZJWAorLy8gd29ya2Fyb3VuZCBmb3IgQzc4Mjg3IChjb21wbGV4KGtpbmQ9NCkgZGF0YSB0eXBlKQorQVRPTUlDX0NNUFhDSEdfV09SS0FST1VORCggY21wbHg0LCBhZGQsIGttcF9jbXBseDMyLCA2NCwgKywgOGMsIDcsIDEgKSAgIC8vIF9fa21wY19hdG9taWNfY21wbHg0X2FkZAorQVRPTUlDX0NNUFhDSEdfV09SS0FST1VORCggY21wbHg0LCBzdWIsIGttcF9jbXBseDMyLCA2NCwgLSwgOGMsIDcsIDEgKSAgIC8vIF9fa21wY19hdG9taWNfY21wbHg0X3N1YgorQVRPTUlDX0NNUFhDSEdfV09SS0FST1VORCggY21wbHg0LCBtdWwsIGttcF9jbXBseDMyLCA2NCwgKiwgOGMsIDcsIDEgKSAgIC8vIF9fa21wY19hdG9taWNfY21wbHg0X211bAorQVRPTUlDX0NNUFhDSEdfV09SS0FST1VORCggY21wbHg0LCBkaXYsIGttcF9jbXBseDMyLCA2NCwgLywgOGMsIDcsIDEgKSAgIC8vIF9fa21wY19hdG9taWNfY21wbHg0X2RpdgorLy8gZW5kIG9mIHRoZSB3b3JrYXJvdW5kIGZvciBDNzgyODcKKyNlbHNlCitBVE9NSUNfQ1JJVElDQUwoIGNtcGx4NCwgIGFkZCwga21wX2NtcGx4MzIsICAgICArLCAgOGMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfYWRkCitBVE9NSUNfQ1JJVElDQUwoIGNtcGx4NCwgIHN1Yiwga21wX2NtcGx4MzIsICAgICAtLCAgOGMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfc3ViCitBVE9NSUNfQ1JJVElDQUwoIGNtcGx4NCwgIG11bCwga21wX2NtcGx4MzIsICAgICAqLCAgOGMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfbXVsCitBVE9NSUNfQ1JJVElDQUwoIGNtcGx4NCwgIGRpdiwga21wX2NtcGx4MzIsICAgICAvLCAgOGMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfZGl2CisjZW5kaWYgLy8gVVNFX0NNUFhDSEdfRklYCisKK0FUT01JQ19DUklUSUNBTCggY21wbHg4LCAgYWRkLCBrbXBfY21wbHg2NCwgICAgICssIDE2YywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4OF9hZGQKK0FUT01JQ19DUklUSUNBTCggY21wbHg4LCAgc3ViLCBrbXBfY21wbHg2NCwgICAgIC0sIDE2YywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4OF9zdWIKK0FUT01JQ19DUklUSUNBTCggY21wbHg4LCAgbXVsLCBrbXBfY21wbHg2NCwgICAgICosIDE2YywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4OF9tdWwKK0FUT01JQ19DUklUSUNBTCggY21wbHg4LCAgZGl2LCBrbXBfY21wbHg2NCwgICAgIC8sIDE2YywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4OF9kaXYKK0FUT01JQ19DUklUSUNBTCggY21wbHgxMCwgYWRkLCBrbXBfY21wbHg4MCwgICAgICssIDIwYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTBfYWRkCitBVE9NSUNfQ1JJVElDQUwoIGNtcGx4MTAsIHN1Yiwga21wX2NtcGx4ODAsICAgICAtLCAyMGMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDEwX3N1YgorQVRPTUlDX0NSSVRJQ0FMKCBjbXBseDEwLCBtdWwsIGttcF9jbXBseDgwLCAgICAgKiwgMjBjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxMF9tdWwKK0FUT01JQ19DUklUSUNBTCggY21wbHgxMCwgZGl2LCBrbXBfY21wbHg4MCwgICAgIC8sIDIwYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTBfZGl2CisjaWYgS01QX0hBVkVfUVVBRAorQVRPTUlDX0NSSVRJQ0FMKCBjbXBseDE2LCBhZGQsIENQTFgxMjhfTEVHLCAgICAgKywgMzJjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9hZGQKK0FUT01JQ19DUklUSUNBTCggY21wbHgxNiwgc3ViLCBDUExYMTI4X0xFRywgICAgIC0sIDMyYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViCitBVE9NSUNfQ1JJVElDQUwoIGNtcGx4MTYsIG11bCwgQ1BMWDEyOF9MRUcsICAgICAqLCAzMmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X211bAorQVRPTUlDX0NSSVRJQ0FMKCBjbXBseDE2LCBkaXYsIENQTFgxMjhfTEVHLCAgICAgLywgMzJjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXYKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgQVRPTUlDX0NSSVRJQ0FMKCBjbXBseDE2LCBhZGRfYTE2LCBrbXBfY21wbHgxMjhfYTE2X3QsICssIDMyYywgMSApICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X2FkZF9hMTYKKyAgICBBVE9NSUNfQ1JJVElDQUwoIGNtcGx4MTYsIHN1Yl9hMTYsIGttcF9jbXBseDEyOF9hMTZfdCwgLSwgMzJjLCAxICkgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2ExNgorICAgIEFUT01JQ19DUklUSUNBTCggY21wbHgxNiwgbXVsX2ExNiwga21wX2NtcGx4MTI4X2ExNl90LCAqLCAzMmMsIDEgKSAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9tdWxfYTE2CisgICAgQVRPTUlDX0NSSVRJQ0FMKCBjbXBseDE2LCBkaXZfYTE2LCBrbXBfY21wbHgxMjhfYTE2X3QsIC8sIDMyYywgMSApICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9hMTYKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorCisvLyBPcGVuTVAgNC4wOiB4ID0gZXhwciBiaW5vcCB4IGZvciBub24tY29tbXV0YXRpdmUgb3BlcmF0aW9ucy4KKy8vIFN1cHBvcnRlZCBvbmx5IG9uIElBLTMyIGFyY2hpdGVjdHVyZSBhbmQgSW50ZWwoUikgNjQKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT3BlcmF0aW9uIG9uICpsaHMsIHJocyBib3VuZCBieSBjcml0aWNhbCBzZWN0aW9uCisvLyAgICAgT1AgICAgIC0gb3BlcmF0b3IgKGl0J3Mgc3VwcG9zZWQgdG8gY29udGFpbiBhbiBhc3NpZ25tZW50KQorLy8gICAgIExDS19JRCAtIGxvY2sgaWRlbnRpZmllcgorLy8gTm90ZTogZG9uJ3QgY2hlY2sgZ3RpZCBhcyBpdCBzaG91bGQgYWx3YXlzIGJlIHZhbGlkCisvLyAxLCAyLWJ5dGUgLSBleHBlY3QgdmFsaWQgcGFyYW1ldGVyLCBvdGhlciAtIGNoZWNrIGJlZm9yZSB0aGlzIG1hY3JvCisjZGVmaW5lIE9QX0NSSVRJQ0FMX1JFVihPUCxMQ0tfSUQpIFwKKyAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCpsaHMpID0gKHJocykgT1AgKCpsaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfUkVWKE9QLEZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIChGTEFHKSAmJiAoX19rbXBfYXRvbWljX21vZGUgPT0gMikgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NSSVRJQ0FMX1JFViggT1AsIDAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyNlbHNlCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfUkVWKE9QLEZMQUcpCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisKKworLy8gQmVnaW5uaW5nIG9mIGEgZGVmaW5pdGlvbiAocHJvdmlkZXMgbmFtZSwgcGFyYW1ldGVycywgZ2VidWcgdHJhY2UpCisvLyAgICAgVFlQRV9JRCAtIG9wZXJhbmRzIHR5cGUgYW5kIHNpemUgKGZpeGVkKiwgZml4ZWQqdSBmb3Igc2lnbmVkLCB1bnNpZ25lZCBmaXhlZCkKKy8vICAgICBPUF9JRCAgIC0gb3BlcmF0aW9uIGlkZW50aWZpZXIgKGFkZCwgc3ViLCBtdWwsIC4uLikKKy8vICAgICBUWVBFICAgIC0gb3BlcmFuZHMnIHR5cGUKKyNkZWZpbmUgQVRPTUlDX0JFR0lOX1JFVihUWVBFX0lELE9QX0lELFRZUEUsIFJFVF9UWVBFKSBcCitSRVRfVFlQRSBfX2ttcGNfYXRvbWljXyMjVFlQRV9JRCMjXyMjT1BfSUQjI19yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFRZUEUgKiBsaHMsIFRZUEUgcmhzICkgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtBX1RSQUNFKDEwMCwoIl9fa21wY19hdG9taWNfIiAjVFlQRV9JRCAiXyIgI09QX0lEICJfcmV2OiBUIyVkXG4iLCBndGlkICkpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9wZXJhdGlvbiBvbiAqbGhzLCByaHMgdXNpbmcgImNvbXBhcmVfYW5kX3N0b3JlIiByb3V0aW5lCisvLyAgICAgVFlQRSAgICAtIG9wZXJhbmRzJyB0eXBlCisvLyAgICAgQklUUyAgICAtIHNpemUgaW4gYml0cywgdXNlZCB0byBkaXN0aW5ndWlzaCBsb3cgbGV2ZWwgY2FsbHMKKy8vICAgICBPUCAgICAgIC0gb3BlcmF0b3IKKy8vIE5vdGU6IHRlbXBfdmFsIGludHJvZHVjZWQgaW4gb3JkZXIgdG8gZm9yY2UgdGhlIGNvbXBpbGVyIHRvIHJlYWQKKy8vICAgICAgICpsaHMgb25seSBvbmNlICh3L28gaXQgdGhlIGNvbXBpbGVyIHJlYWRzICpsaHMgdHdpY2UpCisjZGVmaW5lIE9QX0NNUFhDSEdfUkVWKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUWVBFIEtNUF9BVE9NSUNfVk9MQVRJTEUgdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRZUEUgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcF92YWwgPSAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBvbGRfdmFsdWUgPSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5ld192YWx1ZSA9IHJocyBPUCBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgd2hpbGUgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EjI0JJVFMoIChrbXBfaW50IyNCSVRTICopIGxocywgXAorICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQjI0JJVFMgKikgJm9sZF92YWx1ZSwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmbmV3X3ZhbHVlICkgKSAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgS01QX0RPX1BBVVNFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHRlbXBfdmFsID0gKmxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgb2xkX3ZhbHVlID0gdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBuZXdfdmFsdWUgPSByaHMgT1Agb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBVE9NSUNfQ01QWENIR19SRVYoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsTENLX0lELEdPTVBfRkxBRykgICBcCitBVE9NSUNfQkVHSU5fUkVWKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMX1JFVihPUCxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NNUFhDSEdfUkVWKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cmllcyBkZWZpbml0aW9uIGZvciBpbnRlZ2VyIG9wZXJhbmRzCisvLyAgICAgVFlQRV9JRCAtIG9wZXJhbmRzIHR5cGUgYW5kIHNpemUgKGZpeGVkNCwgZmxvYXQ0KQorLy8gICAgIE9QX0lEICAgLSBvcGVyYXRpb24gaWRlbnRpZmllciAoYWRkLCBzdWIsIG11bCwgLi4uKQorLy8gICAgIFRZUEUgICAgLSBvcGVyYW5kIHR5cGUKKy8vICAgICBCSVRTICAgIC0gc2l6ZSBpbiBiaXRzLCB1c2VkIHRvIGRpc3Rpbmd1aXNoIGxvdyBsZXZlbCBjYWxscworLy8gICAgIE9QICAgICAgLSBvcGVyYXRvciAodXNlZCBpbiBjcml0aWNhbCBzZWN0aW9uKQorLy8gICAgIExDS19JRCAgLSBsb2NrIGlkZW50aWZpZXIsIHVzZWQgdG8gcG9zc2libHkgZGlzdGluZ3Vpc2ggbG9jayB2YXJpYWJsZQorCisvLyAgICAgICAgICAgICAgIFRZUEVfSUQsT1BfSUQsICBUWVBFLCAgIEJJVFMsT1AsTENLX0lELEdPTVBfRkxBRworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSb3V0aW5lcyBmb3IgQVRPTUlDIGludGVnZXIgb3BlcmFuZHMsIG90aGVyIG9wZXJhdG9ycworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgICAgICAgICAgICAgICAgIFRZUEVfSUQsT1BfSUQsIFRZUEUsICAgIEJJVFMsIE9QLCBMQ0tfSUQsIEdPTVBfRkxBRworQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDEsICBkaXYsIGttcF9pbnQ4LCAgICA4LCAvLCAgMWksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkMXUsIGRpdiwga21wX3VpbnQ4LCAgIDgsIC8sICAxaSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXZfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkMSwgIHNobCwga21wX2ludDgsICAgIDgsIDw8LCAxaSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3NobF9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQxLCAgc2hyLCBrbXBfaW50OCwgICAgOCwgPj4sIDFpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfc2hyX3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDF1LCBzaHIsIGttcF91aW50OCwgICA4LCA+PiwgMWksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfc2hyX3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDEsICBzdWIsIGttcF9pbnQ4LCAgICA4LCAtLCAgMWksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWJfcmV2CisKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQyLCAgZGl2LCBrbXBfaW50MTYsICAxNiwgLywgIDJpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfZGl2X3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDJ1LCBkaXYsIGttcF91aW50MTYsIDE2LCAvLCAgMmksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2X3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDIsICBzaGwsIGttcF9pbnQxNiwgIDE2LCA8PCwgMmksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaGxfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkMiwgIHNociwga21wX2ludDE2LCAgMTYsID4+LCAyaSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3Nocl9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQydSwgc2hyLCBrbXBfdWludDE2LCAxNiwgPj4sIDJpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJ1X3Nocl9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQyLCAgc3ViLCBrbXBfaW50MTYsICAxNiwgLSwgIDJpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfc3ViX3JldgorCitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkNCwgIGRpdiwga21wX2ludDMyLCAgMzIsIC8sICA0aSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQ0dSwgZGl2LCBrbXBfdWludDMyLCAzMiwgLywgIDRpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDR1X2Rpdl9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQ0LCAgc2hsLCBrbXBfaW50MzIsICAzMiwgPDwsIDRpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfc2hsX3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDQsICBzaHIsIGttcF9pbnQzMiwgIDMyLCA+PiwgNGksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaHJfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkNHUsIHNociwga21wX3VpbnQzMiwgMzIsID4+LCA0aSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHJfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkNCwgIHN1Yiwga21wX2ludDMyLCAgMzIsIC0sICA0aSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9yZXYKKworQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDgsICBkaXYsIGttcF9pbnQ2NCwgIDY0LCAvLCAgOGksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkOHUsIGRpdiwga21wX3VpbnQ2NCwgNjQsIC8sICA4aSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkOCwgIHNobCwga21wX2ludDY0LCAgNjQsIDw8LCA4aSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3NobF9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQ4LCAgc2hyLCBrbXBfaW50NjQsICA2NCwgPj4sIDhpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfc2hyX3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDh1LCBzaHIsIGttcF91aW50NjQsIDY0LCA+PiwgOGksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc2hyX3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDgsICBzdWIsIGttcF9pbnQ2NCwgIDY0LCAtLCAgOGksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfcmV2CisKK0FUT01JQ19DTVBYQ0hHX1JFViggZmxvYXQ0LCAgZGl2LCBrbXBfcmVhbDMyLCAzMiwgLywgIDRyLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmbG9hdDQsICBzdWIsIGttcF9yZWFsMzIsIDMyLCAtLCAgNHIsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfcmV2CisKK0FUT01JQ19DTVBYQ0hHX1JFViggZmxvYXQ4LCAgZGl2LCBrbXBfcmVhbDY0LCA2NCwgLywgIDhyLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfZGl2X3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmbG9hdDgsICBzdWIsIGttcF9yZWFsNjQsIDY0LCAtLCAgOHIsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWJfcmV2CisvLyAgICAgICAgICAgICAgICAgIFRZUEVfSUQsT1BfSUQsIFRZUEUsICAgICBCSVRTLE9QLExDS19JRCwgR09NUF9GTEFHCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUm91dGluZXMgZm9yIEV4dGVuZGVkIHR5cGVzOiBsb25nIGRvdWJsZSwgX1F1YWQsIGNvbXBsZXggZmxhdm91cnMgKHVzZSBjcml0aWNhbCBzZWN0aW9uKQorLy8gICAgIFRZUEVfSUQsIE9QX0lELCBUWVBFIC0gZGV0YWlsZWQgYWJvdmUKKy8vICAgICBPUCAgICAgIC0gb3BlcmF0b3IKKy8vICAgICBMQ0tfSUQgIC0gbG9jayBpZGVudGlmaWVyLCB1c2VkIHRvIHBvc3NpYmx5IGRpc3Rpbmd1aXNoIGxvY2sgdmFyaWFibGUKKyNkZWZpbmUgQVRPTUlDX0NSSVRJQ0FMX1JFVihUWVBFX0lELE9QX0lELFRZUEUsT1AsTENLX0lELEdPTVBfRkxBRykgICAgICAgICAgIFwKK0FUT01JQ19CRUdJTl9SRVYoVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMX1JFVihPUCxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DUklUSUNBTF9SRVYoT1AsTENLX0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLy8gcm91dGluZXMgZm9yIGxvbmcgZG91YmxlIHR5cGUKK0FUT01JQ19DUklUSUNBTF9SRVYoIGZsb2F0MTAsIHN1YiwgbG9uZyBkb3VibGUsICAgICAtLCAxMHIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9yZXYKK0FUT01JQ19DUklUSUNBTF9SRVYoIGZsb2F0MTAsIGRpdiwgbG9uZyBkb3VibGUsICAgICAvLCAxMHIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX2Rpdl9yZXYKKyNpZiBLTVBfSEFWRV9RVUFECisvLyByb3V0aW5lcyBmb3IgX1F1YWQgdHlwZQorQVRPTUlDX0NSSVRJQ0FMX1JFViggZmxvYXQxNiwgc3ViLCBRVUFEX0xFR0FDWSwgICAgIC0sIDE2ciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX3JldgorQVRPTUlDX0NSSVRJQ0FMX1JFViggZmxvYXQxNiwgZGl2LCBRVUFEX0xFR0FDWSwgICAgIC8sIDE2ciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X3JldgorI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICBBVE9NSUNfQ1JJVElDQUxfUkVWKCBmbG9hdDE2LCBzdWJfYTE2LCBRdWFkX2ExNl90LCAtLCAxNnIsIDEgKSAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9hMTZfcmV2CisgICAgQVRPTUlDX0NSSVRJQ0FMX1JFViggZmxvYXQxNiwgZGl2X2ExNiwgUXVhZF9hMTZfdCwgLywgMTZyLCAxICkgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfYTE2X3JldgorI2VuZGlmCisjZW5kaWYKKworLy8gcm91dGluZXMgZm9yIGNvbXBsZXggdHlwZXMKK0FUT01JQ19DUklUSUNBTF9SRVYoIGNtcGx4NCwgIHN1Yiwga21wX2NtcGx4MzIsICAgICAtLCA4YywgICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfc3ViX3JldgorQVRPTUlDX0NSSVRJQ0FMX1JFViggY21wbHg0LCAgZGl2LCBrbXBfY21wbHgzMiwgICAgIC8sIDhjLCAgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXZfcmV2CitBVE9NSUNfQ1JJVElDQUxfUkVWKCBjbXBseDgsICBzdWIsIGttcF9jbXBseDY0LCAgICAgLSwgMTZjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg4X3N1Yl9yZXYKK0FUT01JQ19DUklUSUNBTF9SRVYoIGNtcGx4OCwgIGRpdiwga21wX2NtcGx4NjQsICAgICAvLCAxNmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDhfZGl2X3JldgorQVRPTUlDX0NSSVRJQ0FMX1JFViggY21wbHgxMCwgc3ViLCBrbXBfY21wbHg4MCwgICAgIC0sIDIwYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3ViX3JldgorQVRPTUlDX0NSSVRJQ0FMX1JFViggY21wbHgxMCwgZGl2LCBrbXBfY21wbHg4MCwgICAgIC8sIDIwYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTBfZGl2X3JldgorI2lmIEtNUF9IQVZFX1FVQUQKK0FUT01JQ19DUklUSUNBTF9SRVYoIGNtcGx4MTYsIHN1YiwgQ1BMWDEyOF9MRUcsICAgICAtLCAzMmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9yZXYKK0FUT01JQ19DUklUSUNBTF9SRVYoIGNtcGx4MTYsIGRpdiwgQ1BMWDEyOF9MRUcsICAgICAvLCAzMmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9yZXYKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgQVRPTUlDX0NSSVRJQ0FMX1JFViggY21wbHgxNiwgc3ViX2ExNiwga21wX2NtcGx4MTI4X2ExNl90LCAtLCAzMmMsIDEgKSAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfYTE2X3JldgorICAgIEFUT01JQ19DUklUSUNBTF9SRVYoIGNtcGx4MTYsIGRpdl9hMTYsIGttcF9jbXBseDEyOF9hMTZfdCwgLywgMzJjLCAxICkgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2X2ExNl9yZXYKKyNlbmRpZgorI2VuZGlmCisKKworI2VuZGlmIC8vS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorLy8gRW5kIG9mIE9wZW5NUCA0LjA6IHggPSBleHByIGJpbm9wIHggZm9yIG5vbi1jb21tdXRhdGl2ZSBvcGVyYXRpb25zLgorCisjZW5kaWYgLy9PTVBfNDBfRU5BQkxFRAorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogUm91dGluZXMgZm9yIG1peGVkIHR5cGVzIG9mIExIUyBhbmQgUkhTLCB3aGVuIFJIUyBpcyAibGFyZ2VyIiAgICAgICAgICAgICovCisvKiBOb3RlOiBpbiBvcmRlciB0byByZWR1Y2UgdGhlIHRvdGFsIG51bWJlciBvZiB0eXBlcyBjb21iaW5hdGlvbnMgICAgICAgICAgKi8KKy8qICAgICAgIGl0IGlzIHN1cHBvc2VkIHRoYXQgY29tcGlsZXIgY29udmVydHMgUkhTIHRvIGxvbmdlc3QgZmxvYXRpbmcgdHlwZSwqLworLyogICAgICAgdGhhdCBpcyBfUXVhZCwgYmVmb3JlIGNhbGwgdG8gYW55IG9mIHRoZXNlIHJvdXRpbmVzICAgICAgICAgICAgICAgICovCisvKiBDb252ZXJzaW9uIHRvIF9RdWFkIHdpbGwgYmUgZG9uZSBieSB0aGUgY29tcGlsZXIgZHVyaW5nIGNhbGN1bGF0aW9uLCAgICAgKi8KKy8qICAgIGNvbnZlcnNpb24gYmFjayB0byBUWVBFIC0gYmVmb3JlIHRoZSBhc3NpZ25tZW50LCBsaWtlOiAgICAgICAgICAgICAgICAqLworLyogICAgKmxocyA9IChUWVBFKSggKF9RdWFkKSgqbGhzKSBPUCByaHMgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQZXJmb3JtYW5jZSBwZW5hbHR5IGV4cGVjdGVkIGJlY2F1c2Ugb2YgU1cgZW11bGF0aW9uIHVzZSAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEFUT01JQ19CRUdJTl9NSVgoVFlQRV9JRCxUWVBFLE9QX0lELFJUWVBFX0lELFJUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3ZvaWQgX19rbXBjX2F0b21pY18jI1RZUEVfSUQjI18jI09QX0lEIyNfIyNSVFlQRV9JRCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgVFlQRSAqIGxocywgUlRZUEUgcmhzICkgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLQV9UUkFDRSgxMDAsKCJfX2ttcGNfYXRvbWljXyIgI1RZUEVfSUQgIl8iICNPUF9JRCAiXyIgI1JUWVBFX0lEICI6IFQjJWRcbiIsIGd0aWQgKSk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX0NSSVRJQ0FMX0ZQKFRZUEVfSUQsVFlQRSxPUF9JRCxPUCxSVFlQRV9JRCxSVFlQRSxMQ0tfSUQsR09NUF9GTEFHKSAgICAgICAgIFwKK0FUT01JQ19CRUdJTl9NSVgoVFlQRV9JRCxUWVBFLE9QX0lELFJUWVBFX0lELFJUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKE9QIyM9LEdPTVBfRkxBRykgIC8qIHNlbmQgYXNzaWdubWVudCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DUklUSUNBTChPUCMjPSxMQ0tfSUQpICAvKiBzZW5kIGFzc2lnbm1lbnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFg4NiBvciBYODZfNjQ6IG5vIGFsaWdubWVudCBwcm9ibGVtcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNkZWZpbmUgQVRPTUlDX0NNUFhDSEdfTUlYKFRZUEVfSUQsVFlQRSxPUF9JRCxCSVRTLE9QLFJUWVBFX0lELFJUWVBFLExDS19JRCxNQVNLLEdPTVBfRkxBRykgXAorQVRPTUlDX0JFR0lOX01JWChUWVBFX0lELFRZUEUsT1BfSUQsUlRZUEVfSUQsUlRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTChPUCMjPSxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DTVBYQ0hHKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2Vsc2UKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29kZSBmb3Igb3RoZXIgYXJjaGl0ZWN0dXJlcyB0aGF0IGRvbid0IGhhbmRsZSB1bmFsaWduZWQgYWNjZXNzZXMuCisjZGVmaW5lIEFUT01JQ19DTVBYQ0hHX01JWChUWVBFX0lELFRZUEUsT1BfSUQsQklUUyxPUCxSVFlQRV9JRCxSVFlQRSxMQ0tfSUQsTUFTSyxHT01QX0ZMQUcpIFwKK0FUT01JQ19CRUdJTl9NSVgoVFlQRV9JRCxUWVBFLE9QX0lELFJUWVBFX0lELFJUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoT1AjIz0sR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAhICggKGttcF91aW50cHRyX3QpIGxocyAmIDB4IyNNQVNLKSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ01QWENIRyhUWVBFLEJJVFMsT1ApICAgICAvKiBhbGlnbmVkIGFkZHJlc3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ1JJVElDQUwoT1AjIz0sTENLX0lEKSAgLyogdW5hbGlnbmVkIGFkZHJlc3MgLSB1c2UgY3JpdGljYWwgKi8gICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisvLyBSSFM9ZmxvYXQ4CitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkMSwgY2hhciwgICAgICAgbXVsLCAgOCwgKiwgZmxvYXQ4LCBrbXBfcmVhbDY0LCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDFfbXVsX2Zsb2F0OAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDEsIGNoYXIsICAgICAgIGRpdiwgIDgsIC8sIGZsb2F0OCwga21wX3JlYWw2NCwgMWksIDAsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9mbG9hdDgKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQyLCBzaG9ydCwgICAgICBtdWwsIDE2LCAqLCBmbG9hdDgsIGttcF9yZWFsNjQsIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tdWxfZmxvYXQ4CitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkMiwgc2hvcnQsICAgICAgZGl2LCAxNiwgLywgZmxvYXQ4LCBrbXBfcmVhbDY0LCAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDJfZGl2X2Zsb2F0OAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDQsIGttcF9pbnQzMiwgIG11bCwgMzIsICosIGZsb2F0OCwga21wX3JlYWw2NCwgNGksIDMsIDAgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X211bF9mbG9hdDgKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQ0LCBrbXBfaW50MzIsICBkaXYsIDMyLCAvLCBmbG9hdDgsIGttcF9yZWFsNjQsIDRpLCAzLCAwICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfZmxvYXQ4CitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkOCwga21wX2ludDY0LCAgbXVsLCA2NCwgKiwgZmxvYXQ4LCBrbXBfcmVhbDY0LCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDhfbXVsX2Zsb2F0OAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDgsIGttcF9pbnQ2NCwgIGRpdiwgNjQsIC8sIGZsb2F0OCwga21wX3JlYWw2NCwgOGksIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9mbG9hdDgKK0FUT01JQ19DTVBYQ0hHX01JWCggZmxvYXQ0LCBrbXBfcmVhbDMyLCBhZGQsIDMyLCArLCBmbG9hdDgsIGttcF9yZWFsNjQsIDRyLCAzLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGRfZmxvYXQ4CitBVE9NSUNfQ01QWENIR19NSVgoIGZsb2F0NCwga21wX3JlYWwzMiwgc3ViLCAzMiwgLSwgZmxvYXQ4LCBrbXBfcmVhbDY0LCA0ciwgMywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2Zsb2F0OAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmbG9hdDQsIGttcF9yZWFsMzIsIG11bCwgMzIsICosIGZsb2F0OCwga21wX3JlYWw2NCwgNHIsIDMsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X211bF9mbG9hdDgKK0FUT01JQ19DTVBYQ0hHX01JWCggZmxvYXQ0LCBrbXBfcmVhbDMyLCBkaXYsIDMyLCAvLCBmbG9hdDgsIGttcF9yZWFsNjQsIDRyLCAzLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfZmxvYXQ4CisKKy8vIFJIUz1mbG9hdDE2IChkZXByZWNhdGVkLCB0byBiZSByZW1vdmVkIHdoZW4gd2UgYXJlIHN1cmUgdGhlIGNvbXBpbGVyIGRvZXMgbm90IHVzZSB0aGVtKQorI2lmIEtNUF9IQVZFX1FVQUQKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQxLCAgY2hhciwgICAgICAgYWRkLCAgOCwgKywgZnAsIF9RdWFkLCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDFfYWRkX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkMSwgIGNoYXIsICAgICAgIHN1YiwgIDgsIC0sIGZwLCBfUXVhZCwgMWksIDAsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3N1Yl9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDEsICBjaGFyLCAgICAgICBtdWwsICA4LCAqLCBmcCwgX1F1YWQsIDFpLCAwLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tdWxfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQxLCAgY2hhciwgICAgICAgZGl2LCAgOCwgLywgZnAsIF9RdWFkLCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDFfZGl2X2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkMXUsIHVjaGFyLCAgICAgIGRpdiwgIDgsIC8sIGZwLCBfUXVhZCwgMWksIDAsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXZfZnAKKworQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDIsICBzaG9ydCwgICAgICBhZGQsIDE2LCArLCBmcCwgX1F1YWQsIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hZGRfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQyLCAgc2hvcnQsICAgICAgc3ViLCAxNiwgLSwgZnAsIF9RdWFkLCAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDJfc3ViX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkMiwgIHNob3J0LCAgICAgIG11bCwgMTYsICosIGZwLCBfUXVhZCwgMmksIDEsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX211bF9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDIsICBzaG9ydCwgICAgICBkaXYsIDE2LCAvLCBmcCwgX1F1YWQsIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQydSwgdXNob3J0LCAgICAgZGl2LCAxNiwgLywgZnAsIF9RdWFkLCAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9mcAorCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkNCwgIGttcF9pbnQzMiwgIGFkZCwgMzIsICssIGZwLCBfUXVhZCwgNGksIDMsIDAgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X2FkZF9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDQsICBrbXBfaW50MzIsICBzdWIsIDMyLCAtLCBmcCwgX1F1YWQsIDRpLCAzLCAwICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWJfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQ0LCAga21wX2ludDMyLCAgbXVsLCAzMiwgKiwgZnAsIF9RdWFkLCA0aSwgMywgMCApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfbXVsX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkNCwgIGttcF9pbnQzMiwgIGRpdiwgMzIsIC8sIGZwLCBfUXVhZCwgNGksIDMsIDAgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDR1LCBrbXBfdWludDMyLCBkaXYsIDMyLCAvLCBmcCwgX1F1YWQsIDRpLCAzLCAwICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X2ZwCisKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQ4LCAga21wX2ludDY0LCAgYWRkLCA2NCwgKywgZnAsIF9RdWFkLCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDhfYWRkX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkOCwgIGttcF9pbnQ2NCwgIHN1YiwgNjQsIC0sIGZwLCBfUXVhZCwgOGksIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1Yl9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDgsICBrbXBfaW50NjQsICBtdWwsIDY0LCAqLCBmcCwgX1F1YWQsIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tdWxfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQ4LCAga21wX2ludDY0LCAgZGl2LCA2NCwgLywgZnAsIF9RdWFkLCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkOHUsIGttcF91aW50NjQsIGRpdiwgNjQsIC8sIGZwLCBfUXVhZCwgOGksIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfZnAKKworQVRPTUlDX0NNUFhDSEdfTUlYKCBmbG9hdDQsICBrbXBfcmVhbDMyLCBhZGQsIDMyLCArLCBmcCwgX1F1YWQsIDRyLCAzLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGRfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZmxvYXQ0LCAga21wX3JlYWwzMiwgc3ViLCAzMiwgLSwgZnAsIF9RdWFkLCA0ciwgMywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZsb2F0NCwgIGttcF9yZWFsMzIsIG11bCwgMzIsICosIGZwLCBfUXVhZCwgNHIsIDMsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X211bF9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmbG9hdDQsICBrbXBfcmVhbDMyLCBkaXYsIDMyLCAvLCBmcCwgX1F1YWQsIDRyLCAzLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfZnAKKworQVRPTUlDX0NNUFhDSEdfTUlYKCBmbG9hdDgsICBrbXBfcmVhbDY0LCBhZGQsIDY0LCArLCBmcCwgX1F1YWQsIDhyLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGRfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZmxvYXQ4LCAga21wX3JlYWw2NCwgc3ViLCA2NCwgLSwgZnAsIF9RdWFkLCA4ciwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZsb2F0OCwgIGttcF9yZWFsNjQsIG11bCwgNjQsICosIGZwLCBfUXVhZCwgOHIsIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X211bF9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmbG9hdDgsICBrbXBfcmVhbDY0LCBkaXYsIDY0LCAvLCBmcCwgX1F1YWQsIDhyLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfZnAKKworQVRPTUlDX0NSSVRJQ0FMX0ZQKCBmbG9hdDEwLCBsb25nIGRvdWJsZSwgICAgYWRkLCArLCBmcCwgX1F1YWQsIDEwciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfYWRkX2ZwCitBVE9NSUNfQ1JJVElDQUxfRlAoIGZsb2F0MTAsIGxvbmcgZG91YmxlLCAgICBzdWIsIC0sIGZwLCBfUXVhZCwgMTByLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWJfZnAKK0FUT01JQ19DUklUSUNBTF9GUCggZmxvYXQxMCwgbG9uZyBkb3VibGUsICAgIG11bCwgKiwgZnAsIF9RdWFkLCAxMHIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX211bF9mcAorQVRPTUlDX0NSSVRJQ0FMX0ZQKCBmbG9hdDEwLCBsb25nIGRvdWJsZSwgICAgZGl2LCAvLCBmcCwgX1F1YWQsIDEwciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2X2ZwCisjZW5kaWYKKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gWDg2IG9yIFg4Nl82NDogbm8gYWxpZ25tZW50IHByb2JsZW1zID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2lmIFVTRV9DTVBYQ0hHX0ZJWAorLy8gd29ya2Fyb3VuZCBmb3IgQzc4Mjg3IChjb21wbGV4KGtpbmQ9NCkgZGF0YSB0eXBlKQorI2RlZmluZSBBVE9NSUNfQ01QWENIR19DTVBMWChUWVBFX0lELFRZUEUsT1BfSUQsQklUUyxPUCxSVFlQRV9JRCxSVFlQRSxMQ0tfSUQsTUFTSyxHT01QX0ZMQUcpIFwKK0FUT01JQ19CRUdJTl9NSVgoVFlQRV9JRCxUWVBFLE9QX0lELFJUWVBFX0lELFJUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTChPUCMjPSxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NNUFhDSEdfV09SS0FST1VORChUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKy8vIGVuZCBvZiB0aGUgc2Vjb25kIHBhcnQgb2YgdGhlIHdvcmthcm91bmQgZm9yIEM3ODI4NworI2Vsc2UKKyNkZWZpbmUgQVRPTUlDX0NNUFhDSEdfQ01QTFgoVFlQRV9JRCxUWVBFLE9QX0lELEJJVFMsT1AsUlRZUEVfSUQsUlRZUEUsTENLX0lELE1BU0ssR09NUF9GTEFHKSBcCitBVE9NSUNfQkVHSU5fTUlYKFRZUEVfSUQsVFlQRSxPUF9JRCxSVFlQRV9JRCxSVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoT1AjIz0sR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DTVBYQ0hHKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZW5kaWYgLy8gVVNFX0NNUFhDSEdfRklYCisjZWxzZQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb2RlIGZvciBvdGhlciBhcmNoaXRlY3R1cmVzIHRoYXQgZG9uJ3QgaGFuZGxlIHVuYWxpZ25lZCBhY2Nlc3Nlcy4KKyNkZWZpbmUgQVRPTUlDX0NNUFhDSEdfQ01QTFgoVFlQRV9JRCxUWVBFLE9QX0lELEJJVFMsT1AsUlRZUEVfSUQsUlRZUEUsTENLX0lELE1BU0ssR09NUF9GTEFHKSBcCitBVE9NSUNfQkVHSU5fTUlYKFRZUEVfSUQsVFlQRSxPUF9JRCxSVFlQRV9JRCxSVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoT1AjIz0sR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoICEgKCAoa21wX3VpbnRwdHJfdCkgbGhzICYgMHgjI01BU0spICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NNUFhDSEcoVFlQRSxCSVRTLE9QKSAgICAgLyogYWxpZ25lZCBhZGRyZXNzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NSSVRJQ0FMKE9QIyM9LExDS19JRCkgIC8qIHVuYWxpZ25lZCBhZGRyZXNzIC0gdXNlIGNyaXRpY2FsICovICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKK0FUT01JQ19DTVBYQ0hHX0NNUExYKCBjbXBseDQsIGttcF9jbXBseDMyLCBhZGQsIDY0LCArLCBjbXBseDgsICBrbXBfY21wbHg2NCwgIDhjLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9hZGRfY21wbHg4CitBVE9NSUNfQ01QWENIR19DTVBMWCggY21wbHg0LCBrbXBfY21wbHgzMiwgc3ViLCA2NCwgLSwgY21wbHg4LCAga21wX2NtcGx4NjQsICA4YywgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19jbXBseDRfc3ViX2NtcGx4OAorQVRPTUlDX0NNUFhDSEdfQ01QTFgoIGNtcGx4NCwga21wX2NtcGx4MzIsIG11bCwgNjQsICosIGNtcGx4OCwgIGttcF9jbXBseDY0LCAgOGMsIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfY21wbHg0X211bF9jbXBseDgKK0FUT01JQ19DTVBYQ0hHX0NNUExYKCBjbXBseDQsIGttcF9jbXBseDMyLCBkaXYsIDY0LCAvLCBjbXBseDgsICBrbXBfY21wbHg2NCwgIDhjLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXZfY21wbHg4CisKKy8vIFJFQUQsIFdSSVRFLCBDQVBUVVJFIGFyZSBzdXBwb3J0ZWQgb25seSBvbiBJQS0zMiBhcmNoaXRlY3R1cmUgYW5kIEludGVsKFIpIDY0CisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQXRvbWljIFJFQUQgcm91dGluZXMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEJlZ2lubmluZyBvZiBhIGRlZmluaXRpb24gKHByb3ZpZGVzIG5hbWUsIHBhcmFtZXRlcnMsIGdlYnVnIHRyYWNlKQorLy8gICAgIFRZUEVfSUQgLSBvcGVyYW5kcyB0eXBlIGFuZCBzaXplIChmaXhlZCosIGZpeGVkKnUgZm9yIHNpZ25lZCwgdW5zaWduZWQgZml4ZWQpCisvLyAgICAgT1BfSUQgICAtIG9wZXJhdGlvbiBpZGVudGlmaWVyIChhZGQsIHN1YiwgbXVsLCAuLi4pCisvLyAgICAgVFlQRSAgICAtIG9wZXJhbmRzJyB0eXBlCisjZGVmaW5lIEFUT01JQ19CRUdJTl9SRUFEKFRZUEVfSUQsT1BfSUQsVFlQRSwgUkVUX1RZUEUpIFwKK1JFVF9UWVBFIF9fa21wY19hdG9taWNfIyNUWVBFX0lEIyNfIyNPUF9JRCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgVFlQRSAqIGxvYyApIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLQV9UUkFDRSgxMDAsKCJfX2ttcGNfYXRvbWljXyIgI1RZUEVfSUQgIl8iICNPUF9JRCAiOiBUIyVkXG4iLCBndGlkICkpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9wZXJhdGlvbiBvbiAqbGhzLCByaHMgdXNpbmcgImNvbXBhcmVfYW5kX3N0b3JlX3JldCIgcm91dGluZQorLy8gICAgIFRZUEUgICAgLSBvcGVyYW5kcycgdHlwZQorLy8gICAgIEJJVFMgICAgLSBzaXplIGluIGJpdHMsIHVzZWQgdG8gZGlzdGluZ3Vpc2ggbG93IGxldmVsIGNhbGxzCisvLyAgICAgT1AgICAgICAtIG9wZXJhdG9yCisvLyBOb3RlOiB0ZW1wX3ZhbCBpbnRyb2R1Y2VkIGluIG9yZGVyIHRvIGZvcmNlIHRoZSBjb21waWxlciB0byByZWFkCisvLyAgICAgICAqbGhzIG9ubHkgb25jZSAody9vIGl0IHRoZSBjb21waWxlciByZWFkcyAqbGhzIHR3aWNlKQorLy8gVE9ETzogY2hlY2sgaWYgaXQgaXMgc3RpbGwgbmVjZXNzYXJ5CisvLyBSZXR1cm4gb2xkIHZhbHVlIHJlZ2FyZGxlc3Mgb2YgdGhlIHJlc3VsdCBvZiAiY29tcGFyZSAmIHN3YXAjIG9wZXJhdGlvbgorCisjZGVmaW5lIE9QX0NNUFhDSEdfUkVBRChUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUWVBFIEtNUF9BVE9NSUNfVk9MQVRJTEUgdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHVuaW9uIGZfaV91bmlvbiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIFRZUEUgZl92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAga21wX2ludCMjQklUUyBpX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdW5pb24gZl9pX3VuaW9uIG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wX3ZhbCA9ICpsb2M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG9sZF92YWx1ZS5mX3ZhbCA9IHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgb2xkX3ZhbHVlLmlfdmFsID0gS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFVCMjQklUUyggKGttcF9pbnQjI0JJVFMgKikgbG9jLCBcCisgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmb2xkX3ZhbHVlLmlfdmFsLCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICZvbGRfdmFsdWUuaV92YWwgKTsgXAorICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUuZl92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9wZXJhdGlvbiBvbiAqbGhzLCByaHMgYm91bmQgYnkgY3JpdGljYWwgc2VjdGlvbgorLy8gICAgIE9QICAgICAtIG9wZXJhdG9yIChpdCdzIHN1cHBvc2VkIHRvIGNvbnRhaW4gYW4gYXNzaWdubWVudCkKKy8vICAgICBMQ0tfSUQgLSBsb2NrIGlkZW50aWZpZXIKKy8vIE5vdGU6IGRvbid0IGNoZWNrIGd0aWQgYXMgaXQgc2hvdWxkIGFsd2F5cyBiZSB2YWxpZAorLy8gMSwgMi1ieXRlIC0gZXhwZWN0IHZhbGlkIHBhcmFtZXRlciwgb3RoZXIgLSBjaGVjayBiZWZvcmUgdGhpcyBtYWNybworI2RlZmluZSBPUF9DUklUSUNBTF9SRUFEKE9QLExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBuZXdfdmFsdWUgPSAoKmxvYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyNkZWZpbmUgT1BfR09NUF9DUklUSUNBTF9SRUFEKE9QLEZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggKEZMQUcpICYmIChfX2ttcF9hdG9taWNfbW9kZSA9PSAyKSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ1JJVElDQUxfUkVBRCggT1AsIDAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorI2Vsc2UKKyNkZWZpbmUgT1BfR09NUF9DUklUSUNBTF9SRUFEKE9QLEZMQUcpCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX0ZJWEVEX1JFQUQoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsR09NUF9GTEFHKSAgICAgICAgICAgXAorQVRPTUlDX0JFR0lOX1JFQUQoVFlQRV9JRCxPUF9JRCxUWVBFLFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFlQRSBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMX1JFQUQoT1AjIz0sR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG5ld192YWx1ZSA9IEtNUF9URVNUX1RIRU5fQUREIyNCSVRTKCBsb2MsIE9QIDAgKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX0NNUFhDSEdfUkVBRChUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxHT01QX0ZMQUcpICAgICAgICAgXAorQVRPTUlDX0JFR0lOX1JFQUQoVFlQRV9JRCxPUF9JRCxUWVBFLFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFlQRSBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMX1JFQUQoT1AjIz0sR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NNUFhDSEdfUkVBRChUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJvdXRpbmVzIGZvciBFeHRlbmRlZCB0eXBlczogbG9uZyBkb3VibGUsIF9RdWFkLCBjb21wbGV4IGZsYXZvdXJzICh1c2UgY3JpdGljYWwgc2VjdGlvbikKKy8vICAgICBUWVBFX0lELCBPUF9JRCwgVFlQRSAtIGRldGFpbGVkIGFib3ZlCisvLyAgICAgT1AgICAgICAtIG9wZXJhdG9yCisvLyAgICAgTENLX0lEICAtIGxvY2sgaWRlbnRpZmllciwgdXNlZCB0byBwb3NzaWJseSBkaXN0aW5ndWlzaCBsb2NrIHZhcmlhYmxlCisjZGVmaW5lIEFUT01JQ19DUklUSUNBTF9SRUFEKFRZUEVfSUQsT1BfSUQsVFlQRSxPUCxMQ0tfSUQsR09NUF9GTEFHKSAgICAgIFwKK0FUT01JQ19CRUdJTl9SRUFEKFRZUEVfSUQsT1BfSUQsVFlQRSxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTF9SRUFEKE9QIyM9LEdPTVBfRkxBRykgIC8qIHNlbmQgYXNzaWdubWVudCAqLyAgICAgICAgIFwKKyAgICBPUF9DUklUSUNBTF9SRUFEKE9QLExDS19JRCkgICAgICAgICAgLyogc2VuZCBhc3NpZ25tZW50ICovICAgICAgICAgICAgXAorICAgIHJldHVybiBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRml4IGZvciBjbXBseDQgcmVhZCAoQ1EyMjAzNjEpIG9uIFdpbmRvd3MqIE9TLiBSZWd1bGFyIHJvdXRpbmUgd2l0aCByZXR1cm4gdmFsdWUgZG9lc24ndCB3b3JrLgorLy8gTGV0J3MgcmV0dXJuIHRoZSByZWFkIHZhbHVlIHRocm91Z2ggdGhlIGFkZGl0aW9uYWwgcGFyYW1ldGVyLgorCisjaWYgKCBLTVBfT1NfV0lORE9XUyApCisKKyNkZWZpbmUgT1BfQ1JJVElDQUxfUkVBRF9XUksoT1AsTENLX0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCpvdXQpID0gKCpsb2MpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfUkVBRF9XUksoT1AsRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIChGTEFHKSAmJiAoX19rbXBfYXRvbWljX21vZGUgPT0gMikgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NSSVRJQ0FMX1JFQURfV1JLKCBPUCwgMCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisjZWxzZQorI2RlZmluZSBPUF9HT01QX0NSSVRJQ0FMX1JFQURfV1JLKE9QLEZMQUcpCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX0JFR0lOX1JFQURfV1JLKFRZUEVfSUQsT1BfSUQsVFlQRSkgXAordm9pZCBfX2ttcGNfYXRvbWljXyMjVFlQRV9JRCMjXyMjT1BfSUQoIFRZUEUgKiBvdXQsIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFRZUEUgKiBsb2MgKSBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS0FfVFJBQ0UoMTAwLCgiX19rbXBjX2F0b21pY18iICNUWVBFX0lEICJfIiAjT1BfSUQgIjogVCMlZFxuIiwgZ3RpZCApKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEFUT01JQ19DUklUSUNBTF9SRUFEX1dSSyhUWVBFX0lELE9QX0lELFRZUEUsT1AsTENLX0lELEdPTVBfRkxBRykgICAgICBcCitBVE9NSUNfQkVHSU5fUkVBRF9XUksoVFlQRV9JRCxPUF9JRCxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTF9SRUFEX1dSSyhPUCMjPSxHT01QX0ZMQUcpICAvKiBzZW5kIGFzc2lnbm1lbnQgKi8gICAgICAgICBcCisgICAgT1BfQ1JJVElDQUxfUkVBRF9XUksoT1AsTENLX0lEKSAgICAgICAgICAvKiBzZW5kIGFzc2lnbm1lbnQgKi8gICAgICAgICAgICBcCit9CisKKyNlbmRpZiAvLyBLTVBfT1NfV0lORE9XUworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgICAgICAgICAgICAgICAgVFlQRV9JRCxPUF9JRCwgVFlQRSwgICAgICBPUCwgR09NUF9GTEFHCitBVE9NSUNfRklYRURfUkVBRCggZml4ZWQ0LCByZCwga21wX2ludDMyLCAgMzIsICssIDAgICAgICAgICAgICApICAgICAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfcmQKK0FUT01JQ19GSVhFRF9SRUFEKCBmaXhlZDgsIHJkLCBrbXBfaW50NjQsICA2NCwgKywgS01QX0FSQ0hfWDg2ICkgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9yZAorQVRPTUlDX0NNUFhDSEdfUkVBRCggZmxvYXQ0LCByZCwga21wX3JlYWwzMiwgMzIsICssIEtNUF9BUkNIX1g4NiApICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X3JkCitBVE9NSUNfQ01QWENIR19SRUFEKCBmbG9hdDgsIHJkLCBrbXBfcmVhbDY0LCA2NCwgKywgS01QX0FSQ0hfWDg2ICkgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfcmQKKworLy8gISEhIFRPRE86IFJlbW92ZSBsb2NrIG9wZXJhdGlvbnMgZm9yICJjaGFyIiBzaW5jZSBpdCBjYW4ndCBiZSBub24tYXRvbWljCitBVE9NSUNfQ01QWENIR19SRUFEKCBmaXhlZDEsICByZCwga21wX2ludDgsICAgIDgsICssICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfcmQKK0FUT01JQ19DTVBYQ0hHX1JFQUQoIGZpeGVkMiwgIHJkLCBrbXBfaW50MTYsICAxNiwgKywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9yZAorCitBVE9NSUNfQ1JJVElDQUxfUkVBRCggZmxvYXQxMCwgcmQsIGxvbmcgZG91YmxlLCArLCAxMHIsICAgMSApICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX3JkCisjaWYgS01QX0hBVkVfUVVBRAorQVRPTUlDX0NSSVRJQ0FMX1JFQUQoIGZsb2F0MTYsIHJkLCBRVUFEX0xFR0FDWSwgKywgMTZyLCAgIDEgKSAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9yZAorI2VuZGlmIC8vIEtNUF9IQVZFX1FVQUQKKworLy8gRml4IGZvciBDUTIyMDM2MSBvbiBXaW5kb3dzKiBPUworI2lmICggS01QX09TX1dJTkRPV1MgKQorICAgIEFUT01JQ19DUklUSUNBTF9SRUFEX1dSSyggY21wbHg0LCAgcmQsIGttcF9jbXBseDMyLCArLCAgOGMsIDEgKSAgIC8vIF9fa21wY19hdG9taWNfY21wbHg0X3JkCisjZWxzZQorICAgIEFUT01JQ19DUklUSUNBTF9SRUFEKCBjbXBseDQsICByZCwga21wX2NtcGx4MzIsICssICA4YywgMSApICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg0X3JkCisjZW5kaWYKK0FUT01JQ19DUklUSUNBTF9SRUFEKCBjbXBseDgsICByZCwga21wX2NtcGx4NjQsICssIDE2YywgMSApICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4OF9yZAorQVRPTUlDX0NSSVRJQ0FMX1JFQUQoIGNtcGx4MTAsIHJkLCBrbXBfY21wbHg4MCwgKywgMjBjLCAxICkgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxMF9yZAorI2lmIEtNUF9IQVZFX1FVQUQKK0FUT01JQ19DUklUSUNBTF9SRUFEKCBjbXBseDE2LCByZCwgQ1BMWDEyOF9MRUcsICssIDMyYywgMSApICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfcmQKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgQVRPTUlDX0NSSVRJQ0FMX1JFQUQoIGZsb2F0MTYsIGExNl9yZCwgUXVhZF9hMTZfdCwgKywgMTZyLCAxICkgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYTE2X3JkCisgICAgQVRPTUlDX0NSSVRJQ0FMX1JFQUQoIGNtcGx4MTYsIGExNl9yZCwga21wX2NtcGx4MTI4X2ExNl90LCArLCAzMmMsIDEgKSAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYTE2X3JkCisjZW5kaWYKKyNlbmRpZgorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQXRvbWljIFdSSVRFIHJvdXRpbmVzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBBVE9NSUNfWENIR19XUihUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxHT01QX0ZMQUcpICAgICAgICAgICAgICBcCitBVE9NSUNfQkVHSU4oVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKE9QLEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9YQ0hHX0ZJWEVEIyNCSVRTKCBsaHMsIHJocyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX1hDSEdfRkxPQVRfV1IoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsR09NUF9GTEFHKSAgICAgICAgXAorQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTChPUCxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfWENIR19SRUFMIyNCSVRTKCBsaHMsIHJocyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT3BlcmF0aW9uIG9uICpsaHMsIHJocyB1c2luZyAiY29tcGFyZV9hbmRfc3RvcmUiIHJvdXRpbmUKKy8vICAgICBUWVBFICAgIC0gb3BlcmFuZHMnIHR5cGUKKy8vICAgICBCSVRTICAgIC0gc2l6ZSBpbiBiaXRzLCB1c2VkIHRvIGRpc3Rpbmd1aXNoIGxvdyBsZXZlbCBjYWxscworLy8gICAgIE9QICAgICAgLSBvcGVyYXRvcgorLy8gTm90ZTogdGVtcF92YWwgaW50cm9kdWNlZCBpbiBvcmRlciB0byBmb3JjZSB0aGUgY29tcGlsZXIgdG8gcmVhZAorLy8gICAgICAgKmxocyBvbmx5IG9uY2UgKHcvbyBpdCB0aGUgY29tcGlsZXIgcmVhZHMgKmxocyB0d2ljZSkKKyNkZWZpbmUgT1BfQ01QWENIR19XUihUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRZUEUgS01QX0FUT01JQ19WT0xBVElMRSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVFlQRSBvbGRfdmFsdWUsIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wX3ZhbCA9ICpsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG9sZF92YWx1ZSA9IHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbmV3X3ZhbHVlID0gcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3aGlsZSAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUSMjQklUUyggKGttcF9pbnQjI0JJVFMgKikgbGhzLCBcCisgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmb2xkX3ZhbHVlLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICZuZXdfdmFsdWUgKSApICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdGVtcF92YWwgPSAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBvbGRfdmFsdWUgPSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG5ld192YWx1ZSA9IHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEFUT01JQ19DTVBYQ0hHX1dSKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLEdPTVBfRkxBRykgICAgICAgICAgIFwKK0FUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoT1AsR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ01QWENIR19XUihUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSb3V0aW5lcyBmb3IgRXh0ZW5kZWQgdHlwZXM6IGxvbmcgZG91YmxlLCBfUXVhZCwgY29tcGxleCBmbGF2b3VycyAodXNlIGNyaXRpY2FsIHNlY3Rpb24pCisvLyAgICAgVFlQRV9JRCwgT1BfSUQsIFRZUEUgLSBkZXRhaWxlZCBhYm92ZQorLy8gICAgIE9QICAgICAgLSBvcGVyYXRvcgorLy8gICAgIExDS19JRCAgLSBsb2NrIGlkZW50aWZpZXIsIHVzZWQgdG8gcG9zc2libHkgZGlzdGluZ3Vpc2ggbG9jayB2YXJpYWJsZQorI2RlZmluZSBBVE9NSUNfQ1JJVElDQUxfV1IoVFlQRV9JRCxPUF9JRCxUWVBFLE9QLExDS19JRCxHT01QX0ZMQUcpICAgICAgICBcCitBVE9NSUNfQkVHSU4oVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKE9QLEdPTVBfRkxBRykgICAgICAgLyogc2VuZCBhc3NpZ25tZW50ICovICAgICAgICAgICAgXAorICAgIE9QX0NSSVRJQ0FMKE9QLExDS19JRCkgICAgICAgICAgICAgICAvKiBzZW5kIGFzc2lnbm1lbnQgKi8gICAgICAgICAgICBcCit9CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FUT01JQ19YQ0hHX1dSKCBmaXhlZDEsICB3ciwga21wX2ludDgsICAgIDgsID0sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfd3IKK0FUT01JQ19YQ0hHX1dSKCBmaXhlZDIsICB3ciwga21wX2ludDE2LCAgMTYsID0sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfd3IKK0FUT01JQ19YQ0hHX1dSKCBmaXhlZDQsICB3ciwga21wX2ludDMyLCAgMzIsID0sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfd3IKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgQVRPTUlDX0NNUFhDSEdfV1IoIGZpeGVkOCwgIHdyLCBrbXBfaW50NjQsICA2NCwgPSwgIEtNUF9BUkNIX1g4NiApICAgICAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfd3IKKyNlbHNlCisgICAgQVRPTUlDX1hDSEdfV1IoIGZpeGVkOCwgIHdyLCBrbXBfaW50NjQsICA2NCwgPSwgIEtNUF9BUkNIX1g4NiApICAgICAgICAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfd3IKKyNlbmRpZgorCitBVE9NSUNfWENIR19GTE9BVF9XUiggZmxvYXQ0LCB3ciwga21wX3JlYWwzMiwgMzIsID0sIEtNUF9BUkNIX1g4NiApICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfd3IKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgQVRPTUlDX0NNUFhDSEdfV1IoIGZsb2F0OCwgIHdyLCBrbXBfcmVhbDY0LCAgNjQsID0sICBLTVBfQVJDSF9YODYgKSAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfd3IKKyNlbHNlCisgICAgQVRPTUlDX1hDSEdfRkxPQVRfV1IoIGZsb2F0OCwgIHdyLCBrbXBfcmVhbDY0LCAgNjQsID0sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfd3IKKyNlbmRpZgorCitBVE9NSUNfQ1JJVElDQUxfV1IoIGZsb2F0MTAsIHdyLCBsb25nIGRvdWJsZSwgPSwgMTByLCAgIDEgKSAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF93cgorI2lmIEtNUF9IQVZFX1FVQUQKK0FUT01JQ19DUklUSUNBTF9XUiggZmxvYXQxNiwgd3IsIFFVQURfTEVHQUNZLCA9LCAxNnIsICAgMSApICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X3dyCisjZW5kaWYKK0FUT01JQ19DUklUSUNBTF9XUiggY21wbHg0LCAgd3IsIGttcF9jbXBseDMyLCA9LCAgOGMsICAgMSApICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfd3IKK0FUT01JQ19DUklUSUNBTF9XUiggY21wbHg4LCAgd3IsIGttcF9jbXBseDY0LCA9LCAxNmMsICAgMSApICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDhfd3IKK0FUT01JQ19DUklUSUNBTF9XUiggY21wbHgxMCwgd3IsIGttcF9jbXBseDgwLCA9LCAyMGMsICAgMSApICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDEwX3dyCisjaWYgS01QX0hBVkVfUVVBRAorQVRPTUlDX0NSSVRJQ0FMX1dSKCBjbXBseDE2LCB3ciwgQ1BMWDEyOF9MRUcsID0sIDMyYywgICAxICkgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfd3IKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgQVRPTUlDX0NSSVRJQ0FMX1dSKCBmbG9hdDE2LCBhMTZfd3IsIFF1YWRfYTE2X3QsICAgICAgICAgPSwgMTZyLCAxICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X2ExNl93cgorICAgIEFUT01JQ19DUklUSUNBTF9XUiggY21wbHgxNiwgYTE2X3dyLCBrbXBfY21wbHgxMjhfYTE2X3QsID0sIDMyYywgMSApIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9hMTZfd3IKKyNlbmRpZgorI2VuZGlmCisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBdG9taWMgQ0FQVFVSRSByb3V0aW5lcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEJlZ2lubmluZyBvZiBhIGRlZmluaXRpb24gKHByb3ZpZGVzIG5hbWUsIHBhcmFtZXRlcnMsIGdlYnVnIHRyYWNlKQorLy8gICAgIFRZUEVfSUQgLSBvcGVyYW5kcyB0eXBlIGFuZCBzaXplIChmaXhlZCosIGZpeGVkKnUgZm9yIHNpZ25lZCwgdW5zaWduZWQgZml4ZWQpCisvLyAgICAgT1BfSUQgICAtIG9wZXJhdGlvbiBpZGVudGlmaWVyIChhZGQsIHN1YiwgbXVsLCAuLi4pCisvLyAgICAgVFlQRSAgICAtIG9wZXJhbmRzJyB0eXBlCisjZGVmaW5lIEFUT01JQ19CRUdJTl9DUFQoVFlQRV9JRCxPUF9JRCxUWVBFLFJFVF9UWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK1JFVF9UWVBFIF9fa21wY19hdG9taWNfIyNUWVBFX0lEIyNfIyNPUF9JRCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgVFlQRSAqIGxocywgVFlQRSByaHMsIGludCBmbGFnICkgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtBX1RSQUNFKDEwMCwoIl9fa21wY19hdG9taWNfIiAjVFlQRV9JRCAiXyIgI09QX0lEICI6IFQjJWRcbiIsIGd0aWQgKSk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9wZXJhdGlvbiBvbiAqbGhzLCByaHMgYm91bmQgYnkgY3JpdGljYWwgc2VjdGlvbgorLy8gICAgIE9QICAgICAtIG9wZXJhdG9yIChpdCdzIHN1cHBvc2VkIHRvIGNvbnRhaW4gYW4gYXNzaWdubWVudCkKKy8vICAgICBMQ0tfSUQgLSBsb2NrIGlkZW50aWZpZXIKKy8vIE5vdGU6IGRvbid0IGNoZWNrIGd0aWQgYXMgaXQgc2hvdWxkIGFsd2F5cyBiZSB2YWxpZAorLy8gMSwgMi1ieXRlIC0gZXhwZWN0IHZhbGlkIHBhcmFtZXRlciwgb3RoZXIgLSBjaGVjayBiZWZvcmUgdGhpcyBtYWNybworI2RlZmluZSBPUF9DUklUSUNBTF9DUFQoT1AsTENLX0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKCBmbGFnICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgqbGhzKSBPUCByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbmV3X3ZhbHVlID0gKCpsaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5ld192YWx1ZSA9ICgqbGhzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCpsaHMpIE9QIHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsgICAgICAgICAgICAgXAorICAgIHJldHVybiBuZXdfdmFsdWU7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorI2RlZmluZSBPUF9HT01QX0NSSVRJQ0FMX0NQVChPUCxGTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAoRkxBRykgJiYgKF9fa21wX2F0b21pY19tb2RlID09IDIpICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DUklUSUNBTF9DUFQoIE9QIyM9LCAwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorI2Vsc2UKKyNkZWZpbmUgT1BfR09NUF9DUklUSUNBTF9DUFQoT1AsRkxBRykKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPcGVyYXRpb24gb24gKmxocywgcmhzIHVzaW5nICJjb21wYXJlX2FuZF9zdG9yZSIgcm91dGluZQorLy8gICAgIFRZUEUgICAgLSBvcGVyYW5kcycgdHlwZQorLy8gICAgIEJJVFMgICAgLSBzaXplIGluIGJpdHMsIHVzZWQgdG8gZGlzdGluZ3Vpc2ggbG93IGxldmVsIGNhbGxzCisvLyAgICAgT1AgICAgICAtIG9wZXJhdG9yCisvLyBOb3RlOiB0ZW1wX3ZhbCBpbnRyb2R1Y2VkIGluIG9yZGVyIHRvIGZvcmNlIHRoZSBjb21waWxlciB0byByZWFkCisvLyAgICAgICAqbGhzIG9ubHkgb25jZSAody9vIGl0IHRoZSBjb21waWxlciByZWFkcyAqbGhzIHR3aWNlKQorI2RlZmluZSBPUF9DTVBYQ0hHX0NQVChUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVFlQRSBLTVBfQVRPTUlDX1ZPTEFUSUxFIHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUWVBFIG9sZF92YWx1ZSwgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRlbXBfdmFsID0gKmxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgb2xkX3ZhbHVlID0gdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgT1AgcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHdoaWxlICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRIyNCSVRTKCAoa21wX2ludCMjQklUUyAqKSBsaHMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICZvbGRfdmFsdWUsICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQjI0JJVFMgKikgJm5ld192YWx1ZSApICkgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0ZW1wX3ZhbCA9ICpsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG9sZF92YWx1ZSA9IHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlIE9QIHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYoIGZsYWcgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBVE9NSUNfQ01QWENIR19DUFQoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsR09NUF9GTEFHKSAgICAgICAgICAgXAorQVRPTUlDX0JFR0lOX0NQVChUWVBFX0lELE9QX0lELFRZUEUsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUxfQ1BUKE9QLEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NNUFhDSEdfQ1BUKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEFUT01JQ19GSVhFRF9BRERfQ1BUKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLEdPTVBfRkxBRykgICAgICAgICBcCitBVE9NSUNfQkVHSU5fQ1BUKFRZUEVfSUQsT1BfSUQsVFlQRSxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFlQRSBvbGRfdmFsdWUsIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTF9DUFQoT1AsR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogT1AgdXNlZCBhcyBhIHNpZ24gZm9yIHN1YnRyYWN0aW9uOiAobGhzLXJocykgLS0+IChsaHMrLXJocykgKi8gICAgICBcCisgICAgb2xkX3ZhbHVlID0gS01QX1RFU1RfVEhFTl9BREQjI0JJVFMoIGxocywgT1AgcmhzICk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYoIGZsYWcgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBvbGRfdmFsdWUgT1AgcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FUT01JQ19GSVhFRF9BRERfQ1BUKCBmaXhlZDQsIGFkZF9jcHQsIGttcF9pbnQzMiwgIDMyLCArLCAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfYWRkX2NwdAorQVRPTUlDX0ZJWEVEX0FERF9DUFQoIGZpeGVkNCwgc3ViX2NwdCwga21wX2ludDMyLCAgMzIsIC0sIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWJfY3B0CitBVE9NSUNfRklYRURfQUREX0NQVCggZml4ZWQ4LCBhZGRfY3B0LCBrbXBfaW50NjQsICA2NCwgKywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X2FkZF9jcHQKK0FUT01JQ19GSVhFRF9BRERfQ1BUKCBmaXhlZDgsIHN1Yl9jcHQsIGttcF9pbnQ2NCwgIDY0LCAtLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfc3ViX2NwdAorCitBVE9NSUNfQ01QWENIR19DUFQoIGZsb2F0NCwgYWRkX2NwdCwga21wX3JlYWwzMiwgMzIsICssIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGRfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZsb2F0NCwgc3ViX2NwdCwga21wX3JlYWwzMiwgMzIsIC0sIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZsb2F0OCwgYWRkX2NwdCwga21wX3JlYWw2NCwgNjQsICssIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGRfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZsb2F0OCwgc3ViX2NwdCwga21wX3JlYWw2NCwgNjQsIC0sIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWJfY3B0CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cmllcyBkZWZpbml0aW9uIGZvciBpbnRlZ2VyIG9wZXJhbmRzCisvLyAgICAgVFlQRV9JRCAtIG9wZXJhbmRzIHR5cGUgYW5kIHNpemUgKGZpeGVkNCwgZmxvYXQ0KQorLy8gICAgIE9QX0lEICAgLSBvcGVyYXRpb24gaWRlbnRpZmllciAoYWRkLCBzdWIsIG11bCwgLi4uKQorLy8gICAgIFRZUEUgICAgLSBvcGVyYW5kIHR5cGUKKy8vICAgICBCSVRTICAgIC0gc2l6ZSBpbiBiaXRzLCB1c2VkIHRvIGRpc3Rpbmd1aXNoIGxvdyBsZXZlbCBjYWxscworLy8gICAgIE9QICAgICAgLSBvcGVyYXRvciAodXNlZCBpbiBjcml0aWNhbCBzZWN0aW9uKQorLy8gICAgICAgICAgICAgICBUWVBFX0lELE9QX0lELCAgVFlQRSwgICBCSVRTLE9QLEdPTVBfRkxBRworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSb3V0aW5lcyBmb3IgQVRPTUlDIGludGVnZXIgb3BlcmFuZHMsIG90aGVyIG9wZXJhdG9ycworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgICAgICAgICAgICAgVFlQRV9JRCxPUF9JRCwgVFlQRSwgICAgICAgICAgT1AsICBHT01QX0ZMQUcKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQxLCAgYWRkX2NwdCwga21wX2ludDgsICAgIDgsICssICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfYWRkX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDEsIGFuZGJfY3B0LCBrbXBfaW50OCwgICAgOCwgJiwgIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hbmRiX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDEsICBkaXZfY3B0LCBrbXBfaW50OCwgICAgOCwgLywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMXUsIGRpdl9jcHQsIGttcF91aW50OCwgICA4LCAvLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXZfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMSwgIG11bF9jcHQsIGttcF9pbnQ4LCAgICA4LCAqLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX211bF9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQxLCAgb3JiX2NwdCwga21wX2ludDgsICAgIDgsIHwsICAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfb3JiX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDEsICBzaGxfY3B0LCBrbXBfaW50OCwgICAgOCwgPDwsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaGxfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMSwgIHNocl9jcHQsIGttcF9pbnQ4LCAgICA4LCA+PiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3Nocl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQxdSwgc2hyX2NwdCwga21wX3VpbnQ4LCAgIDgsID4+LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDF1X3Nocl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQxLCAgc3ViX2NwdCwga21wX2ludDgsICAgIDgsIC0sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfc3ViX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDEsICB4b3JfY3B0LCBrbXBfaW50OCwgICAgOCwgXiwgIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV94b3JfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMiwgIGFkZF9jcHQsIGttcF9pbnQxNiwgIDE2LCArLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX2FkZF9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQyLCBhbmRiX2NwdCwga21wX2ludDE2LCAgMTYsICYsICAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfYW5kYl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQyLCAgZGl2X2NwdCwga21wX2ludDE2LCAgMTYsIC8sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfZGl2X2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDJ1LCBkaXZfY3B0LCBrbXBfdWludDE2LCAxNiwgLywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2X2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDIsICBtdWxfY3B0LCBrbXBfaW50MTYsICAxNiwgKiwgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tdWxfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMiwgIG9yYl9jcHQsIGttcF9pbnQxNiwgIDE2LCB8LCAgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX29yYl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQyLCAgc2hsX2NwdCwga21wX2ludDE2LCAgMTYsIDw8LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfc2hsX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDIsICBzaHJfY3B0LCBrbXBfaW50MTYsICAxNiwgPj4sIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaHJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMnUsIHNocl9jcHQsIGttcF91aW50MTYsIDE2LCA+PiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQydV9zaHJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMiwgIHN1Yl9jcHQsIGttcF9pbnQxNiwgIDE2LCAtLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQyLCAgeG9yX2NwdCwga21wX2ludDE2LCAgMTYsIF4sICAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfeG9yX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDQsIGFuZGJfY3B0LCBrbXBfaW50MzIsICAzMiwgJiwgIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hbmRiX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDQsICBkaXZfY3B0LCBrbXBfaW50MzIsICAzMiwgLywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkNHUsIGRpdl9jcHQsIGttcF91aW50MzIsIDMyLCAvLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXZfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkNCwgIG11bF9jcHQsIGttcF9pbnQzMiwgIDMyLCAqLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X211bF9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQ0LCAgb3JiX2NwdCwga21wX2ludDMyLCAgMzIsIHwsICAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfb3JiX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDQsICBzaGxfY3B0LCBrbXBfaW50MzIsICAzMiwgPDwsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaGxfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkNCwgIHNocl9jcHQsIGttcF9pbnQzMiwgIDMyLCA+PiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3Nocl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQ0dSwgc2hyX2NwdCwga21wX3VpbnQzMiwgMzIsID4+LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDR1X3Nocl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQ0LCAgeG9yX2NwdCwga21wX2ludDMyLCAgMzIsIF4sICAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfeG9yX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDgsIGFuZGJfY3B0LCBrbXBfaW50NjQsICA2NCwgJiwgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hbmRiX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDgsICBkaXZfY3B0LCBrbXBfaW50NjQsICA2NCwgLywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkOHUsIGRpdl9jcHQsIGttcF91aW50NjQsIDY0LCAvLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkOCwgIG11bF9jcHQsIGttcF9pbnQ2NCwgIDY0LCAqLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X211bF9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQ4LCAgb3JiX2NwdCwga21wX2ludDY0LCAgNjQsIHwsICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfb3JiX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDgsICBzaGxfY3B0LCBrbXBfaW50NjQsICA2NCwgPDwsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaGxfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkOCwgIHNocl9jcHQsIGttcF9pbnQ2NCwgIDY0LCA+PiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3Nocl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQ4dSwgc2hyX2NwdCwga21wX3VpbnQ2NCwgNjQsID4+LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDh1X3Nocl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQ4LCAgeG9yX2NwdCwga21wX2ludDY0LCAgNjQsIF4sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfeG9yX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmbG9hdDQsICBkaXZfY3B0LCBrbXBfcmVhbDMyLCAzMiwgLywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZsb2F0NCwgIG11bF9jcHQsIGttcF9yZWFsMzIsIDMyLCAqLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X211bF9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZmxvYXQ4LCAgZGl2X2NwdCwga21wX3JlYWw2NCwgNjQsIC8sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfZGl2X2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmbG9hdDgsICBtdWxfY3B0LCBrbXBfcmVhbDY0LCA2NCwgKiwgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tdWxfY3B0CisvLyAgICAgICAgICAgICAgVFlQRV9JRCxPUF9JRCwgVFlQRSwgICAgICAgICAgT1AsICBHT01QX0ZMQUcKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSb3V0aW5lcyBmb3IgQy9DKysgUmVkdWN0aW9uIG9wZXJhdG9ycyAmJiBhbmQgfHwKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPcGVyYXRpb24gb24gKmxocywgcmhzIGJvdW5kIGJ5IGNyaXRpY2FsIHNlY3Rpb24KKy8vICAgICBPUCAgICAgLSBvcGVyYXRvciAoaXQncyBzdXBwb3NlZCB0byBjb250YWluIGFuIGFzc2lnbm1lbnQpCisvLyAgICAgTENLX0lEIC0gbG9jayBpZGVudGlmaWVyCisvLyBOb3RlOiBkb24ndCBjaGVjayBndGlkIGFzIGl0IHNob3VsZCBhbHdheXMgYmUgdmFsaWQKKy8vIDEsIDItYnl0ZSAtIGV4cGVjdCB2YWxpZCBwYXJhbWV0ZXIsIG90aGVyIC0gY2hlY2sgYmVmb3JlIHRoaXMgbWFjcm8KKyNkZWZpbmUgT1BfQ1JJVElDQUxfTF9DUFQoT1AsTENLX0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYoIGZsYWcgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbmV3X3ZhbHVlIE9QIHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5ld192YWx1ZSA9ICgqbGhzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyNkZWZpbmUgT1BfR09NUF9DUklUSUNBTF9MX0NQVChPUCxGTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggKEZMQUcpICYmIChfX2ttcF9hdG9taWNfbW9kZSA9PSAyKSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ1JJVElDQUxfTF9DUFQoIE9QLCAwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorI2Vsc2UKKyNkZWZpbmUgT1BfR09NUF9DUklUSUNBTF9MX0NQVChPUCxGTEFHKQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE5lZWQgc2VwYXJhdGUgbWFjcm9zIGZvciAmJiwgfHwgYmVjYXVzZSB0aGVyZSBpcyBubyBjb21iaW5lZCBhc3NpZ25tZW50CisjZGVmaW5lIEFUT01JQ19DTVBYX0xfQ1BUKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLEdPTVBfRkxBRykgICAgICAgICAgIFwKK0FUT01JQ19CRUdJTl9DUFQoVFlQRV9JRCxPUF9JRCxUWVBFLFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTF9MX0NQVCggPSAqbGhzIE9QLCBHT01QX0ZMQUcgKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DTVBYQ0hHX0NQVChUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitBVE9NSUNfQ01QWF9MX0NQVCggZml4ZWQxLCBhbmRsX2NwdCwgY2hhciwgICAgICAgOCwgJiYsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hbmRsX2NwdAorQVRPTUlDX0NNUFhfTF9DUFQoIGZpeGVkMSwgIG9ybF9jcHQsIGNoYXIsICAgICAgIDgsIHx8LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfb3JsX2NwdAorQVRPTUlDX0NNUFhfTF9DUFQoIGZpeGVkMiwgYW5kbF9jcHQsIHNob3J0LCAgICAgMTYsICYmLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfYW5kbF9jcHQKK0FUT01JQ19DTVBYX0xfQ1BUKCBmaXhlZDIsICBvcmxfY3B0LCBzaG9ydCwgICAgIDE2LCB8fCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX29ybF9jcHQKK0FUT01JQ19DTVBYX0xfQ1BUKCBmaXhlZDQsIGFuZGxfY3B0LCBrbXBfaW50MzIsIDMyLCAmJiwgMCApICAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X2FuZGxfY3B0CitBVE9NSUNfQ01QWF9MX0NQVCggZml4ZWQ0LCAgb3JsX2NwdCwga21wX2ludDMyLCAzMiwgfHwsIDAgKSAgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9vcmxfY3B0CitBVE9NSUNfQ01QWF9MX0NQVCggZml4ZWQ4LCBhbmRsX2NwdCwga21wX2ludDY0LCA2NCwgJiYsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hbmRsX2NwdAorQVRPTUlDX0NNUFhfTF9DUFQoIGZpeGVkOCwgIG9ybF9jcHQsIGttcF9pbnQ2NCwgNjQsIHx8LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfb3JsX2NwdAorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJvdXRpbmVzIGZvciBGb3J0cmFuIG9wZXJhdG9ycyB0aGF0IG1hdGNoZWQgbm8gb25lIGluIEM6CisvLyBNQVgsIE1JTiwgLkVRVi4sIC5ORVFWLgorLy8gT3BlcmF0b3JzIC5BTkQuLCAuT1IuIGFyZSBjb3ZlcmVkIGJ5IF9fa21wY19hdG9taWNfKl97YW5kbCxvcmx9X2NwdAorLy8gSW50cmluc2ljcyBJQU5ELCBJT1IsIElFT1IgYXJlIGNvdmVyZWQgYnkgX19rbXBjX2F0b21pY18qX3thbmRiLG9yYix4b3J9X2NwdAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNSU4gYW5kIE1BWCBuZWVkIHNlcGFyYXRlIG1hY3JvcworLy8gT1AgLSBvcGVyYXRvciB0byBjaGVjayBpZiB3ZSBuZWVkIGFueSBhY3Rpb25zPworI2RlZmluZSBNSU5fTUFYX0NSSVRTRUNUX0NQVChPUCxMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoICpsaHMgT1AgcmhzICkgeyAgICAgICAgICAgICAgICAgLyogc3RpbGwgbmVlZCBhY3Rpb25zPyAqLyAgICAgICAgIFwKKyAgICAgICAgb2xkX3ZhbHVlID0gKmxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKmxocyA9IHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCBmbGFnICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG5ld192YWx1ZSA9IHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyNkZWZpbmUgR09NUF9NSU5fTUFYX0NSSVRTRUNUX0NQVChPUCxGTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKCBGTEFHICkgJiYgKCBfX2ttcF9hdG9taWNfbW9kZSA9PSAyICkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTUlOX01BWF9DUklUU0VDVF9DUFQoIE9QLCAwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisjZWxzZQorI2RlZmluZSBHT01QX01JTl9NQVhfQ1JJVFNFQ1RfQ1BUKE9QLEZMQUcpCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgTUlOX01BWF9DTVBYQ0hHX0NQVChUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVFlQRSBLTVBfQVRPTUlDX1ZPTEFUSUxFIHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgLypUWVBFIG9sZF92YWx1ZTsgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcF92YWwgPSAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgb2xkX3ZhbHVlID0gdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgd2hpbGUgKCBvbGRfdmFsdWUgT1AgcmhzICYmICAgICAgICAgIC8qIHN0aWxsIG5lZWQgYWN0aW9ucz8gKi8gICAgIFwKKyAgICAgICAgICAgICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUSMjQklUUyggKGttcF9pbnQjI0JJVFMgKikgbGhzLCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICZvbGRfdmFsdWUsICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICZyaHMgKSApICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHRlbXBfdmFsID0gKmxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG9sZF92YWx1ZSA9IHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYoIGZsYWcgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIDEtYnl0ZSwgMi1ieXRlIG9wZXJhbmRzIC0gdXNlIGNyaXRpY2FsIHNlY3Rpb24KKyNkZWZpbmUgTUlOX01BWF9DUklUSUNBTF9DUFQoVFlQRV9JRCxPUF9JRCxUWVBFLE9QLExDS19JRCxHT01QX0ZMQUcpICAgICAgIFwKK0FUT01JQ19CRUdJTl9DUFQoVFlQRV9JRCxPUF9JRCxUWVBFLFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFIG5ld192YWx1ZSwgb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoICpsaHMgT1AgcmhzICkgeyAgICAgLyogbmVlZCBhY3Rpb25zPyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgR09NUF9NSU5fTUFYX0NSSVRTRUNUX0NQVChPUCxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTUlOX01BWF9DUklUU0VDVF9DUFQoT1AsTENLX0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gKmxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBNSU5fTUFYX0NPTVBYQ0hHX0NQVChUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxHT01QX0ZMQUcpICAgICAgICAgXAorQVRPTUlDX0JFR0lOX0NQVChUWVBFX0lELE9QX0lELFRZUEUsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgbmV3X3ZhbHVlLCBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggKmxocyBPUCByaHMgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBHT01QX01JTl9NQVhfQ1JJVFNFQ1RfQ1BUKE9QLEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNSU5fTUFYX0NNUFhDSEdfQ1BUKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKK01JTl9NQVhfQ09NUFhDSEdfQ1BUKCBmaXhlZDEsICBtYXhfY3B0LCBjaGFyLCAgICAgICAgOCwgPCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDFfbWF4X2NwdAorTUlOX01BWF9DT01QWENIR19DUFQoIGZpeGVkMSwgIG1pbl9jcHQsIGNoYXIsICAgICAgICA4LCA+LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9taW5fY3B0CitNSU5fTUFYX0NPTVBYQ0hHX0NQVCggZml4ZWQyLCAgbWF4X2NwdCwgc2hvcnQsICAgICAgMTYsIDwsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX21heF9jcHQKK01JTl9NQVhfQ09NUFhDSEdfQ1BUKCBmaXhlZDIsICBtaW5fY3B0LCBzaG9ydCwgICAgICAxNiwgPiwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDJfbWluX2NwdAorTUlOX01BWF9DT01QWENIR19DUFQoIGZpeGVkNCwgIG1heF9jcHQsIGttcF9pbnQzMiwgIDMyLCA8LCAwICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tYXhfY3B0CitNSU5fTUFYX0NPTVBYQ0hHX0NQVCggZml4ZWQ0LCAgbWluX2NwdCwga21wX2ludDMyLCAgMzIsID4sIDAgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X21pbl9jcHQKK01JTl9NQVhfQ09NUFhDSEdfQ1BUKCBmaXhlZDgsICBtYXhfY3B0LCBrbXBfaW50NjQsICA2NCwgPCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDhfbWF4X2NwdAorTUlOX01BWF9DT01QWENIR19DUFQoIGZpeGVkOCwgIG1pbl9jcHQsIGttcF9pbnQ2NCwgIDY0LCA+LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9taW5fY3B0CitNSU5fTUFYX0NPTVBYQ0hHX0NQVCggZmxvYXQ0LCAgbWF4X2NwdCwga21wX3JlYWwzMiwgMzIsIDwsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X21heF9jcHQKK01JTl9NQVhfQ09NUFhDSEdfQ1BUKCBmbG9hdDQsICBtaW5fY3B0LCBrbXBfcmVhbDMyLCAzMiwgPiwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfbWluX2NwdAorTUlOX01BWF9DT01QWENIR19DUFQoIGZsb2F0OCwgIG1heF9jcHQsIGttcF9yZWFsNjQsIDY0LCA8LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tYXhfY3B0CitNSU5fTUFYX0NPTVBYQ0hHX0NQVCggZmxvYXQ4LCAgbWluX2NwdCwga21wX3JlYWw2NCwgNjQsID4sIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X21pbl9jcHQKKyNpZiBLTVBfSEFWRV9RVUFECitNSU5fTUFYX0NSSVRJQ0FMX0NQVCggZmxvYXQxNiwgbWF4X2NwdCwgUVVBRF9MRUdBQ1ksICAgIDwsIDE2ciwgICAxICkgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9tYXhfY3B0CitNSU5fTUFYX0NSSVRJQ0FMX0NQVCggZmxvYXQxNiwgbWluX2NwdCwgUVVBRF9MRUdBQ1ksICAgID4sIDE2ciwgICAxICkgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9taW5fY3B0CisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIE1JTl9NQVhfQ1JJVElDQUxfQ1BUKCBmbG9hdDE2LCBtYXhfYTE2X2NwdCwgUXVhZF9hMTZfdCwgPCwgMTZyLCAgMSApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWF4X2ExNl9jcHQKKyAgICBNSU5fTUFYX0NSSVRJQ0FMX0NQVCggZmxvYXQxNiwgbWluX2ExNl9jcHQsIFF1YWRfYTE2X3QsID4sIDE2ciwgIDEgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X21peF9hMTZfY3B0CisjZW5kaWYKKyNlbmRpZgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyNkZWZpbmUgT1BfR09NUF9DUklUSUNBTF9FUVZfQ1BUKE9QLEZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggKEZMQUcpICYmIChfX2ttcF9hdG9taWNfbW9kZSA9PSAyKSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ1JJVElDQUxfQ1BUKCBPUCwgMCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyNlbHNlCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfRVFWX0NQVChPUCxGTEFHKQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEFUT01JQ19DTVBYX0VRVl9DUFQoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsR09NUF9GTEFHKSAgICAgICAgIFwKK0FUT01JQ19CRUdJTl9DUFQoVFlQRV9JRCxPUF9JRCxUWVBFLFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTF9FUVZfQ1BUKF49fixHT01QX0ZMQUcpICAvKiBzZW5kIGFzc2lnbm1lbnQgKi8gICAgICAgIFwKKyAgICBPUF9DTVBYQ0hHX0NQVChUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQVRPTUlDX0NNUFhDSEdfQ1BUKCAgZml4ZWQxLCBuZXF2X2NwdCwga21wX2ludDgsICAgOCwgICBeLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9uZXF2X2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCAgZml4ZWQyLCBuZXF2X2NwdCwga21wX2ludDE2LCAxNiwgICBeLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9uZXF2X2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCAgZml4ZWQ0LCBuZXF2X2NwdCwga21wX2ludDMyLCAzMiwgICBeLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9uZXF2X2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCAgZml4ZWQ4LCBuZXF2X2NwdCwga21wX2ludDY0LCA2NCwgICBeLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9uZXF2X2NwdAorQVRPTUlDX0NNUFhfRVFWX0NQVCggZml4ZWQxLCBlcXZfY3B0LCAga21wX2ludDgsICAgOCwgIF5+LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9lcXZfY3B0CitBVE9NSUNfQ01QWF9FUVZfQ1BUKCBmaXhlZDIsIGVxdl9jcHQsICBrbXBfaW50MTYsIDE2LCAgXn4sIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX2Vxdl9jcHQKK0FUT01JQ19DTVBYX0VRVl9DUFQoIGZpeGVkNCwgZXF2X2NwdCwgIGttcF9pbnQzMiwgMzIsICBefiwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDRfZXF2X2NwdAorQVRPTUlDX0NNUFhfRVFWX0NQVCggZml4ZWQ4LCBlcXZfY3B0LCAga21wX2ludDY0LCA2NCwgIF5+LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9lcXZfY3B0CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUm91dGluZXMgZm9yIEV4dGVuZGVkIHR5cGVzOiBsb25nIGRvdWJsZSwgX1F1YWQsIGNvbXBsZXggZmxhdm91cnMgKHVzZSBjcml0aWNhbCBzZWN0aW9uKQorLy8gICAgIFRZUEVfSUQsIE9QX0lELCBUWVBFIC0gZGV0YWlsZWQgYWJvdmUKKy8vICAgICBPUCAgICAgIC0gb3BlcmF0b3IKKy8vICAgICBMQ0tfSUQgIC0gbG9jayBpZGVudGlmaWVyLCB1c2VkIHRvIHBvc3NpYmx5IGRpc3Rpbmd1aXNoIGxvY2sgdmFyaWFibGUKKyNkZWZpbmUgQVRPTUlDX0NSSVRJQ0FMX0NQVChUWVBFX0lELE9QX0lELFRZUEUsT1AsTENLX0lELEdPTVBfRkxBRykgXAorQVRPTUlDX0JFR0lOX0NQVChUWVBFX0lELE9QX0lELFRZUEUsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFlQRSBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMX0NQVChPUCxHT01QX0ZMQUcpICAvKiBzZW5kIGFzc2lnbm1lbnQgKi8gICAgICAgXAorICAgIE9QX0NSSVRJQ0FMX0NQVChPUCMjPSxMQ0tfSUQpICAgICAgICAgIC8qIHNlbmQgYXNzaWdubWVudCAqLyAgICBcCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBXb3JrYXJvdW5kIGZvciBjbXBseDQuIFJlZ3VsYXIgcm91dGluZXMgd2l0aCByZXR1cm4gdmFsdWUgZG9uJ3Qgd29yaworLy8gb24gV2luXzMyZS4gTGV0J3MgcmV0dXJuIGNhcHR1cmVkIHZhbHVlcyB0aHJvdWdoIHRoZSBhZGRpdGlvbmFsIHBhcmFtZXRlci4KKyNkZWZpbmUgT1BfQ1JJVElDQUxfQ1BUX1dSSyhPUCxMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiggZmxhZyApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKmxocykgT1AgcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgqb3V0KSA9ICgqbGhzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKm91dCkgPSAoKmxocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgqbGhzKSBPUCByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgIFwKKyAgICByZXR1cm47CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorI2RlZmluZSBPUF9HT01QX0NSSVRJQ0FMX0NQVF9XUksoT1AsRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAoRkxBRykgJiYgKF9fa21wX2F0b21pY19tb2RlID09IDIpICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DUklUSUNBTF9DUFRfV1JLKCBPUCMjPSwgMCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorI2Vsc2UKKyNkZWZpbmUgT1BfR09NUF9DUklUSUNBTF9DUFRfV1JLKE9QLEZMQUcpCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBBVE9NSUNfQkVHSU5fV1JLKFRZUEVfSUQsT1BfSUQsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit2b2lkIF9fa21wY19hdG9taWNfIyNUWVBFX0lEIyNfIyNPUF9JRCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgVFlQRSAqIGxocywgVFlQRSByaHMsIFRZUEUgKiBvdXQsIGludCBmbGFnICkgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLQV9UUkFDRSgxMDAsKCJfX2ttcGNfYXRvbWljXyIgI1RZUEVfSUQgIl8iICNPUF9JRCAiOiBUIyVkXG4iLCBndGlkICkpOworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgQVRPTUlDX0NSSVRJQ0FMX0NQVF9XUksoVFlQRV9JRCxPUF9JRCxUWVBFLE9QLExDS19JRCxHT01QX0ZMQUcpICAgXAorQVRPTUlDX0JFR0lOX1dSSyhUWVBFX0lELE9QX0lELFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTF9DUFRfV1JLKE9QLEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DUklUSUNBTF9DUFRfV1JLKE9QIyM9LExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorLy8gVGhlIGVuZCBvZiB3b3JrYXJvdW5kIGZvciBjbXBseDQKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLy8gcm91dGluZXMgZm9yIGxvbmcgZG91YmxlIHR5cGUKK0FUT01JQ19DUklUSUNBTF9DUFQoIGZsb2F0MTAsIGFkZF9jcHQsIGxvbmcgZG91YmxlLCAgICAgKywgMTByLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF9hZGRfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUKCBmbG9hdDEwLCBzdWJfY3B0LCBsb25nIGRvdWJsZSwgICAgIC0sIDEwciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVCggZmxvYXQxMCwgbXVsX2NwdCwgbG9uZyBkb3VibGUsICAgICAqLCAxMHIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX211bF9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFQoIGZsb2F0MTAsIGRpdl9jcHQsIGxvbmcgZG91YmxlLCAgICAgLywgMTByLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfY3B0CisjaWYgS01QX0hBVkVfUVVBRAorLy8gcm91dGluZXMgZm9yIF9RdWFkIHR5cGUKK0FUT01JQ19DUklUSUNBTF9DUFQoIGZsb2F0MTYsIGFkZF9jcHQsIFFVQURfTEVHQUNZLCAgICAgKywgMTZyLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9hZGRfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUKCBmbG9hdDE2LCBzdWJfY3B0LCBRVUFEX0xFR0FDWSwgICAgIC0sIDE2ciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVCggZmxvYXQxNiwgbXVsX2NwdCwgUVVBRF9MRUdBQ1ksICAgICAqLCAxNnIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X211bF9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFQoIGZsb2F0MTYsIGRpdl9jcHQsIFFVQURfTEVHQUNZLCAgICAgLywgMTZyLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfY3B0CisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIEFUT01JQ19DUklUSUNBTF9DUFQoIGZsb2F0MTYsIGFkZF9hMTZfY3B0LCBRdWFkX2ExNl90LCArLCAxNnIsICAxICkgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X2FkZF9hMTZfY3B0CisgICAgQVRPTUlDX0NSSVRJQ0FMX0NQVCggZmxvYXQxNiwgc3ViX2ExNl9jcHQsIFF1YWRfYTE2X3QsIC0sIDE2ciwgIDEgKSAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2ExNl9jcHQKKyAgICBBVE9NSUNfQ1JJVElDQUxfQ1BUKCBmbG9hdDE2LCBtdWxfYTE2X2NwdCwgUXVhZF9hMTZfdCwgKiwgMTZyLCAgMSApICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9tdWxfYTE2X2NwdAorICAgIEFUT01JQ19DUklUSUNBTF9DUFQoIGZsb2F0MTYsIGRpdl9hMTZfY3B0LCBRdWFkX2ExNl90LCAvLCAxNnIsICAxICkgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9hMTZfY3B0CisjZW5kaWYKKyNlbmRpZgorCisvLyByb3V0aW5lcyBmb3IgY29tcGxleCB0eXBlcworCisvLyBjbXBseDQgcm91dGluZXMgdG8gcmV0dXJuIHZvaWQKK0FUT01JQ19DUklUSUNBTF9DUFRfV1JLKCBjbXBseDQsICBhZGRfY3B0LCBrbXBfY21wbHgzMiwgKywgOGMsICAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg0X2FkZF9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFRfV1JLKCBjbXBseDQsICBzdWJfY3B0LCBrbXBfY21wbHgzMiwgLSwgOGMsICAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg0X3N1Yl9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFRfV1JLKCBjbXBseDQsICBtdWxfY3B0LCBrbXBfY21wbHgzMiwgKiwgOGMsICAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg0X211bF9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFRfV1JLKCBjbXBseDQsICBkaXZfY3B0LCBrbXBfY21wbHgzMiwgLywgOGMsICAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg0X2Rpdl9jcHQKKworQVRPTUlDX0NSSVRJQ0FMX0NQVCggY21wbHg4LCAgYWRkX2NwdCwga21wX2NtcGx4NjQsICssIDE2YywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4OF9hZGRfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUKCBjbXBseDgsICBzdWJfY3B0LCBrbXBfY21wbHg2NCwgLSwgMTZjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg4X3N1Yl9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFQoIGNtcGx4OCwgIG11bF9jcHQsIGttcF9jbXBseDY0LCAqLCAxNmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDhfbXVsX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVCggY21wbHg4LCAgZGl2X2NwdCwga21wX2NtcGx4NjQsIC8sIDE2YywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4OF9kaXZfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUKCBjbXBseDEwLCBhZGRfY3B0LCBrbXBfY21wbHg4MCwgKywgMjBjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxMF9hZGRfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUKCBjbXBseDEwLCBzdWJfY3B0LCBrbXBfY21wbHg4MCwgLSwgMjBjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxMF9zdWJfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUKCBjbXBseDEwLCBtdWxfY3B0LCBrbXBfY21wbHg4MCwgKiwgMjBjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxMF9tdWxfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUKCBjbXBseDEwLCBkaXZfY3B0LCBrbXBfY21wbHg4MCwgLywgMjBjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxMF9kaXZfY3B0CisjaWYgS01QX0hBVkVfUVVBRAorQVRPTUlDX0NSSVRJQ0FMX0NQVCggY21wbHgxNiwgYWRkX2NwdCwgQ1BMWDEyOF9MRUcsICssIDMyYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYWRkX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVCggY21wbHgxNiwgc3ViX2NwdCwgQ1BMWDEyOF9MRUcsIC0sIDMyYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVCggY21wbHgxNiwgbXVsX2NwdCwgQ1BMWDEyOF9MRUcsICosIDMyYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfbXVsX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVCggY21wbHgxNiwgZGl2X2NwdCwgQ1BMWDEyOF9MRUcsIC8sIDMyYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2X2NwdAorI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICBBVE9NSUNfQ1JJVElDQUxfQ1BUKCBjbXBseDE2LCBhZGRfYTE2X2NwdCwga21wX2NtcGx4MTI4X2ExNl90LCArLCAzMmMsICAgMSApICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X2FkZF9hMTZfY3B0CisgICAgQVRPTUlDX0NSSVRJQ0FMX0NQVCggY21wbHgxNiwgc3ViX2ExNl9jcHQsIGttcF9jbXBseDEyOF9hMTZfdCwgLSwgMzJjLCAgIDEgKSAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfYTE2X2NwdAorICAgIEFUT01JQ19DUklUSUNBTF9DUFQoIGNtcGx4MTYsIG11bF9hMTZfY3B0LCBrbXBfY21wbHgxMjhfYTE2X3QsICosIDMyYywgICAxICkgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfbXVsX2ExNl9jcHQKKyAgICBBVE9NSUNfQ1JJVElDQUxfQ1BUKCBjbXBseDE2LCBkaXZfYTE2X2NwdCwga21wX2NtcGx4MTI4X2ExNl90LCAvLCAzMmMsICAgMSApICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9hMTZfY3B0CisjZW5kaWYKKyNlbmRpZgorCisjaWYgT01QXzQwX0VOQUJMRUQKKworLy8gT3Blbk1QIDQuMDogdiA9IHggPSBleHByIGJpbm9wIHg7IHsgdiA9IHg7IHggPSBleHByIGJpbm9wIHg7IH0geyB4ID0gZXhwciBiaW5vcCB4OyB2ID0geDsgfSAgZm9yIG5vbi1jb21tdXRhdGl2ZSBvcGVyYXRpb25zLgorLy8gU3VwcG9ydGVkIG9ubHkgb24gSUEtMzIgYXJjaGl0ZWN0dXJlIGFuZCBJbnRlbChSKSA2NAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPcGVyYXRpb24gb24gKmxocywgcmhzIGJvdW5kIGJ5IGNyaXRpY2FsIHNlY3Rpb24KKy8vICAgICBPUCAgICAgLSBvcGVyYXRvciAoaXQncyBzdXBwb3NlZCB0byBjb250YWluIGFuIGFzc2lnbm1lbnQpCisvLyAgICAgTENLX0lEIC0gbG9jayBpZGVudGlmaWVyCisvLyBOb3RlOiBkb24ndCBjaGVjayBndGlkIGFzIGl0IHNob3VsZCBhbHdheXMgYmUgdmFsaWQKKy8vIDEsIDItYnl0ZSAtIGV4cGVjdCB2YWxpZCBwYXJhbWV0ZXIsIG90aGVyIC0gY2hlY2sgYmVmb3JlIHRoaXMgbWFjcm8KKyNkZWZpbmUgT1BfQ1JJVElDQUxfQ1BUX1JFVihPUCxMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiggZmxhZyApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAvKnRlbXBfdmFsID0gKCpsaHMpOyovXAorICAgICAgICAoKmxocykgPSAocmhzKSBPUCAoKmxocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5ld192YWx1ZSA9ICgqbGhzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuZXdfdmFsdWUgPSAoKmxocyk7XAorICAgICAgICAoKmxocykgPSAocmhzKSBPUCAoKmxocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsgICAgICAgICAgICAgXAorICAgIHJldHVybiBuZXdfdmFsdWU7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorI2RlZmluZSBPUF9HT01QX0NSSVRJQ0FMX0NQVF9SRVYoT1AsRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAoRkxBRykgJiYgKF9fa21wX2F0b21pY19tb2RlID09IDIpICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DUklUSUNBTF9DUFRfUkVWKCBPUCwgMCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorI2Vsc2UKKyNkZWZpbmUgT1BfR09NUF9DUklUSUNBTF9DUFRfUkVWKE9QLEZMQUcpCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT3BlcmF0aW9uIG9uICpsaHMsIHJocyB1c2luZyAiY29tcGFyZV9hbmRfc3RvcmUiIHJvdXRpbmUKKy8vICAgICBUWVBFICAgIC0gb3BlcmFuZHMnIHR5cGUKKy8vICAgICBCSVRTICAgIC0gc2l6ZSBpbiBiaXRzLCB1c2VkIHRvIGRpc3Rpbmd1aXNoIGxvdyBsZXZlbCBjYWxscworLy8gICAgIE9QICAgICAgLSBvcGVyYXRvcgorLy8gTm90ZTogdGVtcF92YWwgaW50cm9kdWNlZCBpbiBvcmRlciB0byBmb3JjZSB0aGUgY29tcGlsZXIgdG8gcmVhZAorLy8gICAgICAgKmxocyBvbmx5IG9uY2UgKHcvbyBpdCB0aGUgY29tcGlsZXIgcmVhZHMgKmxocyB0d2ljZSkKKyNkZWZpbmUgT1BfQ01QWENIR19DUFRfUkVWKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRZUEUgS01QX0FUT01JQ19WT0xBVElMRSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVFlQRSBvbGRfdmFsdWUsIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wX3ZhbCA9ICpsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG9sZF92YWx1ZSA9IHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbmV3X3ZhbHVlID0gcmhzIE9QIG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3aGlsZSAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUSMjQklUUyggKGttcF9pbnQjI0JJVFMgKikgbGhzLCBcCisgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmb2xkX3ZhbHVlLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICZuZXdfdmFsdWUgKSApICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdGVtcF92YWwgPSAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBvbGRfdmFsdWUgPSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG5ld192YWx1ZSA9IHJocyBPUCBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmKCBmbGFnICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICByZXR1cm4gb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX0NNUFhDSEdfQ1BUX1JFVihUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxHT01QX0ZMQUcpICAgICAgIFwKK0FUT01JQ19CRUdJTl9DUFQoVFlQRV9JRCxPUF9JRCxUWVBFLFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVFlQRSBLTVBfQVRPTUlDX1ZPTEFUSUxFIHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUxfQ1BUX1JFVihPUCxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NNUFhDSEdfQ1BUX1JFVihUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkMSwgIGRpdl9jcHRfcmV2LCBrbXBfaW50OCwgICAgOCwgLywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQxdSwgZGl2X2NwdF9yZXYsIGttcF91aW50OCwgICA4LCAvLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXZfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQxLCAgc2hsX2NwdF9yZXYsIGttcF9pbnQ4LCAgICA4LCA8PCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3NobF9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDEsICBzaHJfY3B0X3Jldiwga21wX2ludDgsICAgIDgsID4+LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfc2hyX2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkMXUsIHNocl9jcHRfcmV2LCBrbXBfdWludDgsICAgOCwgPj4sIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfc2hyX2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkMSwgIHN1Yl9jcHRfcmV2LCBrbXBfaW50OCwgICAgOCwgLSwgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWJfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQyLCAgZGl2X2NwdF9yZXYsIGttcF9pbnQxNiwgIDE2LCAvLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDJ1LCBkaXZfY3B0X3Jldiwga21wX3VpbnQxNiwgMTYsIC8sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDIsICBzaGxfY3B0X3Jldiwga21wX2ludDE2LCAgMTYsIDw8LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfc2hsX2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkMiwgIHNocl9jcHRfcmV2LCBrbXBfaW50MTYsICAxNiwgPj4sIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaHJfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQydSwgc2hyX2NwdF9yZXYsIGttcF91aW50MTYsIDE2LCA+PiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQydV9zaHJfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQyLCAgc3ViX2NwdF9yZXYsIGttcF9pbnQxNiwgIDE2LCAtLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDQsICBkaXZfY3B0X3Jldiwga21wX2ludDMyLCAgMzIsIC8sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfZGl2X2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkNHUsIGRpdl9jcHRfcmV2LCBrbXBfdWludDMyLCAzMiwgLywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkNCwgIHNobF9jcHRfcmV2LCBrbXBfaW50MzIsICAzMiwgPDwsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaGxfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQ0LCAgc2hyX2NwdF9yZXYsIGttcF9pbnQzMiwgIDMyLCA+PiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3Nocl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDR1LCBzaHJfY3B0X3Jldiwga21wX3VpbnQzMiwgMzIsID4+LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDR1X3Nocl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDQsICBzdWJfY3B0X3Jldiwga21wX2ludDMyLCAgMzIsIC0sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfc3ViX2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkOCwgIGRpdl9jcHRfcmV2LCBrbXBfaW50NjQsICA2NCwgLywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQ4dSwgZGl2X2NwdF9yZXYsIGttcF91aW50NjQsIDY0LCAvLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQ4LCAgc2hsX2NwdF9yZXYsIGttcF9pbnQ2NCwgIDY0LCA8PCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3NobF9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDgsICBzaHJfY3B0X3Jldiwga21wX2ludDY0LCAgNjQsID4+LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfc2hyX2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkOHUsIHNocl9jcHRfcmV2LCBrbXBfdWludDY0LCA2NCwgPj4sIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc2hyX2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkOCwgIHN1Yl9jcHRfcmV2LCBrbXBfaW50NjQsICA2NCwgLSwgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZmxvYXQ0LCAgZGl2X2NwdF9yZXYsIGttcF9yZWFsMzIsIDMyLCAvLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X2Rpdl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmbG9hdDQsICBzdWJfY3B0X3Jldiwga21wX3JlYWwzMiwgMzIsIC0sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZsb2F0OCwgIGRpdl9jcHRfcmV2LCBrbXBfcmVhbDY0LCA2NCwgLywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZmxvYXQ4LCAgc3ViX2NwdF9yZXYsIGttcF9yZWFsNjQsIDY0LCAtLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X3N1Yl9jcHRfcmV2CisvLyAgICAgICAgICAgICAgVFlQRV9JRCxPUF9JRCwgVFlQRSwgICAgICAgICAgT1AsICBHT01QX0ZMQUcKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJvdXRpbmVzIGZvciBFeHRlbmRlZCB0eXBlczogbG9uZyBkb3VibGUsIF9RdWFkLCBjb21wbGV4IGZsYXZvdXJzICh1c2UgY3JpdGljYWwgc2VjdGlvbikKKy8vICAgICBUWVBFX0lELCBPUF9JRCwgVFlQRSAtIGRldGFpbGVkIGFib3ZlCisvLyAgICAgT1AgICAgICAtIG9wZXJhdG9yCisvLyAgICAgTENLX0lEICAtIGxvY2sgaWRlbnRpZmllciwgdXNlZCB0byBwb3NzaWJseSBkaXN0aW5ndWlzaCBsb2NrIHZhcmlhYmxlCisjZGVmaW5lIEFUT01JQ19DUklUSUNBTF9DUFRfUkVWKFRZUEVfSUQsT1BfSUQsVFlQRSxPUCxMQ0tfSUQsR09NUF9GTEFHKSBcCitBVE9NSUNfQkVHSU5fQ1BUKFRZUEVfSUQsT1BfSUQsVFlQRSxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFlQRSBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRZUEUgS01QX0FUT01JQ19WT0xBVElMRSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKnByaW50ZigiX19rbXBfYXRvbWljX21vZGUgPSAlZFxuIiwgX19rbXBfYXRvbWljX21vZGUpOyovXAorICAgIE9QX0dPTVBfQ1JJVElDQUxfQ1BUX1JFVihPUCxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NSSVRJQ0FMX0NQVF9SRVYoT1AsTENLX0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8vIHJvdXRpbmVzIGZvciBsb25nIGRvdWJsZSB0eXBlCitBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFViggZmxvYXQxMCwgc3ViX2NwdF9yZXYsIGxvbmcgZG91YmxlLCAgICAgLSwgMTByLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWJfY3B0X3JldgorQVRPTUlDX0NSSVRJQ0FMX0NQVF9SRVYoIGZsb2F0MTAsIGRpdl9jcHRfcmV2LCBsb25nIGRvdWJsZSwgICAgIC8sIDEwciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2X2NwdF9yZXYKKyNpZiBLTVBfSEFWRV9RVUFECisvLyByb3V0aW5lcyBmb3IgX1F1YWQgdHlwZQorQVRPTUlDX0NSSVRJQ0FMX0NQVF9SRVYoIGZsb2F0MTYsIHN1Yl9jcHRfcmV2LCBRVUFEX0xFR0FDWSwgICAgIC0sIDE2ciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2NwdF9yZXYKK0FUT01JQ19DUklUSUNBTF9DUFRfUkVWKCBmbG9hdDE2LCBkaXZfY3B0X3JldiwgUVVBRF9MRUdBQ1ksICAgICAvLCAxNnIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9jcHRfcmV2CisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIEFUT01JQ19DUklUSUNBTF9DUFRfUkVWKCBmbG9hdDE2LCBzdWJfYTE2X2NwdF9yZXYsIFF1YWRfYTE2X3QsIC0sIDE2ciwgIDEgKSAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2ExNl9jcHRfcmV2CisgICAgQVRPTUlDX0NSSVRJQ0FMX0NQVF9SRVYoIGZsb2F0MTYsIGRpdl9hMTZfY3B0X3JldiwgUXVhZF9hMTZfdCwgLywgMTZyLCAgMSApICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfYTE2X2NwdF9yZXYKKyNlbmRpZgorI2VuZGlmCisKKy8vIHJvdXRpbmVzIGZvciBjb21wbGV4IHR5cGVzCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBXb3JrYXJvdW5kIGZvciBjbXBseDQuIFJlZ3VsYXIgcm91dGluZXMgd2l0aCByZXR1cm4gdmFsdWUgZG9uJ3Qgd29yaworLy8gb24gV2luXzMyZS4gTGV0J3MgcmV0dXJuIGNhcHR1cmVkIHZhbHVlcyB0aHJvdWdoIHRoZSBhZGRpdGlvbmFsIHBhcmFtZXRlci4KKyNkZWZpbmUgT1BfQ1JJVElDQUxfQ1BUX1JFVl9XUksoT1AsTENLX0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiggZmxhZyApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKmxocykgPSAocmhzKSBPUCAoKmxocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgqb3V0KSA9ICgqbGhzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKm91dCkgPSAoKmxocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgqbGhzKSA9IChyaHMpIE9QICgqbGhzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgIFwKKyAgICByZXR1cm47CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorI2RlZmluZSBPUF9HT01QX0NSSVRJQ0FMX0NQVF9SRVZfV1JLKE9QLEZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAoRkxBRykgJiYgKF9fa21wX2F0b21pY19tb2RlID09IDIpICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DUklUSUNBTF9DUFRfUkVWX1dSSyggT1AsIDAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorI2Vsc2UKKyNkZWZpbmUgT1BfR09NUF9DUklUSUNBTF9DUFRfUkVWX1dSSyhPUCxGTEFHKQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgQVRPTUlDX0NSSVRJQ0FMX0NQVF9SRVZfV1JLKFRZUEVfSUQsT1BfSUQsVFlQRSxPUCxMQ0tfSUQsR09NUF9GTEFHKSAgIFwKK0FUT01JQ19CRUdJTl9XUksoVFlQRV9JRCxPUF9JRCxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMX0NQVF9SRVZfV1JLKE9QLEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DUklUSUNBTF9DUFRfUkVWX1dSSyhPUCxMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKy8vIFRoZSBlbmQgb2Ygd29ya2Fyb3VuZCBmb3IgY21wbHg0CisKKworLy8gISEhIFRPRE86IGNoZWNrIGlmIHdlIG5lZWQgdG8gcmV0dXJuIHZvaWQgZm9yIGNtcGx4NCByb3V0aW5lcworLy8gY21wbHg0IHJvdXRpbmVzIHRvIHJldHVybiB2b2lkCitBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFVl9XUksoIGNtcGx4NCwgIHN1Yl9jcHRfcmV2LCBrbXBfY21wbHgzMiwgLSwgOGMsICAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg0X3N1Yl9jcHRfcmV2CitBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFVl9XUksoIGNtcGx4NCwgIGRpdl9jcHRfcmV2LCBrbXBfY21wbHgzMiwgLywgOGMsICAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg0X2Rpdl9jcHRfcmV2CisKK0FUT01JQ19DUklUSUNBTF9DUFRfUkVWKCBjbXBseDgsICBzdWJfY3B0X3Jldiwga21wX2NtcGx4NjQsIC0sIDE2YywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4OF9zdWJfY3B0X3JldgorQVRPTUlDX0NSSVRJQ0FMX0NQVF9SRVYoIGNtcGx4OCwgIGRpdl9jcHRfcmV2LCBrbXBfY21wbHg2NCwgLywgMTZjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg4X2Rpdl9jcHRfcmV2CitBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFViggY21wbHgxMCwgc3ViX2NwdF9yZXYsIGttcF9jbXBseDgwLCAtLCAyMGMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDEwX3N1Yl9jcHRfcmV2CitBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFViggY21wbHgxMCwgZGl2X2NwdF9yZXYsIGttcF9jbXBseDgwLCAvLCAyMGMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDEwX2Rpdl9jcHRfcmV2CisjaWYgS01QX0hBVkVfUVVBRAorQVRPTUlDX0NSSVRJQ0FMX0NQVF9SRVYoIGNtcGx4MTYsIHN1Yl9jcHRfcmV2LCBDUExYMTI4X0xFRywgLSwgMzJjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfY3B0X3JldgorQVRPTUlDX0NSSVRJQ0FMX0NQVF9SRVYoIGNtcGx4MTYsIGRpdl9jcHRfcmV2LCBDUExYMTI4X0xFRywgLywgMzJjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfY3B0X3JldgorI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICBBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFViggY21wbHgxNiwgc3ViX2ExNl9jcHRfcmV2LCBrbXBfY21wbHgxMjhfYTE2X3QsIC0sIDMyYywgICAxICkgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2ExNl9jcHRfcmV2CisgICAgQVRPTUlDX0NSSVRJQ0FMX0NQVF9SRVYoIGNtcGx4MTYsIGRpdl9hMTZfY3B0X3Jldiwga21wX2NtcGx4MTI4X2ExNl90LCAvLCAzMmMsICAgMSApICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9hMTZfY3B0X3JldgorI2VuZGlmCisjZW5kaWYKKworLy8gICBPcGVuTVAgNC4wIENhcHR1cmUtd3JpdGUgKHN3YXApOiB7diA9IHg7IHggPSBleHByO30KKworI2RlZmluZSBBVE9NSUNfQkVHSU5fU1dQKFRZUEVfSUQsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorVFlQRSBfX2ttcGNfYXRvbWljXyMjVFlQRV9JRCMjX3N3cCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgVFlQRSAqIGxocywgVFlQRSByaHMgKSAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtBX1RSQUNFKDEwMCwoIl9fa21wY19hdG9taWNfIiAjVFlQRV9JRCAiX3N3cDogVCMlZFxuIiwgZ3RpZCApKTsKKworI2RlZmluZSBDUklUSUNBTF9TV1AoTENLX0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG9sZF92YWx1ZSA9ICgqbGhzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCpsaHMpID0gcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOyAgICAgICAgICAgICBcCisgICAgcmV0dXJuIG9sZF92YWx1ZTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisjZGVmaW5lIEdPTVBfQ1JJVElDQUxfU1dQKEZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIChGTEFHKSAmJiAoX19rbXBfYXRvbWljX21vZGUgPT0gMikgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIENSSVRJQ0FMX1NXUCggMCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisjZWxzZQorI2RlZmluZSBHT01QX0NSSVRJQ0FMX1NXUChGTEFHKQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCisKKyNkZWZpbmUgQVRPTUlDX1hDSEdfU1dQKFRZUEVfSUQsVFlQRSxCSVRTLEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgXAorQVRPTUlDX0JFR0lOX1NXUChUWVBFX0lELFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFlQRSBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHT01QX0NSSVRJQ0FMX1NXUChHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG9sZF92YWx1ZSA9IEtNUF9YQ0hHX0ZJWEVEIyNCSVRTKCBsaHMsIHJocyApOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBVE9NSUNfWENIR19GTE9BVF9TV1AoVFlQRV9JRCxUWVBFLEJJVFMsR09NUF9GTEFHKSAgICAgICAgICAgICAgICBcCitBVE9NSUNfQkVHSU5fU1dQKFRZUEVfSUQsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFIG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEdPTVBfQ1JJVElDQUxfU1dQKEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgb2xkX3ZhbHVlID0gS01QX1hDSEdfUkVBTCMjQklUUyggbGhzLCByaHMgKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQ01QWENIR19TV1AoVFlQRSxCSVRTKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRZUEUgS01QX0FUT01JQ19WT0xBVElMRSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVFlQRSBvbGRfdmFsdWUsIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wX3ZhbCA9ICpsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG9sZF92YWx1ZSA9IHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbmV3X3ZhbHVlID0gcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3aGlsZSAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUSMjQklUUyggKGttcF9pbnQjI0JJVFMgKikgbGhzLCBcCisgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmb2xkX3ZhbHVlLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICZuZXdfdmFsdWUgKSApICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdGVtcF92YWwgPSAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBvbGRfdmFsdWUgPSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG5ld192YWx1ZSA9IHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX0NNUFhDSEdfU1dQKFRZUEVfSUQsVFlQRSxCSVRTLEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgXAorQVRPTUlDX0JFR0lOX1NXUChUWVBFX0lELFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFlQRSBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHT01QX0NSSVRJQ0FMX1NXUChHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIENNUFhDSEdfU1dQKFRZUEUsQklUUykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK0FUT01JQ19YQ0hHX1NXUCggZml4ZWQxLCBrbXBfaW50OCwgICAgOCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3N3cAorQVRPTUlDX1hDSEdfU1dQKCBmaXhlZDIsIGttcF9pbnQxNiwgIDE2LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfc3dwCitBVE9NSUNfWENIR19TV1AoIGZpeGVkNCwga21wX2ludDMyLCAgMzIsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zd3AKKworQVRPTUlDX1hDSEdfRkxPQVRfU1dQKCBmbG9hdDQsIGttcF9yZWFsMzIsIDMyLCBLTVBfQVJDSF9YODYgKSAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X3N3cAorCisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIEFUT01JQ19DTVBYQ0hHX1NXUCggZml4ZWQ4LCBrbXBfaW50NjQsIDY0LCBLTVBfQVJDSF9YODYgKSAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3N3cAorICAgIEFUT01JQ19DTVBYQ0hHX1NXUCggZmxvYXQ4LCBrbXBfcmVhbDY0LCA2NCwgS01QX0FSQ0hfWDg2ICkgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X3N3cAorI2Vsc2UKKyAgICBBVE9NSUNfWENIR19TV1AoICAgICAgIGZpeGVkOCwga21wX2ludDY0LCA2NCwgS01QX0FSQ0hfWDg2ICkgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zd3AKKyAgICBBVE9NSUNfWENIR19GTE9BVF9TV1AoIGZsb2F0OCwga21wX3JlYWw2NCwgNjQsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zd3AKKyNlbmRpZgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJvdXRpbmVzIGZvciBFeHRlbmRlZCB0eXBlczogbG9uZyBkb3VibGUsIF9RdWFkLCBjb21wbGV4IGZsYXZvdXJzICh1c2UgY3JpdGljYWwgc2VjdGlvbikKKyNkZWZpbmUgQVRPTUlDX0NSSVRJQ0FMX1NXUChUWVBFX0lELFRZUEUsTENLX0lELEdPTVBfRkxBRykgICAgICAgICAgICAgIFwKK0FUT01JQ19CRUdJTl9TV1AoVFlQRV9JRCxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFIG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHT01QX0NSSVRJQ0FMX1NXUChHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDUklUSUNBTF9TV1AoTENLX0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vICEhISBUT0RPOiBjaGVjayBpZiB3ZSBuZWVkIHRvIHJldHVybiB2b2lkIGZvciBjbXBseDQgcm91dGluZXMKKy8vIFdvcmthcm91bmQgZm9yIGNtcGx4NC4gUmVndWxhciByb3V0aW5lcyB3aXRoIHJldHVybiB2YWx1ZSBkb24ndCB3b3JrCisvLyBvbiBXaW5fMzJlLiBMZXQncyByZXR1cm4gY2FwdHVyZWQgdmFsdWVzIHRocm91Z2ggdGhlIGFkZGl0aW9uYWwgcGFyYW1ldGVyLgorCisjZGVmaW5lIEFUT01JQ19CRUdJTl9TV1BfV1JLKFRZUEVfSUQsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit2b2lkIF9fa21wY19hdG9taWNfIyNUWVBFX0lEIyNfc3dwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBUWVBFICogbGhzLCBUWVBFIHJocywgVFlQRSAqIG91dCApICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS0FfVFJBQ0UoMTAwLCgiX19rbXBjX2F0b21pY18iICNUWVBFX0lEICJfc3dwOiBUIyVkXG4iLCBndGlkICkpOworCisKKyNkZWZpbmUgQ1JJVElDQUxfU1dQX1dSSyhMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0bXAgPSAoKmxocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgqbGhzKSA9IChyaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCpvdXQpID0gdG1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsgICAgICAgICAgICAgXAorICAgIHJldHVybjsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyNkZWZpbmUgR09NUF9DUklUSUNBTF9TV1BfV1JLKEZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggKEZMQUcpICYmIChfX2ttcF9hdG9taWNfbW9kZSA9PSAyKSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQ1JJVElDQUxfU1dQX1dSSyggMCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyNlbHNlCisjZGVmaW5lIEdPTVBfQ1JJVElDQUxfU1dQX1dSSyhGTEFHKQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgQVRPTUlDX0NSSVRJQ0FMX1NXUF9XUksoVFlQRV9JRCwgVFlQRSxMQ0tfSUQsR09NUF9GTEFHKSAgICAgICAgICAgXAorQVRPTUlDX0JFR0lOX1NXUF9XUksoVFlQRV9JRCxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFlQRSB0bXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHT01QX0NSSVRJQ0FMX1NXUF9XUksoR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIENSSVRJQ0FMX1NXUF9XUksoTENLX0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisvLyBUaGUgZW5kIG9mIHdvcmthcm91bmQgZm9yIGNtcGx4NAorCisKK0FUT01JQ19DUklUSUNBTF9TV1AoIGZsb2F0MTAsIGxvbmcgZG91YmxlLCAxMHIsICAgMSApICAgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3dwCisjaWYgS01QX0hBVkVfUVVBRAorQVRPTUlDX0NSSVRJQ0FMX1NXUCggZmxvYXQxNiwgUVVBRF9MRUdBQ1ksIDE2ciwgICAxICkgICAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9zd3AKKyNlbmRpZgorLy8gY21wbHg0IHJvdXRpbmUgdG8gcmV0dXJuIHZvaWQKK0FUT01JQ19DUklUSUNBTF9TV1BfV1JLKCBjbXBseDQsIGttcF9jbXBseDMyLCAgOGMsICAgMSApICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9zd3AKKworLy9BVE9NSUNfQ1JJVElDQUxfU1dQKCBjbXBseDQsIGttcF9jbXBseDMyLCAgOGMsICAgMSApICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9zd3AKKworCitBVE9NSUNfQ1JJVElDQUxfU1dQKCBjbXBseDgsICBrbXBfY21wbHg2NCwgMTZjLCAgIDEgKSAgICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDhfc3dwCitBVE9NSUNfQ1JJVElDQUxfU1dQKCBjbXBseDEwLCBrbXBfY21wbHg4MCwgMjBjLCAgIDEgKSAgICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDEwX3N3cAorI2lmIEtNUF9IQVZFX1FVQUQKK0FUT01JQ19DUklUSUNBTF9TV1AoIGNtcGx4MTYsIENQTFgxMjhfTEVHLCAzMmMsICAgMSApICAgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3dwCisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIEFUT01JQ19DUklUSUNBTF9TV1AoIGZsb2F0MTZfYTE2LCBRdWFkX2ExNl90LCAgICAgICAgIDE2ciwgMSApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYTE2X3N3cAorICAgIEFUT01JQ19DUklUSUNBTF9TV1AoIGNtcGx4MTZfYTE2LCBrbXBfY21wbHgxMjhfYTE2X3QsIDMyYywgMSApICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYTE2X3N3cAorI2VuZGlmCisjZW5kaWYKKworCisvLyBFbmQgb2YgT3Blbk1QIDQuMCBDYXB0dXJlCisKKyNlbmRpZiAvL09NUF80MF9FTkFCTEVECisKKyNlbmRpZiAvL0tNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworCisjdW5kZWYgT1BfQ1JJVElDQUwKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBHZW5lcmljIGF0b21pYyByb3V0aW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkCitfX2ttcGNfYXRvbWljXzEoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHZvaWQqIGxocywgdm9pZCogcmhzLCB2b2lkICgqZikoIHZvaWQgKiwgdm9pZCAqLCB2b2lkICogKSApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKworICAgIGlmICgKKyNpZiBLTVBfQVJDSF9YODYgJiYgZGVmaW5lZChLTVBfR09NUF9DT01QQVQpCisgICAgICAgIEZBTFNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtdXN0IHVzZSBsb2NrICovCisjZWxzZQorICAgICAgICBUUlVFCisjZW5kaWYKKwkpCisgICAgeworCWttcF9pbnQ4IG9sZF92YWx1ZSwgbmV3X3ZhbHVlOworCisJb2xkX3ZhbHVlID0gKihrbXBfaW50OCAqKSBsaHM7CisJKCpmKSggJm5ld192YWx1ZSwgJm9sZF92YWx1ZSwgcmhzICk7CisKKwkvKiBUT0RPOiBTaG91bGQgdGhpcyBiZSBhY3F1aXJlIG9yIHJlbGVhc2U/ICovCisJd2hpbGUgKCAhICBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNROCAoIChrbXBfaW50OCAqKSBsaHMsCisJCSAgICAJCSooa21wX2ludDggKikgJm9sZF92YWx1ZSwgKihrbXBfaW50OCAqKSAmbmV3X3ZhbHVlICkgKQorCXsKKwkgICAgS01QX0NQVV9QQVVTRSgpOworCisJICAgIG9sZF92YWx1ZSA9ICooa21wX2ludDggKikgbGhzOworCSAgICAoKmYpKCAmbmV3X3ZhbHVlLCAmb2xkX3ZhbHVlLCByaHMgKTsKKwl9CisKKwlyZXR1cm47CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvLworICAgICAgICAvLyBBbGwgMS1ieXRlIGRhdGEgaXMgb2YgaW50ZWdlciBkYXRhIHR5cGUuCisgICAgICAgIC8vCisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICAgICAgaWYgKCBfX2ttcF9hdG9taWNfbW9kZSA9PSAyICkgeworICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKwlfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzFpLCBndGlkICk7CisKKwkoKmYpKCBsaHMsIGxocywgcmhzICk7CisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICAgICAgaWYgKCBfX2ttcF9hdG9taWNfbW9kZSA9PSAyICkgeworICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKwlfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzFpLCBndGlkICk7CisgICAgfQorfQorCit2b2lkCitfX2ttcGNfYXRvbWljXzIoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHZvaWQqIGxocywgdm9pZCogcmhzLCB2b2lkICgqZikoIHZvaWQgKiwgdm9pZCAqLCB2b2lkICogKSApCit7CisgICAgaWYgKAorI2lmIEtNUF9BUkNIX1g4NiAmJiBkZWZpbmVkKEtNUF9HT01QX0NPTVBBVCkKKyAgICAgICAgRkFMU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11c3QgdXNlIGxvY2sgKi8KKyNlbGlmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKwlUUlVFCQkJCQkvKiBubyBhbGlnbm1lbnQgcHJvYmxlbXMgKi8KKyNlbHNlCisJISAoIChrbXBfdWludHB0cl90KSBsaHMgJiAweDEpCQkvKiBtYWtlIHN1cmUgYWRkcmVzcyBpcyAyLWJ5dGUgYWxpZ25lZCAqLworI2VuZGlmCisJKQorICAgIHsKKwlrbXBfaW50MTYgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7CisKKwlvbGRfdmFsdWUgPSAqKGttcF9pbnQxNiAqKSBsaHM7CisJKCpmKSggJm5ld192YWx1ZSwgJm9sZF92YWx1ZSwgcmhzICk7CisKKwkvKiBUT0RPOiBTaG91bGQgdGhpcyBiZSBhY3F1aXJlIG9yIHJlbGVhc2U/ICovCisJd2hpbGUgKCAhICBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMTYgKCAoa21wX2ludDE2ICopIGxocywKKwkJICAgIAkJKihrbXBfaW50MTYgKikgJm9sZF92YWx1ZSwgKihrbXBfaW50MTYgKikgJm5ld192YWx1ZSApICkKKwl7CisJICAgIEtNUF9DUFVfUEFVU0UoKTsKKworCSAgICBvbGRfdmFsdWUgPSAqKGttcF9pbnQxNiAqKSBsaHM7CisJICAgICgqZikoICZuZXdfdmFsdWUsICZvbGRfdmFsdWUsIHJocyApOworCX0KKworCXJldHVybjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIEFsbCAyLWJ5dGUgZGF0YSBpcyBvZiBpbnRlZ2VyIGRhdGEgdHlwZS4KKyAgICAgICAgLy8KKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgICAgICBpZiAoIF9fa21wX2F0b21pY19tb2RlID09IDIgKSB7CisgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrLCBndGlkICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCV9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfMmksIGd0aWQgKTsKKworCSgqZikoIGxocywgbGhzLCByaHMgKTsKKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgICAgICBpZiAoIF9fa21wX2F0b21pY19tb2RlID09IDIgKSB7CisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrLCBndGlkICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCV9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfMmksIGd0aWQgKTsKKyAgICB9Cit9CisKK3ZvaWQKK19fa21wY19hdG9taWNfNCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdm9pZCogbGhzLCB2b2lkKiByaHMsIHZvaWQgKCpmKSggdm9pZCAqLCB2b2lkICosIHZvaWQgKiApICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworCisgICAgaWYgKAorICAgICAgICAvLworICAgICAgICAvLyBGSVhNRTogT24gSUEtMzIgYXJjaGl0ZWN0dXJlLCBnY2MgdXNlcyBjbXB4Y2hnIG9ubHkgZm9yIDQtYnl0ZSBpbnRzLgorICAgICAgICAvLyBHb21wIGNvbXBhdGliaWxpdHkgaXMgYnJva2VuIGlmIHRoaXMgcm91dGluZSBpcyBjYWxsZWQgZm9yIGZsb2F0cy4KKyAgICAgICAgLy8KKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisJVFJVRQkJCQkJLyogbm8gYWxpZ25tZW50IHByb2JsZW1zICovCisjZWxzZQorCSEgKCAoa21wX3VpbnRwdHJfdCkgbGhzICYgMHgzKQkJLyogbWFrZSBzdXJlIGFkZHJlc3MgaXMgNC1ieXRlIGFsaWduZWQgKi8KKyNlbmRpZgorCSkKKyAgICB7CisJa21wX2ludDMyIG9sZF92YWx1ZSwgbmV3X3ZhbHVlOworCisJb2xkX3ZhbHVlID0gKihrbXBfaW50MzIgKikgbGhzOworCSgqZikoICZuZXdfdmFsdWUsICZvbGRfdmFsdWUsIHJocyApOworCisJLyogVE9ETzogU2hvdWxkIHRoaXMgYmUgYWNxdWlyZSBvciByZWxlYXNlPyAqLworCXdoaWxlICggISAgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyICggKGttcF9pbnQzMiAqKSBsaHMsCisJCSAgICAJCSooa21wX2ludDMyICopICZvbGRfdmFsdWUsICooa21wX2ludDMyICopICZuZXdfdmFsdWUgKSApCisJeworCSAgICBLTVBfQ1BVX1BBVVNFKCk7CisKKwkgICAgb2xkX3ZhbHVlID0gKihrbXBfaW50MzIgKikgbGhzOworCSAgICAoKmYpKCAmbmV3X3ZhbHVlLCAmb2xkX3ZhbHVlLCByaHMgKTsKKwl9CisKKwlyZXR1cm47CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvLworICAgICAgICAvLyBVc2UgX19rbXBfYXRvbWljX2xvY2tfNGkgZm9yIGFsbCA0LWJ5dGUgZGF0YSwKKyAgICAgICAgLy8gZXZlbiBpZiBpdCBpc24ndCBvZiBpbnRlZ2VyIGRhdGEgdHlwZS4KKyAgICAgICAgLy8KKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgICAgICBpZiAoIF9fa21wX2F0b21pY19tb2RlID09IDIgKSB7CisgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrLCBndGlkICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCV9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfNGksIGd0aWQgKTsKKworCSgqZikoIGxocywgbGhzLCByaHMgKTsKKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgICAgICBpZiAoIF9fa21wX2F0b21pY19tb2RlID09IDIgKSB7CisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrLCBndGlkICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCV9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfNGksIGd0aWQgKTsKKyAgICB9Cit9CisKK3ZvaWQKK19fa21wY19hdG9taWNfOCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdm9pZCogbGhzLCB2b2lkKiByaHMsIHZvaWQgKCpmKSggdm9pZCAqLCB2b2lkICosIHZvaWQgKiApICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworICAgIGlmICgKKworI2lmIEtNUF9BUkNIX1g4NiAmJiBkZWZpbmVkKEtNUF9HT01QX0NPTVBBVCkKKyAgICAgICAgRkFMU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11c3QgdXNlIGxvY2sgKi8KKyNlbGlmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKwlUUlVFCQkJCQkvKiBubyBhbGlnbm1lbnQgcHJvYmxlbXMgKi8KKyNlbHNlCisJISAoIChrbXBfdWludHB0cl90KSBsaHMgJiAweDcpCQkvKiBtYWtlIHN1cmUgYWRkcmVzcyBpcyA4LWJ5dGUgYWxpZ25lZCAqLworI2VuZGlmCisJKQorICAgIHsKKwlrbXBfaW50NjQgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7CisKKwlvbGRfdmFsdWUgPSAqKGttcF9pbnQ2NCAqKSBsaHM7CisJKCpmKSggJm5ld192YWx1ZSwgJm9sZF92YWx1ZSwgcmhzICk7CisJLyogVE9ETzogU2hvdWxkIHRoaXMgYmUgYWNxdWlyZSBvciByZWxlYXNlPyAqLworCXdoaWxlICggISAgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTY0ICggKGttcF9pbnQ2NCAqKSBsaHMsCisJCQkJCSAgICAgICAqKGttcF9pbnQ2NCAqKSAmb2xkX3ZhbHVlLAorCQkJCQkgICAgICAgKihrbXBfaW50NjQgKikgJm5ld192YWx1ZSApICkKKwl7CisJICAgIEtNUF9DUFVfUEFVU0UoKTsKKworCSAgICBvbGRfdmFsdWUgPSAqKGttcF9pbnQ2NCAqKSBsaHM7CisJICAgICgqZikoICZuZXdfdmFsdWUsICZvbGRfdmFsdWUsIHJocyApOworCX0KKworCXJldHVybjsKKyAgICB9IGVsc2UgeworICAgICAgICAvLworICAgICAgICAvLyBVc2UgX19rbXBfYXRvbWljX2xvY2tfOGkgZm9yIGFsbCA4LWJ5dGUgZGF0YSwKKyAgICAgICAgLy8gZXZlbiBpZiBpdCBpc24ndCBvZiBpbnRlZ2VyIGRhdGEgdHlwZS4KKyAgICAgICAgLy8KKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgICAgICBpZiAoIF9fa21wX2F0b21pY19tb2RlID09IDIgKSB7CisgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrLCBndGlkICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCV9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfOGksIGd0aWQgKTsKKworCSgqZikoIGxocywgbGhzLCByaHMgKTsKKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgICAgICBpZiAoIF9fa21wX2F0b21pY19tb2RlID09IDIgKSB7CisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrLCBndGlkICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCV9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfOGksIGd0aWQgKTsKKyAgICB9Cit9CisKK3ZvaWQKK19fa21wY19hdG9taWNfMTAoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHZvaWQqIGxocywgdm9pZCogcmhzLCB2b2lkICgqZikoIHZvaWQgKiwgdm9pZCAqLCB2b2lkICogKSApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgIGlmICggX19rbXBfYXRvbWljX21vZGUgPT0gMiApIHsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCApOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja18xMHIsIGd0aWQgKTsKKworICAgICgqZikoIGxocywgbGhzLCByaHMgKTsKKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgIGlmICggX19rbXBfYXRvbWljX21vZGUgPT0gMiApIHsKKyAgICAgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCApOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja18xMHIsIGd0aWQgKTsKK30KKwordm9pZAorX19rbXBjX2F0b21pY18xNiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdm9pZCogbGhzLCB2b2lkKiByaHMsIHZvaWQgKCpmKSggdm9pZCAqLCB2b2lkICosIHZvaWQgKiApICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgaWYgKCBfX2ttcF9hdG9taWNfbW9kZSA9PSAyICkgeworICAgICAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrLCBndGlkICk7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKyAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzE2YywgZ3RpZCApOworCisgICAgKCpmKSggbGhzLCBsaHMsIHJocyApOworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgaWYgKCBfX2ttcF9hdG9taWNfbW9kZSA9PSAyICkgeworICAgICAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrLCBndGlkICk7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKyAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzE2YywgZ3RpZCApOworfQorCit2b2lkCitfX2ttcGNfYXRvbWljXzIwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB2b2lkKiBsaHMsIHZvaWQqIHJocywgdm9pZCAoKmYpKCB2b2lkICosIHZvaWQgKiwgdm9pZCAqICkgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICBpZiAoIF9fa21wX2F0b21pY19tb2RlID09IDIgKSB7CisgICAgICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2ssIGd0aWQgKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfMjBjLCBndGlkICk7CisKKyAgICAoKmYpKCBsaHMsIGxocywgcmhzICk7CisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICBpZiAoIF9fa21wX2F0b21pY19tb2RlID09IDIgKSB7CisgICAgICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2ssIGd0aWQgKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfMjBjLCBndGlkICk7Cit9CisKK3ZvaWQKK19fa21wY19hdG9taWNfMzIoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHZvaWQqIGxocywgdm9pZCogcmhzLCB2b2lkICgqZikoIHZvaWQgKiwgdm9pZCAqLCB2b2lkICogKSApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgIGlmICggX19rbXBfYXRvbWljX21vZGUgPT0gMiApIHsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCApOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja18zMmMsIGd0aWQgKTsKKworICAgICgqZikoIGxocywgbGhzLCByaHMgKTsKKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgIGlmICggX19rbXBfYXRvbWljX21vZGUgPT0gMiApIHsKKyAgICAgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCApOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja18zMmMsIGd0aWQgKTsKK30KKworLy8gQUM6IHNhbWUgdHdvIHJvdXRpbmVzIGFzIEdPTVBfYXRvbWljX3N0YXJ0L2VuZCwgYnV0IHdpbGwgYmUgY2FsbGVkIGJ5IG91ciBjb21waWxlcgorLy8gICAgIGR1cGxpY2F0ZWQgaW4gb3JkZXIgdG8gbm90IHVzZSAzLXBhcnR5IG5hbWVzIGluIHB1cmUgSW50ZWwgY29kZQorLy8gVE9ETzogY29uc2lkZXIgYWRkaW5nIEdUSUQgcGFyYW1ldGVyIGFmdGVyIGNvbnN1bHRhdGlvbiB3aXRoIEVybmVzdG8vWGlubWluLgordm9pZAorX19rbXBjX2F0b21pY19zdGFydCh2b2lkKQoreworICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wY19hdG9taWNfc3RhcnQ6IFQjJWRcbiIsIGd0aWQpKTsKKyAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCZfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCk7Cit9CisKKwordm9pZAorX19rbXBjX2F0b21pY19lbmQodm9pZCkKK3sKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7CisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBjX2F0b21pY19lbmQ6IFQjJWRcbiIsIGd0aWQpKTsKKyAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCZfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiEKK0B9CisqLworCisvLyBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2F0b21pYy5oIGIvZmluYWwvcnVudGltZS9zcmMva21wX2F0b21pYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZmVhZTIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfYXRvbWljLmgKQEAgLTAsMCArMSwxMDM4IEBACisvKgorICoga21wX2F0b21pYy5oIC0gQVRPTUlDIGhlYWRlciBmaWxlCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX0FUT01JQ19ICisjZGVmaW5lIEtNUF9BVE9NSUNfSAorCisjaW5jbHVkZSAia21wX29zLmgiCisjaW5jbHVkZSAia21wX2xvY2suaCIKKworI2lmIE9NUFRfU1VQUE9SVAorI2luY2x1ZGUgIm9tcHQtc3BlY2lmaWMuaCIKKyNlbmRpZgorCisvLyBDKysgYnVpbGQgcG9ydC4KKy8vIEludGVsIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgX0NvbXBsZXggZGF0YXR5cGUgb24gd2luLgorLy8gSW50ZWwgY29tcGlsZXIgc3VwcG9ydHMgX0NvbXBsZXggZGF0YXR5cGUgb24gbGluIGFuZCBtYWMuCisvLyBPbiB0aGUgb3RoZXIgc2lkZSwgdGhlcmUgaXMgYSBwcm9ibGVtIG9mIHN0YWNrIGFsaWdubWVudCBvbiBsaW5fMzIgYW5kIG1hY18zMgorLy8gaWYgdGhlIHJocyBpcyBjbXBseDgwIG9yIGNtcGx4MTI4IHR5cGVkZWYnZWQgZGF0YXR5cGUuCisvLyBUaGUgZGVjaXNpb24gaXM6IHRvIHVzZSBjb21waWxlciBzdXBwb3J0ZWQgX0NvbXBsZXggdHlwZSBvbiBsaW4gYW5kIG1hYywKKy8vICAgICAgICAgICAgICAgICAgdG8gdXNlIHR5cGVkZWYnZWQgdHlwZXMgb24gd2luLgorLy8gQ29uZGl0aW9uIGZvciBXSU42NCB3YXMgbW9kaWZpZWQgaW4gYW50aWNpcGF0aW9uIG9mIDEwLjEgYnVpbGQgY29tcGlsZXIuCisKKyNpZiBkZWZpbmVkKCBfX2NwbHVzcGx1cyApICYmICggS01QX09TX1dJTkRPV1MgKQorICAgIC8vIGNyZWF0ZSBzaG9ydGN1dHMgZm9yIGM5OSBjb21wbGV4IHR5cGVzCisKKyAgICAjaWYgKF9NU0NfVkVSIDwgMTYwMCkgJiYgZGVmaW5lZChfREVCVUcpCisgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIHRoZSBwcm9ibGVtIG9mIF9EZWJ1Z0hlYXBUYWcgdW5yZXNvbHZlZCBleHRlcm5hbC4KKyAgICAgICAgLy8gVGhpcyBwcm9ibGVtIHByZXZlbnRlZCB0byB1c2Ugb3VyIHN0YXRpYyBkZWJ1ZyBsaWJyYXJ5IGZvciBDIHRlc3RzCisgICAgICAgIC8vIGNvbXBpbGVkIHdpdGggL01EZCBvcHRpb24gKHRoZSBsaWJyYXJ5IGl0c2VsZiBidWlsdCB3aXRoIC9NVGQpLAorICAgICAgICAjdW5kZWYgX0RFQlVHCisgICAgICAgICNkZWZpbmUgX0RFQlVHX1RFTVBPUkFSSUxZX1VOU0VUXworICAgICNlbmRpZgorCisgICAgI2luY2x1ZGUgPGNvbXBsZXg+CisKKyAgICB0ZW1wbGF0ZTwgdHlwZW5hbWUgdHlwZV9saHMsIHR5cGVuYW1lIHR5cGVfcmhzID4KKyAgICBzdGQ6OmNvbXBsZXg8IHR5cGVfbGhzID4gX19rbXBfbGhzX2Rpdl9yaHMoCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpjb21wbGV4PCB0eXBlX2xocyA+JiBsaHMsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpjb21wbGV4PCB0eXBlX3JocyA+JiByaHMgKSB7CisgICAgdHlwZV9saHMgYSA9IGxocy5yZWFsKCk7CisgICAgdHlwZV9saHMgYiA9IGxocy5pbWFnKCk7CisgICAgdHlwZV9yaHMgYyA9IHJocy5yZWFsKCk7CisgICAgdHlwZV9yaHMgZCA9IHJocy5pbWFnKCk7CisgICAgdHlwZV9yaHMgZGVuID0gYypjICsgZCpkOworICAgIHR5cGVfcmhzIHIgPSAoIGEqYyArIGIqZCApOworICAgIHR5cGVfcmhzIGkgPSAoIGIqYyAtIGEqZCApOworICAgIHN0ZDo6Y29tcGxleDwgdHlwZV9saHMgPiByZXQoIHIvZGVuLCBpL2RlbiApOworICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLy8gY29tcGxleDgKKyAgICBzdHJ1Y3QgX19rbXBfY21wbHg2NF90IDogc3RkOjpjb21wbGV4PCBkb3VibGUgPiB7CisKKyAgICBfX2ttcF9jbXBseDY0X3QoKSA6IHN0ZDo6Y29tcGxleDwgZG91YmxlID4gKCkge30KKworICAgIF9fa21wX2NtcGx4NjRfdCggY29uc3Qgc3RkOjpjb21wbGV4PCBkb3VibGUgPiYgY2QgKQorICAgICAgICAgICAgICAgIDogc3RkOjpjb21wbGV4PCBkb3VibGUgPiAoIGNkICkge30KKworICAgIHZvaWQgb3BlcmF0b3IgLz0gKCBjb25zdCBfX2ttcF9jbXBseDY0X3QmIHJocyApIHsKKyAgICAgICAgc3RkOjpjb21wbGV4PCBkb3VibGUgPiBsaHMgPSAqdGhpczsKKyAgICAgICAgKnRoaXMgPSBfX2ttcF9saHNfZGl2X3JocyggbGhzLCByaHMgKTsKKyAgICB9CisKKyAgICBfX2ttcF9jbXBseDY0X3Qgb3BlcmF0b3IgLyAoIGNvbnN0IF9fa21wX2NtcGx4NjRfdCYgcmhzICkgeworICAgICAgICBzdGQ6OmNvbXBsZXg8IGRvdWJsZSA+IGxocyA9ICp0aGlzOworICAgICAgICByZXR1cm4gX19rbXBfbGhzX2Rpdl9yaHMoIGxocywgcmhzICk7CisgICAgfQorCisgICAgfTsKKyAgICB0eXBlZGVmIHN0cnVjdCBfX2ttcF9jbXBseDY0X3Qga21wX2NtcGx4NjQ7CisKKyAgICAvLyBjb21wbGV4NAorICAgIHN0cnVjdCBfX2ttcF9jbXBseDMyX3QgOiBzdGQ6OmNvbXBsZXg8IGZsb2F0ID4geworCisgICAgX19rbXBfY21wbHgzMl90KCkgOiBzdGQ6OmNvbXBsZXg8IGZsb2F0ID4gKCkge30KKworICAgIF9fa21wX2NtcGx4MzJfdCggY29uc3Qgc3RkOjpjb21wbGV4PGZsb2F0PiYgY2YgKQorICAgICAgICAgICAgICAgIDogc3RkOjpjb21wbGV4PCBmbG9hdCA+ICggY2YgKSB7fQorCisgICAgX19rbXBfY21wbHgzMl90IG9wZXJhdG9yICsgKCBjb25zdCBfX2ttcF9jbXBseDMyX3QmIGIgKSB7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgZmxvYXQgPiBsaHMgPSAqdGhpczsKKyAgICAgICAgc3RkOjpjb21wbGV4PCBmbG9hdCA+IHJocyA9IGI7CisgICAgICAgIHJldHVybiAoIGxocyArIHJocyApOworICAgIH0KKyAgICBfX2ttcF9jbXBseDMyX3Qgb3BlcmF0b3IgLSAoIGNvbnN0IF9fa21wX2NtcGx4MzJfdCYgYiApIHsKKyAgICAgICAgc3RkOjpjb21wbGV4PCBmbG9hdCA+IGxocyA9ICp0aGlzOworICAgICAgICBzdGQ6OmNvbXBsZXg8IGZsb2F0ID4gcmhzID0gYjsKKyAgICAgICAgcmV0dXJuICggbGhzIC0gcmhzICk7CisgICAgfQorICAgIF9fa21wX2NtcGx4MzJfdCBvcGVyYXRvciAqICggY29uc3QgX19rbXBfY21wbHgzMl90JiBiICkgeworICAgICAgICBzdGQ6OmNvbXBsZXg8IGZsb2F0ID4gbGhzID0gKnRoaXM7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgZmxvYXQgPiByaHMgPSBiOworICAgICAgICByZXR1cm4gKCBsaHMgKiByaHMgKTsKKyAgICB9CisKKyAgICBfX2ttcF9jbXBseDMyX3Qgb3BlcmF0b3IgKyAoIGNvbnN0IGttcF9jbXBseDY0JiBiICkgeworICAgICAgICBrbXBfY21wbHg2NCB0ID0ga21wX2NtcGx4NjQoICp0aGlzICkgKyBiOworICAgICAgICBzdGQ6OmNvbXBsZXg8IGRvdWJsZSA+IGQoIHQgKTsKKyAgICAgICAgc3RkOjpjb21wbGV4PCBmbG9hdCA+IGYoIGQgKTsKKyAgICAgICAgX19rbXBfY21wbHgzMl90IHIoIGYgKTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorICAgIF9fa21wX2NtcGx4MzJfdCBvcGVyYXRvciAtICggY29uc3Qga21wX2NtcGx4NjQmIGIgKSB7CisgICAgICAgIGttcF9jbXBseDY0IHQgPSBrbXBfY21wbHg2NCggKnRoaXMgKSAtIGI7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgZG91YmxlID4gZCggdCApOworICAgICAgICBzdGQ6OmNvbXBsZXg8IGZsb2F0ID4gZiggZCApOworICAgICAgICBfX2ttcF9jbXBseDMyX3QgciggZiApOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisgICAgX19rbXBfY21wbHgzMl90IG9wZXJhdG9yICogKCBjb25zdCBrbXBfY21wbHg2NCYgYiApIHsKKyAgICAgICAga21wX2NtcGx4NjQgdCA9IGttcF9jbXBseDY0KCAqdGhpcyApICogYjsKKyAgICAgICAgc3RkOjpjb21wbGV4PCBkb3VibGUgPiBkKCB0ICk7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgZmxvYXQgPiBmKCBkICk7CisgICAgICAgIF9fa21wX2NtcGx4MzJfdCByKCBmICk7CisgICAgICAgIHJldHVybiByOworICAgIH0KKworICAgIHZvaWQgb3BlcmF0b3IgLz0gKCBjb25zdCBfX2ttcF9jbXBseDMyX3QmIHJocyApIHsKKyAgICAgICAgc3RkOjpjb21wbGV4PCBmbG9hdCA+IGxocyA9ICp0aGlzOworICAgICAgICAqdGhpcyA9IF9fa21wX2xoc19kaXZfcmhzKCBsaHMsIHJocyApOworICAgIH0KKworICAgIF9fa21wX2NtcGx4MzJfdCBvcGVyYXRvciAvICggY29uc3QgX19rbXBfY21wbHgzMl90JiByaHMgKSB7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgZmxvYXQgPiBsaHMgPSAqdGhpczsKKyAgICAgICAgcmV0dXJuIF9fa21wX2xoc19kaXZfcmhzKCBsaHMsIHJocyApOworICAgIH0KKworICAgIHZvaWQgb3BlcmF0b3IgLz0gKCBjb25zdCBrbXBfY21wbHg2NCYgcmhzICkgeworICAgICAgICBzdGQ6OmNvbXBsZXg8IGZsb2F0ID4gbGhzID0gKnRoaXM7CisgICAgICAgICp0aGlzID0gX19rbXBfbGhzX2Rpdl9yaHMoIGxocywgcmhzICk7CisgICAgfQorCisgICAgX19rbXBfY21wbHgzMl90IG9wZXJhdG9yIC8gKCBjb25zdCBrbXBfY21wbHg2NCYgcmhzICkgeworICAgICAgICBzdGQ6OmNvbXBsZXg8IGZsb2F0ID4gbGhzID0gKnRoaXM7CisgICAgICAgIHJldHVybiBfX2ttcF9saHNfZGl2X3JocyggbGhzLCByaHMgKTsKKyAgICB9CisgICAgfTsKKyAgICB0eXBlZGVmIHN0cnVjdCBfX2ttcF9jbXBseDMyX3Qga21wX2NtcGx4MzI7CisKKyAgICAvLyBjb21wbGV4MTAKKyAgICBzdHJ1Y3QgS01QX0RPX0FMSUdOKCAxNiApICBfX2ttcF9jbXBseDgwX3QgOiBzdGQ6OmNvbXBsZXg8IGxvbmcgZG91YmxlID4geworCisgICAgICAgICAgICBfX2ttcF9jbXBseDgwX3QoKSA6IHN0ZDo6Y29tcGxleDwgbG9uZyBkb3VibGUgPiAoKSB7fQorCisgICAgICAgICAgICBfX2ttcF9jbXBseDgwX3QoIGNvbnN0IHN0ZDo6Y29tcGxleDwgbG9uZyBkb3VibGUgPiYgY2xkICkKKyAgICAgICAgICAgICAgICA6IHN0ZDo6Y29tcGxleDwgbG9uZyBkb3VibGUgPiAoIGNsZCApIHt9CisKKyAgICAgICAgdm9pZCBvcGVyYXRvciAvPSAoIGNvbnN0IF9fa21wX2NtcGx4ODBfdCYgcmhzICkgeworICAgICAgICBzdGQ6OmNvbXBsZXg8IGxvbmcgZG91YmxlID4gbGhzID0gKnRoaXM7CisgICAgICAgICp0aGlzID0gX19rbXBfbGhzX2Rpdl9yaHMoIGxocywgcmhzICk7CisgICAgICAgIH0KKworICAgICAgICBfX2ttcF9jbXBseDgwX3Qgb3BlcmF0b3IgLyAoIGNvbnN0IF9fa21wX2NtcGx4ODBfdCYgcmhzICkgeworICAgICAgICBzdGQ6OmNvbXBsZXg8IGxvbmcgZG91YmxlID4gbGhzID0gKnRoaXM7CisgICAgICAgIHJldHVybiBfX2ttcF9saHNfZGl2X3JocyggbGhzLCByaHMgKTsKKyAgICAgICAgfQorCisgICAgfTsKKyAgICB0eXBlZGVmIEtNUF9ET19BTElHTiggMTYgKSAgc3RydWN0IF9fa21wX2NtcGx4ODBfdCBrbXBfY21wbHg4MDsKKworICAgIC8vIGNvbXBsZXgxNgorICAgICNpZiBLTVBfSEFWRV9RVUFECisgICAgc3RydWN0IF9fa21wX2NtcGx4MTI4X3QgOiBzdGQ6OmNvbXBsZXg8IF9RdWFkID4geworCisgICAgICAgICAgICBfX2ttcF9jbXBseDEyOF90KCkgOiBzdGQ6OmNvbXBsZXg8IF9RdWFkID4gKCkge30KKworICAgICAgICAgICAgX19rbXBfY21wbHgxMjhfdCggY29uc3Qgc3RkOjpjb21wbGV4PCBfUXVhZCA+JiBjcSApCisgICAgICAgICAgICAgICAgOiBzdGQ6OmNvbXBsZXg8IF9RdWFkID4gKCBjcSApIHt9CisKKyAgICAgICAgdm9pZCBvcGVyYXRvciAvPSAoIGNvbnN0IF9fa21wX2NtcGx4MTI4X3QmIHJocyApIHsKKyAgICAgICAgc3RkOjpjb21wbGV4PCBfUXVhZCA+IGxocyA9ICp0aGlzOworICAgICAgICAqdGhpcyA9IF9fa21wX2xoc19kaXZfcmhzKCBsaHMsIHJocyApOworICAgICAgICB9CisKKyAgICAgICAgX19rbXBfY21wbHgxMjhfdCBvcGVyYXRvciAvICggY29uc3QgX19rbXBfY21wbHgxMjhfdCYgcmhzICkgeworICAgICAgICBzdGQ6OmNvbXBsZXg8IF9RdWFkID4gbGhzID0gKnRoaXM7CisgICAgICAgIHJldHVybiBfX2ttcF9saHNfZGl2X3JocyggbGhzLCByaHMgKTsKKyAgICAgICAgfQorCisgICAgfTsKKyAgICB0eXBlZGVmIHN0cnVjdCBfX2ttcF9jbXBseDEyOF90IGttcF9jbXBseDEyODsKKyAgICAjZW5kaWYgLyogS01QX0hBVkVfUVVBRCAqLworCisgICAgI2lmZGVmIF9ERUJVR19URU1QT1JBUklMWV9VTlNFVF8KKyAgICAgICAgI3VuZGVmIF9ERUJVR19URU1QT1JBUklMWV9VTlNFVF8KKyAgICAgICAgLy8gU2V0IGl0IGJhY2sgbm93CisgICAgICAgICNkZWZpbmUgX0RFQlVHIDEKKyAgICAjZW5kaWYKKworI2Vsc2UKKyAgICAvLyBjcmVhdGUgc2hvcnRjdXRzIGZvciBjOTkgY29tcGxleCB0eXBlcworICAgIHR5cGVkZWYgZmxvYXQgX0NvbXBsZXggICAgICAga21wX2NtcGx4MzI7CisgICAgdHlwZWRlZiBkb3VibGUgX0NvbXBsZXggICAgICBrbXBfY21wbHg2NDsKKyAgICB0eXBlZGVmIGxvbmcgZG91YmxlIF9Db21wbGV4IGttcF9jbXBseDgwOworICAgICNpZiBLTVBfSEFWRV9RVUFECisgICAgdHlwZWRlZiBfUXVhZCBfQ29tcGxleCAgICAgICBrbXBfY21wbHgxMjg7CisgICAgI2VuZGlmCisjZW5kaWYKKworLy8gQ29tcGlsZXIgMTIuMCBjaGFuZ2VkIGFsaWdubWVudCBvZiAxNiBhbmQgMzItYnl0ZSBhcmd1bWVudHMgKGxpa2UgX1F1YWQKKy8vIGFuZCBrbXBfY21wbHgxMjgpIG9uIElBLTMyIGFyY2hpdGVjdHVyZS4gVGhlIGZvbGxvd2luZyBhbGlnbmVkIHN0cnVjdHVyZXMKKy8vIGFyZSBpbXBsZW1lbnRlZCB0byBzdXBwb3J0IHRoZSBvbGQgYWxpZ25tZW50IGluIDEwLjEsIDExLjAsIDExLjEgYW5kIAorLy8gaW50cm9kdWNlIHRoZSBuZXcgYWxpZ25tZW50IGluIDEyLjAuIFNlZSBDUTg4NDA1LgorI2lmIEtNUF9BUkNIX1g4NiAmJiBLTVBfSEFWRV9RVUFECisKKyAgICAvLyA0LWJ5dGUgYWxpZ25lZCBzdHJ1Y3R1cmVzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorCisgICAgI3ByYWdtYSBwYWNrKCBwdXNoLCA0ICkKKworICAgIAorICAgIHN0cnVjdCBLTVBfRE9fQUxJR04oIDQgKSBRdWFkX2E0X3QgeworICAgICAgICBfUXVhZCBxOworCisgICAgICAgIFF1YWRfYTRfdCggICkgOiBxKCAgKSB7fQorICAgICAgICBRdWFkX2E0X3QoIGNvbnN0IF9RdWFkICYgY3EgKSA6IHEgKCBjcSApIHt9CisKKyAgICAgICAgUXVhZF9hNF90IG9wZXJhdG9yICsgKCBjb25zdCBRdWFkX2E0X3QmIGIgKSB7CisgICAgICAgIF9RdWFkIGxocyA9ICgqdGhpcykucTsKKyAgICAgICAgX1F1YWQgcmhzID0gYi5xOworICAgICAgICByZXR1cm4gKFF1YWRfYTRfdCkoIGxocyArIHJocyApOworICAgIH0KKworICAgIFF1YWRfYTRfdCBvcGVyYXRvciAtICggY29uc3QgUXVhZF9hNF90JiBiICkgeworICAgICAgICBfUXVhZCBsaHMgPSAoKnRoaXMpLnE7CisgICAgICAgIF9RdWFkIHJocyA9IGIucTsKKyAgICAgICAgcmV0dXJuIChRdWFkX2E0X3QpKCBsaHMgLSByaHMgKTsKKyAgICB9CisgICAgUXVhZF9hNF90IG9wZXJhdG9yICogKCBjb25zdCBRdWFkX2E0X3QmIGIgKSB7CisgICAgICAgIF9RdWFkIGxocyA9ICgqdGhpcykucTsKKyAgICAgICAgX1F1YWQgcmhzID0gYi5xOworICAgICAgICByZXR1cm4gKFF1YWRfYTRfdCkoIGxocyAqIHJocyApOworICAgIH0KKworICAgIFF1YWRfYTRfdCBvcGVyYXRvciAvICggY29uc3QgUXVhZF9hNF90JiBiICkgeworICAgICAgICBfUXVhZCBsaHMgPSAoKnRoaXMpLnE7CisgICAgICAgICAgICBfUXVhZCByaHMgPSBiLnE7CisgICAgICAgIHJldHVybiAoUXVhZF9hNF90KSggbGhzIC8gcmhzICk7CisgICAgfQorCisgICAgfTsKKworICAgIHN0cnVjdCBLTVBfRE9fQUxJR04oIDQgKSBrbXBfY21wbHgxMjhfYTRfdCB7CisgICAgICAgIGttcF9jbXBseDEyOCBxOworCisgICAga21wX2NtcGx4MTI4X2E0X3QoKSA6IHEgKCkge30KKworICAgIGttcF9jbXBseDEyOF9hNF90KCBjb25zdCBrbXBfY21wbHgxMjggJiBjMTI4ICkgOiBxICggYzEyOCApIHt9CisKKyAgICAgICAga21wX2NtcGx4MTI4X2E0X3Qgb3BlcmF0b3IgKyAoIGNvbnN0IGttcF9jbXBseDEyOF9hNF90JiBiICkgeworICAgICAgICBrbXBfY21wbHgxMjggbGhzID0gKCp0aGlzKS5xOworICAgICAgICBrbXBfY21wbHgxMjggcmhzID0gYi5xOworICAgICAgICByZXR1cm4gKGttcF9jbXBseDEyOF9hNF90KSggbGhzICsgcmhzICk7CisgICAgfQorICAgICAgICBrbXBfY21wbHgxMjhfYTRfdCBvcGVyYXRvciAtICggY29uc3Qga21wX2NtcGx4MTI4X2E0X3QmIGIgKSB7CisgICAgICAgIGttcF9jbXBseDEyOCBsaHMgPSAoKnRoaXMpLnE7CisgICAgICAgIGttcF9jbXBseDEyOCByaHMgPSBiLnE7CisgICAgICAgIHJldHVybiAoa21wX2NtcGx4MTI4X2E0X3QpKCBsaHMgLSByaHMgKTsKKyAgICB9CisgICAga21wX2NtcGx4MTI4X2E0X3Qgb3BlcmF0b3IgKiAoIGNvbnN0IGttcF9jbXBseDEyOF9hNF90JiBiICkgeworICAgICAgICBrbXBfY21wbHgxMjggbGhzID0gKCp0aGlzKS5xOworICAgICAgICBrbXBfY21wbHgxMjggcmhzID0gYi5xOworICAgICAgICByZXR1cm4gKGttcF9jbXBseDEyOF9hNF90KSggbGhzICogcmhzICk7CisgICAgfQorCisgICAga21wX2NtcGx4MTI4X2E0X3Qgb3BlcmF0b3IgLyAoIGNvbnN0IGttcF9jbXBseDEyOF9hNF90JiBiICkgeworICAgICAgICBrbXBfY21wbHgxMjggbGhzID0gKCp0aGlzKS5xOworICAgICAgICBrbXBfY21wbHgxMjggcmhzID0gYi5xOworICAgICAgICByZXR1cm4gKGttcF9jbXBseDEyOF9hNF90KSggbGhzIC8gcmhzICk7CisgICAgfQorCisgICAgfTsKKworICAgICNwcmFnbWEgcGFjayggcG9wICkKKworICAgIC8vIE5ldyAxNi1ieXRlIGFsaWduZWQgc3RydWN0dXJlcyBmb3IgMTIuMCBjb21waWxlci4KKyAgICBzdHJ1Y3QgS01QX0RPX0FMSUdOKCAxNiApIFF1YWRfYTE2X3QgeworICAgICAgICBfUXVhZCBxOworCisgICAgICAgIFF1YWRfYTE2X3QoICApIDogcSggICkge30KKyAgICAgICAgUXVhZF9hMTZfdCggY29uc3QgX1F1YWQgJiBjcSApIDogcSAoIGNxICkge30KKworICAgICAgICBRdWFkX2ExNl90IG9wZXJhdG9yICsgKCBjb25zdCBRdWFkX2ExNl90JiBiICkgeworICAgICAgICBfUXVhZCBsaHMgPSAoKnRoaXMpLnE7CisgICAgICAgIF9RdWFkIHJocyA9IGIucTsKKyAgICAgICAgcmV0dXJuIChRdWFkX2ExNl90KSggbGhzICsgcmhzICk7CisgICAgfQorCisgICAgUXVhZF9hMTZfdCBvcGVyYXRvciAtICggY29uc3QgUXVhZF9hMTZfdCYgYiApIHsKKyAgICAgICAgX1F1YWQgbGhzID0gKCp0aGlzKS5xOworICAgICAgICBfUXVhZCByaHMgPSBiLnE7CisgICAgICAgIHJldHVybiAoUXVhZF9hMTZfdCkoIGxocyAtIHJocyApOworICAgIH0KKyAgICBRdWFkX2ExNl90IG9wZXJhdG9yICogKCBjb25zdCBRdWFkX2ExNl90JiBiICkgeworICAgICAgICBfUXVhZCBsaHMgPSAoKnRoaXMpLnE7CisgICAgICAgIF9RdWFkIHJocyA9IGIucTsKKyAgICAgICAgcmV0dXJuIChRdWFkX2ExNl90KSggbGhzICogcmhzICk7CisgICAgfQorCisgICAgUXVhZF9hMTZfdCBvcGVyYXRvciAvICggY29uc3QgUXVhZF9hMTZfdCYgYiApIHsKKyAgICAgICAgX1F1YWQgbGhzID0gKCp0aGlzKS5xOworICAgICAgICAgICAgX1F1YWQgcmhzID0gYi5xOworICAgICAgICByZXR1cm4gKFF1YWRfYTE2X3QpKCBsaHMgLyByaHMgKTsKKyAgICB9CisgICAgfTsKKworICAgIHN0cnVjdCBLTVBfRE9fQUxJR04oIDE2ICkga21wX2NtcGx4MTI4X2ExNl90IHsKKyAgICAgICAga21wX2NtcGx4MTI4IHE7CisKKyAgICBrbXBfY21wbHgxMjhfYTE2X3QoKSA6IHEgKCkge30KKworICAgIGttcF9jbXBseDEyOF9hMTZfdCggY29uc3Qga21wX2NtcGx4MTI4ICYgYzEyOCApIDogcSAoIGMxMjggKSB7fQorCisgICAgICAga21wX2NtcGx4MTI4X2ExNl90IG9wZXJhdG9yICsgKCBjb25zdCBrbXBfY21wbHgxMjhfYTE2X3QmIGIgKSB7CisgICAgICAgIGttcF9jbXBseDEyOCBsaHMgPSAoKnRoaXMpLnE7CisgICAgICAgIGttcF9jbXBseDEyOCByaHMgPSBiLnE7CisgICAgICAgIHJldHVybiAoa21wX2NtcGx4MTI4X2ExNl90KSggbGhzICsgcmhzICk7CisgICAgfQorICAgICAgIGttcF9jbXBseDEyOF9hMTZfdCBvcGVyYXRvciAtICggY29uc3Qga21wX2NtcGx4MTI4X2ExNl90JiBiICkgeworICAgICAgICBrbXBfY21wbHgxMjggbGhzID0gKCp0aGlzKS5xOworICAgICAgICBrbXBfY21wbHgxMjggcmhzID0gYi5xOworICAgICAgICByZXR1cm4gKGttcF9jbXBseDEyOF9hMTZfdCkoIGxocyAtIHJocyApOworICAgIH0KKyAgICBrbXBfY21wbHgxMjhfYTE2X3Qgb3BlcmF0b3IgKiAoIGNvbnN0IGttcF9jbXBseDEyOF9hMTZfdCYgYiApIHsKKyAgICAgICAga21wX2NtcGx4MTI4IGxocyA9ICgqdGhpcykucTsKKyAgICAgICAga21wX2NtcGx4MTI4IHJocyA9IGIucTsKKyAgICAgICAgcmV0dXJuIChrbXBfY21wbHgxMjhfYTE2X3QpKCBsaHMgKiByaHMgKTsKKyAgICB9CisKKyAgICBrbXBfY21wbHgxMjhfYTE2X3Qgb3BlcmF0b3IgLyAoIGNvbnN0IGttcF9jbXBseDEyOF9hMTZfdCYgYiApIHsKKyAgICAgICAga21wX2NtcGx4MTI4IGxocyA9ICgqdGhpcykucTsKKyAgICAgICAga21wX2NtcGx4MTI4IHJocyA9IGIucTsKKyAgICAgICAgcmV0dXJuIChrbXBfY21wbHgxMjhfYTE2X3QpKCBsaHMgLyByaHMgKTsKKyAgICB9CisgICAgfTsKKworI2VuZGlmCisKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgI2RlZmluZSBRVUFEX0xFR0FDWSBRdWFkX2E0X3QKKyAgICAjZGVmaW5lIENQTFgxMjhfTEVHIGttcF9jbXBseDEyOF9hNF90CisjZWxzZQorICAgICNkZWZpbmUgUVVBRF9MRUdBQ1kgX1F1YWQKKyAgICAjZGVmaW5lIENQTFgxMjhfTEVHIGttcF9jbXBseDEyOAorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIGV4dGVybiAiQyIgeworI2VuZGlmCisKK2V4dGVybiBpbnQgX19rbXBfYXRvbWljX21vZGU7CisKKy8vCisvLyBBdG9taWMgbG9ja3MgY2FuIGVhc2lseSBiZWNvbWUgY29udGVuZGVkLCBzbyB3ZSB1c2UgcXVldWluZyBsb2NrcyBmb3IgdGhlbS4KKy8vCisKK3R5cGVkZWYga21wX3F1ZXVpbmdfbG9ja190IGttcF9hdG9taWNfbG9ja190OworCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soIGttcF9hdG9taWNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRQorICAgIGlmIChvbXB0X2VuYWJsZWQgJiYgCisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF93YWl0X2F0b21pYykpIHsKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3dhaXRfYXRvbWljKSgKKyAgICAgICAgICAgIChvbXB0X3dhaXRfaWRfdCkgbGNrKTsKKyAgICB9CisjZW5kaWYKKworICAgIF9fa21wX2FjcXVpcmVfcXVldWluZ19sb2NrKCBsY2ssIGd0aWQgKTsKKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgICAgaWYgKG9tcHRfZW5hYmxlZCAmJiAKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2FjcXVpcmVkX2F0b21pYykpIHsKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2FjcXVpcmVkX2F0b21pYykoCisgICAgICAgICAgICAob21wdF93YWl0X2lkX3QpIGxjayk7CisgICAgfQorI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2ttcF90ZXN0X2F0b21pY19sb2NrKCBrbXBfYXRvbWljX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgcmV0dXJuIF9fa21wX3Rlc3RfcXVldWluZ19sb2NrKCBsY2ssIGd0aWQgKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCBrbXBfYXRvbWljX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgX19rbXBfcmVsZWFzZV9xdWV1aW5nX2xvY2soIGxjaywgZ3RpZCApOworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX0JMQU1FCisgICAgaWYgKG9tcHRfZW5hYmxlZCAmJgorICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcmVsZWFzZV9hdG9taWMpKSB7CisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9yZWxlYXNlX2F0b21pYykoCisgICAgICAgICAgICAob21wdF93YWl0X2lkX3QpIGxjayk7CisgIH0KKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX2luaXRfYXRvbWljX2xvY2soIGttcF9hdG9taWNfbG9ja190ICpsY2sgKQoreworICAgIF9fa21wX2luaXRfcXVldWluZ19sb2NrKCBsY2sgKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9kZXN0cm95X2F0b21pY19sb2NrKCBrbXBfYXRvbWljX2xvY2tfdCAqbGNrICkKK3sKKyAgICBfX2ttcF9kZXN0cm95X3F1ZXVpbmdfbG9jayggbGNrICk7Cit9CisKKy8vIEdsb2JhbCBMb2NrcworCitleHRlcm4ga21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2s7ICAgIC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgaW4gR251IGNvbXBhdCBtb2RlICAgKi8KK2V4dGVybiBrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9ja18xaTsgIC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yIDEtYnl0ZSBmaXhlZCBkYXRhIHR5cGVzICovCitleHRlcm4ga21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfMmk7ICAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciAyLWJ5dGUgZml4ZWQgZGF0YSB0eXBlcyAqLworZXh0ZXJuIGttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzRpOyAgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgNC1ieXRlIGZpeGVkIGRhdGEgdHlwZXMgKi8KK2V4dGVybiBrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9ja180cjsgIC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yIGttcF9yZWFsMzIgZGF0YSB0eXBlICAgICovCitleHRlcm4ga21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfOGk7ICAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciA4LWJ5dGUgZml4ZWQgZGF0YSB0eXBlcyAqLworZXh0ZXJuIGttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzhyOyAgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3Iga21wX3JlYWw2NCBkYXRhIHR5cGUgICAgKi8KK2V4dGVybiBrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9ja184YzsgIC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yIGNvbXBsZXggYnl0ZSBkYXRhIHR5cGUgICovCitleHRlcm4ga21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfMTByOyAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciBsb25nIGRvdWJsZSBkYXRhIHR5cGUgICAqLworZXh0ZXJuIGttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzE2cjsgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgX1F1YWQgZGF0YSB0eXBlICAgICAgICAgKi8KK2V4dGVybiBrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9ja18xNmM7IC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yIGRvdWJsZSBjb21wbGV4IGRhdGEgdHlwZSovCitleHRlcm4ga21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfMjBjOyAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciBsb25nIGRvdWJsZSBjb21wbGV4IHR5cGUqLworZXh0ZXJuIGttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzMyYzsgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgX1F1YWQgY29tcGxleCBkYXRhIHR5cGUgKi8KKworLy8KKy8vICBCZWxvdyByb3V0aW5lcyBmb3IgYXRvbWljIFVQREFURSBhcmUgbGlzdGVkCisvLworCisvLyAxLWJ5dGUKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfYWRkKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfYW5kYiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfZGl2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDF1X2RpdiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgY2hhciAqIGxocywgdW5zaWduZWQgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfbXVsKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfb3JiKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfc2hsKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfc2hyKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDF1X3NociggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgY2hhciAqIGxocywgdW5zaWduZWQgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfc3ViKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfeG9yKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKKy8vIDItYnl0ZQordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hZGQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX2FuZGIoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfZGl2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBzaG9ydCAqIGxocywgdW5zaWduZWQgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX211bCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfb3JiKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaGwoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX3NociggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJ1X3NociggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgc2hvcnQgKiBsaHMsIHVuc2lnbmVkIHNob3J0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWIoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX3hvciggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMgKTsKKy8vIDQtYnl0ZSBhZGQgLyBzdWIgZml4ZWQKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfYWRkKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1YiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocyApOworLy8gNC1ieXRlIGFkZCAvIHN1YiBmbG9hdAordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBrbXBfcmVhbDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWIoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBrbXBfcmVhbDMyIHJocyApOworLy8gOC1ieXRlIGFkZCAvIHN1YiBmaXhlZAordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hZGQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfc3ViKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzICk7CisvLyA4LWJ5dGUgYWRkIC8gc3ViIGZsb2F0Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ4X2FkZCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsNjQgKiBsaHMsIGttcF9yZWFsNjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ4X3N1YiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsNjQgKiBsaHMsIGttcF9yZWFsNjQgcmhzICk7CisvLyA0LWJ5dGUgZml4ZWQKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfYW5kYiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X2RpdiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDMyICogbGhzLCBrbXBfdWludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tdWwoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfb3JiKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X3NobCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaHIoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDR1X3NociggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3VpbnQzMiAqIGxocywga21wX3VpbnQzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfeG9yKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzICk7CisvLyA4LWJ5dGUgZml4ZWQKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfYW5kYiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X2RpdiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDY0ICogbGhzLCBrbXBfdWludDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tdWwoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfb3JiKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X3NobCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaHIoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDh1X3NociggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3VpbnQ2NCAqIGxocywga21wX3VpbnQ2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfeG9yKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzICk7CisvLyA0LWJ5dGUgZmxvYXQKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDRfZGl2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAqIGxocywga21wX3JlYWwzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDRfbXVsKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAqIGxocywga21wX3JlYWwzMiByaHMgKTsKKy8vIDgtYnl0ZSBmbG9hdAordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDY0ICogbGhzLCBrbXBfcmVhbDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tdWwoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDY0ICogbGhzLCBrbXBfcmVhbDY0IHJocyApOworLy8gMS0sIDItLCA0LSwgOC1ieXRlIGxvZ2ljYWwgKCYmLCB8fCkKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfYW5kbCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfb3JsKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfYW5kbCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9vcmwoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X2FuZGwoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9vcmwoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfYW5kbCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X29ybCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocyApOworLy8gTUlOIC8gTUFYCit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX21heCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX21pbiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX21heCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfbWluKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tYXgoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfbWluKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X21heCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9taW4oICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDRfbWF4KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAqIGxocywga21wX3JlYWwzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDRfbWluKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAqIGxocywga21wX3JlYWwzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDhfbWF4KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWw2NCAqIGxocywga21wX3JlYWw2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDhfbWluKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWw2NCAqIGxocywga21wX3JlYWw2NCByaHMgKTsKKyNpZiBLTVBfSEFWRV9RVUFECit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxNl9tYXgoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFFVQURfTEVHQUNZICogbGhzLCBRVUFEX0xFR0FDWSByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDE2X21pbiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKiBsaHMsIFFVQURfTEVHQUNZIHJocyApOworI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICAvLyBSb3V0aW5lcyB3aXRoIDE2LWJ5dGUgYXJndW1lbnRzIGFsaWduZWQgdG8gMTYtYnl0ZSBib3VuZGFyeTsgSUEtMzIgYXJjaGl0ZWN0dXJlIG9ubHkKKyAgICB2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxNl9tYXhfYTE2KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAqIGxocywgUXVhZF9hMTZfdCByaHMgKTsKKyAgICB2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxNl9taW5fYTE2KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAqIGxocywgUXVhZF9hMTZfdCByaHMgKTsKKyNlbmRpZgorI2VuZGlmCisvLyAuTkVRVi4gKHNhbWUgYXMgeG9yKQordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9uZXF2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9uZXF2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X25lcXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9uZXF2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMgKTsKKy8vIC5FUVYuIChzYW1lIGFzIH54b3IpCit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX2VxdiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX2VxdiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfZXF2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X2VxdiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocyApOworLy8gbG9uZyBkb3VibGUgdHlwZQordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfYWRkKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgbG9uZyBkb3VibGUgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWIoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGxvbmcgZG91YmxlICogbGhzLCBsb25nIGRvdWJsZSByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDEwX211bCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgbG9uZyBkb3VibGUgKiBsaHMsIGxvbmcgZG91YmxlIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgbG9uZyBkb3VibGUgcmhzICk7CisvLyBfUXVhZCB0eXBlCisjaWYgS01QX0hBVkVfUVVBRAordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYWRkKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBRVUFEX0xFR0FDWSAqIGxocywgUVVBRF9MRUdBQ1kgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWIoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFFVQURfTEVHQUNZICogbGhzLCBRVUFEX0xFR0FDWSByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDE2X211bCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKiBsaHMsIFFVQURfTEVHQUNZIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBRVUFEX0xFR0FDWSAqIGxocywgUVVBRF9MRUdBQ1kgcmhzICk7CisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIC8vIFJvdXRpbmVzIHdpdGggMTYtYnl0ZSBhcmd1bWVudHMgYWxpZ25lZCB0byAxNi1ieXRlIGJvdW5kYXJ5CisgICAgdm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYWRkX2ExNiggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIFF1YWRfYTE2X3QgKiBsaHMsIFF1YWRfYTE2X3QgcmhzICk7CisgICAgdm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2ExNiggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIFF1YWRfYTE2X3QgKiBsaHMsIFF1YWRfYTE2X3QgcmhzICk7CisgICAgdm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbXVsX2ExNiggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIFF1YWRfYTE2X3QgKiBsaHMsIFF1YWRfYTE2X3QgcmhzICk7CisgICAgdm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2ExNiggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIFF1YWRfYTE2X3QgKiBsaHMsIFF1YWRfYTE2X3QgcmhzICk7CisjZW5kaWYKKyNlbmRpZgorLy8gcm91dGluZXMgZm9yIGNvbXBsZXggdHlwZXMKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDRfYWRkKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MzIgKiBsaHMsIGttcF9jbXBseDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4NF9zdWIoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg0X211bCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHgzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDRfZGl2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MzIgKiBsaHMsIGttcF9jbXBseDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4OF9hZGQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg2NCAqIGxocywga21wX2NtcGx4NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg4X3N1YiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDY0ICogbGhzLCBrbXBfY21wbHg2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDhfbXVsKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4NjQgKiBsaHMsIGttcF9jbXBseDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4OF9kaXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg2NCAqIGxocywga21wX2NtcGx4NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHgxMF9hZGQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDgwICogbGhzLCBrbXBfY21wbHg4MCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDEwX3N1YiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4ODAgKiBsaHMsIGttcF9jbXBseDgwIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTBfbXVsKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg4MCAqIGxocywga21wX2NtcGx4ODAgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHgxMF9kaXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDgwICogbGhzLCBrbXBfY21wbHg4MCByaHMgKTsKKyNpZiBLTVBfSEFWRV9RVUFECit2b2lkIF9fa21wY19hdG9taWNfY21wbHgxNl9hZGQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIENQTFgxMjhfTEVHICogbGhzLCBDUExYMTI4X0xFRyByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDE2X3N1YiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgQ1BMWDEyOF9MRUcgKiBsaHMsIENQTFgxMjhfTEVHIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfbXVsKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBDUExYMTI4X0xFRyAqIGxocywgQ1BMWDEyOF9MRUcgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIENQTFgxMjhfTEVHICogbGhzLCBDUExYMTI4X0xFRyByaHMgKTsKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgLy8gUm91dGluZXMgd2l0aCAxNi1ieXRlIGFyZ3VtZW50cyBhbGlnbmVkIHRvIDE2LWJ5dGUgYm91bmRhcnkKKyAgICB2b2lkIF9fa21wY19hdG9taWNfY21wbHgxNl9hZGRfYTE2KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MTI4X2ExNl90ICogbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgcmhzICk7CisgICAgdm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2ExNiggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDEyOF9hMTZfdCAqIGxocywga21wX2NtcGx4MTI4X2ExNl90IHJocyApOworICAgIHZvaWQgX19rbXBjX2F0b21pY19jbXBseDE2X211bF9hMTYoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgxMjhfYTE2X3QgKiBsaHMsIGttcF9jbXBseDEyOF9hMTZfdCByaHMgKTsKKyAgICB2b2lkIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfYTE2KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MTI4X2ExNl90ICogbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgcmhzICk7CisjZW5kaWYKKyNlbmRpZgorCisjaWYgT01QXzQwX0VOQUJMRUQKKworLy8gT3Blbk1QIDQuMDogeCA9IGV4cHIgYmlub3AgeCBmb3Igbm9uLWNvbW11dGF0aXZlIG9wZXJhdGlvbnMuCisvLyBTdXBwb3J0ZWQgb25seSBvbiBJQS0zMiBhcmNoaXRlY3R1cmUgYW5kIEludGVsKFIpIDY0CisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX3N1Yl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDF1X2Rpdl9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHVuc2lnbmVkIGNoYXIgKiBsaHMsIHVuc2lnbmVkIGNoYXIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX3NobF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaHJfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDF1X3Nocl9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHVuc2lnbmVkIGNoYXIgKiBsaHMsIHVuc2lnbmVkIGNoYXIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQydV9kaXZfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBzaG9ydCAqIGxocywgdW5zaWduZWQgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX3NobF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX3Nocl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQydV9zaHJfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBzaG9ydCAqIGxocywgdW5zaWduZWQgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfZGl2X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3VpbnQzMiAqIGxocywga21wX3VpbnQzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfc2hsX3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaHJfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHJfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDMyICogbGhzLCBrbXBfdWludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDh1X2Rpdl9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50NjQgKiBsaHMsIGttcF91aW50NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X3NobF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfc2hyX3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc2hyX3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3VpbnQ2NCAqIGxocywga21wX3VpbnQ2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGZsb2F0ICogbGhzLCBmbG9hdCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGZsb2F0ICogbGhzLCBmbG9hdCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGRvdWJsZSAqIGxocywgZG91YmxlIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgZG91YmxlICogbGhzLCBkb3VibGUgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWJfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgbG9uZyBkb3VibGUgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgbG9uZyBkb3VibGUgcmhzICk7CisjaWYgS01QX0hBVkVfUVVBRAordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKiBsaHMsIFFVQURfTEVHQUNZIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKiBsaHMsIFFVQURfTEVHQUNZIHJocyApOworI2VuZGlmCit2b2lkIF9fa21wY19hdG9taWNfY21wbHg0X3N1Yl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg0X2Rpdl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg4X3N1Yl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg2NCAqIGxocywga21wX2NtcGx4NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg4X2Rpdl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg2NCAqIGxocywga21wX2NtcGx4NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHgxMF9zdWJfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg4MCAqIGxocywga21wX2NtcGx4ODAgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHgxMF9kaXZfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg4MCAqIGxocywga21wX2NtcGx4ODAgcmhzICk7CisjaWYgS01QX0hBVkVfUVVBRAordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgQ1BMWDEyOF9MRUcgKiBsaHMsIENQTFgxMjhfTEVHIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgQ1BMWDEyOF9MRUcgKiBsaHMsIENQTFgxMjhfTEVHIHJocyApOworI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICAvLyBSb3V0aW5lcyB3aXRoIDE2LWJ5dGUgYXJndW1lbnRzIGFsaWduZWQgdG8gMTYtYnl0ZSBib3VuZGFyeQorICAgIHZvaWQgX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9hMTZfcmV2KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAqIGxocywgUXVhZF9hMTZfdCByaHMgKTsKKyAgICB2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfYTE2X3JldiggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIFF1YWRfYTE2X3QgKiBsaHMsIFF1YWRfYTE2X3QgcmhzICk7CisgICAgdm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2ExNl9yZXYoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgxMjhfYTE2X3QgKiBsaHMsIGttcF9jbXBseDEyOF9hMTZfdCByaHMgKTsKKyAgICB2b2lkIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfYTE2X3JldiggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDEyOF9hMTZfdCAqIGxocywga21wX2NtcGx4MTI4X2ExNl90IHJocyApOworI2VuZGlmCisjZW5kaWYgLy8gS01QX0hBVkVfUVVBRAorCisjZW5kaWYgLy9LTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisKKyNlbmRpZiAvL09NUF80MF9FTkFCTEVECisKKy8vIHJvdXRpbmVzIGZvciBtaXhlZCB0eXBlcworCisvLyBSSFM9ZmxvYXQ4Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX211bF9mbG9hdDgoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGttcF9yZWFsNjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9mbG9hdDgoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGttcF9yZWFsNjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX211bF9mbG9hdDgoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBrbXBfcmVhbDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfZmxvYXQ4KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywga21wX3JlYWw2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfbXVsX2Zsb2F0OCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfcmVhbDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfZmxvYXQ4KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9yZWFsNjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X211bF9mbG9hdDgoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX3JlYWw2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2Zsb2F0OCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfcmVhbDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGRfZmxvYXQ4KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBrbXBfcmVhbDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfZmxvYXQ4KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBrbXBfcmVhbDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tdWxfZmxvYXQ4KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBrbXBfcmVhbDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfZmxvYXQ4KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBrbXBfcmVhbDY0IHJocyApOworCisvLyBSSFM9ZmxvYXQxNiAoZGVwcmVjYXRlZCwgdG8gYmUgcmVtb3ZlZCB3aGVuIHdlIGFyZSBzdXJlIHRoZSBjb21waWxlciBkb2VzIG5vdCB1c2UgdGhlbSkKKyNpZiBLTVBfSEFWRV9RVUFECit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX2FkZF9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWJfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfbXVsX2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2X2ZwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBjaGFyICogbGhzLCBfUXVhZCByaHMgKTsKKwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hZGRfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfbXVsX2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQydV9kaXZfZnAoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHVuc2lnbmVkIHNob3J0ICogbGhzLCBfUXVhZCByaHMgKTsKKwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGRfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWJfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tdWxfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X2ZwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDMyICogbGhzLCBfUXVhZCByaHMgKTsKKwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hZGRfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tdWxfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2X2ZwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDY0ICogbGhzLCBfUXVhZCByaHMgKTsKKwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGRfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ0X211bF9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBfUXVhZCByaHMgKTsKKwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGRfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDY0ICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWw2NCAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ4X211bF9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsNjQgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDY0ICogbGhzLCBfUXVhZCByaHMgKTsKKwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfYWRkX2ZwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWJfZnAoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGxvbmcgZG91YmxlICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDEwX211bF9mcCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgbG9uZyBkb3VibGUgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2X2ZwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgX1F1YWQgcmhzICk7CisjZW5kaWYgLy8gS01QX0hBVkVfUVVBRAorCisvLyBSSFM9Y21wbHg4Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg0X2FkZF9jbXBseDgoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHg2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDRfc3ViX2NtcGx4OCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MzIgKiBsaHMsIGttcF9jbXBseDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4NF9tdWxfY21wbHg4KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg0X2Rpdl9jbXBseDgoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHg2NCByaHMgKTsKKworLy8gZ2VuZXJpYyBhdG9taWMgcm91dGluZXMKK3ZvaWQgX19rbXBjX2F0b21pY18xKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdm9pZCogbGhzLCB2b2lkKiByaHMsIHZvaWQgKCpmKSggdm9pZCAqLCB2b2lkICosIHZvaWQgKiApICk7Cit2b2lkIF9fa21wY19hdG9taWNfMiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHZvaWQqIGxocywgdm9pZCogcmhzLCB2b2lkICgqZikoIHZvaWQgKiwgdm9pZCAqLCB2b2lkICogKSApOwordm9pZCBfX2ttcGNfYXRvbWljXzQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB2b2lkKiBsaHMsIHZvaWQqIHJocywgdm9pZCAoKmYpKCB2b2lkICosIHZvaWQgKiwgdm9pZCAqICkgKTsKK3ZvaWQgX19rbXBjX2F0b21pY184KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdm9pZCogbGhzLCB2b2lkKiByaHMsIHZvaWQgKCpmKSggdm9pZCAqLCB2b2lkICosIHZvaWQgKiApICk7Cit2b2lkIF9fa21wY19hdG9taWNfMTAoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHZvaWQqIGxocywgdm9pZCogcmhzLCB2b2lkICgqZikoIHZvaWQgKiwgdm9pZCAqLCB2b2lkICogKSApOwordm9pZCBfX2ttcGNfYXRvbWljXzE2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB2b2lkKiBsaHMsIHZvaWQqIHJocywgdm9pZCAoKmYpKCB2b2lkICosIHZvaWQgKiwgdm9pZCAqICkgKTsKK3ZvaWQgX19rbXBjX2F0b21pY18yMCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdm9pZCogbGhzLCB2b2lkKiByaHMsIHZvaWQgKCpmKSggdm9pZCAqLCB2b2lkICosIHZvaWQgKiApICk7Cit2b2lkIF9fa21wY19hdG9taWNfMzIoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHZvaWQqIGxocywgdm9pZCogcmhzLCB2b2lkICgqZikoIHZvaWQgKiwgdm9pZCAqLCB2b2lkICogKSApOworCisvLyBSRUFELCBXUklURSwgQ0FQVFVSRSBhcmUgc3VwcG9ydGVkIG9ubHkgb24gSUEtMzIgYXJjaGl0ZWN0dXJlIGFuZCBJbnRlbChSKSA2NAorI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworLy8KKy8vICBCZWxvdyByb3V0aW5lcyBmb3IgYXRvbWljIFJFQUQgYXJlIGxpc3RlZAorLy8KKworY2hhciAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3JkKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAgICAgICAgKiBsb2MgKTsKK3Nob3J0ICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9yZCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICAgICAgICogbG9jICk7CitrbXBfaW50MzIgICAgX19rbXBjX2F0b21pY19maXhlZDRfcmQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgICAqIGxvYyApOwora21wX2ludDY0ICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3JkKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICAgKiBsb2MgKTsKK2ttcF9yZWFsMzIgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9yZCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgICogbG9jICk7CitrbXBfcmVhbDY0ICAgX19rbXBjX2F0b21pY19mbG9hdDhfcmQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDY0ICAqIGxvYyApOworbG9uZyBkb3VibGUgIF9fa21wY19hdG9taWNfZmxvYXQxMF9yZCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgbG9uZyBkb3VibGUgKiBsb2MgKTsKKyNpZiBLTVBfSEFWRV9RVUFECitRVUFEX0xFR0FDWSAgX19rbXBjX2F0b21pY19mbG9hdDE2X3JkKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBRVUFEX0xFR0FDWSAqIGxvYyApOworI2VuZGlmCisvLyBGaXggZm9yIENRMjIwMzYxOiBjbXBseDQgUkVBRCB3aWxsIHJldHVybiB2b2lkIG9uIFdpbmRvd3MqIE9TOyByZWFkIHZhbHVlIHdpbGwgYmUKKy8vIHJldHVybmVkIHRocm91Z2ggYW4gYWRkaXRpb25hbCBwYXJhbWV0ZXIKKyNpZiAoIEtNUF9PU19XSU5ET1dTICkKKyAgICB2b2lkICBfX2ttcGNfYXRvbWljX2NtcGx4NF9yZCggIGttcF9jbXBseDMyICogb3V0LCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxvYyApOworI2Vsc2UKKyAgICBrbXBfY21wbHgzMiAgX19rbXBjX2F0b21pY19jbXBseDRfcmQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxvYyApOworI2VuZGlmCitrbXBfY21wbHg2NCAgX19rbXBjX2F0b21pY19jbXBseDhfcmQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg2NCAqIGxvYyApOwora21wX2NtcGx4ODAgIF9fa21wY19hdG9taWNfY21wbHgxMF9yZCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4ODAgKiBsb2MgKTsKKyNpZiBLTVBfSEFWRV9RVUFECitDUExYMTI4X0xFRyAgX19rbXBjX2F0b21pY19jbXBseDE2X3JkKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBDUExYMTI4X0xFRyAqIGxvYyApOworI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICAvLyBSb3V0aW5lcyB3aXRoIDE2LWJ5dGUgYXJndW1lbnRzIGFsaWduZWQgdG8gMTYtYnl0ZSBib3VuZGFyeQorICAgIFF1YWRfYTE2X3QgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYTE2X3JkKCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAgICAgICAgICogbG9jICk7CisgICAga21wX2NtcGx4MTI4X2ExNl90IF9fa21wY19hdG9taWNfY21wbHgxNl9hMTZfcmQoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgxMjhfYTE2X3QgKiBsb2MgKTsKKyNlbmRpZgorI2VuZGlmCisKKworLy8KKy8vICBCZWxvdyByb3V0aW5lcyBmb3IgYXRvbWljIFdSSVRFIGFyZSBsaXN0ZWQKKy8vCisKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfd3IoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICAgICAgICAqIGxocywgY2hhciAgICAgICAgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX3dyKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgICAgICAgKiBsaHMsIHNob3J0ICAgICAgIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF93ciggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgICogbGhzLCBrbXBfaW50MzIgICByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfd3IoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgICAqIGxocywga21wX2ludDY0ICAgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ0X3dyKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAgKiBsaHMsIGttcF9yZWFsMzIgIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0OF93ciggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsNjQgICogbGhzLCBrbXBfcmVhbDY0ICByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDEwX3dyKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgbG9uZyBkb3VibGUgcmhzICk7CisjaWYgS01QX0hBVkVfUVVBRAordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfd3IoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFFVQURfTEVHQUNZICogbGhzLCBRVUFEX0xFR0FDWSByaHMgKTsKKyNlbmRpZgordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4NF93ciggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHgzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDhfd3IoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg2NCAqIGxocywga21wX2NtcGx4NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHgxMF93ciggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4ODAgKiBsaHMsIGttcF9jbXBseDgwIHJocyApOworI2lmIEtNUF9IQVZFX1FVQUQKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDE2X3dyKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBDUExYMTI4X0xFRyAqIGxocywgQ1BMWDEyOF9MRUcgcmhzICk7CisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIC8vIFJvdXRpbmVzIHdpdGggMTYtYnl0ZSBhcmd1bWVudHMgYWxpZ25lZCB0byAxNi1ieXRlIGJvdW5kYXJ5CisgICAgdm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYTE2X3dyKCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAgICAgICAgICogbGhzLCBRdWFkX2ExNl90ICAgICAgICAgcmhzICk7CisgICAgdm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYTE2X3dyKCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MTI4X2ExNl90ICogbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgcmhzICk7CisjZW5kaWYKKyNlbmRpZgorCisvLworLy8gIEJlbG93IHJvdXRpbmVzIGZvciBhdG9taWMgQ0FQVFVSRSBhcmUgbGlzdGVkCisvLworCisvLyAxLWJ5dGUKK2NoYXIgX19rbXBjX2F0b21pY19maXhlZDFfYWRkX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzLCBpbnQgZmxhZyk7CitjaGFyIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGJfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocywgaW50IGZsYWcpOworY2hhciBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMsIGludCBmbGFnKTsKK3Vuc2lnbmVkIGNoYXIgX19rbXBjX2F0b21pY19maXhlZDF1X2Rpdl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHVuc2lnbmVkIGNoYXIgKiBsaHMsIHVuc2lnbmVkIGNoYXIgcmhzLCBpbnQgZmxhZyk7CitjaGFyIF9fa21wY19hdG9taWNfZml4ZWQxX211bF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocywgaW50IGZsYWcpOworY2hhciBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmJfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMsIGludCBmbGFnKTsKK2NoYXIgX19rbXBjX2F0b21pY19maXhlZDFfc2hsX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzLCBpbnQgZmxhZyk7CitjaGFyIF9fa21wY19hdG9taWNfZml4ZWQxX3Nocl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocywgaW50IGZsYWcpOwordW5zaWduZWQgY2hhciBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfc2hyX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgY2hhciAqIGxocywgdW5zaWduZWQgY2hhciByaHMsIGludCBmbGFnKTsKK2NoYXIgX19rbXBjX2F0b21pY19maXhlZDFfc3ViX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzLCBpbnQgZmxhZyk7CitjaGFyIF9fa21wY19hdG9taWNfZml4ZWQxX3hvcl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocywgaW50IGZsYWcpOworLy8gMi1ieXRlCitzaG9ydCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hZGRfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocywgaW50IGZsYWcpOworc2hvcnQgX19rbXBjX2F0b21pY19maXhlZDJfYW5kYl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMsIGludCBmbGFnKTsKK3Nob3J0IF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzLCBpbnQgZmxhZyk7Cit1bnNpZ25lZCBzaG9ydCBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2X2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgc2hvcnQgKiBsaHMsIHVuc2lnbmVkIHNob3J0IHJocywgaW50IGZsYWcpOworc2hvcnQgX19rbXBjX2F0b21pY19maXhlZDJfbXVsX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMsIGludCBmbGFnKTsKK3Nob3J0IF9fa21wY19hdG9taWNfZml4ZWQyX29yYl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzLCBpbnQgZmxhZyk7CitzaG9ydCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaGxfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocywgaW50IGZsYWcpOworc2hvcnQgX19rbXBjX2F0b21pY19maXhlZDJfc2hyX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMsIGludCBmbGFnKTsKK3Vuc2lnbmVkIHNob3J0IF9fa21wY19hdG9taWNfZml4ZWQydV9zaHJfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBzaG9ydCAqIGxocywgdW5zaWduZWQgc2hvcnQgcmhzLCBpbnQgZmxhZyk7CitzaG9ydCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWJfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocywgaW50IGZsYWcpOworc2hvcnQgX19rbXBjX2F0b21pY19maXhlZDJfeG9yX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMsIGludCBmbGFnKTsKKy8vIDQtYnl0ZSBhZGQgLyBzdWIgZml4ZWQKK2ttcF9pbnQzMiAgX19rbXBjX2F0b21pY19maXhlZDRfYWRkX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgKiBsaHMsIGttcF9pbnQzMiByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQzMiAgX19rbXBjX2F0b21pY19maXhlZDRfc3ViX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgKiBsaHMsIGttcF9pbnQzMiByaHMsIGludCBmbGFnKTsKKy8vIDQtYnl0ZSBhZGQgLyBzdWIgZmxvYXQKK2ttcF9yZWFsMzIgX19rbXBjX2F0b21pY19mbG9hdDRfYWRkX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgKiBsaHMsIGttcF9yZWFsMzIgcmhzLCBpbnQgZmxhZyk7CitrbXBfcmVhbDMyIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBrbXBfcmVhbDMyIHJocywgaW50IGZsYWcpOworLy8gOC1ieXRlIGFkZCAvIHN1YiBmaXhlZAora21wX2ludDY0ICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hZGRfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICAqIGxocywga21wX2ludDY0IHJocywgaW50IGZsYWcpOwora21wX2ludDY0ICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICAqIGxocywga21wX2ludDY0IHJocywgaW50IGZsYWcpOworLy8gOC1ieXRlIGFkZCAvIHN1YiBmbG9hdAora21wX3JlYWw2NCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGRfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWw2NCAqIGxocywga21wX3JlYWw2NCByaHMsIGludCBmbGFnKTsKK2ttcF9yZWFsNjQgX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsNjQgKiBsaHMsIGttcF9yZWFsNjQgcmhzLCBpbnQgZmxhZyk7CisvLyA0LWJ5dGUgZml4ZWQKK2ttcF9pbnQzMiAgX19rbXBjX2F0b21pY19maXhlZDRfYW5kYl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgKiBsaHMsIGttcF9pbnQzMiAgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50MzIgIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgICogbGhzLCBrbXBfaW50MzIgIHJocywgaW50IGZsYWcpOwora21wX3VpbnQzMiBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3VpbnQzMiAqIGxocywga21wX3VpbnQzMiByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQzMiAgX19rbXBjX2F0b21pY19maXhlZDRfbXVsX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgKiBsaHMsIGttcF9pbnQzMiAgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50MzIgIF9fa21wY19hdG9taWNfZml4ZWQ0X29yYl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgICogbGhzLCBrbXBfaW50MzIgIHJocywgaW50IGZsYWcpOwora21wX2ludDMyICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaGxfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICAqIGxocywga21wX2ludDMyICByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQzMiAgX19rbXBjX2F0b21pY19maXhlZDRfc2hyX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgKiBsaHMsIGttcF9pbnQzMiAgcmhzLCBpbnQgZmxhZyk7CitrbXBfdWludDMyIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHJfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDMyICogbGhzLCBrbXBfdWludDMyIHJocywgaW50IGZsYWcpOwora21wX2ludDMyICBfX2ttcGNfYXRvbWljX2ZpeGVkNF94b3JfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICAqIGxocywga21wX2ludDMyICByaHMsIGludCBmbGFnKTsKKy8vIDgtYnl0ZSBmaXhlZAora21wX2ludDY0ICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hbmRiX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICAqIGxocywga21wX2ludDY0ICByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQ2NCAgX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAgKiBsaHMsIGttcF9pbnQ2NCAgcmhzLCBpbnQgZmxhZyk7CitrbXBfdWludDY0IF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDY0ICogbGhzLCBrbXBfdWludDY0IHJocywgaW50IGZsYWcpOwora21wX2ludDY0ICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tdWxfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICAqIGxocywga21wX2ludDY0ICByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQ2NCAgX19rbXBjX2F0b21pY19maXhlZDhfb3JiX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAgKiBsaHMsIGttcF9pbnQ2NCAgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50NjQgIF9fa21wY19hdG9taWNfZml4ZWQ4X3NobF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgICogbGhzLCBrbXBfaW50NjQgIHJocywgaW50IGZsYWcpOwora21wX2ludDY0ICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaHJfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICAqIGxocywga21wX2ludDY0ICByaHMsIGludCBmbGFnKTsKK2ttcF91aW50NjQgX19rbXBjX2F0b21pY19maXhlZDh1X3Nocl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50NjQgKiBsaHMsIGttcF91aW50NjQgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50NjQgIF9fa21wY19hdG9taWNfZml4ZWQ4X3hvcl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgICogbGhzLCBrbXBfaW50NjQgIHJocywgaW50IGZsYWcpOworLy8gNC1ieXRlIGZsb2F0CitrbXBfcmVhbDMyIF9fa21wY19hdG9taWNfZmxvYXQ0X2Rpdl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBrbXBfcmVhbDMyIHJocywgaW50IGZsYWcpOwora21wX3JlYWwzMiBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tdWxfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAqIGxocywga21wX3JlYWwzMiByaHMsIGludCBmbGFnKTsKKy8vIDgtYnl0ZSBmbG9hdAora21wX3JlYWw2NCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWw2NCAqIGxocywga21wX3JlYWw2NCByaHMsIGludCBmbGFnKTsKK2ttcF9yZWFsNjQgX19rbXBjX2F0b21pY19mbG9hdDhfbXVsX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsNjQgKiBsaHMsIGttcF9yZWFsNjQgcmhzLCBpbnQgZmxhZyk7CisvLyAxLSwgMi0sIDQtLCA4LWJ5dGUgbG9naWNhbCAoJiYsIHx8KQorY2hhciAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGxfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICAgICAgKiBsaHMsIGNoYXIgICAgICByaHMsIGludCBmbGFnKTsKK2NoYXIgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmxfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAgICAgICogbGhzLCBjaGFyICAgICAgcmhzLCBpbnQgZmxhZyk7CitzaG9ydCAgICAgX19rbXBjX2F0b21pY19maXhlZDJfYW5kbF9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICAgICAqIGxocywgc2hvcnQgICAgIHJocywgaW50IGZsYWcpOworc2hvcnQgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX29ybF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAgICAgKiBsaHMsIHNob3J0ICAgICByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQzMiBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hbmRsX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50MzIgX19rbXBjX2F0b21pY19maXhlZDRfb3JsX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocywgaW50IGZsYWcpOwora21wX2ludDY0IF9fa21wY19hdG9taWNfZml4ZWQ4X2FuZGxfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQ2NCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9vcmxfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzLCBpbnQgZmxhZyk7CisvLyBNSU4gLyBNQVgKK2NoYXIgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX21heF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICAgICAgKiBsaHMsIGNoYXIgICAgICByaHMsIGludCBmbGFnKTsKK2NoYXIgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX21pbl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICAgICAgKiBsaHMsIGNoYXIgICAgICByaHMsIGludCBmbGFnKTsKK3Nob3J0ICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX21heF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAgICAgKiBsaHMsIHNob3J0ICAgICByaHMsIGludCBmbGFnKTsKK3Nob3J0ICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX21pbl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAgICAgKiBsaHMsIHNob3J0ICAgICByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQzMiAgIF9fa21wY19hdG9taWNfZml4ZWQ0X21heF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQzMiAgIF9fa21wY19hdG9taWNfZml4ZWQ0X21pbl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQ2NCAgIF9fa21wY19hdG9taWNfZml4ZWQ4X21heF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQ2NCAgIF9fa21wY19hdG9taWNfZml4ZWQ4X21pbl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMsIGludCBmbGFnKTsKK2ttcF9yZWFsMzIgIF9fa21wY19hdG9taWNfZmxvYXQ0X21heF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBrbXBfcmVhbDMyIHJocywgaW50IGZsYWcpOwora21wX3JlYWwzMiAgX19rbXBjX2F0b21pY19mbG9hdDRfbWluX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgKiBsaHMsIGttcF9yZWFsMzIgcmhzLCBpbnQgZmxhZyk7CitrbXBfcmVhbDY0ICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tYXhfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWw2NCAqIGxocywga21wX3JlYWw2NCByaHMsIGludCBmbGFnKTsKK2ttcF9yZWFsNjQgIF9fa21wY19hdG9taWNfZmxvYXQ4X21pbl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDY0ICogbGhzLCBrbXBfcmVhbDY0IHJocywgaW50IGZsYWcpOworI2lmIEtNUF9IQVZFX1FVQUQKK1FVQURfTEVHQUNZIF9fa21wY19hdG9taWNfZmxvYXQxNl9tYXhfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBRVUFEX0xFR0FDWSAqIGxocywgUVVBRF9MRUdBQ1kgcmhzLCBpbnQgZmxhZyk7CitRVUFEX0xFR0FDWSBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWluX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKiBsaHMsIFFVQURfTEVHQUNZIHJocywgaW50IGZsYWcpOworI2VuZGlmCisvLyAuTkVRVi4gKHNhbWUgYXMgeG9yKQorY2hhciAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX25lcXZfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICAgICAgKiBsaHMsIGNoYXIgICAgICByaHMsIGludCBmbGFnKTsKK3Nob3J0ICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9uZXF2X2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgICAgICogbGhzLCBzaG9ydCAgICAgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50MzIgX19rbXBjX2F0b21pY19maXhlZDRfbmVxdl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocywgaW50IGZsYWcpOwora21wX2ludDY0IF9fa21wY19hdG9taWNfZml4ZWQ4X25lcXZfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMsIGludCBmbGFnKTsKKy8vIC5FUVYuIChzYW1lIGFzIH54b3IpCitjaGFyICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfZXF2X2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgICAgICAqIGxocywgY2hhciAgICAgIHJocywgaW50IGZsYWcpOworc2hvcnQgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2Vxdl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAgICAgKiBsaHMsIHNob3J0ICAgICByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQzMiBfX2ttcGNfYXRvbWljX2ZpeGVkNF9lcXZfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50NjQgX19rbXBjX2F0b21pY19maXhlZDhfZXF2X2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocywgaW50IGZsYWcpOworLy8gbG9uZyBkb3VibGUgdHlwZQorbG9uZyBkb3VibGUgX19rbXBjX2F0b21pY19mbG9hdDEwX2FkZF9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGxvbmcgZG91YmxlICogbGhzLCBsb25nIGRvdWJsZSByaHMsIGludCBmbGFnKTsKK2xvbmcgZG91YmxlIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWJfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgbG9uZyBkb3VibGUgcmhzLCBpbnQgZmxhZyk7Citsb25nIGRvdWJsZSBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfbXVsX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgbG9uZyBkb3VibGUgKiBsaHMsIGxvbmcgZG91YmxlIHJocywgaW50IGZsYWcpOworbG9uZyBkb3VibGUgX19rbXBjX2F0b21pY19mbG9hdDEwX2Rpdl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGxvbmcgZG91YmxlICogbGhzLCBsb25nIGRvdWJsZSByaHMsIGludCBmbGFnKTsKKyNpZiBLTVBfSEFWRV9RVUFECisvLyBfUXVhZCB0eXBlCitRVUFEX0xFR0FDWSBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYWRkX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKiBsaHMsIFFVQURfTEVHQUNZIHJocywgaW50IGZsYWcpOworUVVBRF9MRUdBQ1kgX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFFVQURfTEVHQUNZICogbGhzLCBRVUFEX0xFR0FDWSByaHMsIGludCBmbGFnKTsKK1FVQURfTEVHQUNZIF9fa21wY19hdG9taWNfZmxvYXQxNl9tdWxfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBRVUFEX0xFR0FDWSAqIGxocywgUVVBRF9MRUdBQ1kgcmhzLCBpbnQgZmxhZyk7CitRVUFEX0xFR0FDWSBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKiBsaHMsIFFVQURfTEVHQUNZIHJocywgaW50IGZsYWcpOworI2VuZGlmCisvLyByb3V0aW5lcyBmb3IgY29tcGxleCB0eXBlcworLy8gV29ya2Fyb3VuZCBmb3IgY21wbHg0IHJvdXRpbmVzIC0gcmV0dXJuIHZvaWQ7IGNhcHR1cmVkIHZhbHVlIGlzIHJldHVybmVkIHZpYSB0aGUgYXJndW1lbnQKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDRfYWRkX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHgzMiByaHMsIGttcF9jbXBseDMyICogb3V0LCBpbnQgZmxhZyk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg0X3N1Yl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4MzIgcmhzLCBrbXBfY21wbHgzMiAqIG91dCwgaW50IGZsYWcpOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4NF9tdWxfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MzIgKiBsaHMsIGttcF9jbXBseDMyIHJocywga21wX2NtcGx4MzIgKiBvdXQsIGludCBmbGFnKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDRfZGl2X2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHgzMiByaHMsIGttcF9jbXBseDMyICogb3V0LCBpbnQgZmxhZyk7CisKK2ttcF9jbXBseDY0IF9fa21wY19hdG9taWNfY21wbHg4X2FkZF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg2NCAqIGxocywga21wX2NtcGx4NjQgcmhzLCBpbnQgZmxhZyk7CitrbXBfY21wbHg2NCBfX2ttcGNfYXRvbWljX2NtcGx4OF9zdWJfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4NjQgKiBsaHMsIGttcF9jbXBseDY0IHJocywgaW50IGZsYWcpOwora21wX2NtcGx4NjQgX19rbXBjX2F0b21pY19jbXBseDhfbXVsX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDY0ICogbGhzLCBrbXBfY21wbHg2NCByaHMsIGludCBmbGFnKTsKK2ttcF9jbXBseDY0IF9fa21wY19hdG9taWNfY21wbHg4X2Rpdl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg2NCAqIGxocywga21wX2NtcGx4NjQgcmhzLCBpbnQgZmxhZyk7CitrbXBfY21wbHg4MCBfX2ttcGNfYXRvbWljX2NtcGx4MTBfYWRkX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4ODAgKiBsaHMsIGttcF9jbXBseDgwIHJocywgaW50IGZsYWcpOwora21wX2NtcGx4ODAgX19rbXBjX2F0b21pY19jbXBseDEwX3N1Yl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDgwICogbGhzLCBrbXBfY21wbHg4MCByaHMsIGludCBmbGFnKTsKK2ttcF9jbXBseDgwIF9fa21wY19hdG9taWNfY21wbHgxMF9tdWxfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg4MCAqIGxocywga21wX2NtcGx4ODAgcmhzLCBpbnQgZmxhZyk7CitrbXBfY21wbHg4MCBfX2ttcGNfYXRvbWljX2NtcGx4MTBfZGl2X2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4ODAgKiBsaHMsIGttcF9jbXBseDgwIHJocywgaW50IGZsYWcpOworI2lmIEtNUF9IQVZFX1FVQUQKK0NQTFgxMjhfTEVHIF9fa21wY19hdG9taWNfY21wbHgxNl9hZGRfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBDUExYMTI4X0xFRyAqIGxocywgQ1BMWDEyOF9MRUcgcmhzLCBpbnQgZmxhZyk7CitDUExYMTI4X0xFRyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgQ1BMWDEyOF9MRUcgKiBsaHMsIENQTFgxMjhfTEVHIHJocywgaW50IGZsYWcpOworQ1BMWDEyOF9MRUcgX19rbXBjX2F0b21pY19jbXBseDE2X211bF9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIENQTFgxMjhfTEVHICogbGhzLCBDUExYMTI4X0xFRyByaHMsIGludCBmbGFnKTsKK0NQTFgxMjhfTEVHIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBDUExYMTI4X0xFRyAqIGxocywgQ1BMWDEyOF9MRUcgcmhzLCBpbnQgZmxhZyk7CisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIC8vIFJvdXRpbmVzIHdpdGggMTYtYnl0ZSBhcmd1bWVudHMgYWxpZ25lZCB0byAxNi1ieXRlIGJvdW5kYXJ5CisgICAgUXVhZF9hMTZfdCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYWRkX2ExNl9jcHQoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBRdWFkX2ExNl90ICogbGhzLCBRdWFkX2ExNl90IHJocywgaW50IGZsYWcpOworICAgIFF1YWRfYTE2X3QgX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9hMTZfY3B0KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAqIGxocywgUXVhZF9hMTZfdCByaHMsIGludCBmbGFnKTsKKyAgICBRdWFkX2ExNl90IF9fa21wY19hdG9taWNfZmxvYXQxNl9tdWxfYTE2X2NwdCggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIFF1YWRfYTE2X3QgKiBsaHMsIFF1YWRfYTE2X3QgcmhzLCBpbnQgZmxhZyk7CisgICAgUXVhZF9hMTZfdCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2ExNl9jcHQoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBRdWFkX2ExNl90ICogbGhzLCBRdWFkX2ExNl90IHJocywgaW50IGZsYWcpOworICAgIFF1YWRfYTE2X3QgX19rbXBjX2F0b21pY19mbG9hdDE2X21heF9hMTZfY3B0KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAqIGxocywgUXVhZF9hMTZfdCByaHMsIGludCBmbGFnKTsKKyAgICBRdWFkX2ExNl90IF9fa21wY19hdG9taWNfZmxvYXQxNl9taW5fYTE2X2NwdCggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIFF1YWRfYTE2X3QgKiBsaHMsIFF1YWRfYTE2X3QgcmhzLCBpbnQgZmxhZyk7CisgICAga21wX2NtcGx4MTI4X2ExNl90IF9fa21wY19hdG9taWNfY21wbHgxNl9hZGRfYTE2X2NwdCggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDEyOF9hMTZfdCAqIGxocywga21wX2NtcGx4MTI4X2ExNl90IHJocywgaW50IGZsYWcpOworICAgIGttcF9jbXBseDEyOF9hMTZfdCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2ExNl9jcHQoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgxMjhfYTE2X3QgKiBsaHMsIGttcF9jbXBseDEyOF9hMTZfdCByaHMsIGludCBmbGFnKTsKKyAgICBrbXBfY21wbHgxMjhfYTE2X3QgX19rbXBjX2F0b21pY19jbXBseDE2X211bF9hMTZfY3B0KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MTI4X2ExNl90ICogbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgcmhzLCBpbnQgZmxhZyk7CisgICAga21wX2NtcGx4MTI4X2ExNl90IF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfYTE2X2NwdCggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDEyOF9hMTZfdCAqIGxocywga21wX2NtcGx4MTI4X2ExNl90IHJocywgaW50IGZsYWcpOworI2VuZGlmCisjZW5kaWYKKwordm9pZCBfX2ttcGNfYXRvbWljX3N0YXJ0KHZvaWQpOwordm9pZCBfX2ttcGNfYXRvbWljX2VuZCh2b2lkKTsKKworI2lmIE9NUF80MF9FTkFCTEVECisKKy8vIE9wZW5NUCA0LjA6IHYgPSB4ID0gZXhwciBiaW5vcCB4OyB7IHYgPSB4OyB4ID0gZXhwciBiaW5vcCB4OyB9IHsgeCA9IGV4cHIgYmlub3AgeDsgdiA9IHg7IH0gIGZvciBub24tY29tbXV0YXRpdmUgb3BlcmF0aW9ucy4KKworY2hhcgkgICAgICAgCV9fa21wY19hdG9taWNfZml4ZWQxX3N1Yl9jcHRfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMsIGludCBmbGFnICk7CitjaGFyCQlfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzLCBpbnQgZmxhZyApOwordW5zaWduZWQgY2hhciAJX19rbXBjX2F0b21pY19maXhlZDF1X2Rpdl9jcHRfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBjaGFyICogbGhzLCB1bnNpZ25lZCBjaGFyIHJocywgaW50IGZsYWcgKTsKK2NoYXIgCQlfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaGxfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzICwgaW50IGZsYWcpOworY2hhcgkJX19rbXBjX2F0b21pY19maXhlZDFfc2hyX2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocywgaW50IGZsYWcgKTsKK3Vuc2lnbmVkIGNoYXIgCV9fa21wY19hdG9taWNfZml4ZWQxdV9zaHJfY3B0X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgY2hhciAqIGxocywgdW5zaWduZWQgY2hhciByaHMsIGludCBmbGFnICk7CitzaG9ydCAJCV9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9jcHRfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocywgaW50IGZsYWcgKTsKK3Nob3J0IAkJX19rbXBjX2F0b21pY19maXhlZDJfZGl2X2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzLCBpbnQgZmxhZyApOwordW5zaWduZWQgc2hvcnQgCV9fa21wY19hdG9taWNfZml4ZWQydV9kaXZfY3B0X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgc2hvcnQgKiBsaHMsIHVuc2lnbmVkIHNob3J0IHJocywgaW50IGZsYWcgKTsKK3Nob3J0IAkJX19rbXBjX2F0b21pY19maXhlZDJfc2hsX2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzLCBpbnQgZmxhZyApOworc2hvcnQgCQlfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaHJfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMsIGludCBmbGFnICk7Cit1bnNpZ25lZCBzaG9ydCAJX19rbXBjX2F0b21pY19maXhlZDJ1X3Nocl9jcHRfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBzaG9ydCAqIGxocywgdW5zaWduZWQgc2hvcnQgcmhzLCBpbnQgZmxhZyApOwora21wX2ludDMyIAlfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWJfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgKiBsaHMsIGttcF9pbnQzMiAgcmhzLCBpbnQgZmxhZyApOwora21wX2ludDMyIAlfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgKiBsaHMsIGttcF9pbnQzMiAgcmhzLCBpbnQgZmxhZyApOwora21wX3VpbnQzMiAJX19rbXBjX2F0b21pY19maXhlZDR1X2Rpdl9jcHRfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDMyICogbGhzLCBrbXBfdWludDMyIHJocywgaW50IGZsYWcgKTsKK2ttcF9pbnQzMiAJX19rbXBjX2F0b21pY19maXhlZDRfc2hsX2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgICogbGhzLCBrbXBfaW50MzIgIHJocywgaW50IGZsYWcgKTsKK2ttcF9pbnQzMiAJX19rbXBjX2F0b21pY19maXhlZDRfc2hyX2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgICogbGhzLCBrbXBfaW50MzIgIHJocywgaW50IGZsYWcgKTsKK2ttcF91aW50MzIgCV9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHJfY3B0X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3VpbnQzMiAqIGxocywga21wX3VpbnQzMiByaHMsIGludCBmbGFnICk7CitrbXBfaW50NjQgCV9fa21wY19hdG9taWNfZml4ZWQ4X3N1Yl9jcHRfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICAqIGxocywga21wX2ludDY0ICByaHMsIGludCBmbGFnICk7CitrbXBfaW50NjQgCV9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9jcHRfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICAqIGxocywga21wX2ludDY0ICByaHMsIGludCBmbGFnICk7CitrbXBfdWludDY0ICAgICAgX19rbXBjX2F0b21pY19maXhlZDh1X2Rpdl9jcHRfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDY0ICogbGhzLCBrbXBfdWludDY0IHJocywgaW50IGZsYWcgKTsKK2ttcF9pbnQ2NCAJX19rbXBjX2F0b21pY19maXhlZDhfc2hsX2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgICogbGhzLCBrbXBfaW50NjQgIHJocywgaW50IGZsYWcgKTsKK2ttcF9pbnQ2NCAJX19rbXBjX2F0b21pY19maXhlZDhfc2hyX2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgICogbGhzLCBrbXBfaW50NjQgIHJocywgaW50IGZsYWcgKTsKK2ttcF91aW50NjQgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc2hyX2NwdF9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50NjQgKiBsaHMsIGttcF91aW50NjQgcmhzLCBpbnQgZmxhZyApOworZmxvYXQgCQlfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGZsb2F0ICogbGhzLCBmbG9hdCByaHMsIGludCBmbGFnICk7CitmbG9hdCAJCV9fa21wY19hdG9taWNfZmxvYXQ0X2Rpdl9jcHRfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgZmxvYXQgKiBsaHMsIGZsb2F0IHJocywgaW50IGZsYWcgKTsKK2RvdWJsZSAJCV9fa21wY19hdG9taWNfZmxvYXQ4X3N1Yl9jcHRfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgZG91YmxlICogbGhzLCBkb3VibGUgcmhzLCBpbnQgZmxhZyApOworZG91YmxlIAkJX19rbXBjX2F0b21pY19mbG9hdDhfZGl2X2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBkb3VibGUgKiBsaHMsIGRvdWJsZSByaHMsIGludCBmbGFnICk7Citsb25nIGRvdWJsZSAJX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9jcHRfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgbG9uZyBkb3VibGUgcmhzLCBpbnQgZmxhZyApOworbG9uZyBkb3VibGUgCV9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfY3B0X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgbG9uZyBkb3VibGUgKiBsaHMsIGxvbmcgZG91YmxlIHJocywgaW50IGZsYWcgKTsKKyNpZiBLTVBfSEFWRV9RVUFECitRVUFEX0xFR0FDWQlfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2NwdF9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFFVQURfTEVHQUNZICogbGhzLCBRVUFEX0xFR0FDWSByaHMsIGludCBmbGFnICk7CitRVUFEX0xFR0FDWQlfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2NwdF9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFFVQURfTEVHQUNZICogbGhzLCBRVUFEX0xFR0FDWSByaHMsIGludCBmbGFnICk7CisjZW5kaWYKKy8vIFdvcmthcm91bmQgZm9yIGNtcGx4NCByb3V0aW5lcyAtIHJldHVybiB2b2lkOyBjYXB0dXJlZCB2YWx1ZSBpcyByZXR1cm5lZCB2aWEgdGhlIGFyZ3VtZW50Cit2b2lkICAgICAJX19rbXBjX2F0b21pY19jbXBseDRfc3ViX2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4MzIgcmhzLCBrbXBfY21wbHgzMiAqIG91dCwgaW50IGZsYWcgKTsKK3ZvaWQgCSAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDRfZGl2X2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4MzIgcmhzLCBrbXBfY21wbHgzMiAqIG91dCwgaW50IGZsYWcgKTsKK2ttcF9jbXBseDY0IAlfX2ttcGNfYXRvbWljX2NtcGx4OF9zdWJfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDY0ICogbGhzLCBrbXBfY21wbHg2NCByaHMsIGludCBmbGFnICk7CitrbXBfY21wbHg2NCAJX19rbXBjX2F0b21pY19jbXBseDhfZGl2X2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg2NCAqIGxocywga21wX2NtcGx4NjQgcmhzLCBpbnQgZmxhZyApOwora21wX2NtcGx4ODAgCV9fa21wY19hdG9taWNfY21wbHgxMF9zdWJfY3B0X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4ODAgKiBsaHMsIGttcF9jbXBseDgwIHJocywgaW50IGZsYWcgKTsKK2ttcF9jbXBseDgwIAlfX2ttcGNfYXRvbWljX2NtcGx4MTBfZGl2X2NwdF9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDgwICogbGhzLCBrbXBfY21wbHg4MCByaHMsIGludCBmbGFnICk7CisjaWYgS01QX0hBVkVfUVVBRAorQ1BMWDEyOF9MRUcgIAlfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2NwdF9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIENQTFgxMjhfTEVHICogbGhzLCBDUExYMTI4X0xFRyByaHMsIGludCBmbGFnICk7CitDUExYMTI4X0xFRyAgCV9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfY3B0X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgQ1BMWDEyOF9MRUcgKiBsaHMsIENQTFgxMjhfTEVHIHJocywgaW50IGZsYWcgKTsKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgUXVhZF9hMTZfdCAJCV9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfYTE2X2NwdF9yZXYoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBRdWFkX2ExNl90ICogbGhzLCBRdWFkX2ExNl90IHJocywgaW50IGZsYWcgKTsKKyAgICBRdWFkX2ExNl90CQlfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2ExNl9jcHRfcmV2KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAqIGxocywgUXVhZF9hMTZfdCByaHMsIGludCBmbGFnICk7CisgICAga21wX2NtcGx4MTI4X2ExNl90IAlfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2ExNl9jcHRfcmV2KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MTI4X2ExNl90ICogbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgcmhzLCBpbnQgZmxhZyApOworICAgIGttcF9jbXBseDEyOF9hMTZfdCAJX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9hMTZfY3B0X3JldiggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDEyOF9hMTZfdCAqIGxocywga21wX2NtcGx4MTI4X2ExNl90IHJocywgaW50IGZsYWcgKTsKKyNlbmRpZgorI2VuZGlmCisKKy8vICAgT3Blbk1QIDQuMCBDYXB0dXJlLXdyaXRlIChzd2FwKToge3YgPSB4OyB4ID0gZXhwcjt9CitjaGFyIAkJX19rbXBjX2F0b21pY19maXhlZDFfc3dwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAgICAgICAgKiBsaHMsIGNoYXIgICAgICAgIHJocyApOworc2hvcnQgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3N3cCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICAgICAgICogbGhzLCBzaG9ydCAgICAgICByaHMgKTsKK2ttcF9pbnQzMiAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zd3AoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgICAqIGxocywga21wX2ludDMyICAgcmhzICk7CitrbXBfaW50NjQgCV9fa21wY19hdG9taWNfZml4ZWQ4X3N3cCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAgICogbGhzLCBrbXBfaW50NjQgICByaHMgKTsKK2Zsb2F0IAkJX19rbXBjX2F0b21pY19mbG9hdDRfc3dwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgZmxvYXQgICAgICAgKiBsaHMsIGZsb2F0ICByaHMgKTsKK2RvdWJsZQkJX19rbXBjX2F0b21pY19mbG9hdDhfc3dwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgZG91YmxlICAgICAgKiBsaHMsIGRvdWJsZSAgcmhzICk7Citsb25nIGRvdWJsZQlfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3dwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgbG9uZyBkb3VibGUgcmhzICk7CisjaWYgS01QX0hBVkVfUVVBRAorUVVBRF9MRUdBQ1kgICAgCV9fa21wY19hdG9taWNfZmxvYXQxNl9zd3AoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFFVQURfTEVHQUNZICogbGhzLCBRVUFEX0xFR0FDWSByaHMgKTsKKyNlbmRpZgorLy8gISEhIFRPRE86IGNoZWNrIGlmIHdlIG5lZWQgYSB3b3JrYXJvdW5kIGhlcmUKK3ZvaWQgICAgICAgIAlfX2ttcGNfYXRvbWljX2NtcGx4NF9zd3AoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4MzIgcmhzLCBrbXBfY21wbHgzMiAqIG91dCApOworLy9rbXBfY21wbHgzMiAgIAlfX2ttcGNfYXRvbWljX2NtcGx4NF9zd3AoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4MzIgcmhzICk7CisKK2ttcF9jbXBseDY0IAlfX2ttcGNfYXRvbWljX2NtcGx4OF9zd3AoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg2NCAqIGxocywga21wX2NtcGx4NjQgcmhzICk7CitrbXBfY21wbHg4MAlfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3dwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg4MCAqIGxocywga21wX2NtcGx4ODAgcmhzICk7CisjaWYgS01QX0hBVkVfUVVBRAorQ1BMWDEyOF9MRUcgCV9fa21wY19hdG9taWNfY21wbHgxNl9zd3AoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIENQTFgxMjhfTEVHICogbGhzLCBDUExYMTI4X0xFRyByaHMgKTsKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgUXVhZF9hMTZfdAkJX19rbXBjX2F0b21pY19mbG9hdDE2X2ExNl9zd3AoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFF1YWRfYTE2X3QgKiBsaHMsIFF1YWRfYTE2X3QgcmhzICk7CisgICAga21wX2NtcGx4MTI4X2ExNl90IAlfX2ttcGNfYXRvbWljX2NtcGx4MTZfYTE2X3N3cCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MTI4X2ExNl90ICogbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgcmhzICk7CisjZW5kaWYKKyNlbmRpZgorCisvLyBFbmQgb2YgT3Blbk1QIDQuMCBjYXB0dXJlCisKKyNlbmRpZiAvL09NUF80MF9FTkFCTEVECisKKyNlbmRpZiAvL0tNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgfSAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmIC8qIEtNUF9BVE9NSUNfSCAqLworCisvLyBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2JhcnJpZXIuY3BwIGIvZmluYWwvcnVudGltZS9zcmMva21wX2JhcnJpZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YzczMjEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfYmFycmllci5jcHAKQEAgLTAsMCArMSwxNzQyIEBACisvKgorICoga21wX2JhcnJpZXIuY3BwCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfd2FpdF9yZWxlYXNlLmgiCisjaW5jbHVkZSAia21wX3N0YXRzLmgiCisjaW5jbHVkZSAia21wX2l0dC5oIgorI2luY2x1ZGUgImttcF9vcy5oIgorCisKKyNpZiBLTVBfTUlDCisjaW5jbHVkZSA8aW1taW50cmluLmg+CisjZGVmaW5lIFVTRV9OR09fU1RPUkVTIDEKKyNlbmRpZiAvLyBLTVBfTUlDCisKKyNpZiBLTVBfTUlDICYmIFVTRV9OR09fU1RPUkVTCisvLyBJQ1YgY29weWluZworI2RlZmluZSBuZ29fbG9hZChzcmMpICAgICAgICAgICAgX19tNTEyZCBWdCA9IF9tbTUxMl9sb2FkX3BkKCh2b2lkICopKHNyYykpCisjZGVmaW5lIG5nb19zdG9yZV9pY3ZzKGRzdCwgc3JjKSBfbW01MTJfc3RvcmVucm5nb19wZCgodm9pZCAqKShkc3QpLCBWdCkKKyNkZWZpbmUgbmdvX3N0b3JlX2dvKGRzdCwgc3JjKSAgIF9tbTUxMl9zdG9yZW5ybmdvX3BkKCh2b2lkICopKGRzdCksIFZ0KQorI2RlZmluZSBuZ29fc3luYygpICAgICAgICAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoImxvY2s7IGFkZGwgJDAsMCglJXJzcCkiIDo6OiAibWVtb3J5IikKKyNlbHNlCisjZGVmaW5lIG5nb19sb2FkKHNyYykgICAgICAgICAgICAoKHZvaWQpMCkKKyNkZWZpbmUgbmdvX3N0b3JlX2ljdnMoZHN0LCBzcmMpIGNvcHlfaWN2cygoZHN0KSwgKHNyYykpCisjZGVmaW5lIG5nb19zdG9yZV9nbyhkc3QsIHNyYykgICBLTVBfTUVNQ1BZKChkc3QpLCAoc3JjKSwgQ0FDSEVfTElORSkKKyNkZWZpbmUgbmdvX3N5bmMoKSAgICAgICAgICAgICAgICgodm9pZCkwKQorI2VuZGlmIC8qIEtNUF9NSUMgJiYgVVNFX05HT19TVE9SRVMgKi8KKwordm9pZCBfX2ttcF9wcmludF9zdHJ1Y3R1cmUodm9pZCk7IC8vIEZvcndhcmQgZGVjbGFyYXRpb24KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCYXJyaWVyIEFsZ29yaXRobXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBMaW5lYXIgQmFycmllcgorc3RhdGljIHZvaWQKK19fa21wX2xpbmVhcl9iYXJyaWVyX2dhdGhlcihlbnVtIGJhcnJpZXJfdHlwZSBidCwga21wX2luZm9fdCAqdGhpc190aHIsIGludCBndGlkLCBpbnQgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpyZWR1Y2UpKHZvaWQgKiwgdm9pZCAqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKHZvaWQgKiBpdHRfc3luY19vYmopICkKK3sKKyAgICBLTVBfVElNRV9ERVZFTE9QRVJfQkxPQ0soS01QX2xpbmVhcl9nYXRoZXIpOworICAgIHJlZ2lzdGVyIGttcF90ZWFtX3QgKnRlYW0gPSB0aGlzX3Roci0+dGgudGhfdGVhbTsKKyAgICByZWdpc3RlciBrbXBfYnN0YXRlX3QgKnRocl9iYXIgPSAmIHRoaXNfdGhyLT50aC50aF9iYXJbYnRdLmJiOworICAgIHJlZ2lzdGVyIGttcF9pbmZvX3QgKipvdGhlcl90aHJlYWRzID0gdGVhbS0+dC50X3RocmVhZHM7CisKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9saW5lYXJfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIGVudGVyIGZvciBiYXJyaWVyIHR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgYnQpKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRoaXNfdGhyID09IG90aGVyX3RocmVhZHNbdGhpc190aHItPnRoLnRoX2luZm8uZHMuZHNfdGlkXSk7CisKKyNpZiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZCisgICAgLy8gQmFycmllciBpbWJhbGFuY2UgLSBzYXZlIGFycml2ZSB0aW1lIHRvIHRoZSB0aHJlYWQKKyAgICBpZihfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9PSAzIHx8IF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDIpIHsKKyAgICAgICAgdGhpc190aHItPnRoLnRoX2Jhcl9hcnJpdmVfdGltZSA9IHRoaXNfdGhyLT50aC50aF9iYXJfbWluX3RpbWUgPSBfX2l0dF9nZXRfdGltZXN0YW1wKCk7CisgICAgfQorI2VuZGlmCisgICAgLy8gV2Ugbm93IHBlcmZvcm0gYSBsaW5lYXIgcmVkdWN0aW9uIHRvIHNpZ25hbCB0aGF0IGFsbCBvZiB0aGUgdGhyZWFkcyBoYXZlIGFycml2ZWQuCisgICAgaWYgKCFLTVBfTUFTVEVSX1RJRCh0aWQpKSB7CisgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2xpbmVhcl9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgcmVsZWFzaW5nIFQjJWQoJWQ6JWQpIgorICAgICAgICAgICAgICAgICAgICAgICJhcnJpdmVkKCVwKTogJWxsdSA9PiAlbGx1XG4iLCBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGlkKDAsIHRlYW0pLCB0ZWFtLT50LnRfaWQsIDAsICZ0aHJfYmFyLT5iX2Fycml2ZWQsCisgICAgICAgICAgICAgICAgICAgICAgdGhyX2Jhci0+Yl9hcnJpdmVkLCB0aHJfYmFyLT5iX2Fycml2ZWQgKyBLTVBfQkFSUklFUl9TVEFURV9CVU1QKSk7CisgICAgICAgIC8vIE1hcmsgYXJyaXZhbCB0byBtYXN0ZXIgdGhyZWFkCisgICAgICAgIC8qIEFmdGVyIHBlcmZvcm1pbmcgdGhpcyB3cml0ZSwgYSB3b3JrZXIgdGhyZWFkIG1heSBub3QgYXNzdW1lIHRoYXQgdGhlIHRlYW0gaXMgdmFsaWQKKyAgICAgICAgICAgYW55IG1vcmUgLSBpdCBjb3VsZCBiZSBkZWFsbG9jYXRlZCBieSB0aGUgbWFzdGVyIHRocmVhZCBhdCBhbnkgdGltZS4gKi8KKyAgICAgICAga21wX2ZsYWdfNjQgZmxhZygmdGhyX2Jhci0+Yl9hcnJpdmVkLCBvdGhlcl90aHJlYWRzWzBdKTsKKyAgICAgICAgZmxhZy5yZWxlYXNlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVnaXN0ZXIga21wX2JhbGlnbl90ZWFtX3QgKnRlYW1fYmFyID0gJnRlYW0tPnQudF9iYXJbYnRdOworICAgICAgICByZWdpc3RlciBpbnQgbnByb2MgPSB0aGlzX3Roci0+dGgudGhfdGVhbV9ucHJvYzsKKyAgICAgICAgcmVnaXN0ZXIgaW50IGk7CisgICAgICAgIC8vIERvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgc2xlZXAgYml0IGhlcmUgb3IgYXRvbWljIHNpbmNlIHRlYW0gc2V0dGluZworICAgICAgICByZWdpc3RlciBrbXBfdWludDY0IG5ld19zdGF0ZSA9IHRlYW1fYmFyLT5iX2Fycml2ZWQgKyBLTVBfQkFSUklFUl9TVEFURV9CVU1QOworCisgICAgICAgIC8vIENvbGxlY3QgYWxsIHRoZSB3b3JrZXIgdGVhbSBtZW1iZXIgdGhyZWFkcy4KKyAgICAgICAgZm9yIChpPTE7IGk8bnByb2M7ICsraSkgeworI2lmIEtNUF9DQUNIRV9NQU5BR0UKKyAgICAgICAgICAgIC8vIFByZWZldGNoIG5leHQgdGhyZWFkJ3MgYXJyaXZlZCBjb3VudAorICAgICAgICAgICAgaWYgKGkrMSA8IG5wcm9jKQorICAgICAgICAgICAgICAgIEtNUF9DQUNIRV9QUkVGRVRDSCgmb3RoZXJfdGhyZWFkc1tpKzFdLT50aC50aF9iYXJbYnRdLmJiLmJfYXJyaXZlZCk7CisjZW5kaWYgLyogS01QX0NBQ0hFX01BTkFHRSAqLworICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfbGluZWFyX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSB3YWl0IFQjJWQoJWQ6JWQpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImFycml2ZWQoJXApID09ICVsbHVcbiIsIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aWQoaSwgdGVhbSksIHRlYW0tPnQudF9pZCwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfYmFyW2J0XS5iYi5iX2Fycml2ZWQsIG5ld19zdGF0ZSkpOworCisgICAgICAgICAgICAvLyBXYWl0IGZvciB3b3JrZXIgdGhyZWFkIHRvIGFycml2ZQorICAgICAgICAgICAga21wX2ZsYWdfNjQgZmxhZygmb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfYmFyW2J0XS5iYi5iX2Fycml2ZWQsIG5ld19zdGF0ZSk7CisgICAgICAgICAgICBmbGFnLndhaXQodGhpc190aHIsIEZBTFNFCisgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworI2lmIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgICAgIC8vIEJhcnJpZXIgaW1iYWxhbmNlIC0gd3JpdGUgbWluIG9mIHRoZSB0aHJlYWQgdGltZSBhbmQgdGhlIG90aGVyIHRocmVhZCB0aW1lIHRvIHRoZSB0aHJlYWQuCisgICAgICAgICAgICBpZiAoX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMikgeworICAgICAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9iYXJfbWluX3RpbWUgPSBLTVBfTUlOKHRoaXNfdGhyLT50aC50aF9iYXJfbWluX3RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfYmFyX21pbl90aW1lKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgaWYgKHJlZHVjZSkgeworICAgICAgICAgICAgICAgIEtBX1RSQUNFKDEwMCwgKCJfX2ttcF9saW5lYXJfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpICs9IFQjJWQoJWQ6JWQpXG4iLCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgdGlkLCBfX2ttcF9ndGlkX2Zyb21fdGlkKGksIHRlYW0pLCB0ZWFtLT50LnRfaWQsIGkpKTsKKyAgICAgICAgICAgICAgICAoKnJlZHVjZSkodGhpc190aHItPnRoLnRoX2xvY2FsLnJlZHVjZV9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcl90aHJlYWRzW2ldLT50aC50aF9sb2NhbC5yZWR1Y2VfZGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gRG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBzbGVlcCBiaXQgaGVyZSBvciBhdG9taWMgc2luY2UgdGVhbSBzZXR0aW5nCisgICAgICAgIHRlYW1fYmFyLT5iX2Fycml2ZWQgPSBuZXdfc3RhdGU7CisgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2xpbmVhcl9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgc2V0IHRlYW0gJWQgYXJyaXZlZCglcCkgPSAlbGx1XG4iLAorICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCB0ZWFtLT50LnRfaWQsICZ0ZWFtX2Jhci0+Yl9hcnJpdmVkLCBuZXdfc3RhdGUpKTsKKyAgICB9CisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfbGluZWFyX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSBleGl0IGZvciBiYXJyaWVyIHR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgYnQpKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2xpbmVhcl9iYXJyaWVyX3JlbGVhc2UoZW51bSBiYXJyaWVyX3R5cGUgYnQsIGttcF9pbmZvX3QgKnRoaXNfdGhyLCBpbnQgZ3RpZCwgaW50IHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByb3BhZ2F0ZV9pY3ZzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKHZvaWQgKml0dF9zeW5jX29iaikgKQoreworICAgIEtNUF9USU1FX0RFVkVMT1BFUl9CTE9DSyhLTVBfbGluZWFyX3JlbGVhc2UpOworICAgIHJlZ2lzdGVyIGttcF9ic3RhdGVfdCAqdGhyX2JhciA9ICZ0aGlzX3Roci0+dGgudGhfYmFyW2J0XS5iYjsKKyAgICByZWdpc3RlciBrbXBfdGVhbV90ICp0ZWFtOworCisgICAgaWYgKEtNUF9NQVNURVJfVElEKHRpZCkpIHsKKyAgICAgICAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGk7CisgICAgICAgIHJlZ2lzdGVyIGttcF91aW50MzIgbnByb2MgPSB0aGlzX3Roci0+dGgudGhfdGVhbV9ucHJvYzsKKyAgICAgICAgcmVnaXN0ZXIga21wX2luZm9fdCAqKm90aGVyX3RocmVhZHM7CisKKyAgICAgICAgdGVhbSA9IF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX3RlYW07CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGVhbSAhPSBOVUxMKTsKKyAgICAgICAgb3RoZXJfdGhyZWFkcyA9IHRlYW0tPnQudF90aHJlYWRzOworCisgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2xpbmVhcl9iYXJyaWVyX3JlbGVhc2U6IFQjJWQoJWQ6JWQpIG1hc3RlciBlbnRlciBmb3IgYmFycmllciB0eXBlICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBidCkpOworCisgICAgICAgIGlmIChucHJvYyA+IDEpIHsKKyNpZiBLTVBfQkFSUklFUl9JQ1ZfUFVTSAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEtNUF9USU1FX0RFVkVMT1BFUl9CTE9DSyhVU0VSX2ljdl9jb3B5KTsKKyAgICAgICAgICAgICAgICBpZiAocHJvcGFnYXRlX2ljdnMpIHsKKyAgICAgICAgICAgICAgICAgICAgbmdvX2xvYWQoJnRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhWzBdLnRkX2ljdnMpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MTsgaTxucHJvYzsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9pbml0X2ltcGxpY2l0X3Rhc2sodGVhbS0+dC50X2lkZW50LCB0ZWFtLT50LnRfdGhyZWFkc1tpXSwgdGVhbSwgaSwgRkFMU0UpOworICAgICAgICAgICAgICAgICAgICAgICAgbmdvX3N0b3JlX2ljdnMoJnRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW2ldLnRkX2ljdnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbMF0udGRfaWN2cyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbmdvX3N5bmMoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisjZW5kaWYgLy8gS01QX0JBUlJJRVJfSUNWX1BVU0gKKworICAgICAgICAgICAgLy8gTm93LCByZWxlYXNlIGFsbCBvZiB0aGUgd29ya2VyIHRocmVhZHMKKyAgICAgICAgICAgIGZvciAoaT0xOyBpPG5wcm9jOyArK2kpIHsKKyNpZiBLTVBfQ0FDSEVfTUFOQUdFCisgICAgICAgICAgICAgICAgLy8gUHJlZmV0Y2ggbmV4dCB0aHJlYWQncyBnbyBmbGFnCisgICAgICAgICAgICAgICAgaWYgKGkrMSA8IG5wcm9jKQorICAgICAgICAgICAgICAgICAgICBLTVBfQ0FDSEVfUFJFRkVUQ0goJm90aGVyX3RocmVhZHNbaSsxXS0+dGgudGhfYmFyW2J0XS5iYi5iX2dvKTsKKyNlbmRpZiAvKiBLTVBfQ0FDSEVfTUFOQUdFICovCisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfbGluZWFyX2JhcnJpZXJfcmVsZWFzZTogVCMlZCglZDolZCkgcmVsZWFzaW5nIFQjJWQoJWQ6JWQpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnbyglcCk6ICV1ID0+ICV1XG4iLCBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCwgdGVhbS0+dC50X2lkLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2JhcltidF0uYmIuYl9nbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2JhcltidF0uYmIuYl9nbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2JhcltidF0uYmIuYl9nbyArIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVApKTsKKyAgICAgICAgICAgICAgICBrbXBfZmxhZ182NCBmbGFnKCZvdGhlcl90aHJlYWRzW2ldLT50aC50aF9iYXJbYnRdLmJiLmJfZ28sIG90aGVyX3RocmVhZHNbaV0pOworICAgICAgICAgICAgICAgIGZsYWcucmVsZWFzZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsgLy8gV2FpdCBmb3IgdGhlIE1BU1RFUiB0aHJlYWQgdG8gcmVsZWFzZSB1cworICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9saW5lYXJfYmFycmllcl9yZWxlYXNlOiBUIyVkIHdhaXQgZ28oJXApID09ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgIGd0aWQsICZ0aHJfYmFyLT5iX2dvLCBLTVBfQkFSUklFUl9TVEFURV9CVU1QKSk7CisgICAgICAgIGttcF9mbGFnXzY0IGZsYWcoJnRocl9iYXItPmJfZ28sIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVApOworICAgICAgICBmbGFnLndhaXQodGhpc190aHIsIFRSVUUKKyAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyNpZiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZCisgICAgICAgIGlmICgoX19pdHRfc3luY19jcmVhdGVfcHRyICYmIGl0dF9zeW5jX29iaiA9PSBOVUxMKSB8fCBLTVBfSVRUX0RFQlVHKSB7CisgICAgICAgICAgICAvLyBJbiBhIGZvcmsgYmFycmllcjsgY2Fubm90IGdldCB0aGUgb2JqZWN0IHJlbGlhYmx5IChvciBJVFROT1RJRlkgaXMgZGlzYWJsZWQpCisgICAgICAgICAgICBpdHRfc3luY19vYmogPSBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoZ3RpZCwgYnNfZm9ya2pvaW5fYmFycmllciwgMCwgLTEpOworICAgICAgICAgICAgLy8gQ2FuY2VsIHdhaXQgb24gcHJldmlvdXMgcGFyYWxsZWwgcmVnaW9uLi4uCisgICAgICAgICAgICBfX2ttcF9pdHRfdGFza19zdGFydGluZyhpdHRfc3luY19vYmopOworCisgICAgICAgICAgICBpZiAoYnQgPT0gYnNfZm9ya2pvaW5fYmFycmllciAmJiBUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgaXR0X3N5bmNfb2JqID0gX19rbXBfaXR0X2JhcnJpZXJfb2JqZWN0KGd0aWQsIGJzX2Zvcmtqb2luX2JhcnJpZXIpOworICAgICAgICAgICAgaWYgKGl0dF9zeW5jX29iaiAhPSBOVUxMKQorICAgICAgICAgICAgICAgIC8vIENhbGwgcHJlcGFyZSBhcyBlYXJseSBhcyBwb3NzaWJsZSBmb3IgIm5ldyIgYmFycmllcgorICAgICAgICAgICAgICAgIF9fa21wX2l0dF90YXNrX2ZpbmlzaGVkKGl0dF9zeW5jX29iaik7CisgICAgICAgIH0gZWxzZQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkgKi8KKyAgICAgICAgLy8gRWFybHkgZXhpdCBmb3IgcmVhcGluZyB0aHJlYWRzIHJlbGVhc2luZyBmb3Jram9pbiBiYXJyaWVyCisgICAgICAgIGlmICggYnQgPT0gYnNfZm9ya2pvaW5fYmFycmllciAmJiBUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpICkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgLy8gVGhlIHdvcmtlciB0aHJlYWQgbWF5IG5vdyBhc3N1bWUgdGhhdCB0aGUgdGVhbSBpcyB2YWxpZC4KKyNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKTsKKyAgICAgICAgdGVhbSA9IF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX3RlYW07CisjZW5kaWYKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0ZWFtICE9IE5VTEwpOworICAgICAgICBUQ1dfNCh0aHJfYmFyLT5iX2dvLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFKTsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfbGluZWFyX2JhcnJpZXJfcmVsZWFzZTogVCMlZCglZDolZCkgc2V0IGdvKCVwKSA9ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCAmdGhyX2Jhci0+Yl9nbywgS01QX0lOSVRfQkFSUklFUl9TVEFURSkpOworICAgICAgICBLTVBfTUIoKTsgIC8vIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4KKyAgICB9CisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfbGluZWFyX2JhcnJpZXJfcmVsZWFzZTogVCMlZCglZDolZCkgZXhpdCBmb3IgYmFycmllciB0eXBlICVkXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIGJ0KSk7Cit9CisKKy8vIFRyZWUgYmFycmllcgorc3RhdGljIHZvaWQKK19fa21wX3RyZWVfYmFycmllcl9nYXRoZXIoZW51bSBiYXJyaWVyX3R5cGUgYnQsIGttcF9pbmZvX3QgKnRoaXNfdGhyLCBpbnQgZ3RpZCwgaW50IHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKnJlZHVjZSkodm9pZCAqLCB2b2lkICopCisgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKHZvaWQgKml0dF9zeW5jX29iaikgKQoreworICAgIEtNUF9USU1FX0RFVkVMT1BFUl9CTE9DSyhLTVBfdHJlZV9nYXRoZXIpOworICAgIHJlZ2lzdGVyIGttcF90ZWFtX3QgKnRlYW0gPSB0aGlzX3Roci0+dGgudGhfdGVhbTsKKyAgICByZWdpc3RlciBrbXBfYnN0YXRlX3QgKnRocl9iYXIgPSAmdGhpc190aHItPnRoLnRoX2JhcltidF0uYmI7CisgICAgcmVnaXN0ZXIga21wX2luZm9fdCAqKm90aGVyX3RocmVhZHMgPSB0ZWFtLT50LnRfdGhyZWFkczsKKyAgICByZWdpc3RlciBrbXBfdWludDMyIG5wcm9jID0gdGhpc190aHItPnRoLnRoX3RlYW1fbnByb2M7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiBicmFuY2hfYml0cyA9IF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JyYW5jaF9iaXRzW2J0XTsKKyAgICByZWdpc3RlciBrbXBfdWludDMyIGJyYW5jaF9mYWN0b3IgPSAxIDw8IGJyYW5jaF9iaXRzOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgY2hpbGQ7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiBjaGlsZF90aWQ7CisgICAgcmVnaXN0ZXIga21wX3VpbnQ2NCBuZXdfc3RhdGU7CisKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF90cmVlX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSBlbnRlciBmb3IgYmFycmllciB0eXBlICVkXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIGJ0KSk7CisgICAgS01QX0RFQlVHX0FTU0VSVCh0aGlzX3RociA9PSBvdGhlcl90aHJlYWRzW3RoaXNfdGhyLT50aC50aF9pbmZvLmRzLmRzX3RpZF0pOworCisjaWYgVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWQorICAgIC8vIEJhcnJpZXIgaW1iYWxhbmNlIC0gc2F2ZSBhcnJpdmUgdGltZSB0byB0aGUgdGhyZWFkCisgICAgaWYoX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMyB8fCBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9PSAyKSB7CisgICAgICAgIHRoaXNfdGhyLT50aC50aF9iYXJfYXJyaXZlX3RpbWUgPSB0aGlzX3Roci0+dGgudGhfYmFyX21pbl90aW1lID0gX19pdHRfZ2V0X3RpbWVzdGFtcCgpOworICAgIH0KKyNlbmRpZgorICAgIC8vIFBlcmZvcm0gdHJlZSBnYXRoZXIgdG8gd2FpdCB1bnRpbCBhbGwgdGhyZWFkcyBoYXZlIGFycml2ZWQ7IHJlZHVjZSBhbnkgcmVxdWlyZWQgZGF0YSBhcyB3ZSBnbworICAgIGNoaWxkX3RpZCA9ICh0aWQgPDwgYnJhbmNoX2JpdHMpICsgMTsKKyAgICBpZiAoY2hpbGRfdGlkIDwgbnByb2MpIHsKKyAgICAgICAgLy8gUGFyZW50IHRocmVhZHMgd2FpdCBmb3IgYWxsIHRoZWlyIGNoaWxkcmVuIHRvIGFycml2ZQorICAgICAgICBuZXdfc3RhdGUgPSB0ZWFtLT50LnRfYmFyW2J0XS5iX2Fycml2ZWQgKyBLTVBfQkFSUklFUl9TVEFURV9CVU1QOworICAgICAgICBjaGlsZCA9IDE7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHJlZ2lzdGVyIGttcF9pbmZvX3QgKmNoaWxkX3RociA9IG90aGVyX3RocmVhZHNbY2hpbGRfdGlkXTsKKyAgICAgICAgICAgIHJlZ2lzdGVyIGttcF9ic3RhdGVfdCAqY2hpbGRfYmFyID0gJmNoaWxkX3Roci0+dGgudGhfYmFyW2J0XS5iYjsKKyNpZiBLTVBfQ0FDSEVfTUFOQUdFCisgICAgICAgICAgICAvLyBQcmVmZXRjaCBuZXh0IHRocmVhZCdzIGFycml2ZWQgY291bnQKKyAgICAgICAgICAgIGlmIChjaGlsZCsxIDw9IGJyYW5jaF9mYWN0b3IgJiYgY2hpbGRfdGlkKzEgPCBucHJvYykKKyAgICAgICAgICAgICAgICBLTVBfQ0FDSEVfUFJFRkVUQ0goJm90aGVyX3RocmVhZHNbY2hpbGRfdGlkKzFdLT50aC50aF9iYXJbYnRdLmJiLmJfYXJyaXZlZCk7CisjZW5kaWYgLyogS01QX0NBQ0hFX01BTkFHRSAqLworICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfdHJlZV9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgd2FpdCBUIyVkKCVkOiV1KSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJhcnJpdmVkKCVwKSA9PSAlbGx1XG4iLCBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGlkKGNoaWxkX3RpZCwgdGVhbSksIHRlYW0tPnQudF9pZCwgY2hpbGRfdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGlsZF9iYXItPmJfYXJyaXZlZCwgbmV3X3N0YXRlKSk7CisgICAgICAgICAgICAvLyBXYWl0IGZvciBjaGlsZCB0byBhcnJpdmUKKyAgICAgICAgICAgIGttcF9mbGFnXzY0IGZsYWcoJmNoaWxkX2Jhci0+Yl9hcnJpdmVkLCBuZXdfc3RhdGUpOworICAgICAgICAgICAgZmxhZy53YWl0KHRoaXNfdGhyLCBGQUxTRQorICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyNpZiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZCisgICAgICAgICAgICAvLyBCYXJyaWVyIGltYmFsYW5jZSAtIHdyaXRlIG1pbiBvZiB0aGUgdGhyZWFkIHRpbWUgYW5kIGEgY2hpbGQgdGltZSB0byB0aGUgdGhyZWFkLgorICAgICAgICAgICAgaWYgKF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDIpIHsKKyAgICAgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfYmFyX21pbl90aW1lID0gS01QX01JTih0aGlzX3Roci0+dGgudGhfYmFyX21pbl90aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkX3Roci0+dGgudGhfYmFyX21pbl90aW1lKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgaWYgKHJlZHVjZSkgeworICAgICAgICAgICAgICAgIEtBX1RSQUNFKDEwMCwgKCJfX2ttcF90cmVlX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSArPSBUIyVkKCVkOiV1KVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgX19rbXBfZ3RpZF9mcm9tX3RpZChjaGlsZF90aWQsIHRlYW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgY2hpbGRfdGlkKSk7CisgICAgICAgICAgICAgICAgKCpyZWR1Y2UpKHRoaXNfdGhyLT50aC50aF9sb2NhbC5yZWR1Y2VfZGF0YSwgY2hpbGRfdGhyLT50aC50aF9sb2NhbC5yZWR1Y2VfZGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGlsZCsrOworICAgICAgICAgICAgY2hpbGRfdGlkKys7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKGNoaWxkIDw9IGJyYW5jaF9mYWN0b3IgJiYgY2hpbGRfdGlkIDwgbnByb2MpOworICAgIH0KKworICAgIGlmICghS01QX01BU1RFUl9USUQodGlkKSkgeyAvLyBXb3JrZXIgdGhyZWFkcworICAgICAgICByZWdpc3RlciBrbXBfaW50MzIgcGFyZW50X3RpZCA9ICh0aWQgLSAxKSA+PiBicmFuY2hfYml0czsKKworICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF90cmVlX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSByZWxlYXNpbmcgVCMlZCglZDolZCkgIgorICAgICAgICAgICAgICAgICAgICAgICJhcnJpdmVkKCVwKTogJWxsdSA9PiAlbGx1XG4iLCBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGlkKHBhcmVudF90aWQsIHRlYW0pLCB0ZWFtLT50LnRfaWQsIHBhcmVudF90aWQsCisgICAgICAgICAgICAgICAgICAgICAgJnRocl9iYXItPmJfYXJyaXZlZCwgdGhyX2Jhci0+Yl9hcnJpdmVkLAorICAgICAgICAgICAgICAgICAgICAgIHRocl9iYXItPmJfYXJyaXZlZCArIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVApKTsKKworICAgICAgICAvLyBNYXJrIGFycml2YWwgdG8gcGFyZW50IHRocmVhZAorICAgICAgICAvKiBBZnRlciBwZXJmb3JtaW5nIHRoaXMgd3JpdGUsIGEgd29ya2VyIHRocmVhZCBtYXkgbm90IGFzc3VtZSB0aGF0IHRoZSB0ZWFtIGlzIHZhbGlkCisgICAgICAgICAgIGFueSBtb3JlIC0gaXQgY291bGQgYmUgZGVhbGxvY2F0ZWQgYnkgdGhlIG1hc3RlciB0aHJlYWQgYXQgYW55IHRpbWUuICAqLworICAgICAgICBrbXBfZmxhZ182NCBmbGFnKCZ0aHJfYmFyLT5iX2Fycml2ZWQsIG90aGVyX3RocmVhZHNbcGFyZW50X3RpZF0pOworICAgICAgICBmbGFnLnJlbGVhc2UoKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBOZWVkIHRvIHVwZGF0ZSB0aGUgdGVhbSBhcnJpdmVkIHBvaW50ZXIgaWYgd2UgYXJlIHRoZSBtYXN0ZXIgdGhyZWFkCisgICAgICAgIGlmIChucHJvYyA+IDEpIC8vIE5ldyB2YWx1ZSB3YXMgYWxyZWFkeSBjb21wdXRlZCBhYm92ZQorICAgICAgICAgICAgdGVhbS0+dC50X2JhcltidF0uYl9hcnJpdmVkID0gbmV3X3N0YXRlOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0ZWFtLT50LnRfYmFyW2J0XS5iX2Fycml2ZWQgKz0gS01QX0JBUlJJRVJfU1RBVEVfQlVNUDsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfdHJlZV9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgc2V0IHRlYW0gJWQgYXJyaXZlZCglcCkgPSAlbGx1XG4iLAorICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCB0ZWFtLT50LnRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgJnRlYW0tPnQudF9iYXJbYnRdLmJfYXJyaXZlZCwgdGVhbS0+dC50X2JhcltidF0uYl9hcnJpdmVkKSk7CisgICAgfQorICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3RyZWVfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIGV4aXQgZm9yIGJhcnJpZXIgdHlwZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBidCkpOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfdHJlZV9iYXJyaWVyX3JlbGVhc2UoZW51bSBiYXJyaWVyX3R5cGUgYnQsIGttcF9pbmZvX3QgKnRoaXNfdGhyLCBpbnQgZ3RpZCwgaW50IHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcm9wYWdhdGVfaWN2cworICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqaXR0X3N5bmNfb2JqKSApCit7CisgICAgS01QX1RJTUVfREVWRUxPUEVSX0JMT0NLKEtNUF90cmVlX3JlbGVhc2UpOworICAgIHJlZ2lzdGVyIGttcF90ZWFtX3QgKnRlYW07CisgICAgcmVnaXN0ZXIga21wX2JzdGF0ZV90ICp0aHJfYmFyID0gJnRoaXNfdGhyLT50aC50aF9iYXJbYnRdLmJiOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgbnByb2M7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiBicmFuY2hfYml0cyA9IF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0c1tidF07CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiBicmFuY2hfZmFjdG9yID0gMSA8PCBicmFuY2hfYml0czsKKyAgICByZWdpc3RlciBrbXBfdWludDMyIGNoaWxkOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgY2hpbGRfdGlkOworCisgICAgLy8gUGVyZm9ybSBhIHRyZWUgcmVsZWFzZSBmb3IgYWxsIG9mIHRoZSB0aHJlYWRzIHRoYXQgaGF2ZSBiZWVuIGdhdGhlcmVkCisgICAgaWYgKCFLTVBfTUFTVEVSX1RJRCh0aWQpKSB7IC8vIEhhbmRsZSBmb3JrIGJhcnJpZXIgd29ya2VycyB3aG8gYXJlbid0IHBhcnQgb2YgYSB0ZWFtIHlldAorICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF90cmVlX2JhcnJpZXJfcmVsZWFzZTogVCMlZCB3YWl0IGdvKCVwKSA9PSAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBndGlkLCAmdGhyX2Jhci0+Yl9nbywgS01QX0JBUlJJRVJfU1RBVEVfQlVNUCkpOworICAgICAgICAvLyBXYWl0IGZvciBwYXJlbnQgdGhyZWFkIHRvIHJlbGVhc2UgdXMKKyAgICAgICAga21wX2ZsYWdfNjQgZmxhZygmdGhyX2Jhci0+Yl9nbywgS01QX0JBUlJJRVJfU1RBVEVfQlVNUCk7CisgICAgICAgIGZsYWcud2FpdCh0aGlzX3RociwgVFJVRQorICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworI2lmIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgaWYgKChfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgJiYgaXR0X3N5bmNfb2JqID09IE5VTEwpIHx8IEtNUF9JVFRfREVCVUcpIHsKKyAgICAgICAgICAgIC8vIEluIGZvcmsgYmFycmllciB3aGVyZSB3ZSBjb3VsZCBub3QgZ2V0IHRoZSBvYmplY3QgcmVsaWFibHkgKG9yIElUVE5PVElGWSBpcyBkaXNhYmxlZCkKKyAgICAgICAgICAgIGl0dF9zeW5jX29iaiA9IF9fa21wX2l0dF9iYXJyaWVyX29iamVjdChndGlkLCBic19mb3Jram9pbl9iYXJyaWVyLCAwLCAtMSk7CisgICAgICAgICAgICAvLyBDYW5jZWwgd2FpdCBvbiBwcmV2aW91cyBwYXJhbGxlbCByZWdpb24uLi4KKyAgICAgICAgICAgIF9fa21wX2l0dF90YXNrX3N0YXJ0aW5nKGl0dF9zeW5jX29iaik7CisKKyAgICAgICAgICAgIGlmIChidCA9PSBic19mb3Jram9pbl9iYXJyaWVyICYmIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBpdHRfc3luY19vYmogPSBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoZ3RpZCwgYnNfZm9ya2pvaW5fYmFycmllcik7CisgICAgICAgICAgICBpZiAoaXR0X3N5bmNfb2JqICE9IE5VTEwpCisgICAgICAgICAgICAgICAgLy8gQ2FsbCBwcmVwYXJlIGFzIGVhcmx5IGFzIHBvc3NpYmxlIGZvciAibmV3IiBiYXJyaWVyCisgICAgICAgICAgICAgICAgX19rbXBfaXR0X3Rhc2tfZmluaXNoZWQoaXR0X3N5bmNfb2JqKTsKKyAgICAgICAgfSBlbHNlCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWSAqLworICAgICAgICAvLyBFYXJseSBleGl0IGZvciByZWFwaW5nIHRocmVhZHMgcmVsZWFzaW5nIGZvcmtqb2luIGJhcnJpZXIKKyAgICAgICAgaWYgKGJ0ID09IGJzX2Zvcmtqb2luX2JhcnJpZXIgJiYgVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBUaGUgd29ya2VyIHRocmVhZCBtYXkgbm93IGFzc3VtZSB0aGF0IHRoZSB0ZWFtIGlzIHZhbGlkLgorICAgICAgICB0ZWFtID0gX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfdGVhbTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0ZWFtICE9IE5VTEwpOworICAgICAgICB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpOworCisgICAgICAgIFRDV180KHRocl9iYXItPmJfZ28sIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUpOworICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF90cmVlX2JhcnJpZXJfcmVsZWFzZTogVCMlZCglZDolZCkgc2V0IGdvKCVwKSA9ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCAmdGhyX2Jhci0+Yl9nbywgS01QX0lOSVRfQkFSUklFUl9TVEFURSkpOworICAgICAgICBLTVBfTUIoKTsgIC8vIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4KKyAgICB9IGVsc2UgeworICAgICAgICB0ZWFtID0gX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfdGVhbTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0ZWFtICE9IE5VTEwpOworICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF90cmVlX2JhcnJpZXJfcmVsZWFzZTogVCMlZCglZDolZCkgbWFzdGVyIGVudGVyIGZvciBiYXJyaWVyIHR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIGJ0KSk7CisgICAgfQorICAgIG5wcm9jID0gdGhpc190aHItPnRoLnRoX3RlYW1fbnByb2M7CisgICAgY2hpbGRfdGlkID0gKHRpZCA8PCBicmFuY2hfYml0cykgKyAxOworCisgICAgaWYgKGNoaWxkX3RpZCA8IG5wcm9jKSB7CisgICAgICAgIHJlZ2lzdGVyIGttcF9pbmZvX3QgKipvdGhlcl90aHJlYWRzID0gdGVhbS0+dC50X3RocmVhZHM7CisgICAgICAgIGNoaWxkID0gMTsKKyAgICAgICAgLy8gUGFyZW50IHRocmVhZHMgcmVsZWFzZSBhbGwgdGhlaXIgY2hpbGRyZW4KKyAgICAgICAgZG8geworICAgICAgICAgICAgcmVnaXN0ZXIga21wX2luZm9fdCAqY2hpbGRfdGhyID0gb3RoZXJfdGhyZWFkc1tjaGlsZF90aWRdOworICAgICAgICAgICAgcmVnaXN0ZXIga21wX2JzdGF0ZV90ICpjaGlsZF9iYXIgPSAmY2hpbGRfdGhyLT50aC50aF9iYXJbYnRdLmJiOworI2lmIEtNUF9DQUNIRV9NQU5BR0UKKyAgICAgICAgICAgIC8vIFByZWZldGNoIG5leHQgdGhyZWFkJ3MgZ28gY291bnQKKyAgICAgICAgICAgIGlmIChjaGlsZCsxIDw9IGJyYW5jaF9mYWN0b3IgJiYgY2hpbGRfdGlkKzEgPCBucHJvYykKKyAgICAgICAgICAgICAgICBLTVBfQ0FDSEVfUFJFRkVUQ0goJm90aGVyX3RocmVhZHNbY2hpbGRfdGlkKzFdLT50aC50aF9iYXJbYnRdLmJiLmJfZ28pOworI2VuZGlmIC8qIEtNUF9DQUNIRV9NQU5BR0UgKi8KKworI2lmIEtNUF9CQVJSSUVSX0lDVl9QVVNICisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgS01QX1RJTUVfREVWRUxPUEVSX0JMT0NLKFVTRVJfaWN2X2NvcHkpOworICAgICAgICAgICAgICAgIGlmIChwcm9wYWdhdGVfaWN2cykgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9pbml0X2ltcGxpY2l0X3Rhc2sodGVhbS0+dC50X2lkZW50LCB0ZWFtLT50LnRfdGhyZWFkc1tjaGlsZF90aWRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbSwgY2hpbGRfdGlkLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgIGNvcHlfaWN2cygmdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbY2hpbGRfdGlkXS50ZF9pY3ZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhWzBdLnRkX2ljdnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBLTVBfQkFSUklFUl9JQ1ZfUFVTSAorICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfdHJlZV9iYXJyaWVyX3JlbGVhc2U6IFQjJWQoJWQ6JWQpIHJlbGVhc2luZyBUIyVkKCVkOiV1KSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImdvKCVwKTogJXUgPT4gJXVcbiIsIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGlkKGNoaWxkX3RpZCwgdGVhbSksIHRlYW0tPnQudF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRfdGlkLCAmY2hpbGRfYmFyLT5iX2dvLCBjaGlsZF9iYXItPmJfZ28sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkX2Jhci0+Yl9nbyArIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVApKTsKKyAgICAgICAgICAgIC8vIFJlbGVhc2UgY2hpbGQgZnJvbSBiYXJyaWVyCisgICAgICAgICAgICBrbXBfZmxhZ182NCBmbGFnKCZjaGlsZF9iYXItPmJfZ28sIGNoaWxkX3Rocik7CisgICAgICAgICAgICBmbGFnLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIGNoaWxkKys7CisgICAgICAgICAgICBjaGlsZF90aWQrKzsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoY2hpbGQgPD0gYnJhbmNoX2ZhY3RvciAmJiBjaGlsZF90aWQgPCBucHJvYyk7CisgICAgfQorICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3RyZWVfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSBleGl0IGZvciBiYXJyaWVyIHR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgYnQpKTsKK30KKworCisvLyBIeXBlciBCYXJyaWVyCitzdGF0aWMgdm9pZAorX19rbXBfaHlwZXJfYmFycmllcl9nYXRoZXIoZW51bSBiYXJyaWVyX3R5cGUgYnQsIGttcF9pbmZvX3QgKnRoaXNfdGhyLCBpbnQgZ3RpZCwgaW50IHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpyZWR1Y2UpKHZvaWQgKiwgdm9pZCAqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqaXR0X3N5bmNfb2JqKSApCit7CisgICAgS01QX1RJTUVfREVWRUxPUEVSX0JMT0NLKEtNUF9oeXBlcl9nYXRoZXIpOworICAgIHJlZ2lzdGVyIGttcF90ZWFtX3QgKnRlYW0gPSB0aGlzX3Roci0+dGgudGhfdGVhbTsKKyAgICByZWdpc3RlciBrbXBfYnN0YXRlX3QgKnRocl9iYXIgPSAmdGhpc190aHItPnRoLnRoX2JhcltidF0uYmI7CisgICAgcmVnaXN0ZXIga21wX2luZm9fdCAqKm90aGVyX3RocmVhZHMgPSB0ZWFtLT50LnRfdGhyZWFkczsKKyAgICByZWdpc3RlciBrbXBfdWludDY0IG5ld19zdGF0ZSA9IEtNUF9CQVJSSUVSX1VOVVNFRF9TVEFURTsKKyAgICByZWdpc3RlciBrbXBfdWludDMyIG51bV90aHJlYWRzID0gdGhpc190aHItPnRoLnRoX3RlYW1fbnByb2M7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiBicmFuY2hfYml0cyA9IF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JyYW5jaF9iaXRzW2J0XTsKKyAgICByZWdpc3RlciBrbXBfdWludDMyIGJyYW5jaF9mYWN0b3IgPSAxIDw8IGJyYW5jaF9iaXRzOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgb2Zmc2V0OworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgbGV2ZWw7CisKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9oeXBlcl9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgZW50ZXIgZm9yIGJhcnJpZXIgdHlwZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBidCkpOworCisgICAgS01QX0RFQlVHX0FTU0VSVCh0aGlzX3RociA9PSBvdGhlcl90aHJlYWRzW3RoaXNfdGhyLT50aC50aF9pbmZvLmRzLmRzX3RpZF0pOworCisjaWYgVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWQorICAgIC8vIEJhcnJpZXIgaW1iYWxhbmNlIC0gc2F2ZSBhcnJpdmUgdGltZSB0byB0aGUgdGhyZWFkCisgICAgaWYoX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMyB8fCBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9PSAyKSB7CisgICAgICAgIHRoaXNfdGhyLT50aC50aF9iYXJfYXJyaXZlX3RpbWUgPSB0aGlzX3Roci0+dGgudGhfYmFyX21pbl90aW1lID0gX19pdHRfZ2V0X3RpbWVzdGFtcCgpOworICAgIH0KKyNlbmRpZgorICAgIC8qIFBlcmZvcm0gYSBoeXBlcmN1YmUtZW1iZWRkZWQgdHJlZSBnYXRoZXIgdG8gd2FpdCB1bnRpbCBhbGwgb2YgdGhlIHRocmVhZHMgaGF2ZQorICAgICAgIGFycml2ZWQsIGFuZCByZWR1Y2UgYW55IHJlcXVpcmVkIGRhdGEgYXMgd2UgZ28uICAqLworICAgIGttcF9mbGFnXzY0IHBfZmxhZygmdGhyX2Jhci0+Yl9hcnJpdmVkKTsKKyAgICBmb3IgKGxldmVsPTAsIG9mZnNldD0xOyBvZmZzZXQ8bnVtX3RocmVhZHM7IGxldmVsKz1icmFuY2hfYml0cywgb2Zmc2V0PDw9YnJhbmNoX2JpdHMpCisgICAgeworICAgICAgICByZWdpc3RlciBrbXBfdWludDMyIGNoaWxkOworICAgICAgICByZWdpc3RlciBrbXBfdWludDMyIGNoaWxkX3RpZDsKKworICAgICAgICBpZiAoKCh0aWQgPj4gbGV2ZWwpICYgKGJyYW5jaF9mYWN0b3IgLSAxKSkgIT0gMCkgeworICAgICAgICAgICAgcmVnaXN0ZXIga21wX2ludDMyIHBhcmVudF90aWQgPSB0aWQgJiB+KCgxIDw8IChsZXZlbCArIGJyYW5jaF9iaXRzKSkgLTEpOworCisgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9oeXBlcl9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgcmVsZWFzaW5nIFQjJWQoJWQ6JWQpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImFycml2ZWQoJXApOiAlbGx1ID0+ICVsbHVcbiIsIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGlkKHBhcmVudF90aWQsIHRlYW0pLCB0ZWFtLT50LnRfaWQsIHBhcmVudF90aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aHJfYmFyLT5iX2Fycml2ZWQsIHRocl9iYXItPmJfYXJyaXZlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyX2Jhci0+Yl9hcnJpdmVkICsgS01QX0JBUlJJRVJfU1RBVEVfQlVNUCkpOworICAgICAgICAgICAgLy8gTWFyayBhcnJpdmFsIHRvIHBhcmVudCB0aHJlYWQKKyAgICAgICAgICAgIC8qIEFmdGVyIHBlcmZvcm1pbmcgdGhpcyB3cml0ZSAoaW4gdGhlIGxhc3QgaXRlcmF0aW9uIG9mIHRoZSBlbmNsb3NpbmcgZm9yIGxvb3ApLAorICAgICAgICAgICAgICAgYSB3b3JrZXIgdGhyZWFkIG1heSBub3QgYXNzdW1lIHRoYXQgdGhlIHRlYW0gaXMgdmFsaWQgYW55IG1vcmUgLSBpdCBjb3VsZCBiZQorICAgICAgICAgICAgICAgZGVhbGxvY2F0ZWQgYnkgdGhlIG1hc3RlciB0aHJlYWQgYXQgYW55IHRpbWUuICAqLworICAgICAgICAgICAgcF9mbGFnLnNldF93YWl0ZXIob3RoZXJfdGhyZWFkc1twYXJlbnRfdGlkXSk7CisgICAgICAgICAgICBwX2ZsYWcucmVsZWFzZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBQYXJlbnQgdGhyZWFkcyB3YWl0IGZvciBjaGlsZHJlbiB0byBhcnJpdmUKKyAgICAgICAgaWYgKG5ld19zdGF0ZSA9PSBLTVBfQkFSUklFUl9VTlVTRURfU1RBVEUpCisgICAgICAgICAgICBuZXdfc3RhdGUgPSB0ZWFtLT50LnRfYmFyW2J0XS5iX2Fycml2ZWQgKyBLTVBfQkFSUklFUl9TVEFURV9CVU1QOworICAgICAgICBmb3IgKGNoaWxkPTEsIGNoaWxkX3RpZD10aWQrKDEgPDwgbGV2ZWwpOyBjaGlsZDxicmFuY2hfZmFjdG9yICYmIGNoaWxkX3RpZDxudW1fdGhyZWFkczsKKyAgICAgICAgICAgICBjaGlsZCsrLCBjaGlsZF90aWQrPSgxIDw8IGxldmVsKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmVnaXN0ZXIga21wX2luZm9fdCAqY2hpbGRfdGhyID0gb3RoZXJfdGhyZWFkc1tjaGlsZF90aWRdOworICAgICAgICAgICAgcmVnaXN0ZXIga21wX2JzdGF0ZV90ICpjaGlsZF9iYXIgPSAmY2hpbGRfdGhyLT50aC50aF9iYXJbYnRdLmJiOworI2lmIEtNUF9DQUNIRV9NQU5BR0UKKyAgICAgICAgICAgIHJlZ2lzdGVyIGttcF91aW50MzIgbmV4dF9jaGlsZF90aWQgPSBjaGlsZF90aWQgKyAoMSA8PCBsZXZlbCk7CisgICAgICAgICAgICAvLyBQcmVmZXRjaCBuZXh0IHRocmVhZCdzIGFycml2ZWQgY291bnQKKyAgICAgICAgICAgIGlmIChjaGlsZCsxIDwgYnJhbmNoX2ZhY3RvciAmJiBuZXh0X2NoaWxkX3RpZCA8IG51bV90aHJlYWRzKQorICAgICAgICAgICAgICAgIEtNUF9DQUNIRV9QUkVGRVRDSCgmb3RoZXJfdGhyZWFkc1tuZXh0X2NoaWxkX3RpZF0tPnRoLnRoX2JhcltidF0uYmIuYl9hcnJpdmVkKTsKKyNlbmRpZiAvKiBLTVBfQ0FDSEVfTUFOQUdFICovCisgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9oeXBlcl9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgd2FpdCBUIyVkKCVkOiV1KSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJhcnJpdmVkKCVwKSA9PSAlbGx1XG4iLCBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RpZChjaGlsZF90aWQsIHRlYW0pLCB0ZWFtLT50LnRfaWQsIGNoaWxkX3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoaWxkX2Jhci0+Yl9hcnJpdmVkLCBuZXdfc3RhdGUpKTsKKyAgICAgICAgICAgIC8vIFdhaXQgZm9yIGNoaWxkIHRvIGFycml2ZQorICAgICAgICAgICAga21wX2ZsYWdfNjQgY19mbGFnKCZjaGlsZF9iYXItPmJfYXJyaXZlZCwgbmV3X3N0YXRlKTsKKyAgICAgICAgICAgIGNfZmxhZy53YWl0KHRoaXNfdGhyLCBGQUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworI2lmIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgICAgIC8vIEJhcnJpZXIgaW1iYWxhbmNlIC0gd3JpdGUgbWluIG9mIHRoZSB0aHJlYWQgdGltZSBhbmQgYSBjaGlsZCB0aW1lIHRvIHRoZSB0aHJlYWQuCisgICAgICAgICAgICBpZiAoX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMikgeworICAgICAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9iYXJfbWluX3RpbWUgPSBLTVBfTUlOKHRoaXNfdGhyLT50aC50aF9iYXJfbWluX3RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRfdGhyLT50aC50aF9iYXJfbWluX3RpbWUpOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICBpZiAocmVkdWNlKSB7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMTAwLCAoIl9fa21wX2h5cGVyX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSArPSBUIyVkKCVkOiV1KVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgX19rbXBfZ3RpZF9mcm9tX3RpZChjaGlsZF90aWQsIHRlYW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgY2hpbGRfdGlkKSk7CisgICAgICAgICAgICAgICAgKCpyZWR1Y2UpKHRoaXNfdGhyLT50aC50aF9sb2NhbC5yZWR1Y2VfZGF0YSwgY2hpbGRfdGhyLT50aC50aF9sb2NhbC5yZWR1Y2VfZGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoS01QX01BU1RFUl9USUQodGlkKSkgeworICAgICAgICAvLyBOZWVkIHRvIHVwZGF0ZSB0aGUgdGVhbSBhcnJpdmVkIHBvaW50ZXIgaWYgd2UgYXJlIHRoZSBtYXN0ZXIgdGhyZWFkCisgICAgICAgIGlmIChuZXdfc3RhdGUgPT0gS01QX0JBUlJJRVJfVU5VU0VEX1NUQVRFKQorICAgICAgICAgICAgdGVhbS0+dC50X2JhcltidF0uYl9hcnJpdmVkICs9IEtNUF9CQVJSSUVSX1NUQVRFX0JVTVA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRlYW0tPnQudF9iYXJbYnRdLmJfYXJyaXZlZCA9IG5ld19zdGF0ZTsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfaHlwZXJfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIHNldCB0ZWFtICVkIGFycml2ZWQoJXApID0gJWxsdVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgdGVhbS0+dC50X2lkLAorICAgICAgICAgICAgICAgICAgICAgICZ0ZWFtLT50LnRfYmFyW2J0XS5iX2Fycml2ZWQsIHRlYW0tPnQudF9iYXJbYnRdLmJfYXJyaXZlZCkpOworICAgIH0KKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9oeXBlcl9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgZXhpdCBmb3IgYmFycmllciB0eXBlICVkXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIGJ0KSk7Cit9CisKKy8vIFRoZSByZXZlcnNlIHZlcnNpb25zIHNlZW0gdG8gYmVhdCB0aGUgZm9yd2FyZCB2ZXJzaW9ucyBvdmVyYWxsCisjZGVmaW5lIEtNUF9SRVZFUlNFX0hZUEVSX0JBUgorc3RhdGljIHZvaWQKK19fa21wX2h5cGVyX2JhcnJpZXJfcmVsZWFzZShlbnVtIGJhcnJpZXJfdHlwZSBidCwga21wX2luZm9fdCAqdGhpc190aHIsIGludCBndGlkLCBpbnQgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcm9wYWdhdGVfaWN2cworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKHZvaWQgKml0dF9zeW5jX29iaikgKQoreworICAgIEtNUF9USU1FX0RFVkVMT1BFUl9CTE9DSyhLTVBfaHlwZXJfcmVsZWFzZSk7CisgICAgcmVnaXN0ZXIga21wX3RlYW1fdCAgICAqdGVhbTsKKyAgICByZWdpc3RlciBrbXBfYnN0YXRlX3QgICp0aHJfYmFyICAgICAgID0gJiB0aGlzX3RociAtPiB0aC50aF9iYXJbIGJ0IF0uYmI7CisgICAgcmVnaXN0ZXIga21wX2luZm9fdCAgICoqb3RoZXJfdGhyZWFkczsKKyAgICByZWdpc3RlciBrbXBfdWludDMyICAgICBudW1fdGhyZWFkczsKKyAgICByZWdpc3RlciBrbXBfdWludDMyICAgICBicmFuY2hfYml0cyAgID0gX19rbXBfYmFycmllcl9yZWxlYXNlX2JyYW5jaF9iaXRzWyBidCBdOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgICAgIGJyYW5jaF9mYWN0b3IgPSAxIDw8IGJyYW5jaF9iaXRzOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgICAgIGNoaWxkOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgICAgIGNoaWxkX3RpZDsKKyAgICByZWdpc3RlciBrbXBfdWludDMyICAgICBvZmZzZXQ7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiAgICAgbGV2ZWw7CisKKyAgICAvKiBQZXJmb3JtIGEgaHlwZXJjdWJlLWVtYmVkZGVkIHRyZWUgcmVsZWFzZSBmb3IgYWxsIG9mIHRoZSB0aHJlYWRzIHRoYXQgaGF2ZSBiZWVuIGdhdGhlcmVkLgorICAgICAgIElmIEtNUF9SRVZFUlNFX0hZUEVSX0JBUiBpcyBkZWZpbmVkIChkZWZhdWx0KSB0aGUgdGhyZWFkcyBhcmUgcmVsZWFzZWQgaW4gdGhlIHJldmVyc2UKKyAgICAgICBvcmRlciBvZiB0aGUgY29ycmVzcG9uZGluZyBnYXRoZXIsIG90aGVyd2lzZSB0aHJlYWRzIGFyZSByZWxlYXNlZCBpbiB0aGUgc2FtZSBvcmRlci4gKi8KKyAgICBpZiAoS01QX01BU1RFUl9USUQodGlkKSkgeyAvLyBtYXN0ZXIKKyAgICAgICAgdGVhbSA9IF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX3RlYW07CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGVhbSAhPSBOVUxMKTsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfaHlwZXJfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSBtYXN0ZXIgZW50ZXIgZm9yIGJhcnJpZXIgdHlwZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgYnQpKTsKKyNpZiBLTVBfQkFSUklFUl9JQ1ZfUFVTSAorICAgICAgICBpZiAocHJvcGFnYXRlX2ljdnMpIHsgLy8gbWFzdGVyIGFscmVhZHkgaGFzIElDVnMgaW4gZmluYWwgZGVzdGluYXRpb247IGNvcHkKKyAgICAgICAgICAgIGNvcHlfaWN2cygmdGhyX2Jhci0+dGhfZml4ZWRfaWN2cywgJnRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0udGRfaWN2cyk7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgICBlbHNlICB7IC8vIEhhbmRsZSBmb3JrIGJhcnJpZXIgd29ya2VycyB3aG8gYXJlbid0IHBhcnQgb2YgYSB0ZWFtIHlldAorICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9oeXBlcl9iYXJyaWVyX3JlbGVhc2U6IFQjJWQgd2FpdCBnbyglcCkgPT0gJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgJnRocl9iYXItPmJfZ28sIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVApKTsKKyAgICAgICAgLy8gV2FpdCBmb3IgcGFyZW50IHRocmVhZCB0byByZWxlYXNlIHVzCisgICAgICAgIGttcF9mbGFnXzY0IGZsYWcoJnRocl9iYXItPmJfZ28sIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVApOworICAgICAgICBmbGFnLndhaXQodGhpc190aHIsIFRSVUUKKyAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyNpZiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZCisgICAgICAgIGlmICgoX19pdHRfc3luY19jcmVhdGVfcHRyICYmIGl0dF9zeW5jX29iaiA9PSBOVUxMKSB8fCBLTVBfSVRUX0RFQlVHKSB7CisgICAgICAgICAgICAvLyBJbiBmb3JrIGJhcnJpZXIgd2hlcmUgd2UgY291bGQgbm90IGdldCB0aGUgb2JqZWN0IHJlbGlhYmx5CisgICAgICAgICAgICBpdHRfc3luY19vYmogPSBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoZ3RpZCwgYnNfZm9ya2pvaW5fYmFycmllciwgMCwgLTEpOworICAgICAgICAgICAgLy8gQ2FuY2VsIHdhaXQgb24gcHJldmlvdXMgcGFyYWxsZWwgcmVnaW9uLi4uCisgICAgICAgICAgICBfX2ttcF9pdHRfdGFza19zdGFydGluZyhpdHRfc3luY19vYmopOworCisgICAgICAgICAgICBpZiAoYnQgPT0gYnNfZm9ya2pvaW5fYmFycmllciAmJiBUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgaXR0X3N5bmNfb2JqID0gX19rbXBfaXR0X2JhcnJpZXJfb2JqZWN0KGd0aWQsIGJzX2Zvcmtqb2luX2JhcnJpZXIpOworICAgICAgICAgICAgaWYgKGl0dF9zeW5jX29iaiAhPSBOVUxMKQorICAgICAgICAgICAgICAgIC8vIENhbGwgcHJlcGFyZSBhcyBlYXJseSBhcyBwb3NzaWJsZSBmb3IgIm5ldyIgYmFycmllcgorICAgICAgICAgICAgICAgIF9fa21wX2l0dF90YXNrX2ZpbmlzaGVkKGl0dF9zeW5jX29iaik7CisgICAgICAgIH0gZWxzZQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkgKi8KKyAgICAgICAgLy8gRWFybHkgZXhpdCBmb3IgcmVhcGluZyB0aHJlYWRzIHJlbGVhc2luZyBmb3Jram9pbiBiYXJyaWVyCisgICAgICAgIGlmIChidCA9PSBic19mb3Jram9pbl9iYXJyaWVyICYmIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gVGhlIHdvcmtlciB0aHJlYWQgbWF5IG5vdyBhc3N1bWUgdGhhdCB0aGUgdGVhbSBpcyB2YWxpZC4KKyAgICAgICAgdGVhbSA9IF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX3RlYW07CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGVhbSAhPSBOVUxMKTsKKyAgICAgICAgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKTsKKworICAgICAgICBUQ1dfNCh0aHJfYmFyLT5iX2dvLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFKTsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfaHlwZXJfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSBzZXQgZ28oJXApID0gJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsICZ0aHJfYmFyLT5iX2dvLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFKSk7CisgICAgICAgIEtNUF9NQigpOyAgLy8gRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLgorICAgIH0KKyAgICBudW1fdGhyZWFkcyA9IHRoaXNfdGhyLT50aC50aF90ZWFtX25wcm9jOworICAgIG90aGVyX3RocmVhZHMgPSB0ZWFtLT50LnRfdGhyZWFkczsKKworI2lmZGVmIEtNUF9SRVZFUlNFX0hZUEVSX0JBUgorICAgIC8vIENvdW50IHVwIHRvIGNvcnJlY3QgbGV2ZWwgZm9yIHBhcmVudAorICAgIGZvciAobGV2ZWw9MCwgb2Zmc2V0PTE7IG9mZnNldDxudW1fdGhyZWFkcyAmJiAoKCh0aWQ+PmxldmVsKSAmIChicmFuY2hfZmFjdG9yLTEpKSA9PSAwKTsKKyAgICAgICAgIGxldmVsKz1icmFuY2hfYml0cywgb2Zmc2V0PDw9YnJhbmNoX2JpdHMpOworCisgICAgLy8gTm93IGdvIGRvd24gZnJvbSB0aGVyZQorICAgIGZvciAobGV2ZWwtPWJyYW5jaF9iaXRzLCBvZmZzZXQ+Pj1icmFuY2hfYml0czsgb2Zmc2V0ICE9IDA7CisgICAgICAgICBsZXZlbC09YnJhbmNoX2JpdHMsIG9mZnNldD4+PWJyYW5jaF9iaXRzKQorI2Vsc2UKKyAgICAvLyBHbyBkb3duIHRoZSB0cmVlLCBsZXZlbCBieSBsZXZlbAorICAgIGZvciAobGV2ZWw9MCwgb2Zmc2V0PTE7IG9mZnNldDxudW1fdGhyZWFkczsgbGV2ZWwrPWJyYW5jaF9iaXRzLCBvZmZzZXQ8PD1icmFuY2hfYml0cykKKyNlbmRpZiAvLyBLTVBfUkVWRVJTRV9IWVBFUl9CQVIKKyAgICB7CisjaWZkZWYgS01QX1JFVkVSU0VfSFlQRVJfQkFSCisgICAgICAgIC8qIE5vdyBnbyBpbiByZXZlcnNlIG9yZGVyIHRocm91Z2ggdGhlIGNoaWxkcmVuLCBoaWdoZXN0IHRvIGxvd2VzdC4KKyAgICAgICAgICAgSW5pdGlhbCBzZXR0aW5nIG9mIGNoaWxkIGlzIGNvbnNlcnZhdGl2ZSBoZXJlLiAqLworICAgICAgICBjaGlsZCA9IG51bV90aHJlYWRzID4+ICgobGV2ZWw9PTApP2xldmVsOmxldmVsLTEpOworICAgICAgICBmb3IgKGNoaWxkPShjaGlsZDxicmFuY2hfZmFjdG9yLTEpID8gY2hpbGQgOiBicmFuY2hfZmFjdG9yLTEsIGNoaWxkX3RpZD10aWQrKGNoaWxkPDxsZXZlbCk7CisgICAgICAgICAgICAgY2hpbGQ+PTE7IGNoaWxkLS0sIGNoaWxkX3RpZC09KDE8PGxldmVsKSkKKyNlbHNlCisgICAgICAgIGlmICgoKHRpZCA+PiBsZXZlbCkgJiAoYnJhbmNoX2ZhY3RvciAtIDEpKSAhPSAwKQorICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBnbyBsb3dlciB0aGFuIHRoaXMsIHNpbmNlIHRoaXMgaXMgdGhlIGxldmVsIHBhcmVudCB3b3VsZCBiZSBub3RpZmllZAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCBjaGlsZHJlbiBvbiB0aGlzIGxldmVsIG9mIHRoZSB0cmVlCisgICAgICAgIGZvciAoY2hpbGQ9MSwgY2hpbGRfdGlkPXRpZCsoMTw8bGV2ZWwpOyBjaGlsZDxicmFuY2hfZmFjdG9yICYmIGNoaWxkX3RpZDxudW1fdGhyZWFkczsKKyAgICAgICAgICAgICBjaGlsZCsrLCBjaGlsZF90aWQrPSgxPDxsZXZlbCkpCisjZW5kaWYgLy8gS01QX1JFVkVSU0VfSFlQRVJfQkFSCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjaGlsZF90aWQgPj0gbnVtX3RocmVhZHMpIGNvbnRpbnVlOyAgLy8gQ2hpbGQgZG9lc24ndCBleGlzdCBzbyBrZWVwIGdvaW5nCisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICByZWdpc3RlciBrbXBfaW5mb190ICpjaGlsZF90aHIgPSBvdGhlcl90aHJlYWRzW2NoaWxkX3RpZF07CisgICAgICAgICAgICAgICAgcmVnaXN0ZXIga21wX2JzdGF0ZV90ICpjaGlsZF9iYXIgPSAmY2hpbGRfdGhyLT50aC50aF9iYXJbYnRdLmJiOworI2lmIEtNUF9DQUNIRV9NQU5BR0UKKyAgICAgICAgICAgICAgICByZWdpc3RlciBrbXBfdWludDMyIG5leHRfY2hpbGRfdGlkID0gY2hpbGRfdGlkIC0gKDEgPDwgbGV2ZWwpOworICAgICAgICAgICAgICAgIC8vIFByZWZldGNoIG5leHQgdGhyZWFkJ3MgZ28gY291bnQKKyMgaWZkZWYgS01QX1JFVkVSU0VfSFlQRVJfQkFSCisgICAgICAgICAgICAgICAgaWYgKGNoaWxkLTEgPj0gMSAmJiBuZXh0X2NoaWxkX3RpZCA8IG51bV90aHJlYWRzKQorIyBlbHNlCisgICAgICAgICAgICAgICAgaWYgKGNoaWxkKzEgPCBicmFuY2hfZmFjdG9yICYmIG5leHRfY2hpbGRfdGlkIDwgbnVtX3RocmVhZHMpCisjIGVuZGlmIC8vIEtNUF9SRVZFUlNFX0hZUEVSX0JBUgorICAgICAgICAgICAgICAgICAgICBLTVBfQ0FDSEVfUFJFRkVUQ0goJm90aGVyX3RocmVhZHNbbmV4dF9jaGlsZF90aWRdLT50aC50aF9iYXJbYnRdLmJiLmJfZ28pOworI2VuZGlmIC8qIEtNUF9DQUNIRV9NQU5BR0UgKi8KKworI2lmIEtNUF9CQVJSSUVSX0lDVl9QVVNICisgICAgICAgICAgICAgICAgaWYgKHByb3BhZ2F0ZV9pY3ZzKSAvLyBwdXNoIG15IGZpeGVkIElDVnMgdG8gbXkgY2hpbGQKKyAgICAgICAgICAgICAgICAgICAgY29weV9pY3ZzKCZjaGlsZF9iYXItPnRoX2ZpeGVkX2ljdnMsICZ0aHJfYmFyLT50aF9maXhlZF9pY3ZzKTsKKyNlbmRpZiAvLyBLTVBfQkFSUklFUl9JQ1ZfUFVTSAorCisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfaHlwZXJfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSByZWxlYXNpbmcgVCMlZCglZDoldSkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ28oJXApOiAldSA9PiAldVxuIiwgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGlkKGNoaWxkX3RpZCwgdGVhbSksIHRlYW0tPnQudF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkX3RpZCwgJmNoaWxkX2Jhci0+Yl9nbywgY2hpbGRfYmFyLT5iX2dvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRfYmFyLT5iX2dvICsgS01QX0JBUlJJRVJfU1RBVEVfQlVNUCkpOworICAgICAgICAgICAgICAgIC8vIFJlbGVhc2UgY2hpbGQgZnJvbSBiYXJyaWVyCisgICAgICAgICAgICAgICAga21wX2ZsYWdfNjQgZmxhZygmY2hpbGRfYmFyLT5iX2dvLCBjaGlsZF90aHIpOworICAgICAgICAgICAgICAgIGZsYWcucmVsZWFzZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorI2lmIEtNUF9CQVJSSUVSX0lDVl9QVVNICisgICAgaWYgKHByb3BhZ2F0ZV9pY3ZzICYmICFLTVBfTUFTVEVSX1RJRCh0aWQpKSB7IC8vIGNvcHkgSUNWcyBsb2NhbGx5IHRvIGZpbmFsIGRlc3QKKyAgICAgICAgX19rbXBfaW5pdF9pbXBsaWNpdF90YXNrKHRlYW0tPnQudF9pZGVudCwgdGVhbS0+dC50X3RocmVhZHNbdGlkXSwgdGVhbSwgdGlkLCBGQUxTRSk7CisgICAgICAgIGNvcHlfaWN2cygmdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS50ZF9pY3ZzLCAmdGhyX2Jhci0+dGhfZml4ZWRfaWN2cyk7CisgICAgfQorI2VuZGlmCisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfaHlwZXJfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSBleGl0IGZvciBiYXJyaWVyIHR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgYnQpKTsKK30KKworLy8gSGllcmFyY2hpY2FsIEJhcnJpZXIKKworLy8gSW5pdGlhbGl6ZSB0aHJlYWQgYmFycmllciBkYXRhCisvKiBJbml0aWFsaXplcy9yZS1pbml0aWFsaXplcyB0aGUgaGllcmFyY2hpY2FsIGJhcnJpZXIgZGF0YSBzdG9yZWQgb24gYSB0aHJlYWQuICBQZXJmb3JtcyB0aGUKKyAgIG1pbmltdW0gYW1vdW50IG9mIGluaXRpYWxpemF0aW9uIHJlcXVpcmVkIGJhc2VkIG9uIGhvdyB0aGUgdGVhbSBoYXMgY2hhbmdlZC4gIFJldHVybnMgdHJ1ZSBpZgorICAgbGVhZiBjaGlsZHJlbiB3aWxsIHJlcXVpcmUgYm90aCBvbi1jb3JlIGFuZCB0cmFkaXRpb25hbCB3YWtlLXVwIG1lY2hhbmlzbXMuICBGb3IgZXhhbXBsZSwgaWYgdGhlCisgICB0ZWFtIHNpemUgaW5jcmVhc2VzLCB0aHJlYWRzIGFscmVhZHkgaW4gdGhlIHRlYW0gd2lsbCByZXNwb25kIHRvIG9uLWNvcmUgd2FrZXVwIG9uIHRoZWlyIHBhcmVudAorICAgdGhyZWFkLCBidXQgdGhyZWFkcyBuZXdseSBhZGRlZCB0byB0aGUgdGVhbSB3aWxsIG9ubHkgYmUgbGlzdGVuaW5nIG9uIHRoZSB0aGVpciBsb2NhbCBiX2dvLiAqLworc3RhdGljIGJvb2wKK19fa21wX2luaXRfaGllcmFyY2hpY2FsX2JhcnJpZXJfdGhyZWFkKGVudW0gYmFycmllcl90eXBlIGJ0LCBrbXBfYnN0YXRlX3QgKnRocl9iYXIsIGttcF91aW50MzIgbnByb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3RpZCwgaW50IHRpZCwga21wX3RlYW1fdCAqdGVhbSkKK3sKKyAgICAvLyBDaGVja3MgdG8gZGV0ZXJtaW5lIGlmIChyZS0paW5pdGlhbGl6YXRpb24gaXMgbmVlZGVkCisgICAgYm9vbCB1bmluaXRpYWxpemVkID0gdGhyX2Jhci0+dGVhbSA9PSBOVUxMOworICAgIGJvb2wgdGVhbV9jaGFuZ2VkID0gdGVhbSAhPSB0aHJfYmFyLT50ZWFtOworICAgIGJvb2wgdGVhbV9zel9jaGFuZ2VkID0gbnByb2MgIT0gdGhyX2Jhci0+bnByb2M7CisgICAgYm9vbCB0aWRfY2hhbmdlZCA9IHRpZCAhPSB0aHJfYmFyLT5vbGRfdGlkOworICAgIGJvb2wgcmV0dmFsID0gZmFsc2U7CisKKyAgICBpZiAodW5pbml0aWFsaXplZCB8fCB0ZWFtX3N6X2NoYW5nZWQpIHsKKyAgICAgICAgX19rbXBfZ2V0X2hpZXJhcmNoeShucHJvYywgdGhyX2Jhcik7CisgICAgfQorCisgICAgaWYgKHVuaW5pdGlhbGl6ZWQgfHwgdGVhbV9zel9jaGFuZ2VkIHx8IHRpZF9jaGFuZ2VkKSB7CisgICAgICAgIHRocl9iYXItPm15X2xldmVsID0gdGhyX2Jhci0+ZGVwdGgtMTsgLy8gZGVmYXVsdCBmb3IgbWFzdGVyCisgICAgICAgIHRocl9iYXItPnBhcmVudF90aWQgPSAtMTsgLy8gZGVmYXVsdCBmb3IgbWFzdGVyCisgICAgICAgIGlmICghS01QX01BU1RFUl9USUQodGlkKSkgeyAvLyBpZiBub3QgbWFzdGVyLCBmaW5kIHBhcmVudCB0aHJlYWQgaW4gaGllcmFyY2h5CisgICAgICAgICAgICBrbXBfdWludDMyIGQ9MDsKKyAgICAgICAgICAgIHdoaWxlIChkPHRocl9iYXItPmRlcHRoKSB7IC8vIGZpbmQgcGFyZW50IGJhc2VkIG9uIGxldmVsIG9mIHRocmVhZCBpbiBoaWVyYXJjaHksIGFuZCBub3RlIGxldmVsCisgICAgICAgICAgICAgICAga21wX3VpbnQzMiByZW07CisgICAgICAgICAgICAgICAgaWYgKGQgPT0gdGhyX2Jhci0+ZGVwdGgtMikgeyAvLyByZWFjaGVkIGxldmVsIHJpZ2h0IGJlbG93IHRoZSBtYXN0ZXIKKyAgICAgICAgICAgICAgICAgICAgdGhyX2Jhci0+cGFyZW50X3RpZCA9IDA7CisgICAgICAgICAgICAgICAgICAgIHRocl9iYXItPm15X2xldmVsID0gZDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKChyZW0gPSB0aWQldGhyX2Jhci0+c2tpcF9wZXJfbGV2ZWxbZCsxXSkgIT0gMCkgeyAvLyBUT0RPOiBjYW4gd2UgbWFrZSB0aGlzIG9wIGZhc3Rlcj8KKyAgICAgICAgICAgICAgICAgICAgLy8gdGhyZWFkIGlzIG5vdCBhIHN1YnRyZWUgcm9vdCBhdCBuZXh0IGxldmVsLCBzbyB0aGlzIGlzIG1heAorICAgICAgICAgICAgICAgICAgICB0aHJfYmFyLT5wYXJlbnRfdGlkID0gdGlkIC0gcmVtOworICAgICAgICAgICAgICAgICAgICB0aHJfYmFyLT5teV9sZXZlbCA9IGQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICArK2Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdGhyX2Jhci0+b2Zmc2V0ID0gNy0odGlkLXRocl9iYXItPnBhcmVudF90aWQtMSk7CisgICAgICAgIHRocl9iYXItPm9sZF90aWQgPSB0aWQ7CisgICAgICAgIHRocl9iYXItPndhaXRfZmxhZyA9IEtNUF9CQVJSSUVSX05PVF9XQUlUSU5HOworICAgICAgICB0aHJfYmFyLT50ZWFtID0gdGVhbTsKKyAgICAgICAgdGhyX2Jhci0+cGFyZW50X2JhciA9ICZ0ZWFtLT50LnRfdGhyZWFkc1t0aHJfYmFyLT5wYXJlbnRfdGlkXS0+dGgudGhfYmFyW2J0XS5iYjsKKyAgICB9CisgICAgaWYgKHVuaW5pdGlhbGl6ZWQgfHwgdGVhbV9jaGFuZ2VkIHx8IHRpZF9jaGFuZ2VkKSB7CisgICAgICAgIHRocl9iYXItPnRlYW0gPSB0ZWFtOworICAgICAgICB0aHJfYmFyLT5wYXJlbnRfYmFyID0gJnRlYW0tPnQudF90aHJlYWRzW3Rocl9iYXItPnBhcmVudF90aWRdLT50aC50aF9iYXJbYnRdLmJiOworICAgICAgICByZXR2YWwgPSB0cnVlOworICAgIH0KKyAgICBpZiAodW5pbml0aWFsaXplZCB8fCB0ZWFtX3N6X2NoYW5nZWQgfHwgdGlkX2NoYW5nZWQpIHsKKyAgICAgICAgdGhyX2Jhci0+bnByb2MgPSBucHJvYzsKKyAgICAgICAgdGhyX2Jhci0+bGVhZl9raWRzID0gdGhyX2Jhci0+YmFzZV9sZWFmX2tpZHM7CisgICAgICAgIGlmICh0aHJfYmFyLT5teV9sZXZlbCA9PSAwKSB0aHJfYmFyLT5sZWFmX2tpZHM9MDsKKyAgICAgICAgaWYgKHRocl9iYXItPmxlYWZfa2lkcyAmJiAoa21wX3VpbnQzMil0aWQrdGhyX2Jhci0+bGVhZl9raWRzKzEgPiBucHJvYykKKyAgICAgICAgICAgIHRocl9iYXItPmxlYWZfa2lkcyA9IG5wcm9jIC0gdGlkIC0gMTsKKyAgICAgICAgdGhyX2Jhci0+bGVhZl9zdGF0ZSA9IDA7CisgICAgICAgIGZvciAoaW50IGk9MDsgaTx0aHJfYmFyLT5sZWFmX2tpZHM7ICsraSkgKChjaGFyICopJih0aHJfYmFyLT5sZWFmX3N0YXRlKSlbNy1pXSA9IDE7CisgICAgfQorICAgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9nYXRoZXIoZW51bSBiYXJyaWVyX3R5cGUgYnQsIGttcF9pbmZvX3QgKnRoaXNfdGhyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBndGlkLCBpbnQgdGlkLCB2b2lkICgqcmVkdWNlKSAodm9pZCAqLCB2b2lkICopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqIGl0dF9zeW5jX29iaikgKQoreworICAgIEtNUF9USU1FX0RFVkVMT1BFUl9CTE9DSyhLTVBfaGllcl9nYXRoZXIpOworICAgIHJlZ2lzdGVyIGttcF90ZWFtX3QgKnRlYW0gPSB0aGlzX3Roci0+dGgudGhfdGVhbTsKKyAgICByZWdpc3RlciBrbXBfYnN0YXRlX3QgKnRocl9iYXIgPSAmIHRoaXNfdGhyLT50aC50aF9iYXJbYnRdLmJiOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgbnByb2MgPSB0aGlzX3Roci0+dGgudGhfdGVhbV9ucHJvYzsKKyAgICByZWdpc3RlciBrbXBfaW5mb190ICoqb3RoZXJfdGhyZWFkcyA9IHRlYW0tPnQudF90aHJlYWRzOworICAgIHJlZ2lzdGVyIGttcF91aW50NjQgbmV3X3N0YXRlOworCisgICAgaW50IGxldmVsID0gdGVhbS0+dC50X2xldmVsOworI2lmIE9NUF80MF9FTkFCTEVECisgICAgaWYgKG90aGVyX3RocmVhZHNbMF0tPnRoLnRoX3RlYW1zX21pY3JvdGFzaykgICAgLy8gYXJlIHdlIGluc2lkZSB0aGUgdGVhbXMgY29uc3RydWN0PworICAgICAgICBpZiAodGhpc190aHItPnRoLnRoX3RlYW1zX3NpemUubnRlYW1zID4gMSkKKyAgICAgICAgICAgICsrbGV2ZWw7IC8vIGxldmVsIHdhcyBub3QgaW5jcmVhc2VkIGluIHRlYW1zIGNvbnN0cnVjdCBmb3IgdGVhbV9vZl9tYXN0ZXJzCisjZW5kaWYKKyAgICBpZiAobGV2ZWwgPT0gMSkgdGhyX2Jhci0+dXNlX29uY29yZV9iYXJyaWVyID0gMTsKKyAgICBlbHNlIHRocl9iYXItPnVzZV9vbmNvcmVfYmFycmllciA9IDA7IC8vIERvIG5vdCB1c2Ugb25jb3JlIGJhcnJpZXIgd2hlbiBuZXN0ZWQKKworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2hpZXJhcmNoaWNhbF9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgZW50ZXIgZm9yIGJhcnJpZXIgdHlwZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBidCkpOworICAgIEtNUF9ERUJVR19BU1NFUlQodGhpc190aHIgPT0gb3RoZXJfdGhyZWFkc1t0aGlzX3Roci0+dGgudGhfaW5mby5kcy5kc190aWRdKTsKKworI2lmIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICAvLyBCYXJyaWVyIGltYmFsYW5jZSAtIHNhdmUgYXJyaXZlIHRpbWUgdG8gdGhlIHRocmVhZAorICAgIGlmKF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDMgfHwgX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMikgeworICAgICAgICB0aGlzX3Roci0+dGgudGhfYmFyX2Fycml2ZV90aW1lID0gX19pdHRfZ2V0X3RpbWVzdGFtcCgpOworICAgIH0KKyNlbmRpZgorCisgICAgKHZvaWQpX19rbXBfaW5pdF9oaWVyYXJjaGljYWxfYmFycmllcl90aHJlYWQoYnQsIHRocl9iYXIsIG5wcm9jLCBndGlkLCB0aWQsIHRlYW0pOworCisgICAgaWYgKHRocl9iYXItPm15X2xldmVsKSB7IC8vIG5vdCBhIGxlYWYgKG15X2xldmVsPT0wIG1lYW5zIGxlYWYpCisgICAgICAgIHJlZ2lzdGVyIGttcF9pbnQzMiBjaGlsZF90aWQ7CisgICAgICAgIG5ld19zdGF0ZSA9IChrbXBfdWludDY0KXRlYW0tPnQudF9iYXJbYnRdLmJfYXJyaXZlZCArIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVA7CisgICAgICAgIGlmIChfX2ttcF9kZmx0X2Jsb2NrdGltZSA9PSBLTVBfTUFYX0JMT0NLVElNRSAmJiB0aHJfYmFyLT51c2Vfb25jb3JlX2JhcnJpZXIpIHsKKyAgICAgICAgICAgIGlmICh0aHJfYmFyLT5sZWFmX2tpZHMpIHsgLy8gRmlyc3QsIHdhaXQgZm9yIGxlYWYgY2hpbGRyZW4gdG8gY2hlY2staW4gb24gbXkgYl9hcnJpdmVkIGZsYWcKKyAgICAgICAgICAgICAgICBrbXBfdWludDY0IGxlYWZfc3RhdGUgPSBLTVBfTUFTVEVSX1RJRCh0aWQpID8gdGhyX2Jhci0+Yl9hcnJpdmVkIHwgdGhyX2Jhci0+bGVhZl9zdGF0ZSA6IHRlYW0tPnQudF9iYXJbYnRdLmJfYXJyaXZlZCB8IHRocl9iYXItPmxlYWZfc3RhdGU7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfaGllcmFyY2hpY2FsX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSB3YWl0aW5nIGZvciBsZWFmIGtpZHNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCkpOworICAgICAgICAgICAgICAgIGttcF9mbGFnXzY0IGZsYWcoJnRocl9iYXItPmJfYXJyaXZlZCwgbGVhZl9zdGF0ZSk7CisgICAgICAgICAgICAgICAgZmxhZy53YWl0KHRoaXNfdGhyLCBGQUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopICk7CisgICAgICAgICAgICAgICAgaWYgKHJlZHVjZSkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGNoaWxkX3RpZD10aWQrMTsgY2hpbGRfdGlkPD10aWQrdGhyX2Jhci0+bGVhZl9raWRzOyArK2NoaWxkX3RpZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMTAwLCAoIl9fa21wX2hpZXJhcmNoaWNhbF9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgKz0gVCMlZCglZDolZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgX19rbXBfZ3RpZF9mcm9tX3RpZChjaGlsZF90aWQsIHRlYW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCBjaGlsZF90aWQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICgqcmVkdWNlKSh0aGlzX3Roci0+dGgudGhfbG9jYWwucmVkdWNlX2RhdGEsIG90aGVyX3RocmVhZHNbY2hpbGRfdGlkXS0+dGgudGhfbG9jYWwucmVkdWNlX2RhdGEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICh2b2lkKSBLTVBfVEVTVF9USEVOX0FORDY0KCh2b2xhdGlsZSBrbXBfaW50NjQgKikmdGhyX2Jhci0+Yl9hcnJpdmVkLCB+KHRocl9iYXItPmxlYWZfc3RhdGUpKTsgLy8gY2xlYXIgbGVhZl9zdGF0ZSBiaXRzCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBOZXh0LCB3YWl0IGZvciBoaWdoZXIgbGV2ZWwgY2hpbGRyZW4gb24gZWFjaCBjaGlsZCdzIGJfYXJyaXZlZCBmbGFnCisgICAgICAgICAgICBmb3IgKGttcF91aW50MzIgZD0xOyBkPHRocl9iYXItPm15X2xldmVsOyArK2QpIHsgLy8gZ2F0aGVyIGxvd2VzdCBsZXZlbCB0aHJlYWRzIGZpcnN0LCBidXQgc2tpcCAwCisgICAgICAgICAgICAgICAga21wX3VpbnQzMiBsYXN0ID0gdGlkK3Rocl9iYXItPnNraXBfcGVyX2xldmVsW2QrMV0sIHNraXAgPSB0aHJfYmFyLT5za2lwX3Blcl9sZXZlbFtkXTsKKyAgICAgICAgICAgICAgICBpZiAobGFzdCA+IG5wcm9jKSBsYXN0ID0gbnByb2M7CisgICAgICAgICAgICAgICAgZm9yIChjaGlsZF90aWQ9dGlkK3NraXA7IGNoaWxkX3RpZDwoaW50KWxhc3Q7IGNoaWxkX3RpZCs9c2tpcCkgeworICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBrbXBfaW5mb190ICpjaGlsZF90aHIgPSBvdGhlcl90aHJlYWRzW2NoaWxkX3RpZF07CisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGttcF9ic3RhdGVfdCAqY2hpbGRfYmFyID0gJmNoaWxkX3Roci0+dGgudGhfYmFyW2J0XS5iYjsKKyAgICAgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfaGllcmFyY2hpY2FsX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSB3YWl0IFQjJWQoJWQ6JWQpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJyaXZlZCglcCkgPT0gJWxsdVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgX19rbXBfZ3RpZF9mcm9tX3RpZChjaGlsZF90aWQsIHRlYW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgY2hpbGRfdGlkLCAmY2hpbGRfYmFyLT5iX2Fycml2ZWQsIG5ld19zdGF0ZSkpOworICAgICAgICAgICAgICAgICAgICBrbXBfZmxhZ182NCBmbGFnKCZjaGlsZF9iYXItPmJfYXJyaXZlZCwgbmV3X3N0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgZmxhZy53YWl0KHRoaXNfdGhyLCBGQUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworICAgICAgICAgICAgICAgICAgICBpZiAocmVkdWNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBLQV9UUkFDRSgxMDAsICgiX19rbXBfaGllcmFyY2hpY2FsX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSArPSBUIyVkKCVkOiVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBfX2ttcF9ndGlkX2Zyb21fdGlkKGNoaWxkX3RpZCwgdGVhbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQsIGNoaWxkX3RpZCkpOworICAgICAgICAgICAgICAgICAgICAgICAgKCpyZWR1Y2UpKHRoaXNfdGhyLT50aC50aF9sb2NhbC5yZWR1Y2VfZGF0YSwgY2hpbGRfdGhyLT50aC50aF9sb2NhbC5yZWR1Y2VfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7IC8vIEJsb2NrdGltZSBpcyBub3QgaW5maW5pdGUKKyAgICAgICAgICAgIGZvciAoa21wX3VpbnQzMiBkPTA7IGQ8dGhyX2Jhci0+bXlfbGV2ZWw7ICsrZCkgeyAvLyBHYXRoZXIgbG93ZXN0IGxldmVsIHRocmVhZHMgZmlyc3QKKyAgICAgICAgICAgICAgICBrbXBfdWludDMyIGxhc3QgPSB0aWQrdGhyX2Jhci0+c2tpcF9wZXJfbGV2ZWxbZCsxXSwgc2tpcCA9IHRocl9iYXItPnNraXBfcGVyX2xldmVsW2RdOworICAgICAgICAgICAgICAgIGlmIChsYXN0ID4gbnByb2MpIGxhc3QgPSBucHJvYzsKKyAgICAgICAgICAgICAgICBmb3IgKGNoaWxkX3RpZD10aWQrc2tpcDsgY2hpbGRfdGlkPChpbnQpbGFzdDsgY2hpbGRfdGlkKz1za2lwKSB7CisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGttcF9pbmZvX3QgKmNoaWxkX3RociA9IG90aGVyX3RocmVhZHNbY2hpbGRfdGlkXTsKKyAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIga21wX2JzdGF0ZV90ICpjaGlsZF9iYXIgPSAmY2hpbGRfdGhyLT50aC50aF9iYXJbYnRdLmJiOworICAgICAgICAgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIHdhaXQgVCMlZCglZDolZCkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcnJpdmVkKCVwKSA9PSAlbGx1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBfX2ttcF9ndGlkX2Zyb21fdGlkKGNoaWxkX3RpZCwgdGVhbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCBjaGlsZF90aWQsICZjaGlsZF9iYXItPmJfYXJyaXZlZCwgbmV3X3N0YXRlKSk7CisgICAgICAgICAgICAgICAgICAgIGttcF9mbGFnXzY0IGZsYWcoJmNoaWxkX2Jhci0+Yl9hcnJpdmVkLCBuZXdfc3RhdGUpOworICAgICAgICAgICAgICAgICAgICBmbGFnLndhaXQodGhpc190aHIsIEZBTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopICk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZWR1Y2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtBX1RSQUNFKDEwMCwgKCJfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpICs9IFQjJWQoJWQ6JWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIF9fa21wX2d0aWRfZnJvbV90aWQoY2hpbGRfdGlkLCB0ZWFtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgY2hpbGRfdGlkKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAoKnJlZHVjZSkodGhpc190aHItPnRoLnRoX2xvY2FsLnJlZHVjZV9kYXRhLCBjaGlsZF90aHItPnRoLnRoX2xvY2FsLnJlZHVjZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBBbGwgc3Vib3JkaW5hdGVzIGFyZSBnYXRoZXJlZDsgbm93IHJlbGVhc2UgcGFyZW50IGlmIG5vdCBtYXN0ZXIgdGhyZWFkCisKKyAgICBpZiAoIUtNUF9NQVNURVJfVElEKHRpZCkpIHsgLy8gd29ya2VyIHRocmVhZHMgcmVsZWFzZSBwYXJlbnQgaW4gaGllcmFyY2h5CisgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2hpZXJhcmNoaWNhbF9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgcmVsZWFzaW5nIFQjJWQoJWQ6JWQpICIKKyAgICAgICAgICAgICAgICAgICAgICAiYXJyaXZlZCglcCk6ICVsbHUgPT4gJWxsdVxuIiwgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RpZCh0aHJfYmFyLT5wYXJlbnRfdGlkLCB0ZWFtKSwgdGVhbS0+dC50X2lkLCB0aHJfYmFyLT5wYXJlbnRfdGlkLAorICAgICAgICAgICAgICAgICAgICAgICZ0aHJfYmFyLT5iX2Fycml2ZWQsIHRocl9iYXItPmJfYXJyaXZlZCwgdGhyX2Jhci0+Yl9hcnJpdmVkK0tNUF9CQVJSSUVSX1NUQVRFX0JVTVApKTsKKyAgICAgICAgLyogTWFyayBhcnJpdmFsIHRvIHBhcmVudDogQWZ0ZXIgcGVyZm9ybWluZyB0aGlzIHdyaXRlLCBhIHdvcmtlciB0aHJlYWQgbWF5IG5vdCBhc3N1bWUgdGhhdAorICAgICAgICAgICB0aGUgdGVhbSBpcyB2YWxpZCBhbnkgbW9yZSAtIGl0IGNvdWxkIGJlIGRlYWxsb2NhdGVkIGJ5IHRoZSBtYXN0ZXIgdGhyZWFkIGF0IGFueSB0aW1lLiAqLworICAgICAgICBpZiAodGhyX2Jhci0+bXlfbGV2ZWwgfHwgX19rbXBfZGZsdF9ibG9ja3RpbWUgIT0gS01QX01BWF9CTE9DS1RJTUUKKyAgICAgICAgICAgIHx8ICF0aHJfYmFyLT51c2Vfb25jb3JlX2JhcnJpZXIpIHsgLy8gUGFyZW50IGlzIHdhaXRpbmcgb24gbXkgYl9hcnJpdmVkIGZsYWc7IHJlbGVhc2UgaXQKKyAgICAgICAgICAgIGttcF9mbGFnXzY0IGZsYWcoJnRocl9iYXItPmJfYXJyaXZlZCwgb3RoZXJfdGhyZWFkc1t0aHJfYmFyLT5wYXJlbnRfdGlkXSk7CisgICAgICAgICAgICBmbGFnLnJlbGVhc2UoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsgLy8gTGVhZiBkb2VzIHNwZWNpYWwgcmVsZWFzZSBvbiB0aGUgIm9mZnNldCIgYml0cyBvZiBwYXJlbnQncyBiX2Fycml2ZWQgZmxhZworICAgICAgICAgICAgdGhyX2Jhci0+Yl9hcnJpdmVkID0gdGVhbS0+dC50X2JhcltidF0uYl9hcnJpdmVkICsgS01QX0JBUlJJRVJfU1RBVEVfQlVNUDsKKyAgICAgICAgICAgIGttcF9mbGFnX29uY29yZSBmbGFnKCZ0aHJfYmFyLT5wYXJlbnRfYmFyLT5iX2Fycml2ZWQsIHRocl9iYXItPm9mZnNldCk7CisgICAgICAgICAgICBmbGFnLnNldF93YWl0ZXIob3RoZXJfdGhyZWFkc1t0aHJfYmFyLT5wYXJlbnRfdGlkXSk7CisgICAgICAgICAgICBmbGFnLnJlbGVhc2UoKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7IC8vIE1hc3RlciB0aHJlYWQgbmVlZHMgdG8gdXBkYXRlIHRoZSB0ZWFtJ3MgYl9hcnJpdmVkIHZhbHVlCisgICAgICAgIHRlYW0tPnQudF9iYXJbYnRdLmJfYXJyaXZlZCA9IG5ld19zdGF0ZTsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfaGllcmFyY2hpY2FsX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSBzZXQgdGVhbSAlZCBhcnJpdmVkKCVwKSA9ICVsbHVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIHRlYW0tPnQudF9pZCwgJnRlYW0tPnQudF9iYXJbYnRdLmJfYXJyaXZlZCwgdGVhbS0+dC50X2JhcltidF0uYl9hcnJpdmVkKSk7CisgICAgfQorICAgIC8vIElzIHRoZSB0ZWFtIGFjY2VzcyBiZWxvdyB1bnNhZmUgb3IganVzdCB0ZWNobmljYWxseSBpbnZhbGlkPworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2hpZXJhcmNoaWNhbF9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgZXhpdCBmb3IgYmFycmllciB0eXBlICVkXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIGJ0KSk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9yZWxlYXNlKGVudW0gYmFycmllcl90eXBlIGJ0LCBrbXBfaW5mb190ICp0aGlzX3RociwgaW50IGd0aWQsIGludCB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcm9wYWdhdGVfaWN2cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyh2b2lkICogaXR0X3N5bmNfb2JqKSApCit7CisgICAgS01QX1RJTUVfREVWRUxPUEVSX0JMT0NLKEtNUF9oaWVyX3JlbGVhc2UpOworICAgIHJlZ2lzdGVyIGttcF90ZWFtX3QgKnRlYW07CisgICAgcmVnaXN0ZXIga21wX2JzdGF0ZV90ICp0aHJfYmFyID0gJnRoaXNfdGhyLT50aC50aF9iYXJbYnRdLmJiOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgbnByb2M7CisgICAgYm9vbCB0ZWFtX2NoYW5nZSA9IGZhbHNlOyAvLyBpbmRpY2F0ZXMgb24tY29yZSBiYXJyaWVyIHNob3VsZG4ndCBiZSB1c2VkCisKKyAgICBpZiAoS01QX01BU1RFUl9USUQodGlkKSkgeworICAgICAgICB0ZWFtID0gX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfdGVhbTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0ZWFtICE9IE5VTEwpOworICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSBtYXN0ZXIgZW50ZXJlZCBiYXJyaWVyIHR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIGJ0KSk7CisgICAgfQorICAgIGVsc2UgeyAvLyBXb3JrZXIgdGhyZWFkcworICAgICAgICAvLyBXYWl0IGZvciBwYXJlbnQgdGhyZWFkIHRvIHJlbGVhc2UgbWUKKyAgICAgICAgaWYgKCF0aHJfYmFyLT51c2Vfb25jb3JlX2JhcnJpZXIgfHwgX19rbXBfZGZsdF9ibG9ja3RpbWUgIT0gS01QX01BWF9CTE9DS1RJTUUKKyAgICAgICAgICAgIHx8IHRocl9iYXItPm15X2xldmVsICE9IDAgfHwgdGhyX2Jhci0+dGVhbSA9PSBOVUxMKSB7CisgICAgICAgICAgICAvLyBVc2UgdHJhZGl0aW9uYWwgbWV0aG9kIG9mIHdhaXRpbmcgb24gbXkgb3duIGJfZ28gZmxhZworICAgICAgICAgICAgdGhyX2Jhci0+d2FpdF9mbGFnID0gS01QX0JBUlJJRVJfT1dOX0ZMQUc7CisgICAgICAgICAgICBrbXBfZmxhZ182NCBmbGFnKCZ0aHJfYmFyLT5iX2dvLCBLTVBfQkFSUklFUl9TVEFURV9CVU1QKTsKKyAgICAgICAgICAgIGZsYWcud2FpdCh0aGlzX3RociwgVFJVRQorICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyAgICAgICAgICAgIFRDV184KHRocl9iYXItPmJfZ28sIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUpOyAvLyBSZXNldCBteSBiX2dvIGZsYWcgZm9yIG5leHQgdGltZQorICAgICAgICB9CisgICAgICAgIGVsc2UgeyAvLyBUaHJlYWQgYmFycmllciBkYXRhIGlzIGluaXRpYWxpemVkLCB0aGlzIGlzIGEgbGVhZiwgYmxvY2t0aW1lIGlzIGluZmluaXRlLCBub3QgbmVzdGVkCisgICAgICAgICAgICAvLyBXYWl0IG9uIG15ICJvZmZzZXQiIGJpdHMgb24gcGFyZW50J3MgYl9nbyBmbGFnCisgICAgICAgICAgICB0aHJfYmFyLT53YWl0X2ZsYWcgPSBLTVBfQkFSUklFUl9QQVJFTlRfRkxBRzsKKyAgICAgICAgICAgIGttcF9mbGFnX29uY29yZSBmbGFnKCZ0aHJfYmFyLT5wYXJlbnRfYmFyLT5iX2dvLCBLTVBfQkFSUklFUl9TVEFURV9CVU1QLCB0aHJfYmFyLT5vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidCwgdGhpc190aHIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyAgICAgICAgICAgIGZsYWcud2FpdCh0aGlzX3RociwgVFJVRSk7CisgICAgICAgICAgICBpZiAodGhyX2Jhci0+d2FpdF9mbGFnID09IEtNUF9CQVJSSUVSX1NXSVRDSElORykgeyAvLyBUaHJlYWQgd2FzIHN3aXRjaGVkIHRvIG93biBiX2dvCisgICAgICAgICAgICAgICAgVENXXzgodGhyX2Jhci0+Yl9nbywgS01QX0lOSVRfQkFSUklFUl9TVEFURSk7IC8vIFJlc2V0IG15IGJfZ28gZmxhZyBmb3IgbmV4dCB0aW1lCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsgLy8gUmVzZXQgbXkgYml0cyBvbiBwYXJlbnQncyBiX2dvIGZsYWcKKyAgICAgICAgICAgICAgICAoKGNoYXIqKSYodGhyX2Jhci0+cGFyZW50X2Jhci0+Yl9nbykpW3Rocl9iYXItPm9mZnNldF0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRocl9iYXItPndhaXRfZmxhZyA9IEtNUF9CQVJSSUVSX05PVF9XQUlUSU5HOworICAgICAgICAvLyBFYXJseSBleGl0IGZvciByZWFwaW5nIHRocmVhZHMgcmVsZWFzaW5nIGZvcmtqb2luIGJhcnJpZXIKKyAgICAgICAgaWYgKGJ0ID09IGJzX2Zvcmtqb2luX2JhcnJpZXIgJiYgVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgLy8gVGhlIHdvcmtlciB0aHJlYWQgbWF5IG5vdyBhc3N1bWUgdGhhdCB0aGUgdGVhbSBpcyB2YWxpZC4KKyAgICAgICAgdGVhbSA9IF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX3RlYW07CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGVhbSAhPSBOVUxMKTsKKyAgICAgICAgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKTsKKworICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSBzZXQgZ28oJXApID0gJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsICZ0aHJfYmFyLT5iX2dvLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFKSk7CisgICAgICAgIEtNUF9NQigpOyAgLy8gRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLgorICAgIH0KKworICAgIG5wcm9jID0gdGhpc190aHItPnRoLnRoX3RlYW1fbnByb2M7CisgICAgaW50IGxldmVsID0gdGVhbS0+dC50X2xldmVsOworI2lmIE9NUF80MF9FTkFCTEVECisgICAgaWYgKHRlYW0tPnQudF90aHJlYWRzWzBdLT50aC50aF90ZWFtc19taWNyb3Rhc2sgKSB7ICAgIC8vIGFyZSB3ZSBpbnNpZGUgdGhlIHRlYW1zIGNvbnN0cnVjdD8KKyAgICAgICAgaWYgKHRlYW0tPnQudF9wa2ZuICE9IChtaWNyb3Rhc2tfdClfX2ttcF90ZWFtc19tYXN0ZXIgJiYgdGhpc190aHItPnRoLnRoX3RlYW1zX2xldmVsID09IGxldmVsKQorICAgICAgICAgICAgKytsZXZlbDsgLy8gbGV2ZWwgd2FzIG5vdCBpbmNyZWFzZWQgaW4gdGVhbXMgY29uc3RydWN0IGZvciB0ZWFtX29mX3dvcmtlcnMKKyAgICAgICAgaWYoIHRoaXNfdGhyLT50aC50aF90ZWFtc19zaXplLm50ZWFtcyA+IDEgKQorICAgICAgICAgICAgKytsZXZlbDsgLy8gbGV2ZWwgd2FzIG5vdCBpbmNyZWFzZWQgaW4gdGVhbXMgY29uc3RydWN0IGZvciB0ZWFtX29mX21hc3RlcnMKKyAgICB9CisjZW5kaWYKKyAgICBpZiAobGV2ZWwgPT0gMSkgdGhyX2Jhci0+dXNlX29uY29yZV9iYXJyaWVyID0gMTsKKyAgICBlbHNlIHRocl9iYXItPnVzZV9vbmNvcmVfYmFycmllciA9IDA7IC8vIERvIG5vdCB1c2Ugb25jb3JlIGJhcnJpZXIgd2hlbiBuZXN0ZWQKKworICAgIC8vIElmIHRoZSB0ZWFtIHNpemUgaGFzIGluY3JlYXNlZCwgd2Ugc3RpbGwgY29tbXVuaWNhdGUgd2l0aCBvbGQgbGVhdmVzIHZpYSBvbmNvcmUgYmFycmllci4KKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgb2xkX2xlYWZfa2lkcyA9IHRocl9iYXItPmxlYWZfa2lkczsKKyAgICBrbXBfdWludDY0IG9sZF9sZWFmX3N0YXRlID0gdGhyX2Jhci0+bGVhZl9zdGF0ZTsKKyAgICB0ZWFtX2NoYW5nZSA9IF9fa21wX2luaXRfaGllcmFyY2hpY2FsX2JhcnJpZXJfdGhyZWFkKGJ0LCB0aHJfYmFyLCBucHJvYywgZ3RpZCwgdGlkLCB0ZWFtKTsKKyAgICAvLyBCdXQgaWYgdGhlIGVudGlyZSB0ZWFtIGNoYW5nZXMsIHdlIHdvbid0IHVzZSBvbmNvcmUgYmFycmllciBhdCBhbGwKKyAgICBpZiAodGVhbV9jaGFuZ2UpIG9sZF9sZWFmX2tpZHMgPSAwOworCisjaWYgS01QX0JBUlJJRVJfSUNWX1BVU0gKKyAgICBpZiAocHJvcGFnYXRlX2ljdnMpIHsKKyAgICAgICAgX19rbXBfaW5pdF9pbXBsaWNpdF90YXNrKHRlYW0tPnQudF9pZGVudCwgdGVhbS0+dC50X3RocmVhZHNbdGlkXSwgdGVhbSwgdGlkLCBGQUxTRSk7CisgICAgICAgIGlmIChLTVBfTUFTVEVSX1RJRCh0aWQpKSB7IC8vIG1hc3RlciBhbHJlYWR5IGhhcyBjb3B5IGluIGZpbmFsIGRlc3RpbmF0aW9uOyBjb3B5CisgICAgICAgICAgICBjb3B5X2ljdnMoJnRocl9iYXItPnRoX2ZpeGVkX2ljdnMsICZ0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLnRkX2ljdnMpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKF9fa21wX2RmbHRfYmxvY2t0aW1lID09IEtNUF9NQVhfQkxPQ0tUSU1FICYmIHRocl9iYXItPnVzZV9vbmNvcmVfYmFycmllcikgeyAvLyBvcHRpbWl6YXRpb24gZm9yIGluZiBibG9ja3RpbWUKKyAgICAgICAgICAgIGlmICghdGhyX2Jhci0+bXlfbGV2ZWwpIC8vIEknbSBhIGxlYWYgaW4gdGhlIGhpZXJhcmNoeSAobXlfbGV2ZWw9PTApCisgICAgICAgICAgICAgICAgLy8gbGVhdmVzIChvbi1jb3JlIGNoaWxkcmVuKSBwdWxsIHBhcmVudCdzIGZpeGVkIElDVnMgZGlyZWN0bHkgdG8gbG9jYWwgSUNWIHN0b3JlCisgICAgICAgICAgICAgICAgY29weV9pY3ZzKCZ0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLnRkX2ljdnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aHJfYmFyLT5wYXJlbnRfYmFyLT50aF9maXhlZF9pY3ZzKTsKKyAgICAgICAgICAgIC8vIG5vbi1sZWF2ZXMgd2lsbCBnZXQgSUNWcyBwaWdneWJhY2tlZCB3aXRoIGJfZ28gdmlhIE5HTyBzdG9yZQorICAgICAgICB9CisgICAgICAgIGVsc2UgeyAvLyBibG9ja3RpbWUgaXMgbm90IGluZmluaXRlOyBwdWxsIElDVnMgZnJvbSBwYXJlbnQncyBmaXhlZCBJQ1ZzCisgICAgICAgICAgICBpZiAodGhyX2Jhci0+bXlfbGV2ZWwpIC8vIG5vdCBhIGxlYWY7IGNvcHkgSUNWcyB0byBteSBmaXhlZCBJQ1ZzIGNoaWxkIGNhbiBhY2Nlc3MKKyAgICAgICAgICAgICAgICBjb3B5X2ljdnMoJnRocl9iYXItPnRoX2ZpeGVkX2ljdnMsICZ0aHJfYmFyLT5wYXJlbnRfYmFyLT50aF9maXhlZF9pY3ZzKTsKKyAgICAgICAgICAgIGVsc2UgLy8gbGVhdmVzIGNvcHkgcGFyZW50J3MgZml4ZWQgSUNWcyBkaXJlY3RseSB0byBsb2NhbCBJQ1Ygc3RvcmUKKyAgICAgICAgICAgICAgICBjb3B5X2ljdnMoJnRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0udGRfaWN2cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRocl9iYXItPnBhcmVudF9iYXItPnRoX2ZpeGVkX2ljdnMpOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8vIEtNUF9CQVJSSUVSX0lDVl9QVVNICisKKyAgICAvLyBOb3csIHJlbGVhc2UgbXkgY2hpbGRyZW4KKyAgICBpZiAodGhyX2Jhci0+bXlfbGV2ZWwpIHsgLy8gbm90IGEgbGVhZgorICAgICAgICByZWdpc3RlciBrbXBfaW50MzIgY2hpbGRfdGlkOworICAgICAgICBrbXBfdWludDMyIGxhc3Q7CisgICAgICAgIGlmIChfX2ttcF9kZmx0X2Jsb2NrdGltZSA9PSBLTVBfTUFYX0JMT0NLVElNRSAmJiB0aHJfYmFyLT51c2Vfb25jb3JlX2JhcnJpZXIpIHsKKyAgICAgICAgICAgIGlmIChLTVBfTUFTVEVSX1RJRCh0aWQpKSB7IC8vIGRvIGEgZmxhdCByZWxlYXNlCisgICAgICAgICAgICAgICAgLy8gU2V0IGxvY2FsIGJfZ28gdG8gYnVtcCBjaGlsZHJlbiB2aWEgTkdPIHN0b3JlIG9mIHRoZSBjYWNoZSBsaW5lIGNvbnRhaW5pbmcgSVZDcyBhbmQgYl9nby4KKyAgICAgICAgICAgICAgICB0aHJfYmFyLT5iX2dvID0gS01QX0JBUlJJRVJfU1RBVEVfQlVNUDsKKyAgICAgICAgICAgICAgICAvLyBVc2UgbmdvIHN0b3JlcyBpZiBhdmFpbGFibGU7IGJfZ28gcGlnZ3liYWNrcyBpbiB0aGUgbGFzdCA4IGJ5dGVzIG9mIHRoZSBjYWNoZSBsaW5lCisgICAgICAgICAgICAgICAgbmdvX2xvYWQoJnRocl9iYXItPnRoX2ZpeGVkX2ljdnMpOworICAgICAgICAgICAgICAgIC8vIFRoaXMgbG9vcHMgb3ZlciBhbGwgdGhlIHRocmVhZHMgc2tpcHBpbmcgb25seSB0aGUgbGVhZiBub2RlcyBpbiB0aGUgaGllcmFyY2h5CisgICAgICAgICAgICAgICAgZm9yIChjaGlsZF90aWQ9dGhyX2Jhci0+c2tpcF9wZXJfbGV2ZWxbMV07IGNoaWxkX3RpZDwoaW50KW5wcm9jOyBjaGlsZF90aWQrPXRocl9iYXItPnNraXBfcGVyX2xldmVsWzFdKSB7CisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGttcF9ic3RhdGVfdCAqY2hpbGRfYmFyID0gJnRlYW0tPnQudF90aHJlYWRzW2NoaWxkX3RpZF0tPnRoLnRoX2JhcltidF0uYmI7CisgICAgICAgICAgICAgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2hpZXJhcmNoaWNhbF9iYXJyaWVyX3JlbGVhc2U6IFQjJWQoJWQ6JWQpIHJlbGVhc2luZyBUIyVkKCVkOiVkKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGdvKCVwKTogJXUgPT4gJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIF9fa21wX2d0aWRfZnJvbV90aWQoY2hpbGRfdGlkLCB0ZWFtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQsIGNoaWxkX3RpZCwgJmNoaWxkX2Jhci0+Yl9nbywgY2hpbGRfYmFyLT5iX2dvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkX2Jhci0+Yl9nbyArIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVApKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gVXNlIG5nbyBzdG9yZSAoaWYgYXZhaWxhYmxlKSB0byBib3RoIHN0b3JlIElDVnMgYW5kIHJlbGVhc2UgY2hpbGQgdmlhIGNoaWxkJ3MgYl9nbworICAgICAgICAgICAgICAgICAgICBuZ29fc3RvcmVfZ28oJmNoaWxkX2Jhci0+dGhfZml4ZWRfaWN2cywgJnRocl9iYXItPnRoX2ZpeGVkX2ljdnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBuZ29fc3luYygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVENXXzgodGhyX2Jhci0+Yl9nbywgS01QX0lOSVRfQkFSUklFUl9TVEFURSk7IC8vIFJlc2V0IG15IGJfZ28gZmxhZyBmb3IgbmV4dCB0aW1lCisgICAgICAgICAgICAvLyBOb3csIHJlbGVhc2UgbGVhZiBjaGlsZHJlbgorICAgICAgICAgICAgaWYgKHRocl9iYXItPmxlYWZfa2lkcykgeyAvLyBpZiB0aGVyZSBhcmUgYW55CisgICAgICAgICAgICAgICAgLy8gV2UgdGVzdCB0ZWFtX2NoYW5nZSBvbiB0aGUgb2ZmLWNoYW5jZSB0aGF0IHRoZSBsZXZlbCAxIHRlYW0gY2hhbmdlZC4KKyAgICAgICAgICAgICAgICBpZiAodGVhbV9jaGFuZ2UgfHwgb2xkX2xlYWZfa2lkcyA8IHRocl9iYXItPmxlYWZfa2lkcykgeyAvLyBzb21lIG9sZCBsZWFmX2tpZHMsIHNvbWUgbmV3CisgICAgICAgICAgICAgICAgICAgIGlmIChvbGRfbGVhZl9raWRzKSB7IC8vIHJlbGVhc2Ugb2xkIGxlYWYga2lkcworICAgICAgICAgICAgICAgICAgICAgICAgdGhyX2Jhci0+Yl9nbyB8PSBvbGRfbGVhZl9zdGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBSZWxlYXNlIG5ldyBsZWFmIGtpZHMKKyAgICAgICAgICAgICAgICAgICAgbGFzdCA9IHRpZCt0aHJfYmFyLT5za2lwX3Blcl9sZXZlbFsxXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3QgPiBucHJvYykgbGFzdCA9IG5wcm9jOworICAgICAgICAgICAgICAgICAgICBmb3IgKGNoaWxkX3RpZD10aWQrMStvbGRfbGVhZl9raWRzOyBjaGlsZF90aWQ8KGludClsYXN0OyArK2NoaWxkX3RpZCkgeyAvLyBza2lwX3Blcl9sZXZlbFswXT0xCisgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBrbXBfaW5mb190ICAgKmNoaWxkX3RociA9IHRlYW0tPnQudF90aHJlYWRzW2NoaWxkX3RpZF07CisgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBrbXBfYnN0YXRlX3QgKmNoaWxkX2JhciA9ICZjaGlsZF90aHItPnRoLnRoX2JhcltidF0uYmI7CisgICAgICAgICAgICAgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSByZWxlYXNpbmciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgVCMlZCglZDolZCkgZ28oJXApOiAldSA9PiAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIF9fa21wX2d0aWRfZnJvbV90aWQoY2hpbGRfdGlkLCB0ZWFtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCBjaGlsZF90aWQsICZjaGlsZF9iYXItPmJfZ28sIGNoaWxkX2Jhci0+Yl9nbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRfYmFyLT5iX2dvICsgS01QX0JBUlJJRVJfU1RBVEVfQlVNUCkpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVsZWFzZSBjaGlsZCB1c2luZyBjaGlsZCdzIGJfZ28gZmxhZworICAgICAgICAgICAgICAgICAgICAgICAga21wX2ZsYWdfNjQgZmxhZygmY2hpbGRfYmFyLT5iX2dvLCBjaGlsZF90aHIpOworICAgICAgICAgICAgICAgICAgICAgICAgZmxhZy5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7IC8vIFJlbGVhc2UgYWxsIGNoaWxkcmVuIGF0IG9uY2Ugd2l0aCBsZWFmX3N0YXRlIGJpdHMgb24gbXkgb3duIGJfZ28gZmxhZworICAgICAgICAgICAgICAgICAgICB0aHJfYmFyLT5iX2dvIHw9IHRocl9iYXItPmxlYWZfc3RhdGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeyAvLyBCbG9ja3RpbWUgaXMgbm90IGluZmluaXRlOyBkbyBhIHNpbXBsZSBoaWVyYXJjaGljYWwgcmVsZWFzZQorICAgICAgICAgICAgZm9yIChpbnQgZD10aHJfYmFyLT5teV9sZXZlbC0xOyBkPj0wOyAtLWQpIHsgLy8gUmVsZWFzZSBoaWdoZXN0IGxldmVsIHRocmVhZHMgZmlyc3QKKyAgICAgICAgICAgICAgICBsYXN0ID0gdGlkK3Rocl9iYXItPnNraXBfcGVyX2xldmVsW2QrMV07CisgICAgICAgICAgICAgICAga21wX3VpbnQzMiBza2lwID0gdGhyX2Jhci0+c2tpcF9wZXJfbGV2ZWxbZF07CisgICAgICAgICAgICAgICAgaWYgKGxhc3QgPiBucHJvYykgbGFzdCA9IG5wcm9jOworICAgICAgICAgICAgICAgIGZvciAoY2hpbGRfdGlkPXRpZCtza2lwOyBjaGlsZF90aWQ8KGludClsYXN0OyBjaGlsZF90aWQrPXNraXApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIga21wX2luZm9fdCAgICpjaGlsZF90aHIgPSB0ZWFtLT50LnRfdGhyZWFkc1tjaGlsZF90aWRdOworICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBrbXBfYnN0YXRlX3QgKmNoaWxkX2JhciA9ICZjaGlsZF90aHItPnRoLnRoX2JhcltidF0uYmI7CisgICAgICAgICAgICAgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2hpZXJhcmNoaWNhbF9iYXJyaWVyX3JlbGVhc2U6IFQjJWQoJWQ6JWQpIHJlbGVhc2luZyBUIyVkKCVkOiVkKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGdvKCVwKTogJXUgPT4gJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIF9fa21wX2d0aWRfZnJvbV90aWQoY2hpbGRfdGlkLCB0ZWFtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQsIGNoaWxkX3RpZCwgJmNoaWxkX2Jhci0+Yl9nbywgY2hpbGRfYmFyLT5iX2dvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkX2Jhci0+Yl9nbyArIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVApKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gUmVsZWFzZSBjaGlsZCB1c2luZyBjaGlsZCdzIGJfZ28gZmxhZworICAgICAgICAgICAgICAgICAgICBrbXBfZmxhZ182NCBmbGFnKCZjaGlsZF9iYXItPmJfZ28sIGNoaWxkX3Rocik7CisgICAgICAgICAgICAgICAgICAgIGZsYWcucmVsZWFzZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2lmIEtNUF9CQVJSSUVSX0lDVl9QVVNICisgICAgICAgIGlmIChwcm9wYWdhdGVfaWN2cyAmJiAhS01QX01BU1RFUl9USUQodGlkKSkgLy8gbm9uLWxlYXZlcyBjb3B5IElDVnMgZnJvbSBmaXhlZCBJQ1ZzIHRvIGxvY2FsIGRlc3QKKyAgICAgICAgICAgIGNvcHlfaWN2cygmdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS50ZF9pY3ZzLCAmdGhyX2Jhci0+dGhfZml4ZWRfaWN2cyk7CisjZW5kaWYgLy8gS01QX0JBUlJJRVJfSUNWX1BVU0gKKyAgICB9CisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfaGllcmFyY2hpY2FsX2JhcnJpZXJfcmVsZWFzZTogVCMlZCglZDolZCkgZXhpdCBmb3IgYmFycmllciB0eXBlICVkXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIGJ0KSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9mIEJhcnJpZXIgQWxnb3JpdGhtcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEludGVybmFsIGZ1bmN0aW9uIHRvIGRvIGEgYmFycmllci4KKy8qIElmIGlzX3NwbGl0IGlzIHRydWUsIGRvIGEgc3BsaXQgYmFycmllciwgb3RoZXJ3aXNlLCBkbyBhIHBsYWluIGJhcnJpZXIKKyAgIElmIHJlZHVjZSBpcyBub24tTlVMTCwgZG8gYSBzcGxpdCByZWR1Y3Rpb24gYmFycmllciwgb3RoZXJ3aXNlLCBkbyBhIHNwbGl0IGJhcnJpZXIKKyAgIFJldHVybnMgMCBpZiBtYXN0ZXIgdGhyZWFkLCAxIGlmIHdvcmtlciB0aHJlYWQuICAqLworaW50CitfX2ttcF9iYXJyaWVyKGVudW0gYmFycmllcl90eXBlIGJ0LCBpbnQgZ3RpZCwgaW50IGlzX3NwbGl0LCBzaXplX3QgcmVkdWNlX3NpemUsCisgICAgICAgICAgICAgIHZvaWQgKnJlZHVjZV9kYXRhLCB2b2lkICgqcmVkdWNlKSh2b2lkICosIHZvaWQgKikpCit7CisgICAgS01QX1RJTUVfREVWRUxPUEVSX0JMT0NLKEtNUF9iYXJyaWVyKTsKKyAgICByZWdpc3RlciBpbnQgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKTsKKyAgICByZWdpc3RlciBrbXBfaW5mb190ICp0aGlzX3RociA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgICAgcmVnaXN0ZXIga21wX3RlYW1fdCAqdGVhbSA9IHRoaXNfdGhyLT50aC50aF90ZWFtOworICAgIHJlZ2lzdGVyIGludCBzdGF0dXMgPSAwOworICAgIGlkZW50X3QgKmxvYyA9IF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX2lkZW50OworI2lmIE9NUFRfU1VQUE9SVAorICAgIG9tcHRfdGFza19pZF90IG15X3Rhc2tfaWQ7CisgICAgb21wdF9wYXJhbGxlbF9pZF90IG15X3BhcmFsbGVsX2lkOworI2VuZGlmCisKKyAgICBLQV9UUkFDRSgxNSwgKCJfX2ttcF9iYXJyaWVyOiBUIyVkKCVkOiVkKSBoYXMgYXJyaXZlZFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIF9fa21wX3RlYW1fZnJvbV9ndGlkKGd0aWQpLT50LnRfaWQsIF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCkpKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyNpZiBPTVBUX0JMQU1FCisgICAgICAgIG15X3Rhc2tfaWQgPSB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLm9tcHRfdGFza19pbmZvLnRhc2tfaWQ7CisgICAgICAgIG15X3BhcmFsbGVsX2lkID0gdGVhbS0+dC5vbXB0X3RlYW1faW5mby5wYXJhbGxlbF9pZDsKKworI2lmIE9NUFRfVFJBQ0UKKyAgICAgICAgaWYgKHRoaXNfdGhyLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID09IG9tcHRfc3RhdGVfd2FpdF9zaW5nbGUpIHsKKyAgICAgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfc2luZ2xlX290aGVyc19lbmQpKSB7CisgICAgICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3NpbmdsZV9vdGhlcnNfZW5kKSgKKyAgICAgICAgICAgICAgICAgICAgbXlfcGFyYWxsZWxfaWQsIG15X3Rhc2tfaWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9iYXJyaWVyX2JlZ2luKSkgeworICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW4pKAorICAgICAgICAgICAgICAgIG15X3BhcmFsbGVsX2lkLCBteV90YXNrX2lkKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIC8vIEl0IGlzIE9LIHRvIHJlcG9ydCB0aGUgYmFycmllciBzdGF0ZSBhZnRlciB0aGUgYmFycmllciBiZWdpbiBjYWxsYmFjay4KKyAgICAgICAgLy8gQWNjb3JkaW5nIHRvIHRoZSBPTVBUIHNwZWNpZmljYXRpb24sIGEgY29tcGxpYW50IGltcGxlbWVudGF0aW9uIG1heQorICAgICAgICAvLyBldmVuIGRlbGF5IHJlcG9ydGluZyB0aGlzIHN0YXRlIHVudGlsIHRoZSBiYXJyaWVyIGJlZ2lucyB0byB3YWl0LgorICAgICAgICB0aGlzX3Roci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfd2FpdF9iYXJyaWVyOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKCEgdGVhbS0+dC50X3NlcmlhbGl6ZWQpIHsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIC8vIFRoaXMgdmFsdWUgd2lsbCBiZSB1c2VkIGluIGl0dCBub3RpZnkgZXZlbnRzIGJlbG93LgorICAgICAgICB2b2lkICppdHRfc3luY19vYmogPSBOVUxMOworIyBpZiBVU0VfSVRUX05PVElGWQorICAgICAgICBpZiAoX19pdHRfc3luY19jcmVhdGVfcHRyIHx8IEtNUF9JVFRfREVCVUcpCisgICAgICAgICAgICBpdHRfc3luY19vYmogPSBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoZ3RpZCwgYnQsIDEpOworIyBlbmRpZgorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICAgICAgaWYgKF9fa21wX3Rhc2tpbmdfbW9kZSA9PSB0c2ttX2V4dHJhX2JhcnJpZXIpIHsKKyAgICAgICAgICAgIF9fa21wX3Rhc2tpbmdfYmFycmllcih0ZWFtLCB0aGlzX3RociwgZ3RpZCk7CisgICAgICAgICAgICBLQV9UUkFDRSgxNSwgKCJfX2ttcF9iYXJyaWVyOiBUIyVkKCVkOiVkKSBwYXN0IHRhc2tpbmcgYmFycmllclxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgX19rbXBfdGVhbV9mcm9tX2d0aWQoZ3RpZCktPnQudF9pZCwgX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKSkpOworICAgICAgICB9CisKKyAgICAgICAgLyogQ29weSB0aGUgYmxvY2t0aW1lIGluZm8gdG8gdGhlIHRocmVhZCwgd2hlcmUgX19rbXBfd2FpdF90ZW1wbGF0ZSgpIGNhbiBhY2Nlc3MgaXQgd2hlbgorICAgICAgICAgICB0aGUgdGVhbSBzdHJ1Y3QgaXMgbm90IGd1YXJhbnRlZWQgdG8gZXhpc3QuICovCisgICAgICAgIC8vIFNlZSBub3RlIGFib3V0IHRoZSBjb3JyZXNwb25kaW5nIGNvZGUgaW4gX19rbXBfam9pbl9iYXJyaWVyKCkgYmVpbmcgcGVyZm9ybWFuY2UtY3JpdGljYWwuCisgICAgICAgIGlmIChfX2ttcF9kZmx0X2Jsb2NrdGltZSAhPSBLTVBfTUFYX0JMT0NLVElNRSkgeworICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX3RlYW1fYnRfaW50ZXJ2YWxzID0gdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS50ZF9pY3ZzLmJ0X2ludGVydmFsczsKKyAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF90ZWFtX2J0X3NldCA9IHRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0udGRfaWN2cy5idF9zZXQ7CisgICAgICAgIH0KKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgaWYgKF9faXR0X3N5bmNfY3JlYXRlX3B0ciB8fCBLTVBfSVRUX0RFQlVHKQorICAgICAgICAgICAgX19rbXBfaXR0X2JhcnJpZXJfc3RhcnRpbmcoZ3RpZCwgaXR0X3N5bmNfb2JqKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisjaWYgVVNFX0RFQlVHR0VSCisgICAgICAgIC8vIExldCB0aGUgZGVidWdnZXIga25vdzogdGhlIHRocmVhZCBhcnJpdmVkIHRvIHRoZSBiYXJyaWVyIGFuZCB3YWl0aW5nLgorICAgICAgICBpZiAoS01QX01BU1RFUl9USUQodGlkKSkgeyAvLyBNYXN0ZXIgY291bnRlciBpcyBzdG9yZWQgaW4gdGVhbSBzdHJ1Y3R1cmUuCisgICAgICAgICAgICB0ZWFtLT50LnRfYmFyW2J0XS5iX21hc3Rlcl9hcnJpdmVkICs9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfYmFyW2J0XS5iYi5iX3dvcmtlcl9hcnJpdmVkICs9IDE7CisgICAgICAgIH0gLy8gaWYKKyNlbmRpZiAvKiBVU0VfREVCVUdHRVIgKi8KKyAgICAgICAgaWYgKHJlZHVjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAvL0tNUF9ERUJVR19BU1NFUlQoIGlzX3NwbGl0ID09IFRSVUUgKTsgIC8vICNDNjk5NTYKKyAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9sb2NhbC5yZWR1Y2VfZGF0YSA9IHJlZHVjZV9kYXRhOworICAgICAgICB9CisKKyAgICAgICAgaWYgKEtNUF9NQVNURVJfVElEKHRpZCkgJiYgX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMpCisgICAgICAgICAgICBfX2ttcF90YXNrX3RlYW1fc2V0dXAodGhpc190aHIsIHRlYW0sIDApOyAvLyB1c2UgMCB0byBvbmx5IHNldHVwIHRoZSBjdXJyZW50IHRlYW0gaWYgbnRocmVhZHMgPiAxCisKKyAgICAgICAgc3dpdGNoIChfX2ttcF9iYXJyaWVyX2dhdGhlcl9wYXR0ZXJuW2J0XSkgeworICAgICAgICBjYXNlIGJwX2h5cGVyX2JhcjogeworICAgICAgICAgICAgS01QX0FTU0VSVChfX2ttcF9iYXJyaWVyX2dhdGhlcl9icmFuY2hfYml0c1tidF0pOyAvLyBkb24ndCBzZXQgYnJhbmNoIGJpdHMgdG8gMDsgdXNlIGxpbmVhcgorICAgICAgICAgICAgX19rbXBfaHlwZXJfYmFycmllcl9nYXRoZXIoYnQsIHRoaXNfdGhyLCBndGlkLCB0aWQsIHJlZHVjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBicF9oaWVyYXJjaGljYWxfYmFyOiB7CisgICAgICAgICAgICBfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9nYXRoZXIoYnQsIHRoaXNfdGhyLCBndGlkLCB0aWQsIHJlZHVjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBicF90cmVlX2JhcjogeworICAgICAgICAgICAgS01QX0FTU0VSVChfX2ttcF9iYXJyaWVyX2dhdGhlcl9icmFuY2hfYml0c1tidF0pOyAvLyBkb24ndCBzZXQgYnJhbmNoIGJpdHMgdG8gMDsgdXNlIGxpbmVhcgorICAgICAgICAgICAgX19rbXBfdHJlZV9iYXJyaWVyX2dhdGhlcihidCwgdGhpc190aHIsIGd0aWQsIHRpZCwgcmVkdWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgIF9fa21wX2xpbmVhcl9iYXJyaWVyX2dhdGhlcihidCwgdGhpc190aHIsIGd0aWQsIHRpZCwgcmVkdWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBLTVBfTUIoKTsKKworICAgICAgICBpZiAoS01QX01BU1RFUl9USUQodGlkKSkgeworICAgICAgICAgICAgc3RhdHVzID0gMDsKKyAgICAgICAgICAgIGlmIChfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYykgeworICAgICAgICAgICAgICAgIF9fa21wX3Rhc2tfdGVhbV93YWl0KHRoaXNfdGhyLCB0ZWFtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworICAgICAgICAgICAgfQorI2lmIFVTRV9ERUJVR0dFUgorICAgICAgICAgICAgLy8gTGV0IHRoZSBkZWJ1Z2dlciBrbm93OiBBbGwgdGhyZWFkcyBhcmUgYXJyaXZlZCBhbmQgc3RhcnRpbmcgbGVhdmluZyB0aGUgYmFycmllci4KKyAgICAgICAgICAgIHRlYW0tPnQudF9iYXJbYnRdLmJfdGVhbV9hcnJpdmVkICs9IDE7CisjZW5kaWYKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgICAgIC8qIFRPRE86IEluIGNhc2Ugb2Ygc3BsaXQgcmVkdWN0aW9uIGJhcnJpZXIsIG1hc3RlciB0aHJlYWQgbWF5IHNlbmQgYWNxdWlyZWQgZXZlbnQgZWFybHksCisgICAgICAgICAgICAgICBiZWZvcmUgdGhlIGZpbmFsIHN1bW1hdGlvbiBpbnRvIHRoZSBzaGFyZWQgdmFyaWFibGUgaXMgZG9uZSAoZmluYWwgc3VtbWF0aW9uIGNhbiBiZSBhCisgICAgICAgICAgICAgICBsb25nIG9wZXJhdGlvbiBmb3IgYXJyYXkgcmVkdWN0aW9ucykuICAqLworICAgICAgICAgICAgaWYgKF9faXR0X3N5bmNfY3JlYXRlX3B0ciB8fCBLTVBfSVRUX0RFQlVHKQorICAgICAgICAgICAgICAgIF9fa21wX2l0dF9iYXJyaWVyX21pZGRsZShndGlkLCBpdHRfc3luY19vYmopOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyNpZiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZCisgICAgICAgICAgICAvLyBCYXJyaWVyIC0gcmVwb3J0IGZyYW1lIGVuZCAob25seSBpZiBhY3RpdmVfbGV2ZWwgPT0gMSkKKyAgICAgICAgICAgIGlmICgoX19pdHRfZnJhbWVfc3VibWl0X3YzX3B0ciB8fCBLTVBfSVRUX0RFQlVHKSAmJiBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSAmJgorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX3RlYW1zX21pY3JvdGFzayA9PSBOVUxMICYmCisjZW5kaWYKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfYWN0aXZlX2xldmVsID09IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAga21wX3VpbnQ2NCBjdXJfdGltZSA9IF9faXR0X2dldF90aW1lc3RhbXAoKTsKKyAgICAgICAgICAgICAgICBrbXBfaW5mb190ICoqb3RoZXJfdGhyZWFkcyA9IHRlYW0tPnQudF90aHJlYWRzOworICAgICAgICAgICAgICAgIGludCBucHJvYyA9IHRoaXNfdGhyLT50aC50aF90ZWFtX25wcm9jOworICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgIHN3aXRjaChfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSkgeworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfaXR0X2ZyYW1lX3N1Ym1pdChndGlkLCB0aGlzX3Roci0+dGgudGhfZnJhbWVfdGltZSwgY3VyX3RpbWUsIDAsIGxvYywgbnByb2MpOworICAgICAgICAgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfZnJhbWVfdGltZSA9IGN1cl90aW1lOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI6IC8vIEFDIDIwMTUtMDEtMTk6IGN1cnJlbnRseSBkb2VzIG5vdCB3b3JrIGZvciBoaWVyYXJjaGljYWwgKHRvIGJlIGZpeGVkKQorICAgICAgICAgICAgICAgICAgICBfX2ttcF9pdHRfZnJhbWVfc3VibWl0KGd0aWQsIHRoaXNfdGhyLT50aC50aF9iYXJfbWluX3RpbWUsIGN1cl90aW1lLCAxLCBsb2MsIG5wcm9jKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICBpZiggX19pdHRfbWV0YWRhdGFfYWRkX3B0ciApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluaXRpYWxpemUgd2l0aCBtYXN0ZXIncyB3YWl0IHRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50NjQgZGVsdGEgPSBjdXJfdGltZSAtIHRoaXNfdGhyLT50aC50aF9iYXJfYXJyaXZlX3RpbWU7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MTsgaTxucHJvYzsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgKz0gKCBjdXJfdGltZSAtIG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2Jhcl9hcnJpdmVfdGltZSApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfaXR0X21ldGFkYXRhX2ltYmFsYW5jZShndGlkLCB0aGlzX3Roci0+dGgudGhfZnJhbWVfdGltZSwgY3VyX3RpbWUsIGRlbHRhLCAoa21wX3VpbnQ2NCkoIHJlZHVjZSAhPSBOVUxMKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgX19rbXBfaXR0X2ZyYW1lX3N1Ym1pdChndGlkLCB0aGlzX3Roci0+dGgudGhfZnJhbWVfdGltZSwgY3VyX3RpbWUsIDAsIGxvYywgbnByb2MpOworICAgICAgICAgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfZnJhbWVfdGltZSA9IGN1cl90aW1lOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gMTsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICBpZiAoX19pdHRfc3luY19jcmVhdGVfcHRyIHx8IEtNUF9JVFRfREVCVUcpCisgICAgICAgICAgICAgICAgX19rbXBfaXR0X2JhcnJpZXJfbWlkZGxlKGd0aWQsIGl0dF9zeW5jX29iaik7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgICAgICB9CisgICAgICAgIGlmIChzdGF0dXMgPT0gMSB8fCAhIGlzX3NwbGl0KSB7CisgICAgICAgICAgICBzd2l0Y2ggKF9fa21wX2JhcnJpZXJfcmVsZWFzZV9wYXR0ZXJuW2J0XSkgeworICAgICAgICAgICAgY2FzZSBicF9oeXBlcl9iYXI6IHsKKyAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0c1tidF0pOworICAgICAgICAgICAgICAgIF9fa21wX2h5cGVyX2JhcnJpZXJfcmVsZWFzZShidCwgdGhpc190aHIsIGd0aWQsIHRpZCwgRkFMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBicF9oaWVyYXJjaGljYWxfYmFyOiB7CisgICAgICAgICAgICAgICAgX19rbXBfaGllcmFyY2hpY2FsX2JhcnJpZXJfcmVsZWFzZShidCwgdGhpc190aHIsIGd0aWQsIHRpZCwgRkFMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgYnBfdHJlZV9iYXI6IHsKKyAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0c1tidF0pOworICAgICAgICAgICAgICAgIF9fa21wX3RyZWVfYmFycmllcl9yZWxlYXNlKGJ0LCB0aGlzX3RociwgZ3RpZCwgdGlkLCBGQUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgICAgICBfX2ttcF9saW5lYXJfYmFycmllcl9yZWxlYXNlKGJ0LCB0aGlzX3RociwgZ3RpZCwgdGlkLCBGQUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjKSB7CisgICAgICAgICAgICAgICAgX19rbXBfdGFza190ZWFtX3N5bmModGhpc190aHIsIHRlYW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIC8qIEdFSDogVE9ETzogTW92ZSB0aGlzIHVuZGVyIGlmLWNvbmRpdGlvbiBhYm92ZSBhbmQgYWxzbyBpbmNsdWRlIGluCisgICAgICAgICAgIF9fa21wX2VuZF9zcGxpdF9iYXJyaWVyKCkuIFRoaXMgd2lsbCBtb3JlIGFjY3VyYXRlbHkgcmVwcmVzZW50IHRoZSBhY3R1YWwgcmVsZWFzZSB0aW1lCisgICAgICAgICAgIG9mIHRoZSB0aHJlYWRzIGZvciBzcGxpdCBiYXJyaWVycy4gICovCisgICAgICAgIGlmIChfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgfHwgS01QX0lUVF9ERUJVRykKKyAgICAgICAgICAgIF9fa21wX2l0dF9iYXJyaWVyX2ZpbmlzaGVkKGd0aWQsIGl0dF9zeW5jX29iaik7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgIH0gZWxzZSB7IC8vIFRlYW0gaXMgc2VyaWFsaXplZC4KKyAgICAgICAgc3RhdHVzID0gMDsKKyAgICAgICAgaWYgKF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjKSB7CisjaWYgT01QXzQxX0VOQUJMRUQKKyAgICAgICAgICAgIGlmICggdGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIHZvaWQgKml0dF9zeW5jX29iaiA9IE5VTEw7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgICAgICAgICBpZiAoX19pdHRfc3luY19jcmVhdGVfcHRyIHx8IEtNUF9JVFRfREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgaXR0X3N5bmNfb2JqID0gX19rbXBfaXR0X2JhcnJpZXJfb2JqZWN0KGd0aWQsIGJ0LCAxKTsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfaXR0X2JhcnJpZXJfc3RhcnRpbmcoZ3RpZCwgaXR0X3N5bmNfb2JqKTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbS0+dHQudHRfZm91bmRfcHJveHlfdGFza3MgPT0gVFJVRSk7CisgICAgICAgICAgICAgICAgX19rbXBfdGFza190ZWFtX3dhaXQodGhpc190aHIsIHRlYW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSk7CisgICAgICAgICAgICAgICAgX19rbXBfdGFza190ZWFtX3NldHVwKHRoaXNfdGhyLCB0ZWFtLCAwKTsKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgICAgICAgICBpZiAoX19pdHRfc3luY19jcmVhdGVfcHRyIHx8IEtNUF9JVFRfREVCVUcpCisgICAgICAgICAgICAgICAgICAgIF9fa21wX2l0dF9iYXJyaWVyX2ZpbmlzaGVkKGd0aWQsIGl0dF9zeW5jX29iaik7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgIC8vIFRoZSB0YXNrIHRlYW0gc2hvdWxkIGJlIE5VTEwgZm9yIHNlcmlhbGl6ZWQgY29kZSAodGFza3Mgd2lsbCBiZSBleGVjdXRlZCBpbW1lZGlhdGVseSkKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGVhbS0+dC50X3Rhc2tfdGVhbVt0aGlzX3Roci0+dGgudGhfdGFza19zdGF0ZV0gPT0gTlVMTCk7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW0gPT0gTlVMTCk7CisjZW5kaWYKKyAgICAgICAgfQorICAgIH0KKyAgICBLQV9UUkFDRSgxNSwgKCJfX2ttcF9iYXJyaWVyOiBUIyVkKCVkOiVkKSBpcyBsZWF2aW5nIHdpdGggcmV0dXJuIHZhbHVlICVkXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgX19rbXBfdGVhbV9mcm9tX2d0aWQoZ3RpZCktPnQudF9pZCwgX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKSwgc3RhdHVzKSk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisjaWYgT01QVF9CTEFNRQorICAgICAgICBpZiAob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2JhcnJpZXJfZW5kKSkgeworICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2JhcnJpZXJfZW5kKSgKKyAgICAgICAgICAgICAgICBteV9wYXJhbGxlbF9pZCwgbXlfdGFza19pZCk7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB0aGlzX3Roci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfd29ya19wYXJhbGxlbDsKKyAgICB9CisjZW5kaWYKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKwordm9pZAorX19rbXBfZW5kX3NwbGl0X2JhcnJpZXIoZW51bSBiYXJyaWVyX3R5cGUgYnQsIGludCBndGlkKQoreworICAgIEtNUF9USU1FX0RFVkVMT1BFUl9CTE9DSyhLTVBfZW5kX3NwbGl0X2JhcnJpZXIpOworICAgIGludCB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpOworICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKyAgICBrbXBfdGVhbV90ICp0ZWFtID0gdGhpc190aHItPnRoLnRoX3RlYW07CisKKyAgICBpZiAoIXRlYW0tPnQudF9zZXJpYWxpemVkKSB7CisgICAgICAgIGlmIChLTVBfTUFTVEVSX0dUSUQoZ3RpZCkpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoX19rbXBfYmFycmllcl9yZWxlYXNlX3BhdHRlcm5bYnRdKSB7CisgICAgICAgICAgICBjYXNlIGJwX2h5cGVyX2JhcjogeworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoX19rbXBfYmFycmllcl9yZWxlYXNlX2JyYW5jaF9iaXRzW2J0XSk7CisgICAgICAgICAgICAgICAgX19rbXBfaHlwZXJfYmFycmllcl9yZWxlYXNlKGJ0LCB0aGlzX3RociwgZ3RpZCwgdGlkLCBGQUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhOVUxMKSApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBicF9oaWVyYXJjaGljYWxfYmFyOiB7CisgICAgICAgICAgICAgICAgX19rbXBfaGllcmFyY2hpY2FsX2JhcnJpZXJfcmVsZWFzZShidCwgdGhpc190aHIsIGd0aWQsIHRpZCwgRkFMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKE5VTEwpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgYnBfdHJlZV9iYXI6IHsKKyAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0c1tidF0pOworICAgICAgICAgICAgICAgIF9fa21wX3RyZWVfYmFycmllcl9yZWxlYXNlKGJ0LCB0aGlzX3RociwgZ3RpZCwgdGlkLCBGQUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKE5VTEwpICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICAgICAgX19rbXBfbGluZWFyX2JhcnJpZXJfcmVsZWFzZShidCwgdGhpc190aHIsIGd0aWQsIHRpZCwgRkFMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKE5VTEwpICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF90YXNrX3RlYW1fc3luYyh0aGlzX3RociwgdGVhbSk7CisgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgIH0KKyAgICB9Cit9CisKKwordm9pZAorX19rbXBfam9pbl9iYXJyaWVyKGludCBndGlkKQoreworICAgIEtNUF9USU1FX0RFVkVMT1BFUl9CTE9DSyhLTVBfam9pbl9iYXJyaWVyKTsKKyAgICByZWdpc3RlciBrbXBfaW5mb190ICp0aGlzX3RociA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgICAgcmVnaXN0ZXIga21wX3RlYW1fdCAqdGVhbTsKKyAgICByZWdpc3RlciBrbXBfdWludCBucHJvYzsKKyAgICBrbXBfaW5mb190ICptYXN0ZXJfdGhyZWFkOworICAgIGludCB0aWQ7CisjaWZkZWYgS01QX0RFQlVHCisgICAgaW50IHRlYW1faWQ7CisjZW5kaWYgLyogS01QX0RFQlVHICovCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIHZvaWQgKml0dF9zeW5jX29iaiA9IE5VTEw7CisjIGlmIFVTRV9JVFRfTk9USUZZCisgICAgaWYgKF9faXR0X3N5bmNfY3JlYXRlX3B0ciB8fCBLTVBfSVRUX0RFQlVHKSAvLyBEb24ndCBjYWxsIHJvdXRpbmUgd2l0aG91dCBuZWVkCisgICAgICAgIC8vIEdldCBvYmplY3QgY3JlYXRlZCBhdCBmb3JrX2JhcnJpZXIKKyAgICAgICAgaXR0X3N5bmNfb2JqID0gX19rbXBfaXR0X2JhcnJpZXJfb2JqZWN0KGd0aWQsIGJzX2Zvcmtqb2luX2JhcnJpZXIpOworIyBlbmRpZgorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICBLTVBfTUIoKTsKKworICAgIC8vIEdldCBjdXJyZW50IGluZm8KKyAgICB0ZWFtID0gdGhpc190aHItPnRoLnRoX3RlYW07CisgICAgbnByb2MgPSB0aGlzX3Roci0+dGgudGhfdGVhbV9ucHJvYzsKKyAgICBLTVBfREVCVUdfQVNTRVJUKChpbnQpbnByb2MgPT0gdGVhbS0+dC50X25wcm9jKTsKKyAgICB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpOworI2lmZGVmIEtNUF9ERUJVRworICAgIHRlYW1faWQgPSB0ZWFtLT50LnRfaWQ7CisjZW5kaWYgLyogS01QX0RFQlVHICovCisgICAgbWFzdGVyX3RocmVhZCA9IHRoaXNfdGhyLT50aC50aF90ZWFtX21hc3RlcjsKKyNpZmRlZiBLTVBfREVCVUcKKyAgICBpZiAobWFzdGVyX3RocmVhZCAhPSB0ZWFtLT50LnRfdGhyZWFkc1swXSkgeworICAgICAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmUoKTsKKyAgICB9CisjZW5kaWYgLyogS01QX0RFQlVHICovCisgICAgS01QX0RFQlVHX0FTU0VSVChtYXN0ZXJfdGhyZWFkID09IHRlYW0tPnQudF90aHJlYWRzWzBdKTsKKyAgICBLTVBfTUIoKTsKKworICAgIC8vIFZlcmlmeSBzdGF0ZQorICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfdGhyZWFkcyAmJiBfX2ttcF90aHJlYWRzW2d0aWRdKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKFRDUl9QVFIodGhpc190aHItPnRoLnRoX3RlYW0pKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKFRDUl9QVFIodGhpc190aHItPnRoLnRoX3Jvb3QpKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRoaXNfdGhyID09IHRlYW0tPnQudF90aHJlYWRzW3RpZF0pOworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX2pvaW5fYmFycmllcjogVCMlZCglZDolZCkgYXJyaXZlZCBhdCBqb2luIGJhcnJpZXJcbiIsIGd0aWQsIHRlYW1faWQsIHRpZCkpOworCisjaWYgT01QVF9TVVBQT1JUIAorI2lmIE9NUFRfVFJBQ0UKKyAgICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9iYXJyaWVyX2JlZ2luKSkgeworICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbikoCisgICAgICAgICAgICB0ZWFtLT50Lm9tcHRfdGVhbV9pbmZvLnBhcmFsbGVsX2lkLAorICAgICAgICAgICAgdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS5vbXB0X3Rhc2tfaW5mby50YXNrX2lkKTsKKyAgICB9CisjZW5kaWYKKyAgICB0aGlzX3Roci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfd2FpdF9iYXJyaWVyOworI2VuZGlmCisKKyAgICBpZiAoX19rbXBfdGFza2luZ19tb2RlID09IHRza21fZXh0cmFfYmFycmllcikgeworICAgICAgICBfX2ttcF90YXNraW5nX2JhcnJpZXIodGVhbSwgdGhpc190aHIsIGd0aWQpOworICAgICAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9qb2luX2JhcnJpZXI6IFQjJWQoJWQ6JWQpIHBhc3QgdGFraW5nIGJhcnJpZXJcbiIsIGd0aWQsIHRlYW1faWQsIHRpZCkpOworICAgIH0KKyMgaWZkZWYgS01QX0RFQlVHCisgICAgaWYgKF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjKSB7CisgICAgICAgIEtBX1RSQUNFKDIwLCAoICJfX2ttcF9qb2luX2JhcnJpZXI6IFQjJWQsIG9sZCB0ZWFtID0gJWQsIG9sZCB0YXNrX3RlYW0gPSAlcCwgdGhfdGFza190ZWFtID0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQodGhpc190aHIpLCB0ZWFtX2lkLCB0ZWFtLT50LnRfdGFza190ZWFtW3RoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlXSwKKyAgICAgICAgICAgICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSkpOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW0gPT0gdGVhbS0+dC50X3Rhc2tfdGVhbVt0aGlzX3Roci0+dGgudGhfdGFza19zdGF0ZV0pOworICAgIH0KKyMgZW5kaWYgLyogS01QX0RFQlVHICovCisKKyAgICAvKiBDb3B5IHRoZSBibG9ja3RpbWUgaW5mbyB0byB0aGUgdGhyZWFkLCB3aGVyZSBfX2ttcF93YWl0X3RlbXBsYXRlKCkgY2FuIGFjY2VzcyBpdCB3aGVuIHRoZQorICAgICAgIHRlYW0gc3RydWN0IGlzIG5vdCBndWFyYW50ZWVkIHRvIGV4aXN0LiBEb2luZyB0aGVzZSBsb2FkcyBjYXVzZXMgYSBjYWNoZSBtaXNzIHNsb3dzCisgICAgICAgZG93biBFUENDIHBhcmFsbGVsIGJ5IDJ4LiBBcyBhIHdvcmthcm91bmQsIHdlIGRvIG5vdCBwZXJmb3JtIHRoZSBjb3B5IGlmIGJsb2NrdGltZT1pbmZpbml0ZSwKKyAgICAgICBzaW5jZSB0aGUgdmFsdWVzIGFyZSBub3QgdXNlZCBieSBfX2ttcF93YWl0X3RlbXBsYXRlKCkgaW4gdGhhdCBjYXNlLiAqLworICAgIGlmIChfX2ttcF9kZmx0X2Jsb2NrdGltZSAhPSBLTVBfTUFYX0JMT0NLVElNRSkgeworICAgICAgICB0aGlzX3Roci0+dGgudGhfdGVhbV9idF9pbnRlcnZhbHMgPSB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLnRkX2ljdnMuYnRfaW50ZXJ2YWxzOworICAgICAgICB0aGlzX3Roci0+dGgudGhfdGVhbV9idF9zZXQgPSB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLnRkX2ljdnMuYnRfc2V0OworICAgIH0KKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBpZiAoX19pdHRfc3luY19jcmVhdGVfcHRyIHx8IEtNUF9JVFRfREVCVUcpCisgICAgICAgIF9fa21wX2l0dF9iYXJyaWVyX3N0YXJ0aW5nKGd0aWQsIGl0dF9zeW5jX29iaik7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgc3dpdGNoIChfX2ttcF9iYXJyaWVyX2dhdGhlcl9wYXR0ZXJuW2JzX2Zvcmtqb2luX2JhcnJpZXJdKSB7CisgICAgY2FzZSBicF9oeXBlcl9iYXI6IHsKKyAgICAgICAgS01QX0FTU0VSVChfX2ttcF9iYXJyaWVyX2dhdGhlcl9icmFuY2hfYml0c1tic19mb3Jram9pbl9iYXJyaWVyXSk7CisgICAgICAgIF9fa21wX2h5cGVyX2JhcnJpZXJfZ2F0aGVyKGJzX2Zvcmtqb2luX2JhcnJpZXIsIHRoaXNfdGhyLCBndGlkLCB0aWQsIE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBicF9oaWVyYXJjaGljYWxfYmFyOiB7CisgICAgICAgIF9fa21wX2hpZXJhcmNoaWNhbF9iYXJyaWVyX2dhdGhlcihic19mb3Jram9pbl9iYXJyaWVyLCB0aGlzX3RociwgZ3RpZCwgdGlkLCBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopICk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGJwX3RyZWVfYmFyOiB7CisgICAgICAgIEtNUF9BU1NFUlQoX19rbXBfYmFycmllcl9nYXRoZXJfYnJhbmNoX2JpdHNbYnNfZm9ya2pvaW5fYmFycmllcl0pOworICAgICAgICBfX2ttcF90cmVlX2JhcnJpZXJfZ2F0aGVyKGJzX2Zvcmtqb2luX2JhcnJpZXIsIHRoaXNfdGhyLCBndGlkLCB0aWQsIE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopICk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OiB7CisgICAgICAgIF9fa21wX2xpbmVhcl9iYXJyaWVyX2dhdGhlcihic19mb3Jram9pbl9iYXJyaWVyLCB0aGlzX3RociwgZ3RpZCwgdGlkLCBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopICk7CisgICAgfQorICAgIH0KKworICAgIC8qIEZyb20gdGhpcyBwb2ludCBvbiwgdGhlIHRlYW0gZGF0YSBzdHJ1Y3R1cmUgbWF5IGJlIGRlYWxsb2NhdGVkIGF0IGFueSB0aW1lIGJ5IHRoZQorICAgICAgIG1hc3RlciB0aHJlYWQgLSBpdCBpcyB1bnNhZmUgdG8gcmVmZXJlbmNlIGl0IGluIGFueSBvZiB0aGUgd29ya2VyIHRocmVhZHMuIEFueSBwZXItdGVhbQorICAgICAgIGRhdGEgaXRlbXMgdGhhdCBuZWVkIHRvIGJlIHJlZmVyZW5jZWQgYmVmb3JlIHRoZSBlbmQgb2YgdGhlIGJhcnJpZXIgc2hvdWxkIGJlIG1vdmVkIHRvCisgICAgICAgdGhlIGttcF90YXNrX3RlYW1fdCBzdHJ1Y3RzLiAgKi8KKyAgICBpZiAoS01QX01BU1RFUl9USUQodGlkKSkgeworICAgICAgICBpZiAoX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMpIHsKKyAgICAgICAgICAgIC8vIE1hc3RlciBzaG91bGRuJ3QgY2FsbCBkZWNyZWFzZV9sb2FkKCkuICAgICAgICAgLy8gVE9ETzogZW5hYmxlIG1hc3RlciB0aHJlYWRzLgorICAgICAgICAgICAgLy8gTWFzdGVyIHNob3VsZCBoYXZlIHRoX21heV9kZWNyZWFzZV9sb2FkID09IDAuICAvLyBUT0RPOiBlbmFibGUgbWFzdGVyIHRocmVhZHMuCisgICAgICAgICAgICBfX2ttcF90YXNrX3RlYW1fd2FpdCh0aGlzX3RociwgdGVhbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworICAgICAgICB9CisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICBpZiAoX19pdHRfc3luY19jcmVhdGVfcHRyIHx8IEtNUF9JVFRfREVCVUcpCisgICAgICAgICAgICBfX2ttcF9pdHRfYmFycmllcl9taWRkbGUoZ3RpZCwgaXR0X3N5bmNfb2JqKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyMgaWYgVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWQorICAgICAgICAvLyBKb2luIGJhcnJpZXIgLSByZXBvcnQgZnJhbWUgZW5kCisgICAgICAgIGlmICgoX19pdHRfZnJhbWVfc3VibWl0X3YzX3B0ciB8fCBLTVBfSVRUX0RFQlVHKSAmJiBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSAmJgorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfdGVhbXNfbWljcm90YXNrID09IE5VTEwgJiYKKyNlbmRpZgorICAgICAgICAgICAgdGVhbS0+dC50X2FjdGl2ZV9sZXZlbCA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICBrbXBfdWludDY0IGN1cl90aW1lID0gX19pdHRfZ2V0X3RpbWVzdGFtcCgpOworICAgICAgICAgICAgaWRlbnRfdCAqIGxvYyA9IHRlYW0tPnQudF9pZGVudDsKKyAgICAgICAgICAgIGttcF9pbmZvX3QgKipvdGhlcl90aHJlYWRzID0gdGVhbS0+dC50X3RocmVhZHM7CisgICAgICAgICAgICBpbnQgbnByb2MgPSB0aGlzX3Roci0+dGgudGhfdGVhbV9ucHJvYzsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgc3dpdGNoKF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlKSB7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgX19rbXBfaXR0X2ZyYW1lX3N1Ym1pdChndGlkLCB0aGlzX3Roci0+dGgudGhfZnJhbWVfdGltZSwgY3VyX3RpbWUsIDAsIGxvYywgbnByb2MpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIF9fa21wX2l0dF9mcmFtZV9zdWJtaXQoZ3RpZCwgdGhpc190aHItPnRoLnRoX2Jhcl9taW5fdGltZSwgY3VyX3RpbWUsIDEsIGxvYywgbnByb2MpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIGlmKCBfX2l0dF9tZXRhZGF0YV9hZGRfcHRyICkgeworICAgICAgICAgICAgICAgICAgICAvLyBJbml0aWFsaXplIHdpdGggbWFzdGVyJ3Mgd2FpdCB0aW1lCisgICAgICAgICAgICAgICAgICAgIGttcF91aW50NjQgZGVsdGEgPSBjdXJfdGltZSAtIHRoaXNfdGhyLT50aC50aF9iYXJfYXJyaXZlX3RpbWU7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaT0xOyBpPG5wcm9jOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhICs9ICggY3VyX3RpbWUgLSBvdGhlcl90aHJlYWRzW2ldLT50aC50aF9iYXJfYXJyaXZlX3RpbWUgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBfX2ttcF9pdHRfbWV0YWRhdGFfaW1iYWxhbmNlKGd0aWQsIHRoaXNfdGhyLT50aC50aF9mcmFtZV90aW1lLCBjdXJfdGltZSwgZGVsdGEsIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfX2ttcF9pdHRfZnJhbWVfc3VibWl0KGd0aWQsIHRoaXNfdGhyLT50aC50aF9mcmFtZV90aW1lLCBjdXJfdGltZSwgMCwgbG9jLCBucHJvYyk7CisgICAgICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX2ZyYW1lX3RpbWUgPSBjdXJfdGltZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorIyBlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgfQorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKF9faXR0X3N5bmNfY3JlYXRlX3B0ciB8fCBLTVBfSVRUX0RFQlVHKQorICAgICAgICAgICAgX19rbXBfaXR0X2JhcnJpZXJfbWlkZGxlKGd0aWQsIGl0dF9zeW5jX29iaik7CisgICAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworI2lmIEtNUF9ERUJVRworICAgIGlmIChLTVBfTUFTVEVSX1RJRCh0aWQpKSB7CisgICAgICAgIEtBX1RSQUNFKDE1LCAoIl9fa21wX2pvaW5fYmFycmllcjogVCMlZCglZDolZCkgc2F5cyBhbGwgJWQgdGVhbSB0aHJlYWRzIGFycml2ZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbV9pZCwgdGlkLCBucHJvYykpOworICAgIH0KKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKworICAgIC8vIFRPRE8gbm93LCBtYXJrIHdvcmtlciB0aHJlYWRzIGFzIGRvbmUgc28gdGhleSBtYXkgYmUgZGlzYmFuZGVkCisgICAgS01QX01CKCk7IC8vIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4KKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9qb2luX2JhcnJpZXI6IFQjJWQoJWQ6JWQpIGxlYXZpbmdcbiIsIGd0aWQsIHRlYW1faWQsIHRpZCkpOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworI2lmIE9NUFRfQkxBTUUKKyAgICAgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9iYXJyaWVyX2VuZCkpIHsKKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9iYXJyaWVyX2VuZCkoCisgICAgICAgICAgICAgICAgdGVhbS0+dC5vbXB0X3RlYW1faW5mby5wYXJhbGxlbF9pZCwKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLm9tcHRfdGFza19pbmZvLnRhc2tfaWQpOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAvLyByZXR1cm4gdG8gZGVmYXVsdCBzdGF0ZQorICAgICAgICB0aGlzX3Roci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfb3ZlcmhlYWQ7CisgICAgfQorI2VuZGlmCit9CisKKworLy8gVE9ETyByZWxlYXNlIHdvcmtlciB0aHJlYWRzJyBmb3JrIGJhcnJpZXJzIGFzIHdlIGFyZSByZWFkeSBpbnN0ZWFkIG9mIGFsbCBhdCBvbmNlCit2b2lkCitfX2ttcF9mb3JrX2JhcnJpZXIoaW50IGd0aWQsIGludCB0aWQpCit7CisgICAgS01QX1RJTUVfREVWRUxPUEVSX0JMT0NLKEtNUF9mb3JrX2JhcnJpZXIpOworICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKyAgICBrbXBfdGVhbV90ICp0ZWFtID0gKHRpZCA9PSAwKSA/IHRoaXNfdGhyLT50aC50aF90ZWFtIDogTlVMTDsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgdm9pZCAqIGl0dF9zeW5jX29iaiA9IE5VTEw7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfZm9ya19iYXJyaWVyOiBUIyVkKCVkOiVkKSBoYXMgYXJyaXZlZFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsICh0ZWFtICE9IE5VTEwpID8gdGVhbS0+dC50X2lkIDogLTEsIHRpZCkpOworCisgICAgLy8gdGhfdGVhbSBwb2ludGVyIG9ubHkgdmFsaWQgZm9yIG1hc3RlciB0aHJlYWQgaGVyZQorICAgIGlmIChLTVBfTUFTVEVSX1RJRCh0aWQpKSB7CisjaWYgVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWQorICAgICAgICBpZiAoX19pdHRfc3luY19jcmVhdGVfcHRyIHx8IEtNUF9JVFRfREVCVUcpIHsKKyAgICAgICAgICAgIC8vIENyZWF0ZSBpdHQgYmFycmllciBvYmplY3QKKyAgICAgICAgICAgIGl0dF9zeW5jX29iaiAgPSBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoZ3RpZCwgYnNfZm9ya2pvaW5fYmFycmllciwgMSk7CisgICAgICAgICAgICBfX2ttcF9pdHRfYmFycmllcl9taWRkbGUoZ3RpZCwgaXR0X3N5bmNfb2JqKTsgIC8vIENhbGwgYWNxdWlyZWQvcmVsZWFzaW5nCisgICAgICAgIH0KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZICovCisKKyNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgcmVnaXN0ZXIga21wX2luZm9fdCAqKm90aGVyX3RocmVhZHMgPSB0ZWFtLT50LnRfdGhyZWFkczsKKyAgICAgICAgcmVnaXN0ZXIgaW50IGk7CisKKyAgICAgICAgLy8gVmVyaWZ5IHN0YXRlCisgICAgICAgIEtNUF9NQigpOworCisgICAgICAgIGZvcihpPTE7IGk8dGVhbS0+dC50X25wcm9jOyArK2kpIHsKKyAgICAgICAgICAgIEtBX1RSQUNFKDUwMCwgKCJfX2ttcF9mb3JrX2JhcnJpZXI6IFQjJWQoJWQ6MCkgY2hlY2tpbmcgVCMlZCglZDolZCkgZm9yayBnbyA9PSAldS5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfaW5mby5kcy5kc190aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcl90aHJlYWRzW2ldLT50aC50aF9iYXJbYnNfZm9ya2pvaW5fYmFycmllcl0uYmIuYl9nbykpOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCgoVENSXzQob3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfYmFyW2JzX2Zvcmtqb2luX2JhcnJpZXJdLmJiLmJfZ28pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIH4oS01QX0JBUlJJRVJfU0xFRVBfU1RBVEUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFKTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQob3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfdGVhbSA9PSB0ZWFtKTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgaWYgKF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjKSB7CisgICAgICAgICAgICBfX2ttcF90YXNrX3RlYW1fc2V0dXAodGhpc190aHIsIHRlYW0sIDApOyAgLy8gMCBpbmRpY2F0ZXMgc2V0dXAgY3VycmVudCB0YXNrIHRlYW0gaWYgbnRocmVhZHMgPiAxCisgICAgICAgIH0KKworICAgICAgICAvKiBUaGUgbWFzdGVyIHRocmVhZCBtYXkgaGF2ZSBjaGFuZ2VkIGl0cyBibG9ja3RpbWUgYmV0d2VlbiB0aGUgam9pbiBiYXJyaWVyIGFuZCB0aGUKKyAgICAgICAgICAgZm9yayBiYXJyaWVyLiBDb3B5IHRoZSBibG9ja3RpbWUgaW5mbyB0byB0aGUgdGhyZWFkLCB3aGVyZSBfX2ttcF93YWl0X3RlbXBsYXRlKCkgY2FuCisgICAgICAgICAgIGFjY2VzcyBpdCB3aGVuIHRoZSB0ZWFtIHN0cnVjdCBpcyBub3QgZ3VhcmFudGVlZCB0byBleGlzdC4gKi8KKyAgICAgICAgLy8gU2VlIG5vdGUgYWJvdXQgdGhlIGNvcnJlc3BvbmRpbmcgY29kZSBpbiBfX2ttcF9qb2luX2JhcnJpZXIoKSBiZWluZyBwZXJmb3JtYW5jZS1jcml0aWNhbAorICAgICAgICBpZiAoX19rbXBfZGZsdF9ibG9ja3RpbWUgIT0gS01QX01BWF9CTE9DS1RJTUUpIHsKKyAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF90ZWFtX2J0X2ludGVydmFscyA9IHRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0udGRfaWN2cy5idF9pbnRlcnZhbHM7CisgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfdGVhbV9idF9zZXQgPSB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLnRkX2ljdnMuYnRfc2V0OworICAgICAgICB9CisgICAgfSAvLyBtYXN0ZXIKKworICAgIHN3aXRjaCAoX19rbXBfYmFycmllcl9yZWxlYXNlX3BhdHRlcm5bYnNfZm9ya2pvaW5fYmFycmllcl0pIHsKKyAgICBjYXNlIGJwX2h5cGVyX2JhcjogeworICAgICAgICBLTVBfQVNTRVJUKF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0c1tic19mb3Jram9pbl9iYXJyaWVyXSk7CisgICAgICAgIF9fa21wX2h5cGVyX2JhcnJpZXJfcmVsZWFzZShic19mb3Jram9pbl9iYXJyaWVyLCB0aGlzX3RociwgZ3RpZCwgdGlkLCBUUlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopICk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGJwX2hpZXJhcmNoaWNhbF9iYXI6IHsKKyAgICAgICAgX19rbXBfaGllcmFyY2hpY2FsX2JhcnJpZXJfcmVsZWFzZShic19mb3Jram9pbl9iYXJyaWVyLCB0aGlzX3RociwgZ3RpZCwgdGlkLCBUUlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBicF90cmVlX2JhcjogeworICAgICAgICBLTVBfQVNTRVJUKF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0c1tic19mb3Jram9pbl9iYXJyaWVyXSk7CisgICAgICAgIF9fa21wX3RyZWVfYmFycmllcl9yZWxlYXNlKGJzX2Zvcmtqb2luX2JhcnJpZXIsIHRoaXNfdGhyLCBndGlkLCB0aWQsIFRSVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDogeworICAgICAgICBfX2ttcF9saW5lYXJfYmFycmllcl9yZWxlYXNlKGJzX2Zvcmtqb2luX2JhcnJpZXIsIHRoaXNfdGhyLCBndGlkLCB0aWQsIFRSVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopICk7CisgICAgfQorICAgIH0KKworICAgIC8vIEVhcmx5IGV4aXQgZm9yIHJlYXBpbmcgdGhyZWFkcyByZWxlYXNpbmcgZm9ya2pvaW4gYmFycmllcgorICAgIGlmIChUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpKSB7CisgICAgICAgIHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW0gPSBOVUxMOworCisjaWYgVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWQorICAgICAgICBpZiAoX19pdHRfc3luY19jcmVhdGVfcHRyIHx8IEtNUF9JVFRfREVCVUcpIHsKKyAgICAgICAgICAgIGlmICghS01QX01BU1RFUl9USUQodGlkKSkgeworICAgICAgICAgICAgICAgIGl0dF9zeW5jX29iaiA9IF9fa21wX2l0dF9iYXJyaWVyX29iamVjdChndGlkLCBic19mb3Jram9pbl9iYXJyaWVyKTsKKyAgICAgICAgICAgICAgICBpZiAoaXR0X3N5bmNfb2JqKQorICAgICAgICAgICAgICAgICAgICBfX2ttcF9pdHRfYmFycmllcl9maW5pc2hlZChndGlkLCBpdHRfc3luY19vYmopOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWSAqLworICAgICAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9mb3JrX2JhcnJpZXI6IFQjJWQgaXMgbGVhdmluZyBlYXJseVxuIiwgZ3RpZCkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogV2UgY2FuIG5vdyBhc3N1bWUgdGhhdCBhIHZhbGlkIHRlYW0gc3RydWN0dXJlIGhhcyBiZWVuIGFsbG9jYXRlZCBieSB0aGUgbWFzdGVyIGFuZAorICAgICAgIHByb3BhZ2F0ZWQgdG8gYWxsIHdvcmtlciB0aHJlYWRzLiBUaGUgY3VycmVudCB0aHJlYWQsIGhvd2V2ZXIsIG1heSBub3QgYmUgcGFydCBvZiB0aGUKKyAgICAgICB0ZWFtLCBzbyB3ZSBjYW4ndCBibGluZGx5IGFzc3VtZSB0aGF0IHRoZSB0ZWFtIHBvaW50ZXIgaXMgbm9uLW51bGwuICAqLworICAgIHRlYW0gPSAoa21wX3RlYW1fdCAqKVRDUl9QVFIodGhpc190aHItPnRoLnRoX3RlYW0pOworICAgIEtNUF9ERUJVR19BU1NFUlQodGVhbSAhPSBOVUxMKTsKKyAgICB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpOworCisKKyNpZiBLTVBfQkFSUklFUl9JQ1ZfUFVMTAorICAgIC8qIE1hc3RlciB0aHJlYWQncyBjb3B5IG9mIHRoZSBJQ1ZzIHdhcyBzZXQgdXAgb24gdGhlIGltcGxpY2l0IHRhc2tkYXRhIGluCisgICAgICAgX19rbXBfcmVpbml0aWFsaXplX3RlYW0uIF9fa21wX2ZvcmtfY2FsbCgpIGFzc3VtZXMgdGhlIG1hc3RlciB0aHJlYWQncyBpbXBsaWNpdCB0YXNrIGhhcworICAgICAgIHRoaXMgZGF0YSBiZWZvcmUgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuIFdlIGNhbm5vdCBtb2RpZnkgX19rbXBfZm9ya19jYWxsKCkgdG8gbG9vayBhdAorICAgICAgIHRoZSBmaXhlZCBJQ1ZzIGluIHRoZSBtYXN0ZXIncyB0aHJlYWQgc3RydWN0LCBiZWNhdXNlIGl0IGlzIG5vdCBhbHdheXMgdGhlIGNhc2UgdGhhdCB0aGUKKyAgICAgICB0aHJlYWRzIGFycmF5cyBoYXZlIGJlZW4gYWxsb2NhdGVkIHdoZW4gX19rbXBfZm9ya19jYWxsKCkgaXMgZXhlY3V0ZWQuICovCisgICAgeworICAgICAgICBLTVBfVElNRV9ERVZFTE9QRVJfQkxPQ0soVVNFUl9pY3ZfY29weSk7CisgICAgICAgIGlmICghS01QX01BU1RFUl9USUQodGlkKSkgeyAgLy8gbWFzdGVyIHRocmVhZCBhbHJlYWR5IGhhcyBJQ1ZzCisgICAgICAgICAgICAvLyBDb3B5IHRoZSBpbml0aWFsIElDVnMgZnJvbSB0aGUgbWFzdGVyJ3MgdGhyZWFkIHN0cnVjdCB0byB0aGUgaW1wbGljaXQgdGFzayBmb3IgdGhpcyB0aWQuCisgICAgICAgICAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9mb3JrX2JhcnJpZXI6IFQjJWQoJWQpIGlzIFBVTExpbmcgSUNWc1xuIiwgZ3RpZCwgdGlkKSk7CisgICAgICAgICAgICBfX2ttcF9pbml0X2ltcGxpY2l0X3Rhc2sodGVhbS0+dC50X2lkZW50LCB0ZWFtLT50LnRfdGhyZWFkc1t0aWRdLCB0ZWFtLCB0aWQsIEZBTFNFKTsKKyAgICAgICAgICAgIGNvcHlfaWN2cygmdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS50ZF9pY3ZzLAorICAgICAgICAgICAgICAgICAgICAgICZ0ZWFtLT50LnRfdGhyZWFkc1swXS0+dGgudGhfYmFyW2JzX2Zvcmtqb2luX2JhcnJpZXJdLmJiLnRoX2ZpeGVkX2ljdnMpOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8vIEtNUF9CQVJSSUVSX0lDVl9QVUxMCisKKyAgICBpZiAoX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMpIHsKKyAgICAgICAgX19rbXBfdGFza190ZWFtX3N5bmModGhpc190aHIsIHRlYW0pOworICAgIH0KKworI2lmIE9NUF80MF9FTkFCTEVEICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICBrbXBfcHJvY19iaW5kX3QgcHJvY19iaW5kID0gdGVhbS0+dC50X3Byb2NfYmluZDsKKyAgICBpZiAocHJvY19iaW5kID09IHByb2NfYmluZF9pbnRlbCkgeworI2VuZGlmCisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICAvLyBDYWxsIGR5bmFtaWMgYWZmaW5pdHkgc2V0dGluZ3MKKyAgICAgICAgaWYoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9iYWxhbmNlZCAmJiB0ZWFtLT50LnRfc2l6ZV9jaGFuZ2VkKSB7CisgICAgICAgICAgICBfX2ttcF9iYWxhbmNlZF9hZmZpbml0eSh0aWQsIHRlYW0tPnQudF9ucHJvYyk7CisgICAgICAgIH0KKyNlbmRpZiAvLyBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisjaWYgT01QXzQwX0VOQUJMRUQgJiYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIH0KKyAgICBlbHNlIGlmIChwcm9jX2JpbmQgIT0gcHJvY19iaW5kX2ZhbHNlKSB7CisgICAgICAgIGlmICh0aGlzX3Roci0+dGgudGhfbmV3X3BsYWNlID09IHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3BsYWNlKSB7CisgICAgICAgICAgICBLQV9UUkFDRSgxMDAsICgiX19rbXBfZm9ya19iYXJyaWVyOiBUIyVkIGFscmVhZHkgaW4gY29ycmVjdCBwbGFjZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQodGhpc190aHIpLCB0aGlzX3Roci0+dGgudGhfY3VycmVudF9wbGFjZSkpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfc2V0X3BsYWNlKGd0aWQpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyNpZiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZCisgICAgaWYgKF9faXR0X3N5bmNfY3JlYXRlX3B0ciB8fCBLTVBfSVRUX0RFQlVHKSB7CisgICAgICAgIGlmICghS01QX01BU1RFUl9USUQodGlkKSkgeworICAgICAgICAgICAgLy8gR2V0IGNvcnJlY3QgYmFycmllciBvYmplY3QKKyAgICAgICAgICAgIGl0dF9zeW5jX29iaiA9IF9fa21wX2l0dF9iYXJyaWVyX29iamVjdChndGlkLCBic19mb3Jram9pbl9iYXJyaWVyKTsKKyAgICAgICAgICAgIF9fa21wX2l0dF9iYXJyaWVyX2ZpbmlzaGVkKGd0aWQsIGl0dF9zeW5jX29iaik7ICAvLyBXb3JrZXJzIGNhbGwgYWNxdWlyZWQKKyAgICAgICAgfSAvLyAocHJlcGFyZSBjYWxsZWQgaW5zaWRlIGJhcnJpZXJfcmVsZWFzZSkKKyAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWSAqLworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX2ZvcmtfYmFycmllcjogVCMlZCglZDolZCkgaXMgbGVhdmluZ1xuIiwgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQpKTsKK30KKworCit2b2lkCitfX2ttcF9zZXR1cF9pY3ZfY29weShrbXBfdGVhbV90ICp0ZWFtLCBpbnQgbmV3X25wcm9jLCBrbXBfaW50ZXJuYWxfY29udHJvbF90ICpuZXdfaWN2cywgaWRlbnRfdCAqbG9jICkKK3sKKyAgICBLTVBfVElNRV9ERVZFTE9QRVJfQkxPQ0soS01QX3NldHVwX2ljdl9jb3B5KTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQodGVhbSAmJiBuZXdfbnByb2MgJiYgbmV3X2ljdnMpOworICAgIEtNUF9ERUJVR19BU1NFUlQoKCFUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSkgfHwgbmV3X2ljdnMtPm5wcm9jKTsKKworICAgIC8qIE1hc3RlciB0aHJlYWQncyBjb3B5IG9mIHRoZSBJQ1ZzIHdhcyBzZXQgdXAgb24gdGhlIGltcGxpY2l0IHRhc2tkYXRhIGluCisgICAgICAgX19rbXBfcmVpbml0aWFsaXplX3RlYW0uIF9fa21wX2ZvcmtfY2FsbCgpIGFzc3VtZXMgdGhlIG1hc3RlciB0aHJlYWQncyBpbXBsaWNpdCB0YXNrIGhhcworICAgICAgIHRoaXMgZGF0YSBiZWZvcmUgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuICovCisjaWYgS01QX0JBUlJJRVJfSUNWX1BVTEwKKyAgICAvKiBDb3B5IElDVnMgdG8gbWFzdGVyJ3MgdGhyZWFkIHN0cnVjdHVyZSBpbnRvIHRoX2ZpeGVkX2ljdnMgKHdoaWNoIHJlbWFpbnMgdW50b3VjaGVkKSwgd2hlcmUKKyAgICAgICBhbGwgb2YgdGhlIHdvcmtlciB0aHJlYWRzIGNhbiBhY2Nlc3MgdGhlbSBhbmQgbWFrZSB0aGVpciBvd24gY29waWVzIGFmdGVyIHRoZSBiYXJyaWVyLiAqLworICAgIEtNUF9ERUJVR19BU1NFUlQodGVhbS0+dC50X3RocmVhZHNbMF0pOyAgLy8gVGhlIHRocmVhZHMgYXJyYXlzIHNob3VsZCBiZSBhbGxvY2F0ZWQgYXQgdGhpcyBwb2ludAorICAgIGNvcHlfaWN2cygmdGVhbS0+dC50X3RocmVhZHNbMF0tPnRoLnRoX2Jhcltic19mb3Jram9pbl9iYXJyaWVyXS5iYi50aF9maXhlZF9pY3ZzLCBuZXdfaWN2cyk7CisgICAgS0ZfVFJBQ0UoMTAsICgiX19rbXBfc2V0dXBfaWN2X2NvcHk6IFBVTEw6IFQjJWQgdGhpc190aHJlYWQ9JXAgdGVhbT0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIDAsIHRlYW0tPnQudF90aHJlYWRzWzBdLCB0ZWFtKSk7CisjZWxpZiBLTVBfQkFSUklFUl9JQ1ZfUFVTSAorICAgIC8vIFRoZSBJQ1ZzIHdpbGwgYmUgcHJvcGFnYXRlZCBpbiB0aGUgZm9yayBiYXJyaWVyLCBzbyBub3RoaW5nIG5lZWRzIHRvIGJlIGRvbmUgaGVyZS4KKyAgICBLRl9UUkFDRSgxMCwgKCJfX2ttcF9zZXR1cF9pY3ZfY29weTogUFVTSDogVCMlZCB0aGlzX3RocmVhZD0lcCB0ZWFtPSVwXG4iLAorICAgICAgICAgICAgICAgICAgMCwgdGVhbS0+dC50X3RocmVhZHNbMF0sIHRlYW0pKTsKKyNlbHNlCisgICAgLy8gQ29weSB0aGUgSUNWcyB0byBlYWNoIG9mIHRoZSBub24tbWFzdGVyIHRocmVhZHMuICBUaGlzIHRha2VzIE8obnRocmVhZHMpIHRpbWUuCisgICAgbmdvX2xvYWQobmV3X2ljdnMpOworICAgIEtNUF9ERUJVR19BU1NFUlQodGVhbS0+dC50X3RocmVhZHNbMF0pOyAgLy8gVGhlIHRocmVhZHMgYXJyYXlzIHNob3VsZCBiZSBhbGxvY2F0ZWQgYXQgdGhpcyBwb2ludAorICAgIGZvciAoaW50IGY9MTsgZjxuZXdfbnByb2M7ICsrZikgeyAvLyBTa2lwIHRoZSBtYXN0ZXIgdGhyZWFkCisgICAgICAgIC8vIFRPRE86IEdFSCAtIHBhc3MgaW4gYmV0dGVyIHNvdXJjZSBsb2NhdGlvbiBpbmZvIHNpbmNlIHVzdWFsbHkgTlVMTCBoZXJlCisgICAgICAgIEtGX1RSQUNFKDEwLCAoIl9fa21wX3NldHVwX2ljdl9jb3B5OiBMSU5FQVI6IFQjJWQgdGhpc190aHJlYWQ9JXAgdGVhbT0lcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBmLCB0ZWFtLT50LnRfdGhyZWFkc1tmXSwgdGVhbSkpOworICAgICAgICBfX2ttcF9pbml0X2ltcGxpY2l0X3Rhc2sobG9jLCB0ZWFtLT50LnRfdGhyZWFkc1tmXSwgdGVhbSwgZiwgRkFMU0UpOworICAgICAgICBuZ29fc3RvcmVfaWN2cygmdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbZl0udGRfaWN2cywgbmV3X2ljdnMpOworICAgICAgICBLRl9UUkFDRSgxMCwgKCJfX2ttcF9zZXR1cF9pY3ZfY29weTogTElORUFSOiBUIyVkIHRoaXNfdGhyZWFkPSVwIHRlYW09JXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZiwgdGVhbS0+dC50X3RocmVhZHNbZl0sIHRlYW0pKTsKKyAgICB9CisgICAgbmdvX3N5bmMoKTsKKyNlbmRpZiAvLyBLTVBfQkFSUklFUl9JQ1ZfUFVMTAorfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2NhbmNlbC5jcHAgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfY2FuY2VsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWViMDBjCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2NhbmNlbC5jcHAKQEAgLTAsMCArMSwyODIgQEAKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKyNpbmNsdWRlICJrbXBfaW8uaCIKKyNpbmNsdWRlICJrbXBfc3RyLmgiCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorCisvKiEKK0Bpbmdyb3VwIENBTkNFTExBVElPTgorQHBhcmFtIGxvY19yZWYgbG9jYXRpb24gb2YgdGhlIG9yaWdpbmFsIHRhc2sgZGlyZWN0aXZlCitAcGFyYW0gZ3RpZCBHbG9iYWwgdGhyZWFkIElEIG9mIGVuY291bnRlcmluZyB0aHJlYWQKK0BwYXJhbSBjbmNsX2tpbmQgQ2FuY2VsbGF0aW9uIGtpbmQgKHBhcmFsbGVsLCBmb3IsIHNlY3Rpb25zLCB0YXNrZ3JvdXApCisKK0ByZXR1cm4gcmV0dXJucyB0cnVlIGlmIHRoZSBjYW5jZWxsYXRpb24gcmVxdWVzdCBoYXMgYmVlbiBhY3RpdmF0ZWQgYW5kIHRoZSBleGVjdXRpb24gdGhyZWFkCituZWVkcyB0byBwcm9jZWVkIHRvIHRoZSBlbmQgb2YgdGhlIGNhbmNlbGVkIHJlZ2lvbi4KKworUmVxdWVzdCBjYW5jZWxsYXRpb24gb2YgdGhlIGJpbmRpbmcgT3Blbk1QIHJlZ2lvbi4KKyovCitrbXBfaW50MzIgX19rbXBjX2NhbmNlbChpZGVudF90KiBsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyIGNuY2xfa2luZCkgeworICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyID0gX19rbXBfdGhyZWFkcyBbIGd0aWQgXTsKKyAgICAKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX2NhbmNlbDogVCMlZCByZXF1ZXN0ICVkIE9NUF9DQU5DRUxMQVRJT049JWRcbiIsIGd0aWQsIGNuY2xfa2luZCwgX19rbXBfb21wX2NhbmNlbGxhdGlvbikgKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoY25jbF9raW5kICE9IGNhbmNlbF9ub3JlcSk7CisgICAgS01QX0RFQlVHX0FTU0VSVChjbmNsX2tpbmQgPT0gY2FuY2VsX3BhcmFsbGVsIHx8IGNuY2xfa2luZCA9PSBjYW5jZWxfbG9vcCB8fCAKKyAgICAgICAgICAgICAgICAgICAgIGNuY2xfa2luZCA9PSBjYW5jZWxfc2VjdGlvbnMgfHwgY25jbF9raW5kID09IGNhbmNlbF90YXNrZ3JvdXApOyAKKyAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2dldF9ndGlkKCkgPT0gZ3RpZCk7CisKKyAgICBpZiAoX19rbXBfb21wX2NhbmNlbGxhdGlvbikgeworICAgICAgICBzd2l0Y2ggKGNuY2xfa2luZCkgeworICAgICAgICBjYXNlIGNhbmNlbF9wYXJhbGxlbDoKKyAgICAgICAgY2FzZSBjYW5jZWxfbG9vcDoKKyAgICAgICAgY2FzZSBjYW5jZWxfc2VjdGlvbnM6CisgICAgICAgICAgICAvLyBjYW5jZWxsYXRpb24gcmVxdWVzdHMgZm9yIHBhcmFsbGVsIGFuZCB3b3Jrc2hhcmluZyBjb25zdHJ1Y3RzCisgICAgICAgICAgICAvLyBhcmUgaGFuZGxlZCB0aHJvdWdoIHRoZSB0ZWFtIHN0cnVjdHVyZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGttcF90ZWFtX3QgKnRoaXNfdGVhbSA9IHRoaXNfdGhyLT50aC50aF90ZWFtOworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGhpc190ZWFtKTsKKyAgICAgICAgICAgICAgICBrbXBfaW50MzIgb2xkID0gS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFVDMyKCYodGhpc190ZWFtLT50LnRfY2FuY2VsX3JlcXVlc3QpLCBjYW5jZWxfbm9yZXEsIGNuY2xfa2luZCk7CisgICAgICAgICAgICAgICAgaWYgKG9sZCA9PSBjYW5jZWxfbm9yZXEgfHwgb2xkID09IGNuY2xfa2luZCkgeworICAgICAgICAgICAgICAgICAgICAvL3ByaW50ZigiX19rbXBjX2NhbmNlbDogdGhpc190ZWFtLT50LnRfY2FuY2VsX3JlcXVlc3Q9JWQgQCAlcFxuIiwgCisgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIHRoaXNfdGVhbS0+dC50X2NhbmNlbF9yZXF1ZXN0LCAmKHRoaXNfdGVhbS0+dC50X2NhbmNlbF9yZXF1ZXN0KSk7CisgICAgICAgICAgICAgICAgICAgIC8vIHdlIGRvIG5vdCBoYXZlIGEgY2FuY2VsbGF0aW9uIHJlcXVlc3QgaW4gdGhpcyB0ZWFtIG9yIHdlIGRvIGhhdmUgb25lCisgICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgbWF0Y2hlcyB0aGUgY3VycmVudCByZXF1ZXN0IC0+IGNhbmNlbAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiB0cnVlICovOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSBjYW5jZWxfdGFza2dyb3VwOgorICAgICAgICAgICAgLy8gY2FuY2VsbGF0aW9uIHJlcXVlc3RzIGZvciBhIHRhc2sgZ3JvdXAKKyAgICAgICAgICAgIC8vIGFyZSBoYW5kbGVkIHRocm91Z2ggdGhlIHRhc2tncm91cCBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBrbXBfdGFza2RhdGFfdCogIHRhc2s7IAorICAgICAgICAgICAgICAgIGttcF90YXNrZ3JvdXBfdCogdGFza2dyb3VwOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHRhc2sgPSB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrOworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2sgKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB0YXNrZ3JvdXAgPSB0YXNrLT50ZF90YXNrZ3JvdXA7CisgICAgICAgICAgICAgICAgaWYgKHRhc2tncm91cCkgeworICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgb2xkID0gS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFVDMyKCYodGFza2dyb3VwLT5jYW5jZWxfcmVxdWVzdCksIGNhbmNlbF9ub3JlcSwgY25jbF9raW5kKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9sZCA9PSBjYW5jZWxfbm9yZXEgfHwgb2xkID09IGNuY2xfa2luZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgZG8gbm90IGhhdmUgYSBjYW5jZWxsYXRpb24gcmVxdWVzdCBpbiB0aGlzIHRhc2tncm91cCBvciB3ZSBkbyBoYXZlIG9uZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBtYXRjaGVzIHRoZSBjdXJyZW50IHJlcXVlc3QgLT4gY2FuY2VsCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiB0cnVlICovOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiB3aGF0IG5lZWRzIHRvIGhhcHBlbiBoZXJlPworICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc3BlY2lmaWNhdGlvbiBkaXNhbGxvd3MgY2FuY2VsbGF0aW9uIHcvbyB0YXNrZ3JvdXBzCisgICAgICAgICAgICAgICAgICAgIC8vIHNvIHdlIG1pZ2h0IGRvIGFueXRoaW5nIGhlcmUsIGxldCdzIGFib3J0IGZvciBub3cKKyAgICAgICAgICAgICAgICAgICAgS01QX0FTU0VSVCggMCAvKiBmYWxzZSAqLyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBLTVBfQVNTRVJUICgwIC8qIGZhbHNlICovKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIElDViBPTVBfQ0FOQ0VMTEFUSU9OPWZhbHNlLCBzbyB3ZSBpZ25vcmVkIHRoaXMgY2FuY2VsIHJlcXVlc3QKKyAgICBLTVBfREVCVUdfQVNTRVJUKCFfX2ttcF9vbXBfY2FuY2VsbGF0aW9uKTsKKyAgICByZXR1cm4gMCAvKiBmYWxzZSAqLzsKK30KKworLyohCitAaW5ncm91cCBDQU5DRUxMQVRJT04KK0BwYXJhbSBsb2NfcmVmIGxvY2F0aW9uIG9mIHRoZSBvcmlnaW5hbCB0YXNrIGRpcmVjdGl2ZQorQHBhcmFtIGd0aWQgR2xvYmFsIHRocmVhZCBJRCBvZiBlbmNvdW50ZXJpbmcgdGhyZWFkCitAcGFyYW0gY25jbF9raW5kIENhbmNlbGxhdGlvbiBraW5kIChwYXJhbGxlbCwgZm9yLCBzZWN0aW9ucywgdGFza2dyb3VwKQorCitAcmV0dXJuIHJldHVybnMgdHJ1ZSBpZiBhIG1hdGNoaW5nIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGhhcyBiZWVuIGZsYWdnZWQgaW4gdGhlIFJUTCBhbmQgdGhlIAorZW5jb3VudGVyaW5nIHRocmVhZCBoYXMgdG8gY2FuY2VsLi4KKworQ2FuY2VsbGF0aW9uIHBvaW50IGZvciB0aGUgZW5jb3VudGVyaW5nIHRocmVhZC4KKyovCitrbXBfaW50MzIgX19rbXBjX2NhbmNlbGxhdGlvbnBvaW50KGlkZW50X3QqIGxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgY25jbF9raW5kKSB7CisgICAga21wX2luZm9fdCAqdGhpc190aHIgPSBfX2ttcF90aHJlYWRzIFsgZ3RpZCBdOworCisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19jYW5jZWxsYXRpb25wb2ludDogVCMlZCByZXF1ZXN0ICVkIE9NUF9DQU5DRUxMQVRJT049JWRcbiIsIGd0aWQsIGNuY2xfa2luZCwgX19rbXBfb21wX2NhbmNlbGxhdGlvbikgKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoY25jbF9raW5kICE9IGNhbmNlbF9ub3JlcSk7CisgICAgS01QX0RFQlVHX0FTU0VSVChjbmNsX2tpbmQgPT0gY2FuY2VsX3BhcmFsbGVsIHx8IGNuY2xfa2luZCA9PSBjYW5jZWxfbG9vcCB8fCAKKyAgICAgICAgICAgICAgICAgICAgIGNuY2xfa2luZCA9PSBjYW5jZWxfc2VjdGlvbnMgfHwgY25jbF9raW5kID09IGNhbmNlbF90YXNrZ3JvdXApOyAKKyAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2dldF9ndGlkKCkgPT0gZ3RpZCk7CisKKyAgICBpZiAoX19rbXBfb21wX2NhbmNlbGxhdGlvbikgeworICAgICAgICBzd2l0Y2ggKGNuY2xfa2luZCkgeworICAgICAgICBjYXNlIGNhbmNlbF9wYXJhbGxlbDoKKyAgICAgICAgY2FzZSBjYW5jZWxfbG9vcDoKKyAgICAgICAgY2FzZSBjYW5jZWxfc2VjdGlvbnM6CisgICAgICAgICAgICAvLyBjYW5jZWxsYXRpb24gcmVxdWVzdHMgZm9yIHBhcmFsbGVsIGFuZCB3b3Jrc2hhcmluZyBjb25zdHJ1Y3RzCisgICAgICAgICAgICAvLyBhcmUgaGFuZGxlZCB0aHJvdWdoIHRoZSB0ZWFtIHN0cnVjdHVyZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGttcF90ZWFtX3QgKnRoaXNfdGVhbSA9IHRoaXNfdGhyLT50aC50aF90ZWFtOworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGhpc190ZWFtKTsKKyAgICAgICAgICAgICAgICBpZiAodGhpc190ZWFtLT50LnRfY2FuY2VsX3JlcXVlc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNuY2xfa2luZCA9PSB0aGlzX3RlYW0tPnQudF9jYW5jZWxfcmVxdWVzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlcXVlc3QgaW4gdGhlIHRlYW0gc3RydWN0dXJlIG1hdGNoZXMgdGhlIHR5cGUgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbmNlbGxhdGlvbiBwb2ludCBzbyB3ZSBjYW4gY2FuY2VsCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiB0cnVlICovOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoIDAgLyogZmFsc2UgKi8pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gd2UgZG8gbm90IGhhdmUgYSBjYW5jZWxsYXRpb24gcmVxdWVzdCBwZW5kaW5nLCBzbyB3ZSBqdXN0CisgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGlzIGNhbmNlbGxhdGlvbiBwb2ludAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIGNhc2UgY2FuY2VsX3Rhc2tncm91cDoKKyAgICAgICAgICAgIC8vIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyBmb3IgYSB0YXNrIGdyb3VwCisgICAgICAgICAgICAvLyBhcmUgaGFuZGxlZCB0aHJvdWdoIHRoZSB0YXNrZ3JvdXAgc3RydWN0dXJlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAga21wX3Rhc2tkYXRhX3QqICB0YXNrOyAKKyAgICAgICAgICAgICAgICBrbXBfdGFza2dyb3VwX3QqIHRhc2tncm91cDsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB0YXNrID0gdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzazsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrICk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgdGFza2dyb3VwID0gdGFzay0+dGRfdGFza2dyb3VwOworICAgICAgICAgICAgICAgIGlmICh0YXNrZ3JvdXApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIHRoZSBjdXJyZW50IHN0YXR1cyBvZiBjYW5jZWxsYXRpb24gZm9yIHRoZSAKKyAgICAgICAgICAgICAgICAgICAgLy8gdGFza2dyb3VwCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAhIXRhc2tncm91cC0+Y2FuY2VsX3JlcXVlc3Q7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBpZiBhIGNhbmNlbGxhdGlvbiBwb2ludCBpcyBlbmNvdW50ZXJlZCBieSBhIHRhc2sKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBkb2VzIG5vdCBiZWxvbmcgdG8gYSB0YXNrZ3JvdXAsIGl0IGlzIE9LCisgICAgICAgICAgICAgICAgICAgIC8vIHRvIGlnbm9yZSBpdAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCAvKiBmYWxzZSAqLzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBLTVBfQVNTRVJUICgwIC8qIGZhbHNlICovKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIElDViBPTVBfQ0FOQ0VMTEFUSU9OPWZhbHNlLCBzbyB3ZSBpZ25vcmUgdGhlIGNhbmNlbGxhdGlvbiBwb2ludAorICAgIEtNUF9ERUJVR19BU1NFUlQoIV9fa21wX29tcF9jYW5jZWxsYXRpb24pOworICAgIHJldHVybiAwIC8qIGZhbHNlICovOworfQorCisvKiEKK0Bpbmdyb3VwIENBTkNFTExBVElPTgorQHBhcmFtIGxvY19yZWYgbG9jYXRpb24gb2YgdGhlIG9yaWdpbmFsIHRhc2sgZGlyZWN0aXZlCitAcGFyYW0gZ3RpZCBHbG9iYWwgdGhyZWFkIElEIG9mIGVuY291bnRlcmluZyB0aHJlYWQKKworQHJldHVybiByZXR1cm5zIHRydWUgaWYgYSBtYXRjaGluZyBjYW5jZWxsYXRpb24gcmVxdWVzdCBoYXMgYmVlbiBmbGFnZ2VkIGluIHRoZSBSVEwgYW5kIHRoZSAKK2VuY291bnRlcmluZyB0aHJlYWQgaGFzIHRvIGNhbmNlbC4uCisKK0JhcnJpZXIgd2l0aCBjYW5jZWxsYXRpb24gcG9pbnQgdG8gc2VuZCB0aHJlYWRzIGZyb20gdGhlIGJhcnJpZXIgdG8gdGhlCitlbmQgb2YgdGhlIHBhcmFsbGVsIHJlZ2lvbi4gIE5lZWRzIGEgc3BlY2lhbCBjb2RlIHBhdHRlcm4gYXMgZG9jdW1lbnRlZCAKK2luIHRoZSBkZXNpZ24gZG9jdW1lbnQgZm9yIHRoZSBjYW5jZWxsYXRpb24gZmVhdHVyZS4KKyovCitrbXBfaW50MzIKK19fa21wY19jYW5jZWxfYmFycmllcihpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkKSB7CisgICAgaW50IHJldCA9IDAgLyogZmFsc2UgKi87CisgICAga21wX2luZm9fdCAqdGhpc190aHIgPSBfX2ttcF90aHJlYWRzIFsgZ3RpZCBdOworICAgIGttcF90ZWFtX3QgKnRoaXNfdGVhbSA9IHRoaXNfdGhyLT50aC50aF90ZWFtOworCisgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9nZXRfZ3RpZCgpID09IGd0aWQpOworCisgICAgLy8gY2FsbCBpbnRvIHRoZSBzdGFuZGFyZCBiYXJyaWVyCisgICAgX19rbXBjX2JhcnJpZXIobG9jLCBndGlkKTsKKworICAgIC8vIGlmIGNhbmNlbGxhdGlvbiBpcyBhY3RpdmUsIGNoZWNrIGNhbmNlbGxhdGlvbiBmbGFnCisgICAgaWYgKF9fa21wX29tcF9jYW5jZWxsYXRpb24pIHsKKyAgICAgICAgLy8gZGVwZW5kaW5nIG9uIHdoaWNoIGNvbnN0cnVjdCB0byBjYW5jZWwsIGNoZWNrIHRoZSBmbGFnIGFuZAorICAgICAgICAvLyByZXNldCB0aGUgZmxhZworICAgICAgICBzd2l0Y2ggKHRoaXNfdGVhbS0+dC50X2NhbmNlbF9yZXF1ZXN0KSB7CisgICAgICAgIGNhc2UgY2FuY2VsX3BhcmFsbGVsOgorICAgICAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgICAgIC8vIGVuc3VyZSB0aGF0IHRocmVhZHMgaGF2ZSBjaGVja2VkIHRoZSBmbGFnLCB3aGVuCisgICAgICAgICAgICAvLyBsZWF2aW5nIHRoZSBhYm92ZSBiYXJyaWVyCisgICAgICAgICAgICBfX2ttcGNfYmFycmllcihsb2MsIGd0aWQpOworICAgICAgICAgICAgdGhpc190ZWFtLT50LnRfY2FuY2VsX3JlcXVlc3QgPSBjYW5jZWxfbm9yZXE7CisgICAgICAgICAgICAvLyB0aGUgbmV4dCBiYXJyaWVyIGlzIHRoZSBmb3JrL2pvaW4gYmFycmllciwgd2hpY2gKKyAgICAgICAgICAgIC8vIHN5bmNocm9uaXplcyB0aGUgdGhyZWFkcyBsZWF2aW5nIGhlcmUgICAgICAgIAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY2FuY2VsX2xvb3A6CisgICAgICAgIGNhc2UgY2FuY2VsX3NlY3Rpb25zOgorICAgICAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgICAgIC8vIGVuc3VyZSB0aGF0IHRocmVhZHMgaGF2ZSBjaGVja2VkIHRoZSBmbGFnLCB3aGVuCisgICAgICAgICAgICAvLyBsZWF2aW5nIHRoZSBhYm92ZSBiYXJyaWVyCisgICAgICAgICAgICBfX2ttcGNfYmFycmllcihsb2MsIGd0aWQpOworICAgICAgICAgICAgdGhpc190ZWFtLT50LnRfY2FuY2VsX3JlcXVlc3QgPSBjYW5jZWxfbm9yZXE7CisgICAgICAgICAgICAvLyBzeW5jaHJvbml6ZSB0aGUgdGhyZWFkcyBhZ2FpbiB0byBtYWtlIHN1cmUgd2UKKyAgICAgICAgICAgIC8vIGRvIG5vdCBoYXZlIGFueSBydW4tYXdheSB0aHJlYWRzIHRoYXQgY2F1c2UgYSByYWNlCisgICAgICAgICAgICAvLyBvbiB0aGUgY2FuY2VsbGF0aW9uIGZsYWcKKyAgICAgICAgICAgIF9fa21wY19iYXJyaWVyKGxvYywgZ3RpZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjYW5jZWxfdGFza2dyb3VwOgorICAgICAgICAgICAgLy8gdGhpcyBjYXNlIHNob3VsZCBub3Qgb2NjdXIKKyAgICAgICAgICAgIEtNUF9BU1NFUlQgKDAgLyogZmFsc2UgKi8gKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNhbmNlbF9ub3JlcToKKyAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgS01QX0FTU0VSVCAoIDAgLyogZmFsc2UgKi8pOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHJldHVybiByZXQ7Cit9CisKKy8qIQorQGluZ3JvdXAgQ0FOQ0VMTEFUSU9OCitAcGFyYW0gbG9jX3JlZiBsb2NhdGlvbiBvZiB0aGUgb3JpZ2luYWwgdGFzayBkaXJlY3RpdmUKK0BwYXJhbSBndGlkIEdsb2JhbCB0aHJlYWQgSUQgb2YgZW5jb3VudGVyaW5nIHRocmVhZAorCitAcmV0dXJuIHJldHVybnMgdHJ1ZSBpZiBhIG1hdGNoaW5nIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGhhcyBiZWVuIGZsYWdnZWQgaW4gdGhlIFJUTCBhbmQgdGhlIAorZW5jb3VudGVyaW5nIHRocmVhZCBoYXMgdG8gY2FuY2VsLi4KKworUXVlcnkgZnVuY3Rpb24gdG8gcXVlcnkgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIGNhbmNlbGxhdGlvbiByZXF1ZXN0cy4KK0NhbiBiZSB1c2VkIHRvIGltcGxlbWVudCB0aGUgZm9sbG93aW5nIHBhdHRlcm46CisgCitpZiAoa21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzKGttcF9jYW5jZWxfcGFyYWxsZWwpKSB7CisgICAgcGVyZm9ybV9jbGVhbnVwKCk7CisgICAgI3ByYWdtYSBvbXAgY2FuY2VsbGF0aW9uIHBvaW50IHBhcmFsbGVsICAgICAgCit9CisqLworaW50IF9fa21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzKGludCBjYW5jZWxfa2luZCkgeworICAgIGlmIChfX2ttcF9vbXBfY2FuY2VsbGF0aW9uKSB7CisgICAgICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyID0gX19rbXBfZW50cnlfdGhyZWFkKCk7CisgICAgICAgIAorICAgICAgICBzd2l0Y2ggKGNhbmNlbF9raW5kKSB7CisgICAgICAgIGNhc2UgY2FuY2VsX3BhcmFsbGVsOgorICAgICAgICBjYXNlIGNhbmNlbF9sb29wOgorICAgICAgICBjYXNlIGNhbmNlbF9zZWN0aW9uczoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBrbXBfdGVhbV90ICp0aGlzX3RlYW0gPSB0aGlzX3Roci0+dGgudGhfdGVhbTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpc190ZWFtLT50LnRfY2FuY2VsX3JlcXVlc3QgPT0gY2FuY2VsX2tpbmQ7CisgICAgICAgICAgICB9CisgICAgICAgIGNhc2UgY2FuY2VsX3Rhc2tncm91cDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBrbXBfdGFza2RhdGFfdCogIHRhc2s7IAorICAgICAgICAgICAgICAgIGttcF90YXNrZ3JvdXBfdCogdGFza2dyb3VwOworICAgICAgICAgICAgICAgIHRhc2sgPSB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrOworICAgICAgICAgICAgICAgIHRhc2tncm91cCA9IHRhc2stPnRkX3Rhc2tncm91cDsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGFza2dyb3VwICYmIHRhc2tncm91cC0+Y2FuY2VsX3JlcXVlc3Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMCAvKiBmYWxzZSAqLzsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfY29uZmlnLmguY21ha2UgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfY29uZmlnLmguY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMzN2RhMAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9jb25maWcuaC5jbWFrZQpAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIGttcF9jb25maWcuaCAtLSBGZWF0dXJlIG1hY3JvcworICovCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworI2lmbmRlZiBLTVBfQ09ORklHX0gKKyNkZWZpbmUgS01QX0NPTkZJR19ICisKKyNpbmNsdWRlICJrbXBfcGxhdGZvcm0uaCIKKworLy8gY21ha2VkZWZpbmUwMSBNQUNSTyB3aWxsIGRlZmluZSBNQUNSTyBhcyBlaXRoZXIgMCBvciAxCisvLyBjbWFrZWRlZmluZSBNQUNSTyAxIHdpbGwgZGVmaW5lIE1BQ1JPIGFzIDEgb3IgbGVhdmUgdW5kZWZpbmVkCisjY21ha2VkZWZpbmUwMSBERUJVR19CVUlMRAorI2NtYWtlZGVmaW5lMDEgUkVMV0lUSERFQklORk9fQlVJTEQKKyNjbWFrZWRlZmluZTAxIExJQk9NUF9VU0VfSVRUX05PVElGWQorI2RlZmluZSBVU0VfSVRUX05PVElGWSBMSUJPTVBfVVNFX0lUVF9OT1RJRlkKKyNpZiAhIExJQk9NUF9VU0VfSVRUX05PVElGWQorIyBkZWZpbmUgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2VuZGlmCisjY21ha2VkZWZpbmUwMSBMSUJPTVBfVVNFX1ZFUlNJT05fU1lNQk9MUworI2lmIExJQk9NUF9VU0VfVkVSU0lPTl9TWU1CT0xTCisjIGRlZmluZSBLTVBfVVNFX1ZFUlNJT05fU1lNQk9MUworI2VuZGlmCisjY21ha2VkZWZpbmUwMSBMSUJPTVBfSEFWRV9XRUFLX0FUVFJJQlVURQorI2RlZmluZSBLTVBfSEFWRV9XRUFLX0FUVFJJQlVURSBMSUJPTVBfSEFWRV9XRUFLX0FUVFJJQlVURQorI2NtYWtlZGVmaW5lMDEgTElCT01QX0hBVkVfUFNBUEkKKyNkZWZpbmUgS01QX0hBVkVfUFNBUEkgTElCT01QX0hBVkVfUFNBUEkKKyNjbWFrZWRlZmluZTAxIExJQk9NUF9TVEFUUworI2RlZmluZSBLTVBfU1RBVFNfRU5BQkxFRCBMSUJPTVBfU1RBVFMKKyNjbWFrZWRlZmluZTAxIExJQk9NUF9IQVZFX1g4NklOVFJJTl9ICisjZGVmaW5lIEtNUF9IQVZFX1g4NklOVFJJTl9IIExJQk9NUF9IQVZFX1g4NklOVFJJTl9ICisjY21ha2VkZWZpbmUwMSBMSUJPTVBfSEFWRV9fX0JVSUxUSU5fUkVBRENZQ0xFQ09VTlRFUgorI2RlZmluZSBLTVBfSEFWRV9fX0JVSUxUSU5fUkVBRENZQ0xFQ09VTlRFUiBMSUJPTVBfSEFWRV9fX0JVSUxUSU5fUkVBRENZQ0xFQ09VTlRFUgorI2NtYWtlZGVmaW5lMDEgTElCT01QX0hBVkVfX19SRFRTQworI2RlZmluZSBLTVBfSEFWRV9fX1JEVFNDIExJQk9NUF9IQVZFX19fUkRUU0MKKyNjbWFrZWRlZmluZTAxIExJQk9NUF9VU0VfREVCVUdHRVIKKyNkZWZpbmUgVVNFX0RFQlVHR0VSIExJQk9NUF9VU0VfREVCVUdHRVIKKyNjbWFrZWRlZmluZTAxIExJQk9NUF9PTVBUX0RFQlVHCisjZGVmaW5lIE9NUFRfREVCVUcgTElCT01QX09NUFRfREVCVUcKKyNjbWFrZWRlZmluZTAxIExJQk9NUF9PTVBUX1NVUFBPUlQKKyNkZWZpbmUgT01QVF9TVVBQT1JUIExJQk9NUF9PTVBUX1NVUFBPUlQKKyNjbWFrZWRlZmluZTAxIExJQk9NUF9PTVBUX0JMQU1FCisjZGVmaW5lIE9NUFRfQkxBTUUgTElCT01QX09NUFRfQkxBTUUKKyNjbWFrZWRlZmluZTAxIExJQk9NUF9PTVBUX1RSQUNFCisjZGVmaW5lIE9NUFRfVFJBQ0UgTElCT01QX09NUFRfVFJBQ0UKKyNjbWFrZWRlZmluZTAxIExJQk9NUF9VU0VfQURBUFRJVkVfTE9DS1MKKyNkZWZpbmUgS01QX1VTRV9BREFQVElWRV9MT0NLUyBMSUJPTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisjZGVmaW5lIEtNUF9ERUJVR19BREFQVElWRV9MT0NLUyAwCisjY21ha2VkZWZpbmUwMSBMSUJPTVBfVVNFX0lOVEVSTk9ERV9BTElHTk1FTlQKKyNkZWZpbmUgS01QX1VTRV9JTlRFUk5PREVfQUxJR05NRU5UIExJQk9NUF9VU0VfSU5URVJOT0RFX0FMSUdOTUVOVAorI2NtYWtlZGVmaW5lMDEgTElCT01QX0VOQUJMRV9BU1NFUlRJT05TCisjZGVmaW5lIEtNUF9VU0VfQVNTRVJUIExJQk9NUF9FTkFCTEVfQVNTRVJUSU9OUworI2NtYWtlZGVmaW5lMDEgU1RVQlNfTElCUkFSWQorI2NtYWtlZGVmaW5lMDEgTElCT01QX1VTRV9IV0xPQworI2RlZmluZSBLTVBfVVNFX0hXTE9DIExJQk9NUF9VU0VfSFdMT0MKKyNkZWZpbmUgS01QX0FSQ0hfU1RSICJATElCT01QX0xFR0FMX0FSQ0hAIgorI2RlZmluZSBLTVBfTElCUkFSWV9GSUxFICJATElCT01QX0xJQl9GSUxFQCIKKyNkZWZpbmUgS01QX1ZFUlNJT05fTUFKT1IgQExJQk9NUF9WRVJTSU9OX01BSk9SQAorI2RlZmluZSBLTVBfVkVSU0lPTl9NSU5PUiBATElCT01QX1ZFUlNJT05fTUlOT1JACisjZGVmaW5lIExJQk9NUF9PTVBfVkVSU0lPTiBATElCT01QX09NUF9WRVJTSU9OQAorI2RlZmluZSBPTVBfNTBfRU5BQkxFRCAoTElCT01QX09NUF9WRVJTSU9OID49IDUwKQorI2RlZmluZSBPTVBfNDFfRU5BQkxFRCAoTElCT01QX09NUF9WRVJTSU9OID49IDQxKQorI2RlZmluZSBPTVBfNDBfRU5BQkxFRCAoTElCT01QX09NUF9WRVJTSU9OID49IDQwKQorI2RlZmluZSBPTVBfMzBfRU5BQkxFRCAoTElCT01QX09NUF9WRVJTSU9OID49IDMwKQorCisvLyBDb25maWd1cmVkIGNhY2hlIGxpbmUgYmFzZWQgb24gYXJjaGl0ZWN0dXJlCisjaWYgS01QX0FSQ0hfUFBDNjQKKyMgZGVmaW5lIENBQ0hFX0xJTkUgMTI4CisjZWxzZQorIyBkZWZpbmUgQ0FDSEVfTElORSA2NAorI2VuZGlmCisKKyNpZiAhIEtNUF8zMl9CSVRfQVJDSAorIyBkZWZpbmUgQlVJTERfSTggMQorI2VuZGlmCisKKyNkZWZpbmUgS01QX0RZTkFNSUNfTElCIDEKKyNkZWZpbmUgS01QX05FU1RFRF9IT1RfVEVBTVMgMQorI2RlZmluZSBLTVBfQURKVVNUX0JMT0NLVElNRSAxCisjZGVmaW5lIEJVSUxEX1BBUkFMTEVMX09SREVSRUQgMQorI2RlZmluZSBLTVBfQVNNX0lOVFJJTlMgMQorI2RlZmluZSBVU0VfSVRUX0JVSUxEIDEKKyNkZWZpbmUgSU5URUxfSVRUTk9USUZZX1BSRUZJWCBfX2ttcF9pdHRfCisjaWYgISBLTVBfTUlDCisjIGRlZmluZSBVU0VfTE9BRF9CQUxBTkNFIDEKKyNlbmRpZgorI2lmICEgKEtNUF9PU19XSU5ET1dTIHx8IEtNUF9PU19EQVJXSU4pCisjIGRlZmluZSBLTVBfVERBVEFfR1RJRCAxCisjZW5kaWYKKyNpZiBTVFVCU19MSUJSQVJZCisjIGRlZmluZSBLTVBfU1RVQiAxCisjZW5kaWYKKyNpZiBERUJVR19CVUlMRCB8fCBSRUxXSVRIREVCSU5GT19CVUlMRAorIyBkZWZpbmUgS01QX0RFQlVHIDEKKyNlbmRpZgorCisjaWYgS01QX09TX1dJTkRPV1MKKyMgZGVmaW5lIEtNUF9XSU5fQ0RFQ0wKKyNlbHNlCisjIGRlZmluZSBCVUlMRF9UVgorIyBkZWZpbmUgS01QX0dPTVBfQ09NUEFUCisjZW5kaWYKKworI2VuZGlmIC8vIEtNUF9DT05GSUdfSApkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2NzdXBwb3J0LmMgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfY3N1cHBvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDVmNTk2Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2NzdXBwb3J0LmMKQEAgLTAsMCArMSwzMDUzIEBACisvKgorICoga21wX2NzdXBwb3J0LmMgLS0ga2Zyb250IGxpbmthZ2Ugc3VwcG9ydCBmb3IgT3Blbk1QLgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAib21wLmgiICAgICAgICAvKiBleHRlcm4gIkMiIGRlY2xhcmF0aW9ucyBvZiB1c2VyLXZpc2libGUgcm91dGluZXMgKi8KKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorI2luY2x1ZGUgImttcF9pdHQuaCIKKyNpbmNsdWRlICJrbXBfZXJyb3IuaCIKKyNpbmNsdWRlICJrbXBfc3RhdHMuaCIKKworI2lmIE9NUFRfU1VQUE9SVAorI2luY2x1ZGUgIm9tcHQtaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJvbXB0LXNwZWNpZmljLmgiCisjZW5kaWYKKworI2RlZmluZSBNQVhfTUVTU0FHRSA1MTIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogIGZsYWdzIHdpbGwgYmUgdXNlZCBpbiBmdXR1cmUsIGUuZy4sIHRvIGltcGxlbWVudCAqLworLyogIG9wZW5tcF9zdHJpY3QgbGlicmFyeSByZXN0cmljdGlvbnMgICAgICAgICAgICAgICAqLworCisvKiEKKyAqIEBpbmdyb3VwIFNUQVJUVVBfU0hVVERPV04KKyAqIEBwYXJhbSBsb2MgICBpbiAgIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorICogQHBhcmFtIGZsYWdzIGluICAgZm9yIGZ1dHVyZSB1c2UgKGN1cnJlbnRseSBpZ25vcmVkKQorICoKKyAqIEluaXRpYWxpemUgdGhlIHJ1bnRpbWUgbGlicmFyeS4gVGhpcyBjYWxsIGlzIG9wdGlvbmFsOyBpZiBpdCBpcyBub3QgbWFkZSB0aGVuCisgKiBpdCB3aWxsIGJlIGltcGxpY2l0bHkgY2FsbGVkIGJ5IGF0dGVtcHRzIHRvIHVzZSBvdGhlciBsaWJyYXJ5IGZ1bmN0aW9ucy4KKyAqCisgKi8KK3ZvaWQKK19fa21wY19iZWdpbihpZGVudF90ICpsb2MsIGttcF9pbnQzMiBmbGFncykKK3sKKyAgICAvLyBCeSBkZWZhdWx0IF9fa21wX2lnbm9yZV9tcHBiZWcoKSByZXR1cm5zIFRSVUUuCisgICAgaWYgKF9fa21wX2lnbm9yZV9tcHBiZWcoKSA9PSBGQUxTRSkgeworICAgICAgICBfX2ttcF9pbnRlcm5hbF9iZWdpbigpOworCisgICAgICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfYmVnaW46IGNhbGxlZFxuIiApICk7CisgICAgfQorfQorCisvKiEKKyAqIEBpbmdyb3VwIFNUQVJUVVBfU0hVVERPV04KKyAqIEBwYXJhbSBsb2Mgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCisgKgorICogU2h1dGRvd24gdGhlIHJ1bnRpbWUgbGlicmFyeS4gVGhpcyBpcyBhbHNvIG9wdGlvbmFsLCBhbmQgZXZlbiBpZiBjYWxsZWQgd2lsbCBub3QKKyAqIGRvIGFueXRoaW5nIHVubGVzcyB0aGUgYEtNUF9JR05PUkVfTVBQRU5EYCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQgdG8gemVyby4KKyAgKi8KK3ZvaWQKK19fa21wY19lbmQoaWRlbnRfdCAqbG9jKQoreworICAgIC8vIEJ5IGRlZmF1bHQsIF9fa21wX2lnbm9yZV9tcHBlbmQoKSByZXR1cm5zIFRSVUUgd2hpY2ggbWFrZXMgX19rbXBjX2VuZCgpIGNhbGwgbm8tb3AuCisgICAgLy8gSG93ZXZlciwgdGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiB3aXRoIEtNUF9JR05PUkVfTVBQRU5EIGVudmlyb25tZW50IHZhcmlhYmxlLgorICAgIC8vIElmIEtNUF9JR05PUkVfTVBQRU5EIGlzIDAsIF9fa21wX2lnbm9yZV9tcHBlbmQoKSByZXR1cm5zIEZBTFNFIGFuZCBfX2ttcGNfZW5kKCkKKyAgICAvLyB3aWxsIHVucmVnaXN0ZXIgdGhpcyByb290IChpdCBjYW4gY2F1c2UgbGlicmFyeSBzaHV0IGRvd24pLgorICAgIGlmIChfX2ttcF9pZ25vcmVfbXBwZW5kKCkgPT0gRkFMU0UpIHsKKyAgICAgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19lbmQ6IGNhbGxlZFxuIiApICk7CisgICAgICAgIEtBX1RSQUNFKCAzMCwgKCJfX2ttcGNfZW5kXG4iICkpOworCisgICAgICAgIF9fa21wX2ludGVybmFsX2VuZF90aHJlYWQoIC0xICk7CisgICAgfQorfQorCisvKiEKK0Bpbmdyb3VwIFRIUkVBRF9TVEFURVMKK0BwYXJhbSBsb2MgU291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uLgorQHJldHVybiBUaGUgZ2xvYmFsIHRocmVhZCBpbmRleCBvZiB0aGUgYWN0aXZlIHRocmVhZC4KKworVGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGluIGFueSBjb250ZXh0LgorCitJZiB0aGUgcnVudGltZSBoYXMgb255IGJlZW4gZW50ZXJlZCBhdCB0aGUgb3V0ZXJtb3N0IGxldmVsIGZyb20gYQorc2luZ2xlIChuZWNlc3NhcmlseSBub24tT3Blbk1QPHN1cD4qPC9zdXA+KSB0aHJlYWQsIHRoZW4gdGhlIHRocmVhZCBudW1iZXIgaXMgdGhhdAord2hpY2ggd291bGQgYmUgcmV0dXJuZWQgYnkgb21wX2dldF90aHJlYWRfbnVtKCkgaW4gdGhlIG91dGVybW9zdAorYWN0aXZlIHBhcmFsbGVsIGNvbnN0cnVjdC4gKE9yIHplcm8gaWYgdGhlcmUgaXMgbm8gYWN0aXZlIHBhcmFsbGVsCitjb25zdHJ1Y3QsIHNpbmNlIHRoZSBtYXN0ZXIgdGhyZWFkIGlzIG5lY2Vzc2FyaWx5IHRocmVhZCB6ZXJvKS4KKworSWYgbXVsdGlwbGUgbm9uLU9wZW5NUCB0aHJlYWRzIGFsbCBlbnRlciBhbiBPcGVuTVAgY29uc3RydWN0IHRoZW4gdGhpcword2lsbCBiZSBhIHVuaXF1ZSB0aHJlYWQgaWRlbnRpZmllciBhbW9uZyBhbGwgdGhlIHRocmVhZHMgY3JlYXRlZCBieQordGhlIE9wZW5NUCBydW50aW1lIChidXQgdGhlIHZhbHVlIGNhbm5vdGUgYmUgZGVmaW5lZCBpbiB0ZXJtcyBvZgorT3Blbk1QIHRocmVhZCBpZHMgcmV0dXJuZWQgYnkgb21wX2dldF90aHJlYWRfbnVtKCkpLgorCisqLwora21wX2ludDMyCitfX2ttcGNfZ2xvYmFsX3RocmVhZF9udW0oaWRlbnRfdCAqbG9jKQoreworICAgIGttcF9pbnQzMiBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworCisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19nbG9iYWxfdGhyZWFkX251bTogVCMlZFxuIiwgZ3RpZCApICk7CisKKyAgICByZXR1cm4gZ3RpZDsKK30KKworLyohCitAaW5ncm91cCBUSFJFQURfU1RBVEVTCitAcGFyYW0gbG9jIFNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbi4KK0ByZXR1cm4gVGhlIG51bWJlciBvZiB0aHJlYWRzIHVuZGVyIGNvbnRyb2wgb2YgdGhlIE9wZW5NUDxzdXA+Kjwvc3VwPiBydW50aW1lCisKK1RoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBpbiBhbnkgY29udGV4dC4KK0l0IHJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiB0aHJlYWRzIHVuZGVyIHRoZSBjb250cm9sIG9mIHRoZSBPcGVuTVAgcnVudGltZS4gVGhhdCBpcworbm90IGEgbnVtYmVyIHRoYXQgY2FuIGJlIGRldGVybWluZWQgYnkgYW55IE9wZW5NUCBzdGFuZGFyZCBjYWxscywgc2luY2UgdGhlIGxpYnJhcnkgbWF5IGJlCitjYWxsZWQgZnJvbSBtb3JlIHRoYW4gb25lIG5vbi1PcGVuTVAgdGhyZWFkLCBhbmQgdGhpcyByZWZsZWN0cyB0aGUgdG90YWwgb3ZlciBhbGwgc3VjaCBjYWxscy4KK1NpbWlsYXJseSB0aGUgcnVudGltZSBtYWludGFpbnMgdW5kZXJseWluZyB0aHJlYWRzIGV2ZW4gd2hlbiB0aGV5IGFyZSBub3QgYWN0aXZlIChzaW5jZSB0aGUgY29zdAorb2YgY3JlYXRpbmcgYW5kIGRlc3Ryb3lpbmcgT1MgdGhyZWFkcyBpcyBoaWdoKSwgdGhpcyBjYWxsIGNvdW50cyBhbGwgc3VjaCB0aHJlYWRzIGV2ZW4gaWYgdGhleSBhcmUgbm90Cit3YWl0aW5nIGZvciB3b3JrLgorKi8KK2ttcF9pbnQzMgorX19rbXBjX2dsb2JhbF9udW1fdGhyZWFkcyhpZGVudF90ICpsb2MpCit7CisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19nbG9iYWxfbnVtX3RocmVhZHM6IG51bV90aHJlYWRzID0gJWRcbiIsIF9fa21wX250aCApICk7CisKKyAgICByZXR1cm4gVENSXzQoX19rbXBfbnRoKTsKK30KKworLyohCitAaW5ncm91cCBUSFJFQURfU1RBVEVTCitAcGFyYW0gbG9jIFNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbi4KK0ByZXR1cm4gVGhlIHRocmVhZCBudW1iZXIgb2YgdGhlIGNhbGxpbmcgdGhyZWFkIGluIHRoZSBpbm5lcm1vc3QgYWN0aXZlIHBhcmFsbGVsIGNvbnN0cnVjdC4KKworKi8KK2ttcF9pbnQzMgorX19rbXBjX2JvdW5kX3RocmVhZF9udW0oaWRlbnRfdCAqbG9jKQoreworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfYm91bmRfdGhyZWFkX251bTogY2FsbGVkXG4iICkgKTsKKyAgICByZXR1cm4gX19rbXBfdGlkX2Zyb21fZ3RpZCggX19rbXBfZW50cnlfZ3RpZCgpICk7Cit9CisKKy8qIQorQGluZ3JvdXAgVEhSRUFEX1NUQVRFUworQHBhcmFtIGxvYyBTb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24uCitAcmV0dXJuIFRoZSBudW1iZXIgb2YgdGhyZWFkcyBpbiB0aGUgaW5uZXJtb3N0IGFjdGl2ZSBwYXJhbGxlbCBjb25zdHJ1Y3QuCisqLwora21wX2ludDMyCitfX2ttcGNfYm91bmRfbnVtX3RocmVhZHMoaWRlbnRfdCAqbG9jKQoreworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfYm91bmRfbnVtX3RocmVhZHM6IGNhbGxlZFxuIiApICk7CisKKyAgICByZXR1cm4gX19rbXBfZW50cnlfdGhyZWFkKCkgLT4gdGgudGhfdGVhbSAtPiB0LnRfbnByb2M7Cit9CisKKy8qIQorICogQGluZ3JvdXAgREVQUkVDQVRFRAorICogQHBhcmFtIGxvYyBsb2NhdGlvbiBkZXNjcmlwdGlvbgorICoKKyAqIFRoaXMgZnVuY3Rpb24gbmVlZCBub3QgYmUgY2FsbGVkLiBJdCBhbHdheXMgcmV0dXJucyBUUlVFLgorICovCitrbXBfaW50MzIKK19fa21wY19va190b19mb3JrKGlkZW50X3QgKmxvYykKK3sKKyNpZm5kZWYgS01QX0RFQlVHCisKKyAgICByZXR1cm4gVFJVRTsKKworI2Vsc2UKKworICAgIGNvbnN0IGNoYXIgKnNlbWkyOworICAgIGNvbnN0IGNoYXIgKnNlbWkzOworICAgIGludCBsaW5lX25vOworCisgICAgaWYgKF9fa21wX3Bhcl9yYW5nZSA9PSAwKSB7CisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICBzZW1pMiA9IGxvYy0+cHNvdXJjZTsKKyAgICBpZiAoc2VtaTIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgc2VtaTIgPSBzdHJjaHIoc2VtaTIsICc7Jyk7CisgICAgaWYgKHNlbWkyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIHNlbWkyID0gc3RyY2hyKHNlbWkyICsgMSwgJzsnKTsKKyAgICBpZiAoc2VtaTIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgaWYgKF9fa21wX3Bhcl9yYW5nZV9maWxlbmFtZVswXSkgeworICAgICAgICBjb25zdCBjaGFyICpuYW1lID0gc2VtaTIgLSAxOworICAgICAgICB3aGlsZSAoKG5hbWUgPiBsb2MtPnBzb3VyY2UpICYmICgqbmFtZSAhPSAnLycpICYmICgqbmFtZSAhPSAnOycpKSB7CisgICAgICAgICAgICBuYW1lLS07CisgICAgICAgIH0KKyAgICAgICAgaWYgKCgqbmFtZSA9PSAnLycpIHx8ICgqbmFtZSA9PSAnOycpKSB7CisgICAgICAgICAgICBuYW1lKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cm5jbXAoX19rbXBfcGFyX3JhbmdlX2ZpbGVuYW1lLCBuYW1lLCBzZW1pMiAtIG5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gX19rbXBfcGFyX3JhbmdlIDwgMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBzZW1pMyA9IHN0cmNocihzZW1pMiArIDEsICc7Jyk7CisgICAgaWYgKF9fa21wX3Bhcl9yYW5nZV9yb3V0aW5lWzBdKSB7CisgICAgICAgIGlmICgoc2VtaTMgIT0gTlVMTCkgJiYgKHNlbWkzID4gc2VtaTIpCisgICAgICAgICAgJiYgKHN0cm5jbXAoX19rbXBfcGFyX3JhbmdlX3JvdXRpbmUsIHNlbWkyICsgMSwgc2VtaTMgLSBzZW1pMiAtIDEpKSkgeworICAgICAgICAgICAgcmV0dXJuIF9fa21wX3Bhcl9yYW5nZSA8IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKEtNUF9TU0NBTkYoc2VtaTMgKyAxLCAiJWQiLCAmbGluZV9ubykgPT0gMSkgeworICAgICAgICBpZiAoKGxpbmVfbm8gPj0gX19rbXBfcGFyX3JhbmdlX2xiKSAmJiAobGluZV9ubyA8PSBfX2ttcF9wYXJfcmFuZ2VfdWIpKSB7CisgICAgICAgICAgICByZXR1cm4gX19rbXBfcGFyX3JhbmdlID4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX19rbXBfcGFyX3JhbmdlIDwgMDsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7CisKKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKworfQorCisvKiEKK0Bpbmdyb3VwIFRIUkVBRF9TVEFURVMKK0BwYXJhbSBsb2MgU291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uLgorQHJldHVybiAxIGlmIHRoaXMgdGhyZWFkIGlzIGV4ZWN1dGluZyBpbnNpZGUgYW4gYWN0aXZlIHBhcmFsbGVsIHJlZ2lvbiwgemVybyBpZiBub3QuCisqLwora21wX2ludDMyCitfX2ttcGNfaW5fcGFyYWxsZWwoIGlkZW50X3QgKmxvYyApCit7CisgICAgcmV0dXJuIF9fa21wX2VudHJ5X3RocmVhZCgpIC0+IHRoLnRoX3Jvb3QgLT4gci5yX2FjdGl2ZTsKK30KKworLyohCitAaW5ncm91cCBQQVJBTExFTAorQHBhcmFtIGxvYyBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KK0BwYXJhbSBnbG9iYWxfdGlkIGdsb2JhbCB0aHJlYWQgbnVtYmVyCitAcGFyYW0gbnVtX3RocmVhZHMgbnVtYmVyIG9mIHRocmVhZHMgcmVxdWVzdGVkIGZvciB0aGlzIHBhcmFsbGVsIGNvbnN0cnVjdAorCitTZXQgdGhlIG51bWJlciBvZiB0aHJlYWRzIHRvIGJlIHVzZWQgYnkgdGhlIG5leHQgZm9yayBzcGF3bmVkIGJ5IHRoaXMgdGhyZWFkLgorVGhpcyBjYWxsIGlzIG9ubHkgcmVxdWlyZWQgaWYgdGhlIHBhcmFsbGVsIGNvbnN0cnVjdCBoYXMgYSBgbnVtX3RocmVhZHNgIGNsYXVzZS4KKyovCit2b2lkCitfX2ttcGNfcHVzaF9udW1fdGhyZWFkcyhpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBfaW50MzIgbnVtX3RocmVhZHMgKQoreworICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcGNfcHVzaF9udW1fdGhyZWFkczogZW50ZXIgVCMlZCBudW1fdGhyZWFkcz0lZFxuIiwKKyAgICAgIGdsb2JhbF90aWQsIG51bV90aHJlYWRzICkgKTsKKworICAgIF9fa21wX3B1c2hfbnVtX3RocmVhZHMoIGxvYywgZ2xvYmFsX3RpZCwgbnVtX3RocmVhZHMgKTsKK30KKwordm9pZAorX19rbXBjX3BvcF9udW1fdGhyZWFkcyhpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkICkKK3sKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBjX3BvcF9udW1fdGhyZWFkczogZW50ZXJcbiIgKSApOworCisgICAgLyogdGhlIG51bV90aHJlYWRzIGFyZSBhdXRvbWF0aWNhbGx5IHBvcHBlZCAqLworfQorCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorCit2b2lkCitfX2ttcGNfcHVzaF9wcm9jX2JpbmQoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wX2ludDMyIHByb2NfYmluZCApCit7CisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wY19wdXNoX3Byb2NfYmluZDogZW50ZXIgVCMlZCBwcm9jX2JpbmQ9JWRcbiIsCisgICAgICBnbG9iYWxfdGlkLCBwcm9jX2JpbmQgKSApOworCisgICAgX19rbXBfcHVzaF9wcm9jX2JpbmQoIGxvYywgZ2xvYmFsX3RpZCwgKGttcF9wcm9jX2JpbmRfdClwcm9jX2JpbmQgKTsKK30KKworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKworLyohCitAaW5ncm91cCBQQVJBTExFTAorQHBhcmFtIGxvYyAgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCitAcGFyYW0gYXJnYyAgdG90YWwgbnVtYmVyIG9mIGFyZ3VtZW50cyBpbiB0aGUgZWxsaXBzaXMKK0BwYXJhbSBtaWNyb3Rhc2sgIHBvaW50ZXIgdG8gY2FsbGJhY2sgcm91dGluZSBjb25zaXN0aW5nIG9mIG91dGxpbmVkIHBhcmFsbGVsIGNvbnN0cnVjdAorQHBhcmFtIC4uLiAgcG9pbnRlcnMgdG8gc2hhcmVkIHZhcmlhYmxlcyB0aGF0IGFyZW4ndCBnbG9iYWwKKworRG8gdGhlIGFjdHVhbCBmb3JrIGFuZCBjYWxsIHRoZSBtaWNyb3Rhc2sgaW4gdGhlIHJlbGV2YW50IG51bWJlciBvZiB0aHJlYWRzLgorKi8KK3ZvaWQKK19fa21wY19mb3JrX2NhbGwoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgYXJnYywga21wY19taWNybyBtaWNyb3Rhc2ssIC4uLikKK3sKKyAgaW50ICAgICAgICAgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKworI2lmIChLTVBfU1RBVFNfRU5BQkxFRCkgIAorICBpbnQgaW5QYXJhbGxlbCA9IF9fa21wY19pbl9wYXJhbGxlbChsb2MpOworICBpZiAoaW5QYXJhbGxlbCkKKyAgeworICAgICAgS01QX0NPVU5UX0JMT0NLKE9NUF9ORVNURURfUEFSQUxMRUwpOworICB9CisgIGVsc2UKKyAgeworICAgICAgS01QX1NUT1BfRVhQTElDSVRfVElNRVIoT01QX3NlcmlhbCk7CisgICAgICBLTVBfQ09VTlRfQkxPQ0soT01QX1BBUkFMTEVMKTsKKyAgfQorI2VuZGlmCisKKyAgLy8gbWF5YmUgdG8gc2F2ZSB0aHJfc3RhdGUgaXMgZW5vdWdoIGhlcmUKKyAgeworICAgIHZhX2xpc3QgICAgIGFwOworICAgIHZhX3N0YXJ0KCAgIGFwLCBtaWNyb3Rhc2sgKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIGludCB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKCBndGlkICk7CisgICAga21wX2luZm9fdCAqbWFzdGVyX3RoID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIGttcF90ZWFtX3QgKnBhcmVudF90ZWFtID0gbWFzdGVyX3RoLT50aC50aF90ZWFtOworICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICBwYXJlbnRfdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS4KKyAgICAgICAgICAgb21wdF90YXNrX2luZm8uZnJhbWUucmVlbnRlcl9ydW50aW1lX2ZyYW1lID0gX19idWlsdGluX2ZyYW1lX2FkZHJlc3MoMCk7CisgICAgfQorI2VuZGlmCisKKyNpZiBJTkNMVURFX1NTQ19NQVJLUworICAgIFNTQ19NQVJLX0ZPUktJTkcoKTsKKyNlbmRpZgorICAgIF9fa21wX2ZvcmtfY2FsbCggbG9jLCBndGlkLCBmb3JrX2NvbnRleHRfaW50ZWwsCisgICAgICAgICAgICBhcmdjLAorI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgVk9MQVRJTEVfQ0FTVCh2b2lkICopIG1pY3JvdGFzaywgICAgICAvLyAidW53cmFwcGVkIiB0YXNrCisjZW5kaWYKKyAgICAgICAgICAgIFZPTEFUSUxFX0NBU1QobWljcm90YXNrX3QpIG1pY3JvdGFzaywgLy8gIndyYXBwZWQiIHRhc2sKKyAgICAgICAgICAgIFZPTEFUSUxFX0NBU1QobGF1bmNoX3QpICAgIF9fa21wX2ludm9rZV90YXNrX2Z1bmMsCisvKiBUT0RPOiByZXZlcnQgd29ya2Fyb3VuZCBmb3IgSW50ZWwoUikgNjQgdHJhY2tlciAjOTYgKi8KKyNpZiAoS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KSAmJiBLTVBfT1NfTElOVVgKKyAgICAgICAgICAgICZhcAorI2Vsc2UKKyAgICAgICAgICAgIGFwCisjZW5kaWYKKyAgICAgICAgICAgICk7CisjaWYgSU5DTFVERV9TU0NfTUFSS1MKKyAgICBTU0NfTUFSS19KT0lOSU5HKCk7CisjZW5kaWYKKyAgICBfX2ttcF9qb2luX2NhbGwoIGxvYywgZ3RpZAorI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAsIGZvcmtfY29udGV4dF9pbnRlbAorI2VuZGlmCisgICAgKTsKKworICAgIHZhX2VuZCggYXAgKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgcGFyZW50X3RlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0uCisgICAgICAgICAgICBvbXB0X3Rhc2tfaW5mby5mcmFtZS5yZWVudGVyX3J1bnRpbWVfZnJhbWUgPSAwOworICAgIH0KKyNlbmRpZgorICB9CisjaWYgKEtNUF9TVEFUU19FTkFCTEVEKSAgCisgIGlmICghaW5QYXJhbGxlbCkKKyAgICAgIEtNUF9TVEFSVF9FWFBMSUNJVF9USU1FUihPTVBfc2VyaWFsKTsKKyNlbmRpZgorfQorCisjaWYgT01QXzQwX0VOQUJMRUQKKy8qIQorQGluZ3JvdXAgUEFSQUxMRUwKK0BwYXJhbSBsb2Mgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCitAcGFyYW0gZ2xvYmFsX3RpZCBnbG9iYWwgdGhyZWFkIG51bWJlcgorQHBhcmFtIG51bV90ZWFtcyBudW1iZXIgb2YgdGVhbXMgcmVxdWVzdGVkIGZvciB0aGUgdGVhbXMgY29uc3RydWN0CitAcGFyYW0gbnVtX3RocmVhZHMgbnVtYmVyIG9mIHRocmVhZHMgcGVyIHRlYW0gcmVxdWVzdGVkIGZvciB0aGUgdGVhbXMgY29uc3RydWN0CisKK1NldCB0aGUgbnVtYmVyIG9mIHRlYW1zIHRvIGJlIHVzZWQgYnkgdGhlIHRlYW1zIGNvbnN0cnVjdC4KK1RoaXMgY2FsbCBpcyBvbmx5IHJlcXVpcmVkIGlmIHRoZSB0ZWFtcyBjb25zdHJ1Y3QgaGFzIGEgYG51bV90ZWFtc2AgY2xhdXNlCitvciBhIGB0aHJlYWRfbGltaXRgIGNsYXVzZSAob3IgYm90aCkuCisqLwordm9pZAorX19rbXBjX3B1c2hfbnVtX3RlYW1zKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcF9pbnQzMiBudW1fdGVhbXMsIGttcF9pbnQzMiBudW1fdGhyZWFkcyApCit7CisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wY19wdXNoX251bV90ZWFtczogZW50ZXIgVCMlZCBudW1fdGVhbXM9JWQgbnVtX3RocmVhZHM9JWRcbiIsCisgICAgICBnbG9iYWxfdGlkLCBudW1fdGVhbXMsIG51bV90aHJlYWRzICkgKTsKKworICAgIF9fa21wX3B1c2hfbnVtX3RlYW1zKCBsb2MsIGdsb2JhbF90aWQsIG51bV90ZWFtcywgbnVtX3RocmVhZHMgKTsKK30KKworLyohCitAaW5ncm91cCBQQVJBTExFTAorQHBhcmFtIGxvYyAgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCitAcGFyYW0gYXJnYyAgdG90YWwgbnVtYmVyIG9mIGFyZ3VtZW50cyBpbiB0aGUgZWxsaXBzaXMKK0BwYXJhbSBtaWNyb3Rhc2sgIHBvaW50ZXIgdG8gY2FsbGJhY2sgcm91dGluZSBjb25zaXN0aW5nIG9mIG91dGxpbmVkIHRlYW1zIGNvbnN0cnVjdAorQHBhcmFtIC4uLiAgcG9pbnRlcnMgdG8gc2hhcmVkIHZhcmlhYmxlcyB0aGF0IGFyZW4ndCBnbG9iYWwKKworRG8gdGhlIGFjdHVhbCBmb3JrIGFuZCBjYWxsIHRoZSBtaWNyb3Rhc2sgaW4gdGhlIHJlbGV2YW50IG51bWJlciBvZiB0aHJlYWRzLgorKi8KK3ZvaWQKK19fa21wY19mb3JrX3RlYW1zKGlkZW50X3QgKmxvYywga21wX2ludDMyIGFyZ2MsIGttcGNfbWljcm8gbWljcm90YXNrLCAuLi4pCit7CisgICAgaW50ICAgICAgICAgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICBrbXBfaW5mb190ICp0aGlzX3RociA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICB2YV9saXN0ICAgICBhcDsKKyAgICB2YV9zdGFydCggICBhcCwgbWljcm90YXNrICk7CisKKyAgICBLTVBfQ09VTlRfQkxPQ0soT01QX1RFQU1TKTsKKworICAgIC8vIHJlbWVtYmVyIHRlYW1zIGVudHJ5IHBvaW50IGFuZCBuZXN0aW5nIGxldmVsCisgICAgdGhpc190aHItPnRoLnRoX3RlYW1zX21pY3JvdGFzayA9IG1pY3JvdGFzazsKKyAgICB0aGlzX3Roci0+dGgudGhfdGVhbXNfbGV2ZWwgPSB0aGlzX3Roci0+dGgudGhfdGVhbS0+dC50X2xldmVsOyAvLyBBQzogY2FuIGJlID4wIG9uIGhvc3QKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIGttcF90ZWFtX3QgKnBhcmVudF90ZWFtID0gdGhpc190aHItPnRoLnRoX3RlYW07CisgICAgaW50IHRpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIHBhcmVudF90ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLgorICAgICAgICAgICBvbXB0X3Rhc2tfaW5mby5mcmFtZS5yZWVudGVyX3J1bnRpbWVfZnJhbWUgPSBfX2J1aWx0aW5fZnJhbWVfYWRkcmVzcygwKTsKKyAgICB9CisjZW5kaWYKKworICAgIC8vIGNoZWNrIGlmIF9fa21wY19wdXNoX251bV90ZWFtcyBjYWxsZWQsIHNldCBkZWZhdWx0IG51bWJlciBvZiB0ZWFtcyBvdGhlcndpc2UKKyAgICBpZiAoIHRoaXNfdGhyLT50aC50aF90ZWFtc19zaXplLm50ZWFtcyA9PSAwICkgeworICAgICAgICBfX2ttcF9wdXNoX251bV90ZWFtcyggbG9jLCBndGlkLCAwLCAwICk7CisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQodGhpc190aHItPnRoLnRoX3NldF9ucHJvYyA+PSAxKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRoaXNfdGhyLT50aC50aF90ZWFtc19zaXplLm50ZWFtcyA+PSAxKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRoaXNfdGhyLT50aC50aF90ZWFtc19zaXplLm50aCA+PSAxKTsKKworICAgIF9fa21wX2ZvcmtfY2FsbCggbG9jLCBndGlkLCBmb3JrX2NvbnRleHRfaW50ZWwsCisgICAgICAgICAgICBhcmdjLAorI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgVk9MQVRJTEVfQ0FTVCh2b2lkICopIG1pY3JvdGFzaywgICAgICAgICAgICAgICAvLyAidW53cmFwcGVkIiB0YXNrCisjZW5kaWYKKyAgICAgICAgICAgIFZPTEFUSUxFX0NBU1QobWljcm90YXNrX3QpIF9fa21wX3RlYW1zX21hc3RlciwgLy8gIndyYXBwZWQiIHRhc2sKKyAgICAgICAgICAgIFZPTEFUSUxFX0NBU1QobGF1bmNoX3QpICAgIF9fa21wX2ludm9rZV90ZWFtc19tYXN0ZXIsCisjaWYgKEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkgJiYgS01QX09TX0xJTlVYCisgICAgICAgICAgICAmYXAKKyNlbHNlCisgICAgICAgICAgICBhcAorI2VuZGlmCisgICAgICAgICAgICApOworICAgIF9fa21wX2pvaW5fY2FsbCggbG9jLCBndGlkCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICwgZm9ya19jb250ZXh0X2ludGVsCisjZW5kaWYKKyAgICApOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICBwYXJlbnRfdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS4KKyAgICAgICAgICAgb21wdF90YXNrX2luZm8uZnJhbWUucmVlbnRlcl9ydW50aW1lX2ZyYW1lID0gTlVMTDsKKyAgICB9CisjZW5kaWYKKworICAgIHRoaXNfdGhyLT50aC50aF90ZWFtc19taWNyb3Rhc2sgPSBOVUxMOworICAgIHRoaXNfdGhyLT50aC50aF90ZWFtc19sZXZlbCA9IDA7CisgICAgKihrbXBfaW50NjQqKSgmdGhpc190aHItPnRoLnRoX3RlYW1zX3NpemUpID0gMEw7CisgICAgdmFfZW5kKCBhcCApOworfQorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKworLy8KKy8vIEkgZG9uJ3QgdGhpbmsgdGhpcyBmdW5jdGlvbiBzaG91bGQgZXZlciBoYXZlIGJlZW4gZXhwb3J0ZWQuCisvLyBUaGUgX19rbXBjXyBwcmVmaXggd2FzIG1pc2FwcGxpZWQuICBJJ20gZmFpcmx5IGNlcnRhaW4gdGhhdCBubyBnZW5lcmF0ZWQKKy8vIG9wZW5tcCBjb2RlIGV2ZXIgY2FsbGVkIGl0LCBidXQgaXQncyBiZWVuIGV4cG9ydGVkIGZyb20gdGhlIFJUTCBmb3Igc28KKy8vIGxvbmcgdGhhdCBJJ20gYWZyYWlkIHRvIHJlbW92ZSB0aGUgZGVmaW5pdGlvbi4KKy8vCitpbnQKK19fa21wY19pbnZva2VfdGFza19mdW5jKCBpbnQgZ3RpZCApCit7CisgICAgcmV0dXJuIF9fa21wX2ludm9rZV90YXNrX2Z1bmMoIGd0aWQgKTsKK30KKworLyohCitAaW5ncm91cCBQQVJBTExFTAorQHBhcmFtIGxvYyAgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCitAcGFyYW0gZ2xvYmFsX3RpZCAgZ2xvYmFsIHRocmVhZCBudW1iZXIKKworRW50ZXIgYSBzZXJpYWxpemVkIHBhcmFsbGVsIGNvbnN0cnVjdC4gVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCB0byBoYW5kbGUgYQorY29uZGl0aW9uYWwgcGFyYWxsZWwgcmVnaW9uLCBsaWtlIHRoaXMsCitAY29kZQorI3ByYWdtYSBvbXAgcGFyYWxsZWwgaWYgKGNvbmRpdGlvbikKK0BlbmRjb2RlCit3aGVuIHRoZSBjb25kaXRpb24gaXMgZmFsc2UuCisqLwordm9pZAorX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWwoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCkKK3sKKyAgICBfX2ttcF9zZXJpYWxpemVkX3BhcmFsbGVsKGxvYywgZ2xvYmFsX3RpZCk7IC8qIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBub3cgaW4ga21wX3J1bnRpbWUuYyBzbyB0aGF0IGl0IGNhbiBzaGFyZSBzdGF0aWMgZnVuY3Rpb25zIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGttcF9mb3JrX2NhbGwgc2luY2UgdGhlIHRhc2tzIHRvIGJlIGRvbmUgYXJlIHNpbWlsYXIgaW4gZWFjaCBjYXNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit9CisKKy8qIQorQGluZ3JvdXAgUEFSQUxMRUwKK0BwYXJhbSBsb2MgIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGdsb2JhbF90aWQgIGdsb2JhbCB0aHJlYWQgbnVtYmVyCisKK0xlYXZlIGEgc2VyaWFsaXplZCBwYXJhbGxlbCBjb25zdHJ1Y3QuCisqLwordm9pZAorX19rbXBjX2VuZF9zZXJpYWxpemVkX3BhcmFsbGVsKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQpCit7CisgICAga21wX2ludGVybmFsX2NvbnRyb2xfdCAqdG9wOworICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyOworICAgIGttcF90ZWFtX3QgKnNlcmlhbF90ZWFtOworCisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19lbmRfc2VyaWFsaXplZF9wYXJhbGxlbDogY2FsbGVkIGJ5IFQjJWRcbiIsIGdsb2JhbF90aWQgKSApOworCisgICAgLyogc2tpcCBhbGwgdGhpcyBjb2RlIGZvciBhdXRvcGFyIHNlcmlhbGl6ZWQgbG9vcHMgc2luY2UgaXQgcmVzdWx0cyBpbgorICAgICAgIHVuYWNjZXB0YWJsZSBvdmVyaGVhZCAqLworICAgIGlmKCBsb2MgIT0gTlVMTCAmJiAobG9jLT5mbGFncyAmIEtNUF9JREVOVF9BVVRPUEFSICkgKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBOb3QgYXV0b3BhciBjb2RlCisgICAgaWYoICEgVENSXzQoIF9fa21wX2luaXRfcGFyYWxsZWwgKSApCisgICAgICAgIF9fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoKTsKKworICAgIHRoaXNfdGhyICAgID0gX19rbXBfdGhyZWFkc1sgZ2xvYmFsX3RpZCBdOworICAgIHNlcmlhbF90ZWFtID0gdGhpc190aHItPnRoLnRoX3NlcmlhbF90ZWFtOworCisgICAjaWYgT01QXzQxX0VOQUJMRUQKKyAgIGttcF90YXNrX3RlYW1fdCAqICAgdGFza190ZWFtID0gdGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbTsKKworICAgLy8gd2UgbmVlZCB0byB3YWl0IGZvciB0aGUgcHJveHkgdGFza3MgYmVmb3JlIGZpbmlzaGluZyB0aGUgdGhyZWFkCisgICBpZiAoIHRhc2tfdGVhbSAhPSBOVUxMICYmIHRhc2tfdGVhbS0+dHQudHRfZm91bmRfcHJveHlfdGFza3MgKQorICAgICAgICBfX2ttcF90YXNrX3RlYW1fd2FpdCh0aGlzX3Rociwgc2VyaWFsX3RlYW0sIE5VTEwgKTsgLy8gaXMgYW4gSVRUIG9iamVjdCBuZWVkZWQgaGVyZT8KKyAgICNlbmRpZgorCisgICAgS01QX01CKCk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggc2VyaWFsX3RlYW0gKTsKKyAgICBLTVBfQVNTRVJUKCAgICAgICBzZXJpYWxfdGVhbSAtPiB0LnRfc2VyaWFsaXplZCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoaXNfdGhyIC0+IHRoLnRoX3RlYW0gPT0gc2VyaWFsX3RlYW0gKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzZXJpYWxfdGVhbSAhPSB0aGlzX3Roci0+dGgudGhfcm9vdC0+ci5yX3Jvb3RfdGVhbSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHNlcmlhbF90ZWFtIC0+IHQudF90aHJlYWRzICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggc2VyaWFsX3RlYW0gLT4gdC50X3RocmVhZHNbMF0gPT0gdGhpc190aHIgKTsKKworICAgIC8qIElmIG5lY2Vzc2FyeSwgcG9wIHRoZSBpbnRlcm5hbCBjb250cm9sIHN0YWNrIHZhbHVlcyBhbmQgcmVwbGFjZSB0aGUgdGVhbSB2YWx1ZXMgKi8KKyAgICB0b3AgPSBzZXJpYWxfdGVhbSAtPiB0LnRfY29udHJvbF9zdGFja190b3A7CisgICAgaWYgKCB0b3AgJiYgdG9wIC0+IHNlcmlhbF9uZXN0aW5nX2xldmVsID09IHNlcmlhbF90ZWFtIC0+IHQudF9zZXJpYWxpemVkICkgeworICAgICAgICBjb3B5X2ljdnMoICZzZXJpYWxfdGVhbSAtPiB0LnRfdGhyZWFkc1swXSAtPiB0aC50aF9jdXJyZW50X3Rhc2sgLT4gdGRfaWN2cywgdG9wICk7CisgICAgICAgIHNlcmlhbF90ZWFtIC0+IHQudF9jb250cm9sX3N0YWNrX3RvcCA9IHRvcCAtPiBuZXh0OworICAgICAgICBfX2ttcF9mcmVlKHRvcCk7CisgICAgfQorCisgICAgLy9pZiggc2VyaWFsX3RlYW0gLT4gdC50X3NlcmlhbGl6ZWQgPiAxICkKKyAgICBzZXJpYWxfdGVhbSAtPiB0LnRfbGV2ZWwtLTsKKworICAgIC8qIHBvcCBkaXNwYXRjaCBidWZmZXJzIHN0YWNrICovCisgICAgS01QX0RFQlVHX0FTU0VSVChzZXJpYWxfdGVhbS0+dC50X2Rpc3BhdGNoLT50aF9kaXNwX2J1ZmZlcik7CisgICAgeworICAgICAgICBkaXNwYXRjaF9wcml2YXRlX2luZm9fdCAqIGRpc3BfYnVmZmVyID0gc2VyaWFsX3RlYW0tPnQudF9kaXNwYXRjaC0+dGhfZGlzcF9idWZmZXI7CisgICAgICAgIHNlcmlhbF90ZWFtLT50LnRfZGlzcGF0Y2gtPnRoX2Rpc3BfYnVmZmVyID0KKyAgICAgICAgICAgIHNlcmlhbF90ZWFtLT50LnRfZGlzcGF0Y2gtPnRoX2Rpc3BfYnVmZmVyLT5uZXh0OworICAgICAgICBfX2ttcF9mcmVlKCBkaXNwX2J1ZmZlciApOworICAgIH0KKworICAgIC0tIHNlcmlhbF90ZWFtIC0+IHQudF9zZXJpYWxpemVkOworICAgIGlmICggc2VyaWFsX3RlYW0gLT4gdC50X3NlcmlhbGl6ZWQgPT0gMCApIHsKKworICAgICAgICAvKiByZXR1cm4gdG8gdGhlIHBhcmFsbGVsIHNlY3Rpb24gKi8KKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyAgICAgICAgaWYgKCBfX2ttcF9pbmhlcml0X2ZwX2NvbnRyb2wgJiYgc2VyaWFsX3RlYW0tPnQudF9mcF9jb250cm9sX3NhdmVkICkgeworICAgICAgICAgICAgX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZCgpOworICAgICAgICAgICAgX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZCggJnNlcmlhbF90ZWFtLT50LnRfeDg3X2ZwdV9jb250cm9sX3dvcmQgKTsKKyAgICAgICAgICAgIF9fa21wX2xvYWRfbXhjc3IoICZzZXJpYWxfdGVhbS0+dC50X214Y3NyICk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKyAgICAgICAgdGhpc190aHIgLT4gdGgudGhfdGVhbSAgICAgICAgICAgPSBzZXJpYWxfdGVhbSAtPiB0LnRfcGFyZW50OworICAgICAgICB0aGlzX3RociAtPiB0aC50aF9pbmZvLmRzLmRzX3RpZCA9IHNlcmlhbF90ZWFtIC0+IHQudF9tYXN0ZXJfdGlkOworCisgICAgICAgIC8qIHJlc3RvcmUgdmFsdWVzIGNhY2hlZCBpbiB0aGUgdGhyZWFkICovCisgICAgICAgIHRoaXNfdGhyIC0+IHRoLnRoX3RlYW1fbnByb2MgICAgID0gc2VyaWFsX3RlYW0gLT4gdC50X3BhcmVudCAtPiB0LnRfbnByb2M7ICAgICAgICAgIC8qICBKUEggKi8KKyAgICAgICAgdGhpc190aHIgLT4gdGgudGhfdGVhbV9tYXN0ZXIgICAgPSBzZXJpYWxfdGVhbSAtPiB0LnRfcGFyZW50IC0+IHQudF90aHJlYWRzWzBdOyAgICAgLyogSlBIICovCisgICAgICAgIHRoaXNfdGhyIC0+IHRoLnRoX3RlYW1fc2VyaWFsaXplZCA9IHRoaXNfdGhyIC0+IHRoLnRoX3RlYW0gLT4gdC50X3NlcmlhbGl6ZWQ7CisKKyAgICAgICAgLyogVE9ETyB0aGUgYmVsb3cgc2hvdWxkbid0IG5lZWQgdG8gYmUgYWRqdXN0ZWQgZm9yIHNlcmlhbGl6ZWQgdGVhbXMgKi8KKyAgICAgICAgdGhpc190aHIgLT4gdGgudGhfZGlzcGF0Y2ggICAgICAgPSAmIHRoaXNfdGhyIC0+IHRoLnRoX3RlYW0gLT4KKyAgICAgICAgICAgIHQudF9kaXNwYXRjaFsgc2VyaWFsX3RlYW0gLT4gdC50X21hc3Rlcl90aWQgXTsKKworICAgICAgICBfX2ttcF9wb3BfY3VycmVudF90YXNrX2Zyb21fdGhyZWFkKCB0aGlzX3RociApOworCisgICAgICAgIEtNUF9BU1NFUlQoIHRoaXNfdGhyIC0+IHRoLnRoX2N1cnJlbnRfdGFzayAtPiB0ZF9mbGFncy5leGVjdXRpbmcgPT0gMCApOworICAgICAgICB0aGlzX3RociAtPiB0aC50aF9jdXJyZW50X3Rhc2sgLT4gdGRfZmxhZ3MuZXhlY3V0aW5nID0gMTsKKworICAgICAgICBpZiAoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICkgeworICAgICAgICAgICAgLy8gQ29weSB0aGUgdGFzayB0ZWFtIGZyb20gdGhlIG5ldyBjaGlsZCAvIG9sZCBwYXJlbnQgdGVhbSB0byB0aGUgdGhyZWFkLgorICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSA9IHRoaXNfdGhyLT50aC50aF90ZWFtLT50LnRfdGFza190ZWFtW3RoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlXTsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBjX2VuZF9zZXJpYWxpemVkX3BhcmFsbGVsOiBUIyVkIHJlc3RvcmluZyB0YXNrX3RlYW0gJXAgLyB0ZWFtICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF90aWQsIHRoaXNfdGhyIC0+IHRoLnRoX3Rhc2tfdGVhbSwgdGhpc190aHIgLT4gdGgudGhfdGVhbSApICk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICkgeworICAgICAgICAgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcGNfZW5kX3NlcmlhbGl6ZWRfcGFyYWxsZWw6IFQjJWQgZGVjcmVhc2luZyBuZXN0aW5nIGRlcHRoIG9mIHNlcmlhbCB0ZWFtICVwIHRvICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF90aWQsIHNlcmlhbF90ZWFtLCBzZXJpYWxfdGVhbSAtPiB0LnRfc2VyaWFsaXplZCApICk7CisgICAgICAgIH0KKyAgICB9CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAga21wX3VpbnQ2NCBjdXJfdGltZSA9IDA7CisjaWYgIFVTRV9JVFRfTk9USUZZCisgICAgaWYgKCBfX2l0dF9nZXRfdGltZXN0YW1wX3B0ciApIHsKKyAgICAgICAgY3VyX3RpbWUgPSBfX2l0dF9nZXRfdGltZXN0YW1wKCk7CisgICAgfQorI2VuZGlmIC8qIFVTRV9JVFRfTk9USUZZICovCisgICAgaWYgKCB0aGlzX3Roci0+dGgudGhfdGVhbS0+dC50X2xldmVsID09IDAKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAmJiB0aGlzX3Roci0+dGgudGhfdGVhbXNfbWljcm90YXNrID09IE5VTEwKKyNlbmRpZgorICAgICkgeworICAgICAgICAvLyBSZXBvcnQgdGhlIGJhcnJpZXIKKyAgICAgICAgdGhpc190aHItPnRoLnRoX2lkZW50ID0gbG9jOworICAgICAgICBpZiAoICggX19pdHRfZnJhbWVfc3VibWl0X3YzX3B0ciB8fCBLTVBfSVRUX0RFQlVHICkgJiYKKyAgICAgICAgICAgICggX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMyB8fCBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9PSAxICkgKQorICAgICAgICB7CisgICAgICAgICAgICBfX2ttcF9pdHRfZnJhbWVfc3VibWl0KCBnbG9iYWxfdGlkLCB0aGlzX3Roci0+dGgudGhfZnJhbWVfdGltZV9zZXJpYWxpemVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX3RpbWUsIDAsIGxvYywgdGhpc190aHItPnRoLnRoX3RlYW1fbnByb2MsIDAgKTsKKyAgICAgICAgICAgIGlmICggX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMyApCisgICAgICAgICAgICAgICAgLy8gU2luY2UgYmFycmllciBmcmFtZSBmb3Igc2VyaWFsaXplZCByZWdpb24gaXMgZXF1YWwgdG8gdGhlIHJlZ2lvbiB3ZSB1c2UgdGhlIHNhbWUgYmVnaW4gdGltZXN0YW1wIGFzIGZvciB0aGUgYmFycmllci4KKyAgICAgICAgICAgICAgICBfX2ttcF9pdHRfZnJhbWVfc3VibWl0KCBnbG9iYWxfdGlkLCBzZXJpYWxfdGVhbS0+dC50X3JlZ2lvbl90aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl90aW1lLCAwLCBsb2MsIHRoaXNfdGhyLT50aC50aF90ZWFtX25wcm9jLCAyICk7CisgICAgICAgIH0gZWxzZSBpZiAoICggX19pdHRfZnJhbWVfZW5kX3YzX3B0ciB8fCBLTVBfSVRUX0RFQlVHICkgJiYKKyAgICAgICAgICAgICEgX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgJiYgX19rbXBfZm9ya2pvaW5fZnJhbWVzICkKKyAgICAgICAgICAgIC8vIE1hcmsgdGhlIGVuZCBvZiB0aGUgInBhcmFsbGVsIiByZWdpb24gZm9yIFZUdW5lLiBPbmx5IHVzZSBvbmUgb2YgZnJhbWUgbm90aWZpY2F0aW9uIHNjaGVtZSBhdCB0aGUgbW9tZW50LgorICAgICAgICAgICAgX19rbXBfaXR0X3JlZ2lvbl9qb2luZWQoIGdsb2JhbF90aWQsIDEgKTsKKyAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wb3BfcGFyYWxsZWwoIGdsb2JhbF90aWQsIE5VTEwgKTsKK30KKworLyohCitAaW5ncm91cCBTWU5DSFJPTklaQVRJT04KK0BwYXJhbSBsb2MgIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbi4KKworRXhlY3V0ZSA8dHQ+Zmx1c2g8L3R0Pi4gVGhpcyBpcyBpbXBsZW1lbnRlZCBhcyBhIGZ1bGwgbWVtb3J5IGZlbmNlLiAoVGhvdWdoCitkZXBlbmRpbmcgb24gdGhlIG1lbW9yeSBvcmRlcmluZyBjb252ZW50aW9uIG9iZXllZCBieSB0aGUgY29tcGlsZXIKK2V2ZW4gdGhhdCBtYXkgbm90IGJlIG5lY2Vzc2FyeSkuCisqLwordm9pZAorX19rbXBjX2ZsdXNoKGlkZW50X3QgKmxvYykKK3sKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX2ZsdXNoOiBjYWxsZWRcbiIgKSApOworCisgICAgLyogbmVlZCBleHBsaWNpdCBfX21mKCkgaGVyZSBzaW5jZSB1c2Ugdm9sYXRpbGUgaW5zdGVhZCBpbiBsaWJyYXJ5ICovCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICAjaWYgKCBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICkKKyAgICAgICAgI2lmIEtNUF9NSUMKKyAgICAgICAgICAgIC8vIGZlbmNlLXN0eWxlIGluc3RydWN0aW9ucyBkbyBub3QgZXhpc3QsIGJ1dCBsb2NrOyB4YWRkbCAkMCwoJXJzcCkgY2FuIGJlIHVzZWQuCisgICAgICAgICAgICAvLyBXZSBzaG91bGRuJ3QgbmVlZCBpdCwgdGhvdWdoLCBzaW5jZSB0aGUgQUJJIHJ1bGVzIHJlcXVpcmUgdGhhdAorICAgICAgICAgICAgLy8gKiBJZiB0aGUgY29tcGlsZXIgZ2VuZXJhdGVzIE5HTyBzdG9yZXMgaXQgYWxzbyBnZW5lcmF0ZXMgdGhlIGZlbmNlCisgICAgICAgICAgICAvLyAqIElmIHVzZXJzIGhhbmQtY29kZSBOR08gc3RvcmVzIHRoZXkgc2hvdWxkIGluc2VydCB0aGUgZmVuY2UKKyAgICAgICAgICAgIC8vIHRoZXJlZm9yZSBubyBpbmNvbXBsZXRlIHVub3JkZXJlZCBzdG9yZXMgc2hvdWxkIGJlIHZpc2libGUuCisgICAgICAgICNlbHNlCisgICAgICAgICAgICAvLyBDNzQ0MDQKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgdG8gYWRkcmVzcyBub24tdGVtcG9yYWwgc3RvcmUgaW5zdHJ1Y3Rpb25zIChzZmVuY2UgbmVlZGVkKS4KKyAgICAgICAgICAgIC8vIFRoZSBjbGZsdXNoIGluc3RydWN0aW9uIGlzIGFkZHJlc3NlZCBlaXRoZXIgKG1mZW5jZSBuZWVkZWQpLgorICAgICAgICAgICAgLy8gUHJvYmFibHkgdGhlIG5vbi10ZW1wb3JhbCBsb2FkIG1vbnZ0ZHFhIGluc3RydWN0aW9uIHNob3VsZCBhbHNvIGJlIGFkZHJlc3NlZC4KKyAgICAgICAgICAgIC8vIG1mZW5jZSBpcyBhIFNTRTIgaW5zdHJ1Y3Rpb24uIERvIG5vdCBleGVjdXRlIGl0IGlmIENQVSBpcyBub3QgU1NFMi4KKyAgICAgICAgICAgIGlmICggISBfX2ttcF9jcHVpbmZvLmluaXRpYWxpemVkICkgeworICAgICAgICAgICAgICAgIF9fa21wX3F1ZXJ5X2NwdWlkKCAmIF9fa21wX2NwdWluZm8gKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICBpZiAoICEgX19rbXBfY3B1aW5mby5zc2UyICkgeworICAgICAgICAgICAgICAgIC8vIENQVSBjYW5ub3QgZXhlY3V0ZSBTU0UyIGluc3RydWN0aW9ucy4KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgI2lmIEtNUF9DT01QSUxFUl9JQ0MgfHwgS01QX0NPTVBJTEVSX01TVkMKKyAgICAgICAgICAgICAgICBfbW1fbWZlbmNlKCk7CisgICAgICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICAgICBfX3N5bmNfc3luY2hyb25pemUoKTsKKyAgICAgICAgICAgICAgICAjZW5kaWYgLy8gS01QX0NPTVBJTEVSX0lDQworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgI2VuZGlmIC8vIEtNUF9NSUMKKyAgICAjZWxpZiAoS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpCisgICAgICAgIC8vIE5vdGhpbmcgdG8gc2VlIGhlcmUgbW92ZSBhbG9uZworICAgICNlbGlmIEtNUF9BUkNIX1BQQzY0CisgICAgICAgIC8vIE5vdGhpbmcgbmVlZGVkIGhlcmUgKHdlIGhhdmUgYSByZWFsIE1CIGFib3ZlKS4KKyAgICAgICAgI2lmIEtNUF9PU19DTksKKyAgICAgICAgLy8gVGhlIGZsdXNoaW5nIHRocmVhZCBuZWVkcyB0byB5aWVsZCBoZXJlOyB0aGlzIHByZXZlbnRzIGEKKyAgICAgICAvLyBidXN5LXdhaXRpbmcgdGhyZWFkIGZyb20gc2F0dXJhdGluZyB0aGUgcGlwZWxpbmUuIGZsdXNoIGlzCisgICAgICAgICAgLy8gb2Z0ZW4gdXNlZCBpbiBsb29wcyBsaWtlIHRoaXM6CisgICAgICAgICAgIC8vIHdoaWxlICghZmxhZykgeworICAgICAgICAgICAvLyAgICNwcmFnbWEgb21wIGZsdXNoKGZsYWcpCisgICAgICAgICAgIC8vIH0KKyAgICAgICAvLyBhbmQgYWRkaW5nIHRoZSB5aWVsZCBoZXJlIGlzIGdvb2QgZm9yIGF0IGxlYXN0IGEgMTB4IHNwZWVkdXAKKyAgICAgICAgICAvLyB3aGVuIHJ1bm5pbmcgPjIgdGhyZWFkcyBwZXIgY29yZSAob24gdGhlIE5BUyBMVSBiZW5jaG1hcmspLgorICAgICAgICAgICAgX19rbXBfeWllbGQoVFJVRSk7CisgICAgICAgICNlbmRpZgorICAgICNlbHNlCisgICAgICAgICNlcnJvciBVbmtub3duIG9yIHVuc3VwcG9ydGVkIGFyY2hpdGVjdHVyZQorICAgICNlbmRpZgorCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIQorQGluZ3JvdXAgU1lOQ0hST05JWkFUSU9OCitAcGFyYW0gbG9jIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGdsb2JhbF90aWQgdGhyZWFkIGlkLgorCitFeGVjdXRlIGEgYmFycmllci4KKyovCit2b2lkCitfX2ttcGNfYmFycmllcihpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkKQoreworICAgIEtNUF9DT1VOVF9CTE9DSyhPTVBfQkFSUklFUik7CisgICAgS01QX1RJTUVfQkxPQ0soT01QX2JhcnJpZXIpOworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfYmFycmllcjogY2FsbGVkIFQjJWRcbiIsIGdsb2JhbF90aWQgKSApOworCisgICAgaWYgKCEgVENSXzQoX19rbXBfaW5pdF9wYXJhbGxlbCkpCisgICAgICAgIF9fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoKTsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBpZiAoIGxvYyA9PSAwICkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIENvbnN0cnVjdElkZW50SW52YWxpZCApOyAvLyA/Pz8gV2hhdCBkb2VzIGl0IG1lYW4gZm9yIHRoZSB1c2VyPworICAgICAgICB9OyAvLyBpZgorCisgICAgICAgIF9fa21wX2NoZWNrX2JhcnJpZXIoIGdsb2JhbF90aWQsIGN0X2JhcnJpZXIsIGxvYyApOworICAgIH0KKworICAgIF9fa21wX3RocmVhZHNbIGdsb2JhbF90aWQgXS0+dGgudGhfaWRlbnQgPSBsb2M7CisgICAgLy8gVE9ETzogZXhwbGljaXQgYmFycmllcl93YWl0X2lkOgorICAgIC8vICAgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiAnYmFycmllcicgZGlyZWN0aXZlIGlzIHByZXNlbnQgb3IKKyAgICAvLyAgIGltcGxpY2l0IGJhcnJpZXIgYXQgdGhlIGVuZCBvZiBhIHdvcmtzaGFyaW5nIGNvbnN0cnVjdC4KKyAgICAvLyAxKSBiZXR0ZXIgdG8gYWRkIGEgcGVyLXRocmVhZCBiYXJyaWVyIGNvdW50ZXIgdG8gYSB0aHJlYWQgZGF0YSBzdHJ1Y3R1cmUKKyAgICAvLyAyKSBzZXQgdG8gMCB3aGVuIGEgbmV3IHRlYW0gaXMgY3JlYXRlZAorICAgIC8vIDQpIG5vIHN5bmMgaXMgcmVxdWlyZWQKKworICAgIF9fa21wX2JhcnJpZXIoIGJzX3BsYWluX2JhcnJpZXIsIGdsb2JhbF90aWQsIEZBTFNFLCAwLCBOVUxMLCBOVUxMICk7Cit9CisKKy8qIFRoZSBCQVJSSUVSIGZvciBhIE1BU1RFUiBzZWN0aW9uIGlzIGFsd2F5cyBleHBsaWNpdCAgICovCisvKiEKK0Bpbmdyb3VwIFdPUktfU0hBUklORworQHBhcmFtIGxvYyAgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uLgorQHBhcmFtIGdsb2JhbF90aWQgIGdsb2JhbCB0aHJlYWQgbnVtYmVyIC4KK0ByZXR1cm4gMSBpZiB0aGlzIHRocmVhZCBzaG91bGQgZXhlY3V0ZSB0aGUgPHR0Pm1hc3RlcjwvdHQ+IGJsb2NrLCAwIG90aGVyd2lzZS4KKyovCitrbXBfaW50MzIKK19fa21wY19tYXN0ZXIoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCkKK3sKKyAgICBLTVBfQ09VTlRfQkxPQ0soT01QX01BU1RFUik7CisgICAgaW50IHN0YXR1cyA9IDA7CisKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX21hc3RlcjogY2FsbGVkIFQjJWRcbiIsIGdsb2JhbF90aWQgKSApOworCisgICAgaWYoICEgVENSXzQoIF9fa21wX2luaXRfcGFyYWxsZWwgKSApCisgICAgICAgIF9fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoKTsKKworICAgIGlmKCBLTVBfTUFTVEVSX0dUSUQoIGdsb2JhbF90aWQgKSkgeworICAgICAgICBLTVBfU1RBUlRfRVhQTElDSVRfVElNRVIoT01QX21hc3Rlcik7CisgICAgICAgIHN0YXR1cyA9IDE7CisgICAgfQorCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIGlmIChvbXB0X2VuYWJsZWQgJiYKKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9tYXN0ZXJfYmVnaW4pKSB7CisgICAgICAgICAgICBrbXBfaW5mb190ICAqdGhpc190aHIgICAgICAgID0gX19rbXBfdGhyZWFkc1sgZ2xvYmFsX3RpZCBdOworICAgICAgICAgICAga21wX3RlYW1fdCAgKnRlYW0gICAgICAgICAgICA9IHRoaXNfdGhyIC0+IHRoLnRoX3RlYW07CisKKyAgICAgICAgICAgIGludCAgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZCggZ2xvYmFsX3RpZCApOworICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X21hc3Rlcl9iZWdpbikoCisgICAgICAgICAgICAgICAgdGVhbS0+dC5vbXB0X3RlYW1faW5mby5wYXJhbGxlbF9pZCwKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLm9tcHRfdGFza19pbmZvLnRhc2tfaWQpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworICAgICAgICBpZiAoc3RhdHVzKQorICAgICAgICAgICAgX19rbXBfcHVzaF9zeW5jKCBnbG9iYWxfdGlkLCBjdF9tYXN0ZXIsIGxvYywgTlVMTCwgMCApOworICAgICAgICBlbHNlCisgICAgICAgICAgICBfX2ttcF9jaGVja19zeW5jKCBnbG9iYWxfdGlkLCBjdF9tYXN0ZXIsIGxvYywgTlVMTCwgMCApOworI2Vsc2UKKyAgICAgICAgaWYgKHN0YXR1cykKKyAgICAgICAgICAgIF9fa21wX3B1c2hfc3luYyggZ2xvYmFsX3RpZCwgY3RfbWFzdGVyLCBsb2MsIE5VTEwgKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgX19rbXBfY2hlY2tfc3luYyggZ2xvYmFsX3RpZCwgY3RfbWFzdGVyLCBsb2MsIE5VTEwgKTsKKyNlbmRpZgorICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qIQorQGluZ3JvdXAgV09SS19TSEFSSU5HCitAcGFyYW0gbG9jICBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24uCitAcGFyYW0gZ2xvYmFsX3RpZCAgZ2xvYmFsIHRocmVhZCBudW1iZXIgLgorCitNYXJrIHRoZSBlbmQgb2YgYSA8dHQ+bWFzdGVyPC90dD4gcmVnaW9uLiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBieSB0aGUgdGhyZWFkCit0aGF0IGV4ZWN1dGVzIHRoZSA8dHQ+bWFzdGVyPC90dD4gcmVnaW9uLgorKi8KK3ZvaWQKK19fa21wY19lbmRfbWFzdGVyKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQpCit7CisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19lbmRfbWFzdGVyOiBjYWxsZWQgVCMlZFxuIiwgZ2xvYmFsX3RpZCApICk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBLTVBfTUFTVEVSX0dUSUQoIGdsb2JhbF90aWQgKSk7CisgICAgS01QX1NUT1BfRVhQTElDSVRfVElNRVIoT01QX21hc3Rlcik7CisKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRQorICAgIGttcF9pbmZvX3QgICp0aGlzX3RociAgICAgICAgPSBfX2ttcF90aHJlYWRzWyBnbG9iYWxfdGlkIF07CisgICAga21wX3RlYW1fdCAgKnRlYW0gICAgICAgICAgICA9IHRoaXNfdGhyIC0+IHRoLnRoX3RlYW07CisgICAgaWYgKG9tcHRfZW5hYmxlZCAmJgorICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfbWFzdGVyX2VuZCkpIHsKKyAgICAgICAgaW50ICB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKCBnbG9iYWxfdGlkICk7CisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9tYXN0ZXJfZW5kKSgKKyAgICAgICAgICAgIHRlYW0tPnQub21wdF90ZWFtX2luZm8ucGFyYWxsZWxfaWQsCisgICAgICAgICAgICB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLm9tcHRfdGFza19pbmZvLnRhc2tfaWQpOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGlmKCBnbG9iYWxfdGlkIDwgMCApCisgICAgICAgICAgICBLTVBfV0FSTklORyggVGhyZWFkSWRlbnRJbnZhbGlkICk7CisKKyAgICAgICAgaWYoIEtNUF9NQVNURVJfR1RJRCggZ2xvYmFsX3RpZCApKQorICAgICAgICAgICAgX19rbXBfcG9wX3N5bmMoIGdsb2JhbF90aWQsIGN0X21hc3RlciwgbG9jICk7CisgICAgfQorfQorCisvKiEKK0Bpbmdyb3VwIFdPUktfU0hBUklORworQHBhcmFtIGxvYyAgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uLgorQHBhcmFtIGd0aWQgIGdsb2JhbCB0aHJlYWQgbnVtYmVyLgorCitTdGFydCBleGVjdXRpb24gb2YgYW4gPHR0Pm9yZGVyZWQ8L3R0PiBjb25zdHJ1Y3QuCisqLwordm9pZAorX19rbXBjX29yZGVyZWQoIGlkZW50X3QgKiBsb2MsIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpbnQgY2lkID0gMDsKKyAgICBrbXBfaW5mb190ICp0aDsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworCisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19vcmRlcmVkOiBjYWxsZWQgVCMlZFxuIiwgZ3RpZCApKTsKKworICAgIGlmICghIFRDUl80KF9fa21wX2luaXRfcGFyYWxsZWwpKQorICAgICAgICBfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplKCk7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X29yZGVyZWRfcHJlcCggZ3RpZCApOworICAgIC8vIFRPRE86IG9yZGVyZWRfd2FpdF9pZAorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIHRoID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIC8qIE9NUFQgc3RhdGUgdXBkYXRlICovCisgICAgICAgIHRoLT50aC5vbXB0X3RocmVhZF9pbmZvLndhaXRfaWQgPSAodWludDY0X3QpIGxvYzsKKyAgICAgICAgdGgtPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBvbXB0X3N0YXRlX3dhaXRfb3JkZXJlZDsKKworICAgICAgICAvKiBPTVBUIGV2ZW50IGNhbGxiYWNrICovCisgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfd2FpdF9vcmRlcmVkKSkgeworICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3dhaXRfb3JkZXJlZCkoCisgICAgICAgICAgICAgICAgdGgtPnRoLm9tcHRfdGhyZWFkX2luZm8ud2FpdF9pZCk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIGlmICggdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZGVvX2ZjbiAhPSAwICkKKyAgICAgICAgKCp0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rlb19mY24pKCAmIGd0aWQsICYgY2lkLCBsb2MgKTsKKyAgICBlbHNlCisgICAgICAgIF9fa21wX3BhcmFsbGVsX2RlbyggJiBndGlkLCAmIGNpZCwgbG9jICk7CisKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRQorICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgLyogT01QVCBzdGF0ZSB1cGRhdGUgKi8KKyAgICAgICAgdGgtPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBvbXB0X3N0YXRlX3dvcmtfcGFyYWxsZWw7CisgICAgICAgIHRoLT50aC5vbXB0X3RocmVhZF9pbmZvLndhaXRfaWQgPSAwOworCisgICAgICAgIC8qIE9NUFQgZXZlbnQgY2FsbGJhY2sgKi8KKyAgICAgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9hY3F1aXJlZF9vcmRlcmVkKSkgeworICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2FjcXVpcmVkX29yZGVyZWQpKAorICAgICAgICAgICAgICAgIHRoLT50aC5vbXB0X3RocmVhZF9pbmZvLndhaXRfaWQpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X29yZGVyZWRfc3RhcnQoIGd0aWQgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCit9CisKKy8qIQorQGluZ3JvdXAgV09SS19TSEFSSU5HCitAcGFyYW0gbG9jICBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24uCitAcGFyYW0gZ3RpZCAgZ2xvYmFsIHRocmVhZCBudW1iZXIuCisKK0VuZCBleGVjdXRpb24gb2YgYW4gPHR0Pm9yZGVyZWQ8L3R0PiBjb25zdHJ1Y3QuCisqLwordm9pZAorX19rbXBjX2VuZF9vcmRlcmVkKCBpZGVudF90ICogbG9jLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaW50IGNpZCA9IDA7CisgICAga21wX2luZm9fdCAqdGg7CisKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX2VuZF9vcmRlcmVkOiBjYWxsZWQgVCMlZFxuIiwgZ3RpZCApICk7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X29yZGVyZWRfZW5kKCBndGlkICk7CisgICAgLy8gVE9ETzogb3JkZXJlZF93YWl0X2lkCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgdGggPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisKKyAgICBpZiAoIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2R4b19mY24gIT0gMCApCisgICAgICAgICgqdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9keG9fZmNuKSggJiBndGlkLCAmIGNpZCwgbG9jICk7CisgICAgZWxzZQorICAgICAgICBfX2ttcF9wYXJhbGxlbF9keG8oICYgZ3RpZCwgJiBjaWQsIGxvYyApOworCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfQkxBTUUKKyAgICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9yZWxlYXNlX29yZGVyZWQpKSB7CisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9yZWxlYXNlX29yZGVyZWQpKAorICAgICAgICAgICAgdGgtPnRoLm9tcHRfdGhyZWFkX2luZm8ud2FpdF9pZCk7CisgICAgfQorI2VuZGlmCit9CisKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworCitzdGF0aWMgX19mb3JjZWlubGluZSB2b2lkCitfX2ttcF9pbml0X2luZGlyZWN0X2NzcHRyKGttcF9jcml0aWNhbF9uYW1lICogY3JpdCwgaWRlbnRfdCBjb25zdCAqIGxvYywga21wX2ludDMyIGd0aWQsIGttcF9pbmRpcmVjdF9sb2NrdGFnX3QgdGFnKQoreworICAgIC8vIFBvaW50ZXIgdG8gdGhlIGFsbG9jYXRlZCBpbmRpcmVjdCBsb2NrIGlzIHdyaXR0ZW4gdG8gY3JpdCwgd2hpbGUgaW5kZXhpbmcgaXMgaWdub3JlZC4KKyAgICB2b2lkICppZHg7CisgICAga21wX2luZGlyZWN0X2xvY2tfdCAqKmxjazsKKyAgICBsY2sgPSAoa21wX2luZGlyZWN0X2xvY2tfdCAqKiljcml0OworICAgIGttcF9pbmRpcmVjdF9sb2NrX3QgKmlsayA9IF9fa21wX2FsbG9jYXRlX2luZGlyZWN0X2xvY2soJmlkeCwgZ3RpZCwgdGFnKTsKKyAgICBLTVBfSV9MT0NLX0ZVTkMoaWxrLCBpbml0KShpbGstPmxvY2spOworICAgIEtNUF9TRVRfSV9MT0NLX0xPQ0FUSU9OKGlsaywgbG9jKTsKKyAgICBLTVBfU0VUX0lfTE9DS19GTEFHUyhpbGssIGttcF9sZl9jcml0aWNhbF9zZWN0aW9uKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9pbml0X2luZGlyZWN0X2NzcHRyOiBpbml0aWFsaXplZCBpbmRpcmVjdCBsb2NrICMlZFxuIiwgdGFnKSk7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9jcml0aWNhbF9jcmVhdGluZyhpbGstPmxvY2ssIGxvYyk7CisjZW5kaWYKKyAgICBpbnQgc3RhdHVzID0gS01QX0NPTVBBUkVfQU5EX1NUT1JFX1BUUihsY2ssIDAsIGlsayk7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICBfX2ttcF9pdHRfY3JpdGljYWxfZGVzdHJveWVkKGlsay0+bG9jayk7CisjZW5kaWYKKyAgICAgICAgLy8gV2UgZG9uJ3QgcmVhbGx5IG5lZWQgdG8gZGVzdHJveSB0aGUgdW5jbGFpbWVkIGxvY2sgaGVyZSBzaW5jZSBpdCB3aWxsIGJlIGNsZWFuZWQgdXAgYXQgcHJvZ3JhbSBleGl0LgorICAgICAgICAvL0tNUF9EX0xPQ0tfRlVOQygmaWR4LCBkZXN0cm95KSgoa21wX2R5bmFfbG9ja190ICopJmlkeCk7CisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQoKmxjayAhPSBOVUxMKTsKK30KKworLy8gRmFzdC1wYXRoIGFjcXVpcmUgdGFzIGxvY2sKKyNkZWZpbmUgS01QX0FDUVVJUkVfVEFTX0xPQ0sobG9jaywgZ3RpZCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGttcF90YXNfbG9ja190ICpsID0gKGttcF90YXNfbG9ja190ICopbG9jazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGwtPmxrLnBvbGwgIT0gS01QX0xPQ0tfRlJFRSh0YXMpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCYobC0+bGsucG9sbCksIEtNUF9MT0NLX0ZSRUUodGFzKSwgS01QX0xPQ0tfQlVTWShndGlkKzEsIHRhcykpKSB7ICAgICAgXAorICAgICAgICBrbXBfdWludDMyIHNwaW5zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9GU1lOQ19QUkVQQVJFKGwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0lOSVRfWUlFTEQoc3BpbnMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoVENSXzQoX19rbXBfbnRoKSA+IChfX2ttcF9hdmFpbF9wcm9jID8gX19rbXBfYXZhaWxfcHJvYyA6IF9fa21wX3hwcm9jKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfWUlFTEQoVFJVRSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgS01QX1lJRUxEX1NQSU4oc3BpbnMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgd2hpbGUgKGwtPmxrLnBvbGwgIT0gS01QX0xPQ0tfRlJFRSh0YXMpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIoJihsLT5say5wb2xsKSwgS01QX0xPQ0tfRlJFRSh0YXMpLCBLTVBfTE9DS19CVVNZKGd0aWQrMSwgdGFzKSkpIHsgICBcCisgICAgICAgICAgICBpZiAoVENSXzQoX19rbXBfbnRoKSA+IChfX2ttcF9hdmFpbF9wcm9jID8gX19rbXBfYXZhaWxfcHJvYyA6IF9fa21wX3hwcm9jKSkgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBLTVBfWUlFTEQoVFJVRSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgS01QX1lJRUxEX1NQSU4oc3BpbnMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfRlNZTkNfQUNRVUlSRUQobCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvLyBGYXN0LXBhdGggdGVzdCB0YXMgbG9jaworI2RlZmluZSBLTVBfVEVTVF9UQVNfTE9DSyhsb2NrLCBndGlkLCByYykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBrbXBfdGFzX2xvY2tfdCAqbCA9IChrbXBfdGFzX2xvY2tfdCAqKWxvY2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmMgPSBsLT5say5wb2xsID09IEtNUF9MT0NLX0ZSRUUodGFzKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCYobC0+bGsucG9sbCksIEtNUF9MT0NLX0ZSRUUodGFzKSwgS01QX0xPQ0tfQlVTWShndGlkKzEsIHRhcykpOyAgIFwKK30KKworLy8gRmFzdC1wYXRoIHJlbGVhc2UgdGFzIGxvY2sKKyNkZWZpbmUgS01QX1JFTEVBU0VfVEFTX0xPQ0sobG9jaywgZ3RpZCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRDV180KCgoa21wX3Rhc19sb2NrX3QgKilsb2NrKS0+bGsucG9sbCwgS01QX0xPQ0tfRlJFRSh0YXMpKTsgICBcCisgICAgS01QX01CKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2lmIEtNUF9VU0VfRlVURVgKKworIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKyMgaWZuZGVmIEZVVEVYX1dBSVQKKyMgIGRlZmluZSBGVVRFWF9XQUlUIDAKKyMgZW5kaWYKKyMgaWZuZGVmIEZVVEVYX1dBS0UKKyMgIGRlZmluZSBGVVRFWF9XQUtFIDEKKyMgZW5kaWYKKworLy8gRmFzdC1wYXRoIGFjcXVpcmUgZnV0ZXggbG9jaworI2RlZmluZSBLTVBfQUNRVUlSRV9GVVRFWF9MT0NLKGxvY2ssIGd0aWQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAga21wX2Z1dGV4X2xvY2tfdCAqZnR4ID0gKGttcF9mdXRleF9sb2NrX3QgKilsb2NrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBrbXBfaW50MzIgZ3RpZF9jb2RlID0gKGd0aWQrMSkgPDwgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9NQigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX0ZTWU5DX1BSRVBBUkUoZnR4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBrbXBfaW50MzIgcG9sbF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHdoaWxlICgocG9sbF92YWwgPSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUMzIoJihmdHgtPmxrLnBvbGwpLCBLTVBfTE9DS19GUkVFKGZ1dGV4KSwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTE9DS19CVVNZKGd0aWRfY29kZSwgZnV0ZXgpKSkgIT0gS01QX0xPQ0tfRlJFRShmdXRleCkpIHsgICAgIFwKKyAgICAgICAga21wX2ludDMyIGNvbmQgPSBLTVBfTE9DS19TVFJJUChwb2xsX3ZhbCkgJiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIWNvbmQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoIUtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQzMigmKGZ0eC0+bGsucG9sbCksIHBvbGxfdmFsLCBwb2xsX3ZhbCB8IEtNUF9MT0NLX0JVU1koMSwgZnV0ZXgpKSkgeyAgICAgIFwKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBwb2xsX3ZhbCB8PSBLTVBfTE9DS19CVVNZKDEsIGZ1dGV4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBrbXBfaW50MzIgcmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgocmMgPSBzeXNjYWxsKF9fTlJfZnV0ZXgsICYoZnR4LT5say5wb2xsKSwgRlVURVhfV0FJVCwgcG9sbF92YWwsIE5VTEwsIE5VTEwsIDApKSAhPSAwKSB7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGd0aWRfY29kZSB8PSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9GU1lOQ19BQ1FVSVJFRChmdHgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vIEZhc3QtcGF0aCB0ZXN0IGZ1dGV4IGxvY2sKKyNkZWZpbmUgS01QX1RFU1RfRlVURVhfTE9DSyhsb2NrLCBndGlkLCByYykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGttcF9mdXRleF9sb2NrX3QgKmZ0eCA9IChrbXBfZnV0ZXhfbG9ja190ICopbG9jazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMigmKGZ0eC0+bGsucG9sbCksIEtNUF9MT0NLX0ZSRUUoZnV0ZXgpLCBLTVBfTE9DS19CVVNZKGd0aWQrMSwgZnV0ZXgpIDw8IDEpKSB7ICAgIFwKKyAgICAgICAgS01QX0ZTWU5DX0FDUVVJUkVEKGZ0eCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByYyA9IFRSVUU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmMgPSBGQUxTRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vIEZhc3QtcGF0aCByZWxlYXNlIGZ1dGV4IGxvY2sKKyNkZWZpbmUgS01QX1JFTEVBU0VfRlVURVhfTE9DSyhsb2NrLCBndGlkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAga21wX2Z1dGV4X2xvY2tfdCAqZnR4ID0gKGttcF9mdXRleF9sb2NrX3QgKilsb2NrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9NQigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfRlNZTkNfUkVMRUFTSU5HKGZ0eCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAga21wX2ludDMyIHBvbGxfdmFsID0gS01QX1hDSEdfRklYRUQzMigmKGZ0eC0+bGsucG9sbCksIEtNUF9MT0NLX0ZSRUUoZnV0ZXgpKTsgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChLTVBfTE9DS19TVFJJUChwb2xsX3ZhbCkgJiAxKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3lzY2FsbChfX05SX2Z1dGV4LCAmKGZ0eC0+bGsucG9sbCksIEZVVEVYX1dBS0UsIEtNUF9MT0NLX0JVU1koMSwgZnV0ZXgpLCBOVUxMLCBOVUxMLCAwKTsgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9NQigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfWUlFTEQoVENSXzQoX19rbXBfbnRoKSA+IChfX2ttcF9hdmFpbF9wcm9jID8gX19rbXBfYXZhaWxfcHJvYyA6IF9fa21wX3hwcm9jKSk7ICAgICAgICAgICAgICBcCit9CisKKyNlbmRpZiAvLyBLTVBfVVNFX0ZVVEVYCisKKyNlbHNlIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKK3N0YXRpYyBrbXBfdXNlcl9sb2NrX3AKK19fa21wX2dldF9jcml0aWNhbF9zZWN0aW9uX3B0cigga21wX2NyaXRpY2FsX25hbWUgKiBjcml0LCBpZGVudF90IGNvbnN0ICogbG9jLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAga21wX3VzZXJfbG9ja19wICpsY2tfcHAgPSAoa21wX3VzZXJfbG9ja19wICopY3JpdDsKKworICAgIC8vCisgICAgLy8gQmVjYXVzZSBvZiB0aGUgZG91YmxlLWNoZWNrLCB0aGUgZm9sbG93aW5nIGxvYWQKKyAgICAvLyBkb2Vzbid0IG5lZWQgdG8gYmUgdm9sYXRpbGUuCisgICAgLy8KKyAgICBrbXBfdXNlcl9sb2NrX3AgbGNrID0gKGttcF91c2VyX2xvY2tfcClUQ1JfUFRSKCAqbGNrX3BwICk7CisKKyAgICBpZiAoIGxjayA9PSBOVUxMICkgeworICAgICAgICB2b2lkICogaWR4OworCisgICAgICAgIC8vIEFsbG9jYXRlICYgaW5pdGlhbGl6ZSB0aGUgbG9jay4KKyAgICAgICAgLy8gUmVtZW1iZXIgYWxsb2NhdGVkIGxvY2tzIGluIHRhYmxlIGluIG9yZGVyIHRvIGZyZWUgdGhlbSBpbiBfX2ttcF9jbGVhbnVwKCkKKyAgICAgICAgbGNrID0gX19rbXBfdXNlcl9sb2NrX2FsbG9jYXRlKCAmaWR4LCBndGlkLCBrbXBfbGZfY3JpdGljYWxfc2VjdGlvbiApOworICAgICAgICBfX2ttcF9pbml0X3VzZXJfbG9ja193aXRoX2NoZWNrcyggbGNrICk7CisgICAgICAgIF9fa21wX3NldF91c2VyX2xvY2tfbG9jYXRpb24oIGxjaywgbG9jICk7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICBfX2ttcF9pdHRfY3JpdGljYWxfY3JlYXRpbmcoIGxjayApOworICAgICAgICAgICAgLy8gX19rbXBfaXR0X2NyaXRpY2FsX2NyZWF0aW5nKCkgc2hvdWxkIGJlIGNhbGxlZCAqYmVmb3JlKiB0aGUgZmlyc3QgdXNhZ2Ugb2YgdW5kZXJseWluZworICAgICAgICAgICAgLy8gbG9jay4gSXQgaXMgdGhlIG9ubHkgcGxhY2Ugd2hlcmUgd2UgY2FuIGd1YXJhbnRlZSBpdC4gVGhlcmUgYXJlIGNoYW5jZXMgdGhlIGxvY2sgd2lsbAorICAgICAgICAgICAgLy8gZGVzdHJveWVkIHdpdGggbm8gdXNhZ2UsIGJ1dCBpdCBpcyBub3QgYSBwcm9ibGVtLCBiZWNhdXNlIHRoaXMgaXMgbm90IHJlYWwgZXZlbnQgc2VlbgorICAgICAgICAgICAgLy8gYnkgdXNlciBidXQgcmF0aGVyIHNldHRpbmcgbmFtZSBmb3Igb2JqZWN0IChsb2NrKS4gU2VlIG1vcmUgZGV0YWlscyBpbiBrbXBfaXR0LmguCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgICAgIC8vCisgICAgICAgIC8vIFVzZSBhIGNtcHhjaGcgaW5zdHJ1Y3Rpb24gdG8gc2xhbSB0aGUgc3RhcnQgb2YgdGhlIGNyaXRpY2FsCisgICAgICAgIC8vIHNlY3Rpb24gd2l0aCB0aGUgbG9jayBwb2ludGVyLiAgSWYgYW5vdGhlciB0aHJlYWQgYmVhdCB1cworICAgICAgICAvLyB0byBpdCwgZGVhbGxvY2F0ZSB0aGUgbG9jaywgYW5kIHVzZSB0aGUgbG9jayB0aGF0IHRoZSBvdGhlcgorICAgICAgICAvLyB0aHJlYWQgYWxsb2NhdGVkLgorICAgICAgICAvLworICAgICAgICBpbnQgc3RhdHVzID0gS01QX0NPTVBBUkVfQU5EX1NUT1JFX1BUUiggbGNrX3BwLCAwLCBsY2sgKTsKKworICAgICAgICBpZiAoIHN0YXR1cyA9PSAwICkgeworICAgICAgICAgICAgLy8gRGVhbGxvY2F0ZSB0aGUgbG9jayBhbmQgcmVsb2FkIHRoZSB2YWx1ZS4KKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICBfX2ttcF9pdHRfY3JpdGljYWxfZGVzdHJveWVkKCBsY2sgKTsKKyAgICAgICAgICAgICAgICAvLyBMZXQgSVRUIGtub3cgdGhlIGxvY2sgaXMgZGVzdHJveWVkIGFuZCB0aGUgc2FtZSBtZW1vcnkgbG9jYXRpb24gbWF5IGJlIHJldXNlZCBmb3IKKyAgICAgICAgICAgICAgICAvLyBhbm90aGVyIHB1cnBvc2UuCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgICAgICAgICAgX19rbXBfZGVzdHJveV91c2VyX2xvY2tfd2l0aF9jaGVja3MoIGxjayApOworICAgICAgICAgICAgX19rbXBfdXNlcl9sb2NrX2ZyZWUoICZpZHgsIGd0aWQsIGxjayApOworICAgICAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcClUQ1JfUFRSKCAqbGNrX3BwICk7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBsY2sgIT0gTlVMTCApOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBsY2s7Cit9CisKKyNlbmRpZiAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworCisvKiEKK0Bpbmdyb3VwIFdPUktfU0hBUklORworQHBhcmFtIGxvYyAgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uLgorQHBhcmFtIGdsb2JhbF90aWQgIGdsb2JhbCB0aHJlYWQgbnVtYmVyIC4KK0BwYXJhbSBjcml0IGlkZW50aXR5IG9mIHRoZSBjcml0aWNhbCBzZWN0aW9uLiBUaGlzIGNvdWxkIGJlIGEgcG9pbnRlciB0byBhIGxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBjcml0aWNhbCBzZWN0aW9uLCBvcgorc29tZSBvdGhlciBzdWl0YWJseSB1bmlxdWUgdmFsdWUuCisKK0VudGVyIGNvZGUgcHJvdGVjdGVkIGJ5IGEgYGNyaXRpY2FsYCBjb25zdHJ1Y3QuCitUaGlzIGZ1bmN0aW9uIGJsb2NrcyB1bnRpbCB0aGUgZXhlY3V0aW5nIHRocmVhZCBjYW4gZW50ZXIgdGhlIGNyaXRpY2FsIHNlY3Rpb24uCisqLwordm9pZAorX19rbXBjX2NyaXRpY2FsKCBpZGVudF90ICogbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wX2NyaXRpY2FsX25hbWUgKiBjcml0ICkKK3sKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworICAgIF9fa21wY19jcml0aWNhbF93aXRoX2hpbnQobG9jLCBnbG9iYWxfdGlkLCBjcml0LCBvbXBfbG9ja19oaW50X25vbmUpOworI2Vsc2UKKyAgICBLTVBfQ09VTlRfQkxPQ0soT01QX0NSSVRJQ0FMKTsKKyAgICBrbXBfdXNlcl9sb2NrX3AgbGNrOworCisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19jcml0aWNhbDogY2FsbGVkIFQjJWRcbiIsIGdsb2JhbF90aWQgKSApOworCisgICAgLy9UT0RPOiBhZGQgVEhSX09WSERfU1RBVEUKKworICAgIEtNUF9DSEVDS19VU0VSX0xPQ0tfSU5JVCgpOworCisgICAgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX3RhcyApCisgICAgICAmJiAoIHNpemVvZiggbGNrLT50YXMubGsucG9sbCApIDw9IE9NUF9DUklUSUNBTF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApY3JpdDsKKyAgICB9CisjaWYgS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KQorICAgIGVsc2UgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX2Z1dGV4ICkKKyAgICAgICYmICggc2l6ZW9mKCBsY2stPmZ1dGV4LmxrLnBvbGwgKSA8PSBPTVBfQ1JJVElDQUxfU0laRSApICkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKWNyaXQ7CisgICAgfQorI2VuZGlmCisgICAgZWxzZSB7IC8vIHRpY2tldCwgcXVldWluZyBvciBkcmRwYQorICAgICAgICBsY2sgPSBfX2ttcF9nZXRfY3JpdGljYWxfc2VjdGlvbl9wdHIoIGNyaXQsIGxvYywgZ2xvYmFsX3RpZCApOworICAgIH0KKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgX19rbXBfcHVzaF9zeW5jKCBnbG9iYWxfdGlkLCBjdF9jcml0aWNhbCwgbG9jLCBsY2sgKTsKKworICAgIC8qIHNpbmNlIHRoZSBjcml0aWNhbCBkaXJlY3RpdmUgYmluZHMgdG8gYWxsIHRocmVhZHMsIG5vdCBqdXN0CisgICAgICogdGhlIGN1cnJlbnQgdGVhbSB3ZSBoYXZlIHRvIGNoZWNrIHRoaXMgZXZlbiBpZiB3ZSBhcmUgaW4gYQorICAgICAqIHNlcmlhbGl6ZWQgdGVhbSAqLworICAgIC8qIGFsc28sIGV2ZW4gaWYgd2UgYXJlIHRoZSB1YmVyIHRocmVhZCwgd2Ugc3RpbGwgaGF2ZSB0byBjb25kdWN0IHRoZSBsb2NrLAorICAgICAqIGFzIHdlIGhhdmUgdG8gY29udGVuZCB3aXRoIHNpYmxpbmcgdGhyZWFkcyAqLworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9jcml0aWNhbF9hY3F1aXJpbmcoIGxjayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICAvLyBWYWx1ZSBvZiAnY3JpdCcgc2hvdWxkIGJlIGdvb2QgZm9yIHVzaW5nIGFzIGEgY3JpdGljYWxfaWQgb2YgdGhlIGNyaXRpY2FsIHNlY3Rpb24gZGlyZWN0aXZlLgorICAgIF9fa21wX2FjcXVpcmVfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKCBsY2ssIGdsb2JhbF90aWQgKTsKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfY3JpdGljYWxfYWNxdWlyZWQoIGxjayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIEtBX1RSQUNFKCAxNSwgKCJfX2ttcGNfY3JpdGljYWw6IGRvbmUgVCMlZFxuIiwgZ2xvYmFsX3RpZCApKTsKKyNlbmRpZiAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworfQorCisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKworLy8gQ29udmVydHMgdGhlIGdpdmVuIGhpbnQgdG8gYW4gaW50ZXJuYWwgbG9jayBpbXBsZW1lbnRhdGlvbgorc3RhdGljIF9fZm9yY2VpbmxpbmUga21wX2R5bmFfbG9ja3NlcV90CitfX2ttcF9tYXBfaGludF90b19sb2NrKHVpbnRwdHJfdCBoaW50KQoreworI2lmIEtNUF9VU0VfVFNYCisjIGRlZmluZSBLTVBfVFNYX0xPQ0soc2VxKSBsb2Nrc2VxXyMjc2VxCisjZWxzZQorIyBkZWZpbmUgS01QX1RTWF9MT0NLKHNlcSkgX19rbXBfdXNlcl9sb2NrX3NlcQorI2VuZGlmCisgICAgLy8gSGludHMgdGhhdCBkbyBub3QgcmVxdWlyZSBmdXJ0aGVyIGxvZ2ljCisgICAgaWYgKGhpbnQgJiBrbXBfbG9ja19oaW50X2hsZSkKKyAgICAgICAgcmV0dXJuIEtNUF9UU1hfTE9DSyhobGUpOworICAgIGlmIChoaW50ICYga21wX2xvY2tfaGludF9ydG0pCisgICAgICAgIHJldHVybiAoX19rbXBfY3B1aW5mby5ydG0pPyBLTVBfVFNYX0xPQ0socnRtKTogX19rbXBfdXNlcl9sb2NrX3NlcTsKKyAgICBpZiAoaGludCAmIGttcF9sb2NrX2hpbnRfYWRhcHRpdmUpCisgICAgICAgIHJldHVybiAoX19rbXBfY3B1aW5mby5ydG0pPyBLTVBfVFNYX0xPQ0soYWRhcHRpdmUpOiBfX2ttcF91c2VyX2xvY2tfc2VxOworCisgICAgLy8gUnVsZSBvdXQgY29uZmxpY3RpbmcgaGludHMgZmlyc3QgYnkgcmV0dXJuaW5nIHRoZSBkZWZhdWx0IGxvY2sKKyAgICBpZiAoKGhpbnQgJiBvbXBfbG9ja19oaW50X2NvbnRlbmRlZCkgJiYgKGhpbnQgJiBvbXBfbG9ja19oaW50X3VuY29udGVuZGVkKSkKKyAgICAgICAgcmV0dXJuIF9fa21wX3VzZXJfbG9ja19zZXE7CisgICAgaWYgKChoaW50ICYgb21wX2xvY2tfaGludF9zcGVjdWxhdGl2ZSkgJiYgKGhpbnQgJiBvbXBfbG9ja19oaW50X25vbnNwZWN1bGF0aXZlKSkKKyAgICAgICAgcmV0dXJuIF9fa21wX3VzZXJfbG9ja19zZXE7CisKKyAgICAvLyBEbyBub3QgZXZlbiBjb25zaWRlciBzcGVjdWxhdGlvbiB3aGVuIGl0IGFwcGVhcnMgdG8gYmUgY29udGVuZGVkCisgICAgaWYgKGhpbnQgJiBvbXBfbG9ja19oaW50X2NvbnRlbmRlZCkKKyAgICAgICAgcmV0dXJuIGxvY2tzZXFfcXVldWluZzsKKworICAgIC8vIFVuY29udGVuZGVkIGxvY2sgd2l0aG91dCBzcGVjdWxhdGlvbgorICAgIGlmICgoaGludCAmIG9tcF9sb2NrX2hpbnRfdW5jb250ZW5kZWQpICYmICEoaGludCAmIG9tcF9sb2NrX2hpbnRfc3BlY3VsYXRpdmUpKQorICAgICAgICByZXR1cm4gbG9ja3NlcV90YXM7CisKKyAgICAvLyBITEUgbG9jayBmb3Igc3BlY3VsYXRpb24KKyAgICBpZiAoaGludCAmIG9tcF9sb2NrX2hpbnRfc3BlY3VsYXRpdmUpCisgICAgICAgIHJldHVybiBLTVBfVFNYX0xPQ0soaGxlKTsKKworICAgIHJldHVybiBfX2ttcF91c2VyX2xvY2tfc2VxOworfQorCisvKiEKK0Bpbmdyb3VwIFdPUktfU0hBUklORworQHBhcmFtIGxvYyAgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uLgorQHBhcmFtIGdsb2JhbF90aWQgIGdsb2JhbCB0aHJlYWQgbnVtYmVyLgorQHBhcmFtIGNyaXQgaWRlbnRpdHkgb2YgdGhlIGNyaXRpY2FsIHNlY3Rpb24uIFRoaXMgY291bGQgYmUgYSBwb2ludGVyIHRvIGEgbG9jayBhc3NvY2lhdGVkIHdpdGggdGhlIGNyaXRpY2FsIHNlY3Rpb24sCitvciBzb21lIG90aGVyIHN1aXRhYmx5IHVuaXF1ZSB2YWx1ZS4KK0BwYXJhbSBoaW50IHRoZSBsb2NrIGhpbnQuCisKK0VudGVyIGNvZGUgcHJvdGVjdGVkIGJ5IGEgYGNyaXRpY2FsYCBjb25zdHJ1Y3Qgd2l0aCBhIGhpbnQuIFRoZSBoaW50IHZhbHVlIGlzIHVzZWQgdG8gc3VnZ2VzdCBhIGxvY2sgaW1wbGVtZW50YXRpb24uCitUaGlzIGZ1bmN0aW9uIGJsb2NrcyB1bnRpbCB0aGUgZXhlY3V0aW5nIHRocmVhZCBjYW4gZW50ZXIgdGhlIGNyaXRpY2FsIHNlY3Rpb24gdW5sZXNzIHRoZSBoaW50IHN1Z2dlc3RzIHVzZSBvZgorc3BlY3VsYXRpdmUgZXhlY3V0aW9uIGFuZCB0aGUgaGFyZHdhcmUgc3VwcG9ydHMgaXQuCisqLwordm9pZAorX19rbXBjX2NyaXRpY2FsX3dpdGhfaGludCggaWRlbnRfdCAqIGxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcF9jcml0aWNhbF9uYW1lICogY3JpdCwgdWludHB0cl90IGhpbnQgKQoreworICAgIEtNUF9DT1VOVF9CTE9DSyhPTVBfQ1JJVElDQUwpOworICAgIGttcF91c2VyX2xvY2tfcCBsY2s7CisKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX2NyaXRpY2FsOiBjYWxsZWQgVCMlZFxuIiwgZ2xvYmFsX3RpZCApICk7CisKKyAgICBrbXBfZHluYV9sb2NrX3QgKmxrID0gKGttcF9keW5hX2xvY2tfdCAqKWNyaXQ7CisgICAgLy8gQ2hlY2sgaWYgaXQgaXMgaW5pdGlhbGl6ZWQuCisgICAgaWYgKCpsayA9PSAwKSB7CisgICAgICAgIGttcF9keW5hX2xvY2tzZXFfdCBsY2tzZXEgPSBfX2ttcF9tYXBfaGludF90b19sb2NrKGhpbnQpOworICAgICAgICBpZiAoS01QX0lTX0RfTE9DSyhsY2tzZXEpKSB7CisgICAgICAgICAgICBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIoKHZvbGF0aWxlIGttcF9pbnQzMiAqKWNyaXQsIDAsIEtNUF9HRVRfRF9UQUcobGNrc2VxKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfX2ttcF9pbml0X2luZGlyZWN0X2NzcHRyKGNyaXQsIGxvYywgZ2xvYmFsX3RpZCwgS01QX0dFVF9JX1RBRyhsY2tzZXEpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBCcmFuY2ggZm9yIGFjY2Vzc2luZyB0aGUgYWN0dWFsIGxvY2sgb2JqZWN0IGFuZCBzZXQgb3BlcmF0aW9uLiBUaGlzIGJyYW5jaGluZyBpcyBpbmV2aXRhYmxlIHNpbmNlCisgICAgLy8gdGhpcyBsb2NrIGluaXRpYWxpemF0aW9uIGRvZXMgbm90IGZvbGxvdyB0aGUgbm9ybWFsIGRpc3BhdGNoIHBhdGggKGxvY2sgdGFibGUgaXMgbm90IHVzZWQpLgorICAgIGlmIChLTVBfRVhUUkFDVF9EX1RBRyhsaykgIT0gMCkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKWxrOworICAgICAgICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICAgICAgICBfX2ttcF9wdXNoX3N5bmMoZ2xvYmFsX3RpZCwgY3RfY3JpdGljYWwsIGxvYywgbGNrLCBfX2ttcF9tYXBfaGludF90b19sb2NrKGhpbnQpKTsKKyAgICAgICAgfQorIyBpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIF9fa21wX2l0dF9jcml0aWNhbF9hY3F1aXJpbmcobGNrKTsKKyMgZW5kaWYKKyMgaWYgS01QX1VTRV9JTkxJTkVEX1RBUworICAgICAgICBpZiAoX19rbXBfdXNlcl9sb2NrX3NlcSA9PSBsb2Nrc2VxX3RhcyAmJiAhX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICAgICAgICBLTVBfQUNRVUlSRV9UQVNfTE9DSyhsY2ssIGdsb2JhbF90aWQpOworICAgICAgICB9IGVsc2UKKyMgZWxpZiBLTVBfVVNFX0lOTElORURfRlVURVgKKyAgICAgICAgaWYgKF9fa21wX3VzZXJfbG9ja19zZXEgPT0gbG9ja3NlcV9mdXRleCAmJiAhX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICAgICAgICBLTVBfQUNRVUlSRV9GVVRFWF9MT0NLKGxjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgIH0gZWxzZQorIyBlbmRpZgorICAgICAgICB7CisgICAgICAgICAgICBLTVBfRF9MT0NLX0ZVTkMobGssIHNldCkobGssIGdsb2JhbF90aWQpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAga21wX2luZGlyZWN0X2xvY2tfdCAqaWxrID0gKigoa21wX2luZGlyZWN0X2xvY2tfdCAqKilsayk7CisgICAgICAgIGxjayA9IGlsay0+bG9jazsKKyAgICAgICAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgICAgICAgX19rbXBfcHVzaF9zeW5jKGdsb2JhbF90aWQsIGN0X2NyaXRpY2FsLCBsb2MsIGxjaywgX19rbXBfbWFwX2hpbnRfdG9fbG9jayhoaW50KSk7CisgICAgICAgIH0KKyMgaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICBfX2ttcF9pdHRfY3JpdGljYWxfYWNxdWlyaW5nKGxjayk7CisjIGVuZGlmCisgICAgICAgIEtNUF9JX0xPQ0tfRlVOQyhpbGssIHNldCkobGNrLCBnbG9iYWxfdGlkKTsKKyAgICB9CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2NyaXRpY2FsX2FjcXVpcmVkKCBsY2sgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICBLQV9UUkFDRSggMTUsICgiX19rbXBjX2NyaXRpY2FsOiBkb25lIFQjJWRcbiIsIGdsb2JhbF90aWQgKSk7Cit9IC8vIF9fa21wY19jcml0aWNhbF93aXRoX2hpbnQKKworI2VuZGlmIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKy8qIQorQGluZ3JvdXAgV09SS19TSEFSSU5HCitAcGFyYW0gbG9jICBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24uCitAcGFyYW0gZ2xvYmFsX3RpZCAgZ2xvYmFsIHRocmVhZCBudW1iZXIgLgorQHBhcmFtIGNyaXQgaWRlbnRpdHkgb2YgdGhlIGNyaXRpY2FsIHNlY3Rpb24uIFRoaXMgY291bGQgYmUgYSBwb2ludGVyIHRvIGEgbG9jayBhc3NvY2lhdGVkIHdpdGggdGhlIGNyaXRpY2FsIHNlY3Rpb24sIG9yCitzb21lIG90aGVyIHN1aXRhYmx5IHVuaXF1ZSB2YWx1ZS4KKworTGVhdmUgYSBjcml0aWNhbCBzZWN0aW9uLCByZWxlYXNpbmcgYW55IGxvY2sgdGhhdCB3YXMgaGVsZCBkdXJpbmcgaXRzIGV4ZWN1dGlvbi4KKyovCit2b2lkCitfX2ttcGNfZW5kX2NyaXRpY2FsKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcF9jcml0aWNhbF9uYW1lICpjcml0KQoreworICAgIGttcF91c2VyX2xvY2tfcCBsY2s7CisKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX2VuZF9jcml0aWNhbDogY2FsbGVkIFQjJWRcbiIsIGdsb2JhbF90aWQgKSk7CisKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworICAgIGlmIChLTVBfSVNfRF9MT0NLKF9fa21wX3VzZXJfbG9ja19zZXEpKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApY3JpdDsKKyAgICAgICAgS01QX0FTU0VSVChsY2sgIT0gTlVMTCk7CisgICAgICAgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICAgICAgICAgIF9fa21wX3BvcF9zeW5jKGdsb2JhbF90aWQsIGN0X2NyaXRpY2FsLCBsb2MpOworICAgICAgICB9CisjIGlmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgX19rbXBfaXR0X2NyaXRpY2FsX3JlbGVhc2luZyggbGNrICk7CisjIGVuZGlmCisjIGlmIEtNUF9VU0VfSU5MSU5FRF9UQVMKKyAgICAgICAgaWYgKF9fa21wX3VzZXJfbG9ja19zZXEgPT0gbG9ja3NlcV90YXMgJiYgIV9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgICAgICAgS01QX1JFTEVBU0VfVEFTX0xPQ0sobGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgfSBlbHNlCisjIGVsaWYgS01QX1VTRV9JTkxJTkVEX0ZVVEVYCisgICAgICAgIGlmIChfX2ttcF91c2VyX2xvY2tfc2VxID09IGxvY2tzZXFfZnV0ZXggJiYgIV9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgICAgICAgS01QX1JFTEVBU0VfRlVURVhfTE9DSyhsY2ssIGdsb2JhbF90aWQpOworICAgICAgICB9IGVsc2UKKyMgZW5kaWYKKyAgICAgICAgeworICAgICAgICAgICAgS01QX0RfTE9DS19GVU5DKGxjaywgdW5zZXQpKChrbXBfZHluYV9sb2NrX3QgKilsY2ssIGdsb2JhbF90aWQpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAga21wX2luZGlyZWN0X2xvY2tfdCAqaWxrID0gKGttcF9pbmRpcmVjdF9sb2NrX3QgKilUQ1JfUFRSKCooKGttcF9pbmRpcmVjdF9sb2NrX3QgKiopY3JpdCkpOworICAgICAgICBLTVBfQVNTRVJUKGlsayAhPSBOVUxMKTsKKyAgICAgICAgbGNrID0gaWxrLT5sb2NrOworICAgICAgICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICAgICAgICBfX2ttcF9wb3Bfc3luYyhnbG9iYWxfdGlkLCBjdF9jcml0aWNhbCwgbG9jKTsKKyAgICAgICAgfQorIyBpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIF9fa21wX2l0dF9jcml0aWNhbF9yZWxlYXNpbmcoIGxjayApOworIyBlbmRpZgorICAgICAgICBLTVBfSV9MT0NLX0ZVTkMoaWxrLCB1bnNldCkobGNrLCBnbG9iYWxfdGlkKTsKKyAgICB9CisKKyNlbHNlIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyAgICBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfdGFzICkKKyAgICAgICYmICggc2l6ZW9mKCBsY2stPnRhcy5say5wb2xsICkgPD0gT01QX0NSSVRJQ0FMX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCljcml0OworICAgIH0KKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpCisgICAgZWxzZSBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfZnV0ZXggKQorICAgICAgJiYgKCBzaXplb2YoIGxjay0+ZnV0ZXgubGsucG9sbCApIDw9IE9NUF9DUklUSUNBTF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApY3JpdDsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlIHsgLy8gdGlja2V0LCBxdWV1aW5nIG9yIGRyZHBhCisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApIFRDUl9QVFIoKigoa21wX3VzZXJfbG9ja19wICopY3JpdCkpOworICAgIH0KKworICAgIEtNUF9BU1NFUlQobGNrICE9IE5VTEwpOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wb3Bfc3luYyggZ2xvYmFsX3RpZCwgY3RfY3JpdGljYWwsIGxvYyApOworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9jcml0aWNhbF9yZWxlYXNpbmcoIGxjayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICAvLyBWYWx1ZSBvZiAnY3JpdCcgc2hvdWxkIGJlIGdvb2QgZm9yIHVzaW5nIGFzIGEgY3JpdGljYWxfaWQgb2YgdGhlIGNyaXRpY2FsIHNlY3Rpb24gZGlyZWN0aXZlLgorICAgIF9fa21wX3JlbGVhc2VfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKCBsY2ssIGdsb2JhbF90aWQgKTsKKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX0JMQU1FCisgICAgaWYgKG9tcHRfZW5hYmxlZCAmJgorICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcmVsZWFzZV9jcml0aWNhbCkpIHsKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3JlbGVhc2VfY3JpdGljYWwpKAorICAgICAgICAgICAgKHVpbnQ2NF90KSBsY2spOworICAgIH0KKyNlbmRpZgorCisjZW5kaWYgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKKworICAgIEtBX1RSQUNFKCAxNSwgKCJfX2ttcGNfZW5kX2NyaXRpY2FsOiBkb25lIFQjJWRcbiIsIGdsb2JhbF90aWQgKSk7Cit9CisKKy8qIQorQGluZ3JvdXAgU1lOQ0hST05JWkFUSU9OCitAcGFyYW0gbG9jIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGdsb2JhbF90aWQgdGhyZWFkIGlkLgorQHJldHVybiBvbmUgaWYgdGhlIHRocmVhZCBzaG91bGQgZXhlY3V0ZSB0aGUgbWFzdGVyIGJsb2NrLCB6ZXJvIG90aGVyd2lzZQorCitTdGFydCBleGVjdXRpb24gb2YgYSBjb21iaW5lZCBiYXJyaWVyIGFuZCBtYXN0ZXIuIFRoZSBiYXJyaWVyIGlzIGV4ZWN1dGVkIGluc2lkZSB0aGlzIGZ1bmN0aW9uLgorKi8KK2ttcF9pbnQzMgorX19rbXBjX2JhcnJpZXJfbWFzdGVyKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQpCit7CisgICAgaW50IHN0YXR1czsKKworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfYmFycmllcl9tYXN0ZXI6IGNhbGxlZCBUIyVkXG4iLCBnbG9iYWxfdGlkICkgKTsKKworICAgIGlmICghIFRDUl80KF9fa21wX2luaXRfcGFyYWxsZWwpKQorICAgICAgICBfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplKCk7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApCisgICAgICAgIF9fa21wX2NoZWNrX2JhcnJpZXIoIGdsb2JhbF90aWQsIGN0X2JhcnJpZXIsIGxvYyApOworCisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBfX2ttcF90aHJlYWRzW2dsb2JhbF90aWRdLT50aC50aF9pZGVudCA9IGxvYzsKKyNlbmRpZgorICAgIHN0YXR1cyA9IF9fa21wX2JhcnJpZXIoIGJzX3BsYWluX2JhcnJpZXIsIGdsb2JhbF90aWQsIFRSVUUsIDAsIE5VTEwsIE5VTEwgKTsKKworICAgIHJldHVybiAoc3RhdHVzICE9IDApID8gMCA6IDE7Cit9CisKKy8qIQorQGluZ3JvdXAgU1lOQ0hST05JWkFUSU9OCitAcGFyYW0gbG9jIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGdsb2JhbF90aWQgdGhyZWFkIGlkLgorCitDb21wbGV0ZSB0aGUgZXhlY3V0aW9uIG9mIGEgY29tYmluZWQgYmFycmllciBhbmQgbWFzdGVyLiBUaGlzIGZ1bmN0aW9uIHNob3VsZAorb25seSBiZSBjYWxsZWQgYXQgdGhlIGNvbXBsZXRpb24gb2YgdGhlIDx0dD5tYXN0ZXI8L3R0PiBjb2RlLiBPdGhlciB0aHJlYWRzIHdpbGwKK3N0aWxsIGJlIHdhaXRpbmcgYXQgdGhlIGJhcnJpZXIgYW5kIHRoaXMgY2FsbCByZWxlYXNlcyB0aGVtLgorKi8KK3ZvaWQKK19fa21wY19lbmRfYmFycmllcl9tYXN0ZXIoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCkKK3sKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX2VuZF9iYXJyaWVyX21hc3RlcjogY2FsbGVkIFQjJWRcbiIsIGdsb2JhbF90aWQgKSk7CisKKyAgICBfX2ttcF9lbmRfc3BsaXRfYmFycmllciAoIGJzX3BsYWluX2JhcnJpZXIsIGdsb2JhbF90aWQgKTsKK30KKworLyohCitAaW5ncm91cCBTWU5DSFJPTklaQVRJT04KK0BwYXJhbSBsb2Mgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCitAcGFyYW0gZ2xvYmFsX3RpZCB0aHJlYWQgaWQuCitAcmV0dXJuIG9uZSBpZiB0aGUgdGhyZWFkIHNob3VsZCBleGVjdXRlIHRoZSBtYXN0ZXIgYmxvY2ssIHplcm8gb3RoZXJ3aXNlCisKK1N0YXJ0IGV4ZWN1dGlvbiBvZiBhIGNvbWJpbmVkIGJhcnJpZXIgYW5kIG1hc3Rlcihub3dhaXQpIGNvbnN0cnVjdC4KK1RoZSBiYXJyaWVyIGlzIGV4ZWN1dGVkIGluc2lkZSB0aGlzIGZ1bmN0aW9uLgorVGhlcmUgaXMgbm8gZXF1aXZhbGVudCAiZW5kIiBmdW5jdGlvbiwgc2luY2UgdGhlCisqLwora21wX2ludDMyCitfX2ttcGNfYmFycmllcl9tYXN0ZXJfbm93YWl0KCBpZGVudF90ICogbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApCit7CisgICAga21wX2ludDMyIHJldDsKKworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfYmFycmllcl9tYXN0ZXJfbm93YWl0OiBjYWxsZWQgVCMlZFxuIiwgZ2xvYmFsX3RpZCApKTsKKworICAgIGlmICghIFRDUl80KF9fa21wX2luaXRfcGFyYWxsZWwpKQorICAgICAgICBfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplKCk7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgaWYgKCBsb2MgPT0gMCApIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBDb25zdHJ1Y3RJZGVudEludmFsaWQgKTsgLy8gPz8/IFdoYXQgZG9lcyBpdCBtZWFuIGZvciB0aGUgdXNlcj8KKyAgICAgICAgfQorICAgICAgICBfX2ttcF9jaGVja19iYXJyaWVyKCBnbG9iYWxfdGlkLCBjdF9iYXJyaWVyLCBsb2MgKTsKKyAgICB9CisKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIF9fa21wX3RocmVhZHNbZ2xvYmFsX3RpZF0tPnRoLnRoX2lkZW50ID0gbG9jOworI2VuZGlmCisgICAgX19rbXBfYmFycmllciggYnNfcGxhaW5fYmFycmllciwgZ2xvYmFsX3RpZCwgRkFMU0UsIDAsIE5VTEwsIE5VTEwgKTsKKworICAgIHJldCA9IF9fa21wY19tYXN0ZXIgKGxvYywgZ2xvYmFsX3RpZCk7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgLyogIHRoZXJlJ3Mgbm8gX19rbXBjX2VuZF9tYXN0ZXIgY2FsbGVkOyBzbyB0aGUgKHN0YXRzKSAqLworICAgICAgICAvKiAgYWN0aW9ucyBvZiBfX2ttcGNfZW5kX21hc3RlciBhcmUgZG9uZSBoZXJlICAgICAgICAgICovCisKKyAgICAgICAgaWYgKCBnbG9iYWxfdGlkIDwgMCApIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBUaHJlYWRJZGVudEludmFsaWQgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmV0KSB7CisgICAgICAgICAgICAvKiBvbmx5IG9uZSB0aHJlYWQgc2hvdWxkIGRvIHRoZSBwb3Agc2luY2Ugb25seSAqLworICAgICAgICAgICAgLyogb25lIGRpZCB0aGUgcHVzaCAoc2VlIF9fa21wY19tYXN0ZXIoKSkgICAgICAgKi8KKworICAgICAgICAgICAgX19rbXBfcG9wX3N5bmMoIGdsb2JhbF90aWQsIGN0X21hc3RlciwgbG9jICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKHJldCk7Cit9CisKKy8qIFRoZSBCQVJSSUVSIGZvciBhIFNJTkdMRSBwcm9jZXNzIHNlY3Rpb24gaXMgYWx3YXlzIGV4cGxpY2l0ICAgKi8KKy8qIQorQGluZ3JvdXAgV09SS19TSEFSSU5HCitAcGFyYW0gbG9jICBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KK0BwYXJhbSBnbG9iYWxfdGlkICBnbG9iYWwgdGhyZWFkIG51bWJlcgorQHJldHVybiBPbmUgaWYgdGhpcyB0aHJlYWQgc2hvdWxkIGV4ZWN1dGUgdGhlIHNpbmdsZSBjb25zdHJ1Y3QsIHplcm8gb3RoZXJ3aXNlLgorCitUZXN0IHdoZXRoZXIgdG8gZXhlY3V0ZSBhIDx0dD5zaW5nbGU8L3R0PiBjb25zdHJ1Y3QuCitUaGVyZSBhcmUgbm8gaW1wbGljaXQgYmFycmllcnMgaW4gdGhlIHR3byAic2luZ2xlIiBjYWxscywgcmF0aGVyIHRoZSBjb21waWxlciBzaG91bGQKK2ludHJvZHVjZSBhbiBleHBsaWNpdCBiYXJyaWVyIGlmIGl0IGlzIHJlcXVpcmVkLgorKi8KKwora21wX2ludDMyCitfX2ttcGNfc2luZ2xlKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQpCit7CisgICAgS01QX0NPVU5UX0JMT0NLKE9NUF9TSU5HTEUpOworICAgIGttcF9pbnQzMiByYyA9IF9fa21wX2VudGVyX3NpbmdsZSggZ2xvYmFsX3RpZCwgbG9jLCBUUlVFICk7CisgICAgaWYocmMgPT0gVFJVRSkgeworICAgICAgICBLTVBfU1RBUlRfRVhQTElDSVRfVElNRVIoT01QX3NpbmdsZSk7CisgICAgfQorCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgICBrbXBfaW5mb190ICp0aGlzX3RociAgICAgICAgPSBfX2ttcF90aHJlYWRzWyBnbG9iYWxfdGlkIF07CisgICAga21wX3RlYW1fdCAqdGVhbSAgICAgICAgICAgID0gdGhpc190aHIgLT4gdGgudGhfdGVhbTsKKyAgICBpbnQgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZCggZ2xvYmFsX3RpZCApOworCisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICBpZiAocmMpIHsKKyAgICAgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfc2luZ2xlX2luX2Jsb2NrX2JlZ2luKSkgeworICAgICAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9zaW5nbGVfaW5fYmxvY2tfYmVnaW4pKAorICAgICAgICAgICAgICAgICAgICB0ZWFtLT50Lm9tcHRfdGVhbV9pbmZvLnBhcmFsbGVsX2lkLAorICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLm9tcHRfdGFza19pbmZvLnRhc2tfaWQsCisgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQub21wdF90ZWFtX2luZm8ubWljcm90YXNrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfc2luZ2xlX290aGVyc19iZWdpbikpIHsKKyAgICAgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfc2luZ2xlX290aGVyc19iZWdpbikoCisgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQub21wdF90ZWFtX2luZm8ucGFyYWxsZWxfaWQsCisgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0ub21wdF90YXNrX2luZm8udGFza19pZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzX3Roci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfd2FpdF9zaW5nbGU7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIHJldHVybiByYzsKK30KKworLyohCitAaW5ncm91cCBXT1JLX1NIQVJJTkcKK0BwYXJhbSBsb2MgIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGdsb2JhbF90aWQgIGdsb2JhbCB0aHJlYWQgbnVtYmVyCisKK01hcmsgdGhlIGVuZCBvZiBhIDx0dD5zaW5nbGU8L3R0PiBjb25zdHJ1Y3QuICBUaGlzIGZ1bmN0aW9uIHNob3VsZAorb25seSBiZSBjYWxsZWQgYnkgdGhlIHRocmVhZCB0aGF0IGV4ZWN1dGVkIHRoZSBibG9jayBvZiBjb2RlIHByb3RlY3RlZAorYnkgdGhlIGBzaW5nbGVgIGNvbnN0cnVjdC4KKyovCit2b2lkCitfX2ttcGNfZW5kX3NpbmdsZShpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkKQoreworICAgIF9fa21wX2V4aXRfc2luZ2xlKCBnbG9iYWxfdGlkICk7CisgICAgS01QX1NUT1BfRVhQTElDSVRfVElNRVIoT01QX3NpbmdsZSk7CisKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRQorICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyICAgICAgICA9IF9fa21wX3RocmVhZHNbIGdsb2JhbF90aWQgXTsKKyAgICBrbXBfdGVhbV90ICp0ZWFtICAgICAgICAgICAgPSB0aGlzX3RociAtPiB0aC50aF90ZWFtOworICAgIGludCB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKCBnbG9iYWxfdGlkICk7CisKKyAgICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9zaW5nbGVfaW5fYmxvY2tfZW5kKSkgeworICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfc2luZ2xlX2luX2Jsb2NrX2VuZCkoCisgICAgICAgICAgICB0ZWFtLT50Lm9tcHRfdGVhbV9pbmZvLnBhcmFsbGVsX2lkLAorICAgICAgICAgICAgdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS5vbXB0X3Rhc2tfaW5mby50YXNrX2lkKTsKKyAgICB9CisjZW5kaWYKK30KKworLyohCitAaW5ncm91cCBXT1JLX1NIQVJJTkcKK0BwYXJhbSBsb2MgU291cmNlIGxvY2F0aW9uCitAcGFyYW0gZ2xvYmFsX3RpZCBHbG9iYWwgdGhyZWFkIGlkCisKK01hcmsgdGhlIGVuZCBvZiBhIHN0YXRpY2FsbHkgc2NoZWR1bGVkIGxvb3AuCisqLwordm9pZAorX19rbXBjX2Zvcl9zdGF0aWNfZmluaSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApCit7CisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wY19mb3Jfc3RhdGljX2ZpbmkgY2FsbGVkIFQjJWRcbiIsIGdsb2JhbF90aWQpKTsKKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgICAgaWYgKG9tcHRfZW5hYmxlZCAmJgorICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfbG9vcF9lbmQpKSB7CisgICAgICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyID0gX19rbXBfdGhyZWFkc1sgZ2xvYmFsX3RpZCBdOworICAgICAgICBrbXBfdGVhbV90ICp0ZWFtICAgICA9IHRoaXNfdGhyIC0+IHRoLnRoX3RlYW07CisgICAgICAgIGludCB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKCBnbG9iYWxfdGlkICk7CisKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2xvb3BfZW5kKSgKKyAgICAgICAgICAgIHRlYW0tPnQub21wdF90ZWFtX2luZm8ucGFyYWxsZWxfaWQsCisgICAgICAgICAgICB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLm9tcHRfdGFza19pbmZvLnRhc2tfaWQpOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICBfX2ttcF9wb3Bfd29ya3NoYXJlKCBnbG9iYWxfdGlkLCBjdF9wZG8sIGxvYyApOworfQorCisvKgorICogVXNlciByb3V0aW5lcyB3aGljaCB0YWtlIEMtc3R5bGUgYXJndW1lbnRzIChjYWxsIGJ5IHZhbHVlKQorICogZGlmZmVyZW50IGZyb20gdGhlIEZvcnRyYW4gZXF1aXZhbGVudCByb3V0aW5lcworICovCisKK3ZvaWQKK29tcGNfc2V0X251bV90aHJlYWRzKCBpbnQgYXJnICkKK3sKKy8vICEhISEhIFRPRE86IGNoZWNrIHRoZSBwZXItdGFzayBiaW5kaW5nCisgICAgX19rbXBfc2V0X251bV90aHJlYWRzKCBhcmcsIF9fa21wX2VudHJ5X2d0aWQoKSApOworfQorCit2b2lkCitvbXBjX3NldF9keW5hbWljKCBpbnQgZmxhZyApCit7CisgICAga21wX2luZm9fdCAqdGhyZWFkOworCisgICAgLyogRm9yIHRoZSB0aHJlYWQtcHJpdmF0ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJvbHMgKi8KKyAgICB0aHJlYWQgPSBfX2ttcF9lbnRyeV90aHJlYWQoKTsKKworICAgIF9fa21wX3NhdmVfaW50ZXJuYWxfY29udHJvbHMoIHRocmVhZCApOworCisgICAgc2V0X19keW5hbWljKCB0aHJlYWQsIGZsYWcgPyBUUlVFIDogRkFMU0UgKTsKK30KKwordm9pZAorb21wY19zZXRfbmVzdGVkKCBpbnQgZmxhZyApCit7CisgICAga21wX2luZm9fdCAqdGhyZWFkOworCisgICAgLyogRm9yIHRoZSB0aHJlYWQtcHJpdmF0ZSBpbnRlcm5hbCBjb250cm9scyBpbXBsZW1lbnRhdGlvbiAqLworICAgIHRocmVhZCA9IF9fa21wX2VudHJ5X3RocmVhZCgpOworCisgICAgX19rbXBfc2F2ZV9pbnRlcm5hbF9jb250cm9scyggdGhyZWFkICk7CisKKyAgICBzZXRfX25lc3RlZCggdGhyZWFkLCBmbGFnID8gVFJVRSA6IEZBTFNFICk7Cit9CisKK3ZvaWQKK29tcGNfc2V0X21heF9hY3RpdmVfbGV2ZWxzKCBpbnQgbWF4X2FjdGl2ZV9sZXZlbHMgKQoreworICAgIC8qIFRPIERPICovCisgICAgLyogd2Ugd2FudCBwZXItdGFzayBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGludGVybmFsIGNvbnRyb2wgKi8KKworICAgIC8qIEZvciB0aGUgcGVyLXRocmVhZCBpbnRlcm5hbCBjb250cm9scyBpbXBsZW1lbnRhdGlvbiAqLworICAgIF9fa21wX3NldF9tYXhfYWN0aXZlX2xldmVscyggX19rbXBfZW50cnlfZ3RpZCgpLCBtYXhfYWN0aXZlX2xldmVscyApOworfQorCit2b2lkCitvbXBjX3NldF9zY2hlZHVsZSggb21wX3NjaGVkX3Qga2luZCwgaW50IG1vZGlmaWVyICkKK3sKKy8vICEhISEhIFRPRE86IGNoZWNrIHRoZSBwZXItdGFzayBiaW5kaW5nCisgICAgX19rbXBfc2V0X3NjaGVkdWxlKCBfX2ttcF9lbnRyeV9ndGlkKCksICgga21wX3NjaGVkX3QgKSBraW5kLCBtb2RpZmllciApOworfQorCitpbnQKK29tcGNfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0oIGludCBsZXZlbCApCit7CisgICAgcmV0dXJuIF9fa21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtKCBfX2ttcF9lbnRyeV9ndGlkKCksIGxldmVsICk7Cit9CisKK2ludAorb21wY19nZXRfdGVhbV9zaXplKCBpbnQgbGV2ZWwgKQoreworICAgIHJldHVybiBfX2ttcF9nZXRfdGVhbV9zaXplKCBfX2ttcF9lbnRyeV9ndGlkKCksIGxldmVsICk7Cit9CisKK3ZvaWQKK2ttcGNfc2V0X3N0YWNrc2l6ZSggaW50IGFyZyApCit7CisgICAgLy8gX19rbXBfYXV4X3NldF9zdGFja3NpemUgaW5pdGlhbGl6ZXMgdGhlIGxpYnJhcnkgaWYgbmVlZGVkCisgICAgX19rbXBfYXV4X3NldF9zdGFja3NpemUoIGFyZyApOworfQorCit2b2lkCitrbXBjX3NldF9zdGFja3NpemVfcyggc2l6ZV90IGFyZyApCit7CisgICAgLy8gX19rbXBfYXV4X3NldF9zdGFja3NpemUgaW5pdGlhbGl6ZXMgdGhlIGxpYnJhcnkgaWYgbmVlZGVkCisgICAgX19rbXBfYXV4X3NldF9zdGFja3NpemUoIGFyZyApOworfQorCit2b2lkCitrbXBjX3NldF9ibG9ja3RpbWUoIGludCBhcmcgKQoreworICAgIGludCBndGlkLCB0aWQ7CisgICAga21wX2luZm9fdCAqdGhyZWFkOworCisgICAgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpOworICAgIHRocmVhZCA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoZ3RpZCk7CisKKyAgICBfX2ttcF9hdXhfc2V0X2Jsb2NrdGltZSggYXJnLCB0aHJlYWQsIHRpZCApOworfQorCit2b2lkCitrbXBjX3NldF9saWJyYXJ5KCBpbnQgYXJnICkKK3sKKyAgICAvLyBfX2ttcF91c2VyX3NldF9saWJyYXJ5IGluaXRpYWxpemVzIHRoZSBsaWJyYXJ5IGlmIG5lZWRlZAorICAgIF9fa21wX3VzZXJfc2V0X2xpYnJhcnkoIChlbnVtIGxpYnJhcnlfdHlwZSlhcmcgKTsKK30KKwordm9pZAora21wY19zZXRfZGVmYXVsdHMoIGNoYXIgY29uc3QgKiBzdHIgKQoreworICAgIC8vIF9fa21wX2F1eF9zZXRfZGVmYXVsdHMgaW5pdGlhbGl6ZXMgdGhlIGxpYnJhcnkgaWYgbmVlZGVkCisgICAgX19rbXBfYXV4X3NldF9kZWZhdWx0cyggc3RyLCBLTVBfU1RSTEVOKCBzdHIgKSApOworfQorCitpbnQKK2ttcGNfc2V0X2FmZmluaXR5X21hc2tfcHJvYyggaW50IHByb2MsIHZvaWQgKiptYXNrICkKK3sKKyNpZiBkZWZpbmVkKEtNUF9TVFVCKSB8fCAhS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIHJldHVybiAtMTsKKyNlbHNlCisgICAgaWYgKCAhIFRDUl80KF9fa21wX2luaXRfbWlkZGxlKSApIHsKKyAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX2F1eF9zZXRfYWZmaW5pdHlfbWFza19wcm9jKCBwcm9jLCBtYXNrICk7CisjZW5kaWYKK30KKworaW50CitrbXBjX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyggaW50IHByb2MsIHZvaWQgKiptYXNrICkKK3sKKyNpZiBkZWZpbmVkKEtNUF9TVFVCKSB8fCAhS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIHJldHVybiAtMTsKKyNlbHNlCisgICAgaWYgKCAhIFRDUl80KF9fa21wX2luaXRfbWlkZGxlKSApIHsKKyAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX2F1eF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MoIHByb2MsIG1hc2sgKTsKKyNlbmRpZgorfQorCitpbnQKK2ttcGNfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyggaW50IHByb2MsIHZvaWQgKiptYXNrICkKK3sKKyNpZiBkZWZpbmVkKEtNUF9TVFVCKSB8fCAhS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIHJldHVybiAtMTsKKyNlbHNlCisgICAgaWYgKCAhIFRDUl80KF9fa21wX2luaXRfbWlkZGxlKSApIHsKKyAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX2F1eF9nZXRfYWZmaW5pdHlfbWFza19wcm9jKCBwcm9jLCBtYXNrICk7CisjZW5kaWYKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyohCitAaW5ncm91cCBUSFJFQURQUklWQVRFCitAcGFyYW0gbG9jICAgICAgIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGd0aWQgICAgICBnbG9iYWwgdGhyZWFkIG51bWJlcgorQHBhcmFtIGNweV9zaXplICBzaXplIG9mIHRoZSBjcHlfZGF0YSBidWZmZXIKK0BwYXJhbSBjcHlfZGF0YSAgcG9pbnRlciB0byBkYXRhIHRvIGJlIGNvcGllZAorQHBhcmFtIGNweV9mdW5jICBoZWxwZXIgZnVuY3Rpb24gdG8gY2FsbCBmb3IgY29weWluZyBkYXRhCitAcGFyYW0gZGlkaXQgICAgIGZsYWcgdmFyaWFibGU6IDE9c2luZ2xlIHRocmVhZDsgMD1ub3Qgc2luZ2xlIHRocmVhZAorCitfX2ttcGNfY29weXByaXZhdGUgaW1wbGVtZW50cyB0aGUgaW50ZXJmYWNlIGZvciB0aGUgcHJpdmF0ZSBkYXRhIGJyb2FkY2FzdCBuZWVkZWQgZm9yCit0aGUgY29weXByaXZhdGUgY2xhdXNlIGFzc29jaWF0ZWQgd2l0aCBhIHNpbmdsZSByZWdpb24gaW4gYW4gT3Blbk1QPHN1cD4qPC9zdXA+IHByb2dyYW0gKGJvdGggQyBhbmQgRm9ydHJhbikuCitBbGwgdGhyZWFkcyBwYXJ0aWNpcGF0aW5nIGluIHRoZSBwYXJhbGxlbCByZWdpb24gY2FsbCB0aGlzIHJvdXRpbmUuCitPbmUgb2YgdGhlIHRocmVhZHMgKGNhbGxlZCB0aGUgc2luZ2xlIHRocmVhZCkgc2hvdWxkIGhhdmUgdGhlIDx0dD5kaWRpdDwvdHQ+IHZhcmlhYmxlIHNldCB0byAxCithbmQgYWxsIG90aGVyIHRocmVhZHMgc2hvdWxkIGhhdmUgdGhhdCB2YXJpYWJsZSBzZXQgdG8gMC4KK0FsbCB0aHJlYWRzIHBhc3MgYSBwb2ludGVyIHRvIGEgZGF0YSBidWZmZXIgKGNweV9kYXRhKSB0aGF0IHRoZXkgaGF2ZSBidWlsdC4KKworVGhlIE9wZW5NUCBzcGVjaWZpY2F0aW9uIGZvcmJpZHMgdGhlIHVzZSBvZiBub3dhaXQgb24gdGhlIHNpbmdsZSByZWdpb24gd2hlbiBhIGNvcHlwcml2YXRlCitjbGF1c2UgaXMgcHJlc2VudC4gSG93ZXZlciwgQHJlZiBfX2ttcGNfY29weXByaXZhdGUgaW1wbGVtZW50cyBhIGJhcnJpZXIgaW50ZXJuYWxseSB0byBhdm9pZAorcmFjZSBjb25kaXRpb25zLCBzbyB0aGUgY29kZSBnZW5lcmF0aW9uIGZvciB0aGUgc2luZ2xlIHJlZ2lvbiBzaG91bGQgYXZvaWQgZ2VuZXJhdGluZyBhIGJhcnJpZXIKK2FmdGVyIHRoZSBjYWxsIHRvIEByZWYgX19rbXBjX2NvcHlwcml2YXRlLgorCitUaGUgPHR0Pmd0aWQ8L3R0PiBwYXJhbWV0ZXIgaXMgdGhlIGdsb2JhbCB0aHJlYWQgaWQgZm9yIHRoZSBjdXJyZW50IHRocmVhZC4KK1RoZSA8dHQ+bG9jPC90dD4gcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24uCisKK0ludGVybmFsIGltcGxlbWVudGF0aW9uOiBUaGUgc2luZ2xlIHRocmVhZCB3aWxsIGZpcnN0IGNvcHkgaXRzIGRlc2NyaXB0b3IgYWRkcmVzcyAoY3B5X2RhdGEpCit0byBhIHRlYW0tcHJpdmF0ZSBsb2NhdGlvbiwgdGhlbiB0aGUgb3RoZXIgdGhyZWFkcyB3aWxsIGVhY2ggY2FsbCB0aGUgZnVuY3Rpb24gcG9pbnRlZCB0byBieQordGhlIHBhcmFtZXRlciBjcHlfZnVuYywgd2hpY2ggY2FycmllcyBvdXQgdGhlIGNvcHkgYnkgY29weWluZyB0aGUgZGF0YSB1c2luZyB0aGUgY3B5X2RhdGEgYnVmZmVyLgorCitUaGUgY3B5X2Z1bmMgcm91dGluZSB1c2VkIGZvciB0aGUgY29weSBhbmQgdGhlIGNvbnRlbnRzIG9mIHRoZSBkYXRhIGFyZWEgZGVmaW5lZCBieSBjcHlfZGF0YQorYW5kIGNweV9zaXplIG1heSBiZSBidWlsdCBpbiBhbnkgZmFzaGlvbiB0aGF0IHdpbGwgYWxsb3cgdGhlIGNvcHkgdG8gYmUgZG9uZS4gRm9yIGluc3RhbmNlLAordGhlIGNweV9kYXRhIGJ1ZmZlciBjYW4gaG9sZCB0aGUgYWN0dWFsIGRhdGEgdG8gYmUgY29waWVkIG9yIGl0IG1heSBob2xkIGEgbGlzdCBvZiBwb2ludGVycwordG8gdGhlIGRhdGEuIFRoZSBjcHlfZnVuYyByb3V0aW5lIG11c3QgaW50ZXJwcmV0IHRoZSBjcHlfZGF0YSBidWZmZXIgYXBwcm9wcmlhdGVseS4KKworVGhlIGludGVyZmFjZSB0byBjcHlfZnVuYyBpcyBhcyBmb2xsb3dzOgorQGNvZGUKK3ZvaWQgY3B5X2Z1bmMoIHZvaWQgKmRlc3RpbmF0aW9uLCB2b2lkICpzb3VyY2UgKQorQGVuZGNvZGUKK3doZXJlIHZvaWQgKmRlc3RpbmF0aW9uIGlzIHRoZSBjcHlfZGF0YSBwb2ludGVyIGZvciB0aGUgdGhyZWFkIGJlaW5nIGNvcGllZCB0bworYW5kIHZvaWQgKnNvdXJjZSBpcyB0aGUgY3B5X2RhdGEgcG9pbnRlciBmb3IgdGhlIHRocmVhZCBiZWluZyBjb3BpZWQgZnJvbS4KKyovCit2b2lkCitfX2ttcGNfY29weXByaXZhdGUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIHNpemVfdCBjcHlfc2l6ZSwgdm9pZCAqY3B5X2RhdGEsIHZvaWQoKmNweV9mdW5jKSh2b2lkKix2b2lkKiksIGttcF9pbnQzMiBkaWRpdCApCit7CisgICAgdm9pZCAqKmRhdGFfcHRyOworCisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19jb3B5cHJpdmF0ZTogY2FsbGVkIFQjJWRcbiIsIGd0aWQgKSk7CisKKyAgICBLTVBfTUIoKTsKKworICAgIGRhdGFfcHRyID0gJiBfX2ttcF90ZWFtX2Zyb21fZ3RpZCggZ3RpZCApLT50LnRfY29weXByaXZfZGF0YTsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBpZiAoIGxvYyA9PSAwICkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIENvbnN0cnVjdElkZW50SW52YWxpZCApOworICAgICAgICB9CisgICAgfQorCisgICAgLyogVG9EbzogT3B0aW1pemUgdGhlIGZvbGxvd2luZyB0d28gYmFycmllcnMgaW50byBzb21lIGtpbmQgb2Ygc3BsaXQgYmFycmllciAqLworCisgICAgaWYgKGRpZGl0KSAqZGF0YV9wdHIgPSBjcHlfZGF0YTsKKworICAgIC8qIFRoaXMgYmFycmllciBpcyBub3QgYSBiYXJyaWVyIHJlZ2lvbiBib3VuZGFyeSAqLworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfaWRlbnQgPSBsb2M7CisjZW5kaWYKKyAgICBfX2ttcF9iYXJyaWVyKCBic19wbGFpbl9iYXJyaWVyLCBndGlkLCBGQUxTRSAsIDAsIE5VTEwsIE5VTEwgKTsKKworICAgIGlmICghIGRpZGl0KSAoKmNweV9mdW5jKSggY3B5X2RhdGEsICpkYXRhX3B0ciApOworCisgICAgLyogQ29uc2lkZXIgbmV4dCBiYXJyaWVyIHRoZSB1c2VyLXZpc2libGUgYmFycmllciBmb3IgYmFycmllciByZWdpb24gYm91bmRhcmllcyAqLworICAgIC8qIE5lc3RpbmcgY2hlY2tzIGFyZSBhbHJlYWR5IGhhbmRsZWQgYnkgdGhlIHNpbmdsZSBjb25zdHJ1Y3QgY2hlY2tzICovCisKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX2lkZW50ID0gbG9jOyAvLyBUT0RPOiBjaGVjayBpZiBpdCBpcyBuZWVkZWQgKGUuZy4gdGFza3MgY2FuIG92ZXJ3cml0ZSB0aGUgbG9jYXRpb24pCisjZW5kaWYKKyAgICBfX2ttcF9iYXJyaWVyKCBic19wbGFpbl9iYXJyaWVyLCBndGlkLCBGQUxTRSAsIDAsIE5VTEwsIE5VTEwgKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBJTklUX0xPQ0sgICAgICAgICAgICAgICAgIF9fa21wX2luaXRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzCisjZGVmaW5lIElOSVRfTkVTVEVEX0xPQ0sgICAgICAgICAgX19rbXBfaW5pdF9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzCisjZGVmaW5lIEFDUVVJUkVfTE9DSyAgICAgICAgICAgICAgX19rbXBfYWNxdWlyZV91c2VyX2xvY2tfd2l0aF9jaGVja3MKKyNkZWZpbmUgQUNRVUlSRV9MT0NLX1RJTUVEICAgICAgICBfX2ttcF9hY3F1aXJlX3VzZXJfbG9ja193aXRoX2NoZWNrc190aW1lZAorI2RlZmluZSBBQ1FVSVJFX05FU1RFRF9MT0NLICAgICAgIF9fa21wX2FjcXVpcmVfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrcworI2RlZmluZSBBQ1FVSVJFX05FU1RFRF9MT0NLX1RJTUVEIF9fa21wX2FjcXVpcmVfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc190aW1lZAorI2RlZmluZSBSRUxFQVNFX0xPQ0sgICAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfdXNlcl9sb2NrX3dpdGhfY2hlY2tzCisjZGVmaW5lIFJFTEVBU0VfTkVTVEVEX0xPQ0sgICAgICAgX19rbXBfcmVsZWFzZV9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzCisjZGVmaW5lIFRFU1RfTE9DSyAgICAgICAgICAgICAgICAgX19rbXBfdGVzdF91c2VyX2xvY2tfd2l0aF9jaGVja3MKKyNkZWZpbmUgVEVTVF9ORVNURURfTE9DSyAgICAgICAgICBfX2ttcF90ZXN0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3MKKyNkZWZpbmUgREVTVFJPWV9MT0NLICAgICAgICAgICAgICBfX2ttcF9kZXN0cm95X3VzZXJfbG9ja193aXRoX2NoZWNrcworI2RlZmluZSBERVNUUk9ZX05FU1RFRF9MT0NLICAgICAgIF9fa21wX2Rlc3Ryb3lfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrcworCisKKy8qCisgKiBUT0RPOiBNYWtlIGNoZWNrIGFib3J0IG1lc3NhZ2VzIHVzZSBsb2NhdGlvbiBpbmZvICYgcGFzcyBpdAorICogaW50byB3aXRoX2NoZWNrcyByb3V0aW5lcworICovCisKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworCisvLyBpbnRlcm5hbCBsb2NrIGluaXRpYWxpemVyCitzdGF0aWMgX19mb3JjZWlubGluZSB2b2lkCitfX2ttcF9pbml0X2xvY2tfd2l0aF9oaW50KGlkZW50X3QgKmxvYywgdm9pZCAqKmxvY2ssIGttcF9keW5hX2xvY2tzZXFfdCBzZXEpCit7CisgICAgaWYgKEtNUF9JU19EX0xPQ0soc2VxKSkgeworICAgICAgICBLTVBfSU5JVF9EX0xPQ0sobG9jaywgc2VxKTsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIF9fa21wX2l0dF9sb2NrX2NyZWF0aW5nKChrbXBfdXNlcl9sb2NrX3ApbG9jaywgTlVMTCk7CisjZW5kaWYKKyAgICB9IGVsc2UgeworICAgICAgICBLTVBfSU5JVF9JX0xPQ0sobG9jaywgc2VxKTsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIGttcF9pbmRpcmVjdF9sb2NrX3QgKmlsayA9IEtNUF9MT09LVVBfSV9MT0NLKGxvY2spOworICAgICAgICBfX2ttcF9pdHRfbG9ja19jcmVhdGluZyhpbGstPmxvY2ssIGxvYyk7CisjZW5kaWYKKyAgICB9Cit9CisKKy8vIGludGVybmFsIG5lc3QgbG9jayBpbml0aWFsaXplcgorc3RhdGljIF9fZm9yY2VpbmxpbmUgdm9pZAorX19rbXBfaW5pdF9uZXN0X2xvY2tfd2l0aF9oaW50KGlkZW50X3QgKmxvYywgdm9pZCAqKmxvY2ssIGttcF9keW5hX2xvY2tzZXFfdCBzZXEpCit7CisjaWYgS01QX1VTRV9UU1gKKyAgICAvLyBEb24ndCBoYXZlIG5lc3RlZCBsb2NrIGltcGxlbWVudGF0aW9uIGZvciBzcGVjdWxhdGl2ZSBsb2NrcworICAgIGlmIChzZXEgPT0gbG9ja3NlcV9obGUgfHwgc2VxID09IGxvY2tzZXFfcnRtIHx8IHNlcSA9PSBsb2Nrc2VxX2FkYXB0aXZlKQorICAgICAgICBzZXEgPSBfX2ttcF91c2VyX2xvY2tfc2VxOworI2VuZGlmCisgICAgc3dpdGNoIChzZXEpIHsKKyAgICAgICAgY2FzZSBsb2Nrc2VxX3RhczoKKyAgICAgICAgICAgIHNlcSA9IGxvY2tzZXFfbmVzdGVkX3RhczsKKyAgICAgICAgICAgIGJyZWFrOworI2lmIEtNUF9VU0VfRlVURVgKKyAgICAgICAgY2FzZSBsb2Nrc2VxX2Z1dGV4OgorICAgICAgICAgICAgc2VxID0gbG9ja3NlcV9uZXN0ZWRfZnV0ZXg7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICBjYXNlIGxvY2tzZXFfdGlja2V0OgorICAgICAgICAgICAgc2VxID0gbG9ja3NlcV9uZXN0ZWRfdGlja2V0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgbG9ja3NlcV9xdWV1aW5nOgorICAgICAgICAgICAgc2VxID0gbG9ja3NlcV9uZXN0ZWRfcXVldWluZzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGxvY2tzZXFfZHJkcGE6CisgICAgICAgICAgICBzZXEgPSBsb2Nrc2VxX25lc3RlZF9kcmRwYTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgc2VxID0gbG9ja3NlcV9uZXN0ZWRfcXVldWluZzsKKyAgICB9CisgICAgS01QX0lOSVRfSV9MT0NLKGxvY2ssIHNlcSk7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgIGttcF9pbmRpcmVjdF9sb2NrX3QgKmlsayA9IEtNUF9MT09LVVBfSV9MT0NLKGxvY2spOworICAgIF9fa21wX2l0dF9sb2NrX2NyZWF0aW5nKGlsay0+bG9jaywgbG9jKTsKKyNlbmRpZgorfQorCisvKiBpbml0aWFsaXplIHRoZSBsb2NrIHdpdGggYSBoaW50ICovCit2b2lkCitfX2ttcGNfaW5pdF9sb2NrX3dpdGhfaGludChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCB2b2lkICoqdXNlcl9sb2NrLCB1aW50cHRyX3QgaGludCkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2luaXRfc2VyaWFsKTsKKyAgICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICYmIHVzZXJfbG9jayA9PSBOVUxMKSB7CisgICAgICAgIEtNUF9GQVRBTChMb2NrSXNVbmluaXRpYWxpemVkLCAib21wX2luaXRfbG9ja193aXRoX2hpbnQiKTsKKyAgICB9CisKKyAgICBfX2ttcF9pbml0X2xvY2tfd2l0aF9oaW50KGxvYywgdXNlcl9sb2NrLCBfX2ttcF9tYXBfaGludF90b19sb2NrKGhpbnQpKTsKK30KKworLyogaW5pdGlhbGl6ZSB0aGUgbG9jayB3aXRoIGEgaGludCAqLwordm9pZAorX19rbXBjX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCB2b2lkICoqdXNlcl9sb2NrLCB1aW50cHRyX3QgaGludCkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2luaXRfc2VyaWFsKTsKKyAgICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICYmIHVzZXJfbG9jayA9PSBOVUxMKSB7CisgICAgICAgIEtNUF9GQVRBTChMb2NrSXNVbmluaXRpYWxpemVkLCAib21wX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludCIpOworICAgIH0KKworICAgIF9fa21wX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludChsb2MsIHVzZXJfbG9jaywgX19rbXBfbWFwX2hpbnRfdG9fbG9jayhoaW50KSk7Cit9CisKKyNlbmRpZiAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworCisvKiBpbml0aWFsaXplIHRoZSBsb2NrICovCit2b2lkCitfX2ttcGNfaW5pdF9sb2NrKCBpZGVudF90ICogbG9jLCBrbXBfaW50MzIgZ3RpZCwgIHZvaWQgKiogdXNlcl9sb2NrICkgeworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9pbml0X3NlcmlhbCk7CisgICAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayAmJiB1c2VyX2xvY2sgPT0gTlVMTCkgeworICAgICAgICBLTVBfRkFUQUwoTG9ja0lzVW5pbml0aWFsaXplZCwgIm9tcF9pbml0X2xvY2siKTsKKyAgICB9CisgICAgX19rbXBfaW5pdF9sb2NrX3dpdGhfaGludChsb2MsIHVzZXJfbG9jaywgX19rbXBfdXNlcl9sb2NrX3NlcSk7CisKKyNlbHNlIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyAgICBzdGF0aWMgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX2luaXRfbG9jayI7CisgICAga21wX3VzZXJfbG9ja19wIGxjazsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGlmICggdXNlcl9sb2NrID09IE5VTEwgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEtNUF9DSEVDS19VU0VSX0xPQ0tfSU5JVCgpOworCisgICAgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX3RhcyApCisgICAgICAmJiAoIHNpemVvZiggbGNrLT50YXMubGsucG9sbCApIDw9IE9NUF9MT0NLX1RfU0laRSApICkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyAgICB9CisjaWYgS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KQorICAgIGVsc2UgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX2Z1dGV4ICkKKyAgICAgICYmICggc2l6ZW9mKCBsY2stPmZ1dGV4LmxrLnBvbGwgKSA8PSBPTVBfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgICAgfQorI2VuZGlmCisgICAgZWxzZSB7CisgICAgICAgIGxjayA9IF9fa21wX3VzZXJfbG9ja19hbGxvY2F0ZSggdXNlcl9sb2NrLCBndGlkLCAwICk7CisgICAgfQorICAgIElOSVRfTE9DSyggbGNrICk7CisgICAgX19rbXBfc2V0X3VzZXJfbG9ja19sb2NhdGlvbiggbGNrLCBsb2MgKTsKKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgICAgaWYgKG9tcHRfZW5hYmxlZCAmJgorICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfaW5pdF9sb2NrKSkgeworICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfaW5pdF9sb2NrKSgodWludDY0X3QpIGxjayk7CisgICAgfQorI2VuZGlmCisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2xvY2tfY3JlYXRpbmcoIGxjayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworI2VuZGlmIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCit9IC8vIF9fa21wY19pbml0X2xvY2sKKworLyogaW5pdGlhbGl6ZSB0aGUgbG9jayAqLwordm9pZAorX19rbXBjX2luaXRfbmVzdF9sb2NrKCBpZGVudF90ICogbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKiB1c2VyX2xvY2sgKSB7CisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKworICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfaW5pdF9zZXJpYWwpOworICAgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgJiYgdXNlcl9sb2NrID09IE5VTEwpIHsKKyAgICAgICAgS01QX0ZBVEFMKExvY2tJc1VuaW5pdGlhbGl6ZWQsICJvbXBfaW5pdF9uZXN0X2xvY2siKTsKKyAgICB9CisgICAgX19rbXBfaW5pdF9uZXN0X2xvY2tfd2l0aF9oaW50KGxvYywgdXNlcl9sb2NrLCBfX2ttcF91c2VyX2xvY2tfc2VxKTsKKworI2Vsc2UgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKKworICAgIHN0YXRpYyBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfaW5pdF9uZXN0X2xvY2siOworICAgIGttcF91c2VyX2xvY2tfcCBsY2s7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBpZiAoIHVzZXJfbG9jayA9PSBOVUxMICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBLTVBfQ0hFQ0tfVVNFUl9MT0NLX0lOSVQoKTsKKworICAgIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKSAmJiAoIHNpemVvZiggbGNrLT50YXMubGsucG9sbCApCisgICAgICArIHNpemVvZiggbGNrLT50YXMubGsuZGVwdGhfbG9ja2VkICkgPD0gT01QX05FU1RfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgICAgfQorI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkKKyAgICBlbHNlIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa19mdXRleCApCisgICAgICYmICggc2l6ZW9mKCBsY2stPmZ1dGV4LmxrLnBvbGwgKSArIHNpemVvZiggbGNrLT5mdXRleC5say5kZXB0aF9sb2NrZWQgKQorICAgICA8PSBPTVBfTkVTVF9MT0NLX1RfU0laRSApICkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlIHsKKyAgICAgICAgbGNrID0gX19rbXBfdXNlcl9sb2NrX2FsbG9jYXRlKCB1c2VyX2xvY2ssIGd0aWQsIDAgKTsKKyAgICB9CisKKyAgICBJTklUX05FU1RFRF9MT0NLKCBsY2sgKTsKKyAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX2xvY2F0aW9uKCBsY2ssIGxvYyApOworCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbml0X25lc3RfbG9jaykpIHsKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2luaXRfbmVzdF9sb2NrKSgodWludDY0X3QpIGxjayk7CisgICAgfQorI2VuZGlmCisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2xvY2tfY3JlYXRpbmcoIGxjayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworI2VuZGlmIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCit9IC8vIF9fa21wY19pbml0X25lc3RfbG9jaworCit2b2lkCitfX2ttcGNfZGVzdHJveV9sb2NrKCBpZGVudF90ICogbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKiB1c2VyX2xvY2sgKSB7CisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKworIyBpZiBVU0VfSVRUX0JVSUxECisgICAga21wX3VzZXJfbG9ja19wIGxjazsKKyAgICBpZiAoS01QX0VYVFJBQ1RfRF9UQUcodXNlcl9sb2NrKSA9PSAwKSB7CisgICAgICAgIGxjayA9ICgoa21wX2luZGlyZWN0X2xvY2tfdCAqKUtNUF9MT09LVVBfSV9MT0NLKHVzZXJfbG9jaykpLT5sb2NrOworICAgIH0gZWxzZSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworICAgIH0KKyAgICBfX2ttcF9pdHRfbG9ja19kZXN0cm95ZWQobGNrKTsKKyMgZW5kaWYKKyAgICBLTVBfRF9MT0NLX0ZVTkModXNlcl9sb2NrLCBkZXN0cm95KSgoa21wX2R5bmFfbG9ja190ICopdXNlcl9sb2NrKTsKKyNlbHNlCisgICAga21wX3VzZXJfbG9ja19wIGxjazsKKworICAgIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKQorICAgICAgJiYgKCBzaXplb2YoIGxjay0+dGFzLmxrLnBvbGwgKSA8PSBPTVBfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgICAgfQorI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkKKyAgICBlbHNlIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa19mdXRleCApCisgICAgICAmJiAoIHNpemVvZiggbGNrLT5mdXRleC5say5wb2xsICkgPD0gT01QX0xPQ0tfVF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworICAgIH0KKyNlbmRpZgorICAgIGVsc2UgeworICAgICAgICBsY2sgPSBfX2ttcF9sb29rdXBfdXNlcl9sb2NrKCB1c2VyX2xvY2ssICJvbXBfZGVzdHJveV9sb2NrIiApOworICAgIH0KKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgICAgaWYgKG9tcHRfZW5hYmxlZCAmJgorICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfZGVzdHJveV9sb2NrKSkgeworICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfZGVzdHJveV9sb2NrKSgodWludDY0X3QpIGxjayk7CisgICAgfQorI2VuZGlmCisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2xvY2tfZGVzdHJveWVkKCBsY2sgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgREVTVFJPWV9MT0NLKCBsY2sgKTsKKworICAgIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKQorICAgICAgJiYgKCBzaXplb2YoIGxjay0+dGFzLmxrLnBvbGwgKSA8PSBPTVBfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgOworICAgIH0KKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpCisgICAgZWxzZSBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfZnV0ZXggKQorICAgICAgJiYgKCBzaXplb2YoIGxjay0+ZnV0ZXgubGsucG9sbCApIDw9IE9NUF9MT0NLX1RfU0laRSApICkgeworICAgICAgICA7CisgICAgfQorI2VuZGlmCisgICAgZWxzZSB7CisgICAgICAgIF9fa21wX3VzZXJfbG9ja19mcmVlKCB1c2VyX2xvY2ssIGd0aWQsIGxjayApOworICAgIH0KKyNlbmRpZiAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworfSAvLyBfX2ttcGNfZGVzdHJveV9sb2NrCisKKy8qIGRlc3Ryb3kgdGhlIGxvY2sgKi8KK3ZvaWQKK19fa21wY19kZXN0cm95X25lc3RfbG9jayggaWRlbnRfdCAqIGxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKiogdXNlcl9sb2NrICkgeworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyMgaWYgVVNFX0lUVF9CVUlMRAorICAgIGttcF9pbmRpcmVjdF9sb2NrX3QgKmlsayA9IEtNUF9MT09LVVBfSV9MT0NLKHVzZXJfbG9jayk7CisgICAgX19rbXBfaXR0X2xvY2tfZGVzdHJveWVkKGlsay0+bG9jayk7CisjIGVuZGlmCisgICAgS01QX0RfTE9DS19GVU5DKHVzZXJfbG9jaywgZGVzdHJveSkoKGttcF9keW5hX2xvY2tfdCAqKXVzZXJfbG9jayk7CisKKyNlbHNlIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyAgICBrbXBfdXNlcl9sb2NrX3AgbGNrOworCisgICAgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX3RhcyApICYmICggc2l6ZW9mKCBsY2stPnRhcy5say5wb2xsICkKKyAgICAgICsgc2l6ZW9mKCBsY2stPnRhcy5say5kZXB0aF9sb2NrZWQgKSA8PSBPTVBfTkVTVF9MT0NLX1RfU0laRSApICkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyAgICB9CisjaWYgS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KQorICAgIGVsc2UgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX2Z1dGV4ICkKKyAgICAgJiYgKCBzaXplb2YoIGxjay0+ZnV0ZXgubGsucG9sbCApICsgc2l6ZW9mKCBsY2stPmZ1dGV4LmxrLmRlcHRoX2xvY2tlZCApCisgICAgIDw9IE9NUF9ORVNUX0xPQ0tfVF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworICAgIH0KKyNlbmRpZgorICAgIGVsc2UgeworICAgICAgICBsY2sgPSBfX2ttcF9sb29rdXBfdXNlcl9sb2NrKCB1c2VyX2xvY2ssICJvbXBfZGVzdHJveV9uZXN0X2xvY2siICk7CisgICAgfQorCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9kZXN0cm95X25lc3RfbG9jaykpIHsKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2Rlc3Ryb3lfbmVzdF9sb2NrKSgodWludDY0X3QpIGxjayk7CisgICAgfQorI2VuZGlmCisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2xvY2tfZGVzdHJveWVkKCBsY2sgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICBERVNUUk9ZX05FU1RFRF9MT0NLKCBsY2sgKTsKKworICAgIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKSAmJiAoIHNpemVvZiggbGNrLT50YXMubGsucG9sbCApCisgICAgICsgc2l6ZW9mKCBsY2stPnRhcy5say5kZXB0aF9sb2NrZWQgKSA8PSBPTVBfTkVTVF9MT0NLX1RfU0laRSApICkgeworICAgICAgICA7CisgICAgfQorI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkKKyAgICBlbHNlIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa19mdXRleCApCisgICAgICYmICggc2l6ZW9mKCBsY2stPmZ1dGV4LmxrLnBvbGwgKSArIHNpemVvZiggbGNrLT5mdXRleC5say5kZXB0aF9sb2NrZWQgKQorICAgICA8PSBPTVBfTkVTVF9MT0NLX1RfU0laRSApICkgeworICAgICAgICA7CisgICAgfQorI2VuZGlmCisgICAgZWxzZSB7CisgICAgICAgIF9fa21wX3VzZXJfbG9ja19mcmVlKCB1c2VyX2xvY2ssIGd0aWQsIGxjayApOworICAgIH0KKyNlbmRpZiAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworfSAvLyBfX2ttcGNfZGVzdHJveV9uZXN0X2xvY2sKKwordm9pZAorX19rbXBjX3NldF9sb2NrKCBpZGVudF90ICogbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKiB1c2VyX2xvY2sgKSB7CisgICAgS01QX0NPVU5UX0JMT0NLKE9NUF9zZXRfbG9jayk7CisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKyAgICBpbnQgdGFnID0gS01QX0VYVFJBQ1RfRF9UQUcodXNlcl9sb2NrKTsKKyMgaWYgVVNFX0lUVF9CVUlMRAorICAgX19rbXBfaXR0X2xvY2tfYWNxdWlyaW5nKChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrKTsgLy8gaXR0IGZ1bmN0aW9uIHdpbGwgZ2V0IHRvIHRoZSByaWdodCBsb2NrIG9iamVjdC4KKyMgZW5kaWYKKyMgaWYgS01QX1VTRV9JTkxJTkVEX1RBUworICAgIGlmICh0YWcgPT0gbG9ja3RhZ190YXMgJiYgIV9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgICBLTVBfQUNRVUlSRV9UQVNfTE9DSyh1c2VyX2xvY2ssIGd0aWQpOworICAgIH0gZWxzZQorIyBlbGlmIEtNUF9VU0VfSU5MSU5FRF9GVVRFWAorICAgIGlmICh0YWcgPT0gbG9ja3RhZ19mdXRleCAmJiAhX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICAgIEtNUF9BQ1FVSVJFX0ZVVEVYX0xPQ0sodXNlcl9sb2NrLCBndGlkKTsKKyAgICB9IGVsc2UKKyMgZW5kaWYKKyAgICB7CisgICAgICAgIF9fa21wX2RpcmVjdF9zZXRbdGFnXSgoa21wX2R5bmFfbG9ja190ICopdXNlcl9sb2NrLCBndGlkKTsKKyAgICB9CisjIGlmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfbG9ja19hY3F1aXJlZCgoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jayk7CisjIGVuZGlmCisKKyNlbHNlIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyAgICBrbXBfdXNlcl9sb2NrX3AgbGNrOworCisgICAgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX3RhcyApCisgICAgICAmJiAoIHNpemVvZiggbGNrLT50YXMubGsucG9sbCApIDw9IE9NUF9MT0NLX1RfU0laRSApICkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyAgICB9CisjaWYgS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KQorICAgIGVsc2UgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX2Z1dGV4ICkKKyAgICAgICYmICggc2l6ZW9mKCBsY2stPmZ1dGV4LmxrLnBvbGwgKSA8PSBPTVBfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgICAgfQorI2VuZGlmCisgICAgZWxzZSB7CisgICAgICAgIGxjayA9IF9fa21wX2xvb2t1cF91c2VyX2xvY2soIHVzZXJfbG9jaywgIm9tcF9zZXRfbG9jayIgKTsKKyAgICB9CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2xvY2tfYWNxdWlyaW5nKCBsY2sgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICBBQ1FVSVJFX0xPQ0soIGxjaywgZ3RpZCApOworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9sb2NrX2FjcXVpcmVkKCBsY2sgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRQorICAgIGlmIChvbXB0X2VuYWJsZWQgJiYKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2FjcXVpcmVkX2xvY2spKSB7CisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9hY3F1aXJlZF9sb2NrKSgodWludDY0X3QpIGxjayk7CisgICAgfQorI2VuZGlmCisKKyNlbmRpZiAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworfQorCit2b2lkCitfX2ttcGNfc2V0X25lc3RfbG9jayggaWRlbnRfdCAqIGxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKiogdXNlcl9sb2NrICkgeworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyMgaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9sb2NrX2FjcXVpcmluZygoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jayk7CisjIGVuZGlmCisgICAgS01QX0RfTE9DS19GVU5DKHVzZXJfbG9jaywgc2V0KSgoa21wX2R5bmFfbG9ja190ICopdXNlcl9sb2NrLCBndGlkKTsKKyMgaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9sb2NrX2FjcXVpcmVkKChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrKTsKKyNlbmRpZgorCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIC8vIG1pc3Npbmcgc3VwcG9ydCBoZXJlOiBuZWVkIHRvIGtub3cgd2hldGhlciBhY3F1aXJlZCBmaXJzdCBvciBub3QKKyAgICB9CisjZW5kaWYKKworI2Vsc2UgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKKyAgICBpbnQgYWNxdWlyZV9zdGF0dXM7CisgICAga21wX3VzZXJfbG9ja19wIGxjazsKKworICAgIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKSAmJiAoIHNpemVvZiggbGNrLT50YXMubGsucG9sbCApCisgICAgICArIHNpemVvZiggbGNrLT50YXMubGsuZGVwdGhfbG9ja2VkICkgPD0gT01QX05FU1RfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgICAgfQorI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkKKyAgICBlbHNlIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa19mdXRleCApCisgICAgICYmICggc2l6ZW9mKCBsY2stPmZ1dGV4LmxrLnBvbGwgKSArIHNpemVvZiggbGNrLT5mdXRleC5say5kZXB0aF9sb2NrZWQgKQorICAgICA8PSBPTVBfTkVTVF9MT0NLX1RfU0laRSApICkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlIHsKKyAgICAgICAgbGNrID0gX19rbXBfbG9va3VwX3VzZXJfbG9jayggdXNlcl9sb2NrLCAib21wX3NldF9uZXN0X2xvY2siICk7CisgICAgfQorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9sb2NrX2FjcXVpcmluZyggbGNrICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgQUNRVUlSRV9ORVNURURfTE9DSyggbGNrLCBndGlkLCAmYWNxdWlyZV9zdGF0dXMgKTsKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfbG9ja19hY3F1aXJlZCggbGNrICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIGlmIChhY3F1aXJlX3N0YXR1cyA9PSBLTVBfTE9DS19BQ1FVSVJFRF9GSVJTVCkgeworICAgICAgICAgICBpZihvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfYWNxdWlyZWRfbmVzdF9sb2NrX2ZpcnN0KSkKKyAgICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2FjcXVpcmVkX25lc3RfbG9ja19maXJzdCkoKHVpbnQ2NF90KSBsY2spOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICBpZihvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfYWNxdWlyZWRfbmVzdF9sb2NrX25leHQpKQorICAgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfYWNxdWlyZWRfbmVzdF9sb2NrX25leHQpKCh1aW50NjRfdCkgbGNrKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisjZW5kaWYgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKK30KKwordm9pZAorX19rbXBjX3Vuc2V0X2xvY2soIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKip1c2VyX2xvY2sgKQoreworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyAgICBpbnQgdGFnID0gS01QX0VYVFJBQ1RfRF9UQUcodXNlcl9sb2NrKTsKKyMgaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9sb2NrX3JlbGVhc2luZygoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jayk7CisjIGVuZGlmCisjIGlmIEtNUF9VU0VfSU5MSU5FRF9UQVMKKyAgICBpZiAodGFnID09IGxvY2t0YWdfdGFzICYmICFfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICAgICAgS01QX1JFTEVBU0VfVEFTX0xPQ0sodXNlcl9sb2NrLCBndGlkKTsKKyAgICB9IGVsc2UKKyMgZWxpZiBLTVBfVVNFX0lOTElORURfRlVURVgKKyAgICBpZiAodGFnID09IGxvY2t0YWdfZnV0ZXggJiYgIV9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgICBLTVBfUkVMRUFTRV9GVVRFWF9MT0NLKHVzZXJfbG9jaywgZ3RpZCk7CisgICAgfSBlbHNlCisjIGVuZGlmCisgICAgeworICAgICAgICBfX2ttcF9kaXJlY3RfdW5zZXRbdGFnXSgoa21wX2R5bmFfbG9ja190ICopdXNlcl9sb2NrLCBndGlkKTsKKyAgICB9CisKKyNlbHNlIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyAgICBrbXBfdXNlcl9sb2NrX3AgbGNrOworCisgICAgLyogQ2FuJ3QgdXNlIHNlcmlhbCBpbnRlcnZhbCBzaW5jZSBub3QgYmxvY2sgc3RydWN0dXJlZCAqLworICAgIC8qIHJlbGVhc2UgdGhlIGxvY2sgKi8KKworICAgIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKQorICAgICAgJiYgKCBzaXplb2YoIGxjay0+dGFzLmxrLnBvbGwgKSA8PSBPTVBfTE9DS19UX1NJWkUgKSApIHsKKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpCisgICAgICAgIC8vICJmYXN0IiBwYXRoIGltcGxlbWVudGVkIHRvIGZpeCBjdXN0b21lciBwZXJmb3JtYW5jZSBpc3N1ZQorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgX19rbXBfaXR0X2xvY2tfcmVsZWFzaW5nKCAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICAgICAgVENXXzQoKChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrKS0+dGFzLmxrLnBvbGwsIDApOworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgcmV0dXJuOworI2Vsc2UKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisjZW5kaWYKKyAgICB9CisjaWYgS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KQorICAgIGVsc2UgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX2Z1dGV4ICkKKyAgICAgICYmICggc2l6ZW9mKCBsY2stPmZ1dGV4LmxrLnBvbGwgKSA8PSBPTVBfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgICAgfQorI2VuZGlmCisgICAgZWxzZSB7CisgICAgICAgIGxjayA9IF9fa21wX2xvb2t1cF91c2VyX2xvY2soIHVzZXJfbG9jaywgIm9tcF91bnNldF9sb2NrIiApOworICAgIH0KKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfbG9ja19yZWxlYXNpbmcoIGxjayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIFJFTEVBU0VfTE9DSyggbGNrLCBndGlkICk7CisKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9CTEFNRQorICAgIGlmIChvbXB0X2VuYWJsZWQgJiYKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3JlbGVhc2VfbG9jaykpIHsKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3JlbGVhc2VfbG9jaykoKHVpbnQ2NF90KSBsY2spOworICAgIH0KKyNlbmRpZgorCisjZW5kaWYgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKK30KKworLyogcmVsZWFzZSB0aGUgbG9jayAqLwordm9pZAorX19rbXBjX3Vuc2V0X25lc3RfbG9jayggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKnVzZXJfbG9jayApCit7CisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKworIyBpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2xvY2tfcmVsZWFzaW5nKChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrKTsKKyMgZW5kaWYKKyAgICBLTVBfRF9MT0NLX0ZVTkModXNlcl9sb2NrLCB1bnNldCkoKGttcF9keW5hX2xvY2tfdCAqKXVzZXJfbG9jaywgZ3RpZCk7CisKKyNlbHNlIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyAgICBrbXBfdXNlcl9sb2NrX3AgbGNrOworCisgICAgLyogQ2FuJ3QgdXNlIHNlcmlhbCBpbnRlcnZhbCBzaW5jZSBub3QgYmxvY2sgc3RydWN0dXJlZCAqLworCisgICAgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX3RhcyApICYmICggc2l6ZW9mKCBsY2stPnRhcy5say5wb2xsICkKKyAgICAgICsgc2l6ZW9mKCBsY2stPnRhcy5say5kZXB0aF9sb2NrZWQgKSA8PSBPTVBfTkVTVF9MT0NLX1RfU0laRSApICkgeworI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkKKyAgICAgICAgLy8gImZhc3QiIHBhdGggaW1wbGVtZW50ZWQgdG8gZml4IGN1c3RvbWVyIHBlcmZvcm1hbmNlIGlzc3VlCisgICAgICAgIGttcF90YXNfbG9ja190ICp0bCA9IChrbXBfdGFzX2xvY2tfdCopdXNlcl9sb2NrOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgX19rbXBfaXR0X2xvY2tfcmVsZWFzaW5nKCAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICAgICAgaWYgKCAtLSh0bC0+bGsuZGVwdGhfbG9ja2VkKSA9PSAwICkgeworICAgICAgICAgICAgVENXXzQodGwtPmxrLnBvbGwsIDApOworICAgICAgICB9CisgICAgICAgIEtNUF9NQigpOworICAgICAgICByZXR1cm47CisjZWxzZQorICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyNlbmRpZgorICAgIH0KKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpCisgICAgZWxzZSBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfZnV0ZXggKQorICAgICAmJiAoIHNpemVvZiggbGNrLT5mdXRleC5say5wb2xsICkgKyBzaXplb2YoIGxjay0+ZnV0ZXgubGsuZGVwdGhfbG9ja2VkICkKKyAgICAgPD0gT01QX05FU1RfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgICAgfQorI2VuZGlmCisgICAgZWxzZSB7CisgICAgICAgIGxjayA9IF9fa21wX2xvb2t1cF91c2VyX2xvY2soIHVzZXJfbG9jaywgIm9tcF91bnNldF9uZXN0X2xvY2siICk7CisgICAgfQorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9sb2NrX3JlbGVhc2luZyggbGNrICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgaW50IHJlbGVhc2Vfc3RhdHVzOworICAgIHJlbGVhc2Vfc3RhdHVzID0gUkVMRUFTRV9ORVNURURfTE9DSyggbGNrLCBndGlkICk7CisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfQkxBTUUKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIGlmIChyZWxlYXNlX3N0YXR1cyA9PSBLTVBfTE9DS19SRUxFQVNFRCkgeworICAgICAgICAgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9yZWxlYXNlX25lc3RfbG9ja19sYXN0KSkgeworICAgICAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9yZWxlYXNlX25lc3RfbG9ja19sYXN0KSgKKyAgICAgICAgICAgICAgICAgICAgKHVpbnQ2NF90KSBsY2spOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9yZWxlYXNlX25lc3RfbG9ja19wcmV2KSkgeworICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3JlbGVhc2VfbmVzdF9sb2NrX3ByZXYpKAorICAgICAgICAgICAgICAgICh1aW50NjRfdCkgbGNrKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisjZW5kaWYgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKK30KKworLyogdHJ5IHRvIGFjcXVpcmUgdGhlIGxvY2sgKi8KK2ludAorX19rbXBjX3Rlc3RfbG9jayggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKnVzZXJfbG9jayApCit7CisgICAgS01QX0NPVU5UX0JMT0NLKE9NUF90ZXN0X2xvY2spOworCisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKyAgICBpbnQgcmM7CisgICAgaW50IHRhZyA9IEtNUF9FWFRSQUNUX0RfVEFHKHVzZXJfbG9jayk7CisjIGlmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfbG9ja19hY3F1aXJpbmcoKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2spOworIyBlbmRpZgorIyBpZiBLTVBfVVNFX0lOTElORURfVEFTCisgICAgaWYgKHRhZyA9PSBsb2NrdGFnX3RhcyAmJiAhX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICAgIEtNUF9URVNUX1RBU19MT0NLKHVzZXJfbG9jaywgZ3RpZCwgcmMpOworICAgIH0gZWxzZQorIyBlbGlmIEtNUF9VU0VfSU5MSU5FRF9GVVRFWAorICAgIGlmICh0YWcgPT0gbG9ja3RhZ19mdXRleCAmJiAhX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICAgIEtNUF9URVNUX0ZVVEVYX0xPQ0sodXNlcl9sb2NrLCBndGlkLCByYyk7CisgICAgfSBlbHNlCisjIGVuZGlmCisgICAgeworICAgICAgICByYyA9IF9fa21wX2RpcmVjdF90ZXN0W3RhZ10oKGttcF9keW5hX2xvY2tfdCAqKXVzZXJfbG9jaywgZ3RpZCk7CisgICAgfQorICAgIGlmIChyYykgeworIyBpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIF9fa21wX2l0dF9sb2NrX2FjcXVpcmVkKChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrKTsKKyMgZW5kaWYKKyAgICAgICAgcmV0dXJuIEZUTl9UUlVFOworICAgIH0gZWxzZSB7CisjIGlmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgX19rbXBfaXR0X2xvY2tfY2FuY2VsbGVkKChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrKTsKKyMgZW5kaWYKKyAgICAgICAgcmV0dXJuIEZUTl9GQUxTRTsKKyAgICB9CisKKyNlbHNlIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyAgICBrbXBfdXNlcl9sb2NrX3AgbGNrOworICAgIGludCAgICAgICAgICByYzsKKworICAgIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKQorICAgICAgJiYgKCBzaXplb2YoIGxjay0+dGFzLmxrLnBvbGwgKSA8PSBPTVBfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgICAgfQorI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkKKyAgICBlbHNlIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa19mdXRleCApCisgICAgICAmJiAoIHNpemVvZiggbGNrLT5mdXRleC5say5wb2xsICkgPD0gT01QX0xPQ0tfVF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworICAgIH0KKyNlbmRpZgorICAgIGVsc2UgeworICAgICAgICBsY2sgPSBfX2ttcF9sb29rdXBfdXNlcl9sb2NrKCB1c2VyX2xvY2ssICJvbXBfdGVzdF9sb2NrIiApOworICAgIH0KKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfbG9ja19hY3F1aXJpbmcoIGxjayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIHJjID0gVEVTVF9MT0NLKCBsY2ssIGd0aWQgKTsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgaWYgKCByYyApIHsKKyAgICAgICAgX19rbXBfaXR0X2xvY2tfYWNxdWlyZWQoIGxjayApOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX2l0dF9sb2NrX2NhbmNlbGxlZCggbGNrICk7CisgICAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICByZXR1cm4gKCByYyA/IEZUTl9UUlVFIDogRlROX0ZBTFNFICk7CisKKyAgICAvKiBDYW4ndCB1c2Ugc2VyaWFsIGludGVydmFsIHNpbmNlIG5vdCBibG9jayBzdHJ1Y3R1cmVkICovCisKKyNlbmRpZiAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworfQorCisvKiB0cnkgdG8gYWNxdWlyZSB0aGUgbG9jayAqLworaW50CitfX2ttcGNfdGVzdF9uZXN0X2xvY2soIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKip1c2VyX2xvY2sgKQoreworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgICAgaW50IHJjOworIyBpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2xvY2tfYWNxdWlyaW5nKChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrKTsKKyMgZW5kaWYKKyAgICByYyA9IEtNUF9EX0xPQ0tfRlVOQyh1c2VyX2xvY2ssIHRlc3QpKChrbXBfZHluYV9sb2NrX3QgKil1c2VyX2xvY2ssIGd0aWQpOworIyBpZiBVU0VfSVRUX0JVSUxECisgICAgaWYgKHJjKSB7CisgICAgICAgIF9fa21wX2l0dF9sb2NrX2FjcXVpcmVkKChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9pdHRfbG9ja19jYW5jZWxsZWQoKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2spOworICAgIH0KKyMgZW5kaWYKKyAgICByZXR1cm4gcmM7CisKKyNlbHNlIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyAgICBrbXBfdXNlcl9sb2NrX3AgbGNrOworICAgIGludCAgICAgICAgICByYzsKKworICAgIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKSAmJiAoIHNpemVvZiggbGNrLT50YXMubGsucG9sbCApCisgICAgICArIHNpemVvZiggbGNrLT50YXMubGsuZGVwdGhfbG9ja2VkICkgPD0gT01QX05FU1RfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgICAgfQorI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkKKyAgICBlbHNlIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa19mdXRleCApCisgICAgICYmICggc2l6ZW9mKCBsY2stPmZ1dGV4LmxrLnBvbGwgKSArIHNpemVvZiggbGNrLT5mdXRleC5say5kZXB0aF9sb2NrZWQgKQorICAgICA8PSBPTVBfTkVTVF9MT0NLX1RfU0laRSApICkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlIHsKKyAgICAgICAgbGNrID0gX19rbXBfbG9va3VwX3VzZXJfbG9jayggdXNlcl9sb2NrLCAib21wX3Rlc3RfbmVzdF9sb2NrIiApOworICAgIH0KKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfbG9ja19hY3F1aXJpbmcoIGxjayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIHJjID0gVEVTVF9ORVNURURfTE9DSyggbGNrLCBndGlkICk7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgIGlmICggcmMgKSB7CisgICAgICAgIF9fa21wX2l0dF9sb2NrX2FjcXVpcmVkKCBsY2sgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9pdHRfbG9ja19jYW5jZWxsZWQoIGxjayApOworICAgIH0KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgcmV0dXJuIHJjOworCisgICAgLyogQ2FuJ3QgdXNlIHNlcmlhbCBpbnRlcnZhbCBzaW5jZSBub3QgYmxvY2sgc3RydWN0dXJlZCAqLworCisjZW5kaWYgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIEludGVyZmFjZSB0byBmYXN0IHNjYWxhYmxlIHJlZHVjZSBtZXRob2RzIHJvdXRpbmVzCisgKi8KKworLy8ga2VlcCB0aGUgc2VsZWN0ZWQgbWV0aG9kIGluIGEgdGhyZWFkIGxvY2FsIHN0cnVjdHVyZSBmb3IgY3Jvc3MtZnVuY3Rpb24gdXNhZ2U6IHdpbGwgYmUgdXNlZCBpbiBfX2ttcGNfZW5kX3JlZHVjZSogZnVuY3Rpb25zOworLy8gYW5vdGhlciBzb2x1dGlvbjogdG8gcmUtZGV0ZXJtaW5lIHRoZSBtZXRob2Qgb25lIG1vcmUgdGltZSBpbiBfX2ttcGNfZW5kX3JlZHVjZSogZnVuY3Rpb25zIChuZXcgcHJvdG90eXBlIHJlcXVpcmVkIHRoZW4pCisvLyBBVDogd2hpY2ggc29sdXRpb24gaXMgYmV0dGVyPworI2RlZmluZSBfX0tNUF9TRVRfUkVEVUNUSU9OX01FVEhPRChndGlkLHJtZXRob2QpIFwKKyAgICAgICAgICAgICAgICAgICAoICggX19rbXBfdGhyZWFkc1sgKCBndGlkICkgXSAtPiB0aC50aF9sb2NhbC5wYWNrZWRfcmVkdWN0aW9uX21ldGhvZCApID0gKCBybWV0aG9kICkgKQorCisjZGVmaW5lIF9fS01QX0dFVF9SRURVQ1RJT05fTUVUSE9EKGd0aWQpIFwKKyAgICAgICAgICAgICAgICAgICAoIF9fa21wX3RocmVhZHNbICggZ3RpZCApIF0gLT4gdGgudGhfbG9jYWwucGFja2VkX3JlZHVjdGlvbl9tZXRob2QgKQorCisvLyBkZXNjcmlwdGlvbiBvZiB0aGUgcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgdmFyaWFibGU6IGxvb2sgYXQgdGhlIG1hY3JvcyBpbiBrbXAuaAorCisKKy8vIHVzZWQgaW4gYSBjcml0aWNhbCBzZWN0aW9uIHJlZHVjZSBibG9jaworc3RhdGljIF9fZm9yY2VpbmxpbmUgdm9pZAorX19rbXBfZW50ZXJfY3JpdGljYWxfc2VjdGlvbl9yZWR1Y2VfYmxvY2soIGlkZW50X3QgKiBsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBfY3JpdGljYWxfbmFtZSAqIGNyaXQgKSB7CisKKyAgICAvLyB0aGlzIGxvY2sgd2FzIHZpc2libGUgdG8gYSBjdXN0b21lciBhbmQgdG8gdGhlIHRocmVhZGluZyBwcm9maWxlIHRvb2wgYXMgYSBzZXJpYWwgb3ZlcmhlYWQgc3BhbgorICAgIC8vICAgICAgICAgICAgKGFsdGhvdWdoIGl0J3MgdXNlZCBmb3IgYW4gaW50ZXJuYWwgcHVycG9zZSBvbmx5KQorICAgIC8vICAgICAgICAgICAgd2h5IHdhcyBpdCB2aXNpYmxlIGluIHByZXZpb3VzIGltcGxlbWVudGF0aW9uPworICAgIC8vICAgICAgICAgICAgc2hvdWxkIHdlIGtlZXAgaXQgdmlzaWJsZSBpbiBuZXcgcmVkdWNlIGJsb2NrPworICAgIGttcF91c2VyX2xvY2tfcCBsY2s7CisKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworCisgICAga21wX2R5bmFfbG9ja190ICpsayA9IChrbXBfZHluYV9sb2NrX3QgKiljcml0OworICAgIC8vIENoZWNrIGlmIGl0IGlzIGluaXRpYWxpemVkLgorICAgIGlmICgqbGsgPT0gMCkgeworICAgICAgICBpZiAoS01QX0lTX0RfTE9DSyhfX2ttcF91c2VyX2xvY2tfc2VxKSkgeworICAgICAgICAgICAgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCh2b2xhdGlsZSBrbXBfaW50MzIgKiljcml0LCAwLCBLTVBfR0VUX0RfVEFHKF9fa21wX3VzZXJfbG9ja19zZXEpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX2luaXRfaW5kaXJlY3RfY3NwdHIoY3JpdCwgbG9jLCBnbG9iYWxfdGlkLCBLTVBfR0VUX0lfVEFHKF9fa21wX3VzZXJfbG9ja19zZXEpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBCcmFuY2ggZm9yIGFjY2Vzc2luZyB0aGUgYWN0dWFsIGxvY2sgb2JqZWN0IGFuZCBzZXQgb3BlcmF0aW9uLiBUaGlzIGJyYW5jaGluZyBpcyBpbmV2aXRhYmxlIHNpbmNlCisgICAgLy8gdGhpcyBsb2NrIGluaXRpYWxpemF0aW9uIGRvZXMgbm90IGZvbGxvdyB0aGUgbm9ybWFsIGRpc3BhdGNoIHBhdGggKGxvY2sgdGFibGUgaXMgbm90IHVzZWQpLgorICAgIGlmIChLTVBfRVhUUkFDVF9EX1RBRyhsaykgIT0gMCkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKWxrOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGxjayAhPSBOVUxMKTsKKyAgICAgICAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgICAgICAgX19rbXBfcHVzaF9zeW5jKGdsb2JhbF90aWQsIGN0X2NyaXRpY2FsLCBsb2MsIGxjaywgX19rbXBfdXNlcl9sb2NrX3NlcSk7CisgICAgICAgIH0KKyAgICAgICAgS01QX0RfTE9DS19GVU5DKGxrLCBzZXQpKGxrLCBnbG9iYWxfdGlkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBrbXBfaW5kaXJlY3RfbG9ja190ICppbGsgPSAqKChrbXBfaW5kaXJlY3RfbG9ja190ICoqKWxrKTsKKyAgICAgICAgbGNrID0gaWxrLT5sb2NrOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGxjayAhPSBOVUxMKTsKKyAgICAgICAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgICAgICAgX19rbXBfcHVzaF9zeW5jKGdsb2JhbF90aWQsIGN0X2NyaXRpY2FsLCBsb2MsIGxjaywgX19rbXBfdXNlcl9sb2NrX3NlcSk7CisgICAgICAgIH0KKyAgICAgICAgS01QX0lfTE9DS19GVU5DKGlsaywgc2V0KShsY2ssIGdsb2JhbF90aWQpOworICAgIH0KKworI2Vsc2UgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKKworICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgZmFzdCByZWR1Y3Rpb24gY29kZSBpcyBvbmx5IGVtaXR0ZWQgYnkgSW50ZWwgY29tcGlsZXJzCisgICAgLy8gd2l0aCAzMiBieXRlIGNyaXRpY2FsIHNlY3Rpb25zLiBJZiB0aGVyZSBpc24ndCBlbm91Z2ggc3BhY2UsIHRoZW4gd2UKKyAgICAvLyBoYXZlIHRvIHVzZSBhIHBvaW50ZXIuCisgICAgaWYgKCBfX2ttcF9iYXNlX3VzZXJfbG9ja19zaXplIDw9IElOVEVMX0NSSVRJQ0FMX1NJWkUgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApY3JpdDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGxjayA9IF9fa21wX2dldF9jcml0aWNhbF9zZWN0aW9uX3B0ciggY3JpdCwgbG9jLCBnbG9iYWxfdGlkICk7CisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQoIGxjayAhPSBOVUxMICk7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApCisgICAgICAgIF9fa21wX3B1c2hfc3luYyggZ2xvYmFsX3RpZCwgY3RfY3JpdGljYWwsIGxvYywgbGNrICk7CisKKyAgICBfX2ttcF9hY3F1aXJlX3VzZXJfbG9ja193aXRoX2NoZWNrcyggbGNrLCBnbG9iYWxfdGlkICk7CisKKyNlbmRpZiAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworfQorCisvLyB1c2VkIGluIGEgY3JpdGljYWwgc2VjdGlvbiByZWR1Y2UgYmxvY2sKK3N0YXRpYyBfX2ZvcmNlaW5saW5lIHZvaWQKK19fa21wX2VuZF9jcml0aWNhbF9zZWN0aW9uX3JlZHVjZV9ibG9jayggaWRlbnRfdCAqIGxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcF9jcml0aWNhbF9uYW1lICogY3JpdCApIHsKKworICAgIGttcF91c2VyX2xvY2tfcCBsY2s7CisKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworCisgICAgaWYgKEtNUF9JU19EX0xPQ0soX19rbXBfdXNlcl9sb2NrX3NlcSkpIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCljcml0OworICAgICAgICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKQorICAgICAgICAgICAgX19rbXBfcG9wX3N5bmMoZ2xvYmFsX3RpZCwgY3RfY3JpdGljYWwsIGxvYyk7CisgICAgICAgIEtNUF9EX0xPQ0tfRlVOQyhsY2ssIHVuc2V0KSgoa21wX2R5bmFfbG9ja190ICopbGNrLCBnbG9iYWxfdGlkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBrbXBfaW5kaXJlY3RfbG9ja190ICppbGsgPSAoa21wX2luZGlyZWN0X2xvY2tfdCAqKVRDUl9QVFIoKigoa21wX2luZGlyZWN0X2xvY2tfdCAqKiljcml0KSk7CisgICAgICAgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spCisgICAgICAgICAgICBfX2ttcF9wb3Bfc3luYyhnbG9iYWxfdGlkLCBjdF9jcml0aWNhbCwgbG9jKTsKKyAgICAgICAgS01QX0lfTE9DS19GVU5DKGlsaywgdW5zZXQpKGlsay0+bG9jaywgZ2xvYmFsX3RpZCk7CisgICAgfQorCisjZWxzZSAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworCisgICAgLy8gV2Uga25vdyB0aGF0IHRoZSBmYXN0IHJlZHVjdGlvbiBjb2RlIGlzIG9ubHkgZW1pdHRlZCBieSBJbnRlbCBjb21waWxlcnMgd2l0aCAzMiBieXRlIGNyaXRpY2FsCisgICAgLy8gc2VjdGlvbnMuIElmIHRoZXJlIGlzbid0IGVub3VnaCBzcGFjZSwgdGhlbiB3ZSBoYXZlIHRvIHVzZSBhIHBvaW50ZXIuCisgICAgaWYgKCBfX2ttcF9iYXNlX3VzZXJfbG9ja19zaXplID4gMzIgKSB7CisgICAgICAgIGxjayA9ICooIChrbXBfdXNlcl9sb2NrX3AgKikgY3JpdCApOworICAgICAgICBLTVBfQVNTRVJUKCBsY2sgIT0gTlVMTCApOworICAgIH0gZWxzZSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApIGNyaXQ7CisgICAgfQorCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wb3Bfc3luYyggZ2xvYmFsX3RpZCwgY3RfY3JpdGljYWwsIGxvYyApOworCisgICAgX19rbXBfcmVsZWFzZV91c2VyX2xvY2tfd2l0aF9jaGVja3MoIGxjaywgZ2xvYmFsX3RpZCApOworCisjZW5kaWYgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKK30gLy8gX19rbXBfZW5kX2NyaXRpY2FsX3NlY3Rpb25fcmVkdWNlX2Jsb2NrCisKKworLyogMi5hLmkuIFJlZHVjZSBCbG9jayB3aXRob3V0IGEgdGVybWluYXRpbmcgYmFycmllciAqLworLyohCitAaW5ncm91cCBTWU5DSFJPTklaQVRJT04KK0BwYXJhbSBsb2Mgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCitAcGFyYW0gZ2xvYmFsX3RpZCBnbG9iYWwgdGhyZWFkIG51bWJlcgorQHBhcmFtIG51bV92YXJzIG51bWJlciBvZiBpdGVtcyAodmFyaWFibGVzKSB0byBiZSByZWR1Y2VkCitAcGFyYW0gcmVkdWNlX3NpemUgc2l6ZSBvZiBkYXRhIGluIGJ5dGVzIHRvIGJlIHJlZHVjZWQKK0BwYXJhbSByZWR1Y2VfZGF0YSBwb2ludGVyIHRvIGRhdGEgdG8gYmUgcmVkdWNlZAorQHBhcmFtIHJlZHVjZV9mdW5jIGNhbGxiYWNrIGZ1bmN0aW9uIHByb3ZpZGluZyByZWR1Y3Rpb24gb3BlcmF0aW9uIG9uIHR3byBvcGVyYW5kcyBhbmQgcmV0dXJuaW5nIHJlc3VsdCBvZiByZWR1Y3Rpb24gaW4gbGhzX2RhdGEKK0BwYXJhbSBsY2sgcG9pbnRlciB0byB0aGUgdW5pcXVlIGxvY2sgZGF0YSBzdHJ1Y3R1cmUKK0ByZXN1bHQgMSBmb3IgdGhlIG1hc3RlciB0aHJlYWQsIDAgZm9yIGFsbCBvdGhlciB0ZWFtIHRocmVhZHMsIDIgZm9yIGFsbCB0ZWFtIHRocmVhZHMgaWYgYXRvbWljIHJlZHVjdGlvbiBuZWVkZWQKKworVGhlIG5vd2FpdCB2ZXJzaW9uIGlzIHVzZWQgZm9yIGEgcmVkdWNlIGNsYXVzZSB3aXRoIHRoZSBub3dhaXQgYXJndW1lbnQuCisqLwora21wX2ludDMyCitfX2ttcGNfcmVkdWNlX25vd2FpdCgKKyAgICBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLAorICAgIGttcF9pbnQzMiBudW1fdmFycywgc2l6ZV90IHJlZHVjZV9zaXplLCB2b2lkICpyZWR1Y2VfZGF0YSwgdm9pZCAoKnJlZHVjZV9mdW5jKSh2b2lkICpsaHNfZGF0YSwgdm9pZCAqcmhzX2RhdGEpLAorICAgIGttcF9jcml0aWNhbF9uYW1lICpsY2sgKSB7CisKKyAgICBLTVBfQ09VTlRfQkxPQ0soUkVEVUNFX25vd2FpdCk7CisgICAgaW50IHJldHZhbCA9IDA7CisgICAgUEFDS0VEX1JFRFVDVElPTl9NRVRIT0RfVCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZDsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGttcF90ZWFtX3QgKnRlYW07CisgICAga21wX2luZm9fdCAqdGg7CisgICAgaW50IHRlYW1zX3N3YXBwZWQgPSAwLCB0YXNrX3N0YXRlOworI2VuZGlmCisgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcGNfcmVkdWNlX25vd2FpdCgpIGVudGVyOiBjYWxsZWQgVCMlZFxuIiwgZ2xvYmFsX3RpZCApICk7CisKKyAgICAvLyB3aHkgZG8gd2UgbmVlZCB0aGlzIGluaXRpYWxpemF0aW9uIGhlcmUgYXQgYWxsPworICAgIC8vIFJlZHVjdGlvbiBjbGF1c2UgY2FuIG5vdCBiZSB1c2VkIGFzIGEgc3RhbmQtYWxvbmUgZGlyZWN0aXZlLgorCisgICAgLy8gZG8gbm90IGNhbGwgX19rbXBfc2VyaWFsX2luaXRpYWxpemUoKSwgaXQgd2lsbCBiZSBjYWxsZWQgYnkgX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZSgpIGlmIG5lZWRlZAorICAgIC8vIHBvc3NpYmxlIGRldGVjdGlvbiBvZiBmYWxzZS1wb3NpdGl2ZSByYWNlIGJ5IHRoZSB0aHJlYWRjaGVja2VyID8/PworICAgIGlmKCAhIFRDUl80KCBfX2ttcF9pbml0X3BhcmFsbGVsICkgKQorICAgICAgICBfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplKCk7CisKKyAgICAvLyBjaGVjayBjb3JyZWN0bmVzcyBvZiByZWR1Y2UgYmxvY2sgbmVzdGluZworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wdXNoX3N5bmMoIGdsb2JhbF90aWQsIGN0X3JlZHVjZSwgbG9jLCBOVUxMLCAwICk7CisjZWxzZQorICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgX19rbXBfcHVzaF9zeW5jKCBnbG9iYWxfdGlkLCBjdF9yZWR1Y2UsIGxvYywgTlVMTCApOworI2VuZGlmCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIHRoID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZChnbG9iYWxfdGlkKTsKKyAgICBpZiggdGgtPnRoLnRoX3RlYW1zX21pY3JvdGFzayApIHsgICAvLyBBQzogY2hlY2sgaWYgd2UgYXJlIGluc2lkZSB0aGUgdGVhbXMgY29uc3RydWN0PworICAgICAgICB0ZWFtID0gdGgtPnRoLnRoX3RlYW07CisgICAgICAgIGlmKCB0ZWFtLT50LnRfbGV2ZWwgPT0gdGgtPnRoLnRoX3RlYW1zX2xldmVsICkgeworICAgICAgICAgICAgLy8gdGhpcyBpcyByZWR1Y3Rpb24gYXQgdGVhbXMgY29uc3RydWN0CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCF0aC0+dGgudGhfaW5mby5kcy5kc190aWQpOyAgLy8gQUM6IGNoZWNrIHRoYXQgdGlkID09IDAKKyAgICAgICAgICAgIC8vIExldCdzIHN3YXAgdGVhbXMgdGVtcG9yYXJpbHkgZm9yIHRoZSByZWR1Y3Rpb24gYmFycmllcgorICAgICAgICAgICAgdGVhbXNfc3dhcHBlZCA9IDE7CisgICAgICAgICAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aWQgPSB0ZWFtLT50LnRfbWFzdGVyX3RpZDsKKyAgICAgICAgICAgIHRoLT50aC50aF90ZWFtID0gdGVhbS0+dC50X3BhcmVudDsKKyAgICAgICAgICAgIHRoLT50aC50aF90ZWFtX25wcm9jID0gdGgtPnRoLnRoX3RlYW0tPnQudF9ucHJvYzsKKyAgICAgICAgICAgIHRoLT50aC50aF90YXNrX3RlYW0gPSB0aC0+dGgudGhfdGVhbS0+dC50X3Rhc2tfdGVhbVswXTsKKyAgICAgICAgICAgIHRhc2tfc3RhdGUgPSB0aC0+dGgudGhfdGFza19zdGF0ZTsKKyAgICAgICAgICAgIHRoLT50aC50aF90YXNrX3N0YXRlID0gMDsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorCisgICAgLy8gcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgdmFsdWUgd2lsbCBiZSByZXVzZWQgYnkgX19rbXBfZW5kX3JlZHVjZSogZnVuY3Rpb24sIHRoZSB2YWx1ZSBzaG91bGQgYmUga2VwdCBpbiBhIHZhcmlhYmxlCisgICAgLy8gdGhlIHZhcmlhYmxlIHNob3VsZCBiZSBlaXRoZXIgYSBjb25zdHJ1Y3Qtc3BlY2lmaWMgb3IgdGhyZWFkLXNwZWNpZmljIHByb3BlcnR5LCBub3QgYSB0ZWFtIHNwZWNpZmljIHByb3BlcnR5CisgICAgLy8gICAgIChhIHRocmVhZCBjYW4gcmVhY2ggdGhlIG5leHQgcmVkdWNlIGJsb2NrIG9uIHRoZSBuZXh0IGNvbnN0cnVjdCwgcmVkdWNlIG1ldGhvZCBtYXkgZGlmZmVyIG9uIHRoZSBuZXh0IGNvbnN0cnVjdCkKKyAgICAvLyBhbiBpZGVudF90ICJsb2MiIHBhcmFtZXRlciBjb3VsZCBiZSB1c2VkIGFzIGEgY29uc3RydWN0LXNwZWNpZmljIHByb3BlcnR5ICh3aGF0IGlmIGxvYyA9PSAwPykKKyAgICAvLyAgICAgKGlmIGJvdGggY29uc3RydWN0LXNwZWNpZmljIGFuZCB0ZWFtLXNwZWNpZmljIHZhcmlhYmxlcyB3ZXJlIHNoYXJlZCwgdGhlbiB1bm5lc3MgZXh0cmEgc3luY3Mgc2hvdWxkIGJlIG5lZWRlZCkKKyAgICAvLyBhIHRocmVhZC1zcGVjaWZpYyB2YXJpYWJsZSBpcyBiZXR0ZXIgcmVnYXJkaW5nIHR3byBpc3N1ZXMgYWJvdmUgKG5leHQgY29uc3RydWN0IGFuZCBleHRyYSBzeW5jcykKKyAgICAvLyBhIHRocmVhZC1zcGVjaWZpYyAidGhfbG9jYWwucmVkdWN0aW9uX21ldGhvZCIgdmFyaWFibGUgaXMgdXNlZCBjdXJyZW50bHkKKyAgICAvLyBlYWNoIHRocmVhZCBleGVjdXRlcyAnZGV0ZXJtaW5lJyBhbmQgJ3NldCcgbGluZXMgKG5vIG5lZWQgdG8gZXhlY3V0ZSBieSBvbmUgdGhyZWFkLCB0byBhdm9pZCB1bm5lc3MgZXh0cmEgc3luY3MpCisKKyAgICBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCA9IF9fa21wX2RldGVybWluZV9yZWR1Y3Rpb25fbWV0aG9kKCBsb2MsIGdsb2JhbF90aWQsIG51bV92YXJzLCByZWR1Y2Vfc2l6ZSwgcmVkdWNlX2RhdGEsIHJlZHVjZV9mdW5jLCBsY2sgKTsKKyAgICBfX0tNUF9TRVRfUkVEVUNUSU9OX01FVEhPRCggZ2xvYmFsX3RpZCwgcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgKTsKKworICAgIGlmKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCA9PSBjcml0aWNhbF9yZWR1Y2VfYmxvY2sgKSB7CisKKyAgICAgICAgX19rbXBfZW50ZXJfY3JpdGljYWxfc2VjdGlvbl9yZWR1Y2VfYmxvY2soIGxvYywgZ2xvYmFsX3RpZCwgbGNrICk7CisgICAgICAgIHJldHZhbCA9IDE7CisKKyAgICB9IGVsc2UgaWYoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kID09IGVtcHR5X3JlZHVjZV9ibG9jayApIHsKKworICAgICAgICAvLyB1c2FnZTogaWYgdGVhbSBzaXplID09IDEsIG5vIHN5bmNocm9uaXphdGlvbiBpcyByZXF1aXJlZCAoIEludGVsIHBsYXRmb3JtcyBvbmx5ICkKKyAgICAgICAgcmV0dmFsID0gMTsKKworICAgIH0gZWxzZSBpZiggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgPT0gYXRvbWljX3JlZHVjZV9ibG9jayApIHsKKworICAgICAgICByZXR2YWwgPSAyOworCisgICAgICAgIC8vIGFsbCB0aHJlYWRzIHNob3VsZCBkbyB0aGlzIHBvcCBoZXJlIChiZWNhdXNlIF9fa21wY19lbmRfcmVkdWNlX25vd2FpdCgpIHdvbid0IGJlIGNhbGxlZCBieSB0aGUgY29kZSBnZW4pCisgICAgICAgIC8vICAgICAoaXQncyBub3QgcXVpdGUgZ29vZCwgYmVjYXVzZSB0aGUgY2hlY2tpbmcgYmxvY2sgaGFzIGJlZW4gY2xvc2VkIGJ5IHRoaXMgJ3BvcCcsCisgICAgICAgIC8vICAgICAgYnV0IGF0b21pYyBvcGVyYXRpb24gaGFzIG5vdCBiZWVuIGV4ZWN1dGVkIHlldCwgd2lsbCBiZSBleGVjdXRlZCBzbGlnaHRseSBsYXRlciwgbGl0ZXJhbGx5IG9uIG5leHQgaW5zdHJ1Y3Rpb24pCisgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgICAgIF9fa21wX3BvcF9zeW5jKCBnbG9iYWxfdGlkLCBjdF9yZWR1Y2UsIGxvYyApOworCisgICAgfSBlbHNlIGlmKCBURVNUX1JFRFVDVElPTl9NRVRIT0QoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kLCB0cmVlX3JlZHVjZV9ibG9jayApICkgeworCisgICAgICAgIC8vQVQ6IHBlcmZvcm1hbmNlIGlzc3VlOiBhIHJlYWwgYmFycmllciBoZXJlCisgICAgICAgIC8vQVQ6ICAgICAoaWYgbWFzdGVyIGdvZXMgc2xvdywgb3RoZXIgdGhyZWFkcyBhcmUgYmxvY2tlZCBoZXJlIHdhaXRpbmcgZm9yIHRoZSBtYXN0ZXIgdG8gY29tZSBhbmQgcmVsZWFzZSB0aGVtKQorICAgICAgICAvL0FUOiAgICAgKGl0J3Mgbm90IHdoYXQgYSBjdXN0b21lciBtaWdodCBleHBlY3Qgc3BlY2lmeWluZyBOT1dBSVQgY2xhdXNlKQorICAgICAgICAvL0FUOiAgICAgKHNwZWNpZnlpbmcgTk9XQUlUIHdvbid0IHJlc3VsdCBpbiBpbXByb3ZlbWVudCBvZiBwZXJmb3JtYW5jZSwgaXQnbGwgYmUgY29uZnVzaW5nIHRvIGEgY3VzdG9tZXIpCisgICAgICAgIC8vQVQ6IGFub3RoZXIgaW1wbGVtZW50YXRpb24gb2YgKmJhcnJpZXJfZ2F0aGVyKm5vd2FpdCgpIChvciBzb21lIG90aGVyIGRlc2lnbikgbWlnaHQgZ28gZmFzdGVyCisgICAgICAgIC8vICAgICAgICBhbmQgYmUgbW9yZSBpbiBsaW5lIHdpdGggc2Vuc2Ugb2YgTk9XQUlUCisgICAgICAgIC8vQVQ6IFRPIERPOiBkbyBlcGNjIHRlc3QgYW5kIGNvbXBhcmUgdGltZXMKKworICAgICAgICAvLyB0aGlzIGJhcnJpZXIgc2hvdWxkIGJlIGludmlzaWJsZSB0byBhIGN1c3RvbWVyIGFuZCB0byB0aGUgdGhyZWFkaW5nIHByb2ZpbGUgdG9vbAorICAgICAgICAvLyAgICAgICAgICAgICAgKGl0J3MgbmVpdGhlciBhIHRlcm1pbmF0aW5nIGJhcnJpZXIgbm9yIGN1c3RvbWVyJ3MgY29kZSwgaXQncyB1c2VkIGZvciBhbiBpbnRlcm5hbCBwdXJwb3NlKQorI2lmIFVTRV9JVFRfTk9USUZZCisgICAgICAgIF9fa21wX3RocmVhZHNbZ2xvYmFsX3RpZF0tPnRoLnRoX2lkZW50ID0gbG9jOworI2VuZGlmCisgICAgICAgIHJldHZhbCA9IF9fa21wX2JhcnJpZXIoIFVOUEFDS19SRURVQ1RJT05fQkFSUklFUiggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgKSwgZ2xvYmFsX3RpZCwgRkFMU0UsIHJlZHVjZV9zaXplLCByZWR1Y2VfZGF0YSwgcmVkdWNlX2Z1bmMgKTsKKyAgICAgICAgcmV0dmFsID0gKCByZXR2YWwgIT0gMCApID8gKCAwICkgOiAoIDEgKTsKKworICAgICAgICAvLyBhbGwgb3RoZXIgd29ya2VycyBleGNlcHQgbWFzdGVyIHNob3VsZCBkbyB0aGlzIHBvcCBoZXJlCisgICAgICAgIC8vICAgICAoIG5vbmUgb2Ygb3RoZXIgd29ya2VycyB3aWxsIGdldCB0byBfX2ttcGNfZW5kX3JlZHVjZV9ub3dhaXQoKSApCisgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAgICAgaWYoIHJldHZhbCA9PSAwICkgeworICAgICAgICAgICAgICAgIF9fa21wX3BvcF9zeW5jKCBnbG9iYWxfdGlkLCBjdF9yZWR1Y2UsIGxvYyApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9IGVsc2UgeworCisgICAgICAgIC8vIHNob3VsZCBuZXZlciByZWFjaCB0aGlzIGJsb2NrCisgICAgICAgIEtNUF9BU1NFUlQoIDAgKTsgLy8gInVuZXhwZWN0ZWQgbWV0aG9kIgorCisgICAgfQorI2lmIE9NUF80MF9FTkFCTEVECisgICAgaWYoIHRlYW1zX3N3YXBwZWQgKSB7CisgICAgICAgIC8vIFJlc3RvcmUgdGhyZWFkIHN0cnVjdHVyZQorICAgICAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aWQgPSAwOworICAgICAgICB0aC0+dGgudGhfdGVhbSA9IHRlYW07CisgICAgICAgIHRoLT50aC50aF90ZWFtX25wcm9jID0gdGVhbS0+dC50X25wcm9jOworICAgICAgICB0aC0+dGgudGhfdGFza190ZWFtID0gdGVhbS0+dC50X3Rhc2tfdGVhbVt0YXNrX3N0YXRlXTsKKyAgICAgICAgdGgtPnRoLnRoX3Rhc2tfc3RhdGUgPSB0YXNrX3N0YXRlOworICAgIH0KKyNlbmRpZgorICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBjX3JlZHVjZV9ub3dhaXQoKSBleGl0OiBjYWxsZWQgVCMlZDogbWV0aG9kICUwOHgsIHJldHVybnMgJTA4eFxuIiwgZ2xvYmFsX3RpZCwgcGFja2VkX3JlZHVjdGlvbl9tZXRob2QsIHJldHZhbCApICk7CisKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisvKiEKK0Bpbmdyb3VwIFNZTkNIUk9OSVpBVElPTgorQHBhcmFtIGxvYyBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KK0BwYXJhbSBnbG9iYWxfdGlkIGdsb2JhbCB0aHJlYWQgaWQuCitAcGFyYW0gbGNrIHBvaW50ZXIgdG8gdGhlIHVuaXF1ZSBsb2NrIGRhdGEgc3RydWN0dXJlCisKK0ZpbmlzaCB0aGUgZXhlY3V0aW9uIG9mIGEgcmVkdWNlIG5vd2FpdC4KKyovCit2b2lkCitfX2ttcGNfZW5kX3JlZHVjZV9ub3dhaXQoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcF9jcml0aWNhbF9uYW1lICpsY2sgKSB7CisKKyAgICBQQUNLRURfUkVEVUNUSU9OX01FVEhPRF9UIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kOworCisgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcGNfZW5kX3JlZHVjZV9ub3dhaXQoKSBlbnRlcjogY2FsbGVkIFQjJWRcbiIsIGdsb2JhbF90aWQgKSApOworCisgICAgcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgPSBfX0tNUF9HRVRfUkVEVUNUSU9OX01FVEhPRCggZ2xvYmFsX3RpZCApOworCisgICAgaWYoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kID09IGNyaXRpY2FsX3JlZHVjZV9ibG9jayApIHsKKworICAgICAgICBfX2ttcF9lbmRfY3JpdGljYWxfc2VjdGlvbl9yZWR1Y2VfYmxvY2soIGxvYywgZ2xvYmFsX3RpZCwgbGNrICk7CisKKyAgICB9IGVsc2UgaWYoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kID09IGVtcHR5X3JlZHVjZV9ibG9jayApIHsKKworICAgICAgICAvLyB1c2FnZTogaWYgdGVhbSBzaXplID09IDEsIG5vIHN5bmNocm9uaXphdGlvbiBpcyByZXF1aXJlZCAoIG9uIEludGVsIHBsYXRmb3JtcyBvbmx5ICkKKworICAgIH0gZWxzZSBpZiggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgPT0gYXRvbWljX3JlZHVjZV9ibG9jayApIHsKKworICAgICAgICAvLyBuZWl0aGVyIG1hc3RlciBub3Igb3RoZXIgd29ya2VycyBzaG91bGQgZ2V0IGhlcmUKKyAgICAgICAgLy8gICAgIChjb2RlIGdlbiBkb2VzIG5vdCBnZW5lcmF0ZSB0aGlzIGNhbGwgaW4gY2FzZSAyOiBhdG9taWMgcmVkdWNlIGJsb2NrKQorICAgICAgICAvLyBhY3R1YWxseSBpdCdzIGJldHRlciB0byByZW1vdmUgdGhpcyBlbHNlaWYgYXQgYWxsOworICAgICAgICAvLyBhZnRlciByZW1vdmFsIHRoaXMgdmFsdWUgd2lsbCBjaGVja2VkIGJ5IHRoZSAnZWxzZScgYW5kIHdpbGwgYXNzZXJ0CisKKyAgICB9IGVsc2UgaWYoIFRFU1RfUkVEVUNUSU9OX01FVEhPRCggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QsIHRyZWVfcmVkdWNlX2Jsb2NrICkgKSB7CisKKyAgICAgICAgLy8gb25seSBtYXN0ZXIgZ2V0cyBoZXJlCisKKyAgICB9IGVsc2UgeworCisgICAgICAgIC8vIHNob3VsZCBuZXZlciByZWFjaCB0aGlzIGJsb2NrCisgICAgICAgIEtNUF9BU1NFUlQoIDAgKTsgLy8gInVuZXhwZWN0ZWQgbWV0aG9kIgorCisgICAgfQorCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wb3Bfc3luYyggZ2xvYmFsX3RpZCwgY3RfcmVkdWNlLCBsb2MgKTsKKworICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBjX2VuZF9yZWR1Y2Vfbm93YWl0KCkgZXhpdDogY2FsbGVkIFQjJWQ6IG1ldGhvZCAlMDh4XG4iLCBnbG9iYWxfdGlkLCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCApICk7CisKKyAgICByZXR1cm47Cit9CisKKy8qIDIuYS5paS4gUmVkdWNlIEJsb2NrIHdpdGggYSB0ZXJtaW5hdGluZyBiYXJyaWVyICovCisKKy8qIQorQGluZ3JvdXAgU1lOQ0hST05JWkFUSU9OCitAcGFyYW0gbG9jIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGdsb2JhbF90aWQgZ2xvYmFsIHRocmVhZCBudW1iZXIKK0BwYXJhbSBudW1fdmFycyBudW1iZXIgb2YgaXRlbXMgKHZhcmlhYmxlcykgdG8gYmUgcmVkdWNlZAorQHBhcmFtIHJlZHVjZV9zaXplIHNpemUgb2YgZGF0YSBpbiBieXRlcyB0byBiZSByZWR1Y2VkCitAcGFyYW0gcmVkdWNlX2RhdGEgcG9pbnRlciB0byBkYXRhIHRvIGJlIHJlZHVjZWQKK0BwYXJhbSByZWR1Y2VfZnVuYyBjYWxsYmFjayBmdW5jdGlvbiBwcm92aWRpbmcgcmVkdWN0aW9uIG9wZXJhdGlvbiBvbiB0d28gb3BlcmFuZHMgYW5kIHJldHVybmluZyByZXN1bHQgb2YgcmVkdWN0aW9uIGluIGxoc19kYXRhCitAcGFyYW0gbGNrIHBvaW50ZXIgdG8gdGhlIHVuaXF1ZSBsb2NrIGRhdGEgc3RydWN0dXJlCitAcmVzdWx0IDEgZm9yIHRoZSBtYXN0ZXIgdGhyZWFkLCAwIGZvciBhbGwgb3RoZXIgdGVhbSB0aHJlYWRzLCAyIGZvciBhbGwgdGVhbSB0aHJlYWRzIGlmIGF0b21pYyByZWR1Y3Rpb24gbmVlZGVkCisKK0EgYmxvY2tpbmcgcmVkdWNlIHRoYXQgaW5jbHVkZXMgYW4gaW1wbGljaXQgYmFycmllci4KKyovCitrbXBfaW50MzIKK19fa21wY19yZWR1Y2UoCisgICAgaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwKKyAgICBrbXBfaW50MzIgbnVtX3ZhcnMsIHNpemVfdCByZWR1Y2Vfc2l6ZSwgdm9pZCAqcmVkdWNlX2RhdGEsCisgICAgdm9pZCAoKnJlZHVjZV9mdW5jKSh2b2lkICpsaHNfZGF0YSwgdm9pZCAqcmhzX2RhdGEpLAorICAgIGttcF9jcml0aWNhbF9uYW1lICpsY2sgKQoreworICAgIEtNUF9DT1VOVF9CTE9DSyhSRURVQ0Vfd2FpdCk7CisgICAgaW50IHJldHZhbCA9IDA7CisgICAgUEFDS0VEX1JFRFVDVElPTl9NRVRIT0RfVCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZDsKKworICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBjX3JlZHVjZSgpIGVudGVyOiBjYWxsZWQgVCMlZFxuIiwgZ2xvYmFsX3RpZCApICk7CisKKyAgICAvLyB3aHkgZG8gd2UgbmVlZCB0aGlzIGluaXRpYWxpemF0aW9uIGhlcmUgYXQgYWxsPworICAgIC8vIFJlZHVjdGlvbiBjbGF1c2UgY2FuIG5vdCBiZSBhIHN0YW5kLWFsb25lIGRpcmVjdGl2ZS4KKworICAgIC8vIGRvIG5vdCBjYWxsIF9fa21wX3NlcmlhbF9pbml0aWFsaXplKCksIGl0IHdpbGwgYmUgY2FsbGVkIGJ5IF9fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoKSBpZiBuZWVkZWQKKyAgICAvLyBwb3NzaWJsZSBkZXRlY3Rpb24gb2YgZmFsc2UtcG9zaXRpdmUgcmFjZSBieSB0aGUgdGhyZWFkY2hlY2tlciA/Pz8KKyAgICBpZiggISBUQ1JfNCggX19rbXBfaW5pdF9wYXJhbGxlbCApICkKKyAgICAgICAgX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZSgpOworCisgICAgLy8gY2hlY2sgY29ycmVjdG5lc3Mgb2YgcmVkdWNlIGJsb2NrIG5lc3RpbmcKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgX19rbXBfcHVzaF9zeW5jKCBnbG9iYWxfdGlkLCBjdF9yZWR1Y2UsIGxvYywgTlVMTCwgMCApOworI2Vsc2UKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApCisgICAgICAgIF9fa21wX3B1c2hfc3luYyggZ2xvYmFsX3RpZCwgY3RfcmVkdWNlLCBsb2MsIE5VTEwgKTsKKyNlbmRpZgorCisgICAgcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgPSBfX2ttcF9kZXRlcm1pbmVfcmVkdWN0aW9uX21ldGhvZCggbG9jLCBnbG9iYWxfdGlkLCBudW1fdmFycywgcmVkdWNlX3NpemUsIHJlZHVjZV9kYXRhLCByZWR1Y2VfZnVuYywgbGNrICk7CisgICAgX19LTVBfU0VUX1JFRFVDVElPTl9NRVRIT0QoIGdsb2JhbF90aWQsIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kICk7CisKKyAgICBpZiggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgPT0gY3JpdGljYWxfcmVkdWNlX2Jsb2NrICkgeworCisgICAgICAgIF9fa21wX2VudGVyX2NyaXRpY2FsX3NlY3Rpb25fcmVkdWNlX2Jsb2NrKCBsb2MsIGdsb2JhbF90aWQsIGxjayApOworICAgICAgICByZXR2YWwgPSAxOworCisgICAgfSBlbHNlIGlmKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCA9PSBlbXB0eV9yZWR1Y2VfYmxvY2sgKSB7CisKKyAgICAgICAgLy8gdXNhZ2U6IGlmIHRlYW0gc2l6ZSA9PSAxLCBubyBzeW5jaHJvbml6YXRpb24gaXMgcmVxdWlyZWQgKCBJbnRlbCBwbGF0Zm9ybXMgb25seSApCisgICAgICAgIHJldHZhbCA9IDE7CisKKyAgICB9IGVsc2UgaWYoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kID09IGF0b21pY19yZWR1Y2VfYmxvY2sgKSB7CisKKyAgICAgICAgcmV0dmFsID0gMjsKKworICAgIH0gZWxzZSBpZiggVEVTVF9SRURVQ1RJT05fTUVUSE9EKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCwgdHJlZV9yZWR1Y2VfYmxvY2sgKSApIHsKKworICAgICAgICAvL2Nhc2UgdHJlZV9yZWR1Y2VfYmxvY2s6CisgICAgICAgIC8vIHRoaXMgYmFycmllciBzaG91bGQgYmUgdmlzaWJsZSB0byBhIGN1c3RvbWVyIGFuZCB0byB0aGUgdGhyZWFkaW5nIHByb2ZpbGUgdG9vbAorICAgICAgICAvLyAgICAgICAgICAgICAgKGl0J3MgYSB0ZXJtaW5hdGluZyBiYXJyaWVyIG9uIGNvbnN0cnVjdHMgaWYgTk9XQUlUIG5vdCBzcGVjaWZpZWQpCisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgX19rbXBfdGhyZWFkc1tnbG9iYWxfdGlkXS0+dGgudGhfaWRlbnQgPSBsb2M7IC8vIG5lZWRlZCBmb3IgY29ycmVjdCBub3RpZmljYXRpb24gb2YgZnJhbWVzCisjZW5kaWYKKyAgICAgICAgcmV0dmFsID0gX19rbXBfYmFycmllciggVU5QQUNLX1JFRFVDVElPTl9CQVJSSUVSKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCApLCBnbG9iYWxfdGlkLCBUUlVFLCByZWR1Y2Vfc2l6ZSwgcmVkdWNlX2RhdGEsIHJlZHVjZV9mdW5jICk7CisgICAgICAgIHJldHZhbCA9ICggcmV0dmFsICE9IDAgKSA/ICggMCApIDogKCAxICk7CisKKyAgICAgICAgLy8gYWxsIG90aGVyIHdvcmtlcnMgZXhjZXB0IG1hc3RlciBzaG91bGQgZG8gdGhpcyBwb3AgaGVyZQorICAgICAgICAvLyAgICAgKCBub25lIG9mIG90aGVyIHdvcmtlcnMgZXhjZXB0IG1hc3RlciB3aWxsIGVudGVyIF9fa21wY19lbmRfcmVkdWNlKCkgKQorICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgICAgIGlmKCByZXR2YWwgPT0gMCApIHsgLy8gMDogYWxsIG90aGVyIHdvcmtlcnM7IDE6IG1hc3RlcgorICAgICAgICAgICAgICAgIF9fa21wX3BvcF9zeW5jKCBnbG9iYWxfdGlkLCBjdF9yZWR1Y2UsIGxvYyApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9IGVsc2UgeworCisgICAgICAgIC8vIHNob3VsZCBuZXZlciByZWFjaCB0aGlzIGJsb2NrCisgICAgICAgIEtNUF9BU1NFUlQoIDAgKTsgLy8gInVuZXhwZWN0ZWQgbWV0aG9kIgorCisgICAgfQorCisgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcGNfcmVkdWNlKCkgZXhpdDogY2FsbGVkIFQjJWQ6IG1ldGhvZCAlMDh4LCByZXR1cm5zICUwOHhcbiIsIGdsb2JhbF90aWQsIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kLCByZXR2YWwgKSApOworCisgICAgcmV0dXJuIHJldHZhbDsKK30KKworLyohCitAaW5ncm91cCBTWU5DSFJPTklaQVRJT04KK0BwYXJhbSBsb2Mgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCitAcGFyYW0gZ2xvYmFsX3RpZCBnbG9iYWwgdGhyZWFkIGlkLgorQHBhcmFtIGxjayBwb2ludGVyIHRvIHRoZSB1bmlxdWUgbG9jayBkYXRhIHN0cnVjdHVyZQorCitGaW5pc2ggdGhlIGV4ZWN1dGlvbiBvZiBhIGJsb2NraW5nIHJlZHVjZS4KK1RoZSA8dHQ+bGNrPC90dD4gcG9pbnRlciBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoYXQgdXNlZCBpbiB0aGUgY29ycmVzcG9uZGluZyBzdGFydCBmdW5jdGlvbi4KKyovCit2b2lkCitfX2ttcGNfZW5kX3JlZHVjZSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wX2NyaXRpY2FsX25hbWUgKmxjayApIHsKKworICAgIFBBQ0tFRF9SRURVQ1RJT05fTUVUSE9EX1QgcGFja2VkX3JlZHVjdGlvbl9tZXRob2Q7CisKKyAgICBLQV9UUkFDRSggMTAsICggIl9fa21wY19lbmRfcmVkdWNlKCkgZW50ZXI6IGNhbGxlZCBUIyVkXG4iLCBnbG9iYWxfdGlkICkgKTsKKworICAgIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kID0gX19LTVBfR0VUX1JFRFVDVElPTl9NRVRIT0QoIGdsb2JhbF90aWQgKTsKKworICAgIC8vIHRoaXMgYmFycmllciBzaG91bGQgYmUgdmlzaWJsZSB0byBhIGN1c3RvbWVyIGFuZCB0byB0aGUgdGhyZWFkaW5nIHByb2ZpbGUgdG9vbAorICAgIC8vICAgICAgICAgICAgICAoaXQncyBhIHRlcm1pbmF0aW5nIGJhcnJpZXIgb24gY29uc3RydWN0cyBpZiBOT1dBSVQgbm90IHNwZWNpZmllZCkKKworICAgIGlmKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCA9PSBjcml0aWNhbF9yZWR1Y2VfYmxvY2sgKSB7CisKKyAgICAgICAgX19rbXBfZW5kX2NyaXRpY2FsX3NlY3Rpb25fcmVkdWNlX2Jsb2NrKCBsb2MsIGdsb2JhbF90aWQsIGxjayApOworCisgICAgICAgIC8vIFRPRE86IGltcGxpY2l0IGJhcnJpZXI6IHNob3VsZCBiZSBleHBvc2VkCisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgX19rbXBfdGhyZWFkc1tnbG9iYWxfdGlkXS0+dGgudGhfaWRlbnQgPSBsb2M7CisjZW5kaWYKKyAgICAgICAgX19rbXBfYmFycmllciggYnNfcGxhaW5fYmFycmllciwgZ2xvYmFsX3RpZCwgRkFMU0UsIDAsIE5VTEwsIE5VTEwgKTsKKworICAgIH0gZWxzZSBpZiggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgPT0gZW1wdHlfcmVkdWNlX2Jsb2NrICkgeworCisgICAgICAgIC8vIHVzYWdlOiBpZiB0ZWFtIHNpemUgPT0gMSwgbm8gc3luY2hyb25pemF0aW9uIGlzIHJlcXVpcmVkICggSW50ZWwgcGxhdGZvcm1zIG9ubHkgKQorCisgICAgICAgIC8vIFRPRE86IGltcGxpY2l0IGJhcnJpZXI6IHNob3VsZCBiZSBleHBvc2VkCisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgX19rbXBfdGhyZWFkc1tnbG9iYWxfdGlkXS0+dGgudGhfaWRlbnQgPSBsb2M7CisjZW5kaWYKKyAgICAgICAgX19rbXBfYmFycmllciggYnNfcGxhaW5fYmFycmllciwgZ2xvYmFsX3RpZCwgRkFMU0UsIDAsIE5VTEwsIE5VTEwgKTsKKworICAgIH0gZWxzZSBpZiggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgPT0gYXRvbWljX3JlZHVjZV9ibG9jayApIHsKKworICAgICAgICAvLyBUT0RPOiBpbXBsaWNpdCBiYXJyaWVyOiBzaG91bGQgYmUgZXhwb3NlZAorI2lmIFVTRV9JVFRfTk9USUZZCisgICAgICAgIF9fa21wX3RocmVhZHNbZ2xvYmFsX3RpZF0tPnRoLnRoX2lkZW50ID0gbG9jOworI2VuZGlmCisgICAgICAgIF9fa21wX2JhcnJpZXIoIGJzX3BsYWluX2JhcnJpZXIsIGdsb2JhbF90aWQsIEZBTFNFLCAwLCBOVUxMLCBOVUxMICk7CisKKyAgICB9IGVsc2UgaWYoIFRFU1RfUkVEVUNUSU9OX01FVEhPRCggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QsIHRyZWVfcmVkdWNlX2Jsb2NrICkgKSB7CisKKyAgICAgICAgLy8gb25seSBtYXN0ZXIgZXhlY3V0ZXMgaGVyZSAobWFzdGVyIHJlbGVhc2VzIGFsbCBvdGhlciB3b3JrZXJzKQorICAgICAgICBfX2ttcF9lbmRfc3BsaXRfYmFycmllciggVU5QQUNLX1JFRFVDVElPTl9CQVJSSUVSKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCApLCBnbG9iYWxfdGlkICk7CisKKyAgICB9IGVsc2UgeworCisgICAgICAgIC8vIHNob3VsZCBuZXZlciByZWFjaCB0aGlzIGJsb2NrCisgICAgICAgIEtNUF9BU1NFUlQoIDAgKTsgLy8gInVuZXhwZWN0ZWQgbWV0aG9kIgorCisgICAgfQorCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wb3Bfc3luYyggZ2xvYmFsX3RpZCwgY3RfcmVkdWNlLCBsb2MgKTsKKworICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBjX2VuZF9yZWR1Y2UoKSBleGl0OiBjYWxsZWQgVCMlZDogbWV0aG9kICUwOHhcbiIsIGdsb2JhbF90aWQsIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kICkgKTsKKworICAgIHJldHVybjsKK30KKworI3VuZGVmIF9fS01QX0dFVF9SRURVQ1RJT05fTUVUSE9ECisjdW5kZWYgX19LTVBfU0VUX1JFRFVDVElPTl9NRVRIT0QKKworLyotLSBlbmQgb2YgaW50ZXJmYWNlIHRvIGZhc3Qgc2NhbGFibGUgcmVkdWNlIHJvdXRpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2ttcF91aW50NjQKK19fa21wY19nZXRfdGFza2lkKCkgeworCisgICAga21wX2ludDMyICAgIGd0aWQ7CisgICAga21wX2luZm9fdCAqIHRocmVhZDsKKworICAgIGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworICAgIGlmICggZ3RpZCA8IDAgKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH07IC8vIGlmCisgICAgdGhyZWFkID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZCggZ3RpZCApOworICAgIHJldHVybiB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfdGFza19pZDsKKworfSAvLyBfX2ttcGNfZ2V0X3Rhc2tpZAorCisKK2ttcF91aW50NjQKK19fa21wY19nZXRfcGFyZW50X3Rhc2tpZCgpIHsKKworICAgIGttcF9pbnQzMiAgICAgICAgZ3RpZDsKKyAgICBrbXBfaW5mb190ICogICAgIHRocmVhZDsKKyAgICBrbXBfdGFza2RhdGFfdCAqIHBhcmVudF90YXNrOworCisgICAgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7CisgICAgaWYgKCBndGlkIDwgMCApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfTsgLy8gaWYKKyAgICB0aHJlYWQgICAgICA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICBwYXJlbnRfdGFzayA9IHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9wYXJlbnQ7CisgICAgcmV0dXJuICggcGFyZW50X3Rhc2sgPT0gTlVMTCA/IDAgOiBwYXJlbnRfdGFzay0+dGRfdGFza19pZCApOworCit9IC8vIF9fa21wY19nZXRfcGFyZW50X3Rhc2tpZAorCit2b2lkIF9fa21wY19wbGFjZV90aHJlYWRzKGludCBuUywgaW50IHNPLCBpbnQgbkMsIGludCBjTywgaW50IG5UKQoreworICAgIGlmICggISBfX2ttcF9pbml0X3NlcmlhbCApIHsKKyAgICAgICAgX19rbXBfc2VyaWFsX2luaXRpYWxpemUoKTsKKyAgICB9CisgICAgX19rbXBfcGxhY2VfbnVtX3NvY2tldHMgPSBuUzsKKyAgICBfX2ttcF9wbGFjZV9zb2NrZXRfb2Zmc2V0ID0gc087CisgICAgX19rbXBfcGxhY2VfbnVtX2NvcmVzID0gbkM7CisgICAgX19rbXBfcGxhY2VfY29yZV9vZmZzZXQgPSBjTzsKKyAgICBfX2ttcF9wbGFjZV9udW1fdGhyZWFkc19wZXJfY29yZSA9IG5UOworfQorCisvLyBlbmQgb2YgZmlsZSAvLworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfZGVidWcuYyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9kZWJ1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYmZmYTUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZGVidWcuYwpAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAqIGttcF9kZWJ1Zy5jIC0tIGRlYnVnIHV0aWxpdGllcyBmb3IgdGhlIEd1aWRlIGxpYnJhcnkKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9kZWJ1Zy5oIiAvKiByZWFsbHkgbmVjZXNzYXJ5PyAqLworI2luY2x1ZGUgImttcF9pMThuLmgiCisjaW5jbHVkZSAia21wX2lvLmgiCisKKyNpZmRlZiBLTVBfREVCVUcKK3ZvaWQKK19fa21wX2RlYnVnX3ByaW50Zl9zdGRvdXQoIGNoYXIgY29uc3QgKiBmb3JtYXQsIC4uLiApCit7CisgICAgdmFfbGlzdCBhcDsKKyAgICB2YV9zdGFydCggYXAsIGZvcm1hdCApOworCisgICAgX19rbXBfdnByaW50Zigga21wX291dCwgZm9ybWF0LCBhcCApOworCisgICAgdmFfZW5kKGFwKTsKK30KKyNlbmRpZgorCit2b2lkCitfX2ttcF9kZWJ1Z19wcmludGYoIGNoYXIgY29uc3QgKiBmb3JtYXQsIC4uLiApCit7CisgICAgdmFfbGlzdCBhcDsKKyAgICB2YV9zdGFydCggYXAsIGZvcm1hdCApOworCisgICAgX19rbXBfdnByaW50Zigga21wX2VyciwgZm9ybWF0LCBhcCApOworCisgICAgdmFfZW5kKCBhcCApOworfQorCisjaWZkZWYgS01QX1VTRV9BU1NFUlQKKyAgICBpbnQKKyAgICBfX2ttcF9kZWJ1Z19hc3NlcnQoCisgICAgICAgIGNoYXIgY29uc3QgKiAgbXNnLAorICAgICAgICBjaGFyIGNvbnN0ICogIGZpbGUsCisgICAgICAgIGludCAgICAgICAgICAgbGluZQorICAgICkgeworCisgICAgICAgIGlmICggZmlsZSA9PSBOVUxMICkgeworICAgICAgICAgICAgZmlsZSA9IEtNUF9JMThOX1NUUiggVW5rbm93bkZpbGUgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFJlbW92ZSBkaXJlY3RvcmllcyBmcm9tIHBhdGgsIGxlYXZlIG9ubHkgZmlsZSBuYW1lLiBGaWxlIG5hbWUgaXMgZW5vdWdoLCB0aGVyZSBpcyBubyBuZWVkCisgICAgICAgICAgICAvLyBpbiBib3RoZXJpbmcgZGV2ZWxvcGVycyBhbmQgY3VzdG9tZXJzIHdpdGggZnVsbCBwYXRocy4KKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiBzbGFzaCA9IHN0cnJjaHIoIGZpbGUsICcvJyApOworICAgICAgICAgICAgaWYgKCBzbGFzaCAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIGZpbGUgPSBzbGFzaCArIDE7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9OyAvLyBpZgorCisgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfc3RkaW9fbG9jayApOworICAgICAgICAgICAgX19rbXBfZGVidWdfcHJpbnRmKCAiQXNzZXJ0aW9uIGZhaWx1cmUgYXQgJXMoJWQpOiAlcy5cbiIsIGZpbGUsIGxpbmUsIG1zZyApOworICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiBfX2ttcF9zdGRpb19sb2NrICk7CisgICAgICAgICAgICAjaWZkZWYgVVNFX0FTU0VSVF9CUkVBSworICAgICAgICAgICAgICAgICNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICAgICAgICAgICAgICBEZWJ1Z0JyZWFrKCk7CisgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAjZW5kaWYgLy8gVVNFX0FTU0VSVF9CUkVBSworICAgICAgICAgICAgI2lmZGVmIFVTRV9BU1NFUlRfU1RBTEwKKyAgICAgICAgICAgICAgICAvKiAgICBfX2ttcF9pbmZpbml0ZV9sb29wKCk7ICovCisgICAgICAgICAgICAgICAgZm9yKDs7KTsKKyAgICAgICAgICAgICNlbmRpZiAvLyBVU0VfQVNTRVJUX1NUQUxMCisgICAgICAgICAgICAjaWZkZWYgVVNFX0FTU0VSVF9TRUcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCB2b2xhdGlsZSAqIFpFUk8gPSAoaW50KikgMDsKKyAgICAgICAgICAgICAgICAgICAgKysgKCpaRVJPKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAjZW5kaWYgLy8gVVNFX0FTU0VSVF9TRUcKKyAgICAgICAgI2VuZGlmCisKKyAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgS01QX01TRyggQXNzZXJ0aW9uRmFpbHVyZSwgZmlsZSwgbGluZSApLAorICAgICAgICAgICAgS01QX0hOVCggU3VibWl0QnVnUmVwb3J0ICksCisgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICApOworCisgICAgICAgIHJldHVybiAwOworCisgICAgfSAvLyBfX2ttcF9kZWJ1Z19hc3NlcnQKKworI2VuZGlmIC8vIEtNUF9VU0VfQVNTRVJUCisKKy8qIER1bXAgZGVidWdnaW5nIGJ1ZmZlciB0byBzdGRlcnIgKi8KK3ZvaWQKK19fa21wX2R1bXBfZGVidWdfYnVmZmVyKCB2b2lkICkKK3sKKyAgICBpZiAoIF9fa21wX2RlYnVnX2J1ZmZlciAhPSBOVUxMICkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgaW50IGRjID0gX19rbXBfZGVidWdfY291bnQ7CisgICAgICAgIGNoYXIgKmRiID0gJiBfX2ttcF9kZWJ1Z19idWZmZXJbIChkYyAlIF9fa21wX2RlYnVnX2J1Zl9saW5lcykgKiBfX2ttcF9kZWJ1Z19idWZfY2hhcnMgXTsKKyAgICAgICAgY2hhciAqZGJfZW5kID0gJiBfX2ttcF9kZWJ1Z19idWZmZXJbIF9fa21wX2RlYnVnX2J1Zl9saW5lcyAqIF9fa21wX2RlYnVnX2J1Zl9jaGFycyBdOworICAgICAgICBjaGFyICpkYjI7CisKKyAgICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiBfX2ttcF9zdGRpb19sb2NrICk7CisgICAgICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCAiXG5TdGFydCBkdW1wIG9mIGRlYnVnZ2luZyBidWZmZXIgKGVudHJ5PSVkKTpcbiIsCisgICAgICAgICAgICAgICAgIGRjICUgX19rbXBfZGVidWdfYnVmX2xpbmVzICk7CisKKyAgICAgICAgZm9yICggaSA9IDA7IGkgPCBfX2ttcF9kZWJ1Z19idWZfbGluZXM7IGkrKyApIHsKKworICAgICAgICAgICAgaWYgKCAqZGIgIT0gJ1wwJyApIHsKKyAgICAgICAgICAgICAgICAvKiBGaXggdXAgd2hlcmUgbm8gY2FycmlhZ2UgcmV0dXJuIGJlZm9yZSBzdHJpbmcgdGVybWluYXRpb24gY2hhciAqLworICAgICAgICAgICAgICAgIGZvciAoIGRiMiA9IGRiICsgMTsgZGIyIDwgZGIgKyBfX2ttcF9kZWJ1Z19idWZfY2hhcnMgLSAxOyBkYjIgKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAqZGIyID09ICdcMCcgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICooZGIyLTEpICE9ICdcbicgKSB7ICpkYjIgPSAnXG4nOyAqKGRiMisxKSA9ICdcMCc7IH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIEhhbmRsZSBjYXNlIGF0IGVuZCBieSBzaG9ydGVuaW5nIHRoZSBwcmludGVkIG1lc3NhZ2UgYnkgb25lIGNoYXIgaWYgbmVjZXNzYXJ5ICovCisgICAgICAgICAgICAgICAgaWYgKCBkYjIgPT0gZGIgKyBfX2ttcF9kZWJ1Z19idWZfY2hhcnMgLSAxICYmCisgICAgICAgICAgICAgICAgICAgICAqZGIyID09ICdcMCcgJiYgKihkYjItMSkgIT0gJ1xuJyApIHsKKyAgICAgICAgICAgICAgICAgICAgKihkYjItMSkgPSAnXG4nOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCAiJTRkOiAlLipzIiwgaSwgX19rbXBfZGVidWdfYnVmX2NoYXJzLCBkYiApOworICAgICAgICAgICAgICAgICpkYiA9ICdcMCc7IC8qIG9ubHkgbGV0IGl0IHByaW50IG9uY2UhICovCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRiICs9IF9fa21wX2RlYnVnX2J1Zl9jaGFyczsKKyAgICAgICAgICAgIGlmICggZGIgPj0gZGJfZW5kICkKKyAgICAgICAgICAgICAgICBkYiA9IF9fa21wX2RlYnVnX2J1ZmZlcjsKKyAgICAgICAgfQorCisgICAgICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCAiRW5kIGR1bXAgb2YgZGVidWdnaW5nIGJ1ZmZlciAoZW50cnk9JWQpLlxuXG4iLAorICAgICAgICAgICAgICAgICAoIGRjK2ktMSApICUgX19rbXBfZGVidWdfYnVmX2xpbmVzICk7CisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfc3RkaW9fbG9jayApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9kZWJ1Zy5oIGIvZmluYWwvcnVudGltZS9zcmMva21wX2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJjOTIzZQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9kZWJ1Zy5oCkBAIC0wLDAgKzEsMTMxIEBACisvKgorICoga21wX2RlYnVnLmggLS0gZGVidWcgLyBhc3NlcnRpb24gY29kZSBmb3IgQXNzdXJlIGxpYnJhcnkKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBLTVBfREVCVUdfSAorI2RlZmluZSBLTVBfREVCVUdfSAorCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIGV4dGVybiAiQyIgeworI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEJ1aWxkLXRpbWUgYXNzZXJ0aW9uLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKgorICAgIEJ1aWxkLXRpbWUgYXNzZXJ0aW9uIGNhbiBkbyBjb21waWxlLXRpbWUgY2hlY2tpbmcgb2YgZGF0YSBzdHJ1Y3R1cmUgc2l6ZXMsIGV0Yy4gVGhpcyB3b3JrcyBieQorICAgIGRlY2xhcmluZyBhIG5lZ2F0aXZlLWxlbmd0aCBhcnJheSBpZiB0aGUgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gZmFsc2UuICBJbiB0aGF0CisgICAgY2FzZSwgdGhlIGNvbXBpbGVyIGlzc3VlcyBhIHN5bnRheCBlcnJvciBhbmQgc3RvcHMgdGhlIGNvbXBpbGF0aW9uLiBJZiB0aGUgZXhwcmVzc2lvbiBpcworICAgIHRydWUsIHdlIGdldCBhbiBleHRyYW5lb3VzIHN0YXRpYyBzaW5nbGUgY2hhcmFjdGVyIGFycmF5IGluIHRoZSBzY29wZSBvZiB0aGUgbWFjcm8uCisKKyAgICBVc2FnZToKKworICAgICAgICBLTVBfQlVJTERfQVNTRVJUKCBzaXplb2YoIHNvbWVfdCApIDw9IDMyICk7CisgICAgICAgIEtNUF9CVUlMRF9BU1NFUlQoIG9mZnNldG9mKCBzb21lX3QsIGZpZWxkICkgJSA4ID09IDAgKTsKKworICAgIERvIG5vdCB1c2UgX0tNUF9CVUlMRF9BU1NFUlQgYW5kIF9fS01QX0JVSUxEX0FTU0VSVCBkaXJlY3RseSwgaXQgaXMgd29ya2luZyBndXRzLgorKi8KKworI2RlZmluZSBfX0tNUF9CVUlMRF9BU1NFUlQoIGV4cHIsIHN1ZmZpeCApICB0eXBlZGVmIGNoYXIgX19rbXBfYnVpbGRfY2hlY2tfIyNzdWZmaXhbIChleHByKSA/IDEgOiAtMSBdCisjZGVmaW5lIF9LTVBfQlVJTERfQVNTRVJUKCBleHByLCBzdWZmaXggKSAgIF9fS01QX0JVSUxEX0FTU0VSVCggKGV4cHIpLCBzdWZmaXggKQorI2lmZGVmIEtNUF9VU0VfQVNTRVJUIAorICAgICNkZWZpbmUgS01QX0JVSUxEX0FTU0VSVCggZXhwciApICAgICAgICAgICAgX0tNUF9CVUlMRF9BU1NFUlQoIChleHByKSwgX19MSU5FX18gKQorI2Vsc2UKKyAgICAjZGVmaW5lIEtNUF9CVUlMRF9BU1NFUlQoIGV4cHIgKSAgICAgICAgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyNlbmRpZgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSdW4tdGltZSBhc3NlcnRpb25zLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitleHRlcm4gdm9pZCBfX2ttcF9kdW1wX2RlYnVnX2J1ZmZlciggdm9pZCApOworCisjaWZkZWYgS01QX1VTRV9BU1NFUlQKKyAgICBleHRlcm4gaW50IF9fa21wX2RlYnVnX2Fzc2VydCggY2hhciBjb25zdCAqIGV4cHIsIGNoYXIgY29uc3QgKiBmaWxlLCBpbnQgbGluZSApOworICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgI2RlZmluZSBLTVBfQVNTRVJUKCBjb25kICkgICAgICAgICAgICAgKCAoY29uZCkgPyAwIDogX19rbXBfZGVidWdfYXNzZXJ0KCAjY29uZCwgX19GSUxFX18sIF9fTElORV9fICkgKQorICAgICAgICAjZGVmaW5lIEtNUF9BU1NFUlQyKCBjb25kLCBtc2cgKSAgICAgICAoIChjb25kKSA/IDAgOiBfX2ttcF9kZWJ1Z19hc3NlcnQoIChtc2cpLCBfX0ZJTEVfXywgX19MSU5FX18gKSApCisgICAgICAgICNkZWZpbmUgS01QX0RFQlVHX0FTU0VSVCggY29uZCApICAgICAgIEtNUF9BU1NFUlQoIGNvbmQgKQorICAgICAgICAjZGVmaW5lIEtNUF9ERUJVR19BU1NFUlQyKCBjb25kLCBtc2cgKSBLTVBfQVNTRVJUMiggY29uZCwgbXNnICkKKyAgICAjZWxzZQorICAgICAgICAvLyBEbyBub3QgZXhwb3NlIGNvbmRpdGlvbiBpbiByZWxlYXNlIGJ1aWxkLiBVc2UgImFzc2VydGlvbiBmYWlsdXJlIi4KKyAgICAgICAgI2RlZmluZSBLTVBfQVNTRVJUKCBjb25kICkgICAgICAgICAgICAgKCAoY29uZCkgPyAwIDogX19rbXBfZGVidWdfYXNzZXJ0KCAiYXNzZXJ0aW9uIGZhaWx1cmUiLCBfX0ZJTEVfXywgX19MSU5FX18gKSApCisgICAgICAgICNkZWZpbmUgS01QX0FTU0VSVDIoIGNvbmQsIG1zZyApICAgICAgIEtNUF9BU1NFUlQoIGNvbmQgKQorICAgICAgICAjZGVmaW5lIEtNUF9ERUJVR19BU1NFUlQoIGNvbmQgKSAgICAgICAwCisgICAgICAgICNkZWZpbmUgS01QX0RFQlVHX0FTU0VSVDIoIGNvbmQsIG1zZyApIDAKKyAgICAjZW5kaWYgLy8gS01QX0RFQlVHCisjZWxzZQorICAgICNkZWZpbmUgS01QX0FTU0VSVCggY29uZCApICAgICAgICAgICAgIDAKKyAgICAjZGVmaW5lIEtNUF9BU1NFUlQyKCBjb25kLCBtc2cgKSAgICAgICAwCisgICAgI2RlZmluZSBLTVBfREVCVUdfQVNTRVJUKCBjb25kICkgICAgICAgMAorICAgICNkZWZpbmUgS01QX0RFQlVHX0FTU0VSVDIoIGNvbmQsIG1zZyApIDAKKyNlbmRpZiAvLyBLTVBfVVNFX0FTU0VSVAorCisjaWZkZWYgS01QX0RFQlVHCisgICAgZXh0ZXJuIHZvaWQgX19rbXBfZGVidWdfcHJpbnRmX3N0ZG91dCggY2hhciBjb25zdCAqIGZvcm1hdCwgLi4uICk7CisjZW5kaWYKK2V4dGVybiB2b2lkIF9fa21wX2RlYnVnX3ByaW50ZiggY2hhciBjb25zdCAqIGZvcm1hdCwgLi4uICk7CisKKyNpZmRlZiBLTVBfREVCVUcKKworICAgIGV4dGVybiBpbnQga21wX2FfZGVidWc7CisgICAgZXh0ZXJuIGludCBrbXBfYl9kZWJ1ZzsKKyAgICBleHRlcm4gaW50IGttcF9jX2RlYnVnOworICAgIGV4dGVybiBpbnQga21wX2RfZGVidWc7CisgICAgZXh0ZXJuIGludCBrbXBfZV9kZWJ1ZzsKKyAgICBleHRlcm4gaW50IGttcF9mX2RlYnVnOworICAgIGV4dGVybiBpbnQga21wX2RpYWc7CisKKyAgICAjZGVmaW5lIEtBX1RSQUNFKGQseCkgICAgIGlmIChrbXBfYV9kZWJ1ZyA+PSBkKSB7IF9fa21wX2RlYnVnX3ByaW50ZiB4IDsgfQorICAgICNkZWZpbmUgS0JfVFJBQ0UoZCx4KSAgICAgaWYgKGttcF9iX2RlYnVnID49IGQpIHsgX19rbXBfZGVidWdfcHJpbnRmIHggOyB9CisgICAgI2RlZmluZSBLQ19UUkFDRShkLHgpICAgICBpZiAoa21wX2NfZGVidWcgPj0gZCkgeyBfX2ttcF9kZWJ1Z19wcmludGYgeCA7IH0KKyAgICAjZGVmaW5lIEtEX1RSQUNFKGQseCkgICAgIGlmIChrbXBfZF9kZWJ1ZyA+PSBkKSB7IF9fa21wX2RlYnVnX3ByaW50ZiB4IDsgfQorICAgICNkZWZpbmUgS0VfVFJBQ0UoZCx4KSAgICAgaWYgKGttcF9lX2RlYnVnID49IGQpIHsgX19rbXBfZGVidWdfcHJpbnRmIHggOyB9CisgICAgI2RlZmluZSBLRl9UUkFDRShkLHgpICAgICBpZiAoa21wX2ZfZGVidWcgPj0gZCkgeyBfX2ttcF9kZWJ1Z19wcmludGYgeCA7IH0KKyAgICAjZGVmaW5lIEtfRElBRyhkLHgpICAgICAgIHtpZiAoa21wX2RpYWcgPT0gZCkgeyBfX2ttcF9kZWJ1Z19wcmludGZfc3Rkb3V0IHggOyB9IH0KKworICAgICNkZWZpbmUgS0FfRFVNUChkLHgpICAgICBpZiAoa21wX2FfZGVidWcgPj0gZCkgeyBpbnQga3M7IF9fa21wX2Rpc2FibGUoJmtzKTsgKHgpIDsgX19rbXBfZW5hYmxlKGtzKTsgfQorICAgICNkZWZpbmUgS0JfRFVNUChkLHgpICAgICBpZiAoa21wX2JfZGVidWcgPj0gZCkgeyBpbnQga3M7IF9fa21wX2Rpc2FibGUoJmtzKTsgKHgpIDsgX19rbXBfZW5hYmxlKGtzKTsgfQorICAgICNkZWZpbmUgS0NfRFVNUChkLHgpICAgICBpZiAoa21wX2NfZGVidWcgPj0gZCkgeyBpbnQga3M7IF9fa21wX2Rpc2FibGUoJmtzKTsgKHgpIDsgX19rbXBfZW5hYmxlKGtzKTsgfQorICAgICNkZWZpbmUgS0RfRFVNUChkLHgpICAgICBpZiAoa21wX2RfZGVidWcgPj0gZCkgeyBpbnQga3M7IF9fa21wX2Rpc2FibGUoJmtzKTsgKHgpIDsgX19rbXBfZW5hYmxlKGtzKTsgfQorICAgICNkZWZpbmUgS0VfRFVNUChkLHgpICAgICBpZiAoa21wX2VfZGVidWcgPj0gZCkgeyBpbnQga3M7IF9fa21wX2Rpc2FibGUoJmtzKTsgKHgpIDsgX19rbXBfZW5hYmxlKGtzKTsgfQorICAgICNkZWZpbmUgS0ZfRFVNUChkLHgpICAgICBpZiAoa21wX2ZfZGVidWcgPj0gZCkgeyBpbnQga3M7IF9fa21wX2Rpc2FibGUoJmtzKTsgKHgpIDsgX19rbXBfZW5hYmxlKGtzKTsgfQorCisjZWxzZQorCisgICAgI2RlZmluZSBLQV9UUkFDRShkLHgpICAgICAvKiBub3RoaW5nIHRvIGRvICovCisgICAgI2RlZmluZSBLQl9UUkFDRShkLHgpICAgICAvKiBub3RoaW5nIHRvIGRvICovCisgICAgI2RlZmluZSBLQ19UUkFDRShkLHgpICAgICAvKiBub3RoaW5nIHRvIGRvICovCisgICAgI2RlZmluZSBLRF9UUkFDRShkLHgpICAgICAvKiBub3RoaW5nIHRvIGRvICovCisgICAgI2RlZmluZSBLRV9UUkFDRShkLHgpICAgICAvKiBub3RoaW5nIHRvIGRvICovCisgICAgI2RlZmluZSBLRl9UUkFDRShkLHgpICAgICAvKiBub3RoaW5nIHRvIGRvICovCisgICAgI2RlZmluZSBLX0RJQUcoZCx4KSAgICAgICB7fS8qIG5vdGhpbmcgdG8gZG8gKi8KKworICAgICNkZWZpbmUgS0FfRFVNUChkLHgpICAgICAvKiBub3RoaW5nIHRvIGRvICovCisgICAgI2RlZmluZSBLQl9EVU1QKGQseCkgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICAjZGVmaW5lIEtDX0RVTVAoZCx4KSAgICAgLyogbm90aGluZyB0byBkbyAqLworICAgICNkZWZpbmUgS0RfRFVNUChkLHgpICAgICAvKiBub3RoaW5nIHRvIGRvICovCisgICAgI2RlZmluZSBLRV9EVU1QKGQseCkgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICAjZGVmaW5lIEtGX0RVTVAoZCx4KSAgICAgLyogbm90aGluZyB0byBkbyAqLworCisjZW5kaWYgLy8gS01QX0RFQlVHCisKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIH0gLy8gZXh0ZXJuICJDIgorI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKyNlbmRpZiAvKiBLTVBfREVCVUdfSCAqLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2RlYnVnZ2VyLmMgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZGVidWdnZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2MxYWNiCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2RlYnVnZ2VyLmMKQEAgLTAsMCArMSwzMTQgQEAKKyNpZiBVU0VfREVCVUdHRVIKKy8qCisgKiBrbXBfZGVidWdnZXIuYyAtLSBkZWJ1Z2dlciBzdXBwb3J0LgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2xvY2suaCIKKyNpbmNsdWRlICJrbXBfb21wLmgiCisjaW5jbHVkZSAia21wX3N0ci5oIgorCisvKgorICAgIE5PVEU6IEFsbCB2YXJpYWJsZSBuYW1lcyBhcmUga25vd24gdG8gdGhlIGRlYnVnZ2VyLCBkbyBub3QgY2hhbmdlIQorKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgZXh0ZXJuICJDIiB7CisgICAgICAgIGV4dGVybiBrbXBfb21wX3N0cnVjdF9pbmZvX3QgX19rbXBfb21wX2RlYnVnX3N0cnVjdF9pbmZvOworICAgIH0gLy8gZXh0ZXJuICJDIgorI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKK2ludCBfX2ttcF9kZWJ1Z2dpbmcgICAgICAgICAgPSBGQUxTRTsgICAgLy8gQm9vbGVhbiB3aGV0aGVyIGN1cnJlbnRseSBkZWJ1Z2dpbmcgT3Blbk1QIFJUTC4KKworI2RlZmluZSBvZmZzZXRfYW5kX3NpemVfb2YoIHN0cnVjdHVyZSwgZmllbGQgKSAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBvZmZzZXRvZiggc3RydWN0dXJlLCAgICAgICAgICAgZmllbGQgKSwgICAgXAorICAgICAgICBzaXplb2YoICggKHN0cnVjdHVyZSAqKSBOVUxMKS0+ZmllbGQgKSAgICAgXAorICAgIH0KKworI2RlZmluZSBvZmZzZXRfYW5kX3NpemVfbm90X2F2YWlsYWJsZSBcCisgICAgeyAtMSwgLTEgfQorCisjZGVmaW5lIGFkZHJfYW5kX3NpemVfb2YoIHZhciApICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChrbXBfdWludDY0KSggJiB2YXIgKSwgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHNpemVvZiggdmFyICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisjZGVmaW5lIG50aHJfYnVmZmVyX3NpemUgMTAyNAorc3RhdGljIGttcF9pbnQzMgora21wX29tcF9udGhyX2luZm9fYnVmZmVyWyBudGhyX2J1ZmZlcl9zaXplIF0gPQorICAgIHsgbnRocl9idWZmZXJfc2l6ZSAqIHNpemVvZigga21wX2ludDMyICkgfTsKKworLyogVE9ETzogQ2hlY2sgcHVuY3R1YXRpb24gZm9yIHZhcmlvdXMgcGxhdGZvcm1zIGhlcmUgKi8KK3N0YXRpYyBjaGFyIGZ1bmNfbWljcm90YXNrW10gICAgPSAiX19rbXBfaW52b2tlX21pY3JvdGFzayI7CitzdGF0aWMgY2hhciBmdW5jX2ZvcmtbXSAgICAgICAgID0gIl9fa21wY19mb3JrX2NhbGwiOworc3RhdGljIGNoYXIgZnVuY19mb3JrX3RlYW1zW10gICA9ICJfX2ttcGNfZm9ya190ZWFtcyI7CisKKworLy8gVmFyaW91cyBpbmZvIGFib3V0IHJ1bnRpbWUgc3RydWN0dXJlczogYWRkcmVzc2VzLCBmaWVsZCBvZmZzZXRzLCBzaXplcywgZXRjLgora21wX29tcF9zdHJ1Y3RfaW5mb190CitfX2ttcF9vbXBfZGVidWdfc3RydWN0X2luZm8gPSB7CisKKyAgICAvKiBDaGFuZ2UgdGhpcyBvbmx5IGlmIHlvdSBtYWtlIGEgZnVuZGFtZW50YWwgZGF0YSBzdHJ1Y3R1cmUgY2hhbmdlIGhlcmUgKi8KKyAgICBLTVBfT01QX1ZFUlNJT04sCisKKyAgICAvKiBzYW5pdHkgY2hlY2suICBPbmx5IHNob3VsZCBiZSBjaGVja2VkIGlmIHZlcnNpb25zIGFyZSBpZGVudGljYWwKKyAgICAgKiBUaGlzIGlzIGFsc28gdXNlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB0byBnZXQgdGhlIHJ1bnRpbWUKKyAgICAgKiBzdHJ1Y3R1cmUgc2l6ZSBpZiBpdCB0aGUgcnVudGltZSBpcyBvbGRlciB0aGFuIHRoZSBpbnRlcmZhY2UgKi8KKyAgICBzaXplb2YoIGttcF9vbXBfc3RydWN0X2luZm9fdCApLAorCisgICAgLyogT3Blbk1QIFJUTCB2ZXJzaW9uIGluZm8uICovCisgICAgYWRkcl9hbmRfc2l6ZV9vZiggX19rbXBfdmVyc2lvbl9tYWpvciApLAorICAgIGFkZHJfYW5kX3NpemVfb2YoIF9fa21wX3ZlcnNpb25fbWlub3IgKSwKKyAgICBhZGRyX2FuZF9zaXplX29mKCBfX2ttcF92ZXJzaW9uX2J1aWxkICksCisgICAgYWRkcl9hbmRfc2l6ZV9vZiggX19rbXBfb3Blbm1wX3ZlcnNpb24gKSwKKyAgICB7IChrbXBfdWludDY0KSggX19rbXBfY29weXJpZ2h0ICkgKyBLTVBfVkVSU0lPTl9NQUdJQ19MRU4sIDAgfSwgICAgICAgIC8vIFNraXAgbWFnaWMgcHJlZml4LgorCisgICAgLyogVmFyaW91cyBnbG9iYWxzLiAqLworICAgIGFkZHJfYW5kX3NpemVfb2YoIF9fa21wX3RocmVhZHMgKSwKKyAgICBhZGRyX2FuZF9zaXplX29mKCBfX2ttcF9yb290ICksCisgICAgYWRkcl9hbmRfc2l6ZV9vZiggX19rbXBfdGhyZWFkc19jYXBhY2l0eSApLAorICAgIGFkZHJfYW5kX3NpemVfb2YoIF9fa21wX21vbml0b3IgKSwKKyNpZiAhIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgICAgYWRkcl9hbmRfc2l6ZV9vZiggX19rbXBfdXNlcl9sb2NrX3RhYmxlICksCisjZW5kaWYKKyAgICBhZGRyX2FuZF9zaXplX29mKCBmdW5jX21pY3JvdGFzayApLAorICAgIGFkZHJfYW5kX3NpemVfb2YoIGZ1bmNfZm9yayApLAorICAgIGFkZHJfYW5kX3NpemVfb2YoIGZ1bmNfZm9ya190ZWFtcyApLAorICAgIGFkZHJfYW5kX3NpemVfb2YoIF9fa21wX3RlYW1fY291bnRlciApLAorICAgIGFkZHJfYW5kX3NpemVfb2YoIF9fa21wX3Rhc2tfY291bnRlciApLAorICAgIGFkZHJfYW5kX3NpemVfb2YoIGttcF9vbXBfbnRocl9pbmZvX2J1ZmZlciApLAorICAgIHNpemVvZiggdm9pZCAqICksCisgICAgT01QX0xPQ0tfVF9TSVpFIDwgc2l6ZW9mKHZvaWQgKiksCisgICAgYnNfbGFzdF9iYXJyaWVyLAorICAgIFRBU0tfREVRVUVfU0laRSwKKworICAgIC8vIHRocmVhZCBzdHJ1Y3R1cmUgaW5mb3JtYXRpb24KKyAgICBzaXplb2YoIGttcF9iYXNlX2luZm9fdCApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfaW5mb190LCB0aF9pbmZvICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV9pbmZvX3QsIHRoX3RlYW0gKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX2luZm9fdCwgdGhfcm9vdCApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfaW5mb190LCB0aF9zZXJpYWxfdGVhbSApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfaW5mb190LCB0aF9pZGVudCApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfaW5mb190LCB0aF9zcGluX2hlcmUgICAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX2luZm9fdCwgdGhfbmV4dF93YWl0aW5nICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV9pbmZvX3QsIHRoX3Rhc2tfdGVhbSAgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfaW5mb190LCB0aF9jdXJyZW50X3Rhc2sgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX2luZm9fdCwgdGhfdGFza19zdGF0ZSAgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV9pbmZvX3QsICAgdGhfYmFyICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYnN0YXRlX3QsICAgICAgYl93b3JrZXJfYXJyaXZlZCApLAorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAvLyB0ZWFtcyBpbmZvcm1hdGlvbgorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfaW5mb190LCB0aF90ZWFtc19taWNyb3Rhc2spLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfaW5mb190LCB0aF90ZWFtc19sZXZlbCksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfdGVhbXNfc2l6ZV90LCBudGVhbXMgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF90ZWFtc19zaXplX3QsIG50aCApLAorI2VuZGlmCisKKyAgICAvLyBrbXBfZGVzYyBzdHJ1Y3R1cmUgKGZvciBpbmZvIGZpZWxkIGFib3ZlKQorICAgIHNpemVvZigga21wX2Rlc2NfYmFzZV90ICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfZGVzY19iYXNlX3QsIGRzX3RpZCAgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Rlc2NfYmFzZV90LCBkc19ndGlkICAgKSwKKyAgICAvLyBPbiBXaW5kb3dzKiBPUywgZHNfdGhyZWFkIGNvbnRhaW5zIGEgdGhyZWFkIC9oYW5kbGUvLCB3aGljaCBpcyBub3QgdXNhYmxlLCB3aGlsZSB0aHJlYWQgL2lkLworICAgIC8vIGlzIGluIGRzX3RocmVhZF9pZC4KKyAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9kZXNjX2Jhc2VfdCwgZHNfdGhyZWFkX2lkKSwKKyAgICAjZWxzZQorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Rlc2NfYmFzZV90LCBkc190aHJlYWQpLAorICAgICNlbmRpZgorCisgICAgLy8gdGVhbSBzdHJ1Y3R1cmUgaW5mb3JtYXRpb24KKyAgICBzaXplb2YoIGttcF9iYXNlX3RlYW1fdCApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfdGVhbV90LCAgIHRfbWFzdGVyX3RpZCApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfdGVhbV90LCAgIHRfaWRlbnQgICAgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfdGVhbV90LCAgIHRfcGFyZW50ICAgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfdGVhbV90LCAgIHRfbnByb2MgICAgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfdGVhbV90LCAgIHRfdGhyZWFkcyAgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfdGVhbV90LCAgIHRfc2VyaWFsaXplZCApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfdGVhbV90LCAgIHRfaWQgICAgICAgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfdGVhbV90LCAgIHRfcGtmbiAgICAgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfdGVhbV90LCAgIHRfdGFza190ZWFtICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV90ZWFtX3QsICAgdF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhICksCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX3RlYW1fdCwgICB0X2NhbmNlbF9yZXF1ZXN0ICksCisjZW5kaWYKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX3RlYW1fdCwgICB0X2JhciApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2JhbGlnbl90ZWFtX3QsIGJfbWFzdGVyX2Fycml2ZWQgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYWxpZ25fdGVhbV90LCBiX3RlYW1fYXJyaXZlZCApLAorCisgICAgLy8gcm9vdCBzdHJ1Y3R1cmUgaW5mb3JtYXRpb24KKyAgICBzaXplb2YoIGttcF9iYXNlX3Jvb3RfdCApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2Vfcm9vdF90LCByX3Jvb3RfdGVhbSAgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV9yb290X3QsIHJfaG90X3RlYW0gICAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX3Jvb3RfdCwgcl91YmVyX3RocmVhZCApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9ub3RfYXZhaWxhYmxlLAorCisgICAgLy8gaWRlbnQgc3RydWN0dXJlIGluZm9ybWF0aW9uCisgICAgc2l6ZW9mKCBpZGVudF90ICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBpZGVudF90LCBwc291cmNlICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBpZGVudF90LCBmbGFncyAgICksCisKKyAgICAvLyBsb2NrIHN0cnVjdHVyZSBpbmZvcm1hdGlvbgorICAgIHNpemVvZigga21wX2Jhc2VfcXVldWluZ19sb2NrX3QgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX3F1ZXVpbmdfbG9ja190LCBpbml0aWFsaXplZCAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX3F1ZXVpbmdfbG9ja190LCBsb2NhdGlvbiApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfcXVldWluZ19sb2NrX3QsIHRhaWxfaWQgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV9xdWV1aW5nX2xvY2tfdCwgaGVhZF9pZCAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX3F1ZXVpbmdfbG9ja190LCBuZXh0X3RpY2tldCAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX3F1ZXVpbmdfbG9ja190LCBub3dfc2VydmluZyAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX3F1ZXVpbmdfbG9ja190LCBvd25lcl9pZCAgICAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX3F1ZXVpbmdfbG9ja190LCBkZXB0aF9sb2NrZWQgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX3F1ZXVpbmdfbG9ja190LCBmbGFncyApLAorCisjaWYgISBLTVBfVVNFX0RZTkFNSUNfTE9DSworICAgIC8qIExvY2sgdGFibGUuICovCisgICAgc2l6ZW9mKCBrbXBfbG9ja190YWJsZV90ICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfbG9ja190YWJsZV90LCB1c2VkICAgICAgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfbG9ja190YWJsZV90LCBhbGxvY2F0ZWQgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfbG9ja190YWJsZV90LCB0YWJsZSAgICAgICksCisjZW5kaWYKKworICAgIC8vIFRhc2sgdGVhbSBzdHJ1Y3R1cmUgaW5mb3JtYXRpb24uCisgICAgc2l6ZW9mKCBrbXBfYmFzZV90YXNrX3RlYW1fdCApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfdGFza190ZWFtX3QsIHR0X3RocmVhZHNfZGF0YSAgICAgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfdGFza190ZWFtX3QsIHR0X2ZvdW5kX3Rhc2tzICAgICAgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfdGFza190ZWFtX3QsIHR0X25wcm9jICAgICAgICAgICAgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfdGFza190ZWFtX3QsIHR0X3VuZmluaXNoZWRfdGhyZWFkcyApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfdGFza190ZWFtX3QsIHR0X2FjdGl2ZSAgICAgICAgICAgICApLAorCisgICAgLy8gdGFza19kYXRhX3QuCisgICAgc2l6ZW9mKCBrbXBfdGFza2RhdGFfdCApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX3Rhc2tkYXRhX3QsIHRkX3Rhc2tfaWQgICAgICAgICAgICAgICAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF90YXNrZGF0YV90LCB0ZF9mbGFncyAgICAgICAgICAgICAgICAgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfdGFza2RhdGFfdCwgdGRfdGVhbSAgICAgICAgICAgICAgICAgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX3Rhc2tkYXRhX3QsIHRkX3BhcmVudCAgICAgICAgICAgICAgICAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF90YXNrZGF0YV90LCB0ZF9sZXZlbCAgICAgICAgICAgICAgICAgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfdGFza2RhdGFfdCwgdGRfaWRlbnQgICAgICAgICAgICAgICAgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX3Rhc2tkYXRhX3QsIHRkX2FsbG9jYXRlZF9jaGlsZF90YXNrcyAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF90YXNrZGF0YV90LCB0ZF9pbmNvbXBsZXRlX2NoaWxkX3Rhc2tzICksCisKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF90YXNrZGF0YV90LCB0ZF90YXNrd2FpdF9pZGVudCAgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfdGFza2RhdGFfdCwgdGRfdGFza3dhaXRfY291bnRlciApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX3Rhc2tkYXRhX3QsIHRkX3Rhc2t3YWl0X3RocmVhZCAgKSwKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfdGFza2RhdGFfdCwgdGRfdGFza2dyb3VwICAgICAgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX3Rhc2tncm91cF90LCBjb3VudCAgICAgICAgICAgICAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF90YXNrZ3JvdXBfdCwgY2FuY2VsX3JlcXVlc3QgICAgICksCisKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF90YXNrZGF0YV90LCB0ZF9kZXBub2RlICAgICAgICAgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfZGVwbm9kZV9saXN0X3QsIG5vZGUgICAgICAgICAgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2RlcG5vZGVfbGlzdF90LCBuZXh0ICAgICAgICAgICAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX2RlcG5vZGVfdCwgc3VjY2Vzc29ycyAgICAgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV9kZXBub2RlX3QsIHRhc2sgICAgICAgICAgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfZGVwbm9kZV90LCBucHJlZGVjZXNzb3JzICAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX2RlcG5vZGVfdCwgbnJlZnMgICAgICAgICAgICksCisjZW5kaWYKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF90YXNrX3QsIHJvdXRpbmUgICAgICAgICAgICAgICAgICksCisKKyAgICAvLyB0aHJlYWRfZGF0YV90LgorICAgIHNpemVvZigga21wX3RocmVhZF9kYXRhX3QgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX3RocmVhZF9kYXRhX3QsIHRkX2RlcXVlICAgICAgICAgICAgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV90aHJlYWRfZGF0YV90LCB0ZF9kZXF1ZV9oZWFkICAgICAgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfdGhyZWFkX2RhdGFfdCwgdGRfZGVxdWVfdGFpbCAgICAgICAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX3RocmVhZF9kYXRhX3QsIHRkX2RlcXVlX250YXNrcyAgICAgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV90aHJlYWRfZGF0YV90LCB0ZF9kZXF1ZV9sYXN0X3N0b2xlbiApLAorCisgICAgLy8gVGhlIGxhc3QgZmllbGQuCisgICAgS01QX09NUF9WRVJTSU9OLAorCit9OyAvLyBfX2ttcF9vbXBfZGVidWdfc3RydWN0X2luZm8KKworI3VuZGVmIG9mZnNldF9hbmRfc2l6ZV9vZgorI3VuZGVmIGFkZHJfYW5kX3NpemVfb2YKKworLyoKKyAgSW50ZWwgY29tcGlsZXIgb24gSUEtMzIgYXJjaGl0ZWN0dXJlIGlzc3VlcyBhIHdhcm5pbmcgImNvbnZlcnNpb24KKyAgZnJvbSAidW5zaWduZWQgbG9uZyBsb25nIiB0byAiY2hhciAqIiBtYXkgbG9zZSBzaWduaWZpY2FudCBiaXRzIgorICB3aGVuIDY0LWJpdCB2YWx1ZSBpcyBhc3NpZ25lZCB0byAzMi1iaXQgcG9pbnRlci4gVXNlIHRoaXMgZnVuY3Rpb24KKyAgdG8gc3VwcHJlc3MgdGhlIHdhcm5pbmcuCisqLworc3RhdGljIGlubGluZQordm9pZCAqCitfX2ttcF9jb252ZXJ0X3RvX3B0cigKKyAgICBrbXBfdWludDY0ICAgIGFkZHIKKykgeworICAgICNpZiBLTVBfQ09NUElMRVJfSUNDCisgICAgICAgICNwcmFnbWEgd2FybmluZyggcHVzaCApCisgICAgICAgICNwcmFnbWEgd2FybmluZyggZGlzYWJsZTogIDgxMCApIC8vIGNvbnZlcnNpb24gZnJvbSAidW5zaWduZWQgbG9uZyBsb25nIiB0byAiY2hhciAqIiBtYXkgbG9zZSBzaWduaWZpY2FudCBiaXRzCisgICAgICAgICNwcmFnbWEgd2FybmluZyggZGlzYWJsZTogMTE5NSApIC8vIGNvbnZlcnNpb24gZnJvbSBpbnRlZ2VyIHRvIHNtYWxsZXIgcG9pbnRlcgorICAgICNlbmRpZiAvLyBLTVBfQ09NUElMRVJfSUNDCisgICAgcmV0dXJuICh2b2lkICopIGFkZHI7CisgICAgI2lmIEtNUF9DT01QSUxFUl9JQ0MKKyAgICAgICAgI3ByYWdtYSB3YXJuaW5nKCBwb3AgKQorICAgICNlbmRpZiAvLyBLTVBfQ09NUElMRVJfSUNDCit9IC8vIF9fa21wX2NvbnZlcnRfdG9fcHRyCisKKworc3RhdGljIGludAora21wX2xvY2F0aW9uX21hdGNoKAorICAgIGttcF9zdHJfbG9jX3QgKiAgICAgICAgbG9jLAorICAgIGttcF9vbXBfbnRocl9pdGVtX3QgKiAgaXRlbQorKSB7CisKKyAgICBpbnQgZmlsZV9tYXRjaCA9IDA7CisgICAgaW50IGZ1bmNfbWF0Y2ggPSAwOworICAgIGludCBsaW5lX21hdGNoID0gMDsKKworICAgIGNoYXIgKiBmaWxlID0gKGNoYXIgKikgX19rbXBfY29udmVydF90b19wdHIoIGl0ZW0tPmZpbGUgKTsKKyAgICBjaGFyICogZnVuYyA9IChjaGFyICopIF9fa21wX2NvbnZlcnRfdG9fcHRyKCBpdGVtLT5mdW5jICk7CisgICAgZmlsZV9tYXRjaCA9IF9fa21wX3N0cl9mbmFtZV9tYXRjaCggJiBsb2MtPmZuYW1lLCBmaWxlICk7CisgICAgZnVuY19tYXRjaCA9CisgICAgICAgIGl0ZW0tPmZ1bmMgPT0gMCAgLy8gSWYgaXRlbS0+ZnVuYyBpcyBOVUxMLCBpdCBhbGxvd3MgYW55IGZ1bmMgbmFtZS4KKyAgICAgICAgfHwKKyAgICAgICAgc3RyY21wKCBmdW5jLCAiKiIgKSA9PSAwCisgICAgICAgIHx8CisgICAgICAgICggbG9jLT5mdW5jICE9IE5VTEwgJiYgc3RyY21wKCBsb2MtPmZ1bmMsIGZ1bmMgKSA9PSAwICk7CisgICAgbGluZV9tYXRjaCA9CisgICAgICAgIGl0ZW0tPmJlZ2luIDw9IGxvYy0+bGluZQorICAgICAgICAmJgorICAgICAgICAoIGl0ZW0tPmVuZCA8PSAwIHx8IGxvYy0+bGluZSA8PSBpdGVtLT5lbmQgKTsgLy8gaWYgaXRlbS0+ZW5kIDw9IDAsIGl0IG1lYW5zICJlbmQgb2YgZmlsZSIuCisKKyAgICByZXR1cm4gKCBmaWxlX21hdGNoICYmIGZ1bmNfbWF0Y2ggJiYgbGluZV9tYXRjaCApOworCit9IC8vIGttcF9sb2NhdGlvbl9tYXRjaAorCisKK2ludAorX19rbXBfb21wX251bV90aHJlYWRzKAorICAgIGlkZW50X3QgY29uc3QgKiBpZGVudAorKSB7CisKKyAgICBpbnQgbnVtX3RocmVhZHMgPSAwOworCisgICAga21wX29tcF9udGhyX2luZm9fdCAqIGluZm8gPQorICAgICAgICAoa21wX29tcF9udGhyX2luZm9fdCAqKSBfX2ttcF9jb252ZXJ0X3RvX3B0ciggIF9fa21wX29tcF9kZWJ1Z19zdHJ1Y3RfaW5mby5udGhyX2luZm8uYWRkciApOworICAgIGlmICggaW5mby0+bnVtID4gMCAmJiBpbmZvLT5hcnJheSAhPSAwICkgeworICAgICAgICBrbXBfb21wX250aHJfaXRlbV90ICogaXRlbXMgPSAoa21wX29tcF9udGhyX2l0ZW1fdCAqKSBfX2ttcF9jb252ZXJ0X3RvX3B0ciggaW5mby0+YXJyYXkgKTsKKyAgICAgICAga21wX3N0cl9sb2NfdCAgICAgICAgIGxvYyAgID0gX19rbXBfc3RyX2xvY19pbml0KCBpZGVudC0+cHNvdXJjZSwgMSApOworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yICggaSA9IDA7IGkgPCBpbmZvLT5udW07ICsrIGkgKSB7CisgICAgICAgICAgICBpZiAoIGttcF9sb2NhdGlvbl9tYXRjaCggJiBsb2MsICYgaXRlbXNbIGkgXSApICkgeworICAgICAgICAgICAgICAgIG51bV90aHJlYWRzID0gaXRlbXNbIGkgXS5udW1fdGhyZWFkczsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH07IC8vIGZvcgorICAgICAgICBfX2ttcF9zdHJfbG9jX2ZyZWUoICYgbG9jICk7CisgICAgfTsgLy8gaWYKKworICAgIHJldHVybiBudW1fdGhyZWFkczs7CisKK30gLy8gX19rbXBfb21wX251bV90aHJlYWRzCisjZW5kaWYgLyogVVNFX0RFQlVHR0VSICovCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfZGVidWdnZXIuaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9kZWJ1Z2dlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZjQxMzQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZGVidWdnZXIuaApAQCAtMCwwICsxLDUxIEBACisjaWYgVVNFX0RFQlVHR0VSCisvKgorICoga21wX2RlYnVnZ2VyLmggLS0gZGVidWdnZXIgc3VwcG9ydC4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBLTVBfREVCVUdHRVJfSAorI2RlZmluZSBLTVBfREVCVUdHRVJfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICBleHRlcm4gIkMiIHsKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisvKiAqIFRoaXMgZXh0ZXJuYWwgdmFyaWFibGUgY2FuIGJlIHNldCBieSBhbnkgZGVidWdnZXIgdG8gZmxhZyB0byB0aGUgcnVudGltZSB0aGF0IHdlCisgICBhcmUgY3VycmVudGx5IGV4ZWN1dGluZyBpbnNpZGUgYSBkZWJ1Z2dlci4gIFRoaXMgd2lsbCBhbGxvdyB0aGUgZGVidWdnZXIgdG8gb3ZlcnJpZGUKKyAgIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBzcGF3bmVkIGluIGEgcGFyYWxsZWwgcmVnaW9uIGJ5IHVzaW5nIF9fa21wX29tcF9udW1fdGhyZWFkcygpIChiZWxvdykuIAorICAgKiBXaGVuIF9fa21wX2RlYnVnZ2luZyBpcyBUUlVFLCBlYWNoIHRlYW0gYW5kIGVhY2ggdGFzayBnZXRzIGEgdW5pcXVlIGludGVnZXIgaWRlbnRpZmllciAKKyAgIHRoYXQgY2FuIGJlIHVzZWQgYnkgZGVidWdnZXIgdG8gY29udmVuaWVudGx5IGlkZW50aWZ5IHRlYW1zIGFuZCB0YXNrcy4KKyAgICogVGhlIGRlYnVnZ2VyIGhhcyBhY2Nlc3MgdG8gX19rbXBfb21wX2RlYnVnX3N0cnVjdF9pbmZvIHdoaWNoIGNvbnRhaW5zIGluZm9ybWF0aW9uCisgICBhYm91dCB0aGUgT3Blbk1QIGxpYnJhcnkncyBpbXBvcnRhbnQgaW50ZXJuYWwgc3RydWN0dXJlcy4gIFRoaXMgYWNjZXNzIHdpbGwgYWxsb3cgdGhlIGRlYnVnZ2VyIAorICAgdG8gcmVhZCBkZXRhaWxlZCBpbmZvcm1hdGlvbiBmcm9tIHRoZSB0eXBpY2FsIE9wZW5NUCBjb25zdHJ1Y3RzICh0ZWFtcywgdGhyZWFkcywgdGFza2luZywgZXRjLiApCisgICBkdXJpbmcgYSBkZWJ1Z2dpbmcgc2Vzc2lvbiBhbmQgb2ZmZXIgZGV0YWlsZWQgYW5kIHVzZWZ1bCBpbmZvcm1hdGlvbiB3aGljaCB0aGUgdXNlciBjYW4gcHJvYmUKKyAgIGFib3V0IHRoZSBPcGVuTVAgcG9ydGlvbiBvZiB0aGVpciBjb2RlLgorICAgKi8KK2V4dGVybiBpbnQgX19rbXBfZGVidWdnaW5nOyAgICAgICAgICAgICAvKiBCb29sZWFuIHdoZXRoZXIgY3VycmVudGx5IGRlYnVnZ2luZyBPcGVuTVAgUlRMICovCisvLyBSZXR1cm4gbnVtYmVyIG9mIHRocmVhZHMgc3BlY2lmaWVkIGJ5IHRoZSBkZWJ1Z2dlciBmb3IgZ2l2ZW4gcGFyYWxsZWwgcmVnaW9uLgorLyogVGhlIGlkZW50IGZpZWxkLCB3aGljaCByZXByZXNlbnRzIGEgc291cmNlIGZpbGUgbG9jYXRpb24sIGlzIHVzZWQgdG8gY2hlY2sgaWYgdGhlIAorICAgZGVidWdnZXIgaGFzIGNoYW5nZWQgdGhlIG51bWJlciBvZiB0aHJlYWRzIGZvciB0aGUgcGFyYWxsZWwgcmVnaW9uIGF0IHNvdXJjZSBmaWxlIAorICAgbG9jYXRpb24gaWRlbnQuICBUaGlzIHdheSwgc3BlY2lmaWMgcGFyYWxsZWwgcmVnaW9ucycgbnVtYmVyIG9mIHRocmVhZHMgY2FuIGJlIGNoYW5nZWQKKyAgIGF0IHRoZSBkZWJ1Z2dlcidzIHJlcXVlc3QuCisgKi8KK2ludCBfX2ttcF9vbXBfbnVtX3RocmVhZHMoIGlkZW50X3QgY29uc3QgKiBpZGVudCApOworCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICB9IC8vIGV4dGVybiAiQyIKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisKKyNlbmRpZiAvLyBLTVBfREVCVUdHRVJfSAorCisjZW5kaWYgLy8gVVNFX0RFQlVHR0VSCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfZGlzcGF0Y2guY3BwIGIvZmluYWwvcnVudGltZS9zcmMva21wX2Rpc3BhdGNoLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmQzOGEzCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2Rpc3BhdGNoLmNwcApAQCAtMCwwICsxLDI2MjAgQEAKKy8qCisgKiBrbXBfZGlzcGF0Y2guY3BwOiBkeW5hbWljIHNjaGVkdWxpbmcgLSBpdGVyYXRpb24gaW5pdGlhbGl6YXRpb24gYW5kIGRpc3BhdGNoLgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisvKgorICogRHluYW1pYyBzY2hlZHVsaW5nIGluaXRpYWxpemF0aW9uIGFuZCBkaXNwYXRjaC4KKyAqCisgKiBOT1RFOiBfX2ttcF9udGggaXMgYSBjb25zdGFudCBpbnNpZGUgb2YgYW55IGRpc3BhdGNoIGxvb3AsIGhvd2V2ZXIKKyAqICAgICAgIGl0IG1heSBjaGFuZ2UgdmFsdWVzIGJldHdlZW4gcGFyYWxsZWwgcmVnaW9ucy4gIF9fa21wX21heF9udGgKKyAqICAgICAgIGlzIHRoZSBsYXJnZXN0IHZhbHVlIF9fa21wX250aCBtYXkgdGFrZSwgMSBpcyB0aGUgc21hbGxlc3QuCisgKgorICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorI2luY2x1ZGUgImttcF9pdHQuaCIKKyNpbmNsdWRlICJrbXBfc3RyLmgiCisjaW5jbHVkZSAia21wX2Vycm9yLmgiCisjaW5jbHVkZSAia21wX3N0YXRzLmgiCisjaWYgS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2CisgICAgI2luY2x1ZGUgPGZsb2F0Lmg+CisjZW5kaWYKKworI2lmIE9NUFRfU1VQUE9SVAorI2luY2x1ZGUgIm9tcHQtaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJvbXB0LXNwZWNpZmljLmgiCisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLy8gdGVtcGxhdGUgZm9yIHR5cGUgbGltaXRzCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CitzdHJ1Y3QgaV9tYXhtaW4geworICAgIHN0YXRpYyBjb25zdCBUIG14OworICAgIHN0YXRpYyBjb25zdCBUIG1uOworfTsKK3RlbXBsYXRlPD4KK3N0cnVjdCBpX21heG1pbjwgaW50ID4geworICAgIHN0YXRpYyBjb25zdCBpbnQgbXggPSAweDdmZmZmZmZmOworICAgIHN0YXRpYyBjb25zdCBpbnQgbW4gPSAweDgwMDAwMDAwOworfTsKK3RlbXBsYXRlPD4KK3N0cnVjdCBpX21heG1pbjwgdW5zaWduZWQgaW50ID4geworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXggPSAweGZmZmZmZmZmOworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbW4gPSAweDAwMDAwMDAwOworfTsKK3RlbXBsYXRlPD4KK3N0cnVjdCBpX21heG1pbjwgbG9uZyBsb25nID4geworICAgIHN0YXRpYyBjb25zdCBsb25nIGxvbmcgbXggPSAweDdmZmZmZmZmZmZmZmZmZmZMTDsKKyAgICBzdGF0aWMgY29uc3QgbG9uZyBsb25nIG1uID0gMHg4MDAwMDAwMDAwMDAwMDAwTEw7Cit9OwordGVtcGxhdGU8Pgorc3RydWN0IGlfbWF4bWluPCB1bnNpZ25lZCBsb25nIGxvbmcgPiB7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBteCA9IDB4ZmZmZmZmZmZmZmZmZmZmZkxMOworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgbW4gPSAweDAwMDAwMDAwMDAwMDAwMDBMTDsKK307CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIEtNUF9TVEFUSUNfU1RFQUxfRU5BQkxFRAorCisgICAgLy8gcmVwbGFjZXMgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvezMyLDY0fSBzdHJ1Y3R1cmVzIGFuZCBkaXNwYXRjaF9wcml2YXRlX2luZm97MzIsNjR9X3QgdHlwZXMKKyAgICB0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CisgICAgc3RydWN0IGRpc3BhdGNoX3ByaXZhdGVfaW5mb1hYX3RlbXBsYXRlIHsKKyAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+Ojp1bnNpZ25lZF90ICBVVDsKKyAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+OjpzaWduZWRfdCAgICBTVDsKKyAgICAgICAgVVQgY291bnQ7ICAgICAgICAgICAgICAgIC8vIHVuc2lnbmVkCisgICAgICAgIFQgIHViOworICAgICAgICAvKiBBZGRpbmcgS01QX0FMSUdOX0NBQ0hFIGhlcmUgZG9lc24ndCBoZWxwIC8gY2FuIGh1cnQgcGVyZm9ybWFuY2UgKi8KKyAgICAgICAgVCAgbGI7CisgICAgICAgIFNUIHN0OyAgICAgICAgICAgICAgICAgICAvLyBzaWduZWQKKyAgICAgICAgVVQgdGM7ICAgICAgICAgICAgICAgICAgIC8vIHVuc2lnbmVkCisgICAgICAgIFQgIHN0YXRpY19zdGVhbF9jb3VudGVyOyAvLyBmb3Igc3RhdGljX3N0ZWFsIG9ubHk7IG1heWJlIGJldHRlciB0byBwdXQgYWZ0ZXIgdWIKKworICAgICAgICAvKiBwYXJtWzEtNF0gYXJlIHVzZWQgaW4gZGlmZmVyZW50IHdheXMgYnkgZGlmZmVyZW50IHNjaGVkdWxpbmcgYWxnb3JpdGhtcyAqLworCisgICAgICAgIC8vIEtNUF9BTElHTiggMzIgKSBlbnN1cmVzICggaWYgdGhlIEtNUF9BTElHTiBtYWNybyBpcyB0dXJuZWQgb24gKQorICAgICAgICAvLyAgICBhKSBwYXJtMyBpcyBwcm9wZXJseSBhbGlnbmVkIGFuZAorICAgICAgICAvLyAgICBiKSBhbGwgcGFybTEtNCBhcmUgaW4gdGhlIHNhbWUgY2FjaGUgbGluZS4KKyAgICAgICAgLy8gQmVjYXVzZSBvZiBwYXJtMS00IGFyZSB1c2VkIHRvZ2V0aGVyLCBwZXJmb3JtYW5jZSBzZWVtcyB0byBiZSBiZXR0ZXIKKyAgICAgICAgLy8gaWYgdGhleSBhcmUgaW4gdGhlIHNhbWUgbGluZSAobm90IG1lYXN1cmVkIHRob3VnaCkuCisKKyAgICAgICAgc3RydWN0IEtNUF9BTElHTiggMzIgKSB7IC8vIGNvbXBpbGVyIGRvZXMgbm90IGFjY2VwdCBzaXplb2YoVCkqNAorICAgICAgICAgICAgVCAgcGFybTE7CisgICAgICAgICAgICBUICBwYXJtMjsKKyAgICAgICAgICAgIFQgIHBhcm0zOworICAgICAgICAgICAgVCAgcGFybTQ7CisgICAgICAgIH07CisKKyAgICAgICAgVVQgb3JkZXJlZF9sb3dlcjsgLy8gdW5zaWduZWQKKyAgICAgICAgVVQgb3JkZXJlZF91cHBlcjsgLy8gdW5zaWduZWQKKyAgICAgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIFQgIGxhc3RfdXBwZXI7CisgICAgICAgICNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworICAgIH07CisKKyNlbHNlIC8qIEtNUF9TVEFUSUNfU1RFQUxfRU5BQkxFRCAqLworCisgICAgLy8gcmVwbGFjZXMgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvezMyLDY0fSBzdHJ1Y3R1cmVzIGFuZCBkaXNwYXRjaF9wcml2YXRlX2luZm97MzIsNjR9X3QgdHlwZXMKKyAgICB0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CisgICAgc3RydWN0IGRpc3BhdGNoX3ByaXZhdGVfaW5mb1hYX3RlbXBsYXRlIHsKKyAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+Ojp1bnNpZ25lZF90ICBVVDsKKyAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+OjpzaWduZWRfdCAgICBTVDsKKyAgICAgICAgVCAgbGI7CisgICAgICAgIFQgIHViOworICAgICAgICBTVCBzdDsgICAgICAgICAgICAvLyBzaWduZWQKKyAgICAgICAgVVQgdGM7ICAgICAgICAgICAgLy8gdW5zaWduZWQKKworICAgICAgICBUICBwYXJtMTsKKyAgICAgICAgVCAgcGFybTI7CisgICAgICAgIFQgIHBhcm0zOworICAgICAgICBUICBwYXJtNDsKKworICAgICAgICBVVCBjb3VudDsgICAgICAgICAvLyB1bnNpZ25lZAorCisgICAgICAgIFVUIG9yZGVyZWRfbG93ZXI7IC8vIHVuc2lnbmVkCisgICAgICAgIFVUIG9yZGVyZWRfdXBwZXI7IC8vIHVuc2lnbmVkCisgICAgICAgICNpZiBLTVBfT1NfV0lORE9XUworCVQgIGxhc3RfdXBwZXI7CisgICAgICAgICNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworICAgIH07CisKKyNlbmRpZiAvKiBLTVBfU1RBVElDX1NURUFMX0VOQUJMRUQgKi8KKworLy8gcmVwbGFjZXMgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvIHN0cnVjdHVyZSBhbmQgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3QgdHlwZQordGVtcGxhdGU8IHR5cGVuYW1lIFQgPgorc3RydWN0IEtNUF9BTElHTl9DQUNIRSBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGUgeworICAgIC8vIGR1cGxpY2F0ZSBhbGlnbm1lbnQgaGVyZSwgb3RoZXJ3aXNlIHNpemUgb2Ygc3RydWN0dXJlIGlzIG5vdCBjb3JyZWN0IGluIG91ciBjb21waWxlcgorICAgIHVuaW9uIEtNUF9BTElHTl9DQUNIRSBwcml2YXRlX2luZm9fdG1wbCB7CisgICAgICAgIGRpc3BhdGNoX3ByaXZhdGVfaW5mb1hYX3RlbXBsYXRlPCBUID4gcDsKKyAgICAgICAgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvNjRfdCAgICAgICAgICAgICBwNjQ7CisgICAgfSB1OworICAgIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZTsgIC8qIHNjaGVkdWxpbmcgYWxnb3JpdGhtICovCisgICAga21wX3VpbnQzMiAgICAgIG9yZGVyZWQ7ICAgLyogb3JkZXJlZCBjbGF1c2Ugc3BlY2lmaWVkICovCisgICAga21wX3VpbnQzMiAgICAgIG9yZGVyZWRfYnVtcGVkOworICAgIGttcF9pbnQzMiAgIG9yZGVyZWRfZHVtbXlbS01QX01BWF9PUkRFUkVELTNdOyAvLyB0byByZXRhaW4gdGhlIHN0cnVjdHVyZSBzaXplIGFmdGVyIG1ha2luZyBvcmRlcgorICAgIGRpc3BhdGNoX3ByaXZhdGVfaW5mbyAqIG5leHQ7IC8qIHN0YWNrIG9mIGJ1ZmZlcnMgZm9yIG5lc3Qgb2Ygc2VyaWFsIHJlZ2lvbnMgKi8KKyAgICBrbXBfdWludDMyICAgICAgbm9tZXJnZTsgICAvKiBkb24ndCBtZXJnZSBpdGVycyBpZiBzZXJpYWxpemVkICovCisgICAga21wX3VpbnQzMiAgICAgIHR5cGVfc2l6ZTsKKyAgICBlbnVtIGNvbnNfdHlwZSAgcHVzaGVkX3dzOworfTsKKworCisvLyByZXBsYWNlcyBkaXNwYXRjaF9zaGFyZWRfaW5mb3szMiw2NH0gc3RydWN0dXJlcyBhbmQgZGlzcGF0Y2hfc2hhcmVkX2luZm97MzIsNjR9X3QgdHlwZXMKK3RlbXBsYXRlPCB0eXBlbmFtZSBVVCA+CitzdHJ1Y3QgZGlzcGF0Y2hfc2hhcmVkX2luZm9YWF90ZW1wbGF0ZSB7CisgICAgLyogY2h1bmsgaW5kZXggdW5kZXIgZHluYW1pYywgbnVtYmVyIG9mIGlkbGUgdGhyZWFkcyB1bmRlciBzdGF0aWMtc3RlYWw7CisgICAgICAgaXRlcmF0aW9uIGluZGV4IG90aGVyd2lzZSAqLworICAgIHZvbGF0aWxlIFVUICAgICBpdGVyYXRpb247CisgICAgdm9sYXRpbGUgVVQgICAgIG51bV9kb25lOworICAgIHZvbGF0aWxlIFVUICAgICBvcmRlcmVkX2l0ZXJhdGlvbjsKKyAgICBVVCAgIG9yZGVyZWRfZHVtbXlbS01QX01BWF9PUkRFUkVELTFdOyAvLyB0byByZXRhaW4gdGhlIHN0cnVjdHVyZSBzaXplIG1ha2luZyBvcmRlcmVkX2l0ZXJhdGlvbiBzY2FsYXIKK307CisKKy8vIHJlcGxhY2VzIGRpc3BhdGNoX3NoYXJlZF9pbmZvIHN0cnVjdHVyZSBhbmQgZGlzcGF0Y2hfc2hhcmVkX2luZm9fdCB0eXBlCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVVQgPgorc3RydWN0IGRpc3BhdGNoX3NoYXJlZF9pbmZvX3RlbXBsYXRlIHsKKyAgICAvLyB3ZSBuZWVkIHVuaW9uIGhlcmUgdG8ga2VlcCB0aGUgc3RydWN0dXJlIHNpemUKKyAgICB1bmlvbiBzaGFyZWRfaW5mb190bXBsIHsKKyAgICAgICAgZGlzcGF0Y2hfc2hhcmVkX2luZm9YWF90ZW1wbGF0ZTwgVVQgPiAgczsKKyAgICAgICAgZGlzcGF0Y2hfc2hhcmVkX2luZm82NF90ICAgICAgICAgICAgICAgczY0OworICAgIH0gdTsKKyAgICB2b2xhdGlsZSBrbXBfdWludDMyICAgICBidWZmZXJfaW5kZXg7Cit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjdW5kZWYgVVNFX1RFU1RfTE9DS1MKKworLy8gdGVzdF90aGVuX2FkZCB0ZW1wbGF0ZSAoZ2VuZXJhbCB0ZW1wbGF0ZSBzaG91bGQgTk9UIGJlIHVzZWQpCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CitzdGF0aWMgX19mb3JjZWlubGluZSBUCit0ZXN0X3RoZW5fYWRkKCB2b2xhdGlsZSBUICpwLCBUIGQgKSB7IEtNUF9BU1NFUlQoMCk7IH07CisKK3RlbXBsYXRlPD4KK19fZm9yY2VpbmxpbmUga21wX2ludDMyCit0ZXN0X3RoZW5fYWRkPCBrbXBfaW50MzIgPiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgZCApCit7CisgICAga21wX2ludDMyIHI7CisgICAgciA9IEtNUF9URVNUX1RIRU5fQUREMzIoIHAsIGQgKTsKKyAgICByZXR1cm4gcjsKK30KKwordGVtcGxhdGU8PgorX19mb3JjZWlubGluZSBrbXBfaW50NjQKK3Rlc3RfdGhlbl9hZGQ8IGttcF9pbnQ2NCA+KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBkICkKK3sKKyAgICBrbXBfaW50NjQgcjsKKyAgICByID0gS01QX1RFU1RfVEhFTl9BREQ2NCggcCwgZCApOworICAgIHJldHVybiByOworfQorCisvLyB0ZXN0X3RoZW5faW5jX2FjcSB0ZW1wbGF0ZSAoZ2VuZXJhbCB0ZW1wbGF0ZSBzaG91bGQgTk9UIGJlIHVzZWQpCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CitzdGF0aWMgX19mb3JjZWlubGluZSBUCit0ZXN0X3RoZW5faW5jX2FjcSggdm9sYXRpbGUgVCAqcCApIHsgS01QX0FTU0VSVCgwKTsgfTsKKwordGVtcGxhdGU8PgorX19mb3JjZWlubGluZSBrbXBfaW50MzIKK3Rlc3RfdGhlbl9pbmNfYWNxPCBrbXBfaW50MzIgPiggdm9sYXRpbGUga21wX2ludDMyICpwICkKK3sKKyAgICBrbXBfaW50MzIgcjsKKyAgICByID0gS01QX1RFU1RfVEhFTl9JTkNfQUNRMzIoIHAgKTsKKyAgICByZXR1cm4gcjsKK30KKwordGVtcGxhdGU8PgorX19mb3JjZWlubGluZSBrbXBfaW50NjQKK3Rlc3RfdGhlbl9pbmNfYWNxPCBrbXBfaW50NjQgPiggdm9sYXRpbGUga21wX2ludDY0ICpwICkKK3sKKyAgICBrbXBfaW50NjQgcjsKKyAgICByID0gS01QX1RFU1RfVEhFTl9JTkNfQUNRNjQoIHAgKTsKKyAgICByZXR1cm4gcjsKK30KKworLy8gdGVzdF90aGVuX2luYyB0ZW1wbGF0ZSAoZ2VuZXJhbCB0ZW1wbGF0ZSBzaG91bGQgTk9UIGJlIHVzZWQpCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CitzdGF0aWMgX19mb3JjZWlubGluZSBUCit0ZXN0X3RoZW5faW5jKCB2b2xhdGlsZSBUICpwICkgeyBLTVBfQVNTRVJUKDApOyB9OworCit0ZW1wbGF0ZTw+CitfX2ZvcmNlaW5saW5lIGttcF9pbnQzMgordGVzdF90aGVuX2luYzwga21wX2ludDMyID4oIHZvbGF0aWxlIGttcF9pbnQzMiAqcCApCit7CisgICAga21wX2ludDMyIHI7CisgICAgciA9IEtNUF9URVNUX1RIRU5fSU5DMzIoIHAgKTsKKyAgICByZXR1cm4gcjsKK30KKwordGVtcGxhdGU8PgorX19mb3JjZWlubGluZSBrbXBfaW50NjQKK3Rlc3RfdGhlbl9pbmM8IGttcF9pbnQ2NCA+KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAgKQoreworICAgIGttcF9pbnQ2NCByOworICAgIHIgPSBLTVBfVEVTVF9USEVOX0lOQzY0KCBwICk7CisgICAgcmV0dXJuIHI7Cit9CisKKy8vIGNvbXBhcmVfYW5kX3N3YXAgdGVtcGxhdGUgKGdlbmVyYWwgdGVtcGxhdGUgc2hvdWxkIE5PVCBiZSB1c2VkKQordGVtcGxhdGU8IHR5cGVuYW1lIFQgPgorc3RhdGljIF9fZm9yY2VpbmxpbmUga21wX2ludDMyCitjb21wYXJlX2FuZF9zd2FwKCB2b2xhdGlsZSBUICpwLCBUIGMsIFQgcyApIHsgS01QX0FTU0VSVCgwKTsgfTsKKwordGVtcGxhdGU8PgorX19mb3JjZWlubGluZSBrbXBfaW50MzIKK2NvbXBhcmVfYW5kX3N3YXA8IGttcF9pbnQzMiA+KCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBjLCBrbXBfaW50MzIgcyApCit7CisgICAgcmV0dXJuIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUwzMiggcCwgYywgcyApOworfQorCit0ZW1wbGF0ZTw+CitfX2ZvcmNlaW5saW5lIGttcF9pbnQzMgorY29tcGFyZV9hbmRfc3dhcDwga21wX2ludDY0ID4oIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGMsIGttcF9pbnQ2NCBzICkKK3sKKyAgICByZXR1cm4gS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDY0KCBwLCBjLCBzICk7Cit9CisKKy8qCisgICAgU3BpbiB3YWl0IGxvb3AgdGhhdCBmaXJzdCBkb2VzIHBhdXNlLCB0aGVuIHlpZWxkLgorICAgIFdhaXRzIHVudGlsIGZ1bmN0aW9uIHJldHVybnMgbm9uLXplcm8gd2hlbiBjYWxsZWQgd2l0aCAqc3Bpbm5lciBhbmQgY2hlY2suCisgICAgRG9lcyBOT1QgcHV0IHRocmVhZHMgdG8gc2xlZXAuCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIEFyZ3VtZW50czoKKyAgICAgICAgb2JqIC0tIGlzIGhpZ2hlci1sZXZlbCBzeW5jaHJvbml6YXRpb24gb2JqZWN0IHRvIHJlcG9ydCB0byBpdHRub3RpZnkuIEl0IGlzIHVzZWQgdG8gcmVwb3J0CisgICAgICAgICAgICBsb2NrcyBjb25zaXN0ZW50bHkuIEZvciBleGFtcGxlLCBpZiBsb2NrIGlzIGFjcXVpcmVkIGltbWVkaWF0ZWx5LCBpdHMgYWRkcmVzcyBpcworICAgICAgICAgICAgcmVwb3J0ZWQgdG8gaXR0bm90aWZ5IHZpYSBLTVBfRlNZTkNfQUNRVUlSRUQoKS4gSG93ZXZlciwgaXQgbG9jayBjYW5ub3QgYmUgYWNxdWlyZWQKKyAgICAgICAgICAgIGltbWVkaWF0ZWx5IGFuZCBsb2NrIHJvdXRpbmUgY2FsbHMgdG8gS01QX1dBSVRfWUlFTEQoKSwgdGhlIGxhdGVyIHNob3VsZCByZXBvcnQgdGhlIHNhbWUKKyAgICAgICAgICAgIGFkZHJlc3MsIG5vdCBhbiBhZGRyZXNzIG9mIGxvdy1sZXZlbCBzcGlubmVyLgorI2VuZGlmIC8vIFVTRV9JVFRfQlVJTEQKKyovCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVVQgPgorLy8gVG9EbzogbWFrZSBpbmxpbmUgZnVuY3Rpb24gKG1vdmUgdG8gaGVhZGVyIGZpbGUgZm9yIGljbCkKK3N0YXRpYyBVVCAgLy8gdW5zaWduZWQgNC0gb3IgOC1ieXRlIHR5cGUKK19fa21wX3dhaXRfeWllbGQoIHZvbGF0aWxlIFVUICogc3Bpbm5lciwKKyAgICAgICAgICAgICAgICAgIFVUICAgICAgICAgICAgY2hlY2tlciwKKyAgICAgICAgICAgICAgICAgIGttcF91aW50MzIgKCogcHJlZCkoIFVULCBVVCApCisgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyh2b2lkICAgICAgICAqIG9iaikgICAgLy8gSGlnaGVyLWxldmVsIHN5bmNocm9uaXphdGlvbiBvYmplY3QsIG9yIE5VTEwuCisgICAgICAgICAgICAgICAgICApCit7CisgICAgLy8gbm90ZTogd2UgbWF5IG5vdCBiZWxvbmcgdG8gYSB0ZWFtIGF0IHRoaXMgcG9pbnQKKyAgICByZWdpc3RlciB2b2xhdGlsZSBVVCAgICAgICAgICogc3BpbiAgICAgICAgICA9IHNwaW5uZXI7CisgICAgcmVnaXN0ZXIgICAgICAgICAgVVQgICAgICAgICAgIGNoZWNrICAgICAgICAgPSBjaGVja2VyOworICAgIHJlZ2lzdGVyICAgICAgICAgIGttcF91aW50MzIgICBzcGluczsKKyAgICByZWdpc3RlciAgICAgICAgICBrbXBfdWludDMyICgqZikgKCBVVCwgVVQgKSA9IHByZWQ7CisgICAgcmVnaXN0ZXIgICAgICAgICAgVVQgICAgICAgICAgIHI7CisKKyAgICBLTVBfRlNZTkNfU1BJTl9JTklUKCBvYmosICh2b2lkKikgc3BpbiApOworICAgIEtNUF9JTklUX1lJRUxEKCBzcGlucyApOworICAgIC8vIG1haW4gd2FpdCBzcGluIGxvb3AKKyAgICB3aGlsZSghZihyID0gKnNwaW4sIGNoZWNrKSkKKyAgICB7CisgICAgICAgIEtNUF9GU1lOQ19TUElOX1BSRVBBUkUoIG9iaiApOworICAgICAgICAvKiBHRUggLSByZW1vdmUgdGhpcyBzaW5jZSBpdCB3YXMgYWNjaWRlbnRhbGx5IGludHJvZHVjZWQgd2hlbiBrbXBfd2FpdCB3YXMgc3BsaXQuCisgICAgICAgICAgIEl0IGNhdXNlcyBwcm9ibGVtcyB3aXRoIGluZmluaXRlIHJlY3Vyc2lvbiBiZWNhdXNlIG9mIGV4aXQgbG9jayAqLworICAgICAgICAvKiBpZiAoIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkgJiYgX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCkKKyAgICAgICAgICAgIF9fa21wX2Fib3J0X3RocmVhZCgpOyAqLworCisgICAgICAgIC8vIGlmIHdlIGFyZSBvdmVyc3Vic2NyaWJlZCwKKyAgICAgICAgLy8gb3IgaGF2ZSB3YWl0ZWQgYSBiaXQgKGFuZCBLTVBfTElCUkFSWT10aHJvdWdocHV0LCB0aGVuIHlpZWxkCisgICAgICAgIC8vIHBhdXNlIGlzIGluIHRoZSBmb2xsb3dpbmcgY29kZQorICAgICAgICBLTVBfWUlFTEQoIFRDUl80KF9fa21wX250aCkgPiBfX2ttcF9hdmFpbF9wcm9jICk7CisgICAgICAgIEtNUF9ZSUVMRF9TUElOKCBzcGlucyApOworICAgIH0KKyAgICBLTVBfRlNZTkNfU1BJTl9BQ1FVSVJFRCggb2JqICk7CisgICAgcmV0dXJuIHI7Cit9CisKK3RlbXBsYXRlPCB0eXBlbmFtZSBVVCA+CitzdGF0aWMga21wX3VpbnQzMiBfX2ttcF9lcSggVVQgdmFsdWUsIFVUIGNoZWNrZXIpIHsKKyAgICByZXR1cm4gdmFsdWUgPT0gY2hlY2tlcjsKK30KKwordGVtcGxhdGU8IHR5cGVuYW1lIFVUID4KK3N0YXRpYyBrbXBfdWludDMyIF9fa21wX25lcSggVVQgdmFsdWUsIFVUIGNoZWNrZXIpIHsKKyAgICByZXR1cm4gdmFsdWUgIT0gY2hlY2tlcjsKK30KKwordGVtcGxhdGU8IHR5cGVuYW1lIFVUID4KK3N0YXRpYyBrbXBfdWludDMyIF9fa21wX2x0KCBVVCB2YWx1ZSwgVVQgY2hlY2tlcikgeworICAgIHJldHVybiB2YWx1ZSA8IGNoZWNrZXI7Cit9CisKK3RlbXBsYXRlPCB0eXBlbmFtZSBVVCA+CitzdGF0aWMga21wX3VpbnQzMiBfX2ttcF9nZSggVVQgdmFsdWUsIFVUIGNoZWNrZXIpIHsKKyAgICByZXR1cm4gdmFsdWUgPj0gY2hlY2tlcjsKK30KKwordGVtcGxhdGU8IHR5cGVuYW1lIFVUID4KK3N0YXRpYyBrbXBfdWludDMyIF9fa21wX2xlKCBVVCB2YWx1ZSwgVVQgY2hlY2tlcikgeworICAgIHJldHVybiB2YWx1ZSA8PSBjaGVja2VyOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkCitfX2ttcF9kaXNwYXRjaF9kZW9fZXJyb3IoIGludCAqZ3RpZF9yZWYsIGludCAqY2lkX3JlZiwgaWRlbnRfdCAqbG9jX3JlZiApCit7CisgICAga21wX2luZm9fdCAqdGg7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkX3JlZiApOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIHRoID0gX19rbXBfdGhyZWFkc1sqZ3RpZF9yZWZdOworICAgICAgICBpZiAoIHRoIC0+IHRoLnRoX3Jvb3QgLT4gci5yX2FjdGl2ZQorICAgICAgICAgICYmICggdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZGlzcGF0Y2hfcHJfY3VycmVudCAtPiBwdXNoZWRfd3MgIT0gY3Rfbm9uZSApICkgeworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgICAgICAgICAgICBfX2ttcF9wdXNoX3N5bmMoICpndGlkX3JlZiwgY3Rfb3JkZXJlZF9pbl9wZG8sIGxvY19yZWYsIE5VTEwsIDAgKTsKKyNlbHNlCisgICAgICAgICAgICBfX2ttcF9wdXNoX3N5bmMoICpndGlkX3JlZiwgY3Rfb3JkZXJlZF9pbl9wZG8sIGxvY19yZWYsIE5VTEwgKTsKKyNlbmRpZgorICAgICAgICB9CisgICAgfQorfQorCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVVQgPgorc3RhdGljIHZvaWQKK19fa21wX2Rpc3BhdGNoX2RlbyggaW50ICpndGlkX3JlZiwgaW50ICpjaWRfcmVmLCBpZGVudF90ICpsb2NfcmVmICkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBVVCA+OjpzaWduZWRfdCAgICBTVDsKKyAgICBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFVUID4gKiBwcjsKKworICAgIGludCBndGlkID0gKmd0aWRfcmVmOworLy8gICAgaW50ICBjaWQgPSAqY2lkX3JlZjsKKyAgICBrbXBfaW5mb190ICp0aCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aCAtPiB0aC50aF9kaXNwYXRjaCApOworCisgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX2RlbzogVCMlZCBjYWxsZWRcbiIsIGd0aWQgKSApOworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBwciA9IHJlaW50ZXJwcmV0X2Nhc3Q8IGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZTwgVVQgPiogPgorICAgICAgICAgICAgKCB0aCAtPiB0aC50aF9kaXNwYXRjaCAtPiB0aF9kaXNwYXRjaF9wcl9jdXJyZW50ICk7CisgICAgICAgIGlmICggcHIgLT4gcHVzaGVkX3dzICE9IGN0X25vbmUgKSB7CisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKyAgICAgICAgICAgIF9fa21wX3B1c2hfc3luYyggZ3RpZCwgY3Rfb3JkZXJlZF9pbl9wZG8sIGxvY19yZWYsIE5VTEwsIDAgKTsKKyNlbHNlCisgICAgICAgICAgICBfX2ttcF9wdXNoX3N5bmMoIGd0aWQsIGN0X29yZGVyZWRfaW5fcGRvLCBsb2NfcmVmLCBOVUxMICk7CisjZW5kaWYKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICggISB0aCAtPiB0aC50aF90ZWFtIC0+IHQudF9zZXJpYWxpemVkICkgeworICAgICAgICBkaXNwYXRjaF9zaGFyZWRfaW5mb190ZW1wbGF0ZTwgVVQgPiAgKiBzaCA9IHJlaW50ZXJwcmV0X2Nhc3Q8IGRpc3BhdGNoX3NoYXJlZF9pbmZvX3RlbXBsYXRlPCBVVCA+KiA+CisgICAgICAgICAgICAoIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2Rpc3BhdGNoX3NoX2N1cnJlbnQgKTsKKyAgICAgICAgVVQgIGxvd2VyOworCisgICAgICAgIGlmICggISBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgICAgICAgICAgcHIgPSByZWludGVycHJldF9jYXN0PCBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFVUID4qID4KKyAgICAgICAgICAgICAgICAgICAgKCB0aCAtPiB0aC50aF9kaXNwYXRjaCAtPiB0aF9kaXNwYXRjaF9wcl9jdXJyZW50ICk7CisgICAgICAgIH0KKyAgICAgICAgbG93ZXIgPSBwci0+dS5wLm9yZGVyZWRfbG93ZXI7CisKKyAgICAgICAgI2lmICEgZGVmaW5lZCggS01QX0dPTVBfQ09NUEFUICkKKyAgICAgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAgICAgICAgIGlmICggcHItPm9yZGVyZWRfYnVtcGVkICkgeworICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29uc19oZWFkZXIgKnAgPSBfX2ttcF90aHJlYWRzWyBndGlkIF0tPnRoLnRoX2NvbnM7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdDIoCisgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaTE4bl9tc2dfQ25zTXVsdGlwbGVOZXN0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgY3Rfb3JkZXJlZF9pbl9wZG8sIGxvY19yZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAmIHAtPnN0YWNrX2RhdGFbIHAtPndfdG9wIF0KKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICNlbmRpZiAvKiAhZGVmaW5lZChLTVBfR09NUF9DT01QQVQpICovCisKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgICAgICJfX2ttcF9kaXNwYXRjaF9kZW86IFQjJSVkIGJlZm9yZSB3YWl0OiBvcmRlcmVkX2l0ZXI6JSUlcyBsb3dlcjolJSVzXG4iLAorICAgICAgICAgICAgICAgIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYyApOworICAgICAgICAgICAgS0RfVFJBQ0UoMTAwMCwgKCBidWZmLCBndGlkLCBzaC0+dS5zLm9yZGVyZWRfaXRlcmF0aW9uLCBsb3dlciApICk7CisgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICAgICAgfQorICAgICAgICAjZW5kaWYKKworICAgICAgICBfX2ttcF93YWl0X3lpZWxkPCBVVCA+KCAmc2gtPnUucy5vcmRlcmVkX2l0ZXJhdGlvbiwgbG93ZXIsIF9fa21wX2dlPCBVVCA+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKCBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgS01QX01CKCk7ICAvKiBpcyB0aGlzIG5lY2Vzc2FyeT8gKi8KKyAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgIl9fa21wX2Rpc3BhdGNoX2RlbzogVCMlJWQgYWZ0ZXIgd2FpdDogb3JkZXJlZF9pdGVyOiUlJXMgbG93ZXI6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICB0cmFpdHNfdDwgVVQgPjo6c3BlYywgdHJhaXRzX3Q8IFVUID46OnNwZWMgKTsKKyAgICAgICAgICAgIEtEX1RSQUNFKDEwMDAsICggYnVmZiwgZ3RpZCwgc2gtPnUucy5vcmRlcmVkX2l0ZXJhdGlvbiwgbG93ZXIgKSApOworICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgIH0KKyAgICAgICAgI2VuZGlmCisgICAgfQorICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9kZW86IFQjJWQgcmV0dXJuZWRcbiIsIGd0aWQgKSApOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZGlzcGF0Y2hfZHhvX2Vycm9yKCBpbnQgKmd0aWRfcmVmLCBpbnQgKmNpZF9yZWYsIGlkZW50X3QgKmxvY19yZWYgKQoreworICAgIGttcF9pbmZvX3QgKnRoOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIHRoID0gX19rbXBfdGhyZWFkc1sqZ3RpZF9yZWZdOworICAgICAgICBpZiAoIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2Rpc3BhdGNoX3ByX2N1cnJlbnQgLT4gcHVzaGVkX3dzICE9IGN0X25vbmUgKSB7CisgICAgICAgICAgICBfX2ttcF9wb3Bfc3luYyggKmd0aWRfcmVmLCBjdF9vcmRlcmVkX2luX3BkbywgbG9jX3JlZiApOworICAgICAgICB9CisgICAgfQorfQorCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVVQgPgorc3RhdGljIHZvaWQKK19fa21wX2Rpc3BhdGNoX2R4byggaW50ICpndGlkX3JlZiwgaW50ICpjaWRfcmVmLCBpZGVudF90ICpsb2NfcmVmICkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBVVCA+OjpzaWduZWRfdCAgICBTVDsKKyAgICBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFVUID4gKiBwcjsKKworICAgIGludCBndGlkID0gKmd0aWRfcmVmOworLy8gICAgaW50ICBjaWQgPSAqY2lkX3JlZjsKKyAgICBrbXBfaW5mb190ICp0aCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aCAtPiB0aC50aF9kaXNwYXRjaCApOworCisgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX2R4bzogVCMlZCBjYWxsZWRcbiIsIGd0aWQgKSApOworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBwciA9IHJlaW50ZXJwcmV0X2Nhc3Q8IGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZTwgVVQgPiogPgorICAgICAgICAgICAgKCB0aCAtPiB0aC50aF9kaXNwYXRjaCAtPiB0aF9kaXNwYXRjaF9wcl9jdXJyZW50ICk7CisgICAgICAgIGlmICggcHIgLT4gcHVzaGVkX3dzICE9IGN0X25vbmUgKSB7CisgICAgICAgICAgICBfX2ttcF9wb3Bfc3luYyggZ3RpZCwgY3Rfb3JkZXJlZF9pbl9wZG8sIGxvY19yZWYgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICggISB0aCAtPiB0aC50aF90ZWFtIC0+IHQudF9zZXJpYWxpemVkICkgeworICAgICAgICBkaXNwYXRjaF9zaGFyZWRfaW5mb190ZW1wbGF0ZTwgVVQgPiAgKiBzaCA9IHJlaW50ZXJwcmV0X2Nhc3Q8IGRpc3BhdGNoX3NoYXJlZF9pbmZvX3RlbXBsYXRlPCBVVCA+KiA+CisgICAgICAgICAgICAoIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2Rpc3BhdGNoX3NoX2N1cnJlbnQgKTsKKworICAgICAgICBpZiAoICEgX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAgICAgcHIgPSByZWludGVycHJldF9jYXN0PCBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFVUID4qID4KKyAgICAgICAgICAgICAgICAoIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2Rpc3BhdGNoX3ByX2N1cnJlbnQgKTsKKyAgICAgICAgfQorCisgICAgICAgIEtNUF9GU1lOQ19SRUxFQVNJTkcoICYgc2gtPnUucy5vcmRlcmVkX2l0ZXJhdGlvbiApOworICAgICAgICAjaWYgISBkZWZpbmVkKCBLTVBfR09NUF9DT01QQVQgKQorICAgICAgICAgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBwci0+b3JkZXJlZF9idW1wZWQgIT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbnNfaGVhZGVyICpwID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF9jb25zOworICAgICAgICAgICAgICAgICAgICAvKiBIb3cgdG8gdGVzdCBpdD8gLSBPTSAqLworICAgICAgICAgICAgICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QyKAorICAgICAgICAgICAgICAgICAgICAgICAga21wX2kxOG5fbXNnX0Nuc011bHRpcGxlTmVzdGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGN0X29yZGVyZWRfaW5fcGRvLCBsb2NfcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgJiBwLT5zdGFja19kYXRhWyBwLT53X3RvcCBdCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAjZW5kaWYgLyogIWRlZmluZWQoS01QX0dPTVBfQ09NUEFUKSAqLworCisgICAgICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgICAgIHByLT5vcmRlcmVkX2J1bXBlZCArPSAxOworCisgICAgICAgIEtEX1RSQUNFKDEwMDAsICgiX19rbXBfZGlzcGF0Y2hfZHhvOiBUIyVkIGJ1bXBpbmcgb3JkZXJlZCBvcmRlcmVkX2J1bXBlZD0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHByLT5vcmRlcmVkX2J1bXBlZCApICk7CisKKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICAgICAgLyogVE9ETyB1c2UgZ2VuZXJhbCByZWxlYXNlIHByb2NlZHVyZT8gKi8KKyAgICAgICAgdGVzdF90aGVuX2luYzwgU1QgPiggKHZvbGF0aWxlIFNUICopICYgc2gtPnUucy5vcmRlcmVkX2l0ZXJhdGlvbiApOworCisgICAgICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworICAgIH0KKyAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfZHhvOiBUIyVkIHJldHVybmVkXG4iLCBndGlkICkgKTsKK30KKworLyogQ29tcHV0ZXMgYW5kIHJldHVybnMgeCB0byB0aGUgcG93ZXIgb2YgeSwgd2hlcmUgeSBtdXN0IGEgbm9uLW5lZ2F0aXZlIGludGVnZXIgKi8KK3RlbXBsYXRlPCB0eXBlbmFtZSBVVCA+CitzdGF0aWMgX19mb3JjZWlubGluZSBsb25nIGRvdWJsZQorX19rbXBfcG93KGxvbmcgZG91YmxlIHgsIFVUIHkpIHsKKyAgICBsb25nIGRvdWJsZSBzPTEuMEw7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKHggPiAwLjAgJiYgeCA8IDEuMCk7CisgICAgLy9LTVBfREVCVUdfQVNTRVJUKHkgPj0gMCk7IC8vIHkgaXMgdW5zaWduZWQKKyAgICB3aGlsZSh5KSB7CisgICAgICAgIGlmICggeSAmIDEgKQorICAgICAgICAgICAgcyAqPSB4OworICAgICAgICB4ICo9IHg7CisgICAgICAgIHkgPj49IDE7CisgICAgfQorICAgIHJldHVybiBzOworfQorCisvKiBDb21wdXRlcyBhbmQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHVuYXNzaWduZWQgaXRlcmF0aW9ucyBhZnRlciBpZHggY2h1bmtzIGhhdmUgYmVlbiBhc3NpZ25lZAorICAgKHRoZSB0b3RhbCBudW1iZXIgb2YgdW5hc3NpZ25lZCBpdGVyYXRpb25zIGluIGNodW5rcyB3aXRoIGluZGV4IGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBpZHgpLgorICAgX19mb3JjZWlubGluZSBzZWVtcyB0byBiZSBicm9rZW4gc28gdGhhdCBpZiB3ZSBfX2ZvcmNlaW5saW5lIHRoaXMgZnVuY3Rpb24sIHRoZSBiZWhhdmlvciBpcyB3cm9uZworICAgKG9uZSBvZiB0aGUgdW5pdCB0ZXN0cywgc2NoX2d1aWRlZF9hbmFseXRpY2FsX2Jhc2ljLmNwcCwgZmFpbHMpCisqLwordGVtcGxhdGU8IHR5cGVuYW1lIFQgPgorc3RhdGljIF9faW5saW5lIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnVuc2lnbmVkX3QKK19fa21wX2Rpc3BhdGNoX2d1aWRlZF9yZW1haW5pbmcoCisgICAgVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YywKKyAgICB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+OjpmbG9hdGluZ190IGJhc2UsCisgICAgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6dW5zaWduZWRfdCBpZHgKKykgeworICAgIC8qIE5vdGU6IE9uIFdpbmRvd3MqIE9TIG9uIElBLTMyIGFyY2hpdGVjdHVyZSBhbmQgSW50ZWwoUikgNjQsIGF0CisgICAgICAgbGVhc3QgZm9yIElDTCA4LjEsIGxvbmcgZG91YmxlIGFyaXRobWV0aWMgbWF5IG5vdCByZWFsbHkgaGF2ZQorICAgICAgIGxvbmcgZG91YmxlIHByZWNpc2lvbiwgZXZlbiB3aXRoIC9RbG9uZ19kb3VibGUuICBDdXJyZW50bHksIHdlCisgICAgICAgd29ya2Fyb3VuZCB0aGF0IGluIHRoZSBjYWxsZXIgY29kZSwgYnkgbWFuaXB1bGF0aW5nIHRoZSBGUENXIGZvcgorICAgICAgIFdpbmRvd3MqIE9TIG9uIElBLTMyIGFyY2hpdGVjdHVyZS4gIFRoZSBsYWNrIG9mIHByZWNpc2lvbiBpcyBub3QKKyAgICAgICBleHBlY3RlZCB0byBiZSBhIGNvcnJlY3RuZXNzIGlzc3VlLCB0aG91Z2guCisgICAgKi8KKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnVuc2lnbmVkX3QgIFVUOworCisgICAgbG9uZyBkb3VibGUgeCA9IHRjICogX19rbXBfcG93PCBVVCA+KGJhc2UsIGlkeCk7CisgICAgVVQgciA9IChVVCkgeDsKKyAgICBpZiAoIHggPT0gciApCisgICAgICAgIHJldHVybiByOworICAgIHJldHVybiByICsgMTsKK30KKworLy8gUGFyYW1ldGVycyBvZiB0aGUgZ3VpZGVkLWl0ZXJhdGl2ZSBhbGdvcml0aG06CisvLyAgIHAyID0gbiAqIG5wcm9jICogKCBjaHVuayArIDEgKSAgLy8gcG9pbnQgb2Ygc3dpdGNoaW5nIHRvIGR5bmFtaWMKKy8vICAgcDMgPSAxIC8gKCBuICogbnByb2MgKSAgICAgICAgICAvLyByZW1haW5pbmcgaXRlcmF0aW9ucyBtdWx0aXBsaWVyCisvLyBieSBkZWZhdWx0IG4gPSAyLiBGb3IgZXhhbXBsZSB3aXRoIG4gPSAzIHRoZSBjaHVua3MgZGlzdHJpYnV0aW9uIHdpbGwgYmUgbW9yZSBmbGF0LgorLy8gV2l0aCBuID0gMSBmaXJzdCBjaHVuayBpcyB0aGUgc2FtZSBhcyBmb3Igc3RhdGljIHNjaGVkdWxlLCBlLmcuIHRyaXAgLyBucHJvYy4KK3N0YXRpYyBpbnQgZ3VpZGVkX2ludF9wYXJhbSA9IDI7CitzdGF0aWMgZG91YmxlIGd1aWRlZF9mbHRfcGFyYW0gPSAwLjU7Ly8gPSAxLjAgLyBndWlkZWRfaW50X3BhcmFtOworCisvLyBVVCAtIHVuc2lnbmVkIGZsYXZvciBvZiBULCBTVCAtIHNpZ25lZCBmbGF2b3Igb2YgVCwKKy8vIERCTCAtIGRvdWJsZSBpZiBzaXplb2YoVCk9PTQsIG9yIGxvbmcgZG91YmxlIGlmIHNpemVvZihUKT09OAordGVtcGxhdGU8IHR5cGVuYW1lIFQgPgorc3RhdGljIHZvaWQKK19fa21wX2Rpc3BhdGNoX2luaXQoCisgICAgaWRlbnRfdCAgICAgICAgICAgICAgICAgICAgICAgICogbG9jLAorICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsCisgICAgZW51bSBzY2hlZF90eXBlICAgICAgICAgICAgICAgICAgc2NoZWR1bGUsCisgICAgVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGIsCisgICAgVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWIsCisgICAgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6c2lnbmVkX3Qgc3QsCisgICAgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6c2lnbmVkX3QgY2h1bmssCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaF93cworKSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+Ojp1bnNpZ25lZF90ICBVVDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnNpZ25lZF90ICAgIFNUOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6ZmxvYXRpbmdfdCAgREJMOworICAgIHN0YXRpYyBjb25zdCBpbnQgX19fa21wX3NpemVfdHlwZSA9IHNpemVvZiggVVQgKTsKKworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlOworICAgIFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGM7CisgICAga21wX2luZm9fdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aDsKKyAgICBrbXBfdGVhbV90ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW07CisgICAga21wX3VpbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteV9idWZmZXJfaW5kZXg7CisgICAgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPCBUID4gICAgICAgICAgKiBwcjsKKyAgICBkaXNwYXRjaF9zaGFyZWRfaW5mb190ZW1wbGF0ZTwgVVQgPiB2b2xhdGlsZSAqIHNoOworCisgICAgS01QX0JVSUxEX0FTU0VSVCggc2l6ZW9mKCBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFQgPiApID09IHNpemVvZiggZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvICkgKTsKKyAgICBLTVBfQlVJTERfQVNTRVJUKCBzaXplb2YoIGRpc3BhdGNoX3NoYXJlZF9pbmZvX3RlbXBsYXRlPCBVVCA+ICkgPT0gc2l6ZW9mKCBkaXNwYXRjaF9zaGFyZWRfaW5mbyApICk7CisKKyAgICBpZiAoICEgVENSXzQoIF9fa21wX2luaXRfcGFyYWxsZWwgKSApCisgICAgICAgIF9fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoKTsKKworI2lmIElOQ0xVREVfU1NDX01BUktTCisgICAgU1NDX01BUktfRElTUEFUQ0hfSU5JVCgpOworI2VuZGlmCisgICAgI2lmZGVmIEtNUF9ERUJVRworICAgIHsKKyAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyUlZCBjYWxsZWQ6IHNjaGVkdWxlOiUlZCBjaHVuazolJSVzIGxiOiUlJXMgdWI6JSUlcyBzdDolJSVzXG4iLAorICAgICAgICAgICAgdHJhaXRzX3Q8IFNUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBTVCA+OjpzcGVjICk7CisgICAgICAgIEtEX1RSQUNFKDEwLCAoIGJ1ZmYsIGd0aWQsIHNjaGVkdWxlLCBjaHVuaywgbGIsIHViLCBzdCApICk7CisgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgIH0KKyAgICAjZW5kaWYKKyAgICAvKiBzZXR1cCBkYXRhICovCisgICAgdGggICAgID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIHRlYW0gICA9IHRoIC0+IHRoLnRoX3RlYW07CisgICAgYWN0aXZlID0gISB0ZWFtIC0+IHQudF9zZXJpYWxpemVkOworICAgIHRoLT50aC50aF9pZGVudCA9IGxvYzsKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBrbXBfdWludDY0IGN1cl9jaHVuayA9IGNodW5rOworICAgIGludCBpdHRfbmVlZF9tZXRhZGF0YV9yZXBvcnRpbmcgPSBfX2l0dF9tZXRhZGF0YV9hZGRfcHRyICYmIF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDMgJiYKKyAgICAgICAgS01QX01BU1RFUl9HVElEKGd0aWQpICYmCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgdGgtPnRoLnRoX3RlYW1zX21pY3JvdGFzayA9PSBOVUxMICYmCisjZW5kaWYKKyAgICAgICAgdGVhbS0+dC50X2FjdGl2ZV9sZXZlbCA9PSAxOworI2VuZGlmCisgICAgaWYgKCAhIGFjdGl2ZSApIHsKKyAgICAgICAgcHIgPSByZWludGVycHJldF9jYXN0PCBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFQgPiogPgorICAgICAgICAgICAgKCB0aCAtPiB0aC50aF9kaXNwYXRjaCAtPiB0aF9kaXNwX2J1ZmZlciApOyAvKiB0b3Agb2YgdGhlIHN0YWNrICovCisgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGgtPnRoLnRoX2Rpc3BhdGNoID09CisgICAgICAgICAgICAgICAgJnRoLT50aC50aF90ZWFtLT50LnRfZGlzcGF0Y2hbdGgtPnRoLnRoX2luZm8uZHMuZHNfdGlkXSApOworCisgICAgICAgIG15X2J1ZmZlcl9pbmRleCA9IHRoLT50aC50aF9kaXNwYXRjaC0+dGhfZGlzcF9pbmRleCArKzsKKworICAgICAgICAvKiBXaGF0IGhhcHBlbnMgd2hlbiBudW1iZXIgb2YgdGhyZWFkcyBjaGFuZ2VzLCBuZWVkIHRvIHJlc2l6ZSBidWZmZXI/ICovCisgICAgICAgIHByID0gcmVpbnRlcnByZXRfY2FzdDwgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPCBUID4gICogPgorICAgICAgICAgICAgKCAmdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZGlzcF9idWZmZXJbIG15X2J1ZmZlcl9pbmRleCAlIEtNUF9NQVhfRElTUF9CVUYgXSApOworICAgICAgICBzaCA9IHJlaW50ZXJwcmV0X2Nhc3Q8IGRpc3BhdGNoX3NoYXJlZF9pbmZvX3RlbXBsYXRlPCBVVCA+IHZvbGF0aWxlICogPgorICAgICAgICAgICAgKCAmdGVhbSAtPiB0LnRfZGlzcF9idWZmZXJbIG15X2J1ZmZlcl9pbmRleCAlIEtNUF9NQVhfRElTUF9CVUYgXSApOworICAgIH0KKworICAgIC8qIFBpY2sgdXAgdGhlIG5vbWVyZ2Uvb3JkZXJlZCBiaXRzIGZyb20gdGhlIHNjaGVkdWxpbmcgdHlwZSAqLworICAgIGlmICggKHNjaGVkdWxlID49IGttcF9ubV9sb3dlcikgJiYgKHNjaGVkdWxlIDwga21wX25tX3VwcGVyKSApIHsKKyAgICAgICAgcHItPm5vbWVyZ2UgPSBUUlVFOworICAgICAgICBzY2hlZHVsZSA9IChlbnVtIHNjaGVkX3R5cGUpKCgoaW50KXNjaGVkdWxlKSAtIChrbXBfbm1fbG93ZXIgLSBrbXBfc2NoX2xvd2VyKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHItPm5vbWVyZ2UgPSBGQUxTRTsKKyAgICB9CisgICAgcHItPnR5cGVfc2l6ZSA9IF9fX2ttcF9zaXplX3R5cGU7IC8vIHJlbWVtYmVyIHRoZSBzaXplIG9mIHZhcmlhYmxlcworICAgIGlmICgga21wX29yZF9sb3dlciAmIHNjaGVkdWxlICkgeworICAgICAgICBwci0+b3JkZXJlZCA9IFRSVUU7CisgICAgICAgIHNjaGVkdWxlID0gKGVudW0gc2NoZWRfdHlwZSkoKChpbnQpc2NoZWR1bGUpIC0gKGttcF9vcmRfbG93ZXIgLSBrbXBfc2NoX2xvd2VyKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHItPm9yZGVyZWQgPSBGQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIHNjaGVkdWxlID09IGttcF9zY2hfc3RhdGljICkgeworICAgICAgICBzY2hlZHVsZSA9IF9fa21wX3N0YXRpYzsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIHNjaGVkdWxlID09IGttcF9zY2hfcnVudGltZSApIHsKKyAgICAgICAgICAgIC8vIFVzZSB0aGUgc2NoZWR1bGluZyBzcGVjaWZpZWQgYnkgT01QX1NDSEVEVUxFIChvciBfX2ttcF9zY2hfZGVmYXVsdCBpZiBub3Qgc3BlY2lmaWVkKQorICAgICAgICAgICAgc2NoZWR1bGUgPSB0ZWFtIC0+IHQudF9zY2hlZC5yX3NjaGVkX3R5cGU7CisgICAgICAgICAgICAvLyBEZXRhaWwgdGhlIHNjaGVkdWxlIGlmIG5lZWRlZCAoZ2xvYmFsIGNvbnRyb2xzIGFyZSBkaWZmZXJlbnRpYXRlZCBhcHByb3ByaWF0ZWx5KQorICAgICAgICAgICAgaWYgKCBzY2hlZHVsZSA9PSBrbXBfc2NoX2d1aWRlZF9jaHVua2VkICkgeworICAgICAgICAgICAgICAgIHNjaGVkdWxlID0gX19rbXBfZ3VpZGVkOworICAgICAgICAgICAgfSBlbHNlIGlmICggc2NoZWR1bGUgPT0ga21wX3NjaF9zdGF0aWMgKSB7CisgICAgICAgICAgICAgICAgc2NoZWR1bGUgPSBfX2ttcF9zdGF0aWM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBVc2UgdGhlIGNodW5rIHNpemUgc3BlY2lmaWVkIGJ5IE9NUF9TQ0hFRFVMRSAob3IgZGVmYXVsdCBpZiBub3Qgc3BlY2lmaWVkKQorICAgICAgICAgICAgY2h1bmsgPSB0ZWFtIC0+IHQudF9zY2hlZC5jaHVuazsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICBjdXJfY2h1bmsgPSBjaHVuazsKKyNlbmRpZgorICAgICAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfaW5pdDogVCMlJWQgbmV3OiBzY2hlZHVsZTolJWQgY2h1bms6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3Q8IFNUID46OnNwZWMgKTsKKyAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMCwgKCBidWZmLCBndGlkLCBzY2hlZHVsZSwgY2h1bmsgKSApOworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgI2VuZGlmCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIHNjaGVkdWxlID09IGttcF9zY2hfZ3VpZGVkX2NodW5rZWQgKSB7CisgICAgICAgICAgICAgICAgc2NoZWR1bGUgPSBfX2ttcF9ndWlkZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGNodW5rIDw9IDAgKSB7CisgICAgICAgICAgICAgICAgY2h1bmsgPSBLTVBfREVGQVVMVF9DSFVOSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICggc2NoZWR1bGUgPT0ga21wX3NjaF9hdXRvICkgeworICAgICAgICAgICAgLy8gbWFwcGluZyBhbmQgZGlmZmVyZW50aWF0aW9uOiBpbiB0aGUgX19rbXBfZG9fc2VyaWFsX2luaXRpYWxpemUoKQorICAgICAgICAgICAgc2NoZWR1bGUgPSBfX2ttcF9hdXRvOworICAgICAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfaW5pdDoga21wX3NjaF9hdXRvOiBUIyUlZCBuZXc6IHNjaGVkdWxlOiUlZCBjaHVuazolJSVzXG4iLAorICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdDwgU1QgPjo6c3BlYyApOworICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwLCAoIGJ1ZmYsIGd0aWQsIHNjaGVkdWxlLCBjaHVuayApICk7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgfQorCisgICAgICAgIC8qIGd1aWRlZCBhbmFseXRpY2FsIG5vdCBzYWZlIGZvciB0b28gbWFueSB0aHJlYWRzICovCisgICAgICAgIGlmICggdGVhbS0+dC50X25wcm9jID4gMTw8MjAgJiYgc2NoZWR1bGUgPT0ga21wX3NjaF9ndWlkZWRfYW5hbHl0aWNhbF9jaHVua2VkICkgeworICAgICAgICAgICAgc2NoZWR1bGUgPSBrbXBfc2NoX2d1aWRlZF9pdGVyYXRpdmVfY2h1bmtlZDsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBEaXNwYXRjaE1hbnlUaHJlYWRzICk7CisgICAgICAgIH0KKyAgICAgICAgcHItPnUucC5wYXJtMSA9IGNodW5rOworICAgIH0KKyAgICBLTVBfQVNTRVJUMiggKGttcF9zY2hfbG93ZXIgPCBzY2hlZHVsZSAmJiBzY2hlZHVsZSA8IGttcF9zY2hfdXBwZXIpLAorICAgICAgICAgICAgICAgICJ1bmtub3duIHNjaGVkdWxpbmcgdHlwZSIgKTsKKworICAgIHByLT51LnAuY291bnQgPSAwOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGlmICggc3QgPT0gMCApIHsKKyAgICAgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdCgKKyAgICAgICAgICAgICAgICBrbXBfaTE4bl9tc2dfQ25zTG9vcEluY3JaZXJvUHJvaGliaXRlZCwKKyAgICAgICAgICAgICAgICAoIHByLT5vcmRlcmVkID8gY3RfcGRvX29yZGVyZWQgOiBjdF9wZG8gKSwgbG9jCisgICAgICAgICAgICApOworICAgICAgICB9CisgICAgfQorCisgICAgdGMgPSAoIHViIC0gbGIgKyBzdCApOworICAgIGlmICggc3QgIT0gMSApIHsKKyAgICAgICAgaWYgKCBzdCA8IDAgKSB7CisgICAgICAgICAgICBpZiAoIGxiIDwgdWIgKSB7CisgICAgICAgICAgICAgICAgdGMgPSAwOyAgICAgICAgICAgIC8vIHplcm8tdHJpcAorICAgICAgICAgICAgfSBlbHNlIHsgICAvLyBsYiA+PSB1YgorICAgICAgICAgICAgICAgIHRjID0gKFNUKXRjIC8gc3Q7ICAvLyBjb252ZXJ0IHRvIHNpZ25lZCBkaXZpc2lvbgorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeyAgICAgICAvLyBzdCA+IDAKKyAgICAgICAgICAgIGlmICggdWIgPCBsYiApIHsKKyAgICAgICAgICAgICAgICB0YyA9IDA7ICAgICAgICAgICAgLy8gemVyby10cmlwCisgICAgICAgICAgICB9IGVsc2UgeyAgIC8vIGxiID49IHViCisgICAgICAgICAgICAgICAgdGMgLz0gc3Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCB1YiA8IGxiICkgeyAgICAgICAgLy8gc3QgPT0gMQorICAgICAgICB0YyA9IDA7ICAgICAgICAgICAgICAgICAgICAvLyB6ZXJvLXRyaXAKKyAgICB9CisKKyAgICAvLyBBbnkgaGFsZi1kZWNlbnQgb3B0aW1pemVyIHdpbGwgcmVtb3ZlIHRoaXMgdGVzdCB3aGVuIHRoZSBibG9ja3MgYXJlIGVtcHR5IHNpbmNlIHRoZSBtYWNyb3MgZXhwYW5kIHRvIG5vdGhpbmcKKyAgICAvLyB3aGVuIHN0YXRpc3RpY3MgYXJlIGRpc2FibGVkLgorICAgIGlmIChzY2hlZHVsZSA9PSBfX2ttcF9zdGF0aWMpCisgICAgeworICAgICAgICBLTVBfQ09VTlRfQkxPQ0soT01QX0ZPUl9zdGF0aWMpOworICAgICAgICBLTVBfQ09VTlRfVkFMVUUoRk9SX3N0YXRpY19pdGVyYXRpb25zLCB0Yyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEtNUF9DT1VOVF9CTE9DSyhPTVBfRk9SX2R5bmFtaWMpOworICAgICAgICBLTVBfQ09VTlRfVkFMVUUoRk9SX2R5bmFtaWNfaXRlcmF0aW9ucywgdGMpOworICAgIH0KKworICAgIHByLT51LnAubGIgPSBsYjsKKyAgICBwci0+dS5wLnViID0gdWI7CisgICAgcHItPnUucC5zdCA9IHN0OworICAgIHByLT51LnAudGMgPSB0YzsKKworICAgICNpZiBLTVBfT1NfV0lORE9XUworICAgIHByLT51LnAubGFzdF91cHBlciA9IHViICsgc3Q7CisgICAgI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCisKKyAgICAvKiBOT1RFOiBvbmx5IHRoZSBhY3RpdmUgcGFyYWxsZWwgcmVnaW9uKHMpIGhhcyBhY3RpdmUgb3JkZXJlZCBzZWN0aW9ucyAqLworCisgICAgaWYgKCBhY3RpdmUgKSB7CisgICAgICAgIGlmICggcHItPm9yZGVyZWQgPT0gMCApIHsKKyAgICAgICAgICAgIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2Rlb19mY24gPSBfX2ttcF9kaXNwYXRjaF9kZW9fZXJyb3I7CisgICAgICAgICAgICB0aCAtPiB0aC50aF9kaXNwYXRjaCAtPiB0aF9keG9fZmNuID0gX19rbXBfZGlzcGF0Y2hfZHhvX2Vycm9yOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHItPm9yZGVyZWRfYnVtcGVkID0gMDsKKworICAgICAgICAgICAgcHItPnUucC5vcmRlcmVkX2xvd2VyID0gMTsKKyAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF91cHBlciA9IDA7CisKKyAgICAgICAgICAgIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2Rlb19mY24gPSBfX2ttcF9kaXNwYXRjaF9kZW88IFVUID47CisgICAgICAgICAgICB0aCAtPiB0aC50aF9kaXNwYXRjaCAtPiB0aF9keG9fZmNuID0gX19rbXBfZGlzcGF0Y2hfZHhvPCBVVCA+OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGVudW0gY29uc190eXBlIHdzID0gcHItPm9yZGVyZWQgPyBjdF9wZG9fb3JkZXJlZCA6IGN0X3BkbzsKKyAgICAgICAgaWYgKCBwdXNoX3dzICkgeworICAgICAgICAgICAgX19rbXBfcHVzaF93b3Jrc2hhcmUoIGd0aWQsIHdzLCBsb2MgKTsKKyAgICAgICAgICAgIHByLT5wdXNoZWRfd3MgPSB3czsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX2NoZWNrX3dvcmtzaGFyZSggZ3RpZCwgd3MsIGxvYyApOworICAgICAgICAgICAgcHItPnB1c2hlZF93cyA9IGN0X25vbmU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzd2l0Y2ggKCBzY2hlZHVsZSApIHsKKyAgICAjaWYgICggS01QX1NUQVRJQ19TVEVBTF9FTkFCTEVEICYmIEtNUF9BUkNIX1g4Nl82NCApCisgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19zdGVhbDoKKyAgICAgICAgeworICAgICAgICAgICAgVCBucHJvYyA9IHRlYW0tPnQudF9ucHJvYzsKKyAgICAgICAgICAgIFQgbnRjLCBpbml0OworCisgICAgICAgICAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfaW5pdDogVCMlZCBrbXBfc2NoX3N0YXRpY19zdGVhbCBjYXNlXG4iLCBndGlkICkgKTsKKworICAgICAgICAgICAgbnRjID0gKHRjICUgY2h1bmsgPyAxIDogMCkgKyB0YyAvIGNodW5rOworICAgICAgICAgICAgaWYgKCBucHJvYyA+IDEgJiYgbnRjID49IG5wcm9jICkgeworICAgICAgICAgICAgICAgIFQgaWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpOworICAgICAgICAgICAgICAgIFQgc21hbGxfY2h1bmssIGV4dHJhczsKKworICAgICAgICAgICAgICAgIHNtYWxsX2NodW5rID0gbnRjIC8gbnByb2M7CisgICAgICAgICAgICAgICAgZXh0cmFzID0gbnRjICUgbnByb2M7CisKKyAgICAgICAgICAgICAgICBpbml0ID0gaWQgKiBzbWFsbF9jaHVuayArICggaWQgPCBleHRyYXMgPyBpZCA6IGV4dHJhcyApOworICAgICAgICAgICAgICAgIHByLT51LnAuY291bnQgPSBpbml0OworICAgICAgICAgICAgICAgIHByLT51LnAudWIgPSBpbml0ICsgc21hbGxfY2h1bmsgKyAoIGlkIDwgZXh0cmFzID8gMSA6IDAgKTsKKworICAgICAgICAgICAgICAgIHByLT51LnAucGFybTIgPSBsYjsKKyAgICAgICAgICAgICAgICAvL3ByLT5wZmllbGRzLnBhcm0zID0gMDsgLy8gaXQncyBub3QgdXNlZCBpbiBzdGF0aWNfc3RlYWwKKyAgICAgICAgICAgICAgICBwci0+dS5wLnBhcm00ID0gaWQ7CisgICAgICAgICAgICAgICAgcHItPnUucC5zdCA9IHN0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfaW5pdDogVCMlZCBmYWxsaW5nLXRocm91Z2ggdG8ga21wX3NjaF9zdGF0aWNfYmFsYW5jZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCApICk7CisgICAgICAgICAgICAgICAgc2NoZWR1bGUgPSBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZDsKKyAgICAgICAgICAgICAgICAvKiB0b28gZmV3IGl0ZXJhdGlvbnM6IGZhbGwtdGhyb3VnaCB0byBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZCAqLworICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgLyogRkFMTC1USFJPVUdIIHRvIHN0YXRpYyBiYWxhbmNlZCAqLworICAgICAgICB9IC8vIGNhc2UKKyAgICAjZW5kaWYKKyAgICBjYXNlIGttcF9zY2hfc3RhdGljX2JhbGFuY2VkOgorICAgICAgICB7CisgICAgICAgICAgICBUIG5wcm9jID0gdGVhbS0+dC50X25wcm9jOworICAgICAgICAgICAgVCBpbml0LCBsaW1pdDsKKworICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX2luaXQ6IFQjJWQga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQgY2FzZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkICkgKTsKKworICAgICAgICAgICAgaWYgKCBucHJvYyA+IDEgKSB7CisgICAgICAgICAgICAgICAgVCBpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCk7CisKKyAgICAgICAgICAgICAgICBpZiAoIHRjIDwgbnByb2MgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggaWQgPCB0YyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluaXQgPSBpZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gaWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLnBhcm0xID0gKGlkID09IHRjIC0gMSk7ICAvKiBwYXJtMSBzdG9yZXMgKnBsYXN0aXRlciAqLworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcHItPnUucC5jb3VudCA9IDE7ICAvKiBtZWFucyBubyBtb3JlIGNodW5rcyB0byBleGVjdXRlICovCisgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLnBhcm0xID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFQgc21hbGxfY2h1bmsgPSB0YyAvIG5wcm9jOworICAgICAgICAgICAgICAgICAgICBUIGV4dHJhcyA9IHRjICUgbnByb2M7CisgICAgICAgICAgICAgICAgICAgIGluaXQgPSBpZCAqIHNtYWxsX2NodW5rICsgKGlkIDwgZXh0cmFzID8gaWQgOiBleHRyYXMpOworICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IGluaXQgKyBzbWFsbF9jaHVuayAtIChpZCA8IGV4dHJhcyA/IDAgOiAxKTsKKyAgICAgICAgICAgICAgICAgICAgcHItPnUucC5wYXJtMSA9IChpZCA9PSBucHJvYyAtIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCB0YyA+IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIGluaXQgPSAwOworICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IHRjIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgcHItPnUucC5wYXJtMSA9IFRSVUU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gemVybyB0cmlwIGNvdW50CisgICAgICAgICAgICAgICAgICAgIHByLT51LnAuY291bnQgPSAxOyAgLyogbWVhbnMgbm8gbW9yZSBjaHVua3MgdG8gZXhlY3V0ZSAqLworICAgICAgICAgICAgICAgICAgICBwci0+dS5wLnBhcm0xID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICAvLyBDYWxjdWxhdGUgY2h1bmsgZm9yIG1ldGFkYXRhIHJlcG9ydAorICAgICAgICAgICAgaWYgKCBpdHRfbmVlZF9tZXRhZGF0YV9yZXBvcnRpbmcgKQorICAgICAgICAgICAgICAgIGN1cl9jaHVuayA9IGxpbWl0IC0gaW5pdCArIDE7CisjZW5kaWYKKyAgICAgICAgICAgIGlmICggc3QgPT0gMSApIHsKKyAgICAgICAgICAgICAgICBwci0+dS5wLmxiID0gbGIgKyBpbml0OworICAgICAgICAgICAgICAgIHByLT51LnAudWIgPSBsYiArIGxpbWl0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBUIHViX3RtcCA9IGxiICsgbGltaXQgKiBzdDsgICAvLyBjYWxjdWxhdGVkIHVwcGVyIGJvdW5kLCAidWIiIGlzIHVzZXItZGVmaW5lZCB1cHBlciBib3VuZAorICAgICAgICAgICAgICAgIHByLT51LnAubGIgPSBsYiArIGluaXQgKiBzdDsKKyAgICAgICAgICAgICAgICAvLyBhZGp1c3QgdXBwZXIgYm91bmQgdG8gInViIiBpZiBuZWVkZWQsIHNvIHRoYXQgTVMgbGFzdHByaXZhdGUgd2lsbCBtYXRjaCBpdCBleGFjdGx5CisgICAgICAgICAgICAgICAgaWYgKCBzdCA+IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIHByLT51LnAudWIgPSAoIHViX3RtcCArIHN0ID4gdWIgPyB1YiA6IHViX3RtcCApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHByLT51LnAudWIgPSAoIHViX3RtcCArIHN0IDwgdWIgPyB1YiA6IHViX3RtcCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggcHItPm9yZGVyZWQgKSB7CisgICAgICAgICAgICAgICAgcHItPnUucC5vcmRlcmVkX2xvd2VyID0gaW5pdDsKKyAgICAgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfdXBwZXIgPSBsaW1pdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IC8vIGNhc2UKKyAgICBjYXNlIGttcF9zY2hfZ3VpZGVkX2l0ZXJhdGl2ZV9jaHVua2VkIDoKKyAgICAgICAgeworICAgICAgICAgICAgVCBucHJvYyA9IHRlYW0tPnQudF9ucHJvYzsKKyAgICAgICAgICAgIEtEX1RSQUNFKDEwMCwoIl9fa21wX2Rpc3BhdGNoX2luaXQ6IFQjJWQga21wX3NjaF9ndWlkZWRfaXRlcmF0aXZlX2NodW5rZWQgY2FzZVxuIixndGlkKSk7CisKKyAgICAgICAgICAgIGlmICggbnByb2MgPiAxICkgeworICAgICAgICAgICAgICAgIGlmICggKDJMICogY2h1bmsgKyAxICkgKiBucHJvYyA+PSB0YyApIHsKKyAgICAgICAgICAgICAgICAgICAgLyogY2h1bmsgc2l6ZSB0b28gbGFyZ2UsIHN3aXRjaCB0byBkeW5hbWljICovCisgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlID0ga21wX3NjaF9keW5hbWljX2NodW5rZWQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiByZW1haW5pbmcgaXRlcnMgYmVjb21lIGxlc3MgdGhhbiBwYXJtMiAtIHN3aXRjaCB0byBkeW5hbWljCisgICAgICAgICAgICAgICAgICAgIHByLT51LnAucGFybTIgPSBndWlkZWRfaW50X3BhcmFtICogbnByb2MgKiAoIGNodW5rICsgMSApOworICAgICAgICAgICAgICAgICAgICAqKGRvdWJsZSopJnByLT51LnAucGFybTMgPSBndWlkZWRfZmx0X3BhcmFtIC8gbnByb2M7ICAgLy8gbWF5IG9jY3VweSBwYXJtMyBhbmQgcGFybTQKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMCwoIl9fa21wX2Rpc3BhdGNoX2luaXQ6IFQjJWQgZmFsbGluZy10aHJvdWdoIHRvIGttcF9zY2hfc3RhdGljX2dyZWVkeVxuIixndGlkKSk7CisgICAgICAgICAgICAgICAgc2NoZWR1bGUgPSBrbXBfc2NoX3N0YXRpY19ncmVlZHk7CisgICAgICAgICAgICAgICAgLyogdGVhbS0+dC50X25wcm9jID09IDE6IGZhbGwtdGhyb3VnaCB0byBrbXBfc2NoX3N0YXRpY19ncmVlZHkgKi8KKyAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAsKCJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyVkIGttcF9zY2hfc3RhdGljX2dyZWVkeSBjYXNlXG4iLGd0aWQpKTsKKyAgICAgICAgICAgICAgICBwci0+dS5wLnBhcm0xID0gdGM7CisgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgIH0gLy8gY2FzZQorICAgICAgICBicmVhazsKKyAgICBjYXNlIGttcF9zY2hfZ3VpZGVkX2FuYWx5dGljYWxfY2h1bmtlZDoKKyAgICAgICAgeworICAgICAgICAgICAgVCBucHJvYyA9IHRlYW0tPnQudF9ucHJvYzsKKyAgICAgICAgICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyVkIGttcF9zY2hfZ3VpZGVkX2FuYWx5dGljYWxfY2h1bmtlZCBjYXNlXG4iLCBndGlkKSk7CisKKyAgICAgICAgICAgIGlmICggbnByb2MgPiAxICkgeworICAgICAgICAgICAgICAgIGlmICggKDJMICogY2h1bmsgKyAxICkgKiBucHJvYyA+PSB0YyApIHsKKyAgICAgICAgICAgICAgICAgICAgLyogY2h1bmsgc2l6ZSB0b28gbGFyZ2UsIHN3aXRjaCB0byBkeW5hbWljICovCisgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlID0ga21wX3NjaF9keW5hbWljX2NodW5rZWQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogY29tbW9ubHkgdXNlZCB0ZXJtOiAoMiBucHJvYyAtIDEpLygyIG5wcm9jKSAqLworICAgICAgICAgICAgICAgICAgICBEQkwgeDsKKworICAgICAgICAgICAgICAgICAgICAjaWYgS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2CisgICAgICAgICAgICAgICAgICAgIC8qIExpbnV4KiBPUyBhbHJlYWR5IGhhcyA2NC1iaXQgY29tcHV0YXRpb24gYnkgZGVmYXVsdCBmb3IKKwkJICAgICAgIGxvbmcgZG91YmxlLCBhbmQgb24gV2luZG93cyogT1Mgb24gSW50ZWwoUikgNjQsCisJCSAgICAgICAvUWxvbmdfZG91YmxlIGRvZXNuJ3Qgd29yay4gIE9uIFdpbmRvd3MqIE9TCisJCSAgICAgICBvbiBJQS0zMiBhcmNoaXRlY3R1cmUsIHdlIG5lZWQgdG8gc2V0IHByZWNpc2lvbiB0bworCQkgICAgICAgNjQtYml0IGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgNTMtYml0LiBFdmVuIHRob3VnaCBsb25nCisJCSAgICAgICBkb3VibGUgZG9lc24ndCB3b3JrIG9uIFdpbmRvd3MqIE9TIG9uIEludGVsKFIpIDY0LCB0aGUKKwkJICAgICAgIHJlc3VsdGluZyBsYWNrIG9mIHByZWNpc2lvbiBpcyBub3QgZXhwZWN0ZWQgdG8gaW1wYWN0CisJCSAgICAgICB0aGUgY29ycmVjdG5lc3Mgb2YgdGhlIGFsZ29yaXRobSwgYnV0IHRoaXMgaGFzIG5vdCBiZWVuCisJCSAgICAgICBtYXRoZW1hdGljYWxseSBwcm92ZW4uCisgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIC8vIHNhdmUgb3JpZ2luYWwgRlBDVyBhbmQgc2V0IHByZWNpc2lvbiB0byA2NC1iaXQsIGFzCisgICAgICAgICAgICAgICAgICAgIC8vIFdpbmRvd3MqIE9TIG9uIElBLTMyIGFyY2hpdGVjdHVyZSBkZWZhdWx0cyB0byA1My1iaXQKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG9sZEZwY3cgPSBfY29udHJvbDg3KDAsMCk7CisgICAgICAgICAgICAgICAgICAgIF9jb250cm9sODcoX1BDXzY0LF9NQ1dfUEMpOyAvLyAwLDB4MzAwMDAKKyAgICAgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIC8qIHZhbHVlIHVzZWQgZm9yIGNvbXBhcmlzb24gaW4gc29sdmVyIGZvciBjcm9zcy1vdmVyIHBvaW50ICovCisgICAgICAgICAgICAgICAgICAgIGxvbmcgZG91YmxlIHRhcmdldCA9ICgobG9uZyBkb3VibGUpY2h1bmsgKiAyICsgMSkgKiBucHJvYyAvIHRjOworCisgICAgICAgICAgICAgICAgICAgIC8qIGNyb3Nzb3ZlciBwb2ludC0tY2h1bmsgaW5kZXhlcyBlcXVhbCB0byBvciBncmVhdGVyIHRoYW4KKwkJICAgICAgIHRoaXMgcG9pbnQgc3dpdGNoIHRvIGR5bmFtaWMtc3R5bGUgc2NoZWR1bGluZyAqLworICAgICAgICAgICAgICAgICAgICBVVCAgIGNyb3NzOworCisgICAgICAgICAgICAgICAgICAgIC8qIGNvbW1vbmx5IHVzZWQgdGVybTogKDIgbnByb2MgLSAxKS8oMiBucHJvYykgKi8KKyAgICAgICAgICAgICAgICAgICAgeCA9IChsb25nIGRvdWJsZSkxLjAgLSAobG9uZyBkb3VibGUpMC41IC8gbnByb2M7CisKKyAgICAgICAgICAgICAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgICAgICAgICB7IC8vIHRlc3QgbmF0dXJhbCBhbGlnbm1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBfdGVzdF9hIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCTCAgZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICAgICAgfSB0OworICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IG5hdHVyYWxfYWxpZ25tZW50ID0gKHB0cmRpZmZfdCkmdC5iIC0gKHB0cmRpZmZfdCkmdCAtIChwdHJkaWZmX3QpMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vX19rbXBfd2FybiggIiAlbGx4ICVsbHggJWxsZCIsIChsb25nIGxvbmcpJnQuZCwgKGxvbmcgbG9uZykmdCwgKGxvbmcgbG9uZyluYXR1cmFsX2FsaWdubWVudCApOworICAgICAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggKCAoIChwdHJkaWZmX3QpJnByLT51LnAucGFybTMgKSAmICggbmF0dXJhbF9hbGlnbm1lbnQgKSApID09IDAgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAjZW5kaWYgLy8gS01QX0RFQlVHCisKKyAgICAgICAgICAgICAgICAgICAgLyogc2F2ZSB0aGUgdGVybSBpbiB0aHJlYWQgcHJpdmF0ZSBkaXNwYXRjaCBzdHJ1Y3R1cmUgKi8KKyAgICAgICAgICAgICAgICAgICAgKihEQkwqKSZwci0+dS5wLnBhcm0zID0geDsKKworICAgICAgICAgICAgICAgICAgICAvKiBzb2x2ZSBmb3IgdGhlIGNyb3Nzb3ZlciBwb2ludCB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyIGkgZm9yIHdoaWNoIENfaSA8PSBjaHVuayAqLworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBVVCAgICAgICAgICBsZWZ0LCByaWdodCwgbWlkOworICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBkb3VibGUgcDsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogZXN0aW1hdGUgaW5pdGlhbCB1cHBlciBhbmQgbG93ZXIgYm91bmQgKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgLyogZG9lc24ndCBtYXR0ZXIgd2hhdCB2YWx1ZSByaWdodCBpcyBhcyBsb25nIGFzIGl0IGlzIHBvc2l0aXZlLCBidXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0IGFmZmVjdHMgcGVyZm9ybWFuY2Ugb2YgdGhlIHNvbHZlcgorICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gMjI5OworICAgICAgICAgICAgICAgICAgICAgICAgcCA9IF9fa21wX3BvdzwgVVQgPih4LHJpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcCA+IHRhcmdldCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCAqPSBwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCA8PD0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKHA+dGFyZ2V0ICYmIHJpZ2h0IDwgKDE8PDI3KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA9IHJpZ2h0ID4+IDE7IC8qIGxvd2VyIGJvdW5kIGlzIHByZXZpb3VzIChmYWlsZWQpIGVzdGltYXRlIG9mIHVwcGVyIGJvdW5kICovCisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBiaXNlY3Rpb24gcm9vdC1maW5kaW5nIG1ldGhvZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCBsZWZ0ICsgMSA8IHJpZ2h0ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pZCA9IChsZWZ0ICsgcmlnaHQpIC8gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIF9fa21wX3BvdzwgVVQgPih4LG1pZCkgPiB0YXJnZXQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSBtaWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSBtaWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyB3aGlsZQorICAgICAgICAgICAgICAgICAgICAgICAgY3Jvc3MgPSByaWdodDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvKiBhc3NlcnQgc2FuaXR5IG9mIGNvbXB1dGVkIGNyb3Nzb3ZlciBwb2ludCAqLworICAgICAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKGNyb3NzICYmIF9fa21wX3BvdzwgVVQgPih4LCBjcm9zcyAtIDEpID4gdGFyZ2V0ICYmIF9fa21wX3BvdzwgVVQgPih4LCBjcm9zcykgPD0gdGFyZ2V0KTsKKworICAgICAgICAgICAgICAgICAgICAvKiBzYXZlIHRoZSBjcm9zc292ZXIgcG9pbnQgaW4gdGhyZWFkIHByaXZhdGUgZGlzcGF0Y2ggc3RydWN0dXJlICovCisgICAgICAgICAgICAgICAgICAgIHByLT51LnAucGFybTIgPSBjcm9zczsKKworICAgICAgICAgICAgICAgICAgICAvLyBDNzU4MDMKKyAgICAgICAgICAgICAgICAgICAgI2lmICggKCBLTVBfT1NfTElOVVggfHwgS01QX09TX1dJTkRPV1MgKSAmJiBLTVBfQVJDSF9YODYgKSAmJiAoICEgZGVmaW5lZCggS01QX0k4ICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgI2RlZmluZSBHVUlERURfQU5BTFlUSUNBTF9XT1JLQVJPVU5EICgqKCBEQkwgKiApJnByLT51LnAucGFybTMpCisgICAgICAgICAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAjZGVmaW5lIEdVSURFRF9BTkFMWVRJQ0FMX1dPUktBUk9VTkQgKHgpCisgICAgICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgICAvKiBkeW5hbWljLXN0eWxlIHNjaGVkdWxpbmcgb2Zmc2V0ICovCisgICAgICAgICAgICAgICAgICAgIHByLT51LnAuY291bnQgPSB0YyAtIF9fa21wX2Rpc3BhdGNoX2d1aWRlZF9yZW1haW5pbmcodGMsIEdVSURFRF9BTkFMWVRJQ0FMX1dPUktBUk9VTkQsIGNyb3NzKSAtIGNyb3NzICogY2h1bms7CisgICAgICAgICAgICAgICAgICAgICNpZiBLTVBfT1NfV0lORE9XUyAmJiBLTVBfQVJDSF9YODYKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3RvcmUgRlBDVworICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRyb2w4NyhvbGRGcGN3LF9NQ1dfUEMpOworICAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyVkIGZhbGxpbmctdGhyb3VnaCB0byBrbXBfc2NoX3N0YXRpY19ncmVlZHlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCApICk7CisgICAgICAgICAgICAgICAgc2NoZWR1bGUgPSBrbXBfc2NoX3N0YXRpY19ncmVlZHk7CisgICAgICAgICAgICAgICAgLyogdGVhbS0+dC50X25wcm9jID09IDE6IGZhbGwtdGhyb3VnaCB0byBrbXBfc2NoX3N0YXRpY19ncmVlZHkgKi8KKyAgICAgICAgICAgICAgICBwci0+dS5wLnBhcm0xID0gdGM7CisgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgIH0gLy8gY2FzZQorICAgICAgICBicmVhazsKKyAgICBjYXNlIGttcF9zY2hfc3RhdGljX2dyZWVkeToKKyAgICAgICAgS0RfVFJBQ0UoMTAwLCgiX19rbXBfZGlzcGF0Y2hfaW5pdDogVCMlZCBrbXBfc2NoX3N0YXRpY19ncmVlZHkgY2FzZVxuIixndGlkKSk7CisgICAgICAgICAgICBwci0+dS5wLnBhcm0xID0gKCB0ZWFtIC0+IHQudF9ucHJvYyA+IDEgKSA/CisgICAgICAgICAgICAgICAgKCB0YyArIHRlYW0tPnQudF9ucHJvYyAtIDEgKSAvIHRlYW0tPnQudF9ucHJvYyA6CisgICAgICAgICAgICAgICAgdGM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfY2h1bmtlZCA6CisgICAgY2FzZSBrbXBfc2NoX2R5bmFtaWNfY2h1bmtlZCA6CisgICAgICAgIGlmICggcHItPnUucC5wYXJtMSA8PSAwICkgeworICAgICAgICAgICAgcHItPnUucC5wYXJtMSA9IEtNUF9ERUZBVUxUX0NIVU5LOworICAgICAgICB9CisgICAgICAgIEtEX1RSQUNFKDEwMCwoIl9fa21wX2Rpc3BhdGNoX2luaXQ6IFQjJWQga21wX3NjaF9zdGF0aWNfY2h1bmtlZC9rbXBfc2NoX2R5bmFtaWNfY2h1bmtlZCBjYXNlc1xuIiwgZ3RpZCkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGttcF9zY2hfdHJhcGV6b2lkYWwgOgorICAgICAgICB7CisgICAgICAgICAgICAvKiBUU1M6IHRyYXBlem9pZCBzZWxmLXNjaGVkdWxpbmcsIG1pbmltdW0gY2h1bmtfc2l6ZSA9IHBhcm0xICovCisKKyAgICAgICAgICAgIFQgcGFybTEsIHBhcm0yLCBwYXJtMywgcGFybTQ7CisgICAgICAgICAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfaW5pdDogVCMlZCBrbXBfc2NoX3RyYXBlem9pZGFsIGNhc2VcbiIsIGd0aWQgKSApOworCisgICAgICAgICAgICBwYXJtMSA9IGNodW5rOworCisgICAgICAgICAgICAvKiBGIDogc2l6ZSBvZiB0aGUgZmlyc3QgY3ljbGUgKi8KKyAgICAgICAgICAgIHBhcm0yID0gKCB0YyAvICgyICogdGVhbS0+dC50X25wcm9jKSApOworCisgICAgICAgICAgICBpZiAoIHBhcm0yIDwgMSApIHsKKyAgICAgICAgICAgICAgICBwYXJtMiA9IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIEwgOiBzaXplIG9mIHRoZSBsYXN0IGN5Y2xlLiAgTWFrZSBzdXJlIHRoZSBsYXN0IGN5Y2xlCisgICAgICAgICAgICAgKiAgICAgaXMgbm90IGxhcmdlciB0aGFuIHRoZSBmaXJzdCBjeWNsZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKCBwYXJtMSA8IDEgKSB7CisgICAgICAgICAgICAgICAgcGFybTEgPSAxOworICAgICAgICAgICAgfSBlbHNlIGlmICggcGFybTEgPiBwYXJtMiApIHsKKyAgICAgICAgICAgICAgICBwYXJtMSA9IHBhcm0yOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBOIDogbnVtYmVyIG9mIGN5Y2xlcyAqLworICAgICAgICAgICAgcGFybTMgPSAoIHBhcm0yICsgcGFybTEgKTsKKyAgICAgICAgICAgIHBhcm0zID0gKCAyICogdGMgKyBwYXJtMyAtIDEpIC8gcGFybTM7CisKKyAgICAgICAgICAgIGlmICggcGFybTMgPCAyICkgeworICAgICAgICAgICAgICAgIHBhcm0zID0gMjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogc2lnbWEgOiBkZWNyZWFzaW5nIGluY3Igb2YgdGhlIHRyYXBlem9pZCAqLworICAgICAgICAgICAgcGFybTQgPSAoIHBhcm0zIC0gMSApOworICAgICAgICAgICAgcGFybTQgPSAoIHBhcm0yIC0gcGFybTEgKSAvIHBhcm00OworCisgICAgICAgICAgICAvLyBwb2ludGxlc3MgY2hlY2ssIGJlY2F1c2UgcGFybTQgPj0gMCBhbHdheXMKKyAgICAgICAgICAgIC8vaWYgKCBwYXJtNCA8IDAgKSB7CisgICAgICAgICAgICAvLyAgICBwYXJtNCA9IDA7CisgICAgICAgICAgICAvL30KKworICAgICAgICAgICAgcHItPnUucC5wYXJtMSA9IHBhcm0xOworICAgICAgICAgICAgcHItPnUucC5wYXJtMiA9IHBhcm0yOworICAgICAgICAgICAgcHItPnUucC5wYXJtMyA9IHBhcm0zOworICAgICAgICAgICAgcHItPnUucC5wYXJtNCA9IHBhcm00OworICAgICAgICB9IC8vIGNhc2UKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldmVyaXR5CisgICAgICAgICAgICAgICAgS01QX01TRyggVW5rbm93blNjaGVkVHlwZURldGVjdGVkICksIC8vIFByaW1hcnkgbWVzc2FnZQorICAgICAgICAgICAgICAgIEtNUF9ITlQoIEdldE5ld2VyTGlicmFyeSApLCAgICAgICAgICAvLyBIaW50CisgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwgICAgICAgICAgICAgICAgICAgICAgIC8vIFZhcmlhZGljIGFyZ3VtZW50IGxpc3QgdGVybWluYXRvcgorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9IC8vIHN3aXRjaAorICAgIHByLT5zY2hlZHVsZSA9IHNjaGVkdWxlOworICAgIGlmICggYWN0aXZlICkgeworICAgICAgICAvKiBUaGUgbmFtZSBvZiB0aGlzIGJ1ZmZlciBzaG91bGQgYmUgbXlfYnVmZmVyX2luZGV4IHdoZW4gaXQncyBmcmVlIHRvIHVzZSBpdCAqLworCisgICAgICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyVkIGJlZm9yZSB3YWl0OiBteV9idWZmZXJfaW5kZXg6JWQgc2gtPmJ1ZmZlcl9pbmRleDolZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIG15X2J1ZmZlcl9pbmRleCwgc2gtPmJ1ZmZlcl9pbmRleCkgKTsKKyAgICAgICAgX19rbXBfd2FpdF95aWVsZDwga21wX3VpbnQzMiA+KCAmIHNoLT5idWZmZXJfaW5kZXgsIG15X2J1ZmZlcl9pbmRleCwgX19rbXBfZXE8IGttcF91aW50MzIgPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKCBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgLy8gTm90ZTogS01QX1dBSVRfWUlFTEQoKSBjYW5ub3QgYmUgdXNlZCB0aGVyZTogYnVmZmVyIGluZGV4IGFuZCBteV9idWZmZXJfaW5kZXggYXJlCisgICAgICAgICAgICAvLyAqYWx3YXlzKiAzMi1iaXQgaW50ZWdlcnMuCisgICAgICAgIEtNUF9NQigpOyAgLyogaXMgdGhpcyBuZWNlc3Nhcnk/ICovCisgICAgICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyVkIGFmdGVyIHdhaXQ6IG15X2J1ZmZlcl9pbmRleDolZCBzaC0+YnVmZmVyX2luZGV4OiVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgbXlfYnVmZmVyX2luZGV4LCBzaC0+YnVmZmVyX2luZGV4KSApOworCisgICAgICAgIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2Rpc3BhdGNoX3ByX2N1cnJlbnQgPSAoZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3QqKSBwcjsKKyAgICAgICAgdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZGlzcGF0Y2hfc2hfY3VycmVudCA9IChkaXNwYXRjaF9zaGFyZWRfaW5mb190KikgIHNoOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgaWYgKCBwci0+b3JkZXJlZCApIHsKKyAgICAgICAgICAgIF9fa21wX2l0dF9vcmRlcmVkX2luaXQoIGd0aWQgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgLy8gUmVwb3J0IGxvb3AgbWV0YWRhdGEKKyAgICAgICAgaWYgKCBpdHRfbmVlZF9tZXRhZGF0YV9yZXBvcnRpbmcgKSB7CisgICAgICAgICAgICAvLyBPbmx5IHJlcG9ydCBtZXRhZGF0YSBieSBtYXN0ZXIgb2YgYWN0aXZlIHRlYW0gYXQgbGV2ZWwgMQorICAgICAgICAgICAga21wX3VpbnQ2NCBzY2hlZHR5cGUgPSAwOworICAgICAgICAgICAgc3dpdGNoICggc2NoZWR1bGUgKSB7CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfc3RhdGljX2NodW5rZWQ6CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfc3RhdGljX2JhbGFuY2VkOi8vIENodW5rIGlzIGNhbGN1bGF0ZWQgaW4gdGhlIHN3aXRjaCBhYm92ZQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19ncmVlZHk6CisgICAgICAgICAgICAgICAgY3VyX2NodW5rID0gcHItPnUucC5wYXJtMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9keW5hbWljX2NodW5rZWQ6CisgICAgICAgICAgICAgICAgc2NoZWR0eXBlID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9ndWlkZWRfaXRlcmF0aXZlX2NodW5rZWQ6CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfZ3VpZGVkX2FuYWx5dGljYWxfY2h1bmtlZDoKKyAgICAgICAgICAgICAgICBzY2hlZHR5cGUgPSAyOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKy8vICAgICAgICAgICAgU2hvdWxkIHdlIHB1dCB0aGlzIGNhc2UgdW5kZXIgInN0YXRpYyI/CisvLyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfc3RlYWw6CisgICAgICAgICAgICAgICAgc2NoZWR0eXBlID0gMzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9fa21wX2l0dF9tZXRhZGF0YV9sb29wKGxvYywgc2NoZWR0eXBlLCB0YywgY3VyX2NodW5rKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICB9OyAvLyBpZgorCisgICAgI2lmZGVmIEtNUF9ERUJVRworICAgIHsKKyAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyUlZCByZXR1cm5pbmc6IHNjaGVkdWxlOiUlZCBvcmRlcmVkOiUlJXMgbGI6JSUlcyB1YjolJSVzIiBcCisgICAgICAgICAgICAiIHN0OiUlJXMgdGM6JSUlcyBjb3VudDolJSVzXG5cdG9yZGVyZWRfbG93ZXI6JSUlcyBvcmRlcmVkX3VwcGVyOiUlJXMiIFwKKyAgICAgICAgICAgICIgcGFybTE6JSUlcyBwYXJtMjolJSVzIHBhcm0zOiUlJXMgcGFybTQ6JSUlc1xuIiwKKyAgICAgICAgICAgIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjLAorICAgICAgICAgICAgdHJhaXRzX3Q8IFNUID46OnNwZWMsIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYywKKyAgICAgICAgICAgIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYywgdHJhaXRzX3Q8IFQgPjo6c3BlYywKKyAgICAgICAgICAgIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMgKTsKKyAgICAgICAgS0RfVFJBQ0UoMTAsICggYnVmZiwKKyAgICAgICAgICAgIGd0aWQsIHByLT5zY2hlZHVsZSwgcHItPm9yZGVyZWQsIHByLT51LnAubGIsIHByLT51LnAudWIsCisgICAgICAgICAgICBwci0+dS5wLnN0LCBwci0+dS5wLnRjLCBwci0+dS5wLmNvdW50LAorICAgICAgICAgICAgcHItPnUucC5vcmRlcmVkX2xvd2VyLCBwci0+dS5wLm9yZGVyZWRfdXBwZXIsIHByLT51LnAucGFybTEsCisgICAgICAgICAgICBwci0+dS5wLnBhcm0yLCBwci0+dS5wLnBhcm0zLCBwci0+dS5wLnBhcm00ICkgKTsKKyAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgfQorICAgICNlbmRpZgorICAgICNpZiAoIEtNUF9TVEFUSUNfU1RFQUxfRU5BQkxFRCApCisgICAgaWYgKCBfX19rbXBfc2l6ZV90eXBlIDwgOCApIHsKKyAgICAgIC8vIEl0IGNhbm5vdCBiZSBndWFyYW50ZWVkIHRoYXQgYWZ0ZXIgZXhlY3V0aW9uIG9mIGEgbG9vcCB3aXRoIHNvbWUgb3RoZXIgc2NoZWR1bGUga2luZAorICAgICAgLy8gYWxsIHRoZSBwYXJtMyB2YXJpYWJsZXMgd2lsbCBjb250YWluIHRoZSBzYW1lIHZhbHVlLgorICAgICAgLy8gRXZlbiBpZiBhbGwgcGFybTMgd2lsbCBiZSB0aGUgc2FtZSwgaXQgc3RpbGwgZXhpc3RzIGEgYmFkIGNhc2UgbGlrZSB1c2luZyAwIGFuZCAxCisgICAgICAvLyByYXRoZXIgdGhhbiBwcm9ncmFtIGxpZmUtdGltZSBpbmNyZW1lbnQuCisgICAgICAvLyBTbyB0aGUgZGVkaWNhdGVkIHZhcmlhYmxlIGlzIHJlcXVpcmVkLiBUaGUgJ3N0YXRpY19zdGVhbF9jb3VudGVyJyBpcyB1c2VkLgorICAgICAgaWYoIHNjaGVkdWxlID09IGttcF9zY2hfc3RhdGljX3N0ZWFsICkgeworICAgICAgICAvLyBPdGhlciB0aHJlYWRzIHdpbGwgaW5zcGVjdCB0aGlzIHZhcmlhYmxlIHdoZW4gc2VhcmNoaW5nIGZvciBhIHZpY3RpbS4KKyAgICAgICAgLy8gVGhpcyBpcyBhIGZsYWcgc2hvd2luZyB0aGF0IG90aGVyIHRocmVhZHMgbWF5IHN0ZWFsIGZyb20gdGhpcyB0aHJlYWQgc2luY2UgdGhlbi4KKyAgICAgICAgdm9sYXRpbGUgVCAqIHAgPSAmcHItPnUucC5zdGF0aWNfc3RlYWxfY291bnRlcjsKKyAgICAgICAgKnAgPSAqcCArIDE7CisgICAgICB9CisgICAgfQorICAgICNlbmRpZiAvLyAoIEtNUF9TVEFUSUNfU1RFQUxfRU5BQkxFRCAmJiBVU0VfU1RFQUxJTkcgKQorCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9sb29wX2JlZ2luKSkgeworICAgICAgICBvbXB0X3RlYW1faW5mb190ICp0ZWFtX2luZm8gPSBfX29tcHRfZ2V0X3RlYW1pbmZvKDAsIE5VTEwpOworICAgICAgICBvbXB0X3Rhc2tfaW5mb190ICp0YXNrX2luZm8gPSBfX29tcHRfZ2V0X3Rhc2tpbmZvKDApOworICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfbG9vcF9iZWdpbikoCisgICAgICAgICAgICB0ZWFtX2luZm8tPnBhcmFsbGVsX2lkLCB0YXNrX2luZm8tPnRhc2tfaWQsIHRlYW1faW5mby0+bWljcm90YXNrKTsKKyAgICB9CisjZW5kaWYKK30KKworLyoKKyAqIEZvciBvcmRlcmVkIGxvb3BzLCBlaXRoZXIgX19rbXBfZGlzcGF0Y2hfZmluaXNoKCkgc2hvdWxkIGJlIGNhbGxlZCBhZnRlcgorICogZXZlcnkgaXRlcmF0aW9uLCBvciBfX2ttcF9kaXNwYXRjaF9maW5pc2hfY2h1bmsoKSBzaG91bGQgYmUgY2FsbGVkIGFmdGVyCisgKiBldmVyeSBjaHVuayBvZiBpdGVyYXRpb25zLiAgSWYgdGhlIG9yZGVyZWQgc2VjdGlvbihzKSB3ZXJlIG5vdCBleGVjdXRlZAorICogZm9yIHRoaXMgaXRlcmF0aW9uIChvciBldmVyeSBpdGVyYXRpb24gaW4gdGhpcyBjaHVuayksIHdlIG5lZWQgdG8gc2V0IHRoZQorICogb3JkZXJlZCBpdGVyYXRpb24gY291bnRlcnMgc28gdGhhdCB0aGUgbmV4dCB0aHJlYWQgY2FuIHByb2NlZWQuCisgKi8KK3RlbXBsYXRlPCB0eXBlbmFtZSBVVCA+CitzdGF0aWMgdm9pZAorX19rbXBfZGlzcGF0Y2hfZmluaXNoKCBpbnQgZ3RpZCwgaWRlbnRfdCAqbG9jICkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBVVCA+OjpzaWduZWRfdCBTVDsKKyAgICBrbXBfaW5mb190ICp0aCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKworICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9maW5pc2g6IFQjJWQgY2FsbGVkXG4iLCBndGlkICkgKTsKKyAgICBpZiAoICEgdGggLT4gdGgudGhfdGVhbSAtPiB0LnRfc2VyaWFsaXplZCApIHsKKworICAgICAgICBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFVUID4gKiBwciA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PCBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFVUID4qID4KKyAgICAgICAgICAgICggdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9kaXNwYXRjaF9wcl9jdXJyZW50ICk7CisgICAgICAgIGRpc3BhdGNoX3NoYXJlZF9pbmZvX3RlbXBsYXRlPCBVVCA+IHZvbGF0aWxlICogc2ggPQorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDwgZGlzcGF0Y2hfc2hhcmVkX2luZm9fdGVtcGxhdGU8IFVUID52b2xhdGlsZSogPgorICAgICAgICAgICAgKCB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rpc3BhdGNoX3NoX2N1cnJlbnQgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggcHIgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggc2ggKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGgtPnRoLnRoX2Rpc3BhdGNoID09CisgICAgICAgICAgICAgICAgICZ0aC0+dGgudGhfdGVhbS0+dC50X2Rpc3BhdGNoW3RoLT50aC50aF9pbmZvLmRzLmRzX3RpZF0gKTsKKworICAgICAgICBpZiAoIHByLT5vcmRlcmVkX2J1bXBlZCApIHsKKyAgICAgICAgICAgIEtEX1RSQUNFKDEwMDAsICgiX19rbXBfZGlzcGF0Y2hfZmluaXNoOiBUIyVkIHJlc2V0dGluZyBvcmRlcmVkX2J1bXBlZCB0byB6ZXJvXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQgKSApOworICAgICAgICAgICAgcHItPm9yZGVyZWRfYnVtcGVkID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFVUIGxvd2VyID0gcHItPnUucC5vcmRlcmVkX2xvd2VyOworCisgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICJfX2ttcF9kaXNwYXRjaF9maW5pc2g6IFQjJSVkIGJlZm9yZSB3YWl0OiBvcmRlcmVkX2l0ZXJhdGlvbjolJSVzIGxvd2VyOiUlJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYyApOworICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMDAsICggYnVmZiwgZ3RpZCwgc2gtPnUucy5vcmRlcmVkX2l0ZXJhdGlvbiwgbG93ZXIgKSApOworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgICAgIF9fa21wX3dhaXRfeWllbGQ8IFVUID4oJnNoLT51LnMub3JkZXJlZF9pdGVyYXRpb24sIGxvd2VyLCBfX2ttcF9nZTwgVVQgPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgS01QX01CKCk7ICAvKiBpcyB0aGlzIG5lY2Vzc2FyeT8gKi8KKyAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgIl9fa21wX2Rpc3BhdGNoX2ZpbmlzaDogVCMlJWQgYWZ0ZXIgd2FpdDogb3JkZXJlZF9pdGVyYXRpb246JSUlcyBsb3dlcjolJSVzXG4iLAorICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdDwgVVQgPjo6c3BlYywgdHJhaXRzX3Q8IFVUID46OnNwZWMgKTsKKyAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIGJ1ZmYsIGd0aWQsIHNoLT51LnMub3JkZXJlZF9pdGVyYXRpb24sIGxvd2VyICkgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICNlbmRpZgorCisgICAgICAgICAgICB0ZXN0X3RoZW5faW5jPCBTVCA+KCAodm9sYXRpbGUgU1QgKikgJiBzaC0+dS5zLm9yZGVyZWRfaXRlcmF0aW9uICk7CisgICAgICAgIH0gLy8gaWYKKyAgICB9IC8vIGlmCisgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX2ZpbmlzaDogVCMlZCByZXR1cm5lZFxuIiwgZ3RpZCApICk7Cit9CisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKwordGVtcGxhdGU8IHR5cGVuYW1lIFVUID4KK3N0YXRpYyB2b2lkCitfX2ttcF9kaXNwYXRjaF9maW5pc2hfY2h1bmsoIGludCBndGlkLCBpZGVudF90ICpsb2MgKQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8IFVUID46OnNpZ25lZF90IFNUOworICAgIGttcF9pbmZvX3QgKnRoID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworCisgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX2ZpbmlzaF9jaHVuazogVCMlZCBjYWxsZWRcbiIsIGd0aWQgKSApOworICAgIGlmICggISB0aCAtPiB0aC50aF90ZWFtIC0+IHQudF9zZXJpYWxpemVkICkgeworLy8gICAgICAgIGludCBjaWQ7CisgICAgICAgIGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZTwgVVQgPiAqIHByID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8IGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZTwgVVQgPiogPgorICAgICAgICAgICAgKCB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rpc3BhdGNoX3ByX2N1cnJlbnQgKTsKKyAgICAgICAgZGlzcGF0Y2hfc2hhcmVkX2luZm9fdGVtcGxhdGU8IFVUID4gdm9sYXRpbGUgKiBzaCA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PCBkaXNwYXRjaF9zaGFyZWRfaW5mb190ZW1wbGF0ZTwgVVQgPnZvbGF0aWxlKiA+CisgICAgICAgICAgICAoIHRoLT50aC50aF9kaXNwYXRjaC0+dGhfZGlzcGF0Y2hfc2hfY3VycmVudCApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBwciApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBzaCApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0aC0+dGgudGhfZGlzcGF0Y2ggPT0KKyAgICAgICAgICAgICAgICAgJnRoLT50aC50aF90ZWFtLT50LnRfZGlzcGF0Y2hbdGgtPnRoLnRoX2luZm8uZHMuZHNfdGlkXSApOworCisvLyAgICAgICAgZm9yIChjaWQgPSAwOyBjaWQgPCBLTVBfTUFYX09SREVSRUQ7ICsrY2lkKSB7CisgICAgICAgICAgICBVVCBsb3dlciA9IHByLT51LnAub3JkZXJlZF9sb3dlcjsKKyAgICAgICAgICAgIFVUIHVwcGVyID0gcHItPnUucC5vcmRlcmVkX3VwcGVyOworICAgICAgICAgICAgVVQgaW5jID0gdXBwZXIgLSBsb3dlciArIDE7CisKKyAgICAgICAgICAgIGlmICggcHItPm9yZGVyZWRfYnVtcGVkID09IGluYyApIHsKKyAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIl9fa21wX2Rpc3BhdGNoX2ZpbmlzaDogVCMlZCByZXNldHRpbmcgb3JkZXJlZF9idW1wZWQgdG8gemVyb1xuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQgKSApOworICAgICAgICAgICAgICAgIHByLT5vcmRlcmVkX2J1bXBlZCA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGluYyAtPSBwci0+b3JkZXJlZF9idW1wZWQ7CisKKyAgICAgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgIl9fa21wX2Rpc3BhdGNoX2ZpbmlzaF9jaHVuazogVCMlJWQgYmVmb3JlIHdhaXQ6ICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZGVyZWRfaXRlcmF0aW9uOiUlJXMgbG93ZXI6JSUlcyB1cHBlcjolJSVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3Q8IFVUID46OnNwZWMsIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYyApOworICAgICAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIGJ1ZmYsIGd0aWQsIHNoLT51LnMub3JkZXJlZF9pdGVyYXRpb24sIGxvd2VyLCB1cHBlciApICk7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAjZW5kaWYKKworICAgICAgICAgICAgICAgIF9fa21wX3dhaXRfeWllbGQ8IFVUID4oJnNoLT51LnMub3JkZXJlZF9pdGVyYXRpb24sIGxvd2VyLCBfX2ttcF9nZTwgVVQgPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICAgICBLTVBfTUIoKTsgIC8qIGlzIHRoaXMgbmVjZXNzYXJ5PyAqLworICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMDAsICgiX19rbXBfZGlzcGF0Y2hfZmluaXNoX2NodW5rOiBUIyVkIHJlc2V0dGluZyBvcmRlcmVkX2J1bXBlZCB0byB6ZXJvXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCApICk7CisgICAgICAgICAgICAgICAgcHItPm9yZGVyZWRfYnVtcGVkID0gMDsKKy8vISEhISEgVE9ETyBjaGVjayBpZiB0aGUgaW5jIHNob3VsZCBiZSB1bnNpZ25lZCwgb3Igc2lnbmVkPz8/CisgICAgICAgICAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICAgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJfX2ttcF9kaXNwYXRjaF9maW5pc2hfY2h1bms6IFQjJSVkIGFmdGVyIHdhaXQ6ICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZGVyZWRfaXRlcmF0aW9uOiUlJXMgaW5jOiUlJXMgbG93ZXI6JSUlcyB1cHBlcjolJSVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3Q8IFVUID46OnNwZWMsIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYywgdHJhaXRzX3Q8IFVUID46OnNwZWMgKTsKKyAgICAgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwMCwgKCBidWZmLCBndGlkLCBzaC0+dS5zLm9yZGVyZWRfaXRlcmF0aW9uLCBpbmMsIGxvd2VyLCB1cHBlciApICk7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAjZW5kaWYKKworICAgICAgICAgICAgICAgIHRlc3RfdGhlbl9hZGQ8IFNUID4oICh2b2xhdGlsZSBTVCAqKSAmIHNoLT51LnMub3JkZXJlZF9pdGVyYXRpb24sIGluYyk7CisgICAgICAgICAgICB9CisvLyAgICAgICAgfQorICAgIH0KKyAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfZmluaXNoX2NodW5rOiBUIyVkIHJldHVybmVkXG4iLCBndGlkICkgKTsKK30KKworI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCisvKiBEZWZpbmUgYSBtYWNybyBmb3IgZXhpdGluZyBfX2ttcF9kaXNwYXRjaF9uZXh0KCkuIElmIHN0YXR1cyBpcyAwCisgKiAobm8gbW9yZSB3b3JrKSwgdGhlbiB0ZWxsIE9NUFQgdGhlIGxvb3AgaXMgb3Zlci4gSW4gc29tZSBjYXNlcworICoga21wX2Rpc3BhdGNoX2ZpbmkoKSBpcyBub3QgY2FsbGVkLiAqLworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisjZGVmaW5lIE9NUFRfTE9PUF9FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChzdGF0dXMgPT0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKG9tcHRfZW5hYmxlZCAmJiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9sb29wX2VuZCkpIHsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBvbXB0X3RlYW1faW5mb190ICp0ZWFtX2luZm8gPSBfX29tcHRfZ2V0X3RlYW1pbmZvKDAsIE5VTEwpOyAgICAgICAgXAorICAgICAgICAgICAgb21wdF90YXNrX2luZm9fdCAqdGFza19pbmZvID0gX19vbXB0X2dldF90YXNraW5mbygwKTsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9sb29wX2VuZCkoICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgdGVhbV9pbmZvLT5wYXJhbGxlbF9pZCwgdGFza19pbmZvLT50YXNrX2lkKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisjZWxzZQorI2RlZmluZSBPTVBUX0xPT1BfRU5EIC8vIG5vLW9wCisjZW5kaWYKKwordGVtcGxhdGU8IHR5cGVuYW1lIFQgPgorc3RhdGljIGludAorX19rbXBfZGlzcGF0Y2hfbmV4dCgKKyAgICBpZGVudF90ICpsb2MsIGludCBndGlkLCBrbXBfaW50MzIgKnBfbGFzdCwgVCAqcF9sYiwgVCAqcF91YiwgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6c2lnbmVkX3QgKnBfc3QKKykgeworCisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+Ojp1bnNpZ25lZF90ICBVVDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnNpZ25lZF90ICAgIFNUOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6ZmxvYXRpbmdfdCAgREJMOworI2lmICggS01QX1NUQVRJQ19TVEVBTF9FTkFCTEVEICYmIEtNUF9BUkNIX1g4Nl82NCApCisgICAgc3RhdGljIGNvbnN0IGludCBfX19rbXBfc2l6ZV90eXBlID0gc2l6ZW9mKCBVVCApOworI2VuZGlmCisKKyAgICAvLyBUaGlzIGlzIHBvdGVudGlhbGx5IHNsaWdodGx5IG1pc2xlYWRpbmcsIHNjaGVkdWxlKHJ1bnRpbWUpIHdpbGwgYXBwZWFyIGhlcmUgZXZlbiBpZiB0aGUgYWN0dWFsIHJ1bnRtZSBzY2hlZHVsZQorICAgIC8vIGlzIHN0YXRpYy4gKFdoaWNoIHBvaW50cyBvdXQgYSBkaXNhZGF2YW50YWdlIG9mIHNjaGVkdWxlKHJ1bnRpbWUpOiBldmVuIHdoZW4gc3RhdGljIHNjaGVkdWxpbmcgaXMgdXNlZCBpdCBjb3N0cworICAgIC8vIG1vcmUgdGhhbiBhIGNvbXBpbGUgdGltZSBjaG9pY2UgdG8gdXNlIHN0YXRpYyBzY2hlZHVsaW5nIHdvdWxkLikKKyAgICBLTVBfVElNRV9CTE9DSyhGT1JfZHluYW1pY19zY2hlZHVsaW5nKTsKKworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworICAgIGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZTwgVCA+ICogcHI7CisgICAga21wX2luZm9fdCAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aCAgID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIGttcF90ZWFtX3QgICAgICAgICAgICAgICAgICAgICAgICAgICogdGVhbSA9IHRoIC0+IHRoLnRoX3RlYW07CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBwX2xiICYmIHBfdWIgJiYgcF9zdCApOyAvLyBBQzogdGhlc2UgY2Fubm90IGJlIE5VTEwKKyAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgeworICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJSVkIGNhbGxlZCBwX2xiOiUlJXMgcF91YjolJSVzIHBfc3Q6JSUlcyBwX2xhc3Q6ICUlcFxuIiwKKyAgICAgICAgICAgIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBTVCA+OjpzcGVjICk7CisgICAgICAgIEtEX1RSQUNFKDEwMDAsICggYnVmZiwgZ3RpZCwgKnBfbGIsICpwX3ViLCBwX3N0ID8gKnBfc3QgOiAwLCBwX2xhc3QgKSApOworICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICB9CisgICAgI2VuZGlmCisKKyAgICBpZiAoIHRlYW0gLT4gdC50X3NlcmlhbGl6ZWQgKSB7CisgICAgICAgIC8qIE5PVEU6IHNlcmlhbGl6ZSB0aGlzIGRpc3BhdGNoIGJlY2FzZSB3ZSBhcmUgbm90IGF0IHRoZSBhY3RpdmUgbGV2ZWwgKi8KKyAgICAgICAgcHIgPSByZWludGVycHJldF9jYXN0PCBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFQgPiogPgorICAgICAgICAgICAgKCB0aCAtPiB0aC50aF9kaXNwYXRjaCAtPiB0aF9kaXNwX2J1ZmZlciApOyAvKiB0b3Agb2YgdGhlIHN0YWNrICovCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHByICk7CisKKyAgICAgICAgaWYgKCAoc3RhdHVzID0gKHByLT51LnAudGMgIT0gMCkpID09IDAgKSB7CisgICAgICAgICAgICAqcF9sYiA9IDA7CisgICAgICAgICAgICAqcF91YiA9IDA7CisvLyAgICAgICAgICAgIGlmICggcF9sYXN0ICE9IE5VTEwgKQorLy8gICAgICAgICAgICAgICAgKnBfbGFzdCA9IDA7CisgICAgICAgICAgICBpZiAoIHBfc3QgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgKnBfc3QgPSAwOworICAgICAgICAgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBwci0+cHVzaGVkX3dzICE9IGN0X25vbmUgKSB7CisgICAgICAgICAgICAgICAgICAgIHByLT5wdXNoZWRfd3MgPSBfX2ttcF9wb3Bfd29ya3NoYXJlKCBndGlkLCBwci0+cHVzaGVkX3dzLCBsb2MgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoIHByLT5ub21lcmdlICkgeworICAgICAgICAgICAga21wX2ludDMyIGxhc3Q7CisgICAgICAgICAgICBUICAgICAgICAgc3RhcnQ7CisgICAgICAgICAgICBVVCAgICAgICAgbGltaXQsIHRyaXAsIGluaXQ7CisgICAgICAgICAgICBTVCAgICAgICAgaW5jcjsKKyAgICAgICAgICAgIFQgICAgICAgICBjaHVuayA9IHByLT51LnAucGFybTE7CisKKyAgICAgICAgICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9uZXh0OiBUIyVkIGttcF9zY2hfZHluYW1pY19jaHVua2VkIGNhc2VcbiIsIGd0aWQgKSApOworCisgICAgICAgICAgICBpbml0ID0gY2h1bmsgKiBwci0+dS5wLmNvdW50Kys7CisgICAgICAgICAgICB0cmlwID0gcHItPnUucC50YyAtIDE7CisKKyAgICAgICAgICAgIGlmICggKHN0YXR1cyA9IChpbml0IDw9IHRyaXApKSA9PSAwICkgeworICAgICAgICAgICAgICAgICpwX2xiID0gMDsKKyAgICAgICAgICAgICAgICAqcF91YiA9IDA7CisvLyAgICAgICAgICAgICAgICBpZiAoIHBfbGFzdCAhPSBOVUxMICkKKy8vICAgICAgICAgICAgICAgICAgICAqcF9sYXN0ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoIHBfc3QgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgICAgICpwX3N0ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBwci0+cHVzaGVkX3dzICE9IGN0X25vbmUgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwci0+cHVzaGVkX3dzID0gX19rbXBfcG9wX3dvcmtzaGFyZSggZ3RpZCwgcHItPnB1c2hlZF93cywgbG9jICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0YXJ0ID0gcHItPnUucC5sYjsKKyAgICAgICAgICAgICAgICBsaW1pdCA9IGNodW5rICsgaW5pdCAtIDE7CisgICAgICAgICAgICAgICAgaW5jciAgPSBwci0+dS5wLnN0OworCisgICAgICAgICAgICAgICAgaWYgKCAobGFzdCA9IChsaW1pdCA+PSB0cmlwKSkgIT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgbGltaXQgPSB0cmlwOworICAgICAgICAgICAgICAgICAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgICAgICAgICAgICAgcHItPnUucC5sYXN0X3VwcGVyID0gcHItPnUucC51YjsKKyAgICAgICAgICAgICAgICAgICAgI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICggcF9sYXN0ICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICAgICAqcF9sYXN0ID0gbGFzdDsKKyAgICAgICAgICAgICAgICBpZiAoIHBfc3QgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgICAgICpwX3N0ID0gaW5jcjsKKyAgICAgICAgICAgICAgICBpZiAoIGluY3IgPT0gMSApIHsKKyAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSBzdGFydCArIGluaXQ7CisgICAgICAgICAgICAgICAgICAgICpwX3ViID0gc3RhcnQgKyBsaW1pdDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAqcF9sYiA9IHN0YXJ0ICsgaW5pdCAqIGluY3I7CisgICAgICAgICAgICAgICAgICAgICpwX3ViID0gc3RhcnQgKyBsaW1pdCAqIGluY3I7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCBwci0+b3JkZXJlZCApIHsKKyAgICAgICAgICAgICAgICAgICAgcHItPnUucC5vcmRlcmVkX2xvd2VyID0gaW5pdDsKKyAgICAgICAgICAgICAgICAgICAgcHItPnUucC5vcmRlcmVkX3VwcGVyID0gbGltaXQ7CisgICAgICAgICAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfX2ttcF9kaXNwYXRjaF9uZXh0OiBUIyUlZCBvcmRlcmVkX2xvd2VyOiUlJXMgb3JkZXJlZF91cHBlcjolJSVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYyApOworICAgICAgICAgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwMCwgKCBidWZmLCBndGlkLCBwci0+dS5wLm9yZGVyZWRfbG93ZXIsIHByLT51LnAub3JkZXJlZF91cHBlciApICk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwci0+dS5wLnRjID0gMDsKKyAgICAgICAgICAgICpwX2xiID0gcHItPnUucC5sYjsKKyAgICAgICAgICAgICpwX3ViID0gcHItPnUucC51YjsKKyAgICAgICAgICAgICNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICAgICAgcHItPnUucC5sYXN0X3VwcGVyID0gKnBfdWI7CisgICAgICAgICAgICAjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KKyAgICAgICAgICAgIGlmICggcF9sYXN0ICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICpwX2xhc3QgPSBUUlVFOworICAgICAgICAgICAgaWYgKCBwX3N0ICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICpwX3N0ID0gcHItPnUucC5zdDsKKyAgICAgICAgfSAvLyBpZgorICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlJWQgc2VyaWFsaXplZCBjYXNlOiBwX2xiOiUlJXMgIiBcCisgICAgICAgICAgICAgICAgInBfdWI6JSUlcyBwX3N0OiUlJXMgcF9sYXN0OiUlcCAlJWQgIHJldHVybmluZzolJWRcbiIsCisgICAgICAgICAgICAgICAgdHJhaXRzX3Q8IFQgPjo6c3BlYywgdHJhaXRzX3Q8IFQgPjo6c3BlYywgdHJhaXRzX3Q8IFNUID46OnNwZWMgKTsKKyAgICAgICAgICAgIEtEX1RSQUNFKDEwLCAoIGJ1ZmYsIGd0aWQsICpwX2xiLCAqcF91YiwgKnBfc3QsIHBfbGFzdCwgKnBfbGFzdCwgc3RhdHVzKSApOworICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgIH0KKyAgICAgICAgI2VuZGlmCisjaWYgSU5DTFVERV9TU0NfTUFSS1MKKyAgICAgICAgU1NDX01BUktfRElTUEFUQ0hfTkVYVCgpOworI2VuZGlmCisgICAgICAgIE9NUFRfTE9PUF9FTkQ7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAga21wX2ludDMyIGxhc3QgPSAwOworICAgICAgICBkaXNwYXRjaF9zaGFyZWRfaW5mb190ZW1wbGF0ZTwgVVQgPiAqc2g7CisgICAgICAgIFQgICAgICAgICBzdGFydDsKKyAgICAgICAgU1QgICAgICAgIGluY3I7CisgICAgICAgIFVUICAgICAgICBsaW1pdCwgdHJpcCwgaW5pdDsKKworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0aC0+dGgudGhfZGlzcGF0Y2ggPT0KKyAgICAgICAgICAgICAgICAmdGgtPnRoLnRoX3RlYW0tPnQudF9kaXNwYXRjaFt0aC0+dGgudGhfaW5mby5kcy5kc190aWRdICk7CisKKyAgICAgICAgcHIgPSByZWludGVycHJldF9jYXN0PCBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFQgPiogPgorICAgICAgICAgICAgKCB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rpc3BhdGNoX3ByX2N1cnJlbnQgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggcHIgKTsKKyAgICAgICAgc2ggPSByZWludGVycHJldF9jYXN0PCBkaXNwYXRjaF9zaGFyZWRfaW5mb190ZW1wbGF0ZTwgVVQgPiogPgorICAgICAgICAgICAgKCB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rpc3BhdGNoX3NoX2N1cnJlbnQgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggc2ggKTsKKworICAgICAgICBpZiAoIHByLT51LnAudGMgPT0gMCApIHsKKyAgICAgICAgICAgIC8vIHplcm8gdHJpcCBjb3VudAorICAgICAgICAgICAgc3RhdHVzID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN3aXRjaCAocHItPnNjaGVkdWxlKSB7CisgICAgICAgICAgICAjaWYgKCBLTVBfU1RBVElDX1NURUFMX0VOQUJMRUQgJiYgS01QX0FSQ0hfWDg2XzY0ICkKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfc3RlYWw6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUIGNodW5rID0gcHItPnUucC5wYXJtMTsKKworICAgICAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlZCBrbXBfc2NoX3N0YXRpY19zdGVhbCBjYXNlXG4iLCBndGlkKSApOworCisgICAgICAgICAgICAgICAgICAgIHRyaXAgPSBwci0+dS5wLnRjIC0gMTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIF9fX2ttcF9zaXplX3R5cGUgPiA0ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXIgdGhyZWFkcyBkbyBub3QgbG9vayBpbnRvIHRoZSBkYXRhIG9mIHRoaXMgdGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHNvIGl0J3Mgbm90IG5lY2Vzc2FyeSB0byBtYWtlIHZvbGF0aWxlIGNhc3RpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICBpbml0ICAgPSAoIHByLT51LnAuY291bnQgKSsrOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gKCBpbml0IDwgKFVUKXByLT51LnAudWIgKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVkZWYgdW5pb24geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVUIGNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUICB1YjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0IGI7CisgICAgICAgICAgICAgICAgICAgICAgICB9IHVuaW9uX2k0OworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWxsIG9wZXJhdGlvbnMgb24gJ2NvdW50JyBvciAndWInIG11c3QgYmUgY29tYmluZWQgYXRvbWljYWxseSB0b2dldGhlci4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZWFsaW5nIGltcGxlbWVudGVkIG9ubHkgZm9yIDQtYnl0ZSBpbmRleGVzCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb25faTQgdm9sZCwgdm5ldzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2xkLmIgPSAqKCB2b2xhdGlsZSBrbXBfaW50NjQgKiApKCZwci0+dS5wLmNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bmV3ID0gdm9sZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bmV3LnAuY291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRNjQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCB2b2xhdGlsZSBrbXBfaW50NjQqICkmcHItPnUucC5jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50NjQgKikmdm9sZC5iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQ2NCAqKSZ2bmV3LmIgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2xkLmIgPSAqKCB2b2xhdGlsZSBrbXBfaW50NjQgKiApKCZwci0+dS5wLmNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm5ldyA9IHZvbGQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZuZXcucC5jb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bmV3ID0gdm9sZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0ICAgPSB2bmV3LnAuY291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gKCBpbml0IDwgKFVUKXZuZXcucC51YiApIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoICFzdGF0dXMgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2luZm9fdCAgICoqb3RoZXJfdGhyZWFkcyA9IHRlYW0tPnQudF90aHJlYWRzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICB3aGlsZV9saW1pdCA9IDEwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICB3aGlsZV9pbmRleCA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBhbGdvcml0aG0gb2Ygc2VhcmNoaW5nIGZvciBhIHZpY3RpbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZCBiZSBjbGVhbmVkIHVwIGFuZCBtZWFzdXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICggKCAhc3RhdHVzICkgJiYgKCB3aGlsZV9saW1pdCAhPSArK3doaWxlX2luZGV4ICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uX2k0ICB2b2xkLCB2bmV3OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgcmVtYWluaW5nOyAvLyBrbXBfaW50MzIgYmVjYXVzZSBLTVBfSTQgb25seQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUICAgICAgICAgdmljdGltSWR4ICAgID0gcHItPnUucC5wYXJtNDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCAgICAgICAgIG9sZFZpY3RpbUlkeCA9IHZpY3RpbUlkeDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPCBUID4gKiB2aWN0aW07CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoICF2aWN0aW1JZHggKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmljdGltSWR4ID0gdGVhbS0+dC50X25wcm9jIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS12aWN0aW1JZHg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWN0aW0gPSByZWludGVycHJldF9jYXN0PCBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFQgPiogPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggb3RoZXJfdGhyZWFkc1t2aWN0aW1JZHhdLT50aC50aF9kaXNwYXRjaC0+dGhfZGlzcGF0Y2hfcHJfY3VycmVudCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICggKHZpY3RpbSA9PSBOVUxMIHx8IHZpY3RpbSA9PSBwcikgJiYgb2xkVmljdGltSWR4ICE9IHZpY3RpbUlkeCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiB0aGluayBhYm91dCBhIHByb3BlciBwbGFjZSBvZiB0aGlzIHRlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoICF2aWN0aW0gKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICgqKCB2b2xhdGlsZSBUICogKSZ2aWN0aW0tPnUucC5zdGF0aWNfc3RlYWxfY291bnRlcikgIT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiggdm9sYXRpbGUgVCAqICkmcHItPnUucC5zdGF0aWNfc3RlYWxfY291bnRlcikgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGRlbGF5IHdvdWxkIGJlIG5pY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHZpY3RpbSBpcyBub3QgcmVhZHkgeWV0IHRvIHBhcnRpY2lwYXRlIGluIHN0ZWFsaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIHRoZSB2aWN0aW0gaXMgc3RpbGwgaW4ga21wX2luaXRfZGlzcGF0Y2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIG9sZFZpY3RpbUlkeCA9PSB2aWN0aW1JZHggKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLnBhcm00ID0gdmljdGltSWR4OworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKCAxICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sZC5iID0gKiggdm9sYXRpbGUga21wX2ludDY0ICogKSggJnZpY3RpbS0+dS5wLmNvdW50ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bmV3ID0gdm9sZDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggKHZuZXcucC51YiAtIDEpICogKFVUKWNodW5rIDw9IHRyaXAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggdm5ldy5wLmNvdW50ID49IChVVCl2bmV3LnAudWIgfHwgKHJlbWFpbmluZyA9IHZuZXcucC51YiAtIHZuZXcucC5jb3VudCkgPCA0ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm5ldy5wLnViIC09IChyZW1haW5pbmcgPj4gMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCh2bmV3LnAudWIgLSAxKSAqIChVVCljaHVuayA8PSB0cmlwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNwcmFnbWEgd2FybmluZyggcHVzaCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXNhYmxlIHdhcm5pbmcgb24gcG9pbnRsZXNzIGNvbXBhcmlzb24gb2YgdW5zaWduZWQgd2l0aCAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjcHJhZ21hIHdhcm5pbmcoIGRpc2FibGU6IDE4NiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh2bmV3LnAudWIgPj0gMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjcHJhZ21hIHdhcm5pbmcoIHBvcCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBTaG91bGQgdGhpcyBiZSBhY3F1aXJlIG9yIHJlbGVhc2U/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1E2NCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCB2b2xhdGlsZSBrbXBfaW50NjQgKiApJnZpY3RpbS0+dS5wLmNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50NjQgKikmdm9sZC5iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50NjQgKikmdm5ldy5iICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZV9pbmRleCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm93IHVwZGF0ZSBvd24gY291bnQgYW5kIHViCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2lmIEtNUF9BUkNIX1g4NgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZWFsaW5nIGV4ZWN1dGVkIG9uIG5vbi1LTVBfQVJDSF9YODYgb25seQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBdG9taWMgNjQtYml0IHdyaXRlIG9uIGlhMzIgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5hdmFpbGFibGUsIHNvIHdlIGRvIHRoaXMgaW4gc3RlcHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBUaGlzIGNvZGUgaXMgbm90IHRlc3RlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCA9IHZvbGQucC5jb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHItPnUucC51YiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAuY291bnQgPSBpbml0ICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHItPnUucC51YiA9IHZuZXcucC5jb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0ID0gdm5ldy5wLnViOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2xkLnAuY291bnQgPSBpbml0ICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogaXMgaXQgc2FmZSBhbmQgZW5vdWdoPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKCB2b2xhdGlsZSBrbXBfaW50NjQgKiApKCZwci0+dS5wLmNvdW50KSA9IHZvbGQuYjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZW5kaWYgLy8gS01QX0FSQ0hfWDg2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyB3aGlsZSAoMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIHdoaWxlCisgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAhc3RhdHVzICkgeworICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwX3N0ICE9IE5VTEwgKSAqcF9zdCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHByLT51LnAucGFybTI7CisgICAgICAgICAgICAgICAgICAgICAgICBpbml0ICo9IGNodW5rOworICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgPSBjaHVuayArIGluaXQgLSAxOworICAgICAgICAgICAgICAgICAgICAgICAgaW5jciAgPSBwci0+dS5wLnN0OworCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGluaXQgPD0gdHJpcCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChsYXN0ID0gKGxpbWl0ID49IHRyaXApKSAhPSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IHRyaXA7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBfc3QgIT0gTlVMTCApICpwX3N0ID0gaW5jcjsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpbmNyID09IDEgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSBzdGFydCArIGluaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSBzdGFydCArIGxpbWl0OworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9sYiA9IHN0YXJ0ICsgaW5pdCAqIGluY3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSBzdGFydCArIGxpbWl0ICogaW5jcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwci0+b3JkZXJlZCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfbG93ZXIgPSBpbml0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF91cHBlciA9IGxpbWl0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlJWQgb3JkZXJlZF9sb3dlcjolJSVzIG9yZGVyZWRfdXBwZXI6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIGJ1ZmYsIGd0aWQsIHByLT51LnAub3JkZXJlZF9sb3dlciwgcHItPnUucC5vcmRlcmVkX3VwcGVyICkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gLy8gY2FzZQorICAgICAgICAgICAgI2VuZGlmIC8vICggS01QX1NUQVRJQ19TVEVBTF9FTkFCTEVEICYmIEtNUF9BUkNIX1g4Nl82NCApCisgICAgICAgICAgICBjYXNlIGttcF9zY2hfc3RhdGljX2JhbGFuY2VkOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJWQga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQgY2FzZVxuIiwgZ3RpZCkgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3RhdHVzID0gIXByLT51LnAuY291bnQpICE9IDAgKSB7ICAvKiBjaGVjayBpZiB0aHJlYWQgaGFzIGFueSBpdGVyYXRpb24gdG8gZG8gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAuY291bnQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSBwci0+dS5wLmxiOworICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSBwci0+dS5wLnViOworICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCA9IHByLT51LnAucGFybTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBfc3QgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfc3QgPSBwci0+dS5wLnN0OworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAgLyogbm8gaXRlcmF0aW9ucyB0byBkbyAqLworICAgICAgICAgICAgICAgICAgICAgICAgcHItPnUucC5sYiA9IHByLT51LnAudWIgKyBwci0+dS5wLnN0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICggcHItPm9yZGVyZWQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfX2ttcF9kaXNwYXRjaF9uZXh0OiBUIyUlZCBvcmRlcmVkX2xvd2VyOiUlJXMgb3JkZXJlZF91cHBlcjolJSVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdDwgVVQgPjo6c3BlYywgdHJhaXRzX3Q8IFVUID46OnNwZWMgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIGJ1ZmYsIGd0aWQsIHByLT51LnAub3JkZXJlZF9sb3dlciwgcHItPnUucC5vcmRlcmVkX3VwcGVyICkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICAgICAgfSAvLyBjYXNlCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfc3RhdGljX2dyZWVkeTogIC8qIG9yaWdpbmFsIGNvZGUgZm9yIGttcF9zY2hfc3RhdGljX2dyZWVkeSB3YXMgbWVyZ2VkIGhlcmUgKi8KKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfY2h1bmtlZDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFQgcGFybTE7CisKKyAgICAgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJWQga21wX3NjaF9zdGF0aWNfW2FmZmluaXR5fGNodW5rZWRdIGNhc2VcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQgKSApOworICAgICAgICAgICAgICAgICAgICBwYXJtMSA9IHByLT51LnAucGFybTE7CisKKyAgICAgICAgICAgICAgICAgICAgdHJpcCAgPSBwci0+dS5wLnRjIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgaW5pdCAgPSBwYXJtMSAqIChwci0+dS5wLmNvdW50ICsgX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3RhdHVzID0gKGluaXQgPD0gdHJpcCkpICE9IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHByLT51LnAubGI7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmNyICA9IHByLT51LnAuc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IHBhcm0xICsgaW5pdCAtIDE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKGxhc3QgPSAobGltaXQgPj0gdHJpcCkpICE9IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gdHJpcDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwX3N0ICE9IE5VTEwgKSAqcF9zdCA9IGluY3I7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAuY291bnQgKz0gdGVhbS0+dC50X25wcm9jOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGluY3IgPT0gMSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9sYiA9IHN0YXJ0ICsgaW5pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF91YiA9IHN0YXJ0ICsgbGltaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9sYiA9IHN0YXJ0ICsgaW5pdCAqIGluY3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSBzdGFydCArIGxpbWl0ICogaW5jcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwci0+b3JkZXJlZCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfbG93ZXIgPSBpbml0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF91cHBlciA9IGxpbWl0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlJWQgb3JkZXJlZF9sb3dlcjolJSVzIG9yZGVyZWRfdXBwZXI6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIGJ1ZmYsIGd0aWQsIHByLT51LnAub3JkZXJlZF9sb3dlciwgcHItPnUucC5vcmRlcmVkX3VwcGVyICkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICAgICAgfSAvLyBjYXNlCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9keW5hbWljX2NodW5rZWQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUIGNodW5rID0gcHItPnUucC5wYXJtMTsKKworICAgICAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlZCBrbXBfc2NoX2R5bmFtaWNfY2h1bmtlZCBjYXNlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkICkgKTsKKworICAgICAgICAgICAgICAgICAgICBpbml0ID0gY2h1bmsgKiB0ZXN0X3RoZW5faW5jX2FjcTwgU1QgPigodm9sYXRpbGUgU1QgKikgJiBzaC0+dS5zLml0ZXJhdGlvbiApOworICAgICAgICAgICAgICAgICAgICB0cmlwID0gcHItPnUucC50YyAtIDE7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3RhdHVzID0gKGluaXQgPD0gdHJpcCkpID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqcF9sYiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAqcF91YiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBfc3QgIT0gTlVMTCApICpwX3N0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gcHItPnUucC5sYjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gY2h1bmsgKyBpbml0IC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluY3IgID0gcHItPnUucC5zdDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAobGFzdCA9IChsaW1pdCA+PSB0cmlwKSkgIT0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgPSB0cmlwOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBfc3QgIT0gTlVMTCApICpwX3N0ID0gaW5jcjsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpbmNyID09IDEgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSBzdGFydCArIGluaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSBzdGFydCArIGxpbWl0OworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9sYiA9IHN0YXJ0ICsgaW5pdCAqIGluY3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSBzdGFydCArIGxpbWl0ICogaW5jcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwci0+b3JkZXJlZCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfbG93ZXIgPSBpbml0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF91cHBlciA9IGxpbWl0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlJWQgb3JkZXJlZF9sb3dlcjolJSVzIG9yZGVyZWRfdXBwZXI6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIGJ1ZmYsIGd0aWQsIHByLT51LnAub3JkZXJlZF9sb3dlciwgcHItPnUucC5vcmRlcmVkX3VwcGVyICkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICAgICAgfSAvLyBjYXNlCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9ndWlkZWRfaXRlcmF0aXZlX2NodW5rZWQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUICBjaHVua3NwZWMgPSBwci0+dS5wLnBhcm0xOworICAgICAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAoIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJWQga21wX3NjaF9ndWlkZWRfY2h1bmtlZCBpdGVyYXRpdmUgY2FzZVxuIixndGlkKSk7CisgICAgICAgICAgICAgICAgICAgIHRyaXAgID0gcHItPnUucC50YzsKKyAgICAgICAgICAgICAgICAgICAgLy8gU3RhcnQgYXRvbWljIHBhcnQgb2YgY2FsY3VsYXRpb25zCisgICAgICAgICAgICAgICAgICAgIHdoaWxlKDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNUICByZW1haW5pbmc7ICAgICAgICAgICAgIC8vIHNpZ25lZCwgYmVjYXVzZSBjYW4gYmUgPCAwCisgICAgICAgICAgICAgICAgICAgICAgICBpbml0ID0gc2gtPnUucy5pdGVyYXRpb247ICAvLyBzaGFyZWQgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyA9IHRyaXAgLSBpbml0OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCByZW1haW5pbmcgPD0gMCApIHsgICAgLy8gQUM6IG5lZWQgdG8gY29tcGFyZSB3aXRoIDAgZmlyc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvLCBkb24ndCB0cnkgYXRvbWljIG9wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKFQpcmVtYWluaW5nIDwgcHItPnUucC5wYXJtMiApIHsgLy8gY29tcGFyZSB3aXRoIEsqbnByb2MqKGNodW5rKzEpLCBLPTIgYnkgZGVmYXVsdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSBkeW5hbWljLXN0eWxlIHNoY2VkdWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXRvbWljYWxseSBpbnJlbWVudCBpdGVyYXRpb25zLCBnZXQgb2xkIHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCA9IHRlc3RfdGhlbl9hZGQ8U1Q+KCAoU1QqKSZzaC0+dS5zLml0ZXJhdGlvbiwgKFNUKWNodW5rc3BlYyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyA9IHRyaXAgLSBpbml0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAwOyAgICAvLyBhbGwgaXRlcmF0aW9ucyBnb3QgYnkgb3RoZXIgdGhyZWFkcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdvdCBzb21lIGl0ZXJhdGlvbnMgdG8gd29yayBvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChUKXJlbWFpbmluZyA+IGNodW5rc3BlYyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gaW5pdCArIGNodW5rc3BlYyAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0ID0gMTsgICAvLyB0aGUgbGFzdCBjaHVuaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgPSBpbml0ICsgcmVtYWluaW5nIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gaW5pdCArIChVVCkoIHJlbWFpbmluZyAqICooZG91YmxlKikmcHItPnUucC5wYXJtMyApOyAvLyBkaXZpZGUgYnkgSypucHJvYworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBjb21wYXJlX2FuZF9zd2FwPFNUPiggKFNUKikmc2gtPnUucy5pdGVyYXRpb24sIChTVClpbml0LCAoU1QpbGltaXQgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDQVMgd2FzIHN1Y2Nlc3NmdWwsIGNodW5rIG9idGFpbmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLWxpbWl0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgICAgICB9IC8vIHdoaWxlCisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdHVzICE9IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHByLT51LnAubGI7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmNyID0gcHItPnUucC5zdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcF9zdCAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9zdCA9IGluY3I7CisgICAgICAgICAgICAgICAgICAgICAgICAqcF9sYiA9IHN0YXJ0ICsgaW5pdCAqIGluY3I7CisgICAgICAgICAgICAgICAgICAgICAgICAqcF91YiA9IHN0YXJ0ICsgbGltaXQgKiBpbmNyOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwci0+b3JkZXJlZCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfbG93ZXIgPSBpbml0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF91cHBlciA9IGxpbWl0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlJWQgb3JkZXJlZF9sb3dlcjolJSVzIG9yZGVyZWRfdXBwZXI6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIGJ1ZmYsIGd0aWQsIHByLT51LnAub3JkZXJlZF9sb3dlciwgcHItPnUucC5vcmRlcmVkX3VwcGVyICkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwX3N0ICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX3N0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgIH0gLy8gY2FzZQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGttcF9zY2hfZ3VpZGVkX2FuYWx5dGljYWxfY2h1bmtlZDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFQgICBjaHVua3NwZWMgPSBwci0+dS5wLnBhcm0xOworICAgICAgICAgICAgICAgICAgICBVVCBjaHVua0lkeDsKKyAgICAjaWYgS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2CisgICAgICAgICAgICAgICAgICAgIC8qIGZvciBzdG9yaW5nIG9yaWdpbmFsIEZQQ1cgdmFsdWUgZm9yIFdpbmRvd3MqIE9TIG9uCisJCSAgICAgICBJQS0zMiBhcmNoaXRlY3R1cmUgOC1ieXRlIHZlcnNpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG9sZEZwY3c7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmcGN3U2V0ID0gMDsKKyAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJWQga21wX3NjaF9ndWlkZWRfY2h1bmtlZCBhbmFseXRpY2FsIGNhc2VcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQgKSApOworCisgICAgICAgICAgICAgICAgICAgIHRyaXAgID0gcHItPnUucC50YzsKKworICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHRlYW0tPnQudF9ucHJvYyA+IDEpOworICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCgyVUwgKiBjaHVua3NwZWMgKyAxKSAqIChVVCl0ZWFtLT50LnRfbnByb2MgPCB0cmlwKTsKKworICAgICAgICAgICAgICAgICAgICB3aGlsZSgxKSB7IC8qIHRoaXMgd2hpbGUgbG9vcCBpcyBhIHNhZmVndWFyZCBhZ2FpbnN0IHVuZXhwZWN0ZWQgemVybyBjaHVuayBzaXplcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtJZHggPSB0ZXN0X3RoZW5faW5jX2FjcTwgU1QgPigodm9sYXRpbGUgU1QgKikgJiBzaC0+dS5zLml0ZXJhdGlvbiApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBjaHVua0lkeCA+PSAoVVQpcHItPnUucC5wYXJtMiApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLXRyaXA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXNlIGR5bmFtaWMtc3R5bGUgc2NoZWR1bGluZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXQgPSBjaHVua0lkeCAqIGNodW5rc3BlYyArIHByLT51LnAuY291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmVlZCB0byB2ZXJpZnkgaW5pdCA+IDAgaW4gY2FzZSBvZiBvdmVyZmxvdyBpbiB0aGUgYWJvdmUgY2FsY3VsYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzdGF0dXMgPSAoaW5pdCA+IDAgJiYgaW5pdCA8PSB0cmlwKSkgIT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgPSBpbml0ICsgY2h1bmtzcGVjIC0xOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKGxhc3QgPSAobGltaXQgPj0gdHJpcCkpICE9IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgPSB0cmlwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXNlIGV4cG9uZW50aWFsLXN0eWxlIHNjaGVkdWxpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgZm9sbG93aW5nIGNoZWNrIGlzIHRvIHdvcmthcm91bmQgdGhlIGxhY2sgb2YgbG9uZyBkb3VibGUgcHJlY2lzaW9uIG9uIFdpbmRvd3MqIE9TLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgY2hlY2sgd29ya3MgYXJvdW5kIHRoZSBwb3NzaWJsZSBlZmZlY3QgdGhhdCBpbml0ICE9IDAgZm9yIGNodW5rSWR4ID09IDAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgI2lmIEtNUF9PU19XSU5ET1dTICYmIEtNUF9BUkNIX1g4NgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIHdlIGhhdmVuJ3QgYWxyZWFkeSBkb25lIHNvLCBzYXZlIG9yaWdpbmFsCisJCQkgICAgICAgRlBDVyBhbmQgc2V0IHByZWNpc2lvbiB0byA2NC1iaXQsIGFzIFdpbmRvd3MqIE9TCisJCQkgICAgICAgb24gSUEtMzIgYXJjaGl0ZWN0dXJlIGRlZmF1bHRzIHRvIDUzLWJpdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggIWZwY3dTZXQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZEZwY3cgPSBfY29udHJvbDg3KDAsMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250cm9sODcoX1BDXzY0LF9NQ1dfUEMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcGN3U2V0ID0gMHgzMDAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBjaHVua0lkeCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCA9IF9fa21wX2Rpc3BhdGNoX2d1aWRlZF9yZW1haW5pbmc8IFQgPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlwLCAqKCBEQkwgKiApJnByLT51LnAucGFybTMsIGNodW5rSWR4ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoaW5pdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXQgPSB0cmlwIC0gaW5pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgPSB0cmlwIC0gX19rbXBfZGlzcGF0Y2hfZ3VpZGVkX3JlbWFpbmluZzwgVCA+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlwLCAqKCBEQkwgKiApJnByLT51LnAucGFybTMsIGNodW5rSWR4ICsgMSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoaW5pdCA8PSBsaW1pdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpbml0IDwgbGltaXQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQobGltaXQgPD0gdHJpcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tbGltaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgfSAvLyB3aGlsZSAoMSkKKyAgICAjaWYgS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2CisgICAgICAgICAgICAgICAgICAgIC8qIHJlc3RvcmUgRlBDVyBpZiBuZWNlc3NhcnkKKyAgICAgICAgICAgICAgICAgICAgICAgQUM6IGNoZWNrIGZwY3dTZXQgZmxhZyBmaXJzdCBiZWNhdXNlIG9sZEZwY3cgY2FuIGJlIHVuaW5pdGlhbGl6ZWQgaGVyZQorICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBpZiAoIGZwY3dTZXQgJiYgKCBvbGRGcGN3ICYgZnBjd1NldCApICkKKyAgICAgICAgICAgICAgICAgICAgICAgIF9jb250cm9sODcob2xkRnBjdyxfTUNXX1BDKTsKKyAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0dXMgIT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gcHItPnUucC5sYjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluY3IgPSBwci0+dS5wLnN0OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwX3N0ICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX3N0ID0gaW5jcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwX2xiID0gc3RhcnQgKyBpbml0ICogaW5jcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwX3ViID0gc3RhcnQgKyBsaW1pdCAqIGluY3I7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHByLT5vcmRlcmVkICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF9sb3dlciA9IGluaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHItPnUucC5vcmRlcmVkX3VwcGVyID0gbGltaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfX2ttcF9kaXNwYXRjaF9uZXh0OiBUIyUlZCBvcmRlcmVkX2xvd2VyOiUlJXMgb3JkZXJlZF91cHBlcjolJSVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3Q8IFVUID46OnNwZWMsIHRyYWl0c190PCBVVCA+OjpzcGVjICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMDAsICggYnVmZiwgZ3RpZCwgcHItPnUucC5vcmRlcmVkX2xvd2VyLCBwci0+dS5wLm9yZGVyZWRfdXBwZXIgKSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqcF9sYiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAqcF91YiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBfc3QgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfc3QgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSAvLyBjYXNlCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF90cmFwZXpvaWRhbDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFVUICAgaW5kZXg7CisgICAgICAgICAgICAgICAgICAgIFQgICAgcGFybTIgPSBwci0+dS5wLnBhcm0yOworICAgICAgICAgICAgICAgICAgICBUICAgIHBhcm0zID0gcHItPnUucC5wYXJtMzsKKyAgICAgICAgICAgICAgICAgICAgVCAgICBwYXJtNCA9IHByLT51LnAucGFybTQ7CisgICAgICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9uZXh0OiBUIyVkIGttcF9zY2hfdHJhcGV6b2lkYWwgY2FzZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCApICk7CisKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggPSB0ZXN0X3RoZW5faW5jPCBTVCA+KCAodm9sYXRpbGUgU1QgKikgJiBzaC0+dS5zLml0ZXJhdGlvbiApOworCisgICAgICAgICAgICAgICAgICAgIGluaXQgPSAoIGluZGV4ICogKCAoMipwYXJtMikgLSAoaW5kZXgtMSkqcGFybTQgKSApIC8gMjsKKyAgICAgICAgICAgICAgICAgICAgdHJpcCA9IHByLT51LnAudGMgLSAxOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKHN0YXR1cyA9ICgoVClpbmRleCA8IHBhcm0zICYmIGluaXQgPD0gdHJpcCkpID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqcF9sYiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAqcF91YiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBfc3QgIT0gTlVMTCApICpwX3N0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gcHItPnUucC5sYjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gKCAoaW5kZXgrMSkgKiAoIDIqcGFybTIgLSBpbmRleCpwYXJtNCApICkgLyAyIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluY3IgID0gcHItPnUucC5zdDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAobGFzdCA9IChsaW1pdCA+PSB0cmlwKSkgIT0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgPSB0cmlwOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBfc3QgIT0gTlVMTCApICpwX3N0ID0gaW5jcjsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpbmNyID09IDEgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSBzdGFydCArIGluaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSBzdGFydCArIGxpbWl0OworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9sYiA9IHN0YXJ0ICsgaW5pdCAqIGluY3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSBzdGFydCArIGxpbWl0ICogaW5jcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwci0+b3JkZXJlZCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfbG93ZXIgPSBpbml0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF91cHBlciA9IGxpbWl0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlJWQgb3JkZXJlZF9sb3dlcjolJSVzIG9yZGVyZWRfdXBwZXI6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIGJ1ZmYsIGd0aWQsIHByLT51LnAub3JkZXJlZF9sb3dlciwgcHItPnUucC5vcmRlcmVkX3VwcGVyICkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICAgICAgfSAvLyBjYXNlCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMDsgLy8gdG8gYXZvaWQgY29tcGxhaW50cyBvbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlIHVzZQorICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V2ZXJpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIFVua25vd25TY2hlZFR5cGVEZXRlY3RlZCApLCAvLyBQcmltYXJ5IG1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9ITlQoIEdldE5ld2VyTGlicmFyeSApLCAgICAgICAgICAvLyBIaW50CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbCAgICAgICAgICAgICAgICAgICAgICAgLy8gVmFyaWFkaWMgYXJndW1lbnQgbGlzdCB0ZXJtaW5hdG9yCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSAvLyBzd2l0Y2gKKyAgICAgICAgfSAvLyBpZiB0YyA9PSAwOworCisgICAgICAgIGlmICggc3RhdHVzID09IDAgKSB7CisgICAgICAgICAgICBVVCAgIG51bV9kb25lOworCisgICAgICAgICAgICBudW1fZG9uZSA9IHRlc3RfdGhlbl9pbmM8IFNUID4oICh2b2xhdGlsZSBTVCAqKSAmIHNoLT51LnMubnVtX2RvbmUgKTsKKyAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJSVkIGluY3JlbWVudCBudW1fZG9uZTolJSVzXG4iLAorICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdDwgVVQgPjo6c3BlYyApOworICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMCwgKCBidWZmLCBndGlkLCBzaC0+dS5zLm51bV9kb25lICkgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICNlbmRpZgorCisgICAgICAgICAgICBpZiAoIChTVCludW1fZG9uZSA9PSB0ZWFtLT50LnRfbnByb2MtMSApIHsKKyAgICAgICAgICAgICAgICAvKiBOT1RFOiByZWxlYXNlIHRoaXMgYnVmZmVyIHRvIGJlIHJldXNlZCAqLworCisgICAgICAgICAgICAgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICAgICAgICAgICAgICBzaC0+dS5zLm51bV9kb25lID0gMDsKKyAgICAgICAgICAgICAgICBzaC0+dS5zLml0ZXJhdGlvbiA9IDA7CisKKyAgICAgICAgICAgICAgICAvKiBUT0RPIHJlcGxhY2Ugd2l0aCBnZW5lcmFsIHJlbGVhc2UgcHJvY2VkdXJlPyAqLworICAgICAgICAgICAgICAgIGlmICggcHItPm9yZGVyZWQgKSB7CisgICAgICAgICAgICAgICAgICAgIHNoLT51LnMub3JkZXJlZF9pdGVyYXRpb24gPSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgICAgICAgICAgICAgc2ggLT4gYnVmZmVyX2luZGV4ICs9IEtNUF9NQVhfRElTUF9CVUY7CisgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJWQgY2hhbmdlIGJ1ZmZlcl9pbmRleDolZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgc2gtPmJ1ZmZlcl9pbmRleCkgKTsKKworICAgICAgICAgICAgICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgICAgICAgICBpZiAoIHByLT5wdXNoZWRfd3MgIT0gY3Rfbm9uZSApIHsKKyAgICAgICAgICAgICAgICAgICAgcHItPnB1c2hlZF93cyA9IF9fa21wX3BvcF93b3Jrc2hhcmUoIGd0aWQsIHByLT5wdXNoZWRfd3MsIGxvYyApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZGVvX2ZjbiA9IE5VTEw7CisgICAgICAgICAgICB0aCAtPiB0aC50aF9kaXNwYXRjaCAtPiB0aF9keG9fZmNuID0gTlVMTDsKKyAgICAgICAgICAgIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2Rpc3BhdGNoX3NoX2N1cnJlbnQgPSBOVUxMOworICAgICAgICAgICAgdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZGlzcGF0Y2hfcHJfY3VycmVudCA9IE5VTEw7CisgICAgICAgIH0gLy8gaWYgKHN0YXR1cyA9PSAwKQorI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIGVsc2UgaWYgKCBsYXN0ICkgeworICAgICAgICAgICAgcHItPnUucC5sYXN0X3VwcGVyID0gcHItPnUucC51YjsKKyAgICAgICAgfQorI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCisgICAgICAgIGlmICggcF9sYXN0ICE9IE5VTEwgJiYgc3RhdHVzICE9IDAgKQorICAgICAgICAgICAgKnBfbGFzdCA9IGxhc3Q7CisgICAgfSAvLyBpZgorCisgICAgI2lmZGVmIEtNUF9ERUJVRworICAgIHsKKyAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICJfX2ttcF9kaXNwYXRjaF9uZXh0OiBUIyUlZCBub3JtYWwgY2FzZTogIiBcCisgICAgICAgICAgICAicF9sYjolJSVzIHBfdWI6JSUlcyBwX3N0OiUlJXMgcF9sYXN0OiUlcCAgcmV0dXJuaW5nOiUlZFxuIiwKKyAgICAgICAgICAgIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBTVCA+OjpzcGVjICk7CisgICAgICAgIEtEX1RSQUNFKDEwLCAoIGJ1ZmYsIGd0aWQsICpwX2xiLCAqcF91YiwgcF9zdCA/ICpwX3N0IDogMCwgcF9sYXN0LCBzdGF0dXMgKSApOworICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICB9CisgICAgI2VuZGlmCisjaWYgSU5DTFVERV9TU0NfTUFSS1MKKyAgICBTU0NfTUFSS19ESVNQQVRDSF9ORVhUKCk7CisjZW5kaWYKKyAgICBPTVBUX0xPT1BfRU5EOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3RlbXBsYXRlPCB0eXBlbmFtZSBUID4KK3N0YXRpYyB2b2lkCitfX2ttcF9kaXN0X2dldF9ib3VuZHMoCisgICAgaWRlbnRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgKmxvYywKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICAgICAgICAgICAqcGxhc3RpdGVyLAorICAgIFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwbG93ZXIsCisgICAgVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1cHBlciwKKyAgICB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+OjpzaWduZWRfdCAgaW5jcgorKSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+Ojp1bnNpZ25lZF90ICBVVDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnNpZ25lZF90ICAgIFNUOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgIHRlYW1faWQ7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiAgbnRlYW1zOworICAgIHJlZ2lzdGVyIFVUICAgICAgICAgIHRyaXBfY291bnQ7CisgICAgcmVnaXN0ZXIga21wX3RlYW1fdCAqdGVhbTsKKyAgICBrbXBfaW5mb190ICogdGg7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBwbGFzdGl0ZXIgJiYgcGxvd2VyICYmIHB1cHBlciApOworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfZGlzdF9nZXRfYm91bmRzIGNhbGxlZCAoJWQpXG4iLCBndGlkKSk7CisgICAgI2lmZGVmIEtNUF9ERUJVRworICAgIHsKKyAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCggIl9fa21wY19kaXN0X2dldF9ib3VuZHM6IFQjJSVkIGxpdGVyPSUlZCAiXAorICAgICAgICAgICAgIml0ZXI9KCUlJXMsICUlJXMsICUlJXMpIHNpZ25lZD88JXM+XG4iLAorICAgICAgICAgICAgdHJhaXRzX3Q8IFQgPjo6c3BlYywgdHJhaXRzX3Q8IFQgPjo6c3BlYywgdHJhaXRzX3Q8IFNUID46OnNwZWMsCisgICAgICAgICAgICB0cmFpdHNfdDwgVCA+OjpzcGVjICk7CisgICAgICAgIEtEX1RSQUNFKDEwMCwgKCBidWZmLCBndGlkLCAqcGxhc3RpdGVyLCAqcGxvd2VyLCAqcHVwcGVyLCBpbmNyICkgKTsKKyAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgfQorICAgICNlbmRpZgorCisgICAgaWYoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgaWYoIGluY3IgPT0gMCApIHsKKyAgICAgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdCgga21wX2kxOG5fbXNnX0Nuc0xvb3BJbmNyWmVyb1Byb2hpYml0ZWQsIGN0X3BkbywgbG9jICk7CisgICAgICAgIH0KKyAgICAgICAgaWYoIGluY3IgPiAwID8gKCpwdXBwZXIgPCAqcGxvd2VyKSA6ICgqcGxvd2VyIDwgKnB1cHBlcikgKSB7CisgICAgICAgICAgICAvLyBUaGUgbG9vcCBpcyBpbGxlZ2FsLgorICAgICAgICAgICAgLy8gU29tZSB6ZXJvLXRyaXAgbG9vcHMgbWFpbnRhaW5lZCBieSBjb21waWxlciwgZS5nLjoKKyAgICAgICAgICAgIC8vICAgZm9yKGk9MTA7aTwwOysraSkgLy8gbG93ZXIgPj0gdXBwZXIgLSBydW4tdGltZSBjaGVjaworICAgICAgICAgICAgLy8gICBmb3IoaT0wO2k+MTA7LS1pKSAvLyBsb3dlciA8PSB1cHBlciAtIHJ1bi10aW1lIGNoZWNrCisgICAgICAgICAgICAvLyAgIGZvcihpPTA7aT4xMDsrK2kpIC8vIGluY3IgPiAwICAgICAgIC0gY29tcGlsZS10aW1lIGNoZWNrCisgICAgICAgICAgICAvLyAgIGZvcihpPTEwO2k8MDstLWkpIC8vIGluY3IgPCAwICAgICAgIC0gY29tcGlsZS10aW1lIGNoZWNrCisgICAgICAgICAgICAvLyBDb21waWxlciBkb2VzIG5vdCBjaGVjayB0aGUgZm9sbG93aW5nIGlsbGVnYWwgbG9vcHM6CisgICAgICAgICAgICAvLyAgIGZvcihpPTA7aTwxMDtpKz1pbmNyKSAvLyB3aGVyZSBpbmNyPDAKKyAgICAgICAgICAgIC8vICAgZm9yKGk9MTA7aT4wO2ktPWluY3IpIC8vIHdoZXJlIGluY3I8MAorICAgICAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0KCBrbXBfaTE4bl9tc2dfQ25zTG9vcEluY3JJbGxlZ2FsLCBjdF9wZG8sIGxvYyApOworICAgICAgICB9CisgICAgfQorICAgIHRoID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKyAgICB0ZWFtID0gdGgtPnRoLnRoX3RlYW07CisgICAgI2lmIE9NUF80MF9FTkFCTEVECisgICAgS01QX0RFQlVHX0FTU0VSVCh0aC0+dGgudGhfdGVhbXNfbWljcm90YXNrKTsgICAvLyB3ZSBhcmUgaW4gdGhlIHRlYW1zIGNvbnN0cnVjdAorICAgIG50ZWFtcyA9IHRoLT50aC50aF90ZWFtc19zaXplLm50ZWFtczsKKyAgICAjZW5kaWYKKyAgICB0ZWFtX2lkID0gdGVhbS0+dC50X21hc3Rlcl90aWQ7CisgICAgS01QX0RFQlVHX0FTU0VSVChudGVhbXMgPT0gdGVhbS0+dC50X3BhcmVudC0+dC50X25wcm9jKTsKKworICAgIC8vIGNvbXB1dGUgZ2xvYmFsIHRyaXAgY291bnQKKyAgICBpZiggaW5jciA9PSAxICkgeworICAgICAgICB0cmlwX2NvdW50ID0gKnB1cHBlciAtICpwbG93ZXIgKyAxOworICAgIH0gZWxzZSBpZihpbmNyID09IC0xKSB7CisgICAgICAgIHRyaXBfY291bnQgPSAqcGxvd2VyIC0gKnB1cHBlciArIDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdHJpcF9jb3VudCA9IChTVCkoKnB1cHBlciAtICpwbG93ZXIpIC8gaW5jciArIDE7IC8vIGNhc3QgdG8gc2lnbmVkIHRvIGNvdmVyIGluY3I8MCBjYXNlCisgICAgfQorCisgICAgaWYoIHRyaXBfY291bnQgPD0gbnRlYW1zICkgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKAorICAgICAgICAgICAgX19rbXBfc3RhdGljID09IGttcF9zY2hfc3RhdGljX2dyZWVkeSB8fCBcCisgICAgICAgICAgICBfX2ttcF9zdGF0aWMgPT0ga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQKKyAgICAgICAgKTsgLy8gVW5rbm93biBzdGF0aWMgc2NoZWR1bGluZyB0eXBlLgorICAgICAgICAvLyBvbmx5IHNvbWUgdGVhbXMgZ2V0IHNpbmdsZSBpdGVyYXRpb24sIG90aGVycyBnZXQgbm90aGluZworICAgICAgICBpZiggdGVhbV9pZCA8IHRyaXBfY291bnQgKSB7CisgICAgICAgICAgICAqcHVwcGVyID0gKnBsb3dlciA9ICpwbG93ZXIgKyB0ZWFtX2lkICogaW5jcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpwbG93ZXIgPSAqcHVwcGVyICsgaW5jcjsgLy8gemVyby10cmlwIGxvb3AKKyAgICAgICAgfQorICAgICAgICBpZiggcGxhc3RpdGVyICE9IE5VTEwgKQorICAgICAgICAgICAgKnBsYXN0aXRlciA9ICggdGVhbV9pZCA9PSB0cmlwX2NvdW50IC0gMSApOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmKCBfX2ttcF9zdGF0aWMgPT0ga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQgKSB7CisgICAgICAgICAgICByZWdpc3RlciBVVCBjaHVuayA9IHRyaXBfY291bnQgLyBudGVhbXM7CisgICAgICAgICAgICByZWdpc3RlciBVVCBleHRyYXMgPSB0cmlwX2NvdW50ICUgbnRlYW1zOworICAgICAgICAgICAgKnBsb3dlciArPSBpbmNyICogKCB0ZWFtX2lkICogY2h1bmsgKyAoIHRlYW1faWQgPCBleHRyYXMgPyB0ZWFtX2lkIDogZXh0cmFzICkgKTsKKyAgICAgICAgICAgICpwdXBwZXIgPSAqcGxvd2VyICsgY2h1bmsgKiBpbmNyIC0gKCB0ZWFtX2lkIDwgZXh0cmFzID8gMCA6IGluY3IgKTsKKyAgICAgICAgICAgIGlmKCBwbGFzdGl0ZXIgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgKnBsYXN0aXRlciA9ICggdGVhbV9pZCA9PSBudGVhbXMgLSAxICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZWdpc3RlciBUIGNodW5rX2luY19jb3VudCA9CisgICAgICAgICAgICAgICAgKCB0cmlwX2NvdW50IC8gbnRlYW1zICsgKCAoIHRyaXBfY291bnQgJSBudGVhbXMgKSA/IDEgOiAwKSApICogaW5jcjsKKyAgICAgICAgICAgIHJlZ2lzdGVyIFQgdXBwZXIgPSAqcHVwcGVyOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfc3RhdGljID09IGttcF9zY2hfc3RhdGljX2dyZWVkeSApOworICAgICAgICAgICAgICAgIC8vIFVua25vd24gc3RhdGljIHNjaGVkdWxpbmcgdHlwZS4KKyAgICAgICAgICAgICpwbG93ZXIgKz0gdGVhbV9pZCAqIGNodW5rX2luY19jb3VudDsKKyAgICAgICAgICAgICpwdXBwZXIgPSAqcGxvd2VyICsgY2h1bmtfaW5jX2NvdW50IC0gaW5jcjsKKyAgICAgICAgICAgIC8vIENoZWNrL2NvcnJlY3QgYm91bmRzIGlmIG5lZWRlZAorICAgICAgICAgICAgaWYoIGluY3IgPiAwICkgeworICAgICAgICAgICAgICAgIGlmKCAqcHVwcGVyIDwgKnBsb3dlciApCisgICAgICAgICAgICAgICAgICAgICpwdXBwZXIgPSBpX21heG1pbjwgVCA+OjpteDsKKyAgICAgICAgICAgICAgICBpZiggcGxhc3RpdGVyICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICAgICAqcGxhc3RpdGVyID0gKnBsb3dlciA8PSB1cHBlciAmJiAqcHVwcGVyID4gdXBwZXIgLSBpbmNyOworICAgICAgICAgICAgICAgIGlmKCAqcHVwcGVyID4gdXBwZXIgKQorICAgICAgICAgICAgICAgICAgICAqcHVwcGVyID0gdXBwZXI7IC8vIHRyYWNrZXIgQzczMjU4CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmKCAqcHVwcGVyID4gKnBsb3dlciApCisgICAgICAgICAgICAgICAgICAgICpwdXBwZXIgPSBpX21heG1pbjwgVCA+OjptbjsKKyAgICAgICAgICAgICAgICBpZiggcGxhc3RpdGVyICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICAgICAqcGxhc3RpdGVyID0gKnBsb3dlciA+PSB1cHBlciAmJiAqcHVwcGVyIDwgdXBwZXIgLSBpbmNyOworICAgICAgICAgICAgICAgIGlmKCAqcHVwcGVyIDwgdXBwZXIgKQorICAgICAgICAgICAgICAgICAgICAqcHVwcGVyID0gdXBwZXI7IC8vIHRyYWNrZXIgQzczMjU4CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERpc3BhdGNoIHJvdXRpbmVzCisvLyAgICBUcmFuc2ZlciBjYWxsIHRvIHRlbXBsYXRlPCB0eXBlIFQgPgorLy8gICAgX19rbXBfZGlzcGF0Y2hfaW5pdCggaWRlbnRfdCAqbG9jLCBpbnQgZ3RpZCwgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgVCBsYiwgVCB1YiwgU1Qgc3QsIFNUIGNodW5rICkKK2V4dGVybiAiQyIgeworCisvKiEKK0Bpbmdyb3VwIFdPUktfU0hBUklORworQHsKK0BwYXJhbSBsb2MgU291cmNlIGxvY2F0aW9uCitAcGFyYW0gZ3RpZCBHbG9iYWwgdGhyZWFkIGlkCitAcGFyYW0gc2NoZWR1bGUgU2NoZWR1bGUgdHlwZQorQHBhcmFtIGxiICBMb3dlciBib3VuZAorQHBhcmFtIHViICBVcHBlciBib3VuZAorQHBhcmFtIHN0ICBTdGVwIChvciBpbmNyZW1lbnQgaWYgeW91IHByZWZlcikKK0BwYXJhbSBjaHVuayBUaGUgY2h1bmsgc2l6ZSB0byBibG9jayB3aXRoCisKK1RoaXMgZnVuY3Rpb24gcHJlcGFyZXMgdGhlIHJ1bnRpbWUgdG8gc3RhcnQgYSBkeW5hbWljYWxseSBzY2hlZHVsZWQgZm9yIGxvb3AsIHNhdmluZyB0aGUgbG9vcCBhcmd1bWVudHMuCitUaGVzZSBmdW5jdGlvbnMgYXJlIGFsbCBpZGVudGljYWwgYXBhcnQgZnJvbSB0aGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cy4KKyovCisKK3ZvaWQKK19fa21wY19kaXNwYXRjaF9pbml0XzQoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBsYiwga21wX2ludDMyIHViLCBrbXBfaW50MzIgc3QsIGttcF9pbnQzMiBjaHVuayApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKyAgICBfX2ttcF9kaXNwYXRjaF9pbml0PCBrbXBfaW50MzIgPiggbG9jLCBndGlkLCBzY2hlZHVsZSwgbGIsIHViLCBzdCwgY2h1bmssIHRydWUgKTsKK30KKy8qIQorU2VlIEByZWYgX19rbXBjX2Rpc3BhdGNoX2luaXRfNAorKi8KK3ZvaWQKK19fa21wY19kaXNwYXRjaF9pbml0XzR1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdWludDMyIGxiLCBrbXBfdWludDMyIHViLCBrbXBfaW50MzIgc3QsIGttcF9pbnQzMiBjaHVuayApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKyAgICBfX2ttcF9kaXNwYXRjaF9pbml0PCBrbXBfdWludDMyID4oIGxvYywgZ3RpZCwgc2NoZWR1bGUsIGxiLCB1Yiwgc3QsIGNodW5rLCB0cnVlICk7Cit9CisKKy8qIQorU2VlIEByZWYgX19rbXBjX2Rpc3BhdGNoX2luaXRfNAorKi8KK3ZvaWQKK19fa21wY19kaXNwYXRjaF9pbml0XzgoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCBsYiwga21wX2ludDY0IHViLAorICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0IHN0LCBrbXBfaW50NjQgY2h1bmsgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisgICAgX19rbXBfZGlzcGF0Y2hfaW5pdDwga21wX2ludDY0ID4oIGxvYywgZ3RpZCwgc2NoZWR1bGUsIGxiLCB1Yiwgc3QsIGNodW5rLCB0cnVlICk7Cit9CisKKy8qIQorU2VlIEByZWYgX19rbXBjX2Rpc3BhdGNoX2luaXRfNAorKi8KK3ZvaWQKK19fa21wY19kaXNwYXRjaF9pbml0Xzh1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAga21wX3VpbnQ2NCBsYiwga21wX3VpbnQ2NCB1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50NjQgc3QsIGttcF9pbnQ2NCBjaHVuayApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKyAgICBfX2ttcF9kaXNwYXRjaF9pbml0PCBrbXBfdWludDY0ID4oIGxvYywgZ3RpZCwgc2NoZWR1bGUsIGxiLCB1Yiwgc3QsIGNodW5rLCB0cnVlICk7Cit9CisKKy8qIQorU2VlIEByZWYgX19rbXBjX2Rpc3BhdGNoX2luaXRfNAorCitEaWZmZXJlbmNlIGZyb20gX19rbXBjX2Rpc3BhdGNoX2luaXQgc2V0IG9mIGZ1bmN0aW9ucyBpcyB0aGVzZSBmdW5jdGlvbnMKK2FyZSBjYWxsZWQgZm9yIGNvbXBvc2l0ZSBkaXN0cmlidXRlIHBhcmFsbGVsIGZvciBjb25zdHJ1Y3QuIFRodXMgYmVmb3JlCityZWd1bGFyIGl0ZXJhdGlvbnMgZGlzcGF0Y2hpbmcgd2UgbmVlZCB0byBjYWxjIHBlci10ZWFtIGl0ZXJhdGlvbiBzcGFjZS4KKworVGhlc2UgZnVuY3Rpb25zIGFyZSBhbGwgaWRlbnRpY2FsIGFwYXJ0IGZyb20gdGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMuCisqLwordm9pZAorX19rbXBjX2Rpc3RfZGlzcGF0Y2hfaW5pdF80KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsCisgICAga21wX2ludDMyICpwX2xhc3QsIGttcF9pbnQzMiBsYiwga21wX2ludDMyIHViLCBrbXBfaW50MzIgc3QsIGttcF9pbnQzMiBjaHVuayApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKyAgICBfX2ttcF9kaXN0X2dldF9ib3VuZHM8IGttcF9pbnQzMiA+KCBsb2MsIGd0aWQsIHBfbGFzdCwgJmxiLCAmdWIsIHN0ICk7CisgICAgX19rbXBfZGlzcGF0Y2hfaW5pdDwga21wX2ludDMyID4oIGxvYywgZ3RpZCwgc2NoZWR1bGUsIGxiLCB1Yiwgc3QsIGNodW5rLCB0cnVlICk7Cit9CisKK3ZvaWQKK19fa21wY19kaXN0X2Rpc3BhdGNoX2luaXRfNHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwKKyAgICBrbXBfaW50MzIgKnBfbGFzdCwga21wX3VpbnQzMiBsYiwga21wX3VpbnQzMiB1Yiwga21wX2ludDMyIHN0LCBrbXBfaW50MzIgY2h1bmsgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisgICAgX19rbXBfZGlzdF9nZXRfYm91bmRzPCBrbXBfdWludDMyID4oIGxvYywgZ3RpZCwgcF9sYXN0LCAmbGIsICZ1Yiwgc3QgKTsKKyAgICBfX2ttcF9kaXNwYXRjaF9pbml0PCBrbXBfdWludDMyID4oIGxvYywgZ3RpZCwgc2NoZWR1bGUsIGxiLCB1Yiwgc3QsIGNodW5rLCB0cnVlICk7Cit9CisKK3ZvaWQKK19fa21wY19kaXN0X2Rpc3BhdGNoX2luaXRfOCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLAorICAgIGttcF9pbnQzMiAqcF9sYXN0LCBrbXBfaW50NjQgbGIsIGttcF9pbnQ2NCB1Yiwga21wX2ludDY0IHN0LCBrbXBfaW50NjQgY2h1bmsgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisgICAgX19rbXBfZGlzdF9nZXRfYm91bmRzPCBrbXBfaW50NjQgPiggbG9jLCBndGlkLCBwX2xhc3QsICZsYiwgJnViLCBzdCApOworICAgIF9fa21wX2Rpc3BhdGNoX2luaXQ8IGttcF9pbnQ2NCA+KCBsb2MsIGd0aWQsIHNjaGVkdWxlLCBsYiwgdWIsIHN0LCBjaHVuaywgdHJ1ZSApOworfQorCit2b2lkCitfX2ttcGNfZGlzdF9kaXNwYXRjaF9pbml0Xzh1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsCisgICAga21wX2ludDMyICpwX2xhc3QsIGttcF91aW50NjQgbGIsIGttcF91aW50NjQgdWIsIGttcF9pbnQ2NCBzdCwga21wX2ludDY0IGNodW5rICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworICAgIF9fa21wX2Rpc3RfZ2V0X2JvdW5kczwga21wX3VpbnQ2NCA+KCBsb2MsIGd0aWQsIHBfbGFzdCwgJmxiLCAmdWIsIHN0ICk7CisgICAgX19rbXBfZGlzcGF0Y2hfaW5pdDwga21wX3VpbnQ2NCA+KCBsb2MsIGd0aWQsIHNjaGVkdWxlLCBsYiwgdWIsIHN0LCBjaHVuaywgdHJ1ZSApOworfQorCisvKiEKK0BwYXJhbSBsb2MgU291cmNlIGNvZGUgbG9jYXRpb24KK0BwYXJhbSBndGlkIEdsb2JhbCB0aHJlYWQgaWQKK0BwYXJhbSBwX2xhc3QgUG9pbnRlciB0byBhIGZsYWcgc2V0IHRvIG9uZSBpZiB0aGlzIGlzIHRoZSBsYXN0IGNodW5rIG9yIHplcm8gb3RoZXJ3aXNlCitAcGFyYW0gcF9sYiAgIFBvaW50ZXIgdG8gdGhlIGxvd2VyIGJvdW5kIGZvciB0aGUgbmV4dCBjaHVuayBvZiB3b3JrCitAcGFyYW0gcF91YiAgIFBvaW50ZXIgdG8gdGhlIHVwcGVyIGJvdW5kIGZvciB0aGUgbmV4dCBjaHVuayBvZiB3b3JrCitAcGFyYW0gcF9zdCAgIFBvaW50ZXIgdG8gdGhlIHN0cmlkZSBmb3IgdGhlIG5leHQgY2h1bmsgb2Ygd29yaworQHJldHVybiBvbmUgaWYgdGhlcmUgaXMgd29yayB0byBiZSBkb25lLCB6ZXJvIG90aGVyd2lzZQorCitHZXQgdGhlIG5leHQgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGNodW5rIG9mIHdvcmsgZm9yIHRoaXMgdGhyZWFkLgorSWYgdGhlcmUgaXMgbm8gbW9yZSB3b3JrLCB0aGVuIHRoZSBsYix1YiBhbmQgc3RyaWRlIG5lZWQgbm90IGJlIG1vZGlmaWVkLgorKi8KK2ludAorX19rbXBjX2Rpc3BhdGNoX25leHRfNCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyICpwX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgKnBfbGIsIGttcF9pbnQzMiAqcF91Yiwga21wX2ludDMyICpwX3N0ICkKK3sKKyAgICByZXR1cm4gX19rbXBfZGlzcGF0Y2hfbmV4dDwga21wX2ludDMyID4oIGxvYywgZ3RpZCwgcF9sYXN0LCBwX2xiLCBwX3ViLCBwX3N0ICk7Cit9CisKKy8qIQorU2VlIEByZWYgX19rbXBjX2Rpc3BhdGNoX25leHRfNAorKi8KK2ludAorX19rbXBjX2Rpc3BhdGNoX25leHRfNHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiAqcF9sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAga21wX3VpbnQzMiAqcF9sYiwga21wX3VpbnQzMiAqcF91Yiwga21wX2ludDMyICpwX3N0ICkKK3sKKyAgICByZXR1cm4gX19rbXBfZGlzcGF0Y2hfbmV4dDwga21wX3VpbnQzMiA+KCBsb2MsIGd0aWQsIHBfbGFzdCwgcF9sYiwgcF91YiwgcF9zdCApOworfQorCisvKiEKK1NlZSBAcmVmIF9fa21wY19kaXNwYXRjaF9uZXh0XzQKKyovCitpbnQKK19fa21wY19kaXNwYXRjaF9uZXh0XzgoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiAqcF9sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0ICpwX2xiLCBrbXBfaW50NjQgKnBfdWIsIGttcF9pbnQ2NCAqcF9zdCApCit7CisgICAgcmV0dXJuIF9fa21wX2Rpc3BhdGNoX25leHQ8IGttcF9pbnQ2NCA+KCBsb2MsIGd0aWQsIHBfbGFzdCwgcF9sYiwgcF91YiwgcF9zdCApOworfQorCisvKiEKK1NlZSBAcmVmIF9fa21wY19kaXNwYXRjaF9uZXh0XzQKKyovCitpbnQKK19fa21wY19kaXNwYXRjaF9uZXh0Xzh1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgKnBfbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50NjQgKnBfbGIsIGttcF91aW50NjQgKnBfdWIsIGttcF9pbnQ2NCAqcF9zdCApCit7CisgICAgcmV0dXJuIF9fa21wX2Rpc3BhdGNoX25leHQ8IGttcF91aW50NjQgPiggbG9jLCBndGlkLCBwX2xhc3QsIHBfbGIsIHBfdWIsIHBfc3QgKTsKK30KKworLyohCitAcGFyYW0gbG9jIFNvdXJjZSBjb2RlIGxvY2F0aW9uCitAcGFyYW0gZ3RpZCBHbG9iYWwgdGhyZWFkIGlkCisKK01hcmsgdGhlIGVuZCBvZiBhIGR5bmFtaWMgbG9vcC4KKyovCit2b2lkCitfX2ttcGNfZGlzcGF0Y2hfZmluaV80KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBfX2ttcF9kaXNwYXRjaF9maW5pc2g8IGttcF91aW50MzIgPiggZ3RpZCwgbG9jICk7Cit9CisKKy8qIQorU2VlIEByZWYgX19rbXBjX2Rpc3BhdGNoX2ZpbmlfNAorKi8KK3ZvaWQKK19fa21wY19kaXNwYXRjaF9maW5pXzgoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQgKQoreworICAgIF9fa21wX2Rpc3BhdGNoX2ZpbmlzaDwga21wX3VpbnQ2NCA+KCBndGlkLCBsb2MgKTsKK30KKworLyohCitTZWUgQHJlZiBfX2ttcGNfZGlzcGF0Y2hfZmluaV80CisqLwordm9pZAorX19rbXBjX2Rpc3BhdGNoX2ZpbmlfNHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQgKQoreworICAgIF9fa21wX2Rpc3BhdGNoX2ZpbmlzaDwga21wX3VpbnQzMiA+KCBndGlkLCBsb2MgKTsKK30KKworLyohCitTZWUgQHJlZiBfX2ttcGNfZGlzcGF0Y2hfZmluaV80CisqLwordm9pZAorX19rbXBjX2Rpc3BhdGNoX2ZpbmlfOHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQgKQoreworICAgIF9fa21wX2Rpc3BhdGNoX2ZpbmlzaDwga21wX3VpbnQ2NCA+KCBndGlkLCBsb2MgKTsKK30KKy8qISBAfSAqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvL05vbi10ZW1wbGF0ZSByb3V0aW5lcyBmcm9tIGttcF9kaXNwYXRjaC5jIHVzZWQgaW4gb3RoZXIgc291cmNlcworCitrbXBfdWludDMyIF9fa21wX2VxXzQoIGttcF91aW50MzIgdmFsdWUsIGttcF91aW50MzIgY2hlY2tlcikgeworICAgIHJldHVybiB2YWx1ZSA9PSBjaGVja2VyOworfQorCitrbXBfdWludDMyIF9fa21wX25lcV80KCBrbXBfdWludDMyIHZhbHVlLCBrbXBfdWludDMyIGNoZWNrZXIpIHsKKyAgICByZXR1cm4gdmFsdWUgIT0gY2hlY2tlcjsKK30KKwora21wX3VpbnQzMiBfX2ttcF9sdF80KCBrbXBfdWludDMyIHZhbHVlLCBrbXBfdWludDMyIGNoZWNrZXIpIHsKKyAgICByZXR1cm4gdmFsdWUgPCBjaGVja2VyOworfQorCitrbXBfdWludDMyIF9fa21wX2dlXzQoIGttcF91aW50MzIgdmFsdWUsIGttcF91aW50MzIgY2hlY2tlcikgeworICAgIHJldHVybiB2YWx1ZSA+PSBjaGVja2VyOworfQorCitrbXBfdWludDMyIF9fa21wX2xlXzQoIGttcF91aW50MzIgdmFsdWUsIGttcF91aW50MzIgY2hlY2tlcikgeworICAgIHJldHVybiB2YWx1ZSA8PSBjaGVja2VyOworfQorCitrbXBfdWludDMyCitfX2ttcF93YWl0X3lpZWxkXzQodm9sYXRpbGUga21wX3VpbnQzMiAqIHNwaW5uZXIsCisgICAgICAgICAgICAgICAgICAga21wX3VpbnQzMiAgICAgICAgICAgIGNoZWNrZXIsCisgICAgICAgICAgICAgICAgICAga21wX3VpbnQzMiAoKiBwcmVkKSgga21wX3VpbnQzMiwga21wX3VpbnQzMiApCisgICAgICAgICAgICAgICAgICAgLCB2b2lkICAgICAgICAqIG9iaiAgICAvLyBIaWdoZXItbGV2ZWwgc3luY2hyb25pemF0aW9uIG9iamVjdCwgb3IgTlVMTC4KKyAgICAgICAgICAgICAgICAgICApCit7CisgICAgLy8gbm90ZTogd2UgbWF5IG5vdCBiZWxvbmcgdG8gYSB0ZWFtIGF0IHRoaXMgcG9pbnQKKyAgICByZWdpc3RlciB2b2xhdGlsZSBrbXBfdWludDMyICAgICAgICAgKiBzcGluICAgICAgICAgID0gc3Bpbm5lcjsKKyAgICByZWdpc3RlciAgICAgICAgICBrbXBfdWludDMyICAgICAgICAgICBjaGVjayAgICAgICAgID0gY2hlY2tlcjsKKyAgICByZWdpc3RlciAgICAgICAgICBrbXBfdWludDMyICAgc3BpbnM7CisgICAgcmVnaXN0ZXIgICAgICAgICAga21wX3VpbnQzMiAoKmYpICgga21wX3VpbnQzMiwga21wX3VpbnQzMiApID0gcHJlZDsKKyAgICByZWdpc3RlciAgICAgICAgICBrbXBfdWludDMyICAgICAgICAgICByOworCisgICAgS01QX0ZTWU5DX1NQSU5fSU5JVCggb2JqLCAodm9pZCopIHNwaW4gKTsKKyAgICBLTVBfSU5JVF9ZSUVMRCggc3BpbnMgKTsKKyAgICAvLyBtYWluIHdhaXQgc3BpbiBsb29wCisgICAgd2hpbGUoIWYociA9IFRDUl80KCpzcGluKSwgY2hlY2spKSB7CisgICAgICAgIEtNUF9GU1lOQ19TUElOX1BSRVBBUkUoIG9iaiApOworICAgICAgICAvKiBHRUggLSByZW1vdmUgdGhpcyBzaW5jZSBpdCB3YXMgYWNjaWRlbnRhbGx5IGludHJvZHVjZWQgd2hlbiBrbXBfd2FpdCB3YXMgc3BsaXQuCisgICAgICAgICAgIEl0IGNhdXNlcyBwcm9ibGVtcyB3aXRoIGluZmluaXRlIHJlY3Vyc2lvbiBiZWNhdXNlIG9mIGV4aXQgbG9jayAqLworICAgICAgICAvKiBpZiAoIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkgJiYgX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCkKKyAgICAgICAgICAgIF9fa21wX2Fib3J0X3RocmVhZCgpOyAqLworCisgICAgICAgIC8qIGlmIHdlIGhhdmUgd2FpdGVkIGEgYml0LCBvciBhcmUgb3ZlcnN1YnNjcmliZWQsIHlpZWxkICovCisgICAgICAgIC8qIHBhdXNlIGlzIGluIHRoZSBmb2xsb3dpbmcgY29kZSAqLworICAgICAgICBLTVBfWUlFTEQoIFRDUl80KF9fa21wX250aCkgPiBfX2ttcF9hdmFpbF9wcm9jICk7CisgICAgICAgIEtNUF9ZSUVMRF9TUElOKCBzcGlucyApOworICAgIH0KKyAgICBLTVBfRlNZTkNfU1BJTl9BQ1FVSVJFRCggb2JqICk7CisgICAgcmV0dXJuIHI7Cit9CisKK30gLy8gZXh0ZXJuICJDIgorCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisKK3ZvaWQKK19fa21wX2F1eF9kaXNwYXRjaF9pbml0XzQoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBsYiwga21wX2ludDMyIHViLCBrbXBfaW50MzIgc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgY2h1bmssIGludCBwdXNoX3dzICkKK3sKKyAgICBfX2ttcF9kaXNwYXRjaF9pbml0PCBrbXBfaW50MzIgPiggbG9jLCBndGlkLCBzY2hlZHVsZSwgbGIsIHViLCBzdCwgY2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hfd3MgKTsKK30KKwordm9pZAorX19rbXBfYXV4X2Rpc3BhdGNoX2luaXRfNHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdWludDMyIGxiLCBrbXBfdWludDMyIHViLCBrbXBfaW50MzIgc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGNodW5rLCBpbnQgcHVzaF93cyApCit7CisgICAgX19rbXBfZGlzcGF0Y2hfaW5pdDwga21wX3VpbnQzMiA+KCBsb2MsIGd0aWQsIHNjaGVkdWxlLCBsYiwgdWIsIHN0LCBjaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hfd3MgKTsKK30KKwordm9pZAorX19rbXBfYXV4X2Rpc3BhdGNoX2luaXRfOCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0IGxiLCBrbXBfaW50NjQgdWIsIGttcF9pbnQ2NCBzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCBjaHVuaywgaW50IHB1c2hfd3MgKQoreworICAgIF9fa21wX2Rpc3BhdGNoX2luaXQ8IGttcF9pbnQ2NCA+KCBsb2MsIGd0aWQsIHNjaGVkdWxlLCBsYiwgdWIsIHN0LCBjaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaF93cyApOworfQorCit2b2lkCitfX2ttcF9hdXhfZGlzcGF0Y2hfaW5pdF84dSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50NjQgbGIsIGttcF91aW50NjQgdWIsIGttcF9pbnQ2NCBzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50NjQgY2h1bmssIGludCBwdXNoX3dzICkKK3sKKyAgICBfX2ttcF9kaXNwYXRjaF9pbml0PCBrbXBfdWludDY0ID4oIGxvYywgZ3RpZCwgc2NoZWR1bGUsIGxiLCB1Yiwgc3QsIGNodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaF93cyApOworfQorCit2b2lkCitfX2ttcF9hdXhfZGlzcGF0Y2hfZmluaV9jaHVua180KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBfX2ttcF9kaXNwYXRjaF9maW5pc2hfY2h1bms8IGttcF91aW50MzIgPiggZ3RpZCwgbG9jICk7Cit9CisKK3ZvaWQKK19fa21wX2F1eF9kaXNwYXRjaF9maW5pX2NodW5rXzgoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQgKQoreworICAgIF9fa21wX2Rpc3BhdGNoX2ZpbmlzaF9jaHVuazwga21wX3VpbnQ2NCA+KCBndGlkLCBsb2MgKTsKK30KKwordm9pZAorX19rbXBfYXV4X2Rpc3BhdGNoX2ZpbmlfY2h1bmtfNHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQgKQoreworICAgIF9fa21wX2Rpc3BhdGNoX2ZpbmlzaF9jaHVuazwga21wX3VpbnQzMiA+KCBndGlkLCBsb2MgKTsKK30KKwordm9pZAorX19rbXBfYXV4X2Rpc3BhdGNoX2ZpbmlfY2h1bmtfOHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQgKQoreworICAgIF9fa21wX2Rpc3BhdGNoX2ZpbmlzaF9jaHVuazwga21wX3VpbnQ2NCA+KCBndGlkLCBsb2MgKTsKK30KKworI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfZW52aXJvbm1lbnQuYyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9lbnZpcm9ubWVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MDkwZDYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZW52aXJvbm1lbnQuYwpAQCAtMCwwICsxLDU5NiBAQAorLyoKKyAqIGttcF9lbnZpcm9ubWVudC5jIC0tIEhhbmRsZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgT1MtaW5kZXBlbmRlbnRseS4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLyoKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBXZSB1c2UgR2V0RW52aXJvbm1lbnRWYXJpYWJsZSBmb3IgV2luZG93cyogT1MgaW5zdGVhZCBvZiBnZXRlbnYgYmVjYXVzZSB0aGUgYWN0IG9mCisgICAgbG9hZGluZyBhIERMTCBvbiBXaW5kb3dzKiBPUyBtYWtlcyBhbnkgdXNlci1zZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIChpLmUuIHdpdGggcHV0ZW52KCkpCisgICAgdW5hdmFpbGFibGUuICBnZXRlbnYoKSBhcHBhcmVudGx5IGdldHMgYSBjbGVhbiBjb3B5IG9mIHRoZSBlbnYgdmFyaWFibGVzIGFzIHRoZXkgZXhpc3RlZAorICAgIGF0IHRoZSBzdGFydCBvZiB0aGUgcnVuLgorICAgIEpIIDEyLzIzLzIwMDIKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBPbiBXaW5kb3dzKiBPUywgdGhlcmUgYXJlIHR3byBlbnZpcm9ubWVudHMgKGF0IGxlYXN0LCBzZWUgYmVsb3cpOgorCisgICAgICAgIDEuIEVudmlyb25tZW50IG1haW50YWluZWQgYnkgV2luZG93cyogT1Mgb24gSUEtMzIgYXJjaGl0ZWN0dXJlLiAKKwkgICBBY2Nlc3NpYmxlIHRocm91Z2ggR2V0RW52aXJvbm1lbnRWYXJpYWJsZSgpLAorICAgICAgICAgICBTZXRFbnZpcm9ubWVudFZhcmlhYmxlKCksIGFuZCBHZXRFbnZpcm9ubWVudFN0cmluZ3MoKS4KKworICAgICAgICAyLiBFbnZpcm9ubWVudCBtYWludGFpbmVkIGJ5IEMgUlRMLiBBY2Nlc3NpYmxlIHRocm91Z2ggZ2V0ZW52KCksIHB1dGVudigpLgorCisgICAgcHV0ZW52KCkgZnVuY3Rpb24gdXBkYXRlcyBib3RoIEMgYW5kIFdpbmRvd3MqIE9TIG9uIElBLTMyIGFyY2hpdGVjdHVyZS4gZ2V0ZW52KCkgZnVuY3Rpb24gCisgICAgc2VhcmNoIGZvciB2YXJpYWJsZXMgaW4gQyBSVEwgZW52aXJvbm1lbnQgb25seS4gV2luZG93cyogT1Mgb24gSUEtMzIgYXJjaGl0ZWN0dXJlIGZ1bmN0aW9ucyB3b3JrICpvbmx5KiAKKyAgICB3aXRoIFdpbmRvd3MqIE9TIG9uIElBLTMyIGFyY2hpdGVjdHVyZS4KKworICAgIFdpbmRvd3MqIE9TIG9uIElBLTMyIGFyY2hpdGVjdHVyZSBtYWludGFpbmVkIGJ5IE9TLCBzbyB0aGVyZSBpcyBhbHdheXMgb25seSBvbmUgV2luZG93cyogT1Mgb24gCisgICAgSUEtMzIgYXJjaGl0ZWN0dXJlIHBlciBwcm9jZXNzLiBDaGFuZ2VzIGluIFdpbmRvd3MqIE9TIG9uIElBLTMyIGFyY2hpdGVjdHVyZSBhcmUgcHJvY2Vzcy12aXNpYmxlLgorCisgICAgQyBlbnZpcm9ubWVudCBtYWludGFpbmVkIGJ5IEMgUlRMLiBNdWx0aXBsZSBjb3BpZXMgb2YgQyBSVEwgbWF5IGJlIHByZXNlbnQgaW4gdGhlIHByb2Nlc3MsIGFuZAorICAgIGVhY2ggQyBSVEwgbWFpbnRhaW5zIGl0cyBvd24gZW52aXJvbm1lbnQuIDotKAorCisgICAgVGh1cywgcHJvcGVyIHdheSB0byB3b3JrIHdpdGggZW52aXJvbm1lbnQgb24gV2luZG93cyogT1MgaXM6CisKKyAgICAgICAgMS4gU2V0IHZhcmlhYmxlcyB3aXRoIHB1dGVudigpIGZ1bmN0aW9uIC0tIGJvdGggQyBhbmQgV2luZG93cyogT1Mgb24KKwkgICBJQS0zMiBhcmNoaXRlY3R1cmUgYXJlIGJlaW5nIHVwZGF0ZWQuIFdpbmRvd3MqIE9TIG9uIAorCSAgIElBLTMyIGFyY2hpdGVjdHVyZSBtYXkgYmUgY29uc2lkZXJlZCBhcyBwcmltYXJ5IHRhcmdldCwKKwkgICB3aGlsZSB1cGRhdGluZyBDIFJUTCBlbnZpcm9ubWVudCBpcyBhIGZyZWUgYm9udXMuCisKKyAgICAgICAgMi4gR2V0IHZhcmlhYmxlcyB3aXRoIEdldEVudmlyb25tZW50VmFyaWFibGUoKSAtLSBnZXRlbnYoKSBkb2VzIG5vdCAKKwkgICBzZWFyY2ggV2luZG93cyogT1Mgb24gSUEtMzIgYXJjaGl0ZWN0dXJlLCBhbmQgY2FuIG5vdCBzZWUgdmFyaWFibGVzCisJICAgc2V0IHdpdGggU2V0RW52aXJvbm1lbnRWYXJpYWJsZSgpLgorCisgICAgMjAwNy0wNC0wNSAtLSBsZXYKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpbmNsdWRlICJrbXBfZW52aXJvbm1lbnQuaCIKKworI2luY2x1ZGUgImttcF9vcy5oIiAgICAvLyBLTVBfT1NfKi4KKyNpbmNsdWRlICJrbXAuaCIgICAgICAgLy8KKyNpbmNsdWRlICJrbXBfc3RyLmgiICAgLy8gX19rbXBfc3RyXyooKS4KKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorCisjaWYgS01QX09TX1VOSVgKKyAgICAjaW5jbHVkZSA8c3RkbGliLmg+ICAgIC8vIGdldGVudiwgc2V0ZW52LCB1bnNldGVudi4KKyAgICAjaW5jbHVkZSA8c3RyaW5nLmg+ICAgIC8vIHN0cmxlbiwgc3RyY3B5LgorICAgICNpZiBLTVBfT1NfREFSV0lOCisgICAgICAgICNpbmNsdWRlIDxjcnRfZXh0ZXJucy5oPgorICAgICAgICAjZGVmaW5lIGVudmlyb24gKCpfTlNHZXRFbnZpcm9uKCkpCisgICAgI2Vsc2UKKyAgICAgICAgZXh0ZXJuIGNoYXIgKiAqIGVudmlyb247CisgICAgI2VuZGlmCisjZWxpZiBLTVBfT1NfV0lORE9XUworICAgICNpbmNsdWRlIDx3aW5kb3dzLmg+ICAgLy8gR2V0RW52aXJvbm1lbnRWYXJpYWJsZSwgU2V0RW52aXJvbm1lbnRWYXJpYWJsZSwgR2V0TGFzdEVycm9yLgorI2Vsc2UKKyAgICAjZXJyb3IgVW5rbm93biBvciB1bnN1cHBvcnRlZCBPUy4KKyNlbmRpZgorCisKKy8vIFRPRE86IEVsaW1pbmF0ZSBkaXJlY3QgbWVtb3J5IGFsbG9jYXRpb25zLCB1c2Ugc3RyaW5nIG9wZXJhdGlvbnMgaW5zdGVhZC4KKworc3RhdGljIGlubGluZQordm9pZCAqCithbGxvY2F0ZSgKKyAgICBzaXplX3Qgc2l6ZQorKSB7CisgICAgdm9pZCAqIHB0ciA9IEtNUF9JTlRFUk5BTF9NQUxMT0MoIHNpemUgKTsKKyAgICBpZiAoIHB0ciA9PSBOVUxMICkgeworCUtNUF9GQVRBTCggTWVtb3J5QWxsb2NGYWlsZWQgKTsKKyAgICB9OyAvLyBpZgorICAgIHJldHVybiBwdHI7Cit9IC8vIGFsbG9jYXRlCisKKworY2hhciAqCitfX2ttcF9lbnZfZ2V0KCBjaGFyIGNvbnN0ICogbmFtZSApIHsKKworICAgIGNoYXIgKiByZXN1bHQgPSBOVUxMOworCisgICAgI2lmIEtNUF9PU19VTklYCisgICAgICAgIGNoYXIgY29uc3QgKiB2YWx1ZSA9IGdldGVudiggbmFtZSApOworICAgICAgICBpZiAoIHZhbHVlICE9IE5VTEwgKSB7CisgICAgICAgICAgICBzaXplX3QgbGVuID0gS01QX1NUUkxFTiggdmFsdWUgKSArIDE7CisgICAgICAgICAgICByZXN1bHQgPSAoY2hhciAqKSBLTVBfSU5URVJOQUxfTUFMTE9DKCBsZW4gKTsKKyAgICAgICAgICAgIGlmICggcmVzdWx0ID09IE5VTEwgKSB7CisJCUtNUF9GQVRBTCggTWVtb3J5QWxsb2NGYWlsZWQgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICBLTVBfU1RSTkNQWV9TKCByZXN1bHQsIGxlbiwgdmFsdWUsIGxlbiApOworICAgICAgICB9OyAvLyBpZgorICAgICNlbGlmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIC8qCisgICAgICAgICAgICBXZSB1c2UgR2V0RW52aXJvbm1lbnRWYXJpYWJsZSBmb3IgV2luZG93cyogT1MgaW5zdGVhZCBvZiBnZXRlbnYgYmVjYXVzZSB0aGUgYWN0IG9mCisgICAgICAgICAgICBsb2FkaW5nIGEgRExMIG9uIFdpbmRvd3MqIE9TIG1ha2VzIGFueSB1c2VyLXNldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKGkuZS4gd2l0aCBwdXRlbnYoKSkKKyAgICAgICAgICAgIHVuYXZhaWxhYmxlLiAgZ2V0ZW52KCkgYXBwYXJlbnRseSBnZXRzIGEgY2xlYW4gY29weSBvZiB0aGUgZW52IHZhcmlhYmxlcyBhcyB0aGV5IGV4aXN0ZWQKKyAgICAgICAgICAgIGF0IHRoZSBzdGFydCBvZiB0aGUgcnVuLgorICAgICAgICAgICAgSkggMTIvMjMvMjAwMgorICAgICAgICAqLworICAgICAgICBEV09SRCByYzsKKyAgICAgICAgcmMgPSBHZXRFbnZpcm9ubWVudFZhcmlhYmxlKCBuYW1lLCBOVUxMLCAwICk7CisgICAgICAgIGlmICggISByYyApIHsKKyAgICAgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBpZiAoIGVycm9yICE9IEVSUk9SX0VOVlZBUl9OT1RfRk9VTkQgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRHZXRFbnZWYXIsIG5hbWUgKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIC8vIFZhcmlhYmxlIGlzIG5vdCBmb3VuZCwgaXQncyBvaywganVzdCBjb250aW51ZS4KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIERXT1JEIGxlbiA9IHJjOworICAgICAgICAgICAgcmVzdWx0ID0gKGNoYXIgKikgS01QX0lOVEVSTkFMX01BTExPQyggbGVuICk7CisgICAgICAgICAgICBpZiAoIHJlc3VsdCA9PSBOVUxMICkgeworCQlLTVBfRkFUQUwoIE1lbW9yeUFsbG9jRmFpbGVkICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgcmMgPSBHZXRFbnZpcm9ubWVudFZhcmlhYmxlKCBuYW1lLCByZXN1bHQsIGxlbiApOworICAgICAgICAgICAgaWYgKCAhIHJjICkgeworICAgICAgICAgICAgICAgIC8vIEdldEVudmlyb25tZW50VmFyaWFibGUoKSBtYXkgcmV0dXJuIDAgaWYgdmFyaWFibGUgaXMgZW1wdHkuCisgICAgICAgICAgICAgICAgLy8gSW4gc3VjaCBhIGNhc2UgR2V0TGFzdEVycm9yKCkgcmV0dXJucyBFUlJPUl9TVUNDRVNTLgorICAgICAgICAgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICAgICAgaWYgKCBlcnJvciAhPSBFUlJPUl9TVUNDRVNTICkgeworICAgICAgICAgICAgICAgICAgICAvLyBVbmV4cGVjdGVkIGVycm9yLiBUaGUgdmFyaWFibGUgc2hvdWxkIGJlIGluIHRoZSBlbnZpcm9ubWVudCwKKyAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGJ1ZmZlciBzaG91bGQgYmUgbGFyZ2UgZW5vdWdoLgorICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50R2V0RW52VmFyLCBuYW1lICksCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopIHJlc3VsdCApOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBOVUxMOworICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9OyAvLyBpZgorICAgICNlbHNlCisgICAgICAgICNlcnJvciBVbmtub3duIG9yIHVuc3VwcG9ydGVkIE9TLgorICAgICNlbmRpZgorCisgICAgcmV0dXJuIHJlc3VsdDsKKworfSAvLyBmdW5jIF9fa21wX2Vudl9nZXQKKworCisvLyBUT0RPOiBGaW5kIGFuZCByZXBsYWNlIGFsbCByZWd1bGFyIGZyZWUoKSB3aXRoIF9fa21wX2Vudl9mcmVlKCkuCisKK3ZvaWQKK19fa21wX2Vudl9mcmVlKCBjaGFyIGNvbnN0ICogKiB2YWx1ZSApIHsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHZhbHVlICE9IE5VTEwgKTsKKyAgICBLTVBfSU5URVJOQUxfRlJFRSggKHZvaWQgKikgKiB2YWx1ZSApOworICAgICogdmFsdWUgPSBOVUxMOworCit9IC8vIGZ1bmMgX19rbXBfZW52X2ZyZWUKKworCisKK2ludAorX19rbXBfZW52X2V4aXN0cyggY2hhciBjb25zdCAqIG5hbWUgKSB7CisKKyAgICAjaWYgS01QX09TX1VOSVgKKyAgICAgICAgY2hhciBjb25zdCAqIHZhbHVlID0gZ2V0ZW52KCBuYW1lICk7CisgICAgICAgIHJldHVybiAoICggdmFsdWUgPT0gTlVMTCApID8gKCAwICkgOiAoIDEgKSApOworICAgICNlbGlmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIERXT1JEIHJjOworICAgICAgICByYyA9IEdldEVudmlyb25tZW50VmFyaWFibGUoIG5hbWUsIE5VTEwsIDAgKTsKKyAgICAgICAgaWYgKCByYyA9PSAwICkgeworICAgICAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgIGlmICggZXJyb3IgIT0gRVJST1JfRU5WVkFSX05PVF9GT1VORCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudEdldEVudlZhciwgbmFtZSApLAorICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIHJldHVybiAxOworICAgICNlbHNlCisgICAgICAgICNlcnJvciBVbmtub3duIG9yIHVuc3VwcG9ydGVkIE9TLgorICAgICNlbmRpZgorCit9IC8vIGZ1bmMgX19rbXBfZW52X2V4aXN0cworCisKKwordm9pZAorX19rbXBfZW52X3NldCggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgaW50IG92ZXJ3cml0ZSApIHsKKworICAgICNpZiBLTVBfT1NfVU5JWAorICAgICAgICBpbnQgcmMgPSBzZXRlbnYoIG5hbWUsIHZhbHVlLCBvdmVyd3JpdGUgKTsKKyAgICAgICAgaWYgKCByYyAhPSAwICkgeworICAgICAgICAgICAgLy8gRGVhZCBjb2RlLiBJIHRyaWVkIHRvIHB1dCB0b28gbWFueSB2YXJpYWJsZXMgaW50byBMaW51eCogT1MKKyAgICAgICAgICAgIC8vIGVudmlyb25tZW50IG9uIElBLTMyIGFyY2hpdGVjdHVyZS4gV2hlbiBhcHBsaWNhdGlvbiBjb25zdW1lcworICAgICAgICAgICAgLy8gbW9yZSB0aGFuIH4yLjUgR0Igb2YgbWVtb3J5LCBlbnRpcmUgc3lzdGVtIGZlZWxzIGJhZC4gU29tZXRpbWVzCisgICAgICAgICAgICAvLyBhcHBsaWNhdGlvbiBpcyBraWxsZWQgKGJ5IE9TPyksIHNvbWV0aW1lcyBzeXN0ZW0gc3RvcHMgCisgICAgICAgICAgICAvLyByZXNwb25kaW5nLi4uIEJ1dCB0aGlzIGVycm9yIG1lc3NhZ2UgbmV2ZXIgYXBwZWFycy4gLS1sbgorICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50U2V0RW52VmFyLCBuYW1lICksCisgICAgICAgICAgICAgICAgS01QX0hOVCggTm90RW5vdWdoTWVtb3J5ICksCisgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICk7CisgICAgICAgIH07IC8vIGlmCisgICAgI2VsaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgQk9PTCByYzsKKyAgICAgICAgaWYgKCAhIG92ZXJ3cml0ZSApIHsKKyAgICAgICAgICAgIHJjID0gR2V0RW52aXJvbm1lbnRWYXJpYWJsZSggbmFtZSwgTlVMTCwgMCApOworICAgICAgICAgICAgaWYgKCByYyApIHsKKyAgICAgICAgICAgICAgICAvLyBWYXJpYWJsZSBleGlzdHMsIGRvIG5vdCBvdmVyd3JpdGUuCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBpZiAoIGVycm9yICE9IEVSUk9SX0VOVlZBUl9OT1RfRk9VTkQgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRHZXRFbnZWYXIsIG5hbWUgKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgcmMgPSBTZXRFbnZpcm9ubWVudFZhcmlhYmxlKCBuYW1lLCB2YWx1ZSApOworICAgICAgICBpZiAoICEgcmMgKSB7CisgICAgICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50U2V0RW52VmFyLCBuYW1lICksCisgICAgICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAjZWxzZQorICAgICAgICAjZXJyb3IgVW5rbm93biBvciB1bnN1cHBvcnRlZCBPUy4KKyAgICAjZW5kaWYKKworfSAvLyBmdW5jIF9fa21wX2Vudl9zZXQKKworCisKK3ZvaWQKK19fa21wX2Vudl91bnNldCggY2hhciBjb25zdCAqIG5hbWUgKSB7CisKKyAgICAjaWYgS01QX09TX1VOSVgKKyAgICAgICAgdW5zZXRlbnYoIG5hbWUgKTsKKyAgICAjZWxpZiBLTVBfT1NfV0lORE9XUworICAgICAgICBCT09MIHJjID0gU2V0RW52aXJvbm1lbnRWYXJpYWJsZSggbmFtZSwgTlVMTCApOworICAgICAgICBpZiAoICEgcmMgKSB7CisgICAgICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50U2V0RW52VmFyLCBuYW1lICksCisgICAgICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAjZWxzZQorICAgICAgICAjZXJyb3IgVW5rbm93biBvciB1bnN1cHBvcnRlZCBPUy4KKyAgICAjZW5kaWYKKworfSAvLyBmdW5jIF9fa21wX2Vudl91bnNldAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qCisgICAgSW50ZWwgT3Blbk1QIFJUTCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgZW52aXJvbm1lbnQ6IGp1c3QgYSBzdHJpbmcgb2YgY2hhcmFjdGVycywgdmFyaWFibGVzCisgICAgYXJlIHNlcGFyYXRlZCB3aXRoIHZlcnRpY2FsIGJhcnMsIGUuIGcuOgorCisgICAgICAgICJLTVBfV0FSTklOR1M9MHxLTVBfQUZGSU5JVFk9Y29tcGFjdHwiCisKKyAgICBFbXB0eSB2YXJpYWJsZXMgYXJlIGFsbG93ZWQgYW5kIGlnbm9yZWQ6CisKKyAgICAgICAgInx8S01QX1dBUk5JTkdTPTF8fCIKKworKi8KKworc3RhdGljCit2b2lkCitfX19rbXBfZW52X2Jsa19wYXJzZV9zdHJpbmcoCisgICAga21wX2Vudl9ibGtfdCAqIGJsb2NrLCAgIC8vIE06IEVudiBibG9jayB0byBmaWxsLgorICAgIGNoYXIgY29uc3QgKiAgICBlbnYgICAgICAvLyBJOiBTdHJpbmcgdG8gcGFyc2UuCispIHsKKworICAgIGNoYXIgY29uc3QgY2hyX2RlbGltaXRlciAgID0gJ3wnOworICAgIGNoYXIgY29uc3Qgc3RyX2RlbGltaXRlcltdID0geyBjaHJfZGVsaW1pdGVyLCAwIH07CisKKyAgICBjaGFyICogICAgICAgICAgYnVsayAgICAgICA9IE5VTEw7CisgICAga21wX2Vudl92YXJfdCAqIHZhcnMgICAgICAgPSBOVUxMOworICAgIGludCAgICAgICAgICAgICBjb3VudCAgICAgID0gMDsgIC8vIE51bWJlciBvZiB1c2VkIGVsZW1lbnRzIGluIHZhcnMgYXJyYXkuCisgICAgaW50ICAgICAgICAgICAgIGRlbGltaXRlcnMgPSAwOyAgLy8gTnVtYmVyIG9mIGRlbGltaXRlcnMgaW4gaW5wdXQgc3RyaW5nLgorCisgICAgLy8gQ29weSBvcmlnaW5hbCBzdHJpbmcsIHdlIHdpbGwgbW9kaWZ5IHRoZSBjb3B5LgorICAgIGJ1bGsgPSBfX2ttcF9zdHJfZm9ybWF0KCAiJXMiLCBlbnYgKTsKKworICAgIC8vIExvb3AgdGhydSBhbGwgdGhlIHZhcnMgaW4gZW52aXJvbm1lbnQgYmxvY2suIENvdW50IGRlbGltaXRlcnMgKG1heGltdW0gbnVtYmVyIG9mIHZhcmlhYmxlcworICAgIC8vIGlzIG51bWJlciBvZiBkZWxpbWl0ZXJzIHBsdXMgb25lKS4KKyAgICB7CisgICAgICAgIGNoYXIgY29uc3QgKiBwdHIgPSBidWxrOworICAgICAgICBmb3IgKCA7IDsgKSB7CisgICAgICAgICAgICBwdHIgPSBzdHJjaHIoIHB0ciwgY2hyX2RlbGltaXRlciApOworICAgICAgICAgICAgaWYgKCBwdHIgPT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICArKyBkZWxpbWl0ZXJzOworICAgICAgICAgICAgcHRyICs9IDE7CisgICAgICAgIH07IC8vIGZvcmV2ZXIKKyAgICB9CisKKyAgICAvLyBBbGxvY2F0ZSB2YXJzIGFycmF5LgorICAgIHZhcnMgPSAoa21wX2Vudl92YXJfdCAqKSBhbGxvY2F0ZSggKCBkZWxpbWl0ZXJzICsgMSApICogc2l6ZW9mKCBrbXBfZW52X3Zhcl90ICkgKTsKKworICAgIC8vIExvb3AgdGhydSBhbGwgdGhlIHZhcmlhYmxlcy4KKyAgICB7CisgICAgICAgIGNoYXIgKiB2YXI7ICAgICAvLyBQb2ludGVyIHRvIHZhcmlhYmxlIChib3RoIG5hbWUgYW5kIHZhbHVlKS4KKyAgICAgICAgY2hhciAqIG5hbWU7ICAgIC8vIFBvaW50ZXIgdG8gbmFtZSBvZiB2YXJpYWJsZS4KKyAgICAgICAgY2hhciAqIHZhbHVlOyAgIC8vIFBvaW50ZXIgdG8gdmFsdWUuCisgICAgICAgIGNoYXIgKiBidWY7ICAgICAvLyBCdWZmZXIgZm9yIF9fa21wX3N0cl90b2tlbigpIGZ1bmN0aW9uLgorICAgICAgICB2YXIgPSBfX2ttcF9zdHJfdG9rZW4oIGJ1bGssIHN0cl9kZWxpbWl0ZXIsICYgYnVmICk7ICAgICAgLy8gR2V0IHRoZSBmaXJzdCB2YXIuCisgICAgICAgIHdoaWxlICggdmFyICE9IE5VTEwgKSB7CisgICAgICAgICAgICAvLyBTYXZlIGZvdW5kIHZhcmlhYmxlIGluIHZhcnMgYXJyYXkuCisgICAgICAgICAgICBfX2ttcF9zdHJfc3BsaXQoIHZhciwgJz0nLCAmIG5hbWUsICYgdmFsdWUgKTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGNvdW50IDwgZGVsaW1pdGVycyArIDEgKTsKKyAgICAgICAgICAgIHZhcnNbIGNvdW50IF0ubmFtZSAgPSBuYW1lOworICAgICAgICAgICAgdmFyc1sgY291bnQgXS52YWx1ZSA9IHZhbHVlOworICAgICAgICAgICAgKysgY291bnQ7CisgICAgICAgICAgICAvLyBHZXQgdGhlIG5leHQgdmFyLgorICAgICAgICAgICAgdmFyID0gX19rbXBfc3RyX3Rva2VuKCBOVUxMLCBzdHJfZGVsaW1pdGVyLCAmIGJ1ZiApOworICAgICAgICB9OyAvLyB3aGlsZQorICAgIH0KKworICAgIC8vIEZpbGwgb3V0IHJlc3VsdC4KKyAgICBibG9jay0+YnVsayAgPSBidWxrOworICAgIGJsb2NrLT52YXJzICA9IHZhcnM7CisgICAgYmxvY2stPmNvdW50ID0gY291bnQ7CisKK307IC8vIF9fX2ttcF9lbnZfYmxrX3BhcnNlX3N0cmluZworCisKKworLyoKKyAgICBXaW5kb3dzKiBPUyAoYWN0dWFsbHksIERPUykgZW52aXJvbm1lbnQgYmxvY2sgaXMgYSBwaWVjZSBvZiBtZW1vcnkgd2l0aCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuIEVhY2gKKyAgICB2YXJpYWJsZSBpcyB0ZXJtaW5hdGVkIHdpdGggemVybyBieXRlLCBlbnRpcmUgYmxvY2sgaXMgdGVybWluYXRlZCB3aXRoIG9uZSBleHRyYSB6ZXJvIGJ5dGUsIHNvCisgICAgd2UgaGF2ZSB0d28gemVybyBieXRlcyBhdCB0aGUgZW5kIG9mIGVudmlyb25tZW50IGJsb2NrLCBlLiBnLjoKKworICAgICAgICAiSE9NRT1DOlxcdXNlcnNcXGxldlx4MDBPUz1XaW5kb3dzX05UXHgwMFx4MDAiCisKKyAgICBJdCBpcyBub3QgY2xlYXIgaG93IGVtcHR5IGVudmlyb25tZW50IGlzIHJlcHJlc2VudGVkLiAiXHgwMFx4MDAiPworKi8KKworI2lmIEtNUF9PU19XSU5ET1dTCitzdGF0aWMKK3ZvaWQKK19fX2ttcF9lbnZfYmxrX3BhcnNlX3dpbmRvd3MoCisgICAga21wX2Vudl9ibGtfdCAqIGJsb2NrLCAgIC8vIE06IEVudiBibG9jayB0byBmaWxsLgorICAgIGNoYXIgY29uc3QgKiAgICBlbnYgICAgICAvLyBJOiBQb2ludGVyIHRvIFdpbmRvd3MqIE9TIChET1MpIGVudmlyb25tZW50IGJsb2NrLgorKSB7CisKKyAgICBjaGFyICogICAgICAgICAgYnVsayAgPSBOVUxMOworICAgIGttcF9lbnZfdmFyX3QgKiB2YXJzICA9IE5VTEw7CisgICAgaW50ICAgICAgICAgICAgIGNvdW50ID0gMDsgICAgIC8vIE51bWJlciBvZiB1c2VkIGVsZW1lbnRzIGluIHZhcnMgYXJyYXkuCisgICAgaW50ICAgICAgICAgICAgIHNpemUgID0gMDsgICAgIC8vIFNpemUgb2YgYnVsay4KKworICAgIGNoYXIgKiBuYW1lOyAgICAvLyBQb2ludGVyIHRvIG5hbWUgb2YgdmFyaWFibGUuCisgICAgY2hhciAqIHZhbHVlOyAgIC8vIFBvaW50ZXIgdG8gdmFsdWUuCisKKyAgICBpZiAoIGVudiAhPSBOVUxMICkgeworCisgICAgICAgIC8vIExvb3AgdGhydSBhbGwgdGhlIHZhcnMgaW4gZW52aXJvbm1lbnQgYmxvY2suIENvdW50IHZhcmlhYmxlcywgZmluZCBzaXplIG9mIGJsb2NrLgorICAgICAgICB7CisgICAgICAgICAgICBjaGFyIGNvbnN0ICogdmFyOyAgICAgLy8gUG9pbnRlciB0byBiZWdpbm5pbmcgb2YgdmFyLgorICAgICAgICAgICAgaW50ICAgICAgICAgIGxlbjsgICAgIC8vIExlbmd0aCBvZiB2YXJpYWJsZS4KKyAgICAgICAgICAgIGNvdW50ID0gMDsKKyAgICAgICAgICAgIHZhciA9IGVudjsgICAgICAgICAgICAvLyBUaGUgZmlyc3QgdmFyaWFibGUgc3RhcnRzIGFuZCBiZWdpbm5pbmcgb2YgZW52aXJvbm1lbnQgYmxvY2suCisgICAgICAgICAgICBsZW4gPSBLTVBfU1RSTEVOKCB2YXIgKTsKKyAgICAgICAgICAgIHdoaWxlICggbGVuICE9IDAgKSB7CisgICAgICAgICAgICAgICAgKysgY291bnQ7CisgICAgICAgICAgICAgICAgc2l6ZSA9IHNpemUgKyBsZW4gKyAxOworICAgICAgICAgICAgICAgIHZhciA9IHZhciArIGxlbiArIDE7IC8vIE1vdmUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IHZhcmlhYmxlLgorICAgICAgICAgICAgICAgIGxlbiA9IEtNUF9TVFJMRU4oIHZhciApOworICAgICAgICAgICAgfTsgLy8gd2hpbGUKKyAgICAgICAgICAgIHNpemUgPSBzaXplICsgMTsgICAgICAgICAvLyBUb3RhbCBzaXplIG9mIGVudiBibG9jaywgaW5jbHVkaW5nIHRlcm1pbmF0aW5nIHplcm8gYnl0ZS4KKyAgICAgICAgfQorCisgICAgICAgIC8vIENvcHkgb3JpZ2luYWwgYmxvY2sgdG8gYnVsaywgd2Ugd2lsbCBtb2RpZnkgYnVsaywgbm90IG9yaWdpbmFsIGJsb2NrLgorICAgICAgICBidWxrID0gKGNoYXIgKikgYWxsb2NhdGUoIHNpemUgKTsKKyAgICAgICAgS01QX01FTUNQWV9TKCBidWxrLCBzaXplLCBlbnYsIHNpemUgKTsKKyAgICAgICAgLy8gQWxsb2NhdGUgdmFycyBhcnJheS4KKyAgICAgICAgdmFycyA9IChrbXBfZW52X3Zhcl90ICopIGFsbG9jYXRlKCBjb3VudCAqIHNpemVvZigga21wX2Vudl92YXJfdCApICk7CisKKyAgICAgICAgLy8gTG9vcCB0aHJ1IGFsbCB0aGUgdmFycywgbm93IGluIGJ1bGsuCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIgKiB2YXI7ICAgICAvLyBQb2ludGVyIHRvIGJlZ2lubmluZyBvZiB2YXIuCisgICAgICAgICAgICBpbnQgICAgbGVuOyAgICAgLy8gTGVuZ3RoIG9mIHZhcmlhYmxlLgorICAgICAgICAgICAgY291bnQgPSAwOworICAgICAgICAgICAgdmFyID0gYnVsazsKKyAgICAgICAgICAgIGxlbiA9IEtNUF9TVFJMRU4oIHZhciApOworICAgICAgICAgICAgd2hpbGUgKCBsZW4gIT0gMCApIHsKKyAgICAgICAgICAgICAgICAvLyBTYXZlIHZhcmlhYmxlIGluIHZhcnMgYXJyYXkuCisgICAgICAgICAgICAgICAgX19rbXBfc3RyX3NwbGl0KCB2YXIsICc9JywgJiBuYW1lLCAmIHZhbHVlICk7CisgICAgICAgICAgICAgICAgdmFyc1sgY291bnQgXS5uYW1lICA9IG5hbWU7CisgICAgICAgICAgICAgICAgdmFyc1sgY291bnQgXS52YWx1ZSA9IHZhbHVlOworICAgICAgICAgICAgICAgICsrIGNvdW50OworICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbmV4dCB2YXIuCisgICAgICAgICAgICAgICAgdmFyID0gdmFyICsgbGVuICsgMTsKKyAgICAgICAgICAgICAgICBsZW4gPSBLTVBfU1RSTEVOKCB2YXIgKTsKKyAgICAgICAgICAgIH07IC8vIHdoaWxlCisgICAgICAgIH0KKworICAgIH07IC8vIGlmCisKKyAgICAvLyBGaWxsIG91dCByZXN1bHQuCisgICAgYmxvY2stPmJ1bGsgID0gYnVsazsKKyAgICBibG9jay0+dmFycyAgPSB2YXJzOworICAgIGJsb2NrLT5jb3VudCA9IGNvdW50OworCit9OyAvLyBfX19rbXBfZW52X2Jsa19wYXJzZV93aW5kb3dzCisjZW5kaWYKKworCisvKgorICAgIFVuaXggZW52aXJvbm1lbnQgYmxvY2sgaXMgYSBhcnJheSBvZiBwb2ludGVycyB0byB2YXJpYWJsZXMsIGxhc3QgcG9pbnRlciBpbiBhcnJheSBpcyBOVUxMOgorCisgICAgICAgIHsgIkhPTUU9L2hvbWUvbGV2IiwgIlRFUk09eHRlcm0iLCBOVUxMIH0KKyovCisKK3N0YXRpYwordm9pZAorX19fa21wX2Vudl9ibGtfcGFyc2VfdW5peCgKKyAgICBrbXBfZW52X2Jsa190ICogYmxvY2ssICAgLy8gTTogRW52IGJsb2NrIHRvIGZpbGwuCisgICAgY2hhciAqICogICAgICAgIGVudiAgICAgIC8vIEk6IFVuaXggZW52aXJvbm1lbnQgdG8gcGFyc2UuCispIHsKKworICAgIGNoYXIgKiAgICAgICAgICBidWxrICA9IE5VTEw7CisgICAga21wX2Vudl92YXJfdCAqIHZhcnMgID0gTlVMTDsKKyAgICBpbnQgICAgICAgICAgICAgY291bnQgPSAwOworICAgIGludCAgICAgICAgICAgICBzaXplICA9IDA7ICAgIC8vIFNpemUgb2YgYnVsay4KKworICAgIC8vIENvdW50IG51bWJlciBvZiB2YXJpYWJsZXMgYW5kIGxlbmd0aCBvZiByZXF1aXJlZCBidWxrLgorICAgIHsKKyAgICAgICAgY291bnQgPSAwOworICAgICAgICBzaXplICA9IDA7CisgICAgICAgIHdoaWxlICggZW52WyBjb3VudCBdICE9IE5VTEwgKSB7CisgICAgICAgICAgICBzaXplICs9IEtNUF9TVFJMRU4oIGVudlsgY291bnQgXSApICsgMTsKKyAgICAgICAgICAgICsrIGNvdW50OworICAgICAgICB9OyAvLyB3aGlsZQorICAgIH0KKworICAgIC8vIEFsbG9jYXRlIG1lbW9yeS4KKyAgICBidWxrID0gKGNoYXIgKikgYWxsb2NhdGUoIHNpemUgKTsKKyAgICB2YXJzID0gKGttcF9lbnZfdmFyX3QgKikgYWxsb2NhdGUoIGNvdW50ICogc2l6ZW9mKCBrbXBfZW52X3Zhcl90ICkgKTsKKworICAgIC8vIExvb3AgdGhydSBhbGwgdGhlIHZhcnMuCisgICAgeworICAgICAgICBjaGFyICogdmFyOyAgICAgLy8gUG9pbnRlciB0byBiZWdpbm5pbmcgb2YgdmFyLgorICAgICAgICBjaGFyICogbmFtZTsgICAgLy8gUG9pbnRlciB0byBuYW1lIG9mIHZhcmlhYmxlLgorICAgICAgICBjaGFyICogdmFsdWU7ICAgLy8gUG9pbnRlciB0byB2YWx1ZS4KKyAgICAgICAgaW50ICAgIGxlbjsgICAgIC8vIExlbmd0aCBvZiB2YXJpYWJsZS4KKyAgICAgICAgaW50ICAgIGk7CisgICAgICAgIHZhciA9IGJ1bGs7CisgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgY291bnQ7ICsrIGkgKSB7CisgICAgICAgICAgICAvLyBDb3B5IHZhcmlhYmxlIHRvIGJ1bGsuCisgICAgICAgICAgICBsZW4gPSBLTVBfU1RSTEVOKCBlbnZbIGkgXSApOworICAgICAgICAgICAgS01QX01FTUNQWV9TKCB2YXIsIHNpemUsIGVudlsgaSBdLCBsZW4gKyAxICk7CisgICAgICAgICAgICAvLyBTYXZlIGZvdW5kIHZhcmlhYmxlIGluIHZhcnMgYXJyYXkuCisgICAgICAgICAgICBfX2ttcF9zdHJfc3BsaXQoIHZhciwgJz0nLCAmIG5hbWUsICYgdmFsdWUgKTsKKyAgICAgICAgICAgIHZhcnNbIGkgXS5uYW1lICA9IG5hbWU7CisgICAgICAgICAgICB2YXJzWyBpIF0udmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgICAgIC8vIE1vdmUgcG9pbnRlci4KKyAgICAgICAgICAgIHZhciArPSBsZW4gKyAxOworICAgICAgICB9OyAvLyBmb3IKKyAgICB9CisKKyAgICAvLyBGaWxsIG91dCByZXN1bHQuCisgICAgYmxvY2stPmJ1bGsgID0gYnVsazsKKyAgICBibG9jay0+dmFycyAgPSB2YXJzOworICAgIGJsb2NrLT5jb3VudCA9IGNvdW50OworCit9OyAvLyBfX19rbXBfZW52X2Jsa19wYXJzZV91bml4CisKKworCit2b2lkCitfX2ttcF9lbnZfYmxrX2luaXQoCisgICAga21wX2Vudl9ibGtfdCAqIGJsb2NrLCAgLy8gTTogQmxvY2sgdG8gaW5pdGlhbGl6ZS4KKyAgICBjaGFyIGNvbnN0ICogICAgYnVsayAgICAvLyBJOiBJbml0aWFsaXphdGlvbiBzdHJpbmcsIG9yIE5VTEwuCispIHsKKworICAgIGlmICggYnVsayAhPSBOVUxMICkgeworICAgICAgICBfX19rbXBfZW52X2Jsa19wYXJzZV9zdHJpbmcoIGJsb2NrLCBidWxrICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgI2lmIEtNUF9PU19VTklYCisgICAgICAgICAgICBfX19rbXBfZW52X2Jsa19wYXJzZV91bml4KCBibG9jaywgZW52aXJvbiApOworICAgICAgICAjZWxpZiBLTVBfT1NfV0lORE9XUworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoYXIgKiBtZW0gPSBHZXRFbnZpcm9ubWVudFN0cmluZ3MoKTsKKyAgICAgICAgICAgICAgICBpZiAoIG1lbSA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50R2V0RW52aXJvbm1lbnQgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAgICAgX19fa21wX2Vudl9ibGtfcGFyc2Vfd2luZG93cyggYmxvY2ssIG1lbSApOworICAgICAgICAgICAgICAgIEZyZWVFbnZpcm9ubWVudFN0cmluZ3MoIG1lbSApOworICAgICAgICAgICAgfQorICAgICAgICAjZWxzZQorICAgICAgICAgICAgI2Vycm9yIFVua25vd24gb3IgdW5zdXBwb3J0ZWQgT1MuCisgICAgICAgICNlbmRpZgorICAgIH07IC8vIGlmCisKK30gLy8gX19rbXBfZW52X2Jsa19pbml0CisKKworCitzdGF0aWMKK2ludAorX19fa21wX2Vudl92YXJfY21wKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbXBhcmlzb24gZnVuY3Rpb24gZm9yIHFzb3J0KCkuCisgICAga21wX2Vudl92YXJfdCBjb25zdCAqIGxocywKKyAgICBrbXBfZW52X3Zhcl90IGNvbnN0ICogcmhzCispIHsKKyAgICByZXR1cm4gc3RyY21wKCBsaHMtPm5hbWUsIHJocy0+bmFtZSApOworfQorCit2b2lkCitfX2ttcF9lbnZfYmxrX3NvcnQoCisgICAga21wX2Vudl9ibGtfdCAqIGJsb2NrICAvLyBNOiBCbG9jayBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gc29ydC4KKykgeworCisgICAgcXNvcnQoCisgICAgICAgICh2b2lkICopIGJsb2NrLT52YXJzLAorICAgICAgICBibG9jay0+Y291bnQsCisgICAgICAgIHNpemVvZigga21wX2Vudl92YXJfdCApLAorICAgICAgICAoIGludCAoICogKSggdm9pZCBjb25zdCAqLCB2b2lkIGNvbnN0ICogKSApICYgX19fa21wX2Vudl92YXJfY21wCisgICAgKTsKKworfSAvLyBfX2ttcF9lbnZfYmxvY2tfc29ydAorCisKKwordm9pZAorX19rbXBfZW52X2Jsa19mcmVlKAorICAgIGttcF9lbnZfYmxrX3QgKiBibG9jayAgLy8gTTogQmxvY2sgb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIGZyZWUuCispIHsKKworICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSBibG9jay0+dmFycyApOworICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSBibG9jay0+YnVsayApOworCisgICAgYmxvY2stPmNvdW50ID0gMDsKKyAgICBibG9jay0+dmFycyAgPSBOVUxMOworICAgIGJsb2NrLT5idWxrICA9IE5VTEw7CisKK30gLy8gX19rbXBfZW52X2Jsa19mcmVlCisKKworCitjaGFyIGNvbnN0ICogICAgICAgICAgICAgICAvLyBSOiBWYWx1ZSBvZiB2YXJpYWJsZSBvciBOVUxMIGlmIHZhcmlhYmxlIGRvZXMgbm90IGV4aXN0LgorX19rbXBfZW52X2Jsa192YXIoCisgICAga21wX2Vudl9ibGtfdCAqIGJsb2NrLCAvLyBJOiBCbG9jayBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCisgICAgY2hhciBjb25zdCAqICAgIG5hbWUgICAvLyBJOiBOYW1lIG9mIHZhcmlhYmxlIHRvIGZpbmQuCispIHsKKworICAgIGludCBpOworICAgIGZvciAoIGkgPSAwOyBpIDwgYmxvY2stPmNvdW50OyArKyBpICkgeworICAgICAgICBpZiAoIHN0cmNtcCggYmxvY2stPnZhcnNbIGkgXS5uYW1lLCBuYW1lICkgPT0gMCApIHsKKyAgICAgICAgICAgIHJldHVybiBibG9jay0+dmFyc1sgaSBdLnZhbHVlOworICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGZvcgorICAgIHJldHVybiBOVUxMOworCit9IC8vIF9fa21wX2Vudl9ibG9ja192YXIKKworCisvLyBlbmQgb2YgZmlsZSAvLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2Vudmlyb25tZW50LmggYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZW52aXJvbm1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDNiNTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2Vudmlyb25tZW50LmgKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIGttcF9lbnZpcm9ubWVudC5oIC0tIEhhbmRsZSBlbnZpcm9ubWVudCB2YXJvaWFibGVzIE9TLWluZGVwZW5kZW50bHkuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX0VOVklST05NRU5UX0gKKyNkZWZpbmUgS01QX0VOVklST05NRU5UX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvLyBSZXR1cm4gYSBjb3B5IG9mIHRoZSB2YWx1ZSBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciBOVUxMIGlmIHRoZSB2YXJpYWJsZSBkb2VzIG5vdCBleGlzdC4KKy8vICpOb3RlKjogUmV0dXJuZWQgcG9pbnRlZCAqbXVzdCogYmUgZnJlZWQgYWZ0ZXIgdXNlIHdpdGggX19rbXBfZW52X2ZyZWUoKS4KK2NoYXIgKiBfX2ttcF9lbnZfZ2V0KCBjaGFyIGNvbnN0ICogbmFtZSApOwordm9pZCAgIF9fa21wX2Vudl9mcmVlKCBjaGFyIGNvbnN0ICogKiB2YWx1ZSApOworCisvLyBSZXR1cm4gMSBpZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgZXhpc3RzIG9yIDAgaWYgZG9lcyBub3QgZXhpc3QuCitpbnQgX19rbXBfZW52X2V4aXN0cyggY2hhciBjb25zdCAqIG5hbWUgKTsKKworLy8gU2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS4KK3ZvaWQgX19rbXBfZW52X3NldCggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgaW50IG92ZXJ3cml0ZSApOworCisvLyBVbnNldCAocmVtb3ZlKSBlbnZpcm9ubWVudCB2YXJpYWJsZS4KK3ZvaWQgX19rbXBfZW52X3Vuc2V0KCBjaGFyIGNvbnN0ICogbmFtZSApOworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBXb3JraW5nIHdpdGggZW52aXJvbm1lbnQgYmxvY2tzLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKgorICAgIGttcF9lbnZfYmxrX3QgaXMgcmVhZC1vbmx5IGNvbGxlY3Rpb24gb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzIChvciBlbnZpcm9ubWVudC1saWtlKS4gVXNhZ2U6CisKKyAgICAgICAga21wX2Vudl9ibGtfdCBibG9jazsKKyAgICAgICAgX19rbXBfZW52X2Jsa19pbml0KCAmIGJsb2NrLCBOVUxMICk7IC8vIEluaXRpYWxpemUgYmxvY2sgZnJvbSBwcm9jZXNzIGVudmlyb25tZW50LgorICAgICAgICAvLyBvcgorICAgICAgICBfX2ttcF9lbnZfYmxrX2luaXQoICYgYmxvY2ssICJLTVBfV0FSTklORz0xfEtNUF9BRkZJTklUWT1ub25lIiApOyAvLyBmcm9tIHN0cmluZy4KKyAgICAgICAgX19rbXBfZW52X2Jsa19zb3J0KCAmIGJsb2NrICk7IC8vIE9wdGlvbmFsbHksIHNvcnQgbGlzdC4KKyAgICAgICAgZm9yICggaSA9IDA7IGkgPCBibG9jay5jb3VudDsgKysgaSApIHsKKyAgICAgICAgICAgIC8vIFByb2Nlc3MgYmxvY2sudmFyc1sgaSBdLm5hbWUgYW5kIGJsb2NrLnZhcnNbIGkgXS52YWx1ZS4uLgorICAgICAgICB9OyAvLyBmb3IgaQorICAgICAgICBfX2ttcF9lbnZfYmxvY2tfZnJlZSggJiBibG9jayApOworKi8KKworc3RydWN0IF9fa21wX2Vudl92YXIgeworICAgIGNoYXIgY29uc3QgKiBuYW1lOworICAgIGNoYXIgY29uc3QgKiB2YWx1ZTsKK307Cit0eXBlZGVmIHN0cnVjdCBfX2ttcF9lbnZfdmFyIGttcF9lbnZfdmFyX3Q7CisKK3N0cnVjdCBfX2ttcF9lbnZfYmxrIHsKKyAgICBjaGFyIGNvbnN0ICogICAgICAgICAgYnVsazsKKyAgICBrbXBfZW52X3Zhcl90IGNvbnN0ICogdmFyczsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgY291bnQ7Cit9OwordHlwZWRlZiBzdHJ1Y3QgX19rbXBfZW52X2JsayBrbXBfZW52X2Jsa190OworCit2b2lkICAgICAgICAgX19rbXBfZW52X2Jsa19pbml0KCBrbXBfZW52X2Jsa190ICogYmxvY2ssIGNoYXIgY29uc3QgKiBidWxrICk7Cit2b2lkICAgICAgICAgX19rbXBfZW52X2Jsa19mcmVlKCBrbXBfZW52X2Jsa190ICogYmxvY2sgKTsKK3ZvaWQgICAgICAgICBfX2ttcF9lbnZfYmxrX3NvcnQoIGttcF9lbnZfYmxrX3QgKiBibG9jayApOworY2hhciBjb25zdCAqIF9fa21wX2Vudl9ibGtfdmFyKCAga21wX2Vudl9ibGtfdCAqIGJsb2NrLCBjaGFyIGNvbnN0ICogbmFtZSApOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLy8gS01QX0VOVklST05NRU5UX0gKKworLy8gZW5kIG9mIGZpbGUgLy8KKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2Vycm9yLmMgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZXJyb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODY2ZGY1Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2Vycm9yLmMKQEAgLTAsMCArMSw1MjMgQEAKKy8qCisgKiBrbXBfZXJyb3IuYyAtLSBLUFRTIGZ1bmN0aW9ucyBmb3IgZXJyb3IgY2hlY2tpbmcgYXQgcnVudGltZQorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKyNpbmNsdWRlICJrbXBfc3RyLmgiCisjaW5jbHVkZSAia21wX2Vycm9yLmgiCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgTUlOX1NUQUNLICAgICAgIDEwMAorCisKK3N0YXRpYyBjaGFyIGNvbnN0ICogY29uc190ZXh0X2NbXSA9IHsKKyAgICAiKG5vbmUpIiwKKyAgICAiXCJwYXJhbGxlbFwiIiwKKyAgICAid29yay1zaGFyaW5nIiwgICAgICAgICAgICAgLyogdGhpcyBpcyBub3QgY2FsbGVkICJmb3IiIGJlY2F1c2Ugb2YgbG93ZXJpbmcgb2YgInNlY3Rpb25zIiBwcmFnbWFzICovCisgICAgIlwib3JkZXJlZFwiIHdvcmstc2hhcmluZyIsIC8qIHRoaXMgaXMgbm90IGNhbGxlZCAiZm9yIG9yZGVyZWQiIGJlY2F1c2Ugb2YgbG93ZXJpbmcgb2YgInNlY3Rpb25zIiBwcmFnbWFzICovCisgICAgIlwic2VjdGlvbnNcIiIsCisgICAgIndvcmstc2hhcmluZyIsICAgICAgICAgICAgIC8qIHRoaXMgaXMgbm90IGNhbGxlZCAic2luZ2xlIiBiZWNhdXNlIG9mIGxvd2VyaW5nIG9mICJzZWN0aW9ucyIgcHJhZ21hcyAqLworICAgICJcInRhc2txXCIiLAorICAgICJcInRhc2txXCIiLAorICAgICJcInRhc2txIG9yZGVyZWRcIiIsCisgICAgIlwiY3JpdGljYWxcIiIsCisgICAgIlwib3JkZXJlZFwiIiwgICAgICAgICAgICAgIC8qIGluIFBBUkFMTEVMICovCisgICAgIlwib3JkZXJlZFwiIiwgICAgICAgICAgICAgIC8qIGluIFBETyAqLworICAgICJcIm9yZGVyZWRcIiIsICAgICAgICAgICAgICAvKiBpbiBUQVNLUSAqLworICAgICJcIm1hc3RlclwiIiwKKyAgICAiXCJyZWR1Y2VcIiIsCisgICAgIlwiYmFycmllclwiIgorfTsKKworI2RlZmluZSBnZXRfc3JjKCBpZGVudCApICAgKCAoaWRlbnQpID09IE5VTEwgPyBOVUxMIDogKGlkZW50KS0+cHNvdXJjZSApCisKKyNkZWZpbmUgUFVTSF9NU0coIGN0LCBpZGVudCApIFwKKyAgICAiXHRwdXNoaW5nIG9uIHN0YWNrOiAlcyAoJXMpXG4iLCBjb25zX3RleHRfY1sgKGN0KSBdLCBnZXRfc3JjKCAoaWRlbnQpICkKKyNkZWZpbmUgUE9QX01TRyggcCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiXHRwb3BwaW5nIG9mZiBzdGFjazogJXMgKCVzKVxuIiwgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zX3RleHRfY1sgKHApLT5zdGFja19kYXRhWyB0b3MgXS50eXBlIF0sICAgICAgIFwKKyAgICBnZXRfc3JjKCAocCktPnN0YWNrX2RhdGFbIHRvcyBdLmlkZW50ICkKKworc3RhdGljIGludCBjb25zdCBjb25zX3RleHRfY19udW0gICAgPSBzaXplb2YoIGNvbnNfdGV4dF9jICAgICkgLyBzaXplb2YoIGNoYXIgY29uc3QgKiApOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLSBTVEFSVCBPRiBTVEFUSUMgTE9DQUwgUk9VVElORVMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkCitfX2ttcF9jaGVja19udWxsX2Z1bmMoIHZvaWQgKQoreworICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KK30KKworc3RhdGljIHZvaWQKK19fa21wX2V4cGFuZF9jb25zX3N0YWNrKCBpbnQgZ3RpZCwgc3RydWN0IGNvbnNfaGVhZGVyICpwICkKK3sKKyAgICBpbnQgICAgaTsKKyAgICBzdHJ1Y3QgY29uc19kYXRhICpkOworCisgICAgLyogVE9ETyBmb3IgbW9uaXRvciBwZXJoYXBzPyAqLworICAgIGlmIChndGlkIDwgMCkKKyAgICAgICAgX19rbXBfY2hlY2tfbnVsbF9mdW5jKCk7CisKKyAgICBLRV9UUkFDRSggMTAsICgiZXhwYW5kIGNvbnNfc3RhY2sgKCVkICVkKVxuIiwgZ3RpZCwgX19rbXBfZ2V0X2d0aWQoKSApICk7CisKKyAgICBkID0gcC0+c3RhY2tfZGF0YTsKKworICAgIHAtPnN0YWNrX3NpemUgPSAocC0+c3RhY2tfc2l6ZSAqIDIpICsgMTAwOworCisgICAgLyogVE9ETyBmcmVlIHRoZSBvbGQgZGF0YSAqLworICAgIHAtPnN0YWNrX2RhdGEgPSAoc3RydWN0IGNvbnNfZGF0YSAqKSBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKCBzdHJ1Y3QgY29uc19kYXRhICkgKiAocC0+c3RhY2tfc2l6ZSsxKSApOworCisgICAgZm9yIChpID0gcC0+c3RhY2tfdG9wOyBpID49IDA7IC0taSkKKyAgICAgICAgcC0+c3RhY2tfZGF0YVtpXSA9IGRbaV07CisKKyAgICAvKiBOT1RFOiB3ZSBkbyBub3QgZnJlZSB0aGUgb2xkIHN0YWNrX2RhdGEgKi8KK30KKworLy8gTk9URTogRnVuY3Rpb24gcmV0dXJucyBhbGxvY2F0ZWQgbWVtb3J5LCBjYWxsZXIgbXVzdCBmcmVlIGl0IQorc3RhdGljIGNoYXIgY29uc3QgKgorX19rbXBfcHJhZ21hKAorICAgIGludCAgICAgICAgICAgICAgY3QsCisgICAgaWRlbnRfdCBjb25zdCAqICBpZGVudAorKSB7CisgICAgY2hhciBjb25zdCAqIGNvbnMgPSBOVUxMOyAgLy8gQ29uc3RydWN0IG5hbWUuCisgICAgY2hhciAqIGZpbGUgPSBOVUxMOyAgLy8gRmlsZSBuYW1lLgorICAgIGNoYXIgKiBmdW5jID0gTlVMTDsgIC8vIEZ1bmN0aW9uIChyb3V0aW5lKSBuYW1lLgorICAgIGNoYXIgKiBsaW5lID0gTlVMTDsgIC8vIExpbmUgbnVtYmVyLgorICAgIGttcF9zdHJfYnVmX3QgYnVmZmVyOworICAgIGttcF9tc2dfdCAgICAgcHJnbTsKKyAgICBfX2ttcF9zdHJfYnVmX2luaXQoICYgYnVmZmVyICk7CisgICAgaWYgKCAwIDwgY3QgJiYgY3QgPCBjb25zX3RleHRfY19udW0gKSB7CisgICAgICAgIGNvbnMgPSBjb25zX3RleHRfY1sgY3QgXTsKKyAgICB9IGVsc2UgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAwICk7CisgICAgfTsKKyAgICBpZiAoIGlkZW50ICE9IE5VTEwgJiYgaWRlbnQtPnBzb3VyY2UgIT0gTlVMTCApIHsKKyAgICAgICAgY2hhciAqIHRhaWwgPSBOVUxMOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIiVzIiwgaWRlbnQtPnBzb3VyY2UgKTsgLy8gQ29weSBzb3VyY2UgdG8gYnVmZmVyLgorICAgICAgICAvLyBTcGxpdCBzdHJpbmcgaW4gYnVmZmVyIHRvIGZpbGUsIGZ1bmMsIGFuZCBsaW5lLgorICAgICAgICB0YWlsID0gYnVmZmVyLnN0cjsKKyAgICAgICAgX19rbXBfc3RyX3NwbGl0KCB0YWlsLCAnOycsIE5VTEwsICAgJiB0YWlsICk7CisgICAgICAgIF9fa21wX3N0cl9zcGxpdCggdGFpbCwgJzsnLCAmIGZpbGUsICYgdGFpbCApOworICAgICAgICBfX2ttcF9zdHJfc3BsaXQoIHRhaWwsICc7JywgJiBmdW5jLCAmIHRhaWwgKTsKKyAgICAgICAgX19rbXBfc3RyX3NwbGl0KCB0YWlsLCAnOycsICYgbGluZSwgJiB0YWlsICk7CisgICAgfTsgLy8gaWYKKyAgICBwcmdtID0gX19rbXBfbXNnX2Zvcm1hdCgga21wX2kxOG5fZm10X1ByYWdtYSwgY29ucywgZmlsZSwgZnVuYywgbGluZSApOworICAgIF9fa21wX3N0cl9idWZfZnJlZSggJiBidWZmZXIgKTsKKyAgICByZXR1cm4gcHJnbS5zdHI7Cit9IC8vIF9fa21wX3ByYWdtYQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tIEVORCBPRiBTVEFUSUMgTE9DQUwgUk9VVElORVMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwordm9pZAorX19rbXBfZXJyb3JfY29uc3RydWN0KAorICAgIGttcF9pMThuX2lkX3QgICAgaWQsICAgICAvLyBNZXNzYWdlIGlkZW50aWZpZXIuCisgICAgZW51bSBjb25zX3R5cGUgICBjdCwgICAgIC8vIENvbnN0cnVjdCB0eXBlLgorICAgIGlkZW50X3QgY29uc3QgKiAgaWRlbnQgICAvLyBDb25zdHJ1Y3QgaWRlbnQuCispIHsKKyAgICBjaGFyIGNvbnN0ICogY29uc3RydWN0ID0gX19rbXBfcHJhZ21hKCBjdCwgaWRlbnQgKTsKKyAgICBfX2ttcF9tc2coIGttcF9tc19mYXRhbCwgX19rbXBfbXNnX2Zvcm1hdCggaWQsIGNvbnN0cnVjdCApLCBfX2ttcF9tc2dfbnVsbCApOworICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSBjb25zdHJ1Y3QgKTsKK30KKwordm9pZAorX19rbXBfZXJyb3JfY29uc3RydWN0MigKKyAgICBrbXBfaTE4bl9pZF90ICAgICAgICAgICAgaWQsICAgICAvLyBNZXNzYWdlIGlkZW50aWZpZXIuCisgICAgZW51bSBjb25zX3R5cGUgICAgICAgICAgIGN0LCAgICAgLy8gRmlyc3QgY29uc3RydWN0IHR5cGUuCisgICAgaWRlbnRfdCBjb25zdCAqICAgICAgICAgIGlkZW50LCAgLy8gRmlyc3QgY29uc3RydWN0IGlkZW50LgorICAgIHN0cnVjdCBjb25zX2RhdGEgY29uc3QgKiBjb25zICAgIC8vIFNlY29uZCBjb25zdHJ1Y3QuCispIHsKKyAgICBjaGFyIGNvbnN0ICogY29uc3RydWN0MSA9IF9fa21wX3ByYWdtYSggY3QsIGlkZW50ICk7CisgICAgY2hhciBjb25zdCAqIGNvbnN0cnVjdDIgPSBfX2ttcF9wcmFnbWEoIGNvbnMtPnR5cGUsIGNvbnMtPmlkZW50ICk7CisgICAgX19rbXBfbXNnKCBrbXBfbXNfZmF0YWwsIF9fa21wX21zZ19mb3JtYXQoIGlkLCBjb25zdHJ1Y3QxLCBjb25zdHJ1Y3QyICksIF9fa21wX21zZ19udWxsICk7CisgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopIGNvbnN0cnVjdDEgKTsKKyAgICBLTVBfSU5URVJOQUxfRlJFRSggKHZvaWQgKikgY29uc3RydWN0MiApOworfQorCisKK3N0cnVjdCBjb25zX2hlYWRlciAqCitfX2ttcF9hbGxvY2F0ZV9jb25zX3N0YWNrKCBpbnQgZ3RpZCApCit7CisgICAgc3RydWN0IGNvbnNfaGVhZGVyICpwOworCisgICAgLyogVE9ETyBmb3IgbW9uaXRvciBwZXJoYXBzPyAqLworICAgIGlmICggZ3RpZCA8IDAgKSB7CisgICAgICAgIF9fa21wX2NoZWNrX251bGxfZnVuYygpOworICAgIH07IC8vIGlmCisgICAgS0VfVFJBQ0UoIDEwLCAoImFsbG9jYXRlIGNvbnNfc3RhY2sgKCVkKVxuIiwgZ3RpZCApICk7CisgICAgcCA9IChzdHJ1Y3QgY29uc19oZWFkZXIgKikgX19rbXBfYWxsb2NhdGUoIHNpemVvZiggc3RydWN0IGNvbnNfaGVhZGVyICkgKTsKKyAgICBwLT5wX3RvcCA9IHAtPndfdG9wID0gcC0+c190b3AgPSAwOworICAgIHAtPnN0YWNrX2RhdGEgPSAoc3RydWN0IGNvbnNfZGF0YSAqKSBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKCBzdHJ1Y3QgY29uc19kYXRhICkgKiAoTUlOX1NUQUNLKzEpICk7CisgICAgcC0+c3RhY2tfc2l6ZSA9IE1JTl9TVEFDSzsKKyAgICBwLT5zdGFja190b3AgID0gMDsKKyAgICBwLT5zdGFja19kYXRhWyAwIF0udHlwZSA9IGN0X25vbmU7CisgICAgcC0+c3RhY2tfZGF0YVsgMCBdLnByZXYgPSAwOworICAgIHAtPnN0YWNrX2RhdGFbIDAgXS5pZGVudCA9IE5VTEw7CisgICAgcmV0dXJuIHA7Cit9CisKK3ZvaWQKK19fa21wX2ZyZWVfY29uc19zdGFjayggdm9pZCAqIHB0ciApIHsKKyAgICBzdHJ1Y3QgY29uc19oZWFkZXIgKiBwID0gKHN0cnVjdCBjb25zX2hlYWRlciAqKSBwdHI7CisgICAgaWYgKCBwICE9IE5VTEwgKSB7CisgICAgICAgIGlmICggcC0+c3RhY2tfZGF0YSAhPSBOVUxMICkgeworICAgICAgICAgICAgX19rbXBfZnJlZSggcC0+c3RhY2tfZGF0YSApOworICAgICAgICAgICAgcC0+c3RhY2tfZGF0YSA9IE5VTEw7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIF9fa21wX2ZyZWUoIHAgKTsKKyAgICB9OyAvLyBpZgorfQorCisKKyNpZiBLTVBfREVCVUcKK3N0YXRpYyB2b2lkCitkdW1wX2NvbnNfc3RhY2soIGludCBndGlkLCBzdHJ1Y3QgY29uc19oZWFkZXIgKiBwICkgeworICAgIGludCBpOworICAgIGludCB0b3MgPSBwLT5zdGFja190b3A7CisgICAga21wX3N0cl9idWZfdCBidWZmZXI7CisgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmIGJ1ZmZlciApOworICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLVxuIiApOworICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiQmVnaW4gY29uc3RydWN0IHN0YWNrIHdpdGggJWQgaXRlbXMgZm9yIHRocmVhZCAlZFxuIiwgdG9zLCBndGlkICk7CisgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIgICAgIHN0YWNrX3RvcD0lZCB7IFA9JWQsIFc9JWQsIFM9JWQgfVxuIiwgdG9zLCBwLT5wX3RvcCwgcC0+d190b3AsIHAtPnNfdG9wICk7CisgICAgZm9yICggaSA9IHRvczsgaSA+IDA7IGktLSApIHsKKyAgICAgICAgc3RydWN0IGNvbnNfZGF0YSAqIGMgPSAmICggcC0+c3RhY2tfZGF0YVsgaSBdICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiICAgICAgICBzdGFja19kYXRhWyUyZF0gPSB7ICVzICglcykgJWQgJXAgfVxuIiwgaSwgY29uc190ZXh0X2NbIGMtPnR5cGUgXSwgZ2V0X3NyYyggYy0+aWRlbnQgKSwgYy0+cHJldiwgYy0+bmFtZSApOworICAgIH07IC8vIGZvciBpCisgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICJFbmQgY29uc3RydWN0IHN0YWNrIGZvciB0aHJlYWQgJWRcbiIsIGd0aWQgKTsKKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIistKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy1cbiIgKTsKKyAgICBfX2ttcF9kZWJ1Z19wcmludGYoICIlcyIsIGJ1ZmZlci5zdHIgKTsKKyAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoICYgYnVmZmVyICk7Cit9CisjZW5kaWYKKwordm9pZAorX19rbXBfcHVzaF9wYXJhbGxlbCggaW50IGd0aWQsIGlkZW50X3QgY29uc3QgKiBpZGVudCApCit7CisgICAgaW50IHRvczsKKyAgICBzdHJ1Y3QgY29uc19oZWFkZXIgKnAgPSBfX2ttcF90aHJlYWRzWyBndGlkIF0tPnRoLnRoX2NvbnM7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90aHJlYWRzWyBndGlkIF0tPiB0aC50aF9jb25zICk7CisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wX3B1c2hfcGFyYWxsZWwgKCVkICVkKVxuIiwgZ3RpZCwgX19rbXBfZ2V0X2d0aWQoKSApICk7CisgICAgS0VfVFJBQ0UoIDEwMCwgKCBQVVNIX01TRyggY3RfcGFyYWxsZWwsIGlkZW50ICkgKSApOworICAgIGlmICggcC0+c3RhY2tfdG9wID49IHAtPnN0YWNrX3NpemUgKSB7CisgICAgICAgIF9fa21wX2V4cGFuZF9jb25zX3N0YWNrKCBndGlkLCBwICk7CisgICAgfTsgLy8gaWYKKyAgICB0b3MgPSArK3AtPnN0YWNrX3RvcDsKKyAgICBwLT5zdGFja19kYXRhWyB0b3MgXS50eXBlID0gY3RfcGFyYWxsZWw7CisgICAgcC0+c3RhY2tfZGF0YVsgdG9zIF0ucHJldiA9IHAtPnBfdG9wOworICAgIHAtPnN0YWNrX2RhdGFbIHRvcyBdLmlkZW50ID0gaWRlbnQ7CisgICAgcC0+c3RhY2tfZGF0YVsgdG9zIF0ubmFtZSA9IE5VTEw7CisgICAgcC0+cF90b3AgPSB0b3M7CisgICAgS0VfRFVNUCggMTAwMCwgZHVtcF9jb25zX3N0YWNrKCBndGlkLCBwICkgKTsKK30KKwordm9pZAorX19rbXBfY2hlY2tfd29ya3NoYXJlKCBpbnQgZ3RpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKiBpZGVudCApCit7CisgICAgc3RydWN0IGNvbnNfaGVhZGVyICpwID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF9jb25zOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT4gdGgudGhfY29ucyApOworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcF9jaGVja193b3Jrc2hhcmUgKCVkICVkKVxuIiwgZ3RpZCwgX19rbXBfZ2V0X2d0aWQoKSApICk7CisKKworICAgIGlmICggcC0+c3RhY2tfdG9wID49IHAtPnN0YWNrX3NpemUgKSB7CisgICAgICAgIF9fa21wX2V4cGFuZF9jb25zX3N0YWNrKCBndGlkLCBwICk7CisgICAgfTsgLy8gaWYKKyAgICBpZiAoIHAtPndfdG9wID4gcC0+cF90b3AgJiYKKyAgICAgICAgIShJU19DT05TX1RZUEVfVEFTS1EocC0+c3RhY2tfZGF0YVsgcC0+d190b3AgXS50eXBlKSAmJiBJU19DT05TX1RZUEVfVEFTS1EoY3QpKSkgeworICAgICAgICAvLyBXZSBhcmUgYWxyZWFkeSBpbiBhIFdPUktTSEFSRSBjb25zdHJ1Y3QgZm9yIHRoaXMgUEFSQUxMRUwgcmVnaW9uLgorICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QyKCBrbXBfaTE4bl9tc2dfQ25zSW52YWxpZE5lc3RpbmcsIGN0LCBpZGVudCwgJiBwLT5zdGFja19kYXRhWyBwLT53X3RvcCBdICk7CisgICAgfTsgLy8gaWYKKyAgICBpZiAoIHAtPnNfdG9wID4gcC0+cF90b3AgKSB7CisgICAgICAgIC8vIFdlIGFyZSBhbHJlYWR5IGluIGEgU1lOQyBjb25zdHJ1Y3QgZm9yIHRoaXMgUEFSQUxMRUwgcmVnaW9uLgorICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QyKCBrbXBfaTE4bl9tc2dfQ25zSW52YWxpZE5lc3RpbmcsIGN0LCBpZGVudCwgJiBwLT5zdGFja19kYXRhWyBwLT5zX3RvcCBdICk7CisgICAgfTsgLy8gaWYKK30KKwordm9pZAorX19rbXBfcHVzaF93b3Jrc2hhcmUoIGludCBndGlkLCBlbnVtIGNvbnNfdHlwZSBjdCwgaWRlbnRfdCBjb25zdCAqIGlkZW50ICkKK3sKKyAgICBpbnQgICAgICAgICB0b3M7CisgICAgc3RydWN0IGNvbnNfaGVhZGVyICpwID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF9jb25zOworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcF9wdXNoX3dvcmtzaGFyZSAoJWQgJWQpXG4iLCBndGlkLCBfX2ttcF9nZXRfZ3RpZCgpICkgKTsKKyAgICBfX2ttcF9jaGVja193b3Jrc2hhcmUoIGd0aWQsIGN0LCBpZGVudCApOworICAgIEtFX1RSQUNFKCAxMDAsICggUFVTSF9NU0coIGN0LCBpZGVudCApICkgKTsKKyAgICB0b3MgPSArK3AtPnN0YWNrX3RvcDsKKyAgICBwLT5zdGFja19kYXRhWyB0b3MgXS50eXBlID0gY3Q7CisgICAgcC0+c3RhY2tfZGF0YVsgdG9zIF0ucHJldiA9IHAtPndfdG9wOworICAgIHAtPnN0YWNrX2RhdGFbIHRvcyBdLmlkZW50ID0gaWRlbnQ7CisgICAgcC0+c3RhY2tfZGF0YVsgdG9zIF0ubmFtZSA9IE5VTEw7CisgICAgcC0+d190b3AgPSB0b3M7CisgICAgS0VfRFVNUCggMTAwMCwgZHVtcF9jb25zX3N0YWNrKCBndGlkLCBwICkgKTsKK30KKwordm9pZAorI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCitfX2ttcF9jaGVja19zeW5jKCBpbnQgZ3RpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKiBpZGVudCwga21wX3VzZXJfbG9ja19wIGxjaywga21wX3VpbnQzMiBzZXEgKQorI2Vsc2UKK19fa21wX2NoZWNrX3N5bmMoIGludCBndGlkLCBlbnVtIGNvbnNfdHlwZSBjdCwgaWRlbnRfdCBjb25zdCAqIGlkZW50LCBrbXBfdXNlcl9sb2NrX3AgbGNrICkKKyNlbmRpZgoreworICAgIHN0cnVjdCBjb25zX2hlYWRlciAqcCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXS0+dGgudGhfY29uczsKKworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcF9jaGVja19zeW5jIChndGlkPSVkKVxuIiwgX19rbXBfZ2V0X2d0aWQoKSApICk7CisKKyAgICBpZiAocC0+c3RhY2tfdG9wID49IHAtPnN0YWNrX3NpemUpCisgICAgICAgX19rbXBfZXhwYW5kX2NvbnNfc3RhY2soIGd0aWQsIHAgKTsKKworICAgIGlmIChjdCA9PSBjdF9vcmRlcmVkX2luX3BhcmFsbGVsIHx8IGN0ID09IGN0X29yZGVyZWRfaW5fcGRvIHx8IGN0ID09IGN0X29yZGVyZWRfaW5fdGFza3EgKSB7CisgICAgICAgIGlmIChwLT53X3RvcCA8PSBwLT5wX3RvcCkgeworICAgICAgICAgICAgLyogd2UgYXJlIG5vdCBpbiBhIHdvcmtzaGFyaW5nIGNvbnN0cnVjdCAqLworICAgICAgICAgICAgI2lmZGVmIEJVSUxEX1BBUkFMTEVMX09SREVSRUQKKyAgICAgICAgICAgICAgICAvKiBkbyBub3QgcmVwb3J0IGVycm9yIG1lc3NhZ2VzIGZvciBQQVJBTExFTCBPUkRFUkVEICovCisgICAgICAgICAgICAgICAgS01QX0FTU0VSVCggY3QgPT0gY3Rfb3JkZXJlZF9pbl9wYXJhbGxlbCApOworICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QoIGttcF9pMThuX21zZ19DbnNCb3VuZFRvV29ya3NoYXJpbmcsIGN0LCBpZGVudCApOworICAgICAgICAgICAgI2VuZGlmIC8qIEJVSUxEX1BBUkFMTEVMX09SREVSRUQgKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIGluc2lkZSBhIFdPUktTSEFSSU5HIGNvbnN0cnVjdCBmb3IgdGhpcyBQQVJBTExFTCByZWdpb24gKi8KKyAgICAgICAgICAgIGlmICghSVNfQ09OU19UWVBFX09SREVSRUQocC0+c3RhY2tfZGF0YVsgcC0+d190b3AgXS50eXBlKSkgeworICAgICAgICAgICAgICAgIGlmIChwLT5zdGFja19kYXRhWyBwLT53X3RvcCBdLnR5cGUgPT0gY3RfdGFza3EpIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0MigKKyAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pMThuX21zZ19DbnNOb3RJblRhc2tDb25zdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICBjdCwgaWRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAmIHAtPnN0YWNrX2RhdGFbIHAtPndfdG9wIF0KKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QyKAorICAgICAgICAgICAgICAgICAgICAgICAga21wX2kxOG5fbXNnX0Nuc05vT3JkZXJlZENsYXVzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGN0LCBpZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICYgcC0+c3RhY2tfZGF0YVsgcC0+d190b3AgXQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChwLT5zX3RvcCA+IHAtPnBfdG9wICYmIHAtPnNfdG9wID4gcC0+d190b3ApIHsKKyAgICAgICAgICAgIC8qIGluc2lkZSBhIHN5bmMgY29uc3RydWN0IHdoaWNoIGlzIGluc2lkZSBhIHdvcmtzaGFyaW5nIGNvbnN0cnVjdCAqLworICAgICAgICAgICAgaW50IGluZGV4ID0gcC0+c190b3A7CisgICAgICAgICAgICBlbnVtIGNvbnNfdHlwZSBzdGFja190eXBlOworCisgICAgICAgICAgICBzdGFja190eXBlID0gcC0+c3RhY2tfZGF0YVsgaW5kZXggXS50eXBlOworCisgICAgICAgICAgICBpZiAoc3RhY2tfdHlwZSA9PSBjdF9jcml0aWNhbCB8fAorICAgICAgICAgICAgICAgICggKCBzdGFja190eXBlID09IGN0X29yZGVyZWRfaW5fcGFyYWxsZWwgfHwKKyAgICAgICAgICAgICAgICAgICAgc3RhY2tfdHlwZSA9PSBjdF9vcmRlcmVkX2luX3BkbyAgICAgIHx8CisgICAgICAgICAgICAgICAgICAgIHN0YWNrX3R5cGUgPT0gY3Rfb3JkZXJlZF9pbl90YXNrcSAgKSAmJiAgICAgLyogQyBkb2Vzbid0IGFsbG93IG5hbWVkIG9yZGVyZWQ7IG9yZGVyZWQgaW4gb3JkZXJlZCBnZXRzIGVycm9yICovCisgICAgICAgICAgICAgICAgIHAtPnN0YWNrX2RhdGFbIGluZGV4IF0uaWRlbnQgIT0gTlVMTCAmJgorICAgICAgICAgICAgICAgICAocC0+c3RhY2tfZGF0YVsgaW5kZXggXS5pZGVudC0+ZmxhZ3MgJiBLTVBfSURFTlRfS01QQyApKSkgeworICAgICAgICAgICAgICAgIC8qIHdlIGFyZSBpbiBPUkRFUkVEIHdoaWNoIGlzIGluc2lkZSBhbiBPUkRFUkVEIG9yIENSSVRJQ0FMIGNvbnN0cnVjdCAqLworICAgICAgICAgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdDIoCisgICAgICAgICAgICAgICAgICAgIGttcF9pMThuX21zZ19DbnNJbnZhbGlkTmVzdGluZywKKyAgICAgICAgICAgICAgICAgICAgY3QsIGlkZW50LAorICAgICAgICAgICAgICAgICAgICAmIHAtPnN0YWNrX2RhdGFbIGluZGV4IF0KKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIGlmICggY3QgPT0gY3RfY3JpdGljYWwgKSB7CisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKyAgICAgICAgaWYgKCBsY2sgIT0gTlVMTCAmJiBfX2ttcF9nZXRfdXNlcl9sb2NrX293bmVyKCBsY2ssIHNlcSApID09IGd0aWQgKSB7ICAgIC8qIHRoaXMgc2FtZSB0aHJlYWQgYWxyZWFkeSBoYXMgbG9jayBmb3IgdGhpcyBjcml0aWNhbCBzZWN0aW9uICovCisjZWxzZQorICAgICAgICBpZiAoIGxjayAhPSBOVUxMICYmIF9fa21wX2dldF91c2VyX2xvY2tfb3duZXIoIGxjayApID09IGd0aWQgKSB7ICAgIC8qIHRoaXMgc2FtZSB0aHJlYWQgYWxyZWFkeSBoYXMgbG9jayBmb3IgdGhpcyBjcml0aWNhbCBzZWN0aW9uICovCisjZW5kaWYKKyAgICAgICAgICAgIGludCBpbmRleCA9IHAtPnNfdG9wOworICAgICAgICAgICAgc3RydWN0IGNvbnNfZGF0YSBjb25zID0geyBOVUxMLCBjdF9jcml0aWNhbCwgMCwgTlVMTCB9OworICAgICAgICAgICAgLyogd2FsayB1cCBjb25zdHJ1Y3Qgc3RhY2sgYW5kIHRyeSB0byBmaW5kIGNyaXRpY2FsIHdpdGggbWF0Y2hpbmcgbmFtZSAqLworICAgICAgICAgICAgd2hpbGUgKCBpbmRleCAhPSAwICYmIHAtPnN0YWNrX2RhdGFbIGluZGV4IF0ubmFtZSAhPSBsY2sgKSB7CisgICAgICAgICAgICAgICAgaW5kZXggPSBwLT5zdGFja19kYXRhWyBpbmRleCBdLnByZXY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGluZGV4ICE9IDAgKSB7CisgICAgICAgICAgICAgICAgLyogZm91bmQgbWF0Y2ggb24gdGhlIHN0YWNrIChtYXkgbm90IGFsd2F5cyBiZWNhdXNlIG9mIGludGVybGVhdmVkIGNyaXRpY2FsIGZvciBGb3J0cmFuKSAqLworICAgICAgICAgICAgICAgIGNvbnMgPSBwLT5zdGFja19kYXRhWyBpbmRleCBdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogd2UgYXJlIGluIENSSVRJQ0FMIHdoaWNoIGlzIGluc2lkZSBhIENSSVRJQ0FMIGNvbnN0cnVjdCBvZiB0aGUgc2FtZSBuYW1lICovCisgICAgICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QyKCBrbXBfaTE4bl9tc2dfQ25zTmVzdGluZ1NhbWVOYW1lLCBjdCwgaWRlbnQsICYgY29ucyApOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICggY3QgPT0gY3RfbWFzdGVyIHx8IGN0ID09IGN0X3JlZHVjZSApIHsKKyAgICAgICAgaWYgKHAtPndfdG9wID4gcC0+cF90b3ApIHsKKyAgICAgICAgICAgIC8qIGluc2lkZSBhIFdPUktTSEFSSU5HIGNvbnN0cnVjdCBmb3IgdGhpcyBQQVJBTExFTCByZWdpb24gKi8KKyAgICAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0MigKKyAgICAgICAgICAgICAgIGttcF9pMThuX21zZ19DbnNJbnZhbGlkTmVzdGluZywKKyAgICAgICAgICAgICAgIGN0LCBpZGVudCwKKyAgICAgICAgICAgICAgICYgcC0+c3RhY2tfZGF0YVsgcC0+d190b3AgXQorICAgICAgICAgICApOworICAgICAgICB9CisgICAgICAgIGlmIChjdCA9PSBjdF9yZWR1Y2UgJiYgcC0+c190b3AgPiBwLT5wX3RvcCkgeworICAgICAgICAgICAgLyogaW5zaWRlIGEgYW5vdGhlciBTWU5DIGNvbnN0cnVjdCBmb3IgdGhpcyBQQVJBTExFTCByZWdpb24gKi8KKyAgICAgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdDIoCisgICAgICAgICAgICAgICAga21wX2kxOG5fbXNnX0Nuc0ludmFsaWROZXN0aW5nLAorICAgICAgICAgICAgICAgIGN0LCBpZGVudCwKKyAgICAgICAgICAgICAgICAmIHAtPnN0YWNrX2RhdGFbIHAtPnNfdG9wIF0KKyAgICAgICAgICAgICk7CisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gaWYKK30KKwordm9pZAorI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCitfX2ttcF9wdXNoX3N5bmMoIGludCBndGlkLCBlbnVtIGNvbnNfdHlwZSBjdCwgaWRlbnRfdCBjb25zdCAqIGlkZW50LCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBrbXBfdWludDMyIHNlcSApCisjZWxzZQorX19rbXBfcHVzaF9zeW5jKCBpbnQgZ3RpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKiBpZGVudCwga21wX3VzZXJfbG9ja19wIGxjayApCisjZW5kaWYKK3sKKyAgICBpbnQgICAgICAgICB0b3M7CisgICAgc3RydWN0IGNvbnNfaGVhZGVyICpwID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF9jb25zOworCisgICAgS01QX0FTU0VSVCggZ3RpZCA9PSBfX2ttcF9nZXRfZ3RpZCgpICk7CisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wX3B1c2hfc3luYyAoZ3RpZD0lZClcbiIsIGd0aWQgKSApOworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgICAgX19rbXBfY2hlY2tfc3luYyggZ3RpZCwgY3QsIGlkZW50LCBsY2ssIHNlcSApOworI2Vsc2UKKyAgICBfX2ttcF9jaGVja19zeW5jKCBndGlkLCBjdCwgaWRlbnQsIGxjayApOworI2VuZGlmCisgICAgS0VfVFJBQ0UoIDEwMCwgKCBQVVNIX01TRyggY3QsIGlkZW50ICkgKSApOworICAgIHRvcyA9ICsrIHAtPnN0YWNrX3RvcDsKKyAgICBwLT5zdGFja19kYXRhWyB0b3MgXS50eXBlICA9IGN0OworICAgIHAtPnN0YWNrX2RhdGFbIHRvcyBdLnByZXYgID0gcC0+c190b3A7CisgICAgcC0+c3RhY2tfZGF0YVsgdG9zIF0uaWRlbnQgPSBpZGVudDsKKyAgICBwLT5zdGFja19kYXRhWyB0b3MgXS5uYW1lICA9IGxjazsKKyAgICBwLT5zX3RvcCA9IHRvczsKKyAgICBLRV9EVU1QKCAxMDAwLCBkdW1wX2NvbnNfc3RhY2soIGd0aWQsIHAgKSApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZAorX19rbXBfcG9wX3BhcmFsbGVsKCBpbnQgZ3RpZCwgaWRlbnRfdCBjb25zdCAqIGlkZW50ICkKK3sKKyAgICBpbnQgdG9zOworICAgIHN0cnVjdCBjb25zX2hlYWRlciAqcCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXS0+dGgudGhfY29uczsKKyAgICB0b3MgPSBwLT5zdGFja190b3A7CisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wX3BvcF9wYXJhbGxlbCAoJWQgJWQpXG4iLCBndGlkLCBfX2ttcF9nZXRfZ3RpZCgpICkgKTsKKyAgICBpZiAoIHRvcyA9PSAwIHx8IHAtPnBfdG9wID09IDAgKSB7CisgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdCgga21wX2kxOG5fbXNnX0Nuc0RldGVjdGVkRW5kLCBjdF9wYXJhbGxlbCwgaWRlbnQgKTsKKyAgICB9CisgICAgaWYgKCB0b3MgIT0gcC0+cF90b3AgfHwgcC0+c3RhY2tfZGF0YVsgdG9zIF0udHlwZSAhPSBjdF9wYXJhbGxlbCApIHsKKyAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0MigKKyAgICAgICAgICAgIGttcF9pMThuX21zZ19DbnNFeHBlY3RlZEVuZCwKKyAgICAgICAgICAgIGN0X3BhcmFsbGVsLCBpZGVudCwKKyAgICAgICAgICAgICYgcC0+c3RhY2tfZGF0YVsgdG9zIF0KKyAgICAgICAgKTsKKyAgICB9CisgICAgS0VfVFJBQ0UoIDEwMCwgKCBQT1BfTVNHKCBwICkgKSApOworICAgIHAtPnBfdG9wID0gcC0+c3RhY2tfZGF0YVsgdG9zIF0ucHJldjsKKyAgICBwLT5zdGFja19kYXRhWyB0b3MgXS50eXBlID0gY3Rfbm9uZTsKKyAgICBwLT5zdGFja19kYXRhWyB0b3MgXS5pZGVudCA9IE5VTEw7CisgICAgcC0+c3RhY2tfdG9wID0gdG9zIC0gMTsKKyAgICBLRV9EVU1QKCAxMDAwLCBkdW1wX2NvbnNfc3RhY2soIGd0aWQsIHAgKSApOworfQorCitlbnVtIGNvbnNfdHlwZQorX19rbXBfcG9wX3dvcmtzaGFyZSggaW50IGd0aWQsIGVudW0gY29uc190eXBlIGN0LCBpZGVudF90IGNvbnN0ICogaWRlbnQgKQoreworICAgIGludCB0b3M7CisgICAgc3RydWN0IGNvbnNfaGVhZGVyICpwID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF9jb25zOworCisgICAgdG9zID0gcC0+c3RhY2tfdG9wOworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcF9wb3Bfd29ya3NoYXJlICglZCAlZClcbiIsIGd0aWQsIF9fa21wX2dldF9ndGlkKCkgKSApOworICAgIGlmICggdG9zID09IDAgfHwgcC0+d190b3AgPT0gMCApIHsKKyAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0KCBrbXBfaTE4bl9tc2dfQ25zRGV0ZWN0ZWRFbmQsIGN0LCBpZGVudCApOworICAgIH0KKworICAgIGlmICggdG9zICE9IHAtPndfdG9wIHx8CisgICAgICAgICAoIHAtPnN0YWNrX2RhdGFbIHRvcyBdLnR5cGUgIT0gY3QgJiYKKyAgICAgICAgICAvKiBiZWxvdyBhcmUgdHdvIGV4Y2VwdGlvbnMgdG8gdGhlIHJ1bGUgdGhhdCBjb25zdHJ1Y3QgdHlwZXMgbXVzdCBtYXRjaCAqLworICAgICAgICAgICEgKCBwLT5zdGFja19kYXRhWyB0b3MgXS50eXBlID09IGN0X3Bkb19vcmRlcmVkICYmIGN0ID09IGN0X3BkbyApICYmCisgICAgICAgICAgISAoIHAtPnN0YWNrX2RhdGFbIHRvcyBdLnR5cGUgPT0gY3RfdGFza19vcmRlcmVkICYmIGN0ID09IGN0X3Rhc2sgKQorICAgICAgICAgKQorICAgICAgICkgeworICAgICAgICBfX2ttcF9jaGVja19udWxsX2Z1bmMoKTsKKyAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0MigKKyAgICAgICAgICAgIGttcF9pMThuX21zZ19DbnNFeHBlY3RlZEVuZCwKKyAgICAgICAgICAgIGN0LCBpZGVudCwKKyAgICAgICAgICAgICYgcC0+c3RhY2tfZGF0YVsgdG9zIF0KKyAgICAgICAgKTsKKyAgICB9CisgICAgS0VfVFJBQ0UoIDEwMCwgKCBQT1BfTVNHKCBwICkgKSApOworICAgIHAtPndfdG9wID0gcC0+c3RhY2tfZGF0YVsgdG9zIF0ucHJldjsKKyAgICBwLT5zdGFja19kYXRhWyB0b3MgXS50eXBlID0gY3Rfbm9uZTsKKyAgICBwLT5zdGFja19kYXRhWyB0b3MgXS5pZGVudCA9IE5VTEw7CisgICAgcC0+c3RhY2tfdG9wID0gdG9zIC0gMTsKKyAgICBLRV9EVU1QKCAxMDAwLCBkdW1wX2NvbnNfc3RhY2soIGd0aWQsIHAgKSApOworICAgIHJldHVybiBwLT5zdGFja19kYXRhWyBwLT53X3RvcCBdLnR5cGU7Cit9CisKK3ZvaWQKK19fa21wX3BvcF9zeW5jKCBpbnQgZ3RpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKiBpZGVudCApCit7CisgICAgaW50IHRvczsKKyAgICBzdHJ1Y3QgY29uc19oZWFkZXIgKnAgPSBfX2ttcF90aHJlYWRzWyBndGlkIF0tPnRoLnRoX2NvbnM7CisgICAgdG9zID0gcC0+c3RhY2tfdG9wOworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcF9wb3Bfc3luYyAoJWQgJWQpXG4iLCBndGlkLCBfX2ttcF9nZXRfZ3RpZCgpICkgKTsKKyAgICBpZiAoIHRvcyA9PSAwIHx8IHAtPnNfdG9wID09IDAgKSB7CisgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdCgga21wX2kxOG5fbXNnX0Nuc0RldGVjdGVkRW5kLCBjdCwgaWRlbnQgKTsKKyAgICB9OworICAgIGlmICggdG9zICE9IHAtPnNfdG9wIHx8IHAtPnN0YWNrX2RhdGFbIHRvcyBdLnR5cGUgIT0gY3QgKSB7CisgICAgICAgIF9fa21wX2NoZWNrX251bGxfZnVuYygpOworICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QyKAorICAgICAgICAgICAga21wX2kxOG5fbXNnX0Nuc0V4cGVjdGVkRW5kLAorICAgICAgICAgICAgY3QsIGlkZW50LAorICAgICAgICAgICAgJiBwLT5zdGFja19kYXRhWyB0b3MgXQorICAgICAgICApOworICAgIH07CisgICAgaWYgKCBndGlkIDwgMCApIHsKKyAgICAgICAgX19rbXBfY2hlY2tfbnVsbF9mdW5jKCk7CisgICAgfTsKKyAgICBLRV9UUkFDRSggMTAwLCAoIFBPUF9NU0coIHAgKSApICk7CisgICAgcC0+c190b3AgPSBwLT5zdGFja19kYXRhWyB0b3MgXS5wcmV2OworICAgIHAtPnN0YWNrX2RhdGFbIHRvcyBdLnR5cGUgPSBjdF9ub25lOworICAgIHAtPnN0YWNrX2RhdGFbIHRvcyBdLmlkZW50ID0gTlVMTDsKKyAgICBwLT5zdGFja190b3AgPSB0b3MgLSAxOworICAgIEtFX0RVTVAoIDEwMDAsIGR1bXBfY29uc19zdGFjayggZ3RpZCwgcCApICk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkCitfX2ttcF9jaGVja19iYXJyaWVyKCBpbnQgZ3RpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKiBpZGVudCApCit7CisgICAgc3RydWN0IGNvbnNfaGVhZGVyICpwID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF9jb25zOworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcF9jaGVja19iYXJyaWVyIChsb2M6ICVwLCBndGlkOiAlZCAlZClcbiIsIGlkZW50LCBndGlkLCBfX2ttcF9nZXRfZ3RpZCgpICkgKTsKKyAgICBpZiAoIGlkZW50ICE9IDAgKSB7CisgICAgICAgIF9fa21wX2NoZWNrX251bGxfZnVuYygpOworICAgIH0KKyAgICBpZiAoIHAtPndfdG9wID4gcC0+cF90b3AgKSB7CisgICAgICAgIC8qIHdlIGFyZSBhbHJlYWR5IGluIGEgV09SS1NIQVJJTkcgY29uc3RydWN0IGZvciB0aGlzIFBBUkFMTEVMIHJlZ2lvbiAqLworICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QyKAorICAgICAgICAgICAga21wX2kxOG5fbXNnX0Nuc0ludmFsaWROZXN0aW5nLAorICAgICAgICAgICAgY3QsIGlkZW50LAorICAgICAgICAgICAgJiBwLT5zdGFja19kYXRhWyBwLT53X3RvcCBdCisgICAgICAgICk7CisgICAgfQorICAgIGlmIChwLT5zX3RvcCA+IHAtPnBfdG9wKSB7CisgICAgICAgIC8qIHdlIGFyZSBhbHJlYWR5IGluIGEgU1lOQyBjb25zdHJ1Y3QgZm9yIHRoaXMgUEFSQUxMRUwgcmVnaW9uICovCisgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdDIoCisgICAgICAgICAgICBrbXBfaTE4bl9tc2dfQ25zSW52YWxpZE5lc3RpbmcsCisgICAgICAgICAgICBjdCwgaWRlbnQsCisgICAgICAgICAgICAmIHAtPnN0YWNrX2RhdGFbIHAtPnNfdG9wIF0KKyAgICAgICAgKTsKKyAgICB9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfZXJyb3IuaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9lcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZmUxMTEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZXJyb3IuaApAQCAtMCwwICsxLDU3IEBACisvKgorICoga21wX2Vycm9yLmggLS0gUFRTIGZ1bmN0aW9ucyBmb3IgZXJyb3IgY2hlY2tpbmcgYXQgcnVudGltZS4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBLTVBfRVJST1JfSAorI2RlZmluZSBLTVBfRVJST1JfSAorCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICBleHRlcm4gIkMiIHsKKyNlbmRpZgorCit2b2lkIF9fa21wX2Vycm9yX2NvbnN0cnVjdCggIGttcF9pMThuX2lkX3QgaWQsIGVudW0gY29uc190eXBlIGN0LCBpZGVudF90IGNvbnN0ICogaWRlbnQgKTsKK3ZvaWQgX19rbXBfZXJyb3JfY29uc3RydWN0Migga21wX2kxOG5faWRfdCBpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKiBpZGVudCwgc3RydWN0IGNvbnNfZGF0YSBjb25zdCAqIGNvbnMgKTsKKworc3RydWN0IGNvbnNfaGVhZGVyICogX19rbXBfYWxsb2NhdGVfY29uc19zdGFjayggaW50IGd0aWQgKTsKK3ZvaWQgICAgICAgICAgICAgICAgIF9fa21wX2ZyZWVfY29uc19zdGFjayggdm9pZCAqIHB0ciApOworCit2b2lkIF9fa21wX3B1c2hfcGFyYWxsZWwoIGludCBndGlkLCBpZGVudF90IGNvbnN0ICogaWRlbnQgKTsKK3ZvaWQgX19rbXBfcHVzaF93b3Jrc2hhcmUoIGludCBndGlkLCBlbnVtIGNvbnNfdHlwZSBjdCwgaWRlbnRfdCBjb25zdCAqIGlkZW50ICk7CisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKK3ZvaWQgX19rbXBfcHVzaF9zeW5jKCBpbnQgZ3RpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKiBpZGVudCwga21wX3VzZXJfbG9ja19wIG5hbWUsIGttcF91aW50MzIgKTsKKyNlbHNlCit2b2lkIF9fa21wX3B1c2hfc3luYyggaW50IGd0aWQsIGVudW0gY29uc190eXBlIGN0LCBpZGVudF90IGNvbnN0ICogaWRlbnQsIGttcF91c2VyX2xvY2tfcCBuYW1lICk7CisjZW5kaWYKKwordm9pZCBfX2ttcF9jaGVja193b3Jrc2hhcmUoIGludCBndGlkLCBlbnVtIGNvbnNfdHlwZSBjdCwgaWRlbnRfdCBjb25zdCAqIGlkZW50ICk7CisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKK3ZvaWQgX19rbXBfY2hlY2tfc3luYyggaW50IGd0aWQsIGVudW0gY29uc190eXBlIGN0LCBpZGVudF90IGNvbnN0ICogaWRlbnQsIGttcF91c2VyX2xvY2tfcCBuYW1lLCBrbXBfdWludDMyICk7CisjZWxzZQordm9pZCBfX2ttcF9jaGVja19zeW5jKCBpbnQgZ3RpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKiBpZGVudCwga21wX3VzZXJfbG9ja19wIG5hbWUgKTsKKyNlbmRpZgorCit2b2lkIF9fa21wX3BvcF9wYXJhbGxlbCggaW50IGd0aWQsIGlkZW50X3QgY29uc3QgKiBpZGVudCApOworZW51bSBjb25zX3R5cGUgX19rbXBfcG9wX3dvcmtzaGFyZSggaW50IGd0aWQsIGVudW0gY29uc190eXBlIGN0LCBpZGVudF90IGNvbnN0ICogaWRlbnQgKTsKK3ZvaWQgX19rbXBfcG9wX3N5bmMoIGludCBndGlkLCBlbnVtIGNvbnNfdHlwZSBjdCwgaWRlbnRfdCBjb25zdCAqIGlkZW50ICk7Cit2b2lkIF9fa21wX2NoZWNrX2JhcnJpZXIoIGludCBndGlkLCBlbnVtIGNvbnNfdHlwZSBjdCwgaWRlbnRfdCBjb25zdCAqIGlkZW50ICk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIH0gLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAvLyBLTVBfRVJST1JfSAorCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfZnRuX2NkZWNsLmMgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZnRuX2NkZWNsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFmYTFiZgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9mdG5fY2RlY2wuYwpAQCAtMCwwICsxLDM1IEBACisvKgorICoga21wX2Z0bl9jZGVjbC5jIC0tIEZvcnRyYW4gX19jZGVjbCBsaW5rYWdlIHN1cHBvcnQgZm9yIE9wZW5NUC4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorCisjaWYgS01QX09TX1dJTkRPV1MKKyMgICBpZiBkZWZpbmVkICBLTVBfV0lOX0NERUNMIHx8ICAhZGVmaW5lZCBLTVBfRFlOQU1JQ19MSUIKKyMgICAgICAgZGVmaW5lIEtNUF9GVE5fRU5UUklFUyAgICAgIEtNUF9GVE5fVVBQRVIKKyMgICBlbmRpZgorI2VsaWYgS01QX09TX1VOSVgKKyMgICBkZWZpbmUgS01QX0ZUTl9FTlRSSUVTICBLTVBfRlROX1BMQUlOCisjZW5kaWYKKworLy8gTm90ZTogVGhpcyBzdHJpbmcgaXMgbm90IHByaW50ZWQgd2hlbiBLTVBfVkVSU0lPTj0xLgorY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2Z0bmNkZWNsW10gPSBLTVBfVkVSU0lPTl9QUkVGSVggIkZvcnRyYW4gX19jZGVjbCBPTVAgc3VwcG9ydDogIgorI2lmZGVmIEtNUF9GVE5fRU5UUklFUworICAgICJ5ZXMiOworIyAgIGRlZmluZSBGVE5fU1REQ0FMTCAJLyogbm8gc3RkY2FsbCAqLworIyAgIGluY2x1ZGUgImttcF9mdG5fb3MuaCIKKyMgICBpbmNsdWRlICJrbXBfZnRuX2VudHJ5LmgiCisjZWxzZQorICAgICJubyI7CisjZW5kaWYgLyogS01QX0ZUTl9FTlRSSUVTICovCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfZnRuX2VudHJ5LmggYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZnRuX2VudHJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNiYWFjYgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9mdG5fZW50cnkuaApAQCAtMCwwICsxLDEyNTMgQEAKKy8qCisgKiBrbXBfZnRuX2VudHJ5LmggLS0gRm9ydHJhbiBlbnRyeSBsaW5rYWdlIHN1cHBvcnQgZm9yIE9wZW5NUC4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBGVE5fU1REQ0FMTAorIyBlcnJvciBUaGUgc3VwcG9ydCBmaWxlIGttcF9mdG5fZW50cnkuaCBzaG91bGQgbm90IGJlIGNvbXBpbGVkIGJ5IGl0c2VsZi4KKyNlbmRpZgorCisjaWZkZWYgS01QX1NUVUIKKyAgICAjaW5jbHVkZSAia21wX3N0dWIuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgZXh0ZXJuICJDIiB7CisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworLyoKKyAqIEZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIEdudS9NUyBPcGVuIE1QIGNvZGVnZW4sIG9tcF9zZXRfbnVtX3RocmVhZHMoKSwKKyAqIG9tcF9zZXRfbmVzdGVkKCksIGFuZCBvbXBfc2V0X2R5bmFtaWMoKSBbaW4gbG93ZXJjYXNlIG9uIE1TLCBhbmQgdy9vCisgKiBhIHRyYWlsaW5nIHVuZGVyc2NvcmUgb24gTGludXgqIE9TXSB0YWtlIGNhbGwgYnkgdmFsdWUgaW50ZWdlciBhcmd1bWVudHMuCisgKiArIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMoKQorICogKyBvbXBfc2V0X3NjaGVkdWxlKCkKKyAqCisgKiBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIDkuMSBhbmQgcHJldmlvdXMgSW50ZWwgY29tcGlsZXIsIHRoZXNlCisgKiBlbnRyeSBwb2ludHMgdGFrZSBjYWxsIGJ5IHJlZmVyZW5jZSBpbnRlZ2VyIGFyZ3VtZW50cy4KKyAqLworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorIyBpZiAoS01QX0ZUTl9FTlRSSUVTID09IEtNUF9GVE5fUExBSU4pIHx8IChLTVBfRlROX0VOVFJJRVMgPT0gS01QX0ZUTl9VUFBFUikKKyMgIGRlZmluZSBQQVNTX0FSR1NfQllfVkFMVUUgMQorIyBlbmRpZgorI2VuZGlmCisjaWYgS01QX09TX1dJTkRPV1MKKyMgaWYgKEtNUF9GVE5fRU5UUklFUyA9PSBLTVBfRlROX1BMQUlOKSB8fCAoS01QX0ZUTl9FTlRSSUVTID09IEtNUF9GVE5fQVBQRU5EKQorIyAgZGVmaW5lIFBBU1NfQVJHU19CWV9WQUxVRSAxCisjIGVuZGlmCisjZW5kaWYKKworLy8gVGhpcyBtYWNybyBoZWxwcyB0byByZWR1Y2UgY29kZSBkdXBsaWNhdGlvbi4KKyNpZmRlZiBQQVNTX0FSR1NfQllfVkFMVUUKKyAgICAjZGVmaW5lIEtNUF9ERVJFRgorI2Vsc2UKKyAgICAjZGVmaW5lIEtNUF9ERVJFRiAqCisjZW5kaWYKKwordm9pZCAgRlROX1NURENBTEwKK0ZUTl9TRVRfU1RBQ0tTSVpFKCBpbnQgS01QX0RFUkVGIGFyZyApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIF9fa21wc19zZXRfc3RhY2tzaXplKCBLTVBfREVSRUYgYXJnICk7CisgICAgI2Vsc2UKKyAgICAgICAgLy8gX19rbXBfYXV4X3NldF9zdGFja3NpemUgaW5pdGlhbGl6ZXMgdGhlIGxpYnJhcnkgaWYgbmVlZGVkCisgICAgICAgIF9fa21wX2F1eF9zZXRfc3RhY2tzaXplKCAoc2l6ZV90KSBLTVBfREVSRUYgYXJnICk7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgIEZUTl9TVERDQUxMCitGVE5fU0VUX1NUQUNLU0laRV9TKCBzaXplX3QgS01QX0RFUkVGIGFyZyApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIF9fa21wc19zZXRfc3RhY2tzaXplKCBLTVBfREVSRUYgYXJnICk7CisgICAgI2Vsc2UKKyAgICAgICAgLy8gX19rbXBfYXV4X3NldF9zdGFja3NpemUgaW5pdGlhbGl6ZXMgdGhlIGxpYnJhcnkgaWYgbmVlZGVkCisgICAgICAgIF9fa21wX2F1eF9zZXRfc3RhY2tzaXplKCBLTVBfREVSRUYgYXJnICk7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAorRlROX0dFVF9TVEFDS1NJWkUoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICByZXR1cm4gX19rbXBzX2dldF9zdGFja3NpemUoKTsKKyAgICAjZWxzZQorICAgICAgICBpZiAoICEgX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgICAgICBfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZSgpOworICAgICAgICB9OworICAgICAgICByZXR1cm4gKGludClfX2ttcF9zdGtzaXplOworICAgICNlbmRpZgorfQorCitzaXplX3QgRlROX1NURENBTEwKK0ZUTl9HRVRfU1RBQ0tTSVpFX1MoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICByZXR1cm4gX19rbXBzX2dldF9zdGFja3NpemUoKTsKKyAgICAjZWxzZQorICAgICAgICBpZiAoICEgX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgICAgICBfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZSgpOworICAgICAgICB9OworICAgICAgICByZXR1cm4gX19rbXBfc3Rrc2l6ZTsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAorRlROX1NFVF9CTE9DS1RJTUUoIGludCBLTVBfREVSRUYgYXJnICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgX19rbXBzX3NldF9ibG9ja3RpbWUoIEtNUF9ERVJFRiBhcmcgKTsKKyAgICAjZWxzZQorCWludCBndGlkLCB0aWQ7CisJa21wX2luZm9fdCAqdGhyZWFkOworCisJZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKwl0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpOworCXRocmVhZCA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoZ3RpZCk7CisKKyAgICAgICAgX19rbXBfYXV4X3NldF9ibG9ja3RpbWUoIEtNUF9ERVJFRiBhcmcsIHRocmVhZCwgdGlkICk7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAorRlROX0dFVF9CTE9DS1RJTUUoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICByZXR1cm4gX19rbXBzX2dldF9ibG9ja3RpbWUoKTsKKyAgICAjZWxzZQorCWludCBndGlkLCB0aWQ7CisJa21wX2luZm9fdCAqdGhyZWFkOworICAgICAgICBrbXBfdGVhbV9wICp0ZWFtOworCisJZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKwl0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpOworCXRocmVhZCA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoZ3RpZCk7CisgICAgICAgIHRlYW0gPSBfX2ttcF90aHJlYWRzWyBndGlkIF0gLT4gdGgudGhfdGVhbTsKKworICAgICAgICAvKiBUaGVzZSBtdXN0IG1hdGNoIHRoZSBzZXR0aW5ncyB1c2VkIGluIF9fa21wX3dhaXRfc2xlZXAoKSAqLworICAgICAgICBpZiAoIF9fa21wX2RmbHRfYmxvY2t0aW1lID09IEtNUF9NQVhfQkxPQ0tUSU1FICkgeworCSAgICBLRl9UUkFDRSgxMCwgKCAia21wX2dldF9ibG9ja3RpbWU6IFQjJWQoJWQ6JWQpLCBibG9ja3RpbWU9JWRcbiIsCisJCQkgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBLTVBfTUFYX0JMT0NLVElNRSkgKTsKKyAgICAgICAgICAgIHJldHVybiBLTVBfTUFYX0JMT0NLVElNRTsKKyAgICAgICAgfQorI2lmZGVmIEtNUF9BREpVU1RfQkxPQ0tUSU1FCisgICAgICAgIGVsc2UgaWYgKCBfX2ttcF96ZXJvX2J0ICYmICFnZXRfX2J0X3NldCggdGVhbSwgdGlkICkgKSB7CisJICAgIEtGX1RSQUNFKDEwLCAoICJrbXBfZ2V0X2Jsb2NrdGltZTogVCMlZCglZDolZCksIGJsb2NrdGltZT0lZFxuIiwKKwkJCSAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIDApICk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorI2VuZGlmIC8qIEtNUF9BREpVU1RfQkxPQ0tUSU1FICovCisgICAgICAgIGVsc2UgeworCSAgICBLRl9UUkFDRSgxMCwgKCAia21wX2dldF9ibG9ja3RpbWU6IFQjJWQoJWQ6JWQpLCBibG9ja3RpbWU9JWRcbiIsCisgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBnZXRfX2Jsb2NrdGltZSggdGVhbSwgdGlkICkgKSApOworICAgICAgICAgICAgcmV0dXJuIGdldF9fYmxvY2t0aW1lKCB0ZWFtLCB0aWQgKTsKKyAgICAgICAgfTsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAorRlROX1NFVF9MSUJSQVJZX1NFUklBTCggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIF9fa21wc19zZXRfbGlicmFyeSggbGlicmFyeV9zZXJpYWwgKTsKKyAgICAjZWxzZQorICAgICAgICAvLyBfX2ttcF91c2VyX3NldF9saWJyYXJ5IGluaXRpYWxpemVzIHRoZSBsaWJyYXJ5IGlmIG5lZWRlZAorICAgICAgICBfX2ttcF91c2VyX3NldF9saWJyYXJ5KCBsaWJyYXJ5X3NlcmlhbCApOworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCitGVE5fU0VUX0xJQlJBUllfVFVSTkFST1VORCggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIF9fa21wc19zZXRfbGlicmFyeSggbGlicmFyeV90dXJuYXJvdW5kICk7CisgICAgI2Vsc2UKKyAgICAgICAgLy8gX19rbXBfdXNlcl9zZXRfbGlicmFyeSBpbml0aWFsaXplcyB0aGUgbGlicmFyeSBpZiBuZWVkZWQKKyAgICAgICAgX19rbXBfdXNlcl9zZXRfbGlicmFyeSggbGlicmFyeV90dXJuYXJvdW5kICk7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwKK0ZUTl9TRVRfTElCUkFSWV9USFJPVUdIUFVUKCB2b2lkICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgX19rbXBzX3NldF9saWJyYXJ5KCBsaWJyYXJ5X3Rocm91Z2hwdXQgKTsKKyAgICAjZWxzZQorICAgICAgICAvLyBfX2ttcF91c2VyX3NldF9saWJyYXJ5IGluaXRpYWxpemVzIHRoZSBsaWJyYXJ5IGlmIG5lZWRlZAorICAgICAgICBfX2ttcF91c2VyX3NldF9saWJyYXJ5KCBsaWJyYXJ5X3Rocm91Z2hwdXQgKTsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAorRlROX1NFVF9MSUJSQVJZKCBpbnQgS01QX0RFUkVGIGFyZyApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIF9fa21wc19zZXRfbGlicmFyeSggS01QX0RFUkVGIGFyZyApOworICAgICNlbHNlCisgICAgICAgIGVudW0gbGlicmFyeV90eXBlIGxpYjsKKyAgICAgICAgbGliID0gKGVudW0gbGlicmFyeV90eXBlKSBLTVBfREVSRUYgYXJnOworICAgICAgICAvLyBfX2ttcF91c2VyX3NldF9saWJyYXJ5IGluaXRpYWxpemVzIHRoZSBsaWJyYXJ5IGlmIG5lZWRlZAorICAgICAgICBfX2ttcF91c2VyX3NldF9saWJyYXJ5KCBsaWIgKTsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCitGVE5fR0VUX0xJQlJBUlkgKHZvaWQpCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIHJldHVybiBfX2ttcHNfZ2V0X2xpYnJhcnkoKTsKKyAgICAjZWxzZQorICAgICAgICBpZiAoICEgX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgICAgICBfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoKGludCkgX19rbXBfbGlicmFyeSk7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAorRlROX1NFVF9BRkZJTklUWSggdm9pZCAqKm1hc2sgKQoreworICAgICNpZiBkZWZpbmVkKEtNUF9TVFVCKSB8fCAhS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICByZXR1cm4gLTE7CisgICAgI2Vsc2UKKyAgICAgICAgaWYgKCAhIFRDUl80KF9fa21wX2luaXRfbWlkZGxlKSApIHsKKyAgICAgICAgICAgIF9fa21wX21pZGRsZV9pbml0aWFsaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9fa21wX2F1eF9zZXRfYWZmaW5pdHkoIG1hc2sgKTsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCitGVE5fR0VUX0FGRklOSVRZKCB2b2lkICoqbWFzayApCit7CisgICAgI2lmIGRlZmluZWQoS01QX1NUVUIpIHx8ICFLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIHJldHVybiAtMTsKKyAgICAjZWxzZQorICAgICAgICBpZiAoICEgVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX19rbXBfYXV4X2dldF9hZmZpbml0eSggbWFzayApOworICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK0ZUTl9HRVRfQUZGSU5JVFlfTUFYX1BST0MoIHZvaWQgKQoreworICAgICNpZiBkZWZpbmVkKEtNUF9TVFVCKSB8fCAhS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICByZXR1cm4gMDsKKyAgICAjZWxzZQorICAgICAgICAvLworICAgICAgICAvLyBXZSByZWFsbHkgb25seSBORUVEIHNlcmlhbCBpbml0aWFsaXphdGlvbiBoZXJlLgorICAgICAgICAvLworICAgICAgICBpZiAoICEgVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoICEgKCBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpICkgKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgI2lmIEtNUF9HUk9VUF9BRkZJTklUWSAmJiAhS01QX1VTRV9IV0xPQworICAgICAgICBpZiAoIF9fa21wX251bV9wcm9jX2dyb3VwcyA+IDEgKSB7CisgICAgICAgICAgICByZXR1cm4gKGludClLTVBfQ1BVX1NFVFNJWkU7CisgICAgICAgIH0KKyAgICAjZW5kaWYgLyogS01QX0dST1VQX0FGRklOSVRZICovCisgICAgICAgIHJldHVybiBfX2ttcF94cHJvYzsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAorRlROX0NSRUFURV9BRkZJTklUWV9NQVNLKCB2b2lkICoqbWFzayApCit7CisgICAgI2lmIGRlZmluZWQoS01QX1NUVUIpIHx8ICFLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgICptYXNrID0gTlVMTDsKKyAgICAjZWxzZQorICAgICAgICAvLworICAgICAgICAvLyBXZSByZWFsbHkgb25seSBORUVEIHNlcmlhbCBpbml0aWFsaXphdGlvbiBoZXJlLgorICAgICAgICAvLworICAgICAgICBpZiAoICEgVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICAgICAgfQorICAgICMgaWYgS01QX1VTRV9IV0xPQworICAgICAgICAqbWFzayA9IChod2xvY19jcHVzZXRfdClod2xvY19iaXRtYXBfYWxsb2MoKTsKKyAgICAjIGVsc2UKKyAgICAgICAgKm1hc2sgPSBrbXBjX21hbGxvYyggX19rbXBfYWZmaW5fbWFza19zaXplICk7CisgICAgIyBlbmRpZgorICAgICAgICBLTVBfQ1BVX1pFUk8oIChrbXBfYWZmaW5fbWFza190ICopKCptYXNrKSApOworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCitGVE5fREVTVFJPWV9BRkZJTklUWV9NQVNLKCB2b2lkICoqbWFzayApCit7CisgICAgI2lmIGRlZmluZWQoS01QX1NUVUIpIHx8ICFLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIC8vIE5vdGhpbmcKKyAgICAjZWxzZQorICAgICAgICAvLworICAgICAgICAvLyBXZSByZWFsbHkgb25seSBORUVEIHNlcmlhbCBpbml0aWFsaXphdGlvbiBoZXJlLgorICAgICAgICAvLworICAgICAgICBpZiAoICEgVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgICAgIGlmICggKm1hc2sgPT0gTlVMTCApIHsKKwkgICAgICAgIEtNUF9GQVRBTCggQWZmaW5pdHlJbnZhbGlkTWFzaywgImttcF9kZXN0cm95X2FmZmluaXR5X21hc2siICk7CisJICAgIH0KKyAgICAgICAgfQorICAgICMgaWYgS01QX1VTRV9IV0xPQworICAgICAgICBod2xvY19iaXRtYXBfZnJlZSgoaHdsb2NfY3B1c2V0X3QpKCptYXNrKSk7CisgICAgIyBlbHNlCisgICAgICAgIGttcGNfZnJlZSggKm1hc2sgKTsKKyAgICAjIGVuZGlmCisgICAgICAgICptYXNrID0gTlVMTDsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCitGVE5fU0VUX0FGRklOSVRZX01BU0tfUFJPQyggaW50IEtNUF9ERVJFRiBwcm9jLCB2b2lkICoqbWFzayApCit7CisgICAgI2lmIGRlZmluZWQoS01QX1NUVUIpIHx8ICFLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIHJldHVybiAtMTsKKyAgICAjZWxzZQorICAgICAgICBpZiAoICEgVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX19rbXBfYXV4X3NldF9hZmZpbml0eV9tYXNrX3Byb2MoIEtNUF9ERVJFRiBwcm9jLCBtYXNrICk7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAorRlROX1VOU0VUX0FGRklOSVRZX01BU0tfUFJPQyggaW50IEtNUF9ERVJFRiBwcm9jLCB2b2lkICoqbWFzayApCit7CisgICAgI2lmIGRlZmluZWQoS01QX1NUVUIpIHx8ICFLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIHJldHVybiAtMTsKKyAgICAjZWxzZQorICAgICAgICBpZiAoICEgVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX19rbXBfYXV4X3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyggS01QX0RFUkVGIHByb2MsIG1hc2sgKTsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCitGVE5fR0VUX0FGRklOSVRZX01BU0tfUFJPQyggaW50IEtNUF9ERVJFRiBwcm9jLCB2b2lkICoqbWFzayApCit7CisgICAgI2lmIGRlZmluZWQoS01QX1NUVUIpIHx8ICFLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIHJldHVybiAtMTsKKyAgICAjZWxzZQorICAgICAgICBpZiAoICEgVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX19rbXBfYXV4X2dldF9hZmZpbml0eV9tYXNrX3Byb2MoIEtNUF9ERVJFRiBwcm9jLCBtYXNrICk7CisgICAgI2VuZGlmCit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIHNldHMgdGhlIHJlcXVlc3RlZCBudW1iZXIgb2YgdGhyZWFkcyBmb3IgdGhlIG5leHQgcGFyYWxsZWwgcmVnaW9uICovCisKK3ZvaWQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX1NFVF9OVU1fVEhSRUFEUykoIGludCBLTVBfREVSRUYgYXJnICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgLy8gTm90aGluZy4KKyAgICAjZWxzZQorICAgICAgICBfX2ttcF9zZXRfbnVtX3RocmVhZHMoIEtNUF9ERVJFRiBhcmcsIF9fa21wX2VudHJ5X2d0aWQoKSApOworICAgICNlbmRpZgorfQorCisKKy8qIHJldHVybnMgdGhlIG51bWJlciBvZiB0aHJlYWRzIGluIGN1cnJlbnQgdGVhbSAqLworaW50IEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9HRVRfTlVNX1RIUkVBRFMpKCB2b2lkICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgcmV0dXJuIDE7CisgICAgI2Vsc2UKKyAgICAgICAgLy8gX19rbXBjX2JvdW5kX251bV90aHJlYWRzIGluaXRpYWxpemVzIHRoZSBsaWJyYXJ5IGlmIG5lZWRlZAorICAgICAgICByZXR1cm4gX19rbXBjX2JvdW5kX251bV90aHJlYWRzKE5VTEwpOworICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0dFVF9NQVhfVEhSRUFEUykoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICByZXR1cm4gMTsKKyAgICAjZWxzZQorICAgICAgICBpbnQgICAgICAgICBndGlkOworICAgICAgICBrbXBfaW5mb190ICp0aHJlYWQ7CisgICAgICAgIGlmICggISBUQ1JfNChfX2ttcF9pbml0X21pZGRsZSkgKSB7CisgICAgICAgICAgICBfX2ttcF9taWRkbGVfaW5pdGlhbGl6ZSgpOworICAgICAgICB9CisgICAgICAgIGd0aWQgICA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICAgICAgdGhyZWFkID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgICAgICAvL3JldHVybiB0aHJlYWQgLT4gdGgudGhfdGVhbSAtPiB0LnRfY3VycmVudF90YXNrWyB0aHJlYWQtPnRoLnRoX2luZm8uZHMuZHNfdGlkIF0gLT4gaWN2cy5ucHJvYzsKKwlyZXR1cm4gdGhyZWFkIC0+IHRoLnRoX2N1cnJlbnRfdGFzayAtPiB0ZF9pY3ZzLm5wcm9jOworICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0dFVF9USFJFQURfTlVNKSggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIHJldHVybiAwOworICAgICNlbHNlCisgICAgICAgIGludCBndGlkOworCisgICAgICAgICNpZiBLTVBfT1NfREFSV0lOIHx8IEtNUF9PU19GUkVFQlNEIHx8IEtNUF9PU19ORVRCU0QKKyAgICAgICAgICAgIGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgICAgICNlbGlmIEtNUF9PU19XSU5ET1dTCisgICAgICAgICAgICBpZiAoIV9fa21wX2luaXRfcGFyYWxsZWwgfHwKKyAgICAgICAgICAgICAgICAoZ3RpZCA9IChpbnQpKChrbXBfaW50cHRyX3QpVGxzR2V0VmFsdWUoIF9fa21wX2d0aWRfdGhyZWFkcHJpdmF0ZV9rZXkgKSkpID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBFaXRoZXIgbGlicmFyeSBpc24ndCBpbml0aWFsaXplZCBvciB0aHJlYWQgaXMgbm90IHJlZ2lzdGVyZWQKKyAgICAgICAgICAgICAgICAvLyAwIGlzIHRoZSBjb3JyZWN0IFRJRCBpbiB0aGlzIGNhc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC0tZ3RpZDsgLy8gV2Uga2VlcCAoZ3RpZCsxKSBpbiBUTFMKKyAgICAgICAgI2VsaWYgS01QX09TX0xJTlVYCisgICAgICAgICAgICAjaWZkZWYgS01QX1REQVRBX0dUSUQKKyAgICAgICAgICAgIGlmICggX19rbXBfZ3RpZF9tb2RlID49IDMgKSB7CisgICAgICAgICAgICAgICAgaWYgKChndGlkID0gX19rbXBfZ3RpZCkgPT0gS01QX0dUSURfRE5FKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICBpZiAoIV9fa21wX2luaXRfcGFyYWxsZWwgfHwKKyAgICAgICAgICAgICAgICAgICAgKGd0aWQgPSAoa21wX2ludHB0cl90KShwdGhyZWFkX2dldHNwZWNpZmljKCBfX2ttcF9ndGlkX3RocmVhZHByaXZhdGVfa2V5ICkpKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAtLWd0aWQ7CisgICAgICAgICAgICAjaWZkZWYgS01QX1REQVRBX0dUSUQKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICAjZWxzZQorICAgICAgICAgICAgI2Vycm9yIFVua25vd24gb3IgdW5zdXBwb3J0ZWQgT1MKKyAgICAgICAgI2VuZGlmCisKKyAgICAgICAgcmV0dXJuIF9fa21wX3RpZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCitGVE5fR0VUX05VTV9LTk9XTl9USFJFQURTKCB2b2lkICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgcmV0dXJuIDE7CisgICAgI2Vsc2UKKyAgICAgICAgaWYgKCAhIF9fa21wX2luaXRfc2VyaWFsICkgeworICAgICAgICAgICAgX19rbXBfc2VyaWFsX2luaXRpYWxpemUoKTsKKyAgICAgICAgfQorICAgICAgICAvKiBOT1RFOiB0aGlzIGlzIG5vdCBzeW5jcm9uaXplZCwgc28gaXQgY2FuIGNoYW5nZSBhdCBhbnkgbW9tZW50ICovCisgICAgICAgIC8qIE5PVEU6IHRoaXMgbnVtYmVyIGFsc28gaW5jbHVkZXMgdGhyZWFkcyBwcmVhbGxvY2F0ZWQgaW4gaG90LXRlYW1zICovCisgICAgICAgIHJldHVybiBUQ1JfNChfX2ttcF9udGgpOworICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0dFVF9OVU1fUFJPQ1MpKCB2b2lkICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgcmV0dXJuIDE7CisgICAgI2Vsc2UKKyAgICAgICAgaWYgKCAhIFRDUl80KF9fa21wX2luaXRfbWlkZGxlKSApIHsKKyAgICAgICAgICAgIF9fa21wX21pZGRsZV9pbml0aWFsaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9fa21wX2F2YWlsX3Byb2M7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX1NFVF9ORVNURUQpKCBpbnQgS01QX0RFUkVGIGZsYWcgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICBfX2ttcHNfc2V0X25lc3RlZCggS01QX0RFUkVGIGZsYWcgKTsKKyAgICAjZWxzZQorICAgICAgICBrbXBfaW5mb190ICp0aHJlYWQ7CisgICAgICAgIC8qIEZvciB0aGUgdGhyZWFkLXByaXZhdGUgaW50ZXJuYWwgY29udHJvbHMgaW1wbGVtZW50YXRpb24gKi8KKyAgICAgICAgdGhyZWFkID0gX19rbXBfZW50cnlfdGhyZWFkKCk7CisgICAgICAgIF9fa21wX3NhdmVfaW50ZXJuYWxfY29udHJvbHMoIHRocmVhZCApOworICAgICAgICBzZXRfX25lc3RlZCggdGhyZWFkLCAoIChLTVBfREVSRUYgZmxhZykgPyBUUlVFIDogRkFMU0UgKSApOworICAgICNlbmRpZgorfQorCisKK2ludCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fR0VUX05FU1RFRCkoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICByZXR1cm4gX19rbXBzX2dldF9uZXN0ZWQoKTsKKyAgICAjZWxzZQorICAgICAgICBrbXBfaW5mb190ICp0aHJlYWQ7CisgICAgICAgIHRocmVhZCA9IF9fa21wX2VudHJ5X3RocmVhZCgpOworICAgICAgICByZXR1cm4gZ2V0X19uZXN0ZWQoIHRocmVhZCApOworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9TRVRfRFlOQU1JQykoIGludCBLTVBfREVSRUYgZmxhZyApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIF9fa21wc19zZXRfZHluYW1pYyggS01QX0RFUkVGIGZsYWcgPyBUUlVFIDogRkFMU0UgKTsKKyAgICAjZWxzZQorICAgICAgICBrbXBfaW5mb190ICp0aHJlYWQ7CisgICAgICAgIC8qIEZvciB0aGUgdGhyZWFkLXByaXZhdGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGludGVybmFsIGNvbnRyb2xzICovCisgICAgICAgIHRocmVhZCA9IF9fa21wX2VudHJ5X3RocmVhZCgpOworICAgICAgICAvLyAhISEgV2hhdCBpZiBmb3JlaWduIHRocmVhZCBjYWxscyBpdD8KKyAgICAgICAgX19rbXBfc2F2ZV9pbnRlcm5hbF9jb250cm9scyggdGhyZWFkICk7CisgICAgICAgIHNldF9fZHluYW1pYyggdGhyZWFkLCBLTVBfREVSRUYgZmxhZyA/IFRSVUUgOiBGQUxTRSApOworICAgICNlbmRpZgorfQorCisKK2ludCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fR0VUX0RZTkFNSUMpKCB2b2lkICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgcmV0dXJuIF9fa21wc19nZXRfZHluYW1pYygpOworICAgICNlbHNlCisgICAgICAgIGttcF9pbmZvX3QgKnRocmVhZDsKKyAgICAgICAgdGhyZWFkID0gX19rbXBfZW50cnlfdGhyZWFkKCk7CisgICAgICAgIHJldHVybiBnZXRfX2R5bmFtaWMoIHRocmVhZCApOworICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0lOX1BBUkFMTEVMKSggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIHJldHVybiAwOworICAgICNlbHNlCisgICAgICAgIGttcF9pbmZvX3QgKnRoID0gX19rbXBfZW50cnlfdGhyZWFkKCk7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgaWYgKCB0aC0+dGgudGhfdGVhbXNfbWljcm90YXNrICkgeworICAgICAgICAgICAgLy8gQUM6IHJfaW5fcGFyYWxsZWwgZG9lcyBub3Qgd29yayBpbnNpZGUgdGVhbXMgY29uc3RydWN0CisgICAgICAgICAgICAvLyAgICAgd2hlcmUgcmVhbCBwYXJhbGxlbCBpcyBpbmFjdGl2ZSwgYnV0IGFsbCB0aHJlYWRzIGhhdmUgc2FtZSByb290LAorICAgICAgICAgICAgLy8gICAgIHNvIHNldHRpbmcgaXQgaW4gb25lIHRlYW0gYWZmZWN0cyBvdGhlciB0ZWFtcy4KKyAgICAgICAgICAgIC8vICAgICBUaGUgc29sdXRpb24gaXMgdG8gdXNlIHBlci10ZWFtIG5lc3RpbmcgbGV2ZWwKKyAgICAgICAgICAgIHJldHVybiAoIHRoLT50aC50aF90ZWFtLT50LnRfYWN0aXZlX2xldmVsID8gMSA6IDAgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICAgICAgICAgIHJldHVybiAoIHRoLT50aC50aF9yb290LT5yLnJfaW5fcGFyYWxsZWwgPyBGVE5fVFJVRSA6IEZUTl9GQUxTRSApOworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9TRVRfU0NIRURVTEUpKCBrbXBfc2NoZWRfdCBLTVBfREVSRUYga2luZCwgaW50IEtNUF9ERVJFRiBtb2RpZmllciApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIF9fa21wc19zZXRfc2NoZWR1bGUoIEtNUF9ERVJFRiBraW5kLCBLTVBfREVSRUYgbW9kaWZpZXIgKTsKKyAgICAjZWxzZQorCS8qICBUTyBETyAgKi8KKyAgICAgICAgLyogRm9yIHRoZSBwZXItdGFzayBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJvbHMgKi8KKyAgICAgICAgX19rbXBfc2V0X3NjaGVkdWxlKCBfX2ttcF9lbnRyeV9ndGlkKCksIEtNUF9ERVJFRiBraW5kLCBLTVBfREVSRUYgbW9kaWZpZXIgKTsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fR0VUX1NDSEVEVUxFKSgga21wX3NjaGVkX3QgKiBraW5kLCBpbnQgKiBtb2RpZmllciApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIF9fa21wc19nZXRfc2NoZWR1bGUoIGtpbmQsIG1vZGlmaWVyICk7CisgICAgI2Vsc2UKKwkvKiAgVE8gRE8gICovCisJLyogRm9yIHRoZSBwZXItdGFzayBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJvbHMgKi8KKyAgICAgICAgX19rbXBfZ2V0X3NjaGVkdWxlKCBfX2ttcF9lbnRyeV9ndGlkKCksIGtpbmQsIG1vZGlmaWVyICk7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX1NFVF9NQVhfQUNUSVZFX0xFVkVMUykoIGludCBLTVBfREVSRUYgYXJnICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKwkvLyBOb3RoaW5nLgorICAgICNlbHNlCisJLyogIFRPIERPICAqLworICAgICAgICAvKiBXZSB3YW50IHBlci10YXNrIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgaW50ZXJuYWwgY29udHJvbCAqLworICAgICAgICBfX2ttcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMoIF9fa21wX2VudHJ5X2d0aWQoKSwgS01QX0RFUkVGIGFyZyApOworICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0dFVF9NQVhfQUNUSVZFX0xFVkVMUykoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorCXJldHVybiAwOworICAgICNlbHNlCisJLyogIFRPIERPICAqLworCS8qIFdlIHdhbnQgcGVyLXRhc2sgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBpbnRlcm5hbCBjb250cm9sICovCisJcmV0dXJuIF9fa21wX2dldF9tYXhfYWN0aXZlX2xldmVscyggX19rbXBfZW50cnlfZ3RpZCgpICk7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fR0VUX0FDVElWRV9MRVZFTCkoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorCXJldHVybiAwOyAvLyByZXR1cm5zIDAgaWYgaXQgaXMgY2FsbGVkIGZyb20gdGhlIHNlcXVlbnRpYWwgcGFydCBvZiB0aGUgcHJvZ3JhbQorICAgICNlbHNlCisJLyogIFRPIERPICAqLworCS8qIEZvciB0aGUgcGVyLXRhc2sgaW1wbGVtZW50YXRpb24gb2YgdGhlIGludGVybmFsIGNvbnRyb2xzICovCisgICAgICAgIHJldHVybiBfX2ttcF9lbnRyeV90aHJlYWQoKSAtPiB0aC50aF90ZWFtIC0+IHQudF9hY3RpdmVfbGV2ZWw7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fR0VUX0xFVkVMKSggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisJcmV0dXJuIDA7IC8vIHJldHVybnMgMCBpZiBpdCBpcyBjYWxsZWQgZnJvbSB0aGUgc2VxdWVudGlhbCBwYXJ0IG9mIHRoZSBwcm9ncmFtCisgICAgI2Vsc2UKKwkvKiAgVE8gRE8gICovCisJLyogRm9yIHRoZSBwZXItdGFzayBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJvbHMgKi8KKyAgICAgICAgcmV0dXJuIF9fa21wX2VudHJ5X3RocmVhZCgpIC0+IHRoLnRoX3RlYW0gLT4gdC50X2xldmVsOworICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0dFVF9BTkNFU1RPUl9USFJFQURfTlVNKSggaW50IEtNUF9ERVJFRiBsZXZlbCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisJcmV0dXJuICggS01QX0RFUkVGIGxldmVsICkgPyAoIC0xICkgOiAoIDAgKTsKKyAgICAjZWxzZQorCXJldHVybiBfX2ttcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bSggX19rbXBfZW50cnlfZ3RpZCgpLCBLTVBfREVSRUYgbGV2ZWwgKTsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9HRVRfVEVBTV9TSVpFKSggaW50IEtNUF9ERVJFRiBsZXZlbCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIHJldHVybiAoIEtNUF9ERVJFRiBsZXZlbCApID8gKCAtMSApIDogKCAxICk7CisgICAgI2Vsc2UKKyAgICAgICAgcmV0dXJuIF9fa21wX2dldF90ZWFtX3NpemUoIF9fa21wX2VudHJ5X2d0aWQoKSwgS01QX0RFUkVGIGxldmVsICk7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fR0VUX1RIUkVBRF9MSU1JVCkoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorCXJldHVybiAxOyAgIC8vIFRPIERPOiBjbGFyaWZ5IHdoZXRoZXIgaXQgcmV0dXJucyAxIG9yIDA/CisgICAgI2Vsc2UKKyAgICAgICAgaWYgKCAhIF9fa21wX2luaXRfc2VyaWFsICkgeworICAgICAgICAgICAgX19rbXBfc2VyaWFsX2luaXRpYWxpemUoKTsKKyAgICAgICAgfTsKKyAgICAgICAgLyogZ2xvYmFsIElDViAqLworCXJldHVybiBfX2ttcF9tYXhfbnRoOworICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0lOX0ZJTkFMKSggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisJcmV0dXJuIDA7ICAgLy8gVE8gRE86IGNsYXJpZnkgd2hldGhlciBpdCByZXR1cm5zIDEgb3IgMD8KKyAgICAjZWxzZQorICAgICAgICBpZiAoICEgVENSXzQoX19rbXBfaW5pdF9wYXJhbGxlbCkgKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCXJldHVybiBfX2ttcF9lbnRyeV90aHJlYWQoKSAtPiB0aC50aF9jdXJyZW50X3Rhc2sgLT4gdGRfZmxhZ3MuZmluYWw7CisgICAgI2VuZGlmCit9CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorCisKK2ttcF9wcm9jX2JpbmRfdCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fR0VUX1BST0NfQklORCkoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICByZXR1cm4gX19rbXBzX2dldF9wcm9jX2JpbmQoKTsKKyAgICAjZWxzZQorICAgICAgICByZXR1cm4gZ2V0X19wcm9jX2JpbmQoIF9fa21wX2VudHJ5X3RocmVhZCgpICk7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fR0VUX05VTV9URUFNUykoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICByZXR1cm4gMTsKKyAgICAjZWxzZQorICAgICAgICBrbXBfaW5mb190ICp0aHIgPSBfX2ttcF9lbnRyeV90aHJlYWQoKTsKKyAgICAgICAgaWYgKCB0aHItPnRoLnRoX3RlYW1zX21pY3JvdGFzayApIHsKKyAgICAgICAgICAgIGttcF90ZWFtX3QgKnRlYW0gPSB0aHItPnRoLnRoX3RlYW07CisgICAgICAgICAgICBpbnQgdGxldmVsID0gdGhyLT50aC50aF90ZWFtc19sZXZlbDsKKyAgICAgICAgICAgIGludCBpaSA9IHRlYW0tPnQudF9sZXZlbDsgICAgICAgICAgICAvLyB0aGUgbGV2ZWwgb2YgdGhlIHRlYW1zIGNvbnN0cnVjdAorICAgICAgICAgICAgaW50IGRkID0gdGVhbSAtPiB0LnRfc2VyaWFsaXplZDsKKyAgICAgICAgICAgIGludCBsZXZlbCA9IHRsZXZlbCArIDE7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBpaSA+PSB0bGV2ZWwgKTsKKyAgICAgICAgICAgIHdoaWxlKCBpaSA+IGxldmVsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IoIGRkID0gdGVhbSAtPiB0LnRfc2VyaWFsaXplZDsgKCBkZCA+IDAgKSAmJiAoIGlpID4gbGV2ZWwgKTsgZGQtLSwgaWktLSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiggdGVhbSAtPiB0LnRfc2VyaWFsaXplZCAmJiAoICFkZCApICkgeworICAgICAgICAgICAgICAgICAgICB0ZWFtID0gdGVhbS0+dC50X3BhcmVudDsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKCBpaSA+IGxldmVsICkgeworICAgICAgICAgICAgICAgICAgICB0ZWFtID0gdGVhbS0+dC50X3BhcmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWktLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGRkID4gMSApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsgIC8vIHRlYW1zIHJlZ2lvbiBpcyBzZXJpYWxpemVkICggMSB0ZWFtIG9mIDEgdGhyZWFkICkuCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiB0ZWFtLT50LnRfcGFyZW50LT50LnRfbnByb2M7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0dFVF9URUFNX05VTSkoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICByZXR1cm4gMDsKKyAgICAjZWxzZQorICAgICAgICBrbXBfaW5mb190ICp0aHIgPSBfX2ttcF9lbnRyeV90aHJlYWQoKTsKKyAgICAgICAgaWYgKCB0aHItPnRoLnRoX3RlYW1zX21pY3JvdGFzayApIHsKKyAgICAgICAgICAgIGttcF90ZWFtX3QgKnRlYW0gPSB0aHItPnRoLnRoX3RlYW07CisgICAgICAgICAgICBpbnQgdGxldmVsID0gdGhyLT50aC50aF90ZWFtc19sZXZlbDsgLy8gdGhlIGxldmVsIG9mIHRoZSB0ZWFtcyBjb25zdHJ1Y3QKKyAgICAgICAgICAgIGludCBpaSA9IHRlYW0tPnQudF9sZXZlbDsKKyAgICAgICAgICAgIGludCBkZCA9IHRlYW0gLT4gdC50X3NlcmlhbGl6ZWQ7CisgICAgICAgICAgICBpbnQgbGV2ZWwgPSB0bGV2ZWwgKyAxOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggaWkgPj0gdGxldmVsICk7CisgICAgICAgICAgICB3aGlsZSggaWkgPiBsZXZlbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yKCBkZCA9IHRlYW0gLT4gdC50X3NlcmlhbGl6ZWQ7ICggZGQgPiAwICkgJiYgKCBpaSA+IGxldmVsICk7IGRkLS0sIGlpLS0gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoIHRlYW0gLT4gdC50X3NlcmlhbGl6ZWQgJiYgKCAhZGQgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgdGVhbSA9IHRlYW0tPnQudF9wYXJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiggaWkgPiBsZXZlbCApIHsKKyAgICAgICAgICAgICAgICAgICAgdGVhbSA9IHRlYW0tPnQudF9wYXJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlpLS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBkZCA+IDEgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7ICAvLyB0ZWFtcyByZWdpb24gaXMgc2VyaWFsaXplZCAoIDEgdGVhbSBvZiAxIHRocmVhZCApLgorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGVhbS0+dC50X21hc3Rlcl90aWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICNlbmRpZgorfQorCisjaWYgS01QX01JQyB8fCBLTVBfT1NfREFSV0lOCisKK3N0YXRpYyBpbnQgX19rbXBfZGVmYXVsdF9kZXZpY2UgPSAwOworCitpbnQgRlROX1NURENBTEwKK0ZUTl9HRVRfREVGQVVMVF9ERVZJQ0UoIHZvaWQgKQoreworICAgIHJldHVybiBfX2ttcF9kZWZhdWx0X2RldmljZTsKK30KKwordm9pZCBGVE5fU1REQ0FMTAorRlROX1NFVF9ERUZBVUxUX0RFVklDRSggaW50IEtNUF9ERVJFRiBhcmcgKQoreworICAgIF9fa21wX2RlZmF1bHRfZGV2aWNlID0gS01QX0RFUkVGIGFyZzsKK30KKworaW50IEZUTl9TVERDQUxMCitGVE5fR0VUX05VTV9ERVZJQ0VTKCB2b2lkICkKK3sKKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmIC8vIEtNUF9NSUMgfHwgS01QX09TX0RBUldJTgorCisjaWYgISBLTVBfT1NfTElOVVgKKworaW50IEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9JU19JTklUSUFMX0RFVklDRSkoIHZvaWQgKQoreworICAgIHJldHVybiAxOworfQorCisjZWxzZQorCisvLyBUaGlzIGludGVybmFsIGZ1bmN0aW9uIGlzIHVzZWQgd2hlbiB0aGUgZW50cnkgZnJvbSB0aGUgb2ZmbG9hZCBsaWJyYXJ5CisvLyBpcyBub3QgZm91bmQuCitpbnQgX09mZmxvYWRfZ2V0X2RldmljZV9udW1iZXIoIHZvaWQgKSAgX19hdHRyaWJ1dGVfXygod2VhaykpOworCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0lTX0lOSVRJQUxfREVWSUNFKSggdm9pZCApCit7CisgICAgaWYoIF9PZmZsb2FkX2dldF9kZXZpY2VfbnVtYmVyICkgeworICAgICAgICByZXR1cm4gX09mZmxvYWRfZ2V0X2RldmljZV9udW1iZXIoKSA9PSAtMTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9Cit9CisKKyNlbmRpZiAvLyAhIEtNUF9PU19MSU5VWAorCisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKworI2lmZGVmIEtNUF9TVFVCCit0eXBlZGVmIGVudW0geyBVTklOSVQgPSAtMSwgVU5MT0NLRUQsIExPQ0tFRCB9IGttcF9zdHViX2xvY2tfdDsKKyNlbmRpZiAvKiBLTVBfU1RVQiAqLworCisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKK3ZvaWQgRlROX1NURENBTEwKK0ZUTl9JTklUX0xPQ0tfV0lUSF9ISU5UKCB2b2lkICoqdXNlcl9sb2NrLCB1aW50cHRyX3QgS01QX0RFUkVGIGhpbnQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICAqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spID0gVU5MT0NLRUQ7CisgICAgI2Vsc2UKKyAgICAgICAgX19rbXBjX2luaXRfbG9ja193aXRoX2hpbnQoIE5VTEwsIF9fa21wX2VudHJ5X2d0aWQoKSwgdXNlcl9sb2NrLCBLTVBfREVSRUYgaGludCApOworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCitGVE5fSU5JVF9ORVNUX0xPQ0tfV0lUSF9ISU5UKCB2b2lkICoqdXNlcl9sb2NrLCB1aW50cHRyX3QgS01QX0RFUkVGIGhpbnQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICAqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spID0gVU5MT0NLRUQ7CisgICAgI2Vsc2UKKyAgICAgICAgX19rbXBjX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludCggTlVMTCwgX19rbXBfZW50cnlfZ3RpZCgpLCB1c2VyX2xvY2ssIEtNUF9ERVJFRiBoaW50ICk7CisgICAgI2VuZGlmCit9CisjZW5kaWYKKworLyogaW5pdGlhbGl6ZSB0aGUgbG9jayAqLwordm9pZCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fSU5JVF9MT0NLKSggdm9pZCAqKnVzZXJfbG9jayApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgICooKGttcF9zdHViX2xvY2tfdCAqKXVzZXJfbG9jaykgPSBVTkxPQ0tFRDsKKyAgICAjZWxzZQorICAgICAgICBfX2ttcGNfaW5pdF9sb2NrKCBOVUxMLCBfX2ttcF9lbnRyeV9ndGlkKCksIHVzZXJfbG9jayApOworICAgICNlbmRpZgorfQorCisvKiBpbml0aWFsaXplIHRoZSBsb2NrICovCit2b2lkIEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9JTklUX05FU1RfTE9DSykoIHZvaWQgKip1c2VyX2xvY2sgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICAqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spID0gVU5MT0NLRUQ7CisgICAgI2Vsc2UKKyAgICAgICAgX19rbXBjX2luaXRfbmVzdF9sb2NrKCBOVUxMLCBfX2ttcF9lbnRyeV9ndGlkKCksIHVzZXJfbG9jayApOworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9ERVNUUk9ZX0xPQ0spKCB2b2lkICoqdXNlcl9sb2NrICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgKigoa21wX3N0dWJfbG9ja190ICopdXNlcl9sb2NrKSA9IFVOSU5JVDsKKyAgICAjZWxzZQorICAgICAgICBfX2ttcGNfZGVzdHJveV9sb2NrKCBOVUxMLCBfX2ttcF9lbnRyeV9ndGlkKCksIHVzZXJfbG9jayApOworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9ERVNUUk9ZX05FU1RfTE9DSykoIHZvaWQgKip1c2VyX2xvY2sgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICAqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spID0gVU5JTklUOworICAgICNlbHNlCisgICAgICAgIF9fa21wY19kZXN0cm95X25lc3RfbG9jayggTlVMTCwgX19rbXBfZW50cnlfZ3RpZCgpLCB1c2VyX2xvY2sgKTsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fU0VUX0xPQ0spKCB2b2lkICoqdXNlcl9sb2NrICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgaWYgKCAqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spID09IFVOSU5JVCApIHsKKyAgICAgICAgICAgIC8vIFRPRE86IElzc3VlIGFuIGVycm9yLgorICAgICAgICB9OyAvLyBpZgorICAgICAgICBpZiAoICooKGttcF9zdHViX2xvY2tfdCAqKXVzZXJfbG9jaykgIT0gVU5MT0NLRUQgKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBJc3N1ZSBhbiBlcnJvci4KKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgKigoa21wX3N0dWJfbG9ja190ICopdXNlcl9sb2NrKSA9IExPQ0tFRDsKKyAgICAjZWxzZQorICAgICAgICBfX2ttcGNfc2V0X2xvY2soIE5VTEwsIF9fa21wX2VudHJ5X2d0aWQoKSwgdXNlcl9sb2NrICk7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX1NFVF9ORVNUX0xPQ0spKCB2b2lkICoqdXNlcl9sb2NrICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgaWYgKCAqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spID09IFVOSU5JVCApIHsKKyAgICAgICAgICAgIC8vIFRPRE86IElzc3VlIGFuIGVycm9yLgorICAgICAgICB9OyAvLyBpZgorICAgICAgICAoKigoaW50ICopdXNlcl9sb2NrKSkrKzsKKyAgICAjZWxzZQorICAgICAgICBfX2ttcGNfc2V0X25lc3RfbG9jayggTlVMTCwgX19rbXBfZW50cnlfZ3RpZCgpLCB1c2VyX2xvY2sgKTsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fVU5TRVRfTE9DSykoIHZvaWQgKip1c2VyX2xvY2sgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICBpZiAoICooKGttcF9zdHViX2xvY2tfdCAqKXVzZXJfbG9jaykgPT0gVU5JTklUICkgeworICAgICAgICAgICAgLy8gVE9ETzogSXNzdWUgYW4gZXJyb3IuCisgICAgICAgIH07IC8vIGlmCisgICAgICAgIGlmICggKigoa21wX3N0dWJfbG9ja190ICopdXNlcl9sb2NrKSA9PSBVTkxPQ0tFRCApIHsKKyAgICAgICAgICAgIC8vIFRPRE86IElzc3VlIGFuIGVycm9yLgorICAgICAgICB9OyAvLyBpZgorICAgICAgICAqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spID0gVU5MT0NLRUQ7CisgICAgI2Vsc2UKKyAgICAgICAgX19rbXBjX3Vuc2V0X2xvY2soIE5VTEwsIF9fa21wX2VudHJ5X2d0aWQoKSwgdXNlcl9sb2NrICk7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX1VOU0VUX05FU1RfTE9DSykoIHZvaWQgKip1c2VyX2xvY2sgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICBpZiAoICooKGttcF9zdHViX2xvY2tfdCAqKXVzZXJfbG9jaykgPT0gVU5JTklUICkgeworICAgICAgICAgICAgLy8gVE9ETzogSXNzdWUgYW4gZXJyb3IuCisgICAgICAgIH07IC8vIGlmCisgICAgICAgIGlmICggKigoa21wX3N0dWJfbG9ja190ICopdXNlcl9sb2NrKSA9PSBVTkxPQ0tFRCApIHsKKyAgICAgICAgICAgIC8vIFRPRE86IElzc3VlIGFuIGVycm9yLgorICAgICAgICB9OyAvLyBpZgorICAgICAgICAoKigoaW50ICopdXNlcl9sb2NrKSktLTsKKyAgICAjZWxzZQorICAgICAgICBfX2ttcGNfdW5zZXRfbmVzdF9sb2NrKCBOVUxMLCBfX2ttcF9lbnRyeV9ndGlkKCksIHVzZXJfbG9jayApOworICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX1RFU1RfTE9DSykoIHZvaWQgKip1c2VyX2xvY2sgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICBpZiAoICooKGttcF9zdHViX2xvY2tfdCAqKXVzZXJfbG9jaykgPT0gVU5JTklUICkgeworICAgICAgICAgICAgLy8gVE9ETzogSXNzdWUgYW4gZXJyb3IuCisgICAgICAgIH07IC8vIGlmCisgICAgICAgIGlmICggKigoa21wX3N0dWJfbG9ja190ICopdXNlcl9sb2NrKSA9PSBMT0NLRUQgKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgKigoa21wX3N0dWJfbG9ja190ICopdXNlcl9sb2NrKSA9IExPQ0tFRDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgI2Vsc2UKKyAgICAgICAgcmV0dXJuIF9fa21wY190ZXN0X2xvY2soIE5VTEwsIF9fa21wX2VudHJ5X2d0aWQoKSwgdXNlcl9sb2NrICk7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fVEVTVF9ORVNUX0xPQ0spKCB2b2lkICoqdXNlcl9sb2NrICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgaWYgKCAqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spID09IFVOSU5JVCApIHsKKyAgICAgICAgICAgIC8vIFRPRE86IElzc3VlIGFuIGVycm9yLgorICAgICAgICB9OyAvLyBpZgorICAgICAgICByZXR1cm4gKysoKigoaW50ICopdXNlcl9sb2NrKSk7CisgICAgI2Vsc2UKKyAgICAgICAgcmV0dXJuIF9fa21wY190ZXN0X25lc3RfbG9jayggTlVMTCwgX19rbXBfZW50cnlfZ3RpZCgpLCB1c2VyX2xvY2sgKTsKKyAgICAjZW5kaWYKK30KKworZG91YmxlIEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9HRVRfV1RJTUUpKCB2b2lkICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgcmV0dXJuIF9fa21wc19nZXRfd3RpbWUoKTsKKyAgICAjZWxzZQorICAgICAgICBkb3VibGUgZGF0YTsKKyAgICAgICAgI2lmICEgS01QX09TX0xJTlVYCisgICAgICAgIC8vIFdlIGRvbid0IG5lZWQgbGlicmFyeSBpbml0aWFsaXphdGlvbiB0byBnZXQgdGhlIHRpbWUgb24gTGludXgqIE9TLgorICAgICAgICAvLyBUaGUgcm91dGluZSBjYW4gYmUgdXNlZCB0byBtZWFzdXJlIGxpYnJhcnkgaW5pdGlhbGl6YXRpb24gdGltZSBvbiBMaW51eCogT1Mgbm93LgorICAgICAgICBpZiAoICEgX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgICAgICBfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZSgpOworICAgICAgICB9OworICAgICAgICAjZW5kaWYKKyAgICAgICAgX19rbXBfZWxhcHNlZCggJiBkYXRhICk7CisgICAgICAgIHJldHVybiBkYXRhOworICAgICNlbmRpZgorfQorCitkb3VibGUgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0dFVF9XVElDSykoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICByZXR1cm4gX19rbXBzX2dldF93dGljaygpOworICAgICNlbHNlCisgICAgICAgIGRvdWJsZSBkYXRhOworICAgICAgICBpZiAoICEgX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgICAgICBfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZSgpOworICAgICAgICB9OworICAgICAgICBfX2ttcF9lbGFwc2VkX3RpY2soICYgZGF0YSApOworICAgICAgICByZXR1cm4gZGF0YTsKKyAgICAjZW5kaWYKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgKiBGVE5fU1REQ0FMTAorRlROX01BTExPQyggc2l6ZV90IEtNUF9ERVJFRiBzaXplICkKK3sKKyAgICAvLyBrbXBjX21hbGxvYyBpbml0aWFsaXplcyB0aGUgbGlicmFyeSBpZiBuZWVkZWQKKyAgICByZXR1cm4ga21wY19tYWxsb2MoIEtNUF9ERVJFRiBzaXplICk7Cit9CisKK3ZvaWQgKiBGVE5fU1REQ0FMTAorRlROX0NBTExPQyggc2l6ZV90IEtNUF9ERVJFRiBuZWxlbSwgc2l6ZV90IEtNUF9ERVJFRiBlbHNpemUgKQoreworICAgIC8vIGttcGNfY2FsbG9jIGluaXRpYWxpemVzIHRoZSBsaWJyYXJ5IGlmIG5lZWRlZAorICAgIHJldHVybiBrbXBjX2NhbGxvYyggS01QX0RFUkVGIG5lbGVtLCBLTVBfREVSRUYgZWxzaXplICk7Cit9CisKK3ZvaWQgKiBGVE5fU1REQ0FMTAorRlROX1JFQUxMT0MoIHZvaWQgKiBLTVBfREVSRUYgcHRyLCBzaXplX3QgS01QX0RFUkVGIHNpemUgKQoreworICAgIC8vIGttcGNfcmVhbGxvYyBpbml0aWFsaXplcyB0aGUgbGlicmFyeSBpZiBuZWVkZWQKKyAgICByZXR1cm4ga21wY19yZWFsbG9jKCBLTVBfREVSRUYgcHRyLCBLTVBfREVSRUYgc2l6ZSApOworfQorCit2b2lkIEZUTl9TVERDQUxMCitGVE5fRlJFRSggdm9pZCAqIEtNUF9ERVJFRiBwdHIgKQoreworICAgIC8vIGRvZXMgbm90aGluZyBpZiB0aGUgbGlicmFyeSBpcyBub3QgaW5pdGlhbGl6ZWQKKyAgICBrbXBjX2ZyZWUoIEtNUF9ERVJFRiBwdHIgKTsKK30KKwordm9pZCBGVE5fU1REQ0FMTAorRlROX1NFVF9XQVJOSU5HU19PTiggdm9pZCApCit7CisgICAgI2lmbmRlZiBLTVBfU1RVQgorICAgICAgICBfX2ttcF9nZW5lcmF0ZV93YXJuaW5ncyA9IGttcF93YXJuaW5nc19leHBsaWNpdDsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAorRlROX1NFVF9XQVJOSU5HU19PRkYoIHZvaWQgKQoreworICAgICNpZm5kZWYgS01QX1NUVUIKKyAgICAgICAgX19rbXBfZ2VuZXJhdGVfd2FybmluZ3MgPSBGQUxTRTsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAorRlROX1NFVF9ERUZBVUxUUyggY2hhciBjb25zdCAqIHN0cgorICAgICNpZm5kZWYgUEFTU19BUkdTX0JZX1ZBTFVFCisgICAgICAgICwgaW50IGxlbgorICAgICNlbmRpZgorKQoreworICAgICNpZm5kZWYgS01QX1NUVUIKKyAgICAgICAgI2lmZGVmIFBBU1NfQVJHU19CWV9WQUxVRQorICAgICAgICAgICAgaW50IGxlbiA9IChpbnQpS01QX1NUUkxFTiggc3RyICk7CisgICAgICAgICNlbmRpZgorICAgICAgICBfX2ttcF9hdXhfc2V0X2RlZmF1bHRzKCBzdHIsIGxlbiApOworICAgICNlbmRpZgorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisjaWYgT01QXzQwX0VOQUJMRUQKKy8qIHJldHVybnMgdGhlIHN0YXR1cyBvZiBjYW5jZWxsYXRpb24gKi8KK2ludCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fR0VUX0NBTkNFTExBVElPTikodm9pZCkgeworI2lmZGVmIEtNUF9TVFVCCisgICAgcmV0dXJuIDAgLyogZmFsc2UgKi87CisjZWxzZQorICAgIC8vIGluaXRpYWxpemUgdGhlIGxpYnJhcnkgaWYgbmVlZGVkCisgICAgaWYgKCAhIF9fa21wX2luaXRfc2VyaWFsICkgeworICAgICAgICBfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZSgpOworICAgIH0KKyAgICByZXR1cm4gX19rbXBfb21wX2NhbmNlbGxhdGlvbjsKKyNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK0ZUTl9HRVRfQ0FOQ0VMTEFUSU9OX1NUQVRVUyhpbnQgY2FuY2VsX2tpbmQpIHsKKyNpZmRlZiBLTVBfU1RVQgorICAgIHJldHVybiAwIC8qIGZhbHNlICovOworI2Vsc2UKKyAgICByZXR1cm4gX19rbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMoY2FuY2VsX2tpbmQpOworI2VuZGlmCit9CisKKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorCisvLyBHQ0MgY29tcGF0aWJpbGl0eSAodmVyc2lvbmVkIHN5bWJvbHMpCisjaWZkZWYgS01QX1VTRV9WRVJTSU9OX1NZTUJPTFMKKworLyoKKyAgICBUaGVzZSBmb2xsb3dpbmcgc2VjdGlvbnMgY3JlYXRlIGZ1bmN0aW9uIGFsaWFzZXMgKGR1bW15IHN5bWJvbHMpIGZvciB0aGUgb21wXyogcm91dGluZXMuCisgICAgVGhlc2UgYWxpYXNlcyB3aWxsIHRoZW4gYmUgdmVyc2lvbmVkIGFjY29yZGluZyB0byBob3cgbGliZ29tcCBgYHZlcnNpb25zJycgaXRzCisgICAgc3ltYm9scyAoT01QXzEuMCwgT01QXzIuMCwgT01QXzMuMCwgLi4uKSB3aGlsZSBhbHNvIHJldGFpbmluZyB0aGUKKyAgICBkZWZhdWx0IHZlcnNpb24gd2hpY2ggbGlib21wIHVzZXM6IFZFUlNJT04gKGRlZmluZWQgaW4gZXhwb3J0c19zby50eHQpCisgICAgSWYgeW91IHdhbnQgdG8gc2VlIHRoZSB2ZXJzaW9uZWQgc3ltYm9scyBmb3IgbGliZ29tcC5zby4xIHRoZW4ganVzdCB0eXBlOgorCisgICAgb2JqZHVtcCAtVCAvcGF0aC90by9saWJnb21wLnNvLjEgfCBncmVwIG9tcF8KKworICAgIEV4YW1wbGU6CisgICAgU3RlcCAxKSAgQ3JlYXRlIF9fa21wX2FwaV9vbXBfc2V0X251bV90aHJlYWRzXzEwX2FsaWFzCisgICAgICAgICAgICAgd2hpY2ggaXMgYWxpYXMgb2YgX19rbXBfYXBpX29tcF9zZXRfbnVtX3RocmVhZHMKKyAgICBTdGVwIDIpICBTZXQgX19rbXBfYXBpX29tcF9zZXRfbnVtX3RocmVhZHNfMTBfYWxpYXMgdG8gdmVyc2lvbjogb21wX3NldF9udW1fdGhyZWFkc0BPTVBfMS4wCisgICAgU3RlcCAyQikgU2V0IF9fa21wX2FwaV9vbXBfc2V0X251bV90aHJlYWRzIHRvIGRlZmF1bHQgdmVyc2lvbiA6IG9tcF9zZXRfbnVtX3RocmVhZHNAQFZFUlNJT04KKyovCisKKy8vIE9NUF8xLjAgYWxpYXNlcworeGFsaWFzaWZ5KEZUTl9TRVRfTlVNX1RIUkVBRFMsICAgMTApOworeGFsaWFzaWZ5KEZUTl9HRVRfTlVNX1RIUkVBRFMsICAgMTApOworeGFsaWFzaWZ5KEZUTl9HRVRfTUFYX1RIUkVBRFMsICAgMTApOworeGFsaWFzaWZ5KEZUTl9HRVRfVEhSRUFEX05VTSwgICAgMTApOworeGFsaWFzaWZ5KEZUTl9HRVRfTlVNX1BST0NTLCAgICAgMTApOworeGFsaWFzaWZ5KEZUTl9JTl9QQVJBTExFTCwgICAgICAgMTApOworeGFsaWFzaWZ5KEZUTl9TRVRfRFlOQU1JQywgICAgICAgMTApOworeGFsaWFzaWZ5KEZUTl9HRVRfRFlOQU1JQywgICAgICAgMTApOworeGFsaWFzaWZ5KEZUTl9TRVRfTkVTVEVELCAgICAgICAgMTApOworeGFsaWFzaWZ5KEZUTl9HRVRfTkVTVEVELCAgICAgICAgMTApOworeGFsaWFzaWZ5KEZUTl9JTklUX0xPQ0ssICAgICAgICAgMTApOworeGFsaWFzaWZ5KEZUTl9JTklUX05FU1RfTE9DSywgICAgMTApOworeGFsaWFzaWZ5KEZUTl9ERVNUUk9ZX0xPQ0ssICAgICAgMTApOworeGFsaWFzaWZ5KEZUTl9ERVNUUk9ZX05FU1RfTE9DSywgMTApOworeGFsaWFzaWZ5KEZUTl9TRVRfTE9DSywgICAgICAgICAgMTApOworeGFsaWFzaWZ5KEZUTl9TRVRfTkVTVF9MT0NLLCAgICAgMTApOworeGFsaWFzaWZ5KEZUTl9VTlNFVF9MT0NLLCAgICAgICAgMTApOworeGFsaWFzaWZ5KEZUTl9VTlNFVF9ORVNUX0xPQ0ssICAgMTApOworeGFsaWFzaWZ5KEZUTl9URVNUX0xPQ0ssICAgICAgICAgMTApOworeGFsaWFzaWZ5KEZUTl9URVNUX05FU1RfTE9DSywgICAgMTApOworCisvLyBPTVBfMi4wIGFsaWFzZXMKK3hhbGlhc2lmeShGVE5fR0VUX1dUSUNLLCAyMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9XVElNRSwgMjApOworCisvLyBPTVBfMy4wIGFsaWFzZXMKK3hhbGlhc2lmeShGVE5fU0VUX1NDSEVEVUxFLCAgICAgICAgICAgIDMwKTsKK3hhbGlhc2lmeShGVE5fR0VUX1NDSEVEVUxFLCAgICAgICAgICAgIDMwKTsKK3hhbGlhc2lmeShGVE5fR0VUX1RIUkVBRF9MSU1JVCwgICAgICAgIDMwKTsKK3hhbGlhc2lmeShGVE5fU0VUX01BWF9BQ1RJVkVfTEVWRUxTLCAgIDMwKTsKK3hhbGlhc2lmeShGVE5fR0VUX01BWF9BQ1RJVkVfTEVWRUxTLCAgIDMwKTsKK3hhbGlhc2lmeShGVE5fR0VUX0xFVkVMLCAgICAgICAgICAgICAgIDMwKTsKK3hhbGlhc2lmeShGVE5fR0VUX0FOQ0VTVE9SX1RIUkVBRF9OVU0sIDMwKTsKK3hhbGlhc2lmeShGVE5fR0VUX1RFQU1fU0laRSwgICAgICAgICAgIDMwKTsKK3hhbGlhc2lmeShGVE5fR0VUX0FDVElWRV9MRVZFTCwgICAgICAgIDMwKTsKK3hhbGlhc2lmeShGVE5fSU5JVF9MT0NLLCAgICAgICAgICAgICAgIDMwKTsKK3hhbGlhc2lmeShGVE5fSU5JVF9ORVNUX0xPQ0ssICAgICAgICAgIDMwKTsKK3hhbGlhc2lmeShGVE5fREVTVFJPWV9MT0NLLCAgICAgICAgICAgIDMwKTsKK3hhbGlhc2lmeShGVE5fREVTVFJPWV9ORVNUX0xPQ0ssICAgICAgIDMwKTsKK3hhbGlhc2lmeShGVE5fU0VUX0xPQ0ssICAgICAgICAgICAgICAgIDMwKTsKK3hhbGlhc2lmeShGVE5fU0VUX05FU1RfTE9DSywgICAgICAgICAgIDMwKTsKK3hhbGlhc2lmeShGVE5fVU5TRVRfTE9DSywgICAgICAgICAgICAgIDMwKTsKK3hhbGlhc2lmeShGVE5fVU5TRVRfTkVTVF9MT0NLLCAgICAgICAgIDMwKTsKK3hhbGlhc2lmeShGVE5fVEVTVF9MT0NLLCAgICAgICAgICAgICAgIDMwKTsKK3hhbGlhc2lmeShGVE5fVEVTVF9ORVNUX0xPQ0ssICAgICAgICAgIDMwKTsKKworLy8gT01QXzMuMSBhbGlhc2VzCit4YWxpYXNpZnkoRlROX0lOX0ZJTkFMLCAzMSk7CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorLy8gT01QXzQuMCBhbGlhc2VzCit4YWxpYXNpZnkoRlROX0dFVF9QUk9DX0JJTkQsIDQwKTsKK3hhbGlhc2lmeShGVE5fR0VUX05VTV9URUFNUywgNDApOworeGFsaWFzaWZ5KEZUTl9HRVRfVEVBTV9OVU0sIDQwKTsKK3hhbGlhc2lmeShGVE5fR0VUX0NBTkNFTExBVElPTiwgNDApOworeGFsaWFzaWZ5KEZUTl9JU19JTklUSUFMX0RFVklDRSwgNDApOworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKyNpZiBPTVBfNDFfRU5BQkxFRAorLy8gT01QXzQuMSBhbGlhc2VzCisjZW5kaWYKKworI2lmIE9NUF81MF9FTkFCTEVECisvLyBPTVBfNS4wIGFsaWFzZXMKKyNlbmRpZgorCisvLyBPTVBfMS4wIHZlcnNpb25lZCBzeW1ib2xzCit4dmVyc2lvbmlmeShGVE5fU0VUX05VTV9USFJFQURTLCAgIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX0dFVF9OVU1fVEhSRUFEUywgICAxMCwgIk9NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9HRVRfTUFYX1RIUkVBRFMsICAgMTAsICJPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShGVE5fR0VUX1RIUkVBRF9OVU0sICAgIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX0dFVF9OVU1fUFJPQ1MsICAgICAxMCwgIk9NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9JTl9QQVJBTExFTCwgICAgICAgMTAsICJPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShGVE5fU0VUX0RZTkFNSUMsICAgICAgIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX0dFVF9EWU5BTUlDLCAgICAgICAxMCwgIk9NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9TRVRfTkVTVEVELCAgICAgICAgMTAsICJPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShGVE5fR0VUX05FU1RFRCwgICAgICAgIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX0lOSVRfTE9DSywgICAgICAgICAxMCwgIk9NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9JTklUX05FU1RfTE9DSywgICAgMTAsICJPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShGVE5fREVTVFJPWV9MT0NLLCAgICAgIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX0RFU1RST1lfTkVTVF9MT0NLLCAxMCwgIk9NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9TRVRfTE9DSywgICAgICAgICAgMTAsICJPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShGVE5fU0VUX05FU1RfTE9DSywgICAgIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX1VOU0VUX0xPQ0ssICAgICAgICAxMCwgIk9NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9VTlNFVF9ORVNUX0xPQ0ssICAgMTAsICJPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShGVE5fVEVTVF9MT0NLLCAgICAgICAgIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX1RFU1RfTkVTVF9MT0NLLCAgICAxMCwgIk9NUF8xLjAiKTsKKworLy8gT01QXzIuMCB2ZXJzaW9uZWQgc3ltYm9scworeHZlcnNpb25pZnkoRlROX0dFVF9XVElDSywgICAgICAgICAyMCwgIk9NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9HRVRfV1RJTUUsICAgICAgICAgMjAsICJPTVBfMi4wIik7CisKKy8vIE9NUF8zLjAgdmVyc2lvbmVkIHN5bWJvbHMKK3h2ZXJzaW9uaWZ5KEZUTl9TRVRfU0NIRURVTEUsICAgICAgMzAsICJPTVBfMy4wIik7Cit4dmVyc2lvbmlmeShGVE5fR0VUX1NDSEVEVUxFLCAgICAgIDMwLCAiT01QXzMuMCIpOworeHZlcnNpb25pZnkoRlROX0dFVF9USFJFQURfTElNSVQsICAgICAgICAzMCwgIk9NUF8zLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9TRVRfTUFYX0FDVElWRV9MRVZFTFMsICAgMzAsICJPTVBfMy4wIik7Cit4dmVyc2lvbmlmeShGVE5fR0VUX01BWF9BQ1RJVkVfTEVWRUxTLCAgIDMwLCAiT01QXzMuMCIpOworeHZlcnNpb25pZnkoRlROX0dFVF9BTkNFU1RPUl9USFJFQURfTlVNLCAzMCwgIk9NUF8zLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9HRVRfTEVWRUwsICAgICAgICAgICAgICAgMzAsICJPTVBfMy4wIik7Cit4dmVyc2lvbmlmeShGVE5fR0VUX1RFQU1fU0laRSwgICAgIDMwLCAiT01QXzMuMCIpOworeHZlcnNpb25pZnkoRlROX0dFVF9BQ1RJVkVfTEVWRUwsICAzMCwgIk9NUF8zLjAiKTsKKworLy8gdGhlIGxvY2sgcm91dGluZXMgaGF2ZSBhIDEuMCBhbmQgMy4wIHZlcnNpb24KK3h2ZXJzaW9uaWZ5KEZUTl9JTklUX0xPQ0ssICAgICAgICAgMzAsICJPTVBfMy4wIik7Cit4dmVyc2lvbmlmeShGVE5fSU5JVF9ORVNUX0xPQ0ssICAgIDMwLCAiT01QXzMuMCIpOworeHZlcnNpb25pZnkoRlROX0RFU1RST1lfTE9DSywgICAgICAzMCwgIk9NUF8zLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9ERVNUUk9ZX05FU1RfTE9DSywgMzAsICJPTVBfMy4wIik7Cit4dmVyc2lvbmlmeShGVE5fU0VUX0xPQ0ssICAgICAgICAgIDMwLCAiT01QXzMuMCIpOworeHZlcnNpb25pZnkoRlROX1NFVF9ORVNUX0xPQ0ssICAgICAzMCwgIk9NUF8zLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9VTlNFVF9MT0NLLCAgICAgICAgMzAsICJPTVBfMy4wIik7Cit4dmVyc2lvbmlmeShGVE5fVU5TRVRfTkVTVF9MT0NLLCAgIDMwLCAiT01QXzMuMCIpOworeHZlcnNpb25pZnkoRlROX1RFU1RfTE9DSywgICAgICAgICAzMCwgIk9NUF8zLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9URVNUX05FU1RfTE9DSywgICAgMzAsICJPTVBfMy4wIik7CisKKy8vIE9NUF8zLjEgdmVyc2lvbmVkIHN5bWJvbAoreHZlcnNpb25pZnkoRlROX0lOX0ZJTkFMLCAgICAgICAgICAzMSwgIk9NUF8zLjEiKTsKKworI2lmIE9NUF80MF9FTkFCTEVECisvLyBPTVBfNC4wIHZlcnNpb25lZCBzeW1ib2xzCit4dmVyc2lvbmlmeShGVE5fR0VUX1BST0NfQklORCwgICAgIDQwLCAiT01QXzQuMCIpOworeHZlcnNpb25pZnkoRlROX0dFVF9OVU1fVEVBTVMsICAgICA0MCwgIk9NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9HRVRfVEVBTV9OVU0sICAgICAgNDAsICJPTVBfNC4wIik7Cit4dmVyc2lvbmlmeShGVE5fR0VUX0NBTkNFTExBVElPTiwgIDQwLCAiT01QXzQuMCIpOworeHZlcnNpb25pZnkoRlROX0lTX0lOSVRJQUxfREVWSUNFLCA0MCwgIk9NUF80LjAiKTsKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisjaWYgT01QXzQxX0VOQUJMRUQKKy8vIE9NUF80LjEgdmVyc2lvbmVkIHN5bWJvbHMKKyNlbmRpZgorCisjaWYgT01QXzUwX0VOQUJMRUQKKy8vIE9NUF81LjAgdmVyc2lvbmVkIHN5bWJvbHMKKyNlbmRpZgorCisjZW5kaWYgLy8gS01QX1VTRV9WRVJTSU9OX1NZTUJPTFMKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgfSAvL2V4dGVybiAiQyIKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisvLyBlbmQgb2YgZmlsZSAvLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2Z0bl9leHRyYS5jIGIvZmluYWwvcnVudGltZS9zcmMva21wX2Z0bl9leHRyYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMGZiNGMKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZnRuX2V4dHJhLmMKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIGttcF9mdG5fZXh0cmEuYyAtLSBGb3J0cmFuICdleHRyYScgbGlua2FnZSBzdXBwb3J0IGZvciBPcGVuTVAuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKworI2lmIEtNUF9PU19XSU5ET1dTCisjICAgZGVmaW5lIEtNUF9GVE5fRU5UUklFUyBLTVBfRlROX1BMQUlOCisjZWxpZiBLTVBfT1NfVU5JWAorIyAgIGRlZmluZSBLTVBfRlROX0VOVFJJRVMgS01QX0ZUTl9BUFBFTkQKKyNlbmRpZgorCisvLyBOb3RlOiBUaGlzIHN0cmluZyBpcyBub3QgcHJpbnRlZCB3aGVuIEtNUF9WRVJTSU9OPTEuCitjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fZnRuZXh0cmFbXSA9IEtNUF9WRVJTSU9OX1BSRUZJWCAiRm9ydHJhbiBcImV4dHJhXCIgT01QIHN1cHBvcnQ6ICIKKyNpZmRlZiBLTVBfRlROX0VOVFJJRVMKKyAgICAieWVzIjsKKyMgICBkZWZpbmUgRlROX1NURENBTEwgLyogbm90aGluZyB0byBkbyAqLworIyAgIGluY2x1ZGUgImttcF9mdG5fb3MuaCIKKyMgICBpbmNsdWRlICJrbXBfZnRuX2VudHJ5LmgiCisjZWxzZQorICAgICJubyI7CisjZW5kaWYgLyogS01QX0ZUTl9FTlRSSUVTICovCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfZnRuX29zLmggYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZnRuX29zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI0MTI2MAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9mdG5fb3MuaApAQCAtMCwwICsxLDUzMiBAQAorLyoKKyAqIGttcF9mdG5fb3MuaCAtLSBLUFRTIEZvcnRyYW4gZGVmaW5lcyBoZWFkZXIgZmlsZS4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBLTVBfRlROX09TX0gKKyNkZWZpbmUgS01QX0ZUTl9PU19ICisKKy8vIEtNUF9GTlRfRU5UUklFUyBtYXkgYmUgb25lIG9mOiBLTVBfRlROX1BMQUlOLCBLTVBfRlROX1VQUEVSLCBLTVBfRlROX0FQUEVORCwgS01QX0ZUTl9VQVBQRU5ELgorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEV4dGVybmFsIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgS01QX0ZUTl9FTlRSSUVTID09IEtNUF9GVE5fUExBSU4KKworICAgICNkZWZpbmUgRlROX1NFVF9TVEFDS1NJWkUgICAgICAgICAgICAgICAgICAgIGttcF9zZXRfc3RhY2tzaXplCisgICAgI2RlZmluZSBGVE5fU0VUX1NUQUNLU0laRV9TICAgICAgICAgICAgICAgICAga21wX3NldF9zdGFja3NpemVfcworICAgICNkZWZpbmUgRlROX0dFVF9TVEFDS1NJWkUgICAgICAgICAgICAgICAgICAgIGttcF9nZXRfc3RhY2tzaXplCisgICAgI2RlZmluZSBGVE5fR0VUX1NUQUNLU0laRV9TICAgICAgICAgICAgICAgICAga21wX2dldF9zdGFja3NpemVfcworICAgICNkZWZpbmUgRlROX1NFVF9CTE9DS1RJTUUgICAgICAgICAgICAgICAgICAgIGttcF9zZXRfYmxvY2t0aW1lCisgICAgI2RlZmluZSBGVE5fR0VUX0JMT0NLVElNRSAgICAgICAgICAgICAgICAgICAga21wX2dldF9ibG9ja3RpbWUKKyAgICAjZGVmaW5lIEZUTl9TRVRfTElCUkFSWV9TRVJJQUwgICAgICAgICAgICAgICBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsCisgICAgI2RlZmluZSBGVE5fU0VUX0xJQlJBUllfVFVSTkFST1VORCAgICAgICAgICAga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyAgICAjZGVmaW5lIEZUTl9TRVRfTElCUkFSWV9USFJPVUdIUFVUICAgICAgICAgICBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZICAgICAgICAgICAgICAgICAgICAgIGttcF9zZXRfbGlicmFyeQorICAgICNkZWZpbmUgRlROX0dFVF9MSUJSQVJZICAgICAgICAgICAgICAgICAgICAgIGttcF9nZXRfbGlicmFyeQorICAgICNkZWZpbmUgRlROX1NFVF9ERUZBVUxUUyAgICAgICAgICAgICAgICAgICAgIGttcF9zZXRfZGVmYXVsdHMKKyAgICAjZGVmaW5lIEZUTl9TRVRfQUZGSU5JVFkgICAgICAgICAgICAgICAgICAgICBrbXBfc2V0X2FmZmluaXR5CisgICAgI2RlZmluZSBGVE5fR0VUX0FGRklOSVRZICAgICAgICAgICAgICAgICAgICAga21wX2dldF9hZmZpbml0eQorICAgICNkZWZpbmUgRlROX0dFVF9BRkZJTklUWV9NQVhfUFJPQyAgICAgICAgICAgIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyAgICAjZGVmaW5lIEZUTl9DUkVBVEVfQUZGSU5JVFlfTUFTSyAgICAgICAgICAgICBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKyAgICAjZGVmaW5lIEZUTl9ERVNUUk9ZX0FGRklOSVRZX01BU0sgICAgICAgICAgICBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCisgICAgI2RlZmluZSBGVE5fU0VUX0FGRklOSVRZX01BU0tfUFJPQyAgICAgICAgICAga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAjZGVmaW5lIEZUTl9VTlNFVF9BRkZJTklUWV9NQVNLX1BST0MgICAgICAgICBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgI2RlZmluZSBGVE5fR0VUX0FGRklOSVRZX01BU0tfUFJPQyAgICAgICAgICAga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICNkZWZpbmUgRlROX01BTExPQyAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9tYWxsb2MKKyAgICAjZGVmaW5lIEZUTl9DQUxMT0MgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfY2FsbG9jCisgICAgI2RlZmluZSBGVE5fUkVBTExPQyAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3JlYWxsb2MKKyAgICAjZGVmaW5lIEZUTl9GUkVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfZnJlZQorCisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9LTk9XTl9USFJFQURTICAgICAgICAgICAga21wX2dldF9udW1fa25vd25fdGhyZWFkcworCisgICAgI2RlZmluZSBGVE5fU0VUX05VTV9USFJFQURTICAgICAgICAgICAgICAgICAgb21wX3NldF9udW1fdGhyZWFkcworICAgICNkZWZpbmUgRlROX0dFVF9OVU1fVEhSRUFEUyAgICAgICAgICAgICAgICAgIG9tcF9nZXRfbnVtX3RocmVhZHMKKyAgICAjZGVmaW5lIEZUTl9HRVRfTUFYX1RIUkVBRFMgICAgICAgICAgICAgICAgICBvbXBfZ2V0X21heF90aHJlYWRzCisgICAgI2RlZmluZSBGVE5fR0VUX1RIUkVBRF9OVU0gICAgICAgICAgICAgICAgICAgb21wX2dldF90aHJlYWRfbnVtCisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9QUk9DUyAgICAgICAgICAgICAgICAgICAgb21wX2dldF9udW1fcHJvY3MKKyAgICAjZGVmaW5lIEZUTl9TRVRfRFlOQU1JQyAgICAgICAgICAgICAgICAgICAgICBvbXBfc2V0X2R5bmFtaWMKKyAgICAjZGVmaW5lIEZUTl9HRVRfRFlOQU1JQyAgICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X2R5bmFtaWMKKyAgICAjZGVmaW5lIEZUTl9TRVRfTkVTVEVEICAgICAgICAgICAgICAgICAgICAgICBvbXBfc2V0X25lc3RlZAorICAgICNkZWZpbmUgRlROX0dFVF9ORVNURUQgICAgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfbmVzdGVkCisgICAgI2RlZmluZSBGVE5fSU5fUEFSQUxMRUwgICAgICAgICAgICAgICAgICAgICAgb21wX2luX3BhcmFsbGVsCisgICAgI2RlZmluZSBGVE5fR0VUX1RIUkVBRF9MSU1JVCAgICAgICAgICAgICAgICAgb21wX2dldF90aHJlYWRfbGltaXQKKyAgICAjZGVmaW5lIEZUTl9TRVRfU0NIRURVTEUgICAgICAgICAgICAgICAgICAgICBvbXBfc2V0X3NjaGVkdWxlCisgICAgI2RlZmluZSBGVE5fR0VUX1NDSEVEVUxFICAgICAgICAgICAgICAgICAgICAgb21wX2dldF9zY2hlZHVsZQorICAgICNkZWZpbmUgRlROX1NFVF9NQVhfQUNUSVZFX0xFVkVMUyAgICAgICAgICAgIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyAgICAjZGVmaW5lIEZUTl9HRVRfTUFYX0FDVElWRV9MRVZFTFMgICAgICAgICAgICBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCisgICAgI2RlZmluZSBGVE5fR0VUX0FDVElWRV9MRVZFTCAgICAgICAgICAgICAgICAgb21wX2dldF9hY3RpdmVfbGV2ZWwKKyAgICAjZGVmaW5lIEZUTl9HRVRfTEVWRUwgICAgICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X2xldmVsCisgICAgI2RlZmluZSBGVE5fR0VUX0FOQ0VTVE9SX1RIUkVBRF9OVU0gICAgICAgICAgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisgICAgI2RlZmluZSBGVE5fR0VUX1RFQU1fU0laRSAgICAgICAgICAgICAgICAgICAgb21wX2dldF90ZWFtX3NpemUKKyAgICAjZGVmaW5lIEZUTl9JTl9GSU5BTCAgICAgICAgICAgICAgICAgICAgICAgICBvbXBfaW5fZmluYWwKKy8vICAjZGVmaW5lIEZUTl9TRVRfUFJPQ19CSU5EICAgICAgICAgICAgICAgICAgICBvbXBfc2V0X3Byb2NfYmluZAorICAgICNkZWZpbmUgRlROX0dFVF9QUk9DX0JJTkQgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfcHJvY19iaW5kCisvLyAgI2RlZmluZSBGVE5fQ1VSUl9QUk9DX0JJTkQgICAgICAgICAgICAgICAgICAgb21wX2N1cnJfcHJvY19iaW5kCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX1RFQU1TICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X251bV90ZWFtcworICAgICNkZWZpbmUgRlROX0dFVF9URUFNX05VTSAgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfdGVhbV9udW0KKyNlbmRpZgorICAgICNkZWZpbmUgRlROX0lOSVRfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgIG9tcF9pbml0X2xvY2sKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworICAgICNkZWZpbmUgRlROX0lOSVRfTE9DS19XSVRIX0hJTlQgICAgICAgICAgICAgIG9tcF9pbml0X2xvY2tfd2l0aF9oaW50CisgICAgI2RlZmluZSBGVE5fSU5JVF9ORVNUX0xPQ0tfV0lUSF9ISU5UICAgICAgICAgb21wX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludAorI2VuZGlmCisgICAgI2RlZmluZSBGVE5fREVTVFJPWV9MT0NLICAgICAgICAgICAgICAgICAgICAgb21wX2Rlc3Ryb3lfbG9jaworICAgICNkZWZpbmUgRlROX1NFVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgIG9tcF9zZXRfbG9jaworICAgICNkZWZpbmUgRlROX1VOU0VUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgIG9tcF91bnNldF9sb2NrCisgICAgI2RlZmluZSBGVE5fVEVTVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgb21wX3Rlc3RfbG9jaworICAgICNkZWZpbmUgRlROX0lOSVRfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgIG9tcF9pbml0X25lc3RfbG9jaworICAgICNkZWZpbmUgRlROX0RFU1RST1lfTkVTVF9MT0NLICAgICAgICAgICAgICAgIG9tcF9kZXN0cm95X25lc3RfbG9jaworICAgICNkZWZpbmUgRlROX1NFVF9ORVNUX0xPQ0sgICAgICAgICAgICAgICAgICAgIG9tcF9zZXRfbmVzdF9sb2NrCisgICAgI2RlZmluZSBGVE5fVU5TRVRfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgb21wX3Vuc2V0X25lc3RfbG9jaworICAgICNkZWZpbmUgRlROX1RFU1RfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgIG9tcF90ZXN0X25lc3RfbG9jaworCisgICAgI2RlZmluZSBGVE5fU0VUX1dBUk5JTkdTX09OICAgICAgICAgICAgICAgICAga21wX3NldF93YXJuaW5nc19vbgorICAgICNkZWZpbmUgRlROX1NFVF9XQVJOSU5HU19PRkYgICAgICAgICAgICAgICAgIGttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyAgICAjZGVmaW5lIEZUTl9HRVRfV1RJTUUgICAgICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X3d0aW1lCisgICAgI2RlZmluZSBGVE5fR0VUX1dUSUNLICAgICAgICAgICAgICAgICAgICAgICAgb21wX2dldF93dGljaworCisjaWYgT01QXzQwX0VOQUJMRUQKKyNpZiBLTVBfTUlDIHx8IEtNUF9PU19EQVJXSU4KKyAgICAjZGVmaW5lIEZUTl9HRVRfREVGQVVMVF9ERVZJQ0UgICAgICAgICAgICAgICBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCisgICAgI2RlZmluZSBGVE5fU0VUX0RFRkFVTFRfREVWSUNFICAgICAgICAgICAgICAgb21wX3NldF9kZWZhdWx0X2RldmljZQorICAgICNkZWZpbmUgRlROX0dFVF9OVU1fREVWSUNFUyAgICAgICAgICAgICAgICAgIG9tcF9nZXRfbnVtX2RldmljZXMKKyNlbmRpZgorICAgICNkZWZpbmUgRlROX0lTX0lOSVRJQUxfREVWSUNFICAgICAgICAgICAgICAgIG9tcF9pc19pbml0aWFsX2RldmljZQorI2VuZGlmCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICNkZWZpbmUgRlROX0dFVF9DQU5DRUxMQVRJT04gICAgICAgICAgICAgICAgIG9tcF9nZXRfY2FuY2VsbGF0aW9uCisgICAgI2RlZmluZSBGVE5fR0VUX0NBTkNFTExBVElPTl9TVEFUVVMgICAgICAgICAga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzCisjZW5kaWYKKworI2VuZGlmIC8qIEtNUF9GVE5fUExBSU4gKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBLTVBfRlROX0VOVFJJRVMgPT0gS01QX0ZUTl9BUFBFTkQKKworICAgICNkZWZpbmUgRlROX1NFVF9TVEFDS1NJWkUgICAgICAgICAgICAgICAgICAgIGttcF9zZXRfc3RhY2tzaXplXworICAgICNkZWZpbmUgRlROX1NFVF9TVEFDS1NJWkVfUyAgICAgICAgICAgICAgICAgIGttcF9zZXRfc3RhY2tzaXplX3NfCisgICAgI2RlZmluZSBGVE5fR0VUX1NUQUNLU0laRSAgICAgICAgICAgICAgICAgICAga21wX2dldF9zdGFja3NpemVfCisgICAgI2RlZmluZSBGVE5fR0VUX1NUQUNLU0laRV9TICAgICAgICAgICAgICAgICAga21wX2dldF9zdGFja3NpemVfc18KKyAgICAjZGVmaW5lIEZUTl9TRVRfQkxPQ0tUSU1FICAgICAgICAgICAgICAgICAgICBrbXBfc2V0X2Jsb2NrdGltZV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfQkxPQ0tUSU1FICAgICAgICAgICAgICAgICAgICBrbXBfZ2V0X2Jsb2NrdGltZV8KKyAgICAjZGVmaW5lIEZUTl9TRVRfTElCUkFSWV9TRVJJQUwgICAgICAgICAgICAgICBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsXworICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkQgICAgICAgICAgIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kXworICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVQgICAgICAgICAgIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0XworICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZICAgICAgICAgICAgICAgICAgICAgIGttcF9zZXRfbGlicmFyeV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfTElCUkFSWSAgICAgICAgICAgICAgICAgICAgICBrbXBfZ2V0X2xpYnJhcnlfCisgICAgI2RlZmluZSBGVE5fU0VUX0RFRkFVTFRTICAgICAgICAgICAgICAgICAgICAga21wX3NldF9kZWZhdWx0c18KKyAgICAjZGVmaW5lIEZUTl9TRVRfQUZGSU5JVFkgICAgICAgICAgICAgICAgICAgICBrbXBfc2V0X2FmZmluaXR5XworICAgICNkZWZpbmUgRlROX0dFVF9BRkZJTklUWSAgICAgICAgICAgICAgICAgICAgIGttcF9nZXRfYWZmaW5pdHlfCisgICAgI2RlZmluZSBGVE5fR0VUX0FGRklOSVRZX01BWF9QUk9DICAgICAgICAgICAga21wX2dldF9hZmZpbml0eV9tYXhfcHJvY18KKyAgICAjZGVmaW5lIEZUTl9DUkVBVEVfQUZGSU5JVFlfTUFTSyAgICAgICAgICAgICBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfCisgICAgI2RlZmluZSBGVE5fREVTVFJPWV9BRkZJTklUWV9NQVNLICAgICAgICAgICAga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza18KKyAgICAjZGVmaW5lIEZUTl9TRVRfQUZGSU5JVFlfTUFTS19QUk9DICAgICAgICAgICBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY18KKyAgICAjZGVmaW5lIEZUTl9VTlNFVF9BRkZJTklUWV9NQVNLX1BST0MgICAgICAgICBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jXworICAgICNkZWZpbmUgRlROX0dFVF9BRkZJTklUWV9NQVNLX1BST0MgICAgICAgICAgIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jXworCisgICAgI2RlZmluZSBGVE5fTUFMTE9DICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX21hbGxvY18KKyAgICAjZGVmaW5lIEZUTl9DQUxMT0MgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfY2FsbG9jXworICAgICNkZWZpbmUgRlROX1JFQUxMT0MgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9yZWFsbG9jXworICAgICNkZWZpbmUgRlROX0ZSRUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9mcmVlXworCisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9LTk9XTl9USFJFQURTICAgICAgICAgICAga21wX2dldF9udW1fa25vd25fdGhyZWFkc18KKworICAgICNkZWZpbmUgRlROX1NFVF9OVU1fVEhSRUFEUyAgICAgICAgICAgICAgICAgIG9tcF9zZXRfbnVtX3RocmVhZHNfCisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9USFJFQURTICAgICAgICAgICAgICAgICAgb21wX2dldF9udW1fdGhyZWFkc18KKyAgICAjZGVmaW5lIEZUTl9HRVRfTUFYX1RIUkVBRFMgICAgICAgICAgICAgICAgICBvbXBfZ2V0X21heF90aHJlYWRzXworICAgICNkZWZpbmUgRlROX0dFVF9USFJFQURfTlVNICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfdGhyZWFkX251bV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX1BST0NTICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X251bV9wcm9jc18KKyAgICAjZGVmaW5lIEZUTl9TRVRfRFlOQU1JQyAgICAgICAgICAgICAgICAgICAgICBvbXBfc2V0X2R5bmFtaWNfCisgICAgI2RlZmluZSBGVE5fR0VUX0RZTkFNSUMgICAgICAgICAgICAgICAgICAgICAgb21wX2dldF9keW5hbWljXworICAgICNkZWZpbmUgRlROX1NFVF9ORVNURUQgICAgICAgICAgICAgICAgICAgICAgIG9tcF9zZXRfbmVzdGVkXworICAgICNkZWZpbmUgRlROX0dFVF9ORVNURUQgICAgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfbmVzdGVkXworICAgICNkZWZpbmUgRlROX0lOX1BBUkFMTEVMICAgICAgICAgICAgICAgICAgICAgIG9tcF9pbl9wYXJhbGxlbF8KKyAgICAjZGVmaW5lIEZUTl9HRVRfVEhSRUFEX0xJTUlUICAgICAgICAgICAgICAgICBvbXBfZ2V0X3RocmVhZF9saW1pdF8KKyAgICAjZGVmaW5lIEZUTl9TRVRfU0NIRURVTEUgICAgICAgICAgICAgICAgICAgICBvbXBfc2V0X3NjaGVkdWxlXworICAgICNkZWZpbmUgRlROX0dFVF9TQ0hFRFVMRSAgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfc2NoZWR1bGVfCisgICAgI2RlZmluZSBGVE5fU0VUX01BWF9BQ1RJVkVfTEVWRUxTICAgICAgICAgICAgb21wX3NldF9tYXhfYWN0aXZlX2xldmVsc18KKyAgICAjZGVmaW5lIEZUTl9HRVRfTUFYX0FDVElWRV9MRVZFTFMgICAgICAgICAgICBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzXworICAgICNkZWZpbmUgRlROX0dFVF9BQ1RJVkVfTEVWRUwgICAgICAgICAgICAgICAgIG9tcF9nZXRfYWN0aXZlX2xldmVsXworICAgICNkZWZpbmUgRlROX0dFVF9MRVZFTCAgICAgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfbGV2ZWxfCisgICAgI2RlZmluZSBGVE5fR0VUX0FOQ0VTVE9SX1RIUkVBRF9OVU0gICAgICAgICAgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtXworICAgICNkZWZpbmUgRlROX0dFVF9URUFNX1NJWkUgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfdGVhbV9zaXplXworICAgICNkZWZpbmUgRlROX0lOX0ZJTkFMICAgICAgICAgICAgICAgICAgICAgICAgIG9tcF9pbl9maW5hbF8KKy8vICAjZGVmaW5lIEZUTl9TRVRfUFJPQ19CSU5EICAgICAgICAgICAgICAgICAgICBvbXBfc2V0X3Byb2NfYmluZF8KKyAgICAjZGVmaW5lIEZUTl9HRVRfUFJPQ19CSU5EICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X3Byb2NfYmluZF8KKy8vICAjZGVmaW5lIEZUTl9DVVJSX1BST0NfQklORCAgICAgICAgICAgICAgICAgICBvbXBfY3Vycl9wcm9jX2JpbmRfCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX1RFQU1TICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X251bV90ZWFtc18KKyAgICAjZGVmaW5lIEZUTl9HRVRfVEVBTV9OVU0gICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X3RlYW1fbnVtXworI2VuZGlmCisgICAgI2RlZmluZSBGVE5fSU5JVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgb21wX2luaXRfbG9ja18KKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworICAgICNkZWZpbmUgRlROX0lOSVRfTE9DS19XSVRIX0hJTlQgICAgICAgICAgICAgIG9tcF9pbml0X2xvY2tfd2l0aF9oaW50XworICAgICNkZWZpbmUgRlROX0lOSVRfTkVTVF9MT0NLX1dJVEhfSElOVCAgICAgICAgIG9tcF9pbml0X25lc3RfbG9ja193aXRoX2hpbnRfCisjZW5kaWYKKyAgICAjZGVmaW5lIEZUTl9ERVNUUk9ZX0xPQ0sgICAgICAgICAgICAgICAgICAgICBvbXBfZGVzdHJveV9sb2NrXworICAgICNkZWZpbmUgRlROX1NFVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgIG9tcF9zZXRfbG9ja18KKyAgICAjZGVmaW5lIEZUTl9VTlNFVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICBvbXBfdW5zZXRfbG9ja18KKyAgICAjZGVmaW5lIEZUTl9URVNUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICBvbXBfdGVzdF9sb2NrXworICAgICNkZWZpbmUgRlROX0lOSVRfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgIG9tcF9pbml0X25lc3RfbG9ja18KKyAgICAjZGVmaW5lIEZUTl9ERVNUUk9ZX05FU1RfTE9DSyAgICAgICAgICAgICAgICBvbXBfZGVzdHJveV9uZXN0X2xvY2tfCisgICAgI2RlZmluZSBGVE5fU0VUX05FU1RfTE9DSyAgICAgICAgICAgICAgICAgICAgb21wX3NldF9uZXN0X2xvY2tfCisgICAgI2RlZmluZSBGVE5fVU5TRVRfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgb21wX3Vuc2V0X25lc3RfbG9ja18KKyAgICAjZGVmaW5lIEZUTl9URVNUX05FU1RfTE9DSyAgICAgICAgICAgICAgICAgICBvbXBfdGVzdF9uZXN0X2xvY2tfCisKKyAgICAjZGVmaW5lIEZUTl9TRVRfV0FSTklOR1NfT04gICAgICAgICAgICAgICAgICBrbXBfc2V0X3dhcm5pbmdzX29uXworICAgICNkZWZpbmUgRlROX1NFVF9XQVJOSU5HU19PRkYgICAgICAgICAgICAgICAgIGttcF9zZXRfd2FybmluZ3Nfb2ZmXworCisgICAgI2RlZmluZSBGVE5fR0VUX1dUSU1FICAgICAgICAgICAgICAgICAgICAgICAgb21wX2dldF93dGltZV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfV1RJQ0sgICAgICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X3d0aWNrXworCisjaWYgT01QXzQwX0VOQUJMRUQKKyNpZiBLTVBfTUlDIHx8IEtNUF9PU19EQVJXSU4KKyAgICAjZGVmaW5lIEZUTl9HRVRfREVGQVVMVF9ERVZJQ0UgICAgICAgICAgICAgICBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlXworICAgICNkZWZpbmUgRlROX1NFVF9ERUZBVUxUX0RFVklDRSAgICAgICAgICAgICAgIG9tcF9zZXRfZGVmYXVsdF9kZXZpY2VfCisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9ERVZJQ0VTICAgICAgICAgICAgICAgICAgb21wX2dldF9udW1fZGV2aWNlc18KKyNlbmRpZgorICAgICNkZWZpbmUgRlROX0lTX0lOSVRJQUxfREVWSUNFICAgICAgICAgICAgICAgIG9tcF9pc19pbml0aWFsX2RldmljZV8KKyNlbmRpZgorCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICNkZWZpbmUgRlROX0dFVF9DQU5DRUxMQVRJT04gICAgICAgICAgICAgICAgIG9tcF9nZXRfY2FuY2VsbGF0aW9uXworICAgICNkZWZpbmUgRlROX0dFVF9DQU5DRUxMQVRJT05fU1RBVFVTICAgICAgICAgIGttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1c18KKyNlbmRpZgorCisjZW5kaWYgLyogS01QX0ZUTl9BUFBFTkQgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBLTVBfRlROX0VOVFJJRVMgPT0gS01QX0ZUTl9VUFBFUgorCisgICAgI2RlZmluZSBGVE5fU0VUX1NUQUNLU0laRSAgICAgICAgICAgICAgICAgICAgS01QX1NFVF9TVEFDS1NJWkUKKyAgICAjZGVmaW5lIEZUTl9TRVRfU1RBQ0tTSVpFX1MgICAgICAgICAgICAgICAgICBLTVBfU0VUX1NUQUNLU0laRV9TCisgICAgI2RlZmluZSBGVE5fR0VUX1NUQUNLU0laRSAgICAgICAgICAgICAgICAgICAgS01QX0dFVF9TVEFDS1NJWkUKKyAgICAjZGVmaW5lIEZUTl9HRVRfU1RBQ0tTSVpFX1MgICAgICAgICAgICAgICAgICBLTVBfR0VUX1NUQUNLU0laRV9TCisgICAgI2RlZmluZSBGVE5fU0VUX0JMT0NLVElNRSAgICAgICAgICAgICAgICAgICAgS01QX1NFVF9CTE9DS1RJTUUKKyAgICAjZGVmaW5lIEZUTl9HRVRfQkxPQ0tUSU1FICAgICAgICAgICAgICAgICAgICBLTVBfR0VUX0JMT0NLVElNRQorICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZX1NFUklBTCAgICAgICAgICAgICAgIEtNUF9TRVRfTElCUkFSWV9TRVJJQUwKKyAgICAjZGVmaW5lIEZUTl9TRVRfTElCUkFSWV9UVVJOQVJPVU5EICAgICAgICAgICBLTVBfU0VUX0xJQlJBUllfVFVSTkFST1VORAorICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVQgICAgICAgICAgIEtNUF9TRVRfTElCUkFSWV9USFJPVUdIUFVUCisgICAgI2RlZmluZSBGVE5fU0VUX0xJQlJBUlkgICAgICAgICAgICAgICAgICAgICAgS01QX1NFVF9MSUJSQVJZCisgICAgI2RlZmluZSBGVE5fR0VUX0xJQlJBUlkgICAgICAgICAgICAgICAgICAgICAgS01QX0dFVF9MSUJSQVJZCisgICAgI2RlZmluZSBGVE5fU0VUX0RFRkFVTFRTICAgICAgICAgICAgICAgICAgICAgS01QX1NFVF9ERUZBVUxUUworICAgICNkZWZpbmUgRlROX1NFVF9BRkZJTklUWSAgICAgICAgICAgICAgICAgICAgIEtNUF9TRVRfQUZGSU5JVFkKKyAgICAjZGVmaW5lIEZUTl9HRVRfQUZGSU5JVFkgICAgICAgICAgICAgICAgICAgICBLTVBfR0VUX0FGRklOSVRZCisgICAgI2RlZmluZSBGVE5fR0VUX0FGRklOSVRZX01BWF9QUk9DICAgICAgICAgICAgS01QX0dFVF9BRkZJTklUWV9NQVhfUFJPQworICAgICNkZWZpbmUgRlROX0NSRUFURV9BRkZJTklUWV9NQVNLICAgICAgICAgICAgIEtNUF9DUkVBVEVfQUZGSU5JVFlfTUFTSworICAgICNkZWZpbmUgRlROX0RFU1RST1lfQUZGSU5JVFlfTUFTSyAgICAgICAgICAgIEtNUF9ERVNUUk9ZX0FGRklOSVRZX01BU0sKKyAgICAjZGVmaW5lIEZUTl9TRVRfQUZGSU5JVFlfTUFTS19QUk9DICAgICAgICAgICBLTVBfU0VUX0FGRklOSVRZX01BU0tfUFJPQworICAgICNkZWZpbmUgRlROX1VOU0VUX0FGRklOSVRZX01BU0tfUFJPQyAgICAgICAgIEtNUF9VTlNFVF9BRkZJTklUWV9NQVNLX1BST0MKKyAgICAjZGVmaW5lIEZUTl9HRVRfQUZGSU5JVFlfTUFTS19QUk9DICAgICAgICAgICBLTVBfR0VUX0FGRklOSVRZX01BU0tfUFJPQworCisgICAgI2RlZmluZSBGVE5fTUFMTE9DICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX01BTExPQworICAgICNkZWZpbmUgRlROX0NBTExPQyAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9DQUxMT0MKKyAgICAjZGVmaW5lIEZUTl9SRUFMTE9DICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfUkVBTExPQworICAgICNkZWZpbmUgRlROX0ZSRUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9GUkVFCisKKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX0tOT1dOX1RIUkVBRFMgICAgICAgICAgICBLTVBfR0VUX05VTV9LTk9XTl9USFJFQURTCisKKyAgICAjZGVmaW5lIEZUTl9TRVRfTlVNX1RIUkVBRFMgICAgICAgICAgICAgICAgICBPTVBfU0VUX05VTV9USFJFQURTCisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9USFJFQURTICAgICAgICAgICAgICAgICAgT01QX0dFVF9OVU1fVEhSRUFEUworICAgICNkZWZpbmUgRlROX0dFVF9NQVhfVEhSRUFEUyAgICAgICAgICAgICAgICAgIE9NUF9HRVRfTUFYX1RIUkVBRFMKKyAgICAjZGVmaW5lIEZUTl9HRVRfVEhSRUFEX05VTSAgICAgICAgICAgICAgICAgICBPTVBfR0VUX1RIUkVBRF9OVU0KKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX1BST0NTICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX05VTV9QUk9DUworICAgICNkZWZpbmUgRlROX1NFVF9EWU5BTUlDICAgICAgICAgICAgICAgICAgICAgIE9NUF9TRVRfRFlOQU1JQworICAgICNkZWZpbmUgRlROX0dFVF9EWU5BTUlDICAgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfRFlOQU1JQworICAgICNkZWZpbmUgRlROX1NFVF9ORVNURUQgICAgICAgICAgICAgICAgICAgICAgIE9NUF9TRVRfTkVTVEVECisgICAgI2RlZmluZSBGVE5fR0VUX05FU1RFRCAgICAgICAgICAgICAgICAgICAgICAgT01QX0dFVF9ORVNURUQKKyAgICAjZGVmaW5lIEZUTl9JTl9QQVJBTExFTCAgICAgICAgICAgICAgICAgICAgICBPTVBfSU5fUEFSQUxMRUwKKyAgICAjZGVmaW5lIEZUTl9HRVRfVEhSRUFEX0xJTUlUICAgICAgICAgICAgICAgICBPTVBfR0VUX1RIUkVBRF9MSU1JVAorICAgICNkZWZpbmUgRlROX1NFVF9TQ0hFRFVMRSAgICAgICAgICAgICAgICAgICAgIE9NUF9TRVRfU0NIRURVTEUKKyAgICAjZGVmaW5lIEZUTl9HRVRfU0NIRURVTEUgICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX1NDSEVEVUxFCisgICAgI2RlZmluZSBGVE5fU0VUX01BWF9BQ1RJVkVfTEVWRUxTICAgICAgICAgICAgT01QX1NFVF9NQVhfQUNUSVZFX0xFVkVMUworICAgICNkZWZpbmUgRlROX0dFVF9NQVhfQUNUSVZFX0xFVkVMUyAgICAgICAgICAgIE9NUF9HRVRfTUFYX0FDVElWRV9MRVZFTFMKKyAgICAjZGVmaW5lIEZUTl9HRVRfQUNUSVZFX0xFVkVMICAgICAgICAgICAgICAgICBPTVBfR0VUX0FDVElWRV9MRVZFTAorICAgICNkZWZpbmUgRlROX0dFVF9MRVZFTCAgICAgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfTEVWRUwKKyAgICAjZGVmaW5lIEZUTl9HRVRfQU5DRVNUT1JfVEhSRUFEX05VTSAgICAgICAgICBPTVBfR0VUX0FOQ0VTVE9SX1RIUkVBRF9OVU0KKyAgICAjZGVmaW5lIEZUTl9HRVRfVEVBTV9TSVpFICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX1RFQU1fU0laRQorICAgICNkZWZpbmUgRlROX0lOX0ZJTkFMICAgICAgICAgICAgICAgICAgICAgICAgIE9NUF9JTl9GSU5BTAorLy8gICNkZWZpbmUgRlROX1NFVF9QUk9DX0JJTkQgICAgICAgICAgICAgICAgICAgIE9NUF9TRVRfUFJPQ19CSU5ECisgICAgI2RlZmluZSBGVE5fR0VUX1BST0NfQklORCAgICAgICAgICAgICAgICAgICAgT01QX0dFVF9QUk9DX0JJTkQKKy8vICAjZGVmaW5lIEZUTl9DVVJSX1BST0NfQklORCAgICAgICAgICAgICAgICAgICBPTVBfQ1VSUl9QUk9DX0JJTkQKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICNkZWZpbmUgRlROX0dFVF9OVU1fVEVBTVMgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfTlVNX1RFQU1TCisgICAgI2RlZmluZSBGVE5fR0VUX1RFQU1fTlVNICAgICAgICAgICAgICAgICAgICAgT01QX0dFVF9URUFNX05VTQorI2VuZGlmCisgICAgI2RlZmluZSBGVE5fSU5JVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgT01QX0lOSVRfTE9DSworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgICAgI2RlZmluZSBGVE5fSU5JVF9MT0NLX1dJVEhfSElOVCAgICAgICAgICAgICAgT01QX0lOSVRfTE9DS19XSVRIX0hJTlQKKyAgICAjZGVmaW5lIEZUTl9JTklUX05FU1RfTE9DS19XSVRIX0hJTlQgICAgICAgICBPTVBfSU5JVF9ORVNUX0xPQ0tfV0lUSF9ISU5UCisjZW5kaWYKKyAgICAjZGVmaW5lIEZUTl9ERVNUUk9ZX0xPQ0sgICAgICAgICAgICAgICAgICAgICBPTVBfREVTVFJPWV9MT0NLCisgICAgI2RlZmluZSBGVE5fU0VUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgT01QX1NFVF9MT0NLCisgICAgI2RlZmluZSBGVE5fVU5TRVRfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgT01QX1VOU0VUX0xPQ0sKKyAgICAjZGVmaW5lIEZUTl9URVNUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICBPTVBfVEVTVF9MT0NLCisgICAgI2RlZmluZSBGVE5fSU5JVF9ORVNUX0xPQ0sgICAgICAgICAgICAgICAgICAgT01QX0lOSVRfTkVTVF9MT0NLCisgICAgI2RlZmluZSBGVE5fREVTVFJPWV9ORVNUX0xPQ0sgICAgICAgICAgICAgICAgT01QX0RFU1RST1lfTkVTVF9MT0NLCisgICAgI2RlZmluZSBGVE5fU0VUX05FU1RfTE9DSyAgICAgICAgICAgICAgICAgICAgT01QX1NFVF9ORVNUX0xPQ0sKKyAgICAjZGVmaW5lIEZUTl9VTlNFVF9ORVNUX0xPQ0sgICAgICAgICAgICAgICAgICBPTVBfVU5TRVRfTkVTVF9MT0NLCisgICAgI2RlZmluZSBGVE5fVEVTVF9ORVNUX0xPQ0sgICAgICAgICAgICAgICAgICAgT01QX1RFU1RfTkVTVF9MT0NLCisKKyAgICAjZGVmaW5lIEZUTl9TRVRfV0FSTklOR1NfT04gICAgICAgICAgICAgICAgICBLTVBfU0VUX1dBUk5JTkdTX09OCisgICAgI2RlZmluZSBGVE5fU0VUX1dBUk5JTkdTX09GRiAgICAgICAgICAgICAgICAgS01QX1NFVF9XQVJOSU5HU19PRkYKKworICAgICNkZWZpbmUgRlROX0dFVF9XVElNRSAgICAgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfV1RJTUUKKyAgICAjZGVmaW5lIEZUTl9HRVRfV1RJQ0sgICAgICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX1dUSUNLCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorI2lmIEtNUF9NSUMgfHwgS01QX09TX0RBUldJTgorICAgICNkZWZpbmUgRlROX0dFVF9ERUZBVUxUX0RFVklDRSAgICAgICAgICAgICAgIE9NUF9HRVRfREVGQVVMVF9ERVZJQ0UKKyAgICAjZGVmaW5lIEZUTl9TRVRfREVGQVVMVF9ERVZJQ0UgICAgICAgICAgICAgICBPTVBfU0VUX0RFRkFVTFRfREVWSUNFCisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9ERVZJQ0VTICAgICAgICAgICAgICAgICAgT01QX0dFVF9OVU1fREVWSUNFUworI2VuZGlmCisgICAgI2RlZmluZSBGVE5fSVNfSU5JVElBTF9ERVZJQ0UgICAgICAgICAgICAgICAgT01QX0lTX0lOSVRJQUxfREVWSUNFCisjZW5kaWYKKworCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAjZGVmaW5lIEZUTl9HRVRfQ0FOQ0VMTEFUSU9OICAgICAgICAgICAgICAgICBPTVBfR0VUX0NBTkNFTExBVElPTgorICAgICNkZWZpbmUgRlROX0dFVF9DQU5DRUxMQVRJT05fU1RBVFVTICAgICAgICAgIEtNUF9HRVRfQ0FOQ0VMTEFUSU9OX1NUQVRVUworI2VuZGlmCisKKyNlbmRpZiAvKiBLTVBfRlROX1VQUEVSICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgS01QX0ZUTl9FTlRSSUVTID09IEtNUF9GVE5fVUFQUEVORAorCisgICAgI2RlZmluZSBGVE5fU0VUX1NUQUNLU0laRSAgICAgICAgICAgICAgICAgICAgS01QX1NFVF9TVEFDS1NJWkVfCisgICAgI2RlZmluZSBGVE5fU0VUX1NUQUNLU0laRV9TICAgICAgICAgICAgICAgICAgS01QX1NFVF9TVEFDS1NJWkVfU18KKyAgICAjZGVmaW5lIEZUTl9HRVRfU1RBQ0tTSVpFICAgICAgICAgICAgICAgICAgICBLTVBfR0VUX1NUQUNLU0laRV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfU1RBQ0tTSVpFX1MgICAgICAgICAgICAgICAgICBLTVBfR0VUX1NUQUNLU0laRV9TXworICAgICNkZWZpbmUgRlROX1NFVF9CTE9DS1RJTUUgICAgICAgICAgICAgICAgICAgIEtNUF9TRVRfQkxPQ0tUSU1FXworICAgICNkZWZpbmUgRlROX0dFVF9CTE9DS1RJTUUgICAgICAgICAgICAgICAgICAgIEtNUF9HRVRfQkxPQ0tUSU1FXworICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZX1NFUklBTCAgICAgICAgICAgICAgIEtNUF9TRVRfTElCUkFSWV9TRVJJQUxfCisgICAgI2RlZmluZSBGVE5fU0VUX0xJQlJBUllfVFVSTkFST1VORCAgICAgICAgICAgS01QX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkRfCisgICAgI2RlZmluZSBGVE5fU0VUX0xJQlJBUllfVEhST1VHSFBVVCAgICAgICAgICAgS01QX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVRfCisgICAgI2RlZmluZSBGVE5fU0VUX0xJQlJBUlkgICAgICAgICAgICAgICAgICAgICAgS01QX1NFVF9MSUJSQVJZXworICAgICNkZWZpbmUgRlROX0dFVF9MSUJSQVJZICAgICAgICAgICAgICAgICAgICAgIEtNUF9HRVRfTElCUkFSWV8KKyAgICAjZGVmaW5lIEZUTl9TRVRfREVGQVVMVFMgICAgICAgICAgICAgICAgICAgICBLTVBfU0VUX0RFRkFVTFRTXworICAgICNkZWZpbmUgRlROX1NFVF9BRkZJTklUWSAgICAgICAgICAgICAgICAgICAgIEtNUF9TRVRfQUZGSU5JVFlfCisgICAgI2RlZmluZSBGVE5fR0VUX0FGRklOSVRZICAgICAgICAgICAgICAgICAgICAgS01QX0dFVF9BRkZJTklUWV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfQUZGSU5JVFlfTUFYX1BST0MgICAgICAgICAgICBLTVBfR0VUX0FGRklOSVRZX01BWF9QUk9DXworICAgICNkZWZpbmUgRlROX0NSRUFURV9BRkZJTklUWV9NQVNLICAgICAgICAgICAgIEtNUF9DUkVBVEVfQUZGSU5JVFlfTUFTS18KKyAgICAjZGVmaW5lIEZUTl9ERVNUUk9ZX0FGRklOSVRZX01BU0sgICAgICAgICAgICBLTVBfREVTVFJPWV9BRkZJTklUWV9NQVNLXworICAgICNkZWZpbmUgRlROX1NFVF9BRkZJTklUWV9NQVNLX1BST0MgICAgICAgICAgIEtNUF9TRVRfQUZGSU5JVFlfTUFTS19QUk9DXworICAgICNkZWZpbmUgRlROX1VOU0VUX0FGRklOSVRZX01BU0tfUFJPQyAgICAgICAgIEtNUF9VTlNFVF9BRkZJTklUWV9NQVNLX1BST0NfCisgICAgI2RlZmluZSBGVE5fR0VUX0FGRklOSVRZX01BU0tfUFJPQyAgICAgICAgICAgS01QX0dFVF9BRkZJTklUWV9NQVNLX1BST0NfCisKKyAgICAjZGVmaW5lIEZUTl9NQUxMT0MgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTUFMTE9DXworICAgICNkZWZpbmUgRlROX0NBTExPQyAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9DQUxMT0NfCisgICAgI2RlZmluZSBGVE5fUkVBTExPQyAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX1JFQUxMT0NfCisgICAgI2RlZmluZSBGVE5fRlJFRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0ZSRUVfCisKKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX0tOT1dOX1RIUkVBRFMgICAgICAgICAgICBLTVBfR0VUX05VTV9LTk9XTl9USFJFQURTXworCisgICAgI2RlZmluZSBGVE5fU0VUX05VTV9USFJFQURTICAgICAgICAgICAgICAgICAgT01QX1NFVF9OVU1fVEhSRUFEU18KKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX1RIUkVBRFMgICAgICAgICAgICAgICAgICBPTVBfR0VUX05VTV9USFJFQURTXworICAgICNkZWZpbmUgRlROX0dFVF9NQVhfVEhSRUFEUyAgICAgICAgICAgICAgICAgIE9NUF9HRVRfTUFYX1RIUkVBRFNfCisgICAgI2RlZmluZSBGVE5fR0VUX1RIUkVBRF9OVU0gICAgICAgICAgICAgICAgICAgT01QX0dFVF9USFJFQURfTlVNXworICAgICNkZWZpbmUgRlROX0dFVF9OVU1fUFJPQ1MgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfTlVNX1BST0NTXworICAgICNkZWZpbmUgRlROX1NFVF9EWU5BTUlDICAgICAgICAgICAgICAgICAgICAgIE9NUF9TRVRfRFlOQU1JQ18KKyAgICAjZGVmaW5lIEZUTl9HRVRfRFlOQU1JQyAgICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX0RZTkFNSUNfCisgICAgI2RlZmluZSBGVE5fU0VUX05FU1RFRCAgICAgICAgICAgICAgICAgICAgICAgT01QX1NFVF9ORVNURURfCisgICAgI2RlZmluZSBGVE5fR0VUX05FU1RFRCAgICAgICAgICAgICAgICAgICAgICAgT01QX0dFVF9ORVNURURfCisgICAgI2RlZmluZSBGVE5fSU5fUEFSQUxMRUwgICAgICAgICAgICAgICAgICAgICAgT01QX0lOX1BBUkFMTEVMXworICAgICNkZWZpbmUgRlROX0dFVF9USFJFQURfTElNSVQgICAgICAgICAgICAgICAgIE9NUF9HRVRfVEhSRUFEX0xJTUlUXworICAgICNkZWZpbmUgRlROX1NFVF9TQ0hFRFVMRSAgICAgICAgICAgICAgICAgICAgIE9NUF9TRVRfU0NIRURVTEVfCisgICAgI2RlZmluZSBGVE5fR0VUX1NDSEVEVUxFICAgICAgICAgICAgICAgICAgICAgT01QX0dFVF9TQ0hFRFVMRV8KKyAgICAjZGVmaW5lIEZUTl9TRVRfTUFYX0FDVElWRV9MRVZFTFMgICAgICAgICAgICBPTVBfU0VUX01BWF9BQ1RJVkVfTEVWRUxTXworICAgICNkZWZpbmUgRlROX0dFVF9NQVhfQUNUSVZFX0xFVkVMUyAgICAgICAgICAgIE9NUF9HRVRfTUFYX0FDVElWRV9MRVZFTFNfCisgICAgI2RlZmluZSBGVE5fR0VUX0FDVElWRV9MRVZFTCAgICAgICAgICAgICAgICAgT01QX0dFVF9BQ1RJVkVfTEVWRUxfCisgICAgI2RlZmluZSBGVE5fR0VUX0xFVkVMICAgICAgICAgICAgICAgICAgICAgICAgT01QX0dFVF9MRVZFTF8KKyAgICAjZGVmaW5lIEZUTl9HRVRfQU5DRVNUT1JfVEhSRUFEX05VTSAgICAgICAgICBPTVBfR0VUX0FOQ0VTVE9SX1RIUkVBRF9OVU1fCisgICAgI2RlZmluZSBGVE5fR0VUX1RFQU1fU0laRSAgICAgICAgICAgICAgICAgICAgT01QX0dFVF9URUFNX1NJWkVfCisgICAgI2RlZmluZSBGVE5fSU5fRklOQUwgICAgICAgICAgICAgICAgICAgICAgICAgT01QX0lOX0ZJTkFMXworLy8gICNkZWZpbmUgRlROX1NFVF9QUk9DX0JJTkQgICAgICAgICAgICAgICAgICAgIE9NUF9TRVRfUFJPQ19CSU5EXworICAgICNkZWZpbmUgRlROX0dFVF9QUk9DX0JJTkQgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfUFJPQ19CSU5EXworLy8gICNkZWZpbmUgRlROX0NVUlJfUFJPQ19CSU5EICAgICAgICAgICAgICAgICAgIE9NUF9DVVJSX1BST0NfQklORF8KKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICNkZWZpbmUgRlROX0dFVF9OVU1fVEVBTVMgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfTlVNX1RFQU1TXworICAgICNkZWZpbmUgRlROX0dFVF9URUFNX05VTSAgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfVEVBTV9OVU1fCisjZW5kaWYKKyAgICAjZGVmaW5lIEZUTl9JTklUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICBPTVBfSU5JVF9MT0NLXworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgICAgI2RlZmluZSBGVE5fSU5JVF9MT0NLX1dJVEhfSElOVCAgICAgICAgICAgICAgT01QX0lOSVRfTE9DS19XSVRIX0hJTlRfCisgICAgI2RlZmluZSBGVE5fSU5JVF9ORVNUX0xPQ0tfV0lUSF9ISU5UICAgICAgICAgT01QX0lOSVRfTkVTVF9MT0NLX1dJVEhfSElOVF8KKyNlbmRpZgorICAgICNkZWZpbmUgRlROX0RFU1RST1lfTE9DSyAgICAgICAgICAgICAgICAgICAgIE9NUF9ERVNUUk9ZX0xPQ0tfCisgICAgI2RlZmluZSBGVE5fU0VUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgT01QX1NFVF9MT0NLXworICAgICNkZWZpbmUgRlROX1VOU0VUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgIE9NUF9VTlNFVF9MT0NLXworICAgICNkZWZpbmUgRlROX1RFU1RfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgIE9NUF9URVNUX0xPQ0tfCisgICAgI2RlZmluZSBGVE5fSU5JVF9ORVNUX0xPQ0sgICAgICAgICAgICAgICAgICAgT01QX0lOSVRfTkVTVF9MT0NLXworICAgICNkZWZpbmUgRlROX0RFU1RST1lfTkVTVF9MT0NLICAgICAgICAgICAgICAgIE9NUF9ERVNUUk9ZX05FU1RfTE9DS18KKyAgICAjZGVmaW5lIEZUTl9TRVRfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgICBPTVBfU0VUX05FU1RfTE9DS18KKyAgICAjZGVmaW5lIEZUTl9VTlNFVF9ORVNUX0xPQ0sgICAgICAgICAgICAgICAgICBPTVBfVU5TRVRfTkVTVF9MT0NLXworICAgICNkZWZpbmUgRlROX1RFU1RfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgIE9NUF9URVNUX05FU1RfTE9DS18KKworICAgICNkZWZpbmUgRlROX1NFVF9XQVJOSU5HU19PTiAgICAgICAgICAgICAgICAgIEtNUF9TRVRfV0FSTklOR1NfT05fCisgICAgI2RlZmluZSBGVE5fU0VUX1dBUk5JTkdTX09GRiAgICAgICAgICAgICAgICAgS01QX1NFVF9XQVJOSU5HU19PRkZfCisKKyAgICAjZGVmaW5lIEZUTl9HRVRfV1RJTUUgICAgICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX1dUSU1FXworICAgICNkZWZpbmUgRlROX0dFVF9XVElDSyAgICAgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfV1RJQ0tfCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorI2lmIEtNUF9NSUMgfHwgS01QX09TX0RBUldJTgorICAgICNkZWZpbmUgRlROX0dFVF9ERUZBVUxUX0RFVklDRSAgICAgICAgICAgICAgIE9NUF9HRVRfREVGQVVMVF9ERVZJQ0VfCisgICAgI2RlZmluZSBGVE5fU0VUX0RFRkFVTFRfREVWSUNFICAgICAgICAgICAgICAgT01QX1NFVF9ERUZBVUxUX0RFVklDRV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX0RFVklDRVMgICAgICAgICAgICAgICAgICBPTVBfR0VUX05VTV9ERVZJQ0VTXworI2VuZGlmCisgICAgI2RlZmluZSBGVE5fSVNfSU5JVElBTF9ERVZJQ0UgICAgICAgICAgICAgICAgT01QX0lTX0lOSVRJQUxfREVWSUNFXworI2VuZGlmCisKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgI2RlZmluZSBGVE5fR0VUX0NBTkNFTExBVElPTiAgICAgICAgICAgICAgICAgT01QX0dFVF9DQU5DRUxMQVRJT05fCisgICAgI2RlZmluZSBGVE5fR0VUX0NBTkNFTExBVElPTl9TVEFUVVMgICAgICAgICAgS01QX0dFVF9DQU5DRUxMQVRJT05fU1RBVFVTXworI2VuZGlmCisKKyNlbmRpZiAvKiBLTVBfRlROX1VBUFBFTkQgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHT01QIEFQSSBOQU1FUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8vIEFsbCBHT01QXzEuMCBzeW1ib2xzCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0FUT01JQ19FTkQgICAgICAgICAgICAgICAgICAgR09NUF9hdG9taWNfZW5kCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0FUT01JQ19TVEFSVCAgICAgICAgICAgICAgICAgR09NUF9hdG9taWNfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfQkFSUklFUiAgICAgICAgICAgICAgICAgICAgICBHT01QX2JhcnJpZXIKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfRU5EICAgICAgICAgICAgICAgICBHT01QX2NyaXRpY2FsX2VuZAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9DUklUSUNBTF9OQU1FX0VORCAgICAgICAgICAgIEdPTVBfY3JpdGljYWxfbmFtZV9lbmQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfTkFNRV9TVEFSVCAgICAgICAgICBHT01QX2NyaXRpY2FsX25hbWVfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfU1RBUlQgICAgICAgICAgICAgICBHT01QX2NyaXRpY2FsX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRFlOQU1JQ19ORVhUICAgICAgICAgICAgR09NUF9sb29wX2R5bmFtaWNfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX0RZTkFNSUNfU1RBUlQgICAgICAgICAgIEdPTVBfbG9vcF9keW5hbWljX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRU5EICAgICAgICAgICAgICAgICAgICAgR09NUF9sb29wX2VuZAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX0VORF9OT1dBSVQgICAgICAgICAgICAgIEdPTVBfbG9vcF9lbmRfbm93YWl0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfR1VJREVEX05FWFQgICAgICAgICAgICAgR09NUF9sb29wX2d1aWRlZF9uZXh0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfR1VJREVEX1NUQVJUICAgICAgICAgICAgR09NUF9sb29wX2d1aWRlZF9zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfRFlOQU1JQ19ORVhUICAgIEdPTVBfbG9vcF9vcmRlcmVkX2R5bmFtaWNfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfRFlOQU1JQ19TVEFSVCAgIEdPTVBfbG9vcF9vcmRlcmVkX2R5bmFtaWNfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX0dVSURFRF9ORVhUICAgICBHT01QX2xvb3Bfb3JkZXJlZF9ndWlkZWRfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfR1VJREVEX1NUQVJUICAgIEdPTVBfbG9vcF9vcmRlcmVkX2d1aWRlZF9zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfUlVOVElNRV9ORVhUICAgIEdPTVBfbG9vcF9vcmRlcmVkX3J1bnRpbWVfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfUlVOVElNRV9TVEFSVCAgIEdPTVBfbG9vcF9vcmRlcmVkX3J1bnRpbWVfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX1NUQVRJQ19ORVhUICAgICBHT01QX2xvb3Bfb3JkZXJlZF9zdGF0aWNfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfU1RBVElDX1NUQVJUICAgIEdPTVBfbG9vcF9vcmRlcmVkX3N0YXRpY19zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1JVTlRJTUVfTkVYVCAgICAgICAgICAgIEdPTVBfbG9vcF9ydW50aW1lX25leHQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9SVU5USU1FX1NUQVJUICAgICAgICAgICBHT01QX2xvb3BfcnVudGltZV9zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1NUQVRJQ19ORVhUICAgICAgICAgICAgIEdPTVBfbG9vcF9zdGF0aWNfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1NUQVRJQ19TVEFSVCAgICAgICAgICAgIEdPTVBfbG9vcF9zdGF0aWNfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfT1JERVJFRF9FTkQgICAgICAgICAgICAgICAgICBHT01QX29yZGVyZWRfZW5kCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX09SREVSRURfU1RBUlQgICAgICAgICAgICAgICAgR09NUF9vcmRlcmVkX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0VORCAgICAgICAgICAgICAgICAgR09NUF9wYXJhbGxlbF9lbmQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9EWU5BTUlDX1NUQVJUICBHT01QX3BhcmFsbGVsX2xvb3BfZHluYW1pY19zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0dVSURFRF9TVEFSVCAgIEdPTVBfcGFyYWxsZWxfbG9vcF9ndWlkZWRfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9SVU5USU1FX1NUQVJUICBHT01QX3BhcmFsbGVsX2xvb3BfcnVudGltZV9zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX1NUQVRJQ19TVEFSVCAgIEdPTVBfcGFyYWxsZWxfbG9vcF9zdGF0aWNfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfU0VDVElPTlNfU1RBUlQgICAgICBHT01QX3BhcmFsbGVsX3NlY3Rpb25zX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX1NUQVJUICAgICAgICAgICAgICAgR09NUF9wYXJhbGxlbF9zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9TRUNUSU9OU19FTkQgICAgICAgICAgICAgICAgIEdPTVBfc2VjdGlvbnNfZW5kCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX0VORF9OT1dBSVQgICAgICAgICAgR09NUF9zZWN0aW9uc19lbmRfbm93YWl0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX05FWFQgICAgICAgICAgICAgICAgR09NUF9zZWN0aW9uc19uZXh0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX1NUQVJUICAgICAgICAgICAgICAgR09NUF9zZWN0aW9uc19zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9TSU5HTEVfQ09QWV9FTkQgICAgICAgICAgICAgIEdPTVBfc2luZ2xlX2NvcHlfZW5kCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1NJTkdMRV9DT1BZX1NUQVJUICAgICAgICAgICAgR09NUF9zaW5nbGVfY29weV9zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9TSU5HTEVfU1RBUlQgICAgICAgICAgICAgICAgIEdPTVBfc2luZ2xlX3N0YXJ0CisKKy8vIEFsbCBHT01QXzIuMCBzeW1ib2xzCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1RBU0sgICAgICAgICAgICAgICAgICAgICAgICAgICBHT01QX3Rhc2sKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfVEFTS1dBSVQgICAgICAgICAgICAgICAgICAgICAgIEdPTVBfdGFza3dhaXQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfRFlOQU1JQ19ORVhUICAgICAgICAgIEdPTVBfbG9vcF91bGxfZHluYW1pY19uZXh0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX0RZTkFNSUNfU1RBUlQgICAgICAgICBHT01QX2xvb3BfdWxsX2R5bmFtaWNfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfR1VJREVEX05FWFQgICAgICAgICAgIEdPTVBfbG9vcF91bGxfZ3VpZGVkX25leHQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfR1VJREVEX1NUQVJUICAgICAgICAgIEdPTVBfbG9vcF91bGxfZ3VpZGVkX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfRFlOQU1JQ19ORVhUICBHT01QX2xvb3BfdWxsX29yZGVyZWRfZHluYW1pY19uZXh0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfRFlOQU1JQ19TVEFSVCBHT01QX2xvb3BfdWxsX29yZGVyZWRfZHluYW1pY19zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX0dVSURFRF9ORVhUICAgR09NUF9sb29wX3VsbF9vcmRlcmVkX2d1aWRlZF9uZXh0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfR1VJREVEX1NUQVJUICBHT01QX2xvb3BfdWxsX29yZGVyZWRfZ3VpZGVkX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfUlVOVElNRV9ORVhUICBHT01QX2xvb3BfdWxsX29yZGVyZWRfcnVudGltZV9uZXh0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfUlVOVElNRV9TVEFSVCBHT01QX2xvb3BfdWxsX29yZGVyZWRfcnVudGltZV9zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX1NUQVRJQ19ORVhUICAgR09NUF9sb29wX3VsbF9vcmRlcmVkX3N0YXRpY19uZXh0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfU1RBVElDX1NUQVJUICBHT01QX2xvb3BfdWxsX29yZGVyZWRfc3RhdGljX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX1JVTlRJTUVfTkVYVCAgICAgICAgICBHT01QX2xvb3BfdWxsX3J1bnRpbWVfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9SVU5USU1FX1NUQVJUICAgICAgICAgR09NUF9sb29wX3VsbF9ydW50aW1lX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX1NUQVRJQ19ORVhUICAgICAgICAgICBHT01QX2xvb3BfdWxsX3N0YXRpY19uZXh0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX1NUQVRJQ19TVEFSVCAgICAgICAgICBHT01QX2xvb3BfdWxsX3N0YXRpY19zdGFydAorCisvLyBBbGwgR09NUF8zLjAgc3ltYm9scworI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9UQVNLWUlFTEQgICAgICAgICAgICAgICAgICAgICAgR09NUF90YXNreWllbGQKKworLy8gQWxsIEdPTVBfNC4wIHN5bWJvbHMgCisvLyBUT0RPOiBBcyBvZiAyMDEzLTEwLTE0LCBub25lIG9mIHRoZSBHT01QXzQuMCBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIGluIGxpYm9tcAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9CQVJSSUVSX0NBTkNFTCAgICAgICAgICAgICAgICAgR09NUF9iYXJyaWVyX2NhbmNlbAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9DQU5DRUwgICAgICAgICAgICAgICAgICAgICAgICAgR09NUF9jYW5jZWwKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfQ0FOQ0VMTEFUSU9OX1BPSU5UICAgICAgICAgICAgIEdPTVBfY2FuY2VsbGF0aW9uX3BvaW50CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRU5EX0NBTkNFTCAgICAgICAgICAgICAgICBHT01QX2xvb3BfZW5kX2NhbmNlbAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0RZTkFNSUMgICAgICAgICAgR09NUF9wYXJhbGxlbF9sb29wX2R5bmFtaWMKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9HVUlERUQgICAgICAgICAgIEdPTVBfcGFyYWxsZWxfbG9vcF9ndWlkZWQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9SVU5USU1FICAgICAgICAgIEdPTVBfcGFyYWxsZWxfbG9vcF9ydW50aW1lCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfU1RBVElDICAgICAgICAgICBHT01QX3BhcmFsbGVsX2xvb3Bfc3RhdGljCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX1NFQ1RJT05TICAgICAgICAgICAgICBHT01QX3BhcmFsbGVsX3NlY3Rpb25zCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMICAgICAgICAgICAgICAgICAgICAgICBHT01QX3BhcmFsbGVsCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX0VORF9DQU5DRUwgICAgICAgICAgICBHT01QX3NlY3Rpb25zX2VuZF9jYW5jZWwKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfVEFTS0dST1VQX1NUQVJUICAgICAgICAgICAgICAgIEdPTVBfdGFza2dyb3VwX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1RBU0tHUk9VUF9FTkQgICAgICAgICAgICAgICAgICBHT01QX3Rhc2tncm91cF9lbmQKKy8qIFRhcmdldCBmdW5jdGlvbnMgc2hvdWxkIGJlIHRha2VuIGNhcmUgb2YgYnkgbGlib2ZmbG9hZCAqLworI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9UQVJHRVQgICAgICAgICAgICAgICAgICAgICAgICAgR09NUF90YXJnZXQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfVEFSR0VUX0RBVEEgICAgICAgICAgICAgICAgICAgIEdPTVBfdGFyZ2V0X2RhdGEKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfVEFSR0VUX0VORF9EQVRBICAgICAgICAgICAgICAgIEdPTVBfdGFyZ2V0X2VuZF9kYXRhCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1RBUkdFVF9VUERBVEUgICAgICAgICAgICAgICAgICBHT01QX3RhcmdldF91cGRhdGUKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfVEVBTVMgICAgICAgICAgICAgICAgICAgICAgICAgIEdPTVBfdGVhbXMKKworI2lmZGVmIEtNUF9VU0VfVkVSU0lPTl9TWU1CT0xTCisgICAgI2RlZmluZSB4c3RyKHgpIHN0cih4KQorICAgICNkZWZpbmUgc3RyKHgpICN4CisKKyAgICAvLyBJZiBMaW51eCwgeGV4cGFuZCBwcmVwZW5kcyBfX2ttcF9hcGlfIHRvIHRoZSByZWFsIEFQSSBuYW1lCisgICAgI2RlZmluZSB4ZXhwYW5kKGFwaV9uYW1lKSBleHBhbmQoYXBpX25hbWUpCisgICAgI2RlZmluZSBleHBhbmQoYXBpX25hbWUpIF9fa21wX2FwaV8jI2FwaV9uYW1lCisKKyAgICAjZGVmaW5lIHhhbGlhc2lmeShhcGlfbmFtZSx2ZXIpIGFsaWFzaWZ5KGFwaV9uYW1lLHZlcikKKyAgICAjZGVmaW5lIGFsaWFzaWZ5KGFwaV9uYW1lLHZlcikgX190eXBlb2ZfXyhfX2ttcF9hcGlfIyNhcGlfbmFtZSkgX19rbXBfYXBpXyMjYXBpX25hbWUjI18jI3ZlciMjX2FsaWFzIF9fYXR0cmlidXRlX18oKGFsaWFzKHhzdHIoX19rbXBfYXBpXyMjYXBpX25hbWUpKSkpCisKKyAgICAjZGVmaW5lIHh2ZXJzaW9uaWZ5KGFwaV9uYW1lLCB2ZXJzaW9uX251bSwgdmVyc2lvbl9zdHIpIHZlcnNpb25pZnkoYXBpX25hbWUsIHZlcnNpb25fbnVtLCB2ZXJzaW9uX3N0ciwgIlZFUlNJT04iKQorICAgICNkZWZpbmUgdmVyc2lvbmlmeShhcGlfbmFtZSwgdmVyc2lvbl9udW0sIHZlcnNpb25fc3RyLCBkZWZhdWx0X3ZlcikgXAorICAgIF9fYXNtX18oIi5zeW12ZXIgIiB4c3RyKF9fa21wX2FwaV8jI2FwaV9uYW1lIyNfIyN2ZXJzaW9uX251bSMjX2FsaWFzKSAiLCIgeHN0cihhcGlfbmFtZSkgIkAiIHZlcnNpb25fc3RyICJcblx0Iik7IFwKKyAgICBfX2FzbV9fKCIuc3ltdmVyICIgeHN0cihfX2ttcF9hcGlfIyNhcGlfbmFtZSkgIiwiIHhzdHIoYXBpX25hbWUpICJAQCIgZGVmYXVsdF92ZXIgIlxuXHQiKQorCisjZWxzZSAvLyBLTVBfVVNFX1ZFUlNJT05fU1lNQk9MUworICAgICNkZWZpbmUgeHN0cih4KSAvKiBOb3RoaW5nICovCisgICAgI2RlZmluZSBzdHIoeCkgIC8qIE5vdGhpbmcgKi8KKworICAgIC8vIGlmIFdpbmRvd3Mgb3IgTWFjLCB4ZXhwYW5kIGRvZXMgbm8gbmFtZSB0cmFuc2Zvcm1hdGlvbgorICAgICNkZWZpbmUgeGV4cGFuZChhcGlfbmFtZSkgZXhwYW5kKGFwaV9uYW1lKQorICAgICNkZWZpbmUgZXhwYW5kKGFwaV9uYW1lKSBhcGlfbmFtZQorCisgICAgI2RlZmluZSB4YWxpYXNpZnkoYXBpX25hbWUsdmVyKSAvKiBOb3RoaW5nICovCisgICAgI2RlZmluZSBhbGlhc2lmeShhcGlfbmFtZSx2ZXIpICAvKiBOb3RoaW5nICovCisKKyAgICAjZGVmaW5lIHh2ZXJzaW9uaWZ5KGFwaV9uYW1lLCB2ZXJzaW9uX251bSwgdmVyc2lvbl9zdHIpIC8qIE5vdGhpbmcgKi8KKyAgICAjZGVmaW5lIHZlcnNpb25pZnkoYXBpX25hbWUsIHZlcnNpb25fbnVtLCB2ZXJzaW9uX3N0ciwgZGVmYXVsdF92ZXIpIC8qIE5vdGhpbmcgKi8KKworI2VuZGlmIC8vIEtNUF9VU0VfVkVSU0lPTl9TWU1CT0xTCisKKyNlbmRpZiAvKiBLTVBfRlROX09TX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2Z0bl9zdGRjYWxsLmMgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZnRuX3N0ZGNhbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjcwZDc0Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2Z0bl9zdGRjYWxsLmMKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIGttcF9mdG5fc3RkY2FsbC5jIC0tIEZvcnRyYW4gX19zdGRjYWxsIGxpbmthZ2Ugc3VwcG9ydCBmb3IgT3Blbk1QLgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisKKy8vIE5vdGU6IFRoaXMgc3RyaW5nIGlzIG5vdCBwcmludGVkIHdoZW4gS01QX1ZFUlNJT049MS4KK2NoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9mdG5zdGRjYWxsW10gPSBLTVBfVkVSU0lPTl9QUkVGSVggIkZvcnRyYW4gX19zdGRjYWxsIE9NUCBzdXBwb3J0OiAiCisjaWZkZWYgVVNFX0ZUTl9TVERDQUxMCisgICAgInllcyI7CisjZWxzZQorICAgICJubyI7CisjZW5kaWYKKworI2lmZGVmIFVTRV9GVE5fU1REQ0FMTAorCisjZGVmaW5lIEZUTl9TVERDQUxMIAlLTVBfU1REQ0FMTAorI2RlZmluZSBLTVBfRlROX0VOVFJJRVMJVVNFX0ZUTl9TVERDQUxMCisKKyNpbmNsdWRlICJrbXBfZnRuX29zLmgiCisjaW5jbHVkZSAia21wX2Z0bl9lbnRyeS5oIgorCisjZW5kaWYgLyogVVNFX0ZUTl9TVERDQUxMICovCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9nbG9iYWwuYyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9nbG9iYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGFjNzViCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2dsb2JhbC5jCkBAIC0wLDAgKzEsNDcxIEBACisvKgorICoga21wX2dsb2JhbC5jIC0tIEtQVFMgZ2xvYmFsIHZhcmlhYmxlcyBmb3IgcnVudGltZSBzdXBwb3J0IGxpYnJhcnkKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorCitrbXBfa2V5X3QgX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleTsKKwora21wX2NwdWluZm9fdCAgIF9fa21wX2NwdWluZm8gPSB7IDAgfTsgLy8gTm90IGluaXRpYWxpemVkCisKKyNpZiBLTVBfU1RBVFNfRU5BQkxFRAorI2luY2x1ZGUgImttcF9zdGF0cy5oIgorLy8gbG9jayBmb3IgbW9kaWZ5aW5nIHRoZSBnbG9iYWwgX19rbXBfc3RhdHNfbGlzdAora21wX3Rhc19sb2NrX3QgX19rbXBfc3RhdHNfbG9jazsKKworLy8gZ2xvYmFsIGxpc3Qgb2YgcGVyIHRocmVhZCBzdGF0cywgdGhlIGhlYWQgaXMgYSBzZW50aW5lbCBub2RlIHdoaWNoIGFjY3VtdWxhdGVzIGFsbCBzdGF0cyBwcm9kdWNlZCBiZWZvcmUgX19rbXBfY3JlYXRlX3dvcmtlciBpcyBjYWxsZWQuCitrbXBfc3RhdHNfbGlzdCBfX2ttcF9zdGF0c19saXN0OworCisvLyB0aHJlYWQgbG9jYWwgcG9pbnRlciB0byBzdGF0cyBub2RlIHdpdGhpbiBsaXN0CitfX3RocmVhZCBrbXBfc3RhdHNfbGlzdCogX19rbXBfc3RhdHNfdGhyZWFkX3B0ciA9ICZfX2ttcF9zdGF0c19saXN0OworCisvLyBnaXZlcyByZWZlcmVuY2UgdGljayBmb3IgYWxsIGV2ZW50cyAoY29uc2lkZXJlZCB0aGUgMCB0aWNrKQordHNjX3RpY2tfY291bnQgX19rbXBfc3RhdHNfc3RhcnRfdGltZTsKKyNlbmRpZgorI2lmIEtNUF9VU0VfSFdMT0MKK2ludCBfX2ttcF9od2xvY19lcnJvciA9IEZBTFNFOworaHdsb2NfdG9wb2xvZ3lfdCBfX2ttcF9od2xvY190b3BvbG9neSA9IE5VTEw7CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIElOSVRJQUxJWkFUSU9OIFZBUklBQkxFUyAqLworLyogdGhleSBhcmUgc3luY3Jvbml6ZWQgdG8gd3JpdGUgZHVyaW5nIGluaXQsIGJ1dCByZWFkIGFueXRpbWUgKi8KK3ZvbGF0aWxlIGludCAgICAgICAgX19rbXBfaW5pdF9zZXJpYWwgICAgID0gRkFMU0U7Cit2b2xhdGlsZSBpbnQgICAgICAgIF9fa21wX2luaXRfZ3RpZCAgICAgICA9IEZBTFNFOwordm9sYXRpbGUgaW50ICAgICAgICBfX2ttcF9pbml0X2NvbW1vbiAgICAgPSBGQUxTRTsKK3ZvbGF0aWxlIGludCAgICAgICAgX19rbXBfaW5pdF9taWRkbGUgICAgID0gRkFMU0U7Cit2b2xhdGlsZSBpbnQgICAgICAgIF9fa21wX2luaXRfcGFyYWxsZWwgICA9IEZBTFNFOwordm9sYXRpbGUgaW50ICAgICAgICBfX2ttcF9pbml0X21vbml0b3IgICAgPSAwOyAgLyogMSAtIGxhdW5jaGVkLCAyIC0gYWN0dWFsbHkgc3RhcnRlZCAoV2luZG93cyogT1Mgb25seSkgKi8KK3ZvbGF0aWxlIGludCAgICAgICAgX19rbXBfaW5pdF91c2VyX2xvY2tzID0gRkFMU0U7CisKKy8qIGxpc3Qgb2YgYWRkcmVzcyBvZiBhbGxvY2F0ZWQgY2FjaGVzIGZvciBjb21tb25zICovCitrbXBfY2FjaGVkX2FkZHJfdCAgKl9fa21wX3RocmVhZHByaXZfY2FjaGVfbGlzdCA9IE5VTEw7CisKK2ludCAgICAgICAgICAgICAgICAgX19rbXBfaW5pdF9jb3VudGVyICA9IDA7CitpbnQgICAgICAgICAgICAgICAgIF9fa21wX3Jvb3RfY291bnRlciAgPSAwOworaW50ICAgICAgICAgICAgICAgICBfX2ttcF92ZXJzaW9uICAgICAgID0gMDsKKwordm9sYXRpbGUga21wX3VpbnQzMiBfX2ttcF90ZWFtX2NvdW50ZXIgID0gMDsKK3ZvbGF0aWxlIGttcF91aW50MzIgX19rbXBfdGFza19jb3VudGVyICA9IDA7CisKK3Vuc2lnbmVkIGludCBfX2ttcF9pbml0X3dhaXQgPSBLTVBfREVGQVVMVF9JTklUX1dBSVQ7ICAgLyogaW5pdGlhbCBudW1iZXIgb2Ygc3Bpbi10ZXN0cyAgICovCit1bnNpZ25lZCBpbnQgX19rbXBfbmV4dF93YWl0ID0gS01QX0RFRkFVTFRfTkVYVF9XQUlUOyAgIC8qIHN1c2VxdWVudCBudW1iZXIgb2Ygc3Bpbi10ZXN0cyAqLworCitzaXplX3QgICAgICBfX2ttcF9zdGtzaXplICAgICAgICAgPSBLTVBfREVGQVVMVF9TVEtTSVpFOworc2l6ZV90ICAgICAgX19rbXBfbW9uaXRvcl9zdGtzaXplID0gMDsgIC8vIGF1dG8gYWRqdXN0CitzaXplX3QgICAgICBfX2ttcF9zdGtvZmZzZXQgICAgICAgPSBLTVBfREVGQVVMVF9TVEtPRkZTRVQ7CitpbnQgICAgICAgICBfX2ttcF9zdGtwYWRkaW5nICAgICAgPSBLTVBfTUlOX1NUS1BBRERJTkc7CisKK3NpemVfdCAgICBfX2ttcF9tYWxsb2NfcG9vbF9pbmNyICA9IEtNUF9ERUZBVUxUX01BTExPQ19QT09MX0lOQ1I7CisKKy8qIEJhcnJpZXIgbWV0aG9kIGRlZmF1bHRzLCBzZXR0aW5ncywgYW5kIHN0cmluZ3MgKi8KKy8qIGJyYW5jaCBmYWN0b3IgPSAyXmJyYW5jaF9iaXRzIChvbmx5IHJlbGV2YW50IGZvciB0cmVlIGFuZCBoeXBlciBiYXJyaWVyIHR5cGVzKSAqLworI2lmIEtNUF9BUkNIX1g4Nl82NAora21wX3VpbnQzMiBfX2ttcF9iYXJyaWVyX2dhdGhlcl9iYl9kZmx0ICAgICAgPSAyOyAgLyogYnJhbmNoX2ZhY3RvciA9IDQgKi8gLyogaHlwZXIyOiBDNzg5ODAgKi8KK2ttcF91aW50MzIgX19rbXBfYmFycmllcl9yZWxlYXNlX2JiX2RmbHQgICAgID0gMjsgIC8qIGJyYW5jaF9mYWN0b3IgPSA0ICovIC8qIGh5cGVyMjogQzc4OTgwICovCisjZWxzZQora21wX3VpbnQzMiBfX2ttcF9iYXJyaWVyX2dhdGhlcl9iYl9kZmx0ICAgICAgPSAyOyAgLyogYnJhbmNoX2ZhY3RvciA9IDQgKi8gLyogY29tbXVuaWNhdGlvbiBpbiBjb3JlIGZvciBNSUMgKi8KK2ttcF91aW50MzIgX19rbXBfYmFycmllcl9yZWxlYXNlX2JiX2RmbHQgICAgID0gMjsgIC8qIGJyYW5jaF9mYWN0b3IgPSA0ICovIC8qIGNvbW11bmljYXRpb24gaW4gY29yZSBmb3IgTUlDICovCisjZW5kaWYgLy8gS01QX0FSQ0hfWDg2XzY0CisjaWYgS01QX0FSQ0hfWDg2XzY0CitrbXBfYmFyX3BhdF9lIF9fa21wX2JhcnJpZXJfZ2F0aGVyX3BhdF9kZmx0ICA9IGJwX2h5cGVyX2JhcjsgIC8qIGh5cGVyMjogQzc4OTgwICovCitrbXBfYmFyX3BhdF9lIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9wYXRfZGZsdCA9IGJwX2h5cGVyX2JhcjsgIC8qIGh5cGVyMjogQzc4OTgwICovCisjZWxzZQora21wX2Jhcl9wYXRfZSBfX2ttcF9iYXJyaWVyX2dhdGhlcl9wYXRfZGZsdCAgPSBicF9saW5lYXJfYmFyOwora21wX2Jhcl9wYXRfZSBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfcGF0X2RmbHQgPSBicF9saW5lYXJfYmFyOworI2VuZGlmCitrbXBfdWludDMyIF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JyYW5jaF9iaXRzICBbIGJzX2xhc3RfYmFycmllciBdID0geyAwIH07CitrbXBfdWludDMyIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0cyBbIGJzX2xhc3RfYmFycmllciBdID0geyAwIH07CitrbXBfYmFyX3BhdF9lIF9fa21wX2JhcnJpZXJfZ2F0aGVyX3BhdHRlcm4gICBbIGJzX2xhc3RfYmFycmllciBdID0geyBicF9saW5lYXJfYmFyIH07CitrbXBfYmFyX3BhdF9lIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9wYXR0ZXJuICBbIGJzX2xhc3RfYmFycmllciBdID0geyBicF9saW5lYXJfYmFyIH07CitjaGFyIGNvbnN0ICpfX2ttcF9iYXJyaWVyX2JyYW5jaF9iaXRfZW52X25hbWUgWyBic19sYXN0X2JhcnJpZXIgXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAiS01QX1BMQUlOX0JBUlJJRVIiLCAiS01QX0ZPUktKT0lOX0JBUlJJRVIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNpZiBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAiS01QX1JFRFVDVElPTl9CQVJSSUVSIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZW5kaWYgLy8gS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworY2hhciBjb25zdCAqX19rbXBfYmFycmllcl9wYXR0ZXJuX2Vudl9uYW1lICAgIFsgYnNfbGFzdF9iYXJyaWVyIF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgIktNUF9QTEFJTl9CQVJSSUVSX1BBVFRFUk4iLCAiS01QX0ZPUktKT0lOX0JBUlJJRVJfUEFUVEVSTiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2lmIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICJLTVBfUkVEVUNUSU9OX0JBUlJJRVJfUEFUVEVSTiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2VuZGlmIC8vIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKK2NoYXIgY29uc3QgKl9fa21wX2JhcnJpZXJfdHlwZV9uYW1lICAgICAgICAgICBbIGJzX2xhc3RfYmFycmllciBdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICJwbGFpbiIsICJmb3Jram9pbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2lmIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICJyZWR1Y3Rpb24iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNlbmRpZiAvLyBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CitjaGFyIGNvbnN0ICpfX2ttcF9iYXJyaWVyX3BhdHRlcm5fbmFtZVticF9sYXN0X2Jhcl0gPSB7ImxpbmVhciIsInRyZWUiLCJoeXBlciIsImhpZXJhcmNoaWNhbCJ9OworCitpbnQgICAgICAgX19rbXBfYWxsVGhyZWFkc1NwZWNpZmllZCA9IDA7CitzaXplX3QgICAgX19rbXBfYWxpZ25fYWxsb2MgPSBDQUNIRV9MSU5FOworCisKK2ludCAgICAgX19rbXBfZ2VuZXJhdGVfd2FybmluZ3MgPSBrbXBfd2FybmluZ3NfbG93OworaW50ICAgICAgICAgIF9fa21wX3Jlc2VydmVfd2FybiA9IDA7CitpbnQgICAgICAgICAgICAgICAgIF9fa21wX3hwcm9jID0gMDsKK2ludCAgICAgICAgICAgIF9fa21wX2F2YWlsX3Byb2MgPSAwOworc2l6ZV90ICAgIF9fa21wX3N5c19taW5fc3Rrc2l6ZSA9IEtNUF9NSU5fU1RLU0laRTsKK2ludCAgICAgICAgICAgX19rbXBfc3lzX21heF9udGggPSBLTVBfTUFYX05USDsKK2ludCAgICAgICAgICAgICAgIF9fa21wX21heF9udGggPSAwOworaW50ICAgICAgX19rbXBfdGhyZWFkc19jYXBhY2l0eSA9IDA7CitpbnQgICAgICAgICBfX2ttcF9kZmx0X3RlYW1fbnRoID0gMDsKK2ludCAgICAgIF9fa21wX2RmbHRfdGVhbV9udGhfdWIgPSAwOworaW50ICAgICAgICAgICBfX2ttcF90cF9jYXBhY2l0eSA9IDA7CitpbnQgICAgICAgICAgICAgX19rbXBfdHBfY2FjaGVkID0gMDsKK2ludCAgICAgICAgICAgX19rbXBfZGZsdF9uZXN0ZWQgPSBGQUxTRTsKK2ludCBfX2ttcF9kZmx0X21heF9hY3RpdmVfbGV2ZWxzID0gS01QX01BWF9BQ1RJVkVfTEVWRUxTX0xJTUlUOyAvKiBtYXhfYWN0aXZlX2xldmVscyBsaW1pdCAqLworI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCitpbnQgX19rbXBfaG90X3RlYW1zX21vZGUgICAgICAgICA9IDA7IC8qIDAgLSBmcmVlIGV4dHJhIHRocmVhZHMgd2hlbiByZWR1Y2VkICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEgLSBrZWVwIGV4dHJhIHRocmVhZHMgd2hlbiByZWR1Y2VkICovCitpbnQgX19rbXBfaG90X3RlYW1zX21heF9sZXZlbCAgICA9IDE7IC8qIG5lc3RpbmcgbGV2ZWwgb2YgaG90IHRlYW1zICovCisjZW5kaWYKK2VudW0gbGlicmFyeV90eXBlIF9fa21wX2xpYnJhcnkgPSBsaWJyYXJ5X25vbmU7CitlbnVtIHNjaGVkX3R5cGUgICAgIF9fa21wX3NjaGVkID0ga21wX3NjaF9kZWZhdWx0OyAgLyogc2NoZWR1bGluZyBtZXRob2QgZm9yIHJ1bnRpbWUgc2NoZWR1bGluZyAqLworZW51bSBzY2hlZF90eXBlICAgIF9fa21wX3N0YXRpYyA9IGttcF9zY2hfc3RhdGljX2dyZWVkeTsgLyogZGVmYXVsdCBzdGF0aWMgc2NoZWR1bGluZyBtZXRob2QgKi8KK2VudW0gc2NoZWRfdHlwZSAgICBfX2ttcF9ndWlkZWQgPSBrbXBfc2NoX2d1aWRlZF9pdGVyYXRpdmVfY2h1bmtlZDsgLyogZGVmYXVsdCBndWlkZWQgc2NoZWR1bGluZyBtZXRob2QgKi8KK2VudW0gc2NoZWRfdHlwZSAgICAgIF9fa21wX2F1dG8gPSBrbXBfc2NoX2d1aWRlZF9hbmFseXRpY2FsX2NodW5rZWQ7IC8qIGRlZmF1bHQgYXV0byBzY2hlZHVsaW5nIG1ldGhvZCAqLworaW50ICAgICAgICBfX2ttcF9kZmx0X2Jsb2NrdGltZSA9IEtNUF9ERUZBVUxUX0JMT0NLVElNRTsKK2ludCAgICAgICBfX2ttcF9tb25pdG9yX3dha2V1cHMgPSBLTVBfTUlOX01PTklUT1JfV0FLRVVQUzsKK2ludCAgICAgICAgICBfX2ttcF9idF9pbnRlcnZhbHMgPSBLTVBfSU5URVJWQUxTX0ZST01fQkxPQ0tUSU1FKCBLTVBfREVGQVVMVF9CTE9DS1RJTUUsIEtNUF9NSU5fTU9OSVRPUl9XQUtFVVBTICk7CisjaWZkZWYgS01QX0FESlVTVF9CTE9DS1RJTUUKK2ludCAgICAgICAgICAgICAgIF9fa21wX3plcm9fYnQgPSBGQUxTRTsKKyNlbmRpZiAvKiBLTVBfQURKVVNUX0JMT0NLVElNRSAqLworI2lmZGVmIEtNUF9ERkxUX05USF9DT1JFUworaW50ICAgICAgICAgICAgICAgIF9fa21wX25jb3JlcyA9IDA7CisjZW5kaWYKK2ludCAgICAgICAgICAgICAgICAgX19rbXBfY2h1bmsgPSAwOworaW50ICAgICAgICAgICBfX2ttcF9hYm9ydF9kZWxheSA9IDA7CisjaWYgS01QX09TX0xJTlVYICYmIGRlZmluZWQoS01QX1REQVRBX0dUSUQpCitpbnQgICAgICAgICAgICAgX19rbXBfZ3RpZF9tb2RlID0gMzsgLyogdXNlIF9fZGVjbHNwZWModGhyZWFkKSBUTFMgdG8gc3RvcmUgZ3RpZCAqLworaW50ICAgICAgX19rbXBfYWRqdXN0X2d0aWRfbW9kZSA9IEZBTFNFOworI2VsaWYgS01QX09TX1dJTkRPV1MKK2ludCAgICAgICAgICAgICBfX2ttcF9ndGlkX21vZGUgPSAyOyAvKiB1c2UgVExTIGZ1bmN0aW9ucyB0byBzdG9yZSBndGlkICovCitpbnQgICAgICBfX2ttcF9hZGp1c3RfZ3RpZF9tb2RlID0gRkFMU0U7CisjZWxzZQoraW50ICAgICAgICAgICAgIF9fa21wX2d0aWRfbW9kZSA9IDA7IC8qIHNlbGVjdCBtZXRob2QgdG8gZ2V0IGd0aWQgYmFzZWQgb24gI3RocmVhZHMgKi8KK2ludCAgICAgIF9fa21wX2FkanVzdF9ndGlkX21vZGUgPSBUUlVFOworI2VuZGlmIC8qIEtNUF9PU19MSU5VWCAmJiBkZWZpbmVkKEtNUF9UREFUQV9HVElEKSAqLworI2lmZGVmIEtNUF9UREFUQV9HVElECisjaWYgS01QX09TX1dJTkRPV1MKK19fZGVjbHNwZWModGhyZWFkKSBpbnQgX19rbXBfZ3RpZCA9IEtNUF9HVElEX0RORTsKKyNlbHNlCitfX3RocmVhZCBpbnQgX19rbXBfZ3RpZCA9IEtNUF9HVElEX0RORTsKKyNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAtIHdvcmthcm91bmQgYmVjYXVzZSBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBjb21waWxlciAyMDExMDMxNiBkb2Vzbid0IGFjY2VwdCBfX2RlY2xzcGVjICovCisjZW5kaWYgLyogS01QX1REQVRBX0dUSUQgKi8KK2ludCAgICAgICAgICBfX2ttcF90bHNfZ3RpZF9taW4gPSBJTlRfTUFYOworaW50ICAgICAgICAgICAgX19rbXBfZm9yZWlnbl90cCA9IFRSVUU7CisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAoraW50ICAgIF9fa21wX2luaGVyaXRfZnBfY29udHJvbCA9IFRSVUU7CitrbXBfaW50MTYgIF9fa21wX2luaXRfeDg3X2ZwdV9jb250cm9sX3dvcmQgPSAwOwora21wX3VpbnQzMiAgICAgX19rbXBfaW5pdF9teGNzciA9IDA7CisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisjaWZkZWYgVVNFX0xPQURfQkFMQU5DRQorZG91YmxlICBfX2ttcF9sb2FkX2JhbGFuY2VfaW50ZXJ2YWwgICA9IDEuMDsKKyNlbmRpZiAvKiBVU0VfTE9BRF9CQUxBTkNFICovCisKK2ttcF9uZXN0ZWRfbnRocmVhZHNfdCBfX2ttcF9uZXN0ZWRfbnRoICA9IHsgTlVMTCwgMCwgMCB9OworCisjaWYgS01QX1VTRV9BREFQVElWRV9MT0NLUworCitrbXBfYWRhcHRpdmVfYmFja29mZl9wYXJhbXNfdCBfX2ttcF9hZGFwdGl2ZV9iYWNrb2ZmX3BhcmFtcyA9IHsgMSwgMTAyNCB9OyAvLyBUT0RPOiB0dW5lIGl0IQorCisjaWYgS01QX0RFQlVHX0FEQVBUSVZFX0xPQ0tTCitjaGFyICogX19rbXBfc3BlY3VsYXRpdmVfc3RhdHNmaWxlID0gIi0iOworI2VuZGlmCisKKyNlbmRpZiAvLyBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisKKyNpZiBPTVBfNDBfRU5BQkxFRAoraW50IF9fa21wX2Rpc3BsYXlfZW52ICAgICAgICAgICA9IEZBTFNFOworaW50IF9fa21wX2Rpc3BsYXlfZW52X3ZlcmJvc2UgICA9IEZBTFNFOworaW50IF9fa21wX29tcF9jYW5jZWxsYXRpb24gICAgICA9IEZBTFNFOworI2VuZGlmCisKKy8qIG1hcCBPTVAgMy4wIHNjaGVkdWxlIHR5cGVzIHdpdGggb3VyIGludGVybmFsIHNjaGVkdWxlIHR5cGVzICovCitlbnVtIHNjaGVkX3R5cGUgX19rbXBfc2NoX21hcFsga21wX3NjaGVkX3VwcGVyIC0ga21wX3NjaGVkX2xvd2VyX2V4dCArIGttcF9zY2hlZF91cHBlcl9zdGQgLSBrbXBfc2NoZWRfbG93ZXIgLSAyIF0gPSB7CisgICAga21wX3NjaF9zdGF0aWNfY2h1bmtlZCwgICAgIC8vID09PiBrbXBfc2NoZWRfc3RhdGljICAgICAgICAgICAgPSAxCisgICAga21wX3NjaF9keW5hbWljX2NodW5rZWQsICAgIC8vID09PiBrbXBfc2NoZWRfZHluYW1pYyAgICAgICAgICAgPSAyCisgICAga21wX3NjaF9ndWlkZWRfY2h1bmtlZCwgICAgIC8vID09PiBrbXBfc2NoZWRfZ3VpZGVkICAgICAgICAgICAgPSAzCisgICAga21wX3NjaF9hdXRvLCAgICAgICAgICAgICAgIC8vID09PiBrbXBfc2NoZWRfYXV0byAgICAgICAgICAgICAgPSA0CisgICAga21wX3NjaF90cmFwZXpvaWRhbCAgICAgICAgIC8vID09PiBrbXBfc2NoZWRfdHJhcGV6b2lkYWwgICAgICAgPSAxMDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBsaWtlbHkgbm90IHVzZWQsIGludHJvZHVjZWQgaGVyZSBqdXN0IHRvIGRlYnVnIHRoZSBjb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIHB1YmxpYyBpbnRlbCBleHRlbnNpb24gc2NoZWR1bGVzCit9OworCisjaWYgS01QX09TX0xJTlVYCitlbnVtIGNsb2NrX2Z1bmN0aW9uX3R5cGUgX19rbXBfY2xvY2tfZnVuY3Rpb247CitpbnQgX19rbXBfY2xvY2tfZnVuY3Rpb25fcGFyYW07CisjZW5kaWYgLyogS01QX09TX0xJTlVYICovCisKKyNpZiBLTVBfQVJDSF9YODZfNjQgJiYgKEtNUF9PU19MSU5VWCB8fCBLTVBfT1NfV0lORE9XUykKK2VudW0gbWljX3R5cGUgX19rbXBfbWljX3R5cGUgPSBub25fbWljOworI2VuZGlmCisKKyNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisKKyMgaWYgS01QX0dST1VQX0FGRklOSVRZCisKK2ludCBfX2ttcF9udW1fcHJvY19ncm91cHMgPSAxOworCitrbXBfR2V0QWN0aXZlUHJvY2Vzc29yQ291bnRfdCBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JDb3VudCA9IE5VTEw7CitrbXBfR2V0QWN0aXZlUHJvY2Vzc29yR3JvdXBDb3VudF90IF9fa21wX0dldEFjdGl2ZVByb2Nlc3Nvckdyb3VwQ291bnQgPSBOVUxMOwora21wX0dldFRocmVhZEdyb3VwQWZmaW5pdHlfdCBfX2ttcF9HZXRUaHJlYWRHcm91cEFmZmluaXR5ID0gTlVMTDsKK2ttcF9TZXRUaHJlYWRHcm91cEFmZmluaXR5X3QgX19rbXBfU2V0VGhyZWFkR3JvdXBBZmZpbml0eSA9IE5VTEw7CisKKyMgZW5kaWYgLyogS01QX0dST1VQX0FGRklOSVRZICovCisKK3NpemVfdCAgIF9fa21wX2FmZmluX21hc2tfc2l6ZSA9IDA7CitlbnVtIGFmZmluaXR5X3R5cGUgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X2RlZmF1bHQ7CitlbnVtIGFmZmluaXR5X2dyYW4gX19rbXBfYWZmaW5pdHlfZ3JhbiA9IGFmZmluaXR5X2dyYW5fZGVmYXVsdDsKK2ludCBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyAgPSAtMTsKK2ludCBfX2ttcF9hZmZpbml0eV9kdXBzID0gVFJVRTsKK2VudW0gYWZmaW5pdHlfdG9wX21ldGhvZCBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID0gYWZmaW5pdHlfdG9wX21ldGhvZF9kZWZhdWx0OworaW50ICAgICAgX19rbXBfYWZmaW5pdHlfY29tcGFjdCAgICAgID0gMDsKK2ludCAgICAgIF9fa21wX2FmZmluaXR5X29mZnNldCAgICAgICA9IDA7CitpbnQgICAgICBfX2ttcF9hZmZpbml0eV92ZXJib3NlICAgICAgPSBGQUxTRTsKK2ludCAgICAgIF9fa21wX2FmZmluaXR5X3dhcm5pbmdzICAgICA9IFRSVUU7CitpbnQgICAgICBfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2sgPSBhZmZpbml0eV9yZXNwZWN0X21hc2tfZGVmYXVsdDsKK2NoYXIgKiAgIF9fa21wX2FmZmluaXR5X3Byb2NsaXN0ICAgICA9IE5VTEw7CitrbXBfYWZmaW5fbWFza190ICpfX2ttcF9hZmZpbml0eV9tYXNrcyA9IE5VTEw7Cit1bnNpZ25lZCBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgICAgPSAwOworCitjaGFyIGNvbnN0ICogIF9fa21wX2NwdWluZm9fZmlsZSAgICAgPSBOVUxMOworCisjZW5kaWYgLyogS01QX0FGRklOSVRZX1NVUFBPUlRFRCAqLworCisjaWYgT01QXzQwX0VOQUJMRUQKK2ttcF9uZXN0ZWRfcHJvY19iaW5kX3QgX19rbXBfbmVzdGVkX3Byb2NfYmluZCA9IHsgTlVMTCwgMCwgMCB9OworaW50IF9fa21wX2FmZmluaXR5X251bV9wbGFjZXMgPSAwOworI2VuZGlmCisKK2ludCBfX2ttcF9wbGFjZV9udW1fc29ja2V0cyA9IDA7CitpbnQgX19rbXBfcGxhY2Vfc29ja2V0X29mZnNldCA9IDA7CitpbnQgX19rbXBfcGxhY2VfbnVtX2NvcmVzID0gMDsKK2ludCBfX2ttcF9wbGFjZV9jb3JlX29mZnNldCA9IDA7CitpbnQgX19rbXBfcGxhY2VfbnVtX3RocmVhZHNfcGVyX2NvcmUgPSAwOworCitrbXBfdGFza2luZ19tb2RlX3QgX19rbXBfdGFza2luZ19tb2RlID0gdHNrbV90YXNrX3RlYW1zOworCisvKiBUaGlzIGNoZWNrIGVuc3VyZXMgdGhhdCB0aGUgY29tcGlsZXIgaXMgcGFzc2luZyB0aGUgY29ycmVjdCBkYXRhIHR5cGUKKyAqIGZvciB0aGUgZmxhZ3MgZm9ybWFsIHBhcmFtZXRlciBvZiB0aGUgZnVuY3Rpb24ga21wY19vbXBfdGFza19hbGxvYygpLgorICogSWYgdGhlIHR5cGUgaXMgbm90IGEgNC1ieXRlIHR5cGUsIHRoZW4gZ2l2ZSBhbiBlcnJvciBtZXNzYWdlIGFib3V0CisgKiBhIG5vbi1wb3NpdGl2ZSBsZW5ndGggYXJyYXkgcG9pbnRpbmcgaGVyZS4gIElmIHRoYXQgaGFwcGVucywgdGhlCisgKiBrbXBfdGFza2luZ19mbGFnc190IHN0cnVjdHVyZSBtdXN0IGJlIHJlZGVmaW5lZCB0byBoYXZlIGV4YWN0bHkgMzIgYml0cy4KKyAqLworS01QX0JVSUxEX0FTU0VSVCggc2l6ZW9mKGttcF90YXNraW5nX2ZsYWdzX3QpID09IDQgKTsKKwora21wX2ludDMyIF9fa21wX3Rhc2tfc3RlYWxpbmdfY29uc3RyYWludCA9IDE7ICAgLyogQ29uc3RyYWluIHRhc2sgc3RlYWxpbmcgYnkgZGVmYXVsdCAqLworCisjaWZkZWYgREVCVUdfU1VTUEVORAoraW50ICAgICAgICAgX19rbXBfc3VzcGVuZF9jb3VudCA9IDA7CisjZW5kaWYKKworaW50ICAgICBfX2ttcF9zZXR0aW5ncyA9IEZBTFNFOworaW50ICAgICBfX2ttcF9kdXBsaWNhdGVfbGlicmFyeV9vayA9IDA7CisjaWYgVVNFX0lUVF9CVUlMRAoraW50ICAgICBfX2ttcF9mb3Jram9pbl9mcmFtZXMgPSAxOworaW50ICAgICBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9IDM7CisjZW5kaWYKK1BBQ0tFRF9SRURVQ1RJT05fTUVUSE9EX1QgX19rbXBfZm9yY2VfcmVkdWN0aW9uX21ldGhvZCA9IHJlZHVjdGlvbl9tZXRob2Rfbm90X2RlZmluZWQ7CitpbnQgICAgIF9fa21wX2RldGVybV9yZWQgPSBGQUxTRTsKKworI2lmZGVmIEtNUF9ERUJVRworaW50ICAgICBrbXBfYV9kZWJ1ZyA9IDA7CitpbnQgICAgIGttcF9iX2RlYnVnID0gMDsKK2ludCAgICAga21wX2NfZGVidWcgPSAwOworaW50ICAgICBrbXBfZF9kZWJ1ZyA9IDA7CitpbnQgICAgIGttcF9lX2RlYnVnID0gMDsKK2ludCAgICAga21wX2ZfZGVidWcgPSAwOworaW50ICAgICBrbXBfZGlhZyAgICA9IDA7CisjZW5kaWYKKworLyogRm9yIGRlYnVnIGluZm9ybWF0aW9uIGxvZ2dpbmcgdXNpbmcgcm90YXRpbmcgYnVmZmVyICovCitpbnQgICAgIF9fa21wX2RlYnVnX2J1ZiA9IEZBTFNFOyAgICAgICAgLyogVFJVRSBtZWFucyB1c2UgYnVmZmVyLCBGQUxTRSBtZWFucyBwcmludCB0byBzdGRlcnIgKi8KK2ludCAgICAgX19rbXBfZGVidWdfYnVmX2xpbmVzID0gS01QX0RFQlVHX0JVRl9MSU5FU19JTklUOyAvKiBMaW5lcyBvZiBkZWJ1ZyBzdG9yZWQgaW4gYnVmZmVyICovCitpbnQgICAgIF9fa21wX2RlYnVnX2J1Zl9jaGFycyA9IEtNUF9ERUJVR19CVUZfQ0hBUlNfSU5JVDsgLyogQ2hhcmFjdGVycyBhbGxvd2VkIHBlciBsaW5lIGluIGJ1ZmZlciAqLworaW50ICAgICBfX2ttcF9kZWJ1Z19idWZfYXRvbWljID0gRkFMU0U7IC8qIFRSVUUgbWVhbnMgdXNlIGF0b21pYyB1cGRhdGUgb2YgYnVmZmVyIGVudHJ5IHBvaW50ZXIgKi8KKworY2hhciAgICpfX2ttcF9kZWJ1Z19idWZmZXIgPSBOVUxMOyAgICAgIC8qIERlYnVnIGJ1ZmZlciBpdHNlbGYgKi8KK2ludCAgICAgX19rbXBfZGVidWdfY291bnQgPSAwOyAgICAgICAgICAvKiBDb3VudGVyIGZvciBudW1iZXIgb2YgbGluZXMgcHJpbnRlZCBpbiBidWZmZXIgc28gZmFyICovCitpbnQgICAgIF9fa21wX2RlYnVnX2J1Zl93YXJuX2NoYXJzID0gMDsgLyogS2VlcCB0cmFjayBvZiBjaGFyIGluY3JlYXNlIHJlY29tbWVuZGVkIGluIHdhcm5pbmdzICovCisvKiBlbmQgcm90YXRpbmcgZGVidWcgYnVmZmVyICovCisKKyNpZmRlZiBLTVBfREVCVUcKK2ludCAgICAgX19rbXBfcGFyX3JhbmdlOyAgICAgICAgICAgLyogKzEgPT4gb25seSBnbyBwYXIgZm9yIGNvbnN0cnVjdHMgaW4gcmFuZ2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAtMSA9PiBvbmx5IGdvIHBhciBmb3IgY29uc3RydWN0cyBvdXRzaWRlIHJhbmdlICovCitjaGFyICAgIF9fa21wX3Bhcl9yYW5nZV9yb3V0aW5lW0tNUF9QQVJfUkFOR0VfUk9VVElORV9MRU5dID0geyAnXDAnIH07CitjaGFyICAgIF9fa21wX3Bhcl9yYW5nZV9maWxlbmFtZVtLTVBfUEFSX1JBTkdFX0ZJTEVOQU1FX0xFTl0gPSB7ICdcMCcgfTsKK2ludCAgICAgX19rbXBfcGFyX3JhbmdlX2xiID0gMDsKK2ludCAgICAgX19rbXBfcGFyX3JhbmdlX3ViID0gSU5UX01BWDsKKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKworLyogRm9yIHByaW50aW5nIG91dCBkeW5hbWljIHN0b3JhZ2UgbWFwIGZvciB0aHJlYWRzIGFuZCB0ZWFtcyAqLworaW50ICAgICBfX2ttcF9zdG9yYWdlX21hcCA9IEZBTFNFOyAgICAgICAgIC8qIFRydWUgbWVhbnMgcHJpbnQgc3RvcmFnZSBtYXAgZm9yIHRocmVhZHMgYW5kIHRlYW1zICovCitpbnQgICAgIF9fa21wX3N0b3JhZ2VfbWFwX3ZlcmJvc2UgPSBGQUxTRTsgLyogVHJ1ZSBtZWFucyBzdG9yYWdlIG1hcCBpbmNsdWRlcyBwbGFjZW1lbnQgaW5mbyAqLworaW50ICAgICBfX2ttcF9zdG9yYWdlX21hcF92ZXJib3NlX3NwZWNpZmllZCA9IEZBTFNFOworLyogSW5pdGlhbGl6ZSB0aGUgbGlicmFyeSBkYXRhIHN0cnVjdHVyZXMgd2hlbiB3ZSBmb3JrIGEgY2hpbGQgcHJvY2VzcywgZGVmYXVsdHMgdG8gVFJVRSAqLworaW50ICAgICBfX2ttcF9uZWVkX3JlZ2lzdGVyX2F0Zm9yayA9IFRSVUU7IC8qIEF0IGluaXRpYWxpemF0aW9uLCBjYWxsIHB0aHJlYWRfYXRmb3JrIHRvIGluc3RhbGwgZm9yayBoYW5kbGVyICovCitpbnQgICAgIF9fa21wX25lZWRfcmVnaXN0ZXJfYXRmb3JrX3NwZWNpZmllZCA9IFRSVUU7CisKK2ludCAgICAgICAgX19rbXBfZW52X2NodW5rICAgICAgID0gRkFMU0U7ICAvKiBLTVBfQ0hVTksgc3BlY2lmaWVkPyAgICAgKi8KK2ludCAgICAgICAgX19rbXBfZW52X3N0a3NpemUgICAgID0gRkFMU0U7ICAvKiBLTVBfU1RBQ0tTSVpFIHNwZWNpZmllZD8gKi8KK2ludCAgICAgICAgX19rbXBfZW52X29tcF9zdGtzaXplID0gRkFMU0U7ICAvKiBPTVBfU1RBQ0tTSVpFIHNwZWNpZmllZD8gKi8KK2ludCAgICAgICAgX19rbXBfZW52X2FsbF90aHJlYWRzICAgICA9IEZBTFNFOy8qIEtNUF9BTExfVEhSRUFEUyBvciBLTVBfTUFYX1RIUkVBRFMgc3BlY2lmaWVkPyAqLworaW50ICAgICAgICBfX2ttcF9lbnZfb21wX2FsbF90aHJlYWRzID0gRkFMU0U7LyogT01QX1RIUkVBRF9MSU1JVCBzcGVjaWZpZWQ/ICovCitpbnQgICAgICAgIF9fa21wX2Vudl9ibG9ja3RpbWUgICA9IEZBTFNFOyAgLyogS01QX0JMT0NLVElNRSBzcGVjaWZpZWQ/ICovCitpbnQgICAgICAgIF9fa21wX2Vudl9jaGVja3MgICAgICA9IEZBTFNFOyAgLyogS01QX0NIRUNLUyBzcGVjaWZpZWQ/ICAgICovCitpbnQgICAgICAgIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayAgPSBGQUxTRTsgIC8qIEtNUF9DT05TSVNURU5DWV9DSEVDSyBzcGVjaWZpZWQ/ICovCisKK2ttcF91aW50MzIgX19rbXBfeWllbGRfaW5pdCA9IEtNUF9JTklUX1dBSVQ7CitrbXBfdWludDMyIF9fa21wX3lpZWxkX25leHQgPSBLTVBfTkVYVF9XQUlUOwora21wX3VpbnQzMiBfX2ttcF95aWVsZGluZ19vbiA9IDE7CisjaWYgS01QX09TX0NOSwora21wX3VpbnQzMiBfX2ttcF95aWVsZF9jeWNsZSA9IDA7CisjZWxzZQora21wX3VpbnQzMiBfX2ttcF95aWVsZF9jeWNsZSA9IDE7ICAgICAvKiBZaWVsZC1jeWNsZSBpcyBvbiBieSBkZWZhdWx0ICovCisjZW5kaWYKK2ttcF9pbnQzMiAgX19rbXBfeWllbGRfb25fY291bnQgPSAxMDsgLyogQnkgZGVmYXVsdCwgeWllbGRpbmcgaXMgb24gZm9yIDEwIG1vbml0b3IgcGVyaW9kcy4gKi8KK2ttcF9pbnQzMiAgX19rbXBfeWllbGRfb2ZmX2NvdW50ID0gMTsgLyogQnkgZGVmYXVsdCwgeWllbGRpbmcgaXMgb2ZmIGZvciAxIG1vbml0b3IgcGVyaW9kcy4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBTVEFURSBtb3N0bHkgc3luY3Jvbml6ZWQgd2l0aCBnbG9iYWwgbG9jayAqLworLyogZGF0YSB3cml0dGVuIHRvIHJhcmVseSBieSBtYXN0ZXJzLCByZWFkIG9mdGVuIGJ5IHdvcmtlcnMgKi8KKy8qCisgKiBTSEFMTCBXRSBFRElUIFRIRSBDT01NRU5UIEJFTE9XIElOIFNPTUUgV0FZPworICogVE9ETzogIE5vbmUgb2YgdGhpcyBnbG9iYWwgcGFkZGluZyBzdHVmZiB3b3JrcyBjb25zaXN0ZW50bHkgYmVjYXVzZQorICogdGhlIG9yZGVyIG9mIGRlY2xhcmF0aW9uIGlzIG5vdCBuZWNlc3NhcmlseSBjb3JyZWxhdGVkIHRvIHN0b3JhZ2Ugb3JkZXIuCisgKiBUbyBmaXggdGhpcywgYWxsIHRoZSBpbXBvcnRhbnQgZ2xvYmFscyBtdXN0IGJlIHB1dCBpbiBhIGJpZyBzdHJ1Y3R1cmUKKyAqIGluc3RlYWQuCisgKi8KK0tNUF9BTElHTl9DQUNIRQorICAgICAgICAga21wX2luZm9fdCAqKl9fa21wX3RocmVhZHMgICAgID0gTlVMTDsKKyAgICAgICAgIGttcF9yb290X3QgKipfX2ttcF9yb290ICAgICAgICA9IE5VTEw7CisKKy8qIGRhdGEgcmVhZC93cml0dGVuIHRvIG9mdGVuIGJ5IG1hc3RlcnMgKi8KK0tNUF9BTElHTl9DQUNIRQordm9sYXRpbGUgaW50ICAgICAgICAgIF9fa21wX250aCAgICAgICAgICAgICAgICAgICAgPSAwOwordm9sYXRpbGUgaW50ICAgICAgICAgIF9fa21wX2FsbF9udGggICAgICAgICAgICAgICAgPSAwOworaW50ICAgICAgICAgICAgICAgICAgIF9fa21wX3RocmVhZF9wb29sX250aCAgICAgICAgPSAwOwordm9sYXRpbGUga21wX2luZm9fdCAgKl9fa21wX3RocmVhZF9wb29sICAgICAgICAgICAgPSBOVUxMOwordm9sYXRpbGUga21wX3RlYW1fdCAgKl9fa21wX3RlYW1fcG9vbCAgICAgICAgICAgICAgPSBOVUxMOworCitLTVBfQUxJR05fQ0FDSEUKK3ZvbGF0aWxlIGludCAgICAgICAgICBfX2ttcF90aHJlYWRfcG9vbF9hY3RpdmVfbnRoID0gMDsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogR0xPQkFML1JPT1QgU1RBVEUgKi8KK0tNUF9BTElHTl9DQUNIRQora21wX2dsb2JhbF90IF9fa21wX2dsb2JhbCA9IHt7IDAgfX07CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBHTE9CQUwgU1lOQ0hST05JWkFUSU9OIExPQ0tTICovCisvKiBUT0RPIHZlcmlmeSB0aGUgbmVlZCBmb3IgdGhlc2UgbG9ja3MgYW5kIGlmIHRoZXkgbmVlZCB0byBiZSBnbG9iYWwgKi8KKworI2lmIEtNUF9VU0VfSU5URVJOT0RFX0FMSUdOTUVOVAorLyogTXVsdGlub2RlIHN5c3RlbXMgaGF2ZSBsYXJnZXIgY2FjaGUgbGluZSBncmFudWxhcml0eSB3aGljaCBjYW4gY2F1c2UKKyAqIGZhbHNlIHNoYXJpbmcgaWYgdGhlIGFsaWdubWVudCBpcyBub3QgbGFyZ2UgZW5vdWdoIGZvciB0aGVzZSBsb2NrcyAqLworS01QX0FMSUdOX0NBQ0hFX0lOVEVSTk9ERQorCitrbXBfYm9vdHN0cmFwX2xvY2tfdCBfX2ttcF9pbml0el9sb2NrICAgPSBLTVBfQk9PVFNUUkFQX0xPQ0tfSU5JVElBTElaRVIoIF9fa21wX2luaXR6X2xvY2sgICApOyAvKiBDb250cm9sIGluaXRpYWxpemF0aW9ucyAqLworS01QX0FMSUdOX0NBQ0hFX0lOVEVSTk9ERQora21wX2Jvb3RzdHJhcF9sb2NrX3QgX19rbXBfZm9ya2pvaW5fbG9jazsgLyogY29udHJvbCBmb3JrL2pvaW4gYWNjZXNzICovCitLTVBfQUxJR05fQ0FDSEVfSU5URVJOT0RFCitrbXBfYm9vdHN0cmFwX2xvY2tfdCBfX2ttcF9leGl0X2xvY2s7ICAgLyogZXhpdCgpIGlzIG5vdCBhbHdheXMgdGhyZWFkLXNhZmUgKi8KK0tNUF9BTElHTl9DQUNIRV9JTlRFUk5PREUKK2ttcF9ib290c3RyYXBfbG9ja190IF9fa21wX21vbml0b3JfbG9jazsgLyogY29udHJvbCBtb25pdG9yIHRocmVhZCBjcmVhdGlvbiAqLworS01QX0FMSUdOX0NBQ0hFX0lOVEVSTk9ERQora21wX2Jvb3RzdHJhcF9sb2NrX3QgX19rbXBfdHBfY2FjaGVkX2xvY2s7IC8qIHVzZWQgZm9yIHRoZSBoYWNrIHRvIGFsbG93IHRocmVhZHByaXZhdGUgY2FjaGUgYW5kIF9fa21wX3RocmVhZHMgZXhwYW5zaW9uIHRvIGNvLWV4aXN0ICovCisKK0tNUF9BTElHTl9DQUNIRV9JTlRFUk5PREUKK2ttcF9sb2NrX3QgX19rbXBfZ2xvYmFsX2xvY2s7ICAgICAgICAgICAvKiBDb250cm9sIE9TL2dsb2JhbCBhY2Nlc3MgKi8KK0tNUF9BTElHTl9DQUNIRV9JTlRFUk5PREUKK2ttcF9xdWV1aW5nX2xvY2tfdCBfX2ttcF9kaXNwYXRjaF9sb2NrOyAgICAgICAgIC8qIENvbnRyb2wgZGlzcGF0Y2ggYWNjZXNzICAqLworS01QX0FMSUdOX0NBQ0hFX0lOVEVSTk9ERQora21wX2xvY2tfdCBfX2ttcF9kZWJ1Z19sb2NrOyAgICAgICAgICAgIC8qIENvbnRyb2wgSS9PIGFjY2VzcyBmb3IgS01QX0RFQlVHICovCisjZWxzZQorS01QX0FMSUdOX0NBQ0hFCisKK2ttcF9ib290c3RyYXBfbG9ja190IF9fa21wX2luaXR6X2xvY2sgICA9IEtNUF9CT09UU1RSQVBfTE9DS19JTklUSUFMSVpFUiggX19rbXBfaW5pdHpfbG9jayAgICk7IC8qIENvbnRyb2wgaW5pdGlhbGl6YXRpb25zICovCitrbXBfYm9vdHN0cmFwX2xvY2tfdCBfX2ttcF9mb3Jram9pbl9sb2NrOyAvKiBjb250cm9sIGZvcmsvam9pbiBhY2Nlc3MgKi8KK2ttcF9ib290c3RyYXBfbG9ja190IF9fa21wX2V4aXRfbG9jazsgICAvKiBleGl0KCkgaXMgbm90IGFsd2F5cyB0aHJlYWQtc2FmZSAqLwora21wX2Jvb3RzdHJhcF9sb2NrX3QgX19rbXBfbW9uaXRvcl9sb2NrOyAvKiBjb250cm9sIG1vbml0b3IgdGhyZWFkIGNyZWF0aW9uICovCitrbXBfYm9vdHN0cmFwX2xvY2tfdCBfX2ttcF90cF9jYWNoZWRfbG9jazsgLyogdXNlZCBmb3IgdGhlIGhhY2sgdG8gYWxsb3cgdGhyZWFkcHJpdmF0ZSBjYWNoZSBhbmQgX19rbXBfdGhyZWFkcyBleHBhbnNpb24gdG8gY28tZXhpc3QgKi8KKworS01QX0FMSUdOKDEyOCkKK2ttcF9sb2NrX3QgX19rbXBfZ2xvYmFsX2xvY2s7ICAgICAgICAgICAvKiBDb250cm9sIE9TL2dsb2JhbCBhY2Nlc3MgKi8KK0tNUF9BTElHTigxMjgpCitrbXBfcXVldWluZ19sb2NrX3QgX19rbXBfZGlzcGF0Y2hfbG9jazsgICAgICAgICAvKiBDb250cm9sIGRpc3BhdGNoIGFjY2VzcyAgKi8KK0tNUF9BTElHTigxMjgpCitrbXBfbG9ja190IF9fa21wX2RlYnVnX2xvY2s7ICAgICAgICAgICAgLyogQ29udHJvbCBJL08gYWNjZXNzIGZvciBLTVBfREVCVUcgKi8KKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgS01QX0hBTkRMRV9TSUdOQUxTCisgICAgLyoKKyAgICAgICAgU2lnbmFsIGhhbmRsaW5nIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQsIGJlY2F1c2UgaXQgY29uZnVzZXMgdXNlcnM6IEluIGNhc2Ugb2Ygc2lnc2VndgorICAgICAgICAob3Igb3RoZXIgdHJvdWJsZSkgaW4gdXNlciBjb2RlIHNpZ25hbCBoYW5kbGVyIGNhdGNoZXMgdGhlIHNpZ25hbCwgd2hpY2ggdGhlbiAiYXBwZWFycyIgaW4KKyAgICAgICAgdGhlIG1vbml0b3IgdGhyZWFkICh3aGVuIHRoZSBtb25pdG9yIGV4ZWN1dGVzIHJhaXNlKCkgZnVuY3Rpb24pLiBVc2VycyBzZWUgc2lnbmFsIGluIHRoZQorICAgICAgICBtb25pdG9yIHRocmVhZCBhbmQgYmxhbWUgT3Blbk1QIFJUTC4KKworICAgICAgICBHcmFudCBzYWlkIHNpZ25hbCBoYW5kbGluZyByZXF1aXJlZCBvbiBzb21lIG9sZGVyIE9TZXMgKElyaXg/KSBzdXBwb3J0ZWQgYnkgS0FJLCBiZWNhdXNlCisgICAgICAgIGJhZCBhcHBsaWNhdGlvbnMgaHVuZyBidXQgbm90IGFib3J0ZWQuIEN1cnJlbnRseSBpdCBpcyBub3QgYSBwcm9ibGVtIGZvciBMaW51eCogT1MsIE9TIFgqIGFuZAorICAgICAgICBXaW5kb3dzKiBPUy4KKworICAgICAgICBHcmFudDogRm91bmQgbmV3IGhhbmdzIGZvciBFTDQsIEVMNSwgYW5kIGEgRmVkb3JhIENvcmUgbWFjaGluZS4gIFNvIEknbSBwdXR0aW5nCisgICAgICAgIHRoZSBkZWZhdWx0IGJhY2sgZm9yIG5vdyB0byBzZWUgaWYgdGhhdCBmaXhlcyBoYW5ncyBvbiB0aG9zZSBtYWNoaW5lcy4KKworICAgICAgICAyMDEwLTA0MDEzIExldjogSXQgd2FzIGEgYnVnIGluIEZvcnRyYW4gUlRMLiBGb3J0cmFuIFJUTCBwcmludHMgYSBraW5kIG9mIHN0YWNrIGJhY2t0cmFjZQorICAgICAgICB3aGVuIHByb2dyYW0gaXMgYWJvcnRpbmcsIGJ1dCB0aGUgY29kZSBpcyBub3Qgc2lnbmFsLXNhZmUuIFdoZW4gbXVsdGlwbGUgc2lnbmFscyByYWlzZWQgYXQKKyAgICAgICAgdGhlIHNhbWUgdGltZSAod2hpY2ggb2NjdXJzIGluIGR5bmFtaWMgbmVnYXRpdmUgdGVzdHMgYmVjYXVzZSBhbGwgdGhlIHdvcmtlciB0aHJlYWRzIGRldGVjdHMKKyAgICAgICAgdGhlIHNhbWUgZXJyb3IpLCBGb3J0cmFuIFJUTCBtYXkgaGFuZy4gVGhlIGJ1ZyBmaW5hbGx5IGZpeGVkIGluIEZvcnRyYW4gUlRMIGxpYnJhcnkgcHJvdmlkZWQKKyAgICAgICAgYnkgU3RldmUgUi4sIGFuZCB3aWxsIGJlIGF2YWlsYWJsZSBzb29uLgorICAgICovCisgICAgaW50IF9fa21wX2hhbmRsZV9zaWduYWxzID0gRkFMU0U7CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNpZmRlZiBCVUlMRF9UVgora21wX2tleV90IF9fa21wX3R2X2tleSA9IDA7CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIERFQlVHX1NVU1BFTkQKK2ludAorZ2V0X3N1c3BlbmRfY291bnRfKCB2b2lkICkgeworICAgIGludCBjb3VudCA9IF9fa21wX3N1c3BlbmRfY291bnQ7CisgICAgX19rbXBfc3VzcGVuZF9jb3VudCA9IDA7CisgICAgcmV0dXJuIGNvdW50OworfQordm9pZAorc2V0X3N1c3BlbmRfY291bnRfKCBpbnQgKiB2YWx1ZSApIHsKKyAgICBfX2ttcF9zdXNwZW5kX2NvdW50ID0gKnZhbHVlOworfQorI2VuZGlmCisKKy8vIFN5bWJvbHMgZm9yIE1TIG11dHVhbCBkZXRlY3Rpb24uCitpbnQgX1lvdV9tdXN0X2xpbmtfd2l0aF9leGFjdGx5X29uZV9PcGVuTVBfbGlicmFyeSA9IDE7CitpbnQgX1lvdV9tdXN0X2xpbmtfd2l0aF9JbnRlbF9PcGVuTVBfbGlicmFyeSAgICAgICA9IDE7CisjaWYgS01QX09TX1dJTkRPV1MgJiYgKCBLTVBfVkVSU0lPTl9NQUpPUiA+IDQgKQorICAgIGludCBfWW91X211c3RfbGlua193aXRoX01pY3Jvc29mdF9PcGVuTVBfbGlicmFyeSA9IDE7CisjZW5kaWYKKworLy8gZW5kIG9mIGZpbGUgLy8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9nc3VwcG9ydC5jIGIvZmluYWwvcnVudGltZS9zcmMva21wX2dzdXBwb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc5YWM0MAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9nc3VwcG9ydC5jCkBAIC0wLDAgKzEsMTYwMiBAQAorLyoKKyAqIGttcF9nc3VwcG9ydC5jCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfYXRvbWljLmgiCisKKyNpZiBPTVBUX1NVUFBPUlQKKyNpbmNsdWRlICJvbXB0LXNwZWNpZmljLmgiCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgZXh0ZXJuICJDIiB7CisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworI2RlZmluZSBNS0xPQyhsb2Mscm91dGluZSkgXAorICAgIHN0YXRpYyBpZGVudF90IChsb2MpID0gezAsIEtNUF9JREVOVF9LTVBDLCAwLCAwLCAiO3Vua25vd247dW5rbm93bjswOzA7OyIgfTsKKworI2luY2x1ZGUgImttcF9mdG5fb3MuaCIKKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9CQVJSSUVSKSh2b2lkKQoreworICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICAgIE1LTE9DKGxvYywgIkdPTVBfYmFycmllciIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfYmFycmllcjogVCMlZFxuIiwgZ3RpZCkpOworICAgIF9fa21wY19iYXJyaWVyKCZsb2MsIGd0aWQpOworfQorCisKKy8vCisvLyBNdXR1YWwgZXhjbHVzaW9uCisvLworCisvLworLy8gVGhlIHN5bWJvbCB0aGF0IGljYy9pZm9ydCBnZW5lcmF0ZXMgZm9yIHVubmFtZWQgZm9yIHVubmFtZWQgY3JpdGljYWwKKy8vIHNlY3Rpb25zIC0gLmdvbXBfY3JpdGljYWxfdXNlcl8gLSBpcyBkZWZpbmVkIHVzaW5nIC5jb21tIGluIGFueSBvYmplY3RzCisvLyByZWZlcmVuY2UgaXQuICBXZSBjYW4ndCByZWZlcmVuY2UgaXQgZGlyZWN0bHkgaGVyZSBpbiBDIGNvZGUsIGFzIHRoZQorLy8gc3ltYm9sIGNvbnRhaW5zIGEgIi4iLgorLy8KKy8vIFRoZSBSVEwgY29udGFpbnMgYW4gYXNzZW1ibHkgbGFuZ3VhZ2UgZGVmaW5pdGlvbiBvZiAuZ29tcF9jcml0aWNhbF91c2VyXworLy8gd2l0aCBhbm90aGVyIHN5bWJvbCBfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHIgaW5pdGlhbGl6ZWQgd2l0aCBpdCdzCisvLyBhZGRyZXNzLgorLy8KK2V4dGVybiBrbXBfY3JpdGljYWxfbmFtZSAqX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyOworCisKK3ZvaWQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfU1RBUlQpKHZvaWQpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9jcml0aWNhbF9zdGFydCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfY3JpdGljYWxfc3RhcnQ6IFQjJWRcbiIsIGd0aWQpKTsKKyAgICBfX2ttcGNfY3JpdGljYWwoJmxvYywgZ3RpZCwgX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyKTsKK30KKworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0NSSVRJQ0FMX0VORCkodm9pZCkKK3sKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9jcml0aWNhbF9lbmQiKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX2NyaXRpY2FsX2VuZDogVCMlZFxuIiwgZ3RpZCkpOworICAgIF9fa21wY19lbmRfY3JpdGljYWwoJmxvYywgZ3RpZCwgX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyKTsKK30KKworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0NSSVRJQ0FMX05BTUVfU1RBUlQpKHZvaWQgKipwcHRyKQoreworICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICAgIE1LTE9DKGxvYywgIkdPTVBfY3JpdGljYWxfbmFtZV9zdGFydCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfY3JpdGljYWxfbmFtZV9zdGFydDogVCMlZFxuIiwgZ3RpZCkpOworICAgIF9fa21wY19jcml0aWNhbCgmbG9jLCBndGlkLCAoa21wX2NyaXRpY2FsX25hbWUgKilwcHRyKTsKK30KKworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0NSSVRJQ0FMX05BTUVfRU5EKSh2b2lkICoqcHB0cikKK3sKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9jcml0aWNhbF9uYW1lX2VuZCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfY3JpdGljYWxfbmFtZV9lbmQ6IFQjJWRcbiIsIGd0aWQpKTsKKyAgICBfX2ttcGNfZW5kX2NyaXRpY2FsKCZsb2MsIGd0aWQsIChrbXBfY3JpdGljYWxfbmFtZSAqKXBwdHIpOworfQorCisKKy8vCisvLyBUaGUgR251IGNvZGVnZW4gdHJpZXMgdG8gdXNlIGxvY2tlZCBvcGVyYXRpb25zIHRvIHBlcmZvcm0gYXRvbWljIHVwZGF0ZXMKKy8vIGlubGluZS4gIElmIGl0IGNhbid0LCB0aGVuIGl0IGNhbGxzIEdPTVBfYXRvbWljX3N0YXJ0KCkgYmVmb3JlIHBlcmZvcm1pbmcKKy8vIHRoZSB1cGRhdGUgYW5kIEdPTVBfYXRvbWljX2VuZCgpIGFmdGVyd2FyZCwgcmVnYXJkbGVzcyBvZiB0aGUgZGF0YSB0eXBlLgorLy8KKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9BVE9NSUNfU1RBUlQpKHZvaWQpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9hdG9taWNfc3RhcnQ6IFQjJWRcbiIsIGd0aWQpKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIF9fb21wdF90aHJlYWRfYXNzaWduX3dhaXRfaWQoMCk7CisjZW5kaWYKKworICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soJl9fa21wX2F0b21pY19sb2NrLCBndGlkKTsKK30KKworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0FUT01JQ19FTkQpKHZvaWQpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfYXRvbWljX3N0YXJ0OiBUIyVkXG4iLCBndGlkKSk7CisgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jaygmX19rbXBfYXRvbWljX2xvY2ssIGd0aWQpOworfQorCisKK2ludAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9TSU5HTEVfU1RBUlQpKHZvaWQpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9zaW5nbGVfc3RhcnQiKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX3NpbmdsZV9zdGFydDogVCMlZFxuIiwgZ3RpZCkpOworCisgICAgaWYgKCEgVENSXzQoX19rbXBfaW5pdF9wYXJhbGxlbCkpCisgICAgICAgIF9fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoKTsKKworICAgIC8vCisgICAgLy8gM3JkIHBhcmFtZXRlciA9PSBGQUxTRSBwcmV2ZW50cyBrbXBfZW50ZXJfc2luZ2xlIGZyb20gcHVzaGluZyBhCisgICAgLy8gd29ya3NoYXJlIHdoZW4gVVNFX0NIRUNLUyBpcyBkZWZpbmVkLiAgV2UgbmVlZCB0byBhdm9pZCB0aGUgcHVzaCwKKyAgICAvLyBhcyB0aGVyZSBpcyBubyBjb3JyZXNwb25kaW5nIEdPTVBfc2luZ2xlX2VuZCgpIGNhbGwuCisgICAgLy8KKyAgICByZXR1cm4gX19rbXBfZW50ZXJfc2luZ2xlKGd0aWQsICZsb2MsIEZBTFNFKTsKK30KKworCit2b2lkICoKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfU0lOR0xFX0NPUFlfU1RBUlQpKHZvaWQpCit7CisgICAgdm9pZCAqcmV0dmFsOworICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICAgIE1LTE9DKGxvYywgIkdPTVBfc2luZ2xlX2NvcHlfc3RhcnQiKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX3NpbmdsZV9jb3B5X3N0YXJ0OiBUIyVkXG4iLCBndGlkKSk7CisKKyAgICBpZiAoISBUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSkKKyAgICAgICAgX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZSgpOworCisgICAgLy8KKyAgICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aHJlYWQgdG8gZW50ZXIsIHJldHVybiBOVUxMLiAgVGhlIGdlbmVyYXRlZAorICAgIC8vIGNvZGUgd2lsbCB0aGVuIGNhbGwgR09NUF9zaW5nbGVfY29weV9lbmQoKSBmb3IgdGhpcyB0aHJlYWQgb25seSwKKyAgICAvLyB3aXRoIHRoZSBjb3B5cHJpdmF0ZSBkYXRhIHBvaW50ZXIgYXMgYW4gYXJndW1lbnQuCisgICAgLy8KKyAgICBpZiAoX19rbXBfZW50ZXJfc2luZ2xlKGd0aWQsICZsb2MsIEZBTFNFKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAvLworICAgIC8vIFdhaXQgZm9yIHRoZSBmaXJzdCB0aHJlYWQgdG8gc2V0IHRoZSBjb3B5cHJpdmF0ZSBkYXRhIHBvaW50ZXIsCisgICAgLy8gYW5kIGZvciBhbGwgb3RoZXIgdGhyZWFkcyB0byByZWFjaCB0aGlzIHBvaW50LgorICAgIC8vCisgICAgX19rbXBfYmFycmllcihic19wbGFpbl9iYXJyaWVyLCBndGlkLCBGQUxTRSwgMCwgTlVMTCwgTlVMTCk7CisKKyAgICAvLworICAgIC8vIFJldHJpZXZlIHRoZSB2YWx1ZSBvZiB0aGUgY29weXByaXZhdGUgZGF0YSBwb2ludCwgYW5kIHdhaXQgZm9yIGFsbAorICAgIC8vIHRocmVhZHMgdG8gZG8gbGlrZXdpc2UsIHRoZW4gcmV0dXJuLgorICAgIC8vCisgICAgcmV0dmFsID0gX19rbXBfdGVhbV9mcm9tX2d0aWQoZ3RpZCktPnQudF9jb3B5cHJpdl9kYXRhOworICAgIF9fa21wX2JhcnJpZXIoYnNfcGxhaW5fYmFycmllciwgZ3RpZCwgRkFMU0UsIDAsIE5VTEwsIE5VTEwpOworICAgIHJldHVybiByZXR2YWw7Cit9CisKKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9TSU5HTEVfQ09QWV9FTkQpKHZvaWQgKmRhdGEpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfc2luZ2xlX2NvcHlfZW5kOiBUIyVkXG4iLCBndGlkKSk7CisKKyAgICAvLworICAgIC8vIFNldCB0aGUgY29weXByaXZhdGUgZGF0YSBwb2ludGVyIGZvIHRoZSB0ZWFtLCB0aGVuIGhpdCB0aGUgYmFycmllcgorICAgIC8vIHNvIHRoYXQgdGhlIG90aGVyIHRocmVhZHMgd2lsbCBjb250aW51ZSBvbiBhbmQgcmVhZCBpdC4gIEhpdCBhbm90aGVyCisgICAgLy8gYmFycmllciBiZWZvcmUgY29udGludWluZywgc28gdGhhdCB0aGUga25vdyB0aGF0IHRoZSBjb3B5cHJpdmF0ZQorICAgIC8vIGRhdGEgcG9pbnRlciBoYXMgYmVlbiBwcm9wYWdhdGVkIHRvIGFsbCB0aHJlYWRzIGJlZm9yZSB0cnlpbmcgdG8KKyAgICAvLyByZXVzZSB0aGUgdF9jb3B5cHJpdl9kYXRhIGZpZWxkLgorICAgIC8vCisgICAgX19rbXBfdGVhbV9mcm9tX2d0aWQoZ3RpZCktPnQudF9jb3B5cHJpdl9kYXRhID0gZGF0YTsKKyAgICBfX2ttcF9iYXJyaWVyKGJzX3BsYWluX2JhcnJpZXIsIGd0aWQsIEZBTFNFLCAwLCBOVUxMLCBOVUxMKTsKKyAgICBfX2ttcF9iYXJyaWVyKGJzX3BsYWluX2JhcnJpZXIsIGd0aWQsIEZBTFNFLCAwLCBOVUxMLCBOVUxMKTsKK30KKworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX09SREVSRURfU1RBUlQpKHZvaWQpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9vcmRlcmVkX3N0YXJ0Iik7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9vcmRlcmVkX3N0YXJ0OiBUIyVkXG4iLCBndGlkKSk7CisgICAgX19rbXBjX29yZGVyZWQoJmxvYywgZ3RpZCk7Cit9CisKKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9PUkRFUkVEX0VORCkodm9pZCkKK3sKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9vcmRlcmVkX2VuZCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfb3JkZXJlZF9zdGFydDogVCMlZFxuIiwgZ3RpZCkpOworICAgIF9fa21wY19lbmRfb3JkZXJlZCgmbG9jLCBndGlkKTsKK30KKworCisvLworLy8gRGlzcGF0Y2ggbWFjcm8gZGVmcworLy8KKy8vIFRoZXkgY29tZSBpbiB0d28gZmxhdm9yczogNjQtYml0IHVuc2lnbmVkLCBhbmQgZWl0aGVyIDMyLWJpdCBzaWduZWQKKy8vIChJQS0zMiBhcmNoaXRlY3R1cmUpIG9yIDY0LWJpdCBzaWduZWQgKEludGVsKFIpIDY0KS4KKy8vCisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfQVJNCisjIGRlZmluZSBLTVBfRElTUEFUQ0hfSU5JVCAgICAgICAgICAgICAgX19rbXBfYXV4X2Rpc3BhdGNoX2luaXRfNAorIyBkZWZpbmUgS01QX0RJU1BBVENIX0ZJTklfQ0hVTksgICAgICAgIF9fa21wX2F1eF9kaXNwYXRjaF9maW5pX2NodW5rXzQKKyMgZGVmaW5lIEtNUF9ESVNQQVRDSF9ORVhUICAgICAgICAgICAgICBfX2ttcGNfZGlzcGF0Y2hfbmV4dF80CisjZWxzZQorIyBkZWZpbmUgS01QX0RJU1BBVENIX0lOSVQgICAgICAgICAgICAgIF9fa21wX2F1eF9kaXNwYXRjaF9pbml0XzgKKyMgZGVmaW5lIEtNUF9ESVNQQVRDSF9GSU5JX0NIVU5LICAgICAgICBfX2ttcF9hdXhfZGlzcGF0Y2hfZmluaV9jaHVua184CisjIGRlZmluZSBLTVBfRElTUEFUQ0hfTkVYVCAgICAgICAgICAgICAgX19rbXBjX2Rpc3BhdGNoX25leHRfOAorI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiAqLworCisjIGRlZmluZSBLTVBfRElTUEFUQ0hfSU5JVF9VTEwgICAgICAgICAgX19rbXBfYXV4X2Rpc3BhdGNoX2luaXRfOHUKKyMgZGVmaW5lIEtNUF9ESVNQQVRDSF9GSU5JX0NIVU5LX1VMTCAgICBfX2ttcF9hdXhfZGlzcGF0Y2hfZmluaV9jaHVua184dQorIyBkZWZpbmUgS01QX0RJU1BBVENIX05FWFRfVUxMICAgICAgICAgIF9fa21wY19kaXNwYXRjaF9uZXh0Xzh1CisKKworLy8KKy8vIFRoZSBwYXJhbGxlbCBjb250cnVjdAorLy8KKworI2lmbmRlZiBLTVBfREVCVUcKK3N0YXRpYworI2VuZGlmIC8qIEtNUF9ERUJVRyAqLwordm9pZAorX19rbXBfR09NUF9taWNyb3Rhc2tfd3JhcHBlcihpbnQgKmd0aWQsIGludCAqbnByLCB2b2lkICgqdGFzaykodm9pZCAqKSwKKyAgdm9pZCAqZGF0YSkKK3sKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBrbXBfaW5mb190ICp0aHI7CisgICAgb21wdF9mcmFtZV90ICpvbXB0X2ZyYW1lOworICAgIG9tcHRfc3RhdGVfdCBlbmNsb3Npbmdfc3RhdGU7CisKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIC8vIGdldCBwb2ludGVyIHRvIHRocmVhZCBkYXRhIHN0cnVjdHVyZQorICAgICAgICB0aHIgPSBfX2ttcF90aHJlYWRzWypndGlkXTsKKworICAgICAgICAvLyBzYXZlIGVuY2xvc2luZyB0YXNrIHN0YXRlOyBzZXQgY3VycmVudCBzdGF0ZSBmb3IgdGFzaworICAgICAgICBlbmNsb3Npbmdfc3RhdGUgPSB0aHItPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGU7CisgICAgICAgIHRoci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfd29ya19wYXJhbGxlbDsKKworICAgICAgICAvLyBzZXQgdGFzayBmcmFtZQorICAgICAgICBvbXB0X2ZyYW1lID0gX19vbXB0X2dldF90YXNrX2ZyYW1lX2ludGVybmFsKDApOworICAgICAgICBvbXB0X2ZyYW1lLT5leGl0X3J1bnRpbWVfZnJhbWUgPSBfX2J1aWx0aW5fZnJhbWVfYWRkcmVzcygwKTsKKyAgICB9CisjZW5kaWYKKworICAgIHRhc2soZGF0YSk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIC8vIGNsZWFyIHRhc2sgZnJhbWUKKyAgICAgICAgb21wdF9mcmFtZS0+ZXhpdF9ydW50aW1lX2ZyYW1lID0gTlVMTDsKKworICAgICAgICAvLyByZXN0b3JlIGVuY2xvc2luZyBzdGF0ZQorICAgICAgICB0aHItPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBlbmNsb3Npbmdfc3RhdGU7CisgICAgfQorI2VuZGlmCit9CisKKworI2lmbmRlZiBLTVBfREVCVUcKK3N0YXRpYworI2VuZGlmIC8qIEtNUF9ERUJVRyAqLwordm9pZAorX19rbXBfR09NUF9wYXJhbGxlbF9taWNyb3Rhc2tfd3JhcHBlcihpbnQgKmd0aWQsIGludCAqbnByLAorICB2b2lkICgqdGFzaykodm9pZCAqKSwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbnVtX3RocmVhZHMsIGlkZW50X3QgKmxvYywKKyAgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLCBsb25nIHN0YXJ0LCBsb25nIGVuZCwgbG9uZyBpbmNyLCBsb25nIGNodW5rX3NpemUpCit7CisgICAgLy8KKyAgICAvLyBJbnRpYWxpemUgdGhlIGxvb3Agd29ya3NoYXJpbmcgY29uc3RydWN0LgorICAgIC8vCisgICAgS01QX0RJU1BBVENIX0lOSVQobG9jLCAqZ3RpZCwgc2NoZWR1bGUsIHN0YXJ0LCBlbmQsIGluY3IsIGNodW5rX3NpemUsCisgICAgICBzY2hlZHVsZSAhPSBrbXBfc2NoX3N0YXRpYyk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBrbXBfaW5mb190ICp0aHI7CisgICAgb21wdF9mcmFtZV90ICpvbXB0X2ZyYW1lOworICAgIG9tcHRfc3RhdGVfdCBlbmNsb3Npbmdfc3RhdGU7CisKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIHRociA9IF9fa21wX3RocmVhZHNbKmd0aWRdOworICAgICAgICAvLyBzYXZlIGVuY2xvc2luZyB0YXNrIHN0YXRlOyBzZXQgY3VycmVudCBzdGF0ZSBmb3IgdGFzaworICAgICAgICBlbmNsb3Npbmdfc3RhdGUgPSB0aHItPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGU7CisgICAgICAgIHRoci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfd29ya19wYXJhbGxlbDsKKworICAgICAgICAvLyBzZXQgdGFzayBmcmFtZQorICAgICAgICBvbXB0X2ZyYW1lID0gX19vbXB0X2dldF90YXNrX2ZyYW1lX2ludGVybmFsKDApOworICAgICAgICBvbXB0X2ZyYW1lLT5leGl0X3J1bnRpbWVfZnJhbWUgPSBfX2J1aWx0aW5fZnJhbWVfYWRkcmVzcygwKTsKKyAgICB9CisjZW5kaWYKKworICAgIC8vCisgICAgLy8gTm93IGludm9rZSB0aGUgbWljcm90YXNrLgorICAgIC8vCisgICAgdGFzayhkYXRhKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgLy8gY2xlYXIgdGFzayBmcmFtZQorICAgICAgICBvbXB0X2ZyYW1lLT5leGl0X3J1bnRpbWVfZnJhbWUgPSBOVUxMOworCisgICAgICAgIC8vIHJlc2V0IGVuY2xvc2luZyBzdGF0ZQorICAgICAgICB0aHItPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBlbmNsb3Npbmdfc3RhdGU7CisgICAgfQorI2VuZGlmCit9CisKKworI2lmbmRlZiBLTVBfREVCVUcKK3N0YXRpYworI2VuZGlmIC8qIEtNUF9ERUJVRyAqLwordm9pZAorX19rbXBfR09NUF9mb3JrX2NhbGwoaWRlbnRfdCAqbG9jLCBpbnQgZ3RpZCwgdm9pZCAoKnVud3JhcHBlZF90YXNrKSh2b2lkICopLCBtaWNyb3Rhc2tfdCB3cmFwcGVyLCBpbnQgYXJnYywuLi4pCit7CisgICAgaW50IHJjOworICAgIGttcF9pbmZvX3QgKnRociA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgICAga21wX3RlYW1fdCAqdGVhbSA9IHRoci0+dGgudGhfdGVhbTsKKyAgICBpbnQgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKTsKKworICAgIHZhX2xpc3QgYXA7CisgICAgdmFfc3RhcnQoYXAsIGFyZ2MpOworCisgICAgcmMgPSBfX2ttcF9mb3JrX2NhbGwobG9jLCBndGlkLCBmb3JrX2NvbnRleHRfZ251LCBhcmdjLAorI2lmIE9NUFRfU1VQUE9SVAorICAgICAgVk9MQVRJTEVfQ0FTVCh2b2lkICopIHVud3JhcHBlZF90YXNrLAorI2VuZGlmCisgICAgICB3cmFwcGVyLCBfX2ttcF9pbnZva2VfdGFza19mdW5jLAorI2lmIChLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpICYmIEtNUF9PU19MSU5VWAorICAgICAgJmFwCisjZWxzZQorICAgICAgYXAKKyNlbmRpZgorICAgICAgKTsKKworICAgIHZhX2VuZChhcCk7CisKKyAgICBpZiAocmMpIHsKKyAgICAgICAgX19rbXBfcnVuX2JlZm9yZV9pbnZva2VkX3Rhc2soZ3RpZCwgdGlkLCB0aHIsIHRlYW0pOworICAgIH0KKworI2lmIE9NUFRfU1VQUE9SVCAKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisjaWYgT01QVF9UUkFDRQorICAgICAgICBvbXB0X3RlYW1faW5mb190ICp0ZWFtX2luZm8gPSBfX29tcHRfZ2V0X3RlYW1pbmZvKDAsIE5VTEwpOworICAgICAgICBvbXB0X3Rhc2tfaW5mb190ICp0YXNrX2luZm8gPSBfX29tcHRfZ2V0X3Rhc2tpbmZvKDApOworCisgICAgICAgIC8vIGltcGxpY2l0IHRhc2sgY2FsbGJhY2sKKyAgICAgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luKSkgeworICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW4pKAorICAgICAgICAgICAgICAgIHRlYW1faW5mby0+cGFyYWxsZWxfaWQsIHRhc2tfaW5mby0+dGFza19pZCk7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB0aHItPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBvbXB0X3N0YXRlX3dvcmtfcGFyYWxsZWw7CisgICAgfQorI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9HT01QX3NlcmlhbGl6ZWRfcGFyYWxsZWwoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAoKnRhc2spKHZvaWQgKikpCit7CisgICAgX19rbXBfc2VyaWFsaXplZF9wYXJhbGxlbChsb2MsIGd0aWQpOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICBvbXB0X3Rhc2tfaWRfdCBvbXB0X3Rhc2tfaWQgPSBfX29tcHRfZ2V0X3Rhc2tfaWRfaW50ZXJuYWwoMCk7CisgICAgICAgIG9tcHRfZnJhbWVfdCAgKm9tcHRfZnJhbWUgPSBfX29tcHRfZ2V0X3Rhc2tfZnJhbWVfaW50ZXJuYWwoMCk7CisgICAgICAgIGttcF9pbmZvX3QgKnRociA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisKKyAgICAgICAgb21wdF9wYXJhbGxlbF9pZF90IG9tcHRfcGFyYWxsZWxfaWQgPSBfX29tcHRfcGFyYWxsZWxfaWRfbmV3KGd0aWQpOworICAgICAgICBvbXB0X3Rhc2tfaWRfdCBteV9vbXB0X3Rhc2tfaWQgPSBfX29tcHRfdGFza19pZF9uZXcoZ3RpZCk7CisKKyAgICAgICAgb21wdF9mcmFtZS0+ZXhpdF9ydW50aW1lX2ZyYW1lID0gTlVMTDsKKworICAgICAgICAvLyBwYXJhbGxlbCByZWdpb24gY2FsbGJhY2sKKyAgICAgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9wYXJhbGxlbF9iZWdpbikpIHsKKyAgICAgICAgICAgIGludCB0ZWFtX3NpemUgPSAxOworICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3BhcmFsbGVsX2JlZ2luKSgKKyAgICAgICAgICAgICAgICBvbXB0X3Rhc2tfaWQsIG9tcHRfZnJhbWUsIG9tcHRfcGFyYWxsZWxfaWQsCisgICAgICAgICAgICAgICAgdGVhbV9zaXplLCAodm9pZCAqKSB0YXNrLAorICAgICAgICAgICAgICAgIE9NUFRfSU5WT0tFUihmb3JrX2NvbnRleHRfZ251KSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBzZXQgdXAgbGlnaHR3ZWlnaHQgdGFzaworICAgICAgICBvbXB0X2x3X3Rhc2t0ZWFtX3QgKmx3dCA9IChvbXB0X2x3X3Rhc2t0ZWFtX3QgKikKKyAgICAgICAgICAgIF9fa21wX2FsbG9jYXRlKHNpemVvZihvbXB0X2x3X3Rhc2t0ZWFtX3QpKTsKKyAgICAgICAgX19vbXB0X2x3X3Rhc2t0ZWFtX2luaXQobHd0LCB0aHIsIGd0aWQsICh2b2lkICopIHRhc2ssIG9tcHRfcGFyYWxsZWxfaWQpOworICAgICAgICBsd3QtPm9tcHRfdGFza19pbmZvLnRhc2tfaWQgPSBteV9vbXB0X3Rhc2tfaWQ7CisgICAgICAgIGx3dC0+b21wdF90YXNrX2luZm8uZnJhbWUuZXhpdF9ydW50aW1lX2ZyYW1lID0gMDsKKyAgICAgICAgX19vbXB0X2x3X3Rhc2t0ZWFtX2xpbmsobHd0LCB0aHIpOworCisjaWYgT01QVF9UUkFDRQorICAgICAgICAvLyBpbXBsaWNpdCB0YXNrIGNhbGxiYWNrCisgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbikpIHsKKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luKSgKKyAgICAgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2lkLCBteV9vbXB0X3Rhc2tfaWQpOworICAgICAgICB9CisgICAgICAgIHRoci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfd29ya19wYXJhbGxlbDsKKyNlbmRpZgorICAgIH0KKyNlbmRpZgorfQorCisKK3ZvaWQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfU1RBUlQpKHZvaWQgKCp0YXNrKSh2b2lkICopLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBudW1fdGhyZWFkcykKK3sKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIG9tcHRfZnJhbWVfdCAqcGFyZW50X2ZyYW1lOworCisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICBwYXJlbnRfZnJhbWUgPSBfX29tcHRfZ2V0X3Rhc2tfZnJhbWVfaW50ZXJuYWwoMCk7CisgICAgICAgIHBhcmVudF9mcmFtZS0+cmVlbnRlcl9ydW50aW1lX2ZyYW1lID0gX19idWlsdGluX2ZyYW1lX2FkZHJlc3MoMCk7CisgICAgfQorI2VuZGlmCisKKyAgICBNS0xPQyhsb2MsICJHT01QX3BhcmFsbGVsX3N0YXJ0Iik7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9wYXJhbGxlbF9zdGFydDogVCMlZFxuIiwgZ3RpZCkpOworCisgICAgaWYgKF9fa21wY19va190b19mb3JrKCZsb2MpICYmIChudW1fdGhyZWFkcyAhPSAxKSkgeworICAgICAgICBpZiAobnVtX3RocmVhZHMgIT0gMCkgeworICAgICAgICAgICAgX19rbXBfcHVzaF9udW1fdGhyZWFkcygmbG9jLCBndGlkLCBudW1fdGhyZWFkcyk7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfR09NUF9mb3JrX2NhbGwoJmxvYywgZ3RpZCwgdGFzaywKKyAgICAgICAgICAobWljcm90YXNrX3QpX19rbXBfR09NUF9taWNyb3Rhc2tfd3JhcHBlciwgMiwgdGFzaywgZGF0YSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBfX2ttcF9HT01QX3NlcmlhbGl6ZWRfcGFyYWxsZWwoJmxvYywgZ3RpZCwgdGFzayk7CisgICAgfQorCisjaWYgT01QVF9TVVBQT1JUCisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICBwYXJlbnRfZnJhbWUtPnJlZW50ZXJfcnVudGltZV9mcmFtZSA9IE5VTEw7CisgICAgfQorI2VuZGlmCit9CisKKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9FTkQpKHZvaWQpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworICAgIGttcF9pbmZvX3QgKnRocjsKKworICAgIHRociA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisKKyAgICBNS0xPQyhsb2MsICJHT01QX3BhcmFsbGVsX2VuZCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfcGFyYWxsZWxfZW5kOiBUIyVkXG4iLCBndGlkKSk7CisKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBwYXJhbGxlbF9pZDsKKyAgICBvbXB0X2ZyYW1lX3QgKm9tcHRfZnJhbWUgPSBOVUxMOworCisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICBvbXB0X3RlYW1faW5mb190ICp0ZWFtX2luZm8gPSBfX29tcHRfZ2V0X3RlYW1pbmZvKDAsIE5VTEwpOworICAgICAgICBwYXJhbGxlbF9pZCA9IHRlYW1faW5mby0+cGFyYWxsZWxfaWQ7CisKKyAgICAgICAgLy8gUmVjb3JkIHRoYXQgd2UgcmUtZW50ZXJlZCB0aGUgcnVudGltZSBzeXN0ZW0gaW4gdGhlIGltcGxpY2l0CisgICAgICAgIC8vIHRhc2sgZnJhbWUgcmVwcmVzZW50aW5nIHRoZSBwYXJhbGxlbCByZWdpb24uIAorICAgICAgICBvbXB0X2ZyYW1lID0gX19vbXB0X2dldF90YXNrX2ZyYW1lX2ludGVybmFsKDApOworICAgICAgICBvbXB0X2ZyYW1lLT5yZWVudGVyX3J1bnRpbWVfZnJhbWUgPSBfX2J1aWx0aW5fZnJhbWVfYWRkcmVzcygwKTsKKworI2lmIE9NUFRfVFJBQ0UKKyAgICAgICAgaWYgKG9tcHRfZW5hYmxlZCAmJgorICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kKSkgeworICAgICAgICAgICAgb21wdF90YXNrX2luZm9fdCAqdGFza19pbmZvID0gX19vbXB0X2dldF90YXNraW5mbygwKTsKKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZCkoCisgICAgICAgICAgICAgICAgcGFyYWxsZWxfaWQsIHRhc2tfaW5mby0+dGFza19pZCk7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIC8vIHVubGluayBpZiBuZWNlc3NhcnkuIG5vLW9wIGlmIHRoZXJlIGlzIG5vdCBhIGxpZ2h0d2VpZ2h0IHRhc2suCisgICAgICAgIG9tcHRfbHdfdGFza3RlYW1fdCAqbHd0ID0gX19vbXB0X2x3X3Rhc2t0ZWFtX3VubGluayh0aHIpOworICAgICAgICAvLyBHT01QIGFsbG9jYXRlcy9mcmVlcyBsd3Qgc2luY2UgaXQgY2FuJ3QgYmUga2VwdCBvbiB0aGUgc3RhY2sKKyAgICAgICAgaWYgKGx3dCkgeyAKKyAgICAgICAgICAgX19rbXBfZnJlZShsd3QpOworICAgICAKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICAgICAgICAvLyBTaW5jZSBhIGxpZ2h0d2VpZ2h0IHRhc2sgd2FzIGRlc3Ryb3llZCwgbWFrZSBzdXJlIHRoYXQgdGhlCisgICAgICAgICAgICAgIC8vIHJlbWFpbmluZyBkZWVwZXN0IHRhc2sga25vd3MgdGhlIHN0YWNrIGZyYW1lIHdoZXJlIHRoZSBydW50aW1lIAorICAgICAgICAgICAgICAvLyB3YXMgcmVlbnRlcmVkLgorICAgICAgICAgICAgICBvbXB0X2ZyYW1lID0gX19vbXB0X2dldF90YXNrX2ZyYW1lX2ludGVybmFsKDApOworICAgICAgICAgICAgICBvbXB0X2ZyYW1lLT5yZWVudGVyX3J1bnRpbWVfZnJhbWUgPSBfX2J1aWx0aW5fZnJhbWVfYWRkcmVzcygwKTsKKyAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIGlmICghIHRoci0+dGgudGhfdGVhbS0+dC50X3NlcmlhbGl6ZWQpIHsKKyAgICAgICAgX19rbXBfcnVuX2FmdGVyX2ludm9rZWRfdGFzayhndGlkLCBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpLCB0aHIsCisgICAgICAgICAgdGhyLT50aC50aF90ZWFtKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgICAgLy8gU2V0IHJlZW50ZXIgZnJhbWUgaW4gcGFyZW50IHRhc2ssIHdoaWNoIHdpbGwgYmVjb21lIGN1cnJlbnQgdGFzaworICAgICAgICAgIC8vIGluIHRoZSBtaWRzdCBvZiBqb2luLiBUaGlzIGlzIG5lZWRlZCBiZWZvcmUgdGhlIGVuZF9wYXJhbGxlbCBjYWxsYmFjay4KKyAgICAgICAgICBvbXB0X2ZyYW1lID0gX19vbXB0X2dldF90YXNrX2ZyYW1lX2ludGVybmFsKDEpOworICAgICAgICAgIG9tcHRfZnJhbWUtPnJlZW50ZXJfcnVudGltZV9mcmFtZSA9IF9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKDApOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBfX2ttcF9qb2luX2NhbGwoJmxvYywgZ3RpZAorI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgLCBmb3JrX2NvbnRleHRfZ251CisjZW5kaWYKKyAgICAgICAgKTsKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICAgIG9tcHRfZnJhbWUtPnJlZW50ZXJfcnVudGltZV9mcmFtZSA9IE5VTEw7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBjX2VuZF9zZXJpYWxpemVkX3BhcmFsbGVsKCZsb2MsIGd0aWQpOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgICAgIC8vIFJlY29yZCB0aGF0IHdlIHJlLWVudGVyZWQgdGhlIHJ1bnRpbWUgc3lzdGVtIGluIHRoZSBmcmFtZSB0aGF0IAorICAgICAgICAgICAgLy8gY3JlYXRlZCB0aGUgcGFyYWxsZWwgcmVnaW9uLgorICAgICAgICAgICAgb21wdF9mcmFtZS0+cmVlbnRlcl9ydW50aW1lX2ZyYW1lID0gX19idWlsdGluX2ZyYW1lX2FkZHJlc3MoMCk7CisKKyAgICAgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kKSkgeworICAgICAgICAgICAgICAgIG9tcHRfdGFza19pbmZvX3QgKnRhc2tfaW5mbyA9IF9fb21wdF9nZXRfdGFza2luZm8oMCk7CisgICAgICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3BhcmFsbGVsX2VuZCkoCisgICAgICAgICAgICAgICAgICAgIHBhcmFsbGVsX2lkLCB0YXNrX2luZm8tPnRhc2tfaWQsIAorICAgICAgICAgICAgICAgICAgICBPTVBUX0lOVk9LRVIoZm9ya19jb250ZXh0X2dudSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvbXB0X2ZyYW1lLT5yZWVudGVyX3J1bnRpbWVfZnJhbWUgPSBOVUxMOworCisgICAgICAgICAgICB0aHItPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPQorICAgICAgICAgICAgICAgICgoKHRoci0+dGgudGhfdGVhbSktPnQudF9zZXJpYWxpemVkKSA/CisgICAgICAgICAgICAgICAgb21wdF9zdGF0ZV93b3JrX3NlcmlhbCA6IG9tcHRfc3RhdGVfd29ya19wYXJhbGxlbCk7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KK30KKworCisvLworLy8gTG9vcCB3b3Jrc2hhcmluZyBjb25zdHJ1Y3RzCisvLworCisvLworLy8gVGhlIEdudSBjb2RlZ2VuIHBhc3NlcyBpbiBhbiBleGNsdXNpdmUgdXBwZXIgYm91bmQgZm9yIHRoZSBvdmVyYWxsIHJhbmdlLAorLy8gYnV0IHRoZSBsaWJndWlkZSBkaXNwYXRjaCBjb2RlIGV4cGVjdHMgYW4gaW5jbHVzaXZlIHVwcGVyIGJvdW5kLCBoZW5jZSB0aGUKKy8vICJlbmQgLSBpbmNyIiA1dGggYXJndW1lbnQgdG8gS01QX0RJU1BBVENIX0lOSVQgKGFuZCB0aGUgIiB1YiAtIHN0ciIgMTF0aAorLy8gYXJndW1lbnQgdG8gX19rbXBfR09NUF9mb3JrX2NhbGwpLgorLy8KKy8vIENvbnZlcnNlbHksIEtNUF9ESVNQQVRDSF9ORVhUIHJldHVybnMgYW5kIGluY2x1c2l2ZSB1cHBlciBib3VuZCBpbiAqcF91YiwKKy8vIGJ1dCB0aGUgR251IGNvZGVnZW4gZXhwZWN0cyBhbiBleGNsdXNpZGUgdXBwZXIgYm91bmQsIHNvIHRoZSBhZGp1c3RtZW50CisvLyAiKnBfdWIgKz0gc3RyaWRlIiBjb21wZW5zdGF0ZXMgZm9yIHRoZSBkaXNjcmVwYW5jeS4KKy8vCisvLyBDb3JyZWN0aW9uOiB0aGUgZ251IGNvZGVnZW4gYWx3YXlzIGFkanVzdHMgdGhlIHVwcGVyIGJvdW5kIGJ5ICstMSwgbm90IHRoZQorLy8gc3RyaWRlIHZhbHVlLiAgV2UgYWRqdXN0IHRoZSBkaXNwYXRjaCBwYXJhbWV0ZXJzIGFjY29yZGluZ2x5IChieSArLTEpLCBidXQKKy8vIHdlIHN0aWxsIGFkanVzdCBwX3ViIGJ5IHRoZSBhY3R1YWwgc3RyaWRlIHZhbHVlLgorLy8KKy8vIFRoZSAicnVudGltZSIgdmVyc2lvbnMgZG8gbm90IHRha2UgYSBjaHVua19zeiBwYXJhbWV0ZXIuCisvLworLy8gVGhlIHByb2ZpbGUgbGliIGNhbm5vdCBzdXBwb3J0IGNvbnN0cnVjdCBjaGVja2luZyBvZiB1bm9yZGVyZWQgbG9vcHMgdGhhdAorLy8gYXJlIHByZWRldGVybWluZWQgYnkgdGhlIGNvbXBpbGVyIHRvIGJlIHN0YXRpY2FsbHkgc2NoZWR1bGVkLCBhcyB0aGUgZ2NjCisvLyBjb2RlZ2VuIHdpbGwgbm90IGFsd2F5cyBlbWl0IGNhbGxzIHRvIEdPTVBfbG9vcF9zdGF0aWNfbmV4dCgpIHRvIGdldCB0aGUKKy8vIG5leHQgaXRlcmF0aW9uLiAgSW5zdGVhZCwgaXQgZW1pdHMgaW5saW5lIGNvZGUgdG8gY2FsbCBvbXBfZ2V0X3RocmVhZF9udW0oKQorLy8gbnVtIGFuZCBjYWxjdWxhdGUgdGhlIGl0ZXJhdGlvbiBzcGFjZSB1c2luZyB0aGUgcmVzdWx0LiAgSXQgZG9lc24ndCBkbyB0aGlzCisvLyB3aXRoIG9yZGVyZWQgc3RhdGljIGxvb3AsIHNvIHRoZXkgY2FuIGJlIGNoZWNrZWQuCisvLworCisjZGVmaW5lIExPT1BfU1RBUlQoZnVuYyxzY2hlZHVsZSkgXAorICAgIGludCBmdW5jIChsb25nIGxiLCBsb25nIHViLCBsb25nIHN0ciwgbG9uZyBjaHVua19zeiwgbG9uZyAqcF9sYiwgICAgICAgICBcCisgICAgICBsb25nICpwX3ViKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGxvbmcgc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNS0xPQyhsb2MsICNmdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtBX1RSQUNFKDIwLCAoICNmdW5jICI6IFQjJWQsIGxiIDB4JWx4LCB1YiAweCVseCwgc3RyIDB4JWx4LCBjaHVua19zeiAweCVseFxuIiwgIFwKKyAgICAgICAgICBndGlkLCBsYiwgdWIsIHN0ciwgY2h1bmtfc3ogKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgoc3RyID4gMCkgPyAobGIgPCB1YikgOiAobGIgPiB1YikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEtNUF9ESVNQQVRDSF9JTklUKCZsb2MsIGd0aWQsIChzY2hlZHVsZSksIGxiLCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAoc3RyID4gMCkgPyAodWIgLSAxKSA6ICh1YiArIDEpLCBzdHIsIGNodW5rX3N6LCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIChzY2hlZHVsZSkgIT0ga21wX3NjaF9zdGF0aWMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHN0YXR1cyA9IEtNUF9ESVNQQVRDSF9ORVhUKCZsb2MsIGd0aWQsIE5VTEwsIChrbXBfaW50ICopcF9sYiwgICAgXAorICAgICAgICAgICAgICAoa21wX2ludCAqKXBfdWIsIChrbXBfaW50ICopJnN0cmlkZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoc3RhdHVzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHN0cmlkZSA9PSBzdHIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICpwX3ViICs9IChzdHIgPiAwKSA/IDEgOiAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzdGF0dXMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtBX1RSQUNFKDIwLCAoICNmdW5jICIgZXhpdDogVCMlZCwgKnBfbGIgMHglbHgsICpwX3ViIDB4JWx4LCByZXR1cm5pbmcgJWRcbiIsIFwKKyAgICAgICAgICBndGlkLCAqcF9sYiwgKnBfdWIsIHN0YXR1cykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisKKyNkZWZpbmUgTE9PUF9SVU5USU1FX1NUQVJUKGZ1bmMsc2NoZWR1bGUpIFwKKyAgICBpbnQgZnVuYyAobG9uZyBsYiwgbG9uZyB1YiwgbG9uZyBzdHIsIGxvbmcgKnBfbGIsIGxvbmcgKnBfdWIpICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbG9uZyBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBsb25nIGNodW5rX3N6ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTUtMT0MobG9jLCAjZnVuYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLQV9UUkFDRSgyMCwgKCAjZnVuYyAiOiBUIyVkLCBsYiAweCVseCwgdWIgMHglbHgsIHN0ciAweCVseCwgY2h1bmtfc3ogJWRcbiIsICBcCisgICAgICAgICAgZ3RpZCwgbGIsIHViLCBzdHIsIGNodW5rX3N6ICkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoKHN0ciA+IDApID8gKGxiIDwgdWIpIDogKGxiID4gdWIpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfRElTUEFUQ0hfSU5JVCgmbG9jLCBndGlkLCAoc2NoZWR1bGUpLCBsYiwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKHN0ciA+IDApID8gKHViIC0gMSkgOiAodWIgKyAxKSwgc3RyLCBjaHVua19zeiwgVFJVRSk7ICAgICAgICAgXAorICAgICAgICAgICAgc3RhdHVzID0gS01QX0RJU1BBVENIX05FWFQoJmxvYywgZ3RpZCwgTlVMTCwgKGttcF9pbnQgKilwX2xiLCAgICBcCisgICAgICAgICAgICAgIChrbXBfaW50ICopcF91YiwgKGttcF9pbnQgKikmc3RyaWRlKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmIChzdGF0dXMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoc3RyaWRlID09IHN0cik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKnBfdWIgKz0gKHN0ciA+IDApID8gMSA6IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHN0YXR1cyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS0FfVFJBQ0UoMjAsICggI2Z1bmMgIiBleGl0OiBUIyVkLCAqcF9sYiAweCVseCwgKnBfdWIgMHglbHgsIHJldHVybmluZyAlZFxuIiwgXAorICAgICAgICAgIGd0aWQsICpwX2xiLCAqcF91Yiwgc3RhdHVzKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKworI2RlZmluZSBMT09QX05FWFQoZnVuYyxmaW5pX2NvZGUpIFwKKyAgICBpbnQgZnVuYyhsb25nICpwX2xiLCBsb25nICpwX3ViKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbG9uZyBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1LTE9DKGxvYywgI2Z1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS0FfVFJBQ0UoMjAsICggI2Z1bmMgIjogVCMlZFxuIiwgZ3RpZCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZpbmlfY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3RhdHVzID0gS01QX0RJU1BBVENIX05FWFQoJmxvYywgZ3RpZCwgTlVMTCwgKGttcF9pbnQgKilwX2xiLCAgICAgICAgXAorICAgICAgICAgIChrbXBfaW50ICopcF91YiwgKGttcF9pbnQgKikmc3RyaWRlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChzdGF0dXMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICpwX3ViICs9IChzdHJpZGUgPiAwKSA/IDEgOiAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS0FfVFJBQ0UoMjAsICggI2Z1bmMgIiBleGl0OiBUIyVkLCAqcF9sYiAweCVseCwgKnBfdWIgMHglbHgsIHN0cmlkZSAweCVseCwgIiAgXAorICAgICAgICAgICJyZXR1cm5pbmcgJWRcbiIsIGd0aWQsICpwX2xiLCAqcF91Yiwgc3RyaWRlLCBzdGF0dXMpKTsgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKworTE9PUF9TVEFSVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfU1RBVElDX1NUQVJUKSwga21wX3NjaF9zdGF0aWMpCitMT09QX05FWFQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1NUQVRJQ19ORVhUKSwge30pCitMT09QX1NUQVJUKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9EWU5BTUlDX1NUQVJUKSwga21wX3NjaF9keW5hbWljX2NodW5rZWQpCitMT09QX05FWFQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX0RZTkFNSUNfTkVYVCksIHt9KQorTE9PUF9TVEFSVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfR1VJREVEX1NUQVJUKSwga21wX3NjaF9ndWlkZWRfY2h1bmtlZCkKK0xPT1BfTkVYVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfR1VJREVEX05FWFQpLCB7fSkKK0xPT1BfUlVOVElNRV9TVEFSVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfUlVOVElNRV9TVEFSVCksIGttcF9zY2hfcnVudGltZSkKK0xPT1BfTkVYVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfUlVOVElNRV9ORVhUKSwge30pCisKK0xPT1BfU1RBUlQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfU1RBVElDX1NUQVJUKSwga21wX29yZF9zdGF0aWMpCitMT09QX05FWFQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfU1RBVElDX05FWFQpLCBcCisgICAgeyBLTVBfRElTUEFUQ0hfRklOSV9DSFVOSygmbG9jLCBndGlkKTsgfSkKK0xPT1BfU1RBUlQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfRFlOQU1JQ19TVEFSVCksIGttcF9vcmRfZHluYW1pY19jaHVua2VkKQorTE9PUF9ORVhUKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX0RZTkFNSUNfTkVYVCksIFwKKyAgICB7IEtNUF9ESVNQQVRDSF9GSU5JX0NIVU5LKCZsb2MsIGd0aWQpOyB9KQorTE9PUF9TVEFSVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9HVUlERURfU1RBUlQpLCBrbXBfb3JkX2d1aWRlZF9jaHVua2VkKQorTE9PUF9ORVhUKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX0dVSURFRF9ORVhUKSwgXAorICAgIHsgS01QX0RJU1BBVENIX0ZJTklfQ0hVTksoJmxvYywgZ3RpZCk7IH0pCitMT09QX1JVTlRJTUVfU1RBUlQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfUlVOVElNRV9TVEFSVCksIGttcF9vcmRfcnVudGltZSkKK0xPT1BfTkVYVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9SVU5USU1FX05FWFQpLCBcCisgICAgeyBLTVBfRElTUEFUQ0hfRklOSV9DSFVOSygmbG9jLCBndGlkKTsgfSkKKworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRU5EKSh2b2lkKQoreworICAgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX2xvb3BfZW5kOiBUIyVkXG4iLCBndGlkKSkKKworICAgIF9fa21wX2JhcnJpZXIoYnNfcGxhaW5fYmFycmllciwgZ3RpZCwgRkFMU0UsIDAsIE5VTEwsIE5VTEwpOworCisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9sb29wX2VuZCBleGl0OiBUIyVkXG4iLCBndGlkKSkKK30KKworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRU5EX05PV0FJVCkodm9pZCkKK3sKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX2xvb3BfZW5kX25vd2FpdDogVCMlZFxuIiwgX19rbXBfZ2V0X2d0aWQoKSkpCit9CisKKworLy8KKy8vIFVuc2lnbmVkIGxvbmcgbG9uZyBsb29wIHdvcmtzaGFyaW5nIGNvbnN0cnVjdHMKKy8vCisvLyBUaGVzZSBhcmUgbmV3IHdpdGggZ2NjIDQuNAorLy8KKworI2RlZmluZSBMT09QX1NUQVJUX1VMTChmdW5jLHNjaGVkdWxlKSBcCisgICAgaW50IGZ1bmMgKGludCB1cCwgdW5zaWduZWQgbG9uZyBsb25nIGxiLCB1bnNpZ25lZCBsb25nIGxvbmcgdWIsICAgICAgICAgIFwKKyAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBzdHIsIHVuc2lnbmVkIGxvbmcgbG9uZyBjaHVua19zeiwgICAgICAgICAgICAgICAgICAgXAorICAgICAgdW5zaWduZWQgbG9uZyBsb25nICpwX2xiLCB1bnNpZ25lZCBsb25nIGxvbmcgKnBfdWIpICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IHN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBsb25nIGxvbmcgc3RyMiA9IHVwID8gKChsb25nIGxvbmcpc3RyKSA6IC0oKGxvbmcgbG9uZylzdHIpOyAgICAgICAgICBcCisgICAgICAgIGxvbmcgbG9uZyBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNS0xPQyhsb2MsICNmdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS0FfVFJBQ0UoMjAsICggI2Z1bmMgIjogVCMlZCwgdXAgJWQsIGxiIDB4JWxseCwgdWIgMHglbGx4LCBzdHIgMHglbGx4LCBjaHVua19zeiAweCVsbHhcbiIsIFwKKyAgICAgICAgICBndGlkLCB1cCwgbGIsIHViLCBzdHIsIGNodW5rX3N6ICkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgoc3RyID4gMCkgPyAobGIgPCB1YikgOiAobGIgPiB1YikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEtNUF9ESVNQQVRDSF9JTklUX1VMTCgmbG9jLCBndGlkLCAoc2NoZWR1bGUpLCBsYiwgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAoc3RyMiA+IDApID8gKHViIC0gMSkgOiAodWIgKyAxKSwgc3RyMiwgY2h1bmtfc3osICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIChzY2hlZHVsZSkgIT0ga21wX3NjaF9zdGF0aWMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHN0YXR1cyA9IEtNUF9ESVNQQVRDSF9ORVhUX1VMTCgmbG9jLCBndGlkLCBOVUxMLCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAoa21wX3VpbnQ2NCAqKXBfbGIsIChrbXBfdWludDY0ICopcF91YiwgKGttcF9pbnQ2NCAqKSZzdHJpZGUpOyBcCisgICAgICAgICAgICBpZiAoc3RhdHVzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHN0cmlkZSA9PSBzdHIyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICpwX3ViICs9IChzdHIgPiAwKSA/IDEgOiAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzdGF0dXMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtBX1RSQUNFKDIwLCAoICNmdW5jICIgZXhpdDogVCMlZCwgKnBfbGIgMHglbGx4LCAqcF91YiAweCVsbHgsIHJldHVybmluZyAlZFxuIiwgXAorICAgICAgICAgIGd0aWQsICpwX2xiLCAqcF91Yiwgc3RhdHVzKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKworI2RlZmluZSBMT09QX1JVTlRJTUVfU1RBUlRfVUxMKGZ1bmMsc2NoZWR1bGUpIFwKKyAgICBpbnQgZnVuYyAoaW50IHVwLCB1bnNpZ25lZCBsb25nIGxvbmcgbGIsIHVuc2lnbmVkIGxvbmcgbG9uZyB1YiwgICAgICAgICAgXAorICAgICAgdW5zaWduZWQgbG9uZyBsb25nIHN0ciwgdW5zaWduZWQgbG9uZyBsb25nICpwX2xiLCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgKnBfdWIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGxvbmcgbG9uZyBzdHIyID0gdXAgPyAoKGxvbmcgbG9uZylzdHIpIDogLSgobG9uZyBsb25nKXN0cik7ICAgICAgICAgIFwKKyAgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgY2h1bmtfc3ogPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTUtMT0MobG9jLCAjZnVuYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtBX1RSQUNFKDIwLCAoICNmdW5jICI6IFQjJWQsIHVwICVkLCBsYiAweCVsbHgsIHViIDB4JWxseCwgc3RyIDB4JWxseCwgY2h1bmtfc3ogMHglbGx4XG4iLCBcCisgICAgICAgICAgZ3RpZCwgdXAsIGxiLCB1Yiwgc3RyLCBjaHVua19zeiApKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoKHN0ciA+IDApID8gKGxiIDwgdWIpIDogKGxiID4gdWIpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfRElTUEFUQ0hfSU5JVF9VTEwoJmxvYywgZ3RpZCwgKHNjaGVkdWxlKSwgbGIsICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKHN0cjIgPiAwKSA/ICh1YiAtIDEpIDogKHViICsgMSksIHN0cjIsIGNodW5rX3N6LCBUUlVFKTsgICAgICAgXAorICAgICAgICAgICAgc3RhdHVzID0gS01QX0RJU1BBVENIX05FWFRfVUxMKCZsb2MsIGd0aWQsIE5VTEwsICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIChrbXBfdWludDY0ICopcF9sYiwgKGttcF91aW50NjQgKilwX3ViLCAoa21wX2ludDY0ICopJnN0cmlkZSk7IFwKKyAgICAgICAgICAgIGlmIChzdGF0dXMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoKGxvbmcgbG9uZylzdHJpZGUgPT0gc3RyMik7ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKnBfdWIgKz0gKHN0ciA+IDApID8gMSA6IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHN0YXR1cyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS0FfVFJBQ0UoMjAsICggI2Z1bmMgIiBleGl0OiBUIyVkLCAqcF9sYiAweCVsbHgsICpwX3ViIDB4JWxseCwgcmV0dXJuaW5nICVkXG4iLCBcCisgICAgICAgICAgZ3RpZCwgKnBfbGIsICpwX3ViLCBzdGF0dXMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIHN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworCisjZGVmaW5lIExPT1BfTkVYVF9VTEwoZnVuYyxmaW5pX2NvZGUpIFwKKyAgICBpbnQgZnVuYyh1bnNpZ25lZCBsb25nIGxvbmcgKnBfbGIsIHVuc2lnbmVkIGxvbmcgbG9uZyAqcF91YikgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbG9uZyBsb25nIHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1LTE9DKGxvYywgI2Z1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS0FfVFJBQ0UoMjAsICggI2Z1bmMgIjogVCMlZFxuIiwgZ3RpZCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZpbmlfY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3RhdHVzID0gS01QX0RJU1BBVENIX05FWFRfVUxMKCZsb2MsIGd0aWQsIE5VTEwsIChrbXBfdWludDY0ICopcF9sYiwgXAorICAgICAgICAgIChrbXBfdWludDY0ICopcF91YiwgKGttcF9pbnQ2NCAqKSZzdHJpZGUpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChzdGF0dXMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICpwX3ViICs9IChzdHJpZGUgPiAwKSA/IDEgOiAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS0FfVFJBQ0UoMjAsICggI2Z1bmMgIiBleGl0OiBUIyVkLCAqcF9sYiAweCVsbHgsICpwX3ViIDB4JWxseCwgc3RyaWRlIDB4JWxseCwgIiBcCisgICAgICAgICAgInJldHVybmluZyAlZFxuIiwgZ3RpZCwgKnBfbGIsICpwX3ViLCBzdHJpZGUsIHN0YXR1cykpOyAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIHN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworCitMT09QX1NUQVJUX1VMTCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX1NUQVRJQ19TVEFSVCksIGttcF9zY2hfc3RhdGljKQorTE9PUF9ORVhUX1VMTCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX1NUQVRJQ19ORVhUKSwge30pCitMT09QX1NUQVJUX1VMTCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX0RZTkFNSUNfU1RBUlQpLCBrbXBfc2NoX2R5bmFtaWNfY2h1bmtlZCkKK0xPT1BfTkVYVF9VTEwoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9EWU5BTUlDX05FWFQpLCB7fSkKK0xPT1BfU1RBUlRfVUxMKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfR1VJREVEX1NUQVJUKSwga21wX3NjaF9ndWlkZWRfY2h1bmtlZCkKK0xPT1BfTkVYVF9VTEwoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9HVUlERURfTkVYVCksIHt9KQorTE9PUF9SVU5USU1FX1NUQVJUX1VMTCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX1JVTlRJTUVfU1RBUlQpLCBrbXBfc2NoX3J1bnRpbWUpCitMT09QX05FWFRfVUxMKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfUlVOVElNRV9ORVhUKSwge30pCisKK0xPT1BfU1RBUlRfVUxMKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9TVEFUSUNfU1RBUlQpLCBrbXBfb3JkX3N0YXRpYykKK0xPT1BfTkVYVF9VTEwoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX1NUQVRJQ19ORVhUKSwgXAorICAgIHsgS01QX0RJU1BBVENIX0ZJTklfQ0hVTktfVUxMKCZsb2MsIGd0aWQpOyB9KQorTE9PUF9TVEFSVF9VTEwoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX0RZTkFNSUNfU1RBUlQpLCBrbXBfb3JkX2R5bmFtaWNfY2h1bmtlZCkKK0xPT1BfTkVYVF9VTEwoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX0RZTkFNSUNfTkVYVCksIFwKKyAgICB7IEtNUF9ESVNQQVRDSF9GSU5JX0NIVU5LX1VMTCgmbG9jLCBndGlkKTsgfSkKK0xPT1BfU1RBUlRfVUxMKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9HVUlERURfU1RBUlQpLCBrbXBfb3JkX2d1aWRlZF9jaHVua2VkKQorTE9PUF9ORVhUX1VMTCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfR1VJREVEX05FWFQpLCBcCisgICAgeyBLTVBfRElTUEFUQ0hfRklOSV9DSFVOS19VTEwoJmxvYywgZ3RpZCk7IH0pCitMT09QX1JVTlRJTUVfU1RBUlRfVUxMKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9SVU5USU1FX1NUQVJUKSwga21wX29yZF9ydW50aW1lKQorTE9PUF9ORVhUX1VMTCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfUlVOVElNRV9ORVhUKSwgXAorICAgIHsgS01QX0RJU1BBVENIX0ZJTklfQ0hVTktfVUxMKCZsb2MsIGd0aWQpOyB9KQorCisKKy8vCisvLyBDb21iaW5lZCBwYXJhbGxlbCAvIGxvb3Agd29ya3NoYXJpbmcgY29uc3RydWN0cworLy8KKy8vIFRoZXJlIGFyZSBubyB1bGwgdmVyc2lvbnMgKHlldCkuCisvLworCisjZGVmaW5lIFBBUkFMTEVMX0xPT1BfU1RBUlQoZnVuYywgc2NoZWR1bGUsIG9tcHRfcHJlLCBvbXB0X3Bvc3QpIFwKKyAgICB2b2lkIGZ1bmMgKHZvaWQgKCp0YXNrKSAodm9pZCAqKSwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbnVtX3RocmVhZHMsICAgICAgXAorICAgICAgbG9uZyBsYiwgbG9uZyB1YiwgbG9uZyBzdHIsIGxvbmcgY2h1bmtfc3opICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNS0xPQyhsb2MsICNmdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtBX1RSQUNFKDIwLCAoICNmdW5jICI6IFQjJWQsIGxiIDB4JWx4LCB1YiAweCVseCwgc3RyIDB4JWx4LCBjaHVua19zeiAweCVseFxuIiwgICAgICAgIFwKKyAgICAgICAgICBndGlkLCBsYiwgdWIsIHN0ciwgY2h1bmtfc3ogKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG9tcHRfcHJlKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoX19rbXBjX29rX3RvX2ZvcmsoJmxvYykgJiYgKG51bV90aHJlYWRzICE9IDEpKSB7ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAobnVtX3RocmVhZHMgIT0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfX2ttcF9wdXNoX251bV90aHJlYWRzKCZsb2MsIGd0aWQsIG51bV90aHJlYWRzKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfX2ttcF9HT01QX2ZvcmtfY2FsbCgmbG9jLCBndGlkLCB0YXNrLCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKG1pY3JvdGFza190KV9fa21wX0dPTVBfcGFyYWxsZWxfbWljcm90YXNrX3dyYXBwZXIsIDksICAgICAgICAgXAorICAgICAgICAgICAgICB0YXNrLCBkYXRhLCBudW1fdGhyZWFkcywgJmxvYywgKHNjaGVkdWxlKSwgbGIsICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIChzdHIgPiAwKSA/ICh1YiAtIDEpIDogKHViICsgMSksIHN0ciwgY2h1bmtfc3opOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfX2ttcF9HT01QX3NlcmlhbGl6ZWRfcGFyYWxsZWwoJmxvYywgZ3RpZCwgdGFzayk7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9ESVNQQVRDSF9JTklUKCZsb2MsIGd0aWQsIChzY2hlZHVsZSksIGxiLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoc3RyID4gMCkgPyAodWIgLSAxKSA6ICh1YiArIDEpLCBzdHIsIGNodW5rX3N6LCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChzY2hlZHVsZSkgIT0ga21wX3NjaF9zdGF0aWMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgb21wdF9wb3N0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtBX1RSQUNFKDIwLCAoICNmdW5jICIgZXhpdDogVCMlZFxuIiwgZ3RpZCkpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKworCisjaWYgT01QVF9TVVBQT1JUCisKKyNkZWZpbmUgT01QVF9MT09QX1BSRSgpIFwKKyAgICBvbXB0X2ZyYW1lX3QgKnBhcmVudF9mcmFtZTsgXAorICAgIGlmIChvbXB0X2VuYWJsZWQpIHsgXAorICAgICAgICBwYXJlbnRfZnJhbWUgPSBfX29tcHRfZ2V0X3Rhc2tfZnJhbWVfaW50ZXJuYWwoMCk7IFwKKyAgICAgICAgcGFyZW50X2ZyYW1lLT5yZWVudGVyX3J1bnRpbWVfZnJhbWUgPSBfX2J1aWx0aW5fZnJhbWVfYWRkcmVzcygwKTsgXAorICAgIH0KKworCisjZGVmaW5lIE9NUFRfTE9PUF9QT1NUKCkgXAorICAgIGlmIChvbXB0X2VuYWJsZWQpIHsgXAorICAgICAgICBwYXJlbnRfZnJhbWUtPnJlZW50ZXJfcnVudGltZV9mcmFtZSA9IE5VTEw7IFwKKyAgICB9CisKKyNlbHNlCisKKyNkZWZpbmUgT01QVF9MT09QX1BSRSgpIAorCisjZGVmaW5lIE9NUFRfTE9PUF9QT1NUKCkKKworI2VuZGlmCisKKworUEFSQUxMRUxfTE9PUF9TVEFSVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfU1RBVElDX1NUQVJUKSwgCisgICAgICAgICAgICAgICAgICAgIGttcF9zY2hfc3RhdGljLCBPTVBUX0xPT1BfUFJFLCBPTVBUX0xPT1BfUE9TVCkKK1BBUkFMTEVMX0xPT1BfU1RBUlQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0RZTkFNSUNfU1RBUlQpLCAKKyAgICAgICAgICAgICAgICAgICAga21wX3NjaF9keW5hbWljX2NodW5rZWQsIE9NUFRfTE9PUF9QUkUsIE9NUFRfTE9PUF9QT1NUKQorUEFSQUxMRUxfTE9PUF9TVEFSVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfR1VJREVEX1NUQVJUKSwgCisgICAgICAgICAgICAgICAgICAgIGttcF9zY2hfZ3VpZGVkX2NodW5rZWQsIE9NUFRfTE9PUF9QUkUsIE9NUFRfTE9PUF9QT1NUKQorUEFSQUxMRUxfTE9PUF9TVEFSVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfUlVOVElNRV9TVEFSVCksIAorICAgICAgICAgICAgICAgICAgICBrbXBfc2NoX3J1bnRpbWUsIE9NUFRfTE9PUF9QUkUsIE9NUFRfTE9PUF9QT1NUKQorCisKKy8vCisvLyBUYXNraW5nIGNvbnN0cnVjdHMKKy8vCisKK3ZvaWQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfVEFTSykodm9pZCAoKmZ1bmMpKHZvaWQgKiksIHZvaWQgKmRhdGEsIHZvaWQgKCpjb3B5X2Z1bmMpKHZvaWQgKiwgdm9pZCAqKSwKKyAgbG9uZyBhcmdfc2l6ZSwgbG9uZyBhcmdfYWxpZ24sIGludCBpZl9jb25kLCB1bnNpZ25lZCBnb21wX2ZsYWdzKQoreworICAgIE1LTE9DKGxvYywgIkdPTVBfdGFzayIpOworICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICAgIGttcF9pbnQzMiBmbGFncyA9IDA7CisgICAga21wX3Rhc2tpbmdfZmxhZ3NfdCAqaW5wdXRfZmxhZ3MgPSAoa21wX3Rhc2tpbmdfZmxhZ3NfdCAqKSAmIGZsYWdzOworCisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF90YXNrOiBUIyVkXG4iLCBndGlkKSk7CisKKyAgICAvLyBUaGUgbG93LW9yZGVyIGJpdCBpcyB0aGUgInRpZWQiIGZsYWcKKyAgICBpZiAoZ29tcF9mbGFncyAmIDEpIHsKKyAgICAgICAgaW5wdXRfZmxhZ3MtPnRpZWRuZXNzID0gMTsKKyAgICB9CisgICAgLy8gVGhlIHNlY29uZCBsb3ctb3JkZXIgYml0IGlzIHRoZSAiZmluYWwiIGZsYWcKKyAgICBpZiAoZ29tcF9mbGFncyAmIDIpIHsKKyAgICAgICAgaW5wdXRfZmxhZ3MtPmZpbmFsID0gMTsKKyAgICB9CisgICAgaW5wdXRfZmxhZ3MtPm5hdGl2ZSA9IDE7CisgICAgLy8gX19rbXBfdGFza19hbGxvYygpIHNldHMgdXAgYWxsIG90aGVyIGZsYWdzCisKKyAgICBpZiAoISBpZl9jb25kKSB7CisgICAgICAgIGFyZ19zaXplID0gMDsKKyAgICB9CisKKyAgICBrbXBfdGFza190ICp0YXNrID0gX19rbXBfdGFza19hbGxvYygmbG9jLCBndGlkLCBpbnB1dF9mbGFncywKKyAgICAgIHNpemVvZihrbXBfdGFza190KSwgYXJnX3NpemUgPyBhcmdfc2l6ZSArIGFyZ19hbGlnbiAtIDEgOiAwLAorICAgICAgKGttcF9yb3V0aW5lX2VudHJ5X3QpZnVuYyk7CisKKyAgICBpZiAoYXJnX3NpemUgPiAwKSB7CisgICAgICAgIGlmIChhcmdfYWxpZ24gPiAwKSB7CisgICAgICAgICAgICB0YXNrLT5zaGFyZWRzID0gKHZvaWQgKikoKCgoc2l6ZV90KXRhc2stPnNoYXJlZHMpCisgICAgICAgICAgICAgICsgYXJnX2FsaWduIC0gMSkgLyBhcmdfYWxpZ24gKiBhcmdfYWxpZ24pOworICAgICAgICB9CisgICAgICAgIC8vZWxzZSBlcnJvcj8/CisKKyAgICAgICAgaWYgKGNvcHlfZnVuYykgeworICAgICAgICAgICAgKCpjb3B5X2Z1bmMpKHRhc2stPnNoYXJlZHMsIGRhdGEpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgS01QX01FTUNQWSh0YXNrLT5zaGFyZWRzLCBkYXRhLCBhcmdfc2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaWZfY29uZCkgeworICAgICAgICBfX2ttcGNfb21wX3Rhc2soJmxvYywgZ3RpZCwgdGFzayk7CisgICAgfQorICAgIGVsc2UgeworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICBvbXB0X3RocmVhZF9pbmZvX3Qgb2xkSW5mbzsKKyAgICAgICAga21wX2luZm9fdCAqdGhyZWFkOworICAgICAgICBrbXBfdGFza2RhdGFfdCAqdGFza2RhdGE7CisgICAgICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgICAgIC8vIFN0b3JlIHRoZSB0aHJlYWRzIHN0YXRlcyBhbmQgcmVzdG9yZSB0aGVtIGFmdGVyIHRoZSB0YXNrCisgICAgICAgICAgICB0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAgICAgICAgICB0YXNrZGF0YSA9IEtNUF9UQVNLX1RPX1RBU0tEQVRBKHRhc2spOworICAgICAgICAgICAgb2xkSW5mbyA9IHRocmVhZC0+dGgub21wdF90aHJlYWRfaW5mbzsKKyAgICAgICAgICAgIHRocmVhZC0+dGgub21wdF90aHJlYWRfaW5mby53YWl0X2lkID0gMDsKKyAgICAgICAgICAgIHRocmVhZC0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfd29ya19wYXJhbGxlbDsKKyAgICAgICAgICAgIHRhc2tkYXRhLT5vbXB0X3Rhc2tfaW5mby5mcmFtZS5leGl0X3J1bnRpbWVfZnJhbWUgPQorICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKDApOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBfX2ttcGNfb21wX3Rhc2tfYmVnaW5faWYwKCZsb2MsIGd0aWQsIHRhc2spOworICAgICAgICBmdW5jKGRhdGEpOworICAgICAgICBfX2ttcGNfb21wX3Rhc2tfY29tcGxldGVfaWYwKCZsb2MsIGd0aWQsIHRhc2spOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgICAgIHRocmVhZC0+dGgub21wdF90aHJlYWRfaW5mbyA9IG9sZEluZm87CisgICAgICAgICAgICB0YXNrZGF0YS0+b21wdF90YXNrX2luZm8uZnJhbWUuZXhpdF9ydW50aW1lX2ZyYW1lID0gMDsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorCisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF90YXNrIGV4aXQ6IFQjJWRcbiIsIGd0aWQpKTsKK30KKworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1RBU0tXQUlUKSh2b2lkKQoreworICAgIE1LTE9DKGxvYywgIkdPTVBfdGFza3dhaXQiKTsKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfdGFza3dhaXQ6IFQjJWRcbiIsIGd0aWQpKTsKKworICAgIF9fa21wY19vbXBfdGFza3dhaXQoJmxvYywgZ3RpZCk7CisKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX3Rhc2t3YWl0IGV4aXQ6IFQjJWRcbiIsIGd0aWQpKTsKK30KKworCisvLworLy8gU2VjdGlvbnMgd29ya3NoYXJpbmcgY29uc3RydWN0cworLy8KKworLy8KKy8vIEZvciB0aGUgc2VjdGlvbnMgY29uc3RydWN0LCB3ZSBpbml0aWFsaXplIGEgZHluYW1pY2FsbHkgc2NoZWR1bGVkIGxvb3AKKy8vIHdvcmtzaGFyaW5nIGNvbnN0cnVjdCB3aXRoIGxiIDEgYW5kIHN0cmlkZSAxLCBhbmQgdXNlIHRoZSBpdGVyYXRpb24gIydzCisvLyB0aGF0IGl0cyByZXR1cm5zIGFzIHNlY3Rpb25zIGlkcy4KKy8vCisvLyBUaGVyZSBhcmUgbm8gc3BlY2lhbCBlbnRyeSBwb2ludHMgZm9yIG9yZGVyZWQgc2VjdGlvbnMsIHNvIHdlIGFsd2F5cyB1c2UKKy8vIHRoZSBkeW5hbWljYWxseSBzY2hlZHVsZWQgd29ya3NoYXJlLCBldmVuIGlmIHRoZSBzZWN0aW9ucyBhcmVuJ3Qgb3JkZXJlZC4KKy8vCisKK3Vuc2lnbmVkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX1NUQVJUKSh1bnNpZ25lZCBjb3VudCkKK3sKKyAgICBpbnQgc3RhdHVzOworICAgIGttcF9pbnQgbGIsIHViLCBzdHJpZGU7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9zZWN0aW9uc19zdGFydCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfc2VjdGlvbnNfc3RhcnQ6IFQjJWRcbiIsIGd0aWQpKTsKKworICAgIEtNUF9ESVNQQVRDSF9JTklUKCZsb2MsIGd0aWQsIGttcF9ubV9keW5hbWljX2NodW5rZWQsIDEsIGNvdW50LCAxLCAxLCBUUlVFKTsKKworICAgIHN0YXR1cyA9IEtNUF9ESVNQQVRDSF9ORVhUKCZsb2MsIGd0aWQsIE5VTEwsICZsYiwgJnViLCAmc3RyaWRlKTsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoc3RyaWRlID09IDEpOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGxiID4gMCk7CisgICAgICAgIEtNUF9BU1NFUlQobGIgPT0gdWIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbGIgPSAwOworICAgIH0KKworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfc2VjdGlvbnNfc3RhcnQgZXhpdDogVCMlZCByZXR1cm5pbmcgJXVcbiIsIGd0aWQsCisgICAgICAodW5zaWduZWQpbGIpKTsKKyAgICByZXR1cm4gKHVuc2lnbmVkKWxiOworfQorCisKK3Vuc2lnbmVkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX05FWFQpKHZvaWQpCit7CisgICAgaW50IHN0YXR1czsKKyAgICBrbXBfaW50IGxiLCB1Yiwgc3RyaWRlOworICAgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgICBNS0xPQyhsb2MsICJHT01QX3NlY3Rpb25zX25leHQiKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX3NlY3Rpb25zX25leHQ6IFQjJWRcbiIsIGd0aWQpKTsKKworICAgIHN0YXR1cyA9IEtNUF9ESVNQQVRDSF9ORVhUKCZsb2MsIGd0aWQsIE5VTEwsICZsYiwgJnViLCAmc3RyaWRlKTsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoc3RyaWRlID09IDEpOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGxiID4gMCk7CisgICAgICAgIEtNUF9BU1NFUlQobGIgPT0gdWIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbGIgPSAwOworICAgIH0KKworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfc2VjdGlvbnNfbmV4dCBleGl0OiBUIyVkIHJldHVybmluZyAldVxuIiwgZ3RpZCwKKyAgICAgICh1bnNpZ25lZClsYikpOworICAgIHJldHVybiAodW5zaWduZWQpbGI7Cit9CisKKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9TRUNUSU9OU19TVEFSVCkodm9pZCAoKnRhc2spICh2b2lkICopLCB2b2lkICpkYXRhLAorICB1bnNpZ25lZCBudW1fdGhyZWFkcywgdW5zaWduZWQgY291bnQpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBvbXB0X2ZyYW1lX3QgKnBhcmVudF9mcmFtZTsKKworICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgcGFyZW50X2ZyYW1lID0gX19vbXB0X2dldF90YXNrX2ZyYW1lX2ludGVybmFsKDApOworICAgICAgICBwYXJlbnRfZnJhbWUtPnJlZW50ZXJfcnVudGltZV9mcmFtZSA9IF9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKDApOworICAgIH0KKyNlbmRpZgorCisgICAgTUtMT0MobG9jLCAiR09NUF9wYXJhbGxlbF9zZWN0aW9uc19zdGFydCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfcGFyYWxsZWxfc2VjdGlvbnNfc3RhcnQ6IFQjJWRcbiIsIGd0aWQpKTsKKworICAgIGlmIChfX2ttcGNfb2tfdG9fZm9yaygmbG9jKSAmJiAobnVtX3RocmVhZHMgIT0gMSkpIHsKKyAgICAgICAgaWYgKG51bV90aHJlYWRzICE9IDApIHsKKyAgICAgICAgICAgIF9fa21wX3B1c2hfbnVtX3RocmVhZHMoJmxvYywgZ3RpZCwgbnVtX3RocmVhZHMpOworICAgICAgICB9CisgICAgICAgIF9fa21wX0dPTVBfZm9ya19jYWxsKCZsb2MsIGd0aWQsIHRhc2ssCisgICAgICAgICAgKG1pY3JvdGFza190KV9fa21wX0dPTVBfcGFyYWxsZWxfbWljcm90YXNrX3dyYXBwZXIsIDksIHRhc2ssIGRhdGEsCisgICAgICAgICAgbnVtX3RocmVhZHMsICZsb2MsIGttcF9ubV9keW5hbWljX2NodW5rZWQsIChrbXBfaW50KTEsCisgICAgICAgICAgKGttcF9pbnQpY291bnQsIChrbXBfaW50KTEsIChrbXBfaW50KTEpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfR09NUF9zZXJpYWxpemVkX3BhcmFsbGVsKCZsb2MsIGd0aWQsIHRhc2spOworICAgIH0KKworI2lmIE9NUFRfU1VQUE9SVAorICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgcGFyZW50X2ZyYW1lLT5yZWVudGVyX3J1bnRpbWVfZnJhbWUgPSBOVUxMOworICAgIH0KKyNlbmRpZgorCisgICAgS01QX0RJU1BBVENIX0lOSVQoJmxvYywgZ3RpZCwga21wX25tX2R5bmFtaWNfY2h1bmtlZCwgMSwgY291bnQsIDEsIDEsIFRSVUUpOworCisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9wYXJhbGxlbF9zZWN0aW9uc19zdGFydCBleGl0OiBUIyVkXG4iLCBndGlkKSk7Cit9CisKKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9TRUNUSU9OU19FTkQpKHZvaWQpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfc2VjdGlvbnNfZW5kOiBUIyVkXG4iLCBndGlkKSkKKworICAgIF9fa21wX2JhcnJpZXIoYnNfcGxhaW5fYmFycmllciwgZ3RpZCwgRkFMU0UsIDAsIE5VTEwsIE5VTEwpOworCisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9zZWN0aW9uc19lbmQgZXhpdDogVCMlZFxuIiwgZ3RpZCkpCit9CisKKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9TRUNUSU9OU19FTkRfTk9XQUlUKSh2b2lkKQoreworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfc2VjdGlvbnNfZW5kX25vd2FpdDogVCMlZFxuIiwgX19rbXBfZ2V0X2d0aWQoKSkpCit9CisKKy8vIGxpYmdvbXAgaGFzIGFuIGVtcHR5IGZ1bmN0aW9uIGZvciBHT01QX3Rhc2t5aWVsZCBhcyBvZiAyMDEzLTEwLTEwCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1RBU0tZSUVMRCkodm9pZCkKK3sKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX3Rhc2t5aWVsZDogVCMlZFxuIiwgX19rbXBfZ2V0X2d0aWQoKSkpCisgICAgcmV0dXJuOworfQorCisjaWYgT01QXzQwX0VOQUJMRUQgLy8gdGhlc2UgYXJlIG5ldyBHT01QXzQuMCBlbnRyeSBwb2ludHMKKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTCkodm9pZCAoKnRhc2spKHZvaWQgKiksIHZvaWQgKmRhdGEsIHVuc2lnbmVkIG51bV90aHJlYWRzLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9wYXJhbGxlbCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfcGFyYWxsZWw6IFQjJWRcbiIsIGd0aWQpKTsKKworICAgIGlmIChfX2ttcGNfb2tfdG9fZm9yaygmbG9jKSAmJiAobnVtX3RocmVhZHMgIT0gMSkpIHsKKyAgICAgICAgaWYgKG51bV90aHJlYWRzICE9IDApIHsKKyAgICAgICAgICAgIF9fa21wX3B1c2hfbnVtX3RocmVhZHMoJmxvYywgZ3RpZCwgbnVtX3RocmVhZHMpOworICAgICAgICB9CisgICAgICAgIGlmKGZsYWdzICE9IDApIHsKKyAgICAgICAgICAgIF9fa21wX3B1c2hfcHJvY19iaW5kKCZsb2MsIGd0aWQsIChrbXBfcHJvY19iaW5kX3QpZmxhZ3MpOworICAgICAgICB9CisgICAgICAgIF9fa21wX0dPTVBfZm9ya19jYWxsKCZsb2MsIGd0aWQsIHRhc2ssCisgICAgICAgICAgKG1pY3JvdGFza190KV9fa21wX0dPTVBfbWljcm90YXNrX3dyYXBwZXIsIDIsIHRhc2ssIGRhdGEpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfR09NUF9zZXJpYWxpemVkX3BhcmFsbGVsKCZsb2MsIGd0aWQsIHRhc2spOworICAgIH0KKyAgICB0YXNrKGRhdGEpOworICAgIHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfRU5EKSgpOworfQorCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX1NFQ1RJT05TKSh2b2lkICgqdGFzaykgKHZvaWQgKiksIHZvaWQgKmRhdGEsCisgIHVuc2lnbmVkIG51bV90aHJlYWRzLCB1bnNpZ25lZCBjb3VudCwgdW5zaWduZWQgZmxhZ3MpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9wYXJhbGxlbF9zZWN0aW9ucyIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfcGFyYWxsZWxfc2VjdGlvbnM6IFQjJWRcbiIsIGd0aWQpKTsKKworICAgIGlmIChfX2ttcGNfb2tfdG9fZm9yaygmbG9jKSAmJiAobnVtX3RocmVhZHMgIT0gMSkpIHsKKyAgICAgICAgaWYgKG51bV90aHJlYWRzICE9IDApIHsKKyAgICAgICAgICAgIF9fa21wX3B1c2hfbnVtX3RocmVhZHMoJmxvYywgZ3RpZCwgbnVtX3RocmVhZHMpOworICAgICAgICB9CisgICAgICAgIGlmKGZsYWdzICE9IDApIHsKKyAgICAgICAgICAgIF9fa21wX3B1c2hfcHJvY19iaW5kKCZsb2MsIGd0aWQsIChrbXBfcHJvY19iaW5kX3QpZmxhZ3MpOworICAgICAgICB9CisgICAgICAgIF9fa21wX0dPTVBfZm9ya19jYWxsKCZsb2MsIGd0aWQsIHRhc2ssCisgICAgICAgICAgKG1pY3JvdGFza190KV9fa21wX0dPTVBfcGFyYWxsZWxfbWljcm90YXNrX3dyYXBwZXIsIDksIHRhc2ssIGRhdGEsCisgICAgICAgICAgbnVtX3RocmVhZHMsICZsb2MsIGttcF9ubV9keW5hbWljX2NodW5rZWQsIChrbXBfaW50KTEsCisgICAgICAgICAgKGttcF9pbnQpY291bnQsIChrbXBfaW50KTEsIChrbXBfaW50KTEpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfR09NUF9zZXJpYWxpemVkX3BhcmFsbGVsKCZsb2MsIGd0aWQsIHRhc2spOworICAgIH0KKworICAgIEtNUF9ESVNQQVRDSF9JTklUKCZsb2MsIGd0aWQsIGttcF9ubV9keW5hbWljX2NodW5rZWQsIDEsIGNvdW50LCAxLCAxLCBUUlVFKTsKKworICAgIHRhc2soZGF0YSk7CisgICAgeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9FTkQpKCk7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9wYXJhbGxlbF9zZWN0aW9ucyBleGl0OiBUIyVkXG4iLCBndGlkKSk7Cit9CisKKyNkZWZpbmUgUEFSQUxMRUxfTE9PUChmdW5jLCBzY2hlZHVsZSkgXAorICAgIHZvaWQgZnVuYyAodm9pZCAoKnRhc2spICh2b2lkICopLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBudW1fdGhyZWFkcywgICAgICBcCisgICAgICBsb25nIGxiLCBsb25nIHViLCBsb25nIHN0ciwgbG9uZyBjaHVua19zeiwgdW5zaWduZWQgZmxhZ3MpICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1LTE9DKGxvYywgI2Z1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS0FfVFJBQ0UoMjAsICggI2Z1bmMgIjogVCMlZCwgbGIgMHglbHgsIHViIDB4JWx4LCBzdHIgMHglbHgsIGNodW5rX3N6IDB4JWx4XG4iLCAgICAgICAgXAorICAgICAgICAgIGd0aWQsIGxiLCB1Yiwgc3RyLCBjaHVua19zeiApKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKF9fa21wY19va190b19mb3JrKCZsb2MpICYmIChudW1fdGhyZWFkcyAhPSAxKSkgeyAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKG51bV90aHJlYWRzICE9IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgX19rbXBfcHVzaF9udW1fdGhyZWFkcygmbG9jLCBndGlkLCBudW1fdGhyZWFkcyk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKGZsYWdzICE9IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgX19rbXBfcHVzaF9wcm9jX2JpbmQoJmxvYywgZ3RpZCwgKGttcF9wcm9jX2JpbmRfdClmbGFncyk7ICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX19rbXBfR09NUF9mb3JrX2NhbGwoJmxvYywgZ3RpZCwgdGFzaywgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIChtaWNyb3Rhc2tfdClfX2ttcF9HT01QX3BhcmFsbGVsX21pY3JvdGFza193cmFwcGVyLCA5LCAgICAgICAgIFwKKyAgICAgICAgICAgICAgdGFzaywgZGF0YSwgbnVtX3RocmVhZHMsICZsb2MsIChzY2hlZHVsZSksIGxiLCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAoc3RyID4gMCkgPyAodWIgLSAxKSA6ICh1YiArIDEpLCBzdHIsIGNodW5rX3N6KTsgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX19rbXBfR09NUF9zZXJpYWxpemVkX3BhcmFsbGVsKCZsb2MsIGd0aWQsIHRhc2spOyAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfRElTUEFUQ0hfSU5JVCgmbG9jLCBndGlkLCAoc2NoZWR1bGUpLCBsYiwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKHN0ciA+IDApID8gKHViIC0gMSkgOiAodWIgKyAxKSwgc3RyLCBjaHVua19zeiwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoc2NoZWR1bGUpICE9IGttcF9zY2hfc3RhdGljKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0YXNrKGRhdGEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfRU5EKSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLQV9UUkFDRSgyMCwgKCAjZnVuYyAiIGV4aXQ6IFQjJWRcbiIsIGd0aWQpKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCitQQVJBTExFTF9MT09QKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9TVEFUSUMpLCBrbXBfc2NoX3N0YXRpYykKK1BBUkFMTEVMX0xPT1AoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0RZTkFNSUMpLCBrbXBfc2NoX2R5bmFtaWNfY2h1bmtlZCkKK1BBUkFMTEVMX0xPT1AoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0dVSURFRCksIGttcF9zY2hfZ3VpZGVkX2NodW5rZWQpCitQQVJBTExFTF9MT09QKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9SVU5USU1FKSwga21wX3NjaF9ydW50aW1lKQorCisKK3ZvaWQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfVEFTS0dST1VQX1NUQVJUKSh2b2lkKQoreworICAgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgICBNS0xPQyhsb2MsICJHT01QX3Rhc2tncm91cF9zdGFydCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfdGFza2dyb3VwX3N0YXJ0OiBUIyVkXG4iLCBndGlkKSk7CisKKyAgICBfX2ttcGNfdGFza2dyb3VwKCZsb2MsIGd0aWQpOworCisgICAgcmV0dXJuOworfQorCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1RBU0tHUk9VUF9FTkQpKHZvaWQpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworICAgIE1LTE9DKGxvYywgIkdPTVBfdGFza2dyb3VwX2VuZCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfdGFza2dyb3VwX2VuZDogVCMlZFxuIiwgZ3RpZCkpOworCisgICAgX19rbXBjX2VuZF90YXNrZ3JvdXAoJmxvYywgZ3RpZCk7CisKKyAgICByZXR1cm47Cit9CisKKyNpZm5kZWYgS01QX0RFQlVHCitzdGF0aWMKKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KK2ttcF9pbnQzMiBfX2ttcF9nb21wX3RvX29tcF9jYW5jZWxsYXRpb25fa2luZChpbnQgZ29tcF9raW5kKSB7CisgICAga21wX2ludDMyIGNuY2xfa2luZCA9IDA7CisgICAgc3dpdGNoKGdvbXBfa2luZCkgeworICAgICAgY2FzZSAxOgorICAgICAgICBjbmNsX2tpbmQgPSBjYW5jZWxfcGFyYWxsZWw7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyOgorICAgICAgICBjbmNsX2tpbmQgPSBjYW5jZWxfbG9vcDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDQ6CisgICAgICAgIGNuY2xfa2luZCA9IGNhbmNlbF9zZWN0aW9uczsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDg6CisgICAgICAgIGNuY2xfa2luZCA9IGNhbmNlbF90YXNrZ3JvdXA7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gY25jbF9raW5kOworfQorCitib29sCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0NBTkNFTExBVElPTl9QT0lOVCkoaW50IHdoaWNoKQoreworICAgIGlmKF9fa21wX29tcF9jYW5jZWxsYXRpb24pIHsKKyAgICAgICAgS01QX0ZBVEFMKE5vR29tcENhbmNlbGxhdGlvbik7CisgICAgfQorICAgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgICBNS0xPQyhsb2MsICJHT01QX2NhbmNlbGxhdGlvbl9wb2ludCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfY2FuY2VsbGF0aW9uX3BvaW50OiBUIyVkXG4iLCBndGlkKSk7CisKKyAgICBrbXBfaW50MzIgY25jbF9raW5kID0gX19rbXBfZ29tcF90b19vbXBfY2FuY2VsbGF0aW9uX2tpbmQod2hpY2gpOworCisgICAgcmV0dXJuIF9fa21wY19jYW5jZWxsYXRpb25wb2ludCgmbG9jLCBndGlkLCBjbmNsX2tpbmQpOworfQorCitib29sCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0JBUlJJRVJfQ0FOQ0VMKSh2b2lkKQoreworICAgIGlmKF9fa21wX29tcF9jYW5jZWxsYXRpb24pIHsKKyAgICAgICAgS01QX0ZBVEFMKE5vR29tcENhbmNlbGxhdGlvbik7CisgICAgfQorICAgIEtNUF9GQVRBTChOb0dvbXBDYW5jZWxsYXRpb24pOworICAgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgICBNS0xPQyhsb2MsICJHT01QX2JhcnJpZXJfY2FuY2VsIik7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9iYXJyaWVyX2NhbmNlbDogVCMlZFxuIiwgZ3RpZCkpOworCisgICAgcmV0dXJuIF9fa21wY19jYW5jZWxfYmFycmllcigmbG9jLCBndGlkKTsKK30KKworYm9vbAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9DQU5DRUwpKGludCB3aGljaCwgYm9vbCBkb19jYW5jZWwpCit7CisgICAgaWYoX19rbXBfb21wX2NhbmNlbGxhdGlvbikgeworICAgICAgICBLTVBfRkFUQUwoTm9Hb21wQ2FuY2VsbGF0aW9uKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgaW50IGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworICAgIE1LTE9DKGxvYywgIkdPTVBfY2FuY2VsIik7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9jYW5jZWw6IFQjJWRcbiIsIGd0aWQpKTsKKworICAgIGttcF9pbnQzMiBjbmNsX2tpbmQgPSBfX2ttcF9nb21wX3RvX29tcF9jYW5jZWxsYXRpb25fa2luZCh3aGljaCk7CisKKyAgICBpZihkb19jYW5jZWwgPT0gRkFMU0UpIHsKKyAgICAgICAgcmV0dXJuIHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfQ0FOQ0VMTEFUSU9OX1BPSU5UKSh3aGljaCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIF9fa21wY19jYW5jZWwoJmxvYywgZ3RpZCwgY25jbF9raW5kKTsKKyAgICB9Cit9CisKK2Jvb2wKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfU0VDVElPTlNfRU5EX0NBTkNFTCkodm9pZCkKK3sKKyAgICBpZihfX2ttcF9vbXBfY2FuY2VsbGF0aW9uKSB7CisgICAgICAgIEtNUF9GQVRBTChOb0dvbXBDYW5jZWxsYXRpb24pOworICAgIH0KKyAgICBpbnQgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9zZWN0aW9uc19lbmRfY2FuY2VsIik7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9zZWN0aW9uc19lbmRfY2FuY2VsOiBUIyVkXG4iLCBndGlkKSk7CisKKyAgICByZXR1cm4gX19rbXBjX2NhbmNlbF9iYXJyaWVyKCZsb2MsIGd0aWQpOworfQorCitib29sCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRU5EX0NBTkNFTCkodm9pZCkKK3sKKyAgICBpZihfX2ttcF9vbXBfY2FuY2VsbGF0aW9uKSB7CisgICAgICAgIEtNUF9GQVRBTChOb0dvbXBDYW5jZWxsYXRpb24pOworICAgIH0KKyAgICBpbnQgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9sb29wX2VuZF9jYW5jZWwiKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX2xvb3BfZW5kX2NhbmNlbDogVCMlZFxuIiwgZ3RpZCkpOworCisgICAgcmV0dXJuIF9fa21wY19jYW5jZWxfYmFycmllcigmbG9jLCBndGlkKTsKK30KKworLy8gQWxsIHRhcmdldCBmdW5jdGlvbnMgYXJlIGVtcHR5IGFzIG9mIDIwMTQtMDUtMjkKK3ZvaWQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfVEFSR0VUKShpbnQgZGV2aWNlLCB2b2lkICgqZm4pICh2b2lkICopLCBjb25zdCB2b2lkICpvcGVubXBfdGFyZ2V0LAorICAgICAgICAgICAgIHNpemVfdCBtYXBudW0sIHZvaWQgKipob3N0YWRkcnMsIHNpemVfdCAqc2l6ZXMsIHVuc2lnbmVkIGNoYXIgKmtpbmRzKQoreworICAgIHJldHVybjsKK30KKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9UQVJHRVRfREFUQSkoaW50IGRldmljZSwgY29uc3Qgdm9pZCAqb3Blbm1wX3RhcmdldCwgc2l6ZV90IG1hcG51bSwKKyAgICAgICAgICAgICAgICAgIHZvaWQgKipob3N0YWRkcnMsIHNpemVfdCAqc2l6ZXMsIHVuc2lnbmVkIGNoYXIgKmtpbmRzKQoreworICAgIHJldHVybjsKK30KKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9UQVJHRVRfRU5EX0RBVEEpKHZvaWQpCit7CisgICAgcmV0dXJuOworfQorCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1RBUkdFVF9VUERBVEUpKGludCBkZXZpY2UsIGNvbnN0IHZvaWQgKm9wZW5tcF90YXJnZXQsIHNpemVfdCBtYXBudW0sCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKipob3N0YWRkcnMsIHNpemVfdCAqc2l6ZXMsIHVuc2lnbmVkIGNoYXIgKmtpbmRzKQoreworICAgIHJldHVybjsKK30KKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9URUFNUykodW5zaWduZWQgaW50IG51bV90ZWFtcywgdW5zaWduZWQgaW50IHRocmVhZF9saW1pdCkKK3sKKyAgICByZXR1cm47Cit9CisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKworCisvKgorICAgIFRoZSBmb2xsb3dpbmcgc2VjdGlvbnMgb2YgY29kZSBjcmVhdGUgYWxpYXNlcyBmb3IgdGhlIEdPTVBfKiBmdW5jdGlvbnMsCisgICAgdGhlbiBjcmVhdGUgdmVyc2lvbmVkIHN5bWJvbHMgdXNpbmcgdGhlIGFzc2VtYmxlciBkaXJlY3RpdmUgLnN5bXZlci4KKyAgICBUaGlzIGlzIG9ubHkgcGVydGluZW50IGZvciBFTEYgLnNvIGxpYnJhcnkKKyAgICB4YWxpYXNpZnkgYW5kIHh2ZXJzaW9uaWZ5IGFyZSBkZWZpbmVkIGluIGttcF9mdG5fb3MuaAorKi8KKworI2lmZGVmIEtNUF9VU0VfVkVSU0lPTl9TWU1CT0xTCisKKy8vIEdPTVBfMS4wIGFsaWFzZXMKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9BVE9NSUNfRU5ELCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfQVRPTUlDX1NUQVJULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfQkFSUklFUiwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0NSSVRJQ0FMX0VORCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0NSSVRJQ0FMX05BTUVfRU5ELCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfTkFNRV9TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0NSSVRJQ0FMX1NUQVJULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9EWU5BTUlDX05FWFQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX0RZTkFNSUNfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX0VORCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRU5EX05PV0FJVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfR1VJREVEX05FWFQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX0dVSURFRF9TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9EWU5BTUlDX05FWFQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfRFlOQU1JQ19TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9HVUlERURfTkVYVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9HVUlERURfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfUlVOVElNRV9ORVhULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX1JVTlRJTUVfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfU1RBVElDX05FWFQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfU1RBVElDX1NUQVJULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9SVU5USU1FX05FWFQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1JVTlRJTUVfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1NUQVRJQ19ORVhULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9TVEFUSUNfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9PUkRFUkVEX0VORCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX09SREVSRURfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9FTkQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0RZTkFNSUNfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0dVSURFRF9TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfUlVOVElNRV9TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfU1RBVElDX1NUQVJULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfU0VDVElPTlNfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX0VORCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX0VORF9OT1dBSVQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9TRUNUSU9OU19ORVhULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfU0VDVElPTlNfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9TSU5HTEVfQ09QWV9FTkQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9TSU5HTEVfQ09QWV9TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1NJTkdMRV9TVEFSVCwgMTApOworCisvLyBHT01QXzIuMCBhbGlhc2VzCit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfVEFTSywgMjApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1RBU0tXQUlULCAyMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfRFlOQU1JQ19ORVhULCAyMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfRFlOQU1JQ19TVEFSVCwgMjApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX0dVSURFRF9ORVhULCAyMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfR1VJREVEX1NUQVJULCAyMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9EWU5BTUlDX05FWFQsIDIwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX0RZTkFNSUNfU1RBUlQsIDIwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX0dVSURFRF9ORVhULCAyMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9HVUlERURfU1RBUlQsIDIwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX1JVTlRJTUVfTkVYVCwgMjApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfUlVOVElNRV9TVEFSVCwgMjApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfU1RBVElDX05FWFQsIDIwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX1NUQVRJQ19TVEFSVCwgMjApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX1JVTlRJTUVfTkVYVCwgMjApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX1JVTlRJTUVfU1RBUlQsIDIwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9TVEFUSUNfTkVYVCwgMjApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX1NUQVRJQ19TVEFSVCwgMjApOworCisvLyBHT01QXzMuMCBhbGlhc2VzCit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfVEFTS1lJRUxELCAzMCk7CisKKy8vIEdPTVBfNC4wIGFsaWFzZXMKKy8vIFRoZSBHT01QX3BhcmFsbGVsKiBlbnRyeSBwb2ludHMgYmVsb3cgYXJlbid0IE9wZW5NUCA0LjAgcmVsYXRlZC4KKyNpZiBPTVBfNDBfRU5BQkxFRAoreGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMLCA0MCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfU0VDVElPTlMsIDQwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0RZTkFNSUMsIDQwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0dVSURFRCwgNDApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfUlVOVElNRSwgNDApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfU1RBVElDLCA0MCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfVEFTS0dST1VQX1NUQVJULCA0MCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfVEFTS0dST1VQX0VORCwgNDApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0JBUlJJRVJfQ0FOQ0VMLCA0MCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfQ0FOQ0VMLCA0MCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfQ0FOQ0VMTEFUSU9OX1BPSU5ULCA0MCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9FTkRfQ0FOQ0VMLCA0MCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfU0VDVElPTlNfRU5EX0NBTkNFTCwgNDApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1RBUkdFVCwgNDApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1RBUkdFVF9EQVRBLCA0MCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfVEFSR0VUX0VORF9EQVRBLCA0MCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfVEFSR0VUX1VQREFURSwgNDApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1RFQU1TLCA0MCk7CisjZW5kaWYKKworLy8gR09NUF8xLjAgdmVyc2lvbmVkIHN5bWJvbHMKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0FUT01JQ19FTkQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0FUT01JQ19TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfQkFSUklFUiwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfRU5ELCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9DUklUSUNBTF9OQU1FX0VORCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfTkFNRV9TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRFlOQU1JQ19ORVhULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX0RZTkFNSUNfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRU5ELCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX0VORF9OT1dBSVQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfR1VJREVEX05FWFQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfR1VJREVEX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfRFlOQU1JQ19ORVhULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfRFlOQU1JQ19TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX0dVSURFRF9ORVhULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfR1VJREVEX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfUlVOVElNRV9ORVhULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfUlVOVElNRV9TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX1NUQVRJQ19ORVhULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfU1RBVElDX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1JVTlRJTUVfTkVYVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9SVU5USU1FX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1NUQVRJQ19ORVhULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1NUQVRJQ19TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfT1JERVJFRF9FTkQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX09SREVSRURfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0VORCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9EWU5BTUlDX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0dVSURFRF9TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9SVU5USU1FX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX1NUQVRJQ19TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfU0VDVElPTlNfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9TRUNUSU9OU19FTkQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX0VORF9OT1dBSVQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX05FWFQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9TSU5HTEVfQ09QWV9FTkQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1NJTkdMRV9DT1BZX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9TSU5HTEVfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKKworLy8gR09NUF8yLjAgdmVyc2lvbmVkIHN5bWJvbHMKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1RBU0ssIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1RBU0tXQUlULCAyMCwgIkdPTVBfMi4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9EWU5BTUlDX05FWFQsIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX0RZTkFNSUNfU1RBUlQsIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX0dVSURFRF9ORVhULCAyMCwgIkdPTVBfMi4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9HVUlERURfU1RBUlQsIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfRFlOQU1JQ19ORVhULCAyMCwgIkdPTVBfMi4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX0RZTkFNSUNfU1RBUlQsIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfR1VJREVEX05FWFQsIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfR1VJREVEX1NUQVJULCAyMCwgIkdPTVBfMi4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX1JVTlRJTUVfTkVYVCwgMjAsICJHT01QXzIuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9SVU5USU1FX1NUQVJULCAyMCwgIkdPTVBfMi4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX1NUQVRJQ19ORVhULCAyMCwgIkdPTVBfMi4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX1NUQVRJQ19TVEFSVCwgMjAsICJHT01QXzIuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfUlVOVElNRV9ORVhULCAyMCwgIkdPTVBfMi4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9SVU5USU1FX1NUQVJULCAyMCwgIkdPTVBfMi4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9TVEFUSUNfTkVYVCwgMjAsICJHT01QXzIuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfU1RBVElDX1NUQVJULCAyMCwgIkdPTVBfMi4wIik7CisKKy8vIEdPTVBfMy4wIHZlcnNpb25lZCBzeW1ib2xzCit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9UQVNLWUlFTEQsIDMwLCAiR09NUF8zLjAiKTsKKworLy8gR09NUF80LjAgdmVyc2lvbmVkIHN5bWJvbHMKKyNpZiBPTVBfNDBfRU5BQkxFRAoreHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUwsIDQwLCAiR09NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX1NFQ1RJT05TLCA0MCwgIkdPTVBfNC4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0RZTkFNSUMsIDQwLCAiR09NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfR1VJREVELCA0MCwgIkdPTVBfNC4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX1JVTlRJTUUsIDQwLCAiR09NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfU1RBVElDLCA0MCwgIkdPTVBfNC4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9UQVNLR1JPVVBfU1RBUlQsIDQwLCAiR09NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1RBU0tHUk9VUF9FTkQsIDQwLCAiR09NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0JBUlJJRVJfQ0FOQ0VMLCA0MCwgIkdPTVBfNC4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9DQU5DRUwsIDQwLCAiR09NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0NBTkNFTExBVElPTl9QT0lOVCwgNDAsICJHT01QXzQuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9FTkRfQ0FOQ0VMLCA0MCwgIkdPTVBfNC4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9TRUNUSU9OU19FTkRfQ0FOQ0VMLCA0MCwgIkdPTVBfNC4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9UQVJHRVQsIDQwLCAiR09NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1RBUkdFVF9EQVRBLCA0MCwgIkdPTVBfNC4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9UQVJHRVRfRU5EX0RBVEEsIDQwLCAiR09NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1RBUkdFVF9VUERBVEUsIDQwLCAiR09NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1RFQU1TLCA0MCwgIkdPTVBfNC4wIik7CisjZW5kaWYKKworI2VuZGlmIC8vIEtNUF9VU0VfVkVSU0lPTl9TWU1CT0xTCisKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIH0gLy9leHRlcm4gIkMiCisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfaTE4bi5jIGIvZmluYWwvcnVudGltZS9zcmMva21wX2kxOG4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGFkMjU1Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2kxOG4uYwpAQCAtMCwwICsxLDk3NCBAQAorLyoKKyAqIGttcF9pMThuLmMKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKworI2luY2x1ZGUgImttcF9vcy5oIgorI2luY2x1ZGUgImttcF9kZWJ1Zy5oIgorI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9sb2NrLmgiCisjaW5jbHVkZSAia21wX2lvLmgiICAgICAgICAgIC8vIF9fa21wX3ByaW50Zi4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxsb2NhbGUuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2luY2x1ZGUgImttcF9pMThuX2RlZmF1bHQuaW5jIgorI2luY2x1ZGUgImttcF9zdHIuaCIKKyNpbmNsdWRlICJrbXBfZW52aXJvbm1lbnQuaCIKKworI3VuZGVmIEtNUF9JMThOX09LCisKKyNkZWZpbmUgZ2V0X3NlY3Rpb24oIGlkICkgICggKGlkKSA+PiAxNiApCisjZGVmaW5lIGdldF9udW1iZXIoIGlkICkgICAoIChpZCkgJiAweEZGRkYgKQorCitrbXBfbXNnX3QgICAgICAgICAgIF9fa21wX21zZ19lbXB0eSA9IHsga21wX210X2R1bW15LCAwLCAiIiwgMCAgfTsKK2ttcF9tc2dfdCAgICAgICAgICAgX19rbXBfbXNnX251bGwgID0geyBrbXBfbXRfZHVtbXksIDAsIE5VTEwsIDAgfTsKK3N0YXRpYyBjaGFyIGNvbnN0ICogbm9fbWVzc2FnZV9hdmFpbGFibGUgPSAiKE5vIG1lc3NhZ2UgYXZhaWxhYmxlKSI7CisKK2VudW0ga21wX2kxOG5fY2F0X3N0YXR1cyB7CisgICAgS01QX0kxOE5fQ0xPU0VELCAgICAvLyBOb3QgeWV0IG9wZW5lZCBvciBjbG9zZWQuCisgICAgS01QX0kxOE5fT1BFTkVELCAgICAvLyBPcGVuZWQgc3VjY2Vzc2Z1bGx5LCByZWFkeSB0byB1c2UuCisgICAgS01QX0kxOE5fQUJTRU5UICAgICAvLyBPcGVuaW5nIGZhaWxlZCwgbWVzc2FnZSBjYXRhbG9nIHNob3VsZCBub3QgYmUgdXNlZC4KK307IC8vIGVudW0ga21wX2kxOG5fY2F0X3N0YXR1cwordHlwZWRlZiBlbnVtIGttcF9pMThuX2NhdF9zdGF0dXMgIGttcF9pMThuX2NhdF9zdGF0dXNfdDsKK3N0YXRpYyB2b2xhdGlsZSBrbXBfaTE4bl9jYXRfc3RhdHVzX3QgIHN0YXR1cyA9IEtNUF9JMThOX0NMT1NFRDsKKworLyoKKyAgICBNZXNzYWdlIGNhdGFsb2cgaXMgb3BlbmVkIGF0IGZpcnN0IHVzYWdlLCBzbyB3ZSBoYXZlIHRvIHN5bmNocm9uaXplIG9wZW5pbmcgdG8gYXZvaWQgcmFjZSBhbmQKKyAgICBtdWx0aXBsZSBvcGVuaW5ncy4KKworICAgIENsb3NpbmcgZG9lcyBub3QgcmVxdWlyZSBzeW5jaHJvbml6YXRpb24sIGJlY2F1c2UgY2F0YWxvZyBpcyBjbG9zZWQgdmVyeSBsYXRlIGF0IGxpYnJhcnkKKyAgICBzaHV0dGluZyBkb3duLCB3aGVuIG5vIG90aGVyIHRocmVhZHMgYXJlIGFsaXZlLgorKi8KKworc3RhdGljIHZvaWQgX19rbXBfaTE4bl9kb19jYXRvcGVuKCk7CitzdGF0aWMga21wX2Jvb3RzdHJhcF9sb2NrX3QgIGxvY2sgPSBLTVBfQk9PVFNUUkFQX0xPQ0tfSU5JVElBTElaRVIoIGxvY2sgKTsKKyAgICAvLyBgbG9jaycgdmFyaWFibGUgbWF5IGJlIHBsYWNlZCBpbnRvIF9fa21wX2kxOG5fY2F0b3BlbiBmdW5jdGlvbiBiZWNhdXNlIGl0IGlzIHVzZWQgb25seSBieQorICAgIC8vIHRoYXQgZnVuY3Rpb24uIEJ1dCB3ZSBhZnJhaWQgYSAoYnVnZ3kpIGNvbXBpbGVyIG1heSB0cmVhdCBpdCB3cm9uZ2x5LiBTbyB3ZSBwdXQgaXQgb3V0c2lkZSBvZgorICAgIC8vIGZ1bmN0aW9uIGp1c3QgaW4gY2FzZS4KKwordm9pZAorX19rbXBfaTE4bl9jYXRvcGVuKAorKSB7CisgICAgaWYgKCBzdGF0dXMgPT0gS01QX0kxOE5fQ0xPU0VEICkgeworICAgICAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIGxvY2sgKTsKKyAgICAgICAgaWYgKCBzdGF0dXMgPT0gS01QX0kxOE5fQ0xPU0VEICkgeworICAgICAgICAgICAgX19rbXBfaTE4bl9kb19jYXRvcGVuKCk7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgbG9jayApOworICAgIH07IC8vIGlmCit9IC8vIGZ1bmMgX19rbXBfaTE4bl9jYXRvcGVuCisKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBMaW51eCogT1MgYW5kIE9TIFgqIHBhcnQuCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisjaWYgS01QX09TX1VOSVgKKyNkZWZpbmUgS01QX0kxOE5fT0sKKworI2luY2x1ZGUgPG5sX3R5cGVzLmg+CisKKyNkZWZpbmUgS01QX0kxOE5fTlVMTENBVCAoKG5sX2NhdGQpKCAtMSApKQorc3RhdGljIG5sX2NhdGQgICAgICAgY2F0ICA9IEtNUF9JMThOX05VTExDQVQ7ICAgIC8vICEhISBTaGFsbCBpdCBiZSB2b2xhdGlsZT8KK3N0YXRpYyBjaGFyIGNvbnN0ICogIG5hbWUgPSAoIEtNUF9WRVJTSU9OX01BSk9SID09IDQgPyAibGliZ3VpZGUuY2F0IiA6ICJsaWJvbXAuY2F0IiApOworCisvKgorICAgIFVzZWZ1bCBsaW5rczoKKyAgICAgICAgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDAwMDk1Mzk5L2Jhc2VkZWZzL3hiZF9jaGFwMDguaHRtbCN0YWdfMDhfMDIKKyAgICAgICAgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDAwMDk1Mzk5L2Z1bmN0aW9ucy9jYXRvcGVuLmh0bWwKKyAgICAgICAgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDAwMDk1Mzk5L2Z1bmN0aW9ucy9zZXRsb2NhbGUuaHRtbAorKi8KKwordm9pZAorX19rbXBfaTE4bl9kb19jYXRvcGVuKAorKSB7CisgICAgaW50ICAgIGVuZ2xpc2ggPSAwOworICAgIGNoYXIgKiBsYW5nICAgID0gX19rbXBfZW52X2dldCggIkxBTkciICk7CisgICAgLy8gVE9ETzogV2hhdCBhYm91dCBMQ19BTEwgb3IgTENfTUVTU0FHRVM/CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzdGF0dXMgPT0gS01QX0kxOE5fQ0xPU0VEICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggY2F0ICAgID09IEtNUF9JMThOX05VTExDQVQgKTsKKworICAgIGVuZ2xpc2ggPQorCWxhbmcgPT0gTlVMTCAgICAgICAgICAgICAgICAgICAgICAgfHwgIC8vIEluIGFsbCB0aGVzZSBjYXNlcyBFbmdsaXNoIGxhbmd1YWdlIGlzIHVzZWQuCisJc3RyY21wKCBsYW5nLCAiIiApICAgICAgICAgICAgPT0gMCB8fAorICAgICAgICBzdHJjbXAoIGxhbmcsICIgIiApICAgICAgICAgICA9PSAwIHx8CisgICAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIEZvcnRyYW4gUlRMIGJ1ZyBEUEQyMDAxMzc4NzMgIkZvcnRyYW4gcnVudGltZSByZXNldHMgTEFORyBlbnYgdmFyCisgICAgICAgICAgICAgIC8vIHRvIHNwYWNlIGlmIGl0IGlzIG5vdCBzZXQiLgorCXN0cmNtcCggbGFuZywgIkMiICkgICAgICAgICAgID09IDAgfHwKKwlzdHJjbXAoIGxhbmcsICJQT1NJWCIgKSAgICAgICA9PSAwOworCisgICAgaWYgKCAhIGVuZ2xpc2ggKSB7ICAvLyBFbmdsaXNoIGxhbmd1YWdlIGlzIG5vdCB5ZXQgZGV0ZWN0ZWQsIGxldCB1cyBjb250aW51ZS4KKyAgICAgICAgLy8gRm9ybWF0IG9mIExBTkcgaXM6IFtsYW5ndWFnZVtfdGVycml0b3J5XVsuY29kZXNldF1bQG1vZGlmaWVyXV0KKyAgICAgICAgLy8gU3RyaXAgYWxsIHBhcnRzIGV4Y2VwdCBsYW5ndWFnZS4KKyAgICAgICAgY2hhciAqIHRhaWwgPSBOVUxMOworICAgICAgICBfX2ttcF9zdHJfc3BsaXQoIGxhbmcsICdAJywgJiBsYW5nLCAmIHRhaWwgKTsKKyAgICAgICAgX19rbXBfc3RyX3NwbGl0KCBsYW5nLCAnLicsICYgbGFuZywgJiB0YWlsICk7CisgICAgICAgIF9fa21wX3N0cl9zcGxpdCggbGFuZywgJ18nLCAmIGxhbmcsICYgdGFpbCApOworICAgICAgICBlbmdsaXNoID0gKCBzdHJjbXAoIGxhbmcsICJlbiIgKSA9PSAwICk7CisgICAgfTsgLy8gaWYKKworICAgIEtNUF9JTlRFUk5BTF9GUkVFKCBsYW5nICk7CisKKyAgICAvLyBEbyBub3QgdHJ5IHRvIG9wZW4gRW5nbGlzaCBjYXRhbG9nIGJlY2F1c2UgaW50ZXJuYWwgbWVzc2FnZXMgYXJlCisgICAgLy8gZXhhY3QgY29weSBvZiBtZXNzYWdlcyBpbiBFbmdsaXNoIGNhdGFsb2cuCisgICAgaWYgKCBlbmdsaXNoICkgeworCXN0YXR1cyA9IEtNUF9JMThOX0FCU0VOVDsgIC8vIG1hcmsgY2F0YWxvZyBhcyBhYnNlbnQgc28gaXQgd2lsbCBub3QgYmUgcmUtb3BlbmVkLgorCXJldHVybjsKKyAgICB9CisKKyAgICBjYXQgPSBjYXRvcGVuKCBuYW1lLCAwICk7CisgICAgLy8gVE9ETzogV2h5IGRvIHdlIHBhc3MgMCBpbiBmbGFncz8KKyAgICBzdGF0dXMgPSAoIGNhdCA9PSBLTVBfSTE4Tl9OVUxMQ0FUID8gS01QX0kxOE5fQUJTRU5UIDogS01QX0kxOE5fT1BFTkVEICk7CisKKyAgICBpZiAoIHN0YXR1cyA9PSBLTVBfSTE4Tl9BQlNFTlQgKSB7CisgICAgICBpZiAoX19rbXBfZ2VuZXJhdGVfd2FybmluZ3MgPiBrbXBfd2FybmluZ3NfbG93KSB7IC8vIEFDOiBvbmx5IGlzc3VlIHdhcm5pbmcgaW4gY2FzZSBleHBsaWNpdGx5IGFza2VkIHRvCisgICAgICAgIGludCAgICBlcnJvciAgID0gZXJybm87IC8vIFNhdmUgZXJybm8gaW1tZWRpYXRlbHkuCisJY2hhciAqIG5sc3BhdGggPSBfX2ttcF9lbnZfZ2V0KCAiTkxTUEFUSCIgKTsKKyAgICAgICAgY2hhciAqIGxhbmcgICAgPSBfX2ttcF9lbnZfZ2V0KCAiTEFORyIgKTsKKworCS8vIEluZmluaXRlIHJlY3Vyc2lvbiB3aWxsIG5vdCBvY2N1ciAtLSBzdGF0dXMgaXMgS01QX0kxOE5fQUJTRU5UIG5vdywgc28KKwkvLyBfX2ttcF9pMThuX2NhdGdldHMoKSB3aWxsIG5vdCB0cnkgdG8gb3BlbiBjYXRhbG9nLCBidXQgd2lsbCByZXR1cm4gZGVmYXVsdCBtZXNzYWdlLgorCV9fa21wX21zZygKKwkgICAga21wX21zX3dhcm5pbmcsCisJICAgIEtNUF9NU0coIENhbnRPcGVuTWVzc2FnZUNhdGFsb2csIG5hbWUgKSwKKwkgICAgS01QX0VSUiggZXJyb3IgKSwKKwkgICAgS01QX0hOVCggQ2hlY2tFbnZWYXIsICJOTFNQQVRIIiwgbmxzcGF0aCApLAorICAgICAgICAgICAgS01QX0hOVCggQ2hlY2tFbnZWYXIsICJMQU5HIiwgbGFuZyApLAorCSAgICBfX2ttcF9tc2dfbnVsbAorCSk7CisJS01QX0lORk9STSggV2lsbFVzZURlZmF1bHRNZXNzYWdlcyApOworICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSggbmxzcGF0aCApOworICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSggbGFuZyApOworICAgICAgfQorICAgIH0gZWxzZSB7IC8vIHN0YXR1cyA9PSBLTVBfSTE4Tl9PUEVORUQKKworICAgICAgICBpbnQgc2VjdGlvbiA9IGdldF9zZWN0aW9uKCBrbXBfaTE4bl9wcnBfVmVyc2lvbiApOworICAgICAgICBpbnQgbnVtYmVyICA9IGdldF9udW1iZXIoIGttcF9pMThuX3BycF9WZXJzaW9uICk7CisgICAgICAgIGNoYXIgY29uc3QgKiBleHBlY3RlZCA9IF9fa21wX2kxOG5fZGVmYXVsdF90YWJsZS5zZWN0WyBzZWN0aW9uIF0uc3RyWyBudW1iZXIgXTsKKyAgICAgICAgICAgIC8vIEV4cGVjdGVkIHZlcnNpb24gb2YgdGhlIGNhdGFsb2cuCisgICAgICAgIGttcF9zdHJfYnVmX3QgdmVyc2lvbjsgICAvLyBBY3R1YWwgdmVyc2lvbiBvZiB0aGUgY2F0YWxvZy4KKyAgICAgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmIHZlcnNpb24gKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiB2ZXJzaW9uLCAiJXMiLCBjYXRnZXRzKCBjYXQsIHNlY3Rpb24sIG51bWJlciwgTlVMTCApICk7CisKKyAgICAgICAgICAgIC8vIFN0cmluZyByZXR1cm5lZCBieSBjYXRnZXRzIGlzIGludmFsaWQgYWZ0ZXIgY2xvc2luZyB0aGUgY2F0YWxvZywgc28gY29weSBpdC4KKyAgICAgICAgaWYgKCBzdHJjbXAoIHZlcnNpb24uc3RyLCBleHBlY3RlZCApICE9IDAgKSB7CisgICAgICAgICAgICBfX2ttcF9pMThuX2NhdGNsb3NlKCk7ICAgICAvLyBDbG9zZSBiYWQgY2F0YWxvZy4KKyAgICAgICAgICAgIHN0YXR1cyA9IEtNUF9JMThOX0FCU0VOVDsgIC8vIEFuZCBtYXJrIGl0IGFzIGFic2VudC4KKyAgICAgICAgICAgIGlmIChfX2ttcF9nZW5lcmF0ZV93YXJuaW5ncyA+IGttcF93YXJuaW5nc19sb3cpIHsgLy8gQUM6IG9ubHkgaXNzdWUgd2FybmluZyBpbiBjYXNlIGV4cGxpY2l0bHkgYXNrZWQgdG8KKyAgICAgICAgICAgICAgICAvLyBBbmQgbm93IHByaW50IGEgd2FybmluZyB1c2luZyBkZWZhdWx0IG1lc3NhZ2VzLgorICAgICAgICAgICAgICAgIGNoYXIgY29uc3QgKiBuYW1lICAgID0gIk5MU1BBVEgiOworICAgICAgICAgICAgICAgIGNoYXIgY29uc3QgKiBubHNwYXRoID0gX19rbXBfZW52X2dldCggbmFtZSApOworICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAga21wX21zX3dhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIFdyb25nTWVzc2FnZUNhdGFsb2csIG5hbWUsIHZlcnNpb24uc3RyLCBleHBlY3RlZCApLAorICAgICAgICAgICAgICAgICAgICBLTVBfSE5UKCBDaGVja0VudlZhciwgbmFtZSwgbmxzcGF0aCApLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgS01QX0lORk9STSggV2lsbFVzZURlZmF1bHRNZXNzYWdlcyApOworICAgICAgICAgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSBubHNwYXRoICk7CisgICAgICAgICAgICB9IC8vIF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzCisgICAgICAgIH07IC8vIGlmCisgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSggJiB2ZXJzaW9uICk7CisKKyAgICB9OyAvLyBpZgorCit9IC8vIGZ1bmMgX19rbXBfaTE4bl9kb19jYXRvcGVuCisKKwordm9pZAorX19rbXBfaTE4bl9jYXRjbG9zZSgKKykgeworICAgIGlmICggc3RhdHVzID09IEtNUF9JMThOX09QRU5FRCApIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggY2F0ICE9IEtNUF9JMThOX05VTExDQVQgKTsKKyAgICAgICAgY2F0Y2xvc2UoIGNhdCApOworICAgICAgICBjYXQgPSBLTVBfSTE4Tl9OVUxMQ0FUOworICAgIH07IC8vIGlmCisgICAgc3RhdHVzID0gS01QX0kxOE5fQ0xPU0VEOworfSAvLyBmdW5jIF9fa21wX2kxOG5fY2F0Y2xvc2UKKworCitjaGFyIGNvbnN0ICoKK19fa21wX2kxOG5fY2F0Z2V0cygKKyAgICBrbXBfaTE4bl9pZF90ICBpZAorKSB7CisKKyAgICBpbnQgc2VjdGlvbiA9IGdldF9zZWN0aW9uKCBpZCApOworICAgIGludCBudW1iZXIgID0gZ2V0X251bWJlciggaWQgKTsKKyAgICBjaGFyIGNvbnN0ICogbWVzc2FnZSA9IE5VTEw7CisKKyAgICBpZiAoIDEgPD0gc2VjdGlvbiAmJiBzZWN0aW9uIDw9IF9fa21wX2kxOG5fZGVmYXVsdF90YWJsZS5zaXplICkgeworICAgICAgICBpZiAoIDEgPD0gbnVtYmVyICYmIG51bWJlciA8PSBfX2ttcF9pMThuX2RlZmF1bHRfdGFibGUuc2VjdFsgc2VjdGlvbiBdLnNpemUgKSB7CisgICAgICAgICAgICBpZiAoIHN0YXR1cyA9PSBLTVBfSTE4Tl9DTE9TRUQgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfaTE4bl9jYXRvcGVuKCk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgaWYgKCBzdGF0dXMgPT0gS01QX0kxOE5fT1BFTkVEICkgeworICAgICAgICAgICAgICAgIG1lc3NhZ2UgPQorICAgICAgICAgICAgICAgICAgICBjYXRnZXRzKAorICAgICAgICAgICAgICAgICAgICAgICAgY2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiwgbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfaTE4bl9kZWZhdWx0X3RhYmxlLnNlY3RbIHNlY3Rpb24gXS5zdHJbIG51bWJlciBdCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgaWYgKCBtZXNzYWdlID09IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgbWVzc2FnZSA9IF9fa21wX2kxOG5fZGVmYXVsdF90YWJsZS5zZWN0WyBzZWN0aW9uIF0uc3RyWyBudW1iZXIgXTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gaWYKKyAgICBpZiAoIG1lc3NhZ2UgPT0gTlVMTCApIHsKKyAgICAgICAgbWVzc2FnZSA9IG5vX21lc3NhZ2VfYXZhaWxhYmxlOworICAgIH07IC8vIGlmCisgICAgcmV0dXJuIG1lc3NhZ2U7CisKK30gLy8gZnVuYyBfX2ttcF9pMThuX2NhdGdldHMKKworCisjZW5kaWYgLy8gS01QX09TX1VOSVgKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBXaW5kb3dzKiBPUyBwYXJ0LgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworI2lmIEtNUF9PU19XSU5ET1dTCisjZGVmaW5lIEtNUF9JMThOX09LCisKKyNpbmNsdWRlICJrbXBfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKyNkZWZpbmUgS01QX0kxOE5fTlVMTENBVCAgTlVMTAorc3RhdGljIEhNT0RVTEUgICAgICAgY2F0ICA9IEtNUF9JMThOX05VTExDQVQ7ICAgIC8vICEhISBTaGFsbCBpdCBiZSB2b2xhdGlsZT8KK3N0YXRpYyBjaGFyIGNvbnN0ICogIG5hbWUgPSAoIEtNUF9WRVJTSU9OX01BSk9SID09IDQgPyAibGliZ3VpZGU0MHVpLmRsbCIgOiAibGlib21wdWkuZGxsIiApOworCitzdGF0aWMga21wX2kxOG5fdGFibGVfdCAgdGFibGUgICAgICAgICAgICAgPSB7IDAsIE5VTEwgfTsKKyAgICAvLyBNZXNzYWdlcyBmb3JtYXR0ZWQgYnkgRm9ybWF0TWVzc2FnZSgpIHNob3VsZCBiZSBmcmVlZCwgYnV0IGNhdGdldHMoKSBpbnRlcmZhY2UgYXNzdW1lcworICAgIC8vIHVzZXIgd2lsbCBub3QgZnJlZSBtZXNzYWdlcy4gU28gd2UgY2FjaGUgYWxsIHRoZSByZXRyaWV2ZWQgbWVzc2FnZXMgaW4gdGhlIHRhYmxlLCB3aGljaAorICAgIC8vIGFyZSBmcmVlZCBhdCBjYXRjbG9zZSgpLgorc3RhdGljIFVJTlQgY29uc3QgICAgICAgIGRlZmF1bHRfY29kZV9wYWdlID0gQ1BfT0VNQ1A7CitzdGF0aWMgVUlOVCAgICAgICAgICAgICAgY29kZV9wYWdlICAgICAgICAgPSBkZWZhdWx0X2NvZGVfcGFnZTsKKworc3RhdGljIGNoYXIgY29uc3QgKiBfX19jYXRnZXRzKCBrbXBfaTE4bl9pZF90ICBpZCApOworc3RhdGljIFVJTlQgICAgICAgICBnZXRfY29kZV9wYWdlKCk7CitzdGF0aWMgdm9pZCAgICAgICAgIGttcF9pMThuX3RhYmxlX2ZyZWUoIGttcF9pMThuX3RhYmxlX3QgKiB0YWJsZSApOworCisKK3N0YXRpYyBVSU5UCitnZXRfY29kZV9wYWdlKAorKSB7CisKKyAgICBVSU5UIGNwID0gZGVmYXVsdF9jb2RlX3BhZ2U7CisgICAgY2hhciBjb25zdCAqIHZhbHVlID0gX19rbXBfZW52X2dldCggIktNUF9DT0RFUEFHRSIgKTsKKyAgICBpZiAoIHZhbHVlICE9IE5VTEwgKSB7CisgICAgICAgIGlmICggX3N0cmljbXAoIHZhbHVlLCAiQU5TSSIgKSA9PSAwICkgeworICAgICAgICAgICAgY3AgPSBDUF9BQ1A7CisgICAgICAgIH0gZWxzZSBpZiAoIF9zdHJpY21wKCB2YWx1ZSwgIk9FTSIgKSA9PSAwICkgeworICAgICAgICAgICAgY3AgPSBDUF9PRU1DUDsKKyAgICAgICAgfSBlbHNlIGlmICggX3N0cmljbXAoIHZhbHVlLCAiVVRGLTgiICkgPT0gMCB8fCBfc3RyaWNtcCggdmFsdWUsICJVVEY4IiApID09IDAgKSB7CisgICAgICAgICAgICBjcCA9IENQX1VURjg7CisgICAgICAgIH0gZWxzZSBpZiAoIF9zdHJpY21wKCB2YWx1ZSwgIlVURi03IiApID09IDAgfHwgX3N0cmljbXAoIHZhbHVlLCAiVVRGNyIgKSA9PSAwICkgeworICAgICAgICAgICAgY3AgPSBDUF9VVEY3OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gISEhIFRPRE86IElzc3VlIGEgd2FybmluZz8KKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBpZgorICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSB2YWx1ZSApOworICAgIHJldHVybiBjcDsKKworfSAvLyBmdW5jIGdldF9jb2RlX3BhZ2UKKworCitzdGF0aWMgdm9pZAora21wX2kxOG5fdGFibGVfZnJlZSgKKyAgICBrbXBfaTE4bl90YWJsZV90ICogdGFibGUKKykgeworICAgIGludCBzOworICAgIGludCBtOworICAgIGZvciAoIHMgPSAwOyBzIDwgdGFibGUtPnNpemU7ICsrIHMgKSB7CisgICAgICAgIGZvciAoIG0gPSAwOyBtIDwgdGFibGUtPnNlY3RbIHMgXS5zaXplOyArKyBtICkgeworICAgICAgICAgICAgLy8gRnJlZSBtZXNzYWdlLgorICAgICAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopIHRhYmxlLT5zZWN0WyBzIF0uc3RyWyBtIF0gKTsKKyAgICAgICAgICAgIHRhYmxlLT5zZWN0WyBzIF0uc3RyWyBtIF0gPSBOVUxMOworICAgICAgICB9OyAvLyBmb3IgbQorICAgICAgICB0YWJsZS0+c2VjdFsgcyBdLnNpemUgPSAwOworICAgICAgICAvLyBGcmVlIHNlY3Rpb24gaXRzZWxmLgorICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSAoICh2b2lkICopIHRhYmxlLT5zZWN0WyBzIF0uc3RyICk7CisgICAgICAgIHRhYmxlLT5zZWN0WyBzIF0uc3RyID0gTlVMTDsKKyAgICB9OyAvLyBmb3IgcworICAgIHRhYmxlLT5zaXplID0gMDsKKyAgICBLTVBfSU5URVJOQUxfRlJFRSggKHZvaWQgKikgdGFibGUtPnNlY3QgKTsKKyAgICB0YWJsZS0+c2VjdCA9IE5VTEw7Cit9IC8vIGttcF9pOG5fdGFibGVfZnJlZQorCisKK3ZvaWQKK19fa21wX2kxOG5fZG9fY2F0b3BlbigKKykgeworCisgICAgTENJRCAgICAgICAgICBsb2NhbGVfaWQgPSBHZXRUaHJlYWRMb2NhbGUoKTsKKyAgICBXT1JEIAkgIGxhbmdfaWQgPSBMQU5HSURGUk9NTENJRCggbG9jYWxlX2lkICk7CisgICAgV09SRCAgICAgICAgICBwcmltYXJ5X2xhbmdfaWQgPSBQUklNQVJZTEFOR0lEKCBsYW5nX2lkICk7CisgICAga21wX3N0cl9idWZfdCBwYXRoOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggc3RhdHVzID09IEtNUF9JMThOX0NMT1NFRCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIGNhdCAgICA9PSBLTVBfSTE4Tl9OVUxMQ0FUICk7CisKKyAgICBfX2ttcF9zdHJfYnVmX2luaXQoICYgcGF0aCApOworCisgICAgLy8gRG8gbm90IHRyeSB0byBvcGVuIEVuZ2xpc2ggY2F0YWxvZyBiZWNhdXNlIGludGVybmFsIG1lc3NhZ2VzIGFyZQorICAgIC8vIGV4YWN0IGNvcHkgb2YgbWVzc2FnZXMgaW4gRW5nbGlzaCBjYXRhbG9nLgorICAgIGlmICggcHJpbWFyeV9sYW5nX2lkID09IExBTkdfRU5HTElTSCApIHsKKwlzdGF0dXMgPSBLTVBfSTE4Tl9BQlNFTlQ7ICAvLyBtYXJrIGNhdGFsb2cgYXMgYWJzZW50IHNvIGl0IHdpbGwgbm90IGJlIHJlLW9wZW5lZC4KKwlnb3RvIGVuZDsKKyAgICB9OyAvLyBpZgorCisgICAgLy8gQ29uc3RydWN0IHJlc291cmNlIERMTCBuYW1lLgorICAgIC8qCisgICAgICAgIFNpbXBsZQorICAgICAgICAgICAgTG9hZExpYnJhcnkoIG5hbWUgKQorICAgICAgICBpcyBub3Qgc3VpdGFibGUgZHVlIHRvIHNlY3VyaXR5IGlzc3VlIChzZWUKKyAgICAgICAgaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3RlY2huZXQvc2VjdXJpdHkvYWR2aXNvcnkvMjI2OTYzNy5tc3B4KS4gV2UgaGF2ZSB0byBzcGVjaWZ5IGZ1bGwKKyAgICAgICAgcGF0aCB0byB0aGUgbWVzc2FnZSBjYXRhbG9nLgorICAgICovCisgICAgeworCisgICAgICAgIC8vIEdldCBoYW5kbGUgb2Ygb3VyIERMTCBmaXJzdC4KKyAgICAgICAgSE1PRFVMRSBoYW5kbGU7CisgICAgICAgIEJPT0wgYnJjID0KKyAgICAgICAgICAgIEdldE1vZHVsZUhhbmRsZUV4KAorICAgICAgICAgICAgICAgIEdFVF9NT0RVTEVfSEFORExFX0VYX0ZMQUdfRlJPTV9BRERSRVNTIHwgR0VUX01PRFVMRV9IQU5ETEVfRVhfRkxBR19VTkNIQU5HRURfUkVGQ09VTlQsCisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDwgTFBDU1RSID4oICYgX19rbXBfaTE4bl9kb19jYXRvcGVuICksCisgICAgICAgICAgICAgICAgJiBoYW5kbGUKKyAgICAgICAgICAgICk7CisgICAgICAgIGlmICggISBicmMgKSB7ICAgIC8vIEVycm9yIG9jY3VycmVkLgorICAgICAgICAgICAgc3RhdHVzID0gS01QX0kxOE5fQUJTRU5UOyAgLy8gbWFyayBjYXRhbG9nIGFzIGFic2VudCBzbyBpdCB3aWxsIG5vdCBiZSByZS1vcGVuZWQuCisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIC8vIFRPRE86IEVuYWJsZSBtdWx0aXBsZSBtZXNzYWdlcyAoS01QX01TRykgdG8gYmUgcGFzc2VkIHRvIF9fa21wX21zZzsgYW5kIHByaW50CisgICAgICAgICAgICAvLyBhIHByb3BlciB3YXJuaW5nLgorICAgICAgICB9OyAvLyBpZgorCisgICAgICAgIC8vIE5vdyBnZXQgcGF0aCB0byB0aGUgb3VyIERMTC4KKyAgICAgICAgZm9yICggOyA7ICkgeworICAgICAgICAgICAgRFdPUkQgZHJjID0gR2V0TW9kdWxlRmlsZU5hbWUoIGhhbmRsZSwgcGF0aC5zdHIsIHBhdGguc2l6ZSApOworICAgICAgICAgICAgaWYgKCBkcmMgPT0gMCApIHsgICAgLy8gRXJyb3Igb2NjdXJyZWQuCisgICAgICAgICAgICAgICAgc3RhdHVzID0gS01QX0kxOE5fQUJTRU5UOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIGlmICggZHJjIDwgcGF0aC5zaXplICkgeworICAgICAgICAgICAgICAgIHBhdGgudXNlZCA9IGRyYzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3Jlc2VydmUoICYgcGF0aCwgcGF0aC5zaXplICogMiApOworICAgICAgICB9OyAvLyBmb3JldmVyCisKKyAgICAgICAgLy8gTm93IGNvbnN0cnVjdCB0aGUgbmFtZSBvZiBtZXNzYWdlIGNhdGFsb2cuCisgICAgICAgIGttcF9zdHJfZm5hbWUgZm5hbWU7CisgICAgICAgIF9fa21wX3N0cl9mbmFtZV9pbml0KCAmIGZuYW1lLCBwYXRoLnN0ciApOworICAgICAgICBfX2ttcF9zdHJfYnVmX2NsZWFyKCAmIHBhdGggKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBwYXRoLCAiJXMlbHUvJXMiLCBmbmFtZS5kaXIsICh1bnNpZ25lZCBsb25nKSggbG9jYWxlX2lkICksIG5hbWUgKTsKKyAgICAgICAgX19rbXBfc3RyX2ZuYW1lX2ZyZWUoICYgZm5hbWUgKTsKKworICAgIH0KKworICAgIC8vIEZvciBzZWN1cml0eSByZWFzb25zLCB1c2UgTG9hZExpYnJhcnlFeCgpIGFuZCBsb2FkIG1lc3NhZ2UgY2F0YWxvZyBhcyBhIGRhdGEgZmlsZS4KKyAgICBjYXQgPSBMb2FkTGlicmFyeUV4KCBwYXRoLnN0ciwgTlVMTCwgTE9BRF9MSUJSQVJZX0FTX0RBVEFGSUxFICk7CisgICAgc3RhdHVzID0gKCBjYXQgPT0gS01QX0kxOE5fTlVMTENBVCA/IEtNUF9JMThOX0FCU0VOVCA6IEtNUF9JMThOX09QRU5FRCApOworCisgICAgaWYgKCBzdGF0dXMgPT0gS01QX0kxOE5fQUJTRU5UICkgeworICAgICAgaWYgKF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzID4ga21wX3dhcm5pbmdzX2xvdykgeyAvLyBBQzogb25seSBpc3N1ZSB3YXJuaW5nIGluIGNhc2UgZXhwbGljaXRseSBhc2tlZCB0bworCURXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisJLy8gSW5maW5pdGUgcmVjdXJzaW9uIHdpbGwgbm90IG9jY3VyIC0tIHN0YXR1cyBpcyBLTVBfSTE4Tl9BQlNFTlQgbm93LCBzbworCS8vIF9fa21wX2kxOG5fY2F0Z2V0cygpIHdpbGwgbm90IHRyeSB0byBvcGVuIGNhdGFsb2cgYnV0IHdpbGwgcmV0dXJuIGRlZmF1bHQgbWVzc2FnZS4KKyAgICAgICAgLyoKKyAgICAgICAgIElmIG1lc3NhZ2UgY2F0YWxvZyBmb3IgYW5vdGhlciBhcmNoaXRlY3R1cmUgZm91bmQgKGUuZy4gT3Blbk1QIFJUTAorCSBmb3IgSUEtMzIgYXJjaGl0ZWN0dXJlIG9wZW5zIGxpYm9tcHVpLmRsbCBmb3IgSW50ZWwoUikgNjQpCisJIFdpbmRvd3MqIE9TIHJldHVybnMgZXJyb3IgMTkzIChFUlJPUl9CQURfRVhFX0ZPUk1BVCkuIEhvd2V2ZXIsCisgICAgICAgICBGb3JtYXRNZXNzYWdlIGZhaWxzIHRvIHJldHVybiBhIG1lc3NhZ2UgZm9yIHRoaXMgZXJyb3IsIHNvIHVzZXIKKwkgd2lsbCBzZWU6CisKKyAgICAgICAgIE9NUDogV2FybmluZyAjMjogQ2Fubm90IG9wZW4gbWVzc2FnZSBjYXRhbG9nICIxMDQxXGxpYm9tcHVpLmRsbCI6CisgICAgICAgICBPTVA6IFN5c3RlbSBlcnJvciAjMTkzOiAoTm8gc3lzdGVtIGVycm9yIG1lc3NhZ2UgYXZhaWxhYmxlKQorICAgICAgICAgT01QOiBJbmZvICMzOiBEZWZhdWx0IG1lc3NhZ2VzIHdpbGwgYmUgdXNlZC4KKworICAgICAgICAgSXNzdWUgYSBoaW50IGluIHRoaXMgY2FzZSB0byBsZXQgY2F1c2Ugb2YgdHJvdWJsZSBtb3JlIHVuZGVyc3RhbmRhYmxlLgorICAgICAgICAqLworCV9fa21wX21zZygKKwkgICAga21wX21zX3dhcm5pbmcsCisJICAgIEtNUF9NU0coIENhbnRPcGVuTWVzc2FnZUNhdGFsb2csIHBhdGguc3RyICksCisJICAgIEtNUF9TWVNFUlJDT0RFKCBlcnJvciApLAorICAgICAgICAgICAgKCBlcnJvciA9PSBFUlJPUl9CQURfRVhFX0ZPUk1BVCA/IEtNUF9ITlQoIEJhZEV4ZUZvcm1hdCwgcGF0aC5zdHIsIEtNUF9BUkNIX1NUUiApIDogX19rbXBfbXNnX251bGwgKSwKKwkgICAgX19rbXBfbXNnX251bGwKKwkpOworCUtNUF9JTkZPUk0oIFdpbGxVc2VEZWZhdWx0TWVzc2FnZXMgKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeyAvLyBzdGF0dXMgPT0gS01QX0kxOE5fT1BFTkVECisKKyAgICAgICAgaW50IHNlY3Rpb24gPSBnZXRfc2VjdGlvbigga21wX2kxOG5fcHJwX1ZlcnNpb24gKTsKKyAgICAgICAgaW50IG51bWJlciAgPSBnZXRfbnVtYmVyKCBrbXBfaTE4bl9wcnBfVmVyc2lvbiApOworICAgICAgICBjaGFyIGNvbnN0ICogZXhwZWN0ZWQgPSBfX2ttcF9pMThuX2RlZmF1bHRfdGFibGUuc2VjdFsgc2VjdGlvbiBdLnN0clsgbnVtYmVyIF07CisgICAgICAgIGttcF9zdHJfYnVmX3QgdmVyc2lvbjsgICAvLyBBY3R1YWwgdmVyc2lvbiBvZiB0aGUgY2F0YWxvZy4KKyAgICAgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmIHZlcnNpb24gKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiB2ZXJzaW9uLCAiJXMiLCBfX19jYXRnZXRzKCBrbXBfaTE4bl9wcnBfVmVyc2lvbiApICk7CisgICAgICAgICAgICAvLyBTdHJpbmcgcmV0dXJuZWQgYnkgY2F0Z2V0cyBpcyBpbnZhbGlkIGFmdGVyIGNsb3NpbmcgdGhlIGNhdGFsb2csIHNvIGNvcHkgaXQuCisgICAgICAgIGlmICggc3RyY21wKCB2ZXJzaW9uLnN0ciwgZXhwZWN0ZWQgKSAhPSAwICkgeworICAgICAgICAgICAgLy8gQ2xvc2UgYmFkIGNhdGFsb2cuCisgICAgICAgICAgICBfX2ttcF9pMThuX2NhdGNsb3NlKCk7CisgICAgICAgICAgICBzdGF0dXMgPSBLTVBfSTE4Tl9BQlNFTlQ7ICAvLyBBbmQgbWFyayBpdCBhcyBhYnNlbnQuCisgICAgICAgICAgICBpZiAoX19rbXBfZ2VuZXJhdGVfd2FybmluZ3MgPiBrbXBfd2FybmluZ3NfbG93KSB7CisgICAgICAgICAgICAgICAgLy8gQW5kIG5vdyBwcmludCBhIHdhcm5pbmcgdXNpbmcgZGVmYXVsdCBtZXNzYWdlcy4KKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgIGttcF9tc193YXJuaW5nLAorICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBXcm9uZ01lc3NhZ2VDYXRhbG9nLCBwYXRoLnN0ciwgdmVyc2lvbi5zdHIsIGV4cGVjdGVkICksCisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKCBXaWxsVXNlRGVmYXVsdE1lc3NhZ2VzICk7CisgICAgICAgICAgICB9IC8vIF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzCisgICAgICAgIH07IC8vIGlmCisgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSggJiB2ZXJzaW9uICk7CisKKyAgICB9OyAvLyBpZgorICAgIGNvZGVfcGFnZSA9IGdldF9jb2RlX3BhZ2UoKTsKKworICAgIGVuZDoKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIHBhdGggKTsKKyAgICAgICAgcmV0dXJuOworCit9IC8vIGZ1bmMgX19rbXBfaTE4bl9kb19jYXRvcGVuCisKKwordm9pZAorX19rbXBfaTE4bl9jYXRjbG9zZSgKKykgeworICAgIGlmICggc3RhdHVzID09IEtNUF9JMThOX09QRU5FRCApIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggY2F0ICE9IEtNUF9JMThOX05VTExDQVQgKTsKKyAgICAgICAga21wX2kxOG5fdGFibGVfZnJlZSggJiB0YWJsZSApOworICAgICAgICBGcmVlTGlicmFyeSggY2F0ICk7CisgICAgICAgIGNhdCA9IEtNUF9JMThOX05VTExDQVQ7CisgICAgfTsgLy8gaWYKKyAgICBjb2RlX3BhZ2UgPSBkZWZhdWx0X2NvZGVfcGFnZTsKKyAgICBzdGF0dXMgPSBLTVBfSTE4Tl9DTE9TRUQ7Cit9IC8vIGZ1bmMgX19rbXBfaTE4bl9jYXRjbG9zZQorCisvKgorICAgIFdlIHVzZSBGb3JtYXRNZXNzYWdlKCkgdG8gZ2V0IHN0cmluZ3MgZnJvbSBjYXRhbG9nLCBnZXQgc3lzdGVtIGVycm9yIG1lc3NhZ2VzLCBldGMuCisgICAgRm9ybWF0TWVzc2FnZSgpIHRlbmRzIHRvIHJldHVybiBXaW5kb3dzKiBPUy1zdHlsZSBlbmQtb2YtbGluZXMsICJcclxuIi4gV2hlbiBzdHJpbmcgaXMgcHJpbnRlZCwKKyAgICBwcmludGYoKSBhbHNvIHJlcGxhY2VzIGFsbCB0aGUgb2NjdXJyZW5jZXMgb2YgIlxuIiB3aXRoICJcclxuIiAoYWdhaW4hKSwgc28gc2VxdWVuY2VzIGxpa2UKKyAgICAiXHJcclxyXG4iIGFwcGVhciBpbiBvdXRwdXQuIEl0IGlzIG5vdCB0b28gZ29vZC4KKworICAgIEFkZGl0aW9uYWwgbWVzcyBjb21lcyBmcm9tIG1lc3NhZ2UgY2F0YWxvZzogT3VyIGNhdGFsb2cgc291cmNlIGVuX1VTLm1jIGZpbGUgKGdlbmVyYXRlZCBieQorICAgIG1lc3NhZ2UtY29udmVydGVyLnBsKSBjb250YWlucyBvbmx5ICJcbiIgY2hhcmFjdGVycywgYnV0IGVuX1VTX21zZ18xMDMzLmJpbiBmaWxlIChwcm9kdWNlZCBieQorICAgIG1jLmV4ZSkgbWF5IGNvbnRhaW4gIlxyXG4iIG9yIGp1c3QgIlxuIi4gVGhpcyBtZXNzIGdvZXMgZnJvbSBlbl9VU19tc2dfMTAzMy5iaW4gZmlsZSB0bworICAgIG1lc3NhZ2UgY2F0YWxvZywgbGlib21wdWkuZGxsLiBGb3IgZXhhbXBsZSwgbWVzc2FnZQorCisgICAgICAgIEVycm9yCisKKyAgICAodGhlcmUgaXMgIlxuIiBhdCB0aGUgZW5kKSBpcyBjb21waWxlZCBieSBtYy5leGUgdG8gIkVycm9yXHJcbiIsIHdoaWxlCisKKyAgICAgICAgT01QOiBFcnJvciAlMSFkITogJTIhcyFcbgorCisgICAgKHRoZXJlIGlzICJcbiIgYXQgdGhlIGVuZCBhcyB3ZWxsKSBpcyBjb21waWxlZCB0byAiT01QOiBFcnJvciAlMSFkITogJTIhcyFcclxuXG4iLgorCisgICAgVGh1cywgc3RyaXBwaW5nIGFsbCAiXHIiIG5vcm1hbGl6ZXMgc3RyaW5nIGFuZCByZXR1cm5zIGl0IHRvIGNhbm9uaWNhbCBmb3JtLCBzbyBwcmludGYoKSB3aWxsCisgICAgcHJvZHVjZSBjb3JyZWN0IGVuZC1vZi1saW5lIHNlcXVlbmNlcy4KKworICAgIF9fX3N0cmlwX2NycygpIHNlcnZlcyBmb3IgdGhpcyBwdXJwb3NlOiBpdCByZW1vdmVzIGFsbCB0aGUgb2NjdXJyZW5jZXMgb2YgIlxyIiBpbi1wbGFjZSBhbmQKKyAgICByZXR1cm5zIG5ldyBsZW5ndGggb2Ygc3RyaW5nLgorKi8KK3N0YXRpYworaW50CitfX19zdHJpcF9jcnMoCisgICAgY2hhciAqIHN0cgorKSB7CisgICAgaW50IGluICA9IDA7ICAvLyBJbnB1dCBjaGFyYWN0ZXIgaW5kZXguCisgICAgaW50IG91dCA9IDA7ICAvLyBPdXRwdXQgY2hhcmFjdGVyIGluZGV4LgorICAgIGZvciAoIDsgOyApIHsKKyAgICAgICAgaWYgKCBzdHJbIGluIF0gIT0gJ1xyJyApIHsKKyAgICAgICAgICAgIHN0clsgb3V0IF0gPSBzdHJbIGluIF07CisgICAgICAgICAgICArKyBvdXQ7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIGlmICggc3RyWyBpbiBdID09IDAgKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgKysgaW47CisgICAgfTsgLy8gZm9yZXZlcgorICAgIHJldHVybiBvdXQgLSAxOworfSAvLyBmdW5jIF9fc3RyaXBfY3JzCisKKworc3RhdGljCitjaGFyIGNvbnN0ICoKK19fX2NhdGdldHMoCisgICAga21wX2kxOG5faWRfdCAgaWQKKykgeworCisgICAgY2hhciAqICAgIHJlc3VsdCA9IE5VTEw7CisgICAgUFZPSUQgICAgIGFkZHIgICA9IE5VTEw7CisgICAgd2NoYXJfdCAqIHdtc2cgICA9IE5VTEw7CisgICAgRFdPUkQgICAgIHdsZW4gICA9IDA7CisgICAgY2hhciAqICAgIG1zZyAgICA9IE5VTEw7CisgICAgaW50ICAgICAgIGxlbiAgICA9IDA7CisgICAgaW50ICAgICAgIHJjOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggY2F0ICE9IEtNUF9JMThOX05VTExDQVQgKTsKKyAgICB3bGVuID0gICAgLy8gd2xlbiBkb2VzICpub3QqIGluY2x1ZGUgdGVybWluYXRpbmcgbnVsbC4KKyAgICAgICAgRm9ybWF0TWVzc2FnZVcoCisgICAgICAgICAgICBGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIgfCBGT1JNQVRfTUVTU0FHRV9GUk9NX0hNT0RVTEUgfAorICAgICAgICAgICAgICAgIEZPUk1BVF9NRVNTQUdFX0lHTk9SRV9JTlNFUlRTLAorICAgICAgICAgICAgY2F0LAorICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAwLCAgICAgICAgICAgICAvLyBMYW5nSWQKKyAgICAgICAgICAgIChMUFdTVFIpICYgYWRkciwKKyAgICAgICAgICAgIDAsICAgICAgICAgICAgIC8vIFNpemUgaW4gZWxlbWVudHMsIG5vdCBpbiBieXRlcy4KKyAgICAgICAgICAgIE5VTEwKKyAgICAgICAgKTsKKyAgICBpZiAoIHdsZW4gPD0gMCApIHsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfTsgLy8gaWYKKyAgICB3bXNnID0gKHdjaGFyX3QgKikgYWRkcjsgIC8vIFdhcm5pbmc6IHdtc2cgbWF5IGJlIG5vdCBudWwtdGVybWluYXRlZCEKKworICAgIC8vIENhbGN1bGF0ZSBsZW5ndGggb2YgbXVsdGlieXRlIG1lc3NhZ2UuCisgICAgbGVuID0gICAgIC8vIFNpbmNlIHdsZW4gZG9lcyBub3QgaW5jbHVkZSB0ZXJtaW5hdGluZyBudWxsLCBsZW4gZG9lcyBub3QgaW5jbHVkZSBpdCBhbHNvLgorICAgICAgICBXaWRlQ2hhclRvTXVsdGlCeXRlKAorICAgICAgICAgICAgY29kZV9wYWdlLAorICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgLy8gRmxhZ3MuCisgICAgICAgICAgICB3bXNnLCB3bGVuLCAgICAgICAvLyBXaWRlIGJ1ZmZlciBhbmQgc2l6ZS4KKyAgICAgICAgICAgIE5VTEwsIDAsICAgICAgICAgIC8vIEJ1ZmZlciBhbmQgc2l6ZS4KKyAgICAgICAgICAgIE5VTEwsIE5VTEwgICAgICAgIC8vIERlZmF1bHQgY2hhciBhbmQgdXNlZCBkZWZhdWx0IGNoYXIuCisgICAgICAgICk7CisgICAgaWYgKCBsZW4gPD0gMCApIHsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfTsgLy8gaWYKKworICAgIC8vIEFsbG9jYXRlIG1lbW9yeS4KKyAgICBtc2cgPSAoY2hhciAqKSBLTVBfSU5URVJOQUxfTUFMTE9DKCBsZW4gKyAxICk7CisKKyAgICAvLyBDb252ZXJ0IHdpZGUgbWVzc2FnZSB0byBtdWx0aWJ5dGUgb25lLgorICAgIHJjID0KKyAgICAgICAgV2lkZUNoYXJUb011bHRpQnl0ZSgKKyAgICAgICAgICAgIGNvZGVfcGFnZSwKKyAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgIC8vIEZsYWdzLgorICAgICAgICAgICAgd21zZywgd2xlbiwgICAgICAgLy8gV2lkZSBidWZmZXIgYW5kIHNpemUuCisgICAgICAgICAgICBtc2csIGxlbiwgICAgICAgICAvLyBCdWZmZXIgYW5kIHNpemUuCisgICAgICAgICAgICBOVUxMLCBOVUxMICAgICAgICAvLyBEZWZhdWx0IGNoYXIgYW5kIHVzZWQgZGVmYXVsdCBjaGFyLgorICAgICAgICApOworICAgIGlmICggcmMgPD0gMCB8fCByYyA+IGxlbiApIHsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfTsgLy8gaWYKKyAgICBLTVBfREVCVUdfQVNTRVJUKCByYyA9PSBsZW4gKTsKKyAgICBsZW4gPSByYzsKKyAgICBtc2dbIGxlbiBdID0gMDsgICAgICAgICAgIC8vIFB1dCB0ZXJtaW5hdGluZyBudWxsIHRvIHRoZSBlbmQuCisKKyAgICAvLyBTdHJpcHBpbmcgYWxsICJcciIgYmVmb3JlIHN0cmlwcGluZyBsYXN0IGVuZC1vZi1saW5lIHNpbXBsaWZpZXMgdGhlIHRhc2suCisgICAgbGVuID0gX19fc3RyaXBfY3JzKCBtc2cgKTsKKworICAgIC8vIEV2ZXJ5IG1lc3NhZ2UgaW4gY2F0YWxvZyBpcyB0ZXJtaW5hdGVkIHdpdGggIlxuIi4gU3RyaXAgaXQuCisgICAgaWYgKCBsZW4gPj0gMSAmJiBtc2dbIGxlbiAtIDEgXSA9PSAnXG4nICkgeworICAgICAgICAtLSBsZW47CisgICAgICAgIG1zZ1sgbGVuIF0gPSAwOworICAgIH07IC8vIGlmCisKKyAgICAvLyBFdmVyeXRoaW5nIGxvb2tzIG9rLgorICAgIHJlc3VsdCA9IG1zZzsKKyAgICBtc2cgICAgPSBOVUxMOworCisgICAgZW5kOgorCisgICAgaWYgKCBtc2cgIT0gTlVMTCApIHsKKyAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoIG1zZyApOworICAgIH07IC8vIGlmCisgICAgaWYgKCB3bXNnICE9IE5VTEwgKSB7CisgICAgICAgIExvY2FsRnJlZSggd21zZyApOworICAgIH07IC8vIGlmCisKKyAgICByZXR1cm4gcmVzdWx0OworCit9IC8vIF9fX2NhdGdldHMKKworCitjaGFyIGNvbnN0ICoKK19fa21wX2kxOG5fY2F0Z2V0cygKKyAgICBrbXBfaTE4bl9pZF90ICBpZAorKSB7CisKKyAgICBpbnQgc2VjdGlvbiA9IGdldF9zZWN0aW9uKCBpZCApOworICAgIGludCBudW1iZXIgID0gZ2V0X251bWJlciggaWQgKTsKKyAgICBjaGFyIGNvbnN0ICogbWVzc2FnZSA9IE5VTEw7CisKKyAgICBpZiAoIDEgPD0gc2VjdGlvbiAmJiBzZWN0aW9uIDw9IF9fa21wX2kxOG5fZGVmYXVsdF90YWJsZS5zaXplICkgeworICAgICAgICBpZiAoIDEgPD0gbnVtYmVyICYmIG51bWJlciA8PSBfX2ttcF9pMThuX2RlZmF1bHRfdGFibGUuc2VjdFsgc2VjdGlvbiBdLnNpemUgKSB7CisgICAgICAgICAgICBpZiAoIHN0YXR1cyA9PSBLTVBfSTE4Tl9DTE9TRUQgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfaTE4bl9jYXRvcGVuKCk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgaWYgKCBjYXQgIT0gS01QX0kxOE5fTlVMTENBVCApIHsKKyAgICAgICAgICAgICAgICBpZiAoIHRhYmxlLnNpemUgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgdGFibGUuc2VjdCA9IChrbXBfaTE4bl9zZWN0aW9uX3QgKikKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9JTlRFUk5BTF9DQUxMT0MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBfX2ttcF9pMThuX2RlZmF1bHRfdGFibGUuc2l6ZSArIDIgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIGttcF9pMThuX3NlY3Rpb25fdCApCisgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICB0YWJsZS5zaXplID0gX19rbXBfaTE4bl9kZWZhdWx0X3RhYmxlLnNpemU7CisgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICAgICBpZiAoIHRhYmxlLnNlY3RbIHNlY3Rpb24gXS5zaXplID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIHRhYmxlLnNlY3RbIHNlY3Rpb24gXS5zdHIgPSAoY29uc3QgY2hhciAqKikKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9JTlRFUk5BTF9DQUxMT0MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfaTE4bl9kZWZhdWx0X3RhYmxlLnNlY3RbIHNlY3Rpb24gXS5zaXplICsgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIGNoYXIgY29uc3QgKiApCisgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICB0YWJsZS5zZWN0WyBzZWN0aW9uIF0uc2l6ZSA9IF9fa21wX2kxOG5fZGVmYXVsdF90YWJsZS5zZWN0WyBzZWN0aW9uIF0uc2l6ZTsKKyAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgICAgIGlmICggdGFibGUuc2VjdFsgc2VjdGlvbiBdLnN0clsgbnVtYmVyIF0gPT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICAgICAgdGFibGUuc2VjdFsgc2VjdGlvbiBdLnN0clsgbnVtYmVyIF0gPSBfX19jYXRnZXRzKCBpZCApOworICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAgICAgbWVzc2FnZSA9IHRhYmxlLnNlY3RbIHNlY3Rpb24gXS5zdHJbIG51bWJlciBdOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIGlmICggbWVzc2FnZSA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgIC8vIENhdGFsb2cgaXMgbm90IG9wZW5lZCBvciBtZXNzYWdlIGlzIG5vdCBmb3VuZCwgcmV0dXJuIGRlZmF1bHQgbWVzc2FnZS4KKyAgICAgICAgICAgICAgICBtZXNzYWdlID0gX19rbXBfaTE4bl9kZWZhdWx0X3RhYmxlLnNlY3RbIHNlY3Rpb24gXS5zdHJbIG51bWJlciBdOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBpZgorICAgIGlmICggbWVzc2FnZSA9PSBOVUxMICkgeworICAgICAgICBtZXNzYWdlID0gbm9fbWVzc2FnZV9hdmFpbGFibGU7CisgICAgfTsgLy8gaWYKKyAgICByZXR1cm4gbWVzc2FnZTsKKworfSAvLyBmdW5jIF9fa21wX2kxOG5fY2F0Z2V0cworCisKKyNlbmRpZiAvLyBLTVBfT1NfV0lORE9XUworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZm5kZWYgS01QX0kxOE5fT0sKKyAgICAjZXJyb3IgSTE4biBzdXBwb3J0IGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgdGhpcyBPUy4KKyNlbmRpZiAvLyBLTVBfSTE4Tl9PSworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQKK19fa21wX2kxOG5fZHVtcF9jYXRhbG9nKAorICAgIGttcF9zdHJfYnVmX3QgKiBidWZmZXIKKykgeworCisgICAgc3RydWN0IGttcF9pMThuX2lkX3JhbmdlX3QgeworICAgICAgICBrbXBfaTE4bl9pZF90ICBmaXJzdDsKKyAgICAgICAga21wX2kxOG5faWRfdCAgbGFzdDsKKyAgICB9OyAvLyBzdHJ1Y3Qga21wX2kxOG5faWRfcmFuZ2VfdAorCisgICAgc3RhdGljIHN0cnVjdCBrbXBfaTE4bl9pZF9yYW5nZV90IHJhbmdlc1tdID0geworICAgICAgICB7IGttcF9pMThuX3BycF9maXJzdCwga21wX2kxOG5fcHJwX2xhc3QgfSwKKyAgICAgICAgeyBrbXBfaTE4bl9zdHJfZmlyc3QsIGttcF9pMThuX3N0cl9sYXN0IH0sCisgICAgICAgIHsga21wX2kxOG5fZm10X2ZpcnN0LCBrbXBfaTE4bl9mbXRfbGFzdCB9LAorICAgICAgICB7IGttcF9pMThuX21zZ19maXJzdCwga21wX2kxOG5fbXNnX2xhc3QgfSwKKyAgICAgICAgeyBrbXBfaTE4bl9obnRfZmlyc3QsIGttcF9pMThuX2hudF9sYXN0IH0KKyAgICB9OyAvLyByYW5nZXMKKworICAgIGludCAgICAgICAgICAgbnVtX29mX3JhbmdlcyA9IHNpemVvZiggcmFuZ2VzICkgLyBzaXplb2YoIHN0cnVjdCBrbXBfaTE4bl9pZF9yYW5nZV90ICk7CisgICAgaW50ICAgICAgICAgICByYW5nZTsKKyAgICBrbXBfaTE4bl9pZF90IGlkOworCisgICAgZm9yICggcmFuZ2UgPSAwOyByYW5nZSA8IG51bV9vZl9yYW5nZXM7ICsrIHJhbmdlICkgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIqKiogU2V0ICMlZCAqKipcbiIsIHJhbmdlICsgMSApOworICAgICAgICBmb3IgKCBpZCA9IChrbXBfaTE4bl9pZF90KSggcmFuZ2VzWyByYW5nZSBdLmZpcnN0ICsgMSApOworICAgICAgICAgICAgICBpZCA8IHJhbmdlc1sgcmFuZ2UgXS5sYXN0OworICAgICAgICAgICAgICBpZCA9IChrbXBfaTE4bl9pZF90KSggaWQgKyAxICkgKSB7CisgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJWQ6IDw8JXM+PlxuIiwgaWQsIF9fa21wX2kxOG5fY2F0Z2V0cyggaWQgKSApOworICAgICAgICB9OyAvLyBmb3IgaWQKKyAgICB9OyAvLyBmb3IgcmFuZ2UKKworICAgIF9fa21wX3ByaW50ZiggIiVzIiwgYnVmZmVyLT5zdHIgKTsKKworfSAvLyBfX2ttcF9pMThuX2R1bXBfY2F0YWxvZworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ttcF9tc2dfdAorX19rbXBfbXNnX2Zvcm1hdCgKKyAgICBrbXBfaTE4bl9pZF90IGlkLAorICAgIC4uLgorKSB7CisKKyAgICBrbXBfbXNnX3QgICAgICBtc2c7CisgICAgdmFfbGlzdCAgICAgICAgYXJnczsKKyAgICBrbXBfc3RyX2J1Zl90ICBidWZmZXI7CisgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmIGJ1ZmZlciApOworCisgICAgdmFfc3RhcnQoIGFyZ3MsIGlkICk7CisgICAgI2lmIEtNUF9PU19VTklYCisgICAgICAgIC8vIE9uIExpbnV4KiBPUyBhbmQgT1MgWCosIHByaW50ZigpIGZhbWlseSBmdW5jdGlvbnMgcHJvY2VzcyBwYXJhbWV0ZXIgbnVtYmVycywgZm9yIGV4YW1wbGU6CisgICAgICAgIC8vICIlMiRzICUxJHMiLgorICAgICAgICBfX2ttcF9zdHJfYnVmX3ZwcmludCggJiBidWZmZXIsIF9fa21wX2kxOG5fY2F0Z2V0cyggaWQgKSwgYXJncyApOworICAgICNlbGlmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIC8vIE9uIFdpbm9kd3MsIHByaW50ZigpIGZhbWlseSBmdW5jdGlvbnMgZG9lcyBub3QgcmVjb2duaXplIEdOVSBzdHlsZSBwYXJhbWV0ZXIgbnVtYmVycywKKyAgICAgICAgLy8gc28gd2UgaGF2ZSB0byB1c2UgRm9ybWF0TWVzc2FnZSgpIGluc3RlYWQuIEl0IHJlY29nbml6ZXMgcGFyYW1ldGVyIG51bWJlcnMsIGUuIGcuOgorICAgICAgICAvLyAiJTIhcyEgIiUxIXMhIi4KKyAgICAgICAgeworICAgICAgICAgICAgTFBUU1RSIHN0ciA9IE5VTEw7CisgICAgICAgICAgICBpbnQgICAgbGVuOworICAgICAgICAgICAgRm9ybWF0TWVzc2FnZSgKKyAgICAgICAgICAgICAgICBGT1JNQVRfTUVTU0FHRV9GUk9NX1NUUklORyB8IEZPUk1BVF9NRVNTQUdFX0FMTE9DQVRFX0JVRkZFUiwKKyAgICAgICAgICAgICAgICBfX2ttcF9pMThuX2NhdGdldHMoIGlkICksCisgICAgICAgICAgICAgICAgMCwgMCwKKyAgICAgICAgICAgICAgICAoTFBUU1RSKSggJiBzdHIgKSwKKyAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICYgYXJncworICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGxlbiA9IF9fX3N0cmlwX2Nycyggc3RyICk7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX2NhdCggJiBidWZmZXIsIHN0ciwgbGVuICk7CisgICAgICAgICAgICBMb2NhbEZyZWUoIHN0ciApOworICAgICAgICB9CisgICAgI2Vsc2UKKyAgICAgICAgI2Vycm9yCisgICAgI2VuZGlmCisgICAgdmFfZW5kKCBhcmdzICk7CisgICAgX19rbXBfc3RyX2J1Zl9kZXRhY2goICYgYnVmZmVyICk7CisKKyAgICBtc2cudHlwZSA9IChrbXBfbXNnX3R5cGVfdCkoIGlkID4+IDE2ICk7CisgICAgbXNnLm51bSAgPSBpZCAmIDB4RkZGRjsKKyAgICBtc2cuc3RyICA9IGJ1ZmZlci5zdHI7CisgICAgbXNnLmxlbiAgPSBidWZmZXIudXNlZDsKKworICAgIHJldHVybiBtc2c7CisKK30gLy8gX19rbXBfbXNnX2Zvcm1hdAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYworY2hhciAqCitzeXNfZXJyb3IoCisgICAgaW50IGVycgorKSB7CisKKyAgICBjaGFyICogbWVzc2FnZSA9IE5VTEw7CisKKyAgICAjaWYgS01QX09TX1dJTkRPV1MKKworICAgICAgICBMUFZPSUQgIGJ1ZmZlciA9IE5VTEw7CisgICAgICAgIGludCAgICAgbGVuOworICAgICAgICBEV09SRCAgIHJjOworICAgICAgICByYyA9CisgICAgICAgICAgICBGb3JtYXRNZXNzYWdlKAorICAgICAgICAgICAgICAgIEZPUk1BVF9NRVNTQUdFX0FMTE9DQVRFX0JVRkZFUiB8IEZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNLAorICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgZXJyLAorICAgICAgICAgICAgICAgIE1BS0VMQU5HSUQoIExBTkdfTkVVVFJBTCwgU1VCTEFOR19ERUZBVUxUICksIC8vIERlZmF1bHQgbGFuZ3VhZ2UuCisgICAgICAgICAgICAgICAgKExQVFNUUikgJiBidWZmZXIsCisgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICBOVUxMCisgICAgICAgICAgICApOworICAgICAgICBpZiAoIHJjID4gMCApIHsKKyAgICAgICAgICAgIC8vIE1lc3NhZ2UgZm9ybWF0dGVkLiBDb3B5IGl0IChzbyB3ZSBjYW4gZnJlZSBpdCBsYXRlciB3aXRoIG5vcm1hbCBmcmVlKCkuCisgICAgICAgICAgICBtZXNzYWdlID0gX19rbXBfc3RyX2Zvcm1hdCggIiVzIiwgKGNoYXIgKikgYnVmZmVyICk7CisgICAgICAgICAgICBsZW4gPSBfX19zdHJpcF9jcnMoIG1lc3NhZ2UgKTsgLy8gRGVsZXRlIGNhcnJpYWdlIHJldHVybnMgaWYgYW55LgorICAgICAgICAgICAgLy8gU3RyaXAgdHJhaWxpbmcgbmV3bGluZXMuCisgICAgICAgICAgICB3aGlsZSAoIGxlbiA+IDAgJiYgbWVzc2FnZVsgbGVuIC0gMSBdID09ICdcbicgKSB7CisgICAgICAgICAgICAgICAgLS0gbGVuOworICAgICAgICAgICAgfTsgLy8gd2hpbGUKKyAgICAgICAgICAgIG1lc3NhZ2VbIGxlbiBdID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEZvcm1hdE1lc3NhZ2UoKSBmYWlsZWQgdG8gZm9ybWF0IHN5c3RlbSBlcnJvciBtZXNzYWdlLiBHZXRMYXN0RXJyb3IoKSB3b3VsZCBnaXZlIHVzCisgICAgICAgICAgICAvLyBlcnJvciBjb2RlLCB3aGljaCB3ZSB3b3VsZCBjb252ZXJ0IHRvIG1lc3NhZ2UuLi4gdGhpcyBpdCBkYW5nZXJvdXMgcmVjdXJzaW9uLCB3aGljaAorICAgICAgICAgICAgLy8gY2Fubm90IGNsYXJpZnkgb3JpZ2luYWwgZXJyb3IsIHNvIHdlIHdpbGwgbm90IGV2ZW4gc3RhcnQgaXQuCisgICAgICAgIH07IC8vIGlmCisgICAgICAgIGlmICggYnVmZmVyICE9IE5VTEwgKSB7CisgICAgICAgICAgICBMb2NhbEZyZWUoIGJ1ZmZlciApOworICAgICAgICB9OyAvLyBpZgorCisgICAgI2Vsc2UgLy8gTm9uLVdpbmRvd3MqIE9TOiBMaW51eCogT1Mgb3IgT1MgWCoKKworICAgICAgICAvKgorICAgICAgICAgICAgVGhlcmUgYXJlIDIgaW5jb21wYXRpYmxlIHZlcnNpb25zIG9mIHN0cmVycm9yX3I6CisKKyAgICAgICAgICAgICAgICBjaGFyICogc3RyZXJyb3JfciggaW50LCBjaGFyICosIHNpemVfdCApOyAgLy8gR05VIHZlcnNpb24KKyAgICAgICAgICAgICAgICBpbnQgICAgc3RyZXJyb3JfciggaW50LCBjaGFyICosIHNpemVfdCApOyAgLy8gWFNJIHZlcnNpb24KKyAgICAgICAgKi8KKworICAgICAgICAjaWYgS01QX09TX0xJTlVYCisKKyAgICAgICAgICAgIC8vIEdOVSB2ZXJzaW9uIG9mIHN0cmVycm9yX3IuCisKKyAgICAgICAgICAgIGNoYXIgICBidWZmZXJbIDIwNDggXTsKKyAgICAgICAgICAgIGNoYXIgKiBjb25zdCBlcnJfbXNnID0gc3RyZXJyb3JfciggZXJyLCBidWZmZXIsIHNpemVvZiggYnVmZmVyICkgKTsKKyAgICAgICAgICAgICAgICAvLyBEbyBub3QgZWxpbWluYXRlIHRoaXMgYXNzaWdubWVudCB0byB0ZW1wb3JhcnkgdmFyaWFibGUsIG90aGVyd2lzZSBjb21waWxlciB3b3VsZAorICAgICAgICAgICAgICAgIC8vIG5vdCBpc3N1ZSB3YXJuaW5nIGlmIHN0cmVycm9yX3IoKSByZXR1cm5zIGBpbnQnIGluc3RlYWQgb2YgZXhwZWN0ZWQgYGNoYXIgKicuCisgICAgICAgICAgICBtZXNzYWdlID0gX19rbXBfc3RyX2Zvcm1hdCggIiVzIiwgZXJyX21zZyApOworCisgICAgICAgICNlbHNlIC8vIE9TIFgqLCBGcmVlQlNEKiBldGMuCisKKyAgICAgICAgICAgIC8vIFhTSSB2ZXJzaW9uIG9mIHN0cmVycm9yX3IuCisKKyAgICAgICAgICAgIGludCAgICBzaXplICAgPSAyMDQ4OworICAgICAgICAgICAgLy8gVE9ETzogQWRkIGNoZWNraW5nIHJlc3VsdCBvZiBtYWxsb2MoKS4KKyAgICAgICAgICAgIGNoYXIgKiBidWZmZXIgPSAoY2hhciAqKSBLTVBfSU5URVJOQUxfTUFMTE9DKCBzaXplICk7CisgICAgICAgICAgICBpbnQgICAgcmM7CisgICAgICAgICAgICByYyA9IHN0cmVycm9yX3IoIGVyciwgYnVmZmVyLCBzaXplICk7CisgICAgICAgICAgICBpZiAoIHJjID09IC0xICkgeworICAgICAgICAgICAgICAgIHJjID0gZXJybm87ICAgICAgICAgICAgLy8gWFNJIHZlcnNpb24gc2V0cyBlcnJuby4KKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICB3aGlsZSAoIHJjID09IEVSQU5HRSApIHsgICAvLyBFUkFOR0UgbWVhbnMgdGhlIGJ1ZmZlciBpcyB0b28gc21hbGwuCisgICAgICAgICAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoIGJ1ZmZlciApOworICAgICAgICAgICAgICAgIHNpemUgKj0gMjsKKyAgICAgICAgICAgICAgICBidWZmZXIgPSAoY2hhciAqKSBLTVBfSU5URVJOQUxfTUFMTE9DKCBzaXplICk7CisgICAgICAgICAgICAgICAgcmMgPSBzdHJlcnJvcl9yKCBlcnIsIGJ1ZmZlciwgc2l6ZSApOworICAgICAgICAgICAgICAgIGlmICggcmMgPT0gLTEgKSB7CisgICAgICAgICAgICAgICAgICAgIHJjID0gZXJybm87ICAgICAgICAvLyBYU0kgdmVyc2lvbiBzZXRzIGVycm5vLgorICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICB9OyAvLyB3aGlsZQorICAgICAgICAgICAgaWYgKCByYyA9PSAwICkgeworICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBidWZmZXI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEJ1ZmZlciBpcyB1bnVzZWQuIEZyZWUgaXQuCisgICAgICAgICAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoIGJ1ZmZlciApOworICAgICAgICAgICAgfTsgLy8gaWYKKworICAgICAgICAjZW5kaWYKKworICAgICNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworCisgICAgaWYgKCBtZXNzYWdlID09IE5VTEwgKSB7CisgICAgICAgIC8vIFRPRE86IEkxOG4gdGhpcyBtZXNzYWdlLgorICAgICAgICBtZXNzYWdlID0gX19rbXBfc3RyX2Zvcm1hdCggIiVzIiwgIihObyBzeXN0ZW0gZXJyb3IgbWVzc2FnZSBhdmFpbGFibGUpIiApOworICAgIH07IC8vIGlmCisgICAgcmV0dXJuIG1lc3NhZ2U7CisKK30gLy8gc3lzX2Vycm9yCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwora21wX21zZ190CitfX2ttcF9tc2dfZXJyb3JfY29kZSgKKyAgICBpbnQgIGNvZGUKKykgeworCisgICAga21wX21zZ190ICAgICAgbXNnOworICAgIG1zZy50eXBlID0ga21wX210X3N5c2VycjsKKyAgICBtc2cubnVtICA9IGNvZGU7CisgICAgbXNnLnN0ciAgPSBzeXNfZXJyb3IoIGNvZGUgKTsKKyAgICBtc2cubGVuICA9IEtNUF9TVFJMRU4oIG1zZy5zdHIgKTsKKyAgICByZXR1cm4gbXNnOworCit9IC8vIF9fa21wX21zZ19lcnJvcl9jb2RlCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwora21wX21zZ190CitfX2ttcF9tc2dfZXJyb3JfbWVzZygKKyAgICBjaGFyIGNvbnN0ICogbWVzZworKSB7CisKKyAgICBrbXBfbXNnX3QgICAgICBtc2c7CisgICAgbXNnLnR5cGUgPSBrbXBfbXRfc3lzZXJyOworICAgIG1zZy5udW0gID0gMDsKKyAgICBtc2cuc3RyICA9IF9fa21wX3N0cl9mb3JtYXQoICIlcyIsIG1lc2cgKTsKKyAgICBtc2cubGVuICA9IEtNUF9TVFJMRU4oIG1zZy5zdHIgKTsKKyAgICByZXR1cm4gbXNnOworCit9IC8vIF9fa21wX21zZ19lcnJvcl9tZXNnCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZAorX19rbXBfbXNnKAorICAgIGttcF9tc2dfc2V2ZXJpdHlfdCAgc2V2ZXJpdHksCisgICAga21wX21zZ190ICAgICAgICAgICBtZXNzYWdlLAorICAgIC4uLgorKSB7CisKKyAgICB2YV9saXN0ICAgICAgICBhcmdzOworICAgIGttcF9pMThuX2lkX3QgIGZvcm1hdDsgICAgICAvLyBmb3JtYXQgaWRlbnRpZmllcgorICAgIGttcF9tc2dfdCAgICAgIGZtc2c7ICAgICAgICAvLyBmb3JtYXR0ZWQgbWVzc2FnZQorICAgIGttcF9zdHJfYnVmX3QgIGJ1ZmZlcjsKKworICAgIGlmICggc2V2ZXJpdHkgIT0ga21wX21zX2ZhdGFsICYmIF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzID09IGttcF93YXJuaW5nc19vZmYgKQorICAgICAgICByZXR1cm47IC8vIG5vIHJlYXNvbiB0byBmb3JtIGEgc3RyaW5nIGluIG9yZGVyIHRvIG5vdCBwcmludCBpdAorCisgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmIGJ1ZmZlciApOworCisgICAgLy8gRm9ybWF0IHRoZSBwcmltYXJ5IG1lc3NhZ2UuCisgICAgc3dpdGNoICggc2V2ZXJpdHkgKSB7CisgICAgICAgIGNhc2Uga21wX21zX2luZm9ybSA6IHsKKyAgICAgICAgICAgIGZvcm1hdCA9IGttcF9pMThuX2ZtdF9JbmZvOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIGttcF9tc193YXJuaW5nIDogeworICAgICAgICAgICAgZm9ybWF0ID0ga21wX2kxOG5fZm10X1dhcm5pbmc7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2Uga21wX21zX2ZhdGFsIDogeworICAgICAgICAgICAgZm9ybWF0ID0ga21wX2kxOG5fZm10X0ZhdGFsOworICAgICAgICB9IGJyZWFrOworICAgICAgICBkZWZhdWx0IDogeworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggMCApOworICAgICAgICB9OworICAgIH07IC8vIHN3aXRjaAorICAgIGZtc2cgPSBfX2ttcF9tc2dfZm9ybWF0KCBmb3JtYXQsIG1lc3NhZ2UubnVtLCBtZXNzYWdlLnN0ciApOworICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSBtZXNzYWdlLnN0ciApOworICAgIF9fa21wX3N0cl9idWZfY2F0KCAmIGJ1ZmZlciwgZm1zZy5zdHIsIGZtc2cubGVuICk7CisgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopIGZtc2cuc3RyICk7CisKKyAgICAvLyBGb3JtYXQgb3RoZXIgbWVzc2FnZXMuCisgICAgdmFfc3RhcnQoIGFyZ3MsIG1lc3NhZ2UgKTsKKyAgICBmb3IgKCA7IDsgKSB7CisgICAgICAgIG1lc3NhZ2UgPSB2YV9hcmcoIGFyZ3MsIGttcF9tc2dfdCApOworICAgICAgICBpZiAoIG1lc3NhZ2UudHlwZSA9PSBrbXBfbXRfZHVtbXkgJiYgbWVzc2FnZS5zdHIgPT0gTlVMTCApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9OyAvLyBpZgorICAgICAgICBpZiAoIG1lc3NhZ2UudHlwZSA9PSBrbXBfbXRfZHVtbXkgJiYgbWVzc2FnZS5zdHIgPT0gX19rbXBfbXNnX2VtcHR5LnN0ciApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9OyAvLyBpZgorICAgICAgICBzd2l0Y2ggKCBtZXNzYWdlLnR5cGUgKSB7CisgICAgICAgICAgICBjYXNlIGttcF9tdF9oaW50IDogeworICAgICAgICAgICAgICAgIGZvcm1hdCA9IGttcF9pMThuX2ZtdF9IaW50OworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga21wX210X3N5c2VyciA6IHsKKyAgICAgICAgICAgICAgICBmb3JtYXQgPSBrbXBfaTE4bl9mbXRfU3lzRXJyOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQgOiB7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggMCApOworICAgICAgICAgICAgfTsKKyAgICAgICAgfTsgLy8gc3dpdGNoCisgICAgICAgIGZtc2cgPSBfX2ttcF9tc2dfZm9ybWF0KCBmb3JtYXQsIG1lc3NhZ2UubnVtLCBtZXNzYWdlLnN0ciApOworICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSggKHZvaWQgKikgbWVzc2FnZS5zdHIgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9jYXQoICYgYnVmZmVyLCBmbXNnLnN0ciwgZm1zZy5sZW4gKTsKKyAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopIGZtc2cuc3RyICk7CisgICAgfTsgLy8gZm9yZXZlcgorICAgIHZhX2VuZCggYXJncyApOworCisgICAgLy8gUHJpbnQgZm9ybWF0dGVkIG1lc3NhZ2VzLgorICAgIC8vIFRoaXMgbG9jayBwcmV2ZW50cyBtdWx0aXBsZSBmYXRhbCBlcnJvcnMgb24gdGhlIHNhbWUgcHJvYmxlbS4KKyAgICAvLyBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIGxvY2sgKTsgICAgLy8gR0VIIC0gVGhpcyBsb2NrIGNhdXNpbmcgdGVzdHMgdG8gaGFuZyBvbiBPUyBYKi4KKyAgICBfX2ttcF9wcmludGYoICIlcyIsIGJ1ZmZlci5zdHIgKTsKKyAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoICYgYnVmZmVyICk7CisKKyAgICBpZiAoIHNldmVyaXR5ID09IGttcF9tc19mYXRhbCApIHsKKyAgICAgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIF9fa21wX3RocmVhZF9zbGVlcCggNTAwICk7ICAgLyogRGVsYXkgdG8gZ2l2ZSBtZXNzYWdlIGEgY2hhbmNlIHRvIGFwcGVhciBiZWZvcmUgcmVhcGluZyAqLworICAgICAgICAjZW5kaWYKKyAgICAgICAgX19rbXBfYWJvcnRfcHJvY2VzcygpOworICAgIH07IC8vIGlmCisKKyAgICAvLyBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIGxvY2sgKTsgIC8vIEdFSCAtIHRoaXMgbG9jayBjYXVzaW5nIHRlc3RzIHRvIGhhbmcgb24gT1MgWCouCisKK30gLy8gX19rbXBfbXNnCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gZW5kIG9mIGZpbGUgLy8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9pMThuLmggYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfaTE4bi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZWM1MWIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfaTE4bi5oCkBAIC0wLDAgKzEsMTkzIEBACisvKgorICoga21wX2kxOG4uaAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIEtNUF9JMThOX0gKKyNkZWZpbmUgS01QX0kxOE5fSAorCisjaW5jbHVkZSAia21wX3N0ci5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICBleHRlcm4gIkMiIHsKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisvKgorICAgIGttcF9pMThuX2lkLmluYyBkZWZpbmVzIGttcF9pMThuX2lkX3QgdHlwZS4gSXQgaXMgYW4gZW51bWVyYXRpb24gd2l0aCBpZGVudGlmaWVycyBvZiBhbGwgdGhlCisgICAgbWVzc2FnZXMgaW4gdGhlIGNhdGFsb2cuIFRoZXJlIGlzIG9uZSBzcGVjaWFsIGlkZW50aWZpZXI6IGttcF9pMThuX251bGwsIHdoaWNoIGRlbm90ZXMgYWJzZW5jZQorICAgIG9mIG1lc3NhZ2UuCisqLworI2luY2x1ZGUgImttcF9pMThuX2lkLmluYyIgLy8gR2VuZXJhdGVkIGZpbGUuIERvIG5vdCBlZGl0IGl0IG1hbnVhbGx5LgorCisvKgorICAgIExvdy1sZXZlbCBmdW5jdGlvbnMgaGFuZGxpbmcgbWVzc2FnZSBjYXRhbG9nLiBfX2ttcF9pMThuX29wZW4oKSBvcGVucyBtZXNzYWdlIGNhdGFsb2csCisgICAgX19rbXBfaTE4bl9jbG9zZXMoKSBpdC4gRXhwbGljaXQgb3BlbmluZyBpcyBub3QgcmVxdWlyZWQ6IGlmIG1lc3NhZ2UgY2F0YWxvZyBpcyBub3QgeWV0IG9wZW4sCisgICAgX19rbXBfaTE4bl9jYXRnZXRzKCkgd2lsbCBvcGVuIGl0IGltcGxpY2l0bHkuIEhvd2V2ZXIsIGNhdGFsb2cgc2hvdWxkIGJlIGV4cGxpY2l0bHkgY2xvc2VkLAorICAgIG90aGVyd2lzZSByZXNvdXJjZXMgKG1hbW9yeSwgaGFuZGxlcykgbWF5IGxlYWsuCisKKyAgICBfX2ttcF9pMThuX2NhdGdldHMoKSByZXR1cm5zIHJlYWQtb25seSBzdHJpbmcuIEl0IHNob3VsZCBub3QgYmUgZnJlZWQuCisKKyAgICBLTVBfSTE4Tl9TVFIgbWFjcm8gc2ltcGxpZmllcyBhY2NlcyB0byBzdHJpbmdzIGluIG1lc3NhZ2UgY2F0YWxvZyBhIGJpdC4gRm9sbG93aW5nIHR3byBsaW5lcyBhcmUKKyAgICBlcXVpdmFsZW50OgorCisgICAgICAgIF9fa21wX2kxOG5fY2F0Z2V0cygga21wX2kxOG5fc3RyX1dhcm5pbmcgKQorICAgICAgICBLTVBfSTE4Tl9TVFIoIFdhcm5pbmcgKQorKi8KKwordm9pZCAgICAgICAgICAgIF9fa21wX2kxOG5fY2F0b3BlbigpOwordm9pZCAgICAgICAgICAgIF9fa21wX2kxOG5fY2F0Y2xvc2UoKTsKK2NoYXIgY29uc3QgKiAgICBfX2ttcF9pMThuX2NhdGdldHMoIGttcF9pMThuX2lkX3QgaWQgKTsKKworI2RlZmluZSBLTVBfSTE4Tl9TVFIoIGlkICkgICAgX19rbXBfaTE4bl9jYXRnZXRzKCBrbXBfaTE4bl9zdHJfICMjIGlkICkKKworCisvKgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgSGlnaC1sZXZlbCBpbnRlcmZhY2UgZm9yIHByaW50aW5nIHN0cmluZ3MgdGFyZ2V0ZWQgdG8gdGhlIHVzZXIuCisKKyAgICBBbGwgdGhlIHN0cmluZ3MgYXJlIGRpdmlkZWQgaW50byAzIHR5cGVzOgorCisgICAgICAgICogbWVzc2FnZXMsCisgICAgICAgICogaGludHMsCisgICAgICAgICogc3lzdGVtIGVycm9ycy4KKworICAgIFRoZXJlIGFyZSAzIGtpbmQgb2YgbWVzc2FnZSBzZXZlcml0aWVzOgorCisgICAgICAgICogaW5mb3JtYXRpb25hbCBtZXNzYWdlcywKKyAgICAgICAgKiB3YXJuaW5ncyAobm9uLWZhdGFsIGVycm9ycyksCisgICAgICAgICogZmF0YWwgZXJyb3JzLgorCisgICAgRm9yIGV4YW1wbGU6CisKKyAgICAgICAgT01QOiBXYXJuaW5nICMyOiBDYW5ub3Qgb3BlbiBtZXNzYWdlIGNhdGFsb2cgImxpYmd1aWRlLmNhdCI6ICAgKDEpCisgICAgICAgIE9NUDogU3lzdGVtIGVycm9yICMyOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5ICAgICAgICAgICAgICAgICgyKQorICAgICAgICBPTVA6IEhpbnQ6IFBsZWFzZSBjaGVjayBOTFNQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLiAgICAgICAgICAoMykKKyAgICAgICAgT01QOiBJbmZvICMzOiBEZWZhdWx0IG1lc3NhZ2VzIHdpbGwgYmUgdXNlZC4gICAgICAgICAgICAgICAgICAgKDQpCisKKyAgICB3aGVyZQorCisgICAgICAgICgxKSBpcyBhIG1lc3NhZ2Ugb2Ygd2FybmluZyBzZXZlcml0eSwKKyAgICAgICAgKDIpIGlzIGEgc3lzdGVtIGVycm9yIGNhdXNlZCB0aGUgcHJldmlvdXMgd2FybmluZywKKyAgICAgICAgKDMpIGlzIGEgaGludCBmb3IgdGhlIHVzZXIgaG93IHRvIGZpeCB0aGUgcHJvYmxlbSwKKyAgICAgICAgKDQpIGlzIGEgbWVzc2FnZSBvZiBpbmZvcm1hdGlvbmFsIHNldmVyaXR5LgorCisgICBVc2FnZSBpbiBjb21wbGV4IGNhc2VzIChtZXNzYWdlIGlzIGFjY29tcGFuaWVkIHdpdGggaGludHMgYW5kIHN5c3RlbSBlcnJvcnMpOgorCisgICAgICAgaW50IGVycm9yID0gZXJybm87ICAgLy8gV2UgbmVlZCBzYXZlIGVycm5vIGltbWVkaWF0ZWx5LCBiZWNhdXNlIGl0IG1heSBiZSBjaGFuZ2VkLgorICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAga21wX21zX3dhcm5pbmcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldmVyaXR5CisgICAgICAgICAgIEtNUF9NU0coIENhbnRPcGVuTWVzc2FnZUNhdGFsb2csIG5hbWUgKSwgICAvLyBQcmltYXJ5IG1lc3NhZ2UKKyAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN5c3RlbSBlcnJvcgorICAgICAgICAgICBLTVBfSE5UKCBDaGVja05MU1BBVEggKSwgICAgICAgICAgICAgICAgICAgLy8gSGludAorICAgICAgICAgICBfX2ttcF9tc2dfbnVsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmFyaWFkaWMgYXJndW1lbnQgbGlzdCBmaW5pc2hlcgorICAgICAgICk7CisKKyAgICBVc2FnZSBpbiBzaW1wbGUgY2FzZXMgKGp1c3QgYSBtZXNzYWdlLCBubyBzeXN0ZW0gZXJyb3JzIG9yIGhpbnRzKToKKworICAgICAgICBLTVBfSU5GT1JNKCBXaWxsVXNlRGVmYXVsdE1lc3NhZ2VzICk7CisgICAgICAgIEtNUF9XQVJOSU5HKCBDYW50T3Blbk1lc3NhZ2VDYXRhbG9nLCBuYW1lICk7CisgICAgICAgIEtNUF9GQVRBTCggU3RhY2tPdmVybGFwICk7CisgICAgICAgIEtNUF9TWVNGQUlMKCAicHRocmVhZF9jcmVhdGUiLCBzdGF0dXMgKTsKKyAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX2NyZWF0ZSIsIHN0YXR1cyApOworICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTF9FUlJOTyggImdldHRpbWVvZmRheSIsIHN0YXR1cyApOworCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCitlbnVtIGttcF9tc2dfdHlwZSB7CisgICAga21wX210X2R1bW15ICA9ICAwLCAvLyBTcGVjaWFsIHR5cGUgZm9yIGludGVybmFsIHB1cnBvc2VzLgorICAgIGttcF9tdF9tZXNnICAgPSAgNCwgLy8gUHJpbWFyeSBPcGVuTVAgbWVzc2FnZSwgY291bGQgYmUgaW5mb3JtYXRpb24sIHdhcm5pbmcsIG9yIGZhdGFsLgorICAgIGttcF9tdF9oaW50ICAgPSAgNSwgLy8gSGludCB0byB0aGUgdXNlci4KKyAgICBrbXBfbXRfc3lzZXJyID0gLTEgIC8vIFN5c3RlbSBlcnJvciBtZXNzYWdlLgorfTsgLy8gZW51bSBrbXBfbXNnX3R5cGUKK3R5cGVkZWYgZW51bSBrbXBfbXNnX3R5cGUgIGttcF9tc2dfdHlwZV90OworCitzdHJ1Y3Qga21wX21zZyB7CisgICAga21wX21zZ190eXBlX3QgIHR5cGU7CisgICAgaW50ICAgICAgICAgICAgIG51bTsKKyAgICBjaGFyIGNvbnN0ICogICAgc3RyOworICAgIGludCAgICAgICAgICAgICBsZW47Cit9OyAvLyBzdHJ1Y3Qga21wX21lc3NhZ2UKK3R5cGVkZWYgc3RydWN0IGttcF9tc2cgIGttcF9tc2dfdDsKKworLy8gVHdvIHNwZWNpYWwgbWVzc2FnZXMuCitleHRlcm4ga21wX21zZ190IF9fa21wX21zZ19lbXB0eTsgIC8vIENhbiBiZSB1c2VkIGluIHBsYWNlIHdoZXJlIG1lc3NhZ2UgaXMgcmVxdWlyZWQgc3ludGFjdGljYWxseS4KK2V4dGVybiBrbXBfbXNnX3QgX19rbXBfbXNnX251bGw7ICAgLy8gRGVub3RlcyB0aGUgZW5kIG9mIHZhcmlhZGljIGxpc3Qgb2YgYXJndW1lbnRzLgorCisvLyBIZWxwZXIgZnVuY3Rpb25zLiBDcmVhdGVzIG1lc3NhZ2VzIGVpdGhlciBmcm9tIG1lc3NhZ2UgY2F0YWxvZyBvciBmcm9tIHN5c3RlbS4gTm90ZTogdGhlc2UKKy8vIGZ1bmN0aW9ucyBhbGxvY2F0ZSBtZW1vcnkuIFlvdSBzaG91bGQgcGFzcyBjcmVhdGVkIG1lc3NhZ2VzIHRvIF9fa21wX21zZygpIGZ1bmN0aW9uLCBpdCB3aWxsCisvLyBwcmludCBtZXNzYWdlcyBhbmQgZGVzdHJveSB0aGVtLgora21wX21zZ190ICBfX2ttcF9tc2dfZm9ybWF0KCBrbXBfaTE4bl9pZF90IGlkLCAuLi4gKTsKK2ttcF9tc2dfdCAgX19rbXBfbXNnX2Vycm9yX2NvZGUoIGludCBjb2RlICk7CitrbXBfbXNnX3QgIF9fa21wX21zZ19lcnJvcl9tZXNnKCBjaGFyIGNvbnN0ICogbWVzZyApOworCisvLyBIZWxwZXIgbWFjcm9zIHRvIG1ha2UgY2FsbHMgc2hvcnRlci4KKyNkZWZpbmUgS01QX01TRyggLi4uICApICAgX19rbXBfbXNnX2Zvcm1hdCgga21wX2kxOG5fbXNnXyAjIyBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIEtNUF9ITlQoIC4uLiAgKSAgIF9fa21wX21zZ19mb3JtYXQoIGttcF9pMThuX2hudF8gIyMgX19WQV9BUkdTX18gKQorI2RlZmluZSBLTVBfU1lTRVJSQ09ERSggY29kZSApICBfX2ttcF9tc2dfZXJyb3JfY29kZSggY29kZSApCisjZGVmaW5lIEtNUF9TWVNFUlJNRVNHKCBtZXNnICkgIF9fa21wX21zZ19lcnJvcl9tZXNnKCBtZXNnICkKKyNkZWZpbmUgS01QX0VSUiBLTVBfU1lTRVJSQ09ERQorCisvLyBNZXNzYWdlIHNldmVyaXR5LgorZW51bSBrbXBfbXNnX3NldmVyaXR5IHsKKyAgICBrbXBfbXNfaW5mb3JtLCAgICAgIC8vIEp1c3QgaW5mb3JtYXRpb24gZm9yIHRoZSB1c2VyLgorICAgIGttcF9tc193YXJuaW5nLCAgICAgLy8gTm9uLWZhdGFsIGVycm9yLCBleGVjdXRpb24gY29udGludWVzLgorICAgIGttcF9tc19mYXRhbCAgICAgICAgLy8gRmF0YWwgZXJyb3IsIHByb2dyYW0gYWJvcnRzLgorfTsgLy8gZW51bSBrbXBfbXNnX3NldmVyaXR5Cit0eXBlZGVmIGVudW0ga21wX21zZ19zZXZlcml0eSAga21wX21zZ19zZXZlcml0eV90OworCisvLyBQcmltYXJ5IGZ1bmN0aW9uIGZvciBwcmludGluZyBtZXNzYWdlcyBmb3IgdGhlIHVzZXIuIFRoZSBmaXJzdCBtZXNzYWdlIGlzIG1hbmRhdG9yeS4gQW55IG51bWJlcgorLy8gb2Ygc3lzdGVtIGVycm9ycyBhbmQgaGludHMgbWF5IGJlIHNwZWNpZmllZC4gQXJndW1lbnQgbGlzdCBtdXN0IGJlIGZpbmlzaGVkIHdpdGggX19rbXBfbXNnX251bGwuCit2b2lkICAgIF9fa21wX21zZygga21wX21zZ19zZXZlcml0eV90IHNldmVyaXR5LCBrbXBfbXNnX3QgbWVzc2FnZSwgLi4uICk7CisKKy8vIEhlbHBlciBtYWNyb3MgdG8gbWFrZSBjYWxscyBzaG9ydGVyIGluIHNpbXBsZSBjYXNlcy4KKyNkZWZpbmUgS01QX0lORk9STSggLi4uICApIF9fa21wX21zZygga21wX21zX2luZm9ybSwgIEtNUF9NU0coIF9fVkFfQVJHU19fICksIF9fa21wX21zZ19udWxsICkKKyNkZWZpbmUgS01QX1dBUk5JTkcoIC4uLiApIF9fa21wX21zZygga21wX21zX3dhcm5pbmcsIEtNUF9NU0coIF9fVkFfQVJHU19fICksIF9fa21wX21zZ19udWxsICkKKyNkZWZpbmUgS01QX0ZBVEFMKCAgIC4uLiApIF9fa21wX21zZygga21wX21zX2ZhdGFsLCAgIEtNUF9NU0coIF9fVkFfQVJHU19fICksIF9fa21wX21zZ19udWxsICkKKyNkZWZpbmUgS01QX1NZU0ZBSUwoIGZ1bmMsIGVycm9yICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9tc2coICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAga21wX21zX2ZhdGFsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX01TRyggRnVuY3Rpb25FcnJvciwgZnVuYyApLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX1NZU0VSUkNPREUoIGVycm9yICksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX19rbXBfbXNnX251bGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICApCisKKy8vIENoZWNrIGVycm9yLCBpZiBub3QgemVybywgZ2VuZXJhdGUgZmF0YWwgZXJyb3IgbWVzc2FnZS4KKyNkZWZpbmUgS01QX0NIRUNLX1NZU0ZBSUwoIGZ1bmMsIGVycm9yICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCBlcnJvciApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEtNUF9TWVNGQUlMKCBmdW5jLCBlcnJvciApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKy8vIENoZWNrIHN0YXR1cywgaWYgbm90IHplcm8sIGdlbmVyYXRlIGZhdGFsIGVycm9yIG1lc3NhZ2UgdXNpbmcgZXJybm8uCisjZGVmaW5lIEtNUF9DSEVDS19TWVNGQUlMX0VSUk5PKCBmdW5jLCBzdGF0dXMgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICggc3RhdHVzICE9IDAgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpbnQgZXJyb3IgPSBlcnJubzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfU1lTRkFJTCggZnVuYywgZXJyb3IgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisjaWZkZWYgS01QX0RFQlVHCisgICAgdm9pZCBfX2ttcF9pMThuX2R1bXBfY2F0YWxvZygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciApOworI2VuZGlmIC8vIEtNUF9ERUJVRworCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICB9OyAvLyBleHRlcm4gIkMiCisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworI2VuZGlmIC8vIEtNUF9JMThOX0gKKworLy8gZW5kIG9mIGZpbGUgLy8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9pbXBvcnQuYyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9pbXBvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmZiYTQxCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2ltcG9ydC5jCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBrbXBfaW1wb3J0LmMKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLyoKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBPYmplY3QgZ2VuZXJhdGVkIGZyb20gdGhpcyBzb3VyY2UgZmlsZSBpcyBsaW5rZWQgdG8gV2luZG93cyogT1MgRExMIGltcG9ydCBsaWJyYXJ5IChsaWJvbXBtZC5saWIpCisgICAgb25seSEgSXQgaXMgbm90IGEgcGFydCBvZiByZWd1bGFyIHN0YXRpYyBvciBkeW5hbWljIE9wZW5NUCBSVEwuIEFueSBjb2RlIHRoYXQganVzdCBuZWVkcyB0byBnbworICAgIGluIHRoZSBsaWJvbXBtZC5saWIgKGJ1dCBub3QgaW4gbGlib21wbXQubGliIGFuZCBsaWJvbXBtZC5kbGwpIHNob3VsZCBiZSBwbGFjZWQgaW4gdGhpcworICAgIGZpbGUuCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qCisgICAgVGhlc2Ugc3ltYm9scyBhcmUgcmVxdWlyZWQgZm9yIG11dHVhbCBleGNsdXNpb24gd2l0aCBNaWNyb3NvZnQgT3Blbk1QIFJUTCAoYW5kIGNvbXBhdGliaWxpdHkKKyAgICB3aXRoIE1TIENvbXBpbGVyKS4KKyovCisKK2ludCBfWW91X211c3RfbGlua193aXRoX2V4YWN0bHlfb25lX09wZW5NUF9saWJyYXJ5ID0gMTsKK2ludCBfWW91X211c3RfbGlua193aXRoX0ludGVsX09wZW5NUF9saWJyYXJ5ICAgICAgID0gMTsKK2ludCBfWW91X211c3RfbGlua193aXRoX01pY3Jvc29mdF9PcGVuTVBfbGlicmFyeSA9IDE7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKy8vIGVuZCBvZiBmaWxlIC8vCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfaW8uYyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9pby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmODA4YWYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfaW8uYwpAQCAtMCwwICsxLDI0OCBAQAorLyoKKyAqIEtNUF9JTy5jIC0tIFJUTCBJTworICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZm5kZWYgX19BQlNPRlRfV0lOCisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJrbXBfb3MuaCIKKyNpbmNsdWRlICJrbXBfbG9jay5oIgorI2luY2x1ZGUgImttcF9zdHIuaCIKKyNpbmNsdWRlICJrbXBfaW8uaCIKKyNpbmNsdWRlICJrbXAuaCIgLy8gS01QX0dUSURfRE5FLCBfX2ttcF9kZWJ1Z19idWYsIGV0YworCisjaWYgS01QX09TX1dJTkRPV1MKKyMgcHJhZ21hIHdhcm5pbmcoIHB1c2ggKQorIyBwcmFnbWEgd2FybmluZyggZGlzYWJsZTogMjcxIDMxMCApCisjIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyMgcHJhZ21hIHdhcm5pbmcoIHBvcCApCisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwora21wX2Jvb3RzdHJhcF9sb2NrX3QgX19rbXBfc3RkaW9fbG9jayAgID0gS01QX0JPT1RTVFJBUF9MT0NLX0lOSVRJQUxJWkVSKCBfX2ttcF9zdGRpb19sb2NrICAgKTsgLyogQ29udHJvbCBzdGRpbyBmdW5jdGlvbnMgKi8KK2ttcF9ib290c3RyYXBfbG9ja190IF9fa21wX2NvbnNvbGVfbG9jayA9IEtNUF9CT09UU1RSQVBfTE9DS19JTklUSUFMSVpFUiggX19rbXBfY29uc29sZV9sb2NrICk7IC8qIENvbnRyb2wgY29uc29sZSBpbml0aWFsaXphdGlvbiAqLworCisjaWYgS01QX09TX1dJTkRPV1MKKworICAgICMgaWZkZWYgS01QX0RFQlVHIAorICAgIC8qIF9fa21wX3N0ZG91dCBpcyB1c2VkIG9ubHkgZm9yIGRldiBidWlsZCAqLworICAgIHN0YXRpYyBIQU5ETEUgICAgX19rbXBfc3Rkb3V0ID0gTlVMTDsKKyAgICAjIGVuZGlmCisgICAgc3RhdGljIEhBTkRMRSAgICAgICAgX19rbXBfc3RkZXJyID0gTlVMTDsKKyAgICBzdGF0aWMgaW50ICAgICAgICAgICBfX2ttcF9jb25zb2xlX2V4aXN0cyA9IEZBTFNFOworICAgIHN0YXRpYyBrbXBfc3RyX2J1Zl90IF9fa21wX2NvbnNvbGVfYnVmOworCisgICAgc3RhdGljIGludAorICAgIGlzX2NvbnNvbGUoIHZvaWQgKQorICAgIHsKKyAgICAgICAgY2hhciBidWZmZXJbIDEyOCBdOworICAgICAgICBEV09SRCByYyAgPSAwOworICAgICAgICBEV09SRCBlcnIgPSAwOworICAgICAgICAvLyBUcnkgdG8gZ2V0IGNvbnNvbGUgdGl0bGUuCisgICAgICAgIFNldExhc3RFcnJvciggMCApOworICAgICAgICAgICAgLy8gR2V0Q29uc29sZVRpdGxlIGRvZXMgbm90IHJlc2V0IGxhc3QgZXJyb3IgaW4gY2FzZSBvZiBzdWNjZXNzIG9yIHNob3J0IGJ1ZmZlciwKKyAgICAgICAgICAgIC8vIHNvIHdlIG5lZWQgdG8gY2xlYXIgaXQgZXhwbGljaXRseS4KKyAgICAgICAgcmMgPSBHZXRDb25zb2xlVGl0bGUoIGJ1ZmZlciwgc2l6ZW9mKCBidWZmZXIgKSApOworICAgICAgICBpZiAoIHJjID09IDAgKSB7CisgICAgICAgICAgICAvLyByYyA9PSAwIG1lYW5zIGdldHRpbmcgY29uc29sZSB0aXRsZSBmYWlsZWQuIExldCB1cyBmaW5kIG91dCB3aHkuCisgICAgICAgICAgICBlcnIgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgIC8vIGVyciA9PSAwIG1lYW5zIGJ1ZmZlciB0b28gc2hvcnQgKHdlIHN1cHBvc2UgY29uc29sZSBleGlzdHMpLgorICAgICAgICAgICAgLy8gSW4gV2luZG93IGFwcGxpY2F0aW9ucyB3ZSB1c3VhbGx5IGhhdmUgZXJyID09IDYgKGludmFsaWQgaGFuZGxlKS4KKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgcmV0dXJuIHJjID4gMCB8fCBlcnIgPT0gMDsKKyAgICB9CisKKyAgICB2b2lkCisgICAgX19rbXBfY2xvc2VfY29uc29sZSggdm9pZCApCisgICAgeworICAgICAgICAvKiB3YWl0IHVudGlsIHVzZXIgcHJlc3NlcyByZXR1cm4gYmVmb3JlIGNsb3Npbmcgd2luZG93ICovCisgICAgICAgIC8qIFRPRE8gb25seSBjbG9zZSBpZiBhIHdpbmRvdyB3YXMgb3BlbmVkICovCisgICAgICAgIGlmKCBfX2ttcF9jb25zb2xlX2V4aXN0cyApIHsKKyAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcgCisgICAgICAgICAgICAvKiBzdGFuZGFyZCBvdXQgaXMgdXNlZCBvbmx5IGluIGRldiBidWlsZCAqLworICAgICAgICAgICAgX19rbXBfc3Rkb3V0ID0gTlVMTDsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgX19rbXBfc3RkZXJyID0gTlVMTDsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSggJl9fa21wX2NvbnNvbGVfYnVmICk7CisgICAgICAgICAgICBfX2ttcF9jb25zb2xlX2V4aXN0cyA9IEZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgLyogRm9yIHdpbmRvd3MsIGNhbGwgdGhpcyBiZWZvcmUgc3Rkb3V0LCBzdGRlcnIsIG9yIHN0ZGluIGFyZSB1c2VkLgorICAgICAqIEl0IG9wZW5zIGEgY29uc29sZSB3aW5kb3cgYW5kIHN0YXJ0cyBwcm9jZXNzaW5nICovCisgICAgc3RhdGljIHZvaWQKKyAgICBfX2ttcF9yZWRpcmVjdF9vdXRwdXQoIHZvaWQgKQorICAgIHsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJl9fa21wX2NvbnNvbGVfbG9jayApOworCisgICAgICAgIGlmKCAhIF9fa21wX2NvbnNvbGVfZXhpc3RzICkgeworICAgICAgICAgICAgI2lmZGVmIEtNUF9ERUJVRyAKKyAgICAgICAgICAgIC8qIHN0YW5kYXJkIG91dCBpcyB1c2VkIG9ubHkgaW4gZGV2IGJ1aWxkICovCisgICAgICAgICAgICBIQU5ETEUgaG87CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIEhBTkRMRSBoZTsKKworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmX19rbXBfY29uc29sZV9idWYgKTsKKworICAgICAgICAgICAgQWxsb2NDb25zb2xlKCk7CisgICAgICAgICAgICAvLyBXZSBkbyBub3QgY2hlY2sgdGhlIHJlc3VsdCBvZiBBbGxvY0NvbnNvbGUgYmVjYXVzZQorICAgICAgICAgICAgLy8gIDEuIHRoZSBjYWxsIGlzIGhhcm1sZXNzCisgICAgICAgICAgICAvLyAgMi4gaXQgaXMgbm90IGNsZWFyIGhvdyB0byBjb21tdW5pY2F0ZSBmYWlsdWUKKyAgICAgICAgICAgIC8vICAzLiB3ZSB3aWxsIGRldGVjdCBmYWlsdXJlIGxhdGVyIHdoZW4gd2UgZ2V0IGhhbmRsZShzKQorCisgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICAgICAgaG8gPSBHZXRTdGRIYW5kbGUoIFNURF9PVVRQVVRfSEFORExFICk7CisgICAgICAgICAgICAgICAgaWYgKCBobyA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSB8fCBobyA9PSBOVUxMICkgeworCisgICAgICAgICAgICAgICAgICAgIERXT1JEICBlcnIgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogb3V0cHV0IGVycm9yIHNvbWVob3cgKG1heWJlIG1lc3NhZ2UgYm94KQorICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGRvdXQgPSBOVUxMOworCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGRvdXQgPSBobzsgLy8gdGVtcG9yYXJ5IGNvZGUsIG5lZWQgbmV3IGdsb2JhbCBmb3IgaG8KKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgaGUgPSBHZXRTdGRIYW5kbGUoIFNURF9FUlJPUl9IQU5ETEUgKTsKKyAgICAgICAgICAgIGlmICggaGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUgfHwgaGUgPT0gTlVMTCApIHsKKworICAgICAgICAgICAgICAgIERXT1JEICBlcnIgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBvdXRwdXQgZXJyb3Igc29tZWhvdyAobWF5YmUgbWVzc2FnZSBib3gpCisgICAgICAgICAgICAgICAgX19rbXBfc3RkZXJyID0gTlVMTDsKKworICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgIF9fa21wX3N0ZGVyciA9IGhlOyAvLyB0ZW1wb3JhcnkgY29kZSwgbmVlZCBuZXcgZ2xvYmFsCisgICAgICAgICAgICB9CisgICAgICAgICAgICBfX2ttcF9jb25zb2xlX2V4aXN0cyA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2NvbnNvbGVfbG9jayApOworICAgIH0KKworI2Vsc2UKKyAgICAjZGVmaW5lICAgICAgIF9fa21wX3N0ZGVyciAgICAgKHN0ZGVycikKKyNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworCit2b2lkCitfX2ttcF92cHJpbnRmKCBlbnVtIGttcF9pbyBfX2ttcF9pbywgY2hhciBjb25zdCAqIGZvcm1hdCwgdmFfbGlzdCBhcCApCit7CisgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIGlmKCAhX19rbXBfY29uc29sZV9leGlzdHMgKSB7CisgICAgICAgICAgICBfX2ttcF9yZWRpcmVjdF9vdXRwdXQoKTsKKyAgICAgICAgfQorICAgICAgICAgICAgaWYoICEgX19rbXBfc3RkZXJyICYmIF9fa21wX2lvID09IGttcF9lcnIgKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgaWYoICEgX19rbXBfc3Rkb3V0ICYmIF9fa21wX2lvID09IGttcF9vdXQgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAjZW5kaWYKKyAgICAjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KKworICAgIGlmICggX19rbXBfZGVidWdfYnVmICYmIF9fa21wX2RlYnVnX2J1ZmZlciAhPSBOVUxMICkgeworCisgICAgICAgIGludCBkYyA9ICggX19rbXBfZGVidWdfYnVmX2F0b21pYyA/CisgICAgICAgICAgICAgICAgICAgS01QX1RFU1RfVEhFTl9JTkMzMiggJiBfX2ttcF9kZWJ1Z19jb3VudCkgOiBfX2ttcF9kZWJ1Z19jb3VudCsrICkKKyAgICAgICAgICAgICAgICAgICAlIF9fa21wX2RlYnVnX2J1Zl9saW5lczsKKyAgICAgICAgY2hhciAqZGIgPSAmIF9fa21wX2RlYnVnX2J1ZmZlclsgZGMgKiBfX2ttcF9kZWJ1Z19idWZfY2hhcnMgXTsKKyAgICAgICAgaW50IGNoYXJzID0gMDsKKworICAgICAgICAjaWZkZWYgS01QX0RFQlVHX1BJRFMKKyAgICAgICAgICAgIGNoYXJzID0gS01QX1NOUFJJTlRGKCBkYiwgX19rbXBfZGVidWdfYnVmX2NoYXJzLCAicGlkPSVkOiAiLCAoa21wX2ludDMyKWdldHBpZCgpICk7CisgICAgICAgICNlbmRpZgorICAgICAgICBjaGFycyArPSBLTVBfVlNOUFJJTlRGKCBkYiwgX19rbXBfZGVidWdfYnVmX2NoYXJzLCBmb3JtYXQsIGFwICk7CisKKyAgICAgICAgaWYgKCBjaGFycyArIDEgPiBfX2ttcF9kZWJ1Z19idWZfY2hhcnMgKSB7CisgICAgICAgICAgICBpZiAoIGNoYXJzICsgMSA+IF9fa21wX2RlYnVnX2J1Zl93YXJuX2NoYXJzICkgeworICAgICAgICAgICAgICAgICNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICAgICAgICAgICAgICBEV09SRCBjb3VudDsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJl9fa21wX2NvbnNvbGVfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIk9NUCB3YXJuaW5nOiBEZWJ1Z2dpbmcgYnVmZmVyIG92ZXJmbG93OyBpbmNyZWFzZSBLTVBfREVCVUdfQlVGX0NIQVJTIHRvICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnMgKyAxICk7CisgICAgICAgICAgICAgICAgICAgIFdyaXRlRmlsZSggX19rbXBfc3RkZXJyLCBfX2ttcF9jb25zb2xlX2J1Zi5zdHIsIF9fa21wX2NvbnNvbGVfYnVmLnVzZWQsICZjb3VudCwgTlVMTCApOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX2NsZWFyKCAmX19rbXBfY29uc29sZV9idWYgKTsKKyAgICAgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKCBfX2ttcF9zdGRlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIk9NUCB3YXJuaW5nOiBEZWJ1Z2dpbmcgYnVmZmVyIG92ZXJmbG93OyBpbmNyZWFzZSBLTVBfREVCVUdfQlVGX0NIQVJTIHRvICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzICsgMSApOworICAgICAgICAgICAgICAgICAgICBmZmx1c2goIF9fa21wX3N0ZGVyciApOworICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgIF9fa21wX2RlYnVnX2J1Zl93YXJuX2NoYXJzID0gY2hhcnMgKyAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogdGVybWluYXRlIHN0cmluZyBpZiBvdmVyZmxvdyBvY2N1cnJlZCAqLworICAgICAgICAgICAgZGJbIF9fa21wX2RlYnVnX2J1Zl9jaGFycyAtIDIgXSA9ICdcbic7CisgICAgICAgICAgICBkYlsgX19rbXBfZGVidWdfYnVmX2NoYXJzIC0gMSBdID0gJ1wwJzsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgICNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICAgICAgRFdPUkQgY291bnQ7CisgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHX1BJRFMKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmX19rbXBfY29uc29sZV9idWYsICJwaWQ9JWQ6ICIsCisgICAgICAgICAgICAgICAgICAoa21wX2ludDMyKWdldHBpZCgpICk7CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfdnByaW50KCAmX19rbXBfY29uc29sZV9idWYsIGZvcm1hdCwgYXAgKTsKKyAgICAgICAgICAgIFdyaXRlRmlsZSgKKyAgICAgICAgICAgICAgICBfX2ttcF9zdGRlcnIsCisgICAgICAgICAgICAgICAgX19rbXBfY29uc29sZV9idWYuc3RyLAorICAgICAgICAgICAgICAgIF9fa21wX2NvbnNvbGVfYnVmLnVzZWQsCisgICAgICAgICAgICAgICAgJmNvdW50LAorICAgICAgICAgICAgICAgIE5VTEwKKyAgICAgICAgICAgICk7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX2NsZWFyKCAmX19rbXBfY29uc29sZV9idWYgKTsKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUdfUElEUworICAgICAgICAgICAgICAgIGZwcmludGYoIF9fa21wX3N0ZGVyciwgInBpZD0lZDogIiwgKGttcF9pbnQzMilnZXRwaWQoKSApOworICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICB2ZnByaW50ZiggX19rbXBfc3RkZXJyLCBmb3JtYXQsIGFwICk7CisgICAgICAgICAgICBmZmx1c2goIF9fa21wX3N0ZGVyciApOworICAgICAgICAjZW5kaWYKKyAgICB9Cit9CisKK3ZvaWQKK19fa21wX3ByaW50ZiggY2hhciBjb25zdCAqIGZvcm1hdCwgLi4uICkKK3sKKyAgICB2YV9saXN0IGFwOworICAgIHZhX3N0YXJ0KCBhcCwgZm9ybWF0ICk7CisKKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX3N0ZGlvX2xvY2sgKTsKKyAgICBfX2ttcF92cHJpbnRmKCBrbXBfZXJyLCBmb3JtYXQsIGFwICk7CisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiBfX2ttcF9zdGRpb19sb2NrICk7CisKKyAgICB2YV9lbmQoIGFwICk7Cit9CisKK3ZvaWQKK19fa21wX3ByaW50Zl9ub19sb2NrKCBjaGFyIGNvbnN0ICogZm9ybWF0LCAuLi4gKQoreworICAgIHZhX2xpc3QgYXA7CisgICAgdmFfc3RhcnQoIGFwLCBmb3JtYXQgKTsKKworICAgIF9fa21wX3ZwcmludGYoIGttcF9lcnIsIGZvcm1hdCwgYXAgKTsKKworICAgIHZhX2VuZCggYXAgKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9pby5oIGIvZmluYWwvcnVudGltZS9zcmMva21wX2lvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBjYWE2NAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9pby5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBrbXBfaW8uaCAtLSBSVEwgSU8gaGVhZGVyIGZpbGUuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX0lPX0gKKyNkZWZpbmUgS01QX0lPX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitlbnVtIGttcF9pbyB7CisgICAga21wX291dCA9IDAsCisgICAga21wX2VycgorfTsKKworZXh0ZXJuIGttcF9ib290c3RyYXBfbG9ja190IF9fa21wX3N0ZGlvX2xvY2s7ICAgICAvKiBDb250cm9sIHN0ZGlvIGZ1bmN0aW9ucyAqLworZXh0ZXJuIGttcF9ib290c3RyYXBfbG9ja190IF9fa21wX2NvbnNvbGVfbG9jazsgICAvKiBDb250cm9sIGNvbnNvbGUgaW5pdGlhbGl6YXRpb24gKi8KKworZXh0ZXJuIHZvaWQgX19rbXBfdnByaW50ZiggZW51bSBrbXBfaW8gX19rbXBfaW8sIGNoYXIgY29uc3QgKiBmb3JtYXQsIHZhX2xpc3QgYXAgKTsKK2V4dGVybiB2b2lkIF9fa21wX3ByaW50ZiggY2hhciBjb25zdCAqIGZvcm1hdCwgLi4uICk7CitleHRlcm4gdm9pZCBfX2ttcF9wcmludGZfbm9fbG9jayggY2hhciBjb25zdCAqIGZvcm1hdCwgLi4uICk7CitleHRlcm4gdm9pZCBfX2ttcF9jbG9zZV9jb25zb2xlKCB2b2lkICk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBLTVBfSU9fSCAqLworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfaXR0LmMgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfaXR0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg2ZDYzNQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9pdHQuYwpAQCAtMCwwICsxLDE0NCBAQAorI2luY2x1ZGUgImttcF9jb25maWcuaCIKKworI2lmIFVTRV9JVFRfQlVJTEQKKy8qCisgKiBrbXBfaXR0LmMgLS0gSVRUIE5vdGlmeSBpbnRlcmZhY2UuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXBfaXR0LmgiCisKKyNpZiBLTVBfREVCVUcKKyAgICAjaW5jbHVkZSAia21wX2l0dC5pbmwiCisjZW5kaWYKKworCisjaWYgVVNFX0lUVF9OT1RJRlkKKworICAgIGttcF9pbnQzMiBfX2ttcF9iYXJyaWVyX2RvbWFpbl9jb3VudDsKKyAgICBrbXBfaW50MzIgX19rbXBfcmVnaW9uX2RvbWFpbl9jb3VudDsKKyAgICBfX2l0dF9kb21haW4qIF9fa21wX2l0dF9iYXJyaWVyX2RvbWFpbnNbS01QX01BWF9GUkFNRV9ET01BSU5TXTsKKyAgICBfX2l0dF9kb21haW4qIF9fa21wX2l0dF9yZWdpb25fZG9tYWluc1tLTVBfTUFYX0ZSQU1FX0RPTUFJTlNdOworICAgIF9faXR0X2RvbWFpbiogX19rbXBfaXR0X2ltYmFsYW5jZV9kb21haW5zW0tNUF9NQVhfRlJBTUVfRE9NQUlOU107CisgICAga21wX2ludDMyIF9fa21wX2l0dF9yZWdpb25fdGVhbV9zaXplW0tNUF9NQVhfRlJBTUVfRE9NQUlOU107CisgICAgX19pdHRfZG9tYWluICogbWV0YWRhdGFfZG9tYWluID0gTlVMTDsKKworICAgICNpbmNsdWRlICJrbXBfdmVyc2lvbi5oIgorICAgICNpbmNsdWRlICJrbXBfaTE4bi5oIgorICAgICNpbmNsdWRlICJrbXBfc3RyLmgiCisKKyAgICBLTVBfQlVJTERfQVNTRVJUKCBzaXplb2YoIGttcF9pdHRfbWFya190ICkgPT0gc2l6ZW9mKCBfX2l0dF9tYXJrX3R5cGUgKSApOworCisgICAgLyoKKyAgICAgICAgUHJldmlvdXNseSB1c2VkIHdhcm5pbmdzOgorCisgICAgICAgIEtNUF9XQVJOSU5HKCBJdHRBbGxOb3RpZkRpc2FibGVkICk7CisgICAgICAgIEtNUF9XQVJOSU5HKCBJdHRPYmpOb3RpZkRpc2FibGVkICk7CisgICAgICAgIEtNUF9XQVJOSU5HKCBJdHRNYXJrTm90aWZEaXNhYmxlZCApOworICAgICAgICBLTVBfV0FSTklORyggSXR0VW5sb2FkTGliRmFpbGVkLCBsaWJpdHRub3RpZnkgKTsKKyAgICAqLworCisKKyAgICBrbXBfaW50MzIgX19rbXBfaXR0X3ByZXBhcmVfZGVsYXkgPSAwOworICAgIGttcF9ib290c3RyYXBfbG9ja190IF9fa21wX2l0dF9kZWJ1Z19sb2NrID0gS01QX0JPT1RTVFJBUF9MT0NLX0lOSVRJQUxJWkVSKCBfX2ttcF9pdHRfZGVidWdfbG9jayApOworCisjZW5kaWYgLy8gVVNFX0lUVF9OT1RJRlkKKwordm9pZCBfX2ttcF9pdHRfaW5pdGlhbGl6ZSgpIHsKKworICAgIC8vIElUVE5vdGlmeSBsaWJyYXJ5IGlzIGxvYWRlZCBhbmQgaW5pdGlhbGl6ZWQgYXQgZmlyc3QgY2FsbCB0byBhbnkgaXR0bm90aWZ5IGZ1bmN0aW9uLAorICAgIC8vIHNvIHdlIGRvIG5vdCBuZWVkIHRvIGV4cGxpY2l0bHkgbG9hZCBpdCBhbnkgbW9yZS4KKyAgICAvLyBKdXNyIHJlcG9ydCBPTVAgUlRMIHZlcnNpb24gdG8gSVRUTm90aWZ5LgorCisgICAgI2lmIFVTRV9JVFRfTk9USUZZCisgICAgICAgIC8vIFJlcG9ydCBPcGVuTVAgUlRMIHZlcnNpb24uCisgICAgICAgIGttcF9zdHJfYnVmX3QgICAgICAgYnVmOworICAgICAgICBfX2l0dF9tYXJrX3R5cGUgICAgIHZlcnNpb247CisgICAgICAgIF9fa21wX3N0cl9idWZfaW5pdCggJiBidWYgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgKKyAgICAgICAgICAgICYgYnVmLAorICAgICAgICAgICAgIk9NUCBSVEwgVmVyc2lvbiAlZC4lZC4lZCIsCisgICAgICAgICAgICBfX2ttcF92ZXJzaW9uX21ham9yLAorICAgICAgICAgICAgX19rbXBfdmVyc2lvbl9taW5vciwKKyAgICAgICAgICAgIF9fa21wX3ZlcnNpb25fYnVpbGQKKyAgICAgICAgKTsKKyAgICAgICAgaWYgKCBfX2l0dF9hcGlfdmVyc2lvbl9wdHIgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmLCAiOiVzIiwgX19pdHRfYXBpX3ZlcnNpb24oKSApOworICAgICAgICB9OyAvLyBpZgorICAgICAgICB2ZXJzaW9uID0gX19pdHRfbWFya19jcmVhdGUoIGJ1Zi5zdHIgKTsKKyAgICAgICAgX19pdHRfbWFyayggdmVyc2lvbiwgTlVMTCApOworICAgICAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoICYgYnVmICk7CisgICAgI2VuZGlmCisKK30gLy8gX19rbXBfaXR0X2luaXRpYWxpemUKKworCit2b2lkIF9fa21wX2l0dF9kZXN0cm95KCkgeworICAgICNpZiBVU0VfSVRUX05PVElGWQorICAgICAgICBfX2ttcF9pdHRfZmluaV9pdHRsaWIoKTsKKyAgICAjZW5kaWYKK30gLy8gX19rbXBfaXR0X2Rlc3Ryb3kKKworCitleHRlcm4gIkMiCit2b2lkCitfX2l0dF9lcnJvcl9oYW5kbGVyKAorICAgIF9faXR0X2Vycm9yX2NvZGUgZXJyLAorICAgIHZhX2xpc3QgYXJncworKSB7CisKKyAgICBzd2l0Y2ggKCBlcnIgKSB7CisgICAgICAgIGNhc2UgX19pdHRfZXJyb3Jfbm9fbW9kdWxlIDogeworICAgICAgICAgICAgY2hhciBjb25zdCAqIGxpYnJhcnkgPSB2YV9hcmcoIGFyZ3MsIGNoYXIgY29uc3QgKiApOworICAgICAgICAgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgICAgICAgICAgaW50IHN5c19lcnIgPSB2YV9hcmcoIGFyZ3MsIGludCApOworICAgICAgICAgICAgICAgIF9fa21wX21zZygga21wX21zX3dhcm5pbmcsIEtNUF9NU0coIEl0dExvYWRMaWJGYWlsZWQsIGxpYnJhcnkgKSwgS01QX1NZU0VSUkNPREUoIHN5c19lcnIgKSwgX19rbXBfbXNnX251bGwgKTsKKyAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgICAgY2hhciBjb25zdCAqIHN5c19lcnIgPSB2YV9hcmcoIGFyZ3MsIGNoYXIgY29uc3QgKiApOworICAgICAgICAgICAgICAgIF9fa21wX21zZygga21wX21zX3dhcm5pbmcsIEtNUF9NU0coIEl0dExvYWRMaWJGYWlsZWQsIGxpYnJhcnkgKSwgS01QX1NZU0VSUk1FU0coIHN5c19lcnIgKSwgX19rbXBfbXNnX251bGwgKTsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIF9faXR0X2Vycm9yX25vX3N5bWJvbCA6IHsKKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiBsaWJyYXJ5ID0gdmFfYXJnKCBhcmdzLCBjaGFyIGNvbnN0ICogKTsKKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiBzeW1ib2wgID0gdmFfYXJnKCBhcmdzLCBjaGFyIGNvbnN0ICogKTsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBJdHRMb29rdXBGYWlsZWQsIHN5bWJvbCwgbGlicmFyeSApOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIF9faXR0X2Vycm9yX3Vua25vd25fZ3JvdXAgOiB7CisgICAgICAgICAgICBjaGFyIGNvbnN0ICogdmFyICAgPSB2YV9hcmcoIGFyZ3MsIGNoYXIgY29uc3QgKiApOworICAgICAgICAgICAgY2hhciBjb25zdCAqIGdyb3VwID0gdmFfYXJnKCBhcmdzLCBjaGFyIGNvbnN0ICogKTsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBJdHRVbmtub3duR3JvdXAsIHZhciwgZ3JvdXAgKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBfX2l0dF9lcnJvcl9lbnZfdG9vX2xvbmcgOiB7CisgICAgICAgICAgICBjaGFyIGNvbnN0ICogdmFyICAgICA9IHZhX2FyZyggYXJncywgY2hhciBjb25zdCAqICk7CisgICAgICAgICAgICBzaXplX3QgICAgICAgYWN0X2xlbiA9IHZhX2FyZyggYXJncywgc2l6ZV90ICk7CisgICAgICAgICAgICBzaXplX3QgICAgICAgbWF4X2xlbiA9IHZhX2FyZyggYXJncywgc2l6ZV90ICk7CisgICAgICAgICAgICBLTVBfV0FSTklORyggSXR0RW52VmFyVG9vTG9uZywgdmFyLCAodW5zaWduZWQgbG9uZykgYWN0X2xlbiwgKHVuc2lnbmVkIGxvbmcpIG1heF9sZW4gKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBfX2l0dF9lcnJvcl9jYW50X3JlYWRfZW52IDogeworICAgICAgICAgICAgY2hhciBjb25zdCAqIHZhciAgICAgPSB2YV9hcmcoIGFyZ3MsIGNoYXIgY29uc3QgKiApOworICAgICAgICAgICAgaW50ICAgICAgICAgIHN5c19lcnIgPSB2YV9hcmcoIGFyZ3MsIGludCApOworICAgICAgICAgICAgX19rbXBfbXNnKCBrbXBfbXNfd2FybmluZywgS01QX01TRyggQ2FudEdldEVudlZhciwgdmFyICksIEtNUF9FUlIoIHN5c19lcnIgKSwgX19rbXBfbXNnX251bGwgKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBfX2l0dF9lcnJvcl9zeXN0ZW0gOiB7CisgICAgICAgICAgICBjaGFyIGNvbnN0ICogZnVuYyAgICA9IHZhX2FyZyggYXJncywgY2hhciBjb25zdCAqICk7CisgICAgICAgICAgICBpbnQgICAgICAgICAgc3lzX2VyciA9IHZhX2FyZyggYXJncywgaW50ICk7CisgICAgICAgICAgICBfX2ttcF9tc2coIGttcF9tc193YXJuaW5nLCBLTVBfTVNHKCBJdHRGdW5jdGlvbkVycm9yLCBmdW5jICksIEtNUF9TWVNFUlJDT0RFKCBzeXNfZXJyICksIF9fa21wX21zZ19udWxsICk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGRlZmF1bHQgOiB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggSXR0VW5rbm93bkVycm9yLCBlcnIgKTsKKyAgICAgICAgfTsKKyAgICB9OyAvLyBzd2l0Y2gKKworfSAvLyBfX2l0dF9lcnJvcl9oYW5kbGVyCisKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfaXR0LmggYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfaXR0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI1YTRmMAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9pdHQuaApAQCAtMCwwICsxLDMwOSBAQAorI2lmIFVTRV9JVFRfQlVJTEQKKy8qCisgKiBrbXBfaXR0LmggLS0gSVRUIE5vdGlmeSBpbnRlcmZhY2UuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX0lUVF9ICisjZGVmaW5lIEtNUF9JVFRfSAorCisjaW5jbHVkZSAia21wX2xvY2suaCIKKworI2RlZmluZSBJTlRFTF9JVFROT1RJRllfQVBJX1BSSVZBVEUKKyNpbmNsdWRlICJpdHRub3RpZnkuaCIKKyNpbmNsdWRlICJsZWdhY3kvaXR0bm90aWZ5LmgiCisKKyNpZiBLTVBfREVCVUcKKyAgICAjZGVmaW5lIF9fa21wX2lubGluZSAgICAgICAgICAgLy8gVHVybiBvZmYgaW5saW5pbmcgaW4gZGVidWcgbW9kZS4KKyNlbHNlCisgICAgI2RlZmluZSBfX2ttcF9pbmxpbmUgc3RhdGljIGlubGluZQorI2VuZGlmCisKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGV4dGVybiBrbXBfaW50MzIgIF9fa21wX2l0dF9wcmVwYXJlX2RlbGF5OworIyBpZmRlZiBfX2NwbHVzcGx1cworICAgIGV4dGVybiAiQyIgdm9pZCBfX2ttcF9pdHRfZmluaV9pdHRsaWIodm9pZCk7CisjIGVsc2UKKyAgICBleHRlcm4gdm9pZCBfX2ttcF9pdHRfZmluaV9pdHRsaWIodm9pZCk7CisjIGVuZGlmCisjZW5kaWYKKworLy8gU2ltcGxpZnkgdGhlIGhhbmRsaW5nIG9mIGFuIGFyZ3VtZW50IHRoYXQgaXMgb25seSByZXF1aXJlZCB3aGVuIFVTRV9JVFRfQlVJTEQgaXMgZW5hYmxlZC4KKyNkZWZpbmUgVVNFX0lUVF9CVUlMRF9BUkcoeCkgLHgKKwordm9pZCBfX2ttcF9pdHRfaW5pdGlhbGl6ZSgpOwordm9pZCBfX2ttcF9pdHRfZGVzdHJveSgpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBOZXcgc3R1ZmYgZm9yIHJlcG9ydGluZyBoaWdoLWxldmVsIGNvbnN0cnVjdHMuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIE5vdGUgdGhlIG5hbWluZyBjb252ZW50aW9uOgorLy8gICAgIF9fa21wX2l0dF94eHhpbmcoKSBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBhY3Rpb24sIHdoaWxlCisvLyAgICAgX19rbXBfaXR0X3h4eGVkKCkgIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgYWN0aW9uLgorCisvLyAtLS0gUGFyYWxsZWwgcmVnaW9uIHJlcG9ydGluZyAtLS0KK19fa21wX2lubGluZSB2b2lkIF9fa21wX2l0dF9yZWdpb25fZm9ya2luZyggIGludCBndGlkLCBpbnQgdGVhbV9zaXplLCBpbnQgYmFycmllcnMsIGludCBzZXJpYWxpemVkID0gMCApOyAvLyBNYXN0ZXIgb25seSwgYmVmb3JlIGZvcmtpbmcgdGhyZWFkcy4KK19fa21wX2lubGluZSB2b2lkIF9fa21wX2l0dF9yZWdpb25fam9pbmVkKCAgIGludCBndGlkLCBpbnQgc2VyaWFsaXplZCA9IDAgKTsgLy8gTWFzdGVyIG9ubHksIGFmdGVyIGpvaW5pbmcgdGhyZWFkcy4KKyAgICAvLyAoKikgTm90ZTogQSB0aHJlYWQgbWF5IGV4ZWN1dGUgdGFza3MgYWZ0ZXIgdGhpcyBwb2ludCwgdGhvdWdoLgorCisvLyAtLS0gRnJhbWUgcmVwb3J0aW5nIC0tLQorLy8gcmVnaW9uID0gMCAtIG5vIHJlZ2lvbnMsIHJlZ2lvbiA9IDEgLSBwYXJhbGxlbCwgcmVnaW9uID0gMiAtIHNlcmlhbGl6ZWQgcGFyYWxsZWwKK19fa21wX2lubGluZSB2b2lkIF9fa21wX2l0dF9mcmFtZV9zdWJtaXQoIGludCBndGlkLCBfX2l0dF90aW1lc3RhbXAgYmVnaW4sIF9faXR0X3RpbWVzdGFtcCBlbmQsIGludCBpbWJhbGFuY2UsIGlkZW50X3QgKmxvYywgaW50IHRlYW1fc2l6ZSwgaW50IHJlZ2lvbiA9IDAgKTsKKworLy8gLS0tIE1ldGFkYXRhIHJlcG9ydGluZyAtLS0KKy8vIGJlZ2luL2VuZCAtIGJlZ2luL2VuZCB0aW1lc3RhbXBzIG9mIGEgYmFycmllciBmcmFtZSwgaW1iYWxhbmNlIC0gYWdncmVnYXRlZCB3YWl0IHRpbWUgdmFsdWUsIHJlZHVjdGlvbiAtaWYgdGhpcyBpcyBhIHJlZHVjdGlvbiBiYXJyaWVyCitfX2ttcF9pbmxpbmUgdm9pZCBfX2ttcF9pdHRfbWV0YWRhdGFfaW1iYWxhbmNlKCBpbnQgZ3RpZCwga21wX3VpbnQ2NCBiZWdpbiwga21wX3VpbnQ2NCBlbmQsIGttcF91aW50NjQgaW1iYWxhbmNlLCBrbXBfdWludDY0IHJlZHVjdGlvbiApOworLy8gc2NoZWRfdHlwZTogMCAtIHN0YXRpYywgMSAtIGR5bmFtaWMsIDIgLSBndWlkZWQsIDMgLSBjdXN0b20gKGFsbCBvdGhlcnMpOyBpdGVyYXRpb25zIC0gbG9vcCB0cmlwIGNvdW50LCBjaHVuayAtIGNodW5rIHNpemUKK19fa21wX2lubGluZSB2b2lkIF9fa21wX2l0dF9tZXRhZGF0YV9sb29wKCBpZGVudF90ICogbG9jLCBrbXBfdWludDY0IHNjaGVkX3R5cGUsIGttcF91aW50NjQgaXRlcmF0aW9ucywga21wX3VpbnQ2NCBjaHVuayApOworX19rbXBfaW5saW5lIHZvaWQgX19rbXBfaXR0X21ldGFkYXRhX3NpbmdsZSggaWRlbnRfdCAqIGxvYyApOworCisvLyAtLS0gQmFycmllciByZXBvcnRpbmcgLS0tCitfX2ttcF9pbmxpbmUgdm9pZCAqIF9fa21wX2l0dF9iYXJyaWVyX29iamVjdCggaW50IGd0aWQsIGludCBidCwgaW50IHNldF9uYW1lID0gMCwgaW50IGRlbHRhID0gMCApOworX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfYmFycmllcl9zdGFydGluZyggaW50IGd0aWQsIHZvaWQgKiBvYmplY3QgKTsKK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X2JhcnJpZXJfbWlkZGxlKCAgIGludCBndGlkLCB2b2lkICogb2JqZWN0ICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9iYXJyaWVyX2ZpbmlzaGVkKCBpbnQgZ3RpZCwgdm9pZCAqIG9iamVjdCApOworCisvLyAtLS0gVGFza3dhaXQgcmVwb3J0aW5nIC0tLQorX19rbXBfaW5saW5lIHZvaWQgKiBfX2ttcF9pdHRfdGFza3dhaXRfb2JqZWN0KCBpbnQgZ3RpZCApOworX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfdGFza3dhaXRfc3RhcnRpbmcoIGludCBndGlkLCB2b2lkICogb2JqZWN0ICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF90YXNrd2FpdF9maW5pc2hlZCggICBpbnQgZ3RpZCwgdm9pZCAqIG9iamVjdCApOworCisvLyAtLS0gVGFzayByZXBvcnRpbmcgLS0tCitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF90YXNrX3N0YXJ0aW5nKCB2b2lkICogb2JqZWN0ICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF90YXNrX2ZpbmlzaGVkKCB2b2lkICogb2JqZWN0ICk7CisKKy8vIC0tLSBMb2NrIHJlcG9ydGluZyAtLS0KKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfbG9ja19jcmVhdGluZyggIGttcF91c2VyX2xvY2tfcCBsb2NrLCBjb25zdCBpZGVudF90ICogKTsKKyNlbHNlCitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9sb2NrX2NyZWF0aW5nKCAga21wX3VzZXJfbG9ja19wIGxvY2sgKTsKKyNlbmRpZgorX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfbG9ja19hY3F1aXJpbmcoIGttcF91c2VyX2xvY2tfcCBsb2NrICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9sb2NrX2FjcXVpcmVkKCAga21wX3VzZXJfbG9ja19wIGxvY2sgKTsKK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X2xvY2tfcmVsZWFzaW5nKCBrbXBfdXNlcl9sb2NrX3AgbG9jayApOworX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfbG9ja19jYW5jZWxsZWQoIGttcF91c2VyX2xvY2tfcCBsb2NrICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9sb2NrX2Rlc3Ryb3llZCgga21wX3VzZXJfbG9ja19wIGxvY2sgKTsKKworLy8gLS0tIENyaXRpY2FsIHJlcG9ydGluZyAtLS0KKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfY3JpdGljYWxfY3JlYXRpbmcoICBrbXBfdXNlcl9sb2NrX3AgbG9jaywgY29uc3QgaWRlbnRfdCAqICk7CisjZWxzZQorX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfY3JpdGljYWxfY3JlYXRpbmcoICBrbXBfdXNlcl9sb2NrX3AgbG9jayApOworI2VuZGlmCitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9jcml0aWNhbF9hY3F1aXJpbmcoIGttcF91c2VyX2xvY2tfcCBsb2NrICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9jcml0aWNhbF9hY3F1aXJlZCggIGttcF91c2VyX2xvY2tfcCBsb2NrICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9jcml0aWNhbF9yZWxlYXNpbmcoIGttcF91c2VyX2xvY2tfcCBsb2NrICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9jcml0aWNhbF9kZXN0cm95ZWQoIGttcF91c2VyX2xvY2tfcCBsb2NrICk7CisKKy8vIC0tLSBTaW5nbGUgcmVwb3J0aW5nIC0tLQorX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfc2luZ2xlX3N0YXJ0KCBpbnQgZ3RpZCApOworX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfc2luZ2xlX2VuZCggICBpbnQgZ3RpZCApOworCisvLyAtLS0gT3JkZXJlZCByZXBvcnRpbmcgLS0tCitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9vcmRlcmVkX2luaXQoICBpbnQgZ3RpZCApOworX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfb3JkZXJlZF9wcmVwKCAgaW50IGd0aWQgKTsKK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X29yZGVyZWRfc3RhcnQoIGludCBndGlkICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9vcmRlcmVkX2VuZCggICBpbnQgZ3RpZCApOworCisvLyAtLS0gVGhyZWFkcyByZXBvcnRpbmcgLS0tCitfX2ttcF9pbmxpbmUgdm9pZCAgX19rbXBfaXR0X3RocmVhZF9pZ25vcmUoKTsKK19fa21wX2lubGluZSB2b2lkICBfX2ttcF9pdHRfdGhyZWFkX25hbWUoIGludCBndGlkICk7CisKKy8vIC0tLSBTeXN0ZW0gb2JqZWN0cyAtLS0KK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X3N5c3RlbV9vYmplY3RfY3JlYXRlZCggdm9pZCAqIG9iamVjdCwgY2hhciBjb25zdCAqIG5hbWUgKTsKKworLy8gLS0tIFN0YWNrIHN0aXRjaGluZyAtLS0KK19fa21wX2lubGluZSBfX2l0dF9jYWxsZXIgX19rbXBfaXR0X3N0YWNrX2NhbGxlcl9jcmVhdGUodm9pZCk7CitfX2ttcF9pbmxpbmUgdm9pZCBfX2ttcF9pdHRfc3RhY2tfY2FsbGVyX2Rlc3Ryb3koX19pdHRfY2FsbGVyKTsKK19fa21wX2lubGluZSB2b2lkIF9fa21wX2l0dF9zdGFja19jYWxsZWVfZW50ZXIoX19pdHRfY2FsbGVyKTsKK19fa21wX2lubGluZSB2b2lkIF9fa21wX2l0dF9zdGFja19jYWxsZWVfbGVhdmUoX19pdHRfY2FsbGVyKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT2xkIHN0dWZmIGZvciByZXBvcnRpbmcgbG93LWxldmVsIGludGVybmFsIHN5bmNocm9uaXphdGlvbi4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmIFVTRV9JVFRfTk9USUZZCisKKyAgICAvKgorICAgICAqIFN1cHBvcnQgZm9yIFNTQyBtYXJrcywgd2hpY2ggYXJlIHVzZWQgYnkgU0RFCisgICAgICogaHR0cDovL3NvZnR3YXJlLmludGVsLmNvbS9lbi11cy9hcnRpY2xlcy9pbnRlbC1zb2Z0d2FyZS1kZXZlbG9wbWVudC1lbXVsYXRvcgorICAgICAqIHRvIG1hcmsgcG9pbnRzIGluIGluc3RydWN0aW9uIHRyYWNlcyB0aGF0IHJlcHJlc2VudCBzcGluLWxvb3BzIGFuZCBhcmUKKyAgICAgKiB0aGVyZWZvcmUgdW5pbnRlcmVzdGluZyB3aGVuIGNvbGxlY3RpbmcgdHJhY2VzIGZvciBhcmNoaXRlY3R1cmUgc2ltdWxhdGlvbi4KKyAgICAgKi8KKyAgICAjaWZuZGVmIElOQ0xVREVfU1NDX01BUktTCisgICAgIyBkZWZpbmUgSU5DTFVERV9TU0NfTUFSS1MgKEtNUF9PU19MSU5VWCAmJiBLTVBfQVJDSF9YODZfNjQpCisgICAgI2VuZGlmCisKKyAgICAvKiBMaW51eCA2NCBvbmx5IGZvciBub3cgKi8KKyAgICAjaWYgKElOQ0xVREVfU1NDX01BUktTICYmIEtNUF9PU19MSU5VWCAmJiBLTVBfQVJDSF9YODZfNjQpCisgICAgLy8gUG9ydGFibGUgKGF0IGxlYXN0IGZvciBnY2MgYW5kIGljYykgY29kZSB0byBpbnNlcnQgdGhlIG5lY2Vzc2FyeSBpbnN0cnVjdGlvbnMKKyAgICAvLyB0byBzZXQgJWVieCBhbmQgZXhlY3V0ZSB0aGUgdW5saWtlbHkgbm8tb3AuCisgICAgICAjaWYgZGVmaW5lZCggX19JTlRFTF9DT01QSUxFUiApCisgICAgICAjIGRlZmluZSBJTlNFUlRfU1NDX01BUksodGFnKSBfX1NTQ19NQVJLKHRhZykKKyAgICAgICNlbHNlCisgICAgICAjIGRlZmluZSBJTlNFUlRfU1NDX01BUksodGFnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgibW92bCAlMCwgJSVlYng7IC5ieXRlIDB4NjQsIDB4NjcsIDB4OTAgIiA6OiJpIih0YWcpOiIlZWJ4IikKKyAgICAgICNlbmRpZgorICAgICNlbHNlCisgICAgIyBkZWZpbmUgSU5TRVJUX1NTQ19NQVJLKHRhZykgKCh2b2lkKTApCisgICAgI2VuZGlmCisKKyAgICAvKiBNYXJrZXJzIGZvciB0aGUgc3RhcnQgYW5kIGVuZCBvZiByZWdpb25zIHRoYXQgcmVwcmVzZW50IHBvbGxpbmcgYW5kCisgICAgICogYXJlIHRoZXJlZm9yZSB1bmludGVyZXN0aW5nIHRvIGFyY2hpdGVjdHVyYWwgc2ltdWxhdGlvbnMgMHg0Mzc2IGFuZAorICAgICAqIDB4NDM3NyBhcmUgYXJiaXRyYXJ5IG51bWJlcnMgdGhhdCBzaG91bGQgYmUgdW5pcXVlIGluIHRoZSBzcGFjZSBvZgorICAgICAqIFNTQyB0YWdzLCBidXQgdGhlcmUgaXMgbm8gY2VudHJhbCBpc3N1aW5nIGF1dGhvcml0eSByYXRoZXIKKyAgICAgKiByYW5kb21uZXNzIGlzIGV4cGVjdGVkIHRvIHdvcmsuCisgICAgICovCisgICAgI2RlZmluZSBTU0NfTUFSS19TUElOX1NUQVJUKCkgSU5TRVJUX1NTQ19NQVJLKDB4NDM3NikKKyAgICAjZGVmaW5lIFNTQ19NQVJLX1NQSU5fRU5EKCkgICBJTlNFUlRfU1NDX01BUksoMHg0Mzc3KQorCisgICAgLy8gTWFya2VycyBmb3IgYXJjaGl0ZWN0dXJlIHNpbXVsYXRpb24uCisgICAgLy8gRk9SS0lORyAgICAgIDogQmVmb3JlIHRoZSBtYXN0ZXIgdGhyZWFkIGZvcmtzLgorICAgIC8vIEpPSU5JTkcgICAgICA6IEF0IHRoZSBzdGFydCBvZiB0aGUgam9pbi4KKyAgICAvLyBJTlZPS0lORyAgICAgOiBCZWZvcmUgdGhlIHRocmVhZHMgaW52b2tlIG1pY3JvdGFza3MuCisgICAgLy8gRElTUEFUQ0hfSU5JVDogQXQgdGhlIHN0YXJ0IG9mIGR5bmFtaWNhbGx5IHNjaGVkdWxlZCBsb29wLgorICAgIC8vIERJU1BBVENIX05FWFQ6IEFmdGVyIGNsYW1pbmcgbmV4dCBpdGVyYXRpb24gb2YgZHluYW1pY2FsbHkgc2NoZWR1bGVkIGxvb3AuCisgICAgI2RlZmluZSBTU0NfTUFSS19GT1JLSU5HKCkgICAgICAgICAgSU5TRVJUX1NTQ19NQVJLKDB4ZDY5MykKKyAgICAjZGVmaW5lIFNTQ19NQVJLX0pPSU5JTkcoKSAgICAgICAgICBJTlNFUlRfU1NDX01BUksoMHhkNjk0KQorICAgICNkZWZpbmUgU1NDX01BUktfSU5WT0tJTkcoKSAgICAgICAgIElOU0VSVF9TU0NfTUFSSygweGQ2OTUpCisgICAgI2RlZmluZSBTU0NfTUFSS19ESVNQQVRDSF9JTklUKCkgICAgSU5TRVJUX1NTQ19NQVJLKDB4ZDY5NikKKyAgICAjZGVmaW5lIFNTQ19NQVJLX0RJU1BBVENIX05FWFQoKSAgICBJTlNFUlRfU1NDX01BUksoMHhkNjk3KQorCisgICAgLy8gVGhlIG9iamVjdCBpcyBhbiBhZGRyZXNzIHRoYXQgYXNzb2NpYXRlcyBhIHNwZWNpZmljIHNldCBvZiB0aGUgcHJlcGFyZSwgYWNxdWlyZSwgcmVsZWFzZSwKKyAgICAvLyBhbmQgY2FuY2VsIG9wZXJhdGlvbnMuCisKKyAgICAvKiBTeW5jIHByZXBhcmUgaW5kaWNhdGVzIGEgdGhyZWFkIGlzIGdvaW5nIHRvIHN0YXJ0IHdhaXRpbmcgZm9yIGFub3RoZXIgdGhyZWFkCisgICAgICAgdG8gc2VuZCBhIHJlbGVhc2UgZXZlbnQuICBUaGlzIG9wZXJhdGlvbiBzaG91bGQgYmUgZG9uZSBqdXN0IGJlZm9yZSB0aGUgdGhyZWFkCisgICAgICAgYmVnaW5zIGNoZWNraW5nIGZvciB0aGUgZXhpc3RlbmNlIG9mIHRoZSByZWxlYXNlIGV2ZW50ICovCisKKyAgICAvKiBTeW5jIGNhbmNlbCBpbmRpY2F0ZXMgYSB0aHJlYWQgaXMgY2FuY2VsbGluZyBhIHdhaXQgb24gYW5vdGhlciB0aHJlYWQgYW5jCisgICAgICAgY29udGludWluZyBleGVjdXRpb24gd2l0aG91dCB3YWl0aW5nIGZvciB0aGUgb3RoZXIgdGhyZWFkIHRvIHJlbGVhc2UgaXQgKi8KKworICAgIC8qIFN5bmMgYWNxdWlyZWQgaW5kaWNhdGVzIGEgdGhyZWFkIGhhcyByZWNlaXZlZCBhIHJlbGVhc2UgZXZlbnQgZnJvbSBhbm90aGVyCisgICAgICAgdGhyZWFkIGFuZCBoYXMgc3RvcHBlZCB3YWl0aW5nLiAgVGhpcyBvcGVyYXRpb24gbXVzdCBvY2N1ciBvbmx5IGFmdGVyIHRoZSByZWxlYXNlCisgICAgICAgZXZlbnQgaXMgcmVjZWl2ZWQuICovCisKKyAgICAvKiBTeW5jIHJlbGVhc2UgaW5kaWNhdGVzIGEgdGhyZWFkIGlzIGdvaW5nIHRvIHNlbmQgYSByZWxlYXNlIGV2ZW50IHRvIGFub3RoZXIgdGhyZWFkCisgICAgICAgc28gaXQgd2lsbCBzdG9wIHdhaXRpbmcgYW5kIGNvbnRpbnVlIGV4ZWN1dGlvbi4gVGhpcyBvcGVyYXRpb24gbXVzdCBqdXN0IGhhcHBlbiBiZWZvcmUKKyAgICAgICB0aGUgcmVsZWFzZSBldmVudC4gKi8KKworICAgICNkZWZpbmUgS01QX0ZTWU5DX1BSRVBBUkUoICAgb2JqICkgIF9faXR0X2ZzeW5jX3ByZXBhcmUoICAgKHZvaWQgKikoIG9iaiApICkKKyAgICAjZGVmaW5lIEtNUF9GU1lOQ19DQU5DRUwoICAgIG9iaiApICBfX2l0dF9mc3luY19jYW5jZWwoICAgICh2b2lkICopKCBvYmogKSApCisgICAgI2RlZmluZSBLTVBfRlNZTkNfQUNRVUlSRUQoICBvYmogKSAgX19pdHRfZnN5bmNfYWNxdWlyZWQoICAodm9pZCAqKSggb2JqICkgKQorICAgICNkZWZpbmUgS01QX0ZTWU5DX1JFTEVBU0lORyggb2JqICkgIF9faXR0X2ZzeW5jX3JlbGVhc2luZyggKHZvaWQgKikoIG9iaiApICkKKworICAgIC8qCisgICAgICAgIEluIGNhc2Ugb2Ygd2FpdGluZyBpbiBhIHNwaW4gbG9vcCwgSVRUIHdhbnRzIEtNUF9GU1lOQ19QUkVQQVJFKCkgdG8gYmUgY2FsbGVkIHdpdGggYSBkZWxheQorICAgICAgICAoYW5kIG5vdCBjYWxsZWQgYXQgYWxsIGlmIHdhaXRpbmcgdGltZSBpcyBzbWFsbCkuIFNvLCBpbiBzcGluIGxvb3BzLCBkbyBub3QgdXNlCisgICAgICAgIEtNUF9GU1lOQ19QUkVQQVJFKCksIGJ1dCB1c2UgS01QX0ZTWU5DX1NQSU5fSU5JVCgpIChiZWZvcmUgc3BpbiBsb29wKSwKKyAgICAgICAgS01QX0ZTWU5DX1NQSU5fUFJFUEFSRSgpICh3aGl0aGluIHRoZSBzcGluIGxvb3ApLCBhbmQgS01QX0ZTWU5DX1NQSU5fQUNRVUlSRUQoKS4KKyAgICAgICAgU2VlIEtNUF9XQUlUX1lJRUxEKCkgZm9yIGV4YW1wbGUuCisgICAgKi8KKworICAgICN1bmRlZiAgS01QX0ZTWU5DX1NQSU5fSU5JVAorICAgICNkZWZpbmUgS01QX0ZTWU5DX1NQSU5fSU5JVCggb2JqLCBzcGluICkgICAgXAorICAgICAgICBpbnQgc3luY19pdGVycyA9IDA7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIF9faXR0X2ZzeW5jX3ByZXBhcmVfcHRyICkgeyAgICAgICAgXAorICAgICAgICAgICAgaWYgKCBvYmogPT0gTlVMTCApIHsgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIG9iaiA9IHNwaW47ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAvKiBpZiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IC8qIGlmICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBTU0NfTUFSS19TUElOX1NUQVJUKCkKKworICAgICN1bmRlZiAgS01QX0ZTWU5DX1NQSU5fUFJFUEFSRQorICAgICNkZWZpbmUgS01QX0ZTWU5DX1NQSU5fUFJFUEFSRSggb2JqICkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIF9faXR0X2ZzeW5jX3ByZXBhcmVfcHRyICYmIHN5bmNfaXRlcnMgPCBfX2ttcF9pdHRfcHJlcGFyZV9kZWxheSApIHsgXAorICAgICAgICAgICAgKysgc3luY19pdGVyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKCBzeW5jX2l0ZXJzID49IF9fa21wX2l0dF9wcmVwYXJlX2RlbGF5ICkgeyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEtNUF9GU1lOQ19QUkVQQVJFKCAodm9pZCopIG9iaiApOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAvKiBpZiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IC8qIGlmICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB9IHdoaWxlICgwKQorICAgICN1bmRlZiAgS01QX0ZTWU5DX1NQSU5fQUNRVUlSRUQKKyAgICAjZGVmaW5lIEtNUF9GU1lOQ19TUElOX0FDUVVJUkVEKCBvYmogKSBkbyB7ICAgICAgICAgXAorICAgICAgICBTU0NfTUFSS19TUElOX0VORCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICggc3luY19pdGVycyA+PSBfX2ttcF9pdHRfcHJlcGFyZV9kZWxheSApIHsgIFwKKyAgICAgICAgICAgIEtNUF9GU1lOQ19BQ1FVSVJFRCggKHZvaWQqKSBvYmogKTsgICAgICAgICAgXAorICAgICAgICB9IC8qIGlmICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIH0gd2hpbGUgKDApCisKKyAgICAvKiBJVFQgd2lsbCBub3QgcmVwb3J0IG9iamVjdHMgY3JlYXRlZCB3aXRoaW4gS01QX0lUVF9JR05PUkUoKSwgZS4gZy46CisgICAgICAgICAgIEtNUF9JVFRfSUdOT1JFKAorICAgICAgICAgICAgICAgcHRyID0gbWFsbG9jKCBzaXplICk7CisgICAgICAgICAgICk7CisgICAgKi8KKyAgICAjZGVmaW5lIEtNUF9JVFRfSUdOT1JFKCBzdGF0ZW1lbnQgKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9faXR0X3N0YXRlX3QgX19pdHRfc3RhdGVfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICggX19pdHRfc3RhdGVfZ2V0X3B0ciApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfX2l0dF9zdGF0ZV8gPSBfX2l0dF9zdGF0ZV9nZXQoKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfX2l0dF9vYmpfbW9kZV9zZXQoIF9faXR0X29ial9wcm9wX2lnbm9yZSwgX19pdHRfb2JqX3N0YXRlX3NldCApOyBcCisgICAgICAgICAgICB9ICAvKiBpZiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7IHN0YXRlbWVudCB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoIF9faXR0X3N0YXRlX2dldF9wdHIgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgX19pdHRfc3RhdGVfc2V0KCBfX2l0dF9zdGF0ZV8gKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAvKiBpZiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKworICAgIGNvbnN0IGludCBLTVBfTUFYX0ZSQU1FX0RPTUFJTlMgPSA1MTI7IC8vIE1heGltdW0gbnVtYmVyIG9mIGZyYW1lIGRvbWFpbnMgdG8gdXNlIChtYXBzIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlmZmVyZW50IE9wZW5NUCByZWdpb25zIGluIHRoZSB1c2VyIHNvdXJjZSBjb2RlKS4KKyAgICBleHRlcm4ga21wX2ludDMyIF9fa21wX2JhcnJpZXJfZG9tYWluX2NvdW50OworICAgIGV4dGVybiBrbXBfaW50MzIgX19rbXBfcmVnaW9uX2RvbWFpbl9jb3VudDsKKyAgICBleHRlcm4gX19pdHRfZG9tYWluKiBfX2ttcF9pdHRfYmFycmllcl9kb21haW5zW0tNUF9NQVhfRlJBTUVfRE9NQUlOU107CisgICAgZXh0ZXJuIF9faXR0X2RvbWFpbiogX19rbXBfaXR0X3JlZ2lvbl9kb21haW5zW0tNUF9NQVhfRlJBTUVfRE9NQUlOU107CisgICAgZXh0ZXJuIF9faXR0X2RvbWFpbiogX19rbXBfaXR0X2ltYmFsYW5jZV9kb21haW5zW0tNUF9NQVhfRlJBTUVfRE9NQUlOU107CisgICAgZXh0ZXJuIGttcF9pbnQzMiBfX2ttcF9pdHRfcmVnaW9uX3RlYW1fc2l6ZVtLTVBfTUFYX0ZSQU1FX0RPTUFJTlNdOworICAgIGV4dGVybiBfX2l0dF9kb21haW4gKiBtZXRhZGF0YV9kb21haW47CisKKyNlbHNlCisKKy8vIE51bGwgZGVmaW5pdGlvbnMgb2YgdGhlIHN5bmNocm9uaXphdGlvbiB0cmFjaW5nIGZ1bmN0aW9ucy4KKyMgZGVmaW5lIEtNUF9GU1lOQ19QUkVQQVJFKCAgIG9iaiApICAgICAgICAoKHZvaWQpMCkKKyMgZGVmaW5lIEtNUF9GU1lOQ19DQU5DRUwoICAgIG9iaiApICAgICAgICAoKHZvaWQpMCkKKyMgZGVmaW5lIEtNUF9GU1lOQ19BQ1FVSVJFRCggIG9iaiApICAgICAgICAoKHZvaWQpMCkKKyMgZGVmaW5lIEtNUF9GU1lOQ19SRUxFQVNJTkcoIG9iaiApICAgICAgICAoKHZvaWQpMCkKKworIyBkZWZpbmUgS01QX0ZTWU5DX1NQSU5fSU5JVCggb2JqLCBzcGluICkgICgodm9pZCkwKQorIyBkZWZpbmUgS01QX0ZTWU5DX1NQSU5fUFJFUEFSRSggIG9iaiApICAgICgodm9pZCkwKQorIyBkZWZpbmUgS01QX0ZTWU5DX1NQSU5fQUNRVUlSRUQoIG9iaiApICAgICgodm9pZCkwKQorCisjIGRlZmluZSBLTVBfSVRUX0lHTk9SRShzdG10ICkgZG8geyBzdG10IH0gd2hpbGUgKDApCisKKyNlbmRpZiAvLyBVU0VfSVRUX05PVElGWQorCisjaWYgISBLTVBfREVCVUcKKyAgICAvLyBJbiByZWxlYXNlIG1vZGUgaW5jbHVkZSBkZWZpbml0aW9ucyBvZiBpbmxpbmUgZnVuY3Rpb25zLgorICAgICNpbmNsdWRlICJrbXBfaXR0LmlubCIKKyNlbmRpZgorCisjZW5kaWYgLy8gS01QX0lUVF9ICisKKyNlbHNlICAvKiBVU0VfSVRUX0JVSUxEICovCisKKy8vIE51bGwgZGVmaW5pdGlvbnMgb2YgdGhlIHN5bmNocm9uaXphdGlvbiB0cmFjaW5nIGZ1bmN0aW9ucy4KKy8vIElmIFVTRV9JVFRfQlVMSUQgaXMgbm90IGVuYWJsZWQsIFVTRV9JVFRfTk9USUZZIGNhbm5vdCBiZSBlaXRoZXIuCisvLyBCeSBkZWZpbmluZyB0aGVzZSB3ZSBhdm9pZCB1bnBsZWFzYW50IGlmZGVmIHRlc3RzIGluIG1hbnkgcGxhY2VzLgorIyBkZWZpbmUgS01QX0ZTWU5DX1BSRVBBUkUoICAgb2JqICkgICAgICAgICgodm9pZCkwKQorIyBkZWZpbmUgS01QX0ZTWU5DX0NBTkNFTCggICAgb2JqICkgICAgICAgICgodm9pZCkwKQorIyBkZWZpbmUgS01QX0ZTWU5DX0FDUVVJUkVEKCAgb2JqICkgICAgICAgICgodm9pZCkwKQorIyBkZWZpbmUgS01QX0ZTWU5DX1JFTEVBU0lORyggb2JqICkgICAgICAgICgodm9pZCkwKQorCisjIGRlZmluZSBLTVBfRlNZTkNfU1BJTl9JTklUKCBvYmosIHNwaW4gKSAgKCh2b2lkKTApCisjIGRlZmluZSBLTVBfRlNZTkNfU1BJTl9QUkVQQVJFKCAgb2JqICkgICAgKCh2b2lkKTApCisjIGRlZmluZSBLTVBfRlNZTkNfU1BJTl9BQ1FVSVJFRCggb2JqICkgICAgKCh2b2lkKTApCisKKyMgZGVmaW5lIEtNUF9JVFRfSUdOT1JFKHN0bXQgKSBkbyB7IHN0bXQgfSB3aGlsZSAoMCkKKworIyBkZWZpbmUgVVNFX0lUVF9CVUlMRF9BUkcoeCkKKworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9pdHQuaW5sIGIvZmluYWwvcnVudGltZS9zcmMva21wX2l0dC5pbmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRhZmE2YwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9pdHQuaW5sCkBAIC0wLDAgKzEsMTEzMCBAQAorI2lmIFVTRV9JVFRfQlVJTEQKKy8qCisgKiBrbXBfaXR0LmlubCAtLSBJbmxpbmUgZnVuY3Rpb25zIG9mIElUVCBOb3RpZnkuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKy8vIElubGluZSBmdW5jdGlvbiBkZWZpbml0aW9ucy4gVGhpcyBmaWxlIHNob3VsZCBiZSBpbmNsdWRlZCBpbnRvIGttcF9pdHQuaCBmaWxlIGZvciBwcm9kaWN0aW9uCisvLyBidWlsZCAodG8gbGV0IGNvbXBsaWxlciBpbmxpbmUgZnVuY3Rpb25zKSBvciBpbnRvIGttcF9pdHQuYyBmaWxlIGZvciBkZWJ1ZyBidWlsZCAodG8gcmVkdWNlCisvLyB0aGUgbnVtYmVyIG9mIGZpbGVzIHRvIHJlY29tcGlsZSBhbmQgc2F2ZSBidWlsZCB0aW1lKS4KKworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX3N0ci5oIgorCisjaWYgS01QX0lUVF9ERUJVRworICAgIGV4dGVybiBrbXBfYm9vdHN0cmFwX2xvY2tfdCBfX2ttcF9pdHRfZGVidWdfbG9jazsKKyAgICAjZGVmaW5lIEtNUF9JVFRfREVCVUdfTE9DSygpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiBfX2ttcF9pdHRfZGVidWdfbG9jayApOyAgICAgIFwKKyAgICB9CisgICAgI2RlZmluZSBLTVBfSVRUX0RFQlVHX1BSSU5UKCAuLi4gKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIiMlMDJkOiAiLCBfX2ttcF9nZXRfZ3RpZCgpICk7ICAgICAgICAgICAgICBcCisgICAgICAgIGZwcmludGYoIHN0ZGVyciwgX19WQV9BUkdTX18gKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZmbHVzaCggc3RkZXJyICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfaXR0X2RlYnVnX2xvY2sgKTsgICAgICBcCisgICAgfQorI2Vsc2UKKyAgICAjZGVmaW5lIEtNUF9JVFRfREVCVUdfTE9DSygpCisgICAgI2RlZmluZSBLTVBfSVRUX0RFQlVHX1BSSU5UKCAuLi4gKQorI2VuZGlmIC8vIEtNUF9JVFRfREVCVUcKKworLy8gRW5zdXJlIHRoYXQgdGhlIGZ1bmN0aW9ucyBhcmUgc3RhdGljIGlmIHRoZXkncmUgc3VwcG9zZWQgdG8gYmUKKy8vIGJlaW5nIGlubGluZWQuIE90aGVyd2lzZSB0aGV5IGNhbm5vdCBiZSB1c2VkIGluIG1vcmUgdGhhbiBvbmUgZmlsZSwKKy8vIHNpbmNlIHRoZXJlIHdpbGwgYmUgbXVsdGlwbGUgZGVmaW5pdGlvbnMuCisjaWYgS01QX0RFQlVHCisjIGRlZmluZSBMSU5LQUdFCisjZWxzZQorIyBkZWZpbmUgTElOS0FHRSBzdGF0aWMgaW5saW5lCisjZW5kaWYKKworLy8gWkNBIGludGVyZmFjZSB1c2VkIGJ5IEludGVsKFIpIEluc3BlY3Rvci4gSW50ZWwoUikgUGFyYWxsZWwgQW1wbGlmaWVyIHVzZXMgdGhpcworLy8gQVBJIHRvIHN1cHBvcnQgdXNlci1kZWZpbmVkIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzLCBidXQgZG9lcyBub3QgdXNlIFpDQTsKKy8vIGl0IHdvdWxkIGJlIHNhZmUgdG8gdHVybiB0aGlzIG9mZiB1bnRpbCB3aWRlciBzdXBwb3J0IGJlY29tZXMgYXZhaWxhYmxlLgorI2lmIFVTRV9JVFRfWkNBCisjaWZkZWYgX19JTlRFTF9DT01QSUxFUgorIyAgIGlmIF9fSU5URUxfQ09NUElMRVIgPj0gMTIwMAorIyAgICAgICB1bmRlZiBfX2l0dF9zeW5jX2FjcXVpcmVkCisjICAgICAgIHVuZGVmIF9faXR0X3N5bmNfcmVsZWFzaW5nCisjICAgICAgIGRlZmluZSBfX2l0dF9zeW5jX2FjcXVpcmVkKGFkZHIpICAgIF9fbm90aWZ5X3pjX2ludHJpbnNpYygoY2hhciAqKSJzeW5jX2FjcXVpcmVkIiwgYWRkcikKKyMgICAgICAgZGVmaW5lIF9faXR0X3N5bmNfcmVsZWFzaW5nKGFkZHIpICAgX19ub3RpZnlfaW50cmluc2ljKChjaGFyICopInN5bmNfcmVsZWFzaW5nIiwgYWRkcikKKyMgICBlbmRpZgorI2VuZGlmCisjZW5kaWYKKworc3RhdGljIGttcF9ib290c3RyYXBfbG9ja190ICBtZXRhZGF0YV9sb2NrID0gS01QX0JPT1RTVFJBUF9MT0NLX0lOSVRJQUxJWkVSKCBtZXRhZGF0YV9sb2NrICk7CisKKy8qCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgUGFyYWxsZWwgcmVnaW9uIHJlcG9ydGluZy4KKworICAgICAgICAqIF9fa21wX2l0dF9yZWdpb25fZm9ya2luZyBzaG91bGQgYmUgY2FsbGVkIGJ5IG1hc3RlciB0aHJlYWQgb2YgYSB0ZWFtLiBFeGFjdCBtb21lbnQgb2YKKyAgICAgICAgICBjYWxsIGRvZXMgbm90IG1hdHRlciwgYnV0IGl0IHNob3VsZCBiZSBjb21wbGV0ZWQgYmVmb3JlIGFueSB0aHJlYWQgb2YgdGhpcyB0ZWFtIGNhbGxzCisgICAgICAgICAgX19rbXBfaXR0X3JlZ2lvbl9zdGFydGluZy4KKyAgICAgICAgKiBfX2ttcF9pdHRfcmVnaW9uX3N0YXJ0aW5nIHNob3VsZCBiZSBjYWxsZWQgYnkgZWFjaCB0aHJlYWQgb2YgYSB0ZWFtIGp1c3QgYmVmb3JlIGVudGVyaW5nCisgICAgICAgICAgcGFyYWxsZWwgcmVnaW9uIGJvZHkuCisgICAgICAgICogX19rbXBfaXR0X3JlZ2lvbl9maW5pc2hlZCBzaG91bGQgYmUgY2FsbGVkIGJ5IGVhY2ggdGhyZWFkIG9mIGEgdGVhbSByaWdodCBhZnRlciByZXR1cm5pbmcKKyAgICAgICAgICBmcm9tIHBhcmFsbGVsIHJlZ2lvbiBib2R5LgorICAgICAgICAqIF9fa21wX2l0dF9yZWdpb25fam9pbmVkIHNob3VsZCBiZSBjYWxsZWQgYnkgbWFzdGVyIHRocmVhZCBvZiBhIHRlYW0sIGFmdGVyIGFsbCB0aHJlYWRzCisgICAgICAgICAgY2FsbGVkIF9fa21wX2l0dF9yZWdpb25fZmluaXNoZWQuCisKKyAgICBOb3RlOiBUaHJlYWQgd2FpdGluZyBhdCBqb2luIGJhcnJpZXIgKGFmdGVyIF9fa21wX2l0dF9yZWdpb25fZmluaXNoZWQpIGNhbiBleGVjdXRlIHNvbWUgbW9yZQorICAgIHVzZXIgY29kZSAtLSBzdWNoIGEgdGhyZWFkIGNhbiBleGVjdXRlIHRhc2tzLgorCisgICAgTm90ZTogVGhlIG92ZXJoZWFkIG9mIGxvZ2dpbmcgcmVnaW9uX3N0YXJ0aW5nIGFuZCByZWdpb25fZmluaXNoZWQgaW4gZWFjaCB0aHJlYWQgaXMgdG9vIGxhcmdlLAorICAgIHNvIHRoZXNlIGNhbGxzIGFyZSBub3QgdXNlZC4KKworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMSU5LQUdFIHZvaWQKK19fa21wX2l0dF9yZWdpb25fZm9ya2luZyggaW50IGd0aWQsIGludCB0ZWFtX3NpemUsIGludCBiYXJyaWVycywgaW50IHNlcmlhbGl6ZWQgKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBrbXBfdGVhbV90ICogICAgICB0ZWFtID0gX19rbXBfdGVhbV9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICBpZiAodGVhbS0+dC50X2FjdGl2ZV9sZXZlbCArIHNlcmlhbGl6ZWQgPiAxKQorICAgIHsKKyAgICAgICAgLy8gVGhlIGZyYW1lIG5vdGlmaWNhdGlvbnMgYXJlIG9ubHkgc3VwcG9ydGVkIGZvciB0aGUgb3V0ZXJtb3N0IHRlYW1zLgorICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlkZW50X3QgKiAgICAgICAgIGxvYyAgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKCBndGlkICktPnRoLnRoX2lkZW50OworICAgIGlmIChsb2MpIHsKKyAgICAgICAgLy8gVXNlIHRoZSByZXNlcnZlZF8yIGZpZWxkIHRvIHN0b3JlIHRoZSBpbmRleCB0byB0aGUgcmVnaW9uIGRvbWFpbi4KKyAgICAgICAgLy8gQXNzdW1lIHRoYXQgcmVzZXJ2ZWRfMiBjb250YWlucyB6ZXJvIGluaXRpYWxseS4gIFNpbmNlIHplcm8gaXMgc3BlY2lhbAorICAgICAgICAvLyB2YWx1ZSBoZXJlLCBzdG9yZSB0aGUgaW5kZXggaW50byBkb21haW4gYXJyYXkgaW5jcmVhc2VkIGJ5IDEuCisgICAgICAgIGlmIChsb2MtPnJlc2VydmVkXzIgPT0gMCkgeworICAgICAgICAgICAgaWYgKF9fa21wX3JlZ2lvbl9kb21haW5fY291bnQgPCBLTVBfTUFYX0ZSQU1FX0RPTUFJTlMpIHsKKyAgICAgICAgICAgICAgICBpbnQgZnJtID0gS01QX1RFU1RfVEhFTl9JTkMzMiggJiBfX2ttcF9yZWdpb25fZG9tYWluX2NvdW50ICk7IC8vIGdldCAib2xkIiB2YWx1ZQorICAgICAgICAgICAgICAgIGlmIChmcm0gPj0gS01QX01BWF9GUkFNRV9ET01BSU5TKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9URVNUX1RIRU5fREVDMzIoICYgX19rbXBfcmVnaW9uX2RvbWFpbl9jb3VudCApOyAgICAgICAvLyByZXZlcnQgdGhlIGNvdW50CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgLy8gbG9jLT5yZXNlcnZlZF8yIGlzIHN0aWxsIDAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy9pZiAoIUtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMiggJmxvYy0+cmVzZXJ2ZWRfMiwgMCwgZnJtICsgMSApKSB7CisgICAgICAgICAgICAgICAgLy8gICAgZnJtID0gbG9jLT5yZXNlcnZlZF8yIC0gMTsgICAvLyBnZXQgdmFsdWUgc2F2ZWQgYnkgb3RoZXIgdGhyZWFkIGZvciBzYW1lIGxvYworICAgICAgICAgICAgICAgIC8vfSAvLyBBQzogdGhpcyBibG9jayBpcyB0byByZXBsYWNlIG5leHQgdW5zeW5jaHJvbml6ZWQgbGluZQorCisgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBzYXZlIGluZGV4ZXMgZm9yIGJvdGggcmVnaW9uIGFuZCBiYXJyaWVyIGZyYW1lcy4gV2UnbGwgdXNlIGxvYy0+cmVzZXJ2ZWRfMgorICAgICAgICAgICAgICAgIC8vIGZpZWxkIGJ1dCBwdXQgcmVnaW9uIGluZGV4IHRvIHRoZSBsb3cgdHdvIGJ5dGVzIGFuZCBiYXJyaWVyIGluZGV4ZXMgdG8gdGhlIGhpZ2gKKyAgICAgICAgICAgICAgICAvLyB0d28gYnl0ZXMuIEl0IGlzIE9LIGJlY2F1c2UgS01QX01BWF9GUkFNRV9ET01BSU5TID0gNTEyLgorICAgICAgICAgICAgICAgIGxvYy0+cmVzZXJ2ZWRfMiB8PSAoZnJtICsgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSAibmV3IiB2YWx1ZQorCisgICAgICAgICAgICAgICAgLy8gVHJhbnNmb3JtIGNvbXBpbGVyLWdlbmVyYXRlZCByZWdpb24gbG9jYXRpb24gaW50byB0aGUgZm9ybWF0CisgICAgICAgICAgICAgICAgLy8gdGhhdCB0aGUgdG9vbHMgbW9yZSBvciBsZXNzIHN0YW5kYXJkaXplZCBvbjoKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGZ1bmM+JG9tcCRwYXJhbGxlbEBbZmlsZTpdPGxpbmU+Wzo8Y29sPl0iCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmYgPSBOVUxMOworICAgICAgICAgICAgICAgIGttcF9zdHJfbG9jX3Qgc3RyX2xvYyA9IF9fa21wX3N0cl9sb2NfaW5pdCggbG9jLT5wc291cmNlLCAxICk7CisgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoIiVzJG9tcCRwYXJhbGxlbDolZEAlczolZDolZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2xvYy5mdW5jLCB0ZWFtX3NpemUsIHN0cl9sb2MuZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfbG9jLmxpbmUsIHN0cl9sb2MuY29sKTsKKworICAgICAgICAgICAgICAgIF9faXR0X3N1cHByZXNzX3B1c2goX19pdHRfc3VwcHJlc3NfbWVtb3J5X2Vycm9ycyk7CisgICAgICAgICAgICAgICAgX19rbXBfaXR0X3JlZ2lvbl9kb21haW5zWyBmcm0gXSA9IF9faXR0X2RvbWFpbl9jcmVhdGUoIGJ1ZmYgKTsKKyAgICAgICAgICAgICAgICBfX2l0dF9zdXBwcmVzc19wb3AoKTsKKworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgICAgIGlmKCBiYXJyaWVycyApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9fa21wX2JhcnJpZXJfZG9tYWluX2NvdW50IDwgS01QX01BWF9GUkFNRV9ET01BSU5TKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJtID0gS01QX1RFU1RfVEhFTl9JTkMzMiggJiBfX2ttcF9iYXJyaWVyX2RvbWFpbl9jb3VudCApOyAvLyBnZXQgIm9sZCIgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcm0gPj0gS01QX01BWF9GUkFNRV9ET01BSU5TKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX1RFU1RfVEhFTl9ERUMzMiggJiBfX2ttcF9iYXJyaWVyX2RvbWFpbl9jb3VudCApOyAgICAgICAvLyByZXZlcnQgdGhlIGNvdW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAvLyBsb2MtPnJlc2VydmVkXzIgaXMgc3RpbGwgMAorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmYgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoIiVzJG9tcCRiYXJyaWVyQCVzOiVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9sb2MuZnVuYywgc3RyX2xvYy5maWxlLCBzdHJfbG9jLmNvbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2l0dF9zdXBwcmVzc19wdXNoKF9faXR0X3N1cHByZXNzX21lbW9yeV9lcnJvcnMpOworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfaXR0X2JhcnJpZXJfZG9tYWluc1sgZnJtIF0gPSBfX2l0dF9kb21haW5fY3JlYXRlKCBidWZmICk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2l0dF9zdXBwcmVzc19wb3AoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2F2ZSB0aGUgYmFycmllciBmcmFtZSBpbmRleCB0byB0aGUgaGlnaCB0d28gYnl0ZXMuCisgICAgICAgICAgICAgICAgICAgICAgICBsb2MtPnJlc2VydmVkXzIgfD0gKGZybSArIDEpIDw8IDE2OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9sb2NfZnJlZSggJnN0cl9sb2MgKTsKKyAgICAgICAgICAgICAgICBfX2l0dF9mcmFtZV9iZWdpbl92MyhfX2ttcF9pdHRfcmVnaW9uX2RvbWFpbnNbIGZybSBdLCBOVUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsgLy8gUmVnaW9uIGRvbWFpbiBleGlzdHMgZm9yIHRoaXMgbG9jYXRpb24KKyAgICAgICAgICAgIC8vIENoZWNrIGlmIHRlYW0gc2l6ZSB3YXMgY2hhbmdlZC4gVGhlbiBjcmVhdGUgbmV3IHJlZ2lvbiBkb21haW4gZm9yIHRoaXMgbG9jYXRpb24KKyAgICAgICAgICAgIGludCBmcm0gPSAobG9jLT5yZXNlcnZlZF8yICYgMHgwMDAwRkZGRikgLSAxOworICAgICAgICAgICAgaWYoIF9fa21wX2l0dF9yZWdpb25fdGVhbV9zaXplW2ZybV0gIT0gdGVhbV9zaXplICkgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmID0gTlVMTDsKKyAgICAgICAgICAgICAgICBrbXBfc3RyX2xvY190IHN0cl9sb2MgPSBfX2ttcF9zdHJfbG9jX2luaXQoIGxvYy0+cHNvdXJjZSwgMSApOworICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KCIlcyRvbXAkcGFyYWxsZWw6JWRAJXM6JWQ6JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9sb2MuZnVuYywgdGVhbV9zaXplLCBzdHJfbG9jLmZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2xvYy5saW5lLCBzdHJfbG9jLmNvbCk7CisKKyAgICAgICAgICAgICAgICBfX2l0dF9zdXBwcmVzc19wdXNoKF9faXR0X3N1cHByZXNzX21lbW9yeV9lcnJvcnMpOworICAgICAgICAgICAgICAgIF9fa21wX2l0dF9yZWdpb25fZG9tYWluc1sgZnJtIF0gPSBfX2l0dF9kb21haW5fY3JlYXRlKCBidWZmICk7CisgICAgICAgICAgICAgICAgX19pdHRfc3VwcHJlc3NfcG9wKCk7CisKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfbG9jX2ZyZWUoICZzdHJfbG9jICk7CisgICAgICAgICAgICAgICAgX19rbXBfaXR0X3JlZ2lvbl90ZWFtX3NpemVbZnJtXSA9IHRlYW1fc2l6ZTsKKyAgICAgICAgICAgICAgICBfX2l0dF9mcmFtZV9iZWdpbl92MyhfX2ttcF9pdHRfcmVnaW9uX2RvbWFpbnNbZnJtXSwgTlVMTCk7CisgICAgICAgICAgICB9IGVsc2UgeyAvLyBUZWFtIHNpemUgd2FzIG5vdCBjaGFuZ2VkLiBVc2UgZXhpc3RpbmcgZG9tYWluLgorICAgICAgICAgICAgICAgIF9faXR0X2ZyYW1lX2JlZ2luX3YzKF9fa21wX2l0dF9yZWdpb25fZG9tYWluc1tmcm1dLCBOVUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltmcm0gYmVnXSBndGlkPSVkLCBpZHg9JXgsIHNlcmlhbGl6ZWQ6JWQsIGxvYzolcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCBsb2MtPnJlc2VydmVkXzIsIHNlcmlhbGl6ZWQsIGxvYyApOworICAgIH0KKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfcmVnaW9uX2ZvcmtpbmcKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMSU5LQUdFIHZvaWQKK19fa21wX2l0dF9mcmFtZV9zdWJtaXQoIGludCBndGlkLCBfX2l0dF90aW1lc3RhbXAgYmVnaW4sIF9faXR0X3RpbWVzdGFtcCBlbmQsIGludCBpbWJhbGFuY2UsIGlkZW50X3QgKiBsb2MsIGludCB0ZWFtX3NpemUsIGludCByZWdpb24gKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiggcmVnaW9uICkgeworICAgICAgICBrbXBfdGVhbV90ICogICAgICB0ZWFtID0gX19rbXBfdGVhbV9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICAgICAgaW50IHNlcmlhbGl6ZWQgPSAoIHJlZ2lvbiA9PSAyID8gMSA6IDAgKTsKKyAgICAgICAgaWYgKHRlYW0tPnQudF9hY3RpdmVfbGV2ZWwgKyBzZXJpYWxpemVkID4gMSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVGhlIGZyYW1lIG5vdGlmaWNhdGlvbnMgYXJlIG9ubHkgc3VwcG9ydGVkIGZvciB0aGUgb3V0ZXJtb3N0IHRlYW1zLgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgICAvL0NoZWNrIHJlZ2lvbiBkb21haW4gaGFzIG5vdCBiZWVuIGNyZWF0ZWQgYmVmb3JlLiBJdCdzIGluZGV4IGlzIHNhdmVkIGluIHRoZSBsb3cgdHdvIGJ5dGVzLgorICAgICAgICAgaWYgKChsb2MtPnJlc2VydmVkXzIgJiAweDAwMDBGRkZGKSA9PSAwKSB7CisgICAgICAgICAgICAgaWYgKF9fa21wX3JlZ2lvbl9kb21haW5fY291bnQgPCBLTVBfTUFYX0ZSQU1FX0RPTUFJTlMpIHsKKyAgICAgICAgICAgICAgICAgaW50IGZybSA9IEtNUF9URVNUX1RIRU5fSU5DMzIoICYgX19rbXBfcmVnaW9uX2RvbWFpbl9jb3VudCApOyAvLyBnZXQgIm9sZCIgdmFsdWUKKyAgICAgICAgICAgICAgICAgaWYgKGZybSA+PSBLTVBfTUFYX0ZSQU1FX0RPTUFJTlMpIHsKKyAgICAgICAgICAgICAgICAgICAgIEtNUF9URVNUX1RIRU5fREVDMzIoICYgX19rbXBfcmVnaW9uX2RvbWFpbl9jb3VudCApOyAgICAgICAvLyByZXZlcnQgdGhlIGNvdW50CisgICAgICAgICAgICAgICAgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYy0+cmVzZXJ2ZWRfMiBpcyBzdGlsbCAwCisgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHNhdmUgaW5kZXhlcyBmb3IgYm90aCByZWdpb24gYW5kIGJhcnJpZXIgZnJhbWVzLiBXZSdsbCB1c2UgbG9jLT5yZXNlcnZlZF8yCisgICAgICAgICAgICAgICAgIC8vIGZpZWxkIGJ1dCBwdXQgcmVnaW9uIGluZGV4IHRvIHRoZSBsb3cgdHdvIGJ5dGVzIGFuZCBiYXJyaWVyIGluZGV4ZXMgdG8gdGhlIGhpZ2gKKyAgICAgICAgICAgICAgICAgLy8gdHdvIGJ5dGVzLiBJdCBpcyBPSyBiZWNhdXNlIEtNUF9NQVhfRlJBTUVfRE9NQUlOUyA9IDUxMi4KKyAgICAgICAgICAgICAgICAgbG9jLT5yZXNlcnZlZF8yIHw9IChmcm0gKyAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzYXZlICJuZXciIHZhbHVlCisKKyAgICAgICAgICAgICAgICAgLy8gVHJhbnNmb3JtIGNvbXBpbGVyLWdlbmVyYXRlZCByZWdpb24gbG9jYXRpb24gaW50byB0aGUgZm9ybWF0CisgICAgICAgICAgICAgICAgIC8vIHRoYXQgdGhlIHRvb2xzIG1vcmUgb3IgbGVzcyBzdGFuZGFyZGl6ZWQgb246CisgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8ZnVuYz4kb21wJHBhcmFsbGVsOnRlYW1fc2l6ZUBbZmlsZTpdPGxpbmU+Wzo8Y29sPl0iCisgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmID0gTlVMTDsKKyAgICAgICAgICAgICAgICAga21wX3N0cl9sb2NfdCBzdHJfbG9jID0gX19rbXBfc3RyX2xvY19pbml0KCBsb2MtPnBzb3VyY2UsIDEgKTsKKyAgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoIiVzJG9tcCRwYXJhbGxlbDolZEAlczolZDolZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9sb2MuZnVuYywgdGVhbV9zaXplLCBzdHJfbG9jLmZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9sb2MubGluZSwgc3RyX2xvYy5jb2wpOworCisgICAgICAgICAgICAgICAgIF9faXR0X3N1cHByZXNzX3B1c2goX19pdHRfc3VwcHJlc3NfbWVtb3J5X2Vycm9ycyk7CisgICAgICAgICAgICAgICAgIF9fa21wX2l0dF9yZWdpb25fZG9tYWluc1sgZnJtIF0gPSBfX2l0dF9kb21haW5fY3JlYXRlKCBidWZmICk7CisgICAgICAgICAgICAgICAgIF9faXR0X3N1cHByZXNzX3BvcCgpOworCisgICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgICAgICBfX2ttcF9zdHJfbG9jX2ZyZWUoICZzdHJfbG9jICk7CisgICAgICAgICAgICAgICAgIF9fa21wX2l0dF9yZWdpb25fdGVhbV9zaXplW2ZybV0gPSB0ZWFtX3NpemU7CisgICAgICAgICAgICAgICAgIF9faXR0X2ZyYW1lX3N1Ym1pdF92MyhfX2ttcF9pdHRfcmVnaW9uX2RvbWFpbnNbIGZybSBdLCBOVUxMLCBiZWdpbiwgZW5kICk7CisgICAgICAgICAgICAgfQorICAgICAgICAgfSBlbHNlIHsgLy8gUmVnaW9uIGRvbWFpbiBleGlzdHMgZm9yIHRoaXMgbG9jYXRpb24KKyAgICAgICAgICAgICAvLyBDaGVjayBpZiB0ZWFtIHNpemUgd2FzIGNoYW5nZWQuIFRoZW4gY3JlYXRlIG5ldyByZWdpb24gZG9tYWluIGZvciB0aGlzIGxvY2F0aW9uCisgICAgICAgICAgICAgaW50IGZybSA9IChsb2MtPnJlc2VydmVkXzIgJiAweDAwMDBGRkZGKSAtIDE7CisgICAgICAgICAgICAgaWYoIF9fa21wX2l0dF9yZWdpb25fdGVhbV9zaXplW2ZybV0gIT0gdGVhbV9zaXplICkgeworICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZiA9IE5VTEw7CisgICAgICAgICAgICAgICAgIGttcF9zdHJfbG9jX3Qgc3RyX2xvYyA9IF9fa21wX3N0cl9sb2NfaW5pdCggbG9jLT5wc291cmNlLCAxICk7CisgICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KCIlcyRvbXAkcGFyYWxsZWw6JWRAJXM6JWQ6JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfbG9jLmZ1bmMsIHRlYW1fc2l6ZSwgc3RyX2xvYy5maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfbG9jLmxpbmUsIHN0cl9sb2MuY29sKTsKKworICAgICAgICAgICAgICAgICBfX2l0dF9zdXBwcmVzc19wdXNoKF9faXR0X3N1cHByZXNzX21lbW9yeV9lcnJvcnMpOworICAgICAgICAgICAgICAgICBfX2ttcF9pdHRfcmVnaW9uX2RvbWFpbnNbIGZybSBdID0gX19pdHRfZG9tYWluX2NyZWF0ZSggYnVmZiApOworICAgICAgICAgICAgICAgICBfX2l0dF9zdXBwcmVzc19wb3AoKTsKKworICAgICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2xvY19mcmVlKCAmc3RyX2xvYyApOworICAgICAgICAgICAgICAgICBfX2ttcF9pdHRfcmVnaW9uX3RlYW1fc2l6ZVtmcm1dID0gdGVhbV9zaXplOworICAgICAgICAgICAgICAgICBfX2l0dF9mcmFtZV9zdWJtaXRfdjMoX19rbXBfaXR0X3JlZ2lvbl9kb21haW5zWyBmcm0gXSwgTlVMTCwgYmVnaW4sIGVuZCApOworICAgICAgICAgICAgIH0gZWxzZSB7IC8vIFRlYW0gc2l6ZSB3YXMgbm90IGNoYW5nZWQuIFVzZSBleGlzdGluZyBkb21haW4uCisgICAgICAgICAgICAgICAgIF9faXR0X2ZyYW1lX3N1Ym1pdF92MyhfX2ttcF9pdHRfcmVnaW9uX2RvbWFpbnNbIGZybSBdLCBOVUxMLCBiZWdpbiwgZW5kICk7CisgICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW3JlZyBzdWJdIGd0aWQ9JWQsIGlkeD0leCwgcmVnaW9uOiVkLCBsb2M6JXAsIGJlZzolbGx1LCBlbmQ6JWxsdVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgbG9jLT5yZXNlcnZlZF8yLCByZWdpb24sIGxvYywgYmVnaW4sIGVuZCApOworICAgICAgICAgcmV0dXJuOworICAgIH0gZWxzZSB7IC8vIGNhbGxlZCBmb3IgYmFycmllciByZXBvcnRpbmcKKyAgICAgICAgaWYgKGxvYykgeworICAgICAgICAgICAgaWYgKChsb2MtPnJlc2VydmVkXzIgJiAweEZGRkYwMDAwKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKF9fa21wX2JhcnJpZXJfZG9tYWluX2NvdW50IDwgS01QX01BWF9GUkFNRV9ET01BSU5TKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBmcm0gPSBLTVBfVEVTVF9USEVOX0lOQzMyKCAmIF9fa21wX2JhcnJpZXJfZG9tYWluX2NvdW50ICk7IC8vIGdldCAib2xkIiB2YWx1ZQorICAgICAgICAgICAgICAgICAgICBpZiAoZnJtID49IEtNUF9NQVhfRlJBTUVfRE9NQUlOUykgeworICAgICAgICAgICAgICAgICAgICAgICAgS01QX1RFU1RfVEhFTl9ERUMzMiggJiBfX2ttcF9iYXJyaWVyX2RvbWFpbl9jb3VudCApOyAgICAgICAvLyByZXZlcnQgdGhlIGNvdW50CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYy0+cmVzZXJ2ZWRfMiBpcyBzdGlsbCAwCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gU2F2ZSB0aGUgYmFycmllciBmcmFtZSBpbmRleCB0byB0aGUgaGlnaCB0d28gYnl0ZXMuCisgICAgICAgICAgICAgICAgICAgIGxvYy0+cmVzZXJ2ZWRfMiB8PSAoZnJtICsgMSkgPDwgMTY7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzYXZlICJuZXciIHZhbHVlCisKKyAgICAgICAgICAgICAgICAgICAgLy8gVHJhbnNmb3JtIGNvbXBpbGVyLWdlbmVyYXRlZCByZWdpb24gbG9jYXRpb24gaW50byB0aGUgZm9ybWF0CisgICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgdGhlIHRvb2xzIG1vcmUgb3IgbGVzcyBzdGFuZGFyZGl6ZWQgb246CisgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8ZnVuYz4kb21wJGZyYW1lQFtmaWxlOl08bGluZT5bOjxjb2w+XSIKKyAgICAgICAgICAgICAgICAgICAga21wX3N0cl9sb2NfdCBzdHJfbG9jID0gX19rbXBfc3RyX2xvY19pbml0KCBsb2MtPnBzb3VyY2UsIDEgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGltYmFsYW5jZSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmX2ltYiA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBidWZmX2ltYiA9IF9fa21wX3N0cl9mb3JtYXQoIiVzJG9tcCRiYXJyaWVyLWltYmFsYW5jZTolZEAlczolZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfbG9jLmZ1bmMsIHRlYW1fc2l6ZSwgc3RyX2xvYy5maWxlLCBzdHJfbG9jLmNvbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2l0dF9zdXBwcmVzc19wdXNoKF9faXR0X3N1cHByZXNzX21lbW9yeV9lcnJvcnMpOworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfaXR0X2ltYmFsYW5jZV9kb21haW5zWyBmcm0gXSA9IF9faXR0X2RvbWFpbl9jcmVhdGUoIGJ1ZmZfaW1iICk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2l0dF9zdXBwcmVzc19wb3AoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9faXR0X2ZyYW1lX3N1Ym1pdF92MyhfX2ttcF9pdHRfaW1iYWxhbmNlX2RvbWFpbnNbIGZybSBdLCBOVUxMLCBiZWdpbiwgZW5kICk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmZfaW1iICk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZiA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgiJXMkb21wJGJhcnJpZXJAJXM6JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2xvYy5mdW5jLCBzdHJfbG9jLmZpbGUsIHN0cl9sb2MuY29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9faXR0X3N1cHByZXNzX3B1c2goX19pdHRfc3VwcHJlc3NfbWVtb3J5X2Vycm9ycyk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9pdHRfYmFycmllcl9kb21haW5zWyBmcm0gXSA9IF9faXR0X2RvbWFpbl9jcmVhdGUoIGJ1ZmYgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9faXR0X3N1cHByZXNzX3BvcCgpOworICAgICAgICAgICAgICAgICAgICAgICAgX19pdHRfZnJhbWVfc3VibWl0X3YzKF9fa21wX2l0dF9iYXJyaWVyX2RvbWFpbnNbIGZybSBdLCBOVUxMLCBiZWdpbiwgZW5kICk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdHJfbG9jX2ZyZWUoICZzdHJfbG9jICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsgLy8gaWYgaXQgaXMgbm90IDAgdGhlbiBpdCBzaG91bGQgYmUgPD0gS01QX01BWF9GUkFNRV9ET01BSU5TCisgICAgICAgICAgICAgICAgaWYoIGltYmFsYW5jZSApIHsKKyAgICAgICAgICAgICAgICAgICAgX19pdHRfZnJhbWVfc3VibWl0X3YzKF9fa21wX2l0dF9pbWJhbGFuY2VfZG9tYWluc1sgKGxvYy0+cmVzZXJ2ZWRfMiA+PiAxNikgLSAxIF0sIE5VTEwsIGJlZ2luLCBlbmQgKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBfX2l0dF9mcmFtZV9zdWJtaXRfdjMoX19rbXBfaXR0X2JhcnJpZXJfZG9tYWluc1sobG9jLT5yZXNlcnZlZF8yID4+IDE2KSAtIDFdLCBOVUxMLCBiZWdpbiwgZW5kICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgICAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW2ZybSBzdWJdIGd0aWQ9JWQsIGlkeD0leCwgbG9jOiVwLCBiZWc6JWxsdSwgZW5kOiVsbHVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIGxvYy0+cmVzZXJ2ZWRfMiwgbG9jLCBiZWdpbiwgZW5kICk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKK30gLy8gX19rbXBfaXR0X2ZyYW1lX3N1Ym1pdAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0xJTktBR0Ugdm9pZAorX19rbXBfaXR0X21ldGFkYXRhX2ltYmFsYW5jZSggaW50IGd0aWQsIGttcF91aW50NjQgYmVnaW4sIGttcF91aW50NjQgZW5kLCBrbXBfdWludDY0IGltYmFsYW5jZSwga21wX3VpbnQ2NCByZWR1Y3Rpb24gKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiggbWV0YWRhdGFfZG9tYWluID09IE5VTEwpIHsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiBtZXRhZGF0YV9sb2NrICk7CisgICAgICAgIGlmKCBtZXRhZGF0YV9kb21haW4gPT0gTlVMTCkgeworICAgICAgICAgICAgX19pdHRfc3VwcHJlc3NfcHVzaChfX2l0dF9zdXBwcmVzc19tZW1vcnlfZXJyb3JzKTsKKyAgICAgICAgICAgIG1ldGFkYXRhX2RvbWFpbiA9IF9faXR0X2RvbWFpbl9jcmVhdGUoICJPTVAgTWV0YWRhdGEiICk7CisgICAgICAgICAgICBfX2l0dF9zdXBwcmVzc19wb3AoKTsKKyAgICAgICAgfQorICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIG1ldGFkYXRhX2xvY2sgKTsKKyAgICB9CisKKyAgICBfX2l0dF9zdHJpbmdfaGFuZGxlICogc3RyaW5nX2hhbmRsZSA9IF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlKCAib21wX21ldGFkYXRhX2ltYmFsYW5jZSIpOworCisgICAga21wX3VpbnQ2NCBpbWJhbGFuY2VfZGF0YVsgNCBdOworICAgIGltYmFsYW5jZV9kYXRhWyAwIF0gPSBiZWdpbjsKKyAgICBpbWJhbGFuY2VfZGF0YVsgMSBdID0gZW5kOworICAgIGltYmFsYW5jZV9kYXRhWyAyIF0gPSBpbWJhbGFuY2U7CisgICAgaW1iYWxhbmNlX2RhdGFbIDMgXSA9IHJlZHVjdGlvbjsKKworICAgIF9faXR0X21ldGFkYXRhX2FkZChtZXRhZGF0YV9kb21haW4sIF9faXR0X251bGwsIHN0cmluZ19oYW5kbGUsIF9faXR0X21ldGFkYXRhX3U2NCwgNCwgaW1iYWxhbmNlX2RhdGEpOworI2VuZGlmCit9IC8vIF9fa21wX2l0dF9tZXRhZGF0YV9pbWJhbGFuY2UKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMSU5LQUdFIHZvaWQKK19fa21wX2l0dF9tZXRhZGF0YV9sb29wKCBpZGVudF90ICogbG9jLCBrbXBfdWludDY0IHNjaGVkX3R5cGUsIGttcF91aW50NjQgaXRlcmF0aW9ucywga21wX3VpbnQ2NCBjaHVuayApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmKCBtZXRhZGF0YV9kb21haW4gPT0gTlVMTCkgeworICAgICAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIG1ldGFkYXRhX2xvY2sgKTsKKyAgICAgICAgaWYoIG1ldGFkYXRhX2RvbWFpbiA9PSBOVUxMKSB7CisgICAgICAgICAgICBfX2l0dF9zdXBwcmVzc19wdXNoKF9faXR0X3N1cHByZXNzX21lbW9yeV9lcnJvcnMpOworICAgICAgICAgICAgbWV0YWRhdGFfZG9tYWluID0gX19pdHRfZG9tYWluX2NyZWF0ZSggIk9NUCBNZXRhZGF0YSIgKTsKKyAgICAgICAgICAgIF9faXR0X3N1cHByZXNzX3BvcCgpOworICAgICAgICB9CisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgbWV0YWRhdGFfbG9jayApOworICAgIH0KKworICAgIF9faXR0X3N0cmluZ19oYW5kbGUgKiBzdHJpbmdfaGFuZGxlID0gX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGUoICJvbXBfbWV0YWRhdGFfbG9vcCIpOworICAgIGttcF9zdHJfbG9jX3Qgc3RyX2xvYyA9IF9fa21wX3N0cl9sb2NfaW5pdCggbG9jLT5wc291cmNlLCAxICk7CisKKyAgICBrbXBfdWludDY0IGxvb3BfZGF0YVsgNSBdOworICAgIGxvb3BfZGF0YVsgMCBdID0gc3RyX2xvYy5saW5lOworICAgIGxvb3BfZGF0YVsgMSBdID0gc3RyX2xvYy5jb2w7CisgICAgbG9vcF9kYXRhWyAyIF0gPSBzY2hlZF90eXBlOworICAgIGxvb3BfZGF0YVsgMyBdID0gaXRlcmF0aW9uczsKKyAgICBsb29wX2RhdGFbIDQgXSA9IGNodW5rOworCisgICAgX19rbXBfc3RyX2xvY19mcmVlKCAmc3RyX2xvYyApOworCisgICAgX19pdHRfbWV0YWRhdGFfYWRkKG1ldGFkYXRhX2RvbWFpbiwgX19pdHRfbnVsbCwgc3RyaW5nX2hhbmRsZSwgX19pdHRfbWV0YWRhdGFfdTY0LCA1LCBsb29wX2RhdGEpOworI2VuZGlmCit9IC8vIF9fa21wX2l0dF9tZXRhZGF0YV9sb29wCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTElOS0FHRSB2b2lkCitfX2ttcF9pdHRfbWV0YWRhdGFfc2luZ2xlKCBpZGVudF90ICogbG9jICkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgaWYoIG1ldGFkYXRhX2RvbWFpbiA9PSBOVUxMKSB7CisgICAgICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgbWV0YWRhdGFfbG9jayApOworICAgICAgICBpZiggbWV0YWRhdGFfZG9tYWluID09IE5VTEwpIHsKKyAgICAgICAgICAgIF9faXR0X3N1cHByZXNzX3B1c2goX19pdHRfc3VwcHJlc3NfbWVtb3J5X2Vycm9ycyk7CisgICAgICAgICAgICBtZXRhZGF0YV9kb21haW4gPSBfX2l0dF9kb21haW5fY3JlYXRlKCAiT01QIE1ldGFkYXRhIiApOworICAgICAgICAgICAgX19pdHRfc3VwcHJlc3NfcG9wKCk7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiBtZXRhZGF0YV9sb2NrICk7CisgICAgfQorCisgICAgX19pdHRfc3RyaW5nX2hhbmRsZSAqIHN0cmluZ19oYW5kbGUgPSBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZSggIm9tcF9tZXRhZGF0YV9zaW5nbGUiKTsKKyAgICBrbXBfc3RyX2xvY190IHN0cl9sb2MgPSBfX2ttcF9zdHJfbG9jX2luaXQoIGxvYy0+cHNvdXJjZSwgMSApOworICAgIGttcF91aW50NjQgc2luZ2xlX2RhdGFbIDIgXTsKKyAgICBzaW5nbGVfZGF0YVsgMCBdID0gc3RyX2xvYy5saW5lOworICAgIHNpbmdsZV9kYXRhWyAxIF0gPSBzdHJfbG9jLmNvbDsKKworICAgIF9fa21wX3N0cl9sb2NfZnJlZSggJnN0cl9sb2MgKTsKKworICAgIF9faXR0X21ldGFkYXRhX2FkZChtZXRhZGF0YV9kb21haW4sIF9faXR0X251bGwsIHN0cmluZ19oYW5kbGUsIF9faXR0X21ldGFkYXRhX3U2NCwgMiwgc2luZ2xlX2RhdGEpOworI2VuZGlmCit9IC8vIF9fa21wX2l0dF9tZXRhZGF0YV9zaW5nbGUKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMSU5LQUdFIHZvaWQKK19fa21wX2l0dF9yZWdpb25fc3RhcnRpbmcoIGludCBndGlkICkgeworI2lmIFVTRV9JVFRfTk9USUZZCisjZW5kaWYKK30gLy8gX19rbXBfaXR0X3JlZ2lvbl9zdGFydGluZworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0xJTktBR0Ugdm9pZAorX19rbXBfaXR0X3JlZ2lvbl9maW5pc2hlZCggaW50IGd0aWQgKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfcmVnaW9uX2ZpbmlzaGVkCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTElOS0FHRSB2b2lkCitfX2ttcF9pdHRfcmVnaW9uX2pvaW5lZCggaW50IGd0aWQsIGludCBzZXJpYWxpemVkICkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAga21wX3RlYW1fdCAqICAgICAgdGVhbSA9IF9fa21wX3RlYW1fZnJvbV9ndGlkKCBndGlkICk7CisgICAgaWYgKHRlYW0tPnQudF9hY3RpdmVfbGV2ZWwgKyBzZXJpYWxpemVkID4gMSkKKyAgICB7CisgICAgICAgIC8vIFRoZSBmcmFtZSBub3RpZmljYXRpb25zIGFyZSBvbmx5IHN1cHBvcnRlZCBmb3IgdGhlIG91dGVybW9zdCB0ZWFtcy4KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZGVudF90ICogICAgICAgICBsb2MgID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZCggZ3RpZCApLT50aC50aF9pZGVudDsKKyAgICBpZiAobG9jICYmIGxvYy0+cmVzZXJ2ZWRfMikKKyAgICB7CisgICAgICAgIGludCBmcm0gPSAobG9jLT5yZXNlcnZlZF8yICYgMHgwMDAwRkZGRikgLSAxOworICAgICAgICBpZihmcm0gPCBLTVBfTUFYX0ZSQU1FX0RPTUFJTlMpIHsKKyAgICAgICAgICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgICAgICAgICAgX19pdHRfZnJhbWVfZW5kX3YzKF9fa21wX2l0dF9yZWdpb25fZG9tYWluc1tmcm1dLCBOVUxMKTsKKyAgICAgICAgICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbZnJtIGVuZF0gZ3RpZD0lZCwgaWR4PSV4LCBzZXJpYWxpemVkOiVkLCBsb2M6JXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgbG9jLT5yZXNlcnZlZF8yLCBzZXJpYWxpemVkLCBsb2MgKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfcmVnaW9uX2pvaW5lZAorCisvKgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEJhcnJpZXJzIHJlcG9ydGluZy4KKworICAgIEEgYmFycmllciBjb25zaXN0cyBvZiB0d28gcGhhc2VzOgorCisgICAgICAgIDEuIEdhdGhlciAtLSBtYXN0ZXIgd2FpdHMgZm9yIGFycml2aW5nIG9mIGFsbCB0aGUgd29ya2VyIHRocmVhZHM7IGVhY2ggd29ya2VyIHRocmVhZAorICAgICAgICAgICByZWdpc3RlcnMgYXJyaXZhbCBhbmQgZ29lcyBmdXJ0aGVyLgorICAgICAgICAyLiBSZWxlYXNlIC0tIGVhY2ggd29ya2VyIHRocmVhZHMgd2FpdHMgdW50aWwgbWFzdGVyIGxldHMgaXQgZ287IG1hc3RlciBsZXRzIHdvcmtlciB0aHJlYWRzCisgICAgICAgICAgIGdvLgorCisgICAgRnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBieSBlYWNoIHRocmVhZDoKKworICAgICAgICAqIF9fa21wX2l0dF9iYXJyaWVyX3N0YXJ0aW5nKCkgLS0gYmVmb3JlIGFycml2aW5nIHRvIHRoZSBnYXRoZXIgcGhhc2UuCisgICAgICAgICogX19rbXBfaXR0X2JhcnJpZXJfbWlkZGxlKCkgICAtLSBiZXR3ZWVuIGdhdGhlciBhbmQgcmVsZWFzZSBwaGFzZXMuCisgICAgICAgICogX19rbXBfaXR0X2JhcnJpZXJfZmluaXNoZWQoKSAtLSBhZnRlciByZWxlYXNlIHBoYXNlLgorCisgICAgTm90ZTogQ2FsbCBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoKSBiZWZvcmUgY2FsbCB0byBfX2ttcF9pdHRfYmFycmllcl9zdGFydGluZygpIGFuZCBzYXZlCisgICAgcmVzdWx0IGluIGxvY2FsIHZhcmlhYmxlLiBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoKSwgYmVpbmcgY2FsbGVkIHRvbyBsYXRlIChlLiBnLiBhZnRlciBnYXRoZXIKKyAgICBwaGFzZSkgd291bGQgcmV0dXJuIGl0dCBzeW5jIG9iamVjdCBmb3IgdGhlIG5leHQgYmFycmllciEKKworICAgIElUVCBuZWVkIGFuIGFkZHJlc3MgKHZvaWQgKikgdG8gYmUgc3BlY2lmaWVkIGFzIGEgc3luYyBvYmplY3QuIE9wZW5NUCBSVEwgZG9lcyBub3QgaGF2ZQorICAgIGJhcnJpZXIgb2JqZWN0IG9yIGJhcnJpZXIgZGF0YSBzdHJ1Y3R1cmUuIEJhcnJpZXIgaXMganVzdCBhIGNvdW50ZXIgaW4gdGVhbSBhbmQgdGhyZWFkCisgICAgc3RydWN0dXJlcy4gV2UgY291bGQgdXNlIGFuIGFkZHJlc3Mgb2YgdGVhbSBzdHJ1Y3R1cmUgYXMgYW4gYmFycmllciBzeW5jIG9iamVjdCwgYnV0IElUVCB3YW50cworICAgIGRpZmZlcmVudCBvYmplY3RzIGZvciBkaWZmZXJlbnQgYmFycmllcnMgKGV2ZW4gd2hpdGhpbiB0aGUgc2FtZSB0ZWFtKS4gU28gbGV0IHVzIHVzZQorICAgIHRlYW0gYWRkcmVzcyBhcyBiYXJyaWVyIHN5bmMgb2JqZWN0IGZvciB0aGUgZmlyc3QgYmFycmllciwgdGhlbiBpbmNyZWFzZSBpdCBieSBvbmUgZm9yIHRoZSBuZXh0CisgICAgYmFycmllciwgYW5kIHNvIG9uIChidXQgd3JhcCBpdCBub3QgdG8gdXNlIGFkZHJlc3NlcyBvdXRzaWRlIG9mIHRlYW0gc3RydWN0dXJlKS4KKworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKwordm9pZCAqCitfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoCisgICAgaW50ICBndGlkLAorICAgIGludCAgYnQsCisgICAgaW50ICBzZXRfbmFtZSwKKyAgICBpbnQgIGRlbHRhICAgIC8vIDAgKGN1cnJlbnQgYmFycmllcikgaXMgZGVmYXVsdCB2YWx1ZTsgc3BlY2lmeSAtMSB0byBnZXQgcHJldmlvdXMgYmFycmllci4KKykgeworICAgIHZvaWQgKiBvYmplY3QgPSBOVUxMOworI2lmIFVTRV9JVFRfTk9USUZZCisgICAga21wX2luZm9fdCAqICAgIHRociAgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKCBndGlkICk7CisgICAga21wX3RlYW1fdCAqICAgIHRlYW0gPSB0aHItPnRoLnRoX3RlYW07CisKKyAgICAvLyBOT1RFOgorICAgIC8vIElmIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBfX2ttcF9mb3JrX2JhcnJpZXIsIHRlYW0gcG9pbnRlciBjYW4gYmUgTlVMTC4gVGhpcyAiaWYiCisgICAgLy8gaGVscHMgdG8gYXZvaWQgY3Jhc2guIEhvd2V2ZXIsIHRoaXMgaXMgbm90IGNvbXBsZXRlIHNvbHV0aW9uLCBhbmQgcmVwb3J0aW5nIGZvcmsvam9pbgorICAgIC8vIGJhcnJpZXJzIHRvIElUVCBzaG91bGQgYmUgcmV2aXNpdGVkLgorCisgICAgaWYgKCB0ZWFtICE9IE5VTEwgKSB7CisKKyAgICAgICAgLy8gTWFzdGVyIHRocmVhZCBpbmNyZWFzZXMgYl9hcnJpdmVkIGJ5IEtNUF9CQVJSSUVSX1NUQVRFX0JVTVAgZWFjaCB0aW1lLiBEaXZpZGUgYl9hcnJpdmVkCisgICAgICAgIC8vIGJ5IEtNUF9CQVJSSUVSX1NUQVRFX0JVTVAgdG8gZ2V0IHBsYWluIGJhcnJpZXIgY291bnRlci4KKyAgICAgICAga21wX3VpbnQ2NCBjb3VudGVyID0gdGVhbS0+dC50X2JhclsgYnQgXS5iX2Fycml2ZWQgLyBLTVBfQkFSUklFUl9TVEFURV9CVU1QICsgZGVsdGE7CisgICAgICAgIC8vIE5vdyBmb3JtIHRoZSBiYXJyaWVyIGlkLiBFbmNvZGUgYmFycmllciB0eXBlIChidCkgaW4gYmFycmllciBpZCB0b28sIHNvIGJhcnJpZXJzIG9mCisgICAgICAgIC8vIGRpZmZlcmVudCB0eXBlcyBkbyBub3QgaGF2ZSB0aGUgc2FtZSBpZHMuCisgICAgICAgIEtNUF9CVUlMRF9BU1NFUlQoIHNpemVvZigga21wX3RlYW1fdCApID49IGJzX2xhc3RfYmFycmllciApOworICAgICAgICAgICAgLy8gVGhpcyBjb25kaXRvbiBpcyBhIG11c3QgKHdlIHdvdWxkIGhhdmUgemVybyBkaXZpZGUgb3RoZXJ3aXNlKS4KKyAgICAgICAgS01QX0JVSUxEX0FTU0VSVCggc2l6ZW9mKCBrbXBfdGVhbV90ICkgPj0gMiAqIGJzX2xhc3RfYmFycmllciApOworICAgICAgICAgICAgLy8gTW9yZSBzdHJvbmcgY29uZGl0aW9uOiBtYWtlIHN1cmUgd2UgaGF2ZSByb29tIGF0IGxlYXN0IGZvciBmb3IgdHdvIGRpZmZlcnRlbnQgaWRzCisgICAgICAgICAgICAvLyAoZm9yIGVhY2ggYmFycmllciB0eXBlKS4KKyAgICAgICAgb2JqZWN0ID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8IHZvaWQgKiA+KAorICAgICAgICAgICAgICAgIGttcF91aW50cHRyX3QoIHRlYW0gKQorICAgICAgICAgICAgICAgICAgICArIGNvdW50ZXIgJSAoIHNpemVvZigga21wX3RlYW1fdCApIC8gYnNfbGFzdF9iYXJyaWVyICkgKiBic19sYXN0X2JhcnJpZXIKKyAgICAgICAgICAgICAgICAgICAgKyBidAorICAgICAgICAgICAgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbYmFyIG9ial0gdHlwZT0lZCwgY291bnRlcj0lbGxkLCBvYmplY3Q9JXBcbiIsIGJ0LCBjb3VudGVyLCBvYmplY3QgKTsKKworICAgICAgICBpZiAoIHNldF9uYW1lICkgeworICAgICAgICAgICAgaWRlbnRfdCBjb25zdCAqIGxvYyAgPSBOVUxMOworICAgICAgICAgICAgY2hhciBjb25zdCAqICAgIHNyYyAgPSBOVUxMOworICAgICAgICAgICAgY2hhciBjb25zdCAqICAgIHR5cGUgPSAiT01QIEJhcnJpZXIiOworICAgICAgICAgICAgc3dpdGNoICggYnQgKSB7CisgICAgICAgICAgICAgICAgY2FzZSBic19wbGFpbl9iYXJyaWVyIDogeworICAgICAgICAgICAgICAgICAgICAvLyBGb3IgcGxhaW4gYmFycmllciBjb21waWxlciBjYWxscyBfX2ttcGNfYmFycmllcigpIGZ1bmN0aW9uLCB3aGljaCBzYXZlcworICAgICAgICAgICAgICAgICAgICAvLyBsb2NhdGlvbiBpbiB0aHItPnRoLnRoX2lkZW50LgorICAgICAgICAgICAgICAgICAgICBsb2MgPSB0aHItPnRoLnRoX2lkZW50OworICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGJhcnJpZXIgdHlwZSBmcm9tIGZsYWdzIHByb3ZpZGVkIGJ5IGNvbXBpbGVyLgorICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgICBleHBsID0gMDsKKyAgICAgICAgICAgICAgICAgICAga21wX3VpbnQzMiAgaW1wbCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmICggbG9jICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzcmMgID0gbG9jLT5wc291cmNlOworICAgICAgICAgICAgICAgICAgICAgICAgZXhwbCA9ICggbG9jLT5mbGFncyAmIEtNUF9JREVOVF9CQVJSSUVSX0VYUEwgKSAhPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgaW1wbCA9ICggbG9jLT5mbGFncyAmIEtNUF9JREVOVF9CQVJSSUVSX0lNUEwgKSAhPSAwOworICAgICAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgICAgICAgICBpZiAoIGltcGwgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKCBsb2MtPmZsYWdzICYgS01QX0lERU5UX0JBUlJJRVJfSU1QTF9NQVNLICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgS01QX0lERU5UX0JBUlJJRVJfSU1QTF9GT1IgOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAiT01QIEZvciBCYXJyaWVyIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgS01QX0lERU5UX0JBUlJJRVJfSU1QTF9TRUNUSU9OUyA6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJPTVAgU2VjdGlvbnMgQmFycmllciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEtNUF9JREVOVF9CQVJSSUVSX0lNUExfU0lOR0xFIDogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gIk9NUCBTaW5nbGUgQmFycmllciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEtNUF9JREVOVF9CQVJSSUVSX0lNUExfV09SS1NIQVJFIDogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gIk9NUCBXb3Jrc2hhcmUgQmFycmllciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IDogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gIk9NUCBJbXBsaWNpdCBCYXJyaWVyIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggMCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgICAgICB9OyAvKiBzd2l0Y2ggKi8KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggZXhwbCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAiT01QIEV4cGxpY2l0IEJhcnJpZXIiOworICAgICAgICAgICAgICAgICAgICB9OyAvKiBpZiAqLworICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBic19mb3Jram9pbl9iYXJyaWVyIDogeworICAgICAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIG9mIGZvcmsvam9pbiBiYXJyaWVyIHdlIGNhbiByZWFkIHRoci0+dGgudGhfaWRlbnQsIGJlY2F1c2UgaXQKKyAgICAgICAgICAgICAgICAgICAgLy8gY29udGFpbnMgbG9jYXRpb24gb2YgbGFzdCBwYXNzZWQgY29uc3RydWN0ICh3aGlsZSBqb2luIGJhcnJpZXIgaXMgbm90CisgICAgICAgICAgICAgICAgICAgIC8vIHN1Y2ggb25lKS4gVXNlIHRoX2lkZW50IG9mIG1hc3RlciB0aHJlYWQgaW5zdGVhZCAtLSBfX2ttcF9qb2luX2NhbGwoKQorICAgICAgICAgICAgICAgICAgICAvLyBjYWxsZWQgYnkgdGhlIG1hc3RlciB0aHJlYWQgc2F2ZXMgbG9jYXRpb24uCisgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgIC8vIEFDOiBjYW5ub3QgcmVhZCBmcm9tIG1hc3RlciBiZWNhdXNlIF9fa21wX2pvaW5fY2FsbCBtYXkgYmUgbm90IGNhbGxlZAorICAgICAgICAgICAgICAgICAgICAvLyAgICB5ZXQsIHNvIHdlIHJlYWQgdGhlIGxvY2F0aW9uIGZyb20gdGVhbS4gVGhpcyBpcyB0aGUgc2FtZSBsb2NhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgLy8gICAgQW5kIHRlYW0gaXMgdmFsaWQgYXQgdGhlIGVudGVyIHRvIGpvaW4gYmFycmllciB3aGVyZSB0aGlzIGhhcHBlbnMuCisgICAgICAgICAgICAgICAgICAgIGxvYyAgPSB0ZWFtLT50LnRfaWRlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggbG9jICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzcmMgID0gbG9jLT5wc291cmNlOworICAgICAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgICAgICAgICB0eXBlID0gIk9NUCBKb2luIEJhcnJpZXIiOworICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICB9OyAvLyBzd2l0Y2gKKyAgICAgICAgICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgICAgICAgICAgX19pdHRfc3luY19jcmVhdGUoIG9iamVjdCwgdHlwZSwgc3JjLCBfX2l0dF9hdHRyX2JhcnJpZXIgKTsKKyAgICAgICAgICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbYmFyIHN0YV0gc2NyZSggJXAsIFwiJXNcIiwgXCIlc1wiLCBfX2l0dF9hdHRyX2JhcnJpZXIgKVxuIiwgb2JqZWN0LCB0eXBlLCBzcmMgKTsKKyAgICAgICAgfTsgLy8gaWYKKworICAgIH07IC8vIGlmCisjZW5kaWYKKyAgICByZXR1cm4gb2JqZWN0OworfSAvLyBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkCitfX2ttcF9pdHRfYmFycmllcl9zdGFydGluZyggaW50IGd0aWQsIHZvaWQgKiBvYmplY3QgKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiAoICFLTVBfTUFTVEVSX0dUSUQoIGd0aWQgKSApIHsKKyAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgIF9faXR0X3N5bmNfcmVsZWFzaW5nKCBvYmplY3QgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltiYXIgc3RhXSBzcmVsKCAlcCApXG4iLCBvYmplY3QgKTsKKyAgICB9OyAvLyBpZgorICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgIF9faXR0X3N5bmNfcHJlcGFyZSggb2JqZWN0ICk7CisgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltiYXIgc3RhXSBzcHJlKCAlcCApXG4iLCBvYmplY3QgKTsKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfYmFycmllcl9zdGFydGluZworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQKK19fa21wX2l0dF9iYXJyaWVyX21pZGRsZSggaW50IGd0aWQsIHZvaWQgKiBvYmplY3QgKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiAoIEtNUF9NQVNURVJfR1RJRCggZ3RpZCApICkgeworICAgICAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICAgICAgX19pdHRfc3luY19hY3F1aXJlZCggb2JqZWN0ICk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbYmFyIG1pZF0gc2FjcSggJXAgKVxuIiwgb2JqZWN0ICk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgICAgICBfX2l0dF9zeW5jX3JlbGVhc2luZyggb2JqZWN0ICk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbYmFyIG1pZF0gc3JlbCggJXAgKVxuIiwgb2JqZWN0ICk7CisgICAgfSBlbHNlIHsKKyAgICB9OyAvLyBpZgorI2VuZGlmCit9IC8vIF9fa21wX2l0dF9iYXJyaWVyX21pZGRsZQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQKK19fa21wX2l0dF9iYXJyaWVyX2ZpbmlzaGVkKCBpbnQgZ3RpZCwgdm9pZCAqIG9iamVjdCApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmICggS01QX01BU1RFUl9HVElEKCBndGlkICkgKSB7CisgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgIF9faXR0X3N5bmNfYWNxdWlyZWQoIG9iamVjdCApOworICAgICAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW2JhciBlbmRdIHNhY3EoICVwIClcbiIsIG9iamVjdCApOworICAgIH07IC8vIGlmCisjZW5kaWYKK30gLy8gX19rbXBfaXR0X2JhcnJpZXJfZmluaXNoZWQKKworLyoKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBUYXNrd2FpdCByZXBvcnRpbmcuCisKKyAgICBJVFQgbmVlZCBhbiBhZGRyZXNzICh2b2lkICopIHRvIGJlIHNwZWNpZmllZCBhcyBhIHN5bmMgb2JqZWN0LiBPcGVuTVAgUlRMIGRvZXMgbm90IGhhdmUgdGFza3dhaXQKKyAgICBzdHJ1Y3R1cmUsIHNvIHdlIG5lZWQgdG8gY29uc3RydWN0IHNvbWV0aGluZy4KKworKi8KKwordm9pZCAqCitfX2ttcF9pdHRfdGFza3dhaXRfb2JqZWN0KCBpbnQgZ3RpZCApIHsKKyAgICB2b2lkICogb2JqZWN0ID0gTlVMTDsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmICggX19pdHRfc3luY19jcmVhdGVfcHRyICkgeworICAgICAgICBrbXBfaW5mb190ICogICAgIHRocmVhZCAgID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZCggZ3RpZCApOworICAgICAgICBrbXBfdGFza2RhdGFfdCAqIHRhc2tkYXRhID0gdGhyZWFkIC0+IHRoLnRoX2N1cnJlbnRfdGFzazsKKyAgICAgICAgb2JqZWN0ID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8IHZvaWQgKiA+KAorICAgICAgICAgICAgICAgIGttcF91aW50cHRyX3QoIHRhc2tkYXRhICkgKyB0YXNrZGF0YS0+dGRfdGFza3dhaXRfY291bnRlciAlIHNpemVvZigga21wX3Rhc2tkYXRhX3QgKQorICAgICAgICAgICAgKTsKKyAgICB9OyAvLyBpZgorI2VuZGlmCisgICAgcmV0dXJuIG9iamVjdDsKK30gLy8gX19rbXBfaXR0X3Rhc2t3YWl0X29iamVjdAorCit2b2lkCitfX2ttcF9pdHRfdGFza3dhaXRfc3RhcnRpbmcoCisgICAgaW50ICAgICBndGlkLAorICAgIHZvaWQgKiAgb2JqZWN0CispIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGttcF9pbmZvX3QgKiAgICAgdGhyZWFkICAgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKCBndGlkICk7CisgICAga21wX3Rhc2tkYXRhX3QgKiB0YXNrZGF0YSA9IHRocmVhZCAtPiB0aC50aF9jdXJyZW50X3Rhc2s7CisgICAgaWRlbnRfdCBjb25zdCAqICBsb2MgICAgICA9IHRhc2tkYXRhLT50ZF90YXNrd2FpdF9pZGVudDsKKyAgICBjaGFyIGNvbnN0ICogICAgIHNyYyAgICAgID0gKCBsb2MgPT0gTlVMTD8gTlVMTCA6IGxvYy0+cHNvdXJjZSApOworICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgIF9faXR0X3N5bmNfY3JlYXRlKCBvYmplY3QsICJPTVAgVGFza3dhaXQiLCBzcmMsIDAgKTsKKyAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW3R3YSBzdGFdIHNjcmUoICVwLCBcIk9NUCBUYXNrd2FpdFwiLCBcIiVzXCIsIDAgKVxuIiwgb2JqZWN0LCBzcmMgKTsKKyAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICBfX2l0dF9zeW5jX3ByZXBhcmUoIG9iamVjdCApOworICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbdHdhIHN0YV0gc3ByZSggJXAgKVxuIiwgb2JqZWN0ICk7CisjZW5kaWYKK30gLy8gX19rbXBfaXR0X3Rhc2t3YWl0X3N0YXJ0aW5nCisKK3ZvaWQKK19fa21wX2l0dF90YXNrd2FpdF9maW5pc2hlZCgKKyAgICBpbnQgICAgIGd0aWQsCisgICAgdm9pZCAqICBvYmplY3QKKykgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgX19pdHRfc3luY19hY3F1aXJlZCggb2JqZWN0ICk7CisgICAgS01QX0lUVF9ERUJVR19QUklOVCggIlt0d2EgZW5kXSBzYWNxKCAlcCApXG4iLCBvYmplY3QgKTsKKyAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICBfX2l0dF9zeW5jX2Rlc3Ryb3koIG9iamVjdCApOworICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbdHdhIGVuZF0gc2RlcyggJXAgKVxuIiwgb2JqZWN0ICk7CisjZW5kaWYKK30gLy8gX19rbXBfaXR0X3Rhc2t3YWl0X2ZpbmlzaGVkCisKKy8qCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgVGFzayByZXBvcnRpbmcuCisKKyAgICBPbmx5IHRob3NlIHRhc2tzIGFyZSByZXBvcnRlZCB3aGljaCBhcmUgZXhlY3V0ZWQgYnkgYSB0aHJlYWQgc3Bpbm5pbmcgYXQgYmFycmllciAob3IgdGFza3dhaXQpLgorICAgIFN5bmNoIG9iamVjdCBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uIG11c3QgYmUgYmFycmllciBvZiB0YXNrd2FpdCB0aGUgdGhyZWFkcyB3YWl0aW5nIGF0LgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKwordm9pZAorX19rbXBfaXR0X3Rhc2tfc3RhcnRpbmcoCisgICAgdm9pZCAqIG9iamVjdCAgICAgLy8gSVRUIHN5bmMgb2JqZWN0OiBiYXJyaWVyIG9yIHRhc2t3YWl0LgorKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiAoIG9iamVjdCAhPSBOVUxMICkgeworICAgICAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICAgICAgX19pdHRfc3luY19jYW5jZWwoIG9iamVjdCApOworICAgICAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW3RzayBzdGFdIHNjYW4oICVwIClcbiIsIG9iamVjdCApOworICAgIH07IC8vIGlmCisjZW5kaWYKK30gLy8gX19rbXBfaXR0X3Rhc2tfc3RhcnRpbmcKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkCitfX2ttcF9pdHRfdGFza19maW5pc2hlZCgKKyAgICB2b2lkICogb2JqZWN0ICAgICAvLyBJVFQgc3luYyBvYmplY3Q6IGJhcnJpZXIgb3IgdGFza3dhaXQuCispIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgIF9faXR0X3N5bmNfcHJlcGFyZSggb2JqZWN0ICk7CisgICAgS01QX0lUVF9ERUJVR19QUklOVCggIlt0c2sgZW5kXSBzcHJlKCAlcCApXG4iLCBvYmplY3QgKTsKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfdGFza19maW5pc2hlZAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgTG9jayByZXBvcnRpbmcuCisKKyAgICAgICAgKiBfX2ttcF9pdHRfbG9ja19jcmVhdGluZyggbG9jayApIHNob3VsZCBiZSBjYWxsZWQgKmJlZm9yZSogdGhlIGZpcnN0IGxvY2sgb3BlcmF0aW9uCisgICAgICAgICAgKHNldC91bnNldCkuIEl0IGlzIG5vdCBhIHJlYWwgZXZlbnQgc2hvd24gdG8gdGhlIHVzZXIgYnV0IGp1c3Qgc2V0dGluZyBhIG5hbWUgZm9yCisgICAgICAgICAgc3luY2hyb25pemF0aW9uIG9iamVjdC4gYGxvY2snIGlzIGFuIGFkZHJlc3Mgb2Ygc3luYyBvYmplY3QsIHRoZSBzYW1lIGFkZHJlc3Mgc2hvdWxkIGJlCisgICAgICAgICAgdXNlZCBpbiBhbGwgc3Vic2VxdWVudCBjYWxscy4KKworICAgICAgICAqIF9fa21wX2l0dF9sb2NrX2FjcXVpcmluZygpIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIHNldHRpbmcgdGhlIGxvY2suCisKKyAgICAgICAgKiBfX2ttcF9pdHRfbG9ja19hY3F1aXJlZCgpIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgc2V0dGluZyB0aGUgbG9jay4KKworICAgICAgICAqIF9fa21wX2l0dF9sb2NrX3JlYWxlYXNpbmcoKSBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSB1bnNldHRpbmcgdGhlIGxvY2suCisKKyAgICAgICAgKiBfX2ttcF9pdHRfbG9ja19jYW5jZWxsZWQoKSBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHRocmVhZCBjYW5jZWxsZWQgd2FpdGluZyBmb3IgdGhlIGxvY2suCisKKyAgICAgICAgKiBfX2ttcF9pdHRfbG9ja19kZXN0cm95ZWQoIGxvY2sgKSBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHRoZSBsYXN0IGxvY2sgb3BlcmF0aW9uLiBBZnRlcgorICAgICAgICAgIF9fa21wX2l0dF9sb2NrX2Rlc3Ryb3llZCgpIGFsbCB0aGUgcmVmZXJlbmNlcyB0byB0aGUgc2FtZSBhZGRyZXNzIHdpbGwgYmUgY29uc2lkZXJlZAorICAgICAgICAgIGFzIGFub3RoZXIgc3luYyBvYmplY3QsIG5vdCByZWxhdGVkIHdpdGggdGhlIG9yaWdpbmFsIG9uZS4KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisvLyBUYWtlcyBsb2NhdGlvbiBpbmZvcm1hdGlvbiBkaXJlY3RseQorX19rbXBfaW5saW5lCit2b2lkCitfX19rbXBfaXR0X2xvY2tfaW5pdCgga21wX3VzZXJfbG9ja19wIGxvY2ssIGNoYXIgY29uc3QgKnR5cGUsIGNvbnN0IGlkZW50X3QgKmxvYyApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmICggX19pdHRfc3luY19jcmVhdGVfcHRyICkgeworICAgICAgICBjaGFyIGNvbnN0ICogICAgc3JjID0gKCBsb2MgPT0gTlVMTCA/IE5VTEwgOiBsb2MtPnBzb3VyY2UgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgIF9faXR0X3N5bmNfY3JlYXRlKCBsb2NrLCB0eXBlLCBzcmMsIDAgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltsY2sgaW5pXSBzY3JlKCAlcCwgXCIlc1wiLCBcIiVzXCIsIDAgKVxuIiwgbG9jaywgdHlwZSwgc3JjICk7CisgICAgfQorI2VuZGlmCit9CisjZWxzZSAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworLy8gSW50ZXJuYWwgZ3V0cyAtLSBjb21tb24gY29kZSBmb3IgbG9ja3MgYW5kIGNyaXRpY2FsIHNlY3Rpb25zLCBkbyBub3QgY2FsbCBkaXJlY3RseS4KK19fa21wX2lubGluZQordm9pZAorX19fa21wX2l0dF9sb2NrX2luaXQoIGttcF91c2VyX2xvY2tfcCBsb2NrLCBjaGFyIGNvbnN0ICogdHlwZSApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmICggX19pdHRfc3luY19jcmVhdGVfcHRyICkgeworICAgICAgICBpZGVudF90IGNvbnN0ICogbG9jID0gTlVMTDsKKyAgICAgICAgaWYgKCBfX2ttcF9nZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyAhPSBOVUxMICkKKyAgICAgICAgICAgIGxvYyA9IF9fa21wX2dldF91c2VyX2xvY2tfbG9jYXRpb25fKCAobG9jaykgKTsKKyAgICAgICAgY2hhciBjb25zdCAqICAgIHNyYyA9ICggbG9jID09IE5VTEwgPyBOVUxMIDogbG9jLT5wc291cmNlICk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgICAgICBfX2l0dF9zeW5jX2NyZWF0ZSggbG9jaywgdHlwZSwgc3JjLCAwICk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbbGNrIGluaV0gc2NyZSggJXAsIFwiJXNcIiwgXCIlc1wiLCAwIClcbiIsIGxvY2ssIHR5cGUsIHNyYyApOworICAgIH07IC8vIGlmCisjZW5kaWYKK30gLy8gX19fa21wX2l0dF9sb2NrX2luaXQKKyNlbmRpZiAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworCisvLyBJbnRlcm5hbCBndXRzIC0tIGNvbW1vbiBjb2RlIGZvciBsb2NrcyBhbmQgY3JpdGljYWwgc2VjdGlvbnMsIGRvIG5vdCBjYWxsIGRpcmVjdGx5LgorX19rbXBfaW5saW5lCit2b2lkCitfX19rbXBfaXR0X2xvY2tfZmluaSgga21wX3VzZXJfbG9ja19wIGxvY2ssIGNoYXIgY29uc3QgKiB0eXBlICkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgX19pdHRfc3luY19kZXN0cm95KCBsb2NrICk7CisgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltsY2sgZHN0XSBzZGVzKCAlcCApXG4iLCBsb2NrICk7CisjZW5kaWYKK30gLy8gX19fa21wX2l0dF9sb2NrX2ZpbmkKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSwordm9pZAorX19rbXBfaXR0X2xvY2tfY3JlYXRpbmcoIGttcF91c2VyX2xvY2tfcCBsb2NrLCBjb25zdCBpZGVudF90ICpsb2MgKSB7CisgICAgX19fa21wX2l0dF9sb2NrX2luaXQoIGxvY2ssICJPTVAgTG9jayIsIGxvYyApOworfQorI2Vsc2UKK3ZvaWQKK19fa21wX2l0dF9sb2NrX2NyZWF0aW5nKCBrbXBfdXNlcl9sb2NrX3AgbG9jayApIHsKKyAgICBfX19rbXBfaXR0X2xvY2tfaW5pdCggbG9jaywgIk9NUCBMb2NrIiApOworfSAvLyBfX2ttcF9pdHRfbG9ja19jcmVhdGluZworI2VuZGlmCisKK3ZvaWQKK19fa21wX2l0dF9sb2NrX2FjcXVpcmluZygga21wX3VzZXJfbG9ja19wIGxvY2sgKSB7CisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICAvLyBwb3N0cG9uZSBsb2NrIG9iamVjdCBhY2Nlc3MKKyAgICBpZiAoIF9faXR0X3N5bmNfcHJlcGFyZV9wdHIgKSB7CisgICAgICAgIGlmICggS01QX0VYVFJBQ1RfRF9UQUcobG9jaykgPT0gMCApIHsKKyAgICAgICAgICAgIGttcF9pbmRpcmVjdF9sb2NrX3QgKmlsayA9IEtNUF9MT09LVVBfSV9MT0NLKGxvY2spOworICAgICAgICAgICAgX19pdHRfc3luY19wcmVwYXJlKCBpbGstPmxvY2sgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9faXR0X3N5bmNfcHJlcGFyZSggbG9jayApOworICAgICAgICB9CisgICAgfQorI2Vsc2UKKyAgICBfX2l0dF9zeW5jX3ByZXBhcmUoIGxvY2sgKTsKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfbG9ja19hY3F1aXJpbmcKKwordm9pZAorX19rbXBfaXR0X2xvY2tfYWNxdWlyZWQoIGttcF91c2VyX2xvY2tfcCBsb2NrICkgeworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLICYmIFVTRV9JVFRfTk9USUZZCisgICAgLy8gcG9zdHBvbmUgbG9jayBvYmplY3QgYWNjZXNzCisgICAgaWYgKCBfX2l0dF9zeW5jX2FjcXVpcmVkX3B0ciApIHsKKyAgICAgICAgaWYgKCBLTVBfRVhUUkFDVF9EX1RBRyhsb2NrKSA9PSAwICkgeworICAgICAgICAgICAga21wX2luZGlyZWN0X2xvY2tfdCAqaWxrID0gS01QX0xPT0tVUF9JX0xPQ0sobG9jayk7CisgICAgICAgICAgICBfX2l0dF9zeW5jX2FjcXVpcmVkKCBpbGstPmxvY2sgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9faXR0X3N5bmNfYWNxdWlyZWQoIGxvY2sgKTsKKyAgICAgICAgfQorICAgIH0KKyNlbHNlCisgICAgX19pdHRfc3luY19hY3F1aXJlZCggbG9jayApOworI2VuZGlmCit9IC8vIF9fa21wX2l0dF9sb2NrX2FjcXVpcmVkCisKK3ZvaWQKK19fa21wX2l0dF9sb2NrX3JlbGVhc2luZygga21wX3VzZXJfbG9ja19wIGxvY2sgKSB7CisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiAoIF9faXR0X3N5bmNfcmVsZWFzaW5nX3B0ciApIHsKKyAgICAgICAgaWYgKCBLTVBfRVhUUkFDVF9EX1RBRyhsb2NrKSA9PSAwICkgeworICAgICAgICAgICAga21wX2luZGlyZWN0X2xvY2tfdCAqaWxrID0gS01QX0xPT0tVUF9JX0xPQ0sobG9jayk7CisgICAgICAgICAgICBfX2l0dF9zeW5jX3JlbGVhc2luZyggaWxrLT5sb2NrICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfX2l0dF9zeW5jX3JlbGVhc2luZyggbG9jayApOworICAgICAgICB9CisgICAgfQorI2Vsc2UKKyAgICBfX2l0dF9zeW5jX3JlbGVhc2luZyggbG9jayApOworI2VuZGlmCit9IC8vIF9fa21wX2l0dF9sb2NrX3JlbGVhc2luZworCit2b2lkCitfX2ttcF9pdHRfbG9ja19jYW5jZWxsZWQoIGttcF91c2VyX2xvY2tfcCBsb2NrICkgeworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLICYmIFVTRV9JVFRfTk9USUZZCisgICAgaWYgKCBfX2l0dF9zeW5jX2NhbmNlbF9wdHIgKSB7CisgICAgICAgIGlmICggS01QX0VYVFJBQ1RfRF9UQUcobG9jaykgPT0gMCApIHsKKyAgICAgICAgICAgIGttcF9pbmRpcmVjdF9sb2NrX3QgKmlsayA9IEtNUF9MT09LVVBfSV9MT0NLKGxvY2spOworICAgICAgICAgICAgX19pdHRfc3luY19jYW5jZWwoIGlsay0+bG9jayApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX19pdHRfc3luY19jYW5jZWwoIGxvY2sgKTsKKyAgICAgICAgfQorICAgIH0KKyNlbHNlCisgICAgX19pdHRfc3luY19jYW5jZWwoIGxvY2sgKTsKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfbG9ja19jYW5jZWxsZWQKKwordm9pZAorX19rbXBfaXR0X2xvY2tfZGVzdHJveWVkKCBrbXBfdXNlcl9sb2NrX3AgbG9jayApIHsKKyAgICBfX19rbXBfaXR0X2xvY2tfZmluaSggbG9jaywgIk9NUCBMb2NrIiApOworfSAvLyBfX2ttcF9pdHRfbG9ja19kZXN0cm95ZWQKKworLyoKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBDcml0aWNhbCByZXBvcnRpbmcuCisKKyAgICBDcml0aWNhbCBzZWN0aW9ucyBhcmUgdHJlYXRlZCBleGFjdGx5IGFzIGxvY2tzIChidXQgaGF2ZSBkaWZmZXJlbnQgb2JqZWN0IHR5cGUpLgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSwordm9pZAorX19rbXBfaXR0X2NyaXRpY2FsX2NyZWF0aW5nKCBrbXBfdXNlcl9sb2NrX3AgbG9jaywgY29uc3QgaWRlbnRfdCAqbG9jICkgeworICAgIF9fX2ttcF9pdHRfbG9ja19pbml0KCBsb2NrLCAiT01QIENyaXRpY2FsIiwgbG9jKTsKK30KKyNlbHNlCit2b2lkCitfX2ttcF9pdHRfY3JpdGljYWxfY3JlYXRpbmcoIGttcF91c2VyX2xvY2tfcCBsb2NrICkgeworICAgIF9fX2ttcF9pdHRfbG9ja19pbml0KCBsb2NrLCAiT01QIENyaXRpY2FsIiApOworfSAvLyBfX2ttcF9pdHRfY3JpdGljYWxfY3JlYXRpbmcKKyNlbmRpZgorCit2b2lkCitfX2ttcF9pdHRfY3JpdGljYWxfYWNxdWlyaW5nKCBrbXBfdXNlcl9sb2NrX3AgbG9jayApIHsKKyAgICBfX2l0dF9zeW5jX3ByZXBhcmUoIGxvY2sgKTsKK30gLy8gX19rbXBfaXR0X2NyaXRpY2FsX2FjcXVpcmluZworCit2b2lkCitfX2ttcF9pdHRfY3JpdGljYWxfYWNxdWlyZWQoIGttcF91c2VyX2xvY2tfcCBsb2NrICkgeworICAgIF9faXR0X3N5bmNfYWNxdWlyZWQoIGxvY2sgKTsKK30gLy8gX19rbXBfaXR0X2NyaXRpY2FsX2FjcXVpcmVkCisKK3ZvaWQKK19fa21wX2l0dF9jcml0aWNhbF9yZWxlYXNpbmcoIGttcF91c2VyX2xvY2tfcCBsb2NrICkgeworICAgIF9faXR0X3N5bmNfcmVsZWFzaW5nKCBsb2NrICk7Cit9IC8vIF9fa21wX2l0dF9jcml0aWNhbF9yZWxlYXNpbmcKKwordm9pZAorX19rbXBfaXR0X2NyaXRpY2FsX2Rlc3Ryb3llZCgga21wX3VzZXJfbG9ja19wIGxvY2sgKSB7CisgICAgX19fa21wX2l0dF9sb2NrX2ZpbmkoIGxvY2ssICJPTVAgQ3JpdGljYWwiICk7Cit9IC8vIF9fa21wX2l0dF9jcml0aWNhbF9kZXN0cm95ZWQKKworLyoKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTaW5nbGUgcmVwb3J0aW5nLgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKwordm9pZAorX19rbXBfaXR0X3NpbmdsZV9zdGFydCggaW50IGd0aWQgKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiAoIF9faXR0X21hcmtfY3JlYXRlX3B0ciB8fCBLTVBfSVRUX0RFQlVHICkgeworICAgICAgICBrbXBfaW5mb190ICogICB0aHIgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKCAoZ3RpZCkgKTsKKyAgICAgICAgaWRlbnRfdCAqICAgICAgbG9jID0gdGhyLT50aC50aF9pZGVudDsKKyAgICAgICAgY2hhciBjb25zdCAqICAgc3JjID0gKCBsb2MgPT0gTlVMTCA/IE5VTEwgOiBsb2MtPnBzb3VyY2UgKTsKKyAgICAgICAga21wX3N0cl9idWZfdCAgbmFtZTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmIG5hbWUgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBuYW1lLCAiT01QIFNpbmdsZS0lcyIsIHNyYyApOworICAgICAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICAgICAgdGhyLT50aC50aF9pdHRfbWFya19zaW5nbGUgPSBfX2l0dF9tYXJrX2NyZWF0ZSggbmFtZS5zdHIgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltzaW4gc3RhXSBtY3JlKCBcIiVzXCIpIC0+ICVkXG4iLCBuYW1lLnN0ciwgdGhyLT50aC50aF9pdHRfbWFya19zaW5nbGUgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIG5hbWUgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgIF9faXR0X21hcmsoIHRoci0+dGgudGhfaXR0X21hcmtfc2luZ2xlLCBOVUxMICk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbc2luIHN0YV0gbWFyayggJWQsIE5VTEwgKVxuIiwgdGhyLT50aC50aF9pdHRfbWFya19zaW5nbGUgKTsKKyAgICB9OyAvLyBpZgorI2VuZGlmCit9IC8vIF9fa21wX2l0dF9zaW5nbGVfc3RhcnQKKwordm9pZAorX19rbXBfaXR0X3NpbmdsZV9lbmQoIGludCBndGlkICkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgX19pdHRfbWFya190eXBlICBtYXJrID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZCggZ3RpZCApLT50aC50aF9pdHRfbWFya19zaW5nbGU7CisgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgX19pdHRfbWFya19vZmYoIG1hcmsgKTsKKyAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW3NpbiBlbmRdIG1vZmYoICVkIClcbiIsIG1hcmsgKTsKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfc2luZ2xlX2VuZAorCisvKgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIE9yZGVyZWQgcmVwb3J0aW5nLgorCisgICAgX19rbXBfaXR0X29yZGVyZWRfaW5pdCBpcyBjYWxsZWQgYnkgZWFjaCB0aHJlYWQgKmJlZm9yZSogZmlyc3QgdXNpbmcgc3luYworICAgIG9iamVjdC4gSVRUIHRlYW0gd291bGQgbGlrZSBpdCB0byBiZSBjYWxsZWQgb25jZSwgYnV0IGl0IHJlcXVpcmVzIGV4dHJhIHN5bmNocm9uaXphdGlvbi4KKworICAgIF9fa21wX2l0dF9vcmRlcmVkX3ByZXAgaXMgY2FsbGVkIHdoZW4gdGhyZWFkIGlzIGdvaW5nIHRvIGVudGVyIG9yZGVyZWQgc2VjdGlvbgorICAgIChiZWZvcmUgc3luY2hyb25pemF0aW9uKS4KKworICAgIF9fa21wX2l0dF9vcmRlcmVkX3N0YXJ0IGlzIGNhbGxlZCBqdXN0IGJlZm9yZSBlbnRlcmluZyB1c2VyIGNvZGUgKGFmdGVyCisgICAgc3luY2hyb25pemF0aW9uKS4KKworICAgIF9fa21wX2l0dF9vcmRlcmVkX2VuZCBpcyBjYWxsZWQgYWZ0ZXIgcmV0dXJuaW5nIGZyb20gdXNlciBjb2RlLgorCisgICAgU3luYyBvYmplY3QgaXMgdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9kaXNwYXRjaF9zaF9jdXJyZW50LgorCisgICAgRXZlbnRzIGFyZSBub3QgZ2VuZXJhdGVkIGluIGNhc2Ugb2Ygc2VyaWFsaXplZCB0ZWFtLgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKwordm9pZAorX19rbXBfaXR0X29yZGVyZWRfaW5pdCggaW50IGd0aWQgKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiAoIF9faXR0X3N5bmNfY3JlYXRlX3B0ciApIHsKKyAgICAgICAga21wX2luZm9fdCAqICAgdGhyICAgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKCBndGlkICk7CisgICAgICAgIGlkZW50X3QgY29uc3QgKiBsb2MgID0gdGhyLT50aC50aF9pZGVudDsKKyAgICAgICAgY2hhciBjb25zdCAqICAgIHNyYyAgPSAoIGxvYyA9PSBOVUxMID8gTlVMTCA6IGxvYy0+cHNvdXJjZSApOworICAgICAgICBfX2l0dF9zeW5jX2NyZWF0ZSgKKyAgICAgICAgICAgIHRoci0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rpc3BhdGNoX3NoX2N1cnJlbnQsICJPTVAgT3JkZXJlZCIsIHNyYywgMAorICAgICAgICApOworICAgIH07IC8vIGlmCisjZW5kaWYKK30gLy8gX19rbXBfaXR0X29yZGVyZWRfaW5pdAorCit2b2lkCitfX2ttcF9pdHRfb3JkZXJlZF9wcmVwKCBpbnQgZ3RpZCApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmICggX19pdHRfc3luY19jcmVhdGVfcHRyICkgeworICAgICAgICBrbXBfdGVhbV90ICogdCA9IF9fa21wX3RlYW1fZnJvbV9ndGlkKCBndGlkICk7CisgICAgICAgIGlmICggISB0LT50LnRfc2VyaWFsaXplZCApIHsKKyAgICAgICAgICAgIGttcF9pbmZvX3QgKiB0aCA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICAgICAgICAgIF9faXR0X3N5bmNfcHJlcGFyZSggdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9kaXNwYXRjaF9zaF9jdXJyZW50ICk7CisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gaWYKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfb3JkZXJlZF9wcmVwCisKK3ZvaWQKK19fa21wX2l0dF9vcmRlcmVkX3N0YXJ0KCBpbnQgZ3RpZCApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmICggX19pdHRfc3luY19jcmVhdGVfcHRyICkgeworICAgICAgICBrbXBfdGVhbV90ICogdCA9IF9fa21wX3RlYW1fZnJvbV9ndGlkKCBndGlkICk7CisgICAgICAgIGlmICggISB0LT50LnRfc2VyaWFsaXplZCApIHsKKyAgICAgICAgICAgIGttcF9pbmZvX3QgKiB0aCA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICAgICAgICAgIF9faXR0X3N5bmNfYWNxdWlyZWQoIHRoLT50aC50aF9kaXNwYXRjaC0+dGhfZGlzcGF0Y2hfc2hfY3VycmVudCApOworICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGlmCisjZW5kaWYKK30gLy8gX19rbXBfaXR0X29yZGVyZWRfc3RhcnQKKwordm9pZAorX19rbXBfaXR0X29yZGVyZWRfZW5kKCBpbnQgZ3RpZCApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmICggX19pdHRfc3luY19jcmVhdGVfcHRyICkgeworICAgICAgICBrbXBfdGVhbV90ICogdCA9IF9fa21wX3RlYW1fZnJvbV9ndGlkKCBndGlkICk7CisgICAgICAgIGlmICggISB0LT50LnRfc2VyaWFsaXplZCApIHsKKyAgICAgICAgICAgIGttcF9pbmZvX3QgKiB0aCA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICAgICAgICAgIF9faXR0X3N5bmNfcmVsZWFzaW5nKCB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rpc3BhdGNoX3NoX2N1cnJlbnQgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBpZgorI2VuZGlmCit9IC8vIF9fa21wX2l0dF9vcmRlcmVkX2VuZAorCisKKy8qCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgVGhyZWFkcyByZXBvcnRpbmcuCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCit2b2lkCitfX2ttcF9pdHRfdGhyZWFkX2lnbm9yZSgpIHsKKyAgICBfX2l0dF90aHJfaWdub3JlKCk7Cit9IC8vIF9fa21wX2l0dF90aHJlYWRfaWdub3JlCisKK3ZvaWQKK19fa21wX2l0dF90aHJlYWRfbmFtZSggaW50IGd0aWQgKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiAoIF9faXR0X3Rocl9uYW1lX3NldF9wdHIgKSB7CisgICAgICAgIGttcF9zdHJfYnVmX3QgbmFtZTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmIG5hbWUgKTsKKyAgICAgICAgaWYoIEtNUF9NQVNURVJfR1RJRChndGlkKSApIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgbmFtZSwgIk9NUCBNYXN0ZXIgVGhyZWFkICMlZCIsIGd0aWQgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgbmFtZSwgIk9NUCBXb3JrZXIgVGhyZWFkICMlZCIsIGd0aWQgKTsKKyAgICAgICAgfQorICAgICAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICAgICAgX19pdHRfdGhyX25hbWVfc2V0KCBuYW1lLnN0ciwgbmFtZS51c2VkICk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbdGhyIG5hbV0gbmFtZSggXCIlc1wiKVxuIiwgbmFtZS5zdHIgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIG5hbWUgKTsKKyAgICB9OyAvLyBpZgorI2VuZGlmCit9IC8vIF9fa21wX2l0dF90aHJlYWRfbmFtZQorCisKKy8qCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTeXN0ZW0gb2JqZWN0IHJlcG9ydGluZy4KKworICAgIElUVCBjYXRjaGVzIG9wZXJhdGlvbnMgd2l0aCBzeXN0ZW0gc3luYyBvYmplY3RzIChsaWtlIFdpbmRvd3MqIE9TIG9uIElBLTMyCisgICAgYXJjaGl0ZWN0dXJlIEFQSSBjcml0aWNhbCBzZWN0aW9ucyBhbmQgZXZlbnRzKS4gV2Ugb25seSBuZWVkIHRvIHNwZWNpZnkKKyAgICBuYW1lICgiT01QIFNjaGVkdWxlciIpIGZvciB0aGUgb2JqZWN0IHRvIGxldCBJVFQga25vdyBpdCBpcyBhbiBvYmplY3QgdXNlZAorICAgIGJ5IE9wZW5NUCBSVEwgZm9yIGludGVybmFsIHB1cnBvc2VzLgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCit2b2lkCitfX2ttcF9pdHRfc3lzdGVtX29iamVjdF9jcmVhdGVkKCB2b2lkICogb2JqZWN0LCBjaGFyIGNvbnN0ICogbmFtZSApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgIF9faXR0X3N5bmNfY3JlYXRlKCBvYmplY3QsICJPTVAgU2NoZWR1bGVyIiwgbmFtZSwgMCApOworICAgS01QX0lUVF9ERUJVR19QUklOVCggIltzeXMgb2JqXSBzY3JlKCAlcCwgXCJPTVAgU2NoZWR1bGVyXCIsIFwiJXNcIiwgMCApXG4iLCBvYmplY3QsIG5hbWUgKTsKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfc3lzdGVtX29iamVjdF9jcmVhdGVkCisKKworLyoKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTdGFjayBzdGl0Y2hpbmcgYXBpLgorCisgICAgTWFzdGVyIGNhbGxzICJjcmVhdGUiIGFuZCBwdXQgdGhlIHN0aXRjaGluZyBpZCBpbnRvIHRlYW0gc3RydWN0dXJlLgorICAgIFdvcmtlcnMgcmVhZCB0aGUgc3RpdGNoaW5nIGlkIGFuZCBjYWxsICJlbnRlciIgLyAibGVhdmUiIGFwaS4KKyAgICBNYXN0ZXIgY2FsbHMgImRlc3Ryb3kiIGF0IHRoZSBlbmQgb2YgdGhlIHBhcmFsbGVsIHJlZ2lvbi4KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKK19faXR0X2NhbGxlcgorX19rbXBfaXR0X3N0YWNrX2NhbGxlcl9jcmVhdGUoKQoreworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgaWYgKCAhX19pdHRfc3RhY2tfY2FsbGVyX2NyZWF0ZV9wdHIgKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICBfX2l0dF9jYWxsZXIgaWQgPSBfX2l0dF9zdGFja19jYWxsZXJfY3JlYXRlKCk7CisgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltzdGsgY3JlXSAlcFxuIiwgaWQgKTsKKyAgICByZXR1cm4gaWQ7CisjZW5kaWYKKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZAorX19rbXBfaXR0X3N0YWNrX2NhbGxlcl9kZXN0cm95KCBfX2l0dF9jYWxsZXIgaWQgKQoreworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgaWYgKCBfX2l0dF9zdGFja19jYWxsZXJfZGVzdHJveV9wdHIgKSB7CisgICAgICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgICAgICBfX2l0dF9zdGFja19jYWxsZXJfZGVzdHJveSggaWQgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltzdGsgZGVzXSAlcFxuIiwgaWQgKTsKKyAgICB9CisjZW5kaWYKK30KKwordm9pZAorX19rbXBfaXR0X3N0YWNrX2NhbGxlZV9lbnRlciggX19pdHRfY2FsbGVyIGlkICkKK3sKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmICggX19pdHRfc3RhY2tfY2FsbGVlX2VudGVyX3B0ciApIHsKKyAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgIF9faXR0X3N0YWNrX2NhbGxlZV9lbnRlciggaWQgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltzdGsgZW50XSAlcFxuIiwgaWQgKTsKKyAgICB9CisjZW5kaWYKK30KKwordm9pZAorX19rbXBfaXR0X3N0YWNrX2NhbGxlZV9sZWF2ZSggX19pdHRfY2FsbGVyIGlkICkKK3sKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmICggX19pdHRfc3RhY2tfY2FsbGVlX2xlYXZlX3B0ciApIHsKKyAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgIF9faXR0X3N0YWNrX2NhbGxlZV9sZWF2ZSggaWQgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltzdGsgbGVhXSAlcFxuIiwgaWQgKTsKKyAgICB9CisjZW5kaWYKK30KKworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9sb2NrLmNwcCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9sb2NrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDVlNWM5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2xvY2suY3BwCkBAIC0wLDAgKzEsNDIwOCBAQAorLyoKKyAqIGttcF9sb2NrLmNwcCAtLSBsb2NrLXJlbGF0ZWQgZnVuY3Rpb25zCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9pdHQuaCIKKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorI2luY2x1ZGUgImttcF9sb2NrLmgiCisjaW5jbHVkZSAia21wX2lvLmgiCisKKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpCisjIGluY2x1ZGUgPHVuaXN0ZC5oPgorIyBpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorLy8gV2Ugc2hvdWxkIHJlYWxseSBpbmNsdWRlIDxmdXRleC5oPiwgYnV0IHRoYXQgY2F1c2VzIGNvbXBhdGliaWxpdHkgcHJvYmxlbXMgb24gZGlmZmVyZW50CisvLyBMaW51eCogT1MgZGlzdHJpYnV0aW9ucyB0aGF0IGVpdGhlciByZXF1aXJlIHRoYXQgeW91IGluY2x1ZGUgKG9yIGJyZWFrIHdoZW4geW91IHRyeSB0byBpbmNsdWRlKQorLy8gPHBjaS90eXBlcy5oPi4KKy8vIFNpbmNlIGFsbCB3ZSBuZWVkIGlzIHRoZSB0d28gbWFjcm9zIGJlbG93ICh3aGljaCBhcmUgcGFydCBvZiB0aGUga2VybmVsIEFCSSwgc28gY2FuJ3QgY2hhbmdlKQorLy8gd2UganVzdCBkZWZpbmUgdGhlIGNvbnN0YW50cyBoZXJlIGFuZCBkb24ndCBpbmNsdWRlIDxmdXRleC5oPgorIyBpZm5kZWYgRlVURVhfV0FJVAorIyAgZGVmaW5lIEZVVEVYX1dBSVQgICAgMAorIyBlbmRpZgorIyBpZm5kZWYgRlVURVhfV0FLRQorIyAgZGVmaW5lIEZVVEVYX1dBS0UgICAgMQorIyBlbmRpZgorI2VuZGlmCisKKy8qIEltcGxlbWVudCBzcGluIGxvY2tzIGZvciBpbnRlcm5hbCBsaWJyYXJ5IHVzZS4gICAgICAgICAgICAgKi8KKy8qIFRoZSBhbGdvcml0aG0gaW1wbGVtZW50ZWQgaXMgTGFtcG9ydCdzIGJha2VyeSBsb2NrIFsxOTc0XS4gKi8KKwordm9pZAorX19rbXBfdmFsaWRhdGVfbG9ja3MoIHZvaWQgKQoreworICAgIGludCBpOworICAgIGttcF91aW50MzIgIHgsIHk7CisKKyAgICAvKiBDaGVjayB0byBtYWtlIHN1cmUgdW5zaWduZWQgYXJpdGhtZXRpYyBkb2VzIHdyYXBzIHByb3Blcmx5ICovCisgICAgeCA9IH4oKGttcF91aW50MzIpIDApIC0gMjsKKyAgICB5ID0geCAtIDI7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgKytpLCArK3gsICsreSkgeworICAgICAgICBrbXBfdWludDMyIHogPSAoeCAtIHkpOworICAgICAgICBLTVBfQVNTRVJUKCB6ID09IDIgKTsKKyAgICB9CisKKyAgICBLTVBfQVNTRVJUKCBvZmZzZXRvZigga21wX2Jhc2VfcXVldWluZ19sb2NrLCB0YWlsX2lkICkgJSA4ID09IDAgKTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIHRlc3QgYW5kIHNldCBsb2NrcyAqLworCisvLworLy8gRm9yIHRoZSBub24tbmVzdGVkIGxvY2tzLCB3ZSBjYW4gb25seSBhc3N1bWUgdGhhdCB0aGUgZmlyc3QgNCBieXRlcyB3ZXJlCisvLyBhbGxvY2F0ZWQsIHNpbmNlIGdjYyBvbmx5IGFsbG9jYXRlcyA0IGJ5dGVzIGZvciBvbXBfbG9ja190LCBhbmQgdGhlIEludGVsCisvLyBjb21waWxlciBvbmx5IGFsbG9jYXRlcyBhIDQgYnl0ZSBwb2ludGVyIG9uIElBLTMyIGFyY2hpdGVjdHVyZS4gIE9uCisvLyBXaW5kb3dzKiBPUyBvbiBJbnRlbChSKSA2NCwgd2UgY2FuIGFzc3VtZSB0aGF0IGFsbCA4IGJ5dGVzIHdlcmUgYWxsb2NhdGVkLgorLy8KKy8vIGdjYyByZXNlcnZlcyA+PSA4IGJ5dGVzIGZvciBuZXN0ZWQgbG9ja3MsIHNvIHdlIGNhbiBhc3N1bWUgdGhhdCB0aGUKKy8vIGVudGlyZSA4IGJ5dGVzIHdlcmUgYWxsb2NhdGVkIGZvciBuZXN0ZWQgbG9ja3Mgb24gYWxsIDY0LWJpdCBwbGF0Zm9ybXMuCisvLworCitzdGF0aWMga21wX2ludDMyCitfX2ttcF9nZXRfdGFzX2xvY2tfb3duZXIoIGttcF90YXNfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiBLTVBfTE9DS19TVFJJUChUQ1JfNCggbGNrLT5say5wb2xsICkpIC0gMTsKK30KKworc3RhdGljIGlubGluZSBib29sCitfX2ttcF9pc190YXNfbG9ja19uZXN0YWJsZSgga21wX3Rhc19sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIGxjay0+bGsuZGVwdGhfbG9ja2VkICE9IC0xOworfQorCitfX2ZvcmNlaW5saW5lIHN0YXRpYyBpbnQKK19fa21wX2FjcXVpcmVfdGFzX2xvY2tfdGltZWRfdGVtcGxhdGUoIGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBLTVBfTUIoKTsKKworI2lmZGVmIFVTRV9MT0NLX1BST0ZJTEUKKyAgICBrbXBfdWludDMyIGN1cnIgPSBUQ1JfNCggbGNrLT5say5wb2xsICk7CisgICAgaWYgKCAoIGN1cnIgIT0gMCApICYmICggY3VyciAhPSBndGlkICsgMSApICkKKyAgICAgICAgX19rbXBfcHJpbnRmKCAiTE9DSyBDT05URU5USU9OOiAlcFxuIiwgbGNrICk7CisgICAgLyogZWxzZSBfX2ttcF9wcmludGYoICIuIiApOyovCisjZW5kaWYgLyogVVNFX0xPQ0tfUFJPRklMRSAqLworCisgICAgaWYgKCAoIGxjay0+bGsucG9sbCA9PSBLTVBfTE9DS19GUkVFKHRhcykgKQorICAgICAgJiYgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCAmICggbGNrLT5say5wb2xsICksIEtNUF9MT0NLX0ZSRUUodGFzKSwgS01QX0xPQ0tfQlVTWShndGlkKzEsIHRhcykgKSApIHsKKyAgICAgICAgS01QX0ZTWU5DX0FDUVVJUkVEKGxjayk7CisgICAgICAgIHJldHVybiBLTVBfTE9DS19BQ1FVSVJFRF9GSVJTVDsKKyAgICB9CisKKyAgICBrbXBfdWludDMyIHNwaW5zOworICAgIEtNUF9GU1lOQ19QUkVQQVJFKCBsY2sgKTsKKyAgICBLTVBfSU5JVF9ZSUVMRCggc3BpbnMgKTsKKyAgICBpZiAoIFRDUl80KCBfX2ttcF9udGggKSA+ICggX19rbXBfYXZhaWxfcHJvYyA/IF9fa21wX2F2YWlsX3Byb2MgOgorICAgICAgX19rbXBfeHByb2MgKSApIHsKKyAgICAgICAgS01QX1lJRUxEKCBUUlVFICk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBLTVBfWUlFTERfU1BJTiggc3BpbnMgKTsKKyAgICB9CisKKyAgICB3aGlsZSAoICggbGNrLT5say5wb2xsICE9IEtNUF9MT0NLX0ZSRUUodGFzKSApIHx8CisgICAgICAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCAmICggbGNrLT5say5wb2xsICksIEtNUF9MT0NLX0ZSRUUodGFzKSwgS01QX0xPQ0tfQlVTWShndGlkKzEsIHRhcykgKSApICkgeworICAgICAgICAvLworICAgICAgICAvLyBGSVhNRSAtIHVzZSBleHBvbmVudGlhbCBiYWNrb2ZmIGhlcmUKKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCBUQ1JfNCggX19rbXBfbnRoICkgPiAoIF9fa21wX2F2YWlsX3Byb2MgPyBfX2ttcF9hdmFpbF9wcm9jIDoKKyAgICAgICAgICBfX2ttcF94cHJvYyApICkgeworICAgICAgICAgICAgS01QX1lJRUxEKCBUUlVFICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBLTVBfWUlFTERfU1BJTiggc3BpbnMgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBLTVBfRlNZTkNfQUNRVUlSRUQoIGxjayApOworICAgIHJldHVybiBLTVBfTE9DS19BQ1FVSVJFRF9GSVJTVDsKK30KKworaW50CitfX2ttcF9hY3F1aXJlX3Rhc19sb2NrKCBrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgcmV0dXJuIF9fa21wX2FjcXVpcmVfdGFzX2xvY2tfdGltZWRfdGVtcGxhdGUoIGxjaywgZ3RpZCApOworfQorCitzdGF0aWMgaW50CitfX2ttcF9hY3F1aXJlX3Rhc19sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3NldF9sb2NrIjsKKyAgICBpZiAoICggc2l6ZW9mICgga21wX3Rhc19sb2NrX3QgKSA8PSBPTVBfTE9DS19UX1NJWkUgKQorICAgICAgJiYgX19rbXBfaXNfdGFzX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoICggZ3RpZCA+PSAwICkgJiYgKCBfX2ttcF9nZXRfdGFzX2xvY2tfb3duZXIoIGxjayApID09IGd0aWQgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNBbHJlYWR5T3duZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX2FjcXVpcmVfdGFzX2xvY2soIGxjaywgZ3RpZCApOworfQorCitpbnQKK19fa21wX3Rlc3RfdGFzX2xvY2soIGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpZiAoICggbGNrLT5say5wb2xsID09IEtNUF9MT0NLX0ZSRUUodGFzKSApCisgICAgICAmJiBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIoICYgKCBsY2stPmxrLnBvbGwgKSwgS01QX0xPQ0tfRlJFRSh0YXMpLCBLTVBfTE9DS19CVVNZKGd0aWQrMSwgdGFzKSApICkgeworICAgICAgICBLTVBfRlNZTkNfQUNRVUlSRUQoIGxjayApOworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgaW50CitfX2ttcF90ZXN0X3Rhc19sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Rlc3RfbG9jayI7CisgICAgaWYgKCAoIHNpemVvZiAoIGttcF90YXNfbG9ja190ICkgPD0gT01QX0xPQ0tfVF9TSVpFICkKKyAgICAgICYmIF9fa21wX2lzX3Rhc19sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX3Rlc3RfdGFzX2xvY2soIGxjaywgZ3RpZCApOworfQorCitpbnQKK19fa21wX3JlbGVhc2VfdGFzX2xvY2soIGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIEtNUF9GU1lOQ19SRUxFQVNJTkcobGNrKTsKKyAgICBLTVBfU1RfUkVMMzIoICYobGNrLT5say5wb2xsKSwgS01QX0xPQ0tfRlJFRSh0YXMpICk7CisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBLTVBfWUlFTEQoIFRDUl80KCBfX2ttcF9udGggKSA+ICggX19rbXBfYXZhaWxfcHJvYyA/IF9fa21wX2F2YWlsX3Byb2MgOgorICAgICAgX19rbXBfeHByb2MgKSApOworICAgIHJldHVybiBLTVBfTE9DS19SRUxFQVNFRDsKK30KKworc3RhdGljIGludAorX19rbXBfcmVsZWFzZV90YXNfbG9ja193aXRoX2NoZWNrcygga21wX3Rhc19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF91bnNldF9sb2NrIjsKKyAgICBLTVBfTUIoKTsgIC8qIGluIGNhc2UgYW5vdGhlciBwcm9jZXNzb3IgaW5pdGlhbGl6ZWQgbG9jayAqLworICAgIGlmICggKCBzaXplb2YgKCBrbXBfdGFzX2xvY2tfdCApIDw9IE9NUF9MT0NLX1RfU0laRSApCisgICAgICAmJiBfX2ttcF9pc190YXNfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X3Rhc19sb2NrX293bmVyKCBsY2sgKSA9PSAtMSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nRnJlZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoICggZ3RpZCA+PSAwICkgJiYgKCBfX2ttcF9nZXRfdGFzX2xvY2tfb3duZXIoIGxjayApID49IDAgKQorICAgICAgJiYgKCBfX2ttcF9nZXRfdGFzX2xvY2tfb3duZXIoIGxjayApICE9IGd0aWQgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nU2V0QnlBbm90aGVyLCBmdW5jICk7CisgICAgfQorICAgIHJldHVybiBfX2ttcF9yZWxlYXNlX3Rhc19sb2NrKCBsY2ssIGd0aWQgKTsKK30KKwordm9pZAorX19rbXBfaW5pdF90YXNfbG9jaygga21wX3Rhc19sb2NrX3QgKiBsY2sgKQoreworICAgIFRDV180KCBsY2stPmxrLnBvbGwsIEtNUF9MT0NLX0ZSRUUodGFzKSApOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfaW5pdF90YXNfbG9ja193aXRoX2NoZWNrcygga21wX3Rhc19sb2NrX3QgKiBsY2sgKQoreworICAgIF9fa21wX2luaXRfdGFzX2xvY2soIGxjayApOworfQorCit2b2lkCitfX2ttcF9kZXN0cm95X3Rhc19sb2NrKCBrbXBfdGFzX2xvY2tfdCAqbGNrICkKK3sKKyAgICBsY2stPmxrLnBvbGwgPSAwOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZGVzdHJveV90YXNfbG9ja193aXRoX2NoZWNrcygga21wX3Rhc19sb2NrX3QgKmxjayApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX2Rlc3Ryb3lfbG9jayI7CisgICAgaWYgKCAoIHNpemVvZiAoIGttcF90YXNfbG9ja190ICkgPD0gT01QX0xPQ0tfVF9TSVpFICkKKyAgICAgICYmIF9fa21wX2lzX3Rhc19sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9nZXRfdGFzX2xvY2tfb3duZXIoIGxjayApICE9IC0xICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTdGlsbE93bmVkLCBmdW5jICk7CisgICAgfQorICAgIF9fa21wX2Rlc3Ryb3lfdGFzX2xvY2soIGxjayApOworfQorCisKKy8vCisvLyBuZXN0ZWQgdGVzdCBhbmQgc2V0IGxvY2tzCisvLworCitpbnQKK19fa21wX2FjcXVpcmVfbmVzdGVkX3Rhc19sb2NrKCBrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PSAwICk7CisKKyAgICBpZiAoIF9fa21wX2dldF90YXNfbG9ja19vd25lciggbGNrICkgPT0gZ3RpZCApIHsKKyAgICAgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgKz0gMTsKKyAgICAgICAgcmV0dXJuIEtNUF9MT0NLX0FDUVVJUkVEX05FWFQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBfX2ttcF9hY3F1aXJlX3Rhc19sb2NrX3RpbWVkX3RlbXBsYXRlKCBsY2ssIGd0aWQgKTsKKyAgICAgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAxOworICAgICAgICByZXR1cm4gS01QX0xPQ0tfQUNRVUlSRURfRklSU1Q7CisgICAgfQorfQorCitzdGF0aWMgaW50CitfX2ttcF9hY3F1aXJlX25lc3RlZF90YXNfbG9ja193aXRoX2NoZWNrcygga21wX3Rhc19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9zZXRfbmVzdF9sb2NrIjsKKyAgICBpZiAoICEgX19rbXBfaXNfdGFzX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOworICAgIH0KKyAgICByZXR1cm4gX19rbXBfYWNxdWlyZV9uZXN0ZWRfdGFzX2xvY2soIGxjaywgZ3RpZCApOworfQorCitpbnQKK19fa21wX3Rlc3RfbmVzdGVkX3Rhc19sb2NrKCBrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaW50IHJldHZhbDsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIGd0aWQgPj0gMCApOworCisgICAgaWYgKCBfX2ttcF9nZXRfdGFzX2xvY2tfb3duZXIoIGxjayApID09IGd0aWQgKSB7CisgICAgICAgIHJldHZhbCA9ICsrbGNrLT5say5kZXB0aF9sb2NrZWQ7CisgICAgfQorICAgIGVsc2UgaWYgKCAhX19rbXBfdGVzdF90YXNfbG9jayggbGNrLCBndGlkICkgKSB7CisgICAgICAgIHJldHZhbCA9IDA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgcmV0dmFsID0gbGNrLT5say5kZXB0aF9sb2NrZWQgPSAxOworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50CitfX2ttcF90ZXN0X25lc3RlZF90YXNfbG9ja193aXRoX2NoZWNrcygga21wX3Rhc19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF90ZXN0X25lc3RfbG9jayI7CisgICAgaWYgKCAhIF9fa21wX2lzX3Rhc19sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMgKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX3Rlc3RfbmVzdGVkX3Rhc19sb2NrKCBsY2ssIGd0aWQgKTsKK30KKworaW50CitfX2ttcF9yZWxlYXNlX25lc3RlZF90YXNfbG9jaygga21wX3Rhc19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIGd0aWQgPj0gMCApOworCisgICAgS01QX01CKCk7CisgICAgaWYgKCAtLShsY2stPmxrLmRlcHRoX2xvY2tlZCkgPT0gMCApIHsKKyAgICAgICAgX19rbXBfcmVsZWFzZV90YXNfbG9jayggbGNrLCBndGlkICk7CisgICAgICAgIHJldHVybiBLTVBfTE9DS19SRUxFQVNFRDsKKyAgICB9CisgICAgcmV0dXJuIEtNUF9MT0NLX1NUSUxMX0hFTEQ7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3JlbGVhc2VfbmVzdGVkX3Rhc19sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Vuc2V0X25lc3RfbG9jayI7CisgICAgS01QX01CKCk7ICAvKiBpbiBjYXNlIGFub3RoZXIgcHJvY2Vzc29yIGluaXRpYWxpemVkIGxvY2sgKi8KKyAgICBpZiAoICEgX19rbXBfaXNfdGFzX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2dldF90YXNfbG9ja19vd25lciggbGNrICkgPT0gLTEgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ0ZyZWUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9nZXRfdGFzX2xvY2tfb3duZXIoIGxjayApICE9IGd0aWQgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ1NldEJ5QW5vdGhlciwgZnVuYyApOworICAgIH0KKyAgICByZXR1cm4gX19rbXBfcmVsZWFzZV9uZXN0ZWRfdGFzX2xvY2soIGxjaywgZ3RpZCApOworfQorCit2b2lkCitfX2ttcF9pbml0X25lc3RlZF90YXNfbG9jaygga21wX3Rhc19sb2NrX3QgKiBsY2sgKQoreworICAgIF9fa21wX2luaXRfdGFzX2xvY2soIGxjayApOworICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMDsgLy8gPj0gMCBmb3IgbmVzdGFibGUgbG9ja3MsIC0xIGZvciBzaW1wbGUgbG9ja3MKK30KKworc3RhdGljIHZvaWQKK19fa21wX2luaXRfbmVzdGVkX3Rhc19sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdGFzX2xvY2tfdCAqIGxjayApCit7CisgICAgX19rbXBfaW5pdF9uZXN0ZWRfdGFzX2xvY2soIGxjayApOworfQorCit2b2lkCitfX2ttcF9kZXN0cm95X25lc3RlZF90YXNfbG9jaygga21wX3Rhc19sb2NrX3QgKmxjayApCit7CisgICAgX19rbXBfZGVzdHJveV90YXNfbG9jayggbGNrICk7CisgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAwOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZGVzdHJveV9uZXN0ZWRfdGFzX2xvY2tfd2l0aF9jaGVja3MoIGttcF90YXNfbG9ja190ICpsY2sgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9kZXN0cm95X25lc3RfbG9jayI7CisgICAgaWYgKCAhIF9fa21wX2lzX3Rhc19sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9nZXRfdGFzX2xvY2tfb3duZXIoIGxjayApICE9IC0xICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTdGlsbE93bmVkLCBmdW5jICk7CisgICAgfQorICAgIF9fa21wX2Rlc3Ryb3lfbmVzdGVkX3Rhc19sb2NrKCBsY2sgKTsKK30KKworCisjaWYgS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIGZ1dGV4IGxvY2tzICovCisKKy8vIGZ1dGV4IGxvY2tzIGFyZSByZWFsbHkganVzdCB0ZXN0IGFuZCBzZXQgbG9ja3MsIHdpdGggYSBkaWZmZXJlbnQgbWV0aG9kCisvLyBvZiBoYW5kbGluZyBjb250ZW50aW9uLiAgVGhleSB0YWtlIHRoZSBzYW1lIGFtb3VudCBvZiBzcGFjZSBhcyB0ZXN0IGFuZAorLy8gc2V0IGxvY2tzLCBhbmQgYXJlIGFsbG9jYXRlZCB0aGUgc2FtZSB3YXkgKGkuZS4gdXNlIHRoZSBhcmVhIGFsbG9jYXRlZCBieQorLy8gdGhlIGNvbXBpbGVyIGZvciBub24tbmVzdGVkIGxvY2tzIC8gYWxsb2NhdGUgbmVzdGVkIGxvY2tzIG9uIHRoZSBoZWFwKS4KKworc3RhdGljIGttcF9pbnQzMgorX19rbXBfZ2V0X2Z1dGV4X2xvY2tfb3duZXIoIGttcF9mdXRleF9sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIEtNUF9MT0NLX1NUUklQKCggVENSXzQoIGxjay0+bGsucG9sbCApID4+IDEgKSkgLSAxOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wKK19fa21wX2lzX2Z1dGV4X2xvY2tfbmVzdGFibGUoIGttcF9mdXRleF9sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIGxjay0+bGsuZGVwdGhfbG9ja2VkICE9IC0xOworfQorCitfX2ZvcmNlaW5saW5lIHN0YXRpYyBpbnQKK19fa21wX2FjcXVpcmVfZnV0ZXhfbG9ja190aW1lZF90ZW1wbGF0ZSgga21wX2Z1dGV4X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAga21wX2ludDMyIGd0aWRfY29kZSA9ICggZ3RpZCArIDEgKSA8PCAxOworCisgICAgS01QX01CKCk7CisKKyNpZmRlZiBVU0VfTE9DS19QUk9GSUxFCisgICAga21wX3VpbnQzMiBjdXJyID0gVENSXzQoIGxjay0+bGsucG9sbCApOworICAgIGlmICggKCBjdXJyICE9IDAgKSAmJiAoIGN1cnIgIT0gZ3RpZF9jb2RlICkgKQorICAgICAgICBfX2ttcF9wcmludGYoICJMT0NLIENPTlRFTlRJT046ICVwXG4iLCBsY2sgKTsKKyAgICAvKiBlbHNlIF9fa21wX3ByaW50ZiggIi4iICk7Ki8KKyNlbmRpZiAvKiBVU0VfTE9DS19QUk9GSUxFICovCisKKyAgICBLTVBfRlNZTkNfUFJFUEFSRSggbGNrICk7CisgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfYWNxdWlyZV9mdXRleF9sb2NrOiBsY2s6JXAoMHgleCksIFQjJWQgZW50ZXJpbmdcbiIsCisgICAgICBsY2ssIGxjay0+bGsucG9sbCwgZ3RpZCApICk7CisKKyAgICBrbXBfaW50MzIgcG9sbF92YWw7CisKKyAgICB3aGlsZSAoICggcG9sbF92YWwgPSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUMzIoICYgKCBsY2stPmxrLnBvbGwgKSwgS01QX0xPQ0tfRlJFRShmdXRleCksCisgICAgICAgICAgICAgS01QX0xPQ0tfQlVTWShndGlkX2NvZGUsIGZ1dGV4KSApICkgIT0gS01QX0xPQ0tfRlJFRShmdXRleCkgKSB7CisKKyAgICAgICAga21wX2ludDMyIGNvbmQgPSBLTVBfTE9DS19TVFJJUChwb2xsX3ZhbCkgJiAxOworICAgICAgICBLQV9UUkFDRSggMTAwMCwgKCJfX2ttcF9hY3F1aXJlX2Z1dGV4X2xvY2s6IGxjazolcCwgVCMlZCBwb2xsX3ZhbCA9IDB4JXggY29uZCA9IDB4JXhcbiIsCisgICAgICAgICAgIGxjaywgZ3RpZCwgcG9sbF92YWwsIGNvbmQgKSApOworCisgICAgICAgIC8vCisgICAgICAgIC8vIE5PVEU6IGlmIHlvdSB0cnkgdG8gdXNlIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uIGZvciB0aGlzIGJyYW5jaAorICAgICAgICAvLworICAgICAgICAvLyBpZiAoIHBvbGxfdmFsICYgMSA9PSAwICkKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlbiB0aGUgMTIuMCBjb21waWxlciBoYXMgYSBidWcgd2hlcmUgdGhlIGZvbGxvd2luZyBibG9jayB3aWxsCisgICAgICAgIC8vIGFsd2F5cyBiZSBza2lwcGVkLCByZWdhcmRsZXNzIG9mIHRoZSB2YWx1ZSBvZiB0aGUgTFNCIG9mIHBvbGxfdmFsLgorICAgICAgICAvLworICAgICAgICBpZiAoICEgY29uZCApIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBUcnkgdG8gc2V0IHRoZSBsc2IgaW4gdGhlIHBvbGwgdG8gaW5kaWNhdGUgdG8gdGhlIG93bmVyCisgICAgICAgICAgICAvLyB0aHJlYWQgdGhhdCB0aGV5IG5lZWQgdG8gd2FrZSB0aGlzIHRocmVhZCB1cC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBpZiAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDMyKCAmICggbGNrLT5say5wb2xsICksIHBvbGxfdmFsLCBwb2xsX3ZhbCB8IEtNUF9MT0NLX0JVU1koMSwgZnV0ZXgpICkgKSB7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfYWNxdWlyZV9mdXRleF9sb2NrOiBsY2s6JXAoMHgleCksIFQjJWQgY2FuJ3Qgc2V0IGJpdCAwXG4iLAorICAgICAgICAgICAgICAgICAgbGNrLCBsY2stPmxrLnBvbGwsIGd0aWQgKSApOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcG9sbF92YWwgfD0gS01QX0xPQ0tfQlVTWSgxLCBmdXRleCk7CisKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX2FjcXVpcmVfZnV0ZXhfbG9jazogbGNrOiVwKDB4JXgpLCBUIyVkIGJpdCAwIHNldFxuIiwKKyAgICAgICAgICAgICAgbGNrLCBsY2stPmxrLnBvbGwsIGd0aWQgKSApOworICAgICAgICB9CisKKyAgICAgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfYWNxdWlyZV9mdXRleF9sb2NrOiBsY2s6JXAsIFQjJWQgYmVmb3JlIGZ1dGV4X3dhaXQoMHgleClcbiIsCisgICAgICAgICAgIGxjaywgZ3RpZCwgcG9sbF92YWwgKSApOworCisgICAgICAgIGttcF9pbnQzMiByYzsKKyAgICAgICAgaWYgKCAoIHJjID0gc3lzY2FsbCggX19OUl9mdXRleCwgJiAoIGxjay0+bGsucG9sbCApLCBGVVRFWF9XQUlULAorICAgICAgICAgIHBvbGxfdmFsLCBOVUxMLCBOVUxMLCAwICkgKSAhPSAwICkgeworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfYWNxdWlyZV9mdXRleF9sb2NrOiBsY2s6JXAsIFQjJWQgZnV0ZXhfd2FpdCgweCV4KSBmYWlsZWQgKHJjPSVkIGVycm5vPSVkKVxuIiwKKyAgICAgICAgICAgICAgIGxjaywgZ3RpZCwgcG9sbF92YWwsIHJjLCBlcnJubyApICk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX2FjcXVpcmVfZnV0ZXhfbG9jazogbGNrOiVwLCBUIyVkIGFmdGVyIGZ1dGV4X3dhaXQoMHgleClcbiIsCisgICAgICAgICAgIGxjaywgZ3RpZCwgcG9sbF92YWwgKSApOworICAgICAgICAvLworICAgICAgICAvLyBUaGlzIHRocmVhZCBoYXMgbm93IGRvbmUgYSBzdWNjZXNzZnVsIGZ1dGV4IHdhaXQgY2FsbCBhbmQgd2FzCisgICAgICAgIC8vIGVudGVyZWQgb24gdGhlIE9TIGZ1dGV4IHF1ZXVlLiAgV2UgbXVzdCBub3cgcGVyZm9ybSBhIGZ1dGV4CisgICAgICAgIC8vIHdha2UgY2FsbCB3aGVuIHJlbGVhc2luZyB0aGUgbG9jaywgYXMgd2UgaGF2ZSBubyBpZGVhIGhvdyBtYW55CisgICAgICAgIC8vIG90aGVyIHRocmVhZHMgYXJlIGluIHRoZSBxdWV1ZS4KKyAgICAgICAgLy8KKyAgICAgICAgZ3RpZF9jb2RlIHw9IDE7CisgICAgfQorCisgICAgS01QX0ZTWU5DX0FDUVVJUkVEKCBsY2sgKTsKKyAgICBLQV9UUkFDRSggMTAwMCwgKCJfX2ttcF9hY3F1aXJlX2Z1dGV4X2xvY2s6IGxjazolcCgweCV4KSwgVCMlZCBleGl0aW5nXG4iLAorICAgICAgbGNrLCBsY2stPmxrLnBvbGwsIGd0aWQgKSApOworICAgIHJldHVybiBLTVBfTE9DS19BQ1FVSVJFRF9GSVJTVDsKK30KKworaW50CitfX2ttcF9hY3F1aXJlX2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgcmV0dXJuIF9fa21wX2FjcXVpcmVfZnV0ZXhfbG9ja190aW1lZF90ZW1wbGF0ZSggbGNrLCBndGlkICk7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX2FjcXVpcmVfZnV0ZXhfbG9ja193aXRoX2NoZWNrcygga21wX2Z1dGV4X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3NldF9sb2NrIjsKKyAgICBpZiAoICggc2l6ZW9mICgga21wX2Z1dGV4X2xvY2tfdCApIDw9IE9NUF9MT0NLX1RfU0laRSApCisgICAgICAmJiBfX2ttcF9pc19mdXRleF9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCAoIGd0aWQgPj0gMCApICYmICggX19rbXBfZ2V0X2Z1dGV4X2xvY2tfb3duZXIoIGxjayApID09IGd0aWQgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNBbHJlYWR5T3duZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX2FjcXVpcmVfZnV0ZXhfbG9jayggbGNrLCBndGlkICk7Cit9CisKK2ludAorX19rbXBfdGVzdF9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpZiAoIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMiggJiAoIGxjay0+bGsucG9sbCApLCBLTVBfTE9DS19GUkVFKGZ1dGV4KSwgS01QX0xPQ0tfQlVTWShndGlkKzEsIGZ1dGV4KSA8PCAxICkgKSB7CisgICAgICAgIEtNUF9GU1lOQ19BQ1FVSVJFRCggbGNrICk7CisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3Rlc3RfZnV0ZXhfbG9ja193aXRoX2NoZWNrcygga21wX2Z1dGV4X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Rlc3RfbG9jayI7CisgICAgaWYgKCAoIHNpemVvZiAoIGttcF9mdXRleF9sb2NrX3QgKSA8PSBPTVBfTE9DS19UX1NJWkUgKQorICAgICAgJiYgX19rbXBfaXNfZnV0ZXhfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jICk7CisgICAgfQorICAgIHJldHVybiBfX2ttcF90ZXN0X2Z1dGV4X2xvY2soIGxjaywgZ3RpZCApOworfQorCitpbnQKK19fa21wX3JlbGVhc2VfZnV0ZXhfbG9jaygga21wX2Z1dGV4X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBLQV9UUkFDRSggMTAwMCwgKCJfX2ttcF9yZWxlYXNlX2Z1dGV4X2xvY2s6IGxjazolcCgweCV4KSwgVCMlZCBlbnRlcmluZ1xuIiwKKyAgICAgIGxjaywgbGNrLT5say5wb2xsLCBndGlkICkgKTsKKworICAgIEtNUF9GU1lOQ19SRUxFQVNJTkcobGNrKTsKKworICAgIGttcF9pbnQzMiBwb2xsX3ZhbCA9IEtNUF9YQ0hHX0ZJWEVEMzIoICYgKCBsY2stPmxrLnBvbGwgKSwgS01QX0xPQ0tfRlJFRShmdXRleCkgKTsKKworICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX3JlbGVhc2VfZnV0ZXhfbG9jazogbGNrOiVwLCBUIyVkIHJlbGVhc2VkIHBvbGxfdmFsID0gMHgleFxuIiwKKyAgICAgICBsY2ssIGd0aWQsIHBvbGxfdmFsICkgKTsKKworICAgIGlmICggS01QX0xPQ0tfU1RSSVAocG9sbF92YWwpICYgMSApIHsKKyAgICAgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfcmVsZWFzZV9mdXRleF9sb2NrOiBsY2s6JXAsIFQjJWQgZnV0ZXhfd2FrZSAxIHRocmVhZFxuIiwKKyAgICAgICAgICAgbGNrLCBndGlkICkgKTsKKyAgICAgICAgc3lzY2FsbCggX19OUl9mdXRleCwgJiAoIGxjay0+bGsucG9sbCApLCBGVVRFWF9XQUtFLCBLTVBfTE9DS19CVVNZKDEsIGZ1dGV4KSwgTlVMTCwgTlVMTCwgMCApOworICAgIH0KKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfcmVsZWFzZV9mdXRleF9sb2NrOiBsY2s6JXAoMHgleCksIFQjJWQgZXhpdGluZ1xuIiwKKyAgICAgIGxjaywgbGNrLT5say5wb2xsLCBndGlkICkgKTsKKworICAgIEtNUF9ZSUVMRCggVENSXzQoIF9fa21wX250aCApID4gKCBfX2ttcF9hdmFpbF9wcm9jID8gX19rbXBfYXZhaWxfcHJvYyA6CisgICAgICBfX2ttcF94cHJvYyApICk7CisgICAgcmV0dXJuIEtNUF9MT0NLX1JFTEVBU0VEOworfQorCitzdGF0aWMgaW50CitfX2ttcF9yZWxlYXNlX2Z1dGV4X2xvY2tfd2l0aF9jaGVja3MoIGttcF9mdXRleF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF91bnNldF9sb2NrIjsKKyAgICBLTVBfTUIoKTsgIC8qIGluIGNhc2UgYW5vdGhlciBwcm9jZXNzb3IgaW5pdGlhbGl6ZWQgbG9jayAqLworICAgIGlmICggKCBzaXplb2YgKCBrbXBfZnV0ZXhfbG9ja190ICkgPD0gT01QX0xPQ0tfVF9TSVpFICkKKyAgICAgICYmIF9fa21wX2lzX2Z1dGV4X2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2dldF9mdXRleF9sb2NrX293bmVyKCBsY2sgKSA9PSAtMSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nRnJlZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoICggZ3RpZCA+PSAwICkgJiYgKCBfX2ttcF9nZXRfZnV0ZXhfbG9ja19vd25lciggbGNrICkgPj0gMCApCisgICAgICAmJiAoIF9fa21wX2dldF9mdXRleF9sb2NrX293bmVyKCBsY2sgKSAhPSBndGlkICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ1NldEJ5QW5vdGhlciwgZnVuYyApOworICAgIH0KKyAgICByZXR1cm4gX19rbXBfcmVsZWFzZV9mdXRleF9sb2NrKCBsY2ssIGd0aWQgKTsKK30KKwordm9pZAorX19rbXBfaW5pdF9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICogbGNrICkKK3sKKyAgICBUQ1dfNCggbGNrLT5say5wb2xsLCBLTVBfTE9DS19GUkVFKGZ1dGV4KSApOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfaW5pdF9mdXRleF9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfZnV0ZXhfbG9ja190ICogbGNrICkKK3sKKyAgICBfX2ttcF9pbml0X2Z1dGV4X2xvY2soIGxjayApOworfQorCit2b2lkCitfX2ttcF9kZXN0cm95X2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKmxjayApCit7CisgICAgbGNrLT5say5wb2xsID0gMDsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2Rlc3Ryb3lfZnV0ZXhfbG9ja193aXRoX2NoZWNrcygga21wX2Z1dGV4X2xvY2tfdCAqbGNrICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfZGVzdHJveV9sb2NrIjsKKyAgICBpZiAoICggc2l6ZW9mICgga21wX2Z1dGV4X2xvY2tfdCApIDw9IE9NUF9MT0NLX1RfU0laRSApCisgICAgICAmJiBfX2ttcF9pc19mdXRleF9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9nZXRfZnV0ZXhfbG9ja19vd25lciggbGNrICkgIT0gLTEgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1N0aWxsT3duZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgX19rbXBfZGVzdHJveV9mdXRleF9sb2NrKCBsY2sgKTsKK30KKworCisvLworLy8gbmVzdGVkIGZ1dGV4IGxvY2tzCisvLworCitpbnQKK19fa21wX2FjcXVpcmVfbmVzdGVkX2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIGd0aWQgPj0gMCApOworCisgICAgaWYgKCBfX2ttcF9nZXRfZnV0ZXhfbG9ja19vd25lciggbGNrICkgPT0gZ3RpZCApIHsKKyAgICAgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgKz0gMTsKKyAgICAgICAgcmV0dXJuIEtNUF9MT0NLX0FDUVVJUkVEX05FWFQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBfX2ttcF9hY3F1aXJlX2Z1dGV4X2xvY2tfdGltZWRfdGVtcGxhdGUoIGxjaywgZ3RpZCApOworICAgICAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IDE7CisgICAgICAgIHJldHVybiBLTVBfTE9DS19BQ1FVSVJFRF9GSVJTVDsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX2FjcXVpcmVfbmVzdGVkX2Z1dGV4X2xvY2tfd2l0aF9jaGVja3MoIGttcF9mdXRleF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9zZXRfbmVzdF9sb2NrIjsKKyAgICBpZiAoICEgX19rbXBfaXNfZnV0ZXhfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgfQorICAgIHJldHVybiBfX2ttcF9hY3F1aXJlX25lc3RlZF9mdXRleF9sb2NrKCBsY2ssIGd0aWQgKTsKK30KKworaW50CitfX2ttcF90ZXN0X25lc3RlZF9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpbnQgcmV0dmFsOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PSAwICk7CisKKyAgICBpZiAoIF9fa21wX2dldF9mdXRleF9sb2NrX293bmVyKCBsY2sgKSA9PSBndGlkICkgeworICAgICAgICByZXR2YWwgPSArK2xjay0+bGsuZGVwdGhfbG9ja2VkOworICAgIH0KKyAgICBlbHNlIGlmICggIV9fa21wX3Rlc3RfZnV0ZXhfbG9jayggbGNrLCBndGlkICkgKSB7CisgICAgICAgIHJldHZhbCA9IDA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgcmV0dmFsID0gbGNrLT5say5kZXB0aF9sb2NrZWQgPSAxOworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50CitfX2ttcF90ZXN0X25lc3RlZF9mdXRleF9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdGVzdF9uZXN0X2xvY2siOworICAgIGlmICggISBfX2ttcF9pc19mdXRleF9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMgKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX3Rlc3RfbmVzdGVkX2Z1dGV4X2xvY2soIGxjaywgZ3RpZCApOworfQorCitpbnQKK19fa21wX3JlbGVhc2VfbmVzdGVkX2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIGd0aWQgPj0gMCApOworCisgICAgS01QX01CKCk7CisgICAgaWYgKCAtLShsY2stPmxrLmRlcHRoX2xvY2tlZCkgPT0gMCApIHsKKyAgICAgICAgX19rbXBfcmVsZWFzZV9mdXRleF9sb2NrKCBsY2ssIGd0aWQgKTsKKyAgICAgICAgcmV0dXJuIEtNUF9MT0NLX1JFTEVBU0VEOworICAgIH0KKyAgICByZXR1cm4gS01QX0xPQ0tfU1RJTExfSEVMRDsKK30KKworc3RhdGljIGludAorX19rbXBfcmVsZWFzZV9uZXN0ZWRfZnV0ZXhfbG9ja193aXRoX2NoZWNrcygga21wX2Z1dGV4X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Vuc2V0X25lc3RfbG9jayI7CisgICAgS01QX01CKCk7ICAvKiBpbiBjYXNlIGFub3RoZXIgcHJvY2Vzc29yIGluaXRpYWxpemVkIGxvY2sgKi8KKyAgICBpZiAoICEgX19rbXBfaXNfZnV0ZXhfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X2Z1dGV4X2xvY2tfb3duZXIoIGxjayApID09IC0xICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tVbnNldHRpbmdGcmVlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X2Z1dGV4X2xvY2tfb3duZXIoIGxjayApICE9IGd0aWQgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ1NldEJ5QW5vdGhlciwgZnVuYyApOworICAgIH0KKyAgICByZXR1cm4gX19rbXBfcmVsZWFzZV9uZXN0ZWRfZnV0ZXhfbG9jayggbGNrLCBndGlkICk7Cit9CisKK3ZvaWQKK19fa21wX2luaXRfbmVzdGVkX2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKiBsY2sgKQoreworICAgIF9fa21wX2luaXRfZnV0ZXhfbG9jayggbGNrICk7CisgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAwOyAvLyA+PSAwIGZvciBuZXN0YWJsZSBsb2NrcywgLTEgZm9yIHNpbXBsZSBsb2NrcworfQorCitzdGF0aWMgdm9pZAorX19rbXBfaW5pdF9uZXN0ZWRfZnV0ZXhfbG9ja193aXRoX2NoZWNrcygga21wX2Z1dGV4X2xvY2tfdCAqIGxjayApCit7CisgICAgX19rbXBfaW5pdF9uZXN0ZWRfZnV0ZXhfbG9jayggbGNrICk7Cit9CisKK3ZvaWQKK19fa21wX2Rlc3Ryb3lfbmVzdGVkX2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKmxjayApCit7CisgICAgX19rbXBfZGVzdHJveV9mdXRleF9sb2NrKCBsY2sgKTsKKyAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9kZXN0cm95X25lc3RlZF9mdXRleF9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfZnV0ZXhfbG9ja190ICpsY2sgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9kZXN0cm95X25lc3RfbG9jayI7CisgICAgaWYgKCAhIF9fa21wX2lzX2Z1dGV4X2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2dldF9mdXRleF9sb2NrX293bmVyKCBsY2sgKSAhPSAtMSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrU3RpbGxPd25lZCwgZnVuYyApOworICAgIH0KKyAgICBfX2ttcF9kZXN0cm95X25lc3RlZF9mdXRleF9sb2NrKCBsY2sgKTsKK30KKworI2VuZGlmIC8vIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0pCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiB0aWNrZXQgKGJha2VyeSkgbG9ja3MgKi8KKworc3RhdGljIGttcF9pbnQzMgorX19rbXBfZ2V0X3RpY2tldF9sb2NrX293bmVyKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrICkKK3sKKyAgICByZXR1cm4gVENSXzQoIGxjay0+bGsub3duZXJfaWQgKSAtIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbAorX19rbXBfaXNfdGlja2V0X2xvY2tfbmVzdGFibGUoIGttcF90aWNrZXRfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiBsY2stPmxrLmRlcHRoX2xvY2tlZCAhPSAtMTsKK30KKworc3RhdGljIGttcF91aW50MzIKK19fa21wX2Jha2VyeV9jaGVjayhrbXBfdWludDMyIHZhbHVlLCBrbXBfdWludDMyIGNoZWNrZXIpCit7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiBwYXVzZTsKKworICAgIGlmICh2YWx1ZSA9PSBjaGVja2VyKSB7CisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICBmb3IgKHBhdXNlID0gY2hlY2tlciAtIHZhbHVlOyBwYXVzZSAhPSAwOyAtLXBhdXNlKTsKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKK19fZm9yY2VpbmxpbmUgc3RhdGljIGludAorX19rbXBfYWNxdWlyZV90aWNrZXRfbG9ja190aW1lZF90ZW1wbGF0ZSgga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGttcF91aW50MzIgbXlfdGlja2V0OworICAgIEtNUF9NQigpOworCisgICAgbXlfdGlja2V0ID0gS01QX1RFU1RfVEhFTl9JTkMzMiggKGttcF9pbnQzMiAqKSAmbGNrLT5say5uZXh0X3RpY2tldCApOworCisjaWZkZWYgVVNFX0xPQ0tfUFJPRklMRQorICAgIGlmICggVENSXzQoIGxjay0+bGsubm93X3NlcnZpbmcgKSAhPSBteV90aWNrZXQgKQorICAgICAgICBfX2ttcF9wcmludGYoICJMT0NLIENPTlRFTlRJT046ICVwXG4iLCBsY2sgKTsKKyAgICAvKiBlbHNlIF9fa21wX3ByaW50ZiggIi4iICk7Ki8KKyNlbmRpZiAvKiBVU0VfTE9DS19QUk9GSUxFICovCisKKyAgICBpZiAoIFRDUl80KCBsY2stPmxrLm5vd19zZXJ2aW5nICkgPT0gbXlfdGlja2V0ICkgeworICAgICAgICBLTVBfRlNZTkNfQUNRVUlSRUQobGNrKTsKKyAgICAgICAgcmV0dXJuIEtNUF9MT0NLX0FDUVVJUkVEX0ZJUlNUOworICAgIH0KKyAgICBLTVBfV0FJVF9ZSUVMRCggJmxjay0+bGsubm93X3NlcnZpbmcsIG15X3RpY2tldCwgX19rbXBfYmFrZXJ5X2NoZWNrLCBsY2sgKTsKKyAgICBLTVBfRlNZTkNfQUNRVUlSRUQobGNrKTsKKyAgICByZXR1cm4gS01QX0xPQ0tfQUNRVUlSRURfRklSU1Q7Cit9CisKK2ludAorX19rbXBfYWNxdWlyZV90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIHJldHVybiBfX2ttcF9hY3F1aXJlX3RpY2tldF9sb2NrX3RpbWVkX3RlbXBsYXRlKCBsY2ssIGd0aWQgKTsKK30KKworc3RhdGljIGludAorX19rbXBfYWNxdWlyZV90aWNrZXRfbG9ja193aXRoX2NoZWNrcygga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9zZXRfbG9jayI7CisgICAgaWYgKCBsY2stPmxrLmluaXRpYWxpemVkICE9IGxjayApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfaXNfdGlja2V0X2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoICggZ3RpZCA+PSAwICkgJiYgKCBfX2ttcF9nZXRfdGlja2V0X2xvY2tfb3duZXIoIGxjayApID09IGd0aWQgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNBbHJlYWR5T3duZWQsIGZ1bmMgKTsKKyAgICB9CisKKyAgICBfX2ttcF9hY3F1aXJlX3RpY2tldF9sb2NrKCBsY2ssIGd0aWQgKTsKKworICAgIGxjay0+bGsub3duZXJfaWQgPSBndGlkICsgMTsKKyAgICByZXR1cm4gS01QX0xPQ0tfQUNRVUlSRURfRklSU1Q7Cit9CisKK2ludAorX19rbXBfdGVzdF90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGttcF91aW50MzIgbXlfdGlja2V0ID0gVENSXzQoIGxjay0+bGsubmV4dF90aWNrZXQgKTsKKyAgICBpZiAoIFRDUl80KCBsY2stPmxrLm5vd19zZXJ2aW5nICkgPT0gbXlfdGlja2V0ICkgeworICAgICAgICBrbXBfdWludDMyIG5leHRfdGlja2V0ID0gbXlfdGlja2V0ICsgMTsKKyAgICAgICAgaWYgKCBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIoIChrbXBfaW50MzIgKikgJmxjay0+bGsubmV4dF90aWNrZXQsCisgICAgICAgICAgbXlfdGlja2V0LCBuZXh0X3RpY2tldCApICkgeworICAgICAgICAgICAgS01QX0ZTWU5DX0FDUVVJUkVEKCBsY2sgKTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGludAorX19rbXBfdGVzdF90aWNrZXRfbG9ja193aXRoX2NoZWNrcygga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF90ZXN0X2xvY2siOworICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2lzX3RpY2tldF9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICB9CisKKyAgICBpbnQgcmV0dmFsID0gX19rbXBfdGVzdF90aWNrZXRfbG9jayggbGNrLCBndGlkICk7CisKKyAgICBpZiAoIHJldHZhbCApIHsKKyAgICAgICAgbGNrLT5say5vd25lcl9pZCA9IGd0aWQgKyAxOworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorCitpbnQKK19fa21wX3JlbGVhc2VfdGlja2V0X2xvY2soIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBrbXBfdWludDMyICBkaXN0YW5jZTsKKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgS01QX0ZTWU5DX1JFTEVBU0lORyhsY2spOworICAgIGRpc3RhbmNlID0gKCBUQ1JfNCggbGNrLT5say5uZXh0X3RpY2tldCApIC0gVENSXzQoIGxjay0+bGsubm93X3NlcnZpbmcgKSApOworCisgICAgS01QX1NUX1JFTDMyKCAmKGxjay0+bGsubm93X3NlcnZpbmcpLCBsY2stPmxrLm5vd19zZXJ2aW5nICsgMSApOworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBLTVBfWUlFTEQoIGRpc3RhbmNlCisgICAgICA+IChrbXBfdWludDMyKSAoX19rbXBfYXZhaWxfcHJvYyA/IF9fa21wX2F2YWlsX3Byb2MgOiBfX2ttcF94cHJvYykgKTsKKyAgICByZXR1cm4gS01QX0xPQ0tfUkVMRUFTRUQ7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3JlbGVhc2VfdGlja2V0X2xvY2tfd2l0aF9jaGVja3MoIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdW5zZXRfbG9jayI7CisgICAgS01QX01CKCk7ICAvKiBpbiBjYXNlIGFub3RoZXIgcHJvY2Vzc29yIGluaXRpYWxpemVkIGxvY2sgKi8KKyAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9pc190aWNrZXRfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X3RpY2tldF9sb2NrX293bmVyKCBsY2sgKSA9PSAtMSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nRnJlZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoICggZ3RpZCA+PSAwICkgJiYgKCBfX2ttcF9nZXRfdGlja2V0X2xvY2tfb3duZXIoIGxjayApID49IDAgKQorICAgICAgJiYgKCBfX2ttcF9nZXRfdGlja2V0X2xvY2tfb3duZXIoIGxjayApICE9IGd0aWQgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nU2V0QnlBbm90aGVyLCBmdW5jICk7CisgICAgfQorICAgIGxjay0+bGsub3duZXJfaWQgPSAwOworICAgIHJldHVybiBfX2ttcF9yZWxlYXNlX3RpY2tldF9sb2NrKCBsY2ssIGd0aWQgKTsKK30KKwordm9pZAorX19rbXBfaW5pdF90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKiBsY2sgKQoreworICAgIGxjay0+bGsubG9jYXRpb24gPSBOVUxMOworICAgIFRDV180KCBsY2stPmxrLm5leHRfdGlja2V0LCAwICk7CisgICAgVENXXzQoIGxjay0+bGsubm93X3NlcnZpbmcsIDAgKTsKKyAgICBsY2stPmxrLm93bmVyX2lkID0gMDsgICAgICAvLyBubyB0aHJlYWQgb3ducyB0aGUgbG9jay4KKyAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IC0xOyAvLyAtMSA9PiBub3QgYSBuZXN0ZWQgbG9jay4KKyAgICBsY2stPmxrLmluaXRpYWxpemVkID0gKGttcF90aWNrZXRfbG9jayAqKWxjazsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2luaXRfdGlja2V0X2xvY2tfd2l0aF9jaGVja3MoIGttcF90aWNrZXRfbG9ja190ICogbGNrICkKK3sKKyAgICBfX2ttcF9pbml0X3RpY2tldF9sb2NrKCBsY2sgKTsKK30KKwordm9pZAorX19rbXBfZGVzdHJveV90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKmxjayApCit7CisgICAgbGNrLT5say5pbml0aWFsaXplZCA9IE5VTEw7CisgICAgbGNrLT5say5sb2NhdGlvbiAgICA9IE5VTEw7CisgICAgbGNrLT5say5uZXh0X3RpY2tldCA9IDA7CisgICAgbGNrLT5say5ub3dfc2VydmluZyA9IDA7CisgICAgbGNrLT5say5vd25lcl9pZCA9IDA7CisgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAtMTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2Rlc3Ryb3lfdGlja2V0X2xvY2tfd2l0aF9jaGVja3MoIGttcF90aWNrZXRfbG9ja190ICpsY2sgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9kZXN0cm95X2xvY2siOworICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2lzX3RpY2tldF9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9nZXRfdGlja2V0X2xvY2tfb3duZXIoIGxjayApICE9IC0xICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTdGlsbE93bmVkLCBmdW5jICk7CisgICAgfQorICAgIF9fa21wX2Rlc3Ryb3lfdGlja2V0X2xvY2soIGxjayApOworfQorCisKKy8vCisvLyBuZXN0ZWQgdGlja2V0IGxvY2tzCisvLworCitpbnQKK19fa21wX2FjcXVpcmVfbmVzdGVkX3RpY2tldF9sb2NrKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PSAwICk7CisKKyAgICBpZiAoIF9fa21wX2dldF90aWNrZXRfbG9ja19vd25lciggbGNrICkgPT0gZ3RpZCApIHsKKyAgICAgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgKz0gMTsKKyAgICAgICAgcmV0dXJuIEtNUF9MT0NLX0FDUVVJUkVEX05FWFQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBfX2ttcF9hY3F1aXJlX3RpY2tldF9sb2NrX3RpbWVkX3RlbXBsYXRlKCBsY2ssIGd0aWQgKTsKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMTsKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIGxjay0+bGsub3duZXJfaWQgPSBndGlkICsgMTsKKyAgICAgICAgcmV0dXJuIEtNUF9MT0NLX0FDUVVJUkVEX0ZJUlNUOworICAgIH0KK30KKworc3RhdGljIGludAorX19rbXBfYWNxdWlyZV9uZXN0ZWRfdGlja2V0X2xvY2tfd2l0aF9jaGVja3MoIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfc2V0X25lc3RfbG9jayI7CisgICAgaWYgKCBsY2stPmxrLmluaXRpYWxpemVkICE9IGxjayApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggISBfX2ttcF9pc190aWNrZXRfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgfQorICAgIHJldHVybiBfX2ttcF9hY3F1aXJlX25lc3RlZF90aWNrZXRfbG9jayggbGNrLCBndGlkICk7Cit9CisKK2ludAorX19rbXBfdGVzdF9uZXN0ZWRfdGlja2V0X2xvY2soIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpbnQgcmV0dmFsOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PSAwICk7CisKKyAgICBpZiAoIF9fa21wX2dldF90aWNrZXRfbG9ja19vd25lciggbGNrICkgPT0gZ3RpZCApIHsKKyAgICAgICAgcmV0dmFsID0gKytsY2stPmxrLmRlcHRoX2xvY2tlZDsKKyAgICB9CisgICAgZWxzZSBpZiAoICFfX2ttcF90ZXN0X3RpY2tldF9sb2NrKCBsY2ssIGd0aWQgKSApIHsKKyAgICAgICAgcmV0dmFsID0gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEtNUF9NQigpOworICAgICAgICByZXR2YWwgPSBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IDE7CisgICAgICAgIEtNUF9NQigpOworICAgICAgICBsY2stPmxrLm93bmVyX2lkID0gZ3RpZCArIDE7CisgICAgfQorICAgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3Rlc3RfbmVzdGVkX3RpY2tldF9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrLAorICBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Rlc3RfbmVzdF9sb2NrIjsKKyAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCAhIF9fa21wX2lzX3RpY2tldF9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMgKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX3Rlc3RfbmVzdGVkX3RpY2tldF9sb2NrKCBsY2ssIGd0aWQgKTsKK30KKworaW50CitfX2ttcF9yZWxlYXNlX25lc3RlZF90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIGd0aWQgPj0gMCApOworCisgICAgS01QX01CKCk7CisgICAgaWYgKCAtLShsY2stPmxrLmRlcHRoX2xvY2tlZCkgPT0gMCApIHsKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIGxjay0+bGsub3duZXJfaWQgPSAwOworICAgICAgICBfX2ttcF9yZWxlYXNlX3RpY2tldF9sb2NrKCBsY2ssIGd0aWQgKTsKKyAgICAgICAgcmV0dXJuIEtNUF9MT0NLX1JFTEVBU0VEOworICAgIH0KKyAgICByZXR1cm4gS01QX0xPQ0tfU1RJTExfSEVMRDsKK30KKworc3RhdGljIGludAorX19rbXBfcmVsZWFzZV9uZXN0ZWRfdGlja2V0X2xvY2tfd2l0aF9jaGVja3MoIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdW5zZXRfbmVzdF9sb2NrIjsKKyAgICBLTVBfTUIoKTsgIC8qIGluIGNhc2UgYW5vdGhlciBwcm9jZXNzb3IgaW5pdGlhbGl6ZWQgbG9jayAqLworICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKyAgICBpZiAoICEgX19rbXBfaXNfdGlja2V0X2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2dldF90aWNrZXRfbG9ja19vd25lciggbGNrICkgPT0gLTEgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ0ZyZWUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9nZXRfdGlja2V0X2xvY2tfb3duZXIoIGxjayApICE9IGd0aWQgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ1NldEJ5QW5vdGhlciwgZnVuYyApOworICAgIH0KKyAgICByZXR1cm4gX19rbXBfcmVsZWFzZV9uZXN0ZWRfdGlja2V0X2xvY2soIGxjaywgZ3RpZCApOworfQorCit2b2lkCitfX2ttcF9pbml0X25lc3RlZF90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKiBsY2sgKQoreworICAgIF9fa21wX2luaXRfdGlja2V0X2xvY2soIGxjayApOworICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMDsgLy8gPj0gMCBmb3IgbmVzdGFibGUgbG9ja3MsIC0xIGZvciBzaW1wbGUgbG9ja3MKK30KKworc3RhdGljIHZvaWQKK19fa21wX2luaXRfbmVzdGVkX3RpY2tldF9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdGlja2V0X2xvY2tfdCAqIGxjayApCit7CisgICAgX19rbXBfaW5pdF9uZXN0ZWRfdGlja2V0X2xvY2soIGxjayApOworfQorCit2b2lkCitfX2ttcF9kZXN0cm95X25lc3RlZF90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKmxjayApCit7CisgICAgX19rbXBfZGVzdHJveV90aWNrZXRfbG9jayggbGNrICk7CisgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAwOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZGVzdHJveV9uZXN0ZWRfdGlja2V0X2xvY2tfd2l0aF9jaGVja3MoIGttcF90aWNrZXRfbG9ja190ICpsY2sgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9kZXN0cm95X25lc3RfbG9jayI7CisgICAgaWYgKCBsY2stPmxrLmluaXRpYWxpemVkICE9IGxjayApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggISBfX2ttcF9pc190aWNrZXRfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X3RpY2tldF9sb2NrX293bmVyKCBsY2sgKSAhPSAtMSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrU3RpbGxPd25lZCwgZnVuYyApOworICAgIH0KKyAgICBfX2ttcF9kZXN0cm95X25lc3RlZF90aWNrZXRfbG9jayggbGNrICk7Cit9CisKKworLy8KKy8vIGFjY2VzcyBmdW5jdGlvbnMgdG8gZmllbGRzIHdoaWNoIGRvbid0IGV4aXN0IGZvciBhbGwgbG9jayBraW5kcy4KKy8vCisKK3N0YXRpYyBpbnQKK19fa21wX2lzX3RpY2tldF9sb2NrX2luaXRpYWxpemVkKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrICkKK3sKKyAgICByZXR1cm4gbGNrID09IGxjay0+bGsuaW5pdGlhbGl6ZWQ7Cit9CisKK3N0YXRpYyBjb25zdCBpZGVudF90ICoKK19fa21wX2dldF90aWNrZXRfbG9ja19sb2NhdGlvbigga21wX3RpY2tldF9sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIGxjay0+bGsubG9jYXRpb247Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zZXRfdGlja2V0X2xvY2tfbG9jYXRpb24oIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGNvbnN0IGlkZW50X3QgKmxvYyApCit7CisgICAgbGNrLT5say5sb2NhdGlvbiA9IGxvYzsKK30KKworc3RhdGljIGttcF9sb2NrX2ZsYWdzX3QKK19fa21wX2dldF90aWNrZXRfbG9ja19mbGFncygga21wX3RpY2tldF9sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIGxjay0+bGsuZmxhZ3M7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zZXRfdGlja2V0X2xvY2tfZmxhZ3MoIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9sb2NrX2ZsYWdzX3QgZmxhZ3MgKQoreworICAgIGxjay0+bGsuZmxhZ3MgPSBmbGFnczsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBxdWV1aW5nIGxvY2tzICovCisKKy8qCisgKiBGaXJzdCB0aGUgc3RhdGVzCisgKiAoaGVhZCx0YWlsKSA9ICAwLCAwICBtZWFucyBsb2NrIGlzIHVuaGVsZCwgbm9ib2R5IG9uIHF1ZXVlCisgKiAgIFVJTlRfTUFYIG9yIC0xLCAwICBtZWFucyBsb2NrIGlzIGhlbGQsIG5vYm9keSBvbiBxdWV1ZQorICogICAgICAgICAgICAgICAgaCwgaCAgbWVhbnMgbG9jayBpcyBoZWxkIG9yIGFib3V0IHRvIHRyYW5zaXRpb24sIDEgZWxlbWVudCBvbiBxdWV1ZQorICogICAgICAgICAgICAgICAgaCwgdCAgaCA8PiB0LCBtZWFucyBsb2NrIGlzIGhlbGQgb3IgYWJvdXQgdG8gdHJhbnNpdGlvbiwgPjEgZWxlbWVudHMgb24gcXVldWUKKyAqCisgKiBOb3cgdGhlIHRyYW5zaXRpb25zCisgKiAgICBBY3F1aXJlKDAsMCkgID0gLTEgLDAKKyAqICAgIFJlbGVhc2UoMCwwKSAgPSBFcnJvcgorICogICAgQWNxdWlyZSgtMSwwKSA9ICBoICxoICAgIGggPiAwCisgKiAgICBSZWxlYXNlKC0xLDApID0gIDAgLDAKKyAqICAgIEFjcXVpcmUoaCxoKSAgPSAgaCAsdCAgICBoID4gMCwgdCA+IDAsIGggPD4gdAorICogICAgUmVsZWFzZShoLGgpICA9IC0xICwwICAgIGggPiAwCisgKiAgICBBY3F1aXJlKGgsdCkgID0gIGggLHQnICAgaCA+IDAsIHQgPiAwLCB0JyA+IDAsIGggPD4gdCwgaCA8PiB0JywgdCA8PiB0JworICogICAgUmVsZWFzZShoLHQpICA9ICBoJyx0ICAgIGggPiAwLCB0ID4gMCwgaCA8PiB0LCBoIDw+IGgnLCBoJyBtYXliZSA9IHQKKyAqCisgKiBBbmQgcGljdG9yaWFsbHkKKyAqCisgKgorICogICAgICAgICAgKy0tLS0tKworICogICAgICAgICAgfCAwLCAwfC0tLS0tLS0gcmVsZWFzZSAtLS0tLS0tPiBFcnJvcgorICogICAgICAgICAgKy0tLS0tKworICogICAgICAgICAgICB8ICBeCisgKiAgICAgYWNxdWlyZXwgIHxyZWxlYXNlCisgKiAgICAgICAgICAgIHwgIHwKKyAqICAgICAgICAgICAgfCAgfAorICogICAgICAgICAgICB2ICB8CisgKiAgICAgICAgICArLS0tLS0rCisgKiAgICAgICAgICB8LTEsIDB8CisgKiAgICAgICAgICArLS0tLS0rCisgKiAgICAgICAgICAgIHwgIF4KKyAqICAgICBhY3F1aXJlfCAgfHJlbGVhc2UKKyAqICAgICAgICAgICAgfCAgfAorICogICAgICAgICAgICB8ICB8CisgKiAgICAgICAgICAgIHYgIHwKKyAqICAgICAgICAgICstLS0tLSsKKyAqICAgICAgICAgIHwgaCwgaHwKKyAqICAgICAgICAgICstLS0tLSsKKyAqICAgICAgICAgICAgfCAgXgorICogICAgIGFjcXVpcmV8ICB8cmVsZWFzZQorICogICAgICAgICAgICB8ICB8CisgKiAgICAgICAgICAgIHwgIHwKKyAqICAgICAgICAgICAgdiAgfAorICogICAgICAgICAgKy0tLS0tKworICogICAgICAgICAgfCBoLCB0fC0tLS0tIGFjcXVpcmUsIHJlbGVhc2UgbG9vcGJhY2sgLS0tKworICogICAgICAgICAgKy0tLS0tKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgICAgICAgICAgICBeICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICoKKyAqLworCisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworCisvKiBTdHVmZiBmb3IgY2lyY3VsYXIgdHJhY2UgYnVmZmVyICovCisjZGVmaW5lIFRSQUNFX0JVRl9FTEUJMTAyNAorc3RhdGljIGNoYXIgdHJhY2VzW1RSQUNFX0JVRl9FTEVdWzEyOF0gPSB7IDAgfQorc3RhdGljIGludCB0YyA9IDA7CisjZGVmaW5lIFRSQUNFX0xPQ0soWCxZKSAgICAgICAgICBLTVBfU05QUklOVEYoIHRyYWNlc1t0YysrICUgVFJBQ0VfQlVGX0VMRV0sIDEyOCwgICJ0JWQgYXQgJXNcbiIsIFgsIFkgKTsKKyNkZWZpbmUgVFJBQ0VfTE9DS19UKFgsWSxaKSAgICAgIEtNUF9TTlBSSU5URiggdHJhY2VzW3RjKysgJSBUUkFDRV9CVUZfRUxFXSwgMTI4LCAidCVkIGF0ICVzJWRcbiIsIFgsWSxaICk7CisjZGVmaW5lIFRSQUNFX0xPQ0tfSFQoWCxZLFosUSkgICBLTVBfU05QUklOVEYoIHRyYWNlc1t0YysrICUgVFJBQ0VfQlVGX0VMRV0sIDEyOCwgInQlZCBhdCAlcyAlZCwlZFxuIiwgWCwgWSwgWiwgUSApOworCitzdGF0aWMgdm9pZAorX19rbXBfZHVtcF9xdWV1aW5nX2xvY2soIGttcF9pbmZvX3QgKnRoaXNfdGhyLCBrbXBfaW50MzIgZ3RpZCwKKyAga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBoZWFkX2lkLCBrbXBfaW50MzIgdGFpbF9pZCApCit7CisgICAga21wX2ludDMyIHQsIGk7CisKKyAgICBfX2ttcF9wcmludGZfbm9fbG9jayggIlxuX19rbXBfZHVtcF9xdWV1aW5nX2xvY2s6IFRSQUNFIEJFR0lOUyBIRVJFISBcbiIgKTsKKworICAgIGkgPSB0YyAlIFRSQUNFX0JVRl9FTEU7CisgICAgX19rbXBfcHJpbnRmX25vX2xvY2soICIlc1xuIiwgdHJhY2VzW2ldICk7CisgICAgaSA9IChpKzEpICUgVFJBQ0VfQlVGX0VMRTsKKyAgICB3aGlsZSAoIGkgIT0gKHRjICUgVFJBQ0VfQlVGX0VMRSkgKSB7CisgICAgICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCAiJXMiLCB0cmFjZXNbaV0gKTsKKyAgICAgICAgaSA9IChpKzEpICUgVFJBQ0VfQlVGX0VMRTsKKyAgICB9CisgICAgX19rbXBfcHJpbnRmX25vX2xvY2soICJcbiIgKTsKKworICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKAorICAgICAgICAgICAgICJcbl9fa21wX2R1bXBfcXVldWluZ19sb2NrOiBndGlkKzE6JWQsIHNwaW5faGVyZTolZCwgbmV4dF93YWl0OiVkLCBoZWFkX2lkOiVkLCB0YWlsX2lkOiVkXG4iLAorICAgICAgICAgICAgIGd0aWQrMSwgdGhpc190aHItPnRoLnRoX3NwaW5faGVyZSwgdGhpc190aHItPnRoLnRoX25leHRfd2FpdGluZywKKyAgICAgICAgICAgICBoZWFkX2lkLCB0YWlsX2lkICk7CisKKyAgICBfX2ttcF9wcmludGZfbm9fbG9jayggIlx0XHRoZWFkOiAlZCAiLCBsY2stPmxrLmhlYWRfaWQgKTsKKworICAgIGlmICggbGNrLT5say5oZWFkX2lkID49IDEgKSB7CisgICAgICAgIHQgPSBfX2ttcF90aHJlYWRzW2xjay0+bGsuaGVhZF9pZC0xXS0+dGgudGhfbmV4dF93YWl0aW5nOworICAgICAgICB3aGlsZSAodCA+IDApIHsKKyAgICAgICAgICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCAiLT4gJWQgIiwgdCApOworICAgICAgICAgICAgdCA9IF9fa21wX3RocmVhZHNbdC0xXS0+dGgudGhfbmV4dF93YWl0aW5nOworICAgICAgICB9CisgICAgfQorICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCAiOyAgdGFpbDogJWQgIiwgbGNrLT5say50YWlsX2lkICk7CisgICAgX19rbXBfcHJpbnRmX25vX2xvY2soICJcblxuIiApOworfQorCisjZW5kaWYgLyogREVCVUdfUVVFVUlOR19MT0NLUyAqLworCitzdGF0aWMga21wX2ludDMyCitfX2ttcF9nZXRfcXVldWluZ19sb2NrX293bmVyKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIFRDUl80KCBsY2stPmxrLm93bmVyX2lkICkgLSAxOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wKK19fa21wX2lzX3F1ZXVpbmdfbG9ja19uZXN0YWJsZSgga21wX3F1ZXVpbmdfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiBsY2stPmxrLmRlcHRoX2xvY2tlZCAhPSAtMTsKK30KKworLyogQWNxdWlyZSBhIGxvY2sgdXNpbmcgYSB0aGUgcXVldWluZyBsb2NrIGltcGxlbWVudGF0aW9uICovCit0ZW1wbGF0ZSA8Ym9vbCB0YWtlVGltZT4KKy8qIFtUTFddIFRoZSB1bnVzZWQgdGVtcGxhdGUgYWJvdmUgaXMgbGVmdCBiZWhpbmQgYmVjYXVzZSBvZiB3aGF0IEJFQiBiZWxpZXZlcyBpcyBhCisgICBwb3RlbnRpYWwgY29tcGlsZXIgcHJvYmxlbSB3aXRoIF9fZm9yY2VpbmxpbmUuICovCitfX2ZvcmNlaW5saW5lIHN0YXRpYyBpbnQKK19fa21wX2FjcXVpcmVfcXVldWluZ19sb2NrX3RpbWVkX3RlbXBsYXRlKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywKKyAga21wX2ludDMyIGd0aWQgKQoreworICAgIHJlZ2lzdGVyIGttcF9pbmZvX3QgKnRoaXNfdGhyICAgID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZCggZ3RpZCApOworICAgIHZvbGF0aWxlIGttcF9pbnQzMiAgKmhlYWRfaWRfcCAgID0gJiBsY2stPmxrLmhlYWRfaWQ7CisgICAgdm9sYXRpbGUga21wX2ludDMyICAqdGFpbF9pZF9wICAgPSAmIGxjay0+bGsudGFpbF9pZDsKKyAgICB2b2xhdGlsZSBrbXBfdWludDMyICpzcGluX2hlcmVfcDsKKyAgICBrbXBfaW50MzIgbmVlZF9tZiA9IDE7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBvbXB0X3N0YXRlX3QgcHJldl9zdGF0ZSA9IG9tcHRfc3RhdGVfdW5kZWZpbmVkOworI2VuZGlmCisKKyAgICBLQV9UUkFDRSggMTAwMCwgKCJfX2ttcF9hY3F1aXJlX3F1ZXVpbmdfbG9jazogbGNrOiVwLCBUIyVkIGVudGVyaW5nXG4iLCBsY2ssIGd0aWQgKSk7CisKKyAgICBLTVBfRlNZTkNfUFJFUEFSRSggbGNrICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhpc190aHIgIT0gTlVMTCApOworICAgIHNwaW5faGVyZV9wID0gJiB0aGlzX3Roci0+dGgudGhfc3Bpbl9oZXJlOworCisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgIFRSQUNFX0xPQ0soIGd0aWQrMSwgImFjcSBlbnQiICk7CisgICAgaWYgKCAqc3Bpbl9oZXJlX3AgKQorICAgICAgICBfX2ttcF9kdW1wX3F1ZXVpbmdfbG9jayggdGhpc190aHIsIGd0aWQsIGxjaywgKmhlYWRfaWRfcCwgKnRhaWxfaWRfcCApOworICAgIGlmICggdGhpc190aHItPnRoLnRoX25leHRfd2FpdGluZyAhPSAwICkKKyAgICAgICAgX19rbXBfZHVtcF9xdWV1aW5nX2xvY2soIHRoaXNfdGhyLCBndGlkLCBsY2ssICpoZWFkX2lkX3AsICp0YWlsX2lkX3AgKTsKKyNlbmRpZgorICAgIEtNUF9ERUJVR19BU1NFUlQoICEqc3Bpbl9oZXJlX3AgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3Roci0+dGgudGhfbmV4dF93YWl0aW5nID09IDAgKTsKKworCisgICAgLyogVGhlIGZvbGxvd2luZyBzdC5yZWwgdG8gc3Bpbl9oZXJlX3AgbmVlZHMgdG8gcHJlY2VkZSB0aGUgY21weGNoZy5hY3EgdG8gaGVhZF9pZF9wCisgICAgICAgdGhhdCBtYXkgZm9sbG93LCBub3QganVzdCBpbiBleGVjdXRpb24gb3JkZXIsIGJ1dCBhbHNvIGluIHZpc2liaWxpdHkgb3JkZXIuICBUaGlzIHdheSwKKyAgICAgICB3aGVuIGEgcmVsZWFzaW5nIHRocmVhZCBvYnNlcnZlcyB0aGUgY2hhbmdlcyB0byB0aGUgcXVldWUgYnkgdGhpcyB0aHJlYWQsIGl0IGNhbgorICAgICAgIHJpZ2h0bHkgYXNzdW1lIHRoYXQgc3Bpbl9oZXJlX3AgaGFzIGFscmVhZHkgYmVlbiBzZXQgdG8gVFJVRSwgc28gdGhhdCB3aGVuIGl0IHNldHMKKyAgICAgICBzcGluX2hlcmVfcCB0byBGQUxTRSwgaXQgaXMgbm90IHByZW1hdHVyZS4gIElmIHRoZSByZWxlYXNpbmcgdGhyZWFkIHNldHMgc3Bpbl9oZXJlX3AKKyAgICAgICB0byBGQUxTRSBiZWZvcmUgdGhpcyB0aHJlYWQgc2V0cyBpdCB0byBUUlVFLCB0aGlzIHRocmVhZCB3aWxsIGhhbmcuCisgICAgKi8KKyAgICAqc3Bpbl9oZXJlX3AgPSBUUlVFOyAgLyogYmVmb3JlIGVucXVldWluZyB0byBwcmV2ZW50IHJhY2UgKi8KKworICAgIHdoaWxlKCAxICkgeworICAgICAgICBrbXBfaW50MzIgZW5xdWV1ZWQ7CisgICAgICAgIGttcF9pbnQzMiBoZWFkOworICAgICAgICBrbXBfaW50MzIgdGFpbDsKKworICAgICAgICBoZWFkID0gKmhlYWRfaWRfcDsKKworICAgICAgICBzd2l0Y2ggKCBoZWFkICkgeworCisgICAgICAgICAgICBjYXNlIC0xOgorICAgICAgICAgICAgeworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICAgICAgICAgICAgICB0YWlsID0gKnRhaWxfaWRfcDsKKyAgICAgICAgICAgICAgICBUUkFDRV9MT0NLX0hUKCBndGlkKzEsICJhY3EgcmVhZDogIiwgaGVhZCwgdGFpbCApOworI2VuZGlmCisgICAgICAgICAgICAgICAgdGFpbCA9IDA7ICAvKiB0byBtYWtlIHN1cmUgbmV4dCBsaW5rIGFzeW5jaHJvbm91c2x5IHJlYWQgaXMgbm90IHNldCBhY2NpZGVudGFsbHk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGFzc2lnbm1lbnQgcHJldmVudHMgdXMgZnJvbSBlbnRlcmluZyB0aGUgaWYgKCB0ID4gMCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb24gaW4gdGhlIGVucXVldWVkIGNhc2UgYmVsb3csIHdoaWNoIGlzIG5vdCBuZWNlc3NhcnkgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHN0YXRlIHRyYW5zaXRpb24gKi8KKworICAgICAgICAgICAgICAgIG5lZWRfbWYgPSAwOworICAgICAgICAgICAgICAgIC8qIHRyeSAoLTEsMCktPih0aWQsdGlkKSAqLworICAgICAgICAgICAgICAgIGVucXVldWVkID0gS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTY0KCAodm9sYXRpbGUga21wX2ludDY0ICopIHRhaWxfaWRfcCwKKyAgICAgICAgICAgICAgICAgIEtNUF9QQUNLXzY0KCAtMSwgMCApLAorICAgICAgICAgICAgICAgICAgS01QX1BBQ0tfNjQoIGd0aWQrMSwgZ3RpZCsxICkgKTsKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgICAgICAgICAgICBpZiAoIGVucXVldWVkICkgVFJBQ0VfTE9DSyggZ3RpZCsxLCAiYWNxIGVucTogKC0xLDApLT4odGlkLHRpZCkiICk7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRhaWwgPSAqdGFpbF9pZF9wOworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhaWwgIT0gZ3RpZCArIDEgKTsKKworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICAgICAgICAgICAgICBUUkFDRV9MT0NLX0hUKCBndGlkKzEsICJhY3EgcmVhZDogIiwgaGVhZCwgdGFpbCApOworI2VuZGlmCisKKyAgICAgICAgICAgICAgICBpZiAoIHRhaWwgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgZW5xdWV1ZWQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG5lZWRfbWYgPSAwOworICAgICAgICAgICAgICAgICAgICAvKiB0cnkgKGgsdCkgb3IgKGgsaCktPihoLHRpZCkgKi8KKyAgICAgICAgICAgICAgICAgICAgZW5xdWV1ZWQgPSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIoIHRhaWxfaWRfcCwgdGFpbCwgZ3RpZCsxICk7CisKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGVucXVldWVkICkgVFJBQ0VfTE9DSyggZ3RpZCsxLCAiYWNxIGVucTogKGgsdCktPihoLHRpZCkiICk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAwOiAvKiBlbXB0eSBxdWV1ZSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGttcF9pbnQzMiBncmFiYmVkX2xvY2s7CisKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgICAgICAgICAgdGFpbCA9ICp0YWlsX2lkX3A7CisgICAgICAgICAgICAgICAgVFJBQ0VfTE9DS19IVCggZ3RpZCsxLCAiYWNxIHJlYWQ6ICIsIGhlYWQsIHRhaWwgKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIC8qIHRyeSAoMCwwKS0+KC0xLDApICovCisKKyAgICAgICAgICAgICAgICAvKiBvbmx5IGxlZ2FsIHRyYW5zaXRpb24gb3V0IG9mIGhlYWQgPSAwIGlzIGhlYWQgPSAtMSB3aXRoIG5vIGNoYW5nZSB0byB0YWlsICovCisgICAgICAgICAgICAgICAgZ3JhYmJlZF9sb2NrID0gS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCBoZWFkX2lkX3AsIDAsIC0xICk7CisKKyAgICAgICAgICAgICAgICBpZiAoIGdyYWJiZWRfbG9jayApIHsKKworICAgICAgICAgICAgICAgICAgICAqc3Bpbl9oZXJlX3AgPSBGQUxTRTsKKworICAgICAgICAgICAgICAgICAgICBLQV9UUkFDRSggMTAwMCwgKCJfX2ttcF9hY3F1aXJlX3F1ZXVpbmdfbG9jazogbGNrOiVwLCBUIyVkIGV4aXRpbmc6IG5vIHF1ZXVpbmdcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsY2ssIGd0aWQgKSk7CisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgICAgICAgICAgICAgICAgICBUUkFDRV9MT0NLX0hUKCBndGlkKzEsICJhY3EgZXhpdDogIiwgaGVhZCwgMCApOworI2VuZGlmCisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9tcHRfZW5hYmxlZCAmJiBwcmV2X3N0YXRlICE9IG9tcHRfc3RhdGVfdW5kZWZpbmVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGFuZ2UgdGhlIHN0YXRlIGJlZm9yZSBjbGVhcmluZyB3YWl0X2lkICovCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX3Roci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IHByZXZfc3RhdGU7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX3Roci0+dGgub21wdF90aHJlYWRfaW5mby53YWl0X2lkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgICAgICAgICAgS01QX0ZTWU5DX0FDUVVJUkVEKCBsY2sgKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEtNUF9MT0NLX0FDUVVJUkVEX0ZJUlNUOyAvKiBsb2NrIGhvbGRlciBjYW5ub3QgYmUgb24gcXVldWUgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZW5xdWV1ZWQgPSBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgaWYgKG9tcHRfZW5hYmxlZCAmJiBwcmV2X3N0YXRlID09IG9tcHRfc3RhdGVfdW5kZWZpbmVkKSB7CisgICAgICAgICAgICAvKiB0aGlzIHRocmVhZCB3aWxsIHNwaW47IHNldCB3YWl0X2lkIGJlZm9yZSBlbnRlcmluZyB3YWl0IHN0YXRlICovCisgICAgICAgICAgICBwcmV2X3N0YXRlID0gdGhpc190aHItPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGU7CisgICAgICAgICAgICB0aGlzX3Roci0+dGgub21wdF90aHJlYWRfaW5mby53YWl0X2lkID0gKHVpbnQ2NF90KSBsY2s7CisgICAgICAgICAgICB0aGlzX3Roci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfd2FpdF9sb2NrOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBpZiAoIGVucXVldWVkICkgeworICAgICAgICAgICAgaWYgKCB0YWlsID4gMCApIHsKKyAgICAgICAgICAgICAgICBrbXBfaW5mb190ICp0YWlsX3RociA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIHRhaWwgLSAxICk7CisgICAgICAgICAgICAgICAgS01QX0FTU0VSVCggdGFpbF90aHIgIT0gTlVMTCApOworICAgICAgICAgICAgICAgIHRhaWxfdGhyLT50aC50aF9uZXh0X3dhaXRpbmcgPSBndGlkKzE7CisgICAgICAgICAgICAgICAgLyogY29ycmVzcG9uZGluZyB3YWl0IGZvciB0aGlzIHdyaXRlIGluIHJlbGVhc2UgY29kZSAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2s6IGxjazolcCwgVCMlZCB3YWl0aW5nIGZvciBsb2NrXG4iLCBsY2ssIGd0aWQgKSk7CisKKworICAgICAgICAgICAgLyogVG9EbzogTWF5IHdhbnQgdG8gY29uc2lkZXIgdXNpbmcgX19rbXBfd2FpdF9zbGVlcCAgb3Igc29tZXRoaW5nIHRoYXQgc2xlZXBzIGZvcgorICAgICAgICAgICAgICogICAgICAgdGhyb3VnaHB1dCBvbmx5IGhlcmUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEtNUF9NQigpOworICAgICAgICAgICAgS01QX1dBSVRfWUlFTEQoc3Bpbl9oZXJlX3AsIEZBTFNFLCBLTVBfRVEsIGxjayk7CisKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgICAgICBUUkFDRV9MT0NLKCBndGlkKzEsICJhY3Egc3BpbiIgKTsKKworICAgICAgICAgICAgaWYgKCB0aGlzX3Roci0+dGgudGhfbmV4dF93YWl0aW5nICE9IDAgKQorICAgICAgICAgICAgICAgIF9fa21wX2R1bXBfcXVldWluZ19sb2NrKCB0aGlzX3RociwgZ3RpZCwgbGNrLCAqaGVhZF9pZF9wLCAqdGFpbF9pZF9wICk7CisjZW5kaWYKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoaXNfdGhyLT50aC50aF9uZXh0X3dhaXRpbmcgPT0gMCApOworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2s6IGxjazolcCwgVCMlZCBleGl0aW5nOiBhZnRlciB3YWl0aW5nIG9uIHF1ZXVlXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGxjaywgZ3RpZCApKTsKKworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICAgICAgICAgIFRSQUNFX0xPQ0soIGd0aWQrMSwgImFjcSBleGl0IDIiICk7CisjZW5kaWYKKworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgLyogY2hhbmdlIHRoZSBzdGF0ZSBiZWZvcmUgY2xlYXJpbmcgd2FpdF9pZCAqLworICAgICAgICAgICAgdGhpc190aHItPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBwcmV2X3N0YXRlOworICAgICAgICAgICAgdGhpc190aHItPnRoLm9tcHRfdGhyZWFkX2luZm8ud2FpdF9pZCA9IDA7CisjZW5kaWYKKworICAgICAgICAgICAgLyogZ290IGxvY2ssIHdlIHdlcmUgZGVxdWV1ZWQgYnkgdGhlIHRocmVhZCB0aGF0IHJlbGVhc2VkIGxvY2sgKi8KKyAgICAgICAgICAgIHJldHVybiBLTVBfTE9DS19BQ1FVSVJFRF9GSVJTVDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFlpZWxkIGlmIG51bWJlciBvZiB0aHJlYWRzID4gbnVtYmVyIG9mIGxvZ2ljYWwgcHJvY2Vzc29ycyAqLworICAgICAgICAvKiBUb0RvOiBOb3Qgc3VyZSB3aHkgdGhpcyBzaG91bGQgb25seSBiZSBpbiBvdmVyc3Vic2NyaXB0aW9uIGNhc2UsCisgICAgICAgICAgIG1heWJlIHNob3VsZCBiZSB0cmFkaXRpb25hbCBZSUVMRF9JTklUL1lJRUxEX1dIRU4gbG9vcCAqLworICAgICAgICBLTVBfWUlFTEQoIFRDUl80KCBfX2ttcF9udGggKSA+IChfX2ttcF9hdmFpbF9wcm9jID8gX19rbXBfYXZhaWxfcHJvYyA6CisgICAgICAgICAgX19rbXBfeHByb2MgKSApOworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICAgICAgVFJBQ0VfTE9DSyggZ3RpZCsxLCAiYWNxIHJldHJ5IiApOworI2VuZGlmCisKKyAgICB9CisgICAgS01QX0FTU0VSVDIoIDAsICJzaG91bGQgbm90IGdldCBoZXJlIiApOworICAgIHJldHVybiBLTVBfTE9DS19BQ1FVSVJFRF9GSVJTVDsKK30KKworaW50CitfX2ttcF9hY3F1aXJlX3F1ZXVpbmdfbG9jaygga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49IDAgKTsKKworICAgIHJldHVybiBfX2ttcF9hY3F1aXJlX3F1ZXVpbmdfbG9ja190aW1lZF90ZW1wbGF0ZTxmYWxzZT4oIGxjaywgZ3RpZCApOworfQorCitzdGF0aWMgaW50CitfX2ttcF9hY3F1aXJlX3F1ZXVpbmdfbG9ja193aXRoX2NoZWNrcygga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssCisgIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfc2V0X2xvY2siOworICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2lzX3F1ZXVpbmdfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lciggbGNrICkgPT0gZ3RpZCApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNBbHJlYWR5T3duZWQsIGZ1bmMgKTsKKyAgICB9CisKKyAgICBfX2ttcF9hY3F1aXJlX3F1ZXVpbmdfbG9jayggbGNrLCBndGlkICk7CisKKyAgICBsY2stPmxrLm93bmVyX2lkID0gZ3RpZCArIDE7CisgICAgcmV0dXJuIEtNUF9MT0NLX0FDUVVJUkVEX0ZJUlNUOworfQorCitpbnQKK19fa21wX3Rlc3RfcXVldWluZ19sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIHZvbGF0aWxlIGttcF9pbnQzMiAqaGVhZF9pZF9wICA9ICYgbGNrLT5say5oZWFkX2lkOworICAgIGttcF9pbnQzMiBoZWFkOworI2lmZGVmIEtNUF9ERUJVRworICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyOworI2VuZGlmCisKKyAgICBLQV9UUkFDRSggMTAwMCwgKCJfX2ttcF90ZXN0X3F1ZXVpbmdfbG9jazogVCMlZCBlbnRlcmluZ1xuIiwgZ3RpZCApKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49IDAgKTsKKyNpZmRlZiBLTVBfREVCVUcKKyAgICB0aGlzX3RociA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3RociAhPSBOVUxMICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggIXRoaXNfdGhyLT50aC50aF9zcGluX2hlcmUgKTsKKyNlbmRpZgorCisgICAgaGVhZCA9ICpoZWFkX2lkX3A7CisKKyAgICBpZiAoIGhlYWQgPT0gMCApIHsgLyogbm9ib2R5IG9uIHF1ZXVlLCBub2JvZHkgaG9sZGluZyAqLworCisgICAgICAgIC8qIHRyeSAoMCwwKS0+KC0xLDApICovCisKKyAgICAgICAgaWYgKCBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIoIGhlYWRfaWRfcCwgMCwgLTEgKSApIHsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX3Rlc3RfcXVldWluZ19sb2NrOiBUIyVkIGV4aXRpbmc6IGhvbGRpbmcgbG9ja1xuIiwgZ3RpZCApKTsKKyAgICAgICAgICAgIEtNUF9GU1lOQ19BQ1FVSVJFRChsY2spOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBLQV9UUkFDRSggMTAwMCwgKCJfX2ttcF90ZXN0X3F1ZXVpbmdfbG9jazogVCMlZCBleGl0aW5nOiB3aXRob3V0IGxvY2tcbiIsIGd0aWQgKSk7CisgICAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgaW50CitfX2ttcF90ZXN0X3F1ZXVpbmdfbG9ja193aXRoX2NoZWNrcygga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdGVzdF9sb2NrIjsKKyAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9pc19xdWV1aW5nX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyApOworICAgIH0KKworICAgIGludCByZXR2YWwgPSBfX2ttcF90ZXN0X3F1ZXVpbmdfbG9jayggbGNrLCBndGlkICk7CisKKyAgICBpZiAoIHJldHZhbCApIHsKKyAgICAgICAgbGNrLT5say5vd25lcl9pZCA9IGd0aWQgKyAxOworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorCitpbnQKK19fa21wX3JlbGVhc2VfcXVldWluZ19sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIHJlZ2lzdGVyIGttcF9pbmZvX3QgKnRoaXNfdGhyOworICAgIHZvbGF0aWxlIGttcF9pbnQzMiAqaGVhZF9pZF9wID0gJiBsY2stPmxrLmhlYWRfaWQ7CisgICAgdm9sYXRpbGUga21wX2ludDMyICp0YWlsX2lkX3AgPSAmIGxjay0+bGsudGFpbF9pZDsKKworICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX3JlbGVhc2VfcXVldWluZ19sb2NrOiBsY2s6JXAsIFQjJWQgZW50ZXJpbmdcbiIsIGxjaywgZ3RpZCApKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49IDAgKTsKKyAgICB0aGlzX3RociAgICA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3RociAhPSBOVUxMICk7CisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgIFRSQUNFX0xPQ0soIGd0aWQrMSwgInJlbCBlbnQiICk7CisKKyAgICBpZiAoIHRoaXNfdGhyLT50aC50aF9zcGluX2hlcmUgKQorICAgICAgICBfX2ttcF9kdW1wX3F1ZXVpbmdfbG9jayggdGhpc190aHIsIGd0aWQsIGxjaywgKmhlYWRfaWRfcCwgKnRhaWxfaWRfcCApOworICAgIGlmICggdGhpc190aHItPnRoLnRoX25leHRfd2FpdGluZyAhPSAwICkKKyAgICAgICAgX19rbXBfZHVtcF9xdWV1aW5nX2xvY2soIHRoaXNfdGhyLCBndGlkLCBsY2ssICpoZWFkX2lkX3AsICp0YWlsX2lkX3AgKTsKKyNlbmRpZgorICAgIEtNUF9ERUJVR19BU1NFUlQoICF0aGlzX3Roci0+dGgudGhfc3Bpbl9oZXJlICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhpc190aHItPnRoLnRoX25leHRfd2FpdGluZyA9PSAwICk7CisKKyAgICBLTVBfRlNZTkNfUkVMRUFTSU5HKGxjayk7CisKKyAgICB3aGlsZSggMSApIHsKKyAgICAgICAga21wX2ludDMyIGRlcXVldWVkOworICAgICAgICBrbXBfaW50MzIgaGVhZDsKKyAgICAgICAga21wX2ludDMyIHRhaWw7CisKKyAgICAgICAgaGVhZCA9ICpoZWFkX2lkX3A7CisKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgIHRhaWwgPSAqdGFpbF9pZF9wOworICAgICAgICBUUkFDRV9MT0NLX0hUKCBndGlkKzEsICJyZWwgcmVhZDogIiwgaGVhZCwgdGFpbCApOworICAgICAgICBpZiAoIGhlYWQgPT0gMCApIF9fa21wX2R1bXBfcXVldWluZ19sb2NrKCB0aGlzX3RociwgZ3RpZCwgbGNrLCBoZWFkLCB0YWlsICk7CisjZW5kaWYKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggaGVhZCAhPSAwICk7IC8qIGhvbGRpbmcgdGhlIGxvY2ssIGhlYWQgbXVzdCBiZSAtMSBvciBxdWV1ZSBoZWFkICovCisKKyAgICAgICAgaWYgKCBoZWFkID09IC0xICkgeyAvKiBub2JvZHkgb24gcXVldWUgKi8KKworICAgICAgICAgICAgLyogdHJ5ICgtMSwwKS0+KDAsMCkgKi8KKyAgICAgICAgICAgIGlmICggS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDMyKCBoZWFkX2lkX3AsIC0xLCAwICkgKSB7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfcmVsZWFzZV9xdWV1aW5nX2xvY2s6IGxjazolcCwgVCMlZCBleGl0aW5nOiBxdWV1ZSBlbXB0eVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGNrLCBndGlkICkpOworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICAgICAgICAgICAgICBUUkFDRV9MT0NLX0hUKCBndGlkKzEsICJyZWwgZXhpdDogIiwgMCwgMCApOworI2VuZGlmCisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAvKiBub3RoaW5nIHRvIGRvIC0gbm8gb3RoZXIgdGhyZWFkIGlzIHRyeWluZyB0byBzaGlmdCBibGFtZSAqLworI2VuZGlmCisKKyAgICAgICAgICAgICAgICByZXR1cm4gS01QX0xPQ0tfUkVMRUFTRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXF1ZXVlZCA9IEZBTFNFOworCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisKKyAgICAgICAgICAgIHRhaWwgPSAqdGFpbF9pZF9wOworICAgICAgICAgICAgaWYgKCBoZWFkID09IHRhaWwgKSB7ICAvKiBvbmx5IG9uZSB0aHJlYWQgb24gdGhlIHF1ZXVlICovCisKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgICAgICAgICAgaWYgKCBoZWFkIDw9IDAgKSBfX2ttcF9kdW1wX3F1ZXVpbmdfbG9jayggdGhpc190aHIsIGd0aWQsIGxjaywgaGVhZCwgdGFpbCApOworI2VuZGlmCisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggaGVhZCA+IDAgKTsKKworICAgICAgICAgICAgICAgIC8qIHRyeSAoaCxoKS0+KC0xLDApICovCisgICAgICAgICAgICAgICAgZGVxdWV1ZWQgPSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMNjQoIChrbXBfaW50NjQgKikgdGFpbF9pZF9wLAorICAgICAgICAgICAgICAgICAgS01QX1BBQ0tfNjQoIGhlYWQsIGhlYWQgKSwgS01QX1BBQ0tfNjQoIC0xLCAwICkgKTsKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgICAgICAgICAgVFJBQ0VfTE9DSyggZ3RpZCsxLCAicmVsIGRlcTogKGgsaCktPigtMSwwKSIgKTsKKyNlbmRpZgorCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB2b2xhdGlsZSBrbXBfaW50MzIgKndhaXRpbmdfaWRfcDsKKyAgICAgICAgICAgICAgICBrbXBfaW5mb190ICAgICAgICAgKmhlYWRfdGhyID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZCggaGVhZCAtIDEgKTsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBoZWFkX3RociAhPSBOVUxMICk7CisgICAgICAgICAgICAgICAgd2FpdGluZ19pZF9wID0gJiBoZWFkX3Roci0+dGgudGhfbmV4dF93YWl0aW5nOworCisgICAgICAgICAgICAgICAgLyogRG9lcyB0aGlzIHJlcXVpcmUgc3luY2hyb25vdXMgcmVhZHM/ICovCisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgICAgICAgICAgICAgIGlmICggaGVhZCA8PSAwIHx8IHRhaWwgPD0gMCApIF9fa21wX2R1bXBfcXVldWluZ19sb2NrKCB0aGlzX3RociwgZ3RpZCwgbGNrLCBoZWFkLCB0YWlsICk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBoZWFkID4gMCAmJiB0YWlsID4gMCApOworCisgICAgICAgICAgICAgICAgLyogdHJ5IChoLHQpLT4oaCcsdCkgb3IgKHQsdCkgKi8KKworICAgICAgICAgICAgICAgIEtNUF9NQigpOworICAgICAgICAgICAgICAgIC8qIG1ha2Ugc3VyZSBlbnF1ZXVpbmcgdGhyZWFkIGhhcyB0aW1lIHRvIHVwZGF0ZSBuZXh0IHdhaXRpbmcgdGhyZWFkIGZpZWxkICovCisgICAgICAgICAgICAgICAgKmhlYWRfaWRfcCA9IEtNUF9XQUlUX1lJRUxEKCh2b2xhdGlsZSBrbXBfdWludDMyKil3YWl0aW5nX2lkX3AsIDAsIEtNUF9ORVEsIE5VTEwpOworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICAgICAgICAgICAgICBUUkFDRV9MT0NLKCBndGlkKzEsICJyZWwgZGVxOiAoaCx0KS0+KGgnLHQpIiApOworI2VuZGlmCisgICAgICAgICAgICAgICAgZGVxdWV1ZWQgPSBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCBkZXF1ZXVlZCApIHsKKyAgICAgICAgICAgIGttcF9pbmZvX3QgKmhlYWRfdGhyID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZCggaGVhZCAtIDEgKTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGhlYWRfdGhyICE9IE5VTEwgKTsKKworICAgICAgICAgICAgLyogRG9lcyB0aGlzIHJlcXVpcmUgc3luY2hyb25vdXMgcmVhZHM/ICovCisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgICAgICAgICAgaWYgKCBoZWFkIDw9IDAgfHwgdGFpbCA8PSAwICkgX19rbXBfZHVtcF9xdWV1aW5nX2xvY2soIHRoaXNfdGhyLCBndGlkLCBsY2ssIGhlYWQsIHRhaWwgKTsKKyNlbmRpZgorICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggaGVhZCA+IDAgJiYgdGFpbCA+IDAgKTsKKworICAgICAgICAgICAgLyogRm9yIGNsZWFuIGNvZGUgb25seS4KKyAgICAgICAgICAgICAqIFRocmVhZCBub3QgcmVsZWFzZWQgdW50aWwgbmV4dCBzdGF0ZW1lbnQgcHJldmVudHMgcmFjZSB3aXRoIGFjcXVpcmUgY29kZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaGVhZF90aHItPnRoLnRoX25leHRfd2FpdGluZyA9IDA7CisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgICAgICAgICAgVFJBQ0VfTE9DS19UKCBndGlkKzEsICJyZWwgbnc9MCBmb3IgdD0iLCBoZWFkICk7CisjZW5kaWYKKworICAgICAgICAgICAgS01QX01CKCk7CisgICAgICAgICAgICAvKiByZXNldCBzcGluIHZhbHVlICovCisgICAgICAgICAgICBoZWFkX3Roci0+dGgudGhfc3Bpbl9oZXJlID0gRkFMU0U7CisKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX3JlbGVhc2VfcXVldWluZ19sb2NrOiBsY2s6JXAsIFQjJWQgZXhpdGluZzogYWZ0ZXIgZGVxdWV1aW5nXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGxjaywgZ3RpZCApKTsKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgICAgICBUUkFDRV9MT0NLKCBndGlkKzEsICJyZWwgZXhpdCAyIiApOworI2VuZGlmCisgICAgICAgICAgICByZXR1cm4gS01QX0xPQ0tfUkVMRUFTRUQ7CisgICAgICAgIH0KKyAgICAgICAgLyogS01QX0NQVV9QQVVTRSggKTsgIGRvbid0IHdhbnQgdG8gbWFrZSByZWxlYXNpbmcgdGhyZWFkIGhvbGQgdXAgYWNxdWlyaW5nIHRocmVhZHMgKi8KKworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICAgICAgVFJBQ0VfTE9DSyggZ3RpZCsxLCAicmVsIHJldHJ5IiApOworI2VuZGlmCisKKyAgICB9IC8qIHdoaWxlICovCisgICAgS01QX0FTU0VSVDIoIDAsICJzaG91bGQgbm90IGdldCBoZXJlIiApOworICAgIHJldHVybiBLTVBfTE9DS19SRUxFQVNFRDsKK30KKworc3RhdGljIGludAorX19rbXBfcmVsZWFzZV9xdWV1aW5nX2xvY2tfd2l0aF9jaGVja3MoIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLAorICBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Vuc2V0X2xvY2siOworICAgIEtNUF9NQigpOyAgLyogaW4gY2FzZSBhbm90aGVyIHByb2Nlc3NvciBpbml0aWFsaXplZCBsb2NrICovCisgICAgaWYgKCBsY2stPmxrLmluaXRpYWxpemVkICE9IGxjayApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfaXNfcXVldWluZ19sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9nZXRfcXVldWluZ19sb2NrX293bmVyKCBsY2sgKSA9PSAtMSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nRnJlZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2dldF9xdWV1aW5nX2xvY2tfb3duZXIoIGxjayApICE9IGd0aWQgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ1NldEJ5QW5vdGhlciwgZnVuYyApOworICAgIH0KKyAgICBsY2stPmxrLm93bmVyX2lkID0gMDsKKyAgICByZXR1cm4gX19rbXBfcmVsZWFzZV9xdWV1aW5nX2xvY2soIGxjaywgZ3RpZCApOworfQorCit2b2lkCitfX2ttcF9pbml0X3F1ZXVpbmdfbG9jaygga21wX3F1ZXVpbmdfbG9ja190ICpsY2sgKQoreworICAgIGxjay0+bGsubG9jYXRpb24gPSBOVUxMOworICAgIGxjay0+bGsuaGVhZF9pZCA9IDA7CisgICAgbGNrLT5say50YWlsX2lkID0gMDsKKyAgICBsY2stPmxrLm5leHRfdGlja2V0ID0gMDsKKyAgICBsY2stPmxrLm5vd19zZXJ2aW5nID0gMDsKKyAgICBsY2stPmxrLm93bmVyX2lkID0gMDsgICAgICAvLyBubyB0aHJlYWQgb3ducyB0aGUgbG9jay4KKyAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IC0xOyAvLyA+PSAwIGZvciBuZXN0YWJsZSBsb2NrcywgLTEgZm9yIHNpbXBsZSBsb2Nrcy4KKyAgICBsY2stPmxrLmluaXRpYWxpemVkID0gbGNrOworCisgICAgS0FfVFJBQ0UoMTAwMCwgKCJfX2ttcF9pbml0X3F1ZXVpbmdfbG9jazogbG9jayAlcCBpbml0aWFsaXplZFxuIiwgbGNrKSk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9pbml0X3F1ZXVpbmdfbG9ja193aXRoX2NoZWNrcygga21wX3F1ZXVpbmdfbG9ja190ICogbGNrICkKK3sKKyAgICBfX2ttcF9pbml0X3F1ZXVpbmdfbG9jayggbGNrICk7Cit9CisKK3ZvaWQKK19fa21wX2Rlc3Ryb3lfcXVldWluZ19sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjayApCit7CisgICAgbGNrLT5say5pbml0aWFsaXplZCA9IE5VTEw7CisgICAgbGNrLT5say5sb2NhdGlvbiA9IE5VTEw7CisgICAgbGNrLT5say5oZWFkX2lkID0gMDsKKyAgICBsY2stPmxrLnRhaWxfaWQgPSAwOworICAgIGxjay0+bGsubmV4dF90aWNrZXQgPSAwOworICAgIGxjay0+bGsubm93X3NlcnZpbmcgPSAwOworICAgIGxjay0+bGsub3duZXJfaWQgPSAwOworICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gLTE7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9kZXN0cm95X3F1ZXVpbmdfbG9ja193aXRoX2NoZWNrcygga21wX3F1ZXVpbmdfbG9ja190ICpsY2sgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9kZXN0cm95X2xvY2siOworICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2lzX3F1ZXVpbmdfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lciggbGNrICkgIT0gLTEgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1N0aWxsT3duZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgX19rbXBfZGVzdHJveV9xdWV1aW5nX2xvY2soIGxjayApOworfQorCisKKy8vCisvLyBuZXN0ZWQgcXVldWluZyBsb2NrcworLy8KKworaW50CitfX2ttcF9hY3F1aXJlX25lc3RlZF9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PSAwICk7CisKKyAgICBpZiAoIF9fa21wX2dldF9xdWV1aW5nX2xvY2tfb3duZXIoIGxjayApID09IGd0aWQgKSB7CisgICAgICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkICs9IDE7CisgICAgICAgIHJldHVybiBLTVBfTE9DS19BQ1FVSVJFRF9ORVhUOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2tfdGltZWRfdGVtcGxhdGU8ZmFsc2U+KCBsY2ssIGd0aWQgKTsKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMTsKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIGxjay0+bGsub3duZXJfaWQgPSBndGlkICsgMTsKKyAgICAgICAgcmV0dXJuIEtNUF9MT0NLX0FDUVVJUkVEX0ZJUlNUOworICAgIH0KK30KKworc3RhdGljIGludAorX19rbXBfYWNxdWlyZV9uZXN0ZWRfcXVldWluZ19sb2NrX3dpdGhfY2hlY2tzKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9zZXRfbmVzdF9sb2NrIjsKKyAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCAhIF9fa21wX2lzX3F1ZXVpbmdfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgfQorICAgIHJldHVybiBfX2ttcF9hY3F1aXJlX25lc3RlZF9xdWV1aW5nX2xvY2soIGxjaywgZ3RpZCApOworfQorCitpbnQKK19fa21wX3Rlc3RfbmVzdGVkX3F1ZXVpbmdfbG9jaygga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpbnQgcmV0dmFsOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PSAwICk7CisKKyAgICBpZiAoIF9fa21wX2dldF9xdWV1aW5nX2xvY2tfb3duZXIoIGxjayApID09IGd0aWQgKSB7CisgICAgICAgIHJldHZhbCA9ICsrbGNrLT5say5kZXB0aF9sb2NrZWQ7CisgICAgfQorICAgIGVsc2UgaWYgKCAhX19rbXBfdGVzdF9xdWV1aW5nX2xvY2soIGxjaywgZ3RpZCApICkgeworICAgICAgICByZXR2YWwgPSAwOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIHJldHZhbCA9IGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMTsKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIGxjay0+bGsub3duZXJfaWQgPSBndGlkICsgMTsKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludAorX19rbXBfdGVzdF9uZXN0ZWRfcXVldWluZ19sb2NrX3dpdGhfY2hlY2tzKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywKKyAga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF90ZXN0X25lc3RfbG9jayI7CisgICAgaWYgKCBsY2stPmxrLmluaXRpYWxpemVkICE9IGxjayApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggISBfX2ttcF9pc19xdWV1aW5nX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOworICAgIH0KKyAgICByZXR1cm4gX19rbXBfdGVzdF9uZXN0ZWRfcXVldWluZ19sb2NrKCBsY2ssIGd0aWQgKTsKK30KKworaW50CitfX2ttcF9yZWxlYXNlX25lc3RlZF9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PSAwICk7CisKKyAgICBLTVBfTUIoKTsKKyAgICBpZiAoIC0tKGxjay0+bGsuZGVwdGhfbG9ja2VkKSA9PSAwICkgeworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgbGNrLT5say5vd25lcl9pZCA9IDA7CisgICAgICAgIF9fa21wX3JlbGVhc2VfcXVldWluZ19sb2NrKCBsY2ssIGd0aWQgKTsKKyAgICAgICAgcmV0dXJuIEtNUF9MT0NLX1JFTEVBU0VEOworICAgIH0KKyAgICByZXR1cm4gS01QX0xPQ0tfU1RJTExfSEVMRDsKK30KKworc3RhdGljIGludAorX19rbXBfcmVsZWFzZV9uZXN0ZWRfcXVldWluZ19sb2NrX3dpdGhfY2hlY2tzKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF91bnNldF9uZXN0X2xvY2siOworICAgIEtNUF9NQigpOyAgLyogaW4gY2FzZSBhbm90aGVyIHByb2Nlc3NvciBpbml0aWFsaXplZCBsb2NrICovCisgICAgaWYgKCBsY2stPmxrLmluaXRpYWxpemVkICE9IGxjayApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggISBfX2ttcF9pc19xdWV1aW5nX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2dldF9xdWV1aW5nX2xvY2tfb3duZXIoIGxjayApID09IC0xICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tVbnNldHRpbmdGcmVlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lciggbGNrICkgIT0gZ3RpZCApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nU2V0QnlBbm90aGVyLCBmdW5jICk7CisgICAgfQorICAgIHJldHVybiBfX2ttcF9yZWxlYXNlX25lc3RlZF9xdWV1aW5nX2xvY2soIGxjaywgZ3RpZCApOworfQorCit2b2lkCitfX2ttcF9pbml0X25lc3RlZF9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqIGxjayApCit7CisgICAgX19rbXBfaW5pdF9xdWV1aW5nX2xvY2soIGxjayApOworICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMDsgLy8gPj0gMCBmb3IgbmVzdGFibGUgbG9ja3MsIC0xIGZvciBzaW1wbGUgbG9ja3MKK30KKworc3RhdGljIHZvaWQKK19fa21wX2luaXRfbmVzdGVkX3F1ZXVpbmdfbG9ja193aXRoX2NoZWNrcygga21wX3F1ZXVpbmdfbG9ja190ICogbGNrICkKK3sKKyAgICBfX2ttcF9pbml0X25lc3RlZF9xdWV1aW5nX2xvY2soIGxjayApOworfQorCit2b2lkCitfX2ttcF9kZXN0cm95X25lc3RlZF9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrICkKK3sKKyAgICBfX2ttcF9kZXN0cm95X3F1ZXVpbmdfbG9jayggbGNrICk7CisgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAwOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZGVzdHJveV9uZXN0ZWRfcXVldWluZ19sb2NrX3dpdGhfY2hlY2tzKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjayApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX2Rlc3Ryb3lfbmVzdF9sb2NrIjsKKyAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCAhIF9fa21wX2lzX3F1ZXVpbmdfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lciggbGNrICkgIT0gLTEgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1N0aWxsT3duZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgX19rbXBfZGVzdHJveV9uZXN0ZWRfcXVldWluZ19sb2NrKCBsY2sgKTsKK30KKworCisvLworLy8gYWNjZXNzIGZ1bmN0aW9ucyB0byBmaWVsZHMgd2hpY2ggZG9uJ3QgZXhpc3QgZm9yIGFsbCBsb2NrIGtpbmRzLgorLy8KKworc3RhdGljIGludAorX19rbXBfaXNfcXVldWluZ19sb2NrX2luaXRpYWxpemVkKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIGxjayA9PSBsY2stPmxrLmluaXRpYWxpemVkOworfQorCitzdGF0aWMgY29uc3QgaWRlbnRfdCAqCitfX2ttcF9nZXRfcXVldWluZ19sb2NrX2xvY2F0aW9uKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIGxjay0+bGsubG9jYXRpb247Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zZXRfcXVldWluZ19sb2NrX2xvY2F0aW9uKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywgY29uc3QgaWRlbnRfdCAqbG9jICkKK3sKKyAgICBsY2stPmxrLmxvY2F0aW9uID0gbG9jOworfQorCitzdGF0aWMga21wX2xvY2tfZmxhZ3NfdAorX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19mbGFncygga21wX3F1ZXVpbmdfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiBsY2stPmxrLmZsYWdzOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfc2V0X3F1ZXVpbmdfbG9ja19mbGFncygga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9sb2NrX2ZsYWdzX3QgZmxhZ3MgKQoreworICAgIGxjay0+bGsuZmxhZ3MgPSBmbGFnczsKK30KKworI2lmIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKworLyoKKyAgICBSVE0gQWRhcHRpdmUgbG9ja3MKKyovCisKKyNpZiBLTVBfQ09NUElMRVJfSUNDICYmIF9fSU5URUxfQ09NUElMRVIgPj0gMTMwMAorCisjaW5jbHVkZSA8aW1taW50cmluLmg+CisjZGVmaW5lIFNPRlRfQUJPUlRfTUFTSyAgKF9YQUJPUlRfUkVUUlkgfCBfWEFCT1JUX0NPTkZMSUNUIHwgX1hBQk9SVF9FWFBMSUNJVCkKKworI2Vsc2UKKworLy8gVmFsdWVzIGZyb20gdGhlIHN0YXR1cyByZWdpc3RlciBhZnRlciBmYWlsZWQgc3BlY3VsYXRpb24uCisjZGVmaW5lIF9YQkVHSU5fU1RBUlRFRCAgICAgICAgICAofjB1KQorI2RlZmluZSBfWEFCT1JUX0VYUExJQ0lUICAgICAgICAgKDEgPDwgMCkKKyNkZWZpbmUgX1hBQk9SVF9SRVRSWSAgICAgICAgICAgICgxIDw8IDEpCisjZGVmaW5lIF9YQUJPUlRfQ09ORkxJQ1QgICAgICAgICAoMSA8PCAyKQorI2RlZmluZSBfWEFCT1JUX0NBUEFDSVRZICAgICAgICAgKDEgPDwgMykKKyNkZWZpbmUgX1hBQk9SVF9ERUJVRyAgICAgICAgICAgICgxIDw8IDQpCisjZGVmaW5lIF9YQUJPUlRfTkVTVEVEICAgICAgICAgICAoMSA8PCA1KQorI2RlZmluZSBfWEFCT1JUX0NPREUoeCkgICAgICAgICAgKCh1bnNpZ25lZCBjaGFyKSgoKHgpID4+IDI0KSAmIDB4RkYpKQorCisvLyBBYm9ydHMgZm9yIHdoaWNoIGl0J3Mgd29ydGggdHJ5aW5nIGFnYWluIGltbWVkaWF0ZWx5CisjZGVmaW5lIFNPRlRfQUJPUlRfTUFTSyAgKF9YQUJPUlRfUkVUUlkgfCBfWEFCT1JUX0NPTkZMSUNUIHwgX1hBQk9SVF9FWFBMSUNJVCkKKworI2RlZmluZSBTVFJJTkdJWkVfSU5URVJOQUwoYXJnKSAjYXJnCisjZGVmaW5lIFNUUklOR0laRShhcmcpIFNUUklOR0laRV9JTlRFUk5BTChhcmcpCisKKy8vIEFjY2VzcyB0byBSVE0gaW5zdHJ1Y3Rpb25zCisKKy8qCisgIEEgdmVyc2lvbiBvZiBYQmVnaW4gd2hpY2ggcmV0dXJucyAtMSBvbiBzcGVjdWxhdGlvbiwgYW5kIHRoZSB2YWx1ZSBvZiBFQVggb24gYW4gYWJvcnQuCisgIFRoaXMgaXMgdGhlIHNhbWUgZGVmaW5pdGlvbiBhcyB0aGUgY29tcGlsZXIgaW50cmluc2ljIHRoYXQgd2lsbCBiZSBzdXBwb3J0ZWQgYXQgc29tZSBwb2ludC4KKyovCitzdGF0aWMgX19pbmxpbmUgaW50IF94YmVnaW4oKQoreworICAgIGludCByZXMgPSAtMTsKKworI2lmIEtNUF9PU19XSU5ET1dTCisjaWYgS01QX0FSQ0hfWDg2XzY0CisgICAgX2FzbSB7CisgICAgICAgIF9lbWl0IDB4QzcKKyAgICAgICAgX2VtaXQgMHhGOAorICAgICAgICBfZW1pdCAyCisgICAgICAgIF9lbWl0IDAKKyAgICAgICAgX2VtaXQgMAorICAgICAgICBfZW1pdCAwCisgICAgICAgIGptcCAgIEwyCisgICAgICAgIG1vdiAgIHJlcywgZWF4CisgICAgTDI6CisgICAgfQorI2Vsc2UgLyogSUEzMiAqLworICAgIF9hc20geworICAgICAgICBfZW1pdCAweEM3CisgICAgICAgIF9lbWl0IDB4RjgKKyAgICAgICAgX2VtaXQgMgorICAgICAgICBfZW1pdCAwCisgICAgICAgIF9lbWl0IDAKKyAgICAgICAgX2VtaXQgMAorICAgICAgICBqbXAgICBMMgorICAgICAgICBtb3YgICByZXMsIGVheAorICAgIEwyOgorICAgIH0KKyNlbmRpZiAvLyBLTVBfQVJDSF9YODZfNjQKKyNlbHNlCisgICAgLyogTm90ZSB0aGF0ICVlYXggbXVzdCBiZSBub3RlZCBhcyBraWxsZWQgKGNsb2JiZXJlZCksIGJlY2F1c2UKKyAgICAgKiB0aGUgWFNSIGlzIHJldHVybmVkIGluICVlYXgoJXJheCkgb24gYWJvcnQuICBPdGhlciByZWdpc3RlcgorICAgICAqIHZhbHVlcyBhcmUgcmVzdG9yZWQsIHNvIGRvbid0IG5lZWQgdG8gYmUga2lsbGVkLgorICAgICAqCisgICAgICogV2UgbXVzdCBhbHNvIG1hcmsgJ3JlcycgYXMgYW4gaW5wdXQgYW5kIGFuIG91dHB1dCwgc2luY2Ugb3RoZXJ3aXNlCisgICAgICogJ3Jlcz0tMScgbWF5IGJlIGRyb3BwZWQgYXMgYmVpbmcgZGVhZCwgd2hlcmVhcyB3ZSBkbyBuZWVkIHRoZQorICAgICAqIGFzc2lnbm1lbnQgb24gdGhlIHN1Y2Nlc3NmdWwgKGkuZS4sIG5vbi1hYm9ydCkgcGF0aC4KKyAgICAgKi8KKyAgICBfX2FzbV9fIHZvbGF0aWxlICgiMTogLmJ5dGUgIDB4Qzc7IC5ieXRlIDB4Rjg7XG4iCisgICAgICAgICAgICAgICAgICAgICAgIiAgIC5sb25nICAxZi0xYi02XG4iCisgICAgICAgICAgICAgICAgICAgICAgIiAgICBqbXAgICAyZlxuIgorICAgICAgICAgICAgICAgICAgICAgICIxOiAgbW92bCAgJSVlYXgsJTBcbiIKKyAgICAgICAgICAgICAgICAgICAgICAiMjoiCisgICAgICAgICAgICAgICAgICAgICAgOiIrciIocmVzKTo6Im1lbW9yeSIsIiVlYXgiKTsKKyNlbmRpZiAvLyBLTVBfT1NfV0lORE9XUworICAgIHJldHVybiByZXM7Cit9CisKKy8qCisgIFRyYW5zYWN0aW9uIGVuZAorKi8KK3N0YXRpYyBfX2lubGluZSB2b2lkIF94ZW5kKCkKK3sKKyNpZiBLTVBfT1NfV0lORE9XUworICAgIF9fYXNtICB7CisgICAgICAgIF9lbWl0IDB4MGYKKyAgICAgICAgX2VtaXQgMHgwMQorICAgICAgICBfZW1pdCAweGQ1CisgICAgfQorI2Vsc2UKKyAgICBfX2FzbV9fIHZvbGF0aWxlICgiLmJ5dGUgMHgwZjsgLmJ5dGUgMHgwMTsgLmJ5dGUgMHhkNSIgOjo6Im1lbW9yeSIpOworI2VuZGlmCit9CisKKy8qCisgIFRoaXMgaXMgYSBtYWNybywgdGhlIGFyZ3VtZW50IG11c3QgYmUgYSBzaW5nbGUgYnl0ZSBjb25zdGFudCB3aGljaAorICBjYW4gYmUgZXZhbHVhdGVkIGJ5IHRoZSBpbmxpbmUgYXNzZW1ibGVyLCBzaW5jZSBpdCBpcyBlbWl0dGVkIGFzIGEKKyAgYnl0ZSBpbnRvIHRoZSBhc3NlbWJseSBjb2RlLgorKi8KKyNpZiBLTVBfT1NfV0lORE9XUworI2RlZmluZSBfeGFib3J0KEFSRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9hc20gX2VtaXQgMHhjNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9hc20gX2VtaXQgMHhmOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9hc20gX2VtaXQgQVJHCisjZWxzZQorI2RlZmluZSBfeGFib3J0KEFSRykgXAorICAgIF9fYXNtX18gdm9sYXRpbGUgKCIuYnl0ZSAweEM2OyAuYnl0ZSAweEY4OyAuYnl0ZSAiIFNUUklOR0laRShBUkcpIDo6OiJtZW1vcnkiKTsKKyNlbmRpZgorCisjZW5kaWYgLy8gS01QX0NPTVBJTEVSX0lDQyAmJiBfX0lOVEVMX0NPTVBJTEVSID49IDEzMDAKKworLy8KKy8vICAgIFN0YXRpc3RpY3MgaXMgY29sbGVjdGVkIGZvciB0ZXN0aW5nIHB1cnBvc2UKKy8vCisjaWYgS01QX0RFQlVHX0FEQVBUSVZFX0xPQ0tTCisKKy8vIFdlIGFjY3VtdWxhdGUgc3BlY3VsYXRpdmUgbG9jayBzdGF0aXN0aWNzIHdoZW4gdGhlIGxvY2sgaXMgZGVzdHJveWVkLgorLy8gV2Uga2VlcCBsb2NrcyB0aGF0IGhhdmVuJ3QgYmVlbiBkZXN0cm95ZWQgaW4gdGhlIGxpdmVMb2NrcyBsaXN0CisvLyBzbyB0aGF0IHdlIGNhbiBncmFiIHRoZWlyIHN0YXRpc3RpY3MgdG9vLgorc3RhdGljIGttcF9hZGFwdGl2ZV9sb2NrX3N0YXRpc3RpY3NfdCBkZXN0cm95ZWRTdGF0czsKKworLy8gVG8gaG9sZCB0aGUgbGlzdCBvZiBsaXZlIGxvY2tzLgorc3RhdGljIGttcF9hZGFwdGl2ZV9sb2NrX2luZm9fdCBsaXZlTG9ja3M7CisKKy8vIEEgbG9jayBzbyB3ZSBjYW4gc2FmZWx5IHVwZGF0ZSB0aGUgbGlzdCBvZiBsb2Nrcy4KK3N0YXRpYyBrbXBfYm9vdHN0cmFwX2xvY2tfdCBjaGFpbl9sb2NrOworCisvLyBJbml0aWFsaXplIHRoZSBsaXN0IG9mIHN0YXRzLgordm9pZAorX19rbXBfaW5pdF9zcGVjdWxhdGl2ZV9zdGF0cygpCit7CisgICAga21wX2FkYXB0aXZlX2xvY2tfaW5mb190ICpsY2sgPSAmbGl2ZUxvY2tzOworCisgICAgbWVtc2V0KCAoIHZvaWQgKiApICYgKCBsY2stPnN0YXRzICksIDAsIHNpemVvZiggbGNrLT5zdGF0cyApICk7CisgICAgbGNrLT5zdGF0cy5uZXh0ID0gbGNrOworICAgIGxjay0+c3RhdHMucHJldiA9IGxjazsKKworICAgIEtNUF9BU1NFUlQoIGxjay0+c3RhdHMubmV4dC0+c3RhdHMucHJldiA9PSBsY2sgKTsKKyAgICBLTVBfQVNTRVJUKCBsY2stPnN0YXRzLnByZXYtPnN0YXRzLm5leHQgPT0gbGNrICk7CisKKyAgICBfX2ttcF9pbml0X2Jvb3RzdHJhcF9sb2NrKCAmY2hhaW5fbG9jayApOworCit9CisKKy8vIEluc2VydCB0aGUgbG9jayBpbnRvIHRoZSBjaXJjdWxhciBsaXN0CitzdGF0aWMgdm9pZAorX19rbXBfcmVtZW1iZXJfbG9jaygga21wX2FkYXB0aXZlX2xvY2tfaW5mb190ICogbGNrICkKK3sKKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmY2hhaW5fbG9jayApOworCisgICAgbGNrLT5zdGF0cy5uZXh0ID0gbGl2ZUxvY2tzLnN0YXRzLm5leHQ7CisgICAgbGNrLT5zdGF0cy5wcmV2ID0gJmxpdmVMb2NrczsKKworICAgIGxpdmVMb2Nrcy5zdGF0cy5uZXh0ID0gbGNrOworICAgIGxjay0+c3RhdHMubmV4dC0+c3RhdHMucHJldiAgPSBsY2s7CisKKyAgICBLTVBfQVNTRVJUKCBsY2stPnN0YXRzLm5leHQtPnN0YXRzLnByZXYgPT0gbGNrICk7CisgICAgS01QX0FTU0VSVCggbGNrLT5zdGF0cy5wcmV2LT5zdGF0cy5uZXh0ID09IGxjayApOworCisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJmNoYWluX2xvY2sgKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2ZvcmdldF9sb2NrKCBrbXBfYWRhcHRpdmVfbG9ja19pbmZvX3QgKiBsY2sgKQoreworICAgIEtNUF9BU1NFUlQoIGxjay0+c3RhdHMubmV4dC0+c3RhdHMucHJldiA9PSBsY2sgKTsKKyAgICBLTVBfQVNTRVJUKCBsY2stPnN0YXRzLnByZXYtPnN0YXRzLm5leHQgPT0gbGNrICk7CisKKyAgICBrbXBfYWRhcHRpdmVfbG9ja19pbmZvX3QgKiBuID0gbGNrLT5zdGF0cy5uZXh0OworICAgIGttcF9hZGFwdGl2ZV9sb2NrX2luZm9fdCAqIHAgPSBsY2stPnN0YXRzLnByZXY7CisKKyAgICBuLT5zdGF0cy5wcmV2ID0gcDsKKyAgICBwLT5zdGF0cy5uZXh0ID0gbjsKK30KKworc3RhdGljIHZvaWQKK19fa21wX3plcm9fc3BlY3VsYXRpdmVfc3RhdHMoIGttcF9hZGFwdGl2ZV9sb2NrX2luZm9fdCAqIGxjayApCit7CisgICAgbWVtc2V0KCAoIHZvaWQgKiApJmxjay0+c3RhdHMsIDAsIHNpemVvZiggbGNrLT5zdGF0cyApICk7CisgICAgX19rbXBfcmVtZW1iZXJfbG9jayggbGNrICk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9hZGRfc3RhdHMoIGttcF9hZGFwdGl2ZV9sb2NrX3N0YXRpc3RpY3NfdCAqIHQsIGttcF9hZGFwdGl2ZV9sb2NrX2luZm9fdCAqIGxjayApCit7CisgICAga21wX2FkYXB0aXZlX2xvY2tfc3RhdGlzdGljc190IHZvbGF0aWxlICpzID0gJmxjay0+c3RhdHM7CisKKyAgICB0LT5ub25TcGVjdWxhdGl2ZUFjcXVpcmVBdHRlbXB0cyArPSBsY2stPmFjcXVpcmVfYXR0ZW1wdHM7CisgICAgdC0+c3VjY2Vzc2Z1bFNwZWN1bGF0aW9ucyArPSBzLT5zdWNjZXNzZnVsU3BlY3VsYXRpb25zOworICAgIHQtPmhhcmRGYWlsZWRTcGVjdWxhdGlvbnMgKz0gcy0+aGFyZEZhaWxlZFNwZWN1bGF0aW9uczsKKyAgICB0LT5zb2Z0RmFpbGVkU3BlY3VsYXRpb25zICs9IHMtPnNvZnRGYWlsZWRTcGVjdWxhdGlvbnM7CisgICAgdC0+bm9uU3BlY3VsYXRpdmVBY3F1aXJlcyArPSBzLT5ub25TcGVjdWxhdGl2ZUFjcXVpcmVzOworICAgIHQtPmxlbW1pbmdZaWVsZHMgICAgICAgICAgKz0gcy0+bGVtbWluZ1lpZWxkczsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2FjY3VtdWxhdGVfc3BlY3VsYXRpdmVfc3RhdHMoIGttcF9hZGFwdGl2ZV9sb2NrX2luZm9fdCAqIGxjaykKK3sKKyAgICBrbXBfYWRhcHRpdmVfbG9ja19zdGF0aXN0aWNzX3QgKnQgPSAmZGVzdHJveWVkU3RhdHM7CisKKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmY2hhaW5fbG9jayApOworCisgICAgX19rbXBfYWRkX3N0YXRzKCAmZGVzdHJveWVkU3RhdHMsIGxjayApOworICAgIF9fa21wX2ZvcmdldF9sb2NrKCBsY2sgKTsKKworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZjaGFpbl9sb2NrICk7Cit9CisKK3N0YXRpYyBmbG9hdAorcGVyY2VudCAoa21wX3VpbnQzMiBjb3VudCwga21wX3VpbnQzMiB0b3RhbCkKK3sKKyAgICByZXR1cm4gKHRvdGFsID09IDApID8gMC4wOiAoMTAwLjAgKiBjb3VudCkvdG90YWw7Cit9CisKK3N0YXRpYworRklMRSAqIF9fa21wX29wZW5fc3RhdHNfZmlsZSgpCit7CisgICAgaWYgKHN0cmNtcCAoX19rbXBfc3BlY3VsYXRpdmVfc3RhdHNmaWxlLCAiLSIpID09IDApCisgICAgICAgIHJldHVybiBzdGRvdXQ7CisKKyAgICBzaXplX3QgYnVmZkxlbiA9IEtNUF9TVFJMRU4oIF9fa21wX3NwZWN1bGF0aXZlX3N0YXRzZmlsZSApICsgMjA7CisgICAgY2hhciBidWZmZXJbYnVmZkxlbl07CisgICAgS01QX1NOUFJJTlRGICgmYnVmZmVyWzBdLCBidWZmTGVuLCBfX2ttcF9zcGVjdWxhdGl2ZV9zdGF0c2ZpbGUsCisgICAgICAoa21wX2ludDMyKWdldHBpZCgpKTsKKyAgICBGSUxFICogcmVzdWx0ID0gZm9wZW4oJmJ1ZmZlclswXSwgInciKTsKKworICAgIC8vIE1heWJlIHdlIHNob3VsZCBpc3N1ZSBhIHdhcm5pbmcgaGVyZS4uLgorICAgIHJldHVybiByZXN1bHQgPyByZXN1bHQgOiBzdGRvdXQ7Cit9CisKK3ZvaWQKK19fa21wX3ByaW50X3NwZWN1bGF0aXZlX3N0YXRzKCkKK3sKKyAgICBpZiAoX19rbXBfdXNlcl9sb2NrX2tpbmQgIT0gbGtfYWRhcHRpdmUpCisgICAgICAgIHJldHVybjsKKworICAgIEZJTEUgKiBzdGF0c0ZpbGUgPSBfX2ttcF9vcGVuX3N0YXRzX2ZpbGUoKTsKKworICAgIGttcF9hZGFwdGl2ZV9sb2NrX3N0YXRpc3RpY3NfdCB0b3RhbCA9IGRlc3Ryb3llZFN0YXRzOworICAgIGttcF9hZGFwdGl2ZV9sb2NrX2luZm9fdCAqbGNrOworCisgICAgZm9yIChsY2sgPSBsaXZlTG9ja3Muc3RhdHMubmV4dDsgbGNrICE9ICZsaXZlTG9ja3M7IGxjayA9IGxjay0+c3RhdHMubmV4dCkgeworICAgICAgICBfX2ttcF9hZGRfc3RhdHMoICZ0b3RhbCwgbGNrICk7CisgICAgfQorICAgIGttcF9hZGFwdGl2ZV9sb2NrX3N0YXRpc3RpY3NfdCAqdCA9ICZ0b3RhbDsKKyAgICBrbXBfdWludDMyIHRvdGFsU2VjdGlvbnMgICAgID0gdC0+bm9uU3BlY3VsYXRpdmVBY3F1aXJlcyArIHQtPnN1Y2Nlc3NmdWxTcGVjdWxhdGlvbnM7CisgICAga21wX3VpbnQzMiB0b3RhbFNwZWN1bGF0aW9ucyA9IHQtPnN1Y2Nlc3NmdWxTcGVjdWxhdGlvbnMgKyB0LT5oYXJkRmFpbGVkU3BlY3VsYXRpb25zICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC0+c29mdEZhaWxlZFNwZWN1bGF0aW9uczsKKworICAgIGZwcmludGYgKCBzdGF0c0ZpbGUsICJTcGVjdWxhdGl2ZSBsb2NrIHN0YXRpc3RpY3MgKGFsbCBhcHByb3hpbWF0ZSEpXG4iKTsKKyAgICBmcHJpbnRmICggc3RhdHNGaWxlLCAiIExvY2sgcGFyYW1ldGVyczogXG4iCisgICAgICAgICAgICAgIiAgIG1heF9zb2Z0X3JldHJpZXMgICAgICAgICAgICAgICA6ICUxMGRcbiIKKyAgICAgICAgICAgICAiICAgbWF4X2JhZG5lc3MgICAgICAgICAgICAgICAgICAgIDogJTEwZFxuIiwKKyAgICAgICAgICAgICBfX2ttcF9hZGFwdGl2ZV9iYWNrb2ZmX3BhcmFtcy5tYXhfc29mdF9yZXRyaWVzLAorICAgICAgICAgICAgIF9fa21wX2FkYXB0aXZlX2JhY2tvZmZfcGFyYW1zLm1heF9iYWRuZXNzKTsKKyAgICBmcHJpbnRmKCBzdGF0c0ZpbGUsICIgTm9uLXNwZWN1bGF0aXZlIGFjcXVpcmUgYXR0ZW1wdHMgOiAlMTBkXG4iLCB0LT5ub25TcGVjdWxhdGl2ZUFjcXVpcmVBdHRlbXB0cyApOworICAgIGZwcmludGYoIHN0YXRzRmlsZSwgIiBUb3RhbCBjcml0aWNhbCBzZWN0aW9ucyAgICAgICAgICA6ICUxMGRcbiIsIHRvdGFsU2VjdGlvbnMgKTsKKyAgICBmcHJpbnRmKCBzdGF0c0ZpbGUsICIgU3VjY2Vzc2Z1bCBzcGVjdWxhdGlvbnMgICAgICAgICAgOiAlMTBkICglNS4xZiUlKVxuIiwKKyAgICAgICAgICAgICB0LT5zdWNjZXNzZnVsU3BlY3VsYXRpb25zLCBwZXJjZW50KCB0LT5zdWNjZXNzZnVsU3BlY3VsYXRpb25zLCB0b3RhbFNlY3Rpb25zICkgKTsKKyAgICBmcHJpbnRmKCBzdGF0c0ZpbGUsICIgTm9uLXNwZWN1bGF0aXZlIGFjcXVpcmVzICAgICAgICAgOiAlMTBkICglNS4xZiUlKVxuIiwKKyAgICAgICAgICAgICB0LT5ub25TcGVjdWxhdGl2ZUFjcXVpcmVzLCBwZXJjZW50KCB0LT5ub25TcGVjdWxhdGl2ZUFjcXVpcmVzLCB0b3RhbFNlY3Rpb25zICkgKTsKKyAgICBmcHJpbnRmKCBzdGF0c0ZpbGUsICIgTGVtbWluZyB5aWVsZHMgICAgICAgICAgICAgICAgICAgOiAlMTBkXG5cbiIsIHQtPmxlbW1pbmdZaWVsZHMgKTsKKworICAgIGZwcmludGYoIHN0YXRzRmlsZSwgIiBTcGVjdWxhdGl2ZSBhY3F1aXJlIGF0dGVtcHRzICAgICA6ICUxMGRcbiIsIHRvdGFsU3BlY3VsYXRpb25zICk7CisgICAgZnByaW50Ziggc3RhdHNGaWxlLCAiIFN1Y2Nlc3NlcyAgICAgICAgICAgICAgICAgICAgICAgIDogJTEwZCAoJTUuMWYlJSlcbiIsCisgICAgICAgICAgICAgdC0+c3VjY2Vzc2Z1bFNwZWN1bGF0aW9ucywgcGVyY2VudCggdC0+c3VjY2Vzc2Z1bFNwZWN1bGF0aW9ucywgdG90YWxTcGVjdWxhdGlvbnMgKSApOworICAgIGZwcmludGYoIHN0YXRzRmlsZSwgIiBTb2Z0IGZhaWx1cmVzICAgICAgICAgICAgICAgICAgICA6ICUxMGQgKCU1LjFmJSUpXG4iLAorICAgICAgICAgICAgIHQtPnNvZnRGYWlsZWRTcGVjdWxhdGlvbnMsIHBlcmNlbnQoIHQtPnNvZnRGYWlsZWRTcGVjdWxhdGlvbnMsIHRvdGFsU3BlY3VsYXRpb25zICkgKTsKKyAgICBmcHJpbnRmKCBzdGF0c0ZpbGUsICIgSGFyZCBmYWlsdXJlcyAgICAgICAgICAgICAgICAgICAgOiAlMTBkICglNS4xZiUlKVxuIiwKKyAgICAgICAgICAgICB0LT5oYXJkRmFpbGVkU3BlY3VsYXRpb25zLCBwZXJjZW50KCB0LT5oYXJkRmFpbGVkU3BlY3VsYXRpb25zLCB0b3RhbFNwZWN1bGF0aW9ucyApICk7CisKKyAgICBpZiAoc3RhdHNGaWxlICE9IHN0ZG91dCkKKyAgICAgICAgZmNsb3NlKCBzdGF0c0ZpbGUgKTsKK30KKworIyBkZWZpbmUgS01QX0lOQ19TVEFUKGxjayxzdGF0KSAoIGxjay0+bGsuYWRhcHRpdmUuc3RhdHMuc3RhdCsrICkKKyNlbHNlCisjIGRlZmluZSBLTVBfSU5DX1NUQVQobGNrLHN0YXQpCisKKyNlbmRpZiAvLyBLTVBfREVCVUdfQURBUFRJVkVfTE9DS1MKKworc3RhdGljIGlubGluZSBib29sCitfX2ttcF9pc191bmxvY2tlZF9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrICkKK3sKKyAgICAvLyBJdCBpcyBlbm91Z2ggdG8gY2hlY2sgdGhhdCB0aGUgaGVhZF9pZCBpcyB6ZXJvLgorICAgIC8vIFdlIGRvbid0IGFsc28gbmVlZCB0byBjaGVjayB0aGUgdGFpbC4KKyAgICBib29sIHJlcyA9IGxjay0+bGsuaGVhZF9pZCA9PSAwOworCisgICAgLy8gV2UgbmVlZCBhIGZlbmNlIGhlcmUsIHNpbmNlIHdlIG11c3QgZW5zdXJlIHRoYXQgbm8gbWVtb3J5IG9wZXJhdGlvbnMKKyAgICAvLyBmcm9tIGxhdGVyIGluIHRoaXMgdGhyZWFkIGZsb2F0IGFib3ZlIHRoYXQgcmVhZC4KKyNpZiBLTVBfQ09NUElMRVJfSUNDCisgICAgX21tX21mZW5jZSgpOworI2Vsc2UKKyAgICBfX3N5bmNfc3luY2hyb25pemUoKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIHJlczsKK30KKworLy8gRnVuY3Rpb25zIGZvciBtYW5pcHVsYXRpbmcgdGhlIGJhZG5lc3MKK3N0YXRpYyBfX2lubGluZSB2b2lkCitfX2ttcF91cGRhdGVfYmFkbmVzc19hZnRlcl9zdWNjZXNzKCBrbXBfYWRhcHRpdmVfbG9ja190ICpsY2sgKQoreworICAgIC8vIFJlc2V0IHRoZSBiYWRuZXNzIHRvIHplcm8gc28gd2UgZWFnZXJseSB0cnkgdG8gc3BlY3VsYXRlIGFnYWluCisgICAgbGNrLT5say5hZGFwdGl2ZS5iYWRuZXNzID0gMDsKKyAgICBLTVBfSU5DX1NUQVQobGNrLHN1Y2Nlc3NmdWxTcGVjdWxhdGlvbnMpOworfQorCisvLyBDcmVhdGUgYSBiaXQgbWFzayB3aXRoIG9uZSBtb3JlIHNldCBiaXQuCitzdGF0aWMgX19pbmxpbmUgdm9pZAorX19rbXBfc3RlcF9iYWRuZXNzKCBrbXBfYWRhcHRpdmVfbG9ja190ICpsY2sgKQoreworICAgIGttcF91aW50MzIgbmV3QmFkbmVzcyA9ICggbGNrLT5say5hZGFwdGl2ZS5iYWRuZXNzIDw8IDEgKSB8IDE7CisgICAgaWYgKCBuZXdCYWRuZXNzID4gbGNrLT5say5hZGFwdGl2ZS5tYXhfYmFkbmVzcykgeworICAgICAgICByZXR1cm47CisgICAgfSBlbHNlIHsKKyAgICAgICAgbGNrLT5say5hZGFwdGl2ZS5iYWRuZXNzID0gbmV3QmFkbmVzczsKKyAgICB9Cit9CisKKy8vIENoZWNrIHdoZXRoZXIgc3BlY3VsYXRpb24gc2hvdWxkIGJlIGF0dGVtcHRlZC4KK3N0YXRpYyBfX2lubGluZSBpbnQKK19fa21wX3Nob3VsZF9zcGVjdWxhdGUoIGttcF9hZGFwdGl2ZV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGttcF91aW50MzIgYmFkbmVzcyA9IGxjay0+bGsuYWRhcHRpdmUuYmFkbmVzczsKKyAgICBrbXBfdWludDMyIGF0dGVtcHRzPSBsY2stPmxrLmFkYXB0aXZlLmFjcXVpcmVfYXR0ZW1wdHM7CisgICAgaW50IHJlcyA9IChhdHRlbXB0cyAmIGJhZG5lc3MpID09IDA7CisgICAgcmV0dXJuIHJlczsKK30KKworLy8gQXR0ZW1wdCB0byBhY3F1aXJlIG9ubHkgdGhlIHNwZWN1bGF0aXZlIGxvY2suCisvLyBEb2VzIG5vdCBiYWNrIG9mZiB0byB0aGUgbm9uLXNwZWN1bGF0aXZlIGxvY2suCisvLworc3RhdGljIGludAorX19rbXBfdGVzdF9hZGFwdGl2ZV9sb2NrX29ubHkoIGttcF9hZGFwdGl2ZV9sb2NrX3QgKiBsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpbnQgcmV0cmllcyA9IGxjay0+bGsuYWRhcHRpdmUubWF4X3NvZnRfcmV0cmllczsKKworICAgIC8vIFdlIGRvbid0IGV4cGxpY2l0bHkgY291bnQgdGhlIHN0YXJ0IG9mIHNwZWN1bGF0aW9uLCByYXRoZXIgd2UgcmVjb3JkCisgICAgLy8gdGhlIHJlc3VsdHMgKHN1Y2Nlc3MsIGhhcmQgZmFpbCwgc29mdCBmYWlsKS4gVGhlIHN1bSBvZiBhbGwgb2YgdGhvc2UKKyAgICAvLyBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIHRpbWVzIHdlIHN0YXJ0ZWQgc3BlY3VsYXRpb24gc2luY2UgYWxsCisgICAgLy8gc3BlY3VsYXRpb25zIG11c3QgZW5kIG9uZSBvZiB0aG9zZSB3YXlzLgorICAgIGRvCisgICAgeworICAgICAgICBrbXBfdWludDMyIHN0YXR1cyA9IF94YmVnaW4oKTsKKyAgICAgICAgLy8gU3dpdGNoIHRoaXMgaW4gdG8gZGlzYWJsZSBhY3R1YWwgc3BlY3VsYXRpb24gYnV0IGV4ZXJjaXNlCisgICAgICAgIC8vIGF0IGxlYXN0IHNvbWUgb2YgdGhlIHJlc3Qgb2YgdGhlIGNvZGUuIFVzZWZ1bCBmb3IgZGVidWdnaW5nLi4uCisgICAgICAgIC8vIGttcF91aW50MzIgc3RhdHVzID0gX1hBQk9SVF9ORVNURUQ7CisKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBfWEJFR0lOX1NUQVJURUQgKQorICAgICAgICB7IC8qIFdlIGhhdmUgc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQgc3BlY3VsYXRpb24KKyAgICAgICAgICAgKiBDaGVjayB0aGF0IG5vLW9uZSBhY3F1aXJlZCB0aGUgbG9jayBmb3IgcmVhbCBiZXR3ZWVuIHdoZW4gd2UgbGFzdCBsb29rZWQKKyAgICAgICAgICAgKiBhbmQgbm93LiBUaGlzIGFsc28gZ2V0cyB0aGUgbG9jayBjYWNoZSBsaW5lIGludG8gb3VyIHJlYWQtc2V0LAorICAgICAgICAgICAqIHdoaWNoIHdlIG5lZWQgc28gdGhhdCB3ZSdsbCBhYm9ydCBpZiBhbnlvbmUgbGF0ZXIgY2xhaW1zIGl0IGZvciByZWFsLgorICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKCEgX19rbXBfaXNfdW5sb2NrZWRfcXVldWluZ19sb2NrKCBHRVRfUUxLX1BUUihsY2spICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIExvY2sgaXMgbm93IHZpc2libHkgYWNxdWlyZWQsIHNvIHNvbWVvbmUgYmVhdCB1cyB0byBpdC4KKyAgICAgICAgICAgICAgICAvLyBBYm9ydCB0aGUgdHJhbnNhY3Rpb24gc28gd2UnbGwgcmVzdGFydCBmcm9tIF94YmVnaW4gd2l0aCB0aGUKKyAgICAgICAgICAgICAgICAvLyBmYWlsdXJlIHN0YXR1cy4KKyAgICAgICAgICAgICAgICBfeGFib3J0KDB4MDEpOworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQyKCAwLCAic2hvdWxkIG5vdCBnZXQgaGVyZSIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAxOyAgIC8vIExvY2sgaGFzIGJlZW4gYWNxdWlyZWQgKHNwZWN1bGF0aXZlbHkpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBXZSBoYXZlIGFib3J0ZWQsIHVwZGF0ZSB0aGUgc3RhdGlzdGljcworICAgICAgICAgICAgaWYgKCBzdGF0dXMgJiBTT0ZUX0FCT1JUX01BU0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgS01QX0lOQ19TVEFUKGxjayxzb2Z0RmFpbGVkU3BlY3VsYXRpb25zKTsKKyAgICAgICAgICAgICAgICAvLyBhbmQgbG9vcCByb3VuZCB0byByZXRyeS4KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBLTVBfSU5DX1NUQVQobGNrLGhhcmRGYWlsZWRTcGVjdWxhdGlvbnMpOworICAgICAgICAgICAgICAgIC8vIEdpdmUgdXAgaWYgd2UgaGFkIGEgaGFyZCBmYWlsdXJlLgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSAgd2hpbGUoIHJldHJpZXMtLSApOyAvLyBMb29wIHdoaWxlIHdlIGhhdmUgcmV0cmllcywgYW5kIGRpZG4ndCBmYWlsIGhhcmQuCisKKyAgICAvLyBFaXRoZXIgd2UgaGFkIGEgaGFyZCBmYWlsdXJlIG9yIHdlIGRpZG4ndCBzdWNjZWVkIHNvZnRseSBhZnRlcgorICAgIC8vIHRoZSBmdWxsIHNldCBvZiBhdHRlbXB0cywgc28gYmFjayBvZmYgdGhlIGJhZG5lc3MuCisgICAgX19rbXBfc3RlcF9iYWRuZXNzKCBsY2sgKTsKKyAgICByZXR1cm4gMDsKK30KKworLy8gQXR0ZW1wdCB0byBhY3F1aXJlIHRoZSBzcGVjdWxhdGl2ZSBsb2NrLCBvciBiYWNrIG9mZiB0byB0aGUgbm9uLXNwZWN1bGF0aXZlIG9uZQorLy8gaWYgdGhlIHNwZWN1bGF0aXZlIGxvY2sgY2Fubm90IGJlIGFjcXVpcmVkLgorLy8gV2UgY2FuIHN1Y2NlZWQgc3BlY3VsYXRpdmVseSwgbm9uLXNwZWN1bGF0aXZlbHksIG9yIGZhaWwuCitzdGF0aWMgaW50CitfX2ttcF90ZXN0X2FkYXB0aXZlX2xvY2soIGttcF9hZGFwdGl2ZV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIC8vIEZpcnN0IHRyeSB0byBhY3F1aXJlIHRoZSBsb2NrIHNwZWN1bGF0aXZlbHkKKyAgICBpZiAoIF9fa21wX3Nob3VsZF9zcGVjdWxhdGUoIGxjaywgZ3RpZCApICYmIF9fa21wX3Rlc3RfYWRhcHRpdmVfbG9ja19vbmx5KCBsY2ssIGd0aWQgKSApCisgICAgICAgIHJldHVybiAxOworCisgICAgLy8gU3BlY3VsYXRpdmUgYWNxdWlzaXRpb24gZmFpbGVkLCBzbyB0cnkgdG8gYWNxdWlyZSBpdCBub24tc3BlY3VsYXRpdmVseS4KKyAgICAvLyBDb3VudCB0aGUgbm9uLXNwZWN1bGF0aXZlIGFjcXVpcmUgYXR0ZW1wdAorICAgIGxjay0+bGsuYWRhcHRpdmUuYWNxdWlyZV9hdHRlbXB0cysrOworCisgICAgLy8gVXNlIGJhc2UsIG5vbi1zcGVjdWxhdGl2ZSBsb2NrLgorICAgIGlmICggX19rbXBfdGVzdF9xdWV1aW5nX2xvY2soIEdFVF9RTEtfUFRSKGxjayksIGd0aWQgKSApCisgICAgeworICAgICAgICBLTVBfSU5DX1NUQVQobGNrLG5vblNwZWN1bGF0aXZlQWNxdWlyZXMpOworICAgICAgICByZXR1cm4gMTsgICAgICAgLy8gTG9jayBpcyBhY3F1aXJlZCAobm9uLXNwZWN1bGF0aXZlbHkpCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAwOyAgICAgICAvLyBGYWlsZWQgdG8gYWNxdWlyZSB0aGUgbG9jaywgaXQncyBhbHJlYWR5IHZpc2libHkgbG9ja2VkLgorICAgIH0KK30KKworc3RhdGljIGludAorX19rbXBfdGVzdF9hZGFwdGl2ZV9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfYWRhcHRpdmVfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdGVzdF9sb2NrIjsKKyAgICBpZiAoIGxjay0+bGsucWxrLmluaXRpYWxpemVkICE9IEdFVF9RTEtfUFRSKGxjaykgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKworICAgIGludCByZXR2YWwgPSBfX2ttcF90ZXN0X2FkYXB0aXZlX2xvY2soIGxjaywgZ3RpZCApOworCisgICAgaWYgKCByZXR2YWwgKSB7CisgICAgICAgIGxjay0+bGsucWxrLm93bmVyX2lkID0gZ3RpZCArIDE7CisgICAgfQorICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8vIEJsb2NrIHVudGlsIHdlIGNhbiBhY3F1aXJlIGEgc3BlY3VsYXRpdmUsIGFkYXB0aXZlIGxvY2suCisvLyBXZSBjaGVjayB3aGV0aGVyIHdlIHNob3VsZCBiZSB0cnlpbmcgdG8gc3BlY3VsYXRlLgorLy8gSWYgd2Ugc2hvdWxkIGJlLCB3ZSBjaGVjayB0aGUgcmVhbCBsb2NrIHRvIHNlZSBpZiBpdCBpcyBmcmVlLAorLy8gYW5kLCBpZiBub3QsIHBhdXNlIHdpdGhvdXQgYXR0ZW1wdGluZyB0byBhY3F1aXJlIGl0IHVudGlsIGl0IGlzLgorLy8gVGhlbiB3ZSB0cnkgdGhlIHNwZWN1bGF0aXZlIGFjcXVpcmUuCisvLyBUaGlzIG1lYW5zIHRoYXQgYWx0aG91Z2ggd2Ugc3VmZmVyIGZyb20gbGVtbWluZ3MgYSBsaXR0bGUgKAorLy8gYmVjYXVzZSBhbGwgd2UgY2FuJ3QgYWNxdWlyZSB0aGUgbG9jayBzcGVjdWxhdGl2ZWx5IHVudGlsCisvLyB0aGUgcXVldWUgb2YgdGhyZWFkcyB3YWl0aW5nIGhhcyBjbGVhcmVkKSwgd2UgZG9uJ3QgZ2V0IGludG8gYQorLy8gc3RhdGUgd2hlcmUgd2UgY2FuIG5ldmVyIGFjcXVpcmUgdGhlIGxvY2sgc3BlY3VsYXRpdmVseSAoYmVjYXVzZSB3ZQorLy8gZm9yY2UgdGhlIHF1ZXVlIHRvIGNsZWFyIGJ5IHByZXZlbnRpbmcgbmV3IGFycml2YWxzIGZyb20gZW50ZXJpbmcgdGhlCisvLyBxdWV1ZSkuCisvLyBUaGlzIGRvZXMgbWVhbiB0aGF0IHdoZW4gd2UncmUgdHJ5aW5nIHRvIGJyZWFrIGxlbW1pbmdzLCB0aGUgbG9jaworLy8gaXMgbm8gbG9uZ2VyIGZhaXIuIEhvd2V2ZXIgT3Blbk1QIG1ha2VzIG5vIGd1YXJhbnRlZSB0aGF0IGl0cworLy8gbG9ja3MgYXJlIGZhaXIsIHNvIHRoaXMgaXNuJ3QgYSByZWFsIHByb2JsZW0uCitzdGF0aWMgdm9pZAorX19rbXBfYWNxdWlyZV9hZGFwdGl2ZV9sb2NrKCBrbXBfYWRhcHRpdmVfbG9ja190ICogbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaWYgKCBfX2ttcF9zaG91bGRfc3BlY3VsYXRlKCBsY2ssIGd0aWQgKSApCisgICAgeworICAgICAgICBpZiAoIF9fa21wX2lzX3VubG9ja2VkX3F1ZXVpbmdfbG9jayggR0VUX1FMS19QVFIobGNrKSApICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBfX2ttcF90ZXN0X2FkYXB0aXZlX2xvY2tfb25seSggbGNrICwgZ3RpZCApICkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAvLyBXZSB0cmllZCBzcGVjdWxhdGlvbiBhbmQgZmFpbGVkLCBzbyBnaXZlIHVwLgorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy8gV2UgY2FuJ3QgdHJ5IHNwZWN1bGF0aW9uIHVudGlsIHRoZSBsb2NrIGlzIGZyZWUsIHNvIHdlCisgICAgICAgICAgICAvLyBwYXVzZSBoZXJlICh3aXRob3V0IHN1c3BlbmRpbmcgb24gdGhlIHF1ZXVlaW5nIGxvY2ssCisgICAgICAgICAgICAvLyB0byBhbGxvdyBpdCB0byBkcmFpbiwgdGhlbiB0cnkgYWdhaW4uCisgICAgICAgICAgICAvLyBBbGwgb3RoZXIgdGhyZWFkcyB3aWxsIGFsc28gc2VlIHRoZSBzYW1lIHJlc3VsdCBmb3IKKyAgICAgICAgICAgIC8vIHNob3VsZFNwZWN1bGF0ZSwgc28gd2lsbCBiZSBkb2luZyB0aGUgc2FtZSBpZiB0aGV5CisgICAgICAgICAgICAvLyB0cnkgdG8gY2xhaW0gdGhlIGxvY2sgZnJvbSBub3cgb24uCisgICAgICAgICAgICB3aGlsZSAoICEgX19rbXBfaXNfdW5sb2NrZWRfcXVldWluZ19sb2NrKCBHRVRfUUxLX1BUUihsY2spICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEtNUF9JTkNfU1RBVChsY2ssbGVtbWluZ1lpZWxkcyk7CisgICAgICAgICAgICAgICAgX19rbXBfeWllbGQgKFRSVUUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIF9fa21wX3Rlc3RfYWRhcHRpdmVfbG9ja19vbmx5KCBsY2ssIGd0aWQgKSApCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gU3BlY3VsYXRpdmUgYWNxdWlzaXRpb24gZmFpbGVkLCBzbyBhY3F1aXJlIGl0IG5vbi1zcGVjdWxhdGl2ZWx5LgorICAgIC8vIENvdW50IHRoZSBub24tc3BlY3VsYXRpdmUgYWNxdWlyZSBhdHRlbXB0CisgICAgbGNrLT5say5hZGFwdGl2ZS5hY3F1aXJlX2F0dGVtcHRzKys7CisKKyAgICBfX2ttcF9hY3F1aXJlX3F1ZXVpbmdfbG9ja190aW1lZF90ZW1wbGF0ZTxGQUxTRT4oIEdFVF9RTEtfUFRSKGxjayksIGd0aWQgKTsKKyAgICAvLyBXZSBoYXZlIGFjcXVpcmVkIHRoZSBiYXNlIGxvY2ssIHNvIGNvdW50IHRoYXQuCisgICAgS01QX0lOQ19TVEFUKGxjayxub25TcGVjdWxhdGl2ZUFjcXVpcmVzICk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9hY3F1aXJlX2FkYXB0aXZlX2xvY2tfd2l0aF9jaGVja3MoIGttcF9hZGFwdGl2ZV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9zZXRfbG9jayI7CisgICAgaWYgKCBsY2stPmxrLnFsay5pbml0aWFsaXplZCAhPSBHRVRfUUxLX1BUUihsY2spICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9nZXRfcXVldWluZ19sb2NrX293bmVyKCBHRVRfUUxLX1BUUihsY2spICkgPT0gZ3RpZCApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNBbHJlYWR5T3duZWQsIGZ1bmMgKTsKKyAgICB9CisKKyAgICBfX2ttcF9hY3F1aXJlX2FkYXB0aXZlX2xvY2soIGxjaywgZ3RpZCApOworCisgICAgbGNrLT5say5xbGsub3duZXJfaWQgPSBndGlkICsgMTsKK30KKworc3RhdGljIGludAorX19rbXBfcmVsZWFzZV9hZGFwdGl2ZV9sb2NrKCBrbXBfYWRhcHRpdmVfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpZiAoIF9fa21wX2lzX3VubG9ja2VkX3F1ZXVpbmdfbG9jayggR0VUX1FMS19QVFIobGNrKSApICkKKyAgICB7ICAgLy8gSWYgdGhlIGxvY2sgZG9lc24ndCBsb29rIGNsYWltZWQgd2UgbXVzdCBiZSBzcGVjdWxhdGluZy4KKyAgICAgICAgLy8gKE9yIHRoZSB1c2VyJ3MgY29kZSBpcyBidWdneSBhbmQgdGhleSdyZSByZWxlYXNpbmcgd2l0aG91dCBsb2NraW5nOworICAgICAgICAvLyBpZiB3ZSBoYWQgWFRFU1Qgd2UnZCBiZSBhYmxlIHRvIGNoZWNrIHRoYXQgY2FzZS4uLikKKyAgICAgICAgX3hlbmQoKTsgICAgICAgIC8vIEV4aXQgc3BlY3VsYXRpb24KKyAgICAgICAgX19rbXBfdXBkYXRlX2JhZG5lc3NfYWZ0ZXJfc3VjY2VzcyggbGNrICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7ICAgLy8gU2luY2UgdGhlIGxvY2sgKmlzKiB2aXNpYmx5IGxvY2tlZCB3ZSdyZSBub3Qgc3BlY3VsYXRpbmcsCisgICAgICAgIC8vIHNvIHNob3VsZCB1c2UgdGhlIHVuZGVybHlpbmcgbG9jaydzIHJlbGVhc2Ugc2NoZW1lLgorICAgICAgICBfX2ttcF9yZWxlYXNlX3F1ZXVpbmdfbG9jayggR0VUX1FMS19QVFIobGNrKSwgZ3RpZCApOworICAgIH0KKyAgICByZXR1cm4gS01QX0xPQ0tfUkVMRUFTRUQ7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3JlbGVhc2VfYWRhcHRpdmVfbG9ja193aXRoX2NoZWNrcygga21wX2FkYXB0aXZlX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Vuc2V0X2xvY2siOworICAgIEtNUF9NQigpOyAgLyogaW4gY2FzZSBhbm90aGVyIHByb2Nlc3NvciBpbml0aWFsaXplZCBsb2NrICovCisgICAgaWYgKCBsY2stPmxrLnFsay5pbml0aWFsaXplZCAhPSBHRVRfUUxLX1BUUihsY2spICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9nZXRfcXVldWluZ19sb2NrX293bmVyKCBHRVRfUUxLX1BUUihsY2spICkgPT0gLTEgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ0ZyZWUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9nZXRfcXVldWluZ19sb2NrX293bmVyKCBHRVRfUUxLX1BUUihsY2spICkgIT0gZ3RpZCApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nU2V0QnlBbm90aGVyLCBmdW5jICk7CisgICAgfQorICAgIGxjay0+bGsucWxrLm93bmVyX2lkID0gMDsKKyAgICBfX2ttcF9yZWxlYXNlX2FkYXB0aXZlX2xvY2soIGxjaywgZ3RpZCApOworICAgIHJldHVybiBLTVBfTE9DS19SRUxFQVNFRDsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2luaXRfYWRhcHRpdmVfbG9jaygga21wX2FkYXB0aXZlX2xvY2tfdCAqbGNrICkKK3sKKyAgICBfX2ttcF9pbml0X3F1ZXVpbmdfbG9jayggR0VUX1FMS19QVFIobGNrKSApOworICAgIGxjay0+bGsuYWRhcHRpdmUuYmFkbmVzcyA9IDA7CisgICAgbGNrLT5say5hZGFwdGl2ZS5hY3F1aXJlX2F0dGVtcHRzID0gMDsgLy9ub25TcGVjdWxhdGl2ZUFjcXVpcmVBdHRlbXB0cyA9IDA7CisgICAgbGNrLT5say5hZGFwdGl2ZS5tYXhfc29mdF9yZXRyaWVzID0gX19rbXBfYWRhcHRpdmVfYmFja29mZl9wYXJhbXMubWF4X3NvZnRfcmV0cmllczsKKyAgICBsY2stPmxrLmFkYXB0aXZlLm1heF9iYWRuZXNzICAgICAgPSBfX2ttcF9hZGFwdGl2ZV9iYWNrb2ZmX3BhcmFtcy5tYXhfYmFkbmVzczsKKyNpZiBLTVBfREVCVUdfQURBUFRJVkVfTE9DS1MKKyAgICBfX2ttcF96ZXJvX3NwZWN1bGF0aXZlX3N0YXRzKCAmbGNrLT5say5hZGFwdGl2ZSApOworI2VuZGlmCisgICAgS0FfVFJBQ0UoMTAwMCwgKCJfX2ttcF9pbml0X2FkYXB0aXZlX2xvY2s6IGxvY2sgJXAgaW5pdGlhbGl6ZWRcbiIsIGxjaykpOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfaW5pdF9hZGFwdGl2ZV9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfYWRhcHRpdmVfbG9ja190ICogbGNrICkKK3sKKyAgICBfX2ttcF9pbml0X2FkYXB0aXZlX2xvY2soIGxjayApOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZGVzdHJveV9hZGFwdGl2ZV9sb2NrKCBrbXBfYWRhcHRpdmVfbG9ja190ICpsY2sgKQoreworI2lmIEtNUF9ERUJVR19BREFQVElWRV9MT0NLUworICAgIF9fa21wX2FjY3VtdWxhdGVfc3BlY3VsYXRpdmVfc3RhdHMoICZsY2stPmxrLmFkYXB0aXZlICk7CisjZW5kaWYKKyAgICBfX2ttcF9kZXN0cm95X3F1ZXVpbmdfbG9jayAoR0VUX1FMS19QVFIobGNrKSk7CisgICAgLy8gTm90aGluZyBuZWVkZWQgZm9yIHRoZSBzcGVjdWxhdGl2ZSBwYXJ0LgorfQorCitzdGF0aWMgdm9pZAorX19rbXBfZGVzdHJveV9hZGFwdGl2ZV9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfYWRhcHRpdmVfbG9ja190ICpsY2sgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9kZXN0cm95X2xvY2siOworICAgIGlmICggbGNrLT5say5xbGsuaW5pdGlhbGl6ZWQgIT0gR0VUX1FMS19QVFIobGNrKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lciggR0VUX1FMS19QVFIobGNrKSApICE9IC0xICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTdGlsbE93bmVkLCBmdW5jICk7CisgICAgfQorICAgIF9fa21wX2Rlc3Ryb3lfYWRhcHRpdmVfbG9jayggbGNrICk7Cit9CisKKworI2VuZGlmIC8vIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIERSRFBBIHRpY2tldCBsb2NrcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAiRFJEUEEiIG1lYW5zIER5bmFtaWNhbGx5IFJlY29uZmlndXJhYmxlIERpc3RyaWJ1dGVkIFBvbGxpbmcgQXJlYSAqLworCitzdGF0aWMga21wX2ludDMyCitfX2ttcF9nZXRfZHJkcGFfbG9ja19vd25lcigga21wX2RyZHBhX2xvY2tfdCAqbGNrICkKK3sKKyAgICByZXR1cm4gVENSXzQoIGxjay0+bGsub3duZXJfaWQgKSAtIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbAorX19rbXBfaXNfZHJkcGFfbG9ja19uZXN0YWJsZSgga21wX2RyZHBhX2xvY2tfdCAqbGNrICkKK3sKKyAgICByZXR1cm4gbGNrLT5say5kZXB0aF9sb2NrZWQgIT0gLTE7Cit9CisKK19fZm9yY2VpbmxpbmUgc3RhdGljIGludAorX19rbXBfYWNxdWlyZV9kcmRwYV9sb2NrX3RpbWVkX3RlbXBsYXRlKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBrbXBfdWludDY0IHRpY2tldCA9IEtNUF9URVNUX1RIRU5fSU5DNjQoKGttcF9pbnQ2NCAqKSZsY2stPmxrLm5leHRfdGlja2V0KTsKKyAgICBrbXBfdWludDY0IG1hc2sgPSBUQ1JfOChsY2stPmxrLm1hc2spOyAgICAgICAgICAgICAgLy8gdm9sYXRpbGUgbG9hZAorICAgIHZvbGF0aWxlIHN0cnVjdCBrbXBfYmFzZV9kcmRwYV9sb2NrOjprbXBfbG9ja19wb2xsICpwb2xscworICAgICAgPSAodm9sYXRpbGUgc3RydWN0IGttcF9iYXNlX2RyZHBhX2xvY2s6OmttcF9sb2NrX3BvbGwgKikKKyAgICAgIFRDUl9QVFIobGNrLT5say5wb2xscyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdm9sYXRpbGUgbG9hZAorCisjaWZkZWYgVVNFX0xPQ0tfUFJPRklMRQorICAgIGlmIChUQ1JfOChwb2xsc1t0aWNrZXQgJiBtYXNrXS5wb2xsKSAhPSB0aWNrZXQpCisgICAgICAgIF9fa21wX3ByaW50ZigiTE9DSyBDT05URU5USU9OOiAlcFxuIiwgbGNrKTsKKyAgICAvKiBlbHNlIF9fa21wX3ByaW50ZiggIi4iICk7Ki8KKyNlbmRpZiAvKiBVU0VfTE9DS19QUk9GSUxFICovCisKKyAgICAvLworICAgIC8vIE5vdyBzcGluLXdhaXQsIGJ1dCByZWxvYWQgdGhlIHBvbGxzIHBvaW50ZXIgYW5kIG1hc2ssIGluIGNhc2UgdGhlCisgICAgLy8gcG9sbGluZyBhcmVhIGhhcyBiZWVuIHJlY29uZmlndXJlZC4gIFVubGVzcyBpdCBpcyByZWNvbmZpZ3VyZWQsIHRoZQorICAgIC8vIHJlbG9hZHMgc3RheSBpbiBMMSBjYWNoZSBhbmQgYXJlIGNoZWFwLgorICAgIC8vCisgICAgLy8gS2VlcCB0aGlzIGNvZGUgaW4gc3luYyB3aXRoIEtNUF9XQUlUX1lJRUxELCBpbiBrbXBfZGlzcGF0Y2guYyAhISEKKyAgICAvLworICAgIC8vIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIEtNUF9XQUlUX1lJRUxEIGRvZXNuJ3QgYWxsb3cgZm9yIG1hc2sKKyAgICAvLyBhbmQgcG9sbCB0byBiZSByZS1yZWFkIGV2ZXJ5IHNwaW4gaXRlcmF0aW9uLgorICAgIC8vCisgICAga21wX3VpbnQzMiBzcGluczsKKworICAgIEtNUF9GU1lOQ19QUkVQQVJFKGxjayk7CisgICAgS01QX0lOSVRfWUlFTEQoc3BpbnMpOworICAgIHdoaWxlIChUQ1JfOChwb2xsc1t0aWNrZXQgJiBtYXNrXSkucG9sbCA8IHRpY2tldCkgeyAvLyB2b2xhdGlsZSBsb2FkCisgICAgICAgIC8vIElmIHdlIGFyZSBvdmVyc3Vic2NyaWJlZCwKKyAgICAgICAgLy8gb3IgaGF2ZSB3YWl0ZWQgYSBiaXQgKGFuZCBLTVBfTElCUkFSWT10dXJuYXJvdW5kKSwgdGhlbiB5aWVsZC4KKyAgICAgICAgLy8gQ1BVIFBhdXNlIGlzIGluIHRoZSBtYWNyb3MgZm9yIHlpZWxkLgorICAgICAgICAvLworICAgICAgICBLTVBfWUlFTEQoVENSXzQoX19rbXBfbnRoKQorICAgICAgICAgID4gKF9fa21wX2F2YWlsX3Byb2MgPyBfX2ttcF9hdmFpbF9wcm9jIDogX19rbXBfeHByb2MpKTsKKyAgICAgICAgS01QX1lJRUxEX1NQSU4oc3BpbnMpOworCisgICAgICAgIC8vIFJlLXJlYWQgdGhlIG1hc2sgYW5kIHRoZSBwb2xsIHBvaW50ZXIgZnJvbSB0aGUgbG9jayBzdHJ1Y3R1cmUuCisgICAgICAgIC8vCisgICAgICAgIC8vIE1ha2UgY2VydGFpbiB0aGF0ICJtYXNrIiBpcyByZWFkIGJlZm9yZSAicG9sbHMiICEhIQorICAgICAgICAvLworICAgICAgICAvLyBJZiBhbm90aGVyIHRocmVhZCBwaWNrcyByZWNvbmZpZ3VyZXMgdGhlIHBvbGxpbmcgYXJlYSBhbmQgdXBkYXRlcworICAgICAgICAvLyB0aGVpciB2YWx1ZXMsIGFuZCB3ZSBnZXQgdGhlIG5ldyB2YWx1ZSBvZiBtYXNrIGFuZCB0aGUgb2xkIHBvbGxzCisgICAgICAgIC8vIHBvaW50ZXIsIHdlIGNvdWxkIGFjY2VzcyBtZW1vcnkgYmV5b25kIHRoZSBlbmQgb2YgdGhlIG9sZCBwb2xsaW5nCisgICAgICAgIC8vIGFyZWEuCisgICAgICAgIC8vCisgICAgICAgIG1hc2sgPSBUQ1JfOChsY2stPmxrLm1hc2spOyAgICAgICAgICAgICAgICAgICAgIC8vIHZvbGF0aWxlIGxvYWQKKyAgICAgICAgcG9sbHMgPSAodm9sYXRpbGUgc3RydWN0IGttcF9iYXNlX2RyZHBhX2xvY2s6OmttcF9sb2NrX3BvbGwgKikKKyAgICAgICAgICBUQ1JfUFRSKGxjay0+bGsucG9sbHMpOyAgICAgICAgICAgICAgICAgICAgICAgLy8gdm9sYXRpbGUgbG9hZAorICAgIH0KKworICAgIC8vCisgICAgLy8gQ3JpdGljYWwgc2VjdGlvbiBzdGFydHMgaGVyZQorICAgIC8vCisgICAgS01QX0ZTWU5DX0FDUVVJUkVEKGxjayk7CisgICAgS0FfVFJBQ0UoMTAwMCwgKCJfX2ttcF9hY3F1aXJlX2RyZHBhX2xvY2s6IHRpY2tldCAjJWxsZCBhY3F1aXJlZCBsb2NrICVwXG4iLAorICAgICAgdGlja2V0LCBsY2spKTsKKyAgICBsY2stPmxrLm5vd19zZXJ2aW5nID0gdGlja2V0OyAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9uLXZvbGF0aWxlIHN0b3JlCisKKyAgICAvLworICAgIC8vIERlYWxsb2NhdGUgYSBnYXJiYWdlIHBvbGxpbmcgYXJlYSBpZiB3ZSBrbm93IHRoYXQgd2UgYXJlIHRoZSBsYXN0CisgICAgLy8gdGhyZWFkIHRoYXQgY291bGQgcG9zc2libHkgYWNjZXNzIGl0LgorICAgIC8vCisgICAgLy8gVGhlID49IGNoZWNrIGlzIGluIGNhc2UgX19rbXBfdGVzdF9kcmRwYV9sb2NrKCkgYWxsb2NhdGVkIHRoZSBjbGVhbnVwCisgICAgLy8gdGlja2V0LgorICAgIC8vCisgICAgaWYgKChsY2stPmxrLm9sZF9wb2xscyAhPSBOVUxMKSAmJiAodGlja2V0ID49IGxjay0+bGsuY2xlYW51cF90aWNrZXQpKSB7CisgICAgICAgIF9fa21wX2ZyZWUoKHZvaWQgKilsY2stPmxrLm9sZF9wb2xscyk7CisgICAgICAgIGxjay0+bGsub2xkX3BvbGxzID0gTlVMTDsKKyAgICAgICAgbGNrLT5say5jbGVhbnVwX3RpY2tldCA9IDA7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBDaGVjayB0byBzZWUgaWYgd2Ugc2hvdWxkIHJlY29uZmlndXJlIHRoZSBwb2xsaW5nIGFyZWEuCisgICAgLy8gSWYgdGhlcmUgaXMgc3RpbGwgYSBnYXJiYWdlIHBvbGxpbmcgYXJlYSB0byBiZSBkZWFsbG9jYXRlZCBmcm9tIGEKKyAgICAvLyBwcmV2aW91cyByZWNvbmZpZ3VyYXRpb24sIGxldCBhIGxhdGVyIHRocmVhZCByZWNvbmZpZ3VyZSBpdC4KKyAgICAvLworICAgIGlmIChsY2stPmxrLm9sZF9wb2xscyA9PSBOVUxMKSB7CisgICAgICAgIGJvb2wgcmVjb25maWd1cmUgPSBmYWxzZTsKKyAgICAgICAgdm9sYXRpbGUgc3RydWN0IGttcF9iYXNlX2RyZHBhX2xvY2s6OmttcF9sb2NrX3BvbGwgKm9sZF9wb2xscyA9IHBvbGxzOworICAgICAgICBrbXBfdWludDMyIG51bV9wb2xscyA9IFRDUl80KGxjay0+bGsubnVtX3BvbGxzKTsKKworICAgICAgICBpZiAoVENSXzQoX19rbXBfbnRoKQorICAgICAgICAgID4gKF9fa21wX2F2YWlsX3Byb2MgPyBfX2ttcF9hdmFpbF9wcm9jIDogX19rbXBfeHByb2MpKSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gV2UgYXJlIGluIG92ZXJzdWJzY3JpcHRpb24gbW9kZS4gIENvbnRyYWN0IHRoZSBwb2xsaW5nIGFyZWEKKyAgICAgICAgICAgIC8vIGRvd24gdG8gYSBzaW5nbGUgbG9jYXRpb24sIGlmIHRoYXQgaGFzbid0IGJlZW4gZG9uZSBhbHJlYWR5LgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmIChudW1fcG9sbHMgPiAxKSB7CisgICAgICAgICAgICAgICAgcmVjb25maWd1cmUgPSB0cnVlOworICAgICAgICAgICAgICAgIG51bV9wb2xscyA9IFRDUl80KGxjay0+bGsubnVtX3BvbGxzKTsKKyAgICAgICAgICAgICAgICBtYXNrID0gMDsKKyAgICAgICAgICAgICAgICBudW1fcG9sbHMgPSAxOworICAgICAgICAgICAgICAgIHBvbGxzID0gKHZvbGF0aWxlIHN0cnVjdCBrbXBfYmFzZV9kcmRwYV9sb2NrOjprbXBfbG9ja19wb2xsICopCisgICAgICAgICAgICAgICAgICBfX2ttcF9hbGxvY2F0ZShudW1fcG9sbHMgKiBzaXplb2YoKnBvbGxzKSk7CisgICAgICAgICAgICAgICAgcG9sbHNbMF0ucG9sbCA9IHRpY2tldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBXZSBhcmUgaW4gdW5kZXIvZnVsbHkgc3Vic2NyaWJlZCBtb2RlLiAgQ2hlY2sgdGhlIG51bWJlciBvZgorICAgICAgICAgICAgLy8gdGhyZWFkcyB3YWl0aW5nIG9uIHRoZSBsb2NrLiAgVGhlIHNpemUgb2YgdGhlIHBvbGxpbmcgYXJlYQorICAgICAgICAgICAgLy8gc2hvdWxkIGJlIGF0IGxlYXN0IHRoZSBudW1iZXIgb2YgdGhyZWFkcyB3YWl0aW5nLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGttcF91aW50NjQgbnVtX3dhaXRpbmcgPSBUQ1JfOChsY2stPmxrLm5leHRfdGlja2V0KSAtIHRpY2tldCAtIDE7CisgICAgICAgICAgICBpZiAobnVtX3dhaXRpbmcgPiBudW1fcG9sbHMpIHsKKyAgICAgICAgICAgICAgICBrbXBfdWludDMyIG9sZF9udW1fcG9sbHMgPSBudW1fcG9sbHM7CisgICAgICAgICAgICAgICAgcmVjb25maWd1cmUgPSB0cnVlOworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgbWFzayA9IChtYXNrIDw8IDEpIHwgMTsKKyAgICAgICAgICAgICAgICAgICAgbnVtX3BvbGxzICo9IDI7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAobnVtX3BvbGxzIDw9IG51bV93YWl0aW5nKTsKKworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gQWxsb2NhdGUgdGhlIG5ldyBwb2xsaW5nIGFyZWEsIGFuZCBjb3B5IHRoZSByZWxldmFudCBwb3J0aW9uCisgICAgICAgICAgICAgICAgLy8gb2YgdGhlIG9sZCBwb2xsaW5nIGFyZWEgdG8gdGhlIG5ldyBhcmVhLiAgX19rbXBfYWxsb2NhdGUoKQorICAgICAgICAgICAgICAgIC8vIHplcm9lcyB0aGUgbWVtb3J5IGl0IGFsbG9jYXRlcywgYW5kIG1vc3Qgb2YgdGhlIG9sZCBhcmVhIGlzCisgICAgICAgICAgICAgICAgLy8ganVzdCB6ZXJvIHBhZGRpbmcsIHNvIHdlIG9ubHkgY29weSB0aGUgcmVsZWFzZSBjb3VudGVycy4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIHBvbGxzID0gKHZvbGF0aWxlIHN0cnVjdCBrbXBfYmFzZV9kcmRwYV9sb2NrOjprbXBfbG9ja19wb2xsICopCisgICAgICAgICAgICAgICAgICBfX2ttcF9hbGxvY2F0ZShudW1fcG9sbHMgKiBzaXplb2YoKnBvbGxzKSk7CisgICAgICAgICAgICAgICAga21wX3VpbnQzMiBpOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvbGRfbnVtX3BvbGxzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcG9sbHNbaV0ucG9sbCA9IG9sZF9wb2xsc1tpXS5wb2xsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZWNvbmZpZ3VyZSkgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIE5vdyB3cml0ZSB0aGUgdXBkYXRlZCBmaWVsZHMgYmFjayB0byB0aGUgbG9jayBzdHJ1Y3R1cmUuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gTWFrZSBjZXJ0YWluIHRoYXQgInBvbGxzIiBpcyB3cml0dGVuIGJlZm9yZSAibWFzayIgISEhCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gSWYgYW5vdGhlciB0aHJlYWQgcGlja3MgdXAgdGhlIG5ldyB2YWx1ZSBvZiBtYXNrIGFuZCB0aGUgb2xkCisgICAgICAgICAgICAvLyBwb2xscyBwb2ludGVyICwgaXQgY291bGQgYWNjZXNzIG1lbW9yeSBiZXlvbmQgdGhlIGVuZCBvZiB0aGUKKyAgICAgICAgICAgIC8vIG9sZCBwb2xsaW5nIGFyZWEuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gT24geDg2LCB3ZSBuZWVkIG1lbW9yeSBmZW5jZXMuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgS0FfVFJBQ0UoMTAwMCwgKCJfX2ttcF9hY3F1aXJlX2RyZHBhX2xvY2s6IHRpY2tldCAjJWxsZCByZWNvbmZpZ3VyaW5nIGxvY2sgJXAgdG8gJWQgcG9sbHNcbiIsCisgICAgICAgICAgICAgIHRpY2tldCwgbGNrLCBudW1fcG9sbHMpKTsKKworICAgICAgICAgICAgbGNrLT5say5vbGRfcG9sbHMgPSBvbGRfcG9sbHM7ICAgICAgICAgICAgICAvLyBub24tdm9sYXRpbGUgc3RvcmUKKyAgICAgICAgICAgIGxjay0+bGsucG9sbHMgPSBwb2xsczsgICAgICAgICAgICAgICAgICAgICAgLy8gdm9sYXRpbGUgc3RvcmUKKworICAgICAgICAgICAgS01QX01CKCk7CisKKyAgICAgICAgICAgIGxjay0+bGsubnVtX3BvbGxzID0gbnVtX3BvbGxzOyAgICAgICAgICAgICAgLy8gbm9uLXZvbGF0aWxlIHN0b3JlCisgICAgICAgICAgICBsY2stPmxrLm1hc2sgPSBtYXNrOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZvbGF0aWxlIHN0b3JlCisKKyAgICAgICAgICAgIEtNUF9NQigpOworCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gT25seSBhZnRlciB0aGUgbmV3IHBvbGxpbmcgYXJlYSBhbmQgbWFzayBoYXZlIGJlZW4gZmx1c2hlZAorICAgICAgICAgICAgLy8gdG8gbWFpbiBtZW1vcnkgY2FuIHdlIHVwZGF0ZSB0aGUgY2xlYW51cCB0aWNrZXQgZmllbGQuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gdm9sYXRpbGUgbG9hZCAvIG5vbi12b2xhdGlsZSBzdG9yZQorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGxjay0+bGsuY2xlYW51cF90aWNrZXQgPSBUQ1JfOChsY2stPmxrLm5leHRfdGlja2V0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gS01QX0xPQ0tfQUNRVUlSRURfRklSU1Q7Cit9CisKK2ludAorX19rbXBfYWNxdWlyZV9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICByZXR1cm4gX19rbXBfYWNxdWlyZV9kcmRwYV9sb2NrX3RpbWVkX3RlbXBsYXRlKCBsY2ssIGd0aWQgKTsKK30KKworc3RhdGljIGludAorX19rbXBfYWNxdWlyZV9kcmRwYV9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfc2V0X2xvY2siOworICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2lzX2RyZHBhX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoICggZ3RpZCA+PSAwICkgJiYgKCBfX2ttcF9nZXRfZHJkcGFfbG9ja19vd25lciggbGNrICkgPT0gZ3RpZCApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc0FscmVhZHlPd25lZCwgZnVuYyApOworICAgIH0KKworICAgIF9fa21wX2FjcXVpcmVfZHJkcGFfbG9jayggbGNrLCBndGlkICk7CisKKyAgICBsY2stPmxrLm93bmVyX2lkID0gZ3RpZCArIDE7CisgICAgcmV0dXJuIEtNUF9MT0NLX0FDUVVJUkVEX0ZJUlNUOworfQorCitpbnQKK19fa21wX3Rlc3RfZHJkcGFfbG9jaygga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgLy8KKyAgICAvLyBGaXJzdCBnZXQgYSB0aWNrZXQsIHRoZW4gcmVhZCB0aGUgcG9sbHMgcG9pbnRlciBhbmQgdGhlIG1hc2suCisgICAgLy8gVGhlIHBvbGxzIHBvaW50ZXIgbXVzdCBiZSByZWFkIGJlZm9yZSB0aGUgbWFzayEhISAoU2VlIGFib3ZlKQorICAgIC8vCisgICAga21wX3VpbnQ2NCB0aWNrZXQgPSBUQ1JfOChsY2stPmxrLm5leHRfdGlja2V0KTsgICAgIC8vIHZvbGF0aWxlIGxvYWQKKyAgICB2b2xhdGlsZSBzdHJ1Y3Qga21wX2Jhc2VfZHJkcGFfbG9jazo6a21wX2xvY2tfcG9sbCAqcG9sbHMKKyAgICAgID0gKHZvbGF0aWxlIHN0cnVjdCBrbXBfYmFzZV9kcmRwYV9sb2NrOjprbXBfbG9ja19wb2xsICopCisgICAgICBUQ1JfUFRSKGxjay0+bGsucG9sbHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZvbGF0aWxlIGxvYWQKKyAgICBrbXBfdWludDY0IG1hc2sgPSBUQ1JfOChsY2stPmxrLm1hc2spOyAgICAgICAgICAgICAgLy8gdm9sYXRpbGUgbG9hZAorICAgIGlmIChUQ1JfOChwb2xsc1t0aWNrZXQgJiBtYXNrXS5wb2xsKSA9PSB0aWNrZXQpIHsKKyAgICAgICAga21wX3VpbnQ2NCBuZXh0X3RpY2tldCA9IHRpY2tldCArIDE7CisgICAgICAgIGlmIChLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRNjQoKGttcF9pbnQ2NCAqKSZsY2stPmxrLm5leHRfdGlja2V0LAorICAgICAgICAgIHRpY2tldCwgbmV4dF90aWNrZXQpKSB7CisgICAgICAgICAgICBLTVBfRlNZTkNfQUNRVUlSRUQobGNrKTsKKyAgICAgICAgICAgIEtBX1RSQUNFKDEwMDAsICgiX19rbXBfdGVzdF9kcmRwYV9sb2NrOiB0aWNrZXQgIyVsbGQgYWNxdWlyZWQgbG9jayAlcFxuIiwKKyAgICAgICAgICAgICAgIHRpY2tldCwgbGNrKSk7CisgICAgICAgICAgICBsY2stPmxrLm5vd19zZXJ2aW5nID0gdGlja2V0OyAgICAgICAgICAgICAgIC8vIG5vbi12b2xhdGlsZSBzdG9yZQorCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gU2luY2Ugbm8gdGhyZWFkcyBhcmUgd2FpdGluZywgdGhlcmUgaXMgbm8gcG9zc2liaWxpdHkgdGhhdAorICAgICAgICAgICAgLy8gd2Ugd291bGQgd2FudCB0byByZWNvbmZpZ3VyZSB0aGUgcG9sbGluZyBhcmVhLiAgV2UgbWlnaHQKKyAgICAgICAgICAgIC8vIGhhdmUgdGhlIGNsZWFudXAgdGlja2V0IHZhbHVlICh3aGljaCBzYXlzIHRoYXQgaXQgaXMgbm93CisgICAgICAgICAgICAvLyBzYWZlIHRvIGRlYWxsb2NhdGUgb2xkX3BvbGxzKSwgYnV0IHdlJ2xsIGxldCBhIGxhdGVyIHRocmVhZAorICAgICAgICAgICAgLy8gd2hpY2ggY2FsbHMgX19rbXBfYWNxdWlyZV9sb2NrIGRvIHRoYXQgLSB0aGlzIHJvdXRpbmUKKyAgICAgICAgICAgIC8vIGlzbid0IHN1cHBvc2VkIHRvIGJsb2NrLCBhbmQgd2Ugd291bGQgcmlzayBibG9ja3MgaWYgd2UKKyAgICAgICAgICAgIC8vIGNhbGxlZCBfX2ttcF9mcmVlKCkgdG8gZG8gdGhlIGRlYWxsb2NhdGlvbi4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3Rlc3RfZHJkcGFfbG9ja193aXRoX2NoZWNrcygga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Rlc3RfbG9jayI7CisgICAgaWYgKCBsY2stPmxrLmluaXRpYWxpemVkICE9IGxjayApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfaXNfZHJkcGFfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jICk7CisgICAgfQorCisgICAgaW50IHJldHZhbCA9IF9fa21wX3Rlc3RfZHJkcGFfbG9jayggbGNrLCBndGlkICk7CisKKyAgICBpZiAoIHJldHZhbCApIHsKKyAgICAgICAgbGNrLT5say5vd25lcl9pZCA9IGd0aWQgKyAxOworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorCitpbnQKK19fa21wX3JlbGVhc2VfZHJkcGFfbG9jaygga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgLy8KKyAgICAvLyBSZWFkIHRoZSB0aWNrZXQgdmFsdWUgZnJvbSB0aGUgbG9jayBkYXRhIHN0cnVjdCwgdGhlbiB0aGUgcG9sbHMKKyAgICAvLyBwb2ludGVyIGFuZCB0aGUgbWFzay4gIFRoZSBwb2xscyBwb2ludGVyIG11c3QgYmUgcmVhZCBiZWZvcmUgdGhlCisgICAgLy8gbWFzayEhISAoU2VlIGFib3ZlKQorICAgIC8vCisgICAga21wX3VpbnQ2NCB0aWNrZXQgPSBsY2stPmxrLm5vd19zZXJ2aW5nICsgMTsgICAgICAgIC8vIG5vbi12b2xhdGlsZSBsb2FkCisgICAgdm9sYXRpbGUgc3RydWN0IGttcF9iYXNlX2RyZHBhX2xvY2s6OmttcF9sb2NrX3BvbGwgKnBvbGxzCisgICAgICA9ICh2b2xhdGlsZSBzdHJ1Y3Qga21wX2Jhc2VfZHJkcGFfbG9jazo6a21wX2xvY2tfcG9sbCAqKQorICAgICAgVENSX1BUUihsY2stPmxrLnBvbGxzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2b2xhdGlsZSBsb2FkCisgICAga21wX3VpbnQ2NCBtYXNrID0gVENSXzgobGNrLT5say5tYXNrKTsgICAgICAgICAgICAgIC8vIHZvbGF0aWxlIGxvYWQKKyAgICBLQV9UUkFDRSgxMDAwLCAoIl9fa21wX3JlbGVhc2VfZHJkcGFfbG9jazogdGlja2V0ICMlbGxkIHJlbGVhc2VkIGxvY2sgJXBcbiIsCisgICAgICAgdGlja2V0IC0gMSwgbGNrKSk7CisgICAgS01QX0ZTWU5DX1JFTEVBU0lORyhsY2spOworICAgIEtNUF9TVF9SRUw2NCgmKHBvbGxzW3RpY2tldCAmIG1hc2tdLnBvbGwpLCB0aWNrZXQpOyAvLyB2b2xhdGlsZSBzdG9yZQorICAgIHJldHVybiBLTVBfTE9DS19SRUxFQVNFRDsKK30KKworc3RhdGljIGludAorX19rbXBfcmVsZWFzZV9kcmRwYV9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdW5zZXRfbG9jayI7CisgICAgS01QX01CKCk7ICAvKiBpbiBjYXNlIGFub3RoZXIgcHJvY2Vzc29yIGluaXRpYWxpemVkIGxvY2sgKi8KKyAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9pc19kcmRwYV9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9nZXRfZHJkcGFfbG9ja19vd25lciggbGNrICkgPT0gLTEgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ0ZyZWUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCAoIGd0aWQgPj0gMCApICYmICggX19rbXBfZ2V0X2RyZHBhX2xvY2tfb3duZXIoIGxjayApID49IDAgKQorICAgICAgJiYgKCBfX2ttcF9nZXRfZHJkcGFfbG9ja19vd25lciggbGNrICkgIT0gZ3RpZCApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tVbnNldHRpbmdTZXRCeUFub3RoZXIsIGZ1bmMgKTsKKyAgICB9CisgICAgbGNrLT5say5vd25lcl9pZCA9IDA7CisgICAgcmV0dXJuIF9fa21wX3JlbGVhc2VfZHJkcGFfbG9jayggbGNrLCBndGlkICk7Cit9CisKK3ZvaWQKK19fa21wX2luaXRfZHJkcGFfbG9jaygga21wX2RyZHBhX2xvY2tfdCAqbGNrICkKK3sKKyAgICBsY2stPmxrLmxvY2F0aW9uID0gTlVMTDsKKyAgICBsY2stPmxrLm1hc2sgPSAwOworICAgIGxjay0+bGsubnVtX3BvbGxzID0gMTsKKyAgICBsY2stPmxrLnBvbGxzID0gKHZvbGF0aWxlIHN0cnVjdCBrbXBfYmFzZV9kcmRwYV9sb2NrOjprbXBfbG9ja19wb2xsICopCisgICAgICBfX2ttcF9hbGxvY2F0ZShsY2stPmxrLm51bV9wb2xscyAqIHNpemVvZigqKGxjay0+bGsucG9sbHMpKSk7CisgICAgbGNrLT5say5jbGVhbnVwX3RpY2tldCA9IDA7CisgICAgbGNrLT5say5vbGRfcG9sbHMgPSBOVUxMOworICAgIGxjay0+bGsubmV4dF90aWNrZXQgPSAwOworICAgIGxjay0+bGsubm93X3NlcnZpbmcgPSAwOworICAgIGxjay0+bGsub3duZXJfaWQgPSAwOyAgICAgIC8vIG5vIHRocmVhZCBvd25zIHRoZSBsb2NrLgorICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gLTE7IC8vID49IDAgZm9yIG5lc3RhYmxlIGxvY2tzLCAtMSBmb3Igc2ltcGxlIGxvY2tzLgorICAgIGxjay0+bGsuaW5pdGlhbGl6ZWQgPSBsY2s7CisKKyAgICBLQV9UUkFDRSgxMDAwLCAoIl9fa21wX2luaXRfZHJkcGFfbG9jazogbG9jayAlcCBpbml0aWFsaXplZFxuIiwgbGNrKSk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9pbml0X2RyZHBhX2xvY2tfd2l0aF9jaGVja3MoIGttcF9kcmRwYV9sb2NrX3QgKiBsY2sgKQoreworICAgIF9fa21wX2luaXRfZHJkcGFfbG9jayggbGNrICk7Cit9CisKK3ZvaWQKK19fa21wX2Rlc3Ryb3lfZHJkcGFfbG9jaygga21wX2RyZHBhX2xvY2tfdCAqbGNrICkKK3sKKyAgICBsY2stPmxrLmluaXRpYWxpemVkID0gTlVMTDsKKyAgICBsY2stPmxrLmxvY2F0aW9uICAgID0gTlVMTDsKKyAgICBpZiAobGNrLT5say5wb2xscyAhPSBOVUxMKSB7CisgICAgICAgIF9fa21wX2ZyZWUoKHZvaWQgKilsY2stPmxrLnBvbGxzKTsKKyAgICAgICAgbGNrLT5say5wb2xscyA9IE5VTEw7CisgICAgfQorICAgIGlmIChsY2stPmxrLm9sZF9wb2xscyAhPSBOVUxMKSB7CisgICAgICAgIF9fa21wX2ZyZWUoKHZvaWQgKilsY2stPmxrLm9sZF9wb2xscyk7CisgICAgICAgIGxjay0+bGsub2xkX3BvbGxzID0gTlVMTDsKKyAgICB9CisgICAgbGNrLT5say5tYXNrID0gMDsKKyAgICBsY2stPmxrLm51bV9wb2xscyA9IDA7CisgICAgbGNrLT5say5jbGVhbnVwX3RpY2tldCA9IDA7CisgICAgbGNrLT5say5uZXh0X3RpY2tldCA9IDA7CisgICAgbGNrLT5say5ub3dfc2VydmluZyA9IDA7CisgICAgbGNrLT5say5vd25lcl9pZCA9IDA7CisgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAtMTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2Rlc3Ryb3lfZHJkcGFfbG9ja193aXRoX2NoZWNrcygga21wX2RyZHBhX2xvY2tfdCAqbGNrICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfZGVzdHJveV9sb2NrIjsKKyAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9pc19kcmRwYV9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9nZXRfZHJkcGFfbG9ja19vd25lciggbGNrICkgIT0gLTEgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1N0aWxsT3duZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgX19rbXBfZGVzdHJveV9kcmRwYV9sb2NrKCBsY2sgKTsKK30KKworCisvLworLy8gbmVzdGVkIGRyZHBhIHRpY2tldCBsb2NrcworLy8KKworaW50CitfX2ttcF9hY3F1aXJlX25lc3RlZF9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49IDAgKTsKKworICAgIGlmICggX19rbXBfZ2V0X2RyZHBhX2xvY2tfb3duZXIoIGxjayApID09IGd0aWQgKSB7CisgICAgICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkICs9IDE7CisgICAgICAgIHJldHVybiBLTVBfTE9DS19BQ1FVSVJFRF9ORVhUOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9kcmRwYV9sb2NrX3RpbWVkX3RlbXBsYXRlKCBsY2ssIGd0aWQgKTsKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMTsKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIGxjay0+bGsub3duZXJfaWQgPSBndGlkICsgMTsKKyAgICAgICAgcmV0dXJuIEtNUF9MT0NLX0FDUVVJUkVEX0ZJUlNUOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK19fa21wX2FjcXVpcmVfbmVzdGVkX2RyZHBhX2xvY2tfd2l0aF9jaGVja3MoIGttcF9kcmRwYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9zZXRfbmVzdF9sb2NrIjsKKyAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCAhIF9fa21wX2lzX2RyZHBhX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOworICAgIH0KKyAgICBfX2ttcF9hY3F1aXJlX25lc3RlZF9kcmRwYV9sb2NrKCBsY2ssIGd0aWQgKTsKK30KKworaW50CitfX2ttcF90ZXN0X25lc3RlZF9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpbnQgcmV0dmFsOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PSAwICk7CisKKyAgICBpZiAoIF9fa21wX2dldF9kcmRwYV9sb2NrX293bmVyKCBsY2sgKSA9PSBndGlkICkgeworICAgICAgICByZXR2YWwgPSArK2xjay0+bGsuZGVwdGhfbG9ja2VkOworICAgIH0KKyAgICBlbHNlIGlmICggIV9fa21wX3Rlc3RfZHJkcGFfbG9jayggbGNrLCBndGlkICkgKSB7CisgICAgICAgIHJldHZhbCA9IDA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgcmV0dmFsID0gbGNrLT5say5kZXB0aF9sb2NrZWQgPSAxOworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgbGNrLT5say5vd25lcl9pZCA9IGd0aWQgKyAxOworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50CitfX2ttcF90ZXN0X25lc3RlZF9kcmRwYV9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdGVzdF9uZXN0X2xvY2siOworICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKyAgICBpZiAoICEgX19rbXBfaXNfZHJkcGFfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgfQorICAgIHJldHVybiBfX2ttcF90ZXN0X25lc3RlZF9kcmRwYV9sb2NrKCBsY2ssIGd0aWQgKTsKK30KKworaW50CitfX2ttcF9yZWxlYXNlX25lc3RlZF9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49IDAgKTsKKworICAgIEtNUF9NQigpOworICAgIGlmICggLS0obGNrLT5say5kZXB0aF9sb2NrZWQpID09IDAgKSB7CisgICAgICAgIEtNUF9NQigpOworICAgICAgICBsY2stPmxrLm93bmVyX2lkID0gMDsKKyAgICAgICAgX19rbXBfcmVsZWFzZV9kcmRwYV9sb2NrKCBsY2ssIGd0aWQgKTsKKyAgICAgICAgcmV0dXJuIEtNUF9MT0NLX1JFTEVBU0VEOworICAgIH0KKyAgICByZXR1cm4gS01QX0xPQ0tfU1RJTExfSEVMRDsKK30KKworc3RhdGljIGludAorX19rbXBfcmVsZWFzZV9uZXN0ZWRfZHJkcGFfbG9ja193aXRoX2NoZWNrcygga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Vuc2V0X25lc3RfbG9jayI7CisgICAgS01QX01CKCk7ICAvKiBpbiBjYXNlIGFub3RoZXIgcHJvY2Vzc29yIGluaXRpYWxpemVkIGxvY2sgKi8KKyAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCAhIF9fa21wX2lzX2RyZHBhX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2dldF9kcmRwYV9sb2NrX293bmVyKCBsY2sgKSA9PSAtMSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nRnJlZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2dldF9kcmRwYV9sb2NrX293bmVyKCBsY2sgKSAhPSBndGlkICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tVbnNldHRpbmdTZXRCeUFub3RoZXIsIGZ1bmMgKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX3JlbGVhc2VfbmVzdGVkX2RyZHBhX2xvY2soIGxjaywgZ3RpZCApOworfQorCit2b2lkCitfX2ttcF9pbml0X25lc3RlZF9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICogbGNrICkKK3sKKyAgICBfX2ttcF9pbml0X2RyZHBhX2xvY2soIGxjayApOworICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMDsgLy8gPj0gMCBmb3IgbmVzdGFibGUgbG9ja3MsIC0xIGZvciBzaW1wbGUgbG9ja3MKK30KKworc3RhdGljIHZvaWQKK19fa21wX2luaXRfbmVzdGVkX2RyZHBhX2xvY2tfd2l0aF9jaGVja3MoIGttcF9kcmRwYV9sb2NrX3QgKiBsY2sgKQoreworICAgIF9fa21wX2luaXRfbmVzdGVkX2RyZHBhX2xvY2soIGxjayApOworfQorCit2b2lkCitfX2ttcF9kZXN0cm95X25lc3RlZF9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2sgKQoreworICAgIF9fa21wX2Rlc3Ryb3lfZHJkcGFfbG9jayggbGNrICk7CisgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAwOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZGVzdHJveV9uZXN0ZWRfZHJkcGFfbG9ja193aXRoX2NoZWNrcygga21wX2RyZHBhX2xvY2tfdCAqbGNrICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfZGVzdHJveV9uZXN0X2xvY2siOworICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKyAgICBpZiAoICEgX19rbXBfaXNfZHJkcGFfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X2RyZHBhX2xvY2tfb3duZXIoIGxjayApICE9IC0xICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTdGlsbE93bmVkLCBmdW5jICk7CisgICAgfQorICAgIF9fa21wX2Rlc3Ryb3lfbmVzdGVkX2RyZHBhX2xvY2soIGxjayApOworfQorCisKKy8vCisvLyBhY2Nlc3MgZnVuY3Rpb25zIHRvIGZpZWxkcyB3aGljaCBkb24ndCBleGlzdCBmb3IgYWxsIGxvY2sga2luZHMuCisvLworCitzdGF0aWMgaW50CitfX2ttcF9pc19kcmRwYV9sb2NrX2luaXRpYWxpemVkKCBrbXBfZHJkcGFfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiBsY2sgPT0gbGNrLT5say5pbml0aWFsaXplZDsKK30KKworc3RhdGljIGNvbnN0IGlkZW50X3QgKgorX19rbXBfZ2V0X2RyZHBhX2xvY2tfbG9jYXRpb24oIGttcF9kcmRwYV9sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIGxjay0+bGsubG9jYXRpb247Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zZXRfZHJkcGFfbG9ja19sb2NhdGlvbigga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBjb25zdCBpZGVudF90ICpsb2MgKQoreworICAgIGxjay0+bGsubG9jYXRpb24gPSBsb2M7Cit9CisKK3N0YXRpYyBrbXBfbG9ja19mbGFnc190CitfX2ttcF9nZXRfZHJkcGFfbG9ja19mbGFncygga21wX2RyZHBhX2xvY2tfdCAqbGNrICkKK3sKKyAgICByZXR1cm4gbGNrLT5say5mbGFnczsKK30KKworc3RhdGljIHZvaWQKK19fa21wX3NldF9kcmRwYV9sb2NrX2ZsYWdzKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9sb2NrX2ZsYWdzX3QgZmxhZ3MgKQoreworICAgIGxjay0+bGsuZmxhZ3MgPSBmbGFnczsKK30KKworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKy8vIERpcmVjdCBsb2NrIGluaXRpYWxpemVycy4gSXQgc2ltcGx5IHdyaXRlcyBhIHRhZyB0byB0aGUgbG93IDggYml0cyBvZiB0aGUgbG9jayB3b3JkLgorc3RhdGljIHZvaWQgX19rbXBfaW5pdF9kaXJlY3RfbG9jayhrbXBfZHluYV9sb2NrX3QgKmxjaywga21wX2R5bmFfbG9ja3NlcV90IHNlcSkKK3sKKyAgICBUQ1dfNCgqbGNrLCBLTVBfR0VUX0RfVEFHKHNlcSkpOworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2luaXRfZGlyZWN0X2xvY2s6IGluaXRpYWxpemVkIGRpcmVjdCBsb2NrIHdpdGggdHlwZSMlZFxuIiwgc2VxKSk7Cit9CisKKyNpZiBLTVBfVVNFX1RTWAorCisvLyBITEUgbG9jayBmdW5jdGlvbnMgLSBpbXBvcnRlZCBmcm9tIHRoZSB0ZXN0YmVkIHJ1bnRpbWUuCisjZGVmaW5lIEhMRV9BQ1FVSVJFICIuYnl0ZSAweGYyOyIKKyNkZWZpbmUgSExFX1JFTEVBU0UgIi5ieXRlIDB4ZjM7IgorCitzdGF0aWMgaW5saW5lIGttcF91aW50MzIKK3N3YXA0KGttcF91aW50MzIgdm9sYXRpbGUgKnAsIGttcF91aW50MzIgdikKK3sKKyAgICBfX2FzbV9fIHZvbGF0aWxlKEhMRV9BQ1FVSVJFICJ4Y2hnICUxLCUwIgorICAgICAgICAgICAgICAgICAgICA6ICIrciIodiksICIrbSIoKnApCisgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgICAgICAgICAgOiAibWVtb3J5Iik7CisgICAgcmV0dXJuIHY7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9kZXN0cm95X2hsZV9sb2NrKGttcF9keW5hX2xvY2tfdCAqbGNrKQoreworICAgIFRDV180KCpsY2ssIDApOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfYWNxdWlyZV9obGVfbG9jayhrbXBfZHluYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQpCit7CisgICAgLy8gVXNlIGd0aWQgZm9yIEtNUF9MT0NLX0JVU1kgaWYgbmVjZXNzYXJ5CisgICAgaWYgKHN3YXA0KGxjaywgS01QX0xPQ0tfQlVTWSgxLCBobGUpKSAhPSBLTVBfTE9DS19GUkVFKGhsZSkpIHsKKyAgICAgICAgaW50IGRlbGF5ID0gMTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgd2hpbGUgKCooa21wX3VpbnQzMiB2b2xhdGlsZSAqKWxjayAhPSBLTVBfTE9DS19GUkVFKGhsZSkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gZGVsYXk7IGkgIT0gMDsgLS1pKQorICAgICAgICAgICAgICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgICAgICAgICAgZGVsYXkgPSAoKGRlbGF5IDw8IDEpIHwgMSkgJiA3OworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlIChzd2FwNChsY2ssIEtNUF9MT0NLX0JVU1koMSwgaGxlKSkgIT0gS01QX0xPQ0tfRlJFRShobGUpKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9hY3F1aXJlX2hsZV9sb2NrX3dpdGhfY2hlY2tzKGttcF9keW5hX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCkKK3sKKyAgICBfX2ttcF9hY3F1aXJlX2hsZV9sb2NrKGxjaywgZ3RpZCk7IC8vIFRPRE86IGFkZCBjaGVja3MKK30KKworc3RhdGljIGludAorX19rbXBfcmVsZWFzZV9obGVfbG9jayhrbXBfZHluYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQpCit7CisgICAgX19hc21fXyB2b2xhdGlsZShITEVfUkVMRUFTRSAibW92bCAlMSwlMCIKKyAgICAgICAgICAgICAgICAgICAgOiAiPW0iKCpsY2spCisgICAgICAgICAgICAgICAgICAgIDogInIiKEtNUF9MT0NLX0ZSRUUoaGxlKSkKKyAgICAgICAgICAgICAgICAgICAgOiAibWVtb3J5Iik7CisgICAgcmV0dXJuIEtNUF9MT0NLX1JFTEVBU0VEOworfQorCitzdGF0aWMgaW50CitfX2ttcF9yZWxlYXNlX2hsZV9sb2NrX3dpdGhfY2hlY2tzKGttcF9keW5hX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCkKK3sKKyAgICByZXR1cm4gX19rbXBfcmVsZWFzZV9obGVfbG9jayhsY2ssIGd0aWQpOyAvLyBUT0RPOiBhZGQgY2hlY2tzCit9CisKK3N0YXRpYyBpbnQKK19fa21wX3Rlc3RfaGxlX2xvY2soa21wX2R5bmFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkKQoreworICAgIHJldHVybiBzd2FwNChsY2ssIEtNUF9MT0NLX0JVU1koMSwgaGxlKSkgPT0gS01QX0xPQ0tfRlJFRShobGUpOworfQorCitzdGF0aWMgaW50CitfX2ttcF90ZXN0X2hsZV9sb2NrX3dpdGhfY2hlY2tzKGttcF9keW5hX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCkKK3sKKyAgICByZXR1cm4gX19rbXBfdGVzdF9obGVfbG9jayhsY2ssIGd0aWQpOyAvLyBUT0RPOiBhZGQgY2hlY2tzCit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9pbml0X3J0bV9sb2NrKGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrKQoreworICAgIF9fa21wX2luaXRfcXVldWluZ19sb2NrKGxjayk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9kZXN0cm95X3J0bV9sb2NrKGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrKQoreworICAgIF9fa21wX2Rlc3Ryb3lfcXVldWluZ19sb2NrKGxjayk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9hY3F1aXJlX3J0bV9sb2NrKGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCkKK3sKKyAgICB1bnNpZ25lZCByZXRyaWVzPTMsIHN0YXR1czsKKyAgICBkbyB7CisgICAgICAgIHN0YXR1cyA9IF94YmVnaW4oKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBfWEJFR0lOX1NUQVJURUQpIHsKKyAgICAgICAgICAgIGlmIChfX2ttcF9pc191bmxvY2tlZF9xdWV1aW5nX2xvY2sobGNrKSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBfeGFib3J0KDB4ZmYpOworICAgICAgICB9CisgICAgICAgIGlmICgoc3RhdHVzICYgX1hBQk9SVF9FWFBMSUNJVCkgJiYgX1hBQk9SVF9DT0RFKHN0YXR1cykgPT0gMHhmZikgeworICAgICAgICAgICAgLy8gV2FpdCB1bnRpbCBsb2NrIGJlY29tZXMgZnJlZQorICAgICAgICAgICAgd2hpbGUgKCEgX19rbXBfaXNfdW5sb2NrZWRfcXVldWluZ19sb2NrKGxjaykpCisgICAgICAgICAgICAgICAgX19rbXBfeWllbGQoVFJVRSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIShzdGF0dXMgJiBfWEFCT1JUX1JFVFJZKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0gd2hpbGUgKHJldHJpZXMtLSk7CisKKyAgICAvLyBGYWxsLWJhY2sgbm9uLXNwZWN1bGF0aXZlIGxvY2sgKHhjaGcpCisgICAgX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2sobGNrLCBndGlkKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2FjcXVpcmVfcnRtX2xvY2tfd2l0aF9jaGVja3Moa21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkKQoreworICAgIF9fa21wX2FjcXVpcmVfcnRtX2xvY2sobGNrLCBndGlkKTsKK30KKworc3RhdGljIGludAorX19rbXBfcmVsZWFzZV9ydG1fbG9jayhrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQpCit7CisgICAgaWYgKF9fa21wX2lzX3VubG9ja2VkX3F1ZXVpbmdfbG9jayhsY2spKSB7CisgICAgICAgIC8vIFJlbGVhc2luZyBmcm9tIHNwZWN1bGF0aW9uCisgICAgICAgIF94ZW5kKCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvLyBSZWxlYXNpbmcgZnJvbSBhIHJlYWwgbG9jaworICAgICAgICBfX2ttcF9yZWxlYXNlX3F1ZXVpbmdfbG9jayhsY2ssIGd0aWQpOworICAgIH0KKyAgICByZXR1cm4gS01QX0xPQ0tfUkVMRUFTRUQ7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3JlbGVhc2VfcnRtX2xvY2tfd2l0aF9jaGVja3Moa21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkKQoreworICAgIHJldHVybiBfX2ttcF9yZWxlYXNlX3J0bV9sb2NrKGxjaywgZ3RpZCk7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3Rlc3RfcnRtX2xvY2soa21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkKQoreworICAgIHVuc2lnbmVkIHJldHJpZXM9Mywgc3RhdHVzOworICAgIGRvIHsKKyAgICAgICAgc3RhdHVzID0gX3hiZWdpbigpOworICAgICAgICBpZiAoc3RhdHVzID09IF9YQkVHSU5fU1RBUlRFRCAmJiBfX2ttcF9pc191bmxvY2tlZF9xdWV1aW5nX2xvY2sobGNrKSkgeworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEoc3RhdHVzICYgX1hBQk9SVF9SRVRSWSkpCisgICAgICAgICAgICBicmVhazsKKyAgICB9IHdoaWxlIChyZXRyaWVzLS0pOworCisgICAgcmV0dXJuIChfX2ttcF9pc191bmxvY2tlZF9xdWV1aW5nX2xvY2sobGNrKSk/IDE6IDA7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3Rlc3RfcnRtX2xvY2tfd2l0aF9jaGVja3Moa21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkKQoreworICAgIHJldHVybiBfX2ttcF90ZXN0X3J0bV9sb2NrKGxjaywgZ3RpZCk7Cit9CisKKyNlbmRpZiAvLyBLTVBfVVNFX1RTWAorCisvLyBFbnRyeSBmdW5jdGlvbnMgZm9yIGluZGlyZWN0IGxvY2tzIChmaXJzdCBlbGVtZW50IG9mIGRpcmVjdCBsb2NrIGp1bXAgdGFibGVzKS4KK3N0YXRpYyB2b2lkIF9fa21wX2luaXRfaW5kaXJlY3RfbG9jayhrbXBfZHluYV9sb2NrX3QgKiBsLCBrbXBfZHluYV9sb2Nrc2VxX3QgdGFnKTsKK3N0YXRpYyB2b2lkIF9fa21wX2Rlc3Ryb3lfaW5kaXJlY3RfbG9jayhrbXBfZHluYV9sb2NrX3QgKiBsb2NrKTsKK3N0YXRpYyB2b2lkIF9fa21wX3NldF9pbmRpcmVjdF9sb2NrKGttcF9keW5hX2xvY2tfdCAqIGxvY2ssIGttcF9pbnQzMik7CitzdGF0aWMgaW50ICBfX2ttcF91bnNldF9pbmRpcmVjdF9sb2NrKGttcF9keW5hX2xvY2tfdCAqIGxvY2ssIGttcF9pbnQzMik7CitzdGF0aWMgaW50ICBfX2ttcF90ZXN0X2luZGlyZWN0X2xvY2soa21wX2R5bmFfbG9ja190ICogbG9jaywga21wX2ludDMyKTsKK3N0YXRpYyB2b2lkIF9fa21wX3NldF9pbmRpcmVjdF9sb2NrX3dpdGhfY2hlY2tzKGttcF9keW5hX2xvY2tfdCAqIGxvY2ssIGttcF9pbnQzMik7CitzdGF0aWMgaW50ICBfX2ttcF91bnNldF9pbmRpcmVjdF9sb2NrX3dpdGhfY2hlY2tzKGttcF9keW5hX2xvY2tfdCAqIGxvY2ssIGttcF9pbnQzMik7CitzdGF0aWMgaW50ICBfX2ttcF90ZXN0X2luZGlyZWN0X2xvY2tfd2l0aF9jaGVja3Moa21wX2R5bmFfbG9ja190ICogbG9jaywga21wX2ludDMyKTsKKworLy8KKy8vIEp1bXAgdGFibGVzIGZvciB0aGUgaW5kaXJlY3QgbG9jayBmdW5jdGlvbnMuCisvLyBPbmx5IGZpbGwgaW4gdGhlIG9kZCBlbnRyaWVzLCB0aGF0IGF2b2lkcyB0aGUgbmVlZCB0byBzaGlmdCBvdXQgdGhlIGxvdyBiaXQuCisvLworCisvLyBpbml0IGZ1bmN0aW9ucworI2RlZmluZSBleHBhbmQobCwgb3ApIDAsX19rbXBfaW5pdF9kaXJlY3RfbG9jaywKK3ZvaWQgKCpfX2ttcF9kaXJlY3RfaW5pdFtdKShrbXBfZHluYV9sb2NrX3QgKiwga21wX2R5bmFfbG9ja3NlcV90KQorICAgID0geyBfX2ttcF9pbml0X2luZGlyZWN0X2xvY2ssIDAsIEtNUF9GT1JFQUNIX0RfTE9DSyhleHBhbmQsIGluaXQpIH07CisjdW5kZWYgZXhwYW5kCisKKy8vIGRlc3Ryb3kgZnVuY3Rpb25zCisjZGVmaW5lIGV4cGFuZChsLCBvcCkgMCwodm9pZCAoKikoa21wX2R5bmFfbG9ja190ICopKV9fa21wXyMjb3AjI18jI2wjI19sb2NrLAordm9pZCAoKl9fa21wX2RpcmVjdF9kZXN0cm95W10pKGttcF9keW5hX2xvY2tfdCAqKQorICAgID0geyBfX2ttcF9kZXN0cm95X2luZGlyZWN0X2xvY2ssIDAsIEtNUF9GT1JFQUNIX0RfTE9DSyhleHBhbmQsIGRlc3Ryb3kpIH07CisjdW5kZWYgZXhwYW5kCisKKy8vIHNldC9hY3F1aXJlIGZ1bmN0aW9ucworI2RlZmluZSBleHBhbmQobCwgb3ApIDAsKHZvaWQgKCopKGttcF9keW5hX2xvY2tfdCAqLCBrbXBfaW50MzIpKV9fa21wXyMjb3AjI18jI2wjI19sb2NrLAorc3RhdGljIHZvaWQgKCpkaXJlY3Rfc2V0W10pKGttcF9keW5hX2xvY2tfdCAqLCBrbXBfaW50MzIpCisgICAgPSB7IF9fa21wX3NldF9pbmRpcmVjdF9sb2NrLCAwLCBLTVBfRk9SRUFDSF9EX0xPQ0soZXhwYW5kLCBhY3F1aXJlKSB9OworI3VuZGVmIGV4cGFuZAorI2RlZmluZSBleHBhbmQobCwgb3ApIDAsKHZvaWQgKCopKGttcF9keW5hX2xvY2tfdCAqLCBrbXBfaW50MzIpKV9fa21wXyMjb3AjI18jI2wjI19sb2NrX3dpdGhfY2hlY2tzLAorc3RhdGljIHZvaWQgKCpkaXJlY3Rfc2V0X2NoZWNrW10pKGttcF9keW5hX2xvY2tfdCAqLCBrbXBfaW50MzIpCisgICAgPSB7IF9fa21wX3NldF9pbmRpcmVjdF9sb2NrX3dpdGhfY2hlY2tzLCAwLCBLTVBfRk9SRUFDSF9EX0xPQ0soZXhwYW5kLCBhY3F1aXJlKSB9OworI3VuZGVmIGV4cGFuZAorCisvLyB1bnNldC9yZWxlYXNlIGFuZCB0ZXN0IGZ1bmN0aW9ucworI2RlZmluZSBleHBhbmQobCwgb3ApIDAsKGludCAgKCopKGttcF9keW5hX2xvY2tfdCAqLCBrbXBfaW50MzIpKV9fa21wXyMjb3AjI18jI2wjI19sb2NrLAorc3RhdGljIGludCAoKmRpcmVjdF91bnNldFtdKShrbXBfZHluYV9sb2NrX3QgKiwga21wX2ludDMyKQorICAgID0geyBfX2ttcF91bnNldF9pbmRpcmVjdF9sb2NrLCAwLCBLTVBfRk9SRUFDSF9EX0xPQ0soZXhwYW5kLCByZWxlYXNlKSB9Oworc3RhdGljIGludCAgKCpkaXJlY3RfdGVzdFtdKShrbXBfZHluYV9sb2NrX3QgKiwga21wX2ludDMyKQorICAgID0geyBfX2ttcF90ZXN0X2luZGlyZWN0X2xvY2ssIDAsIEtNUF9GT1JFQUNIX0RfTE9DSyhleHBhbmQsIHRlc3QpIH07CisjdW5kZWYgZXhwYW5kCisjZGVmaW5lIGV4cGFuZChsLCBvcCkgMCwoaW50ICAoKikoa21wX2R5bmFfbG9ja190ICosIGttcF9pbnQzMikpX19rbXBfIyNvcCMjXyMjbCMjX2xvY2tfd2l0aF9jaGVja3MsCitzdGF0aWMgaW50ICgqZGlyZWN0X3Vuc2V0X2NoZWNrW10pKGttcF9keW5hX2xvY2tfdCAqLCBrbXBfaW50MzIpCisgICAgPSB7IF9fa21wX3Vuc2V0X2luZGlyZWN0X2xvY2tfd2l0aF9jaGVja3MsIDAsIEtNUF9GT1JFQUNIX0RfTE9DSyhleHBhbmQsIHJlbGVhc2UpIH07CitzdGF0aWMgaW50ICgqZGlyZWN0X3Rlc3RfY2hlY2tbXSkoa21wX2R5bmFfbG9ja190ICosIGttcF9pbnQzMikKKyAgICA9IHsgX19rbXBfdGVzdF9pbmRpcmVjdF9sb2NrX3dpdGhfY2hlY2tzLCAwLCBLTVBfRk9SRUFDSF9EX0xPQ0soZXhwYW5kLCB0ZXN0KSB9OworI3VuZGVmIGV4cGFuZAorCisvLyBFeHBvc2VzIG9ubHkgb25lIHNldCBvZiBqdW1wIHRhYmxlcyAoKmxvY2sgb3IgKmxvY2tfd2l0aF9jaGVja3MpLgordm9pZCAoKigqX19rbXBfZGlyZWN0X3NldCkpKGttcF9keW5hX2xvY2tfdCAqLCBrbXBfaW50MzIpID0gMDsKK2ludCAoKigqX19rbXBfZGlyZWN0X3Vuc2V0KSkoa21wX2R5bmFfbG9ja190ICosIGttcF9pbnQzMikgPSAwOworaW50ICgqKCpfX2ttcF9kaXJlY3RfdGVzdCkpKGttcF9keW5hX2xvY2tfdCAqLCBrbXBfaW50MzIpID0gMDsKKworLy8KKy8vIEp1bXAgdGFibGVzIGZvciB0aGUgaW5kaXJlY3QgbG9jayBmdW5jdGlvbnMuCisvLworI2RlZmluZSBleHBhbmQobCwgb3ApICh2b2lkICgqKShrbXBfdXNlcl9sb2NrX3ApKV9fa21wXyMjb3AjI18jI2wjI18jI2xvY2ssCit2b2lkICgqX19rbXBfaW5kaXJlY3RfaW5pdFtdKShrbXBfdXNlcl9sb2NrX3ApID0geyBLTVBfRk9SRUFDSF9JX0xPQ0soZXhwYW5kLCBpbml0KSB9Owordm9pZCAoKl9fa21wX2luZGlyZWN0X2Rlc3Ryb3lbXSkoa21wX3VzZXJfbG9ja19wKSA9IHsgS01QX0ZPUkVBQ0hfSV9MT0NLKGV4cGFuZCwgZGVzdHJveSkgfTsKKyN1bmRlZiBleHBhbmQKKworLy8gc2V0L2FjcXVpcmUgZnVuY3Rpb25zCisjZGVmaW5lIGV4cGFuZChsLCBvcCkgKHZvaWQgKCopKGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyKSlfX2ttcF8jI29wIyNfIyNsIyNfIyNsb2NrLAorc3RhdGljIHZvaWQgKCppbmRpcmVjdF9zZXRbXSkoa21wX3VzZXJfbG9ja19wLCBrbXBfaW50MzIpID0geyBLTVBfRk9SRUFDSF9JX0xPQ0soZXhwYW5kLCBhY3F1aXJlKSB9OworI3VuZGVmIGV4cGFuZAorI2RlZmluZSBleHBhbmQobCwgb3ApICh2b2lkICgqKShrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMikpX19rbXBfIyNvcCMjXyMjbCMjXyMjbG9ja193aXRoX2NoZWNrcywKK3N0YXRpYyB2b2lkICgqaW5kaXJlY3Rfc2V0X2NoZWNrW10pKGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyKSA9IHsgS01QX0ZPUkVBQ0hfSV9MT0NLKGV4cGFuZCwgYWNxdWlyZSkgfTsKKyN1bmRlZiBleHBhbmQKKworLy8gdW5zZXQvcmVsZWFzZSBhbmQgdGVzdCBmdW5jdGlvbnMKKyNkZWZpbmUgZXhwYW5kKGwsIG9wKSAoaW50ICAoKikoa21wX3VzZXJfbG9ja19wLCBrbXBfaW50MzIpKV9fa21wXyMjb3AjI18jI2wjI18jI2xvY2ssCitzdGF0aWMgaW50ICgqaW5kaXJlY3RfdW5zZXRbXSkoa21wX3VzZXJfbG9ja19wLCBrbXBfaW50MzIpID0geyBLTVBfRk9SRUFDSF9JX0xPQ0soZXhwYW5kLCByZWxlYXNlKSB9Oworc3RhdGljIGludCAoKmluZGlyZWN0X3Rlc3RbXSkoa21wX3VzZXJfbG9ja19wLCBrbXBfaW50MzIpID0geyBLTVBfRk9SRUFDSF9JX0xPQ0soZXhwYW5kLCB0ZXN0KSB9OworI3VuZGVmIGV4cGFuZAorI2RlZmluZSBleHBhbmQobCwgb3ApIChpbnQgICgqKShrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMikpX19rbXBfIyNvcCMjXyMjbCMjXyMjbG9ja193aXRoX2NoZWNrcywKK3N0YXRpYyBpbnQgKCppbmRpcmVjdF91bnNldF9jaGVja1tdKShrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMikgPSB7IEtNUF9GT1JFQUNIX0lfTE9DSyhleHBhbmQsIHJlbGVhc2UpIH07CitzdGF0aWMgaW50ICgqaW5kaXJlY3RfdGVzdF9jaGVja1tdKShrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMikgPSB7IEtNUF9GT1JFQUNIX0lfTE9DSyhleHBhbmQsIHRlc3QpIH07CisjdW5kZWYgZXhwYW5kCisKKy8vIEV4cG9zZXMgb25seSBvbmUganVtcCB0YWJsZXMgKCpsb2NrIG9yICpsb2NrX3dpdGhfY2hlY2tzKS4KK3ZvaWQgKCooKl9fa21wX2luZGlyZWN0X3NldCkpKGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyKSA9IDA7CitpbnQgKCooKl9fa21wX2luZGlyZWN0X3Vuc2V0KSkoa21wX3VzZXJfbG9ja19wLCBrbXBfaW50MzIpID0gMDsKK2ludCAoKigqX19rbXBfaW5kaXJlY3RfdGVzdCkpKGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyKSA9IDA7CisKKy8vIExvY2sgaW5kZXggdGFibGUuCitrbXBfaW5kaXJlY3RfbG9ja190YWJsZV90IF9fa21wX2lfbG9ja190YWJsZTsKKworLy8gU2l6ZSBvZiBpbmRpcmVjdCBsb2Nrcy4KK3N0YXRpYyBrbXBfdWludDMyIF9fa21wX2luZGlyZWN0X2xvY2tfc2l6ZVtLTVBfTlVNX0lfTE9DS1NdID0geyAwIH07CisKKy8vIEp1bXAgdGFibGVzIGZvciBsb2NrIGFjY2Vzc29yL21vZGlmaWVyLgordm9pZCAoKl9fa21wX2luZGlyZWN0X3NldF9sb2NhdGlvbltLTVBfTlVNX0lfTE9DS1NdKShrbXBfdXNlcl9sb2NrX3AsIGNvbnN0IGlkZW50X3QgKikgPSB7IDAgfTsKK3ZvaWQgKCpfX2ttcF9pbmRpcmVjdF9zZXRfZmxhZ3NbS01QX05VTV9JX0xPQ0tTXSkoa21wX3VzZXJfbG9ja19wLCBrbXBfbG9ja19mbGFnc190KSA9IHsgMCB9OworY29uc3QgaWRlbnRfdCAqICgqX19rbXBfaW5kaXJlY3RfZ2V0X2xvY2F0aW9uW0tNUF9OVU1fSV9MT0NLU10pKGttcF91c2VyX2xvY2tfcCkgPSB7IDAgfTsKK2ttcF9sb2NrX2ZsYWdzX3QgKCpfX2ttcF9pbmRpcmVjdF9nZXRfZmxhZ3NbS01QX05VTV9JX0xPQ0tTXSkoa21wX3VzZXJfbG9ja19wKSA9IHsgMCB9OworCisvLyBVc2UgZGlmZmVyZW50IGxvY2sgcG9vbHMgZm9yIGRpZmZlcmVudCBsb2NrIHR5cGVzLgorc3RhdGljIGttcF9pbmRpcmVjdF9sb2NrX3QgKiBfX2ttcF9pbmRpcmVjdF9sb2NrX3Bvb2xbS01QX05VTV9JX0xPQ0tTXSA9IHsgMCB9OworCisvLyBVc2VyIGxvY2sgYWxsb2NhdG9yIGZvciBkeW5hbWljYWxseSBkaXNwYXRjaGVkIGluZGlyZWN0IGxvY2tzLgorLy8gRXZlcnkgZW50cnkgb2YgdGhlIGluZGlyZWN0IGxvY2sgdGFibGUgaG9sZHMgdGhlIGFkZHJlc3MgYW5kIHR5cGUgb2YgdGhlIGFsbG9jYXRlZCBpbmRyZWN0IGxvY2sKKy8vIChrbXBfaW5kaXJlY3RfbG9ja190KSwgYW5kIHRoZSBzaXplIG9mIHRoZSB0YWJsZSBkb3VibGVzIHdoZW4gaXQgaXMgZnVsbC4gQSBkZXN0cm95ZWQgaW5kaXJlY3QgbG9jaworLy8gb2JqZWN0IGlzIHJldHVybmVkIHRvIHRoZSByZXVzYWJsZSBwb29sIG9mIGxvY2tzLCB1bmlxdWUgdG8gZWFjaCBsb2NrIHR5cGUuCitrbXBfaW5kaXJlY3RfbG9ja190ICoKK19fa21wX2FsbG9jYXRlX2luZGlyZWN0X2xvY2sodm9pZCAqKnVzZXJfbG9jaywga21wX2ludDMyIGd0aWQsIGttcF9pbmRpcmVjdF9sb2NrdGFnX3QgdGFnKQoreworICAgIGttcF9pbmRpcmVjdF9sb2NrX3QgKmxjazsKKyAgICBrbXBfbG9ja19pbmRleF90IGlkeDsKKworICAgIF9fa21wX2FjcXVpcmVfbG9jaygmX19rbXBfZ2xvYmFsX2xvY2ssIGd0aWQpOworCisgICAgaWYgKF9fa21wX2luZGlyZWN0X2xvY2tfcG9vbFt0YWddICE9IE5VTEwpIHsKKyAgICAgICAgLy8gUmV1c2UgdGhlIGFsbG9jYXRlZCBhbmQgZGVzdHJveWVkIGxvY2sgb2JqZWN0CisgICAgICAgIGxjayA9IF9fa21wX2luZGlyZWN0X2xvY2tfcG9vbFt0YWddOworICAgICAgICBpZiAoT01QX0xPQ0tfVF9TSVpFIDwgc2l6ZW9mKHZvaWQgKikpCisgICAgICAgICAgICBpZHggPSBsY2stPmxvY2stPnBvb2wuaW5kZXg7CisgICAgICAgIF9fa21wX2luZGlyZWN0X2xvY2tfcG9vbFt0YWddID0gKGttcF9pbmRpcmVjdF9sb2NrX3QgKilsY2stPmxvY2stPnBvb2wubmV4dDsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfYWxsb2NhdGVfaW5kaXJlY3RfbG9jazogcmV1c2luZyBhbiBleGlzdGluZyBsb2NrICVwXG4iLCBsY2spKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZHggPSBfX2ttcF9pX2xvY2tfdGFibGUubmV4dDsKKyAgICAgICAgLy8gQ2hlY2sgY2FwYWNpdHkgYW5kIGRvdWJsZSB0aGUgc2l6ZSBpZiBpdCBpcyBmdWxsCisgICAgICAgIGlmIChpZHggPT0gX19rbXBfaV9sb2NrX3RhYmxlLnNpemUpIHsKKyAgICAgICAgICAgIC8vIERvdWJsZSB1cCB0aGUgc3BhY2UgZm9yIGJsb2NrIHBvaW50ZXJzCisgICAgICAgICAgICBpbnQgcm93ID0gX19rbXBfaV9sb2NrX3RhYmxlLnNpemUvS01QX0lfTE9DS19DSFVOSzsKKyAgICAgICAgICAgIGttcF9pbmRpcmVjdF9sb2NrX3QgKipvbGRfdGFibGUgPSBfX2ttcF9pX2xvY2tfdGFibGUudGFibGU7CisgICAgICAgICAgICBfX2ttcF9pX2xvY2tfdGFibGUudGFibGUgPSAoa21wX2luZGlyZWN0X2xvY2tfdCAqKilfX2ttcF9hbGxvY2F0ZSgyKnJvdypzaXplb2Yoa21wX2luZGlyZWN0X2xvY2tfdCAqKSk7CisgICAgICAgICAgICBLTVBfTUVNQ1BZKF9fa21wX2lfbG9ja190YWJsZS50YWJsZSwgb2xkX3RhYmxlLCByb3cqc2l6ZW9mKGttcF9pbmRpcmVjdF9sb2NrX3QgKikpOworICAgICAgICAgICAgX19rbXBfZnJlZShvbGRfdGFibGUpOworICAgICAgICAgICAgLy8gQWxsb2NhdGUgbmV3IG9iamVjdHMgaW4gdGhlIG5ldyBibG9ja3MKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSByb3c7IGkgPCAyKnJvdzsgKytpKQorICAgICAgICAgICAgICAgICooX19rbXBfaV9sb2NrX3RhYmxlLnRhYmxlICsgaSkgPSAoa21wX2luZGlyZWN0X2xvY2tfdCAqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hbGxvY2F0ZShLTVBfSV9MT0NLX0NIVU5LKnNpemVvZihrbXBfaW5kaXJlY3RfbG9ja190KSk7CisgICAgICAgICAgICBfX2ttcF9pX2xvY2tfdGFibGUuc2l6ZSA9IDIqaWR4OworICAgICAgICB9CisgICAgICAgIF9fa21wX2lfbG9ja190YWJsZS5uZXh0Kys7CisgICAgICAgIGxjayA9IEtNUF9HRVRfSV9MT0NLKGlkeCk7CisgICAgICAgIC8vIEFsbG9jYXRlIGEgbmV3IGJhc2UgbG9jayBvYmplY3QKKyAgICAgICAgbGNrLT5sb2NrID0gKGttcF91c2VyX2xvY2tfcClfX2ttcF9hbGxvY2F0ZShfX2ttcF9pbmRpcmVjdF9sb2NrX3NpemVbdGFnXSk7CisgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2FsbG9jYXRlX2luZGlyZWN0X2xvY2s6IGFsbG9jYXRlZCBhIG5ldyBsb2NrICVwXG4iLCBsY2spKTsKKyAgICB9CisKKyAgICBfX2ttcF9yZWxlYXNlX2xvY2soJl9fa21wX2dsb2JhbF9sb2NrLCBndGlkKTsKKworICAgIGxjay0+dHlwZSA9IHRhZzsKKworICAgIGlmIChPTVBfTE9DS19UX1NJWkUgPCBzaXplb2Yodm9pZCAqKSkgeworICAgICAgICAqKChrbXBfbG9ja19pbmRleF90ICopdXNlcl9sb2NrKSA9IGlkeCA8PCAxOyAvLyBpbmRpcmVjdCBsb2NrIHdvcmQgbXVzdCBiZSBldmVuLgorICAgIH0gZWxzZSB7CisgICAgICAgICooKGttcF9pbmRpcmVjdF9sb2NrX3QgKiopdXNlcl9sb2NrKSA9IGxjazsKKyAgICB9CisKKyAgICByZXR1cm4gbGNrOworfQorCisvLyBVc2VyIGxvY2sgbG9va3VwIGZvciBkeW5hbWljYWxseSBkaXNwYXRjaGVkIGxvY2tzLgorc3RhdGljIF9fZm9yY2VpbmxpbmUKK2ttcF9pbmRpcmVjdF9sb2NrX3QgKgorX19rbXBfbG9va3VwX2luZGlyZWN0X2xvY2sodm9pZCAqKnVzZXJfbG9jaywgY29uc3QgY2hhciAqZnVuYykKK3sKKyAgICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICAgIGttcF9pbmRpcmVjdF9sb2NrX3QgKmxjayA9IE5VTEw7CisgICAgICAgIGlmICh1c2VyX2xvY2sgPT0gTlVMTCkgeworICAgICAgICAgICAgS01QX0ZBVEFMKExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMpOworICAgICAgICB9CisgICAgICAgIGlmIChPTVBfTE9DS19UX1NJWkUgPCBzaXplb2Yodm9pZCAqKSkgeworICAgICAgICAgICAga21wX2xvY2tfaW5kZXhfdCBpZHggPSBLTVBfRVhUUkFDVF9JX0lOREVYKHVzZXJfbG9jayk7CisgICAgICAgICAgICBpZiAoaWR4ID49IF9fa21wX2lfbG9ja190YWJsZS5zaXplKSB7CisgICAgICAgICAgICAgICAgS01QX0ZBVEFMKExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGNrID0gS01QX0dFVF9JX0xPQ0soaWR4KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxjayA9ICooKGttcF9pbmRpcmVjdF9sb2NrX3QgKiopdXNlcl9sb2NrKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobGNrID09IE5VTEwpIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTChMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGNrOyAKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoT01QX0xPQ0tfVF9TSVpFIDwgc2l6ZW9mKHZvaWQgKikpIHsKKyAgICAgICAgICAgIHJldHVybiBLTVBfR0VUX0lfTE9DSyhLTVBfRVhUUkFDVF9JX0lOREVYKHVzZXJfbG9jaykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuICooKGttcF9pbmRpcmVjdF9sb2NrX3QgKiopdXNlcl9sb2NrKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQKK19fa21wX2luaXRfaW5kaXJlY3RfbG9jayhrbXBfZHluYV9sb2NrX3QgKiBsb2NrLCBrbXBfZHluYV9sb2Nrc2VxX3Qgc2VxKQoreworI2lmIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKyAgICBpZiAoc2VxID09IGxvY2tzZXFfYWRhcHRpdmUgJiYgIV9fa21wX2NwdWluZm8ucnRtKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKEFkYXB0aXZlTm90U3VwcG9ydGVkLCAia21wX2xvY2tzZXFfdCIsICJhZGFwdGl2ZSIpOworICAgICAgICBzZXEgPSBsb2Nrc2VxX3F1ZXVpbmc7CisgICAgfQorI2VuZGlmCisjaWYgS01QX1VTRV9UU1gKKyAgICBpZiAoc2VxID09IGxvY2tzZXFfcnRtICYmICFfX2ttcF9jcHVpbmZvLnJ0bSkgeworICAgICAgICBzZXEgPSBsb2Nrc2VxX3F1ZXVpbmc7CisgICAgfQorI2VuZGlmCisgICAga21wX2luZGlyZWN0X2xvY2t0YWdfdCB0YWcgPSBLTVBfR0VUX0lfVEFHKHNlcSk7CisgICAga21wX2luZGlyZWN0X2xvY2tfdCAqbCA9IF9fa21wX2FsbG9jYXRlX2luZGlyZWN0X2xvY2soKHZvaWQgKiopbG9jaywgX19rbXBfZW50cnlfZ3RpZCgpLCB0YWcpOworICAgIEtNUF9JX0xPQ0tfRlVOQyhsLCBpbml0KShsLT5sb2NrKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9pbml0X2luZGlyZWN0X2xvY2s6IGluaXRpYWxpemVkIGluZGlyZWN0IGxvY2sgd2l0aCB0eXBlIyVkXG4iLCBzZXEpKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2Rlc3Ryb3lfaW5kaXJlY3RfbG9jayhrbXBfZHluYV9sb2NrX3QgKiBsb2NrKQoreworICAgIGttcF91aW50MzIgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICBrbXBfaW5kaXJlY3RfbG9ja190ICpsID0gX19rbXBfbG9va3VwX2luZGlyZWN0X2xvY2soKHZvaWQgKiopbG9jaywgIm9tcF9kZXN0cm95X2xvY2siKTsKKyAgICBLTVBfSV9MT0NLX0ZVTkMobCwgZGVzdHJveSkobC0+bG9jayk7CisgICAga21wX2luZGlyZWN0X2xvY2t0YWdfdCB0YWcgPSBsLT50eXBlOworCisgICAgX19rbXBfYWNxdWlyZV9sb2NrKCZfX2ttcF9nbG9iYWxfbG9jaywgZ3RpZCk7CisKKyAgICAvLyBVc2UgdGhlIGJhc2UgbG9jaydzIHNwYWNlIHRvIGtlZXAgdGhlIHBvb2wgY2hhaW4uCisgICAgbC0+bG9jay0+cG9vbC5uZXh0ID0gKGttcF91c2VyX2xvY2tfcClfX2ttcF9pbmRpcmVjdF9sb2NrX3Bvb2xbdGFnXTsKKyAgICBpZiAoT01QX0xPQ0tfVF9TSVpFIDwgc2l6ZW9mKHZvaWQgKikpIHsKKyAgICAgICAgbC0+bG9jay0+cG9vbC5pbmRleCA9IEtNUF9FWFRSQUNUX0lfSU5ERVgobG9jayk7CisgICAgfQorICAgIF9fa21wX2luZGlyZWN0X2xvY2tfcG9vbFt0YWddID0gbDsKKworICAgIF9fa21wX3JlbGVhc2VfbG9jaygmX19rbXBfZ2xvYmFsX2xvY2ssIGd0aWQpOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfc2V0X2luZGlyZWN0X2xvY2soa21wX2R5bmFfbG9ja190ICogbG9jaywga21wX2ludDMyIGd0aWQpCit7CisgICAga21wX2luZGlyZWN0X2xvY2tfdCAqbCA9IEtNUF9MT09LVVBfSV9MT0NLKGxvY2spOworICAgIEtNUF9JX0xPQ0tfRlVOQyhsLCBzZXQpKGwtPmxvY2ssIGd0aWQpOworfQorCitzdGF0aWMgaW50CitfX2ttcF91bnNldF9pbmRpcmVjdF9sb2NrKGttcF9keW5hX2xvY2tfdCAqIGxvY2ssIGttcF9pbnQzMiBndGlkKQoreworICAgIGttcF9pbmRpcmVjdF9sb2NrX3QgKmwgPSBLTVBfTE9PS1VQX0lfTE9DSyhsb2NrKTsKKyAgICByZXR1cm4gS01QX0lfTE9DS19GVU5DKGwsIHVuc2V0KShsLT5sb2NrLCBndGlkKTsKK30KKworc3RhdGljIGludAorX19rbXBfdGVzdF9pbmRpcmVjdF9sb2NrKGttcF9keW5hX2xvY2tfdCAqIGxvY2ssIGttcF9pbnQzMiBndGlkKQoreworICAgIGttcF9pbmRpcmVjdF9sb2NrX3QgKmwgPSBLTVBfTE9PS1VQX0lfTE9DSyhsb2NrKTsKKyAgICByZXR1cm4gS01QX0lfTE9DS19GVU5DKGwsIHRlc3QpKGwtPmxvY2ssIGd0aWQpOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfc2V0X2luZGlyZWN0X2xvY2tfd2l0aF9jaGVja3Moa21wX2R5bmFfbG9ja190ICogbG9jaywga21wX2ludDMyIGd0aWQpCit7CisgICAga21wX2luZGlyZWN0X2xvY2tfdCAqbCA9IF9fa21wX2xvb2t1cF9pbmRpcmVjdF9sb2NrKCh2b2lkICoqKWxvY2ssICJvbXBfc2V0X2xvY2siKTsKKyAgICBLTVBfSV9MT0NLX0ZVTkMobCwgc2V0KShsLT5sb2NrLCBndGlkKTsKK30KKworc3RhdGljIGludAorX19rbXBfdW5zZXRfaW5kaXJlY3RfbG9ja193aXRoX2NoZWNrcyhrbXBfZHluYV9sb2NrX3QgKiBsb2NrLCBrbXBfaW50MzIgZ3RpZCkKK3sKKyAgICBrbXBfaW5kaXJlY3RfbG9ja190ICpsID0gX19rbXBfbG9va3VwX2luZGlyZWN0X2xvY2soKHZvaWQgKiopbG9jaywgIm9tcF91bnNldF9sb2NrIik7CisgICAgcmV0dXJuIEtNUF9JX0xPQ0tfRlVOQyhsLCB1bnNldCkobC0+bG9jaywgZ3RpZCk7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3Rlc3RfaW5kaXJlY3RfbG9ja193aXRoX2NoZWNrcyhrbXBfZHluYV9sb2NrX3QgKiBsb2NrLCBrbXBfaW50MzIgZ3RpZCkKK3sKKyAgICBrbXBfaW5kaXJlY3RfbG9ja190ICpsID0gX19rbXBfbG9va3VwX2luZGlyZWN0X2xvY2soKHZvaWQgKiopbG9jaywgIm9tcF90ZXN0X2xvY2siKTsKKyAgICByZXR1cm4gS01QX0lfTE9DS19GVU5DKGwsIHRlc3QpKGwtPmxvY2ssIGd0aWQpOworfQorCitrbXBfZHluYV9sb2Nrc2VxX3QgX19rbXBfdXNlcl9sb2NrX3NlcSA9IGxvY2tzZXFfcXVldWluZzsKKworLy8gVGhpcyBpcyB1c2VkIG9ubHkgaW4ga21wX2Vycm9yLmMgd2hlbiBjb25zaXN0ZW5jeSBjaGVja2luZyBpcyBvbi4KK2ttcF9pbnQzMgorX19rbXBfZ2V0X3VzZXJfbG9ja19vd25lcihrbXBfdXNlcl9sb2NrX3AgbGNrLCBrbXBfdWludDMyIHNlcSkKK3sKKyAgICBzd2l0Y2ggKHNlcSkgeworICAgICAgICBjYXNlIGxvY2tzZXFfdGFzOgorICAgICAgICBjYXNlIGxvY2tzZXFfbmVzdGVkX3RhczoKKyAgICAgICAgICAgIHJldHVybiBfX2ttcF9nZXRfdGFzX2xvY2tfb3duZXIoKGttcF90YXNfbG9ja190ICopbGNrKTsKKyNpZiBLTVBfSEFTX0ZVVEVYCisgICAgICAgIGNhc2UgbG9ja3NlcV9mdXRleDoKKyAgICAgICAgY2FzZSBsb2Nrc2VxX25lc3RlZF9mdXRleDoKKyAgICAgICAgICAgIHJldHVybiBfX2ttcF9nZXRfZnV0ZXhfbG9ja19vd25lcigoa21wX2Z1dGV4X2xvY2tfdCAqKWxjayk7CisjZW5kaWYKKyAgICAgICAgY2FzZSBsb2Nrc2VxX3RpY2tldDoKKyAgICAgICAgY2FzZSBsb2Nrc2VxX25lc3RlZF90aWNrZXQ6CisgICAgICAgICAgICByZXR1cm4gX19rbXBfZ2V0X3RpY2tldF9sb2NrX293bmVyKChrbXBfdGlja2V0X2xvY2tfdCAqKWxjayk7CisgICAgICAgIGNhc2UgbG9ja3NlcV9xdWV1aW5nOgorICAgICAgICBjYXNlIGxvY2tzZXFfbmVzdGVkX3F1ZXVpbmc6CisjaWYgS01QX1VTRV9BREFQVElWRV9MT0NLUworICAgICAgICBjYXNlIGxvY2tzZXFfYWRhcHRpdmU6CisgICAgICAgICAgICByZXR1cm4gX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lcigoa21wX3F1ZXVpbmdfbG9ja190ICopbGNrKTsKKyNlbmRpZgorICAgICAgICBjYXNlIGxvY2tzZXFfZHJkcGE6CisgICAgICAgIGNhc2UgbG9ja3NlcV9uZXN0ZWRfZHJkcGE6CisgICAgICAgICAgICByZXR1cm4gX19rbXBfZ2V0X2RyZHBhX2xvY2tfb3duZXIoKGttcF9kcmRwYV9sb2NrX3QgKilsY2spOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCisvLyBJbml0aWFsaXplcyBkYXRhIGZvciBkeW5hbWljIHVzZXIgbG9ja3MuCit2b2lkCitfX2ttcF9pbml0X2R5bmFtaWNfdXNlcl9sb2NrcygpCit7CisgICAgLy8gSW5pdGlhbGl6ZSBqdW1wIHRhYmxlIGZvciB0aGUgbG9jayBmdW5jdGlvbnMKKyAgICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICAgIF9fa21wX2RpcmVjdF9zZXQgICAgID0gZGlyZWN0X3NldF9jaGVjazsKKyAgICAgICAgX19rbXBfZGlyZWN0X3Vuc2V0ICAgPSBkaXJlY3RfdW5zZXRfY2hlY2s7CisgICAgICAgIF9fa21wX2RpcmVjdF90ZXN0ICAgID0gZGlyZWN0X3Rlc3RfY2hlY2s7CisgICAgICAgIF9fa21wX2luZGlyZWN0X3NldCAgID0gaW5kaXJlY3Rfc2V0X2NoZWNrOworICAgICAgICBfX2ttcF9pbmRpcmVjdF91bnNldCA9IGluZGlyZWN0X3Vuc2V0X2NoZWNrOworICAgICAgICBfX2ttcF9pbmRpcmVjdF90ZXN0ICA9IGluZGlyZWN0X3Rlc3RfY2hlY2s7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBfX2ttcF9kaXJlY3Rfc2V0ICAgICA9IGRpcmVjdF9zZXQ7CisgICAgICAgIF9fa21wX2RpcmVjdF91bnNldCAgID0gZGlyZWN0X3Vuc2V0OworICAgICAgICBfX2ttcF9kaXJlY3RfdGVzdCAgICA9IGRpcmVjdF90ZXN0OworICAgICAgICBfX2ttcF9pbmRpcmVjdF9zZXQgICA9IGluZGlyZWN0X3NldDsKKyAgICAgICAgX19rbXBfaW5kaXJlY3RfdW5zZXQgPSBpbmRpcmVjdF91bnNldDsKKyAgICAgICAgX19rbXBfaW5kaXJlY3RfdGVzdCAgPSBpbmRpcmVjdF90ZXN0OworICAgIH0KKworICAgIC8vIEluaXRpYWxpemUgbG9jayBpbmRleCB0YWJsZQorICAgIF9fa21wX2lfbG9ja190YWJsZS5zaXplID0gS01QX0lfTE9DS19DSFVOSzsKKyAgICBfX2ttcF9pX2xvY2tfdGFibGUudGFibGUgPSAoa21wX2luZGlyZWN0X2xvY2tfdCAqKilfX2ttcF9hbGxvY2F0ZShzaXplb2Yoa21wX2luZGlyZWN0X2xvY2tfdCAqKSk7CisgICAgKihfX2ttcF9pX2xvY2tfdGFibGUudGFibGUpID0gKGttcF9pbmRpcmVjdF9sb2NrX3QgKikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hbGxvY2F0ZShLTVBfSV9MT0NLX0NIVU5LKnNpemVvZihrbXBfaW5kaXJlY3RfbG9ja190KSk7IAorICAgIF9fa21wX2lfbG9ja190YWJsZS5uZXh0ID0gMDsKKworICAgIC8vIEluZGlyZWN0IGxvY2sgc2l6ZQorICAgIF9fa21wX2luZGlyZWN0X2xvY2tfc2l6ZVtsb2NrdGFnX3RpY2tldF0gICAgICAgICA9IHNpemVvZihrbXBfdGlja2V0X2xvY2tfdCk7CisgICAgX19rbXBfaW5kaXJlY3RfbG9ja19zaXplW2xvY2t0YWdfcXVldWluZ10gICAgICAgID0gc2l6ZW9mKGttcF9xdWV1aW5nX2xvY2tfdCk7CisjaWYgS01QX1VTRV9BREFQVElWRV9MT0NLUworICAgIF9fa21wX2luZGlyZWN0X2xvY2tfc2l6ZVtsb2NrdGFnX2FkYXB0aXZlXSAgICAgICA9IHNpemVvZihrbXBfYWRhcHRpdmVfbG9ja190KTsKKyNlbmRpZgorICAgIF9fa21wX2luZGlyZWN0X2xvY2tfc2l6ZVtsb2NrdGFnX2RyZHBhXSAgICAgICAgICA9IHNpemVvZihrbXBfZHJkcGFfbG9ja190KTsKKyNpZiBLTVBfVVNFX1RTWAorICAgIF9fa21wX2luZGlyZWN0X2xvY2tfc2l6ZVtsb2NrdGFnX3J0bV0gICAgICAgICAgICA9IHNpemVvZihrbXBfcXVldWluZ19sb2NrX3QpOworI2VuZGlmCisgICAgX19rbXBfaW5kaXJlY3RfbG9ja19zaXplW2xvY2t0YWdfbmVzdGVkX3Rhc10gICAgID0gc2l6ZW9mKGttcF90YXNfbG9ja190KTsKKyNpZiBLTVBfVVNFX0ZVVEVYCisgICAgX19rbXBfaW5kaXJlY3RfbG9ja19zaXplW2xvY2t0YWdfbmVzdGVkX2Z1dGV4XSAgID0gc2l6ZW9mKGttcF9mdXRleF9sb2NrX3QpOworI2VuZGlmCisgICAgX19rbXBfaW5kaXJlY3RfbG9ja19zaXplW2xvY2t0YWdfbmVzdGVkX3RpY2tldF0gID0gc2l6ZW9mKGttcF90aWNrZXRfbG9ja190KTsKKyAgICBfX2ttcF9pbmRpcmVjdF9sb2NrX3NpemVbbG9ja3RhZ19uZXN0ZWRfcXVldWluZ10gPSBzaXplb2Yoa21wX3F1ZXVpbmdfbG9ja190KTsKKyAgICBfX2ttcF9pbmRpcmVjdF9sb2NrX3NpemVbbG9ja3RhZ19uZXN0ZWRfZHJkcGFdICAgPSBzaXplb2Yoa21wX2RyZHBhX2xvY2tfdCk7CisKKyAgICAvLyBJbml0aWFsaXplIGxvY2sgYWNjZXNzb3IvbW9kaWZpZXIKKyNkZWZpbmUgZmlsbF9qdW1wcyh0YWJsZSwgZXhwYW5kLCBzZXApIHsgICAgICAgICAgICBcCisgICAgdGFibGVbbG9ja3RhZyMjc2VwIyN0aWNrZXRdICA9IGV4cGFuZCh0aWNrZXQpOyAgXAorICAgIHRhYmxlW2xvY2t0YWcjI3NlcCMjcXVldWluZ10gPSBleHBhbmQocXVldWluZyk7IFwKKyAgICB0YWJsZVtsb2NrdGFnIyNzZXAjI2RyZHBhXSAgID0gZXhwYW5kKGRyZHBhKTsgICBcCit9CisKKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisjIGRlZmluZSBmaWxsX3RhYmxlKHRhYmxlLCBleHBhbmQpIHsgICAgICAgICAgIFwKKyAgICBmaWxsX2p1bXBzKHRhYmxlLCBleHBhbmQsIF8pOyAgICAgICAgICAgICAgXAorICAgIHRhYmxlW2xvY2t0YWdfYWRhcHRpdmVdID0gZXhwYW5kKHF1ZXVpbmcpOyBcCisgICAgZmlsbF9qdW1wcyh0YWJsZSwgZXhwYW5kLCBfbmVzdGVkXyk7ICAgICAgIFwKK30KKyNlbHNlCisjIGRlZmluZSBmaWxsX3RhYmxlKHRhYmxlLCBleHBhbmQpIHsgICAgICAgICAgIFwKKyAgICBmaWxsX2p1bXBzKHRhYmxlLCBleHBhbmQsIF8pOyAgICAgICAgICAgICAgXAorICAgIGZpbGxfanVtcHModGFibGUsIGV4cGFuZCwgX25lc3RlZF8pOyAgICAgICBcCit9CisjZW5kaWYgLy8gS01QX1VTRV9BREFQVElWRV9MT0NLUworCisjZGVmaW5lIGV4cGFuZChsKSAodm9pZCAoKikoa21wX3VzZXJfbG9ja19wLCBjb25zdCBpZGVudF90ICopKV9fa21wX3NldF8jI2wjI19sb2NrX2xvY2F0aW9uCisgICAgZmlsbF90YWJsZShfX2ttcF9pbmRpcmVjdF9zZXRfbG9jYXRpb24sIGV4cGFuZCk7CisjdW5kZWYgZXhwYW5kCisjZGVmaW5lIGV4cGFuZChsKSAodm9pZCAoKikoa21wX3VzZXJfbG9ja19wLCBrbXBfbG9ja19mbGFnc190KSlfX2ttcF9zZXRfIyNsIyNfbG9ja19mbGFncworICAgIGZpbGxfdGFibGUoX19rbXBfaW5kaXJlY3Rfc2V0X2ZsYWdzLCBleHBhbmQpOworI3VuZGVmIGV4cGFuZAorI2RlZmluZSBleHBhbmQobCkgKGNvbnN0IGlkZW50X3QgKiAoKikoa21wX3VzZXJfbG9ja19wKSlfX2ttcF9nZXRfIyNsIyNfbG9ja19sb2NhdGlvbgorICAgIGZpbGxfdGFibGUoX19rbXBfaW5kaXJlY3RfZ2V0X2xvY2F0aW9uLCBleHBhbmQpOworI3VuZGVmIGV4cGFuZAorI2RlZmluZSBleHBhbmQobCkgKGttcF9sb2NrX2ZsYWdzX3QgKCopKGttcF91c2VyX2xvY2tfcCkpX19rbXBfZ2V0XyMjbCMjX2xvY2tfZmxhZ3MKKyAgICBmaWxsX3RhYmxlKF9fa21wX2luZGlyZWN0X2dldF9mbGFncywgZXhwYW5kKTsKKyN1bmRlZiBleHBhbmQKKworICAgIF9fa21wX2luaXRfdXNlcl9sb2NrcyA9IFRSVUU7Cit9CisKKy8vIENsZWFuIHVwIHRoZSBsb2NrIHRhYmxlLgordm9pZAorX19rbXBfY2xlYW51cF9pbmRpcmVjdF91c2VyX2xvY2tzKCkKK3sKKyAgICBrbXBfbG9ja19pbmRleF90IGk7CisgICAgaW50IGs7CisKKyAgICAvLyBDbGVhbiB1cCBsb2NrcyBpbiB0aGUgcG9vbHMgZmlyc3QgKHRoZXkgd2VyZSBhbHJlYWR5IGRlc3Ryb3llZCBiZWZvcmUgZ29pbmcgaW50byB0aGUgcG9vbHMpLgorICAgIGZvciAoayA9IDA7IGsgPCBLTVBfTlVNX0lfTE9DS1M7ICsraykgeworICAgICAgICBrbXBfaW5kaXJlY3RfbG9ja190ICpsID0gX19rbXBfaW5kaXJlY3RfbG9ja19wb29sW2tdOworICAgICAgICB3aGlsZSAobCAhPSBOVUxMKSB7CisgICAgICAgICAgICBrbXBfaW5kaXJlY3RfbG9ja190ICpsbCA9IGw7CisgICAgICAgICAgICBsID0gKGttcF9pbmRpcmVjdF9sb2NrX3QgKilsLT5sb2NrLT5wb29sLm5leHQ7CisgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9jbGVhbnVwX2luZGlyZWN0X3VzZXJfbG9ja3M6IGZyZWVpbmcgJXAgZnJvbSBwb29sXG4iLCBsbCkpOworICAgICAgICAgICAgX19rbXBfZnJlZShsbC0+bG9jayk7CisgICAgICAgICAgICBsbC0+bG9jayA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfaW5kaXJlY3RfbG9ja19wb29sW2tdID0gTlVMTDsKKyAgICB9CisgICAgLy8gQ2xlYW4gdXAgdGhlIHJlbWFpbmluZyB1bmRlc3Ryb3llZCBsb2Nrcy4KKyAgICBmb3IgKGkgPSAwOyBpIDwgX19rbXBfaV9sb2NrX3RhYmxlLm5leHQ7IGkrKykgeworICAgICAgICBrbXBfaW5kaXJlY3RfbG9ja190ICpsID0gS01QX0dFVF9JX0xPQ0soaSk7CisgICAgICAgIGlmIChsLT5sb2NrICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8vIExvY2tzIG5vdCBkZXN0cm95ZWQgZXhwbGljaXRseSBuZWVkIHRvIGJlIGRlc3Ryb3llZCBoZXJlLgorICAgICAgICAgICAgS01QX0lfTE9DS19GVU5DKGwsIGRlc3Ryb3kpKGwtPmxvY2spOworICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfY2xlYW51cF9pbmRpcmVjdF91c2VyX2xvY2tzOiBkZXN0cm95L2ZyZWVpbmcgJXAgZnJvbSB0YWJsZVxuIiwgbCkpOworICAgICAgICAgICAgX19rbXBfZnJlZShsLT5sb2NrKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBGcmVlIHRoZSB0YWJsZQorICAgIGZvciAoaSA9IDA7IGkgPCBfX2ttcF9pX2xvY2tfdGFibGUuc2l6ZSAvIEtNUF9JX0xPQ0tfQ0hVTks7IGkrKykKKyAgICAgICAgX19rbXBfZnJlZShfX2ttcF9pX2xvY2tfdGFibGUudGFibGVbaV0pOworICAgIF9fa21wX2ZyZWUoX19rbXBfaV9sb2NrX3RhYmxlLnRhYmxlKTsKKworICAgIF9fa21wX2luaXRfdXNlcl9sb2NrcyA9IEZBTFNFOworfQorCitlbnVtIGttcF9sb2NrX2tpbmQgX19rbXBfdXNlcl9sb2NrX2tpbmQgPSBsa19kZWZhdWx0OworaW50IF9fa21wX251bV9sb2Nrc19pbl9ibG9jayA9IDE7ICAgICAgICAgICAgIC8vIEZJWE1FIC0gdHVuZSB0aGlzIHZhbHVlCisKKyNlbHNlIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogdXNlciBsb2NrcworICoKKyAqIFRoZXkgYXJlIGltcGxlbWVudGVkIGFzIGEgdGFibGUgb2YgZnVuY3Rpb24gcG9pbnRlcnMgd2hpY2ggYXJlIHNldCB0byB0aGUKKyAqIGxvY2sgZnVuY3Rpb25zIG9mIHRoZSBhcHByb3ByaWF0ZSBraW5kLCBvbmNlIHRoYXQgaGFzIGJlZW4gZGV0ZXJtaW5lZC4KKyAqLworCitlbnVtIGttcF9sb2NrX2tpbmQgX19rbXBfdXNlcl9sb2NrX2tpbmQgPSBsa19kZWZhdWx0OworCitzaXplX3QgX19rbXBfYmFzZV91c2VyX2xvY2tfc2l6ZSA9IDA7CitzaXplX3QgX19rbXBfdXNlcl9sb2NrX3NpemUgPSAwOworCitrbXBfaW50MzIgKCAqX19rbXBfZ2V0X3VzZXJfbG9ja19vd25lcl8gKSgga21wX3VzZXJfbG9ja19wIGxjayApID0gTlVMTDsKK2ludCAoICpfX2ttcF9hY3F1aXJlX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKSA9IE5VTEw7CisKK2ludCAoICpfX2ttcF90ZXN0X3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKSA9IE5VTEw7CitpbnQgKCAqX19rbXBfcmVsZWFzZV91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9pbnQzMiBndGlkICkgPSBOVUxMOwordm9pZCAoICpfX2ttcF9pbml0X3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjayApID0gTlVMTDsKK3ZvaWQgKCAqX19rbXBfZGVzdHJveV91c2VyX2xvY2tfICkoIGttcF91c2VyX2xvY2tfcCBsY2sgKSA9IE5VTEw7Cit2b2lkICggKl9fa21wX2Rlc3Ryb3lfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrICkgPSBOVUxMOworaW50ICggKl9fa21wX2FjcXVpcmVfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKSA9IE5VTEw7CisKK2ludCAoICpfX2ttcF90ZXN0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9pbnQzMiBndGlkICkgPSBOVUxMOworaW50ICggKl9fa21wX3JlbGVhc2VfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKSA9IE5VTEw7Cit2b2lkICggKl9fa21wX2luaXRfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjayApID0gTlVMTDsKK3ZvaWQgKCAqX19rbXBfZGVzdHJveV9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrICkgPSBOVUxMOworCitpbnQgKCAqX19rbXBfaXNfdXNlcl9sb2NrX2luaXRpYWxpemVkXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrICkgPSBOVUxMOworY29uc3QgaWRlbnRfdCAqICggKl9fa21wX2dldF91c2VyX2xvY2tfbG9jYXRpb25fICkoIGttcF91c2VyX2xvY2tfcCBsY2sgKSA9IE5VTEw7Cit2b2lkICggKl9fa21wX3NldF91c2VyX2xvY2tfbG9jYXRpb25fICkoIGttcF91c2VyX2xvY2tfcCBsY2ssIGNvbnN0IGlkZW50X3QgKmxvYyApID0gTlVMTDsKK2ttcF9sb2NrX2ZsYWdzX3QgKCAqX19rbXBfZ2V0X3VzZXJfbG9ja19mbGFnc18gKSgga21wX3VzZXJfbG9ja19wIGxjayApID0gTlVMTDsKK3ZvaWQgKCAqX19rbXBfc2V0X3VzZXJfbG9ja19mbGFnc18gKSgga21wX3VzZXJfbG9ja19wIGxjaywga21wX2xvY2tfZmxhZ3NfdCBmbGFncyApID0gTlVMTDsKKwordm9pZCBfX2ttcF9zZXRfdXNlcl9sb2NrX3ZwdHJzKCBrbXBfbG9ja19raW5kX3QgdXNlcl9sb2NrX2tpbmQgKQoreworICAgIHN3aXRjaCAoIHVzZXJfbG9ja19raW5kICkgeworICAgICAgICBjYXNlIGxrX2RlZmF1bHQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIEtNUF9BU1NFUlQoIDAgKTsKKworICAgICAgICBjYXNlIGxrX3RhczogeworICAgICAgICAgICAgX19rbXBfYmFzZV91c2VyX2xvY2tfc2l6ZSA9IHNpemVvZigga21wX2Jhc2VfdGFzX2xvY2tfdCApOworICAgICAgICAgICAgX19rbXBfdXNlcl9sb2NrX3NpemUgPSBzaXplb2YoIGttcF90YXNfbG9ja190ICk7CisKKyAgICAgICAgICAgIF9fa21wX2dldF91c2VyX2xvY2tfb3duZXJfID0KKyAgICAgICAgICAgICAgKCBrbXBfaW50MzIgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfZ2V0X3Rhc19sb2NrX293bmVyICk7CisKKyAgICAgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAgICAgICAgIEtNUF9CSU5EX1VTRVJfTE9DS19XSVRIX0NIRUNLUyh0YXMpOworICAgICAgICAgICAgICAgIEtNUF9CSU5EX05FU1RFRF9VU0VSX0xPQ0tfV0lUSF9DSEVDS1ModGFzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEtNUF9CSU5EX1VTRVJfTE9DSyh0YXMpOworICAgICAgICAgICAgICAgIEtNUF9CSU5EX05FU1RFRF9VU0VSX0xPQ0sodGFzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX19rbXBfZGVzdHJveV91c2VyX2xvY2tfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2Rlc3Ryb3lfdGFzX2xvY2sgKTsKKworICAgICAgICAgICAgIF9fa21wX2lzX3VzZXJfbG9ja19pbml0aWFsaXplZF8gPQorICAgICAgICAgICAgICAgKCBpbnQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkgTlVMTDsKKworICAgICAgICAgICAgIF9fa21wX2dldF91c2VyX2xvY2tfbG9jYXRpb25fID0KKyAgICAgICAgICAgICAgICggY29uc3QgaWRlbnRfdCAqICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApIE5VTEw7CisKKyAgICAgICAgICAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyA9CisgICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCwgY29uc3QgaWRlbnRfdCAqICkgKSBOVUxMOworCisgICAgICAgICAgICAgX19rbXBfZ2V0X3VzZXJfbG9ja19mbGFnc18gPQorICAgICAgICAgICAgICAgKCBrbXBfbG9ja19mbGFnc190ICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApIE5VTEw7CisKKyAgICAgICAgICAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX2ZsYWdzXyA9CisgICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCwga21wX2xvY2tfZmxhZ3NfdCApICkgTlVMTDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0pCisKKyAgICAgICAgY2FzZSBsa19mdXRleDogeworICAgICAgICAgICAgX19rbXBfYmFzZV91c2VyX2xvY2tfc2l6ZSA9IHNpemVvZigga21wX2Jhc2VfZnV0ZXhfbG9ja190ICk7CisgICAgICAgICAgICBfX2ttcF91c2VyX2xvY2tfc2l6ZSA9IHNpemVvZigga21wX2Z1dGV4X2xvY2tfdCApOworCisgICAgICAgICAgICBfX2ttcF9nZXRfdXNlcl9sb2NrX293bmVyXyA9CisgICAgICAgICAgICAgICgga21wX2ludDMyICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2dldF9mdXRleF9sb2NrX293bmVyICk7CisKKyAgICAgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAgICAgICAgIEtNUF9CSU5EX1VTRVJfTE9DS19XSVRIX0NIRUNLUyhmdXRleCk7CisgICAgICAgICAgICAgICAgS01QX0JJTkRfTkVTVEVEX1VTRVJfTE9DS19XSVRIX0NIRUNLUyhmdXRleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBLTVBfQklORF9VU0VSX0xPQ0soZnV0ZXgpOworICAgICAgICAgICAgICAgIEtNUF9CSU5EX05FU1RFRF9VU0VSX0xPQ0soZnV0ZXgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfX2ttcF9kZXN0cm95X3VzZXJfbG9ja18gPQorICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfZGVzdHJveV9mdXRleF9sb2NrICk7CisKKyAgICAgICAgICAgICBfX2ttcF9pc191c2VyX2xvY2tfaW5pdGlhbGl6ZWRfID0KKyAgICAgICAgICAgICAgICggaW50ICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApIE5VTEw7CisKKyAgICAgICAgICAgICBfX2ttcF9nZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyA9CisgICAgICAgICAgICAgICAoIGNvbnN0IGlkZW50X3QgKiAoICogKSgga21wX3VzZXJfbG9ja19wICkgKSBOVUxMOworCisgICAgICAgICAgICAgX19rbXBfc2V0X3VzZXJfbG9ja19sb2NhdGlvbl8gPQorICAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGNvbnN0IGlkZW50X3QgKiApICkgTlVMTDsKKworICAgICAgICAgICAgIF9fa21wX2dldF91c2VyX2xvY2tfZmxhZ3NfID0KKyAgICAgICAgICAgICAgICgga21wX2xvY2tfZmxhZ3NfdCAoICogKSgga21wX3VzZXJfbG9ja19wICkgKSBOVUxMOworCisgICAgICAgICAgICAgX19rbXBfc2V0X3VzZXJfbG9ja19mbGFnc18gPQorICAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9sb2NrX2ZsYWdzX3QgKSApIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyNlbmRpZiAvLyBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNKQorCisgICAgICAgIGNhc2UgbGtfdGlja2V0OiB7CisgICAgICAgICAgICBfX2ttcF9iYXNlX3VzZXJfbG9ja19zaXplID0gc2l6ZW9mKCBrbXBfYmFzZV90aWNrZXRfbG9ja190ICk7CisgICAgICAgICAgICBfX2ttcF91c2VyX2xvY2tfc2l6ZSA9IHNpemVvZigga21wX3RpY2tldF9sb2NrX3QgKTsKKworICAgICAgICAgICAgX19rbXBfZ2V0X3VzZXJfbG9ja19vd25lcl8gPQorICAgICAgICAgICAgICAoIGttcF9pbnQzMiAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9nZXRfdGlja2V0X2xvY2tfb3duZXIgKTsKKworICAgICAgICAgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgICAgICAgICAgS01QX0JJTkRfVVNFUl9MT0NLX1dJVEhfQ0hFQ0tTKHRpY2tldCk7CisgICAgICAgICAgICAgICAgS01QX0JJTkRfTkVTVEVEX1VTRVJfTE9DS19XSVRIX0NIRUNLUyh0aWNrZXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgS01QX0JJTkRfVVNFUl9MT0NLKHRpY2tldCk7CisgICAgICAgICAgICAgICAgS01QX0JJTkRfTkVTVEVEX1VTRVJfTE9DSyh0aWNrZXQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfX2ttcF9kZXN0cm95X3VzZXJfbG9ja18gPQorICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfZGVzdHJveV90aWNrZXRfbG9jayApOworCisgICAgICAgICAgICAgX19rbXBfaXNfdXNlcl9sb2NrX2luaXRpYWxpemVkXyA9CisgICAgICAgICAgICAgICAoIGludCAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAgKCAmX19rbXBfaXNfdGlja2V0X2xvY2tfaW5pdGlhbGl6ZWQgKTsKKworICAgICAgICAgICAgIF9fa21wX2dldF91c2VyX2xvY2tfbG9jYXRpb25fID0KKyAgICAgICAgICAgICAgICggY29uc3QgaWRlbnRfdCAqICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICAoICZfX2ttcF9nZXRfdGlja2V0X2xvY2tfbG9jYXRpb24gKTsKKworICAgICAgICAgICAgIF9fa21wX3NldF91c2VyX2xvY2tfbG9jYXRpb25fID0KKyAgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wLCBjb25zdCBpZGVudF90ICogKSApCisgICAgICAgICAgICAgICAoICZfX2ttcF9zZXRfdGlja2V0X2xvY2tfbG9jYXRpb24gKTsKKworICAgICAgICAgICAgIF9fa21wX2dldF91c2VyX2xvY2tfZmxhZ3NfID0KKyAgICAgICAgICAgICAgICgga21wX2xvY2tfZmxhZ3NfdCAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAgKCAmX19rbXBfZ2V0X3RpY2tldF9sb2NrX2ZsYWdzICk7CisKKyAgICAgICAgICAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX2ZsYWdzXyA9CisgICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCwga21wX2xvY2tfZmxhZ3NfdCApICkKKyAgICAgICAgICAgICAgICggJl9fa21wX3NldF90aWNrZXRfbG9ja19mbGFncyApOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgbGtfcXVldWluZzogeworICAgICAgICAgICAgX19rbXBfYmFzZV91c2VyX2xvY2tfc2l6ZSA9IHNpemVvZigga21wX2Jhc2VfcXVldWluZ19sb2NrX3QgKTsKKyAgICAgICAgICAgIF9fa21wX3VzZXJfbG9ja19zaXplID0gc2l6ZW9mKCBrbXBfcXVldWluZ19sb2NrX3QgKTsKKworICAgICAgICAgICAgX19rbXBfZ2V0X3VzZXJfbG9ja19vd25lcl8gPQorICAgICAgICAgICAgICAoIGttcF9pbnQzMiAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9nZXRfcXVldWluZ19sb2NrX293bmVyICk7CisKKyAgICAgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAgICAgICAgIEtNUF9CSU5EX1VTRVJfTE9DS19XSVRIX0NIRUNLUyhxdWV1aW5nKTsKKyAgICAgICAgICAgICAgICBLTVBfQklORF9ORVNURURfVVNFUl9MT0NLX1dJVEhfQ0hFQ0tTKHF1ZXVpbmcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgS01QX0JJTkRfVVNFUl9MT0NLKHF1ZXVpbmcpOworICAgICAgICAgICAgICAgIEtNUF9CSU5EX05FU1RFRF9VU0VSX0xPQ0socXVldWluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9fa21wX2Rlc3Ryb3lfdXNlcl9sb2NrXyA9CisgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9kZXN0cm95X3F1ZXVpbmdfbG9jayApOworCisgICAgICAgICAgICAgX19rbXBfaXNfdXNlcl9sb2NrX2luaXRpYWxpemVkXyA9CisgICAgICAgICAgICAgICAoIGludCAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAgKCAmX19rbXBfaXNfcXVldWluZ19sb2NrX2luaXRpYWxpemVkICk7CisKKyAgICAgICAgICAgICBfX2ttcF9nZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyA9CisgICAgICAgICAgICAgICAoIGNvbnN0IGlkZW50X3QgKiAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAgKCAmX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19sb2NhdGlvbiApOworCisgICAgICAgICAgICAgX19rbXBfc2V0X3VzZXJfbG9ja19sb2NhdGlvbl8gPQorICAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGNvbnN0IGlkZW50X3QgKiApICkKKyAgICAgICAgICAgICAgICggJl9fa21wX3NldF9xdWV1aW5nX2xvY2tfbG9jYXRpb24gKTsKKworICAgICAgICAgICAgIF9fa21wX2dldF91c2VyX2xvY2tfZmxhZ3NfID0KKyAgICAgICAgICAgICAgICgga21wX2xvY2tfZmxhZ3NfdCAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAgKCAmX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19mbGFncyApOworCisgICAgICAgICAgICAgX19rbXBfc2V0X3VzZXJfbG9ja19mbGFnc18gPQorICAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9sb2NrX2ZsYWdzX3QgKSApCisgICAgICAgICAgICAgICAoICZfX2ttcF9zZXRfcXVldWluZ19sb2NrX2ZsYWdzICk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisgICAgICAgIGNhc2UgbGtfYWRhcHRpdmU6IHsKKyAgICAgICAgICAgIF9fa21wX2Jhc2VfdXNlcl9sb2NrX3NpemUgPSBzaXplb2YoIGttcF9iYXNlX2FkYXB0aXZlX2xvY2tfdCApOworICAgICAgICAgICAgX19rbXBfdXNlcl9sb2NrX3NpemUgPSBzaXplb2YoIGttcF9hZGFwdGl2ZV9sb2NrX3QgKTsKKworICAgICAgICAgICAgX19rbXBfZ2V0X3VzZXJfbG9ja19vd25lcl8gPQorICAgICAgICAgICAgICAoIGttcF9pbnQzMiAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9nZXRfcXVldWluZ19sb2NrX293bmVyICk7CisKKyAgICAgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAgICAgICAgIEtNUF9CSU5EX1VTRVJfTE9DS19XSVRIX0NIRUNLUyhhZGFwdGl2ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBLTVBfQklORF9VU0VSX0xPQ0soYWRhcHRpdmUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfX2ttcF9kZXN0cm95X3VzZXJfbG9ja18gPQorICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfZGVzdHJveV9hZGFwdGl2ZV9sb2NrICk7CisKKyAgICAgICAgICAgIF9fa21wX2lzX3VzZXJfbG9ja19pbml0aWFsaXplZF8gPQorICAgICAgICAgICAgICAoIGludCAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9pc19xdWV1aW5nX2xvY2tfaW5pdGlhbGl6ZWQgKTsKKworICAgICAgICAgICAgX19rbXBfZ2V0X3VzZXJfbG9ja19sb2NhdGlvbl8gPQorICAgICAgICAgICAgICAoIGNvbnN0IGlkZW50X3QgKiAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9nZXRfcXVldWluZ19sb2NrX2xvY2F0aW9uICk7CisKKyAgICAgICAgICAgIF9fa21wX3NldF91c2VyX2xvY2tfbG9jYXRpb25fID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGNvbnN0IGlkZW50X3QgKiApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfc2V0X3F1ZXVpbmdfbG9ja19sb2NhdGlvbiApOworCisgICAgICAgICAgICBfX2ttcF9nZXRfdXNlcl9sb2NrX2ZsYWdzXyA9CisgICAgICAgICAgICAgICgga21wX2xvY2tfZmxhZ3NfdCAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9nZXRfcXVldWluZ19sb2NrX2ZsYWdzICk7CisKKyAgICAgICAgICAgIF9fa21wX3NldF91c2VyX2xvY2tfZmxhZ3NfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9sb2NrX2ZsYWdzX3QgKSApCisgICAgICAgICAgICAgICggJl9fa21wX3NldF9xdWV1aW5nX2xvY2tfZmxhZ3MgKTsKKworICAgICAgICB9CisgICAgICAgIGJyZWFrOworI2VuZGlmIC8vIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKworICAgICAgICBjYXNlIGxrX2RyZHBhOiB7CisgICAgICAgICAgICBfX2ttcF9iYXNlX3VzZXJfbG9ja19zaXplID0gc2l6ZW9mKCBrbXBfYmFzZV9kcmRwYV9sb2NrX3QgKTsKKyAgICAgICAgICAgIF9fa21wX3VzZXJfbG9ja19zaXplID0gc2l6ZW9mKCBrbXBfZHJkcGFfbG9ja190ICk7CisKKyAgICAgICAgICAgIF9fa21wX2dldF91c2VyX2xvY2tfb3duZXJfID0KKyAgICAgICAgICAgICAgKCBrbXBfaW50MzIgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfZ2V0X2RyZHBhX2xvY2tfb3duZXIgKTsKKworICAgICAgICAgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgICAgICAgICAgS01QX0JJTkRfVVNFUl9MT0NLX1dJVEhfQ0hFQ0tTKGRyZHBhKTsKKyAgICAgICAgICAgICAgICBLTVBfQklORF9ORVNURURfVVNFUl9MT0NLX1dJVEhfQ0hFQ0tTKGRyZHBhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEtNUF9CSU5EX1VTRVJfTE9DSyhkcmRwYSk7CisgICAgICAgICAgICAgICAgS01QX0JJTkRfTkVTVEVEX1VTRVJfTE9DSyhkcmRwYSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9fa21wX2Rlc3Ryb3lfdXNlcl9sb2NrXyA9CisgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9kZXN0cm95X2RyZHBhX2xvY2sgKTsKKworICAgICAgICAgICAgIF9fa21wX2lzX3VzZXJfbG9ja19pbml0aWFsaXplZF8gPQorICAgICAgICAgICAgICAgKCBpbnQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgICggJl9fa21wX2lzX2RyZHBhX2xvY2tfaW5pdGlhbGl6ZWQgKTsKKworICAgICAgICAgICAgIF9fa21wX2dldF91c2VyX2xvY2tfbG9jYXRpb25fID0KKyAgICAgICAgICAgICAgICggY29uc3QgaWRlbnRfdCAqICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICAoICZfX2ttcF9nZXRfZHJkcGFfbG9ja19sb2NhdGlvbiApOworCisgICAgICAgICAgICAgX19rbXBfc2V0X3VzZXJfbG9ja19sb2NhdGlvbl8gPQorICAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGNvbnN0IGlkZW50X3QgKiApICkKKyAgICAgICAgICAgICAgICggJl9fa21wX3NldF9kcmRwYV9sb2NrX2xvY2F0aW9uICk7CisKKyAgICAgICAgICAgICBfX2ttcF9nZXRfdXNlcl9sb2NrX2ZsYWdzXyA9CisgICAgICAgICAgICAgICAoIGttcF9sb2NrX2ZsYWdzX3QgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgICggJl9fa21wX2dldF9kcmRwYV9sb2NrX2ZsYWdzICk7CisKKyAgICAgICAgICAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX2ZsYWdzXyA9CisgICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCwga21wX2xvY2tfZmxhZ3NfdCApICkKKyAgICAgICAgICAgICAgICggJl9fa21wX3NldF9kcmRwYV9sb2NrX2ZsYWdzICk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFVzZXIgbG9jayB0YWJsZSAmIGxvY2sgYWxsb2NhdGlvbgorCitrbXBfbG9ja190YWJsZV90IF9fa21wX3VzZXJfbG9ja190YWJsZSA9IHsgMSwgMCwgTlVMTCB9Owora21wX3VzZXJfbG9ja19wIF9fa21wX2xvY2tfcG9vbCA9IE5VTEw7CisKKy8vIExvY2sgYmxvY2stYWxsb2NhdGlvbiBzdXBwb3J0Lgora21wX2Jsb2NrX29mX2xvY2tzKiBfX2ttcF9sb2NrX2Jsb2NrcyA9IE5VTEw7CitpbnQgX19rbXBfbnVtX2xvY2tzX2luX2Jsb2NrID0gMTsgICAgICAgICAgICAgLy8gRklYTUUgLSB0dW5lIHRoaXMgdmFsdWUKKworc3RhdGljIGttcF9sb2NrX2luZGV4X3QKK19fa21wX2xvY2tfdGFibGVfaW5zZXJ0KCBrbXBfdXNlcl9sb2NrX3AgbGNrICkKK3sKKyAgICAvLyBBc3N1bWUgdGhhdCBrbXBfZ2xvYmFsX2xvY2sgaXMgaGVsZCB1cG9uIGVudHJ5L2V4aXQuCisgICAga21wX2xvY2tfaW5kZXhfdCBpbmRleDsKKyAgICBpZiAoIF9fa21wX3VzZXJfbG9ja190YWJsZS51c2VkID49IF9fa21wX3VzZXJfbG9ja190YWJsZS5hbGxvY2F0ZWQgKSB7CisgICAgICAgIGttcF9sb2NrX2luZGV4X3Qgc2l6ZTsKKyAgICAgICAga21wX3VzZXJfbG9ja19wICp0YWJsZTsKKyAgICAgICAgLy8gUmVhbGxvY2F0ZSBsb2NrIHRhYmxlLgorICAgICAgICBpZiAoIF9fa21wX3VzZXJfbG9ja190YWJsZS5hbGxvY2F0ZWQgPT0gMCApIHsKKyAgICAgICAgICAgIHNpemUgPSAxMDI0OworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc2l6ZSA9IF9fa21wX3VzZXJfbG9ja190YWJsZS5hbGxvY2F0ZWQgKiAyOworICAgICAgICB9CisgICAgICAgIHRhYmxlID0gKGttcF91c2VyX2xvY2tfcCAqKV9fa21wX2FsbG9jYXRlKCBzaXplb2YoIGttcF91c2VyX2xvY2tfcCApICogc2l6ZSApOworICAgICAgICBLTVBfTUVNQ1BZKCB0YWJsZSArIDEsIF9fa21wX3VzZXJfbG9ja190YWJsZS50YWJsZSArIDEsIHNpemVvZigga21wX3VzZXJfbG9ja19wICkgKiAoIF9fa21wX3VzZXJfbG9ja190YWJsZS51c2VkIC0gMSApICk7CisgICAgICAgIHRhYmxlWyAwIF0gPSAoa21wX3VzZXJfbG9ja19wKV9fa21wX3VzZXJfbG9ja190YWJsZS50YWJsZTsKKyAgICAgICAgICAgIC8vIFdlIGNhbm5vdCBmcmVlIHRoZSBwcmV2aW91cyB0YWJsZSBub3csIHNpbmNlIGl0IG1heSBiZSBpbiB1c2UgYnkgb3RoZXIKKyAgICAgICAgICAgIC8vIHRocmVhZHMuIFNvIHNhdmUgdGhlIHBvaW50ZXIgdG8gdGhlIHByZXZpb3VzIHRhYmxlIGluIGluIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZQorICAgICAgICAgICAgLy8gbmV3IHRhYmxlLiBBbGwgdGhlIHRhYmxlcyB3aWxsIGJlIG9yZ2FuaXplZCBpbnRvIGEgbGlzdCwgYW5kIGNvdWxkIGJlIGZyZWVkIHdoZW4KKyAgICAgICAgICAgIC8vIGxpYnJhcnkgc2h1dHRpbmcgZG93bi4KKyAgICAgICAgX19rbXBfdXNlcl9sb2NrX3RhYmxlLnRhYmxlID0gdGFibGU7CisgICAgICAgIF9fa21wX3VzZXJfbG9ja190YWJsZS5hbGxvY2F0ZWQgPSBzaXplOworICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF91c2VyX2xvY2tfdGFibGUudXNlZCA8IF9fa21wX3VzZXJfbG9ja190YWJsZS5hbGxvY2F0ZWQgKTsKKyAgICBpbmRleCA9IF9fa21wX3VzZXJfbG9ja190YWJsZS51c2VkOworICAgIF9fa21wX3VzZXJfbG9ja190YWJsZS50YWJsZVsgaW5kZXggXSA9IGxjazsKKyAgICArKyBfX2ttcF91c2VyX2xvY2tfdGFibGUudXNlZDsKKyAgICByZXR1cm4gaW5kZXg7Cit9CisKK3N0YXRpYyBrbXBfdXNlcl9sb2NrX3AKK19fa21wX2xvY2tfYmxvY2tfYWxsb2NhdGUoKQoreworICAgIC8vIEFzc3VtZSB0aGF0IGttcF9nbG9iYWxfbG9jayBpcyBoZWxkIHVwb24gZW50cnkvZXhpdC4KKyAgICBzdGF0aWMgaW50IGxhc3RfaW5kZXggPSAwOworICAgIGlmICggKCBsYXN0X2luZGV4ID49IF9fa21wX251bV9sb2Nrc19pbl9ibG9jayApCisgICAgICB8fCAoIF9fa21wX2xvY2tfYmxvY2tzID09IE5VTEwgKSApIHsKKyAgICAgICAgLy8gUmVzdGFydCB0aGUgaW5kZXguCisgICAgICAgIGxhc3RfaW5kZXggPSAwOworICAgICAgICAvLyBOZWVkIHRvIGFsbG9jYXRlIGEgbmV3IGJsb2NrLgorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF91c2VyX2xvY2tfc2l6ZSA+IDAgKTsKKyAgICAgICAgc2l6ZV90IHNwYWNlX2Zvcl9sb2NrcyA9IF9fa21wX3VzZXJfbG9ja19zaXplICogX19rbXBfbnVtX2xvY2tzX2luX2Jsb2NrOworICAgICAgICBjaGFyKiBidWZmZXIgPSAoY2hhciopX19rbXBfYWxsb2NhdGUoIHNwYWNlX2Zvcl9sb2NrcyArIHNpemVvZigga21wX2Jsb2NrX29mX2xvY2tzICkgKTsKKyAgICAgICAgLy8gU2V0IHVwIHRoZSBuZXcgYmxvY2suCisgICAgICAgIGttcF9ibG9ja19vZl9sb2NrcyAqbmV3X2Jsb2NrID0gKGttcF9ibG9ja19vZl9sb2NrcyAqKSgmIGJ1ZmZlcltzcGFjZV9mb3JfbG9ja3NdKTsKKyAgICAgICAgbmV3X2Jsb2NrLT5uZXh0X2Jsb2NrID0gX19rbXBfbG9ja19ibG9ja3M7CisgICAgICAgIG5ld19ibG9jay0+bG9ja3MgPSAodm9pZCAqKWJ1ZmZlcjsKKyAgICAgICAgLy8gUHVibGlzaCB0aGUgbmV3IGJsb2NrLgorICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgX19rbXBfbG9ja19ibG9ja3MgPSBuZXdfYmxvY2s7CisgICAgfQorICAgIGttcF91c2VyX2xvY2tfcCByZXQgPSAoa21wX3VzZXJfbG9ja19wKSgmICggKCAoY2hhciAqKSggX19rbXBfbG9ja19ibG9ja3MtPmxvY2tzICkgKQorICAgICAgWyBsYXN0X2luZGV4ICogX19rbXBfdXNlcl9sb2NrX3NpemUgXSApICk7CisgICAgbGFzdF9pbmRleCsrOworICAgIHJldHVybiByZXQ7Cit9CisKKy8vCisvLyBHZXQgbWVtb3J5IGZvciBhIGxvY2suIEl0IG1heSBiZSBmcmVzaGx5IGFsbG9jYXRlZCBtZW1vcnkgb3IgcmV1c2VkIG1lbW9yeQorLy8gZnJvbSBsb2NrIHBvb2wuCisvLwora21wX3VzZXJfbG9ja19wCitfX2ttcF91c2VyX2xvY2tfYWxsb2NhdGUoIHZvaWQgKip1c2VyX2xvY2ssIGttcF9pbnQzMiBndGlkLAorICBrbXBfbG9ja19mbGFnc190IGZsYWdzICkKK3sKKyAgICBrbXBfdXNlcl9sb2NrX3AgbGNrOworICAgIGttcF9sb2NrX2luZGV4X3QgaW5kZXg7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdXNlcl9sb2NrICk7CisKKyAgICBfX2ttcF9hY3F1aXJlX2xvY2soICZfX2ttcF9nbG9iYWxfbG9jaywgZ3RpZCApOworCisgICAgaWYgKCBfX2ttcF9sb2NrX3Bvb2wgPT0gTlVMTCApIHsKKyAgICAgICAgLy8gTG9jayBwb29sIGlzIGVtcHR5LiBBbGxvY2F0ZSBuZXcgbWVtb3J5LgorICAgICAgICBpZiAoIF9fa21wX251bV9sb2Nrc19pbl9ibG9jayA8PSAxICkgeyAvLyBUdW5lIHRoaXMgY3V0b2ZmIHBvaW50LgorICAgICAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCkgX19rbXBfYWxsb2NhdGUoIF9fa21wX3VzZXJfbG9ja19zaXplICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBsY2sgPSBfX2ttcF9sb2NrX2Jsb2NrX2FsbG9jYXRlKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBJbnNlcnQgbG9jayBpbiB0aGUgdGFibGUgc28gdGhhdCBpdCBjYW4gYmUgZnJlZWQgaW4gX19rbXBfY2xlYW51cCwKKyAgICAgICAgLy8gYW5kIGRlYnVnZ2VyIGhhcyBpbmZvIG9uIGFsbCBhbGxvY2F0ZWQgbG9ja3MuCisgICAgICAgIGluZGV4ID0gX19rbXBfbG9ja190YWJsZV9pbnNlcnQoIGxjayApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLy8gUGljayB1cCBsb2NrIGZyb20gcG9vbC4KKyAgICAgICAgbGNrID0gX19rbXBfbG9ja19wb29sOworICAgICAgICBpbmRleCA9IF9fa21wX2xvY2tfcG9vbC0+cG9vbC5pbmRleDsKKyAgICAgICAgX19rbXBfbG9ja19wb29sID0gX19rbXBfbG9ja19wb29sLT5wb29sLm5leHQ7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBXZSBjb3VsZCBwb3RlbnRpYWxseSBkaWZmZXJlbnRpYXRlIGJldHdlZW4gbmVzdGVkIGFuZCByZWd1bGFyIGxvY2tzCisgICAgLy8gaGVyZSwgYW5kIGRvIHRoZSBsb2NrIHRhYmxlIGxvb2t1cCBmb3IgcmVndWxhciBsb2NrcyBvbmx5LgorICAgIC8vCisgICAgaWYgKCBPTVBfTE9DS19UX1NJWkUgPCBzaXplb2Yodm9pZCAqKSApIHsKKyAgICAgICAgKiAoIChrbXBfbG9ja19pbmRleF90ICopIHVzZXJfbG9jayApID0gaW5kZXg7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAqICggKGttcF91c2VyX2xvY2tfcCAqKSB1c2VyX2xvY2sgKSA9IGxjazsKKyAgICB9CisKKyAgICAvLyBtYXJrIHRoZSBsb2NrIGlmIGl0IGlzIGNyaXRpY2FsIHNlY3Rpb24gbG9jay4KKyAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX2ZsYWdzKCBsY2ssIGZsYWdzICk7CisKKyAgICBfX2ttcF9yZWxlYXNlX2xvY2soICYgX19rbXBfZ2xvYmFsX2xvY2ssIGd0aWQgKTsgLy8gQUM6IFRPRE86IG1vdmUgdGhpcyBsaW5lIHVwcGVyCisKKyAgICByZXR1cm4gbGNrOworfQorCisvLyBQdXQgbG9jaydzIG1lbW9yeSB0byBwb29sIGZvciByZXVzaW5nLgordm9pZAorX19rbXBfdXNlcl9sb2NrX2ZyZWUoIHZvaWQgKip1c2VyX2xvY2ssIGttcF9pbnQzMiBndGlkLCBrbXBfdXNlcl9sb2NrX3AgbGNrICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB1c2VyX2xvY2sgIT0gTlVMTCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIGxjayAhPSBOVUxMICk7CisKKyAgICBfX2ttcF9hY3F1aXJlX2xvY2soICYgX19rbXBfZ2xvYmFsX2xvY2ssIGd0aWQgKTsKKworICAgIGxjay0+cG9vbC5uZXh0ID0gX19rbXBfbG9ja19wb29sOworICAgIF9fa21wX2xvY2tfcG9vbCA9IGxjazsKKyAgICBpZiAoIE9NUF9MT0NLX1RfU0laRSA8IHNpemVvZih2b2lkICopICkgeworICAgICAgICBrbXBfbG9ja19pbmRleF90IGluZGV4ID0gKiAoIChrbXBfbG9ja19pbmRleF90ICopIHVzZXJfbG9jayApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAwIDwgaW5kZXggJiYgaW5kZXggPD0gX19rbXBfdXNlcl9sb2NrX3RhYmxlLnVzZWQgKTsKKyAgICAgICAgbGNrLT5wb29sLmluZGV4ID0gaW5kZXg7CisgICAgfQorCisgICAgX19rbXBfcmVsZWFzZV9sb2NrKCAmIF9fa21wX2dsb2JhbF9sb2NrLCBndGlkICk7Cit9CisKK2ttcF91c2VyX2xvY2tfcAorX19rbXBfbG9va3VwX3VzZXJfbG9jayggdm9pZCAqKnVzZXJfbG9jaywgY2hhciBjb25zdCAqZnVuYyApCit7CisgICAga21wX3VzZXJfbG9ja19wIGxjayA9IE5VTEw7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgaWYgKCB1c2VyX2xvY2sgPT0gTlVMTCApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCBPTVBfTE9DS19UX1NJWkUgPCBzaXplb2Yodm9pZCAqKSApIHsKKyAgICAgICAga21wX2xvY2tfaW5kZXhfdCBpbmRleCA9ICooIChrbXBfbG9ja19pbmRleF90ICopdXNlcl9sb2NrICk7CisgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAgICAgaWYgKCAhICggMCA8IGluZGV4ICYmIGluZGV4IDwgX19rbXBfdXNlcl9sb2NrX3RhYmxlLnVzZWQgKSApIHsKKyAgICAgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAwIDwgaW5kZXggJiYgaW5kZXggPCBfX2ttcF91c2VyX2xvY2tfdGFibGUudXNlZCApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF91c2VyX2xvY2tfc2l6ZSA+IDAgKTsKKyAgICAgICAgbGNrID0gX19rbXBfdXNlcl9sb2NrX3RhYmxlLnRhYmxlW2luZGV4XTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGxjayA9ICooIChrbXBfdXNlcl9sb2NrX3AgKil1c2VyX2xvY2sgKTsKKyAgICB9CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgaWYgKCBsY2sgPT0gTlVMTCApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGxjazsKK30KKwordm9pZAorX19rbXBfY2xlYW51cF91c2VyX2xvY2tzKCB2b2lkICkKK3sKKyAgICAvLworICAgIC8vIFJlc2V0IGxvY2sgcG9vbC4gRG8gbm90IHdvcnJ5IGFib3V0IGxvY2sgaW4gdGhlIHBvb2wgLS0gd2Ugd2lsbCBmcmVlCisgICAgLy8gdGhlbSB3aGVuIGl0ZXJhdGluZyB0aHJvdWdoIGxvY2sgdGFibGUgKGl0IGluY2x1ZGVzIGFsbCB0aGUgbG9ja3MsCisgICAgLy8gZGVhZCBvciBhbGl2ZSkuCisgICAgLy8KKyAgICBfX2ttcF9sb2NrX3Bvb2wgPSBOVUxMOworCisjZGVmaW5lIElTX0NSSVRJQ0FMKGxjaykgXAorICAgICAgICAoICggX19rbXBfZ2V0X3VzZXJfbG9ja19mbGFnc18gIT0gTlVMTCApICYmIFwKKyAgICAgICAgKCAoICpfX2ttcF9nZXRfdXNlcl9sb2NrX2ZsYWdzXyApKCBsY2sgKSAmIGttcF9sZl9jcml0aWNhbF9zZWN0aW9uICkgKQorCisgICAgLy8KKyAgICAvLyBMb29wIHRocm91Z2ggbG9jayB0YWJsZSwgZnJlZSBhbGwgbG9ja3MuCisgICAgLy8KKyAgICAvLyBEbyBub3QgZnJlZSBpdGVtIFswXSwgaXQgaXMgcmVzZXJ2ZWQgZm9yIGxvY2sgdGFibGVzIGxpc3QuCisgICAgLy8KKyAgICAvLyBGSVhNRSAtIHdlIGFyZSBpdGVyYXRpbmcgdGhyb3VnaCBhIGxpc3Qgb2YgKHBvaW50ZXJzIHRvKSBvYmplY3RzIG9mCisgICAgLy8gdHlwZSB1bmlvbiBrbXBfdXNlcl9sb2NrLCBidXQgd2UgaGF2ZSBubyB3YXkgb2Yga25vd2luZyB3aGV0aGVyIHRoZQorICAgIC8vIGJhc2UgdHlwZSBpcyBjdXJyZW50bHkgInBvb2wiIG9yIHdoYXRldmVyIHRoZSBnbG9iYWwgdXNlciBsb2NrIHR5cGUKKyAgICAvLyBpcy4KKyAgICAvLworICAgIC8vIFdlIGFyZSByZWx5aW5nIG9uIHRoZSBmYWN0IHRoYXQgZm9yIGFsbCBvZiB0aGUgdXNlciBsb2NrIHR5cGVzCisgICAgLy8gKGV4Y2VwdCAidGFzIiksIHRoZSBmaXJzdCBmaWVsZCBpbiB0aGUgbG9jayBzdHJ1Y3QgaXMgdGhlICJpbml0aWFsaXplZCIKKyAgICAvLyBmaWVsZCwgd2hpY2ggaXMgc2V0IHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBsb2NrIG9iamVjdCBpdHNlbGYgd2hlbgorICAgIC8vIHRoZSBsb2NrIGlzIGluaXRpYWxpemVkLiAgV2hlbiB0aGUgdW5pb24gaXMgb2YgdHlwZSAicG9vbCIsIHRoZQorICAgIC8vIGZpcnN0IGZpZWxkIGlzIGEgcG9pbnRlciB0byB0aGUgbmV4dCBvYmplY3QgaW4gdGhlIGZyZWUgbGlzdCwgd2hpY2gKKyAgICAvLyB3aWxsIG5vdCBiZSB0aGUgc2FtZSBhZGRyZXNzIGFzIHRoZSBvYmplY3QgaXRzZWxmLgorICAgIC8vCisgICAgLy8gVGhpcyBtZWFucyB0aGF0IHRoZSBjaGVjayAoICpfX2ttcF9pc191c2VyX2xvY2tfaW5pdGlhbGl6ZWRfICkoIGxjayApCisgICAgLy8gd2lsbCBmYWlsIGZvciAicG9vbCIgb2JqZWN0cyBvbiB0aGUgZnJlZSBsaXN0LiAgVGhpcyBtdXN0IGhhcHBlbiBhcworICAgIC8vIHRoZSAibG9jYXRpb24iIGZpZWxkIG9mIHJlYWwgdXNlciBsb2NrcyBvdmVybGFwcyB0aGUgImluZGV4IiBmaWVsZAorICAgIC8vIG9mICJwb29sIiBvYmplY3RzLgorICAgIC8vCisgICAgLy8gSXQgd291bGQgYmUgYmV0dGVyIHRvIHJ1biB0aHJvdWdoIHRoZSBmcmVlIGxpc3QsIGFuZCByZW1vdmUgYWxsICJwb29sIgorICAgIC8vIG9iamVjdHMgZnJvbSB0aGUgbG9jayB0YWJsZSBiZWZvcmUgZXhlY3V0aW5nIHRoaXMgbG9vcC4gIEhvd2V2ZXIsCisgICAgLy8gInBvb2wiIG9iamVjdHMgZG8gbm90IGFsd2F5cyBoYXZlIHRoZWlyIGluZGV4IGZpZWxkIHNldCAob25seSBvbgorICAgIC8vIGxpbl8zMmUpLCBhbmQgSSBkb24ndCB3YW50IHRvIHNlYXJjaCB0aGUgbG9jayB0YWJsZSBmb3IgdGhlIGFkZHJlc3MKKyAgICAvLyBvZiBldmVyeSAicG9vbCIgb2JqZWN0IG9uIHRoZSBmcmVlIGxpc3QuCisgICAgLy8KKyAgICB3aGlsZSAoIF9fa21wX3VzZXJfbG9ja190YWJsZS51c2VkID4gMSApIHsKKyAgICAgICAgY29uc3QgaWRlbnQgKmxvYzsKKworICAgICAgICAvLworICAgICAgICAvLyByZWR1Y2UgX19rbXBfdXNlcl9sb2NrX3RhYmxlLnVzZWQgYmVmb3JlIGZyZWVpbmcgdGhlIGxvY2ssCisgICAgICAgIC8vIHNvIHRoYXQgc3RhdGUgb2YgbG9ja3MgaXMgY29uc2lzdGVudAorICAgICAgICAvLworICAgICAgICBrbXBfdXNlcl9sb2NrX3AgbGNrID0gX19rbXBfdXNlcl9sb2NrX3RhYmxlLnRhYmxlWworICAgICAgICAgIC0tX19rbXBfdXNlcl9sb2NrX3RhYmxlLnVzZWQgXTsKKworICAgICAgICBpZiAoICggX19rbXBfaXNfdXNlcl9sb2NrX2luaXRpYWxpemVkXyAhPSBOVUxMICkgJiYKKyAgICAgICAgICAoICpfX2ttcF9pc191c2VyX2xvY2tfaW5pdGlhbGl6ZWRfICkoIGxjayApICkgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIElzc3VlIGEgd2FybmluZyBpZjogS01QX0NPTlNJU1RFTkNZX0NIRUNLIEFORCBsb2NrIGlzCisgICAgICAgICAgICAvLyBpbml0aWFsaXplZCBBTkQgaXQgaXMgTk9UIGEgY3JpdGljYWwgc2VjdGlvbiAodXNlciBpcyBub3QKKyAgICAgICAgICAgIC8vIHJlc3BvbnNpYmxlIGZvciBkZXN0cm95aW5nIGNyaXRpY2FscykgQU5EIHdlIGtub3cgc291cmNlCisgICAgICAgICAgICAvLyBsb2NhdGlvbiB0byByZXBvcnQuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgJiYgKCAhIElTX0NSSVRJQ0FMKCBsY2sgKSApICYmCisgICAgICAgICAgICAgICggKCBsb2MgPSBfX2ttcF9nZXRfdXNlcl9sb2NrX2xvY2F0aW9uKCBsY2sgKSApICE9IE5VTEwgKSAmJgorICAgICAgICAgICAgICAoIGxvYy0+cHNvdXJjZSAhPSBOVUxMICkgKSB7CisgICAgICAgICAgICAgICAga21wX3N0cl9sb2NfdCBzdHJfbG9jID0gX19rbXBfc3RyX2xvY19pbml0KCBsb2MtPnBzb3VyY2UsIDAgKTsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQ25zTG9ja05vdERlc3Ryb3llZCwgc3RyX2xvYy5maWxlLCBzdHJfbG9jLmxpbmUgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfbG9jX2ZyZWUoICZzdHJfbG9jKTsKKyAgICAgICAgICAgIH0KKworI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgaWYgKCBJU19DUklUSUNBTCggbGNrICkgKSB7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2NsZWFudXBfdXNlcl9sb2NrczogZnJlZSBjcml0aWNhbCBzZWN0aW9uIGxvY2sgJXAgKCVwKVxuIiwgbGNrLCAqKHZvaWQqKilsY2sgKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2NsZWFudXBfdXNlcl9sb2NrczogZnJlZSBsb2NrICVwICglcClcbiIsIGxjaywgKih2b2lkKiopbGNrICkgKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBLTVBfREVCVUcKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIENsZWFudXAgaW50ZXJuYWwgbG9jayBkeW5hbWljIHJlc291cmNlcworICAgICAgICAgICAgLy8gKGZvciBkcmRwYSBsb2NrcyBwYXJ0aWN1bGFybHkpLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIF9fa21wX2Rlc3Ryb3lfdXNlcl9sb2NrKCBsY2sgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIEZyZWUgdGhlIGxvY2sgaWYgYmxvY2sgYWxsb2NhdGlvbiBvZiBsb2NrcyBpcyBub3QgdXNlZC4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCBfX2ttcF9sb2NrX2Jsb2NrcyA9PSBOVUxMICkgeworICAgICAgICAgICAgX19rbXBfZnJlZSggbGNrICk7CisgICAgICAgIH0KKyAgICB9CisKKyN1bmRlZiBJU19DUklUSUNBTAorCisgICAgLy8KKyAgICAvLyBkZWxldGUgbG9jayB0YWJsZShzKS4KKyAgICAvLworICAgIGttcF91c2VyX2xvY2tfcCAqdGFibGVfcHRyID0gX19rbXBfdXNlcl9sb2NrX3RhYmxlLnRhYmxlOworICAgIF9fa21wX3VzZXJfbG9ja190YWJsZS50YWJsZSA9IE5VTEw7CisgICAgX19rbXBfdXNlcl9sb2NrX3RhYmxlLmFsbG9jYXRlZCA9IDA7CisKKyAgICB3aGlsZSAoIHRhYmxlX3B0ciAhPSBOVUxMICkgeworICAgICAgICAvLworICAgICAgICAvLyBJbiB0aGUgZmlyc3QgZWxlbWVudCB3ZSBzYXZlZCB0aGUgcG9pbnRlciB0byB0aGUgcHJldmlvdXMKKyAgICAgICAgLy8gKHNtYWxsZXIpIGxvY2sgdGFibGUuCisgICAgICAgIC8vCisgICAgICAgIGttcF91c2VyX2xvY2tfcCAqbmV4dCA9IChrbXBfdXNlcl9sb2NrX3AgKikoIHRhYmxlX3B0clsgMCBdICk7CisgICAgICAgIF9fa21wX2ZyZWUoIHRhYmxlX3B0ciApOworICAgICAgICB0YWJsZV9wdHIgPSBuZXh0OworICAgIH0KKworICAgIC8vCisgICAgLy8gRnJlZSBidWZmZXJzIGFsbG9jYXRlZCBmb3IgYmxvY2tzIG9mIGxvY2tzLgorICAgIC8vCisgICAga21wX2Jsb2NrX29mX2xvY2tzX3QgKmJsb2NrX3B0ciA9IF9fa21wX2xvY2tfYmxvY2tzOworICAgIF9fa21wX2xvY2tfYmxvY2tzID0gTlVMTDsKKworICAgIHdoaWxlICggYmxvY2tfcHRyICE9IE5VTEwgKSB7CisgICAgICAgIGttcF9ibG9ja19vZl9sb2Nrc190ICpuZXh0ID0gYmxvY2tfcHRyLT5uZXh0X2Jsb2NrOworICAgICAgICBfX2ttcF9mcmVlKCBibG9ja19wdHItPmxvY2tzICk7CisgICAgICAgIC8vCisgICAgICAgIC8vICpibG9ja19wdHIgaXRzZWxmIHdhcyBhbGxvY2F0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgbG9ja3MgdmVjdG9yLgorICAgICAgICAvLworCWJsb2NrX3B0ciA9IG5leHQ7CisgICAgfQorCisgICAgVENXXzQoX19rbXBfaW5pdF91c2VyX2xvY2tzLCBGQUxTRSk7Cit9CisKKyNlbmRpZiAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2xvY2suaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9sb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNkMDFkMwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9sb2NrLmgKQEAgLTAsMCArMSwxMjczIEBACisvKgorICoga21wX2xvY2suaCAtLSBsb2NrIGhlYWRlciBmaWxlCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX0xPQ0tfSAorI2RlZmluZSBLTVBfTE9DS19ICisKKyNpbmNsdWRlIDxsaW1pdHMuaD4gICAgLy8gQ0hBUl9CSVQKKyNpbmNsdWRlIDxzdGRkZWYuaD4gICAgLy8gb2Zmc2V0b2YKKworI2luY2x1ZGUgImttcF9vcy5oIgorI2luY2x1ZGUgImttcF9kZWJ1Zy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhhdmUgdG8gY29weSB0aGVzZSBkZWZpbml0aW9ucyBmcm9tIGttcC5oIGJlY2F1c2Uga21wLmggY2Fubm90IGJlIGluY2x1ZGVkCisvLyBkdWUgdG8gY2lyY3VsYXIgZGVwZW5kZW5jaWVzLiAgV2lsbCB1bmRlZiB0aGVzZSBhdCBlbmQgb2YgZmlsZS4KKworI2RlZmluZSBLTVBfUEFEKHR5cGUsIHN6KSAgICAgKHNpemVvZih0eXBlKSArIChzeiAtICgoc2l6ZW9mKHR5cGUpIC0gMSkgJSAoc3opKSAtIDEpKQorI2RlZmluZSBLTVBfR1RJRF9ETkUgKC0yKQorCisvLyBGb3J3YXJkIGRlY2xhcmF0aW9uIG9mIGlkZW50IGFuZCBpZGVudF90CisKK3N0cnVjdCBpZGVudDsKK3R5cGVkZWYgc3RydWN0IGlkZW50IGlkZW50X3Q7CisKKy8vIEVuZCBvZiBjb3BpZWQgY29kZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8KKy8vIFdlIG5lZWQgdG8ga25vdyB0aGUgc2l6ZSBvZiB0aGUgYXJlYSB3ZSBjYW4gYXNzdW1lIHRoYXQgdGhlIGNvbXBpbGVyKHMpCisvLyBhbGxvY2F0ZWQgZm9yIG9iZWN0cyBvZiB0eXBlIG9tcF9sb2NrX3QgYW5kIG9tcF9uZXN0X2xvY2tfdC4gIFRoZSBJbnRlbAorLy8gY29tcGlsZXIgYWx3YXlzIGFsbG9jYXRlcyBhIHBvaW50ZXItc2l6ZWQgYXJlYSwgYXMgZG9lcyB2aXN1YWwgc3R1ZGlvLgorLy8KKy8vIGdjYyBob3dldmVyLCBvbmx5IGFsbG9jYXRlcyA0IGJ5dGVzIGZvciByZWd1bGFyIGxvY2tzLCBldmVuIG9uIDY0LWJpdAorLy8gaW50ZWwgYXJjaHMuICBJdCBhbGxvY2F0ZXMgYXQgbGVhc3QgOCBieXRlcyBmb3IgbmVzdGVkIGxvY2sgKG1vcmUgb24KKy8vIHJlY2VudCB2ZXJzaW9ucyksIGJ1dCB3ZSBhcmUgYm91bmRlZCBieSB0aGUgcG9pbnRlci1zaXplZCBjaHVua3MgdGhhdAorLy8gdGhlIEludGVsIGNvbXBpbGVyIGFsbG9jYXRlcy4KKy8vCisKKyNpZiBLTVBfT1NfTElOVVggJiYgZGVmaW5lZChLTVBfR09NUF9DT01QQVQpCisjIGRlZmluZSBPTVBfTE9DS19UX1NJWkUgICAgICAgIHNpemVvZihpbnQpCisjIGRlZmluZSBPTVBfTkVTVF9MT0NLX1RfU0laRSAgIHNpemVvZih2b2lkICopCisjZWxzZQorIyBkZWZpbmUgT01QX0xPQ0tfVF9TSVpFICAgICAgICBzaXplb2Yodm9pZCAqKQorIyBkZWZpbmUgT01QX05FU1RfTE9DS19UX1NJWkUgICBzaXplb2Yodm9pZCAqKQorI2VuZGlmCisKKy8vCisvLyBUaGUgSW50ZWwgY29tcGlsZXIgYWxsb2NhdGVzIGEgMzItYnl0ZSBjaHVuayBmb3IgYSBjcml0aWNhbCBzZWN0aW9uLgorLy8gQm90aCBnY2MgYW5kIHZpc3VhbCBzdHVkaW8gb25seSBhbGxvY2F0ZSBlbm91Z2ggc3BhY2UgZm9yIGEgcG9pbnRlci4KKy8vIFNvbWV0aW1lcyB3ZSBrbm93IHRoYXQgdGhlIHNwYWNlIHdhcyBhbGxvY2F0ZWQgYnkgdGhlIEludGVsIGNvbXBpbGVyLgorLy8KKyNkZWZpbmUgT01QX0NSSVRJQ0FMX1NJWkUgICAgICAgc2l6ZW9mKHZvaWQgKikKKyNkZWZpbmUgSU5URUxfQ1JJVElDQUxfU0laRSAgICAgMzIKKworLy8KKy8vIGxvY2sgZmxhZ3MKKy8vCit0eXBlZGVmIGttcF91aW50MzIga21wX2xvY2tfZmxhZ3NfdDsKKworI2RlZmluZSBrbXBfbGZfY3JpdGljYWxfc2VjdGlvbiAxCisKKy8vCisvLyBXaGVuIGEgbG9jayB0YWJsZSBpcyB1c2VkLCB0aGUgaW5kaWNlcyBhcmUgb2Yga21wX2xvY2tfaW5kZXhfdAorLy8KK3R5cGVkZWYga21wX3VpbnQzMiBrbXBfbG9ja19pbmRleF90OworCisvLworLy8gV2hlbiBtZW1vcnkgYWxsb2NhdGVkIGZvciBsb2NrcyBhcmUgb24gdGhlIGxvY2sgcG9vbCAoZnJlZSBsaXN0KSwKKy8vIGl0IGlzIHRyZWF0ZWQgYXMgc3RydWN0cyBvZiB0aGlzIHR5cGUuCisvLworc3RydWN0IGttcF9sb2NrX3Bvb2wgeworICAgIHVuaW9uIGttcF91c2VyX2xvY2sgKm5leHQ7CisgICAga21wX2xvY2tfaW5kZXhfdCBpbmRleDsKK307CisKK3R5cGVkZWYgc3RydWN0IGttcF9sb2NrX3Bvb2wga21wX2xvY2tfcG9vbF90OworCisKK2V4dGVybiB2b2lkIF9fa21wX3ZhbGlkYXRlX2xvY2tzKCB2b2lkICk7CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICBUaGVyZSBhcmUgNSBsb2NrIGltcGxlbWVudGF0aW9uczoKKy8vCisvLyAgICAgICAxLiBUZXN0IGFuZCBzZXQgbG9ja3MuCisvLyAgICAgICAyLiBmdXRleCBsb2NrcyAoTGludXgqIE9TIG9uIHg4NiBhbmQgSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgYXJjaGl0ZWN0dXJlKQorLy8gICAgICAgMy4gVGlja2V0IChMYW1wb3J0IGJha2VyeSkgbG9ja3MuCisvLyAgICAgICA0LiBRdWV1aW5nIGxvY2tzICh3aXRoIHNlcGFyYXRlIHNwaW4gZmllbGRzKS4KKy8vICAgICAgIDUuIERSUEEgKER5bmFtaWNhbGx5IFJlY29uZmlndXJhYmxlIERpc3RyaWJ1dGVkIFBvbGxpbmcgQXJlYSkgbG9ja3MKKy8vCisvLyAgIGFuZCAzIGxvY2sgcHVycG9zZXM6CisvLworLy8gICAgICAgMS4gQm9vdHN0cmFwIGxvY2tzIC0tIFVzZWQgZm9yIGEgZmV3IGxvY2tzIGF2YWlsYWJsZSBhdCBsaWJyYXJ5IHN0YXJ0dXAtc2h1dGRvd24gdGltZS4KKy8vICAgICAgICAgIFRoZXNlIGRvIG5vdCByZXF1aXJlIG5vbi1uZWdhdGl2ZSBnbG9iYWwgdGhyZWFkIElEJ3MuCisvLyAgICAgICAyLiBJbnRlcm5hbCBSVEwgbG9ja3MgLS0gVXNlZCBldmVyeXdoZXJlIGVsc2UgaW4gdGhlIFJUTAorLy8gICAgICAgMy4gVXNlciBsb2NrcyAoaW5jbHVkZXMgY3JpdGljYWwgc2VjdGlvbnMpCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIExvY2sgaW1wbGVtZW50YXRpb25zLgorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRlc3QgYW5kIHNldCBsb2Nrcy4KKy8vCisvLyBOb24tbmVzdGVkIHRlc3QgYW5kIHNldCBsb2NrcyBkaWZmZXIgZnJvbSB0aGUgb3RoZXIgbG9jayBraW5kcyAoZXhjZXB0CisvLyBmdXRleCkgaW4gdGhhdCB3ZSB1c2UgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgYnkgdGhlIGNvbXBpbGVyIGZvciB0aGUgbG9jaywKKy8vIHJhdGhlciB0aGFuIGEgcG9pbnRlciB0byBpdC4KKy8vCisvLyBPbiBsaW4zMiwgbGluXzMyZSwgYW5kIHdpbl8zMiwgdGhlIHNwYWNlIGFsbG9jYXRlZCBtYXkgYmUgYXMgc21hbGwgYXMgNAorLy8gYnl0ZXMsIHNvIHdlIGhhdmUgdG8gdXNlIGEgbG9jayB0YWJsZSBmb3IgbmVzdGVkIGxvY2tzLCBhbmQgYXZvaWQgYWNjZXNzaW5nCisvLyB0aGUgZGVwdGhfbG9ja2VkIGZpZWxkIGZvciBub24tbmVzdGVkIGxvY2tzLgorLy8KKy8vIEluZm9ybWF0aW9uIG5vcm1hbGx5IGF2YWlsYWJsZSB0byB0aGUgdG9vbHMsIHN1Y2ggYXMgbG9jayBsb2NhdGlvbiwKKy8vIGxvY2sgdXNhZ2UgKG5vcm1hbCBsb2NrIHZzLiBjcml0aWNhbCBzZWN0aW9uKSwgZXRjLiBpcyBub3QgYXZhaWxhYmxlIHdpdGgKKy8vIHRlc3QgYW5kIHNldCBsb2Nrcy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RydWN0IGttcF9iYXNlX3Rhc19sb2NrIHsKKyAgICB2b2xhdGlsZSBrbXBfaW50MzIgcG9sbDsgICAgICAgICAvLyAwID0+IHVubG9ja2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9ja2VkOiAoZ3RpZCsxKSBvZiBvd25pbmcgdGhyZWFkCisgICAga21wX2ludDMyICAgICAgICAgIGRlcHRoX2xvY2tlZDsgLy8gZGVwdGggbG9ja2VkLCBmb3IgbmVzdGVkIGxvY2tzIG9ubHkKK307CisKK3R5cGVkZWYgc3RydWN0IGttcF9iYXNlX3Rhc19sb2NrIGttcF9iYXNlX3Rhc19sb2NrX3Q7CisKK3VuaW9uIGttcF90YXNfbG9jayB7CisgICAga21wX2Jhc2VfdGFzX2xvY2tfdCBsazsKKyAgICBrbXBfbG9ja19wb29sX3QgcG9vbDsgICAvLyBtYWtlIGNlcnRhaW4gc3RydWN0IGlzIGxhcmdlIGVub3VnaAorICAgIGRvdWJsZSBsa19hbGlnbjsgICAgICAgIC8vIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIGNhY2hlIGxpbmUgcGFkZGluZworfTsKKwordHlwZWRlZiB1bmlvbiBrbXBfdGFzX2xvY2sga21wX3Rhc19sb2NrX3Q7CisKKy8vCisvLyBTdGF0aWMgaW5pdGlhbGl6ZXIgZm9yIHRlc3QgYW5kIHNldCBsb2NrIHZhcmlhYmxlcy4gVXNhZ2U6CisvLyAgICBrbXBfdGFzX2xvY2tfdCB4bG9jayA9IEtNUF9UQVNfTE9DS19JTklUSUFMSVpFUiggeGxvY2sgKTsKKy8vCisjZGVmaW5lIEtNUF9UQVNfTE9DS19JTklUSUFMSVpFUiggbG9jayApIHsgeyAwLCAwIH0gfQorCitleHRlcm4gaW50IF9fa21wX2FjcXVpcmVfdGFzX2xvY2soIGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gaW50IF9fa21wX3Rlc3RfdGFzX2xvY2soIGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gaW50IF9fa21wX3JlbGVhc2VfdGFzX2xvY2soIGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbml0X3Rhc19sb2NrKCBrbXBfdGFzX2xvY2tfdCAqbGNrICk7CitleHRlcm4gdm9pZCBfX2ttcF9kZXN0cm95X3Rhc19sb2NrKCBrbXBfdGFzX2xvY2tfdCAqbGNrICk7CisKK2V4dGVybiBpbnQgX19rbXBfYWNxdWlyZV9uZXN0ZWRfdGFzX2xvY2soIGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gaW50IF9fa21wX3Rlc3RfbmVzdGVkX3Rhc19sb2NrKCBrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIGludCBfX2ttcF9yZWxlYXNlX25lc3RlZF90YXNfbG9jaygga21wX3Rhc19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2luaXRfbmVzdGVkX3Rhc19sb2NrKCBrbXBfdGFzX2xvY2tfdCAqbGNrICk7CitleHRlcm4gdm9pZCBfX2ttcF9kZXN0cm95X25lc3RlZF90YXNfbG9jaygga21wX3Rhc19sb2NrX3QgKmxjayApOworCisjZGVmaW5lIEtNUF9MT0NLX1JFTEVBU0VEICAgICAgIDEKKyNkZWZpbmUgS01QX0xPQ0tfU1RJTExfSEVMRCAgICAgMAorI2RlZmluZSBLTVBfTE9DS19BQ1FVSVJFRF9GSVJTVCAxCisjZGVmaW5lIEtNUF9MT0NLX0FDUVVJUkVEX05FWFQgIDAKKworI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnV0ZXggbG9ja3MuICBmdXRleCBsb2NrcyBhcmUgb25seSBhdmFpbGFibGUgb24gTGludXgqIE9TLgorLy8KKy8vIExpa2Ugbm9uLW5lc3RlZCB0ZXN0IGFuZCBzZXQgbG9jaywgbm9uLW5lc3RlZCBmdXRleCBsb2NrcyB1c2UgdGhlIG1lbW9yeQorLy8gYWxsb2NhdGVkIGJ5IHRoZSBjb21waWxlciBmb3IgdGhlIGxvY2ssIHJhdGhlciB0aGFuIGEgcG9pbnRlciB0byBpdC4KKy8vCisvLyBJbmZvcm1hdGlvbiBub3JtYWxseSBhdmFpbGFibGUgdG8gdGhlIHRvb2xzLCBzdWNoIGFzIGxvY2sgbG9jYXRpb24sCisvLyBsb2NrIHVzYWdlIChub3JtYWwgbG9jayB2cy4gY3JpdGljYWwgc2VjdGlvbiksIGV0Yy4gaXMgbm90IGF2YWlsYWJsZSB3aXRoCisvLyB0ZXN0IGFuZCBzZXQgbG9ja3MuICBXaXRoIG5vbi1uZXN0ZWQgZnV0ZXggbG9ja3MsIHRoZSBsb2NrIG93bmVyIGlzIG5vdAorLy8gZXZlbiBhdmFpbGFibGUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0cnVjdCBrbXBfYmFzZV9mdXRleF9sb2NrIHsKKyAgICB2b2xhdGlsZSBrbXBfaW50MzIgcG9sbDsgICAgICAgICAvLyAwID0+IHVubG9ja2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMiooZ3RpZCsxKSBvZiBvd25pbmcgdGhyZWFkLCAwIGlmIHVubG9ja2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9ja2VkOiAoZ3RpZCsxKSBvZiBvd25pbmcgdGhyZWFkCisgICAga21wX2ludDMyICAgICAgICAgIGRlcHRoX2xvY2tlZDsgLy8gZGVwdGggbG9ja2VkLCBmb3IgbmVzdGVkIGxvY2tzIG9ubHkKK307CisKK3R5cGVkZWYgc3RydWN0IGttcF9iYXNlX2Z1dGV4X2xvY2sga21wX2Jhc2VfZnV0ZXhfbG9ja190OworCit1bmlvbiBrbXBfZnV0ZXhfbG9jayB7CisgICAga21wX2Jhc2VfZnV0ZXhfbG9ja190IGxrOworICAgIGttcF9sb2NrX3Bvb2xfdCBwb29sOyAgIC8vIG1ha2UgY2VydGFpbiBzdHJ1Y3QgaXMgbGFyZ2UgZW5vdWdoCisgICAgZG91YmxlIGxrX2FsaWduOyAgICAgICAgLy8gdXNlIHdvcnN0IGNhc2UgYWxpZ25tZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gY2FjaGUgbGluZSBwYWRkaW5nCit9OworCit0eXBlZGVmIHVuaW9uIGttcF9mdXRleF9sb2NrIGttcF9mdXRleF9sb2NrX3Q7CisKKy8vCisvLyBTdGF0aWMgaW5pdGlhbGl6ZXIgZm9yIGZ1dGV4IGxvY2sgdmFyaWFibGVzLiBVc2FnZToKKy8vICAgIGttcF9mdXRleF9sb2NrX3QgeGxvY2sgPSBLTVBfRlVURVhfTE9DS19JTklUSUFMSVpFUiggeGxvY2sgKTsKKy8vCisjZGVmaW5lIEtNUF9GVVRFWF9MT0NLX0lOSVRJQUxJWkVSKCBsb2NrICkgeyB7IDAsIDAgfSB9CisKK2V4dGVybiBpbnQgX19rbXBfYWNxdWlyZV9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gaW50IF9fa21wX3Rlc3RfZnV0ZXhfbG9jaygga21wX2Z1dGV4X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIGludCBfX2ttcF9yZWxlYXNlX2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2luaXRfZnV0ZXhfbG9jaygga21wX2Z1dGV4X2xvY2tfdCAqbGNrICk7CitleHRlcm4gdm9pZCBfX2ttcF9kZXN0cm95X2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKmxjayApOworCitleHRlcm4gaW50IF9fa21wX2FjcXVpcmVfbmVzdGVkX2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiBpbnQgX19rbXBfdGVzdF9uZXN0ZWRfZnV0ZXhfbG9jaygga21wX2Z1dGV4X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIGludCBfX2ttcF9yZWxlYXNlX25lc3RlZF9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbml0X25lc3RlZF9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICpsY2sgKTsKK2V4dGVybiB2b2lkIF9fa21wX2Rlc3Ryb3lfbmVzdGVkX2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKmxjayApOworCisjZW5kaWYgLy8gS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRpY2tldCBsb2Nrcy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RydWN0IGttcF9iYXNlX3RpY2tldF9sb2NrIHsKKyAgICAvLyBgaW5pdGlhbGl6ZWQnIG11c3QgYmUgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBsb2NrIGRhdGEgc3RydWN0dXJlIQorICAgIHZvbGF0aWxlIHVuaW9uIGttcF90aWNrZXRfbG9jayAqIGluaXRpYWxpemVkOyAgLy8gcG9pbnRzIHRvIHRoZSBsb2NrIHVuaW9uIGlmIGluIGluaXRpYWxpemVkIHN0YXRlCisgICAgaWRlbnRfdCBjb25zdCAqICAgICBsb2NhdGlvbjsgICAgIC8vIFNvdXJjZSBjb2RlIGxvY2F0aW9uIG9mIG9tcF9pbml0X2xvY2soKS4KKyAgICB2b2xhdGlsZSBrbXBfdWludDMyIG5leHRfdGlja2V0OyAgLy8gdGlja2V0IG51bWJlciB0byBnaXZlIHRvIG5leHQgdGhyZWFkIHdoaWNoIGFjcXVpcmVzCisgICAgdm9sYXRpbGUga21wX3VpbnQzMiBub3dfc2VydmluZzsgIC8vIHRpY2tldCBudW1iZXIgZm9yIHRocmVhZCB3aGljaCBob2xkcyB0aGUgbG9jaworICAgIHZvbGF0aWxlIGttcF9pbnQzMiAgb3duZXJfaWQ7ICAgICAvLyAoZ3RpZCsxKSBvZiBvd25pbmcgdGhyZWFkLCAwIGlmIHVubG9ja2VkCisgICAga21wX2ludDMyICAgICAgICAgICBkZXB0aF9sb2NrZWQ7IC8vIGRlcHRoIGxvY2tlZCwgZm9yIG5lc3RlZCBsb2NrcyBvbmx5CisgICAga21wX2xvY2tfZmxhZ3NfdCAgICBmbGFnczsgICAgICAgIC8vIGxvY2sgc3BlY2lmaWNzLCBlLmcuIGNyaXRpY2FsIHNlY3Rpb24gbG9jaworfTsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2Jhc2VfdGlja2V0X2xvY2sga21wX2Jhc2VfdGlja2V0X2xvY2tfdDsKKwordW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF90aWNrZXRfbG9jayB7CisgICAga21wX2Jhc2VfdGlja2V0X2xvY2tfdCBsazsgICAgICAgLy8gVGhpcyBmaWVsZCBtdXN0IGJlIGZpcnN0IHRvIGFsbG93IHN0YXRpYyBpbml0aWFsaXppbmcuCisgICAga21wX2xvY2tfcG9vbF90IHBvb2w7CisgICAgZG91YmxlICAgICAgICAgICAgICAgICBsa19hbGlnbjsgLy8gdXNlIHdvcnN0IGNhc2UgYWxpZ25tZW50CisgICAgY2hhciAgICAgICAgICAgICAgICAgICBsa19wYWRbIEtNUF9QQUQoIGttcF9iYXNlX3RpY2tldF9sb2NrX3QsIENBQ0hFX0xJTkUgKSBdOworfTsKKwordHlwZWRlZiB1bmlvbiBrbXBfdGlja2V0X2xvY2sga21wX3RpY2tldF9sb2NrX3Q7CisKKy8vCisvLyBTdGF0aWMgaW5pdGlhbGl6ZXIgZm9yIHNpbXBsZSB0aWNrZXQgbG9jayB2YXJpYWJsZXMuIFVzYWdlOgorLy8gICAga21wX3RpY2tldF9sb2NrX3QgeGxvY2sgPSBLTVBfVElDS0VUX0xPQ0tfSU5JVElBTElaRVIoIHhsb2NrICk7CisvLyBOb3RlIHRoZSBtYWNybyBhcmd1bWVudC4gSXQgaXMgaW1wb3J0YW50IHRvIG1ha2UgdmFyIHByb3Blcmx5IGluaXRpYWxpemVkLgorLy8KKyNkZWZpbmUgS01QX1RJQ0tFVF9MT0NLX0lOSVRJQUxJWkVSKCBsb2NrICkgeyB7IChrbXBfdGlja2V0X2xvY2tfdCAqKSAmIChsb2NrKSwgTlVMTCwgMCwgMCwgMCwgLTEgfSB9CisKK2V4dGVybiBpbnQgX19rbXBfYWNxdWlyZV90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiBpbnQgX19rbXBfdGVzdF90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiBpbnQgX19rbXBfdGVzdF90aWNrZXRfbG9ja193aXRoX2NoZWtzKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIGludCBfX2ttcF9yZWxlYXNlX3RpY2tldF9sb2NrKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBfaW5pdF90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKmxjayApOworZXh0ZXJuIHZvaWQgX19rbXBfZGVzdHJveV90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKmxjayApOworCitleHRlcm4gaW50IF9fa21wX2FjcXVpcmVfbmVzdGVkX3RpY2tldF9sb2NrKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIGludCBfX2ttcF90ZXN0X25lc3RlZF90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiBpbnQgX19rbXBfcmVsZWFzZV9uZXN0ZWRfdGlja2V0X2xvY2soIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbml0X25lc3RlZF90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKmxjayApOworZXh0ZXJuIHZvaWQgX19rbXBfZGVzdHJveV9uZXN0ZWRfdGlja2V0X2xvY2soIGttcF90aWNrZXRfbG9ja190ICpsY2sgKTsKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBRdWV1aW5nIGxvY2tzLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgS01QX1VTRV9BREFQVElWRV9MT0NLUworCitzdHJ1Y3Qga21wX2FkYXB0aXZlX2xvY2tfaW5mbzsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2FkYXB0aXZlX2xvY2tfaW5mbyBrbXBfYWRhcHRpdmVfbG9ja19pbmZvX3Q7CisKKyNpZiBLTVBfREVCVUdfQURBUFRJVkVfTE9DS1MKKworc3RydWN0IGttcF9hZGFwdGl2ZV9sb2NrX3N0YXRpc3RpY3MgeworICAgIC8qIFNvIHdlIGNhbiBnZXQgc3RhdHMgZnJvbSBsb2NrcyB0aGF0IGhhdmVuJ3QgYmVlbiBkZXN0cm95ZWQuICovCisgICAga21wX2FkYXB0aXZlX2xvY2tfaW5mb190ICogbmV4dDsKKyAgICBrbXBfYWRhcHRpdmVfbG9ja19pbmZvX3QgKiBwcmV2OworCisgICAgLyogT3RoZXIgc3RhdGlzdGljcyAqLworICAgIGttcF91aW50MzIgc3VjY2Vzc2Z1bFNwZWN1bGF0aW9uczsKKyAgICBrbXBfdWludDMyIGhhcmRGYWlsZWRTcGVjdWxhdGlvbnM7CisgICAga21wX3VpbnQzMiBzb2Z0RmFpbGVkU3BlY3VsYXRpb25zOworICAgIGttcF91aW50MzIgbm9uU3BlY3VsYXRpdmVBY3F1aXJlczsKKyAgICBrbXBfdWludDMyIG5vblNwZWN1bGF0aXZlQWNxdWlyZUF0dGVtcHRzOworICAgIGttcF91aW50MzIgbGVtbWluZ1lpZWxkczsKK307CisKK3R5cGVkZWYgc3RydWN0IGttcF9hZGFwdGl2ZV9sb2NrX3N0YXRpc3RpY3Mga21wX2FkYXB0aXZlX2xvY2tfc3RhdGlzdGljc190OworCitleHRlcm4gdm9pZCBfX2ttcF9wcmludF9zcGVjdWxhdGl2ZV9zdGF0cygpOworZXh0ZXJuIHZvaWQgX19rbXBfaW5pdF9zcGVjdWxhdGl2ZV9zdGF0cygpOworCisjZW5kaWYgLy8gS01QX0RFQlVHX0FEQVBUSVZFX0xPQ0tTCisKK3N0cnVjdCBrbXBfYWRhcHRpdmVfbG9ja19pbmZvCit7CisgICAgLyogVmFsdWVzIHVzZWQgZm9yIGFkYXB0aXZpdHkuCisgICAgICogQWx0aG91Z2ggdGhlc2UgYXJlIGFjY2Vzc2VkIGZyb20gbXVsdGlwbGUgdGhyZWFkcyB3ZSBkb24ndCBhY2Nlc3MgdGhlbSBhdG9taWNhbGx5LAorICAgICAqIGJlY2F1c2UgaWYgd2UgbWlzcyB1cGRhdGVzIGl0IHByb2JhYmx5IGRvZXNuJ3QgbWF0dGVyIG11Y2guIChJdCBqdXN0IGFmZmVjdHMgb3VyCisgICAgICogZGVjaXNpb24gYWJvdXQgd2hldGhlciB0byB0cnkgc3BlY3VsYXRpb24gb24gdGhlIGxvY2spLgorICAgICAqLworICAgIGttcF91aW50MzIgdm9sYXRpbGUgYmFkbmVzczsKKyAgICBrbXBfdWludDMyIHZvbGF0aWxlIGFjcXVpcmVfYXR0ZW1wdHM7CisgICAgLyogUGFyYW1ldGVycyBvZiB0aGUgbG9jay4gKi8KKyAgICBrbXBfdWludDMyIG1heF9iYWRuZXNzOworICAgIGttcF91aW50MzIgbWF4X3NvZnRfcmV0cmllczsKKworI2lmIEtNUF9ERUJVR19BREFQVElWRV9MT0NLUworICAgIGttcF9hZGFwdGl2ZV9sb2NrX3N0YXRpc3RpY3NfdCB2b2xhdGlsZSBzdGF0czsKKyNlbmRpZgorfTsKKworI2VuZGlmIC8vIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKworCitzdHJ1Y3Qga21wX2Jhc2VfcXVldWluZ19sb2NrIHsKKworICAgIC8vICBgaW5pdGlhbGl6ZWQnIG11c3QgYmUgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBsb2NrIGRhdGEgc3RydWN0dXJlIQorICAgIHZvbGF0aWxlIHVuaW9uIGttcF9xdWV1aW5nX2xvY2sgKmluaXRpYWxpemVkOyAvLyBQb2ludHMgdG8gdGhlIGxvY2sgdW5pb24gaWYgaW4gaW5pdGlhbGl6ZWQgc3RhdGUuCisKKyAgICBpZGVudF90IGNvbnN0ICogICAgIGxvY2F0aW9uOyAgICAgLy8gU291cmNlIGNvZGUgbG9jYXRpb24gb2Ygb21wX2luaXRfbG9jaygpLgorCisgICAgS01QX0FMSUdOKCA4ICkgICAgICAgICAgICAgICAgICAgIC8vIHRhaWxfaWQgIG11c3QgYmUgOC1ieXRlIGFsaWduZWQhCisKKyAgICB2b2xhdGlsZSBrbXBfaW50MzIgIHRhaWxfaWQ7ICAgICAgLy8gKGd0aWQrMSkgb2YgdGhyZWFkIGF0IHRhaWwgb2Ygd2FpdCBxdWV1ZSwgMCBpZiBlbXB0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNdXN0IGJlIG5vIHBhZGRpbmcgaGVyZSBzaW5jZSBoZWFkL3RhaWwgdXNlZCBpbiA4LWJ5dGUgQ0FTCisgICAgdm9sYXRpbGUga21wX2ludDMyICBoZWFkX2lkOyAgICAgIC8vIChndGlkKzEpIG9mIHRocmVhZCBhdCBoZWFkIG9mIHdhaXQgcXVldWUsIDAgaWYgZW1wdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVjbCBvcmRlciBhc3N1bWVzIGxpdHRsZSBlbmRpYW4KKyAgICAvLyBiYWtlcnktc3R5bGUgbG9jaworICAgIHZvbGF0aWxlIGttcF91aW50MzIgbmV4dF90aWNrZXQ7ICAvLyB0aWNrZXQgbnVtYmVyIHRvIGdpdmUgdG8gbmV4dCB0aHJlYWQgd2hpY2ggYWNxdWlyZXMKKyAgICB2b2xhdGlsZSBrbXBfdWludDMyIG5vd19zZXJ2aW5nOyAgLy8gdGlja2V0IG51bWJlciBmb3IgdGhyZWFkIHdoaWNoIGhvbGRzIHRoZSBsb2NrCisgICAgdm9sYXRpbGUga21wX2ludDMyICBvd25lcl9pZDsgICAgIC8vIChndGlkKzEpIG9mIG93bmluZyB0aHJlYWQsIDAgaWYgdW5sb2NrZWQKKyAgICBrbXBfaW50MzIgICAgICAgICAgIGRlcHRoX2xvY2tlZDsgLy8gZGVwdGggbG9ja2VkLCBmb3IgbmVzdGVkIGxvY2tzIG9ubHkKKworICAgIGttcF9sb2NrX2ZsYWdzX3QgICAgZmxhZ3M7ICAgICAgICAvLyBsb2NrIHNwZWNpZmljcywgZS5nLiBjcml0aWNhbCBzZWN0aW9uIGxvY2sKK307CisKK3R5cGVkZWYgc3RydWN0IGttcF9iYXNlX3F1ZXVpbmdfbG9jayBrbXBfYmFzZV9xdWV1aW5nX2xvY2tfdDsKKworS01QX0JVSUxEX0FTU0VSVCggb2Zmc2V0b2YoIGttcF9iYXNlX3F1ZXVpbmdfbG9ja190LCB0YWlsX2lkICkgJSA4ID09IDAgKTsKKwordW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF9xdWV1aW5nX2xvY2sgeworICAgIGttcF9iYXNlX3F1ZXVpbmdfbG9ja190IGxrOyAgICAgICAvLyBUaGlzIGZpZWxkIG11c3QgYmUgZmlyc3QgdG8gYWxsb3cgc3RhdGljIGluaXRpYWxpemluZy4KKyAgICBrbXBfbG9ja19wb29sX3QgcG9vbDsKKyAgICBkb3VibGUgICAgICAgICAgICAgICAgICAgbGtfYWxpZ247IC8vIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudAorICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICBsa19wYWRbIEtNUF9QQUQoIGttcF9iYXNlX3F1ZXVpbmdfbG9ja190LCBDQUNIRV9MSU5FICkgXTsKK307CisKK3R5cGVkZWYgdW5pb24ga21wX3F1ZXVpbmdfbG9jayBrbXBfcXVldWluZ19sb2NrX3Q7CisKK2V4dGVybiBpbnQgX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIGludCBfX2ttcF90ZXN0X3F1ZXVpbmdfbG9jaygga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gaW50IF9fa21wX3JlbGVhc2VfcXVldWluZ19sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2luaXRfcXVldWluZ19sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjayApOworZXh0ZXJuIHZvaWQgX19rbXBfZGVzdHJveV9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrICk7CisKK2V4dGVybiBpbnQgX19rbXBfYWNxdWlyZV9uZXN0ZWRfcXVldWluZ19sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiBpbnQgX19rbXBfdGVzdF9uZXN0ZWRfcXVldWluZ19sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiBpbnQgX19rbXBfcmVsZWFzZV9uZXN0ZWRfcXVldWluZ19sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2luaXRfbmVzdGVkX3F1ZXVpbmdfbG9jaygga21wX3F1ZXVpbmdfbG9ja190ICpsY2sgKTsKK2V4dGVybiB2b2lkIF9fa21wX2Rlc3Ryb3lfbmVzdGVkX3F1ZXVpbmdfbG9jaygga21wX3F1ZXVpbmdfbG9ja190ICpsY2sgKTsKKworI2lmIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQWRhcHRpdmUgbG9ja3MuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdHJ1Y3Qga21wX2Jhc2VfYWRhcHRpdmVfbG9jayB7CisgICAga21wX2Jhc2VfcXVldWluZ19sb2NrIHFsazsKKyAgICBLTVBfQUxJR04oQ0FDSEVfTElORSkKKyAgICBrbXBfYWRhcHRpdmVfbG9ja19pbmZvX3QgYWRhcHRpdmU7ICAgICAvLyBJbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWN1bGF0aXZlIGFkYXB0aXZlIGxvY2sKK307CisKK3R5cGVkZWYgc3RydWN0IGttcF9iYXNlX2FkYXB0aXZlX2xvY2sga21wX2Jhc2VfYWRhcHRpdmVfbG9ja190OworCit1bmlvbiBLTVBfQUxJR05fQ0FDSEUga21wX2FkYXB0aXZlX2xvY2sgeworICAgIGttcF9iYXNlX2FkYXB0aXZlX2xvY2tfdCBsazsKKyAgICBrbXBfbG9ja19wb29sX3QgcG9vbDsKKyAgICBkb3VibGUgbGtfYWxpZ247CisgICAgY2hhciBsa19wYWRbIEtNUF9QQUQoa21wX2Jhc2VfYWRhcHRpdmVfbG9ja190LCBDQUNIRV9MSU5FKSBdOworfTsKK3R5cGVkZWYgdW5pb24ga21wX2FkYXB0aXZlX2xvY2sga21wX2FkYXB0aXZlX2xvY2tfdDsKKworIyBkZWZpbmUgR0VUX1FMS19QVFIobCkgKChrbXBfcXVldWluZ19sb2NrX3QgKikgJiAobCktPmxrLnFsaykKKworI2VuZGlmIC8vIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRFJEUEEgdGlja2V0IGxvY2tzLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdHJ1Y3Qga21wX2Jhc2VfZHJkcGFfbG9jayB7CisgICAgLy8KKyAgICAvLyBBbGwgb2YgdGhlIGZpZWxkcyBvbiB0aGUgZmlyc3QgY2FjaGUgbGluZSBhcmUgb25seSB3cml0dGVuIHdoZW4KKyAgICAvLyBpbml0aWFsaXppbmcgb3IgcmVjb25maWd1cmluZyB0aGUgbG9jay4gIFRoZXNlIGFyZSByZWxhdGl2ZWx5IHJhcmUKKyAgICAvLyBvcGVyYXRpb25zLCBzbyBkYXRhIGZyb20gdGhlIGZpcnN0IGNhY2hlIGxpbmUgd2lsbCB1c3VhbGx5IHN0YXkKKyAgICAvLyByZXNpZGVudCBpbiB0aGUgY2FjaGUgb2YgZWFjaCB0aHJlYWQgdHJ5aW5nIHRvIGFjcXVpcmUgdGhlIGxvY2suCisgICAgLy8KKyAgICAvLyBpbml0aWFsaXplZCBtdXN0IGJlIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgbG9jayBkYXRhIHN0cnVjdHVyZSEKKyAgICAvLworICAgIEtNUF9BTElHTl9DQUNIRQorCisgICAgdm9sYXRpbGUgdW5pb24ga21wX2RyZHBhX2xvY2sgKiBpbml0aWFsaXplZDsgICAgLy8gcG9pbnRzIHRvIHRoZSBsb2NrIHVuaW9uIGlmIGluIGluaXRpYWxpemVkIHN0YXRlCisgICAgaWRlbnRfdCBjb25zdCAqICAgICAgICAgICAgICAgICBsb2NhdGlvbjsgICAgICAgLy8gU291cmNlIGNvZGUgbG9jYXRpb24gb2Ygb21wX2luaXRfbG9jaygpLgorICAgIHZvbGF0aWxlIHN0cnVjdCBrbXBfbG9ja19wb2xsIHsKKyAgICAgICAga21wX3VpbnQ2NCBwb2xsOworICAgIH0gKiB2b2xhdGlsZSBwb2xsczsKKyAgICB2b2xhdGlsZSBrbXBfdWludDY0ICAgICAgICAgICAgIG1hc2s7ICAgICAgICAgICAvLyBpcyAyKipudW1fcG9sbHMtMSBmb3IgbW9kIG9wCisgICAga21wX3VpbnQ2NCAgICAgICAgICAgICAgICAgICAgICBjbGVhbnVwX3RpY2tldDsgLy8gdGhyZWFkIHdpdGggY2xlYW51cCB0aWNrZXQKKyAgICB2b2xhdGlsZSBzdHJ1Y3Qga21wX2xvY2tfcG9sbCAqIG9sZF9wb2xsczsgICAgICAvLyB3aWxsIGRlYWxsb2NhdGUgb2xkX3BvbGxzCisgICAga21wX3VpbnQzMiAgICAgICAgICAgICAgICAgICAgICBudW1fcG9sbHM7ICAgICAgLy8gbXVzdCBiZSBwb3dlciBvZiAyCisKKyAgICAvLworICAgIC8vIG5leHRfdGlja2V0IGl0IG5lZWRzIHRvIGV4aXN0IGluIGEgc2VwYXJhdGUgY2FjaGUgbGluZSwgYXMgaXQgaXMKKyAgICAvLyBpbnZhbGlkYXRlZCBldmVyeSB0aW1lIGEgdGhyZWFkIHRha2VzIGEgbmV3IHRpY2tldC4KKyAgICAvLworICAgIEtNUF9BTElHTl9DQUNIRQorCisgICAgdm9sYXRpbGUga21wX3VpbnQ2NCAgICAgICAgICAgICBuZXh0X3RpY2tldDsKKworICAgIC8vCisgICAgLy8gbm93X3NlcnZpbmcgaXMgdXNlZCB0byBzdG9yZSBvdXIgdGlja2V0IHZhbHVlIHdoaWxlIHdlIGhvbGQgdGhlIGxvY2suCisgICAgLy8gSXQgaGFzIGEgc2xpZ2h0bHkgZGlmZmVyZW50IG1lYW5pbmcgaW4gdGhlIERSRFBBIHRpY2tldCBsb2NrcyAod2hlcmUKKyAgICAvLyBpdCBpcyB3cml0dGVuIGJ5IHRoZSBhY3F1aXJpbmcgdGhyZWFkKSB0aGFuIGl0IGRvZXMgaW4gdGhlIHNpbXBsZQorICAgIC8vIHRpY2tldCBsb2NrcyAod2hlcmUgaXQgaXMgd3JpdHRlbiBieSB0aGUgcmVsZWFzaW5nIHRocmVhZCkuCisgICAgLy8KKyAgICAvLyBTaW5jZSBub3dfc2VydmluZyBpcyBvbmx5IHJlYWQgYW4gd3JpdHRlbiBpbiB0aGUgY3JpdGljYWwgc2VjdGlvbiwKKyAgICAvLyBpdCBpcyBub24tdm9sYXRpbGUsIGJ1dCBpdCBuZWVkcyB0byBleGlzdCBvbiBhIHNlcGFyYXRlIGNhY2hlIGxpbmUsCisgICAgLy8gYXMgaXQgaXMgaW52YWxpZGF0ZWQgYXQgZXZlcnkgbG9jayBhY3F1aXJlLgorICAgIC8vCisgICAgLy8gTGlrZXdpc2UsIHRoZSB2YXJzIHVzZWQgZm9yIG5lc3RlZCBsb2NrcyAob3duZXJfaWQgYW5kIGRlcHRoX2xvY2tlZCkKKyAgICAvLyBhcmUgb25seSB3cml0dGVuIGJ5IHRoZSB0aHJlYWQgb3duaW5nIHRoZSBsb2NrLCBzbyB0aGV5IGFyZSBwdXQgaW4KKyAgICAvLyB0aGlzIGNhY2hlIGxpbmUuICBvd25lcl9pZCBpcyByZWFkIGJ5IG90aGVyIHRocmVhZHMsIHNvIGl0IG11c3QgYmUKKyAgICAvLyBkZWNsYXJlZCB2b2xhdGlsZS4KKyAgICAvLworICAgIEtNUF9BTElHTl9DQUNIRQorCisgICAga21wX3VpbnQ2NCAgICAgICAgICAgICAgICAgICAgICBub3dfc2VydmluZzsgICAgLy8gZG9lc24ndCBoYXZlIHRvIGJlIHZvbGF0aWxlCisgICAgdm9sYXRpbGUga21wX3VpbnQzMiAgICAgICAgICAgICBvd25lcl9pZDsgICAgICAgLy8gKGd0aWQrMSkgb2Ygb3duaW5nIHRocmVhZCwgMCBpZiB1bmxvY2tlZAorICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhfbG9ja2VkOyAgIC8vIGRlcHRoIGxvY2tlZAorICAgIGttcF9sb2NrX2ZsYWdzX3QgICAgICAgICAgICAgICAgZmxhZ3M7ICAgICAgICAgIC8vIGxvY2sgc3BlY2lmaWNzLCBlLmcuIGNyaXRpY2FsIHNlY3Rpb24gbG9jaworfTsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2Jhc2VfZHJkcGFfbG9jayBrbXBfYmFzZV9kcmRwYV9sb2NrX3Q7CisKK3VuaW9uIEtNUF9BTElHTl9DQUNIRSBrbXBfZHJkcGFfbG9jayB7CisgICAga21wX2Jhc2VfZHJkcGFfbG9ja190IGxrOyAgICAgICAvLyBUaGlzIGZpZWxkIG11c3QgYmUgZmlyc3QgdG8gYWxsb3cgc3RhdGljIGluaXRpYWxpemluZy4gKi8KKyAgICBrbXBfbG9ja19wb29sX3QgcG9vbDsKKyAgICBkb3VibGUgICAgICAgICAgICAgICAgbGtfYWxpZ247IC8vIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudAorICAgIGNoYXIgICAgICAgICAgICAgICAgICBsa19wYWRbIEtNUF9QQUQoIGttcF9iYXNlX2RyZHBhX2xvY2tfdCwgQ0FDSEVfTElORSApIF07Cit9OworCit0eXBlZGVmIHVuaW9uIGttcF9kcmRwYV9sb2NrIGttcF9kcmRwYV9sb2NrX3Q7CisKK2V4dGVybiBpbnQgX19rbXBfYWNxdWlyZV9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gaW50IF9fa21wX3Rlc3RfZHJkcGFfbG9jaygga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIGludCBfX2ttcF9yZWxlYXNlX2RyZHBhX2xvY2soIGttcF9kcmRwYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2luaXRfZHJkcGFfbG9jaygga21wX2RyZHBhX2xvY2tfdCAqbGNrICk7CitleHRlcm4gdm9pZCBfX2ttcF9kZXN0cm95X2RyZHBhX2xvY2soIGttcF9kcmRwYV9sb2NrX3QgKmxjayApOworCitleHRlcm4gaW50IF9fa21wX2FjcXVpcmVfbmVzdGVkX2RyZHBhX2xvY2soIGttcF9kcmRwYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiBpbnQgX19rbXBfdGVzdF9uZXN0ZWRfZHJkcGFfbG9jaygga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIGludCBfX2ttcF9yZWxlYXNlX25lc3RlZF9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbml0X25lc3RlZF9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2sgKTsKK2V4dGVybiB2b2lkIF9fa21wX2Rlc3Ryb3lfbmVzdGVkX2RyZHBhX2xvY2soIGttcF9kcmRwYV9sb2NrX3QgKmxjayApOworCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIExvY2sgcHVycG9zZXMuCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQm9vdHN0cmFwIGxvY2tzLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBCb290c3RyYXAgbG9ja3MgLS0gdmVyeSBmZXcgbG9ja3MgdXNlZCBhdCBsaWJyYXJ5IGluaXRpYWxpemF0aW9uIHRpbWUuCisvLyBCb290c3RyYXAgbG9ja3MgYXJlIGN1cnJlbnRseSBpbXBsZW1lbnRlZCBhcyB0aWNrZXQgbG9ja3MuCisvLyBUaGV5IGNvdWxkIGFsc28gYmUgaW1wbGVtZW50ZWQgYXMgdGVzdCBhbmQgc2V0IGxvY2ssIGJ1dCBjYW5ub3QgYmUKKy8vIGltcGxlbWVudGVkIHdpdGggb3RoZXIgbG9jayBraW5kcyBhcyB0aGV5IHJlcXVpcmUgZ3RpZHMgd2hpY2ggYXJlIG5vdAorLy8gYXZhaWxhYmxlIGF0IGluaXRpYWxpemF0aW9uIHRpbWUuCisKK3R5cGVkZWYga21wX3RpY2tldF9sb2NrX3Qga21wX2Jvb3RzdHJhcF9sb2NrX3Q7CisKKyNkZWZpbmUgS01QX0JPT1RTVFJBUF9MT0NLX0lOSVRJQUxJWkVSKCBsb2NrICkgS01QX1RJQ0tFVF9MT0NLX0lOSVRJQUxJWkVSKCAobG9jaykgKQorCitzdGF0aWMgaW5saW5lIGludAorX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jaygga21wX2Jvb3RzdHJhcF9sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIF9fa21wX2FjcXVpcmVfdGlja2V0X2xvY2soIGxjaywgS01QX0dUSURfRE5FICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2ttcF90ZXN0X2Jvb3RzdHJhcF9sb2NrKCBrbXBfYm9vdHN0cmFwX2xvY2tfdCAqbGNrICkKK3sKKyAgICByZXR1cm4gX19rbXBfdGVzdF90aWNrZXRfbG9jayggbGNrLCBLTVBfR1RJRF9ETkUgKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCBrbXBfYm9vdHN0cmFwX2xvY2tfdCAqbGNrICkKK3sKKyAgICBfX2ttcF9yZWxlYXNlX3RpY2tldF9sb2NrKCBsY2ssIEtNUF9HVElEX0RORSApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX2luaXRfYm9vdHN0cmFwX2xvY2soIGttcF9ib290c3RyYXBfbG9ja190ICpsY2sgKQoreworICAgIF9fa21wX2luaXRfdGlja2V0X2xvY2soIGxjayApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX2Rlc3Ryb3lfYm9vdHN0cmFwX2xvY2soIGttcF9ib290c3RyYXBfbG9ja190ICpsY2sgKQoreworICAgIF9fa21wX2Rlc3Ryb3lfdGlja2V0X2xvY2soIGxjayApOworfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEludGVybmFsIFJUTCBsb2Nrcy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8KKy8vIEludGVybmFsIFJUTCBsb2NrcyBhcmUgYWxzbyBpbXBsZW1lbnRlZCBhcyB0aWNrZXQgbG9ja3MsIGZvciBub3cuCisvLworLy8gRklYTUUgLSBXZSBzaG91bGQgZ28gdGhyb3VnaCBhbmQgZmlndXJlIG91dCB3aGljaCBsb2NrIGtpbmQgd29ya3MgYmVzdCBmb3IKKy8vIGVhY2ggaW50ZXJuYWwgbG9jaywgYW5kIHVzZSB0aGUgdHlwZSBkZWNsYXJhdGlvbiBhbmQgZnVuY3Rpb24gY2FsbHMgZm9yCisvLyB0aGF0IGV4cGxpY2l0IGxvY2sga2luZCAoYW5kIGdldCByaWQgb2YgdGhpcyBzZWN0aW9uKS4KKy8vCisKK3R5cGVkZWYga21wX3RpY2tldF9sb2NrX3Qga21wX2xvY2tfdDsKKworc3RhdGljIGlubGluZSBpbnQKK19fa21wX2FjcXVpcmVfbG9jaygga21wX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgcmV0dXJuIF9fa21wX2FjcXVpcmVfdGlja2V0X2xvY2soIGxjaywgZ3RpZCApOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19rbXBfdGVzdF9sb2NrKCBrbXBfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICByZXR1cm4gX19rbXBfdGVzdF90aWNrZXRfbG9jayggbGNrLCBndGlkICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfcmVsZWFzZV9sb2NrKCBrbXBfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBfX2ttcF9yZWxlYXNlX3RpY2tldF9sb2NrKCBsY2ssIGd0aWQgKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9pbml0X2xvY2soIGttcF9sb2NrX3QgKmxjayApCit7CisgICAgX19rbXBfaW5pdF90aWNrZXRfbG9jayggbGNrICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfZGVzdHJveV9sb2NrKCBrbXBfbG9ja190ICpsY2sgKQoreworICAgIF9fa21wX2Rlc3Ryb3lfdGlja2V0X2xvY2soIGxjayApOworfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFVzZXIgbG9ja3MuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vCisvLyBEbyBub3QgYWxsb2NhdGUgb2JqZWN0cyBvZiB0eXBlIHVuaW9uIGttcF91c2VyX2xvY2shISEKKy8vIFRoaXMgd2lsbCB3YXN0ZSBzcGFjZSB1bmxlc3MgX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfZHJkcGEuCisvLyBJbnN0ZWFkLCBjaGVjayB0aGUgdmFsdWUgb2YgX19rbXBfdXNlcl9sb2NrX2tpbmQgYW5kIGFsbG9jYXRlIG9iamVjdHMgb2YKKy8vIHRoZSB0eXBlIG9mIHRoZSBhcHByb3ByaWF0ZSB1bmlvbiBtZW1iZXIsIGFuZCBjYXN0IHRoZWlyIGFkZHJlc3NlcyB0bworLy8ga21wX3VzZXJfbG9ja19wLgorLy8KKworZW51bSBrbXBfbG9ja19raW5kIHsKKyAgICBsa19kZWZhdWx0ID0gMCwKKyAgICBsa190YXMsCisjaWYgS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KQorICAgIGxrX2Z1dGV4LAorI2VuZGlmCisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sgJiYgS01QX1VTRV9UU1gKKyAgICBsa19obGUsCisgICAgbGtfcnRtLAorI2VuZGlmCisgICAgbGtfdGlja2V0LAorICAgIGxrX3F1ZXVpbmcsCisgICAgbGtfZHJkcGEsCisjaWYgS01QX1VTRV9BREFQVElWRV9MT0NLUworICAgIGxrX2FkYXB0aXZlCisjZW5kaWYgLy8gS01QX1VTRV9BREFQVElWRV9MT0NLUworfTsKKwordHlwZWRlZiBlbnVtIGttcF9sb2NrX2tpbmQga21wX2xvY2tfa2luZF90OworCitleHRlcm4ga21wX2xvY2tfa2luZF90IF9fa21wX3VzZXJfbG9ja19raW5kOworCit1bmlvbiBrbXBfdXNlcl9sb2NrIHsKKyAgICBrbXBfdGFzX2xvY2tfdCAgICAgdGFzOworI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkKKyAgICBrbXBfZnV0ZXhfbG9ja190ICAgZnV0ZXg7CisjZW5kaWYKKyAgICBrbXBfdGlja2V0X2xvY2tfdCAgdGlja2V0OworICAgIGttcF9xdWV1aW5nX2xvY2tfdCBxdWV1aW5nOworICAgIGttcF9kcmRwYV9sb2NrX3QgICBkcmRwYTsKKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisgICAga21wX2FkYXB0aXZlX2xvY2tfdCAgICAgYWRhcHRpdmU7CisjZW5kaWYgLy8gS01QX1VTRV9BREFQVElWRV9MT0NLUworICAgIGttcF9sb2NrX3Bvb2xfdCAgICBwb29sOworfTsKKwordHlwZWRlZiB1bmlvbiBrbXBfdXNlcl9sb2NrICprbXBfdXNlcl9sb2NrX3A7CisKKyNpZiAhIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKK2V4dGVybiBzaXplX3QgX19rbXBfYmFzZV91c2VyX2xvY2tfc2l6ZTsKK2V4dGVybiBzaXplX3QgX19rbXBfdXNlcl9sb2NrX3NpemU7CisKK2V4dGVybiBrbXBfaW50MzIgKCAqX19rbXBfZ2V0X3VzZXJfbG9ja19vd25lcl8gKSgga21wX3VzZXJfbG9ja19wIGxjayApOworCitzdGF0aWMgaW5saW5lIGttcF9pbnQzMgorX19rbXBfZ2V0X3VzZXJfbG9ja19vd25lcigga21wX3VzZXJfbG9ja19wIGxjayApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfZ2V0X3VzZXJfbG9ja19vd25lcl8gIT0gTlVMTCApOworICAgIHJldHVybiAoICpfX2ttcF9nZXRfdXNlcl9sb2NrX293bmVyXyApKCBsY2sgKTsKK30KKworZXh0ZXJuIGludCAoICpfX2ttcF9hY3F1aXJlX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKTsKKworI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkKKworI2RlZmluZSBfX2ttcF9hY3F1aXJlX3VzZXJfbG9ja193aXRoX2NoZWNrcyhsY2ssZ3RpZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3NldF9sb2NrIjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKCAoIHNpemVvZiAoIGttcF90YXNfbG9ja190ICkgPD0gT01QX0xPQ0tfVF9TSVpFICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICYmIGxjay0+dGFzLmxrLmRlcHRoX2xvY2tlZCAhPSAtMSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKCAoIGd0aWQgPj0gMCApICYmICggbGNrLT50YXMubGsucG9sbCAtIDEgPT0gZ3RpZCApICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzQWxyZWFkeU93bmVkLCBmdW5jICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoICggbGNrLT50YXMubGsucG9sbCAhPSAwICkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIoICYobGNrLT50YXMubGsucG9sbCksIDAsIGd0aWQgKyAxICkgKSAgKSB7ICAgICAgICAgICAgXAorICAgICAgICAgICAga21wX3VpbnQzMiBzcGluczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgS01QX0ZTWU5DX1BSRVBBUkUoIGxjayApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgS01QX0lOSVRfWUlFTEQoIHNwaW5zICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKCBUQ1JfNChfX2ttcF9udGgpID4gKF9fa21wX2F2YWlsX3Byb2MgPyBfX2ttcF9hdmFpbF9wcm9jIDogX19rbXBfeHByb2MpICkgeyAgICAgXAorICAgICAgICAgICAgICAgIEtNUF9ZSUVMRCggVFJVRSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEtNUF9ZSUVMRF9TUElOKCBzcGlucyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgd2hpbGUgKCAoIGxjay0+dGFzLmxrLnBvbGwgIT0gMCApIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCAmKGxjay0+dGFzLmxrLnBvbGwpLCAwLCBndGlkICsgMSApICkgICkgIHsgICAgICAgXAorICAgICAgICAgICAgICAgIGlmICggVENSXzQoX19rbXBfbnRoKSA+IChfX2ttcF9hdmFpbF9wcm9jID8gX19rbXBfYXZhaWxfcHJvYyA6IF9fa21wX3hwcm9jKSApIHsgXAorICAgICAgICAgICAgICAgICAgICBLTVBfWUlFTEQoIFRSVUUgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBLTVBfWUlFTERfU1BJTiggc3BpbnMgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfRlNZTkNfQUNRVUlSRUQoIGxjayApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9hY3F1aXJlX3VzZXJfbG9ja193aXRoX2NoZWNrc18gIT0gTlVMTCApOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoICpfX2ttcF9hY3F1aXJlX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSggbGNrLCBndGlkICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50CitfX2ttcF9hY3F1aXJlX3VzZXJfbG9ja193aXRoX2NoZWNrcygga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2FjcXVpcmVfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyAhPSBOVUxMICk7CisgICAgcmV0dXJuICggKl9fa21wX2FjcXVpcmVfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBsY2ssIGd0aWQgKTsKK30KKyNlbmRpZgorCitleHRlcm4gaW50ICggKl9fa21wX3Rlc3RfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBrbXBfaW50MzIgZ3RpZCApOworCisjaWYgS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KQorCisjaW5jbHVkZSAia21wX2kxOG4uaCIgICAgICAgICAgICAgICAgICAgICAgIC8qIEFDOiBLTVBfRkFUQUwgZGVmaW5pdGlvbiAqLworZXh0ZXJuIGludCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2s7ICAgICAvKiBBQzogY29weSBmcm9tIGttcC5oIGhlcmUgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2ttcF90ZXN0X3VzZXJfbG9ja193aXRoX2NoZWNrcygga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGlmICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfdGFzICkgeworICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF90ZXN0X2xvY2siOworICAgICAgICAgICAgaWYgKCAoIHNpemVvZiAoIGttcF90YXNfbG9ja190ICkgPD0gT01QX0xPQ0tfVF9TSVpFICkKKyAgICAgICAgICAgICAgICAmJiBsY2stPnRhcy5say5kZXB0aF9sb2NrZWQgIT0gLTEgKSB7CisgICAgICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKCAoIGxjay0+dGFzLmxrLnBvbGwgPT0gMCApICYmCisgICAgICAgICAgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCAmKGxjay0+dGFzLmxrLnBvbGwpLCAwLCBndGlkICsgMSApICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGVzdF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICE9IE5VTEwgKTsKKyAgICAgICAgcmV0dXJuICggKl9fa21wX3Rlc3RfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBsY2ssIGd0aWQgKTsKKyAgICB9Cit9CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQKK19fa21wX3Rlc3RfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGVzdF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICE9IE5VTEwgKTsKKyAgICByZXR1cm4gKCAqX19rbXBfdGVzdF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGxjaywgZ3RpZCApOworfQorI2VuZGlmCisKK2V4dGVybiBpbnQgKCAqX19rbXBfcmVsZWFzZV91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9pbnQzMiBndGlkICk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfcmVsZWFzZV91c2VyX2xvY2tfd2l0aF9jaGVja3MoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9yZWxlYXNlX3VzZXJfbG9ja193aXRoX2NoZWNrc18gIT0gTlVMTCApOworICAgICggKl9fa21wX3JlbGVhc2VfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApICggbGNrLCBndGlkICk7Cit9CisKK2V4dGVybiB2b2lkICggKl9fa21wX2luaXRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrICk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfaW5pdF91c2VyX2xvY2tfd2l0aF9jaGVja3MoIGttcF91c2VyX2xvY2tfcCBsY2sgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyAhPSBOVUxMICk7CisgICAgKCAqX19rbXBfaW5pdF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGxjayApOworfQorCisvLworLy8gV2UgbmVlZCBhIG5vbi1jaGVja2luZyB2ZXJzaW9uIG9mIGRlc3Ryb3kgbG9jayBmb3Igd2hlbiB0aGUgUlRMIGlzCisvLyBkb2luZyB0aGUgY2xlYW51cCBhcyBpdCBjYW4ndCBhbHdheXMgdGVsbCBpZiB0aGUgbG9jayBpcyBuZXN0ZWQgb3Igbm90LgorLy8KK2V4dGVybiB2b2lkICggKl9fa21wX2Rlc3Ryb3lfdXNlcl9sb2NrXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrICk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfZGVzdHJveV91c2VyX2xvY2soIGttcF91c2VyX2xvY2tfcCBsY2sgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2Rlc3Ryb3lfdXNlcl9sb2NrXyAhPSBOVUxMICk7CisgICAgKCAqX19rbXBfZGVzdHJveV91c2VyX2xvY2tfICkoIGxjayApOworfQorCitleHRlcm4gdm9pZCAoICpfX2ttcF9kZXN0cm95X3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjayApOworCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX2Rlc3Ryb3lfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdXNlcl9sb2NrX3AgbGNrICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9kZXN0cm95X3VzZXJfbG9ja193aXRoX2NoZWNrc18gIT0gTlVMTCApOworICAgICggKl9fa21wX2Rlc3Ryb3lfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBsY2sgKTsKK30KKworZXh0ZXJuIGludCAoICpfX2ttcF9hY3F1aXJlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9pbnQzMiBndGlkICk7CisKKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQpCisKKyNkZWZpbmUgX19rbXBfYWNxdWlyZV9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKGxjayxndGlkLGRlcHRoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX3RhcykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9zZXRfbmVzdF9sb2NrIjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoICggc2l6ZW9mICgga21wX3Rhc19sb2NrX3QgKSA8PSBPTVBfTkVTVF9MT0NLX1RfU0laRSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICYmIGxjay0+dGFzLmxrLmRlcHRoX2xvY2tlZCA9PSAtMSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCBsY2stPnRhcy5say5wb2xsIC0gMSA9PSBndGlkICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBsY2stPnRhcy5say5kZXB0aF9sb2NrZWQgKz0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKmRlcHRoID0gS01QX0xPQ0tfQUNRVUlSRURfTkVYVDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoICggbGNrLT50YXMubGsucG9sbCAhPSAwICkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCAmKGxjay0+dGFzLmxrLnBvbGwpLCAwLCBndGlkICsgMSApICkgICkgeyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBrbXBfdWludDMyIHNwaW5zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgS01QX0ZTWU5DX1BSRVBBUkUoIGxjayApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEtNUF9JTklUX1lJRUxEKCBzcGlucyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpZiAoIFRDUl80KF9fa21wX250aCkgPiAoX19rbXBfYXZhaWxfcHJvYyA/IF9fa21wX2F2YWlsX3Byb2MgOiBfX2ttcF94cHJvYykgKSB7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIEtNUF9ZSUVMRCggVFJVRSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgS01QX1lJRUxEX1NQSU4oIHNwaW5zICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHdoaWxlICggKCBsY2stPnRhcy5say5wb2xsICE9IDAgKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIoICYobGNrLT50YXMubGsucG9sbCksIDAsIGd0aWQgKyAxICkgKSAgKSB7ICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGlmICggVENSXzQoX19rbXBfbnRoKSA+IChfX2ttcF9hdmFpbF9wcm9jID8gX19rbXBfYXZhaWxfcHJvYyA6IF9fa21wX3hwcm9jKSApIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgS01QX1lJRUxEKCBUUlVFICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfWUlFTERfU1BJTiggc3BpbnMgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbGNrLT50YXMubGsuZGVwdGhfbG9ja2VkID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICpkZXB0aCA9IEtNUF9MT0NLX0FDUVVJUkVEX0ZJUlNUOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfRlNZTkNfQUNRVUlSRUQoIGxjayApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2FjcXVpcmVfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gIT0gTlVMTCApOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAqZGVwdGggPSAoICpfX2ttcF9hY3F1aXJlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGxjaywgZ3RpZCApOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX2FjcXVpcmVfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrcygga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQsIGludCogZGVwdGggKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2FjcXVpcmVfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gIT0gTlVMTCApOworICAgICpkZXB0aCA9ICggKl9fa21wX2FjcXVpcmVfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSggbGNrLCBndGlkICk7Cit9CisjZW5kaWYKKworZXh0ZXJuIGludCAoICpfX2ttcF90ZXN0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9pbnQzMiBndGlkICk7CisKKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQpCitzdGF0aWMgaW5saW5lIGludAorX19rbXBfdGVzdF9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaWYgKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKSB7CisgICAgICAgIGludCByZXR2YWw7CisgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Rlc3RfbmVzdF9sb2NrIjsKKyAgICAgICAgICAgIGlmICggKCBzaXplb2YgKCBrbXBfdGFzX2xvY2tfdCApIDw9IE9NUF9ORVNUX0xPQ0tfVF9TSVpFICkKKyAgICAgICAgICAgICAgICAmJiBsY2stPnRhcy5say5kZXB0aF9sb2NrZWQgPT0gLTEgKSB7CisgICAgICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49IDAgKTsKKyAgICAgICAgaWYgKCBsY2stPnRhcy5say5wb2xsIC0gMSA9PSBndGlkICkgeyAgIC8qIF9fa21wX2dldF90YXNfbG9ja19vd25lciggbGNrICkgPT0gZ3RpZCAqLworICAgICAgICAgICAgcmV0dXJuICsrbGNrLT50YXMubGsuZGVwdGhfbG9ja2VkOyAgLyogc2FtZSBvd25lciwgZGVwdGggaW5jcmVhc2VkICovCisgICAgICAgIH0KKyAgICAgICAgcmV0dmFsID0gKCAoIGxjay0+dGFzLmxrLnBvbGwgPT0gMCApICYmCisgICAgICAgICAgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCAmKGxjay0+dGFzLmxrLnBvbGwpLCAwLCBndGlkICsgMSApICk7CisgICAgICAgIGlmICggcmV0dmFsICkgeworICAgICAgICAgICAgS01QX01CKCk7CisgICAgICAgICAgICBsY2stPnRhcy5say5kZXB0aF9sb2NrZWQgPSAxOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGVzdF9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyAhPSBOVUxMICk7CisgICAgICAgIHJldHVybiAoICpfX2ttcF90ZXN0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGxjaywgZ3RpZCApOworICAgIH0KK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIGludAorX19rbXBfdGVzdF9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGVzdF9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyAhPSBOVUxMICk7CisgICAgcmV0dXJuICggKl9fa21wX3Rlc3RfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSggbGNrLCBndGlkICk7Cit9CisjZW5kaWYKKworZXh0ZXJuIGludCAoICpfX2ttcF9yZWxlYXNlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9pbnQzMiBndGlkICk7CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2ttcF9yZWxlYXNlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3MoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9yZWxlYXNlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICE9IE5VTEwgKTsKKyAgICByZXR1cm4gKCAqX19rbXBfcmVsZWFzZV9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBsY2ssIGd0aWQgKTsKK30KKworZXh0ZXJuIHZvaWQgKCAqX19rbXBfaW5pdF9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrICk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2ttcF9pbml0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3MoIGttcF91c2VyX2xvY2tfcCBsY2sgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gIT0gTlVMTCApOworICAgICggKl9fa21wX2luaXRfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSggbGNrICk7Cit9CisKK2V4dGVybiB2b2lkICggKl9fa21wX2Rlc3Ryb3lfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjayApOworCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX2Rlc3Ryb3lfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrcygga21wX3VzZXJfbG9ja19wIGxjayApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfZGVzdHJveV9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyAhPSBOVUxMICk7CisgICAgKCAqX19rbXBfZGVzdHJveV9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBsY2sgKTsKK30KKworLy8KKy8vIHVzZXIgbG9jayBmdW5jdGlvbnMgd2hpY2ggZG8gbm90IG5lY2Vzc2FyaWx5IGV4aXN0IGZvciBhbGwgbG9jayBraW5kcy4KKy8vCisvLyBUaGUgInNldCIgZnVuY3Rpb25zIHVzdWFsbHkgaGF2ZSB3cmFwcGVyIHJvdXRpbmVzIHRoYXQgY2hlY2sgZm9yIGEgTlVMTCBzZXQKKy8vIGZ1bmN0aW9uIHBvaW50ZXIgYW5kIGNhbGwgaXQgaWYgbm9uLU5VTEwuCisvLworLy8gSW4gc29tZSBjYXNlcywgaXQgbWFrZXMgc2Vuc2UgdG8gaGF2ZSBhICJnZXQiIHdyYXBwZXIgZnVuY3Rpb24gY2hlY2sgZm9yIGEKKy8vIE5VTEwgZ2V0IGZ1bmN0aW9uIHBvaW50ZXIgYW5kIHJldHVybiBOVUxMIC8gaW52YWxpZCB2YWx1ZSAvIGVycm9yIGNvZGUgaWYKKy8vIHRoZSBmdW5jdGlvbiBwb2ludGVyIGlzIE5VTEwuCisvLworLy8gSW4gb3RoZXIgY2FzZXMsIHRoZSBjYWxsaW5nIGNvZGUgcmVhbGx5IHNob3VsZCBkaWZmZXJlbnRpYXRlIGJldHdlZW4gYW4KKy8vIHVuaW1wbGVtZW50ZWQgZnVuY3Rpb24gYW5kIG9uZSB0aGF0IGlzIGltcGxlbWVudGVkIGJ1dCByZXR1cm5pbmcgTlVMTCAvCisvLyBpbnZhbGllZCB2YWx1ZS4gIElmIHRoaXMgaXMgdGhlIGNhc2UsIG5vIGdldCBmdW5jdGlvbiB3cmFwcGVyIGV4aXN0cy4KKy8vCisKK2V4dGVybiBpbnQgKCAqX19rbXBfaXNfdXNlcl9sb2NrX2luaXRpYWxpemVkXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrICk7CisKKy8vIG5vIHNldCBmdW5jdGlvbjsgZmllbGRzIHNldCBkdXJpbmluZyBsb2NhbCBhbGxvY2F0aW9uCisKK2V4dGVybiBjb25zdCBpZGVudF90ICogKCAqX19rbXBfZ2V0X3VzZXJfbG9ja19sb2NhdGlvbl8gKSgga21wX3VzZXJfbG9ja19wIGxjayApOworCitzdGF0aWMgaW5saW5lIGNvbnN0IGlkZW50X3QgKgorX19rbXBfZ2V0X3VzZXJfbG9ja19sb2NhdGlvbigga21wX3VzZXJfbG9ja19wIGxjayApCit7CisgICAgaWYgKCBfX2ttcF9nZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyAgIT0gTlVMTCApIHsKKyAgICAgICAgcmV0dXJuICggKl9fa21wX2dldF91c2VyX2xvY2tfbG9jYXRpb25fICkoIGxjayApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorfQorCitleHRlcm4gdm9pZCAoICpfX2ttcF9zZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBjb25zdCBpZGVudF90ICpsb2MgKTsKKworc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9zZXRfdXNlcl9sb2NrX2xvY2F0aW9uKCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBjb25zdCBpZGVudF90ICpsb2MgKQoreworICAgIGlmICggX19rbXBfc2V0X3VzZXJfbG9ja19sb2NhdGlvbl8gICE9IE5VTEwgKSB7CisgICAgICAgICggKl9fa21wX3NldF91c2VyX2xvY2tfbG9jYXRpb25fICkoIGxjaywgbG9jICk7CisgICAgfQorfQorCitleHRlcm4ga21wX2xvY2tfZmxhZ3NfdCAoICpfX2ttcF9nZXRfdXNlcl9sb2NrX2ZsYWdzXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrICk7CisKK2V4dGVybiB2b2lkICggKl9fa21wX3NldF91c2VyX2xvY2tfZmxhZ3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9sb2NrX2ZsYWdzX3QgZmxhZ3MgKTsKKworc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9zZXRfdXNlcl9sb2NrX2ZsYWdzKCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBrbXBfbG9ja19mbGFnc190IGZsYWdzICkKK3sKKyAgICBpZiAoIF9fa21wX3NldF91c2VyX2xvY2tfZmxhZ3NfICAhPSBOVUxMICkgeworICAgICAgICAoICpfX2ttcF9zZXRfdXNlcl9sb2NrX2ZsYWdzXyApKCBsY2ssIGZsYWdzICk7CisgICAgfQorfQorCisvLworLy8gVGhlIGZ1Y3Rpb24gd2hpY2ggc2V0cyB1cCBhbGwgb2YgdGhlIHZ0YmwgcG9pbnRlcnMgZm9yIGttcF91c2VyX2xvY2tfdC4KKy8vCitleHRlcm4gdm9pZCBfX2ttcF9zZXRfdXNlcl9sb2NrX3ZwdHJzKCBrbXBfbG9ja19raW5kX3QgdXNlcl9sb2NrX2tpbmQgKTsKKworLy8KKy8vIE1hY3JvcyBmb3IgYmluZGluZyB1c2VyIGxvY2sgZnVuY3Rpb25zLgorLy8KKyNkZWZpbmUgS01QX0JJTkRfVVNFUl9MT0NLX1RFTVBMQVRFKG5lc3QsIGtpbmQsIHN1ZmZpeCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9hY3F1aXJlIyNuZXN0IyN1c2VyX2xvY2tfd2l0aF9jaGVja3NfID0gKCBpbnQgKCopKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMiApICkgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWNxdWlyZSMjbmVzdCMja2luZCMjXyMjc3VmZml4OyAgICAgICAgIFwKKyAgICBfX2ttcF9yZWxlYXNlIyNuZXN0IyN1c2VyX2xvY2tfd2l0aF9jaGVja3NfID0gKCBpbnQgKCopKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMiApICkgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfcmVsZWFzZSMjbmVzdCMja2luZCMjXyMjc3VmZml4OyAgICAgICAgIFwKKyAgICBfX2ttcF90ZXN0IyNuZXN0IyN1c2VyX2xvY2tfd2l0aF9jaGVja3NfICAgID0gKCBpbnQgKCopKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMiApICkgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfdGVzdCMjbmVzdCMja2luZCMjXyMjc3VmZml4OyAgICAgICAgICAgIFwKKyAgICBfX2ttcF9pbml0IyNuZXN0IyN1c2VyX2xvY2tfd2l0aF9jaGVja3NfICAgID0gKCB2b2lkICgqKSgga21wX3VzZXJfbG9ja19wICkgKSAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfaW5pdCMjbmVzdCMja2luZCMjXyMjc3VmZml4OyAgICAgICAgICAgIFwKKyAgICBfX2ttcF9kZXN0cm95IyNuZXN0IyN1c2VyX2xvY2tfd2l0aF9jaGVja3NfID0gKCB2b2lkICgqKSgga21wX3VzZXJfbG9ja19wICkgKSAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZGVzdHJveSMjbmVzdCMja2luZCMjXyMjc3VmZml4OyAgICAgICAgIFwKK30KKworI2RlZmluZSBLTVBfQklORF9VU0VSX0xPQ0soa2luZCkgICAgICAgICAgICAgICAgICAgIEtNUF9CSU5EX1VTRVJfTE9DS19URU1QTEFURShfLCBraW5kLCBsb2NrKQorI2RlZmluZSBLTVBfQklORF9VU0VSX0xPQ0tfV0lUSF9DSEVDS1Moa2luZCkgICAgICAgIEtNUF9CSU5EX1VTRVJfTE9DS19URU1QTEFURShfLCBraW5kLCBsb2NrX3dpdGhfY2hlY2tzKQorI2RlZmluZSBLTVBfQklORF9ORVNURURfVVNFUl9MT0NLKGtpbmQpICAgICAgICAgICAgIEtNUF9CSU5EX1VTRVJfTE9DS19URU1QTEFURShfbmVzdGVkXywga2luZCwgbG9jaykKKyNkZWZpbmUgS01QX0JJTkRfTkVTVEVEX1VTRVJfTE9DS19XSVRIX0NIRUNLUyhraW5kKSBLTVBfQklORF9VU0VSX0xPQ0tfVEVNUExBVEUoX25lc3RlZF8sIGtpbmQsIGxvY2tfd2l0aF9jaGVja3MpCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFVzZXIgbG9jayB0YWJsZSAmIGxvY2sgYWxsb2NhdGlvbgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKgorICAgIE9uIDY0LWJpdCBMaW51eCogT1MgKGFuZCBPUyBYKikgR05VIGNvbXBpbGVyIGFsbG9jYXRlcyBvbmx5IDQgYnl0ZW1zIG1lbW9yeSBmb3IgbG9jayB2YXJpYWJsZSwgd2hpY2gKKyAgICBpcyBub3QgZW5vdWdoIHRvIHN0b3JlIGEgcG9pbnRlciwgc28gd2UgaGF2ZSB0byB1c2UgbG9jayBpbmRleGVzIGluc3RlYWQgb2YgcG9pbnRlcnMgYW5kCisgICAgbWFpbnRhaW4gbG9jayB0YWJsZSB0byBtYXAgaW5kZXhlcyB0byBwb2ludGVycy4KKworCisgICAgTm90ZTogVGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIHRhYmxlIGlzIG5vdCBhIHBvaW50ZXIgdG8gbG9jayEgSXQgaXMgYSBwb2ludGVyIHRvIHByZXZpb3VzbHkKKyAgICBhbGxvY2F0ZWQgdGFibGUgKG9yIE5VTEwgaWYgaXQgaXMgdGhlIGZpcnN0IHRhYmxlKS4KKworICAgIFVzYWdlOgorCisgICAgICAgIGlmICggT01QX0xPQ0tfVF9TSVpFIDwgc2l6ZW9mKCA8bG9jaz4gKSApIHsgLy8gb3IgT01QX05FU1RfTE9DS19UX1NJWkUKKyAgICAgICAgICAgIExvY2sgdGFibGUgaXMgZnVsbHkgdXRpbGl6ZWQuIFVzZXIgbG9ja3MgYXJlIGluZGV4ZXMsIHNvIHRhYmxlIGlzCisgICAgICAgICAgICB1c2VkIG9uIHVzZXIgbG9jayBvcGVyYXRpb24uCisgICAgICAgICAgICBOb3RlOiBpdCBtYXkgYmUgdGhlIGNhc2UgKGxpbl8zMikgdGhhdCB3ZSBkb24ndCBuZWVkIHRvIHVzZSBhIGxvY2sKKyAgICAgICAgICAgIHRhYmxlIGZvciByZWd1bGFyIGxvY2tzLCBidXQgZG8gbmVlZCB0aGUgdGFibGUgZm9yIG5lc3RlZCBsb2Nrcy4KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIExvY2sgdGFibGUgaW5pdGlhbGl6ZWQgYnV0IG5vdCBhY3R1YWxseSB1c2VkLgorICAgICAgICB9CisqLworCitzdHJ1Y3Qga21wX2xvY2tfdGFibGUgeworICAgIGttcF9sb2NrX2luZGV4X3QgIHVzZWQ7ICAgICAgLy8gTnVtYmVyIG9mIHVzZWQgZWxlbWVudHMKKyAgICBrbXBfbG9ja19pbmRleF90ICBhbGxvY2F0ZWQ7IC8vIE51bWJlciBvZiBhbGxvY2F0ZWQgZWxlbWVudHMKKyAgICBrbXBfdXNlcl9sb2NrX3AgKiB0YWJsZTsgICAgIC8vIExvY2sgdGFibGUuCit9OworCit0eXBlZGVmIHN0cnVjdCBrbXBfbG9ja190YWJsZSBrbXBfbG9ja190YWJsZV90OworCitleHRlcm4ga21wX2xvY2tfdGFibGVfdCBfX2ttcF91c2VyX2xvY2tfdGFibGU7CitleHRlcm4ga21wX3VzZXJfbG9ja19wIF9fa21wX2xvY2tfcG9vbDsKKworc3RydWN0IGttcF9ibG9ja19vZl9sb2NrcyB7CisgICAgc3RydWN0IGttcF9ibG9ja19vZl9sb2NrcyAqIG5leHRfYmxvY2s7CisgICAgdm9pZCAqICAgICAgICAgICAgICAgICAgICAgIGxvY2tzOworfTsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2Jsb2NrX29mX2xvY2tzIGttcF9ibG9ja19vZl9sb2Nrc190OworCitleHRlcm4ga21wX2Jsb2NrX29mX2xvY2tzX3QgKl9fa21wX2xvY2tfYmxvY2tzOworZXh0ZXJuIGludCBfX2ttcF9udW1fbG9ja3NfaW5fYmxvY2s7CisKK2V4dGVybiBrbXBfdXNlcl9sb2NrX3AgX19rbXBfdXNlcl9sb2NrX2FsbG9jYXRlKCB2b2lkICoqdXNlcl9sb2NrLCBrbXBfaW50MzIgZ3RpZCwga21wX2xvY2tfZmxhZ3NfdCBmbGFncyApOworZXh0ZXJuIHZvaWQgX19rbXBfdXNlcl9sb2NrX2ZyZWUoIHZvaWQgKip1c2VyX2xvY2ssIGttcF9pbnQzMiBndGlkLCBrbXBfdXNlcl9sb2NrX3AgbGNrICk7CitleHRlcm4ga21wX3VzZXJfbG9ja19wIF9fa21wX2xvb2t1cF91c2VyX2xvY2soIHZvaWQgKip1c2VyX2xvY2ssIGNoYXIgY29uc3QgKmZ1bmMgKTsKK2V4dGVybiB2b2lkIF9fa21wX2NsZWFudXBfdXNlcl9sb2NrcygpOworCisjZGVmaW5lIEtNUF9DSEVDS19VU0VSX0xPQ0tfSU5JVCgpIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICggISBUQ1JfNCggX19rbXBfaW5pdF91c2VyX2xvY2tzICkgKSB7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOyAgICAgIFwKKyAgICAgICAgICAgICAgICBpZiAoICEgVENSXzQoIF9fa21wX2luaXRfdXNlcl9sb2NrcyApICkgeyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgVENXXzQoIF9fa21wX2luaXRfdXNlcl9sb2NrcywgVFJVRSApOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOyAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfQorCisjZW5kaWYgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKKworI3VuZGVmIEtNUF9QQUQKKyN1bmRlZiBLTVBfR1RJRF9ETkUKKworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKy8vCisvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSyBlbmFibGVzIGR5bmFtaWMgZGlzcGF0Y2ggb2YgbG9jayBmdW5jdGlvbnMgd2l0aG91dCBicmVha2luZyB0aGUgY3VycmVudAorLy8gY29tcGF0aWJpbGl0eS4gRXNzZW50aWFsIGZ1bmN0aW9uYWxpdHkgb2YgdGhpcyBuZXcgY29kZSBpcyBkeW5hbWljIGRpc3BhdGNoLCBidXQgaXQgYWxzbworLy8gaW1wbGVtZW50cyAob3IgZW5hYmxlcyBpbXBsZW1lbnRhdGlvbiBvZikgaGludGVkIHVzZXIgbG9jayBhbmQgY3JpdGljYWwgc2VjdGlvbiB3aGljaCB3aWxsIGJlCisvLyBwYXJ0IG9mIE9NUCA0LjEgc29vbi4KKy8vCisvLyBMb2NrIHR5cGUgY2FuIGJlIGRlY2lkZWQgYXQgY3JlYXRpb24gdGltZSAoaS5lLiwgbG9jayBpbml0aWFsaXphdGlvbiksIGFuZCBzdWJzZXF1ZW50IGxvY2sKKy8vIGZ1bmN0aW9uIGNhbGwgb24gdGhlIGNyZWF0ZWQgbG9jayBvYmplY3QgcmVxdWlyZXMgdHlwZSBleHRyYWN0aW9uIGFuZCBjYWxsIHRocm91Z2gganVtcCB0YWJsZQorLy8gdXNpbmcgdGhlIGV4dHJhY3RlZCB0eXBlLiBUaGlzIHR5cGUgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGluIHR3byBkaWZmZXJlbnQgd2F5cyBkZXBlbmRpbmcgb24KKy8vIHRoZSBzaXplIG9mIHRoZSBsb2NrIG9iamVjdCwgYW5kIHdlIGRpZmZlcmVudGlhdGUgbG9jayB0eXBlcyBieSB0aGlzIHNpemUgcmVxdWlyZW1lbnQgLSBkaXJlY3QKKy8vIGFuZCBpbmRpcmVjdCBsb2Nrcy4KKy8vCisvLyBEaXJlY3QgbG9ja3M6CisvLyBBIGRpcmVjdCBsb2NrIG9iamVjdCBmaXRzIGludG8gdGhlIHNwYWNlIGNyZWF0ZWQgYnkgdGhlIGNvbXBpbGVyIGZvciBhbiBvbXBfbG9ja190IG9iamVjdCwgYW5kCisvLyBUQVMvRnV0ZXggbG9jayBmYWxscyBpbnRvIHRoaXMgY2F0ZWdvcnkuIFdlIHVzZSBsb3cgb25lIGJ5dGUgb2YgdGhlIGxvY2sgb2JqZWN0IGFzIHRoZSBzdG9yYWdlCisvLyBmb3IgdGhlIGxvY2sgdHlwZSwgYW5kIGFwcHJvcHJpYXRlIGJpdCBvcGVyYXRpb24gaXMgcmVxdWlyZWQgdG8gYWNjZXNzIHRoZSBkYXRhIG1lYW5pbmdmdWwgdG8KKy8vIHRoZSBsb2NrIGFsZ29yaXRobXMuIEFsc28sIHRvIGRpZmZlcmVudGlhdGUgZGlyZWN0IGxvY2sgZnJvbSBpbmRpcmVjdCBsb2NrLCAxIGlzIHdyaXR0ZW4gdG8gTFNCCisvLyBvZiB0aGUgbG9jayBvYmplY3QuIFRoZSBuZXdseSBpbnRyb2R1Y2VkICJobGUiIGxvY2sgaXMgYWxzbyBhIGRpcmVjdCBsb2NrLgorLy8KKy8vIEluZGlyZWN0IGxvY2tzOgorLy8gQW4gaW5kaXJlY3QgbG9jayBvYmplY3QgcmVxdWlyZXMgbW9yZSBzcGFjZSB0aGFuIHRoZSBjb21waWxlci1nZW5lcmF0ZWQgc3BhY2UsIGFuZCBpdCBzaG91bGQgYmUKKy8vIGFsbG9jYXRlZCBmcm9tIGhlYXAuIERlcGVuZGluZyBvbiB0aGUgc2l6ZSBvZiB0aGUgY29tcGlsZXItZ2VuZXJhdGVkIHNwYWNlIGZvciB0aGUgbG9jayAoaS5lLiwKKy8vIHNpemUgb2Ygb21wX2xvY2tfdCksIHRoaXMgb21wX2xvY2tfdCBvYmplY3Qgc3RvcmVzIGVpdGhlciB0aGUgYWRkcmVzcyBvZiB0aGUgaGVhcC1hbGxvY2F0ZWQKKy8vIGluZGlyZWN0IGxvY2sgKHZvaWQgKiBmaXRzIGluIHRoZSBvYmplY3QpIG9yIGFuIGluZGV4IHRvIHRoZSBpbmRpcmVjdCBsb2NrIHRhYmxlIGVudHJ5IHRoYXQKKy8vIGhvbGRzIHRoZSBhZGRyZXNzLiBUaWNrZXQvUXVldWluZy9EUkRQQS9BZGFwdGl2ZSBsb2NrIGZhbGxzIGludG8gdGhpcyBjYXRlZ29yeSwgYW5kIHRoZSBuZXdseQorLy8gaW50cm9kdWNlZCAicnRtIiBsb2NrIGlzIGFsc28gYW4gaW5kaXJlY3QgbG9jayB3aGljaCB3YXMgaW1wbGVtZW50ZWQgb24gdG9wIG9mIHRoZSBRdWV1aW5nIGxvY2suCisvLyBXaGVuIHRoZSBvbXBfbG9ja190IG9iamVjdCBob2xkcyBhbiBpbmRleCAobm90IGxvY2sgYWRkcmVzcyksIDAgaXMgd3JpdHRlbiB0byBMU0IgdG8KKy8vIGRpZmZlcmVudGlhdGUgdGhlIGxvY2sgZnJvbSBhIGRpcmVjdCBsb2NrLCBhbmQgdGhlIHJlbWFpbmluZyBwYXJ0IGlzIHRoZSBhY3R1YWwgaW5kZXggdG8gdGhlCisvLyBpbmRpcmVjdCBsb2NrIHRhYmxlLgorLy8KKworI2luY2x1ZGUgPHN0ZGludC5oPiAvLyBmb3IgdWludHB0cl90CisKKy8vIFNob3J0Y3V0cworI2RlZmluZSBLTVBfVVNFX0ZVVEVYICAgICAgICAgIChLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpKQorI2RlZmluZSBLTVBfVVNFX0lOTElORURfVEFTICAgIChLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNKSkgJiYgMQorI2RlZmluZSBLTVBfVVNFX0lOTElORURfRlVURVggIEtNUF9VU0VfRlVURVggJiYgMAorCisvLyBMaXN0IG9mIGxvY2sgZGVmaW5pdGlvbnM7IGFsbCBuZXN0ZWQgbG9ja3MgYXJlIGluZGlyZWN0IGxvY2tzLgorLy8gaGxlIGxvY2sgaXMgeGNoZyBsb2NrIHByZWZpeGVkIHdpdGggWEFDUVVJUkUvWFJFTEVBU0UuCisvLyBBbGwgbmVzdGVkIGxvY2tzIGFyZSBpbmRpcmVjdCBsb2NrIHR5cGVzLgorI2lmIEtNUF9VU0VfVFNYCisjIGlmIEtNUF9VU0VfRlVURVgKKyMgIGRlZmluZSBLTVBfRk9SRUFDSF9EX0xPQ0sobSwgYSkgIG0odGFzLCBhKSBtKGZ1dGV4LCBhKSBtKGhsZSwgYSkKKyMgIGRlZmluZSBLTVBfRk9SRUFDSF9JX0xPQ0sobSwgYSkgIG0odGlja2V0LCBhKSBtKHF1ZXVpbmcsIGEpIG0oYWRhcHRpdmUsIGEpIG0oZHJkcGEsIGEpIG0ocnRtLCBhKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtKG5lc3RlZF90YXMsIGEpIG0obmVzdGVkX2Z1dGV4LCBhKSBtKG5lc3RlZF90aWNrZXQsIGEpICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbShuZXN0ZWRfcXVldWluZywgYSkgbShuZXN0ZWRfZHJkcGEsIGEpCisjIGVsc2UKKyMgIGRlZmluZSBLTVBfRk9SRUFDSF9EX0xPQ0sobSwgYSkgIG0odGFzLCBhKSAgICAgICAgICAgICBtKGhsZSwgYSkKKyMgIGRlZmluZSBLTVBfRk9SRUFDSF9JX0xPQ0sobSwgYSkgIG0odGlja2V0LCBhKSBtKHF1ZXVpbmcsIGEpIG0oYWRhcHRpdmUsIGEpIG0oZHJkcGEsIGEpIG0ocnRtLCBhKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtKG5lc3RlZF90YXMsIGEpICAgICAgICAgICAgICAgICAgICBtKG5lc3RlZF90aWNrZXQsIGEpICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbShuZXN0ZWRfcXVldWluZywgYSkgbShuZXN0ZWRfZHJkcGEsIGEpCisjIGVuZGlmIC8vIEtNUF9VU0VfRlVURVgKKyMgZGVmaW5lIEtNUF9MQVNUX0RfTE9DSyBsb2Nrc2VxX2hsZQorI2Vsc2UKKyMgaWYgS01QX1VTRV9GVVRFWAorIyAgZGVmaW5lIEtNUF9GT1JFQUNIX0RfTE9DSyhtLCBhKSAgbSh0YXMsIGEpIG0oZnV0ZXgsIGEpCisjICBkZWZpbmUgS01QX0ZPUkVBQ0hfSV9MT0NLKG0sIGEpICBtKHRpY2tldCwgYSkgbShxdWV1aW5nLCBhKSAgICAgICAgICAgICAgICBtKGRyZHBhLCBhKSAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbShuZXN0ZWRfdGFzLCBhKSBtKG5lc3RlZF9mdXRleCwgYSkgbShuZXN0ZWRfdGlja2V0LCBhKSAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0obmVzdGVkX3F1ZXVpbmcsIGEpIG0obmVzdGVkX2RyZHBhLCBhKQorIyAgZGVmaW5lIEtNUF9MQVNUX0RfTE9DSyBsb2Nrc2VxX2Z1dGV4CisjIGVsc2UKKyMgIGRlZmluZSBLTVBfRk9SRUFDSF9EX0xPQ0sobSwgYSkgIG0odGFzLCBhKQorIyAgZGVmaW5lIEtNUF9GT1JFQUNIX0lfTE9DSyhtLCBhKSAgbSh0aWNrZXQsIGEpIG0ocXVldWluZywgYSkgICAgICAgICAgICAgICAgbShkcmRwYSwgYSkgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0obmVzdGVkX3RhcywgYSkgICAgICAgICAgICAgICAgICAgIG0obmVzdGVkX3RpY2tldCwgYSkgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtKG5lc3RlZF9xdWV1aW5nLCBhKSBtKG5lc3RlZF9kcmRwYSwgYSkKKyMgIGRlZmluZSBLTVBfTEFTVF9EX0xPQ0sgbG9ja3NlcV90YXMKKyMgZW5kaWYgLy8gS01QX1VTRV9GVVRFWAorI2VuZGlmIC8vIEtNUF9VU0VfVFNYCisKKy8vIEluZm9ybWF0aW9uIHVzZWQgaW4gZHluYW1pYyBkaXNwYXRjaAorI2RlZmluZSBLTVBfTE9DS19TSElGVCAgIDggLy8gbnVtYmVyIG9mIGxvdyBiaXRzIHRvIGJlIHVzZWQgYXMgdGFnIGZvciBkaXJlY3QgbG9ja3MKKyNkZWZpbmUgS01QX0ZJUlNUX0RfTE9DSyBsb2Nrc2VxX3RhcworI2RlZmluZSBLTVBfRklSU1RfSV9MT0NLIGxvY2tzZXFfdGlja2V0CisjZGVmaW5lIEtNUF9MQVNUX0lfTE9DSyAgbG9ja3NlcV9uZXN0ZWRfZHJkcGEKKyNkZWZpbmUgS01QX05VTV9JX0xPQ0tTICAobG9ja3RhZ19uZXN0ZWRfZHJkcGErMSkgLy8gbnVtYmVyIG9mIGluZGlyZWN0IGxvY2sgdHlwZXMKKworLy8gQmFzZSB0eXBlIGZvciBkeW5hbWljIGxvY2tzLgordHlwZWRlZiBrbXBfdWludDMyIGttcF9keW5hX2xvY2tfdDsKKworLy8gTG9jayBzZXF1ZW5jZSB0aGF0IGVudW1lcmF0ZXMgYWxsIGxvY2sga2luZHMuCisvLyBBbHdheXMgbWFrZSB0aGlzIGVudW1lcmF0aW9uIGNvbnNpc3RlbnQgd2l0aCBrbXBfbG9ja3NlcV90IGluIHRoZSBpbmNsdWRlIGRpcmVjdG9yeS4KK3R5cGVkZWYgZW51bSB7CisgICAgbG9ja3NlcV9pbmRpcmVjdCA9IDAsCisjZGVmaW5lIGV4cGFuZF9zZXEobCxhKSBsb2Nrc2VxXyMjbCwKKyAgICBLTVBfRk9SRUFDSF9EX0xPQ0soZXhwYW5kX3NlcSwgMCkKKyAgICBLTVBfRk9SRUFDSF9JX0xPQ0soZXhwYW5kX3NlcSwgMCkKKyN1bmRlZiBleHBhbmRfc2VxCit9IGttcF9keW5hX2xvY2tzZXFfdDsKKworLy8gRW51bWVyYXRlcyBpbmRpcmVjdCBsb2NrIHRhZ3MuCit0eXBlZGVmIGVudW0geworI2RlZmluZSBleHBhbmRfdGFnKGwsYSkgbG9ja3RhZ18jI2wsCisgICAgS01QX0ZPUkVBQ0hfSV9MT0NLKGV4cGFuZF90YWcsIDApCisjdW5kZWYgZXhwYW5kX3RhZworfSBrbXBfaW5kaXJlY3RfbG9ja3RhZ190OworCisvLyBVdGlsaXR5IG1hY3JvcyB0aGF0IGV4dHJhY3QgaW5mb3JtYXRpb24gZnJvbSBsb2NrIHNlcXVlbmNlcy4KKyNkZWZpbmUgS01QX0lTX0RfTE9DSyhzZXEpICgoc2VxKSA+PSBLTVBfRklSU1RfRF9MT0NLICYmIChzZXEpIDw9IEtNUF9MQVNUX0RfTE9DSykKKyNkZWZpbmUgS01QX0lTX0lfTE9DSyhzZXEpICgoc2VxKSA+PSBLTVBfRklSU1RfSV9MT0NLICYmIChzZXEpIDw9IEtNUF9MQVNUX0lfTE9DSykKKyNkZWZpbmUgS01QX0dFVF9JX1RBRyhzZXEpIChrbXBfaW5kaXJlY3RfbG9ja3RhZ190KSgoc2VxKSAtIEtNUF9GSVJTVF9JX0xPQ0spCisjZGVmaW5lIEtNUF9HRVRfRF9UQUcoc2VxKSAoKHNlcSk8PDEgfCAxKQorCisvLyBFbnVtZXJhdGVzIGRpcmVjdCBsb2NrIHRhZ3Mgc3RhcnRpbmcgZnJvbSBpbmRpcmVjdCB0YWcuCit0eXBlZGVmIGVudW0geworI2RlZmluZSBleHBhbmRfdGFnKGwsYSkgbG9ja3RhZ18jI2wgPSBLTVBfR0VUX0RfVEFHKGxvY2tzZXFfIyNsKSwKKyAgICBLTVBfRk9SRUFDSF9EX0xPQ0soZXhwYW5kX3RhZywgMCkKKyN1bmRlZiBleHBhbmRfdGFnCit9IGttcF9kaXJlY3RfbG9ja3RhZ190OworCisvLyBJbmRpcmVjdCBsb2NrIHR5cGUKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBrbXBfdXNlcl9sb2NrX3AgbG9jazsKKyAgICBrbXBfaW5kaXJlY3RfbG9ja3RhZ190IHR5cGU7Cit9IGttcF9pbmRpcmVjdF9sb2NrX3Q7CisKKy8vIEZ1bmN0aW9uIHRhYmxlcyBmb3IgZGlyZWN0IGxvY2tzLiBTZXQvdW5zZXQvdGVzdCBkaWZmZXJlbnRpYXRlIGZ1bmN0aW9ucyB3aXRoL3dpdGhvdXQgY29uc2lzdGVuY3kgY2hlY2tpbmcuCitleHRlcm4gdm9pZCAoKl9fa21wX2RpcmVjdF9pbml0W10pKGttcF9keW5hX2xvY2tfdCAqLCBrbXBfZHluYV9sb2Nrc2VxX3QpOworZXh0ZXJuIHZvaWQgKCpfX2ttcF9kaXJlY3RfZGVzdHJveVtdKShrbXBfZHluYV9sb2NrX3QgKik7CitleHRlcm4gdm9pZCAoKigqX19rbXBfZGlyZWN0X3NldCkpKGttcF9keW5hX2xvY2tfdCAqLCBrbXBfaW50MzIpOworZXh0ZXJuIGludCAgKCooKl9fa21wX2RpcmVjdF91bnNldCkpKGttcF9keW5hX2xvY2tfdCAqLCBrbXBfaW50MzIpOworZXh0ZXJuIGludCAgKCooKl9fa21wX2RpcmVjdF90ZXN0KSkoa21wX2R5bmFfbG9ja190ICosIGttcF9pbnQzMik7CisKKy8vIEZ1bmN0aW9uIHRhYmxlcyBmb3IgaW5kaXJlY3QgbG9ja3MuIFNldC91bnNldC90ZXN0IGRpZmZlcmVudGlhdGUgZnVuY3Rpb25zIHdpdGgvd2l0aHVvdCBjb25zaXN0ZW5jeSBjaGVja2luZy4KK2V4dGVybiB2b2lkICgqX19rbXBfaW5kaXJlY3RfaW5pdFtdKShrbXBfdXNlcl9sb2NrX3ApOworZXh0ZXJuIHZvaWQgKCpfX2ttcF9pbmRpcmVjdF9kZXN0cm95W10pKGttcF91c2VyX2xvY2tfcCk7CitleHRlcm4gdm9pZCAoKigqX19rbXBfaW5kaXJlY3Rfc2V0KSkoa21wX3VzZXJfbG9ja19wLCBrbXBfaW50MzIpOworZXh0ZXJuIGludCAgKCooKl9fa21wX2luZGlyZWN0X3Vuc2V0KSkoa21wX3VzZXJfbG9ja19wLCBrbXBfaW50MzIpOworZXh0ZXJuIGludCAgKCooKl9fa21wX2luZGlyZWN0X3Rlc3QpKShrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMik7CisKKy8vIEV4dHJhY3RzIGRpcmVjdCBsb2NrIHRhZyBmcm9tIGEgdXNlciBsb2NrIHBvaW50ZXIKKyNkZWZpbmUgS01QX0VYVFJBQ1RfRF9UQUcobCkgICAoKigoa21wX2R5bmFfbG9ja190ICopKGwpKSAmICgoMTw8S01QX0xPQ0tfU0hJRlQpLTEpICYgLSgqKChrbXBfZHluYV9sb2NrX3QgKikobCkpICYgMSkpCisKKy8vIEV4dHJhY3RzIGluZGlyZWN0IGxvY2sgaW5kZXggZnJvbSBhIHVzZXIgbG9jayBwb2ludGVyCisjZGVmaW5lIEtNUF9FWFRSQUNUX0lfSU5ERVgobCkgKCooa21wX2xvY2tfaW5kZXhfdCAqKShsKSA+PiAxKQorCisvLyBSZXR1cm5zIGZ1bmN0aW9uIHBvaW50ZXIgdG8gdGhlIGRpcmVjdCBsb2NrIGZ1bmN0aW9uIHdpdGggbCAoa21wX2R5bmFfbG9ja190ICopIGFuZCBvcCAob3BlcmF0aW9uIHR5cGUpLgorI2RlZmluZSBLTVBfRF9MT0NLX0ZVTkMobCwgb3ApIF9fa21wX2RpcmVjdF8jI29wW0tNUF9FWFRSQUNUX0RfVEFHKGwpXQorCisvLyBSZXR1cm5zIGZ1bmN0aW9uIHBvaW50ZXIgdG8gdGhlIGluZGlyZWN0IGxvY2sgZnVuY3Rpb24gd2l0aCBsIChrbXBfaW5kaXJlY3RfbG9ja190ICopIGFuZCBvcCAob3BlcmF0aW9uIHR5cGUpLgorI2RlZmluZSBLTVBfSV9MT0NLX0ZVTkMobCwgb3ApIF9fa21wX2luZGlyZWN0XyMjb3BbKChrbXBfaW5kaXJlY3RfbG9ja190ICopKGwpKS0+dHlwZV0KKworLy8gSW5pdGlhbGl6ZXMgYSBkaXJlY3QgbG9jayB3aXRoIHRoZSBnaXZlbiBsb2NrIHBvaW50ZXIgYW5kIGxvY2sgc2VxdWVuY2UuCisjZGVmaW5lIEtNUF9JTklUX0RfTE9DSyhsLCBzZXEpIF9fa21wX2RpcmVjdF9pbml0W0tNUF9HRVRfRF9UQUcoc2VxKV0oKGttcF9keW5hX2xvY2tfdCAqKWwsIHNlcSkKKworLy8gSW5pdGlhbGl6ZXMgYW4gaW5kaXJlY3QgbG9jayB3aXRoIHRoZSBnaXZlbiBsb2NrIHBvaW50ZXIgYW5kIGxvY2sgc2VxdWVuY2UuCisjZGVmaW5lIEtNUF9JTklUX0lfTE9DSyhsLCBzZXEpIF9fa21wX2RpcmVjdF9pbml0WzBdKChrbXBfZHluYV9sb2NrX3QgKikobCksIHNlcSkKKworLy8gUmV0dXJucyAiZnJlZSIgbG9jayB2YWx1ZSBmb3IgdGhlIGdpdmVuIGxvY2sgdHlwZS4KKyNkZWZpbmUgS01QX0xPQ0tfRlJFRSh0eXBlKSAgICAgIChsb2NrdGFnXyMjdHlwZSkKKworLy8gUmV0dXJucyAiYnVzeSIgbG9jayB2YWx1ZSBmb3IgdGhlIGdpdmVuIGxvY2sgdGV5cC4KKyNkZWZpbmUgS01QX0xPQ0tfQlVTWSh2LCB0eXBlKSAgICgodik8PEtNUF9MT0NLX1NISUZUIHwgbG9ja3RhZ18jI3R5cGUpCisKKy8vIFJldHVybnMgbG9jayB2YWx1ZSBhZnRlciByZW1vdmluZyAoc2hpZnRpbmcpIGxvY2sgdGFnLgorI2RlZmluZSBLTVBfTE9DS19TVFJJUCh2KSAgICAgICAgKCh2KT4+S01QX0xPQ0tfU0hJRlQpCisKKy8vIEluaXRpYWxpemVzIGdsb2JhbCBzdGF0ZXMgYW5kIGRhdGEgc3RydWN0dXJlcyBmb3IgbWFuYWdpbmcgZHluYW1pYyB1c2VyIGxvY2tzLgorZXh0ZXJuIHZvaWQgX19rbXBfaW5pdF9keW5hbWljX3VzZXJfbG9ja3MoKTsKKworLy8gQWxsb2NhdGVzIGFuZCByZXR1cm5zIGFuIGluZGlyZWN0IGxvY2sgd2l0aCB0aGUgZ2l2ZW4gaW5kaXJlY3QgbG9jayB0YWcuCitleHRlcm4ga21wX2luZGlyZWN0X2xvY2tfdCAqIF9fa21wX2FsbG9jYXRlX2luZGlyZWN0X2xvY2sodm9pZCAqKiwga21wX2ludDMyLCBrbXBfaW5kaXJlY3RfbG9ja3RhZ190KTsKKworLy8gQ2xlYW5zIHVwIGdsb2JhbCBzdGF0ZXMgYW5kIGRhdGEgc3RydWN0dXJlcyBmb3IgbWFuYWdpbmcgZHluYW1pYyB1c2VyIGxvY2tzLgorZXh0ZXJuIHZvaWQgX19rbXBfY2xlYW51cF9pbmRpcmVjdF91c2VyX2xvY2tzKCk7CisKKy8vIERlZmF1bHQgdXNlciBsb2NrIHNlcXVlbmNlIHdoZW4gbm90IHVzaW5nIGhpbnRlZCBsb2Nrcy4gCitleHRlcm4ga21wX2R5bmFfbG9ja3NlcV90IF9fa21wX3VzZXJfbG9ja19zZXE7CisKKy8vIEp1bXAgdGFibGUgZm9yICJzZXQgbG9jayBsb2NhdGlvbiIsIGF2YWlsYWJsZSBvbmx5IGZvciBpbmRpcmVjdCBsb2Nrcy4KK2V4dGVybiB2b2lkICgqX19rbXBfaW5kaXJlY3Rfc2V0X2xvY2F0aW9uW0tNUF9OVU1fSV9MT0NLU10pKGttcF91c2VyX2xvY2tfcCwgY29uc3QgaWRlbnRfdCAqKTsKKyNkZWZpbmUgS01QX1NFVF9JX0xPQ0tfTE9DQVRJT04obGNrLCBsb2MpIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChfX2ttcF9pbmRpcmVjdF9zZXRfbG9jYXRpb25bKGxjayktPnR5cGVdICE9IE5VTEwpICAgICAgICAgICBcCisgICAgICAgIF9fa21wX2luZGlyZWN0X3NldF9sb2NhdGlvblsobGNrKS0+dHlwZV0oKGxjayktPmxvY2ssIGxvYyk7IFwKK30KKworLy8gSnVtcCB0YWJsZSBmb3IgInNldCBsb2NrIGZsYWdzIiwgYXZhaWxhYmxlIG9ubHkgZm9yIGluZGlyZWN0IGxvY2tzLgorZXh0ZXJuIHZvaWQgKCpfX2ttcF9pbmRpcmVjdF9zZXRfZmxhZ3NbS01QX05VTV9JX0xPQ0tTXSkoa21wX3VzZXJfbG9ja19wLCBrbXBfbG9ja19mbGFnc190KTsKKyNkZWZpbmUgS01QX1NFVF9JX0xPQ0tfRkxBR1MobGNrLCBmbGFnKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoX19rbXBfaW5kaXJlY3Rfc2V0X2ZsYWdzWyhsY2spLT50eXBlXSAhPSBOVUxMKSAgICAgICAgICAgIFwKKyAgICAgICAgX19rbXBfaW5kaXJlY3Rfc2V0X2ZsYWdzWyhsY2spLT50eXBlXSgobGNrKS0+bG9jaywgZmxhZyk7IFwKK30KKworLy8gSnVtcCB0YWJsZSBmb3IgImdldCBsb2NrIGxvY2F0aW9uIiwgYXZhaWxhYmxlIG9ubHkgZm9yIGluZGlyZWN0IGxvY2tzLgorZXh0ZXJuIGNvbnN0IGlkZW50X3QgKiAoKl9fa21wX2luZGlyZWN0X2dldF9sb2NhdGlvbltLTVBfTlVNX0lfTE9DS1NdKShrbXBfdXNlcl9sb2NrX3ApOworI2RlZmluZSBLTVBfR0VUX0lfTE9DS19MT0NBVElPTihsY2spICggX19rbXBfaW5kaXJlY3RfZ2V0X2xvY2F0aW9uWyhsY2spLT50eXBlXSAhPSBOVUxMICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBfX2ttcF9pbmRpcmVjdF9nZXRfbG9jYXRpb25bKGxjayktPnR5cGVdKChsY2spLT5sb2NrKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTlVMTCApCisKKy8vIEp1bXAgdGFibGUgZm9yICJnZXQgbG9jayBmbGFncyIsIGF2YWlsYWJsZSBvbmx5IGZvciBpbmRpcmVjdCBsb2Nrcy4KK2V4dGVybiBrbXBfbG9ja19mbGFnc190ICgqX19rbXBfaW5kaXJlY3RfZ2V0X2ZsYWdzW0tNUF9OVU1fSV9MT0NLU10pKGttcF91c2VyX2xvY2tfcCk7CisjZGVmaW5lIEtNUF9HRVRfSV9MT0NLX0ZMQUdTKGxjaykgKCBfX2ttcF9pbmRpcmVjdF9nZXRfZmxhZ3NbKGxjayktPnR5cGVdICE9IE5VTEwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IF9fa21wX2luZGlyZWN0X2dldF9mbGFnc1sobGNrKS0+dHlwZV0oKGxjayktPmxvY2spIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBOVUxMICkKKworI2RlZmluZSBLTVBfSV9MT0NLX0NIVU5LIDEwMjQgICAgICAgLy8gbnVtYmVyIG9mIGttcF9pbmRpcmVjdF9sb2NrX3Qgb2JqZWN0cyB0byBiZSBhbGxvY2F0ZWQgdG9nZXRoZXIKKworLy8gTG9jayB0YWJsZSBmb3IgaW5kaXJlY3QgbG9ja3MuCit0eXBlZGVmIHN0cnVjdCBrbXBfaW5kaXJlY3RfbG9ja190YWJsZSB7CisgICAga21wX2luZGlyZWN0X2xvY2tfdCAqKnRhYmxlOyAgICAvLyBibG9ja3Mgb2YgaW5kaXJlY3QgbG9ja3MgYWxsb2NhdGVkCisgICAga21wX2xvY2tfaW5kZXhfdCBzaXplOyAgICAgICAgICAvLyBzaXplIG9mIHRoZSBpbmRpcmVjdCBsb2NrIHRhYmxlCisgICAga21wX2xvY2tfaW5kZXhfdCBuZXh0OyAgICAgICAgICAvLyBpbmRleCB0byB0aGUgbmV4dCBsb2NrIHRvIGJlIGFsbG9jYXRlZAorfSBrbXBfaW5kaXJlY3RfbG9ja190YWJsZV90OworCitleHRlcm4ga21wX2luZGlyZWN0X2xvY2tfdGFibGVfdCBfX2ttcF9pX2xvY2tfdGFibGU7CisKKy8vIFJldHVybnMgdGhlIGluZGlyZWN0IGxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBpbmRleC4KKyNkZWZpbmUgS01QX0dFVF9JX0xPQ0soaW5kZXgpICgqKF9fa21wX2lfbG9ja190YWJsZS50YWJsZSArIChpbmRleCkvS01QX0lfTE9DS19DSFVOSykgKyAoaW5kZXgpJUtNUF9JX0xPQ0tfQ0hVTkspCisKKy8vIE51bWJlciBvZiBsb2NrcyBpbiBhIGxvY2sgYmxvY2ssIHdoaWNoIGlzIGZpeGVkIHRvICIxIiBub3cuCisvLyBUT0RPOiBObyBsb2NrIGJsb2NrIGltcGxlbWVudGF0aW9uIG5vdy4gSWYgd2UgZG8gc3VwcG9ydCwgd2UgbmVlZCB0byBtYW5hZ2UgbG9jayBibG9jayBkYXRhCisvLyBzdHJ1Y3R1cmUgZm9yIGVhY2ggaW5kaXJlY3QgbG9jayB0eXBlLgorZXh0ZXJuIGludCBfX2ttcF9udW1fbG9ja3NfaW5fYmxvY2s7CisKKy8vIEZhc3QgbG9jayB0YWJsZSBsb29rdXAgd2l0aG91dCBjb25zaXN0ZW5jeSBjaGVja2luZworI2RlZmluZSBLTVBfTE9PS1VQX0lfTE9DSyhsKSAoIChPTVBfTE9DS19UX1NJWkUgPCBzaXplb2Yodm9pZCAqKSkgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gS01QX0dFVF9JX0xPQ0soS01QX0VYVFJBQ1RfSV9JTkRFWChsKSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKigoa21wX2luZGlyZWN0X2xvY2tfdCAqKikobCkpICkKKworLy8gVXNlZCBvbmNlIGluIGttcF9lcnJvci5jCitleHRlcm4ga21wX2ludDMyCitfX2ttcF9nZXRfdXNlcl9sb2NrX293bmVyKGttcF91c2VyX2xvY2tfcCwga21wX3VpbnQzMik7CisKKyNlbHNlIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyMgZGVmaW5lIEtNUF9MT0NLX0JVU1kodiwgdHlwZSkgICAgKHYpCisjIGRlZmluZSBLTVBfTE9DS19GUkVFKHR5cGUpICAgICAgIDAKKyMgZGVmaW5lIEtNUF9MT0NLX1NUUklQKHYpICAgICAgICAgKHYpCisKKyNlbmRpZiAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLy8gZXh0ZXJuICJDIgorI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKyNlbmRpZiAvKiBLTVBfTE9DS19IICovCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9vbXAuaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9vbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzRkZTBmCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX29tcC5oCkBAIC0wLDAgKzEsMjMzIEBACisjaWYgVVNFX0RFQlVHR0VSCisvKgorICoga21wX29tcC5oIC0tIE9wZW5NUCBkZWZpbml0aW9uIGZvciBrbXBfb21wX3N0cnVjdF9pbmZvX3QuCisgKiAgICAgICAgICAgICAgVGhpcyBpcyBmb3IgaW5mb3JtYXRpb24gYWJvdXQgcnVudGltZSBsaWJyYXJ5IHN0cnVjdHVyZXMuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKy8qIFRISVMgRklMRSBTSE9VTEQgTk9UIEJFIE1PRElGSUVEIElOIElEQiBJTlRFUkZBQ0UgTElCUkFSWSBDT0RFCisgKiBJdCBzaG91bGQgaW5zdGVhZCBiZSBtb2RpZmllZCBpbiB0aGUgT3Blbk1QIHJ1bnRpbWUgYW5kIGNvcGllZAorICogdG8gdGhlIGludGVyZmFjZSBsaWJyYXJ5IGNvZGUuICBUaGlzIHdheSB3ZSBjYW4gbWluaW1pemUgdGhlCisgKiBwcm9ibGVtcyB0aGF0IHRoaXMgaXMgc3VyZSB0byBjYXVzZSBoYXZpbmcgdHdvIGNvcGllcyBvZiB0aGUKKyAqIHNhbWUgZmlsZS4KKyAqCisgKiBmaWxlcyBsaXZlIGluIGxpYm9tcCBhbmQgbGlib21wX2RiL3NyYy9pbmNsdWRlCisgKi8KKworLyogQ0hBTkdFIFRISVMgV0hFTiBTVFJVQ1RVUkVTIEJFTE9XIENIQU5HRQorICogQmVmb3JlIHdlIHJlbGVhc2UgdGhpcyB0byBhIGN1c3RvbWVyLCBwbGVhc2UgZG9uJ3QgY2hhbmdlIHRoaXMgdmFsdWUuICBBZnRlciBpdCBpcyByZWxlYXNlZCBhbmQKKyAqIHN0YWJsZSwgdGhlbiBhbnkgbmV3IHVwZGF0ZXMgdG8gdGhlIHN0cnVjdHVyZXMgb3IgZGF0YSBzdHJ1Y3R1cmUgdHJhdmVyc2FsIGFsZ29yaXRobXMgbmVlZCB0bworICogY2hhbmdlIHRoaXMgdmFsdWUuCisgKi8KKyNkZWZpbmUgS01QX09NUF9WRVJTSU9OIDkKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGttcF9pbnQzMiAgb2Zmc2V0OworICAgIGttcF9pbnQzMiAgc2l6ZTsKK30gb2Zmc2V0X2FuZF9zaXplX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBrbXBfdWludDY0ICAgIGFkZHI7CisgICAga21wX2ludDMyICAgICBzaXplOworICAgIGttcF9pbnQzMiAgICAgcGFkZGluZzsKK30gYWRkcl9hbmRfc2l6ZV90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAga21wX3VpbnQ2NCAgIGZsYWdzOyAgICAgICAgIC8vIEZsYWdzIGZvciBmdXR1cmUgZXh0ZW5zaW9ucy4KKyAgICBrbXBfdWludDY0ICAgZmlsZTsgICAgICAgICAgLy8gUG9pbnRlciB0byBuYW1lIG9mIHNvdXJjZSBmaWxlIHdoZXJlIHRoZSBwYXJhbGxlbCByZWdpb24gaXMuCisgICAga21wX3VpbnQ2NCAgIGZ1bmM7ICAgICAgICAgIC8vIFBvaW50ZXIgdG8gbmFtZSBvZiByb3V0aW5lIHdoZXJlIHRoZSBwYXJhbGxlbCByZWdpb24gaXMuCisgICAga21wX2ludDMyICAgIGJlZ2luOyAgICAgICAgIC8vIEJlZ2lubmluZyBvZiBzb3VyY2UgbGluZSByYW5nZS4KKyAgICBrbXBfaW50MzIgICAgZW5kOyAgICAgICAgICAgLy8gRW5kIG9mIHNvdXJjZSBsaW5lIHJhbmdlLgorICAgIGttcF9pbnQzMiAgICBudW1fdGhyZWFkczsgICAvLyBTcGVjaWZpZWQgbnVtYmVyIG9mIHRocmVhZHMuCit9IGttcF9vbXBfbnRocl9pdGVtX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBrbXBfaW50MzIgICAgIG51bTsgICAgICAgICAgLy8gTnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBhcnJyYXkuCisgICAga21wX3VpbnQ2NCAgICBhcnJheTsgICAgICAgIC8vIEFkZHJlc3Mgb2YgYXJyYXkgb2Yga21wX29tcF9udW1fdGhyZWFkc19pdGVtX3QuCit9IGttcF9vbXBfbnRocl9pbmZvX3Q7CisKKworLyogVGhpcyBzdHJ1Y3R1cmUgaXMga25vd24gdG8gdGhlIGlkYiBpbnRlcmZhY2UgbGlicmFyeSAqLwordHlwZWRlZiBzdHJ1Y3QgeworCisgICAgLyogQ2hhbmdlIHRoaXMgb25seSBpZiB5b3UgbWFrZSBhIGZ1bmRhbWVudGFsIGRhdGEgc3RydWN0dXJlIGNoYW5nZSBoZXJlICovCisgICAga21wX2ludDMyICAgICAgICAgIGxpYl92ZXJzaW9uOworCisgICAgLyogc2FuaXR5IGNoZWNrLiAgT25seSBzaG91bGQgYmUgY2hlY2tlZCBpZiB2ZXJzaW9ucyBhcmUgaWRlbnRpY2FsCisgICAgICogVGhpcyBpcyBhbHNvIHVzZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgdG8gZ2V0IHRoZSBydW50aW1lCisgICAgICogc3RydWN0dXJlIHNpemUgaWYgaXQgdGhlIHJ1bnRpbWUgaXMgb2xkZXIgdGhhbiB0aGUgaW50ZXJmYWNlICovCisgICAga21wX2ludDMyICAgICAgICAgIHNpemVvZl90aGlzX3N0cnVjdHVyZTsKKworICAgIC8qIE9wZW5NUCBSVEwgdmVyc2lvbiBpbmZvLiAqLworICAgIGFkZHJfYW5kX3NpemVfdCAgICBtYWpvcjsKKyAgICBhZGRyX2FuZF9zaXplX3QgICAgbWlub3I7CisgICAgYWRkcl9hbmRfc2l6ZV90ICAgIGJ1aWxkOworICAgIGFkZHJfYW5kX3NpemVfdCAgICBvcGVubXBfdmVyc2lvbjsKKyAgICBhZGRyX2FuZF9zaXplX3QgICAgYmFubmVyOworCisgICAgLyogVmFyaW91cyBnbG9iYWxzLiAqLworICAgIGFkZHJfYW5kX3NpemVfdCAgdGhyZWFkczsgICAgICAgICAgICAvLyBQb2ludGVyIHRvIF9fa21wX3RocmVhZHMuCisgICAgYWRkcl9hbmRfc2l6ZV90ICByb290czsgICAgICAgICAgICAgIC8vIFBvaW50ZXIgdG8gX19rbXBfcm9vdC4KKyAgICBhZGRyX2FuZF9zaXplX3QgIGNhcGFjaXR5OyAgICAgICAgICAgLy8gUG9pbnRlciB0byBfX2ttcF90aHJlYWRzX2NhcGFjaXR5LgorICAgIGFkZHJfYW5kX3NpemVfdCAgbW9uaXRvcjsgICAgICAgICAgICAvLyBQb2ludGVyIHRvIF9fa21wX21vbml0b3IuCisjaWYgISBLTVBfVVNFX0RZTkFNSUNfTE9DSworICAgIGFkZHJfYW5kX3NpemVfdCAgbG9ja190YWJsZTsgICAgICAgICAvLyBQb2ludGVyIHRvIF9fa21wX2xvY2tfdGFibGUuCisjZW5kaWYKKyAgICBhZGRyX2FuZF9zaXplX3QgIGZ1bmNfbWljcm90YXNrOworICAgIGFkZHJfYW5kX3NpemVfdCAgZnVuY19mb3JrOworICAgIGFkZHJfYW5kX3NpemVfdCAgZnVuY19mb3JrX3RlYW1zOworICAgIGFkZHJfYW5kX3NpemVfdCAgdGVhbV9jb3VudGVyOworICAgIGFkZHJfYW5kX3NpemVfdCAgdGFza19jb3VudGVyOworICAgIGFkZHJfYW5kX3NpemVfdCAgbnRocl9pbmZvOworICAgIGttcF9pbnQzMiAgICAgICAgYWRkcmVzc193aWR0aDsKKyAgICBrbXBfaW50MzIgICAgICAgIGluZGV4ZWRfbG9ja3M7CisgICAga21wX2ludDMyICAgICAgICBsYXN0X2JhcnJpZXI7ICAgICAgIC8vIFRoZSBlbmQgaW4gZW51bSBiYXJyaWVyX3R5cGUKKyAgICBrbXBfaW50MzIgICAgICAgIGRlcXVlX3NpemU7ICAgICAgICAgLy8gVEFTS19ERVFVRV9TSVpFCisKKyAgICAvKiB0aHJlYWQgc3RydWN0dXJlIGluZm9ybWF0aW9uLiAqLworICAgIGttcF9pbnQzMiAgICAgICAgICB0aF9zaXplb2Zfc3RydWN0OworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0aF9pbmZvOyAgICAgICAgICAvLyBkZXNjcmlwdG9yIGZvciB0aHJlYWQKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGhfdGVhbTsgICAgICAgICAgLy8gdGVhbSBmb3IgdGhpcyB0aHJlYWQKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGhfcm9vdDsgICAgICAgICAgLy8gcm9vdCBmb3IgdGhpcyB0aHJlYWQKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGhfc2VyaWFsX3RlYW07ICAgLy8gc2VyaWFsIHRlYW0gdW5kZXIgdGhpcyB0aHJlYWQKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGhfaWRlbnQ7ICAgICAgICAgLy8gbG9jYXRpb24gZm9yIHRoaXMgdGhyZWFkIChpZiBhdmFpbGFibGUpCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRoX3NwaW5faGVyZTsgICAgIC8vIGlzIHRocmVhZCB3YWl0aW5nIGZvciBsb2NrIChpZiBhdmFpbGFibGUpCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRoX25leHRfd2FpdGluZzsgIC8vIG5leHQgdGhyZWFkIHdhaXRpbmcgZm9yIGxvY2sgKGlmIGF2YWlsYWJsZSkKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGhfdGFza190ZWFtOyAgICAgLy8gdGFzayB0ZWFtIHN0cnVjdAorICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0aF9jdXJyZW50X3Rhc2s7ICAvLyBpbm5lcm1vc3QgdGFzayBiZWluZyBleGVjdXRlZAorICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0aF90YXNrX3N0YXRlOyAgICAvLyBhbHRlcm5hdGluZyAwLzEgZm9yIHRhc2sgdGVhbSBpZGVudGlmaWNhdGlvbgorICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0aF9iYXI7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRoX2Jfd29ya2VyX2Fycml2ZWQ7IC8vIHRoZSB3b3JrZXIgaW5jcmVhc2VzIGl0IGJ5IDEgd2hlbiBpdCBhcnJpdmVzIHRvIHRoZSBiYXJyaWVyCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIC8qIHRlYW1zIGluZm9ybWF0aW9uICovCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgdGhfdGVhbXNfbWljcm90YXNrOy8vIGVudHJ5IGFkZHJlc3MgZm9yIHRlYW1zIGNvbnN0cnVjdAorICAgIG9mZnNldF9hbmRfc2l6ZV90IHRoX3RlYW1zX2xldmVsOyAgICAvLyBpbml0aWFsIGxldmVsIG9mIHRlYW1zIGNvbnN0cnVjdAorICAgIG9mZnNldF9hbmRfc2l6ZV90IHRoX3RlYW1zX250ZWFtczsgICAvLyBudW1iZXIgb2YgdGVhbXMgaW4gYSBsZWFndWUKKyAgICBvZmZzZXRfYW5kX3NpemVfdCB0aF90ZWFtc19udGg7ICAgICAgLy8gbnVtYmVyIG9mIHRocmVhZHMgaW4gZWFjaCB0ZWFtIG9mIHRoZSBsZWFndWUKKyNlbmRpZgorCisgICAgLyoga21wX2Rlc2Mgc3RydWN0dXJlIChmb3IgaW5mbyBmaWVsZCBhYm92ZSkgKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgZHNfc2l6ZW9mX3N0cnVjdDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgZHNfdGlkOyAgICAgICAgICAgLy8gdGVhbSB0aHJlYWQgaWQKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgZHNfZ3RpZDsgICAgICAgICAgLy8gZ2xvYmFsIHRocmVhZCBpZAorICAgIG9mZnNldF9hbmRfc2l6ZV90ICBkc190aHJlYWQ7ICAgICAgICAvLyBuYXRpdmUgdGhyZWFkIGlkCisKKyAgICAvKiB0ZWFtIHN0cnVjdHVyZSBpbmZvcm1hdGlvbiAqLworICAgIGttcF9pbnQzMiAgICAgICAgICB0X3NpemVvZl9zdHJ1Y3Q7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRfbWFzdGVyX3RpZDsgICAgIC8vIHRpZCBvZiBtYXN0ZXIgaW4gcGFyZW50IHRlYW0KKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdF9pZGVudDsgICAgICAgICAgLy8gbG9jYXRpb24gb2YgcGFyYWxsZWwgcmVnaW9uCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRfcGFyZW50OyAgICAgICAgIC8vIHBhcmVudCB0ZWFtCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRfbnByb2M7ICAgICAgICAgIC8vICMgdGVhbSB0aHJlYWRzCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRfdGhyZWFkczsgICAgICAgIC8vIGFycmF5IG9mIHRocmVhZHMKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdF9zZXJpYWxpemVkOyAgICAgLy8gIyBsZXZlbHMgb2Ygc2VyaWFsaXplZCB0ZWFtcworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0X2lkOyAgICAgICAgICAgICAvLyB1bmlxdWUgdGVhbSBpZAorICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0X3BrZm47CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRfdGFza190ZWFtOyAgICAgIC8vIHRhc2sgdGVhbSBzdHJ1Y3R1cmUKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdF9pbXBsaWNpdF90YXNrOyAgLy8gdGFza2RhdGEgZm9yIHRoZSB0aHJlYWQncyBpbXBsaWNpdCB0YXNrCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdF9jYW5jZWxfcmVxdWVzdDsKKyNlbmRpZgorICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0X2JhcjsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdF9iX21hc3Rlcl9hcnJpdmVkOyAvLyBpbmNyZWFzZWQgYnkgMSB3aGVuIG1hc3RlciBhcnJpdmVzIHRvIGEgYmFycmllcgorICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0X2JfdGVhbV9hcnJpdmVkOyAgIC8vIGluY3JlYXNlZCBieSBvbmUgd2hlbiBhbGwgdGhlIHRocmVhZHMgYXJyaXZlZAorCisgICAgLyogcm9vdCBzdHJ1Y3R1cmUgaW5mb3JtYXRpb24gKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgcl9zaXplb2Zfc3RydWN0OworICAgIG9mZnNldF9hbmRfc2l6ZV90ICByX3Jvb3RfdGVhbTsgICAgICAvLyB0ZWFtIGF0IHJvb3QKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgcl9ob3RfdGVhbTsgICAgICAgLy8gaG90IHRlYW0gZm9yIHRoaXMgcm9vdAorICAgIG9mZnNldF9hbmRfc2l6ZV90ICByX3ViZXJfdGhyZWFkOyAgICAvLyByb290IHRocmVhZAorICAgIG9mZnNldF9hbmRfc2l6ZV90ICByX3Jvb3RfaWQ7ICAgICAgICAvLyB1bmlxdWUgcm9vdCBpZCAoaWYgYXZhaWxhYmxlKQorCisgICAgLyogaWRlbnQgc3RydWN0dXJlIGluZm9ybWF0aW9uICovCisgICAga21wX2ludDMyICAgICAgICAgIGlkX3NpemVvZl9zdHJ1Y3Q7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGlkX3Bzb3VyY2U7ICAgICAgIC8qIGFkZHJlc3Mgb2Ygc3RyaW5nICI7ZmlsZTtmdW5jO2xpbmUxO2xpbmUyOzsiLiAqLworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBpZF9mbGFnczsKKworICAgIC8qIGxvY2sgc3RydWN0dXJlIGluZm9ybWF0aW9uICovCisgICAga21wX2ludDMyICAgICAgICAgIGxrX3NpemVvZl9zdHJ1Y3Q7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGxrX2luaXRpYWxpemVkOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBsa19sb2NhdGlvbjsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgbGtfdGFpbF9pZDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgbGtfaGVhZF9pZDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgbGtfbmV4dF90aWNrZXQ7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGxrX25vd19zZXJ2aW5nOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBsa19vd25lcl9pZDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgbGtfZGVwdGhfbG9ja2VkOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBsa19sb2NrX2ZsYWdzOworCisjaWYgISBLTVBfVVNFX0RZTkFNSUNfTE9DSworICAgIC8qIGxvY2tfdGFibGVfdCAqLworICAgIGttcF9pbnQzMiAgICAgICAgICBsdF9zaXplX29mX3N0cnVjdDsgICAgLyogU2l6ZSBhbmQgbGF5b3V0IG9mIGttcF9sb2NrX3RhYmxlX3QuICovCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGx0X3VzZWQ7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGx0X2FsbG9jYXRlZDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgbHRfdGFibGU7CisjZW5kaWYKKworICAgIC8qIHRhc2tfdGVhbV90ICovCisgICAga21wX2ludDMyICAgICAgICAgIHR0X3NpemVvZl9zdHJ1Y3Q7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHR0X3RocmVhZHNfZGF0YTsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdHRfZm91bmRfdGFza3M7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHR0X25wcm9jOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0dF91bmZpbmlzaGVkX3RocmVhZHM7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHR0X2FjdGl2ZTsKKworICAgIC8qIGttcF90YXNrZGF0YV90ICovCisgICAga21wX2ludDMyICAgICAgICAgIHRkX3NpemVvZl9zdHJ1Y3Q7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRkX3Rhc2tfaWQ7ICAgICAgICAgICAgICAgICAgLy8gdGFzayBpZAorICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0ZF9mbGFnczsgICAgICAgICAgICAgICAgICAgIC8vIHRhc2sgZmxhZ3MKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGRfdGVhbTsgICAgICAgICAgICAgICAgICAgICAvLyB0ZWFtIGZvciB0aGlzIHRhc2sKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGRfcGFyZW50OyAgICAgICAgICAgICAgICAgICAvLyBwYXJlbnQgdGFzaworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0ZF9sZXZlbDsgICAgICAgICAgICAgICAgICAgIC8vIHRhc2sgdGVzdGluZyBsZXZlbAorICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0ZF9pZGVudDsgICAgICAgICAgICAgICAgICAgIC8vIHRhc2sgaWRlbnRpZmllcgorICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0ZF9hbGxvY2F0ZWRfY2hpbGRfdGFza3M7ICAgIC8vIGNoaWxkIHRhc2tzICgrIGN1cnJlbnQgdGFzaykgbm90IHlldCBkZWFsbG9jYXRlZAorICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0ZF9pbmNvbXBsZXRlX2NoaWxkX3Rhc2tzOyAgIC8vIGNoaWxkIHRhc2tzIG5vdCB5ZXQgY29tcGxldGUKKworICAgIC8qIFRhc2t3YWl0ICovCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRkX3Rhc2t3YWl0X2lkZW50OworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0ZF90YXNrd2FpdF9jb3VudGVyOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0ZF90YXNrd2FpdF90aHJlYWQ7ICAgICAgICAgIC8vIGd0aWQgKyAxIG9mIHRocmVhZCBlbmNvdW50ZXJlZCB0YXNrd2FpdAorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAvKiBUYXNrZ3JvdXAgKi8KKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGRfdGFza2dyb3VwOyAgICAgICAgICAgICAgICAvLyBwb2ludGVyIHRvIHRoZSBjdXJyZW50IHRhc2tncm91cAorICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0ZF90YXNrX2NvdW50OyAgICAgICAgICAgICAgIC8vIG51bWJlciBvZiBhbGxvY2F0ZWQgYW5kIG5vdCB5ZXQgY29tcGxldGUgdGFza3MKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGRfY2FuY2VsOyAgICAgICAgICAgICAgICAgICAvLyByZXF1ZXN0IGZvciBjYW5jZWxsYXRpb24gb2YgdGhpcyB0YXNrZ3JvdXAKKworICAgIC8qIFRhc2sgZGVwZW5kZW5jeSAqLworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0ZF9kZXBub2RlOyAgICAgICAgICAgICAgICAgIC8vIHBvaW50ZXIgdG8gZ3JhcGggbm9kZSBpZiB0aGUgdGFzayBoYXMgZGVwZW5kZW5jaWVzCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGRuX25vZGU7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGRuX25leHQ7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGRuX3N1Y2Nlc3NvcnM7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGRuX3Rhc2s7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGRuX25wcmVkZWNlc3NvcnM7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGRuX25yZWZzOworI2VuZGlmCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGRuX3JvdXRpbmU7CisKKyAgICAvKiBrbXBfdGhyZWFkX2RhdGFfdCAqLworICAgIGttcF9pbnQzMiAgICAgICAgICBoZF9zaXplb2Zfc3RydWN0OworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBoZF9kZXF1ZTsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgaGRfZGVxdWVfaGVhZDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgaGRfZGVxdWVfdGFpbDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgaGRfZGVxdWVfbnRhc2tzOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBoZF9kZXF1ZV9sYXN0X3N0b2xlbjsKKworICAgIC8vIFRoZSBsYXN0IGZpZWxkIG9mIHN0YWJsZSB2ZXJzaW9uLgorICAgIGttcF91aW50NjQgICAgICAgICBsYXN0X2ZpZWxkOworCit9IGttcF9vbXBfc3RydWN0X2luZm9fdDsKKworI2VuZGlmIC8qIFVTRV9ERUJVR0dFUiAqLworCisvKiBlbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX29zLmggYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTdlYWU0Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX29zLmgKQEAgLTAsMCArMSw3MTEgQEAKKy8qCisgKiBrbXBfb3MuaCAtLSBLUFRTIHJ1bnRpbWUgaGVhZGVyIGZpbGUuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX09TX0gKKyNkZWZpbmUgS01QX09TX0gKKworI2luY2x1ZGUgImttcF9jb25maWcuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2RlZmluZSBLTVBfRlROX1BMQUlOICAgMQorI2RlZmluZSBLTVBfRlROX0FQUEVORCAgMgorI2RlZmluZSBLTVBfRlROX1VQUEVSICAgMworLyoKKyNkZWZpbmUgS01QX0ZUTl9QUkVQRU5EIDQKKyNkZWZpbmUgS01QX0ZUTl9VQVBQRU5EIDUKKyovCisKKyNkZWZpbmUgS01QX1BUUl9TS0lQICAgIChzaXplb2Yodm9pZCopKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb21waWxlciB2YXJpYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEtNUF9PRkYJCQkJMAorI2RlZmluZSBLTVBfT04JCQkJMQorCisjZGVmaW5lIEtNUF9NRU1fQ09OU19WT0xBVElMRQkJMAorI2RlZmluZSBLTVBfTUVNX0NPTlNfRkVOQ0UJCTEKKworI2lmbmRlZiBLTVBfTUVNX0NPTlNfTU9ERUwKKyMgZGVmaW5lIEtNUF9NRU1fQ09OU19NT0RFTAkgS01QX01FTV9DT05TX1ZPTEFUSUxFCisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb21waWxlciByZWNvZ25pdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIEtNUF9DT01QSUxFUl9JQ0MgMAorI2RlZmluZSBLTVBfQ09NUElMRVJfR0NDIDAKKyNkZWZpbmUgS01QX0NPTVBJTEVSX0NMQU5HIDAKKyNkZWZpbmUgS01QX0NPTVBJTEVSX01TVkMgMAorCisjaWYgZGVmaW5lZCggX19JTlRFTF9DT01QSUxFUiApCisjIHVuZGVmIEtNUF9DT01QSUxFUl9JQ0MKKyMgZGVmaW5lIEtNUF9DT01QSUxFUl9JQ0MgMQorI2VsaWYgZGVmaW5lZCggX19jbGFuZ19fICkKKyMgdW5kZWYgS01QX0NPTVBJTEVSX0NMQU5HCisjIGRlZmluZSBLTVBfQ09NUElMRVJfQ0xBTkcgMQorI2VsaWYgZGVmaW5lZCggX19HTlVDX18gKQorIyB1bmRlZiBLTVBfQ09NUElMRVJfR0NDCisjIGRlZmluZSBLTVBfQ09NUElMRVJfR0NDIDEKKyNlbGlmIGRlZmluZWQoIF9NU0NfVkVSICkKKyMgdW5kZWYgS01QX0NPTVBJTEVSX01TVkMKKyMgZGVmaW5lIEtNUF9DT01QSUxFUl9NU1ZDIDEKKyNlbHNlCisjIGVycm9yIFVua25vd24gY29tcGlsZXIKKyNlbmRpZgorCisjaWYgKEtNUF9PU19MSU5VWCB8fCBLTVBfT1NfV0lORE9XUykgJiYgIUtNUF9PU19DTksgJiYgIUtNUF9BUkNIX1BQQzY0CisjIGRlZmluZSBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEIDEKKyMgaWYgS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2XzY0CisjICBkZWZpbmUgS01QX0dST1VQX0FGRklOSVRZICAgIDEKKyMgZWxzZQorIyAgZGVmaW5lIEtNUF9HUk9VUF9BRkZJTklUWSAgICAwCisjIGVuZGlmCisjZWxzZQorIyBkZWZpbmUgS01QX0FGRklOSVRZX1NVUFBPUlRFRCAwCisjIGRlZmluZSBLTVBfR1JPVVBfQUZGSU5JVFkgICAgIDAKKyNlbmRpZgorCisvKiBDaGVjayBmb3IgcXVhZC1wcmVjaXNpb24gZXh0ZW5zaW9uLiAqLworI2RlZmluZSBLTVBfSEFWRV9RVUFEIDAKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisjIGlmIEtNUF9DT01QSUxFUl9JQ0MKKyAgIC8qIF9RdWFkIGlzIGFscmVhZHkgZGVmaW5lZCBmb3IgaWNjICovCisjICB1bmRlZiAgS01QX0hBVkVfUVVBRAorIyAgZGVmaW5lIEtNUF9IQVZFX1FVQUQgMQorIyBlbGlmIEtNUF9DT01QSUxFUl9DTEFORworICAgLyogQ2xhbmcgZG9lc24ndCBzdXBwb3J0IGEgc29mdHdhcmUtaW1wbGVtZW50ZWQKKyAgICAgIDEyOC1iaXQgZXh0ZW5kZWQgcHJlY2lzaW9uIHR5cGUgeWV0ICovCisgICB0eXBlZGVmIGxvbmcgZG91YmxlIF9RdWFkOworIyBlbGlmIEtNUF9DT01QSUxFUl9HQ0MKKyAgIHR5cGVkZWYgX19mbG9hdDEyOCBfUXVhZDsKKyMgIHVuZGVmICBLTVBfSEFWRV9RVUFECisjICBkZWZpbmUgS01QX0hBVkVfUVVBRCAxCisjIGVsaWYgS01QX0NPTVBJTEVSX01TVkMKKyAgIHR5cGVkZWYgbG9uZyBkb3VibGUgX1F1YWQ7CisjIGVuZGlmCisjZWxzZQorIyBpZiBfX0xEQkxfTUFYX0VYUF9fID49IDE2Mzg0ICYmIEtNUF9DT01QSUxFUl9HQ0MKKyAgIHR5cGVkZWYgbG9uZyBkb3VibGUgX1F1YWQ7CisjICB1bmRlZiAgS01QX0hBVkVfUVVBRAorIyAgZGVmaW5lIEtNUF9IQVZFX1FVQUQgMQorIyBlbmRpZgorI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworI2lmIEtNUF9PU19XSU5ET1dTCisgIHR5cGVkZWYgY2hhciAgICAgICAgICAgICAga21wX2ludDg7CisgIHR5cGVkZWYgdW5zaWduZWQgY2hhciAgICAga21wX3VpbnQ4OworICB0eXBlZGVmIHNob3J0ICAgICAgICAgICAgIGttcF9pbnQxNjsKKyAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgICBrbXBfdWludDE2OworICB0eXBlZGVmIGludCAgICAgICAgICAgICAgIGttcF9pbnQzMjsKKyAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICBrbXBfdWludDMyOworIyBkZWZpbmUgS01QX0lOVDMyX1NQRUMgICAgICJkIgorIyBkZWZpbmUgS01QX1VJTlQzMl9TUEVDICAgICJ1IgorIyBpZm5kZWYgS01QX1NUUlVDVDY0CisgICB0eXBlZGVmIF9faW50NjQgCQlrbXBfaW50NjQ7CisgICB0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgCWttcF91aW50NjQ7CisgICAjZGVmaW5lIEtNUF9JTlQ2NF9TUEVDIAkiSTY0ZCIKKyAgICNkZWZpbmUgS01QX1VJTlQ2NF9TUEVDCSJJNjR1IgorIyBlbHNlCisgICBzdHJ1Y3Qga21wX3N0cnVjdDY0IHsKKyAgICBrbXBfaW50MzIgICBhLGI7CisgICB9OworICAgdHlwZWRlZiBzdHJ1Y3Qga21wX3N0cnVjdDY0IGttcF9pbnQ2NDsKKyAgIHR5cGVkZWYgc3RydWN0IGttcF9zdHJ1Y3Q2NCBrbXBfdWludDY0OworICAgLyogTm90IHN1cmUgd2hhdCB0byB1c2UgZm9yIEtNUF9bVV1JTlQ2NF9TUEVDIGhlcmUgKi8KKyMgZW5kaWYKKyMgaWYgS01QX0FSQ0hfWDg2XzY0CisjICBkZWZpbmUgS01QX0lOVFBUUiAxCisgICB0eXBlZGVmIF9faW50NjQgICAgICAgICAJa21wX2ludHB0cl90OworICAgdHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0CWttcF91aW50cHRyX3Q7CisjICBkZWZpbmUgS01QX0lOVFBUUl9TUEVDICAJIkk2NGQiCisjICBkZWZpbmUgS01QX1VJTlRQVFJfU1BFQyAJIkk2NHUiCisjIGVuZGlmCisjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KKworI2lmIEtNUF9PU19VTklYCisgIHR5cGVkZWYgY2hhciAgICAgICAgICAgICAgIGttcF9pbnQ4OworICB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICAgICBrbXBfdWludDg7CisgIHR5cGVkZWYgc2hvcnQgICAgICAgICAgICAgIGttcF9pbnQxNjsKKyAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgICAga21wX3VpbnQxNjsKKyAgdHlwZWRlZiBpbnQgICAgICAgICAgICAgICAga21wX2ludDMyOworICB0eXBlZGVmIHVuc2lnbmVkIGludCAgICAgICBrbXBfdWludDMyOworICB0eXBlZGVmIGxvbmcgbG9uZyAgICAgICAgICBrbXBfaW50NjQ7CisgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGttcF91aW50NjQ7CisjIGRlZmluZSBLTVBfSU5UMzJfU1BFQyAgICAgICJkIgorIyBkZWZpbmUgS01QX1VJTlQzMl9TUEVDICAgICAidSIKKyMgZGVmaW5lIEtNUF9JTlQ2NF9TUEVDCSAgICAgImxsZCIKKyMgZGVmaW5lIEtNUF9VSU5UNjRfU1BFQyAgICAgImxsdSIKKyNlbmRpZiAvKiBLTVBfT1NfVU5JWCAqLworCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX0FSTQorIyBkZWZpbmUgS01QX1NJWkVfVF9TUEVDIEtNUF9VSU5UMzJfU1BFQworI2VsaWYgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX1BQQzY0IHx8IEtNUF9BUkNIX0FBUkNINjQKKyMgZGVmaW5lIEtNUF9TSVpFX1RfU1BFQyBLTVBfVUlOVDY0X1NQRUMKKyNlbHNlCisjIGVycm9yICJDYW4ndCBkZXRlcm1pbmUgc2l6ZV90IHByaW50ZiBmb3JtYXQgc3BlY2lmaWVyLiIKKyNlbmRpZgorCisjaWYgS01QX0FSQ0hfWDg2CisjIGRlZmluZSBLTVBfU0laRV9UX01BWCAoMHhGRkZGRkZGRikKKyNlbHNlCisjIGRlZmluZSBLTVBfU0laRV9UX01BWCAoMHhGRkZGRkZGRkZGRkZGRkZGKQorI2VuZGlmCisKK3R5cGVkZWYgc2l6ZV90ICBrbXBfc2l6ZV90OwordHlwZWRlZiBmbG9hdCAgIGttcF9yZWFsMzI7Cit0eXBlZGVmIGRvdWJsZSAga21wX3JlYWw2NDsKKworI2lmbmRlZiBLTVBfSU5UUFRSCisjIGRlZmluZSBLTVBfSU5UUFRSIDEKKyAgdHlwZWRlZiBsb25nICAgICAgICAgICAgIGttcF9pbnRwdHJfdDsKKyAgdHlwZWRlZiB1bnNpZ25lZCBsb25nICAgIGttcF91aW50cHRyX3Q7CisjIGRlZmluZSBLTVBfSU5UUFRSX1NQRUMgICAibGQiCisjIGRlZmluZSBLTVBfVUlOVFBUUl9TUEVDICAibHUiCisjZW5kaWYKKworI2lmZGVmIEJVSUxEX0k4CisgIHR5cGVkZWYga21wX2ludDY0ICAgICAga21wX2ludDsKKyAgdHlwZWRlZiBrbXBfdWludDY0ICAgICBrbXBfdWludDsKKyNlbHNlCisgIHR5cGVkZWYga21wX2ludDMyICAgICAga21wX2ludDsKKyAgdHlwZWRlZiBrbXBfdWludDMyICAgICBrbXBfdWludDsKKyNlbmRpZiAvKiBCVUlMRF9JOCAqLworI2RlZmluZSAgS01QX0lOVF9NQVggICAgICgoa21wX2ludDMyKTB4N0ZGRkZGRkYpCisjZGVmaW5lICBLTVBfSU5UX01JTiAgICAgKChrbXBfaW50MzIpMHg4MDAwMDAwMCkKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gdGVtcGxhdGUgZm9yIGRlYnVnIHByaW50cyBzcGVjaWZpY2F0aW9uICggZCwgdSwgbGxkLCBsbHUgKSwgYW5kIHRvIG9idGFpbgorICAgIC8vIHNpZ25lZC91bnNpZ25lZCBmbGF2b3JzIG9mIGEgdHlwZQorICAgIHRlbXBsYXRlPCB0eXBlbmFtZSBUID4KKyAgICBzdHJ1Y3QgdHJhaXRzX3QgeworICAgICAgICB0eXBlZGVmIFQgICAgICAgICAgIHNpZ25lZF90OworICAgICAgICB0eXBlZGVmIFQgICAgICAgICAgIHVuc2lnbmVkX3Q7CisgICAgICAgIHR5cGVkZWYgVCAgICAgICAgICAgZmxvYXRpbmdfdDsKKyAgICAgICAgc3RhdGljIGNoYXIgY29uc3QgKiBzcGVjOworICAgIH07CisgICAgLy8gaW50CisgICAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCB0cmFpdHNfdDwgc2lnbmVkIGludCA+IHsKKyAgICAgICAgdHlwZWRlZiBzaWduZWQgaW50ICAgIHNpZ25lZF90OworICAgICAgICB0eXBlZGVmIHVuc2lnbmVkIGludCAgdW5zaWduZWRfdDsKKyAgICAgICAgdHlwZWRlZiBkb3VibGUgICAgICAgIGZsb2F0aW5nX3Q7CisgICAgICAgIHN0YXRpYyBjaGFyIGNvbnN0ICogICBzcGVjOworICAgIH07CisgICAgLy8gdW5zaWduZWQgaW50CisgICAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCB0cmFpdHNfdDwgdW5zaWduZWQgaW50ID4geworICAgICAgICB0eXBlZGVmIHNpZ25lZCBpbnQgICAgc2lnbmVkX3Q7CisgICAgICAgIHR5cGVkZWYgdW5zaWduZWQgaW50ICB1bnNpZ25lZF90OworICAgICAgICB0eXBlZGVmIGRvdWJsZSAgICAgICAgZmxvYXRpbmdfdDsKKyAgICAgICAgc3RhdGljIGNoYXIgY29uc3QgKiAgIHNwZWM7CisgICAgfTsKKyAgICAvLyBsb25nIGxvbmcKKyAgICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IHRyYWl0c190PCBzaWduZWQgbG9uZyBsb25nID4geworICAgICAgICB0eXBlZGVmIHNpZ25lZCBsb25nIGxvbmcgICAgc2lnbmVkX3Q7CisgICAgICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nICB1bnNpZ25lZF90OworICAgICAgICB0eXBlZGVmIGxvbmcgZG91YmxlICAgICAgICAgZmxvYXRpbmdfdDsKKyAgICAgICAgc3RhdGljIGNoYXIgY29uc3QgKiAgICAgICAgIHNwZWM7CisgICAgfTsKKyAgICAvLyB1bnNpZ25lZCBsb25nIGxvbmcKKyAgICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IHRyYWl0c190PCB1bnNpZ25lZCBsb25nIGxvbmcgPiB7CisgICAgICAgIHR5cGVkZWYgc2lnbmVkIGxvbmcgbG9uZyAgICBzaWduZWRfdDsKKyAgICAgICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgIHVuc2lnbmVkX3Q7CisgICAgICAgIHR5cGVkZWYgbG9uZyBkb3VibGUgICAgICAgICBmbG9hdGluZ190OworICAgICAgICBzdGF0aWMgY2hhciBjb25zdCAqICAgICAgICAgc3BlYzsKKyAgICB9OworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKyNkZWZpbmUgS01QX0VYUE9SVAlleHRlcm4JLyogZXhwb3J0IGRlY2xhcmF0aW9uIGluIGd1aWRlIGxpYnJhcmllcyAqLworCisjaWYgX19HTlVDX18gPj0gNAorICAgICNkZWZpbmUgX19mb3JjZWlubGluZSBfX2lubGluZQorI2VuZGlmCisKKyNkZWZpbmUgUEFHRV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAoMHg0MDAwKQorI2RlZmluZSBQQUdFX0FMSUdORUQoX2FkZHIpICAgICAoICEgKChzaXplX3QpIF9hZGRyICYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpKFBBR0VfU0laRSAtIDEpKSkKKyNkZWZpbmUgQUxJR05fVE9fUEFHRSh4KSAgICh2b2lkICopKCgoc2l6ZV90KSh4KSkgJiB+KChzaXplX3QpKFBBR0VfU0laRSAtIDEpKSkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTdXBwb3J0IGZvciBjYWNoZSBhbGlnbm1lbnQsIHBhZGRpbmcsIGV0Yy4gLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKyNkZWZpbmUgSU5URVJOT0RFX0NBQ0hFX0xJTkUgNDA5NiAvKiBmb3IgbXVsdGktbm9kZSBzeXN0ZW1zICovCisKKy8qIERlZmluZSB0aGUgZGVmYXVsdCBzaXplIG9mIHRoZSBjYWNoZSBsaW5lICovCisjaWZuZGVmIENBQ0hFX0xJTkUKKyAgICAjZGVmaW5lIENBQ0hFX0xJTkUgICAgICAgICAgICAgICAgICAxMjggICAgICAgICAvKiBjYWNoZSBsaW5lIHNpemUgaW4gYnl0ZXMgKi8KKyNlbHNlCisgICAgI2lmICggQ0FDSEVfTElORSA8IDY0ICkgJiYgISBkZWZpbmVkKCBLTVBfT1NfREFSV0lOICkKKyAgICAgICAgLy8gMjAwNi0wMi0xMzogVGhpcyBwcm9kdWNlcyB0b28gbWFueSB3YXJuaW5ncyBvbiBPUyBYKi4gRGlzYWJsZSBpdCBmb3IgYSB3aGlsZS4uLgorICAgICAgICAjd2FybmluZyBDQUNIRV9MSU5FIGlzIHRvbyBzbWFsbC4KKyAgICAjZW5kaWYKKyNlbmRpZiAvKiBDQUNIRV9MSU5FICovCisKKyNkZWZpbmUgS01QX0NBQ0hFX1BSRUZFVENIKEFERFIpIAkvKiBub3RoaW5nICovCisKKy8qIFRlbXBvcmFyeSBub3RlOiBpZiBwZXJmb3JtYW5jZSB0ZXN0aW5nIG9mIHRoaXMgcGFzc2VzLCB3ZSBjYW4gcmVtb3ZlCisgICBhbGwgcmVmZXJlbmNlcyB0byBLTVBfRE9fQUxJR04gYW5kIHJlcGxhY2Ugd2l0aCBLTVBfQUxJR04uICAqLworI2lmIEtNUF9PU19VTklYICYmIGRlZmluZWQoX19HTlVDX18pCisjIGRlZmluZSBLTVBfRE9fQUxJR04oYnl0ZXMpICBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKGJ5dGVzKSkpCisjIGRlZmluZSBLTVBfQUxJR05fQ0FDSEUgICAgICBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKENBQ0hFX0xJTkUpKSkKKyMgZGVmaW5lIEtNUF9BTElHTl9DQUNIRV9JTlRFUk5PREUgX19hdHRyaWJ1dGVfXygoYWxpZ25lZChJTlRFUk5PREVfQ0FDSEVfTElORSkpKQorIyBkZWZpbmUgS01QX0FMSUdOKGJ5dGVzKSAgICAgX19hdHRyaWJ1dGVfXygoYWxpZ25lZChieXRlcykpKQorI2Vsc2UKKyMgZGVmaW5lIEtNUF9ET19BTElHTihieXRlcykgIF9fZGVjbHNwZWMoIGFsaWduKGJ5dGVzKSApCisjIGRlZmluZSBLTVBfQUxJR05fQ0FDSEUgICAgICBfX2RlY2xzcGVjKCBhbGlnbihDQUNIRV9MSU5FKSApCisjIGRlZmluZSBLTVBfQUxJR05fQ0FDSEVfSU5URVJOT0RFICAgICAgX19kZWNsc3BlYyggYWxpZ24oSU5URVJOT0RFX0NBQ0hFX0xJTkUpICkKKyMgZGVmaW5lIEtNUF9BTElHTihieXRlcykgICAgIF9fZGVjbHNwZWMoIGFsaWduKGJ5dGVzKSApCisjZW5kaWYKKworLyogR2VuZXJhbCBwdXJwb3NlIGZlbmNlIHR5cGVzIGZvciBtZW1vcnkgb3BlcmF0aW9ucyAqLworZW51bSBrbXBfbWVtX2ZlbmNlX3R5cGUgeworICAgIGttcF9ub19mZW5jZSwgICAgICAgICAvKiBObyBtZW1vcnkgZmVuY2UgKi8KKyAgICBrbXBfYWNxdWlyZV9mZW5jZSwgICAgLyogQWNxdWlyZSAocmVhZCkgbWVtb3J5IGZlbmNlICovCisgICAga21wX3JlbGVhc2VfZmVuY2UsICAgIC8qIFJlbGVhc2UgKHdyaXRlKSBtZW1vcnkgZmVuY2UgKi8KKyAgICBrbXBfZnVsbF9mZW5jZSAgICAgICAgLyogRnVsbCAocmVhZCt3cml0ZSkgbWVtb3J5IGZlbmNlICovCit9OworCisKKy8vCisvLyBTeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcworLy8KKworI2lmIEtNUF9BU01fSU5UUklOUyAmJiBLTVBfT1NfV0lORE9XUworCisjaW5jbHVkZSA8V2luZG93cy5oPgorCisjcHJhZ21hIGludHJpbnNpYyhJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkKQorI3ByYWdtYSBpbnRyaW5zaWMoSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2UpCisjcHJhZ21hIGludHJpbnNpYyhJbnRlcmxvY2tlZEV4Y2hhbmdlKQorI3ByYWdtYSBpbnRyaW5zaWMoSW50ZXJsb2NrZWRFeGNoYW5nZTY0KQorCisvLworLy8gVXNpbmcgSW50ZXJsb2NrZWRJbmNyZW1lbnQgLyBJbnRlcmxvY2tlZERlY3JlbWVudCBjYXVzZXMgYSBsaWJyYXJ5IGxvYWRpbmcKKy8vIG9yZGVyaW5nIHByb2JsZW0sIHNvIHdlIHVzZSBJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkIGluc3RlYWQuCisvLworIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9JTkMzMihwKSAgICAgICAgICAgICAgICAgSW50ZXJsb2NrZWRFeGNoYW5nZUFkZCggKHZvbGF0aWxlIGxvbmcgKikocCksIDEgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9JTkNfQUNRMzIocCkgICAgICAgICAgICAgSW50ZXJsb2NrZWRFeGNoYW5nZUFkZCggKHZvbGF0aWxlIGxvbmcgKikocCksIDEgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ0XzMyKHApICAgICAgICAgICAgICAgSW50ZXJsb2NrZWRFeGNoYW5nZUFkZCggKHZvbGF0aWxlIGxvbmcgKikocCksIDQgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ0X0FDUTMyKHApICAgICAgICAgICAgSW50ZXJsb2NrZWRFeGNoYW5nZUFkZCggKHZvbGF0aWxlIGxvbmcgKikocCksIDQgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9ERUMzMihwKSAgICAgICAgICAgICAgICAgSW50ZXJsb2NrZWRFeGNoYW5nZUFkZCggKHZvbGF0aWxlIGxvbmcgKikocCksIC0xICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fREVDX0FDUTMyKHApICAgICAgICAgICAgIEludGVybG9ja2VkRXhjaGFuZ2VBZGQoICh2b2xhdGlsZSBsb25nICopKHApLCAtMSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDMyKHAsIHYpICAgICAgICAgICAgICBJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkKCAodm9sYXRpbGUgbG9uZyAqKShwKSwgKHYpICkKKworZXh0ZXJuIGttcF9pbnQ4IF9fa21wX3Rlc3RfdGhlbl9hZGQ4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggdiApOworZXh0ZXJuIGttcF9pbnQ4IF9fa21wX3Rlc3RfdGhlbl9vcjgoIHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCB2ICk7CitleHRlcm4ga21wX2ludDggX19rbXBfdGVzdF90aGVuX2FuZDgoIHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCB2ICk7CisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUMzIocCwgY3YsIHN2KSBJbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZSggKHZvbGF0aWxlIGxvbmcgKikocCksKGxvbmcpKHN2KSwobG9uZykoY3YpICkKKworIyBkZWZpbmUgS01QX1hDSEdfRklYRUQzMihwLCB2KSAgICAgICAgICAgICAgICAgSW50ZXJsb2NrZWRFeGNoYW5nZSggKHZvbGF0aWxlIGxvbmcgKikocCksIChsb25nKSh2KSApCisjIGRlZmluZSBLTVBfWENIR19GSVhFRDY0KHAsIHYpICAgICAgICAgICAgICAgICBJbnRlcmxvY2tlZEV4Y2hhbmdlNjQoICh2b2xhdGlsZSBrbXBfaW50NjQgKikocCksIChrbXBfaW50NjQpKHYpICkKKworaW5saW5lIGttcF9yZWFsMzIgS01QX1hDSEdfUkVBTDMyKCB2b2xhdGlsZSBrbXBfcmVhbDMyICpwLCBrbXBfcmVhbDMyIHYpCit7CisgICAga21wX2ludDMyIHRtcCA9IEludGVybG9ja2VkRXhjaGFuZ2UoICh2b2xhdGlsZSBsb25nICopcCwgKihsb25nICopJnYpOworICAgIHJldHVybiAqKGttcF9yZWFsMzIqKSZ0bXA7Cit9CisKKy8vCisvLyBSb3V0aW5lcyB0aGF0IHdlIHN0aWxsIG5lZWQgdG8gaW1wbGVtZW50IGluIGFzc2VtYmx5LgorLy8KK2V4dGVybiBrbXBfaW50MzIgX19rbXBfdGVzdF90aGVuX2FkZDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiB2ICk7CitleHRlcm4ga21wX2ludDMyIF9fa21wX3Rlc3RfdGhlbl9vcjMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiB2ICk7CitleHRlcm4ga21wX2ludDMyIF9fa21wX3Rlc3RfdGhlbl9hbmQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgdiApOworZXh0ZXJuIGttcF9pbnQ2NCBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IHYgKTsKK2V4dGVybiBrbXBfaW50NjQgX19rbXBfdGVzdF90aGVuX29yNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IHYgKTsKK2V4dGVybiBrbXBfaW50NjQgX19rbXBfdGVzdF90aGVuX2FuZDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCB2ICk7CisKK2V4dGVybiBrbXBfaW50OCBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgoIHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCBjdiwga21wX2ludDggc3YgKTsKK2V4dGVybiBrbXBfaW50MTYgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNiggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgY3YsIGttcF9pbnQxNiBzdiApOworZXh0ZXJuIGttcF9pbnQzMiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBjdiwga21wX2ludDMyIHN2ICk7CitleHRlcm4ga21wX2ludDMyIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGN2LCBrbXBfaW50NjQgc3YgKTsKK2V4dGVybiBrbXBfaW50OCAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OCggIHZvbGF0aWxlIGttcF9pbnQ4ICAqcCwga21wX2ludDggIGN2LCBrbXBfaW50OCAgc3YgKTsKK2V4dGVybiBrbXBfaW50MTYgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IGN2LCBrbXBfaW50MTYgc3YgKTsKK2V4dGVybiBrbXBfaW50MzIgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGN2LCBrbXBfaW50MzIgc3YgKTsKK2V4dGVybiBrbXBfaW50NjQgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGN2LCBrbXBfaW50NjQgc3YgKTsKKworZXh0ZXJuIGttcF9pbnQ4ICBfX2ttcF94Y2hnX2ZpeGVkOCggdm9sYXRpbGUga21wX2ludDggICpwLCBrbXBfaW50OCAgdiApOworZXh0ZXJuIGttcF9pbnQxNiBfX2ttcF94Y2hnX2ZpeGVkMTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IHYgKTsKK2V4dGVybiBrbXBfaW50MzIgX19rbXBfeGNoZ19maXhlZDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiB2ICk7CitleHRlcm4ga21wX2ludDY0IF9fa21wX3hjaGdfZml4ZWQ2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgdiApOworZXh0ZXJuIGttcF9yZWFsMzIgX19rbXBfeGNoZ19yZWFsMzIoIHZvbGF0aWxlIGttcF9yZWFsMzIgKnAsIGttcF9yZWFsMzIgdiApOworZXh0ZXJuIGttcF9yZWFsNjQgX19rbXBfeGNoZ19yZWFsNjQoIHZvbGF0aWxlIGttcF9yZWFsNjQgKnAsIGttcF9yZWFsNjQgdiApOworIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ4KHAsIHYpICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkOCggKHApLCAodikgKQorCisvLyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fSU5DMzIocCkgICAgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggKHApLCAxICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fT1I4KHAsIHYpICAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX29yOCggKHApLCAodikgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BTkQ4KHAsIHYpICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYW5kOCggKHApLCAodikgKQorLy8jIGRlZmluZSBLTVBfVEVTVF9USEVOX0lOQ19BQ1EzMihwKSAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoIChwKSwgMSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0lOQzY0KHApICAgICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIChwKSwgMUxMICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fSU5DX0FDUTY0KHApICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NCggKHApLCAxTEwgKQorLy8jIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDRfMzIocCkgICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoIChwKSwgNCApCisvLyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQURENF9BQ1EzMihwKSAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggKHApLCA0ICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQURENF82NChwKSAgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NCggKHApLCA0TEwgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ0X0FDUTY0KHApICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDY0KCAocCksIDRMTCApCisvLyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fREVDMzIocCkgICAgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggKHApLCAtMSApCisvLyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fREVDX0FDUTMyKHApICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggKHApLCAtMSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0RFQzY0KHApICAgICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIChwKSwgLTFMTCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0RFQ19BQ1E2NChwKSAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIChwKSwgLTFMTCApCisvLyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQUREMzIocCwgdikgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggKHApLCAodikgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ2NChwLCB2KSAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDY0KCAocCksICh2KSApCisKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fT1IzMihwLCB2KSAgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9vcjMyKCAocCksICh2KSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FORDMyKHAsIHYpICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYW5kMzIoIChwKSwgKHYpICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fT1I2NChwLCB2KSAgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9vcjY0KCAocCksICh2KSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FORDY0KHAsIHYpICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYW5kNjQoIChwKSwgKHYpICkKKworIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTgocCwgY3YsIHN2KSAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4KCAocCksIChjdiksIChzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDgocCwgY3YsIHN2KSAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4KCAocCksIChjdiksIChzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTE2KHAsIGN2LCBzdikgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNiggKHApLCAoY3YpLCAoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUwxNihwLCBjdiwgc3YpIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYoIChwKSwgKGN2KSwgKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIocCwgY3YsIHN2KSBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyKCAocCksIChjdiksIChzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDMyKHAsIGN2LCBzdikgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMiggKHApLCAoY3YpLCAoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1E2NChwLCBjdiwgc3YpIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQoIChwKSwgKGN2KSwgKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMNjQocCwgY3YsIHN2KSBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0KCAocCksIChjdiksIChzdikgKQorCisjIGlmIEtNUF9BUkNIX1g4NgorIyAgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9QVFIocCwgY3YsIHN2KSAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMiggKHZvbGF0aWxlIGttcF9pbnQzMiopKHApLCAoa21wX2ludDMyKShjdiksIChrbXBfaW50MzIpKHN2KSApCisjIGVsc2UgLyogNjQgYml0IHBvaW50ZXJzICovCisjICBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1BUUihwLCBjdiwgc3YpICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0KCAodm9sYXRpbGUga21wX2ludDY0KikocCksIChrbXBfaW50NjQpKGN2KSwgKGttcF9pbnQ2NCkoc3YpICkKKyMgZW5kaWYgLyogS01QX0FSQ0hfWDg2ICovCisKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQ4KHAsIGN2LCBzdikgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDgoIChwKSwgKGN2KSwgKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUMTYocCwgY3YsIHN2KSBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNiggKHApLCAoY3YpLCAoc3YpICkKKy8vIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFVDMyKHAsIGN2LCBzdikgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIoIChwKSwgKGN2KSwgKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUNjQocCwgY3YsIHN2KSBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NCggKHApLCAoY3YpLCAoc3YpICkKKworIyBkZWZpbmUgS01QX1hDSEdfRklYRUQ4KHAsIHYpICAgICAgICAgICAgICAgICAgX19rbXBfeGNoZ19maXhlZDgoICh2b2xhdGlsZSBrbXBfaW50OCopKHApLCAoa21wX2ludDgpKHYpICk7CisjIGRlZmluZSBLTVBfWENIR19GSVhFRDE2KHAsIHYpICAgICAgICAgICAgICAgICBfX2ttcF94Y2hnX2ZpeGVkMTYoIChwKSwgKHYpICk7CisvLyMgZGVmaW5lIEtNUF9YQ0hHX0ZJWEVEMzIocCwgdikgICAgICAgICAgICAgICAgIF9fa21wX3hjaGdfZml4ZWQzMiggKHApLCAodikgKTsKKy8vIyBkZWZpbmUgS01QX1hDSEdfRklYRUQ2NChwLCB2KSAgICAgICAgICAgICAgICAgX19rbXBfeGNoZ19maXhlZDY0KCAocCksICh2KSApOworLy8jIGRlZmluZSBLTVBfWENIR19SRUFMMzIocCwgdikgICAgICAgICAgICAgICAgICBfX2ttcF94Y2hnX3JlYWwzMiggKHApLCAodikgKTsKKyMgZGVmaW5lIEtNUF9YQ0hHX1JFQUw2NChwLCB2KSAgICAgICAgICAgICAgICAgIF9fa21wX3hjaGdfcmVhbDY0KCAocCksICh2KSApOworCisKKyNlbGlmIChLTVBfQVNNX0lOVFJJTlMgJiYgS01QX09TX1VOSVgpIHx8ICEoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQUREOChwLCB2KSAgICAgICAgICAgICAgIF9fc3luY19mZXRjaF9hbmRfYWRkKCAoa21wX2ludDggKikocCksICh2KSApCisKKy8qIGNhc3QgcCB0byBjb3JyZWN0IHR5cGUgc28gdGhhdCBwcm9wZXIgaW50cmluc2ljIHdpbGwgYmUgdXNlZCAqLworIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9JTkMzMihwKSAgICAgICAgICAgICAgICAgX19zeW5jX2ZldGNoX2FuZF9hZGQoIChrbXBfaW50MzIgKikocCksIDEgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9PUjgocCwgdikgICAgICAgICAgICAgICAgX19zeW5jX2ZldGNoX2FuZF9vciggKGttcF9pbnQ4ICopKHApLCAodikgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BTkQ4KHAsIHYpICAgICAgICAgICAgICAgX19zeW5jX2ZldGNoX2FuZF9hbmQoIChrbXBfaW50OCAqKShwKSwgKHYpICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fSU5DX0FDUTMyKHApICAgICAgICAgICAgIF9fc3luY19mZXRjaF9hbmRfYWRkKCAoa21wX2ludDMyICopKHApLCAxICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fSU5DNjQocCkgICAgICAgICAgICAgICAgIF9fc3luY19mZXRjaF9hbmRfYWRkKCAoa21wX2ludDY0ICopKHApLCAxTEwgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9JTkNfQUNRNjQocCkgICAgICAgICAgICAgX19zeW5jX2ZldGNoX2FuZF9hZGQoIChrbXBfaW50NjQgKikocCksIDFMTCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDRfMzIocCkgICAgICAgICAgICAgICBfX3N5bmNfZmV0Y2hfYW5kX2FkZCggKGttcF9pbnQzMiAqKShwKSwgNCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDRfQUNRMzIocCkgICAgICAgICAgICBfX3N5bmNfZmV0Y2hfYW5kX2FkZCggKGttcF9pbnQzMiAqKShwKSwgNCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDRfNjQocCkgICAgICAgICAgICAgICBfX3N5bmNfZmV0Y2hfYW5kX2FkZCggKGttcF9pbnQ2NCAqKShwKSwgNExMICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQURENF9BQ1E2NChwKSAgICAgICAgICAgIF9fc3luY19mZXRjaF9hbmRfYWRkKCAoa21wX2ludDY0ICopKHApLCA0TEwgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9ERUMzMihwKSAgICAgICAgICAgICAgICAgX19zeW5jX2ZldGNoX2FuZF9zdWIoIChrbXBfaW50MzIgKikocCksIDEgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9ERUNfQUNRMzIocCkgICAgICAgICAgICAgX19zeW5jX2ZldGNoX2FuZF9zdWIoIChrbXBfaW50MzIgKikocCksIDEgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9ERUM2NChwKSAgICAgICAgICAgICAgICAgX19zeW5jX2ZldGNoX2FuZF9zdWIoIChrbXBfaW50NjQgKikocCksIDFMTCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0RFQ19BQ1E2NChwKSAgICAgICAgICAgICBfX3N5bmNfZmV0Y2hfYW5kX3N1YiggKGttcF9pbnQ2NCAqKShwKSwgMUxMICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQUREMzIocCwgdikgICAgICAgICAgICAgIF9fc3luY19mZXRjaF9hbmRfYWRkKCAoa21wX2ludDMyICopKHApLCAodikgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ2NChwLCB2KSAgICAgICAgICAgICAgX19zeW5jX2ZldGNoX2FuZF9hZGQoIChrbXBfaW50NjQgKikocCksICh2KSApCisKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fT1IzMihwLCB2KSAgICAgICAgICAgICAgIF9fc3luY19mZXRjaF9hbmRfb3IoIChrbXBfaW50MzIgKikocCksICh2KSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FORDMyKHAsIHYpICAgICAgICAgICAgICBfX3N5bmNfZmV0Y2hfYW5kX2FuZCggKGttcF9pbnQzMiAqKShwKSwgKHYpICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fT1I2NChwLCB2KSAgICAgICAgICAgICAgIF9fc3luY19mZXRjaF9hbmRfb3IoIChrbXBfaW50NjQgKikocCksICh2KSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FORDY0KHAsIHYpICAgICAgICAgICAgICBfX3N5bmNfZmV0Y2hfYW5kX2FuZCggKGttcF9pbnQ2NCAqKShwKSwgKHYpICkKKworIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTgocCwgY3YsIHN2KSAgX19zeW5jX2Jvb2xfY29tcGFyZV9hbmRfc3dhcCggKHZvbGF0aWxlIGttcF91aW50OCAqKShwKSwoa21wX3VpbnQ4KShjdiksKGttcF91aW50OCkoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUw4KHAsIGN2LCBzdikgIF9fc3luY19ib29sX2NvbXBhcmVfYW5kX3N3YXAoICh2b2xhdGlsZSBrbXBfdWludDggKikocCksKGttcF91aW50OCkoY3YpLChrbXBfdWludDgpKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMTYocCwgY3YsIHN2KSBfX3N5bmNfYm9vbF9jb21wYXJlX2FuZF9zd2FwKCAodm9sYXRpbGUga21wX3VpbnQxNiAqKShwKSwoa21wX3VpbnQxNikoY3YpLChrbXBfdWludDE2KShzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDE2KHAsIGN2LCBzdikgX19zeW5jX2Jvb2xfY29tcGFyZV9hbmRfc3dhcCggKHZvbGF0aWxlIGttcF91aW50MTYgKikocCksKGttcF91aW50MTYpKGN2KSwoa21wX3VpbnQxNikoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMihwLCBjdiwgc3YpIF9fc3luY19ib29sX2NvbXBhcmVfYW5kX3N3YXAoICh2b2xhdGlsZSBrbXBfdWludDMyICopKHApLChrbXBfdWludDMyKShjdiksKGttcF91aW50MzIpKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMMzIocCwgY3YsIHN2KSBfX3N5bmNfYm9vbF9jb21wYXJlX2FuZF9zd2FwKCAodm9sYXRpbGUga21wX3VpbnQzMiAqKShwKSwoa21wX3VpbnQzMikoY3YpLChrbXBfdWludDMyKShzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTY0KHAsIGN2LCBzdikgX19zeW5jX2Jvb2xfY29tcGFyZV9hbmRfc3dhcCggKHZvbGF0aWxlIGttcF91aW50NjQgKikocCksKGttcF91aW50NjQpKGN2KSwoa21wX3VpbnQ2NCkoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUw2NChwLCBjdiwgc3YpIF9fc3luY19ib29sX2NvbXBhcmVfYW5kX3N3YXAoICh2b2xhdGlsZSBrbXBfdWludDY0ICopKHApLChrbXBfdWludDY0KShjdiksKGttcF91aW50NjQpKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUFRSKHAsIGN2LCBzdikgICBfX3N5bmNfYm9vbF9jb21wYXJlX2FuZF9zd2FwKCAodm9sYXRpbGUgdm9pZCAqKikocCksKHZvaWQgKikoY3YpLCh2b2lkICopKHN2KSApCisKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQ4KHAsIGN2LCBzdikgIF9fc3luY192YWxfY29tcGFyZV9hbmRfc3dhcCggKHZvbGF0aWxlIGttcF91aW50OCAqKShwKSwoa21wX3VpbnQ4KShjdiksKGttcF91aW50OCkoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQxNihwLCBjdiwgc3YpIF9fc3luY192YWxfY29tcGFyZV9hbmRfc3dhcCggKHZvbGF0aWxlIGttcF91aW50MTYgKikocCksKGttcF91aW50MTYpKGN2KSwoa21wX3VpbnQxNikoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQzMihwLCBjdiwgc3YpIF9fc3luY192YWxfY29tcGFyZV9hbmRfc3dhcCggKHZvbGF0aWxlIGttcF91aW50MzIgKikocCksKGttcF91aW50MzIpKGN2KSwoa21wX3VpbnQzMikoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQ2NChwLCBjdiwgc3YpIF9fc3luY192YWxfY29tcGFyZV9hbmRfc3dhcCggKHZvbGF0aWxlIGttcF91aW50NjQgKikocCksKGttcF91aW50NjQpKGN2KSwoa21wX3VpbnQ2NCkoc3YpICkKKworI2RlZmluZSBLTVBfWENIR19GSVhFRDgocCwgdikgICAgICAgICAgICAgICAgICAgX19zeW5jX2xvY2tfdGVzdF9hbmRfc2V0KCAodm9sYXRpbGUga21wX3VpbnQ4ICopKHApLCAoa21wX3VpbnQ4KSh2KSApCisjZGVmaW5lIEtNUF9YQ0hHX0ZJWEVEMTYocCwgdikgICAgICAgICAgICAgICAgICBfX3N5bmNfbG9ja190ZXN0X2FuZF9zZXQoICh2b2xhdGlsZSBrbXBfdWludDE2ICopKHApLCAoa21wX3VpbnQxNikodikgKQorI2RlZmluZSBLTVBfWENIR19GSVhFRDMyKHAsIHYpICAgICAgICAgICAgICAgICAgX19zeW5jX2xvY2tfdGVzdF9hbmRfc2V0KCAodm9sYXRpbGUga21wX3VpbnQzMiAqKShwKSwgKGttcF91aW50MzIpKHYpICkKKyNkZWZpbmUgS01QX1hDSEdfRklYRUQ2NChwLCB2KSAgICAgICAgICAgICAgICAgIF9fc3luY19sb2NrX3Rlc3RfYW5kX3NldCggKHZvbGF0aWxlIGttcF91aW50NjQgKikocCksIChrbXBfdWludDY0KSh2KSApCisKK2V4dGVybiBrbXBfaW50OCBfX2ttcF90ZXN0X3RoZW5fYWRkOCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IHYgKTsKK2V4dGVybiBrbXBfaW50OCBfX2ttcF90ZXN0X3RoZW5fb3I4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggdiApOworZXh0ZXJuIGttcF9pbnQ4IF9fa21wX3Rlc3RfdGhlbl9hbmQ4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggdiApOworaW5saW5lIGttcF9yZWFsMzIgS01QX1hDSEdfUkVBTDMyKCB2b2xhdGlsZSBrbXBfcmVhbDMyICpwLCBrbXBfcmVhbDMyIHYpCit7CisgICAga21wX2ludDMyIHRtcCA9IF9fc3luY19sb2NrX3Rlc3RfYW5kX3NldCggKGttcF9pbnQzMiopcCwgKihrbXBfaW50MzIqKSZ2KTsKKyAgICByZXR1cm4gKihrbXBfcmVhbDMyKikmdG1wOworfQorCitpbmxpbmUga21wX3JlYWw2NCBLTVBfWENIR19SRUFMNjQoIHZvbGF0aWxlIGttcF9yZWFsNjQgKnAsIGttcF9yZWFsNjQgdikKK3sKKyAgICBrbXBfaW50NjQgdG1wID0gX19zeW5jX2xvY2tfdGVzdF9hbmRfc2V0KCAoa21wX2ludDY0KilwLCAqKGttcF9pbnQ2NCopJnYpOworICAgIHJldHVybiAqKGttcF9yZWFsNjQqKSZ0bXA7Cit9CisKKyNlbHNlCisKK2V4dGVybiBrbXBfaW50MzIgX19rbXBfdGVzdF90aGVuX2FkZDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiB2ICk7CitleHRlcm4ga21wX2ludDMyIF9fa21wX3Rlc3RfdGhlbl9vcjMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiB2ICk7CitleHRlcm4ga21wX2ludDMyIF9fa21wX3Rlc3RfdGhlbl9hbmQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgdiApOworZXh0ZXJuIGttcF9pbnQ2NCBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IHYgKTsKK2V4dGVybiBrbXBfaW50NjQgX19rbXBfdGVzdF90aGVuX29yNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IHYgKTsKK2V4dGVybiBrbXBfaW50NjQgX19rbXBfdGVzdF90aGVuX2FuZDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCB2ICk7CisKK2V4dGVybiBrbXBfaW50OCBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgoIHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCBjdiwga21wX2ludDggc3YgKTsKK2V4dGVybiBrbXBfaW50MTYgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNiggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgY3YsIGttcF9pbnQxNiBzdiApOworZXh0ZXJuIGttcF9pbnQzMiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBjdiwga21wX2ludDMyIHN2ICk7CitleHRlcm4ga21wX2ludDMyIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGN2LCBrbXBfaW50NjQgc3YgKTsKK2V4dGVybiBrbXBfaW50OCAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OCggIHZvbGF0aWxlIGttcF9pbnQ4ICAqcCwga21wX2ludDggIGN2LCBrbXBfaW50OCAgc3YgKTsKK2V4dGVybiBrbXBfaW50MTYgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IGN2LCBrbXBfaW50MTYgc3YgKTsKK2V4dGVybiBrbXBfaW50MzIgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGN2LCBrbXBfaW50MzIgc3YgKTsKK2V4dGVybiBrbXBfaW50NjQgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGN2LCBrbXBfaW50NjQgc3YgKTsKKworZXh0ZXJuIGttcF9pbnQ4ICBfX2ttcF94Y2hnX2ZpeGVkOCggdm9sYXRpbGUga21wX2ludDggICpwLCBrbXBfaW50OCAgdiApOworZXh0ZXJuIGttcF9pbnQxNiBfX2ttcF94Y2hnX2ZpeGVkMTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IHYgKTsKK2V4dGVybiBrbXBfaW50MzIgX19rbXBfeGNoZ19maXhlZDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiB2ICk7CitleHRlcm4ga21wX2ludDY0IF9fa21wX3hjaGdfZml4ZWQ2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgdiApOworZXh0ZXJuIGttcF9yZWFsMzIgX19rbXBfeGNoZ19yZWFsMzIoIHZvbGF0aWxlIGttcF9yZWFsMzIgKnAsIGttcF9yZWFsMzIgdiApOworIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ4KHAsIHYpICAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDgoIChwKSwgKHYpICkKK2V4dGVybiBrbXBfcmVhbDY0IF9fa21wX3hjaGdfcmVhbDY0KCB2b2xhdGlsZSBrbXBfcmVhbDY0ICpwLCBrbXBfcmVhbDY0IHYgKTsKKworIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9JTkMzMihwKSAgICAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDMyKCAocCksIDEgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9PUjgocCwgdikgICAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX29yOCggKHApLCAodikgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BTkQ4KHAsIHYpICAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FuZDgoIChwKSwgKHYpICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fSU5DX0FDUTMyKHApICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggKHApLCAxICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fSU5DNjQocCkgICAgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NCggKHApLCAxTEwgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9JTkNfQUNRNjQocCkgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDY0KCAocCksIDFMTCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDRfMzIocCkgICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoIChwKSwgNCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDRfQUNRMzIocCkgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoIChwKSwgNCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDRfNjQocCkgICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIChwKSwgNExMICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQURENF9BQ1E2NChwKSAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NCggKHApLCA0TEwgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9ERUMzMihwKSAgICAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDMyKCAocCksIC0xICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fREVDX0FDUTMyKHApICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggKHApLCAtMSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0RFQzY0KHApICAgICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIChwKSwgLTFMTCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0RFQ19BQ1E2NChwKSAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIChwKSwgLTFMTCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDMyKHAsIHYpICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoIChwKSwgKHYpICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQURENjQocCwgdikgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NCggKHApLCAodikgKQorCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX09SMzIocCwgdikgICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fb3IzMiggKHApLCAodikgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BTkQzMihwLCB2KSAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FuZDMyKCAocCksICh2KSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX09SNjQocCwgdikgICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fb3I2NCggKHApLCAodikgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BTkQ2NChwLCB2KSAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FuZDY0KCAocCksICh2KSApCisKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1E4KHAsIGN2LCBzdikgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOCggKHApLCAoY3YpLCAoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUw4KHAsIGN2LCBzdikgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOCggKHApLCAoY3YpLCAoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1ExNihwLCBjdiwgc3YpIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYoIChwKSwgKGN2KSwgKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMMTYocCwgY3YsIHN2KSBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2KCAocCksIChjdiksIChzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKHAsIGN2LCBzdikgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMiggKHApLCAoY3YpLCAoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUwzMihwLCBjdiwgc3YpIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIoIChwKSwgKGN2KSwgKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRNjQocCwgY3YsIHN2KSBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0KCAocCksIChjdiksIChzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDY0KHAsIGN2LCBzdikgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NCggKHApLCAoY3YpLCAoc3YpICkKKworIyBpZiBLTVBfQVJDSF9YODYKKyMgIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUFRSKHAsIGN2LCBzdikgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIoICh2b2xhdGlsZSBrbXBfaW50MzIqKShwKSwgKGttcF9pbnQzMikoY3YpLCAoa21wX2ludDMyKShzdikgKQorIyBlbHNlIC8qIDY0IGJpdCBwb2ludGVycyAqLworIyAgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9QVFIocCwgY3YsIHN2KSAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NCggKHZvbGF0aWxlIGttcF9pbnQ2NCopKHApLCAoa21wX2ludDY0KShjdiksIChrbXBfaW50NjQpKHN2KSApCisjIGVuZGlmIC8qIEtNUF9BUkNIX1g4NiAqLworCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUOChwLCBjdiwgc3YpICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ4KCAocCksIChjdiksIChzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFVDE2KHAsIGN2LCBzdikgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYoIChwKSwgKGN2KSwgKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUMzIocCwgY3YsIHN2KSBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMiggKHApLCAoY3YpLCAoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQ2NChwLCBjdiwgc3YpIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0KCAocCksIChjdiksIChzdikgKQorCisjIGRlZmluZSBLTVBfWENIR19GSVhFRDgocCwgdikgICAgICAgICAgICAgICAgICBfX2ttcF94Y2hnX2ZpeGVkOCggKHZvbGF0aWxlIGttcF9pbnQ4KikocCksIChrbXBfaW50OCkodikgKTsKKyMgZGVmaW5lIEtNUF9YQ0hHX0ZJWEVEMTYocCwgdikgICAgICAgICAgICAgICAgIF9fa21wX3hjaGdfZml4ZWQxNiggKHApLCAodikgKTsKKyMgZGVmaW5lIEtNUF9YQ0hHX0ZJWEVEMzIocCwgdikgICAgICAgICAgICAgICAgIF9fa21wX3hjaGdfZml4ZWQzMiggKHApLCAodikgKTsKKyMgZGVmaW5lIEtNUF9YQ0hHX0ZJWEVENjQocCwgdikgICAgICAgICAgICAgICAgIF9fa21wX3hjaGdfZml4ZWQ2NCggKHApLCAodikgKTsKKyMgZGVmaW5lIEtNUF9YQ0hHX1JFQUwzMihwLCB2KSAgICAgICAgICAgICAgICAgIF9fa21wX3hjaGdfcmVhbDMyKCAocCksICh2KSApOworIyBkZWZpbmUgS01QX1hDSEdfUkVBTDY0KHAsIHYpICAgICAgICAgICAgICAgICAgX19rbXBfeGNoZ19yZWFsNjQoIChwKSwgKHYpICk7CisKKyNlbmRpZiAvKiBLTVBfQVNNX0lOVFJJTlMgKi8KKworCisvKiAtLS0tLS0tLS0tLS0tIHJlbGF4ZWQgY29uc2lzdGVuY3kgbWVtb3J5IG1vZGVsIHN0dWZmIC0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgS01QX09TX1dJTkRPV1MKKyMgaWZkZWYgX19BQlNPRlRfV0lOCisjICAgZGVmaW5lIEtNUF9NQigpICAgICBhc20gKCJub3AiKQorIyAgIGRlZmluZSBLTVBfSU1CKCkgICAgYXNtICgibm9wIikKKyMgZWxzZQorIyAgIGRlZmluZSBLTVBfTUIoKSAgICAgLyogX2FzbXsgbm9wIH0gKi8KKyMgICBkZWZpbmUgS01QX0lNQigpICAgIC8qIF9hc217IG5vcCB9ICovCisjIGVuZGlmCisjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KKworI2lmIEtNUF9BUkNIX1BQQzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0CisjIGRlZmluZSBLTVBfTUIoKSAgICAgICBfX3N5bmNfc3luY2hyb25pemUoKQorI2VuZGlmCisKKyNpZm5kZWYgS01QX01CCisjIGRlZmluZSBLTVBfTUIoKSAgICAgICAvKiBub3RoaW5nIHRvIGRvICovCisjZW5kaWYKKworI2lmbmRlZiBLTVBfSU1CCisjIGRlZmluZSBLTVBfSU1CKCkgICAgICAvKiBub3RoaW5nIHRvIGRvICovCisjZW5kaWYKKworI2lmbmRlZiBLTVBfU1RfUkVMMzIKKyMgZGVmaW5lIEtNUF9TVF9SRUwzMihBLEQpICAgICAgKCAqKEEpID0gKEQpICkKKyNlbmRpZgorCisjaWZuZGVmIEtNUF9TVF9SRUw2NAorIyBkZWZpbmUgS01QX1NUX1JFTDY0KEEsRCkgICAgICAoICooQSkgPSAoRCkgKQorI2VuZGlmCisKKyNpZm5kZWYgS01QX0xEX0FDUTMyCisjIGRlZmluZSBLTVBfTERfQUNRMzIoQSkgICAgICAgICggKihBKSApCisjZW5kaWYKKworI2lmbmRlZiBLTVBfTERfQUNRNjQKKyMgZGVmaW5lIEtNUF9MRF9BQ1E2NChBKSAgICAgICAgKCAqKEEpICkKKyNlbmRpZgorCisjZGVmaW5lIFRDUl8xKGEpICAgICAgICAgICAgKGEpCisjZGVmaW5lIFRDV18xKGEsYikgICAgICAgICAgKGEpID0gKGIpCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8vCisvLyBGSVhNRSAtIG1heWJlIHRoaXMgc2hvdWxkIHRoaXMgYmUKKy8vCisvLyAjZGVmaW5lIFRDUl80KGEpICAgICgqKHZvbGF0aWxlIGttcF9pbnQzMiAqKSgmYSkpCisvLyAjZGVmaW5lIFRDV180KGEsYikgIChhKSA9ICgqKHZvbGF0aWxlIGttcF9pbnQzMiAqKSYoYikpCisvLworLy8gI2RlZmluZSBUQ1JfOChhKSAgICAoKih2b2xhdGlsZSBrbXBfaW50NjQgKikoYSkpCisvLyAjZGVmaW5lIFRDV184KGEsYikgIChhKSA9ICgqKHZvbGF0aWxlIGttcF9pbnQ2NCAqKSgmYikpCisvLworLy8gSSdtIGZhaXJseSBjZXJ0YWluIHRoaXMgaXMgdGhlIGNvcnJlY3QgdGhpbmcgdG8gZG8sIGJ1dCBJJ20gYWZyYWlkCisvLyBvZiBwZXJmb3JtYW5jZSByZWdyZXNzaW9ucy4KKy8vCisKKyNkZWZpbmUgVENSXzQoYSkgICAgICAgICAgICAoYSkKKyNkZWZpbmUgVENXXzQoYSxiKSAgICAgICAgICAoYSkgPSAoYikKKyNkZWZpbmUgVENSXzgoYSkgICAgICAgICAgICAoYSkKKyNkZWZpbmUgVENXXzgoYSxiKSAgICAgICAgICAoYSkgPSAoYikKKyNkZWZpbmUgVENSX1NZTkNfNChhKSAgICAgICAoYSkKKyNkZWZpbmUgVENXX1NZTkNfNChhLGIpICAgICAoYSkgPSAoYikKKyNkZWZpbmUgVENYX1NZTkNfNChhLGIsYykgICBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMMzIoKHZvbGF0aWxlIGttcF9pbnQzMiAqKSh2b2xhdGlsZSB2b2lkICopJihhKSwgKGttcF9pbnQzMikoYiksIChrbXBfaW50MzIpKGMpKQorI2RlZmluZSBUQ1JfU1lOQ184KGEpICAgICAgIChhKQorI2RlZmluZSBUQ1dfU1lOQ184KGEsYikgICAgIChhKSA9IChiKQorI2RlZmluZSBUQ1hfU1lOQ184KGEsYixjKSAgIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUw2NCgodm9sYXRpbGUga21wX2ludDY0ICopKHZvbGF0aWxlIHZvaWQgKikmKGEpLCAoa21wX2ludDY0KShiKSwgKGttcF9pbnQ2NCkoYykpCisKKyNpZiBLTVBfQVJDSF9YODYKKy8vIFdoYXQgYWJvdXQgQVJNPworICAgICNkZWZpbmUgVENSX1BUUihhKSAgICAgICAgICAoKHZvaWQgKilUQ1JfNChhKSkKKyAgICAjZGVmaW5lIFRDV19QVFIoYSxiKSAgICAgICAgVENXXzQoKGEpLChiKSkKKyAgICAjZGVmaW5lIFRDUl9TWU5DX1BUUihhKSAgICAgKCh2b2lkICopVENSX1NZTkNfNChhKSkKKyAgICAjZGVmaW5lIFRDV19TWU5DX1BUUihhLGIpICAgVENXX1NZTkNfNCgoYSksKGIpKQorICAgICNkZWZpbmUgVENYX1NZTkNfUFRSKGEsYixjKSAoKHZvaWQgKilUQ1hfU1lOQ180KChhKSwoYiksKGMpKSkKKworI2Vsc2UgLyogNjQgYml0IHBvaW50ZXJzICovCisKKyAgICAjZGVmaW5lIFRDUl9QVFIoYSkgICAgICAgICAgKCh2b2lkICopVENSXzgoYSkpCisgICAgI2RlZmluZSBUQ1dfUFRSKGEsYikgICAgICAgIFRDV184KChhKSwoYikpCisgICAgI2RlZmluZSBUQ1JfU1lOQ19QVFIoYSkgICAgICgodm9pZCAqKVRDUl9TWU5DXzgoYSkpCisgICAgI2RlZmluZSBUQ1dfU1lOQ19QVFIoYSxiKSAgIFRDV19TWU5DXzgoKGEpLChiKSkKKyAgICAjZGVmaW5lIFRDWF9TWU5DX1BUUihhLGIsYykgKCh2b2lkICopVENYX1NZTkNfOCgoYSksKGIpLChjKSkpCisKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgKi8KKworLyoKKyAqIElmIHRoZXNlIEZUTl97VFJVRSxGQUxTRX0gdmFsdWVzIGNoYW5nZSwgbWF5IG5lZWQgdG8KKyAqIGNoYW5nZSBzZXZlcmFsIHBsYWNlcyB3aGVyZSB0aGV5IGFyZSB1c2VkIHRvIGNoZWNrIHRoYXQKKyAqIGxhbmd1YWdlIGlzIEZvcnRyYW4sIG5vdCBDLgorICovCisKKyNpZm5kZWYgRlROX1RSVUUKKyMgZGVmaW5lIEZUTl9UUlVFICAgICAgIFRSVUUKKyNlbmRpZgorCisjaWZuZGVmIEZUTl9GQUxTRQorIyBkZWZpbmUgRlROX0ZBTFNFICAgICAgRkFMU0UKKyNlbmRpZgorCit0eXBlZGVmIHZvaWQgICAgKCptaWNyb3Rhc2tfdCkoIGludCAqZ3RpZCwgaW50ICpucHIsIC4uLiApOworCisjaWZkZWYgVVNFX1ZPTEFUSUxFX0NBU1QKKyMgZGVmaW5lIFZPTEFUSUxFX0NBU1QoeCkgICAgICAgICh2b2xhdGlsZSB4KQorI2Vsc2UKKyMgZGVmaW5lIFZPTEFUSUxFX0NBU1QoeCkgICAgICAgICh4KQorI2VuZGlmCisKKyNkZWZpbmUgS01QX1dBSVRfWUlFTEQgICAgICAgICAgIF9fa21wX3dhaXRfeWllbGRfNAorI2RlZmluZSBLTVBfRVEgICAgICAgICAgICAgICAgICAgX19rbXBfZXFfNAorI2RlZmluZSBLTVBfTkVRICAgICAgICAgICAgICAgICAgX19rbXBfbmVxXzQKKyNkZWZpbmUgS01QX0xUICAgICAgICAgICAgICAgICAgIF9fa21wX2x0XzQKKyNkZWZpbmUgS01QX0dFICAgICAgICAgICAgICAgICAgIF9fa21wX2dlXzQKKyNkZWZpbmUgS01QX0xFICAgICAgICAgICAgICAgICAgIF9fa21wX2xlXzQKKworLyogV29ya2Fyb3VuZCBmb3IgSW50ZWwoUikgNjQgY29kZSBnZW4gYnVnIHdoZW4gdGFraW5nIGFkZHJlc3Mgb2Ygc3RhdGljIGFycmF5IChJbnRlbChSKSA2NCBUcmFja2VyICMxMzgpICovCisjaWYgKEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9QUEM2NCkgJiYgS01QX09TX0xJTlVYCisjIGRlZmluZSBTVEFUSUNfRUZJMl9XT1JLQVJPVU5ECisjZWxzZQorIyBkZWZpbmUgU1RBVElDX0VGSTJfV09SS0FST1VORCBzdGF0aWMKKyNlbmRpZgorCisvLyBTdXBwb3J0IG9mIEJHRVQgdXNhZ2UKKyNpZm5kZWYgS01QX1VTRV9CR0VUCisjZGVmaW5lIEtNUF9VU0VfQkdFVCAxCisjZW5kaWYKKworCisvLyBTd2l0Y2hlcyBmb3IgT1NTIGJ1aWxkcworI2lmbmRlZiBVU0VfU1lTRlNfSU5GTworIyBkZWZpbmUgVVNFX1NZU0ZTX0lORk8gIDAKKyNlbmRpZgorI2lmbmRlZiBVU0VfQ01QWENIR19GSVgKKyMgZGVmaW5lIFVTRV9DTVBYQ0hHX0ZJWCAxCisjZW5kaWYKKworLy8gRW5hYmxlIGR5bmFtaWMgdXNlciBsb2NrCisjaWYgT01QXzQxX0VOQUJMRUQKKyMgZGVmaW5lIEtNUF9VU0VfRFlOQU1JQ19MT0NLIDEKKyNlbmRpZgorCisvLyBFbmFibGUgVFNYIGlmIGR5bmFtaWMgdXNlciBsb2NrIGlzIHR1cm5lZCBvbgorI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisvLyBWaXN1YWwgc3R1ZGlvIGNhbid0IGhhbmRsZSB0aGUgYXNtIHNlY3Rpb25zIGluIHRoaXMgY29kZQorIyBkZWZpbmUgS01QX1VTRV9UU1ggICAgICAgICAgICAgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQpICYmICFLTVBfQ09NUElMRVJfTVNWQworIyBpZmRlZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisjICB1bmRlZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisjIGVuZGlmCisjIGRlZmluZSBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTIEtNUF9VU0VfVFNYCisjZW5kaWYKKworLy8gRW5hYmxlIHRpY2sgdGltZSBjb252ZXJzaW9uIG9mIHRpY2tzIHRvIHNlY29uZHMKKyNpZiBLTVBfU1RBVFNfRU5BQkxFRAorIyBkZWZpbmUgS01QX0hBVkVfVElDS19USU1FIChLTVBfT1NfTElOVVggJiYgKEtNUF9NSUMgfHwgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCkpCisjZW5kaWYKKworLy8gV2FybmluZyBsZXZlbHMKK2VudW0ga21wX3dhcm5pbmdzX2xldmVsIHsKKyAgICBrbXBfd2FybmluZ3Nfb2ZmID0gMCwJCS8qIE5vIHdhcm5pbmdzICovCisgICAga21wX3dhcm5pbmdzX2xvdywJCQkvKiBNaW5pbWFsIHdhcm5pbmdzIChkZWZhdWx0KSAqLworICAgIGttcF93YXJuaW5nc19leHBsaWNpdCA9IDYsCQkvKiBFeHBsaWNpdGx5IHNldCB0byBPTiAtIG1vcmUgd2FybmluZ3MgKi8KKyAgICBrbXBfd2FybmluZ3NfdmVyYm9zZQkJLyogcmVzZXJ2ZWQgKi8KK307CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvLyBleHRlcm4gIkMiCisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworI2VuZGlmIC8qIEtNUF9PU19IICovCisvLyBTYWZlIEMgQVBJCisjaW5jbHVkZSAia21wX3NhZmVfY19hcGkuaCIKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX3BsYXRmb3JtLmggYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfcGxhdGZvcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmExOWRjCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX3BsYXRmb3JtLmgKQEAgLTAsMCArMSwxNzEgQEAKKy8qCisgKiBrbXBfcGxhdGZvcm0uaCAtLSBoZWFkZXIgZm9yIGRldGVybWluaW5nIG9wZXJhdGluZyBzeXN0ZW0gYW5kIGFyY2hpdGVjdHVyZQorICovCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgS01QX1BMQVRGT1JNX0gKKyNkZWZpbmUgS01QX1BMQVRGT1JNX0gKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPcGVyYXRpbmcgc3lzdGVtIHJlY29nbml0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBLTVBfT1NfTElOVVggICAgMAorI2RlZmluZSBLTVBfT1NfRlJFRUJTRCAgMAorI2RlZmluZSBLTVBfT1NfTkVUQlNEICAgMAorI2RlZmluZSBLTVBfT1NfREFSV0lOICAgMAorI2RlZmluZSBLTVBfT1NfV0lORE9XUyAgMAorI2RlZmluZSBLTVBfT1NfQ05LICAgICAgMAorI2RlZmluZSBLTVBfT1NfVU5JWCAgICAgMCAgLyogZGlzanVuY3Rpb24gb2YgS01QX09TX0xJTlVYLCBLTVBfT1NfREFSV0lOIGV0Yy4gKi8KKworCisjaWZkZWYgX1dJTjMyCisjIHVuZGVmIEtNUF9PU19XSU5ET1dTCisjIGRlZmluZSBLTVBfT1NfV0lORE9XUyAxCisjZW5kaWYKKworI2lmICggZGVmaW5lZCBfX0FQUExFX18gJiYgZGVmaW5lZCBfX01BQ0hfXyApCisjIHVuZGVmIEtNUF9PU19EQVJXSU4KKyMgZGVmaW5lIEtNUF9PU19EQVJXSU4gMQorI2VuZGlmCisKKy8vIGluIHNvbWUgcHBjNjQgbGludXggaW5zdGFsbGF0aW9ucywgb25seSB0aGUgc2Vjb25kIGNvbmRpdGlvbiBpcyBtZXQKKyNpZiAoIGRlZmluZWQgX19saW51eCApCisjIHVuZGVmIEtNUF9PU19MSU5VWAorIyBkZWZpbmUgS01QX09TX0xJTlVYIDEKKyNlbGlmICggZGVmaW5lZCBfX2xpbnV4X18pCisjIHVuZGVmIEtNUF9PU19MSU5VWAorIyBkZWZpbmUgS01QX09TX0xJTlVYIDEKKyNlbHNlCisjZW5kaWYKKworI2lmICggZGVmaW5lZCBfX0ZyZWVCU0RfXyApCisjIHVuZGVmIEtNUF9PU19GUkVFQlNECisjIGRlZmluZSBLTVBfT1NfRlJFRUJTRCAxCisjZW5kaWYKKworI2lmICggZGVmaW5lZCBfX05ldEJTRF9fICkKKyMgdW5kZWYgS01QX09TX05FVEJTRAorIyBkZWZpbmUgS01QX09TX05FVEJTRCAxCisjZW5kaWYKKworI2lmICggZGVmaW5lZCBfX2JncV9fICkKKyMgdW5kZWYgS01QX09TX0NOSworIyBkZWZpbmUgS01QX09TX0NOSyAxCisjZW5kaWYKKworI2lmICgxICE9IEtNUF9PU19MSU5VWCArIEtNUF9PU19GUkVFQlNEICsgS01QX09TX05FVEJTRCArIEtNUF9PU19EQVJXSU4gKyBLTVBfT1NfV0lORE9XUykKKyMgZXJyb3IgVW5rbm93biBPUworI2VuZGlmCisKKyNpZiBLTVBfT1NfTElOVVggfHwgS01QX09TX0ZSRUVCU0QgfHwgS01QX09TX05FVEJTRCB8fCBLTVBfT1NfREFSV0lOCisjIHVuZGVmIEtNUF9PU19VTklYCisjIGRlZmluZSBLTVBfT1NfVU5JWCAxCisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBcmNoaXRlY3R1cmUgcmVjb2duaXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEtNUF9BUkNIX1g4NiAgICAgICAgMAorI2RlZmluZSBLTVBfQVJDSF9YODZfNjQgICAgIDAKKyNkZWZpbmUgS01QX0FSQ0hfQUFSQ0g2NCAgICAwCisjZGVmaW5lIEtNUF9BUkNIX1BQQzY0X0JFICAgMAorI2RlZmluZSBLTVBfQVJDSF9QUEM2NF9MRSAgIDAKKyNkZWZpbmUgS01QX0FSQ0hfUFBDNjQgKEtNUF9BUkNIX1BQQzY0X0xFIHx8IEtNUF9BUkNIX1BQQzY0X0JFKQorCisjaWYgS01QX09TX1dJTkRPV1MKKyMgaWYgZGVmaW5lZCBfTV9BTUQ2NAorIyAgdW5kZWYgS01QX0FSQ0hfWDg2XzY0CisjICBkZWZpbmUgS01QX0FSQ0hfWDg2XzY0IDEKKyMgZWxzZQorIyAgdW5kZWYgS01QX0FSQ0hfWDg2CisjICBkZWZpbmUgS01QX0FSQ0hfWDg2IDEKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgS01QX09TX1VOSVgKKyMgaWYgZGVmaW5lZCBfX3g4Nl82NAorIyAgdW5kZWYgS01QX0FSQ0hfWDg2XzY0CisjICBkZWZpbmUgS01QX0FSQ0hfWDg2XzY0IDEKKyMgZWxpZiBkZWZpbmVkIF9faTM4NgorIyAgdW5kZWYgS01QX0FSQ0hfWDg2CisjICBkZWZpbmUgS01QX0FSQ0hfWDg2IDEKKyMgZWxpZiBkZWZpbmVkIF9fcG93ZXJwYzY0X18KKyMgIGlmIGRlZmluZWQgX19MSVRUTEVfRU5ESUFOX18KKyMgICB1bmRlZiBLTVBfQVJDSF9QUEM2NF9MRQorIyAgIGRlZmluZSBLTVBfQVJDSF9QUEM2NF9MRSAxCisjICBlbHNlCisjICAgdW5kZWYgS01QX0FSQ0hfUFBDNjRfQkUKKyMgICBkZWZpbmUgS01QX0FSQ0hfUFBDNjRfQkUgMQorIyAgZW5kaWYKKyMgZWxpZiBkZWZpbmVkIF9fYWFyY2g2NF9fCisjICB1bmRlZiBLTVBfQVJDSF9BQVJDSDY0CisjICBkZWZpbmUgS01QX0FSQ0hfQUFSQ0g2NCAxCisjIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19BUk1fQVJDSF83X18pICAgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzdSX18pICB8fCBcCisgICAgZGVmaW5lZChfX0FSTV9BUkNIXzdBX18pCisjIGRlZmluZSBLTVBfQVJDSF9BUk1WNyAxCisjZW5kaWYKKworI2lmIGRlZmluZWQoS01QX0FSQ0hfQVJNVjcpICAgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzZfXykgICB8fCBcCisgICAgZGVmaW5lZChfX0FSTV9BUkNIXzZKX18pICB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNktfXykgIHx8IFwKKyAgICBkZWZpbmVkKF9fQVJNX0FSQ0hfNlpfXykgIHx8IGRlZmluZWQoX19BUk1fQVJDSF82VDJfXykgfHwgXAorICAgIGRlZmluZWQoX19BUk1fQVJDSF82WktfXykKKyMgZGVmaW5lIEtNUF9BUkNIX0FSTVY2IDEKKyNlbmRpZgorCisjaWYgZGVmaW5lZChLTVBfQVJDSF9BUk1WNikgICB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNVRfXykgIHx8IFwKKyAgICBkZWZpbmVkKF9fQVJNX0FSQ0hfNUVfXykgIHx8IGRlZmluZWQoX19BUk1fQVJDSF81VEVfXykgfHwgXAorICAgIGRlZmluZWQoX19BUk1fQVJDSF81VEVKX18pCisjIGRlZmluZSBLTVBfQVJDSF9BUk1WNSAxCisjZW5kaWYKKworI2lmIGRlZmluZWQoS01QX0FSQ0hfQVJNVjUpICAgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzRfXykgICB8fCBcCisgICAgZGVmaW5lZChfX0FSTV9BUkNIXzRUX18pCisjIGRlZmluZSBLTVBfQVJDSF9BUk1WNCAxCisjZW5kaWYKKworI2lmIGRlZmluZWQoS01QX0FSQ0hfQVJNVjQpICAgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzNfXykgICB8fCBcCisgICAgZGVmaW5lZChfX0FSTV9BUkNIXzNNX18pCisjIGRlZmluZSBLTVBfQVJDSF9BUk1WMyAxCisjZW5kaWYKKworI2lmIGRlZmluZWQoS01QX0FSQ0hfQVJNVjMpICAgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzJfXykKKyMgZGVmaW5lIEtNUF9BUkNIX0FSTVYyIDEKKyNlbmRpZgorCisjaWYgZGVmaW5lZChLTVBfQVJDSF9BUk1WMikKKyMgZGVmaW5lIEtNUF9BUkNIX0FSTSAxCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19NSUNfXykgfHwgZGVmaW5lZChfX01JQzJfXykKKyMgZGVmaW5lIEtNUF9NSUMgIDEKKyMgaWYgX19NSUMyX18gfHwgX19LTkNfXworIyAgZGVmaW5lIEtNUF9NSUMxIDAKKyMgIGRlZmluZSBLTVBfTUlDMiAxCisjIGVsc2UKKyMgIGRlZmluZSBLTVBfTUlDMSAxCisjICBkZWZpbmUgS01QX01JQzIgMAorIyBlbmRpZgorI2Vsc2UKKyMgZGVmaW5lIEtNUF9NSUMgIDAKKyMgZGVmaW5lIEtNUF9NSUMxIDAKKyMgZGVmaW5lIEtNUF9NSUMyIDAKKyNlbmRpZgorCisvKiBTcGVjaWZ5IDMyIGJpdCBhcmNoaXRlY3R1cmVzIGhlcmUgKi8KKyNkZWZpbmUgS01QXzMyX0JJVF9BUkNIIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfQVJNKQorCisvLyBUT0RPOiBGaXhtZSAtIFRoaXMgaXMgY2xldmVyLCBidXQgcmVhbGx5IGZ1Z2x5CisjaWYgKDEgIT0gS01QX0FSQ0hfWDg2ICsgS01QX0FSQ0hfWDg2XzY0ICsgS01QX0FSQ0hfQVJNICsgS01QX0FSQ0hfUFBDNjQgKyBLTVBfQVJDSF9BQVJDSDY0KQorIyBlcnJvciBVbmtub3duIG9yIHVuc3VwcG9ydGVkIGFyY2hpdGVjdHVyZQorI2VuZGlmCisKKyNlbmRpZiAvLyBLTVBfUExBVEZPUk1fSApkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX3J1bnRpbWUuYyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9ydW50aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgwYmJmZAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9ydW50aW1lLmMKQEAgLTAsMCArMSw3NjU1IEBACisvKgorICoga21wX3J1bnRpbWUuYyAtLSBLUFRTIHJ1bnRpbWUgc3VwcG9ydCBsaWJyYXJ5CisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfYXRvbWljLmgiCisjaW5jbHVkZSAia21wX3dyYXBwZXJfZ2V0cGlkLmgiCisjaW5jbHVkZSAia21wX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAia21wX2l0dC5oIgorI2luY2x1ZGUgImttcF9zdHIuaCIKKyNpbmNsdWRlICJrbXBfc2V0dGluZ3MuaCIKKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorI2luY2x1ZGUgImttcF9pby5oIgorI2luY2x1ZGUgImttcF9lcnJvci5oIgorI2luY2x1ZGUgImttcF9zdGF0cy5oIgorI2luY2x1ZGUgImttcF93YWl0X3JlbGVhc2UuaCIKKworI2lmIE9NUFRfU1VQUE9SVAorI2luY2x1ZGUgIm9tcHQtc3BlY2lmaWMuaCIKKyNlbmRpZgorCisvKiB0aGVzZSBhcmUgdGVtcG9yYXJ5IGlzc3VlcyB0byBiZSBkZWFsdCB3aXRoICovCisjZGVmaW5lIEtNUF9VU0VfUFJDVEwgMAorI2RlZmluZSBLTVBfVVNFX1BPT0xFRF9BTExPQyAwCisKKyNpZiBLTVBfT1NfV0lORE9XUworI2luY2x1ZGUgPHByb2Nlc3MuaD4KKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkKEtNUF9HT01QX0NPTVBBVCkKK2NoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9hbHRfY29tcFtdID0gS01QX1ZFUlNJT05fUFJFRklYICJhbHRlcm5hdGl2ZSBjb21waWxlciBzdXBwb3J0OiB5ZXMiOworI2VuZGlmIC8qIGRlZmluZWQoS01QX0dPTVBfQ09NUEFUKSAqLworCitjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fb21wX2FwaVtdID0gS01QX1ZFUlNJT05fUFJFRklYICJBUEkgdmVyc2lvbjogIgorI2lmIE9NUF80MF9FTkFCTEVECisgICAgIjQuMCAoMjAxMzA3KSI7CisjZWxzZQorICAgICIzLjEgKDIwMTEwNykiOworI2VuZGlmCisKKyNpZmRlZiBLTVBfREVCVUcKK2NoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9sb2NrW10gPSBLTVBfVkVSU0lPTl9QUkVGSVggImxvY2sgdHlwZTogcnVuIHRpbWUgc2VsZWN0YWJsZSI7CisjZW5kaWYgLyogS01QX0RFQlVHICovCisKKworI2RlZmluZSBLTVBfTUlOKCB4LCB5ICkgKCAoeCkgPCAoeSkgPyAoeCkgOiAoeSkgKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitrbXBfaW5mb190IF9fa21wX21vbml0b3I7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCisKK3ZvaWQgX19rbXBfY2xlYW51cCggdm9pZCApOworCitzdGF0aWMgdm9pZCBfX2ttcF9pbml0aWFsaXplX2luZm8oIGttcF9pbmZvX3QgKiwga21wX3RlYW1fdCAqLCBpbnQgdGlkLCBpbnQgZ3RpZCApOworc3RhdGljIHZvaWQgX19rbXBfaW5pdGlhbGl6ZV90ZWFtKCBrbXBfdGVhbV90ICogdGVhbSwgaW50IG5ld19ucHJvYywga21wX2ludGVybmFsX2NvbnRyb2xfdCAqIG5ld19pY3ZzLCBpZGVudF90ICogbG9jICk7CisjaWYgT01QXzQwX0VOQUJMRUQgJiYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorc3RhdGljIHZvaWQgX19rbXBfcGFydGl0aW9uX3BsYWNlcygga21wX3RlYW1fdCAqdGVhbSApOworI2VuZGlmCitzdGF0aWMgdm9pZCBfX2ttcF9kb19zZXJpYWxfaW5pdGlhbGl6ZSggdm9pZCApOwordm9pZCBfX2ttcF9mb3JrX2JhcnJpZXIoIGludCBndGlkLCBpbnQgdGlkICk7Cit2b2lkIF9fa21wX2pvaW5fYmFycmllciggaW50IGd0aWQgKTsKK3ZvaWQgX19rbXBfc2V0dXBfaWN2X2NvcHkoIGttcF90ZWFtX3QgKnRlYW0sIGludCBuZXdfbnByb2MsIGttcF9pbnRlcm5hbF9jb250cm9sX3QgKiBuZXdfaWN2cywgaWRlbnRfdCAqbG9jICk7CisKKyNpZmRlZiBVU0VfTE9BRF9CQUxBTkNFCitzdGF0aWMgaW50IF9fa21wX2xvYWRfYmFsYW5jZV9ucHJvYygga21wX3Jvb3RfdCAqIHJvb3QsIGludCBzZXRfbnByb2MgKTsKKyNlbmRpZgorCitzdGF0aWMgaW50IF9fa21wX2V4cGFuZF90aHJlYWRzKGludCBuV2lzaCwgaW50IG5OZWVkKTsKKyNpZiBLTVBfT1NfV0lORE9XUworc3RhdGljIGludCBfX2ttcF91bnJlZ2lzdGVyX3Jvb3Rfb3RoZXJfdGhyZWFkKCBpbnQgZ3RpZCApOworI2VuZGlmCitzdGF0aWMgdm9pZCBfX2ttcF91bnJlZ2lzdGVyX2xpYnJhcnkoIHZvaWQgKTsgLy8gY2FsbGVkIGJ5IF9fa21wX2ludGVybmFsX2VuZCgpCitzdGF0aWMgdm9pZCBfX2ttcF9yZWFwX3RocmVhZCgga21wX2luZm9fdCAqIHRocmVhZCwgaW50IGlzX3Jvb3QgKTsKK3N0YXRpYyBrbXBfaW5mb190ICpfX2ttcF90aHJlYWRfcG9vbF9pbnNlcnRfcHQgPSBOVUxMOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBDYWxjdWxhdGUgdGhlIGlkZW50aWZpZXIgb2YgdGhlIGN1cnJlbnQgdGhyZWFkICovCisvKiBmYXN0IChhbmQgc29tZXdoYXQgcG9ydGFibGUpIHdheSB0byBnZXQgdW5pcXVlICovCisvKiBpZGVudGlmaWVyIG9mIGV4ZWN1dGluZyB0aHJlYWQuICAgICAgICAgICAgICAgICovCisvKiByZXR1cm5zIEtNUF9HVElEX0RORSBpZiB3ZSBoYXZlbid0IGJlZW4gYXNzaWduZWQgYSBndGlkICAgKi8KKworaW50CitfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZCggKQoreworICAgIGludCBpOworICAgIGttcF9pbmZvX3QgICAqKm90aGVyX3RocmVhZHM7CisgICAgc2l6ZV90ICAgICAgICAgc3RhY2tfZGF0YTsKKyAgICBjaGFyICAgICAgICAgICpzdGFja19hZGRyOworICAgIHNpemVfdCAgICAgICAgIHN0YWNrX3NpemU7CisgICAgY2hhciAgICAgICAgICAqc3RhY2tfYmFzZTsKKworICAgIEtBX1RSQUNFKCAxMDAwLCAoICIqKiogX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWQ6IGVudGVyaW5nLCBucHJvYz0lZCAgYWxsX25wcm9jPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgIF9fa21wX250aCwgX19rbXBfYWxsX250aCApKTsKKworICAgIC8qIEpQSCAtIHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBfX2ttcGNfZW5kKDApIGlzIGNhbGxlZCBpbW1lZGlhdGVseSBwcmlvciB0byBhCisgICAgICAgICAgICAgcGFyYWxsZWwgcmVnaW9uLCBtYWRlIGl0IHJldHVybiBLTVBfR1RJRF9ETkUgdG8gZm9yY2Ugc2VyaWFsX2luaXRpYWxpemUgYnkKKyAgICAgICAgICAgICBjYWxsZXIuICBIYWQgdG8gaGFuZGxlIEtNUF9HVElEX0RORSBhdCBhbGwgY2FsbC1zaXRlcywgb3IgZWxzZSBndWFyYW50ZWUKKyAgICAgICAgICAgICBfX2ttcF9pbml0X2d0aWQgZm9yIHRoaXMgdG8gd29yay4gICovCisKKyAgICBpZiAoICFUQ1JfNChfX2ttcF9pbml0X2d0aWQpICkgcmV0dXJuIEtNUF9HVElEX0RORTsKKworI2lmZGVmIEtNUF9UREFUQV9HVElECisgICAgaWYgKCBUQ1JfNChfX2ttcF9ndGlkX21vZGUpID49IDMpIHsKKyAgICAgICAgS0FfVFJBQ0UoIDEwMDAsICggIioqKiBfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZDogdXNpbmcgVERBVEFcbiIgKSk7CisgICAgICAgIHJldHVybiBfX2ttcF9ndGlkOworICAgIH0KKyNlbmRpZgorICAgIGlmICggVENSXzQoX19rbXBfZ3RpZF9tb2RlKSA+PSAyKSB7CisgICAgICAgIEtBX1RSQUNFKCAxMDAwLCAoICIqKiogX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWQ6IHVzaW5nIGtleWVkIFRMU1xuIiApKTsKKyAgICAgICAgcmV0dXJuIF9fa21wX2d0aWRfZ2V0X3NwZWNpZmljKCk7CisgICAgfQorICAgIEtBX1RSQUNFKCAxMDAwLCAoICIqKiogX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWQ6IHVzaW5nIGludGVybmFsIGFsZy5cbiIgKSk7CisKKyAgICBzdGFja19hZGRyICAgID0gKGNoYXIqKSAmIHN0YWNrX2RhdGE7CisgICAgb3RoZXJfdGhyZWFkcyA9IF9fa21wX3RocmVhZHM7CisKKyAgICAvKgorICAgICAgICBBVFQ6IFRoZSBjb2RlIGJlbG93IGlzIGEgc291cmNlIG9mIHBvdGVudGlhbCBidWdzIGR1ZSB0byB1bnN5bmNocm9uaXplZCBhY2Nlc3MgdG8KKyAgICAgICAgX19rbXBfdGhyZWFkcyBhcnJheS4gRm9yIGV4YW1wbGU6CisgICAgICAgICAgICAxLiBDdXJyZW50IHRocmVhZCBsb2FkcyBvdGhlcl90aHJlYWRzW2ldIHRvIHRociBhbmQgY2hlY2tzIGl0LCBpdCBpcyBub24tTlVMTC4KKyAgICAgICAgICAgIDIuIEN1cnJlbnQgdGhyZWFkIGlzIHN1c3BlbmRlZCBieSBPUy4KKyAgICAgICAgICAgIDMuIEFub3RoZXIgdGhyZWFkIHVucmVnaXN0ZXJzIGFuZCBmaW5pc2hlcyAoZGVidWcgdmVyc2lvbnMgb2YgZnJlZSgpIG1heSBmaWxsIG1lbW9yeQorICAgICAgICAgICAgICAgd2l0aCBzb21ldGhpbmcgbGlrZSAweEVGKS4KKyAgICAgICAgICAgIDQuIEN1cnJlbnQgdGhyZWFkIGlzIHJlc3VtZWQuCisgICAgICAgICAgICA1LiBDdXJyZW50IHRocmVhZCByZWFkcyBqdW5rIGZyb20gKnRoci4KKyAgICAgICAgVE9ETzogRml4IGl0LgorICAgICAgICAtLWxuCisgICAgKi8KKworICAgIGZvciggaSA9IDAgOyBpIDwgX19rbXBfdGhyZWFkc19jYXBhY2l0eSA7IGkrKyApIHsKKworICAgICAgICBrbXBfaW5mb190ICp0aHIgPSAoa21wX2luZm9fdCAqKVRDUl9TWU5DX1BUUihvdGhlcl90aHJlYWRzW2ldKTsKKyAgICAgICAgaWYoICF0aHIgKSBjb250aW51ZTsKKworICAgICAgICBzdGFja19zaXplID0gIChzaXplX3QpVENSX1BUUih0aHItPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tzaXplKTsKKyAgICAgICAgc3RhY2tfYmFzZSA9ICAoY2hhciAqKVRDUl9QVFIodGhyLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrYmFzZSk7CisKKyAgICAgICAgLyogc3RhY2sgZ3Jvd3MgZG93biAtLSBzZWFyY2ggdGhyb3VnaCBhbGwgb2YgdGhlIGFjdGl2ZSB0aHJlYWRzICovCisKKyAgICAgICAgaWYoIHN0YWNrX2FkZHIgPD0gc3RhY2tfYmFzZSApIHsKKyAgICAgICAgICAgIHNpemVfdCBzdGFja19kaWZmID0gc3RhY2tfYmFzZSAtIHN0YWNrX2FkZHI7CisKKyAgICAgICAgICAgIGlmKCBzdGFja19kaWZmIDw9IHN0YWNrX3NpemUgKSB7CisgICAgICAgICAgICAgICAgLyogVGhlIG9ubHkgd2F5IHdlIGNhbiBiZSBjbG9zZXIgdGhhbiB0aGUgYWxsb2NhdGVkICovCisgICAgICAgICAgICAgICAgLyogc3RhY2sgc2l6ZSBpcyBpZiB3ZSBhcmUgcnVubmluZyBvbiB0aGlzIHRocmVhZC4gKi8KKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9ndGlkX2dldF9zcGVjaWZpYygpID09IGkgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGdldCBzcGVjaWZpYyB0byB0cnkgYW5kIGRldGVybWluZSBvdXIgZ3RpZCAqLworICAgIEtBX1RSQUNFKCAxMDAwLCAoICIqKiogX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWQ6IGludGVybmFsIGFsZy4gZmFpbGVkIHRvIGZpbmQgIgorICAgICAgICAgICAgICAgICAgICAgICJ0aHJlYWQsIHVzaW5nIFRMU1xuIiApKTsKKyAgICBpID0gX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKTsKKworICAgIC8qZnByaW50Ziggc3RkZXJyLCAiPT09ICVkXG4iLCBpICk7ICAqLyAvKiBHUk9PICovCisKKyAgICAvKiBpZiB3ZSBoYXZuJ3QgYmVlbiBhc3NpZ25lZCBhIGd0aWQsIHRoZW4gcmV0dXJuIGNvZGUgKi8KKyAgICBpZiggaTwwICkgcmV0dXJuIGk7CisKKyAgICAvKiBkeW5hbWljYWxseSB1cGRhdGVkIHN0YWNrIHdpbmRvdyBmb3IgdWJlciB0aHJlYWRzIHRvIGF2b2lkIGdldF9zcGVjaWZpYyBjYWxsICovCisgICAgaWYoICEgVENSXzQob3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfaW5mby5kcy5kc19zdGFja2dyb3cpICkgeworICAgICAgICBLTVBfRkFUQUwoIFN0YWNrT3ZlcmZsb3csIGkgKTsKKyAgICB9CisKKyAgICBzdGFja19iYXNlID0gKGNoYXIgKikgb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfaW5mby5kcy5kc19zdGFja2Jhc2U7CisgICAgaWYoIHN0YWNrX2FkZHIgPiBzdGFja19iYXNlICkgeworICAgICAgICBUQ1dfUFRSKG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tiYXNlLCBzdGFja19hZGRyKTsKKyAgICAgICAgVENXX1BUUihvdGhlcl90aHJlYWRzW2ldLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrc2l6ZSwKKyAgICAgICAgICBvdGhlcl90aHJlYWRzW2ldLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrc2l6ZSArIHN0YWNrX2FkZHIgLSBzdGFja19iYXNlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBUQ1dfUFRSKG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tzaXplLCBzdGFja19iYXNlIC0gc3RhY2tfYWRkcik7CisgICAgfQorCisgICAgLyogUmVwcmludCBzdGFjayBib3VuZHMgZm9yIHViZXJtYXN0ZXIgc2luY2UgdGhleSBoYXZlIGJlZW4gcmVmaW5lZCAqLworICAgIGlmICggX19rbXBfc3RvcmFnZV9tYXAgKSB7CisgICAgICAgIGNoYXIgKnN0YWNrX2VuZCA9IChjaGFyICopIG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tiYXNlOworICAgICAgICBjaGFyICpzdGFja19iZWcgPSBzdGFja19lbmQgLSBvdGhlcl90aHJlYWRzW2ldLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrc2l6ZTsKKyAgICAgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggaSwgc3RhY2tfYmVnLCBzdGFja19lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhfJWQgc3RhY2sgKHJlZmluZW1lbnQpIiwgaSApOworICAgIH0KKyAgICByZXR1cm4gaTsKK30KKworaW50CitfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZF9yZWcoICkKK3sKKyAgICBpbnQgZ3RpZDsKKworICAgIGlmICggIV9fa21wX2luaXRfc2VyaWFsICkgeworICAgICAgICBndGlkID0gS01QX0dUSURfRE5FOworICAgIH0gZWxzZQorI2lmZGVmIEtNUF9UREFUQV9HVElECisgICAgaWYgKCBUQ1JfNChfX2ttcF9ndGlkX21vZGUpID49IDMgKSB7CisgICAgICAgIEtBX1RSQUNFKCAxMDAwLCAoICIqKiogX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWRfcmVnOiB1c2luZyBUREFUQVxuIiApKTsKKyAgICAgICAgZ3RpZCA9IF9fa21wX2d0aWQ7CisgICAgfSBlbHNlCisjZW5kaWYKKyAgICBpZiAoIFRDUl80KF9fa21wX2d0aWRfbW9kZSkgPj0gMiApIHsKKyAgICAgICAgS0FfVFJBQ0UoIDEwMDAsICggIioqKiBfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZF9yZWc6IHVzaW5nIGtleWVkIFRMU1xuIiApKTsKKyAgICAgICAgZ3RpZCA9IF9fa21wX2d0aWRfZ2V0X3NwZWNpZmljKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgS0FfVFJBQ0UoIDEwMDAsICggIioqKiBfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZF9yZWc6IHVzaW5nIGludGVybmFsIGFsZy5cbiIgKSk7CisgICAgICAgIGd0aWQgPSBfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZCgpOworICAgIH0KKworICAgIC8qIHdlIG11c3QgYmUgYSBuZXcgdWJlciBtYXN0ZXIgc2libGluZyB0aHJlYWQgKi8KKyAgICBpZiggZ3RpZCA9PSBLTVBfR1RJRF9ETkUgKSB7CisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWRfcmVnOiBFbmNvdW50ZXJlZCBuZXcgcm9vdCB0aHJlYWQuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJSZWdpc3RlcmluZyBhIG5ldyBndGlkLlxuIiApKTsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKKyAgICAgICAgaWYoICFfX2ttcF9pbml0X3NlcmlhbCApIHsKKyAgICAgICAgICAgIF9fa21wX2RvX3NlcmlhbF9pbml0aWFsaXplKCk7CisgICAgICAgICAgICBndGlkID0gX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGd0aWQgPSBfX2ttcF9yZWdpc3Rlcl9yb290KEZBTFNFKTsKKyAgICAgICAgfQorICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOworICAgICAgICAvKl9fa21wX3ByaW50ZiggIisrKyAlZFxuIiwgZ3RpZCApOyAqLyAvKiBHUk9PICovCisgICAgfQorCisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PTAgKTsKKworICAgIHJldHVybiBndGlkOworfQorCisvKiBjYWxsZXIgbXVzdCBob2xkIGZvcmtqb2luX2xvY2sgKi8KK3ZvaWQKK19fa21wX2NoZWNrX3N0YWNrX292ZXJsYXAoIGttcF9pbmZvX3QgKnRoICkKK3sKKyAgICBpbnQgZjsKKyAgICBjaGFyICpzdGFja19iZWcgPSBOVUxMOworICAgIGNoYXIgKnN0YWNrX2VuZCA9IE5VTEw7CisgICAgaW50IGd0aWQ7CisKKyAgICBLQV9UUkFDRSgxMCwoIl9fa21wX2NoZWNrX3N0YWNrX292ZXJsYXA6IGNhbGxlZFxuIikpOworICAgIGlmICggX19rbXBfc3RvcmFnZV9tYXAgKSB7CisgICAgICAgIHN0YWNrX2VuZCA9IChjaGFyICopIHRoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrYmFzZTsKKyAgICAgICAgc3RhY2tfYmVnID0gc3RhY2tfZW5kIC0gdGgtPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tzaXplOworCisgICAgICAgIGd0aWQgPSBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aCApOworCisgICAgICAgIGlmIChndGlkID09IEtNUF9HVElEX01PTklUT1IpIHsKKyAgICAgICAgICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIGd0aWQsIHN0YWNrX2JlZywgc3RhY2tfZW5kLCB0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoXyVzIHN0YWNrICglcykiLCAibW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIHRoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrZ3JvdyApID8gImluaXRpYWwiIDogImFjdHVhbCIgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIGd0aWQsIHN0YWNrX2JlZywgc3RhY2tfZW5kLCB0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoXyVkIHN0YWNrICglcykiLCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggdGgtPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tncm93ICkgPyAiaW5pdGlhbCIgOiAiYWN0dWFsIiApOworICAgICAgICB9CisgICAgfQorCisgICAgLyogTm8gcG9pbnQgaW4gY2hlY2tpbmcgdWJlcm1hc3RlciB0aHJlYWRzIHNpbmNlIHRoZXkgdXNlIHJlZmluZW1lbnQgYW5kIGNhbm5vdCBvdmVybGFwICovCisgICAgZ3RpZCA9IF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRoICk7CisgICAgaWYgKCBfX2ttcF9lbnZfY2hlY2tzID09IFRSVUUgJiYgIUtNUF9VQkVSX0dUSUQoZ3RpZCkpCisgICAgeworICAgICAgICBLQV9UUkFDRSgxMCwoIl9fa21wX2NoZWNrX3N0YWNrX292ZXJsYXA6IHBlcmZvcm1pbmcgZXh0ZW5zaXZlIGNoZWNraW5nXG4iKSk7CisgICAgICAgIGlmICggc3RhY2tfYmVnID09IE5VTEwgKSB7CisgICAgICAgICAgICBzdGFja19lbmQgPSAoY2hhciAqKSB0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja2Jhc2U7CisgICAgICAgICAgICBzdGFja19iZWcgPSBzdGFja19lbmQgLSB0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja3NpemU7CisgICAgICAgIH0KKworICAgICAgICBmb3IoIGY9MCA7IGYgPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5IDsgZisrICkgeworICAgICAgICAgICAga21wX2luZm9fdCAqZl90aCA9IChrbXBfaW5mb190ICopVENSX1NZTkNfUFRSKF9fa21wX3RocmVhZHNbZl0pOworCisgICAgICAgICAgICBpZiggZl90aCAmJiBmX3RoICE9IHRoICkgeworICAgICAgICAgICAgICAgIGNoYXIgKm90aGVyX3N0YWNrX2VuZCA9IChjaGFyICopVENSX1BUUihmX3RoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrYmFzZSk7CisgICAgICAgICAgICAgICAgY2hhciAqb3RoZXJfc3RhY2tfYmVnID0gb3RoZXJfc3RhY2tfZW5kIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90KVRDUl9QVFIoZl90aC0+dGgudGhfaW5mby5kcy5kc19zdGFja3NpemUpOworICAgICAgICAgICAgICAgIGlmKChzdGFja19iZWcgPiBvdGhlcl9zdGFja19iZWcgJiYgc3RhY2tfYmVnIDwgb3RoZXJfc3RhY2tfZW5kKSB8fAorICAgICAgICAgICAgICAgICAgIChzdGFja19lbmQgPiBvdGhlcl9zdGFja19iZWcgJiYgc3RhY2tfZW5kIDwgb3RoZXJfc3RhY2tfZW5kKSkgeworCisgICAgICAgICAgICAgICAgICAgIC8qIFByaW50IHRoZSBvdGhlciBzdGFjayB2YWx1ZXMgYmVmb3JlIHRoZSBhYm9ydCAqLworICAgICAgICAgICAgICAgICAgICBpZiAoIF9fa21wX3N0b3JhZ2VfbWFwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIC0xLCBvdGhlcl9zdGFja19iZWcsIG90aGVyX3N0YWNrX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90KVRDUl9QVFIoZl90aC0+dGgudGhfaW5mby5kcy5kc19zdGFja3NpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aF8lZCBzdGFjayAob3ZlcmxhcHBlZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIGZfdGggKSApOworCisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZygga21wX21zX2ZhdGFsLCBLTVBfTVNHKCBTdGFja092ZXJsYXAgKSwgS01QX0hOVCggQ2hhbmdlU3RhY2tMaW1pdCApLCBfX2ttcF9tc2dfbnVsbCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBLQV9UUkFDRSgxMCwoIl9fa21wX2NoZWNrX3N0YWNrX292ZXJsYXA6IHJldHVybmluZ1xuIikpOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZAorX19rbXBfaW5maW5pdGVfbG9vcCggdm9pZCApCit7CisgICAgc3RhdGljIGludCBkb25lID0gRkFMU0U7CisKKyAgICB3aGlsZSAoISBkb25lKSB7CisgICAgICAgIEtNUF9ZSUVMRCggMSApOworICAgIH0KK30KKworI2RlZmluZSBNQVhfTUVTU0FHRSAgICAgNTEyCisKK3ZvaWQKK19fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIGludCBndGlkLCB2b2lkICpwMSwgdm9pZCAqcDIsIHNpemVfdCBzaXplLCBjaGFyIGNvbnN0ICpmb3JtYXQsIC4uLikgeworICAgIGNoYXIgYnVmZmVyW01BWF9NRVNTQUdFXTsKKyAgICB2YV9saXN0IGFwOworCisgICAgdmFfc3RhcnQoIGFwLCBmb3JtYXQpOworICAgIEtNUF9TTlBSSU5URiggYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIk9NUCBzdG9yYWdlIG1hcDogJXAgJXAlOGx1ICVzXG4iLCBwMSwgcDIsICh1bnNpZ25lZCBsb25nKSBzaXplLCBmb3JtYXQgKTsKKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX3N0ZGlvX2xvY2sgKTsKKyAgICBfX2ttcF92cHJpbnRmKCBrbXBfZXJyLCBidWZmZXIsIGFwICk7CisjaWYgS01QX1BSSU5UX0RBVEFfUExBQ0VNRU5UCisgICAgaW50IG5vZGU7CisgICAgaWYoZ3RpZCA+PSAwKSB7CisgICAgICAgIGlmKHAxIDw9IHAyICYmIChjaGFyKilwMiAtIChjaGFyKilwMSA9PSBzaXplKSB7CisgICAgICAgICAgICBpZiggX19rbXBfc3RvcmFnZV9tYXBfdmVyYm9zZSApIHsKKyAgICAgICAgICAgICAgICBub2RlID0gX19rbXBfZ2V0X2hvc3Rfbm9kZShwMSk7CisgICAgICAgICAgICAgICAgaWYobm9kZSA8IDApICAvKiBkb2Vzbid0IHdvcmssIHNvIGRvbid0IHRyeSB0aGlzIG5leHQgdGltZSAqLworICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdG9yYWdlX21hcF92ZXJib3NlID0gRkFMU0U7CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgKmxhc3Q7CisgICAgICAgICAgICAgICAgICAgIGludCBsYXN0Tm9kZTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGxvY2FsUHJvYyA9IF9fa21wX2dldF9jcHVfZnJvbV9ndGlkKGd0aWQpOworCisgICAgICAgICAgICAgICAgICAgIHAxID0gKHZvaWQgKikoIChzaXplX3QpcDEgJiB+KChzaXplX3QpUEFHRV9TSVpFIC0gMSkgKTsKKyAgICAgICAgICAgICAgICAgICAgcDIgPSAodm9pZCAqKSggKChzaXplX3QpIHAyIC0gMSkgJiB+KChzaXplX3QpUEFHRV9TSVpFIC0gMSkgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYobG9jYWxQcm9jID49IDApCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9wcmludGZfbm9fbG9jaygiICBHVElEICVkIGxvY2FsTm9kZSAlZFxuIiwgZ3RpZCwgbG9jYWxQcm9jPj4xKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRmX25vX2xvY2soIiAgR1RJRCAlZFxuIiwgZ3RpZCk7CisjIGlmIEtNUF9VU0VfUFJDVEwKKy8qIFRoZSBtb3JlIGVsYWJvcmF0ZSBmb3JtYXQgaXMgZGlzYWJsZWQgZm9yIG5vdyBiZWNhdXNlIG9mIHRoZSBwcmN0bCBoYW5naW5nIGJ1Zy4gKi8KKyAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCA9IHAxOworICAgICAgICAgICAgICAgICAgICAgICAgbGFzdE5vZGUgPSBub2RlOworICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhpcyBsb29wIGNvbGxhdGVzIGFkamFjZW50IHBhZ2VzIHdpdGggdGhlIHNhbWUgaG9zdCBub2RlLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKilwMSArPSBQQUdFX1NJWkU7CisgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKHAxIDw9IHAyICYmIChub2RlID0gX19rbXBfZ2V0X2hvc3Rfbm9kZShwMSkpID09IGxhc3ROb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCIgICAgJXAtJXAgbWVtTm9kZSAlZFxuIiwgbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKilwMSAtIDEsIGxhc3ROb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgfSB3aGlsZShwMSA8PSBwMik7CisjIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRmX25vX2xvY2soIiAgICAlcC0lcCBtZW1Ob2RlICVkXG4iLCBwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKXAxICsgKFBBR0VfU0laRSAtIDEpLCBfX2ttcF9nZXRfaG9zdF9ub2RlKHAxKSk7CisgICAgICAgICAgICAgICAgICAgIGlmKHAxIDwgcDIpICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9wcmludGZfbm9fbG9jaygiICAgICVwLSVwIG1lbU5vZGUgJWRcbiIsIHAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKXAyICsgKFBBR0VfU0laRSAtIDEpLCBfX2ttcF9nZXRfaG9zdF9ub2RlKHAyKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyMgZW5kaWYKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgX19rbXBfcHJpbnRmX25vX2xvY2soIiAgJXNcbiIsIEtNUF9JMThOX1NUUiggU3RvcmFnZU1hcFdhcm5pbmcgKSApOworICAgIH0KKyNlbmRpZiAvKiBLTVBfUFJJTlRfREFUQV9QTEFDRU1FTlQgKi8KKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX3N0ZGlvX2xvY2sgKTsKK30KKwordm9pZAorX19rbXBfd2FybiggY2hhciBjb25zdCAqIGZvcm1hdCwgLi4uICkKK3sKKyAgICBjaGFyIGJ1ZmZlcltNQVhfTUVTU0FHRV07CisgICAgdmFfbGlzdCBhcDsKKworICAgIGlmICggX19rbXBfZ2VuZXJhdGVfd2FybmluZ3MgPT0ga21wX3dhcm5pbmdzX29mZiApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHZhX3N0YXJ0KCBhcCwgZm9ybWF0ICk7CisKKyAgICBLTVBfU05QUklOVEYoIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikgLCAiT01QIHdhcm5pbmc6ICVzXG4iLCBmb3JtYXQgKTsKKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX3N0ZGlvX2xvY2sgKTsKKyAgICBfX2ttcF92cHJpbnRmKCBrbXBfZXJyLCBidWZmZXIsIGFwICk7CisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiBfX2ttcF9zdGRpb19sb2NrICk7CisKKyAgICB2YV9lbmQoIGFwICk7Cit9CisKK3ZvaWQKK19fa21wX2Fib3J0X3Byb2Nlc3MoKQoreworCisgICAgLy8gTGF0ZXIgdGhyZWFkcyBtYXkgc3RhbGwgaGVyZSwgYnV0IHRoYXQncyBvayBiZWNhdXNlIGFib3J0KCkgd2lsbCBraWxsIHRoZW0uCisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiBfX2ttcF9leGl0X2xvY2sgKTsKKworICAgIGlmICggX19rbXBfZGVidWdfYnVmICkgeworICAgICAgICBfX2ttcF9kdW1wX2RlYnVnX2J1ZmZlcigpOworICAgIH07IC8vIGlmCisKKyAgICBpZiAoIEtNUF9PU19XSU5ET1dTICkgeworICAgICAgICAvLyBMZXQgb3RoZXIgdGhyZWFkcyBrbm93IG9mIGFibm9ybWFsIHRlcm1pbmF0aW9uIGFuZCBwcmV2ZW50IGRlYWRsb2NrCisgICAgICAgIC8vIGlmIGFib3J0IGhhcHBlbmVkIGR1cmluZyBsaWJyYXJ5IGluaXRpYWxpemF0aW9uIG9yIHNodXRkb3duCisgICAgICAgIF9fa21wX2dsb2JhbC5nLmdfYWJvcnQgPSBTSUdBQlJUOworCisgICAgICAgIC8qCisgICAgICAgICAgICBPbiBXaW5kb3dzKiBPUyBieSBkZWZhdWx0IGFib3J0KCkgY2F1c2VzIHBvcC11cCBlcnJvciBib3gsIHdoaWNoIHN0YWxscyBuaWdodGx5IHRlc3RpbmcuCisgICAgICAgICAgICBVbmZvcnR1bmF0ZWx5LCB3ZSBjYW5ub3QgcmVsaWFibHkgc3VwcHJlc3MgcG9wLXVwIGVycm9yIGJveGVzLiBfc2V0X2Fib3J0X2JlaGF2aW9yKCkKKyAgICAgICAgICAgIHdvcmtzIHdlbGwsIGJ1dCB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBhdmFpbGFibGUgaW4gVlM3ICh0aGlzIGlzIG5vdCBwcm9ibGVtIGZvciBETEwsIGJ1dAorICAgICAgICAgICAgaXQgaXMgYSBwcm9ibGVtIGZvciBzdGF0aWMgT3Blbk1QIFJUTCkuIFNldEVycm9yTW9kZSAoYW5kIHNvLCB0aW1lbGltaXQgdXRpbGl0eSkgZG9lcworICAgICAgICAgICAgbm90IGhlbHAsIGF0IGxlYXN0IGluIHNvbWUgdmVyc2lvbnMgb2YgTVMgQyBSVEwuCisKKyAgICAgICAgICAgIEl0IHNlZW1zIGZvbGxvd2luZyBzZXF1ZW5jZSBpcyB0aGUgb25seSB3YXkgdG8gc2ltdWxhdGUgYWJvcnQoKSBhbmQgYXZvaWQgcG9wLXVwIGVycm9yCisgICAgICAgICAgICBib3guCisgICAgICAgICovCisgICAgICAgIHJhaXNlKCBTSUdBQlJUICk7CisgICAgICAgIF9leGl0KCAzICk7ICAgIC8vIEp1c3QgaW4gY2FzZSwgaWYgc2lnbmFsIGlnbm9yZWQsIGV4aXQgYW55d2F5LgorICAgIH0gZWxzZSB7CisgICAgICAgIGFib3J0KCk7CisgICAgfTsgLy8gaWYKKworICAgIF9fa21wX2luZmluaXRlX2xvb3AoKTsKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX2V4aXRfbG9jayApOworCit9IC8vIF9fa21wX2Fib3J0X3Byb2Nlc3MKKwordm9pZAorX19rbXBfYWJvcnRfdGhyZWFkKCB2b2lkICkKK3sKKyAgICAvLyBUT0RPOiBFbGltaW5hdGUgZ19hYm9ydCBnbG9iYWwgdmFyaWFibGUgYW5kIHRoaXMgZnVuY3Rpb24uCisgICAgLy8gSW4gY2FzZSBvZiBhYm9ydCBqdXN0IGNhbGwgYWJvcnQoKSwgaXQgd2lsbCBraWxsIGFsbCB0aGUgdGhyZWFkcy4KKyAgICBfX2ttcF9pbmZpbml0ZV9sb29wKCk7Cit9IC8vIF9fa21wX2Fib3J0X3RocmVhZAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIFByaW50IG91dCB0aGUgc3RvcmFnZSBtYXAgZm9yIHRoZSBtYWpvciBrbXBfaW5mb190IHRocmVhZCBkYXRhIHN0cnVjdHVyZXMKKyAqIHRoYXQgYXJlIGFsbG9jYXRlZCB0b2dldGhlci4KKyAqLworCitzdGF0aWMgdm9pZAorX19rbXBfcHJpbnRfdGhyZWFkX3N0b3JhZ2VfbWFwKCBrbXBfaW5mb190ICp0aHIsIGludCBndGlkICkKK3sKKyAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCBndGlkLCB0aHIsIHRociArIDEsIHNpemVvZihrbXBfaW5mb190KSwgInRoXyVkIiwgZ3RpZCApOworCisgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggZ3RpZCwgJnRoci0+dGgudGhfaW5mbywgJnRoci0+dGgudGhfdGVhbSwgc2l6ZW9mKGttcF9kZXNjX3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhfJWQudGhfaW5mbyIsIGd0aWQgKTsKKworICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIGd0aWQsICZ0aHItPnRoLnRoX2xvY2FsLCAmdGhyLT50aC50aF9wcmlfaGVhZCwgc2l6ZW9mKGttcF9sb2NhbF90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoXyVkLnRoX2xvY2FsIiwgZ3RpZCApOworCisgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggZ3RpZCwgJnRoci0+dGgudGhfYmFyWzBdLCAmdGhyLT50aC50aF9iYXJbYnNfbGFzdF9iYXJyaWVyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGttcF9iYWxpZ25fdCkgKiBic19sYXN0X2JhcnJpZXIsICJ0aF8lZC50aF9iYXIiLCBndGlkICk7CisKKyAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCBndGlkLCAmdGhyLT50aC50aF9iYXJbYnNfcGxhaW5fYmFycmllcl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aHItPnRoLnRoX2Jhcltic19wbGFpbl9iYXJyaWVyKzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoa21wX2JhbGlnbl90KSwgInRoXyVkLnRoX2JhcltwbGFpbl0iLCBndGlkKTsKKworICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIGd0aWQsICZ0aHItPnRoLnRoX2Jhcltic19mb3Jram9pbl9iYXJyaWVyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoci0+dGgudGhfYmFyW2JzX2Zvcmtqb2luX2JhcnJpZXIrMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihrbXBfYmFsaWduX3QpLCAidGhfJWQudGhfYmFyW2Zvcmtqb2luXSIsIGd0aWQpOworCisgICAgI2lmIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIGd0aWQsICZ0aHItPnRoLnRoX2Jhcltic19yZWR1Y3Rpb25fYmFycmllcl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aHItPnRoLnRoX2Jhcltic19yZWR1Y3Rpb25fYmFycmllcisxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGttcF9iYWxpZ25fdCksICJ0aF8lZC50aF9iYXJbcmVkdWN0aW9uXSIsIGd0aWQpOworICAgICNlbmRpZiAvLyBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorfQorCisvKgorICogUHJpbnQgb3V0IHRoZSBzdG9yYWdlIG1hcCBmb3IgdGhlIG1ham9yIGttcF90ZWFtX3QgdGVhbSBkYXRhIHN0cnVjdHVyZXMKKyAqIHRoYXQgYXJlIGFsbG9jYXRlZCB0b2dldGhlci4KKyAqLworCitzdGF0aWMgdm9pZAorX19rbXBfcHJpbnRfdGVhbV9zdG9yYWdlX21hcCggY29uc3QgY2hhciAqaGVhZGVyLCBrbXBfdGVhbV90ICp0ZWFtLCBpbnQgdGVhbV9pZCwgaW50IG51bV90aHIgKQoreworICAgIGludCBudW1fZGlzcF9idWZmID0gdGVhbS0+dC50X21heF9ucHJvYyA+IDEgPyBLTVBfTUFYX0RJU1BfQlVGIDogMjsKKyAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCAtMSwgdGVhbSwgdGVhbSArIDEsIHNpemVvZihrbXBfdGVhbV90KSwgIiVzXyVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLCB0ZWFtX2lkICk7CisKKyAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCAtMSwgJnRlYW0tPnQudF9iYXJbMF0sICZ0ZWFtLT50LnRfYmFyW2JzX2xhc3RfYmFycmllcl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihrbXBfYmFsaWduX3RlYW1fdCkgKiBic19sYXN0X2JhcnJpZXIsICIlc18lZC50X2JhciIsIGhlYWRlciwgdGVhbV9pZCApOworCisKKyAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCAtMSwgJnRlYW0tPnQudF9iYXJbYnNfcGxhaW5fYmFycmllcl0sICZ0ZWFtLT50LnRfYmFyW2JzX3BsYWluX2JhcnJpZXIrMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihrbXBfYmFsaWduX3RlYW1fdCksICIlc18lZC50X2JhcltwbGFpbl0iLCBoZWFkZXIsIHRlYW1faWQgKTsKKworICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIC0xLCAmdGVhbS0+dC50X2Jhcltic19mb3Jram9pbl9iYXJyaWVyXSwgJnRlYW0tPnQudF9iYXJbYnNfZm9ya2pvaW5fYmFycmllcisxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGttcF9iYWxpZ25fdGVhbV90KSwgIiVzXyVkLnRfYmFyW2Zvcmtqb2luXSIsIGhlYWRlciwgdGVhbV9pZCApOworCisgICAgI2lmIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIC0xLCAmdGVhbS0+dC50X2Jhcltic19yZWR1Y3Rpb25fYmFycmllcl0sICZ0ZWFtLT50LnRfYmFyW2JzX3JlZHVjdGlvbl9iYXJyaWVyKzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoa21wX2JhbGlnbl90ZWFtX3QpLCAiJXNfJWQudF9iYXJbcmVkdWN0aW9uXSIsIGhlYWRlciwgdGVhbV9pZCApOworICAgICNlbmRpZiAvLyBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorCisgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggLTEsICZ0ZWFtLT50LnRfZGlzcGF0Y2hbMF0sICZ0ZWFtLT50LnRfZGlzcGF0Y2hbbnVtX3Rocl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihrbXBfZGlzcF90KSAqIG51bV90aHIsICIlc18lZC50X2Rpc3BhdGNoIiwgaGVhZGVyLCB0ZWFtX2lkICk7CisKKyAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCAtMSwgJnRlYW0tPnQudF90aHJlYWRzWzBdLCAmdGVhbS0+dC50X3RocmVhZHNbbnVtX3Rocl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihrbXBfaW5mb190ICopICogbnVtX3RociwgIiVzXyVkLnRfdGhyZWFkcyIsIGhlYWRlciwgdGVhbV9pZCApOworCisgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggLTEsICZ0ZWFtLT50LnRfZGlzcF9idWZmZXJbMF0sICZ0ZWFtLT50LnRfZGlzcF9idWZmZXJbbnVtX2Rpc3BfYnVmZl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihkaXNwYXRjaF9zaGFyZWRfaW5mb190KSAqIG51bV9kaXNwX2J1ZmYsICIlc18lZC50X2Rpc3BfYnVmZmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLCB0ZWFtX2lkICk7CisKKyAgICAvKgorICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIC0xLCAmdGVhbS0+dC50X3NldF9ucHJvY1swXSwgJnRlYW0tPnQudF9zZXRfbnByb2NbbnVtX3Rocl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihpbnQpICogbnVtX3RociwgIiVzXyVkLnRfc2V0X25wcm9jIiwgaGVhZGVyLCB0ZWFtX2lkICk7CisKKyAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCAtMSwgJnRlYW0tPnQudF9zZXRfZHluYW1pY1swXSwgJnRlYW0tPnQudF9zZXRfZHluYW1pY1tudW1fdGhyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGludCkgKiBudW1fdGhyLCAiJXNfJWQudF9zZXRfZHluYW1pYyIsIGhlYWRlciwgdGVhbV9pZCApOworCisgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggLTEsICZ0ZWFtLT50LnRfc2V0X25lc3RlZFswXSwgJnRlYW0tPnQudF9zZXRfbmVzdGVkW251bV90aHJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW50KSAqIG51bV90aHIsICIlc18lZC50X3NldF9uZXN0ZWQiLCBoZWFkZXIsIHRlYW1faWQgKTsKKworICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIC0xLCAmdGVhbS0+dC50X3NldF9ibG9ja3RpbWVbMF0sICZ0ZWFtLT50LnRfc2V0X2Jsb2NrdGltZVtudW1fdGhyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGludCkgKiBudW1fdGhyLCAiJXNfJWQudF9zZXRfbnByb2MiLCBoZWFkZXIsIHRlYW1faWQgKTsKKworICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIC0xLCAmdGVhbS0+dC50X3NldF9idF9pbnRlcnZhbHNbMF0sICZ0ZWFtLT50LnRfc2V0X2J0X2ludGVydmFsc1tudW1fdGhyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGludCkgKiBudW1fdGhyLCAiJXNfJWQudF9zZXRfZHluYW1pYyIsIGhlYWRlciwgdGVhbV9pZCApOworCisgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggLTEsICZ0ZWFtLT50LnRfc2V0X2J0X3NldFswXSwgJnRlYW0tPnQudF9zZXRfYnRfc2V0W251bV90aHJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW50KSAqIG51bV90aHIsICIlc18lZC50X3NldF9uZXN0ZWQiLCBoZWFkZXIsIHRlYW1faWQgKTsKKworICAgIC8vX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggLTEsICZ0ZWFtLT50LnRfc2V0X21heF9hY3RpdmVfbGV2ZWxzWzBdLCAmdGVhbS0+dC50X3NldF9tYXhfYWN0aXZlX2xldmVsc1tudW1fdGhyXSwKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihpbnQpICogbnVtX3RociwgIiVzXyVkLnRfc2V0X21heF9hY3RpdmVfbGV2ZWxzIiwgaGVhZGVyLCB0ZWFtX2lkICk7CisKKyAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCAtMSwgJnRlYW0tPnQudF9zZXRfc2NoZWRbMF0sICZ0ZWFtLT50LnRfc2V0X3NjaGVkW251bV90aHJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoa21wX3Jfc2NoZWRfdCkgKiBudW1fdGhyLCAiJXNfJWQudF9zZXRfc2NoZWQiLCBoZWFkZXIsIHRlYW1faWQgKTsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIC0xLCAmdGVhbS0+dC50X3NldF9wcm9jX2JpbmRbMF0sICZ0ZWFtLT50LnRfc2V0X3Byb2NfYmluZFtudW1fdGhyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGttcF9wcm9jX2JpbmRfdCkgKiBudW1fdGhyLCAiJXNfJWQudF9zZXRfcHJvY19iaW5kIiwgaGVhZGVyLCB0ZWFtX2lkICk7CisjZW5kaWYKKyAgICAqLworCisgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggLTEsICZ0ZWFtLT50LnRfdGFza3EsICZ0ZWFtLT50LnRfY29weXByaXZfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGttcF90YXNrcV90KSwgIiVzXyVkLnRfdGFza3EiLCBoZWFkZXIsIHRlYW1faWQgKTsKK30KKworc3RhdGljIHZvaWQgX19rbXBfaW5pdF9hbGxvY2F0b3IoKSB7fQorc3RhdGljIHZvaWQgX19rbXBfZmluaV9hbGxvY2F0b3IoKSB7fQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIEtNUF9EWU5BTUlDX0xJQgorIyBpZiBLTVBfT1NfV0lORE9XUworCisKK3N0YXRpYyB2b2lkCitfX2ttcF9yZXNldF9sb2NrKCBrbXBfYm9vdHN0cmFwX2xvY2tfdCogbGNrICkgeworICAgIC8vIFRPRE86IENoYW5nZSB0byBfX2ttcF9icmVha19ib290c3RyYXBfbG9jaygpLgorICAgIF9fa21wX2luaXRfYm9vdHN0cmFwX2xvY2soIGxjayApOyAvLyBtYWtlIHRoZSBsb2NrIHJlbGVhc2VkCit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9yZXNldF9sb2Nrc19vbl9wcm9jZXNzX2RldGFjaCggaW50IGd0aWRfcmVxICkgeworICAgIGludCBpOworICAgIGludCB0aHJlYWRfY291bnQ7CisKKyAgICAvLyBQUk9DRVNTX0RFVEFDSCBpcyBleHBlY3RlZCB0byBiZSBjYWxsZWQgYnkgYSB0aHJlYWQKKyAgICAvLyB0aGF0IGV4ZWN1dGVzIFByb2Nlc3NFeGl0KCkgb3IgRnJlZUxpYnJhcnkoKS4KKyAgICAvLyBPUyB0ZXJtaW5hdGVzIG90aGVyIHRocmVhZHMgKGV4Y2VwdCB0aGUgb25lIGNhbGxpbmcgUHJvY2Vzc0V4aXQgb3IgRnJlZUxpYnJhcnkpLgorICAgIC8vIFNvLCBpdCBtaWdodCBiZSBzYWZlIHRvIGFjY2VzcyB0aGUgX19rbXBfdGhyZWFkc1tdIHdpdGhvdXQgdGFraW5nIHRoZSBmb3Jram9pbl9sb2NrLgorICAgIC8vIEhvd2V2ZXIsIGluIGZhY3QsIHNvbWUgdGhyZWFkcyBjYW4gYmUgc3RpbGwgYWxpdmUgaGVyZSwgYWx0aG91Z2ggYmVpbmcgYWJvdXQgdG8gYmUgdGVybWluYXRlZC4KKyAgICAvLyBUaGUgdGhyZWFkcyBpbiB0aGUgYXJyYXkgd2l0aCBkc190aHJlYWQ9PTAgYXJlIG1vc3Qgc3VzcGljaW91cy4KKyAgICAvLyBBY3R1YWxseSwgaXQgY2FuIGJlIG5vdCBzYWZlIHRvIGFjY2VzcyB0aGUgX19rbXBfdGhyZWFkc1tdLgorCisgICAgLy8gVE9ETzogZG9lcyBpdCBtYWtlIHNlbnNlIHRvIGNoZWNrIF9fa21wX3Jvb3RzW10gPworCisgICAgLy8gTGV0J3MgY2hlY2sgdGhhdCB0aGVyZSBhcmUgbm8gb3RoZXIgYWxpdmUgdGhyZWFkcyByZWdpc3RlcmVkIHdpdGggdGhlIE9NUCBsaWIuCisgICAgd2hpbGUoIDEgKSB7CisgICAgICAgIHRocmVhZF9jb3VudCA9IDA7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OyArK2kgKSB7CisgICAgICAgICAgICBpZiggIV9fa21wX3RocmVhZHMgKSBjb250aW51ZTsKKyAgICAgICAgICAgIGttcF9pbmZvX3QqIHRoID0gX19rbXBfdGhyZWFkc1sgaSBdOworICAgICAgICAgICAgaWYoIHRoID09IE5VTEwgKSBjb250aW51ZTsKKyAgICAgICAgICAgIGludCBndGlkID0gdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZDsKKyAgICAgICAgICAgIGlmKCBndGlkID09IGd0aWRfcmVxICkgY29udGludWU7CisgICAgICAgICAgICBpZiggZ3RpZCA8IDAgKSBjb250aW51ZTsKKyAgICAgICAgICAgIERXT1JEIGV4aXRfdmFsOworICAgICAgICAgICAgaW50IGFsaXZlID0gX19rbXBfaXNfdGhyZWFkX2FsaXZlKCB0aCwgJmV4aXRfdmFsICk7CisgICAgICAgICAgICBpZiggYWxpdmUgKSB7CisgICAgICAgICAgICArK3RocmVhZF9jb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiggdGhyZWFkX2NvdW50ID09IDAgKSBicmVhazsgLy8gc3VjY2VzcworICAgIH0KKworICAgIC8vIEFzc3VtZSB0aGF0IEknbSBhbG9uZS4KKworICAgIC8vIE5vdyBpdCBtaWdodCBiZSBwcm9iYWJseSBzYWZlIHRvIGNoZWNrIGFuZCByZXNldCBsb2Nrcy4KKyAgICAvLyBfX2ttcF9mb3Jram9pbl9sb2NrIGFuZCBfX2ttcF9zdGRpb19sb2NrIGFyZSBleHBlY3RlZCB0byBiZSByZXNldC4KKyAgICBfX2ttcF9yZXNldF9sb2NrKCAmX19rbXBfZm9ya2pvaW5fbG9jayApOworICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICBfX2ttcF9yZXNldF9sb2NrKCAmX19rbXBfc3RkaW9fbG9jayApOworICAgICNlbmRpZiAvLyBLTVBfREVCVUcKKworCit9CisKK0JPT0wgV0lOQVBJCitEbGxNYWluKCBISU5TVEFOQ0UgaEluc3RETEwsIERXT1JEIGZkd1JlYXNvbiwgTFBWT0lEIGxwUmVzZXJ2ZWQgKSB7CisgICAgLy9fX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOworCisgICAgc3dpdGNoKCBmZHdSZWFzb24gKSB7CisKKyAgICAgICAgY2FzZSBETExfUFJPQ0VTU19BVFRBQ0g6CisgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiRGxsTWFpbjogUFJPQ0VTU19BVFRBQ0hcbiIgKSk7CisKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworCisgICAgICAgIGNhc2UgRExMX1BST0NFU1NfREVUQUNIOgorICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIkRsbE1haW46IFBST0NFU1NfREVUQUNIIFQjJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2dldF9zcGVjaWZpYygpICkpOworCisgICAgICAgICAgICBpZiggbHBSZXNlcnZlZCAhPSBOVUxMICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBscFJlc2VydmVkIGlzIHVzZWQgZm9yIHRlbGxpbmcgdGhlIGRpZmZlcmVuY2U6CisgICAgICAgICAgICAgICAgLy8gIGxwUmVzZXJ2ZWQgPT0gTlVMTCB3aGVuIEZyZWVMaWJyYXJ5KCkgd2FzIGNhbGxlZCwKKyAgICAgICAgICAgICAgICAvLyAgbHBSZXNlcnZlZCAhPSBOVUxMIHdoZW4gdGhlIHByb2Nlc3MgdGVybWluYXRlcy4KKyAgICAgICAgICAgICAgICAvLyBXaGVuIEZyZWVMaWJyYXJ5KCkgaXMgY2FsbGVkLCB3b3JrZXIgdGhyZWFkcyByZW1haW4gYWxpdmUuCisgICAgICAgICAgICAgICAgLy8gU28gdGhleSB3aWxsIHJlbGVhc2UgdGhlIGZvcmtqb2luIGxvY2sgYnkgdGhlbXNlbHZlcy4KKyAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSBwcm9jZXNzIHRlcm1pbmF0ZXMsIHdvcmtlciB0aHJlYWRzIGRpc2FwcGVhciB0cmlnZ2VyaW5nCisgICAgICAgICAgICAgICAgLy8gdGhlIHByb2JsZW0gb2YgdW5yZWxlYXNlZCBmb3Jram9pbiBsb2NrIGFzIGRlc2NyaWJlZCBiZWxvdy4KKworICAgICAgICAgICAgICAgIC8vIEEgd29ya2VyIHRocmVhZCBjYW4gdGFrZSB0aGUgZm9ya2pvaW4gbG9jaworICAgICAgICAgICAgICAgIC8vIGluIF9fa21wX3N1c3BlbmRfdGVtcGxhdGUoKS0+X19rbXBfcm1sX2RlY3JlYXNlX2xvYWRfYmVmb3JlX3NsZWVwKCkuCisgICAgICAgICAgICAgICAgLy8gVGhlIHByb2JsZW0gY29tZXMgdXAgaWYgdGhhdCB3b3JrZXIgdGhyZWFkIGJlY29tZXMgZGVhZAorICAgICAgICAgICAgICAgIC8vIGJlZm9yZSBpdCByZWxlYXNlcyB0aGUgZm9ya2pvaW4gbG9jay4KKyAgICAgICAgICAgICAgICAvLyBUaGUgZm9ya2pvaW4gbG9jayByZW1haW5zIHRha2VuLCB3aGlsZSB0aGUgdGhyZWFkCisgICAgICAgICAgICAgICAgLy8gZXhlY3V0aW5nIERsbE1haW4oKS0+UFJPQ0VTU19ERVRBQ0gtPl9fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5KCkgYmVsb3cKKyAgICAgICAgICAgICAgICAvLyB3aWxsIHRyeSB0byB0YWtlIHRoZSBmb3Jram9pbiBsb2NrIGFuZCB3aWxsIGFsd2F5cyBmYWlsLAorICAgICAgICAgICAgICAgIC8vIHNvIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHdpbGwgbmV2ZXIgZmluaXNoIFtub3JtYWxseV0uCisgICAgICAgICAgICAgICAgLy8gVGhpcyBzY2VuYXJpbyBpcyBwb3NzaWJsZSBpZiBfX2ttcGNfZW5kKCkgaGFzIG5vdCBiZWVuIGV4ZWN1dGVkLgorICAgICAgICAgICAgICAgIC8vIEl0IGxvb2tzIGxpa2UgaXQncyBub3QgYSBjb3JuZXIgY2FzZSwgYnV0IGNvbW1vbiBjYXNlczoKKyAgICAgICAgICAgICAgICAvLyAtIHRoZSBtYWluIGZ1bmN0aW9uIHdhcyBjb21waWxlZCBieSBhbiBhbHRlcm5hdGl2ZSBjb21waWxlcjsKKyAgICAgICAgICAgICAgICAvLyAtIHRoZSBtYWluIGZ1bmN0aW9uIHdhcyBjb21waWxlZCBieSBpY2wgYnV0IHdpdGhvdXQgL1FvcGVubXAgKGFwcGxpY2F0aW9uIHdpdGggcGx1Z2lucyk7CisgICAgICAgICAgICAgICAgLy8gLSBhcHBsaWNhdGlvbiB0ZXJtaW5hdGVzIGJ5IGNhbGxpbmcgQyBleGl0KCksIEZvcnRyYW4gQ0FMTCBFWElUKCkgb3IgRm9ydHJhbiBTVE9QLgorICAgICAgICAgICAgICAgIC8vIC0gYWxpdmUgZm9yZWlnbiB0aHJlYWQgcHJldmVudGVkIF9fa21wY19lbmQgZnJvbSBkb2luZyBjbGVhbnVwLgorCisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGhhY2sgdG8gd29yayBhcm91bmQgdGhlIHByb2JsZW0uCisgICAgICAgICAgICAgICAgLy8gVE9ETzogISEhIHRvIGZpZ3VyZSBvdXQgc29tZXRoaW5nIGJldHRlci4KKyAgICAgICAgICAgICAgICBfX2ttcF9yZXNldF9sb2Nrc19vbl9wcm9jZXNzX2RldGFjaCggX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfX2ttcF9pbnRlcm5hbF9lbmRfbGlicmFyeSggX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKSApOworCisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKworICAgICAgICBjYXNlIERMTF9USFJFQURfQVRUQUNIOgorICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIkRsbE1haW46IFRIUkVBRF9BVFRBQ0hcbiIgKSk7CisKKyAgICAgICAgICAgIC8qIGlmIHdlIHdhbnRlZCB0byByZWdpc3RlciBuZXcgc2libGluZ3MgYWxsIHRoZSB0aW1lIGhlcmUgY2FsbAorICAgICAgICAgICAgICogX19rbXBfZ2V0X2d0aWQoKTsgKi8KKyAgICAgICAgICAgIHJldHVybiBUUlVFOworCisgICAgICAgIGNhc2UgRExMX1RIUkVBRF9ERVRBQ0g6CisgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiRGxsTWFpbjogVEhSRUFEX0RFVEFDSCBUIyVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKSApKTsKKworICAgICAgICAgICAgX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZCggX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKSApOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKyMgZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KKyNlbmRpZiAvKiBLTVBfRFlOQU1JQ19MSUIgKi8KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogQ2hhbmdlIHRoZSBsaWJyYXJ5IHR5cGUgdG8gInN0YXR1cyIgYW5kIHJldHVybiB0aGUgb2xkIHR5cGUgKi8KKy8qIGNhbGxlZCBmcm9tIHdpdGhpbiBpbml0aWFsaXphdGlvbiByb3V0aW5lcyB3aGVyZSBfX2ttcF9pbml0el9sb2NrIGlzIGhlbGQgKi8KK2ludAorX19rbXBfY2hhbmdlX2xpYnJhcnkoIGludCBzdGF0dXMgKQoreworICAgIGludCBvbGRfc3RhdHVzOworCisgICAgb2xkX3N0YXR1cyA9IF9fa21wX3lpZWxkX2luaXQgJiAxOyAgLy8gY2hlY2sgd2hldGhlciBLTVBfTElCUkFSWT10aHJvdWdocHV0IChldmVuIGluaXQgY291bnQpCisKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIF9fa21wX3lpZWxkX2luaXQgfD0gMTsgIC8vIHRocm91Z2hwdXQgPT4gdHVybmFyb3VuZCAob2RkIGluaXQgY291bnQpCisgICAgfQorICAgIGVsc2UgeworICAgICAgICBfX2ttcF95aWVsZF9pbml0ICY9IH4xOyAvLyB0dXJuYXJvdW5kID0+IHRocm91Z2hwdXQgKGV2ZW4gaW5pdCBjb3VudCkKKyAgICB9CisKKyAgICByZXR1cm4gb2xkX3N0YXR1czsgIC8vIHJldHVybiBwcmV2aW91cyBzZXR0aW5nIG9mIHdoZXRoZXIgS01QX0xJQlJBUlk9dGhyb3VnaHB1dAorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBfX2ttcF9wYXJhbGxlbF9kZW8gLS0KKyAqIFdhaXQgdW50aWwgaXQncyBvdXIgdHVybi4KKyAqLwordm9pZAorX19rbXBfcGFyYWxsZWxfZGVvKCBpbnQgKmd0aWRfcmVmLCBpbnQgKmNpZF9yZWYsIGlkZW50X3QgKmxvY19yZWYgKQoreworICAgIGludCBndGlkID0gKmd0aWRfcmVmOworI2lmZGVmIEJVSUxEX1BBUkFMTEVMX09SREVSRUQKKyAgICBrbXBfdGVhbV90ICp0ZWFtID0gX19rbXBfdGVhbV9mcm9tX2d0aWQoIGd0aWQgKTsKKyNlbmRpZiAvKiBCVUlMRF9QQVJBTExFTF9PUkRFUkVEICovCisKKyAgICBpZiggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBpZiggX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfcm9vdC0+ci5yX2FjdGl2ZSApCisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKyAgICAgICAgICAgIF9fa21wX3B1c2hfc3luYyggZ3RpZCwgY3Rfb3JkZXJlZF9pbl9wYXJhbGxlbCwgbG9jX3JlZiwgTlVMTCwgMCApOworI2Vsc2UKKyAgICAgICAgICAgIF9fa21wX3B1c2hfc3luYyggZ3RpZCwgY3Rfb3JkZXJlZF9pbl9wYXJhbGxlbCwgbG9jX3JlZiwgTlVMTCApOworI2VuZGlmCisgICAgfQorI2lmZGVmIEJVSUxEX1BBUkFMTEVMX09SREVSRUQKKyAgICBpZiggIXRlYW0tPnQudF9zZXJpYWxpemVkICkgeworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgS01QX1dBSVRfWUlFTEQoJnRlYW0tPnQudF9vcmRlcmVkLmR0LnRfdmFsdWUsIF9fa21wX3RpZF9mcm9tX2d0aWQoIGd0aWQgKSwgS01QX0VRLCBOVUxMKTsKKyAgICAgICAgS01QX01CKCk7CisgICAgfQorI2VuZGlmIC8qIEJVSUxEX1BBUkFMTEVMX09SREVSRUQgKi8KK30KKworLyogX19rbXBfcGFyYWxsZWxfZHhvIC0tCisgKiBTaWduYWwgdGhlIG5leHQgdGFzay4KKyAqLworCit2b2lkCitfX2ttcF9wYXJhbGxlbF9keG8oIGludCAqZ3RpZF9yZWYsIGludCAqY2lkX3JlZiwgaWRlbnRfdCAqbG9jX3JlZiApCit7CisgICAgaW50IGd0aWQgPSAqZ3RpZF9yZWY7CisjaWZkZWYgQlVJTERfUEFSQUxMRUxfT1JERVJFRAorICAgIGludCB0aWQgPSAgX19rbXBfdGlkX2Zyb21fZ3RpZCggZ3RpZCApOworICAgIGttcF90ZWFtX3QgKnRlYW0gPSBfX2ttcF90ZWFtX2Zyb21fZ3RpZCggZ3RpZCApOworI2VuZGlmIC8qIEJVSUxEX1BBUkFMTEVMX09SREVSRUQgKi8KKworICAgIGlmKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGlmKCBfX2ttcF90aHJlYWRzW2d0aWRdLT50aC50aF9yb290LT5yLnJfYWN0aXZlICkKKyAgICAgICAgICAgIF9fa21wX3BvcF9zeW5jKCBndGlkLCBjdF9vcmRlcmVkX2luX3BhcmFsbGVsLCBsb2NfcmVmICk7CisgICAgfQorI2lmZGVmIEJVSUxEX1BBUkFMTEVMX09SREVSRUQKKyAgICBpZiAoICEgdGVhbS0+dC50X3NlcmlhbGl6ZWQgKSB7CisgICAgICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgICAgIC8qIHVzZSB0aGUgdGlkIG9mIHRoZSBuZXh0IHRocmVhZCBpbiB0aGlzIHRlYW0gKi8KKyAgICAgICAgLyogVE9ETyByZXBsZWFjZSB3aXRoIGdlbmVyYWwgcmVsZWFzZSBwcm9jZWR1cmUgKi8KKyAgICAgICAgdGVhbS0+dC50X29yZGVyZWQuZHQudF92YWx1ZSA9ICgodGlkICsgMSkgJSB0ZWFtLT50LnRfbnByb2MgKTsKKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX0JMQU1FCisgICAgICAgIGlmIChvbXB0X2VuYWJsZWQgJiYKKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9yZWxlYXNlX29yZGVyZWQpKSB7CisgICAgICAgICAgICAvKiBhY2NlcHQgYmxhbWUgZm9yICJvcmRlcmVkIiB3YWl0aW5nICovCisgICAgICAgICAgICBrbXBfaW5mb190ICp0aGlzX3RocmVhZCA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcmVsZWFzZV9vcmRlcmVkKSgKKyAgICAgICAgICAgICAgICB0aGlzX3RocmVhZC0+dGgub21wdF90aHJlYWRfaW5mby53YWl0X2lkKTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisgICAgfQorI2VuZGlmIC8qIEJVSUxEX1BBUkFMTEVMX09SREVSRUQgKi8KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogVGhlIEJBUlJJRVIgZm9yIGEgU0lOR0xFIHByb2Nlc3Mgc2VjdGlvbiBpcyBhbHdheXMgZXhwbGljaXQgICAqLworCitpbnQKK19fa21wX2VudGVyX3NpbmdsZSggaW50IGd0aWQsIGlkZW50X3QgKmlkX3JlZiwgaW50IHB1c2hfd3MgKQoreworICAgIGludCBzdGF0dXM7CisgICAga21wX2luZm9fdCAqdGg7CisgICAga21wX3RlYW1fdCAqdGVhbTsKKworICAgIGlmKCAhIFRDUl80KF9fa21wX2luaXRfcGFyYWxsZWwpICkKKyAgICAgICAgX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZSgpOworCisgICAgdGggICA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICB0ZWFtID0gdGgtPnRoLnRoX3RlYW07CisgICAgc3RhdHVzID0gMDsKKworICAgIHRoLT50aC50aF9pZGVudCA9IGlkX3JlZjsKKworICAgIGlmICggdGVhbS0+dC50X3NlcmlhbGl6ZWQgKSB7CisgICAgICAgIHN0YXR1cyA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAga21wX2ludDMyIG9sZF90aGlzID0gdGgtPnRoLnRoX2xvY2FsLnRoaXNfY29uc3RydWN0OworCisgICAgICAgICsrdGgtPnRoLnRoX2xvY2FsLnRoaXNfY29uc3RydWN0OworICAgICAgICAvKiB0cnkgdG8gc2V0IHRlYW0gY291bnQgdG8gdGhyZWFkIGNvdW50LS1zdWNjZXNzIG1lYW5zIHRocmVhZCBnb3QgdGhlCisgICAgICAgICAgIHNpbmdsZSBibG9jaworICAgICAgICAqLworICAgICAgICAvKiBUT0RPOiBTaG91bGQgdGhpcyBiZSBhY3F1aXJlIG9yIHJlbGVhc2U/ICovCisgICAgICAgIHN0YXR1cyA9IEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMigmdGVhbS0+dC50X2NvbnN0cnVjdCwgb2xkX3RoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfbG9jYWwudGhpc19jb25zdHJ1Y3QpOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgaWYgKCBfX2l0dF9tZXRhZGF0YV9hZGRfcHRyICYmIF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDMgJiYgS01QX01BU1RFUl9HVElEKGd0aWQpICYmCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgIHRoLT50aC50aF90ZWFtc19taWNyb3Rhc2sgPT0gTlVMTCAmJgorI2VuZGlmCisgICAgICAgICAgICB0ZWFtLT50LnRfYWN0aXZlX2xldmVsID09IDEgKQorICAgICAgICB7ICAgLy8gT25seSByZXBvcnQgbWV0YWRhdGEgYnkgbWFzdGVyIG9mIGFjdGl2ZSB0ZWFtIGF0IGxldmVsIDEKKyAgICAgICAgICAgIF9fa21wX2l0dF9tZXRhZGF0YV9zaW5nbGUoIGlkX3JlZiApOworICAgICAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgIH0KKworICAgIGlmKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGlmIChzdGF0dXMgJiYgcHVzaF93cykgeworICAgICAgICAgICAgX19rbXBfcHVzaF93b3Jrc2hhcmUoIGd0aWQsIGN0X3BzaW5nbGUsIGlkX3JlZiApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX19rbXBfY2hlY2tfd29ya3NoYXJlKCBndGlkLCBjdF9wc2luZ2xlLCBpZF9yZWYgKTsKKyAgICAgICAgfQorICAgIH0KKyNpZiBVU0VfSVRUX0JVSUxECisgICAgaWYgKCBzdGF0dXMgKSB7CisgICAgICAgIF9fa21wX2l0dF9zaW5nbGVfc3RhcnQoIGd0aWQgKTsKKyAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3ZvaWQKK19fa21wX2V4aXRfc2luZ2xlKCBpbnQgZ3RpZCApCit7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9zaW5nbGVfZW5kKCBndGlkICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgIGlmKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wb3Bfd29ya3NoYXJlKCBndGlkLCBjdF9wc2luZ2xlLCBOVUxMICk7Cit9CisKKworLyoKKyAqIGRldGVybWluZSBpZiB3ZSBjYW4gZ28gcGFyYWxsZWwgb3IgbXVzdCB1c2UgYSBzZXJpYWxpemVkIHBhcmFsbGVsIHJlZ2lvbiBhbmQKKyAqIGhvdyBtYW55IHRocmVhZHMgd2UgY2FuIHVzZQorICogc2V0X25wcm9jIGlzIHRoZSBudW1iZXIgb2YgdGhyZWFkcyByZXF1ZXN0ZWQgZm9yIHRoZSB0ZWFtCisgKiByZXR1cm5zIDAgaWYgd2Ugc2hvdWxkIHNlcmlhbGl6ZSBvciBvbmx5IHVzZSBvbmUgdGhyZWFkLAorICogb3RoZXJ3aXNlIHRoZSBudW1iZXIgb2YgdGhyZWFkcyB0byB1c2UKKyAqIFRoZSBmb3Jram9pbiBsb2NrIGlzIGhlbGQgYnkgdGhlIGNhbGxlci4KKyAqLworc3RhdGljIGludAorX19rbXBfcmVzZXJ2ZV90aHJlYWRzKCBrbXBfcm9vdF90ICpyb290LCBrbXBfdGVhbV90ICpwYXJlbnRfdGVhbSwKKyAgIGludCBtYXN0ZXJfdGlkLCBpbnQgc2V0X250aHJlYWRzCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgLCBpbnQgZW50ZXJfdGVhbXMKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworKQoreworICAgIGludCBjYXBhY2l0eTsKKyAgICBpbnQgbmV3X250aHJlYWRzOworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggcm9vdCAmJiBwYXJlbnRfdGVhbSApOworCisgICAgLy8KKyAgICAvLyBJZiBkeW4tdmFyIGlzIHNldCwgZHluYW1pY2FsbHkgYWRqdXN0IHRoZSBudW1iZXIgb2YgZGVzaXJlZCB0aHJlYWRzLAorICAgIC8vIGFjY29yZGluZyB0byB0aGUgbWV0aG9kIHNwZWNpZmllZCBieSBkeW5hbWljX21vZGUuCisgICAgLy8KKyAgICBuZXdfbnRocmVhZHMgPSBzZXRfbnRocmVhZHM7CisgICAgaWYgKCAhIGdldF9fZHluYW1pY18yKCBwYXJlbnRfdGVhbSwgbWFzdGVyX3RpZCApICkgeworICAgICAgICA7CisgICAgfQorI2lmZGVmIFVTRV9MT0FEX0JBTEFOQ0UKKyAgICBlbHNlIGlmICggX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljX21vZGUgPT0gZHluYW1pY19sb2FkX2JhbGFuY2UgKSB7CisgICAgICAgIG5ld19udGhyZWFkcyA9IF9fa21wX2xvYWRfYmFsYW5jZV9ucHJvYyggcm9vdCwgc2V0X250aHJlYWRzICk7CisgICAgICAgIGlmICggbmV3X250aHJlYWRzID09IDEgKSB7CisgICAgICAgICAgICBLQ19UUkFDRSggMTAsICggIl9fa21wX3Jlc2VydmVfdGhyZWFkczogVCMlZCBsb2FkIGJhbGFuY2UgcmVkdWNlZCByZXNlcnZhdGlvbiB0byAxIHRocmVhZFxuIiwKKyAgICAgICAgICAgICAgbWFzdGVyX3RpZCApKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGlmICggbmV3X250aHJlYWRzIDwgc2V0X250aHJlYWRzICkgeworICAgICAgICAgICAgS0NfVFJBQ0UoIDEwLCAoICJfX2ttcF9yZXNlcnZlX3RocmVhZHM6IFQjJWQgbG9hZCBiYWxhbmNlIHJlZHVjZWQgcmVzZXJ2YXRpb24gdG8gJWQgdGhyZWFkc1xuIiwKKyAgICAgICAgICAgICAgbWFzdGVyX3RpZCwgbmV3X250aHJlYWRzICkpOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIFVTRV9MT0FEX0JBTEFOQ0UgKi8KKyAgICBlbHNlIGlmICggX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljX21vZGUgPT0gZHluYW1pY190aHJlYWRfbGltaXQgKSB7CisgICAgICAgIG5ld19udGhyZWFkcyA9IF9fa21wX2F2YWlsX3Byb2MgLSBfX2ttcF9udGggKyAocm9vdC0+ci5yX2FjdGl2ZSA/IDEKKyAgICAgICAgICA6IHJvb3QtPnIucl9ob3RfdGVhbS0+dC50X25wcm9jKTsKKyAgICAgICAgaWYgKCBuZXdfbnRocmVhZHMgPD0gMSApIHsKKyAgICAgICAgICAgIEtDX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVzZXJ2ZV90aHJlYWRzOiBUIyVkIHRocmVhZCBsaW1pdCByZWR1Y2VkIHJlc2VydmF0aW9uIHRvIDEgdGhyZWFkXG4iLAorICAgICAgICAgICAgICBtYXN0ZXJfdGlkICkpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBuZXdfbnRocmVhZHMgPCBzZXRfbnRocmVhZHMgKSB7CisgICAgICAgICAgICBLQ19UUkFDRSggMTAsICggIl9fa21wX3Jlc2VydmVfdGhyZWFkczogVCMlZCB0aHJlYWQgbGltaXQgcmVkdWNlZCByZXNlcnZhdGlvbiB0byAlZCB0aHJlYWRzXG4iLAorICAgICAgICAgICAgICBtYXN0ZXJfdGlkLCBuZXdfbnRocmVhZHMgKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBuZXdfbnRocmVhZHMgPSBzZXRfbnRocmVhZHM7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pY19tb2RlID09IGR5bmFtaWNfcmFuZG9tICkgeworICAgICAgICBpZiAoIHNldF9udGhyZWFkcyA+IDIgKSB7CisgICAgICAgICAgICBuZXdfbnRocmVhZHMgPSBfX2ttcF9nZXRfcmFuZG9tKCBwYXJlbnRfdGVhbS0+dC50X3RocmVhZHNbbWFzdGVyX3RpZF0gKTsKKyAgICAgICAgICAgIG5ld19udGhyZWFkcyA9ICggbmV3X250aHJlYWRzICUgc2V0X250aHJlYWRzICkgKyAxOworICAgICAgICAgICAgaWYgKCBuZXdfbnRocmVhZHMgPT0gMSApIHsKKyAgICAgICAgICAgICAgICBLQ19UUkFDRSggMTAsICggIl9fa21wX3Jlc2VydmVfdGhyZWFkczogVCMlZCBkeW5hbWljIHJhbmRvbSByZWR1Y2VkIHJlc2VydmF0aW9uIHRvIDEgdGhyZWFkXG4iLAorICAgICAgICAgICAgICAgICAgbWFzdGVyX3RpZCApKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggbmV3X250aHJlYWRzIDwgc2V0X250aHJlYWRzICkgeworICAgICAgICAgICAgICAgIEtDX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVzZXJ2ZV90aHJlYWRzOiBUIyVkIGR5bmFtaWMgcmFuZG9tIHJlZHVjZWQgcmVzZXJ2YXRpb24gdG8gJWQgdGhyZWFkc1xuIiwKKyAgICAgICAgICAgICAgICAgIG1hc3Rlcl90aWQsIG5ld19udGhyZWFkcyApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgS01QX0FTU0VSVCggMCApOworICAgIH0KKworICAgIC8vCisgICAgLy8gUmVzcGVjdCBLTVBfQUxMX1RIUkVBRFMsIEtNUF9NQVhfVEhSRUFEUywgT01QX1RIUkVBRF9MSU1JVC4KKyAgICAvLworICAgIGlmICggX19rbXBfbnRoICsgbmV3X250aHJlYWRzIC0gKCByb290LT5yLnJfYWN0aXZlID8gMSA6CisgICAgICByb290LT5yLnJfaG90X3RlYW0tPnQudF9ucHJvYyApID4gX19rbXBfbWF4X250aCApIHsKKyAgICAgICAgaW50IHRsX250aHJlYWRzID0gX19rbXBfbWF4X250aCAtIF9fa21wX250aCArICggcm9vdC0+ci5yX2FjdGl2ZSA/IDEgOgorICAgICAgICAgIHJvb3QtPnIucl9ob3RfdGVhbS0+dC50X25wcm9jICk7CisgICAgICAgIGlmICggdGxfbnRocmVhZHMgPD0gMCApIHsKKyAgICAgICAgICAgIHRsX250aHJlYWRzID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIElmIGR5bi12YXIgaXMgZmFsc2UsIGVtaXQgYSAxLXRpbWUgd2FybmluZy4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCAhIGdldF9fZHluYW1pY18yKCBwYXJlbnRfdGVhbSwgbWFzdGVyX3RpZCApCisgICAgICAgICAgJiYgKCAhIF9fa21wX3Jlc2VydmVfd2FybiApICkgeworICAgICAgICAgICAgX19rbXBfcmVzZXJ2ZV93YXJuID0gMTsKKyAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICBrbXBfbXNfd2FybmluZywKKyAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50Rm9ybVRoclRlYW0sIHNldF9udGhyZWFkcywgdGxfbnRocmVhZHMgKSwKKyAgICAgICAgICAgICAgICBLTVBfSE5UKCBVbnNldF9BTExfVEhSRUFEUyApLAorICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICApOworICAgICAgICB9CisgICAgICAgIGlmICggdGxfbnRocmVhZHMgPT0gMSApIHsKKyAgICAgICAgICAgIEtDX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVzZXJ2ZV90aHJlYWRzOiBUIyVkIEtNUF9BTExfVEhSRUFEUyByZWR1Y2VkIHJlc2VydmF0aW9uIHRvIDEgdGhyZWFkXG4iLAorICAgICAgICAgICAgICBtYXN0ZXJfdGlkICkpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgS0NfVFJBQ0UoIDEwLCAoICJfX2ttcF9yZXNlcnZlX3RocmVhZHM6IFQjJWQgS01QX0FMTF9USFJFQURTIHJlZHVjZWQgcmVzZXJ2YXRpb24gdG8gJWQgdGhyZWFkc1xuIiwKKyAgICAgICAgICBtYXN0ZXJfdGlkLCB0bF9udGhyZWFkcyApKTsKKyAgICAgICAgbmV3X250aHJlYWRzID0gdGxfbnRocmVhZHM7CisgICAgfQorCisKKyAgICAvLworICAgIC8vIENoZWNrIGlmIHRoZSB0aHJlYWRzIGFycmF5IGlzIGxhcmdlIGVub3VnaCwgb3IgbmVlZHMgZXhwYW5kaW5nLgorICAgIC8vCisgICAgLy8gU2VlIGNvbW1lbnQgaW4gX19rbXBfcmVnaXN0ZXJfcm9vdCgpIGFib3V0IHRoZSBhZGp1c3RtZW50IGlmCisgICAgLy8gX19rbXBfdGhyZWFkc1swXSA9PSBOVUxMLgorICAgIC8vCisgICAgY2FwYWNpdHkgPSBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OworICAgIGlmICggVENSX1BUUihfX2ttcF90aHJlYWRzWzBdKSA9PSBOVUxMICkgeworICAgICAgICAtLWNhcGFjaXR5OworICAgIH0KKyAgICBpZiAoIF9fa21wX250aCArIG5ld19udGhyZWFkcyAtICggcm9vdC0+ci5yX2FjdGl2ZSA/IDEgOgorICAgICAgcm9vdC0+ci5yX2hvdF90ZWFtLT50LnRfbnByb2MgKSA+IGNhcGFjaXR5ICkgeworICAgICAgICAvLworICAgICAgICAvLyBFeHBhbmQgdGhlIHRocmVhZHMgYXJyYXkuCisgICAgICAgIC8vCisgICAgICAgIGludCBzbG90c1JlcXVpcmVkID0gX19rbXBfbnRoICsgbmV3X250aHJlYWRzIC0gKCByb290LT5yLnJfYWN0aXZlID8gMSA6CisgICAgICAgICAgcm9vdC0+ci5yX2hvdF90ZWFtLT50LnRfbnByb2MgKSAtIGNhcGFjaXR5OworICAgICAgICBpbnQgc2xvdHNBZGRlZCA9IF9fa21wX2V4cGFuZF90aHJlYWRzKHNsb3RzUmVxdWlyZWQsIHNsb3RzUmVxdWlyZWQpOworICAgICAgICBpZiAoIHNsb3RzQWRkZWQgPCBzbG90c1JlcXVpcmVkICkgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFRoZSB0aHJlYWRzIGFycmF5IHdhcyBub3QgZXhwYW5kZWQgZW5vdWdoLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIG5ld19udGhyZWFkcyAtPSAoIHNsb3RzUmVxdWlyZWQgLSBzbG90c0FkZGVkICk7CisgICAgICAgICAgICBLTVBfQVNTRVJUKCBuZXdfbnRocmVhZHMgPj0gMSApOworCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gSWYgZHluLXZhciBpcyBmYWxzZSwgZW1pdCBhIDEtdGltZSB3YXJuaW5nLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmICggISBnZXRfX2R5bmFtaWNfMiggcGFyZW50X3RlYW0sIG1hc3Rlcl90aWQgKQorICAgICAgICAgICAgICAmJiAoICEgX19rbXBfcmVzZXJ2ZV93YXJuICkgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfcmVzZXJ2ZV93YXJuID0gMTsKKyAgICAgICAgICAgICAgICBpZiAoIF9fa21wX3RwX2NhY2hlZCApIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAga21wX21zX3dhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50Rm9ybVRoclRlYW0sIHNldF9udGhyZWFkcywgbmV3X250aHJlYWRzICksCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfSE5UKCBTZXRfQUxMX1RIUkVBRFBSSVZBVEUsIF9fa21wX3RwX2NhcGFjaXR5ICksCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfSE5UKCBQb3NzaWJsZVN5c3RlbUxpbWl0T25UaHJlYWRzICksCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAga21wX21zX3dhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50Rm9ybVRoclRlYW0sIHNldF9udGhyZWFkcywgbmV3X250aHJlYWRzICksCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfSE5UKCBTeXN0ZW1MaW1pdE9uVGhyZWFkcyApLAorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIG5ld19udGhyZWFkcyA9PSAxICkgeworICAgICAgICBLQ19UUkFDRSggMTAsICggIl9fa21wX3Jlc2VydmVfdGhyZWFkczogVCMlZCBzZXJpYWxpemluZyB0ZWFtIGFmdGVyIHJlY2xhaW1pbmcgZGVhZCByb290cyBhbmQgcmVjaGVja2luZzsgcmVxdWVzdGVkICVkIHRocmVhZHNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9nZXRfZ3RpZCgpLCBzZXRfbnRocmVhZHMgKSApOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBLQ19UUkFDRSggMTAsICggIl9fa21wX3Jlc2VydmVfdGhyZWFkczogVCMlZCBhbGxvY2F0aW5nICVkIHRocmVhZHM7IHJlcXVlc3RlZCAlZCB0aHJlYWRzXG4iLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9nZXRfZ3RpZCgpLCBuZXdfbnRocmVhZHMsIHNldF9udGhyZWFkcyApKTsKKyAgICByZXR1cm4gbmV3X250aHJlYWRzOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBhbGxvY2F0ZSB0aHJlYWRzIGZyb20gdGhlIHRocmVhZCBwb29sIGFuZCBhc3NpZ24gdGhlbSB0byB0aGUgbmV3IHRlYW0gKi8KKy8qIHdlIGFyZSBhc3N1cmVkIHRoYXQgdGhlcmUgYXJlIGVub3VnaCB0aHJlYWRzIGF2YWlsYWJsZSwgYmVjYXVzZSB3ZQorICogY2hlY2tlZCBvbiB0aGF0IGVhcmxpZXIgd2l0aGluIGNyaXRpY2FsIHNlY3Rpb24gZm9ya2pvaW4gKi8KKworc3RhdGljIHZvaWQKK19fa21wX2ZvcmtfdGVhbV90aHJlYWRzKCBrbXBfcm9vdF90ICpyb290LCBrbXBfdGVhbV90ICp0ZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbmZvX3QgKm1hc3Rlcl90aCwgaW50IG1hc3Rlcl9ndGlkICkKK3sKKyAgICBpbnQgICAgICAgICBpOworICAgIGludCB1c2VfaG90X3RlYW07CisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfZm9ya190ZWFtX3RocmVhZHM6IG5ld19ucHJvY3MgPSAlZFxuIiwgdGVhbS0+dC50X25wcm9jICkgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBtYXN0ZXJfZ3RpZCA9PSBfX2ttcF9nZXRfZ3RpZCgpICk7CisgICAgS01QX01CKCk7CisKKyAgICAvKiBmaXJzdCwgbGV0J3Mgc2V0dXAgdGhlIG1hc3RlciB0aHJlYWQgKi8KKyAgICBtYXN0ZXJfdGgtPnRoLnRoX2luZm8uZHMuZHNfdGlkICA9IDA7CisgICAgbWFzdGVyX3RoLT50aC50aF90ZWFtICAgICAgICAgICAgPSB0ZWFtOworICAgIG1hc3Rlcl90aC0+dGgudGhfdGVhbV9ucHJvYyAgICAgID0gdGVhbS0+dC50X25wcm9jOworICAgIG1hc3Rlcl90aC0+dGgudGhfdGVhbV9tYXN0ZXIgICAgID0gbWFzdGVyX3RoOworICAgIG1hc3Rlcl90aC0+dGgudGhfdGVhbV9zZXJpYWxpemVkID0gRkFMU0U7CisgICAgbWFzdGVyX3RoLT50aC50aF9kaXNwYXRjaCAgICAgICAgPSAmIHRlYW0tPnQudF9kaXNwYXRjaFsgMCBdOworCisgICAgLyogbWFrZSBzdXJlIHdlIGFyZSBub3QgdGhlIG9wdGltaXplZCBob3QgdGVhbSAqLworI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCisgICAgdXNlX2hvdF90ZWFtID0gMDsKKyAgICBrbXBfaG90X3RlYW1fcHRyX3QgKmhvdF90ZWFtcyA9IG1hc3Rlcl90aC0+dGgudGhfaG90X3RlYW1zOworICAgIGlmKCBob3RfdGVhbXMgKSB7ICAvLyBob3QgdGVhbXMgYXJyYXkgaXMgbm90IGFsbG9jYXRlZCBpZiBLTVBfSE9UX1RFQU1TX01BWF9MRVZFTD0wCisgICAgICAgIGludCBsZXZlbCA9IHRlYW0tPnQudF9hY3RpdmVfbGV2ZWwgLSAxOyAgICAvLyBpbmRleCBpbiBhcnJheSBvZiBob3QgdGVhbXMKKyAgICAgICAgaWYoIG1hc3Rlcl90aC0+dGgudGhfdGVhbXNfbWljcm90YXNrICkgeyAgICAvLyBhcmUgd2UgaW5zaWRlIHRoZSB0ZWFtcz8KKyAgICAgICAgICAgIGlmKCBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX3NpemUubnRlYW1zID4gMSApIHsKKyAgICAgICAgICAgICAgICArK2xldmVsOyAvLyBsZXZlbCB3YXMgbm90IGluY3JlYXNlZCBpbiB0ZWFtcyBjb25zdHJ1Y3QgZm9yIHRlYW1fb2ZfbWFzdGVycworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIHRlYW0tPnQudF9wa2ZuICE9IChtaWNyb3Rhc2tfdClfX2ttcF90ZWFtc19tYXN0ZXIgJiYKKyAgICAgICAgICAgICAgICBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX2xldmVsID09IHRlYW0tPnQudF9sZXZlbCApIHsKKyAgICAgICAgICAgICAgICArK2xldmVsOyAvLyBsZXZlbCB3YXMgbm90IGluY3JlYXNlZCBpbiB0ZWFtcyBjb25zdHJ1Y3QgZm9yIHRlYW1fb2Zfd29ya2VycyBiZWZvcmUgdGhlIHBhcmFsbGVsCisgICAgICAgICAgICB9ICAgICAgICAgICAgLy8gdGVhbS0+dC50X2xldmVsIHdpbGwgYmUgaW5jcmVhc2VkIGluc2lkZSBwYXJhbGxlbAorICAgICAgICB9CisgICAgICAgIGlmKCBsZXZlbCA8IF9fa21wX2hvdF90ZWFtc19tYXhfbGV2ZWwgKSB7CisgICAgICAgICAgICBpZiggaG90X3RlYW1zW2xldmVsXS5ob3RfdGVhbSApIHsKKyAgICAgICAgICAgICAgICAvLyBob3QgdGVhbSBoYXMgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBmb3IgZ2l2ZW4gbGV2ZWwKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGhvdF90ZWFtc1tsZXZlbF0uaG90X3RlYW0gPT0gdGVhbSk7CisgICAgICAgICAgICAgICAgdXNlX2hvdF90ZWFtID0gMTsgLy8gdGhlIHRlYW0gaXMgcmVhZHkgdG8gdXNlCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHVzZV9ob3RfdGVhbSA9IDA7IC8vIEFDOiB0aHJlYWRzIGFyZSBub3QgYWxsb2NhdGVkIHlldAorICAgICAgICAgICAgICAgIGhvdF90ZWFtc1tsZXZlbF0uaG90X3RlYW0gPSB0ZWFtOyAvLyByZW1lbWJlciBuZXcgaG90IHRlYW0KKyAgICAgICAgICAgICAgICBob3RfdGVhbXNbbGV2ZWxdLmhvdF90ZWFtX250aCA9IHRlYW0tPnQudF9ucHJvYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVzZV9ob3RfdGVhbSA9IDA7CisgICAgICAgIH0KKyAgICB9CisjZWxzZQorICAgIHVzZV9ob3RfdGVhbSA9IHRlYW0gPT0gcm9vdC0+ci5yX2hvdF90ZWFtOworI2VuZGlmCisgICAgaWYgKCAhdXNlX2hvdF90ZWFtICkgeworCisgICAgICAgIC8qIGluc3RhbGwgdGhlIG1hc3RlciB0aHJlYWQgKi8KKyAgICAgICAgdGVhbS0+dC50X3RocmVhZHNbIDAgXSAgICA9IG1hc3Rlcl90aDsKKyAgICAgICAgX19rbXBfaW5pdGlhbGl6ZV9pbmZvKCBtYXN0ZXJfdGgsIHRlYW0sIDAsIG1hc3Rlcl9ndGlkICk7CisKKyAgICAgICAgLyogbm93LCBpbnN0YWxsIHRoZSB3b3JrZXIgdGhyZWFkcyAqLworICAgICAgICBmb3IgKCBpPTEgOyAgaSA8IHRlYW0tPnQudF9ucHJvYyA7IGkrKyApIHsKKworICAgICAgICAgICAgLyogZm9yayBvciByZWFsbG9jYXRlIGEgbmV3IHRocmVhZCBhbmQgaW5zdGFsbCBpdCBpbiB0ZWFtICovCisgICAgICAgICAgICBrbXBfaW5mb190ICp0aHIgPSBfX2ttcF9hbGxvY2F0ZV90aHJlYWQoIHJvb3QsIHRlYW0sIGkgKTsKKyAgICAgICAgICAgIHRlYW0tPnQudF90aHJlYWRzWyBpIF0gPSB0aHI7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0aHIgKTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoci0+dGgudGhfdGVhbSA9PSB0ZWFtICk7CisgICAgICAgICAgICAvKiBhbGlnbiB0ZWFtIGFuZCB0aHJlYWQgYXJyaXZlZCBzdGF0ZXMgKi8KKyAgICAgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9mb3JrX3RlYW1fdGhyZWFkczogVCMlZCglZDolZCkgaW5pdCBhcnJpdmVkIFQjJWQoJWQ6JWQpIGpvaW4gPSVsbHUsIHBsYWluPSVsbHVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RpZCggMCwgdGVhbSApLCB0ZWFtLT50LnRfaWQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RpZCggaSwgdGVhbSApLCB0ZWFtLT50LnRfaWQsIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2JhclsgYnNfZm9ya2pvaW5fYmFycmllciBdLmJfYXJyaXZlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfYmFyWyBic19wbGFpbl9iYXJyaWVyIF0uYl9hcnJpdmVkICkgKTsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgdGhyLT50aC50aF90ZWFtc19taWNyb3Rhc2sgPSBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX21pY3JvdGFzazsKKyAgICAgICAgICAgIHRoci0+dGgudGhfdGVhbXNfbGV2ZWwgICAgID0gbWFzdGVyX3RoLT50aC50aF90ZWFtc19sZXZlbDsKKyAgICAgICAgICAgIHRoci0+dGgudGhfdGVhbXNfc2l6ZSAgICAgID0gbWFzdGVyX3RoLT50aC50aF90ZWFtc19zaXplOworI2VuZGlmCisgICAgICAgICAgICB7IC8vIEluaXRpYWxpemUgdGhyZWFkcycgYmFycmllciBkYXRhLgorICAgICAgICAgICAgICAgIGludCBiOworICAgICAgICAgICAgICAgIGttcF9iYWxpZ25fdCAqIGJhbGlnbiA9IHRlYW0tPnQudF90aHJlYWRzWyBpIF0tPnRoLnRoX2JhcjsKKyAgICAgICAgICAgICAgICBmb3IgKCBiID0gMDsgYiA8IGJzX2xhc3RfYmFycmllcjsgKysgYiApIHsKKyAgICAgICAgICAgICAgICAgICAgYmFsaWduWyBiIF0uYmIuYl9hcnJpdmVkICAgICAgICA9IHRlYW0tPnQudF9iYXJbIGIgXS5iX2Fycml2ZWQ7CisgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoYmFsaWduW2JdLmJiLndhaXRfZmxhZyAhPSBLTVBfQkFSUklFUl9QQVJFTlRfRkxBRyk7CisjaWYgVVNFX0RFQlVHR0VSCisgICAgICAgICAgICAgICAgICAgIGJhbGlnblsgYiBdLmJiLmJfd29ya2VyX2Fycml2ZWQgPSB0ZWFtLT50LnRfYmFyWyBiIF0uYl90ZWFtX2Fycml2ZWQ7CisjZW5kaWYKKyAgICAgICAgICAgICAgICB9OyAvLyBmb3IgYgorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyNpZiBPTVBfNDBfRU5BQkxFRCAmJiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIF9fa21wX3BhcnRpdGlvbl9wbGFjZXMoIHRlYW0gKTsKKyNlbmRpZgorCisgICAgfQorCisgICAgS01QX01CKCk7Cit9CisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisvLworLy8gUHJvcGFnYXRlIGFueSBjaGFuZ2VzIHRvIHRoZSBmbG9hdGluZyBwb2ludCBjb250cm9sIHJlZ2lzdGVycyBvdXQgdG8gdGhlIHRlYW0KKy8vIFdlIHRyeSB0byBhdm9pZCB1bm5lY2Vzc2FyeSB3cml0ZXMgdG8gdGhlIHJlbGV2YW50IGNhY2hlIGxpbmUgaW4gdGhlIHRlYW0gc3RydWN0dXJlLAorLy8gc28gd2UgZG9uJ3QgbWFrZSBjaGFuZ2VzIHVubGVzcyB0aGV5IGFyZSBuZWVkZWQuCisvLworaW5saW5lIHN0YXRpYyB2b2lkCitwcm9wYWdhdGVGUENvbnRyb2woa21wX3RlYW1fdCAqIHRlYW0pCit7CisgICAgaWYgKCBfX2ttcF9pbmhlcml0X2ZwX2NvbnRyb2wgKSB7CisgICAgICAgIGttcF9pbnQxNiB4ODdfZnB1X2NvbnRyb2xfd29yZDsKKyAgICAgICAga21wX3VpbnQzMiBteGNzcjsKKworICAgICAgICAvLyBHZXQgbWFzdGVyIHZhbHVlcyBvZiBGUFUgY29udHJvbCBmbGFncyAoYm90aCBYODcgYW5kIHZlY3RvcikKKyAgICAgICAgX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQoICZ4ODdfZnB1X2NvbnRyb2xfd29yZCApOworICAgICAgICBfX2ttcF9zdG9yZV9teGNzciggJm14Y3NyICk7CisgICAgICAgIG14Y3NyICY9IEtNUF9YODZfTVhDU1JfTUFTSzsKKworICAgICAgICAvLyBUaGVyZSBpcyBubyBwb2ludCBsb29raW5nIGF0IHRfZnBfY29udHJvbF9zYXZlZCBoZXJlLgorICAgICAgICAvLyBJZiBpdCBpcyBUUlVFLCB3ZSBzdGlsbCBoYXZlIHRvIHVwZGF0ZSB0aGUgdmFsdWVzIGlmIHRoZXkgYXJlIGRpZmZlcmVudCBmcm9tIHRob3NlIHdlIG5vdyBoYXZlLgorICAgICAgICAvLyBJZiBpdCBpcyBGQUxTRSB3ZSBkaWRuJ3Qgc2F2ZSBhbnl0aGluZyB5ZXQsIGJ1dCBvdXIgb2JqZWN0aXZlIGlzIHRoZSBzYW1lLiBXZSBoYXZlIHRvIGVuc3VyZQorICAgICAgICAvLyB0aGF0IHRoZSB2YWx1ZXMgaW4gdGhlIHRlYW0gYXJlIHRoZSBzYW1lIGFzIHRob3NlIHdlIGhhdmUuCisgICAgICAgIC8vIFNvLCB0aGlzIGNvZGUgYWNoaWV2ZXMgd2hhdCB3ZSBuZWVkIHdoZXRoZXIgb3Igbm90IHRfZnBfY29udHJvbF9zYXZlZCBpcyB0cnVlLgorICAgICAgICAvLyBCeSBjaGVja2luZyB3aGV0aGVyIHRoZSB2YWx1ZSBuZWVkcyB1cGRhdGluZyB3ZSBhdm9pZCB1bm5lY2Vzc2FyeSB3cml0ZXMgdGhhdCB3b3VsZCBwdXQgdGhlCisgICAgICAgIC8vIGNhY2hlLWxpbmUgaW50byBhIHdyaXR0ZW4gc3RhdGUsIGNhdXNpbmcgYWxsIHRocmVhZHMgaW4gdGhlIHRlYW0gdG8gaGF2ZSB0byByZWFkIGl0IGFnYWluLgorICAgICAgICBpZiAoIHRlYW0tPnQudF94ODdfZnB1X2NvbnRyb2xfd29yZCAhPSB4ODdfZnB1X2NvbnRyb2xfd29yZCApIHsKKyAgICAgICAgICAgIHRlYW0tPnQudF94ODdfZnB1X2NvbnRyb2xfd29yZCA9IHg4N19mcHVfY29udHJvbF93b3JkOworICAgICAgICB9CisgICAgICAgIGlmICggdGVhbS0+dC50X214Y3NyICE9IG14Y3NyICkgeworICAgICAgICAgICAgdGVhbS0+dC50X214Y3NyID0gbXhjc3I7CisgICAgICAgIH0KKyAgICAgICAgLy8gQWx0aG91Z2ggd2UgZG9uJ3QgdXNlIHRoaXMgdmFsdWUsIG90aGVyIGNvZGUgaW4gdGhlIHJ1bnRpbWUgd2FudHMgdG8ga25vdyB3aGV0aGVyIGl0IHNob3VsZCByZXN0b3JlIHRoZW0uCisgICAgICAgIC8vIFNvIHdlIG11c3QgZW5zdXJlIGl0IGlzIGNvcnJlY3QuCisgICAgICAgIGlmICghdGVhbS0+dC50X2ZwX2NvbnRyb2xfc2F2ZWQpIHsKKyAgICAgICAgICAgIHRlYW0tPnQudF9mcF9jb250cm9sX3NhdmVkID0gVFJVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLy8gU2ltaWxhcmx5IGhlcmUuIERvbid0IHdyaXRlIHRvIHRoaXMgY2FjaGUtbGluZSBpbiB0aGUgdGVhbSBzdHJ1Y3R1cmUgdW5sZXNzIHdlIGhhdmUgdG8uCisgICAgICAgIGlmICh0ZWFtLT50LnRfZnBfY29udHJvbF9zYXZlZCkKKyAgICAgICAgICAgIHRlYW0tPnQudF9mcF9jb250cm9sX3NhdmVkID0gRkFMU0U7CisgICAgfQorfQorCisvLyBEbyB0aGUgb3Bwb3NpdGUsIHNldHRpbmcgdGhlIGhhcmR3YXJlIHJlZ2lzdGVycyB0byB0aGUgdXBkYXRlZCB2YWx1ZXMgZnJvbSB0aGUgdGVhbS4KK2lubGluZSBzdGF0aWMgdm9pZAordXBkYXRlSFdGUENvbnRyb2woa21wX3RlYW1fdCAqIHRlYW0pCit7CisgICAgaWYgKCBfX2ttcF9pbmhlcml0X2ZwX2NvbnRyb2wgJiYgdGVhbS0+dC50X2ZwX2NvbnRyb2xfc2F2ZWQgKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIE9ubHkgcmVzZXQgdGhlIGZwIGNvbnRyb2wgcmVncyBpZiB0aGV5IGhhdmUgYmVlbiBjaGFuZ2VkIGluIHRoZSB0ZWFtLgorICAgICAgICAvLyB0aGUgcGFyYWxsZWwgcmVnaW9uIHRoYXQgd2UgYXJlIGV4aXRpbmcuCisgICAgICAgIC8vCisgICAgICAgIGttcF9pbnQxNiB4ODdfZnB1X2NvbnRyb2xfd29yZDsKKyAgICAgICAga21wX3VpbnQzMiBteGNzcjsKKyAgICAgICAgX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQoICZ4ODdfZnB1X2NvbnRyb2xfd29yZCApOworICAgICAgICBfX2ttcF9zdG9yZV9teGNzciggJm14Y3NyICk7CisgICAgICAgIG14Y3NyICY9IEtNUF9YODZfTVhDU1JfTUFTSzsKKworICAgICAgICBpZiAoIHRlYW0tPnQudF94ODdfZnB1X2NvbnRyb2xfd29yZCAhPSB4ODdfZnB1X2NvbnRyb2xfd29yZCApIHsKKyAgICAgICAgICAgIF9fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQoKTsKKyAgICAgICAgICAgIF9fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQoICZ0ZWFtLT50LnRfeDg3X2ZwdV9jb250cm9sX3dvcmQgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggdGVhbS0+dC50X214Y3NyICE9IG14Y3NyICkgeworICAgICAgICAgICAgX19rbXBfbG9hZF9teGNzciggJnRlYW0tPnQudF9teGNzciApOworICAgICAgICB9CisgICAgfQorfQorI2Vsc2UKKyMgZGVmaW5lIHByb3BhZ2F0ZUZQQ29udHJvbCh4KSAoKHZvaWQpMCkKKyMgZGVmaW5lIHVwZGF0ZUhXRlBDb250cm9sKHgpICAoKHZvaWQpMCkKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKK3N0YXRpYyB2b2lkCitfX2ttcF9hbGxvY19hcmd2X2VudHJpZXMoIGludCBhcmdjLCBrbXBfdGVhbV90ICp0ZWFtLCBpbnQgcmVhbGxvYyApOyAvLyBmb3J3YXJkIGRlY2xhcmF0aW9uCisKKy8qCisgKiBSdW4gYSBwYXJhbGxlbCByZWdpb24gdGhhdCBoYXMgYmVlbiBzZXJpYWxpemVkLCBzbyBydW5zIG9ubHkgaW4gYSB0ZWFtIG9mIHRoZSBzaW5nbGUgbWFzdGVyIHRocmVhZC4KKyAqLwordm9pZAorX19rbXBfc2VyaWFsaXplZF9wYXJhbGxlbChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkKQoreworICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyOworICAgIGttcF90ZWFtX3QgKnNlcmlhbF90ZWFtOworCisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19zZXJpYWxpemVkX3BhcmFsbGVsOiBjYWxsZWQgYnkgVCMlZFxuIiwgZ2xvYmFsX3RpZCApICk7CisKKyAgICAvKiBTa2lwIGFsbCB0aGlzIGNvZGUgZm9yIGF1dG9wYXIgc2VyaWFsaXplZCBsb29wcyBzaW5jZSBpdCByZXN1bHRzIGluCisgICAgICAgdW5hY2NlcHRhYmxlIG92ZXJoZWFkICovCisgICAgaWYoIGxvYyAhPSBOVUxMICYmIChsb2MtPmZsYWdzICYgS01QX0lERU5UX0FVVE9QQVIgKSApCisgICAgICAgIHJldHVybjsKKworICAgIGlmKCAhIFRDUl80KCBfX2ttcF9pbml0X3BhcmFsbGVsICkgKQorICAgICAgICBfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplKCk7CisKKyAgICB0aGlzX3RociAgICAgPSBfX2ttcF90aHJlYWRzWyBnbG9iYWxfdGlkIF07CisgICAgc2VyaWFsX3RlYW0gID0gdGhpc190aHItPnRoLnRoX3NlcmlhbF90ZWFtOworCisgICAgLyogdXRpbGl6ZSB0aGUgc2VyaWFsaXplZCB0ZWFtIGhlbGQgYnkgdGhpcyB0aHJlYWQgKi8KKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzZXJpYWxfdGVhbSApOworICAgIEtNUF9NQigpOworCisgICAgaWYgKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0aGlzX3Roci0+dGgudGhfdGFza190ZWFtID09IHRoaXNfdGhyLT50aC50aF90ZWFtLT50LnRfdGFza190ZWFtW3RoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlXSk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHNlcmlhbF90ZWFtLT50LnRfdGFza190ZWFtW3RoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlXSA9PSBOVUxMICk7CisgICAgICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWw6IFQjJWQgcHVzaGluZyB0YXNrX3RlYW0gJXAgLyB0ZWFtICVwLCBuZXcgdGFza190ZWFtID0gTlVMTFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF90aWQsIHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW0sIHRoaXNfdGhyLT50aC50aF90ZWFtICkgKTsKKyAgICAgICAgdGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSA9IE5VTEw7CisgICAgfQorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBrbXBfcHJvY19iaW5kX3QgcHJvY19iaW5kID0gdGhpc190aHItPnRoLnRoX3NldF9wcm9jX2JpbmQ7CisgICAgaWYgKCB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLnByb2NfYmluZCA9PSBwcm9jX2JpbmRfZmFsc2UgKSB7CisgICAgICAgIHByb2NfYmluZCA9IHByb2NfYmluZF9mYWxzZTsKKyAgICB9CisgICAgZWxzZSBpZiAoIHByb2NfYmluZCA9PSBwcm9jX2JpbmRfZGVmYXVsdCApIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gTm8gcHJvY19iaW5kIGNsYXVzZSB3YXMgc3BlY2lmaWVkLCBzbyB1c2UgdGhlIGN1cnJlbnQgdmFsdWUKKyAgICAgICAgLy8gb2YgcHJvYy1iaW5kLXZhciBmb3IgdGhpcyBwYXJhbGxlbCByZWdpb24uCisgICAgICAgIC8vCisgICAgICAgIHByb2NfYmluZCA9IHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMucHJvY19iaW5kOworICAgIH0KKyAgICAvLworICAgIC8vIFJlc2V0IGZvciBuZXh0IHBhcmFsbGVsIHJlZ2lvbgorICAgIC8vCisgICAgdGhpc190aHItPnRoLnRoX3NldF9wcm9jX2JpbmQgPSBwcm9jX2JpbmRfZGVmYXVsdDsKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisgICAgaWYoIHRoaXNfdGhyLT50aC50aF90ZWFtICE9IHNlcmlhbF90ZWFtICkgeworICAgICAgICAvLyBOZXN0ZWQgbGV2ZWwgd2lsbCBiZSBhbiBpbmRleCBpbiB0aGUgbmVzdGVkIG50aHJlYWRzIGFycmF5CisgICAgICAgIGludCBsZXZlbCA9IHRoaXNfdGhyLT50aC50aF90ZWFtLT50LnRfbGV2ZWw7CisKKyAgICAgICAgaWYoIHNlcmlhbF90ZWFtLT50LnRfc2VyaWFsaXplZCApIHsKKyAgICAgICAgICAgIC8qIHRoaXMgc2VyaWFsIHRlYW0gd2FzIGFscmVhZHkgdXNlZAorICAgICAgICAgICAgICogVE9ETyBpbmNyZWFzZSBwZXJmb3JtYW5jZSBieSBtYWtpbmcgdGhpcyBsb2NrcyBtb3JlIHNwZWNpZmljICovCisgICAgICAgICAgICBrbXBfdGVhbV90ICpuZXdfdGVhbTsKKworICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJl9fa21wX2Zvcmtqb2luX2xvY2sgKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9pZF90IG9tcHRfcGFyYWxsZWxfaWQgPSBfX29tcHRfcGFyYWxsZWxfaWRfbmV3KGdsb2JhbF90aWQpOworI2VuZGlmCisKKyAgICAgICAgICAgIG5ld190ZWFtID0gX19rbXBfYWxsb2NhdGVfdGVhbSh0aGlzX3Roci0+dGgudGhfcm9vdCwgMSwgMSwKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2lkLAorI2VuZGlmCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jX2JpbmQsCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCBVU0VfTkVTVEVEX0hPVF9BUkcoTlVMTCkgKTsKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7CisgICAgICAgICAgICBLTVBfQVNTRVJUKCBuZXdfdGVhbSApOworCisgICAgICAgICAgICAvKiBzZXR1cCBuZXcgc2VyaWFsaXplZCB0ZWFtIGFuZCBpbnN0YWxsIGl0ICovCisgICAgICAgICAgICBuZXdfdGVhbS0+dC50X3RocmVhZHNbMF0gPSB0aGlzX3RocjsKKyAgICAgICAgICAgIG5ld190ZWFtLT50LnRfcGFyZW50ID0gdGhpc190aHItPnRoLnRoX3RlYW07CisgICAgICAgICAgICBzZXJpYWxfdGVhbSA9IG5ld190ZWFtOworICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX3NlcmlhbF90ZWFtID0gc2VyaWFsX3RlYW07CisKKyAgICAgICAgICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWw6IFQjJWQgYWxsb2NhdGVkIG5ldyBzZXJpYWwgdGVhbSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfdGlkLCBzZXJpYWxfdGVhbSApICk7CisKKworICAgICAgICAgICAgLyogVE9ETyB0aGUgYWJvdmUgYnJlYWtzIHRoZSByZXF1aXJlbWVudCB0aGF0IGlmIHdlIHJ1biBvdXQgb2YKKyAgICAgICAgICAgICAqIHJlc291cmNlcywgdGhlbiB3ZSBjYW4gc3RpbGwgZ3VhcmFudGVlIHRoYXQgc2VyaWFsaXplZCB0ZWFtcworICAgICAgICAgICAgICogYXJlIG9rLCBzaW5jZSB3ZSBtYXkgbmVlZCB0byBhbGxvY2F0ZSBhIG5ldyBvbmUgKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWw6IFQjJWQgcmV1c2luZyBjYWNoZWQgc2VyaWFsIHRlYW0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX3RpZCwgc2VyaWFsX3RlYW0gKSApOworICAgICAgICB9CisKKyAgICAgICAgLyogd2UgaGF2ZSB0byBpbml0aWFsaXplIHRoaXMgc2VyaWFsIHRlYW0gKi8KKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggc2VyaWFsX3RlYW0tPnQudF90aHJlYWRzICk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHNlcmlhbF90ZWFtLT50LnRfdGhyZWFkc1swXSA9PSB0aGlzX3RociApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3Roci0+dGgudGhfdGVhbSAhPSBzZXJpYWxfdGVhbSApOworICAgICAgICBzZXJpYWxfdGVhbS0+dC50X2lkZW50ICAgICAgICAgPSBsb2M7CisgICAgICAgIHNlcmlhbF90ZWFtLT50LnRfc2VyaWFsaXplZCAgICA9IDE7CisgICAgICAgIHNlcmlhbF90ZWFtLT50LnRfbnByb2MgICAgICAgICA9IDE7CisgICAgICAgIHNlcmlhbF90ZWFtLT50LnRfcGFyZW50ICAgICAgICA9IHRoaXNfdGhyLT50aC50aF90ZWFtOworICAgICAgICBzZXJpYWxfdGVhbS0+dC50X3NjaGVkICAgICAgICAgPSB0aGlzX3Roci0+dGgudGhfdGVhbS0+dC50X3NjaGVkOworICAgICAgICB0aGlzX3Roci0+dGgudGhfdGVhbSAgICAgICAgICAgPSBzZXJpYWxfdGVhbTsKKyAgICAgICAgc2VyaWFsX3RlYW0tPnQudF9tYXN0ZXJfdGlkICAgID0gdGhpc190aHItPnRoLnRoX2luZm8uZHMuZHNfdGlkOworCisgICAgICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWw6IFQjZCBjdXJ0YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX3RpZCwgdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzayApICk7CisgICAgICAgIEtNUF9BU1NFUlQoIHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ZsYWdzLmV4ZWN1dGluZyA9PSAxICk7CisgICAgICAgIHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ZsYWdzLmV4ZWN1dGluZyA9IDA7CisKKyAgICAgICAgX19rbXBfcHVzaF9jdXJyZW50X3Rhc2tfdG9fdGhyZWFkKCB0aGlzX3Rociwgc2VyaWFsX3RlYW0sIDAgKTsKKworICAgICAgICAvKiBUT0RPOiBHRUg6IGRvIHRoZSBJQ1ZzIHdvcmsgZm9yIG5lc3RlZCBzZXJpYWxpemVkIHRlYW1zPyAgRG9uJ3Qgd2UgbmVlZCBhbiBpbXBsaWNpdCB0YXNrIGZvcgorICAgICAgICAgICBlYWNoIHNlcmlhbGl6ZWQgdGFzayByZXByZXNlbnRlZCBieSB0ZWFtLT50LnRfc2VyaWFsaXplZD8gKi8KKyAgICAgICAgY29weV9pY3ZzKAorICAgICAgICAgICAgICAgICAgJiB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLAorICAgICAgICAgICAgICAgICAgJiB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrLT50ZF9wYXJlbnQtPnRkX2ljdnMgKTsKKworICAgICAgICAvLyBUaHJlYWQgdmFsdWUgZXhpc3RzIGluIHRoZSBuZXN0ZWQgbnRocmVhZHMgYXJyYXkgZm9yIHRoZSBuZXh0IG5lc3RlZCBsZXZlbAorICAgICAgICBpZiAoIF9fa21wX25lc3RlZF9udGgudXNlZCAmJiAoIGxldmVsICsgMSA8IF9fa21wX25lc3RlZF9udGgudXNlZCApICkgeworICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5ucHJvYyA9IF9fa21wX25lc3RlZF9udGgubnRoWyBsZXZlbCArIDEgXTsKKyAgICAgICAgfQorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgaWYgKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLnVzZWQgJiYgKCBsZXZlbCArIDEgPCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLnVzZWQgKSApIHsKKyAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMucHJvY19iaW5kCisgICAgICAgICAgICAgICAgPSBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbIGxldmVsICsgMSBdOworICAgICAgICB9CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworI2lmIFVTRV9ERUJVR0dFUgorICAgICAgICBzZXJpYWxfdGVhbS0+dC50X3BrZm4gPSAobWljcm90YXNrX3QpKCB+MCApOyAvLyBGb3IgdGhlIGRlYnVnZ2VyLgorI2VuZGlmCisgICAgICAgIHRoaXNfdGhyLT50aC50aF9pbmZvLmRzLmRzX3RpZCA9IDA7CisKKyAgICAgICAgLyogc2V0IHRocmVhZCBjYWNoZSB2YWx1ZXMgKi8KKyAgICAgICAgdGhpc190aHItPnRoLnRoX3RlYW1fbnByb2MgICAgID0gMTsKKyAgICAgICAgdGhpc190aHItPnRoLnRoX3RlYW1fbWFzdGVyICAgID0gdGhpc190aHI7CisgICAgICAgIHRoaXNfdGhyLT50aC50aF90ZWFtX3NlcmlhbGl6ZWQgPSAxOworCisgICAgICAgIHNlcmlhbF90ZWFtLT50LnRfbGV2ZWwgICAgICAgID0gc2VyaWFsX3RlYW0tPnQudF9wYXJlbnQtPnQudF9sZXZlbCArIDE7CisgICAgICAgIHNlcmlhbF90ZWFtLT50LnRfYWN0aXZlX2xldmVsID0gc2VyaWFsX3RlYW0tPnQudF9wYXJlbnQtPnQudF9hY3RpdmVfbGV2ZWw7CisKKyAgICAgICAgcHJvcGFnYXRlRlBDb250cm9sIChzZXJpYWxfdGVhbSk7CisKKyAgICAgICAgLyogY2hlY2sgaWYgd2UgbmVlZCB0byBhbGxvY2F0ZSBkaXNwYXRjaCBidWZmZXJzIHN0YWNrICovCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoc2VyaWFsX3RlYW0tPnQudF9kaXNwYXRjaCk7CisgICAgICAgIGlmICggIXNlcmlhbF90ZWFtLT50LnRfZGlzcGF0Y2gtPnRoX2Rpc3BfYnVmZmVyICkgeworICAgICAgICAgICAgc2VyaWFsX3RlYW0tPnQudF9kaXNwYXRjaC0+dGhfZGlzcF9idWZmZXIgPSAoZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3QgKikKKyAgICAgICAgICAgICAgICBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKCBkaXNwYXRjaF9wcml2YXRlX2luZm9fdCApICk7CisgICAgICAgIH0KKyAgICAgICAgdGhpc190aHItPnRoLnRoX2Rpc3BhdGNoID0gc2VyaWFsX3RlYW0tPnQudF9kaXNwYXRjaDsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICBvbXB0X3BhcmFsbGVsX2lkX3Qgb21wdF9wYXJhbGxlbF9pZCA9IF9fb21wdF9wYXJhbGxlbF9pZF9uZXcoZ2xvYmFsX3RpZCk7CisgICAgICAgIF9fb21wdF90ZWFtX2Fzc2lnbl9pZChzZXJpYWxfdGVhbSwgb21wdF9wYXJhbGxlbF9pZCk7CisjZW5kaWYKKworICAgICAgICBLTVBfTUIoKTsKKworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIHRoaXMgc2VyaWFsaXplZCB0ZWFtIGlzIGFscmVhZHkgYmVpbmcgdXNlZCwKKyAgICAgICAgICogdGhhdCdzIGZpbmUsIGp1c3QgYWRkIGFub3RoZXIgbmVzdGVkIGxldmVsICovCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoaXNfdGhyLT50aC50aF90ZWFtID09IHNlcmlhbF90ZWFtICk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHNlcmlhbF90ZWFtLT50LnRfdGhyZWFkcyApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBzZXJpYWxfdGVhbS0+dC50X3RocmVhZHNbMF0gPT0gdGhpc190aHIgKTsKKyAgICAgICAgKysgc2VyaWFsX3RlYW0tPnQudF9zZXJpYWxpemVkOworICAgICAgICB0aGlzX3Roci0+dGgudGhfdGVhbV9zZXJpYWxpemVkID0gc2VyaWFsX3RlYW0tPnQudF9zZXJpYWxpemVkOworCisgICAgICAgIC8vIE5lc3RlZCBsZXZlbCB3aWxsIGJlIGFuIGluZGV4IGluIHRoZSBuZXN0ZWQgbnRocmVhZHMgYXJyYXkKKyAgICAgICAgaW50IGxldmVsID0gdGhpc190aHItPnRoLnRoX3RlYW0tPnQudF9sZXZlbDsKKyAgICAgICAgLy8gVGhyZWFkIHZhbHVlIGV4aXN0cyBpbiB0aGUgbmVzdGVkIG50aHJlYWRzIGFycmF5IGZvciB0aGUgbmV4dCBuZXN0ZWQgbGV2ZWwKKyAgICAgICAgaWYgKCBfX2ttcF9uZXN0ZWRfbnRoLnVzZWQgJiYgKCBsZXZlbCArIDEgPCBfX2ttcF9uZXN0ZWRfbnRoLnVzZWQgKSApIHsKKyAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMubnByb2MgPSBfX2ttcF9uZXN0ZWRfbnRoLm50aFsgbGV2ZWwgKyAxIF07CisgICAgICAgIH0KKyAgICAgICAgc2VyaWFsX3RlYW0tPnQudF9sZXZlbCsrOworICAgICAgICBLRl9UUkFDRSggMTAsICggIl9fa21wY19zZXJpYWxpemVkX3BhcmFsbGVsOiBUIyVkIGluY3JlYXNpbmcgbmVzdGluZyBsZXZlbCBvZiBzZXJpYWwgdGVhbSAlcCB0byAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF90aWQsIHNlcmlhbF90ZWFtLCBzZXJpYWxfdGVhbS0+dC50X2xldmVsICkgKTsKKworICAgICAgICAvKiBhbGxvY2F0ZS9wdXNoIGRpc3BhdGNoIGJ1ZmZlcnMgc3RhY2sgKi8KKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChzZXJpYWxfdGVhbS0+dC50X2Rpc3BhdGNoKTsKKyAgICAgICAgeworICAgICAgICAgICAgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3QgKiBkaXNwX2J1ZmZlciA9IChkaXNwYXRjaF9wcml2YXRlX2luZm9fdCAqKQorICAgICAgICAgICAgICAgIF9fa21wX2FsbG9jYXRlKCBzaXplb2YoIGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ICkgKTsKKyAgICAgICAgICAgIGRpc3BfYnVmZmVyLT5uZXh0ID0gc2VyaWFsX3RlYW0tPnQudF9kaXNwYXRjaC0+dGhfZGlzcF9idWZmZXI7CisgICAgICAgICAgICBzZXJpYWxfdGVhbS0+dC50X2Rpc3BhdGNoLT50aF9kaXNwX2J1ZmZlciA9IGRpc3BfYnVmZmVyOworICAgICAgICB9CisgICAgICAgIHRoaXNfdGhyLT50aC50aF9kaXNwYXRjaCA9IHNlcmlhbF90ZWFtLT50LnRfZGlzcGF0Y2g7CisKKyAgICAgICAgS01QX01CKCk7CisgICAgfQorCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wdXNoX3BhcmFsbGVsKCBnbG9iYWxfdGlkLCBOVUxMICk7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgLy8gTWFyayB0aGUgc3RhcnQgb2YgdGhlICJwYXJhbGxlbCIgcmVnaW9uIGZvciBWVHVuZS4gT25seSB1c2Ugb25lIG9mIGZyYW1lIG5vdGlmaWNhdGlvbiBzY2hlbWUgYXQgdGhlIG1vbWVudAorICAgIGlmICggc2VyaWFsX3RlYW0tPnQudF9sZXZlbCA9PSAxCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgJiYgdGhpc190aHItPnRoLnRoX3RlYW1zX21pY3JvdGFzayA9PSBOVUxMCisjZW5kaWYKKyAgICApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgICAgICAvLyBTYXZlIHRoZSBzdGFydCBvZiB0aGUgInBhcmFsbGVsIiByZWdpb24gZm9yIFZUdW5lLiBUaGlzIGlzIHRoZSBmcmFtZSBiZWdpbiBhdCB0aGUgc2FtZSB0aW1lLgorICAgICAgICBpZiAoICggX19pdHRfZ2V0X3RpbWVzdGFtcF9wdHIgfHwgS01QX0lUVF9ERUJVRyApICYmCisgICAgICAgICAgICAoIF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDMgfHwgX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMSApICkKKyAgICAgICAgeworICAgICAgICAgICAgIHNlcmlhbF90ZWFtLT50LnRfcmVnaW9uX3RpbWUgPSB0aGlzX3Roci0+dGgudGhfZnJhbWVfdGltZV9zZXJpYWxpemVkID0gX19pdHRfZ2V0X3RpbWVzdGFtcCgpOworICAgICAgICB9IGVsc2UgLy8gb25seSBvbmUgbm90aWZpY2F0aW9uIHNjaGVtZSAoZWl0aGVyICJzdWJtaXQiIG9yICJmb3JraW5nL2pvaW5lZCIsIG5vdCBib3RoKQorI2VuZGlmCisgICAgICAgIGlmICggKCBfX2l0dF9mcmFtZV9iZWdpbl92M19wdHIgfHwgS01QX0lUVF9ERUJVRyApICYmCisgICAgICAgICAgICAgX19rbXBfZm9ya2pvaW5fZnJhbWVzICYmICEgX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfaWRlbnQgPSBsb2M7CisgICAgICAgICAgICAvLyAwIC0gbm8gYmFycmllcnM7IDEgLSBzZXJpYWxpemVkIHBhcmFsbGVsCisgICAgICAgICAgICBfX2ttcF9pdHRfcmVnaW9uX2ZvcmtpbmcoIGdsb2JhbF90aWQsIHRoaXNfdGhyLT50aC50aF90ZWFtX25wcm9jLCAwLCAxICk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworfQorCisvKiBtb3N0IG9mIHRoZSB3b3JrIGZvciBhIGZvcmsgKi8KKy8qIHJldHVybiB0cnVlIGlmIHdlIHJlYWxseSB3ZW50IHBhcmFsbGVsLCBmYWxzZSBpZiBzZXJpYWxpemVkICovCitpbnQKK19fa21wX2ZvcmtfY2FsbCgKKyAgICBpZGVudF90ICAgKiBsb2MsCisgICAgaW50ICAgICAgICAgZ3RpZCwKKyAgICBlbnVtIGZvcmtfY29udGV4dF9lICBjYWxsX2NvbnRleHQsIC8vIEludGVsLCBHTlUsIC4uLgorICAgIGttcF9pbnQzMiAgIGFyZ2MsCisjaWYgT01QVF9TVVBQT1JUCisgICAgdm9pZCAgICAgICAqdW53cmFwcGVkX3Rhc2ssCisjZW5kaWYKKyAgICBtaWNyb3Rhc2tfdCBtaWNyb3Rhc2ssCisgICAgbGF1bmNoX3QgICAgaW52b2tlciwKKy8qIFRPRE86IHJldmVydCB3b3JrYXJvdW5kIGZvciBJbnRlbChSKSA2NCB0cmFja2VyICM5NiAqLworI2lmIChLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpICYmIEtNUF9PU19MSU5VWAorICAgIHZhX2xpc3QgICAqIGFwCisjZWxzZQorICAgIHZhX2xpc3QgICAgIGFwCisjZW5kaWYKKyAgICApCit7CisgICAgdm9pZCAgICAgICAgICAqKmFyZ3Y7CisgICAgaW50ICAgICAgICAgICAgIGk7CisgICAgaW50ICAgICAgICAgICAgIG1hc3Rlcl90aWQ7CisgICAgaW50ICAgICAgICAgICAgIG1hc3Rlcl90aGlzX2NvbnM7CisgICAga21wX3RlYW1fdCAgICAgKnRlYW07CisgICAga21wX3RlYW1fdCAgICAgKnBhcmVudF90ZWFtOworICAgIGttcF9pbmZvX3QgICAgICptYXN0ZXJfdGg7CisgICAga21wX3Jvb3RfdCAgICAgKnJvb3Q7CisgICAgaW50ICAgICAgICAgICAgIG50aHJlYWRzOworICAgIGludCAgICAgICAgICAgICBtYXN0ZXJfYWN0aXZlOworICAgIGludCAgICAgICAgICAgICBtYXN0ZXJfc2V0X251bXRocmVhZHM7CisgICAgaW50ICAgICAgICAgICAgIGxldmVsOworI2lmIE9NUF80MF9FTkFCTEVECisgICAgaW50ICAgICAgICAgICAgIGFjdGl2ZV9sZXZlbDsKKyAgICBpbnQgICAgICAgICAgICAgdGVhbXNfbGV2ZWw7CisjZW5kaWYKKyNpZiBLTVBfTkVTVEVEX0hPVF9URUFNUworICAgIGttcF9ob3RfdGVhbV9wdHJfdCAqKnBfaG90X3RlYW1zOworI2VuZGlmCisgICAgeyAvLyBLTVBfVElNRV9CTE9DSworICAgIEtNUF9USU1FX0RFVkVMT1BFUl9CTE9DSyhLTVBfZm9ya19jYWxsKTsKKyAgICBLTVBfQ09VTlRfVkFMVUUoT01QX1BBUkFMTEVMX2FyZ3MsIGFyZ2MpOworCisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2ZvcmtfY2FsbDogZW50ZXIgVCMlZFxuIiwgZ3RpZCApKTsKKyAgICBpZiAoIF9fa21wX3N0a3BhZGRpbmcgPiAwICYmICBfX2ttcF9yb290W2d0aWRdICE9IE5VTEwgKSB7CisgICAgICAgIC8qIFNvbWUgc3lzdGVtcyBwcmVmZXIgdGhlIHN0YWNrIGZvciB0aGUgcm9vdCB0aHJlYWQocykgdG8gc3RhcnQgd2l0aCAqLworICAgICAgICAvKiBzb21lIGdhcCBmcm9tIHRoZSBwYXJlbnQgc3RhY2sgdG8gcHJldmVudCBmYWxzZSBzaGFyaW5nLiAqLworICAgICAgICB2b2lkICpkdW1teSA9IEtNUF9BTExPQ0EoX19rbXBfc3RrcGFkZGluZyk7CisgICAgICAgIC8qIFRoZXNlIDIgbGluZXMgYmVsb3cgYXJlIHNvIHRoaXMgZG9lcyBub3QgZ2V0IG9wdGltaXplZCBvdXQgKi8KKyAgICAgICAgaWYgKCBfX2ttcF9zdGtwYWRkaW5nID4gS01QX01BWF9TVEtQQURESU5HICkKKyAgICAgICAgICAgIF9fa21wX3N0a3BhZGRpbmcgKz0gKHNob3J0KSgoa21wX2ludDY0KWR1bW15KTsKKyAgICB9CisKKyAgICAvKiBpbml0aWFsaXplIGlmIG5lZWRlZCAqLworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7IC8vIEFDOiBwb3RlbnRpYWxseSB1bnNhZmUsIG5vdCBpbiBzeW5jIHdpdGggc2h1dGRvd24KKyAgICBpZiggISBUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSApCisgICAgICAgIF9fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoKTsKKworICAgIC8qIHNldHVwIGN1cnJlbnQgZGF0YSAqLworICAgIG1hc3Rlcl90aCAgICAgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07IC8vIEFDOiBwb3RlbnRpYWxseSB1bnNhZmUsIG5vdCBpbiBzeW5jIHdpdGggc2h1dGRvd24KKyAgICBwYXJlbnRfdGVhbSAgID0gbWFzdGVyX3RoLT50aC50aF90ZWFtOworICAgIG1hc3Rlcl90aWQgICAgPSBtYXN0ZXJfdGgtPnRoLnRoX2luZm8uZHMuZHNfdGlkOworICAgIG1hc3Rlcl90aGlzX2NvbnMgPSBtYXN0ZXJfdGgtPnRoLnRoX2xvY2FsLnRoaXNfY29uc3RydWN0OworICAgIHJvb3QgICAgICAgICAgPSBtYXN0ZXJfdGgtPnRoLnRoX3Jvb3Q7CisgICAgbWFzdGVyX2FjdGl2ZSA9IHJvb3QtPnIucl9hY3RpdmU7CisgICAgbWFzdGVyX3NldF9udW10aHJlYWRzID0gbWFzdGVyX3RoLT50aC50aF9zZXRfbnByb2M7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBvbXB0X3BhcmFsbGVsX2lkX3Qgb21wdF9wYXJhbGxlbF9pZDsKKyAgICBvbXB0X3Rhc2tfaWRfdCBvbXB0X3Rhc2tfaWQ7CisgICAgb21wdF9mcmFtZV90ICpvbXB0X2ZyYW1lOworICAgIG9tcHRfdGFza19pZF90IG15X3Rhc2tfaWQ7CisgICAgb21wdF9wYXJhbGxlbF9pZF90IG15X3BhcmFsbGVsX2lkOworCisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICBvbXB0X3BhcmFsbGVsX2lkID0gX19vbXB0X3BhcmFsbGVsX2lkX25ldyhndGlkKTsKKyAgICAgICAgb21wdF90YXNrX2lkID0gX19vbXB0X2dldF90YXNrX2lkX2ludGVybmFsKDApOworICAgICAgICBvbXB0X2ZyYW1lID0gX19vbXB0X2dldF90YXNrX2ZyYW1lX2ludGVybmFsKDApOworICAgIH0KKyNlbmRpZgorCisgICAgLy8gTmVzdGVkIGxldmVsIHdpbGwgYmUgYW4gaW5kZXggaW4gdGhlIG5lc3RlZCBudGhyZWFkcyBhcnJheQorICAgIGxldmVsICAgICAgICAgPSBwYXJlbnRfdGVhbS0+dC50X2xldmVsOworI2lmIE9NUF80MF9FTkFCTEVECisgICAgYWN0aXZlX2xldmVsICA9IHBhcmVudF90ZWFtLT50LnRfYWN0aXZlX2xldmVsOyAvLyBpcyB1c2VkIHRvIGxhdW5jaCBub24tc2VyaWFsIHRlYW1zIGV2ZW4gaWYgbmVzdGVkIGlzIG5vdCBhbGxvd2VkCisgICAgdGVhbXNfbGV2ZWwgICAgPSBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX2xldmVsOyAvLyBuZWVkZWQgdG8gY2hlY2sgbmVzdGluZyBpbnNpZGUgdGhlIHRlYW1zCisjZW5kaWYKKyNpZiBLTVBfTkVTVEVEX0hPVF9URUFNUworICAgIHBfaG90X3RlYW1zICAgPSAmbWFzdGVyX3RoLT50aC50aF9ob3RfdGVhbXM7CisgICAgaWYoICpwX2hvdF90ZWFtcyA9PSBOVUxMICYmIF9fa21wX2hvdF90ZWFtc19tYXhfbGV2ZWwgPiAwICkgeworICAgICAgICAqcF9ob3RfdGVhbXMgPSAoa21wX2hvdF90ZWFtX3B0cl90KilfX2ttcF9hbGxvY2F0ZSgKKyAgICAgICAgICAgICAgICBzaXplb2Yoa21wX2hvdF90ZWFtX3B0cl90KSAqIF9fa21wX2hvdF90ZWFtc19tYXhfbGV2ZWwpOworICAgICAgICAoKnBfaG90X3RlYW1zKVswXS5ob3RfdGVhbSA9IHJvb3QtPnIucl9ob3RfdGVhbTsKKyAgICAgICAgKCpwX2hvdF90ZWFtcylbMF0uaG90X3RlYW1fbnRoID0gMTsgLy8gaXQgaXMgZWl0aGVyIGFjdHVhbCBvciBub3QgbmVlZGVkICh3aGVuIGFjdGl2ZV9sZXZlbCA+IDApCisgICAgfQorI2VuZGlmCisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9wYXJhbGxlbF9iZWdpbikpIHsKKyAgICAgICAgaW50IHRlYW1fc2l6ZSA9IG1hc3Rlcl9zZXRfbnVtdGhyZWFkczsKKworICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcGFyYWxsZWxfYmVnaW4pKAorICAgICAgICAgICAgb21wdF90YXNrX2lkLCBvbXB0X2ZyYW1lLCBvbXB0X3BhcmFsbGVsX2lkLAorICAgICAgICAgICAgdGVhbV9zaXplLCB1bndyYXBwZWRfdGFzaywgT01QVF9JTlZPS0VSKGNhbGxfY29udGV4dCkpOworICAgIH0KKyNlbmRpZgorCisgICAgbWFzdGVyX3RoLT50aC50aF9pZGVudCA9IGxvYzsKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgaWYgKCBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX21pY3JvdGFzayAmJgorICAgICAgICAgYXAgJiYgbWljcm90YXNrICE9IChtaWNyb3Rhc2tfdClfX2ttcF90ZWFtc19tYXN0ZXIgJiYgbGV2ZWwgPT0gdGVhbXNfbGV2ZWwgKSB7CisgICAgICAgIC8vIEFDOiBUaGlzIGlzIHN0YXJ0IG9mIHBhcmFsbGVsIHRoYXQgaXMgbmVzdGVkIGluc2lkZSB0ZWFtcyBjb25zdHJ1Y3QuCisgICAgICAgIC8vICAgICBUaGUgdGVhbSBpcyBhY3R1YWwgKGhvdCksIGFsbCB3b3JrZXJzIGFyZSByZWFkeSBhdCB0aGUgZm9yayBiYXJyaWVyLgorICAgICAgICAvLyAgICAgTm8gbG9jayBuZWVkZWQgdG8gaW5pdGlhbGl6ZSB0aGUgdGVhbSBhIGJpdCwgdGhlbiBmcmVlIHdvcmtlcnMuCisgICAgICAgIHBhcmVudF90ZWFtLT50LnRfaWRlbnQgPSBsb2M7CisgICAgICAgIHBhcmVudF90ZWFtLT50LnRfYXJnYyAgPSBhcmdjOworICAgICAgICBhcmd2ID0gKHZvaWQqKilwYXJlbnRfdGVhbS0+dC50X2FyZ3Y7CisgICAgICAgIGZvciggaT1hcmdjLTE7IGkgPj0gMDsgLS1pICkKKy8qIFRPRE86IHJldmVydCB3b3JrYXJvdW5kIGZvciBJbnRlbChSKSA2NCB0cmFja2VyICM5NiAqLworI2lmIChLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpICYmIEtNUF9PU19MSU5VWAorICAgICAgICAgICAgKmFyZ3YrKyA9IHZhX2FyZyggKmFwLCB2b2lkICogKTsKKyNlbHNlCisgICAgICAgICAgICAqYXJndisrID0gdmFfYXJnKCBhcCwgdm9pZCAqICk7CisjZW5kaWYKKyAgICAgICAgLyogSW5jcmVtZW50IG91ciBuZXN0ZWQgZGVwdGggbGV2ZWxzLCBidXQgbm90IGluY3JlYXNlIHRoZSBzZXJpYWxpemF0aW9uICovCisgICAgICAgIGlmICggcGFyZW50X3RlYW0gPT0gbWFzdGVyX3RoLT50aC50aF9zZXJpYWxfdGVhbSApIHsKKyAgICAgICAgICAgIC8vIEFDOiB3ZSBhcmUgaW4gc2VyaWFsaXplZCBwYXJhbGxlbAorICAgICAgICAgICAgX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWwobG9jLCBndGlkKTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHBhcmVudF90ZWFtLT50LnRfc2VyaWFsaXplZCA+IDEgKTsKKyAgICAgICAgICAgIHBhcmVudF90ZWFtLT50LnRfc2VyaWFsaXplZC0tOyAvLyBBQzogbmVlZCB0aGlzIGluIG9yZGVyIGVucXVpcnkgZnVuY3Rpb25zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHdvcmsgY29ycmVjdGx5LCB3aWxsIHJlc3RvcmUgYXQgam9pbiB0aW1lCisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgIHZvaWQgKmR1bW15OworICAgICAgICAgICAgdm9pZCAqKmV4aXRfcnVudGltZV9wOworCisgICAgICAgICAgICBvbXB0X2x3X3Rhc2t0ZWFtX3QgbHdfdGFza3RlYW07CisKKyAgICAgICAgICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICBfX29tcHRfbHdfdGFza3RlYW1faW5pdCgmbHdfdGFza3RlYW0sIG1hc3Rlcl90aCwgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgdW53cmFwcGVkX3Rhc2ssIG9tcHRfcGFyYWxsZWxfaWQpOworICAgICAgICAgICAgICAgIGx3X3Rhc2t0ZWFtLm9tcHRfdGFza19pbmZvLnRhc2tfaWQgPSBfX29tcHRfdGFza19pZF9uZXcoZ3RpZCk7CisgICAgICAgICAgICAgICAgZXhpdF9ydW50aW1lX3AgPSAmKGx3X3Rhc2t0ZWFtLm9tcHRfdGFza19pbmZvLmZyYW1lLmV4aXRfcnVudGltZV9mcmFtZSk7CisKKyAgICAgICAgICAgICAgICBfX29tcHRfbHdfdGFza3RlYW1fbGluaygmbHdfdGFza3RlYW0sIG1hc3Rlcl90aCk7CisKKyNpZiBPTVBUX1RSQUNFCisgICAgICAgICAgICAgICAgLyogT01QVCBpbXBsaWNpdCB0YXNrIGJlZ2luICovCisgICAgICAgICAgICAgICAgbXlfdGFza19pZCA9IGx3X3Rhc2t0ZWFtLm9tcHRfdGFza19pbmZvLnRhc2tfaWQ7CisgICAgICAgICAgICAgICAgbXlfcGFyYWxsZWxfaWQgPSBwYXJlbnRfdGVhbS0+dC5vbXB0X3RlYW1faW5mby5wYXJhbGxlbF9pZDsKKyAgICAgICAgICAgICAgICBpZiAob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW4pKSB7CisgICAgICAgICAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luKSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG15X3BhcmFsbGVsX2lkLCBteV90YXNrX2lkKTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAgICAgICAgIC8qIE9NUFQgc3RhdGUgKi8KKyAgICAgICAgICAgICAgICBtYXN0ZXJfdGgtPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBvbXB0X3N0YXRlX3dvcmtfcGFyYWxsZWw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGV4aXRfcnVudGltZV9wID0gJmR1bW15OworICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBLTVBfVElNRV9CTE9DSyhPTVBfd29yayk7CisgICAgICAgICAgICAgICAgX19rbXBfaW52b2tlX21pY3JvdGFzayggbWljcm90YXNrLCBndGlkLCAwLCBhcmdjLCBwYXJlbnRfdGVhbS0+dC50X2FyZ3YKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIGV4aXRfcnVudGltZV9wCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICBpZiAob21wdF9lbmFibGVkKSB7CisjaWYgT01QVF9UUkFDRQorICAgICAgICAgICAgICAgIGx3X3Rhc2t0ZWFtLm9tcHRfdGFza19pbmZvLmZyYW1lLmV4aXRfcnVudGltZV9mcmFtZSA9IDA7CisKKyAgICAgICAgICAgICAgICBpZiAob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kKSkgeworICAgICAgICAgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQpKAorICAgICAgICAgICAgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9pZCwgb21wdF90YXNrX2lkKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBfX29tcHRfbHdfdGFza3RlYW1fdW5saW5rKG1hc3Rlcl90aCk7CisgICAgICAgICAgICAgICAgLy8gcmVzZXQgY2xlYXIgdGhlIHRhc2sgaWQgb25seSBhZnRlciB1bmxpbmtpbmcgdGhlIHRhc2sKKyAgICAgICAgICAgICAgICBsd190YXNrdGVhbS5vbXB0X3Rhc2tfaW5mby50YXNrX2lkID0gb21wdF90YXNrX2lkX25vbmU7CisjZW5kaWYKKworICAgICAgICAgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kKSkgeworICAgICAgICAgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kKSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfaWQsIG9tcHRfdGFza19pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NUFRfSU5WT0tFUihjYWxsX2NvbnRleHQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWFzdGVyX3RoLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID0gb21wdF9zdGF0ZV9vdmVyaGVhZDsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKworICAgICAgICBwYXJlbnRfdGVhbS0+dC50X3BrZm4gID0gbWljcm90YXNrOworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICBwYXJlbnRfdGVhbS0+dC5vbXB0X3RlYW1faW5mby5taWNyb3Rhc2sgPSB1bndyYXBwZWRfdGFzazsKKyNlbmRpZgorICAgICAgICBwYXJlbnRfdGVhbS0+dC50X2ludm9rZSA9IGludm9rZXI7CisgICAgICAgIEtNUF9URVNUX1RIRU5fSU5DMzIoIChrbXBfaW50MzIqKSAmcm9vdC0+ci5yX2luX3BhcmFsbGVsICk7CisgICAgICAgIHBhcmVudF90ZWFtLT50LnRfYWN0aXZlX2xldmVsICsrOworICAgICAgICBwYXJlbnRfdGVhbS0+dC50X2xldmVsICsrOworCisgICAgICAgIC8qIENoYW5nZSBudW1iZXIgb2YgdGhyZWFkcyBpbiB0aGUgdGVhbSBpZiByZXF1ZXN0ZWQgKi8KKyAgICAgICAgaWYgKCBtYXN0ZXJfc2V0X251bXRocmVhZHMgKSB7ICAgLy8gVGhlIHBhcmFsbGVsIGhhcyBudW1fdGhyZWFkcyBjbGF1c2UKKyAgICAgICAgICAgIGlmICggbWFzdGVyX3NldF9udW10aHJlYWRzIDwgbWFzdGVyX3RoLT50aC50aF90ZWFtc19zaXplLm50aCApIHsKKyAgICAgICAgICAgICAgICAvLyBBQzogb25seSBjYW4gcmVkdWNlIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBkeW5hbWljYWxseSwgY2Fubm90IGluY3JlYXNlCisgICAgICAgICAgICAgICAga21wX2luZm9fdCAqKm90aGVyX3RocmVhZHMgPSBwYXJlbnRfdGVhbS0+dC50X3RocmVhZHM7CisgICAgICAgICAgICAgICAgcGFyZW50X3RlYW0tPnQudF9ucHJvYyA9IG1hc3Rlcl9zZXRfbnVtdGhyZWFkczsKKyAgICAgICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IG1hc3Rlcl9zZXRfbnVtdGhyZWFkczsgKytpICkgeworICAgICAgICAgICAgICAgICAgICBvdGhlcl90aHJlYWRzW2ldLT50aC50aF90ZWFtX25wcm9jID0gbWFzdGVyX3NldF9udW10aHJlYWRzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBLZWVwIGV4dHJhIHRocmVhZHMgaG90IGluIHRoZSB0ZWFtIGZvciBwb3NzaWJsZSBuZXh0IHBhcmFsbGVscworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWFzdGVyX3RoLT50aC50aF9zZXRfbnByb2MgPSAwOworICAgICAgICB9CisKKyNpZiBVU0VfREVCVUdHRVIKKyAgICBpZiAoIF9fa21wX2RlYnVnZ2luZyApIHsgICAgLy8gTGV0IGRlYnVnZ2VyIG92ZXJyaWRlIG51bWJlciBvZiB0aHJlYWRzLgorICAgICAgICBpbnQgbnRoID0gX19rbXBfb21wX251bV90aHJlYWRzKCBsb2MgKTsKKyAgICAgICAgaWYgKCBudGggPiAwICkgeyAgICAgICAgLy8gMCBtZWFucyBkZWJ1Z2dlciBkb2VzIG5vdCB3YW50IHRvIGNoYW5nZSBudW1iZXIgb2YgdGhyZWFkcy4KKyAgICAgICAgICAgIG1hc3Rlcl9zZXRfbnVtdGhyZWFkcyA9IG50aDsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBpZgorI2VuZGlmCisKKyAgICAgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9mb3JrX2NhbGw6IGJlZm9yZSBpbnRlcm5hbCBmb3JrOiByb290PSVwLCB0ZWFtPSVwLCBtYXN0ZXJfdGg9JXAsIGd0aWQ9JWRcbiIsIHJvb3QsIHBhcmVudF90ZWFtLCBtYXN0ZXJfdGgsIGd0aWQgKSApOworICAgICAgICBfX2ttcF9pbnRlcm5hbF9mb3JrKCBsb2MsIGd0aWQsIHBhcmVudF90ZWFtICk7CisgICAgICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfZm9ya19jYWxsOiBhZnRlciBpbnRlcm5hbCBmb3JrOiByb290PSVwLCB0ZWFtPSVwLCBtYXN0ZXJfdGg9JXAsIGd0aWQ9JWRcbiIsIHJvb3QsIHBhcmVudF90ZWFtLCBtYXN0ZXJfdGgsIGd0aWQgKSApOworCisgICAgICAgIC8qIEludm9rZSBtaWNyb3Rhc2sgZm9yIE1BU1RFUiB0aHJlYWQgKi8KKyAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2ZvcmtfY2FsbDogVCMlZCglZDowKSBpbnZva2UgbWljcm90YXNrID0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgIGd0aWQsIHBhcmVudF90ZWFtLT50LnRfaWQsIHBhcmVudF90ZWFtLT50LnRfcGtmbiApICk7CisKKyAgICAgICAgeworICAgICAgICAgICAgS01QX1RJTUVfQkxPQ0soT01QX3dvcmspOworICAgICAgICAgICAgaWYgKCEgcGFyZW50X3RlYW0tPnQudF9pbnZva2UoIGd0aWQgKSkgeworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQyKCAwLCAiY2Fubm90IGludm9rZSBtaWNyb3Rhc2sgZm9yIE1BU1RFUiB0aHJlYWQiICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2ZvcmtfY2FsbDogVCMlZCglZDowKSBkb25lIG1pY3JvdGFzayA9ICVwXG4iLAorICAgICAgICAgICAgZ3RpZCwgcGFyZW50X3RlYW0tPnQudF9pZCwgcGFyZW50X3RlYW0tPnQudF9wa2ZuICkgKTsKKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2ZvcmtfY2FsbDogcGFyYWxsZWwgZXhpdCBUIyVkXG4iLCBndGlkICkpOworCisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0gLy8gUGFyYWxsZWwgY2xvc2VseSBuZXN0ZWQgaW4gdGVhbXMgY29uc3RydWN0CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworI2lmIEtNUF9ERUJVRworICAgIGlmICggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQobWFzdGVyX3RoLT50aC50aF90YXNrX3RlYW0gPT0gcGFyZW50X3RlYW0tPnQudF90YXNrX3RlYW1bbWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlXSk7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoIHBhcmVudF90ZWFtLT50LnRfYWN0aXZlX2xldmVsID49IG1hc3Rlcl90aC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLm1heF9hY3RpdmVfbGV2ZWxzICkgeworICAgICAgICBudGhyZWFkcyA9IDE7CisgICAgfSBlbHNlIHsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICBpbnQgZW50ZXJfdGVhbXMgPSAoKGFwPT1OVUxMICYmIGFjdGl2ZV9sZXZlbD09MCl8fChhcCAmJiB0ZWFtc19sZXZlbD4wICYmIHRlYW1zX2xldmVsPT1sZXZlbCkpOworI2VuZGlmCisgICAgICAgIG50aHJlYWRzID0gbWFzdGVyX3NldF9udW10aHJlYWRzID8KKyAgICAgICAgICAgIG1hc3Rlcl9zZXRfbnVtdGhyZWFkcyA6IGdldF9fbnByb2NfMiggcGFyZW50X3RlYW0sIG1hc3Rlcl90aWQgKTsgLy8gVE9ETzogZ2V0IG5wcm9jIGRpcmVjdGx5IGZyb20gY3VycmVudCB0YXNrCisKKyAgICAgICAgLy8gQ2hlY2sgaWYgd2UgbmVlZCB0byB0YWtlIGZvcmtqb2luIGxvY2s/IChubyBuZWVkIGZvciBzZXJpYWxpemVkIHBhcmFsbGVsIG91dCBvZiB0ZWFtcyBjb25zdHJ1Y3QpLgorICAgICAgICAvLyBUaGlzIGNvZGUgbW92ZWQgaGVyZSBmcm9tIF9fa21wX3Jlc2VydmVfdGhyZWFkcygpIHRvIHNwZWVkdXAgbmVzdGVkIHNlcmlhbGl6ZWQgcGFyYWxsZWxzLgorICAgICAgICBpZiAobnRocmVhZHMgPiAxKSB7CisgICAgICAgICAgICBpZiAoICggIWdldF9fbmVzdGVkKG1hc3Rlcl90aCkgJiYgKHJvb3QtPnIucl9pbl9wYXJhbGxlbAorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICAgICAgJiYgIWVudGVyX3RlYW1zCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICAgICAgICAgICkgKSB8fCAoIF9fa21wX2xpYnJhcnkgPT0gbGlicmFyeV9zZXJpYWwgKSApIHsKKyAgICAgICAgICAgICAgICBLQ19UUkFDRSggMTAsICggIl9fa21wX2ZvcmtfY2FsbDogVCMlZCBzZXJpYWxpemluZyB0ZWFtOyByZXF1ZXN0ZWQgJWQgdGhyZWFkc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgbnRocmVhZHMgKSk7CisgICAgICAgICAgICAgICAgbnRocmVhZHMgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICggbnRocmVhZHMgPiAxICkgeworICAgICAgICAgICAgLyogZGV0ZXJtaW5lIGhvdyBtYW55IG5ldyB0aHJlYWRzIHdlIGNhbiB1c2UgKi8KKyAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7CisKKyAgICAgICAgICAgIG50aHJlYWRzID0gX19rbXBfcmVzZXJ2ZV90aHJlYWRzKHJvb3QsIHBhcmVudF90ZWFtLCBtYXN0ZXJfdGlkLCBudGhyZWFkcworI2lmIE9NUF80MF9FTkFCTEVECisvKiBBQzogSWYgd2UgZXhlY3V0ZSB0ZWFtcyBmcm9tIHBhcmFsbGVsIHJlZ2lvbiAob24gaG9zdCksIHRoZW4gdGVhbXMgc2hvdWxkIGJlIGNyZWF0ZWQKKyAgIGJ1dCBlYWNoIGNhbiBvbmx5IGhhdmUgMSB0aHJlYWQgaWYgbmVzdGluZyBpcyBkaXNhYmxlZC4gSWYgdGVhbXMgY2FsbGVkIGZyb20gc2VyaWFsIHJlZ2lvbiwKKyAgIHRoZW4gdGVhbXMgYW5kIHRoZWlyIHRocmVhZHMgc2hvdWxkIGJlIGNyZWF0ZWQgcmVnYXJkbGVzcyBvZiB0aGUgbmVzdGluZyBzZXR0aW5nLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIGVudGVyX3RlYW1zCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGlmICggbnRocmVhZHMgPT0gMSApIHsKKyAgICAgICAgICAgICAgICAvLyBGcmVlIGxvY2sgZm9yIHNpbmdsZSB0aHJlYWQgZXhlY3V0aW9uIGhlcmU7CisgICAgICAgICAgICAgICAgLy8gZm9yIG11bHRpLXRocmVhZCBleGVjdXRpb24gaXQgd2lsbCBiZSBmcmVlZCBsYXRlcgorICAgICAgICAgICAgICAgIC8vIGFmdGVyIHRlYW0gb2YgdGhyZWFkcyBjcmVhdGVkIGFuZCBpbml0aWFsaXplZAorICAgICAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgS01QX0RFQlVHX0FTU0VSVCggbnRocmVhZHMgPiAwICk7CisKKyAgICAvKiBJZiB3ZSB0ZW1wb3JhcmlseSBjaGFuZ2VkIHRoZSBzZXQgbnVtYmVyIG9mIHRocmVhZHMgdGhlbiByZXN0b3JlIGl0IG5vdyAqLworICAgIG1hc3Rlcl90aC0+dGgudGhfc2V0X25wcm9jID0gMDsKKworICAgIC8qIGNyZWF0ZSBhIHNlcmlhbGl6ZWQgcGFyYWxsZWwgcmVnaW9uPyAqLworICAgIGlmICggbnRocmVhZHMgPT0gMSApIHsKKyAgICAgICAgLyogam9zaCB0b2RvOiBoeXBvdGhldGljYWwgcXVlc3Rpb246IHdoYXQgZG8gd2UgZG8gZm9yIE9TIFgqPyAqLworI2lmIEtNUF9PU19MSU5VWCAmJiAoIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpCisgICAgICAgIHZvaWQgKiAgIGFyZ3NbIGFyZ2MgXTsKKyNlbHNlCisgICAgICAgIHZvaWQgKiAqIGFyZ3MgPSAodm9pZCoqKSBLTVBfQUxMT0NBKCBhcmdjICogc2l6ZW9mKCB2b2lkICogKSApOworI2VuZGlmIC8qIEtNUF9PU19MSU5VWCAmJiAoIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpICovCisKKyAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2ZvcmtfY2FsbDogVCMlZCBzZXJpYWxpemluZyBwYXJhbGxlbCByZWdpb25cbiIsIGd0aWQgKSk7CisKKyAgICAgICAgX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWwobG9jLCBndGlkKTsKKworICAgICAgICBpZiAoIGNhbGxfY29udGV4dCA9PSBmb3JrX2NvbnRleHRfaW50ZWwgKSB7CisgICAgICAgICAgICAvKiBUT0RPIHRoaXMgc3Vja3MsIHVzZSB0aGUgY29tcGlsZXIgaXRzZWxmIHRvIHBhc3MgYXJncyEgOikgKi8KKyAgICAgICAgICAgIG1hc3Rlcl90aC0+dGgudGhfc2VyaWFsX3RlYW0tPnQudF9pZGVudCA9IGxvYzsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgaWYgKCAhYXAgKSB7CisgICAgICAgICAgICAgICAgLy8gcmV2ZXJ0IGNoYW5nZSBtYWRlIGluIF9fa21wY19zZXJpYWxpemVkX3BhcmFsbGVsKCkKKyAgICAgICAgICAgICAgICBtYXN0ZXJfdGgtPnRoLnRoX3NlcmlhbF90ZWFtLT50LnRfbGV2ZWwtLTsKKyAgICAgICAgICAgICAgICAvLyBHZXQgYXJncyBmcm9tIHBhcmVudCB0ZWFtIGZvciB0ZWFtcyBjb25zdHJ1Y3QKKworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgICAgIHZvaWQgKmR1bW15OworICAgICAgICAgICAgICAgIHZvaWQgKipleGl0X3J1bnRpbWVfcDsKKworICAgICAgICAgICAgICAgIG9tcHRfbHdfdGFza3RlYW1fdCBsd190YXNrdGVhbTsKKworICAgICAgICAgICAgICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgX19vbXB0X2x3X3Rhc2t0ZWFtX2luaXQoJmx3X3Rhc2t0ZWFtLCBtYXN0ZXJfdGgsIGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICB1bndyYXBwZWRfdGFzaywgb21wdF9wYXJhbGxlbF9pZCk7CisgICAgICAgICAgICAgICAgICAgIGx3X3Rhc2t0ZWFtLm9tcHRfdGFza19pbmZvLnRhc2tfaWQgPSBfX29tcHRfdGFza19pZF9uZXcoZ3RpZCk7CisgICAgICAgICAgICAgICAgICAgIGV4aXRfcnVudGltZV9wID0gJihsd190YXNrdGVhbS5vbXB0X3Rhc2tfaW5mby5mcmFtZS5leGl0X3J1bnRpbWVfZnJhbWUpOworCisgICAgICAgICAgICAgICAgICAgIF9fb21wdF9sd190YXNrdGVhbV9saW5rKCZsd190YXNrdGVhbSwgbWFzdGVyX3RoKTsKKworI2lmIE9NUFRfVFJBQ0UKKyAgICAgICAgICAgICAgICAgICAgbXlfdGFza19pZCA9IGx3X3Rhc2t0ZWFtLm9tcHRfdGFza19pbmZvLnRhc2tfaWQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luKSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2lkLCBteV90YXNrX2lkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgICAgICAgICAgLyogT01QVCBzdGF0ZSAqLworICAgICAgICAgICAgICAgICAgICBtYXN0ZXJfdGgtPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBvbXB0X3N0YXRlX3dvcmtfcGFyYWxsZWw7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZXhpdF9ydW50aW1lX3AgPSAmZHVtbXk7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9USU1FX0JMT0NLKE9NUF93b3JrKTsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfaW52b2tlX21pY3JvdGFzayggbWljcm90YXNrLCBndGlkLCAwLCBhcmdjLCBwYXJlbnRfdGVhbS0+dC50X2FyZ3YKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICwgZXhpdF9ydW50aW1lX3AKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbHdfdGFza3RlYW0ub21wdF90YXNrX2luZm8uZnJhbWUuZXhpdF9ydW50aW1lX2ZyYW1lID0gMDsKKworI2lmIE9NUFRfVFJBQ0UKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZCkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9pZCwgb21wdF90YXNrX2lkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgICAgICAgICAgX19vbXB0X2x3X3Rhc2t0ZWFtX3VubGluayhtYXN0ZXJfdGgpOworICAgICAgICAgICAgICAgICAgICAvLyByZXNldCBjbGVhciB0aGUgdGFzayBpZCBvbmx5IGFmdGVyIHVubGlua2luZyB0aGUgdGFzaworICAgICAgICAgICAgICAgICAgICBsd190YXNrdGVhbS5vbXB0X3Rhc2tfaW5mby50YXNrX2lkID0gb21wdF90YXNrX2lkX25vbmU7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9wYXJhbGxlbF9lbmQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kKSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2lkLCBvbXB0X3Rhc2tfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01QVF9JTlZPS0VSKGNhbGxfY29udGV4dCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1hc3Rlcl90aC0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfb3ZlcmhlYWQ7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICB9IGVsc2UgaWYgKCBtaWNyb3Rhc2sgPT0gKG1pY3JvdGFza190KV9fa21wX3RlYW1zX21hc3RlciApIHsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBtYXN0ZXJfdGgtPnRoLnRoX3RlYW0gPT0gbWFzdGVyX3RoLT50aC50aF9zZXJpYWxfdGVhbSApOworICAgICAgICAgICAgICAgIHRlYW0gPSBtYXN0ZXJfdGgtPnRoLnRoX3RlYW07CisgICAgICAgICAgICAgICAgLy90ZWFtLT50LnRfcGtmbiA9IG1pY3JvdGFzazsKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaW52b2tlID0gaW52b2tlcjsKKyAgICAgICAgICAgICAgICBfX2ttcF9hbGxvY19hcmd2X2VudHJpZXMoIGFyZ2MsIHRlYW0sIFRSVUUgKTsKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfYXJnYyA9IGFyZ2M7CisgICAgICAgICAgICAgICAgYXJndiA9ICh2b2lkKiopIHRlYW0tPnQudF9hcmd2OworICAgICAgICAgICAgICAgIGlmICggYXAgKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciggaT1hcmdjLTE7IGkgPj0gMDsgLS1pICkKKy8vIFRPRE86IHJldmVydCB3b3JrYXJvdW5kIGZvciBJbnRlbChSKSA2NCB0cmFja2VyICM5NgorIyBpZiAoS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KSAmJiBLTVBfT1NfTElOVVgKKyAgICAgICAgICAgICAgICAgICAgICAgICphcmd2KysgPSB2YV9hcmcoICphcCwgdm9pZCAqICk7CisjIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICphcmd2KysgPSB2YV9hcmcoIGFwLCB2b2lkICogKTsKKyMgZW5kaWYKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmb3IoIGk9MDsgaSA8IGFyZ2M7ICsraSApCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgYXJncyBmcm9tIHBhcmVudCB0ZWFtIGZvciB0ZWFtcyBjb25zdHJ1Y3QKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3ZbaV0gPSBwYXJlbnRfdGVhbS0+dC50X2FyZ3ZbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIEFDOiByZXZlcnQgY2hhbmdlIG1hZGUgaW4gX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWwoKQorICAgICAgICAgICAgICAgIC8vICAgICBiZWNhdXNlIGluaXRpYWwgY29kZSBpbiB0ZWFtcyBzaG91bGQgaGF2ZSBsZXZlbD0wCisgICAgICAgICAgICAgICAgdGVhbS0+dC50X2xldmVsLS07CisgICAgICAgICAgICAgICAgLy8gQUM6IGNhbGwgc3BlY2lhbCBpbnZva2VyIGZvciBvdXRlciAicGFyYWxsZWwiIG9mIHRoZSB0ZWFtcyBjb25zdHJ1Y3QKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9USU1FX0JMT0NLKE9NUF93b3JrKTsKKyAgICAgICAgICAgICAgICAgICAgaW52b2tlcihndGlkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgICAgICAgICAgICAgYXJndiA9IGFyZ3M7CisgICAgICAgICAgICAgICAgZm9yKCBpPWFyZ2MtMTsgaSA+PSAwOyAtLWkgKQorLy8gVE9ETzogcmV2ZXJ0IHdvcmthcm91bmQgZm9yIEludGVsKFIpIDY0IHRyYWNrZXIgIzk2CisjaWYgKEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkgJiYgS01QX09TX0xJTlVYCisgICAgICAgICAgICAgICAgICAgICphcmd2KysgPSB2YV9hcmcoICphcCwgdm9pZCAqICk7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICAqYXJndisrID0gdmFfYXJnKCBhcCwgdm9pZCAqICk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBLTVBfTUIoKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgICAgIHZvaWQgKmR1bW15OworICAgICAgICAgICAgICAgIHZvaWQgKipleGl0X3J1bnRpbWVfcDsKKworICAgICAgICAgICAgICAgIG9tcHRfbHdfdGFza3RlYW1fdCBsd190YXNrdGVhbTsKKworICAgICAgICAgICAgICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgX19vbXB0X2x3X3Rhc2t0ZWFtX2luaXQoJmx3X3Rhc2t0ZWFtLCBtYXN0ZXJfdGgsIGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICB1bndyYXBwZWRfdGFzaywgb21wdF9wYXJhbGxlbF9pZCk7CisgICAgICAgICAgICAgICAgICAgIGx3X3Rhc2t0ZWFtLm9tcHRfdGFza19pbmZvLnRhc2tfaWQgPSBfX29tcHRfdGFza19pZF9uZXcoZ3RpZCk7CisgICAgICAgICAgICAgICAgICAgIGV4aXRfcnVudGltZV9wID0gJihsd190YXNrdGVhbS5vbXB0X3Rhc2tfaW5mby5mcmFtZS5leGl0X3J1bnRpbWVfZnJhbWUpOworCisgICAgICAgICAgICAgICAgICAgIF9fb21wdF9sd190YXNrdGVhbV9saW5rKCZsd190YXNrdGVhbSwgbWFzdGVyX3RoKTsKKworI2lmIE9NUFRfVFJBQ0UKKyAgICAgICAgICAgICAgICAgICAgLyogT01QVCBpbXBsaWNpdCB0YXNrIGJlZ2luICovCisgICAgICAgICAgICAgICAgICAgIG15X3Rhc2tfaWQgPSBsd190YXNrdGVhbS5vbXB0X3Rhc2tfaW5mby50YXNrX2lkOworICAgICAgICAgICAgICAgICAgICBteV9wYXJhbGxlbF9pZCA9IG9tcHRfcGFyYWxsZWxfaWQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luKSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBteV9wYXJhbGxlbF9pZCwgbXlfdGFza19pZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAgICAgICAgICAgIC8qIE9NUFQgc3RhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAgbWFzdGVyX3RoLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID0gb21wdF9zdGF0ZV93b3JrX3BhcmFsbGVsOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGV4aXRfcnVudGltZV9wID0gJmR1bW15OworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBLTVBfVElNRV9CTE9DSyhPTVBfd29yayk7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2ludm9rZV9taWNyb3Rhc2soIG1pY3JvdGFzaywgZ3RpZCwgMCwgYXJnYywgYXJncworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAgICAgLCBleGl0X3J1bnRpbWVfcAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgfQorCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworI2lmIE9NUFRfVFJBQ0UKKyAgICAgICAgICAgICAgICAgICAgbHdfdGFza3RlYW0ub21wdF90YXNrX2luZm8uZnJhbWUuZXhpdF9ydW50aW1lX2ZyYW1lID0gMDsKKworICAgICAgICAgICAgICAgICAgICBpZiAob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kKSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBteV9wYXJhbGxlbF9pZCwgbXlfdGFza19pZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAgICAgICAgICAgIF9fb21wdF9sd190YXNrdGVhbV91bmxpbmsobWFzdGVyX3RoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgY2xlYXIgdGhlIHRhc2sgaWQgb25seSBhZnRlciB1bmxpbmtpbmcgdGhlIHRhc2sKKyAgICAgICAgICAgICAgICAgICAgbHdfdGFza3RlYW0ub21wdF90YXNrX2luZm8udGFza19pZCA9IG9tcHRfdGFza19pZF9ub25lOworCisgICAgICAgICAgICAgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3BhcmFsbGVsX2VuZCkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9pZCwgb21wdF90YXNrX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NUFRfSU5WT0tFUihjYWxsX2NvbnRleHQpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtYXN0ZXJfdGgtPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBvbXB0X3N0YXRlX292ZXJoZWFkOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICB9CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggY2FsbF9jb250ZXh0ID09IGZvcmtfY29udGV4dF9nbnUgKSB7CisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICBvbXB0X2x3X3Rhc2t0ZWFtX3QgKmx3dCA9IChvbXB0X2x3X3Rhc2t0ZWFtX3QgKikKKyAgICAgICAgICAgICAgICBfX2ttcF9hbGxvY2F0ZShzaXplb2Yob21wdF9sd190YXNrdGVhbV90KSk7CisgICAgICAgICAgICBfX29tcHRfbHdfdGFza3RlYW1faW5pdChsd3QsIG1hc3Rlcl90aCwgZ3RpZCwKKyAgICAgICAgICAgICAgICB1bndyYXBwZWRfdGFzaywgb21wdF9wYXJhbGxlbF9pZCk7CisKKyAgICAgICAgICAgIGx3dC0+b21wdF90YXNrX2luZm8udGFza19pZCA9IF9fb21wdF90YXNrX2lkX25ldyhndGlkKTsKKyAgICAgICAgICAgIGx3dC0+b21wdF90YXNrX2luZm8uZnJhbWUuZXhpdF9ydW50aW1lX2ZyYW1lID0gMDsKKyAgICAgICAgICAgIF9fb21wdF9sd190YXNrdGVhbV9saW5rKGx3dCwgbWFzdGVyX3RoKTsKKyNlbmRpZgorCisgICAgICAgICAgICAvLyB3ZSB3ZXJlIGNhbGxlZCBmcm9tIEdOVSBuYXRpdmUgY29kZQorICAgICAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2ZvcmtfY2FsbDogVCMlZCBzZXJpYWwgZXhpdFxuIiwgZ3RpZCApKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQyKCBjYWxsX2NvbnRleHQgPCBmb3JrX2NvbnRleHRfbGFzdCwgIl9fa21wX2ZvcmtfY2FsbDogdW5rbm93biBmb3JrX2NvbnRleHQgcGFyYW1ldGVyIiApOworICAgICAgICB9CisKKworICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfZm9ya19jYWxsOiBUIyVkIHNlcmlhbCBleGl0XG4iLCBndGlkICkpOworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIC8vIEdFSDogb25seSBtb2RpZnkgdGhlIGV4ZWN1dGluZyBmbGFnIGluIHRoZSBjYXNlIHdoZW4gbm90IHNlcmlhbGl6ZWQKKyAgICAvLyAgICAgIHNlcmlhbGl6ZWQgY2FzZSBpcyBoYW5kbGVkIGluIGttcGNfc2VyaWFsaXplZF9wYXJhbGxlbAorICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfZm9ya19jYWxsOiBwYXJlbnRfdGVhbV9hY2xldmVsPSVkLCBtYXN0ZXJfdGg9JXAsIGN1cnRhc2s9JXAsIGN1cnRhc2tfbWF4X2FjbGV2ZWw9JWRcbiIsCisgICAgICAgICAgICAgICAgICBwYXJlbnRfdGVhbS0+dC50X2FjdGl2ZV9sZXZlbCwgbWFzdGVyX3RoLCBtYXN0ZXJfdGgtPnRoLnRoX2N1cnJlbnRfdGFzaywKKyAgICAgICAgICAgICAgICAgIG1hc3Rlcl90aC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLm1heF9hY3RpdmVfbGV2ZWxzICkgKTsKKyAgICAvLyBUT0RPOiBHRUggLSBjYW5ub3QgZG8gdGhpcyBhc3NlcnRpb24gYmVjYXVzZSByb290IHRocmVhZCBub3Qgc2V0IHVwIGFzIGV4ZWN1dGluZworICAgIC8vIEtNUF9BU1NFUlQoIG1hc3Rlcl90aC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9mbGFncy5leGVjdXRpbmcgPT0gMSApOworICAgIG1hc3Rlcl90aC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9mbGFncy5leGVjdXRpbmcgPSAwOworCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBpZiAoICFtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX21pY3JvdGFzayB8fCBsZXZlbCA+IHRlYW1zX2xldmVsICkKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgIHsKKyAgICAgICAgLyogSW5jcmVtZW50IG91ciBuZXN0ZWQgZGVwdGggbGV2ZWwgKi8KKyAgICAgICAgS01QX1RFU1RfVEhFTl9JTkMzMiggKGttcF9pbnQzMiopICZyb290LT5yLnJfaW5fcGFyYWxsZWwgKTsKKyAgICB9CisKKyAgICAvLyBTZWUgaWYgd2UgbmVlZCB0byBtYWtlIGEgY29weSBvZiB0aGUgSUNWcy4KKyAgICBpbnQgbnRocmVhZHNfaWN2ID0gbWFzdGVyX3RoLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMubnByb2M7CisgICAgaWYgKChsZXZlbCsxIDwgX19rbXBfbmVzdGVkX250aC51c2VkKSAmJiAoX19rbXBfbmVzdGVkX250aC5udGhbbGV2ZWwrMV0gIT0gbnRocmVhZHNfaWN2KSkgeworICAgICAgICBudGhyZWFkc19pY3YgPSBfX2ttcF9uZXN0ZWRfbnRoLm50aFtsZXZlbCsxXTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIG50aHJlYWRzX2ljdiA9IDA7ICAvLyBkb24ndCB1cGRhdGUKKyAgICB9CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIC8vIEZpZ3VyZSBvdXQgdGhlIHByb2NfYmluZF9wb2xpY3kgZm9yIHRoZSBuZXcgdGVhbS4KKyAgICBrbXBfcHJvY19iaW5kX3QgcHJvY19iaW5kID0gbWFzdGVyX3RoLT50aC50aF9zZXRfcHJvY19iaW5kOworICAgIGttcF9wcm9jX2JpbmRfdCBwcm9jX2JpbmRfaWN2ID0gcHJvY19iaW5kX2RlZmF1bHQ7IC8vIHByb2NfYmluZF9kZWZhdWx0IG1lYW5zIGRvbid0IHVwZGF0ZQorICAgIGlmICggbWFzdGVyX3RoLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMucHJvY19iaW5kID09IHByb2NfYmluZF9mYWxzZSApIHsKKyAgICAgICAgcHJvY19iaW5kID0gcHJvY19iaW5kX2ZhbHNlOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKHByb2NfYmluZCA9PSBwcm9jX2JpbmRfZGVmYXVsdCkgeworICAgICAgICAgICAgLy8gTm8gcHJvY19iaW5kIGNsYXVzZSBzcGVjaWZpZWQ7IHVzZSBjdXJyZW50IHByb2MtYmluZC12YXIgZm9yIHRoaXMgcGFyYWxsZWwgcmVnaW9uCisgICAgICAgICAgICBwcm9jX2JpbmQgPSBtYXN0ZXJfdGgtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5wcm9jX2JpbmQ7CisgICAgICAgIH0KKyAgICAgICAgLyogZWxzZTogVGhlIHByb2NfYmluZCBwb2xpY3kgd2FzIHNwZWNpZmllZCBleHBsaWNpdGx5IG9uIHBhcmFsbGVsIGNsYXVzZS4gVGhpcworICAgICAgICAgICBvdmVycmlkZXMgcHJvYy1iaW5kLXZhciBmb3IgdGhpcyBwYXJhbGxlbCByZWdpb24sIGJ1dCBkb2VzIG5vdCBjaGFuZ2UgcHJvYy1iaW5kLXZhci4gKi8KKyAgICAgICAgLy8gRmlndXJlIHRoZSB2YWx1ZSBvZiBwcm9jLWJpbmQtdmFyIGZvciB0aGUgY2hpbGQgdGhyZWFkcy4KKyAgICAgICAgaWYgKChsZXZlbCsxIDwgX19rbXBfbmVzdGVkX3Byb2NfYmluZC51c2VkKQorICAgICAgICAgICAgJiYgKF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1tsZXZlbCsxXSAhPSBtYXN0ZXJfdGgtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5wcm9jX2JpbmQpKSB7CisgICAgICAgICAgICBwcm9jX2JpbmRfaWN2ID0gX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzW2xldmVsKzFdOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gUmVzZXQgZm9yIG5leHQgcGFyYWxsZWwgcmVnaW9uCisgICAgbWFzdGVyX3RoLT50aC50aF9zZXRfcHJvY19iaW5kID0gcHJvY19iaW5kX2RlZmF1bHQ7CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworICAgIGlmICgobnRocmVhZHNfaWN2ID4gMCkKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICB8fCAocHJvY19iaW5kX2ljdiAhPSBwcm9jX2JpbmRfZGVmYXVsdCkKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgICAgICApIHsKKyAgICAgICAga21wX2ludGVybmFsX2NvbnRyb2xfdCBuZXdfaWN2czsKKyAgICAgICAgY29weV9pY3ZzKCZuZXdfaWN2cywgJm1hc3Rlcl90aC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzKTsKKyAgICAgICAgbmV3X2ljdnMubmV4dCA9IE5VTEw7CisgICAgICAgIGlmIChudGhyZWFkc19pY3YgPiAwKSB7CisgICAgICAgICAgICBuZXdfaWN2cy5ucHJvYyA9IG50aHJlYWRzX2ljdjsKKyAgICAgICAgfQorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgaWYgKHByb2NfYmluZF9pY3YgIT0gcHJvY19iaW5kX2RlZmF1bHQpIHsKKyAgICAgICAgICAgIG5ld19pY3ZzLnByb2NfYmluZCA9IHByb2NfYmluZF9pY3Y7CisgICAgICAgIH0KKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisgICAgICAgIC8qIGFsbG9jYXRlIGEgbmV3IHBhcmFsbGVsIHRlYW0gKi8KKyAgICAgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9mb3JrX2NhbGw6IGJlZm9yZSBfX2ttcF9hbGxvY2F0ZV90ZWFtXG4iICkgKTsKKyAgICAgICAgdGVhbSA9IF9fa21wX2FsbG9jYXRlX3RlYW0ocm9vdCwgbnRocmVhZHMsIG50aHJlYWRzLAorI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2lkLAorI2VuZGlmCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY19iaW5kLAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdfaWN2cywgYXJnYyBVU0VfTkVTVEVEX0hPVF9BUkcobWFzdGVyX3RoKSApOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGFsbG9jYXRlIGEgbmV3IHBhcmFsbGVsIHRlYW0gKi8KKyAgICAgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9mb3JrX2NhbGw6IGJlZm9yZSBfX2ttcF9hbGxvY2F0ZV90ZWFtXG4iICkgKTsKKyAgICAgICAgdGVhbSA9IF9fa21wX2FsbG9jYXRlX3RlYW0ocm9vdCwgbnRocmVhZHMsIG50aHJlYWRzLAorI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2lkLAorI2VuZGlmCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY19iaW5kLAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXN0ZXJfdGgtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cywgYXJnYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfTkVTVEVEX0hPVF9BUkcobWFzdGVyX3RoKSApOworICAgIH0KKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX2ZvcmtfY2FsbDogYWZ0ZXIgX19rbXBfYWxsb2NhdGVfdGVhbSAtIHRlYW0gPSAlcFxuIiwgdGVhbSApICk7CisKKyAgICAvKiBzZXR1cCB0aGUgbmV3IHRlYW0gKi8KKyAgICB0ZWFtLT50LnRfbWFzdGVyX3RpZCA9IG1hc3Rlcl90aWQ7CisgICAgdGVhbS0+dC50X21hc3Rlcl90aGlzX2NvbnMgPSBtYXN0ZXJfdGhpc19jb25zOworICAgIHRlYW0tPnQudF9pZGVudCAgICAgID0gbG9jOworICAgIHRlYW0tPnQudF9wYXJlbnQgICAgID0gcGFyZW50X3RlYW07CisgICAgVENXX1NZTkNfUFRSKHRlYW0tPnQudF9wa2ZuLCBtaWNyb3Rhc2spOworI2lmIE9NUFRfU1VQUE9SVAorICAgIFRDV19TWU5DX1BUUih0ZWFtLT50Lm9tcHRfdGVhbV9pbmZvLm1pY3JvdGFzaywgdW53cmFwcGVkX3Rhc2spOworI2VuZGlmCisgICAgdGVhbS0+dC50X2ludm9rZSAgICAgPSBpbnZva2VyOyAgLyogVE9ETyBtb3ZlIHRoaXMgdG8gcm9vdCwgbWF5YmUgKi8KKyAgICAvLyBUT0RPOiBwYXJlbnRfdGVhbS0+dC50X2xldmVsID09IElOVF9NQVggPz8/CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBpZiAoICFtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX21pY3JvdGFzayB8fCBsZXZlbCA+IHRlYW1zX2xldmVsICkgeworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgICAgIHRlYW0tPnQudF9sZXZlbCAgICAgICAgPSBwYXJlbnRfdGVhbS0+dC50X2xldmVsICsgMTsKKyAgICAgICAgdGVhbS0+dC50X2FjdGl2ZV9sZXZlbCA9IHBhcmVudF90ZWFtLT50LnRfYWN0aXZlX2xldmVsICsgMTsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEFDOiBEbyBub3QgaW5jcmVhc2UgcGFyYWxsZWwgbGV2ZWwgYXQgc3RhcnQgb2YgdGhlIHRlYW1zIGNvbnN0cnVjdAorICAgICAgICB0ZWFtLT50LnRfbGV2ZWwgICAgICAgID0gcGFyZW50X3RlYW0tPnQudF9sZXZlbDsKKyAgICAgICAgdGVhbS0+dC50X2FjdGl2ZV9sZXZlbCA9IHBhcmVudF90ZWFtLT50LnRfYWN0aXZlX2xldmVsOworICAgIH0KKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgIHRlYW0tPnQudF9zY2hlZCAgICAgID0gZ2V0X19zY2hlZF8yKHBhcmVudF90ZWFtLCBtYXN0ZXJfdGlkKTsgLy8gc2V0IG1hc3RlcidzIHNjaGVkdWxlIGFzIG5ldyBydW4tdGltZSBzY2hlZHVsZQorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICB0ZWFtLT50LnRfY2FuY2VsX3JlcXVlc3QgPSBjYW5jZWxfbm9yZXE7CisjZW5kaWYKKworICAgIC8vIFVwZGF0ZSB0aGUgZmxvYXRpbmcgcG9pbnQgcm91bmRpbmcgaW4gdGhlIHRlYW0gaWYgcmVxdWlyZWQuCisgICAgcHJvcGFnYXRlRlBDb250cm9sKHRlYW0pOworCisgICAgaWYgKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApIHsKKyAgICAgICAgLy8gU2V0IG1hc3RlcidzIHRhc2sgdGVhbSB0byB0ZWFtJ3MgdGFzayB0ZWFtLiBVbmxlc3MgdGhpcyBpcyBob3QgdGVhbSwgaXQgc2hvdWxkIGJlIE5VTEwuCisjaWYgMAorICAgICAgICAvLyBQYXRjaCBvdXQgYW4gYXNzZXJ0aW9uIHRoYXQgdHJpcHMgd2hpbGUgdGhlIHJ1bnRpbWUgc2VlbXMgdG8gb3BlcmF0ZSBjb3JyZWN0bHkuCisgICAgICAgIC8vIEF2b2lkaW5nIHRoZSBwcmVjb25kaXRpb25zIHRoYXQgY2F1c2UgdGhlIGFzc2VydGlvbiB0byB0cmlwIGhhcyBiZWVuIHByb21pc2VkIGFzIGEgZm9ydGhjb21pbmcgcGF0Y2guCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQobWFzdGVyX3RoLT50aC50aF90YXNrX3RlYW0gPT0gcGFyZW50X3RlYW0tPnQudF90YXNrX3RlYW1bbWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlXSk7CisjZW5kaWYKKyAgICAgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF9mb3JrX2NhbGw6IE1hc3RlciBUIyVkIHB1c2hpbmcgdGFza190ZWFtICVwIC8gdGVhbSAlcCwgbmV3IHRhc2tfdGVhbSAlcCAvIHRlYW0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggbWFzdGVyX3RoICksIG1hc3Rlcl90aC0+dGgudGhfdGFza190ZWFtLAorICAgICAgICAgICAgICAgICAgICAgIHBhcmVudF90ZWFtLCB0ZWFtLT50LnRfdGFza190ZWFtW21hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZV0sIHRlYW0gKSApOworICAgICAgICBpZiAobGV2ZWwpIHsKKyAgICAgICAgICAgIC8vIFRha2UgYSBtZW1vIG9mIG1hc3RlcidzIHRhc2tfc3RhdGUKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQobWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlX21lbW9fc3RhY2spOworICAgICAgICAgICAgaWYgKG1hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZV90b3AgPj0gbWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlX3N0YWNrX3N6KSB7IC8vIGluY3JlYXNlIHNpemUKKyAgICAgICAgICAgICAgICBrbXBfdWludDMyIG5ld19zaXplID0gMiptYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVfc3RhY2tfc3o7CisgICAgICAgICAgICAgICAga21wX3VpbnQ4ICpvbGRfc3RhY2ssICpuZXdfc3RhY2s7CisgICAgICAgICAgICAgICAga21wX3VpbnQzMiBpOworICAgICAgICAgICAgICAgIG5ld19zdGFjayA9IChrbXBfdWludDggKilfX2ttcF9hbGxvY2F0ZShuZXdfc2l6ZSk7CisgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8bWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlX3N0YWNrX3N6OyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV3X3N0YWNrW2ldID0gbWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlX21lbW9fc3RhY2tbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoaT1tYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVfc3RhY2tfc3o7IGk8bmV3X3NpemU7ICsraSkgeyAvLyB6ZXJvLWluaXQgcmVzdCBvZiBzdGFjaworICAgICAgICAgICAgICAgICAgICBuZXdfc3RhY2tbaV0gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvbGRfc3RhY2sgPSBtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVfbWVtb19zdGFjazsKKyAgICAgICAgICAgICAgICBtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVfbWVtb19zdGFjayA9IG5ld19zdGFjazsKKyAgICAgICAgICAgICAgICBtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVfc3RhY2tfc3ogPSBuZXdfc2l6ZTsKKyAgICAgICAgICAgICAgICBfX2ttcF9mcmVlKG9sZF9zdGFjayk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBTdG9yZSBtYXN0ZXIncyB0YXNrX3N0YXRlIG9uIHN0YWNrCisgICAgICAgICAgICBtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVfbWVtb19zdGFja1ttYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVfdG9wXSA9IG1hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZTsKKyAgICAgICAgICAgIG1hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZV90b3ArKzsKKyNpZiBLTVBfTkVTVEVEX0hPVF9URUFNUworICAgICAgICAgICAgaWYgKHRlYW0gPT0gbWFzdGVyX3RoLT50aC50aF9ob3RfdGVhbXNbbGV2ZWxdLmhvdF90ZWFtKSB7IC8vIFJlc3RvcmUgbWFzdGVyJ3MgbmVzdGVkIHN0YXRlIGlmIG5lc3RlZCBob3QgdGVhbQorICAgICAgICAgICAgICAgIG1hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZSA9IG1hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZV9tZW1vX3N0YWNrW21hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZV90b3BdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGUgPSAwOworI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgfQorI2lmICFLTVBfTkVTVEVEX0hPVF9URUFNUworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKChtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfdGVhbSA9PSBOVUxMKSB8fCAodGVhbSA9PSByb290LT5yLnJfaG90X3RlYW0pKTsKKyNlbmRpZgorICAgIH0KKworICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9mb3JrX2NhbGw6IFQjJWQoJWQ6JWQpLT4oJWQ6MCkgY3JlYXRlZCBhIHRlYW0gb2YgJWQgdGhyZWFkc1xuIiwKKyAgICAgICAgICAgICAgICBndGlkLCBwYXJlbnRfdGVhbS0+dC50X2lkLCB0ZWFtLT50LnRfbWFzdGVyX3RpZCwgdGVhbS0+dC50X2lkLCB0ZWFtLT50LnRfbnByb2MgKSk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbSAhPSByb290LT5yLnJfaG90X3RlYW0gfHwKKyAgICAgICAgICAgICAgICAgICAgICAoIHRlYW0tPnQudF9tYXN0ZXJfdGlkID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICggdGVhbS0+dC50X3BhcmVudCA9PSByb290LT5yLnJfcm9vdF90ZWFtIHx8IHRlYW0tPnQudF9wYXJlbnQtPnQudF9zZXJpYWxpemVkICkgKSk7CisgICAgS01QX01CKCk7CisKKyAgICAvKiBub3csIHNldHVwIHRoZSBhcmd1bWVudHMgKi8KKyAgICBhcmd2ID0gKHZvaWQqKil0ZWFtLT50LnRfYXJndjsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGlmICggYXAgKSB7CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICAgICAgZm9yICggaT1hcmdjLTE7IGkgPj0gMDsgLS1pICkKKy8vIFRPRE86IHJldmVydCB3b3JrYXJvdW5kIGZvciBJbnRlbChSKSA2NCB0cmFja2VyICM5NgorI2lmIChLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpICYmIEtNUF9PU19MSU5VWAorICAgICAgICAgICAgKmFyZ3YrKyA9IHZhX2FyZyggKmFwLCB2b2lkICogKTsKKyNlbHNlCisgICAgICAgICAgICAqYXJndisrID0gdmFfYXJnKCBhcCwgdm9pZCAqICk7CisjZW5kaWYKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoIGk9MDsgaSA8IGFyZ2M7ICsraSApCisgICAgICAgICAgICAvLyBHZXQgYXJncyBmcm9tIHBhcmVudCB0ZWFtIGZvciB0ZWFtcyBjb25zdHJ1Y3QKKyAgICAgICAgICAgIGFyZ3ZbaV0gPSB0ZWFtLT50LnRfcGFyZW50LT50LnRfYXJndltpXTsKKyAgICB9CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworICAgIC8qIG5vdyBhY3R1YWxseSBmb3JrIHRoZSB0aHJlYWRzICovCisgICAgdGVhbS0+dC50X21hc3Rlcl9hY3RpdmUgPSBtYXN0ZXJfYWN0aXZlOworICAgIGlmICghcm9vdC0+ci5yX2FjdGl2ZSkgLy8gT25seSBkbyBhc3NpZ25tZW50IGlmIGl0IHByZXZlbnRzIGNhY2hlIHBpbmctcG9uZworICAgICAgICByb290LT5yLnJfYWN0aXZlID0gVFJVRTsKKworICAgIF9fa21wX2ZvcmtfdGVhbV90aHJlYWRzKCByb290LCB0ZWFtLCBtYXN0ZXJfdGgsIGd0aWQgKTsKKyAgICBfX2ttcF9zZXR1cF9pY3ZfY29weSggdGVhbSwgbnRocmVhZHMsICZtYXN0ZXJfdGgtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cywgbG9jICk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBtYXN0ZXJfdGgtPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBvbXB0X3N0YXRlX3dvcmtfcGFyYWxsZWw7CisjZW5kaWYKKworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7CisKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBpZiAoIHRlYW0tPnQudF9hY3RpdmVfbGV2ZWwgPT0gMSAvLyBvbmx5IHJlcG9ydCBmcmFtZXMgYXQgbGV2ZWwgMQorIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAmJiAhbWFzdGVyX3RoLT50aC50aF90ZWFtc19taWNyb3Rhc2sgLy8gbm90IGluIHRlYW1zIGNvbnN0cnVjdAorIyBlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgICkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgICAgIGlmICggKCBfX2l0dF9mcmFtZV9zdWJtaXRfdjNfcHRyIHx8IEtNUF9JVFRfREVCVUcgKSAmJgorICAgICAgICAgICAgICggX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMyB8fCBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9PSAxICkgKQorICAgICAgICB7CisgICAgICAgICAgICBrbXBfdWludDY0IHRtcF90aW1lID0gMDsKKyAgICAgICAgICAgIGlmICggX19pdHRfZ2V0X3RpbWVzdGFtcF9wdHIgKQorICAgICAgICAgICAgICAgIHRtcF90aW1lID0gX19pdHRfZ2V0X3RpbWVzdGFtcCgpOworICAgICAgICAgICAgLy8gSW50ZXJuYWwgZm9yayAtIHJlcG9ydCBmcmFtZSBiZWdpbgorICAgICAgICAgICAgbWFzdGVyX3RoLT50aC50aF9mcmFtZV90aW1lICA9IHRtcF90aW1lOworICAgICAgICAgICAgaWYgKCBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9PSAzICkKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfcmVnaW9uX3RpbWUgPSB0bXBfdGltZTsKKyAgICAgICAgfSBlbHNlIC8vIG9ubHkgb25lIG5vdGlmaWNhdGlvbiBzY2hlbWUgKGVpdGhlciAic3VibWl0IiBvciAiZm9ya2luZy9qb2luZWQiLCBub3QgYm90aCkKKyNlbmRpZiAvKiBVU0VfSVRUX05PVElGWSAqLworICAgICAgICBpZiAoICggX19pdHRfZnJhbWVfYmVnaW5fdjNfcHRyIHx8IEtNUF9JVFRfREVCVUcgKSAmJgorICAgICAgICAgICAgIF9fa21wX2Zvcmtqb2luX2ZyYW1lcyAmJiAhX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgKQorICAgICAgICB7IC8vIE1hcmsgc3RhcnQgb2YgInBhcmFsbGVsIiByZWdpb24gZm9yIFZUdW5lLgorICAgICAgICAgICAgX19rbXBfaXR0X3JlZ2lvbl9mb3JraW5nKGd0aWQsIHRlYW0tPnQudF9ucHJvYywgMCk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgLyogbm93IGdvIG9uIGFuZCBkbyB0aGUgd29yayAqLworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0gPT0gX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfdGVhbSApOworICAgIEtNUF9NQigpOworICAgIEtGX1RSQUNFKDEwLCAoIl9fa21wX2ludGVybmFsX2ZvcmsgOiByb290PSVwLCB0ZWFtPSVwLCBtYXN0ZXJfdGg9JXAsIGd0aWQ9JWRcbiIsCisgICAgICAgICAgICAgICAgICByb290LCB0ZWFtLCBtYXN0ZXJfdGgsIGd0aWQpKTsKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBpZiAoIF9faXR0X3N0YWNrX2NhbGxlcl9jcmVhdGVfcHRyICkgeworICAgICAgICB0ZWFtLT50LnRfc3RhY2tfaWQgPSBfX2ttcF9pdHRfc3RhY2tfY2FsbGVyX2NyZWF0ZSgpOyAvLyBjcmVhdGUgbmV3IHN0YWNrIHN0aXRjaGluZyBpZCBiZWZvcmUgZW50ZXJpbmcgZm9yayBiYXJyaWVyCisgICAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgaWYgKCBhcCApICAgLy8gQUM6IHNraXAgX19rbXBfaW50ZXJuYWxfZm9yayBhdCB0ZWFtcyBjb25zdHJ1Y3QsIGxldCBvbmx5IG1hc3RlciB0aHJlYWRzIGV4ZWN1dGUKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgIHsKKyAgICAgICAgX19rbXBfaW50ZXJuYWxfZm9yayggbG9jLCBndGlkLCB0ZWFtICk7CisgICAgICAgIEtGX1RSQUNFKDEwLCAoIl9fa21wX2ludGVybmFsX2ZvcmsgOiBhZnRlciA6IHJvb3Q9JXAsIHRlYW09JXAsIG1hc3Rlcl90aD0lcCwgZ3RpZD0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICByb290LCB0ZWFtLCBtYXN0ZXJfdGgsIGd0aWQpKTsKKyAgICB9CisKKyAgICBpZiAoY2FsbF9jb250ZXh0ID09IGZvcmtfY29udGV4dF9nbnUpIHsKKyAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2ZvcmtfY2FsbDogcGFyYWxsZWwgZXhpdCBUIyVkXG4iLCBndGlkICkpOworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgICAvKiBJbnZva2UgbWljcm90YXNrIGZvciBNQVNURVIgdGhyZWFkICovCisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2ZvcmtfY2FsbDogVCMlZCglZDowKSBpbnZva2UgbWljcm90YXNrID0gJXBcbiIsCisgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0ZWFtLT50LnRfcGtmbiApICk7CisgICAgfSAgLy8gRU5EIG9mIHRpbWVyIEtNUF9mb3JrX2NhbGwgYmxvY2sKKworICAgIHsKKyAgICAgICAgS01QX1RJTUVfQkxPQ0soT01QX3dvcmspOworICAgICAgICAvLyBLTVBfVElNRV9ERVZFTE9QRVJfQkxPQ0soVVNFUl9tYXN0ZXJfaW52b2tlKTsKKyAgICAgICAgaWYgKCEgdGVhbS0+dC50X2ludm9rZSggZ3RpZCApKSB7CisgICAgICAgICAgICBLTVBfQVNTRVJUMiggMCwgImNhbm5vdCBpbnZva2UgbWljcm90YXNrIGZvciBNQVNURVIgdGhyZWFkIiApOworICAgICAgICB9CisgICAgfQorICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9mb3JrX2NhbGw6IFQjJWQoJWQ6MCkgZG9uZSBtaWNyb3Rhc2sgPSAlcFxuIiwKKyAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0ZWFtLT50LnRfcGtmbiApICk7CisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfZm9ya19jYWxsOiBwYXJhbGxlbCBleGl0IFQjJWRcbiIsIGd0aWQgKSk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIG1hc3Rlcl90aC0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfb3ZlcmhlYWQ7CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4gVFJVRTsKK30KKworI2lmIE9NUFRfU1VQUE9SVAorc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9qb2luX3Jlc3RvcmVfc3RhdGUoCisgICAga21wX2luZm9fdCAqdGhyZWFkLAorICAgIGttcF90ZWFtX3QgKnRlYW0pCit7CisgICAgLy8gcmVzdG9yZSBzdGF0ZSBvdXRzaWRlIHRoZSByZWdpb24KKyAgICB0aHJlYWQtPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSAoKHRlYW0tPnQudF9zZXJpYWxpemVkKSA/CisgICAgICAgIG9tcHRfc3RhdGVfd29ya19zZXJpYWwgOiBvbXB0X3N0YXRlX3dvcmtfcGFyYWxsZWwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX2pvaW5fb21wdCgKKyAgICBrbXBfaW5mb190ICp0aHJlYWQsCisgICAga21wX3RlYW1fdCAqdGVhbSwKKyAgICBvbXB0X3BhcmFsbGVsX2lkX3QgcGFyYWxsZWxfaWQsCisgICAgZm9ya19jb250ZXh0X2UgZm9ya19jb250ZXh0KQoreworICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kKSkgeworICAgICAgICBvbXB0X3Rhc2tfaW5mb190ICp0YXNrX2luZm8gPSBfX29tcHRfZ2V0X3Rhc2tpbmZvKDApOworICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kKSgKKyAgICAgICAgICAgIHBhcmFsbGVsX2lkLCB0YXNrX2luZm8tPnRhc2tfaWQsIE9NUFRfSU5WT0tFUihmb3JrX2NvbnRleHQpKTsKKyAgICB9CisKKyAgICBfX2ttcF9qb2luX3Jlc3RvcmVfc3RhdGUodGhyZWFkLHRlYW0pOworfQorI2VuZGlmCisKK3ZvaWQKK19fa21wX2pvaW5fY2FsbChpZGVudF90ICpsb2MsIGludCBndGlkCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICAgICAsIGVudW0gZm9ya19jb250ZXh0X2UgZm9ya19jb250ZXh0CisjZW5kaWYKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgICAgLCBpbnQgZXhpdF90ZWFtcworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCispCit7CisgICAgS01QX1RJTUVfREVWRUxPUEVSX0JMT0NLKEtNUF9qb2luX2NhbGwpOworICAgIGttcF90ZWFtX3QgICAgICp0ZWFtOworICAgIGttcF90ZWFtX3QgICAgICpwYXJlbnRfdGVhbTsKKyAgICBrbXBfaW5mb190ICAgICAqbWFzdGVyX3RoOworICAgIGttcF9yb290X3QgICAgICpyb290OworICAgIGludCAgICAgICAgICAgICBtYXN0ZXJfYWN0aXZlOworICAgIGludCAgICAgICAgICAgICBpOworCisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2pvaW5fY2FsbDogZW50ZXIgVCMlZFxuIiwgZ3RpZCApKTsKKworICAgIC8qIHNldHVwIGN1cnJlbnQgZGF0YSAqLworICAgIG1hc3Rlcl90aCAgICAgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAgcm9vdCAgICAgICAgICA9IG1hc3Rlcl90aC0+dGgudGhfcm9vdDsKKyAgICB0ZWFtICAgICAgICAgID0gbWFzdGVyX3RoLT50aC50aF90ZWFtOworICAgIHBhcmVudF90ZWFtICAgPSB0ZWFtLT50LnRfcGFyZW50OworCisgICAgbWFzdGVyX3RoLT50aC50aF9pZGVudCA9IGxvYzsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgbWFzdGVyX3RoLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID0gb21wdF9zdGF0ZV9vdmVyaGVhZDsKKyAgICB9CisjZW5kaWYKKworI2lmIEtNUF9ERUJVRworICAgIGlmICggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKSB7CisgICAgICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfam9pbl9jYWxsOiBUIyVkLCBvbGQgdGVhbSA9ICVwIG9sZCB0YXNrX3RlYW0gPSAlcCwgdGhfdGFza190ZWFtID0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggbWFzdGVyX3RoICksIHRlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X3Rhc2tfdGVhbVttYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVdLCBtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfdGVhbSkgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggbWFzdGVyX3RoLT50aC50aF90YXNrX3RlYW0gPT0gdGVhbS0+dC50X3Rhc2tfdGVhbVttYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVdICk7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiggdGVhbS0+dC50X3NlcmlhbGl6ZWQgKSB7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgaWYgKCBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX21pY3JvdGFzayApIHsKKyAgICAgICAgICAgIC8vIFdlIGFyZSBpbiB0ZWFtcyBjb25zdHJ1Y3QKKyAgICAgICAgICAgIGludCBsZXZlbCA9IHRlYW0tPnQudF9sZXZlbDsKKyAgICAgICAgICAgIGludCB0bGV2ZWwgPSBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX2xldmVsOworICAgICAgICAgICAgaWYgKCBsZXZlbCA9PSB0bGV2ZWwgKSB7CisgICAgICAgICAgICAgICAgLy8gQUM6IHdlIGhhdmVuJ3QgaW5jcmVtZW50ZWQgaXQgZWFybGllciBhdCBzdGFydCBvZiB0ZWFtcyBjb25zdHJ1Y3QsCisgICAgICAgICAgICAgICAgLy8gICAgIHNvIGRvIGl0IGhlcmUgLSBhdCB0aGUgZW5kIG9mIHRlYW1zIGNvbnN0cnVjdAorICAgICAgICAgICAgICAgIHRlYW0tPnQudF9sZXZlbCsrOworICAgICAgICAgICAgfSBlbHNlIGlmICggbGV2ZWwgPT0gdGxldmVsICsgMSApIHsKKyAgICAgICAgICAgICAgICAvLyBBQzogd2UgYXJlIGV4aXRpbmcgcGFyYWxsZWwgaW5zaWRlIHRlYW1zLCBuZWVkIHRvIGluY3JlbWVudCBzZXJpYWxpemF0aW9uCisgICAgICAgICAgICAgICAgLy8gICAgIGluIG9yZGVyIHRvIHJlc3RvcmUgaXQgaW4gdGhlIG5leHQgY2FsbCB0byBfX2ttcGNfZW5kX3NlcmlhbGl6ZWRfcGFyYWxsZWwKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfc2VyaWFsaXplZCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICAgICAgX19rbXBjX2VuZF9zZXJpYWxpemVkX3BhcmFsbGVsKCBsb2MsIGd0aWQgKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgICAgICBfX2ttcF9qb2luX3Jlc3RvcmVfc3RhdGUobWFzdGVyX3RoLCBwYXJlbnRfdGVhbSk7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtYXN0ZXJfYWN0aXZlID0gdGVhbS0+dC50X21hc3Rlcl9hY3RpdmU7CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGlmICghZXhpdF90ZWFtcykKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgIHsKKyAgICAgICAgLy8gQUM6IE5vIGJhcnJpZXIgZm9yIGludGVybmFsIHRlYW1zIGF0IGV4aXQgZnJvbSB0ZWFtcyBjb25zdHJ1Y3QuCisgICAgICAgIC8vICAgICBCdXQgdGhlcmUgaXMgYmFycmllciBmb3IgZXh0ZXJuYWwgdGVhbSAobGVhZ3VlKS4KKyAgICAgICAgX19rbXBfaW50ZXJuYWxfam9pbiggbG9jLCBndGlkLCB0ZWFtICk7CisgICAgfQorI2lmIE9NUF80MF9FTkFCTEVECisgICAgZWxzZSB7CisgICAgICAgIG1hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZSA9IDA7IC8vIEFDOiBubyB0YXNraW5nIGluIHRlYW1zIChvdXQgb2YgYW55IHBhcmFsbGVsKQorICAgIH0KKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisgICAgS01QX01CKCk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBvbXB0X3BhcmFsbGVsX2lkX3QgcGFyYWxsZWxfaWQgPSB0ZWFtLT50Lm9tcHRfdGVhbV9pbmZvLnBhcmFsbGVsX2lkOworI2VuZGlmCisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgaWYgKCBfX2l0dF9zdGFja19jYWxsZXJfY3JlYXRlX3B0ciApIHsKKyAgICAgICAgX19rbXBfaXR0X3N0YWNrX2NhbGxlcl9kZXN0cm95KCAoX19pdHRfY2FsbGVyKXRlYW0tPnQudF9zdGFja19pZCApOyAvLyBkZXN0cm95IHRoZSBzdGFjayBzdGl0Y2hpbmcgaWQgYWZ0ZXIgam9pbiBiYXJyaWVyCisgICAgfQorCisgICAgLy8gTWFyayBlbmQgb2YgInBhcmFsbGVsIiByZWdpb24gZm9yIFZUdW5lLgorICAgIGlmICggdGVhbS0+dC50X2FjdGl2ZV9sZXZlbCA9PSAxCisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgICAgICYmICFtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX21pY3JvdGFzayAvKiBub3QgaW4gdGVhbXMgY29uc3RydWN0ICovCisjIGVuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgKSB7CisgICAgICAgIG1hc3Rlcl90aC0+dGgudGhfaWRlbnQgPSBsb2M7CisgICAgICAgIC8vIG9ubHkgb25lIG5vdGlmaWNhdGlvbiBzY2hlbWUgKGVpdGhlciAic3VibWl0IiBvciAiZm9ya2luZy9qb2luZWQiLCBub3QgYm90aCkKKyAgICAgICAgaWYgKCAoIF9faXR0X2ZyYW1lX3N1Ym1pdF92M19wdHIgfHwgS01QX0lUVF9ERUJVRyApICYmIF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDMgKQorICAgICAgICAgICAgX19rbXBfaXR0X2ZyYW1lX3N1Ym1pdCggZ3RpZCwgdGVhbS0+dC50X3JlZ2lvbl90aW1lLCBtYXN0ZXJfdGgtPnRoLnRoX2ZyYW1lX3RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBsb2MsIG1hc3Rlcl90aC0+dGgudGhfdGVhbV9ucHJvYywgMSApOworICAgICAgICBlbHNlIGlmICggKCBfX2l0dF9mcmFtZV9lbmRfdjNfcHRyIHx8IEtNUF9JVFRfREVCVUcgKSAmJgorICAgICAgICAgICAgISBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSAmJiBfX2ttcF9mb3Jram9pbl9mcmFtZXMgKQorICAgICAgICAgICAgX19rbXBfaXR0X3JlZ2lvbl9qb2luZWQoIGd0aWQgKTsKKyAgICB9IC8vIGFjdGl2ZV9sZXZlbCA9PSAxCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBpZiAoIG1hc3Rlcl90aC0+dGgudGhfdGVhbXNfbWljcm90YXNrICYmCisgICAgICAgICAhZXhpdF90ZWFtcyAmJgorICAgICAgICAgdGVhbS0+dC50X3BrZm4gIT0gKG1pY3JvdGFza190KV9fa21wX3RlYW1zX21hc3RlciAmJgorICAgICAgICAgdGVhbS0+dC50X2xldmVsID09IG1hc3Rlcl90aC0+dGgudGhfdGVhbXNfbGV2ZWwgKyAxICkgeworICAgICAgICAvLyBBQzogV2UgbmVlZCB0byBsZWF2ZSB0aGUgdGVhbSBzdHJ1Y3R1cmUgaW50YWN0IGF0IHRoZSBlbmQKKyAgICAgICAgLy8gICAgIG9mIHBhcmFsbGVsIGluc2lkZSB0aGUgdGVhbXMgY29uc3RydWN0LCBzbyB0aGF0IGF0IHRoZSBuZXh0CisgICAgICAgIC8vICAgICBwYXJhbGxlbCBzYW1lIChob3QpIHRlYW0gd29ya3MsIG9ubHkgYWRqdXN0IG5lc3RpbmcgbGV2ZWxzCisKKyAgICAgICAgLyogRGVjcmVtZW50IG91ciBuZXN0ZWQgZGVwdGggbGV2ZWwgKi8KKyAgICAgICAgdGVhbS0+dC50X2xldmVsIC0tOworICAgICAgICB0ZWFtLT50LnRfYWN0aXZlX2xldmVsIC0tOworICAgICAgICBLTVBfVEVTVF9USEVOX0RFQzMyKCAoa21wX2ludDMyKikgJnJvb3QtPnIucl9pbl9wYXJhbGxlbCApOworCisgICAgICAgIC8qIFJlc3RvcmUgbnVtYmVyIG9mIHRocmVhZHMgaW4gdGhlIHRlYW0gaWYgbmVlZGVkICovCisgICAgICAgIGlmICggbWFzdGVyX3RoLT50aC50aF90ZWFtX25wcm9jIDwgbWFzdGVyX3RoLT50aC50aF90ZWFtc19zaXplLm50aCApIHsKKyAgICAgICAgICAgIGludCBvbGRfbnVtID0gbWFzdGVyX3RoLT50aC50aF90ZWFtX25wcm9jOworICAgICAgICAgICAgaW50IG5ld19udW0gPSBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX3NpemUubnRoOworICAgICAgICAgICAga21wX2luZm9fdCAqKm90aGVyX3RocmVhZHMgPSB0ZWFtLT50LnRfdGhyZWFkczsKKyAgICAgICAgICAgIHRlYW0tPnQudF9ucHJvYyA9IG5ld19udW07CisgICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IG9sZF9udW07ICsraSApIHsKKyAgICAgICAgICAgICAgICBvdGhlcl90aHJlYWRzW2ldLT50aC50aF90ZWFtX25wcm9jID0gbmV3X251bTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEFkanVzdCBzdGF0ZXMgb2Ygbm9uLXVzZWQgdGhyZWFkcyBvZiB0aGUgdGVhbQorICAgICAgICAgICAgZm9yICggaSA9IG9sZF9udW07IGkgPCBuZXdfbnVtOyArK2kgKSB7CisgICAgICAgICAgICAgICAgLy8gUmUtaW5pdGlhbGl6ZSB0aHJlYWQncyBiYXJyaWVyIGRhdGEuCisgICAgICAgICAgICAgICAgaW50IGI7CisgICAgICAgICAgICAgICAga21wX2JhbGlnbl90ICogYmFsaWduID0gb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfYmFyOworICAgICAgICAgICAgICAgIGZvciAoIGIgPSAwOyBiIDwgYnNfbGFzdF9iYXJyaWVyOyArKyBiICkgeworICAgICAgICAgICAgICAgICAgICBiYWxpZ25bIGIgXS5iYi5iX2Fycml2ZWQgICAgICAgID0gdGVhbS0+dC50X2JhclsgYiBdLmJfYXJyaXZlZDsKKyAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChiYWxpZ25bIGIgXS5iYi53YWl0X2ZsYWcgIT0gS01QX0JBUlJJRVJfUEFSRU5UX0ZMQUcpOworI2lmIFVTRV9ERUJVR0dFUgorICAgICAgICAgICAgICAgICAgICBiYWxpZ25bIGIgXS5iYi5iX3dvcmtlcl9hcnJpdmVkID0gdGVhbS0+dC50X2JhclsgYiBdLmJfdGVhbV9hcnJpdmVkOworI2VuZGlmCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFN5bmNocm9uaXplIHRocmVhZCdzIHRhc2sgc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfdGFza19zdGF0ZSA9IG1hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgICAgICBfX2ttcF9qb2luX29tcHQobWFzdGVyX3RoLCBwYXJlbnRfdGVhbSwgcGFyYWxsZWxfaWQsIGZvcmtfY29udGV4dCk7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworICAgIC8qIGRvIGNsZWFudXAgYW5kIHJlc3RvcmUgdGhlIHBhcmVudCB0ZWFtICovCisgICAgbWFzdGVyX3RoLT50aC50aF9pbmZvIC5kcy5kc190aWQgPSB0ZWFtLT50LnRfbWFzdGVyX3RpZDsKKyAgICBtYXN0ZXJfdGgtPnRoLnRoX2xvY2FsLnRoaXNfY29uc3RydWN0ID0gdGVhbS0+dC50X21hc3Rlcl90aGlzX2NvbnM7CisKKyAgICBtYXN0ZXJfdGgtPnRoLnRoX2Rpc3BhdGNoID0KKyAgICAgICAgICAgICAgICAmIHBhcmVudF90ZWFtLT50LnRfZGlzcGF0Y2hbIHRlYW0tPnQudF9tYXN0ZXJfdGlkIF07CisKKyAgICAvKiBqYzogVGhlIGZvbGxvd2luZyBsb2NrIGhhcyBpbnN0cnVjdGlvbnMgd2l0aCBSRUwgYW5kIEFDUSBzZW1hbnRpY3MsCisgICAgICAgc2VwYXJhdGluZyB0aGUgcGFyYWxsZWwgdXNlciBjb2RlIGNhbGxlZCBpbiB0aGlzIHBhcmFsbGVsIHJlZ2lvbgorICAgICAgIGZyb20gdGhlIHNlcmlhbCB1c2VyIGNvZGUgY2FsbGVkIGFmdGVyIHRoaXMgZnVuY3Rpb24gcmV0dXJucy4KKyAgICAqLworICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGlmICggIW1hc3Rlcl90aC0+dGgudGhfdGVhbXNfbWljcm90YXNrIHx8IHRlYW0tPnQudF9sZXZlbCA+IG1hc3Rlcl90aC0+dGgudGhfdGVhbXNfbGV2ZWwgKQorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgeworICAgICAgICAvKiBEZWNyZW1lbnQgb3VyIG5lc3RlZCBkZXB0aCBsZXZlbCAqLworICAgICAgICBLTVBfVEVTVF9USEVOX0RFQzMyKCAoa21wX2ludDMyKikgJnJvb3QtPnIucl9pbl9wYXJhbGxlbCApOworICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKCByb290LT5yLnJfaW5fcGFyYWxsZWwgPj0gMCApOworCisgICAgS0ZfVFJBQ0UoIDEwLCAoIl9fa21wX2pvaW5fY2FsbDE6IFQjJWQsIHRoaXNfdGhyZWFkPSVwIHRlYW09JXBcbiIsCisgICAgICAgICAgICAgICAgICAgMCwgbWFzdGVyX3RoLCB0ZWFtICkgKTsKKyAgICBfX2ttcF9wb3BfY3VycmVudF90YXNrX2Zyb21fdGhyZWFkKCBtYXN0ZXJfdGggKTsKKworI2lmIE9NUF80MF9FTkFCTEVEICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAvLworICAgIC8vIFJlc3RvcmUgbWFzdGVyIHRocmVhZCdzIHBhcnRpdGlvbi4KKyAgICAvLworICAgIG1hc3Rlcl90aC0+dGgudGhfZmlyc3RfcGxhY2UgPSB0ZWFtLT50LnRfZmlyc3RfcGxhY2U7CisgICAgbWFzdGVyX3RoLT50aC50aF9sYXN0X3BsYWNlID0gdGVhbS0+dC50X2xhc3RfcGxhY2U7CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworICAgIHVwZGF0ZUhXRlBDb250cm9sICh0ZWFtKTsKKworICAgIGlmICggcm9vdC0+ci5yX2FjdGl2ZSAhPSBtYXN0ZXJfYWN0aXZlICkKKyAgICAgICAgcm9vdC0+ci5yX2FjdGl2ZSA9IG1hc3Rlcl9hY3RpdmU7CisKKyAgICBfX2ttcF9mcmVlX3RlYW0oIHJvb3QsIHRlYW0gVVNFX05FU1RFRF9IT1RfQVJHKG1hc3Rlcl90aCkgKTsgLy8gdGhpcyB3aWxsIGZyZWUgd29ya2VyIHRocmVhZHMKKworICAgIC8qIHRoaXMgcmFjZSB3YXMgZnVuIHRvIGZpbmQuICBtYWtlIHN1cmUgdGhlIGZvbGxvd2luZyBpcyBpbiB0aGUgY3JpdGljYWwKKyAgICAgKiByZWdpb24gb3RoZXJ3aXNlIGFzc2VydGlvbnMgbWF5IGZhaWwgb2NjYXNpb25hbGx5IHNpbmNlIHRoZSBvbGQgdGVhbQorICAgICAqIG1heSBiZSByZWFsbG9jYXRlZCBhbmQgdGhlIGhpZXJhcmNoeSBhcHBlYXJzIGluY29uc2lzdGVudC4gIGl0IGlzCisgICAgICogYWN0dWFsbHkgc2FmZSB0byBydW4gYW5kIHdvbid0IGNhdXNlIGFueSBidWdzLCBidXQgd2lsbCBjYXVzZSB0aG9zZQorICAgICAqIGFzc2VydGlvbiBmYWlsdXJlcy4gIGl0J3Mgb25seSBvbmUgZGVyZWYmYXNzaWduIHNvIG1pZ2h0IGFzIHdlbGwgcHV0IHRoaXMKKyAgICAgKiBpbiB0aGUgY3JpdGljYWwgcmVnaW9uICovCisgICAgbWFzdGVyX3RoLT50aC50aF90ZWFtICAgICAgICA9ICAgcGFyZW50X3RlYW07CisgICAgbWFzdGVyX3RoLT50aC50aF90ZWFtX25wcm9jICA9ICAgcGFyZW50X3RlYW0tPnQudF9ucHJvYzsKKyAgICBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1fbWFzdGVyID0gICBwYXJlbnRfdGVhbS0+dC50X3RocmVhZHNbMF07CisgICAgbWFzdGVyX3RoLT50aC50aF90ZWFtX3NlcmlhbGl6ZWQgPSBwYXJlbnRfdGVhbS0+dC50X3NlcmlhbGl6ZWQ7CisKKyAgICAvKiByZXN0b3JlIHNlcmlhbGl6ZWQgdGVhbSwgaWYgbmVlZCBiZSAqLworICAgIGlmKCBwYXJlbnRfdGVhbS0+dC50X3NlcmlhbGl6ZWQgJiYKKyAgICAgICAgcGFyZW50X3RlYW0gIT0gbWFzdGVyX3RoLT50aC50aF9zZXJpYWxfdGVhbSAmJgorICAgICAgICBwYXJlbnRfdGVhbSAhPSByb290LT5yLnJfcm9vdF90ZWFtICkgeworICAgICAgICAgICAgX19rbXBfZnJlZV90ZWFtKCByb290LCBtYXN0ZXJfdGgtPnRoLnRoX3NlcmlhbF90ZWFtIFVTRV9ORVNURURfSE9UX0FSRyhOVUxMKSApOworICAgICAgICAgICAgbWFzdGVyX3RoLT50aC50aF9zZXJpYWxfdGVhbSA9IHBhcmVudF90ZWFtOworICAgIH0KKworICAgIGlmICggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKSB7CisgICAgICAgIGlmIChtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVfdG9wID4gMCkgeyAvLyBSZXN0b3JlIHRhc2sgc3RhdGUgZnJvbSBtZW1vIHN0YWNrCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKG1hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZV9tZW1vX3N0YWNrKTsKKyAgICAgICAgICAgIC8vIFJlbWVtYmVyIG1hc3RlcidzIHN0YXRlIGlmIHdlIHJlLXVzZSB0aGlzIG5lc3RlZCBob3QgdGVhbQorICAgICAgICAgICAgbWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlX21lbW9fc3RhY2tbbWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlX3RvcF0gPSBtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGU7CisgICAgICAgICAgICAtLW1hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZV90b3A7IC8vIHBvcAorICAgICAgICAgICAgLy8gTm93IHJlc3RvcmUgc3RhdGUgYXQgdGhpcyBsZXZlbAorICAgICAgICAgICAgbWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlID0gbWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlX21lbW9fc3RhY2tbbWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlX3RvcF07CisgICAgICAgIH0KKyAgICAgICAgLy8gQ29weSB0aGUgdGFzayB0ZWFtIGZyb20gdGhlIHBhcmVudCB0ZWFtIHRvIHRoZSBtYXN0ZXIgdGhyZWFkCisgICAgICAgIG1hc3Rlcl90aC0+dGgudGhfdGFza190ZWFtID0gcGFyZW50X3RlYW0tPnQudF90YXNrX3RlYW1bbWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlXTsKKyAgICAgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF9qb2luX2NhbGw6IE1hc3RlciBUIyVkIHJlc3RvcmluZyB0YXNrX3RlYW0gJXAgLyB0ZWFtICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggbWFzdGVyX3RoICksIG1hc3Rlcl90aC0+dGgudGhfdGFza190ZWFtLCBwYXJlbnRfdGVhbSApICk7CisgICAgfQorCisgICAgIC8vIFRPRE86IEdFSCAtIGNhbm5vdCBkbyB0aGlzIGFzc2VydGlvbiBiZWNhdXNlIHJvb3QgdGhyZWFkIG5vdCBzZXQgdXAgYXMgZXhlY3V0aW5nCisgICAgIC8vIEtNUF9BU1NFUlQoIG1hc3Rlcl90aC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9mbGFncy5leGVjdXRpbmcgPT0gMCApOworICAgICBtYXN0ZXJfdGgtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfZmxhZ3MuZXhlY3V0aW5nID0gMTsKKworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIF9fa21wX2pvaW5fb21wdChtYXN0ZXJfdGgsIHBhcmVudF90ZWFtLCBwYXJhbGxlbF9pZCwgZm9ya19jb250ZXh0KTsKKyAgICB9CisjZW5kaWYKKworICAgIEtNUF9NQigpOworICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9qb2luX2NhbGw6IGV4aXQgVCMlZFxuIiwgZ3RpZCApKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogQ2hlY2sgd2hldGhlciB3ZSBzaG91bGQgcHVzaCBhbiBpbnRlcm5hbCBjb250cm9sIHJlY29yZCBvbnRvIHRoZQorICAgc2VyaWFsIHRlYW0gc3RhY2suICBJZiBzbywgZG8gaXQuICAqLwordm9pZAorX19rbXBfc2F2ZV9pbnRlcm5hbF9jb250cm9scyAoIGttcF9pbmZvX3QgKiB0aHJlYWQgKQoreworCisgICAgaWYgKCB0aHJlYWQtPnRoLnRoX3RlYW0gIT0gdGhyZWFkLT50aC50aF9zZXJpYWxfdGVhbSApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAodGhyZWFkLT50aC50aF90ZWFtLT50LnRfc2VyaWFsaXplZCA+IDEpIHsKKyAgICAgICAgaW50IHB1c2ggPSAwOworCisgICAgICAgIGlmICh0aHJlYWQtPnRoLnRoX3RlYW0tPnQudF9jb250cm9sX3N0YWNrX3RvcCA9PSBOVUxMKSB7CisgICAgICAgICAgICBwdXNoID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICggdGhyZWFkLT50aC50aF90ZWFtLT50LnRfY29udHJvbF9zdGFja190b3AtPnNlcmlhbF9uZXN0aW5nX2xldmVsICE9CisgICAgICAgICAgICAgICAgIHRocmVhZC0+dGgudGhfdGVhbS0+dC50X3NlcmlhbGl6ZWQgKSB7CisgICAgICAgICAgICAgICAgcHVzaCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHB1c2gpIHsgIC8qIHB1c2ggYSByZWNvcmQgb24gdGhlIHNlcmlhbCB0ZWFtJ3Mgc3RhY2sgKi8KKyAgICAgICAgICAgIGttcF9pbnRlcm5hbF9jb250cm9sX3QgKiBjb250cm9sID0gKGttcF9pbnRlcm5hbF9jb250cm9sX3QgKikgX19rbXBfYWxsb2NhdGUoc2l6ZW9mKGttcF9pbnRlcm5hbF9jb250cm9sX3QpKTsKKworICAgICAgICAgICAgY29weV9pY3ZzKCBjb250cm9sLCAmIHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzICk7CisKKyAgICAgICAgICAgIGNvbnRyb2wtPnNlcmlhbF9uZXN0aW5nX2xldmVsID0gdGhyZWFkLT50aC50aF90ZWFtLT50LnRfc2VyaWFsaXplZDsKKworICAgICAgICAgICAgY29udHJvbC0+bmV4dCA9IHRocmVhZC0+dGgudGhfdGVhbS0+dC50X2NvbnRyb2xfc3RhY2tfdG9wOworICAgICAgICAgICAgdGhyZWFkLT50aC50aF90ZWFtLT50LnRfY29udHJvbF9zdGFja190b3AgPSBjb250cm9sOworICAgICAgICB9CisgICAgfQorfQorCisvKiBDaGFuZ2VzIHNldF9ucHJvYyAqLwordm9pZAorX19rbXBfc2V0X251bV90aHJlYWRzKCBpbnQgbmV3X250aCwgaW50IGd0aWQgKQoreworICAgIGttcF9pbmZvX3QgKnRocmVhZDsKKyAgICBrbXBfcm9vdF90ICpyb290OworCisgICAgS0ZfVFJBQ0UoIDEwLCAoIl9fa21wX3NldF9udW1fdGhyZWFkczogbmV3IF9fa21wX250aCA9ICVkXG4iLCBuZXdfbnRoICkpOworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisKKyAgICBpZiAobmV3X250aCA8IDEpCisgICAgICAgIG5ld19udGggPSAxOworICAgIGVsc2UgaWYgKG5ld19udGggPiBfX2ttcF9tYXhfbnRoKQorICAgICAgICBuZXdfbnRoID0gX19rbXBfbWF4X250aDsKKworICAgIEtNUF9DT1VOVF9WQUxVRShPTVBfc2V0X251bXRocmVhZHMsIG5ld19udGgpOworICAgIHRocmVhZCA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisKKyAgICBfX2ttcF9zYXZlX2ludGVybmFsX2NvbnRyb2xzKCB0aHJlYWQgKTsKKworICAgIHNldF9fbnByb2MoIHRocmVhZCwgbmV3X250aCApOworCisgICAgLy8KKyAgICAvLyBJZiB0aGlzIG9tcF9zZXRfbnVtX3RocmVhZHMoKSBjYWxsIHdpbGwgY2F1c2UgdGhlIGhvdCB0ZWFtIHNpemUgdG8gYmUKKyAgICAvLyByZWR1Y2VkIChpbiB0aGUgYWJzZW5jZSBvZiBhIG51bV90aHJlYWRzIGNsYXVzZSksIHRoZW4gcmVkdWNlIGl0IG5vdywKKyAgICAvLyByYXRoZXIgdGhhbiB3YWl0aW5nIGZvciB0aGUgbmV4dCBwYXJhbGxlbCByZWdpb24uCisgICAgLy8KKyAgICByb290ID0gdGhyZWFkLT50aC50aF9yb290OworICAgIGlmICggX19rbXBfaW5pdF9wYXJhbGxlbCAmJiAoICEgcm9vdC0+ci5yX2FjdGl2ZSApCisgICAgICAmJiAoIHJvb3QtPnIucl9ob3RfdGVhbS0+dC50X25wcm9jID4gbmV3X250aCApCisjaWYgS01QX05FU1RFRF9IT1RfVEVBTVMKKyAgICAgICYmIF9fa21wX2hvdF90ZWFtc19tYXhfbGV2ZWwgJiYgIV9fa21wX2hvdF90ZWFtc19tb2RlCisjZW5kaWYKKyAgICApIHsKKyAgICAgICAga21wX3RlYW1fdCAqaG90X3RlYW0gPSByb290LT5yLnJfaG90X3RlYW07CisgICAgICAgIGludCBmOworCisgICAgICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7CisKKworICAgICAgICAvLyBSZWxlYXNlIHRoZSBleHRyYSB0aHJlYWRzIHdlIGRvbid0IG5lZWQgYW55IG1vcmUuCisgICAgICAgIGZvciAoIGYgPSBuZXdfbnRoOyAgZiA8IGhvdF90ZWFtLT50LnRfbnByb2M7IGYrKyApIHsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGhvdF90ZWFtLT50LnRfdGhyZWFkc1tmXSAhPSBOVUxMICk7CisgICAgICAgICAgICBpZiAoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjKSB7CisgICAgICAgICAgICAgICAgLy8gV2hlbiBkZWNyZWFzaW5nIHRlYW0gc2l6ZSwgdGhyZWFkcyBubyBsb25nZXIgaW4gdGhlIHRlYW0gc2hvdWxkIHVucmVmIHRhc2sgdGVhbS4KKyAgICAgICAgICAgICAgICBob3RfdGVhbS0+dC50X3RocmVhZHNbZl0tPnRoLnRoX3Rhc2tfdGVhbSA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfX2ttcF9mcmVlX3RocmVhZCggaG90X3RlYW0tPnQudF90aHJlYWRzW2ZdICk7CisgICAgICAgICAgICBob3RfdGVhbS0+dC50X3RocmVhZHNbZl0gPSAgTlVMTDsKKyAgICAgICAgfQorICAgICAgICBob3RfdGVhbS0+dC50X25wcm9jID0gbmV3X250aDsKKyNpZiBLTVBfTkVTVEVEX0hPVF9URUFNUworICAgICAgICBpZiggdGhyZWFkLT50aC50aF9ob3RfdGVhbXMgKSB7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBob3RfdGVhbSA9PSB0aHJlYWQtPnRoLnRoX2hvdF90ZWFtc1swXS5ob3RfdGVhbSApOworICAgICAgICAgICAgdGhyZWFkLT50aC50aF9ob3RfdGVhbXNbMF0uaG90X3RlYW1fbnRoID0gbmV3X250aDsKKyAgICAgICAgfQorI2VuZGlmCisKKworICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfZm9ya2pvaW5fbG9jayApOworCisgICAgICAgIC8vCisgICAgICAgIC8vIFVwZGF0ZSB0aGUgdF9ucHJvYyBmaWVsZCBpbiB0aGUgdGhyZWFkcyB0aGF0IGFyZSBzdGlsbCBhY3RpdmUuCisgICAgICAgIC8vCisgICAgICAgIGZvciggZj0wIDsgZiA8IG5ld19udGg7IGYrKyApIHsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGhvdF90ZWFtLT50LnRfdGhyZWFkc1tmXSAhPSBOVUxMICk7CisgICAgICAgICAgICBob3RfdGVhbS0+dC50X3RocmVhZHNbZl0tPnRoLnRoX3RlYW1fbnByb2MgPSBuZXdfbnRoOworICAgICAgICB9CisgICAgICAgIC8vIFNwZWNpYWwgZmxhZyBpbiBjYXNlIG9tcF9zZXRfbnVtX3RocmVhZHMoKSBjYWxsCisgICAgICAgIGhvdF90ZWFtLT50LnRfc2l6ZV9jaGFuZ2VkID0gLTE7CisgICAgfQorfQorCisvKiBDaGFuZ2VzIG1heF9hY3RpdmVfbGV2ZWxzICovCit2b2lkCitfX2ttcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMoIGludCBndGlkLCBpbnQgbWF4X2FjdGl2ZV9sZXZlbHMgKQoreworICAgIGttcF9pbmZvX3QgKnRocmVhZDsKKworICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzOiBuZXcgbWF4X2FjdGl2ZV9sZXZlbHMgZm9yIHRocmVhZCAlZCA9ICglZClcbiIsIGd0aWQsIG1heF9hY3RpdmVfbGV2ZWxzICkgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworCisgICAgLy8gdmFsaWRhdGUgbWF4X2FjdGl2ZV9sZXZlbHMKKyAgICBpZiggbWF4X2FjdGl2ZV9sZXZlbHMgPCAwICkgeworICAgICAgICBLTVBfV0FSTklORyggQWN0aXZlTGV2ZWxzTmVnYXRpdmUsIG1heF9hY3RpdmVfbGV2ZWxzICk7CisgICAgICAgIC8vIFdlIGlnbm9yZSB0aGlzIGNhbGwgaWYgdGhlIHVzZXIgaGFzIHNwZWNpZmllZCBhIG5lZ2F0aXZlIHZhbHVlLgorICAgICAgICAvLyBUaGUgY3VycmVudCBzZXR0aW5nIHdvbid0IGJlIGNoYW5nZWQuIFRoZSBsYXN0IHZhbGlkIHNldHRpbmcgd2lsbCBiZSB1c2VkLgorICAgICAgICAvLyBBIHdhcm5pbmcgd2lsbCBiZSBpc3N1ZWQgKGlmIHdhcm5pbmdzIGFyZSBhbGxvd2VkIGFzIGNvbnRyb2xsZWQgYnkgdGhlIEtNUF9XQVJOSU5HUyBlbnYgdmFyKS4KKyAgICAgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHM6IHRoZSBjYWxsIGlzIGlnbm9yZWQ6IG5ldyBtYXhfYWN0aXZlX2xldmVscyBmb3IgdGhyZWFkICVkID0gKCVkKVxuIiwgZ3RpZCwgbWF4X2FjdGl2ZV9sZXZlbHMgKSApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKCBtYXhfYWN0aXZlX2xldmVscyA8PSBLTVBfTUFYX0FDVElWRV9MRVZFTFNfTElNSVQgKSB7CisgICAgICAgIC8vIGl0J3MgT0ssIHRoZSBtYXhfYWN0aXZlX2xldmVscyBpcyB3aXRoaW4gdGhlIHZhbGlkIHJhbmdlOiBbIDA7IEtNUF9NQVhfQUNUSVZFX0xFVkVMU19MSU1JVCBdCisgICAgICAgIC8vIFdlIGFsbG93IGEgemVybyB2YWx1ZS4gKGltcGxlbWVudGF0aW9uIGRlZmluZWQgYmVoYXZpb3IpCisgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIEFjdGl2ZUxldmVsc0V4Y2VlZExpbWl0LCBtYXhfYWN0aXZlX2xldmVscywgS01QX01BWF9BQ1RJVkVfTEVWRUxTX0xJTUlUICApOworICAgICAgICBtYXhfYWN0aXZlX2xldmVscyA9IEtNUF9NQVhfQUNUSVZFX0xFVkVMU19MSU1JVDsKKyAgICAgICAgLy8gQ3VycmVudCB1cHBlciBsaW1pdCBpcyBNQVhfSU5ULiAoaW1wbGVtZW50YXRpb24gZGVmaW5lZCBiZWhhdmlvcikKKyAgICAgICAgLy8gSWYgdGhlIGlucHV0IGV4Y2VlZHMgdGhlIHVwcGVyIGxpbWl0LCB3ZSBjb3JyZWN0IHRoZSBpbnB1dCB0byBiZSB0aGUgdXBwZXIgbGltaXQuIChpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGJlaGF2aW9yKQorICAgICAgICAvLyBBY3R1YWxseSwgdGhlIGZsb3cgc2hvdWxkIG5ldmVyIGdldCBoZXJlIHVudGlsIHdlIHVzZSBNQVhfSU5UIGxpbWl0LgorICAgIH0KKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX3NldF9tYXhfYWN0aXZlX2xldmVsczogYWZ0ZXIgdmFsaWRhdGlvbjogbmV3IG1heF9hY3RpdmVfbGV2ZWxzIGZvciB0aHJlYWQgJWQgPSAoJWQpXG4iLCBndGlkLCBtYXhfYWN0aXZlX2xldmVscyApICk7CisKKyAgICB0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisKKyAgICBfX2ttcF9zYXZlX2ludGVybmFsX2NvbnRyb2xzKCB0aHJlYWQgKTsKKworICAgIHNldF9fbWF4X2FjdGl2ZV9sZXZlbHMoIHRocmVhZCwgbWF4X2FjdGl2ZV9sZXZlbHMgKTsKKworfQorCisvKiBHZXRzIG1heF9hY3RpdmVfbGV2ZWxzICovCitpbnQKK19fa21wX2dldF9tYXhfYWN0aXZlX2xldmVscyggaW50IGd0aWQgKQoreworICAgIGttcF9pbmZvX3QgKnRocmVhZDsKKworICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzOiB0aHJlYWQgJWRcbiIsIGd0aWQgKSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisKKyAgICB0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2sgKTsKKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX2dldF9tYXhfYWN0aXZlX2xldmVsczogdGhyZWFkICVkLCBjdXJ0YXNrPSVwLCBjdXJ0YXNrX21heGFjbGV2ZWw9JWRcbiIsCisgICAgICAgIGd0aWQsIHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrLCB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5tYXhfYWN0aXZlX2xldmVscyApICk7CisgICAgcmV0dXJuIHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLm1heF9hY3RpdmVfbGV2ZWxzOworfQorCisvKiBDaGFuZ2VzIGRlZl9zY2hlZF92YXIgSUNWIHZhbHVlcyAocnVuLXRpbWUgc2NoZWR1bGUga2luZCBhbmQgY2h1bmspICovCit2b2lkCitfX2ttcF9zZXRfc2NoZWR1bGUoIGludCBndGlkLCBrbXBfc2NoZWRfdCBraW5kLCBpbnQgY2h1bmsgKQoreworICAgIGttcF9pbmZvX3QgKnRocmVhZDsKKy8vICAgIGttcF90ZWFtX3QgKnRlYW07CisKKyAgICBLRl9UUkFDRSggMTAsICgiX19rbXBfc2V0X3NjaGVkdWxlOiBuZXcgc2NoZWR1bGUgZm9yIHRocmVhZCAlZCA9ICglZCwgJWQpXG4iLCBndGlkLCAoaW50KWtpbmQsIGNodW5rICkpOworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisKKyAgICAvLyBDaGVjayBpZiB0aGUga2luZCBwYXJhbWV0ZXIgaXMgdmFsaWQsIGNvcnJlY3QgaWYgbmVlZGVkLgorICAgIC8vIFZhbGlkIHBhcmFtZXRlcnMgc2hvdWxkIGZpdCBpbiBvbmUgb2YgdHdvIGludGVydmFscyAtIHN0YW5kYXJkIG9yIGV4dGVuZGVkOgorICAgIC8vICAgICAgIDxsb3dlcj4sIDx2YWxpZD4sIDx1cHBlcl9zdGQ+LCA8bG93ZXJfZXh0PiwgPHZhbGlkPiwgPHVwcGVyPgorICAgIC8vIDIwMDgtMDEtMjU6IDAsICAxIC0gNCwgICAgICAgNSwgICAgICAgICAxMDAsICAgICAxMDEgLSAxMDIsIDEwMworICAgIGlmICgga2luZCA8PSBrbXBfc2NoZWRfbG93ZXIgfHwga2luZCA+PSBrbXBfc2NoZWRfdXBwZXIgfHwKKyAgICAgICAoIGtpbmQgPD0ga21wX3NjaGVkX2xvd2VyX2V4dCAmJiBraW5kID49IGttcF9zY2hlZF91cHBlcl9zdGQgKSApCisgICAgeworICAgICAgICAvLyBUT0RPOiBIaW50IG5lZWRzIGF0dGVudGlvbiBpbiBjYXNlIHdlIGNoYW5nZSB0aGUgZGVmYXVsdCBzY2hlZHVsZS4KKyAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAga21wX21zX3dhcm5pbmcsCisgICAgICAgICAgICBLTVBfTVNHKCBTY2hlZHVsZUtpbmRPdXRPZlJhbmdlLCBraW5kICksCisgICAgICAgICAgICBLTVBfSE5UKCBEZWZhdWx0U2NoZWR1bGVLaW5kVXNlZCwgInN0YXRpYywgbm8gY2h1bmsiICksCisgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICApOworICAgICAgICBraW5kID0ga21wX3NjaGVkX2RlZmF1bHQ7CisgICAgICAgIGNodW5rID0gMDsgICAgICAgICAvLyBpZ25vcmUgY2h1bmsgdmFsdWUgaW4gY2FzZSBvZiBiYWQga2luZAorICAgIH0KKworICAgIHRocmVhZCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKworICAgIF9fa21wX3NhdmVfaW50ZXJuYWxfY29udHJvbHMoIHRocmVhZCApOworCisgICAgaWYgKCBraW5kIDwga21wX3NjaGVkX3VwcGVyX3N0ZCApIHsKKyAgICAgICAgaWYgKCBraW5kID09IGttcF9zY2hlZF9zdGF0aWMgJiYgY2h1bmsgPCBLTVBfREVGQVVMVF9DSFVOSyApIHsKKyAgICAgICAgICAgIC8vIGRpZmZlciBzdGF0aWMgY2h1bmtlZCB2cy4gdW5jaHVua2VkOgorICAgICAgICAgICAgLy8gY2h1bmsgc2hvdWxkIGJlIGludmFsaWQgdG8gaW5kaWNhdGUgdW5jaHVua2VkIHNjaGVkdWxlICh3aGljaCBpcyB0aGUgZGVmYXVsdCkKKyAgICAgICAgICAgIHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLnNjaGVkLnJfc2NoZWRfdHlwZSA9IGttcF9zY2hfc3RhdGljOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMuc2NoZWQucl9zY2hlZF90eXBlID0gX19rbXBfc2NoX21hcFsga2luZCAtIGttcF9zY2hlZF9sb3dlciAtIDEgXTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vICAgIF9fa21wX3NjaF9tYXBbIGtpbmQgLSBrbXBfc2NoZWRfbG93ZXJfZXh0ICsga21wX3NjaGVkX3VwcGVyX3N0ZCAtIGttcF9zY2hlZF9sb3dlciAtIDIgXTsKKyAgICAgICAgdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMuc2NoZWQucl9zY2hlZF90eXBlID0KKyAgICAgICAgICAgIF9fa21wX3NjaF9tYXBbIGtpbmQgLSBrbXBfc2NoZWRfbG93ZXJfZXh0ICsga21wX3NjaGVkX3VwcGVyX3N0ZCAtIGttcF9zY2hlZF9sb3dlciAtIDIgXTsKKyAgICB9CisgICAgaWYgKCBraW5kID09IGttcF9zY2hlZF9hdXRvICkgeworICAgICAgICAvLyBpZ25vcmUgcGFyYW1ldGVyIGNodW5rIGZvciBzY2hlZHVsZSBhdXRvCisgICAgICAgIHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLnNjaGVkLmNodW5rID0gS01QX0RFRkFVTFRfQ0hVTks7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMuc2NoZWQuY2h1bmsgPSBjaHVuazsKKyAgICB9Cit9CisKKy8qIEdldHMgZGVmX3NjaGVkX3ZhciBJQ1YgdmFsdWVzICovCit2b2lkCitfX2ttcF9nZXRfc2NoZWR1bGUoIGludCBndGlkLCBrbXBfc2NoZWRfdCAqIGtpbmQsIGludCAqIGNodW5rICkKK3sKKyAgICBrbXBfaW5mb190ICAgICAqdGhyZWFkOworICAgIGVudW0gc2NoZWRfdHlwZSB0aF90eXBlOworCisgICAgS0ZfVFJBQ0UoIDEwLCAoIl9fa21wX2dldF9zY2hlZHVsZTogdGhyZWFkICVkXG4iLCBndGlkICkpOworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisKKyAgICB0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisKKyAgICAvL3RoX3R5cGUgPSB0aHJlYWQtPnRoLnRoX3RlYW0tPnQudF9zZXRfc2NoZWRbIHRocmVhZC0+dGgudGhfaW5mby5kcy5kc190aWQgXS5yX3NjaGVkX3R5cGU7CisgICAgdGhfdHlwZSA9IHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLnNjaGVkLnJfc2NoZWRfdHlwZTsKKworICAgIHN3aXRjaCAoIHRoX3R5cGUgKSB7CisgICAgY2FzZSBrbXBfc2NoX3N0YXRpYzoKKyAgICBjYXNlIGttcF9zY2hfc3RhdGljX2dyZWVkeToKKyAgICBjYXNlIGttcF9zY2hfc3RhdGljX2JhbGFuY2VkOgorICAgICAgICAqa2luZCA9IGttcF9zY2hlZF9zdGF0aWM7CisgICAgICAgICpjaHVuayA9IDA7ICAgLy8gY2h1bmsgd2FzIG5vdCBzZXQsIHRyeSB0byBzaG93IHRoaXMgZmFjdCB2aWEgemVybyB2YWx1ZQorICAgICAgICByZXR1cm47CisgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19jaHVua2VkOgorICAgICAgICAqa2luZCA9IGttcF9zY2hlZF9zdGF0aWM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Uga21wX3NjaF9keW5hbWljX2NodW5rZWQ6CisgICAgICAgICpraW5kID0ga21wX3NjaGVkX2R5bmFtaWM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Uga21wX3NjaF9ndWlkZWRfY2h1bmtlZDoKKyAgICBjYXNlIGttcF9zY2hfZ3VpZGVkX2l0ZXJhdGl2ZV9jaHVua2VkOgorICAgIGNhc2Uga21wX3NjaF9ndWlkZWRfYW5hbHl0aWNhbF9jaHVua2VkOgorICAgICAgICAqa2luZCA9IGttcF9zY2hlZF9ndWlkZWQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Uga21wX3NjaF9hdXRvOgorICAgICAgICAqa2luZCA9IGttcF9zY2hlZF9hdXRvOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGttcF9zY2hfdHJhcGV6b2lkYWw6CisgICAgICAgICpraW5kID0ga21wX3NjaGVkX3RyYXBlem9pZGFsOworICAgICAgICBicmVhazsKKy8qCisgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19zdGVhbDoKKyAgICAgICAgKmtpbmQgPSBrbXBfc2NoZWRfc3RhdGljX3N0ZWFsOworICAgICAgICBicmVhazsKKyovCisgICAgZGVmYXVsdDoKKyAgICAgICAgS01QX0ZBVEFMKCBVbmtub3duU2NoZWR1bGluZ1R5cGUsIHRoX3R5cGUgKTsKKyAgICB9CisKKyAgICAvLypjaHVuayA9IHRocmVhZC0+dGgudGhfdGVhbS0+dC50X3NldF9zY2hlZFsgdGhyZWFkLT50aC50aF9pbmZvLmRzLmRzX3RpZCBdLmNodW5rOworICAgICpjaHVuayA9IHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLnNjaGVkLmNodW5rOworfQorCitpbnQKK19fa21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtKCBpbnQgZ3RpZCwgaW50IGxldmVsICkgeworCisgICAgaW50IGlpLCBkZDsKKyAgICBrbXBfdGVhbV90ICp0ZWFtOworICAgIGttcF9pbmZvX3QgKnRocjsKKworICAgIEtGX1RSQUNFKCAxMCwgKCJfX2ttcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bTogdGhyZWFkICVkICVkXG4iLCBndGlkLCBsZXZlbCApKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworCisgICAgLy8gdmFsaWRhdGUgbGV2ZWwKKyAgICBpZiggbGV2ZWwgPT0gMCApIHJldHVybiAwOworICAgIGlmKCBsZXZlbCA8IDAgKSByZXR1cm4gLTE7CisgICAgdGhyID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIHRlYW0gPSB0aHItPnRoLnRoX3RlYW07CisgICAgaWkgPSB0ZWFtLT50LnRfbGV2ZWw7CisgICAgaWYoIGxldmVsID4gaWkgKSByZXR1cm4gLTE7CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGlmKCB0aHItPnRoLnRoX3RlYW1zX21pY3JvdGFzayApIHsKKyAgICAgICAgLy8gQUM6IHdlIGFyZSBpbiB0ZWFtcyByZWdpb24gd2hlcmUgbXVsdGlwbGUgbmVzdGVkIHRlYW1zIGhhdmUgc2FtZSBsZXZlbAorICAgICAgICBpbnQgdGxldmVsID0gdGhyLT50aC50aF90ZWFtc19sZXZlbDsgLy8gdGhlIGxldmVsIG9mIHRoZSB0ZWFtcyBjb25zdHJ1Y3QKKyAgICAgICAgaWYoIGxldmVsIDw9IHRsZXZlbCApIHsgLy8gb3RoZXJ3aXNlIHVzdWFsIGFsZ29yaXRobSB3b3JrcyAod2lsbCBub3QgdG91Y2ggdGhlIHRlYW1zKQorICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggaWkgPj0gdGxldmVsICk7CisgICAgICAgICAgICAvLyBBQzogQXMgd2UgbmVlZCB0byBwYXNzIGJ5IHRoZSB0ZWFtcyBsZWFndWUsIHdlIG5lZWQgdG8gYXJ0aWZpY2lhbGx5IGluY3JlYXNlIGlpCisgICAgICAgICAgICBpZiAoIGlpID09IHRsZXZlbCApIHsKKyAgICAgICAgICAgICAgICBpaSArPSAyOyAvLyB0aHJlZSB0ZWFtcyBoYXZlIHNhbWUgbGV2ZWwKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWkgKys7ICAgLy8gdHdvIHRlYW1zIGhhdmUgc2FtZSBsZXZlbAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBpZiggaWkgPT0gbGV2ZWwgKSByZXR1cm4gX19rbXBfdGlkX2Zyb21fZ3RpZCggZ3RpZCApOworCisgICAgZGQgPSB0ZWFtLT50LnRfc2VyaWFsaXplZDsKKyAgICBsZXZlbCsrOworICAgIHdoaWxlKCBpaSA+IGxldmVsICkKKyAgICB7CisgICAgICAgIGZvciggZGQgPSB0ZWFtLT50LnRfc2VyaWFsaXplZDsgKCBkZCA+IDAgKSAmJiAoIGlpID4gbGV2ZWwgKTsgZGQtLSwgaWktLSApCisgICAgICAgIHsKKyAgICAgICAgfQorICAgICAgICBpZiggKCB0ZWFtLT50LnRfc2VyaWFsaXplZCApICYmICggIWRkICkgKSB7CisgICAgICAgICAgICB0ZWFtID0gdGVhbS0+dC50X3BhcmVudDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmKCBpaSA+IGxldmVsICkgeworICAgICAgICAgICAgdGVhbSA9IHRlYW0tPnQudF9wYXJlbnQ7CisgICAgICAgICAgICBkZCA9IHRlYW0tPnQudF9zZXJpYWxpemVkOworICAgICAgICAgICAgaWktLTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAoIGRkID4gMSApID8gKCAwICkgOiAoIHRlYW0tPnQudF9tYXN0ZXJfdGlkICk7Cit9CisKK2ludAorX19rbXBfZ2V0X3RlYW1fc2l6ZSggaW50IGd0aWQsIGludCBsZXZlbCApIHsKKworICAgIGludCBpaSwgZGQ7CisgICAga21wX3RlYW1fdCAqdGVhbTsKKyAgICBrbXBfaW5mb190ICp0aHI7CisKKyAgICBLRl9UUkFDRSggMTAsICgiX19rbXBfZ2V0X3RlYW1fc2l6ZTogdGhyZWFkICVkICVkXG4iLCBndGlkLCBsZXZlbCApKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworCisgICAgLy8gdmFsaWRhdGUgbGV2ZWwKKyAgICBpZiggbGV2ZWwgPT0gMCApIHJldHVybiAxOworICAgIGlmKCBsZXZlbCA8IDAgKSByZXR1cm4gLTE7CisgICAgdGhyID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIHRlYW0gPSB0aHItPnRoLnRoX3RlYW07CisgICAgaWkgPSB0ZWFtLT50LnRfbGV2ZWw7CisgICAgaWYoIGxldmVsID4gaWkgKSByZXR1cm4gLTE7CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGlmKCB0aHItPnRoLnRoX3RlYW1zX21pY3JvdGFzayApIHsKKyAgICAgICAgLy8gQUM6IHdlIGFyZSBpbiB0ZWFtcyByZWdpb24gd2hlcmUgbXVsdGlwbGUgbmVzdGVkIHRlYW1zIGhhdmUgc2FtZSBsZXZlbAorICAgICAgICBpbnQgdGxldmVsID0gdGhyLT50aC50aF90ZWFtc19sZXZlbDsgLy8gdGhlIGxldmVsIG9mIHRoZSB0ZWFtcyBjb25zdHJ1Y3QKKyAgICAgICAgaWYoIGxldmVsIDw9IHRsZXZlbCApIHsgLy8gb3RoZXJ3aXNlIHVzdWFsIGFsZ29yaXRobSB3b3JrcyAod2lsbCBub3QgdG91Y2ggdGhlIHRlYW1zKQorICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggaWkgPj0gdGxldmVsICk7CisgICAgICAgICAgICAvLyBBQzogQXMgd2UgbmVlZCB0byBwYXNzIGJ5IHRoZSB0ZWFtcyBsZWFndWUsIHdlIG5lZWQgdG8gYXJ0aWZpY2lhbGx5IGluY3JlYXNlIGlpCisgICAgICAgICAgICBpZiAoIGlpID09IHRsZXZlbCApIHsKKyAgICAgICAgICAgICAgICBpaSArPSAyOyAvLyB0aHJlZSB0ZWFtcyBoYXZlIHNhbWUgbGV2ZWwKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWkgKys7ICAgLy8gdHdvIHRlYW1zIGhhdmUgc2FtZSBsZXZlbAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICB3aGlsZSggaWkgPiBsZXZlbCApCisgICAgeworICAgICAgICBmb3IoIGRkID0gdGVhbS0+dC50X3NlcmlhbGl6ZWQ7ICggZGQgPiAwICkgJiYgKCBpaSA+IGxldmVsICk7IGRkLS0sIGlpLS0gKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICAgICAgaWYoIHRlYW0tPnQudF9zZXJpYWxpemVkICYmICggIWRkICkgKSB7CisgICAgICAgICAgICB0ZWFtID0gdGVhbS0+dC50X3BhcmVudDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmKCBpaSA+IGxldmVsICkgeworICAgICAgICAgICAgdGVhbSA9IHRlYW0tPnQudF9wYXJlbnQ7CisgICAgICAgICAgICBpaS0tOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRlYW0tPnQudF9ucHJvYzsKK30KKwora21wX3Jfc2NoZWRfdAorX19rbXBfZ2V0X3NjaGVkdWxlX2dsb2JhbCgpIHsKKy8vIFRoaXMgcm91dGluZSBjcmVhdGVkIGJlY2F1c2UgcGFpcnMgKF9fa21wX3NjaGVkLCBfX2ttcF9jaHVuaykgYW5kIChfX2ttcF9zdGF0aWMsIF9fa21wX2d1aWRlZCkKKy8vIG1heSBiZSBjaGFuZ2VkIGJ5IGttcF9zZXRfZGVmYXVsdHMgaW5kZXBlbmRlbnRseS4gU28gb25lIGNhbiBnZXQgdGhlIHVwZGF0ZWQgc2NoZWR1bGUgaGVyZS4KKworICAgIGttcF9yX3NjaGVkX3Qgcl9zY2hlZDsKKworICAgIC8vIGNyZWF0ZSBzY2hlZHVsZSBmcm9tIDQgZ2xvYmFsczogX19rbXBfc2NoZWQsIF9fa21wX2NodW5rLCBfX2ttcF9zdGF0aWMsIF9fa21wX2d1aWRlZAorICAgIC8vIF9fa21wX3NjaGVkIHNob3VsZCBrZWVwIG9yaWdpbmFsIHZhbHVlLCBzbyB0aGF0IHVzZXIgY2FuIHNldCBLTVBfU0NIRURVTEUgbXVsdGlwbGUgdGltZXMsCisgICAgLy8gYW5kIHRodXMgaGF2ZSBkaWZmZXJlbnQgcnVuLXRpbWUgc2NoZWR1bGVzIGluIGRpZmZlcmVudCByb290cyAoZXZlbiBpbiBPTVAgMi41KQorICAgIGlmICggX19rbXBfc2NoZWQgPT0ga21wX3NjaF9zdGF0aWMgKSB7CisgICAgICAgIHJfc2NoZWQucl9zY2hlZF90eXBlID0gX19rbXBfc3RhdGljOyAvLyByZXBsYWNlIFNUQVRJQyB3aXRoIG1vcmUgZGV0YWlsZWQgc2NoZWR1bGUgKGJhbGFuY2VkIG9yIGdyZWVkeSkKKyAgICB9IGVsc2UgaWYgKCBfX2ttcF9zY2hlZCA9PSBrbXBfc2NoX2d1aWRlZF9jaHVua2VkICkgeworICAgICAgICByX3NjaGVkLnJfc2NoZWRfdHlwZSA9IF9fa21wX2d1aWRlZDsgLy8gcmVwbGFjZSBHVUlERUQgd2l0aCBtb3JlIGRldGFpbGVkIHNjaGVkdWxlIChpdGVyYXRpdmUgb3IgYW5hbHl0aWNhbCkKKyAgICB9IGVsc2UgeworICAgICAgICByX3NjaGVkLnJfc2NoZWRfdHlwZSA9IF9fa21wX3NjaGVkOyAgLy8gKFNUQVRJQ19DSFVOS0VEKSwgb3IgKERZTkFNSUNfQ0hVTktFRCksIG9yIG90aGVyCisgICAgfQorCisgICAgaWYgKCBfX2ttcF9jaHVuayA8IEtNUF9ERUZBVUxUX0NIVU5LICkgeyAvLyBfX2ttcF9jaHVuayBtYXkgYmUgd3JvbmcgaGVyZSAoaWYgaXQgd2FzIG5vdCBldmVyIHNldCkKKyAgICAgICAgcl9zY2hlZC5jaHVuayA9IEtNUF9ERUZBVUxUX0NIVU5LOworICAgIH0gZWxzZSB7CisgICAgICAgIHJfc2NoZWQuY2h1bmsgPSBfX2ttcF9jaHVuazsKKyAgICB9CisKKyAgICByZXR1cm4gcl9zY2hlZDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvKgorICogQWxsb2NhdGUgKHJlYWxsb2MgPT0gRkFMU0UpICogb3IgcmVhbGxvY2F0ZSAocmVhbGxvYyA9PSBUUlVFKQorICogYXQgbGVhc3QgYXJnYyBudW1iZXIgb2YgKnRfYXJndiBlbnRyaWVzIGZvciB0aGUgcmVxdWVzdGVkIHRlYW0uCisgKi8KK3N0YXRpYyB2b2lkCitfX2ttcF9hbGxvY19hcmd2X2VudHJpZXMoIGludCBhcmdjLCBrbXBfdGVhbV90ICp0ZWFtLCBpbnQgcmVhbGxvYyApCit7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtICk7CisgICAgaWYoICFyZWFsbG9jIHx8IGFyZ2MgPiB0ZWFtLT50LnRfbWF4X2FyZ2MgKSB7CisKKyAgICAgICAgS0FfVFJBQ0UoIDEwMCwgKCAiX19rbXBfYWxsb2NfYXJndl9lbnRyaWVzOiB0ZWFtICVkOiBuZWVkZWQgZW50cmllcz0lZCwgY3VycmVudCBlbnRyaWVzPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgYXJnYywgKCByZWFsbG9jICkgPyB0ZWFtLT50LnRfbWF4X2FyZ2MgOiAwICkpOworICAgICAgICAvKiBpZiBwcmV2aW91c2x5IGFsbG9jYXRlZCBoZWFwIHNwYWNlIGZvciBhcmdzLCBmcmVlIHRoZW0gKi8KKyAgICAgICAgaWYgKCByZWFsbG9jICYmIHRlYW0tPnQudF9hcmd2ICE9ICZ0ZWFtLT50LnRfaW5saW5lX2FyZ3ZbMF0gKQorICAgICAgICAgICAgX19rbXBfZnJlZSggKHZvaWQgKikgdGVhbS0+dC50X2FyZ3YgKTsKKworICAgICAgICBpZiAoIGFyZ2MgPD0gS01QX0lOTElORV9BUkdWX0VOVFJJRVMgKSB7CisgICAgICAgICAgICAvKiB1c2UgdW51c2VkIHNwYWNlIGluIHRoZSBjYWNoZSBsaW5lIGZvciBhcmd1bWVudHMgKi8KKyAgICAgICAgICAgIHRlYW0tPnQudF9tYXhfYXJnYyA9IEtNUF9JTkxJTkVfQVJHVl9FTlRSSUVTOworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMCwgKCAiX19rbXBfYWxsb2NfYXJndl9lbnRyaWVzOiB0ZWFtICVkOiBpbmxpbmUgYWxsb2NhdGUgJWQgYXJndiBlbnRyaWVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQsIHRlYW0tPnQudF9tYXhfYXJnYyApKTsKKyAgICAgICAgICAgIHRlYW0tPnQudF9hcmd2ID0gJnRlYW0tPnQudF9pbmxpbmVfYXJndlswXTsKKyAgICAgICAgICAgIGlmICggX19rbXBfc3RvcmFnZV9tYXAgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggLTEsICZ0ZWFtLT50LnRfaW5saW5lX2FyZ3ZbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZWFtLT50LnRfaW5saW5lX2FyZ3ZbS01QX0lOTElORV9BUkdWX0VOVFJJRVNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZW9mKHZvaWQgKikgKiBLTVBfSU5MSU5FX0FSR1ZfRU5UUklFUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZWFtXyVkLnRfaW5saW5lX2FyZ3YiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIGFsbG9jYXRlIHNwYWNlIGZvciBhcmd1bWVudHMgaW4gdGhlIGhlYXAgKi8KKyAgICAgICAgICAgIHRlYW0tPnQudF9tYXhfYXJnYyA9ICggYXJnYyA8PSAoS01QX01JTl9NQUxMT0NfQVJHVl9FTlRSSUVTID4+IDEgKSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9NSU5fTUFMTE9DX0FSR1ZfRU5UUklFUyA6IDIgKiBhcmdjOworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMCwgKCAiX19rbXBfYWxsb2NfYXJndl9lbnRyaWVzOiB0ZWFtICVkOiBkeW5hbWljIGFsbG9jYXRlICVkIGFyZ3YgZW50cmllc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCB0ZWFtLT50LnRfbWF4X2FyZ2MgKSk7CisgICAgICAgICAgICB0ZWFtLT50LnRfYXJndiAgICAgPSAodm9pZCoqKSBfX2ttcF9wYWdlX2FsbG9jYXRlKCBzaXplb2Yodm9pZCopICogdGVhbS0+dC50X21heF9hcmdjICk7CisgICAgICAgICAgICBpZiAoIF9fa21wX3N0b3JhZ2VfbWFwICkgeworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIC0xLCAmdGVhbS0+dC50X2FyZ3ZbMF0sICZ0ZWFtLT50LnRfYXJndlt0ZWFtLT50LnRfbWF4X2FyZ2NdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yodm9pZCAqKSAqIHRlYW0tPnQudF9tYXhfYXJnYywgInRlYW1fJWQudF9hcmd2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9hbGxvY2F0ZV90ZWFtX2FycmF5cyhrbXBfdGVhbV90ICp0ZWFtLCBpbnQgbWF4X250aCkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgbnVtX2Rpc3BfYnVmZiA9IG1heF9udGggPiAxID8gS01QX01BWF9ESVNQX0JVRiA6IDI7CisjaWYgS01QX1VTRV9QT09MRURfQUxMT0MKKyAgICAvLyBBQzogVE9ETzogZml4IGJ1ZyBoZXJlOiBzaXplIG9mIHRfZGlzcF9idWZmZXIgc2hvdWxkIG5vdCBiZSBtdWx0aXBsaWVkIGJ5IG1heF9udGghCisgICAgY2hhciAqcHRyID0gX19rbXBfYWxsb2NhdGUobWF4X250aCAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBzaXplb2Yoa21wX2luZm9fdCopICsgc2l6ZW9mKGRpc3BhdGNoX3NoYXJlZF9pbmZvX3QpKm51bV9kaXNwX2J1ZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKGttcF9kaXNwX3QpICsgc2l6ZW9mKGludCkqNgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vKyBzaXplb2YoaW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKGttcF9yX3NjaGVkX3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2Yoa21wX3Rhc2tkYXRhX3QpICkgKTsKKworICAgIHRlYW0tPnQudF90aHJlYWRzICAgICAgICAgID0gKGttcF9pbmZvX3QqKikgcHRyOyBwdHIgKz0gc2l6ZW9mKGttcF9pbmZvX3QqKSAqIG1heF9udGg7CisgICAgdGVhbS0+dC50X2Rpc3BfYnVmZmVyICAgICAgPSAoZGlzcGF0Y2hfc2hhcmVkX2luZm9fdCopIHB0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyICs9IHNpemVvZihkaXNwYXRjaF9zaGFyZWRfaW5mb190KSAqIG51bV9kaXNwX2J1ZmY7CisgICAgdGVhbS0+dC50X2Rpc3BhdGNoICAgICAgICAgPSAoa21wX2Rpc3BfdCopIHB0cjsgcHRyICs9IHNpemVvZihrbXBfZGlzcF90KSAqIG1heF9udGg7CisgICAgdGVhbS0+dC50X3NldF9ucHJvYyAgICAgICAgPSAoaW50KikgcHRyOyBwdHIgKz0gc2l6ZW9mKGludCkgKiBtYXhfbnRoOworICAgIHRlYW0tPnQudF9zZXRfZHluYW1pYyAgICAgID0gKGludCopIHB0cjsgcHRyICs9IHNpemVvZihpbnQpICogbWF4X250aDsKKyAgICB0ZWFtLT50LnRfc2V0X25lc3RlZCAgICAgICA9IChpbnQqKSBwdHI7IHB0ciArPSBzaXplb2YoaW50KSAqIG1heF9udGg7CisgICAgdGVhbS0+dC50X3NldF9ibG9ja3RpbWUgICAgPSAoaW50KikgcHRyOyBwdHIgKz0gc2l6ZW9mKGludCkgKiBtYXhfbnRoOworICAgIHRlYW0tPnQudF9zZXRfYnRfaW50ZXJ2YWxzID0gKGludCopIHB0cjsgcHRyICs9IHNpemVvZihpbnQpICogbWF4X250aDsKKyAgICB0ZWFtLT50LnRfc2V0X2J0X3NldCAgICAgICA9IChpbnQqKSBwdHI7CisgICAgcHRyICs9IHNpemVvZihpbnQpICogbWF4X250aDsKKyAgICAvL3RlYW0tPnQudF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMgPSAoaW50KikgcHRyOyBwdHIgKz0gc2l6ZW9mKGludCkgKiBtYXhfbnRoOworICAgIHRlYW0tPnQudF9zZXRfc2NoZWQgICAgICAgID0gKGttcF9yX3NjaGVkX3QqKSBwdHI7CisgICAgcHRyICs9IHNpemVvZihrbXBfcl9zY2hlZF90KSAqIG1heF9udGg7CisgICAgdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGEgPSAoa21wX3Rhc2tkYXRhX3QqKSBwdHI7CisgICAgcHRyICs9IHNpemVvZihrbXBfdGFza2RhdGFfdCkgKiBtYXhfbnRoOworI2Vsc2UKKworICAgIHRlYW0tPnQudF90aHJlYWRzID0gKGttcF9pbmZvX3QqKikgX19rbXBfYWxsb2NhdGUoIHNpemVvZihrbXBfaW5mb190KikgKiBtYXhfbnRoICk7CisgICAgdGVhbS0+dC50X2Rpc3BfYnVmZmVyID0gKGRpc3BhdGNoX3NoYXJlZF9pbmZvX3QqKQorICAgICAgICBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKGRpc3BhdGNoX3NoYXJlZF9pbmZvX3QpICogbnVtX2Rpc3BfYnVmZiApOworICAgIHRlYW0tPnQudF9kaXNwYXRjaCA9IChrbXBfZGlzcF90KikgX19rbXBfYWxsb2NhdGUoIHNpemVvZihrbXBfZGlzcF90KSAqIG1heF9udGggKTsKKyAgICAvL3RlYW0tPnQudF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMgPSAoaW50KikgX19rbXBfYWxsb2NhdGUoIHNpemVvZihpbnQpICogbWF4X250aCApOworICAgIC8vdGVhbS0+dC50X3NldF9zY2hlZCA9IChrbXBfcl9zY2hlZF90KikgX19rbXBfYWxsb2NhdGUoIHNpemVvZihrbXBfcl9zY2hlZF90KSAqIG1heF9udGggKTsKKyAgICB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YSA9IChrbXBfdGFza2RhdGFfdCopIF9fa21wX2FsbG9jYXRlKCBzaXplb2Yoa21wX3Rhc2tkYXRhX3QpICogbWF4X250aCApOworI2VuZGlmCisgICAgdGVhbS0+dC50X21heF9ucHJvYyA9IG1heF9udGg7CisKKyAgICAvKiBzZXR1cCBkaXNwYXRjaCBidWZmZXJzICovCisgICAgZm9yKGkgPSAwIDsgaSA8IG51bV9kaXNwX2J1ZmY7ICsraSkKKyAgICAgICAgdGVhbS0+dC50X2Rpc3BfYnVmZmVyW2ldLmJ1ZmZlcl9pbmRleCA9IGk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9mcmVlX3RlYW1fYXJyYXlzKGttcF90ZWFtX3QgKnRlYW0pIHsKKyAgICAvKiBOb3RlOiB0aGlzIGRvZXMgbm90IGZyZWUgdGhlIHRocmVhZHMgaW4gdF90aHJlYWRzIChfX2ttcF9mcmVlX3RocmVhZHMpICovCisgICAgaW50IGk7CisgICAgZm9yICggaSA9IDA7IGkgPCB0ZWFtLT50LnRfbWF4X25wcm9jOyArKyBpICkgeworICAgICAgICBpZiAoIHRlYW0tPnQudF9kaXNwYXRjaFsgaSBdLnRoX2Rpc3BfYnVmZmVyICE9IE5VTEwgKSB7CisgICAgICAgICAgICBfX2ttcF9mcmVlKCB0ZWFtLT50LnRfZGlzcGF0Y2hbIGkgXS50aF9kaXNwX2J1ZmZlciApOworICAgICAgICAgICAgdGVhbS0+dC50X2Rpc3BhdGNoWyBpIF0udGhfZGlzcF9idWZmZXIgPSBOVUxMOworICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGZvcgorICAgIF9fa21wX2ZyZWUodGVhbS0+dC50X3RocmVhZHMpOworICAgICNpZiAhS01QX1VTRV9QT09MRURfQUxMT0MKKyAgICAgICAgX19rbXBfZnJlZSh0ZWFtLT50LnRfZGlzcF9idWZmZXIpOworICAgICAgICBfX2ttcF9mcmVlKHRlYW0tPnQudF9kaXNwYXRjaCk7CisgICAgICAgIC8vX19rbXBfZnJlZSh0ZWFtLT50LnRfc2V0X21heF9hY3RpdmVfbGV2ZWxzKTsKKyAgICAgICAgLy9fX2ttcF9mcmVlKHRlYW0tPnQudF9zZXRfc2NoZWQpOworICAgICAgICBfX2ttcF9mcmVlKHRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhKTsKKyAgICAjZW5kaWYKKyAgICB0ZWFtLT50LnRfdGhyZWFkcyAgICAgPSBOVUxMOworICAgIHRlYW0tPnQudF9kaXNwX2J1ZmZlciA9IE5VTEw7CisgICAgdGVhbS0+dC50X2Rpc3BhdGNoICAgID0gTlVMTDsKKyAgICAvL3RlYW0tPnQudF9zZXRfc2NoZWQgICA9IDA7CisgICAgLy90ZWFtLT50LnRfc2V0X21heF9hY3RpdmVfbGV2ZWxzID0gMDsKKyAgICB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9yZWFsbG9jYXRlX3RlYW1fYXJyYXlzKGttcF90ZWFtX3QgKnRlYW0sIGludCBtYXhfbnRoKSB7CisgICAga21wX2luZm9fdCAqKm9sZFRocmVhZHMgPSB0ZWFtLT50LnRfdGhyZWFkczsKKworICAgICNpZiAhS01QX1VTRV9QT09MRURfQUxMT0MKKyAgICAgICAgX19rbXBfZnJlZSh0ZWFtLT50LnRfZGlzcF9idWZmZXIpOworICAgICAgICBfX2ttcF9mcmVlKHRlYW0tPnQudF9kaXNwYXRjaCk7CisgICAgICAgIC8vX19rbXBfZnJlZSh0ZWFtLT50LnRfc2V0X21heF9hY3RpdmVfbGV2ZWxzKTsKKyAgICAgICAgLy9fX2ttcF9mcmVlKHRlYW0tPnQudF9zZXRfc2NoZWQpOworICAgICAgICBfX2ttcF9mcmVlKHRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhKTsKKyAgICAjZW5kaWYKKyAgICBfX2ttcF9hbGxvY2F0ZV90ZWFtX2FycmF5cyh0ZWFtLCBtYXhfbnRoKTsKKworICAgIEtNUF9NRU1DUFkodGVhbS0+dC50X3RocmVhZHMsIG9sZFRocmVhZHMsIHRlYW0tPnQudF9ucHJvYyAqIHNpemVvZiAoa21wX2luZm9fdCopKTsKKworICAgIF9fa21wX2ZyZWUob2xkVGhyZWFkcyk7Cit9CisKK3N0YXRpYyBrbXBfaW50ZXJuYWxfY29udHJvbF90CitfX2ttcF9nZXRfZ2xvYmFsX2ljdnMoIHZvaWQgKSB7CisKKyAgICBrbXBfcl9zY2hlZF90IHJfc2NoZWQgPSBfX2ttcF9nZXRfc2NoZWR1bGVfZ2xvYmFsKCk7IC8vIGdldCBjdXJyZW50IHN0YXRlIG9mIHNjaGVkdWxpbmcgZ2xvYmFscworCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLnVzZWQgPiAwICk7CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworICAgIGttcF9pbnRlcm5hbF9jb250cm9sX3QgZ19pY3ZzID0geworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pbnQgc2VyaWFsX25lc3RpbmdfbGV2ZWw7IC8vY29ycmVzcG9uZHMgdG8gdGhlIHZhbHVlIG9mIHRoZSB0aF90ZWFtX3NlcmlhbGl6ZWQgZmllbGQKKyAgICAgIChrbXBfaW50OClfX2ttcF9kZmx0X25lc3RlZCwgICAgICAgICAgICAvL2ludCBuZXN0ZWQ7ICAgICAgICAgICAgICAgLy9pbnRlcm5hbCBjb250cm9sIGZvciBuZXN0ZWQgcGFyYWxsZWxpc20gKHBlciB0aHJlYWQpCisgICAgICAoa21wX2ludDgpX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaW50ZXJuYWwgY29udHJvbCBmb3IgZHluYW1pYyBhZGp1c3RtZW50IG9mIHRocmVhZHMgKHBlciB0aHJlYWQpCisgICAgICAoa21wX2ludDgpX19rbXBfZW52X2Jsb2NrdGltZSwgICAgICAgICAgLy9pbnQgYnRfc2V0OyAgICAgICAgICAgICAgIC8vaW50ZXJuYWwgY29udHJvbCBmb3Igd2hldGhlciBibG9ja3RpbWUgaXMgZXhwbGljaXRseSBzZXQKKyAgICAgIF9fa21wX2RmbHRfYmxvY2t0aW1lLCAgICAgICAgIC8vaW50IGJsb2NrdGltZTsgICAgICAgICAgICAvL2ludGVybmFsIGNvbnRyb2wgZm9yIGJsb2NrdGltZQorICAgICAgX19rbXBfYnRfaW50ZXJ2YWxzLCAgICAgICAgICAgLy9pbnQgYnRfaW50ZXJ2YWxzOyAgICAgICAgIC8vaW50ZXJuYWwgY29udHJvbCBmb3IgYmxvY2t0aW1lIGludGVydmFscworICAgICAgX19rbXBfZGZsdF90ZWFtX250aCwgICAgICAgICAgLy9pbnQgbnByb2M7ICAgICAgICAgICAgICAgIC8vaW50ZXJuYWwgY29udHJvbCBmb3IgIyBvZiB0aHJlYWRzIGZvciBuZXh0IHBhcmFsbGVsIHJlZ2lvbiAocGVyIHRocmVhZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICh1c2UgYSBtYXggdWIgb24gdmFsdWUgaWYgX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZSBub3QgY2FsbGVkIHlldCkKKyAgICAgIF9fa21wX2RmbHRfbWF4X2FjdGl2ZV9sZXZlbHMsIC8vaW50IG1heF9hY3RpdmVfbGV2ZWxzOyAgICAvL2ludGVybmFsIGNvbnRyb2wgZm9yIG1heF9hY3RpdmVfbGV2ZWxzCisgICAgICByX3NjaGVkLCAgICAgICAgICAgICAgICAgICAgICAvL2ttcF9yX3NjaGVkX3Qgc2NoZWQ7ICAgICAgLy9pbnRlcm5hbCBjb250cm9sIGZvciBydW50aW1lIHNjaGVkdWxlIHtzY2hlZCxjaHVua30gcGFpcgorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0sCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICAgIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vc3RydWN0IGttcF9pbnRlcm5hbF9jb250cm9sICpuZXh0OworICAgIH07CisKKyAgICByZXR1cm4gZ19pY3ZzOworfQorCitzdGF0aWMga21wX2ludGVybmFsX2NvbnRyb2xfdAorX19rbXBfZ2V0X3hfZ2xvYmFsX2ljdnMoIGNvbnN0IGttcF90ZWFtX3QgKnRlYW0gKSB7CisKKyAgICBrbXBfaW50ZXJuYWxfY29udHJvbF90IGd4X2ljdnM7CisgICAgZ3hfaWN2cy5zZXJpYWxfbmVzdGluZ19sZXZlbCA9IDA7IC8vIHByb2JhYmx5ID10ZWFtLT50LnRfc2VyaWFsIGxpa2UgaW4gc2F2ZV9pbnRlcl9jb250cm9scworICAgIGNvcHlfaWN2cyggJiBneF9pY3ZzLCAmIHRlYW0tPnQudF90aHJlYWRzWzBdLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMgKTsKKyAgICBneF9pY3ZzLm5leHQgPSBOVUxMOworCisgICAgcmV0dXJuIGd4X2ljdnM7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9pbml0aWFsaXplX3Jvb3QoIGttcF9yb290X3QgKnJvb3QgKQoreworICAgIGludCAgICAgICAgICAgZjsKKyAgICBrbXBfdGVhbV90ICAgKnJvb3RfdGVhbTsKKyAgICBrbXBfdGVhbV90ICAgKmhvdF90ZWFtOworICAgIGludCAgICAgICAgICAgaG90X3RlYW1fbWF4X250aDsKKyAgICBrbXBfcl9zY2hlZF90IHJfc2NoZWQgPSBfX2ttcF9nZXRfc2NoZWR1bGVfZ2xvYmFsKCk7IC8vIGdldCBjdXJyZW50IHN0YXRlIG9mIHNjaGVkdWxpbmcgZ2xvYmFscworICAgIGttcF9pbnRlcm5hbF9jb250cm9sX3Qgcl9pY3ZzID0gX19rbXBfZ2V0X2dsb2JhbF9pY3ZzKCk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggcm9vdCApOworICAgIEtNUF9BU1NFUlQoICEgcm9vdC0+ci5yX2JlZ2luICk7CisKKyAgICAvKiBzZXR1cCB0aGUgcm9vdCBzdGF0ZSBzdHJ1Y3R1cmUgKi8KKyAgICBfX2ttcF9pbml0X2xvY2soICZyb290LT5yLnJfYmVnaW5fbG9jayApOworICAgIHJvb3QtPnIucl9iZWdpbiAgICAgICAgPSBGQUxTRTsKKyAgICByb290LT5yLnJfYWN0aXZlICAgICAgID0gRkFMU0U7CisgICAgcm9vdC0+ci5yX2luX3BhcmFsbGVsICA9IDA7CisgICAgcm9vdC0+ci5yX2Jsb2NrdGltZSAgICA9IF9fa21wX2RmbHRfYmxvY2t0aW1lOworICAgIHJvb3QtPnIucl9uZXN0ZWQgICAgICAgPSBfX2ttcF9kZmx0X25lc3RlZDsKKworICAgIC8qIHNldHVwIHRoZSByb290IHRlYW0gZm9yIHRoaXMgdGFzayAqLworICAgIC8qIGFsbG9jYXRlIHRoZSByb290IHRlYW0gc3RydWN0dXJlICovCisgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9pbml0aWFsaXplX3Jvb3Q6IGJlZm9yZSByb290X3RlYW1cbiIgKSApOworCisgICAgcm9vdF90ZWFtID0KKyAgICAgICAgX19rbXBfYWxsb2NhdGVfdGVhbSgKKyAgICAgICAgICAgIHJvb3QsCisgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ld19ucHJvYworICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXhfbnByb2MKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgIDAsIC8vIHJvb3QgcGFyYWxsZWwgaWQKKyNlbmRpZgorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0sCisjZW5kaWYKKyAgICAgICAgICAgICZyX2ljdnMsCisgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyZ2MKKyAgICAgICAgICAgIFVTRV9ORVNURURfSE9UX0FSRyhOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFzdGVyIHRocmVhZCBpcyB1bmtub3duCisgICAgICAgICk7CisjaWYgVVNFX0RFQlVHR0VSCisgICAgLy8gTm9uLU5VTEwgdmFsdWUgc2hvdWxkIGJlIGFzc2lnbmVkIHRvIG1ha2UgdGhlIGRlYnVnZ2VyIGRpc3BsYXkgdGhlIHJvb3QgdGVhbS4KKyAgICBUQ1dfU1lOQ19QVFIocm9vdF90ZWFtLT50LnRfcGtmbiwgKG1pY3JvdGFza190KSggfiAwICkpOworI2VuZGlmCisKKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX2luaXRpYWxpemVfcm9vdDogYWZ0ZXIgcm9vdF90ZWFtID0gJXBcbiIsIHJvb3RfdGVhbSApICk7CisKKyAgICByb290LT5yLnJfcm9vdF90ZWFtID0gcm9vdF90ZWFtOworICAgIHJvb3RfdGVhbS0+dC50X2NvbnRyb2xfc3RhY2tfdG9wID0gTlVMTDsKKworICAgIC8qIGluaXRpYWxpemUgcm9vdCB0ZWFtICovCisgICAgcm9vdF90ZWFtLT50LnRfdGhyZWFkc1swXSA9IE5VTEw7CisgICAgcm9vdF90ZWFtLT50LnRfbnByb2MgICAgICA9IDE7CisgICAgcm9vdF90ZWFtLT50LnRfc2VyaWFsaXplZCA9IDE7CisgICAgLy8gVE9ETz8/Pzogcm9vdF90ZWFtLT50LnRfbWF4X2FjdGl2ZV9sZXZlbHMgPSBfX2ttcF9kZmx0X21heF9hY3RpdmVfbGV2ZWxzOworICAgIHJvb3RfdGVhbS0+dC50X3NjaGVkLnJfc2NoZWRfdHlwZSA9IHJfc2NoZWQucl9zY2hlZF90eXBlOworICAgIHJvb3RfdGVhbS0+dC50X3NjaGVkLmNodW5rICAgICAgICA9IHJfc2NoZWQuY2h1bms7CisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2luaXRpYWxpemVfcm9vdDogaW5pdCByb290IHRlYW0gJWQgYXJyaXZlZDogam9pbj0ldSwgcGxhaW49JXVcbiIsCisgICAgICAgICAgICAgICAgICAgIHJvb3RfdGVhbS0+dC50X2lkLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFICkpOworCisgICAgLyogc2V0dXAgdGhlICBob3QgdGVhbSBmb3IgdGhpcyB0YXNrICovCisgICAgLyogYWxsb2NhdGUgdGhlIGhvdCB0ZWFtIHN0cnVjdHVyZSAqLworICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfaW5pdGlhbGl6ZV9yb290OiBiZWZvcmUgaG90X3RlYW1cbiIgKSApOworCisgICAgaG90X3RlYW0gPQorICAgICAgICBfX2ttcF9hbGxvY2F0ZV90ZWFtKAorICAgICAgICAgICAgcm9vdCwKKyAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3X25wcm9jCisgICAgICAgICAgICBfX2ttcF9kZmx0X3RlYW1fbnRoX3ViICogMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1heF9ucHJvYworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgMCwgLy8gcm9vdCBwYXJhbGxlbCBpZAorI2VuZGlmCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSwKKyNlbmRpZgorICAgICAgICAgICAgJnJfaWN2cywKKyAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJnYworICAgICAgICAgICAgVVNFX05FU1RFRF9IT1RfQVJHKE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXN0ZXIgdGhyZWFkIGlzIHVua25vd24KKyAgICAgICAgKTsKKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX2luaXRpYWxpemVfcm9vdDogYWZ0ZXIgaG90X3RlYW0gPSAlcFxuIiwgaG90X3RlYW0gKSApOworCisgICAgcm9vdC0+ci5yX2hvdF90ZWFtID0gaG90X3RlYW07CisgICAgcm9vdF90ZWFtLT50LnRfY29udHJvbF9zdGFja190b3AgPSBOVUxMOworCisgICAgLyogZmlyc3QtdGltZSBpbml0aWFsaXphdGlvbiAqLworICAgIGhvdF90ZWFtLT50LnRfcGFyZW50ID0gcm9vdF90ZWFtOworCisgICAgLyogaW5pdGlhbGl6ZSBob3QgdGVhbSAqLworICAgIGhvdF90ZWFtX21heF9udGggPSBob3RfdGVhbS0+dC50X21heF9ucHJvYzsKKyAgICBmb3IgKCBmID0gMDsgZiA8IGhvdF90ZWFtX21heF9udGg7ICsrIGYgKSB7CisgICAgICAgIGhvdF90ZWFtLT50LnRfdGhyZWFkc1sgZiBdID0gTlVMTDsKKyAgICB9OyAvLyBmb3IKKyAgICBob3RfdGVhbS0+dC50X25wcm9jID0gMTsKKyAgICAvLyBUT0RPPz8/OiBob3RfdGVhbS0+dC50X21heF9hY3RpdmVfbGV2ZWxzID0gX19rbXBfZGZsdF9tYXhfYWN0aXZlX2xldmVsczsKKyAgICBob3RfdGVhbS0+dC50X3NjaGVkLnJfc2NoZWRfdHlwZSA9IHJfc2NoZWQucl9zY2hlZF90eXBlOworICAgIGhvdF90ZWFtLT50LnRfc2NoZWQuY2h1bmsgICAgICAgID0gcl9zY2hlZC5jaHVuazsKKyAgICBob3RfdGVhbS0+dC50X3NpemVfY2hhbmdlZCA9IDA7Cit9CisKKyNpZmRlZiBLTVBfREVCVUcKKworCit0eXBlZGVmIHN0cnVjdCBrbXBfdGVhbV9saXN0X2l0ZW0geworICAgIGttcF90ZWFtX3AgY29uc3QgKiAgICAgICAgICAgZW50cnk7CisgICAgc3RydWN0IGttcF90ZWFtX2xpc3RfaXRlbSAqICBuZXh0OworfSBrbXBfdGVhbV9saXN0X2l0ZW1fdDsKK3R5cGVkZWYga21wX3RlYW1fbGlzdF9pdGVtX3QgKiBrbXBfdGVhbV9saXN0X3Q7CisKKworc3RhdGljIHZvaWQKK19fa21wX3ByaW50X3N0cnVjdHVyZV90ZWFtX2FjY3VtKCAgICAvLyBBZGQgdGVhbSB0byBsaXN0IG9mIHRlYW1zLgorICAgIGttcF90ZWFtX2xpc3RfdCAgICAgbGlzdCwgICAgICAgIC8vIExpc3Qgb2YgdGVhbXMuCisgICAga21wX3RlYW1fcCBjb25zdCAqICB0ZWFtICAgICAgICAgLy8gVGVhbSB0byBhZGQuCispIHsKKworICAgIC8vIExpc3QgbXVzdCB0ZXJtaW5hdGUgd2l0aCBpdGVtIHdoZXJlIGJvdGggZW50cnkgYW5kIG5leHQgYXJlIE5VTEwuCisgICAgLy8gVGVhbSBpcyBhZGRlZCB0byB0aGUgbGlzdCBvbmx5IG9uY2UuCisgICAgLy8gTGlzdCBpcyBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyIGJ5IHRlYW0gaWQuCisgICAgLy8gVGVhbSBpZCBpcyAqbm90KiBhIGtleS4KKworICAgIGttcF90ZWFtX2xpc3RfdCBsOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggbGlzdCAhPSBOVUxMICk7CisgICAgaWYgKCB0ZWFtID09IE5VTEwgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9OyAvLyBpZgorCisgICAgX19rbXBfcHJpbnRfc3RydWN0dXJlX3RlYW1fYWNjdW0oIGxpc3QsIHRlYW0tPnQudF9wYXJlbnQgKTsKKyAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmVfdGVhbV9hY2N1bSggbGlzdCwgdGVhbS0+dC50X25leHRfcG9vbCApOworCisgICAgLy8gU2VhcmNoIGxpc3QgZm9yIHRoZSB0ZWFtLgorICAgIGwgPSBsaXN0OworICAgIHdoaWxlICggbC0+bmV4dCAhPSBOVUxMICYmIGwtPmVudHJ5ICE9IHRlYW0gKSB7CisgICAgICAgIGwgPSBsLT5uZXh0OworICAgIH07IC8vIHdoaWxlCisgICAgaWYgKCBsLT5uZXh0ICE9IE5VTEwgKSB7CisgICAgICAgIHJldHVybjsgIC8vIFRlYW0gaGFzIGJlZW4gYWRkZWQgYmVmb3JlLCBleGl0LgorICAgIH07IC8vIGlmCisKKyAgICAvLyBUZWFtIGlzIG5vdCBmb3VuZC4gU2VhcmNoIGxpc3QgYWdhaW4gZm9yIGluc2VydGlvbiBwb2ludC4KKyAgICBsID0gbGlzdDsKKyAgICB3aGlsZSAoIGwtPm5leHQgIT0gTlVMTCAmJiBsLT5lbnRyeS0+dC50X2lkIDw9IHRlYW0tPnQudF9pZCApIHsKKyAgICAgICAgbCA9IGwtPm5leHQ7CisgICAgfTsgLy8gd2hpbGUKKworICAgIC8vIEluc2VydCB0ZWFtLgorICAgIHsKKyAgICAgICAga21wX3RlYW1fbGlzdF9pdGVtX3QgKiBpdGVtID0KKyAgICAgICAgICAgIChrbXBfdGVhbV9saXN0X2l0ZW1fdCAqKUtNUF9JTlRFUk5BTF9NQUxMT0MoIHNpemVvZiggIGttcF90ZWFtX2xpc3RfaXRlbV90ICkgKTsKKyAgICAgICAgKiBpdGVtID0gKiBsOworICAgICAgICBsLT5lbnRyeSA9IHRlYW07CisgICAgICAgIGwtPm5leHQgID0gaXRlbTsKKyAgICB9CisKK30KKworc3RhdGljIHZvaWQKK19fa21wX3ByaW50X3N0cnVjdHVyZV90ZWFtKAorICAgIGNoYXIgY29uc3QgKiAgICAgICB0aXRsZSwKKyAgICBrbXBfdGVhbV9wIGNvbnN0ICogdGVhbQorCispIHsKKyAgICBfX2ttcF9wcmludGYoICIlcyIsIHRpdGxlICk7CisgICAgaWYgKCB0ZWFtICE9IE5VTEwgKSB7CisgICAgICAgIF9fa21wX3ByaW50ZiggIiUyeCAlcFxuIiwgdGVhbS0+dC50X2lkLCB0ZWFtICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfcHJpbnRmKCAiIC0gKG5pbClcbiIgKTsKKyAgICB9OyAvLyBpZgorfQorCitzdGF0aWMgdm9pZAorX19rbXBfcHJpbnRfc3RydWN0dXJlX3RocmVhZCgKKyAgICBjaGFyIGNvbnN0ICogICAgICAgdGl0bGUsCisgICAga21wX2luZm9fcCBjb25zdCAqIHRocmVhZAorCispIHsKKyAgICBfX2ttcF9wcmludGYoICIlcyIsIHRpdGxlICk7CisgICAgaWYgKCB0aHJlYWQgIT0gTlVMTCApIHsKKyAgICAgICAgX19rbXBfcHJpbnRmKCAiJTJkICVwXG4iLCB0aHJlYWQtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCwgdGhyZWFkICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfcHJpbnRmKCAiIC0gKG5pbClcbiIgKTsKKyAgICB9OyAvLyBpZgorfQorCit2b2lkCitfX2ttcF9wcmludF9zdHJ1Y3R1cmUoCisgICAgdm9pZAorKSB7CisKKyAgICBrbXBfdGVhbV9saXN0X3QgbGlzdDsKKworICAgIC8vIEluaXRpYWxpemUgbGlzdCBvZiB0ZWFtcy4KKyAgICBsaXN0ID0gKGttcF90ZWFtX2xpc3RfaXRlbV90ICopS01QX0lOVEVSTkFMX01BTExPQyggc2l6ZW9mKCBrbXBfdGVhbV9saXN0X2l0ZW1fdCApICk7CisgICAgbGlzdC0+ZW50cnkgPSBOVUxMOworICAgIGxpc3QtPm5leHQgID0gTlVMTDsKKworICAgIF9fa21wX3ByaW50ZiggIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5HbG9iYWwgVGhyZWFkIFRhYmxlXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIgKTsKKyAgICB7CisgICAgICAgIGludCBndGlkOworICAgICAgICBmb3IgKCBndGlkID0gMDsgZ3RpZCA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7ICsrIGd0aWQgKSB7CisgICAgICAgICAgICBfX2ttcF9wcmludGYoICIlMmQiLCBndGlkICk7CisgICAgICAgICAgICBpZiAoIF9fa21wX3RocmVhZHMgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoICIgJXAiLCBfX2ttcF90aHJlYWRzWyBndGlkIF0gKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICBpZiAoIF9fa21wX3Jvb3QgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoICIgJXAiLCBfX2ttcF9yb290WyBndGlkIF0gKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICBfX2ttcF9wcmludGYoICJcbiIgKTsKKyAgICAgICAgfTsgLy8gZm9yIGd0aWQKKyAgICB9CisKKyAgICAvLyBQcmludCBvdXQgX19rbXBfdGhyZWFkcyBhcnJheS4KKyAgICBfX2ttcF9wcmludGYoICJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuVGhyZWFkc1xuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iICk7CisgICAgaWYgKCBfX2ttcF90aHJlYWRzICE9IE5VTEwgKSB7CisgICAgICAgIGludCBndGlkOworICAgICAgICBmb3IgKCBndGlkID0gMDsgZ3RpZCA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7ICsrIGd0aWQgKSB7CisgICAgICAgICAgICBrbXBfaW5mb190IGNvbnN0ICogdGhyZWFkID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgICAgICAgICAgaWYgKCB0aHJlYWQgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoICJHVElEICUyZCAlcDpcbiIsIGd0aWQsIHRocmVhZCApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50ZiggICAgICAgICAgICAgICAgICIgICAgT3VyIFJvb3Q6ICAgICAgICAlcFxuIiwgdGhyZWFkLT50aC50aF9yb290ICk7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRfc3RydWN0dXJlX3RlYW0oICAgIiAgICBPdXIgVGVhbTogICAgICIsICAgICAgICB0aHJlYWQtPnRoLnRoX3RlYW0gKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmVfdGVhbSggICAiICAgIFNlcmlhbCBUZWFtOiAgIiwgICAgICAgIHRocmVhZC0+dGgudGhfc2VyaWFsX3RlYW0gKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoICAgICAgICAgICAgICAgICAiICAgIFRocmVhZHM6ICAgICAgJTJkXG4iLCAgIHRocmVhZC0+dGgudGhfdGVhbV9ucHJvYyApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90aHJlYWQoICIgICAgTWFzdGVyOiAgICAgICAiLCAgICAgICAgdGhyZWFkLT50aC50aF90ZWFtX21hc3RlciApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50ZiggICAgICAgICAgICAgICAgICIgICAgU2VyaWFsaXplZD86ICAlMmRcbiIsICAgdGhyZWFkLT50aC50aF90ZWFtX3NlcmlhbGl6ZWQgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoICAgICAgICAgICAgICAgICAiICAgIFNldCBOUHJvYzogICAgJTJkXG4iLCAgIHRocmVhZC0+dGgudGhfc2V0X25wcm9jICk7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoICAgICAgICAgICAgICAgICAiICAgIFNldCBQcm9jIEJpbmQ6ICUyZFxuIiwgIHRocmVhZC0+dGgudGhfc2V0X3Byb2NfYmluZCApOworI2VuZGlmCisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRfc3RydWN0dXJlX3RocmVhZCggIiAgICBOZXh0IGluIHBvb2w6ICIsICAgICAgICB0aHJlYWQtPnRoLnRoX25leHRfcG9vbCApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50ZiggIlxuIiApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90ZWFtX2FjY3VtKCBsaXN0LCB0aHJlYWQtPnRoLnRoX3RlYW0gKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmVfdGVhbV9hY2N1bSggbGlzdCwgdGhyZWFkLT50aC50aF9zZXJpYWxfdGVhbSApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gZm9yIGd0aWQKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9wcmludGYoICJUaHJlYWRzIGFycmF5IGlzIG5vdCBhbGxvY2F0ZWQuXG4iICk7CisgICAgfTsgLy8gaWYKKworICAgIC8vIFByaW50IG91dCBfX2ttcF9yb290IGFycmF5LgorICAgIF9fa21wX3ByaW50ZiggIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5VYmVyc1xuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iICk7CisgICAgaWYgKCBfX2ttcF9yb290ICE9IE5VTEwgKSB7CisgICAgICAgIGludCBndGlkOworICAgICAgICBmb3IgKCBndGlkID0gMDsgZ3RpZCA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7ICsrIGd0aWQgKSB7CisgICAgICAgICAgICBrbXBfcm9vdF90IGNvbnN0ICogcm9vdCA9IF9fa21wX3Jvb3RbIGd0aWQgXTsKKyAgICAgICAgICAgIGlmICggcm9vdCAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50ZiggIkdUSUQgJTJkICVwOlxuIiwgZ3RpZCwgcm9vdCApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90ZWFtKCAgICIgICAgUm9vdCBUZWFtOiAgICAiLCAgICAgIHJvb3QtPnIucl9yb290X3RlYW0gKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmVfdGVhbSggICAiICAgIEhvdCBUZWFtOiAgICAgIiwgICAgICByb290LT5yLnJfaG90X3RlYW0gKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmVfdGhyZWFkKCAiICAgIFViZXIgVGhyZWFkOiAgIiwgICAgICByb290LT5yLnJfdWJlcl90aHJlYWQgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoICAgICAgICAgICAgICAgICAiICAgIEFjdGl2ZT86ICAgICAgJTJkXG4iLCByb290LT5yLnJfYWN0aXZlICk7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRmKCAgICAgICAgICAgICAgICAgIiAgICBOZXN0ZWQ/OiAgICAgICUyZFxuIiwgcm9vdC0+ci5yX25lc3RlZCApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50ZiggICAgICAgICAgICAgICAgICIgICAgSW4gUGFyYWxsZWw6ICAlMmRcbiIsIHJvb3QtPnIucl9pbl9wYXJhbGxlbCApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50ZiggIlxuIiApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90ZWFtX2FjY3VtKCBsaXN0LCByb290LT5yLnJfcm9vdF90ZWFtICk7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRfc3RydWN0dXJlX3RlYW1fYWNjdW0oIGxpc3QsIHJvb3QtPnIucl9ob3RfdGVhbSApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gZm9yIGd0aWQKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9wcmludGYoICJVYmVycyBhcnJheSBpcyBub3QgYWxsb2NhdGVkLlxuIiApOworICAgIH07IC8vIGlmCisKKyAgICBfX2ttcF9wcmludGYoICJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuVGVhbXNcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIiApOworICAgIHdoaWxlICggbGlzdC0+bmV4dCAhPSBOVUxMICkgeworICAgICAgICBrbXBfdGVhbV9wIGNvbnN0ICogdGVhbSA9IGxpc3QtPmVudHJ5OworICAgICAgICBpbnQgaTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCAiVGVhbSAlMnggJXA6XG4iLCB0ZWFtLT50LnRfaWQsIHRlYW0gKTsKKyAgICAgICAgX19rbXBfcHJpbnRfc3RydWN0dXJlX3RlYW0oICIgICAgUGFyZW50IFRlYW06ICAgICAgIiwgICAgICB0ZWFtLT50LnRfcGFyZW50ICk7CisgICAgICAgIF9fa21wX3ByaW50ZiggICAgICAgICAgICAgICAiICAgIE1hc3RlciBUSUQ6ICAgICAgICUyZFxuIiwgdGVhbS0+dC50X21hc3Rlcl90aWQgKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCAgICAgICAgICAgICAgICIgICAgTWF4IHRocmVhZHM6ICAgICAgJTJkXG4iLCB0ZWFtLT50LnRfbWF4X25wcm9jICk7CisgICAgICAgIF9fa21wX3ByaW50ZiggICAgICAgICAgICAgICAiICAgIExldmVscyBvZiBzZXJpYWw6ICUyZFxuIiwgdGVhbS0+dC50X3NlcmlhbGl6ZWQgKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCAgICAgICAgICAgICAgICIgICAgTnVtYmVyIHRocmVhZHM6ICAgJTJkXG4iLCB0ZWFtLT50LnRfbnByb2MgKTsKKyAgICAgICAgZm9yICggaSA9IDA7IGkgPCB0ZWFtLT50LnRfbnByb2M7ICsrIGkgKSB7CisgICAgICAgICAgICBfX2ttcF9wcmludGYoICAgICAgICAgICAiICAgIFRocmVhZCAlMmQ6ICAgICAgIiwgaSApOworICAgICAgICAgICAgX19rbXBfcHJpbnRfc3RydWN0dXJlX3RocmVhZCggIiIsIHRlYW0tPnQudF90aHJlYWRzWyBpIF0gKTsKKyAgICAgICAgfTsgLy8gZm9yIGkKKyAgICAgICAgX19rbXBfcHJpbnRfc3RydWN0dXJlX3RlYW0oICIgICAgTmV4dCBpbiBwb29sOiAgICAgIiwgICAgICB0ZWFtLT50LnRfbmV4dF9wb29sICk7CisgICAgICAgIF9fa21wX3ByaW50ZiggIlxuIiApOworICAgICAgICBsaXN0ID0gbGlzdC0+bmV4dDsKKyAgICB9OyAvLyB3aGlsZQorCisgICAgLy8gUHJpbnQgb3V0IF9fa21wX3RocmVhZF9wb29sIGFuZCBfX2ttcF90ZWFtX3Bvb2wuCisgICAgX19rbXBfcHJpbnRmKCAiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblBvb2xzXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIgKTsKKyAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmVfdGhyZWFkKCAgICJUaHJlYWQgcG9vbDogICAgICAgICAgIiwgKGttcF9pbmZvX3QgKilfX2ttcF90aHJlYWRfcG9vbCApOworICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90ZWFtKCAgICAgIlRlYW0gcG9vbDogICAgICAgICAgICAiLCAoa21wX3RlYW1fdCAqKV9fa21wX3RlYW1fcG9vbCApOworICAgIF9fa21wX3ByaW50ZiggIlxuIiApOworCisgICAgLy8gRnJlZSB0ZWFtIGxpc3QuCisgICAgd2hpbGUgKCBsaXN0ICE9IE5VTEwgKSB7CisgICAgICAgIGttcF90ZWFtX2xpc3RfaXRlbV90ICogaXRlbSA9IGxpc3Q7CisgICAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OworICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSggaXRlbSApOworICAgIH07IC8vIHdoaWxlCisKK30KKworI2VuZGlmCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBTdHVmZiBmb3IgcGVyLXRocmVhZCBmYXN0IHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisvLyAgVGFibGUgb2YgcHJpbWVzCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBfX2ttcF9wcmltZXNbXSA9IHsKKyAgMHg5ZTM3NzliMSwgMHhmZmU2Y2M1OSwgMHgyMTA5ZjZkZCwgMHg0Mzk3N2FiNSwKKyAgMHhiYTU3MDNmNSwgMHhiNDk1YTg3NywgMHhlMTYyNjc0MSwgMHg3OTY5NWU2YiwKKyAgMHhiYzk4YzA5ZiwgMHhkNWJlZTJiMywgMHgyODc0ODhmOSwgMHgzYWYxODIzMSwKKyAgMHg5Njc3Y2Q0ZCwgMHhiZTNhNjkyOSwgMHhhZGM2YTg3NywgMHhkY2YwNjc0YiwKKyAgMHhiZTRkNmZlOSwgMHg1ZjE1ZTIwMSwgMHg5OWFmYzNmZCwgMHhmM2YxNjgwMSwKKyAgMHhlMjIyY2ZmZiwgMHgyNGJhNWZkYiwgMHgwNjIwNDUyZCwgMHg3OWYxNDllMywKKyAgMHhjOGI5M2Y0OSwgMHg5NzI3MDJjZCwgMHhiMDdkZDgyNywgMHg2Yzk3ZDVlZCwKKyAgMHgwODVhM2Q2MSwgMHg0NmViNWVhNywgMHgzZDk5MTBlZCwgMHgyZTY4N2I1YiwKKyAgMHgyOTYwOTIyNywgMHg2ZWIwODFmMSwgMHgwOTU0YzRlMSwgMHg5ZDExNGRiOSwKKyAgMHg1NDJhY2ZhOSwgMHhiM2U2YmQ3YiwgMHgwNzQyZDkxNywgMHhlOWYzZmZhNywKKyAgMHg1NDU4MWVkYiwgMHhmMjQ4MGY0NSwgMHgwYmI5Mjg4ZiwgMHhlZjFhZmZjNywKKyAgMHg4NWZhMGNhNywgMHgzY2NjMTRkYiwgMHhlNmJhZjM0YiwgMHgzNDMzNzdmNywKKyAgMHg1Y2ExOTAzMSwgMHhlNmQ5MjkzYiwgMHhmMGE5ZjM5MSwgMHg1ZDJlOTgwYiwKKyAgMHhmYzQxMTA3MywgMHhjMzc0OTM2MywgMHhiODkyZDgyOSwgMHgzNTQ5MzY2YiwKKyAgMHg2Mjk3NTBhZCwgMHhiOTgyOTRlNSwgMHg4OTJkOTQ4MywgMHhjMjM1YmFmMywKKyAgMHgzZDI0MDJhMywgMHg2YmRlZjNjOSwgMHhiZWMzMzNjZCwgMHg0MGM5NTIwZgorfTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBfX2ttcF9nZXRfcmFuZG9tOiBHZXQgYSByYW5kb20gbnVtYmVyIHVzaW5nIGEgbGluZWFyIGNvbmdydWVudGlhbCBtZXRob2QuCisKK3Vuc2lnbmVkIHNob3J0CitfX2ttcF9nZXRfcmFuZG9tKCBrbXBfaW5mb190ICogdGhyZWFkICkKK3sKKyAgdW5zaWduZWQgeCA9IHRocmVhZC0+dGgudGhfeDsKKyAgdW5zaWduZWQgc2hvcnQgciA9IHg+PjE2OworCisgIHRocmVhZC0+dGgudGhfeCA9IHgqdGhyZWFkLT50aC50aF9hKzE7CisKKyAgS0FfVFJBQ0UoMzAsICgiX19rbXBfZ2V0X3JhbmRvbTogVEhSRUFEOiAlZCwgUkVUVVJOOiAldVxuIiwKKyAgICAgICAgIHRocmVhZC0+dGgudGhfaW5mby5kcy5kc190aWQsIHIpICk7CisKKyAgcmV0dXJuIHI7Cit9CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF9pbml0X3JhbmRvbTogSW5pdGlhbGl6ZSBhIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisKK3ZvaWQKK19fa21wX2luaXRfcmFuZG9tKCBrbXBfaW5mb190ICogdGhyZWFkICkKK3sKKyAgdW5zaWduZWQgc2VlZCA9IHRocmVhZC0+dGgudGhfaW5mby5kcy5kc190aWQ7CisKKyAgdGhyZWFkLT50aC50aF9hID0gX19rbXBfcHJpbWVzW3NlZWQlKHNpemVvZihfX2ttcF9wcmltZXMpL3NpemVvZihfX2ttcF9wcmltZXNbMF0pKV07CisgIHRocmVhZC0+dGgudGhfeCA9IChzZWVkKzEpKnRocmVhZC0+dGgudGhfYSsxOworICBLQV9UUkFDRSgzMCwgKCJfX2ttcF9pbml0X3JhbmRvbTogVEhSRUFEOiAldTsgQTogJXVcbiIsIHNlZWQsIHRocmVhZC0+dGgudGhfYSkgKTsKK30KKworCisjaWYgS01QX09TX1dJTkRPV1MKKy8qIHJlY2xhaW0gYXJyYXkgZW50cmllcyBmb3Igcm9vdCB0aHJlYWRzIHRoYXQgYXJlIGFscmVhZHkgZGVhZCwgcmV0dXJucyBudW1iZXIgcmVjbGFpbWVkICovCitzdGF0aWMgaW50CitfX2ttcF9yZWNsYWltX2RlYWRfcm9vdHModm9pZCkgeworICAgIGludCBpLCByID0gMDsKKworICAgIGZvcihpID0gMDsgaSA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7ICsraSkgeworICAgICAgICBpZiggS01QX1VCRVJfR1RJRCggaSApICYmCisgICAgICAgICAgIV9fa21wX3N0aWxsX3J1bm5pbmcoKGttcF9pbmZvX3QgKilUQ1JfU1lOQ19QVFIoX19rbXBfdGhyZWFkc1tpXSkpICYmCisgICAgICAgICAgIV9fa21wX3Jvb3RbaV0tPnIucl9hY3RpdmUgKSB7IC8vIEFDOiByZWNsYWltIG9ubHkgcm9vdHMgZGllZCBpbiBub24tYWN0aXZlIHN0YXRlCisgICAgICAgICAgICByICs9IF9fa21wX3VucmVnaXN0ZXJfcm9vdF9vdGhlcl90aHJlYWQoaSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHI7Cit9CisjZW5kaWYKKworLyoKKyAgIFRoaXMgZnVuY3Rpb24gYXR0ZW1wdHMgdG8gY3JlYXRlIGZyZWUgZW50cmllcyBpbiBfX2ttcF90aHJlYWRzIGFuZCBfX2ttcF9yb290LCBhbmQgcmV0dXJucyB0aGUgbnVtYmVyIG9mCisgICBmcmVlIGVudHJpZXMgZ2VuZXJhdGVkLgorCisgICBGb3IgV2luZG93cyogT1Mgc3RhdGljIGxpYnJhcnksIHRoZSBmaXJzdCBtZWNoYW5pc20gdXNlZCBpcyB0byByZWNsYWltIGFycmF5IGVudHJpZXMgZm9yIHJvb3QgdGhyZWFkcyB0aGF0IGFyZQorICAgYWxyZWFkeSBkZWFkLgorCisgICBPbiBhbGwgcGxhdGZvcm1zLCBleHBhbnNpb24gaXMgYXR0ZW1wdGVkIG9uIHRoZSBhcnJheXMgX19rbXBfdGhyZWFkc18gYW5kIF9fa21wX3Jvb3QsIHdpdGggYXBwcm9wcmlhdGUKKyAgIHVwZGF0ZSB0byBfX2ttcF90aHJlYWRzX2NhcGFjaXR5LiAgQXJyYXkgY2FwYWNpdHkgaXMgaW5jcmVhc2VkIGJ5IGRvdWJsaW5nIHdpdGggY2xpcHBpbmcgdG8KKyAgICBfX2ttcF90cF9jYXBhY2l0eSwgaWYgdGhyZWFkcHJpdmF0ZSBjYWNoZSBhcnJheSBoYXMgYmVlbiBjcmVhdGVkLgorICAgU3luY2hyb25pemF0aW9uIHdpdGggX19rbXBjX3RocmVhZHByaXZhdGVfY2FjaGVkIGlzIGRvbmUgdXNpbmcgX19rbXBfdHBfY2FjaGVkX2xvY2suCisKKyAgIEFmdGVyIGFueSBkZWFkIHJvb3QgcmVjbGFtYXRpb24sIGlmIHRoZSBjbGlwcGluZyB2YWx1ZSBhbGxvd3MgYXJyYXkgZXhwYW5zaW9uIHRvIHJlc3VsdCBpbiB0aGUgZ2VuZXJhdGlvbgorICAgb2YgYSB0b3RhbCBvZiBuV2lzaCBmcmVlIHNsb3RzLCB0aGUgZnVuY3Rpb24gZG9lcyB0aGF0IGV4cGFuc2lvbi4gIElmIG5vdCwgYnV0IHRoZSBjbGlwcGluZyB2YWx1ZSBhbGxvd3MKKyAgIGFycmF5IGV4cGFuc2lvbiB0byByZXN1bHQgaW4gdGhlIGdlbmVyYXRpb24gb2YgYSB0b3RhbCBvZiBuTmVlZCBmcmVlIHNsb3RzLCB0aGUgZnVuY3Rpb24gZG9lcyB0aGF0IGV4cGFuc2lvbi4KKyAgIE90aGVyd2lzZSwgbm90aGluZyBpcyBkb25lIGJleW9uZCB0aGUgcG9zc2libGUgaW5pdGlhbCByb290IHRocmVhZCByZWNsYW1hdGlvbi4gIEhvd2V2ZXIsIGlmIG5OZWVkIGlzIHplcm8sCisgICBhIGJlc3QtZWZmb3J0IGF0dGVtcHQgaXMgbWFkZSB0byBmdWxmaWwgbldpc2ggYXMgZmFyIGFzIHBvc3NpYmxlLCBpLmUuIHRoZSBmdW5jdGlvbiB3aWxsIGF0dGVtcHQgdG8gY3JlYXRlCisgICBhcyBtYW55IGZyZWUgc2xvdHMgYXMgcG9zc2libGUgdXAgdG8gbldpc2guCisKKyAgIElmIGFueSBhcmd1bWVudCBpcyBuZWdhdGl2ZSwgdGhlIGJlaGF2aW9yIGlzIHVuZGVmaW5lZC4KKyovCitzdGF0aWMgaW50CitfX2ttcF9leHBhbmRfdGhyZWFkcyhpbnQgbldpc2gsIGludCBuTmVlZCkgeworICAgIGludCBhZGRlZCA9IDA7CisgICAgaW50IG9sZF90cF9jYWNoZWQ7CisgICAgaW50IF9fa21wX2FjdHVhbF9tYXhfbnRoOworCisgICAgaWYobk5lZWQgPiBuV2lzaCkgLyogbm9ybWFsaXplIHRoZSBhcmd1bWVudHMgKi8KKyAgICAgICAgbldpc2ggPSBuTmVlZDsKKyNpZiBLTVBfT1NfV0lORE9XUyAmJiAhZGVmaW5lZCBLTVBfRFlOQU1JQ19MSUIKKy8qIG9ubHkgZm9yIFdpbmRvd3Mgc3RhdGljIGxpYnJhcnkgKi8KKyAgICAvKiByZWNsYWltIGFycmF5IGVudHJpZXMgZm9yIHJvb3QgdGhyZWFkcyB0aGF0IGFyZSBhbHJlYWR5IGRlYWQgKi8KKyAgICBhZGRlZCA9IF9fa21wX3JlY2xhaW1fZGVhZF9yb290cygpOworCisgICAgaWYobk5lZWQpIHsKKyAgICAgICAgbk5lZWQgLT0gYWRkZWQ7CisgICAgICAgIGlmKG5OZWVkIDwgMCkKKyAgICAgICAgICAgIG5OZWVkID0gMDsKKyAgICB9CisgICAgaWYobldpc2gpIHsKKyAgICAgICAgbldpc2ggLT0gYWRkZWQ7CisgICAgICAgIGlmKG5XaXNoIDwgMCkKKyAgICAgICAgICAgIG5XaXNoID0gMDsKKyAgICB9CisjZW5kaWYKKyAgICBpZihuV2lzaCA8PSAwKQorICAgICAgICByZXR1cm4gYWRkZWQ7CisKKyAgICB3aGlsZSgxKSB7CisgICAgICAgIGludCBuVGFyZ2V0OworICAgICAgICBpbnQgbWluaW11bVJlcXVpcmVkQ2FwYWNpdHk7CisgICAgICAgIGludCBuZXdDYXBhY2l0eTsKKyAgICAgICAga21wX2luZm9fdCAqKm5ld1RocmVhZHM7CisgICAgICAgIGttcF9yb290X3QgKipuZXdSb290OworCisgICAgICAgIC8vCisgICAgICAgIC8vIE5vdGUgdGhhdCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5IGlzIG5vdCBib3VuZGVkIGJ5IF9fa21wX21heF9udGguCisgICAgICAgIC8vIElmIF9fa21wX21heF9udGggaXMgc2V0IHRvIHNvbWUgdmFsdWUgbGVzcyB0aGFuIF9fa21wX3N5c19tYXhfbnRoCisgICAgICAgIC8vIGJ5IHRoZSB1c2VyIHZpYSBPTVBfVEhSRUFEX0xJTUlULCB0aGVuIF9fa21wX3RocmVhZHNfY2FwYWNpdHkgbWF5CisgICAgICAgIC8vIGJlY29tZSA+IF9fa21wX21heF9udGggaW4gb25lIG9mIHR3byB3YXlzOgorICAgICAgICAvLworICAgICAgICAvLyAxKSBUaGUgaW5pdGlhbGl6YXRpb24gdGhyZWFkIChndGlkID0gMCkgZXhpdHMuICBfX2ttcF90aHJlYWRzWzBdCisgICAgICAgIC8vICAgIG1heSBub3QgYmUgcmVzdXNlZCBieSBhbm90aGVyIHRocmVhZCwgc28gd2UgbWF5IG5lZWQgdG8gaW5jcmVhc2UKKyAgICAgICAgLy8gICAgX19rbXBfdGhyZWFkc19jYXBhY2l0eSB0byBfX2ttcF9tYXhfdGhyZWFkcyArIDEuCisgICAgICAgIC8vCisgICAgICAgIC8vIDIpIE5ldyBmb3JlaWduIHJvb3QocykgYXJlIGVuY291bnRlcmVkLiAgV2UgYWx3YXlzIHJlZ2lzdGVyIG5ldworICAgICAgICAvLyAgICBmb3JlaWduIHJvb3RzLiAgVGhpcyBtYXkgY2F1c2UgYSBzbWFsbGVyICMgb2YgdGhyZWFkcyB0byBiZQorICAgICAgICAvLyAgICBhbGxvY2F0ZWQgYXQgc3Vic2VxdWVudCBwYXJhbGxlbCByZWdpb25zLCBidXQgdGhlIHdvcmtlciB0aHJlYWRzCisgICAgICAgIC8vICAgIGhhbmcgYXJvdW5kIChhbmQgZXZlbnR1YWxseSBnbyB0byBzbGVlcCkgYW5kIG5lZWQgc2xvdHMgaW4gdGhlCisgICAgICAgIC8vICAgIF9fa21wX3RocmVhZHNbXSBhcnJheS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gQW55d2F5LCB0aGF0IGlzIHRoZSByZWFzb24gZm9yIG1vdmluZyB0aGUgY2hlY2sgdG8gc2VlIGlmCisgICAgICAgIC8vIF9fa21wX21heF90aHJlYWRzIHdhcyBleGNlZWRlZCBpbnRvIF9fa21wX3Jlc2VlcnZlX3RocmVhZHMoKQorICAgICAgICAvLyBpbnN0ZWFkIG9mIGhhdmluZyBpdCBwZXJmb3JtZWQgaGVyZS4gLUJCCisgICAgICAgIC8vCisgICAgICAgIG9sZF90cF9jYWNoZWQgPSBfX2ttcF90cF9jYWNoZWQ7CisgICAgICAgIF9fa21wX2FjdHVhbF9tYXhfbnRoID0gb2xkX3RwX2NhY2hlZCA/IF9fa21wX3RwX2NhcGFjaXR5IDogX19rbXBfc3lzX21heF9udGg7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfYWN0dWFsX21heF9udGggPj0gX19rbXBfdGhyZWFkc19jYXBhY2l0eSk7CisKKyAgICAgICAgLyogY29tcHV0ZSBleHBhbnNpb24gaGVhZHJvb20gdG8gY2hlY2sgaWYgd2UgY2FuIGV4cGFuZCBhbmQgd2hldGhlciB0byBhaW0gZm9yIG5XaXNoIG9yIG5OZWVkICovCisgICAgICAgIG5UYXJnZXQgPSBuV2lzaDsKKyAgICAgICAgaWYoX19rbXBfYWN0dWFsX21heF9udGggLSBfX2ttcF90aHJlYWRzX2NhcGFjaXR5IDwgblRhcmdldCkgeworICAgICAgICAgICAgLyogY2FuJ3QgZnVsZmlsIG5XaXNoLCBzbyB0cnkgbk5lZWQgKi8KKyAgICAgICAgICAgIGlmKG5OZWVkKSB7CisgICAgICAgICAgICAgICAgblRhcmdldCA9IG5OZWVkOworICAgICAgICAgICAgICAgIGlmKF9fa21wX2FjdHVhbF9tYXhfbnRoIC0gX19rbXBfdGhyZWFkc19jYXBhY2l0eSA8IG5UYXJnZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogcG9zc2libGUgZXhwYW5zaW9uIHRvbyBzbWFsbCAtLSBnaXZlIHVwICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogYmVzdC1lZmZvcnQgKi8KKyAgICAgICAgICAgICAgICBuVGFyZ2V0ID0gX19rbXBfYWN0dWFsX21heF9udGggLSBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OworICAgICAgICAgICAgICAgIGlmKCFuVGFyZ2V0KSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGNhbiBleHBhbmQgYXQgYWxsIC0tIGdpdmUgdXAgKi8KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1pbmltdW1SZXF1aXJlZENhcGFjaXR5ID0gX19rbXBfdGhyZWFkc19jYXBhY2l0eSArIG5UYXJnZXQ7CisKKyAgICAgICAgbmV3Q2FwYWNpdHkgPSBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OworICAgICAgICBkb3sKKyAgICAgICAgICAgIG5ld0NhcGFjaXR5ID0KKyAgICAgICAgICAgICAgICBuZXdDYXBhY2l0eSA8PSAoX19rbXBfYWN0dWFsX21heF9udGggPj4gMSkgPworICAgICAgICAgICAgICAgIChuZXdDYXBhY2l0eSA8PCAxKSA6CisgICAgICAgICAgICAgICAgX19rbXBfYWN0dWFsX21heF9udGg7CisgICAgICAgIH0gd2hpbGUobmV3Q2FwYWNpdHkgPCBtaW5pbXVtUmVxdWlyZWRDYXBhY2l0eSk7CisgICAgICAgIG5ld1RocmVhZHMgPSAoa21wX2luZm9fdCoqKSBfX2ttcF9hbGxvY2F0ZSgoc2l6ZW9mKGttcF9pbmZvX3QqKSArIHNpemVvZihrbXBfcm9vdF90KikpICogbmV3Q2FwYWNpdHkgKyBDQUNIRV9MSU5FKTsKKyAgICAgICAgbmV3Um9vdCA9IChrbXBfcm9vdF90KiopICgoY2hhciopbmV3VGhyZWFkcyArIHNpemVvZihrbXBfaW5mb190KikgKiBuZXdDYXBhY2l0eSApOworICAgICAgICBLTVBfTUVNQ1BZKG5ld1RocmVhZHMsIF9fa21wX3RocmVhZHMsIF9fa21wX3RocmVhZHNfY2FwYWNpdHkgKiBzaXplb2Yoa21wX2luZm9fdCopKTsKKyAgICAgICAgS01QX01FTUNQWShuZXdSb290LCBfX2ttcF9yb290LCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5ICogc2l6ZW9mKGttcF9yb290X3QqKSk7CisgICAgICAgIG1lbXNldChuZXdUaHJlYWRzICsgX19rbXBfdGhyZWFkc19jYXBhY2l0eSwgMCwKKyAgICAgICAgICAgICAgIChuZXdDYXBhY2l0eSAtIF9fa21wX3RocmVhZHNfY2FwYWNpdHkpICogc2l6ZW9mKGttcF9pbmZvX3QqKSk7CisgICAgICAgIG1lbXNldChuZXdSb290ICsgX19rbXBfdGhyZWFkc19jYXBhY2l0eSwgMCwKKyAgICAgICAgICAgICAgIChuZXdDYXBhY2l0eSAtIF9fa21wX3RocmVhZHNfY2FwYWNpdHkpICogc2l6ZW9mKGttcF9yb290X3QqKSk7CisKKyAgICAgICAgaWYoIW9sZF90cF9jYWNoZWQgJiYgX19rbXBfdHBfY2FjaGVkICYmIG5ld0NhcGFjaXR5ID4gX19rbXBfdHBfY2FwYWNpdHkpIHsKKyAgICAgICAgICAgIC8qIF9fa21wX3RwX2NhY2hlZCBoYXMgY2hhbmdlZCwgaS5lLiBfX2ttcGNfdGhyZWFkcHJpdmF0ZV9jYWNoZWQgaGFzIGFsbG9jYXRlZCBhIHRocmVhZHByaXZhdGUgY2FjaGUKKyAgICAgICAgICAgICAgIHdoaWxlIHdlIHdlcmUgYWxsb2NhdGluZyB0aGUgZXhwYW5kZWQgYXJyYXksIGFuZCBvdXIgbmV3IGNhcGFjaXR5IGlzIGxhcmdlciB0aGFuIHRoZSB0aHJlYWRwcml2YXRlCisgICAgICAgICAgICAgICBjYWNoZSBjYXBhY2l0eSwgc28gd2Ugc2hvdWxkIGRlYWxsb2NhdGUgdGhlIGV4cGFuZGVkIGFycmF5cyBhbmQgdHJ5IGFnYWluLiAgVGhpcyBpcyB0aGUgZmlyc3QgY2hlY2sKKyAgICAgICAgICAgICAgIG9mIGEgZG91YmxlLWNoZWNrIHBhaXIuCisgICAgICAgICAgICAqLworICAgICAgICAgICAgX19rbXBfZnJlZShuZXdUaHJlYWRzKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOyAvKiBzdGFydCBvdmVyIGFuZCB0cnkgYWdhaW4gKi8KKyAgICAgICAgfQorICAgICAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCZfX2ttcF90cF9jYWNoZWRfbG9jayk7CisgICAgICAgIGlmKCFvbGRfdHBfY2FjaGVkICYmIF9fa21wX3RwX2NhY2hlZCAmJiBuZXdDYXBhY2l0eSA+IF9fa21wX3RwX2NhcGFjaXR5KSB7CisgICAgICAgICAgICAvKiBTYW1lIGNoZWNrIGFzIGFib3ZlLCBidXQgdGhpcyB0aW1lIHdpdGggdGhlIGxvY2sgc28gd2UgY2FuIGJlIHN1cmUgaWYgd2UgY2FuIHN1Y2NlZWQuICovCisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCZfX2ttcF90cF9jYWNoZWRfbG9jayk7CisgICAgICAgICAgICBfX2ttcF9mcmVlKG5ld1RocmVhZHMpOworICAgICAgICAgICAgY29udGludWU7IC8qIHN0YXJ0IG92ZXIgYW5kIHRyeSBhZ2FpbiAqLworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogc3VjY2VzcyAqLworICAgICAgICAgICAgLy8gX19rbXBfZnJlZSggX19rbXBfdGhyZWFkcyApOyAvLyBBVFQ6IEl0IGxlYWRzIHRvIGNyYXNoLiBOZWVkIHRvIGJlIGludmVzdGlnYXRlZC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAqKGttcF9pbmZvX3QqKnZvbGF0aWxlKikmX19rbXBfdGhyZWFkcyA9IG5ld1RocmVhZHM7CisgICAgICAgICAgICAqKGttcF9yb290X3QqKnZvbGF0aWxlKikmX19rbXBfcm9vdCA9IG5ld1Jvb3Q7CisgICAgICAgICAgICBhZGRlZCArPSBuZXdDYXBhY2l0eSAtIF9fa21wX3RocmVhZHNfY2FwYWNpdHk7CisgICAgICAgICAgICAqKHZvbGF0aWxlIGludCopJl9fa21wX3RocmVhZHNfY2FwYWNpdHkgPSBuZXdDYXBhY2l0eTsKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soJl9fa21wX3RwX2NhY2hlZF9sb2NrKTsKKyAgICAgICAgICAgIGJyZWFrOyAvKiBzdWNjZWVkZWQsIHNvIHdlIGNhbiBleGl0IHRoZSBsb29wICovCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGFkZGVkOworfQorCisvKiByZWdpc3RlciB0aGUgY3VycmVudCB0aHJlYWQgYXMgYSByb290IHRocmVhZCBhbmQgb2J0YWluIG91ciBndGlkICovCisvKiB3ZSBtdXN0IGhhdmUgdGhlIF9fa21wX2luaXR6X2xvY2sgaGVsZCBhdCB0aGlzIHBvaW50ICovCisvKiBBcmd1bWVudCBUUlVFIG9ubHkgaWYgYXJlIHRoZSB0aHJlYWQgdGhhdCBjYWxscyBmcm9tIF9fa21wX2RvX3NlcmlhbF9pbml0aWFsaXplKCkgKi8KK2ludAorX19rbXBfcmVnaXN0ZXJfcm9vdCggaW50IGluaXRpYWxfdGhyZWFkICkKK3sKKyAgICBrbXBfaW5mb190ICpyb290X3RocmVhZDsKKyAgICBrbXBfcm9vdF90ICpyb290OworICAgIGludCAgICAgICAgIGd0aWQ7CisgICAgaW50ICAgICAgICAgY2FwYWNpdHk7CisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJl9fa21wX2Zvcmtqb2luX2xvY2sgKTsKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfcmVnaXN0ZXJfcm9vdDogZW50ZXJlZFxuIikpOworICAgIEtNUF9NQigpOworCisKKyAgICAvKgorICAgICAgICAyMDA3LTAzLTAyOgorCisgICAgICAgIElmIGluaXRpYWwgdGhyZWFkIGRpZCBub3QgaW52b2tlIE9wZW5NUCBSVEwgeWV0LCBhbmQgdGhpcyB0aHJlYWQgaXMgbm90IGFuIGluaXRpYWwgb25lLAorICAgICAgICAiX19rbXBfYWxsX250aCA+PSBfX2ttcF90aHJlYWRzX2NhcGFjaXR5IiBjb25kaXRpb24gZG9lcyBub3Qgd29yayBhcyBleHBlY3RlZCAtLSBpdCBtYXkKKyAgICAgICAgcmV0dXJuIGZhbHNlICh0aGF0IG1lYW5zIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBlbXB0eSBzbG90IGluIF9fa21wX3RocmVhZHMgYXJyYXkpLCBidXQgaXQKKyAgICAgICAgaXMgcG9zc2libGUgdGhlIG9ubHkgZnJlZSBzbG90IGlzICMwLCB3aGljaCBpcyByZXNlcnZlZCBmb3IgaW5pdGlhbCB0aHJlYWQgYW5kIHNvIGNhbm5vdCBiZQorICAgICAgICB1c2VkIGZvciB0aGlzIG9uZS4gRm9sbG93aW5nIGNvZGUgd29ya2Fyb3VuZHMgdGhpcyBidWcuCisKKyAgICAgICAgSG93ZXZlciwgcmlnaHQgc29sdXRpb24gc2VlbXMgdG8gYmUgbm90IHJlc2VydmluZyBzbG90ICMwIGZvciBpbml0aWFsIHRocmVhZCBiZWNhdXNlOgorICAgICAgICAgICAgKDEpIHRoZXJlIGlzIG5vIG1hZ2ljIGluIHNsb3QgIzAsCisgICAgICAgICAgICAoMikgd2UgY2Fubm90IGRldGVjdCBpbml0aWFsIHRocmVhZCByZWxpYWJseSAodGhlIGZpcnN0IHRocmVhZCB3aGljaCBkb2VzIHNlcmlhbAorICAgICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uIG1heSBiZSBub3QgYSByZWFsIGluaXRpYWwgdGhyZWFkKS4KKyAgICAqLworICAgIGNhcGFjaXR5ID0gX19rbXBfdGhyZWFkc19jYXBhY2l0eTsKKyAgICBpZiAoICEgaW5pdGlhbF90aHJlYWQgJiYgVENSX1BUUihfX2ttcF90aHJlYWRzWzBdKSA9PSBOVUxMICkgeworICAgICAgICAtLSBjYXBhY2l0eTsKKyAgICB9OyAvLyBpZgorCisgICAgLyogc2VlIGlmIHRoZXJlIGFyZSB0b28gbWFueSB0aHJlYWRzICovCisgICAgaWYgKCBfX2ttcF9hbGxfbnRoID49IGNhcGFjaXR5ICYmICFfX2ttcF9leHBhbmRfdGhyZWFkcyggMSwgMSApICkgeworICAgICAgICBpZiAoIF9fa21wX3RwX2NhY2hlZCApIHsKKyAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudFJlZ2lzdGVyTmV3VGhyZWFkICksCisgICAgICAgICAgICAgICAgS01QX0hOVCggU2V0X0FMTF9USFJFQURQUklWQVRFLCBfX2ttcF90cF9jYXBhY2l0eSApLAorICAgICAgICAgICAgICAgIEtNUF9ITlQoIFBvc3NpYmxlU3lzdGVtTGltaXRPblRocmVhZHMgKSwKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudFJlZ2lzdGVyTmV3VGhyZWFkICksCisgICAgICAgICAgICAgICAgS01QX0hOVCggU3lzdGVtTGltaXRPblRocmVhZHMgKSwKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgIH07IC8vIGlmCisKKyAgICAvKiBmaW5kIGFuIGF2YWlsYWJsZSB0aHJlYWQgc2xvdCAqLworICAgIC8qIERvbid0IHJlYXNzaWduIHRoZSB6ZXJvIHNsb3Qgc2luY2Ugd2UgbmVlZCB0aGF0IHRvIG9ubHkgYmUgdXNlZCBieSBpbml0aWFsCisgICAgICAgdGhyZWFkICovCisgICAgZm9yKCBndGlkPShpbml0aWFsX3RocmVhZCA/IDAgOiAxKSA7IFRDUl9QVFIoX19rbXBfdGhyZWFkc1tndGlkXSkgIT0gTlVMTCA7IGd0aWQrKyApCisgICAgICAgIDsKKyAgICBLQV9UUkFDRSggMSwgKCJfX2ttcF9yZWdpc3Rlcl9yb290OiBmb3VuZCBzbG90IGluIHRocmVhZHMgYXJyYXk6IFQjJWRcbiIsIGd0aWQgKSk7CisgICAgS01QX0FTU0VSVCggZ3RpZCA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHkgKTsKKworICAgIC8qIHVwZGF0ZSBnbG9iYWwgYWNjb3VudGluZyAqLworICAgIF9fa21wX2FsbF9udGggKys7CisgICAgVENXXzQoX19rbXBfbnRoLCBfX2ttcF9udGggKyAxKTsKKworICAgIC8vCisgICAgLy8gaWYgX19rbXBfYWRqdXN0X2d0aWRfbW9kZSBpcyBzZXQsIHRoZW4gd2UgdXNlIG1ldGhvZCAjMSAoc3Agc2VhcmNoKQorICAgIC8vIGZvciBsb3cgbnVtYmVycyBvZiBwcm9jcywgYW5kIG1ldGhvZCAjMiAoa2V5ZWQgQVBJIGNhbGwpIGZvciBoaWdoZXIKKyAgICAvLyBudW1iZXJzIG9mIHByb2NzLgorICAgIC8vCisgICAgaWYgKCBfX2ttcF9hZGp1c3RfZ3RpZF9tb2RlICkgeworICAgICAgICBpZiAoIF9fa21wX2FsbF9udGggPj0gX19rbXBfdGxzX2d0aWRfbWluICkgeworICAgICAgICAgICAgaWYgKCBUQ1JfNChfX2ttcF9ndGlkX21vZGUpICE9IDIpIHsKKyAgICAgICAgICAgICAgICBUQ1dfNChfX2ttcF9ndGlkX21vZGUsIDIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKFRDUl80KF9fa21wX2d0aWRfbW9kZSkgIT0gMSApIHsKKyAgICAgICAgICAgICAgICBUQ1dfNChfX2ttcF9ndGlkX21vZGUsIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisjaWZkZWYgS01QX0FESlVTVF9CTE9DS1RJTUUKKyAgICAvKiBBZGp1c3QgYmxvY2t0aW1lIHRvIHplcm8gaWYgbmVjZXNzYXJ5ICAgICAgICAgICAgKi8KKyAgICAvKiBNaWRkbGUgaW5pdGlhbGl6YXRpb24gbWlnaHQgbm90IGhhdmUgb2NjdXJyZWQgeWV0ICovCisgICAgaWYgKCAhX19rbXBfZW52X2Jsb2NrdGltZSAmJiAoIF9fa21wX2F2YWlsX3Byb2MgPiAwICkgKSB7CisgICAgICAgIGlmICggX19rbXBfbnRoID4gX19rbXBfYXZhaWxfcHJvYyApIHsKKyAgICAgICAgICAgIF9fa21wX3plcm9fYnQgPSBUUlVFOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIEtNUF9BREpVU1RfQkxPQ0tUSU1FICovCisKKyAgICAvKiBzZXR1cCB0aGlzIG5ldyBoaWVyYXJjaHkgKi8KKyAgICBpZiggISAoIHJvb3QgPSBfX2ttcF9yb290W2d0aWRdICkpIHsKKyAgICAgICAgcm9vdCA9IF9fa21wX3Jvb3RbZ3RpZF0gPSAoa21wX3Jvb3RfdCopIF9fa21wX2FsbG9jYXRlKCBzaXplb2Yoa21wX3Jvb3RfdCkgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggISByb290LT5yLnJfcm9vdF90ZWFtICk7CisgICAgfQorCisgICAgX19rbXBfaW5pdGlhbGl6ZV9yb290KCByb290ICk7CisKKyAgICAvKiBzZXR1cCBuZXcgcm9vdCB0aHJlYWQgc3RydWN0dXJlICovCisgICAgaWYoIHJvb3QtPnIucl91YmVyX3RocmVhZCApIHsKKyAgICAgICAgcm9vdF90aHJlYWQgPSByb290LT5yLnJfdWJlcl90aHJlYWQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcm9vdF90aHJlYWQgPSAoa21wX2luZm9fdCopIF9fa21wX2FsbG9jYXRlKCBzaXplb2Yoa21wX2luZm9fdCkgKTsKKyAgICAgICAgaWYgKCBfX2ttcF9zdG9yYWdlX21hcCApIHsKKyAgICAgICAgICAgIF9fa21wX3ByaW50X3RocmVhZF9zdG9yYWdlX21hcCggcm9vdF90aHJlYWQsIGd0aWQgKTsKKyAgICAgICAgfQorICAgICAgICByb290X3RocmVhZC0+dGgudGhfaW5mbyAuZHMuZHNfZ3RpZCA9IGd0aWQ7CisgICAgICAgIHJvb3RfdGhyZWFkLT50aC50aF9yb290ID0gIHJvb3Q7CisgICAgICAgIGlmKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgICAgICByb290X3RocmVhZC0+dGgudGhfY29ucyA9IF9fa21wX2FsbG9jYXRlX2NvbnNfc3RhY2soIGd0aWQgKTsKKyAgICAgICAgfQorICAgICAgICAjaWYgVVNFX0ZBU1RfTUVNT1JZCisgICAgICAgICAgICBfX2ttcF9pbml0aWFsaXplX2Zhc3RfbWVtb3J5KCByb290X3RocmVhZCApOworICAgICAgICAjZW5kaWYgLyogVVNFX0ZBU1RfTUVNT1JZICovCisKKyAgICAgICAgI2lmIEtNUF9VU0VfQkdFVAorICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggcm9vdF90aHJlYWQtPnRoLnRoX2xvY2FsLmJnZXRfZGF0YSA9PSBOVUxMICk7CisgICAgICAgICAgICBfX2ttcF9pbml0aWFsaXplX2JnZXQoIHJvb3RfdGhyZWFkICk7CisgICAgICAgICNlbmRpZgorICAgICAgICBfX2ttcF9pbml0X3JhbmRvbSggcm9vdF90aHJlYWQgKTsgIC8vIEluaXRpYWxpemUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAgICB9CisKKyAgICAvKiBzZXR1cCB0aGUgc2VyaWFsIHRlYW0gaGVsZCBpbiByZXNlcnZlIGJ5IHRoZSByb290IHRocmVhZCAqLworICAgIGlmKCAhIHJvb3RfdGhyZWFkLT50aC50aF9zZXJpYWxfdGVhbSApIHsKKyAgICAgICAga21wX2ludGVybmFsX2NvbnRyb2xfdCByX2ljdnMgPSBfX2ttcF9nZXRfZ2xvYmFsX2ljdnMoKTsKKyAgICAgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9yZWdpc3Rlcl9yb290OiBiZWZvcmUgc2VyaWFsX3RlYW1cbiIgKSApOworCisgICAgICAgIHJvb3RfdGhyZWFkLT50aC50aF9zZXJpYWxfdGVhbSA9IF9fa21wX2FsbG9jYXRlX3RlYW0oIHJvb3QsIDEsIDEsCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgMCwgLy8gcm9vdCBwYXJhbGxlbCBpZAorI2VuZGlmCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICBwcm9jX2JpbmRfZGVmYXVsdCwKKyNlbmRpZgorICAgICAgICAgICZyX2ljdnMsCisgICAgICAgICAgMCBVU0VfTkVTVEVEX0hPVF9BUkcoTlVMTCkgKTsKKyAgICB9CisgICAgS01QX0FTU0VSVCggcm9vdF90aHJlYWQtPnRoLnRoX3NlcmlhbF90ZWFtICk7CisgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9yZWdpc3Rlcl9yb290OiBhZnRlciBzZXJpYWxfdGVhbSA9ICVwXG4iLAorICAgICAgcm9vdF90aHJlYWQtPnRoLnRoX3NlcmlhbF90ZWFtICkgKTsKKworICAgIC8qIGRyb3Agcm9vdF90aHJlYWQgaW50byBwbGFjZSAqLworICAgIFRDV19TWU5DX1BUUihfX2ttcF90aHJlYWRzW2d0aWRdLCByb290X3RocmVhZCk7CisKKyAgICByb290LT5yLnJfcm9vdF90ZWFtLT50LnRfdGhyZWFkc1swXSA9IHJvb3RfdGhyZWFkOworICAgIHJvb3QtPnIucl9ob3RfdGVhbSAtPnQudF90aHJlYWRzWzBdID0gcm9vdF90aHJlYWQ7CisgICAgcm9vdF90aHJlYWQtPnRoLnRoX3NlcmlhbF90ZWFtLT50LnRfdGhyZWFkc1swXSA9IHJvb3RfdGhyZWFkOworICAgIHJvb3RfdGhyZWFkLT50aC50aF9zZXJpYWxfdGVhbS0+dC50X3NlcmlhbGl6ZWQgPSAwOyAvLyBBQzogdGhlIHRlYW0gY3JlYXRlZCBpbiByZXNlcnZlLCBub3QgZm9yIGV4ZWN1dGlvbiAoaXQgaXMgdW51c2VkIGZvciBub3cpLgorICAgIHJvb3QtPnIucl91YmVyX3RocmVhZCA9IHJvb3RfdGhyZWFkOworCisgICAgLyogaW5pdGlhbGl6ZSB0aGUgdGhyZWFkLCBnZXQgaXQgcmVhZHkgdG8gZ28gKi8KKyAgICBfX2ttcF9pbml0aWFsaXplX2luZm8oIHJvb3RfdGhyZWFkLCByb290LT5yLnJfcm9vdF90ZWFtLCAwLCBndGlkICk7CisKKyAgICAvKiBwcmVwYXJlIHRoZSBtYXN0ZXIgdGhyZWFkIGZvciBnZXRfZ3RpZCgpICovCisgICAgX19rbXBfZ3RpZF9zZXRfc3BlY2lmaWMoIGd0aWQgKTsKKworICAgIF9fa21wX2l0dF90aHJlYWRfbmFtZSggZ3RpZCApOworCisgICAgI2lmZGVmIEtNUF9UREFUQV9HVElECisgICAgICAgIF9fa21wX2d0aWQgPSBndGlkOworICAgICNlbmRpZgorICAgIF9fa21wX2NyZWF0ZV93b3JrZXIoIGd0aWQsIHJvb3RfdGhyZWFkLCBfX2ttcF9zdGtzaXplICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKSA9PSBndGlkICk7CisgICAgVENXXzQoX19rbXBfaW5pdF9ndGlkLCBUUlVFKTsKKworICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9yZWdpc3Rlcl9yb290OiBUIyVkIGluaXQgVCMlZCglZDolZCkgYXJyaXZlZDogam9pbj0ldSwgcGxhaW49JXVcbiIsCisgICAgICAgICAgICAgICAgICAgIGd0aWQsIF9fa21wX2d0aWRfZnJvbV90aWQoIDAsIHJvb3QtPnIucl9ob3RfdGVhbSApLAorICAgICAgICAgICAgICAgICAgICByb290LT5yLnJfaG90X3RlYW0tPnQudF9pZCwgMCwgS01QX0lOSVRfQkFSUklFUl9TVEFURSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0lOSVRfQkFSUklFUl9TVEFURSApICk7CisgICAgeyAvLyBJbml0aWFsaXplIGJhcnJpZXIgZGF0YS4KKyAgICAgICAgaW50IGI7CisgICAgICAgIGZvciAoIGIgPSAwOyBiIDwgYnNfbGFzdF9iYXJyaWVyOyArKyBiICkgeworICAgICAgICAgICAgcm9vdF90aHJlYWQtPnRoLnRoX2JhclsgYiBdLmJiLmJfYXJyaXZlZCAgICAgICAgPSBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFOworI2lmIFVTRV9ERUJVR0dFUgorICAgICAgICAgICAgcm9vdF90aHJlYWQtPnRoLnRoX2JhclsgYiBdLmJiLmJfd29ya2VyX2Fycml2ZWQgPSAwOworI2VuZGlmCisgICAgICAgIH07IC8vIGZvcgorICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKCByb290LT5yLnJfaG90X3RlYW0tPnQudF9iYXJbIGJzX2Zvcmtqb2luX2JhcnJpZXIgXS5iX2Fycml2ZWQgPT0gS01QX0lOSVRfQkFSUklFUl9TVEFURSApOworCisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIGlmICggVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICBfX2ttcF9hZmZpbml0eV9zZXRfaW5pdF9tYXNrKCBndGlkLCBUUlVFICk7CisgICAgfQorI2VuZGlmIC8qIEtNUF9BRkZJTklUWV9TVVBQT1JURUQgKi8KKworICAgIF9fa21wX3Jvb3RfY291bnRlciArKzsKKworICAgIEtNUF9NQigpOworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7CisKKyAgICByZXR1cm4gZ3RpZDsKK30KKworI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCitzdGF0aWMgaW50CitfX2ttcF9mcmVlX2hvdF90ZWFtcygga21wX3Jvb3RfdCAqcm9vdCwga21wX2luZm9fdCAqdGhyLCBpbnQgbGV2ZWwsIGNvbnN0IGludCBtYXhfbGV2ZWwgKQoreworICAgIGludCBpLCBuLCBudGg7CisgICAga21wX2hvdF90ZWFtX3B0cl90ICpob3RfdGVhbXMgPSB0aHItPnRoLnRoX2hvdF90ZWFtczsKKyAgICBpZiggIWhvdF90ZWFtcyB8fCAhaG90X3RlYW1zW2xldmVsXS5ob3RfdGVhbSApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQoIGxldmVsIDwgbWF4X2xldmVsICk7CisgICAga21wX3RlYW1fdCAqdGVhbSA9IGhvdF90ZWFtc1tsZXZlbF0uaG90X3RlYW07CisgICAgbnRoID0gaG90X3RlYW1zW2xldmVsXS5ob3RfdGVhbV9udGg7CisgICAgbiA9IG50aCAtIDE7ICAgICAgICAgICAgICAgICAgIC8vIG1hc3RlciBpcyBub3QgZnJlZWQKKyAgICBpZiggbGV2ZWwgPCBtYXhfbGV2ZWwgLSAxICkgeworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbnRoOyArK2kgKSB7CisgICAgICAgICAgICBrbXBfaW5mb190ICp0aCA9IHRlYW0tPnQudF90aHJlYWRzW2ldOworICAgICAgICAgICAgbiArPSBfX2ttcF9mcmVlX2hvdF90ZWFtcyggcm9vdCwgdGgsIGxldmVsICsgMSwgbWF4X2xldmVsICk7CisgICAgICAgICAgICBpZiggaSA+IDAgJiYgdGgtPnRoLnRoX2hvdF90ZWFtcyApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9mcmVlKCB0aC0+dGgudGhfaG90X3RlYW1zICk7CisgICAgICAgICAgICAgICAgdGgtPnRoLnRoX2hvdF90ZWFtcyA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgX19rbXBfZnJlZV90ZWFtKCByb290LCB0ZWFtLCBOVUxMICk7CisgICAgcmV0dXJuIG47Cit9CisjZW5kaWYKKworLyogUmVzZXRzIGEgcm9vdCB0aHJlYWQgYW5kIGNsZWFyIGl0cyByb290IGFuZCBob3QgdGVhbXMuCisgICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgX19rbXBfdGhyZWFkcyBlbnRyaWVzIGRpcmVjdGx5IGFuZCBpbmRpcmVjdGx5IGZyZWVkLgorKi8KK3N0YXRpYyBpbnQKK19fa21wX3Jlc2V0X3Jvb3QoaW50IGd0aWQsIGttcF9yb290X3QgKnJvb3QpCit7CisgICAga21wX3RlYW1fdCAqIHJvb3RfdGVhbSA9IHJvb3QtPnIucl9yb290X3RlYW07CisgICAga21wX3RlYW1fdCAqIGhvdF90ZWFtICA9IHJvb3QtPnIucl9ob3RfdGVhbTsKKyAgICBpbnQgICAgICAgICAgbiAgICAgICAgID0gaG90X3RlYW0tPnQudF9ucHJvYzsKKyAgICBpbnQgaTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoICEgcm9vdC0+ci5yX2FjdGl2ZSApOworCisgICAgcm9vdC0+ci5yX3Jvb3RfdGVhbSA9IE5VTEw7CisgICAgcm9vdC0+ci5yX2hvdF90ZWFtICA9IE5VTEw7CisgICAgICAgIC8vIF9fa21wX2ZyZWVfdGVhbSgpIGRvZXMgbm90IGZyZWUgaG90IHRlYW1zLCBzbyB3ZSBoYXZlIHRvIGNsZWFyIHJfaG90X3RlYW0gYmVmb3JlIGNhbGwKKyAgICAgICAgLy8gdG8gX19rbXBfZnJlZV90ZWFtKCkuCisgICAgX19rbXBfZnJlZV90ZWFtKCByb290LCByb290X3RlYW0gVVNFX05FU1RFRF9IT1RfQVJHKE5VTEwpICk7CisjaWYgS01QX05FU1RFRF9IT1RfVEVBTVMKKyAgICBpZiggX19rbXBfaG90X3RlYW1zX21heF9sZXZlbCA+IDEgKSB7ICAvLyBuZWVkIHRvIGZyZWUgbmVzdGVkIGhvdCB0ZWFtcyBhbmQgdGhlaXIgdGhyZWFkcyBpZiBhbnkKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IGhvdF90ZWFtLT50LnRfbnByb2M7ICsraSApIHsKKyAgICAgICAgICAgIGttcF9pbmZvX3QgKnRoID0gaG90X3RlYW0tPnQudF90aHJlYWRzW2ldOworICAgICAgICAgICAgbiArPSBfX2ttcF9mcmVlX2hvdF90ZWFtcyggcm9vdCwgdGgsIDEsIF9fa21wX2hvdF90ZWFtc19tYXhfbGV2ZWwgKTsKKyAgICAgICAgICAgIGlmKCB0aC0+dGgudGhfaG90X3RlYW1zICkgeworICAgICAgICAgICAgICAgIF9fa21wX2ZyZWUoIHRoLT50aC50aF9ob3RfdGVhbXMgKTsKKyAgICAgICAgICAgICAgICB0aC0+dGgudGhfaG90X3RlYW1zID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorICAgIF9fa21wX2ZyZWVfdGVhbSggcm9vdCwgaG90X3RlYW0gVVNFX05FU1RFRF9IT1RfQVJHKE5VTEwpICk7CisKKyAgICAvLworICAgIC8vIEJlZm9yZSB3ZSBjYW4gcmVhcCB0aGUgdGhyZWFkLCB3ZSBuZWVkIHRvIG1ha2UgY2VydGFpbiB0aGF0IGFsbAorICAgIC8vIG90aGVyIHRocmVhZHMgaW4gdGhlIHRlYW1zIHRoYXQgaGFkIHRoaXMgcm9vdCBhcyBhbmNlc3RvciBoYXZlIHN0b3BwZWQgdHJ5aW5nIHRvIHN0ZWFsIHRhc2tzLgorICAgIC8vCisgICAgaWYgKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApIHsKKyAgICAgICAgX19rbXBfd2FpdF90b191bnJlZl90YXNrX3RlYW1zKCk7CisgICAgfQorCisgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIC8qIENsb3NlIEhhbmRsZSBvZiByb290IGR1cGxpY2F0ZWQgaW4gX19rbXBfY3JlYXRlX3dvcmtlciAodHIgIzYyOTE5KSAqLworICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfcmVzZXRfcm9vdDogZnJlZSBoYW5kbGUsIHRoID0gJXAsIGhhbmRsZSA9ICUiIEtNUF9VSU5UUFRSX1NQRUMgIlxuIiwKKyAgICAgICAgICAgIChMUFZPSUQpJihyb290LT5yLnJfdWJlcl90aHJlYWQtPnRoKSwKKyAgICAgICAgICAgIHJvb3QtPnIucl91YmVyX3RocmVhZC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQgKSApOworICAgICAgICBfX2ttcF9mcmVlX2hhbmRsZSggcm9vdC0+ci5yX3ViZXJfdGhyZWFkLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCApOworICAgICNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworCisjaWYgT01QVF9TVVBQT1JUCisgICAgaWYgKG9tcHRfZW5hYmxlZCAmJgorICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfdGhyZWFkX2VuZCkpIHsKKyAgICAgICAgaW50IGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworICAgICAgICBfX29tcHRfdGhyZWFkX2VuZChvbXB0X3RocmVhZF9pbml0aWFsLCBndGlkKTsKKyAgICB9CisjZW5kaWYKKworICAgIFRDV180KF9fa21wX250aCwgX19rbXBfbnRoIC0gMSk7IC8vIF9fa21wX3JlYXBfdGhyZWFkIHdpbGwgZGVjcmVtZW50IF9fa21wX2FsbF9udGguCisgICAgX19rbXBfcmVhcF90aHJlYWQoIHJvb3QtPnIucl91YmVyX3RocmVhZCwgMSApOworCisgICAgICAgIC8vIFdlIGNhbm90IHB1dCByb290IHRocmVhZCB0byBfX2ttcF90aHJlYWRfcG9vbCwgc28gd2UgaGF2ZSB0byByZWFwIGl0IGlzdGVhZCBvZiBmcmVlaW5nLgorICAgIHJvb3QtPnIucl91YmVyX3RocmVhZCA9IE5VTEw7CisgICAgLyogbWFyayByb290IGFzIG5vIGxvbmdlciBpbiB1c2UgKi8KKyAgICByb290LT5yLnJfYmVnaW4gPSBGQUxTRTsKKworICAgIHJldHVybiBuOworfQorCit2b2lkCitfX2ttcF91bnJlZ2lzdGVyX3Jvb3RfY3VycmVudF90aHJlYWQoIGludCBndGlkICkKK3sKKyAgICBLQV9UUkFDRSggMSwgKCJfX2ttcF91bnJlZ2lzdGVyX3Jvb3RfY3VycmVudF90aHJlYWQ6IGVudGVyIFQjJWRcbiIsIGd0aWQgKSk7CisgICAgLyogdGhpcyBsb2NrIHNob3VsZCBiZSBvaywgc2luY2UgdW5yZWdpc3Rlcl9yb290X2N1cnJlbnRfdGhyZWFkIGlzIG5ldmVyIGNhbGxlZCBkdXJpbmcKKyAgICAgKiBhbmQgYWJvcnQsIG9ubHkgZHVyaW5nIGEgbm9ybWFsIGNsb3NlLiAgZnVydGhlcm1vcmUsIGlmIHlvdSBoYXZlIHRoZQorICAgICAqIGZvcmtqb2luIGxvY2ssIHlvdSBzaG91bGQgbmV2ZXIgdHJ5IHRvIGdldCB0aGUgaW5pdHogbG9jayAqLworCisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJl9fa21wX2Zvcmtqb2luX2xvY2sgKTsKKyAgICBpZiggVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSB8fCAhX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcF91bnJlZ2lzdGVyX3Jvb3RfY3VycmVudF90aHJlYWQ6IGFscmVhZHkgZmluaXNoZWQsIGV4aXRpbmcgVCMlZFxuIiwgZ3RpZCApKTsKKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2Zvcmtqb2luX2xvY2sgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBrbXBfcm9vdF90ICpyb290ID0gX19rbXBfcm9vdFtndGlkXTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3RocmVhZHMgJiYgX19rbXBfdGhyZWFkc1tndGlkXSApOworICAgIEtNUF9BU1NFUlQoIEtNUF9VQkVSX0dUSUQoIGd0aWQgKSk7CisgICAgS01QX0FTU0VSVCggcm9vdCA9PSBfX2ttcF90aHJlYWRzW2d0aWRdLT50aC50aF9yb290ICk7CisgICAgS01QX0FTU0VSVCggcm9vdC0+ci5yX2FjdGl2ZSA9PSBGQUxTRSApOworCisKKyAgICBLTVBfTUIoKTsKKworI2lmIE9NUF80MV9FTkFCTEVECisgICBrbXBfaW5mb190ICogdGhyZWFkID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKyAgIGttcF90ZWFtX3QgKiB0ZWFtID0gdGhyZWFkLT50aC50aF90ZWFtOworICAga21wX3Rhc2tfdGVhbV90ICogICB0YXNrX3RlYW0gPSB0aHJlYWQtPnRoLnRoX3Rhc2tfdGVhbTsKKworICAgLy8gd2UgbmVlZCB0byB3YWl0IGZvciB0aGUgcHJveHkgdGFza3MgYmVmb3JlIGZpbmlzaGluZyB0aGUgdGhyZWFkCisgICBpZiAoIHRhc2tfdGVhbSAhPSBOVUxMICYmIHRhc2tfdGVhbS0+dHQudHRfZm91bmRfcHJveHlfdGFza3MgKSB7CisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgIC8vIHRoZSBydW50aW1lIGlzIHNodXR0aW5nIGRvd24gc28gd2Ugd29uJ3QgcmVwb3J0IGFueSBldmVudHMKKyAgICAgICAgdGhyZWFkLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID0gb21wdF9zdGF0ZV91bmRlZmluZWQ7CisjZW5kaWYKKyAgICAgICAgX19rbXBfdGFza190ZWFtX3dhaXQodGhyZWFkLCB0ZWFtLCBOVUxMICk7CisgICB9CisjZW5kaWYKKworICAgIF9fa21wX3Jlc2V0X3Jvb3QoZ3RpZCwgcm9vdCk7CisKKyAgICAvKiBmcmVlIHVwIHRoaXMgdGhyZWFkIHNsb3QgKi8KKyAgICBfX2ttcF9ndGlkX3NldF9zcGVjaWZpYyggS01QX0dUSURfRE5FICk7CisjaWZkZWYgS01QX1REQVRBX0dUSUQKKyAgICBfX2ttcF9ndGlkID0gS01QX0dUSURfRE5FOworI2VuZGlmCisKKyAgICBLTVBfTUIoKTsKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBfdW5yZWdpc3Rlcl9yb290X2N1cnJlbnRfdGhyZWFkOiBUIyVkIHVucmVnaXN0ZXJlZFxuIiwgZ3RpZCApKTsKKworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7Cit9CisKKyNpZiBLTVBfT1NfV0lORE9XUworLyogX19rbXBfZm9ya2pvaW5fbG9jayBtdXN0IGJlIGFscmVhZHkgaGVsZAorICAgVW5yZWdpc3RlcnMgYSByb290IHRocmVhZCB0aGF0IGlzIG5vdCB0aGUgY3VycmVudCB0aHJlYWQuICBSZXR1cm5zIHRoZSBudW1iZXIgb2YKKyAgIF9fa21wX3RocmVhZHMgZW50cmllcyBmcmVlZCBhcyBhIHJlc3VsdC4KKyAqLworc3RhdGljIGludAorX19rbXBfdW5yZWdpc3Rlcl9yb290X290aGVyX3RocmVhZCggaW50IGd0aWQgKQoreworICAgIGttcF9yb290X3QgKnJvb3QgPSBfX2ttcF9yb290W2d0aWRdOworICAgIGludCByOworCisgICAgS0FfVFJBQ0UoIDEsICgiX19rbXBfdW5yZWdpc3Rlcl9yb290X290aGVyX3RocmVhZDogZW50ZXIgVCMlZFxuIiwgZ3RpZCApKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90aHJlYWRzICYmIF9fa21wX3RocmVhZHNbZ3RpZF0gKTsKKyAgICBLTVBfQVNTRVJUKCBLTVBfVUJFUl9HVElEKCBndGlkICkpOworICAgIEtNUF9BU1NFUlQoIHJvb3QgPT0gX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfcm9vdCApOworICAgIEtNUF9BU1NFUlQoIHJvb3QtPnIucl9hY3RpdmUgPT0gRkFMU0UgKTsKKworICAgIHIgPSBfX2ttcF9yZXNldF9yb290KGd0aWQsIHJvb3QpOworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcF91bnJlZ2lzdGVyX3Jvb3Rfb3RoZXJfdGhyZWFkOiBUIyVkIHVucmVnaXN0ZXJlZFxuIiwgZ3RpZCApKTsKKyAgICByZXR1cm4gcjsKK30KKyNlbmRpZgorCisjaWYgS01QX0RFQlVHCit2b2lkIF9fa21wX3Rhc2tfaW5mbygpIHsKKworICAgIGttcF9pbnQzMiBndGlkICAgICAgID0gX19rbXBfZW50cnlfZ3RpZCgpOworICAgIGttcF9pbnQzMiB0aWQgICAgICAgID0gX19rbXBfdGlkX2Zyb21fZ3RpZCggZ3RpZCApOworICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIGttcF90ZWFtX3QgKnN0ZWFtICAgID0gdGhpc190aHItPnRoLnRoX3NlcmlhbF90ZWFtOworICAgIGttcF90ZWFtX3QgKnRlYW0gICAgID0gdGhpc190aHItPnRoLnRoX3RlYW07CisKKyAgICBfX2ttcF9wcmludGYoICJfX2ttcF90YXNrX2luZm86IGd0aWQ9JWQgdGlkPSVkIHRfdGhyZWFkPSVwIHRlYW09JXAgY3VydGFzaz0lcCBwdGFzaz0lcFxuIiwKKyAgICAgICAgZ3RpZCwgdGlkLCB0aGlzX3RociwgdGVhbSwgdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzaywgdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS50ZF9wYXJlbnQgKTsKK30KKyNlbmRpZiAvLyBLTVBfREVCVUcKKworLyogVE9ETyBvcHRpbWl6ZSB3aXRoIG9uZSBiaWcgbWVtY2xyLCB0YWtlIG91dCB3aGF0IGlzbid0IG5lZWRlZCwKKyAqIHNwbGl0IHJlc3BvbnNpYmlsaXR5IHRvIHdvcmtlcnMgYXMgbXVjaCBhcyBwb3NzaWJsZSwgYW5kIGRlbGF5CisgKiBpbml0aWFsaXphdGlvbiBvZiBmZWF0dXJlcyBhcyBtdWNoIGFzIHBvc3NpYmxlICAqLworc3RhdGljIHZvaWQKK19fa21wX2luaXRpYWxpemVfaW5mbygga21wX2luZm9fdCAqdGhpc190aHIsIGttcF90ZWFtX3QgKnRlYW0sIGludCB0aWQsIGludCBndGlkICkKK3sKKyAgICAvKiB0aGlzX3Roci0+dGgudGhfaW5mby5kcy5kc19ndGlkIGlzIHNldHVwIGluIGttcF9hbGxvY2F0ZV90aHJlYWQvY3JlYXRlX3dvcmtlcgorICAgICAqIHRoaXNfdGhyLT50aC50aF9zZXJpYWxfdGVhbSBpcyBzZXR1cCBpbiBfX2ttcF9hbGxvY2F0ZV90aHJlYWQgKi8KKyAgICBrbXBfaW5mb190ICptYXN0ZXIgPSB0ZWFtLT50LnRfdGhyZWFkc1swXTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3RociAhPSBOVUxMICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhpc190aHItPnRoLnRoX3NlcmlhbF90ZWFtICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0tPnQudF90aHJlYWRzICApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0tPnQudF9kaXNwYXRjaCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIG1hc3RlciApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIG1hc3Rlci0+dGgudGhfcm9vdCApOworCisgICAgS01QX01CKCk7CisKKyAgICBUQ1dfU1lOQ19QVFIodGhpc190aHItPnRoLnRoX3RlYW0sIHRlYW0pOworCisgICAgdGhpc190aHItPnRoLnRoX2luZm8uZHMuZHNfdGlkICA9IHRpZDsKKyAgICB0aGlzX3Roci0+dGgudGhfc2V0X25wcm9jICAgICAgID0gMDsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIHRoaXNfdGhyLT50aC50aF9zZXRfcHJvY19iaW5kICAgPSBwcm9jX2JpbmRfZGVmYXVsdDsKKyMgaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIHRoaXNfdGhyLT50aC50aF9uZXdfcGxhY2UgICAgICAgPSB0aGlzX3Roci0+dGgudGhfY3VycmVudF9wbGFjZTsKKyMgZW5kaWYKKyNlbmRpZgorICAgIHRoaXNfdGhyLT50aC50aF9yb290ICAgICAgICAgICAgPSBtYXN0ZXItPnRoLnRoX3Jvb3Q7CisKKyAgICAvKiBzZXR1cCB0aGUgdGhyZWFkJ3MgY2FjaGUgb2YgdGhlIHRlYW0gc3RydWN0dXJlICovCisgICAgdGhpc190aHItPnRoLnRoX3RlYW1fbnByb2MgICAgICA9IHRlYW0tPnQudF9ucHJvYzsKKyAgICB0aGlzX3Roci0+dGgudGhfdGVhbV9tYXN0ZXIgICAgID0gbWFzdGVyOworICAgIHRoaXNfdGhyLT50aC50aF90ZWFtX3NlcmlhbGl6ZWQgPSB0ZWFtLT50LnRfc2VyaWFsaXplZDsKKyAgICBUQ1dfUFRSKHRoaXNfdGhyLT50aC50aF9zbGVlcF9sb2MsIE5VTEwpOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGEgKTsKKworICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfaW5pdGlhbGl6ZV9pbmZvMTogVCMlZDolZCB0aGlzX3RocmVhZD0lcCBjdXJ0YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgICAgICB0aWQsIGd0aWQsIHRoaXNfdGhyLCB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrICkgKTsKKworICAgIF9fa21wX2luaXRfaW1wbGljaXRfdGFzayggdGhpc190aHItPnRoLnRoX3RlYW1fbWFzdGVyLT50aC50aF9pZGVudCwgdGhpc190aHIsIHRlYW0sIHRpZCwgVFJVRSApOworCisgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9pbml0aWFsaXplX2luZm8yOiBUIyVkOiVkIHRoaXNfdGhyZWFkPSVwIGN1cnRhc2s9JXBcbiIsCisgICAgICAgICAgICAgICAgICAgIHRpZCwgZ3RpZCwgdGhpc190aHIsIHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2sgKSApOworICAgIC8vIFRPRE86IEluaXRpYWxpemUgSUNWcyBmcm9tIHBhcmVudDsgR0VIIC0gaXNuJ3QgdGhhdCBhbHJlYWR5IGRvbmUgaW4gX19rbXBfaW5pdGlhbGl6ZV90ZWFtKCk/CisKKyAgICAvKiBUT0RPIG5vIHdvcmtzaGFyaW5nIGluIHNwZWN1bGF0aXZlIHRocmVhZHMgKi8KKyAgICB0aGlzX3Roci0+dGgudGhfZGlzcGF0Y2ggICAgICA9ICZ0ZWFtLT50LnRfZGlzcGF0Y2hbIHRpZCBdOworCisgICAgdGhpc190aHItPnRoLnRoX2xvY2FsLnRoaXNfY29uc3RydWN0ID0gMDsKKworI2lmZGVmIEJVSUxEX1RWCisgICAgdGhpc190aHItPnRoLnRoX2xvY2FsLnR2X2RhdGEgPSAwOworI2VuZGlmCisKKyAgICBpZiAoICEgdGhpc190aHItPnRoLnRoX3ByaV9jb21tb24gKSB7CisgICAgICAgIHRoaXNfdGhyLT50aC50aF9wcmlfY29tbW9uID0gKHN0cnVjdCBjb21tb25fdGFibGUgKikgX19rbXBfYWxsb2NhdGUoIHNpemVvZihzdHJ1Y3QgY29tbW9uX3RhYmxlKSApOworICAgICAgICBpZiAoIF9fa21wX3N0b3JhZ2VfbWFwICkgeworICAgICAgICAgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCgKKyAgICAgICAgICAgICAgICBndGlkLCB0aGlzX3Roci0+dGgudGhfcHJpX2NvbW1vbiwgdGhpc190aHItPnRoLnRoX3ByaV9jb21tb24gKyAxLAorICAgICAgICAgICAgICAgIHNpemVvZiggc3RydWN0IGNvbW1vbl90YWJsZSApLCAidGhfJWQudGhfcHJpX2NvbW1vblxuIiwgZ3RpZAorICAgICAgICAgICAgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgdGhpc190aHItPnRoLnRoX3ByaV9oZWFkID0gTlVMTDsKKyAgICB9OyAvLyBpZgorCisgICAgLyogSW5pdGlhbGl6ZSBkeW5hbWljIGRpc3BhdGNoICovCisgICAgeworICAgICAgICB2b2xhdGlsZSBrbXBfZGlzcF90ICpkaXNwYXRjaCA9IHRoaXNfdGhyLT50aC50aF9kaXNwYXRjaDsKKyAgICAgICAgLyoKKyAgICAgICAgICogVXNlIHRlYW0gbWF4X25wcm9jIHNpbmNlIHRoaXMgd2lsbCBuZXZlciBjaGFuZ2UgZm9yIHRoZSB0ZWFtLgorICAgICAgICAgKi8KKyAgICAgICAgc2l6ZV90IGRpc3Bfc2l6ZSA9IHNpemVvZiggZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3QgKSAqCisgICAgICAgICAgICAoIHRlYW0tPnQudF9tYXhfbnByb2MgPT0gMSA/IDEgOiBLTVBfTUFYX0RJU1BfQlVGICk7CisgICAgICAgIEtEX1RSQUNFKCAxMCwgKCJfX2ttcF9pbml0aWFsaXplX2luZm86IFQjJWQgbWF4X25wcm9jOiAlZFxuIiwgZ3RpZCwgdGVhbS0+dC50X21heF9ucHJvYyApICk7CisgICAgICAgIEtNUF9BU1NFUlQoIGRpc3BhdGNoICk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0tPnQudF9kaXNwYXRjaCApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBkaXNwYXRjaCA9PSAmdGVhbS0+dC50X2Rpc3BhdGNoWyB0aWQgXSApOworCisgICAgICAgIGRpc3BhdGNoLT50aF9kaXNwX2luZGV4ID0gMDsKKworICAgICAgICBpZiggISBkaXNwYXRjaC0+dGhfZGlzcF9idWZmZXIgKSAgeworICAgICAgICAgICAgZGlzcGF0Y2gtPnRoX2Rpc3BfYnVmZmVyID0gKGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ICopIF9fa21wX2FsbG9jYXRlKCBkaXNwX3NpemUgKTsKKworICAgICAgICAgICAgaWYgKCBfX2ttcF9zdG9yYWdlX21hcCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCBndGlkLCAmZGlzcGF0Y2gtPnRoX2Rpc3BfYnVmZmVyWyAwIF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXNwYXRjaC0+dGhfZGlzcF9idWZmZXJbIHRlYW0tPnQudF9tYXhfbnByb2MgPT0gMSA/IDEgOiBLTVBfTUFYX0RJU1BfQlVGIF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3Bfc2l6ZSwgInRoXyVkLnRoX2Rpc3BhdGNoLnRoX2Rpc3BfYnVmZmVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIih0ZWFtXyVkLnRfZGlzcGF0Y2hbJWRdLnRoX2Rpc3BfYnVmZmVyKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgZ3RpZCApOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWVtc2V0KCAmIGRpc3BhdGNoLT50aF9kaXNwX2J1ZmZlclswXSwgJ1wwJywgZGlzcF9zaXplICk7CisgICAgICAgIH0KKworICAgICAgICBkaXNwYXRjaC0+dGhfZGlzcGF0Y2hfcHJfY3VycmVudCA9IDA7CisgICAgICAgIGRpc3BhdGNoLT50aF9kaXNwYXRjaF9zaF9jdXJyZW50ID0gMDsKKworICAgICAgICBkaXNwYXRjaC0+dGhfZGVvX2ZjbiA9IDA7ICAgICAgICAgICAgIC8qIE9SREVSRUQgICAgICovCisgICAgICAgIGRpc3BhdGNoLT50aF9keG9fZmNuID0gMDsgICAgICAgICAgICAgLyogRU5EIE9SREVSRUQgKi8KKyAgICB9CisKKyAgICB0aGlzX3Roci0+dGgudGhfbmV4dF9wb29sID0gTlVMTDsKKworICAgIGlmICghdGhpc190aHItPnRoLnRoX3Rhc2tfc3RhdGVfbWVtb19zdGFjaykgeworICAgICAgICBzaXplX3QgaTsKKyAgICAgICAgdGhpc190aHItPnRoLnRoX3Rhc2tfc3RhdGVfbWVtb19zdGFjayA9IChrbXBfdWludDggKikgX19rbXBfYWxsb2NhdGUoIDQqc2l6ZW9mKGttcF91aW50OCkgKTsKKyAgICAgICAgdGhpc190aHItPnRoLnRoX3Rhc2tfc3RhdGVfdG9wID0gMDsKKyAgICAgICAgdGhpc190aHItPnRoLnRoX3Rhc2tfc3RhdGVfc3RhY2tfc3ogPSA0OworICAgICAgICBmb3IgKGk9MDsgaTx0aGlzX3Roci0+dGgudGhfdGFza19zdGF0ZV9zdGFja19zejsgKytpKSAvLyB6ZXJvIGluaXQgdGhlIHN0YWNrCisgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfdGFza19zdGF0ZV9tZW1vX3N0YWNrW2ldID0gMDsKKyAgICB9CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCAhdGhpc190aHItPnRoLnRoX3NwaW5faGVyZSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoaXNfdGhyLT50aC50aF9uZXh0X3dhaXRpbmcgPT0gMCApOworCisgICAgS01QX01CKCk7Cit9CisKKworLyogYWxsb2NhdGUgYSBuZXcgdGhyZWFkIGZvciB0aGUgcmVxdWVzdGluZyB0ZWFtLiAgdGhpcyBpcyBvbmx5IGNhbGxlZCBmcm9tIHdpdGhpbiBhCisgKiBmb3Jram9pbiBjcml0aWNhbCBzZWN0aW9uLiAgd2Ugd2lsbCBmaXJzdCB0cnkgdG8gZ2V0IGFuIGF2YWlsYWJsZSB0aHJlYWQgZnJvbSB0aGUKKyAqIHRocmVhZCBwb29sLiAgaWYgbm9uZSBpcyBhdmFpbGFibGUsIHdlIHdpbGwgZm9yayBhIG5ldyBvbmUgYXNzdW1pbmcgd2UgYXJlIGFibGUKKyAqIHRvIGNyZWF0ZSBhIG5ldyBvbmUuICB0aGlzIHNob3VsZCBiZSBhc3N1cmVkLCBhcyB0aGUgY2FsbGVyIHNob3VsZCBjaGVjayBvbiB0aGlzCisgKiBmaXJzdC4KKyAqLwora21wX2luZm9fdCAqCitfX2ttcF9hbGxvY2F0ZV90aHJlYWQoIGttcF9yb290X3QgKnJvb3QsIGttcF90ZWFtX3QgKnRlYW0sIGludCBuZXdfdGlkICkKK3sKKyAgICBrbXBfdGVhbV90ICAqc2VyaWFsX3RlYW07CisgICAga21wX2luZm9fdCAgKm5ld190aHI7CisgICAgaW50ICAgICAgICAgIG5ld19ndGlkOworCisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2FsbG9jYXRlX3RocmVhZDogVCMlZFxuIiwgX19rbXBfZ2V0X2d0aWQoKSApKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCByb290ICYmIHRlYW0gKTsKKyNpZiAhS01QX05FU1RFRF9IT1RfVEVBTVMKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBLTVBfTUFTVEVSX0dUSUQoIF9fa21wX2dldF9ndGlkKCkgKSk7CisjZW5kaWYKKyAgICBLTVBfTUIoKTsKKworICAgIC8qIGZpcnN0LCB0cnkgdG8gZ2V0IG9uZSBmcm9tIHRoZSB0aHJlYWQgcG9vbCAqLworICAgIGlmICggX19rbXBfdGhyZWFkX3Bvb2wgKSB7CisKKyAgICAgICAgbmV3X3RociA9IChrbXBfaW5mb190KilfX2ttcF90aHJlYWRfcG9vbDsKKyAgICAgICAgX19rbXBfdGhyZWFkX3Bvb2wgPSAodm9sYXRpbGUga21wX2luZm9fdCAqKSBuZXdfdGhyLT50aC50aF9uZXh0X3Bvb2w7CisgICAgICAgIGlmICggbmV3X3RociA9PSBfX2ttcF90aHJlYWRfcG9vbF9pbnNlcnRfcHQgKSB7CisgICAgICAgICAgICBfX2ttcF90aHJlYWRfcG9vbF9pbnNlcnRfcHQgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIFRDV180KG5ld190aHItPnRoLnRoX2luX3Bvb2wsIEZBTFNFKTsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRG9uJ3QgdG91Y2ggdGhfYWN0aXZlX2luX3Bvb2wgb3IgdGhfYWN0aXZlLgorICAgICAgICAvLyBUaGUgd29ya2VyIHRocmVhZCBhZGp1c3RzIHRob3NlIGZsYWdzIGFzIGl0IHNsZWVwcy9hd2FrZW5zLgorICAgICAgICAvLworCisgICAgICAgIF9fa21wX3RocmVhZF9wb29sX250aC0tOworCisgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9hbGxvY2F0ZV90aHJlYWQ6IFQjJWQgdXNpbmcgdGhyZWFkIFQjJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIF9fa21wX2dldF9ndGlkKCksIG5ld190aHItPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCApKTsKKyAgICAgICAgS01QX0FTU0VSVCggICAgICAgISBuZXdfdGhyLT50aC50aF90ZWFtICk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX250aCA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHkgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGhyZWFkX3Bvb2xfbnRoID49IDAgKTsKKworICAgICAgICAvKiBzZXR1cCB0aGUgdGhyZWFkIHN0cnVjdHVyZSAqLworICAgICAgICBfX2ttcF9pbml0aWFsaXplX2luZm8oIG5ld190aHIsIHRlYW0sIG5ld190aWQsIG5ld190aHItPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBuZXdfdGhyLT50aC50aF9zZXJpYWxfdGVhbSApOworCisgICAgICAgIFRDV180KF9fa21wX250aCwgX19rbXBfbnRoICsgMSk7CisKKyAgICAgICAgbmV3X3Roci0+dGgudGhfdGFza19zdGF0ZSA9IDA7CisgICAgICAgIG5ld190aHItPnRoLnRoX3Rhc2tfc3RhdGVfdG9wID0gMDsKKyAgICAgICAgbmV3X3Roci0+dGgudGhfdGFza19zdGF0ZV9zdGFja19zeiA9IDQ7CisKKyNpZmRlZiBLTVBfQURKVVNUX0JMT0NLVElNRQorICAgICAgICAvKiBBZGp1c3QgYmxvY2t0aW1lIGJhY2sgdG8gemVybyBpZiBuZWNlc3NhciAgICAgIHkgKi8KKyAgICAgICAgLyogTWlkZGxlIGluaXRpYWxpemF0aW9uIG1pZ2h0IG5vdCBoYXZlIG9jY3VycmVkIHlldCAqLworICAgICAgICBpZiAoICFfX2ttcF9lbnZfYmxvY2t0aW1lICYmICggX19rbXBfYXZhaWxfcHJvYyA+IDAgKSApIHsKKyAgICAgICAgICAgIGlmICggX19rbXBfbnRoID4gX19rbXBfYXZhaWxfcHJvYyApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF96ZXJvX2J0ID0gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmIC8qIEtNUF9BREpVU1RfQkxPQ0tUSU1FICovCisKKyNpZiBLTVBfREVCVUcKKyAgICAgICAgLy8gSWYgdGhyZWFkIGVudGVyZWQgcG9vbCB2aWEgX19rbXBfZnJlZV90aHJlYWQsIHdhaXRfZmxhZyBzaG91bGQgIT0gS01QX0JBUlJJRVJfUEFSRU5UX0ZMQUcuCisgICAgICAgIGludCBiOworICAgICAgICBrbXBfYmFsaWduX3QgKiBiYWxpZ24gPSBuZXdfdGhyLT50aC50aF9iYXI7CisgICAgICAgIGZvciggYiA9IDA7IGIgPCBic19sYXN0X2JhcnJpZXI7ICsrIGIgKQorICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChiYWxpZ25bYl0uYmIud2FpdF9mbGFnICE9IEtNUF9CQVJSSUVSX1BBUkVOVF9GTEFHKTsKKyNlbmRpZgorCisgICAgICAgIEtGX1RSQUNFKCAxMCwgKCJfX2ttcF9hbGxvY2F0ZV90aHJlYWQ6IFQjJWQgdXNpbmcgdGhyZWFkICVwIFQjJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIF9fa21wX2dldF9ndGlkKCksIG5ld190aHIsIG5ld190aHItPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCApKTsKKworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgcmV0dXJuIG5ld190aHI7CisgICAgfQorCisKKyAgICAvKiBubywgd2VsbCBmb3JrIGEgbmV3IG9uZSAqLworICAgIEtNUF9BU1NFUlQoIF9fa21wX250aCAgICA9PSBfX2ttcF9hbGxfbnRoICk7CisgICAgS01QX0FTU0VSVCggX19rbXBfYWxsX250aCA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHkgKTsKKworICAgIC8vCisgICAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3Qgd29ya2VyIHRocmVhZCB0aGUgUlRMIGlzIGNyZWF0aW5nLCB0aGVuIGFsc28KKyAgICAvLyBsYXVuY2ggdGhlIG1vbml0b3IgdGhyZWFkLiAgV2UgdHJ5IHRvIGRvIHRoaXMgYXMgZWFybHkgYXMgcG9zc2libGUuCisgICAgLy8KKyAgICBpZiAoICEgVENSXzQoIF9fa21wX2luaXRfbW9uaXRvciApICkgeworICAgICAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX21vbml0b3JfbG9jayApOworICAgICAgICBpZiAoICEgVENSXzQoIF9fa21wX2luaXRfbW9uaXRvciApICkgeworICAgICAgICAgICAgS0ZfVFJBQ0UoIDEwLCAoICJiZWZvcmUgX19rbXBfY3JlYXRlX21vbml0b3JcbiIgKSApOworICAgICAgICAgICAgVENXXzQoIF9fa21wX2luaXRfbW9uaXRvciwgMSApOworICAgICAgICAgICAgX19rbXBfY3JlYXRlX21vbml0b3IoICYgX19rbXBfbW9uaXRvciApOworICAgICAgICAgICAgS0ZfVFJBQ0UoIDEwLCAoICJhZnRlciBfX2ttcF9jcmVhdGVfbW9uaXRvclxuIiApICk7CisgICAgICAgICAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgICAgICAgICAvLyBBQzogd2FpdCB1bnRpbCBtb25pdG9yIGhhcyBzdGFydGVkLiBUaGlzIGlzIGEgZml4IGZvciBDUTIzMjgwOC4KKyAgICAgICAgICAgICAgICAvLyAgICAgVGhlIHJlYXNvbiBpcyB0aGF0IGlmIHRoZSBsaWJyYXJ5IGlzIGxvYWRlZC91bmxvYWRlZCBpbiBhIGxvb3Agd2l0aCBzbWFsbCAocGFyYWxsZWwpCisgICAgICAgICAgICAgICAgLy8gICAgIHdvcmsgaW4gYmV0d2VlbiwgdGhlbiB0aGVyZSBpcyBoaWdoIHByb2JhYmlsaXR5IHRoYXQgbW9uaXRvciB0aHJlYWQgc3RhcnRlZCBhZnRlcgorICAgICAgICAgICAgICAgIC8vICAgICB0aGUgbGlicmFyeSBzaHV0ZG93bi4gQXQgc2h1dGRvd24gaXQgaXMgdG9vIGxhdGUgdG8gY29wZSB3aXRoIHRoZSBwcm9ibGVtLCBiZWNhdXNlCisgICAgICAgICAgICAgICAgLy8gICAgIHdoZW4gdGhlIG1hc3RlciBpcyBpbiBEbGxNYWluIChwcm9jZXNzIGRldGFjaCkgdGhlIG1vbml0b3IgaGFzIG5vIGNoYW5jZXMgdG8gc3RhcnQKKyAgICAgICAgICAgICAgICAvLyAgICAgKGl0IGlzIGJsb2NrZWQpLCBhbmQgbWFzdGVyIGhhcyBubyBtZWFucyB0byBpbmZvcm0gdGhlIG1vbml0b3IgdGhhdCB0aGUgbGlicmFyeSBoYXMgZ29uZSwKKyAgICAgICAgICAgICAgICAvLyAgICAgYmVjYXVzZSBhbGwgdGhlIG1lbW9yeSB3aGljaCB0aGUgbW9uaXRvciBjYW4gYWNjZXNzIGlzIGdvaW5nIHRvIGJlIHJlbGVhc2VkL3Jlc2V0LgorICAgICAgICAgICAgICAgIHdoaWxlICggVENSXzQoX19rbXBfaW5pdF9tb25pdG9yKSA8IDIgKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9ZSUVMRCggVFJVRSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBLRl9UUkFDRSggMTAsICggImFmdGVyIG1vbml0b3IgdGhyZWFkIGhhcyBzdGFydGVkXG4iICkgKTsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICB9CisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfbW9uaXRvcl9sb2NrICk7CisgICAgfQorCisgICAgS01QX01CKCk7CisgICAgZm9yKCBuZXdfZ3RpZD0xIDsgVENSX1BUUihfX2ttcF90aHJlYWRzW25ld19ndGlkXSkgIT0gTlVMTDsgKytuZXdfZ3RpZCApIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggbmV3X2d0aWQgPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5ICk7CisgICAgfQorCisgICAgLyogYWxsb2NhdGUgc3BhY2UgZm9yIGl0LiAqLworICAgIG5ld190aHIgPSAoa21wX2luZm9fdCopIF9fa21wX2FsbG9jYXRlKCBzaXplb2Yoa21wX2luZm9fdCkgKTsKKworICAgIFRDV19TWU5DX1BUUihfX2ttcF90aHJlYWRzW25ld19ndGlkXSwgbmV3X3Rocik7CisKKyAgICBpZiAoIF9fa21wX3N0b3JhZ2VfbWFwICkgeworICAgICAgICBfX2ttcF9wcmludF90aHJlYWRfc3RvcmFnZV9tYXAoIG5ld190aHIsIG5ld19ndGlkICk7CisgICAgfQorCisgICAgLyogYWRkIHRoZSByZXNlcnZlIHNlcmlhbGl6ZWQgdGVhbSwgaW5pdGlhbGl6ZWQgZnJvbSB0aGUgdGVhbSdzIG1hc3RlciB0aHJlYWQgKi8KKyAgICB7CisgICAga21wX2ludGVybmFsX2NvbnRyb2xfdCByX2ljdnMgPSBfX2ttcF9nZXRfeF9nbG9iYWxfaWN2cyggdGVhbSApOworICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfYWxsb2NhdGVfdGhyZWFkOiBiZWZvcmUgdGhfc2VyaWFsL3NlcmlhbF90ZWFtXG4iICkgKTsKKworICAgIG5ld190aHItPnRoLnRoX3NlcmlhbF90ZWFtID0gc2VyaWFsX3RlYW0gPQorICAgICAgICAoa21wX3RlYW1fdCopIF9fa21wX2FsbG9jYXRlX3RlYW0oIHJvb3QsIDEsIDEsCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLy8gcm9vdCBwYXJhbGxlbCBpZAorI2VuZGlmCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jX2JpbmRfZGVmYXVsdCwKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyX2ljdnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCBVU0VfTkVTVEVEX0hPVF9BUkcoTlVMTCkgKTsKKyAgICB9CisgICAgS01QX0FTU0VSVCAoIHNlcmlhbF90ZWFtICk7CisgICAgc2VyaWFsX3RlYW0tPnQudF9zZXJpYWxpemVkID0gMDsgICAvLyBBQzogdGhlIHRlYW0gY3JlYXRlZCBpbiByZXNlcnZlLCBub3QgZm9yIGV4ZWN1dGlvbiAoaXQgaXMgdW51c2VkIGZvciBub3cpLgorICAgIHNlcmlhbF90ZWFtLT50LnRfdGhyZWFkc1swXSA9IG5ld190aHI7CisgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9hbGxvY2F0ZV90aHJlYWQ6IGFmdGVyIHRoX3NlcmlhbC9zZXJpYWxfdGVhbSA6IG5ld190aHI9JXBcbiIsCisgICAgICBuZXdfdGhyICkgKTsKKworICAgIC8qIHNldHVwIHRoZSB0aHJlYWQgc3RydWN0dXJlcyAqLworICAgIF9fa21wX2luaXRpYWxpemVfaW5mbyggbmV3X3RociwgdGVhbSwgbmV3X3RpZCwgbmV3X2d0aWQgKTsKKworICAgICNpZiBVU0VfRkFTVF9NRU1PUlkKKyAgICAgICAgX19rbXBfaW5pdGlhbGl6ZV9mYXN0X21lbW9yeSggbmV3X3RociApOworICAgICNlbmRpZiAvKiBVU0VfRkFTVF9NRU1PUlkgKi8KKworICAgICNpZiBLTVBfVVNFX0JHRVQKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggbmV3X3Roci0+dGgudGhfbG9jYWwuYmdldF9kYXRhID09IE5VTEwgKTsKKyAgICAgICAgX19rbXBfaW5pdGlhbGl6ZV9iZ2V0KCBuZXdfdGhyICk7CisgICAgI2VuZGlmCisKKyAgICBfX2ttcF9pbml0X3JhbmRvbSggbmV3X3RociApOyAgLy8gSW5pdGlhbGl6ZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorCisgICAgLyogSW5pdGlhbGl6ZSB0aGVzZSBvbmx5IG9uY2Ugd2hlbiB0aHJlYWQgaXMgZ3JhYmJlZCBmb3IgYSB0ZWFtIGFsbG9jYXRpb24gKi8KKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfYWxsb2NhdGVfdGhyZWFkOiBUIyVkIGluaXQgZ28gZm9yaz0ldSwgcGxhaW49JXVcbiIsCisgICAgICAgICAgICAgICAgICAgIF9fa21wX2dldF9ndGlkKCksIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUsIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUgKSk7CisKKyAgICBpbnQgYjsKKyAgICBrbXBfYmFsaWduX3QgKiBiYWxpZ24gPSBuZXdfdGhyLT50aC50aF9iYXI7CisgICAgZm9yKGI9MDsgYjxic19sYXN0X2JhcnJpZXI7ICsrYikgeworICAgICAgICBiYWxpZ25bYl0uYmIuYl9nbyA9IEtNUF9JTklUX0JBUlJJRVJfU1RBVEU7CisgICAgICAgIGJhbGlnbltiXS5iYi50ZWFtID0gTlVMTDsKKyAgICAgICAgYmFsaWduW2JdLmJiLndhaXRfZmxhZyA9IEtNUF9CQVJSSUVSX05PVF9XQUlUSU5HOworICAgICAgICBiYWxpZ25bYl0uYmIudXNlX29uY29yZV9iYXJyaWVyID0gMDsKKyAgICB9CisKKyAgICBuZXdfdGhyLT50aC50aF9zcGluX2hlcmUgPSBGQUxTRTsKKyAgICBuZXdfdGhyLT50aC50aF9uZXh0X3dhaXRpbmcgPSAwOworCisjaWYgT01QXzQwX0VOQUJMRUQgJiYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIG5ld190aHItPnRoLnRoX2N1cnJlbnRfcGxhY2UgPSBLTVBfUExBQ0VfVU5ERUZJTkVEOworICAgIG5ld190aHItPnRoLnRoX25ld19wbGFjZSA9IEtNUF9QTEFDRV9VTkRFRklORUQ7CisgICAgbmV3X3Roci0+dGgudGhfZmlyc3RfcGxhY2UgPSBLTVBfUExBQ0VfVU5ERUZJTkVEOworICAgIG5ld190aHItPnRoLnRoX2xhc3RfcGxhY2UgPSBLTVBfUExBQ0VfVU5ERUZJTkVEOworI2VuZGlmCisKKyAgICBUQ1dfNChuZXdfdGhyLT50aC50aF9pbl9wb29sLCBGQUxTRSk7CisgICAgbmV3X3Roci0+dGgudGhfYWN0aXZlX2luX3Bvb2wgPSBGQUxTRTsKKyAgICBUQ1dfNChuZXdfdGhyLT50aC50aF9hY3RpdmUsIFRSVUUpOworCisgICAgLyogYWRqdXN0IHRoZSBnbG9iYWwgY291bnRlcnMgKi8KKyAgICBfX2ttcF9hbGxfbnRoICsrOworICAgIF9fa21wX250aCArKzsKKworICAgIC8vCisgICAgLy8gaWYgX19rbXBfYWRqdXN0X2d0aWRfbW9kZSBpcyBzZXQsIHRoZW4gd2UgdXNlIG1ldGhvZCAjMSAoc3Agc2VhcmNoKQorICAgIC8vIGZvciBsb3cgbnVtYmVycyBvZiBwcm9jcywgYW5kIG1ldGhvZCAjMiAoa2V5ZWQgQVBJIGNhbGwpIGZvciBoaWdoZXIKKyAgICAvLyBudW1iZXJzIG9mIHByb2NzLgorICAgIC8vCisgICAgaWYgKCBfX2ttcF9hZGp1c3RfZ3RpZF9tb2RlICkgeworICAgICAgICBpZiAoIF9fa21wX2FsbF9udGggPj0gX19rbXBfdGxzX2d0aWRfbWluICkgeworICAgICAgICAgICAgaWYgKCBUQ1JfNChfX2ttcF9ndGlkX21vZGUpICE9IDIpIHsKKyAgICAgICAgICAgICAgICBUQ1dfNChfX2ttcF9ndGlkX21vZGUsIDIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKFRDUl80KF9fa21wX2d0aWRfbW9kZSkgIT0gMSApIHsKKyAgICAgICAgICAgICAgICBUQ1dfNChfX2ttcF9ndGlkX21vZGUsIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisjaWZkZWYgS01QX0FESlVTVF9CTE9DS1RJTUUKKyAgICAvKiBBZGp1c3QgYmxvY2t0aW1lIGJhY2sgdG8gemVybyBpZiBuZWNlc3NhcnkgICAgICAgKi8KKyAgICAvKiBNaWRkbGUgaW5pdGlhbGl6YXRpb24gbWlnaHQgbm90IGhhdmUgb2NjdXJyZWQgeWV0ICovCisgICAgaWYgKCAhX19rbXBfZW52X2Jsb2NrdGltZSAmJiAoIF9fa21wX2F2YWlsX3Byb2MgPiAwICkgKSB7CisgICAgICAgIGlmICggX19rbXBfbnRoID4gX19rbXBfYXZhaWxfcHJvYyApIHsKKyAgICAgICAgICAgIF9fa21wX3plcm9fYnQgPSBUUlVFOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIEtNUF9BREpVU1RfQkxPQ0tUSU1FICovCisKKyAgICAvKiBhY3R1YWxseSBmb3JrIGl0IGFuZCBjcmVhdGUgdGhlIG5ldyB3b3JrZXIgdGhyZWFkICovCisgICAgS0ZfVFJBQ0UoIDEwLCAoIl9fa21wX2FsbG9jYXRlX3RocmVhZDogYmVmb3JlIF9fa21wX2NyZWF0ZV93b3JrZXI6ICVwXG4iLCBuZXdfdGhyICkpOworICAgIF9fa21wX2NyZWF0ZV93b3JrZXIoIG5ld19ndGlkLCBuZXdfdGhyLCBfX2ttcF9zdGtzaXplICk7CisgICAgS0ZfVFJBQ0UoIDEwLCAoIl9fa21wX2FsbG9jYXRlX3RocmVhZDogYWZ0ZXIgX19rbXBfY3JlYXRlX3dvcmtlcjogJXBcbiIsIG5ld190aHIgKSk7CisKKworICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9hbGxvY2F0ZV90aHJlYWQ6IFQjJWQgZm9ya2VkIFQjJWRcbiIsIF9fa21wX2dldF9ndGlkKCksIG5ld19ndGlkICkpOworICAgIEtNUF9NQigpOworICAgIHJldHVybiBuZXdfdGhyOworfQorCisvKgorICogcmVpbml0aWFsaXplIHRlYW0gZm9yIHJldXNlLgorICoKKyAqIFRoZSBob3QgdGVhbSBjb2RlIGNhbGxzIHRoaXMgY2FzZSBhdCBldmVyeSBmb3JrIGJhcnJpZXIsIHNvIEVQQ0MgYmFycmllcgorICogdGVzdCBhcmUgZXh0cmVtZWx5IHNlbnNpdGl2ZSB0byBjaGFuZ2VzIGluIGl0LCBlc3AuIHdyaXRlcyB0byB0aGUgdGVhbQorICogc3RydWN0LCB3aGljaCBjYXVzZSBhIGNhY2hlIGludmFsaWRhdGlvbiBpbiBhbGwgdGhyZWFkcy4KKyAqCisgKiBJRiBZT1UgVE9VQ0ggVEhJUyBST1VUSU5FLCBSVU4gRVBDQyBDIFNZTkNCRU5DSCBPTiBBIEJJRy1JUk9OIE1BQ0hJTkUhISEKKyAqLworc3RhdGljIHZvaWQKK19fa21wX3JlaW5pdGlhbGl6ZV90ZWFtKCBrbXBfdGVhbV90ICp0ZWFtLCBrbXBfaW50ZXJuYWxfY29udHJvbF90ICpuZXdfaWN2cywgaWRlbnRfdCAqbG9jICkgeworICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVpbml0aWFsaXplX3RlYW06IGVudGVyIHRoaXNfdGhyZWFkPSVwIHRlYW09JXBcbiIsCisgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF90aHJlYWRzWzBdLCB0ZWFtICkgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtICYmIG5ld19pY3ZzKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCAoICEgVENSXzQoX19rbXBfaW5pdF9wYXJhbGxlbCkgKSB8fCBuZXdfaWN2cy0+bnByb2MgKTsKKyAgICB0ZWFtLT50LnRfaWRlbnQgPSBsb2M7CisKKyAgICB0ZWFtLT50LnRfaWQgPSBLTVBfR0VOX1RFQU1fSUQoKTsKKworICAgIC8vIENvcHkgSUNWcyB0byB0aGUgbWFzdGVyIHRocmVhZCdzIGltcGxpY2l0IHRhc2tkYXRhCisgICAgX19rbXBfaW5pdF9pbXBsaWNpdF90YXNrKCBsb2MsIHRlYW0tPnQudF90aHJlYWRzWzBdLCB0ZWFtLCAwLCBGQUxTRSApOworICAgIGNvcHlfaWN2cygmdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbMF0udGRfaWN2cywgbmV3X2ljdnMpOworCisgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9yZWluaXRpYWxpemVfdGVhbTogZXhpdCB0aGlzX3RocmVhZD0lcCB0ZWFtPSVwXG4iLAorICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfdGhyZWFkc1swXSwgdGVhbSApICk7Cit9CisKKworLyogaW5pdGlhbGl6ZSB0aGUgdGVhbSBkYXRhIHN0cnVjdHVyZQorICogdGhpcyBhc3N1bWVzIHRoZSB0X3RocmVhZHMgYW5kIHRfbWF4X25wcm9jIGFyZSBhbHJlYWR5IHNldAorICogYWxzbywgd2UgZG9uJ3QgdG91Y2ggdGhlIGFyZ3VtZW50cyAqLworc3RhdGljIHZvaWQKK19fa21wX2luaXRpYWxpemVfdGVhbSgKKyAgICBrbXBfdGVhbV90ICogdGVhbSwKKyAgICBpbnQgICAgICAgICAgbmV3X25wcm9jLAorICAgIGttcF9pbnRlcm5hbF9jb250cm9sX3QgKiBuZXdfaWN2cywKKyAgICBpZGVudF90ICogICAgICAgICAgICAgICAgbG9jCispIHsKKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX2luaXRpYWxpemVfdGVhbTogZW50ZXI6IHRlYW09JXBcbiIsIHRlYW0gKSApOworCisgICAgLyogdmVyaWZ5ICovCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIG5ld19ucHJvYyA8PSB0ZWFtLT50LnRfbWF4X25wcm9jICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbS0+dC50X3RocmVhZHMgKTsKKyAgICBLTVBfTUIoKTsKKworICAgIHRlYW0tPnQudF9tYXN0ZXJfdGlkICA9IDA7ICAgIC8qIG5vdCBuZWVkZWQgKi8KKyAgICAvKiB0ZWFtLT50LnRfbWFzdGVyX2JhcjsgICAgICAgIG5vdCBuZWVkZWQgKi8KKyAgICB0ZWFtLT50LnRfc2VyaWFsaXplZCAgPSBuZXdfbnByb2MgPiAxID8gMCA6IDE7CisgICAgdGVhbS0+dC50X25wcm9jICAgICAgID0gbmV3X25wcm9jOworCisgICAgLyogdGVhbS0+dC50X3BhcmVudCAgICAgPSBOVUxMOyBUT0RPIG5vdCBuZWVkZWQgJiB3b3VsZCBtZXNzIHVwIGhvdCB0ZWFtICovCisgICAgdGVhbS0+dC50X25leHRfcG9vbCAgID0gTlVMTDsKKyAgICAvKiBtZW1zZXQoIHRlYW0tPnQudF90aHJlYWRzLCAwLCBzaXplb2Yoa21wX2luZm9fdCopKm5ld19ucHJvYyApOyB3b3VsZCBtZXNzIHVwIGhvdCB0ZWFtICovCisKKyAgICBUQ1dfU1lOQ19QVFIodGVhbS0+dC50X3BrZm4sIE5VTEwpOyAvKiBub3QgbmVlZGVkICovCisgICAgdGVhbS0+dC50X2ludm9rZSAgICAgID0gTlVMTDsgLyogbm90IG5lZWRlZCAqLworCisgICAgLy8gVE9ETz8/PzogdGVhbS0+dC50X21heF9hY3RpdmVfbGV2ZWxzICAgICAgID0gbmV3X21heF9hY3RpdmVfbGV2ZWxzOworICAgIHRlYW0tPnQudF9zY2hlZCAgICAgICA9IG5ld19pY3ZzLT5zY2hlZDsKKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyAgICB0ZWFtLT50LnRfZnBfY29udHJvbF9zYXZlZCA9IEZBTFNFOyAvKiBub3QgbmVlZGVkICovCisgICAgdGVhbS0+dC50X3g4N19mcHVfY29udHJvbF93b3JkID0gMDsgLyogbm90IG5lZWRlZCAqLworICAgIHRlYW0tPnQudF9teGNzciA9IDA7ICAgICAgICAgICAgICAgIC8qIG5vdCBuZWVkZWQgKi8KKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKyAgICB0ZWFtLT50LnRfY29uc3RydWN0ICAgPSAwOworICAgIF9fa21wX2luaXRfbG9jayggJiB0ZWFtLT50LnRfc2luZ2xlX2xvY2sgKTsKKworICAgIHRlYW0tPnQudF9vcmRlcmVkIC5kdC50X3ZhbHVlID0gMDsKKyAgICB0ZWFtLT50LnRfbWFzdGVyX2FjdGl2ZSA9IEZBTFNFOworCisgICAgbWVtc2V0KCAmIHRlYW0tPnQudF90YXNrcSwgJ1wwJywgc2l6ZW9mKCBrbXBfdGFza3FfdCApKTsKKworI2lmZGVmIEtNUF9ERUJVRworICAgIHRlYW0tPnQudF9jb3B5cHJpdl9kYXRhID0gTlVMTDsgIC8qIG5vdCBuZWNlc3NhcnksIGJ1dCBuaWNlIGZvciBkZWJ1Z2dpbmcgKi8KKyNlbmRpZgorICAgIHRlYW0tPnQudF9jb3B5aW5fY291bnRlciA9IDA7ICAgIC8qIGZvciBiYXJyaWVyLWZyZWUgY29weWluIGltcGxlbWVudGF0aW9uICovCisKKyAgICB0ZWFtLT50LnRfY29udHJvbF9zdGFja190b3AgPSBOVUxMOworCisgICAgX19rbXBfcmVpbml0aWFsaXplX3RlYW0oIHRlYW0sIG5ld19pY3ZzLCBsb2MgKTsKKworICAgIEtNUF9NQigpOworICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfaW5pdGlhbGl6ZV90ZWFtOiBleGl0OiB0ZWFtPSVwXG4iLCB0ZWFtICkgKTsKK30KKworI2lmIEtNUF9PU19MSU5VWCAmJiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisvKiBTZXRzIGZ1bGwgbWFzayBmb3IgdGhyZWFkIGFuZCByZXR1cm5zIG9sZCBtYXNrLCBubyBjaGFuZ2VzIHRvIHN0cnVjdHVyZXMuICovCitzdGF0aWMgdm9pZAorX19rbXBfc2V0X3RocmVhZF9hZmZpbml0eV9tYXNrX2Z1bGxfdG1wKCBrbXBfYWZmaW5fbWFza190ICpvbGRfbWFzayApCit7CisgICAgaWYgKCBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpICkgeworICAgICAgICBpbnQgc3RhdHVzOworICAgICAgICBpZiAoIG9sZF9tYXNrICE9IE5VTEwgKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBfX2ttcF9nZXRfc3lzdGVtX2FmZmluaXR5KCBvbGRfbWFzaywgVFJVRSApOworICAgICAgICAgICAgaW50IGVycm9yID0gZXJybm87CisgICAgICAgICAgICBpZiAoIHN0YXR1cyAhPSAwICkgeworICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDaGFuZ2VUaHJlYWRBZmZNYXNrRXJyb3IgKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIF9fa21wX3NldF9zeXN0ZW1fYWZmaW5pdHkoIF9fa21wX2FmZmluaXR5X2dldF9mdWxsTWFzaygpLCBUUlVFICk7CisgICAgfQorfQorI2VuZGlmCisKKyNpZiBPTVBfNDBfRU5BQkxFRCAmJiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisKKy8vCisvLyBfX2ttcF9wYXJ0aXRpb25fcGxhY2VzKCkgaXMgdGhlIGhlYXJ0IG9mIHRoZSBPcGVuTVAgNC4wIGFmZmluaXR5IG1lY2hhbmlzbS4KKy8vIEl0IGNhbGN1bGF0cyB0aGUgd29ya2VyICsgbWFzdGVyIHRocmVhZCdzIHBhcnRpdGlvbiBiYXNlZCB1cG9uIHRoZSBwYXJlbnQKKy8vIHRocmVhZCdzIHBhcnRpdGlvbiwgYW5kIGJpbmRzIGVhY2ggd29ya2VyIHRvIGEgdGhyZWFkIGluIHRoZWlyIHBhcnRpdGlvbi4KKy8vIFRoZSBtYXN0ZXIgdGhyZWFkJ3MgcGFydGl0aW9uIHNob3VsZCBhbHJlYWR5IGluY2x1ZGUgaXRzIGN1cnJlbnQgYmluZGluZy4KKy8vCitzdGF0aWMgdm9pZAorX19rbXBfcGFydGl0aW9uX3BsYWNlcygga21wX3RlYW1fdCAqdGVhbSApCit7CisgICAgLy8KKyAgICAvLyBDb3B5IHRoZSBtYXN0ZXIgdGhyZWFkJ3MgcGxhY2UgcGFydGlvbiB0byB0aGUgdGVhbSBzdHJ1Y3QKKyAgICAvLworICAgIGttcF9pbmZvX3QgKm1hc3Rlcl90aCA9IHRlYW0tPnQudF90aHJlYWRzWzBdOworICAgIEtNUF9ERUJVR19BU1NFUlQoIG1hc3Rlcl90aCAhPSBOVUxMICk7CisgICAga21wX3Byb2NfYmluZF90IHByb2NfYmluZCA9IHRlYW0tPnQudF9wcm9jX2JpbmQ7CisgICAgaW50IGZpcnN0X3BsYWNlID0gbWFzdGVyX3RoLT50aC50aF9maXJzdF9wbGFjZTsKKyAgICBpbnQgbGFzdF9wbGFjZSA9IG1hc3Rlcl90aC0+dGgudGhfbGFzdF9wbGFjZTsKKyAgICBpbnQgbWFzdGVyc19wbGFjZSA9IG1hc3Rlcl90aC0+dGgudGhfY3VycmVudF9wbGFjZTsKKyAgICB0ZWFtLT50LnRfZmlyc3RfcGxhY2UgPSBmaXJzdF9wbGFjZTsKKyAgICB0ZWFtLT50LnRfbGFzdF9wbGFjZSA9IGxhc3RfcGxhY2U7CisKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfcGFydGl0aW9uX3BsYWNlczogZW50ZXI6IHByb2NfYmluZCA9ICVkIFQjJWQoJWQ6MCkgYm91bmQgdG8gcGxhY2UgJWQgcGFydGl0aW9uID0gWyVkLCVkXVxuIiwKKyAgICAgICBwcm9jX2JpbmQsIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRlYW0tPnQudF90aHJlYWRzWzBdICksIHRlYW0tPnQudF9pZCwKKyAgICAgICBtYXN0ZXJzX3BsYWNlLCBmaXJzdF9wbGFjZSwgbGFzdF9wbGFjZSApICk7CisKKyAgICBzd2l0Y2ggKCBwcm9jX2JpbmQgKSB7CisKKyAgICAgICAgY2FzZSBwcm9jX2JpbmRfZGVmYXVsdDoKKyAgICAgICAgLy8KKyAgICAgICAgLy8gc2VyaWFsIHRlYW1zIG1pZ2h0IGhhdmUgdGhlIHByb2NfYmluZCBwb2xpY3kgc2V0IHRvCisgICAgICAgIC8vIHByb2NfYmluZF9kZWZhdWx0LiAgSXQgZG9lc24ndCBtYXR0ZXIsIGFzIHdlIGRvbid0CisgICAgICAgIC8vIHJlYmluZCB0aGUgbWFzdGVyIHRocmVhZCBmb3IgYW55IHByb2NfYmluZCBwb2xpY3kuCisgICAgICAgIC8vCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0tPnQudF9ucHJvYyA9PSAxICk7CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgcHJvY19iaW5kX21hc3RlcjoKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGY7CisgICAgICAgICAgICBpbnQgbl90aCA9IHRlYW0tPnQudF9ucHJvYzsKKyAgICAgICAgICAgIGZvciAoIGYgPSAxOyBmIDwgbl90aDsgZisrICkgeworICAgICAgICAgICAgICAgIGttcF9pbmZvX3QgKnRoID0gdGVhbS0+dC50X3RocmVhZHNbZl07CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGggIT0gTlVMTCApOworICAgICAgICAgICAgICAgIHRoLT50aC50aF9maXJzdF9wbGFjZSA9IGZpcnN0X3BsYWNlOworICAgICAgICAgICAgICAgIHRoLT50aC50aF9sYXN0X3BsYWNlID0gbGFzdF9wbGFjZTsKKyAgICAgICAgICAgICAgICB0aC0+dGgudGhfbmV3X3BsYWNlID0gbWFzdGVyc19wbGFjZTsKKworICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAxMDAsICgiX19rbXBfcGFydGl0aW9uX3BsYWNlczogbWFzdGVyOiBUIyVkKCVkOiVkKSBwbGFjZSAlZCBwYXJ0aXRpb24gPSBbJWQsJWRdXG4iLAorICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGVhbS0+dC50X3RocmVhZHNbZl0gKSwKKyAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgZiwgbWFzdGVyc19wbGFjZSwgZmlyc3RfcGxhY2UsIGxhc3RfcGxhY2UgKSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgcHJvY19iaW5kX2Nsb3NlOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgZjsKKyAgICAgICAgICAgIGludCBuX3RoID0gdGVhbS0+dC50X25wcm9jOworICAgICAgICAgICAgaW50IG5fcGxhY2VzOworICAgICAgICAgICAgaWYgKCBmaXJzdF9wbGFjZSA8PSBsYXN0X3BsYWNlICkgeworICAgICAgICAgICAgICAgIG5fcGxhY2VzID0gbGFzdF9wbGFjZSAtIGZpcnN0X3BsYWNlICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIG5fcGxhY2VzID0gX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzIC0gZmlyc3RfcGxhY2UgKyBsYXN0X3BsYWNlICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggbl90aCA8PSBuX3BsYWNlcyApIHsKKyAgICAgICAgICAgICAgICBpbnQgcGxhY2UgPSBtYXN0ZXJzX3BsYWNlOworICAgICAgICAgICAgICAgIGZvciAoIGYgPSAxOyBmIDwgbl90aDsgZisrICkgeworICAgICAgICAgICAgICAgICAgICBrbXBfaW5mb190ICp0aCA9IHRlYW0tPnQudF90aHJlYWRzW2ZdOworICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0aCAhPSBOVUxMICk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBwbGFjZSA9PSBsYXN0X3BsYWNlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UgPSBmaXJzdF9wbGFjZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggcGxhY2UgPT0gKGludCkoX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzIC0gMSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9maXJzdF9wbGFjZSA9IGZpcnN0X3BsYWNlOworICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfbGFzdF9wbGFjZSA9IGxhc3RfcGxhY2U7CisgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9uZXdfcGxhY2UgPSBwbGFjZTsKKworICAgICAgICAgICAgICAgICAgICBLQV9UUkFDRSggMTAwLCAoIl9fa21wX3BhcnRpdGlvbl9wbGFjZXM6IGNsb3NlOiBUIyVkKCVkOiVkKSBwbGFjZSAlZCBwYXJ0aXRpb24gPSBbJWQsJWRdXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0ZWFtLT50LnRfdGhyZWFkc1tmXSApLAorICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQsIGYsIHBsYWNlLCBmaXJzdF9wbGFjZSwgbGFzdF9wbGFjZSApICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IFMsIHJlbSwgZ2FwLCBzX2NvdW50OworICAgICAgICAgICAgICAgIFMgPSBuX3RoIC8gbl9wbGFjZXM7CisgICAgICAgICAgICAgICAgc19jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgcmVtID0gbl90aCAtICggUyAqIG5fcGxhY2VzICk7CisgICAgICAgICAgICAgICAgZ2FwID0gcmVtID4gMCA/IG5fcGxhY2VzL3JlbSA6IG5fcGxhY2VzOworICAgICAgICAgICAgICAgIGludCBwbGFjZSA9IG1hc3RlcnNfcGxhY2U7CisgICAgICAgICAgICAgICAgaW50IGdhcF9jdCA9IGdhcDsKKyAgICAgICAgICAgICAgICBmb3IgKCBmID0gMDsgZiA8IG5fdGg7IGYrKyApIHsKKyAgICAgICAgICAgICAgICAgICAga21wX2luZm9fdCAqdGggPSB0ZWFtLT50LnRfdGhyZWFkc1tmXTsKKyAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGggIT0gTlVMTCApOworCisgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9maXJzdF9wbGFjZSA9IGZpcnN0X3BsYWNlOworICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfbGFzdF9wbGFjZSA9IGxhc3RfcGxhY2U7CisgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9uZXdfcGxhY2UgPSBwbGFjZTsKKyAgICAgICAgICAgICAgICAgICAgc19jb3VudCsrOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKHNfY291bnQgPT0gUykgJiYgcmVtICYmIChnYXBfY3QgPT0gZ2FwKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcsIGFkZCBhbiBleHRyYSB0aHJlYWQgdG8gcGxhY2Ugb24gbmV4dCBpdGVyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHNfY291bnQgPT0gUysxKSAmJiByZW0gJiYgKGdhcF9jdCA9PSBnYXApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgYWRkZWQgYW4gZXh0cmEgdGhyZWFkIHRvIHRoaXMgcGxhY2U7IG1vdmUgdG8gbmV4dCBwbGFjZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwbGFjZSA9PSBsYXN0X3BsYWNlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlID0gZmlyc3RfcGxhY2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggcGxhY2UgPT0gKGludCkoX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzIC0gMSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNfY291bnQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgZ2FwX2N0ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbS0tOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNfY291bnQgPT0gUykgeyAvLyBwbGFjZSBmdWxsOyBkb24ndCBhZGQgZXh0cmEKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcGxhY2UgPT0gbGFzdF9wbGFjZSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSA9IGZpcnN0X3BsYWNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHBsYWNlID09IChpbnQpKF9fa21wX2FmZmluaXR5X251bV9tYXNrcyAtIDEpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBnYXBfY3QrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNfY291bnQgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMCwgKCJfX2ttcF9wYXJ0aXRpb25fcGxhY2VzOiBjbG9zZTogVCMlZCglZDolZCkgcGxhY2UgJWQgcGFydGl0aW9uID0gWyVkLCVkXVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0ZWFtLT50LnRfdGhyZWFkc1tmXSApLAorICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgZiwgdGgtPnRoLnRoX25ld19wbGFjZSwgZmlyc3RfcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgbGFzdF9wbGFjZSApICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHBsYWNlID09IG1hc3RlcnNfcGxhY2UgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHByb2NfYmluZF9zcHJlYWQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBmOworICAgICAgICAgICAgaW50IG5fdGggPSB0ZWFtLT50LnRfbnByb2M7CisgICAgICAgICAgICBpbnQgbl9wbGFjZXM7CisgICAgICAgICAgICBpZiAoIGZpcnN0X3BsYWNlIDw9IGxhc3RfcGxhY2UgKSB7CisgICAgICAgICAgICAgICAgbl9wbGFjZXMgPSBsYXN0X3BsYWNlIC0gZmlyc3RfcGxhY2UgKyAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbl9wbGFjZXMgPSBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgLSBmaXJzdF9wbGFjZSArIGxhc3RfcGxhY2UgKyAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBuX3RoIDw9IG5fcGxhY2VzICkgeworICAgICAgICAgICAgICAgIGludCBwbGFjZSA9IG1hc3RlcnNfcGxhY2U7CisgICAgICAgICAgICAgICAgaW50IFMgPSBuX3BsYWNlcy9uX3RoOworICAgICAgICAgICAgICAgIGludCBzX2NvdW50LCByZW0sIGdhcCwgZ2FwX2N0OworICAgICAgICAgICAgICAgIHJlbSA9IG5fcGxhY2VzIC0gbl90aCpTOworICAgICAgICAgICAgICAgIGdhcCA9IHJlbSA/IG5fdGgvcmVtIDogMTsKKyAgICAgICAgICAgICAgICBnYXBfY3QgPSBnYXA7CisgICAgICAgICAgICAgICAgZm9yICggZiA9IDA7IGYgPCBuX3RoOyBmKysgKSB7CisgICAgICAgICAgICAgICAgICAgIGttcF9pbmZvX3QgKnRoID0gdGVhbS0+dC50X3RocmVhZHNbZl07CisgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoICE9IE5VTEwgKTsKKworICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfZmlyc3RfcGxhY2UgPSBwbGFjZTsKKyAgICAgICAgICAgICAgICAgICAgdGgtPnRoLnRoX25ld19wbGFjZSA9IHBsYWNlOworICAgICAgICAgICAgICAgICAgICBzX2NvdW50ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHNfY291bnQgPCBTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBsYWNlID09IGxhc3RfcGxhY2UgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UgPSBmaXJzdF9wbGFjZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBwbGFjZSA9PSAoaW50KShfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgLSAxKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSsrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc19jb3VudCsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChyZW0gJiYgKGdhcF9jdCA9PSBnYXApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBsYWNlID09IGxhc3RfcGxhY2UgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UgPSBmaXJzdF9wbGFjZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBwbGFjZSA9PSAoaW50KShfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgLSAxKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSsrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmVtLS07CisgICAgICAgICAgICAgICAgICAgICAgICBnYXBfY3QgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9sYXN0X3BsYWNlID0gcGxhY2U7CisgICAgICAgICAgICAgICAgICAgIGdhcF9jdCsrOworCisgICAgICAgICAgICAgICAgICAgIGlmICggcGxhY2UgPT0gbGFzdF9wbGFjZSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlID0gZmlyc3RfcGxhY2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHBsYWNlID09IChpbnQpKF9fa21wX2FmZmluaXR5X251bV9tYXNrcyAtIDEpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAxMDAsICgiX19rbXBfcGFydGl0aW9uX3BsYWNlczogc3ByZWFkOiBUIyVkKCVkOiVkKSBwbGFjZSAlZCBwYXJ0aXRpb24gPSBbJWQsJWRdXG4iLAorICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRlYW0tPnQudF90aHJlYWRzW2ZdICksCisgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCBmLCB0aC0+dGgudGhfbmV3X3BsYWNlLAorICAgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9maXJzdF9wbGFjZSwgdGgtPnRoLnRoX2xhc3RfcGxhY2UgKSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBwbGFjZSA9PSBtYXN0ZXJzX3BsYWNlICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgUywgcmVtLCBnYXAsIHNfY291bnQ7CisgICAgICAgICAgICAgICAgUyA9IG5fdGggLyBuX3BsYWNlczsKKyAgICAgICAgICAgICAgICBzX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICByZW0gPSBuX3RoIC0gKCBTICogbl9wbGFjZXMgKTsKKyAgICAgICAgICAgICAgICBnYXAgPSByZW0gPiAwID8gbl9wbGFjZXMvcmVtIDogbl9wbGFjZXM7CisgICAgICAgICAgICAgICAgaW50IHBsYWNlID0gbWFzdGVyc19wbGFjZTsKKyAgICAgICAgICAgICAgICBpbnQgZ2FwX2N0ID0gZ2FwOworICAgICAgICAgICAgICAgIGZvciAoIGYgPSAwOyBmIDwgbl90aDsgZisrICkgeworICAgICAgICAgICAgICAgICAgICBrbXBfaW5mb190ICp0aCA9IHRlYW0tPnQudF90aHJlYWRzW2ZdOworICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0aCAhPSBOVUxMICk7CisKKyAgICAgICAgICAgICAgICAgICAgdGgtPnRoLnRoX2ZpcnN0X3BsYWNlID0gcGxhY2U7CisgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9sYXN0X3BsYWNlID0gcGxhY2U7CisgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9uZXdfcGxhY2UgPSBwbGFjZTsKKyAgICAgICAgICAgICAgICAgICAgc19jb3VudCsrOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKHNfY291bnQgPT0gUykgJiYgcmVtICYmIChnYXBfY3QgPT0gZ2FwKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcsIGFkZCBhbiBleHRyYSB0aHJlYWQgdG8gcGxhY2Ugb24gbmV4dCBpdGVyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHNfY291bnQgPT0gUysxKSAmJiByZW0gJiYgKGdhcF9jdCA9PSBnYXApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgYWRkZWQgYW4gZXh0cmEgdGhyZWFkIHRvIHRoaXMgcGxhY2U7IG1vdmUgb24gdG8gbmV4dCBwbGFjZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwbGFjZSA9PSBsYXN0X3BsYWNlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlID0gZmlyc3RfcGxhY2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggcGxhY2UgPT0gKGludCkoX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzIC0gMSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNfY291bnQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgZ2FwX2N0ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbS0tOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNfY291bnQgPT0gUykgeyAvLyBwbGFjZSBpcyBmdWxsOyBkb24ndCBhZGQgZXh0cmEgdGhyZWFkCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBsYWNlID09IGxhc3RfcGxhY2UgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UgPSBmaXJzdF9wbGFjZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBwbGFjZSA9PSAoaW50KShfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgLSAxKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSsrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZ2FwX2N0Kys7CisgICAgICAgICAgICAgICAgICAgICAgICBzX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAxMDAsICgiX19rbXBfcGFydGl0aW9uX3BsYWNlczogc3ByZWFkOiBUIyVkKCVkOiVkKSBwbGFjZSAlZCBwYXJ0aXRpb24gPSBbJWQsJWRdXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0ZWFtLT50LnRfdGhyZWFkc1tmXSApLAorICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQsIGYsIHRoLT50aC50aF9uZXdfcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9maXJzdF9wbGFjZSwgdGgtPnRoLnRoX2xhc3RfcGxhY2UpICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHBsYWNlID09IG1hc3RlcnNfcGxhY2UgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfcGFydGl0aW9uX3BsYWNlczogZXhpdCBUIyVkXG4iLCB0ZWFtLT50LnRfaWQgKSApOworfQorCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgJiYgS01QX0FGRklOSVRZX1NVUFBPUlRFRCAqLworCisvKiBhbGxvY2F0ZSBhIG5ldyB0ZWFtIGRhdGEgc3RydWN0dXJlIHRvIHVzZS4gIHRha2Ugb25lIG9mZiBvZiB0aGUgZnJlZSBwb29sIGlmIGF2YWlsYWJsZSAqLwora21wX3RlYW1fdCAqCitfX2ttcF9hbGxvY2F0ZV90ZWFtKCBrbXBfcm9vdF90ICpyb290LCBpbnQgbmV3X25wcm9jLCBpbnQgbWF4X25wcm9jLAorI2lmIE9NUFRfU1VQUE9SVAorICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBvbXB0X3BhcmFsbGVsX2lkLAorI2VuZGlmCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBrbXBfcHJvY19iaW5kX3QgbmV3X3Byb2NfYmluZCwKKyNlbmRpZgorICAgIGttcF9pbnRlcm5hbF9jb250cm9sX3QgKm5ld19pY3ZzLAorICAgIGludCBhcmdjIFVTRV9ORVNURURfSE9UX0FSRyhrbXBfaW5mb190ICptYXN0ZXIpICkKK3sKKyAgICBLTVBfVElNRV9ERVZFTE9QRVJfQkxPQ0soS01QX2FsbG9jYXRlX3RlYW0pOworICAgIGludCBmOworICAgIGttcF90ZWFtX3QgKnRlYW07CisgICAgaW50IHVzZV9ob3RfdGVhbSA9ICEgcm9vdC0+ci5yX2FjdGl2ZTsKKyAgICBpbnQgbGV2ZWwgPSAwOworCisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2FsbG9jYXRlX3RlYW06IGNhbGxlZFxuIikpOworICAgIEtNUF9ERUJVR19BU1NFUlQoIG5ld19ucHJvYyA+PTEgJiYgYXJnYyA+PTAgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBtYXhfbnByb2MgPj0gbmV3X25wcm9jICk7CisgICAgS01QX01CKCk7CisKKyNpZiBLTVBfTkVTVEVEX0hPVF9URUFNUworICAgIGttcF9ob3RfdGVhbV9wdHJfdCAqaG90X3RlYW1zOworICAgIGlmKCBtYXN0ZXIgKSB7CisgICAgICAgIHRlYW0gPSBtYXN0ZXItPnRoLnRoX3RlYW07CisgICAgICAgIGxldmVsID0gdGVhbS0+dC50X2FjdGl2ZV9sZXZlbDsKKyAgICAgICAgaWYoIG1hc3Rlci0+dGgudGhfdGVhbXNfbWljcm90YXNrICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiB0ZWFtcyBjb25zdHJ1Y3Q/CisgICAgICAgICAgICBpZiggbWFzdGVyLT50aC50aF90ZWFtc19zaXplLm50ZWFtcyA+IDEgJiYgKCAgICAgICAgICAgICAvLyAjdGVhbXMgPiAxCisgICAgICAgICAgICAgICAgdGVhbS0+dC50X3BrZm4gPT0gKG1pY3JvdGFza190KV9fa21wX3RlYW1zX21hc3RlciB8fCAvLyBpbm5lciBmb3JrIG9mIHRoZSB0ZWFtcworICAgICAgICAgICAgICAgIG1hc3Rlci0+dGgudGhfdGVhbXNfbGV2ZWwgPCB0ZWFtLT50LnRfbGV2ZWwgKSApIHsgICAgLy8gb3IgbmVzdGVkIHBhcmFsbGVsIGluc2lkZSB0aGUgdGVhbXMKKyAgICAgICAgICAgICAgICArK2xldmVsOyAvLyBub3QgaW5jcmVtZW50IGlmICN0ZWFtcz09MSwgb3IgZm9yIG91dGVyIGZvcmsgb2YgdGhlIHRlYW1zOyBpbmNyZW1lbnQgb3RoZXJ3aXNlCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaG90X3RlYW1zID0gbWFzdGVyLT50aC50aF9ob3RfdGVhbXM7CisgICAgICAgIGlmKCBsZXZlbCA8IF9fa21wX2hvdF90ZWFtc19tYXhfbGV2ZWwgJiYgaG90X3RlYW1zICYmIGhvdF90ZWFtc1tsZXZlbF0uaG90X3RlYW0gKQorICAgICAgICB7ICAgLy8gaG90IHRlYW0gaGFzIGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgZm9yIGdpdmVuIGxldmVsCisgICAgICAgICAgICB1c2VfaG90X3RlYW0gPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdXNlX2hvdF90ZWFtID0gMDsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorICAgIC8vIE9wdGltaXphdGlvbiB0byB1c2UgYSAiaG90IiB0ZWFtCisgICAgaWYoIHVzZV9ob3RfdGVhbSAmJiBuZXdfbnByb2MgPiAxICkgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBuZXdfbnByb2MgPT0gbWF4X25wcm9jICk7CisjaWYgS01QX05FU1RFRF9IT1RfVEVBTVMKKyAgICAgICAgdGVhbSA9IGhvdF90ZWFtc1tsZXZlbF0uaG90X3RlYW07CisjZWxzZQorICAgICAgICB0ZWFtID0gIHJvb3QtPnIucl9ob3RfdGVhbTsKKyNlbmRpZgorI2lmIEtNUF9ERUJVRworICAgICAgICBpZiAoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICkgeworICAgICAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2FsbG9jYXRlX3RlYW06IGhvdCB0ZWFtIHRhc2tfdGVhbVswXSA9ICVwIHRhc2tfdGVhbVsxXSA9ICVwIGJlZm9yZSByZWluaXRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfdGFza190ZWFtWzBdLCB0ZWFtLT50LnRfdGFza190ZWFtWzFdICkpOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAvLyBIYXMgdGhlIG51bWJlciBvZiB0aHJlYWRzIGNoYW5nZWQ/CisgICAgICAgIC8qIExldCdzIGFzc3VtZSB0aGUgbW9zdCBjb21tb24gY2FzZSBpcyB0aGF0IHRoZSBudW1iZXIgb2YgdGhyZWFkcyBpcyB1bmNoYW5nZWQsIGFuZAorICAgICAgICAgICBwdXQgdGhhdCBjYXNlIGZpcnN0LiAqLworICAgICAgICBpZiAodGVhbS0+dC50X25wcm9jID09IG5ld19ucHJvYykgeyAvLyBDaGVjayBjaGFuZ2VzIGluIG51bWJlciBvZiB0aHJlYWRzCisgICAgICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfYWxsb2NhdGVfdGVhbTogcmV1c2luZyBob3QgdGVhbVxuIiApKTsKKyAgICAgICAgICAgIC8vIFRoaXMgY2FzZSBjYW4gbWVhbiB0aGF0IG9tcF9zZXRfbnVtX3RocmVhZHMoKSB3YXMgY2FsbGVkIGFuZCB0aGUgaG90IHRlYW0gc2l6ZQorICAgICAgICAgICAgLy8gd2FzIGFscmVhZHkgcmVkdWNlZCwgc28gd2UgY2hlY2sgdGhlIHNwZWNpYWwgZmxhZworICAgICAgICAgICAgaWYgKCB0ZWFtLT50LnRfc2l6ZV9jaGFuZ2VkID09IC0xICkgeworICAgICAgICAgICAgICAgIHRlYW0tPnQudF9zaXplX2NoYW5nZWQgPSAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfc2l6ZV9jaGFuZ2VkID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVE9ETz8/PzogdGVhbS0+dC50X21heF9hY3RpdmVfbGV2ZWxzID0gbmV3X21heF9hY3RpdmVfbGV2ZWxzOworICAgICAgICAgICAgdGVhbS0+dC50X3NjaGVkID0gIG5ld19pY3ZzLT5zY2hlZDsKKworICAgICAgICAgICAgX19rbXBfcmVpbml0aWFsaXplX3RlYW0oIHRlYW0sIG5ld19pY3ZzLCByb290LT5yLnJfdWJlcl90aHJlYWQtPnRoLnRoX2lkZW50ICk7CisKKyAgICAgICAgICAgIEtGX1RSQUNFKCAxMCwgKCJfX2ttcF9hbGxvY2F0ZV90ZWFtMjogVCMlZCwgdGhpc190aHJlYWQ9JXAgdGVhbT0lcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIHRlYW0tPnQudF90aHJlYWRzWzBdLCB0ZWFtICkgKTsKKyAgICAgICAgICAgIF9fa21wX3B1c2hfY3VycmVudF90YXNrX3RvX3RocmVhZCggdGVhbS0+dC50X3RocmVhZHNbIDAgXSwgdGVhbSwgMCApOworCisjaWYgT01QXzQwX0VOQUJMRUQKKyMgaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICAgICAgaWYgKCAoIHRlYW0tPnQudF9zaXplX2NoYW5nZWQgPT0gMCApCisgICAgICAgICAgICAgICYmICggdGVhbS0+dC50X3Byb2NfYmluZCA9PSBuZXdfcHJvY19iaW5kICkgKSB7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDIwMCwgKCJfX2ttcF9hbGxvY2F0ZV90ZWFtOiByZXVzaW5nIGhvdCB0ZWFtICMlZCBiaW5kaW5nczogcHJvY19iaW5kID0gJWQsIHBhcnRpdGlvbiA9IFslZCwlZF1cbiIsCisgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQsIG5ld19wcm9jX2JpbmQsIHRlYW0tPnQudF9maXJzdF9wbGFjZSwKKyAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9sYXN0X3BsYWNlICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHRlYW0tPnQudF9wcm9jX2JpbmQgPSBuZXdfcHJvY19iaW5kOworICAgICAgICAgICAgICAgIF9fa21wX3BhcnRpdGlvbl9wbGFjZXMoIHRlYW0gKTsKKyAgICAgICAgICAgIH0KKyMgZWxzZQorICAgICAgICAgICAgaWYgKCB0ZWFtLT50LnRfcHJvY19iaW5kICE9IG5ld19wcm9jX2JpbmQgKSB7CisgICAgICAgICAgICAgICAgdGVhbS0+dC50X3Byb2NfYmluZCA9IG5ld19wcm9jX2JpbmQ7CisgICAgICAgICAgICB9CisjIGVuZGlmIC8qIEtNUF9BRkZJTklUWV9TVVBQT1JURUQgKi8KKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIHRlYW0tPnQudF9ucHJvYyA+IG5ld19ucHJvYyApIHsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9hbGxvY2F0ZV90ZWFtOiBkZWNyZWFzaW5nIGhvdCB0ZWFtIHRocmVhZCBjb3VudCB0byAlZFxuIiwgbmV3X25wcm9jICkpOworCisgICAgICAgICAgICB0ZWFtLT50LnRfc2l6ZV9jaGFuZ2VkID0gMTsKKyNpZiBLTVBfTkVTVEVEX0hPVF9URUFNUworICAgICAgICAgICAgaWYoIF9fa21wX2hvdF90ZWFtc19tb2RlID09IDAgKSB7CisgICAgICAgICAgICAgICAgLy8gQUM6IHNhdmVkIG51bWJlciBvZiB0aHJlYWRzIHNob3VsZCBjb3JyZXNwb25kIHRvIHRlYW0ncyB2YWx1ZSBpbiB0aGlzIG1vZGUsCisgICAgICAgICAgICAgICAgLy8gY2FuIGJlIGJpZ2dlciBpbiBtb2RlIDEsIHdoZW4gaG90IHRlYW0gaGFzIHNvbWUgdGhyZWFkcyBpbiByZXNlcnZlCisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChob3RfdGVhbXNbbGV2ZWxdLmhvdF90ZWFtX250aCA9PSB0ZWFtLT50LnRfbnByb2MpOworICAgICAgICAgICAgICAgIGhvdF90ZWFtc1tsZXZlbF0uaG90X3RlYW1fbnRoID0gbmV3X25wcm9jOworI2VuZGlmIC8vIEtNUF9ORVNURURfSE9UX1RFQU1TCisgICAgICAgICAgICAgICAgLyogcmVsZWFzZSB0aGUgZXh0cmEgdGhyZWFkcyB3ZSBkb24ndCBuZWVkIGFueSBtb3JlICovCisgICAgICAgICAgICAgICAgZm9yKCBmID0gbmV3X25wcm9jICA7ICBmIDwgdGVhbS0+dC50X25wcm9jICA7ICBmKysgKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0tPnQudF90aHJlYWRzWyBmIF0gKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYykgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiBkZWNyZWFzaW5nIHRlYW0gc2l6ZSwgdGhyZWFkcyBubyBsb25nZXIgaW4gdGhlIHRlYW0gc2hvdWxkIHVucmVmIHRhc2sgdGVhbS4KKyAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF90aHJlYWRzW2ZdLT50aC50aF90YXNrX3RlYW0gPSBOVUxMOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2ZyZWVfdGhyZWFkKCB0ZWFtLT50LnRfdGhyZWFkc1sgZiBdICk7CisgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF90aHJlYWRzWyBmIF0gPSBOVUxMOworICAgICAgICAgICAgICAgIH0KKyNpZiBLTVBfTkVTVEVEX0hPVF9URUFNUworICAgICAgICAgICAgfSAvLyAoX19rbXBfaG90X3RlYW1zX21vZGUgPT0gMCkKKyNlbmRpZiAvLyBLTVBfTkVTVEVEX0hPVF9URUFNUworICAgICAgICAgICAgdGVhbS0+dC50X25wcm9jID0gIG5ld19ucHJvYzsKKyAgICAgICAgICAgIC8vIFRPRE8/Pz86IHRlYW0tPnQudF9tYXhfYWN0aXZlX2xldmVscyA9IG5ld19tYXhfYWN0aXZlX2xldmVsczsKKyAgICAgICAgICAgIHRlYW0tPnQudF9zY2hlZCA9ICBuZXdfaWN2cy0+c2NoZWQ7CisgICAgICAgICAgICBfX2ttcF9yZWluaXRpYWxpemVfdGVhbSggdGVhbSwgbmV3X2ljdnMsIHJvb3QtPnIucl91YmVyX3RocmVhZC0+dGgudGhfaWRlbnQgKTsKKworICAgICAgICAgICAgLyogdXBkYXRlIHRoZSByZW1haW5pbmcgdGhyZWFkcyAqLworICAgICAgICAgICAgZm9yKGYgPSAwOyBmIDwgbmV3X25wcm9jOyArK2YpIHsKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfdGhyZWFkc1tmXS0+dGgudGhfdGVhbV9ucHJvYyA9IG5ld19ucHJvYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHJlc3RvcmUgdGhlIGN1cnJlbnQgdGFzayBzdGF0ZSBvZiB0aGUgbWFzdGVyIHRocmVhZDogc2hvdWxkIGJlIHRoZSBpbXBsaWNpdCB0YXNrCisgICAgICAgICAgICBLRl9UUkFDRSggMTAsICgiX19rbXBfYWxsb2NhdGVfdGVhbTogVCMlZCwgdGhpc190aHJlYWQ9JXAgdGVhbT0lcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgMCwgdGVhbS0+dC50X3RocmVhZHNbMF0sIHRlYW0gKSApOworCisgICAgICAgICAgICBfX2ttcF9wdXNoX2N1cnJlbnRfdGFza190b190aHJlYWQoIHRlYW0tPnQudF90aHJlYWRzWyAwIF0sIHRlYW0sIDAgKTsKKworI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgZm9yICggZiA9IDA7IGYgPCB0ZWFtLT50LnRfbnByb2M7IGYrKyApIHsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtLT50LnRfdGhyZWFkc1tmXSAmJgorICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfdGhyZWFkc1tmXS0+dGgudGhfdGVhbV9ucHJvYyA9PSB0ZWFtLT50LnRfbnByb2MgKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgIHRlYW0tPnQudF9wcm9jX2JpbmQgPSBuZXdfcHJvY19iaW5kOworIyBpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgICAgICBfX2ttcF9wYXJ0aXRpb25fcGxhY2VzKCB0ZWFtICk7CisjIGVuZGlmCisjZW5kaWYKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsgLy8gdGVhbS0+dC50X25wcm9jIDwgbmV3X25wcm9jCisjaWYgS01QX09TX0xJTlVYICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgICAgIGttcF9hZmZpbl9tYXNrX3QgKm9sZF9tYXNrOworICAgICAgICAgICAgaWYgKCBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpICkgeworICAgICAgICAgICAgICAgIEtNUF9DUFVfQUxMT0Mob2xkX21hc2spOworICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9hbGxvY2F0ZV90ZWFtOiBpbmNyZWFzaW5nIGhvdCB0ZWFtIHRocmVhZCBjb3VudCB0byAlZFxuIiwgbmV3X25wcm9jICkpOworCisgICAgICAgICAgICB0ZWFtLT50LnRfc2l6ZV9jaGFuZ2VkID0gMTsKKworCisjaWYgS01QX05FU1RFRF9IT1RfVEVBTVMKKyAgICAgICAgICAgIGludCBhdmFpbF90aHJlYWRzID0gaG90X3RlYW1zW2xldmVsXS5ob3RfdGVhbV9udGg7CisgICAgICAgICAgICBpZiggbmV3X25wcm9jIDwgYXZhaWxfdGhyZWFkcyApCisgICAgICAgICAgICAgICAgYXZhaWxfdGhyZWFkcyA9IG5ld19ucHJvYzsKKyAgICAgICAgICAgIGttcF9pbmZvX3QgKipvdGhlcl90aHJlYWRzID0gdGVhbS0+dC50X3RocmVhZHM7CisgICAgICAgICAgICBmb3IgKCBmID0gdGVhbS0+dC50X25wcm9jOyBmIDwgYXZhaWxfdGhyZWFkczsgKytmICkgeworICAgICAgICAgICAgICAgIC8vIEFkanVzdCBiYXJyaWVyIGRhdGEgb2YgcmVzZXJ2ZWQgdGhyZWFkcyAoaWYgYW55KSBvZiB0aGUgdGVhbQorICAgICAgICAgICAgICAgIC8vIE90aGVyIGRhdGEgd2lsbCBiZSBzZXQgaW4gX19rbXBfaW5pdGlhbGl6ZV9pbmZvKCkgYmVsb3cuCisgICAgICAgICAgICAgICAgaW50IGI7CisgICAgICAgICAgICAgICAga21wX2JhbGlnbl90ICogYmFsaWduID0gb3RoZXJfdGhyZWFkc1tmXS0+dGgudGhfYmFyOworICAgICAgICAgICAgICAgIGZvciAoIGIgPSAwOyBiIDwgYnNfbGFzdF9iYXJyaWVyOyArKyBiICkgeworICAgICAgICAgICAgICAgICAgICBiYWxpZ25bYl0uYmIuYl9hcnJpdmVkID0gdGVhbS0+dC50X2JhcltiXS5iX2Fycml2ZWQ7CisgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoYmFsaWduW2JdLmJiLndhaXRfZmxhZyAhPSBLTVBfQkFSUklFUl9QQVJFTlRfRkxBRyk7CisjaWYgVVNFX0RFQlVHR0VSCisgICAgICAgICAgICAgICAgICAgIGJhbGlnbltiXS5iYi5iX3dvcmtlcl9hcnJpdmVkID0gdGVhbS0+dC50X2JhcltiXS5iX3RlYW1fYXJyaXZlZDsKKyNlbmRpZgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCBob3RfdGVhbXNbbGV2ZWxdLmhvdF90ZWFtX250aCA+PSBuZXdfbnByb2MgKSB7CisgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSBhbGwgbmVlZGVkIHRocmVhZHMgaW4gcmVzZXJ2ZSwgbm8gbmVlZCB0byBhbGxvY2F0ZSBhbnkKKyAgICAgICAgICAgICAgICAvLyB0aGlzIG9ubHkgcG9zc2libGUgaW4gbW9kZSAxLCBjYW5ub3QgaGF2ZSByZXNlcnZlZCB0aHJlYWRzIGluIG1vZGUgMAorICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfaG90X3RlYW1zX21vZGUgPT0gMSk7CisgICAgICAgICAgICAgICAgdGVhbS0+dC50X25wcm9jID0gbmV3X25wcm9jOyAgICAgICAgICAgICAgICAgICAgIC8vIGp1c3QgZ2V0IHJlc2VydmVkIHRocmVhZHMgaW52b2x2ZWQKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gd2UgbWF5IGhhdmUgc29tZSB0aHJlYWRzIGluIHJlc2VydmUsIGJ1dCBub3QgZW5vdWdoCisgICAgICAgICAgICAgICAgdGVhbS0+dC50X25wcm9jID0gaG90X3RlYW1zW2xldmVsXS5ob3RfdGVhbV9udGg7IC8vIGdldCByZXNlcnZlZCB0aHJlYWRzIGludm9sdmVkIGlmIGFueQorICAgICAgICAgICAgICAgIGhvdF90ZWFtc1tsZXZlbF0uaG90X3RlYW1fbnRoID0gbmV3X25wcm9jOyAgICAgICAvLyBhZGp1c3QgaG90IHRlYW0gbWF4IHNpemUKKyNlbmRpZiAvLyBLTVBfTkVTVEVEX0hPVF9URUFNUworICAgICAgICAgICAgaWYodGVhbS0+dC50X21heF9ucHJvYyA8IG5ld19ucHJvYykgeworICAgICAgICAgICAgICAgIC8qIHJlYWxsb2NhdGUgbGFyZ2VyIGFycmF5cyAqLworICAgICAgICAgICAgICAgIF9fa21wX3JlYWxsb2NhdGVfdGVhbV9hcnJheXModGVhbSwgbmV3X25wcm9jKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9yZWluaXRpYWxpemVfdGVhbSggdGVhbSwgbmV3X2ljdnMsIE5VTEwgKTsKKyAgICAgICAgICAgIH0KKworI2lmIEtNUF9PU19MSU5VWCAmJiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgICAgICAvKiBUZW1wb3JhcmlseSBzZXQgZnVsbCBtYXNrIGZvciBtYXN0ZXIgdGhyZWFkIGJlZm9yZQorICAgICAgICAgICAgICAgY3JlYXRpb24gb2Ygd29ya2Vycy4gVGhlIHJlYXNvbiBpcyB0aGF0IHdvcmtlcnMgaW5oZXJpdAorICAgICAgICAgICAgICAgdGhlIGFmZmluaXR5IGZyb20gbWFzdGVyLCBzbyBpZiBhIGxvdCBvZiB3b3JrZXJzIGFyZQorICAgICAgICAgICAgICAgY3JlYXRlZCBvbiB0aGUgc2luZ2xlIGNvcmUgcXVpY2tseSwgdGhleSBkb24ndCBnZXQKKyAgICAgICAgICAgICAgIGEgY2hhbmNlIHRvIHNldCB0aGVpciBvd24gYWZmaW5pdHkgZm9yIGEgbG9uZyB0aW1lLgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIF9fa21wX3NldF90aHJlYWRfYWZmaW5pdHlfbWFza19mdWxsX3RtcCggb2xkX21hc2sgKTsKKyNlbmRpZgorCisgICAgICAgICAgICAvKiBhbGxvY2F0ZSBuZXcgdGhyZWFkcyBmb3IgdGhlIGhvdCB0ZWFtICovCisgICAgICAgICAgICBmb3IoIGYgPSB0ZWFtLT50LnRfbnByb2MgIDsgIGYgPCBuZXdfbnByb2MgIDsgIGYrKyApIHsKKyAgICAgICAgICAgICAgICBrbXBfaW5mb190ICogbmV3X3dvcmtlciA9IF9fa21wX2FsbG9jYXRlX3RocmVhZCggcm9vdCwgdGVhbSwgZiApOworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIG5ld193b3JrZXIgKTsKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfdGhyZWFkc1sgZiBdID0gbmV3X3dvcmtlcjsKKworICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9hbGxvY2F0ZV90ZWFtOiB0ZWFtICVkIGluaXQgVCMlZCBhcnJpdmVkOiBqb2luPSVsbHUsIHBsYWluPSVsbHVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgX19rbXBfZ3RpZF9mcm9tX3RpZCggZiwgdGVhbSApLCB0ZWFtLT50LnRfaWQsIGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9iYXJbYnNfZm9ya2pvaW5fYmFycmllcl0uYl9hcnJpdmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfYmFyW2JzX3BsYWluX2JhcnJpZXJdLmJfYXJyaXZlZCApICk7CisKKyAgICAgICAgICAgICAgICB7IC8vIEluaXRpYWxpemUgYmFycmllciBkYXRhIGZvciBuZXcgdGhyZWFkcy4KKyAgICAgICAgICAgICAgICAgICAgaW50IGI7CisgICAgICAgICAgICAgICAgICAgIGttcF9iYWxpZ25fdCAqIGJhbGlnbiA9IG5ld193b3JrZXItPnRoLnRoX2JhcjsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBiID0gMDsgYiA8IGJzX2xhc3RfYmFycmllcjsgKysgYiApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhbGlnblsgYiBdLmJiLmJfYXJyaXZlZCAgICAgICAgPSB0ZWFtLT50LnRfYmFyWyBiIF0uYl9hcnJpdmVkOworICAgICAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChiYWxpZ25bYl0uYmIud2FpdF9mbGFnICE9IEtNUF9CQVJSSUVSX1BBUkVOVF9GTEFHKTsKKyNpZiBVU0VfREVCVUdHRVIKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhbGlnblsgYiBdLmJiLmJfd29ya2VyX2Fycml2ZWQgPSB0ZWFtLT50LnRfYmFyWyBiIF0uYl90ZWFtX2Fycml2ZWQ7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworI2lmIEtNUF9PU19MSU5VWCAmJiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgICAgICBpZiAoIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkgKSB7CisgICAgICAgICAgICAgICAgLyogUmVzdG9yZSBpbml0aWFsIG1hc3RlciB0aHJlYWQncyBhZmZpbml0eSBtYXNrICovCisgICAgICAgICAgICAgICAgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eSggb2xkX21hc2ssIFRSVUUgKTsKKyAgICAgICAgICAgICAgICBLTVBfQ1BVX0ZSRUUob2xkX21hc2spOworICAgICAgICAgICAgfQorI2VuZGlmCisjaWYgS01QX05FU1RFRF9IT1RfVEVBTVMKKyAgICAgICAgICAgIH0gLy8gZW5kIG9mIGNoZWNrIG9mIHRfbnByb2MgdnMuIG5ld19ucHJvYyB2cy4gaG90X3RlYW1fbnRoCisjZW5kaWYgLy8gS01QX05FU1RFRF9IT1RfVEVBTVMKKyAgICAgICAgICAgIC8qIG1ha2Ugc3VyZSBldmVyeW9uZSBpcyBzeW5jcm9uaXplZCAqLworICAgICAgICAgICAgaW50IG9sZF9ucHJvYyA9IHRlYW0tPnQudF9ucHJvYzsgLy8gc2F2ZSBvbGQgdmFsdWUgYW5kIHVzZSB0byB1cGRhdGUgb25seSBuZXcgdGhyZWFkcyBiZWxvdworICAgICAgICAgICAgX19rbXBfaW5pdGlhbGl6ZV90ZWFtKCB0ZWFtLCBuZXdfbnByb2MsIG5ld19pY3ZzLCByb290LT5yLnJfdWJlcl90aHJlYWQtPnRoLnRoX2lkZW50ICk7CisKKyAgICAgICAgICAgIC8qIHJlaW5pdGlhbGl6ZSB0aGUgdGhyZWFkcyAqLworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0ZWFtLT50LnRfbnByb2MgPT0gbmV3X25wcm9jKTsKKyAgICAgICAgICAgIGZvciAoZj0wOyAgZiA8IHRlYW0tPnQudF9ucHJvYzsgKytmKQorICAgICAgICAgICAgICAgIF9fa21wX2luaXRpYWxpemVfaW5mbyggdGVhbS0+dC50X3RocmVhZHNbIGYgXSwgdGVhbSwgZiwgX19rbXBfZ3RpZF9mcm9tX3RpZCggZiwgdGVhbSApICk7CisgICAgICAgICAgICBpZiAobGV2ZWwpIHsgLy8gc2V0IHRoX3Rhc2tfc3RhdGUgZm9yIG5ldyB0aHJlYWRzIGluIG5lc3RlZCBob3QgdGVhbQorICAgICAgICAgICAgICAgIC8vIF9fa21wX2luaXRpYWxpemVfaW5mbygpIG5vIGxvbmdlciB6ZXJvZXMgdGhfdGFza19zdGF0ZSwgc28gd2Ugc2hvdWxkIG9ubHkgbmVlZCB0byBzZXQgdGhlCisgICAgICAgICAgICAgICAgLy8gdGhfdGFza19zdGF0ZSBmb3IgdGhlIG5ldyB0aHJlYWRzLiB0aF90YXNrX3N0YXRlIGZvciBtYXN0ZXIgdGhyZWFkIHdpbGwgbm90IGJlIGFjY3VyYXRlIHVudGlsCisgICAgICAgICAgICAgICAgLy8gYWZ0ZXIgdGhpcyBpbiBfX2ttcF9mb3JrX2NhbGwoKSwgc28gd2UgbG9vayB0byB0aGUgbWFzdGVyJ3MgbWVtb19zdGFjayB0byBnZXQgdGhlIGNvcnJlY3QgdmFsdWUuCisgICAgICAgICAgICAgICAgZm9yIChmPW9sZF9ucHJvYzsgZiA8IHRlYW0tPnQudF9ucHJvYzsgKytmKQorICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfdGhyZWFkc1tmXS0+dGgudGhfdGFza19zdGF0ZSA9IHRlYW0tPnQudF90aHJlYWRzWzBdLT50aC50aF90YXNrX3N0YXRlX21lbW9fc3RhY2tbbGV2ZWxdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7IC8vIHNldCB0aF90YXNrX3N0YXRlIGZvciBuZXcgdGhyZWFkcyBpbiBub24tbmVzdGVkIGhvdCB0ZWFtCisgICAgICAgICAgICAgICAgaW50IG9sZF9zdGF0ZSA9IHRlYW0tPnQudF90aHJlYWRzWzBdLT50aC50aF90YXNrX3N0YXRlOyAvLyBjb3B5IG1hc3RlcidzIHN0YXRlCisgICAgICAgICAgICAgICAgZm9yIChmPW9sZF9ucHJvYzsgZiA8IHRlYW0tPnQudF9ucHJvYzsgKytmKQorICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfdGhyZWFkc1tmXS0+dGgudGhfdGFza19zdGF0ZSA9IG9sZF9zdGF0ZTsKKyAgICAgICAgICAgIH0KKworI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgZm9yICggZiA9IDA7IGYgPCB0ZWFtLT50LnRfbnByb2M7ICsrIGYgKSB7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbS0+dC50X3RocmVhZHNbZl0gJiYKKyAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X3RocmVhZHNbZl0tPnRoLnRoX3RlYW1fbnByb2MgPT0gdGVhbS0+dC50X25wcm9jICk7CisgICAgICAgICAgICB9CisjZW5kaWYKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICB0ZWFtLT50LnRfcHJvY19iaW5kID0gbmV3X3Byb2NfYmluZDsKKyMgaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICAgICAgX19rbXBfcGFydGl0aW9uX3BsYWNlcyggdGVhbSApOworIyBlbmRpZgorI2VuZGlmCisgICAgICAgIH0gLy8gQ2hlY2sgY2hhbmdlcyBpbiBudW1iZXIgb2YgdGhyZWFkcworCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAga21wX2luZm9fdCAqbWFzdGVyID0gdGVhbS0+dC50X3RocmVhZHNbMF07CisgICAgICAgIGlmKCBtYXN0ZXItPnRoLnRoX3RlYW1zX21pY3JvdGFzayApIHsKKyAgICAgICAgICAgIGZvciggZiA9IDE7IGYgPCBuZXdfbnByb2M7ICsrZiApIHsKKyAgICAgICAgICAgICAgICAvLyBwcm9wYWdhdGUgdGVhbXMgY29uc3RydWN0IHNwZWNpZmljIGluZm8gdG8gd29ya2VycworICAgICAgICAgICAgICAgIGttcF9pbmZvX3QgKnRociA9IHRlYW0tPnQudF90aHJlYWRzW2ZdOworICAgICAgICAgICAgICAgIHRoci0+dGgudGhfdGVhbXNfbWljcm90YXNrID0gbWFzdGVyLT50aC50aF90ZWFtc19taWNyb3Rhc2s7CisgICAgICAgICAgICAgICAgdGhyLT50aC50aF90ZWFtc19sZXZlbCAgICAgPSBtYXN0ZXItPnRoLnRoX3RlYW1zX2xldmVsOworICAgICAgICAgICAgICAgIHRoci0+dGgudGhfdGVhbXNfc2l6ZSAgICAgID0gbWFzdGVyLT50aC50aF90ZWFtc19zaXplOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyNpZiBLTVBfTkVTVEVEX0hPVF9URUFNUworICAgICAgICBpZiggbGV2ZWwgKSB7CisgICAgICAgICAgICAvLyBTeW5jIGJhcnJpZXIgc3RhdGUgZm9yIG5lc3RlZCBob3QgdGVhbXMsIG5vdCBuZWVkZWQgZm9yIG91dGVybW9zdCBob3QgdGVhbS4KKyAgICAgICAgICAgIGZvciggZiA9IDE7IGYgPCBuZXdfbnByb2M7ICsrZiApIHsKKyAgICAgICAgICAgICAgICBrbXBfaW5mb190ICp0aHIgPSB0ZWFtLT50LnRfdGhyZWFkc1tmXTsKKyAgICAgICAgICAgICAgICBpbnQgYjsKKyAgICAgICAgICAgICAgICBrbXBfYmFsaWduX3QgKiBiYWxpZ24gPSB0aHItPnRoLnRoX2JhcjsKKyAgICAgICAgICAgICAgICBmb3IoIGIgPSAwOyBiIDwgYnNfbGFzdF9iYXJyaWVyOyArKyBiICkgeworICAgICAgICAgICAgICAgICAgICBiYWxpZ25bIGIgXS5iYi5iX2Fycml2ZWQgICAgICAgID0gdGVhbS0+dC50X2JhclsgYiBdLmJfYXJyaXZlZDsKKyAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChiYWxpZ25bYl0uYmIud2FpdF9mbGFnICE9IEtNUF9CQVJSSUVSX1BBUkVOVF9GTEFHKTsKKyNpZiBVU0VfREVCVUdHRVIKKyAgICAgICAgICAgICAgICAgICAgYmFsaWduWyBiIF0uYmIuYl93b3JrZXJfYXJyaXZlZCA9IHRlYW0tPnQudF9iYXJbIGIgXS5iX3RlYW1fYXJyaXZlZDsKKyNlbmRpZgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmIC8vIEtNUF9ORVNURURfSE9UX1RFQU1TCisKKyAgICAgICAgLyogcmVhbGxvY2F0ZSBzcGFjZSBmb3IgYXJndW1lbnRzIGlmIG5lY2Vzc2FyeSAqLworICAgICAgICBfX2ttcF9hbGxvY19hcmd2X2VudHJpZXMoIGFyZ2MsIHRlYW0sIFRSVUUgKTsKKyAgICAgICAgdGVhbS0+dC50X2FyZ2MgICAgID0gYXJnYzsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlIGhvdCB0ZWFtIHJlLXVzZXMgdGhlIHByZXZpb3VzIHRhc2sgdGVhbSwKKyAgICAgICAgLy8gaWYgdW50b3VjaGVkIGR1cmluZyB0aGUgcHJldmlvdXMgcmVsZWFzZS0+Z2F0aGVyIHBoYXNlLgorICAgICAgICAvLworCisgICAgICAgIEtGX1RSQUNFKCAxMCwgKCAiIGhvdF90ZWFtID0gJXBcbiIsIHRlYW0gKSApOworCisjaWYgS01QX0RFQlVHCisgICAgICAgIGlmICggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKSB7CisgICAgICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfYWxsb2NhdGVfdGVhbTogaG90IHRlYW0gdGFza190ZWFtWzBdID0gJXAgdGFza190ZWFtWzFdID0gJXAgYWZ0ZXIgcmVpbml0XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X3Rhc2tfdGVhbVswXSwgdGVhbS0+dC50X3Rhc2tfdGVhbVsxXSApKTsKKyAgICAgICAgfQorI2VuZGlmCisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgX19vbXB0X3RlYW1fYXNzaWduX2lkKHRlYW0sIG9tcHRfcGFyYWxsZWxfaWQpOworI2VuZGlmCisKKyAgICAgICAgS01QX01CKCk7CisKKyAgICAgICAgcmV0dXJuIHRlYW07CisgICAgfQorCisgICAgLyogbmV4dCwgbGV0J3MgdHJ5IHRvIHRha2Ugb25lIGZyb20gdGhlIHRlYW0gcG9vbCAqLworICAgIEtNUF9NQigpOworICAgIGZvciggdGVhbSA9IChrbXBfdGVhbV90KikgX19rbXBfdGVhbV9wb29sIDsgKHRlYW0pIDsgKQorICAgIHsKKyAgICAgICAgLyogVE9ETzogY29uc2lkZXIgcmVzaXppbmcgdW5kZXJzaXplZCB0ZWFtcyBpbnN0ZWFkIG9mIHJlYXBpbmcgdGhlbSwgbm93IHRoYXQgd2UgaGF2ZSBhIHJlc2l6aW5nIG1lY2hhbmlzbSAqLworICAgICAgICBpZiAoIHRlYW0tPnQudF9tYXhfbnByb2MgPj0gbWF4X25wcm9jICkgeworICAgICAgICAgICAgLyogdGFrZSB0aGlzIHRlYW0gZnJvbSB0aGUgdGVhbSBwb29sICovCisgICAgICAgICAgICBfX2ttcF90ZWFtX3Bvb2wgPSB0ZWFtLT50LnRfbmV4dF9wb29sOworCisgICAgICAgICAgICAvKiBzZXR1cCB0aGUgdGVhbSBmb3IgZnJlc2ggdXNlICovCisgICAgICAgICAgICBfX2ttcF9pbml0aWFsaXplX3RlYW0oIHRlYW0sIG5ld19ucHJvYywgbmV3X2ljdnMsIE5VTEwgKTsKKworICAgICAgICAgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF9hbGxvY2F0ZV90ZWFtOiBzZXR0aW5nIHRhc2tfdGVhbVswXSAlcCBhbmQgdGFza190ZWFtWzFdICVwIHRvIE5VTExcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlYW0tPnQudF90YXNrX3RlYW1bMF0sICZ0ZWFtLT50LnRfdGFza190ZWFtWzFdKSApOworICAgICAgICAgICAgdGVhbS0+dC50X3Rhc2tfdGVhbVswXSA9IE5VTEw7CisgICAgICAgICAgICB0ZWFtLT50LnRfdGFza190ZWFtWzFdID0gTlVMTDsKKworICAgICAgICAgICAgLyogcmVhbGxvY2F0ZSBzcGFjZSBmb3IgYXJndW1lbnRzIGlmIG5lY2Vzc2FyeSAqLworICAgICAgICAgICAgX19rbXBfYWxsb2NfYXJndl9lbnRyaWVzKCBhcmdjLCB0ZWFtLCBUUlVFICk7CisgICAgICAgICAgICB0ZWFtLT50LnRfYXJnYyAgICAgPSBhcmdjOworCisgICAgICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfYWxsb2NhdGVfdGVhbTogdGVhbSAlZCBpbml0IGFycml2ZWQ6IGpvaW49JXUsIHBsYWluPSV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgS01QX0lOSVRfQkFSUklFUl9TVEFURSwgS01QX0lOSVRfQkFSUklFUl9TVEFURSApKTsKKyAgICAgICAgICAgIHsgLy8gSW5pdGlhbGl6ZSBiYXJyaWVyIGRhdGEuCisgICAgICAgICAgICAgICAgaW50IGI7CisgICAgICAgICAgICAgICAgZm9yICggYiA9IDA7IGIgPCBic19sYXN0X2JhcnJpZXI7ICsrIGIpIHsKKyAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2JhclsgYiBdLmJfYXJyaXZlZCAgICAgICAgPSBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFOworI2lmIFVTRV9ERUJVR0dFUgorICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfYmFyWyBiIF0uYl9tYXN0ZXJfYXJyaXZlZCA9IDA7CisgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9iYXJbIGIgXS5iX3RlYW1fYXJyaXZlZCAgID0gMDsKKyNlbmRpZgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICB0ZWFtLT50LnRfcHJvY19iaW5kID0gbmV3X3Byb2NfYmluZDsKKyNlbmRpZgorCisgICAgICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfYWxsb2NhdGVfdGVhbTogdXNpbmcgdGVhbSBmcm9tIHBvb2wgJWQuXG4iLCB0ZWFtLT50LnRfaWQgKSk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgIF9fb21wdF90ZWFtX2Fzc2lnbl9pZCh0ZWFtLCBvbXB0X3BhcmFsbGVsX2lkKTsKKyNlbmRpZgorCisgICAgICAgICAgICBLTVBfTUIoKTsKKworICAgICAgICAgICAgcmV0dXJuIHRlYW07CisgICAgICAgIH0KKworICAgICAgICAvKiByZWFwIHRlYW0gaWYgaXQgaXMgdG9vIHNtYWxsLCB0aGVuIGxvb3AgYmFjayBhbmQgY2hlY2sgdGhlIG5leHQgb25lICovCisgICAgICAgIC8qIG5vdCBzdXJlIGlmIHRoaXMgaXMgd2lzZSwgYnV0LCB3aWxsIGJlIHJlZG9uZSBkdXJpbmcgdGhlIGhvdC10ZWFtcyByZXdyaXRlLiAqLworICAgICAgICAvKiBUT0RPOiBVc2UgdGVjaG5pcXVlIHRvIGZpbmQgdGhlIHJpZ2h0IHNpemUgaG90LXRlYW0sIGRvbid0IHJlYXAgdGhlbSAqLworICAgICAgICB0ZWFtID0gIF9fa21wX3JlYXBfdGVhbSggdGVhbSApOworICAgICAgICBfX2ttcF90ZWFtX3Bvb2wgPSB0ZWFtOworICAgIH0KKworICAgIC8qIG5vdGhpbmcgYXZhaWxhYmxlIGluIHRoZSBwb29sLCBubyBtYXR0ZXIsIG1ha2UgYSBuZXcgdGVhbSEgKi8KKyAgICBLTVBfTUIoKTsKKyAgICB0ZWFtID0gKGttcF90ZWFtX3QqKSBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKCBrbXBfdGVhbV90ICkgKTsKKworICAgIC8qIGFuZCBzZXQgaXQgdXAgKi8KKyAgICB0ZWFtLT50LnRfbWF4X25wcm9jICAgPSBtYXhfbnByb2M7CisgICAgLyogTk9URSB3ZWxsLCBmb3Igc29tZSByZWFzb24gYWxsb2NhdGluZyBvbmUgYmlnIGJ1ZmZlciBhbmQgZGl2aWRpbmcgaXQKKyAgICAgKiB1cCBzZWVtcyB0byByZWFsbHkgaHVydCBwZXJmb3JtYW5jZSBhIGxvdCBvbiB0aGUgUDQsIHNvLCBsZXQncyBub3QgdXNlCisgICAgICogdGhpcy4uLiAqLworICAgIF9fa21wX2FsbG9jYXRlX3RlYW1fYXJyYXlzKCB0ZWFtLCBtYXhfbnByb2MgKTsKKworICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfYWxsb2NhdGVfdGVhbTogbWFraW5nIGEgbmV3IHRlYW1cbiIgKSApOworICAgIF9fa21wX2luaXRpYWxpemVfdGVhbSggdGVhbSwgbmV3X25wcm9jLCBuZXdfaWN2cywgTlVMTCApOworCisgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF9hbGxvY2F0ZV90ZWFtOiBzZXR0aW5nIHRhc2tfdGVhbVswXSAlcCBhbmQgdGFza190ZWFtWzFdICVwIHRvIE5VTExcbiIsCisgICAgICAgICAgICAgICAgICAgICZ0ZWFtLT50LnRfdGFza190ZWFtWzBdLCAmdGVhbS0+dC50X3Rhc2tfdGVhbVsxXSApICk7CisgICAgdGVhbS0+dC50X3Rhc2tfdGVhbVswXSA9IE5VTEw7ICAgIC8vIHRvIGJlIHJlbW92ZWQsIGFzIF9fa21wX2FsbG9jYXRlIHplcm9lcyBtZW1vcnksIG5vIG5lZWQgdG8gZHVwbGljYXRlCisgICAgdGVhbS0+dC50X3Rhc2tfdGVhbVsxXSA9IE5VTEw7ICAgIC8vIHRvIGJlIHJlbW92ZWQsIGFzIF9fa21wX2FsbG9jYXRlIHplcm9lcyBtZW1vcnksIG5vIG5lZWQgdG8gZHVwbGljYXRlCisKKyAgICBpZiAoIF9fa21wX3N0b3JhZ2VfbWFwICkgeworICAgICAgICBfX2ttcF9wcmludF90ZWFtX3N0b3JhZ2VfbWFwKCAidGVhbSIsIHRlYW0sIHRlYW0tPnQudF9pZCwgbmV3X25wcm9jICk7CisgICAgfQorCisgICAgLyogYWxsb2NhdGUgc3BhY2UgZm9yIGFyZ3VtZW50cyAqLworICAgIF9fa21wX2FsbG9jX2FyZ3ZfZW50cmllcyggYXJnYywgdGVhbSwgRkFMU0UgKTsKKyAgICB0ZWFtLT50LnRfYXJnYyAgICAgICAgPSBhcmdjOworCisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2FsbG9jYXRlX3RlYW06IHRlYW0gJWQgaW5pdCBhcnJpdmVkOiBqb2luPSV1LCBwbGFpbj0ldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFICkpOworICAgIHsgLy8gSW5pdGlhbGl6ZSBiYXJyaWVyIGRhdGEuCisgICAgICAgIGludCBiOworICAgICAgICBmb3IgKCBiID0gMDsgYiA8IGJzX2xhc3RfYmFycmllcjsgKysgYiApIHsKKyAgICAgICAgICAgIHRlYW0tPnQudF9iYXJbIGIgXS5iX2Fycml2ZWQgICAgICAgID0gS01QX0lOSVRfQkFSUklFUl9TVEFURTsKKyNpZiBVU0VfREVCVUdHRVIKKyAgICAgICAgICAgIHRlYW0tPnQudF9iYXJbIGIgXS5iX21hc3Rlcl9hcnJpdmVkID0gMDsKKyAgICAgICAgICAgIHRlYW0tPnQudF9iYXJbIGIgXS5iX3RlYW1fYXJyaXZlZCAgID0gMDsKKyNlbmRpZgorICAgICAgICB9CisgICAgfQorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICB0ZWFtLT50LnRfcHJvY19iaW5kID0gbmV3X3Byb2NfYmluZDsKKyNlbmRpZgorCisjaWYgT01QVF9TVVBQT1JUCisgICAgX19vbXB0X3RlYW1fYXNzaWduX2lkKHRlYW0sIG9tcHRfcGFyYWxsZWxfaWQpOworICAgIHRlYW0tPnQub21wdF9zZXJpYWxpemVkX3RlYW1faW5mbyA9IE5VTEw7CisjZW5kaWYKKworICAgIEtNUF9NQigpOworCisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2FsbG9jYXRlX3RlYW06IGRvbmUgY3JlYXRpbmcgYSBuZXcgdGVhbSAlZC5cbiIsIHRlYW0tPnQudF9pZCApKTsKKworICAgIHJldHVybiB0ZWFtOworfQorCisvKiBUT0RPIGltcGxlbWVudCBob3QtdGVhbXMgYXQgYWxsIGxldmVscyAqLworLyogVE9ETyBpbXBsZW1lbnQgbGF6eSB0aHJlYWQgcmVsZWFzZSBvbiBkZW1hbmQgKGRpc2JhbmQgcmVxdWVzdCkgKi8KKworLyogZnJlZSB0aGUgdGVhbS4gIHJldHVybiBpdCB0byB0aGUgdGVhbSBwb29sLiAgcmVsZWFzZSBhbGwgdGhlIHRocmVhZHMKKyAqIGFzc29jaWF0ZWQgd2l0aCBpdCAqLwordm9pZAorX19rbXBfZnJlZV90ZWFtKCBrbXBfcm9vdF90ICpyb290LCBrbXBfdGVhbV90ICp0ZWFtICBVU0VfTkVTVEVEX0hPVF9BUkcoa21wX2luZm9fdCAqbWFzdGVyKSApCit7CisgICAgaW50IGY7CisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2ZyZWVfdGVhbTogVCMlZCBmcmVlaW5nIHRlYW0gJWRcbiIsIF9fa21wX2dldF9ndGlkKCksIHRlYW0tPnQudF9pZCApKTsKKworICAgIC8qIHZlcmlmeSBzdGF0ZSAqLworICAgIEtNUF9ERUJVR19BU1NFUlQoIHJvb3QgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbS0+dC50X25wcm9jIDw9IHRlYW0tPnQudF9tYXhfbnByb2MgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtLT50LnRfdGhyZWFkcyApOworCisgICAgaW50IHVzZV9ob3RfdGVhbSA9IHRlYW0gPT0gcm9vdC0+ci5yX2hvdF90ZWFtOworI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCisgICAgaW50IGxldmVsOworICAgIGttcF9ob3RfdGVhbV9wdHJfdCAqaG90X3RlYW1zOworICAgIGlmKCBtYXN0ZXIgKSB7CisgICAgICAgIGxldmVsID0gdGVhbS0+dC50X2FjdGl2ZV9sZXZlbCAtIDE7CisgICAgICAgIGlmKCBtYXN0ZXItPnRoLnRoX3RlYW1zX21pY3JvdGFzayApIHsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGVhbXMgY29uc3RydWN0PworICAgICAgICAgICAgaWYoIG1hc3Rlci0+dGgudGhfdGVhbXNfc2l6ZS5udGVhbXMgPiAxICkgeworICAgICAgICAgICAgICAgKytsZXZlbDsgLy8gbGV2ZWwgd2FzIG5vdCBpbmNyZWFzZWQgaW4gdGVhbXMgY29uc3RydWN0IGZvciB0ZWFtX29mX21hc3RlcnMKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCB0ZWFtLT50LnRfcGtmbiAhPSAobWljcm90YXNrX3QpX19rbXBfdGVhbXNfbWFzdGVyICYmCisgICAgICAgICAgICAgICAgbWFzdGVyLT50aC50aF90ZWFtc19sZXZlbCA9PSB0ZWFtLT50LnRfbGV2ZWwgKSB7CisgICAgICAgICAgICAgICAgKytsZXZlbDsgLy8gbGV2ZWwgd2FzIG5vdCBpbmNyZWFzZWQgaW4gdGVhbXMgY29uc3RydWN0IGZvciB0ZWFtX29mX3dvcmtlcnMgYmVmb3JlIHRoZSBwYXJhbGxlbAorICAgICAgICAgICAgfSAgICAgICAgICAgIC8vIHRlYW0tPnQudF9sZXZlbCB3aWxsIGJlIGluY3JlYXNlZCBpbnNpZGUgcGFyYWxsZWwKKyAgICAgICAgfQorICAgICAgICBob3RfdGVhbXMgPSBtYXN0ZXItPnRoLnRoX2hvdF90ZWFtczsKKyAgICAgICAgaWYoIGxldmVsIDwgX19rbXBfaG90X3RlYW1zX21heF9sZXZlbCApIHsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0gPT0gaG90X3RlYW1zW2xldmVsXS5ob3RfdGVhbSApOworICAgICAgICAgICAgdXNlX2hvdF90ZWFtID0gMTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvLyBLTVBfTkVTVEVEX0hPVF9URUFNUworCisgICAgLyogdGVhbSBpcyBkb25lIHdvcmtpbmcgKi8KKyAgICBUQ1dfU1lOQ19QVFIodGVhbS0+dC50X3BrZm4sIE5VTEwpOyAvLyBJbXBvcnRhbnQgZm9yIERlYnVnZ2luZyBTdXBwb3J0IExpYnJhcnkuCisgICAgdGVhbS0+dC50X2NvcHlpbl9jb3VudGVyID0gMDsgLy8gaW5pdCBjb3VudGVyIGZvciBwb3NzaWJsZSByZXVzZQorICAgIC8vIERvIG5vdCByZXNldCBwb2ludGVyIHRvIHBhcmVudCB0ZWFtIHRvIE5VTEwgZm9yIGhvdCB0ZWFtcy4KKworICAgIC8qIGlmIHdlIGFyZSBub24taG90IHRlYW0sIHJlbGVhc2Ugb3VyIHRocmVhZHMgKi8KKyAgICBpZiggISB1c2VfaG90X3RlYW0gKSB7CisgICAgICAgIGlmICggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKSB7CisgICAgICAgICAgICAvLyBEZWxldGUgdGFzayB0ZWFtcworICAgICAgICAgICAgaW50IHR0X2lkeDsKKyAgICAgICAgICAgIGZvciAodHRfaWR4PTA7IHR0X2lkeDwyOyArK3R0X2lkeCkgeworICAgICAgICAgICAgICAgIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtID0gdGVhbS0+dC50X3Rhc2tfdGVhbVt0dF9pZHhdOworICAgICAgICAgICAgICAgIGlmICggdGFza190ZWFtICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoZj0wOyBmPHRlYW0tPnQudF9ucHJvYzsgKytmKSB7IC8vIEhhdmUgYWxsIHRocmVhZHMgdW5yZWYgdGFzayB0ZWFtcworICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X3RocmVhZHNbZl0tPnRoLnRoX3Rhc2tfdGVhbSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF9mcmVlX3RlYW06IFQjJWQgZGVhY3RpdmF0aW5nIHRhc2tfdGVhbSAlcCBvbiB0ZWFtICVkXG4iLCBfX2ttcF9nZXRfZ3RpZCgpLCB0YXNrX3RlYW0sIHRlYW0tPnQudF9pZCApICk7CisjaWYgS01QX05FU1RFRF9IT1RfVEVBTVMKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfZnJlZV90YXNrX3RlYW0oIG1hc3RlciwgdGFza190ZWFtICk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X3Rhc2tfdGVhbVt0dF9pZHhdID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXNldCBwb2ludGVyIHRvIHBhcmVudCB0ZWFtIG9ubHkgZm9yIG5vbi1ob3QgdGVhbXMuCisgICAgICAgIHRlYW0tPnQudF9wYXJlbnQgPSBOVUxMOworCisKKyAgICAgICAgLyogZnJlZSB0aGUgd29ya2VyIHRocmVhZHMgKi8KKyAgICAgICAgZm9yICggZiA9IDE7IGYgPCB0ZWFtLT50LnRfbnByb2M7ICsrIGYgKSB7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtLT50LnRfdGhyZWFkc1sgZiBdICk7CisgICAgICAgICAgICBfX2ttcF9mcmVlX3RocmVhZCggdGVhbS0+dC50X3RocmVhZHNbIGYgXSApOworICAgICAgICAgICAgdGVhbS0+dC50X3RocmVhZHNbIGYgXSA9IE5VTEw7CisgICAgICAgIH0KKworCisgICAgICAgIC8qIHB1dCB0aGUgdGVhbSBiYWNrIGluIHRoZSB0ZWFtIHBvb2wgKi8KKyAgICAgICAgLyogVE9ETyBsaW1pdCBzaXplIG9mIHRlYW0gcG9vbCwgY2FsbCByZWFwX3RlYW0gaWYgcG9vbCB0b28gbGFyZ2UgKi8KKyAgICAgICAgdGVhbS0+dC50X25leHRfcG9vbCAgPSAoa21wX3RlYW1fdCopIF9fa21wX3RlYW1fcG9vbDsKKyAgICAgICAgX19rbXBfdGVhbV9wb29sICAgICAgICA9ICh2b2xhdGlsZSBrbXBfdGVhbV90KikgdGVhbTsKKyAgICB9CisKKyAgICBLTVBfTUIoKTsKK30KKworCisvKiByZWFwIHRoZSB0ZWFtLiAgZGVzdHJveSBpdCwgcmVjbGFpbSBhbGwgaXRzIHJlc291cmNlcyBhbmQgZnJlZSBpdHMgbWVtb3J5ICovCitrbXBfdGVhbV90ICoKK19fa21wX3JlYXBfdGVhbSgga21wX3RlYW1fdCAqdGVhbSApCit7CisgICAga21wX3RlYW1fdCAqbmV4dF9wb29sID0gdGVhbS0+dC50X25leHRfcG9vbDsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0gKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtLT50LnRfZGlzcGF0Y2ggICAgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtLT50LnRfZGlzcF9idWZmZXIgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtLT50LnRfdGhyZWFkcyAgICAgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtLT50LnRfYXJndiAgICAgICAgKTsKKworICAgIC8qIFRPRE8gY2xlYW4gdGhlIHRocmVhZHMgdGhhdCBhcmUgYSBwYXJ0IG9mIHRoaXM/ICovCisKKyAgICAvKiBmcmVlIHN0dWZmICovCisKKyAgICBfX2ttcF9mcmVlX3RlYW1fYXJyYXlzKCB0ZWFtICk7CisgICAgaWYgKCB0ZWFtLT50LnRfYXJndiAhPSAmdGVhbS0+dC50X2lubGluZV9hcmd2WzBdICkKKyAgICAgICAgX19rbXBfZnJlZSggKHZvaWQqKSB0ZWFtLT50LnRfYXJndiApOworICAgIF9fa21wX2ZyZWUoIHRlYW0gKTsKKworICAgIEtNUF9NQigpOworICAgIHJldHVybiBuZXh0X3Bvb2w7Cit9CisKKy8vCisvLyBGcmVlIHRoZSB0aHJlYWQuICBEb24ndCByZWFwIGl0LCBqdXN0IHBsYWNlIGl0IG9uIHRoZSBwb29sIG9mIGF2YWlsYWJsZQorLy8gdGhyZWFkcy4KKy8vCisvLyBDaGFuZ2VzIGZvciBRdWFkIGlzc3VlIDUyNzg0NTogV2UgbmVlZCBhIHByZWRpY3RhYmxlIE9NUCB0aWQgPC0+IGd0aWQKKy8vIGJpbmRpbmcgZm9yIHRoZSBhZmZpbml0eSBtZWNoYW5pc20gdG8gYmUgdXNlZnVsLgorLy8KKy8vIE5vdywgd2UgYWx3YXlzIGtlZXAgdGhlIGZyZWUgbGlzdCAoX19rbXBfdGhyZWFkX3Bvb2wpIHNvcnRlZCBieSBndGlkLgorLy8gSG93ZXZlciwgd2Ugd2FudCB0byBhdm9pZCBhIHBvdGVudGlhbCBwZXJmb3JtYW5jZSBwcm9ibGVtIGJ5IGFsd2F5cworLy8gc2Nhbm5pbmcgdGhyb3VnaCB0aGUgbGlzdCB0byBmaW5kIHRoZSBjb3JyZWN0IHBvaW50IGF0IHdoaWNoIHRvIGluc2VydAorLy8gdGhlIHRocmVhZCAocG90ZW50aWFsIE4qKjIgYmVoYXZpb3IpLiAgVG8gZG8gdGhpcyB3ZSBrZWVwIHRyYWNrIG9mIHRoZQorLy8gbGFzdCBwbGFjZSBhIHRocmVhZCBzdHJ1Y3Qgd2FzIGluc2VydGVkIChfX2ttcF90aHJlYWRfcG9vbF9pbnNlcnRfcHQpLgorLy8gV2l0aCBzaW5nbGUtbGV2ZWwgcGFyYWxsZWxpc20sIHRocmVhZHMgd2lsbCBhbHdheXMgYmUgYWRkZWQgdG8gdGhlIHRhaWwKKy8vIG9mIHRoZSBsaXN0LCBrZXB0IHRyYWNrIG9mIGJ5IF9fa21wX3RocmVhZF9wb29sX2luc2VydF9wdC4gIFdpdGggbmVzdGVkCisvLyBwYXJhbGxlbGlzbSwgYWxsIGJldHMgYXJlIG9mZiBhbmQgd2UgbWF5IG5lZWQgdG8gc2NhbiB0aHJvdWdoIHRoZSBlbnRpcmUKKy8vIGZyZWUgbGlzdC4KKy8vCisvLyBUaGlzIGNoYW5nZSBhbHNvIGhhcyBhIHBvdGVudGlhbGx5IGxhcmdlIHBlcmZvcm1hbmNlIGJlbmVmaXQsIGZvciBzb21lCisvLyBhcHBsaWNhdGlvbnMuICBQcmV2aW91c2x5LCBhcyB0aHJlYWRzIHdlcmUgZnJlZWQgZnJvbSB0aGUgaG90IHRlYW0sIHRoZXkKKy8vIHdvdWxkIGJlIHBsYWNlZCBiYWNrIG9uIHRoZSBmcmVlIGxpc3QgaW4gaW52ZXJzZSBvcmRlci4gIElmIHRoZSBob3QgdGVhbQorLy8gZ3JldyBiYWNrIHRvIGl0J3Mgb3JpZ2luYWwgc2l6ZSwgdGhlbiB0aGUgZnJlZWQgdGhyZWFkIHdvdWxkIGJlIHBsYWNlZAorLy8gYmFjayBvbiB0aGUgaG90IHRlYW0gaW4gcmV2ZXJzZSBvcmRlci4gIFRoaXMgY291bGQgY2F1c2UgYmFkIGNhY2hlCisvLyBsb2NhbGl0eSBwcm9ibGVtcyBvbiBwcm9ncmFtcyB3aGVyZSB0aGUgc2l6ZSBvZiB0aGUgaG90IHRlYW0gcmVndWxhcmx5CisvLyBncmV3IGFuZCBzaHJ1bmsuCisvLworLy8gTm93LCBmb3Igc2luZ2xlLWxldmVsIHBhcmFsbGVsaXNtLCB0aGUgT01QIHRpZCBpcyBhbHdheSA9PSBndGlkLgorLy8KK3ZvaWQKK19fa21wX2ZyZWVfdGhyZWFkKCBrbXBfaW5mb190ICp0aGlzX3RoICkKK3sKKyAgICBpbnQgZ3RpZDsKKyAgICBrbXBfaW5mb190ICoqc2NhbjsKKworICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9mcmVlX3RocmVhZDogVCMlZCBwdXR0aW5nIFQjJWQgYmFjayBvbiBmcmVlIHBvb2wuXG4iLAorICAgICAgICAgICAgICAgIF9fa21wX2dldF9ndGlkKCksIHRoaXNfdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCApKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoaXNfdGggKTsKKworICAgIC8vIFdoZW4gbW92aW5nIHRocmVhZCB0byBwb29sLCBzd2l0Y2ggdGhyZWFkIHRvIHdhaXQgb24gb3duIGJfZ28gZmxhZywgYW5kIHVuaW5pdGlhbGl6ZWQgKE5VTEwgdGVhbSkuCisgICAgaW50IGI7CisgICAga21wX2JhbGlnbl90ICpiYWxpZ24gPSB0aGlzX3RoLT50aC50aF9iYXI7CisgICAgZm9yIChiPTA7IGI8YnNfbGFzdF9iYXJyaWVyOyArK2IpIHsKKyAgICAgICAgaWYgKGJhbGlnbltiXS5iYi53YWl0X2ZsYWcgPT0gS01QX0JBUlJJRVJfUEFSRU5UX0ZMQUcpCisgICAgICAgICAgICBiYWxpZ25bYl0uYmIud2FpdF9mbGFnID0gS01QX0JBUlJJRVJfU1dJVENIX1RPX09XTl9GTEFHOworICAgICAgICBiYWxpZ25bYl0uYmIudGVhbSA9IE5VTEw7CisgICAgfQorICAgIHRoaXNfdGgtPnRoLnRoX3Rhc2tfc3RhdGUgPSAwOworCisKKyAgICAvKiBwdXQgdGhyZWFkIGJhY2sgb24gdGhlIGZyZWUgcG9vbCAqLworICAgIFRDV19QVFIodGhpc190aC0+dGgudGhfdGVhbSwgTlVMTCk7CisgICAgVENXX1BUUih0aGlzX3RoLT50aC50aF9yb290LCBOVUxMKTsKKyAgICBUQ1dfUFRSKHRoaXNfdGgtPnRoLnRoX2Rpc3BhdGNoLCBOVUxMKTsgICAgICAgICAgICAgICAvKiBOT1QgTkVFREVEICovCisKKyAgICAvLworICAgIC8vIElmIHRoZSBfX2ttcF90aHJlYWRfcG9vbF9pbnNlcnRfcHQgaXMgYWxyZWFkeSBwYXN0IHRoZSBuZXcgaW5zZXJ0CisgICAgLy8gcG9pbnQsIHRoZW4gd2UgbmVlZCB0byByZS1zY2FuIHRoZSBlbnRpcmUgbGlzdC4KKyAgICAvLworICAgIGd0aWQgPSB0aGlzX3RoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQ7CisgICAgaWYgKCBfX2ttcF90aHJlYWRfcG9vbF9pbnNlcnRfcHQgIT0gTlVMTCApIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGhyZWFkX3Bvb2wgIT0gTlVMTCApOworICAgICAgICBpZiAoIF9fa21wX3RocmVhZF9wb29sX2luc2VydF9wdC0+dGgudGhfaW5mby5kcy5kc19ndGlkID4gZ3RpZCApIHsKKyAgICAgICAgICAgICBfX2ttcF90aHJlYWRfcG9vbF9pbnNlcnRfcHQgPSBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgLy8KKyAgICAvLyBTY2FuIGRvd24gdGhlIGxpc3QgdG8gZmluZCB0aGUgcGxhY2UgdG8gaW5zZXJ0IHRoZSB0aHJlYWQuCisgICAgLy8gc2NhbiBpcyB0aGUgYWRkcmVzcyBvZiBhIGxpbmsgaW4gdGhlIGxpc3QsIHBvc3NpYmx5IHRoZSBhZGRyZXNzIG9mCisgICAgLy8gX19rbXBfdGhyZWFkX3Bvb2wgaXRzZWxmLgorICAgIC8vCisgICAgLy8gSW4gdGhlIGFic2VuY2Ugb2YgbmVzdGVkIHBhcmFsbGlzbSwgdGhlIGZvciBsb29wIHdpbGwgaGF2ZSAwIGl0ZXJhdGlvbnMuCisgICAgLy8KKyAgICBpZiAoIF9fa21wX3RocmVhZF9wb29sX2luc2VydF9wdCAhPSBOVUxMICkgeworICAgICAgICBzY2FuID0gJiggX19rbXBfdGhyZWFkX3Bvb2xfaW5zZXJ0X3B0LT50aC50aF9uZXh0X3Bvb2wgKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHNjYW4gPSAoa21wX2luZm9fdCAqKikmX19rbXBfdGhyZWFkX3Bvb2w7CisgICAgfQorICAgIGZvciAoOyAoICpzY2FuICE9IE5VTEwgKSAmJiAoICgqc2NhbiktPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCA8IGd0aWQgKTsKKyAgICAgIHNjYW4gPSAmKCAoKnNjYW4pLT50aC50aF9uZXh0X3Bvb2wgKSApOworCisgICAgLy8KKyAgICAvLyBJbnNlcnQgdGhlIG5ldyBlbGVtZW50IG9uIHRoZSBsaXN0LCBhbmQgc2V0IF9fa21wX3RocmVhZF9wb29sX2luc2VydF9wdAorICAgIC8vIHRvIGl0cyBhZGRyZXNzLgorICAgIC8vCisgICAgVENXX1BUUih0aGlzX3RoLT50aC50aF9uZXh0X3Bvb2wsICpzY2FuKTsKKyAgICBfX2ttcF90aHJlYWRfcG9vbF9pbnNlcnRfcHQgPSAqc2NhbiA9IHRoaXNfdGg7CisgICAgS01QX0RFQlVHX0FTU0VSVCggKCB0aGlzX3RoLT50aC50aF9uZXh0X3Bvb2wgPT0gTlVMTCApCisgICAgICB8fCAoIHRoaXNfdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZAorICAgICAgPCB0aGlzX3RoLT50aC50aF9uZXh0X3Bvb2wtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCApICk7CisgICAgVENXXzQodGhpc190aC0+dGgudGhfaW5fcG9vbCwgVFJVRSk7CisgICAgX19rbXBfdGhyZWFkX3Bvb2xfbnRoKys7CisKKyAgICBUQ1dfNChfX2ttcF9udGgsIF9fa21wX250aCAtIDEpOworCisjaWZkZWYgS01QX0FESlVTVF9CTE9DS1RJTUUKKyAgICAvKiBBZGp1c3QgYmxvY2t0aW1lIGJhY2sgdG8gdXNlciBzZXR0aW5nIG9yIGRlZmF1bHQgaWYgbmVjZXNzYXJ5ICovCisgICAgLyogTWlkZGxlIGluaXRpYWxpemF0aW9uIG1pZ2h0IG5ldmVyIGhhdmUgb2NjdXJyZWQgICAgICAgICAgICAgICAgKi8KKyAgICBpZiAoICFfX2ttcF9lbnZfYmxvY2t0aW1lICYmICggX19rbXBfYXZhaWxfcHJvYyA+IDAgKSApIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfYXZhaWxfcHJvYyA+IDAgKTsKKyAgICAgICAgaWYgKCBfX2ttcF9udGggPD0gX19rbXBfYXZhaWxfcHJvYyApIHsKKyAgICAgICAgICAgIF9fa21wX3plcm9fYnQgPSBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBLTVBfQURKVVNUX0JMT0NLVElNRSAqLworCisgICAgS01QX01CKCk7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgKgorX19rbXBfbGF1bmNoX3RocmVhZCgga21wX2luZm9fdCAqdGhpc190aHIgKQoreworICAgIGludCAgICAgICAgICAgICAgICAgICBndGlkID0gdGhpc190aHItPnRoLnRoX2luZm8uZHMuZHNfZ3RpZDsKKy8qICAgIHZvaWQgICAgICAgICAgICAgICAgICpzdGFja19kYXRhOyovCisgICAga21wX3RlYW1fdCAqKCp2b2xhdGlsZSBwdGVhbSk7CisKKyAgICBLTVBfTUIoKTsKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfbGF1bmNoX3RocmVhZDogVCMlZCBzdGFydFxuIiwgZ3RpZCApICk7CisKKyAgICBpZiggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICB0aGlzX3Roci0+dGgudGhfY29ucyA9IF9fa21wX2FsbG9jYXRlX2NvbnNfc3RhY2soIGd0aWQgKTsgIC8vIEFUVDogTWVtb3J5IGxlYWs/CisgICAgfQorCisjaWYgT01QVF9TVVBQT1JUCisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICB0aGlzX3Roci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfb3ZlcmhlYWQ7CisgICAgICAgIHRoaXNfdGhyLT50aC5vbXB0X3RocmVhZF9pbmZvLndhaXRfaWQgPSAwOworICAgICAgICB0aGlzX3Roci0+dGgub21wdF90aHJlYWRfaW5mby5pZGxlX2ZyYW1lID0gX19idWlsdGluX2ZyYW1lX2FkZHJlc3MoMCk7CisgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfdGhyZWFkX2JlZ2luKSkgeworICAgICAgICAgICAgX19vbXB0X3RocmVhZF9iZWdpbihvbXB0X3RocmVhZF93b3JrZXIsIGd0aWQpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBUaGlzIGlzIHRoZSBwbGFjZSB3aGVyZSB0aHJlYWRzIHdhaXQgZm9yIHdvcmsgKi8KKyAgICB3aGlsZSggISBUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpICkgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3RociA9PSBfX2ttcF90aHJlYWRzWyBndGlkIF0gKTsKKyAgICAgICAgS01QX01CKCk7CisKKyAgICAgICAgLyogd2FpdCBmb3Igd29yayB0byBkbyAqLworICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfbGF1bmNoX3RocmVhZDogVCMlZCB3YWl0aW5nIGZvciB3b3JrXG4iLCBndGlkICkpOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgICAgIHRoaXNfdGhyLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID0gb21wdF9zdGF0ZV9pZGxlOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAvKiBObyB0aWQgeWV0IHNpbmNlIG5vdCBwYXJ0IG9mIGEgdGVhbSAqLworICAgICAgICBfX2ttcF9mb3JrX2JhcnJpZXIoIGd0aWQsIEtNUF9HVElEX0RORSApOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgICAgIHRoaXNfdGhyLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID0gb21wdF9zdGF0ZV9vdmVyaGVhZDsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgcHRlYW0gPSAoa21wX3RlYW1fdCAqKCopKSgmIHRoaXNfdGhyLT50aC50aF90ZWFtKTsKKworICAgICAgICAvKiBoYXZlIHdlIGJlZW4gYWxsb2NhdGVkPyAqLworICAgICAgICBpZiAoIFRDUl9TWU5DX1BUUigqcHRlYW0pICYmICFUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpICkgeworICAgICAgICAgICAgLyogd2Ugd2VyZSBqdXN0IHdva2VuIHVwLCBzbyBydW4gb3VyIG5ldyB0YXNrICovCisgICAgICAgICAgICBpZiAoIFRDUl9TWU5DX1BUUigoKnB0ZWFtKS0+dC50X3BrZm4pICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgaW50IHJjOworICAgICAgICAgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2xhdW5jaF90aHJlYWQ6IFQjJWQoJWQ6JWQpIGludm9rZSBtaWNyb3Rhc2sgPSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsICgqcHRlYW0pLT50LnRfaWQsIF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCksICgqcHRlYW0pLT50LnRfcGtmbikpOworCisgICAgICAgICAgICAgICAgdXBkYXRlSFdGUENvbnRyb2wgKCpwdGVhbSk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXNfdGhyLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID0gb21wdF9zdGF0ZV93b3JrX3BhcmFsbGVsOworICAgICAgICAgICAgICAgICAgICAvLyBJbml0aWFsaXplIE9NUFQgdGFzayBpZCBmb3IgaW1wbGljaXQgdGFzay4KKyAgICAgICAgICAgICAgICAgICAgaW50IHRpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCk7CisgICAgICAgICAgICAgICAgICAgICgqcHRlYW0pLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLm9tcHRfdGFza19pbmZvLnRhc2tfaWQgPQorICAgICAgICAgICAgICAgICAgICBfX29tcHRfdGFza19pZF9uZXcodGlkKTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAgICAgICAgIEtNUF9TVE9QX0RFVkVMT1BFUl9FWFBMSUNJVF9USU1FUihVU0VSX2xhdW5jaF90aHJlYWRfbG9vcCk7CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBLTVBfVElNRV9ERVZFTE9QRVJfQkxPQ0soVVNFUl93b3JrZXJfaW52b2tlKTsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSAoKnB0ZWFtKS0+dC50X2ludm9rZSggZ3RpZCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBLTVBfU1RBUlRfREVWRUxPUEVSX0VYUExJQ0lUX1RJTUVSKFVTRVJfbGF1bmNoX3RocmVhZF9sb29wKTsKKyAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKCByYyApOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICAgICAgICAgICAgICAvKiBubyBmcmFtZSBzZXQgd2hpbGUgb3V0c2lkZSB0YXNrICovCisgICAgICAgICAgICAgICAgICAgIGludCB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpOworICAgICAgICAgICAgICAgICAgICAoKnB0ZWFtKS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS5vbXB0X3Rhc2tfaW5mby5mcmFtZS5leGl0X3J1bnRpbWVfZnJhbWUgPSAwOworCisgICAgICAgICAgICAgICAgICAgIHRoaXNfdGhyLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID0gb21wdF9zdGF0ZV9vdmVyaGVhZDsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9sYXVuY2hfdGhyZWFkOiBUIyVkKCVkOiVkKSBkb25lIG1pY3JvdGFzayA9ICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgKCpwdGVhbSktPnQudF9pZCwgX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKSwgKCpwdGVhbSktPnQudF9wa2ZuKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBqb2luIGJhcnJpZXIgYWZ0ZXIgcGFyYWxsZWwgcmVnaW9uICovCisgICAgICAgICAgICBfX2ttcF9qb2luX2JhcnJpZXIoIGd0aWQgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBUQ1JfU1lOQ19QVFIoKGludHB0cl90KV9fa21wX2dsb2JhbC5nLmdfZG9uZSk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF90aHJlYWRfZW5kKSkgeworICAgICAgICBfX29tcHRfdGhyZWFkX2VuZChvbXB0X3RocmVhZF93b3JrZXIsIGd0aWQpOworICAgIH0KKyNlbmRpZgorCisgICAgdGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSA9IE5VTEw7CisgICAgLyogcnVuIHRoZSBkZXN0cnVjdG9ycyBmb3IgdGhlIHRocmVhZHByaXZhdGUgZGF0YSBmb3IgdGhpcyB0aHJlYWQgKi8KKyAgICBfX2ttcF9jb21tb25fZGVzdHJveV9ndGlkKCBndGlkICk7CisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfbGF1bmNoX3RocmVhZDogVCMlZCBkb25lXG4iLCBndGlkICkgKTsKKyAgICBLTVBfTUIoKTsKKyAgICByZXR1cm4gdGhpc190aHI7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQKK19fa21wX2ludGVybmFsX2VuZF9kZXN0KCB2b2lkICpzcGVjaWZpY19ndGlkICkKK3sKKyAgICAjaWYgS01QX0NPTVBJTEVSX0lDQworICAgICAgICAjcHJhZ21hIHdhcm5pbmcoIHB1c2ggKQorICAgICAgICAjcHJhZ21hIHdhcm5pbmcoIGRpc2FibGU6ICA4MTAgKSAvLyBjb252ZXJzaW9uIGZyb20gInZvaWQgKiIgdG8gImludCIgbWF5IGxvc2Ugc2lnbmlmaWNhbnQgYml0cworICAgICNlbmRpZgorICAgIC8vIE1ha2Ugc3VyZSBubyBzaWduaWZpY2FudCBiaXRzIGFyZSBsb3N0CisgICAgaW50IGd0aWQgPSAoa21wX2ludHB0cl90KXNwZWNpZmljX2d0aWQgLSAxOworICAgICNpZiBLTVBfQ09NUElMRVJfSUNDCisgICAgICAgICNwcmFnbWEgd2FybmluZyggcG9wICkKKyAgICAjZW5kaWYKKworICAgIEtBX1RSQUNFKCAzMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfZGVzdDogVCMlZFxuIiwgZ3RpZCkpOworICAgIC8qIE5PVEU6IHRoZSBndGlkIGlzIHN0b3JlZCBhcyBnaXRkKzEgaW4gdGhlIHRocmVhZC1sb2NhbC1zdG9yYWdlCisgICAgICogdGhpcyBpcyBiZWNhdXNlIDAgaXMgcmVzZXJ2ZWQgZm9yIHRoZSBub3RoaW5nLXN0b3JlZCBjYXNlICovCisKKyAgICAvKiBqb3NoOiBPbmUgcmVhc29uIGZvciBzZXR0aW5nIHRoZSBndGlkIHNwZWNpZmljIGRhdGEgZXZlbiB3aGVuIGl0IGlzIGJlaW5nCisgICAgICAgZGVzdHJveWVkIGJ5IHB0aHJlYWQgaXMgdG8gYWxsb3cgZ3RpZCBsb29rdXAgdGhyb3VnaCB0aHJlYWQgc3BlY2lmaWMgZGF0YQorICAgICAgIChfX2ttcF9ndGlkX2dldF9zcGVjaWZpYykuICBTb21lIG9mIHRoZSBjb2RlLCBlc3BlY2lhbGx5IHN0YXQgY29kZSwKKyAgICAgICB0aGF0IGdldHMgZXhlY3V0ZWQgaW4gdGhlIGNhbGwgdG8gX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZCwgYWN0dWFsbHkKKyAgICAgICBnZXRzIHRoZSBndGlkIHRocm91Z2ggdGhlIHRocmVhZCBzcGVjaWZpYyBkYXRhLiAgU2V0dGluZyBpdCBoZXJlIHNlZW1zCisgICAgICAgcmF0aGVyIGluZWxlZ2FudCBhbmQgcGVyaGFwcyB3cm9uZywgYnV0IGFsbG93cyBfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkCisgICAgICAgdG8gcnVuIHNtb290aGx5LgorICAgICAgIHRvZG86IGdldCByaWQgb2YgdGhpcyBhZnRlciB3ZSByZW1vdmUgdGhlIGRlcGVuZGVuY2Ugb24KKyAgICAgICBfX2ttcF9ndGlkX2dldF9zcGVjaWZpYworICAgICovCisgICAgaWYoZ3RpZCA+PSAwICYmIEtNUF9VQkVSX0dUSUQoZ3RpZCkpCisgICAgICAgIF9fa21wX2d0aWRfc2V0X3NwZWNpZmljKCBndGlkICk7CisgICAgI2lmZGVmIEtNUF9UREFUQV9HVElECisgICAgICAgIF9fa21wX2d0aWQgPSBndGlkOworICAgICNlbmRpZgorICAgIF9fa21wX2ludGVybmFsX2VuZF90aHJlYWQoIGd0aWQgKTsKK30KKworI2lmIEtNUF9PU19VTklYICYmIEtNUF9EWU5BTUlDX0xJQgorCisvLyAyMDA5LTA5LTA4IChsZXYpOiBJdCBsb29rcyB0aGUgZGVzdHJ1Y3RvciBkb2VzIG5vdCB3b3JrLiBJbiBzaW1wbGUgdGVzdCBjYXNlcyBkZXN0cnVjdG9ycyB3b3JrCisvLyBwZXJmZWN0bHksIGJ1dCBpbiByZWFsIGxpYm9tcC5zbyBJIGhhdmUgbm8gZXZpZGVuY2UgaXQgaXMgZXZlciBjYWxsZWQuIEhvd2V2ZXIsIC1maW5pIGxpbmtlcgorLy8gb3B0aW9uIGluIG1ha2VmaWxlLm1rIHdvcmtzIGZpbmUuCisKK19fYXR0cmlidXRlX18oKCBkZXN0cnVjdG9yICkpCit2b2lkCitfX2ttcF9pbnRlcm5hbF9lbmRfZHRvciggdm9pZCApCit7CisgICAgX19rbXBfaW50ZXJuYWxfZW5kX2F0ZXhpdCgpOworfQorCit2b2lkCitfX2ttcF9pbnRlcm5hbF9lbmRfZmluaSggdm9pZCApCit7CisgICAgX19rbXBfaW50ZXJuYWxfZW5kX2F0ZXhpdCgpOworfQorCisjZW5kaWYKKworLyogW1dpbmRvd3NdIGpvc2g6IHdoZW4gdGhlIGF0ZXhpdCBoYW5kbGVyIGlzIGNhbGxlZCwgdGhlcmUgbWF5IHN0aWxsIGJlIG1vcmUgdGhhbiBvbmUgdGhyZWFkIGFsaXZlICovCit2b2lkCitfX2ttcF9pbnRlcm5hbF9lbmRfYXRleGl0KCB2b2lkICkKK3sKKyAgICBLQV9UUkFDRSggMzAsICggIl9fa21wX2ludGVybmFsX2VuZF9hdGV4aXRcbiIgKSApOworICAgIC8qIFtXaW5kb3dzXQorICAgICAgIGpvc2g6IGlkZWFsbHksIHdlIHdhbnQgdG8gY29tcGxldGVseSBzaHV0ZG93biB0aGUgbGlicmFyeSBpbiB0aGlzIGF0ZXhpdCBoYW5kbGVyLCBidXQKKyAgICAgICBzdGF0IGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRocmVhZCBzcGVjaWZpYyBkYXRhIGZvciBndGlkIGZhaWxzIGJlY2F1c2UgdGhhdCBkYXRhIGJlY29tZXMKKyAgICAgICB1bmF2YWlsYWJsZSBhdCBzb21lIHBvaW50IGR1cmluZyB0aGUgc2h1dGRvd24sIHNvIHdlIGNhbGwgX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZAorICAgICAgIGluc3RlYWQuICBXZSBzaG91bGQgZXZlbnR1YWxseSByZW1vdmUgdGhlIGRlcGVuZGVuY3kgb24gX19rbXBfZ2V0X3NwZWNpZmljX2d0aWQgaW4gdGhlCisgICAgICAgc3RhdCBjb2RlIGFuZCB1c2UgX19rbXBfaW50ZXJuYWxfZW5kX2xpYnJhcnkgdG8gY2xlYW5seSBzaHV0ZG93biB0aGUgbGlicmFyeS4KKworLy8gVE9ETzogQ2FuIHNvbWUgb2YgdGhpcyBjb21tZW50IGFib3V0IEdWUyBiZSByZW1vdmVkPworICAgICAgIEkgc3VzcGVjdCB0aGF0IHRoZSBvZmZlbmRpbmcgc3RhdCBjb2RlIGlzIGV4ZWN1dGVkIHdoZW4gdGhlIGNhbGxpbmcgdGhyZWFkIHRyaWVzIHRvCisgICAgICAgY2xlYW4gdXAgYSBkZWFkIHJvb3QgdGhyZWFkJ3MgZGF0YSBzdHJ1Y3R1cmVzLCByZXN1bHRpbmcgaW4gR1ZTIGNvZGUgdHJ5aW5nIHRvIGNsb3NlCisgICAgICAgdGhlIEdWUyBzdHJ1Y3R1cmVzIGZvciB0aGF0IHRocmVhZCwgYnV0IHNpbmNlIHRoZSBzdGF0IGNvZGUgdXNlcworICAgICAgIF9fa21wX2dldF9zcGVjaWZpY19ndGlkIHRvIGdldCB0aGUgZ3RpZCB3aXRoIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIGNhbGxpbmcgdGhyZWFkIGlzCisgICAgICAgY2xlYW5pbmcgdXAgaXRzZWxmIGluc3RlYWQgb2YgYW5vdGhlciB0aHJlYWQsIGl0IGdldHMgY29uZnVzZWQuICBUaGlzIGhhcHBlbnMgYmVjYXVzZQorICAgICAgIGFsbG93aW5nIGEgdGhyZWFkIHRvIHVucmVnaXN0ZXIgYW5kIGNsZWFudXAgYW5vdGhlciB0aHJlYWQgaXMgYSByZWNlbnQgbW9kaWZpY2F0aW9uIGZvcgorICAgICAgIGFkZHJlc3NpbmcgYW4gaXNzdWUgd2l0aCBNYXhvbiBDaW5lbWE0RC4gIEJhc2VkIG9uIHRoZSBjdXJyZW50IGRlc2lnbiAoMjAwNTA3MjIpLCBhCisgICAgICAgdGhyZWFkIG1heSBlbmQgdXAgdHJ5aW5nIHRvIHVucmVnaXN0ZXIgYW5vdGhlciB0aHJlYWQgb25seSBpZiB0aHJlYWQgZGVhdGggZG9lcyBub3QKKyAgICAgICB0cmlnZ2VyIHRoZSBjYWxsaW5nIG9mIF9fa21wX2ludGVybmFsX2VuZF90aHJlYWQuICBGb3IgTGludXgqIE9TLCB0aGVyZSBpcyB0aGUgdGhyZWFkCisgICAgICAgc3BlY2lmaWMgZGF0YSBkZXN0cnVjdG9yIGZ1bmN0aW9uIHRvIGRldGVjdCB0aHJlYWQgZGVhdGguICBGb3IgV2luZG93cyBkeW5hbWljLCB0aGVyZQorICAgICAgIGlzIERsbE1haW4oVEhSRUFEX0RFVEFDSCkuICBGb3IgV2luZG93cyBzdGF0aWMsIHRoZXJlIGlzIG5vdGhpbmcuICBUaHVzLCB0aGUKKyAgICAgICB3b3JrYXJvdW5kIGlzIGFwcGxpY2FibGUgb25seSBmb3IgV2luZG93cyBzdGF0aWMgc3RhdCBsaWJyYXJ5LgorICAgICovCisgICAgX19rbXBfaW50ZXJuYWxfZW5kX2xpYnJhcnkoIC0xICk7CisgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIF9fa21wX2Nsb3NlX2NvbnNvbGUoKTsKKyAgICAjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK19fa21wX3JlYXBfdGhyZWFkKAorICAgIGttcF9pbmZvX3QgKiB0aHJlYWQsCisgICAgaW50IGlzX3Jvb3QKKykgeworCisgICAgLy8gSXQgaXMgYXNzdW1lZCBfX2ttcF9mb3Jram9pbl9sb2NrIGlzIGFjcXVpcmVkLgorCisgICAgaW50IGd0aWQ7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aHJlYWQgIT0gTlVMTCApOworCisgICAgZ3RpZCA9IHRocmVhZC0+dGgudGhfaW5mby5kcy5kc19ndGlkOworCisgICAgaWYgKCAhIGlzX3Jvb3QgKSB7CisKKyAgICAgICAgaWYgKCBfX2ttcF9kZmx0X2Jsb2NrdGltZSAhPSBLTVBfTUFYX0JMT0NLVElNRSApIHsKKyAgICAgICAgICAgIC8qIEFzc3VtZSB0aGUgdGhyZWFkcyBhcmUgYXQgdGhlIGZvcmsgYmFycmllciBoZXJlICovCisgICAgICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfcmVhcF90aHJlYWQ6IHJlbGVhc2luZyBUIyVkIGZyb20gZm9yayBiYXJyaWVyIGZvciByZWFwXG4iLCBndGlkICkgKTsKKyAgICAgICAgICAgIC8qIE5lZWQgcmVsZWFzZSBmZW5jZSBoZXJlIHRvIHByZXZlbnQgc2VnIGZhdWx0cyBmb3IgdHJlZSBmb3Jram9pbiBiYXJyaWVyIChHRUgpICovCisgICAgICAgICAgICBrbXBfZmxhZ182NCBmbGFnKCZ0aHJlYWQtPnRoLnRoX2JhclsgYnNfZm9ya2pvaW5fYmFycmllciBdLmJiLmJfZ28sIHRocmVhZCk7CisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlXzY0KCZmbGFnKTsKKyAgICAgICAgfTsgLy8gaWYKKworCisgICAgICAgIC8vIFRlcm1pbmF0ZSBPUyB0aHJlYWQuCisgICAgICAgIF9fa21wX3JlYXBfd29ya2VyKCB0aHJlYWQgKTsKKworICAgICAgICAvLworICAgICAgICAvLyBUaGUgdGhyZWFkIHdhcyBraWxsZWQgYXN5bmNocm9ub3VzbHkuICBJZiBpdCB3YXMgYWN0aXZlbHkKKyAgICAgICAgLy8gc3Bpbm5pbmcgaW4gdGhlIGluIHRoZSB0aHJlYWQgcG9vbCwgZGVjcmVtZW50IHRoZSBnbG9iYWwgY291bnQuCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoZXJlIGlzIGEgc21hbGwgdGltaW5nIGhvbGUgaGVyZSAtIGlmIHRoZSB3b3JrZXIgdGhyZWFkIHdhcworICAgICAgICAvLyBqdXN0IHdha2luZyB1cCBhZnRlciBzbGVlcGluZyBpbiB0aGUgcG9vbCwgaGFkIHJlc2V0IGl0J3MKKyAgICAgICAgLy8gdGhfYWN0aXZlX2luX3Bvb2wgZmxhZyBidXQgbm90IGRlY3JlbWVudGVkIHRoZSBnbG9iYWwgY291bnRlcgorICAgICAgICAvLyBfX2ttcF90aHJlYWRfcG9vbF9hY3RpdmVfbnRoIHlldCwgdGhlbiB0aGUgZ2xvYmFsIGNvdW50ZXIKKyAgICAgICAgLy8gbWlnaHQgbm90IGdldCB1cGRhdGVkLgorICAgICAgICAvLworICAgICAgICAvLyBDdXJyZW50bHksIHRoaXMgY2FuIG9ubHkgaGFwcGVuIGFzIHRoZSBsaWJyYXJ5IGlzIHVubG9hZGVkLAorICAgICAgICAvLyBzbyB0aGVyZSBhcmUgbm8gaGFybWZ1bCBzaWRlIGVmZmVjdHMuCisgICAgICAgIC8vCisgICAgICAgIGlmICggdGhyZWFkLT50aC50aF9hY3RpdmVfaW5fcG9vbCApIHsKKyAgICAgICAgICAgIHRocmVhZC0+dGgudGhfYWN0aXZlX2luX3Bvb2wgPSBGQUxTRTsKKyAgICAgICAgICAgIEtNUF9URVNUX1RIRU5fREVDMzIoCisgICAgICAgICAgICAgIChrbXBfaW50MzIgKikgJl9fa21wX3RocmVhZF9wb29sX2FjdGl2ZV9udGggKTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIFRDUl80KF9fa21wX3RocmVhZF9wb29sX2FjdGl2ZV9udGgpID49IDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIERlY3JlbWVudCAjIG9mIFt3b3JrZXJdIHRocmVhZHMgaW4gdGhlIHBvb2wuCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3RocmVhZF9wb29sX250aCA+IDAgKTsKKyAgICAgICAgLS1fX2ttcF90aHJlYWRfcG9vbF9udGg7CisgICAgfTsgLy8gaWYKKworICAgIC8vIEZyZWUgdGhlIGZhc3QgbWVtb3J5IGZvciB0YXNraW5nCisgICAgI2lmIFVTRV9GQVNUX01FTU9SWQorICAgICAgICBfX2ttcF9mcmVlX2Zhc3RfbWVtb3J5KCB0aHJlYWQgKTsKKyAgICAjZW5kaWYgLyogVVNFX0ZBU1RfTUVNT1JZICovCisKKyAgICBfX2ttcF9zdXNwZW5kX3VuaW5pdGlhbGl6ZV90aHJlYWQoIHRocmVhZCApOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGhyZWFkc1sgZ3RpZCBdID09IHRocmVhZCApOworICAgIFRDV19TWU5DX1BUUihfX2ttcF90aHJlYWRzW2d0aWRdLCBOVUxMKTsKKworICAgIC0tIF9fa21wX2FsbF9udGg7CisgICAgLy8gX19rbXBfbnRoIHdhcyBkZWNyZW1lbnRlZCB3aGVuIHRocmVhZCBpcyBhZGRlZCB0byB0aGUgcG9vbC4KKworI2lmZGVmIEtNUF9BREpVU1RfQkxPQ0tUSU1FCisgICAgLyogQWRqdXN0IGJsb2NrdGltZSBiYWNrIHRvIHVzZXIgc2V0dGluZyBvciBkZWZhdWx0IGlmIG5lY2Vzc2FyeSAqLworICAgIC8qIE1pZGRsZSBpbml0aWFsaXphdGlvbiBtaWdodCBuZXZlciBoYXZlIG9jY3VycmVkICAgICAgICAgICAgICAgICovCisgICAgaWYgKCAhX19rbXBfZW52X2Jsb2NrdGltZSAmJiAoIF9fa21wX2F2YWlsX3Byb2MgPiAwICkgKSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2F2YWlsX3Byb2MgPiAwICk7CisgICAgICAgIGlmICggX19rbXBfbnRoIDw9IF9fa21wX2F2YWlsX3Byb2MgKSB7CisgICAgICAgICAgICBfX2ttcF96ZXJvX2J0ID0gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogS01QX0FESlVTVF9CTE9DS1RJTUUgKi8KKworICAgIC8qIGZyZWUgdGhlIG1lbW9yeSBiZWluZyB1c2VkICovCisgICAgaWYoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgaWYgKCB0aHJlYWQtPnRoLnRoX2NvbnMgKSB7CisgICAgICAgICAgICBfX2ttcF9mcmVlX2NvbnNfc3RhY2soIHRocmVhZC0+dGgudGhfY29ucyApOworICAgICAgICAgICAgdGhyZWFkLT50aC50aF9jb25zID0gTlVMTDsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9CisKKyAgICBpZiAoIHRocmVhZC0+dGgudGhfcHJpX2NvbW1vbiAhPSBOVUxMICkgeworICAgICAgICBfX2ttcF9mcmVlKCB0aHJlYWQtPnRoLnRoX3ByaV9jb21tb24gKTsKKyAgICAgICAgdGhyZWFkLT50aC50aF9wcmlfY29tbW9uID0gTlVMTDsKKyAgICB9OyAvLyBpZgorCisgICAgaWYgKHRocmVhZC0+dGgudGhfdGFza19zdGF0ZV9tZW1vX3N0YWNrICE9IE5VTEwpIHsKKyAgICAgICAgX19rbXBfZnJlZSh0aHJlYWQtPnRoLnRoX3Rhc2tfc3RhdGVfbWVtb19zdGFjayk7CisgICAgICAgIHRocmVhZC0+dGgudGhfdGFza19zdGF0ZV9tZW1vX3N0YWNrID0gTlVMTDsKKyAgICB9CisKKyAgICAjaWYgS01QX1VTRV9CR0VUCisgICAgICAgIGlmICggdGhyZWFkLT50aC50aF9sb2NhbC5iZ2V0X2RhdGEgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIF9fa21wX2ZpbmFsaXplX2JnZXQoIHRocmVhZCApOworICAgICAgICB9OyAvLyBpZgorICAgICNlbmRpZgorCisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIGlmICggdGhyZWFkLT50aC50aF9hZmZpbl9tYXNrICE9IE5VTEwgKSB7CisgICAgICAgIEtNUF9DUFVfRlJFRSggdGhyZWFkLT50aC50aF9hZmZpbl9tYXNrICk7CisgICAgICAgIHRocmVhZC0+dGgudGhfYWZmaW5fbWFzayA9IE5VTEw7CisgICAgfTsgLy8gaWYKKyNlbmRpZiAvKiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEICovCisKKyAgICBfX2ttcF9yZWFwX3RlYW0oIHRocmVhZC0+dGgudGhfc2VyaWFsX3RlYW0gKTsKKyAgICB0aHJlYWQtPnRoLnRoX3NlcmlhbF90ZWFtID0gTlVMTDsKKyAgICBfX2ttcF9mcmVlKCB0aHJlYWQgKTsKKworICAgIEtNUF9NQigpOworCit9IC8vIF9fa21wX3JlYXBfdGhyZWFkCisKK3N0YXRpYyB2b2lkCitfX2ttcF9pbnRlcm5hbF9lbmQodm9pZCkKK3sKKyAgICBpbnQgaTsKKworICAgIC8qIEZpcnN0LCB1bnJlZ2lzdGVyIHRoZSBsaWJyYXJ5ICovCisgICAgX19rbXBfdW5yZWdpc3Rlcl9saWJyYXJ5KCk7CisKKyAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgLyogSW4gV2luIHN0YXRpYyBsaWJyYXJ5LCB3ZSBjYW4ndCB0ZWxsIHdoZW4gYSByb290IGFjdHVhbGx5IGRpZXMsIHNvIHdlCisgICAgICAgICAgIHJlY2xhaW0gdGhlIGRhdGEgc3RydWN0dXJlcyBmb3IgYW55IHJvb3QgdGhyZWFkcyB0aGF0IGhhdmUgZGllZCBidXQgbm90CisgICAgICAgICAgIHVucmVnaXN0ZXJlZCB0aGVtc2VsdmVzLCBpbiBvcmRlciB0byBzaHV0IGRvd24gY2xlYW5seS4KKyAgICAgICAgICAgSW4gV2luIGR5bmFtaWMgbGlicmFyeSB3ZSBhbHNvIGNhbid0IHRlbGwgd2hlbiBhIHRocmVhZCBkaWVzLgorICAgICAgICAqLworICAgICAgICBfX2ttcF9yZWNsYWltX2RlYWRfcm9vdHMoKTsgLy8gQUM6IG1vdmVkIGhlcmUgdG8gYWx3YXlzIGNsZWFuIHJlc291cmNlcyBvZiBkZWFkIHJvb3RzCisgICAgI2VuZGlmCisKKyAgICBmb3IoIGk9MCA7IGk8X19rbXBfdGhyZWFkc19jYXBhY2l0eSA7IGkrKyApCisgICAgICAgIGlmKCBfX2ttcF9yb290W2ldICkKKyAgICAgICAgICAgIGlmKCBfX2ttcF9yb290W2ldLT5yLnJfYWN0aXZlICkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKyAgICBUQ1dfU1lOQ180KF9fa21wX2dsb2JhbC5nLmdfZG9uZSwgVFJVRSk7CisKKyAgICBpZiAoIGkgPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5ICkgeworICAgICAgICAvLyAyMDA5LTA5LTA4IChsZXYpOiBPdGhlciBhbGl2ZSByb290cyBmb3VuZC4gV2h5IGRvIHdlIGtpbGwgdGhlIG1vbml0b3I/PworICAgICAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgICAgICAvLworICAgICAgICAvLyBOZWVkIHRvIGNoZWNrIHRoYXQgbW9uaXRvciB3YXMgaW5pdGlhbGl6ZWQgYmVmb3JlIHJlYXBpbmcgaXQuCisgICAgICAgIC8vIElmIHdlIGFyZSBjYWxsZWQgZm9ybSBfX2ttcF9hdGZvcmtfY2hpbGQgKHdoaWNoIHNldHMKKyAgICAgICAgLy8gX19rbXBfaW5pdF9wYXJhbGxlbCA9IDApLCB0aGVuIF9fa21wX21vbml0b3Igd2lsbCBhcHBlYXIgdG8KKyAgICAgICAgLy8gY29udGFpbiB2YWxpZCBkYXRhLCBidXQgaXQgaXMgb25seSB2YWxpZCBpbiB0aGUgcGFyZW50IHByb2Nlc3MsCisgICAgICAgIC8vIG5vdCB0aGUgY2hpbGQuCisgICAgICAgIC8vCisgICAgICAgIC8vIE5ldyBiZWhhdmlvciAoMjAxMDA4KTogaW5zdGVhZCBvZiBrZXlpbmcgb2ZmIG9mIHRoZSBmbGFnCisgICAgICAgIC8vIF9fa21wX2luaXRfcGFyYWxsZWwsIHRoZSBtb25pdG9yIHRocmVhZCBjcmVhdGlvbiBpcyBrZXllZCBvZmYKKyAgICAgICAgLy8gb2YgdGhlIG5ldyBmbGFnIF9fa21wX2luaXRfbW9uaXRvci4KKyAgICAgICAgLy8KKyAgICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiBfX2ttcF9tb25pdG9yX2xvY2sgKTsKKyAgICAgICAgaWYgKCBUQ1JfNCggX19rbXBfaW5pdF9tb25pdG9yICkgKSB7CisgICAgICAgICAgICBfX2ttcF9yZWFwX21vbml0b3IoICYgX19rbXBfbW9uaXRvciApOworICAgICAgICAgICAgVENXXzQoIF9fa21wX2luaXRfbW9uaXRvciwgMCApOworICAgICAgICB9CisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfbW9uaXRvcl9sb2NrICk7CisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmQ6IG1vbml0b3IgcmVhcGVkXG4iICkgKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBUT0RPIG1vdmUgdGhpcyB0byBjbGVhbnVwIGNvZGUgKi8KKyAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgLyogbWFrZSBzdXJlIHRoYXQgZXZlcnl0aGluZyBoYXMgcHJvcGVybHkgZW5kZWQgKi8KKyAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgX19rbXBfdGhyZWFkc19jYXBhY2l0eTsgaSsrICkgeworICAgICAgICAgICAgICAgIGlmKCBfX2ttcF9yb290W2ldICkgeworLy8gICAgICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoICEgS01QX1VCRVJfR1RJRCggaSApICk7ICAgICAgICAgLy8gQUM6IHRoZXJlIGNhbiBiZSB1YmVyIHRocmVhZHMgYWxpdmUgaGVyZQorICAgICAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKCAhIF9fa21wX3Jvb3RbaV0tPnIucl9hY3RpdmUgKTsgIC8vIFRPRE86IGNhbiB0aGV5IGJlIGFjdGl2ZT8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICNlbmRpZgorCisgICAgICAgIEtNUF9NQigpOworCisgICAgICAgIC8vIFJlYXAgdGhlIHdvcmtlciB0aHJlYWRzLgorICAgICAgICAvLyBUaGlzIGlzIHZhbGlkIGZvciBub3csIGJ1dCBiZSBjYXJlZnVsIGlmIHRocmVhZHMgYXJlIHJlYXBlZCBzb29uZXIuCisgICAgICAgIHdoaWxlICggX19rbXBfdGhyZWFkX3Bvb2wgIT0gTlVMTCApIHsgICAgLy8gTG9vcCB0aHJ1IGFsbCB0aGUgdGhyZWFkIGluIHRoZSBwb29sLgorICAgICAgICAgICAgLy8gR2V0IHRoZSBuZXh0IHRocmVhZCBmcm9tIHRoZSBwb29sLgorICAgICAgICAgICAga21wX2luZm9fdCAqIHRocmVhZCA9IChrbXBfaW5mb190ICopIF9fa21wX3RocmVhZF9wb29sOworICAgICAgICAgICAgX19rbXBfdGhyZWFkX3Bvb2wgPSB0aHJlYWQtPnRoLnRoX25leHRfcG9vbDsKKyAgICAgICAgICAgIC8vIFJlYXAgaXQuCisgICAgICAgICAgICB0aHJlYWQtPnRoLnRoX25leHRfcG9vbCA9IE5VTEw7CisgICAgICAgICAgICB0aHJlYWQtPnRoLnRoX2luX3Bvb2wgPSBGQUxTRTsKKyAgICAgICAgICAgIF9fa21wX3JlYXBfdGhyZWFkKCB0aHJlYWQsIDAgKTsKKyAgICAgICAgfTsgLy8gd2hpbGUKKyAgICAgICAgX19rbXBfdGhyZWFkX3Bvb2xfaW5zZXJ0X3B0ID0gTlVMTDsKKworICAgICAgICAvLyBSZWFwIHRlYW1zLgorICAgICAgICB3aGlsZSAoIF9fa21wX3RlYW1fcG9vbCAhPSBOVUxMICkgeyAgICAgLy8gTG9vcCB0aHJ1IGFsbCB0aGUgdGVhbXMgaW4gdGhlIHBvb2wuCisgICAgICAgICAgICAvLyBHZXQgdGhlIG5leHQgdGVhbSBmcm9tIHRoZSBwb29sLgorICAgICAgICAgICAga21wX3RlYW1fdCAqIHRlYW0gPSAoa21wX3RlYW1fdCAqKSBfX2ttcF90ZWFtX3Bvb2w7CisgICAgICAgICAgICBfX2ttcF90ZWFtX3Bvb2wgPSB0ZWFtLT50LnRfbmV4dF9wb29sOworICAgICAgICAgICAgLy8gUmVhcCBpdC4KKyAgICAgICAgICAgIHRlYW0tPnQudF9uZXh0X3Bvb2wgPSBOVUxMOworICAgICAgICAgICAgX19rbXBfcmVhcF90ZWFtKCB0ZWFtICk7CisgICAgICAgIH07IC8vIHdoaWxlCisKKyAgICAgICAgX19rbXBfcmVhcF90YXNrX3RlYW1zKCApOworCisgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgX19rbXBfdGhyZWFkc19jYXBhY2l0eTsgKysgaSApIHsKKyAgICAgICAgICAgIC8vIFRCRDogQWRkIHNvbWUgY2hlY2tpbmcuLi4KKyAgICAgICAgICAgIC8vIFNvbWV0aGluZyBsaWtlIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3RocmVhZFsgaSBdID09IE5VTEwgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIE1ha2Ugc3VyZSBhbGwgdGhyZWFkcHJpdmF0ZSBkZXN0cnVjdG9ycyBnZXQgcnVuIGJ5IGpvaW5pbmcgd2l0aCBhbGwgd29ya2VyCisgICAgICAgICAgIHRocmVhZHMgYmVmb3JlIHJlc2V0dGluZyB0aGlzIGZsYWcgKi8KKyAgICAgICAgVENXX1NZTkNfNChfX2ttcF9pbml0X2NvbW1vbiwgRkFMU0UpOworCisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmQ6IGFsbCB3b3JrZXJzIHJlYXBlZFxuIiApICk7CisgICAgICAgIEtNUF9NQigpOworCisgICAgICAgIC8vCisgICAgICAgIC8vIFNlZSBub3RlIGFib3ZlOiBPbmUgb2YgdGhlIHBvc3NpYmxlIGZpeGVzIGZvciBDUTEzODQzNCAvIENRMTQwMTI2CisgICAgICAgIC8vCisgICAgICAgIC8vIEZJWE1FOiBwdXNoIGJvdGggY29kZSBmcmFnbWVudHMgZG93biBhbmQgQ1NFIHRoZW0/CisgICAgICAgIC8vIHB1c2ggdGhlbSBpbnRvIF9fa21wX2NsZWFudXAoKSA/CisgICAgICAgIC8vCisgICAgICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfbW9uaXRvcl9sb2NrICk7CisgICAgICAgIGlmICggVENSXzQoIF9fa21wX2luaXRfbW9uaXRvciApICkgeworICAgICAgICAgICAgX19rbXBfcmVhcF9tb25pdG9yKCAmIF9fa21wX21vbml0b3IgKTsKKyAgICAgICAgICAgIFRDV180KCBfX2ttcF9pbml0X21vbml0b3IsIDAgKTsKKyAgICAgICAgfQorICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX21vbml0b3JfbG9jayApOworICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kOiBtb25pdG9yIHJlYXBlZFxuIiApICk7CisKKyAgICB9IC8qIGVsc2UgIV9fa21wX2dsb2JhbC50X2FjdGl2ZSAqLworICAgIFRDV180KF9fa21wX2luaXRfZ3RpZCwgRkFMU0UpOworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisKKyAgICBfX2ttcF9jbGVhbnVwKCk7CisjaWYgT01QVF9TVVBQT1JUCisgICAgb21wdF9maW5pKCk7CisjZW5kaWYKK30KKwordm9pZAorX19rbXBfaW50ZXJuYWxfZW5kX2xpYnJhcnkoIGludCBndGlkX3JlcSApCit7CisgICAgLyogaWYgd2UgaGF2ZSBhbHJlYWR5IGNsZWFuZWQgdXAsIGRvbid0IHRyeSBhZ2FpbiwgaXQgd291bGRuJ3QgYmUgcHJldHR5ICovCisgICAgLyogdGhpcyBzaG91bGRuJ3QgYmUgYSByYWNlIGNvbmRpdGlvbiBiZWNhdXNlIF9fa21wX2ludGVybmFsX2VuZCgpIGlzIHRoZQorICAgICAqIG9ubHkgcGxhY2UgdG8gY2xlYXIgX19rbXBfc2VyaWFsX2luaXQgKi8KKyAgICAvKiB3ZSdsbCBjaGVjayB0aGlzIGxhdGVyIHRvbywgYWZ0ZXIgd2UgZ2V0IHRoZSBsb2NrICovCisgICAgLy8gMjAwOS0wOS0wNjogV2UgZG8gbm90IHNldCBnX2Fib3J0IHdpdGhvdXQgc2V0dGluZyBnX2RvbmUuIFRoaXMgY2hlY2sgbG9va3MgcmVkdW5kYWFudCwKKyAgICAvLyBiZWNhdXNlIHRoZSBuZXh0IGNoZWNrIHdpbGwgd29yayBpbiBhbnkgY2FzZS4KKyAgICBpZiggX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCApIHsKKyAgICAgICAgS0FfVFJBQ0UoIDExLCAoIl9fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5OiBhYm9ydCwgZXhpdGluZ1xuIiApKTsKKyAgICAgICAgLyogVE9ETyBhYm9ydD8gKi8KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiggVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSB8fCAhX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfbGlicmFyeTogYWxyZWFkeSBmaW5pc2hlZFxuIiApKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICAvKiBmaW5kIG91dCB3aG8gd2UgYXJlIGFuZCB3aGF0IHdlIHNob3VsZCBkbyAqLworICAgIHsKKyAgICAgICAgaW50IGd0aWQgPSAoZ3RpZF9yZXE+PTApID8gZ3RpZF9yZXEgOiBfX2ttcF9ndGlkX2dldF9zcGVjaWZpYygpOworICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX2xpYnJhcnk6IGVudGVyIFQjJWQgICglZClcbiIsIGd0aWQsIGd0aWRfcmVxICkpOworICAgICAgICBpZiggZ3RpZCA9PSBLTVBfR1RJRF9TSFVURE9XTiApIHsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfbGlicmFyeTogIV9fa21wX2luaXRfcnVudGltZSwgc3lzdGVtIGFscmVhZHkgc2h1dGRvd25cbiIgKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiggZ3RpZCA9PSBLTVBfR1RJRF9NT05JVE9SICkgeworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5OiBtb25pdG9yIHRocmVhZCwgZ3RpZCBub3QgcmVnaXN0ZXJlZCwgb3Igc3lzdGVtIHNodXRkb3duXG4iICkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYoIGd0aWQgPT0gS01QX0dUSURfRE5FICkgeworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5OiBndGlkIG5vdCByZWdpc3RlcmVkIG9yIHN5c3RlbSBzaHV0ZG93blxuIiApKTsKKyAgICAgICAgICAgIC8qIHdlIGRvbid0IGtub3cgd2hvIHdlIGFyZSwgYnV0IHdlIG1heSBzdGlsbCBzaHV0ZG93biB0aGUgbGlicmFyeSAqLworICAgICAgICB9IGVsc2UgaWYoIEtNUF9VQkVSX0dUSUQoIGd0aWQgKSkgeworICAgICAgICAgICAgLyogdW5yZWdpc3RlciBvdXJzZWx2ZXMgYXMgYW4gdWJlciB0aHJlYWQuICBndGlkIGlzIG5vIGxvbmdlciB2YWxpZCAqLworICAgICAgICAgICAgaWYoIF9fa21wX3Jvb3RbZ3RpZF0tPnIucl9hY3RpdmUgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCA9IC0xOworICAgICAgICAgICAgICAgIFRDV19TWU5DXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lLCBUUlVFKTsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX2xpYnJhcnk6IHJvb3Qgc3RpbGwgYWN0aXZlLCBhYm9ydCBUIyVkXG4iLCBndGlkICkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5OiB1bnJlZ2lzdGVyaW5nIHNpYmxpbmcgVCMlZFxuIiwgZ3RpZCApKTsKKyAgICAgICAgICAgICAgICBfX2ttcF91bnJlZ2lzdGVyX3Jvb3RfY3VycmVudF90aHJlYWQoIGd0aWQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIHdvcmtlciB0aHJlYWRzIG1heSBjYWxsIHRoaXMgZnVuY3Rpb24gdGhyb3VnaCB0aGUgYXRleGl0IGhhbmRsZXIsIGlmIHRoZXkgY2FsbCBleGl0KCkgKi8KKyAgICAgICAgICAgIC8qIEZvciBub3csIHNraXAgdGhlIHVzdWFsIHN1YnNlcXVlbnQgcHJvY2Vzc2luZyBhbmQganVzdCBkdW1wIHRoZSBkZWJ1ZyBidWZmZXIuCisgICAgICAgICAgICAgICBUT0RPOiBkbyBhIHRob3JvdWdoIHNodXRkb3duIGluc3RlYWQKKyAgICAgICAgICAgICovCisgICAgICAgICAgICAjaWZkZWYgRFVNUF9ERUJVR19PTl9FWElUCisgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9kZWJ1Z19idWYgKQorICAgICAgICAgICAgICAgICAgICBfX2ttcF9kdW1wX2RlYnVnX2J1ZmZlciggKTsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIC8qIHN5bmNocm9uaXplIHRoZSB0ZXJtaW5hdGlvbiBwcm9jZXNzICovCisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKKworICAgIC8qIGhhdmUgd2UgYWxyZWFkeSBmaW5pc2hlZCAqLworICAgIGlmKCBfX2ttcF9nbG9iYWwuZy5nX2Fib3J0ICkgeworICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX2xpYnJhcnk6IGFib3J0LCBleGl0aW5nXG4iICkpOworICAgICAgICAvKiBUT0RPIGFib3J0PyAqLworICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKCBUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpIHx8ICFfX2ttcF9pbml0X3NlcmlhbCApIHsKKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIFdlIG5lZWQgdGhpcyBsb2NrIHRvIGVuZm9yY2UgbXV0ZXggYmV0d2VlbiB0aGlzIHJlYWRpbmcgb2YKKyAgICAgICBfX2ttcF90aHJlYWRzX2NhcGFjaXR5IGFuZCB0aGUgd3JpdGluZyBieSBfX2ttcF9yZWdpc3Rlcl9yb290LgorICAgICAgIEFsdGVybmF0aXZlbHksIHdlIGNhbiB1c2UgYSBjb3VudGVyIG9mIHJvb3RzIHRoYXQgaXMKKyAgICAgICBhdG9taWNhbGx5IHVwZGF0ZWQgYnkgX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWRfcmVnLAorICAgICAgIF9fa21wX2RvX3NlcmlhbF9pbml0aWFsaXplIGFuZCBfX2ttcF9pbnRlcm5hbF9lbmRfKi4KKyAgICAqLworICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7CisKKyAgICAvKiBub3cgd2UgY2FuIHNhZmVseSBjb25kdWN0IHRoZSBhY3R1YWwgdGVybWluYXRpb24gKi8KKyAgICBfX2ttcF9pbnRlcm5hbF9lbmQoKTsKKworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7CisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfbGlicmFyeTogZXhpdFxuIiApICk7CisKKyAgICAjaWZkZWYgRFVNUF9ERUJVR19PTl9FWElUCisgICAgICAgIGlmICggX19rbXBfZGVidWdfYnVmICkKKyAgICAgICAgICAgIF9fa21wX2R1bXBfZGVidWdfYnVmZmVyKCk7CisgICAgI2VuZGlmCisKKyAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgX19rbXBfY2xvc2VfY29uc29sZSgpOworICAgICNlbmRpZgorCisgICAgX19rbXBfZmluaV9hbGxvY2F0b3IoKTsKKworfSAvLyBfX2ttcF9pbnRlcm5hbF9lbmRfbGlicmFyeQorCit2b2lkCitfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkKCBpbnQgZ3RpZF9yZXEgKQoreworICAgIGludCBpOworCisgICAgLyogaWYgd2UgaGF2ZSBhbHJlYWR5IGNsZWFuZWQgdXAsIGRvbid0IHRyeSBhZ2FpbiwgaXQgd291bGRuJ3QgYmUgcHJldHR5ICovCisgICAgLyogdGhpcyBzaG91bGRuJ3QgYmUgYSByYWNlIGNvbmRpdGlvbiBiZWNhdXNlIF9fa21wX2ludGVybmFsX2VuZCgpIGlzIHRoZQorICAgICAqIG9ubHkgcGxhY2UgdG8gY2xlYXIgX19rbXBfc2VyaWFsX2luaXQgKi8KKyAgICAvKiB3ZSdsbCBjaGVjayB0aGlzIGxhdGVyIHRvbywgYWZ0ZXIgd2UgZ2V0IHRoZSBsb2NrICovCisgICAgLy8gMjAwOS0wOS0wNjogV2UgZG8gbm90IHNldCBnX2Fib3J0IHdpdGhvdXQgc2V0dGluZyBnX2RvbmUuIFRoaXMgY2hlY2sgbG9va3MgcmVkdW5kYW50LAorICAgIC8vIGJlY2F1c2UgdGhlIG5leHQgY2hlY2sgd2lsbCB3b3JrIGluIGFueSBjYXNlLgorICAgIGlmKCBfX2ttcF9nbG9iYWwuZy5nX2Fib3J0ICkgeworICAgICAgICBLQV9UUkFDRSggMTEsICgiX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZDogYWJvcnQsIGV4aXRpbmdcbiIgKSk7CisgICAgICAgIC8qIFRPRE8gYWJvcnQ/ICovCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYoIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkgfHwgIV9fa21wX2luaXRfc2VyaWFsICkgeworICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZDogYWxyZWFkeSBmaW5pc2hlZFxuIiApKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgLyogZmluZCBvdXQgd2hvIHdlIGFyZSBhbmQgd2hhdCB3ZSBzaG91bGQgZG8gKi8KKyAgICB7CisgICAgICAgIGludCBndGlkID0gKGd0aWRfcmVxPj0wKSA/IGd0aWRfcmVxIDogX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKTsKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF90aHJlYWQ6IGVudGVyIFQjJWQgICglZClcbiIsIGd0aWQsIGd0aWRfcmVxICkpOworICAgICAgICBpZiggZ3RpZCA9PSBLTVBfR1RJRF9TSFVURE9XTiApIHsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkOiAhX19rbXBfaW5pdF9ydW50aW1lLCBzeXN0ZW0gYWxyZWFkeSBzaHV0ZG93blxuIiApKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmKCBndGlkID09IEtNUF9HVElEX01PTklUT1IgKSB7CisgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZDogbW9uaXRvciB0aHJlYWQsIGd0aWQgbm90IHJlZ2lzdGVyZWQsIG9yIHN5c3RlbSBzaHV0ZG93blxuIiApKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmKCBndGlkID09IEtNUF9HVElEX0RORSApIHsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkOiBndGlkIG5vdCByZWdpc3RlcmVkIG9yIHN5c3RlbSBzaHV0ZG93blxuIiApKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIC8qIHdlIGRvbid0IGtub3cgd2hvIHdlIGFyZSAqLworICAgICAgICB9IGVsc2UgaWYoIEtNUF9VQkVSX0dUSUQoIGd0aWQgKSkgeworICAgICAgICAvKiB1bnJlZ2lzdGVyIG91cnNlbHZlcyBhcyBhbiB1YmVyIHRocmVhZC4gIGd0aWQgaXMgbm8gbG9uZ2VyIHZhbGlkICovCisgICAgICAgICAgICBpZiggX19rbXBfcm9vdFtndGlkXS0+ci5yX2FjdGl2ZSApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9nbG9iYWwuZy5nX2Fib3J0ID0gLTE7CisgICAgICAgICAgICAgICAgVENXX1NZTkNfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUsIFRSVUUpOworICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkOiByb290IHN0aWxsIGFjdGl2ZSwgYWJvcnQgVCMlZFxuIiwgZ3RpZCApKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkOiB1bnJlZ2lzdGVyaW5nIHNpYmxpbmcgVCMlZFxuIiwgZ3RpZCApKTsKKyAgICAgICAgICAgICAgICBfX2ttcF91bnJlZ2lzdGVyX3Jvb3RfY3VycmVudF90aHJlYWQoIGd0aWQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIGp1c3QgYSB3b3JrZXIgdGhyZWFkLCBsZXQncyBsZWF2ZSAqLworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF90aHJlYWQ6IHdvcmtlciB0aHJlYWQgVCMlZFxuIiwgZ3RpZCApKTsKKworICAgICAgICAgICAgaWYgKCBndGlkID49IDAgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfdGFza190ZWFtID0gTlVMTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF90aHJlYWQ6IHdvcmtlciB0aHJlYWQgZG9uZSwgZXhpdGluZyBUIyVkXG4iLCBndGlkICkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgICNpZiBkZWZpbmVkIEtNUF9EWU5BTUlDX0xJQgorICAgIC8vIEFDOiBsZXRzIG5vdCBzaHV0ZG93biB0aGUgTGludXgqIE9TIGR5bmFtaWMgbGlicmFyeSBhdCB0aGUgZXhpdCBvZiB1YmVyIHRocmVhZCwKKyAgICAvLyAgICAgYmVjYXVzZSB3ZSB3aWxsIGJldHRlciBzaHV0ZG93biBsYXRlciBpbiB0aGUgbGlicmFyeSBkZXN0cnVjdG9yLgorICAgIC8vICAgICBUaGUgcmVhc29uIG9mIHRoaXMgY2hhbmdlIGlzIHBlcmZvcm1hbmNlIHByb2JsZW0gd2hlbiBub24tb3Blbm1wIHRocmVhZAorICAgIC8vICAgICBpbiBhIGxvb3AgZm9ya3MgYW5kIGpvaW5zIG1hbnkgb3Blbm1wIHRocmVhZHMuIFdlIGNhbiBzYXZlIGEgbG90IG9mIHRpbWUKKyAgICAvLyAgICAga2VlcGluZyB3b3JrZXIgdGhyZWFkcyBhbGl2ZSB1bnRpbCB0aGUgcHJvZ3JhbSBzaHV0ZG93bi4KKyAgICAvLyBPTTogUmVtb3ZlZCBMaW51eCogT1MgcmVzdHJpY3Rpb24gdG8gZml4IHRoZSBjcmFzaCBvbiBPUyBYKiAoRFBEMjAwMjM5OTY2KSBhbmQKKyAgICAvLyAgICAgV2luZG93cyhEUEQyMDAyODc0NDMpIHRoYXQgb2NjdXJzIHdoZW4gdXNpbmcgY3JpdGljYWwgc2VjdGlvbnMgZnJvbSBmb3JlaWduIHRocmVhZHMuCisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkOiBleGl0aW5nIFQjJWRcbiIsIGd0aWRfcmVxKSApOworICAgICAgICByZXR1cm47CisgICAgI2VuZGlmCisgICAgLyogc3luY2hyb25pemUgdGhlIHRlcm1pbmF0aW9uIHByb2Nlc3MgKi8KKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOworCisgICAgLyogaGF2ZSB3ZSBhbHJlYWR5IGZpbmlzaGVkICovCisgICAgaWYoIF9fa21wX2dsb2JhbC5nLmdfYWJvcnQgKSB7CisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkOiBhYm9ydCwgZXhpdGluZ1xuIiApKTsKKyAgICAgICAgLyogVE9ETyBhYm9ydD8gKi8KKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiggVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSB8fCAhX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBXZSBuZWVkIHRoaXMgbG9jayB0byBlbmZvcmNlIG11dGV4IGJldHdlZW4gdGhpcyByZWFkaW5nIG9mCisgICAgICAgX19rbXBfdGhyZWFkc19jYXBhY2l0eSBhbmQgdGhlIHdyaXRpbmcgYnkgX19rbXBfcmVnaXN0ZXJfcm9vdC4KKyAgICAgICBBbHRlcm5hdGl2ZWx5LCB3ZSBjYW4gdXNlIGEgY291bnRlciBvZiByb290cyB0aGF0IGlzCisgICAgICAgYXRvbWljYWxseSB1cGRhdGVkIGJ5IF9fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkX3JlZywKKyAgICAgICBfX2ttcF9kb19zZXJpYWxfaW5pdGlhbGl6ZSBhbmQgX19rbXBfaW50ZXJuYWxfZW5kXyouCisgICAgKi8KKworICAgIC8qIHNob3VsZCB3ZSBmaW5pc2ggdGhlIHJ1bi10aW1lPyAgYXJlIGFsbCBzaWJsaW5ncyBkb25lPyAqLworICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7CisKKyAgICBmb3IgKCBpID0gMDsgaSA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7ICsrIGkgKSB7CisgICAgICAgIGlmICggS01QX1VCRVJfR1RJRCggaSApICkgeworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF90aHJlYWQ6IHJlbWFpbmluZyBzaWJsaW5nIHRhc2s6IGd0aWQ9PSVkXG4iLCBpICkpOworICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2Zvcmtqb2luX2xvY2sgKTsKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH07CisgICAgfQorCisgICAgLyogbm93IHdlIGNhbiBzYWZlbHkgY29uZHVjdCB0aGUgYWN0dWFsIHRlcm1pbmF0aW9uICovCisKKyAgICBfX2ttcF9pbnRlcm5hbF9lbmQoKTsKKworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7CisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkOiBleGl0IFQjJWRcbiIsIGd0aWRfcmVxICkgKTsKKworICAgICNpZmRlZiBEVU1QX0RFQlVHX09OX0VYSVQKKyAgICAgICAgaWYgKCBfX2ttcF9kZWJ1Z19idWYgKQorICAgICAgICAgICAgX19rbXBfZHVtcF9kZWJ1Z19idWZmZXIoKTsKKyAgICAjZW5kaWYKK30gLy8gX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBMaWJyYXJ5IHJlZ2lzdHJhdGlvbiBzdHVmZi4KKworc3RhdGljIGxvbmcgICBfX2ttcF9yZWdpc3RyYXRpb25fZmxhZyA9IDA7CisgICAgLy8gUmFuZG9tIHZhbHVlIHVzZWQgdG8gaW5kaWNhdGUgbGlicmFyeSBpbml0aWFsaXphdGlvbi4KK3N0YXRpYyBjaGFyICogX19rbXBfcmVnaXN0cmF0aW9uX3N0ciAgPSBOVUxMOworICAgIC8vIFZhbHVlIHRvIGJlIHNhdmVkIGluIGVudiB2YXIgX19LTVBfUkVHSVNURVJFRF9MSUJfPHBpZD4uCisKKworc3RhdGljIGlubGluZQorY2hhciAqCitfX2ttcF9yZWdfc3RhdHVzX25hbWUoKSB7CisgICAgLyoKKyAgICAgICAgT24gUkhFTCAzdTUgaWYgbGlua2VkIHN0YXRpY2FsbHksIGdldHBpZCgpIHJldHVybnMgZGlmZmVyZW50IHZhbHVlcyBpbiBlYWNoIHRocmVhZC4KKyAgICAgICAgSWYgcmVnaXN0cmF0aW9uIGFuZCB1bnJlZ2lzdHJhdGlvbiBnbyBpbiBkaWZmZXJlbnQgdGhyZWFkcyAob21wX21pc2Nfb3RoZXJfcm9vdF9leGl0LmNwcCB0ZXN0IGNhc2UpLAorICAgICAgICB0aGUgbmFtZSBvZiByZWdpc3RlcmVkX2xpYl9lbnYgZW52IHZhciBjYW4gbm90IGJlIGZvdW5kLCBiZWNhdXNlIHRoZSBuYW1lIHdpbGwgY29udGFpbiBkaWZmZXJlbnQgcGlkLgorICAgICovCisgICAgcmV0dXJuIF9fa21wX3N0cl9mb3JtYXQoICJfX0tNUF9SRUdJU1RFUkVEX0xJQl8lZCIsIChpbnQpIGdldHBpZCgpICk7Cit9IC8vIF9fa21wX3JlZ19zdGF0dXNfZ2V0CisKKwordm9pZAorX19rbXBfcmVnaXN0ZXJfbGlicmFyeV9zdGFydHVwKAorICAgIHZvaWQKKykgeworCisgICAgY2hhciAqIG5hbWUgICA9IF9fa21wX3JlZ19zdGF0dXNfbmFtZSgpOyAgLy8gTmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUuCisgICAgaW50ICAgIGRvbmUgICA9IDA7CisgICAgdW5pb24geworICAgICAgICBkb3VibGUgZHRpbWU7CisgICAgICAgIGxvbmcgICBsdGltZTsKKyAgICB9IHRpbWU7CisgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIF9fa21wX2luaXRpYWxpemVfc3lzdGVtX3RpY2soKTsKKyAgICAjZW5kaWYKKyAgICBfX2ttcF9yZWFkX3N5c3RlbV90aW1lKCAmIHRpbWUuZHRpbWUgKTsKKyAgICBfX2ttcF9yZWdpc3RyYXRpb25fZmxhZyA9IDB4Q0FGRTAwMDBMIHwgKCB0aW1lLmx0aW1lICYgMHgwMDAwRkZGRkwgKTsKKyAgICBfX2ttcF9yZWdpc3RyYXRpb25fc3RyID0KKyAgICAgICAgX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICIlcC0lbHgtJXMiLAorICAgICAgICAgICAgJiBfX2ttcF9yZWdpc3RyYXRpb25fZmxhZywKKyAgICAgICAgICAgIF9fa21wX3JlZ2lzdHJhdGlvbl9mbGFnLAorICAgICAgICAgICAgS01QX0xJQlJBUllfRklMRQorICAgICAgICApOworCisgICAgS0FfVFJBQ0UoIDUwLCAoICJfX2ttcF9yZWdpc3Rlcl9saWJyYXJ5X3N0YXJ0dXA6ICVzPVwiJXNcIlxuIiwgbmFtZSwgX19rbXBfcmVnaXN0cmF0aW9uX3N0ciApICk7CisKKyAgICB3aGlsZSAoICEgZG9uZSApIHsKKworICAgICAgICBjaGFyICogdmFsdWUgID0gTlVMTDsgLy8gQWN0dWFsIHZhbHVlIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKworICAgICAgICAvLyBTZXQgZW52aXJvbm1lbnQgdmFyaWFibGUsIGJ1dCBkbyBub3Qgb3ZlcndyaXRlIGlmIGl0IGlzIGV4aXN0LgorICAgICAgICBfX2ttcF9lbnZfc2V0KCBuYW1lLCBfX2ttcF9yZWdpc3RyYXRpb25fc3RyLCAwICk7CisgICAgICAgIC8vIENoZWNrIHRoZSB2YXJpYWJsZSBpcyB3cml0dGVuLgorICAgICAgICB2YWx1ZSA9IF9fa21wX2Vudl9nZXQoIG5hbWUgKTsKKyAgICAgICAgaWYgKCB2YWx1ZSAhPSBOVUxMICYmIHN0cmNtcCggdmFsdWUsIF9fa21wX3JlZ2lzdHJhdGlvbl9zdHIgKSA9PSAwICkgeworCisgICAgICAgICAgICBkb25lID0gMTsgICAgLy8gT2ssIGVudmlyb25tZW50IHZhcmlhYmxlIHNldCBzdWNjZXNzZnVsbHksIGV4aXQgdGhlIGxvb3AuCisKKyAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgLy8gT29wcy4gV3JpdGUgZmFpbGVkLiBBbm90aGVyIGNvcHkgb2YgT3Blbk1QIFJUTCBpcyBpbiBtZW1vcnkuCisgICAgICAgICAgICAvLyBDaGVjayB3aGV0aGVyIGl0IGFsaXZlIG9yIGRlYWQuCisgICAgICAgICAgICBpbnQgICAgbmVpZ2hib3IgPSAwOyAvLyAwIC0tIHVua25vd24gc3RhdHVzLCAxIC0tIGFsaXZlLCAyIC0tIGRlYWQuCisgICAgICAgICAgICBjaGFyICogdGFpbCAgICAgICAgICA9IHZhbHVlOworICAgICAgICAgICAgY2hhciAqIGZsYWdfYWRkcl9zdHIgPSBOVUxMOworICAgICAgICAgICAgY2hhciAqIGZsYWdfdmFsX3N0ciAgPSBOVUxMOworICAgICAgICAgICAgY2hhciBjb25zdCAqIGZpbGVfbmFtZSAgICAgPSBOVUxMOworICAgICAgICAgICAgX19rbXBfc3RyX3NwbGl0KCB0YWlsLCAnLScsICYgZmxhZ19hZGRyX3N0ciwgJiB0YWlsICk7CisgICAgICAgICAgICBfX2ttcF9zdHJfc3BsaXQoIHRhaWwsICctJywgJiBmbGFnX3ZhbF9zdHIsICAmIHRhaWwgKTsKKyAgICAgICAgICAgIGZpbGVfbmFtZSA9IHRhaWw7CisgICAgICAgICAgICBpZiAoIHRhaWwgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBsb25nICogZmxhZ19hZGRyID0gMDsKKyAgICAgICAgICAgICAgICBsb25nICAgZmxhZ192YWwgID0gMDsKKyAgICAgICAgICAgICAgICBLTVBfU1NDQU5GKCBmbGFnX2FkZHJfc3RyLCAiJXAiLCAgJiBmbGFnX2FkZHIgKTsKKyAgICAgICAgICAgICAgICBLTVBfU1NDQU5GKCBmbGFnX3ZhbF9zdHIsICAiJWx4IiwgJiBmbGFnX3ZhbCAgKTsKKyAgICAgICAgICAgICAgICBpZiAoIGZsYWdfYWRkciAhPSAwICYmIGZsYWdfdmFsICE9IDAgJiYgc3RyY21wKCBmaWxlX25hbWUsICIiICkgIT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRmlyc3QsIGNoZWNrIHdoZXRoZXIgZW52aXJvbm1lbnQtZW5jb2RlZCBhZGRyZXNzIGlzIG1hcHBlZCBpbnRvIGFkZHIgc3BhY2UuCisgICAgICAgICAgICAgICAgICAgIC8vIElmIHNvLCBkZXJlZmVyZW5jZSBpdCB0byBzZWUgaWYgaXQgc3RpbGwgaGFzIHRoZSByaWdodCB2YWx1ZS4KKworICAgICAgICAgICAgICAgICAgICBpZiAoIF9fa21wX2lzX2FkZHJlc3NfbWFwcGVkKCBmbGFnX2FkZHIgKSAmJiAqIGZsYWdfYWRkciA9PSBmbGFnX3ZhbCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5laWdoYm9yID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIG5vdCwgdGhlbiB3ZSBrbm93IHRoZSBvdGhlciBjb3B5IG9mIHRoZSBsaWJyYXJ5IGlzIG5vIGxvbmdlciBydW5uaW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgbmVpZ2hib3IgPSAyOworICAgICAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgc3dpdGNoICggbmVpZ2hib3IgKSB7CisgICAgICAgICAgICAgICAgY2FzZSAwIDogICAgICAvLyBDYW5ub3QgcGFyc2UgZW52aXJvbm1lbnQgdmFyaWFibGUgLS0gbmVpZ2hib3Igc3RhdHVzIHVua25vd24uCisgICAgICAgICAgICAgICAgICAgIC8vIEFzc3VtZSBpdCBpcyB0aGUgaW5jb21wYXRpYmxlIGZvcm1hdCBvZiBmdXR1cmUgdmVyc2lvbiBvZiB0aGUgbGlicmFyeS4KKyAgICAgICAgICAgICAgICAgICAgLy8gQXNzdW1lIHRoZSBvdGhlciBsaWJyYXJ5IGlzIGFsaXZlLgorICAgICAgICAgICAgICAgICAgICAvLyBXQVJOKCAuLi4gKTsgLy8gVE9ETzogSXNzdWUgYSB3YXJuaW5nLgorICAgICAgICAgICAgICAgICAgICBmaWxlX25hbWUgPSAidW5rbm93biBsaWJyYXJ5IjsKKyAgICAgICAgICAgICAgICAgICAgLy8gQXR0ZW50aW9uISBGYWxsaW5nIHRvIHRoZSBuZXh0IGNhc2UuIFRoYXQncyBpbnRlbnRpb25hbC4KKyAgICAgICAgICAgICAgICBjYXNlIDEgOiB7ICAgIC8vIE5laWdoYm9yIGlzIGFsaXZlLgorICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpdCBpcyBhbGxvd2VkLgorICAgICAgICAgICAgICAgICAgICBjaGFyICogZHVwbGljYXRlX29rID0gX19rbXBfZW52X2dldCggIktNUF9EVVBMSUNBVEVfTElCX09LIiApOworICAgICAgICAgICAgICAgICAgICBpZiAoICEgX19rbXBfc3RyX21hdGNoX3RydWUoIGR1cGxpY2F0ZV9vayApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhhdCdzIG5vdCBhbGxvd2VkLiBJc3N1ZSBmYXRhbCBlcnJvci4KKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX01TRyggRHVwbGljYXRlTGlicmFyeSwgS01QX0xJQlJBUllfRklMRSwgZmlsZV9uYW1lICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0hOVCggRHVwbGljYXRlTGlicmFyeSApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSggZHVwbGljYXRlX29rICk7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2R1cGxpY2F0ZV9saWJyYXJ5X29rID0gMTsKKyAgICAgICAgICAgICAgICAgICAgZG9uZSA9IDE7ICAgIC8vIEV4aXQgdGhlIGxvb3AuCisgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDIgOiB7ICAgIC8vIE5laWdoYm9yIGlzIGRlYWQuCisgICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIHRoZSB2YXJpYWJsZSBhbmQgdHJ5IHRvIHJlZ2lzdGVyIGxpYnJhcnkgYWdhaW4uCisgICAgICAgICAgICAgICAgICAgIF9fa21wX2Vudl91bnNldCggbmFtZSApOworICAgICAgICAgICAgICAgIH0gIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQgOiB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIDAgKTsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgfTsgLy8gc3dpdGNoCisKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopIHZhbHVlICk7CisKKyAgICB9OyAvLyB3aGlsZQorICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSBuYW1lICk7CisKK30gLy8gZnVuYyBfX2ttcF9yZWdpc3Rlcl9saWJyYXJ5X3N0YXJ0dXAKKworCit2b2lkCitfX2ttcF91bnJlZ2lzdGVyX2xpYnJhcnkoIHZvaWQgKSB7CisKKyAgICBjaGFyICogbmFtZSAgPSBfX2ttcF9yZWdfc3RhdHVzX25hbWUoKTsKKyAgICBjaGFyICogdmFsdWUgPSBfX2ttcF9lbnZfZ2V0KCBuYW1lICk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9yZWdpc3RyYXRpb25fZmxhZyAhPSAwICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfcmVnaXN0cmF0aW9uX3N0ciAgIT0gTlVMTCApOworICAgIGlmICggdmFsdWUgIT0gTlVMTCAmJiBzdHJjbXAoIHZhbHVlLCBfX2ttcF9yZWdpc3RyYXRpb25fc3RyICkgPT0gMCApIHsKKyAgICAgICAgLy8gT2ssIHRoaXMgaXMgb3VyIHZhcmlhYmxlLiBEZWxldGUgaXQuCisgICAgICAgIF9fa21wX2Vudl91bnNldCggbmFtZSApOworICAgIH07IC8vIGlmCisKKyAgICBLTVBfSU5URVJOQUxfRlJFRSggX19rbXBfcmVnaXN0cmF0aW9uX3N0ciApOworICAgIEtNUF9JTlRFUk5BTF9GUkVFKCB2YWx1ZSApOworICAgIEtNUF9JTlRFUk5BTF9GUkVFKCBuYW1lICk7CisKKyAgICBfX2ttcF9yZWdpc3RyYXRpb25fZmxhZyA9IDA7CisgICAgX19rbXBfcmVnaXN0cmF0aW9uX3N0ciAgPSBOVUxMOworCit9IC8vIF9fa21wX3VucmVnaXN0ZXJfbGlicmFyeQorCisKKy8vIEVuZCBvZiBMaWJyYXJ5IHJlZ2lzdHJhdGlvbiBzdHVmZi4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmIEtNUF9BUkNIX1g4Nl82NCAmJiAoS01QX09TX0xJTlVYIHx8IEtNUF9PU19XSU5ET1dTKQorCitzdGF0aWMgdm9pZCBfX2ttcF9jaGVja19taWNfdHlwZSgpCit7CisgICAga21wX2NwdWlkX3QgY3B1aWRfc3RhdGUgPSB7MH07CisgICAga21wX2NwdWlkX3QgKiBjc19wID0gJmNwdWlkX3N0YXRlOworICAgIF9fa21wX3g4Nl9jcHVpZCgxLCAwLCBjc19wKTsKKyAgICAvLyBXZSBkb24ndCBzdXBwb3J0IG1pYzEgYXQgdGhlIG1vbWVudAorICAgIGlmKCAoY3NfcC0+ZWF4ICYgMHhmZjApID09IDB4QjEwICkgeworICAgICAgICBfX2ttcF9taWNfdHlwZSA9IG1pYzI7CisgICAgfSBlbHNlIGlmKCAoY3NfcC0+ZWF4ICYgMHhmMGZmMCkgPT0gMHg1MDY3MCApIHsKKyAgICAgICAgX19rbXBfbWljX3R5cGUgPSBtaWMzOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX21pY190eXBlID0gbm9uX21pYzsKKyAgICB9Cit9CisKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODZfNjQgJiYgKEtNUF9PU19MSU5VWCB8fCBLTVBfT1NfV0lORE9XUykgKi8KKworc3RhdGljIHZvaWQKK19fa21wX2RvX3NlcmlhbF9pbml0aWFsaXplKCB2b2lkICkKK3sKKyAgICBpbnQgaSwgZ3RpZDsKKyAgICBpbnQgc2l6ZTsKKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9kb19zZXJpYWxfaW5pdGlhbGl6ZTogZW50ZXJcbiIgKSApOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggc2l6ZW9mKCBrbXBfaW50MzIgKSA9PSA0ICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggc2l6ZW9mKCBrbXBfdWludDMyICkgPT0gNCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHNpemVvZigga21wX2ludDY0ICkgPT0gOCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHNpemVvZigga21wX3VpbnQ2NCApID09IDggKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzaXplb2YoIGttcF9pbnRwdHJfdCApID09IHNpemVvZiggdm9pZCAqICkgKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIG9tcHRfcHJlX2luaXQoKTsKKyNlbmRpZgorCisgICAgX19rbXBfdmFsaWRhdGVfbG9ja3MoKTsKKworICAgIC8qIEluaXRpYWxpemUgaW50ZXJuYWwgbWVtb3J5IGFsbG9jYXRvciAqLworICAgIF9fa21wX2luaXRfYWxsb2NhdG9yKCk7CisKKyAgICAvKiBSZWdpc3RlciB0aGUgbGlicmFyeSBzdGFydHVwIHZpYSBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZQorICAgICAgIGFuZCBjaGVjayB0byBzZWUgd2hldGhlciBhbm90aGVyIGNvcHkgb2YgdGhlIGxpYnJhcnkgaXMgYWxyZWFkeQorICAgICAgIHJlZ2lzdGVyZWQuICovCisKKyAgICBfX2ttcF9yZWdpc3Rlcl9saWJyYXJ5X3N0YXJ0dXAoICk7CisKKyAgICAvKiBUT0RPIHJlaW5pdGlhbGl6YXRpb24gb2YgbGlicmFyeSAqLworICAgIGlmKCBUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpICkgeworICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9kb19zZXJpYWxfaW5pdGlhbGl6ZTogcmVpbml0aWFsaXphdGlvbiBvZiBsaWJyYXJ5XG4iICkgKTsKKyAgICB9CisKKyAgICBfX2ttcF9nbG9iYWwuZy5nX2Fib3J0ID0gMDsKKyAgICBUQ1dfU1lOQ180KF9fa21wX2dsb2JhbC5nLmdfZG9uZSwgRkFMU0UpOworCisgICAgLyogaW5pdGlhbGl6ZSB0aGUgbG9ja3MgKi8KKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisjaWYgS01QX0RFQlVHX0FEQVBUSVZFX0xPQ0tTCisgICAgX19rbXBfaW5pdF9zcGVjdWxhdGl2ZV9zdGF0cygpOworI2VuZGlmCisjZW5kaWYKKyNpZiBLTVBfU1RBVFNfRU5BQkxFRAorICAgIF9fa21wX2luaXRfdGFzX2xvY2soICYgX19rbXBfc3RhdHNfbG9jayApOworI2VuZGlmCisgICAgX19rbXBfaW5pdF9sb2NrKCAmIF9fa21wX2dsb2JhbF9sb2NrICAgICApOworICAgIF9fa21wX2luaXRfcXVldWluZ19sb2NrKCAmIF9fa21wX2Rpc3BhdGNoX2xvY2sgKTsKKyAgICBfX2ttcF9pbml0X2xvY2soICYgX19rbXBfZGVidWdfbG9jayAgICAgICk7CisgICAgX19rbXBfaW5pdF9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9jayAgICAgKTsKKyAgICBfX2ttcF9pbml0X2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzFpICApOworICAgIF9fa21wX2luaXRfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfMmkgICk7CisgICAgX19rbXBfaW5pdF9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja180aSAgKTsKKyAgICBfX2ttcF9pbml0X2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzRyICApOworICAgIF9fa21wX2luaXRfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfOGkgICk7CisgICAgX19rbXBfaW5pdF9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja184ciAgKTsKKyAgICBfX2ttcF9pbml0X2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzhjICApOworICAgIF9fa21wX2luaXRfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfMTByICk7CisgICAgX19rbXBfaW5pdF9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja18xNnIgKTsKKyAgICBfX2ttcF9pbml0X2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzE2YyApOworICAgIF9fa21wX2luaXRfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfMjBjICk7CisgICAgX19rbXBfaW5pdF9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja18zMmMgKTsKKyAgICBfX2ttcF9pbml0X2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX2Zvcmtqb2luX2xvY2sgICk7CisgICAgX19rbXBfaW5pdF9ib290c3RyYXBfbG9jayggJiBfX2ttcF9leGl0X2xvY2sgICAgICApOworICAgIF9fa21wX2luaXRfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfbW9uaXRvcl9sb2NrICAgKTsKKyAgICBfX2ttcF9pbml0X2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX3RwX2NhY2hlZF9sb2NrICk7CisKKyAgICAvKiBjb25kdWN0IGluaXRpYWxpemF0aW9uIGFuZCBpbml0aWFsIHNldHVwIG9mIGNvbmZpZ3VyYXRpb24gKi8KKworICAgIF9fa21wX3J1bnRpbWVfaW5pdGlhbGl6ZSgpOworCisjaWYgS01QX0FSQ0hfWDg2XzY0ICYmIChLTVBfT1NfTElOVVggfHwgS01QX09TX1dJTkRPV1MpCisgICAgX19rbXBfY2hlY2tfbWljX3R5cGUoKTsKKyNlbmRpZgorCisgICAgLy8gU29tZSBnbG9iYWwgdmFyaWFibGUgaW5pdGlhbGl6YXRpb24gbW92ZWQgaGVyZSBmcm9tIGttcF9lbnZfaW5pdGlhbGl6ZSgpCisjaWZkZWYgS01QX0RFQlVHCisgICAga21wX2RpYWcgPSAwOworI2VuZGlmCisgICAgX19rbXBfYWJvcnRfZGVsYXkgPSAwOworCisgICAgLy8gRnJvbSBfX2ttcF9pbml0X2RmbHRfdGVhbV9udGgoKQorICAgIC8qIGFzc3VtZSB0aGUgZW50aXJlIG1hY2hpbmUgd2lsbCBiZSB1c2VkICovCisgICAgX19rbXBfZGZsdF90ZWFtX250aF91YiA9IF9fa21wX3hwcm9jOworICAgIGlmKCBfX2ttcF9kZmx0X3RlYW1fbnRoX3ViIDwgS01QX01JTl9OVEggKSB7CisgICAgICAgIF9fa21wX2RmbHRfdGVhbV9udGhfdWIgPSBLTVBfTUlOX05USDsKKyAgICB9CisgICAgaWYoIF9fa21wX2RmbHRfdGVhbV9udGhfdWIgPiBfX2ttcF9zeXNfbWF4X250aCApIHsKKyAgICAgICAgX19rbXBfZGZsdF90ZWFtX250aF91YiA9IF9fa21wX3N5c19tYXhfbnRoOworICAgIH0KKyAgICBfX2ttcF9tYXhfbnRoID0gX19rbXBfc3lzX21heF9udGg7CisKKyAgICAvLyBUaHJlZSB2YXJzIGJlbG93IG1vdmVkIGhlcmUgZnJvbSBfX2ttcF9lbnZfaW5pdGlhbGl6ZSgpICJLTVBfQkxPQ0tUSU1FIiBwYXJ0CisgICAgX19rbXBfZGZsdF9ibG9ja3RpbWUgPSBLTVBfREVGQVVMVF9CTE9DS1RJTUU7CisgICAgX19rbXBfbW9uaXRvcl93YWtldXBzID0gS01QX1dBS0VVUFNfRlJPTV9CTE9DS1RJTUUoIF9fa21wX2RmbHRfYmxvY2t0aW1lLCBfX2ttcF9tb25pdG9yX3dha2V1cHMgKTsKKyAgICBfX2ttcF9idF9pbnRlcnZhbHMgPSBLTVBfSU5URVJWQUxTX0ZST01fQkxPQ0tUSU1FKCBfX2ttcF9kZmx0X2Jsb2NrdGltZSwgX19rbXBfbW9uaXRvcl93YWtldXBzICk7CisgICAgLy8gRnJvbSAiS01QX0xJQlJBUlkiIHBhcnQgb2YgX19rbXBfZW52X2luaXRpYWxpemUoKQorICAgIF9fa21wX2xpYnJhcnkgPSBsaWJyYXJ5X3Rocm91Z2hwdXQ7CisgICAgLy8gRnJvbSBLTVBfU0NIRURVTEUgaW5pdGlhbGl6YXRpb24KKyAgICBfX2ttcF9zdGF0aWMgPSBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZDsKKyAgICAvLyBBQzogZG8gbm90IHVzZSBhbmFseXRpY2FsIGhlcmUsIGJlY2F1c2UgaXQgaXMgbm9uLW1vbm90b25vdXMKKyAgICAvL19fa21wX2d1aWRlZCA9IGttcF9zY2hfZ3VpZGVkX2l0ZXJhdGl2ZV9jaHVua2VkOworICAgIC8vX19rbXBfYXV0byA9IGttcF9zY2hfZ3VpZGVkX2FuYWx5dGljYWxfY2h1bmtlZDsgLy8gQUM6IGl0IGlzIHRoZSBkZWZhdWx0LCBubyBuZWVkIHRvIHJlcGVhdGUgYXNzaWdubWVudAorICAgIC8vIEJhcnJpZXIgaW5pdGlhbGl6YXRpb24uIE1vdmVkIGhlcmUgZnJvbSBfX2ttcF9lbnZfaW5pdGlhbGl6ZSgpIEJhcnJpZXIgYnJhbmNoIGJpdCBjb250cm9sIGFuZCBiYXJyaWVyIG1ldGhvZAorICAgIC8vIGNvbnRyb2wgcGFydHMKKyAgICAjaWYgS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgICAgICAgI2RlZmluZSBrbXBfcmVkdWN0aW9uX2JhcnJpZXJfZ2F0aGVyX2JiICgoaW50KTEpCisgICAgICAgICNkZWZpbmUga21wX3JlZHVjdGlvbl9iYXJyaWVyX3JlbGVhc2VfYmIgKChpbnQpMSkKKyAgICAgICAgI2RlZmluZSBrbXBfcmVkdWN0aW9uX2JhcnJpZXJfZ2F0aGVyX3BhdCBicF9oeXBlcl9iYXIKKyAgICAgICAgI2RlZmluZSBrbXBfcmVkdWN0aW9uX2JhcnJpZXJfcmVsZWFzZV9wYXQgYnBfaHlwZXJfYmFyCisgICAgI2VuZGlmIC8vIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgZm9yICggaT1ic19wbGFpbl9iYXJyaWVyOyBpPGJzX2xhc3RfYmFycmllcjsgaSsrICkgeworICAgICAgICBfX2ttcF9iYXJyaWVyX2dhdGhlcl9icmFuY2hfYml0cyBbIGkgXSA9IF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JiX2RmbHQ7CisgICAgICAgIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0c1sgaSBdID0gX19rbXBfYmFycmllcl9yZWxlYXNlX2JiX2RmbHQ7CisgICAgICAgIF9fa21wX2JhcnJpZXJfZ2F0aGVyX3BhdHRlcm4gWyBpIF0gPSBfX2ttcF9iYXJyaWVyX2dhdGhlcl9wYXRfZGZsdDsKKyAgICAgICAgX19rbXBfYmFycmllcl9yZWxlYXNlX3BhdHRlcm5bIGkgXSA9IF9fa21wX2JhcnJpZXJfcmVsZWFzZV9wYXRfZGZsdDsKKyAgICAgICAgI2lmIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgICAgIGlmKCBpID09IGJzX3JlZHVjdGlvbl9iYXJyaWVyICkgeyAvLyB0ZXN0ZWQgYW5kIGNvbmZpcm1lZCBvbiBBTFRJWCBvbmx5ICggbGluXzY0ICk6IGh5cGVyLDEKKyAgICAgICAgICAgIF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JyYW5jaF9iaXRzIFsgaSBdID0ga21wX3JlZHVjdGlvbl9iYXJyaWVyX2dhdGhlcl9iYjsKKyAgICAgICAgICAgIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0c1sgaSBdID0ga21wX3JlZHVjdGlvbl9iYXJyaWVyX3JlbGVhc2VfYmI7CisgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX2dhdGhlcl9wYXR0ZXJuIFsgaSBdID0ga21wX3JlZHVjdGlvbl9iYXJyaWVyX2dhdGhlcl9wYXQ7CisgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfcGF0dGVyblsgaSBdID0ga21wX3JlZHVjdGlvbl9iYXJyaWVyX3JlbGVhc2VfcGF0OworICAgICAgICB9CisgICAgICAgICNlbmRpZiAvLyBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICAgIH0KKyAgICAjaWYgS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgICAgICAgI3VuZGVmIGttcF9yZWR1Y3Rpb25fYmFycmllcl9yZWxlYXNlX3BhdAorICAgICAgICAjdW5kZWYga21wX3JlZHVjdGlvbl9iYXJyaWVyX2dhdGhlcl9wYXQKKyAgICAgICAgI3VuZGVmIGttcF9yZWR1Y3Rpb25fYmFycmllcl9yZWxlYXNlX2JiCisgICAgICAgICN1bmRlZiBrbXBfcmVkdWN0aW9uX2JhcnJpZXJfZ2F0aGVyX2JiCisgICAgI2VuZGlmIC8vIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisjaWYgS01QX0FSQ0hfWDg2XzY0ICYmIChLTVBfT1NfTElOVVggfHwgS01QX09TX1dJTkRPV1MpCisgICAgaWYgKF9fa21wX21pY190eXBlID09IG1pYzIpIHsgLy8gS05DCisgICAgICAgIC8vIEFDOiBwbGFuZT0zLDIsIGZvcmtqb2luPTIsMSBhcmUgb3B0aW1hbCBmb3IgMjQwIHRocmVhZHMgb24gS05DCisgICAgICAgIF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JyYW5jaF9iaXRzIFsgYnNfcGxhaW5fYmFycmllciBdID0gMzsgIC8vIHBsYWluIGdhdGhlcgorICAgICAgICBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHNbIGJzX2Zvcmtqb2luX2JhcnJpZXIgXSA9IDE7ICAvLyBmb3Jram9pbiByZWxlYXNlCisgICAgICAgIF9fa21wX2JhcnJpZXJfZ2F0aGVyX3BhdHRlcm4gWyBic19mb3Jram9pbl9iYXJyaWVyIF0gPSBicF9oaWVyYXJjaGljYWxfYmFyOworICAgICAgICBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfcGF0dGVyblsgYnNfZm9ya2pvaW5fYmFycmllciBdID0gYnBfaGllcmFyY2hpY2FsX2JhcjsKKyAgICB9CisjaWYgS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgICBpZiAoX19rbXBfbWljX3R5cGUgPT0gbWljMikgeyAvLyBLTkMKKyAgICAgICAgX19rbXBfYmFycmllcl9nYXRoZXJfcGF0dGVybiBbIGJzX3JlZHVjdGlvbl9iYXJyaWVyIF0gPSBicF9oaWVyYXJjaGljYWxfYmFyOworICAgICAgICBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfcGF0dGVyblsgYnNfcmVkdWN0aW9uX2JhcnJpZXIgXSA9IGJwX2hpZXJhcmNoaWNhbF9iYXI7CisgICAgfQorI2VuZGlmCisjZW5kaWYKKworICAgIC8vIEZyb20gS01QX0NIRUNLUyBpbml0aWFsaXphdGlvbgorI2lmZGVmIEtNUF9ERUJVRworICAgIF9fa21wX2Vudl9jaGVja3MgPSBUUlVFOyAgIC8qIGRldmVsb3BtZW50IHZlcnNpb25zIGhhdmUgdGhlIGV4dHJhIGNoZWNrcyAqLworI2Vsc2UKKyAgICBfX2ttcF9lbnZfY2hlY2tzID0gRkFMU0U7ICAvKiBwb3J0IHZlcnNpb25zIGRvIG5vdCBoYXZlIHRoZSBleHRyYSBjaGVja3MgKi8KKyNlbmRpZgorCisgICAgLy8gRnJvbSAiS01QX0ZPUkVJR05fVEhSRUFEU19USFJFQURQUklWQVRFIiBpbml0aWFsaXphdGlvbgorICAgIF9fa21wX2ZvcmVpZ25fdHAgPSBUUlVFOworCisgICAgX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljID0gRkFMU0U7CisgICAgX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljX21vZGUgPSBkeW5hbWljX2RlZmF1bHQ7CisKKyAgICBfX2ttcF9lbnZfaW5pdGlhbGl6ZSggTlVMTCApOworCisgICAgLy8gUHJpbnQgYWxsIG1lc3NhZ2VzIGluIG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGVzdGluZyBwdXJwb3Nlcy4KKyAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgIGNoYXIgY29uc3QgKiB2YWwgPSBfX2ttcF9lbnZfZ2V0KCAiS01QX0RVTVBfQ0FUQUxPRyIgKTsKKyAgICAgICAgaWYgKCBfX2ttcF9zdHJfbWF0Y2hfdHJ1ZSggdmFsICkgKSB7CisgICAgICAgICAgICBrbXBfc3RyX2J1Zl90IGJ1ZmZlcjsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfaW5pdCggJiBidWZmZXIgKTsKKyAgICAgICAgICAgIF9fa21wX2kxOG5fZHVtcF9jYXRhbG9nKCAmIGJ1ZmZlciApOworICAgICAgICAgICAgX19rbXBfcHJpbnRmKCAiJXMiLCBidWZmZXIuc3RyICk7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoICYgYnVmZmVyICk7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIF9fa21wX2Vudl9mcmVlKCAmIHZhbCApOworICAgICNlbmRpZgorCisgICAgX19rbXBfdGhyZWFkc19jYXBhY2l0eSA9IF9fa21wX2luaXRpYWxfdGhyZWFkc19jYXBhY2l0eSggX19rbXBfZGZsdF90ZWFtX250aF91YiApOworICAgIC8vIE1vdmVkIGhlcmUgZnJvbSBfX2ttcF9lbnZfaW5pdGlhbGl6ZSgpICJLTVBfQUxMX1RIUkVBRFBSSVZBVEUiIHBhcnQKKyAgICBfX2ttcF90cF9jYXBhY2l0eSA9IF9fa21wX2RlZmF1bHRfdHBfY2FwYWNpdHkoX19rbXBfZGZsdF90ZWFtX250aF91YiwgX19rbXBfbWF4X250aCwgX19rbXBfYWxsVGhyZWFkc1NwZWNpZmllZCk7CisKKyAgICAvLyBJZiB0aGUgbGlicmFyeSBpcyBzaHV0IGRvd24gcHJvcGVybHksIGJvdGggcG9vbHMgbXVzdCBiZSBOVUxMLiBKdXN0IGluIGNhc2UsIHNldCB0aGVtCisgICAgLy8gdG8gTlVMTCAtLSBzb21lIG1lbW9yeSBtYXkgbGVhaywgYnV0IHN1YnNlcXVlbnQgY29kZSB3aWxsIHdvcmsgZXZlbiBpZiBwb29scyBhcmUgbm90IGZyZWVkLgorICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3RocmVhZF9wb29sID09IE5VTEwgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90aHJlYWRfcG9vbF9pbnNlcnRfcHQgPT0gTlVMTCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3RlYW1fcG9vbCAgID09IE5VTEwgKTsKKyAgICBfX2ttcF90aHJlYWRfcG9vbCA9IE5VTEw7CisgICAgX19rbXBfdGhyZWFkX3Bvb2xfaW5zZXJ0X3B0ID0gTlVMTDsKKyAgICBfX2ttcF90ZWFtX3Bvb2wgICA9IE5VTEw7CisKKyAgICAvKiBBbGxvY2F0ZSBhbGwgb2YgdGhlIHZhcmlhYmxlIHNpemVkIHJlY29yZHMgKi8KKyAgICAvKiBOT1RFOiBfX2ttcF90aHJlYWRzX2NhcGFjaXR5IGVudHJpZXMgYXJlIGFsbG9jYXRlZCwgYnV0IHRoZSBhcnJheXMgYXJlIGV4cGFuZGFibGUgKi8KKyAgICAvKiBTaW5jZSBhbGxvY2F0aW9uIGlzIGNhY2hlLWFsaWduZWQsIGp1c3QgYWRkIGV4dHJhIHBhZGRpbmcgYXQgdGhlIGVuZCAqLworICAgIHNpemUgPSAoc2l6ZW9mKGttcF9pbmZvX3QqKSArIHNpemVvZihrbXBfcm9vdF90KikpKl9fa21wX3RocmVhZHNfY2FwYWNpdHkgKyBDQUNIRV9MSU5FOworICAgIF9fa21wX3RocmVhZHMgPSAoa21wX2luZm9fdCoqKSBfX2ttcF9hbGxvY2F0ZSggc2l6ZSApOworICAgIF9fa21wX3Jvb3QgICAgPSAoa21wX3Jvb3RfdCoqKSAoKGNoYXIqKV9fa21wX3RocmVhZHMgKyBzaXplb2Yoa21wX2luZm9fdCopICogX19rbXBfdGhyZWFkc19jYXBhY2l0eSApOworCisgICAgLyogaW5pdCB0aHJlYWQgY291bnRzICovCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfYWxsX250aCA9PSAwICk7IC8vIEFzc2VydHMgZmFpbCBpZiB0aGUgbGlicmFyeSBpcyByZWluaXRpYWxpemluZyBhbmQKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9udGggPT0gMCApOyAgICAgLy8gc29tZXRoaW5nIHdhcyB3cm9uZyBpbiB0ZXJtaW5hdGlvbi4KKyAgICBfX2ttcF9hbGxfbnRoID0gMDsKKyAgICBfX2ttcF9udGggICAgID0gMDsKKworICAgIC8qIHNldHVwIHRoZSB1YmVyIG1hc3RlciB0aHJlYWQgYW5kIGhpZXJhcmNoeSAqLworICAgIGd0aWQgPSBfX2ttcF9yZWdpc3Rlcl9yb290KCBUUlVFICk7CisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2RvX3NlcmlhbF9pbml0aWFsaXplICBUIyVkXG4iLCBndGlkICkpOworICAgIEtNUF9BU1NFUlQoIEtNUF9VQkVSX0dUSUQoIGd0aWQgKSApOworICAgIEtNUF9BU1NFUlQoIEtNUF9JTklUSUFMX0dUSUQoIGd0aWQgKSApOworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBfX2ttcF9jb21tb25faW5pdGlhbGl6ZSgpOworCisgICAgI2lmIEtNUF9PU19VTklYCisgICAgICAgIC8qIGludm9rZSB0aGUgY2hpbGQgZm9yayBoYW5kbGVyICovCisgICAgICAgIF9fa21wX3JlZ2lzdGVyX2F0Zm9yaygpOworICAgICNlbmRpZgorCisgICAgI2lmICEgZGVmaW5lZCBLTVBfRFlOQU1JQ19MSUIKKyAgICAgICAgeworICAgICAgICAgICAgLyogSW52b2tlIHRoZSBleGl0IGhhbmRsZXIgd2hlbiB0aGUgcHJvZ3JhbSBmaW5pc2hlcywgb25seSBmb3Igc3RhdGljIGxpYnJhcnkuCisgICAgICAgICAgICAgICBGb3IgZHluYW1pYyBsaWJyYXJ5LCB3ZSBhbHJlYWR5IGhhdmUgX2ZpbmkgYW5kIERsbE1haW4uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGludCByYyA9IGF0ZXhpdCggX19rbXBfaW50ZXJuYWxfZW5kX2F0ZXhpdCApOworICAgICAgICAgICAgaWYgKCByYyAhPSAwICkgeworICAgICAgICAgICAgICAgIF9fa21wX21zZygga21wX21zX2ZhdGFsLCBLTVBfTVNHKCBGdW5jdGlvbkVycm9yLCAiYXRleGl0KCkiICksIEtNUF9FUlIoIHJjICksIF9fa21wX21zZ19udWxsICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9CisgICAgI2VuZGlmCisKKyAgICAjaWYgS01QX0hBTkRMRV9TSUdOQUxTCisgICAgICAgICNpZiBLTVBfT1NfVU5JWAorICAgICAgICAgICAgLyogTk9URTogbWFrZSBzdXJlIHRoYXQgdGhpcyBpcyBjYWxsZWQgYmVmb3JlIHRoZSB1c2VyIGluc3RhbGxzCisgICAgICAgICAgICAgKiAgICAgICAgICB0aGVpciBvd24gc2lnbmFsIGhhbmRsZXJzIHNvIHRoYXQgdGhlIHVzZXIgaGFuZGxlcnMKKyAgICAgICAgICAgICAqICAgICAgICAgIGFyZSBjYWxsZWQgZmlyc3QuICB0aGlzIHdheSB0aGV5IGNhbiByZXR1cm4gZmFsc2UsCisgICAgICAgICAgICAgKiAgICAgICAgICBub3QgY2FsbCBvdXIgaGFuZGxlciwgYXZvaWQgdGVybWluYXRpbmcgdGhlIGxpYnJhcnksCisgICAgICAgICAgICAgKiAgICAgICAgICBhbmQgY29udGludWUgZXhlY3V0aW9uIHdoZXJlIHRoZXkgbGVmdCBvZmYuICovCisgICAgICAgICAgICBfX2ttcF9pbnN0YWxsX3NpZ25hbHMoIEZBTFNFICk7CisgICAgICAgICNlbmRpZiAvKiBLTVBfT1NfVU5JWCAqLworICAgICAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgICAgIF9fa21wX2luc3RhbGxfc2lnbmFscyggVFJVRSApOworICAgICAgICAjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KKyAgICAjZW5kaWYKKworICAgIC8qIHdlIGhhdmUgZmluaXNoZWQgdGhlIHNlcmlhbCBpbml0aWFsaXphdGlvbiAqLworICAgIF9fa21wX2luaXRfY291bnRlciArKzsKKworICAgIF9fa21wX2luaXRfc2VyaWFsID0gVFJVRTsKKworICAgIGlmIChfX2ttcF9zZXR0aW5ncykgeworICAgICAgICBfX2ttcF9lbnZfcHJpbnQoKTsKKyAgICB9CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGlmIChfX2ttcF9kaXNwbGF5X2VudiB8fCBfX2ttcF9kaXNwbGF5X2Vudl92ZXJib3NlKSB7CisgICAgICAgIF9fa21wX2Vudl9wcmludF8yKCk7CisgICAgfQorI2VuZGlmIC8vIE9NUF80MF9FTkFCTEVECisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBvbXB0X3Bvc3RfaW5pdCgpOworI2VuZGlmCisKKyAgICBLTVBfTUIoKTsKKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9kb19zZXJpYWxfaW5pdGlhbGl6ZTogZXhpdFxuIiApICk7Cit9CisKK3ZvaWQKK19fa21wX3NlcmlhbF9pbml0aWFsaXplKCB2b2lkICkKK3sKKyAgICBpZiAoIF9fa21wX2luaXRfc2VyaWFsICkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisgICAgaWYgKCBfX2ttcF9pbml0X3NlcmlhbCApIHsKKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBfX2ttcF9kb19zZXJpYWxfaW5pdGlhbGl6ZSgpOworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9kb19taWRkbGVfaW5pdGlhbGl6ZSggdm9pZCApCit7CisgICAgaW50IGksIGo7CisgICAgaW50IHByZXZfZGZsdF90ZWFtX250aDsKKworICAgIGlmKCAhX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgIF9fa21wX2RvX3NlcmlhbF9pbml0aWFsaXplKCk7CisgICAgfQorCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX21pZGRsZV9pbml0aWFsaXplOiBlbnRlclxuIiApICk7CisKKyAgICAvLworICAgIC8vIFNhdmUgdGhlIHByZXZpb3VzIHZhbHVlIGZvciB0aGUgX19rbXBfZGZsdF90ZWFtX250aCBzbyB0aGF0CisgICAgLy8gd2UgY2FuIGF2b2lkIHNvbWUgcmVpbml0aWFsaXphdGlvbiBpZiBpdCBoYXNuJ3QgY2hhbmdlZC4KKyAgICAvLworICAgIHByZXZfZGZsdF90ZWFtX250aCA9IF9fa21wX2RmbHRfdGVhbV9udGg7CisKKyNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgLy8KKyAgICAvLyBfX2ttcF9hZmZpbml0eV9pbml0aWFsaXplKCkgd2lsbCB0cnkgdG8gc2V0IF9fa21wX25jb3JlcyB0byB0aGUKKyAgICAvLyBudW1iZXIgb2YgY29yZXMgb24gdGhlIG1hY2hpbmUuCisgICAgLy8KKyAgICBfX2ttcF9hZmZpbml0eV9pbml0aWFsaXplKCk7CisKKyAgICAvLworICAgIC8vIFJ1biB0aHJvdWdoIHRoZSBfX2ttcF90aHJlYWRzIGFycmF5IGFuZCBzZXQgdGhlIGFmZmluaXR5IG1hc2sKKyAgICAvLyBmb3IgZWFjaCByb290IHRocmVhZCB0aGF0IGlzIGN1cnJlbnRseSByZWdpc3RlcmVkIHdpdGggdGhlIFJUTC4KKyAgICAvLworICAgIGZvciAoIGkgPSAwOyBpIDwgX19rbXBfdGhyZWFkc19jYXBhY2l0eTsgaSsrICkgeworICAgICAgICBpZiAoIFRDUl9QVFIoIF9fa21wX3RocmVhZHNbIGkgXSApICE9IE5VTEwgKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9zZXRfaW5pdF9tYXNrKCBpLCBUUlVFICk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogS01QX0FGRklOSVRZX1NVUFBPUlRFRCAqLworCisgICAgS01QX0FTU0VSVCggX19rbXBfeHByb2MgPiAwICk7CisgICAgaWYgKCBfX2ttcF9hdmFpbF9wcm9jID09IDAgKSB7CisgICAgICAgIF9fa21wX2F2YWlsX3Byb2MgPSBfX2ttcF94cHJvYzsKKyAgICB9CisKKyAgICAvLyBJZiB0aGVyZSB3ZXJlIGVtcHR5IHBsYWNlcyBpbiBudW1fdGhyZWFkcyBsaXN0IChPTVBfTlVNX1RIUkVBRFM9LCwyLDMpLCBjb3JyZWN0IHRoZW0gbm93CisgICAgaiA9IDA7CisgICAgd2hpbGUgKCAoIGogPCBfX2ttcF9uZXN0ZWRfbnRoLnVzZWQgKSAmJiAhIF9fa21wX25lc3RlZF9udGgubnRoWyBqIF0gKSB7CisgICAgICAgIF9fa21wX25lc3RlZF9udGgubnRoWyBqIF0gPSBfX2ttcF9kZmx0X3RlYW1fbnRoID0gX19rbXBfZGZsdF90ZWFtX250aF91YiA9IF9fa21wX2F2YWlsX3Byb2M7CisgICAgICAgIGorKzsKKyAgICB9CisKKyAgICBpZiAoIF9fa21wX2RmbHRfdGVhbV9udGggPT0gMCApIHsKKyNpZmRlZiBLTVBfREZMVF9OVEhfQ09SRVMKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRGVmYXVsdCAjdGhyZWFkcyA9ICNjb3JlcworICAgICAgICAvLworICAgICAgICBfX2ttcF9kZmx0X3RlYW1fbnRoID0gX19rbXBfbmNvcmVzOworICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfbWlkZGxlX2luaXRpYWxpemU6IHNldHRpbmcgX19rbXBfZGZsdF90ZWFtX250aCA9IF9fa21wX25jb3JlcyAoJWQpXG4iLAorICAgICAgICAgIF9fa21wX2RmbHRfdGVhbV9udGggKSApOworI2Vsc2UKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRGVmYXVsdCAjdGhyZWFkcyA9ICNhdmFpbGFibGUgT1MgcHJvY3MKKyAgICAgICAgLy8KKyAgICAgICAgX19rbXBfZGZsdF90ZWFtX250aCA9IF9fa21wX2F2YWlsX3Byb2M7CisgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9taWRkbGVfaW5pdGlhbGl6ZTogc2V0dGluZyBfX2ttcF9kZmx0X3RlYW1fbnRoID0gX19rbXBfYXZhaWxfcHJvYyglZClcbiIsCisgICAgICAgICAgX19rbXBfZGZsdF90ZWFtX250aCApICk7CisjZW5kaWYgLyogS01QX0RGTFRfTlRIX0NPUkVTICovCisgICAgfQorCisgICAgaWYgKCBfX2ttcF9kZmx0X3RlYW1fbnRoIDwgS01QX01JTl9OVEggKSB7CisgICAgICAgIF9fa21wX2RmbHRfdGVhbV9udGggPSBLTVBfTUlOX05USDsKKyAgICB9CisgICAgaWYoIF9fa21wX2RmbHRfdGVhbV9udGggPiBfX2ttcF9zeXNfbWF4X250aCApIHsKKyAgICAgICAgX19rbXBfZGZsdF90ZWFtX250aCA9IF9fa21wX3N5c19tYXhfbnRoOworICAgIH0KKworICAgIC8vCisgICAgLy8gVGhlcmUncyBubyBoYXJtIGluIGNvbnRpbnVpbmcgaWYgdGhlIGZvbGxvd2luZyBjaGVjayBmYWlscywKKyAgICAvLyBidXQgaXQgaW5kaWNhdGVzIGFuIGVycm9yIGluIHRoZSBwcmV2aW91cyBsb2dpYy4KKyAgICAvLworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2RmbHRfdGVhbV9udGggPD0gX19rbXBfZGZsdF90ZWFtX250aF91YiApOworCisgICAgaWYgKCBfX2ttcF9kZmx0X3RlYW1fbnRoICE9IHByZXZfZGZsdF90ZWFtX250aCApIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gUnVuIHRocm91Z2ggdGhlIF9fa21wX3RocmVhZHMgYXJyYXkgYW5kIHNldCB0aGUgbnVtIHRocmVhZHMgaWN2CisgICAgICAgIC8vIGZvciBlYWNoIHJvb3QgdGhyZWFkIHRoYXQgaXMgY3VycmVudGx5IHJlZ2lzdGVyZWQgd2l0aCB0aGUgUlRMCisgICAgICAgIC8vICh3aGljaCBoYXMgbm90IGFscmVhZHkgZXhwbGljaXRseSBzZXQgaXRzIG50aHJlYWRzLXZhciB3aXRoIGEKKyAgICAgICAgLy8gY2FsbCB0byBvbXBfc2V0X251bV90aHJlYWRzKCkpLgorICAgICAgICAvLworICAgICAgICBmb3IgKCBpID0gMDsgaSA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7IGkrKyApIHsKKyAgICAgICAgICAgIGttcF9pbmZvX3QgKnRocmVhZCA9IF9fa21wX3RocmVhZHNbIGkgXTsKKyAgICAgICAgICAgIGlmICggdGhyZWFkID09IE5VTEwgKSBjb250aW51ZTsKKyAgICAgICAgICAgIGlmICggdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMubnByb2MgIT0gMCApIGNvbnRpbnVlOworCisgICAgICAgICAgICBzZXRfX25wcm9jKCBfX2ttcF90aHJlYWRzWyBpIF0sIF9fa21wX2RmbHRfdGVhbV9udGggKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfbWlkZGxlX2luaXRpYWxpemU6IGZpbmFsIHZhbHVlIGZvciBfX2ttcF9kZmx0X3RlYW1fbnRoID0gJWRcbiIsCisgICAgICBfX2ttcF9kZmx0X3RlYW1fbnRoKSApOworCisjaWZkZWYgS01QX0FESlVTVF9CTE9DS1RJTUUKKyAgICAvKiBBZGp1c3QgYmxvY2t0aW1lIHRvIHplcm8gaWYgbmVjZXNzYXJ5ICovCisgICAgLyogbm93IHRoYXQgX19rbXBfYXZhaWxfcHJvYyBpcyBzZXQgICAgICAqLworICAgIGlmICggIV9fa21wX2Vudl9ibG9ja3RpbWUgJiYgKCBfX2ttcF9hdmFpbF9wcm9jID4gMCApICkgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9hdmFpbF9wcm9jID4gMCApOworICAgICAgICBpZiAoIF9fa21wX250aCA+IF9fa21wX2F2YWlsX3Byb2MgKSB7CisgICAgICAgICAgICBfX2ttcF96ZXJvX2J0ID0gVFJVRTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBLTVBfQURKVVNUX0JMT0NLVElNRSAqLworCisgICAgLyogd2UgaGF2ZSBmaW5pc2hlZCBtaWRkbGUgaW5pdGlhbGl6YXRpb24gKi8KKyAgICBUQ1dfU1lOQ180KF9fa21wX2luaXRfbWlkZGxlLCBUUlVFKTsKKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9kb19taWRkbGVfaW5pdGlhbGl6ZTogZXhpdFxuIiApICk7Cit9CisKK3ZvaWQKK19fa21wX21pZGRsZV9pbml0aWFsaXplKCB2b2lkICkKK3sKKyAgICBpZiAoIF9fa21wX2luaXRfbWlkZGxlICkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisgICAgaWYgKCBfX2ttcF9pbml0X21pZGRsZSApIHsKKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBfX2ttcF9kb19taWRkbGVfaW5pdGlhbGl6ZSgpOworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7Cit9CisKK3ZvaWQKK19fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoIHZvaWQgKQoreworICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOyAgICAgIC8vIHRoaXMgbWlnaHQgYmUgYSBuZXcgcm9vdAorCisgICAgLyogc3luY2hyb25pemUgcGFyYWxsZWwgaW5pdGlhbGl6YXRpb24gKGZvciBzaWJsaW5nKSAqLworICAgIGlmKCBUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSApIHJldHVybjsKKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOworICAgIGlmKCBUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSApIHsgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsgcmV0dXJuOyB9CisKKyAgICAvKiBUT0RPIHJlaW5pdGlhbGl6YXRpb24gYWZ0ZXIgd2UgaGF2ZSBhbHJlYWR5IHNodXQgZG93biAqLworICAgIGlmKCBUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpICkgeworICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZTogYXR0ZW1wdCB0byBpbml0IHdoaWxlIHNodXR0aW5nIGRvd25cbiIgKSApOworICAgICAgICBfX2ttcF9pbmZpbml0ZV9sb29wKCk7CisgICAgfQorCisgICAgLyogamM6IFRoZSBsb2NrIF9fa21wX2luaXR6X2xvY2sgaXMgYWxyZWFkeSBoZWxkLCBzbyBjYWxsaW5nIF9fa21wX3NlcmlhbF9pbml0aWFsaXplCisgICAgICAgICAgIHdvdWxkIGNhdXNlIGEgZGVhZGxvY2suICBTbyB3ZSBjYWxsIF9fa21wX2RvX3NlcmlhbF9pbml0aWFsaXplIGRpcmVjdGx5LgorICAgICovCisgICAgaWYoICFfX2ttcF9pbml0X21pZGRsZSApIHsKKyAgICAgICAgX19rbXBfZG9fbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICB9CisKKyAgICAvKiBiZWdpbiBpbml0aWFsaXphdGlvbiAqLworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplOiBlbnRlclxuIiApICk7CisgICAgS01QX0FTU0VSVCggS01QX1VCRVJfR1RJRCggZ3RpZCApICk7CisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisgICAgLy8KKyAgICAvLyBTYXZlIHRoZSBGUCBjb250cm9sIHJlZ3MuCisgICAgLy8gV29ya2VyIHRocmVhZHMgd2lsbCBzZXQgdGhlaXJzIHRvIHRoZXNlIHZhbHVlcyBhdCB0aHJlYWQgc3RhcnR1cC4KKyAgICAvLworICAgIF9fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkKCAmX19rbXBfaW5pdF94ODdfZnB1X2NvbnRyb2xfd29yZCApOworICAgIF9fa21wX3N0b3JlX214Y3NyKCAmX19rbXBfaW5pdF9teGNzciApOworICAgIF9fa21wX2luaXRfbXhjc3IgJj0gS01QX1g4Nl9NWENTUl9NQVNLOworI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworI2lmIEtNUF9PU19VTklYCisjIGlmIEtNUF9IQU5ETEVfU0lHTkFMUworICAgIC8qICBtdXN0IGJlIGFmdGVyIF9fa21wX3NlcmlhbF9pbml0aWFsaXplICAqLworICAgIF9fa21wX2luc3RhbGxfc2lnbmFscyggVFJVRSApOworIyBlbmRpZgorI2VuZGlmCisKKyAgICBfX2ttcF9zdXNwZW5kX2luaXRpYWxpemUoKTsKKworIyAgaWYgZGVmaW5lZChVU0VfTE9BRF9CQUxBTkNFKQorICAgIGlmICggX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljX21vZGUgPT0gZHluYW1pY19kZWZhdWx0ICkgeworICAgICAgICBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWNfbW9kZSA9IGR5bmFtaWNfbG9hZF9iYWxhbmNlOworICAgIH0KKyNlbHNlCisgICAgaWYgKCBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWNfbW9kZSA9PSBkeW5hbWljX2RlZmF1bHQgKSB7CisgICAgICAgIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pY19tb2RlID0gZHluYW1pY190aHJlYWRfbGltaXQ7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoIF9fa21wX3ZlcnNpb24gKSB7CisgICAgICAgIF9fa21wX3ByaW50X3ZlcnNpb25fMigpOworICAgIH0KKworICAgIC8qIHdlIGhhdmUgZmluaXNoZWQgcGFyYWxsZWwgaW5pdGlhbGl6YXRpb24gKi8KKyAgICBUQ1dfU1lOQ180KF9fa21wX2luaXRfcGFyYWxsZWwsIFRSVUUpOworCisgICAgS01QX01CKCk7CisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3BhcmFsbGVsX2luaXRpYWxpemU6IGV4aXRcbiIgKSApOworCisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZAorX19rbXBfcnVuX2JlZm9yZV9pbnZva2VkX3Rhc2soIGludCBndGlkLCBpbnQgdGlkLCBrbXBfaW5mb190ICp0aGlzX3RociwKKyAga21wX3RlYW1fdCAqdGVhbSApCit7CisgICAga21wX2Rpc3BfdCAqZGlzcGF0Y2g7CisKKyAgICBLTVBfTUIoKTsKKworICAgIC8qIG5vbmUgb2YgdGhlIHRocmVhZHMgaGF2ZSBlbmNvdW50ZXJlZCBhbnkgY29uc3RydWN0cywgeWV0LiAqLworICAgIHRoaXNfdGhyLT50aC50aF9sb2NhbC50aGlzX2NvbnN0cnVjdCA9IDA7CisjaWYgS01QX0NBQ0hFX01BTkFHRQorICAgIEtNUF9DQUNIRV9QUkVGRVRDSCggJnRoaXNfdGhyLT50aC50aF9iYXJbIGJzX2Zvcmtqb2luX2JhcnJpZXIgXS5iYi5iX2Fycml2ZWQgKTsKKyNlbmRpZiAvKiBLTVBfQ0FDSEVfTUFOQUdFICovCisgICAgZGlzcGF0Y2ggPSAoa21wX2Rpc3BfdCAqKVRDUl9QVFIodGhpc190aHItPnRoLnRoX2Rpc3BhdGNoKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBkaXNwYXRjaCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0tPnQudF9kaXNwYXRjaCApOworICAgIC8vS01QX0RFQlVHX0FTU0VSVCggdGhpc190aHItPnRoLnRoX2Rpc3BhdGNoID09ICZ0ZWFtLT50LnRfZGlzcGF0Y2hbIHRoaXNfdGhyLT50aC50aF9pbmZvLmRzLmRzX3RpZCBdICk7CisKKyAgICBkaXNwYXRjaC0+dGhfZGlzcF9pbmRleCA9IDA7ICAgIC8qIHJlc2V0IHRoZSBkaXNwYXRjaCBidWZmZXIgY291bnRlciAqLworCisgICAgaWYoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApCisgICAgICAgIF9fa21wX3B1c2hfcGFyYWxsZWwoIGd0aWQsIHRlYW0tPnQudF9pZGVudCApOworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCit9CisKK3ZvaWQKK19fa21wX3J1bl9hZnRlcl9pbnZva2VkX3Rhc2soIGludCBndGlkLCBpbnQgdGlkLCBrbXBfaW5mb190ICp0aGlzX3RociwKKyAga21wX3RlYW1fdCAqdGVhbSApCit7CisgICAgaWYoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApCisgICAgICAgIF9fa21wX3BvcF9wYXJhbGxlbCggZ3RpZCwgdGVhbS0+dC50X2lkZW50ICk7Cit9CisKK2ludAorX19rbXBfaW52b2tlX3Rhc2tfZnVuYyggaW50IGd0aWQgKQoreworICAgIGludCAgICAgICAgICByYzsKKyAgICBpbnQgICAgICAgICAgdGlkICAgICAgPSBfX2ttcF90aWRfZnJvbV9ndGlkKCBndGlkICk7CisgICAga21wX2luZm9fdCAgKnRoaXNfdGhyID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIGttcF90ZWFtX3QgICp0ZWFtICAgICA9IHRoaXNfdGhyLT50aC50aF90ZWFtOworCisgICAgX19rbXBfcnVuX2JlZm9yZV9pbnZva2VkX3Rhc2soIGd0aWQsIHRpZCwgdGhpc190aHIsIHRlYW0gKTsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgaWYgKCBfX2l0dF9zdGFja19jYWxsZXJfY3JlYXRlX3B0ciApIHsKKyAgICAgICAgX19rbXBfaXR0X3N0YWNrX2NhbGxlZV9lbnRlciggKF9faXR0X2NhbGxlcil0ZWFtLT50LnRfc3RhY2tfaWQgKTsgLy8gaW5mb3JtIGl0dG5vdGlmeSBhYm91dCBlbnRlcmluZyB1c2VyJ3MgY29kZQorICAgIH0KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisjaWYgSU5DTFVERV9TU0NfTUFSS1MKKyAgICBTU0NfTUFSS19JTlZPS0lORygpOworI2VuZGlmCisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICB2b2lkICpkdW1teTsKKyAgICB2b2lkICoqZXhpdF9ydW50aW1lX3A7CisgICAgb21wdF90YXNrX2lkX3QgbXlfdGFza19pZDsKKyAgICBvbXB0X3BhcmFsbGVsX2lkX3QgbXlfcGFyYWxsZWxfaWQ7CisKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIGV4aXRfcnVudGltZV9wID0gJih0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLgorICAgICAgICAgICAgb21wdF90YXNrX2luZm8uZnJhbWUuZXhpdF9ydW50aW1lX2ZyYW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgICBleGl0X3J1bnRpbWVfcCA9ICZkdW1teTsKKyAgICB9CisKKyNpZiBPTVBUX1RSQUNFCisgICAgbXlfdGFza19pZCA9IHRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0ub21wdF90YXNrX2luZm8udGFza19pZDsKKyAgICBteV9wYXJhbGxlbF9pZCA9IHRlYW0tPnQub21wdF90ZWFtX2luZm8ucGFyYWxsZWxfaWQ7CisgICAgaWYgKG9tcHRfZW5hYmxlZCAmJgorICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbikpIHsKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW4pKAorICAgICAgICAgICAgbXlfcGFyYWxsZWxfaWQsIG15X3Rhc2tfaWQpOworICAgIH0KKyNlbmRpZgorI2VuZGlmCisKKyAgICB7CisgICAgICAgIEtNUF9USU1FX0JMT0NLKE9NUF93b3JrKTsKKyAgICAgICAgcmMgPSBfX2ttcF9pbnZva2VfbWljcm90YXNrKCAobWljcm90YXNrX3QpIFRDUl9TWU5DX1BUUih0ZWFtLT50LnRfcGtmbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGlkLCAoaW50KSB0ZWFtLT50LnRfYXJnYywgKHZvaWQgKiopIHRlYW0tPnQudF9hcmd2CisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBleGl0X3J1bnRpbWVfcAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICB9CisKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRQorICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZCkpIHsKKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZCkoCisgICAgICAgICAgICAgICAgbXlfcGFyYWxsZWxfaWQsIG15X3Rhc2tfaWQpOworICAgICAgICB9CisgICAgICAgIC8vIHRoZSBpbXBsaWNpdCB0YXNrIGlzIG5vdCBkZWFkIHlldCwgc28gd2UgY2FuJ3QgY2xlYXIgaXRzIHRhc2sgaWQgaGVyZQorICAgICAgICB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLm9tcHRfdGFza19pbmZvLmZyYW1lLmV4aXRfcnVudGltZV9mcmFtZSA9IDA7CisgICAgfQorI2VuZGlmCisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgaWYgKCBfX2l0dF9zdGFja19jYWxsZXJfY3JlYXRlX3B0ciApIHsKKyAgICAgICAgX19rbXBfaXR0X3N0YWNrX2NhbGxlZV9sZWF2ZSggKF9faXR0X2NhbGxlcil0ZWFtLT50LnRfc3RhY2tfaWQgKTsgLy8gaW5mb3JtIGl0dG5vdGlmeSBhYm91dCBsZWF2aW5nIHVzZXIncyBjb2RlCisgICAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICBfX2ttcF9ydW5fYWZ0ZXJfaW52b2tlZF90YXNrKCBndGlkLCB0aWQsIHRoaXNfdGhyLCB0ZWFtICk7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKyNpZiBPTVBfNDBfRU5BQkxFRAordm9pZAorX19rbXBfdGVhbXNfbWFzdGVyKCBpbnQgZ3RpZCApCit7CisgICAgLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSBhbGwgbWFzdGVyIHRocmVhZHMgaW4gdGVhbXMgY29uc3RydWN0CisgICAga21wX2luZm9fdCAqdGhyID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIGttcF90ZWFtX3QgKnRlYW0gPSB0aHItPnRoLnRoX3RlYW07CisgICAgaWRlbnRfdCAgICAgKmxvYyA9ICB0ZWFtLT50LnRfaWRlbnQ7CisgICAgdGhyLT50aC50aF9zZXRfbnByb2MgPSB0aHItPnRoLnRoX3RlYW1zX3NpemUubnRoOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoci0+dGgudGhfdGVhbXNfbWljcm90YXNrICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhyLT50aC50aF9zZXRfbnByb2MgKTsKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfdGVhbXNfbWFzdGVyOiBUIyVkLCBUaWQgJWQsIG1pY3JvdGFzayAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICBndGlkLCBfX2ttcF90aWRfZnJvbV9ndGlkKCBndGlkICksIHRoci0+dGgudGhfdGVhbXNfbWljcm90YXNrICkgKTsKKyAgICAvLyBMYXVuY2ggbGVhZ3VlIG9mIHRlYW1zIG5vdywgYnV0IG5vdCBsZXQgd29ya2VycyBleGVjdXRlCisgICAgLy8gKHRoZXkgaGFuZyBvbiBmb3JrIGJhcnJpZXIgdW50aWwgbmV4dCBwYXJhbGxlbCkKKyNpZiBJTkNMVURFX1NTQ19NQVJLUworICAgIFNTQ19NQVJLX0ZPUktJTkcoKTsKKyNlbmRpZgorICAgIF9fa21wX2ZvcmtfY2FsbCggbG9jLCBndGlkLCBmb3JrX2NvbnRleHRfaW50ZWwsCisgICAgICAgICAgICB0ZWFtLT50LnRfYXJnYywKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgICh2b2lkICopdGhyLT50aC50aF90ZWFtc19taWNyb3Rhc2ssICAgICAgLy8gInVud3JhcHBlZCIgdGFzaworI2VuZGlmCisgICAgICAgICAgICAobWljcm90YXNrX3QpdGhyLT50aC50aF90ZWFtc19taWNyb3Rhc2ssIC8vICJ3cmFwcGVkIiB0YXNrCisgICAgICAgICAgICBWT0xBVElMRV9DQVNUKGxhdW5jaF90KSBfX2ttcF9pbnZva2VfdGFza19mdW5jLAorICAgICAgICAgICAgTlVMTCApOworI2lmIElOQ0xVREVfU1NDX01BUktTCisgICAgU1NDX01BUktfSk9JTklORygpOworI2VuZGlmCisgICAgCisgICAgLy8gQUM6IGxhc3QgcGFyYW1ldGVyICIxIiBlbGltaW5hdGVzIGpvaW4gYmFycmllciB3aGljaCB3b24ndCB3b3JrIGJlY2F1c2UKKyAgICAvLyB3b3JrZXIgdGhyZWFkcyBhcmUgaW4gYSBmb3JrIGJhcnJpZXIgd2FpdGluZyBmb3IgbW9yZSBwYXJhbGxlbCByZWdpb25zCisgICAgX19rbXBfam9pbl9jYWxsKCBsb2MsIGd0aWQKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgLCBmb3JrX2NvbnRleHRfaW50ZWwKKyNlbmRpZgorICAgICAgICAsIDEgKTsgCit9CisKK2ludAorX19rbXBfaW52b2tlX3RlYW1zX21hc3RlciggaW50IGd0aWQgKQoreworICAgIGttcF9pbmZvX3QgICp0aGlzX3RociA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICBrbXBfdGVhbV90ICAqdGVhbSAgICAgPSB0aGlzX3Roci0+dGgudGhfdGVhbTsKKyAgICAjaWYgS01QX0RFQlVHCisgICAgaWYgKCAhX19rbXBfdGhyZWFkc1tndGlkXS0+IHRoLnRoX3RlYW0tPnQudF9zZXJpYWxpemVkICkKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggKHZvaWQqKV9fa21wX3RocmVhZHNbZ3RpZF0tPiB0aC50aF90ZWFtLT50LnRfcGtmbiA9PSAodm9pZCopX19rbXBfdGVhbXNfbWFzdGVyICk7CisgICAgI2VuZGlmCisgICAgX19rbXBfcnVuX2JlZm9yZV9pbnZva2VkX3Rhc2soIGd0aWQsIDAsIHRoaXNfdGhyLCB0ZWFtICk7CisgICAgX19rbXBfdGVhbXNfbWFzdGVyKCBndGlkICk7CisgICAgX19rbXBfcnVuX2FmdGVyX2ludm9rZWRfdGFzayggZ3RpZCwgMCwgdGhpc190aHIsIHRlYW0gKTsKKyAgICByZXR1cm4gMTsKK30KKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisvKiB0aGlzIHNldHMgdGhlIHJlcXVlc3RlZCBudW1iZXIgb2YgdGhyZWFkcyBmb3IgdGhlIG5leHQgcGFyYWxsZWwgcmVnaW9uCisgKiBlbmNvdW50ZXJlZCBieSB0aGlzIHRlYW0gKi8KKy8qIHNpbmNlIHRoaXMgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBmb3Jram9pbiBjcml0aWNhbCBzZWN0aW9uIGl0CisgKiBzaG91bGQgYXZvaWQgcmFjZSBjb25kaXRpb25zIHdpdGggYXNzeW1tZXRyaWNhbCBuZXN0ZWQgcGFyYWxsZWxpc20gKi8KKwordm9pZAorX19rbXBfcHVzaF9udW1fdGhyZWFkcyggaWRlbnRfdCAqaWQsIGludCBndGlkLCBpbnQgbnVtX3RocmVhZHMgKQoreworICAgIGttcF9pbmZvX3QgKnRociA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisKKyAgICBpZiggbnVtX3RocmVhZHMgPiAwICkKKyAgICAgICAgdGhyLT50aC50aF9zZXRfbnByb2MgPSBudW1fdGhyZWFkczsKK30KKworI2lmIE9NUF80MF9FTkFCTEVECisKKy8qIHRoaXMgc2V0cyB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiB0ZWFtcyBmb3IgdGhlIHRlYW1zIHJlZ2lvbiBhbmQvb3IKKyAqIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBmb3IgdGhlIG5leHQgcGFyYWxsZWwgcmVnaW9uIGVuY291bnRlcmVkICAqLwordm9pZAorX19rbXBfcHVzaF9udW1fdGVhbXMoIGlkZW50X3QgKmlkLCBpbnQgZ3RpZCwgaW50IG51bV90ZWFtcywgaW50IG51bV90aHJlYWRzICkKK3sKKyAgICBrbXBfaW5mb190ICp0aHIgPSBfX2ttcF90aHJlYWRzW2d0aWRdOworICAgIEtNUF9ERUJVR19BU1NFUlQobnVtX3RlYW1zID49IDApOworICAgIEtNUF9ERUJVR19BU1NFUlQobnVtX3RocmVhZHMgPj0gMCk7CisKKyAgICBpZiggbnVtX3RlYW1zID09IDAgKQorICAgICAgICBudW1fdGVhbXMgPSAxOyAgICAvLyBkZWZhdWx0IG51bWJlciBvZiB0ZWFtcyBpcyAxLgorICAgIGlmKCBudW1fdGVhbXMgPiBfX2ttcF9tYXhfbnRoICkgeyAvLyBpZiB0b28gbWFueSB0ZWFtcyByZXF1ZXN0ZWQ/CisgICAgICAgIGlmICggIV9fa21wX3Jlc2VydmVfd2FybiApIHsKKyAgICAgICAgICAgIF9fa21wX3Jlc2VydmVfd2FybiA9IDE7CisgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAga21wX21zX3dhcm5pbmcsCisgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudEZvcm1UaHJUZWFtLCBudW1fdGVhbXMsIF9fa21wX21heF9udGggKSwKKyAgICAgICAgICAgICAgICBLTVBfSE5UKCBVbnNldF9BTExfVEhSRUFEUyApLAorICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICApOworICAgICAgICB9CisgICAgICAgIG51bV90ZWFtcyA9IF9fa21wX21heF9udGg7CisgICAgfQorICAgIC8vIFNldCBudW1iZXIgb2YgdGVhbXMgKG51bWJlciBvZiB0aHJlYWRzIGluIHRoZSBvdXRlciAicGFyYWxsZWwiIG9mIHRoZSB0ZWFtcykKKyAgICB0aHItPnRoLnRoX3NldF9ucHJvYyA9IHRoci0+dGgudGhfdGVhbXNfc2l6ZS5udGVhbXMgPSBudW1fdGVhbXM7CisKKyAgICAvLyBSZW1lbWJlciB0aGUgbnVtYmVyIG9mIHRocmVhZHMgZm9yIGlubmVyIHBhcmFsbGVsIHJlZ2lvbnMKKyAgICBpZiggbnVtX3RocmVhZHMgPT0gMCApIHsKKyAgICAgICAgaWYoICFUQ1JfNChfX2ttcF9pbml0X21pZGRsZSkgKQorICAgICAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsgIC8vIGdldCBfX2ttcF9hdmFpbF9wcm9jIGNhbGN1bGF0ZWQKKyAgICAgICAgbnVtX3RocmVhZHMgPSBfX2ttcF9hdmFpbF9wcm9jIC8gbnVtX3RlYW1zOworICAgICAgICBpZiggbnVtX3RlYW1zICogbnVtX3RocmVhZHMgPiBfX2ttcF9tYXhfbnRoICkgeworICAgICAgICAgICAgLy8gYWRqdXN0IG51bV90aHJlYWRzIHcvbyB3YXJuaW5nIGFzIGl0IGlzIG5vdCB1c2VyIHNldHRpbmcKKyAgICAgICAgICAgIG51bV90aHJlYWRzID0gX19rbXBfbWF4X250aCAvIG51bV90ZWFtczsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmKCBudW1fdGVhbXMgKiBudW1fdGhyZWFkcyA+IF9fa21wX21heF9udGggKSB7CisgICAgICAgICAgICBpbnQgbmV3X3RocmVhZHMgPSBfX2ttcF9tYXhfbnRoIC8gbnVtX3RlYW1zOworICAgICAgICAgICAgaWYgKCAhX19rbXBfcmVzZXJ2ZV93YXJuICkgeyAvLyB1c2VyIGFza2VkIGZvciB0b28gbWFueSB0aHJlYWRzCisgICAgICAgICAgICAgICAgX19rbXBfcmVzZXJ2ZV93YXJuID0gMTsgIC8vIHRoYXQgY29uZmxpY3RzIHdpdGggT01QX1RIUkVBRF9MSU1JVAorICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAga21wX21zX3dhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRGb3JtVGhyVGVhbSwgbnVtX3RocmVhZHMsIG5ld190aHJlYWRzICksCisgICAgICAgICAgICAgICAgICAgIEtNUF9ITlQoIFVuc2V0X0FMTF9USFJFQURTICksCisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG51bV90aHJlYWRzID0gbmV3X3RocmVhZHM7CisgICAgICAgIH0KKyAgICB9CisgICAgdGhyLT50aC50aF90ZWFtc19zaXplLm50aCA9IG51bV90aHJlYWRzOworfQorCisKKy8vCisvLyBTZXQgdGhlIHByb2NfYmluZCB2YXIgdG8gdXNlIGluIHRoZSBmb2xsb3dpbmcgcGFyYWxsZWwgcmVnaW9uLgorLy8KK3ZvaWQKK19fa21wX3B1c2hfcHJvY19iaW5kKCBpZGVudF90ICppZCwgaW50IGd0aWQsIGttcF9wcm9jX2JpbmRfdCBwcm9jX2JpbmQgKQoreworICAgIGttcF9pbmZvX3QgKnRociA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgICAgdGhyLT50aC50aF9zZXRfcHJvY19iaW5kID0gcHJvY19iaW5kOworfQorCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworLyogTGF1bmNoIHRoZSB3b3JrZXIgdGhyZWFkcyBpbnRvIHRoZSBtaWNyb3Rhc2suICovCisKK3ZvaWQKK19fa21wX2ludGVybmFsX2ZvcmsoIGlkZW50X3QgKmlkLCBpbnQgZ3RpZCwga21wX3RlYW1fdCAqdGVhbSApCit7CisgICAga21wX2luZm9fdCAqdGhpc190aHIgPSBfX2ttcF90aHJlYWRzW2d0aWRdOworCisjaWZkZWYgS01QX0RFQlVHCisgICAgaW50IGY7CisjZW5kaWYgLyogS01QX0RFQlVHICovCisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhpc190aHItPnRoLnRoX3RlYW0gID09ICB0ZWFtICk7CisgICAgS01QX0FTU0VSVCggICAgICAgS01QX01BU1RFUl9HVElEKGd0aWQpICk7CisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICB0ZWFtLT50LnRfY29uc3RydWN0ID0gMDsgICAgICAgICAgLyogbm8gc2luZ2xlIGRpcmVjdGl2ZXMgc2VlbiB5ZXQgKi8KKyAgICB0ZWFtLT50LnRfb3JkZXJlZC5kdC50X3ZhbHVlID0gMDsgLyogdGhyZWFkIDAgZW50ZXJzIHRoZSBvcmRlcmVkIHNlY3Rpb24gZmlyc3QgKi8KKworICAgIC8qIFJlc2V0IHRoZSBpZGVudGlmaWVycyBvbiB0aGUgZGlzcGF0Y2ggYnVmZmVyICovCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbS0+dC50X2Rpc3BfYnVmZmVyICk7CisgICAgaWYgKCB0ZWFtLT50LnRfbWF4X25wcm9jID4gMSApIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAgS01QX01BWF9ESVNQX0JVRjsgKytpKQorICAgICAgICAgICAgdGVhbS0+dC50X2Rpc3BfYnVmZmVyWyBpIF0uYnVmZmVyX2luZGV4ID0gaTsKKyAgICB9IGVsc2UgeworICAgICAgICB0ZWFtLT50LnRfZGlzcF9idWZmZXJbIDAgXS5idWZmZXJfaW5kZXggPSAwOworICAgIH0KKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworICAgIEtNUF9BU1NFUlQoIHRoaXNfdGhyLT50aC50aF90ZWFtICA9PSAgdGVhbSApOworCisjaWZkZWYgS01QX0RFQlVHCisgICAgZm9yKCBmPTAgOyBmPHRlYW0tPnQudF9ucHJvYyA7IGYrKyApIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbS0+dC50X3RocmVhZHNbZl0gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X3RocmVhZHNbZl0tPnRoLnRoX3RlYW1fbnByb2MgPT0gdGVhbS0+dC50X25wcm9jICk7CisgICAgfQorI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworCisgICAgLyogcmVsZWFzZSB0aGUgd29ya2VyIHRocmVhZHMgc28gdGhleSBtYXkgYmVnaW4gd29ya2luZyAqLworICAgIF9fa21wX2ZvcmtfYmFycmllciggZ3RpZCwgMCApOworfQorCisKK3ZvaWQKK19fa21wX2ludGVybmFsX2pvaW4oIGlkZW50X3QgKmlkLCBpbnQgZ3RpZCwga21wX3RlYW1fdCAqdGVhbSApCit7CisgICAga21wX2luZm9fdCAqdGhpc190aHIgPSBfX2ttcF90aHJlYWRzW2d0aWRdOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoaXNfdGhyLT50aC50aF90ZWFtICA9PSAgdGVhbSApOworICAgIEtNUF9BU1NFUlQoICAgICAgIEtNUF9NQVNURVJfR1RJRChndGlkKSApOworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgLyogSm9pbiBiYXJyaWVyIGFmdGVyIGZvcmsgKi8KKworI2lmZGVmIEtNUF9ERUJVRworICAgIGlmIChfX2ttcF90aHJlYWRzW2d0aWRdICYmIF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX3RlYW1fbnByb2MgIT0gdGVhbS0+dC50X25wcm9jICkgeworICAgICAgICBfX2ttcF9wcmludGYoIkdUSUQ6ICVkLCBfX2ttcF90aHJlYWRzWyVkXT0lcFxuIixndGlkLCBndGlkLCBfX2ttcF90aHJlYWRzW2d0aWRdKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCJfX2ttcF90aHJlYWRzWyVkXS0+dGgudGhfdGVhbV9ucHJvYz0lZCwgVEVBTTogJXAsIHRlYW0tPnQudF9ucHJvYz0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIGd0aWQsIF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX3RlYW1fbnByb2MsIHRlYW0sIHRlYW0tPnQudF9ucHJvYyk7CisgICAgICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZSgpOworICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90aHJlYWRzW2d0aWRdICYmCisgICAgICAgICAgICAgICAgICAgICBfX2ttcF90aHJlYWRzW2d0aWRdLT50aC50aF90ZWFtX25wcm9jID09IHRlYW0tPnQudF9ucHJvYyApOworI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworCisgICAgX19rbXBfam9pbl9iYXJyaWVyKCBndGlkICk7ICAvKiB3YWl0IGZvciBldmVyeW9uZSAqLworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisgICAgS01QX0FTU0VSVCggdGhpc190aHItPnRoLnRoX3RlYW0gID09ICB0ZWFtICk7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIFVTRV9MT0FEX0JBTEFOQ0UKKworLy8KKy8vIFJldHVybiB0aGUgd29ya2VyIHRocmVhZHMgYWN0aXZlbHkgc3Bpbm5pbmcgaW4gdGhlIGhvdCB0ZWFtLCBpZiB3ZQorLy8gYXJlIGF0IHRoZSBvdXRlcm1vc3QgbGV2ZWwgb2YgcGFyYWxsZWxpc20uICBPdGhlcndpc2UsIHJldHVybiAwLgorLy8KK3N0YXRpYyBpbnQKK19fa21wX2FjdGl2ZV9ob3RfdGVhbV9ucHJvYygga21wX3Jvb3RfdCAqcm9vdCApCit7CisgICAgaW50IGk7CisgICAgaW50IHJldHZhbDsKKyAgICBrbXBfdGVhbV90ICpob3RfdGVhbTsKKworICAgIGlmICggcm9vdC0+ci5yX2FjdGl2ZSApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGhvdF90ZWFtID0gcm9vdC0+ci5yX2hvdF90ZWFtOworICAgIGlmICggX19rbXBfZGZsdF9ibG9ja3RpbWUgPT0gS01QX01BWF9CTE9DS1RJTUUgKSB7CisgICAgICAgIHJldHVybiBob3RfdGVhbS0+dC50X25wcm9jIC0gMTsgIC8vIERvbid0IGNvdW50IG1hc3RlciB0aHJlYWQKKyAgICB9CisKKyAgICAvLworICAgIC8vIFNraXAgdGhlIG1hc3RlciB0aHJlYWQgLSBpdCBpcyBhY2NvdW50ZWQgZm9yIGVsc2V3aGVyZS4KKyAgICAvLworICAgIHJldHZhbCA9IDA7CisgICAgZm9yICggaSA9IDE7IGkgPCBob3RfdGVhbS0+dC50X25wcm9jOyBpKysgKSB7CisgICAgICAgIGlmICggaG90X3RlYW0tPnQudF90aHJlYWRzW2ldLT50aC50aF9hY3RpdmUgKSB7CisgICAgICAgICAgICByZXR2YWwrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorCisvLworLy8gUGVyZm9ybSBhbiBhdXRvbWF0aWMgYWRqdXN0bWVudCB0byB0aGUgbnVtYmVyIG9mCisvLyB0aHJlYWRzIHVzZWQgYnkgdGhlIG5leHQgcGFyYWxsZWwgcmVnaW9uLgorLy8KK3N0YXRpYyBpbnQKK19fa21wX2xvYWRfYmFsYW5jZV9ucHJvYygga21wX3Jvb3RfdCAqcm9vdCwgaW50IHNldF9ucHJvYyApCit7CisgICAgaW50IHJldHZhbDsKKyAgICBpbnQgcG9vbF9hY3RpdmU7CisgICAgaW50IGhvdF90ZWFtX2FjdGl2ZTsKKyAgICBpbnQgdGVhbV9jdXJyX2FjdGl2ZTsKKyAgICBpbnQgc3lzdGVtX2FjdGl2ZTsKKworICAgIEtCX1RSQUNFKCAyMCwgKCJfX2ttcF9sb2FkX2JhbGFuY2VfbnByb2M6IGNhbGxlZCByb290OiVwIHNldF9ucHJvYzolZFxuIiwKKyAgICAgICAgICAgICAgICByb290LCBzZXRfbnByb2MgKSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHJvb3QgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCByb290LT5yLnJfcm9vdF90ZWFtLT50LnRfdGhyZWFkc1swXS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLmR5bmFtaWMgPT0gVFJVRSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHNldF9ucHJvYyA+IDEgKTsKKworICAgIGlmICggc2V0X25wcm9jID09IDEpIHsKKyAgICAgICAgS0JfVFJBQ0UoIDIwLCAoIl9fa21wX2xvYWRfYmFsYW5jZV9ucHJvYzogc2VyaWFsIGV4ZWN1dGlvbi5cbiIgKSApOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIFRocmVhZHMgdGhhdCBhcmUgYWN0aXZlIGluIHRoZSB0aHJlYWQgcG9vbCwgYWN0aXZlIGluIHRoZSBob3QgdGVhbQorICAgIC8vIGZvciB0aGlzIHBhcnRpY3VsYXIgcm9vdCAoaWYgd2UgYXJlIGF0IHRoZSBvdXRlciBwYXIgbGV2ZWwpLCBhbmQKKyAgICAvLyB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyB0aHJlYWQgKHRvIGJlY29tZSB0aGUgbWFzdGVyKSBhcmUgYXZhaWxhYmxlCisgICAgLy8gdG8gYWRkIHRvIHRoZSBuZXcgdGVhbSwgYnV0IGFyZSBjdXJyZW50bHkgY29udHJpYnV0aW5nIHRvIHRoZSBzeXN0ZW0KKyAgICAvLyBsb2FkLCBhbmQgbXVzdCBiZSBhY2NvdW50ZWQgZm9yLgorICAgIC8vCisgICAgcG9vbF9hY3RpdmUgPSBUQ1JfNChfX2ttcF90aHJlYWRfcG9vbF9hY3RpdmVfbnRoKTsKKyAgICBob3RfdGVhbV9hY3RpdmUgPSBfX2ttcF9hY3RpdmVfaG90X3RlYW1fbnByb2MoIHJvb3QgKTsKKyAgICB0ZWFtX2N1cnJfYWN0aXZlID0gcG9vbF9hY3RpdmUgKyBob3RfdGVhbV9hY3RpdmUgKyAxOworCisgICAgLy8KKyAgICAvLyBDaGVjayB0aGUgc3lzdGVtIGxvYWQuCisgICAgLy8KKyAgICBzeXN0ZW1fYWN0aXZlID0gX19rbXBfZ2V0X2xvYWRfYmFsYW5jZSggX19rbXBfYXZhaWxfcHJvYyArIHRlYW1fY3Vycl9hY3RpdmUgKTsKKyAgICBLQl9UUkFDRSggMzAsICgiX19rbXBfbG9hZF9iYWxhbmNlX25wcm9jOiBzeXN0ZW0gYWN0aXZlID0gJWQgcG9vbCBhY3RpdmUgPSAlZCBob3QgdGVhbSBhY3RpdmUgPSAlZFxuIiwKKyAgICAgIHN5c3RlbV9hY3RpdmUsIHBvb2xfYWN0aXZlLCBob3RfdGVhbV9hY3RpdmUgKSApOworCisgICAgaWYgKCBzeXN0ZW1fYWN0aXZlIDwgMCApIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlcmUgd2FzIGFuIGVycm9yIHJlYWRpbmcgdGhlIG5lY2Vzc2FyeSBpbmZvIGZyb20gL3Byb2MsCisgICAgICAgIC8vIHNvIHVzZSB0aGUgdGhyZWFkIGxpbWl0IGFsZ29yaXRobSBpbnN0ZWFkLiAgT25jZSB3ZSBzZXQKKyAgICAgICAgLy8gX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljX21vZGUgPSBkeW5hbWljX3RocmVhZF9saW1pdCwKKyAgICAgICAgLy8gd2Ugc2hvdWxkbid0IHdpbmQgdXAgZ2V0dGluZyBiYWNrIGhlcmUuCisgICAgICAgIC8vCisgICAgICAgIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pY19tb2RlID0gZHluYW1pY190aHJlYWRfbGltaXQ7CisgICAgICAgIEtNUF9XQVJOSU5HKCBDYW50TG9hZEJhbFVzaW5nLCAiS01QX0RZTkFNSUNfTU9ERT10aHJlYWQgbGltaXQiICk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gTWFrZSB0aGlzIGNhbGwgYmVoYXZlIGxpa2UgdGhlIHRocmVhZCBsaW1pdCBhbGdvcml0aG0uCisgICAgICAgIC8vCisgICAgICAgIHJldHZhbCA9IF9fa21wX2F2YWlsX3Byb2MgLSBfX2ttcF9udGggKyAocm9vdC0+ci5yX2FjdGl2ZSA/IDEKKyAgICAgICAgICA6IHJvb3QtPnIucl9ob3RfdGVhbS0+dC50X25wcm9jKTsKKyAgICAgICAgaWYgKCByZXR2YWwgPiBzZXRfbnByb2MgKSB7CisgICAgICAgICAgICByZXR2YWwgPSBzZXRfbnByb2M7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCByZXR2YWwgPCBLTVBfTUlOX05USCApIHsKKyAgICAgICAgICAgIHJldHZhbCA9IEtNUF9NSU5fTlRIOworICAgICAgICB9CisKKyAgICAgICAgS0JfVFJBQ0UoIDIwLCAoIl9fa21wX2xvYWRfYmFsYW5jZV9ucHJvYzogdGhyZWFkIGxpbWl0IGV4aXQuIHJldHZhbDolZFxuIiwgcmV0dmFsICkgKTsKKyAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICB9CisKKyAgICAvLworICAgIC8vIFRoZXJlIGlzIGEgc2xpZ2h0IGRlbGF5IGluIHRoZSBsb2FkIGJhbGFuY2UgYWxnb3JpdGhtIGluIGRldGVjdGluZworICAgIC8vIG5ldyBydW5uaW5nIHByb2NzLiAgVGhlIHJlYWwgc3lzdGVtIGxvYWQgYXQgdGhpcyBpbnN0YW50IHNob3VsZCBiZQorICAgIC8vIGF0IGxlYXN0IGFzIGxhcmdlIGFzIHRoZSAjYWN0aXZlIG9tcCB0aHJlYWQgdGhhdCBhcmUgYXZhaWxhYmxlIHRvCisgICAgLy8gYWRkIHRvIHRoZSB0ZWFtLgorICAgIC8vCisgICAgaWYgKCBzeXN0ZW1fYWN0aXZlIDwgdGVhbV9jdXJyX2FjdGl2ZSApIHsKKyAgICAgICAgc3lzdGVtX2FjdGl2ZSA9IHRlYW1fY3Vycl9hY3RpdmU7CisgICAgfQorICAgIHJldHZhbCA9IF9fa21wX2F2YWlsX3Byb2MgLSBzeXN0ZW1fYWN0aXZlICsgdGVhbV9jdXJyX2FjdGl2ZTsKKyAgICBpZiAoIHJldHZhbCA+IHNldF9ucHJvYyApIHsKKyAgICAgICAgcmV0dmFsID0gc2V0X25wcm9jOworICAgIH0KKyAgICBpZiAoIHJldHZhbCA8IEtNUF9NSU5fTlRIICkgeworICAgICAgICByZXR2YWwgPSBLTVBfTUlOX05USDsKKyAgICB9CisKKyAgICBLQl9UUkFDRSggMjAsICgiX19rbXBfbG9hZF9iYWxhbmNlX25wcm9jOiBleGl0LiByZXR2YWw6JWRcbiIsIHJldHZhbCApICk7CisgICAgcmV0dXJuIHJldHZhbDsKK30gLy8gX19rbXBfbG9hZF9iYWxhbmNlX25wcm9jKCkKKworI2VuZGlmIC8qIFVTRV9MT0FEX0JBTEFOQ0UgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogTk9URTogdGhpcyBpcyBjYWxsZWQgd2l0aCB0aGUgX19rbXBfaW5pdF9sb2NrIGhlbGQgKi8KK3ZvaWQKK19fa21wX2NsZWFudXAoIHZvaWQgKQoreworICAgIGludCBmOworCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2NsZWFudXA6IGVudGVyXG4iICkgKTsKKworICAgIGlmIChUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSkgeworI2lmIEtNUF9IQU5ETEVfU0lHTkFMUworICAgICAgICBfX2ttcF9yZW1vdmVfc2lnbmFscygpOworI2VuZGlmCisgICAgICAgIFRDV180KF9fa21wX2luaXRfcGFyYWxsZWwsIEZBTFNFKTsKKyAgICB9CisKKyAgICBpZiAoVENSXzQoX19rbXBfaW5pdF9taWRkbGUpKSB7CisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICBfX2ttcF9hZmZpbml0eV91bmluaXRpYWxpemUoKTsKKyNlbmRpZiAvKiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEICovCisgICAgICAgIF9fa21wX2NsZWFudXBfaGllcmFyY2h5KCk7CisgICAgICAgIFRDV180KF9fa21wX2luaXRfbWlkZGxlLCBGQUxTRSk7CisgICAgfQorCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2NsZWFudXA6IGdvIHNlcmlhbCBjbGVhbnVwXG4iICkgKTsKKworICAgIGlmIChfX2ttcF9pbml0X3NlcmlhbCkgeworICAgICAgICBfX2ttcF9ydW50aW1lX2Rlc3Ryb3koKTsKKyAgICAgICAgX19rbXBfaW5pdF9zZXJpYWwgPSBGQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKCBmID0gMDsgZiA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7IGYrKyApIHsKKyAgICAgICAgaWYgKCBfX2ttcF9yb290WyBmIF0gIT0gTlVMTCApIHsKKyAgICAgICAgICAgIF9fa21wX2ZyZWUoIF9fa21wX3Jvb3RbIGYgXSApOworICAgICAgICAgICAgX19rbXBfcm9vdFsgZiBdID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBfX2ttcF9mcmVlKCBfX2ttcF90aHJlYWRzICk7CisgICAgLy8gX19rbXBfdGhyZWFkcyBhbmQgX19rbXBfcm9vdCB3ZXJlIGFsbG9jYXRlZCBhdCBvbmNlLCBhcyBzaW5nbGUgYmxvY2ssIHNvIHRoZXJlIGlzIG5vIG5lZWQgaW4KKyAgICAvLyBmcmVlaW5nIF9fa21wX3Jvb3QuCisgICAgX19rbXBfdGhyZWFkcyA9IE5VTEw7CisgICAgX19rbXBfcm9vdCAgICA9IE5VTEw7CisgICAgX19rbXBfdGhyZWFkc19jYXBhY2l0eSA9IDA7CisKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworICAgIF9fa21wX2NsZWFudXBfaW5kaXJlY3RfdXNlcl9sb2NrcygpOworI2Vsc2UKKyAgICBfX2ttcF9jbGVhbnVwX3VzZXJfbG9ja3MoKTsKKyNlbmRpZgorCisgICAgI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopIF9fa21wX2NwdWluZm9fZmlsZSApOworICAgICAgICBfX2ttcF9jcHVpbmZvX2ZpbGUgPSBOVUxMOworICAgICNlbmRpZiAvKiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEICovCisKKyAgICNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisgICAjaWYgS01QX0RFQlVHX0FEQVBUSVZFX0xPQ0tTCisgICAgICAgX19rbXBfcHJpbnRfc3BlY3VsYXRpdmVfc3RhdHMoKTsKKyAgICNlbmRpZgorICAgI2VuZGlmCisgICAgS01QX0lOVEVSTkFMX0ZSRUUoIF9fa21wX25lc3RlZF9udGgubnRoICk7CisgICAgX19rbXBfbmVzdGVkX250aC5udGggPSBOVUxMOworICAgIF9fa21wX25lc3RlZF9udGguc2l6ZSA9IDA7CisgICAgX19rbXBfbmVzdGVkX250aC51c2VkID0gMDsKKworICAgIF9fa21wX2kxOG5fY2F0Y2xvc2UoKTsKKworI2lmIEtNUF9TVEFUU19FTkFCTEVECisgICAgX19rbXBfYWNjdW11bGF0ZV9zdGF0c19hdF9leGl0KCk7CisgICAgX19rbXBfc3RhdHNfbGlzdC5kZWFsbG9jYXRlKCk7CisjZW5kaWYKKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9jbGVhbnVwOiBleGl0XG4iICkgKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworaW50CitfX2ttcF9pZ25vcmVfbXBwYmVnKCB2b2lkICkKK3sKKyAgICBjaGFyICplbnY7CisKKyAgICBpZiAoKGVudiA9IGdldGVudiggIktNUF9JR05PUkVfTVBQQkVHIiApKSAhPSBOVUxMKSB7CisgICAgICAgIGlmIChfX2ttcF9zdHJfbWF0Y2hfZmFsc2UoIGVudiApKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICAvLyBCeSBkZWZhdWx0IF9fa21wY19iZWdpbigpIGlzIG5vLW9wLgorICAgIHJldHVybiBUUlVFOworfQorCitpbnQKK19fa21wX2lnbm9yZV9tcHBlbmQoIHZvaWQgKQoreworICAgIGNoYXIgKmVudjsKKworICAgIGlmICgoZW52ID0gZ2V0ZW52KCAiS01QX0lHTk9SRV9NUFBFTkQiICkpICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKF9fa21wX3N0cl9tYXRjaF9mYWxzZSggZW52ICkpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIC8vIEJ5IGRlZmF1bHQgX19rbXBjX2VuZCgpIGlzIG5vLW9wLgorICAgIHJldHVybiBUUlVFOworfQorCit2b2lkCitfX2ttcF9pbnRlcm5hbF9iZWdpbiggdm9pZCApCit7CisgICAgaW50IGd0aWQ7CisgICAga21wX3Jvb3RfdCAqcm9vdDsKKworICAgIC8qIHRoaXMgaXMgYSB2ZXJ5IGltcG9ydGFudCBzdGVwIGFzIGl0IHdpbGwgcmVnaXN0ZXIgbmV3IHNpYmxpbmcgdGhyZWFkcworICAgICAqIGFuZCBhc3NpZ24gdGhlc2UgbmV3IHViZXIgdGhyZWFkcyBhIG5ldyBndGlkICovCisgICAgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICByb290ID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF9yb290OworICAgIEtNUF9BU1NFUlQoIEtNUF9VQkVSX0dUSUQoIGd0aWQgKSk7CisKKyAgICBpZiggcm9vdC0+ci5yX2JlZ2luICkgcmV0dXJuOworICAgIF9fa21wX2FjcXVpcmVfbG9jayggJnJvb3QtPnIucl9iZWdpbl9sb2NrLCBndGlkICk7CisgICAgaWYoIHJvb3QtPnIucl9iZWdpbiApIHsKKyAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCAmIHJvb3QtPnIucl9iZWdpbl9sb2NrLCBndGlkICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICByb290LT5yLnJfYmVnaW4gPSBUUlVFOworCisgICAgX19rbXBfcmVsZWFzZV9sb2NrKCAmIHJvb3QtPnIucl9iZWdpbl9sb2NrLCBndGlkICk7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZAorX19rbXBfdXNlcl9zZXRfbGlicmFyeSAoZW51bSBsaWJyYXJ5X3R5cGUgYXJnKQoreworICAgIGludCBndGlkOworICAgIGttcF9yb290X3QgKnJvb3Q7CisgICAga21wX2luZm9fdCAqdGhyZWFkOworCisgICAgLyogZmlyc3QsIG1ha2Ugc3VyZSB3ZSBhcmUgaW5pdGlhbGl6ZWQgc28gd2UgY2FuIGdldCBvdXIgZ3RpZCAqLworCisgICAgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICB0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisKKyAgICByb290ID0gdGhyZWFkLT50aC50aF9yb290OworCisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX3VzZXJfc2V0X2xpYnJhcnk6IGVudGVyIFQjJWQsIGFyZzogJWQsICVkXG4iLCBndGlkLCBhcmcsIGxpYnJhcnlfc2VyaWFsICkpOworICAgIGlmIChyb290LT5yLnJfaW5fcGFyYWxsZWwpIHsgLyogTXVzdCBiZSBjYWxsZWQgaW4gc2VyaWFsIHNlY3Rpb24gb2YgdG9wLWxldmVsIHRocmVhZCAqLworICAgICAgICBLTVBfV0FSTklORyggU2V0TGlicmFyeUluY29ycmVjdENhbGwgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN3aXRjaCAoIGFyZyApIHsKKyAgICBjYXNlIGxpYnJhcnlfc2VyaWFsIDoKKyAgICAgICAgdGhyZWFkLT50aC50aF9zZXRfbnByb2MgPSAwOworICAgICAgICBzZXRfX25wcm9jKCB0aHJlYWQsIDEgKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBsaWJyYXJ5X3R1cm5hcm91bmQgOgorICAgICAgICB0aHJlYWQtPnRoLnRoX3NldF9ucHJvYyA9IDA7CisgICAgICAgIHNldF9fbnByb2MoIHRocmVhZCwgX19rbXBfZGZsdF90ZWFtX250aCA/IF9fa21wX2RmbHRfdGVhbV9udGggOiBfX2ttcF9kZmx0X3RlYW1fbnRoX3ViICk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgbGlicmFyeV90aHJvdWdocHV0IDoKKyAgICAgICAgdGhyZWFkLT50aC50aF9zZXRfbnByb2MgPSAwOworICAgICAgICBzZXRfX25wcm9jKCB0aHJlYWQsIF9fa21wX2RmbHRfdGVhbV9udGggPyBfX2ttcF9kZmx0X3RlYW1fbnRoIDogX19rbXBfZGZsdF90ZWFtX250aF91YiApOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBLTVBfRkFUQUwoIFVua25vd25MaWJyYXJ5VHlwZSwgYXJnICk7CisgICAgfQorCisgICAgX19rbXBfYXV4X3NldF9saWJyYXJ5ICggYXJnICk7Cit9CisKK3ZvaWQKK19fa21wX2F1eF9zZXRfc3RhY2tzaXplKCBzaXplX3QgYXJnICkKK3sKKyAgICBpZiAoISBfX2ttcF9pbml0X3NlcmlhbCkKKyAgICAgICAgX19rbXBfc2VyaWFsX2luaXRpYWxpemUoKTsKKworI2lmIEtNUF9PU19EQVJXSU4KKyAgICBpZiAoYXJnICYgKDB4MTAwMCAtIDEpKSB7CisgICAgICAgIGFyZyAmPSB+KDB4MTAwMCAtIDEpOworICAgICAgICBpZihhcmcgKyAweDEwMDApIC8qIGNoZWNrIGZvciBvdmVyZmxvdyBpZiB3ZSByb3VuZCB1cCAqLworICAgICAgICAgICAgYXJnICs9IDB4MTAwMDsKKyAgICB9CisjZW5kaWYKKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOworCisgICAgLyogb25seSBjaGFuZ2UgdGhlIGRlZmF1bHQgc3RhY2tzaXplIGJlZm9yZSB0aGUgZmlyc3QgcGFyYWxsZWwgcmVnaW9uICovCisgICAgaWYgKCEgVENSXzQoX19rbXBfaW5pdF9wYXJhbGxlbCkpIHsKKyAgICAgICAgc2l6ZV90IHZhbHVlID0gYXJnOyAgICAgICAvKiBhcmd1bWVudCBpcyBpbiBieXRlcyAqLworCisgICAgICAgIGlmICh2YWx1ZSA8IF9fa21wX3N5c19taW5fc3Rrc2l6ZSApCisgICAgICAgICAgICB2YWx1ZSA9IF9fa21wX3N5c19taW5fc3Rrc2l6ZSA7CisgICAgICAgIGVsc2UgaWYgKHZhbHVlID4gS01QX01BWF9TVEtTSVpFKQorICAgICAgICAgICAgdmFsdWUgPSBLTVBfTUFYX1NUS1NJWkU7CisKKyAgICAgICAgX19rbXBfc3Rrc2l6ZSA9IHZhbHVlOworCisgICAgICAgIF9fa21wX2Vudl9zdGtzaXplID0gVFJVRTsgICAgLyogd2FzIEtNUF9TVEFDS1NJWkUgc3BlY2lmaWVkPyAqLworICAgIH0KKworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7Cit9CisKKy8qIHNldCB0aGUgYmVoYXZpb3VyIG9mIHRoZSBydW50aW1lIGxpYnJhcnkgKi8KKy8qIFRPRE8gdGhpcyBjYW4gY2F1c2Ugc29tZSBvZGQgYmVoYXZpb3VyIHdpdGggc2libGluZyBwYXJhbGxlbGlzbS4uLiAqLwordm9pZAorX19rbXBfYXV4X3NldF9saWJyYXJ5IChlbnVtIGxpYnJhcnlfdHlwZSBhcmcpCit7CisgICAgX19rbXBfbGlicmFyeSA9IGFyZzsKKworICAgIHN3aXRjaCAoIF9fa21wX2xpYnJhcnkgKSB7CisgICAgY2FzZSBsaWJyYXJ5X3NlcmlhbCA6CisgICAgICAgIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oIExpYnJhcnlJc1NlcmlhbCApOworICAgICAgICAgICAgKHZvaWQpIF9fa21wX2NoYW5nZV9saWJyYXJ5KCBUUlVFICk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBsaWJyYXJ5X3R1cm5hcm91bmQgOgorICAgICAgICAodm9pZCkgX19rbXBfY2hhbmdlX2xpYnJhcnkoIFRSVUUgKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBsaWJyYXJ5X3Rocm91Z2hwdXQgOgorICAgICAgICAodm9pZCkgX19rbXBfY2hhbmdlX2xpYnJhcnkoIEZBTFNFICk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIEtNUF9GQVRBTCggVW5rbm93bkxpYnJhcnlUeXBlLCBhcmcgKTsKKyAgICB9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQKK19fa21wX2F1eF9zZXRfYmxvY2t0aW1lIChpbnQgYXJnLCBrbXBfaW5mb190ICp0aHJlYWQsIGludCB0aWQpCit7CisgICAgaW50IGJsb2NrdGltZSA9IGFyZzsgICAgICAgIC8qIGFyZ3VtZW50IGlzIGluIG1pbGxpc2Vjb25kcyAqLworICAgIGludCBidF9pbnRlcnZhbHM7CisgICAgaW50IGJ0X3NldDsKKworICAgIF9fa21wX3NhdmVfaW50ZXJuYWxfY29udHJvbHMoIHRocmVhZCApOworCisgICAgLyogTm9ybWFsaXplIGFuZCBzZXQgYmxvY2t0aW1lIGZvciB0aGUgdGVhbXMgKi8KKyAgICBpZiAoYmxvY2t0aW1lIDwgS01QX01JTl9CTE9DS1RJTUUpCisgICAgICAgIGJsb2NrdGltZSA9IEtNUF9NSU5fQkxPQ0tUSU1FOworICAgIGVsc2UgaWYgKGJsb2NrdGltZSA+IEtNUF9NQVhfQkxPQ0tUSU1FKQorICAgICAgICBibG9ja3RpbWUgPSBLTVBfTUFYX0JMT0NLVElNRTsKKworICAgIHNldF9fYmxvY2t0aW1lX3RlYW0oIHRocmVhZC0+dGgudGhfdGVhbSwgdGlkLCBibG9ja3RpbWUgKTsKKyAgICBzZXRfX2Jsb2NrdGltZV90ZWFtKCB0aHJlYWQtPnRoLnRoX3NlcmlhbF90ZWFtLCAwLCBibG9ja3RpbWUgKTsKKworICAgIC8qIENhbGN1bGF0ZSBhbmQgc2V0IGJsb2NrdGltZSBpbnRlcnZhbHMgZm9yIHRoZSB0ZWFtcyAqLworICAgIGJ0X2ludGVydmFscyA9IEtNUF9JTlRFUlZBTFNfRlJPTV9CTE9DS1RJTUUoYmxvY2t0aW1lLCBfX2ttcF9tb25pdG9yX3dha2V1cHMpOworCisgICAgc2V0X19idF9pbnRlcnZhbHNfdGVhbSggdGhyZWFkLT50aC50aF90ZWFtLCB0aWQsIGJ0X2ludGVydmFscyApOworICAgIHNldF9fYnRfaW50ZXJ2YWxzX3RlYW0oIHRocmVhZC0+dGgudGhfc2VyaWFsX3RlYW0sIDAsIGJ0X2ludGVydmFscyApOworCisgICAgLyogU2V0IHdoZXRoZXIgYmxvY2t0aW1lIGhhcyBiZWVuIHNldCB0byAiVFJVRSIgKi8KKyAgICBidF9zZXQgPSBUUlVFOworCisgICAgc2V0X19idF9zZXRfdGVhbSggdGhyZWFkLT50aC50aF90ZWFtLCB0aWQsIGJ0X3NldCApOworICAgIHNldF9fYnRfc2V0X3RlYW0oIHRocmVhZC0+dGgudGhfc2VyaWFsX3RlYW0sIDAsIGJ0X3NldCApOworICAgIEtGX1RSQUNFKDEwLCAoICJrbXBfc2V0X2Jsb2NrdGltZTogVCMlZCglZDolZCksIGJsb2NrdGltZT0lZCwgYnRfaW50ZXJ2YWxzPSVkLCBtb25pdG9yX3VwZGF0ZXM9JWRcbiIsCisgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGlkKHRpZCwgdGhyZWFkLT50aC50aF90ZWFtKSwKKyAgICAgICAgICAgICAgICAgIHRocmVhZC0+dGgudGhfdGVhbS0+dC50X2lkLCB0aWQsIGJsb2NrdGltZSwgYnRfaW50ZXJ2YWxzLCBfX2ttcF9tb25pdG9yX3dha2V1cHMgKSApOworfQorCit2b2lkCitfX2ttcF9hdXhfc2V0X2RlZmF1bHRzKAorICAgIGNoYXIgY29uc3QgKiBzdHIsCisgICAgaW50ICAgICAgICAgIGxlbgorKSB7CisgICAgaWYgKCAhIF9fa21wX2luaXRfc2VyaWFsICkgeworICAgICAgICBfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZSgpOworICAgIH07CisgICAgX19rbXBfZW52X2luaXRpYWxpemUoIHN0ciApOworCisgICAgaWYgKF9fa21wX3NldHRpbmdzCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgfHwgX19rbXBfZGlzcGxheV9lbnYgfHwgX19rbXBfZGlzcGxheV9lbnZfdmVyYm9zZQorI2VuZGlmIC8vIE9NUF80MF9FTkFCTEVECisgICAgICAgICkgeworICAgICAgICBfX2ttcF9lbnZfcHJpbnQoKTsKKyAgICB9Cit9IC8vIF9fa21wX2F1eF9zZXRfZGVmYXVsdHMKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBpbnRlcm5hbCBmYXN0IHJlZHVjdGlvbiByb3V0aW5lcworICovCisKK1BBQ0tFRF9SRURVQ1RJT05fTUVUSE9EX1QKK19fa21wX2RldGVybWluZV9yZWR1Y3Rpb25fbWV0aG9kKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLAorICAgICAgICBrbXBfaW50MzIgbnVtX3ZhcnMsIHNpemVfdCByZWR1Y2Vfc2l6ZSwgdm9pZCAqcmVkdWNlX2RhdGEsIHZvaWQgKCpyZWR1Y2VfZnVuYykodm9pZCAqbGhzX2RhdGEsIHZvaWQgKnJoc19kYXRhKSwKKyAgICAgICAga21wX2NyaXRpY2FsX25hbWUgKmxjayApCit7CisKKyAgICAvLyBEZWZhdWx0IHJlZHVjdGlvbiBtZXRob2Q6IGNyaXRpY2FsIGNvbnN0cnVjdCAoIGxjayAhPSBOVUxMLCBsaWtlIGluIGN1cnJlbnQgUEFST1BUICkKKyAgICAvLyBJZiAoIHJlZHVjZV9kYXRhIT1OVUxMICYmIHJlZHVjZV9mdW5jIT1OVUxMICk6IHRoZSB0cmVlLXJlZHVjdGlvbiBtZXRob2QgY2FuIGJlIHNlbGVjdGVkIGJ5IFJUTAorICAgIC8vIElmIGxvYy0+ZmxhZ3MgY29udGFpbnMgS01QX0lERU5UX0FUT01JQ19SRURVQ0UsIHRoZSBhdG9taWMgcmVkdWNlIG1ldGhvZCBjYW4gYmUgc2VsZWN0ZWQgYnkgUlRMCisgICAgLy8gRmluYWxseSwgaXQncyB1cCB0byBPcGVuTVAgUlRMIHRvIG1ha2UgYSBkZWNpc2lvbiBvbiB3aGljaCBtZXRob2QgdG8gc2VsZWN0IGFtb25nIGdlbmVyYXRlZCBieSBQQVJPUFQuCisKKyAgICBQQUNLRURfUkVEVUNUSU9OX01FVEhPRF9UIHJldHZhbDsKKworICAgIGludCB0ZWFtX3NpemU7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBsb2MgKTsgICAgLy8gaXQgd291bGQgYmUgbmljZSB0byB0ZXN0ICggbG9jICE9IDAgKQorICAgIEtNUF9ERUJVR19BU1NFUlQoIGxjayApOyAgICAvLyBpdCB3b3VsZCBiZSBuaWNlIHRvIHRlc3QgKCBsY2sgIT0gMCApCisKKyAgICAjZGVmaW5lIEZBU1RfUkVEVUNUSU9OX0FUT01JQ19NRVRIT0RfR0VORVJBVEVEICggKCBsb2MtPmZsYWdzICYgKCBLTVBfSURFTlRfQVRPTUlDX1JFRFVDRSApICkgPT0gKCBLTVBfSURFTlRfQVRPTUlDX1JFRFVDRSApICkKKyAgICAjZGVmaW5lIEZBU1RfUkVEVUNUSU9OX1RSRUVfTUVUSE9EX0dFTkVSQVRFRCAgICggKCByZWR1Y2VfZGF0YSApICYmICggcmVkdWNlX2Z1bmMgKSApCisKKyAgICByZXR2YWwgPSBjcml0aWNhbF9yZWR1Y2VfYmxvY2s7CisKKyAgICB0ZWFtX3NpemUgPSBfX2ttcF9nZXRfdGVhbV9udW1fdGhyZWFkcyggZ2xvYmFsX3RpZCApOyAvLyBhbm90aGVyIGNob2ljZSBvZiBnZXR0aW5nIGEgdGVhbSBzaXplICggd2l0aCAxIGR5bmFtaWMgZGVmZXJlbmNlICkgaXMgc2xvd2VyCisKKyAgICBpZiggdGVhbV9zaXplID09IDEgKSB7CisKKyAgICAgICAgcmV0dmFsID0gZW1wdHlfcmVkdWNlX2Jsb2NrOworCisgICAgfSBlbHNlIHsKKworICAgICAgICBpbnQgYXRvbWljX2F2YWlsYWJsZSA9IEZBU1RfUkVEVUNUSU9OX0FUT01JQ19NRVRIT0RfR0VORVJBVEVEOworICAgICAgICBpbnQgdHJlZV9hdmFpbGFibGUgICA9IEZBU1RfUkVEVUNUSU9OX1RSRUVfTUVUSE9EX0dFTkVSQVRFRDsKKworICAgICAgICAjaWYgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX1BQQzY0IHx8IEtNUF9BUkNIX0FBUkNINjQKKworICAgICAgICAgICAgI2lmIEtNUF9PU19MSU5VWCB8fCBLTVBfT1NfRlJFRUJTRCB8fCBLTVBfT1NfTkVUQlNEIHx8IEtNUF9PU19XSU5ET1dTIHx8IEtNUF9PU19EQVJXSU4KKworCSAgICBpbnQgdGVhbXNpemVfY3V0b2ZmID0gNDsKKworI2lmIEtNUF9BUkNIX1g4Nl82NCAmJiAoS01QX09TX0xJTlVYIHx8IEtNUF9PU19XSU5ET1dTKQorICAgICAgICAgICAgICAgIGlmKCBfX2ttcF9taWNfdHlwZSAhPSBub25fbWljICkgeworICAgICAgICAgICAgICAgICAgICB0ZWFtc2l6ZV9jdXRvZmYgPSA4OworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgIGlmKCB0cmVlX2F2YWlsYWJsZSApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHRlYW1fc2l6ZSA8PSB0ZWFtc2l6ZV9jdXRvZmYgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGF0b21pY19hdmFpbGFibGUgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gYXRvbWljX3JlZHVjZV9ibG9jazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IFRSRUVfUkVEVUNFX0JMT0NLX1dJVEhfUkVEVUNUSU9OX0JBUlJJRVI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBhdG9taWNfYXZhaWxhYmxlICkgeworICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBhdG9taWNfcmVkdWNlX2Jsb2NrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgICAgI2Vycm9yICJVbmtub3duIG9yIHVuc3VwcG9ydGVkIE9TIgorICAgICAgICAgICAgI2VuZGlmIC8vIEtNUF9PU19MSU5VWCB8fCBLTVBfT1NfRlJFRUJTRCB8fCBLTVBfT1NfTkVUQlNEIHx8IEtNUF9PU19XSU5ET1dTIHx8IEtNUF9PU19EQVJXSU4KKworICAgICAgICAjZWxpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNICisKKyAgICAgICAgICAgICNpZiBLTVBfT1NfTElOVVggfHwgS01QX09TX1dJTkRPV1MKKworICAgICAgICAgICAgICAgIC8vIGJhc2ljIHR1bmluZworCisgICAgICAgICAgICAgICAgaWYoIGF0b21pY19hdmFpbGFibGUgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBudW1fdmFycyA8PSAyICkgeyAvLyAmJiAoIHRlYW1fc2l6ZSA8PSA4ICkgZHVlIHRvIGZhbHNlLXNoYXJpbmcgPz8/CisgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBhdG9taWNfcmVkdWNlX2Jsb2NrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSAvLyBvdGhlcndpc2U6IHVzZSBjcml0aWNhbCBzZWN0aW9uCisKKyAgICAgICAgICAgICNlbGlmIEtNUF9PU19EQVJXSU4KKworICAgICAgICAgICAgICAgIGlmKCBhdG9taWNfYXZhaWxhYmxlICYmICggbnVtX3ZhcnMgPD0gMyApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gYXRvbWljX3JlZHVjZV9ibG9jazsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYoIHRyZWVfYXZhaWxhYmxlICkgeworICAgICAgICAgICAgICAgICAgICBpZiggKCByZWR1Y2Vfc2l6ZSA+ICggOSAqIHNpemVvZigga21wX3JlYWw2NCApICkgKSAmJiAoIHJlZHVjZV9zaXplIDwgKCAyMDAwICogc2l6ZW9mKCBrbXBfcmVhbDY0ICkgKSApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gVFJFRV9SRURVQ0VfQkxPQ0tfV0lUSF9QTEFJTl9CQVJSSUVSOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSAvLyBvdGhlcndpc2U6IHVzZSBjcml0aWNhbCBzZWN0aW9uCisKKyAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgICAgI2Vycm9yICJVbmtub3duIG9yIHVuc3VwcG9ydGVkIE9TIgorICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICNlcnJvciAiVW5rbm93biBvciB1bnN1cHBvcnRlZCBhcmNoaXRlY3R1cmUiCisgICAgICAgICNlbmRpZgorCisgICAgfQorCisgICAgLy8gS01QX0ZPUkNFX1JFRFVDVElPTgorCisgICAgLy8gSWYgdGhlIHRlYW0gaXMgc2VyaWFsaXplZCAodGVhbV9zaXplID09IDEpLCBpZ25vcmUgdGhlIGZvcmNlZCByZWR1Y3Rpb24KKyAgICAvLyBtZXRob2QgYW5kIHN0YXkgd2l0aCB0aGUgdW5zeW5jaHJvbml6ZWQgbWV0aG9kIChlbXB0eV9yZWR1Y2VfYmxvY2spCisgICAgaWYoIF9fa21wX2ZvcmNlX3JlZHVjdGlvbl9tZXRob2QgIT0gcmVkdWN0aW9uX21ldGhvZF9ub3RfZGVmaW5lZCAmJiB0ZWFtX3NpemUgIT0gMSkgeworCisgICAgICAgIFBBQ0tFRF9SRURVQ1RJT05fTUVUSE9EX1QgZm9yY2VkX3JldHZhbDsKKworICAgICAgICBpbnQgYXRvbWljX2F2YWlsYWJsZSwgdHJlZV9hdmFpbGFibGU7CisKKyAgICAgICAgc3dpdGNoKCAoIGZvcmNlZF9yZXR2YWwgPSBfX2ttcF9mb3JjZV9yZWR1Y3Rpb25fbWV0aG9kICkgKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIGNyaXRpY2FsX3JlZHVjZV9ibG9jazoKKyAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKCBsY2sgKTsgICAgICAgICAgICAgIC8vIGxjayBzaG91bGQgYmUgIT0gMAorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGF0b21pY19yZWR1Y2VfYmxvY2s6CisgICAgICAgICAgICAgICAgYXRvbWljX2F2YWlsYWJsZSA9IEZBU1RfUkVEVUNUSU9OX0FUT01JQ19NRVRIT0RfR0VORVJBVEVEOworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoIGF0b21pY19hdmFpbGFibGUgKTsgLy8gYXRvbWljX2F2YWlsYWJsZSBzaG91bGQgYmUgIT0gMAorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIHRyZWVfcmVkdWNlX2Jsb2NrOgorICAgICAgICAgICAgICAgIHRyZWVfYXZhaWxhYmxlID0gRkFTVF9SRURVQ1RJT05fVFJFRV9NRVRIT0RfR0VORVJBVEVEOworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoIHRyZWVfYXZhaWxhYmxlICk7ICAgLy8gdHJlZV9hdmFpbGFibGUgc2hvdWxkIGJlICE9IDAKKyAgICAgICAgICAgICAgICAjaWYgS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgICAgICAgICAgICAgICBmb3JjZWRfcmV0dmFsID0gVFJFRV9SRURVQ0VfQkxPQ0tfV0lUSF9SRURVQ1RJT05fQkFSUklFUjsKKyAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKCAwICk7IC8vICJ1bnN1cHBvcnRlZCBtZXRob2Qgc3BlY2lmaWVkIgorICAgICAgICB9CisKKyAgICAgICAgcmV0dmFsID0gZm9yY2VkX3JldHZhbDsKKyAgICB9CisKKyAgICBLQV9UUkFDRSgxMCwgKCAicmVkdWN0aW9uIG1ldGhvZCBzZWxlY3RlZD0lMDh4XG4iLCByZXR2YWwgKSApOworCisgICAgI3VuZGVmIEZBU1RfUkVEVUNUSU9OX1RSRUVfTUVUSE9EX0dFTkVSQVRFRAorICAgICN1bmRlZiBGQVNUX1JFRFVDVElPTl9BVE9NSUNfTUVUSE9EX0dFTkVSQVRFRAorCisgICAgcmV0dXJuICggcmV0dmFsICk7Cit9CisKKy8vIHRoaXMgZnVuY3Rpb24gaXMgZm9yIHRlc3Rpbmcgc2V0L2dldC9kZXRlcm1pbmUgcmVkdWNlIG1ldGhvZAora21wX2ludDMyCitfX2ttcF9nZXRfcmVkdWNlX21ldGhvZCggdm9pZCApIHsKKyAgICByZXR1cm4gKCAoIF9fa21wX2VudHJ5X3RocmVhZCgpLT50aC50aF9sb2NhbC5wYWNrZWRfcmVkdWN0aW9uX21ldGhvZCApID4+IDggKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfc2FmZV9jX2FwaS5oIGIvZmluYWwvcnVudGltZS9zcmMva21wX3NhZmVfY19hcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWRmNjRjCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX3NhZmVfY19hcGkuaApAQCAtMCwwICsxLDYyIEBACisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBLTVBfU0FGRV9DX0FQSV9ICisjZGVmaW5lIEtNUF9TQUZFX0NfQVBJX0gKKworLy8KKy8vIFJlcGxhY2VtZW50IGZvciBiYW5uZWQgQyBBUEkKKy8vCisKKy8vIE5vdCBldmVyeSB1bnNhZmUgY2FsbCBsaXN0ZWQgaGVyZSBpcyBoYW5kbGVkIG5vdywgYnV0IGtlZXBpbmcgZXZlcnl0aGluZworLy8gaW4gb25lIHBsYWNlIHNob3VsZCBiZSBoYW5keSBmb3IgZnV0dXJlIG1haW50ZW5hbmNlLgorI2lmIEtNUF9PU19XSU5ET1dTCisKKyMgZGVmaW5lIFJTSVpFX01BWF9TVFIgKCA0VUwgPDwgMTAgKSAvLyA0S0IKKworLy8gX21hbGxvY2Egd2FzIHN1Z2dlc3RlZCwgYnV0IGl0IGlzIG5vdCBhIGRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yIF9hbGxvY2EKKyMgZGVmaW5lIEtNUF9BTExPQ0EgICAgICAgICAgICAgICAgICBfYWxsb2NhCisKKyMgZGVmaW5lIEtNUF9NRU1DUFlfUyAgICAgICAgICAgICAgICBtZW1jcHlfcworIyBkZWZpbmUgS01QX1NOUFJJTlRGICAgICAgICAgICAgICAgIHNwcmludGZfcworIyBkZWZpbmUgS01QX1NTQ0FORiAgICAgICAgICAgICAgICAgIHNzY2FuZl9zCisjIGRlZmluZSBLTVBfU1RSQ1BZX1MgICAgICAgICAgICAgICAgc3RyY3B5X3MKKyMgZGVmaW5lIEtNUF9TVFJOQ1BZX1MgICAgICAgICAgICAgICBzdHJuY3B5X3MKKworLy8gVXNlIHRoaXMgb25seSB3aGVuIGJ1ZmZlciBzaXplIGlzIHVua25vd24KKyMgZGVmaW5lIEtNUF9NRU1DUFkoZHN0LCBzcmMsIGNudCkgICBtZW1jcHlfcyhkc3QsIGNudCwgc3JjLCBjbnQpCisKKyMgZGVmaW5lIEtNUF9TVFJMRU4oc3RyKSAgICAgICAgICAgICBzdHJubGVuX3Moc3RyLCBSU0laRV9NQVhfU1RSKQorCisvLyBVc2UgdGhpcyBvbmx5IHdoZW4gYnVmZmVyIHNpemUgaXMgdW5rbm93bgorIyBkZWZpbmUgS01QX1NUUk5DUFkoZHN0LCBzcmMsIGNudCkgIHN0cm5jcHlfcyhkc3QsIGNudCwgc3JjLCBjbnQpCisKKy8vIF9UUlVOQ0FURSBpbnN1cmVzIGJ1ZmZlciBzaXplID4gbWF4IHN0cmluZyB0byBwcmludC4KKyMgZGVmaW5lIEtNUF9WU05QUklOVEYoZHN0LCBjbnQsIGZtdCwgYXJnKSAgdnNucHJpbnRmX3MoZHN0LCBjbnQsIF9UUlVOQ0FURSwgZm10LCBhcmcpCisKKyNlbHNlIC8vIEtNUF9PU19XSU5ET1dTCisKKy8vIEZvciBub3csIHRoZXNlIG1hY3JvcyB1c2UgdGhlIGV4aXN0aW5nIEFQSS4KKworIyBkZWZpbmUgS01QX0FMTE9DQSAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2EKKyMgZGVmaW5lIEtNUF9NRU1DUFlfUyhkc3QsIGJzeiwgc3JjLCBjbnQpICAgbWVtY3B5KGRzdCwgc3JjLCBjbnQpCisjIGRlZmluZSBLTVBfU05QUklOVEYgICAgICAgICAgICAgICAgICAgICAgIHNucHJpbnRmCisjIGRlZmluZSBLTVBfU1NDQU5GICAgICAgICAgICAgICAgICAgICAgICAgIHNzY2FuZgorIyBkZWZpbmUgS01QX1NUUkNQWV9TKGRzdCwgYnN6LCBzcmMpICAgICAgICBzdHJjcHkoZHN0LCBzcmMpIAorIyBkZWZpbmUgS01QX1NUUk5DUFlfUyhkc3QsIGJzeiwgc3JjLCBjbnQpICBzdHJuY3B5KGRzdCwgc3JjLCBjbnQpCisjIGRlZmluZSBLTVBfVlNOUFJJTlRGICAgICAgICAgICAgICAgICAgICAgIHZzbnByaW50ZgorIyBkZWZpbmUgS01QX1NUUk5DUFkgICAgICAgICAgICAgICAgICAgICAgICBzdHJuY3B5CisjIGRlZmluZSBLTVBfU1RSTEVOICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbgorIyBkZWZpbmUgS01QX01FTUNQWSAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkKKworI2VuZGlmIC8vIEtNUF9PU19XSU5ET1dTCisKKyNlbmRpZiAvLyBLTVBfU0FGRV9DX0FQSV9ICmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfc2NoZWQuY3BwIGIvZmluYWwvcnVudGltZS9zcmMva21wX3NjaGVkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTc3Y2E0Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX3NjaGVkLmNwcApAQCAtMCwwICsxLDk0MCBAQAorLyoKKyAqIGttcF9zY2hlZC5jIC0tIHN0YXRpYyBzY2hlZHVsaW5nIC0tIGl0ZXJhdGlvbiBpbml0aWFsaXphdGlvbgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisvKgorICogU3RhdGljIHNjaGVkdWxpbmcgaW5pdGlhbGl6YXRpb24uCisgKgorICogTk9URTogdGVhbS0+dC50X25wcm9jIGlzIGEgY29uc3RhbnQgaW5zaWRlIG9mIGFueSBkaXNwYXRjaCBsb29wLCBob3dldmVyCisgKiAgICAgICBpdCBtYXkgY2hhbmdlIHZhbHVlcyBiZXR3ZWVuIHBhcmFsbGVsIHJlZ2lvbnMuICBfX2ttcF9tYXhfbnRoCisgKiAgICAgICBpcyB0aGUgbGFyZ2VzdCB2YWx1ZSBfX2ttcF9udGggbWF5IHRha2UsIDEgaXMgdGhlIHNtYWxsZXN0LgorICoKKyAqLworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKyNpbmNsdWRlICJrbXBfc3RyLmgiCisjaW5jbHVkZSAia21wX2Vycm9yLmgiCisjaW5jbHVkZSAia21wX3N0YXRzLmgiCisjaW5jbHVkZSAia21wX2l0dC5oIgorCisjaWYgT01QVF9TVVBQT1JUCisjaW5jbHVkZSAib21wdC1zcGVjaWZpYy5oIgorI2VuZGlmCisKKy8vIHRlbXBsYXRlIGZvciB0eXBlIGxpbWl0cwordGVtcGxhdGU8IHR5cGVuYW1lIFQgPgorc3RydWN0IGlfbWF4bWluIHsKKyAgICBzdGF0aWMgY29uc3QgVCBteDsKKyAgICBzdGF0aWMgY29uc3QgVCBtbjsKK307Cit0ZW1wbGF0ZTw+CitzdHJ1Y3QgaV9tYXhtaW48IGludCA+IHsKKyAgICBzdGF0aWMgY29uc3QgaW50IG14ID0gMHg3ZmZmZmZmZjsKKyAgICBzdGF0aWMgY29uc3QgaW50IG1uID0gMHg4MDAwMDAwMDsKK307Cit0ZW1wbGF0ZTw+CitzdHJ1Y3QgaV9tYXhtaW48IHVuc2lnbmVkIGludCA+IHsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG14ID0gMHhmZmZmZmZmZjsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1uID0gMHgwMDAwMDAwMDsKK307Cit0ZW1wbGF0ZTw+CitzdHJ1Y3QgaV9tYXhtaW48IGxvbmcgbG9uZyA+IHsKKyAgICBzdGF0aWMgY29uc3QgbG9uZyBsb25nIG14ID0gMHg3ZmZmZmZmZmZmZmZmZmZmTEw7CisgICAgc3RhdGljIGNvbnN0IGxvbmcgbG9uZyBtbiA9IDB4ODAwMDAwMDAwMDAwMDAwMExMOworfTsKK3RlbXBsYXRlPD4KK3N0cnVjdCBpX21heG1pbjwgdW5zaWduZWQgbG9uZyBsb25nID4geworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgbXggPSAweGZmZmZmZmZmZmZmZmZmZmZMTDsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIG1uID0gMHgwMDAwMDAwMDAwMDAwMDAwTEw7Cit9OworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWZkZWYgS01QX0RFQlVHCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHRlbXBsYXRlIGZvciBkZWJ1ZyBwcmludHMgc3BlY2lmaWNhdGlvbiAoIGQsIHUsIGxsZCwgbGx1ICkKKyAgICBjaGFyIGNvbnN0ICogdHJhaXRzX3Q8IGludCA+OjpzcGVjID0gImQiOworICAgIGNoYXIgY29uc3QgKiB0cmFpdHNfdDwgdW5zaWduZWQgaW50ID46OnNwZWMgPSAidSI7CisgICAgY2hhciBjb25zdCAqIHRyYWl0c190PCBsb25nIGxvbmcgPjo6c3BlYyA9ICJsbGQiOworICAgIGNoYXIgY29uc3QgKiB0cmFpdHNfdDwgdW5zaWduZWQgbG9uZyBsb25nID46OnNwZWMgPSAibGx1IjsKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2VuZGlmCisKK3RlbXBsYXRlPCB0eXBlbmFtZSBUID4KK3N0YXRpYyB2b2lkCitfX2ttcF9mb3Jfc3RhdGljX2luaXQoCisgICAgaWRlbnRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgKmxvYywKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX3RpZCwKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZWR0eXBlLAorICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICpwbGFzdGl0ZXIsCisgICAgVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBsb3dlciwKKyAgICBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHVwcGVyLAorICAgIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnNpZ25lZF90ICpwc3RyaWRlLAorICAgIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnNpZ25lZF90ICBpbmNyLAorICAgIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnNpZ25lZF90ICBjaHVuaworKSB7CisgICAgS01QX0NPVU5UX0JMT0NLKE9NUF9GT1Jfc3RhdGljKTsKKyAgICBLTVBfVElNRV9CTE9DSyAoRk9SX3N0YXRpY19zY2hlZHVsaW5nKTsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6dW5zaWduZWRfdCAgVVQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+OjpzaWduZWRfdCAgICBTVDsKKyAgICAvKiAgdGhpcyBhbGwgaGFzIHRvIGJlIGNoYW5nZWQgYmFjayB0byBUSUQgYW5kIHN1Y2guLiAqLworICAgIHJlZ2lzdGVyIGttcF9pbnQzMiAgIGd0aWQgPSBnbG9iYWxfdGlkOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgIHRpZDsKKyAgICByZWdpc3RlciBrbXBfdWludDMyICBudGg7CisgICAgcmVnaXN0ZXIgVVQgICAgICAgICAgdHJpcF9jb3VudDsKKyAgICByZWdpc3RlciBrbXBfdGVhbV90ICp0ZWFtOworICAgIHJlZ2lzdGVyIGttcF9pbmZvX3QgKnRoID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgICBvbXB0X3RlYW1faW5mb190ICp0ZWFtX2luZm8gPSBOVUxMOyAKKyAgICBvbXB0X3Rhc2tfaW5mb190ICp0YXNrX2luZm8gPSBOVUxMOyAKKworICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgLy8gT25seSBmdWxseSBpbml0aWFsaXplIHZhcmlhYmxlcyBuZWVkZWQgYnkgT01QVCBpZiBPTVBUIGlzIGVuYWJsZWQuCisgICAgICAgIHRlYW1faW5mbyA9IF9fb21wdF9nZXRfdGVhbWluZm8oMCwgTlVMTCk7CisgICAgICAgIHRhc2tfaW5mbyA9IF9fb21wdF9nZXRfdGFza2luZm8oMCk7CisgICAgfQorI2VuZGlmCisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBwbGFzdGl0ZXIgJiYgcGxvd2VyICYmIHB1cHBlciAmJiBwc3RyaWRlICk7CisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wY19mb3Jfc3RhdGljX2luaXQgY2FsbGVkICglZClcbiIsIGdsb2JhbF90aWQpKTsKKyAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgeworICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgIl9fa21wY19mb3Jfc3RhdGljX2luaXQ6IFQjJSVkIHNjaGVkPSUlZCBsaXRlcj0lJWQgaXRlcj0oJSUlcywiIFwKKyAgICAgICAgICAgICIgJSUlcywgJSUlcykgaW5jcj0lJSVzIGNodW5rPSUlJXMgc2lnbmVkPzwlcz5cbiIsCisgICAgICAgICAgICB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgU1QgPjo6c3BlYywKKyAgICAgICAgICAgIHRyYWl0c190PCBTVCA+OjpzcGVjLCB0cmFpdHNfdDwgU1QgPjo6c3BlYywgdHJhaXRzX3Q8IFQgPjo6c3BlYyApOworICAgICAgICBLRF9UUkFDRSgxMDAsICggYnVmZiwgZ2xvYmFsX3RpZCwgc2NoZWR0eXBlLCAqcGxhc3RpdGVyLAorICAgICAgICAgICAgKnBsb3dlciwgKnB1cHBlciwgKnBzdHJpZGUsIGluY3IsIGNodW5rICkgKTsKKyAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgfQorICAgICNlbmRpZgorCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIF9fa21wX3B1c2hfd29ya3NoYXJlKCBnbG9iYWxfdGlkLCBjdF9wZG8sIGxvYyApOworICAgICAgICBpZiAoIGluY3IgPT0gMCApIHsKKyAgICAgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdCgga21wX2kxOG5fbXNnX0Nuc0xvb3BJbmNyWmVyb1Byb2hpYml0ZWQsIGN0X3BkbywgbG9jICk7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogc3BlY2lhbCBoYW5kbGluZyBmb3IgemVyby10cmlwIGxvb3BzICovCisgICAgaWYgKCBpbmNyID4gMCA/ICgqcHVwcGVyIDwgKnBsb3dlcikgOiAoKnBsb3dlciA8ICpwdXBwZXIpICkgeworICAgICAgICBpZiggcGxhc3RpdGVyICE9IE5VTEwgKQorICAgICAgICAgICAgKnBsYXN0aXRlciA9IEZBTFNFOworICAgICAgICAvKiBsZWF2ZSBwdXBwZXIgYW5kIHBsb3dlciBzZXQgdG8gZW50aXJlIGl0ZXJhdGlvbiBzcGFjZSAqLworICAgICAgICAqcHN0cmlkZSA9IGluY3I7ICAgLyogdmFsdWUgc2hvdWxkIG5ldmVyIGJlIHVzZWQgKi8KKwkvLyAgICAgICAgKnBsb3dlciA9ICpwdXBwZXIgLSBpbmNyOyAgIC8vIGxldCBjb21waWxlciBieXBhc3MgdGhlIGlsbGVnYWwgbG9vcCAobGlrZSBmb3IoaT0xO2k8MTA7aS0tKSkgIFRISVMgTElORSBDQVVTRUQgc2hhcGUyRi9oX3Rlc3RzXzEuZiBUTyBIQVZFIEEgRkFJTFVSRSBPTiBBIFpFUk8tVFJJUCBMT09QIChsb3dlcj0xLFwKKwkgIHVwcGVyPTAsc3RyaWRlPTEpIC0gSlBIIEp1bmUgMjMsIDIwMDkuCisgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgICAgICJfX2ttcGNfZm9yX3N0YXRpY19pbml0OihaRVJPIFRSSVApIGxpdGVyPSUlZCBsb3dlcj0lJSVzIHVwcGVyPSUlJXMgc3RyaWRlID0gJSUlcyBzaWduZWQ/PCVzPiwgbG9jID0gJSVzXG4iLAorICAgICAgICAgICAgICAgIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBTVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjICk7CisgICAgICAgICAgICBLRF9UUkFDRSgxMDAsICggYnVmZiwgKnBsYXN0aXRlciwgKnBsb3dlciwgKnB1cHBlciwgKnBzdHJpZGUsIGxvYy0+cHNvdXJjZSApICk7CisgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICAgICAgfQorICAgICAgICAjZW5kaWYKKyAgICAgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wY19mb3Jfc3RhdGljX2luaXQ6IFQjJWQgcmV0dXJuXG4iLCBnbG9iYWxfdGlkICkgKTsKKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgICAgICAgIGlmIChvbXB0X2VuYWJsZWQgJiYKKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9sb29wX2JlZ2luKSkgeworICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2xvb3BfYmVnaW4pKAorICAgICAgICAgICAgICAgIHRlYW1faW5mby0+cGFyYWxsZWxfaWQsIHRhc2tfaW5mby0+dGFza19pZCwKKyAgICAgICAgICAgICAgICB0ZWFtX2luZm8tPm1pY3JvdGFzayk7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBLTVBfQ09VTlRfVkFMVUUgKEZPUl9zdGF0aWNfaXRlcmF0aW9ucywgMCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBpZiAoIHNjaGVkdHlwZSA+IGttcF9vcmRfdXBwZXIgKSB7CisgICAgICAgIC8vIHdlIGFyZSBpbiBESVNUUklCVVRFIGNvbnN0cnVjdAorICAgICAgICBzY2hlZHR5cGUgKz0ga21wX3NjaF9zdGF0aWMgLSBrbXBfZGlzdHJpYnV0ZV9zdGF0aWM7ICAgICAgLy8gQUM6IGNvbnZlcnQgdG8gdXN1YWwgc2NoZWR1bGUgdHlwZQorICAgICAgICB0aWQgID0gdGgtPnRoLnRoX3RlYW0tPnQudF9tYXN0ZXJfdGlkOworICAgICAgICB0ZWFtID0gdGgtPnRoLnRoX3RlYW0tPnQudF9wYXJlbnQ7CisgICAgfSBlbHNlCisgICAgI2VuZGlmCisgICAgeworICAgICAgICB0aWQgID0gX19rbXBfdGlkX2Zyb21fZ3RpZCggZ2xvYmFsX3RpZCApOworICAgICAgICB0ZWFtID0gdGgtPnRoLnRoX3RlYW07CisgICAgfQorCisgICAgLyogZGV0ZXJtaW5lIGlmICJmb3IiIGxvb3AgaXMgYW4gYWN0aXZlIHdvcmtzaGFyaW5nIGNvbnN0cnVjdCAqLworICAgIGlmICggdGVhbSAtPiB0LnRfc2VyaWFsaXplZCApIHsKKyAgICAgICAgLyogc2VyaWFsaXplZCBwYXJhbGxlbCwgZWFjaCB0aHJlYWQgZXhlY3V0ZXMgd2hvbGUgaXRlcmF0aW9uIHNwYWNlICovCisgICAgICAgIGlmKCBwbGFzdGl0ZXIgIT0gTlVMTCApCisgICAgICAgICAgICAqcGxhc3RpdGVyID0gVFJVRTsKKyAgICAgICAgLyogbGVhdmUgcHVwcGVyIGFuZCBwbG93ZXIgc2V0IHRvIGVudGlyZSBpdGVyYXRpb24gc3BhY2UgKi8KKyAgICAgICAgKnBzdHJpZGUgPSAoaW5jciA+IDApID8gKCpwdXBwZXIgLSAqcGxvd2VyICsgMSkgOiAoLSgqcGxvd2VyIC0gKnB1cHBlciArIDEpKTsKKworICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAiX19rbXBjX2Zvcl9zdGF0aWNfaW5pdDogKHNlcmlhbCkgbGl0ZXI9JSVkIGxvd2VyPSUlJXMgdXBwZXI9JSUlcyBzdHJpZGUgPSAlJSVzXG4iLAorICAgICAgICAgICAgICAgIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBTVCA+OjpzcGVjICk7CisgICAgICAgICAgICBLRF9UUkFDRSgxMDAsICggYnVmZiwgKnBsYXN0aXRlciwgKnBsb3dlciwgKnB1cHBlciwgKnBzdHJpZGUgKSApOworICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgIH0KKyAgICAgICAgI2VuZGlmCisgICAgICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfZm9yX3N0YXRpY19pbml0OiBUIyVkIHJldHVyblxuIiwgZ2xvYmFsX3RpZCApICk7CisKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRQorICAgICAgICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfbG9vcF9iZWdpbikpIHsKKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9sb29wX2JlZ2luKSgKKyAgICAgICAgICAgICAgICB0ZWFtX2luZm8tPnBhcmFsbGVsX2lkLCB0YXNrX2luZm8tPnRhc2tfaWQsCisgICAgICAgICAgICAgICAgdGVhbV9pbmZvLT5taWNyb3Rhc2spOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBudGggPSB0ZWFtLT50LnRfbnByb2M7CisgICAgaWYgKCBudGggPT0gMSApIHsKKyAgICAgICAgaWYoIHBsYXN0aXRlciAhPSBOVUxMICkKKyAgICAgICAgICAgICpwbGFzdGl0ZXIgPSBUUlVFOworICAgICAgICAqcHN0cmlkZSA9IChpbmNyID4gMCkgPyAoKnB1cHBlciAtICpwbG93ZXIgKyAxKSA6ICgtKCpwbG93ZXIgLSAqcHVwcGVyICsgMSkpOworICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAiX19rbXBjX2Zvcl9zdGF0aWNfaW5pdDogKHNlcmlhbCkgbGl0ZXI9JSVkIGxvd2VyPSUlJXMgdXBwZXI9JSUlcyBzdHJpZGUgPSAlJSVzXG4iLAorICAgICAgICAgICAgICAgIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBTVCA+OjpzcGVjICk7CisgICAgICAgICAgICBLRF9UUkFDRSgxMDAsICggYnVmZiwgKnBsYXN0aXRlciwgKnBsb3dlciwgKnB1cHBlciwgKnBzdHJpZGUgKSApOworICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgIH0KKyAgICAgICAgI2VuZGlmCisgICAgICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfZm9yX3N0YXRpY19pbml0OiBUIyVkIHJldHVyblxuIiwgZ2xvYmFsX3RpZCApICk7CisKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRQorICAgICAgICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfbG9vcF9iZWdpbikpIHsKKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9sb29wX2JlZ2luKSgKKyAgICAgICAgICAgICAgICB0ZWFtX2luZm8tPnBhcmFsbGVsX2lkLCB0YXNrX2luZm8tPnRhc2tfaWQsCisgICAgICAgICAgICAgICAgdGVhbV9pbmZvLT5taWNyb3Rhc2spOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIGNvbXB1dGUgdHJpcCBjb3VudCAqLworICAgIGlmICggaW5jciA9PSAxICkgeworICAgICAgICB0cmlwX2NvdW50ID0gKnB1cHBlciAtICpwbG93ZXIgKyAxOworICAgIH0gZWxzZSBpZiAoaW5jciA9PSAtMSkgeworICAgICAgICB0cmlwX2NvdW50ID0gKnBsb3dlciAtICpwdXBwZXIgKyAxOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICggaW5jciA+IDEgKSB7ICAvLyB0aGUgY2hlY2sgaXMgbmVlZGVkIGZvciB1bnNpZ25lZCBkaXZpc2lvbiB3aGVuIGluY3IgPCAwCisgICAgICAgICAgICB0cmlwX2NvdW50ID0gKCpwdXBwZXIgLSAqcGxvd2VyKSAvIGluY3IgKyAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHJpcF9jb3VudCA9ICgqcGxvd2VyIC0gKnB1cHBlcikgLyAoIC1pbmNyICkgKyAxOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIC8qIHRyaXBjb3VudCBvdmVyZmxvdz8gKi8KKyAgICAgICAgaWYgKCB0cmlwX2NvdW50ID09IDAgJiYgKnB1cHBlciAhPSAqcGxvd2VyICkgeworICAgICAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0KCBrbXBfaTE4bl9tc2dfQ25zSXRlcmF0aW9uUmFuZ2VUb29MYXJnZSwgY3RfcGRvLCBsb2MgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBLTVBfQ09VTlRfVkFMVUUgKEZPUl9zdGF0aWNfaXRlcmF0aW9ucywgdHJpcF9jb3VudCk7CisKKyAgICAvKiBjb21wdXRlIHJlbWFpbmluZyBwYXJhbWV0ZXJzICovCisgICAgc3dpdGNoICggc2NoZWR0eXBlICkgeworICAgIGNhc2Uga21wX3NjaF9zdGF0aWM6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggdHJpcF9jb3VudCA8IG50aCApIHsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGF0aWMgPT0ga21wX3NjaF9zdGF0aWNfZ3JlZWR5IHx8IFwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RhdGljID09IGttcF9zY2hfc3RhdGljX2JhbGFuY2VkCisgICAgICAgICAgICAgICAgKTsgLy8gVW5rbm93biBzdGF0aWMgc2NoZWR1bGluZyB0eXBlLgorICAgICAgICAgICAgICAgIGlmICggdGlkIDwgdHJpcF9jb3VudCApIHsKKyAgICAgICAgICAgICAgICAgICAgKnB1cHBlciA9ICpwbG93ZXIgPSAqcGxvd2VyICsgdGlkICogaW5jcjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAqcGxvd2VyID0gKnB1cHBlciArIGluY3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKCBwbGFzdGl0ZXIgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgICAgICpwbGFzdGl0ZXIgPSAoIHRpZCA9PSB0cmlwX2NvdW50IC0gMSApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoIF9fa21wX3N0YXRpYyA9PSBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZCApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgVVQgc21hbGxfY2h1bmsgPSB0cmlwX2NvdW50IC8gbnRoOworICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBVVCBleHRyYXMgPSB0cmlwX2NvdW50ICUgbnRoOworICAgICAgICAgICAgICAgICAgICAqcGxvd2VyICs9IGluY3IgKiAoIHRpZCAqIHNtYWxsX2NodW5rICsgKCB0aWQgPCBleHRyYXMgPyB0aWQgOiBleHRyYXMgKSApOworICAgICAgICAgICAgICAgICAgICAqcHVwcGVyID0gKnBsb3dlciArIHNtYWxsX2NodW5rICogaW5jciAtICggdGlkIDwgZXh0cmFzID8gMCA6IGluY3IgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHBsYXN0aXRlciAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgICAgICpwbGFzdGl0ZXIgPSAoIHRpZCA9PSBudGggLSAxICk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgVCBiaWdfY2h1bmtfaW5jX2NvdW50ID0gKCB0cmlwX2NvdW50L250aCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKCB0cmlwX2NvdW50ICUgbnRoICkgPyAxIDogMCkgKSAqIGluY3I7CisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIFQgb2xkX3VwcGVyID0gKnB1cHBlcjsKKworICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9zdGF0aWMgPT0ga21wX3NjaF9zdGF0aWNfZ3JlZWR5ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBVbmtub3duIHN0YXRpYyBzY2hlZHVsaW5nIHR5cGUuCisKKyAgICAgICAgICAgICAgICAgICAgKnBsb3dlciArPSB0aWQgKiBiaWdfY2h1bmtfaW5jX2NvdW50OworICAgICAgICAgICAgICAgICAgICAqcHVwcGVyID0gKnBsb3dlciArIGJpZ19jaHVua19pbmNfY291bnQgLSBpbmNyOworICAgICAgICAgICAgICAgICAgICBpZiAoIGluY3IgPiAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoICpwdXBwZXIgPCAqcGxvd2VyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHVwcGVyID0gaV9tYXhtaW48IFQgPjo6bXg7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggcGxhc3RpdGVyICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwbGFzdGl0ZXIgPSAqcGxvd2VyIDw9IG9sZF91cHBlciAmJiAqcHVwcGVyID4gb2xkX3VwcGVyIC0gaW5jcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKnB1cHBlciA+IG9sZF91cHBlciApICpwdXBwZXIgPSBvbGRfdXBwZXI7IC8vIHRyYWNrZXIgQzczMjU4CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggKnB1cHBlciA+ICpwbG93ZXIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdXBwZXIgPSBpX21heG1pbjwgVCA+OjptbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwbGFzdGl0ZXIgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBsYXN0aXRlciA9ICpwbG93ZXIgPj0gb2xkX3VwcGVyICYmICpwdXBwZXIgPCBvbGRfdXBwZXIgLSBpbmNyOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAqcHVwcGVyIDwgb2xkX3VwcGVyICkgKnB1cHBlciA9IG9sZF91cHBlcjsgLy8gdHJhY2tlciBDNzMyNTgKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19jaHVua2VkOgorICAgICAgICB7CisgICAgICAgICAgICByZWdpc3RlciBTVCBzcGFuOworICAgICAgICAgICAgaWYgKCBjaHVuayA8IDEgKSB7CisgICAgICAgICAgICAgICAgY2h1bmsgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3BhbiA9IGNodW5rICogaW5jcjsKKyAgICAgICAgICAgICpwc3RyaWRlID0gc3BhbiAqIG50aDsKKyAgICAgICAgICAgICpwbG93ZXIgPSAqcGxvd2VyICsgKHNwYW4gKiB0aWQpOworICAgICAgICAgICAgKnB1cHBlciA9ICpwbG93ZXIgKyBzcGFuIC0gaW5jcjsKKyAgICAgICAgICAgIGlmKCBwbGFzdGl0ZXIgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgKnBsYXN0aXRlciA9ICh0aWQgPT0gKCh0cmlwX2NvdW50IC0gMSkvKCBVVCApY2h1bmspICUgbnRoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgICAgS01QX0FTU0VSVDIoIDAsICJfX2ttcGNfZm9yX3N0YXRpY19pbml0OiB1bmtub3duIHNjaGVkdWxpbmcgdHlwZSIgKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIC8vIFJlcG9ydCBsb29wIG1ldGFkYXRhCisgICAgaWYgKCBLTVBfTUFTVEVSX1RJRCh0aWQpICYmIF9faXR0X21ldGFkYXRhX2FkZF9wdHIgJiYgX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMyAmJgorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgIHRoLT50aC50aF90ZWFtc19taWNyb3Rhc2sgPT0gTlVMTCAmJgorI2VuZGlmCisgICAgICAgIHRlYW0tPnQudF9hY3RpdmVfbGV2ZWwgPT0gMSApCisgICAgeworICAgICAgICBrbXBfdWludDY0IGN1cl9jaHVuayA9IGNodW5rOworICAgICAgICAvLyBDYWxjdWxhdGUgY2h1bmsgaW4gY2FzZSBpdCB3YXMgbm90IHNwZWNpZmllZDsgaXQgaXMgc3BlY2lmaWVkIGZvciBrbXBfc2NoX3N0YXRpY19jaHVua2VkCisgICAgICAgIGlmICggc2NoZWR0eXBlID09IGttcF9zY2hfc3RhdGljICkgeworICAgICAgICAgICAgY3VyX2NodW5rID0gdHJpcF9jb3VudCAvIG50aCArICggKCB0cmlwX2NvdW50ICUgbnRoICkgPyAxIDogMCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gMCAtICJzdGF0aWMiIHNjaGVkdWxlCisgICAgICAgIF9fa21wX2l0dF9tZXRhZGF0YV9sb29wKGxvYywgMCwgdHJpcF9jb3VudCwgY3VyX2NodW5rKTsKKyAgICB9CisjZW5kaWYKKyAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgeworICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgIl9fa21wY19mb3Jfc3RhdGljX2luaXQ6IGxpdGVyPSUlZCBsb3dlcj0lJSVzIHVwcGVyPSUlJXMgc3RyaWRlID0gJSUlcyBzaWduZWQ/PCVzPlxuIiwKKyAgICAgICAgICAgIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBTVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjICk7CisgICAgICAgIEtEX1RSQUNFKDEwMCwgKCBidWZmLCAqcGxhc3RpdGVyLCAqcGxvd2VyLCAqcHVwcGVyLCAqcHN0cmlkZSApICk7CisgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgIH0KKyAgICAjZW5kaWYKKyAgICBLRV9UUkFDRSggMTAsICgiX19rbXBjX2Zvcl9zdGF0aWNfaW5pdDogVCMlZCByZXR1cm5cbiIsIGdsb2JhbF90aWQgKSApOworCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9sb29wX2JlZ2luKSkgeworICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfbG9vcF9iZWdpbikoCisgICAgICAgICAgICB0ZWFtX2luZm8tPnBhcmFsbGVsX2lkLCB0YXNrX2luZm8tPnRhc2tfaWQsIHRlYW1faW5mby0+bWljcm90YXNrKTsKKyAgICB9CisjZW5kaWYKKworICAgIHJldHVybjsKK30KKwordGVtcGxhdGU8IHR5cGVuYW1lIFQgPgorc3RhdGljIHZvaWQKK19fa21wX2Rpc3RfZm9yX3N0YXRpY19pbml0KAorICAgIGlkZW50X3QgICAgICAgICAgICAgICAgICAgICAgICAgICpsb2MsCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlLAorICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICpwbGFzdGl0ZXIsCisgICAgVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBsb3dlciwKKyAgICBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHVwcGVyLAorICAgIFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdXBwZXJEaXN0LAorICAgIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnNpZ25lZF90ICpwc3RyaWRlLAorICAgIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnNpZ25lZF90ICBpbmNyLAorICAgIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnNpZ25lZF90ICBjaHVuaworKSB7CisgICAgS01QX0NPVU5UX0JMT0NLKE9NUF9ESVNUUklCVVRFKTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnVuc2lnbmVkX3QgIFVUOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6c2lnbmVkX3QgICAgU1Q7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiAgdGlkOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgIG50aDsKKyAgICByZWdpc3RlciBrbXBfdWludDMyICB0ZWFtX2lkOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgIG50ZWFtczsKKyAgICByZWdpc3RlciBVVCAgICAgICAgICB0cmlwX2NvdW50OworICAgIHJlZ2lzdGVyIGttcF90ZWFtX3QgKnRlYW07CisgICAga21wX2luZm9fdCAqIHRoOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggcGxhc3RpdGVyICYmIHBsb3dlciAmJiBwdXBwZXIgJiYgcHVwcGVyRGlzdCAmJiBwc3RyaWRlICk7CisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wY19kaXN0X2Zvcl9zdGF0aWNfaW5pdCBjYWxsZWQgKCVkKVxuIiwgZ3RpZCkpOworICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAiX19rbXBjX2Rpc3RfZm9yX3N0YXRpY19pbml0OiBUIyUlZCBzY2hlZExvb3A9JSVkIGxpdGVyPSUlZCAiXAorICAgICAgICAgICAgIml0ZXI9KCUlJXMsICUlJXMsICUlJXMpIGNodW5rPSUlJXMgc2lnbmVkPzwlcz5cbiIsCisgICAgICAgICAgICB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgU1QgPjo6c3BlYywKKyAgICAgICAgICAgIHRyYWl0c190PCBTVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjICk7CisgICAgICAgIEtEX1RSQUNFKDEwMCwgKCBidWZmLCBndGlkLCBzY2hlZHVsZSwgKnBsYXN0aXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgKnBsb3dlciwgKnB1cHBlciwgaW5jciwgY2h1bmsgKSApOworICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICB9CisgICAgI2VuZGlmCisKKyAgICBpZiggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBfX2ttcF9wdXNoX3dvcmtzaGFyZSggZ3RpZCwgY3RfcGRvLCBsb2MgKTsKKyAgICAgICAgaWYoIGluY3IgPT0gMCApIHsKKyAgICAgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdCgga21wX2kxOG5fbXNnX0Nuc0xvb3BJbmNyWmVyb1Byb2hpYml0ZWQsIGN0X3BkbywgbG9jICk7CisgICAgICAgIH0KKyAgICAgICAgaWYoIGluY3IgPiAwID8gKCpwdXBwZXIgPCAqcGxvd2VyKSA6ICgqcGxvd2VyIDwgKnB1cHBlcikgKSB7CisgICAgICAgICAgICAvLyBUaGUgbG9vcCBpcyBpbGxlZ2FsLgorICAgICAgICAgICAgLy8gU29tZSB6ZXJvLXRyaXAgbG9vcHMgbWFpbnRhaW5lZCBieSBjb21waWxlciwgZS5nLjoKKyAgICAgICAgICAgIC8vICAgZm9yKGk9MTA7aTwwOysraSkgLy8gbG93ZXIgPj0gdXBwZXIgLSBydW4tdGltZSBjaGVjaworICAgICAgICAgICAgLy8gICBmb3IoaT0wO2k+MTA7LS1pKSAvLyBsb3dlciA8PSB1cHBlciAtIHJ1bi10aW1lIGNoZWNrCisgICAgICAgICAgICAvLyAgIGZvcihpPTA7aT4xMDsrK2kpIC8vIGluY3IgPiAwICAgICAgIC0gY29tcGlsZS10aW1lIGNoZWNrCisgICAgICAgICAgICAvLyAgIGZvcihpPTEwO2k8MDstLWkpIC8vIGluY3IgPCAwICAgICAgIC0gY29tcGlsZS10aW1lIGNoZWNrCisgICAgICAgICAgICAvLyBDb21waWxlciBkb2VzIG5vdCBjaGVjayB0aGUgZm9sbG93aW5nIGlsbGVnYWwgbG9vcHM6CisgICAgICAgICAgICAvLyAgIGZvcihpPTA7aTwxMDtpKz1pbmNyKSAvLyB3aGVyZSBpbmNyPDAKKyAgICAgICAgICAgIC8vICAgZm9yKGk9MTA7aT4wO2ktPWluY3IpIC8vIHdoZXJlIGluY3I8MAorICAgICAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0KCBrbXBfaTE4bl9tc2dfQ25zTG9vcEluY3JJbGxlZ2FsLCBjdF9wZG8sIGxvYyApOworICAgICAgICB9CisgICAgfQorICAgIHRpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICB0aCA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgICAgbnRoID0gdGgtPnRoLnRoX3RlYW1fbnByb2M7CisgICAgdGVhbSA9IHRoLT50aC50aF90ZWFtOworICAgICNpZiBPTVBfNDBfRU5BQkxFRAorICAgIEtNUF9ERUJVR19BU1NFUlQodGgtPnRoLnRoX3RlYW1zX21pY3JvdGFzayk7ICAgLy8gd2UgYXJlIGluIHRoZSB0ZWFtcyBjb25zdHJ1Y3QKKyAgICBudGVhbXMgPSB0aC0+dGgudGhfdGVhbXNfc2l6ZS5udGVhbXM7CisgICAgI2VuZGlmCisgICAgdGVhbV9pZCA9IHRlYW0tPnQudF9tYXN0ZXJfdGlkOworICAgIEtNUF9ERUJVR19BU1NFUlQobnRlYW1zID09IHRlYW0tPnQudF9wYXJlbnQtPnQudF9ucHJvYyk7CisKKyAgICAvLyBjb21wdXRlIGdsb2JhbCB0cmlwIGNvdW50CisgICAgaWYoIGluY3IgPT0gMSApIHsKKyAgICAgICAgdHJpcF9jb3VudCA9ICpwdXBwZXIgLSAqcGxvd2VyICsgMTsKKyAgICB9IGVsc2UgaWYoaW5jciA9PSAtMSkgeworICAgICAgICB0cmlwX2NvdW50ID0gKnBsb3dlciAtICpwdXBwZXIgKyAxOworICAgIH0gZWxzZSB7CisgICAgICAgIHRyaXBfY291bnQgPSAoU1QpKCpwdXBwZXIgLSAqcGxvd2VyKSAvIGluY3IgKyAxOyAvLyBjYXN0IHRvIHNpZ25lZCB0byBjb3ZlciBpbmNyPDAgY2FzZQorICAgIH0KKworICAgICpwc3RyaWRlID0gKnB1cHBlciAtICpwbG93ZXI7ICAvLyBqdXN0IGluIGNhc2UgKGNhbiBiZSB1bnVzZWQpCisgICAgaWYoIHRyaXBfY291bnQgPD0gbnRlYW1zICkgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKAorICAgICAgICAgICAgX19rbXBfc3RhdGljID09IGttcF9zY2hfc3RhdGljX2dyZWVkeSB8fCBcCisgICAgICAgICAgICBfX2ttcF9zdGF0aWMgPT0ga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQKKyAgICAgICAgKTsgLy8gVW5rbm93biBzdGF0aWMgc2NoZWR1bGluZyB0eXBlLgorICAgICAgICAvLyBvbmx5IG1hc3RlcnMgb2Ygc29tZSB0ZWFtcyBnZXQgc2luZ2xlIGl0ZXJhdGlvbiwgb3RoZXIgdGhyZWFkcyBnZXQgbm90aGluZworICAgICAgICBpZiggdGVhbV9pZCA8IHRyaXBfY291bnQgJiYgdGlkID09IDAgKSB7CisgICAgICAgICAgICAqcHVwcGVyID0gKnB1cHBlckRpc3QgPSAqcGxvd2VyID0gKnBsb3dlciArIHRlYW1faWQgKiBpbmNyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKnB1cHBlckRpc3QgPSAqcHVwcGVyOworICAgICAgICAgICAgKnBsb3dlciA9ICpwdXBwZXIgKyBpbmNyOyAvLyBjb21waWxlciBzaG91bGQgc2tpcCBsb29wIGJvZHkKKyAgICAgICAgfQorICAgICAgICBpZiggcGxhc3RpdGVyICE9IE5VTEwgKQorICAgICAgICAgICAgKnBsYXN0aXRlciA9ICggdGlkID09IDAgJiYgdGVhbV9pZCA9PSB0cmlwX2NvdW50IC0gMSApOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEdldCB0aGUgdGVhbSdzIGNodW5rIGZpcnN0IChlYWNoIHRlYW0gZ2V0cyBhdCBtb3N0IG9uZSBjaHVuaykKKyAgICAgICAgaWYoIF9fa21wX3N0YXRpYyA9PSBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZCApIHsKKyAgICAgICAgICAgIHJlZ2lzdGVyIFVUIGNodW5rRCA9IHRyaXBfY291bnQgLyBudGVhbXM7CisgICAgICAgICAgICByZWdpc3RlciBVVCBleHRyYXMgPSB0cmlwX2NvdW50ICUgbnRlYW1zOworICAgICAgICAgICAgKnBsb3dlciArPSBpbmNyICogKCB0ZWFtX2lkICogY2h1bmtEICsgKCB0ZWFtX2lkIDwgZXh0cmFzID8gdGVhbV9pZCA6IGV4dHJhcyApICk7CisgICAgICAgICAgICAqcHVwcGVyRGlzdCA9ICpwbG93ZXIgKyBjaHVua0QgKiBpbmNyIC0gKCB0ZWFtX2lkIDwgZXh0cmFzID8gMCA6IGluY3IgKTsKKyAgICAgICAgICAgIGlmKCBwbGFzdGl0ZXIgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgKnBsYXN0aXRlciA9ICggdGVhbV9pZCA9PSBudGVhbXMgLSAxICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZWdpc3RlciBUIGNodW5rX2luY19jb3VudCA9CisgICAgICAgICAgICAgICAgKCB0cmlwX2NvdW50IC8gbnRlYW1zICsgKCAoIHRyaXBfY291bnQgJSBudGVhbXMgKSA/IDEgOiAwKSApICogaW5jcjsKKyAgICAgICAgICAgIHJlZ2lzdGVyIFQgdXBwZXIgPSAqcHVwcGVyOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfc3RhdGljID09IGttcF9zY2hfc3RhdGljX2dyZWVkeSApOworICAgICAgICAgICAgICAgIC8vIFVua25vd24gc3RhdGljIHNjaGVkdWxpbmcgdHlwZS4KKyAgICAgICAgICAgICpwbG93ZXIgKz0gdGVhbV9pZCAqIGNodW5rX2luY19jb3VudDsKKyAgICAgICAgICAgICpwdXBwZXJEaXN0ID0gKnBsb3dlciArIGNodW5rX2luY19jb3VudCAtIGluY3I7CisgICAgICAgICAgICAvLyBDaGVjay9jb3JyZWN0IGJvdW5kcyBpZiBuZWVkZWQKKyAgICAgICAgICAgIGlmKCBpbmNyID4gMCApIHsKKyAgICAgICAgICAgICAgICBpZiggKnB1cHBlckRpc3QgPCAqcGxvd2VyICkKKyAgICAgICAgICAgICAgICAgICAgKnB1cHBlckRpc3QgPSBpX21heG1pbjwgVCA+OjpteDsKKyAgICAgICAgICAgICAgICBpZiggcGxhc3RpdGVyICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICAgICAqcGxhc3RpdGVyID0gKnBsb3dlciA8PSB1cHBlciAmJiAqcHVwcGVyRGlzdCA+IHVwcGVyIC0gaW5jcjsKKyAgICAgICAgICAgICAgICBpZiggKnB1cHBlckRpc3QgPiB1cHBlciApCisgICAgICAgICAgICAgICAgICAgICpwdXBwZXJEaXN0ID0gdXBwZXI7IC8vIHRyYWNrZXIgQzczMjU4CisgICAgICAgICAgICAgICAgaWYoICpwbG93ZXIgPiAqcHVwcGVyRGlzdCApIHsKKyAgICAgICAgICAgICAgICAgICAgKnB1cHBlciA9ICpwdXBwZXJEaXN0OyAgLy8gbm8gaXRlcmF0aW9ucyBhdmFpbGFibGUgZm9yIHRoZSB0ZWFtCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYoICpwdXBwZXJEaXN0ID4gKnBsb3dlciApCisgICAgICAgICAgICAgICAgICAgICpwdXBwZXJEaXN0ID0gaV9tYXhtaW48IFQgPjo6bW47CisgICAgICAgICAgICAgICAgaWYoIHBsYXN0aXRlciAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgKnBsYXN0aXRlciA9ICpwbG93ZXIgPj0gdXBwZXIgJiYgKnB1cHBlckRpc3QgPCB1cHBlciAtIGluY3I7CisgICAgICAgICAgICAgICAgaWYoICpwdXBwZXJEaXN0IDwgdXBwZXIgKQorICAgICAgICAgICAgICAgICAgICAqcHVwcGVyRGlzdCA9IHVwcGVyOyAvLyB0cmFja2VyIEM3MzI1OAorICAgICAgICAgICAgICAgIGlmKCAqcGxvd2VyIDwgKnB1cHBlckRpc3QgKSB7CisgICAgICAgICAgICAgICAgICAgICpwdXBwZXIgPSAqcHVwcGVyRGlzdDsgIC8vIG5vIGl0ZXJhdGlvbnMgYXZhaWxhYmxlIGZvciB0aGUgdGVhbQorICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gR2V0IHRoZSBwYXJhbGxlbCBsb29wIGNodW5rIG5vdyAoZm9yIHRocmVhZCkKKyAgICAgICAgLy8gY29tcHV0ZSB0cmlwIGNvdW50IGZvciB0ZWFtJ3MgY2h1bmsKKyAgICAgICAgaWYoIGluY3IgPT0gMSApIHsKKyAgICAgICAgICAgIHRyaXBfY291bnQgPSAqcHVwcGVyRGlzdCAtICpwbG93ZXIgKyAxOworICAgICAgICB9IGVsc2UgaWYoaW5jciA9PSAtMSkgeworICAgICAgICAgICAgdHJpcF9jb3VudCA9ICpwbG93ZXIgLSAqcHVwcGVyRGlzdCArIDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0cmlwX2NvdW50ID0gKFNUKSgqcHVwcGVyRGlzdCAtICpwbG93ZXIpIC8gaW5jciArIDE7CisgICAgICAgIH0KKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdHJpcF9jb3VudCApOworICAgICAgICBzd2l0Y2goIHNjaGVkdWxlICkgeworICAgICAgICBjYXNlIGttcF9zY2hfc3RhdGljOgorICAgICAgICB7CisgICAgICAgICAgICBpZiggdHJpcF9jb3VudCA8PSBudGggKSB7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCgKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RhdGljID09IGttcF9zY2hfc3RhdGljX2dyZWVkeSB8fCBcCisgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0YXRpYyA9PSBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZAorICAgICAgICAgICAgICAgICk7IC8vIFVua25vd24gc3RhdGljIHNjaGVkdWxpbmcgdHlwZS4KKyAgICAgICAgICAgICAgICBpZiggdGlkIDwgdHJpcF9jb3VudCApCisgICAgICAgICAgICAgICAgICAgICpwdXBwZXIgPSAqcGxvd2VyID0gKnBsb3dlciArIHRpZCAqIGluY3I7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAqcGxvd2VyID0gKnB1cHBlciArIGluY3I7IC8vIG5vIGl0ZXJhdGlvbnMgYXZhaWxhYmxlCisgICAgICAgICAgICAgICAgaWYoIHBsYXN0aXRlciAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgaWYoICpwbGFzdGl0ZXIgIT0gMCAmJiAhKCB0aWQgPT0gdHJpcF9jb3VudCAtIDEgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAqcGxhc3RpdGVyID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYoIF9fa21wX3N0YXRpYyA9PSBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZCApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgVVQgY2h1bmtMID0gdHJpcF9jb3VudCAvIG50aDsKKyAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgVVQgZXh0cmFzID0gdHJpcF9jb3VudCAlIG50aDsKKyAgICAgICAgICAgICAgICAgICAgKnBsb3dlciArPSBpbmNyICogKHRpZCAqIGNodW5rTCArICh0aWQgPCBleHRyYXMgPyB0aWQgOiBleHRyYXMpKTsKKyAgICAgICAgICAgICAgICAgICAgKnB1cHBlciA9ICpwbG93ZXIgKyBjaHVua0wgKiBpbmNyIC0gKHRpZCA8IGV4dHJhcyA/IDAgOiBpbmNyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHBsYXN0aXRlciAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAqcGxhc3RpdGVyICE9IDAgJiYgISggdGlkID09IG50aCAtIDEgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBsYXN0aXRlciA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgVCBjaHVua19pbmNfY291bnQgPQorICAgICAgICAgICAgICAgICAgICAgICAgKCB0cmlwX2NvdW50IC8gbnRoICsgKCAoIHRyaXBfY291bnQgJSBudGggKSA/IDEgOiAwKSApICogaW5jcjsKKyAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgVCB1cHBlciA9ICpwdXBwZXJEaXN0OworICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9zdGF0aWMgPT0ga21wX3NjaF9zdGF0aWNfZ3JlZWR5ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBVbmtub3duIHN0YXRpYyBzY2hlZHVsaW5nIHR5cGUuCisgICAgICAgICAgICAgICAgICAgICpwbG93ZXIgKz0gdGlkICogY2h1bmtfaW5jX2NvdW50OworICAgICAgICAgICAgICAgICAgICAqcHVwcGVyID0gKnBsb3dlciArIGNodW5rX2luY19jb3VudCAtIGluY3I7CisgICAgICAgICAgICAgICAgICAgIGlmKCBpbmNyID4gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAqcHVwcGVyIDwgKnBsb3dlciApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1cHBlciA9IGlfbWF4bWluPCBUID46Om14OworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBsYXN0aXRlciAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggKnBsYXN0aXRlciAhPSAwICYmICEoKnBsb3dlciA8PSB1cHBlciAmJiAqcHVwcGVyID4gdXBwZXIgLSBpbmNyKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwbGFzdGl0ZXIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoICpwdXBwZXIgPiB1cHBlciApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1cHBlciA9IHVwcGVyOy8vdHJhY2tlciBDNzMyNTgKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAqcHVwcGVyID4gKnBsb3dlciApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1cHBlciA9IGlfbWF4bWluPCBUID46Om1uOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBsYXN0aXRlciAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggKnBsYXN0aXRlciAhPSAwICYmICEoKnBsb3dlciA+PSB1cHBlciAmJiAqcHVwcGVyIDwgdXBwZXIgLSBpbmNyKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwbGFzdGl0ZXIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoICpwdXBwZXIgPCB1cHBlciApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1cHBlciA9IHVwcGVyOy8vdHJhY2tlciBDNzMyNTgKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfY2h1bmtlZDoKKyAgICAgICAgeworICAgICAgICAgICAgcmVnaXN0ZXIgU1Qgc3BhbjsKKyAgICAgICAgICAgIGlmKCBjaHVuayA8IDEgKQorICAgICAgICAgICAgICAgIGNodW5rID0gMTsKKyAgICAgICAgICAgIHNwYW4gPSBjaHVuayAqIGluY3I7CisgICAgICAgICAgICAqcHN0cmlkZSA9IHNwYW4gKiBudGg7CisgICAgICAgICAgICAqcGxvd2VyID0gKnBsb3dlciArIChzcGFuICogdGlkKTsKKyAgICAgICAgICAgICpwdXBwZXIgPSAqcGxvd2VyICsgc3BhbiAtIGluY3I7CisgICAgICAgICAgICBpZiggcGxhc3RpdGVyICE9IE5VTEwgKQorICAgICAgICAgICAgICAgIGlmKCAqcGxhc3RpdGVyICE9IDAgJiYgISh0aWQgPT0gKCh0cmlwX2NvdW50IC0gMSkgLyAoIFVUICljaHVuaykgJSBudGgpICkKKyAgICAgICAgICAgICAgICAgICAgKnBsYXN0aXRlciA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgS01QX0FTU0VSVDIoIDAsICJfX2ttcGNfZGlzdF9mb3Jfc3RhdGljX2luaXQ6IHVua25vd24gbG9vcCBzY2hlZHVsaW5nIHR5cGUiICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbmQ6OworICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAiX19rbXBjX2Rpc3RfZm9yX3N0YXRpY19pbml0OiBsYXN0PSUlZCBsbz0lJSVzIHVwPSUlJXMgdXBEaXN0PSUlJXMgIlwKKyAgICAgICAgICAgICJzdHJpZGU9JSUlcyBzaWduZWQ/PCVzPlxuIiwKKyAgICAgICAgICAgIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsCisgICAgICAgICAgICB0cmFpdHNfdDwgU1QgPjo6c3BlYywgdHJhaXRzX3Q8IFQgPjo6c3BlYyApOworICAgICAgICBLRF9UUkFDRSgxMDAsICggYnVmZiwgKnBsYXN0aXRlciwgKnBsb3dlciwgKnB1cHBlciwgKnB1cHBlckRpc3QsICpwc3RyaWRlICkgKTsKKyAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgfQorICAgICNlbmRpZgorICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfZGlzdF9mb3Jfc3RhdGljX2luaXQ6IFQjJWQgcmV0dXJuXG4iLCBndGlkICkgKTsKKyAgICByZXR1cm47Cit9CisKK3RlbXBsYXRlPCB0eXBlbmFtZSBUID4KK3N0YXRpYyB2b2lkCitfX2ttcF90ZWFtX3N0YXRpY19pbml0KAorICAgIGlkZW50X3QgICAgICAgICAgICAgICAgICAgICAgICAgICpsb2MsCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGFzdCwKKyAgICBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9sYiwKKyAgICBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF91YiwKKyAgICB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+OjpzaWduZWRfdCAqcF9zdCwKKyAgICB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+OjpzaWduZWRfdCAgaW5jciwKKyAgICB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+OjpzaWduZWRfdCAgY2h1bmsKKykgeworICAgIC8vIFRoZSByb3V0aW5lIHJldHVybnMgdGhlIGZpcnN0IGNodW5rIGRpc3RyaWJ1dGVkIHRvIHRoZSB0ZWFtIGFuZAorICAgIC8vIHN0cmlkZSBmb3IgbmV4dCBjaHVua3MgY2FsY3VsYXRpb24uCisgICAgLy8gTGFzdCBpdGVyYXRpb24gZmxhZyBzZXQgZm9yIHRoZSB0ZWFtIHRoYXQgd2lsbCBleGVjdXRlCisgICAgLy8gdGhlIGxhc3QgaXRlcmF0aW9uIG9mIHRoZSBsb29wLgorICAgIC8vIFRoZSByb3V0aW5lIGlzIGNhbGxlZCBmb3IgZGlzdF9zY2hlZHVlKHN0YXRpYyxjaHVuaykgb25seS4KKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnVuc2lnbmVkX3QgIFVUOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6c2lnbmVkX3QgICAgU1Q7CisgICAga21wX3VpbnQzMiAgdGVhbV9pZDsKKyAgICBrbXBfdWludDMyICBudGVhbXM7CisgICAgVVQgICAgICAgICAgdHJpcF9jb3VudDsKKyAgICBUICAgICAgICAgICBsb3dlcjsKKyAgICBUICAgICAgICAgICB1cHBlcjsKKyAgICBTVCAgICAgICAgICBzcGFuOworICAgIGttcF90ZWFtX3QgKnRlYW07CisgICAga21wX2luZm9fdCAqdGg7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBwX2xhc3QgJiYgcF9sYiAmJiBwX3ViICYmIHBfc3QgKTsKKyAgICBLRV9UUkFDRSggMTAsICgiX19rbXBfdGVhbV9zdGF0aWNfaW5pdCBjYWxsZWQgKCVkKVxuIiwgZ3RpZCkpOworICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoICJfX2ttcF90ZWFtX3N0YXRpY19pbml0IGVudGVyOiBUIyUlZCBsaXRlcj0lJWQgIlwKKyAgICAgICAgICAgICJpdGVyPSglJSVzLCAlJSVzLCAlJSVzKSBjaHVuayAlJSVzOyBzaWduZWQ/PCVzPlxuIiwKKyAgICAgICAgICAgIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBTVCA+OjpzcGVjLAorICAgICAgICAgICAgdHJhaXRzX3Q8IFNUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMgKTsKKyAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIGJ1ZmYsIGd0aWQsICpwX2xhc3QsICpwX2xiLCAqcF91YiwgKnBfc3QsIGNodW5rICkgKTsKKyAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgfQorICAgICNlbmRpZgorCisgICAgbG93ZXIgPSAqcF9sYjsKKyAgICB1cHBlciA9ICpwX3ViOworICAgIGlmKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGlmKCBpbmNyID09IDAgKSB7CisgICAgICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QoIGttcF9pMThuX21zZ19DbnNMb29wSW5jclplcm9Qcm9oaWJpdGVkLCBjdF9wZG8sIGxvYyApOworICAgICAgICB9CisgICAgICAgIGlmKCBpbmNyID4gMCA/ICh1cHBlciA8IGxvd2VyKSA6IChsb3dlciA8IHVwcGVyKSApIHsKKyAgICAgICAgICAgIC8vIFRoZSBsb29wIGlzIGlsbGVnYWwuCisgICAgICAgICAgICAvLyBTb21lIHplcm8tdHJpcCBsb29wcyBtYWludGFpbmVkIGJ5IGNvbXBpbGVyLCBlLmcuOgorICAgICAgICAgICAgLy8gICBmb3IoaT0xMDtpPDA7KytpKSAvLyBsb3dlciA+PSB1cHBlciAtIHJ1bi10aW1lIGNoZWNrCisgICAgICAgICAgICAvLyAgIGZvcihpPTA7aT4xMDstLWkpIC8vIGxvd2VyIDw9IHVwcGVyIC0gcnVuLXRpbWUgY2hlY2sKKyAgICAgICAgICAgIC8vICAgZm9yKGk9MDtpPjEwOysraSkgLy8gaW5jciA+IDAgICAgICAgLSBjb21waWxlLXRpbWUgY2hlY2sKKyAgICAgICAgICAgIC8vICAgZm9yKGk9MTA7aTwwOy0taSkgLy8gaW5jciA8IDAgICAgICAgLSBjb21waWxlLXRpbWUgY2hlY2sKKyAgICAgICAgICAgIC8vIENvbXBpbGVyIGRvZXMgbm90IGNoZWNrIHRoZSBmb2xsb3dpbmcgaWxsZWdhbCBsb29wczoKKyAgICAgICAgICAgIC8vICAgZm9yKGk9MDtpPDEwO2krPWluY3IpIC8vIHdoZXJlIGluY3I8MAorICAgICAgICAgICAgLy8gICBmb3IoaT0xMDtpPjA7aS09aW5jcikgLy8gd2hlcmUgaW5jcjwwCisgICAgICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QoIGttcF9pMThuX21zZ19DbnNMb29wSW5jcklsbGVnYWwsIGN0X3BkbywgbG9jICk7CisgICAgICAgIH0KKyAgICB9CisgICAgdGggPSBfX2ttcF90aHJlYWRzW2d0aWRdOworICAgIHRlYW0gPSB0aC0+dGgudGhfdGVhbTsKKyAgICAjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRoLT50aC50aF90ZWFtc19taWNyb3Rhc2spOyAgIC8vIHdlIGFyZSBpbiB0aGUgdGVhbXMgY29uc3RydWN0CisgICAgbnRlYW1zID0gdGgtPnRoLnRoX3RlYW1zX3NpemUubnRlYW1zOworICAgICNlbmRpZgorICAgIHRlYW1faWQgPSB0ZWFtLT50LnRfbWFzdGVyX3RpZDsKKyAgICBLTVBfREVCVUdfQVNTRVJUKG50ZWFtcyA9PSB0ZWFtLT50LnRfcGFyZW50LT50LnRfbnByb2MpOworCisgICAgLy8gY29tcHV0ZSB0cmlwIGNvdW50CisgICAgaWYoIGluY3IgPT0gMSApIHsKKyAgICAgICAgdHJpcF9jb3VudCA9IHVwcGVyIC0gbG93ZXIgKyAxOworICAgIH0gZWxzZSBpZihpbmNyID09IC0xKSB7CisgICAgICAgIHRyaXBfY291bnQgPSBsb3dlciAtIHVwcGVyICsgMTsKKyAgICB9IGVsc2UgeworICAgICAgICB0cmlwX2NvdW50ID0gKFNUKSh1cHBlciAtIGxvd2VyKSAvIGluY3IgKyAxOyAvLyBjYXN0IHRvIHNpZ25lZCB0byBjb3ZlciBpbmNyPDAgY2FzZQorICAgIH0KKyAgICBpZiggY2h1bmsgPCAxICkKKyAgICAgICAgY2h1bmsgPSAxOworICAgIHNwYW4gPSBjaHVuayAqIGluY3I7CisgICAgKnBfc3QgPSBzcGFuICogbnRlYW1zOworICAgICpwX2xiID0gbG93ZXIgKyAoc3BhbiAqIHRlYW1faWQpOworICAgICpwX3ViID0gKnBfbGIgKyBzcGFuIC0gaW5jcjsKKyAgICBpZiAoIHBfbGFzdCAhPSBOVUxMICkKKyAgICAgICAgKnBfbGFzdCA9ICh0ZWFtX2lkID09ICgodHJpcF9jb3VudCAtIDEpLyhVVCljaHVuaykgJSBudGVhbXMpOworICAgIC8vIENvcnJlY3QgdXBwZXIgYm91bmQgaWYgbmVlZGVkCisgICAgaWYoIGluY3IgPiAwICkgeworICAgICAgICBpZiggKnBfdWIgPCAqcF9sYiApIC8vIG92ZXJmbG93PworICAgICAgICAgICAgKnBfdWIgPSBpX21heG1pbjwgVCA+OjpteDsKKyAgICAgICAgaWYoICpwX3ViID4gdXBwZXIgKQorICAgICAgICAgICAgKnBfdWIgPSB1cHBlcjsgLy8gdHJhY2tlciBDNzMyNTgKKyAgICB9IGVsc2UgeyAgIC8vIGluY3IgPCAwCisgICAgICAgIGlmKCAqcF91YiA+ICpwX2xiICkKKyAgICAgICAgICAgICpwX3ViID0gaV9tYXhtaW48IFQgPjo6bW47CisgICAgICAgIGlmKCAqcF91YiA8IHVwcGVyICkKKyAgICAgICAgICAgICpwX3ViID0gdXBwZXI7IC8vIHRyYWNrZXIgQzczMjU4CisgICAgfQorICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoICJfX2ttcF90ZWFtX3N0YXRpY19pbml0IGV4aXQ6IFQjJSVkIHRlYW0lJXUgbGl0ZXI9JSVkICJcCisgICAgICAgICAgICAiaXRlcj0oJSUlcywgJSUlcywgJSUlcykgY2h1bmsgJSUlc1xuIiwKKyAgICAgICAgICAgIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBTVCA+OjpzcGVjLAorICAgICAgICAgICAgdHJhaXRzX3Q8IFNUID46OnNwZWMgKTsKKyAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIGJ1ZmYsIGd0aWQsIHRlYW1faWQsICpwX2xhc3QsICpwX2xiLCAqcF91YiwgKnBfc3QsIGNodW5rICkgKTsKKyAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgfQorICAgICNlbmRpZgorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitleHRlcm4gIkMiIHsKKworLyohCitAaW5ncm91cCBXT1JLX1NIQVJJTkcKK0BwYXJhbSAgICBsb2MgICAgICAgU291cmNlIGNvZGUgbG9jYXRpb24KK0BwYXJhbSAgICBndGlkICAgICAgR2xvYmFsIHRocmVhZCBpZCBvZiB0aGlzIHRocmVhZAorQHBhcmFtICAgIHNjaGVkdHlwZSAgU2NoZWR1bGluZyB0eXBlCitAcGFyYW0gICAgcGxhc3RpdGVyIFBvaW50ZXIgdG8gdGhlICJsYXN0IGl0ZXJhdGlvbiIgZmxhZworQHBhcmFtICAgIHBsb3dlciAgICBQb2ludGVyIHRvIHRoZSBsb3dlciBib3VuZAorQHBhcmFtICAgIHB1cHBlciAgICBQb2ludGVyIHRvIHRoZSB1cHBlciBib3VuZAorQHBhcmFtICAgIHBzdHJpZGUgICBQb2ludGVyIHRvIHRoZSBzdHJpZGUKK0BwYXJhbSAgICBpbmNyICAgICAgTG9vcCBpbmNyZW1lbnQKK0BwYXJhbSAgICBjaHVuayAgICAgVGhlIGNodW5rIHNpemUKKworRWFjaCBvZiB0aGUgZm91ciBmdW5jdGlvbnMgaGVyZSBhcmUgaWRlbnRpY2FsIGFwYXJ0IGZyb20gdGhlIGFyZ3VtZW50IHR5cGVzLgorCitUaGUgZnVuY3Rpb25zIGNvbXB1dGUgdGhlIHVwcGVyIGFuZCBsb3dlciBib3VuZHMgYW5kIHN0cmlkZSB0byBiZSB1c2VkIGZvciB0aGUgc2V0IG9mIGl0ZXJhdGlvbnMKK3RvIGJlIGV4ZWN1dGVkIGJ5IHRoZSBjdXJyZW50IHRocmVhZCBmcm9tIHRoZSBzdGF0aWNhbGx5IHNjaGVkdWxlZCBsb29wIHRoYXQgaXMgZGVzY3JpYmVkIGJ5IHRoZQoraW5pdGlhbCB2YWx1ZXMgb2YgdGhlIGJvdW5kcywgc3RyaWRlLCBpbmNyZW1lbnQgYW5kIGNodW5rIHNpemUuCisKK0B7CisqLwordm9pZAorX19rbXBjX2Zvcl9zdGF0aWNfaW5pdF80KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgc2NoZWR0eXBlLCBrbXBfaW50MzIgKnBsYXN0aXRlciwKKyAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgKnBsb3dlciwga21wX2ludDMyICpwdXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyICpwc3RyaWRlLCBrbXBfaW50MzIgaW5jciwga21wX2ludDMyIGNodW5rICkKK3sKKyAgICBfX2ttcF9mb3Jfc3RhdGljX2luaXQ8IGttcF9pbnQzMiA+KAorICAgICAgICAgICAgICAgICAgICAgIGxvYywgZ3RpZCwgc2NoZWR0eXBlLCBwbGFzdGl0ZXIsIHBsb3dlciwgcHVwcGVyLCBwc3RyaWRlLCBpbmNyLCBjaHVuayApOworfQorCisvKiEKKyBTZWUgQHJlZiBfX2ttcGNfZm9yX3N0YXRpY19pbml0XzQKKyAqLwordm9pZAorX19rbXBjX2Zvcl9zdGF0aWNfaW5pdF80dSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyIHNjaGVkdHlwZSwga21wX2ludDMyICpwbGFzdGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAga21wX3VpbnQzMiAqcGxvd2VyLCBrbXBfdWludDMyICpwdXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyICpwc3RyaWRlLCBrbXBfaW50MzIgaW5jciwga21wX2ludDMyIGNodW5rICkKK3sKKyAgICBfX2ttcF9mb3Jfc3RhdGljX2luaXQ8IGttcF91aW50MzIgPigKKyAgICAgICAgICAgICAgICAgICAgICBsb2MsIGd0aWQsIHNjaGVkdHlwZSwgcGxhc3RpdGVyLCBwbG93ZXIsIHB1cHBlciwgcHN0cmlkZSwgaW5jciwgY2h1bmsgKTsKK30KKworLyohCisgU2VlIEByZWYgX19rbXBjX2Zvcl9zdGF0aWNfaW5pdF80CisgKi8KK3ZvaWQKK19fa21wY19mb3Jfc3RhdGljX2luaXRfOCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyIHNjaGVkdHlwZSwga21wX2ludDMyICpwbGFzdGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0ICpwbG93ZXIsIGttcF9pbnQ2NCAqcHVwcGVyLAorICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCAqcHN0cmlkZSwga21wX2ludDY0IGluY3IsIGttcF9pbnQ2NCBjaHVuayApCit7CisgICAgX19rbXBfZm9yX3N0YXRpY19pbml0PCBrbXBfaW50NjQgPigKKyAgICAgICAgICAgICAgICAgICAgICBsb2MsIGd0aWQsIHNjaGVkdHlwZSwgcGxhc3RpdGVyLCBwbG93ZXIsIHB1cHBlciwgcHN0cmlkZSwgaW5jciwgY2h1bmsgKTsKK30KKworLyohCisgU2VlIEByZWYgX19rbXBjX2Zvcl9zdGF0aWNfaW5pdF80CisgKi8KK3ZvaWQKK19fa21wY19mb3Jfc3RhdGljX2luaXRfOHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiBzY2hlZHR5cGUsIGttcF9pbnQzMiAqcGxhc3RpdGVyLAorICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50NjQgKnBsb3dlciwga21wX3VpbnQ2NCAqcHVwcGVyLAorICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCAqcHN0cmlkZSwga21wX2ludDY0IGluY3IsIGttcF9pbnQ2NCBjaHVuayApCit7CisgICAgX19rbXBfZm9yX3N0YXRpY19pbml0PCBrbXBfdWludDY0ID4oCisgICAgICAgICAgICAgICAgICAgICAgbG9jLCBndGlkLCBzY2hlZHR5cGUsIHBsYXN0aXRlciwgcGxvd2VyLCBwdXBwZXIsIHBzdHJpZGUsIGluY3IsIGNodW5rICk7Cit9CisvKiEKK0B9CisqLworCisvKiEKK0Bpbmdyb3VwIFdPUktfU0hBUklORworQHBhcmFtICAgIGxvYyAgICAgICBTb3VyY2UgY29kZSBsb2NhdGlvbgorQHBhcmFtICAgIGd0aWQgICAgICBHbG9iYWwgdGhyZWFkIGlkIG9mIHRoaXMgdGhyZWFkCitAcGFyYW0gICAgc2NoZWR1bGUgIFNjaGVkdWxpbmcgdHlwZSBmb3IgdGhlIHBhcmFsbGVsIGxvb3AKK0BwYXJhbSAgICBwbGFzdGl0ZXIgUG9pbnRlciB0byB0aGUgImxhc3QgaXRlcmF0aW9uIiBmbGFnCitAcGFyYW0gICAgcGxvd2VyICAgIFBvaW50ZXIgdG8gdGhlIGxvd2VyIGJvdW5kCitAcGFyYW0gICAgcHVwcGVyICAgIFBvaW50ZXIgdG8gdGhlIHVwcGVyIGJvdW5kIG9mIGxvb3AgY2h1bmsKK0BwYXJhbSAgICBwdXBwZXJEICAgUG9pbnRlciB0byB0aGUgdXBwZXIgYm91bmQgb2YgZGlzdF9jaHVuaworQHBhcmFtICAgIHBzdHJpZGUgICBQb2ludGVyIHRvIHRoZSBzdHJpZGUgZm9yIHBhcmFsbGVsIGxvb3AKK0BwYXJhbSAgICBpbmNyICAgICAgTG9vcCBpbmNyZW1lbnQKK0BwYXJhbSAgICBjaHVuayAgICAgVGhlIGNodW5rIHNpemUgZm9yIHRoZSBwYXJhbGxlbCBsb29wCisKK0VhY2ggb2YgdGhlIGZvdXIgZnVuY3Rpb25zIGhlcmUgYXJlIGlkZW50aWNhbCBhcGFydCBmcm9tIHRoZSBhcmd1bWVudCB0eXBlcy4KKworVGhlIGZ1bmN0aW9ucyBjb21wdXRlIHRoZSB1cHBlciBhbmQgbG93ZXIgYm91bmRzIGFuZCBzdHJpZGVzIHRvIGJlIHVzZWQgZm9yIHRoZSBzZXQgb2YgaXRlcmF0aW9ucwordG8gYmUgZXhlY3V0ZWQgYnkgdGhlIGN1cnJlbnQgdGhyZWFkIGZyb20gdGhlIHN0YXRpY2FsbHkgc2NoZWR1bGVkIGxvb3AgdGhhdCBpcyBkZXNjcmliZWQgYnkgdGhlCitpbml0aWFsIHZhbHVlcyBvZiB0aGUgYm91bmRzLCBzdHJpZGVzLCBpbmNyZW1lbnQgYW5kIGNodW5rcyBmb3IgcGFyYWxsZWwgbG9vcCBhbmQgZGlzdHJpYnV0ZQorY29uc3RydWN0cy4KKworQHsKKyovCit2b2lkCitfX2ttcGNfZGlzdF9mb3Jfc3RhdGljX2luaXRfNCgKKyAgICBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgc2NoZWR1bGUsIGttcF9pbnQzMiAqcGxhc3RpdGVyLAorICAgIGttcF9pbnQzMiAqcGxvd2VyLCBrbXBfaW50MzIgKnB1cHBlciwga21wX2ludDMyICpwdXBwZXJELAorICAgIGttcF9pbnQzMiAqcHN0cmlkZSwga21wX2ludDMyIGluY3IsIGttcF9pbnQzMiBjaHVuayApCit7CisgICAgX19rbXBfZGlzdF9mb3Jfc3RhdGljX2luaXQ8IGttcF9pbnQzMiA+KAorICAgICAgICBsb2MsIGd0aWQsIHNjaGVkdWxlLCBwbGFzdGl0ZXIsIHBsb3dlciwgcHVwcGVyLCBwdXBwZXJELCBwc3RyaWRlLCBpbmNyLCBjaHVuayApOworfQorCisvKiEKKyBTZWUgQHJlZiBfX2ttcGNfZGlzdF9mb3Jfc3RhdGljX2luaXRfNAorICovCit2b2lkCitfX2ttcGNfZGlzdF9mb3Jfc3RhdGljX2luaXRfNHUoCisgICAgaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyIHNjaGVkdWxlLCBrbXBfaW50MzIgKnBsYXN0aXRlciwKKyAgICBrbXBfdWludDMyICpwbG93ZXIsIGttcF91aW50MzIgKnB1cHBlciwga21wX3VpbnQzMiAqcHVwcGVyRCwKKyAgICBrbXBfaW50MzIgKnBzdHJpZGUsIGttcF9pbnQzMiBpbmNyLCBrbXBfaW50MzIgY2h1bmsgKQoreworICAgIF9fa21wX2Rpc3RfZm9yX3N0YXRpY19pbml0PCBrbXBfdWludDMyID4oCisgICAgICAgIGxvYywgZ3RpZCwgc2NoZWR1bGUsIHBsYXN0aXRlciwgcGxvd2VyLCBwdXBwZXIsIHB1cHBlckQsIHBzdHJpZGUsIGluY3IsIGNodW5rICk7Cit9CisKKy8qIQorIFNlZSBAcmVmIF9fa21wY19kaXN0X2Zvcl9zdGF0aWNfaW5pdF80CisgKi8KK3ZvaWQKK19fa21wY19kaXN0X2Zvcl9zdGF0aWNfaW5pdF84KAorICAgIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiBzY2hlZHVsZSwga21wX2ludDMyICpwbGFzdGl0ZXIsCisgICAga21wX2ludDY0ICpwbG93ZXIsIGttcF9pbnQ2NCAqcHVwcGVyLCBrbXBfaW50NjQgKnB1cHBlckQsCisgICAga21wX2ludDY0ICpwc3RyaWRlLCBrbXBfaW50NjQgaW5jciwga21wX2ludDY0IGNodW5rICkKK3sKKyAgICBfX2ttcF9kaXN0X2Zvcl9zdGF0aWNfaW5pdDwga21wX2ludDY0ID4oCisgICAgICAgIGxvYywgZ3RpZCwgc2NoZWR1bGUsIHBsYXN0aXRlciwgcGxvd2VyLCBwdXBwZXIsIHB1cHBlckQsIHBzdHJpZGUsIGluY3IsIGNodW5rICk7Cit9CisKKy8qIQorIFNlZSBAcmVmIF9fa21wY19kaXN0X2Zvcl9zdGF0aWNfaW5pdF80CisgKi8KK3ZvaWQKK19fa21wY19kaXN0X2Zvcl9zdGF0aWNfaW5pdF84dSgKKyAgICBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgc2NoZWR1bGUsIGttcF9pbnQzMiAqcGxhc3RpdGVyLAorICAgIGttcF91aW50NjQgKnBsb3dlciwga21wX3VpbnQ2NCAqcHVwcGVyLCBrbXBfdWludDY0ICpwdXBwZXJELAorICAgIGttcF9pbnQ2NCAqcHN0cmlkZSwga21wX2ludDY0IGluY3IsIGttcF9pbnQ2NCBjaHVuayApCit7CisgICAgX19rbXBfZGlzdF9mb3Jfc3RhdGljX2luaXQ8IGttcF91aW50NjQgPigKKyAgICAgICAgbG9jLCBndGlkLCBzY2hlZHVsZSwgcGxhc3RpdGVyLCBwbG93ZXIsIHB1cHBlciwgcHVwcGVyRCwgcHN0cmlkZSwgaW5jciwgY2h1bmsgKTsKK30KKy8qIQorQH0KKyovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEF1eGlsaWFyeSByb3V0aW5lcyBmb3IgRGlzdHJpYnV0ZSBQYXJhbGxlbCBMb29wIGNvbnN0cnVjdCBpbXBsZW1lbnRhdGlvbgorLy8gICAgVHJhbnNmZXIgY2FsbCB0byB0ZW1wbGF0ZTwgdHlwZSBUID4KKy8vICAgIF9fa21wX3RlYW1fc3RhdGljX2luaXQoIGlkZW50X3QgKmxvYywgaW50IGd0aWQsCisvLyAgICAgICAgaW50ICpwX2xhc3QsIFQgKmxiLCBUICp1YiwgU1QgKnN0LCBTVCBpbmNyLCBTVCBjaHVuayApCisKKy8qIQorQGluZ3JvdXAgV09SS19TSEFSSU5HCitAeworQHBhcmFtIGxvYyBTb3VyY2UgbG9jYXRpb24KK0BwYXJhbSBndGlkIEdsb2JhbCB0aHJlYWQgaWQKK0BwYXJhbSBwX2xhc3QgcG9pbnRlciB0byBsYXN0IGl0ZXJhdGlvbiBmbGFnCitAcGFyYW0gcF9sYiAgcG9pbnRlciB0byBMb3dlciBib3VuZAorQHBhcmFtIHBfdWIgIHBvaW50ZXIgdG8gVXBwZXIgYm91bmQKK0BwYXJhbSBwX3N0ICBTdGVwIChvciBpbmNyZW1lbnQgaWYgeW91IHByZWZlcikKK0BwYXJhbSBpbmNyICBMb29wIGluY3JlbWVudAorQHBhcmFtIGNodW5rIFRoZSBjaHVuayBzaXplIHRvIGJsb2NrIHdpdGgKKworVGhlIGZ1bmN0aW9ucyBjb21wdXRlIHRoZSB1cHBlciBhbmQgbG93ZXIgYm91bmRzIGFuZCBzdHJpZGUgdG8gYmUgdXNlZCBmb3IgdGhlIHNldCBvZiBpdGVyYXRpb25zCit0byBiZSBleGVjdXRlZCBieSB0aGUgY3VycmVudCB0ZWFtIGZyb20gdGhlIHN0YXRpY2FsbHkgc2NoZWR1bGVkIGxvb3AgdGhhdCBpcyBkZXNjcmliZWQgYnkgdGhlCitpbml0aWFsIHZhbHVlcyBvZiB0aGUgYm91bmRzLCBzdHJpZGUsIGluY3JlbWVudCBhbmQgY2h1bmsgZm9yIHRoZSBkaXN0cmlidXRlIGNvbnN0cnVjdCBhcyBwYXJ0IG9mCitjb21wb3NpdGUgZGlzdHJpYnV0ZSBwYXJhbGxlbCBsb29wIGNvbnN0cnVjdC4KK1RoZXNlIGZ1bmN0aW9ucyBhcmUgYWxsIGlkZW50aWNhbCBhcGFydCBmcm9tIHRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzLgorKi8KKwordm9pZAorX19rbXBjX3RlYW1fc3RhdGljX2luaXRfNCgKKyAgICBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgKnBfbGFzdCwKKyAgICBrbXBfaW50MzIgKnBfbGIsIGttcF9pbnQzMiAqcF91Yiwga21wX2ludDMyICpwX3N0LCBrbXBfaW50MzIgaW5jciwga21wX2ludDMyIGNodW5rICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworICAgIF9fa21wX3RlYW1fc3RhdGljX2luaXQ8IGttcF9pbnQzMiA+KCBsb2MsIGd0aWQsIHBfbGFzdCwgcF9sYiwgcF91YiwgcF9zdCwgaW5jciwgY2h1bmsgKTsKK30KKworLyohCisgU2VlIEByZWYgX19rbXBjX3RlYW1fc3RhdGljX2luaXRfNAorICovCit2b2lkCitfX2ttcGNfdGVhbV9zdGF0aWNfaW5pdF80dSgKKyAgICBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgKnBfbGFzdCwKKyAgICBrbXBfdWludDMyICpwX2xiLCBrbXBfdWludDMyICpwX3ViLCBrbXBfaW50MzIgKnBfc3QsIGttcF9pbnQzMiBpbmNyLCBrbXBfaW50MzIgY2h1bmsgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisgICAgX19rbXBfdGVhbV9zdGF0aWNfaW5pdDwga21wX3VpbnQzMiA+KCBsb2MsIGd0aWQsIHBfbGFzdCwgcF9sYiwgcF91YiwgcF9zdCwgaW5jciwgY2h1bmsgKTsKK30KKworLyohCisgU2VlIEByZWYgX19rbXBjX3RlYW1fc3RhdGljX2luaXRfNAorICovCit2b2lkCitfX2ttcGNfdGVhbV9zdGF0aWNfaW5pdF84KAorICAgIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiAqcF9sYXN0LAorICAgIGttcF9pbnQ2NCAqcF9sYiwga21wX2ludDY0ICpwX3ViLCBrbXBfaW50NjQgKnBfc3QsIGttcF9pbnQ2NCBpbmNyLCBrbXBfaW50NjQgY2h1bmsgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisgICAgX19rbXBfdGVhbV9zdGF0aWNfaW5pdDwga21wX2ludDY0ID4oIGxvYywgZ3RpZCwgcF9sYXN0LCBwX2xiLCBwX3ViLCBwX3N0LCBpbmNyLCBjaHVuayApOworfQorCisvKiEKKyBTZWUgQHJlZiBfX2ttcGNfdGVhbV9zdGF0aWNfaW5pdF80CisgKi8KK3ZvaWQKK19fa21wY190ZWFtX3N0YXRpY19pbml0Xzh1KAorICAgIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiAqcF9sYXN0LAorICAgIGttcF91aW50NjQgKnBfbGIsIGttcF91aW50NjQgKnBfdWIsIGttcF9pbnQ2NCAqcF9zdCwga21wX2ludDY0IGluY3IsIGttcF9pbnQ2NCBjaHVuayApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKyAgICBfX2ttcF90ZWFtX3N0YXRpY19pbml0PCBrbXBfdWludDY0ID4oIGxvYywgZ3RpZCwgcF9sYXN0LCBwX2xiLCBwX3ViLCBwX3N0LCBpbmNyLCBjaHVuayApOworfQorLyohCitAfQorKi8KKworfSAvLyBleHRlcm4gIkMiCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zZXR0aW5ncy5jIGIvZmluYWwvcnVudGltZS9zcmMva21wX3NldHRpbmdzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY3NTc0ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zZXR0aW5ncy5jCkBAIC0wLDAgKzEsNTQ2OSBAQAorLyoKKyAqIGttcF9zZXR0aW5ncy5jIC0tIEluaXRpYWxpemUgZW52aXJvbm1lbnQgdmFyaWFibGVzCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfd3JhcHBlcl9nZXRwaWQuaCIKKyNpbmNsdWRlICJrbXBfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJrbXBfYXRvbWljLmgiCisjaW5jbHVkZSAia21wX2l0dC5oIgorI2luY2x1ZGUgImttcF9zdHIuaCIKKyNpbmNsdWRlICJrbXBfc2V0dGluZ3MuaCIKKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorI2luY2x1ZGUgImttcF9pby5oIgorCitzdGF0aWMgaW50IF9fa21wX2Vudl90b1ByaW50KCBjaGFyIGNvbnN0ICogbmFtZSwgaW50IGZsYWcgKTsKKworYm9vbCBfX2ttcF9lbnZfZm9ybWF0ID0gMDsgLy8gMCAtIG9sZCBmb3JtYXQ7IDEgLSBuZXcgZm9ybWF0CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIZWxwZXIgc3RyaW5nIGZ1bmN0aW9ucy4gU3ViamVjdCB0byBtb3ZlIHRvIGttcF9zdHIuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBkb3VibGUKK19fa21wX2NvbnZlcnRfdG9fZG91YmxlKCBjaGFyIGNvbnN0ICogcyApCit7CisgICAgZG91YmxlIHJlc3VsdDsKKworICAgIGlmICggS01QX1NTQ0FORiggcywgIiVsZiIsICZyZXN1bHQgKSA8IDEgKSB7CisgICAgICAgIHJlc3VsdCA9IDAuMDsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisjaWZkZWYgS01QX0RFQlVHCitzdGF0aWMgdW5zaWduZWQgaW50CitfX2ttcF9yZWFkc3RyX3dpdGhfc2VudGluZWwoY2hhciAqZGVzdCwgY2hhciBjb25zdCAqIHNyYywgc2l6ZV90IGxlbiwgY2hhciBzZW50aW5lbCkgeworICAgIHVuc2lnbmVkIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICBpZiAoKCpzcmMgPT0gJ1wwJykgfHwgKCpzcmMgPT0gc2VudGluZWwpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAqKGRlc3QrKykgPSAqKHNyYysrKTsKKyAgICB9CisgICAgKmRlc3QgPSAnXDAnOworICAgIHJldHVybiBpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQKK19fa21wX21hdGNoX3dpdGhfc2VudGluZWwoIGNoYXIgY29uc3QgKiBhLCBjaGFyIGNvbnN0ICogYiwgc2l6ZV90IGxlbiwgY2hhciBzZW50aW5lbCApIHsKKyAgICBzaXplX3QgbCA9IDA7CisKKyAgICBpZihhID09IE5VTEwpCisgICAgICAgIGEgPSAiIjsKKyAgICBpZihiID09IE5VTEwpCisgICAgICAgIGIgPSAiIjsKKyAgICB3aGlsZSgqYSAmJiAqYiAmJiAqYiAhPSBzZW50aW5lbCkgeworICAgICAgICBjaGFyIGNhID0gKmEsIGNiID0gKmI7CisKKyAgICAgICAgaWYoY2EgPj0gJ2EnICYmIGNhIDw9ICd6JykKKyAgICAgICAgICAgIGNhIC09ICdhJyAtICdBJzsKKyAgICAgICAgaWYoY2IgPj0gJ2EnICYmIGNiIDw9ICd6JykKKyAgICAgICAgICAgIGNiIC09ICdhJyAtICdBJzsKKyAgICAgICAgaWYoY2EgIT0gY2IpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICsrbDsKKyAgICAgICAgKythOworICAgICAgICArK2I7CisgICAgfQorICAgIHJldHVybiBsID49IGxlbjsKK30KKworLy8KKy8vIEV4cGVjdGVkIHVzYWdlOgorLy8gICAgIHRva2VuIGlzIHRoZSB0b2tlbiB0byBjaGVjayBmb3IuCisvLyAgICAgYnVmIGlzIHRoZSBzdHJpbmcgYmVpbmcgcGFyc2VkLgorLy8gICAgICplbmQgcmV0dXJucyB0aGUgY2hhciBhZnRlciB0aGUgZW5kIG9mIHRoZSB0b2tlbi4KKy8vICAgICAgICBpdCBpcyBub3QgbW9kaWZpZWQgdW5sZXNzIGEgbWF0Y2ggb2NjdXJzLgorLy8KKy8vCisvLyBFeGFtcGxlIDE6CisvLworLy8gICAgIGlmIChfX2ttcF9tYXRjaF9zdHIoInRva2VuIiwgYnVmLCAqZW5kKSB7CisvLyAgICAgICAgIDxkbyBzb21ldGhpbmc+CisvLyAgICAgICAgIGJ1ZiA9IGVuZDsKKy8vICAgICB9CisvLworLy8gIEV4YW1wbGUgMjoKKy8vCisvLyAgICAgaWYgKF9fa21wX21hdGNoX3N0cigidG9rZW4iLCBidWYsICplbmQpIHsKKy8vICAgICAgICAgY2hhciAqc2F2ZSA9ICoqZW5kOworLy8gICAgICAgICAqKmVuZCA9IHNlbnRpbmVsOworLy8gICAgICAgICA8dXNlIGFueSBvZiB0aGUgX19rbXAqX3dpdGhfc2VudGluZWwoKSBmdW5jdGlvbnM+CisvLyAgICAgICAgICoqZW5kID0gc2F2ZTsKKy8vICAgICAgICAgYnVmID0gZW5kOworLy8gICAgIH0KKy8vCisKK3N0YXRpYyBpbnQKK19fa21wX21hdGNoX3N0ciggY2hhciBjb25zdCAqdG9rZW4sIGNoYXIgY29uc3QgKmJ1ZiwgY29uc3QgY2hhciAqKmVuZCkgeworCisgICAgS01QX0FTU0VSVCh0b2tlbiAhPSBOVUxMKTsKKyAgICBLTVBfQVNTRVJUKGJ1ZiAhPSBOVUxMKTsKKyAgICBLTVBfQVNTRVJUKGVuZCAhPSBOVUxMKTsKKworICAgIHdoaWxlICgqdG9rZW4gJiYgKmJ1ZikgeworICAgICAgICBjaGFyIGN0ID0gKnRva2VuLCBjYiA9ICpidWY7CisKKyAgICAgICAgaWYoY3QgPj0gJ2EnICYmIGN0IDw9ICd6JykKKyAgICAgICAgICAgIGN0IC09ICdhJyAtICdBJzsKKyAgICAgICAgaWYoY2IgPj0gJ2EnICYmIGNiIDw9ICd6JykKKyAgICAgICAgICAgIGNiIC09ICdhJyAtICdBJzsKKyAgICAgICAgaWYgKGN0ICE9IGNiKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICArK3Rva2VuOworICAgICAgICArK2J1ZjsKKyAgICB9CisgICAgaWYgKCp0b2tlbikgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgICplbmQgPSBidWY7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworc3RhdGljIHNpemVfdAorX19rbXBfcm91bmQ0ayggc2l6ZV90IHNpemUgKSB7CisgICAgc2l6ZV90IF80ayA9IDQgKiAxMDI0OworICAgIGlmICggc2l6ZSAmICggXzRrIC0gMSApICkgeworICAgICAgICBzaXplICY9IH4gKCBfNGsgLSAxICk7CisgICAgICAgIGlmICggc2l6ZSA8PSBLTVBfU0laRV9UX01BWCAtIF80ayApIHsKKyAgICAgICAgICAgIHNpemUgKz0gXzRrOyAgICAvLyBSb3VuZCB1cCBpZiB0aGVyZSBpcyBubyBvdmVyZmxvdy4KKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBpZgorICAgIHJldHVybiBzaXplOworfSAvLyBfX2ttcF9yb3VuZDRrCisKKworLyoKKyAgICBIZXJlLCBtdWx0aXBsaWVycyBhcmUgbGlrZSBfX2ttcF9jb252ZXJ0X3RvX3NlY29uZHMsIGJ1dCBmbG9hdGluZy1wb2ludAorICAgIHZhbHVlcyBhcmUgYWxsb3dlZCwgYW5kIHRoZSByZXR1cm4gdmFsdWUgaXMgaW4gbWlsbGlzZWNvbmRzLiAgVGhlIGRlZmF1bHQKKyAgICBtdWx0aXBsaWVyIGlzIG1pbGxpc2Vjb25kcy4gIFJldHVybnMgSU5UX01BWCBvbmx5IGlmIHRoZSB2YWx1ZSBzcGVjaWZpZWQKKyAgICBtYXRjaGVzICJpbmZpbml0KiIuICBSZXR1cm5zIC0xIGlmIHNwZWNpZmllZCBzdHJpbmcgaXMgaW52YWxpZC4KKyovCitpbnQKK19fa21wX2NvbnZlcnRfdG9fbWlsbGlzZWNvbmRzKCBjaGFyIGNvbnN0ICogZGF0YSApCit7CisgICAgaW50IHJldCwgbnZhbHVlcywgZmFjdG9yOworICAgIGNoYXIgbXVsdCwgZXh0cmE7CisgICAgZG91YmxlIHZhbHVlOworCisgICAgaWYgKGRhdGEgPT0gTlVMTCkgcmV0dXJuICgtMSk7CisgICAgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJpbmZpbml0IiwgLTEsIGRhdGEpKSByZXR1cm4gKElOVF9NQVgpOworICAgIHZhbHVlID0gKGRvdWJsZSkgMC4wOworICAgIG11bHQgPSAnXDAnOworICAgIG52YWx1ZXMgPSBLTVBfU1NDQU5GIChkYXRhLCAiJWxmJWMlYyIsICZ2YWx1ZSwgJm11bHQsICZleHRyYSk7CisgICAgaWYgKG52YWx1ZXMgPCAxKSByZXR1cm4gKC0xKTsKKyAgICBpZiAobnZhbHVlcyA9PSAxKSBtdWx0ID0gJ1wwJzsKKyAgICBpZiAobnZhbHVlcyA9PSAzKSByZXR1cm4gKC0xKTsKKworICAgIGlmICh2YWx1ZSA8IDApICAgIHJldHVybiAoLTEpOworCisgICAgc3dpdGNoIChtdWx0KSB7CisgICAgY2FzZSAnXDAnOgorICAgICAgICAvKiAgZGVmYXVsdCBpcyBtaWxsaXNlY29uZHMgICovCisgICAgICAgIGZhY3RvciA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ3MnOiBjYXNlICdTJzoKKyAgICAgICAgZmFjdG9yID0gMTAwMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnbSc6IGNhc2UgJ00nOgorICAgICAgICBmYWN0b3IgPSAxMDAwICogNjA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ2gnOiBjYXNlICdIJzoKKyAgICAgICAgZmFjdG9yID0gMTAwMCAqIDYwICogNjA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ2QnOiBjYXNlICdEJzoKKyAgICAgICAgZmFjdG9yID0gMTAwMCAqIDI0ICogNjAgKiA2MDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuICgtMSk7CisgICAgfQorCisgICAgaWYgKCB2YWx1ZSA+PSAoIChJTlRfTUFYLTEpIC8gZmFjdG9yKSApCisgICAgICAgIHJldCA9IElOVF9NQVgtMTsgICAgICAgIC8qIERvbid0IGFsbG93IGluZmluaXRlIHZhbHVlIGhlcmUgKi8KKyAgICBlbHNlCisgICAgICAgIHJldCA9IChpbnQpICh2YWx1ZSAqIChkb3VibGUpIGZhY3Rvcik7ICAvKiB0cnVuY2F0ZSB0byBpbnQgICovCisKKyAgICByZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQKK19fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCggY2hhciBjb25zdCAqIGEsIGNoYXIgY29uc3QgKiBiLCBjaGFyIHNlbnRpbmVsICkgeworICAgIGlmKGEgPT0gTlVMTCkKKyAgICAgICAgYSA9ICIiOworICAgIGlmKGIgPT0gTlVMTCkKKyAgICAgICAgYiA9ICIiOworICAgIHdoaWxlKCphICYmICpiICYmICpiICE9IHNlbnRpbmVsKSB7CisgICAgICAgIGNoYXIgY2EgPSAqYSwgY2IgPSAqYjsKKworICAgICAgICBpZihjYSA+PSAnYScgJiYgY2EgPD0gJ3onKQorICAgICAgICAgICAgY2EgLT0gJ2EnIC0gJ0EnOworICAgICAgICBpZihjYiA+PSAnYScgJiYgY2IgPD0gJ3onKQorICAgICAgICAgICAgY2IgLT0gJ2EnIC0gJ0EnOworICAgICAgICBpZihjYSAhPSBjYikKKyAgICAgICAgICAgIHJldHVybiAoaW50KSh1bnNpZ25lZCBjaGFyKSphIC0gKGludCkodW5zaWduZWQgY2hhcikqYjsKKyAgICAgICAgKythOworICAgICAgICArK2I7CisgICAgfQorICAgIHJldHVybiAqYSA/CisgICAgICAgICgqYiAmJiAqYiAhPSBzZW50aW5lbCkgPyAoaW50KSh1bnNpZ25lZCBjaGFyKSphIC0gKGludCkodW5zaWduZWQgY2hhcikqYiA6IDEgOgorICAgICAgICAoKmIgJiYgKmIgIT0gc2VudGluZWwpID8gLTEgOiAwOworfQorCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFRhYmxlIHN0cnVjdHVyZXMgYW5kIGhlbHBlciBmdW5jdGlvbnMuCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3R5cGVkZWYgc3RydWN0IF9fa21wX3NldHRpbmcgICAgICAgIGttcF9zZXR0aW5nX3Q7Cit0eXBlZGVmIHN0cnVjdCBfX2ttcF9zdGdfc3NfZGF0YSAgICBrbXBfc3RnX3NzX2RhdGFfdDsKK3R5cGVkZWYgc3RydWN0IF9fa21wX3N0Z193cF9kYXRhICAgIGttcF9zdGdfd3BfZGF0YV90OwordHlwZWRlZiBzdHJ1Y3QgX19rbXBfc3RnX2ZyX2RhdGEgICAga21wX3N0Z19mcl9kYXRhX3Q7CisKK3R5cGVkZWYgdm9pZCAoICoga21wX3N0Z19wYXJzZV9mdW5jX3QgKSggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKTsKK3R5cGVkZWYgdm9pZCAoICoga21wX3N0Z19wcmludF9mdW5jX3QgKSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICk7CisKK3N0cnVjdCBfX2ttcF9zZXR0aW5nIHsKKyAgICBjaGFyIGNvbnN0ICogICAgICAgICBuYW1lOyAgICAgICAgLy8gTmFtZSBvZiBzZXR0aW5nIChlbnZpcm9ubWVudCB2YXJpYWJsZSkuCisgICAga21wX3N0Z19wYXJzZV9mdW5jX3QgcGFyc2U7ICAgICAgIC8vIFBhcnNlciBmdW5jdGlvbi4KKyAgICBrbXBfc3RnX3ByaW50X2Z1bmNfdCBwcmludDsgICAgICAgLy8gUHJpbnQgZnVuY3Rpb24uCisgICAgdm9pZCAqICAgICAgICAgICAgICAgZGF0YTsgICAgICAgIC8vIERhdGEgcGFzc2VkIHRvIHBhcnNlciBhbmQgcHJpbnRlci4KKyAgICBpbnQgICAgICAgICAgICAgICAgICBzZXQ7ICAgICAgICAgLy8gVmFyaWFibGUgc2V0IGR1cmluZyB0aGlzICJzZXNzaW9uIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgKF9fa21wX2Vudl9pbml0aWFsaXplKCkgb3Iga21wX3NldF9kZWZhdWx0cygpIGNhbGwpLgorICAgIGludCAgICAgICAgICAgICAgICAgIGRlZmluZWQ7ICAgICAvLyBWYXJpYWJsZSBzZXQgaW4gYW55ICJzZXNzaW9uIi4KK307IC8vIHN0cnVjdCBfX2ttcF9zZXR0aW5nCisKK3N0cnVjdCBfX2ttcF9zdGdfc3NfZGF0YSB7CisgICAgc2l6ZV90ICAgICAgICAgICAgIGZhY3RvcjsgIC8vIERlZmF1bHQgZmFjdG9yOiAxIGZvciBLTVBfU1RBQ0tTSVpFLCAxMDI0IGZvciBvdGhlcnMuCisgICAga21wX3NldHRpbmdfdCAqICogIHJpdmFsczsgIC8vIEFycmF5IG9mIHBvaW50ZXJzIHRvIHJpdmFscyAoaW5jbHVkaW5nIGl0c2VsZikuCit9OyAvLyBzdHJ1Y3QgX19rbXBfc3RnX3NzX2RhdGEKKworc3RydWN0IF9fa21wX3N0Z193cF9kYXRhIHsKKyAgICBpbnQgICAgICAgICAgICAgICAgb21wOyAgICAgLy8gMCAtLSBLTVBfTElCUkFSWSwgMSAtLSBPTVBfV0FJVF9QT0xJQ1kuCisgICAga21wX3NldHRpbmdfdCAqICogIHJpdmFsczsgIC8vIEFycmF5IG9mIHBvaW50ZXJzIHRvIHJpdmFscyAoaW5jbHVkaW5nIGl0c2VsZikuCit9OyAvLyBzdHJ1Y3QgX19rbXBfc3RnX3dwX2RhdGEKKworc3RydWN0IF9fa21wX3N0Z19mcl9kYXRhIHsKKyAgICBpbnQgICAgICAgICAgICAgICAgZm9yY2U7ICAvLyAwIC0tIEtNUF9ERVRFUk1JTklTVElDX1JFRFVDVElPTiwgMSAtLSBLTVBfRk9SQ0VfUkVEVUNUSU9OLgorICAgIGttcF9zZXR0aW5nX3QgKiAqICByaXZhbHM7ICAvLyBBcnJheSBvZiBwb2ludGVycyB0byByaXZhbHMgKGluY2x1ZGluZyBpdHNlbGYpLgorfTsgLy8gc3RydWN0IF9fa21wX3N0Z19mcl9kYXRhCisKK3N0YXRpYyBpbnQKK19fa21wX3N0Z19jaGVja19yaXZhbHMoICAgICAgICAgIC8vIDAgLS0gT2ssIDEgLS0gZXJyb3JzIGZvdW5kLgorICAgIGNoYXIgY29uc3QgKiAgICAgICBuYW1lLCAgICAgLy8gTmFtZSBvZiB2YXJpYWJsZS4KKyAgICBjaGFyIGNvbnN0ICogICAgICAgdmFsdWUsICAgIC8vIFZhbHVlIG9mIHRoZSB2YXJpYWJsZS4KKyAgICBrbXBfc2V0dGluZ190ICogKiAgcml2YWxzICAgIC8vIExpc3Qgb2Ygcml2YWwgc2V0dGluZ3MgKHRoZSBsaXN0IG11c3QgaW5jbHVkZSBjdXJyZW50IG9uZSkuCispOworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhlbHBlciBwYXJzZSBmdW5jdGlvbnMuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfYm9vbCgKKyAgICBjaGFyIGNvbnN0ICogbmFtZSwKKyAgICBjaGFyIGNvbnN0ICogdmFsdWUsCisgICAgaW50ICogICAgICAgIG91dAorKSB7CisgICAgaWYgKCBfX2ttcF9zdHJfbWF0Y2hfdHJ1ZSggdmFsdWUgKSApIHsKKyAgICAgICAgKiBvdXQgPSBUUlVFOworICAgIH0gZWxzZSBpZiAoX19rbXBfc3RyX21hdGNoX2ZhbHNlKCB2YWx1ZSApICkgeworICAgICAgICAqIG91dCA9IEZBTFNFOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgIGttcF9tc193YXJuaW5nLAorICAgICAgICAgICAgS01QX01TRyggQmFkQm9vbFZhbHVlLCBuYW1lLCB2YWx1ZSApLAorICAgICAgICAgICAgS01QX0hOVCggVmFsaWRCb29sVmFsdWVzICksCisgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICApOworICAgIH07IC8vIGlmCit9IC8vIF9fa21wX3N0Z19wYXJzZV9ib29sCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2Vfc2l6ZSgKKyAgICBjaGFyIGNvbnN0ICogbmFtZSwKKyAgICBjaGFyIGNvbnN0ICogdmFsdWUsCisgICAgc2l6ZV90ICAgICAgIHNpemVfbWluLAorICAgIHNpemVfdCAgICAgICBzaXplX21heCwKKyAgICBpbnQgKiAgICAgICAgaXNfc3BlY2lmaWVkLAorICAgIHNpemVfdCAqICAgICBvdXQsCisgICAgc2l6ZV90ICAgICAgIGZhY3RvcgorKSB7CisgICAgY2hhciBjb25zdCAqIG1zZyA9IE5VTEw7CisgICAgI2lmIEtNUF9PU19EQVJXSU4KKyAgICAgICAgc2l6ZV9taW4gPSBfX2ttcF9yb3VuZDRrKCBzaXplX21pbiApOworICAgICAgICBzaXplX21heCA9IF9fa21wX3JvdW5kNGsoIHNpemVfbWF4ICk7CisgICAgI2VuZGlmIC8vIEtNUF9PU19EQVJXSU4KKyAgICBpZiAoIHZhbHVlICkgeworICAgICAgICBpZiAoIGlzX3NwZWNpZmllZCAhPSBOVUxMICkgeworICAgICAgICAgICAgKiBpc19zcGVjaWZpZWQgPSAxOworICAgICAgICB9OyAvLyBpZgorICAgICAgICBfX2ttcF9zdHJfdG9fc2l6ZSggdmFsdWUsIG91dCwgZmFjdG9yLCAmIG1zZyApOworICAgICAgICBpZiAoIG1zZyA9PSBOVUxMICkgeworICAgICAgICAgICAgaWYgKCAqIG91dCA+IHNpemVfbWF4ICkgeworICAgICAgICAgICAgICAgICogb3V0ID0gc2l6ZV9tYXg7CisgICAgICAgICAgICAgICAgbXNnID0gS01QX0kxOE5fU1RSKCBWYWx1ZVRvb0xhcmdlICk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCAqIG91dCA8IHNpemVfbWluICkgeworICAgICAgICAgICAgICAgICogb3V0ID0gc2l6ZV9taW47CisgICAgICAgICAgICAgICAgbXNnID0gS01QX0kxOE5fU1RSKCBWYWx1ZVRvb1NtYWxsICk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICNpZiBLTVBfT1NfREFSV0lOCisgICAgICAgICAgICAgICAgICAgIHNpemVfdCByb3VuZDRrID0gX19rbXBfcm91bmQ0ayggKiBvdXQgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAqIG91dCAhPSByb3VuZDRrICkgeworICAgICAgICAgICAgICAgICAgICAgICAgKiBvdXQgPSByb3VuZDRrOworICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gS01QX0kxOE5fU1RSKCBOb3RNdWx0aXBsZTRLICk7CisgICAgICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gSWYgaW50ZWdlciBvdmVyZmxvdyBvY2N1cnJlZCwgKiBvdXQgPT0gS01QX1NJWkVfVF9NQVguIEN1dCBpdCB0byBzaXplX21heCBzaWxlbnRseS4KKyAgICAgICAgICAgIGlmICggKiBvdXQgPCBzaXplX21pbiApIHsKKyAgICAgICAgICAgICAgICAqIG91dCA9IHNpemVfbWF4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoICogb3V0ID4gIHNpemVfbWF4ICkgeworICAgICAgICAgICAgICAgICogb3V0ID0gc2l6ZV9tYXg7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9OyAvLyBpZgorICAgICAgICBpZiAoIG1zZyAhPSBOVUxMICkgeworICAgICAgICAgICAgLy8gTWVzc2FnZSBpcyBub3QgZW1wdHkuIFByaW50IHdhcm5pbmcuCisgICAgICAgICAgICBrbXBfc3RyX2J1Zl90IGJ1ZjsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfaW5pdCggJiBidWYgKTsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnRfc2l6ZSggJiBidWYsICogb3V0ICk7CisgICAgICAgICAgICBLTVBfV0FSTklORyggUGFyc2VTaXplSW50V2FybiwgbmFtZSwgdmFsdWUsIG1zZyApOworICAgICAgICAgICAgS01QX0lORk9STSggVXNpbmdfc3RyX1ZhbHVlLCBuYW1lLCBidWYuc3RyICk7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoICYgYnVmICk7CisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gaWYKK30gLy8gX19rbXBfc3RnX3BhcnNlX3NpemUKKworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2Vfc3RyKAorICAgIGNoYXIgY29uc3QgKiAgICAgIG5hbWUsCisgICAgY2hhciBjb25zdCAqICAgICAgdmFsdWUsCisgICAgY2hhciBjb25zdCAqICogICAgb3V0CispIHsKKyAgICBLTVBfSU5URVJOQUxfRlJFRSggKHZvaWQgKikgKiBvdXQgKTsKKyAgICAqIG91dCA9IF9fa21wX3N0cl9mb3JtYXQoICIlcyIsIHZhbHVlICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9zdHIKKyNlbmRpZgorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2ludCgKKyAgICBjaGFyIGNvbnN0ICogbmFtZSwgICAvLyBJOiBOYW1lIG9mIGVudmlyb25tZW50IHZhcmlhYmxlICh1c2VkIGluIHdhcm5pbmcgbWVzc2FnZXMpLgorICAgIGNoYXIgY29uc3QgKiB2YWx1ZSwgIC8vIEk6IFZhbHVlIG9mIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHBhcnNlLgorICAgIGludCAgICAgICAgICBtaW4sICAgIC8vIEk6IE1pbWluYWwgYWxsb3dlZCB2YWx1ZS4KKyAgICBpbnQgICAgICAgICAgbWF4LCAgICAvLyBJOiBNYXhpbXVtIGFsbG93ZWQgdmFsdWUuCisgICAgaW50ICogICAgICAgIG91dCAgICAgLy8gTzogT3V0cHV0IChwYXJzZWQpIHZhbHVlLgorKSB7CisgICAgY2hhciBjb25zdCAqIG1zZyAgPSBOVUxMOworICAgIGttcF91aW50NjQgICB1aW50ID0gKiBvdXQ7CisgICAgX19rbXBfc3RyX3RvX3VpbnQoIHZhbHVlLCAmIHVpbnQsICYgbXNnICk7CisgICAgaWYgKCBtc2cgPT0gTlVMTCApIHsKKyAgICAgICAgaWYgKCB1aW50IDwgKHVuc2lnbmVkIGludCltaW4gKSB7CisgICAgICAgICAgICBtc2cgPSBLTVBfSTE4Tl9TVFIoIFZhbHVlVG9vU21hbGwgKTsKKyAgICAgICAgICAgIHVpbnQgPSBtaW47CisgICAgICAgIH0gZWxzZSBpZiAoIHVpbnQgPiAodW5zaWduZWQgaW50KW1heCApIHsKKyAgICAgICAgICAgIG1zZyA9IEtNUF9JMThOX1NUUiggVmFsdWVUb29MYXJnZSApOworICAgICAgICAgICAgdWludCA9IG1heDsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBJZiBvdmVyZmxvdyBvY2N1cnJlZCBtc2cgY29udGFpbnMgZXJyb3IgbWVzc2FnZSBhbmQgdWludCBpcyB2ZXJ5IGJpZy4gQ3V0IHRtcCBpdAorICAgICAgICAvLyB0byBJTlRfTUFYLgorICAgICAgICBpZiAoIHVpbnQgPCAodW5zaWduZWQgaW50KW1pbiApIHsKKyAgICAgICAgICAgIHVpbnQgPSBtaW47CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIHVpbnQgPiAodW5zaWduZWQgaW50KW1heCApIHsKKyAgICAgICAgICAgIHVpbnQgPSBtYXg7CisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gaWYKKyAgICBpZiAoIG1zZyAhPSBOVUxMICkgeworICAgICAgICAvLyBNZXNzYWdlIGlzIG5vdCBlbXB0eS4gUHJpbnQgd2FybmluZy4KKyAgICAgICAga21wX3N0cl9idWZfdCBidWY7CisgICAgICAgIEtNUF9XQVJOSU5HKCBQYXJzZVNpemVJbnRXYXJuLCBuYW1lLCB2YWx1ZSwgbXNnICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfaW5pdCggJiBidWYgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJmJ1ZiwgIiUiIEtNUF9VSU5UNjRfU1BFQyAiIiwgdWludCApOworICAgICAgICBLTVBfSU5GT1JNKCBVc2luZ191aW50NjRfVmFsdWUsIG5hbWUsIGJ1Zi5zdHIgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmYnVmICk7CisgICAgfTsgLy8gaWYKKyAgICAqIG91dCA9IHVpbnQ7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9pbnQKKworCisjaWYgS01QX0RFQlVHX0FEQVBUSVZFX0xPQ0tTCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2ZpbGUoCisgICAgY2hhciBjb25zdCAqIG5hbWUsCisgICAgY2hhciBjb25zdCAqIHZhbHVlLAorICAgIGNoYXIgKiAgICAgICBzdWZmaXgsCisgICAgY2hhciAqICogICAgIG91dAorKSB7CisgICAgY2hhciBidWZmZXJbMjU2XTsKKyAgICBjaGFyICp0OworICAgIGludCBoYXNTdWZmaXg7CisgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopICogb3V0ICk7CisgICAgdCA9IChjaGFyICopIHN0cnJjaHIodmFsdWUsICcuJyk7CisgICAgaGFzU3VmZml4ID0gdCAmJiBfX2ttcF9zdHJfZXFmKCB0LCBzdWZmaXggKTsKKyAgICB0ID0gX19rbXBfc3RyX2Zvcm1hdCggIiVzJXMiLCB2YWx1ZSwgaGFzU3VmZml4ID8gIiIgOiBzdWZmaXggKTsKKyAgICBfX2ttcF9leHBhbmRfZmlsZV9uYW1lKCBidWZmZXIsIHNpemVvZihidWZmZXIpLCB0KTsKKyAgICBLTVBfSU5URVJOQUxfRlJFRSh0KTsKKyAgICAqIG91dCA9IF9fa21wX3N0cl9mb3JtYXQoICIlcyIsIGJ1ZmZlciApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfZmlsZQorI2VuZGlmCisKKyNpZmRlZiBLTVBfREVCVUcKK3N0YXRpYyBjaGFyICogcGFyX3JhbmdlX3RvX3ByaW50ID0gTlVMTDsKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9wYXJfcmFuZ2UoCisgICAgY2hhciBjb25zdCAqIG5hbWUsCisgICAgY2hhciBjb25zdCAqIHZhbHVlLAorICAgIGludCAqICAgICAgICBvdXRfcmFuZ2UsCisgICAgY2hhciAqICAgICAgIG91dF9yb3V0aW5lLAorICAgIGNoYXIgKiAgICAgICBvdXRfZmlsZSwKKyAgICBpbnQgKiAgICAgICAgb3V0X2xiLAorICAgIGludCAqICAgICAgICBvdXRfdWIKKykgeworICAgIHNpemVfdCBsZW4gPSBLTVBfU1RSTEVOKCB2YWx1ZSArIDEgKTsKKyAgICBwYXJfcmFuZ2VfdG9fcHJpbnQgPSAoY2hhciAqKSBLTVBfSU5URVJOQUxfTUFMTE9DKCBsZW4gKzEgKTsKKyAgICBLTVBfU1RSTkNQWV9TKCBwYXJfcmFuZ2VfdG9fcHJpbnQsIGxlbiArIDEsIHZhbHVlLCBsZW4gKyAxKTsKKyAgICBfX2ttcF9wYXJfcmFuZ2UgPSArMTsKKyAgICBfX2ttcF9wYXJfcmFuZ2VfbGIgPSAwOworICAgIF9fa21wX3Bhcl9yYW5nZV91YiA9IElOVF9NQVg7CisgICAgZm9yICg7OykgeworICAgICAgICB1bnNpZ25lZCBpbnQgbGVuOworICAgICAgICBpZiAoKCB2YWx1ZSA9PSBOVUxMICkgfHwgKCAqdmFsdWUgPT0gJ1wwJyApKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoICEgX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCAicm91dGluZSIsIHZhbHVlLCAnPScgKSkgeworICAgICAgICAgICAgdmFsdWUgPSBzdHJjaHIoIHZhbHVlLCAnPScgKSArIDE7CisgICAgICAgICAgICBsZW4gPSBfX2ttcF9yZWFkc3RyX3dpdGhfc2VudGluZWwoIG91dF9yb3V0aW5lLAorICAgICAgICAgICAgICB2YWx1ZSwgS01QX1BBUl9SQU5HRV9ST1VUSU5FX0xFTiAtIDEsICcsJyApOworICAgICAgICAgICAgaWYgKCBsZW4gPT0gMCApIHsKKyAgICAgICAgICAgICAgICBnb3RvIHBhcl9yYW5nZV9lcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhbHVlID0gc3RyY2hyKCB2YWx1ZSwgJywnICk7CisgICAgICAgICAgICBpZiAoIHZhbHVlICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgdmFsdWUrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICggISBfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoICJmaWxlbmFtZSIsIHZhbHVlLCAnPScgKSkgeworICAgICAgICAgICAgdmFsdWUgPSBzdHJjaHIoIHZhbHVlLCAnPScgKSArIDE7CisgICAgICAgICAgICBsZW4gPSBfX2ttcF9yZWFkc3RyX3dpdGhfc2VudGluZWwoIG91dF9maWxlLAorICAgICAgICAgICAgICB2YWx1ZSwgS01QX1BBUl9SQU5HRV9GSUxFTkFNRV9MRU4gLSAxLCAnLCcgKTsKKyAgICAgICAgICAgIGlmICggbGVuID09IDApIHsKKyAgICAgICAgICAgICAgICBnb3RvIHBhcl9yYW5nZV9lcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhbHVlID0gc3RyY2hyKCB2YWx1ZSwgJywnICk7CisgICAgICAgICAgICBpZiAoIHZhbHVlICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgdmFsdWUrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICgoICEgX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCAicmFuZ2UiLCB2YWx1ZSwgJz0nICkpCisgICAgICAgICAgfHwgKCAhIF9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCggImluY2xfcmFuZ2UiLCB2YWx1ZSwgJz0nICkpKSB7CisgICAgICAgICAgICB2YWx1ZSA9IHN0cmNociggdmFsdWUsICc9JyApICsgMTsKKyAgICAgICAgICAgIGlmICggS01QX1NTQ0FORiggdmFsdWUsICIlZDolZCIsIG91dF9sYiwgb3V0X3ViICkgIT0gMiApIHsKKyAgICAgICAgICAgICAgICBnb3RvIHBhcl9yYW5nZV9lcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpvdXRfcmFuZ2UgPSArMTsKKyAgICAgICAgICAgIHZhbHVlID0gc3RyY2hyKCB2YWx1ZSwgJywnICk7CisgICAgICAgICAgICBpZiAoIHZhbHVlICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgdmFsdWUrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICggISBfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoICJleGNsX3JhbmdlIiwgdmFsdWUsICc9JyApKSB7CisgICAgICAgICAgICB2YWx1ZSA9IHN0cmNociggdmFsdWUsICc9JyApICsgMTsKKyAgICAgICAgICAgIGlmICggS01QX1NTQ0FORiggdmFsdWUsICIlZDolZCIsIG91dF9sYiwgb3V0X3ViKSAhPSAyICkgeworICAgICAgICAgICAgICAgIGdvdG8gcGFyX3JhbmdlX2Vycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKm91dF9yYW5nZSA9IC0xOworICAgICAgICAgICAgdmFsdWUgPSBzdHJjaHIoIHZhbHVlLCAnLCcgKTsKKyAgICAgICAgICAgIGlmICggdmFsdWUgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgcGFyX3JhbmdlX2Vycm9yOgorICAgICAgICBLTVBfV0FSTklORyggUGFyUmFuZ2VTeW50YXgsIG5hbWUgKTsKKyAgICAgICAgX19rbXBfcGFyX3JhbmdlID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfSAvLyBfX2ttcF9zdGdfcGFyc2VfcGFyX3JhbmdlCisjZW5kaWYKKworaW50CitfX2ttcF9pbml0aWFsX3RocmVhZHNfY2FwYWNpdHkoIGludCByZXFfbnByb2MgKQoreworICAgIGludCBudGggPSAzMjsKKworICAgIC8qIE1JTiggTUFYKCAzMiwgNCAqICRPTVBfTlVNX1RIUkVBRFMsIDQgKiBvbXBfZ2V0X251bV9wcm9jcygpICksIF9fa21wX21heF9udGgpICovCisgICAgaWYgKG50aCA8ICg0ICogcmVxX25wcm9jKSkKKyAgICAgICAgbnRoID0gKDQgKiByZXFfbnByb2MpOworICAgIGlmIChudGggPCAoNCAqIF9fa21wX3hwcm9jKSkKKyAgICAgICAgbnRoID0gKDQgKiBfX2ttcF94cHJvYyk7CisKKyAgICBpZiAobnRoID4gX19rbXBfbWF4X250aCkKKyAgICAgICAgbnRoID0gX19rbXBfbWF4X250aDsKKworICAgIHJldHVybiBudGg7Cit9CisKKworaW50CitfX2ttcF9kZWZhdWx0X3RwX2NhcGFjaXR5KCBpbnQgcmVxX25wcm9jLCBpbnQgbWF4X250aCwgaW50IGFsbF90aHJlYWRzX3NwZWNpZmllZCkgeworICAgIGludCBudGggPSAxMjg7CisKKyAgICBpZihhbGxfdGhyZWFkc19zcGVjaWZpZWQpCisgICAgICAgIHJldHVybiBtYXhfbnRoOworICAgIC8qIE1JTiggTUFYICgxMjgsIDQgKiAkT01QX05VTV9USFJFQURTLCA0ICogb21wX2dldF9udW1fcHJvY3MoKSApLCBfX2ttcF9tYXhfbnRoICkgKi8KKyAgICBpZiAobnRoIDwgKDQgKiByZXFfbnByb2MpKQorICAgICAgICBudGggPSAoNCAqIHJlcV9ucHJvYyk7CisgICAgaWYgKG50aCA8ICg0ICogX19rbXBfeHByb2MpKQorICAgICAgICBudGggPSAoNCAqIF9fa21wX3hwcm9jKTsKKworICAgIGlmIChudGggPiBfX2ttcF9tYXhfbnRoKQorICAgICAgICBudGggPSBfX2ttcF9tYXhfbnRoOworCisgICAgcmV0dXJuIG50aDsKK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIZWxwZXIgcHJpbnQgZnVuY3Rpb25zLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2Jvb2woIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCBpbnQgdmFsdWUgKSB7CisgICAgaWYoIF9fa21wX2Vudl9mb3JtYXQgKSB7CisgICAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX0JPT0w7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXM9JXNcbiIsIG5hbWUsIHZhbHVlID8gInRydWUiIDogImZhbHNlIiApOworICAgIH0KK30gLy8gX19rbXBfc3RnX3ByaW50X2Jvb2wKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9pbnQoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCBpbnQgdmFsdWUgKSB7CisgICAgaWYoIF9fa21wX2Vudl9mb3JtYXQgKSB7CisgICAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX0lOVDsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICAlcz0lZFxuIiwgbmFtZSwgdmFsdWUgKTsKKyAgICB9Cit9IC8vIF9fa21wX3N0Z19wcmludF9pbnQKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF91aW50NjQoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCBrbXBfdWludDY0IHZhbHVlICkgeworICAgIGlmKCBfX2ttcF9lbnZfZm9ybWF0ICkgeworICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9VSU5UNjQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXM9JSIgS01QX1VJTlQ2NF9TUEVDICJcbiIsIG5hbWUsIHZhbHVlICk7CisgICAgfQorfSAvLyBfX2ttcF9zdGdfcHJpbnRfdWludDY0CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfc3RyKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlICkgeworICAgIGlmKCBfX2ttcF9lbnZfZm9ybWF0ICkgeworICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9TVFI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXM9JXNcbiIsIG5hbWUsIHZhbHVlICk7CisgICAgfQorfSAvLyBfX2ttcF9zdGdfcHJpbnRfc3RyCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfc2l6ZSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHNpemVfdCB2YWx1ZSApIHsKKyAgICBpZiggX19rbXBfZW52X2Zvcm1hdCApIHsKKyAgICAgICAgS01QX1NUUl9CVUZfUFJJTlRfTkFNRV9FWChuYW1lKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludF9zaXplKCBidWZmZXIsIHZhbHVlICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIidcbiIgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICAlcz0iLCBuYW1lICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnRfc2l6ZSggYnVmZmVyLCB2YWx1ZSApOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICJcbiIgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KK30gLy8gX19rbXBfc3RnX3ByaW50X3NpemUKKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBQYXJzZSBhbmQgcHJpbnQgZnVuY3Rpb25zLgorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfQUxMX1RIUkVBRFMsIEtNUF9NQVhfVEhSRUFEUywgT01QX1RIUkVBRF9MSU1JVAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2FsbF90aHJlYWRzKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKworICAgIGttcF9zZXR0aW5nX3QgKiAqIHJpdmFscyA9IChrbXBfc2V0dGluZ190ICogKikgZGF0YTsKKyAgICBpbnQgICAgICAgICAgICAgICByYzsKKyAgICByYyA9IF9fa21wX3N0Z19jaGVja19yaXZhbHMoIG5hbWUsIHZhbHVlLCByaXZhbHMgKTsKKyAgICBpZiAoIHJjICkgeworICAgICAgICByZXR1cm47CisgICAgfTsgLy8gaWYKKyAgICBpZiAoICEgX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCAiYWxsIiwgdmFsdWUsIDAgKSApIHsKKyAgICAgICAgX19rbXBfbWF4X250aCA9IF9fa21wX3hwcm9jOworICAgICAgICBfX2ttcF9hbGxUaHJlYWRzU3BlY2lmaWVkID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdGdfcGFyc2VfaW50KCBuYW1lLCB2YWx1ZSwgMSwgX19rbXBfc3lzX21heF9udGgsICYgX19rbXBfbWF4X250aCApOworICAgICAgICBfX2ttcF9hbGxUaHJlYWRzU3BlY2lmaWVkID0gMDsKKyAgICB9CisgICAgS19ESUFHKCAxLCAoICJfX2ttcF9tYXhfbnRoID09ICVkXG4iLCBfX2ttcF9tYXhfbnRoICkgKTsKKworfSAvLyBfX2ttcF9zdGdfcGFyc2VfYWxsX3RocmVhZHMKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9hbGxfdGhyZWFkcygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwgX19rbXBfbWF4X250aCApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfYWxsX3RocmVhZHMKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0JMT0NLVElNRQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2Jsb2NrdGltZSggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfZGZsdF9ibG9ja3RpbWUgPSBfX2ttcF9jb252ZXJ0X3RvX21pbGxpc2Vjb25kcyggdmFsdWUgKTsKKyAgICBpZiAoIF9fa21wX2RmbHRfYmxvY2t0aW1lIDwgMCApIHsKKyAgICAgICAgX19rbXBfZGZsdF9ibG9ja3RpbWUgPSBLTVBfREVGQVVMVF9CTE9DS1RJTUU7CisgICAgICAgIF9fa21wX21zZygga21wX21zX3dhcm5pbmcsIEtNUF9NU0coIEludmFsaWRWYWx1ZSwgbmFtZSwgdmFsdWUgKSwgX19rbXBfbXNnX251bGwgKTsKKyAgICAgICAgS01QX0lORk9STSggVXNpbmdfaW50X1ZhbHVlLCBuYW1lLCBfX2ttcF9kZmx0X2Jsb2NrdGltZSApOworICAgICAgICBfX2ttcF9lbnZfYmxvY2t0aW1lID0gRkFMU0U7ICAvLyBSZXZlcnQgdG8gZGVmYXVsdCBhcyBpZiB2YXIgbm90IHNldC4KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIF9fa21wX2RmbHRfYmxvY2t0aW1lIDwgS01QX01JTl9CTE9DS1RJTUUgKSB7CisgICAgICAgICAgICBfX2ttcF9kZmx0X2Jsb2NrdGltZSA9IEtNUF9NSU5fQkxPQ0tUSU1FOworICAgICAgICAgICAgX19rbXBfbXNnKCBrbXBfbXNfd2FybmluZywgS01QX01TRyggU21hbGxWYWx1ZSwgbmFtZSwgdmFsdWUgKSwgX19rbXBfbXNnX251bGwgKTsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oIE1pblZhbHVlVXNpbmcsIG5hbWUsIF9fa21wX2RmbHRfYmxvY2t0aW1lICk7CisgICAgICAgIH0gZWxzZSBpZiAoIF9fa21wX2RmbHRfYmxvY2t0aW1lID4gS01QX01BWF9CTE9DS1RJTUUgKSB7CisgICAgICAgICAgICBfX2ttcF9kZmx0X2Jsb2NrdGltZSA9IEtNUF9NQVhfQkxPQ0tUSU1FOworICAgICAgICAgICAgX19rbXBfbXNnKCBrbXBfbXNfd2FybmluZywgS01QX01TRyggTGFyZ2VWYWx1ZSwgbmFtZSwgdmFsdWUgKSwgX19rbXBfbXNnX251bGwgKTsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oIE1heFZhbHVlVXNpbmcsIG5hbWUsIF9fa21wX2RmbHRfYmxvY2t0aW1lICk7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIF9fa21wX2Vudl9ibG9ja3RpbWUgPSBUUlVFOyAgICAvLyBLTVBfQkxPQ0tUSU1FIHdhcyBzcGVjaWZpZWQuCisgICAgfTsgLy8gaWYKKyAgICAvLyBjYWxjdWxhdGUgbnVtYmVyIG9mIG1vbml0b3IgdGhyZWFkIHdha2V1cCBpbnRlcnZhbHMgY29ycmVzb25kaW5nIHRvIGJsb2NrdGltZS4KKyAgICBfX2ttcF9tb25pdG9yX3dha2V1cHMgPSBLTVBfV0FLRVVQU19GUk9NX0JMT0NLVElNRSggX19rbXBfZGZsdF9ibG9ja3RpbWUsIF9fa21wX21vbml0b3Jfd2FrZXVwcyApOworICAgIF9fa21wX2J0X2ludGVydmFscyA9IEtNUF9JTlRFUlZBTFNfRlJPTV9CTE9DS1RJTUUoIF9fa21wX2RmbHRfYmxvY2t0aW1lLCBfX2ttcF9tb25pdG9yX3dha2V1cHMgKTsKKyAgICBLX0RJQUcoIDEsICggIl9fa21wX2Vudl9ibG9ja3RpbWUgPT0gJWRcbiIsIF9fa21wX2Vudl9ibG9ja3RpbWUgKSApOworICAgIGlmICggX19rbXBfZW52X2Jsb2NrdGltZSApIHsKKyAgICAgICAgS19ESUFHKCAxLCAoICJfX2ttcF9kZmx0X2Jsb2NrdGltZSA9PSAlZFxuIiwgX19rbXBfZGZsdF9ibG9ja3RpbWUgKSApOworICAgIH0KK30gLy8gX19rbXBfc3RnX3BhcnNlX2Jsb2NrdGltZQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2Jsb2NrdGltZSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwgX19rbXBfZGZsdF9ibG9ja3RpbWUgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2Jsb2NrdGltZQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfRFVQTElDQVRFX0xJQl9PSworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2R1cGxpY2F0ZV9saWJfb2soIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIC8qIGFjdHVhbGx5IHRoaXMgdmFyaWFibGUgaXMgbm90IHN1cHBvcnRlZCwKKyAgICAgICBwdXQgaGVyZSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGVhcmxpZXIgYnVpbGRzIGFuZCBmb3Igc3RhdGljL2R5bmFtaWMgY29tYmluYXRpb24gKi8KKyAgICBfX2ttcF9zdGdfcGFyc2VfYm9vbCggbmFtZSwgdmFsdWUsICYgX19rbXBfZHVwbGljYXRlX2xpYnJhcnlfb2sgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2R1cGxpY2F0ZV9saWJfb2sKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9kdXBsaWNhdGVfbGliX29rKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2Jvb2woIGJ1ZmZlciwgbmFtZSwgX19rbXBfZHVwbGljYXRlX2xpYnJhcnlfb2sgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2R1cGxpY2F0ZV9saWJfb2sKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0lOSEVSSVRfRlBfQ09OVFJPTAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2luaGVyaXRfZnBfY29udHJvbCggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2Jvb2woIG5hbWUsIHZhbHVlLCAmIF9fa21wX2luaGVyaXRfZnBfY29udHJvbCApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfaW5oZXJpdF9mcF9jb250cm9sCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfaW5oZXJpdF9mcF9jb250cm9sKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisjaWYgS01QX0RFQlVHCisgICAgX19rbXBfc3RnX3ByaW50X2Jvb2woIGJ1ZmZlciwgbmFtZSwgX19rbXBfaW5oZXJpdF9mcF9jb250cm9sICk7CisjZW5kaWYgLyogS01QX0RFQlVHICovCit9IC8vIF9fa21wX3N0Z19wcmludF9pbmhlcml0X2ZwX2NvbnRyb2wKKworI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0xJQlJBUlksIE9NUF9XQUlUX1BPTElDWQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3dhaXRfcG9saWN5KCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKworICAgIGttcF9zdGdfd3BfZGF0YV90ICogd2FpdCA9IChrbXBfc3RnX3dwX2RhdGFfdCAqKSBkYXRhOworICAgIGludCAgICAgICAgICAgICAgICAgcmM7CisKKyAgICByYyA9IF9fa21wX3N0Z19jaGVja19yaXZhbHMoIG5hbWUsIHZhbHVlLCB3YWl0LT5yaXZhbHMgKTsKKyAgICBpZiAoIHJjICkgeworICAgICAgICByZXR1cm47CisgICAgfTsgLy8gaWYKKworICAgIGlmICggd2FpdC0+b21wICkgeworICAgICAgICBpZiAoIF9fa21wX3N0cl9tYXRjaCggIkFDVElWRSIsIDEsIHZhbHVlICkgKSB7CisgICAgICAgICAgIF9fa21wX2xpYnJhcnkgPSBsaWJyYXJ5X3R1cm5hcm91bmQ7CisgICAgICAgIH0gZWxzZSBpZiAoIF9fa21wX3N0cl9tYXRjaCggIlBBU1NJVkUiLCAxLCB2YWx1ZSApICkgeworICAgICAgICAgICBfX2ttcF9saWJyYXJ5ID0gbGlicmFyeV90aHJvdWdocHV0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIFN0Z0ludmFsaWRWYWx1ZSwgbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIF9fa21wX3N0cl9tYXRjaCggInNlcmlhbCIsIDEsIHZhbHVlICkgKSB7ICAgICAgICAgICAgIC8qIFMgKi8KKyAgICAgICAgICAgX19rbXBfbGlicmFyeSA9IGxpYnJhcnlfc2VyaWFsOworICAgICAgICB9IGVsc2UgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJ0aHJvdWdocHV0IiwgMiwgdmFsdWUgKSApIHsgIC8qIFRIICovCisgICAgICAgICAgIF9fa21wX2xpYnJhcnkgPSBsaWJyYXJ5X3Rocm91Z2hwdXQ7CisgICAgICAgIH0gZWxzZSBpZiAoIF9fa21wX3N0cl9tYXRjaCggInR1cm5hcm91bmQiLCAyLCB2YWx1ZSApICkgeyAgLyogVFUgKi8KKyAgICAgICAgICAgX19rbXBfbGlicmFyeSA9IGxpYnJhcnlfdHVybmFyb3VuZDsKKyAgICAgICAgfSBlbHNlIGlmICggX19rbXBfc3RyX21hdGNoKCAiZGVkaWNhdGVkIiwgMSwgdmFsdWUgKSApIHsgICAvKiBEICovCisgICAgICAgICAgIF9fa21wX2xpYnJhcnkgPSBsaWJyYXJ5X3R1cm5hcm91bmQ7CisgICAgICAgIH0gZWxzZSBpZiAoIF9fa21wX3N0cl9tYXRjaCggIm11bHRpdXNlciIsIDEsIHZhbHVlICkgKSB7ICAgLyogTSAqLworICAgICAgICAgICBfX2ttcF9saWJyYXJ5ID0gbGlicmFyeV90aHJvdWdocHV0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIFN0Z0ludmFsaWRWYWx1ZSwgbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBpZgorICAgIF9fa21wX2F1eF9zZXRfbGlicmFyeSggX19rbXBfbGlicmFyeSApOworCit9IC8vIF9fa21wX3N0Z19wYXJzZV93YWl0X3BvbGljeQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X3dhaXRfcG9saWN5KCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisKKyAgICBrbXBfc3RnX3dwX2RhdGFfdCAqIHdhaXQgPSAoa21wX3N0Z193cF9kYXRhX3QgKikgZGF0YTsKKyAgICBjaGFyIGNvbnN0ICogICAgICAgIHZhbHVlID0gTlVMTDsKKworICAgIGlmICggd2FpdC0+b21wICkgeworICAgICAgICBzd2l0Y2ggKCBfX2ttcF9saWJyYXJ5ICkgeworICAgICAgICAgICAgY2FzZSBsaWJyYXJ5X3R1cm5hcm91bmQgOiB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSAiQUNUSVZFIjsKKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICBjYXNlIGxpYnJhcnlfdGhyb3VnaHB1dCA6IHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9ICJQQVNTSVZFIjsKKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgIH07IC8vIHN3aXRjaAorICAgIH0gZWxzZSB7CisgICAgICAgIHN3aXRjaCAoIF9fa21wX2xpYnJhcnkgKSB7CisgICAgICAgICAgICBjYXNlIGxpYnJhcnlfc2VyaWFsIDogeworICAgICAgICAgICAgICAgIHZhbHVlID0gInNlcmlhbCI7CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgY2FzZSBsaWJyYXJ5X3R1cm5hcm91bmQgOiB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSAidHVybmFyb3VuZCI7CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgY2FzZSBsaWJyYXJ5X3Rocm91Z2hwdXQgOiB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSAidGhyb3VnaHB1dCI7CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICB9OyAvLyBzd2l0Y2gKKyAgICB9OyAvLyBpZgorICAgIGlmICggdmFsdWUgIT0gTlVMTCApIHsKKyAgICAgICAgX19rbXBfc3RnX3ByaW50X3N0ciggYnVmZmVyLCBuYW1lLCB2YWx1ZSApOworICAgIH07IC8vIGlmCisKK30gLy8gX19rbXBfc3RnX3ByaW50X3dhaXRfcG9saWN5CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9NT05JVE9SX1NUQUNLU0laRQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX21vbml0b3Jfc3RhY2tzaXplKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2Vfc2l6ZSgKKyAgICAgICAgbmFtZSwKKyAgICAgICAgdmFsdWUsCisgICAgICAgIF9fa21wX3N5c19taW5fc3Rrc2l6ZSwKKyAgICAgICAgS01QX01BWF9TVEtTSVpFLAorICAgICAgICBOVUxMLAorICAgICAgICAmIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSwKKyAgICAgICAgMQorICAgICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9tb25pdG9yX3N0YWNrc2l6ZQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X21vbml0b3Jfc3RhY2tzaXplKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgaWYoIF9fa21wX2Vudl9mb3JtYXQgKSB7CisgICAgICAgIGlmICggIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSA+IDAgKQorICAgICAgICAgICAgS01QX1NUUl9CVUZfUFJJTlRfTkFNRV9FWChuYW1lKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgS01QX1NUUl9CVUZfUFJJTlRfTkFNRTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICAlcyIsIG5hbWUgKTsKKyAgICB9CisgICAgaWYgKCAgX19rbXBfbW9uaXRvcl9zdGtzaXplID4gMCApIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludF9zaXplKCBidWZmZXIsIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSApOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIjogJXNcbiIsIEtNUF9JMThOX1NUUiggTm90RGVmaW5lZCApICk7CisgICAgfQorICAgIGlmKCBfX2ttcF9lbnZfZm9ybWF0ICYmIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSApIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIidcbiIpOworICAgIH0KKworfSAvLyBfX2ttcF9zdGdfcHJpbnRfbW9uaXRvcl9zdGFja3NpemUKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX1NFVFRJTkdTCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2Vfc2V0dGluZ3MoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9ib29sKCBuYW1lLCB2YWx1ZSwgJiBfX2ttcF9zZXR0aW5ncyApOworfSAvLyBfX2ttcF9zdGdfcGFyc2Vfc2V0dGluZ3MKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9zZXR0aW5ncygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9ib29sKCBidWZmZXIsIG5hbWUsIF9fa21wX3NldHRpbmdzICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9zZXR0aW5ncworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfU1RBQ0tQQUQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9zdGFja3BhZCggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2ludCgKKyAgICAgICAgbmFtZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVudiB2YXIgbmFtZQorICAgICAgICB2YWx1ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRW52IHZhciB2YWx1ZQorICAgICAgICBLTVBfTUlOX1NUS1BBRERJTkcsICAgICAgICAgICAgICAgLy8gTWluIHZhbHVlCisgICAgICAgIEtNUF9NQVhfU1RLUEFERElORywgICAgICAgICAgICAgICAvLyBNYXggdmFsdWUKKyAgICAgICAgJiBfX2ttcF9zdGtwYWRkaW5nICAgICAgICAgICAgICAgIC8vIFZhciB0byBpbml0aWFsaXplCisgICAgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX3N0YWNrcGFkCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfc3RhY2twYWQoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfaW50KCBidWZmZXIsIG5hbWUsIF9fa21wX3N0a3BhZGRpbmcgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X3N0YWNrcGFkCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9TVEFDS09GRlNFVAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3N0YWNrb2Zmc2V0KCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2Vfc2l6ZSgKKyAgICAgICAgbmFtZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVudiB2YXIgbmFtZQorICAgICAgICB2YWx1ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRW52IHZhciB2YWx1ZQorICAgICAgICBLTVBfTUlOX1NUS09GRlNFVCwgICAgICAgICAgICAgICAgLy8gTWluIHZhbHVlCisgICAgICAgIEtNUF9NQVhfU1RLT0ZGU0VULCAgICAgICAgICAgICAgICAvLyBNYXggdmFsdWUKKyAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICYgX19rbXBfc3Rrb2Zmc2V0LCAgICAgICAgICAgICAgICAvLyBWYXIgdG8gaW5pdGlhbGl6ZQorICAgICAgICAxCisgICAgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX3N0YWNrb2Zmc2V0CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfc3RhY2tvZmZzZXQoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfc2l6ZSggYnVmZmVyLCBuYW1lLCBfX2ttcF9zdGtvZmZzZXQgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X3N0YWNrb2Zmc2V0CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9TVEFDS1NJWkUsIE9NUF9TVEFDS1NJWkUsIEdPTVBfU1RBQ0tTSVpFCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2Vfc3RhY2tzaXplKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKworICAgIGttcF9zdGdfc3NfZGF0YV90ICogIHN0YWNrc2l6ZSA9IChrbXBfc3RnX3NzX2RhdGFfdCAqKSBkYXRhOworICAgIGludCAgICAgICAgICAgICAgICAgIHJjOworCisgICAgcmMgPSBfX2ttcF9zdGdfY2hlY2tfcml2YWxzKCBuYW1lLCB2YWx1ZSwgc3RhY2tzaXplLT5yaXZhbHMgKTsKKyAgICBpZiAoIHJjICkgeworICAgICAgICByZXR1cm47CisgICAgfTsgLy8gaWYKKyAgICBfX2ttcF9zdGdfcGFyc2Vfc2l6ZSgKKyAgICAgICAgbmFtZSwgICAgICAgICAgICAgICAgICAgICAvLyBFbnYgdmFyIG5hbWUKKyAgICAgICAgdmFsdWUsICAgICAgICAgICAgICAgICAgICAvLyBFbnYgdmFyIHZhbHVlCisgICAgICAgIF9fa21wX3N5c19taW5fc3Rrc2l6ZSwgICAgLy8gTWluIHZhbHVlCisgICAgICAgIEtNUF9NQVhfU1RLU0laRSwgICAgICAgICAgLy8gTWF4IHZhbHVlCisgICAgICAgICYgX19rbXBfZW52X3N0a3NpemUsICAgICAgLy8KKyAgICAgICAgJiBfX2ttcF9zdGtzaXplLCAgICAgICAgICAvLyBWYXIgdG8gaW5pdGlhbGl6ZQorICAgICAgICBzdGFja3NpemUtPmZhY3RvcgorICAgICk7CisKK30gLy8gX19rbXBfc3RnX3BhcnNlX3N0YWNrc2l6ZQorCisvLyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgcHJpbnRpbmcgYm90aCBLTVBfU1RBQ0tTSVpFIChmYWN0b3IgaXMgMSkgYW5kIE9NUF9TVEFDS1NJWkUgKGZhY3RvciBpcyAxMDI0KS4KKy8vIEN1cnJlbnRseSBpdCBpcyBub3QgcG9zc2libGUgdG8gcHJpbnQgT01QX1NUQUNLU0laRSB2YWx1ZSBpbiBieXRlcy4gV2UgY2FuIGNvbnNpZGVyIGFkZGluZyB0aGlzCisvLyBwb3NzaWJpbGl0eSBieSBhIGN1c3RvbWVyIHJlcXVlc3QgaW4gZnV0dXJlLgorc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9zdGFja3NpemUoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBrbXBfc3RnX3NzX2RhdGFfdCAqICBzdGFja3NpemUgPSAoa21wX3N0Z19zc19kYXRhX3QgKikgZGF0YTsKKyAgICBpZiggX19rbXBfZW52X2Zvcm1hdCApIHsKKyAgICAgICAgS01QX1NUUl9CVUZfUFJJTlRfTkFNRV9FWChuYW1lKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludF9zaXplKCBidWZmZXIsIChfX2ttcF9zdGtzaXplICUgMTAyNCkgPyBfX2ttcF9zdGtzaXplIC8gc3RhY2tzaXplLT5mYWN0b3IgOiBfX2ttcF9zdGtzaXplICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIidcbiIgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICAlcz0iLCBuYW1lICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnRfc2l6ZSggYnVmZmVyLCAoX19rbXBfc3Rrc2l6ZSAlIDEwMjQpID8gX19rbXBfc3Rrc2l6ZSAvIHN0YWNrc2l6ZS0+ZmFjdG9yIDogX19rbXBfc3Rrc2l6ZSApOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICJcbiIgKTsKKyAgICB9Cit9IC8vIF9fa21wX3N0Z19wcmludF9zdGFja3NpemUKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX1ZFUlNJT04KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV92ZXJzaW9uKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2VfYm9vbCggbmFtZSwgdmFsdWUsICYgX19rbXBfdmVyc2lvbiApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfdmVyc2lvbgorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X3ZlcnNpb24oIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfYm9vbCggYnVmZmVyLCBuYW1lLCBfX2ttcF92ZXJzaW9uICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF92ZXJzaW9uCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9XQVJOSU5HUworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3dhcm5pbmdzKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2VfYm9vbCggbmFtZSwgdmFsdWUsICYgX19rbXBfZ2VuZXJhdGVfd2FybmluZ3MgKTsKKyAgICBpZiAoX19rbXBfZ2VuZXJhdGVfd2FybmluZ3MgIT0ga21wX3dhcm5pbmdzX29mZikgeyAgIC8vIEFDOiB3ZSBoYXZlIG9ubHkgMC8xIHZhbHVlcyBkb2N1bWVudGVkLAorICAgICAgICBfX2ttcF9nZW5lcmF0ZV93YXJuaW5ncyA9IGttcF93YXJuaW5nc19leHBsaWNpdDsgLy8gICAgIHNvIHJlc2V0IGl0IHRvIGV4cGxpY2l0IGluIG9yZGVyIHRvCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgZGlzdGluZ3Vpc2ggZnJvbSBkZWZhdWx0IHNldHRpbmcKK30gLy8gX19rbXBfZW52X3BhcnNlX3dhcm5pbmdzCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfd2FybmluZ3MoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfYm9vbCggYnVmZmVyLCBuYW1lLCBfX2ttcF9nZW5lcmF0ZV93YXJuaW5ncyApOyAvLyBBQzogVE9ETzogY2hhbmdlIHRvIHByaW50X2ludD8KK30gLy8gX19rbXBfZW52X3ByaW50X3dhcm5pbmdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgKG5lZWRzIGRvY3VtZW50YXRpb24gY2hhbmdlKS4uLgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPTVBfTkVTVEVELCBPTVBfTlVNX1RIUkVBRFMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9uZXN0ZWQoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9ib29sKCBuYW1lLCB2YWx1ZSwgJiBfX2ttcF9kZmx0X25lc3RlZCApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfbmVzdGVkCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfbmVzdGVkKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2Jvb2woIGJ1ZmZlciwgbmFtZSwgX19rbXBfZGZsdF9uZXN0ZWQgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X25lc3RlZAorCitzdGF0aWMgdm9pZAorX19rbXBfcGFyc2VfbmVzdGVkX251bV90aHJlYWRzKCBjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKmVudiwga21wX25lc3RlZF9udGhyZWFkc190ICpudGhfYXJyYXkgKQoreworICAgIGNvbnN0IGNoYXIgKm5leHQgPSBlbnY7CisgICAgY29uc3QgY2hhciAqc2NhbiA9IG5leHQ7CisKKyAgICBpbnQgdG90YWwgPSAwOyAgICAgICAgICAvLyBDb3VudCBlbGVtZW50cyB0aGF0IHdlcmUgc2V0LiBJdCdsbCBiZSB1c2VkIGFzIGFuIGFycmF5IHNpemUKKyAgICBpbnQgcHJldl9jb21tYSA9IEZBTFNFOyAvLyBGb3IgY29ycmVjdCBwcm9jZXNzaW5nIHNlcXVlbnRpYWwgY29tbWFzCisKKyAgICAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIHZhbHVlcyBpbiB0aGUgZW52LiB2YXIgc3RyaW5nCisgICAgZm9yICggOyA7ICkgeworICAgICAgICBTS0lQX1dTKCBuZXh0ICk7CisKKyAgICAgICAgaWYgKCAqbmV4dCA9PSAnXDAnICkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLy8gTmV4dCBjaGFyYWN0ZXIgaXMgbm90IGFuIGludGVnZXIgb3Igbm90IGEgY29tbWEgPT4gZW5kIG9mIGxpc3QKKyAgICAgICAgaWYgKCAoICggKm5leHQgPCAnMCcgKSB8fCAoICpuZXh0ID4gJzknICkgKSAmJiAoICpuZXh0ICE9JywnKSApIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBOdGhTeW50YXhFcnJvciwgdmFyLCBlbnYgKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBUaGUgbmV4dCBjaGFyYWN0ZXIgaXMgJywnCisgICAgICAgIGlmICggKm5leHQgPT0gJywnICkgeworICAgICAgICAgICAgLy8gJywnIGlzIHRoZSBmaXNydCBjaGFyYWN0ZXIKKyAgICAgICAgICAgIGlmICggdG90YWwgPT0gMCB8fCBwcmV2X2NvbW1hICkgeworICAgICAgICAgICAgICAgIHRvdGFsKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmV2X2NvbW1hID0gVFJVRTsKKyAgICAgICAgICAgIG5leHQrKzsgLy9za2lwICcsJworICAgICAgICAgICAgU0tJUF9XUyggbmV4dCApOworICAgICAgICB9CisgICAgICAgIC8vIE5leHQgY2hhcmFjdGVyIGlzIGEgZGlnaXQKKyAgICAgICAgaWYgKCAqbmV4dCA+PSAnMCcgJiYgKm5leHQgPD0gJzknICkgeworICAgICAgICAgICAgcHJldl9jb21tYSA9IEZBTFNFOworICAgICAgICAgICAgU0tJUF9ESUdJVFMoIG5leHQgKTsKKyAgICAgICAgICAgIHRvdGFsKys7CisgICAgICAgICAgICBjb25zdCBjaGFyICp0bXAgPSBuZXh0OworICAgICAgICAgICAgU0tJUF9XUyggdG1wICk7CisgICAgICAgICAgICBpZiAoICggKm5leHQgPT0gJyAnIHx8ICpuZXh0ID09ICdcdCcgKSAmJiAoICp0bXAgPj0gJzAnICYmICp0bXAgPD0gJzknICkgKSB7CisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIE50aFNwYWNlc05vdEFsbG93ZWQsIHZhciwgZW52ICk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQoIHRvdGFsID4gMCApOworICAgIGlmKCB0b3RhbCA8PSAwICkgeworICAgICAgICBLTVBfV0FSTklORyggTnRoU3ludGF4RXJyb3IsIHZhciwgZW52ICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBDaGVjayBpZiB0aGUgbmVzdGVkIG50aHJlYWRzIGFycmF5IGV4aXN0cworICAgIGlmICggISBudGhfYXJyYXktPm50aCApIHsKKyAgICAgICAgLy8gQWxsb2NhdGUgYW4gYXJyYXkgb2YgZG91YmxlIHNpemUKKyAgICAgICAgbnRoX2FycmF5LT5udGggPSAoIGludCAqIClLTVBfSU5URVJOQUxfTUFMTE9DKCBzaXplb2YoIGludCApICogdG90YWwgKiAyICk7CisgICAgICAgIGlmICggbnRoX2FycmF5LT5udGggPT0gTlVMTCApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTWVtb3J5QWxsb2NGYWlsZWQgKTsKKyAgICAgICAgfQorICAgICAgICBudGhfYXJyYXktPnNpemUgPSB0b3RhbCAqIDI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCBudGhfYXJyYXktPnNpemUgPCB0b3RhbCApIHsKKyAgICAgICAgICAgIC8vIEluY3JlYXNlIHRoZSBhcnJheSBzaXplCisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgbnRoX2FycmF5LT5zaXplICo9IDI7CisgICAgICAgICAgICB9IHdoaWxlICggbnRoX2FycmF5LT5zaXplIDwgdG90YWwgKTsKKworICAgICAgICAgICAgbnRoX2FycmF5LT5udGggPSAoaW50ICopIEtNUF9JTlRFUk5BTF9SRUFMTE9DKAorICAgICAgICAgICAgICAgIG50aF9hcnJheS0+bnRoLCBzaXplb2YoIGludCApICogbnRoX2FycmF5LT5zaXplICk7CisgICAgICAgICAgICBpZiAoIG50aF9hcnJheS0+bnRoID09IE5VTEwgKSB7CisJCUtNUF9GQVRBTCggTWVtb3J5QWxsb2NGYWlsZWQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBudGhfYXJyYXktPnVzZWQgPSB0b3RhbDsKKyAgICBpbnQgaSA9IDA7CisKKyAgICBwcmV2X2NvbW1hID0gRkFMU0U7CisgICAgdG90YWwgPSAwOworICAgIC8vIFNhdmUgdmFsdWVzIGluIHRoZSBhcnJheQorICAgIGZvciAoIDsgOyApIHsKKyAgICAgICAgU0tJUF9XUyggc2NhbiApOworICAgICAgICBpZiAoICpzY2FuID09ICdcMCcgKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvLyBUaGUgbmV4dCBjaGFyYWN0ZXIgaXMgJywnCisgICAgICAgIGlmICggKnNjYW4gPT0gJywnICkgeworICAgICAgICAgICAgLy8gJywnIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3QKKyAgICAgICAgICAgIGlmICggdG90YWwgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgdmFsdWUgaXMgc3VwcG9zZWQgdG8gYmUgZXF1YWwgdG8gX19rbXBfYXZhaWxfcHJvYyBidXQgaXQgaXMgdW5rbm93biBhdCB0aGUgbW9tZW50LgorICAgICAgICAgICAgICAgIC8vIFNvIGxldCdzIHB1dCBhIHBsYWNlaG9sZGVyICgjdGhyZWFkcyA9IDApIHRvIGNvcnJlY3QgaXQgbGF0ZXIuCisgICAgICAgICAgICAgICAgbnRoX2FycmF5LT5udGhbaSsrXSA9IDA7CisgICAgICAgICAgICAgICAgdG90YWwrKzsKKyAgICAgICAgICAgIH1lbHNlIGlmICggcHJldl9jb21tYSApIHsKKyAgICAgICAgICAgICAgICAvLyBOdW0gdGhyZWFkcyBpcyBpbmhlcml0ZWQgZnJvbSB0aGUgcHJldmlvdXMgbGV2ZWwKKyAgICAgICAgICAgICAgICBudGhfYXJyYXktPm50aFtpXSA9IG50aF9hcnJheS0+bnRoW2kgLSAxXTsKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgdG90YWwrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByZXZfY29tbWEgPSBUUlVFOworICAgICAgICAgICAgc2NhbisrOyAvL3NraXAgJywnCisgICAgICAgICAgICBTS0lQX1dTKCBzY2FuICk7CisgICAgICAgIH0KKyAgICAgICAgLy8gTmV4dCBjaGFyYWN0ZXIgaXMgYSBkaWdpdAorICAgICAgICBpZiAoICpzY2FuID49ICcwJyAmJiAqc2NhbiA8PSAnOScgKSB7CisgICAgICAgICAgICBpbnQgbnVtOworICAgICAgICAgICAgY29uc3QgY2hhciAqYnVmID0gc2NhbjsKKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiBtc2cgID0gTlVMTDsKKyAgICAgICAgICAgIHByZXZfY29tbWEgPSBGQUxTRTsKKyAgICAgICAgICAgIFNLSVBfRElHSVRTKCBzY2FuICk7CisgICAgICAgICAgICB0b3RhbCsrOworCisgICAgICAgICAgICBudW0gPSBfX2ttcF9zdHJfdG9faW50KCBidWYsICpzY2FuICk7CisgICAgICAgICAgICBpZiAoIG51bSA8IEtNUF9NSU5fTlRIICkgeworICAgICAgICAgICAgICAgIG1zZyA9IEtNUF9JMThOX1NUUiggVmFsdWVUb29TbWFsbCApOworICAgICAgICAgICAgICAgIG51bSA9IEtNUF9NSU5fTlRIOworICAgICAgICAgICAgfSBlbHNlIGlmICggbnVtID4gX19rbXBfc3lzX21heF9udGggKSB7CisgICAgICAgICAgICAgICAgbXNnID0gS01QX0kxOE5fU1RSKCBWYWx1ZVRvb0xhcmdlICk7CisgICAgICAgICAgICAgICAgbnVtID0gX19rbXBfc3lzX21heF9udGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIG1zZyAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIC8vIE1lc3NhZ2UgaXMgbm90IGVtcHR5LiBQcmludCB3YXJuaW5nLgorICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBQYXJzZVNpemVJbnRXYXJuLCB2YXIsIGVudiwgbXNnICk7CisgICAgICAgICAgICAgICAgS01QX0lORk9STSggVXNpbmdfaW50X1ZhbHVlLCB2YXIsIG51bSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbnRoX2FycmF5LT5udGhbaSsrXSA9IG51bTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9udW1fdGhyZWFkcyggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgLy8gVE9ETzogUmVtb3ZlIHRoaXMgb3B0aW9uLiBPTVBfTlVNX1RIUkVBRFMgaXMgYSBsaXN0IG9mIHBvc2l0aXZlIGludGVnZXJzIQorICAgIGlmICggISBfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoICJhbGwiLCB2YWx1ZSwgMCApICkgeworICAgICAgICAvLyBUaGUgYXJyYXkgb2YgMSBlbGVtZW50CisgICAgICAgIF9fa21wX25lc3RlZF9udGgubnRoID0gKCBpbnQqIClLTVBfSU5URVJOQUxfTUFMTE9DKCBzaXplb2YoIGludCApICk7CisgICAgICAgIF9fa21wX25lc3RlZF9udGguc2l6ZSA9IF9fa21wX25lc3RlZF9udGgudXNlZCA9IDE7CisgICAgICAgIF9fa21wX25lc3RlZF9udGgubnRoWzBdID0gX19rbXBfZGZsdF90ZWFtX250aCA9IF9fa21wX2RmbHRfdGVhbV9udGhfdWIgPSBfX2ttcF94cHJvYzsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9wYXJzZV9uZXN0ZWRfbnVtX3RocmVhZHMoIG5hbWUsIHZhbHVlLCAmIF9fa21wX25lc3RlZF9udGggKTsKKyAgICAgICAgaWYgKCBfX2ttcF9uZXN0ZWRfbnRoLm50aCApIHsKKyAgICAgICAgICAgIF9fa21wX2RmbHRfdGVhbV9udGggPSBfX2ttcF9uZXN0ZWRfbnRoLm50aFswXTsKKyAgICAgICAgICAgIGlmICggX19rbXBfZGZsdF90ZWFtX250aF91YiA8IF9fa21wX2RmbHRfdGVhbV9udGggKSB7CisgICAgICAgICAgICAgICAgX19rbXBfZGZsdF90ZWFtX250aF91YiA9IF9fa21wX2RmbHRfdGVhbV9udGg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OyAvLyBpZgorICAgIEtfRElBRyggMSwgKCAiX19rbXBfZGZsdF90ZWFtX250aCA9PSAlZFxuIiwgX19rbXBfZGZsdF90ZWFtX250aCApICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9udW1fdGhyZWFkcworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X251bV90aHJlYWRzKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgaWYoIF9fa21wX2Vudl9mb3JtYXQgKSB7CisgICAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX05BTUU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXMiLCBuYW1lICk7CisgICAgfQorICAgIGlmICggX19rbXBfbmVzdGVkX250aC51c2VkICkgeworICAgICAgICBrbXBfc3RyX2J1Zl90IGJ1ZjsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmYnVmICk7CisgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IF9fa21wX25lc3RlZF9udGgudXNlZDsgaSsrKSB7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmYnVmLCAiJWQiLCBfX2ttcF9uZXN0ZWRfbnRoLm50aFtpXSApOworICAgICAgICAgICAgaWYgKCBpIDwgX19rbXBfbmVzdGVkX250aC51c2VkIC0gMSApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmYnVmLCAiLCIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICI9JyVzJ1xuIiwgYnVmLnN0ciApOworICAgICAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoJmJ1Zik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiOiAlc1xuIiwgS01QX0kxOE5fU1RSKCBOb3REZWZpbmVkICkgKTsKKyAgICB9Cit9IC8vIF9fa21wX3N0Z19wcmludF9udW1fdGhyZWFkcworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPcGVuTVAgMy4wOiBLTVBfVEFTS0lORywgT01QX01BWF9BQ1RJVkVfTEVWRUxTLAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3Rhc2tpbmcoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9pbnQoIG5hbWUsIHZhbHVlLCAwLCAoaW50KXRza21fbWF4LCAoaW50ICopJl9fa21wX3Rhc2tpbmdfbW9kZSApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfdGFza2luZworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X3Rhc2tpbmcoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfaW50KCBidWZmZXIsIG5hbWUsIF9fa21wX3Rhc2tpbmdfbW9kZSApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfdGFza2luZworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3Rhc2tfc3RlYWxpbmcoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9pbnQoIG5hbWUsIHZhbHVlLCAwLCAxLCAoaW50ICopJl9fa21wX3Rhc2tfc3RlYWxpbmdfY29uc3RyYWludCApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfdGFza19zdGVhbGluZworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X3Rhc2tfc3RlYWxpbmcoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfaW50KCBidWZmZXIsIG5hbWUsIF9fa21wX3Rhc2tfc3RlYWxpbmdfY29uc3RyYWludCApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfdGFza19zdGVhbGluZworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX21heF9hY3RpdmVfbGV2ZWxzKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKwkgX19rbXBfc3RnX3BhcnNlX2ludCggbmFtZSwgdmFsdWUsIDAsIEtNUF9NQVhfQUNUSVZFX0xFVkVMU19MSU1JVCwgJiBfX2ttcF9kZmx0X21heF9hY3RpdmVfbGV2ZWxzICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9tYXhfYWN0aXZlX2xldmVscworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X21heF9hY3RpdmVfbGV2ZWxzKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBfX2ttcF9kZmx0X21heF9hY3RpdmVfbGV2ZWxzICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9tYXhfYWN0aXZlX2xldmVscworCisjaWYgS01QX05FU1RFRF9IT1RfVEVBTVMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9IT1RfVEVBTVNfTUFYX0xFVkVMLCBLTVBfSE9UX1RFQU1TX01PREUKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9ob3RfdGVhbXNfbGV2ZWwoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIGlmICggVENSXzQoX19rbXBfaW5pdF9wYXJhbGxlbCkgKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBFbnZQYXJhbGxlbFdhcm4sIG5hbWUgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0gICAvLyByZWFkIHZhbHVlIGJlZm9yZSBmaXJzdCBwYXJhbGxlbCBvbmx5CisgICAgX19rbXBfc3RnX3BhcnNlX2ludCggbmFtZSwgdmFsdWUsIDAsIEtNUF9NQVhfQUNUSVZFX0xFVkVMU19MSU1JVCwgJiBfX2ttcF9ob3RfdGVhbXNfbWF4X2xldmVsICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9ob3RfdGVhbXNfbGV2ZWwKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9ob3RfdGVhbXNfbGV2ZWwoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfaW50KCBidWZmZXIsIG5hbWUsIF9fa21wX2hvdF90ZWFtc19tYXhfbGV2ZWwgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2hvdF90ZWFtc19sZXZlbAorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2hvdF90ZWFtc19tb2RlKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBpZiAoIFRDUl80KF9fa21wX2luaXRfcGFyYWxsZWwpICkgeworICAgICAgICBLTVBfV0FSTklORyggRW52UGFyYWxsZWxXYXJuLCBuYW1lICk7CisgICAgICAgIHJldHVybjsKKyAgICB9ICAgLy8gcmVhZCB2YWx1ZSBiZWZvcmUgZmlyc3QgcGFyYWxsZWwgb25seQorICAgIF9fa21wX3N0Z19wYXJzZV9pbnQoIG5hbWUsIHZhbHVlLCAwLCBLTVBfTUFYX0FDVElWRV9MRVZFTFNfTElNSVQsICYgX19rbXBfaG90X3RlYW1zX21vZGUgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2hvdF90ZWFtc19tb2RlCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfaG90X3RlYW1zX21vZGUoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfaW50KCBidWZmZXIsIG5hbWUsIF9fa21wX2hvdF90ZWFtc19tb2RlICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9ob3RfdGVhbXNfbW9kZQorCisjZW5kaWYgLy8gS01QX05FU1RFRF9IT1RfVEVBTVMKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0hBTkRMRV9TSUdOQUxTCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiBLTVBfSEFORExFX1NJR05BTFMKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9oYW5kbGVfc2lnbmFscyggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisJX19rbXBfc3RnX3BhcnNlX2Jvb2woIG5hbWUsIHZhbHVlLCAmIF9fa21wX2hhbmRsZV9zaWduYWxzICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9oYW5kbGVfc2lnbmFscworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2hhbmRsZV9zaWduYWxzKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2Jvb2woIGJ1ZmZlciwgbmFtZSwgX19rbXBfaGFuZGxlX3NpZ25hbHMgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2hhbmRsZV9zaWduYWxzCisKKyNlbmRpZiAvLyBLTVBfSEFORExFX1NJR05BTFMKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX1hfREVCVUcsIEtNUF9ERUJVRywgS01QX0RFQlVHX0JVRl8qLCBLTVBfRElBRworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgS01QX0RFQlVHCisKKyNkZWZpbmUgS01QX1NUR19YX0RFQlVHKCB4ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyB2b2lkIF9fa21wX3N0Z19wYXJzZV8jI3gjI19kZWJ1ZyggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7ICAgICBcCisJX19rbXBfc3RnX3BhcnNlX2ludCggbmFtZSwgdmFsdWUsIDAsIElOVF9NQVgsICYga21wXyMjeCMjX2RlYnVnICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gLyogX19rbXBfc3RnX3BhcnNlX3hfZGVidWcgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdGljIHZvaWQgX19rbXBfc3RnX3ByaW50XyMjeCMjX2RlYnVnKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7IFwKKwlfX2ttcF9zdGdfcHJpbnRfaW50KCBidWZmZXIsIG5hbWUsIGttcF8jI3gjI19kZWJ1ZyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAvKiBfX2ttcF9zdGdfcHJpbnRfeF9kZWJ1ZyAqLworCitLTVBfU1RHX1hfREVCVUcoIGEgKQorS01QX1NUR19YX0RFQlVHKCBiICkKK0tNUF9TVEdfWF9ERUJVRyggYyApCitLTVBfU1RHX1hfREVCVUcoIGQgKQorS01QX1NUR19YX0RFQlVHKCBlICkKK0tNUF9TVEdfWF9ERUJVRyggZiApCisKKyN1bmRlZiBLTVBfU1RHX1hfREVCVUcKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9kZWJ1ZyggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgaW50IGRlYnVnID0gMDsKKyAgICBfX2ttcF9zdGdfcGFyc2VfaW50KCBuYW1lLCB2YWx1ZSwgMCwgSU5UX01BWCwgJiBkZWJ1ZyApOworICAgIGlmICgga21wX2FfZGVidWcgPCBkZWJ1ZyApIHsKKwlrbXBfYV9kZWJ1ZyA9IGRlYnVnOworICAgIH07IC8vIGlmCisgICAgaWYgKCBrbXBfYl9kZWJ1ZyA8IGRlYnVnICkgeworCWttcF9iX2RlYnVnID0gZGVidWc7CisgICAgfTsgLy8gaWYKKyAgICBpZiAoIGttcF9jX2RlYnVnIDwgZGVidWcgKSB7CisJa21wX2NfZGVidWcgPSBkZWJ1ZzsKKyAgICB9OyAvLyBpZgorICAgIGlmICgga21wX2RfZGVidWcgPCBkZWJ1ZyApIHsKKwlrbXBfZF9kZWJ1ZyA9IGRlYnVnOworICAgIH07IC8vIGlmCisgICAgaWYgKCBrbXBfZV9kZWJ1ZyA8IGRlYnVnICkgeworCWttcF9lX2RlYnVnID0gZGVidWc7CisgICAgfTsgLy8gaWYKKyAgICBpZiAoIGttcF9mX2RlYnVnIDwgZGVidWcgKSB7CisJa21wX2ZfZGVidWcgPSBkZWJ1ZzsKKyAgICB9OyAvLyBpZgorfSAvLyBfX2ttcF9zdGdfcGFyc2VfZGVidWcKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9kZWJ1Z19idWYoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9ib29sKCBuYW1lLCB2YWx1ZSwgJiBfX2ttcF9kZWJ1Z19idWYgKTsKKyAgICAvLyAhISEgVE9ETzogTW92ZSBidWZmZXIgaW5pdGlhbGl6YXRpb24gb2Ygb2YgdGhpcyBmaWxlISBJdCBtYXkgd29ya3MgaW5jb3JyZWN0bHkgaWYKKyAgICAvLyBLTVBfREVCVUdfQlVGIGlzIHBhcnNlZCBiZWZvcmUgS01QX0RFQlVHX0JVRl9MSU5FUyBvciBLTVBfREVCVUdfQlVGX0NIQVJTLgorICAgIGlmICggX19rbXBfZGVidWdfYnVmICkgeworCWludCBpOworCWludCBlbGVtZW50cyA9IF9fa21wX2RlYnVnX2J1Zl9saW5lcyAqIF9fa21wX2RlYnVnX2J1Zl9jaGFyczsKKworCS8qIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGFsbCBlbnRyaWVzIGluIGRlYnVnIGJ1ZmZlciB0byBlbXB0eSAqLworCV9fa21wX2RlYnVnX2J1ZmZlciA9IChjaGFyICopIF9fa21wX3BhZ2VfYWxsb2NhdGUoIGVsZW1lbnRzICogc2l6ZW9mKCBjaGFyICkgKTsKKwlmb3IgKCBpID0gMDsgaSA8IGVsZW1lbnRzOyBpICs9IF9fa21wX2RlYnVnX2J1Zl9jaGFycyApCisJICAgX19rbXBfZGVidWdfYnVmZmVyW2ldID0gJ1wwJzsKKworCV9fa21wX2RlYnVnX2NvdW50ID0gMDsKKyAgICB9CisgICAgS19ESUFHKCAxLCAoICJfX2ttcF9kZWJ1Z19idWYgPSAlZFxuIiwgX19rbXBfZGVidWdfYnVmICkgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2RlYnVnX2J1ZgorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2RlYnVnX2J1Zigga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9ib29sKCBidWZmZXIsIG5hbWUsIF9fa21wX2RlYnVnX2J1ZiApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfZGVidWdfYnVmCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfZGVidWdfYnVmX2F0b21pYyggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2Jvb2woIG5hbWUsIHZhbHVlLCAmIF9fa21wX2RlYnVnX2J1Zl9hdG9taWMgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2RlYnVnX2J1Zl9hdG9taWMKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9kZWJ1Z19idWZfYXRvbWljKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2Jvb2woIGJ1ZmZlciwgbmFtZSwgX19rbXBfZGVidWdfYnVmX2F0b21pYyApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfZGVidWdfYnVmX2F0b21pYworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2RlYnVnX2J1Zl9jaGFycyggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2ludCgKKwluYW1lLAorCXZhbHVlLAorCUtNUF9ERUJVR19CVUZfQ0hBUlNfTUlOLAorCUlOVF9NQVgsCisJJiBfX2ttcF9kZWJ1Z19idWZfY2hhcnMKKyAgICApOworfSAvLyBfX2ttcF9zdGdfZGVidWdfcGFyc2VfYnVmX2NoYXJzCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfZGVidWdfYnVmX2NoYXJzKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBfX2ttcF9kZWJ1Z19idWZfY2hhcnMgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2RlYnVnX2J1Zl9jaGFycworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2RlYnVnX2J1Zl9saW5lcyggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2ludCgKKwluYW1lLAorCXZhbHVlLAorCUtNUF9ERUJVR19CVUZfTElORVNfTUlOLAorCUlOVF9NQVgsCisJJiBfX2ttcF9kZWJ1Z19idWZfbGluZXMKKyAgICApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfZGVidWdfYnVmX2xpbmVzCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfZGVidWdfYnVmX2xpbmVzKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBfX2ttcF9kZWJ1Z19idWZfbGluZXMgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2RlYnVnX2J1Zl9saW5lcworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2RpYWcoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9pbnQoIG5hbWUsIHZhbHVlLCAwLCBJTlRfTUFYLCAmIGttcF9kaWFnICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9kaWFnCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfZGlhZygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwga21wX2RpYWcgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2RpYWcKKworI2VuZGlmIC8vIEtNUF9ERUJVRworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfQUxJR05fQUxMT0MKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9hbGlnbl9hbGxvYyggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX3NpemUoCisgICAgICAgIG5hbWUsCisgICAgICAgIHZhbHVlLAorICAgICAgICBDQUNIRV9MSU5FLAorICAgICAgICBJTlRfTUFYLAorICAgICAgICBOVUxMLAorICAgICAgICAmIF9fa21wX2FsaWduX2FsbG9jLAorICAgICAgICAxCisgICAgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2FsaWduX2FsbG9jCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfYWxpZ25fYWxsb2MoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICAgICAgX19rbXBfc3RnX3ByaW50X3NpemUoIGJ1ZmZlciwgbmFtZSwgX19rbXBfYWxpZ25fYWxsb2MgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2FsaWduX2FsbG9jCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9QTEFJTl9CQVJSSUVSLCBLTVBfRk9SS0pPSU5fQkFSUklFUiwgS01QX1JFRFVDVElPTl9CQVJSSUVSCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRPRE86IFJlbW92ZSBfX2ttcF9iYXJyaWVyX2JyYW5jaF9iaXRfZW52X25hbWUgdmFyaWJhbGUsIHJlbW92ZSBsb29wcyBmcm9tIHBhcnNlIGFuZCBwcmludAorLy8gICAgICAgZnVuY3Rpb25zLCBwYXNzIHJlcXVpcmVkIGluZm8gdGhyb3VnaCBkYXRhIGFyZ3VtZW50LgorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2JhcnJpZXJfYnJhbmNoX2JpdCggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgY29uc3QgY2hhciAqdmFyOworCisgICAgLyogLS0tLS0tLS0tLSBCYXJyaWVyIGJyYW5jaCBiaXQgY29udHJvbCAtLS0tLS0tLS0tLS0gKi8KKyAgICBmb3IgKCBpbnQgaT1ic19wbGFpbl9iYXJyaWVyOyBpPGJzX2xhc3RfYmFycmllcjsgaSsrICkgeworICAgICAgICB2YXIgPSBfX2ttcF9iYXJyaWVyX2JyYW5jaF9iaXRfZW52X25hbWVbIGkgXTsKKyAgICAgICAgaWYgKCAoIHN0cmNtcCggdmFyLCBuYW1lKSA9PSAwICkgJiYgKCB2YWx1ZSAhPSAwICkgKSB7CisgICAgICAgICAgICBjaGFyICpjb21tYTsKKworICAgICAgICAgICAgY29tbWEgPSAoY2hhciAqKSBzdHJjaHIoIHZhbHVlLCAnLCcgKTsKKyAgICAgICAgICAgIF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JyYW5jaF9iaXRzWyBpIF0gPSAoIGttcF91aW50MzIgKSBfX2ttcF9zdHJfdG9faW50KCB2YWx1ZSwgJywnICk7CisgICAgICAgICAgICAvKiBpcyB0aGVyZSBhIHNwZWNpZmllZCByZWxlYXNlIHBhcmFtZXRlcj8gKi8KKyAgICAgICAgICAgIGlmICggY29tbWEgPT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHNbIGkgXSA9IF9fa21wX2JhcnJpZXJfcmVsZWFzZV9iYl9kZmx0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHNbIGkgXSA9IChrbXBfdWludDMyKSBfX2ttcF9zdHJfdG9faW50KCBjb21tYSArIDEsIDAgKTsKKworICAgICAgICAgICAgICAgIGlmICggX19rbXBfYmFycmllcl9yZWxlYXNlX2JyYW5jaF9iaXRzWyBpIF0gPiBLTVBfTUFYX0JSQU5DSF9CSVRTICkgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2coIGttcF9tc193YXJuaW5nLCBLTVBfTVNHKCBCYXJyUmVsZWFzZVZhbHVlSW52YWxpZCwgbmFtZSwgY29tbWEgKyAxICksIF9fa21wX21zZ19udWxsICk7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0c1sgaSBdID0gX19rbXBfYmFycmllcl9yZWxlYXNlX2JiX2RmbHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBfX2ttcF9iYXJyaWVyX2dhdGhlcl9icmFuY2hfYml0c1sgaSBdID4gS01QX01BWF9CUkFOQ0hfQklUUyApIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEJhcnJHYXRoZXJWYWx1ZUludmFsaWQsIG5hbWUsIHZhbHVlICk7CisgICAgICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oIFVzaW5nX3VpbnRfVmFsdWUsIG5hbWUsIF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JiX2RmbHQgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX2dhdGhlcl9icmFuY2hfYml0c1sgaSBdID0gIF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JiX2RmbHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgS19ESUFHKDEsICgiJXMgPT0gJWQsJWRcbiIsIF9fa21wX2JhcnJpZXJfYnJhbmNoX2JpdF9lbnZfbmFtZVsgaSBdLCBcCisgICAgICAgICAgICAgICAgICAgX19rbXBfYmFycmllcl9nYXRoZXJfYnJhbmNoX2JpdHMgWyBpIF0sIFwKKyAgICAgICAgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHMgWyBpIF0pKQorICAgIH0KK30gLy8gX19rbXBfc3RnX3BhcnNlX2JhcnJpZXJfYnJhbmNoX2JpdAorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2JhcnJpZXJfYnJhbmNoX2JpdCgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIGNvbnN0IGNoYXIgKnZhcjsKKyAgICBmb3IgKCBpbnQgaT1ic19wbGFpbl9iYXJyaWVyOyBpPGJzX2xhc3RfYmFycmllcjsgaSsrICkgeworICAgICAgICB2YXIgPSBfX2ttcF9iYXJyaWVyX2JyYW5jaF9iaXRfZW52X25hbWVbIGkgXTsKKyAgICAgICAgaWYgKCBzdHJjbXAoIHZhciwgbmFtZSkgPT0gMCAgKSB7CisgICAgICAgICAgICBpZiggX19rbXBfZW52X2Zvcm1hdCApIHsKKyAgICAgICAgICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9OQU1FX0VYKF9fa21wX2JhcnJpZXJfYnJhbmNoX2JpdF9lbnZfbmFtZVsgaSBdKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXM9JyIsIF9fa21wX2JhcnJpZXJfYnJhbmNoX2JpdF9lbnZfbmFtZVsgaSBdICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlZCwlZCdcbiIsIF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JyYW5jaF9iaXRzIFsgaSBdLCBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHMgWyBpIF0pOworICAgICAgICB9CisgICAgfQorfSAvLyBfX2ttcF9zdGdfcHJpbnRfYmFycmllcl9icmFuY2hfYml0CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX1BMQUlOX0JBUlJJRVJfUEFUVEVSTiwgS01QX0ZPUktKT0lOX0JBUlJJRVJfUEFUVEVSTiwgS01QX1JFRFVDVElPTl9CQVJSSUVSX1BBVFRFUk4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gVE9ETzogUmVtb3ZlIF9fa21wX2JhcnJpZXJfcGF0dGVybl9uYW1lIHZhcmlhYmxlLCByZW1vdmUgbG9vcHMgZnJvbSBwYXJzZSBhbmQgcHJpbnQgZnVuY3Rpb25zLAorLy8gICAgICAgcGFzcyByZXF1aXJlZCBkYXRhIHRvIGZ1bmN0aW9ucyB0aHJvdWdoIGRhdGEgYXJndW1lbnQuCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfYmFycmllcl9wYXR0ZXJuKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBjb25zdCBjaGFyICp2YXI7CisgICAgLyogLS0tLS0tLS0tLSBCYXJyaWVyIG1ldGhvZCBjb250cm9sIC0tLS0tLS0tLS0tLSAqLworCisgICAgZm9yICggaW50IGk9YnNfcGxhaW5fYmFycmllcjsgaTxic19sYXN0X2JhcnJpZXI7IGkrKyApIHsKKyAgICAgICAgdmFyID0gX19rbXBfYmFycmllcl9wYXR0ZXJuX2Vudl9uYW1lWyBpIF07CisKKyAgICAgICAgaWYgKCAoIHN0cmNtcCAoIHZhciwgbmFtZSApID09IDAgKSAmJiAoIHZhbHVlICE9IDAgKSApIHsKKyAgICAgICAgICAgIGludCBqOworICAgICAgICAgICAgY2hhciAqY29tbWEgPSAoY2hhciAqKSBzdHJjaHIoIHZhbHVlLCAnLCcgKTsKKworICAgICAgICAgICAgLyogaGFuZGxlIGZpcnN0IHBhcmFtZXRlcjogZ2F0aGVyIHBhdHRlcm4gKi8KKyAgICAgICAgICAgIGZvciAoIGogPSBicF9saW5lYXJfYmFyOyBqPGJwX2xhc3RfYmFyOyBqKysgKSB7CisgICAgICAgICAgICAgICAgaWYgKF9fa21wX21hdGNoX3dpdGhfc2VudGluZWwoIF9fa21wX2JhcnJpZXJfcGF0dGVybl9uYW1lW2pdLCB2YWx1ZSwgMSwgJywnICkpIHsKKyAgICAgICAgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX2dhdGhlcl9wYXR0ZXJuWyBpIF0gPSAoa21wX2Jhcl9wYXRfZSkgajsKKyAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGogPT0gYnBfbGFzdF9iYXIgKSB7CisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEJhcnJHYXRoZXJWYWx1ZUludmFsaWQsIG5hbWUsIHZhbHVlICk7CisgICAgICAgICAgICAgICAgS01QX0lORk9STSggVXNpbmdfc3RyX1ZhbHVlLCBuYW1lLCBfX2ttcF9iYXJyaWVyX3BhdHRlcm5fbmFtZVsgYnBfbGluZWFyX2JhciBdICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGhhbmRsZSBzZWNvbmQgcGFyYW1ldGVyOiByZWxlYXNlIHBhdHRlcm4gKi8KKyAgICAgICAgICAgIGlmICggY29tbWEgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBmb3IgKCBqID0gYnBfbGluZWFyX2JhcjsgaiA8IGJwX2xhc3RfYmFyOyBqKysgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggX19rbXBfc3RyX21hdGNoKCBfX2ttcF9iYXJyaWVyX3BhdHRlcm5fbmFtZVtqXSwgMSwgY29tbWEgKyAxICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9wYXR0ZXJuWyBpIF0gPSAoa21wX2Jhcl9wYXRfZSkgajsKKyAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGogPT0gYnBfbGFzdF9iYXIpIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKCBrbXBfbXNfd2FybmluZywgS01QX01TRyggQmFyclJlbGVhc2VWYWx1ZUludmFsaWQsIG5hbWUsIGNvbW1hICsgMSApLCBfX2ttcF9tc2dfbnVsbCApOworICAgICAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKCBVc2luZ19zdHJfVmFsdWUsIG5hbWUsIF9fa21wX2JhcnJpZXJfcGF0dGVybl9uYW1lWyBicF9saW5lYXJfYmFyIF0gKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9iYXJyaWVyX3BhdHRlcm4KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9iYXJyaWVyX3BhdHRlcm4oIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBjb25zdCBjaGFyICp2YXI7CisgICAgZm9yICggaW50IGk9YnNfcGxhaW5fYmFycmllcjsgaTxic19sYXN0X2JhcnJpZXI7IGkrKyApIHsKKyAgICAgICAgdmFyID0gX19rbXBfYmFycmllcl9wYXR0ZXJuX2Vudl9uYW1lWyBpIF07CisgICAgICAgIGlmICggc3RyY21wICggdmFyLCBuYW1lICkgPT0gMCApIHsKKyAgICAgICAgICAgIGludCBqID0gX19rbXBfYmFycmllcl9nYXRoZXJfcGF0dGVybiBbIGkgXTsKKyAgICAgICAgICAgIGludCBrID0gX19rbXBfYmFycmllcl9yZWxlYXNlX3BhdHRlcm4gWyBpIF07CisgICAgICAgICAgICBpZiggX19rbXBfZW52X2Zvcm1hdCApIHsKKyAgICAgICAgICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9OQU1FX0VYKF9fa21wX2JhcnJpZXJfcGF0dGVybl9lbnZfbmFtZVsgaSBdKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXM9JyIsIF9fa21wX2JhcnJpZXJfcGF0dGVybl9lbnZfbmFtZVsgaSBdICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcywlcydcbiIsIF9fa21wX2JhcnJpZXJfcGF0dGVybl9uYW1lIFsgaiBdLCBfX2ttcF9iYXJyaWVyX3BhdHRlcm5fbmFtZSBbIGsgXSk7CisgICAgICAgIH0KKyAgICB9Cit9IC8vIF9fa21wX3N0Z19wcmludF9iYXJyaWVyX3BhdHRlcm4KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0FCT1JUX0RFTEFZCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfYWJvcnRfZGVsYXkoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIC8vIFVuaXRzIG9mIEtNUF9ERUxBWV9BQk9SVCBhcmUgc2Vjb25kcywgdW5pdHMgb2YgX19rbXBfYWJvcnRfZGVsYXkgaXMgbWlsbGlzZWNvbmRzLgorICAgIGludCBkZWxheSA9IF9fa21wX2Fib3J0X2RlbGF5IC8gMTAwMDsKKyAgICBfX2ttcF9zdGdfcGFyc2VfaW50KCBuYW1lLCB2YWx1ZSwgMCwgSU5UX01BWCAvIDEwMDAsICYgZGVsYXkgKTsKKyAgICBfX2ttcF9hYm9ydF9kZWxheSA9IGRlbGF5ICogMTAwMDsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2Fib3J0X2RlbGF5CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfYWJvcnRfZGVsYXkoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfaW50KCBidWZmZXIsIG5hbWUsIF9fa21wX2Fib3J0X2RlbGF5ICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9hYm9ydF9kZWxheQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfQ1BVSU5GT19GSUxFCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfY3B1aW5mb19maWxlKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICAjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICBfX2ttcF9zdGdfcGFyc2Vfc3RyKCBuYW1lLCB2YWx1ZSwgJiBfX2ttcF9jcHVpbmZvX2ZpbGUgKTsKKyAgICAgICAgS19ESUFHKCAxLCAoICJfX2ttcF9jcHVpbmZvX2ZpbGUgPT0gJXNcbiIsIF9fa21wX2NwdWluZm9fZmlsZSApICk7CisgICAgI2VuZGlmCit9IC8vX19rbXBfc3RnX3BhcnNlX2NwdWluZm9fZmlsZQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2NwdWluZm9fZmlsZSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgICNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIGlmKCBfX2ttcF9lbnZfZm9ybWF0ICkgeworICAgICAgICAgICAgS01QX1NUUl9CVUZfUFJJTlRfTkFNRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzIiwgbmFtZSApOworICAgICAgICB9CisgICAgICAgIGlmICggX19rbXBfY3B1aW5mb19maWxlICkgeworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiPSclcydcbiIsIF9fa21wX2NwdWluZm9fZmlsZSApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiOiAlc1xuIiwgS01QX0kxOE5fU1RSKCBOb3REZWZpbmVkICkgKTsKKyAgICAgICAgfQorICAgICNlbmRpZgorfSAvL19fa21wX3N0Z19wcmludF9jcHVpbmZvX2ZpbGUKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0ZPUkNFX1JFRFVDVElPTiwgS01QX0RFVEVSTUlOSVNUSUNfUkVEVUNUSU9OCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfZm9yY2VfcmVkdWN0aW9uKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApCit7CisgICAga21wX3N0Z19mcl9kYXRhX3QgKiByZWR1Y3Rpb24gPSAoa21wX3N0Z19mcl9kYXRhX3QgKikgZGF0YTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHJjOworCisgICAgcmMgPSBfX2ttcF9zdGdfY2hlY2tfcml2YWxzKCBuYW1lLCB2YWx1ZSwgcmVkdWN0aW9uLT5yaXZhbHMgKTsKKyAgICBpZiAoIHJjICkgeworICAgICAgICByZXR1cm47CisgICAgfTsgLy8gaWYKKyAgICBpZiAoIHJlZHVjdGlvbi0+Zm9yY2UgKSB7CisgICAgICAgIGlmKCB2YWx1ZSAhPSAwICkgeworICAgICAgICAgICAgaWYoIF9fa21wX3N0cl9tYXRjaCggImNyaXRpY2FsIiwgMCwgdmFsdWUgKSApCisgICAgICAgICAgICAgICBfX2ttcF9mb3JjZV9yZWR1Y3Rpb25fbWV0aG9kID0gY3JpdGljYWxfcmVkdWNlX2Jsb2NrOworICAgICAgICAgICAgZWxzZSBpZiggX19rbXBfc3RyX21hdGNoKCAiYXRvbWljIiwgMCwgdmFsdWUgKSApCisgICAgICAgICAgICAgICBfX2ttcF9mb3JjZV9yZWR1Y3Rpb25fbWV0aG9kID0gYXRvbWljX3JlZHVjZV9ibG9jazsKKyAgICAgICAgICAgIGVsc2UgaWYoIF9fa21wX3N0cl9tYXRjaCggInRyZWUiLCAwLCB2YWx1ZSApICkKKyAgICAgICAgICAgICAgIF9fa21wX2ZvcmNlX3JlZHVjdGlvbl9tZXRob2QgPSB0cmVlX3JlZHVjZV9ibG9jazsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEtNUF9GQVRBTCggVW5rbm93bkZvcmNlUmVkdWN0aW9uLCBuYW1lLCB2YWx1ZSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RnX3BhcnNlX2Jvb2woIG5hbWUsIHZhbHVlLCAmIF9fa21wX2RldGVybV9yZWQgKTsKKyAgICAgICAgaWYoIF9fa21wX2RldGVybV9yZWQgKSB7CisgICAgICAgICAgICBfX2ttcF9mb3JjZV9yZWR1Y3Rpb25fbWV0aG9kID0gdHJlZV9yZWR1Y2VfYmxvY2s7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfX2ttcF9mb3JjZV9yZWR1Y3Rpb25fbWV0aG9kID0gcmVkdWN0aW9uX21ldGhvZF9ub3RfZGVmaW5lZDsKKyAgICAgICAgfQorICAgIH0KKyAgICBLX0RJQUcoIDEsICggIl9fa21wX2ZvcmNlX3JlZHVjdGlvbl9tZXRob2QgPT0gJWRcbiIsIF9fa21wX2ZvcmNlX3JlZHVjdGlvbl9tZXRob2QgKSApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfZm9yY2VfcmVkdWN0aW9uCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfZm9yY2VfcmVkdWN0aW9uKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisKKyAgICBrbXBfc3RnX2ZyX2RhdGFfdCAqIHJlZHVjdGlvbiA9IChrbXBfc3RnX2ZyX2RhdGFfdCAqKSBkYXRhOworICAgIGlmICggcmVkdWN0aW9uLT5mb3JjZSApIHsKKyAgICAgICAgaWYoIF9fa21wX2ZvcmNlX3JlZHVjdGlvbl9tZXRob2QgPT0gY3JpdGljYWxfcmVkdWNlX2Jsb2NrKSB7CisgICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc3RyKCBidWZmZXIsIG5hbWUsICJjcml0aWNhbCIpOworICAgICAgICB9IGVsc2UgaWYgKCBfX2ttcF9mb3JjZV9yZWR1Y3Rpb25fbWV0aG9kID09IGF0b21pY19yZWR1Y2VfYmxvY2sgKSB7CisgICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc3RyKCBidWZmZXIsIG5hbWUsICJhdG9taWMiKTsKKyAgICAgICAgfSBlbHNlIGlmICggX19rbXBfZm9yY2VfcmVkdWN0aW9uX21ldGhvZCA9PSB0cmVlX3JlZHVjZV9ibG9jayApIHsKKyAgICAgICAgICAgIF9fa21wX3N0Z19wcmludF9zdHIoIGJ1ZmZlciwgbmFtZSwgInRyZWUiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmKCBfX2ttcF9lbnZfZm9ybWF0ICkgeworICAgICAgICAgICAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX05BTUU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzIiwgbmFtZSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiOiAlc1xuIiwgS01QX0kxOE5fU1RSKCBOb3REZWZpbmVkICkgKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0Z19wcmludF9ib29sKCBidWZmZXIsIG5hbWUsIF9fa21wX2RldGVybV9yZWQgKTsKKyAgICB9CisKKworfSAvLyBfX2ttcF9zdGdfcHJpbnRfZm9yY2VfcmVkdWN0aW9uCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9TVE9SQUdFX01BUAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3N0b3JhZ2VfbWFwKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBpZiAoIF9fa21wX3N0cl9tYXRjaCggICJ2ZXJib3NlIiwgMSwgdmFsdWUgKSApIHsKKyAgICAgICAgX19rbXBfc3RvcmFnZV9tYXAgICAgICAgICA9IFRSVUU7CisgICAgICAgIF9fa21wX3N0b3JhZ2VfbWFwX3ZlcmJvc2UgPSBUUlVFOworICAgICAgICBfX2ttcF9zdG9yYWdlX21hcF92ZXJib3NlX3NwZWNpZmllZCA9IFRSVUU7CisKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdG9yYWdlX21hcF92ZXJib3NlID0gRkFMU0U7CisgICAgICAgIF9fa21wX3N0Z19wYXJzZV9ib29sKCBuYW1lLCB2YWx1ZSwgJiBfX2ttcF9zdG9yYWdlX21hcCApOyAvLyAhISEKKyAgICB9OyAvLyBpZgorfSAvLyBfX2ttcF9zdGdfcGFyc2Vfc3RvcmFnZV9tYXAKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9zdG9yYWdlX21hcCgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIGlmICggX19rbXBfc3RvcmFnZV9tYXBfdmVyYm9zZSB8fCBfX2ttcF9zdG9yYWdlX21hcF92ZXJib3NlX3NwZWNpZmllZCApIHsKKyAgICAgICAgX19rbXBfc3RnX3ByaW50X3N0ciggYnVmZmVyLCBuYW1lLCAidmVyYm9zZSIgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdGdfcHJpbnRfYm9vbCggYnVmZmVyLCBuYW1lLCBfX2ttcF9zdG9yYWdlX21hcCApOworICAgIH0KK30gLy8gX19rbXBfc3RnX3ByaW50X3N0b3JhZ2VfbWFwCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9BTExfVEhSRUFEUFJJVkFURQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2FsbF90aHJlYWRwcml2YXRlKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2VfaW50KCBuYW1lLCB2YWx1ZSwgX19rbXBfYWxsVGhyZWFkc1NwZWNpZmllZCA/IF9fa21wX21heF9udGggOiAxLCBfX2ttcF9tYXhfbnRoLAorICAgICAgICAmIF9fa21wX3RwX2NhcGFjaXR5ICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9hbGxfdGhyZWFkcHJpdmF0ZQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2FsbF90aHJlYWRwcml2YXRlKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBfX2ttcF90cF9jYXBhY2l0eSApOworCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9GT1JFSUdOX1RIUkVBRFNfVEhSRUFEUFJJVkFURQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2ZvcmVpZ25fdGhyZWFkc190aHJlYWRwcml2YXRlKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2VfYm9vbCggbmFtZSwgdmFsdWUsICYgX19rbXBfZm9yZWlnbl90cCApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfZm9yZWlnbl90aHJlYWRzX3RocmVhZHByaXZhdGUKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9mb3JlaWduX3RocmVhZHNfdGhyZWFkcHJpdmF0ZSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9ib29sKCBidWZmZXIsIG5hbWUsIF9fa21wX2ZvcmVpZ25fdHAgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2ZvcmVpZ25fdGhyZWFkc190aHJlYWRwcml2YXRlCisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0FGRklOSVRZLCBHT01QX0NQVV9BRkZJTklUWSwgS01QX1RPUE9MT0dZX01FVEhPRAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorLy8KKy8vIFBhcnNlIHRoZSBwcm9jIGlkIGxpc3QuICBSZXR1cm4gVFJVRSBpZiBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UuCisvLworc3RhdGljIGludAorX19rbXBfcGFyc2VfYWZmaW5pdHlfcHJvY19pZF9saXN0KCBjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKmVudiwKKyAgICBjb25zdCBjaGFyICoqbmV4dEVudiwgY2hhciAqKnByb2NsaXN0ICkKK3sKKyAgICBjb25zdCBjaGFyICpzY2FuID0gZW52OworICAgIGNvbnN0IGNoYXIgKm5leHQgPSBzY2FuOworICAgIGludCBlbXB0eSA9IFRSVUU7CisKKyAgICAqcHJvY2xpc3QgPSBOVUxMOworCisgICAgZm9yICg7OykgeworICAgICAgICBpbnQgc3RhcnQsIGVuZCwgc3RyaWRlOworCisgICAgICAgIFNLSVBfV1Moc2Nhbik7CisgICAgICAgIG5leHQgPSBzY2FuOworICAgICAgICBpZiAoKm5leHQgPT0gJ1wwJykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKm5leHQgPT0gJ3snKSB7CisgICAgICAgICAgICBpbnQgbnVtOworICAgICAgICAgICAgbmV4dCsrOyAgICAgLy8gc2tpcCAneycKKyAgICAgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgICAgICBzY2FuID0gbmV4dDsKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFJlYWQgdGhlIGZpcnN0IGludGVnZXIgaW4gdGhlIHNldC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBpZiAoKCpuZXh0IDwgJzAnKSB8fCAoKm5leHQgPiAnOScpKSB7CisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZlN5bnRheEVycm9yLCB2YXIgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgICAgIG51bSA9IF9fa21wX3N0cl90b19pbnQoc2NhbiwgKm5leHQpOworICAgICAgICAgICAgS01QX0FTU0VSVChudW0gPj0gMCk7CisKKyAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBlbmQgb2Ygc2V0LgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgICAgICAgICBpZiAoKm5leHQgPT0gJ30nKSB7CisgICAgICAgICAgICAgICAgICAgIG5leHQrKzsgICAgIC8vIHNraXAgJ30nCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gU2tpcCBvcHRpb25hbCBjb21tYS4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIGlmICgqbmV4dCA9PSAnLCcpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV4dCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTS0lQX1dTKG5leHQpOworCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBSZWFkIHRoZSBuZXh0IGludGVnZXIgaW4gdGhlIHNldC4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIHNjYW4gPSBuZXh0OworICAgICAgICAgICAgICAgIGlmICgoKm5leHQgPCAnMCcpIHx8ICgqbmV4dCA+ICc5JykpIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZlN5bnRheEVycm9yLCB2YXIgKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICAgICAgICAgIG51bSA9IF9fa21wX3N0cl90b19pbnQoc2NhbiwgKm5leHQpOworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQobnVtID49IDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZW1wdHkgPSBGQUxTRTsKKworICAgICAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgICAgIGlmICgqbmV4dCA9PSAnLCcpIHsKKyAgICAgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzY2FuID0gbmV4dDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gTmV4dCBjaGFyYWN0ZXIgaXMgbm90IGFuIGludGVnZXIgPT4gZW5kIG9mIGxpc3QKKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCgqbmV4dCA8ICcwJykgfHwgKCpuZXh0ID4gJzknKSkgeworICAgICAgICAgICAgaWYgKGVtcHR5KSB7CisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZlN5bnRheEVycm9yLCB2YXIgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIFJlYWQgdGhlIGZpcnN0IGludGVnZXIuCisgICAgICAgIC8vCisgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICBzdGFydCA9IF9fa21wX3N0cl90b19pbnQoc2NhbiwgKm5leHQpOworICAgICAgICBLTVBfQVNTRVJUKHN0YXJ0ID49IDApOworICAgICAgICBTS0lQX1dTKG5leHQpOworCisgICAgICAgIC8vCisgICAgICAgIC8vIElmIHRoaXMgaXNuJ3QgYSByYW5nZSwgdGhlbiBnbyBvbi4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCpuZXh0ICE9ICctJykgeworICAgICAgICAgICAgZW1wdHkgPSBGQUxTRTsKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFNraXAgb3B0aW9uYWwgY29tbWEuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgaWYgKCpuZXh0ID09ICcsJykgeworICAgICAgICAgICAgICAgIG5leHQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNjYW4gPSBuZXh0OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBUaGlzIGlzIGEgcmFuZ2UuICBTa2lwIG92ZXIgdGhlICctJyBhbmQgcmVhZCBpbiB0aGUgMm5kIGludC4KKyAgICAgICAgLy8KKyAgICAgICAgbmV4dCsrOyAgICAgICAgIC8vIHNraXAgJy0nCisgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgIHNjYW4gPSBuZXh0OworICAgICAgICBpZiAoKCpuZXh0IDwgJzAnKSB8fCAoKm5leHQgPiAnOScpKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmU3ludGF4RXJyb3IsIHZhciApOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICBlbmQgPSBfX2ttcF9zdHJfdG9faW50KHNjYW4sICpuZXh0KTsKKyAgICAgICAgS01QX0FTU0VSVChlbmQgPj0gMCk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQ2hlY2sgZm9yIGEgc3RyaWRlIHBhcmFtZXRlcgorICAgICAgICAvLworICAgICAgICBzdHJpZGUgPSAxOworICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICBpZiAoKm5leHQgPT0gJzonKSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gQSBzdHJpZGUgaXMgc3BlY2lmaWVkLiAgU2tpcCBvdmVyIHRoZSAnOiIgYW5kIHJlYWQgdGhlIDNyZCBpbnQuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgaW50IHNpZ24gPSArMTsKKyAgICAgICAgICAgIG5leHQrKzsgICAgICAgICAvLyBza2lwICc6JworICAgICAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgICAgIHNjYW4gPSBuZXh0OworICAgICAgICAgICAgaWYgKCpuZXh0ID09ICctJykgeworICAgICAgICAgICAgICAgIHNpZ24gPSAtMTsKKyAgICAgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgICAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgICAgICAgICBzY2FuID0gbmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoKm5leHQgPCAnMCcpIHx8ICgqbmV4dCA+ICc5JykpIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmU3ludGF4RXJyb3IsIHZhciApOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICAgICAgc3RyaWRlID0gX19rbXBfc3RyX3RvX2ludChzY2FuLCAqbmV4dCk7CisgICAgICAgICAgICBLTVBfQVNTRVJUKHN0cmlkZSA+PSAwKTsKKyAgICAgICAgICAgIHN0cmlkZSAqPSBzaWduOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRG8gc29tZSByYW5nZSBjaGVja3MuCisgICAgICAgIC8vCisgICAgICAgIGlmIChzdHJpZGUgPT0gMCkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZlplcm9TdHJpZGUsIHZhciApOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJpZGUgPiAwKSB7CisgICAgICAgICAgICBpZiAoc3RhcnQgPiBlbmQpIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmU3RhcnRHcmVhdGVyRW5kLCB2YXIsIHN0YXJ0LCBlbmQgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoc3RhcnQgPCBlbmQpIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmU3RyaWRlTGVzc1plcm8sIHZhciwgc3RhcnQsIGVuZCApOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoKGVuZCAtIHN0YXJ0KSAvIHN0cmlkZSA+IDY1NTM2ICkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZlJhbmdlVG9vQmlnLCB2YXIsIGVuZCwgc3RhcnQsIHN0cmlkZSApOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgZW1wdHkgPSBGQUxTRTsKKworICAgICAgICAvLworICAgICAgICAvLyBTa2lwIG9wdGlvbmFsIGNvbW1hLgorICAgICAgICAvLworICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICBpZiAoKm5leHQgPT0gJywnKSB7CisgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgIH0KKyAgICAgICAgc2NhbiA9IG5leHQ7CisgICAgfQorCisgICAgKm5leHRFbnYgPSBuZXh0OworCisgICAgeworICAgICAgICBpbnQgbGVuID0gbmV4dCAtIGVudjsKKyAgICAgICAgY2hhciAqcmV0bGlzdCA9IChjaGFyICopX19rbXBfYWxsb2NhdGUoKGxlbiArIDEpICogc2l6ZW9mKGNoYXIpKTsKKyAgICAgICAgS01QX01FTUNQWV9TKHJldGxpc3QsIChsZW4rMSkqc2l6ZW9mKGNoYXIpLCBlbnYsIGxlbiAqIHNpemVvZihjaGFyKSk7CisgICAgICAgIHJldGxpc3RbbGVuXSA9ICdcMCc7CisgICAgICAgICpwcm9jbGlzdCA9IHJldGxpc3Q7CisgICAgfQorICAgIHJldHVybiBUUlVFOworfQorCisKKy8vCisvLyBJZiBLTVBfQUZGSU5JVFkgaXMgc3BlY2lmaWVkIHdpdGhvdXQgYSB0eXBlLCB0aGVuCisvLyBfX2ttcF9hZmZpbml0eV9ub3R5cGUgc2hvdWxkIHBvaW50IHRvIGl0cyBzZXR0aW5nLgorLy8KK3N0YXRpYyBrbXBfc2V0dGluZ190ICpfX2ttcF9hZmZpbml0eV9ub3R5cGUgPSBOVUxMOworCitzdGF0aWMgdm9pZAorX19rbXBfcGFyc2VfYWZmaW5pdHlfZW52KCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLAorICAgIGVudW0gYWZmaW5pdHlfdHlwZSAgKiBvdXRfdHlwZSwKKyAgICBjaGFyICAgICAgICAgICAgICAgICoqIG91dF9wcm9jbGlzdCwKKyAgICBpbnQgICAgICAgICAgICAgICAgICogb3V0X3ZlcmJvc2UsCisgICAgaW50ICAgICAgICAgICAgICAgICAqIG91dF93YXJuLAorICAgIGludCAgICAgICAgICAgICAgICAgKiBvdXRfcmVzcGVjdCwKKyAgICBlbnVtIGFmZmluaXR5X2dyYW4gICogb3V0X2dyYW4sCisgICAgaW50ICAgICAgICAgICAgICAgICAqIG91dF9ncmFuX2xldmVscywKKyAgICBpbnQgICAgICAgICAgICAgICAgICogb3V0X2R1cHMsCisgICAgaW50ICAgICAgICAgICAgICAgICAqIG91dF9jb21wYWN0LAorICAgIGludCAgICAgICAgICAgICAgICAgKiBvdXRfb2Zmc2V0CispCit7CisgICAgY2hhciAqIGJ1ZmZlciA9IE5VTEw7ICAgIC8vIENvcHkgb2YgZW52IHZhciB2YWx1ZS4KKyAgICBjaGFyICogYnVmICAgID0gTlVMTDsgICAgLy8gQnVmZmVyIGZvciBzdHJ0b2tfcigpIGZ1bmN0aW9uLgorICAgIGNoYXIgKiBuZXh0ID0gTlVMTDsgICAgICAvLyBlbmQgb2YgdG9rZW4gLyBzdGFydCBvZiBuZXh0LgorICAgIGNvbnN0IGNoYXIgKiBzdGFydDsgICAgICAvLyBzdGFydCBvZiBjdXJyZW50IHRva2VuIChmb3IgZXJyIG1zZ3MpCisgICAgaW50ICAgIGNvdW50ICA9IDA7ICAgICAgIC8vIENvdW50ZXIgb2YgcGFyc2VkIGludGVnZXIgbnVtYmVycy4KKyAgICBpbnQgICAgbnVtYmVyWyAyIF07ICAgICAgLy8gUGFyc2VkIG51bWJlcnMuCisKKyAgICAvLyBHdWFyZHMuCisgICAgaW50IHR5cGUgICAgICAgICA9IDA7CisgICAgaW50IHByb2NsaXN0ICAgICA9IDA7CisgICAgaW50IG1heF9wcm9jbGlzdCA9IDA7CisgICAgaW50IHZlcmJvc2UgICAgICA9IDA7CisgICAgaW50IHdhcm5pbmdzICAgICA9IDA7CisgICAgaW50IHJlc3BlY3QgICAgICA9IDA7CisgICAgaW50IGdyYW4gICAgICAgICA9IDA7CisgICAgaW50IGR1cHMgICAgICAgICA9IDA7CisKKyAgICBLTVBfQVNTRVJUKCB2YWx1ZSAhPSBOVUxMICk7CisKKyAgICBpZiAoIFRDUl80KF9fa21wX2luaXRfbWlkZGxlKSApIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIEVudk1pZGRsZVdhcm4sIG5hbWUgKTsKKyAgICAgICAgX19rbXBfZW52X3RvUHJpbnQoIG5hbWUsIDAgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBfX2ttcF9lbnZfdG9QcmludCggbmFtZSwgMSApOworCisgICAgYnVmZmVyID0gX19rbXBfc3RyX2Zvcm1hdCggIiVzIiwgdmFsdWUgKTsgICAgICAgICAvLyBDb3B5IGVudiB2YXIgdG8ga2VlcCBvcmlnaW5hbCBpbnRhY3QuCisgICAgYnVmID0gYnVmZmVyOworICAgIFNLSVBfV1MoYnVmKTsKKworICAgIC8vIEhlbHBlciBtYWNyb3MuCisKKyAgICAvLworICAgIC8vIElmIHdlIHNlZSBhIHBhcnNlIGVycm9yLCBlbWl0IGEgd2FybmluZyBhbmQgc2NhbiB0byB0aGUgbmV4dCAiLCIuCisgICAgLy8KKyAgICAvLyBGSVhNRSAtIHRoZXJlJ3MgZ290IHRvIGJlIGEgYmV0dGVyIHdheSB0byBwcmludCBhbiBlcnJvcgorICAgIC8vIG1lc3NhZ2UsIGhvcGVmdWxseSB3aXRob3V0IG92ZXJ3cml0dGluZyBwZWljZXMgb2YgYnVmLgorICAgIC8vCisgICAgI2RlZmluZSBFTUlUX1dBUk4oc2tpcCxlcnJsaXN0KSBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjaGFyIGNoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoc2tpcCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgU0tJUF9UTyhuZXh0LCAnLCcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjaCA9ICpuZXh0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAqbmV4dCA9ICdcMCc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfV0FSTklORyBlcnJsaXN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAqbmV4dCA9IGNoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoc2tpcCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKGNoID09ICcsJykgbmV4dCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBidWYgPSBuZXh0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0KKworICAgICNkZWZpbmUgX3NldF9wYXJhbShfZ3VhcmQsX3ZhcixfdmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKCBfZ3VhcmQgPT0gMCApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIF92YXIgPSBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEVNSVRfV0FSTiggRkFMU0UsICggQWZmUGFyYW1EZWZpbmVkLCBuYW1lLCBzdGFydCApICk7ICAgICAgICAgXAorICAgICAgICAgICAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKysgX2d1YXJkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9CisKKyAgICAjZGVmaW5lIHNldF90eXBlKHZhbCkgICAgICAgICAgX3NldF9wYXJhbSggdHlwZSwgICAgICpvdXRfdHlwZSwgICAgICAgIHZhbCApCisgICAgI2RlZmluZSBzZXRfdmVyYm9zZSh2YWwpICAgICAgIF9zZXRfcGFyYW0oIHZlcmJvc2UsICAqb3V0X3ZlcmJvc2UsICAgICB2YWwgKQorICAgICNkZWZpbmUgc2V0X3dhcm5pbmdzKHZhbCkgICAgICBfc2V0X3BhcmFtKCB3YXJuaW5ncywgKm91dF93YXJuLCAgICAgICAgdmFsICkKKyAgICAjZGVmaW5lIHNldF9yZXNwZWN0KHZhbCkgICAgICAgX3NldF9wYXJhbSggcmVzcGVjdCwgICpvdXRfcmVzcGVjdCwgICAgIHZhbCApCisgICAgI2RlZmluZSBzZXRfZHVwcyh2YWwpICAgICAgICAgIF9zZXRfcGFyYW0oIGR1cHMsICAgICAqb3V0X2R1cHMsICAgICAgICB2YWwgKQorICAgICNkZWZpbmUgc2V0X3Byb2NsaXN0KHZhbCkgICAgICBfc2V0X3BhcmFtKCBwcm9jbGlzdCwgKm91dF9wcm9jbGlzdCwgICAgdmFsICkKKworICAgICNkZWZpbmUgc2V0X2dyYW4odmFsLGxldmVscykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKCBncmFuID09IDAgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICpvdXRfZ3JhbiA9IHZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICpvdXRfZ3Jhbl9sZXZlbHMgPSBsZXZlbHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEVNSVRfV0FSTiggRkFMU0UsICggQWZmUGFyYW1EZWZpbmVkLCBuYW1lLCBzdGFydCApICk7ICAgICAgICAgXAorICAgICAgICAgICAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKysgZ3JhbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9CisKKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICBLTVBfREVCVUdfQVNTRVJUKCAoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlcyAhPSBOVUxMICkKKyAgICAgICYmICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC51c2VkID4gMCApICk7CisjIGVuZGlmCisKKyAgICB3aGlsZSAoICpidWYgIT0gJ1wwJyApIHsKKyAgICAgICAgc3RhcnQgPSBuZXh0ID0gYnVmOworCisgICAgICAgIGlmIChfX2ttcF9tYXRjaF9zdHIoIm5vbmUiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgc2V0X3R5cGUoIGFmZmluaXR5X25vbmUgKTsKKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF9mYWxzZTsKKyMgZW5kaWYKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJzY2F0dGVyIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgIHNldF90eXBlKCBhZmZpbml0eV9zY2F0dGVyICk7CisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfaW50ZWw7CisjIGVuZGlmCisgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigiY29tcGFjdCIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICBzZXRfdHlwZSggYWZmaW5pdHlfY29tcGFjdCApOworIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID0gcHJvY19iaW5kX2ludGVsOworIyBlbmRpZgorICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoImxvZ2ljYWwiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgc2V0X3R5cGUoIGFmZmluaXR5X2xvZ2ljYWwgKTsKKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF9pbnRlbDsKKyMgZW5kaWYKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJwaHlzaWNhbCIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICBzZXRfdHlwZSggYWZmaW5pdHlfcGh5c2ljYWwgKTsKKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF9pbnRlbDsKKyMgZW5kaWYKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJleHBsaWNpdCIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICBzZXRfdHlwZSggYWZmaW5pdHlfZXhwbGljaXQgKTsKKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF9pbnRlbDsKKyMgZW5kaWYKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJiYWxhbmNlZCIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICBzZXRfdHlwZSggYWZmaW5pdHlfYmFsYW5jZWQgKTsKKyMgIGlmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfaW50ZWw7CisjICBlbmRpZgorICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoImRpc2FibGVkIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgIHNldF90eXBlKCBhZmZpbml0eV9kaXNhYmxlZCApOworIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID0gcHJvY19iaW5kX2ZhbHNlOworIyBlbmRpZgorICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoInZlcmJvc2UiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgc2V0X3ZlcmJvc2UoIFRSVUUgKTsKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJub3ZlcmJvc2UiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgc2V0X3ZlcmJvc2UoIEZBTFNFICk7CisgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigid2FybmluZ3MiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgc2V0X3dhcm5pbmdzKCBUUlVFICk7CisgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigibm93YXJuaW5ncyIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICBzZXRfd2FybmluZ3MoIEZBTFNFICk7CisgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigicmVzcGVjdCIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICBzZXRfcmVzcGVjdCggVFJVRSApOworICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoIm5vcmVzcGVjdCIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICBzZXRfcmVzcGVjdCggRkFMU0UgKTsKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJkdXBsaWNhdGVzIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkKKyAgICAgICAgICB8fCBfX2ttcF9tYXRjaF9zdHIoImR1cHMiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgc2V0X2R1cHMoIFRSVUUgKTsKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJub2R1cGxpY2F0ZXMiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KQorICAgICAgICAgIHx8IF9fa21wX21hdGNoX3N0cigibm9kdXBzIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgIHNldF9kdXBzKCBGQUxTRSApOworICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoImdyYW51bGFyaXR5IiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkKKyAgICAgICAgICB8fCBfX2ttcF9tYXRjaF9zdHIoImdyYW4iLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgICAgIGlmICgqbmV4dCAhPSAnPScpIHsKKyAgICAgICAgICAgICAgICBFTUlUX1dBUk4oIFRSVUUsICggQWZmSW52YWxpZFBhcmFtLCBuYW1lLCBzdGFydCApICk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuZXh0Kys7ICAgICAgLy8gc2tpcCAnPScKKyAgICAgICAgICAgIFNLSVBfV1MobmV4dCk7CisKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgICAgICBpZiAoX19rbXBfbWF0Y2hfc3RyKCJmaW5lIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgICAgICBzZXRfZ3JhbiggYWZmaW5pdHlfZ3Jhbl9maW5lLCAtMSApOworICAgICAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigidGhyZWFkIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgICAgICBzZXRfZ3JhbiggYWZmaW5pdHlfZ3Jhbl90aHJlYWQsIC0xICk7CisgICAgICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJjb3JlIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgICAgICBzZXRfZ3JhbiggYWZmaW5pdHlfZ3Jhbl9jb3JlLCAtMSApOworICAgICAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigicGFja2FnZSIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICAgICAgc2V0X2dyYW4oIGFmZmluaXR5X2dyYW5fcGFja2FnZSwgLTEgKTsKKyAgICAgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICAgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoIm5vZGUiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgICAgIHNldF9ncmFuKCBhZmZpbml0eV9ncmFuX25vZGUsIC0xICk7CisgICAgICAgICAgICAgICAgYnVmID0gbmV4dDsKKyMgaWYgS01QX0dST1VQX0FGRklOSVRZCisgICAgICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigiZ3JvdXAiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgICAgIHNldF9ncmFuKCBhZmZpbml0eV9ncmFuX2dyb3VwLCAtMSApOworICAgICAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisjIGVuZGlmIC8qIEtNUF9HUk9VUCBBRkZJTklUWSAqLworICAgICAgICAgICAgfSBlbHNlIGlmICgoKmJ1ZiA+PSAnMCcpICYmICgqYnVmIDw9ICc5JykpIHsKKyAgICAgICAgICAgICAgICBpbnQgbjsKKyAgICAgICAgICAgICAgICBuZXh0ID0gYnVmOworICAgICAgICAgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICAgICAgICAgIG4gPSBfX2ttcF9zdHJfdG9faW50KCBidWYsICpuZXh0ICk7CisgICAgICAgICAgICAgICAgS01QX0FTU0VSVChuID49IDApOworICAgICAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgICAgICAgICAgc2V0X2dyYW4oIGFmZmluaXR5X2dyYW5fZGVmYXVsdCwgbiApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBFTUlUX1dBUk4oIFRSVUUsICggQWZmSW52YWxpZFBhcmFtLCBuYW1lLCBzdGFydCApICk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJwcm9jbGlzdCIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICBjaGFyICp0ZW1wX3Byb2NsaXN0OworCisgICAgICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICAgICAgaWYgKCpuZXh0ICE9ICc9JykgeworICAgICAgICAgICAgICAgIEVNSVRfV0FSTiggVFJVRSwgKCBBZmZJbnZhbGlkUGFyYW0sIG5hbWUsIHN0YXJ0ICkgKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5leHQrKzsgICAgICAvLyBza2lwICc9JworICAgICAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgICAgIGlmICgqbmV4dCAhPSAnWycpIHsKKyAgICAgICAgICAgICAgICBFTUlUX1dBUk4oIFRSVUUsICggQWZmSW52YWxpZFBhcmFtLCBuYW1lLCBzdGFydCApICk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuZXh0Kys7ICAgICAgLy8gc2tpcCAnWycKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgICAgICBpZiAoISBfX2ttcF9wYXJzZV9hZmZpbml0eV9wcm9jX2lkX2xpc3QobmFtZSwgYnVmLAorICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKikmbmV4dCwgJnRlbXBfcHJvY2xpc3QpKSB7CisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyB3YXJuaW5nIGFscmVhZHkgZW1pdHRlZC4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIFNLSVBfVE8obmV4dCwgJ10nKTsKKyAgICAgICAgICAgICAgICBpZiAoKm5leHQgPT0gJ10nKSBuZXh0Kys7CisgICAgICAgICAgICAgICAgU0tJUF9UTyhuZXh0LCAnLCcpOworICAgICAgICAgICAgICAgIGlmICgqbmV4dCA9PSAnLCcpIG5leHQrKzsKKyAgICAgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCpuZXh0ICE9ICddJykgeworICAgICAgICAgICAgICAgIEVNSVRfV0FSTiggVFJVRSwgKCBBZmZJbnZhbGlkUGFyYW0sIG5hbWUsIHN0YXJ0ICkgKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5leHQrKzsgICAgICAvLyBza2lwICddJworICAgICAgICAgICAgc2V0X3Byb2NsaXN0KCB0ZW1wX3Byb2NsaXN0ICk7CisgICAgICAgIH0gZWxzZSBpZiAoKCpidWYgPj0gJzAnKSAmJiAoKmJ1ZiA8PSAnOScpKSB7CisgICAgICAgICAgICAvLyBQYXJzZSBpbnRlZ2VyIG51bWJlcnMgLS0gcGVybXV0ZSBhbmQgb2Zmc2V0LgorICAgICAgICAgICAgaW50IG47CisgICAgICAgICAgICBuZXh0ID0gYnVmOworICAgICAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgICAgICBuID0gX19rbXBfc3RyX3RvX2ludCggYnVmLCAqbmV4dCApOworICAgICAgICAgICAgS01QX0FTU0VSVChuID49IDApOworICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgICAgIGlmICggY291bnQgPCAyICkgeworICAgICAgICAgICAgICAgIG51bWJlclsgY291bnQgXSA9IG47CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZNYW55UGFyYW1zLCBuYW1lLCBzdGFydCApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICsrIGNvdW50OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRU1JVF9XQVJOKCBUUlVFLCAoIEFmZkludmFsaWRQYXJhbSwgbmFtZSwgc3RhcnQgKSApOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICBpZiAoKm5leHQgPT0gJywnKSB7CisgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCpuZXh0ICE9ICdcMCcpIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRlbXAgPSBuZXh0OworICAgICAgICAgICAgRU1JVF9XQVJOKCBUUlVFLCAoIFBhcnNlRXh0cmFDaGFyc1dhcm4sIG5hbWUsIHRlbXAgKSApOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgYnVmID0gbmV4dDsKKyAgICB9IC8vIHdoaWxlCisKKyAgICAjdW5kZWYgRU1JVF9XQVJOCisgICAgI3VuZGVmIF9zZXRfcGFyYW0KKyAgICAjdW5kZWYgc2V0X3R5cGUKKyAgICAjdW5kZWYgc2V0X3ZlcmJvc2UKKyAgICAjdW5kZWYgc2V0X3dhcm5pbmdzCisgICAgI3VuZGVmIHNldF9yZXNwZWN0CisgICAgI3VuZGVmIHNldF9ncmFudWxhcml0eQorCisgICAgS01QX0lOVEVSTkFMX0ZSRUUoIGJ1ZmZlciApOworCisgICAgaWYgKCBwcm9jbGlzdCApIHsKKyAgICAgICAgaWYgKCAhIHR5cGUgKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmUHJvY0xpc3ROb1R5cGUsIG5hbWUgKTsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9leHBsaWNpdDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9leHBsaWNpdCApIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZQcm9jTGlzdE5vdEV4cGxpY2l0LCBuYW1lICk7CisgICAgICAgICAgICBLTVBfQVNTRVJUKCAqb3V0X3Byb2NsaXN0ICE9IE5VTEwgKTsKKyAgICAgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAqb3V0X3Byb2NsaXN0ICk7CisgICAgICAgICAgICAqb3V0X3Byb2NsaXN0ID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBzd2l0Y2ggKCAqb3V0X3R5cGUgKSB7CisgICAgICAgIGNhc2UgYWZmaW5pdHlfbG9naWNhbDoKKyAgICAgICAgY2FzZSBhZmZpbml0eV9waHlzaWNhbDogeworICAgICAgICAgICAgaWYgKCBjb3VudCA+IDAgKSB7CisgICAgICAgICAgICAgICAgKm91dF9vZmZzZXQgPSBudW1iZXJbIDAgXTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICBpZiAoIGNvdW50ID4gMSApIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmTWFueVBhcmFtc0ZvckxvZ2ljLCBuYW1lLCBudW1iZXJbIDEgXSApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBhZmZpbml0eV9iYWxhbmNlZDogeworICAgICAgICAgICAgaWYgKCBjb3VudCA+IDAgKSB7CisgICAgICAgICAgICAgICAgKm91dF9jb21wYWN0ID0gbnVtYmVyWyAwIF07CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgaWYgKCBjb3VudCA+IDEgKSB7CisgICAgICAgICAgICAgICAgKm91dF9vZmZzZXQgPSBudW1iZXJbIDEgXTsKKyAgICAgICAgICAgIH07IC8vIGlmCisKKyAgICAgICAgICAgIGlmICggX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX2RlZmF1bHQgKSB7CisjaWYgS01QX0FSQ0hfWDg2XzY0ICYmIChLTVBfT1NfTElOVVggfHwgS01QX09TX1dJTkRPV1MpCisgICAgICAgICAgICAgICAgaWYoIF9fa21wX21pY190eXBlICE9IG5vbl9taWMgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IF9fa21wX2FmZmluaXR5X3dhcm5pbmdzICkgeworICAgICAgICAgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZkdyYW5Vc2luZywgIktNUF9BRkZJTklUWSIsICJmaW5lIiApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX2ZpbmU7CisgICAgICAgICAgICAgICAgfSBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IF9fa21wX2FmZmluaXR5X3dhcm5pbmdzICkgeworICAgICAgICAgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZkdyYW5Vc2luZywgIktNUF9BRkZJTklUWSIsICJjb3JlIiApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX2NvcmU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIGFmZmluaXR5X3NjYXR0ZXI6CisgICAgICAgIGNhc2UgYWZmaW5pdHlfY29tcGFjdDogeworICAgICAgICAgICAgaWYgKCBjb3VudCA+IDAgKSB7CisgICAgICAgICAgICAgICAgKm91dF9jb21wYWN0ID0gbnVtYmVyWyAwIF07CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgaWYgKCBjb3VudCA+IDEgKSB7CisgICAgICAgICAgICAgICAgKm91dF9vZmZzZXQgPSBudW1iZXJbIDEgXTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgYWZmaW5pdHlfZXhwbGljaXQ6IHsKKyAgICAgICAgICAgIGlmICggKm91dF9wcm9jbGlzdCA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZOb1Byb2NMaXN0LCBuYW1lICk7CisgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X25vbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGNvdW50ID4gMCApIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmTm9QYXJhbSwgbmFtZSwgImV4cGxpY2l0IiApOworICAgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIGFmZmluaXR5X25vbmU6IHsKKyAgICAgICAgICAgIGlmICggY291bnQgPiAwICkgeworICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZOb1BhcmFtLCBuYW1lLCAibm9uZSIgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgYWZmaW5pdHlfZGlzYWJsZWQ6IHsKKyAgICAgICAgICAgIGlmICggY291bnQgPiAwICkgeworICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZOb1BhcmFtLCBuYW1lLCAiZGlzYWJsZWQiICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIGFmZmluaXR5X2RlZmF1bHQ6IHsKKyAgICAgICAgICAgIGlmICggY291bnQgPiAwICkgeworICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZOb1BhcmFtLCBuYW1lLCAiZGVmYXVsdCIgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoIDAgKTsKKyAgICAgICAgfTsKKyAgICB9OyAvLyBzd2l0Y2gKK30gLy8gX19rbXBfcGFyc2VfYWZmaW5pdHlfZW52CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfYWZmaW5pdHkoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkKK3sKKyAgICBrbXBfc2V0dGluZ190ICoqcml2YWxzID0gKGttcF9zZXR0aW5nX3QgKiopIGRhdGE7CisgICAgaW50IHJjOworCisgICAgcmMgPSBfX2ttcF9zdGdfY2hlY2tfcml2YWxzKCBuYW1lLCB2YWx1ZSwgcml2YWxzICk7CisgICAgaWYgKCByYyApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIF9fa21wX3BhcnNlX2FmZmluaXR5X2VudiggbmFtZSwgdmFsdWUsICYgX19rbXBfYWZmaW5pdHlfdHlwZSwKKyAgICAgICYgX19rbXBfYWZmaW5pdHlfcHJvY2xpc3QsICYgX19rbXBfYWZmaW5pdHlfdmVyYm9zZSwKKyAgICAgICYgX19rbXBfYWZmaW5pdHlfd2FybmluZ3MsICYgX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrLAorICAgICAgJiBfX2ttcF9hZmZpbml0eV9ncmFuLCAmIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzLAorICAgICAgJiBfX2ttcF9hZmZpbml0eV9kdXBzLCAmIF9fa21wX2FmZmluaXR5X2NvbXBhY3QsCisgICAgICAmIF9fa21wX2FmZmluaXR5X29mZnNldCApOworCit9IC8vIF9fa21wX3N0Z19wYXJzZV9hZmZpbml0eQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2FmZmluaXR5KCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgaWYoIF9fa21wX2Vudl9mb3JtYXQgKSB7CisgICAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX05BTUVfRVgobmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXM9JyIsIG5hbWUgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9hZmZpbml0eV92ZXJib3NlICkgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcywiLCAidmVyYm9zZSIpOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzLCIsICJub3ZlcmJvc2UiKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9hZmZpbml0eV93YXJuaW5ncyApIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsIiwgIndhcm5pbmdzIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsIiwgIm5vd2FybmluZ3MiKTsKKyAgICB9CisgICAgaWYgKCBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpICkgeworICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzayApIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzLCIsICJyZXNwZWN0Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcywiLCAibm9yZXNwZWN0Iik7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoICggX19rbXBfYWZmaW5pdHlfZ3JhbiApIHsKKyAgICAgICAgICAgIGNhc2UgYWZmaW5pdHlfZ3Jhbl9kZWZhdWx0OgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzIiwgImdyYW51bGFyaXR5PWRlZmF1bHQsIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGFmZmluaXR5X2dyYW5fZmluZToKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcyIsICJncmFudWxhcml0eT1maW5lLCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBhZmZpbml0eV9ncmFuX3RocmVhZDoKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcyIsICJncmFudWxhcml0eT10aHJlYWQsIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGFmZmluaXR5X2dyYW5fY29yZToKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcyIsICJncmFudWxhcml0eT1jb3JlLCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBhZmZpbml0eV9ncmFuX3BhY2thZ2U6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMiLCAiZ3JhbnVsYXJpdHk9cGFja2FnZSwiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgYWZmaW5pdHlfZ3Jhbl9ub2RlOgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzIiwgImdyYW51bGFyaXR5PW5vZGUsIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisjIGlmIEtNUF9HUk9VUF9BRkZJTklUWQorICAgICAgICAgICAgY2FzZSBhZmZpbml0eV9ncmFuX2dyb3VwOgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzIiwgImdyYW51bGFyaXR5PWdyb3VwLCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworIyBlbmRpZiAvKiBLTVBfR1JPVVBfQUZGSU5JVFkgKi8KKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X2R1cHMgKSB7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcywiLCAiZHVwbGljYXRlcyIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsIiwgIm5vZHVwbGljYXRlcyIpOworICAgICAgICB9CisgICAgfQorICAgIGlmICggISBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpICkgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcyIsICJkaXNhYmxlZCIgKTsKKyAgICB9CisgICAgZWxzZSBzd2l0Y2ggKCBfX2ttcF9hZmZpbml0eV90eXBlICl7CisgICAgICAgIGNhc2UgYWZmaW5pdHlfbm9uZToKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzIiwgIm5vbmUiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGFmZmluaXR5X3BoeXNpY2FsOgorICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsJWQiLCAicGh5c2ljYWwiLAorICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9vZmZzZXQgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGFmZmluaXR5X2xvZ2ljYWw6CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcywlZCIsICJsb2dpY2FsIiwKKyAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfb2Zmc2V0ICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhZmZpbml0eV9jb21wYWN0OgorICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsJWQsJWQiLCAiY29tcGFjdCIsCisgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2NvbXBhY3QsIF9fa21wX2FmZmluaXR5X29mZnNldCApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgYWZmaW5pdHlfc2NhdHRlcjoKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzLCVkLCVkIiwgInNjYXR0ZXIiLAorICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9jb21wYWN0LCBfX2ttcF9hZmZpbml0eV9vZmZzZXQgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGFmZmluaXR5X2V4cGxpY2l0OgorICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXM9WyVzXSwlcyIsICJwcm9jbGlzdCIsCisgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3Byb2NsaXN0LCAiZXhwbGljaXQiICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhZmZpbml0eV9iYWxhbmNlZDoKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzLCVkLCVkIiwgImJhbGFuY2VkIiwKKyAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfY29tcGFjdCwgX19rbXBfYWZmaW5pdHlfb2Zmc2V0ICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhZmZpbml0eV9kaXNhYmxlZDoKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzIiwgImRpc2FibGVkIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhZmZpbml0eV9kZWZhdWx0OgorICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMiLCAiZGVmYXVsdCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcyIsICI8dW5rbm93bj4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJ1xuIiApOworfSAvL19fa21wX3N0Z19wcmludF9hZmZpbml0eQorCisjIGlmZGVmIEtNUF9HT01QX0NPTVBBVAorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2dvbXBfY3B1X2FmZmluaXR5KCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApCit7CisgICAgY29uc3QgY2hhciAqIG5leHQgPSBOVUxMOworICAgIGNoYXIgKiB0ZW1wX3Byb2NsaXN0OworICAgIGttcF9zZXR0aW5nX3QgKipyaXZhbHMgPSAoa21wX3NldHRpbmdfdCAqKikgZGF0YTsKKyAgICBpbnQgcmM7CisKKyAgICByYyA9IF9fa21wX3N0Z19jaGVja19yaXZhbHMoIG5hbWUsIHZhbHVlLCByaXZhbHMgKTsKKyAgICBpZiAoIHJjICkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCBUQ1JfNChfX2ttcF9pbml0X21pZGRsZSkgKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBFbnZNaWRkbGVXYXJuLCBuYW1lICk7CisgICAgICAgIF9fa21wX2Vudl90b1ByaW50KCBuYW1lLCAwICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBfX2ttcF9lbnZfdG9QcmludCggbmFtZSwgMSApOworCisgICAgaWYgKCBfX2ttcF9wYXJzZV9hZmZpbml0eV9wcm9jX2lkX2xpc3QoIG5hbWUsIHZhbHVlLCAmbmV4dCwKKyAgICAgICZ0ZW1wX3Byb2NsaXN0ICkpIHsKKyAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgaWYgKCpuZXh0ID09ICdcMCcpIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBHT01QX0NQVV9BRkZJTklUWSA9PiBncmFudWxhcml0eT1maW5lLGV4cGxpY2l0LHByb2NsaXN0PS4uLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3Byb2NsaXN0ID0gdGVtcF9wcm9jbGlzdDsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9leHBsaWNpdDsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX2ZpbmU7CisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfaW50ZWw7CisjIGVuZGlmCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmU3ludGF4RXJyb3IsIG5hbWUgKTsKKyAgICAgICAgICAgIGlmICh0ZW1wX3Byb2NsaXN0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSgodm9pZCAqKXRlbXBfcHJvY2xpc3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvLworICAgICAgICAvLyBXYXJuaW5nIGFscmVhZHkgZW1pdHRlZAorICAgICAgICAvLworICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfbm9uZTsKKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID0gcHJvY19iaW5kX2ZhbHNlOworIyBlbmRpZgorICAgIH0KK30gLy8gX19rbXBfc3RnX3BhcnNlX2dvbXBfY3B1X2FmZmluaXR5CisKKyMgZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisKKworIyBpZiBPTVBfNDBfRU5BQkxFRAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBPTVBfUExBQ0VTIHByb2MgaWQgbGlzdCBwYXJzZXIuIEhlcmUgaXMgdGhlIGdyYW1tYXI6CisKK3BsYWNlX2xpc3QgOj0gcGxhY2UKK3BsYWNlX2xpc3QgOj0gcGxhY2UgLCBwbGFjZV9saXN0CitwbGFjZSA6PSBudW0KK3BsYWNlIDo9IHBsYWNlIDogbnVtCitwbGFjZSA6PSBwbGFjZSA6IG51bSA6IHNpZ25lZAorcGxhY2UgOj0geyBzdWJwbGFjZWxpc3QgfQorcGxhY2UgOj0gISBwbGFjZSAgICAgICAgICAgICAgICAgIC8vIChsb3dlc3QgcHJpb3JpdHkpCitzdWJwbGFjZV9saXN0IDo9IHN1YnBsYWNlCitzdWJwbGFjZV9saXN0IDo9IHN1YnBsYWNlICwgc3VicGxhY2VfbGlzdAorc3VicGxhY2UgOj0gbnVtCitzdWJwbGFjZSA6PSBudW0gOiBudW0KK3N1YnBsYWNlIDo9IG51bSA6IG51bSA6IHNpZ25lZAorc2lnbmVkIDo9IG51bQorc2lnbmVkIDo9ICsgc2lnbmVkCitzaWduZWQgOj0gLSBzaWduZWQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50CitfX2ttcF9wYXJzZV9zdWJwbGFjZV9saXN0KCBjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKipzY2FuICkKK3sKKyAgICBjb25zdCBjaGFyICpuZXh0OworCisgICAgZm9yICg7OykgeworICAgICAgICBpbnQgc3RhcnQsIGNvdW50LCBzdHJpZGU7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gUmVhZCBpbiB0aGUgc3RhcnRpbmcgcHJvYyBpZAorICAgICAgICAvLworICAgICAgICBTS0lQX1dTKCpzY2FuKTsKKyAgICAgICAgaWYgKCgqKnNjYW4gPCAnMCcpIHx8ICgqKnNjYW4gPiAnOScpKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggU3ludGF4RXJyb3JVc2luZywgdmFyLCAiXCJ0aHJlYWRzXCIiICk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgbmV4dCA9ICpzY2FuOworICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgc3RhcnQgPSBfX2ttcF9zdHJfdG9faW50KCpzY2FuLCAqbmV4dCk7CisgICAgICAgIEtNUF9BU1NFUlQoc3RhcnQgPj0gMCk7CisgICAgICAgICpzY2FuID0gbmV4dDsKKworICAgICAgICAvLworICAgICAgICAvLyB2YWxpZCBmb2xsb3cgc2V0cyBhcmUgJywnICc6JyBhbmQgJ30nCisgICAgICAgIC8vCisgICAgICAgIFNLSVBfV1MoKnNjYW4pOworICAgICAgICBpZiAoKipzY2FuID09ICd9JykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCoqc2NhbiA9PSAnLCcpIHsKKyAgICAgICAgICAgICgqc2NhbikrKzsgIC8vIHNraXAgJywnCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKipzY2FuICE9ICc6JykgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIFN5bnRheEVycm9yVXNpbmcsIHZhciwgIlwidGhyZWFkc1wiIiApOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgICgqc2NhbikrKzsgICAgICAvLyBza2lwICc6JworCisgICAgICAgIC8vCisgICAgICAgIC8vIFJlYWQgY291bnQgcGFyYW1ldGVyCisgICAgICAgIC8vCisgICAgICAgIFNLSVBfV1MoKnNjYW4pOworICAgICAgICBpZiAoKCoqc2NhbiA8ICcwJykgfHwgKCoqc2NhbiA+ICc5JykpIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBTeW50YXhFcnJvclVzaW5nLCB2YXIsICJcInRocmVhZHNcIiIgKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBuZXh0ID0gKnNjYW47CisgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICBjb3VudCA9IF9fa21wX3N0cl90b19pbnQoKnNjYW4sICpuZXh0KTsKKyAgICAgICAgS01QX0FTU0VSVChjb3VudCA+PSAwKTsKKyAgICAgICAgKnNjYW4gPSBuZXh0OworCisgICAgICAgIC8vCisgICAgICAgIC8vIHZhbGlkIGZvbGxvdyBzZXRzIGFyZSAnLCcgJzonIGFuZCAnfScKKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUygqc2Nhbik7CisgICAgICAgIGlmICgqKnNjYW4gPT0gJ30nKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoKipzY2FuID09ICcsJykgeworICAgICAgICAgICAgKCpzY2FuKSsrOyAgLy8gc2tpcCAnLCcKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICgqKnNjYW4gIT0gJzonKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggU3ludGF4RXJyb3JVc2luZywgdmFyLCAiXCJ0aHJlYWRzXCIiICk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgKCpzY2FuKSsrOyAgICAgIC8vIHNraXAgJzonCisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gUmVhZCBzdHJpZGUgcGFyYW1ldGVyCisgICAgICAgIC8vCisgICAgICAgIGludCBzaWduID0gKzE7CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIFNLSVBfV1MoKnNjYW4pOworICAgICAgICAgICAgaWYgKCoqc2NhbiA9PSAnKycpIHsKKyAgICAgICAgICAgICAgICAoKnNjYW4pKys7IC8vIHNraXAgJysnCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKipzY2FuID09ICctJykgeworICAgICAgICAgICAgICAgIHNpZ24gKj0gLTE7CisgICAgICAgICAgICAgICAgKCpzY2FuKSsrOyAvLyBza2lwICctJworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgU0tJUF9XUygqc2Nhbik7CisgICAgICAgIGlmICgoKipzY2FuIDwgJzAnKSB8fCAoKipzY2FuID4gJzknKSkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIFN5bnRheEVycm9yVXNpbmcsIHZhciwgIlwidGhyZWFkc1wiIiApOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIG5leHQgPSAqc2NhbjsKKyAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgIHN0cmlkZSA9IF9fa21wX3N0cl90b19pbnQoKnNjYW4sICpuZXh0KTsKKyAgICAgICAgS01QX0FTU0VSVChzdHJpZGUgPj0gMCk7CisgICAgICAgICpzY2FuID0gbmV4dDsKKyAgICAgICAgc3RyaWRlICo9IHNpZ247CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gdmFsaWQgZm9sbG93IHNldHMgYXJlICcsJyBhbmQgJ30nCisgICAgICAgIC8vCisgICAgICAgIFNLSVBfV1MoKnNjYW4pOworICAgICAgICBpZiAoKipzY2FuID09ICd9JykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCoqc2NhbiA9PSAnLCcpIHsKKyAgICAgICAgICAgICgqc2NhbikrKzsgIC8vIHNraXAgJywnCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEtNUF9XQVJOSU5HKCBTeW50YXhFcnJvclVzaW5nLCB2YXIsICJcInRocmVhZHNcIiIgKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludAorX19rbXBfcGFyc2VfcGxhY2UoIGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqKiBzY2FuICkKK3sKKyAgICBjb25zdCBjaGFyICpuZXh0OworCisgICAgLy8KKyAgICAvLyB2YWxpZCBmb2xsb3cgc2V0cyBhcmUgJ3snICchJyBhbmQgbnVtCisgICAgLy8KKyAgICBTS0lQX1dTKCpzY2FuKTsKKyAgICBpZiAoKipzY2FuID09ICd7JykgeworICAgICAgICAoKnNjYW4pKys7ICAgICAgLy8gc2tpcCAneycKKyAgICAgICAgaWYgKCEgX19rbXBfcGFyc2Vfc3VicGxhY2VfbGlzdCh2YXIsIHNjYW4pKSB7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCoqc2NhbiAhPSAnfScpIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBTeW50YXhFcnJvclVzaW5nLCB2YXIsICJcInRocmVhZHNcIiIgKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICAoKnNjYW4pKys7ICAgICAgLy8gc2tpcCAnfScKKyAgICB9CisgICAgZWxzZSBpZiAoKipzY2FuID09ICchJykgeworICAgICAgICAoKnNjYW4pKys7ICAgICAgLy8gc2tpcCAnIScKKyAgICAgICAgcmV0dXJuIF9fa21wX3BhcnNlX3BsYWNlKHZhciwgc2Nhbik7IC8vJyEnIGhhcyBsb3dlciBwcmVjZWRlbmNlIHRoYW4gJzonCisgICAgfQorICAgIGVsc2UgaWYgKCgqKnNjYW4gPj0gJzAnKSAmJiAoKipzY2FuIDw9ICc5JykpIHsKKyAgICAgICAgbmV4dCA9ICpzY2FuOworICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgaW50IHByb2MgPSBfX2ttcF9zdHJfdG9faW50KCpzY2FuLCAqbmV4dCk7CisgICAgICAgIEtNUF9BU1NFUlQocHJvYyA+PSAwKTsKKyAgICAgICAgKnNjYW4gPSBuZXh0OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIFN5bnRheEVycm9yVXNpbmcsIHZhciwgIlwidGhyZWFkc1wiIiApOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50CitfX2ttcF9wYXJzZV9wbGFjZV9saXN0KCBjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKmVudiwgY2hhciAqKnBsYWNlX2xpc3QgKQoreworICAgIGNvbnN0IGNoYXIgKnNjYW4gPSBlbnY7CisgICAgY29uc3QgY2hhciAqbmV4dCA9IHNjYW47CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGludCBzdGFydCwgY291bnQsIHN0cmlkZTsKKworICAgICAgICBpZiAoISBfX2ttcF9wYXJzZV9wbGFjZSh2YXIsICZzY2FuKSkgeworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gdmFsaWQgZm9sbG93IHNldHMgYXJlICcsJyAnOicgYW5kIEVPTAorICAgICAgICAvLworICAgICAgICBTS0lQX1dTKHNjYW4pOworICAgICAgICBpZiAoKnNjYW4gPT0gJ1wwJykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCpzY2FuID09ICcsJykgeworICAgICAgICAgICAgc2NhbisrOyAgICAgLy8gc2tpcCAnLCcKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICgqc2NhbiAhPSAnOicpIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBTeW50YXhFcnJvclVzaW5nLCB2YXIsICJcInRocmVhZHNcIiIgKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBzY2FuKys7ICAgICAgICAgLy8gc2tpcCAnOicKKworICAgICAgICAvLworICAgICAgICAvLyBSZWFkIGNvdW50IHBhcmFtZXRlcgorICAgICAgICAvLworICAgICAgICBTS0lQX1dTKHNjYW4pOworICAgICAgICBpZiAoKCpzY2FuIDwgJzAnKSB8fCAoKnNjYW4gPiAnOScpKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggU3ludGF4RXJyb3JVc2luZywgdmFyLCAiXCJ0aHJlYWRzXCIiICk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgbmV4dCA9IHNjYW47CisgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICBjb3VudCA9IF9fa21wX3N0cl90b19pbnQoc2NhbiwgKm5leHQpOworICAgICAgICBLTVBfQVNTRVJUKGNvdW50ID49IDApOworICAgICAgICBzY2FuID0gbmV4dDsKKworICAgICAgICAvLworICAgICAgICAvLyB2YWxpZCBmb2xsb3cgc2V0cyBhcmUgJywnICc6JyBhbmQgRU9MCisgICAgICAgIC8vCisgICAgICAgIFNLSVBfV1Moc2Nhbik7CisgICAgICAgIGlmICgqc2NhbiA9PSAnXDAnKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoKnNjYW4gPT0gJywnKSB7CisgICAgICAgICAgICBzY2FuKys7ICAgICAvLyBza2lwICcsJworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCpzY2FuICE9ICc6JykgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIFN5bnRheEVycm9yVXNpbmcsIHZhciwgIlwidGhyZWFkc1wiIiApOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIHNjYW4rKzsgICAgICAgICAvLyBza2lwICc6JworCisgICAgICAgIC8vCisgICAgICAgIC8vIFJlYWQgc3RyaWRlIHBhcmFtZXRlcgorICAgICAgICAvLworICAgICAgICBpbnQgc2lnbiA9ICsxOworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBTS0lQX1dTKHNjYW4pOworICAgICAgICAgICAgaWYgKCpzY2FuID09ICcrJykgeworICAgICAgICAgICAgICAgIHNjYW4rKzsgLy8gc2tpcCAnKycKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgqc2NhbiA9PSAnLScpIHsKKyAgICAgICAgICAgICAgICBzaWduICo9IC0xOworICAgICAgICAgICAgICAgIHNjYW4rKzsgLy8gc2tpcCAnLScKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIFNLSVBfV1Moc2Nhbik7CisgICAgICAgIGlmICgoKnNjYW4gPCAnMCcpIHx8ICgqc2NhbiA+ICc5JykpIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBTeW50YXhFcnJvclVzaW5nLCB2YXIsICJcInRocmVhZHNcIiIgKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBuZXh0ID0gc2NhbjsKKyAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgIHN0cmlkZSA9IF9fa21wX3N0cl90b19pbnQoc2NhbiwgKm5leHQpOworICAgICAgICBLTVBfQVNTRVJUKHN0cmlkZSA+PSAwKTsKKyAgICAgICAgc2NhbiA9IG5leHQ7CisgICAgICAgIHN0cmlkZSAqPSBzaWduOworCisgICAgICAgIC8vCisgICAgICAgIC8vIHZhbGlkIGZvbGxvdyBzZXRzIGFyZSAnLCcgYW5kIEVPTAorICAgICAgICAvLworICAgICAgICBTS0lQX1dTKHNjYW4pOworICAgICAgICBpZiAoKnNjYW4gPT0gJ1wwJykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCpzY2FuID09ICcsJykgeworICAgICAgICAgICAgc2NhbisrOyAgICAgLy8gc2tpcCAnLCcKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgS01QX1dBUk5JTkcoIFN5bnRheEVycm9yVXNpbmcsIHZhciwgIlwidGhyZWFkc1wiIiApOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgeworICAgICAgICBpbnQgbGVuID0gc2NhbiAtIGVudjsKKyAgICAgICAgY2hhciAqcmV0bGlzdCA9IChjaGFyICopX19rbXBfYWxsb2NhdGUoKGxlbiArIDEpICogc2l6ZW9mKGNoYXIpKTsKKyAgICAgICAgS01QX01FTUNQWV9TKHJldGxpc3QsIChsZW4rMSkqc2l6ZW9mKGNoYXIpLCBlbnYsIGxlbiAqIHNpemVvZihjaGFyKSk7CisgICAgICAgIHJldGxpc3RbbGVuXSA9ICdcMCc7CisgICAgICAgICpwbGFjZV9saXN0ID0gcmV0bGlzdDsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfcGxhY2VzKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApCit7CisgICAgaW50IGNvdW50OworICAgIGNvbnN0IGNoYXIgKnNjYW4gPSB2YWx1ZTsKKyAgICBjb25zdCBjaGFyICpuZXh0ID0gc2NhbjsKKyAgICBjb25zdCBjaGFyICpraW5kID0gIlwidGhyZWFkc1wiIjsKKyAgICBrbXBfc2V0dGluZ190ICoqcml2YWxzID0gKGttcF9zZXR0aW5nX3QgKiopIGRhdGE7CisgICAgaW50IHJjOworCisgICAgcmMgPSBfX2ttcF9zdGdfY2hlY2tfcml2YWxzKCBuYW1lLCB2YWx1ZSwgcml2YWxzICk7CisgICAgaWYgKCByYyApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vCisgICAgLy8gSWYgT01QX1BST0NfQklORCBpcyBub3Qgc3BlY2lmaWVkIGJ1dCBPTVBfUExBQ0VTIGlzLAorICAgIC8vIHRoZW4gbGV0IE9NUF9QUk9DX0JJTkQgZGVmYXVsdCB0byB0cnVlLgorICAgIC8vCisgICAgaWYgKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPT0gcHJvY19iaW5kX2RlZmF1bHQgKSB7CisgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF90cnVlOworICAgIH0KKworICAgIC8vX19rbXBfYWZmaW5pdHlfbnVtX3BsYWNlcyA9IDA7CisKKyAgICBpZiAoIF9fa21wX21hdGNoX3N0ciggInRocmVhZHMiLCBzY2FuLCAmbmV4dCApICkgeworICAgICAgICBzY2FuID0gbmV4dDsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X2NvbXBhY3Q7CisgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX3RocmVhZDsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfZHVwcyA9IEZBTFNFOworICAgICAgICBraW5kID0gIlwidGhyZWFkc1wiIjsKKyAgICB9CisgICAgZWxzZSBpZiAoIF9fa21wX21hdGNoX3N0ciggImNvcmVzIiwgc2NhbiwgJm5leHQgKSApIHsKKyAgICAgICAgc2NhbiA9IG5leHQ7CisgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9jb21wYWN0OworICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl9jb3JlOworICAgICAgICBfX2ttcF9hZmZpbml0eV9kdXBzID0gRkFMU0U7CisgICAgICAgIGtpbmQgPSAiXCJjb3Jlc1wiIjsKKyAgICB9CisgICAgZWxzZSBpZiAoIF9fa21wX21hdGNoX3N0ciggInNvY2tldHMiLCBzY2FuLCAmbmV4dCApICkgeworICAgICAgICBzY2FuID0gbmV4dDsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X2NvbXBhY3Q7CisgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX3BhY2thZ2U7CisgICAgICAgIF9fa21wX2FmZmluaXR5X2R1cHMgPSBGQUxTRTsKKyAgICAgICAga2luZCA9ICJcInNvY2tldHNcIiI7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X3Byb2NsaXN0ICE9IE5VTEwgKSB7CisgICAgICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSggKHZvaWQgKilfX2ttcF9hZmZpbml0eV9wcm9jbGlzdCApOworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJvY2xpc3QgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmICggX19rbXBfcGFyc2VfcGxhY2VfbGlzdCggbmFtZSwgdmFsdWUsICZfX2ttcF9hZmZpbml0eV9wcm9jbGlzdCApICkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X2V4cGxpY2l0OworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3JhbiA9IGFmZmluaXR5X2dyYW5fZmluZTsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2R1cHMgPSBGQUxTRTsKKyAgICAgICAgICAgIGlmICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID09IHByb2NfYmluZF9kZWZhdWx0ICkgeworICAgICAgICAgICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPT0gcHJvY19iaW5kX2RlZmF1bHQgKSB7CisgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF90cnVlOworICAgIH0KKworICAgIFNLSVBfV1Moc2Nhbik7CisgICAgaWYgKCAqc2NhbiA9PSAnXDAnICkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8KKyAgICAvLyBQYXJzZSBvcHRpb24gY291bnQgcGFyYW1ldGVyIGluIHBhcmVudGhlc2VzCisgICAgLy8KKyAgICBpZiAoICpzY2FuICE9ICcoJyApIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIFN5bnRheEVycm9yVXNpbmcsIG5hbWUsIGtpbmQgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzY2FuKys7ICAgICAvLyBza2lwICcoJworCisgICAgU0tJUF9XUyhzY2FuKTsKKyAgICBuZXh0ID0gc2NhbjsKKyAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICBjb3VudCA9IF9fa21wX3N0cl90b19pbnQoc2NhbiwgKm5leHQpOworICAgIEtNUF9BU1NFUlQoY291bnQgPj0gMCk7CisgICAgc2NhbiA9IG5leHQ7CisKKyAgICBTS0lQX1dTKHNjYW4pOworICAgIGlmICggKnNjYW4gIT0gJyknICkgeworICAgICAgICBLTVBfV0FSTklORyggU3ludGF4RXJyb3JVc2luZywgbmFtZSwga2luZCApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNjYW4rKzsgICAgIC8vIHNraXAgJyknCisKKyAgICBTS0lQX1dTKHNjYW4pOworICAgIGlmICggKnNjYW4gIT0gJ1wwJyApIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIFBhcnNlRXh0cmFDaGFyc1dhcm4sIG5hbWUsIHNjYW4gKTsKKyAgICB9CisgICAgX19rbXBfYWZmaW5pdHlfbnVtX3BsYWNlcyA9IGNvdW50OworfQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X3BsYWNlcygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsCisgIHZvaWQgKiBkYXRhICkKK3sKKyAgICBpZiggX19rbXBfZW52X2Zvcm1hdCApIHsKKyAgICAgICAgS01QX1NUUl9CVUZfUFJJTlRfTkFNRTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICAlcyIsIG5hbWUgKTsKKyAgICB9CisgICAgaWYgKCAoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQudXNlZCA9PSAwICkKKyAgICAgIHx8ICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzID09IE5VTEwgKQorICAgICAgfHwgKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPT0gcHJvY19iaW5kX2ZhbHNlICkgKSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIjogJXNcbiIsIEtNUF9JMThOX1NUUiggTm90RGVmaW5lZCApICk7CisgICAgfQorICAgIGVsc2UgaWYgKCBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X2V4cGxpY2l0ICkgeworICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X3Byb2NsaXN0ICE9IE5VTEwgKSB7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICI9JyVzJ1xuIiwgX19rbXBfYWZmaW5pdHlfcHJvY2xpc3QgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIjogJXNcbiIsIEtNUF9JMThOX1NUUiggTm90RGVmaW5lZCApICk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfY29tcGFjdCApIHsKKyAgICAgICAgaW50IG51bTsKKyAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgPiAwICkgeworICAgICAgICAgICAgbnVtID0gX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCBfX2ttcF9hZmZpbml0eV9udW1fcGxhY2VzID4gMCApIHsKKyAgICAgICAgICAgIG51bSA9IF9fa21wX2FmZmluaXR5X251bV9wbGFjZXM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBudW0gPSAwOworICAgICAgICB9CisgICAgICAgIGlmICggX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX3RocmVhZCApIHsKKyAgICAgICAgICAgIGlmICggbnVtID4gMCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICI9J3RocmVhZHMoJWQpJ1xuIiwgbnVtICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICI9J3RocmVhZHMnXG4iICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9jb3JlICkgeworICAgICAgICAgICAgaWYgKCBudW0gPiAwICkgeworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIj0nY29yZXMoJWQpJyBcbiIsIG51bSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiPSdjb3JlcydcbiIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX3BhY2thZ2UgKSB7CisgICAgICAgICAgICBpZiAoIG51bSA+IDAgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiPSdzb2NrZXRzKCVkKSdcbiIsIG51bSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiPSdzb2NrZXRzJ1xuIiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiOiAlc1xuIiwgS01QX0kxOE5fU1RSKCBOb3REZWZpbmVkICkgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiOiAlc1xuIiwgS01QX0kxOE5fU1RSKCBOb3REZWZpbmVkICkgKTsKKyAgICB9Cit9CisKKyMgZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworIyBpZiAoISBPTVBfNDBfRU5BQkxFRCkKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9wcm9jX2JpbmQoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkKK3sKKyAgICBpbnQgZW5hYmxlZDsKKyAgICBrbXBfc2V0dGluZ190ICoqcml2YWxzID0gKGttcF9zZXR0aW5nX3QgKiopIGRhdGE7CisgICAgaW50IHJjOworCisgICAgcmMgPSBfX2ttcF9zdGdfY2hlY2tfcml2YWxzKCBuYW1lLCB2YWx1ZSwgcml2YWxzICk7CisgICAgaWYgKCByYyApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vCisgICAgLy8gaW4gT01QIDMuMSwgT01QX1BST0NfQklORCBpcyBzdHJpY3RseSBhIGJvb2xlYW4KKyAgICAvLworICAgIF9fa21wX3N0Z19wYXJzZV9ib29sKCBuYW1lLCB2YWx1ZSwgJiBlbmFibGVkICk7CisgICAgaWYgKCBlbmFibGVkICkgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIE9NUF9QUk9DX0JJTkQgPT4gZ3JhbnVsYXJpdHk9ZmluZSxzY2F0dGVyIG9uIE1JQworICAgICAgICAgICAgLy8gT01QX1BST0NfQklORCA9PiBncmFudWxhcml0eT1jb3JlLHNjYXR0ZXIgZWxzZXdoZXJlCisgICAgICAgICAgICAvLworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X3NjYXR0ZXI7CisjICBpZiBLTVBfQVJDSF9YODZfNjQgJiYgKEtNUF9PU19MSU5VWCB8fCBLTVBfT1NfV0lORE9XUykKKyAgICAgICAgICAgIGlmKCBfX2ttcF9taWNfdHlwZSAhPSBub25fbWljICkKKyAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl9maW5lOworICAgICAgICAgICAgZWxzZQorIyAgZW5kaWYKKyAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl9jb3JlOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X25vbmU7CisgICAgfQorfSAvLyBfX2ttcF9wYXJzZV9wcm9jX2JpbmQKKworIyBlbmRpZiAvKiBpZiAoISBPTVBfNDBfRU5BQkxFRCkgKi8KKworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3RvcG9sb2d5X21ldGhvZCggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwKKyAgdm9pZCAqIGRhdGEgKSB7CisgICAgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJhbGwiLCAxLCB2YWx1ZSApICkgeworICAgICAgIF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPSBhZmZpbml0eV90b3BfbWV0aG9kX2FsbDsKKyAgICB9CisjIGlmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyAgICBlbHNlIGlmICggX19rbXBfc3RyX21hdGNoKCAieDJhcGljIGlkIiwgOSwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAieDJhcGljX2lkIiwgOSwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAieDJhcGljLWlkIiwgOSwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAieDJhcGljaWQiLCA4LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZCBsZWFmIDExIiwgMTMsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkX2xlYWZfMTEiLCAxMywgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWQtbGVhZi0xMSIsIDEzLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZCBsZWFmMTEiLCAxMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWRfbGVhZjExIiwgMTIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkLWxlYWYxMSIsIDEyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZGxlYWYgMTEiLCAxMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWRsZWFmXzExIiwgMTIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkbGVhZi0xMSIsIDEyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZGxlYWYxMSIsIDExLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZCAxMSIsIDgsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkXzExIiwgOCwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWQtMTEiLCA4LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZDExIiwgNywgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAibGVhZiAxMSIsIDcsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImxlYWZfMTEiLCA3LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJsZWFmLTExIiwgNywgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAibGVhZjExIiwgNiwgdmFsdWUgKSApIHsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9IGFmZmluaXR5X3RvcF9tZXRob2RfeDJhcGljaWQ7CisgICAgfQorICAgIGVsc2UgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJhcGljIGlkIiwgNywgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiYXBpY19pZCIsIDcsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImFwaWMtaWQiLCA3LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJhcGljaWQiLCA2LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZCBsZWFmIDQiLCAxMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWRfbGVhZl80IiwgMTIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkLWxlYWYtNCIsIDEyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZCBsZWFmNCIsIDExLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZF9sZWFmNCIsIDExLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZC1sZWFmNCIsIDExLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZGxlYWYgNCIsIDExLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZGxlYWZfNCIsIDExLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZGxlYWYtNCIsIDExLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZGxlYWY0IiwgMTAsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkIDQiLCA3LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZF80IiwgNywgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWQtNCIsIDcsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkNCIsIDYsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImxlYWYgNCIsIDYsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImxlYWZfNCIsIDYsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImxlYWYtNCIsIDYsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImxlYWY0IiwgNSwgdmFsdWUgKSApIHsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9IGFmZmluaXR5X3RvcF9tZXRob2RfYXBpY2lkOworICAgIH0KKyMgZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworICAgIGVsc2UgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICIvcHJvYy9jcHVpbmZvIiwgMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aW5mbyIsIDUsIHZhbHVlICkpIHsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9IGFmZmluaXR5X3RvcF9tZXRob2RfY3B1aW5mbzsKKyAgICB9CisjIGlmIEtNUF9HUk9VUF9BRkZJTklUWQorICAgIGVsc2UgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJncm91cCIsIDEsIHZhbHVlICkgKSB7CisgICAgICAgIF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPSBhZmZpbml0eV90b3BfbWV0aG9kX2dyb3VwOworICAgIH0KKyMgZW5kaWYgLyogS01QX0dST1VQX0FGRklOSVRZICovCisgICAgZWxzZSBpZiAoIF9fa21wX3N0cl9tYXRjaCggImZsYXQiLCAxLCB2YWx1ZSApICkgeworICAgICAgICBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID0gYWZmaW5pdHlfdG9wX21ldGhvZF9mbGF0OworICAgIH0KKyMgaWYgS01QX1VTRV9IV0xPQworICAgIGVsc2UgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJod2xvYyIsIDEsIHZhbHVlKSApIHsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9IGFmZmluaXR5X3RvcF9tZXRob2RfaHdsb2M7CisgICAgfQorIyBlbmRpZgorICAgIGVsc2UgeworICAgICAgICBLTVBfV0FSTklORyggU3RnSW52YWxpZFZhbHVlLCBuYW1lLCB2YWx1ZSApOworICAgIH0KK30gLy8gX19rbXBfc3RnX3BhcnNlX3RvcG9sb2d5X21ldGhvZAorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X3RvcG9sb2d5X21ldGhvZCgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsCisgIHZvaWQgKiBkYXRhICkgeworIyBpZiBLTVBfREVCVUcKKyAgICBjaGFyIGNvbnN0ICogdmFsdWUgPSBOVUxMOworCisgICAgc3dpdGNoICggX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCApIHsKKyAgICAgICAgY2FzZSBhZmZpbml0eV90b3BfbWV0aG9kX2RlZmF1bHQ6CisgICAgICAgIHZhbHVlID0gImRlZmF1bHQiOworICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGFmZmluaXR5X3RvcF9tZXRob2RfYWxsOgorICAgICAgICB2YWx1ZSA9ICJhbGwiOworICAgICAgICBicmVhazsKKworIyAgaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorICAgICAgICBjYXNlIGFmZmluaXR5X3RvcF9tZXRob2RfeDJhcGljaWQ6CisgICAgICAgIHZhbHVlID0gIngyQVBJQyBpZCI7CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgYWZmaW5pdHlfdG9wX21ldGhvZF9hcGljaWQ6CisgICAgICAgIHZhbHVlID0gIkFQSUMgaWQiOworICAgICAgICBicmVhazsKKyMgIGVuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworICAgICAgICBjYXNlIGFmZmluaXR5X3RvcF9tZXRob2RfY3B1aW5mbzoKKyAgICAgICAgdmFsdWUgPSAiY3B1aW5mbyI7CisgICAgICAgIGJyZWFrOworCisjICBpZiBLTVBfR1JPVVBfQUZGSU5JVFkKKyAgICAgICAgY2FzZSBhZmZpbml0eV90b3BfbWV0aG9kX2dyb3VwOgorICAgICAgICB2YWx1ZSA9ICJncm91cCI7CisgICAgICAgIGJyZWFrOworIyAgZW5kaWYgLyogS01QX0dST1VQX0FGRklOSVRZICovCisKKyAgICAgICAgY2FzZSBhZmZpbml0eV90b3BfbWV0aG9kX2ZsYXQ6CisgICAgICAgIHZhbHVlID0gImZsYXQiOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIHZhbHVlICE9IE5VTEwgKSB7CisgICAgICAgIF9fa21wX3N0Z19wcmludF9zdHIoIGJ1ZmZlciwgbmFtZSwgdmFsdWUgKTsKKyAgICB9CisjIGVuZGlmIC8qIEtNUF9ERUJVRyAqLworfSAvLyBfX2ttcF9zdGdfcHJpbnRfdG9wb2xvZ3lfbWV0aG9kCisKKyNlbmRpZiAvKiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEICovCisKKworI2lmIE9NUF80MF9FTkFCTEVECisKKy8vCisvLyBPTVBfUFJPQ19CSU5EIC8gYmluZC12YXIgaXMgZnVuY3Rpb25hbCBvbiBhbGwgNC4wIGJ1aWxkcywgaW5jbHVkaW5nIE9TIFgqCisvLyBPTVBfUExBQ0VTIC8gcGxhY2UtcGFydGl0aW9uLXZhciBpcyBub3QuCisvLworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9wcm9jX2JpbmQoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkKK3sKKyAgICBrbXBfc2V0dGluZ190ICoqcml2YWxzID0gKGttcF9zZXR0aW5nX3QgKiopIGRhdGE7CisgICAgaW50IHJjOworCisgICAgcmMgPSBfX2ttcF9zdGdfY2hlY2tfcml2YWxzKCBuYW1lLCB2YWx1ZSwgcml2YWxzICk7CisgICAgaWYgKCByYyApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vCisgICAgLy8gaW4gT01QIDQuMCBPTVBfUFJPQ19CSU5EIGlzIGEgdmVjdG9yIG9mIHByb2NfYmluZCB0eXBlcy4KKyAgICAvLworICAgIEtNUF9ERUJVR19BU1NFUlQoIChfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXMgIT0gTlVMTCkKKyAgICAgICYmICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC51c2VkID4gMCApICk7CisKKyAgICBjb25zdCBjaGFyICpidWYgPSB2YWx1ZTsKKyAgICBjb25zdCBjaGFyICpuZXh0OworICAgIGludCBudW07CisgICAgU0tJUF9XUyggYnVmICk7CisgICAgaWYgKCAoKmJ1ZiA+PSAnMCcpICYmICgqYnVmIDw9ICc5JykgKSB7CisgICAgICAgIG5leHQgPSBidWY7CisgICAgICAgIFNLSVBfRElHSVRTKCBuZXh0ICk7CisgICAgICAgIG51bSA9IF9fa21wX3N0cl90b19pbnQoIGJ1ZiwgKm5leHQgKTsKKyAgICAgICAgS01QX0FTU0VSVCggbnVtID49IDAgKTsKKyAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgU0tJUF9XUyggYnVmICk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBudW0gPSAtMTsKKyAgICB9CisKKyAgICBuZXh0ID0gYnVmOworICAgIGlmICggX19rbXBfbWF0Y2hfc3RyKCAiZGlzYWJsZWQiLCBidWYsICZuZXh0ICkgKSB7CisgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgIFNLSVBfV1MoIGJ1ZiApOworIyBpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9kaXNhYmxlZDsKKyMgZW5kaWYgLyogS01QX0FGRklOSVRZX1NVUFBPUlRFRCAqLworICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLnVzZWQgPSAxOworICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfZmFsc2U7CisgICAgfQorICAgIGVsc2UgaWYgKCAoIG51bSA9PSAoaW50KXByb2NfYmluZF9mYWxzZSApCisgICAgICB8fCBfX2ttcF9tYXRjaF9zdHIoICJmYWxzZSIsIGJ1ZiwgJm5leHQgKSApIHsKKyAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgU0tJUF9XUyggYnVmICk7CisjIGlmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X25vbmU7CisjIGVuZGlmIC8qIEtNUF9BRkZJTklUWV9TVVBQT1JURUQgKi8KKyAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC51c2VkID0gMTsKKyAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID0gcHJvY19iaW5kX2ZhbHNlOworICAgIH0KKyAgICBlbHNlIGlmICggKCBudW0gPT0gKGludClwcm9jX2JpbmRfdHJ1ZSApCisgICAgICB8fCBfX2ttcF9tYXRjaF9zdHIoICJ0cnVlIiwgYnVmLCAmbmV4dCApICkgeworICAgICAgICBidWYgPSBuZXh0OworICAgICAgICBTS0lQX1dTKCBidWYgKTsKKyAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC51c2VkID0gMTsKKyAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID0gcHJvY19iaW5kX3RydWU7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvLworICAgICAgICAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIHZhbHVlcyBpbiB0aGUgZW52IHZhciBzdHJpbmcKKyAgICAgICAgLy8KKyAgICAgICAgY29uc3QgY2hhciAqc2NhbjsKKyAgICAgICAgaW50IG5lbGVtID0gMTsKKyAgICAgICAgZm9yICggc2NhbiA9IGJ1ZjsgKnNjYW4gIT0gJ1wwJzsgc2NhbisrICkgeworICAgICAgICAgICAgaWYgKCAqc2NhbiA9PSAnLCcgKSB7CisgICAgICAgICAgICAgICAgbmVsZW0rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIENyZWF0ZSAvIGV4cGFuZCB0aGUgbmVzdGVkIHByb2NfYmluZCBhcnJheSBhcyBuZWVkZWQKKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLnNpemUgPCBuZWxlbSApIHsKKyAgICAgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlcyA9IChrbXBfcHJvY19iaW5kX3QgKikKKyAgICAgICAgICAgICAgICBLTVBfSU5URVJOQUxfUkVBTExPQyggX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzLAorICAgICAgICAgICAgICAgIHNpemVvZihrbXBfcHJvY19iaW5kX3QpICogbmVsZW0gKTsKKyAgICAgICAgICAgIGlmICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzID09IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgS01QX0ZBVEFMKCBNZW1vcnlBbGxvY0ZhaWxlZCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5zaXplID0gbmVsZW07CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC51c2VkID0gbmVsZW07CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gU2F2ZSB2YWx1ZXMgaW4gdGhlIG5lc3RlZCBwcm9jX2JpbmQgYXJyYXkKKyAgICAgICAgLy8KKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBlbnVtIGttcF9wcm9jX2JpbmRfdCBiaW5kOworCisgICAgICAgICAgICBpZiAoICggbnVtID09IChpbnQpcHJvY19iaW5kX21hc3RlciApCisgICAgICAgICAgICAgIHx8IF9fa21wX21hdGNoX3N0ciggIm1hc3RlciIsIGJ1ZiwgJm5leHQgKSApIHsKKyAgICAgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICAgICAgICAgIFNLSVBfV1MoIGJ1ZiApOworICAgICAgICAgICAgICAgIGJpbmQgPSBwcm9jX2JpbmRfbWFzdGVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoICggbnVtID09IChpbnQpcHJvY19iaW5kX2Nsb3NlICkKKyAgICAgICAgICAgICAgfHwgX19rbXBfbWF0Y2hfc3RyKCAiY2xvc2UiLCBidWYsICZuZXh0ICkgKSB7CisgICAgICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgICAgICAgICBTS0lQX1dTKCBidWYgKTsKKyAgICAgICAgICAgICAgICBiaW5kID0gcHJvY19iaW5kX2Nsb3NlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoICggbnVtID09IChpbnQpcHJvY19iaW5kX3NwcmVhZCApCisgICAgICAgICAgICAgIHx8IF9fa21wX21hdGNoX3N0ciggInNwcmVhZCIsIGJ1ZiwgJm5leHQgKSApIHsKKyAgICAgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICAgICAgICAgIFNLSVBfV1MoIGJ1ZiApOworICAgICAgICAgICAgICAgIGJpbmQgPSBwcm9jX2JpbmRfc3ByZWFkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIFN0Z0ludmFsaWRWYWx1ZSwgbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfZmFsc2U7CisgICAgICAgICAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC51c2VkID0gMTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1tpKytdID0gYmluZDsKKyAgICAgICAgICAgIGlmICggaSA+PSBuZWxlbSApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoICpidWYgPT0gJywnICk7CisgICAgICAgICAgICBidWYrKzsKKyAgICAgICAgICAgIFNLSVBfV1MoIGJ1ZiApOworCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gUmVhZCBuZXh0IHZhbHVlIGlmIGl0IHdhcyBzcGVjaWZpZWQgYXMgYW4gaW50ZWdlcgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmICggKCpidWYgPj0gJzAnKSAmJiAoKmJ1ZiA8PSAnOScpICkgeworICAgICAgICAgICAgICAgIG5leHQgPSBidWY7CisgICAgICAgICAgICAgICAgU0tJUF9ESUdJVFMoIG5leHQgKTsKKyAgICAgICAgICAgICAgICBudW0gPSBfX2ttcF9zdHJfdG9faW50KCBidWYsICpuZXh0ICk7CisgICAgICAgICAgICAgICAgS01QX0FTU0VSVCggbnVtID49IDAgKTsKKyAgICAgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICAgICAgICAgIFNLSVBfV1MoIGJ1ZiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbnVtID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgU0tJUF9XUyggYnVmICk7CisgICAgfQorICAgIGlmICggKmJ1ZiAhPSAnXDAnICkgeworICAgICAgICBLTVBfV0FSTklORyggUGFyc2VFeHRyYUNoYXJzV2FybiwgbmFtZSwgYnVmICk7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfcHJvY19iaW5kKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwKKyAgdm9pZCAqIGRhdGEgKQoreworICAgIGludCBuZWxlbSA9IF9fa21wX25lc3RlZF9wcm9jX2JpbmQudXNlZDsKKyAgICBpZiggX19rbXBfZW52X2Zvcm1hdCApIHsKKyAgICAgICAgS01QX1NUUl9CVUZfUFJJTlRfTkFNRTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICAlcyIsIG5hbWUgKTsKKyAgICB9CisgICAgaWYgKCBuZWxlbSA9PSAwICkgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICI6ICVzXG4iLCBLTVBfSTE4Tl9TVFIoIE5vdERlZmluZWQgKSApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIj0nIiwgbmFtZSApOworICAgICAgICBmb3IgKCBpID0gMDsgaSA8IG5lbGVtOyBpKysgKSB7CisgICAgICAgICAgICBzd2l0Y2ggKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbaV0gKSB7CisgICAgICAgICAgICAgICAgY2FzZSBwcm9jX2JpbmRfZmFsc2U6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiZmFsc2UiICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIHByb2NfYmluZF90cnVlOgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgInRydWUiICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIHByb2NfYmluZF9tYXN0ZXI6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAibWFzdGVyIiApOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBwcm9jX2JpbmRfY2xvc2U6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiY2xvc2UiICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIHByb2NfYmluZF9zcHJlYWQ6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAic3ByZWFkIiApOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBwcm9jX2JpbmRfaW50ZWw6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiaW50ZWwiICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIHByb2NfYmluZF9kZWZhdWx0OgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgImRlZmF1bHQiICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGkgPCBuZWxlbSAtIDEgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiLCIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICInXG4iICk7CisgICAgfQorfQorCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPTVBfRFlOQU1JQworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX29tcF9keW5hbWljKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApCit7CisgICAgX19rbXBfc3RnX3BhcnNlX2Jvb2woIG5hbWUsIHZhbHVlLCAmIChfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWMpICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9vbXBfZHluYW1pYworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X29tcF9keW5hbWljKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKQoreworICAgIF9fa21wX3N0Z19wcmludF9ib29sKCBidWZmZXIsIG5hbWUsIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pYyApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfb21wX2R5bmFtaWMKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9rbXBfZHluYW1pY19tb2RlKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApCit7CisgICAgaWYgKCBUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSApIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIEVudlBhcmFsbGVsV2FybiwgbmFtZSApOworICAgICAgICBfX2ttcF9lbnZfdG9QcmludCggbmFtZSwgMCApOworICAgICAgICByZXR1cm47CisgICAgfQorI2lmZGVmIFVTRV9MT0FEX0JBTEFOQ0UKKyAgICBlbHNlIGlmICggX19rbXBfc3RyX21hdGNoKCAibG9hZCBiYWxhbmNlIiwgMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAibG9hZF9iYWxhbmNlIiwgMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAibG9hZC1iYWxhbmNlIiwgMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAibG9hZGJhbGFuY2UiLCAyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJiYWxhbmNlIiwgMSwgdmFsdWUgKSApIHsKKyAgICAgICAgX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljX21vZGUgPSBkeW5hbWljX2xvYWRfYmFsYW5jZTsKKyAgICB9CisjZW5kaWYgLyogVVNFX0xPQURfQkFMQU5DRSAqLworICAgIGVsc2UgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJ0aHJlYWQgbGltaXQiLCAxLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJ0aHJlYWRfbGltaXQiLCAxLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJ0aHJlYWQtbGltaXQiLCAxLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJ0aHJlYWRsaW1pdCIsIDEsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImxpbWl0IiwgMiwgdmFsdWUgKSApIHsKKyAgICAgICAgX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljX21vZGUgPSBkeW5hbWljX3RocmVhZF9saW1pdDsKKyAgICB9CisgICAgZWxzZSBpZiAoIF9fa21wX3N0cl9tYXRjaCggInJhbmRvbSIsIDEsIHZhbHVlICkgKSB7CisgICAgICAgIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pY19tb2RlID0gZHluYW1pY19yYW5kb207CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBLTVBfV0FSTklORyggU3RnSW52YWxpZFZhbHVlLCBuYW1lLCB2YWx1ZSApOworICAgIH0KK30gLy9fX2ttcF9zdGdfcGFyc2Vfa21wX2R5bmFtaWNfbW9kZQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2ttcF9keW5hbWljX21vZGUoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApCit7CisjaWYgS01QX0RFQlVHCisgICAgaWYgKCBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWNfbW9kZSA9PSBkeW5hbWljX2RlZmF1bHQgKSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzOiAlcyBcbiIsIG5hbWUsIEtNUF9JMThOX1NUUiggTm90RGVmaW5lZCApICk7CisgICAgfQorIyBpZmRlZiBVU0VfTE9BRF9CQUxBTkNFCisgICAgZWxzZSBpZiAoIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pY19tb2RlID09IGR5bmFtaWNfbG9hZF9iYWxhbmNlICkgeworICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc3RyKCBidWZmZXIsIG5hbWUsICJsb2FkIGJhbGFuY2UiICk7CisgICAgfQorIyBlbmRpZiAvKiBVU0VfTE9BRF9CQUxBTkNFICovCisgICAgZWxzZSBpZiAoIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pY19tb2RlID09IGR5bmFtaWNfdGhyZWFkX2xpbWl0ICkgeworICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc3RyKCBidWZmZXIsIG5hbWUsICJ0aHJlYWQgbGltaXQiICk7CisgICAgfQorICAgIGVsc2UgaWYgKCBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWNfbW9kZSA9PSBkeW5hbWljX3JhbmRvbSApIHsKKyAgICAgICAgX19rbXBfc3RnX3ByaW50X3N0ciggYnVmZmVyLCBuYW1lLCAicmFuZG9tIiApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgS01QX0FTU0VSVCgwKTsKKyAgICB9CisjZW5kaWYgLyogS01QX0RFQlVHICovCit9IC8vIF9fa21wX3N0Z19wcmludF9rbXBfZHluYW1pY19tb2RlCisKKworI2lmZGVmIFVTRV9MT0FEX0JBTEFOQ0UKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0xPQURfQkFMQU5DRV9JTlRFUlZBTAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2xkX2JhbGFuY2VfaW50ZXJ2YWwoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkKK3sKKyAgICBkb3VibGUgaW50ZXJ2YWwgPSBfX2ttcF9jb252ZXJ0X3RvX2RvdWJsZSggdmFsdWUgKTsKKyAgICBpZiAoIGludGVydmFsID49IDAgKSB7CisgICAgICAgIF9fa21wX2xvYWRfYmFsYW5jZV9pbnRlcnZhbCA9IGludGVydmFsOworICAgIH0gZWxzZSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBTdGdJbnZhbGlkVmFsdWUsIG5hbWUsIHZhbHVlICk7CisgICAgfTsgLy8gaWYKK30gLy8gX19rbXBfc3RnX3BhcnNlX2xvYWRfYmFsYW5jZV9pbnRlcnZhbAorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2xkX2JhbGFuY2VfaW50ZXJ2YWwoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyNpZiBLTVBfREVCVUcKKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICAlcz0lOC42ZlxuIiwgbmFtZSwgX19rbXBfbG9hZF9iYWxhbmNlX2ludGVydmFsICk7CisjZW5kaWYgLyogS01QX0RFQlVHICovCit9IC8vIF9fa21wX3N0Z19wcmludF9sb2FkX2JhbGFuY2VfaW50ZXJ2YWwKKworI2VuZGlmIC8qIFVTRV9MT0FEX0JBTEFOQ0UgKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0lOSVRfQVRfRk9SSworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2luaXRfYXRfZm9yayggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2Jvb2woIG5hbWUsIHZhbHVlLCAmIF9fa21wX25lZWRfcmVnaXN0ZXJfYXRmb3JrICk7CisgICAgaWYgKCBfX2ttcF9uZWVkX3JlZ2lzdGVyX2F0Zm9yayApIHsKKyAgICAgICAgX19rbXBfbmVlZF9yZWdpc3Rlcl9hdGZvcmtfc3BlY2lmaWVkID0gVFJVRTsKKyAgICB9OworfSAvLyBfX2ttcF9zdGdfcGFyc2VfaW5pdF9hdF9mb3JrCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfaW5pdF9hdF9mb3JrKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2Jvb2woIGJ1ZmZlciwgbmFtZSwgX19rbXBfbmVlZF9yZWdpc3Rlcl9hdGZvcmtfc3BlY2lmaWVkICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9pbml0X2F0X2ZvcmsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX1NDSEVEVUxFCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2Vfc2NoZWR1bGUoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworCisgICAgaWYgKCB2YWx1ZSAhPSBOVUxMICkgeworICAgICAgICBzaXplX3QgbGVuZ3RoID0gS01QX1NUUkxFTiggdmFsdWUgKTsKKyAgICAgICAgaWYgKCBsZW5ndGggPiBJTlRfTUFYICkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIExvbmdWYWx1ZSwgbmFtZSApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2hhciAqc2VtaWNvbG9uOworICAgICAgICAgICAgaWYoIHZhbHVlWyBsZW5ndGggLSAxIF0gPT0gJyInIHx8IHZhbHVlWyBsZW5ndGggLTEgXSA9PSAnXCcnICkKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggVW5iYWxhbmNlZFF1b3RlcywgbmFtZSApOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGNoYXIgc2VudGluZWw7CisKKyAgICAgICAgICAgICAgICBzZW1pY29sb24gPSAoY2hhciAqKSBzdHJjaHIoIHZhbHVlLCAnOycgKTsKKyAgICAgICAgICAgICAgICBpZiggKnZhbHVlICYmIHNlbWljb2xvbiAhPSB2YWx1ZSApIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqY29tbWEgPSAoY2hhciAqKSBzdHJjaHIoIHZhbHVlLCAnLCcgKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIGNvbW1hICkgeworICAgICAgICAgICAgICAgICAgICAgICAgKytjb21tYTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbnRpbmVsID0gJywnOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbnRpbmVsID0gJzsnOworICAgICAgICAgICAgICAgICAgICBpZiAoICFfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoICJzdGF0aWMiLCB2YWx1ZSwgc2VudGluZWwgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAhX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCAiZ3JlZWR5IiwgY29tbWEsICc7JyApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0YXRpYyA9IGttcF9zY2hfc3RhdGljX2dyZWVkeTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiggIV9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCggImJhbGFuY2VkIiwgY29tbWEsICc7JyApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0YXRpYyA9IGttcF9zY2hfc3RhdGljX2JhbGFuY2VkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCAhX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCAiZ3VpZGVkIiwgdmFsdWUsIHNlbnRpbmVsICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICFfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoICJpdGVyYXRpdmUiLCBjb21tYSwgJzsnICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3VpZGVkID0ga21wX3NjaF9ndWlkZWRfaXRlcmF0aXZlX2NodW5rZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCAhX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCAiYW5hbHl0aWNhbCIsIGNvbW1hLCAnOycgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmFseXRpY2FsIG5vdCBhbGxvd2VkIGZvciB0b28gbWFueSB0aHJlYWRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3VpZGVkID0ga21wX3NjaF9ndWlkZWRfYW5hbHl0aWNhbF9jaHVua2VkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBJbnZhbGlkQ2xhdXNlLCBuYW1lLCB2YWx1ZSApOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggRW1wdHlDbGF1c2UsIG5hbWUgKTsKKyAgICAgICAgICAgIH0gd2hpbGUgKCAodmFsdWUgPSBzZW1pY29sb24gPyBzZW1pY29sb24gKyAxIDogTlVMTCkgKTsKKyAgICAgICAgfQorICAgIH07IC8vIGlmCisKK30gLy8gX19rbXBfc3RnX3BhcnNlX19zY2hlZHVsZQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X3NjaGVkdWxlKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgaWYoIF9fa21wX2Vudl9mb3JtYXQgKSB7CisgICAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX05BTUVfRVgobmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXM9JyIsIG5hbWUgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9zdGF0aWMgPT0ga21wX3NjaF9zdGF0aWNfZ3JlZWR5ICkgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcyIsICJzdGF0aWMsZ3JlZWR5Iik7CisgICAgfSBlbHNlIGlmICggX19rbXBfc3RhdGljID09IGttcF9zY2hfc3RhdGljX2JhbGFuY2VkICkgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50ICggYnVmZmVyLCAiJXMiLCAic3RhdGljLGJhbGFuY2VkIik7CisgICAgfQorICAgIGlmICggX19rbXBfZ3VpZGVkID09IGttcF9zY2hfZ3VpZGVkX2l0ZXJhdGl2ZV9jaHVua2VkICkgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICI7JXMnXG4iLCAiZ3VpZGVkLGl0ZXJhdGl2ZSIpOworICAgIH0gZWxzZSBpZiAoIF9fa21wX2d1aWRlZCA9PSBrbXBfc2NoX2d1aWRlZF9hbmFseXRpY2FsX2NodW5rZWQgKSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIjslcydcbiIsICJndWlkZWQsYW5hbHl0aWNhbCIpOworICAgIH0KK30gLy8gX19rbXBfc3RnX3ByaW50X3NjaGVkdWxlCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9NUF9TQ0hFRFVMRQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX29tcF9zY2hlZHVsZSggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKQoreworICAgIHNpemVfdCAgICAgIGxlbmd0aDsKKyAgICBpZiggdmFsdWUgKSB7CisgICAgICAgIGxlbmd0aCA9IEtNUF9TVFJMRU4oIHZhbHVlICk7CisgICAgICAgIGlmKCBsZW5ndGggKSB7CisgICAgICAgICAgICBjaGFyICpjb21tYSA9IChjaGFyICopIHN0cmNociggdmFsdWUsICcsJyApOworICAgICAgICAgICAgaWYoIHZhbHVlWyBsZW5ndGggLSAxIF0gPT0gJyInIHx8IHZhbHVlWyBsZW5ndGggLTEgXSA9PSAnXCcnKQorICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBVbmJhbGFuY2VkUXVvdGVzLCBuYW1lICk7CisgICAgICAgICAgICAvKiBnZXQgdGhlIHNwZWNpZmllZCBzY2hlZHVsaW5nIHN0eWxlICovCisgICAgICAgICAgICBpZiAoIV9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCgiZHluYW1pYyIsIHZhbHVlLCAnLCcpKSAgICAgICAgICAvKiBEWU5BTUlDICovCisgICAgICAgICAgICAgICAgX19rbXBfc2NoZWQgPSBrbXBfc2NoX2R5bmFtaWNfY2h1bmtlZDsKKyAgICAgICAgICAgIGVsc2UgaWYgKCFfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoImd1aWRlZCIsIHZhbHVlLCAnLCcpKSAgICAgIC8qIEdVSURFRCAqLworICAgICAgICAgICAgICAgIF9fa21wX3NjaGVkID0ga21wX3NjaF9ndWlkZWRfY2h1bmtlZDsKKy8vIEFDOiBUT0RPOiBhZGQgQVVUTyBzY2hlZHVsZSwgYW5kIHBwcm9iYWJseSByZW1vdmUgVFJBUEVaT0lEQUwgKE9NUCAzLjAgZG9lcyBub3QgYWxsb3cgaXQpCisgICAgICAgICAgICBlbHNlIGlmICghX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCJhdXRvIiwgdmFsdWUsICcsJykpIHsgICAgICAgLyogQVVUTyAqLworICAgICAgICAgICAgICAgIF9fa21wX3NjaGVkID0ga21wX3NjaF9hdXRvOworICAgICAgICAgICAgICAgIGlmKCBjb21tYSApIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKCBrbXBfbXNfd2FybmluZywgS01QX01TRyggSWdub3JlQ2h1bmssIG5hbWUsIGNvbW1hICksIF9fa21wX21zZ19udWxsICk7CisgICAgICAgICAgICAgICAgICAgIGNvbW1hID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICghX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCJ0cmFwZXpvaWRhbCIsIHZhbHVlLCAnLCcpKSAvKiBUUkFQRVpPSURBTCAqLworICAgICAgICAgICAgICAgIF9fa21wX3NjaGVkID0ga21wX3NjaF90cmFwZXpvaWRhbDsKKyAgICAgICAgICAgIGVsc2UgaWYgKCFfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoInN0YXRpYyIsIHZhbHVlLCAnLCcpKSAgICAgIC8qIFNUQVRJQyAqLworICAgICAgICAgICAgICAgIF9fa21wX3NjaGVkID0ga21wX3NjaF9zdGF0aWM7CisjaWZkZWYgS01QX1NUQVRJQ19TVEVBTF9FTkFCTEVECisgICAgICAgICAgICBlbHNlIGlmIChLTVBfQVJDSF9YODZfNjQgJiYKKyAgICAgICAgICAgICAgICAgICAgICFfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoInN0YXRpY19zdGVhbCIsIHZhbHVlLCAnLCcpKQorICAgICAgICAgICAgICAgIF9fa21wX3NjaGVkID0ga21wX3NjaF9zdGF0aWNfc3RlYWw7CisjZW5kaWYKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBTdGdJbnZhbGlkVmFsdWUsIG5hbWUsIHZhbHVlICk7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBOVUxMOyAvKiBza2lwIHByb2Nlc3Npbmcgb2YgY29tbWEgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCB2YWx1ZSAmJiBjb21tYSApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9lbnZfY2h1bmsgPSBUUlVFOworCisgICAgICAgICAgICAgICAgaWYoX19rbXBfc2NoZWQgPT0ga21wX3NjaF9zdGF0aWMpCisgICAgICAgICAgICAgICAgICAgIF9fa21wX3NjaGVkID0ga21wX3NjaF9zdGF0aWNfY2h1bmtlZDsKKyAgICAgICAgICAgICAgICArK2NvbW1hOworICAgICAgICAgICAgICAgIF9fa21wX2NodW5rID0gX19rbXBfc3RyX3RvX2ludCggY29tbWEsIDAgKTsKKyAgICAgICAgICAgICAgICBpZiAoIF9fa21wX2NodW5rIDwgMSApIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfY2h1bmsgPSBLTVBfREVGQVVMVF9DSFVOSzsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKCBrbXBfbXNfd2FybmluZywgS01QX01TRyggSW52YWxpZENodW5rLCBuYW1lLCBjb21tYSApLCBfX2ttcF9tc2dfbnVsbCApOworICAgICAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKCBVc2luZ19pbnRfVmFsdWUsIG5hbWUsIF9fa21wX2NodW5rICk7CisvLyBBQzogbmV4dCBibG9jayBjb21tZW50ZWQgb3V0IHVudGlsIEtNUF9ERUZBVUxUX0NIVU5LICE9IEtNUF9NSU5fQ0hVTksgKHRvIGltcHJvdmUgY29kZSBjb3ZlcmFnZSA6KQorLy8gICAgIFRoZSBkZWZhdWx0IGNodW5rIHNpemUgaXMgMSBhY2NvcmRpbmcgdG8gc3RhbmRhcmQsIHRodXMgbWFraW5nIEtNUF9NSU5fQ0hVTksgbm90IDEgd2Ugd291bGQgaW50cm9kdWNlIG1lc3M6CisvLyAgICAgd3JvbmcgY2h1bmsgYmVjb21lcyAxLCBidXQgaXQgd2lsbCBiZSBpbXBvc3NpYmxlIHRvIGV4cGxpY2l0ZWx5IHNldCAxLCBiZWNhdXNlIGl0IGJlY29tZXMgS01QX01JTl9DSFVOSy4uLgorLy8gICAgICAgICAgICAgICAgfSBlbHNlIGlmICggX19rbXBfY2h1bmsgPCBLTVBfTUlOX0NIVU5LICkgeworLy8gICAgICAgICAgICAgICAgICAgIF9fa21wX2NodW5rID0gS01QX01JTl9DSFVOSzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBfX2ttcF9jaHVuayA+IEtNUF9NQVhfQ0hVTksgKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2NodW5rID0gS01QX01BWF9DSFVOSzsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKCBrbXBfbXNfd2FybmluZywgS01QX01TRyggTGFyZ2VDaHVuaywgbmFtZSwgY29tbWEgKSwgX19rbXBfbXNnX251bGwgKTsKKyAgICAgICAgICAgICAgICAgICAgS01QX0lORk9STSggVXNpbmdfaW50X1ZhbHVlLCBuYW1lLCBfX2ttcF9jaHVuayApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIF9fa21wX2Vudl9jaHVuayA9IEZBTFNFOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBFbXB0eVN0cmluZywgbmFtZSApOworICAgIH0KKyAgICBLX0RJQUcoMSwgKCJfX2ttcF9zdGF0aWMgPT0gJWRcbiIsIF9fa21wX3N0YXRpYykpCisgICAgS19ESUFHKDEsICgiX19rbXBfZ3VpZGVkID09ICVkXG4iLCBfX2ttcF9ndWlkZWQpKQorICAgIEtfRElBRygxLCAoIl9fa21wX3NjaGVkID09ICVkXG4iLCBfX2ttcF9zY2hlZCkpCisgICAgS19ESUFHKDEsICgiX19rbXBfY2h1bmsgPT0gJWRcbiIsIF9fa21wX2NodW5rKSkKK30gLy8gX19rbXBfc3RnX3BhcnNlX29tcF9zY2hlZHVsZQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X29tcF9zY2hlZHVsZSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIGlmKCBfX2ttcF9lbnZfZm9ybWF0ICkgeworICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9OQU1FX0VYKG5hbWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzPSciLCBuYW1lICk7CisgICAgfQorICAgIGlmICggX19rbXBfY2h1bmsgKSB7CisgICAgICAgIHN3aXRjaCAoIF9fa21wX3NjaGVkICkgeworICAgICAgICAgICAgY2FzZSBrbXBfc2NoX2R5bmFtaWNfY2h1bmtlZDoKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcywlZCdcbiIsICJkeW5hbWljIiwgX19rbXBfY2h1bmspOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBrbXBfc2NoX2d1aWRlZF9pdGVyYXRpdmVfY2h1bmtlZDoKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9ndWlkZWRfYW5hbHl0aWNhbF9jaHVua2VkOgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzLCVkJ1xuIiwgImd1aWRlZCIsIF9fa21wX2NodW5rKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF90cmFwZXpvaWRhbDoKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcywlZCdcbiIsICJ0cmFwZXpvaWRhbCIsIF9fa21wX2NodW5rKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9zdGF0aWM6CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfc3RhdGljX2NodW5rZWQ6CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfc3RhdGljX2JhbGFuY2VkOgorICAgICAgICAgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19ncmVlZHk6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsJWQnXG4iLCAic3RhdGljIiwgX19rbXBfY2h1bmspOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19zdGVhbDoKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcywlZCdcbiIsICJzdGF0aWNfc3RlYWwiLCBfX2ttcF9jaHVuayk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfYXV0bzoKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcywlZCdcbiIsICJhdXRvIiwgX19rbXBfY2h1bmspOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpdGNoICggX19rbXBfc2NoZWQgKSB7CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfZHluYW1pY19jaHVua2VkOgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzJ1xuIiwgImR5bmFtaWMiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9ndWlkZWRfaXRlcmF0aXZlX2NodW5rZWQ6CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfZ3VpZGVkX2FuYWx5dGljYWxfY2h1bmtlZDoKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcydcbiIsICJndWlkZWQiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF90cmFwZXpvaWRhbDoKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcydcbiIsICJ0cmFwZXpvaWRhbCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBrbXBfc2NoX3N0YXRpYzoKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfY2h1bmtlZDoKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQ6CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfc3RhdGljX2dyZWVkeToKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcydcbiIsICJzdGF0aWMiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfc3RlYWw6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMnXG4iLCAic3RhdGljX3N0ZWFsIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfYXV0bzoKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcydcbiIsICJhdXRvIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9IC8vIF9fa21wX3N0Z19wcmludF9vbXBfc2NoZWR1bGUKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0FUT01JQ19NT0RFCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfYXRvbWljX21vZGUoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIC8vIE1vZGVzOiAwIC0tIGRvIG5vdCBjaGFuZ2UgZGVmYXVsdDsgMSAtLSBJbnRlbCBwZXJmIG1vZGUsIDIgLS0gR09NUCBjb21wYXRpYmlsaXR5IG1vZGUuCisgICAgaW50IG1vZGUgPSAwOworICAgIGludCBtYXggID0gMTsKKyAgICAjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgICAgIG1heCA9IDI7CisgICAgI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworICAgIF9fa21wX3N0Z19wYXJzZV9pbnQoIG5hbWUsIHZhbHVlLCAwLCBtYXgsICYgbW9kZSApOworICAgIC8vIFRPRE87IHBhcnNlX2ludCBpcyBub3QgdmVyeSBzdWl0YWJsZSBmb3IgdGhpcyBjYXNlLiBJbiBjYXNlIG9mIG92ZXJmbG93IGl0IGlzIGJldHRlciB0byB1c2UKKyAgICAvLyAwIHJhdGhlciB0aGF0IG1heCB2YWx1ZS4KKyAgICBpZiAoIG1vZGUgPiAwICkgeworICAgICAgICBfX2ttcF9hdG9taWNfbW9kZSA9IG1vZGU7CisgICAgfTsgLy8gaWYKK30gLy8gX19rbXBfc3RnX3BhcnNlX2F0b21pY19tb2RlCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfYXRvbWljX21vZGUoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfaW50KCBidWZmZXIsIG5hbWUsIF9fa21wX2F0b21pY19tb2RlICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9hdG9taWNfbW9kZQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9DT05TSVNURU5DWV9DSEVDSworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2NvbnNpc3RlbmN5X2NoZWNrKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBpZiAoICEgX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCAiYWxsIiwgdmFsdWUsIDAgKSApIHsKKyAgICAgICAgLy8gTm90ZSwgdGhpcyB3aWxsIG5vdCB3b3JrIGZyb20ga21wX3NldF9kZWZhdWx0cyBiZWNhdXNlIHRoX2NvbnMgc3RhY2sgd2FzIG5vdCBhbGxvY2F0ZWQKKyAgICAgICAgLy8gZm9yIGV4aXN0ZWQgdGhyZWFkKHMpIHRodXMgdGhlIGZpcnN0IF9fa21wX3B1c2hfPGNvbnN0cnVjdD4gd2lsbCBicmVhayB3aXRoIGFzc2VydGlvbi4KKyAgICAgICAgLy8gVE9ETzogYWxsb2NhdGUgdGhfY29ucyBpZiBjYWxsZWQgZnJvbSBrbXBfc2V0X2RlZmF1bHRzLgorICAgICAgICBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgPSBUUlVFOworICAgIH0gZWxzZSBpZiAoICEgX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCAibm9uZSIsIHZhbHVlLCAwICkgKSB7CisgICAgICAgIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayA9IEZBTFNFOworICAgIH0gZWxzZSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBTdGdJbnZhbGlkVmFsdWUsIG5hbWUsIHZhbHVlICk7CisgICAgfTsgLy8gaWYKK30gLy8gX19rbXBfc3RnX3BhcnNlX2NvbnNpc3RlbmN5X2NoZWNrCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfY29uc2lzdGVuY3lfY2hlY2soIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyNpZiBLTVBfREVCVUcKKyAgICBjb25zdCBjaGFyICp2YWx1ZSA9IE5VTEw7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgdmFsdWUgPSAiYWxsIjsKKyAgICB9IGVsc2UgeworICAgICAgICB2YWx1ZSA9ICJub25lIjsKKyAgICB9CisKKyAgICBpZiAoIHZhbHVlICE9IE5VTEwgKSB7CisgICAgICAgIF9fa21wX3N0Z19wcmludF9zdHIoIGJ1ZmZlciwgbmFtZSwgdmFsdWUgKTsKKyAgICB9CisjZW5kaWYgLyogS01QX0RFQlVHICovCit9IC8vIF9fa21wX3N0Z19wcmludF9jb25zaXN0ZW5jeV9jaGVjaworCisKKyNpZiBVU0VfSVRUX0JVSUxECisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfSVRUX1BSRVBBUkVfREVMQVkKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmIFVTRV9JVFRfTk9USUZZCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfaXR0X3ByZXBhcmVfZGVsYXkoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkKK3sKKyAgICAvLyBFeHBlcmltZW50YWwgY29kZTogS01QX0lUVF9QUkVQQVJFX0RFTEFZIHNwZWNpZmllcyBudW1iZXJ0IG9mIGxvb3AgaXRlcmF0aW9ucy4KKyAgICBpbnQgZGVsYXkgPSAwOworICAgIF9fa21wX3N0Z19wYXJzZV9pbnQoIG5hbWUsIHZhbHVlLCAwLCBJTlRfTUFYLCAmIGRlbGF5ICk7CisgICAgX19rbXBfaXR0X3ByZXBhcmVfZGVsYXkgPSBkZWxheTsKK30gLy8gX19rbXBfc3RyX3BhcnNlX2l0dF9wcmVwYXJlX2RlbGF5CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfaXR0X3ByZXBhcmVfZGVsYXkoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfdWludDY0KCBidWZmZXIsIG5hbWUsIF9fa21wX2l0dF9wcmVwYXJlX2RlbGF5ICk7CisKK30gLy8gX19rbXBfc3RyX3ByaW50X2l0dF9wcmVwYXJlX2RlbGF5CisKKyNlbmRpZiAvLyBVU0VfSVRUX05PVElGWQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX01BTExPQ19QT09MX0lOQ1IKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9tYWxsb2NfcG9vbF9pbmNyKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2Vfc2l6ZSgKKyAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICB2YWx1ZSwKKyAgICAgICAgICAgIEtNUF9NSU5fTUFMTE9DX1BPT0xfSU5DUiwKKyAgICAgICAgICAgIEtNUF9NQVhfTUFMTE9DX1BPT0xfSU5DUiwKKyAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAmIF9fa21wX21hbGxvY19wb29sX2luY3IsCisgICAgICAgICAgICAxCisgICAgICAgICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9tYWxsb2NfcG9vbF9pbmNyCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfbWFsbG9jX3Bvb2xfaW5jcigga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgICAgIF9fa21wX3N0Z19wcmludF9zaXplKCBidWZmZXIsIG5hbWUsIF9fa21wX21hbGxvY19wb29sX2luY3IgKTsKKworfSAvLyBfa21wX3N0Z19wcmludF9tYWxsb2NfcG9vbF9pbmNyCisKKworI2lmZGVmIEtNUF9ERUJVRworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfUEFSX1JBTkdFCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfcGFyX3JhbmdlX2VudiggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgICAgIF9fa21wX3N0Z19wYXJzZV9wYXJfcmFuZ2UoCisgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgdmFsdWUsCisgICAgICAgICAgICAmIF9fa21wX3Bhcl9yYW5nZSwKKyAgICAgICAgICAgIF9fa21wX3Bhcl9yYW5nZV9yb3V0aW5lLAorICAgICAgICAgICAgX19rbXBfcGFyX3JhbmdlX2ZpbGVuYW1lLAorICAgICAgICAgICAgJiBfX2ttcF9wYXJfcmFuZ2VfbGIsCisgICAgICAgICAgICAmIF9fa21wX3Bhcl9yYW5nZV91YgorICAgICAgICApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfcGFyX3JhbmdlX2VudgorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X3Bhcl9yYW5nZV9lbnYoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBpZiAoX19rbXBfcGFyX3JhbmdlICE9IDApIHsKKyAgICAgICAgX19rbXBfc3RnX3ByaW50X3N0ciggYnVmZmVyLCBuYW1lLCBwYXJfcmFuZ2VfdG9fcHJpbnQgKTsKKyAgICB9Cit9IC8vIF9fa21wX3N0Z19wcmludF9wYXJfcmFuZ2VfZW52CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9ZSUVMRF9DWUNMRSwgS01QX1lJRUxEX09OLCBLTVBfWUlFTERfT0ZGCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfeWllbGRfY3ljbGUoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIGludCBmbGFnID0gX19rbXBfeWllbGRfY3ljbGU7CisgICAgX19rbXBfc3RnX3BhcnNlX2Jvb2woIG5hbWUsIHZhbHVlLCAmIGZsYWcgKTsKKyAgICBfX2ttcF95aWVsZF9jeWNsZSA9IGZsYWc7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV95aWVsZF9jeWNsZQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X3lpZWxkX2N5Y2xlKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2Jvb2woIGJ1ZmZlciwgbmFtZSwgX19rbXBfeWllbGRfY3ljbGUgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X3lpZWxkX2N5Y2xlCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfeWllbGRfb24oIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgICAgICBfX2ttcF9zdGdfcGFyc2VfaW50KCBuYW1lLCB2YWx1ZSwgMiwgSU5UX01BWCwgJiBfX2ttcF95aWVsZF9vbl9jb3VudCApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfeWllbGRfb24KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF95aWVsZF9vbigga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwgX19rbXBfeWllbGRfb25fY291bnQgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X3lpZWxkX29uCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfeWllbGRfb2ZmKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICAgICAgX19rbXBfc3RnX3BhcnNlX2ludCggbmFtZSwgdmFsdWUsIDIsIElOVF9NQVgsICYgX19rbXBfeWllbGRfb2ZmX2NvdW50ICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV95aWVsZF9vZmYKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF95aWVsZF9vZmYoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfaW50KCBidWZmZXIsIG5hbWUsIF9fa21wX3lpZWxkX29mZl9jb3VudCApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfeWllbGRfb2ZmCisKKyNlbmRpZgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfSU5JVF9XQUlULCBLTVBfTkVYVF9XQUlUCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfaW5pdF93YWl0KCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgIGludCB3YWl0OworICAgS01QX0FTU0VSVCggKCBfX2ttcF9pbml0X3dhaXQgJiAxICkgPT0gMCApOworICAgd2FpdCA9IF9fa21wX2luaXRfd2FpdCAvIDI7CisgICAgX19rbXBfc3RnX3BhcnNlX2ludCggbmFtZSwgdmFsdWUsIEtNUF9NSU5fSU5JVF9XQUlULCBLTVBfTUFYX0lOSVRfV0FJVCwgJiB3YWl0ICk7CisgICAgX19rbXBfaW5pdF93YWl0ID0gd2FpdCAqIDI7CisgICAgS01QX0FTU0VSVCggKCBfX2ttcF9pbml0X3dhaXQgJiAxICkgPT0gMCApOworICAgIF9fa21wX3lpZWxkX2luaXQgPSBfX2ttcF9pbml0X3dhaXQ7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9pbml0X3dhaXQKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9pbml0X3dhaXQoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfaW50KCBidWZmZXIsIG5hbWUsIF9fa21wX2luaXRfd2FpdCApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfaW5pdF93YWl0CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfbmV4dF93YWl0KCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBpbnQgd2FpdDsKKyAgICBLTVBfQVNTRVJUKCAoIF9fa21wX25leHRfd2FpdCAmIDEgKSA9PSAwICk7CisgICAgd2FpdCA9IF9fa21wX25leHRfd2FpdCAvIDI7CisgICAgX19rbXBfc3RnX3BhcnNlX2ludCggbmFtZSwgdmFsdWUsIEtNUF9NSU5fTkVYVF9XQUlULCBLTVBfTUFYX05FWFRfV0FJVCwgJiB3YWl0ICk7CisgICAgX19rbXBfbmV4dF93YWl0ID0gd2FpdCAqIDI7CisgICAgS01QX0FTU0VSVCggKCBfX2ttcF9uZXh0X3dhaXQgJiAxICkgPT0gMCApOworICAgIF9fa21wX3lpZWxkX25leHQgPSBfX2ttcF9uZXh0X3dhaXQ7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9uZXh0X3dhaXQKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9uZXh0X3dhaXQoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfaW50KCBidWZmZXIsIG5hbWUsIF9fa21wX25leHRfd2FpdCApOworfSAvL19fa21wX3N0Z19wcmludF9uZXh0X3dhaXQKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfR1RJRF9NT0RFCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfZ3RpZF9tb2RlKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICAvLworICAgIC8vIE1vZGVzOgorICAgIC8vICAgMCAtLSBkbyBub3QgY2hhbmdlIGRlZmF1bHQKKyAgICAvLyAgIDEgLS0gc3Agc2VhcmNoCisgICAgLy8gICAyIC0tIHVzZSAia2V5ZWQiIFRMUyB2YXIsIGkuZS4KKyAgICAvLyAgICAgICAgcHRocmVhZF9nZXRzcGVjaWZpYyhMaW51eCogT1MvT1MgWCopIG9yIFRsc0dldFZhbHVlKFdpbmRvd3MqIE9TKQorICAgIC8vICAgMyAtLSBfX2RlY2xzcGVjKHRocmVhZCkgVExTIHZhciBpbiB0ZGF0YSBzZWN0aW9uCisgICAgLy8KKyAgICBpbnQgbW9kZSA9IDA7CisgICAgaW50IG1heCAgPSAyOworICAgICNpZmRlZiBLTVBfVERBVEFfR1RJRAorICAgICAgICBtYXggPSAzOworICAgICNlbmRpZiAvKiBLTVBfVERBVEFfR1RJRCAqLworICAgIF9fa21wX3N0Z19wYXJzZV9pbnQoIG5hbWUsIHZhbHVlLCAwLCBtYXgsICYgbW9kZSApOworICAgIC8vIFRPRE87IHBhcnNlX2ludCBpcyBub3QgdmVyeSBzdWl0YWJsZSBmb3IgdGhpcyBjYXNlLiBJbiBjYXNlIG9mIG92ZXJmbG93IGl0IGlzIGJldHRlciB0byB1c2UKKyAgICAvLyAwIHJhdGhlciB0aGF0IG1heCB2YWx1ZS4KKyAgICBpZiAoIG1vZGUgPT0gMCApIHsKKyAgICAgICAgX19rbXBfYWRqdXN0X2d0aWRfbW9kZSA9IFRSVUU7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBfX2ttcF9ndGlkX21vZGUgPSBtb2RlOworICAgICAgICBfX2ttcF9hZGp1c3RfZ3RpZF9tb2RlID0gRkFMU0U7CisgICAgfTsgLy8gaWYKK30gLy8gX19rbXBfc3RyX3BhcnNlX2d0aWRfbW9kZQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2d0aWRfbW9kZSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIGlmICggX19rbXBfYWRqdXN0X2d0aWRfbW9kZSApIHsKKyAgICAgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCAwICk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBfX2ttcF9zdGdfcHJpbnRfaW50KCBidWZmZXIsIG5hbWUsIF9fa21wX2d0aWRfbW9kZSApOworICAgIH0KK30gLy8gX19rbXBfc3RnX3ByaW50X2d0aWRfbW9kZQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9OVU1fTE9DS1NfSU5fQkxPQ0sKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9sb2NrX2Jsb2NrKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2VfaW50KCBuYW1lLCB2YWx1ZSwgMCwgS01QX0lOVF9NQVgsICYgX19rbXBfbnVtX2xvY2tzX2luX2Jsb2NrICk7Cit9IC8vIF9fa21wX3N0cl9wYXJzZV9sb2NrX2Jsb2NrCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfbG9ja19ibG9jaygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwgX19rbXBfbnVtX2xvY2tzX2luX2Jsb2NrICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9sb2NrX2Jsb2NrCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9MT0NLX0tJTkQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisjIGRlZmluZSBLTVBfU1RPUkVfTE9DS19TRVEoYSkgKF9fa21wX3VzZXJfbG9ja19zZXEgPSBsb2Nrc2VxXyMjYSkKKyNlbHNlCisjIGRlZmluZSBLTVBfU1RPUkVfTE9DS19TRVEoYSkKKyNlbmRpZgorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2xvY2tfa2luZCggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgaWYgKCBfX2ttcF9pbml0X3VzZXJfbG9ja3MgKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBFbnZMb2NrV2FybiwgbmFtZSApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJ0YXMiLCAyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJ0ZXN0IGFuZCBzZXQiLCAyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJ0ZXN0X2FuZF9zZXQiLCAyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJ0ZXN0LWFuZC1zZXQiLCAyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJ0ZXN0IGFuZHNldCIsIDIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggInRlc3RfYW5kc2V0IiwgMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAidGVzdC1hbmRzZXQiLCAyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJ0ZXN0YW5kIHNldCIsIDIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggInRlc3RhbmRfc2V0IiwgMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAidGVzdGFuZC1zZXQiLCAyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJ0ZXN0YW5kc2V0IiwgMiwgdmFsdWUgKSApIHsKKyAgICAgICAgX19rbXBfdXNlcl9sb2NrX2tpbmQgPSBsa190YXM7CisgICAgICAgIEtNUF9TVE9SRV9MT0NLX1NFUSh0YXMpOworICAgIH0KKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNKQorICAgIGVsc2UgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJmdXRleCIsIDEsIHZhbHVlICkgKSB7CisgICAgICAgIGlmICggX19rbXBfZnV0ZXhfZGV0ZXJtaW5lX2NhcGFibGUoKSApIHsKKyAgICAgICAgICAgIF9fa21wX3VzZXJfbG9ja19raW5kID0gbGtfZnV0ZXg7CisgICAgICAgICAgICBLTVBfU1RPUkVfTE9DS19TRVEoZnV0ZXgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIEZ1dGV4Tm90U3VwcG9ydGVkLCBuYW1lLCB2YWx1ZSApOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisgICAgZWxzZSBpZiAoIF9fa21wX3N0cl9tYXRjaCggInRpY2tldCIsIDIsIHZhbHVlICkgKSB7CisgICAgICAgIF9fa21wX3VzZXJfbG9ja19raW5kID0gbGtfdGlja2V0OworICAgICAgICBLTVBfU1RPUkVfTE9DS19TRVEodGlja2V0KTsKKyAgICB9CisgICAgZWxzZSBpZiAoIF9fa21wX3N0cl9tYXRjaCggInF1ZXVpbmciLCAxLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJxdWV1ZSIsIDEsIHZhbHVlICkgKSB7CisgICAgICAgIF9fa21wX3VzZXJfbG9ja19raW5kID0gbGtfcXVldWluZzsKKyAgICAgICAgS01QX1NUT1JFX0xPQ0tfU0VRKHF1ZXVpbmcpOworICAgIH0KKyAgICBlbHNlIGlmICggX19rbXBfc3RyX21hdGNoKCAiZHJkcGEgdGlja2V0IiwgMSwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiZHJkcGFfdGlja2V0IiwgMSwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiZHJkcGEtdGlja2V0IiwgMSwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiZHJkcGF0aWNrZXQiLCAxLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJkcmRwYSIsIDEsIHZhbHVlICkgKSB7CisgICAgICAgIF9fa21wX3VzZXJfbG9ja19raW5kID0gbGtfZHJkcGE7CisgICAgICAgIEtNUF9TVE9SRV9MT0NLX1NFUShkcmRwYSk7CisgICAgfQorI2lmIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKyAgICBlbHNlIGlmICggX19rbXBfc3RyX21hdGNoKCAiYWRhcHRpdmUiLCAxLCB2YWx1ZSApICApIHsKKyAgICAgICAgaWYoIF9fa21wX2NwdWluZm8ucnRtICkgeyAvLyA/Pz8gSXMgY3B1aW5mbyBhdmFpbGFibGUgaGVyZT8KKyAgICAgICAgICAgIF9fa21wX3VzZXJfbG9ja19raW5kID0gbGtfYWRhcHRpdmU7CisgICAgICAgICAgICBLTVBfU1RPUkVfTE9DS19TRVEoYWRhcHRpdmUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFkYXB0aXZlTm90U3VwcG9ydGVkLCBuYW1lLCB2YWx1ZSApOworICAgICAgICAgICAgX19rbXBfdXNlcl9sb2NrX2tpbmQgPSBsa19xdWV1aW5nOworICAgICAgICAgICAgS01QX1NUT1JFX0xPQ0tfU0VRKHF1ZXVpbmcpOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8vIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSyAmJiBLTVBfVVNFX1RTWAorICAgIGVsc2UgaWYgKCBfX2ttcF9zdHJfbWF0Y2goInJ0bSIsIDEsIHZhbHVlKSApIHsKKyAgICAgICAgaWYgKCBfX2ttcF9jcHVpbmZvLnJ0bSApIHsKKyAgICAgICAgICAgIF9fa21wX3VzZXJfbG9ja19raW5kID0gbGtfcnRtOworICAgICAgICAgICAgS01QX1NUT1JFX0xPQ0tfU0VRKHJ0bSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggQWRhcHRpdmVOb3RTdXBwb3J0ZWQsIG5hbWUsIHZhbHVlICk7CisgICAgICAgICAgICBfX2ttcF91c2VyX2xvY2tfa2luZCA9IGxrX3F1ZXVpbmc7CisgICAgICAgICAgICBLTVBfU1RPUkVfTE9DS19TRVEocXVldWluZyk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIF9fa21wX3N0cl9tYXRjaCgiaGxlIiwgMSwgdmFsdWUpICkgeworICAgICAgICBfX2ttcF91c2VyX2xvY2tfa2luZCA9IGxrX2hsZTsKKyAgICAgICAgS01QX1NUT1JFX0xPQ0tfU0VRKGhsZSk7CisgICAgfQorI2VuZGlmCisgICAgZWxzZSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBTdGdJbnZhbGlkVmFsdWUsIG5hbWUsIHZhbHVlICk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2xvY2tfa2luZCgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIGNvbnN0IGNoYXIgKnZhbHVlID0gTlVMTDsKKworICAgIHN3aXRjaCAoIF9fa21wX3VzZXJfbG9ja19raW5kICkgeworICAgICAgICBjYXNlIGxrX2RlZmF1bHQ6CisgICAgICAgIHZhbHVlID0gImRlZmF1bHQiOworICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGxrX3RhczoKKyAgICAgICAgdmFsdWUgPSAidGFzIjsKKyAgICAgICAgYnJlYWs7CisKKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQpCisgICAgICAgIGNhc2UgbGtfZnV0ZXg6CisgICAgICAgIHZhbHVlID0gImZ1dGV4IjsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLICYmIEtNUF9VU0VfVFNYCisgICAgICAgIGNhc2UgbGtfcnRtOgorICAgICAgICB2YWx1ZSA9ICJydG0iOworICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGxrX2hsZToKKyAgICAgICAgdmFsdWUgPSAiaGxlIjsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKworICAgICAgICBjYXNlIGxrX3RpY2tldDoKKyAgICAgICAgdmFsdWUgPSAidGlja2V0IjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBsa19xdWV1aW5nOgorICAgICAgICB2YWx1ZSA9ICJxdWV1aW5nIjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBsa19kcmRwYToKKyAgICAgICAgdmFsdWUgPSAiZHJkcGEiOworICAgICAgICBicmVhazsKKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisgICAgICAgIGNhc2UgbGtfYWRhcHRpdmU6CisgICAgICAgIHZhbHVlID0gImFkYXB0aXZlIjsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICB9CisKKyAgICBpZiAoIHZhbHVlICE9IE5VTEwgKSB7CisgICAgICAgIF9fa21wX3N0Z19wcmludF9zdHIoIGJ1ZmZlciwgbmFtZSwgdmFsdWUgKTsKKyAgICB9Cit9CisKKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9BREFQVElWRV9MT0NLX1BST1BTLCBLTVBfU1BFQ1VMQVRJVkVfU1RBVFNGSUxFCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFBhcnNlIG91dCB2YWx1ZXMgZm9yIHRoZSB0dW5hYmxlIHBhcmFtZXRlcnMgZnJvbSBhIHN0cmluZyBvZiB0aGUgZm9ybQorLy8gS01QX0FEQVBUSVZFX0xPQ0tfUFJPUFM9bWF4X3NvZnRfcmV0cmllc1ssbWF4X2JhZG5lc3NdCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2FkYXB0aXZlX2xvY2tfcHJvcHMoIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlLCB2b2lkICpkYXRhICkKK3sKKyAgICBpbnQgbWF4X3JldHJpZXMgPSAwOworICAgIGludCBtYXhfYmFkbmVzcyA9IDA7CisKKyAgICBjb25zdCBjaGFyICpuZXh0ID0gdmFsdWU7CisKKyAgICBpbnQgdG90YWwgPSAwOyAgICAgICAgICAvLyBDb3VudCBlbGVtZW50cyB0aGF0IHdlcmUgc2V0LiBJdCdsbCBiZSB1c2VkIGFzIGFuIGFycmF5IHNpemUKKyAgICBpbnQgcHJldl9jb21tYSA9IEZBTFNFOyAvLyBGb3IgY29ycmVjdCBwcm9jZXNzaW5nIHNlcXVlbnRpYWwgY29tbWFzCisgICAgaW50IGk7CisKKyAgICAvLyBTYXZlIHZhbHVlcyBpbiB0aGUgc3RydWN0dXJlIF9fa21wX3NwZWN1bGF0aXZlX2JhY2tvZmZfcGFyYW1zCisgICAgLy8gUnVuIG9ubHkgMyBpdGVyYXRpb25zIGJlY2F1c2UgaXQgaXMgZW5vdWdoIHRvIHJlYWQgdHdvIHZhbHVlcyBvciBmaW5kIGEgc3ludGF4IGVycm9yCisgICAgZm9yICggaSA9IDA7IGkgPCAzIDsgaSsrKSB7CisgICAgICAgIFNLSVBfV1MoIG5leHQgKTsKKworICAgICAgICBpZiAoICpuZXh0ID09ICdcMCcgKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvLyBOZXh0IGNoYXJhY3RlciBpcyBub3QgYW4gaW50ZWdlciBvciBub3QgYSBjb21tYSBPUiBudW1iZXIgb2YgdmFsdWVzID4gMiA9PiBlbmQgb2YgbGlzdAorICAgICAgICBpZiAoICggKCAqbmV4dCA8ICcwJyB8fCAqbmV4dCA+ICc5JyApICYmICpuZXh0ICE9JywnICkgfHwgdG90YWwgPiAyICkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIEVudlN5bnRheEVycm9yLCBuYW1lLCB2YWx1ZSApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIFRoZSBuZXh0IGNoYXJhY3RlciBpcyAnLCcKKyAgICAgICAgaWYgKCAqbmV4dCA9PSAnLCcgKSB7CisgICAgICAgICAgICAvLyAnLCcgaXMgdGhlIGZpc3J0IGNoYXJhY3RlcgorICAgICAgICAgICAgaWYgKCB0b3RhbCA9PSAwIHx8IHByZXZfY29tbWEgKSB7CisgICAgICAgICAgICAgICAgdG90YWwrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByZXZfY29tbWEgPSBUUlVFOworICAgICAgICAgICAgbmV4dCsrOyAvL3NraXAgJywnCisgICAgICAgICAgICBTS0lQX1dTKCBuZXh0ICk7CisgICAgICAgIH0KKyAgICAgICAgLy8gTmV4dCBjaGFyYWN0ZXIgaXMgYSBkaWdpdAorICAgICAgICBpZiAoICpuZXh0ID49ICcwJyAmJiAqbmV4dCA8PSAnOScgKSB7CisgICAgICAgICAgICBpbnQgbnVtOworICAgICAgICAgICAgY29uc3QgY2hhciAqYnVmID0gbmV4dDsKKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiBtc2cgID0gTlVMTDsKKyAgICAgICAgICAgIHByZXZfY29tbWEgPSBGQUxTRTsKKyAgICAgICAgICAgIFNLSVBfRElHSVRTKCBuZXh0ICk7CisgICAgICAgICAgICB0b3RhbCsrOworCisgICAgICAgICAgICBjb25zdCBjaGFyICp0bXAgPSBuZXh0OworICAgICAgICAgICAgU0tJUF9XUyggdG1wICk7CisgICAgICAgICAgICBpZiAoICggKm5leHQgPT0gJyAnIHx8ICpuZXh0ID09ICdcdCcgKSAmJiAoICp0bXAgPj0gJzAnICYmICp0bXAgPD0gJzknICkgKSB7CisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEVudlNwYWNlc05vdEFsbG93ZWQsIG5hbWUsIHZhbHVlICk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBudW0gPSBfX2ttcF9zdHJfdG9faW50KCBidWYsICpuZXh0ICk7CisgICAgICAgICAgICBpZiAoIG51bSA8IDAgKSB7IC8vIFRoZSBudW1iZXIgb2YgcmV0cmllcyBzaG91bGQgYmUgPj0gMAorICAgICAgICAgICAgICAgIG1zZyA9IEtNUF9JMThOX1NUUiggVmFsdWVUb29TbWFsbCApOworICAgICAgICAgICAgICAgIG51bSA9IDE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCBudW0gPiBLTVBfSU5UX01BWCApIHsKKyAgICAgICAgICAgICAgICBtc2cgPSBLTVBfSTE4Tl9TVFIoIFZhbHVlVG9vTGFyZ2UgKTsKKyAgICAgICAgICAgICAgICBudW0gPSBLTVBfSU5UX01BWDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggbXNnICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgLy8gTWVzc2FnZSBpcyBub3QgZW1wdHkuIFByaW50IHdhcm5pbmcuCisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIFBhcnNlU2l6ZUludFdhcm4sIG5hbWUsIHZhbHVlLCBtc2cgKTsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKCBVc2luZ19pbnRfVmFsdWUsIG5hbWUsIG51bSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIHRvdGFsID09IDEgKSB7CisgICAgICAgICAgICAgICAgbWF4X3JldHJpZXMgPSBudW07CisgICAgICAgICAgICB9IGVsc2UgaWYoIHRvdGFsID09IDIgKSB7CisgICAgICAgICAgICAgICAgbWF4X2JhZG5lc3MgPSBudW07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgS01QX0RFQlVHX0FTU0VSVCggdG90YWwgPiAwICk7CisgICAgaWYoIHRvdGFsIDw9IDAgKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBFbnZTeW50YXhFcnJvciwgbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBfX2ttcF9hZGFwdGl2ZV9iYWNrb2ZmX3BhcmFtcy5tYXhfc29mdF9yZXRyaWVzID0gbWF4X3JldHJpZXM7CisgICAgX19rbXBfYWRhcHRpdmVfYmFja29mZl9wYXJhbXMubWF4X2JhZG5lc3MgPSBtYXhfYmFkbmVzczsKK30KKworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2FkYXB0aXZlX2xvY2tfcHJvcHMoa21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkKK3sKKyAgICBpZiggX19rbXBfZW52X2Zvcm1hdCApIHsKKyAgICAgICAgS01QX1NUUl9CVUZfUFJJTlRfTkFNRV9FWChuYW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICAlcz0nIiwgbmFtZSApOworICAgIH0KKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlZCwlZCdcbiIsIF9fa21wX2FkYXB0aXZlX2JhY2tvZmZfcGFyYW1zLm1heF9zb2Z0X3JldHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWRhcHRpdmVfYmFja29mZl9wYXJhbXMubWF4X2JhZG5lc3MgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2FkYXB0aXZlX2xvY2tfcHJvcHMKKworI2lmIEtNUF9ERUJVR19BREFQVElWRV9MT0NLUworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3NwZWN1bGF0aXZlX3N0YXRzZmlsZSggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2ZpbGUoIG5hbWUsIHZhbHVlLCAiIiwgJiBfX2ttcF9zcGVjdWxhdGl2ZV9zdGF0c2ZpbGUgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX3NwZWN1bGF0aXZlX3N0YXRzZmlsZQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X3NwZWN1bGF0aXZlX3N0YXRzZmlsZSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIGlmICggX19rbXBfc3RyX21hdGNoKCAiLSIsIDAsIF9fa21wX3NwZWN1bGF0aXZlX3N0YXRzZmlsZSApICApIHsKKyAgICAgICAgX19rbXBfc3RnX3ByaW50X3N0ciggYnVmZmVyLCBuYW1lLCAic3Rkb3V0IiApOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0Z19wcmludF9zdHIoIGJ1ZmZlciwgbmFtZSwgX19rbXBfc3BlY3VsYXRpdmVfc3RhdHNmaWxlICk7CisgICAgfQorCit9IC8vIF9fa21wX3N0Z19wcmludF9zcGVjdWxhdGl2ZV9zdGF0c2ZpbGUKKworI2VuZGlmIC8vIEtNUF9ERUJVR19BREFQVElWRV9MT0NLUworCisjZW5kaWYgLy8gS01QX1VTRV9BREFQVElWRV9MT0NLUworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfUExBQ0VfVEhSRUFEUworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3BsYWNlX3RocmVhZHMoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIC8vIFZhbHVlIGV4YW1wbGU6IDVDeDJUeDE1TworICAgIC8vIFdoaWNoIG1lYW5zICJ1c2UgNSBjb3JlcyB3aXRoIG9mZnNldCAxNSwgMiB0aHJlYWRzIHBlciBjb3JlIgorICAgIC8vIEFDOiBleHRlbmRlZCB0byBzb2NrZXRzIGxldmVsLCBleGFtcGxlcyBvZgorICAgIC8vICAgICAidXNlIDIgc29ja2V0cyB3aXRoIG9mZnNldCA2LCAyIGNvcmVzIHdpdGggb2Zmc2V0IDIgcGVyIHNvY2tldCwgMiB0aHJlYWRzIHBlciBjb3JlIjoKKyAgICAvLyAgICAgMnMsNm8sMmMsMm8sMnQ7IDJzLDZvLDJjLDJ0LDJvOyAyc0A2LDJjQDIsMnQKKyAgICAvLyAgICAgVG8gbm90IGJyZWFrIGxlZ2FjeSBjb2RlIGNvcmUtb2Zmc2V0IGNhbiBiZSBsYXN0OworICAgIC8vICAgICBwb3N0Zml4ICJvIiBvciBwcmVmaXggQCBjYW4gYmUgb2Zmc2V0IGRlc2lnbmF0b3IuCisgICAgLy8gTm90ZTogbm90IGFsbCBzeW50YXggZXJyb3JzIGFyZSBhbmFseXplZCwgc29tZSBtYXkgYmUgc2tpcHBlZC4KKyNkZWZpbmUgQ0hFQ0tfREVMSU0oX3gpICAgKCooX3gpID09ICcsJyB8fCAqKF94KSA9PSAneCcpCisgICAgaW50ICAgICAgICAgbnVtOworICAgIGludCBzaW5nbGVfd2FybmluZyA9IDA7CisgICAgaW50IGZsYWdTID0gMCwgZmxhZ0MgPSAwLCBmbGFnVCA9IDAsIGZsYWdTTyA9IDAsIGZsYWdDTyA9IDA7CisgICAgY29uc3QgY2hhciAqbmV4dCA9IHZhbHVlOworICAgIGNvbnN0IGNoYXIgKnByZXY7CisKKyAgICBTS0lQX1dTKG5leHQpOyAgLy8gc2tpcCB3aGl0ZSBzcGFjZXMKKyAgICBpZiAoKm5leHQgPT0gJ1wwJykKKyAgICAgICAgcmV0dXJuOyAgIC8vIG5vIGRhdGEgcHJvdmlkZWQsIHJldGFpbiBkZWZhdWx0IHZhbHVlcworICAgIC8vIEdldCBudW1fc29ja2V0cyBmaXJzdCAob3Igd2hhdGV2ZXIgc3BlY2lmaWVkKQorICAgIGlmICgqbmV4dCA+PSAnMCcgJiYgKm5leHQgPD0gJzknKSB7CisgICAgICAgIHByZXYgPSBuZXh0OworICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgbnVtID0gX19rbXBfc3RyX3RvX2ludChwcmV2LCAqbmV4dCk7CisgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgIGlmICgqbmV4dCA9PSAncycgfHwgKm5leHQgPT0gJ1MnKSB7ICAvLyBlLmcuICIycyIKKyAgICAgICAgICAgIF9fa21wX3BsYWNlX251bV9zb2NrZXRzID0gbnVtOworICAgICAgICAgICAgZmxhZ1MgPSAxOyAvLyBnb3QgbnVtIHNvY2tldHMKKyAgICAgICAgICAgIG5leHQrKzsKKyAgICAgICAgICAgIGlmICgqbmV4dCA9PSAnQCcpIHsgLy8gc29ja2V0IG9mZnNldCwgZS5nLiAiMnNANCIKKyAgICAgICAgICAgICAgICBmbGFnU08gPSAxOworICAgICAgICAgICAgICAgIHByZXYgPSArK25leHQ7ICAvLyBkb24ndCBhbGxvdyBzcGFjZXMgZm9yIHNpbXBsaWNpdHkKKyAgICAgICAgICAgICAgICBpZiAoISgqbmV4dCA+PSAnMCcgJiYgKm5leHQgPD0gJzknKSkgeworICAgICAgICAgICAgICAgICAgICBLTVBfV0FSTklORyhBZmZUaHJQbGFjZUludmFsaWQsIG5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgICAgICAgICBudW0gPSBfX2ttcF9zdHJfdG9faW50KHByZXYsICpuZXh0KTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wbGFjZV9zb2NrZXRfb2Zmc2V0ID0gbnVtOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCpuZXh0ID09ICdjJyB8fCAqbmV4dCA9PSAnQycpIHsKKyAgICAgICAgICAgIF9fa21wX3BsYWNlX251bV9jb3JlcyA9IG51bTsKKyAgICAgICAgICAgIGZsYWdTID0gZmxhZ0MgPSAxOyAvLyBzb2NrZXRzIHdlcmUgbm90IHNwZWNpZmllZCAtIHVzZSBkZWZhdWx0CisgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgICAgICBpZiAoKm5leHQgPT0gJ0AnKSB7IC8vIGNvcmUgb2Zmc2V0LCBlLmcuICIyY0A2IgorICAgICAgICAgICAgICAgIGZsYWdDTyA9IDE7CisgICAgICAgICAgICAgICAgcHJldiA9ICsrbmV4dDsgIC8vIGRvbid0IGFsbG93IHNwYWNlcyBmb3Igc2ltcGxpY2l0eQorICAgICAgICAgICAgICAgIGlmICghKCpuZXh0ID49ICcwJyAmJiAqbmV4dCA8PSAnOScpKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKEFmZlRoclBsYWNlSW52YWxpZCwgbmFtZSwgdmFsdWUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICAgICAgICAgIG51bSA9IF9fa21wX3N0cl90b19pbnQocHJldiwgKm5leHQpOworICAgICAgICAgICAgICAgIF9fa21wX3BsYWNlX2NvcmVfb2Zmc2V0ID0gbnVtOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKENIRUNLX0RFTElNKG5leHQpKSB7CisgICAgICAgICAgICBfX2ttcF9wbGFjZV9udW1fY29yZXMgPSBudW07IC8vIG5vIGxldHRlci1kZXNpZ25hdG9yIC0gbnVtIGNvcmVzCisgICAgICAgICAgICBmbGFnUyA9IGZsYWdDID0gMTsgLy8gc29ja2V0cyB3ZXJlIG5vdCBzcGVjaWZpZWQgLSB1c2UgZGVmYXVsdAorICAgICAgICAgICAgbmV4dCsrOworICAgICAgICB9IGVsc2UgaWYgKCpuZXh0ID09ICd0JyB8fCAqbmV4dCA9PSAnVCcpIHsKKyAgICAgICAgICAgIF9fa21wX3BsYWNlX251bV90aHJlYWRzX3Blcl9jb3JlID0gbnVtOworICAgICAgICAgICAgLy8gc29ja2V0cywgY29yZXMgd2VyZSBub3Qgc3BlY2lmaWVkIC0gdXNlIGRlZmF1bHQKKyAgICAgICAgICAgIHJldHVybjsgICAvLyB3ZSBpZ25vcmUgb2Zmc2V0IHZhbHVlIGluIGNhc2UgYWxsIGNvcmVzIGFyZSB1c2VkCisgICAgICAgIH0gZWxzZSBpZiAoKm5leHQgPT0gJ1wwJykgeworICAgICAgICAgICAgX19rbXBfcGxhY2VfbnVtX2NvcmVzID0gbnVtOworICAgICAgICAgICAgcmV0dXJuOyAgIC8vIHRoZSBvbmx5IHZhbHVlIHByb3ZpZGVkIC0gc2V0IG51bSBjb3JlcworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmVGhyUGxhY2VJbnZhbGlkLCBuYW1lLCB2YWx1ZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBLTVBfV0FSTklORyhBZmZUaHJQbGFjZUludmFsaWQsIG5hbWUsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKGZsYWdTKTsgLy8gbnVtIHNvY2tldHMgc2hvdWxkIGFscmVhZHkgYmUgc2V0IGhlcmUKKyAgICBTS0lQX1dTKG5leHQpOworICAgIGlmICgqbmV4dCA9PSAnXDAnKQorICAgICAgICByZXR1cm47ICAgLy8gIiBuICAiIC0gc29tZXRoaW5nIGxpa2UgdGhpcworICAgIGlmIChDSEVDS19ERUxJTShuZXh0KSkgeworICAgICAgICBuZXh0Kys7ICAgLy8gc2tpcCBkZWxpbWl0ZXIKKyAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICB9CisKKyAgICAvLyBHZXQgc2Vjb25kIHZhbHVlIChjb3VsZCBiZSBvZmZzZXQsIG51bV9jb3JlcywgbnVtX3RocmVhZHMpCisgICAgaWYgKCpuZXh0ID49ICcwJyAmJiAqbmV4dCA8PSAnOScpIHsKKyAgICAgICAgcHJldiA9IG5leHQ7CisgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICBudW0gPSBfX2ttcF9zdHJfdG9faW50KHByZXYsICpuZXh0KTsKKyAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgaWYgKCpuZXh0ID09ICdjJyB8fCAqbmV4dCA9PSAnQycpIHsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoZmxhZ0MgPT0gMCk7CisgICAgICAgICAgICBfX2ttcF9wbGFjZV9udW1fY29yZXMgPSBudW07CisgICAgICAgICAgICBmbGFnQyA9IDE7CisgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgICAgICBpZiAoKm5leHQgPT0gJ0AnKSB7IC8vIGNvcmUgb2Zmc2V0LCBlLmcuICIyY0A2IgorICAgICAgICAgICAgICAgIGZsYWdDTyA9IDE7CisgICAgICAgICAgICAgICAgcHJldiA9ICsrbmV4dDsgIC8vIGRvbid0IGFsbG93IHNwYWNlcyBmb3Igc2ltcGxpY2l0eQorICAgICAgICAgICAgICAgIGlmICghKCpuZXh0ID49ICcwJyAmJiAqbmV4dCA8PSAnOScpKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKEFmZlRoclBsYWNlSW52YWxpZCwgbmFtZSwgdmFsdWUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICAgICAgICAgIG51bSA9IF9fa21wX3N0cl90b19pbnQocHJldiwgKm5leHQpOworICAgICAgICAgICAgICAgIF9fa21wX3BsYWNlX2NvcmVfb2Zmc2V0ID0gbnVtOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCpuZXh0ID09ICdvJyB8fCAqbmV4dCA9PSAnTycpIHsgLy8gb2Zmc2V0IHNwZWNpZmllZAorICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmVGhyUGxhY2VEZXByZWNhdGVkKTsKKyAgICAgICAgICAgIHNpbmdsZV93YXJuaW5nID0gMTsKKyAgICAgICAgICAgIGlmIChmbGFnQykgeyAvLyB3aGV0aGVyIG51bV9jb3JlcyBhbHJlYWR5IHNwZWNpZmllZCAoc29ja2V0cyBza2lwcGVkKQorICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIWZsYWdDTyk7IC8vIGVpdGhlciAibyIgb3IgQCwgbm90IGJvdGgKKyAgICAgICAgICAgICAgICBfX2ttcF9wbGFjZV9jb3JlX29mZnNldCA9IG51bTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCghZmxhZ1NPKTsgLy8gZWl0aGVyICJvIiBvciBALCBub3QgYm90aAorICAgICAgICAgICAgICAgIF9fa21wX3BsYWNlX3NvY2tldF9vZmZzZXQgPSBudW07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgIH0gZWxzZSBpZiAoKm5leHQgPT0gJ3QnIHx8ICpuZXh0ID09ICdUJykgeworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChmbGFnVCA9PSAwKTsKKyAgICAgICAgICAgIF9fa21wX3BsYWNlX251bV90aHJlYWRzX3Blcl9jb3JlID0gbnVtOworICAgICAgICAgICAgZmxhZ0MgPSAxOyAvLyBudW1fY29yZXMgY291bGQgYmUgc2tpcHBlZCA/CisgICAgICAgICAgICBmbGFnVCA9IDE7CisgICAgICAgICAgICBuZXh0Kys7IC8vIGNhbiBoYXZlIGNvcmUtb2Zmc2V0IHNwZWNpZmllZCBhZnRlciBudW0gdGhyZWFkcworICAgICAgICB9IGVsc2UgaWYgKCpuZXh0ID09ICdcMCcpIHsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoZmxhZ0MpOyAvLyA0eDIgbWVhbnMgNCBjb3JlcyAyIHRocmVhZHMgcGVyIGNvcmUKKyAgICAgICAgICAgIF9fa21wX3BsYWNlX251bV90aHJlYWRzX3Blcl9jb3JlID0gbnVtOworICAgICAgICAgICAgcmV0dXJuOyAgIC8vIHR3byB2YWx1ZXMgcHJvdmlkZWQgd2l0aG91dCBsZXR0ZXItZGVzaWduYXRvcgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmVGhyUGxhY2VJbnZhbGlkLCBuYW1lLCB2YWx1ZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBLTVBfV0FSTklORyhBZmZUaHJQbGFjZUludmFsaWQsIG5hbWUsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBTS0lQX1dTKG5leHQpOworICAgIGlmICgqbmV4dCA9PSAnXDAnKQorICAgICAgICByZXR1cm47ICAgLy8gIiBOcyxOYyAgIiAtIHNvbWV0aGluZyBsaWtlIHRoaXMKKyAgICBpZiAoQ0hFQ0tfREVMSU0obmV4dCkpIHsKKyAgICAgICAgbmV4dCsrOyAgIC8vIHNraXAgZGVsaW1pdGVyCisgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgfQorCisgICAgLy8gR2V0IHRoaXJkIHZhbHVlIChjb3VsZCBiZSBjb3JlLW9mZnNldCwgbnVtX2NvcmVzLCBudW1fdGhyZWFkcykKKyAgICBpZiAoKm5leHQgPj0gJzAnICYmICpuZXh0IDw9ICc5JykgeworICAgICAgICBwcmV2ID0gbmV4dDsKKyAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgIG51bSA9IF9fa21wX3N0cl90b19pbnQocHJldiwgKm5leHQpOworICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICBpZiAoKm5leHQgPT0gJ3QnIHx8ICpuZXh0ID09ICdUJykgeworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChmbGFnVCA9PSAwKTsKKyAgICAgICAgICAgIF9fa21wX3BsYWNlX251bV90aHJlYWRzX3Blcl9jb3JlID0gbnVtOworICAgICAgICAgICAgaWYgKGZsYWdDID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBudW1fY29yZXMgY291bGQgYmUgc2tpcHBlZCAoZS5nLiAycyw0bywydCkKKyAgICAgICAgICAgIGZsYWdUID0gMTsKKyAgICAgICAgICAgIG5leHQrKzsgLy8gY2FuIGhhdmUgY29yZS1vZmZzZXQgc3BlY2lmaWVkIGxhdGVyIChlLmcuIDJzLDFjLDJ0LDNvKQorICAgICAgICB9IGVsc2UgaWYgKCpuZXh0ID09ICdjJyB8fCAqbmV4dCA9PSAnQycpIHsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoZmxhZ0MgPT0gMCk7CisgICAgICAgICAgICBfX2ttcF9wbGFjZV9udW1fY29yZXMgPSBudW07CisgICAgICAgICAgICBmbGFnQyA9IDE7CisgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgICAgICAvL0tNUF9ERUJVR19BU1NFUlQoKm5leHQgIT0gJ0AnKTsgLy8gc29ja2V0IG9mZnNldCB1c2VkICJvIiBkZXNpZ25hdG9yCisgICAgICAgIH0gZWxzZSBpZiAoKm5leHQgPT0gJ28nIHx8ICpuZXh0ID09ICdPJykgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmVGhyUGxhY2VEZXByZWNhdGVkKTsKKyAgICAgICAgICAgIHNpbmdsZV93YXJuaW5nID0gMTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoZmxhZ0MpOworICAgICAgICAgICAgLy9LTVBfREVCVUdfQVNTRVJUKCFmbGFnU08pOyAvLyBzb2NrZXQgb2Zmc2V0IGNvdWxkbid0IHVzZSBAIGRlc2lnbmF0b3IKKyAgICAgICAgICAgIF9fa21wX3BsYWNlX2NvcmVfb2Zmc2V0ID0gbnVtOworICAgICAgICAgICAgbmV4dCsrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmVGhyUGxhY2VJbnZhbGlkLCBuYW1lLCB2YWx1ZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBLTVBfV0FSTklORyhBZmZUaHJQbGFjZUludmFsaWQsIG5hbWUsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKGZsYWdDKTsKKyAgICBTS0lQX1dTKG5leHQpOworICAgIGlmICggKm5leHQgPT0gJ1wwJyApCisgICAgICAgICAgICByZXR1cm47CisgICAgaWYgKENIRUNLX0RFTElNKG5leHQpKSB7CisgICAgICAgIG5leHQrKzsgICAvLyBza2lwIGRlbGltaXRlcgorICAgICAgICBTS0lQX1dTKG5leHQpOworICAgIH0KKworICAgIC8vIEdldCA0LXRoIHZhbHVlIChjb3VsZCBiZSBjb3JlLW9mZnNldCwgbnVtX3RocmVhZHMpCisgICAgaWYgKCpuZXh0ID49ICcwJyAmJiAqbmV4dCA8PSAnOScpIHsKKyAgICAgICAgcHJldiA9IG5leHQ7CisgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICBudW0gPSBfX2ttcF9zdHJfdG9faW50KHByZXYsICpuZXh0KTsKKyAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgaWYgKCpuZXh0ID09ICdvJyB8fCAqbmV4dCA9PSAnTycpIHsKKyAgICAgICAgICAgIGlmICghc2luZ2xlX3dhcm5pbmcpIHsgLy8gd2FybiBvbmNlCisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmVGhyUGxhY2VEZXByZWNhdGVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIWZsYWdTTyk7IC8vIHNvY2tldCBvZmZzZXQgY291bGRuJ3QgdXNlIEAgZGVzaWduYXRvcgorICAgICAgICAgICAgX19rbXBfcGxhY2VfY29yZV9vZmZzZXQgPSBudW07CisgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgIH0gZWxzZSBpZiAoKm5leHQgPT0gJ3QnIHx8ICpuZXh0ID09ICdUJykgeworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChmbGFnVCA9PSAwKTsKKyAgICAgICAgICAgIF9fa21wX3BsYWNlX251bV90aHJlYWRzX3Blcl9jb3JlID0gbnVtOworICAgICAgICAgICAgZmxhZ1QgPSAxOworICAgICAgICAgICAgbmV4dCsrOyAvLyBjYW4gaGF2ZSBjb3JlLW9mZnNldCBzcGVjaWZpZWQgYWZ0ZXIgbnVtIHRocmVhZHMKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKEFmZlRoclBsYWNlSW52YWxpZCwgbmFtZSwgdmFsdWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX1dBUk5JTkcoQWZmVGhyUGxhY2VJbnZhbGlkLCBuYW1lLCB2YWx1ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgU0tJUF9XUyhuZXh0KTsKKyAgICBpZiAoICpuZXh0ID09ICdcMCcgKQorICAgICAgICByZXR1cm47CisgICAgaWYgKENIRUNLX0RFTElNKG5leHQpKSB7CisgICAgICAgIG5leHQrKzsgICAvLyBza2lwIGRlbGltaXRlcgorICAgICAgICBTS0lQX1dTKG5leHQpOworICAgIH0KKworICAgIC8vIEdldCA1LXRoIHZhbHVlIChjb3VsZCBiZSBjb3JlLW9mZnNldCwgbnVtX3RocmVhZHMpCisgICAgaWYgKCpuZXh0ID49ICcwJyAmJiAqbmV4dCA8PSAnOScpIHsKKyAgICAgICAgcHJldiA9IG5leHQ7CisgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICBudW0gPSBfX2ttcF9zdHJfdG9faW50KHByZXYsICpuZXh0KTsKKyAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgaWYgKCpuZXh0ID09ICdvJyB8fCAqbmV4dCA9PSAnTycpIHsKKyAgICAgICAgICAgIGlmICghc2luZ2xlX3dhcm5pbmcpIHsgLy8gd2FybiBvbmNlCisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmVGhyUGxhY2VEZXByZWNhdGVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoZmxhZ1QpOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCghZmxhZ1NPKTsgLy8gc29ja2V0IG9mZnNldCBjb3VsZG4ndCB1c2UgQCBkZXNpZ25hdG9yCisgICAgICAgICAgICBfX2ttcF9wbGFjZV9jb3JlX29mZnNldCA9IG51bTsKKyAgICAgICAgfSBlbHNlIGlmICgqbmV4dCA9PSAndCcgfHwgKm5leHQgPT0gJ1QnKSB7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGZsYWdUID09IDApOworICAgICAgICAgICAgX19rbXBfcGxhY2VfbnVtX3RocmVhZHNfcGVyX2NvcmUgPSBudW07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyhBZmZUaHJQbGFjZUludmFsaWQsIG5hbWUsIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEtNUF9XQVJOSU5HKEFmZlRoclBsYWNlSW52YWxpZCwgbmFtZSwgdmFsdWUpOworICAgIH0KKyAgICByZXR1cm47CisjdW5kZWYgQ0hFQ0tfREVMSU0KK30KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9wbGFjZV90aHJlYWRzKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgaWYgKF9fa21wX3BsYWNlX251bV9zb2NrZXRzICsgX19rbXBfcGxhY2VfbnVtX2NvcmVzICsgX19rbXBfcGxhY2VfbnVtX3RocmVhZHNfcGVyX2NvcmUpIHsKKyAgICAgICAgaW50IGNvbW1hID0gMDsKKyAgICAgICAga21wX3N0cl9idWZfdCBidWY7CisgICAgICAgIF9fa21wX3N0cl9idWZfaW5pdCgmYnVmKTsKKyAgICAgICAgaWYoX19rbXBfZW52X2Zvcm1hdCkKKyAgICAgICAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX05BTUVfRVgobmFtZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoYnVmZmVyLCAiICAgJXM9JyIsIG5hbWUpOworICAgICAgICBpZiAoX19rbXBfcGxhY2VfbnVtX3NvY2tldHMpIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoJmJ1ZiwgIiVkcyIsIF9fa21wX3BsYWNlX251bV9zb2NrZXRzKTsKKyAgICAgICAgICAgIGlmIChfX2ttcF9wbGFjZV9zb2NrZXRfb2Zmc2V0KQorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoJmJ1ZiwgIkAlZCIsIF9fa21wX3BsYWNlX3NvY2tldF9vZmZzZXQpOworICAgICAgICAgICAgY29tbWEgPSAxOworICAgICAgICB9CisgICAgICAgIGlmIChfX2ttcF9wbGFjZV9udW1fY29yZXMpIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoJmJ1ZiwgIiVzJWRjIiwgY29tbWE/IiwiOiIiLCBfX2ttcF9wbGFjZV9udW1fY29yZXMpOworICAgICAgICAgICAgaWYgKF9fa21wX3BsYWNlX2NvcmVfb2Zmc2V0KQorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoJmJ1ZiwgIkAlZCIsIF9fa21wX3BsYWNlX2NvcmVfb2Zmc2V0KTsKKyAgICAgICAgICAgIGNvbW1hID0gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoX19rbXBfcGxhY2VfbnVtX3RocmVhZHNfcGVyX2NvcmUpCisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICIlcyVkdCIsIGNvbW1hPyIsIjoiIiwgX19rbXBfcGxhY2VfbnVtX3RocmVhZHNfcGVyX2NvcmUpOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KGJ1ZmZlciwgIiVzJ1xuIiwgYnVmLnN0ciApOworICAgICAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoJmJ1Zik7CisvKgorICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzOiAlcyBcbiIsIG5hbWUsIEtNUF9JMThOX1NUUiggTm90RGVmaW5lZCApICk7CisqLworICAgIH0KK30KKworI2lmIFVTRV9JVFRfQlVJTEQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9GT1JLSk9JTl9GUkFNRVMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9mb3Jram9pbl9mcmFtZXMoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9ib29sKCBuYW1lLCB2YWx1ZSwgJiBfX2ttcF9mb3Jram9pbl9mcmFtZXMgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2Zvcmtqb2luX2ZyYW1lcworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2Zvcmtqb2luX2ZyYW1lcygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9ib29sKCBidWZmZXIsIG5hbWUsIF9fa21wX2Zvcmtqb2luX2ZyYW1lcyApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfZm9ya2pvaW5fZnJhbWVzCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9GT1JLSk9JTl9GUkFNRVNfTU9ERQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2Zvcmtqb2luX2ZyYW1lc19tb2RlKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2VfaW50KCBuYW1lLCB2YWx1ZSwgMCwgMywgJiBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfZm9ya2pvaW5fZnJhbWVzCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfZm9ya2pvaW5fZnJhbWVzX21vZGUoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfaW50KCBidWZmZXIsIG5hbWUsIF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9mb3Jram9pbl9mcmFtZXMKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9NUF9ESVNQTEFZX0VOVgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgT01QXzQwX0VOQUJMRUQKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9vbXBfZGlzcGxheV9lbnYoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkKK3sKKyAgICBpZiAoIF9fa21wX3N0cl9tYXRjaCggIlZFUkJPU0UiLCAxLCB2YWx1ZSApICkKKyAgICB7CisgICAgICAgIF9fa21wX2Rpc3BsYXlfZW52X3ZlcmJvc2UgPSBUUlVFOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0Z19wYXJzZV9ib29sKCBuYW1lLCB2YWx1ZSwgJiBfX2ttcF9kaXNwbGF5X2VudiApOworICAgIH0KKworfSAvLyBfX2ttcF9zdGdfcGFyc2Vfb21wX2Rpc3BsYXlfZW52CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfb21wX2Rpc3BsYXlfZW52KCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKQoreworICAgIGlmICggX19rbXBfZGlzcGxheV9lbnZfdmVyYm9zZSApCisgICAgeworICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc3RyKCBidWZmZXIsIG5hbWUsICJWRVJCT1NFIiApOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0Z19wcmludF9ib29sKCBidWZmZXIsIG5hbWUsIF9fa21wX2Rpc3BsYXlfZW52ICk7CisgICAgfQorfSAvLyBfX2ttcF9zdGdfcHJpbnRfb21wX2Rpc3BsYXlfZW52CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2Vfb21wX2NhbmNlbGxhdGlvbiggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgaWYgKCBUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSApIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIEVudlBhcmFsbGVsV2FybiwgbmFtZSApOworICAgICAgICByZXR1cm47CisgICAgfSAgIC8vIHJlYWQgdmFsdWUgYmVmb3JlIGZpcnN0IHBhcmFsbGVsIG9ubHkKKyAgICBfX2ttcF9zdGdfcGFyc2VfYm9vbCggbmFtZSwgdmFsdWUsICYgX19rbXBfb21wX2NhbmNlbGxhdGlvbiApOworfSAvLyBfX2ttcF9zdGdfcGFyc2Vfb21wX2NhbmNlbGxhdGlvbgorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X29tcF9jYW5jZWxsYXRpb24oIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfYm9vbCggYnVmZmVyLCBuYW1lLCBfX2ttcF9vbXBfY2FuY2VsbGF0aW9uICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9vbXBfY2FuY2VsbGF0aW9uCisKKyNlbmRpZgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUYWJsZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitzdGF0aWMga21wX3NldHRpbmdfdCBfX2ttcF9zdGdfdGFibGVbXSA9IHsKKworICAgIHsgIktNUF9BTExfVEhSRUFEUyIsICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9hbGxfdGhyZWFkcywgICAgICAgIF9fa21wX3N0Z19wcmludF9hbGxfdGhyZWFkcywgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfQkxPQ0tUSU1FIiwgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfYmxvY2t0aW1lLCAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfYmxvY2t0aW1lLCAgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0RVUExJQ0FURV9MSUJfT0siLCAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2R1cGxpY2F0ZV9saWJfb2ssICAgX19rbXBfc3RnX3ByaW50X2R1cGxpY2F0ZV9saWJfb2ssICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9MSUJSQVJZIiwgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV93YWl0X3BvbGljeSwgICAgICAgIF9fa21wX3N0Z19wcmludF93YWl0X3BvbGljeSwgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfTUFYX1RIUkVBRFMiLCAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfYWxsX3RocmVhZHMsICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCAwIH0sIC8vIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CisgICAgeyAiS01QX01PTklUT1JfU1RBQ0tTSVpFIiwgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX21vbml0b3Jfc3RhY2tzaXplLCAgX19rbXBfc3RnX3ByaW50X21vbml0b3Jfc3RhY2tzaXplLCAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9TRVRUSU5HUyIsICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9zZXR0aW5ncywgICAgICAgICAgIF9fa21wX3N0Z19wcmludF9zZXR0aW5ncywgICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfU1RBQ0tPRkZTRVQiLCAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2Vfc3RhY2tvZmZzZXQsICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc3RhY2tvZmZzZXQsICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX1NUQUNLU0laRSIsICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3N0YWNrc2l6ZSwgICAgICAgICAgX19rbXBfc3RnX3ByaW50X3N0YWNrc2l6ZSwgICAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9TVEFDS1BBRCIsICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9zdGFja3BhZCwgICAgICAgICAgIF9fa21wX3N0Z19wcmludF9zdGFja3BhZCwgICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfVkVSU0lPTiIsICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfdmVyc2lvbiwgICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfdmVyc2lvbiwgICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX1dBUk5JTkdTIiwgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3dhcm5pbmdzLCAgICAgICAgICAgX19rbXBfc3RnX3ByaW50X3dhcm5pbmdzLCAgICAgICAgICAgTlVMTCwgMCwgMCB9LAorCisgICAgeyAiT01QX05FU1RFRCIsICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX25lc3RlZCwgICAgICAgICAgICAgX19rbXBfc3RnX3ByaW50X25lc3RlZCwgICAgICAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIk9NUF9OVU1fVEhSRUFEUyIsICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9udW1fdGhyZWFkcywgICAgICAgIF9fa21wX3N0Z19wcmludF9udW1fdGhyZWFkcywgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJPTVBfU1RBQ0tTSVpFIiwgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2Vfc3RhY2tzaXplLCAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc3RhY2tzaXplLCAgICAgICAgICBOVUxMLCAwLCAwIH0sCisKKyAgICB7ICJLTVBfVEFTS0lORyIsICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfdGFza2luZywgICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfdGFza2luZywgICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX1RBU0tfU1RFQUxJTkdfQ09OU1RSQUlOVCIsICAgICAgX19rbXBfc3RnX3BhcnNlX3Rhc2tfc3RlYWxpbmcsICAgICAgX19rbXBfc3RnX3ByaW50X3Rhc2tfc3RlYWxpbmcsICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIk9NUF9NQVhfQUNUSVZFX0xFVkVMUyIsICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9tYXhfYWN0aXZlX2xldmVscywgIF9fa21wX3N0Z19wcmludF9tYXhfYWN0aXZlX2xldmVscywgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJPTVBfVEhSRUFEX0xJTUlUIiwgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfYWxsX3RocmVhZHMsICAgICAgICBfX2ttcF9zdGdfcHJpbnRfYWxsX3RocmVhZHMsICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiT01QX1dBSVRfUE9MSUNZIiwgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3dhaXRfcG9saWN5LCAgICAgICAgX19rbXBfc3RnX3ByaW50X3dhaXRfcG9saWN5LCAgICAgICAgTlVMTCwgMCwgMCB9LAorI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCisgICAgeyAiS01QX0hPVF9URUFNU19NQVhfTEVWRUwiLCAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2hvdF90ZWFtc19sZXZlbCwgICAgX19rbXBfc3RnX3ByaW50X2hvdF90ZWFtc19sZXZlbCwgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9IT1RfVEVBTVNfTU9ERSIsICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9ob3RfdGVhbXNfbW9kZSwgICAgIF9fa21wX3N0Z19wcmludF9ob3RfdGVhbXNfbW9kZSwgICAgIE5VTEwsIDAsIDAgfSwKKyNlbmRpZiAvLyBLTVBfTkVTVEVEX0hPVF9URUFNUworCisjaWYgS01QX0hBTkRMRV9TSUdOQUxTCisgICAgeyAiS01QX0hBTkRMRV9TSUdOQUxTIiwgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2hhbmRsZV9zaWduYWxzLCAgICAgX19rbXBfc3RnX3ByaW50X2hhbmRsZV9zaWduYWxzLCAgICAgTlVMTCwgMCwgMCB9LAorI2VuZGlmCisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisgICAgeyAiS01QX0lOSEVSSVRfRlBfQ09OVFJPTCIsICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2luaGVyaXRfZnBfY29udHJvbCwgX19rbXBfc3RnX3ByaW50X2luaGVyaXRfZnBfY29udHJvbCwgTlVMTCwgMCwgMCB9LAorI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgIHsgIkdPTVBfU1RBQ0tTSVpFIiwgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9zdGFja3NpemUsICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyNlbmRpZgorCisjaWZkZWYgS01QX0RFQlVHCisgICAgeyAiS01QX0FfREVCVUciLCAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2FfZGVidWcsICAgICAgICAgICAgX19rbXBfc3RnX3ByaW50X2FfZGVidWcsICAgICAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9CX0RFQlVHIiwgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9iX2RlYnVnLCAgICAgICAgICAgIF9fa21wX3N0Z19wcmludF9iX2RlYnVnLCAgICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfQ19ERUJVRyIsICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfY19kZWJ1ZywgICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfY19kZWJ1ZywgICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0RfREVCVUciLCAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2RfZGVidWcsICAgICAgICAgICAgX19rbXBfc3RnX3ByaW50X2RfZGVidWcsICAgICAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9FX0RFQlVHIiwgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9lX2RlYnVnLCAgICAgICAgICAgIF9fa21wX3N0Z19wcmludF9lX2RlYnVnLCAgICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfRl9ERUJVRyIsICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfZl9kZWJ1ZywgICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfZl9kZWJ1ZywgICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0RFQlVHIiwgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2RlYnVnLCAgICAgICAgICAgICAgTlVMTCwgLyogbm8gcHJpbnQgKi8gICAgICAgICAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9ERUJVR19CVUYiLCAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9kZWJ1Z19idWYsICAgICAgICAgIF9fa21wX3N0Z19wcmludF9kZWJ1Z19idWYsICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfREVCVUdfQlVGX0FUT01JQyIsICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfZGVidWdfYnVmX2F0b21pYywgICBfX2ttcF9zdGdfcHJpbnRfZGVidWdfYnVmX2F0b21pYywgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0RFQlVHX0JVRl9DSEFSUyIsICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2RlYnVnX2J1Zl9jaGFycywgICAgX19rbXBfc3RnX3ByaW50X2RlYnVnX2J1Zl9jaGFycywgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9ERUJVR19CVUZfTElORVMiLCAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9kZWJ1Z19idWZfbGluZXMsICAgIF9fa21wX3N0Z19wcmludF9kZWJ1Z19idWZfbGluZXMsICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfRElBRyIsICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfZGlhZywgICAgICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfZGlhZywgICAgICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisKKyAgICB7ICJLTVBfUEFSX1JBTkdFIiwgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfcGFyX3JhbmdlX2VudiwgICAgICBfX2ttcF9zdGdfcHJpbnRfcGFyX3JhbmdlX2VudiwgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX1lJRUxEX0NZQ0xFIiwgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3lpZWxkX2N5Y2xlLCAgICAgICAgX19rbXBfc3RnX3ByaW50X3lpZWxkX2N5Y2xlLCAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9ZSUVMRF9PTiIsICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV95aWVsZF9vbiwgICAgICAgICAgIF9fa21wX3N0Z19wcmludF95aWVsZF9vbiwgICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfWUlFTERfT0ZGIiwgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfeWllbGRfb2ZmLCAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfeWllbGRfb2ZmLCAgICAgICAgICBOVUxMLCAwLCAwIH0sCisjZW5kaWYgLy8gS01QX0RFQlVHCisKKyAgICB7ICJLTVBfQUxJR05fQUxMT0MiLCAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfYWxpZ25fYWxsb2MsICAgICAgICBfX2ttcF9zdGdfcHJpbnRfYWxpZ25fYWxsb2MsICAgICAgICBOVUxMLCAwLCAwIH0sCisKKyAgICB7ICJLTVBfUExBSU5fQkFSUklFUiIsICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfYmFycmllcl9icmFuY2hfYml0LCBfX2ttcF9zdGdfcHJpbnRfYmFycmllcl9icmFuY2hfYml0LCBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX1BMQUlOX0JBUlJJRVJfUEFUVEVSTiIsICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2JhcnJpZXJfcGF0dGVybiwgICAgX19rbXBfc3RnX3ByaW50X2JhcnJpZXJfcGF0dGVybiwgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9GT1JLSk9JTl9CQVJSSUVSIiwgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9iYXJyaWVyX2JyYW5jaF9iaXQsIF9fa21wX3N0Z19wcmludF9iYXJyaWVyX2JyYW5jaF9iaXQsIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfRk9SS0pPSU5fQkFSUklFUl9QQVRURVJOIiwgICAgICBfX2ttcF9zdGdfcGFyc2VfYmFycmllcl9wYXR0ZXJuLCAgICBfX2ttcF9zdGdfcHJpbnRfYmFycmllcl9wYXR0ZXJuLCAgICBOVUxMLCAwLCAwIH0sCisjaWYgS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgICB7ICJLTVBfUkVEVUNUSU9OX0JBUlJJRVIiLCAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfYmFycmllcl9icmFuY2hfYml0LCBfX2ttcF9zdGdfcHJpbnRfYmFycmllcl9icmFuY2hfYml0LCBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX1JFRFVDVElPTl9CQVJSSUVSX1BBVFRFUk4iLCAgICAgX19rbXBfc3RnX3BhcnNlX2JhcnJpZXJfcGF0dGVybiwgICAgX19rbXBfc3RnX3ByaW50X2JhcnJpZXJfcGF0dGVybiwgICAgTlVMTCwgMCwgMCB9LAorI2VuZGlmCisKKyAgICB7ICJLTVBfQUJPUlRfREVMQVkiLCAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfYWJvcnRfZGVsYXksICAgICAgICBfX2ttcF9zdGdfcHJpbnRfYWJvcnRfZGVsYXksICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0NQVUlORk9fRklMRSIsICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2NwdWluZm9fZmlsZSwgICAgICAgX19rbXBfc3RnX3ByaW50X2NwdWluZm9fZmlsZSwgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9GT1JDRV9SRURVQ1RJT04iLCAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9mb3JjZV9yZWR1Y3Rpb24sICAgIF9fa21wX3N0Z19wcmludF9mb3JjZV9yZWR1Y3Rpb24sICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfREVURVJNSU5JU1RJQ19SRURVQ1RJT04iLCAgICAgICBfX2ttcF9zdGdfcGFyc2VfZm9yY2VfcmVkdWN0aW9uLCAgICBfX2ttcF9zdGdfcHJpbnRfZm9yY2VfcmVkdWN0aW9uLCAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX1NUT1JBR0VfTUFQIiwgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3N0b3JhZ2VfbWFwLCAgICAgICAgX19rbXBfc3RnX3ByaW50X3N0b3JhZ2VfbWFwLCAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9BTExfVEhSRUFEUFJJVkFURSIsICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9hbGxfdGhyZWFkcHJpdmF0ZSwgIF9fa21wX3N0Z19wcmludF9hbGxfdGhyZWFkcHJpdmF0ZSwgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfRk9SRUlHTl9USFJFQURTX1RIUkVBRFBSSVZBVEUiLCBfX2ttcF9zdGdfcGFyc2VfZm9yZWlnbl90aHJlYWRzX3RocmVhZHByaXZhdGUsIF9fa21wX3N0Z19wcmludF9mb3JlaWduX3RocmVhZHNfdGhyZWFkcHJpdmF0ZSwgICAgIE5VTEwsIDAsIDAgfSwKKworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICB7ICJLTVBfQUZGSU5JVFkiLCAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfYWZmaW5pdHksICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfYWZmaW5pdHksICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisjIGlmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgIHsgIkdPTVBfQ1BVX0FGRklOSVRZIiwgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9nb21wX2NwdV9hZmZpbml0eSwgIE5VTEwsIC8qIG5vIHByaW50ICovICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyMgZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgeyAiT01QX1BST0NfQklORCIsICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3Byb2NfYmluZCwgICAgICAgICAgX19rbXBfc3RnX3ByaW50X3Byb2NfYmluZCwgICAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIk9NUF9QTEFDRVMiLCAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9wbGFjZXMsICAgICAgICAgICAgIF9fa21wX3N0Z19wcmludF9wbGFjZXMsICAgICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyMgZWxzZQorICAgIHsgIk9NUF9QUk9DX0JJTkQiLCAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9wcm9jX2JpbmQsICAgICAgICAgIE5VTEwsIC8qIG5vIHByaW50ICovICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyMgZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworICAgIHsgIktNUF9UT1BPTE9HWV9NRVRIT0QiLCAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV90b3BvbG9neV9tZXRob2QsICAgIF9fa21wX3N0Z19wcmludF90b3BvbG9neV9tZXRob2QsICAgIE5VTEwsIDAsIDAgfSwKKworI2Vsc2UKKworICAgIC8vCisgICAgLy8gS01QX0FGRklOSVRZIGlzIG5vdCBzdXBwb3J0ZWQgb24gT1MgWCosIG5vciBpcyBPTVBfUExBQ0VTLgorICAgIC8vIE9NUF9QUk9DX0JJTkQgYW5kIHByb2MtYmluZC12YXIgYXJlIHN1cHBvcnRlZCwgaG93ZXZlci4KKyAgICAvLworIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgIHsgIk9NUF9QUk9DX0JJTkQiLCAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9wcm9jX2JpbmQsICAgICAgICAgIF9fa21wX3N0Z19wcmludF9wcm9jX2JpbmQsICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyMgZW5kaWYKKworI2VuZGlmIC8vIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKworICAgIHsgIktNUF9JTklUX0FUX0ZPUksiLCAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9pbml0X2F0X2ZvcmssICAgICAgIF9fa21wX3N0Z19wcmludF9pbml0X2F0X2ZvcmssICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfU0NIRURVTEUiLCAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2Vfc2NoZWR1bGUsICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc2NoZWR1bGUsICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiT01QX1NDSEVEVUxFIiwgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX29tcF9zY2hlZHVsZSwgICAgICAgX19rbXBfc3RnX3ByaW50X29tcF9zY2hlZHVsZSwgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9BVE9NSUNfTU9ERSIsICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9hdG9taWNfbW9kZSwgICAgICAgIF9fa21wX3N0Z19wcmludF9hdG9taWNfbW9kZSwgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfQ09OU0lTVEVOQ1lfQ0hFQ0siLCAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfY29uc2lzdGVuY3lfY2hlY2ssICBfX2ttcF9zdGdfcHJpbnRfY29uc2lzdGVuY3lfY2hlY2ssICBOVUxMLCAwLCAwIH0sCisKKyNpZiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZCisgICAgeyAiS01QX0lUVF9QUkVQQVJFX0RFTEFZIiwgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2l0dF9wcmVwYXJlX2RlbGF5LCAgX19rbXBfc3RnX3ByaW50X2l0dF9wcmVwYXJlX2RlbGF5LCAgTlVMTCwgMCwgMCB9LAorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkgKi8KKyAgICB7ICJLTVBfTUFMTE9DX1BPT0xfSU5DUiIsICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfbWFsbG9jX3Bvb2xfaW5jciwgICBfX2ttcF9zdGdfcHJpbnRfbWFsbG9jX3Bvb2xfaW5jciwgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0lOSVRfV0FJVCIsICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2luaXRfd2FpdCwgICAgICAgICAgX19rbXBfc3RnX3ByaW50X2luaXRfd2FpdCwgICAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9ORVhUX1dBSVQiLCAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9uZXh0X3dhaXQsICAgICAgICAgIF9fa21wX3N0Z19wcmludF9uZXh0X3dhaXQsICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfR1RJRF9NT0RFIiwgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfZ3RpZF9tb2RlLCAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfZ3RpZF9tb2RlLCAgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiT01QX0RZTkFNSUMiLCAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX29tcF9keW5hbWljLCAgICAgICAgX19rbXBfc3RnX3ByaW50X29tcF9keW5hbWljLCAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9EWU5BTUlDX01PREUiLCAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9rbXBfZHluYW1pY19tb2RlLCAgIF9fa21wX3N0Z19wcmludF9rbXBfZHluYW1pY19tb2RlLCAgIE5VTEwsIDAsIDAgfSwKKworI2lmZGVmIFVTRV9MT0FEX0JBTEFOQ0UKKyAgICB7ICJLTVBfTE9BRF9CQUxBTkNFX0lOVEVSVkFMIiwgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfbGRfYmFsYW5jZV9pbnRlcnZhbCxfX2ttcF9zdGdfcHJpbnRfbGRfYmFsYW5jZV9pbnRlcnZhbCxOVUxMLCAwLCAwIH0sCisjZW5kaWYKKworICAgIHsgIktNUF9OVU1fTE9DS1NfSU5fQkxPQ0siLCAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9sb2NrX2Jsb2NrLCAgICAgICAgIF9fa21wX3N0Z19wcmludF9sb2NrX2Jsb2NrLCAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfTE9DS19LSU5EIiwgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfbG9ja19raW5kLCAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfbG9ja19raW5kLCAgICAgICAgICBOVUxMLCAwLCAwIH0sCisjaWYgS01QX1VTRV9BREFQVElWRV9MT0NLUworICAgIHsgIktNUF9BREFQVElWRV9MT0NLX1BST1BTIiwgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9hZGFwdGl2ZV9sb2NrX3Byb3BzLF9fa21wX3N0Z19wcmludF9hZGFwdGl2ZV9sb2NrX3Byb3BzLCAgTlVMTCwgMCwgMCB9LAorI2lmIEtNUF9ERUJVR19BREFQVElWRV9MT0NLUworICAgIHsgIktNUF9TUEVDVUxBVElWRV9TVEFUU0ZJTEUiLCAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9zcGVjdWxhdGl2ZV9zdGF0c2ZpbGUsX19rbXBfc3RnX3ByaW50X3NwZWN1bGF0aXZlX3N0YXRzZmlsZSwgIE5VTEwsIDAsIDAgfSwKKyNlbmRpZgorI2VuZGlmIC8vIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKyAgICB7ICJLTVBfUExBQ0VfVEhSRUFEUyIsICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfcGxhY2VfdGhyZWFkcywgICAgICBfX2ttcF9zdGdfcHJpbnRfcGxhY2VfdGhyZWFkcywgICAgICBOVUxMLCAwLCAwIH0sCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIHsgIktNUF9GT1JLSk9JTl9GUkFNRVMiLCAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9mb3Jram9pbl9mcmFtZXMsICAgIF9fa21wX3N0Z19wcmludF9mb3Jram9pbl9mcmFtZXMsICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfRk9SS0pPSU5fRlJBTUVTX01PREUiLCAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfZm9ya2pvaW5fZnJhbWVzX21vZGUsX19rbXBfc3RnX3ByaW50X2Zvcmtqb2luX2ZyYW1lc19tb2RlLCAgTlVMTCwgMCwgMCB9LAorI2VuZGlmCisKKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICB7ICJPTVBfRElTUExBWV9FTlYiLCAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2Vfb21wX2Rpc3BsYXlfZW52LCAgICBfX2ttcF9zdGdfcHJpbnRfb21wX2Rpc3BsYXlfZW52LCAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiT01QX0NBTkNFTExBVElPTiIsICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX29tcF9jYW5jZWxsYXRpb24sICAgX19rbXBfc3RnX3ByaW50X29tcF9jYW5jZWxsYXRpb24sICAgTlVMTCwgMCwgMCB9LAorI2VuZGlmCisgICAgeyAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCB9Cit9OyAvLyBzZXR0aW5ncworCitzdGF0aWMgaW50IGNvbnN0IF9fa21wX3N0Z19jb3VudCA9IHNpemVvZiggX19rbXBfc3RnX3RhYmxlICkgLyBzaXplb2YoIGttcF9zZXR0aW5nX3QgKTsKKworc3RhdGljIGlubGluZQora21wX3NldHRpbmdfdCAqCitfX2ttcF9zdGdfZmluZCggY2hhciBjb25zdCAqIG5hbWUgKSB7CisKKyAgICBpbnQgaTsKKyAgICBpZiAoIG5hbWUgIT0gTlVMTCApIHsKKyAgICAgICAgZm9yICggaSA9IDA7IGkgPCBfX2ttcF9zdGdfY291bnQ7ICsrIGkgKSB7CisgICAgICAgICAgICBpZiAoIHN0cmNtcCggX19rbXBfc3RnX3RhYmxlWyBpIF0ubmFtZSwgbmFtZSApID09IDAgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICYgX19rbXBfc3RnX3RhYmxlWyBpIF07CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9OyAvLyBmb3IKKyAgICB9OyAvLyBpZgorICAgIHJldHVybiBOVUxMOworCit9IC8vIF9fa21wX3N0Z19maW5kCisKKworc3RhdGljIGludAorX19rbXBfc3RnX2NtcCggdm9pZCBjb25zdCAqIF9hLCB2b2lkIGNvbnN0ICogX2IgKSB7CisgICAga21wX3NldHRpbmdfdCAqIGEgPSAoa21wX3NldHRpbmdfdCAqKSBfYTsKKyAgICBrbXBfc2V0dGluZ190ICogYiA9IChrbXBfc2V0dGluZ190ICopIF9iOworCisgICAgLy8KKyAgICAvLyBQcm9jZXNzIEtNUF9BRkZJTklUWSBsYXN0LgorICAgIC8vIEl0IG5lZWRzIHRvIGNvbWUgYWZ0ZXIgT01QX1BMQUNFUyBhbmQgR09NUF9DUFVfQUZGSU5JVFkuCisgICAgLy8KKyAgICBpZiAoIHN0cmNtcCggYS0+bmFtZSwgIktNUF9BRkZJTklUWSIgKSA9PSAwICkgeworICAgICAgICBpZiAoIHN0cmNtcCggYi0+bmFtZSwgIktNUF9BRkZJTklUWSIgKSA9PSAwICkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UgaWYgKCBzdHJjbXAoIGItPm5hbWUsICJLTVBfQUZGSU5JVFkiICkgPT0gMCApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gc3RyY21wKCBhLT5uYW1lLCBiLT5uYW1lICk7Cit9IC8vIF9fa21wX3N0Z19jbXAKKworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX2luaXQoIHZvaWQKKykgeworCisgICAgc3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7CisKKyAgICBpZiAoICEgaW5pdGlhbGl6ZWQgKSB7CisKKyAgICAgICAgLy8gU29ydCB0YWJsZS4KKyAgICAgICAgcXNvcnQoIF9fa21wX3N0Z190YWJsZSwgX19rbXBfc3RnX2NvdW50IC0gMSwgc2l6ZW9mKCBrbXBfc2V0dGluZ190ICksIF9fa21wX3N0Z19jbXAgKTsKKworICAgICAgICB7IC8vIEluaXRpYWxpemUgKl9TVEFDS1NJWkUgZGF0YS4KKworICAgICAgICAgICAga21wX3NldHRpbmdfdCAqIGttcF9zdGFja3NpemUgID0gX19rbXBfc3RnX2ZpbmQoICJLTVBfU1RBQ0tTSVpFIiAgKTsgICAgICAvLyAxc3QgcHJpb3JpdHkuCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgICAgICAgICBrbXBfc2V0dGluZ190ICogZ29tcF9zdGFja3NpemUgPSBfX2ttcF9zdGdfZmluZCggIkdPTVBfU1RBQ0tTSVpFIiApOyAgICAgIC8vIDJuZCBwcmlvcml0eS4KKyNlbmRpZgorICAgICAgICAgICAga21wX3NldHRpbmdfdCAqIG9tcF9zdGFja3NpemUgID0gX19rbXBfc3RnX2ZpbmQoICJPTVBfU1RBQ0tTSVpFIiAgKTsgICAgICAvLyAzcmQgcHJpb3JpdHkuCisKKyAgICAgICAgICAgIC8vICEhISB2b2xhdGlsZSBrZXl3b3JkIGlzIEludGVsIChSKSBDIENvbXBpbGVyIGJ1ZyBDUTQ5OTA4IHdvcmthcm91bmQuCisgICAgICAgICAgICAvLyAhISEgQ29tcGlsZXIgZG9lcyBub3QgdW5kZXJzdGFuZCByaXZhbHMgaXMgdXNlZCBhbmQgb3B0aW1pemVzIG91dCBhc3NpZ25tZW50cworICAgICAgICAgICAgLy8gISEhICAgICByaXZhbHNbIGkgKysgXSA9IC4uLjsKKyAgICAgICAgICAgIHN0YXRpYyBrbXBfc2V0dGluZ190ICogdm9sYXRpbGUgcml2YWxzWyA0IF07CisgICAgICAgICAgICBzdGF0aWMga21wX3N0Z19zc19kYXRhX3Qga21wX2RhdGEgID0geyAgICAxLCAoa21wX3NldHRpbmdfdCAqKilyaXZhbHMgfTsKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICAgICAgICAgIHN0YXRpYyBrbXBfc3RnX3NzX2RhdGFfdCBnb21wX2RhdGEgPSB7IDEwMjQsIChrbXBfc2V0dGluZ190ICoqKXJpdmFscyB9OworI2VuZGlmCisgICAgICAgICAgICBzdGF0aWMga21wX3N0Z19zc19kYXRhX3Qgb21wX2RhdGEgID0geyAxMDI0LCAoa21wX3NldHRpbmdfdCAqKilyaXZhbHMgfTsKKyAgICAgICAgICAgIGludCBpID0gMDsKKworICAgICAgICAgICAgcml2YWxzWyBpICsrIF0gPSBrbXBfc3RhY2tzaXplOworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgICAgICAgICAgaWYgKCBnb21wX3N0YWNrc2l6ZSAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIHJpdmFsc1sgaSArKyBdID0gZ29tcF9zdGFja3NpemU7CisgICAgICAgICAgICB9OyAvLyBpZgorI2VuZGlmCisgICAgICAgICAgICByaXZhbHNbIGkgKysgXSA9IG9tcF9zdGFja3NpemU7CisgICAgICAgICAgICByaXZhbHNbIGkgKysgXSA9IE5VTEw7CisKKyAgICAgICAgICAgIGttcF9zdGFja3NpemUtPmRhdGEgPSAmIGttcF9kYXRhOworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgICAgICAgICAgaWYgKCBnb21wX3N0YWNrc2l6ZSAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIGdvbXBfc3RhY2tzaXplLT5kYXRhID0gJiBnb21wX2RhdGE7CisgICAgICAgICAgICB9OyAvLyBpZgorI2VuZGlmCisgICAgICAgICAgICBvbXBfc3RhY2tzaXplLT5kYXRhID0gJiBvbXBfZGF0YTsKKworICAgICAgICB9CisKKyAgICAgICAgeyAvLyBJbml0aWFsaXplIEtNUF9MSUJSQVJZIGFuZCBPTVBfV0FJVF9QT0xJQ1kgZGF0YS4KKworICAgICAgICAgICAga21wX3NldHRpbmdfdCAqIGttcF9saWJyYXJ5ICAgICA9IF9fa21wX3N0Z19maW5kKCAiS01QX0xJQlJBUlkiICk7ICAgICAgICAvLyAxc3QgcHJpb3JpdHkuCisgICAgICAgICAgICBrbXBfc2V0dGluZ190ICogb21wX3dhaXRfcG9saWN5ID0gX19rbXBfc3RnX2ZpbmQoICJPTVBfV0FJVF9QT0xJQ1kiICk7ICAgIC8vIDJuZCBwcmlvcml0eS4KKworICAgICAgICAgICAgLy8gISEhIHZvbGF0aWxlIGtleXdvcmQgaXMgSW50ZWwgKFIpIEMgQ29tcGlsZXIgYnVnIENRNDk5MDggd29ya2Fyb3VuZC4KKyAgICAgICAgICAgIHN0YXRpYyBrbXBfc2V0dGluZ190ICogdm9sYXRpbGUgcml2YWxzWyAzIF07CisgICAgICAgICAgICBzdGF0aWMga21wX3N0Z193cF9kYXRhX3Qga21wX2RhdGEgID0geyAwLCAoa21wX3NldHRpbmdfdCAqKilyaXZhbHMgfTsKKyAgICAgICAgICAgIHN0YXRpYyBrbXBfc3RnX3dwX2RhdGFfdCBvbXBfZGF0YSAgPSB7IDEsIChrbXBfc2V0dGluZ190ICoqKXJpdmFscyB9OworICAgICAgICAgICAgaW50IGkgPSAwOworCisgICAgICAgICAgICByaXZhbHNbIGkgKysgXSA9IGttcF9saWJyYXJ5OworICAgICAgICAgICAgaWYgKCBvbXBfd2FpdF9wb2xpY3kgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICByaXZhbHNbIGkgKysgXSA9IG9tcF93YWl0X3BvbGljeTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICByaXZhbHNbIGkgKysgXSA9IE5VTEw7CisKKyAgICAgICAgICAgIGttcF9saWJyYXJ5LT5kYXRhICA9ICYga21wX2RhdGE7CisgICAgICAgICAgICBpZiAoIG9tcF93YWl0X3BvbGljeSAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIG9tcF93YWl0X3BvbGljeS0+ZGF0YSA9ICYgb21wX2RhdGE7CisgICAgICAgICAgICB9OyAvLyBpZgorCisgICAgICAgIH0KKworICAgICAgICB7IC8vIEluaXRpYWxpemUgS01QX0FMTF9USFJFQURTLCBLTVBfTUFYX1RIUkVBRFMsIGFuZCBPTVBfVEhSRUFEX0xJTUlUIGRhdGEuCisKKyAgICAgICAgICAgIGttcF9zZXR0aW5nX3QgKiBrbXBfYWxsX3RocmVhZHMgID0gX19rbXBfc3RnX2ZpbmQoICJLTVBfQUxMX1RIUkVBRFMiICApOyAgLy8gMXN0IHByaW9yaXR5LgorICAgICAgICAgICAga21wX3NldHRpbmdfdCAqIGttcF9tYXhfdGhyZWFkcyAgPSBfX2ttcF9zdGdfZmluZCggIktNUF9NQVhfVEhSRUFEUyIgICk7ICAvLyAybmQgcHJpb3JpdHkuCisgICAgICAgICAgICBrbXBfc2V0dGluZ190ICogb21wX3RocmVhZF9saW1pdCA9IF9fa21wX3N0Z19maW5kKCAiT01QX1RIUkVBRF9MSU1JVCIgKTsgIC8vIDNyZCBwcmlvcml0eS4KKworICAgICAgICAgICAgLy8gISEhIHZvbGF0aWxlIGtleXdvcmQgaXMgSW50ZWwgKFIpIEMgQ29tcGlsZXIgYnVnIENRNDk5MDggd29ya2Fyb3VuZC4KKyAgICAgICAgICAgIHN0YXRpYyBrbXBfc2V0dGluZ190ICogdm9sYXRpbGUgcml2YWxzWyA0IF07CisgICAgICAgICAgICBpbnQgaSA9IDA7CisKKyAgICAgICAgICAgIHJpdmFsc1sgaSArKyBdID0ga21wX2FsbF90aHJlYWRzOworICAgICAgICAgICAgcml2YWxzWyBpICsrIF0gPSBrbXBfbWF4X3RocmVhZHM7CisgICAgICAgICAgICBpZiAoIG9tcF90aHJlYWRfbGltaXQgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICByaXZhbHNbIGkgKysgXSA9IG9tcF90aHJlYWRfbGltaXQ7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgcml2YWxzWyBpICsrIF0gPSBOVUxMOworCisgICAgICAgICAgICBrbXBfYWxsX3RocmVhZHMtPmRhdGEgPSAodm9pZCopJiByaXZhbHM7CisgICAgICAgICAgICBrbXBfbWF4X3RocmVhZHMtPmRhdGEgPSAodm9pZCopJiByaXZhbHM7CisgICAgICAgICAgICBpZiAoIG9tcF90aHJlYWRfbGltaXQgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBvbXBfdGhyZWFkX2xpbWl0LT5kYXRhID0gKHZvaWQqKSYgcml2YWxzOworICAgICAgICAgICAgfTsgLy8gaWYKKworICAgICAgICB9CisKKyNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIHsgLy8gSW5pdGlhbGl6ZSBLTVBfQUZGSU5JVFksIEdPTVBfQ1BVX0FGRklOSVRZLCBhbmQgT01QX1BST0NfQklORCBkYXRhLgorCisgICAgICAgICAgICBrbXBfc2V0dGluZ190ICoga21wX2FmZmluaXR5ID0gX19rbXBfc3RnX2ZpbmQoICJLTVBfQUZGSU5JVFkiICApOyAgLy8gMXN0IHByaW9yaXR5LgorICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCgga21wX2FmZmluaXR5ICE9IE5VTEwgKTsKKworIyBpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICAgICAgICAgIGttcF9zZXR0aW5nX3QgKiBnb21wX2NwdV9hZmZpbml0eSA9IF9fa21wX3N0Z19maW5kKCAiR09NUF9DUFVfQUZGSU5JVFkiICApOyAgLy8gMm5kIHByaW9yaXR5LgorICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggZ29tcF9jcHVfYWZmaW5pdHkgIT0gTlVMTCApOworIyBlbmRpZgorCisgICAgICAgICAgICBrbXBfc2V0dGluZ190ICogb21wX3Byb2NfYmluZCA9IF9fa21wX3N0Z19maW5kKCAiT01QX1BST0NfQklORCIgKTsgIC8vIDNyZCBwcmlvcml0eS4KKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIG9tcF9wcm9jX2JpbmQgIT0gTlVMTCApOworCisgICAgICAgICAgICAvLyAhISEgdm9sYXRpbGUga2V5d29yZCBpcyBJbnRlbCAoUikgQyBDb21waWxlciBidWcgQ1E0OTkwOCB3b3JrYXJvdW5kLgorICAgICAgICAgICAgc3RhdGljIGttcF9zZXR0aW5nX3QgKiB2b2xhdGlsZSByaXZhbHNbIDQgXTsKKyAgICAgICAgICAgIGludCBpID0gMDsKKworICAgICAgICAgICAgcml2YWxzWyBpICsrIF0gPSBrbXBfYWZmaW5pdHk7CisKKyMgaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgICAgICAgICByaXZhbHNbIGkgKysgXSA9IGdvbXBfY3B1X2FmZmluaXR5OworICAgICAgICAgICAgZ29tcF9jcHVfYWZmaW5pdHktPmRhdGEgPSAodm9pZCopJiByaXZhbHM7CisjIGVuZGlmCisKKyAgICAgICAgICAgIHJpdmFsc1sgaSArKyBdID0gb21wX3Byb2NfYmluZDsKKyAgICAgICAgICAgIG9tcF9wcm9jX2JpbmQtPmRhdGEgPSAodm9pZCopJiByaXZhbHM7CisgICAgICAgICAgICByaXZhbHNbIGkgKysgXSA9IE5VTEw7CisKKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgIHN0YXRpYyBrbXBfc2V0dGluZ190ICogdm9sYXRpbGUgcGxhY2VzX3JpdmFsc1sgNCBdOworICAgICAgICAgICAgaSA9IDA7CisKKyAgICAgICAgICAgIGttcF9zZXR0aW5nX3QgKiBvbXBfcGxhY2VzID0gX19rbXBfc3RnX2ZpbmQoICJPTVBfUExBQ0VTIiApOyAgLy8gM3JkIHByaW9yaXR5LgorICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggb21wX3BsYWNlcyAhPSBOVUxMICk7CisKKyAgICAgICAgICAgIHBsYWNlc19yaXZhbHNbIGkgKysgXSA9IGttcF9hZmZpbml0eTsKKyMgIGlmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgICAgICAgICAgcGxhY2VzX3JpdmFsc1sgaSArKyBdID0gZ29tcF9jcHVfYWZmaW5pdHk7CisjICBlbmRpZgorICAgICAgICAgICAgcGxhY2VzX3JpdmFsc1sgaSArKyBdID0gb21wX3BsYWNlczsKKyAgICAgICAgICAgIG9tcF9wbGFjZXMtPmRhdGEgPSAodm9pZCopJiBwbGFjZXNfcml2YWxzOworICAgICAgICAgICAgcGxhY2VzX3JpdmFsc1sgaSArKyBdID0gTlVMTDsKKyMgZW5kaWYKKyAgICAgICAgfQorI2Vsc2UKKyAgICAvLyBLTVBfQUZGSU5JVFkgbm90IHN1cHBvcnRlZCwgc28gT01QX1BST0NfQklORCBoYXMgbm8gcml2YWxzLgorICAgIC8vIE9NUF9QTEFDRVMgbm90IHN1cHBvcnRlZCB5ZXQuCisjZW5kaWYgLy8gS01QX0FGRklOSVRZX1NVUFBPUlRFRAorCisgICAgICAgIHsgLy8gSW5pdGlhbGl6ZSBLTVBfREVURVJNSU5JU1RJQ19SRURVQ1RJT04gYW5kIEtNUF9GT1JDRV9SRURVQ1RJT04gZGF0YS4KKworICAgICAgICAgICAga21wX3NldHRpbmdfdCAqIGttcF9mb3JjZV9yZWQgID0gX19rbXBfc3RnX2ZpbmQoICJLTVBfRk9SQ0VfUkVEVUNUSU9OIiApOyAgICAgICAgIC8vIDFzdCBwcmlvcml0eS4KKyAgICAgICAgICAgIGttcF9zZXR0aW5nX3QgKiBrbXBfZGV0ZXJtX3JlZCA9IF9fa21wX3N0Z19maW5kKCAiS01QX0RFVEVSTUlOSVNUSUNfUkVEVUNUSU9OIiApOyAvLyAybmQgcHJpb3JpdHkuCisKKyAgICAgICAgICAgIC8vICEhISB2b2xhdGlsZSBrZXl3b3JkIGlzIEludGVsIChSKSBDIENvbXBpbGVyIGJ1ZyBDUTQ5OTA4IHdvcmthcm91bmQuCisgICAgICAgICAgICBzdGF0aWMga21wX3NldHRpbmdfdCAqIHZvbGF0aWxlIHJpdmFsc1sgMyBdOworICAgICAgICAgICAgc3RhdGljIGttcF9zdGdfZnJfZGF0YV90IGZvcmNlX2RhdGEgICA9IHsgMSwgKGttcF9zZXR0aW5nX3QgKiopcml2YWxzIH07CisgICAgICAgICAgICBzdGF0aWMga21wX3N0Z19mcl9kYXRhX3QgZGV0ZXJtX2RhdGEgID0geyAwLCAoa21wX3NldHRpbmdfdCAqKilyaXZhbHMgfTsKKyAgICAgICAgICAgIGludCBpID0gMDsKKworICAgICAgICAgICAgcml2YWxzWyBpICsrIF0gPSBrbXBfZm9yY2VfcmVkOworICAgICAgICAgICAgaWYgKCBrbXBfZGV0ZXJtX3JlZCAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIHJpdmFsc1sgaSArKyBdID0ga21wX2RldGVybV9yZWQ7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgcml2YWxzWyBpICsrIF0gPSBOVUxMOworCisgICAgICAgICAgICBrbXBfZm9yY2VfcmVkLT5kYXRhID0gJiBmb3JjZV9kYXRhOworICAgICAgICAgICAgaWYgKCBrbXBfZGV0ZXJtX3JlZCAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIGttcF9kZXRlcm1fcmVkLT5kYXRhICA9ICYgZGV0ZXJtX2RhdGE7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9CisKKyAgICAgICAgaW5pdGlhbGl6ZWQgPSAxOworCisgICAgfTsgLy8gaWYKKworICAgIC8vIFJlc2V0IGZsYWdzLgorICAgIGludCBpOworICAgIGZvciAoIGkgPSAwOyBpIDwgX19rbXBfc3RnX2NvdW50OyArKyBpICkgeworICAgICAgICBfX2ttcF9zdGdfdGFibGVbIGkgXS5zZXQgPSAwOworICAgIH07IC8vIGZvcgorCit9IC8vIF9fa21wX3N0Z19pbml0CisKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZSgKKyAgICBjaGFyIGNvbnN0ICogbmFtZSwKKyAgICBjaGFyIGNvbnN0ICogdmFsdWUKKykgeworCisgICAgLy8gT24gV2luZG93cyogT1MgdGhlcmUgYXJlIHNvbWUgbmFtZWxlc3MgdmFyaWFibGVzIGxpa2UgIkM6PUM6XCIgKHllYWgsIHJlYWxseSBuYW1lbGVzcywgdGhleSBhcmUKKyAgICAvLyBwcmVzZW50ZWQgaW4gZW52aXJvbm1lbnQgYmxvY2sgYXMgIj1DOj1DXFxceDAwPUQ6PUQ6XFxceDAwLi4uIiwgc28gbGV0IHVzIHNraXAgdGhlbS4KKyAgICBpZiAoIG5hbWVbIDAgXSA9PSAwICkgeworICAgICAgICByZXR1cm47CisgICAgfTsgLy8gaWYKKworICAgIGlmICggdmFsdWUgIT0gTlVMTCApIHsKKyAgICAgICAga21wX3NldHRpbmdfdCAqIHNldHRpbmcgPSBfX2ttcF9zdGdfZmluZCggbmFtZSApOworICAgICAgICBpZiAoIHNldHRpbmcgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIHNldHRpbmctPnBhcnNlKCBuYW1lLCB2YWx1ZSwgc2V0dGluZy0+ZGF0YSApOworICAgICAgICAgICAgc2V0dGluZy0+ZGVmaW5lZCA9IDE7CisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gaWYKKworfSAvLyBfX2ttcF9zdGdfcGFyc2UKKworCitzdGF0aWMgaW50CitfX2ttcF9zdGdfY2hlY2tfcml2YWxzKCAgICAgICAgICAvLyAwIC0tIE9rLCAxIC0tIGVycm9ycyBmb3VuZC4KKyAgICBjaGFyIGNvbnN0ICogICAgICAgbmFtZSwgICAgIC8vIE5hbWUgb2YgdmFyaWFibGUuCisgICAgY2hhciBjb25zdCAqICAgICAgIHZhbHVlLCAgICAvLyBWYWx1ZSBvZiB0aGUgdmFyaWFibGUuCisgICAga21wX3NldHRpbmdfdCAqICogIHJpdmFscyAgICAvLyBMaXN0IG9mIHJpdmFsIHNldHRpbmdzICh0aGUgbGlzdCBtdXN0IGluY2x1ZGUgY3VycmVudCBvbmUpLgorKSB7CisKKyAgICBpZiAoIHJpdmFscyA9PSBOVUxMICkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLyBMb29wIHRocnUgaGlnaGVyIHByaW9yaXR5IHNldHRpbmdzIChsaXN0ZWQgYmVmb3JlIGN1cnJlbnQpLgorICAgIGludCBpID0gMDsKKyAgICBmb3IgKCA7IHN0cmNtcCggcml2YWxzWyBpIF0tPm5hbWUsIG5hbWUgKSAhPSAwOyBpKysgKSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHJpdmFsc1sgaSBdICE9IE5VTEwgKTsKKworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgaWYgKCByaXZhbHNbIGkgXSA9PSBfX2ttcF9hZmZpbml0eV9ub3R5cGUgKSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gSWYgS01QX0FGRklOSVRZIGlzIHNwZWNpZmllZCB3aXRob3V0IGEgdHlwZSBuYW1lLAorICAgICAgICAgICAgLy8gaXQgZG9lcyBub3Qgcml2YWwgT01QX1BST0NfQklORCBvciBHT01QX0NQVV9BRkZJTklUWS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgaWYgKCByaXZhbHNbIGkgXS0+c2V0ICkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIFN0Z0lnbm9yZWQsIG5hbWUsIHJpdmFsc1sgaSBdLT5uYW1lICk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyB3aGlsZQorCisgICAgKysgaTsgLy8gU2tpcCBjdXJyZW50IHNldHRpbmcuCisgICAgcmV0dXJuIDA7CisKK307IC8vIF9fa21wX3N0Z19jaGVja19yaXZhbHMKKworCitzdGF0aWMgaW50CitfX2ttcF9lbnZfdG9QcmludCggY2hhciBjb25zdCAqIG5hbWUsIGludCBmbGFnICkgeworICAgIGludCByYyA9IDA7CisgICAga21wX3NldHRpbmdfdCAqIHNldHRpbmcgPSBfX2ttcF9zdGdfZmluZCggbmFtZSApOworICAgIGlmICggc2V0dGluZyAhPSBOVUxMICkgeworICAgICAgICByYyA9IHNldHRpbmctPmRlZmluZWQ7CisgICAgICAgIGlmICggZmxhZyA+PSAwICkgeworICAgICAgICAgICAgc2V0dGluZy0+ZGVmaW5lZCA9IGZsYWc7CisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gaWYKKyAgICByZXR1cm4gcmM7Cit9CisKKworc3RhdGljIHZvaWQKK19fa21wX2F1eF9lbnZfaW5pdGlhbGl6ZSgga21wX2Vudl9ibGtfdCogYmxvY2sgKSB7CisKKyAgICBjaGFyIGNvbnN0ICogdmFsdWU7CisKKyAgICAvKiBPTVBfTlVNX1RIUkVBRFMgKi8KKyAgICB2YWx1ZSA9IF9fa21wX2Vudl9ibGtfdmFyKCBibG9jaywgIk9NUF9OVU1fVEhSRUFEUyIgKTsKKyAgICBpZiAoIHZhbHVlICkgeworICAgICAgICBvbXBjX3NldF9udW1fdGhyZWFkcyggX19rbXBfZGZsdF90ZWFtX250aCApOworICAgIH0KKworICAgIC8qIEtNUF9CTE9DS1RJTUUgKi8KKyAgICB2YWx1ZSA9IF9fa21wX2Vudl9ibGtfdmFyKCBibG9jaywgIktNUF9CTE9DS1RJTUUiICk7CisgICAgaWYgKCB2YWx1ZSApIHsKKyAgICAgICAga21wY19zZXRfYmxvY2t0aW1lKCBfX2ttcF9kZmx0X2Jsb2NrdGltZSApOworICAgIH0KKworICAgIC8qIE9NUF9ORVNURUQgKi8KKyAgICB2YWx1ZSA9IF9fa21wX2Vudl9ibGtfdmFyKCBibG9jaywgIk9NUF9ORVNURUQiICk7CisgICAgaWYgKCB2YWx1ZSApIHsKKyAgICAgICAgb21wY19zZXRfbmVzdGVkKCBfX2ttcF9kZmx0X25lc3RlZCApOworICAgIH0KKworICAgIC8qIE9NUF9EWU5BTUlDICovCisgICAgdmFsdWUgPSBfX2ttcF9lbnZfYmxrX3ZhciggYmxvY2ssICJPTVBfRFlOQU1JQyIgKTsKKyAgICBpZiAoIHZhbHVlICkgeworICAgICAgICBvbXBjX3NldF9keW5hbWljKCBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWMgKTsKKyAgICB9CisKK30KKwordm9pZAorX19rbXBfZW52X2luaXRpYWxpemUoIGNoYXIgY29uc3QgKiBzdHJpbmcgKSB7CisKKyAgICBrbXBfZW52X2Jsa190IGJsb2NrOworICAgIGludCAgICAgICAgICAgaTsKKworICAgIF9fa21wX3N0Z19pbml0KCk7CisKKyAgICAvLyBIYWNrISEhCisgICAgaWYgKCBzdHJpbmcgPT0gTlVMTCApIHsKKyAgICAgICAgLy8gX19rbXBfbWF4X250aCA9IF9fa21wX3N5c19tYXhfbnRoOworICAgICAgICBfX2ttcF90aHJlYWRzX2NhcGFjaXR5ID0gX19rbXBfaW5pdGlhbF90aHJlYWRzX2NhcGFjaXR5KCBfX2ttcF9kZmx0X3RlYW1fbnRoX3ViICk7CisgICAgfTsgLy8gaWYKKyAgICBfX2ttcF9lbnZfYmxrX2luaXQoICYgYmxvY2ssIHN0cmluZyApOworCisgICAgLy8KKyAgICAvLyB1cGRhdGUgdGhlIHNldCBmbGFnIG9uIGFsbCBlbnRyaWVzIHRoYXQgaGF2ZSBhbiBlbnYgdmFyCisgICAgLy8KKyAgICBmb3IgKCBpID0gMDsgaSA8IGJsb2NrLmNvdW50OyArKyBpICkgeworICAgICAgICBpZiAoKCBibG9jay52YXJzWyBpIF0ubmFtZSA9PSBOVUxMICkKKyAgICAgICAgICB8fCAoICpibG9jay52YXJzWyBpIF0ubmFtZSA9PSAnXDAnKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBibG9jay52YXJzWyBpIF0udmFsdWUgPT0gTlVMTCApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGttcF9zZXR0aW5nX3QgKiBzZXR0aW5nID0gX19rbXBfc3RnX2ZpbmQoIGJsb2NrLnZhcnNbIGkgXS5uYW1lICk7CisgICAgICAgIGlmICggc2V0dGluZyAhPSBOVUxMICkgeworICAgICAgICAgICAgc2V0dGluZy0+c2V0ID0gMTsKKyAgICAgICAgfQorICAgIH07IC8vIGZvciBpCisKKyAgICAvLyBTcGVjaWFsIGNhc2UuIElmIHdlIHBhcnNlIGVudmlyb25tZW50LCBub3QgYSBzdHJpbmcsIHByb2Nlc3MgS01QX1dBUk5JTkdTIGZpcnN0LgorICAgIGlmICggc3RyaW5nID09IE5VTEwgKSB7CisgICAgICAgIGNoYXIgY29uc3QgKiBuYW1lICA9ICJLTVBfV0FSTklOR1MiOworICAgICAgICBjaGFyIGNvbnN0ICogdmFsdWUgPSBfX2ttcF9lbnZfYmxrX3ZhciggJiBibG9jaywgbmFtZSApOworICAgICAgICBfX2ttcF9zdGdfcGFyc2UoIG5hbWUsIHZhbHVlICk7CisgICAgfTsgLy8gaWYKKworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAvLworICAgIC8vIFNwZWNpYWwgY2FzZS4gS01QX0FGRklOSVRZIGlzIG5vdCBhIHJpdmFsIHRvIG90aGVyIGFmZmluaXR5IGVudiB2YXJzCisgICAgLy8gaWYgbm8gYWZmaW5pdHkgdHlwZSBpcyBzcGVjaWZpZWQuICBXZSB3YW50IHRvIGFsbG93CisgICAgLy8gS01QX0FGRklOSVRZPVtub10sdmVyYm9zZS9bbm9dd2FybmluZ3MvZXRjLiAgdG8gYmUgZW5hYmxlZCB3aGVuCisgICAgLy8gc3BlY2lmeWluZyB0aGUgYWZmaW5pdHkgdHlwZSB2aWEgR09NUF9DUFVfQUZGSU5JVFkgb3IgdGhlIE9NUCA0LjAKKyAgICAvLyBhZmZpbml0eSBtZWNoYW5pc20uCisgICAgLy8KKyAgICBfX2ttcF9hZmZpbml0eV9ub3R5cGUgPSBOVUxMOworICAgIGNoYXIgY29uc3QgKmFmZl9zdHIgPSBfX2ttcF9lbnZfYmxrX3ZhciggJiBibG9jaywgIktNUF9BRkZJTklUWSIgKTsKKyAgICBpZiAoIGFmZl9zdHIgIT0gTlVMTCApIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIEtNUF9BRkZJTklUWSB0eXBlIGlzIHNwZWNpZmllZCBpbiB0aGUgc3RyaW5nLgorICAgICAgICAvLyBXZSBqdXN0IHNlYXJjaCB0aGUgc3RyaW5nIGZvciAiY29tcGFjdCIsICJzY2F0dGVyIiwgZXRjLgorICAgICAgICAvLyB3aXRob3V0IHJlYWxseSBwYXJzaW5nIHRoZSBzdHJpbmcuICBUaGUgc3ludGF4IG9mIHRoZQorICAgICAgICAvLyBLTVBfQUZGSU5JVFkgZW52IHZhciBpcyBzdWNoIHRoYXQgbm9uZSBvZiB0aGUgYWZmaW5pdHkKKyAgICAgICAgLy8gdHlwZSBuYW1lcyBjYW4gYXBwZWFyIGFueXdoZXJlIG90aGVyIHRoYXQgdGhlIHR5cGUKKyAgICAgICAgLy8gc3BlY2lmaWVyLCBldmVuIGFzIHN1YnN0cmluZ3MuCisgICAgICAgIC8vCisgICAgICAgIC8vIEkgY2FuJ3QgZmluZCBhIGNhc2UtaW5zZW5zaXRpdmUgdmVyc2lvbiBvZiBzdHJzdHIgb24gV2luZG93cyogT1MuCisgICAgICAgIC8vIFVzZSB0aGUgY2FzZS1zZW5zaXRpdmUgdmVyc2lvbiBmb3Igbm93LgorICAgICAgICAvLworCisjIGlmIEtNUF9PU19XSU5ET1dTCisjICBkZWZpbmUgRklORCBzdHJzdHIKKyMgZWxzZQorIyAgZGVmaW5lIEZJTkQgc3RyY2FzZXN0cgorIyBlbmRpZgorCisgICAgICAgIGlmICggKCBGSU5EKCBhZmZfc3RyLCAibm9uZSIgKSA9PSBOVUxMICkKKyAgICAgICAgICAmJiAoIEZJTkQoIGFmZl9zdHIsICJwaHlzaWNhbCIgKSA9PSBOVUxMICkKKyAgICAgICAgICAmJiAoIEZJTkQoIGFmZl9zdHIsICJsb2dpY2FsIiApID09IE5VTEwgKQorICAgICAgICAgICYmICggRklORCggYWZmX3N0ciwgImNvbXBhY3QiICkgPT0gTlVMTCApCisgICAgICAgICAgJiYgKCBGSU5EKCBhZmZfc3RyLCAic2NhdHRlciIgKSA9PSBOVUxMICkKKyAgICAgICAgICAmJiAoIEZJTkQoIGFmZl9zdHIsICJleHBsaWNpdCIgKSA9PSBOVUxMICkKKyAgICAgICAgICAmJiAoIEZJTkQoIGFmZl9zdHIsICJiYWxhbmNlZCIgKSA9PSBOVUxMICkKKyAgICAgICAgICAmJiAoIEZJTkQoIGFmZl9zdHIsICJkaXNhYmxlZCIgKSA9PSBOVUxMICkgKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ub3R5cGUgPSBfX2ttcF9zdGdfZmluZCggIktNUF9BRkZJTklUWSIgICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gQSBuZXcgYWZmaW5pdHkgdHlwZSBpcyBzcGVjaWZpZWQuCisgICAgICAgICAgICAvLyBSZXNldCB0aGUgYWZmaW5pdHkgZmxhZ3MgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMsCisgICAgICAgICAgICAvLyBpbiBjYXNlIHRoaXMgaXMgY2FsbGVkIGZyb20ga21wX3NldF9kZWZhdWx0cygpLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9kZWZhdWx0OworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3JhbiA9IGFmZmluaXR5X2dyYW5fZGVmYXVsdDsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPSBhZmZpbml0eV90b3BfbWV0aG9kX2RlZmF1bHQ7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2sgPSBhZmZpbml0eV9yZXNwZWN0X21hc2tfZGVmYXVsdDsKKyAgICAgICAgfQorIyB1bmRlZiBGSU5ECisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAvLworICAgICAgICAvLyBBbHNvIHJlc2V0IHRoZSBhZmZpbml0eSBmbGFncyBpZiBPTVBfUFJPQ19CSU5EIGlzIHNwZWNpZmllZC4KKyAgICAgICAgLy8KKyAgICAgICAgYWZmX3N0ciA9IF9fa21wX2Vudl9ibGtfdmFyKCAmIGJsb2NrLCAiT01QX1BST0NfQklORCIgKTsKKyAgICAgICAgaWYgKCBhZmZfc3RyICE9IE5VTEwgKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfZGVmYXVsdDsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX2RlZmF1bHQ7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID0gYWZmaW5pdHlfdG9wX21ldGhvZF9kZWZhdWx0OworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrID0gYWZmaW5pdHlfcmVzcGVjdF9tYXNrX2RlZmF1bHQ7CisgICAgICAgIH0KKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgIH0KKworI2VuZGlmIC8qIEtNUF9BRkZJTklUWV9TVVBQT1JURUQgKi8KKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgLy8KKyAgICAvLyBTZXQgdXAgdGhlIG5lc3RlZCBwcm9jIGJpbmQgdHlwZSB2ZWN0b3IuCisgICAgLy8KKyAgICBpZiAoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlcyA9PSBOVUxMICkgeworICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXMgPSAoa21wX3Byb2NfYmluZF90ICopCisgICAgICAgICAgS01QX0lOVEVSTkFMX01BTExPQyggc2l6ZW9mKGttcF9wcm9jX2JpbmRfdCkgKTsKKyAgICAgICAgaWYgKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXMgPT0gTlVMTCApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTWVtb3J5QWxsb2NGYWlsZWQgKTsKKyAgICAgICAgfQorICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLnNpemUgPSAxOworICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLnVzZWQgPSAxOworIyBpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF9kZWZhdWx0OworIyBlbHNlCisgICAgICAgIC8vIGRlZmF1bHQgcHJvYyBiaW5kIGlzIGZhbHNlIGlmIGFmZmluaXR5IG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID0gcHJvY19iaW5kX2ZhbHNlOworIyBlbmRpZgorCisgICAgfQorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKyAgICAvLworICAgIC8vIE5vdyBwcm9jZXNzIGFsbCBvZiB0aGUgc2V0dGluZ3MuCisgICAgLy8KKyAgICBmb3IgKCBpID0gMDsgaSA8IGJsb2NrLmNvdW50OyArKyBpICkgeworICAgICAgICBfX2ttcF9zdGdfcGFyc2UoIGJsb2NrLnZhcnNbIGkgXS5uYW1lLCBibG9jay52YXJzWyBpIF0udmFsdWUgKTsKKyAgICB9OyAvLyBmb3IgaQorCisgICAgLy8KKyAgICAvLyBJZiB1c2VyIGxvY2tzIGhhdmUgYmVlbiBhbGxvY2F0ZWQgeWV0LCBkb24ndCByZXNldCB0aGUgbG9jayB2cHRyIHRhYmxlLgorICAgIC8vCisgICAgaWYgKCAhIF9fa21wX2luaXRfdXNlcl9sb2NrcyApIHsKKyAgICAgICAgaWYgKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa19kZWZhdWx0ICkgeworICAgICAgICAgICAgX19rbXBfdXNlcl9sb2NrX2tpbmQgPSBsa19xdWV1aW5nOworICAgICAgICB9CisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKyAgICAgICAgX19rbXBfaW5pdF9keW5hbWljX3VzZXJfbG9ja3MoKTsKKyNlbHNlCisgICAgICAgIF9fa21wX3NldF91c2VyX2xvY2tfdnB0cnMoIF9fa21wX3VzZXJfbG9ja19raW5kICk7CisjZW5kaWYKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHN0cmluZyAhPSBOVUxMKTsgLy8ga21wX3NldF9kZWZhdWx0cygpIHdhcyBjYWxsZWQKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdXNlcl9sb2NrX2tpbmQgIT0gbGtfZGVmYXVsdCApOworICAgICAgICAvLyBCaW5kcyBsb2NrIGZ1bmN0aW9ucyBhZ2FpbiB0byBmb2xsb3cgdGhlIHRyYW5zaXRpb24gYmV0d2VlbiBkaWZmZXJlbnQKKyAgICAgICAgLy8gS01QX0NPTlNJU1RFTkNZX0NIRUNLIHZhbHVlcy4gQ2FsbGluZyB0aGlzIGFnYWluIGlzIGhhcm1sZXNzIGFzIGxvbmcKKyAgICAgICAgLy8gYXMgd2UgZG8gbm90IGFsbG93IGxvY2sga2luZCBjaGFuZ2VzIGFmdGVyIG1ha2luZyBhIGNhbGwgdG8gYW55CisgICAgICAgIC8vIHVzZXIgbG9jayBmdW5jdGlvbnMgKHRydWUpLgorI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgICAgICAgIF9fa21wX2luaXRfZHluYW1pY191c2VyX2xvY2tzKCk7CisjZWxzZQorICAgICAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX3ZwdHJzKCBfX2ttcF91c2VyX2xvY2tfa2luZCApOworI2VuZGlmCisgICAgfQorCisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorCisgICAgaWYgKCAhIFRDUl80KF9fa21wX2luaXRfbWlkZGxlKSApIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBtYWNoaW5lL09TIGlzIGFjdHVhbGx5IGNhcGFibGUgb2Ygc3VwcG9ydGluZworICAgICAgICAvLyBhZmZpbml0eS4KKyAgICAgICAgLy8KKyAgICAgICAgY29uc3QgY2hhciAqdmFyID0gIktNUF9BRkZJTklUWSI7CisjIGlmIEtNUF9VU0VfSFdMT0MKKyAgICAgICAgaWYoaHdsb2NfdG9wb2xvZ3lfaW5pdCgmX19rbXBfaHdsb2NfdG9wb2xvZ3kpIDwgMCkgeworICAgICAgICAgICAgX19rbXBfaHdsb2NfZXJyb3IgPSBUUlVFOworICAgICAgICAgICAgaWYoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyhBZmZId2xvY0Vycm9yT2NjdXJyZWQsIHZhciwgImh3bG9jX3RvcG9sb2d5X2luaXQoKSIpOworICAgICAgICB9CisgICAgICAgIGh3bG9jX3RvcG9sb2d5X2lnbm9yZV90eXBlKF9fa21wX2h3bG9jX3RvcG9sb2d5LCBIV0xPQ19PQkpfQ0FDSEUpOworIyBlbmRpZgorICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfZGlzYWJsZWQgKSB7CisgICAgICAgICAgICBLTVBfQUZGSU5JVFlfRElTQUJMRSgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCAhIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkgKSB7CisjIGlmIEtNUF9VU0VfSFdMT0MKKyAgICAgICAgICAgIGNvbnN0IGh3bG9jX3RvcG9sb2d5X3N1cHBvcnQqIHRvcG9sb2d5X3N1cHBvcnQgPSBod2xvY190b3BvbG9neV9nZXRfc3VwcG9ydChfX2ttcF9od2xvY190b3BvbG9neSk7CisgICAgICAgICAgICBpZihod2xvY190b3BvbG9neV9sb2FkKF9fa21wX2h3bG9jX3RvcG9sb2d5KSA8IDApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9od2xvY19lcnJvciA9IFRSVUU7CisgICAgICAgICAgICAgICAgaWYoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkKKyAgICAgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmSHdsb2NFcnJvck9jY3VycmVkLCB2YXIsICJod2xvY190b3BvbG9neV9sb2FkKCkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIElzIHRoZSBzeXN0ZW0gY2FwYWJsZSBvZiBzZXR0aW5nL2dldHRpbmcgdGhpcyB0aHJlYWQncyBhZmZpbml0eT8KKyAgICAgICAgICAgIC8vIGFsc28sIGlzIHRvcG9sb2d5IGRpc2NvdmVyeSBwb3NzaWJsZT8gKHB1IGluZGljYXRlcyBhYmlsaXR5IHRvIGRpc2NvdmVyIHByb2Nlc3NpbmcgdW5pdHMpCisgICAgICAgICAgICAvLyBhbmQgZmluYWxseSwgd2VyZSB0aGVyZSBubyBlcnJvcnMgd2hlbiBjYWxsaW5nIGFueSBod2xvY18qIEFQSSBmdW5jdGlvbnM/CisgICAgICAgICAgICBpZih0b3BvbG9neV9zdXBwb3J0LT5jcHViaW5kLT5zZXRfdGhpc3RocmVhZF9jcHViaW5kICYmCisgICAgICAgICAgICAgICB0b3BvbG9neV9zdXBwb3J0LT5jcHViaW5kLT5nZXRfdGhpc3RocmVhZF9jcHViaW5kICYmCisgICAgICAgICAgICAgICB0b3BvbG9neV9zdXBwb3J0LT5kaXNjb3ZlcnktPnB1ICYmCisgICAgICAgICAgICAgICAhX19rbXBfaHdsb2NfZXJyb3IpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gZW5hYmxlcyBhZmZpbml0eSBhY2NvcmRpbmcgdG8gS01QX0FGRklOSVRZX0NBUEFCTEUoKSBtYWNybworICAgICAgICAgICAgICAgIEtNUF9BRkZJTklUWV9FTkFCTEUoVFJVRSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGluZGljYXRlIHRoYXQgaHdsb2MgZGlkbid0IHdvcmsgYW5kIGRpc2FibGUgYWZmaW5pdHkKKyAgICAgICAgICAgICAgICBfX2ttcF9od2xvY19lcnJvciA9IFRSVUU7CisgICAgICAgICAgICAgICAgS01QX0FGRklOSVRZX0RJU0FCTEUoKTsKKyAgICAgICAgICAgIH0KKyMgZWxzZQorICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZGV0ZXJtaW5lX2NhcGFibGUoIHZhciApOworIyBlbmRpZiAvLyBLTVBfVVNFX0hXTE9DCisgICAgICAgICAgICBpZiAoICEgS01QX0FGRklOSVRZX0NBUEFCTEUoKSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgKCBfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgICAgICAgICAgICAgJiYgKCBfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X2RlZmF1bHQgKQorICAgICAgICAgICAgICAgICAgJiYgKCBfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUgKQorICAgICAgICAgICAgICAgICAgJiYgKCBfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X2Rpc2FibGVkICkgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZk5vdFN1cHBvcnRlZCwgdmFyICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9kaXNhYmxlZDsKKyAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2sgPSAwOworICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX2ZpbmU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfZGlzYWJsZWQgKSAgeworICAgICAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID0gcHJvY19iaW5kX2ZhbHNlOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPT0gcHJvY19iaW5kX3RydWUgKSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gT01QX1BST0NfQklORD10cnVlIG1hcHMgdG8gT01QX1BST0NfQklORD1zcHJlYWQuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID0gcHJvY19iaW5kX3NwcmVhZDsKKyAgICAgICAgfQorIyBlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisgICAgICAgIGlmICggS01QX0FGRklOSVRZX0NBUEFCTEUoKSApIHsKKworIyBpZiBLTVBfR1JPVVBfQUZGSU5JVFkKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIEhhbmRsZSB0aGUgV2luIDY0IGdyb3VwIGFmZmluaXR5IHN0dWZmIGlmIHRoZXJlIGFyZSBtdWx0aXBsZQorICAgICAgICAgICAgLy8gcHJvY2Vzc29yIGdyb3Vwcywgb3IgaWYgdGhlIHVzZXIgcmVxdWVzdGVkIGl0LCBhbmQgT01QIDQuMAorICAgICAgICAgICAgLy8gYWZmaW5pdHkgaXMgbm90IGluIGVmZmVjdC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBpZiAoICggKCBfX2ttcF9udW1fcHJvY19ncm91cHMgPiAxICkKKyAgICAgICAgICAgICAgJiYgKCBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X2RlZmF1bHQgKQorIyAgaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgICAgJiYgKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPT0gcHJvY19iaW5kX2RlZmF1bHQgKSApCisjICBlbmRpZgorICAgICAgICAgICAgICB8fCAoIF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPT0gYWZmaW5pdHlfdG9wX21ldGhvZF9ncm91cCApICkgeworICAgICAgICAgICAgICAgIGlmICggX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrID09IGFmZmluaXR5X3Jlc3BlY3RfbWFza19kZWZhdWx0ICkgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2sgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X2RlZmF1bHQgKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9jb21wYWN0OworIyAgaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID0gcHJvY19iaW5kX2ludGVsOworIyAgZW5kaWYKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID09IGFmZmluaXR5X3RvcF9tZXRob2RfZGVmYXVsdCApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fZGVmYXVsdCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPSBhZmZpbml0eV90b3BfbWV0aG9kX2dyb3VwOworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3JhbiA9IGFmZmluaXR5X2dyYW5fZ3JvdXA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9ncm91cCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPSBhZmZpbml0eV90b3BfbWV0aG9kX2dyb3VwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9IGFmZmluaXR5X3RvcF9tZXRob2RfYWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID09IGFmZmluaXR5X3RvcF9tZXRob2RfZ3JvdXAgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX2RlZmF1bHQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl9ncm91cDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKCBfX2ttcF9hZmZpbml0eV9ncmFuICE9IGFmZmluaXR5X2dyYW5fZ3JvdXAgKQorICAgICAgICAgICAgICAgICAgICAgICYmICggX19rbXBfYWZmaW5pdHlfZ3JhbiAhPSBhZmZpbml0eV9ncmFuX2ZpbmUgKQorICAgICAgICAgICAgICAgICAgICAgICYmICggX19rbXBfYWZmaW5pdHlfZ3JhbiAhPSBhZmZpbml0eV9ncmFuX3RocmVhZCApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqc3RyID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoIF9fa21wX2FmZmluaXR5X2dyYW4gKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBhZmZpbml0eV9ncmFuX2NvcmU6IHN0ciA9ICJjb3JlIjsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBhZmZpbml0eV9ncmFuX3BhY2thZ2U6IHN0ciA9ICJwYWNrYWdlIjsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBhZmZpbml0eV9ncmFuX25vZGU6IHN0ciA9ICJub2RlIjsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogS01QX0RFQlVHX0FTU0VSVCggMCApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZkdyYW5Ub3BHcm91cCwgdmFyLCBzdHIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX2ZpbmU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX2RlZmF1bHQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl9jb3JlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fZ3JvdXAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpzdHIgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICggX19rbXBfYWZmaW5pdHlfdHlwZSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGFmZmluaXR5X3BoeXNpY2FsOiBzdHIgPSAicGh5c2ljYWwiOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGFmZmluaXR5X2xvZ2ljYWw6IHN0ciA9ICJsb2dpY2FsIjsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBhZmZpbml0eV9jb21wYWN0OiBzdHIgPSAiY29tcGFjdCI7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgYWZmaW5pdHlfc2NhdHRlcjogc3RyID0gInNjYXR0ZXIiOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGFmZmluaXR5X2V4cGxpY2l0OiBzdHIgPSAiZXhwbGljaXQiOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBNSUMgb24gd2luZG93cywgc28gbm8gYWZmaW5pdHlfYmFsYW5jZWQgY2FzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IEtNUF9ERUJVR19BU1NFUlQoIDAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZHcmFuR3JvdXBUeXBlLCB2YXIsIHN0ciApOworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3JhbiA9IGFmZmluaXR5X2dyYW5fY29yZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKworIyBlbmRpZiAvKiBLTVBfR1JPVVBfQUZGSU5JVFkgKi8KKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrID09IGFmZmluaXR5X3Jlc3BlY3RfbWFza19kZWZhdWx0ICkgeworIyBpZiBLTVBfR1JPVVBfQUZGSU5JVFkKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9udW1fcHJvY19ncm91cHMgPiAxICkgeworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorIyBlbmRpZiAvKiBLTVBfR1JPVVBfQUZGSU5JVFkgKi8KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgICAgICBpZiAoICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdICE9IHByb2NfYmluZF9pbnRlbCApCisgICAgICAgICAgICAgICAgICAmJiAoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSAhPSBwcm9jX2JpbmRfZGVmYXVsdCApICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfZGVmYXVsdCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9jb21wYWN0OworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZHVwcyA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyMgZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICAgICAgICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfZGVmYXVsdCApIHsKKyNpZiBPTVBfNDBfRU5BQkxFRAorI2lmIEtNUF9BUkNIX1g4Nl82NCAmJiAoS01QX09TX0xJTlVYIHx8IEtNUF9PU19XSU5ET1dTKQorICAgICAgICAgICAgICAgICAgICBpZiggX19rbXBfbWljX3R5cGUgIT0gbm9uX21pYyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF9pbnRlbDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID0gcHJvY19iaW5kX2ZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyNpZiBLTVBfQVJDSF9YODZfNjQgJiYgKEtNUF9PU19MSU5VWCB8fCBLTVBfT1NfV0lORE9XUykKKyAgICAgICAgICAgICAgICAgICAgaWYoIF9fa21wX21pY190eXBlICE9IG5vbl9taWMgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfc2NhdHRlcjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X25vbmU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoICggX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX2RlZmF1bHQgKQorICAgICAgICAgICAgICAgICAgJiYgICggX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPCAwICkgKSB7CisjaWYgS01QX0FSQ0hfWDg2XzY0ICYmIChLTVBfT1NfTElOVVggfHwgS01QX09TX1dJTkRPV1MpCisgICAgICAgICAgICAgICAgICAgIGlmKCBfX2ttcF9taWNfdHlwZSAhPSBub25fbWljICkgeworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3JhbiA9IGFmZmluaXR5X2dyYW5fZmluZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3JhbiA9IGFmZmluaXR5X2dyYW5fY29yZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPT0gYWZmaW5pdHlfdG9wX21ldGhvZF9kZWZhdWx0ICkgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID0gYWZmaW5pdHlfdG9wX21ldGhvZF9hbGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgS19ESUFHKCAxLCAoICJfX2ttcF9hZmZpbml0eV90eXBlICAgICAgICAgPT0gJWRcbiIsIF9fa21wX2FmZmluaXR5X3R5cGUgICAgICAgICApICk7CisgICAgICAgIEtfRElBRyggMSwgKCAiX19rbXBfYWZmaW5pdHlfY29tcGFjdCAgICAgID09ICVkXG4iLCBfX2ttcF9hZmZpbml0eV9jb21wYWN0ICAgICAgKSApOworICAgICAgICBLX0RJQUcoIDEsICggIl9fa21wX2FmZmluaXR5X29mZnNldCAgICAgICA9PSAlZFxuIiwgX19rbXBfYWZmaW5pdHlfb2Zmc2V0ICAgICAgICkgKTsKKyAgICAgICAgS19ESUFHKCAxLCAoICJfX2ttcF9hZmZpbml0eV92ZXJib3NlICAgICAgPT0gJWRcbiIsIF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgICAgICApICk7CisgICAgICAgIEtfRElBRyggMSwgKCAiX19rbXBfYWZmaW5pdHlfd2FybmluZ3MgICAgID09ICVkXG4iLCBfX2ttcF9hZmZpbml0eV93YXJuaW5ncyAgICAgKSApOworICAgICAgICBLX0RJQUcoIDEsICggIl9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzayA9PSAlZFxuIiwgX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrICkgKTsKKyAgICAgICAgS19ESUFHKCAxLCAoICJfX2ttcF9hZmZpbml0eV9ncmFuICAgICAgICAgPT0gJWRcbiIsIF9fa21wX2FmZmluaXR5X2dyYW4gICAgICAgICApICk7CisKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9kZWZhdWx0KTsKKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdICE9IHByb2NfYmluZF9kZWZhdWx0ICk7CisjIGVuZGlmCisgICAgfQorCisjZW5kaWYgLyogS01QX0FGRklOSVRZX1NVUFBPUlRFRCAqLworCisgICAgaWYgKCBfX2ttcF92ZXJzaW9uICkgeworICAgICAgICBfX2ttcF9wcmludF92ZXJzaW9uXzEoKTsKKyAgICB9OyAvLyBpZgorCisgICAgLy8gUG9zdC1pbml0aWFsaXphdGlvbiBzdGVwOiBzb21lIGVudi4gdmFycyBuZWVkIHRoZWlyIHZhbHVlJ3MgZnVydGhlciBwcm9jZXNzaW5nCisgICAgaWYgKCBzdHJpbmcgIT0gTlVMTCkgeyAvLyBrbXBfc2V0X2RlZmF1bHRzKCkgd2FzIGNhbGxlZAorICAgICAgICBfX2ttcF9hdXhfZW52X2luaXRpYWxpemUoICZibG9jayApOworICAgIH0KKworICAgIF9fa21wX2Vudl9ibGtfZnJlZSggJiBibG9jayApOworCisgICAgS01QX01CKCk7CisKK30gLy8gX19rbXBfZW52X2luaXRpYWxpemUKKworCit2b2lkCitfX2ttcF9lbnZfcHJpbnQoKSB7CisKKyAgICBrbXBfZW52X2Jsa190IGJsb2NrOworICAgIGludCAgICAgICAgICAgaTsKKyAgICBrbXBfc3RyX2J1Zl90IGJ1ZmZlcjsKKworICAgIF9fa21wX3N0Z19pbml0KCk7CisgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmIGJ1ZmZlciApOworCisgICAgX19rbXBfZW52X2Jsa19pbml0KCAmIGJsb2NrLCBOVUxMICk7CisgICAgX19rbXBfZW52X2Jsa19zb3J0KCAmIGJsb2NrICk7CisKKyAgICAvLyBQcmludCByZWFsIGVudmlyb25tZW50IHZhbHVlcy4KKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIlxuJXNcblxuIiwgS01QX0kxOE5fU1RSKCBVc2VyU2V0dGluZ3MgKSAgKTsKKyAgICBmb3IgKCBpID0gMDsgaSA8IGJsb2NrLmNvdW50OyArKyBpICkgeworICAgICAgICBjaGFyIGNvbnN0ICogbmFtZSAgPSBibG9jay52YXJzWyBpIF0ubmFtZTsKKyAgICAgICAgY2hhciBjb25zdCAqIHZhbHVlID0gYmxvY2sudmFyc1sgaSBdLnZhbHVlOworICAgICAgICBpZiAoCisgICAgICAgICAgICAoIEtNUF9TVFJMRU4oIG5hbWUgKSA+IDQgJiYgc3RybmNtcCggbmFtZSwgIktNUF8iLCA0ICkgPT0gMCApCisgICAgICAgICAgICB8fCBzdHJuY21wKCBuYW1lLCAiT01QXyIsIDQgKSA9PSAwCisgICAgICAgICAgICAjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgICAgICAgICAgICAgfHwgc3RybmNtcCggbmFtZSwgIkdPTVBfIiwgNSApID09IDAKKyAgICAgICAgICAgICNlbmRpZiAvLyBLTVBfR09NUF9DT01QQVQKKyAgICAgICAgKSB7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIiAgICVzPSVzXG4iLCBuYW1lLCB2YWx1ZSApOworICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGZvcgorICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiXG4iICk7CisKKyAgICAvLyBQcmludCBpbnRlcm5hbCAoZWZmZWN0aXZlKSBzZXR0aW5ncy4KKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIiVzXG5cbiIsIEtNUF9JMThOX1NUUiggRWZmZWN0aXZlU2V0dGluZ3MgKSApOworICAgIGZvciAoIGludCBpID0gMDsgaSA8IF9fa21wX3N0Z19jb3VudDsgKysgaSApIHsKKyAgICAgICAgaWYgKCAgX19rbXBfc3RnX3RhYmxlWyBpIF0ucHJpbnQgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIF9fa21wX3N0Z190YWJsZVsgaSBdLnByaW50KCAmIGJ1ZmZlciwgX19rbXBfc3RnX3RhYmxlWyBpIF0ubmFtZSwgX19rbXBfc3RnX3RhYmxlWyBpIF0uZGF0YSApOworICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGZvcgorCisgICAgX19rbXBfcHJpbnRmKCAiJXMiLCBidWZmZXIuc3RyICk7CisKKyAgICBfX2ttcF9lbnZfYmxrX2ZyZWUoICYgYmxvY2sgKTsKKyAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoICYgYnVmZmVyICk7CisKKyAgICBfX2ttcF9wcmludGYoIlxuIik7CisKK30gLy8gX19rbXBfZW52X3ByaW50CisKKworI2lmIE9NUF80MF9FTkFCTEVECit2b2lkCitfX2ttcF9lbnZfcHJpbnRfMigpIHsKKworICAgIGttcF9lbnZfYmxrX3QgYmxvY2s7CisgICAga21wX3N0cl9idWZfdCBidWZmZXI7CisKKyAgICBfX2ttcF9lbnZfZm9ybWF0ID0gMTsKKworICAgIF9fa21wX3N0Z19pbml0KCk7CisgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmIGJ1ZmZlciApOworCisgICAgX19rbXBfZW52X2Jsa19pbml0KCAmIGJsb2NrLCBOVUxMICk7CisgICAgX19rbXBfZW52X2Jsa19zb3J0KCAmIGJsb2NrICk7CisKKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIlxuJXNcbiIsIEtNUF9JMThOX1NUUiggRGlzcGxheUVudkJlZ2luICkgICk7CisgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIgICBfT1BFTk1QPSclZCdcbiIsIF9fa21wX29wZW5tcF92ZXJzaW9uICk7CisKKyAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBfX2ttcF9zdGdfY291bnQ7ICsrIGkgKSB7CisgICAgICAgIGlmICggIF9fa21wX3N0Z190YWJsZVsgaSBdLnByaW50ICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgKCAoIF9fa21wX2Rpc3BsYXlfZW52ICYmIHN0cm5jbXAoIF9fa21wX3N0Z190YWJsZVsgaSBdLm5hbWUsICJPTVBfIiwgNCApID09IDAgKSB8fCBfX2ttcF9kaXNwbGF5X2Vudl92ZXJib3NlICkgKSB7CisgICAgICAgICAgICBfX2ttcF9zdGdfdGFibGVbIGkgXS5wcmludCggJiBidWZmZXIsIF9fa21wX3N0Z190YWJsZVsgaSBdLm5hbWUsIF9fa21wX3N0Z190YWJsZVsgaSBdLmRhdGEgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBmb3IKKworICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiJXNcbiIsIEtNUF9JMThOX1NUUiggRGlzcGxheUVudkVuZCApICApOworICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiXG4iICk7CisKKyAgICBfX2ttcF9wcmludGYoICIlcyIsIGJ1ZmZlci5zdHIgKTsKKworICAgIF9fa21wX2Vudl9ibGtfZnJlZSggJiBibG9jayApOworICAgIF9fa21wX3N0cl9idWZfZnJlZSggJiBidWZmZXIgKTsKKworICAgIF9fa21wX3ByaW50ZigiXG4iKTsKKworfSAvLyBfX2ttcF9lbnZfcHJpbnRfMgorI2VuZGlmIC8vIE9NUF80MF9FTkFCTEVECisKKy8vIGVuZCBvZiBmaWxlCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zZXR0aW5ncy5oIGIvZmluYWwvcnVudGltZS9zcmMva21wX3NldHRpbmdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIzMmU2MQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zZXR0aW5ncy5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBrbXBfc2V0dGluZ3MuaCAtLSBJbml0aWFsaXplIGVudmlyb25tZW50IHZhcmlhYmxlcworICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIEtNUF9TRVRUSU5HU19ICisjZGVmaW5lIEtNUF9TRVRUSU5HU19ICisKK3ZvaWQgX19rbXBfcmVzZXRfZ2xvYmFsX3ZhcnMoIHZvaWQgKTsKK3ZvaWQgX19rbXBfZW52X2luaXRpYWxpemUoIGNoYXIgY29uc3QgKiApOwordm9pZCBfX2ttcF9lbnZfcHJpbnQoKTsKKyNpZiBPTVBfNDBfRU5BQkxFRAordm9pZCBfX2ttcF9lbnZfcHJpbnRfMigpOworI2VuZGlmIC8vIE9NUF80MF9FTkFCTEVECisKK2ludCBfX2ttcF9pbml0aWFsX3RocmVhZHNfY2FwYWNpdHkoIGludCByZXFfbnByb2MgKTsKK3ZvaWQgX19rbXBfaW5pdF9kZmx0X3RlYW1fbnRoKCk7CitpbnQgX19rbXBfY29udmVydF90b19taWxsaXNlY29uZHMoIGNoYXIgY29uc3QgKiApOworaW50IF9fa21wX2RlZmF1bHRfdHBfY2FwYWNpdHkoIGludCwgaW50LCBpbnQpOworCisjaWYgS01QX01JQworI2RlZmluZSBLTVBfU1RSX0JVRl9QUklOVF9OQU1FICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgJXMgJXMiLCBLTVBfSTE4Tl9TVFIoRGV2aWNlKSwgbmFtZSApCisjZGVmaW5lIEtNUF9TVFJfQlVGX1BSSU5UX05BTUVfRVgoeCkgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAlcyAlcz0nIiwgS01QX0kxOE5fU1RSKERldmljZSksIHggKQorI2RlZmluZSBLTVBfU1RSX0JVRl9QUklOVF9CT09MICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgJXMgJXM9JyVzJ1xuIiwgS01QX0kxOE5fU1RSKERldmljZSksIG5hbWUsIHZhbHVlID8gIlRSVUUiIDogIkZBTFNFIiApOworI2RlZmluZSBLTVBfU1RSX0JVRl9QUklOVF9JTlQgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgJXMgJXM9JyVkJ1xuIiwgS01QX0kxOE5fU1RSKERldmljZSksIG5hbWUsIHZhbHVlICkKKyNkZWZpbmUgS01QX1NUUl9CVUZfUFJJTlRfVUlOVDY0ICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICVzICVzPSclIiBLTVBfVUlOVDY0X1NQRUMgIidcbiIsIEtNUF9JMThOX1NUUihEZXZpY2UpLCBuYW1lLCB2YWx1ZSApOworI2RlZmluZSBLTVBfU1RSX0JVRl9QUklOVF9TVFIgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgJXMgJXM9JyVzJ1xuIiwgS01QX0kxOE5fU1RSKERldmljZSksIG5hbWUsIHZhbHVlICkKKyNlbHNlCisjZGVmaW5lIEtNUF9TVFJfQlVGX1BSSU5UX05BTUUgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAlcyAlcyIsIEtNUF9JMThOX1NUUihIb3N0KSwgbmFtZSApCisjZGVmaW5lIEtNUF9TVFJfQlVGX1BSSU5UX05BTUVfRVgoeCkgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAlcyAlcz0nIiwgS01QX0kxOE5fU1RSKEhvc3QpLCB4ICkKKyNkZWZpbmUgS01QX1NUUl9CVUZfUFJJTlRfQk9PTCAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICVzICVzPSclcydcbiIsIEtNUF9JMThOX1NUUihIb3N0KSwgbmFtZSwgdmFsdWUgPyAiVFJVRSIgOiAiRkFMU0UiICk7CisjZGVmaW5lIEtNUF9TVFJfQlVGX1BSSU5UX0lOVCAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAlcyAlcz0nJWQnXG4iLCBLTVBfSTE4Tl9TVFIoSG9zdCksIG5hbWUsIHZhbHVlICkKKyNkZWZpbmUgS01QX1NUUl9CVUZfUFJJTlRfVUlOVDY0ICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICVzICVzPSclIiBLTVBfVUlOVDY0X1NQRUMgIidcbiIsIEtNUF9JMThOX1NUUihIb3N0KSwgbmFtZSwgdmFsdWUgKTsKKyNkZWZpbmUgS01QX1NUUl9CVUZfUFJJTlRfU1RSICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICVzICVzPSclcydcbiIsIEtNUF9JMThOX1NUUihIb3N0KSwgbmFtZSwgdmFsdWUgKQorI2VuZGlmCisKKyNlbmRpZiAvLyBLTVBfU0VUVElOR1NfSAorCisvLyBlbmQgb2YgZmlsZSAvLworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfc3RhdHMuY3BwIGIvZmluYWwvcnVudGltZS9zcmMva21wX3N0YXRzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWY0M2FmCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX3N0YXRzLmNwcApAQCAtMCwwICsxLDYwOSBAQAorLyoqIEBmaWxlIGttcF9zdGF0cy5jcHAKKyAqIFN0YXRpc3RpY3MgZ2F0aGVyaW5nIGFuZCBwcm9jZXNzaW5nLgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9zdHIuaCIKKyNpbmNsdWRlICJrbXBfbG9jay5oIgorI2luY2x1ZGUgImttcF9zdGF0cy5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8aW9tYW5pcD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBhdGV4aXQKKworI2RlZmluZSBTVFJJTkdJWkUyKHgpICN4CisjZGVmaW5lIFNUUklOR0laRSh4KSBTVFJJTkdJWkUyKHgpCisKKyNkZWZpbmUgZXhwYW5kTmFtZShuYW1lLGZsYWdzLGlnbm9yZSkgIHtTVFJJTkdJWkUobmFtZSksZmxhZ3N9LAorc3RhdEluZm8gdGltZVN0YXQ6OnRpbWVySW5mb1tdID0geworICAgIEtNUF9GT1JFQUNIX1RJTUVSKGV4cGFuZE5hbWUsMCkKKyAgICB7MCwwfQorfTsKK2NvbnN0IHN0YXRJbmZvIGNvdW50ZXI6OmNvdW50ZXJJbmZvW10gPSB7CisgICAgS01QX0ZPUkVBQ0hfQ09VTlRFUihleHBhbmROYW1lLDApCisgICAgezAsMH0KK307CisjdW5kZWYgZXhwYW5kTmFtZQorCisjZGVmaW5lIGV4cGFuZE5hbWUoaWdub3JlMSxpZ25vcmUyLGlnbm9yZTMpICB7MC4wLDAuMCwwLjB9LAora21wX3N0YXRzX291dHB1dF9tb2R1bGU6OnJnYl9jb2xvciBrbXBfc3RhdHNfb3V0cHV0X21vZHVsZTo6dGltZXJDb2xvckluZm9bXSA9IHsKKyAgICBLTVBfRk9SRUFDSF9USU1FUihleHBhbmROYW1lLDApCisgICAgezAuMCwwLjAsMC4wfQorfTsKKyN1bmRlZiBleHBhbmROYW1lCisKK2NvbnN0IGttcF9zdGF0c19vdXRwdXRfbW9kdWxlOjpyZ2JfY29sb3Iga21wX3N0YXRzX291dHB1dF9tb2R1bGU6Omdsb2JhbENvbG9yQXJyYXlbXSA9IHsKKyAgICB7MS4wLCAwLjAsIDAuMH0sIC8vIHJlZAorICAgIHsxLjAsIDAuNiwgMC4wfSwgLy8gb3JhbmdlCisgICAgezEuMCwgMS4wLCAwLjB9LCAvLyB5ZWxsb3cKKyAgICB7MC4wLCAxLjAsIDAuMH0sIC8vIGdyZWVuIAorICAgIHswLjAsIDAuMCwgMS4wfSwgLy8gYmx1ZQorICAgIHswLjYsIDAuMiwgMC44fSwgLy8gcHVycGxlCisgICAgezEuMCwgMC4wLCAxLjB9LCAvLyBtYWdlbnRhCisgICAgezAuMCwgMC40LCAwLjJ9LCAvLyBkYXJrIGdyZWVuCisgICAgezEuMCwgMS4wLCAwLjZ9LCAvLyBsaWdodCB5ZWxsb3cKKyAgICB7MC42LCAwLjQsIDAuNn0sIC8vIGRpcnR5IHB1cnBsZQorICAgIHswLjAsIDEuMCwgMS4wfSwgLy8gY3lhbgorICAgIHsxLjAsIDAuNCwgMC44fSwgLy8gcGluaworICAgIHswLjUsIDAuNSwgMC41fSwgLy8gZ3JleQorICAgIHswLjgsIDAuNywgMC41fSwgLy8gYnJvd24KKyAgICB7MC42LCAwLjYsIDEuMH0sIC8vIGxpZ2h0IGJsdWUKKyAgICB7MS4wLCAwLjcsIDAuNX0sIC8vIHBlYWNoCisgICAgezAuOCwgMC41LCAxLjB9LCAvLyBsYXZlbmRlcgorICAgIHswLjYsIDAuMCwgMC4wfSwgLy8gZGFyayByZWQKKyAgICB7MC43LCAwLjYsIDAuMH0sIC8vIGdvbGQKKyAgICB7MC4wLCAwLjAsIDAuMH0gIC8vIGJsYWNrCit9OworCisvLyBFbnN1cmUgdGhhdCB0aGUgYXRleGl0IGhhbmRsZXIgb25seSBydW5zIG9uY2UuCitzdGF0aWMgdWludDMyX3Qgc3RhdHNQcmludGVkID0gMDsKKworLy8gb3V0cHV0IGludGVyZmFjZQorc3RhdGljIGttcF9zdGF0c19vdXRwdXRfbW9kdWxlIF9fa21wX3N0YXRzX2dsb2JhbF9vdXRwdXQ7CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKioqKioqKioqKioqKiBzdGF0aXN0aWMgbWVtYmVyIGZ1bmN0aW9ucyAqKioqKioqKioqKioqICovCisKK3ZvaWQgc3RhdGlzdGljOjphZGRTYW1wbGUoZG91YmxlIHNhbXBsZSkKK3sKKyAgICBkb3VibGUgZGVsdGEgPSBzYW1wbGUgLSBtZWFuVmFsOworCisgICAgc2FtcGxlQ291bnQgPSBzYW1wbGVDb3VudCArIDE7CisgICAgbWVhblZhbCAgICAgPSBtZWFuVmFsICsgZGVsdGEvc2FtcGxlQ291bnQ7CisgICAgbTIgICAgICAgICAgPSBtMiArIGRlbHRhKihzYW1wbGUgLSBtZWFuVmFsKTsKKworICAgIG1pblZhbCA9IHN0ZDo6bWluKG1pblZhbCwgc2FtcGxlKTsKKyAgICBtYXhWYWwgPSBzdGQ6Om1heChtYXhWYWwsIHNhbXBsZSk7Cit9CisKK3N0YXRpc3RpYyAmIHN0YXRpc3RpYzo6b3BlcmF0b3IrPSAoY29uc3Qgc3RhdGlzdGljICYgb3RoZXIpCit7CisgICAgaWYgKHNhbXBsZUNvdW50ID09IDApCisgICAgeworICAgICAgICAqdGhpcyA9IG90aGVyOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgdWludDY0X3QgbmV3U2FtcGxlQ291bnQgPSBzYW1wbGVDb3VudCArIG90aGVyLnNhbXBsZUNvdW50OworICAgIGRvdWJsZSBkbnNjICA9IGRvdWJsZShuZXdTYW1wbGVDb3VudCk7CisgICAgZG91YmxlIGRzYyAgID0gZG91YmxlKHNhbXBsZUNvdW50KTsKKyAgICBkb3VibGUgZHNjQnlkbnNjID0gZHNjL2Ruc2M7CisgICAgZG91YmxlIGRvc2MgID0gZG91YmxlKG90aGVyLnNhbXBsZUNvdW50KTsKKyAgICBkb3VibGUgZGVsdGEgPSBvdGhlci5tZWFuVmFsIC0gbWVhblZhbDsKKworICAgIC8vIFRyeSB0byBvcmRlciB0aGVzZSBjYWxjdWxhdGlvbnMgdG8gYXZvaWQgb3ZlcmZsb3dzLgorICAgIC8vIElmIHRoaXMgd2VyZSBGb3J0cmFuLCB0aGVuIHRoZSBjb21waWxlciB3b3VsZCBub3QgYmUgYWJsZSB0byByZS1vcmRlciBvdmVyIGJyYWNrZXRzLgorICAgIC8vIEluIEMrKyBpdCBtYXkgYmUgbGVnYWwgdG8gZG8gdGhhdCAod2UgY2VydGFpbmx5IGhvcGUgaXQgZG9lc24ndCwgYW5kIENDKyBQcm9ncmFtbWluZyBMYW5ndWFnZSAybmQgZWRpdGlvbgorICAgIC8vIHN1Z2dlc3RzIGl0IHNob3VsZG4ndCwgc2luY2UgaXQgc2F5cyB0aGF0IGV4cGxvaXRhdGlvbiBvZiBhc3NvY2lhdGl2aXR5IGNhbiBvbmx5IGJlIG1hZGUgaWYgdGhlIG9wZXJhdGlvbgorICAgIC8vIHJlYWxseSBpcyBhc3NvY2lhdGl2ZSAod2hpY2ggZmxvYXRpbmcgYWRkaXRpb24gaXNuJ3QuLi4pKS4KKyAgICBtZWFuVmFsICAgICA9IG1lYW5WYWwqZHNjQnlkbnNjICsgb3RoZXIubWVhblZhbCooMS1kc2NCeWRuc2MpOworICAgIG0yICAgICAgICAgID0gbTIgKyBvdGhlci5tMiArIGRzY0J5ZG5zYypkb3NjKmRlbHRhKmRlbHRhOworICAgIG1pblZhbCAgICAgID0gc3RkOjptaW4gKG1pblZhbCwgb3RoZXIubWluVmFsKTsKKyAgICBtYXhWYWwgICAgICA9IHN0ZDo6bWF4IChtYXhWYWwsIG90aGVyLm1heFZhbCk7CisgICAgc2FtcGxlQ291bnQgPSBuZXdTYW1wbGVDb3VudDsKKworCisgICAgcmV0dXJuICp0aGlzOworfQorCit2b2lkIHN0YXRpc3RpYzo6c2NhbGUoZG91YmxlIGZhY3RvcikKK3sKKyAgICBtaW5WYWwgPSBtaW5WYWwqZmFjdG9yOworICAgIG1heFZhbCA9IG1heFZhbCpmYWN0b3I7CisgICAgbWVhblZhbD0gbWVhblZhbCpmYWN0b3I7CisgICAgbTIgICAgID0gbTIqZmFjdG9yKmZhY3RvcjsKKyAgICByZXR1cm47Cit9CisKK3N0ZDo6c3RyaW5nIHN0YXRpc3RpYzo6Zm9ybWF0KGNoYXIgdW5pdCwgYm9vbCB0b3RhbCkgY29uc3QKK3sKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQgPSBmb3JtYXRTSShzYW1wbGVDb3VudCw5LCcgJyk7CisKKyAgICByZXN1bHQgPSByZXN1bHQgKyBzdGQ6OnN0cmluZygiLCAiKSArIGZvcm1hdFNJKG1pblZhbCwgIDksIHVuaXQpOworICAgIHJlc3VsdCA9IHJlc3VsdCArIHN0ZDo6c3RyaW5nKCIsICIpICsgZm9ybWF0U0kobWVhblZhbCwgOSwgdW5pdCk7CisgICAgcmVzdWx0ID0gcmVzdWx0ICsgc3RkOjpzdHJpbmcoIiwgIikgKyBmb3JtYXRTSShtYXhWYWwsICA5LCB1bml0KTsKKyAgICBpZiAodG90YWwpCisgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIHN0ZDo6c3RyaW5nKCIsICIpICsgZm9ybWF0U0kobWVhblZhbCpzYW1wbGVDb3VudCwgOSwgdW5pdCk7CisgICAgcmVzdWx0ID0gcmVzdWx0ICsgc3RkOjpzdHJpbmcoIiwgIikgKyBmb3JtYXRTSShnZXRTRCgpLCA5LCB1bml0KTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICoqKioqKioqKioqKiogZXhwbGljaXRUaW1lciBtZW1iZXIgZnVuY3Rpb25zICoqKioqKioqKioqKiogKi8KKwordm9pZCBleHBsaWNpdFRpbWVyOjpzdGFydCh0aW1lcl9lIHRpbWVyRW51bVZhbHVlKSB7IAorICAgIHN0YXJ0VGltZSA9IHRzY190aWNrX2NvdW50Ojpub3coKTsgCisgICAgaWYodGltZVN0YXQ6OmxvZ0V2ZW50KHRpbWVyRW51bVZhbHVlKSkgeworICAgICAgICBfX2ttcF9zdGF0c190aHJlYWRfcHRyLT5pbmNyZW1lbnROZXN0VmFsdWUoKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCit2b2lkIGV4cGxpY2l0VGltZXI6OnN0b3AodGltZXJfZSB0aW1lckVudW1WYWx1ZSkgeworICAgIGlmIChzdGFydFRpbWUuZ2V0VmFsdWUoKSA9PSAwKQorICAgICAgICByZXR1cm47CisKKyAgICB0c2NfdGlja19jb3VudCBmaW5pc2hUaW1lID0gdHNjX3RpY2tfY291bnQ6Om5vdygpOworCisgICAgLy9zdGF0LT5hZGRTYW1wbGUgKCh0c2NfdGlja19jb3VudDo6bm93KCkgLSBzdGFydFRpbWUpLnRpY2tzKCkpOworICAgIHN0YXQtPmFkZFNhbXBsZSAoKGZpbmlzaFRpbWUgLSBzdGFydFRpbWUpLnRpY2tzKCkpOworCisgICAgaWYodGltZVN0YXQ6OmxvZ0V2ZW50KHRpbWVyRW51bVZhbHVlKSkgeworICAgICAgICBfX2ttcF9zdGF0c190aHJlYWRfcHRyLT5wdXNoX2V2ZW50KHN0YXJ0VGltZS5nZXRWYWx1ZSgpIC0gX19rbXBfc3RhdHNfc3RhcnRfdGltZS5nZXRWYWx1ZSgpLCBmaW5pc2hUaW1lLmdldFZhbHVlKCkgLSBfX2ttcF9zdGF0c19zdGFydF90aW1lLmdldFZhbHVlKCksIF9fa21wX3N0YXRzX3RocmVhZF9wdHItPmdldE5lc3RWYWx1ZSgpLCB0aW1lckVudW1WYWx1ZSk7IAorICAgICAgICBfX2ttcF9zdGF0c190aHJlYWRfcHRyLT5kZWNyZW1lbnROZXN0VmFsdWUoKTsKKyAgICB9CisKKyAgICAvKiBXZSBhY2NlcHQgdGhlIHJpc2sgdGhhdCB3ZSBkcm9wIGEgc2FtcGxlIGJlY2F1c2UgaXQgcmVhbGx5IGRpZCBzdGFydCBhdCB0PT0wLiAqLworICAgIHN0YXJ0VGltZSA9IDA7IAorICAgIHJldHVybjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKioqKioqKioqKioqKiBrbXBfc3RhdHNfZXZlbnRfdmVjdG9yIG1lbWJlciBmdW5jdGlvbnMgKioqKioqKioqKioqKiAqLworCit2b2lkIGttcF9zdGF0c19ldmVudF92ZWN0b3I6OmRlYWxsb2NhdGUoKSB7CisgICAgX19rbXBfZnJlZShldmVudHMpOworICAgIGludGVybmFsX3NpemUgPSAwOworICAgIGFsbG9jYXRlZF9zaXplID0gMDsKKyAgICBldmVudHMgPSBOVUxMOworfQorCisvLyBUaGlzIGZ1bmN0aW9uIGlzIGZvciBxc29ydCgpIHdoaWNoIHJlcXVpcmVzIHRoZSBjb21wYXJlIGZ1bmN0aW9uIHRvIHJldHVybgorLy8gZWl0aGVyIGEgbmVnYXRpdmUgbnVtYmVyIGlmIGV2ZW50MSA8IGV2ZW50MiwgYSBwb3NpdGl2ZSBudW1iZXIgaWYgZXZlbnQxID4gZXZlbnQyCisvLyBvciB6ZXJvIGlmIGV2ZW50MSA9PSBldmVudDIuICAKKy8vIFRoaXMgc29ydHMgYnkgc3RhcnQgdGltZSAobG93ZXN0IHRvIGhpZ2hlc3QpLgoraW50IGNvbXBhcmVfdHdvX2V2ZW50cyhjb25zdCB2b2lkKiBldmVudDEsIGNvbnN0IHZvaWQqIGV2ZW50MikgeworICAgIGttcF9zdGF0c19ldmVudCogZXYxID0gKGttcF9zdGF0c19ldmVudCopZXZlbnQxOworICAgIGttcF9zdGF0c19ldmVudCogZXYyID0gKGttcF9zdGF0c19ldmVudCopZXZlbnQyOworCisgICAgaWYoZXYxLT5nZXRTdGFydCgpIDwgZXYyLT5nZXRTdGFydCgpKSByZXR1cm4gLTE7CisgICAgZWxzZSBpZihldjEtPmdldFN0YXJ0KCkgPiBldjItPmdldFN0YXJ0KCkpIHJldHVybiAxOworICAgIGVsc2UgcmV0dXJuIDA7Cit9CisKK3ZvaWQga21wX3N0YXRzX2V2ZW50X3ZlY3Rvcjo6c29ydCgpIHsKKyAgICBxc29ydChldmVudHMsIGludGVybmFsX3NpemUsIHNpemVvZihrbXBfc3RhdHNfZXZlbnQpLCBjb21wYXJlX3R3b19ldmVudHMpOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKioqKioqKioqKioqKiBrbXBfc3RhdHNfbGlzdCBtZW1iZXIgZnVuY3Rpb25zICoqKioqKioqKioqKiogKi8KKworLy8gcmV0dXJucyBhIHBvaW50ZXIgdG8gbmV3bHkgY3JlYXRlZCBzdGF0cyBub2RlCitrbXBfc3RhdHNfbGlzdCoga21wX3N0YXRzX2xpc3Q6OnB1c2hfYmFjayhpbnQgZ3RpZCkgeyAKKyAgICBrbXBfc3RhdHNfbGlzdCogbmV3bm9kZSA9IChrbXBfc3RhdHNfbGlzdCopX19rbXBfYWxsb2NhdGUoc2l6ZW9mKGttcF9zdGF0c19saXN0KSk7CisgICAgLy8gcGxhY2VtZW50IG5ldywgb25seSByZXF1aXJlcyBzcGFjZSBhbmQgcG9pbnRlciBhbmQgaW5pdGlhbGl6ZXMgKHNvIF9fa21wX2FsbG9jYXRlIGluc3RlYWQgb2YgQysrIG5ld1tdIGlzIHVzZWQpCisgICAgbmV3IChuZXdub2RlKSBrbXBfc3RhdHNfbGlzdCgpOworICAgIG5ld25vZGUtPnNldEd0aWQoZ3RpZCk7CisgICAgbmV3bm9kZS0+cHJldiA9IHRoaXMtPnByZXY7CisgICAgbmV3bm9kZS0+bmV4dCA9IHRoaXM7CisgICAgbmV3bm9kZS0+cHJldi0+bmV4dCA9IG5ld25vZGU7CisgICAgbmV3bm9kZS0+bmV4dC0+cHJldiA9IG5ld25vZGU7CisgICAgcmV0dXJuIG5ld25vZGU7Cit9Cit2b2lkIGttcF9zdGF0c19saXN0OjpkZWFsbG9jYXRlKCkgeworICAgIGttcF9zdGF0c19saXN0KiBwdHIgPSB0aGlzLT5uZXh0OworICAgIGttcF9zdGF0c19saXN0KiBkZWxwdHIgPSB0aGlzLT5uZXh0OworICAgIHdoaWxlKHB0ciAhPSB0aGlzKSB7CisgICAgICAgIGRlbHB0ciA9IHB0cjsKKyAgICAgICAgcHRyPXB0ci0+bmV4dDsKKyAgICAgICAgLy8gcGxhY2VtZW50IG5ldyBtZWFucyB3ZSBoYXZlIHRvIGV4cGxpY2l0bHkgY2FsbCBkZXN0cnVjdG9yLgorICAgICAgICBkZWxwdHItPl9ldmVudF92ZWN0b3IuZGVhbGxvY2F0ZSgpOworICAgICAgICBkZWxwdHItPn5rbXBfc3RhdHNfbGlzdCgpOworICAgICAgICBfX2ttcF9mcmVlKGRlbHB0cik7CisgICAgfQorfQora21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yIGttcF9zdGF0c19saXN0OjpiZWdpbigpIHsKKyAgICBrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3IgaXQ7CisgICAgaXQucHRyID0gdGhpcy0+bmV4dDsKKyAgICByZXR1cm4gaXQ7Cit9CitrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3Iga21wX3N0YXRzX2xpc3Q6OmVuZCgpIHsKKyAgICBrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3IgaXQ7CisgICAgaXQucHRyID0gdGhpczsKKyAgICByZXR1cm4gaXQ7Cit9CitpbnQga21wX3N0YXRzX2xpc3Q6OnNpemUoKSB7CisgICAgaW50IHJldHZhbDsKKyAgICBrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3IgaXQ7CisgICAgZm9yKHJldHZhbD0wLCBpdD1iZWdpbigpOyBpdCE9ZW5kKCk7IGl0KyssIHJldHZhbCsrKSB7fQorICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKioqKioqKioqKioqKiBrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3IgbWVtYmVyIGZ1bmN0aW9ucyAqKioqKioqKioqKioqICovCisKK2ttcF9zdGF0c19saXN0OjppdGVyYXRvcjo6aXRlcmF0b3IoKSA6IHB0cihOVUxMKSB7fSAKK2ttcF9zdGF0c19saXN0OjppdGVyYXRvcjo6fml0ZXJhdG9yKCkge30KK2ttcF9zdGF0c19saXN0OjppdGVyYXRvciBrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3I6Om9wZXJhdG9yKysoKSB7CisgICAgdGhpcy0+cHRyID0gdGhpcy0+cHRyLT5uZXh0OworICAgIHJldHVybiAqdGhpczsKK30KK2ttcF9zdGF0c19saXN0OjppdGVyYXRvciBrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3I6Om9wZXJhdG9yKysoaW50IGR1bW15KSB7CisgICAgdGhpcy0+cHRyID0gdGhpcy0+cHRyLT5uZXh0OworICAgIHJldHVybiAqdGhpczsKK30KK2ttcF9zdGF0c19saXN0OjppdGVyYXRvciBrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3I6Om9wZXJhdG9yLS0oKSB7CisgICAgdGhpcy0+cHRyID0gdGhpcy0+cHRyLT5wcmV2OworICAgIHJldHVybiAqdGhpczsKK30KK2ttcF9zdGF0c19saXN0OjppdGVyYXRvciBrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3I6Om9wZXJhdG9yLS0oaW50IGR1bW15KSB7CisgICAgdGhpcy0+cHRyID0gdGhpcy0+cHRyLT5wcmV2OworICAgIHJldHVybiAqdGhpczsKK30KK2Jvb2wga21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yOjpvcGVyYXRvciE9KGNvbnN0IGttcF9zdGF0c19saXN0OjppdGVyYXRvciAmIHJocykgeworICAgcmV0dXJuIHRoaXMtPnB0ciE9cmhzLnB0cjsgCit9Citib29sIGttcF9zdGF0c19saXN0OjppdGVyYXRvcjo6b3BlcmF0b3I9PShjb25zdCBrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3IgJiByaHMpIHsKKyAgIHJldHVybiB0aGlzLT5wdHI9PXJocy5wdHI7IAorfQora21wX3N0YXRzX2xpc3QqIGttcF9zdGF0c19saXN0OjppdGVyYXRvcjo6b3BlcmF0b3IqKCkgY29uc3QgeworICAgIHJldHVybiB0aGlzLT5wdHI7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKioqKioqKioqKioqKiAga21wX3N0YXRzX291dHB1dF9tb2R1bGUgZnVuY3Rpb25zICoqKioqKioqKioqKioqICovCisKK2NvbnN0IGNoYXIqIGttcF9zdGF0c19vdXRwdXRfbW9kdWxlOjpvdXRwdXRGaWxlTmFtZSA9IE5VTEw7Citjb25zdCBjaGFyKiBrbXBfc3RhdHNfb3V0cHV0X21vZHVsZTo6ZXZlbnRzRmlsZU5hbWUgPSBOVUxMOworY29uc3QgY2hhcioga21wX3N0YXRzX291dHB1dF9tb2R1bGU6OnBsb3RGaWxlTmFtZSAgID0gTlVMTDsKK2ludCBrbXBfc3RhdHNfb3V0cHV0X21vZHVsZTo6cHJpbnRQZXJUaHJlYWRGbGFnICAgICAgID0gMDsKK2ludCBrbXBfc3RhdHNfb3V0cHV0X21vZHVsZTo6cHJpbnRQZXJUaHJlYWRFdmVudHNGbGFnID0gMDsKKworLy8gaW5pdCgpIGlzIGNhbGxlZCB2ZXJ5IG5lYXIgdGhlIGJlZ2lubmluZyBvZiBleGVjdXRpb24gdGltZSBpbiB0aGUgY29uc3RydWN0b3Igb2YgX19rbXBfc3RhdHNfZ2xvYmFsX291dHB1dAordm9pZCBrbXBfc3RhdHNfb3V0cHV0X21vZHVsZTo6aW5pdCgpIAoreworICAgIGNoYXIgKiBzdGF0c0ZpbGVOYW1lICA9IGdldGVudigiS01QX1NUQVRTX0ZJTEUiKTsKKyAgICBldmVudHNGaWxlTmFtZSAgICAgICAgPSBnZXRlbnYoIktNUF9TVEFUU19FVkVOVFNfRklMRSIpOworICAgIHBsb3RGaWxlTmFtZSAgICAgICAgICA9IGdldGVudigiS01QX1NUQVRTX1BMT1RfRklMRSIpOworICAgIGNoYXIgKiB0aHJlYWRTdGF0cyAgICA9IGdldGVudigiS01QX1NUQVRTX1RIUkVBRFMiKTsKKyAgICBjaGFyICogdGhyZWFkRXZlbnRzICAgPSBnZXRlbnYoIktNUF9TVEFUU19FVkVOVFMiKTsKKworICAgIC8vIHNldCB0aGUgc3RhdHMgb3V0cHV0IGZpbGVuYW1lcyBiYXNlZCBvbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYW5kIGRlZmF1bHRzCisgICAgb3V0cHV0RmlsZU5hbWUgPSBzdGF0c0ZpbGVOYW1lOworICAgIGV2ZW50c0ZpbGVOYW1lID0gZXZlbnRzRmlsZU5hbWUgPyBldmVudHNGaWxlTmFtZSA6ICJldmVudHMuZGF0IjsKKyAgICBwbG90RmlsZU5hbWUgICA9IHBsb3RGaWxlTmFtZSAgID8gcGxvdEZpbGVOYW1lICAgOiAiZXZlbnRzLnBsdCI7CisKKyAgICAvLyBzZXQgdGhlIGZsYWdzIGJhc2VkIG9uIGVudmlyb25tZW50IHZhcmlhYmxlcyBtYXRjaGluZzogdHJ1ZSwgb24sIDEsIC50cnVlLiAsIC50LiAsIHllcworICAgIHByaW50UGVyVGhyZWFkRmxhZyAgICAgICAgPSBfX2ttcF9zdHJfbWF0Y2hfdHJ1ZSh0aHJlYWRTdGF0cyk7CisgICAgcHJpbnRQZXJUaHJlYWRFdmVudHNGbGFnICA9IF9fa21wX3N0cl9tYXRjaF90cnVlKHRocmVhZEV2ZW50cyk7CisKKyAgICBpZihwcmludFBlclRocmVhZEV2ZW50c0ZsYWcpIHsKKyAgICAgICAgLy8gYXNzaWducyBhIGNvbG9yIHRvIGVhY2ggdGltZXIgZm9yIHByaW50aW5nCisgICAgICAgIHNldHVwRXZlbnRDb2xvcnMoKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyB3aWxsIGNsZWFyIGZsYWcgc28gdGhhdCBubyBldmVudCB3aWxsIGJlIGxvZ2dlZAorICAgICAgICB0aW1lU3RhdDo6Y2xlYXJFdmVudEZsYWdzKCk7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCit2b2lkIGttcF9zdGF0c19vdXRwdXRfbW9kdWxlOjpzZXR1cEV2ZW50Q29sb3JzKCkgeworICAgIGludCBpOworICAgIGludCBnbG9iYWxDb2xvckluZGV4ID0gMDsKKyAgICBpbnQgbnVtR2xvYmFsQ29sb3JzID0gc2l6ZW9mKGdsb2JhbENvbG9yQXJyYXkpIC8gc2l6ZW9mKHJnYl9jb2xvcik7CisgICAgZm9yKGk9MDtpPFRJTUVSX0xBU1Q7aSsrKSB7CisgICAgICAgIGlmKHRpbWVTdGF0Ojpsb2dFdmVudCgodGltZXJfZSlpKSkgeworICAgICAgICAgICAgdGltZXJDb2xvckluZm9baV0gPSBnbG9iYWxDb2xvckFycmF5W2dsb2JhbENvbG9ySW5kZXhdOworICAgICAgICAgICAgZ2xvYmFsQ29sb3JJbmRleCA9IChnbG9iYWxDb2xvckluZGV4KzEpJW51bUdsb2JhbENvbG9yczsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm47Cit9CisKK3ZvaWQga21wX3N0YXRzX291dHB1dF9tb2R1bGU6OnByaW50U3RhdHMoRklMRSAqc3RhdHNPdXQsIHN0YXRpc3RpYyBjb25zdCAqIHRoZVN0YXRzLCBib29sIGFyZVRpbWVycykKK3sKKyAgICBpZiAoYXJlVGltZXJzKQorICAgIHsKKyAgICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSB1c2VmdWwgdGltZXJzLCBzaW5jZSB3ZSBkb24ndCBwcmludCB6ZXJvIHZhbHVlIHRpbWVycyB3ZSBuZWVkIHRvIGF2b2lkCisgICAgICAgIC8vIHByaW50aW5nIGEgaGVhZGVyIGFuZCB0aGVuIG5vIGRhdGEuCisgICAgICAgIGJvb2wgaGF2ZVRpbWVycyA9IGZhbHNlOworICAgICAgICBmb3IgKGludCBzID0gMDsgczxUSU1FUl9MQVNUOyBzKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0aGVTdGF0c1tzXS5nZXRDb3VudCgpICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGF2ZVRpbWVycyA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFoYXZlVGltZXJzKQorICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFByaW50CisgICAgY29uc3QgY2hhciAqIHRpdGxlID0gYXJlVGltZXJzID8gIlRpbWVyLCAgICAgICAgICAgICAgICAgICBTYW1wbGVDb3VudCwiIDogIkNvdW50ZXIsICAgICAgICAgICAgICAgICBUaHJlYWRDb3VudCwiOworICAgIGZwcmludGYgKHN0YXRzT3V0LCAiJXMgICAgTWluLCAgICAgIE1lYW4sICAgICAgIE1heCwgICAgIFRvdGFsLCAgICAgICAgU0RcbiIsIHRpdGxlKTsgICAgCisgICAgaWYgKGFyZVRpbWVycykgeworICAgICAgICBmb3IgKGludCBzID0gMDsgczxUSU1FUl9MQVNUOyBzKyspIHsKKyAgICAgICAgICAgIHN0YXRpc3RpYyBjb25zdCAqIHN0YXQgPSAmdGhlU3RhdHNbc107CisgICAgICAgICAgICBpZiAoc3RhdC0+Z2V0Q291bnQoKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgY2hhciB0YWcgPSB0aW1lU3RhdDo6bm9Vbml0cyh0aW1lcl9lKHMpKSA/ICcgJyA6ICdUJzsKKyAgICAgICAgICAgICAgICBmcHJpbnRmIChzdGF0c091dCwgIiUtMjVzLCAlc1xuIiwgdGltZVN0YXQ6Om5hbWUodGltZXJfZShzKSksIHN0YXQtPmZvcm1hdCh0YWcsIHRydWUpLmNfc3RyKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsgICAvLyBDb3VudGVycworICAgICAgICBmb3IgKGludCBzID0gMDsgczxDT1VOVEVSX0xBU1Q7IHMrKykgeworICAgICAgICAgICAgc3RhdGlzdGljIGNvbnN0ICogc3RhdCA9ICZ0aGVTdGF0c1tzXTsKKyAgICAgICAgICAgIGZwcmludGYgKHN0YXRzT3V0LCAiJS0yNXMsICVzXG4iLCBjb3VudGVyOjpuYW1lKGNvdW50ZXJfZShzKSksIHN0YXQtPmZvcm1hdCgnICcsIHRydWUpLmNfc3RyKCkpOworICAgICAgICB9CisgICAgfQorfSAKKwordm9pZCBrbXBfc3RhdHNfb3V0cHV0X21vZHVsZTo6cHJpbnRDb3VudGVycyhGSUxFICogc3RhdHNPdXQsIGNvdW50ZXIgY29uc3QgKiB0aGVDb3VudGVycykKK3sKKyAgICAvLyBXZSBwcmludCBhbGwgdGhlIGNvdW50ZXJzIGV2ZW4gaWYgdGhleSBhcmUgemVyby4KKyAgICAvLyBUaGF0IG1ha2VzIGl0IGVhc2llciB0byBzbGljZSB0aGVtIGludG8gYSBzcHJlYWRzaGVldCBpZiB5b3UgbmVlZCB0by4KKyAgICBmcHJpbnRmIChzdGF0c091dCwgIlxuQ291bnRlciwgICAgICAgICAgICAgICAgICAgIENvdW50XG4iKTsKKyAgICBmb3IgKGludCBjID0gMDsgYzxDT1VOVEVSX0xBU1Q7IGMrKykgeworICAgICAgICBjb3VudGVyIGNvbnN0ICogc3RhdCA9ICZ0aGVDb3VudGVyc1tjXTsKKyAgICAgICAgZnByaW50ZiAoc3RhdHNPdXQsICIlLTI1cywgJXNcbiIsIGNvdW50ZXI6Om5hbWUoY291bnRlcl9lKGMpKSwgZm9ybWF0U0koc3RhdC0+Z2V0VmFsdWUoKSwgOSwgJyAnKS5jX3N0cigpKTsKKyAgICB9Cit9CisKK3ZvaWQga21wX3N0YXRzX291dHB1dF9tb2R1bGU6OnByaW50RXZlbnRzKEZJTEUqIGV2ZW50c091dCwga21wX3N0YXRzX2V2ZW50X3ZlY3RvciogdGhlRXZlbnRzLCBpbnQgZ3RpZCkgeworICAgIC8vIHNvcnQgYnkgc3RhcnQgdGltZSBiZWZvcmUgcHJpbnRpbmcKKyAgICB0aGVFdmVudHMtPnNvcnQoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHRoZUV2ZW50cy0+c2l6ZSgpOyBpKyspIHsKKyAgICAgICAga21wX3N0YXRzX2V2ZW50IGV2ID0gdGhlRXZlbnRzLT5hdChpKTsKKyAgICAgICAgcmdiX2NvbG9yIGNvbG9yID0gZ2V0RXZlbnRDb2xvcihldi5nZXRUaW1lck5hbWUoKSk7CisgICAgICAgIGZwcmludGYoZXZlbnRzT3V0LCAiJWQgJWx1ICVsdSAlMS4xZiByZ2IoJTEuMWYsJTEuMWYsJTEuMWYpICVzXG4iLCAKKyAgICAgICAgICAgICAgICBndGlkLCAKKyAgICAgICAgICAgICAgICBldi5nZXRTdGFydCgpLCAKKyAgICAgICAgICAgICAgICBldi5nZXRTdG9wKCksIAorICAgICAgICAgICAgICAgIDEuMiAtIChldi5nZXROZXN0TGV2ZWwoKSAqIDAuMiksCisgICAgICAgICAgICAgICAgY29sb3IuciwgY29sb3IuZywgY29sb3IuYiwKKyAgICAgICAgICAgICAgICB0aW1lU3RhdDo6bmFtZShldi5nZXRUaW1lck5hbWUoKSkKKyAgICAgICAgICAgICAgICk7CisgICAgfQorICAgIHJldHVybjsKK30KKwordm9pZCBrbXBfc3RhdHNfb3V0cHV0X21vZHVsZTo6d2luZHVwRXhwbGljaXRUaW1lcnMoKQoreworICAgIC8vIFdpbmQgdXAgYW55IGV4cGxpY2l0IHRpbWVycy4gV2UgYXNzdW1lIHRoYXQgaXQncyBmYWlyIGF0IHRoaXMgcG9pbnQgdG8ganVzdCB3YWxrIGFsbCB0aGUgZXhwbGNpdCB0aW1lcnMgaW4gYWxsIHRocmVhZHMgCisgICAgLy8gYW5kIHNheSAiaXQncyBvdmVyIi4KKyAgICAvLyBJZiB0aGUgdGltZXIgd2Fzbid0IHJ1bm5pbmcsIHRoaXMgd29uJ3QgcmVjb3JkIGFueXRoaW5nIGFueXdheS4KKyAgICBrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3IgaXQ7CisgICAgZm9yKGl0ID0gX19rbXBfc3RhdHNfbGlzdC5iZWdpbigpOyBpdCAhPSBfX2ttcF9zdGF0c19saXN0LmVuZCgpOyBpdCsrKSB7CisgICAgICAgIGZvciAoaW50IHRpbWVyPTA7IHRpbWVyPEVYUExJQ0lUX1RJTUVSX0xBU1Q7IHRpbWVyKyspIHsKKyAgICAgICAgICAgICgqaXQpLT5nZXRFeHBsaWNpdFRpbWVyKGV4cGxpY2l0X3RpbWVyX2UodGltZXIpKS0+c3RvcCgodGltZXJfZSl0aW1lcik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQga21wX3N0YXRzX291dHB1dF9tb2R1bGU6OnByaW50UGxvdGljdXNGaWxlKCkgeworICAgIGludCBpOworICAgIGludCBzaXplID0gX19rbXBfc3RhdHNfbGlzdC5zaXplKCk7CisgICAgRklMRSogcGxvdE91dCA9IGZvcGVuKHBsb3RGaWxlTmFtZSwgIncrIik7CisKKyAgICBmcHJpbnRmKHBsb3RPdXQsICIjcHJvYyBwYWdlXG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgcGFnZXNpemU6IDE1IDEwXG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgc2NhbGU6IDEuMFxuXG4iKTsKKworICAgIGZwcmludGYocGxvdE91dCwgIiNwcm9jIGdldGRhdGFcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgICBmaWxlOiAlc1xuXG4iLCAKKyAgICAgICAgICAgICAgICAgICAgIGV2ZW50c0ZpbGVOYW1lKTsKKworICAgIGZwcmludGYocGxvdE91dCwgIiNwcm9jIGFyZWFkZWZcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgICB0aXRsZTogT3Blbk1QIFNhbXBsaW5nIFRpbWVsaW5lXG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgdGl0bGVkZXRhaWxzOiBhbGlnbj1jZW50ZXIgc2l6ZT0xNlxuIgorICAgICAgICAgICAgICAgICAgICAgIiAgIHJlY3RhbmdsZTogMSAxIDEzIDlcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgICB4YXV0b3JhbmdlOiBkYXRhZmllbGQ9MiwzXG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgeWF1dG9yYW5nZTogLTEgJWRcblxuIiwgCisgICAgICAgICAgICAgICAgICAgICBzaXplKTsKKworICAgIGZwcmludGYocGxvdE91dCwgIiNwcm9jIHhheGlzXG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgc3R1YnM6IGluY1xuIgorICAgICAgICAgICAgICAgICAgICAgIiAgIHN0dWJkZXRhaWxzOiBzaXplPTEyXG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgbGFiZWw6IFRpbWUgKHRpY2tzKVxuIgorICAgICAgICAgICAgICAgICAgICAgIiAgIGxhYmVsZGV0YWlsczogc2l6ZT0xNFxuXG4iKTsKKworICAgIGZwcmludGYocGxvdE91dCwgIiNwcm9jIHlheGlzXG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgc3R1YnM6IGluYyAxXG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgc3R1YnJhbmdlOiAwICVkXG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgc3R1YmRldGFpbHM6IHNpemU9MTJcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgICBsYWJlbDogVGhyZWFkICNcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgICBsYWJlbGRldGFpbHM6IHNpemU9MTRcblxuIiwgCisgICAgICAgICAgICAgICAgICAgICBzaXplLTEpOworCisgICAgZnByaW50ZihwbG90T3V0LCAiI3Byb2MgYmFyc1xuIgorICAgICAgICAgICAgICAgICAgICAgIiAgIGV4YWN0Y29sb3JmaWVsZDogNVxuIgorICAgICAgICAgICAgICAgICAgICAgIiAgIGF4aXM6IHhcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgICBsb2NmaWVsZDogMVxuIgorICAgICAgICAgICAgICAgICAgICAgIiAgIHNlZ21lbnRmaWVsZHM6IDIgM1xuIgorICAgICAgICAgICAgICAgICAgICAgIiAgIGJhcndpZHRoZmllbGQ6IDRcblxuIik7CisKKyAgICAvLyBjcmVhdGUgbGVnZW5kIGVudHJpZXMgY29ycmVzcG9uZGluZyB0byB0aGUgdGltZXIgY29sb3IKKyAgICBmb3IoaT0wO2k8VElNRVJfTEFTVDtpKyspIHsKKyAgICAgICAgaWYodGltZVN0YXQ6OmxvZ0V2ZW50KCh0aW1lcl9lKWkpKSB7CisgICAgICAgICAgICByZ2JfY29sb3IgYyA9IGdldEV2ZW50Q29sb3IoKHRpbWVyX2UpaSk7CisgICAgICAgICAgICBmcHJpbnRmKHBsb3RPdXQsICIjcHJvYyBsZWdlbmRlbnRyeVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgc2FtcGxldHlwZTogY29sb3JcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgIGxhYmVsOiAlc1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgZGV0YWlsczogcmdiKCUxLjFmLCUxLjFmLCUxLjFmKVxuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lU3RhdDo6bmFtZSgodGltZXJfZSlpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5yLCBjLmcsIGMuYik7CisKKyAgICAgICAgfQorICAgIH0KKworICAgIGZwcmludGYocGxvdE91dCwgIiNwcm9jIGxlZ2VuZFxuIgorICAgICAgICAgICAgICAgICAgICAgIiAgIGZvcm1hdDogZG93blxuIgorICAgICAgICAgICAgICAgICAgICAgIiAgIGxvY2F0aW9uOiBtYXggbWF4XG5cbiIpOworICAgIGZjbG9zZShwbG90T3V0KTsKKyAgICByZXR1cm47Cit9CisKK3ZvaWQga21wX3N0YXRzX291dHB1dF9tb2R1bGU6Om91dHB1dFN0YXRzKGNvbnN0IGNoYXIqIGhlYWRpbmcpIAoreworICAgIHN0YXRpc3RpYyBhbGxTdGF0c1tUSU1FUl9MQVNUXTsKKyAgICBzdGF0aXN0aWMgYWxsQ291bnRlcnNbQ09VTlRFUl9MQVNUXTsKKworICAgIC8vIHN0b3AgYWxsIHRoZSBleHBsaWNpdCB0aW1lcnMgZm9yIGFsbCB0aHJlYWRzCisgICAgd2luZHVwRXhwbGljaXRUaW1lcnMoKTsKKworICAgIEZJTEUgKiBldmVudHNPdXQ7CisgICAgRklMRSAqIHN0YXRzT3V0ID0gb3V0cHV0RmlsZU5hbWUgPyBmb3BlbiAob3V0cHV0RmlsZU5hbWUsICJhKyIpIDogc3RkZXJyOworCisgICAgaWYgKGV2ZW50UHJpbnRpbmdFbmFibGVkKCkpIHsKKyAgICAgICAgZXZlbnRzT3V0ID0gZm9wZW4oZXZlbnRzRmlsZU5hbWUsICJ3KyIpOworICAgIH0KKworICAgIGlmICghc3RhdHNPdXQpCisgICAgICAgIHN0YXRzT3V0ID0gc3RkZXJyOworCisgICAgZnByaW50ZihzdGF0c091dCwgIiVzXG4iLGhlYWRpbmcpOworICAgIC8vIEFjY3VtdWxhdGUgYWNyb3NzIHRocmVhZHMuCisgICAga21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yIGl0OworICAgIGZvciAoaXQgPSBfX2ttcF9zdGF0c19saXN0LmJlZ2luKCk7IGl0ICE9IF9fa21wX3N0YXRzX2xpc3QuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgaW50IHQgPSAoKml0KS0+Z2V0R3RpZCgpOworICAgICAgICAvLyBPdXRwdXQgcGVyIHRocmVhZCBzdGF0cyBpZiByZXF1ZXN0ZWQuCisgICAgICAgIGlmIChwZXJUaHJlYWRQcmludGluZ0VuYWJsZWQoKSkgeworICAgICAgICAgICAgZnByaW50ZiAoc3RhdHNPdXQsICJUaHJlYWQgJWRcbiIsIHQpOworICAgICAgICAgICAgcHJpbnRTdGF0cyhzdGF0c091dCwgKCppdCktPmdldFRpbWVycygpLCB0cnVlKTsKKyAgICAgICAgICAgIHByaW50Q291bnRlcnMoc3RhdHNPdXQsICgqaXQpLT5nZXRDb3VudGVycygpKTsKKyAgICAgICAgICAgIGZwcmludGYoc3RhdHNPdXQsIlxuIik7CisgICAgICAgIH0KKyAgICAgICAgLy8gT3V0cHV0IHBlciB0aHJlYWQgZXZlbnRzIGlmIHJlcXVlc3RlZC4KKyAgICAgICAgaWYgKGV2ZW50UHJpbnRpbmdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGttcF9zdGF0c19ldmVudF92ZWN0b3IgZXZlbnRzID0gKCppdCktPmdldEV2ZW50VmVjdG9yKCk7CisgICAgICAgICAgICBwcmludEV2ZW50cyhldmVudHNPdXQsICZldmVudHMsIHQpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgcyA9IDA7IHM8VElNRVJfTEFTVDsgcysrKSB7CisgICAgICAgICAgICAvLyBTZWUgaWYgd2Ugc2hvdWxkIGlnbm9yZSB0aGlzIHRpbWVyIHdoZW4gYWdncmVnYXRpbmcKKyAgICAgICAgICAgIGlmICgodGltZVN0YXQ6Om1hc3Rlck9ubHkodGltZXJfZShzKSkgJiYgKHQgIT0gMCkpIHx8IC8vIFRpbWVyIGlzIG9ubHkgdmFsaWQgb24gdGhlIG1hc3RlciBhbmQgdGhpcyB0aHJlYWQgaXMgYSB3b3JrZXIKKyAgICAgICAgICAgICAgICAodGltZVN0YXQ6Ondvcmtlck9ubHkodGltZXJfZShzKSkgJiYgKHQgPT0gMCkpIHx8IC8vIFRpbWVyIGlzIG9ubHkgdmFsaWQgb24gYSB3b3JrZXIgYW5kIHRoaXMgdGhyZWFkIGlzIHRoZSBtYXN0ZXIKKyAgICAgICAgICAgICAgICB0aW1lU3RhdDo6c3ludGhlc2l6ZWQodGltZXJfZShzKSkgICAgICAgICAgICAgICAgIC8vIEl0J3MgYSBzeW50aGVzaXplZCBzdGF0LCBzbyB0aGVyZSdzIG5vIHJhdyBkYXRhIGZvciBpdC4KKyAgICAgICAgICAgICAgICkgICAgICAgICAgICAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGlzdGljICogdGhyZWFkU3RhdCA9ICgqaXQpLT5nZXRUaW1lcih0aW1lcl9lKHMpKTsKKyAgICAgICAgICAgIGFsbFN0YXRzW3NdICs9ICp0aHJlYWRTdGF0OworICAgICAgICB9CisKKyAgICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3Igc3ludGhlc2l6ZWQgc3RhdGlzdGljcy4KKyAgICAgICAgLy8gVGhlc2UganVzdCBoYXZlIHRvIGJlIGNvZGVkIHNwZWNpYWxseSBoZXJlIGZvciBub3cuIAorICAgICAgICAvLyBBdCBwcmVzZW50IHdlIG9ubHkgaGF2ZSBhIGZldzogCisgICAgICAgIC8vIFRoZSB0b3RhbCBwYXJhbGxlbCB3b3JrIGRvbmUgaW4gZWFjaCB0aHJlYWQuCisgICAgICAgIC8vIFRoZSB2YXJpYW5jZSBoZXJlIG1ha2VzIGl0IGVhc3kgdG8gc2VlIGxvYWQgaW1iYWxhbmNlIG92ZXIgdGhlIHdob2xlIHByb2dyYW0gKHRob3VnaCwgb2YgY291cnNlLAorICAgICAgICAvLyBpdCdzIHBvc3NpYmxlIHRvIGhhdmUgYSBjb2RlIHdpdGggYXdmdWwgbG9hZCBiYWxhbmNlIGluIGV2ZXJ5IHBhcmFsbGVsIHJlZ2lvbiBidXQgcGVyZmVjdCBsb2FkCisgICAgICAgIC8vIGJhbGFuY2Ugb2V2ZXIgdGhlIHdob2xlIHByb2dyYW0uKQorICAgICAgICAvLyBUaGUgdGltZSBzcGVudCBpbiBiYXJyaWVycyBpbiBlYWNoIHRocmVhZC4KKyAgICAgICAgYWxsU3RhdHNbVElNRVJfVG90YWxfd29ya10uYWRkU2FtcGxlICgoKml0KS0+Z2V0VGltZXIoVElNRVJfT01QX3dvcmspLT5nZXRUb3RhbCgpKTsKKworICAgICAgICAvLyBUaW1lIGluIGV4cGxpY2l0IGJhcnJpZXJzLgorICAgICAgICBhbGxTdGF0c1tUSU1FUl9Ub3RhbF9iYXJyaWVyXS5hZGRTYW1wbGUgKCgqaXQpLT5nZXRUaW1lcihUSU1FUl9PTVBfYmFycmllciktPmdldFRvdGFsKCkpOworCisgICAgICAgIGZvciAoaW50IGMgPSAwOyBjPENPVU5URVJfTEFTVDsgYysrKSB7CisgICAgICAgICAgICBpZiAoY291bnRlcjo6bWFzdGVyT25seShjb3VudGVyX2UoYykpICYmIHQgIT0gMCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGFsbENvdW50ZXJzW2NdLmFkZFNhbXBsZSAoKCppdCktPmdldENvdW50ZXIoY291bnRlcl9lKGMpKS0+Z2V0VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZXZlbnRQcmludGluZ0VuYWJsZWQoKSkgeworICAgICAgICBwcmludFBsb3RpY3VzRmlsZSgpOworICAgICAgICBmY2xvc2UoZXZlbnRzT3V0KTsKKyAgICB9CisKKyAgICBmcHJpbnRmIChzdGF0c091dCwgIkFnZ3JlZ2F0ZSBmb3IgYWxsIHRocmVhZHNcbiIpOworICAgIHByaW50U3RhdHMgKHN0YXRzT3V0LCAmYWxsU3RhdHNbMF0sIHRydWUpOworICAgIGZwcmludGYgKHN0YXRzT3V0LCAiXG4iKTsKKyAgICBwcmludFN0YXRzIChzdGF0c091dCwgJmFsbENvdW50ZXJzWzBdLCBmYWxzZSk7CisKKyAgICBpZiAoc3RhdHNPdXQgIT0gc3RkZXJyKQorICAgICAgICBmY2xvc2Uoc3RhdHNPdXQpOworCit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqKioqKioqKioqKioqICBleHBvcnRlZCBDIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKiAqLworCisvLyBubyBuYW1lIG1hbmdsaW5nIGZvciB0aGVzZSBmdW5jdGlvbnMsIHdlIHdhbnQgdGhlIGMgZmlsZXMgdG8gYmUgYWJsZSB0byBnZXQgYXQgdGhlc2UgZnVuY3Rpb25zCitleHRlcm4gIkMiIHsKKwordm9pZCBfX2ttcF9yZXNldF9zdGF0cygpCit7CisgICAga21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yIGl0OworICAgIGZvcihpdCA9IF9fa21wX3N0YXRzX2xpc3QuYmVnaW4oKTsgaXQgIT0gX19rbXBfc3RhdHNfbGlzdC5lbmQoKTsgaXQrKykgeworICAgICAgICB0aW1lU3RhdCAqIHRpbWVycyAgICAgPSAoKml0KS0+Z2V0VGltZXJzKCk7CisgICAgICAgIGNvdW50ZXIgKiBjb3VudGVycyAgICA9ICgqaXQpLT5nZXRDb3VudGVycygpOworICAgICAgICBleHBsaWNpdFRpbWVyICogZVRpbWVycyA9ICgqaXQpLT5nZXRFeHBsaWNpdFRpbWVycygpOworCisgICAgICAgIGZvciAoaW50IHQgPSAwOyB0PFRJTUVSX0xBU1Q7IHQrKykKKyAgICAgICAgICAgIHRpbWVyc1t0XS5yZXNldCgpOworCisgICAgICAgIGZvciAoaW50IGMgPSAwOyBjPENPVU5URVJfTEFTVDsgYysrKQorICAgICAgICAgICAgY291bnRlcnNbY10ucmVzZXQoKTsKKworICAgICAgICBmb3IgKGludCB0PTA7IHQ8RVhQTElDSVRfVElNRVJfTEFTVDsgdCsrKQorICAgICAgICAgICAgZVRpbWVyc1t0XS5yZXNldCgpOworCisgICAgICAgIC8vIHJlc2V0IHRoZSBldmVudCB2ZWN0b3Igc28gYWxsIHByZXZpb3VzIGV2ZW50cyBhcmUgImVyYXNlZCIKKyAgICAgICAgKCppdCktPnJlc2V0RXZlbnRWZWN0b3IoKTsKKworICAgICAgICAvLyBNYXkgbmVlZCB0byByZXN0YXJ0IHRoZSBleHBsaWNpdCB0aW1lcnMgaW4gdGhyZWFkIHplcm8/CisgICAgfQorICAgIEtNUF9TVEFSVF9FWFBMSUNJVF9USU1FUihPTVBfc2VyaWFsKTsKKyAgICBLTVBfU1RBUlRfRVhQTElDSVRfVElNRVIoT01QX3N0YXJ0X2VuZCk7Cit9CisKKy8vIFRoaXMgZnVuY3Rpb24gd2lsbCByZXNldCBhbGwgc3RhdHMgYW5kIHN0b3AgYWxsIHRocmVhZHMnIGV4cGxpY2l0IHRpbWVycyBpZiB0aGV5IGhhdmVuJ3QgYmVlbiBzdG9wcGVkIGFscmVhZHkuCit2b2lkIF9fa21wX291dHB1dF9zdGF0cyhjb25zdCBjaGFyICogaGVhZGluZykKK3sKKyAgICBfX2ttcF9zdGF0c19nbG9iYWxfb3V0cHV0Lm91dHB1dFN0YXRzKGhlYWRpbmcpOworICAgIF9fa21wX3Jlc2V0X3N0YXRzKCk7Cit9CisKK3ZvaWQgX19rbXBfYWNjdW11bGF0ZV9zdGF0c19hdF9leGl0KHZvaWQpCit7CisgICAgLy8gT25seSBkbyB0aGlzIG9uY2UuCisgICAgaWYgKEtNUF9YQ0hHX0ZJWEVEMzIoJnN0YXRzUHJpbnRlZCwgMSkgIT0gMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgX19rbXBfb3V0cHV0X3N0YXRzKCJTdGF0aXN0aWNzIG9uIGV4aXQiKTsKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgX19rbXBfc3RhdHNfaW5pdCh2b2lkKSAKK3sKKyAgICByZXR1cm47Cit9CisKK30gLy8gZXh0ZXJuICJDIiAKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX3N0YXRzLmggYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfc3RhdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGNlYzNlCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX3N0YXRzLmgKQEAgLTAsMCArMSw3NDggQEAKKyNpZm5kZWYgS01QX1NUQVRTX0gKKyNkZWZpbmUgS01QX1NUQVRTX0gKKworLyoqIEBmaWxlIGttcF9zdGF0cy5oCisgKiBGdW5jdGlvbnMgZm9yIGNvbGxlY3Rpbmcgc3RhdGlzdGljcy4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJrbXBfY29uZmlnLmgiCisKKyNpZiBLTVBfU1RBVFNfRU5BQkxFRAorLyoKKyAqIFN0YXRpc3RpY3MgYWNjdW11bGF0b3IuCisgKiBBY2N1bXVsYXRlcyBudW1iZXIgb2Ygc2FtcGxlcyBhbmQgY29tcHV0ZXMgbWluLCBtYXgsIG1lYW4sIHN0YW5kYXJkIGRldmlhdGlvbiBvbiB0aGUgZmx5LgorICoKKyAqIE9ubGluZSB2YXJpYW5jZSBjYWxjdWxhdGlvbiBhbGdvcml0aG0gZnJvbSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0FsZ29yaXRobXNfZm9yX2NhbGN1bGF0aW5nX3ZhcmlhbmNlI09uLWxpbmVfYWxnb3JpdGhtCisgKi8KKworI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPG5ldz4gLy8gcGxhY2VtZW50IG5ldworI2luY2x1ZGUgImttcF9zdGF0c190aW1pbmcuaCIKKworLyoKKyAqIEVuYWJsZSBkZXZlbG9wZXIgc3RhdGlzdGljcyBoZXJlIGlmIHlvdSB3YW50IHRoZW0uIFRoZXkgYXJlIG1vcmUgZGV0YWlsZWQgdGhhbiBpcyB1c2VmdWwgZm9yIGFwcGxpY2F0aW9uIGNoYXJhY3RlcmlzYXRpb24gYW5kCisgKiBhcmUgaW50ZW5kZWQgZm9yIHRoZSBydW50aW1lIGxpYnJhcnkgZGV2ZWxvcGVyLgorICovCisvLyAjZGVmaW5lIEtNUF9ERVZFTE9QRVJfU1RBVFMgMQorCisvKiEKKyAqIEBpbmdyb3VwIFNUQVRTX0dBVEhFUklORworICogXGJyaWVmIGZsYWdzIHRvIGRlc2NyaWJlIHRoZSBzdGF0aXN0aWMgKCB0aW1lcnMgb3IgY291bnRlciApCisgKgorKi8KK2NsYXNzIHN0YXRzX2ZsYWdzX2UgeworICAgIHB1YmxpYzoKKyAgICAgICAgY29uc3Qgc3RhdGljIGludCBvbmx5SW5NYXN0ZXIgPSAxPDwwOyAvLyE8IHN0YXRpc3RpYyBpcyB2YWxpZCBvbmx5IGZvciBtYXN0ZXIKKyAgICAgICAgY29uc3Qgc3RhdGljIGludCBub1VuaXRzICAgICAgPSAxPDwxOyAvLyE8IHN0YXRpc3RpYyBkb2Vzbid0IG5lZWQgdW5pdHMgcHJpbnRlZCBuZXh0IHRvIGl0IGluIG91dHB1dAorICAgICAgICBjb25zdCBzdGF0aWMgaW50IHN5bnRoZXNpemVkICA9IDE8PDI7IC8vITwgc3RhdGlzdGljJ3MgdmFsdWUgaXMgY3JlYXRlZCBhdGV4aXQgdGltZSBpbiB0aGUgX19rbXBfb3V0cHV0X3N0YXRzIGZ1bmN0aW9uCisgICAgICAgIGNvbnN0IHN0YXRpYyBpbnQgbm90SW5NYXN0ZXIgID0gMTw8MzsgLy8hPCBzdGF0aXN0aWMgaXMgdmFsaWQgZm9yIG5vbi1tYXN0ZXIgdGhyZWFkcworICAgICAgICBjb25zdCBzdGF0aWMgaW50IGxvZ0V2ZW50ICAgICA9IDE8PDQ7IC8vITwgc3RhdGlzdGljIGNhbiBiZSBsb2dnZWQgd2hlbiBLTVBfU1RBVFNfRVZFTlRTIGlzIG9uICh2YWxpZCBvbmx5IGZvciB0aW1lcnMpCit9OworCisvKiEKKyAqIFxicmllZiBBZGQgbmV3IGNvdW50ZXJzIHVuZGVyIEtNUF9GT1JFQUNIX0NPVU5URVIoKSBtYWNybyBpbiBrbXBfc3RhdHMuaAorICoKKyAqIEBwYXJhbSBtYWNybyBhIHVzZXIgZGVmaW5lZCBtYWNybyB0aGF0IHRha2VzIHRocmVlIGFyZ3VtZW50cyAtIG1hY3JvKENPVU5URVJfTkFNRSwgZmxhZ3MsIGFyZykKKyAqIEBwYXJhbSBhcmcgYSB1c2VyIGRlZmluZWQgYXJndW1lbnQgdG8gc2VuZCB0byB0aGUgdXNlciBkZWZpbmVkIG1hY3JvCisgKgorICogXGRldGFpbHMgQSBjb3VudGVyIGNvdW50cyB0aGUgb2NjdXJyZW5jZSBvZiBzb21lIGV2ZW50LgorICogRWFjaCB0aHJlYWQgYWNjdW11bGF0ZXMgaXRzIG93biBjb3VudCwgYXQgdGhlIGVuZCBvZiBleGVjdXRpb24gdGhlIGNvdW50cyBhcmUgYWdncmVnYXRlZCB0cmVhdGluZyBlYWNoIHRocmVhZAorICogYXMgYSBzZXBhcmF0ZSBtZWFzdXJlbWVudC4gKFVubGVzcyBvbmx5SW5NYXN0ZXIgaXMgc2V0LCBpbiB3aGljaCBjYXNlIHRoZXJlJ3Mgb25seSBhIHNpbmdsZSBtZWFzdXJlbWVudCkuCisgKiBUaGUgbWluLG1lYW4sbWF4IGFyZSB0aGVyZWZvcmUgdGhlIHZhbHVlcyBmb3IgdGhlIHRocmVhZHMuCisgKiBBZGRpbmcgdGhlIGNvdW50ZXIgaGVyZSBhbmQgdGhlbiBwdXR0aW5nIGEgS01QX0JMT0NLX0NPVU5URVIobmFtZSkgYXQgdGhlIHBvaW50IHlvdSB3YW50IHRvIGNvdW50IGlzIGFsbCB5b3UgbmVlZCB0byBkby4KKyAqIEFsbCBvZiB0aGUgdGFibGVzIGFuZCBwcmludGluZyBpcyBnZW5lcmF0ZWQgZnJvbSB0aGlzIG1hY3JvLgorICogRm9ybWF0IGlzICJtYWNybyhuYW1lLCBmbGFncywgYXJnKSIKKyAqCisgKiBAaW5ncm91cCBTVEFUU19HQVRIRVJJTkcKKyovCisjZGVmaW5lIEtNUF9GT1JFQUNIX0NPVU5URVIobWFjcm8sIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChPTVBfUEFSQUxMRUwsIHN0YXRzX2ZsYWdzX2U6Om9ubHlJbk1hc3RlciwgYXJnKSAgICAgIFwKKyAgICBtYWNybyAoT01QX05FU1RFRF9QQVJBTExFTCwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKE9NUF9GT1Jfc3RhdGljLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChPTVBfRk9SX2R5bmFtaWMsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX0RJU1RSSUJVVEUsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKE9NUF9CQVJSSUVSLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChPTVBfQ1JJVElDQUwsMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX1NJTkdMRSwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKE9NUF9NQVNURVIsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChPTVBfVEVBTVMsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX3NldF9sb2NrLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKE9NUF90ZXN0X2xvY2ssIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChSRURVQ0Vfd2FpdCwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoUkVEVUNFX25vd2FpdCwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKE9NUF9UQVNLWUlFTEQsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChUQVNLX2V4ZWN1dGVkLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoVEFTS19jYW5jZWxsZWQsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKFRBU0tfc3RvbGVuLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChMQVNULDAsYXJnKQorCisvLyBPTVBfUEFSQUxMRUxfYXJncyAgICAgIC0tIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIHBhc3NlZCB0byBhIGZvcmsKKy8vIEZPUl9zdGF0aWNfaXRlcmF0aW9ucyAgLS0gTnVtYmVyIG9mIGF2YWlsYWJsZSBwYXJhbGxlbCBjaHVua3Mgb2Ygd29yayBpbiBhIHN0YXRpYyBmb3IKKy8vIEZPUl9keW5hbWljX2l0ZXJhdGlvbnMgLS0gTnVtYmVyIG9mIGF2YWlsYWJsZSBwYXJhbGxlbCBjaHVua3Mgb2Ygd29yayBpbiBhIGR5bmFtaWMgZm9yCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvdGggYWRqdXN0IGZvciBhbnkgY2h1bmtpbmcsIHNvIGlmIHRoZXJlIHdlcmUgYW4gaXRlcmF0aW9uIGNvdW50IG9mIDIwIGJ1dCBhIGNodW5rIHNpemUgb2YgMTAsIHdlJ2QgcmVjb3JkIDIuCisKKy8qIQorICogXGJyaWVmIEFkZCBuZXcgdGltZXJzIHVuZGVyIEtNUF9GT1JFQUNIX1RJTUVSKCkgbWFjcm8gaW4ga21wX3N0YXRzLmgKKyAqCisgKiBAcGFyYW0gbWFjcm8gYSB1c2VyIGRlZmluZWQgbWFjcm8gdGhhdCB0YWtlcyB0aHJlZSBhcmd1bWVudHMgLSBtYWNybyhUSU1FUl9OQU1FLCBmbGFncywgYXJnKQorICogQHBhcmFtIGFyZyBhIHVzZXIgZGVmaW5lZCBhcmd1bWVudCB0byBzZW5kIHRvIHRoZSB1c2VyIGRlZmluZWQgbWFjcm8KKyAqCisgKiBcZGV0YWlscyBBIHRpbWVyIGNvbGxlY3RzIG11bHRpcGxlIHNhbXBsZXMgb2Ygc29tZSBjb3VudCBpbiBlYWNoIHRocmVhZCBhbmQgdGhlbiBmaW5hbGx5IGFnZ3JlZ2F0ZXMgb3ZlciBhbGwgdGhlIHRocmVhZHMuCisgKiBUaGUgY291bnQgaXMgbm9ybWFsbHkgYSB0aW1lIChpbiB0aWNrcyksIGhlbmNlIHRoZSBuYW1lICJ0aW1lciIuIChCdXQgY2FuIGJlIGFueSB2YWx1ZSwgc28gd2UgdXNlIHRoaXMgZm9yICJudW1iZXIgb2YgYXJndW1lbnRzIHBhc3NlZCB0byBmb3JrIgorICogYXMgd2VsbCkuCisgKiBGb3IgdGltZXJzIHRoZSB0aHJlYWRzIGFyZSBub3Qgc2lnbmlmaWNhbnQsIGl0J3MgdGhlIGluZGl2aWR1YWwgb2JzZXJ2YXRpb25zIHRoYXQgY291bnQsIHNvIHRoZSBzdGF0aXN0aWNzIGFyZSBhdCB0aGF0IGxldmVsLgorICogRm9ybWF0IGlzICJtYWNybyhuYW1lLCBmbGFncywgYXJnKSIKKyAqCisgKiBAaW5ncm91cCBTVEFUU19HQVRIRVJJTkcyCisgKi8KKyNkZWZpbmUgS01QX0ZPUkVBQ0hfVElNRVIobWFjcm8sIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX3N0YXJ0X2VuZCwgc3RhdHNfZmxhZ3NfZTo6b25seUluTWFzdGVyLCBhcmcpICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX3NlcmlhbCwgc3RhdHNfZmxhZ3NfZTo6b25seUluTWFzdGVyLCBhcmcpICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX3dvcmssIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoVG90YWxfd29yaywgc3RhdHNfZmxhZ3NfZTo6c3ludGhlc2l6ZWQsIGFyZykgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX2JhcnJpZXIsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoVG90YWxfYmFycmllciwgc3RhdHNfZmxhZ3NfZTo6c3ludGhlc2l6ZWQsIGFyZykgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoRk9SX3N0YXRpY19pdGVyYXRpb25zLCBzdGF0c19mbGFnc19lOjpub1VuaXRzLCBhcmcpICAgICAgICAgIFwKKyAgICBtYWNybyAoRk9SX3N0YXRpY19zY2hlZHVsaW5nLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoRk9SX2R5bmFtaWNfaXRlcmF0aW9ucywgc3RhdHNfZmxhZ3NfZTo6bm9Vbml0cywgYXJnKSAgICAgICAgIFwKKyAgICBtYWNybyAoRk9SX2R5bmFtaWNfc2NoZWR1bGluZywgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoVEFTS19leGVjdXRpb24sIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX3NldF9udW10aHJlYWRzLCBzdGF0c19mbGFnc19lOjpub1VuaXRzLCBhcmcpICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX1BBUkFMTEVMX2FyZ3MsICBzdGF0c19mbGFnc19lOjpub1VuaXRzLCBhcmcpICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX3NpbmdsZSwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX21hc3RlciwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfRk9SRUFDSF9ERVZFTE9QRVJfVElNRVIobWFjcm8sIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoTEFTVCwwLCBhcmcpCisKKworLy8gT01QX3N0YXJ0X2VuZCAgICAgICAgICAtLSB0aW1lIGZyb20gd2hlbiBPcGVuTVAgaXMgaW5pdGlhbGl6ZWQgdW50aWwgdGhlIHN0YXRzIGFyZSBwcmludGVkIGF0IGV4aXQKKy8vIE9NUF9zZXJpYWwgICAgICAgICAgICAgLS0gdGhyZWFkIHplcm8gdGltZSBleGVjdXRpbmcgc2VyaWFsIGNvZGUKKy8vIE9NUF93b3JrICAgICAgICAgICAgICAgLS0gZWxhcHNlZCB0aW1lIGluIGNvZGUgZGlzcGF0Y2hlZCBieSBhIGZvcmsgKG1lYXN1cmVkIGluIHRoZSB0aHJlYWQpCisvLyBUb3RhbF93b3JrICAgICAgICAgICAgIC0tIGEgc3ludGhlc2l6ZWQgc3RhdGlzdGljIHN1bW1hcml6aW5nIGhvdyBtdWNoIHBhcmFsbGVsIHdvcmsgZWFjaCB0aHJlYWQgZXhlY3V0ZWQuCisvLyBPTVBfYmFycmllciAgICAgICAgICAgIC0tIHRpbWUgYXQgInJlYWwiIGJhcnJpZXJzCisvLyBUb3RhbF9iYXJyaWVyICAgICAgICAgIC0tIGEgc3ludGhlc2l6ZWQgc3RhdGlzdGljIHN1bW1hcml6aW5nIGhvdyBtdWNoIHRpbWUgYXQgcmVhbCBiYXJyaWVycyBpbiBlYWNoIHRocmVhZAorLy8gRk9SX3N0YXRpY19zY2hlZHVsaW5nICAtLSB0aW1lIHNwZW50IGRvaW5nIHNjaGVkdWxpbmcgZm9yIGEgc3RhdGljICJmb3IiCisvLyBGT1JfZHluYW1pY19zY2hlZHVsaW5nIC0tIHRpbWUgc3BlbnQgZG9pbmcgc2NoZWR1bGluZyBmb3IgYSBkeW5hbWljICJmb3IiCisKKyNpZiAoS01QX0RFVkVMT1BFUl9TVEFUUykKKy8vIFRpbWVycyB3aGljaCBhcmUgb2YgaW50ZXJlc3QgdGlvIHJ1bnRpbWUgbGlicmFyeSBkZXZlbG9wZXJzLCBub3QgZW5kIHVzZXJzLgorLy8gVEhlc2UgaGF2ZSB0byBiZSBleHBsaWNpdGx5IGVuYWJsZWQgaW4gYWRkaXRpb24gdG8gdGhlIG90aGVyIHN0YXRzLgorCisvLyBLTVBfZm9ya19iYXJyaWVyICAgICAgIC0tIHRpbWUgaW4gX19rbXBfZm9ya19iYXJyaWVyCisvLyBLTVBfam9pbl9iYXJyaWVyICAgICAgIC0tIHRpbWUgaW4gX19rbXBfam9pbl9iYXJyaWVyCisvLyBLTVBfYmFycmllciAgICAgICAgICAgIC0tIHRpbWUgaW4gX19rbXBfYmFycmllcgorLy8gS01QX2VuZF9zcGxpdF9iYXJyaWVyICAtLSB0aW1lIGluIF9fa21wX2VuZF9zcGxpdF9iYXJyaWVyCisvLyBLTVBfc2V0dXBfaWN2X2NvcHkgICAgIC0tIHRpbWUgaW4gX19rbXBfc2V0dXBfaWN2X2NvcHkKKy8vIEtNUF9pY3ZfY29weSAgICAgICAgICAgLS0gc3RhcnQvc3RvcCB0aW1lciBmb3IgYW55IElDViBjb3B5aW5nCisvLyBLTVBfbGluZWFyX2dhdGhlciAgICAgIC0tIHRpbWUgaW4gX19rbXBfbGluZWFyX2JhcnJpZXJfZ2F0aGVyCisvLyBLTVBfbGluZWFyX3JlbGVhc2UgICAgIC0tIHRpbWUgaW4gX19rbXBfbGluZWFyX2JhcnJpZXJfcmVsZWFzZQorLy8gS01QX3RyZWVfZ2F0aGVyICAgICAgICAtLSB0aW1lIGluIF9fa21wX3RyZWVfYmFycmllcl9nYXRoZXIKKy8vIEtNUF90cmVlX3JlbGVhc2UgICAgICAgLS0gdGltZSBpbiBfX2ttcF90cmVlX2JhcnJpZXJfcmVsZWFzZQorLy8gS01QX2h5cGVyX2dhdGhlciAgICAgICAtLSB0aW1lIGluIF9fa21wX2h5cGVyX2JhcnJpZXJfZ2F0aGVyCisvLyBLTVBfaHlwZXJfcmVsZWFzZSAgICAgIC0tIHRpbWUgaW4gX19rbXBfaHlwZXJfYmFycmllcl9yZWxlYXNlCisjIGRlZmluZSBLTVBfRk9SRUFDSF9ERVZFTE9QRVJfVElNRVIobWFjcm8sIGFyZykgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKEtNUF9mb3JrX2NhbGwsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKEtNUF9qb2luX2NhbGwsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKEtNUF9mb3JrX2JhcnJpZXIsIHN0YXRzX2ZsYWdzX2U6OmxvZ0V2ZW50LCBhcmcpICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKEtNUF9qb2luX2JhcnJpZXIsIHN0YXRzX2ZsYWdzX2U6OmxvZ0V2ZW50LCBhcmcpICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKEtNUF9iYXJyaWVyLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKEtNUF9lbmRfc3BsaXRfYmFycmllciwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKEtNUF9oaWVyX2dhdGhlciwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKEtNUF9oaWVyX3JlbGVhc2UsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKEtNUF9oeXBlcl9nYXRoZXIsICBzdGF0c19mbGFnc19lOjpsb2dFdmVudCwgYXJnKSAgICAgICAgICAgICBcCisgICAgbWFjcm8gKEtNUF9oeXBlcl9yZWxlYXNlLCAgc3RhdHNfZmxhZ3NfZTo6bG9nRXZlbnQsIGFyZykgICAgICAgICAgICBcCisgICAgbWFjcm8gKEtNUF9saW5lYXJfZ2F0aGVyLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKEtNUF9saW5lYXJfcmVsZWFzZSwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKEtNUF90cmVlX2dhdGhlciwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKEtNUF90cmVlX3JlbGVhc2UsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKFVTRVJfbWFzdGVyX2ludm9rZSwgc3RhdHNfZmxhZ3NfZTo6bG9nRXZlbnQsIGFyZykgICAgICAgICAgICBcCisgICAgbWFjcm8gKFVTRVJfd29ya2VyX2ludm9rZSwgc3RhdHNfZmxhZ3NfZTo6bG9nRXZlbnQsIGFyZykgICAgICAgICAgICBcCisgICAgbWFjcm8gKFVTRVJfcmVzdW1lLCBzdGF0c19mbGFnc19lOjpsb2dFdmVudCwgYXJnKSAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKFVTRVJfc3VzcGVuZCwgc3RhdHNfZmxhZ3NfZTo6bG9nRXZlbnQsIGFyZykgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKFVTRVJfbGF1bmNoX3RocmVhZF9sb29wLCBzdGF0c19mbGFnc19lOjpsb2dFdmVudCwgYXJnKSAgICAgICBcCisgICAgbWFjcm8gKEtNUF9hbGxvY2F0ZV90ZWFtLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKEtNUF9zZXR1cF9pY3ZfY29weSwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKFVTRVJfaWN2X2NvcHksIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNlbHNlCisjIGRlZmluZSBLTVBfRk9SRUFDSF9ERVZFTE9QRVJfVElNRVIobWFjcm8sIGFyZykKKyNlbmRpZgorCisvKiEKKyAqIFxicmllZiBBZGQgbmV3IGV4cGxpY2l0IHRpbWVycyB1bmRlciBLTVBfRk9SRUFDSF9FWFBMSUNJVF9USU1FUigpIG1hY3JvLgorICoKKyAqIEBwYXJhbSBtYWNybyBhIHVzZXIgZGVmaW5lZCBtYWNybyB0aGF0IHRha2VzIHRocmVlIGFyZ3VtZW50cyAtIG1hY3JvKFRJTUVSX05BTUUsIGZsYWdzLCBhcmcpCisgKiBAcGFyYW0gYXJnIGEgdXNlciBkZWZpbmVkIGFyZ3VtZW50IHRvIHNlbmQgdG8gdGhlIHVzZXIgZGVmaW5lZCBtYWNybworICoKKyAqIFx3YXJuaW5nIFlPVSBNVVNUIEhBVkUgVEhFIFNBTUUgTkFNRUQgVElNRVIgVU5ERVIgS01QX0ZPUkVBQ0hfVElNRVIoKSBPUiBFTFNFIEJBRCBUSElOR1MgV0lMTCBIQVBQRU4hCisgKgorICogXGRldGFpbHMgRXhwbGljaXQgdGltZXJzIGFyZSBvbmVzIHdoZXJlIHdlIG5lZWQgdG8gYWxsb2NhdGUgYSB0aW1lciBpdHNlbGYgKGFzIHdlbGwgYXMgdGhlIGFjY3VtdWxhdGVkIHRpbWluZyBzdGF0aXN0aWNzKS4KKyAqIFdlIGFsbG9jYXRlIHRoZXNlIG9uIGEgcGVyLXRocmVhZCBiYXNpcywgYW5kIGV4cGxpY2l0bHkgc3RhcnQgYW5kIHN0b3AgdGhlbS4KKyAqIEJsb2NrIHRpbWVycyBqdXN0IGFsbG9jYXRlIHRoZSB0aW1lciBpdHNlbGYgb24gdGhlIHN0YWNrLCBhbmQgdXNlIHRoZSBkZXN0cnVjdG9yIHRvIG5vdGljZSBibG9jayBleGl0OyB0aGV5IGRvbid0CisgKiBuZWVkIHRvIGJlIGRlZmluZWQgaGVyZS4KKyAqIFRoZSBuYW1lIGhlcmUgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoYXQgb2YgYSB0aW1lciBhYm92ZS4KKyAqCisgKiBAaW5ncm91cCBTVEFUU19HQVRIRVJJTkcKKyovCisjZGVmaW5lIEtNUF9GT1JFQUNIX0VYUExJQ0lUX1RJTUVSKG1hY3JvLCBhcmcpICAgICAgICAgIFwKKyAgICBtYWNybyhPTVBfc2VyaWFsLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvKE9NUF9zdGFydF9lbmQsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oT01QX3NpbmdsZSwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhPTVBfbWFzdGVyLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9GT1JFQUNIX0VYUExJQ0lUX0RFVkVMT1BFUl9USU1FUihtYWNybyxhcmcpICAgICBcCisgICAgbWFjcm8oTEFTVCwgMCwgYXJnKQorCisjaWYgKEtNUF9ERVZFTE9QRVJfU1RBVFMpCisjIGRlZmluZSBLTVBfRk9SRUFDSF9FWFBMSUNJVF9ERVZFTE9QRVJfVElNRVIobWFjcm8sIGFyZykgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oVVNFUl9sYXVuY2hfdGhyZWFkX2xvb3AsIHN0YXRzX2ZsYWdzX2U6OmxvZ0V2ZW50LCBhcmcpCisjZWxzZQorIyBkZWZpbmUgS01QX0ZPUkVBQ0hfRVhQTElDSVRfREVWRUxPUEVSX1RJTUVSKG1hY3JvLCBhcmcpICAgICAgICAgICAgICAgCisjZW5kaWYKKworI2RlZmluZSBFTlVNRVJBVEUobmFtZSxpZ25vcmUscHJlZml4KSBwcmVmaXgjI25hbWUsCitlbnVtIHRpbWVyX2UgeworICAgIEtNUF9GT1JFQUNIX1RJTUVSKEVOVU1FUkFURSwgVElNRVJfKQorfTsKKworZW51bSBleHBsaWNpdF90aW1lcl9lIHsKKyAgICBLTVBfRk9SRUFDSF9FWFBMSUNJVF9USU1FUihFTlVNRVJBVEUsIEVYUExJQ0lUX1RJTUVSXykKK307CisKK2VudW0gY291bnRlcl9lIHsKKyAgICBLTVBfRk9SRUFDSF9DT1VOVEVSKEVOVU1FUkFURSwgQ09VTlRFUl8pCit9OworI3VuZGVmIEVOVU1FUkFURQorCitjbGFzcyBzdGF0aXN0aWMKK3sKKyAgICBkb3VibGUgICBtaW5WYWw7CisgICAgZG91YmxlICAgbWF4VmFsOworICAgIGRvdWJsZSAgIG1lYW5WYWw7CisgICAgZG91YmxlICAgbTI7CisgICAgdWludDY0X3Qgc2FtcGxlQ291bnQ7CisKKyBwdWJsaWM6CisgICAgc3RhdGlzdGljKCkgeyByZXNldCgpOyB9CisgICAgc3RhdGlzdGljIChzdGF0aXN0aWMgY29uc3QgJm8pOiBtaW5WYWwoby5taW5WYWwpLCBtYXhWYWwoby5tYXhWYWwpLCBtZWFuVmFsKG8ubWVhblZhbCksIG0yKG8ubTIpLCBzYW1wbGVDb3VudChvLnNhbXBsZUNvdW50KSB7fQorCisgICAgZG91YmxlICAgZ2V0TWluKCkgICBjb25zdCB7IHJldHVybiBtaW5WYWw7IH0KKyAgICBkb3VibGUgICBnZXRNZWFuKCkgIGNvbnN0IHsgcmV0dXJuIG1lYW5WYWw7IH0KKyAgICBkb3VibGUgICBnZXRNYXgoKSAgIGNvbnN0IHsgcmV0dXJuIG1heFZhbDsgfQorICAgIHVpbnQ2NF90IGdldENvdW50KCkgY29uc3QgeyByZXR1cm4gc2FtcGxlQ291bnQ7IH0KKyAgICBkb3VibGUgICBnZXRTRCgpICAgIGNvbnN0IHsgcmV0dXJuIHNxcnQobTIvc2FtcGxlQ291bnQpOyB9CisgICAgZG91YmxlICAgZ2V0VG90YWwoKSBjb25zdCB7IHJldHVybiBzYW1wbGVDb3VudCptZWFuVmFsOyB9CisKKyAgICB2b2lkIHJlc2V0KCkKKyAgICB7CisgICAgICAgIG1pblZhbCA9ICBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46Om1heCgpOworICAgICAgICBtYXhWYWwgPSAtc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjptYXgoKTsKKyAgICAgICAgbWVhblZhbD0gMC4wOworICAgICAgICBtMiAgICAgPSAwLjA7CisgICAgICAgIHNhbXBsZUNvdW50ID0gMDsKKyAgICB9CisgICAgdm9pZCBhZGRTYW1wbGUoZG91YmxlIHNhbXBsZSk7CisgICAgdm9pZCBzY2FsZSAgICAoZG91YmxlIGZhY3Rvcik7CisgICAgdm9pZCBzY2FsZURvd24oZG91YmxlIGYpICB7IHNjYWxlICgxLi9mKTsgfQorICAgIHN0YXRpc3RpYyAmIG9wZXJhdG9yKz0gKHN0YXRpc3RpYyBjb25zdCAmIG90aGVyKTsKKworICAgIHN0ZDo6c3RyaW5nIGZvcm1hdChjaGFyIHVuaXQsIGJvb2wgdG90YWw9ZmFsc2UpIGNvbnN0OworfTsKKworc3RydWN0IHN0YXRJbmZvCit7CisgICAgY29uc3QgY2hhciAqIG5hbWU7CisgICAgdWludDMyX3QgICAgIGZsYWdzOworfTsKKworY2xhc3MgdGltZVN0YXQgOiBwdWJsaWMgc3RhdGlzdGljCit7CisgICAgc3RhdGljIHN0YXRJbmZvIHRpbWVySW5mb1tdOworCisgcHVibGljOgorICAgIHRpbWVTdGF0KCkgOiBzdGF0aXN0aWMoKSB7fQorICAgIHN0YXRpYyBjb25zdCBjaGFyICogbmFtZSh0aW1lcl9lIGUpIHsgcmV0dXJuIHRpbWVySW5mb1tlXS5uYW1lOyB9CisgICAgc3RhdGljIGJvb2wgIG1hc3Rlck9ubHkgKHRpbWVyX2UgZSkgeyByZXR1cm4gdGltZXJJbmZvW2VdLmZsYWdzICYgc3RhdHNfZmxhZ3NfZTo6b25seUluTWFzdGVyOyB9CisgICAgc3RhdGljIGJvb2wgIHdvcmtlck9ubHkgKHRpbWVyX2UgZSkgeyByZXR1cm4gdGltZXJJbmZvW2VdLmZsYWdzICYgc3RhdHNfZmxhZ3NfZTo6bm90SW5NYXN0ZXI7ICB9CisgICAgc3RhdGljIGJvb2wgIG5vVW5pdHMgICAgKHRpbWVyX2UgZSkgeyByZXR1cm4gdGltZXJJbmZvW2VdLmZsYWdzICYgc3RhdHNfZmxhZ3NfZTo6bm9Vbml0czsgICAgICB9CisgICAgc3RhdGljIGJvb2wgIHN5bnRoZXNpemVkKHRpbWVyX2UgZSkgeyByZXR1cm4gdGltZXJJbmZvW2VdLmZsYWdzICYgc3RhdHNfZmxhZ3NfZTo6c3ludGhlc2l6ZWQ7ICB9CisgICAgc3RhdGljIGJvb2wgIGxvZ0V2ZW50ICAgKHRpbWVyX2UgZSkgeyByZXR1cm4gdGltZXJJbmZvW2VdLmZsYWdzICYgc3RhdHNfZmxhZ3NfZTo6bG9nRXZlbnQ7ICAgICB9CisgICAgc3RhdGljIHZvaWQgIGNsZWFyRXZlbnRGbGFncygpICAgICAgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yKGk9MDtpPFRJTUVSX0xBU1Q7aSsrKSB7CisgICAgICAgICAgICB0aW1lckluZm9baV0uZmxhZ3MgJj0gKH4oc3RhdHNfZmxhZ3NfZTo6bG9nRXZlbnQpKTsKKyAgICAgICAgfQorICAgIH0KK307CisKKy8vIFdoZXJlIHdlIG5lZWQgZXhwbGljaXRseSB0byBzdGFydCBhbmQgZW5kIHRoZSB0aW1lciwgdGhpcyB2ZXJzaW9uIGNhbiBiZSB1c2VkCisvLyBTaW5jZSB0aGVzZSB0aW1lcnMgbm9ybWFsbHkgYXJlbid0IG5pY2VseSBzY29wZWQsIHNvIGRvbid0IGhhdmUgYSBnb29kIHBsYWNlIHRvIGxpdmUKKy8vIG9uIHRoZSBzdGFjayBvZiB0aGUgdGhyZWFkLCB0aGV5J3JlIG1vcmUgd29yayB0byB1c2UuCitjbGFzcyBleHBsaWNpdFRpbWVyCit7CisgICAgdGltZVN0YXQgKiBzdGF0OworICAgIHRzY190aWNrX2NvdW50IHN0YXJ0VGltZTsKKworIHB1YmxpYzoKKyAgICBleHBsaWNpdFRpbWVyICgpIDogc3RhdCgwKSwgc3RhcnRUaW1lKDApIHsgfQorICAgIGV4cGxpY2l0VGltZXIgKHRpbWVTdGF0ICogcykgOiBzdGF0KHMpLCBzdGFydFRpbWUoKSB7IH0KKworICAgIHZvaWQgc2V0U3RhdCAodGltZVN0YXQgKnMpIHsgc3RhdCA9IHM7IH0KKyAgICB2b2lkIHN0YXJ0KHRpbWVyX2UgdGltZXJFbnVtVmFsdWUpOworICAgIHZvaWQgc3RvcCh0aW1lcl9lIHRpbWVyRW51bVZhbHVlKTsKKyAgICB2b2lkIHJlc2V0KCkgeyBzdGFydFRpbWUgPSAwOyB9Cit9OworCisvLyBXaGVyZSBhbGwgeW91IG5lZWQgaXMgdG8gdGltZSBhIGJsb2NrLCB0aGlzIGlzIGVub3VnaC4KKy8vIChJdCBhdm9pZHMgdGhlIG5lZWQgdG8gaGF2ZSBhbiBleHBsaWNpdCBlbmQsIGxlYXZpbmcgdGhlIHNjb3BlIHN1ZmZpY2VzLikKK2NsYXNzIGJsb2NrVGltZXIgOiBwdWJsaWMgZXhwbGljaXRUaW1lcgoreworICAgIHRpbWVyX2UgdGltZXJFbnVtVmFsdWU7CisgcHVibGljOgorICAgIGJsb2NrVGltZXIgKHRpbWVTdGF0ICogcywgdGltZXJfZSBuZXdUaW1lckVudW1WYWx1ZSkgOiB0aW1lckVudW1WYWx1ZShuZXdUaW1lckVudW1WYWx1ZSksIGV4cGxpY2l0VGltZXIocykgeyBzdGFydCh0aW1lckVudW1WYWx1ZSk7IH0KKyAgICB+YmxvY2tUaW1lcigpIHsgc3RvcCh0aW1lckVudW1WYWx1ZSk7IH0KK307CisKKy8vIElmIGFsbCB5b3Ugd2FudCBpcyBhIGNvdW50LCB0aGVuIHlvdSBjYW4gdXNlIHRoaXMuLi4KKy8vIFRoZSBpbmRpdmlkdWFsIHBlci10aHJlYWQgY291bnRzIHdpbGwgYmUgYWdncmVnYXRlZCBpbnRvIGEgc3RhdGlzdGljIGF0IHByb2dyYW0gZXhpdC4KK2NsYXNzIGNvdW50ZXIKK3sKKyAgICB1aW50NjRfdCB2YWx1ZTsKKyAgICBzdGF0aWMgY29uc3Qgc3RhdEluZm8gY291bnRlckluZm9bXTsKKworIHB1YmxpYzoKKyAgICBjb3VudGVyKCkgOiB2YWx1ZSgwKSB7fQorICAgIHZvaWQgaW5jcmVtZW50KCkgeyB2YWx1ZSsrOyB9CisgICAgdWludDY0X3QgZ2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiB2YWx1ZTsgfQorICAgIHZvaWQgcmVzZXQoKSB7IHZhbHVlID0gMDsgfQorICAgIHN0YXRpYyBjb25zdCBjaGFyICogbmFtZShjb3VudGVyX2UgZSkgeyByZXR1cm4gY291bnRlckluZm9bZV0ubmFtZTsgfQorICAgIHN0YXRpYyBib29sICBtYXN0ZXJPbmx5IChjb3VudGVyX2UgZSkgeyByZXR1cm4gY291bnRlckluZm9bZV0uZmxhZ3MgJiBzdGF0c19mbGFnc19lOjpvbmx5SW5NYXN0ZXI7IH0KK307CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBDbGFzcyB0byBpbXBsZW1lbnQgYW4gZXZlbnQKKworICAgIFRoZXJlIGFyZSBmb3VyIGNvbXBvbmVudHMgdG8gYW4gZXZlbnQ6IHN0YXJ0IHRpbWUsIHN0b3AgdGltZQorICAgIG5lc3RfbGV2ZWwsIGFuZCB0aW1lcl9uYW1lLgorICAgIFRoZSBzdGFydCBhbmQgc3RvcCB0aW1lIHNob3VsZCBiZSBvYnZpb3VzIChyZWNvcmRlZCBpbiBjbG9jayB0aWNrcykuCisgICAgVGhlIG5lc3RfbGV2ZWwgcmVsYXRlcyB0byB0aGUgYmFyIHdpZHRoIGluIHRoZSB0aW1lbGluZSBncmFwaC4KKyAgICBUaGUgdGltZXJfbmFtZSBpcyB1c2VkIHRvIGRldGVybWluZSB3aGljaCB0aW1lciBldmVudCB0cmlnZ2VyZWQgdGhpcyBldmVudC4KKworICAgIHRoZSBpbnRlcmZhY2UgdG8gdGhpcyBjbGFzcyBpcyB0aHJvdWdoIGZvdXIgcmVhZC1vbmx5IG9wZXJhdGlvbnM6CisgICAgMSkgZ2V0U3RhcnQoKSAgICAgLS0gcmV0dXJucyB0aGUgc3RhcnQgdGltZSBhcyA2NCBiaXQgaW50ZWdlcgorICAgIDIpIGdldFN0b3AoKSAgICAgIC0tIHJldHVybnMgdGhlIHN0b3AgdGltZSBhcyA2NCBiaXQgaW50ZWdlcgorICAgIDMpIGdldE5lc3RMZXZlbCgpIC0tIHJldHVybnMgdGhlIG5lc3QgbGV2ZWwgb2YgdGhlIGV2ZW50CisgICAgNCkgZ2V0VGltZXJOYW1lKCkgLS0gcmV0dXJucyB0aGUgdGltZXIgbmFtZSB0aGF0IHRyaWdnZXJlZCBldmVudAorCisgICAgKk1PUkUgT04gTkVTVF9MRVZFTCoKKyAgICBUaGUgbmVzdCBsZXZlbCBpcyB1c2VkIGluIHRoZSBiYXIgZ3JhcGggdGhhdCByZXByZXNlbnRzIHRoZSB0aW1lbGluZS4KKyAgICBJdHMgbWFpbiBwdXJwb3NlIGlzIGZvciBzaG93aW5nIGhvdyBldmVudHMgYXJlIG5lc3RlZCBpbnNpZGUgZWFjaG90aGVyLgorICAgIEZvciBleGFtcGxlLCBzYXkgZXZlbnRzLCBBLCBCLCBhbmQgQyBhcmUgcmVjb3JkZWQuICBJZiB0aGUgdGltZWxpbmUKKyAgICBsb29rcyBsaWtlIHRoaXM6CisKK0JlZ2luIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+IFRpbWUKKyAgICAgICAgIHwgICAgfCAgICAgICAgICB8ICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICAgIHwKKyAgICAgICAgIEEgICAgQiAgICAgICAgICBDICAgICAgICBDICAgICAgICAgIEIgICAgICAgICAgICAgIEEKKyAgICAgICBzdGFydCBzdGFydCAgICAgc3RhcnQgICAgIGVuZCAgICAgICAgZW5kICAgICAgICAgICAgZW5kCisKKyAgICAgICBUaGVuIEEsIEIsIEMgd2lsbCBoYXZlIGEgbmVzdCBsZXZlbCBvZiAxLCAyLCAzIHJlc3BlY3RpdmVseS4KKyAgICAgICBUaGVzZSB2YWx1ZXMgYXJlIHRoZW4gdXNlZCB0byBjYWxjdWxhdGUgdGhlIGJhcndpZHRoIHNvIHlvdSBjYW4KKyAgICAgICBzZWUgdGhhdCBpbnNpZGUgQSwgQiBoYXMgb2NjdXJyZWQsIGFuZCBpbnNpZGUgQiwgQyBoYXMgb2NjdXJyZWQuCisgICAgICAgQ3VycmVudGx5LCB0aGlzIGlzIHNob3duIHdpdGggQSdzIGJhciB3aWR0aCBiZWluZyBsYXJnZXIgdGhhbiBCJ3MKKyAgICAgICBiYXIgd2lkdGgsIGFuZCBCJ3MgYmFyIHdpZHRoIGJlaW5nIGxhcmdlciB0aGFuIEMncyBiYXIgd2lkdGguCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK2NsYXNzIGttcF9zdGF0c19ldmVudCB7CisgICAgdWludDY0X3Qgc3RhcnQ7CisgICAgdWludDY0X3Qgc3RvcDsKKyAgICBpbnQgbmVzdF9sZXZlbDsKKyAgICB0aW1lcl9lIHRpbWVyX25hbWU7CisgcHVibGljOgorICAgIGttcF9zdGF0c19ldmVudCgpIDogc3RhcnQoMCksIHN0b3AoMCksIG5lc3RfbGV2ZWwoMCksIHRpbWVyX25hbWUoVElNRVJfTEFTVCkge30KKyAgICBrbXBfc3RhdHNfZXZlbnQodWludDY0X3Qgc3RydCwgdWludDY0X3Qgc3RwLCBpbnQgbnN0LCB0aW1lcl9lIG5tZSkgOiBzdGFydChzdHJ0KSwgc3RvcChzdHApLCBuZXN0X2xldmVsKG5zdCksIHRpbWVyX25hbWUobm1lKSB7fQorICAgIGlubGluZSB1aW50NjRfdCAgZ2V0U3RhcnQoKSBjb25zdCB7IHJldHVybiBzdGFydDsgfQorICAgIGlubGluZSB1aW50NjRfdCAgZ2V0U3RvcCgpIGNvbnN0ICB7IHJldHVybiBzdG9wOyAgfQorICAgIGlubGluZSBpbnQgICAgICAgZ2V0TmVzdExldmVsKCkgY29uc3QgeyByZXR1cm4gbmVzdF9sZXZlbDsgfQorICAgIGlubGluZSB0aW1lcl9lICAgZ2V0VGltZXJOYW1lKCkgY29uc3QgeyByZXR1cm4gdGltZXJfbmFtZTsgfQorfTsKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIENsYXNzIHRvIGltcGxlbWVudCBhIGR5bmFtaWNhbGx5IGV4cGFuZGFibGUgYXJyYXkgb2YgZXZlbnRzCisKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB8IGV2ZW50IDEgfCBldmVudCAyIHwgZXZlbnQgMyB8IGV2ZW50IDQgfCAuLi4gfCBldmVudCBOIHwKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEFuIGV2ZW50IGlzIHB1c2hlZCBvbnRvIHRoZSBiYWNrIG9mIHRoaXMgYXJyYXkgYXQgZXZlcnkKKyAgICBleHBsaWNpdFRpbWVyLT5zdG9wKCkgY2FsbC4gIFRoZSBldmVudCByZWNvcmRzIHRoZSB0aHJlYWQgIywKKyAgICBzdGFydCB0aW1lLCBzdG9wIHRpbWUsIGFuZCBuZXN0IGxldmVsIHJlbGF0ZWQgdG8gdGhlIGJhciB3aWR0aC4KKworICAgIFRoZSBldmVudCB2ZWN0b3Igc3RhcnRzIGF0IHNpemUgSU5JVF9TSVpFIGFuZCBncm93cyAoZG91YmxlcyBpbiBzaXplKQorICAgIGlmIG5lZWRlZC4gIEFuIGltcGxpY2F0aW9uIG9mIHRoaXMgYmVoYXZpb3IgaXMgdGhhdCBsb2coTikKKyAgICByZWFsbG9jYXRpb25zIGFyZSBuZWVkZWQgKHdoZXJlIE4gaXMgbnVtYmVyIG9mIGV2ZW50cykuICBJZiB5b3Ugd2FudAorICAgIHRvIGF2b2lkIHJlYWxsb2NhdGlvbnMsIHRoZW4gc2V0IElOSVRfU0laRSB0byBhIGxhcmdlIHZhbHVlLgorCisgICAgdGhlIGludGVyZmFjZSB0byB0aGlzIGNsYXNzIGlzIHRocm91Z2ggc2l4IG9wZXJhdGlvbnM6CisgICAgMSkgcmVzZXQoKSAtLSBzZXRzIHRoZSBpbnRlcm5hbF9zaXplIGJhY2sgdG8gMCBidXQgZG9lcyBub3QgZGVhbGxvY2F0ZSBhbnkgbWVtb3J5CisgICAgMikgc2l6ZSgpICAtLSByZXR1cm5zIHRoZSBudW1iZXIgb2YgdmFsaWQgZWxlbWVudHMgaW4gdGhlIHZlY3RvcgorICAgIDMpIHB1c2hfYmFjayhzdGFydCwgc3RvcCwgbmVzdCwgdGltZXJfbmFtZSkgLS0gcHVzaGVzIGFuIGV2ZW50IG9udG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiYWNrIG9mIHRoZSBhcnJheQorICAgIDQpIGRlYWxsb2NhdGUoKSAtLSBmcmVlcyBhbGwgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUgdmVjdG9yCisgICAgNSkgc29ydCgpIC0tIHNvcnRzIHRoZSB2ZWN0b3IgYnkgc3RhcnQgdGltZQorICAgIDYpIG9wZXJhdG9yW2luZGV4XSBvciBhdChpbmRleCkgLS0gcmV0dXJucyBldmVudCByZWZlcmVuY2UgYXQgdGhhdCBpbmRleAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCitjbGFzcyBrbXBfc3RhdHNfZXZlbnRfdmVjdG9yIHsKKyAgICBrbXBfc3RhdHNfZXZlbnQqIGV2ZW50czsKKyAgICBpbnQgaW50ZXJuYWxfc2l6ZTsKKyAgICBpbnQgYWxsb2NhdGVkX3NpemU7CisgICAgc3RhdGljIGNvbnN0IGludCBJTklUX1NJWkUgPSAxMDI0OworIHB1YmxpYzoKKyAgICBrbXBfc3RhdHNfZXZlbnRfdmVjdG9yKCkgeworICAgICAgICBldmVudHMgPSAoa21wX3N0YXRzX2V2ZW50KilfX2ttcF9hbGxvY2F0ZShzaXplb2Yoa21wX3N0YXRzX2V2ZW50KSpJTklUX1NJWkUpOworICAgICAgICBpbnRlcm5hbF9zaXplID0gMDsKKyAgICAgICAgYWxsb2NhdGVkX3NpemUgPSBJTklUX1NJWkU7CisgICAgfQorICAgfmttcF9zdGF0c19ldmVudF92ZWN0b3IoKSB7fQorICAgIGlubGluZSB2b2lkIHJlc2V0KCkgeyBpbnRlcm5hbF9zaXplID0gMDsgfQorICAgIGlubGluZSBpbnQgIHNpemUoKSBjb25zdCB7IHJldHVybiBpbnRlcm5hbF9zaXplOyB9CisgICAgdm9pZCBwdXNoX2JhY2sodWludDY0X3Qgc3RhcnRfdGltZSwgdWludDY0X3Qgc3RvcF90aW1lLCBpbnQgbmVzdF9sZXZlbCwgdGltZXJfZSBuYW1lKSB7CisgICAgICAgIGludCBpOworICAgICAgICBpZihpbnRlcm5hbF9zaXplID09IGFsbG9jYXRlZF9zaXplKSB7CisgICAgICAgICAgICBrbXBfc3RhdHNfZXZlbnQqIHRtcCA9IChrbXBfc3RhdHNfZXZlbnQqKV9fa21wX2FsbG9jYXRlKHNpemVvZihrbXBfc3RhdHNfZXZlbnQpKmFsbG9jYXRlZF9zaXplKjIpOworICAgICAgICAgICAgZm9yKGk9MDtpPGludGVybmFsX3NpemU7aSsrKSB0bXBbaV0gPSBldmVudHNbaV07CisgICAgICAgICAgICBfX2ttcF9mcmVlKGV2ZW50cyk7CisgICAgICAgICAgICBldmVudHMgPSB0bXA7CisgICAgICAgICAgICBhbGxvY2F0ZWRfc2l6ZSo9MjsKKyAgICAgICAgfQorICAgICAgICBldmVudHNbaW50ZXJuYWxfc2l6ZV0gPSBrbXBfc3RhdHNfZXZlbnQoc3RhcnRfdGltZSwgc3RvcF90aW1lLCBuZXN0X2xldmVsLCBuYW1lKTsKKyAgICAgICAgaW50ZXJuYWxfc2l6ZSsrOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHZvaWQgZGVhbGxvY2F0ZSgpOworICAgIHZvaWQgc29ydCgpOworICAgIGNvbnN0IGttcF9zdGF0c19ldmVudCAmIG9wZXJhdG9yW10oaW50IGluZGV4KSBjb25zdCB7IHJldHVybiBldmVudHNbaW5kZXhdOyB9CisgICAgICAgICAga21wX3N0YXRzX2V2ZW50ICYgb3BlcmF0b3JbXShpbnQgaW5kZXgpIHsgcmV0dXJuIGV2ZW50c1tpbmRleF07IH0KKyAgICBjb25zdCBrbXBfc3RhdHNfZXZlbnQgJiBhdChpbnQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIGV2ZW50c1tpbmRleF07IH0KKyAgICAgICAgICBrbXBfc3RhdHNfZXZlbnQgJiBhdChpbnQgaW5kZXgpIHsgcmV0dXJuIGV2ZW50c1tpbmRleF07IH0KK307CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBDbGFzcyB0byBpbXBsZW1lbnQgYSBkb3VibHktbGlua2VkLCBjaXJjdWxhciwgc3RhdGlzdGljcyBsaXN0CisKKyAgICB8LS0tfCAtLS0+IHwtLS18IC0tLT4gfC0tLXwgLS0tPiB8LS0tfCAtLS0+IC4uLiBuZXh0CisgICAgfCAgIHwgICAgICB8ICAgfCAgICAgIHwgICB8ICAgICAgfCAgIHwKKyAgICB8LS0tfCA8LS0tIHwtLS18IDwtLS0gfC0tLXwgPC0tLSB8LS0tfCA8LS0tIC4uLiBwcmV2CisgICAgU2VudGluZWwgICBmaXJzdCAgICAgIHNlY29uZCAgICAgdGhpcmQKKyAgICBOb2RlICAgICAgIG5vZGUgICAgICAgbm9kZSAgICAgICBub2RlCisKKyAgICBUaGUgU2VudGluZWwgTm9kZSBpcyB0aGUgdXNlciBoYW5kbGUgb24gdGhlIGxpc3QuCisgICAgVGhlIGZpcnN0IG5vZGUgY29ycmVzcG9uZHMgdG8gdGhyZWFkIDAncyBzdGF0aXN0aWNzLgorICAgIFRoZSBzZWNvbmQgbm9kZSBjb3JyZXNwb25kcyB0byB0aHJlYWQgMSdzIHN0YXRpc3RpY3MgYW5kIHNvIG9uLi4uCisKKyAgICBFYWNoIG5vZGUgaGFzIGEgX3RpbWVycywgX2NvdW50ZXJzLCBhbmQgX2V4cGxpY2l0VGltZXJzIGFycmF5IHRvCisgICAgaG9sZCB0aGF0IHRocmVhZCdzIHN0YXRpc3RpY3MuICBUaGUgX2V4cGxpY2l0VGltZXJzCisgICAgcG9pbnQgdG8gdGhlIGNvcnJlY3QgX3RpbWVyIGFuZCB1cGRhdGUgaXRzIHN0YXRpc3RpY3MgYXQgZXZlcnkgc3RvcCgpIGNhbGwuCisgICAgVGhlIGV4cGxpY2l0VGltZXJzJyBwb2ludGVycyBhcmUgc2V0IHVwIGluIHRoZSBjb25zdHJ1Y3Rvci4KKyAgICBFYWNoIG5vZGUgYWxzbyBoYXMgYW4gZXZlbnQgdmVjdG9yIHRvIGhvbGQgdGhhdCB0aHJlYWQncyB0aW1pbmcgZXZlbnRzLgorICAgIFRoZSBldmVudCB2ZWN0b3IgZXhwYW5kcyBhcyBuZWNlc3NhcnkgYW5kIHJlY29yZHMgdGhlIHN0YXJ0LXN0b3AgdGltZXMKKyAgICBmb3IgZWFjaCB0aW1lci4KKworICAgIFRoZSBuZXN0TGV2ZWwgdmFyaWFibGUgaXMgZm9yIHBsb3R0aW5nIGV2ZW50cyBhbmQgaXMgcmVsYXRlZAorICAgIHRvIHRoZSBiYXIgd2lkdGggaW4gdGhlIHRpbWVsaW5lIGdyYXBoLgorCisgICAgRXZlcnkgdGhyZWFkIHdpbGwgaGF2ZSBhIF9fdGhyZWFkIGxvY2FsIHBvaW50ZXIgdG8gaXRzIG5vZGUgaW4KKyAgICB0aGUgbGlzdC4gIFRoZSBzZW50aW5lbCBub2RlIGlzIHVzZWQgYnkgdGhlIG1hc3RlciB0aHJlYWQgdG8KKyAgICBzdG9yZSAiZHVtbXkiIHN0YXRpc3RpY3MgYmVmb3JlIF9fa21wX2NyZWF0ZV93b3JrZXIoKSBpcyBjYWxsZWQuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK2NsYXNzIGttcF9zdGF0c19saXN0IHsKKyAgICBpbnQgZ3RpZDsKKyAgICB0aW1lU3RhdCAgICAgIF90aW1lcnNbVElNRVJfTEFTVCsxXTsKKyAgICBjb3VudGVyICAgICAgIF9jb3VudGVyc1tDT1VOVEVSX0xBU1QrMV07CisgICAgZXhwbGljaXRUaW1lciBfZXhwbGljaXRUaW1lcnNbRVhQTElDSVRfVElNRVJfTEFTVCsxXTsKKyAgICBpbnQgICAgICAgICAgIF9uZXN0TGV2ZWw7IC8vIG9uZSBwZXIgdGhyZWFkCisgICAga21wX3N0YXRzX2V2ZW50X3ZlY3RvciBfZXZlbnRfdmVjdG9yOworICAgIGttcF9zdGF0c19saXN0KiBuZXh0OworICAgIGttcF9zdGF0c19saXN0KiBwcmV2OworIHB1YmxpYzoKKyAgICBrbXBfc3RhdHNfbGlzdCgpIDogbmV4dCh0aGlzKSAsIHByZXYodGhpcykgLCBfZXZlbnRfdmVjdG9yKCksIF9uZXN0TGV2ZWwoMCkgeworI2RlZmluZSBkb0luaXQobmFtZSxpZ25vcmUxLGlnbm9yZTIpIFwKKyAgICAgICAgZ2V0RXhwbGljaXRUaW1lcihFWFBMSUNJVF9USU1FUl8jI25hbWUpLT5zZXRTdGF0KGdldFRpbWVyKFRJTUVSXyMjbmFtZSkpOworICAgICAgICBLTVBfRk9SRUFDSF9FWFBMSUNJVF9USU1FUihkb0luaXQsMCk7CisjdW5kZWYgZG9Jbml0CisgICAgfQorICAgfmttcF9zdGF0c19saXN0KCkgeyB9CisgICAgaW5saW5lIHRpbWVTdGF0ICogICAgICBnZXRUaW1lcih0aW1lcl9lIGlkeCkgICAgICAgICAgICAgICAgICB7IHJldHVybiAmX3RpbWVyc1tpZHhdOyB9CisgICAgaW5saW5lIGNvdW50ZXIgICogICAgICBnZXRDb3VudGVyKGNvdW50ZXJfZSBpZHgpICAgICAgICAgICAgICB7IHJldHVybiAmX2NvdW50ZXJzW2lkeF07IH0KKyAgICBpbmxpbmUgZXhwbGljaXRUaW1lciAqIGdldEV4cGxpY2l0VGltZXIoZXhwbGljaXRfdGltZXJfZSBpZHgpIHsgcmV0dXJuICZfZXhwbGljaXRUaW1lcnNbaWR4XTsgfQorICAgIGlubGluZSB0aW1lU3RhdCAqICAgICAgZ2V0VGltZXJzKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gX3RpbWVyczsgfQorICAgIGlubGluZSBjb3VudGVyICAqICAgICAgZ2V0Q291bnRlcnMoKSAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gX2NvdW50ZXJzOyB9CisgICAgaW5saW5lIGV4cGxpY2l0VGltZXIgKiBnZXRFeHBsaWNpdFRpbWVycygpICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBfZXhwbGljaXRUaW1lcnM7IH0KKyAgICBpbmxpbmUga21wX3N0YXRzX2V2ZW50X3ZlY3RvciAmIGdldEV2ZW50VmVjdG9yKCkgICAgICAgICAgICAgIHsgcmV0dXJuIF9ldmVudF92ZWN0b3I7IH0KKyAgICBpbmxpbmUgdm9pZCByZXNldEV2ZW50VmVjdG9yKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgX2V2ZW50X3ZlY3Rvci5yZXNldCgpOyB9CisgICAgaW5saW5lIHZvaWQgaW5jcmVtZW50TmVzdFZhbHVlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IF9uZXN0TGV2ZWwrKzsgfQorICAgIGlubGluZSBpbnQgIGdldE5lc3RWYWx1ZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gX25lc3RMZXZlbDsgfQorICAgIGlubGluZSB2b2lkIGRlY3JlbWVudE5lc3RWYWx1ZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBfbmVzdExldmVsLS07IH0KKyAgICBpbmxpbmUgaW50ICBnZXRHdGlkKCkgY29uc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIGd0aWQ7IH0KKyAgICBpbmxpbmUgdm9pZCBzZXRHdGlkKGludCBuZXdndGlkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ3RpZCA9IG5ld2d0aWQ7IH0KKyAgICBrbXBfc3RhdHNfbGlzdCogcHVzaF9iYWNrKGludCBndGlkKTsgLy8gcmV0dXJucyBuZXdseSBjcmVhdGVkIGxpc3Qgbm9kZQorICAgIGlubGluZSB2b2lkICAgICBwdXNoX2V2ZW50KHVpbnQ2NF90IHN0YXJ0X3RpbWUsIHVpbnQ2NF90IHN0b3BfdGltZSwgaW50IG5lc3RfbGV2ZWwsIHRpbWVyX2UgbmFtZSkgeworICAgICAgICBfZXZlbnRfdmVjdG9yLnB1c2hfYmFjayhzdGFydF90aW1lLCBzdG9wX3RpbWUsIG5lc3RfbGV2ZWwsIG5hbWUpOworICAgIH0KKyAgICB2b2lkIGRlYWxsb2NhdGUoKTsKKyAgICBjbGFzcyBpdGVyYXRvcjsKKyAgICBrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3IgYmVnaW4oKTsKKyAgICBrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3IgZW5kKCk7CisgICAgaW50IHNpemUoKTsKKyAgICBjbGFzcyBpdGVyYXRvciB7CisgICAgICAgIGttcF9zdGF0c19saXN0KiBwdHI7CisgICAgICAgIGZyaWVuZCBrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3Iga21wX3N0YXRzX2xpc3Q6OmJlZ2luKCk7CisgICAgICAgIGZyaWVuZCBrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3Iga21wX3N0YXRzX2xpc3Q6OmVuZCgpOworICAgICAgcHVibGljOgorICAgICAgICBpdGVyYXRvcigpOworICAgICAgIH5pdGVyYXRvcigpOworICAgICAgICBpdGVyYXRvciBvcGVyYXRvcisrKCk7CisgICAgICAgIGl0ZXJhdG9yIG9wZXJhdG9yKysoaW50IGR1bW15KTsKKyAgICAgICAgaXRlcmF0b3Igb3BlcmF0b3ItLSgpOworICAgICAgICBpdGVyYXRvciBvcGVyYXRvci0tKGludCBkdW1teSk7CisgICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBpdGVyYXRvciAmIHJocyk7CisgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBpdGVyYXRvciAmIHJocyk7CisgICAgICAgIGttcF9zdGF0c19saXN0KiBvcGVyYXRvciooKSBjb25zdDsgLy8gZGVyZWZlcmVuY2Ugb3BlcmF0b3IKKyAgICB9OworfTsKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgQ2xhc3MgdG8gZW5jYXBzdWxhdGUgYWxsIG91dHB1dCBmdW5jdGlvbnMgYW5kIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKKworICAgVGhpcyBtb2R1bGUgaG9sZHMgZmlsZW5hbWVzIGZvciB2YXJpb3VzIG91dHB1dHMgKG5vcm1hbCBzdGF0cywgZXZlbnRzLCBwbG90IGZpbGUpLAorICAgYXMgd2VsbCBhcyBjb2xvcmluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIHBsb3QgZmlsZS4KKworICAgVGhlIGZpbGVuYW1lcyBhbmQgZmxhZ3MgdmFyaWFibGVzIGFyZSByZWFkIGZyb20gZW52aXJvbm1lbnQgdmFyaWFibGVzLgorICAgVGhlc2UgYXJlIHJlYWQgb25jZSBieSB0aGUgY29uc3RydWN0b3Igb2YgdGhlIGdsb2JhbCB2YXJpYWJsZSBfX2ttcF9zdGF0c19vdXRwdXQKKyAgIHdoaWNoIGNhbGxzIGluaXQoKS4KKworICAgRHVyaW5nIHRoaXMgaW5pdCgpIGNhbGwsIGV2ZW50IGZsYWdzIGZvciB0aGUgdGltZVN0YXQ6OnRpbWVySW5mb1tdIGdsb2JhbCBhcnJheQorICAgYXJlIGNsZWFyZWQgaWYgS01QX1NUQVRTX0VWRU5UUyBpcyBub3QgdHJ1ZSAob24sIDEsIHllcykuCisKKyAgIFRoZSBvbmx5IGludGVyZmFjZSBmdW5jdGlvbiB0aGF0IGlzIHB1YmxpYyBpcyBvdXRwdXRTdGF0cyhoZWFkaW5nKS4gIFRoaXMgZnVuY3Rpb24KKyAgIHNob3VsZCBwcmludCBvdXQgZXZlcnl0aGluZyBpdCBuZWVkcyB0bywgZWl0aGVyIHRvIGZpbGVzIG9yIHN0ZGVyciwKKyAgIGRlcGVuZGluZyBvbiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGRlc2NyaWJlZCBiZWxvdworCisgICBFTlZJUk9OTUVOVCBWQVJJQUJMRVM6CisgICBLTVBfU1RBVFNfRklMRSAtLSBpZiBzZXQsIGFsbCBzdGF0aXN0aWNzIChub3QgZXZlbnRzKSB3aWxsIGJlIHByaW50ZWQgdG8gdGhpcyBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlLCBwcmludCB0byBzdGRlcnIKKyAgIEtNUF9TVEFUU19USFJFQURTIC0tIGlmIHNldCB0byAib24iLCB0aGVuIHdpbGwgcHJpbnQgcGVyIHRocmVhZCBzdGF0aXN0aWNzIHRvIGVpdGhlcgorICAgICAgICAgICAgICAgICAgICAgICAgS01QX1NUQVRTX0ZJTEUgb3Igc3RkZXJyCisgICBLTVBfU1RBVFNfUExPVF9GSUxFIC0tIGlmIHNldCwgcHJpbnQgdGhlIHBsb3RpY3VzIHBsb3QgZmlsZSB0byB0aGlzIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UsIHRoZSBwbG90IGZpbGUgaXMgc2VudCB0byAiZXZlbnRzLnBsdCIKKyAgIEtNUF9TVEFUU19FVkVOVFMgLS0gaWYgc2V0IHRvICJvbiIsIHRoZW4gbG9nIGV2ZW50cywgb3RoZXJ3aXNlLCBkb24ndCBsb2cgZXZlbnRzCisgICBLTVBfU1RBVFNfRVZFTlRTX0ZJTEUgLS0gaWYgc2V0LCBhbGwgZXZlbnRzIGFyZSBvdXRwdXR0ZWQgdG8gdGhpcyBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSwgb3V0cHV0IGlzIHNlbnQgdG8gImV2ZW50cy5kYXQiCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK2NsYXNzIGttcF9zdGF0c19vdXRwdXRfbW9kdWxlIHsKKworIHB1YmxpYzoKKyAgICBzdHJ1Y3QgcmdiX2NvbG9yIHsKKyAgICAgICAgZmxvYXQgcjsKKyAgICAgICAgZmxvYXQgZzsKKyAgICAgICAgZmxvYXQgYjsKKyAgICB9OworCisgcHJpdmF0ZToKKyAgICBzdGF0aWMgY29uc3QgY2hhciogb3V0cHV0RmlsZU5hbWU7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGV2ZW50c0ZpbGVOYW1lOworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBwbG90RmlsZU5hbWU7CisgICAgc3RhdGljIGludCBwcmludFBlclRocmVhZEZsYWc7CisgICAgc3RhdGljIGludCBwcmludFBlclRocmVhZEV2ZW50c0ZsYWc7CisgICAgc3RhdGljIGNvbnN0IHJnYl9jb2xvciBnbG9iYWxDb2xvckFycmF5W107CisgICAgc3RhdGljICAgICAgIHJnYl9jb2xvciB0aW1lckNvbG9ySW5mb1tdOworCisgICAgdm9pZCBpbml0KCk7CisgICAgc3RhdGljIHZvaWQgc2V0dXBFdmVudENvbG9ycygpOworICAgIHN0YXRpYyB2b2lkIHByaW50UGxvdGljdXNGaWxlKCk7CisgICAgc3RhdGljIHZvaWQgcHJpbnRTdGF0cyhGSUxFICpzdGF0c091dCwgc3RhdGlzdGljIGNvbnN0ICogdGhlU3RhdHMsIGJvb2wgYXJlVGltZXJzKTsKKyAgICBzdGF0aWMgdm9pZCBwcmludENvdW50ZXJzKEZJTEUgKiBzdGF0c091dCwgY291bnRlciBjb25zdCAqIHRoZUNvdW50ZXJzKTsKKyAgICBzdGF0aWMgdm9pZCBwcmludEV2ZW50cyhGSUxFICogZXZlbnRzT3V0LCBrbXBfc3RhdHNfZXZlbnRfdmVjdG9yKiB0aGVFdmVudHMsIGludCBndGlkKTsKKyAgICBzdGF0aWMgcmdiX2NvbG9yIGdldEV2ZW50Q29sb3IodGltZXJfZSBlKSB7IHJldHVybiB0aW1lckNvbG9ySW5mb1tlXTsgfQorICAgIHN0YXRpYyB2b2lkIHdpbmR1cEV4cGxpY2l0VGltZXJzKCk7CisgICAgYm9vbCBldmVudFByaW50aW5nRW5hYmxlZCgpIHsKKyAgICAgICAgaWYocHJpbnRQZXJUaHJlYWRFdmVudHNGbGFnKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZWxzZSByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGJvb2wgcGVyVGhyZWFkUHJpbnRpbmdFbmFibGVkKCkgeworICAgICAgICBpZihwcmludFBlclRocmVhZEZsYWcpIHJldHVybiB0cnVlOworICAgICAgICBlbHNlIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyBwdWJsaWM6CisgICAga21wX3N0YXRzX291dHB1dF9tb2R1bGUoKSB7IGluaXQoKTsgfQorICAgIHZvaWQgb3V0cHV0U3RhdHMoY29uc3QgY2hhciogaGVhZGluZyk7Cit9OworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCit2b2lkIF9fa21wX3N0YXRzX2luaXQoKTsKK3ZvaWQgX19rbXBfcmVzZXRfc3RhdHMoKTsKK3ZvaWQgX19rbXBfb3V0cHV0X3N0YXRzKGNvbnN0IGNoYXIgKik7Cit2b2lkIF9fa21wX2FjY3VtdWxhdGVfc3RhdHNfYXRfZXhpdCh2b2lkKTsKKy8vIHRocmVhZCBsb2NhbCBwb2ludGVyIHRvIHN0YXRzIG5vZGUgd2l0aGluIGxpc3QKK2V4dGVybiBfX3RocmVhZCBrbXBfc3RhdHNfbGlzdCogX19rbXBfc3RhdHNfdGhyZWFkX3B0cjsKKy8vIGhlYWQgdG8gc3RhdHMgbGlzdC4KK2V4dGVybiBrbXBfc3RhdHNfbGlzdCBfX2ttcF9zdGF0c19saXN0OworLy8gbG9jayBmb3IgX19rbXBfc3RhdHNfbGlzdAorZXh0ZXJuIGttcF90YXNfbG9ja190ICBfX2ttcF9zdGF0c19sb2NrOworLy8gcmVmZXJlbmNlIHN0YXJ0IHRpbWUKK2V4dGVybiB0c2NfdGlja19jb3VudCBfX2ttcF9zdGF0c19zdGFydF90aW1lOworLy8gaW50ZXJmYWNlIHRvIG91dHB1dAorZXh0ZXJuIGttcF9zdGF0c19vdXRwdXRfbW9kdWxlIF9fa21wX3N0YXRzX291dHB1dDsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworLy8gU2ltcGxlLCBzdGFuZGFyZCBpbnRlcmZhY2VzIHRoYXQgZHJvcCBvdXQgY29tcGxldGVseSBpZiBzdGF0cyBhcmVuJ3QgZW5hYmxlZAorCisKKy8qIQorICogXGJyaWVmIFVzZXMgc3BlY2lmaWVkIHRpbWVyIChuYW1lKSB0byB0aW1lIGNvZGUgYmxvY2suCisgKgorICogQHBhcmFtIG5hbWUgdGltZXIgbmFtZSBhcyBzcGVjaWZpZWQgdW5kZXIgdGhlIEtNUF9GT1JFQUNIX1RJTUVSKCkgbWFjcm8KKyAqCisgKiBcZGV0YWlscyBVc2UgS01QX1RJTUVfQkxPQ0sobmFtZSkgbWFjcm8gdG8gdGltZSBhIGNvZGUgYmxvY2suICBUaGlzIHdpbGwgcmVjb3JkIHRoZSB0aW1lIHRha2VuIGluIHRoZSBibG9jaworICogYW5kIHVzZSB0aGUgZGVzdHJ1Y3RvciB0byBzdG9wIHRoZSB0aW1lci4gIENvbnZlbmllbnQhCisgKiBXaXRoIHRoaXMgZGVmaW5pdGlvbiB5b3UgY2FuJ3QgaGF2ZSBtb3JlIHRoYW4gb25lIEtNUF9USU1FX0JMT0NLIGluIHRoZSBzYW1lIGNvZGUgYmxvY2suCisgKiBJIGRvbid0IHRoaW5rIHRoYXQncyBhIHByb2JsZW0uCisgKgorICogQGluZ3JvdXAgU1RBVFNfR0FUSEVSSU5HCisqLworI2RlZmluZSBLTVBfVElNRV9CTE9DSyhuYW1lKSBcCisgICAgYmxvY2tUaW1lciBfX0JMT0NLVElNRV9fKF9fa21wX3N0YXRzX3RocmVhZF9wdHItPmdldFRpbWVyKFRJTUVSXyMjbmFtZSksIFRJTUVSXyMjbmFtZSkKKworLyohCisgKiBcYnJpZWYgQWRkcyB2YWx1ZSB0byBzcGVjaWZpZWQgdGltZXIgKG5hbWUpLgorICoKKyAqIEBwYXJhbSBuYW1lIHRpbWVyIG5hbWUgYXMgc3BlY2lmaWVkIHVuZGVyIHRoZSBLTVBfRk9SRUFDSF9USU1FUigpIG1hY3JvCisgKiBAcGFyYW0gdmFsdWUgZG91YmxlIHByZWNpc2lvbiBzYW1wbGUgdmFsdWUgdG8gYWRkIHRvIHN0YXRpc3RpY3MgZm9yIHRoZSB0aW1lcgorICoKKyAqIFxkZXRhaWxzIFVzZSBLTVBfQ09VTlRfVkFMVUUobmFtZSwgdmFsdWUpIG1hY3JvIHRvIGFkZCBhIHBhcnRpY3VsYXIgdmFsdWUgdG8gYSB0aW1lciBzdGF0aXN0aWNzLgorICoKKyAqIEBpbmdyb3VwIFNUQVRTX0dBVEhFUklORworKi8KKyNkZWZpbmUgS01QX0NPVU5UX1ZBTFVFKG5hbWUsIHZhbHVlKSBcCisgICAgX19rbXBfc3RhdHNfdGhyZWFkX3B0ci0+Z2V0VGltZXIoVElNRVJfIyNuYW1lKS0+YWRkU2FtcGxlKHZhbHVlKQorCisvKiEKKyAqIFxicmllZiBJbmNyZW1lbnRzIHNwZWNpZmllZCBjb3VudGVyIChuYW1lKS4KKyAqCisgKiBAcGFyYW0gbmFtZSBjb3VudGVyIG5hbWUgYXMgc3BlY2lmaWVkIHVuZGVyIHRoZSBLTVBfRk9SRUFDSF9DT1VOVEVSKCkgbWFjcm8KKyAqCisgKiBcZGV0YWlscyBVc2UgS01QX0NPVU5UX0JMT0NLKG5hbWUsIHZhbHVlKSBtYWNybyB0byBpbmNyZW1lbnQgYSBzdGF0aXN0aWNzIGNvdW50ZXIgZm9yIHRoZSBleGVjdXRpbmcgdGhyZWFkLgorICoKKyAqIEBpbmdyb3VwIFNUQVRTX0dBVEhFUklORworKi8KKyNkZWZpbmUgS01QX0NPVU5UX0JMT0NLKG5hbWUpIFwKKyAgIF9fa21wX3N0YXRzX3RocmVhZF9wdHItPmdldENvdW50ZXIoQ09VTlRFUl8jI25hbWUpLT5pbmNyZW1lbnQoKQorCisvKiEKKyAqIFxicmllZiAiU3RhcnRzIiBhbiBleHBsaWNpdCB0aW1lciB3aGljaCB3aWxsIG5lZWQgYSBjb3JyZXNwb25kaW5nIEtNUF9TVE9QX0VYUExJQ0lUX1RJTUVSKCkgbWFjcm8uCisgKgorICogQHBhcmFtIG5hbWUgZXhwbGljaXQgdGltZXIgbmFtZSBhcyBzcGVjaWZpZWQgdW5kZXIgdGhlIEtNUF9GT1JFQUNIX0VYUExJQ0lUX1RJTUVSKCkgbWFjcm8KKyAqCisgKiBcZGV0YWlscyBVc2UgdG8gc3RhcnQgYSB0aW1lci4gIFRoaXMgd2lsbCBuZWVkIGEgY29ycmVzcG9uZGluZyBLTVBfU1RPUF9FWFBMSUNJVF9USU1FUigpCisgKiBtYWNybyB0byBzdG9wIHRoZSB0aW1lciB1bmxpa2UgdGhlIEtNUF9USU1FX0JMT0NLKG5hbWUpIG1hY3JvIHdoaWNoIGhhcyBhbiBpbXBsaWNpdCBzdG9wcGluZyBtYWNybyBhdCB0aGUgZW5kCisgKiBvZiB0aGUgY29kZSBibG9jay4gIEFsbCBleHBsaWNpdCB0aW1lcnMgYXJlIHN0b3BwZWQgYXQgbGlicmFyeSBleGl0IHRpbWUgYmVmb3JlIHRoZSBmaW5hbCBzdGF0aXN0aWNzIGFyZSBvdXRwdXR0ZWQuCisgKgorICogQGluZ3JvdXAgU1RBVFNfR0FUSEVSSU5HCisqLworI2RlZmluZSBLTVBfU1RBUlRfRVhQTElDSVRfVElNRVIobmFtZSkgXAorICAgIF9fa21wX3N0YXRzX3RocmVhZF9wdHItPmdldEV4cGxpY2l0VGltZXIoRVhQTElDSVRfVElNRVJfIyNuYW1lKS0+c3RhcnQoVElNRVJfIyNuYW1lKQorCisvKiEKKyAqIFxicmllZiAiU3RvcHMiIGFuIGV4cGxpY2l0IHRpbWVyLgorICoKKyAqIEBwYXJhbSBuYW1lIGV4cGxpY2l0IHRpbWVyIG5hbWUgYXMgc3BlY2lmaWVkIHVuZGVyIHRoZSBLTVBfRk9SRUFDSF9FWFBMSUNJVF9USU1FUigpIG1hY3JvCisgKgorICogXGRldGFpbHMgVXNlIEtNUF9TVE9QX0VYUExJQ0lUX1RJTUVSKG5hbWUpIHRvIHN0b3AgYSB0aW1lci4gIFdoZW4gdGhpcyBpcyBkb25lLCB0aGUgdGltZSBiZXR3ZWVuIHRoZSBsYXN0IEtNUF9TVEFSVF9FWFBMSUNJVF9USU1FUihuYW1lKQorICogYW5kIHRoaXMgS01QX1NUT1BfRVhQTElDSVRfVElNRVIobmFtZSkgd2lsbCBiZSBhZGRlZCB0byB0aGUgdGltZXIncyBzdGF0IHZhbHVlLiAgVGhlIHRpbWVyIHdpbGwgdGhlbiBiZSByZXNldC4KKyAqIEFmdGVyIHRoZSBLTVBfU1RPUF9FWFBMSUNJVF9USU1FUihuYW1lKSBtYWNybyBpcyBjYWxsZWQsIGFub3RoZXIgY2FsbCB0byBLTVBfU1RBUlRfRVhQTElDSVRfVElNRVIobmFtZSkgd2lsbCBzdGFydCB0aGUgdGltZXIgb25jZSBhZ2Fpbi4KKyAqCisgKiBAaW5ncm91cCBTVEFUU19HQVRIRVJJTkcKKyovCisjZGVmaW5lIEtNUF9TVE9QX0VYUExJQ0lUX1RJTUVSKG5hbWUpIFwKKyAgICBfX2ttcF9zdGF0c190aHJlYWRfcHRyLT5nZXRFeHBsaWNpdFRpbWVyKEVYUExJQ0lUX1RJTUVSXyMjbmFtZSktPnN0b3AoVElNRVJfIyNuYW1lKQorCisvKiEKKyAqIFxicmllZiBPdXRwdXRzIHRoZSBjdXJyZW50IHRocmVhZCBzdGF0aXN0aWNzIGFuZCByZXNldCB0aGVtLgorICoKKyAqIEBwYXJhbSBoZWFkaW5nX3N0cmluZyBoZWFkaW5nIHB1dCBhYm92ZSB0aGUgZmluYWwgc3RhdHMgb3V0cHV0CisgKgorICogXGRldGFpbHMgRXhwbGljaXRseSBzdG9wcyBhbGwgdGltZXJzIGFuZCBvdXRwdXRzIGFsbCBzdGF0cy4KKyAqIEVudmlyb25tZW50IHZhcmlhYmxlLCBgT01QVEJfU1RBVFNGSUxFPWZpbGVuYW1lYCwgY2FuIGJlIHVzZWQgdG8gb3V0cHV0IHRoZSBzdGF0cyB0byBhIGZpbGVuYW1lIGluc3RlYWQgb2Ygc3RkZXJyCisgKiBFbnZpcm9ubWVudCB2YXJpYWJsZSwgYE9NUFRCX1NUQVRTVEhSRUFEUz10cnVlfHVuZGVmaW5lZGAsIGNhbiBiZSB1c2VkIHRvIG91dHB1dCB0aHJlYWQgc3BlY2lmaWMgc3RhdHMKKyAqIEZvciBub3cgdGhlIGBPTVBUQl9TVEFUU1RIUkVBRFNgIGVudmlyb25tZW50IHZhcmlhYmxlIGNhbiBlaXRoZXIgYmUgZGVmaW5lZCB3aXRoIGFueSB2YWx1ZSwgd2hpY2ggd2lsbCBwcmludCBvdXQgdGhyZWFkCisgKiBzcGVjaWZpYyBzdGF0cywgb3IgaXQgY2FuIGJlIHVuZGVmaW5lZCAobm90IHNwZWNpZmllZCBpbiB0aGUgZW52aXJvbm1lbnQpIGFuZCB0aHJlYWQgc3BlY2lmaWMgc3RhdHMgd29uJ3QgYmUgcHJpbnRlZAorICogSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgYWxsIHN0YXRpc3RpY3MgYXJlIHJlc2V0IHdoZW4gdGhpcyBtYWNybyBpcyBjYWxsZWQuCisgKgorICogQGluZ3JvdXAgU1RBVFNfR0FUSEVSSU5HCisqLworI2RlZmluZSBLTVBfT1VUUFVUX1NUQVRTKGhlYWRpbmdfc3RyaW5nKSBcCisgICAgX19rbXBfb3V0cHV0X3N0YXRzKGhlYWRpbmdfc3RyaW5nKQorCisvKiEKKyAqIFxicmllZiByZXNldHMgYWxsIHN0YXRzIChjb3VudGVycyB0byAwLCB0aW1lcnMgdG8gMCBlbGFwc2VkIHRpY2tzKQorICoKKyAqIFxkZXRhaWxzIFJlc2V0IGFsbCBzdGF0cyBmb3IgYWxsIHRocmVhZHMuCisgKgorICogQGluZ3JvdXAgU1RBVFNfR0FUSEVSSU5HCisqLworI2RlZmluZSBLTVBfUkVTRVRfU1RBVFMoKSAgX19rbXBfcmVzZXRfc3RhdHMoKQorCisjaWYgKEtNUF9ERVZFTE9QRVJfU1RBVFMpCisjIGRlZmluZSBLTVBfVElNRV9ERVZFTE9QRVJfQkxPQ0sobikgICAgICAgICAgICAgS01QX1RJTUVfQkxPQ0sobikKKyMgZGVmaW5lIEtNUF9DT1VOVF9ERVZFTE9QRVJfVkFMVUUobix2KSAgICAgICAgICBLTVBfQ09VTlRfVkFMVUUobix2KQorIyBkZWZpbmUgS01QX0NPVU5UX0RFVkVMT1BFUl9CTE9DSyhuKSAgICAgICAgICAgIEtNUF9DT1VOVF9CTE9DSyhuKQorIyBkZWZpbmUgS01QX1NUQVJUX0RFVkVMT1BFUl9FWFBMSUNJVF9USU1FUihuKSAgIEtNUF9TVEFSVF9FWFBMSUNJVF9USU1FUihuKQorIyBkZWZpbmUgS01QX1NUT1BfREVWRUxPUEVSX0VYUExJQ0lUX1RJTUVSKG4pICAgIEtNUF9TVE9QX0VYUExJQ0lUX1RJTUVSKG4pCisjZWxzZQorLy8gTnVsbCBkZWZpbml0aW9ucworIyBkZWZpbmUgS01QX1RJTUVfREVWRUxPUEVSX0JMT0NLKG4pICAgICAgICAgICAgICgodm9pZCkwKQorIyBkZWZpbmUgS01QX0NPVU5UX0RFVkVMT1BFUl9WQUxVRShuLHYpICAgICAgICAgICgodm9pZCkwKQorIyBkZWZpbmUgS01QX0NPVU5UX0RFVkVMT1BFUl9CTE9DSyhuKSAgICAgICAgICAgICgodm9pZCkwKQorIyBkZWZpbmUgS01QX1NUQVJUX0RFVkVMT1BFUl9FWFBMSUNJVF9USU1FUihuKSAgICgodm9pZCkwKQorIyBkZWZpbmUgS01QX1NUT1BfREVWRUxPUEVSX0VYUExJQ0lUX1RJTUVSKG4pICAgICgodm9pZCkwKQorI2VuZGlmCisKKyNlbHNlIC8vIEtNUF9TVEFUU19FTkFCTEVECisKKy8vIE51bGwgZGVmaW5pdGlvbnMKKyNkZWZpbmUgS01QX1RJTUVfQkxPQ0sobikgICAgICAgICAgICAgKCh2b2lkKTApCisjZGVmaW5lIEtNUF9DT1VOVF9WQUxVRShuLHYpICAgICAgICAgICgodm9pZCkwKQorI2RlZmluZSBLTVBfQ09VTlRfQkxPQ0sobikgICAgICAgICAgICAoKHZvaWQpMCkKKyNkZWZpbmUgS01QX1NUQVJUX0VYUExJQ0lUX1RJTUVSKG4pICAgKCh2b2lkKTApCisjZGVmaW5lIEtNUF9TVE9QX0VYUExJQ0lUX1RJTUVSKG4pICAgICgodm9pZCkwKQorCisjZGVmaW5lIEtNUF9PVVRQVVRfU1RBVFMoaGVhZGluZ19zdHJpbmcpICgodm9pZCkwKQorI2RlZmluZSBLTVBfUkVTRVRfU1RBVFMoKSAgKCh2b2lkKTApCisKKyNkZWZpbmUgS01QX1RJTUVfREVWRUxPUEVSX0JMT0NLKG4pICAgICAgICAgICAgICgodm9pZCkwKQorI2RlZmluZSBLTVBfQ09VTlRfREVWRUxPUEVSX1ZBTFVFKG4sdikgICAgICAgICAgKCh2b2lkKTApCisjZGVmaW5lIEtNUF9DT1VOVF9ERVZFTE9QRVJfQkxPQ0sobikgICAgICAgICAgICAoKHZvaWQpMCkKKyNkZWZpbmUgS01QX1NUQVJUX0RFVkVMT1BFUl9FWFBMSUNJVF9USU1FUihuKSAgICgodm9pZCkwKQorI2RlZmluZSBLTVBfU1RPUF9ERVZFTE9QRVJfRVhQTElDSVRfVElNRVIobikgICAgKCh2b2lkKTApCisjZW5kaWYgIC8vIEtNUF9TVEFUU19FTkFCTEVECisKKyNlbmRpZiAvLyBLTVBfU1RBVFNfSApkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX3N0YXRzX3RpbWluZy5jcHAgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfc3RhdHNfdGltaW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGUyOWViCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX3N0YXRzX3RpbWluZy5jcHAKQEAgLTAsMCArMSwxNjggQEAKKy8qKiBAZmlsZSBrbXBfc3RhdHNfdGltaW5nLmNwcAorICogVGltaW5nIGZ1bmN0aW9ucworICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfc3RhdHNfdGltaW5nLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKKyNpZiBLTVBfSEFWRV9USUNLX1RJTUUKKyMgaWYgS01QX01JQworZG91YmxlIHRzY190aWNrX2NvdW50Ojp0aWNrX3RpbWUoKQoreworICAgIC8vIHByZXR0eSBiYWQgYXNzdW1wdGlvbiBvZiAxR0h6IGNsb2NrIGZvciBNSUMKKyAgICByZXR1cm4gMS8oKGRvdWJsZSkxMDAwKjEuZTYpOworfQorIyBlbGlmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyMgIGluY2x1ZGUgPHN0cmluZy5oPgorLy8gRXh0cmFjdCB0aGUgdmFsdWUgZnJvbSB0aGUgQ1BVSUQgaW5mb3JtYXRpb24KK2RvdWJsZSB0c2NfdGlja19jb3VudDo6dGlja190aW1lKCkKK3sKKyAgICBzdGF0aWMgZG91YmxlIHJlc3VsdCA9IDAuMDsKKworICAgIGlmIChyZXN1bHQgPT0gMC4wKQorICAgIHsKKyAgICAgICAga21wX2NwdWlkX3QgY3B1aW5mbzsKKyAgICAgICAgY2hhciBicmFuZFsyNTZdOworCisgICAgICAgIF9fa21wX3g4Nl9jcHVpZCgweDgwMDAwMDAwLCAwLCAmY3B1aW5mbyk7CisgICAgICAgIG1lbXNldChicmFuZCwgMCwgc2l6ZW9mKGJyYW5kKSk7CisgICAgICAgIGludCBpZHMgPSBjcHVpbmZvLmVheDsKKworICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpPTI7IGk8KGlkc14weDgwMDAwMDAwKSsyOyBpKyspCisgICAgICAgICAgICBfX2ttcF94ODZfY3B1aWQoaSB8IDB4ODAwMDAwMDAsIDAsIChrbXBfY3B1aWRfdCopKGJyYW5kKyhpLTIpKnNpemVvZihrbXBfY3B1aWRfdCkpKTsKKworICAgICAgICBjaGFyICogc3RhcnQgPSAmYnJhbmRbMF07CisgICAgICAgIGZvciAoOypzdGFydCA9PSAnICc7IHN0YXJ0KyspCisgICAgICAgICAgICA7CisgICAgCisgICAgICAgIGNoYXIgKiBlbmQgPSBicmFuZCArIEtNUF9TVFJMRU4oYnJhbmQpIC0gMzsKKyAgICAgICAgdWludDY0X3QgbXVsdGlwbGllcjsKKworICAgICAgICBpZiAoKmVuZCA9PSAnTScpIG11bHRpcGxpZXIgPSAxMDAwTEwqMTAwMExMOworICAgICAgICBlbHNlIGlmICgqZW5kID09ICdHJykgbXVsdGlwbGllciA9IDEwMDBMTCoxMDAwTEwqMTAwMExMOworICAgICAgICBlbHNlIGlmICgqZW5kID09ICdUJykgbXVsdGlwbGllciA9IDEwMDBMTCoxMDAwTEwqMTAwMExMKjEwMDBMTDsKKyAgICAgICAgZWxzZSAKKyAgICAgICAgeworICAgICAgICAgICAgY291dCA8PCAiRXJyb3IgZGV0ZXJtaW5pbmcgbXVsdGlwbGllciAnIiA8PCAqZW5kIDw8ICInXG4iOworICAgICAgICAgICAgZXhpdCAoLTEpOworICAgICAgICB9CisgICAgICAgICplbmQgPSAwOworICAgICAgICB3aGlsZSAoKmVuZCAhPSAnICcpIGVuZC0tOworICAgICAgICBlbmQrKzsKKyAgICAKKyAgICAgICAgZG91YmxlIGZyZXEgPSBzdHJ0b2QoZW5kLCAmc3RhcnQpOworICAgICAgICBpZiAoZnJlcSA9PSAwLjApIAorICAgICAgICB7CisgICAgICAgICAgICBjb3V0IDw8ICJFcnJvciBjYWxjdWxhdGluZyBmcmVxdWVuY3kgIiA8PCAgZW5kIDw8ICJcbiI7CisgICAgICAgICAgICBleGl0ICgtMSk7CisgICAgICAgIH0KKworICAgICAgICByZXN1bHQgPSAoKGRvdWJsZSkxLjApLyhmcmVxICogbXVsdGlwbGllcik7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisjIGVuZGlmCisjZW5kaWYKKworc3RhdGljIGJvb2wgdXNlU0kgPSB0cnVlOworCisvLyBSZXR1cm4gYSBmb3JtYXR0ZWQgc3RyaW5nIGFmdGVyIG5vcm1hbGlzaW5nIHRoZSB2YWx1ZSBpbnRvCisvLyBlbmdpbmVlcmluZyBzdHlsZSBhbmQgdXNpbmcgYSBzdWl0YWJsZSB1bml0IHByZWZpeCAoZS5nLiBtcywgdXMsIG5zKS4KK3N0ZDo6c3RyaW5nIGZvcm1hdFNJKGRvdWJsZSBpbnRlcnZhbCwgaW50IHdpZHRoLCBjaGFyIHVuaXQpCit7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gb3M7CisKKyAgICBpZiAodXNlU0kpCisgICAgeworICAgICAgICAvLyBQcmVzZXJ2ZSBhY2N1cmFjeSBmb3Igc21hbGwgbnVtYmVycywgc2luY2Ugd2Ugb25seSBtdWx0aXBseSBhbmQgdGhlIHBvc2l0aXZlIHBvd2VycworICAgICAgICAvLyBvZiB0ZW4gYXJlIHByZWNpc2VseSByZXByZXNlbnRhYmxlLiAKKyAgICAgICAgc3RhdGljIHN0cnVjdCB7IGRvdWJsZSBzY2FsZTsgY2hhciBwcmVmaXg7IH0gcmFuZ2VzW10gPSB7CisgICAgICAgICAgICB7MS5lMTIsJ2YnfSwKKyAgICAgICAgICAgIHsxLmU5LCAncCd9LAorICAgICAgICAgICAgezEuZTYsICduJ30sCisgICAgICAgICAgICB7MS5lMywgJ3UnfSwKKyAgICAgICAgICAgIHsxLjAsICAnbSd9LAorICAgICAgICAgICAgezEuZS0zLCcgJ30sCisgICAgICAgICAgICB7MS5lLTYsJ2snfSwKKyAgICAgICAgICAgIHsxLmUtOSwnTSd9LAorICAgICAgICAgICAgezEuZS0xMiwnRyd9LAorICAgICAgICAgICAgezEuZS0xNSwnVCd9LAorICAgICAgICAgICAgezEuZS0xOCwnUCd9LAorICAgICAgICAgICAgezEuZS0yMSwnRSd9LAorICAgICAgICAgICAgezEuZS0yNCwnWid9LAorICAgICAgICAgICAgezEuZS0yNywnWSd9CisgICAgICAgIH07CisgICAgICAgIAorICAgICAgICBpZiAoaW50ZXJ2YWwgPT0gMC4wKQorICAgICAgICB7CisgICAgICAgICAgICBvcyA8PCBzdGQ6OnNldHcod2lkdGgtMykgPDwgc3RkOjpyaWdodCA8PCAiMC4wMCIgPDwgc3RkOjpzZXR3KDMpIDw8IHVuaXQ7CisgICAgICAgICAgICByZXR1cm4gb3Muc3RyKCk7CisgICAgICAgIH0KKworICAgICAgICBib29sIG5lZ2F0aXZlID0gZmFsc2U7CisgICAgICAgIGlmIChpbnRlcnZhbCA8IDAuMCkKKyAgICAgICAgeworICAgICAgICAgICAgbmVnYXRpdmUgPSB0cnVlOworICAgICAgICAgICAgaW50ZXJ2YWwgPSAtaW50ZXJ2YWw7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGZvciAoaW50IGk9MDsgaTwoaW50KShzaXplb2YocmFuZ2VzKS9zaXplb2YocmFuZ2VzWzBdKSk7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGludGVydmFsKnJhbmdlc1tpXS5zY2FsZSA8IDEuZTApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50ZXJ2YWwgPSBpbnRlcnZhbCAqIDEwMDAuZTAgKiByYW5nZXNbaV0uc2NhbGU7CisgICAgICAgICAgICAgICAgb3MgPDwgc3RkOjpmaXhlZCA8PCBzdGQ6OnNldHByZWNpc2lvbigyKSA8PCBzdGQ6OnNldHcod2lkdGgtMykgPDwgc3RkOjpyaWdodCA8PCAKKyAgICAgICAgICAgICAgICAgICAgKG5lZ2F0aXZlID8gLWludGVydmFsIDogaW50ZXJ2YWwpIDw8IHN0ZDo6c2V0dygyKSA8PCByYW5nZXNbaV0ucHJlZml4IDw8IHN0ZDo6c2V0dygxKSA8PCB1bml0OworCisgICAgICAgICAgICAgICAgcmV0dXJuIG9zLnN0cigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG9zIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKDIpIDw8IHN0ZDo6Zml4ZWQgPDwgc3RkOjpyaWdodCA8PCBzdGQ6OnNldHcod2lkdGgtMykgPDwgaW50ZXJ2YWwgPDwgc3RkOjpzZXR3KDMpIDw8IHVuaXQ7CisKKyAgICByZXR1cm4gb3Muc3RyKCk7Cit9CisKK3RzY190aWNrX2NvdW50Ojp0c2NfaW50ZXJ2YWxfdCBjb21wdXRlTGFzdEluTGFzdE91dEludGVydmFsKHRpbWVQYWlyICogdGltZXMsIGludCBuVGltZXMpCit7CisgICAgdGltZVBhaXIgbGFzdFRpbWVzID0gdGltZXNbMF07CisgICAgdHNjX3RpY2tfY291bnQgKiBzdGFydHAgPSBsYXN0VGltZXMuZ2V0X3N0YXJ0cCgpOworICAgIHRzY190aWNrX2NvdW50ICogZW5kcCAgID0gbGFzdFRpbWVzLmdldF9lbmRwKCk7CisKKyAgICBmb3IgKGludCBpPTE7IGk8blRpbWVzOyBpKyspCisgICAgeworICAgICAgICgqc3RhcnRwKSA9IHN0YXJ0cC0+bGF0ZXIodGltZXNbaV0uZ2V0X3N0YXJ0KCkpOworICAgICAgICgqZW5kcCkgICA9IGVuZHAtPmxhdGVyICAodGltZXNbaV0uZ2V0X2VuZCgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gbGFzdFRpbWVzLmR1cmF0aW9uKCk7Cit9CisKK3N0ZDo6c3RyaW5nIHRpbWVQYWlyOjpmb3JtYXQoKSBjb25zdAoreworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisKKyAgICBvc3MgPDwgc3RhcnQuZ2V0VmFsdWUoKSA8PCAiOiIgPDwgZW5kLmdldFZhbHVlKCkgPDwgIiA9ICIgPDwgKGVuZC1zdGFydCkuZ2V0VmFsdWUoKTsKKworICAgIHJldHVybiBvc3Muc3RyKCk7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfc3RhdHNfdGltaW5nLmggYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfc3RhdHNfdGltaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg3OGJiZAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zdGF0c190aW1pbmcuaApAQCAtMCwwICsxLDExOSBAQAorI2lmbmRlZiBLTVBfU1RBVFNfVElNSU5HX0gKKyNkZWZpbmUgS01QX1NUQVRTX1RJTUlOR19ICisKKy8qKiBAZmlsZSBrbXBfc3RhdHNfdGltaW5nLmgKKyAqIEFjY2VzcyB0byByZWFsIHRpbWUgY2xvY2sgYW5kIHRpbWVycy4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlICJrbXBfb3MuaCIKKyNpZiBLTVBfSEFWRV9YODZJTlRSSU5fSAorIyBpbmNsdWRlIDx4ODZpbnRyaW4uaD4KKyNlbmRpZgorCitjbGFzcyB0c2NfdGlja19jb3VudCB7CisgIHByaXZhdGU6CisgICAgaW50NjRfdCBteV9jb3VudDsKKworICBwdWJsaWM6CisgICAgY2xhc3MgdHNjX2ludGVydmFsX3QgeworICAgICAgICBpbnQ2NF90IHZhbHVlOworICAgICAgICBleHBsaWNpdCB0c2NfaW50ZXJ2YWxfdChpbnQ2NF90IF92YWx1ZSkgOiB2YWx1ZShfdmFsdWUpIHt9CisgICAgIHB1YmxpYzoKKyAgICAgICAgdHNjX2ludGVydmFsX3QoKSA6IHZhbHVlKDApIHt9OyAvLyBDb25zdHJ1Y3QgMCB0aW1lIGR1cmF0aW9uCisjaWYgS01QX0hBVkVfVElDS19USU1FCisgICAgICAgIGRvdWJsZSBzZWNvbmRzKCkgY29uc3Q7IC8vIFJldHVybiB0aGUgbGVuZ3RoIG9mIGEgdGltZSBpbnRlcnZhbCBpbiBzZWNvbmRzCisjZW5kaWYKKyAgICAgICAgZG91YmxlIHRpY2tzKCkgY29uc3QgeyByZXR1cm4gZG91YmxlKHZhbHVlKTsgfQorICAgICAgICBpbnQ2NF90IGdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gdmFsdWU7IH0KKworICAgICAgICBmcmllbmQgY2xhc3MgdHNjX3RpY2tfY291bnQ7CisKKyAgICAgICAgZnJpZW5kIHRzY19pbnRlcnZhbF90IG9wZXJhdG9yLSgKKyAgICAgICAgY29uc3QgdHNjX3RpY2tfY291bnQgdDEsIGNvbnN0IHRzY190aWNrX2NvdW50IHQwKTsKKyAgICB9OworCisjaWYgS01QX0hBVkVfX19CVUlMVElOX1JFQURDWUNMRUNPVU5URVIKKyAgICB0c2NfdGlja19jb3VudCgpIDogbXlfY291bnQoc3RhdGljX2Nhc3Q8aW50NjRfdD4oX19idWlsdGluX3JlYWRjeWNsZWNvdW50ZXIoKSkpIHt9CisjZWxpZiBLTVBfSEFWRV9fX1JEVFNDCisgICAgdHNjX3RpY2tfY291bnQoKSA6IG15X2NvdW50KHN0YXRpY19jYXN0PGludDY0X3Q+KF9fcmR0c2MoKSkpIHt9OworI2Vsc2UKKyMgZXJyb3IgTXVzdCBoYXZlIGhpZ2ggcmVzb2x1dGlvbiB0aW1lciBkZWZpbmVkCisjZW5kaWYKKyAgICB0c2NfdGlja19jb3VudChpbnQ2NF90IHZhbHVlKSA6IG15X2NvdW50KHZhbHVlKSB7fTsKKyAgICBpbnQ2NF90IGdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gbXlfY291bnQ7IH0KKyAgICB0c2NfdGlja19jb3VudCBsYXRlciAodHNjX3RpY2tfY291bnQgY29uc3Qgb3RoZXIpIGNvbnN0IHsgCisgICAgICAgIHJldHVybiBteV9jb3VudCA+IG90aGVyLm15X2NvdW50ID8gKCp0aGlzKSA6IG90aGVyOyAKKyAgICB9CisgICAgdHNjX3RpY2tfY291bnQgZWFybGllcih0c2NfdGlja19jb3VudCBjb25zdCBvdGhlcikgY29uc3QgeyAKKyAgICAgICAgcmV0dXJuIG15X2NvdW50IDwgb3RoZXIubXlfY291bnQgPyAoKnRoaXMpIDogb3RoZXI7IAorICAgIH0KKyNpZiBLTVBfSEFWRV9USUNLX1RJTUUKKyAgICBzdGF0aWMgZG91YmxlIHRpY2tfdGltZSgpOyAvLyByZXR1cm5zIHNlY29uZHMgcGVyIGN5Y2xlIChwZXJpb2QpIG9mIGNsb2NrCisjZW5kaWYKKyAgICBzdGF0aWMgdHNjX3RpY2tfY291bnQgbm93KCkgeyByZXR1cm4gdHNjX3RpY2tfY291bnQoKTsgfSAvLyByZXR1cm5zIHRoZSByZHRzYyByZWdpc3RlciB2YWx1ZQorICAgIGZyaWVuZCB0c2NfdGlja19jb3VudDo6dHNjX2ludGVydmFsX3Qgb3BlcmF0b3ItKGNvbnN0IHRzY190aWNrX2NvdW50IHQxLCBjb25zdCB0c2NfdGlja19jb3VudCB0MCk7Cit9OworCitpbmxpbmUgdHNjX3RpY2tfY291bnQ6OnRzY19pbnRlcnZhbF90IG9wZXJhdG9yLShjb25zdCB0c2NfdGlja19jb3VudCB0MSwgY29uc3QgdHNjX3RpY2tfY291bnQgdDApIAoreworICAgIHJldHVybiB0c2NfdGlja19jb3VudDo6dHNjX2ludGVydmFsX3QoIHQxLm15X2NvdW50LXQwLm15X2NvdW50ICk7Cit9CisKKyNpZiBLTVBfSEFWRV9USUNLX1RJTUUKK2lubGluZSBkb3VibGUgdHNjX3RpY2tfY291bnQ6OnRzY19pbnRlcnZhbF90OjpzZWNvbmRzKCkgY29uc3QgCit7CisgICAgcmV0dXJuIHZhbHVlKnRpY2tfdGltZSgpOworfQorI2VuZGlmCisKK2V4dGVybiBzdGQ6OnN0cmluZyBmb3JtYXRTSShkb3VibGUgaW50ZXJ2YWwsIGludCB3aWR0aCwgY2hhciB1bml0KTsKKworaW5saW5lIHN0ZDo6c3RyaW5nIGZvcm1hdFNlY29uZHMoZG91YmxlIGludGVydmFsLCBpbnQgd2lkdGgpCit7CisgICAgcmV0dXJuIGZvcm1hdFNJKGludGVydmFsLCB3aWR0aCwgJ1MnKTsKK30KKworaW5saW5lIHN0ZDo6c3RyaW5nIGZvcm1hdFRpY2tzKGRvdWJsZSBpbnRlcnZhbCwgaW50IHdpZHRoKQoreworICAgIHJldHVybiBmb3JtYXRTSShpbnRlcnZhbCwgd2lkdGgsICdUJyk7Cit9CisKK2NsYXNzIHRpbWVQYWlyCit7CisgICAgdHNjX3RpY2tfY291bnQgS01QX0FMSUdOX0NBQ0hFIHN0YXJ0OworICAgIHRzY190aWNrX2NvdW50IGVuZDsKKworcHVibGljOgorICAgIHRpbWVQYWlyKCkgOiBzdGFydCgtc3RkOjpudW1lcmljX2xpbWl0czxpbnQ2NF90Pjo6bWF4KCkpLCBlbmQoLXN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1heCgpKSB7fQorICAgIHRzY190aWNrX2NvdW50IGdldF9zdGFydCgpIGNvbnN0IHsgcmV0dXJuIHN0YXJ0OyB9CisgICAgdHNjX3RpY2tfY291bnQgZ2V0X2VuZCgpICAgY29uc3QgeyByZXR1cm4gZW5kOyB9CisgICAgdHNjX3RpY2tfY291bnQgKiBnZXRfc3RhcnRwKCkgICAgeyByZXR1cm4gJnN0YXJ0OyB9CisgICAgdHNjX3RpY2tfY291bnQgKiBnZXRfZW5kcCgpICAgICAgeyByZXR1cm4gJmVuZDsgfQorCisgICAgdm9pZCBtYXJrU3RhcnQoKSB7IHN0YXJ0ID0gdHNjX3RpY2tfY291bnQ6Om5vdygpOyB9CisgICAgdm9pZCBtYXJrRW5kKCkgICB7IGVuZCAgID0gdHNjX3RpY2tfY291bnQ6Om5vdygpOyB9CisgICAgdm9pZCBzZXRfc3RhcnQodHNjX3RpY2tfY291bnQgcykgeyBzdGFydCA9IHM7IH0KKyAgICB2b2lkIHNldF9lbmQgICh0c2NfdGlja19jb3VudCBlKSB7IGVuZCA9IGU7IH0KKworICAgIHRzY190aWNrX2NvdW50Ojp0c2NfaW50ZXJ2YWxfdCBkdXJhdGlvbigpIGNvbnN0IHsgcmV0dXJuIGVuZC1zdGFydDsgfQorICAgIHN0ZDo6c3RyaW5nIGZvcm1hdCgpIGNvbnN0OworCit9OworCitleHRlcm4gdHNjX3RpY2tfY291bnQ6OnRzY19pbnRlcnZhbF90IGNvbXB1dGVMYXN0SW5MYXN0T3V0SW50ZXJ2YWwodGltZVBhaXIgKiB0aW1lcywgaW50IG5UaW1lcyk7CisjZW5kaWYgLy8gS01QX1NUQVRTX1RJTUlOR19ICmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfc3RyLmMgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfc3RyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVmNzAwNQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zdHIuYwpAQCAtMCwwICsxLDg4MyBAQAorLyoKKyAqIGttcF9zdHIuYyAtLSBTdHJpbmcgbWFuaXB1bGF0aW9uIHJvdXRpbmVzLgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wX3N0ci5oIgorCisjaW5jbHVkZSA8c3RkYXJnLmg+ICAgIC8vIHZhXyoKKyNpbmNsdWRlIDxzdGRpby5oPiAgICAgLy8gdnNucHJpbnRmKCkKKyNpbmNsdWRlIDxzdGRsaWIuaD4gICAgLy8gbWFsbG9jKCksIHJlYWxsb2MoKQorCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKworLyoKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTdHJpbmcgYnVmZmVyLgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVXNhZ2U6CisKKyAgICAgICAgLy8gRGVjbGFyZSBidWZmZXIgYW5kIGluaXRpYWxpemUgaXQuCisgICAgICAgIGttcF9zdHJfYnVmX3QgIGJ1ZmZlcjsKKwlfX2ttcF9zdHJfYnVmX2luaXQoICYgYnVmZmVyICk7CisKKyAgICAgICAgLy8gUHJpbnQgdG8gYnVmZmVyLgorICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIkVycm9yIGluIGZpbGUgXCIlc1wiIGxpbmUgJWRcbiIsICJmb28uYyIsIDEyICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiICAgIDwlcz5cbiIsIGxpbmUgKTsKKworICAgICAgICAvLyBVc2UgYnVmZmVyIGNvbnRlbnRzLiBidWZmZXIuc3RyIGlzIGEgcG9pbnRlciB0byBkYXRhLCBidWZmZXIudXNlZCBpcyBhIG51bWJlciBvZiBwcmludGVkCisgICAgICAgIC8vIGNoYXJhY3RlcnMgKG5vdCBpbmNsdWRpbmcgdGVybWluYXRpbmcgemVybykuCisgICAgICAgIHdyaXRlKCBmZCwgYnVmZmVyLnN0ciwgYnVmZmVyLnVzZWQgKTsKKworICAgICAgICAvLyBGcmVlIGJ1ZmZlci4KKyAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIGJ1ZmZlciApOworCisgICAgICAgIC8vIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gZGV0YWNoIGFsbG9jYXRlZCBtZW1vcnkgZnJvbSBidWZmZXI6CisgICAgICAgIF9fa21wX3N0cl9idWZfZGV0YWNoKCAmIGJ1ZmZlciApOworICAgICAgICByZXR1cm4gYnVmZmVyLnN0cjsgICAgLy8gVGhhdCBtZW1vcnkgc2hvdWxkIGJlIGZyZWVkIGV2ZW50dWFsbHkuCisKKworICAgIE5vdGVzOgorCisgICAgICAgICogQnVmZmVyIHVzZXJzIG1heSB1c2UgYnVmZmVyLnN0ciBhbmQgYnVmZmVyLnVzZWQuIFVzZXJzIHNob3VsZCBub3QgY2hhbmdlIGFueSBmaWVsZHMgb2YKKyAgICAgICAgICBidWZmZXIgZGlyZWN0bHkuCisKKyAgICAgICAgKiBidWZmZXIuc3RyIGlzIG5ldmVyIE5VTEwuIElmIGJ1ZmZlciBpcyBlbXB0eSwgYnVmZmVyLnN0ciBwb2ludHMgdG8gZW1wdHkgc3RyaW5nICgiIikuCisKKyAgICAgICAgKiBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgYnVmZmVyIHVzZXMgc3RhY2sgbWVtb3J5IChidWZmZXIuYnVsaykgZmlyc3QuIElmIHN0YWNrIG1lbW9yeSBpcworICAgICAgICAgIGV4aGF1c3RlZCwgYnVmZmVyIGFsbG9jYXRlcyBtZW1vcnkgb24gaGVhcCBieSBtYWxsb2MoKSwgYW5kIHJlYWxsb2NhdGVzIGl0IGJ5IHJlYWxsb2MoKQorICAgICAgICAgIGFzIGFtb3VudCBvZiB1c2VkIG1lbW9yeSBncm93cy4KKworICAgICAgICAqIEJ1ZmZlciBkb3VibGVzIGFtb3VudCBvZiBhbGxvY2F0ZWQgbWVtb3J5IGVhY2ggdGltZSBpdCBpcyBleGhhdXN0ZWQuCisKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKy8vIFRPRE86IF9fa21wX3N0cl9idWZfcHJpbnQoKSBjYW4gdXNlIHRocmVhZCBsb2NhbCBtZW1vcnkgYWxsb2NhdG9yLgorCisjZGVmaW5lIEtNUF9TVFJfQlVGX0lOVkFSSUFOVCggYiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAoYiktPnN0ciAhPSBOVUxMICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIChiKS0+c2l6ZSA+PSBzaXplb2YoIChiKS0+YnVsayApICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggKGIpLT5zaXplICUgc2l6ZW9mKCAoYiktPmJ1bGsgKSA9PSAwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAodW5zaWduZWQpKGIpLT51c2VkIDwgKGIpLT5zaXplICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIChiKS0+c2l6ZSA9PSBzaXplb2YoIChiKS0+YnVsayApID8gKGIpLT5zdHIgPT0gJiAoYiktPmJ1bGtbIDAgXSA6IDEgKTsgIFwKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggKGIpLT5zaXplID4gc2l6ZW9mKCAoYiktPmJ1bGsgKSA/IChiKS0+c3RyICE9ICYgKGIpLT5idWxrWyAwIF0gOiAxICk7ICAgXAorICAgIH0KKwordm9pZAorIF9fa21wX3N0cl9idWZfY2xlYXIoCisgICAgIGttcF9zdHJfYnVmX3QgKiBidWZmZXIKKykgeworICAgIEtNUF9TVFJfQlVGX0lOVkFSSUFOVCggYnVmZmVyICk7CisgICAgaWYgKCBidWZmZXItPnVzZWQgPiAwICkgeworICAgICAgICBidWZmZXItPnVzZWQgPSAwOworICAgICAgICBidWZmZXItPnN0clsgMCBdID0gMDsKKyAgICB9OyAvLyBpZgorICAgIEtNUF9TVFJfQlVGX0lOVkFSSUFOVCggYnVmZmVyICk7Cit9IC8vIF9fa21wX3N0cl9idWZfY2xlYXIKKworCit2b2lkCitfX2ttcF9zdHJfYnVmX3Jlc2VydmUoCisgICAga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwKKyAgICBpbnQgICAgICAgICAgICAgc2l6ZQorKSB7CisKKyAgICBLTVBfU1RSX0JVRl9JTlZBUklBTlQoIGJ1ZmZlciApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHNpemUgPj0gMCApOworCisgICAgaWYgKCBidWZmZXItPnNpemUgPCAodW5zaWduZWQgaW50KXNpemUgKSB7CisKKyAgICAgICAgLy8gQ2FsY3VsYXRlIGJ1ZmZlciBzaXplLgorICAgICAgICBkbyB7CisgICAgICAgICAgICBidWZmZXItPnNpemUgKj0gMjsKKyAgICAgICAgfSB3aGlsZSAoIGJ1ZmZlci0+c2l6ZSA8ICh1bnNpZ25lZCBpbnQpc2l6ZSApOworCisgICAgICAgIC8vIEVubGFyZ2UgYnVmZmVyLgorICAgICAgICBpZiAoIGJ1ZmZlci0+c3RyID09ICYgYnVmZmVyLT5idWxrWyAwIF0gKSB7CisgICAgICAgICAgICBidWZmZXItPnN0ciA9IChjaGFyICopIEtNUF9JTlRFUk5BTF9NQUxMT0MoIGJ1ZmZlci0+c2l6ZSApOworICAgICAgICAgICAgaWYgKCBidWZmZXItPnN0ciA9PSBOVUxMICkgeworCQlLTVBfRkFUQUwoIE1lbW9yeUFsbG9jRmFpbGVkICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgS01QX01FTUNQWV9TKCBidWZmZXItPnN0ciwgYnVmZmVyLT5zaXplLCBidWZmZXItPmJ1bGssIGJ1ZmZlci0+dXNlZCArIDEgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+c3RyID0gKGNoYXIgKikgS01QX0lOVEVSTkFMX1JFQUxMT0MoIGJ1ZmZlci0+c3RyLCBidWZmZXItPnNpemUgKTsKKyAgICAgICAgICAgIGlmICggYnVmZmVyLT5zdHIgPT0gTlVMTCApIHsKKwkJS01QX0ZBVEFMKCBNZW1vcnlBbGxvY0ZhaWxlZCApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gaWYKKworICAgIH07IC8vIGlmCisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBidWZmZXItPnNpemUgPiAwICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggYnVmZmVyLT5zaXplID49ICh1bnNpZ25lZClzaXplICk7CisgICAgS01QX1NUUl9CVUZfSU5WQVJJQU5UKCBidWZmZXIgKTsKKworfSAvLyBfX2ttcF9zdHJfYnVmX3Jlc2VydmUKKworCit2b2lkCitfX2ttcF9zdHJfYnVmX2RldGFjaCgKKyAgICBrbXBfc3RyX2J1Zl90ICogIGJ1ZmZlcgorKSB7CisKKyAgICBLTVBfU1RSX0JVRl9JTlZBUklBTlQoIGJ1ZmZlciApOworCisgICAgLy8gSWYgaW50ZXJuYWwgYnVsayBpcyB1c2VkLCBhbGxvY2F0ZSBtZW1vcnkgYW5kIGNvcHkgaXQuCisgICAgaWYgKCBidWZmZXItPnNpemUgPD0gc2l6ZW9mKCBidWZmZXItPmJ1bGsgKSApIHsKKyAgICAgICAgYnVmZmVyLT5zdHIgPSAoY2hhciAqKSBLTVBfSU5URVJOQUxfTUFMTE9DKCBidWZmZXItPnNpemUgKTsKKyAgICAgICAgaWYgKCBidWZmZXItPnN0ciA9PSBOVUxMICkgeworCQlLTVBfRkFUQUwoIE1lbW9yeUFsbG9jRmFpbGVkICk7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIEtNUF9NRU1DUFlfUyggYnVmZmVyLT5zdHIsIGJ1ZmZlci0+c2l6ZSwgYnVmZmVyLT5idWxrLCBidWZmZXItPnVzZWQgKyAxICk7CisgICAgfTsgLy8gaWYKKworfSAvLyBfX2ttcF9zdHJfYnVmX2RldGFjaAorCisKK3ZvaWQKK19fa21wX3N0cl9idWZfZnJlZSgKKyAgICBrbXBfc3RyX2J1Zl90ICogYnVmZmVyCispIHsKKyAgICBLTVBfU1RSX0JVRl9JTlZBUklBTlQoIGJ1ZmZlciApOworICAgIGlmICggYnVmZmVyLT5zaXplID4gc2l6ZW9mKCBidWZmZXItPmJ1bGsgKSApIHsKKyAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoIGJ1ZmZlci0+c3RyICk7CisgICAgfTsgLy8gaWYKKyAgICBidWZmZXItPnN0ciAgPSBidWZmZXItPmJ1bGs7CisgICAgYnVmZmVyLT5zaXplID0gc2l6ZW9mKCBidWZmZXItPmJ1bGsgKTsKKyAgICBidWZmZXItPnVzZWQgPSAwOworICAgIEtNUF9TVFJfQlVGX0lOVkFSSUFOVCggYnVmZmVyICk7Cit9IC8vIF9fa21wX3N0cl9idWZfZnJlZQorCisKK3ZvaWQKK19fa21wX3N0cl9idWZfY2F0KAorICAgIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsCisgICAgY2hhciBjb25zdCAqICAgIHN0ciwKKyAgICBpbnQgICAgICAgICAgICAgbGVuCispIHsKKyAgICBLTVBfU1RSX0JVRl9JTlZBUklBTlQoIGJ1ZmZlciApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHN0ciAhPSBOVUxMICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggbGVuID49IDAgKTsKKyAgICBfX2ttcF9zdHJfYnVmX3Jlc2VydmUoIGJ1ZmZlciwgYnVmZmVyLT51c2VkICsgbGVuICsgMSApOworICAgIEtNUF9NRU1DUFkoIGJ1ZmZlci0+c3RyICsgYnVmZmVyLT51c2VkLCBzdHIsIGxlbiApOworICAgIGJ1ZmZlci0+c3RyWyBidWZmZXItPnVzZWQgKyBsZW4gXSA9IDA7CisgICAgYnVmZmVyLT51c2VkICs9IGxlbjsKKyAgICBLTVBfU1RSX0JVRl9JTlZBUklBTlQoIGJ1ZmZlciApOworfSAvLyBfX2ttcF9zdHJfYnVmX2NhdAorCisKK3ZvaWQKK19fa21wX3N0cl9idWZfdnByaW50KAorICAgIGttcF9zdHJfYnVmX3QgKiAgYnVmZmVyLAorICAgIGNoYXIgY29uc3QgKiAgICAgZm9ybWF0LAorICAgIHZhX2xpc3QgICAgICAgICAgYXJncworKSB7CisKKyAgICBLTVBfU1RSX0JVRl9JTlZBUklBTlQoIGJ1ZmZlciApOworCisgICAgZm9yICggOyA7ICkgeworCisgICAgICAgIGludCBjb25zdCBmcmVlID0gYnVmZmVyLT5zaXplIC0gYnVmZmVyLT51c2VkOworICAgICAgICBpbnQgICAgICAgcmM7CisgICAgICAgIGludCAgICAgICBzaXplOworCisgICAgICAgIC8vIFRyeSB0byBmb3JtYXQgc3RyaW5nLgorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgIE9uIExpbnV4KiBPUyBJbnRlbChSKSA2NCwgdnNucHJpbnRmKCkgbW9kaWZpZXMgYXJncyBhcmd1bWVudCwgc28gdnNucHJpbnRmKCkgY3Jhc2hlcyBpZiBpdAorICAgICAgICAgICAgICAgIGlzIGNhbGxlZCBmb3IgdGhlIHNlY29uZCB0aW1lIHdpdGggdGhlIHNhbWUgYXJncy4gVG8gcHJldmVudCB0aGUgY3Jhc2gsIHdlIGhhdmUgdG8KKyAgICAgICAgICAgICAgICBwYXNzIGEgZnJlc2ggaW50YWN0IGNvcHkgb2YgYXJncyB0byB2c25wcmludGYoKSBvbiBlYWNoIGl0ZXJhdGlvbi4KKworICAgICAgICAgICAgICAgIFVuZm9ydHVuYXRlbHksIHN0YW5kYXJkIHZhX2NvcHkoKSBtYWNybyBpcyBub3QgYXZhaWxhYmxlIG9uIFdpbmRvd3MqIE9TLiBIb3dldmVyLCBpdAorICAgICAgICAgICAgICAgIHNlZW1zIHZzbnByaW50ZigpIGRvZXMgbm90IG1vZGlmeSBhcmdzIGFyZ3VtZW50IG9uIFdpbmRvd3MqIE9TLgorICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgI2lmICEgS01QX09TX1dJTkRPV1MKKyAgICAgICAgICAgICAgICB2YV9saXN0IF9hcmdzOworICAgICAgICAgICAgICAgIF9fdmFfY29weSggX2FyZ3MsIGFyZ3MgKTsgIC8vIE1ha2UgY29weSBvZiBhcmdzLgorICAgICAgICAgICAgICAgICNkZWZpbmUgYXJncyBfYXJncyAgICAgICAgIC8vIFN1YnN0aXR1dGUgYXJncyB3aXRoIGl0cyBjb3B5LCBfYXJncy4KKyAgICAgICAgICAgICNlbmRpZiAvLyBLTVBfT1NfV0lORE9XUworICAgICAgICAgICAgcmMgPSBLTVBfVlNOUFJJTlRGKCBidWZmZXItPnN0ciArIGJ1ZmZlci0+dXNlZCwgZnJlZSwgZm9ybWF0LCBhcmdzICk7CisgICAgICAgICAgICAjaWYgISBLTVBfT1NfV0lORE9XUworICAgICAgICAgICAgICAgICN1bmRlZiBhcmdzICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBzdWJzdGl0dXRpb24uCisgICAgICAgICAgICAgICAgdmFfZW5kKCBfYXJncyApOworICAgICAgICAgICAgI2VuZGlmIC8vIEtNUF9PU19XSU5ET1dTCisgICAgICAgIH0KKworICAgICAgICAvLyBObyBlcnJvcnMsIHN0cmluZyBoYXMgYmVlbiBmb3JtYXR0ZWQuCisgICAgICAgIGlmICggcmMgPj0gMCAmJiByYyA8IGZyZWUgKSB7CisgICAgICAgICAgICBidWZmZXItPnVzZWQgKz0gcmM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfTsgLy8gaWYKKworICAgICAgICAvLyBFcnJvciBvY2N1cnJlZCwgYnVmZmVyIGlzIHRvbyBzbWFsbC4KKyAgICAgICAgaWYgKCByYyA+PSAwICkgeworICAgICAgICAgICAgLy8gQzk5LWNvbmZvcm1pbmcgaW1wbGVtZW50YXRpb24gb2YgdnNucHJpbnRmIHJldHVybnMgcmVxdWlyZWQgYnVmZmVyIHNpemUuCisgICAgICAgICAgICBzaXplID0gYnVmZmVyLT51c2VkICsgcmMgKyAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gT2xkZXIgaW1wbGVtZW50YXRpb25zIGp1c3QgcmV0dXJuIC0xLiBEb3VibGUgYnVmZmVyIHNpemUuCisgICAgICAgICAgICBzaXplID0gYnVmZmVyLT5zaXplICogMjsKKyAgICAgICAgfTsgLy8gaWYKKworICAgICAgICAvLyBFbmxhcmdlIGJ1ZmZlci4KKyAgICAgICAgX19rbXBfc3RyX2J1Zl9yZXNlcnZlKCBidWZmZXIsIHNpemUgKTsKKworICAgICAgICAvLyBBbmQgdHJ5IGFnYWluLgorCisgICAgfTsgLy8gZm9yZXZlcgorCisgICAgS01QX0RFQlVHX0FTU0VSVCggYnVmZmVyLT5zaXplID4gMCApOworICAgIEtNUF9TVFJfQlVGX0lOVkFSSUFOVCggYnVmZmVyICk7CisKK30gLy8gX19rbXBfc3RyX2J1Zl92cHJpbnQKKworCit2b2lkCitfX2ttcF9zdHJfYnVmX3ByaW50KAorICAgIGttcF9zdHJfYnVmX3QgKiAgYnVmZmVyLAorICAgIGNoYXIgY29uc3QgKiAgICAgZm9ybWF0LAorICAgIC4uLgorKSB7CisKKyAgICB2YV9saXN0IGFyZ3M7CisgICAgdmFfc3RhcnQoIGFyZ3MsIGZvcm1hdCApOworICAgIF9fa21wX3N0cl9idWZfdnByaW50KCBidWZmZXIsIGZvcm1hdCwgYXJncyApOworICAgIHZhX2VuZCggYXJncyApOworCit9IC8vIF9fa21wX3N0cl9idWZfcHJpbnQKKworCisvKgorICAgIFRoZSBmdW5jdGlvbiBwcmludHMgc3BlY2lmaWVkIHNpemUgdG8gYnVmZmVyLiBTaXplIGlzIGV4cHJlc3NlZCB1c2luZyBiaWdnZXN0IHBvc3NpYmxlIHVuaXQsIGZvcgorICAgIGV4YW1wbGUgMTAyNCBpcyBwcmludGVkIGFzICIxayIuCisqLworCit2b2lkCitfX2ttcF9zdHJfYnVmX3ByaW50X3NpemUoCisgICAga21wX3N0cl9idWZfdCAqIGJ1ZiwKKyAgICBzaXplX3QgICAgICAgICAgc2l6ZQorKSB7CisKKyAgICBjaGFyIGNvbnN0ICogbmFtZXNbXSA9IHsgIiIsICJrIiwgIk0iLCAiRyIsICJUIiwgIlAiLCAiRSIsICJaIiwgIlkiIH07CisgICAgaW50IGNvbnN0ICAgIHVuaXRzICAgPSBzaXplb2YoIG5hbWVzICkgLyBzaXplb2YoIGNoYXIgY29uc3QgKiApOworICAgIGludCAgICAgICAgICB1ICAgICAgID0gMDsKKyAgICBpZiAoIHNpemUgPiAwICkgeworICAgICAgICB3aGlsZSAoICggc2l6ZSAlIDEwMjQgPT0gMCApICYmICggdSArIDEgPCB1bml0cyApICkgeworICAgICAgICAgICAgc2l6ZSA9IHNpemUgLyAxMDI0OworICAgICAgICAgICAgKysgdTsKKyAgICAgICAgfTsgLy8gd2hpbGUKKyAgICB9OyAvLyBpZgorCisgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmLCAiJSIgS01QX1NJWkVfVF9TUEVDICIlcyIsIHNpemUsIG5hbWVzWyB1IF0gKTsKKworfSAvLyBfX2ttcF9zdHJfYnVmX3ByaW50X3NpemUKKworCit2b2lkCitfX2ttcF9zdHJfZm5hbWVfaW5pdCgKKyAgICBrbXBfc3RyX2ZuYW1lX3QgKiBmbmFtZSwKKyAgICBjaGFyIGNvbnN0ICogICAgICBwYXRoCispIHsKKworICAgIGZuYW1lLT5wYXRoID0gTlVMTDsKKyAgICBmbmFtZS0+ZGlyICA9IE5VTEw7CisgICAgZm5hbWUtPmJhc2UgPSBOVUxMOworCisgICAgaWYgKCBwYXRoICE9IE5VTEwgKSB7CisgICAgICAgIGNoYXIgKiBzbGFzaCA9IE5VTEw7ICAgIC8vIFBvaW50ZXIgdG8gdGhlIGxhc3QgY2hhcmFjdGVyIG9mIGRpci4KKyAgICAgICAgY2hhciAqIGJhc2UgID0gTlVMTDsgICAgLy8gUG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIGJhc2VuYW1lLgorICAgICAgICBmbmFtZS0+cGF0aCA9IF9fa21wX3N0cl9mb3JtYXQoICIlcyIsIHBhdGggKTsKKyAgICAgICAgICAgIC8vIE9yaWdpbmFsIGNvZGUgdXNlZCBzdHJkdXAoKSBmdW5jdGlvbiB0byBjb3B5IGEgc3RyaW5nLCBidXQgb24gV2luZG93cyogT1MgSW50ZWwoUikgNjQgaXQKKyAgICAgICAgICAgIC8vIGNhdXNlcyBhc3NlcnRpb29uIGlkIGRlYnVnIGhlYXAsIHNvIEkgaGFkIHRvIHJlcGxhY2Ugc3RyZHVwIHdpdGggX19rbXBfc3RyX2Zvcm1hdCgpLgorICAgICAgICBpZiAoIEtNUF9PU19XSU5ET1dTICkgeworICAgICAgICAgICAgX19rbXBfc3RyX3JlcGxhY2UoIGZuYW1lLT5wYXRoLCAnXFwnLCAnLycgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgZm5hbWUtPmRpciA9IF9fa21wX3N0cl9mb3JtYXQoICIlcyIsIGZuYW1lLT5wYXRoICk7CisgICAgICAgIHNsYXNoID0gc3RycmNociggZm5hbWUtPmRpciwgJy8nICk7CisgICAgICAgIGlmICggS01QX09TX1dJTkRPV1MgJiYgc2xhc2ggPT0gTlVMTCApIHsgICAgICAgICAgIC8vIE9uIFdpbmRvd3MqIE9TLCBpZiBzbGFzaCBub3QgZm91bmQsCisgICAgICAgICAgICBjaGFyIGZpcnN0ID0gVE9MT1dFUiggZm5hbWUtPmRpclsgMCBdICk7ICAgICAvLyBsb29rIGZvciBkcml2ZS4KKyAgICAgICAgICAgIGlmICggJ2EnIDw9IGZpcnN0ICYmIGZpcnN0IDw9ICd6JyAmJiBmbmFtZS0+ZGlyWyAxIF0gPT0gJzonICkgeworICAgICAgICAgICAgICAgIHNsYXNoID0gJiBmbmFtZS0+ZGlyWyAxIF07CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9OyAvLyBpZgorICAgICAgICBiYXNlID0gKCBzbGFzaCA9PSBOVUxMID8gZm5hbWUtPmRpciA6IHNsYXNoICsgMSApOworICAgICAgICBmbmFtZS0+YmFzZSA9IF9fa21wX3N0cl9mb3JtYXQoICIlcyIsIGJhc2UgKTsgICAgLy8gQ29weSBiYXNlbmFtZQorICAgICAgICAqIGJhc2UgPSAwOyAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRydW5jYXRlIGRpci4KKyAgICB9OyAvLyBpZgorCit9IC8vIGttcF9zdHJfZm5hbWVfaW5pdAorCisKK3ZvaWQKK19fa21wX3N0cl9mbmFtZV9mcmVlKAorICAgIGttcF9zdHJfZm5hbWVfdCAqIGZuYW1lCispIHsKKyAgICBfX2ttcF9zdHJfZnJlZSggKGNoYXIgY29uc3QgKiopKCAmIGZuYW1lLT5wYXRoICkgKTsKKyAgICBfX2ttcF9zdHJfZnJlZSggKGNoYXIgY29uc3QgKiopKCAmIGZuYW1lLT5kaXIgICkgKTsKKyAgICBfX2ttcF9zdHJfZnJlZSggKGNoYXIgY29uc3QgKiopKCAmIGZuYW1lLT5iYXNlICkgKTsKK30gLy8ga21wX3N0cl9mbmFtZV9mcmVlCisKKworaW50CitfX2ttcF9zdHJfZm5hbWVfbWF0Y2goCisgICAga21wX3N0cl9mbmFtZV90IGNvbnN0ICogZm5hbWUsCisgICAgY2hhciBjb25zdCAqICAgICAgICAgICAgcGF0dGVybgorKSB7CisKKyAgICBpbnQgZGlyX21hdGNoICA9IDE7CisgICAgaW50IGJhc2VfbWF0Y2ggPSAxOworCisgICAgaWYgKCBwYXR0ZXJuICE9IE5VTEwgKSB7CisgICAgICAgIGttcF9zdHJfZm5hbWVfdCBwdHJuOworICAgICAgICBfX2ttcF9zdHJfZm5hbWVfaW5pdCggJiBwdHJuLCBwYXR0ZXJuICk7CisgICAgICAgIGRpcl9tYXRjaCA9CisgICAgICAgICAgICBzdHJjbXAoIHB0cm4uZGlyLCAiKi8iICkgPT0gMAorICAgICAgICAgICAgfHwKKyAgICAgICAgICAgICggZm5hbWUtPmRpciAhPSBOVUxMICYmIF9fa21wX3N0cl9lcWYoIGZuYW1lLT5kaXIsIHB0cm4uZGlyICkgKTsKKyAgICAgICAgYmFzZV9tYXRjaCA9CisgICAgICAgICAgICBzdHJjbXAoIHB0cm4uYmFzZSwgIioiICkgPT0gMAorICAgICAgICAgICAgfHwKKyAgICAgICAgICAgICggZm5hbWUtPmJhc2UgIT0gTlVMTCAmJiBfX2ttcF9zdHJfZXFmKCBmbmFtZS0+YmFzZSwgcHRybi5iYXNlICkgKTsKKyAgICAgICAgX19rbXBfc3RyX2ZuYW1lX2ZyZWUoICYgcHRybiApOworICAgIH07IC8vIGlmCisKKyAgICByZXR1cm4gZGlyX21hdGNoICYmIGJhc2VfbWF0Y2g7CisKK30gLy8gX19rbXBfc3RyX2ZuYW1lX21hdGNoCisKKwora21wX3N0cl9sb2NfdAorX19rbXBfc3RyX2xvY19pbml0KAorICAgIGNoYXIgY29uc3QgKiBwc291cmNlLAorICAgIGludCAgICAgICAgICBpbml0X2ZuYW1lCispIHsKKworICAgIGttcF9zdHJfbG9jX3QgbG9jOworCisgICAgbG9jLl9idWxrID0gTlVMTDsKKyAgICBsb2MuZmlsZSAgPSBOVUxMOworICAgIGxvYy5mdW5jICA9IE5VTEw7CisgICAgbG9jLmxpbmUgID0gMDsKKyAgICBsb2MuY29sICAgPSAwOworCisgICAgaWYgKCBwc291cmNlICE9IE5VTEwgKSB7CisKKyAgICAgICAgY2hhciAqIHN0ciAgID0gTlVMTDsKKyAgICAgICAgY2hhciAqIGR1bW15ID0gTlVMTDsKKyAgICAgICAgY2hhciAqIGxpbmUgID0gTlVMTDsKKyAgICAgICAgY2hhciAqIGNvbCAgID0gTlVMTDsKKworICAgICAgICAvLyBDb3B5IHBzb3VyY2UgdG8ga2VlcCBpdCBpbnRhY3QuCisgICAgICAgIGxvYy5fYnVsayA9IF9fa21wX3N0cl9mb3JtYXQoICIlcyIsIHBzb3VyY2UgKTsKKworICAgICAgICAvLyBQYXJzZSBwc291cmNlIHN0cmluZzogIjtmaWxlO2Z1bmM7bGluZTtjb2w7OyIKKyAgICAgICAgc3RyID0gbG9jLl9idWxrOworICAgICAgICBfX2ttcF9zdHJfc3BsaXQoIHN0ciwgJzsnLCAmIGR1bW15LCAgICAmIHN0ciApOworICAgICAgICBfX2ttcF9zdHJfc3BsaXQoIHN0ciwgJzsnLCAmIGxvYy5maWxlLCAmIHN0ciApOworICAgICAgICBfX2ttcF9zdHJfc3BsaXQoIHN0ciwgJzsnLCAmIGxvYy5mdW5jLCAmIHN0ciApOworICAgICAgICBfX2ttcF9zdHJfc3BsaXQoIHN0ciwgJzsnLCAmIGxpbmUsICAgICAmIHN0ciApOworICAgICAgICBfX2ttcF9zdHJfc3BsaXQoIHN0ciwgJzsnLCAmIGNvbCwgICAgICAmIHN0ciApOworCisgICAgICAgIC8vIENvbnZlcnQgbGluZSBhbmQgY29sIGludG8gbnVtYmVyaWMgdmFsdWVzLgorICAgICAgICBpZiAoIGxpbmUgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIGxvYy5saW5lID0gYXRvaSggbGluZSApOworICAgICAgICAgICAgaWYgKCBsb2MubGluZSA8IDAgKSB7CisgICAgICAgICAgICAgICAgbG9jLmxpbmUgPSAwOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgaWYgKCBjb2wgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIGxvYy5jb2wgPSBhdG9pKCBjb2wgKTsKKyAgICAgICAgICAgIGlmICggbG9jLmNvbCA8IDAgKSB7CisgICAgICAgICAgICAgICAgbG9jLmNvbCA9IDA7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9OyAvLyBpZgorCisgICAgfTsgLy8gaWYKKworICAgIF9fa21wX3N0cl9mbmFtZV9pbml0KCAmIGxvYy5mbmFtZSwgaW5pdF9mbmFtZSA/IGxvYy5maWxlIDogTlVMTCApOworCisgICAgcmV0dXJuIGxvYzsKKworfSAvLyBrbXBfc3RyX2xvY19pbml0CisKKwordm9pZAorX19rbXBfc3RyX2xvY19mcmVlKAorICAgIGttcF9zdHJfbG9jX3QgKiBsb2MKKykgeworICAgIF9fa21wX3N0cl9mbmFtZV9mcmVlKCAmIGxvYy0+Zm5hbWUgKTsKKyAgICBLTVBfSU5URVJOQUxfRlJFRSggbG9jLT5fYnVsayApOworICAgIGxvYy0+X2J1bGsgPSBOVUxMOworICAgIGxvYy0+ZmlsZSAgPSBOVUxMOworICAgIGxvYy0+ZnVuYyAgPSBOVUxMOworfSAvLyBrbXBfc3RyX2xvY19mcmVlCisKKworCisvKgorICAgIFRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgdG8gY29tcGFyZSBmaWxlIG5hbWVzLiBPbiBXaW5kb3dzKiBPUyBmaWxlIG5hbWVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlLAorICAgIHNvIGZ1bmN0aW9ucyBwZXJmb3JtcyBjYXNlLWluc2Vuc2l0aXZlIGNvbXBhcmlzb24uIE9uIExpbnV4KiBPUyBpdCBwZXJmb3JtcyBjYXNlLXNlbnNpdGl2ZQorICAgIGNvbXBhcmlzb24uCisgICAgTm90ZTogVGhlIGZ1bmN0aW9uIHJldHVybnMgKnRydWUqIGlmIHN0cmluZ3MgYXJlICplcXVhbCouCisqLworCitpbnQKK19fa21wX3N0cl9lcWYoICAgICAgICAgLy8gVHJ1ZSwgaWYgc3RyaW5ncyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS4KKyAgICBjaGFyIGNvbnN0ICogbGhzLCAgLy8gRmlyc3Qgc3RyaW5nLgorICAgIGNoYXIgY29uc3QgKiByaHMgICAvLyBTZWNvbmQgc3RyaW5nLgorKSB7CisgICAgaW50IHJlc3VsdDsKKyAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgcmVzdWx0ID0gKCBfc3RyaWNtcCggbGhzLCByaHMgKSA9PSAwICk7CisgICAgI2Vsc2UKKyAgICAgICAgcmVzdWx0ID0gKCBzdHJjbXAoIGxocywgcmhzICkgPT0gMCApOworICAgICNlbmRpZgorICAgIHJldHVybiByZXN1bHQ7Cit9IC8vIF9fa21wX3N0cl9lcWYKKworCisvKgorICAgIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBzcHJpbnRmLCBidXQgaXQgKmFsbG9jYXRlcyogbmV3IGJ1ZmZlciwgd2hpY2ggbXVzdCBiZSBmcmVlZCBldmVudHVhbGx5IGJ5CisgICAgX19rbXBfc3RyX2ZyZWUoKS4gVGhlIGZ1bmN0aW9uIGlzIHZlcnkgY29udmVuaWVudCBmb3IgY29uc3RydWN0aW5nIHN0cmluZ3MsIGl0IHN1Y2Nlc3NmdWxseQorICAgIHJlcGxhY2VzIHN0cmR1cCgpLCBzdHJjYXQoKSwgaXQgZnJlZXMgcHJvZ3JhbW1lciBmcm9tIGJ1ZmZlciBhbGxvY2F0aW9ucyBhbmQgaGVscHMgdG8gYXZvaWQKKyAgICBidWZmZXIgb3ZlcmZsb3dzLiBFeGFtcGxlczoKKworICAgICAgICBzdHIgPSBfX2ttcF9zdHJfZm9ybWF0KCAiJXMiLCBvcmlnICk7ICAgICAgICAgICAgICAvLyBzdHJkdXAoKSwgZG8gbm90IGNhcmUgYWJvdXQgYnVmZmVyIHNpemUuCisgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmIHN0ciApOworICAgICAgICBzdHIgPSBfX2ttcF9zdHJfZm9ybWF0KCAiJXMlcyIsIG9yaWcxLCBvcmlnMiApOyAgICAvLyBzdHJjYXQoKSwgZG8gbm90IGNhcmUgYWJvdXQgYnVmZmVyIHNpemUuCisgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmIHN0ciApOworICAgICAgICBzdHIgPSBfX2ttcF9zdHJfZm9ybWF0KCAiJXMvJXMudHh0IiwgcGF0aCwgZmlsZSApOyAvLyBjb25zdHJ1Y3Rpbmcgc3RyaW5nLgorICAgICAgICBfX2ttcF9zdHJfZnJlZSggJiBzdHIgKTsKKworICAgIFBlcmZvcm1hbmNlIG5vdGU6CisgICAgICAgIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIG1lbW9yeSB3aXRoIG1hbGxvYygpIGNhbGxzLCBzbyBkbyBub3QgY2FsbCBpdCBmcm9tCisgICAgICAgIHBlcmZvcm1hbmNlLWNyaXRpY2FsIGNvZGUuIEluIHBlcmZvcm1hbmNlLWNyaXRpY2FsIGNvZGUgY29uc2lkZXIgdXNpbmcga21wX3N0cl9idWZfdAorICAgICAgICBpbnN0ZWFkLCBzaW5jZSBpdCB1c2VzIHN0YWNrLWFsbG9jYXRlZCBidWZmZXIgZm9yIHNob3J0IHN0cmluZ3MuCisKKyAgICBXaHkgZG9lcyB0aGlzIGZ1bmN0aW9uIHVzZSBtYWxsb2MoKT8KKyAgICAgICAgMS4gX19rbXBfYWxsb2NhdGUoKSByZXR1cm5zIGNhY2hlLWFsaWduZWQgbWVtb3J5IGFsbG9jYXRlZCB3aXRoIG1hbGxvYygpLiBUaGVyZSBhcmUgbm8KKyAgICAgICAgICAgcmVhc29ucyBpbiB1c2luZyBfX2ttcF9hbGxvY2F0ZSgpIGZvciBzdHJpbmdzIGR1ZSB0byBleHRyYSBvdmVyaGVhZCB3aGlsZSBjYWNoZS1hbGlnbmVkCisgICAgICAgICAgIG1lbW9yeSBpcyBub3QgbmVjZXNzYXJ5LgorICAgICAgICAyLiBfX2ttcF90aHJlYWRfbWFsbG9jKCkgY2Fubm90IGJlIHVzZWQgYmVjYXVzZSBpdCByZXF1aXJlcyBwb2ludGVyIHRvIHRocmVhZCBzdHJ1Y3R1cmUuCisgICAgICAgICAgIFdlIG5lZWQgdG8gcGVyZm9ybSBzdHJpbmcgb3BlcmF0aW9ucyBkdXJpbmcgbGlicmFyeSBzdGFydHVwIChmb3IgZXhhbXBsZSwgaW4KKyAgICAgICAgICAgX19rbXBfcmVnaXN0ZXJfbGlicmFyeV9zdGFydHVwKCkpIHdoZW4gbm8gdGhyZWFkIHN0cnVjdHVyZXMgYXJlIGFsbG9jYXRlZCB5ZXQuCisgICAgU28gc3RhbmRhcmQgbWFsbG9jKCkgaXMgdGhlIG9ubHkgYXZhaWxhYmxlIG9wdGlvbi4KKyovCisKKy8vIFRPRE86IEZpbmQgYW5kIHJlcGxhY2UgYWxsIHJlZ3VsYXIgZnJlZSgpIHdpdGggX19rbXBfc3RyX2ZyZWUoKS4KKworY2hhciAqCitfX2ttcF9zdHJfZm9ybWF0KCAgICAgICAgICAgLy8gQWxsb2NhdGVkIHN0cmluZy4KKyAgICBjaGFyIGNvbnN0ICogZm9ybWF0LCAgICAvLyBGb3JtYXQgc3RyaW5nLgorICAgIC4uLiAgICAgICAgICAgICAgICAgICAgIC8vIE90aGVyIHBhcmFtZXRlcnMuCispIHsKKworICAgIHZhX2xpc3QgYXJnczsKKyAgICBpbnQgICAgIHNpemUgICA9IDUxMjsKKyAgICBjaGFyICogIGJ1ZmZlciA9IE5VTEw7CisgICAgaW50ICAgICByYzsKKworICAgIC8vIEFsbG9jYXRlIGJ1ZmZlci4KKyAgICBidWZmZXIgPSAoY2hhciAqKSBLTVBfSU5URVJOQUxfTUFMTE9DKCBzaXplICk7CisgICAgaWYgKCBidWZmZXIgPT0gTlVMTCApIHsKKwlLTVBfRkFUQUwoIE1lbW9yeUFsbG9jRmFpbGVkICk7CisgICAgfTsgLy8gaWYKKworICAgIGZvciAoIDsgOyApIHsKKworICAgICAgICAvLyBUcnkgdG8gZm9ybWF0IHN0cmluZy4KKyAgICAgICAgdmFfc3RhcnQoIGFyZ3MsIGZvcm1hdCApOworICAgICAgICByYyA9IEtNUF9WU05QUklOVEYoIGJ1ZmZlciwgc2l6ZSwgZm9ybWF0LCBhcmdzICk7CisgICAgICAgIHZhX2VuZCggYXJncyApOworCisgICAgICAgIC8vIE5vIGVycm9ycywgc3RyaW5nIGhhcyBiZWVuIGZvcm1hdHRlZC4KKyAgICAgICAgaWYgKCByYyA+PSAwICYmIHJjIDwgc2l6ZSApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9OyAvLyBpZgorCisgICAgICAgIC8vIEVycm9yIG9jY3VycmVkLCBidWZmZXIgaXMgdG9vIHNtYWxsLgorICAgICAgICBpZiAoIHJjID49IDAgKSB7CisgICAgICAgICAgICAvLyBDOTktY29uZm9ybWluZyBpbXBsZW1lbnRhdGlvbiBvZiB2c25wcmludGYgcmV0dXJucyByZXF1aXJlZCBidWZmZXIgc2l6ZS4KKyAgICAgICAgICAgIHNpemUgPSByYyArIDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBPbGRlciBpbXBsZW1lbnRhdGlvbnMganVzdCByZXR1cm4gLTEuCisgICAgICAgICAgICBzaXplID0gc2l6ZSAqIDI7CisgICAgICAgIH07IC8vIGlmCisKKyAgICAgICAgLy8gRW5sYXJnZSBidWZmZXIgYW5kIHRyeSBhZ2Fpbi4KKyAgICAgICAgYnVmZmVyID0gKGNoYXIgKikgS01QX0lOVEVSTkFMX1JFQUxMT0MoIGJ1ZmZlciwgc2l6ZSApOworICAgICAgICBpZiAoIGJ1ZmZlciA9PSBOVUxMICkgeworICAgIAkgICAgS01QX0ZBVEFMKCBNZW1vcnlBbGxvY0ZhaWxlZCApOworICAgICAgICB9OyAvLyBpZgorCisgICAgfTsgLy8gZm9yZXZlcgorCisgICAgcmV0dXJuIGJ1ZmZlcjsKKworfSAvLyBmdW5jIF9fa21wX3N0cl9mb3JtYXQKKworCit2b2lkCitfX2ttcF9zdHJfZnJlZSgKKyAgICBjaGFyIGNvbnN0ICogKiBzdHIKKykgeworICAgIEtNUF9ERUJVR19BU1NFUlQoIHN0ciAhPSBOVUxMICk7CisgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopICogc3RyICk7CisgICAgKiBzdHIgPSBOVUxMOworfSAvLyBmdW5jIF9fa21wX3N0cl9mcmVlCisKKworLyogSWYgbGVuIGlzIHplcm8sIHJldHVybnMgdHJ1ZSBpZmYgdGFyZ2V0IGFuZCBkYXRhIGhhdmUgZXhhY3QgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaC4KKyAgIElmIGxlbiBpcyBuZWdhdGl2ZSwgcmV0dXJucyB0cnVlIGlmZiB0YXJnZXQgaXMgYSBjYXNlLWluc2Vuc2l0aXZlIHN1YnN0cmluZyBvZiBkYXRhLgorICAgSWYgbGVuIGlzIHBvc2l0aXZlLCByZXR1cm5zIHRydWUgaWZmIHRhcmdldCBpcyBhIGNhc2UtaW5zZW5zaXRpdmUgc3Vic3RyaW5nIG9mIGRhdGEgb3IKKyAgICAgdmljZSB2ZXJzYSwgYW5kIG5laXRoZXIgaXMgc2hvcnRlciB0aGFuIGxlbi4KKyovCitpbnQKK19fa21wX3N0cl9tYXRjaCgKKyAgICBjaGFyIGNvbnN0ICogdGFyZ2V0LAorICAgIGludCAgICAgICAgICBsZW4sCisgICAgY2hhciBjb25zdCAqIGRhdGEKKykgeworICAgIGludCBpOworICAgIGlmICggdGFyZ2V0ID09IE5VTEwgfHwgZGF0YSA9PSBOVUxMICkgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfTsgLy8gaWYKKyAgICBmb3IgKCBpID0gMDsgdGFyZ2V0W2ldICYmIGRhdGFbaV07ICsrIGkgKSB7CisgICAgICAgIGlmICggVE9MT1dFUiggdGFyZ2V0W2ldICkgIT0gVE9MT1dFUiggZGF0YVtpXSApICkgeworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGZvciBpCisgICAgcmV0dXJuICggKCBsZW4gPiAwICkgPyBpID49IGxlbiA6ICggISB0YXJnZXRbaV0gJiYgKCBsZW4gfHwgISBkYXRhW2ldICkgKSApOworfSAvLyBfX2ttcF9zdHJfbWF0Y2gKKworCitpbnQKK19fa21wX3N0cl9tYXRjaF9mYWxzZSggY2hhciBjb25zdCAqIGRhdGEgKSB7CisgICAgaW50IHJlc3VsdCA9CisgICAgICAgIF9fa21wX3N0cl9tYXRjaCggImZhbHNlIiwgICAxLCBkYXRhICkgfHwKKyAgICAgICAgX19rbXBfc3RyX21hdGNoKCAib2ZmIiwgICAgIDIsIGRhdGEgKSB8fAorICAgICAgICBfX2ttcF9zdHJfbWF0Y2goICIwIiwgICAgICAgMSwgZGF0YSApIHx8CisgICAgICAgIF9fa21wX3N0cl9tYXRjaCggIi5mYWxzZS4iLCAyLCBkYXRhICkgfHwKKyAgICAgICAgX19rbXBfc3RyX21hdGNoKCAiLmYuIiwgICAgIDIsIGRhdGEgKSB8fAorICAgICAgICBfX2ttcF9zdHJfbWF0Y2goICJubyIsICAgICAgMSwgZGF0YSApOworICAgIHJldHVybiByZXN1bHQ7Cit9IC8vIF9fa21wX3N0cl9tYXRjaF9mYWxzZQorCisKK2ludAorX19rbXBfc3RyX21hdGNoX3RydWUoIGNoYXIgY29uc3QgKiBkYXRhICkgeworICAgIGludCByZXN1bHQgPQorICAgICAgICBfX2ttcF9zdHJfbWF0Y2goICJ0cnVlIiwgICAxLCBkYXRhICkgfHwKKyAgICAgICAgX19rbXBfc3RyX21hdGNoKCAib24iLCAgICAgMiwgZGF0YSApIHx8CisgICAgICAgIF9fa21wX3N0cl9tYXRjaCggIjEiLCAgICAgIDEsIGRhdGEgKSB8fAorICAgICAgICBfX2ttcF9zdHJfbWF0Y2goICIudHJ1ZS4iLCAyLCBkYXRhICkgfHwKKyAgICAgICAgX19rbXBfc3RyX21hdGNoKCAiLnQuIiwgICAgMiwgZGF0YSApIHx8CisgICAgICAgIF9fa21wX3N0cl9tYXRjaCggInllcyIsICAgIDEsIGRhdGEgKTsKKyAgICByZXR1cm4gcmVzdWx0OworfSAvLyBfX2ttcF9zdHJfbWF0Y2hfdHJ1ZQorCit2b2lkCitfX2ttcF9zdHJfcmVwbGFjZSgKKyAgICBjaGFyICogc3RyLAorICAgIGNoYXIgICBzZWFyY2hfZm9yLAorICAgIGNoYXIgICByZXBsYWNlX3dpdGgKKykgeworCisgICAgY2hhciAqIGZvdW5kID0gTlVMTDsKKworICAgIGZvdW5kID0gc3RyY2hyKCBzdHIsIHNlYXJjaF9mb3IgKTsKKyAgICB3aGlsZSAoIGZvdW5kICkgeworICAgICAgICAqIGZvdW5kID0gcmVwbGFjZV93aXRoOworICAgICAgICBmb3VuZCA9IHN0cmNociggZm91bmQgKyAxLCBzZWFyY2hfZm9yICk7CisgICAgfTsgLy8gd2hpbGUKKworfSAvLyBfX2ttcF9zdHJfcmVwbGFjZQorCisKK3ZvaWQKK19fa21wX3N0cl9zcGxpdCgKKyAgICBjaGFyICogIHN0ciwgICAgLy8gSTogU3RyaW5nIHRvIHNwbGl0LgorICAgIGNoYXIgICAgZGVsaW0sICAvLyBJOiBDaGFyYWN0ZXIgdG8gc3BsaXQgb24uCisgICAgY2hhciAqKiBoZWFkLCAgIC8vIE86IFBvaW50ZXIgdG8gaGVhZCAobWF5IGJlIE5VTEwpLgorICAgIGNoYXIgKiogdGFpbCAgICAvLyBPOiBQb2ludGVyIHRvIHRhaWwgKG1heSBiZSBOVUxMKS4KKykgeworICAgIGNoYXIgKiBoID0gc3RyOworICAgIGNoYXIgKiB0ID0gTlVMTDsKKyAgICBpZiAoIHN0ciAhPSBOVUxMICkgeworICAgICAgICBjaGFyICogcHRyID0gc3RyY2hyKCBzdHIsIGRlbGltICk7CisgICAgICAgIGlmICggcHRyICE9IE5VTEwgKSB7CisgICAgICAgICAgICAqIHB0ciAgPSAwOworICAgICAgICAgICAgdCA9IHB0ciArIDE7CisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gaWYKKyAgICBpZiAoIGhlYWQgIT0gTlVMTCApIHsKKyAgICAgICAgKiBoZWFkID0gaDsKKyAgICB9OyAvLyBpZgorICAgIGlmICggdGFpbCAhPSBOVUxMICkgeworICAgICAgICAqIHRhaWwgPSB0OworICAgIH07IC8vIGlmCit9IC8vIF9fa21wX3N0cl9zcGxpdAorCisvKgorICAgIHN0cnRva19yKCkgaXMgbm90IGF2YWlsYWJsZSBvbiBXaW5kb3dzKiBPUy4gVGhpcyBmdW5jdGlvbiByZWltcGxlbWVudHMgc3RydG9rX3IoKS4KKyovCitjaGFyICoKK19fa21wX3N0cl90b2tlbigKKyAgICBjaGFyICogICAgICAgc3RyLCAgIC8vIFN0cmluZyB0byBzcGxpdCBpbnRvIHRva2Vucy4gTm90ZTogU3RyaW5nICppcyogbW9kaWZpZWQhCisgICAgY2hhciBjb25zdCAqIGRlbGltLCAvLyBEZWxpbWl0ZXJzLgorICAgIGNoYXIgKiogICAgICBidWYgICAgLy8gSW50ZXJuYWwgYnVmZmVyLgorKSB7CisgICAgY2hhciAqIHRva2VuID0gTlVMTDsKKyAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgLy8gT24gV2luZG93cyogT1MgdGhlcmUgaXMgbm8gc3RydG9rX3IoKSBmdW5jdGlvbi4gTGV0IHVzIGltcGxlbWVudCBpdC4KKyAgICAgICAgaWYgKCBzdHIgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICogYnVmID0gc3RyOyAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlyc3QgY2FsbCwgaW5pdGlhbGl6ZSBidWYuCisgICAgICAgIH07IC8vIGlmCisgICAgICAgICogYnVmICs9IHN0cnNwbiggKiBidWYsIGRlbGltICk7ICAgICAgIC8vIFNraXAgbGVhZGluZyBkZWxpbWl0ZXJzLgorICAgICAgICBpZiAoICoqIGJ1ZiAhPSAwICkgeyAgICAgICAgICAgICAgICAgICAvLyBSZXN0IG9mIHRoZSBzdHJpbmcgaXMgbm90IHlldCBlbXB0eS4KKyAgICAgICAgICAgIHRva2VuID0gKiBidWY7ICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIGl0IGFzIHJlc3VsdC4KKyAgICAgICAgICAgICogYnVmICs9IHN0cmNzcG4oICogYnVmLCBkZWxpbSApOyAgLy8gU2tpcCBub24tZGVsaW1pdGVycy4KKyAgICAgICAgICAgIGlmICggKiogYnVmICE9IDAgKSB7ICAgICAgICAgICAgICAgLy8gUmVzdCBvZiB0aGUgc3RyaW5nIGlzIG5vdCB5ZXQgZW1wdHkuCisgICAgICAgICAgICAgICAgKiogYnVmID0gMDsgICAgICAgICAgICAgICAgICAgIC8vIFRlcm1pbmF0ZSB0b2tlbiBoZXJlLgorICAgICAgICAgICAgICAgICogYnVmICs9IDE7ICAgICAgICAgICAgICAgICAgICAvLyBBZHZhbmNlIGJ1ZiB0byBzdGFydCB3aXRoIHRoZSBuZXh0IHRva2VuIG5leHQgdGltZS4KKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH07IC8vIGlmCisgICAgI2Vsc2UKKyAgICAgICAgLy8gT24gTGludXgqIE9TIGFuZCBPUyBYKiwgc3RydG9rX3IoKSBpcyBhdmFpbGFibGUuIExldCB1cyB1c2UgaXQuCisgICAgICAgIHRva2VuID0gc3RydG9rX3IoIHN0ciwgZGVsaW0sIGJ1ZiApOworICAgICNlbmRpZgorICAgIHJldHVybiB0b2tlbjsKK307IC8vIF9fa21wX3N0cl90b2tlbgorCisKK2ludAorX19rbXBfc3RyX3RvX2ludCgKKyAgICBjaGFyIGNvbnN0ICogc3RyLAorICAgIGNoYXIgICAgICAgICBzZW50aW5lbAorKSB7CisgICAgaW50IHJlc3VsdCwgZmFjdG9yOworICAgIGNoYXIgY29uc3QgKiB0OworCisgICAgcmVzdWx0ID0gMDsKKworICAgIGZvciAodCA9IHN0cjsgKnQgIT0gJ1wwJzsgKyt0KSB7CisgICAgICAgIGlmICgqdCA8ICcwJyB8fCAqdCA+ICc5JykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICByZXN1bHQgPSAocmVzdWx0ICogMTApICsgKCp0IC0gJzAnKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKCp0KSB7CisgICAgY2FzZSAnXDAnOiAgICAgICAgICAvKiB0aGUgY3VycmVudCBkZWZhdWx0IGZvciBubyBzdWZmaXggaXMgYnl0ZXMgKi8KKwlmYWN0b3IgPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdiJzogY2FzZSAnQic6IC8qIGJ5dGVzICovCisJKyt0OworCWZhY3RvciA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ2snOiBjYXNlICdLJzogLyoga2lsby1ieXRlcyAqLworCSsrdDsKKwlmYWN0b3IgPSAxMDI0OworICAgICAgICBicmVhazsKKyAgICBjYXNlICdtJzogY2FzZSAnTSc6IC8qIG1lZ2EtYnl0ZXMgKi8KKwkrK3Q7CisJZmFjdG9yID0gKDEwMjQgKiAxMDI0KTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKwlpZigqdCAhPSBzZW50aW5lbCkKKwkgICAgcmV0dXJuICgtMSk7CisJdCA9ICIiOworCWZhY3RvciA9IDE7CisgICAgfQorCisgICAgaWYgKHJlc3VsdCA+IChJTlRfTUFYIC8gZmFjdG9yKSkKKwlyZXN1bHQgPSBJTlRfTUFYOworICAgIGVsc2UKKwlyZXN1bHQgKj0gZmFjdG9yOworCisgICAgcmV0dXJuICgqdCAhPSAwID8gMCA6IHJlc3VsdCk7CisKK30gLy8gX19rbXBfc3RyX3RvX2ludAorCisKKy8qCisgICAgVGhlIHJvdXRpbmUgcGFyc2VzIGlucHV0IHN0cmluZy4gSXQgaXMgZXhwZWN0ZWQgaXQgaXMgYSB1bnNpZ25lZCBpbnRlZ2VyIHdpdGggb3B0aW9uYWwgdW5pdC4KKyAgICBVbml0cyBhcmU6ICJiIiBmb3IgYnl0ZXMsICJrYiIgb3IganVzdCAiayIgZm9yIGtpbG9ieXRlcywgIm1iIiBvciAibSIgZm9yIG1lZ2FieXRlcywgLi4uLCAieWIiCisgICAgb3IgInkiIGZvciB5b3R0YWJ5dGVzLiA6LSkgVW5pdCBuYW1lIGlzIGNhc2UtaW5zZW5zaXRpdmUuIFRoZSByb3V0aW5lIHJldHVybnMgMCBpZiBldmVyeXRoaW5nIGlzCisgICAgb2ssIG9yIGVycm9yIGNvZGU6IC0xIGluIGNhc2Ugb2Ygb3ZlcmZsb3csIC0yIGluIGNhc2Ugb2YgdW5rbm93biB1bml0LiAqc2l6ZSBpcyBzZXQgdG8gcGFyc2VkCisgICAgdmFsdWUuIEluIGNhc2Ugb2Ygb3ZlcmZsb3cgKnNpemUgaXMgc2V0IHRvIEtNUF9TSVpFX1RfTUFYLCBpbiBjYXNlIG9mIHVua25vd24gdW5pdCAqc2l6ZSBpcyBzZXQKKyAgICB0byB6ZXJvLgorKi8KK3ZvaWQKK19fa21wX3N0cl90b19zaXplKCAgICAgICAgIC8vIFI6IEVycm9yIGNvZGUuCisgICAgY2hhciBjb25zdCAqICAgc3RyLCAgICAvLyBJOiBTdHJpbmcgb2YgY2hhcmFjdGVycywgdW5zaWduZWQgbnVtYmVyIGFuZCB1bml0ICgiYiIsICJrYiIsIGV0YykuCisgICAgc2l6ZV90ICogICAgICAgb3V0LCAgICAvLyBPOiBQYXJzZWQgbnVtYmVyLgorICAgIHNpemVfdCAgICAgICAgIGRmYWN0b3IsIC8vIEk6IFRoZSBmYWN0b3IgaWYgbm9uZSBvZiB0aGUgbGV0dGVycyBzcGVjaWZpZWQuCisgICAgY2hhciBjb25zdCAqICogZXJyb3IgICAvLyBPOiBOdWxsIGlmIGV2ZXJ5dGhpbmcgaXMgb2ssIGVycm9yIG1lc3NhZ2Ugb3RoZXJ3aXNlLgorKSB7CisKKyAgICBzaXplX3QgdmFsdWUgICAgPSAwOworICAgIHNpemVfdCBmYWN0b3IgICA9IDA7CisgICAgaW50ICAgIG92ZXJmbG93ID0gMDsKKyAgICBpbnQgICAgaSAgICAgICAgPSAwOworICAgIGludCAgICBkaWdpdDsKKworCisgICAgS01QX0RFQlVHX0FTU0VSVCggc3RyICE9IE5VTEwgKTsKKworICAgIC8vIFNraXAgc3BhY2VzLgorICAgIHdoaWxlICggc3RyWyBpIF0gPT0gJyAnIHx8IHN0clsgaSBdID09ICdcdCcpIHsKKyAgICAgICAgKysgaTsKKyAgICB9OyAvLyB3aGlsZQorCisgICAgLy8gUGFyc2UgbnVtYmVyLgorICAgIGlmICggc3RyWyBpIF0gPCAnMCcgfHwgc3RyWyBpIF0gPiAnOScgKSB7CisgICAgICAgICogZXJyb3IgPSBLTVBfSTE4Tl9TVFIoIE5vdEFOdW1iZXIgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisgICAgZG8geworICAgICAgICBkaWdpdCA9IHN0clsgaSBdIC0gJzAnOworICAgICAgICBvdmVyZmxvdyA9IG92ZXJmbG93IHx8ICggdmFsdWUgPiAoIEtNUF9TSVpFX1RfTUFYIC0gZGlnaXQgKSAvIDEwICk7CisgICAgICAgIHZhbHVlID0gKCB2YWx1ZSAqIDEwICkgKyBkaWdpdDsKKyAgICAgICAgKysgaTsKKyAgICB9IHdoaWxlICggc3RyWyBpIF0gPj0gJzAnICYmIHN0clsgaSBdIDw9ICc5JyApOworCisgICAgLy8gU2tpcCBzcGFjZXMuCisgICAgd2hpbGUgKCBzdHJbIGkgXSA9PSAnICcgfHwgc3RyWyBpIF0gPT0gJ1x0JyApIHsKKyAgICAgICAgKysgaTsKKyAgICB9OyAvLyB3aGlsZQorCisgICAgLy8gUGFyc2UgdW5pdC4KKyAgICAjZGVmaW5lIF9jYXNlKCBjaCwgZXhwICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIGNoIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgY2ggLSAoICdhJyAtICdBJyApIDogeyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHNpemVfdCBzaGlmdCA9IChleHApICogMTA7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKysgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoIHNoaWZ0IDwgc2l6ZW9mKCBzaXplX3QgKSAqIDggKSB7ICAgICAgIFwKKyAgICAgICAgICAgICAgICBmYWN0b3IgPSAoc2l6ZV90KSggMSApIDw8IHNoaWZ0OyAgICAgICAgXAorICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgb3ZlcmZsb3cgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IGJyZWFrOworICAgIHN3aXRjaCAoIHN0clsgaSBdICkgeworICAgICAgICBfY2FzZSggJ2snLCAxICk7IC8vIEtpbG8KKyAgICAgICAgX2Nhc2UoICdtJywgMiApOyAvLyBNZWdhCisgICAgICAgIF9jYXNlKCAnZycsIDMgKTsgLy8gR2lnYQorICAgICAgICBfY2FzZSggJ3QnLCA0ICk7IC8vIFRlcmEKKyAgICAgICAgX2Nhc2UoICdwJywgNSApOyAvLyBQZXRhCisgICAgICAgIF9jYXNlKCAnZScsIDYgKTsgLy8gRXhhCisgICAgICAgIF9jYXNlKCAneicsIDcgKTsgLy8gWmV0dGEKKyAgICAgICAgX2Nhc2UoICd5JywgOCApOyAvLyBZb3R0YQorICAgICAgICAvLyBPb3BzLiBObyBtb3JlIHVuaXRzLi4uCisgICAgfTsgLy8gc3dpdGNoCisgICAgI3VuZGVmIF9jYXNlCisgICAgaWYgKCBzdHJbIGkgXSA9PSAnYicgfHwgc3RyWyBpIF0gPT0gJ0InICkgeyAgICAvLyBTa2lwIG9wdGlvbmFsICJiIi4KKwlpZiAoIGZhY3RvciA9PSAwICkgeworCSAgICBmYWN0b3IgPSAxOworCX0KKyAgICAgICAgKysgaTsKKyAgICB9OyAvLyBpZgorICAgIGlmICggISAoIHN0clsgaSBdID09ICcgJyB8fCBzdHJbIGkgXSA9PSAnXHQnIHx8IHN0clsgaSBdID09IDAgKSApIHsgLy8gQmFkIHVuaXQKKyAgICAgICAgKiBlcnJvciA9IEtNUF9JMThOX1NUUiggQmFkVW5pdCApOworICAgICAgICByZXR1cm47CisgICAgfTsgLy8gaWYKKworICAgIGlmICggZmFjdG9yID09IDAgKSB7CisJZmFjdG9yID0gZGZhY3RvcjsKKyAgICB9CisKKyAgICAvLyBBcHBseSBmYWN0b3IuCisgICAgb3ZlcmZsb3cgPSBvdmVyZmxvdyB8fCAoIHZhbHVlID4gKCBLTVBfU0laRV9UX01BWCAvIGZhY3RvciApICk7CisgICAgdmFsdWUgKj0gZmFjdG9yOworCisgICAgLy8gU2tpcCBzcGFjZXMuCisgICAgd2hpbGUgKCBzdHJbIGkgXSA9PSAnICcgfHwgc3RyWyBpIF0gPT0gJ1x0JyApIHsKKyAgICAgICAgKysgaTsKKyAgICB9OyAvLyB3aGlsZQorCisgICAgaWYgKCBzdHJbIGkgXSAhPSAwICkgeworICAgICAgICAqIGVycm9yID0gS01QX0kxOE5fU1RSKCBJbGxlZ2FsQ2hhcmFjdGVycyApOworICAgICAgICByZXR1cm47CisgICAgfTsgLy8gaWYKKworICAgIGlmICggb3ZlcmZsb3cgKSB7CisgICAgICAgICogZXJyb3IgPSBLTVBfSTE4Tl9TVFIoIFZhbHVlVG9vTGFyZ2UgKTsKKyAgICAgICAgKiBvdXQgPSBLTVBfU0laRV9UX01BWDsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisKKyAgICAqIGVycm9yID0gTlVMTDsKKyAgICAqIG91dCA9IHZhbHVlOworCit9IC8vIF9fa21wX3N0cl90b19zaXplCisKKwordm9pZAorX19rbXBfc3RyX3RvX3VpbnQoICAgICAgICAgLy8gUjogRXJyb3IgY29kZS4KKyAgICBjaGFyIGNvbnN0ICogICBzdHIsICAgIC8vIEk6IFN0cmluZyBvZiBjaGFyYWN0ZXJzLCB1bnNpZ25lZCBudW1iZXIuCisgICAga21wX3VpbnQ2NCAqICAgb3V0LCAgICAvLyBPOiBQYXJzZWQgbnVtYmVyLgorICAgIGNoYXIgY29uc3QgKiAqIGVycm9yICAgLy8gTzogTnVsbCBpZiBldmVyeXRoaW5nIGlzIG9rLCBlcnJvciBtZXNzYWdlIG90aGVyd2lzZS4KKykgeworCisgICAgc2l6ZV90IHZhbHVlICAgID0gMDsKKyAgICBpbnQgICAgb3ZlcmZsb3cgPSAwOworICAgIGludCAgICBpICAgICAgICA9IDA7CisgICAgaW50ICAgIGRpZ2l0OworCisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzdHIgIT0gTlVMTCApOworCisgICAgLy8gU2tpcCBzcGFjZXMuCisgICAgd2hpbGUgKCBzdHJbIGkgXSA9PSAnICcgfHwgc3RyWyBpIF0gPT0gJ1x0JyApIHsKKyAgICAgICAgKysgaTsKKyAgICB9OyAvLyB3aGlsZQorCisgICAgLy8gUGFyc2UgbnVtYmVyLgorICAgIGlmICggc3RyWyBpIF0gPCAnMCcgfHwgc3RyWyBpIF0gPiAnOScgKSB7CisgICAgICAgICogZXJyb3IgPSBLTVBfSTE4Tl9TVFIoIE5vdEFOdW1iZXIgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisgICAgZG8geworICAgICAgICBkaWdpdCA9IHN0clsgaSBdIC0gJzAnOworICAgICAgICBvdmVyZmxvdyA9IG92ZXJmbG93IHx8ICggdmFsdWUgPiAoIEtNUF9TSVpFX1RfTUFYIC0gZGlnaXQgKSAvIDEwICk7CisgICAgICAgIHZhbHVlID0gKCB2YWx1ZSAqIDEwICkgKyBkaWdpdDsKKyAgICAgICAgKysgaTsKKyAgICB9IHdoaWxlICggc3RyWyBpIF0gPj0gJzAnICYmIHN0clsgaSBdIDw9ICc5JyApOworCisgICAgLy8gU2tpcCBzcGFjZXMuCisgICAgd2hpbGUgKCBzdHJbIGkgXSA9PSAnICcgfHwgc3RyWyBpIF0gPT0gJ1x0JyApIHsKKyAgICAgICAgKysgaTsKKyAgICB9OyAvLyB3aGlsZQorCisgICAgaWYgKCBzdHJbIGkgXSAhPSAwICkgeworICAgICAgICAqIGVycm9yID0gS01QX0kxOE5fU1RSKCBJbGxlZ2FsQ2hhcmFjdGVycyApOworICAgICAgICByZXR1cm47CisgICAgfTsgLy8gaWYKKworICAgIGlmICggb3ZlcmZsb3cgKSB7CisgICAgICAgICogZXJyb3IgPSBLTVBfSTE4Tl9TVFIoIFZhbHVlVG9vTGFyZ2UgKTsKKyAgICAgICAgKiBvdXQgPSAoa21wX3VpbnQ2NCkgLTE7CisgICAgICAgIHJldHVybjsKKyAgICB9OyAvLyBpZgorCisgICAgKiBlcnJvciA9IE5VTEw7CisgICAgKiBvdXQgPSB2YWx1ZTsKKworfSAvLyBfX2ttcF9zdHJfdG9fdW5pdAorCisKKworLy8gZW5kIG9mIGZpbGUgLy8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zdHIuaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zdHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTcxYmJhCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX3N0ci5oCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICoga21wX3N0ci5oIC0tIFN0cmluZyBtYW5pcHVsYXRpb24gcm91dGluZXMuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX1NUUl9ICisjZGVmaW5lIEtNUF9TVFJfSAorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpbmNsdWRlICJrbXBfb3MuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgZXh0ZXJuICJDIiB7CisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworI2lmIEtNUF9PU19XSU5ET1dTCisjIGRlZmluZSBzdHJkdXAgICAgX3N0cmR1cAorI2VuZGlmCisKKy8qICBzb21lIG1hY3JvcyB0byByZXBsYWNlIGN0eXBlLmggZnVuY3Rpb25zICAqLworI2RlZmluZSBUT0xPV0VSKGMpCSgoKChjKSA+PSAnQScpICYmICgoYykgPD0gJ1onKSkgPyAoKGMpICsgJ2EnIC0gJ0EnKSA6IChjKSkKKworc3RydWN0IGttcF9zdHJfYnVmIHsKKyAgICBjaGFyICAgICAgICogc3RyOyAgICAgICAgIC8vIFBvaW50ZXIgdG8gYnVmZmVyIGNvbnRlbnQsIHJlYWQgb25seS4KKyAgICB1bnNpZ25lZCBpbnQgc2l6ZTsgICAgICAgIC8vIERvIG5vdCBjaGFuZ2UgdGhpcyBmaWVsZCEKKyAgICBpbnQgICAgICAgICAgdXNlZDsgICAgICAgIC8vIE51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQgdG8gYnVmZmVyLCByZWFkIG9ubHkuCisgICAgY2hhciAgICAgICAgIGJ1bGtbIDUxMiBdOyAvLyBEbyBub3QgdXNlIHRoaXMgZmllbGQhCit9OyAvLyBzdHJ1Y3Qga21wX3N0cl9idWYKK3R5cGVkZWYgc3RydWN0IGttcF9zdHJfYnVmICBrbXBfc3RyX2J1Zl90OworCisjZGVmaW5lIF9fa21wX3N0cl9idWZfaW5pdCggYiApICAgeyAoYiktPnN0ciA9IChiKS0+YnVsazsgKGIpLT5zaXplID0gc2l6ZW9mKCAoYiktPmJ1bGsgKTsgKGIpLT51c2VkID0gMDsgKGIpLT5idWxrWyAwIF0gPSAwOyB9CisKK3ZvaWQgICBfX2ttcF9zdHJfYnVmX2NsZWFyKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyICk7Cit2b2lkICAgX19rbXBfc3RyX2J1Zl9yZXNlcnZlKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBpbnQgc2l6ZSApOwordm9pZCAgIF9fa21wX3N0cl9idWZfZGV0YWNoKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyICk7Cit2b2lkICAgX19rbXBfc3RyX2J1Zl9mcmVlKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyICk7Cit2b2lkICAgX19rbXBfc3RyX2J1Zl9jYXQoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBzdHIsIGludCBsZW4gKTsKK3ZvaWQgICBfX2ttcF9zdHJfYnVmX3ZwcmludCgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIGZvcm1hdCwgdmFfbGlzdCBhcmdzICk7Cit2b2lkICAgX19rbXBfc3RyX2J1Zl9wcmludCgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIGZvcm1hdCwgLi4uICk7Cit2b2lkICAgX19rbXBfc3RyX2J1Zl9wcmludF9zaXplKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBzaXplX3Qgc2l6ZSApOworCisvKgorICAgIEZpbGUgbmFtZSBwYXJzZXIuIFVzYWdlOgorCisgICAgICAgIGttcF9zdHJfZm5hbWVfdCBmbmFtZSA9IF9fa21wX3N0cl9mbmFtZV9pbml0KCBwYXRoICk7CisgICAgICAgIC8vIFVzZSBmbmFtZS5wYXRoIChjb3B5IG9mIG9yaWdpbmFsIHBhdGggKSwgZm5hbWUuZGlyLCBmbmFtZS5iYXNlLgorICAgICAgICAvLyBOb3RlIGZuYW1lLmRpciBjb25jYXRlbmF0ZWQgd2l0aCBmbmFtZS5iYXNlIGdpdmVzIGV4YWN0IGNvcHkgb2YgcGF0aC4KKyAgICAgICAgX19rbXBfc3RyX2ZuYW1lX2ZyZWUoICYgZm5hbWUgKTsKKworKi8KK3N0cnVjdCBrbXBfc3RyX2ZuYW1lIHsKKyAgICBjaGFyICogcGF0aDsKKyAgICBjaGFyICogZGlyOworICAgIGNoYXIgKiBiYXNlOworfTsgLy8gc3RydWN0IGttcF9zdHJfZm5hbWUKK3R5cGVkZWYgc3RydWN0IGttcF9zdHJfZm5hbWUga21wX3N0cl9mbmFtZV90Owordm9pZCBfX2ttcF9zdHJfZm5hbWVfaW5pdCgga21wX3N0cl9mbmFtZV90ICogZm5hbWUsIGNoYXIgY29uc3QgKiBwYXRoICk7Cit2b2lkIF9fa21wX3N0cl9mbmFtZV9mcmVlKCBrbXBfc3RyX2ZuYW1lX3QgKiBmbmFtZSApOworLy8gQ29tcGFyZXMgZmlsZSBuYW1lIHdpdGggc3BlY2lmaWVkIHBhdGVybi4gSWYgcGF0dGVybiBpcyBOVUxMLCBhbnkgZm5hbWUgbWF0Y2hlZC4KK2ludCBfX2ttcF9zdHJfZm5hbWVfbWF0Y2goIGttcF9zdHJfZm5hbWVfdCBjb25zdCAqIGZuYW1lLCBjaGFyIGNvbnN0ICogcGF0dGVybiApOworCisvKgorICAgIFRoZSBjb21waWxlciBwcm92aWRlcyBzb3VyY2UgbG9jYXRpb25zIGluIHN0cmluZyBmb3JtICI7ZmlsZTtmdW5jO2xpbmU7Y29sOzsiLiBJdCBub3Qgbm90CisgICAgY29udmVuaWVudCBmb3IgbWFudXB1bGF0aW9uLiBUaGVzZSBzdHJ1Y3R1cmUga2VlcHMgc291cmNlIGxvY2F0aW9uIGluIG1vcmUgY29udmVuaWVudCBmb3JtLgorICAgIFVzYWdlOgorCisgICAgICAgIGttcF9zdHJfbG9jX3QgbG9jID0gX19rbXBfc3RyX2xvY19pbml0KCBpZGVudC0+cHNvdXJjZSwgMCApOworICAgICAgICAvLyB1c2UgbG9jLmZpbGUsIGxvYy5mdW5jLCBsb2MubGluZSwgbG9jLmNvbC4KKyAgICAgICAgLy8gbG9jLmZuYW1lIGlzIGF2YWlsYWJsZSBpZiB0aGUgc2Vjb25kIGFyZ3VtZW50IG9mIF9fa21wX3N0cl9sb2NfaW5pdCBpcyB0cnVlLgorICAgICAgICBfX2ttcF9zdHJfbG9jX2ZyZWUoICYgbG9jICk7CisKKyAgICBJZiBwc291cmNlIGlzIE5VTEwgb3IgZG9lcyBub3QgZm9sbG93IGZvcm1hdCBhYm92ZSwgZmlsZSBhbmQvb3IgZnVuYyBtYXkgYmUgTlVMTCBwb2ludGVycy4KKyovCitzdHJ1Y3Qga21wX3N0cl9sb2MgeworICAgIGNoYXIgKiAgICAgICAgICBfYnVsazsgIC8vIERvIG5vdCB1c2UgdGhpZCBmaWVsZC4KKyAgICBrbXBfc3RyX2ZuYW1lX3QgZm5hbWU7ICAvLyBXaWxsIGJlIGluaXRpYWxpemVkIGlmIGluaXRfZm5hbWUgaXMgdHJ1ZS4KKyAgICBjaGFyICogICAgICAgICAgZmlsZTsKKyAgICBjaGFyICogICAgICAgICAgZnVuYzsKKyAgICBpbnQgICAgICAgICAgICAgbGluZTsKKyAgICBpbnQgICAgICAgICAgICAgY29sOworfTsgLy8gc3RydWN0IGttcF9zdHJfbG9jCit0eXBlZGVmIHN0cnVjdCBrbXBfc3RyX2xvYyBrbXBfc3RyX2xvY190Owora21wX3N0cl9sb2NfdCBfX2ttcF9zdHJfbG9jX2luaXQoIGNoYXIgY29uc3QgKiBwc291cmNlLCBpbnQgaW5pdF9mbmFtZSApOwordm9pZCBfX2ttcF9zdHJfbG9jX2ZyZWUoIGttcF9zdHJfbG9jX3QgKiBsb2MgKTsKKworaW50ICAgIF9fa21wX3N0cl9lcWYoIGNoYXIgY29uc3QgKiBsaHMsIGNoYXIgY29uc3QgKiByaHMgKTsKK2NoYXIgKiBfX2ttcF9zdHJfZm9ybWF0KCBjaGFyIGNvbnN0ICogZm9ybWF0LCAuLi4gKTsKK3ZvaWQgICBfX2ttcF9zdHJfZnJlZSggY2hhciBjb25zdCAqICogc3RyICk7CitpbnQgICAgX19rbXBfc3RyX21hdGNoKCBjaGFyIGNvbnN0ICogdGFyZ2V0LCBpbnQgbGVuLCBjaGFyIGNvbnN0ICogZGF0YSApOworaW50ICAgIF9fa21wX3N0cl9tYXRjaF9mYWxzZSggY2hhciBjb25zdCAqIGRhdGEgKTsKK2ludCAgICBfX2ttcF9zdHJfbWF0Y2hfdHJ1ZSggY2hhciBjb25zdCAqIGRhdGEgKTsKK3ZvaWQgICBfX2ttcF9zdHJfcmVwbGFjZSggY2hhciAqIHN0ciwgY2hhciBzZWFyY2hfZm9yLCBjaGFyIHJlcGxhY2Vfd2l0aCApOwordm9pZCAgIF9fa21wX3N0cl9zcGxpdCggY2hhciAqIHN0ciwgY2hhciBkZWxpbSwgY2hhciAqKiBoZWFkLCBjaGFyICoqIHRhaWwgKTsKK2NoYXIgKiBfX2ttcF9zdHJfdG9rZW4oIGNoYXIgKiBzdHIsIGNoYXIgY29uc3QgKiBkZWxpbSwgY2hhciAqKiBidWYgKTsKK2ludCAgICBfX2ttcF9zdHJfdG9faW50KCBjaGFyIGNvbnN0ICogc3RyLCBjaGFyIHNlbnRpbmVsICk7CisKK3ZvaWQgX19rbXBfc3RyX3RvX3NpemUoIGNoYXIgY29uc3QgKiBzdHIsIHNpemVfdCAqIG91dCwgc2l6ZV90IGRmYWN0b3IsIGNoYXIgY29uc3QgKiAqIGVycm9yICk7Cit2b2lkIF9fa21wX3N0cl90b191aW50KCBjaGFyIGNvbnN0ICogc3RyLCBrbXBfdWludDY0ICogb3V0LCBjaGFyIGNvbnN0ICogKiBlcnJvciApOworCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICB9IC8vIGV4dGVybiAiQyIKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisjZW5kaWYgLy8gS01QX1NUUl9ICisKKy8vIGVuZCBvZiBmaWxlIC8vCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zdHViLmMgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfc3R1Yi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMDk1M2EKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfc3R1Yi5jCkBAIC0wLDAgKzEsMjUyIEBACisvKgorICoga21wX3N0dWIuYyAtLSBzdHViIHZlcnNpb25zIG9mIHVzZXItY2FsbGFibGUgT3Blbk1QIFJUIGZ1bmN0aW9ucy4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlICJvbXAuaCIgICAgICAgICAgICAgICAgLy8gRnVuY3Rpb24gcmVuYW1pbmdzLgorI2luY2x1ZGUgImttcC5oIiAgICAgICAgICAgICAgICAvLyBLTVBfREVGQVVMVF9TVEtTSVpFCisjaW5jbHVkZSAia21wX3N0dWIuaCIKKworI2lmIEtNUF9PU19XSU5ET1dTCisgICAgI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbHNlCisgICAgI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjZW5kaWYKKworLy8gTW92ZWQgZnJvbSBvbXAuaAorI2RlZmluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzICAgIG9tcGNfc2V0X21heF9hY3RpdmVfbGV2ZWxzCisjZGVmaW5lIG9tcF9zZXRfc2NoZWR1bGUgICAgICAgICAgICAgb21wY19zZXRfc2NoZWR1bGUKKyNkZWZpbmUgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtICBvbXBjX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisjZGVmaW5lIG9tcF9nZXRfdGVhbV9zaXplICAgICAgICAgICAgb21wY19nZXRfdGVhbV9zaXplCisKKyNkZWZpbmUgb21wX3NldF9udW1fdGhyZWFkcyAgICAgICAgICBvbXBjX3NldF9udW1fdGhyZWFkcworI2RlZmluZSBvbXBfc2V0X2R5bmFtaWMgICAgICAgICAgICAgIG9tcGNfc2V0X2R5bmFtaWMKKyNkZWZpbmUgb21wX3NldF9uZXN0ZWQgICAgICAgICAgICAgICBvbXBjX3NldF9uZXN0ZWQKKyNkZWZpbmUga21wX3NldF9zdGFja3NpemUgICAgICAgICAgICBrbXBjX3NldF9zdGFja3NpemUKKyNkZWZpbmUga21wX3NldF9zdGFja3NpemVfcyAgICAgICAgICBrbXBjX3NldF9zdGFja3NpemVfcworI2RlZmluZSBrbXBfc2V0X2Jsb2NrdGltZSAgICAgICAgICAgIGttcGNfc2V0X2Jsb2NrdGltZQorI2RlZmluZSBrbXBfc2V0X2xpYnJhcnkgICAgICAgICAgICAgIGttcGNfc2V0X2xpYnJhcnkKKyNkZWZpbmUga21wX3NldF9kZWZhdWx0cyAgICAgICAgICAgICBrbXBjX3NldF9kZWZhdWx0cworI2RlZmluZSBrbXBfbWFsbG9jICAgICAgICAgICAgICAgICAgIGttcGNfbWFsbG9jCisjZGVmaW5lIGttcF9jYWxsb2MgICAgICAgICAgICAgICAgICAga21wY19jYWxsb2MKKyNkZWZpbmUga21wX3JlYWxsb2MgICAgICAgICAgICAgICAgICBrbXBjX3JlYWxsb2MKKyNkZWZpbmUga21wX2ZyZWUgICAgICAgICAgICAgICAgICAgICBrbXBjX2ZyZWUKKworc3RhdGljIGRvdWJsZSBmcmVxdWVuY3kgPSAwLjA7CisKKy8vIEhlbHBlciBmdW5jdGlvbnMuCitzdGF0aWMgc2l6ZV90IF9fa21wc19pbml0KCkgeworICAgIHN0YXRpYyBpbnQgICAgaW5pdGlhbGl6ZWQgPSAwOworICAgIHN0YXRpYyBzaXplX3QgZHVtbXkgPSAwOworICAgIGlmICggISBpbml0aWFsaXplZCApIHsKKworICAgICAgICAvLyBUT0RPOiBBbmFseXplIEtNUF9WRVJTSU9OIGVudmlyb25tZW50IHZhcmlhYmxlLCBwcmludCBfX2ttcF92ZXJzaW9uX2NvcHlyaWdodCBhbmQKKyAgICAgICAgLy8gX19rbXBfdmVyc2lvbl9idWlsZF90aW1lLgorICAgICAgICAvLyBXQVJOSU5HOiBEbyBub3QgdXNlICJmcHJpbnRmKCBzdGRlcnIsIC4uLiApIiBiZWNhdXNlIGl0IHdpbGwgY2F1c2UgdW5yZXNvbHZlZCAiX19pb2IiCisgICAgICAgIC8vIHN5bWJvbCAoc2VlIEM3MDA4MCkuIFdlIG5lZWQgdG8gZXh0cmFjdCBfX2ttcF9wcmludGYoKSBzdHVmZiBmcm9tIGttcF9ydW50aW1lLmMgYW5kIHVzZQorICAgICAgICAvLyBpdC4KKworICAgICAgICAvLyBUcmljayB3aXRoIGR1bW15IHZhcmlhYmxlIGZvcmNlcyBsaW5rZXIgdG8ga2VlcCBfX2ttcF92ZXJzaW9uX2NvcHlyaWdodCBhbmQKKyAgICAgICAgLy8gX19rbXBfdmVyc2lvbl9idWlsZF90aW1lIHN0cmluZ3MgaW4gZXhlY3V0YWJsZSBmaWxlIChpbiBjYXNlIG9mIHN0YXRpYyBsaW5rYWdlKS4KKyAgICAgICAgLy8gV2hlbiBLTVBfVkVSU0lPTiBhbmFseXplIGlzIGltcGxlbWVudGVkLCBkdW1teSB2YXJpYWJsZSBzaG91bGQgYmUgZGVsZXRlZCwgZnVuY3Rpb24KKyAgICAgICAgLy8gc2hvdWxkIHJldHVybiB2b2lkLgorICAgICAgICBkdW1teSA9IF9fa21wX3ZlcnNpb25fY29weXJpZ2h0IC0gX19rbXBfdmVyc2lvbl9idWlsZF90aW1lOworCisgICAgICAgICNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICAgICAgTEFSR0VfSU5URUdFUiBmcmVxOworICAgICAgICAgICAgQk9PTCBzdGF0dXMgPSBRdWVyeVBlcmZvcm1hbmNlRnJlcXVlbmN5KCAmIGZyZXEgKTsKKyAgICAgICAgICAgIGlmICggc3RhdHVzICkgeworICAgICAgICAgICAgICAgIGZyZXF1ZW5jeSA9IGRvdWJsZSggZnJlcS5RdWFkUGFydCApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgI2VuZGlmCisKKyAgICAgICAgaW5pdGlhbGl6ZWQgPSAxOworICAgIH07IC8vIGlmCisgICAgcmV0dXJuIGR1bW15OworfTsgLy8gX19rbXBzX2luaXQKKworI2RlZmluZSBpIF9fa21wc19pbml0KCk7CisKKy8qIHNldCBBUEkgZnVuY3Rpb25zICovCit2b2lkIG9tcF9zZXRfbnVtX3RocmVhZHMoIG9tcF9pbnRfdCBudW1fdGhyZWFkcyApIHsgaTsgfQordm9pZCBvbXBfc2V0X2R5bmFtaWMoIG9tcF9pbnRfdCBkeW5hbWljICkgICAgICAgICB7IGk7IF9fa21wc19zZXRfZHluYW1pYyggZHluYW1pYyApOyB9Cit2b2lkIG9tcF9zZXRfbmVzdGVkKCBvbXBfaW50X3QgbmVzdGVkICkgICAgICAgICAgIHsgaTsgX19rbXBzX3NldF9uZXN0ZWQoIG5lc3RlZCApOyAgIH0KK3ZvaWQgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscyggb21wX2ludF90IG1heF9hY3RpdmVfbGV2ZWxzICkgeyBpOyB9Cit2b2lkIG9tcF9zZXRfc2NoZWR1bGUoIG9tcF9zY2hlZF90IGtpbmQsIG9tcF9pbnRfdCBtb2RpZmllciApIHsgaTsgX19rbXBzX3NldF9zY2hlZHVsZSggKGttcF9zY2hlZF90KWtpbmQsIG1vZGlmaWVyICk7IH0KK2ludCBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0oIG9tcF9pbnRfdCBsZXZlbCApIHsgaTsgcmV0dXJuICggbGV2ZWwgKSA/ICggLTEgKSA6ICggMCApOyB9CitpbnQgb21wX2dldF90ZWFtX3NpemUoIG9tcF9pbnRfdCBsZXZlbCApIHsgaTsgcmV0dXJuICggbGV2ZWwgKSA/ICggLTEgKSA6ICggMSApOyB9CitpbnQga21wY19zZXRfYWZmaW5pdHlfbWFza19wcm9jKCBpbnQgcHJvYywgdm9pZCAqKm1hc2sgKSB7IGk7IHJldHVybiAtMTsgfQoraW50IGttcGNfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jKCBpbnQgcHJvYywgdm9pZCAqKm1hc2sgKSB7IGk7IHJldHVybiAtMTsgfQoraW50IGttcGNfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyggaW50IHByb2MsIHZvaWQgKiptYXNrICkgeyBpOyByZXR1cm4gLTE7IH0KKworLyoga21wIEFQSSBmdW5jdGlvbnMgKi8KK3ZvaWQga21wX3NldF9zdGFja3NpemUoIG9tcF9pbnRfdCBhcmcgKSAgIHsgaTsgX19rbXBzX3NldF9zdGFja3NpemUoIGFyZyApOyB9Cit2b2lkIGttcF9zZXRfc3RhY2tzaXplX3MoIHNpemVfdCBhcmcgKSAgICB7IGk7IF9fa21wc19zZXRfc3RhY2tzaXplKCBhcmcgKTsgfQordm9pZCBrbXBfc2V0X2Jsb2NrdGltZSggb21wX2ludF90IGFyZyApICAgeyBpOyBfX2ttcHNfc2V0X2Jsb2NrdGltZSggYXJnICk7IH0KK3ZvaWQga21wX3NldF9saWJyYXJ5KCBvbXBfaW50X3QgYXJnICkgICAgIHsgaTsgX19rbXBzX3NldF9saWJyYXJ5KCBhcmcgKTsgfQordm9pZCBrbXBfc2V0X2RlZmF1bHRzKCBjaGFyIGNvbnN0ICogc3RyICkgeyBpOyB9CisKKy8qIEtNUCBtZW1vcnkgbWFuYWdlbWVudCBmdW5jdGlvbnMuICovCit2b2lkICoga21wX21hbGxvYyggc2l6ZV90IHNpemUgKSAgICAgICAgICAgICAgICAgeyBpOyByZXR1cm4gbWFsbG9jKCBzaXplICk7IH0KK3ZvaWQgKiBrbXBfY2FsbG9jKCBzaXplX3QgbmVsZW0sIHNpemVfdCBlbHNpemUgKSB7IGk7IHJldHVybiBjYWxsb2MoIG5lbGVtLCBlbHNpemUgKTsgfQordm9pZCAqIGttcF9yZWFsbG9jKCB2b2lkICpwdHIsIHNpemVfdCBzaXplICkgICAgIHsgaTsgcmV0dXJuIHJlYWxsb2MoIHB0ciwgc2l6ZSApOyB9Cit2b2lkICAga21wX2ZyZWUoIHZvaWQgKiBwdHIgKSAgICAgICAgICAgICAgICAgICAgeyBpOyBmcmVlKCBwdHIgKTsgfQorCitzdGF0aWMgaW50IF9fa21wc19ibG9ja3RpbWUgPSBJTlRfTUFYOworCit2b2lkIF9fa21wc19zZXRfYmxvY2t0aW1lKCBpbnQgYXJnICkgeworICAgIGk7CisgICAgX19rbXBzX2Jsb2NrdGltZSA9IGFyZzsKK30gLy8gX19rbXBzX3NldF9ibG9ja3RpbWUKKworaW50IF9fa21wc19nZXRfYmxvY2t0aW1lKCB2b2lkICkgeworICAgIGk7CisgICAgcmV0dXJuIF9fa21wc19ibG9ja3RpbWU7Cit9IC8vIF9fa21wc19nZXRfYmxvY2t0aW1lCisKK3N0YXRpYyBpbnQgX19rbXBzX2R5bmFtaWMgPSAwOworCit2b2lkIF9fa21wc19zZXRfZHluYW1pYyggaW50IGFyZyApIHsKKyAgICBpOworICAgIF9fa21wc19keW5hbWljID0gYXJnOworfSAvLyBfX2ttcHNfc2V0X2R5bmFtaWMKKworaW50IF9fa21wc19nZXRfZHluYW1pYyggdm9pZCApIHsKKyAgICBpOworICAgIHJldHVybiBfX2ttcHNfZHluYW1pYzsKK30gLy8gX19rbXBzX2dldF9keW5hbWljCisKK3N0YXRpYyBpbnQgX19rbXBzX2xpYnJhcnkgPSAxMDAwOworCit2b2lkIF9fa21wc19zZXRfbGlicmFyeSggaW50IGFyZyApIHsKKyAgICBpOworICAgIF9fa21wc19saWJyYXJ5ID0gYXJnOworfSAvLyBfX2ttcHNfc2V0X2xpYnJhcnkKKworaW50IF9fa21wc19nZXRfbGlicmFyeSggdm9pZCApIHsKKyAgICBpOworICAgIHJldHVybiBfX2ttcHNfbGlicmFyeTsKK30gLy8gX19rbXBzX2dldF9saWJyYXJ5CisKK3N0YXRpYyBpbnQgX19rbXBzX25lc3RlZCA9IDA7CisKK3ZvaWQgX19rbXBzX3NldF9uZXN0ZWQoIGludCBhcmcgKSB7CisgICAgaTsKKyAgICBfX2ttcHNfbmVzdGVkID0gYXJnOworfSAvLyBfX2ttcHNfc2V0X25lc3RlZAorCitpbnQgX19rbXBzX2dldF9uZXN0ZWQoIHZvaWQgKSB7CisgICAgaTsKKyAgICByZXR1cm4gX19rbXBzX25lc3RlZDsKK30gLy8gX19rbXBzX2dldF9uZXN0ZWQKKworc3RhdGljIHNpemVfdCBfX2ttcHNfc3RhY2tzaXplID0gS01QX0RFRkFVTFRfU1RLU0laRTsKKwordm9pZCBfX2ttcHNfc2V0X3N0YWNrc2l6ZSggaW50IGFyZyApIHsKKyAgICBpOworICAgIF9fa21wc19zdGFja3NpemUgPSBhcmc7Cit9IC8vIF9fa21wc19zZXRfc3RhY2tzaXplCisKK2ludCBfX2ttcHNfZ2V0X3N0YWNrc2l6ZSggdm9pZCApIHsKKyAgICBpOworICAgIHJldHVybiBfX2ttcHNfc3RhY2tzaXplOworfSAvLyBfX2ttcHNfZ2V0X3N0YWNrc2l6ZQorCitzdGF0aWMga21wX3NjaGVkX3QgX19rbXBzX3NjaGVkX2tpbmQgICAgID0ga21wX3NjaGVkX2RlZmF1bHQ7CitzdGF0aWMgaW50ICAgICAgICAgX19rbXBzX3NjaGVkX21vZGlmaWVyID0gMDsKKworICAgIHZvaWQgX19rbXBzX3NldF9zY2hlZHVsZSgga21wX3NjaGVkX3Qga2luZCwgaW50IG1vZGlmaWVyICkgeworICAgICAgICBpOworICAgICAgICBfX2ttcHNfc2NoZWRfa2luZCAgICAgPSBraW5kOworICAgICAgICBfX2ttcHNfc2NoZWRfbW9kaWZpZXIgPSBtb2RpZmllcjsKKyAgICB9IC8vIF9fa21wc19zZXRfc2NoZWR1bGUKKworICAgIHZvaWQgX19rbXBzX2dldF9zY2hlZHVsZSgga21wX3NjaGVkX3QgKmtpbmQsIGludCAqbW9kaWZpZXIgKSB7CisgICAgICAgIGk7CisgICAgICAgICpraW5kICAgICA9IF9fa21wc19zY2hlZF9raW5kOworICAgICAgICAqbW9kaWZpZXIgPSBfX2ttcHNfc2NoZWRfbW9kaWZpZXI7CisgICAgfSAvLyBfX2ttcHNfZ2V0X3NjaGVkdWxlCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorCitzdGF0aWMga21wX3Byb2NfYmluZF90IF9fa21wc19wcm9jX2JpbmQgPSBwcm9jX2JpbmRfZmFsc2U7CisKK3ZvaWQgX19rbXBzX3NldF9wcm9jX2JpbmQoIGttcF9wcm9jX2JpbmRfdCBhcmcgKSB7CisgICAgaTsKKyAgICBfX2ttcHNfcHJvY19iaW5kID0gYXJnOworfSAvLyBfX2ttcHNfc2V0X3Byb2NfYmluZAorCitrbXBfcHJvY19iaW5kX3QgX19rbXBzX2dldF9wcm9jX2JpbmQoIHZvaWQgKSB7CisgICAgaTsKKyAgICByZXR1cm4gX19rbXBzX3Byb2NfYmluZDsKK30gLy8gX19rbXBzX2dldF9wcm9jX2JpbmQKKworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKK2RvdWJsZSBfX2ttcHNfZ2V0X3d0aW1lKCB2b2lkICkgeworICAgIC8vIEVsYXBzZWQgd2FsbCBjbG9jayB0aW1lIChpbiBzZWNvbmQpIGZyb20gInNvbWV0aW1lIGluIHRoZSBwYXN0Ii4KKyAgICBkb3VibGUgd3RpbWUgPSAwLjA7CisgICAgaTsKKyAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgaWYgKCBmcmVxdWVuY3kgPiAwLjAgKSB7CisgICAgICAgICAgICBMQVJHRV9JTlRFR0VSIG5vdzsKKyAgICAgICAgICAgIEJPT0wgc3RhdHVzID0gUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoICYgbm93ICk7CisgICAgICAgICAgICBpZiAoIHN0YXR1cyApIHsKKyAgICAgICAgICAgICAgICB3dGltZSA9IGRvdWJsZSggbm93LlF1YWRQYXJ0ICkgLyBmcmVxdWVuY3k7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9OyAvLyBpZgorICAgICNlbHNlCisgICAgICAgIC8vIGdldHRpbWVvZmRheSgpIHJldHVybnMgc2Vjb25kcyBhbmQgbWljcm9zZWNvbmRzIHNpbmNlIHRoZSBFcG9jaC4KKyAgICAgICAgc3RydWN0IHRpbWV2YWwgIHR2YWw7CisgICAgICAgIGludCAgICAgICAgICAgICByYzsKKyAgICAgICAgcmMgPSBnZXR0aW1lb2ZkYXkoICYgdHZhbCwgTlVMTCApOworICAgICAgICBpZiAoIHJjID09IDAgKSB7CisgICAgICAgICAgICB3dGltZSA9IChkb3VibGUpKCB0dmFsLnR2X3NlYyApICsgMS4wRS0wNiAqIChkb3VibGUpKCB0dmFsLnR2X3VzZWMgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRPRE86IEFzc2VydCBvciBhYm9ydCBoZXJlLgorICAgICAgICB9OyAvLyBpZgorICAgICNlbmRpZgorICAgIHJldHVybiB3dGltZTsKK307IC8vIF9fa21wc19nZXRfd3RpbWUKKworZG91YmxlIF9fa21wc19nZXRfd3RpY2soIHZvaWQgKSB7CisgICAgLy8gTnVtYmVyIG9mIHNlY29uZHMgYmV0d2VlbiBzdWNjZXNzaXZlIGNsb2NrIHRpY2tzLgorICAgIGRvdWJsZSB3dGljayA9IDAuMDsKKyAgICBpOworICAgICNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICB7CisgICAgICAgICAgICBEV09SRCBpbmNyZW1lbnQ7CisgICAgICAgICAgICBEV09SRCBhZGp1c3RtZW50OworICAgICAgICAgICAgQk9PTCAgZGlzYWJsZWQ7CisgICAgICAgICAgICBCT09MICByYzsKKyAgICAgICAgICAgIHJjID0gR2V0U3lzdGVtVGltZUFkanVzdG1lbnQoICYgYWRqdXN0bWVudCwgJiBpbmNyZW1lbnQsICYgZGlzYWJsZWQgKTsKKyAgICAgICAgICAgIGlmICggcmMgKSB7CisgICAgICAgICAgICAgICAgd3RpY2sgPSAxLjBFLTA3ICogKGRvdWJsZSkoIGRpc2FibGVkID8gaW5jcmVtZW50IDogYWRqdXN0bWVudCApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBBc3NlcnQgb3IgYWJvcnQgaGVyZS4KKyAgICAgICAgICAgICAgICB3dGljayA9IDEuMEUtMDM7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9CisgICAgI2Vsc2UKKyAgICAgICAgLy8gVE9ETzogZ2V0dGltZW9mZGF5KCkgcmV0dXJucyBpbiBtaWNyb3NlY29uZHMsIGJ1dCB3aGF0IHRoZSBwcmVjaXNpb24/CisgICAgICAgIHd0aWNrID0gMS4wRS0wNjsKKyAgICAjZW5kaWYKKyAgICByZXR1cm4gd3RpY2s7Cit9OyAvLyBfX2ttcHNfZ2V0X3d0aWNrCisKKy8vIGVuZCBvZiBmaWxlIC8vCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zdHViLmggYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfc3R1Yi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkY2ZmYTMKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfc3R1Yi5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBrbXBfc3R1Yi5oCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX1NUVUJfSAorI2RlZmluZSBLTVBfU1RVQl9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIGV4dGVybiAiQyIgeworI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKK3ZvaWQgX19rbXBzX3NldF9ibG9ja3RpbWUoIGludCBhcmcgKTsKK2ludCAgX19rbXBzX2dldF9ibG9ja3RpbWUoIHZvaWQgKTsKK3ZvaWQgX19rbXBzX3NldF9keW5hbWljKCBpbnQgYXJnICk7CitpbnQgIF9fa21wc19nZXRfZHluYW1pYyggdm9pZCApOwordm9pZCBfX2ttcHNfc2V0X2xpYnJhcnkoIGludCBhcmcgKTsKK2ludCAgX19rbXBzX2dldF9saWJyYXJ5KCB2b2lkICk7Cit2b2lkIF9fa21wc19zZXRfbmVzdGVkKCBpbnQgYXJnICk7CitpbnQgIF9fa21wc19nZXRfbmVzdGVkKCB2b2lkICk7Cit2b2lkIF9fa21wc19zZXRfc3RhY2tzaXplKCBpbnQgYXJnICk7CitpbnQgIF9fa21wc19nZXRfc3RhY2tzaXplKCk7CisKKyNpZm5kZWYgS01QX1NDSEVEX1RZUEVfREVGSU5FRAorI2RlZmluZSBLTVBfU0NIRURfVFlQRV9ERUZJTkVECit0eXBlZGVmIGVudW0ga21wX3NjaGVkIHsKKyAgICBrbXBfc2NoZWRfc3RhdGljICAgICAgICAgICAgPSAxLCAvLyBtYXBwZWQgdG8ga21wX3NjaF9zdGF0aWNfY2h1bmtlZCAgICAgICAgICAgKDMzKQorICAgIGttcF9zY2hlZF9keW5hbWljICAgICAgICAgICA9IDIsIC8vIG1hcHBlZCB0byBrbXBfc2NoX2R5bmFtaWNfY2h1bmtlZCAgICAgICAgICAoMzUpCisgICAga21wX3NjaGVkX2d1aWRlZCAgICAgICAgICAgID0gMywgLy8gbWFwcGVkIHRvIGttcF9zY2hfZ3VpZGVkX2NodW5rZWQgICAgICAgICAgICgzNikKKyAgICBrbXBfc2NoZWRfYXV0byAgICAgICAgICAgICAgPSA0LCAvLyBtYXBwZWQgdG8ga21wX3NjaF9hdXRvICAgICAgICAgICAgICAgICAgICAgKDM4KQorICAgIGttcF9zY2hlZF9kZWZhdWx0ID0ga21wX3NjaGVkX3N0YXRpYyAgIC8vIGRlZmF1bHQgc2NoZWR1bGluZworfSBrbXBfc2NoZWRfdDsKKyNlbmRpZgordm9pZCBfX2ttcHNfc2V0X3NjaGVkdWxlKCBrbXBfc2NoZWRfdCBraW5kLCBpbnQgbW9kaWZpZXIgKTsKK3ZvaWQgX19rbXBzX2dldF9zY2hlZHVsZSgga21wX3NjaGVkX3QgKmtpbmQsIGludCAqbW9kaWZpZXIgKTsKKworI2lmIE9NUF80MF9FTkFCTEVECit2b2lkIF9fa21wc19zZXRfcHJvY19iaW5kKCBrbXBfcHJvY19iaW5kX3QgYXJnICk7CitrbXBfcHJvY19iaW5kX3QgX19rbXBzX2dldF9wcm9jX2JpbmQoIHZvaWQgKTsKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCitkb3VibGUgX19rbXBzX2dldF93dGltZSgpOworZG91YmxlIF9fa21wc19nZXRfd3RpY2soKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgfSAvLyBleHRlcm4gIkMiCisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworI2VuZGlmIC8vIEtNUF9TVFVCX0gKKworLy8gZW5kIG9mIGZpbGUgLy8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF90YXNrZGVwcy5jcHAgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfdGFza2RlcHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMDg1Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfdGFza2RlcHMuY3BwCkBAIC0wLDAgKzEsNTEzIEBACisvKgorICoga21wX3Rhc2tkZXBzLmNwcAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisvLyNkZWZpbmUgS01QX1NVUFBPUlRfR1JBUEhfT1VUUFVUIDEKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9pby5oIgorI2luY2x1ZGUgImttcF93YWl0X3JlbGVhc2UuaCIKKworI2lmIE9NUF80MF9FTkFCTEVECisKKy8vVE9ETzogSW1wcm92ZSBtZW1vcnkgYWxsb2NhdGlvbj8ga2VlcCBhIGxpc3Qgb2YgcHJlLWFsbG9jYXRlZCBzdHJ1Y3R1cmVzPyBhbGxvY2F0ZSBpbiBibG9ja3M/IHJlLXVzZSBsaXN0IGZpbmlzaGVkIGxpc3QgZW50cmllcz8KKy8vVE9ETzogZG9uJ3QgdXNlIGF0b21pYyByZWYgY291bnRlcnMgZm9yIHN0YWNrLWFsbG9jYXRlZCBub2Rlcy4KKy8vVE9ETzogZmluZCBhbiBhbHRlcm5hdGUgdG8gYXRvbWljIHJlZnMgZm9yIGhlYXAtYWxsb2NhdGVkIG5vZGVzPworLy9UT0RPOiBGaW5pc2ggZ3JhcGggb3V0cHV0IHN1cHBvcnQKKy8vVE9ETzoga21wX2xvY2tfdCBzZWVtcyBhIHRhZCB0byBiaWcgKGFuZCBoZWF2eSB3ZWlnaHQpIGZvciB0aGlzLiBDaGVjayBvdGhlciBydW50aW1lIGxvY2tzCisvL1RPRE86IEFueSBJVFQgc3VwcG9ydCBuZWVkZWQ/CisKKyNpZmRlZiBLTVBfU1VQUE9SVF9HUkFQSF9PVVRQVVQKK3N0YXRpYyBrbXBfaW50MzIga21wX25vZGVfaWRfc2VlZCA9IDA7CisjZW5kaWYKKworc3RhdGljIHZvaWQKK19fa21wX2luaXRfbm9kZSAoIGttcF9kZXBub2RlX3QgKm5vZGUgKQoreworICAgIG5vZGUtPmRuLnRhc2sgPSBOVUxMOyAvLyBzZXQgdG8gbnVsbCBpbml0aWFsbHksIGl0IHdpbGwgcG9pbnQgdG8gdGhlIHJpZ2h0IHRhc2sgb25jZSBkZXBlbmRlbmNlcyBoYXZlIGJlZW4gcHJvY2Vzc2VkCisgICAgbm9kZS0+ZG4uc3VjY2Vzc29ycyA9IE5VTEw7CisgICAgX19rbXBfaW5pdF9sb2NrKCZub2RlLT5kbi5sb2NrKTsKKyAgICBub2RlLT5kbi5ucmVmcyA9IDE7IC8vIGluaXQgY3JlYXRlcyB0aGUgZmlyc3QgcmVmZXJlbmNlIHRvIHRoZSBub2RlCisjaWZkZWYgS01QX1NVUFBPUlRfR1JBUEhfT1VUUFVUCisgICAgbm9kZS0+ZG4uaWQgPSBLTVBfVEVTVF9USEVOX0lOQzMyKCZrbXBfbm9kZV9pZF9zZWVkKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIGttcF9kZXBub2RlX3QgKgorX19rbXBfbm9kZV9yZWYgKCBrbXBfZGVwbm9kZV90ICpub2RlICkKK3sKKyAgICBLTVBfVEVTVF9USEVOX0lOQzMyKCZub2RlLT5kbi5ucmVmcyk7CisgICAgcmV0dXJuIG5vZGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfbm9kZV9kZXJlZiAoIGttcF9pbmZvX3QgKnRocmVhZCwga21wX2RlcG5vZGVfdCAqbm9kZSApCit7CisgICAgaWYgKCFub2RlKSByZXR1cm47CisKKyAgICBrbXBfaW50MzIgbiA9IEtNUF9URVNUX1RIRU5fREVDMzIoJm5vZGUtPmRuLm5yZWZzKSAtIDE7CisgICAgaWYgKCBuID09IDAgKSB7CisgICAgICAgIEtNUF9BU1NFUlQobm9kZS0+ZG4ubnJlZnMgPT0gMCk7CisjaWYgVVNFX0ZBU1RfTUVNT1JZCisgICAgICAgIF9fa21wX2Zhc3RfZnJlZSh0aHJlYWQsbm9kZSk7CisjZWxzZQorICAgICAgICBfX2ttcF90aHJlYWRfZnJlZSh0aHJlYWQsbm9kZSk7CisjZW5kaWYKKyAgICB9Cit9CisKKyNkZWZpbmUgS01QX0FDUVVJUkVfREVQTk9ERShndGlkLG4pIF9fa21wX2FjcXVpcmVfbG9jaygmKG4pLT5kbi5sb2NrLChndGlkKSkKKyNkZWZpbmUgS01QX1JFTEVBU0VfREVQTk9ERShndGlkLG4pIF9fa21wX3JlbGVhc2VfbG9jaygmKG4pLT5kbi5sb2NrLChndGlkKSkKKworc3RhdGljIHZvaWQKK19fa21wX2RlcG5vZGVfbGlzdF9mcmVlICgga21wX2luZm9fdCAqdGhyZWFkLCBrbXBfZGVwbm9kZV9saXN0ICpsaXN0ICk7CisKK3N0YXRpYyBjb25zdCBrbXBfaW50MzIga21wX2RlcGhhc2hfbG9nMiA9IDY7CitzdGF0aWMgY29uc3Qga21wX2ludDMyIGttcF9kZXBoYXNoX3NpemUgPSAoMSA8PCBrbXBfZGVwaGFzaF9sb2cyKTsKKworc3RhdGljIGlubGluZSBrbXBfaW50MzIKK19fa21wX2RlcGhhc2hfaGFzaCAoIGttcF9pbnRwdHJfdCBhZGRyICkKK3sKKyAgICAvL1RPRE8gYWx0ZXJuYXRlIHRvIHRyeTogc2V0ID0gKCgoQWRkcjY0KShhZGRyVXNlZnVsQml0cyAqIDkuNjE4KSkgJSBtX251bV9zZXRzICk7CisgICAgcmV0dXJuICgoYWRkciA+PiBrbXBfZGVwaGFzaF9sb2cyKSBeIGFkZHIpICUga21wX2RlcGhhc2hfc2l6ZTsKK30KKworc3RhdGljIGttcF9kZXBoYXNoX3QgKgorX19rbXBfZGVwaGFzaF9jcmVhdGUgKCBrbXBfaW5mb190ICp0aHJlYWQgKQoreworICAgIGttcF9kZXBoYXNoX3QgKmg7CisKKyAgICBrbXBfaW50MzIgc2l6ZSA9IGttcF9kZXBoYXNoX3NpemUgKiBzaXplb2Yoa21wX2RlcGhhc2hfZW50cnlfdCkgKyBzaXplb2Yoa21wX2RlcGhhc2hfdCk7CisKKyNpZiBVU0VfRkFTVF9NRU1PUlkKKyAgICBoID0gKGttcF9kZXBoYXNoX3QgKikgX19rbXBfZmFzdF9hbGxvY2F0ZSggdGhyZWFkLCBzaXplICk7CisjZWxzZQorICAgIGggPSAoa21wX2RlcGhhc2hfdCAqKSBfX2ttcF90aHJlYWRfbWFsbG9jKCB0aHJlYWQsIHNpemUgKTsKKyNlbmRpZgorCisjaWZkZWYgS01QX0RFQlVHCisgICAgaC0+bmVsZW1lbnRzID0gMDsKKyNlbmRpZgorICAgIGgtPmJ1Y2tldHMgPSAoa21wX2RlcGhhc2hfZW50cnkgKiopKGgrMSk7CisKKyAgICBmb3IgKCBrbXBfaW50MzIgaSA9IDA7IGkgPCBrbXBfZGVwaGFzaF9zaXplOyBpKysgKQorICAgICAgICBoLT5idWNrZXRzW2ldID0gMDsKKworICAgIHJldHVybiBoOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZGVwaGFzaF9mcmVlICgga21wX2luZm9fdCAqdGhyZWFkLCBrbXBfZGVwaGFzaF90ICpoICkKK3sKKyAgICBmb3IgKCBrbXBfaW50MzIgaT0wOyBpIDwga21wX2RlcGhhc2hfc2l6ZTsgaSsrICkgeworICAgICAgICBpZiAoIGgtPmJ1Y2tldHNbaV0gKSB7CisgICAgICAgICAgICBrbXBfZGVwaGFzaF9lbnRyeV90ICpuZXh0OworICAgICAgICAgICAgZm9yICgga21wX2RlcGhhc2hfZW50cnlfdCAqZW50cnkgPSBoLT5idWNrZXRzW2ldOyBlbnRyeTsgZW50cnkgPSBuZXh0ICkgeworICAgICAgICAgICAgICAgIG5leHQgPSBlbnRyeS0+bmV4dF9pbl9idWNrZXQ7CisgICAgICAgICAgICAgICAgX19rbXBfZGVwbm9kZV9saXN0X2ZyZWUodGhyZWFkLGVudHJ5LT5sYXN0X2lucyk7CisgICAgICAgICAgICAgICAgX19rbXBfbm9kZV9kZXJlZih0aHJlYWQsZW50cnktPmxhc3Rfb3V0KTsKKyNpZiBVU0VfRkFTVF9NRU1PUlkKKyAgICAgICAgICAgICAgICBfX2ttcF9mYXN0X2ZyZWUodGhyZWFkLGVudHJ5KTsKKyNlbHNlCisgICAgICAgICAgICAgICAgX19rbXBfdGhyZWFkX2ZyZWUodGhyZWFkLGVudHJ5KTsKKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorI2lmIFVTRV9GQVNUX01FTU9SWQorICAgIF9fa21wX2Zhc3RfZnJlZSh0aHJlYWQsaCk7CisjZWxzZQorICAgIF9fa21wX3RocmVhZF9mcmVlKHRocmVhZCxoKTsKKyNlbmRpZgorfQorCitzdGF0aWMga21wX2RlcGhhc2hfZW50cnkgKgorX19rbXBfZGVwaGFzaF9maW5kICgga21wX2luZm9fdCAqdGhyZWFkLCBrbXBfZGVwaGFzaF90ICpoLCBrbXBfaW50cHRyX3QgYWRkciApCit7CisgICAga21wX2ludDMyIGJ1Y2tldCA9IF9fa21wX2RlcGhhc2hfaGFzaChhZGRyKTsKKworICAgIGttcF9kZXBoYXNoX2VudHJ5X3QgKmVudHJ5OworICAgIGZvciAoIGVudHJ5ID0gaC0+YnVja2V0c1tidWNrZXRdOyBlbnRyeTsgZW50cnkgPSBlbnRyeS0+bmV4dF9pbl9idWNrZXQgKQorICAgICAgICBpZiAoIGVudHJ5LT5hZGRyID09IGFkZHIgKSBicmVhazsKKworICAgIGlmICggZW50cnkgPT0gTlVMTCApIHsKKyAgICAgICAgLy8gY3JlYXRlIGVudHJ5LiBUaGlzIGlzIG9ubHkgZG9uZSBieSBvbmUgdGhyZWFkIHNvIG5vIGxvY2tpbmcgcmVxdWlyZWQKKyNpZiBVU0VfRkFTVF9NRU1PUlkKKyAgICAgICAgZW50cnkgPSAoa21wX2RlcGhhc2hfZW50cnlfdCAqKSBfX2ttcF9mYXN0X2FsbG9jYXRlKCB0aHJlYWQsIHNpemVvZihrbXBfZGVwaGFzaF9lbnRyeV90KSApOworI2Vsc2UKKyAgICAgICAgZW50cnkgPSAoa21wX2RlcGhhc2hfZW50cnlfdCAqKSBfX2ttcF90aHJlYWRfbWFsbG9jKCB0aHJlYWQsIHNpemVvZihrbXBfZGVwaGFzaF9lbnRyeV90KSApOworI2VuZGlmCisgICAgICAgIGVudHJ5LT5hZGRyID0gYWRkcjsKKyAgICAgICAgZW50cnktPmxhc3Rfb3V0ID0gTlVMTDsKKyAgICAgICAgZW50cnktPmxhc3RfaW5zID0gTlVMTDsKKyAgICAgICAgZW50cnktPm5leHRfaW5fYnVja2V0ID0gaC0+YnVja2V0c1tidWNrZXRdOworICAgICAgICBoLT5idWNrZXRzW2J1Y2tldF0gPSBlbnRyeTsKKyNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgaC0+bmVsZW1lbnRzKys7CisgICAgICAgIGlmICggZW50cnktPm5leHRfaW5fYnVja2V0ICkgaC0+bmNvbmZsaWN0cysrOworI2VuZGlmCisgICAgfQorICAgIHJldHVybiBlbnRyeTsKK30KKworc3RhdGljIGttcF9kZXBub2RlX2xpc3RfdCAqCitfX2ttcF9hZGRfbm9kZSAoIGttcF9pbmZvX3QgKnRocmVhZCwga21wX2RlcG5vZGVfbGlzdF90ICpsaXN0LCBrbXBfZGVwbm9kZV90ICpub2RlICkKK3sKKyAgICBrbXBfZGVwbm9kZV9saXN0X3QgKm5ld19oZWFkOworCisjaWYgVVNFX0ZBU1RfTUVNT1JZCisgICAgbmV3X2hlYWQgPSAoa21wX2RlcG5vZGVfbGlzdF90ICopIF9fa21wX2Zhc3RfYWxsb2NhdGUodGhyZWFkLHNpemVvZihrbXBfZGVwbm9kZV9saXN0X3QpKTsKKyNlbHNlCisgICAgbmV3X2hlYWQgPSAoa21wX2RlcG5vZGVfbGlzdF90ICopIF9fa21wX3RocmVhZF9tYWxsb2ModGhyZWFkLHNpemVvZihrbXBfZGVwbm9kZV9saXN0X3QpKTsKKyNlbmRpZgorCisgICAgbmV3X2hlYWQtPm5vZGUgPSBfX2ttcF9ub2RlX3JlZihub2RlKTsKKyAgICBuZXdfaGVhZC0+bmV4dCA9IGxpc3Q7CisKKyAgICByZXR1cm4gbmV3X2hlYWQ7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9kZXBub2RlX2xpc3RfZnJlZSAoIGttcF9pbmZvX3QgKnRocmVhZCwga21wX2RlcG5vZGVfbGlzdCAqbGlzdCApCit7CisgICAga21wX2RlcG5vZGVfbGlzdCAqbmV4dDsKKworICAgIGZvciAoIDsgbGlzdCA7IGxpc3QgPSBuZXh0ICkgeworICAgICAgICBuZXh0ID0gbGlzdC0+bmV4dDsKKworICAgICAgICBfX2ttcF9ub2RlX2RlcmVmKHRocmVhZCxsaXN0LT5ub2RlKTsKKyNpZiBVU0VfRkFTVF9NRU1PUlkKKyAgICAgICAgX19rbXBfZmFzdF9mcmVlKHRocmVhZCxsaXN0KTsKKyNlbHNlCisgICAgICAgIF9fa21wX3RocmVhZF9mcmVlKHRocmVhZCxsaXN0KTsKKyNlbmRpZgorICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF90cmFja19kZXBlbmRlbmNlICgga21wX2RlcG5vZGVfdCAqc291cmNlLCBrbXBfZGVwbm9kZV90ICpzaW5rICkKK3sKKyNpZmRlZiBLTVBfU1VQUE9SVF9HUkFQSF9PVVRQVVQKKyAgICBrbXBfdGFza2RhdGFfdCAqIHRhc2tfc291cmNlID0gS01QX1RBU0tfVE9fVEFTS0RBVEEoc291cmNlLT5kbi50YXNrKTsKKyAgICBrbXBfdGFza2RhdGFfdCAqIHRhc2tfc2luayA9IEtNUF9UQVNLX1RPX1RBU0tEQVRBKHNpbmstPmRuLnRhc2spOyAgICAvLyB0aGlzIGNhbiBiZSBOVUxMIHdoZW4gaWYoMCkgLi4uCisKKyAgICBfX2ttcF9wcmludGYoIiVkKCVzKSAtPiAlZCglcylcbiIsIHNvdXJjZS0+ZG4uaWQsIHRhc2tfc291cmNlLT50ZF9pZGVudC0+cHNvdXJjZSwgc2luay0+ZG4uaWQsIHRhc2tfc2luay0+dGRfaWRlbnQtPnBzb3VyY2UpOworI2VuZGlmCit9CisKK3RlbXBsYXRlPCBib29sIGZpbHRlciA+CitzdGF0aWMgaW5saW5lIGttcF9pbnQzMgorX19rbXBfcHJvY2Vzc19kZXBzICgga21wX2ludDMyIGd0aWQsIGttcF9kZXBub2RlX3QgKm5vZGUsIGttcF9kZXBoYXNoX3QgKmhhc2gsCisgICAgICAgICAgICAgICAgICAgICBib29sIGRlcF9iYXJyaWVyLGttcF9pbnQzMiBuZGVwcywga21wX2RlcGVuZF9pbmZvX3QgKmRlcF9saXN0KQoreworICAgIEtBX1RSQUNFKDMwLCAoIl9fa21wX3Byb2Nlc3NfZGVwczwlZD46IFQjJWQgcHJvY2Vzc2luZyAlZCBkZXBlbmNpZXMgOiBkZXBfYmFycmllciA9ICVkXG4iLCBmaWx0ZXIsIGd0aWQsIG5kZXBzLCBkZXBfYmFycmllciApICk7CisgICAgCisgICAga21wX2luZm9fdCAqdGhyZWFkID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIGttcF9pbnQzMiBucHJlZGVjZXNzb3JzPTA7CisgICAgZm9yICgga21wX2ludDMyIGkgPSAwOyBpIDwgbmRlcHMgOyBpKysgKSB7CisgICAgICAgIGNvbnN0IGttcF9kZXBlbmRfaW5mb190ICogZGVwID0gJmRlcF9saXN0W2ldOworCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoZGVwLT5mbGFncy5pbik7CisKKyAgICAgICAgaWYgKCBmaWx0ZXIgJiYgZGVwLT5iYXNlX2FkZHIgPT0gMCApIGNvbnRpbnVlOyAvLyBza2lwIGZpbHRlcmVkIGVudHJpZXMKKworICAgICAgICBrbXBfZGVwaGFzaF9lbnRyeV90ICppbmZvID0gX19rbXBfZGVwaGFzaF9maW5kKHRocmVhZCxoYXNoLGRlcC0+YmFzZV9hZGRyKTsKKyAgICAgICAga21wX2RlcG5vZGVfdCAqbGFzdF9vdXQgPSBpbmZvLT5sYXN0X291dDsKKworICAgICAgICBpZiAoIGRlcC0+ZmxhZ3Mub3V0ICYmIGluZm8tPmxhc3RfaW5zICkgeworICAgICAgICAgICAgZm9yICgga21wX2RlcG5vZGVfbGlzdF90ICogcCA9IGluZm8tPmxhc3RfaW5zOyBwOyBwID0gcC0+bmV4dCApIHsKKyAgICAgICAgICAgICAgICBrbXBfZGVwbm9kZV90ICogaW5kZXAgPSBwLT5ub2RlOworICAgICAgICAgICAgICAgIGlmICggaW5kZXAtPmRuLnRhc2sgKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9BQ1FVSVJFX0RFUE5PREUoZ3RpZCxpbmRlcCk7CisgICAgICAgICAgICAgICAgICAgIGlmICggaW5kZXAtPmRuLnRhc2sgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF90cmFja19kZXBlbmRlbmNlKGluZGVwLG5vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXAtPmRuLnN1Y2Nlc3NvcnMgPSBfX2ttcF9hZGRfbm9kZSh0aHJlYWQsIGluZGVwLT5kbi5zdWNjZXNzb3JzLCBub2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtBX1RSQUNFKDQwLCgiX19rbXBfcHJvY2Vzc19kZXBzPCVkPjogVCMlZCBhZGRpbmcgZGVwZW5kZW5jZSBmcm9tICVwIHRvICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLGd0aWQsIEtNUF9UQVNLX1RPX1RBU0tEQVRBKGluZGVwLT5kbi50YXNrKSwgS01QX1RBU0tfVE9fVEFTS0RBVEEobm9kZS0+ZG4udGFzaykpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5wcmVkZWNlc3NvcnMrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBLTVBfUkVMRUFTRV9ERVBOT0RFKGd0aWQsaW5kZXApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX19rbXBfZGVwbm9kZV9saXN0X2ZyZWUodGhyZWFkLGluZm8tPmxhc3RfaW5zKTsKKyAgICAgICAgICAgIGluZm8tPmxhc3RfaW5zID0gTlVMTDsKKworICAgICAgICB9IGVsc2UgaWYgKCBsYXN0X291dCAmJiBsYXN0X291dC0+ZG4udGFzayApIHsKKyAgICAgICAgICAgIEtNUF9BQ1FVSVJFX0RFUE5PREUoZ3RpZCxsYXN0X291dCk7CisgICAgICAgICAgICBpZiAoIGxhc3Rfb3V0LT5kbi50YXNrICkgeworICAgICAgICAgICAgICAgIF9fa21wX3RyYWNrX2RlcGVuZGVuY2UobGFzdF9vdXQsbm9kZSk7CisgICAgICAgICAgICAgICAgbGFzdF9vdXQtPmRuLnN1Y2Nlc3NvcnMgPSBfX2ttcF9hZGRfbm9kZSh0aHJlYWQsIGxhc3Rfb3V0LT5kbi5zdWNjZXNzb3JzLCBub2RlKTsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSg0MCwoIl9fa21wX3Byb2Nlc3NfZGVwczwlZD46IFQjJWQgYWRkaW5nIGRlcGVuZGVuY2UgZnJvbSAlcCB0byAlcFxuIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcixndGlkLCBLTVBfVEFTS19UT19UQVNLREFUQShsYXN0X291dC0+ZG4udGFzayksIEtNUF9UQVNLX1RPX1RBU0tEQVRBKG5vZGUtPmRuLnRhc2spKSk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbnByZWRlY2Vzc29ycysrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgS01QX1JFTEVBU0VfREVQTk9ERShndGlkLGxhc3Rfb3V0KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggZGVwX2JhcnJpZXIgKSB7CisgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGEgc3luYyBwb2ludCBpbiB0aGUgc2VyaWFsIHNlcXVlbmNlLCB0aGVuIHRoZSBwcmV2aW91cyBvdXRwdXRzIGFyZSBndWFyYW50ZWVkIHRvIGJlIGNvbXBsZXRlZCBhZnRlcgorICAgICAgICAgICAgLy8gdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIHRhc2sgc28gdGhlIHByZXZpb3VzIG91dHB1dCBub2RlcyBjYW4gYmUgY2xlYXJlZC4KKyAgICAgICAgICAgIF9fa21wX25vZGVfZGVyZWYodGhyZWFkLGxhc3Rfb3V0KTsKKyAgICAgICAgICAgIGluZm8tPmxhc3Rfb3V0ID0gTlVMTDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICggZGVwLT5mbGFncy5vdXQgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfbm9kZV9kZXJlZih0aHJlYWQsbGFzdF9vdXQpOworICAgICAgICAgICAgICAgIGluZm8tPmxhc3Rfb3V0ID0gX19rbXBfbm9kZV9yZWYobm9kZSk7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBpbmZvLT5sYXN0X2lucyA9IF9fa21wX2FkZF9ub2RlKHRocmVhZCwgaW5mby0+bGFzdF9pbnMsIG5vZGUpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBLQV9UUkFDRSgzMCwgKCJfX2ttcF9wcm9jZXNzX2RlcHM8JWQ+OiBUIyVkIGZvdW5kICVkIHByZWRlY2Vzc29yc1xuIiwgZmlsdGVyLCBndGlkLCBucHJlZGVjZXNzb3JzICkgKTsKKworICAgIHJldHVybiBucHJlZGVjZXNzb3JzOworfQorCisjZGVmaW5lIE5PX0RFUF9CQVJSSUVSIChmYWxzZSkKKyNkZWZpbmUgREVQX0JBUlJJRVIgKHRydWUpCisKKy8vIHJldHVybnMgdHJ1ZSBpZiB0aGUgdGFzayBoYXMgYW55IG91dHN0YW5kaW5nIGRlcGVuZGVuY2UKK3N0YXRpYyBib29sCitfX2ttcF9jaGVja19kZXBzICgga21wX2ludDMyIGd0aWQsIGttcF9kZXBub2RlX3QgKm5vZGUsIGttcF90YXNrX3QgKnRhc2ssIGttcF9kZXBoYXNoX3QgKmhhc2gsIGJvb2wgZGVwX2JhcnJpZXIsCisgICAgICAgICAgICAgICAgICAga21wX2ludDMyIG5kZXBzLCBrbXBfZGVwZW5kX2luZm9fdCAqZGVwX2xpc3QsCisgICAgICAgICAgICAgICAgICAga21wX2ludDMyIG5kZXBzX25vYWxpYXMsIGttcF9kZXBlbmRfaW5mb190ICpub2FsaWFzX2RlcF9saXN0ICkKK3sKKyAgICBpbnQgaTsKKworI2lmIEtNUF9ERUJVRworICAgIGttcF90YXNrZGF0YV90ICogdGFza2RhdGEgPSBLTVBfVEFTS19UT19UQVNLREFUQSh0YXNrKTsKKyNlbmRpZgorICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2NoZWNrX2RlcHM6IFQjJWQgY2hlY2tpbmcgZGVwZW5kZW5jaWVzIGZvciB0YXNrICVwIDogJWQgcG9zc2libHkgYWxpYXNlZCBkZXBlbmRlbmNpZXMsICVkIG5vbi1hbGlhc2VkIGRlcGVkZW5jaWVzIDogZGVwX2JhcnJpZXI9JWQgLlxuIiwgZ3RpZCwgdGFza2RhdGEsIG5kZXBzLCBuZGVwc19ub2FsaWFzLCBkZXBfYmFycmllciApICk7CisKKyAgICAvLyBGaWx0ZXIgZGVwcyBpbiBkZXBfbGlzdAorICAgIC8vIFRPRE86IERpZmZlcmVudCBhbGdvcml0aG0gZm9yIGxhcmdlIGRlcF9saXN0ICggPiAxMCA/ICkKKyAgICBmb3IgKCBpID0gMDsgaSA8IG5kZXBzOyBpICsrICkgeworICAgICAgICBpZiAoIGRlcF9saXN0W2ldLmJhc2VfYWRkciAhPSAwICkKKyAgICAgICAgICAgIGZvciAoIGludCBqID0gaSsxOyBqIDwgbmRlcHM7IGorKyApCisgICAgICAgICAgICAgICAgaWYgKCBkZXBfbGlzdFtpXS5iYXNlX2FkZHIgPT0gZGVwX2xpc3Rbal0uYmFzZV9hZGRyICkgeworICAgICAgICAgICAgICAgICAgICBkZXBfbGlzdFtpXS5mbGFncy5pbiB8PSBkZXBfbGlzdFtqXS5mbGFncy5pbjsKKyAgICAgICAgICAgICAgICAgICAgZGVwX2xpc3RbaV0uZmxhZ3Mub3V0IHw9IGRlcF9saXN0W2pdLmZsYWdzLm91dDsKKyAgICAgICAgICAgICAgICAgICAgZGVwX2xpc3Rbal0uYmFzZV9hZGRyID0gMDsgLy8gTWFyayBqIGVsZW1lbnQgYXMgdm9pZAorICAgICAgICAgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBkb2Vzbid0IG5lZWQgdG8gYmUgYXRvbWljIGFzIG5vIG90aGVyIHRocmVhZCBpcyBnb2luZyB0byBiZSBhY2Nlc3NpbmcgdGhpcyBub2RlIGp1c3QgeWV0CisgICAgLy8gbnByZWRlY2Vzc29ycyBpcyBzZXQgLTEgdG8gZW5zdXJlIHRoYXQgbm9uZSBvZiB0aGUgcmVsZWFzaW5nIHRhc2tzIHF1ZXVlcyB0aGlzIHRhc2sgYmVmb3JlIHdlIGhhdmUgZmluaXNoZWQgcHJvY2Vzc2luZyBhbGwgdGhlIGRlcGVuZGVuY2llcworICAgIG5vZGUtPmRuLm5wcmVkZWNlc3NvcnMgPSAtMTsKKworICAgIC8vIHVzZWQgdG8gcGFjayBhbGwgbnByZWRlY2Vzc29ycyBhZGRpdGlvbnMgaW50byBhIHNpbmdsZSBhdG9taWMgb3BlcmF0aW9uIGF0IHRoZSBlbmQKKyAgICBpbnQgbnByZWRlY2Vzc29yczsKKworICAgIG5wcmVkZWNlc3NvcnMgPSBfX2ttcF9wcm9jZXNzX2RlcHM8dHJ1ZT4oZ3RpZCwgbm9kZSwgaGFzaCwgZGVwX2JhcnJpZXIsIG5kZXBzLCBkZXBfbGlzdCk7CisgICAgbnByZWRlY2Vzc29ycyArPSBfX2ttcF9wcm9jZXNzX2RlcHM8ZmFsc2U+KGd0aWQsIG5vZGUsIGhhc2gsIGRlcF9iYXJyaWVyLCBuZGVwc19ub2FsaWFzLCBub2FsaWFzX2RlcF9saXN0KTsKKworICAgIG5vZGUtPmRuLnRhc2sgPSB0YXNrOworICAgIEtNUF9NQigpOworCisgICAgLy8gQWNjb3VudCBmb3Igb3VyIGluaXRpYWwgZmFrZSB2YWx1ZQorICAgIG5wcmVkZWNlc3NvcnMrKzsKKworICAgIC8vIFVwZGF0ZSBwcmVkZWNlc3NvcnMgYW5kIG9idGFpbiBjdXJyZW50IHZhbHVlIHRvIGNoZWNrIGlmIHRoZXJlIGFyZSBzdGlsbCBhbnkgb3V0c3RhbmRpZyBkZXBlbmRlbmNlcyAoc29tZSB0YXNrcyBtYXkgaGF2ZSBmaW5pc2hlZCB3aGlsZSB3ZSBwcm9jZXNzZWQgdGhlIGRlcGVuZGVuY2VzKQorICAgIG5wcmVkZWNlc3NvcnMgPSBLTVBfVEVTVF9USEVOX0FERDMyKCZub2RlLT5kbi5ucHJlZGVjZXNzb3JzLCBucHJlZGVjZXNzb3JzKSArIG5wcmVkZWNlc3NvcnM7CisKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9jaGVja19kZXBzOiBUIyVkIGZvdW5kICVkIHByZWRlY2Vzc29ycyBmb3IgdGFzayAlcCBcbiIsIGd0aWQsIG5wcmVkZWNlc3NvcnMsIHRhc2tkYXRhICkgKTsKKworICAgIC8vIGJleW9uZCB0aGlzIHBvaW50IHRoZSB0YXNrIGNvdWxkIGJlIHF1ZXVlZCAoYW5kIGV4ZWN1dGVkKSBieSBhIHJlbGVhc2luZyB0YXNrLi4uCisgICAgcmV0dXJuIG5wcmVkZWNlc3NvcnMgPiAwID8gdHJ1ZSA6IGZhbHNlOworfQorCit2b2lkCitfX2ttcF9yZWxlYXNlX2RlcHMgKCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tkYXRhX3QgKnRhc2sgKQoreworICAgIGttcF9pbmZvX3QgKnRocmVhZCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICBrbXBfZGVwbm9kZV90ICpub2RlID0gdGFzay0+dGRfZGVwbm9kZTsKKworICAgIGlmICggdGFzay0+dGRfZGVwaGFzaCApIHsKKyAgICAgICAgS0FfVFJBQ0UoNDAsICgiX19rbXBfcmVhbGVhc2VfZGVwczogVCMlZCBmcmVlaW5nIGRlcGVuZGVuY2llcyBoYXNoIG9mIHRhc2sgJXAuXG4iLCBndGlkLCB0YXNrICkgKTsKKyAgICAgICAgX19rbXBfZGVwaGFzaF9mcmVlKHRocmVhZCx0YXNrLT50ZF9kZXBoYXNoKTsKKyAgICB9CisKKyAgICBpZiAoICFub2RlICkgcmV0dXJuOworCisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfcmVhbGVhc2VfZGVwczogVCMlZCBub3RpZnlpbmcgc3VjY2Vzb3JzIG9mIHRhc2sgJXAuXG4iLCBndGlkLCB0YXNrICkgKTsKKyAgICAKKyAgICBLTVBfQUNRVUlSRV9ERVBOT0RFKGd0aWQsbm9kZSk7CisgICAgbm9kZS0+ZG4udGFzayA9IE5VTEw7IC8vIG1hcmsgdGhpcyB0YXNrIGFzIGZpbmlzaGVkLCBzbyBubyBuZXcgZGVwZW5kZW5jaWVzIGFyZSBnZW5lcmF0ZWQKKyAgICBLTVBfUkVMRUFTRV9ERVBOT0RFKGd0aWQsbm9kZSk7CisKKyAgICBrbXBfZGVwbm9kZV9saXN0X3QgKm5leHQ7CisgICAgZm9yICgga21wX2RlcG5vZGVfbGlzdF90ICpwID0gbm9kZS0+ZG4uc3VjY2Vzc29yczsgcDsgcCA9IG5leHQgKSB7CisgICAgICAgIGttcF9kZXBub2RlX3QgKnN1Y2Nlc3NvciA9IHAtPm5vZGU7CisgICAgICAgIGttcF9pbnQzMiBucHJlZGVjZXNzb3JzID0gS01QX1RFU1RfVEhFTl9ERUMzMigmc3VjY2Vzc29yLT5kbi5ucHJlZGVjZXNzb3JzKSAtIDE7CisKKyAgICAgICAgLy8gc3VjY2Vzc29yIHRhc2sgY2FuIGJlIE5VTEwgZm9yIHdhaXRfZGVwZW5kcyBvciBiZWNhdXNlIGRlcHMgYXJlIHN0aWxsIGJlaW5nIHByb2Nlc3NlZAorICAgICAgICBpZiAoIG5wcmVkZWNlc3NvcnMgPT0gMCApIHsKKyAgICAgICAgICAgIEtNUF9NQigpOworICAgICAgICAgICAgaWYgKCBzdWNjZXNzb3ItPmRuLnRhc2sgKSB7ICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfcmVhbGVhc2VfZGVwczogVCMlZCBzdWNjZXNzb3IgJXAgb2YgJXAgc2NoZWR1bGVkIGZvciBleGVjdXRpb24uXG4iLCBndGlkLCBzdWNjZXNzb3ItPmRuLnRhc2ssIHRhc2sgKSApOworICAgICAgICAgICAgICAgIF9fa21wX29tcF90YXNrKGd0aWQsc3VjY2Vzc29yLT5kbi50YXNrLGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG5leHQgPSBwLT5uZXh0OworICAgICAgICBfX2ttcF9ub2RlX2RlcmVmKHRocmVhZCxwLT5ub2RlKTsKKyNpZiBVU0VfRkFTVF9NRU1PUlkKKyAgICAgICAgX19rbXBfZmFzdF9mcmVlKHRocmVhZCxwKTsKKyNlbHNlCisgICAgICAgIF9fa21wX3RocmVhZF9mcmVlKHRocmVhZCxwKTsKKyNlbmRpZgorICAgIH0KKworICAgIF9fa21wX25vZGVfZGVyZWYodGhyZWFkLG5vZGUpOworCisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfcmVhbGVhc2VfZGVwczogVCMlZCBhbGwgc3VjY2Vzc29ycyBvZiAlcCBub3RpZmllZCBvZiBjb21wbGV0YXRpb25cbiIsIGd0aWQsIHRhc2sgKSApOworfQorCisvKiEKK0Bpbmdyb3VwIFRBU0tJTkcKK0BwYXJhbSBsb2NfcmVmIGxvY2F0aW9uIG9mIHRoZSBvcmlnaW5hbCB0YXNrIGRpcmVjdGl2ZQorQHBhcmFtIGd0aWQgR2xvYmFsIFRocmVhZCBJRCBvZiBlbmNvdW50ZXJpbmcgdGhyZWFkCitAcGFyYW0gbmV3X3Rhc2sgdGFzayB0aHVuayBhbGxvY2F0ZWQgYnkgX19rbXBfb21wX3Rhc2tfYWxsb2MoKSBmb3IgdGhlICcnbmV3IHRhc2snJworQHBhcmFtIG5kZXBzIE51bWJlciBvZiBkZXBlbmQgaXRlbXMgd2l0aCBwb3NzaWJsZSBhbGlhc2luZworQHBhcmFtIGRlcF9saXN0IExpc3Qgb2YgZGVwZW5kIGl0ZW1zIHdpdGggcG9zc2libGUgYWxpYXNpbmcKK0BwYXJhbSBuZGVwc19ub2FsaWFzIE51bWJlciBvZiBkZXBlbmQgaXRlbXMgd2l0aCBubyBhbGlhc2luZworQHBhcmFtIG5vYWxpYXNfZGVwX2xpc3QgTGlzdCBvZiBkZXBlbmQgaXRlbXMgd2l0aCBubyBhbGlhc2luZworCitAcmV0dXJuIFJldHVybnMgZWl0aGVyIFRBU0tfQ1VSUkVOVF9OT1RfUVVFVUVEIGlmIHRoZSBjdXJyZW50IHRhc2sgd2FzIG5vdCBzdXNwZW5kZW5kIGFuZCBxdWV1ZWQsIG9yIFRBU0tfQ1VSUkVOVF9RVUVVRUQgaWYgaXQgd2FzIHN1c3BlbmRlZCBhbmQgcXVldWVkCisKK1NjaGVkdWxlIGEgbm9uLXRocmVhZC1zd2l0Y2hhYmxlIHRhc2sgd2l0aCBkZXBlbmRlbmNlcyBmb3IgZXhlY3V0aW9uCisqLwora21wX2ludDMyCitfX2ttcGNfb21wX3Rhc2tfd2l0aF9kZXBzKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqIG5ld190YXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBuZGVwcywga21wX2RlcGVuZF9pbmZvX3QgKmRlcF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBuZGVwc19ub2FsaWFzLCBrbXBfZGVwZW5kX2luZm9fdCAqbm9hbGlhc19kZXBfbGlzdCApCit7CisKKyAgICBrbXBfdGFza2RhdGFfdCAqIG5ld190YXNrZGF0YSA9IEtNUF9UQVNLX1RPX1RBU0tEQVRBKG5ld190YXNrKTsKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3Rhc2tfd2l0aF9kZXBzKGVudGVyKTogVCMlZCBsb2M9JXAgdGFzaz0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIGxvY19yZWYsIG5ld190YXNrZGF0YSApICk7CisKKyAgICBrbXBfaW5mb190ICp0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAga21wX3Rhc2tkYXRhX3QgKiBjdXJyZW50X3Rhc2sgPSB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzazsKKworICAgIGJvb2wgc2VyaWFsID0gY3VycmVudF90YXNrLT50ZF9mbGFncy50ZWFtX3NlcmlhbCB8fCBjdXJyZW50X3Rhc2stPnRkX2ZsYWdzLnRhc2tpbmdfc2VyIHx8IGN1cnJlbnRfdGFzay0+dGRfZmxhZ3MuZmluYWw7CisjaWYgT01QXzQxX0VOQUJMRUQKKyAgICBzZXJpYWwgPSBzZXJpYWwgJiYgIShuZXdfdGFza2RhdGEtPnRkX2ZsYWdzLnByb3h5ID09IFRBU0tfUFJPWFkpOworI2VuZGlmCisKKyAgICBpZiAoICFzZXJpYWwgJiYgKCBuZGVwcyA+IDAgfHwgbmRlcHNfbm9hbGlhcyA+IDAgKSkgeworICAgICAgICAvKiBpZiBubyBkZXBlbmRlbmNpZXMgaGF2ZSBiZWVuIHRyYWNrZWQgeWV0LCBjcmVhdGUgdGhlIGRlcGVuZGVuY2UgaGFzaCAqLworICAgICAgICBpZiAoIGN1cnJlbnRfdGFzay0+dGRfZGVwaGFzaCA9PSBOVUxMICkKKyAgICAgICAgICAgIGN1cnJlbnRfdGFzay0+dGRfZGVwaGFzaCA9IF9fa21wX2RlcGhhc2hfY3JlYXRlKHRocmVhZCk7CisKKyNpZiBVU0VfRkFTVF9NRU1PUlkKKyAgICAgICAga21wX2RlcG5vZGVfdCAqbm9kZSA9IChrbXBfZGVwbm9kZV90ICopIF9fa21wX2Zhc3RfYWxsb2NhdGUodGhyZWFkLHNpemVvZihrbXBfZGVwbm9kZV90KSk7CisjZWxzZQorICAgICAgICBrbXBfZGVwbm9kZV90ICpub2RlID0gKGttcF9kZXBub2RlX3QgKikgX19rbXBfdGhyZWFkX21hbGxvYyh0aHJlYWQsc2l6ZW9mKGttcF9kZXBub2RlX3QpKTsKKyNlbmRpZgorCisgICAgICAgIF9fa21wX2luaXRfbm9kZShub2RlKTsKKyAgICAgICAgbmV3X3Rhc2tkYXRhLT50ZF9kZXBub2RlID0gbm9kZTsKKworICAgICAgICBpZiAoIF9fa21wX2NoZWNrX2RlcHMoIGd0aWQsIG5vZGUsIG5ld190YXNrLCBjdXJyZW50X3Rhc2stPnRkX2RlcGhhc2gsIE5PX0RFUF9CQVJSSUVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5kZXBzLCBkZXBfbGlzdCwgbmRlcHNfbm9hbGlhcyxub2FsaWFzX2RlcF9saXN0ICkgKSB7CisgICAgICAgICAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3Rhc2tfd2l0aF9kZXBzKGV4aXQpOiBUIyVkIHRhc2sgaGFkIGJsb2NraW5nIGRlcGVuZGVuY2llczogIgorICAgICAgICAgICAgICAgICAgImxvYz0lcCB0YXNrPSVwLCByZXR1cm46IFRBU0tfQ1VSUkVOVF9OT1RfUVVFVUVEXG4iLCBndGlkLCBsb2NfcmVmLAorICAgICAgICAgICAgICAgICAgbmV3X3Rhc2tkYXRhICkgKTsKKyAgICAgICAgICAgIHJldHVybiBUQVNLX0NVUlJFTlRfTk9UX1FVRVVFRDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisjaWYgT01QXzQxX0VOQUJMRUQKKyAgICAgICAga21wX3Rhc2tfdGVhbV90ICogdGFza190ZWFtID0gdGhyZWFkLT50aC50aF90YXNrX3RlYW07CisgICAgICAgIGlmICggdGFza190ZWFtICYmIHRhc2tfdGVhbS0+dHQudHRfZm91bmRfcHJveHlfdGFza3MgKQorICAgICAgICAgICBfX2ttcGNfb21wX3dhaXRfZGVwcyAoIGxvY19yZWYsIGd0aWQsIG5kZXBzLCBkZXBfbGlzdCwgbmRlcHNfbm9hbGlhcywgbm9hbGlhc19kZXBfbGlzdCApOworICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrX3dpdGhfZGVwcyhleGl0KTogVCMlZCBpZ25vcmVkIGRlcGVuZGVuY2llcyBmb3IgdGFzayAoc2VyaWFsaXplZCkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9jPSVwIHRhc2s9JXBcbiIsIGd0aWQsIGxvY19yZWYsIG5ld190YXNrZGF0YSApICk7CisgICAgfQorCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrX3dpdGhfZGVwcyhleGl0KTogVCMlZCB0YXNrIGhhZCBubyBibG9ja2luZyBkZXBlbmRlbmNpZXMgOiAiCisgICAgICAgICAgICAgICAgICAibG9jPSVwIHRhc2s9JXAsIHRyYW5zZmVycmluZyB0byBfX2ttcGNfb21wX3Rhc2tcbiIsIGd0aWQsIGxvY19yZWYsCisgICAgICAgICAgICAgICAgICBuZXdfdGFza2RhdGEgKSApOworCisgICAgcmV0dXJuIF9fa21wY19vbXBfdGFzayhsb2NfcmVmLGd0aWQsbmV3X3Rhc2spOworfQorCisvKiEKK0Bpbmdyb3VwIFRBU0tJTkcKK0BwYXJhbSBsb2NfcmVmIGxvY2F0aW9uIG9mIHRoZSBvcmlnaW5hbCB0YXNrIGRpcmVjdGl2ZQorQHBhcmFtIGd0aWQgR2xvYmFsIFRocmVhZCBJRCBvZiBlbmNvdW50ZXJpbmcgdGhyZWFkCitAcGFyYW0gbmRlcHMgTnVtYmVyIG9mIGRlcGVuZCBpdGVtcyB3aXRoIHBvc3NpYmxlIGFsaWFzaW5nCitAcGFyYW0gZGVwX2xpc3QgTGlzdCBvZiBkZXBlbmQgaXRlbXMgd2l0aCBwb3NzaWJsZSBhbGlhc2luZworQHBhcmFtIG5kZXBzX25vYWxpYXMgTnVtYmVyIG9mIGRlcGVuZCBpdGVtcyB3aXRoIG5vIGFsaWFzaW5nCitAcGFyYW0gbm9hbGlhc19kZXBfbGlzdCBMaXN0IG9mIGRlcGVuZCBpdGVtcyB3aXRoIG5vIGFsaWFzaW5nCisKK0Jsb2NrcyB0aGUgY3VycmVudCB0YXNrIHVudGlsIGFsbCBzcGVjaWZpZXMgZGVwZW5kZW5jaWVzIGhhdmUgYmVlbiBmdWxmaWxsZWQuCisqLwordm9pZAorX19rbXBjX29tcF93YWl0X2RlcHMgKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyIG5kZXBzLCBrbXBfZGVwZW5kX2luZm9fdCAqZGVwX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBuZGVwc19ub2FsaWFzLCBrbXBfZGVwZW5kX2luZm9fdCAqbm9hbGlhc19kZXBfbGlzdCApCit7CisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF93YWl0X2RlcHMoZW50ZXIpOiBUIyVkIGxvYz0lcFxuIiwgZ3RpZCwgbG9jX3JlZikgKTsKKworICAgIGlmICggbmRlcHMgPT0gMCAmJiBuZGVwc19ub2FsaWFzID09IDAgKSB7CisgICAgICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfd2FpdF9kZXBzKGV4aXQpOiBUIyVkIGhhcyBubyBkZXBlbmRlbmNpZXMgdG8gd2FpdCB1cG9uIDogbG9jPSVwXG4iLCBndGlkLCBsb2NfcmVmKSApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAga21wX2luZm9fdCAqdGhyZWFkID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIGttcF90YXNrZGF0YV90ICogY3VycmVudF90YXNrID0gdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2s7CisKKyAgICAvLyBXZSBjYW4gcmV0dXJuIGltbWVkaWF0ZWx5IGFzOgorICAgIC8vICAgLSBkZXBlbmRlbmNlcyBhcmUgbm90IGNvbXB1dGVkIGluIHNlcmlhbCB0ZWFtcyAoZXhjZXB0IGlmIHdlIGhhdmUgcHJveHkgdGFza3MpCisgICAgLy8gICAtIGlmIHRoZSBkZXBoYXNoIGlzIG5vdCB5ZXQgY3JlYXRlZCBpdCBtZWFucyB3ZSBoYXZlIG5vdGhpbmcgdG8gd2FpdCBmb3IKKyAgICBib29sIGlnbm9yZSA9IGN1cnJlbnRfdGFzay0+dGRfZmxhZ3MudGVhbV9zZXJpYWwgfHwgY3VycmVudF90YXNrLT50ZF9mbGFncy50YXNraW5nX3NlciB8fCBjdXJyZW50X3Rhc2stPnRkX2ZsYWdzLmZpbmFsOworI2lmIE9NUF80MV9FTkFCTEVECisgICAgaWdub3JlID0gaWdub3JlICYmIHRocmVhZC0+dGgudGhfdGFza190ZWFtLT50dC50dF9mb3VuZF9wcm94eV90YXNrcyA9PSBGQUxTRTsKKyNlbmRpZgorICAgIGlnbm9yZSA9IGlnbm9yZSB8fCBjdXJyZW50X3Rhc2stPnRkX2RlcGhhc2ggPT0gTlVMTDsKKworICAgIGlmICggaWdub3JlICkgeworICAgICAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3dhaXRfZGVwcyhleGl0KTogVCMlZCBoYXMgbm8gYmxvY2tpbmcgZGVwZW5kZW5jaWVzIDogbG9jPSVwXG4iLCBndGlkLCBsb2NfcmVmKSApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAga21wX2RlcG5vZGVfdCBub2RlOworICAgIF9fa21wX2luaXRfbm9kZSgmbm9kZSk7CisKKyAgICBpZiAoIV9fa21wX2NoZWNrX2RlcHMoIGd0aWQsICZub2RlLCBOVUxMLCBjdXJyZW50X3Rhc2stPnRkX2RlcGhhc2gsIERFUF9CQVJSSUVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmRlcHMsIGRlcF9saXN0LCBuZGVwc19ub2FsaWFzLCBub2FsaWFzX2RlcF9saXN0ICkpIHsKKyAgICAgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF93YWl0X2RlcHMoZXhpdCk6IFQjJWQgaGFzIG5vIGJsb2NraW5nIGRlcGVuZGVuY2llcyA6IGxvYz0lcFxuIiwgZ3RpZCwgbG9jX3JlZikgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludCB0aHJlYWRfZmluaXNoZWQgPSBGQUxTRTsKKyAgICBrbXBfZmxhZ18zMiBmbGFnKCh2b2xhdGlsZSBrbXBfdWludDMyICopJihub2RlLmRuLm5wcmVkZWNlc3NvcnMpLCAwVSk7CisgICAgd2hpbGUgKCBub2RlLmRuLm5wcmVkZWNlc3NvcnMgPiAwICkgeworICAgICAgICBmbGFnLmV4ZWN1dGVfdGFza3ModGhyZWFkLCBndGlkLCBGQUxTRSwgJnRocmVhZF9maW5pc2hlZCwKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF90YXNrX3N0ZWFsaW5nX2NvbnN0cmFpbnQgKTsKKyAgICB9CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3dhaXRfZGVwcyhleGl0KTogVCMlZCBmaW5pc2hlZCB3YWl0aW5nIDogbG9jPSVwXG4iLCBndGlkLCBsb2NfcmVmKSApOworfQorCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX3Rhc2tpbmcuYyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF90YXNraW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M2MmE0MwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF90YXNraW5nLmMKQEAgLTAsMCArMSwyODU5IEBACisvKgorICoga21wX3Rhc2tpbmcuYyAtLSBPcGVuTVAgMy4wIHRhc2tpbmcgc3VwcG9ydC4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9pMThuLmgiCisjaW5jbHVkZSAia21wX2l0dC5oIgorI2luY2x1ZGUgImttcF93YWl0X3JlbGVhc2UuaCIKKyNpbmNsdWRlICJrbXBfc3RhdHMuaCIKKworI2lmIE9NUFRfU1VQUE9SVAorI2luY2x1ZGUgIm9tcHQtc3BlY2lmaWMuaCIKKyNlbmRpZgorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLworc3RhdGljIHZvaWQgX19rbXBfZW5hYmxlX3Rhc2tpbmcoIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtLCBrbXBfaW5mb190ICp0aGlzX3RociApOworc3RhdGljIHZvaWQgX19rbXBfYWxsb2NfdGFza19kZXF1ZSgga21wX2luZm9fdCAqdGhyZWFkLCBrbXBfdGhyZWFkX2RhdGFfdCAqdGhyZWFkX2RhdGEgKTsKK3N0YXRpYyBpbnQgIF9fa21wX3JlYWxsb2NfdGFza190aHJlYWRzX2RhdGEoIGttcF9pbmZvX3QgKnRocmVhZCwga21wX3Rhc2tfdGVhbV90ICp0YXNrX3RlYW0gKTsKKworI2lmZGVmIE9NUF80MV9FTkFCTEVECitzdGF0aWMgdm9pZCBfX2ttcF9ib3R0b21faGFsZl9maW5pc2hfcHJveHkoIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICogcHRhc2sgKTsKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIHZvaWQgX19rbXBfbnVsbF9yZXN1bWVfd3JhcHBlcihpbnQgZ3RpZCwgdm9sYXRpbGUgdm9pZCAqZmxhZykgeworICAgIGlmICghZmxhZykgcmV0dXJuOworICAgIC8vIEF0dGVtcHQgdG8gd2FrZSB1cCBhIHRocmVhZDogZXhhbWluZSBpdHMgdHlwZSBhbmQgY2FsbCBhcHByb3ByaWF0ZSB0ZW1wbGF0ZQorICAgIHN3aXRjaCAoKChrbXBfZmxhZ182NCAqKWZsYWcpLT5nZXRfdHlwZSgpKSB7CisgICAgY2FzZSBmbGFnMzI6IF9fa21wX3Jlc3VtZV8zMihndGlkLCBOVUxMKTsgYnJlYWs7CisgICAgY2FzZSBmbGFnNjQ6IF9fa21wX3Jlc3VtZV82NChndGlkLCBOVUxMKTsgYnJlYWs7CisgICAgY2FzZSBmbGFnX29uY29yZTogX19rbXBfcmVzdW1lX29uY29yZShndGlkLCBOVUxMKTsgYnJlYWs7CisgICAgfQorfQorCisjaWZkZWYgQlVJTERfVElFRF9UQVNLX1NUQUNLCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgX19rbXBfdHJhY2VfdGFza19zdGFjazogcHJpbnQgdGhlIHRpZWQgdGFza3MgZnJvbSB0aGUgdGFzayBzdGFjayBpbiBvcmRlcgorLy8gICAgIGZyb20gdG9wIGRvIGJvdHRvbQorLy8KKy8vICBndGlkOiBnbG9iYWwgdGhyZWFkIGlkZW50aWZpZXIgZm9yIHRocmVhZCBjb250YWluaW5nIHN0YWNrCisvLyAgdGhyZWFkX2RhdGE6IHRocmVhZCBkYXRhIGZvciB0YXNrIHRlYW0gdGhyZWFkIGNvbnRhaW5pbmcgc3RhY2sKKy8vICB0aHJlc2hvbGQ6IHZhbHVlIGFib3ZlIHdoaWNoIHRoZSB0cmFjZSBzdGF0ZW1lbnQgdHJpZ2dlcnMKKy8vICBsb2NhdGlvbjogc3RyaW5nIGlkZW50aWZ5aW5nIGNhbGwgc2l0ZSBvZiB0aGlzIGZ1bmN0aW9uIChmb3IgdHJhY2UpCisKK3N0YXRpYyB2b2lkCitfX2ttcF90cmFjZV90YXNrX3N0YWNrKCBrbXBfaW50MzIgZ3RpZCwga21wX3RocmVhZF9kYXRhX3QgKnRocmVhZF9kYXRhLCBpbnQgdGhyZXNob2xkLCBjaGFyICpsb2NhdGlvbiApCit7CisgICAga21wX3Rhc2tfc3RhY2tfdCAqdGFza19zdGFjayA9ICYgdGhyZWFkX2RhdGEtPnRkLnRkX3N1c3BfdGllZF90YXNrczsKKyAgICBrbXBfdGFza2RhdGFfdCAqKnN0YWNrX3RvcCA9IHRhc2tfc3RhY2sgLT4gdHNfdG9wOworICAgIGttcF9pbnQzMiBlbnRyaWVzID0gdGFza19zdGFjayAtPiB0c19lbnRyaWVzOworICAgIGttcF90YXNrZGF0YV90ICp0aWVkX3Rhc2s7CisKKyAgICBLQV9UUkFDRSh0aHJlc2hvbGQsICgiX19rbXBfdHJhY2VfdGFza19zdGFjayhzdGFydCk6IGxvY2F0aW9uID0gJXMsIGd0aWQgPSAlZCwgZW50cmllcyA9ICVkLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImZpcnN0X2Jsb2NrID0gJXAsIHN0YWNrX3RvcCA9ICVwIFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiwgZ3RpZCwgZW50cmllcywgdGFza19zdGFjay0+dHNfZmlyc3RfYmxvY2ssIHN0YWNrX3RvcCApICk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzdGFja190b3AgIT0gTlVMTCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIGVudHJpZXMgPiAwICk7CisKKyAgICB3aGlsZSAoIGVudHJpZXMgIT0gMCApCisgICAgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBzdGFja190b3AgIT0gJiB0YXNrX3N0YWNrLT50c19maXJzdF9ibG9jay5zYl9ibG9ja1swXSApOworICAgICAgICAvLyBmaXggdXAgdHNfdG9wIGlmIHdlIG5lZWQgdG8gcG9wIGZyb20gcHJldmlvdXMgYmxvY2sKKyAgICAgICAgaWYgKCBlbnRyaWVzICYgVEFTS19TVEFDS19JTkRFWF9NQVNLID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBrbXBfc3RhY2tfYmxvY2tfdCAqc3RhY2tfYmxvY2sgPSAoa21wX3N0YWNrX2Jsb2NrX3QgKikgKHN0YWNrX3RvcCkgOworCisgICAgICAgICAgICBzdGFja19ibG9jayA9IHN0YWNrX2Jsb2NrIC0+IHNiX3ByZXY7CisgICAgICAgICAgICBzdGFja190b3AgPSAmIHN0YWNrX2Jsb2NrIC0+IHNiX2Jsb2NrW1RBU0tfU1RBQ0tfQkxPQ0tfU0laRV07CisgICAgICAgIH0KKworICAgICAgICAvLyBmaW5pc2ggYm9va2tlZXBpbmcKKyAgICAgICAgc3RhY2tfdG9wLS07CisgICAgICAgIGVudHJpZXMtLTsKKworICAgICAgICB0aWVkX3Rhc2sgPSAqIHN0YWNrX3RvcDsKKworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0aWVkX3Rhc2sgIT0gTlVMTCApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0aWVkX3Rhc2sgLT4gdGRfZmxhZ3MudGFza3R5cGUgPT0gVEFTS19USUVEICk7CisKKyAgICAgICAgS0FfVFJBQ0UodGhyZXNob2xkLCAoIl9fa21wX3RyYWNlX3Rhc2tfc3RhY2soJXMpOiAgICAgICAgICAgICBndGlkPSVkLCBlbnRyeT0lZCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RhY2tfdG9wPSVwLCB0aWVkX3Rhc2s9JXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLCBndGlkLCBlbnRyaWVzLCBzdGFja190b3AsIHRpZWRfdGFzayApICk7CisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQoIHN0YWNrX3RvcCA9PSAmIHRhc2tfc3RhY2stPnRzX2ZpcnN0X2Jsb2NrLnNiX2Jsb2NrWzBdICk7CisKKyAgICBLQV9UUkFDRSh0aHJlc2hvbGQsICgiX19rbXBfdHJhY2VfdGFza19zdGFjayhleGl0KTogbG9jYXRpb24gPSAlcywgZ3RpZCA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLCBndGlkICkgKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBfX2ttcF9pbml0X3Rhc2tfc3RhY2s6IGluaXRpYWxpemUgdGhlIHRhc2sgc3RhY2sgZm9yIHRoZSBmaXJzdCB0aW1lCisvLyAgICBhZnRlciBhIHRocmVhZF9kYXRhIHN0cnVjdHVyZSBpcyBjcmVhdGVkLgorLy8gICAgSXQgc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnkgdG8gZG8gdGhpcyBhZ2FpbiAoYXNzdW1pbmcgdGhlIHN0YWNrIHdvcmtzKS4KKy8vCisvLyAgZ3RpZDogZ2xvYmFsIHRocmVhZCBpZGVudGlmaWVyIG9mIGNhbGxpbmcgdGhyZWFkCisvLyAgdGhyZWFkX2RhdGE6IHRocmVhZCBkYXRhIGZvciB0YXNrIHRlYW0gdGhyZWFkIGNvbnRhaW5pbmcgc3RhY2sKKworc3RhdGljIHZvaWQKK19fa21wX2luaXRfdGFza19zdGFjaygga21wX2ludDMyIGd0aWQsIGttcF90aHJlYWRfZGF0YV90ICp0aHJlYWRfZGF0YSApCit7CisgICAga21wX3Rhc2tfc3RhY2tfdCAqdGFza19zdGFjayA9ICYgdGhyZWFkX2RhdGEtPnRkLnRkX3N1c3BfdGllZF90YXNrczsKKyAgICBrbXBfc3RhY2tfYmxvY2tfdCAqZmlyc3RfYmxvY2s7CisKKyAgICAvLyBzZXQgdXAgdGhlIGZpcnN0IGJsb2NrIG9mIHRoZSBzdGFjaworICAgIGZpcnN0X2Jsb2NrID0gJiB0YXNrX3N0YWNrIC0+IHRzX2ZpcnN0X2Jsb2NrOworICAgIHRhc2tfc3RhY2sgLT4gdHNfdG9wID0gKGttcF90YXNrZGF0YV90ICoqKSBmaXJzdF9ibG9jazsKKyAgICBtZW1zZXQoICh2b2lkICopIGZpcnN0X2Jsb2NrLCAnXDAnLCBUQVNLX1NUQUNLX0JMT0NLX1NJWkUgKiBzaXplb2Yoa21wX3Rhc2tkYXRhX3QgKikpOworCisgICAgLy8gaW5pdGlhbGl6ZSB0aGUgc3RhY2sgdG8gYmUgZW1wdHkKKyAgICB0YXNrX3N0YWNrICAtPiB0c19lbnRyaWVzID0gVEFTS19TVEFDS19FTVBUWTsKKyAgICBmaXJzdF9ibG9jayAtPiBzYl9uZXh0ID0gTlVMTDsKKyAgICBmaXJzdF9ibG9jayAtPiBzYl9wcmV2ID0gTlVMTDsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIF9fa21wX2ZyZWVfdGFza19zdGFjazogZnJlZSB0aGUgdGFzayBzdGFjayB3aGVuIHRocmVhZF9kYXRhIGlzIGRlc3Ryb3llZC4KKy8vCisvLyAgZ3RpZDogZ2xvYmFsIHRocmVhZCBpZGVudGlmaWVyIGZvciBjYWxsaW5nIHRocmVhZAorLy8gIHRocmVhZF9kYXRhOiB0aHJlYWQgaW5mbyBmb3IgdGhyZWFkIGNvbnRhaW5pbmcgc3RhY2sKKworc3RhdGljIHZvaWQKK19fa21wX2ZyZWVfdGFza19zdGFjaygga21wX2ludDMyIGd0aWQsIGttcF90aHJlYWRfZGF0YV90ICp0aHJlYWRfZGF0YSApCit7CisgICAga21wX3Rhc2tfc3RhY2tfdCAqdGFza19zdGFjayA9ICYgdGhyZWFkX2RhdGEtPnRkLnRkX3N1c3BfdGllZF90YXNrczsKKyAgICBrbXBfc3RhY2tfYmxvY2tfdCAqc3RhY2tfYmxvY2sgPSAmIHRhc2tfc3RhY2sgLT4gdHNfZmlyc3RfYmxvY2s7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrX3N0YWNrIC0+IHRzX2VudHJpZXMgPT0gVEFTS19TVEFDS19FTVBUWSApOworICAgIC8vIGZyZWUgZnJvbSB0aGUgc2Vjb25kIGJsb2NrIG9mIHRoZSBzdGFjaworICAgIHdoaWxlICggc3RhY2tfYmxvY2sgIT0gTlVMTCApIHsKKyAgICAgICAga21wX3N0YWNrX2Jsb2NrX3QgKm5leHRfYmxvY2sgPSAoc3RhY2tfYmxvY2spID8gc3RhY2tfYmxvY2sgLT4gc2JfbmV4dCA6IE5VTEw7CisKKyAgICAgICAgc3RhY2tfYmxvY2sgLT4gc2JfbmV4dCA9IE5VTEw7CisgICAgICAgIHN0YWNrX2Jsb2NrIC0+IHNiX3ByZXYgPSBOVUxMOworICAgICAgICBpZiAoc3RhY2tfYmxvY2sgIT0gJiB0YXNrX3N0YWNrIC0+IHRzX2ZpcnN0X2Jsb2NrKSB7CisgICAgICAgICAgICBfX2ttcF90aHJlYWRfZnJlZSggdGhyZWFkLCBzdGFja19ibG9jayApOyAgLy8gZnJlZSB0aGUgYmxvY2ssIGlmIG5vdCB0aGUgZmlyc3QKKyAgICAgICAgfQorICAgICAgICBzdGFja19ibG9jayA9IG5leHRfYmxvY2s7CisgICAgfQorICAgIC8vIGluaXRpYWxpemUgdGhlIHN0YWNrIHRvIGJlIGVtcHR5CisgICAgdGFza19zdGFjayAtPiB0c19lbnRyaWVzID0gMDsKKyAgICB0YXNrX3N0YWNrIC0+IHRzX3RvcCA9IE5VTEw7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBfX2ttcF9wdXNoX3Rhc2tfc3RhY2s6IFB1c2ggdGhlIHRpZWQgdGFzayBvbnRvIHRoZSB0YXNrIHN0YWNrLgorLy8gICAgIEdyb3cgdGhlIHN0YWNrIGlmIG5lY2Vzc2FyeSBieSBhbGxvY2F0aW5nIGFub3RoZXIgYmxvY2suCisvLworLy8gIGd0aWQ6IGdsb2JhbCB0aHJlYWQgaWRlbnRpZmllciBmb3IgY2FsbGluZyB0aHJlYWQKKy8vICB0aHJlYWQ6IHRocmVhZCBpbmZvIGZvciB0aHJlYWQgY29udGFpbmluZyBzdGFjaworLy8gIHRpZWRfdGFzazogdGhlIHRhc2sgdG8gcHVzaCBvbiB0aGUgc3RhY2sKKworc3RhdGljIHZvaWQKK19fa21wX3B1c2hfdGFza19zdGFjaygga21wX2ludDMyIGd0aWQsIGttcF9pbmZvX3QgKnRocmVhZCwga21wX3Rhc2tkYXRhX3QgKiB0aWVkX3Rhc2sgKQoreworICAgIC8vIEdFSCAtIG5lZWQgdG8gY29uc2lkZXIgd2hhdCB0byBkbyBpZiB0dF90aHJlYWRzX2RhdGEgbm90IGFsbG9jYXRlZCB5ZXQKKyAgICBrbXBfdGhyZWFkX2RhdGFfdCAqdGhyZWFkX2RhdGEgPSAmIHRocmVhZCAtPiB0aC50aF90YXNrX3RlYW0gLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dC50dF90aHJlYWRzX2RhdGFbIF9fa21wX3RpZF9mcm9tX2d0aWQoIGd0aWQgKSBdOworICAgIGttcF90YXNrX3N0YWNrX3QgKnRhc2tfc3RhY2sgPSAmIHRocmVhZF9kYXRhLT50ZC50ZF9zdXNwX3RpZWRfdGFza3MgOworCisgICAgaWYgKCB0aWVkX3Rhc2stPnRkX2ZsYWdzLnRlYW1fc2VyaWFsIHx8IHRpZWRfdGFzay0+dGRfZmxhZ3MudGFza2luZ19zZXIgKSB7CisgICAgICAgIHJldHVybjsgIC8vIERvbid0IHB1c2ggYW55dGhpbmcgb24gc3RhY2sgaWYgdGVhbSBvciB0ZWFtIHRhc2tzIGFyZSBzZXJpYWxpemVkCisgICAgfQorCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGllZF90YXNrIC0+IHRkX2ZsYWdzLnRhc2t0eXBlID09IFRBU0tfVElFRCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tfc3RhY2sgLT4gdHNfdG9wICE9IE5VTEwgKTsKKworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3B1c2hfdGFza19zdGFjayhlbnRlcik6IEdUSUQ6ICVkOyBUSFJFQUQ6ICVwOyBUQVNLOiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRocmVhZCwgdGllZF90YXNrICkgKTsKKyAgICAvLyBTdG9yZSBlbnRyeQorICAgICogKHRhc2tfc3RhY2sgLT4gdHNfdG9wKSA9IHRpZWRfdGFzazsKKworICAgIC8vIERvIGJvb2trZWVwaW5nIGZvciBuZXh0IHB1c2gKKyAgICB0YXNrX3N0YWNrIC0+IHRzX3RvcCsrOworICAgIHRhc2tfc3RhY2sgLT4gdHNfZW50cmllcysrOworCisgICAgaWYgKCB0YXNrX3N0YWNrIC0+IHRzX2VudHJpZXMgJiBUQVNLX1NUQUNLX0lOREVYX01BU0sgPT0gMCApCisgICAgeworICAgICAgICAvLyBGaW5kIGJlZ2lubmluZyBvZiB0aGlzIHRhc2sgYmxvY2sKKyAgICAgICAga21wX3N0YWNrX2Jsb2NrX3QgKnN0YWNrX2Jsb2NrID0KKyAgICAgICAgICAgICAoa21wX3N0YWNrX2Jsb2NrX3QgKikgKHRhc2tfc3RhY2sgLT4gdHNfdG9wIC0gVEFTS19TVEFDS19CTE9DS19TSVpFKTsKKworICAgICAgICAvLyBDaGVjayBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBibG9jaworICAgICAgICBpZiAoIHN0YWNrX2Jsb2NrIC0+IHNiX25leHQgIT0gTlVMTCApCisgICAgICAgIHsgICAgLy8gcmVzZXQgdHNfdG9wIHRvIGJlZ2lubmluZyBvZiBuZXh0IGJsb2NrCisgICAgICAgICAgICB0YXNrX3N0YWNrIC0+IHRzX3RvcCA9ICYgc3RhY2tfYmxvY2sgLT4gc2JfbmV4dCAtPiBzYl9ibG9ja1swXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsgICAvLyBBbGxvYyBuZXcgYmxvY2sgYW5kIGxpbmsgaXQgdXAKKyAgICAgICAgICAgIGttcF9zdGFja19ibG9ja190ICpuZXdfYmxvY2sgPSAoa21wX3N0YWNrX2Jsb2NrX3QgKikKKyAgICAgICAgICAgICAgX19rbXBfdGhyZWFkX2NhbGxvYyh0aHJlYWQsIHNpemVvZihrbXBfc3RhY2tfYmxvY2tfdCkpOworCisgICAgICAgICAgICB0YXNrX3N0YWNrIC0+IHRzX3RvcCAgPSAmIG5ld19ibG9jayAtPiBzYl9ibG9ja1swXTsKKyAgICAgICAgICAgIHN0YWNrX2Jsb2NrIC0+IHNiX25leHQgPSBuZXdfYmxvY2s7CisgICAgICAgICAgICBuZXdfYmxvY2sgIC0+IHNiX3ByZXYgPSBzdGFja19ibG9jazsKKyAgICAgICAgICAgIG5ld19ibG9jayAgLT4gc2JfbmV4dCA9IE5VTEw7CisKKyAgICAgICAgICAgIEtBX1RSQUNFKDMwLCAoIl9fa21wX3B1c2hfdGFza19zdGFjaygpOiBHVElEOiAlZDsgVEFTSzogJXA7IEFsbG9jIG5ldyBibG9jazogJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRpZWRfdGFzaywgbmV3X2Jsb2NrICkgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9wdXNoX3Rhc2tfc3RhY2soZXhpdCk6IEdUSUQ6ICVkOyBUQVNLOiAlcFxuIiwgZ3RpZCwgdGllZF90YXNrICkgKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBfX2ttcF9wb3BfdGFza19zdGFjazogUG9wIHRoZSB0aWVkIHRhc2sgZnJvbSB0aGUgdGFzayBzdGFjay4gIERvbid0IHJldHVybgorLy8gICAgIHRoZSB0YXNrLCBqdXN0IGNoZWNrIHRvIG1ha2Ugc3VyZSBpdCBtYXRjaGVzIHRoZSBlbmRpbmcgdGFzayBwYXNzZWQgaW4uCisvLworLy8gIGd0aWQ6IGdsb2JhbCB0aHJlYWQgaWRlbnRpZmllciBmb3IgdGhlIGNhbGxpbmcgdGhyZWFkCisvLyAgdGhyZWFkOiB0aHJlYWQgaW5mbyBzdHJ1Y3R1cmUgY29udGFpbmluZyBzdGFjaworLy8gIHRpZWRfdGFzazogdGhlIHRhc2sgcG9wcGVkIG9mZiB0aGUgc3RhY2sKKy8vICBlbmRpbmdfdGFzazogdGhlIHRhc2sgdGhhdCBpcyBlbmRpbmcgKHNob3VsZCBtYXRjaCBwb3BwZWQgdGFzaykKKworc3RhdGljIHZvaWQKK19fa21wX3BvcF90YXNrX3N0YWNrKCBrbXBfaW50MzIgZ3RpZCwga21wX2luZm9fdCAqdGhyZWFkLCBrbXBfdGFza2RhdGFfdCAqZW5kaW5nX3Rhc2sgKQoreworICAgIC8vIEdFSCAtIG5lZWQgdG8gY29uc2lkZXIgd2hhdCB0byBkbyBpZiB0dF90aHJlYWRzX2RhdGEgbm90IGFsbG9jYXRlZCB5ZXQKKyAgICBrbXBfdGhyZWFkX2RhdGFfdCAqdGhyZWFkX2RhdGEgPSAmIHRocmVhZCAtPiB0aC50aF90YXNrX3RlYW0gLT4gdHRfdGhyZWFkc19kYXRhWyBfX2ttcF90aWRfZnJvbV9ndGlkKCBndGlkICkgXTsKKyAgICBrbXBfdGFza19zdGFja190ICp0YXNrX3N0YWNrID0gJiB0aHJlYWRfZGF0YS0+dGQudGRfc3VzcF90aWVkX3Rhc2tzIDsKKyAgICBrbXBfdGFza2RhdGFfdCAqdGllZF90YXNrOworCisgICAgaWYgKCBlbmRpbmdfdGFzay0+dGRfZmxhZ3MudGVhbV9zZXJpYWwgfHwgZW5kaW5nX3Rhc2stPnRkX2ZsYWdzLnRhc2tpbmdfc2VyICkgeworICAgICAgICByZXR1cm47ICAvLyBEb24ndCBwb3AgYW55dGhpbmcgZnJvbSBzdGFjayBpZiB0ZWFtIG9yIHRlYW0gdGFza3MgYXJlIHNlcmlhbGl6ZWQKKyAgICB9CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrX3N0YWNrIC0+IHRzX3RvcCAhPSBOVUxMICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza19zdGFjayAtPiB0c19lbnRyaWVzID4gMCApOworCisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfcG9wX3Rhc2tfc3RhY2soZW50ZXIpOiBHVElEOiAlZDsgVEhSRUFEOiAlcFxuIiwgZ3RpZCwgdGhyZWFkICkgKTsKKworICAgIC8vIGZpeCB1cCB0c190b3AgaWYgd2UgbmVlZCB0byBwb3AgZnJvbSBwcmV2aW91cyBibG9jaworICAgIGlmICggdGFza19zdGFjayAtPiB0c19lbnRyaWVzICYgVEFTS19TVEFDS19JTkRFWF9NQVNLID09IDAgKQorICAgIHsKKyAgICAgICAga21wX3N0YWNrX2Jsb2NrX3QgKnN0YWNrX2Jsb2NrID0KKyAgICAgICAgICAgKGttcF9zdGFja19ibG9ja190ICopICh0YXNrX3N0YWNrIC0+IHRzX3RvcCkgOworCisgICAgICAgIHN0YWNrX2Jsb2NrID0gc3RhY2tfYmxvY2sgLT4gc2JfcHJldjsKKyAgICAgICAgdGFza19zdGFjayAtPiB0c190b3AgPSAmIHN0YWNrX2Jsb2NrIC0+IHNiX2Jsb2NrW1RBU0tfU1RBQ0tfQkxPQ0tfU0laRV07CisgICAgfQorCisgICAgLy8gZmluaXNoIGJvb2trZWVwaW5nCisgICAgdGFza19zdGFjayAtPiB0c190b3AtLTsKKyAgICB0YXNrX3N0YWNrIC0+IHRzX2VudHJpZXMtLTsKKworICAgIHRpZWRfdGFzayA9ICogKHRhc2tfc3RhY2sgLT4gdHNfdG9wICk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aWVkX3Rhc2sgIT0gTlVMTCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRpZWRfdGFzayAtPiB0ZF9mbGFncy50YXNrdHlwZSA9PSBUQVNLX1RJRUQgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aWVkX3Rhc2sgPT0gZW5kaW5nX3Rhc2sgKTsgIC8vIElmIHdlIGJ1aWx0IHRoZSBzdGFjayBjb3JyZWN0bHkKKworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3BvcF90YXNrX3N0YWNrKGV4aXQpOiBHVElEOiAlZDsgVEFTSzogJXBcbiIsIGd0aWQsIHRpZWRfdGFzayApICk7CisgICAgcmV0dXJuOworfQorI2VuZGlmIC8qIEJVSUxEX1RJRURfVEFTS19TVEFDSyAqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIF9fa21wX3B1c2hfdGFzazogQWRkIGEgdGFzayB0byB0aGUgdGhyZWFkJ3MgZGVxdWUKKworc3RhdGljIGttcF9pbnQzMgorX19rbXBfcHVzaF90YXNrKGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICogdGFzayApCit7CisgICAga21wX2luZm9fdCAqICAgICAgICB0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAga21wX3Rhc2tkYXRhX3QgKiAgICB0YXNrZGF0YSA9IEtNUF9UQVNLX1RPX1RBU0tEQVRBKHRhc2spOworICAgIGttcF90YXNrX3RlYW1fdCAqICAgdGFza190ZWFtID0gdGhyZWFkLT50aC50aF90YXNrX3RlYW07CisgICAga21wX2ludDMyICAgICAgICAgICB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKCBndGlkICk7CisgICAga21wX3RocmVhZF9kYXRhX3QgKiB0aHJlYWRfZGF0YTsKKworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3B1c2hfdGFzazogVCMlZCB0cnlpbmcgdG8gcHVzaCB0YXNrICVwLlxuIiwgZ3RpZCwgdGFza2RhdGEgKSApOworCisgICAgLy8gVGhlIGZpcnN0IGNoZWNrIGF2b2lkcyBidWlsZGluZyB0YXNrX3RlYW0gdGhyZWFkIGRhdGEgaWYgc2VyaWFsaXplZAorICAgIGlmICggdGFza2RhdGEtPnRkX2ZsYWdzLnRhc2tfc2VyaWFsICkgeworICAgICAgICBLQV9UUkFDRSgyMCwgKCAiX19rbXBfcHVzaF90YXNrOiBUIyVkIHRlYW0gc2VyaWFsaXplZDsgcmV0dXJuaW5nIFRBU0tfTk9UX1BVU0hFRCBmb3IgdGFzayAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFza2RhdGEgKSApOworICAgICAgICByZXR1cm4gVEFTS19OT1RfUFVTSEVEOworICAgIH0KKworICAgIC8vIE5vdyB0aGF0IHNlcmlhbGl6ZWQgdGFza3MgaGF2ZSByZXR1cm5lZCwgd2UgY2FuIGFzc3VtZSB0aGF0IHdlIGFyZSBub3QgaW4gaW1tZWRpYXRlIGV4ZWMgbW9kZQorICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICk7CisgICAgaWYgKCAhIEtNUF9UQVNLSU5HX0VOQUJMRUQodGFza190ZWFtKSApIHsKKyAgICAgICAgIF9fa21wX2VuYWJsZV90YXNraW5nKCB0YXNrX3RlYW0sIHRocmVhZCApOworICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKCBUQ1JfNCh0YXNrX3RlYW0gLT4gdHQudHRfZm91bmRfdGFza3MpID09IFRSVUUgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBUQ1JfUFRSKHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2RhdGEpICE9IE5VTEwgKTsKKworICAgIC8vIEZpbmQgdGFza2luZyBkZXF1ZSBzcGVjaWZpYyB0byBlbmNvdW50ZXJpbmcgdGhyZWFkCisgICAgdGhyZWFkX2RhdGEgPSAmIHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2RhdGFbIHRpZCBdOworCisgICAgLy8gTm8gbG9jayBuZWVkZWQgc2luY2Ugb25seSBvd25lciBjYW4gYWxsb2NhdGUKKyAgICBpZiAodGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWUgPT0gTlVMTCApIHsKKyAgICAgICAgX19rbXBfYWxsb2NfdGFza19kZXF1ZSggdGhyZWFkLCB0aHJlYWRfZGF0YSApOworICAgIH0KKworICAgIC8vIENoZWNrIGlmIGRlcXVlIGlzIGZ1bGwKKyAgICBpZiAoIFRDUl80KHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX250YXNrcykgPj0gVEFTS19ERVFVRV9TSVpFICkKKyAgICB7CisgICAgICAgIEtBX1RSQUNFKDIwLCAoICJfX2ttcF9wdXNoX3Rhc2s6IFQjJWQgZGVxdWUgaXMgZnVsbDsgcmV0dXJuaW5nIFRBU0tfTk9UX1BVU0hFRCBmb3IgdGFzayAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFza2RhdGEgKSApOworICAgICAgICByZXR1cm4gVEFTS19OT1RfUFVTSEVEOworICAgIH0KKworICAgIC8vIExvY2sgdGhlIGRlcXVlIGZvciB0aGUgdGFzayBwdXNoIG9wZXJhdGlvbgorICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbG9jayApOworCisjaWYgT01QXzQxX0VOQUJMRUQKKyAgICAvLyBOZWVkIHRvIHJlY2hlY2sgYXMgd2UgY2FuIGdldCBhIHByb3h5IHRhc2sgZnJvbSBhIHRocmVhZCBvdXRzaWRlIG9mIE9wZW5NUAorICAgIGlmICggVENSXzQodGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbnRhc2tzKSA+PSBUQVNLX0RFUVVFX1NJWkUgKQorICAgIHsKKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9sb2NrICk7CisgICAgICAgIEtBX1RSQUNFKDIwLCAoICJfX2ttcF9wdXNoX3Rhc2s6IFQjJWQgZGVxdWUgaXMgZnVsbCBvbiAybmQgY2hlY2s7IHJldHVybmluZyBUQVNLX05PVF9QVVNIRUQgZm9yIHRhc2sgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRhc2tkYXRhICkgKTsKKyAgICAgICAgcmV0dXJuIFRBU0tfTk9UX1BVU0hFRDsKKyAgICB9CisjZWxzZQorICAgIC8vIE11c3QgaGF2ZSByb29tIHNpbmNlIG5vIHRocmVhZCBjYW4gYWRkIHRhc2tzIGJ1dCBjYWxsaW5nIHRocmVhZAorICAgIEtNUF9ERUJVR19BU1NFUlQoIFRDUl80KHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX250YXNrcykgPCBUQVNLX0RFUVVFX1NJWkUgKTsKKyNlbmRpZgorCisgICAgdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVbIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX3RhaWwgXSA9IHRhc2tkYXRhOyAgLy8gUHVzaCB0YXNrZGF0YQorICAgIC8vIFdyYXAgaW5kZXguCisgICAgdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfdGFpbCA9ICggdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfdGFpbCArIDEgKSAmIFRBU0tfREVRVUVfTUFTSzsKKyAgICBUQ1dfNCh0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9udGFza3MsIFRDUl80KHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX250YXNrcykgKyAxKTsgICAgICAgICAgICAgLy8gQWRqdXN0IHRhc2sgY291bnQKKworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbG9jayApOworCisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfcHVzaF90YXNrOiBUIyVkIHJldHVybmluZyBUQVNLX1NVQ0NFU1NGVUxMWV9QVVNIRUQ6ICIKKyAgICAgICAgICAgICAgICAgICJ0YXNrPSVwIG50YXNrcz0lZCBoZWFkPSV1IHRhaWw9JXVcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0YXNrZGF0YSwgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX250YXNrcywKKyAgICAgICAgICAgICAgICAgIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV90YWlsLCB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfaGVhZCkgKTsKKworICAgIHJldHVybiBUQVNLX1NVQ0NFU1NGVUxMWV9QVVNIRUQ7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfcG9wX2N1cnJlbnRfdGFza19mcm9tX3RocmVhZDogc2V0IHVwIGN1cnJlbnQgdGFzayBmcm9tIGNhbGxlZCB0aHJlYWQgd2hlbiB0ZWFtIGVuZHMKKy8vIHRoaXNfdGhyOiB0aHJlYWQgc3RydWN0dXJlIHRvIHNldCBjdXJyZW50X3Rhc2sgaW4uCisKK3ZvaWQKK19fa21wX3BvcF9jdXJyZW50X3Rhc2tfZnJvbV90aHJlYWQoIGttcF9pbmZvX3QgKnRoaXNfdGhyICkKK3sKKyAgICBLRl9UUkFDRSggMTAsICgiX19rbXBfcG9wX2N1cnJlbnRfdGFza19mcm9tX3RocmVhZChlbnRlcik6IFQjJWQgdGhpc190aHJlYWQ9JXAsIGN1cnRhc2s9JXAsICIKKyAgICAgICAgICAgICAgICAgICAiY3VydGFza19wYXJlbnQ9JXBcbiIsCisgICAgICAgICAgICAgICAgICAgMCwgdGhpc190aHIsIHRoaXNfdGhyIC0+IHRoLnRoX2N1cnJlbnRfdGFzaywKKyAgICAgICAgICAgICAgICAgICB0aGlzX3RociAtPiB0aC50aF9jdXJyZW50X3Rhc2sgLT4gdGRfcGFyZW50ICkgKTsKKworICAgIHRoaXNfdGhyIC0+IHRoLnRoX2N1cnJlbnRfdGFzayA9IHRoaXNfdGhyIC0+IHRoLnRoX2N1cnJlbnRfdGFzayAtPiB0ZF9wYXJlbnQ7CisKKyAgICBLRl9UUkFDRSggMTAsICgiX19rbXBfcG9wX2N1cnJlbnRfdGFza19mcm9tX3RocmVhZChleGl0KTogVCMlZCB0aGlzX3RocmVhZD0lcCwgY3VydGFzaz0lcCwgIgorICAgICAgICAgICAgICAgICAgICJjdXJ0YXNrX3BhcmVudD0lcFxuIiwKKyAgICAgICAgICAgICAgICAgICAwLCB0aGlzX3RociwgdGhpc190aHIgLT4gdGgudGhfY3VycmVudF90YXNrLAorICAgICAgICAgICAgICAgICAgIHRoaXNfdGhyIC0+IHRoLnRoX2N1cnJlbnRfdGFzayAtPiB0ZF9wYXJlbnQgKSApOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF9wdXNoX2N1cnJlbnRfdGFza190b190aHJlYWQ6IHNldCB1cCBjdXJyZW50IHRhc2sgaW4gY2FsbGVkIHRocmVhZCBmb3IgYSBuZXcgdGVhbQorLy8gdGhpc190aHI6IHRocmVhZCBzdHJ1Y3R1cmUgdG8gc2V0IHVwCisvLyB0ZWFtOiB0ZWFtIGZvciBpbXBsaWNpdCB0YXNrIGRhdGEKKy8vIHRpZDogdGhyZWFkIHdpdGhpbiB0ZWFtIHRvIHNldCB1cAorCit2b2lkCitfX2ttcF9wdXNoX2N1cnJlbnRfdGFza190b190aHJlYWQoIGttcF9pbmZvX3QgKnRoaXNfdGhyLCBrbXBfdGVhbV90ICp0ZWFtLCBpbnQgdGlkICkKK3sKKyAgICAvLyBjdXJyZW50IHRhc2sgb2YgdGhlIHRocmVhZCBpcyBhIHBhcmVudCBvZiB0aGUgbmV3IGp1c3QgY3JlYXRlZCBpbXBsaWNpdCB0YXNrcyBvZiBuZXcgdGVhbQorICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfcHVzaF9jdXJyZW50X3Rhc2tfdG9fdGhyZWFkKGVudGVyKTogVCMlZCB0aGlzX3RocmVhZD0lcCBjdXJ0YXNrPSVwICIKKyAgICAgICAgICAgICAgICAgICAgInBhcmVudF90YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgICAgICB0aWQsIHRoaXNfdGhyLCB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrLAorICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLnRkX3BhcmVudCApICk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUICh0aGlzX3RociAhPSBOVUxMKTsKKworICAgIGlmKCB0aWQgPT0gMCApIHsKKyAgICAgICAgaWYoIHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2sgIT0gJiB0ZWFtIC0+IHQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhWyAwIF0gKSB7CisgICAgICAgICAgICB0ZWFtIC0+IHQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhWyAwIF0udGRfcGFyZW50ID0gdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzazsKKyAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2sgPSAmIHRlYW0gLT4gdC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbIDAgXTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHRlYW0gLT4gdC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbIHRpZCBdLnRkX3BhcmVudCA9IHRlYW0gLT4gdC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbIDAgXS50ZF9wYXJlbnQ7CisgICAgICAgIHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2sgPSAmIHRlYW0gLT4gdC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbIHRpZCBdOworICAgIH0KKworICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfcHVzaF9jdXJyZW50X3Rhc2tfdG9fdGhyZWFkKGV4aXQpOiBUIyVkIHRoaXNfdGhyZWFkPSVwIGN1cnRhc2s9JXAgIgorICAgICAgICAgICAgICAgICAgICAicGFyZW50X3Rhc2s9JXBcbiIsCisgICAgICAgICAgICAgICAgICAgIHRpZCwgdGhpc190aHIsIHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2ssCisgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0udGRfcGFyZW50ICkgKTsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX3Rhc2tfc3RhcnQ6IGJvb2trZWVwaW5nIGZvciBhIHRhc2sgc3RhcnRpbmcgZXhlY3V0aW9uCisvLyBHVElEOiBnbG9iYWwgdGhyZWFkIGlkIG9mIGNhbGxpbmcgdGhyZWFkCisvLyB0YXNrOiB0YXNrIHN0YXJ0aW5nIGV4ZWN1dGlvbgorLy8gY3VycmVudF90YXNrOiB0YXNrIHN1c3BlbmRpbmcKKworc3RhdGljIHZvaWQKK19fa21wX3Rhc2tfc3RhcnQoIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICogdGFzaywga21wX3Rhc2tkYXRhX3QgKiBjdXJyZW50X3Rhc2sgKQoreworICAgIGttcF90YXNrZGF0YV90ICogdGFza2RhdGEgPSBLTVBfVEFTS19UT19UQVNLREFUQSh0YXNrKTsKKyAgICBrbXBfaW5mb190ICogdGhyZWFkID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfdGFza19zdGFydChlbnRlcik6IFQjJWQgc3RhcnRpbmcgdGFzayAlcDogY3VycmVudF90YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFza2RhdGEsIGN1cnJlbnRfdGFzaykgKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLnRhc2t0eXBlID09IFRBU0tfRVhQTElDSVQgKTsKKworICAgIC8vIG1hcmsgY3VycmVudGx5IGV4ZWN1dGluZyB0YXNrIGFzIHN1c3BlbmRlZAorICAgIC8vIFRPRE86IEdFSCAtIG1ha2Ugc3VyZSByb290IHRlYW0gaW1wbGljaXQgdGFzayBpcyBpbml0aWFsaXplZCBwcm9wZXJseS4KKyAgICAvLyBLTVBfREVCVUdfQVNTRVJUKCBjdXJyZW50X3Rhc2sgLT4gdGRfZmxhZ3MuZXhlY3V0aW5nID09IDEgKTsKKyAgICBjdXJyZW50X3Rhc2sgLT4gdGRfZmxhZ3MuZXhlY3V0aW5nID0gMDsKKworICAgIC8vIEFkZCB0YXNrIHRvIHN0YWNrIGlmIHRpZWQKKyNpZmRlZiBCVUlMRF9USUVEX1RBU0tfU1RBQ0sKKyAgICBpZiAoIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLnRpZWRuZXNzID09IFRBU0tfVElFRCApCisgICAgeworICAgICAgICBfX2ttcF9wdXNoX3Rhc2tfc3RhY2soIGd0aWQsIHRocmVhZCwgdGFza2RhdGEgKTsKKyAgICB9CisjZW5kaWYgLyogQlVJTERfVElFRF9UQVNLX1NUQUNLICovCisKKyAgICAvLyBtYXJrIHN0YXJ0aW5nIHRhc2sgYXMgZXhlY3V0aW5nIGFuZCBhcyBjdXJyZW50IHRhc2sKKyAgICB0aHJlYWQgLT4gdGgudGhfY3VycmVudF90YXNrID0gdGFza2RhdGE7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YSAtPiB0ZF9mbGFncy5zdGFydGVkID09IDAgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YSAtPiB0ZF9mbGFncy5leGVjdXRpbmcgPT0gMCApOworICAgIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLnN0YXJ0ZWQgPSAxOworICAgIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLmV4ZWN1dGluZyA9IDE7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza2RhdGEgLT4gdGRfZmxhZ3MuY29tcGxldGUgPT0gMCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLmZyZWVkID09IDAgKTsKKworICAgIC8vIEdFSCBUT0RPOiBzaG91bGRuJ3Qgd2UgcGFzcyBzb21lIHNvcnQgb2YgbG9jYXRpb24gaWRlbnRpZmllciBoZXJlPworICAgIC8vIEFQVDogeWVzLCB3ZSB3aWxsIHBhc3MgbG9jYXRpb24gaGVyZS4KKyAgICAvLyBuZWVkIHRvIHN0b3JlIGN1cnJlbnQgdGhyZWFkIHN0YXRlIChpbiBhIHRocmVhZCBvciB0YXNrZGF0YSBzdHJ1Y3R1cmUpCisgICAgLy8gYmVmb3JlIHNldHRpbmcgd29ya19zdGF0ZSwgb3RoZXJ3aXNlIHdyb25nIHN0YXRlIGlzIHNldCBhZnRlciBlbmQgb2YgdGFzaworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfdGFza19zdGFydChleGl0KTogVCMlZCB0YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFza2RhdGEgKSApOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgaWYgKG9tcHRfZW5hYmxlZCAmJgorICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfdGFza19iZWdpbikpIHsKKyAgICAgICAga21wX3Rhc2tkYXRhX3QgKnBhcmVudCA9IHRhc2tkYXRhLT50ZF9wYXJlbnQ7CisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF90YXNrX2JlZ2luKSgKKyAgICAgICAgICAgIHBhcmVudCA/IHBhcmVudC0+b21wdF90YXNrX2luZm8udGFza19pZCA6IG9tcHRfdGFza19pZF9ub25lLAorICAgICAgICAgICAgcGFyZW50ID8gJihwYXJlbnQtPm9tcHRfdGFza19pbmZvLmZyYW1lKSA6IE5VTEwsCisgICAgICAgICAgICB0YXNrZGF0YS0+b21wdF90YXNrX2luZm8udGFza19pZCwKKyAgICAgICAgICAgIHRhc2tkYXRhLT5vbXB0X3Rhc2tfaW5mby5mdW5jdGlvbik7CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm47Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcGNfb21wX3Rhc2tfYmVnaW5faWYwOiByZXBvcnQgdGhhdCBhIGdpdmVuIHNlcmlhbGl6ZWQgdGFzayBoYXMgc3RhcnRlZCBleGVjdXRpb24KKy8vIGxvY19yZWY6IHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbjsgcG9pbnRzIHRvIGJlZ2lubmluZyBvZiB0YXNrIGJsb2NrLgorLy8gZ3RpZDogZ2xvYmFsIHRocmVhZCBudW1iZXIuCisvLyB0YXNrOiB0YXNrIHRodW5rIGZvciB0aGUgc3RhcnRlZCB0YXNrLgorCit2b2lkCitfX2ttcGNfb21wX3Rhc2tfYmVnaW5faWYwKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqIHRhc2sgKQoreworICAgIGttcF90YXNrZGF0YV90ICogdGFza2RhdGEgPSBLTVBfVEFTS19UT19UQVNLREFUQSh0YXNrKTsKKyAgICBrbXBfdGFza2RhdGFfdCAqIGN1cnJlbnRfdGFzayA9IF9fa21wX3RocmVhZHNbIGd0aWQgXSAtPiB0aC50aF9jdXJyZW50X3Rhc2s7CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3Rhc2tfYmVnaW5faWYwKGVudGVyKTogVCMlZCBsb2M9JXAgdGFzaz0lcCBjdXJyZW50X3Rhc2s9JXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBsb2NfcmVmLCB0YXNrZGF0YSwgY3VycmVudF90YXNrICkgKTsKKworICAgIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLnRhc2tfc2VyaWFsID0gMTsgIC8vIEV4ZWN1dGUgdGhpcyB0YXNrIGltbWVkaWF0ZWx5LCBub3QgZGVmZXJyZWQuCisgICAgX19rbXBfdGFza19zdGFydCggZ3RpZCwgdGFzaywgY3VycmVudF90YXNrICk7CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3Rhc2tfYmVnaW5faWYwKGV4aXQpOiBUIyVkIGxvYz0lcCB0YXNrPSVwLFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIGxvY19yZWYsIHRhc2tkYXRhICkgKTsKKworICAgIHJldHVybjsKK30KKworI2lmZGVmIFRBU0tfVU5VU0VECisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wY19vbXBfdGFza19iZWdpbjogcmVwb3J0IHRoYXQgYSBnaXZlbiB0YXNrIGhhcyBzdGFydGVkIGV4ZWN1dGlvbgorLy8gTkVWRVIgR0VORVJBVEVEIEJZIENPTVBJTEVSLCBERVBSRUNBVEVEISEhCisKK3ZvaWQKK19fa21wY19vbXBfdGFza19iZWdpbiggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKiB0YXNrICkKK3sKKyAgICBrbXBfdGFza2RhdGFfdCAqIGN1cnJlbnRfdGFzayA9IF9fa21wX3RocmVhZHNbIGd0aWQgXSAtPiB0aC50aF9jdXJyZW50X3Rhc2s7CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3Rhc2tfYmVnaW4oZW50ZXIpOiBUIyVkIGxvYz0lcCB0YXNrPSVwIGN1cnJlbnRfdGFzaz0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIGxvY19yZWYsIEtNUF9UQVNLX1RPX1RBU0tEQVRBKHRhc2spLCBjdXJyZW50X3Rhc2sgKSApOworCisgICAgX19rbXBfdGFza19zdGFydCggZ3RpZCwgdGFzaywgY3VycmVudF90YXNrICk7CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3Rhc2tfYmVnaW4oZXhpdCk6IFQjJWQgbG9jPSVwIHRhc2s9JXAsXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgbG9jX3JlZiwgS01QX1RBU0tfVE9fVEFTS0RBVEEodGFzaykgKSApOworCisgICAgcmV0dXJuOworfQorI2VuZGlmIC8vIFRBU0tfVU5VU0VECisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF9mcmVlX3Rhc2s6IGZyZWUgdGhlIGN1cnJlbnQgdGFzayBzcGFjZSBhbmQgdGhlIHNwYWNlIGZvciBzaGFyZWRzCisvLyBndGlkOiBHbG9iYWwgdGhyZWFkIElEIG9mIGNhbGxpbmcgdGhyZWFkCisvLyB0YXNrZGF0YTogdGFzayB0byBmcmVlCisvLyB0aHJlYWQ6IHRocmVhZCBkYXRhIHN0cnVjdHVyZSBvZiBjYWxsZXIKKworc3RhdGljIHZvaWQKK19fa21wX2ZyZWVfdGFzaygga21wX2ludDMyIGd0aWQsIGttcF90YXNrZGF0YV90ICogdGFza2RhdGEsIGttcF9pbmZvX3QgKiB0aHJlYWQgKQoreworICAgIEtBX1RSQUNFKDMwLCAoIl9fa21wX2ZyZWVfdGFzazogVCMlZCBmcmVlaW5nIGRhdGEgZnJvbSB0YXNrICVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFza2RhdGEpICk7CisKKyAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgYWxsIGZsYWdzIGFuZCBjb3VudGVycyBoYXZlIHRoZSBjb3JyZWN0IHZhbHVlcworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhLT50ZF9mbGFncy50YXNrdHlwZSA9PSBUQVNLX0VYUExJQ0lUICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza2RhdGEtPnRkX2ZsYWdzLmV4ZWN1dGluZyA9PSAwICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza2RhdGEtPnRkX2ZsYWdzLmNvbXBsZXRlID09IDEgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YS0+dGRfZmxhZ3MuZnJlZWQgPT0gMCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIFRDUl80KHRhc2tkYXRhLT50ZF9hbGxvY2F0ZWRfY2hpbGRfdGFza3MpID09IDAgIHx8IHRhc2tkYXRhLT50ZF9mbGFncy50YXNrX3NlcmlhbCA9PSAxKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBUQ1JfNCh0YXNrZGF0YS0+dGRfaW5jb21wbGV0ZV9jaGlsZF90YXNrcykgPT0gMCApOworCisgICAgdGFza2RhdGEtPnRkX2ZsYWdzLmZyZWVkID0gMTsKKyAgICAvLyBkZWFsbG9jYXRlIHRoZSB0YXNrZGF0YSBhbmQgc2hhcmVkIHZhcmlhYmxlIGJsb2NrcyBhc3NvY2lhdGVkIHdpdGggdGhpcyB0YXNrCisgICAgI2lmIFVTRV9GQVNUX01FTU9SWQorICAgICAgICBfX2ttcF9mYXN0X2ZyZWUoIHRocmVhZCwgdGFza2RhdGEgKTsKKyAgICAjZWxzZSAvKiAhIFVTRV9GQVNUX01FTU9SWSAqLworICAgICAgICBfX2ttcF90aHJlYWRfZnJlZSggdGhyZWFkLCB0YXNrZGF0YSApOworICAgICNlbmRpZgorCisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfZnJlZV90YXNrOiBUIyVkIGZyZWVkIHRhc2sgJXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0YXNrZGF0YSkgKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF9mcmVlX3Rhc2tfYW5kX2FuY2VzdG9yczogZnJlZSB0aGUgY3VycmVudCB0YXNrIGFuZCBhbmNlc3RvcnMgd2l0aG91dCBjaGlsZHJlbgorLy8KKy8vIGd0aWQ6IEdsb2JhbCB0aHJlYWQgSUQgb2YgY2FsbGluZyB0aHJlYWQKKy8vIHRhc2tkYXRhOiB0YXNrIHRvIGZyZWUKKy8vIHRocmVhZDogdGhyZWFkIGRhdGEgc3RydWN0dXJlIG9mIGNhbGxlcgorCitzdGF0aWMgdm9pZAorX19rbXBfZnJlZV90YXNrX2FuZF9hbmNlc3RvcnMoIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza2RhdGFfdCAqIHRhc2tkYXRhLCBrbXBfaW5mb190ICogdGhyZWFkICkKK3sKKyAgICBrbXBfaW50MzIgY2hpbGRyZW4gPSAwOworICAgIGttcF9pbnQzMiB0ZWFtX29yX3Rhc2tpbmdfc2VyaWFsaXplZCA9IHRhc2tkYXRhIC0+IHRkX2ZsYWdzLnRlYW1fc2VyaWFsIHx8IHRhc2tkYXRhIC0+IHRkX2ZsYWdzLnRhc2tpbmdfc2VyOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza2RhdGEgLT4gdGRfZmxhZ3MudGFza3R5cGUgPT0gVEFTS19FWFBMSUNJVCApOworCisgICAgaWYgKCAhdGVhbV9vcl90YXNraW5nX3NlcmlhbGl6ZWQgKSB7CisgICAgICAgIGNoaWxkcmVuID0gS01QX1RFU1RfVEhFTl9ERUMzMiggKGttcF9pbnQzMiAqKSgmIHRhc2tkYXRhIC0+IHRkX2FsbG9jYXRlZF9jaGlsZF90YXNrcykgKSAtIDE7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGNoaWxkcmVuID49IDAgKTsKKyAgICB9CisKKyAgICAvLyBOb3csIGdvIHVwIHRoZSBhbmNlc3RvciB0cmVlIHRvIHNlZSBpZiBhbnkgYW5jZXN0b3JzIGNhbiBub3cgYmUgZnJlZWQuCisgICAgd2hpbGUgKCBjaGlsZHJlbiA9PSAwICkKKyAgICB7CisgICAgICAgIGttcF90YXNrZGF0YV90ICogcGFyZW50X3Rhc2tkYXRhID0gdGFza2RhdGEgLT4gdGRfcGFyZW50OworCisgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2ZyZWVfdGFza19hbmRfYW5jZXN0b3JzKGVudGVyKTogVCMlZCB0YXNrICVwIGNvbXBsZXRlICIKKyAgICAgICAgICAgICAgICAgICAgICAiYW5kIGZyZWVpbmcgaXRzZWxmXG4iLCBndGlkLCB0YXNrZGF0YSkgKTsKKworICAgICAgICAvLyAtLS0gRGVhbGxvY2F0ZSBteSBhbmNlc3RvciB0YXNrIC0tLQorICAgICAgICBfX2ttcF9mcmVlX3Rhc2soIGd0aWQsIHRhc2tkYXRhLCB0aHJlYWQgKTsKKworICAgICAgICB0YXNrZGF0YSA9IHBhcmVudF90YXNrZGF0YTsKKworICAgICAgICAvLyBTdG9wIGNoZWNraW5nIGFuY2VzdG9ycyBhdCBpbXBsaWNpdCB0YXNrIG9yIGlmIHRhc2tpbmcgc2VyaWFsaXplZAorICAgICAgICAvLyBpbnN0ZWFkIG9mIHdhbGtpbmcgdXAgYW5jZXN0b3IgdHJlZSB0byBhdm9pZCBwcmVtYXR1cmUgZGVhbGxvY2F0aW9uIG9mIGFuY2VzdG9ycy4KKyAgICAgICAgaWYgKCB0ZWFtX29yX3Rhc2tpbmdfc2VyaWFsaXplZCB8fCB0YXNrZGF0YSAtPiB0ZF9mbGFncy50YXNrdHlwZSA9PSBUQVNLX0lNUExJQ0lUICkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZiAoICF0ZWFtX29yX3Rhc2tpbmdfc2VyaWFsaXplZCApIHsKKyAgICAgICAgICAgIC8vIFByZWRlY3JlbWVudCBzaW11bGF0ZWQgYnkgIi0gMSIgY2FsY3VsYXRpb24KKyAgICAgICAgICAgIGNoaWxkcmVuID0gS01QX1RFU1RfVEhFTl9ERUMzMiggKGttcF9pbnQzMiAqKSgmIHRhc2tkYXRhIC0+IHRkX2FsbG9jYXRlZF9jaGlsZF90YXNrcykgKSAtIDE7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBjaGlsZHJlbiA+PSAwICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9mcmVlX3Rhc2tfYW5kX2FuY2VzdG9ycyhleGl0KTogVCMlZCB0YXNrICVwIGhhcyAlZCBjaGlsZHJlbjsgIgorICAgICAgICAgICAgICAgICAgIm5vdCBmcmVlaW5nIGl0IHlldFxuIiwgZ3RpZCwgdGFza2RhdGEsIGNoaWxkcmVuKSApOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfdGFza19maW5pc2g6IGJvb2trZWVwaW5nIHRvIGRvIHdoZW4gYSB0YXNrIGZpbmlzaGVzIGV4ZWN1dGlvbgorLy8gZ3RpZDogZ2xvYmFsIHRocmVhZCBJRCBmb3IgY2FsbGluZyB0aHJlYWQKKy8vIHRhc2s6IHRhc2sgdG8gYmUgZmluaXNoZWQKKy8vIHJlc3VtZWRfdGFzazogdGFzayB0byBiZSByZXN1bWVkLiAgKG1heSBiZSBOVUxMIGlmIHRhc2sgaXMgc2VyaWFsaXplZCkKKworc3RhdGljIHZvaWQKK19fa21wX3Rhc2tfZmluaXNoKCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqdGFzaywga21wX3Rhc2tkYXRhX3QgKnJlc3VtZWRfdGFzayApCit7CisgICAga21wX3Rhc2tkYXRhX3QgKiB0YXNrZGF0YSA9IEtNUF9UQVNLX1RPX1RBU0tEQVRBKHRhc2spOworICAgIGttcF9pbmZvX3QgKiB0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAga21wX2ludDMyIGNoaWxkcmVuID0gMDsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIGlmIChvbXB0X2VuYWJsZWQgJiYKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3Rhc2tfZW5kKSkgeworICAgICAgICBrbXBfdGFza2RhdGFfdCAqcGFyZW50ID0gdGFza2RhdGEtPnRkX3BhcmVudDsKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3Rhc2tfZW5kKSgKKyAgICAgICAgICAgIHRhc2tkYXRhLT5vbXB0X3Rhc2tfaW5mby50YXNrX2lkKTsKKyAgICB9CisjZW5kaWYKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3Rhc2tfZmluaXNoKGVudGVyKTogVCMlZCBmaW5pc2hpbmcgdGFzayAlcCBhbmQgcmVzdW1pbmcgdGFzayAlcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRhc2tkYXRhLCByZXN1bWVkX3Rhc2spICk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YSAtPiB0ZF9mbGFncy50YXNrdHlwZSA9PSBUQVNLX0VYUExJQ0lUICk7CisKKyAgICAvLyBQb3AgdGFzayBmcm9tIHN0YWNrIGlmIHRpZWQKKyNpZmRlZiBCVUlMRF9USUVEX1RBU0tfU1RBQ0sKKyAgICBpZiAoIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLnRpZWRuZXNzID09IFRBU0tfVElFRCApCisgICAgeworICAgICAgICBfX2ttcF9wb3BfdGFza19zdGFjayggZ3RpZCwgdGhyZWFkLCB0YXNrZGF0YSApOworICAgIH0KKyNlbmRpZiAvKiBCVUlMRF9USUVEX1RBU0tfU1RBQ0sgKi8KKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLmNvbXBsZXRlID09IDAgKTsKKyAgICB0YXNrZGF0YSAtPiB0ZF9mbGFncy5jb21wbGV0ZSA9IDE7ICAgLy8gbWFyayB0aGUgdGFzayBhcyBjb21wbGV0ZWQKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YSAtPiB0ZF9mbGFncy5zdGFydGVkID09IDEgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YSAtPiB0ZF9mbGFncy5mcmVlZCA9PSAwICk7CisKKyAgICAvLyBPbmx5IG5lZWQgdG8ga2VlcCB0cmFjayBvZiBjb3VudCBpZiB0ZWFtIHBhcmFsbGVsIGFuZCB0YXNraW5nIG5vdCBzZXJpYWxpemVkCisgICAgaWYgKCAhKCB0YXNrZGF0YSAtPiB0ZF9mbGFncy50ZWFtX3NlcmlhbCB8fCB0YXNrZGF0YSAtPiB0ZF9mbGFncy50YXNraW5nX3NlciApICkgeworICAgICAgICAvLyBQcmVkZWNyZW1lbnQgc2ltdWxhdGVkIGJ5ICItIDEiIGNhbGN1bGF0aW9uCisgICAgICAgIGNoaWxkcmVuID0gS01QX1RFU1RfVEhFTl9ERUMzMiggKGttcF9pbnQzMiAqKSgmIHRhc2tkYXRhIC0+IHRkX3BhcmVudCAtPiB0ZF9pbmNvbXBsZXRlX2NoaWxkX3Rhc2tzKSApIC0gMTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggY2hpbGRyZW4gPj0gMCApOworI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgIGlmICggdGFza2RhdGEtPnRkX3Rhc2tncm91cCApCisgICAgICAgICAgICBLTVBfVEVTVF9USEVOX0RFQzMyKCAoa21wX2ludDMyICopKCYgdGFza2RhdGEtPnRkX3Rhc2tncm91cC0+Y291bnQpICk7CisgICAgICAgIF9fa21wX3JlbGVhc2VfZGVwcyhndGlkLHRhc2tkYXRhKTsKKyNlbmRpZgorICAgIH0KKworICAgIC8vIHRkX2ZsYWdzLmV4ZWN1dGluZyAgbXVzdCBiZSBtYXJrZWQgYXMgMCBhZnRlciBfX2ttcF9yZWxlYXNlX2RlcHMgaGFzIGJlZW4gY2FsbGVkCisgICAgLy8gT3RoZXJ0d2lzZSwgaWYgYSB0YXNrIGlzIGV4ZWN1dGVkIGltbWVkaWF0ZWx5IGZyb20gdGhlIHJlbGVhc2VfZGVwcyBjb2RlCisgICAgLy8gdGhlIGZsYWcgd2lsbCBiZSByZXNldCB0byAxIGFnYWluIGJ5IHRoaXMgc2FtZSBmdW5jdGlvbgorICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLmV4ZWN1dGluZyA9PSAxICk7CisgICAgdGFza2RhdGEgLT4gdGRfZmxhZ3MuZXhlY3V0aW5nID0gMDsgIC8vIHN1c3BlbmQgdGhlIGZpbmlzaGluZyB0YXNrCisKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF90YXNrX2ZpbmlzaDogVCMlZCBmaW5pc2hlZCB0YXNrICVwLCAlZCBpbmNvbXBsZXRlIGNoaWxkcmVuXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFza2RhdGEsIGNoaWxkcmVuKSApOworCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAvKiBJZiB0aGUgdGFza3MnIGRlc3RydWN0b3IgdGh1bmsgZmxhZyBoYXMgYmVlbiBzZXQsIHdlIG5lZWQgdG8gaW52b2tlIHRoZQorICAgICAgIGRlc3RydWN0b3IgdGh1bmsgdGhhdCBoYXMgYmVlbiBnZW5lcmF0ZWQgYnkgdGhlIGNvbXBpbGVyLgorICAgICAgIFRoZSBjb2RlIGlzIHBsYWNlZCBoZXJlLCBzaW5jZSBhdCB0aGlzIHBvaW50IG90aGVyIHRhc2tzIG1pZ2h0IGhhdmUgYmVlbiByZWxlYXNlZAorICAgICAgIGhlbmNlIG92ZXJsYXBwaW5nIHRoZSBkZXN0cnVjdG9yIGludm9rYXRpb25zIHdpdGggc29tZSBvdGhlciB3b3JrIGluIHRoZQorICAgICAgIHJlbGVhc2VkIHRhc2tzLiAgVGhlIE9wZW5NUCBzcGVjIGlzIG5vdCBzcGVjaWZpYyBvbiB3aGVuIHRoZSBkZXN0cnVjdG9ycyBhcmUKKyAgICAgICBpbnZva2VkLCBzbyB3ZSBzaG91bGQgYmUgZnJlZSB0byBjaG9vc2UuCisgICAgICovCisgICAgaWYgKHRhc2tkYXRhLT50ZF9mbGFncy5kZXN0cnVjdG9yc190aHVuaykgeworICAgICAgICBrbXBfcm91dGluZV9lbnRyeV90IGRlc3RyX3RodW5rID0gdGFzay0+ZGVzdHJ1Y3RvcnM7CisgICAgICAgIEtNUF9BU1NFUlQoZGVzdHJfdGh1bmspOworICAgICAgICBkZXN0cl90aHVuayhndGlkLCB0YXNrKTsKKyAgICB9CisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKworICAgIC8vIGJvb2trZWVwaW5nIGZvciByZXN1bWluZyB0YXNrOgorICAgIC8vIEdFSCAtIG5vdGUgdGFza2luZ19zZXIgPT4gdGFza19zZXJpYWwKKyAgICBLTVBfREVCVUdfQVNTRVJUKCAodGFza2RhdGEtPnRkX2ZsYWdzLnRhc2tpbmdfc2VyIHx8IHRhc2tkYXRhLT50ZF9mbGFncy50YXNrX3NlcmlhbCkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgdGFza2RhdGEtPnRkX2ZsYWdzLnRhc2tfc2VyaWFsKTsKKyAgICBpZiAoIHRhc2tkYXRhLT50ZF9mbGFncy50YXNrX3NlcmlhbCApCisgICAgeworICAgICAgICBpZiAocmVzdW1lZF90YXNrID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJlc3VtZWRfdGFzayA9IHRhc2tkYXRhLT50ZF9wYXJlbnQ7ICAvLyBJbiBhIHNlcmlhbGl6ZWQgdGFzaywgdGhlIHJlc3VtZWQgdGFzayBpcyB0aGUgcGFyZW50CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLyB2ZXJpZnkgcmVzdW1lZCB0YXNrIHBhc3NlZCBpbiBwb2ludHMgdG8gcGFyZW50CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCByZXN1bWVkX3Rhc2sgPT0gdGFza2RhdGEtPnRkX3BhcmVudCApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCByZXN1bWVkX3Rhc2sgIT0gTlVMTCApOyAgICAgICAgLy8gdmVyaWZ5IHRoYXQgcmVzdW1lZCB0YXNrIGlzIHBhc3NlZCBhcyBhcmd1ZW1udAorICAgIH0KKworICAgIC8vIEZyZWUgdGhpcyB0YXNrIGFuZCB0aGVuIGFuY2VzdG9yIHRhc2tzIGlmIHRoZXkgaGF2ZSBubyBjaGlsZHJlbi4KKyAgICAvLyBSZXN0b3JlIHRoX2N1cnJlbnRfdGFzayBmaXJzdCBhcyBzdWdnZXN0ZWQgYnkgSm9objoKKyAgICAvLyBqb2hubWM6IGlmIGFuIGFzeW5jaHJvbm91cyBpbnF1aXJ5IHBlZXJzIGludG8gdGhlIHJ1bnRpbWUgc3lzdGVtCisgICAgLy8gaXQgZG9lc24ndCBzZWUgdGhlIGZyZWVkIHRhc2sgYXMgdGhlIGN1cnJlbnQgdGFzay4KKyAgICB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzayA9IHJlc3VtZWRfdGFzazsKKyAgICBfX2ttcF9mcmVlX3Rhc2tfYW5kX2FuY2VzdG9ycyhndGlkLCB0YXNrZGF0YSwgdGhyZWFkKTsKKworICAgIC8vIFRPRE86IEdFSCAtIG1ha2Ugc3VyZSByb290IHRlYW0gaW1wbGljaXQgdGFzayBpcyBpbml0aWFsaXplZCBwcm9wZXJseS4KKyAgICAvLyBLTVBfREVCVUdfQVNTRVJUKCByZXN1bWVkX3Rhc2stPnRkX2ZsYWdzLmV4ZWN1dGluZyA9PSAwICk7CisgICAgcmVzdW1lZF90YXNrLT50ZF9mbGFncy5leGVjdXRpbmcgPSAxOyAgLy8gcmVzdW1lIHByZXZpb3VzIHRhc2sKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3Rhc2tfZmluaXNoKGV4aXQpOiBUIyVkIGZpbmlzaGVkIHRhc2sgJXAsIHJlc3VtaW5nIHRhc2sgJXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0YXNrZGF0YSwgcmVzdW1lZF90YXNrKSApOworCisgICAgcmV0dXJuOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBjX29tcF90YXNrX2NvbXBsZXRlX2lmMDogcmVwb3J0IHRoYXQgYSB0YXNrIGhhcyBjb21wbGV0ZWQgZXhlY3V0aW9uCisvLyBsb2NfcmVmOiBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb247IHBvaW50cyB0byBlbmQgb2YgdGFzayBibG9jay4KKy8vIGd0aWQ6IGdsb2JhbCB0aHJlYWQgbnVtYmVyLgorLy8gdGFzazogdGFzayB0aHVuayBmb3IgdGhlIGNvbXBsZXRlZCB0YXNrLgorCit2b2lkCitfX2ttcGNfb21wX3Rhc2tfY29tcGxldGVfaWYwKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqdGFzayApCit7CisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrX2NvbXBsZXRlX2lmMChlbnRlcik6IFQjJWQgbG9jPSVwIHRhc2s9JXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBsb2NfcmVmLCBLTVBfVEFTS19UT19UQVNLREFUQSh0YXNrKSApICk7CisKKyAgICBfX2ttcF90YXNrX2ZpbmlzaCggZ3RpZCwgdGFzaywgTlVMTCApOyAgLy8gdGhpcyByb3V0aW5lIHdpbGwgcHJvdmlkZSB0YXNrIHRvIHJlc3VtZQorCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrX2NvbXBsZXRlX2lmMChleGl0KTogVCMlZCBsb2M9JXAgdGFzaz0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIGxvY19yZWYsIEtNUF9UQVNLX1RPX1RBU0tEQVRBKHRhc2spICkgKTsKKworICAgIHJldHVybjsKK30KKworI2lmZGVmIFRBU0tfVU5VU0VECisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBjX29tcF90YXNrX2NvbXBsZXRlOiByZXBvcnQgdGhhdCBhIHRhc2sgaGFzIGNvbXBsZXRlZCBleGVjdXRpb24KKy8vIE5FVkVSIEdFTkVSQVRFRCBCWSBDT01QSUxFUiwgREVQUkVDQVRFRCEhIQorCit2b2lkCitfX2ttcGNfb21wX3Rhc2tfY29tcGxldGUoIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICp0YXNrICkKK3sKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3Rhc2tfY29tcGxldGUoZW50ZXIpOiBUIyVkIGxvYz0lcCB0YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgbG9jX3JlZiwgS01QX1RBU0tfVE9fVEFTS0RBVEEodGFzaykgKSApOworCisgICAgX19rbXBfdGFza19maW5pc2goIGd0aWQsIHRhc2ssIE5VTEwgKTsgIC8vIE5vdCBzdXJlIGhvdyB0byBmaW5kIHRhc2sgdG8gcmVzdW1lCisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3Rhc2tfY29tcGxldGUoZXhpdCk6IFQjJWQgbG9jPSVwIHRhc2s9JXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBsb2NfcmVmLCBLTVBfVEFTS19UT19UQVNLREFUQSh0YXNrKSApICk7CisgICAgcmV0dXJuOworfQorI2VuZGlmIC8vIFRBU0tfVU5VU0VECisKKworI2lmIE9NUFRfU1VQUE9SVAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF90YXNrX2luaXRfb21wdDoKKy8vICAgSW5pdGlhbGl6ZSBPTVBUIGZpZWxkcyBtYWludGFpbmVkIGJ5IGEgdGFzay4gVGhpcyB3aWxsIG9ubHkgYmUgY2FsbGVkIGFmdGVyCisvLyAgIG9tcHRfdG9vbCwgc28gd2UgYWxyZWFkeSBrbm93IHdoZXRoZXIgb21wdCBpcyBlbmFibGVkIG9yIG5vdC4KKworc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF90YXNrX2luaXRfb21wdCgga21wX3Rhc2tkYXRhX3QgKiB0YXNrLCBpbnQgdGlkLCB2b2lkICogZnVuY3Rpb24gKQoreworICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgdGFzay0+b21wdF90YXNrX2luZm8udGFza19pZCA9IF9fb21wdF90YXNrX2lkX25ldyh0aWQpOworICAgICAgICB0YXNrLT5vbXB0X3Rhc2tfaW5mby5mdW5jdGlvbiA9IGZ1bmN0aW9uOworICAgICAgICB0YXNrLT5vbXB0X3Rhc2tfaW5mby5mcmFtZS5leGl0X3J1bnRpbWVfZnJhbWUgPSBOVUxMOworICAgICAgICB0YXNrLT5vbXB0X3Rhc2tfaW5mby5mcmFtZS5yZWVudGVyX3J1bnRpbWVfZnJhbWUgPSBOVUxMOworICAgIH0KK30KKyNlbmRpZgorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfaW5pdF9pbXBsaWNpdF90YXNrOiBJbml0aWFsaXplIHRoZSBhcHByb3ByaWF0ZSBmaWVsZHMgaW4gdGhlIGltcGxpY2l0IHRhc2sgZm9yIGEgZ2l2ZW4gdGhyZWFkCisvLworLy8gbG9jX3JlZjogIHJlZmVyZW5jZSB0byBzb3VyY2UgbG9jYXRpb24gb2YgcGFyYWxsZWwgcmVnaW9uCisvLyB0aGlzX3RocjogIHRocmVhZCBkYXRhIHN0cnVjdHVyZSBjb3JyZXNwb25kaW5nIHRvIGltcGxpY2l0IHRhc2sKKy8vIHRlYW06IHRlYW0gZm9yIHRoaXNfdGhyCisvLyB0aWQ6IHRocmVhZCBpZCBvZiBnaXZlbiB0aHJlYWQgd2l0aGluIHRlYW0KKy8vIHNldF9jdXJyX3Rhc2s6IFRSVUUgaWYgbmVlZCB0byBwdXNoIGN1cnJlbnQgdGFzayB0byB0aHJlYWQKKy8vIE5PVEU6IFJvdXRpbmUgZG9lcyBub3Qgc2V0IHVwIHRoZSBpbXBsaWNpdCB0YXNrIElDVlMuICBUaGlzIGlzIGFzc3VtZWQgdG8gaGF2ZSBhbHJlYWR5IGJlZW4gZG9uZSBlbHNld2hlcmUuCisvLyBUT0RPOiBHZXQgYmV0dGVyIGxvY19yZWYuICBWYWx1ZSBwYXNzZWQgaW4gbWF5IGJlIE5VTEwKKwordm9pZAorX19rbXBfaW5pdF9pbXBsaWNpdF90YXNrKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW5mb190ICp0aGlzX3Rociwga21wX3RlYW1fdCAqdGVhbSwgaW50IHRpZCwgaW50IHNldF9jdXJyX3Rhc2sgKQoreworICAgIGttcF90YXNrZGF0YV90ICogdGFzayAgID0gJiB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVsgdGlkIF07CisKKyAgICBLRl9UUkFDRSgxMCwgKCJfX2ttcF9pbml0X2ltcGxpY2l0X3Rhc2soZW50ZXIpOiBUIzolZCB0ZWFtPSVwIHRhc2s9JXAsIHJlaW5pdD0lc1xuIiwKKyAgICAgICAgICAgICAgICAgIHRpZCwgdGVhbSwgdGFzaywgc2V0X2N1cnJfdGFzayA/ICJUUlVFIiA6ICJGQUxTRSIgKSApOworCisgICAgdGFzay0+dGRfdGFza19pZCAgPSBLTVBfR0VOX1RBU0tfSUQoKTsKKyAgICB0YXNrLT50ZF90ZWFtICAgICA9IHRlYW07CisvLyAgICB0YXNrLT50ZF9wYXJlbnQgICA9IE5VTEw7ICAvLyBmaXggZm9yIENRMjMwMTAxIChicm9rZW4gcGFyZW50IHRhc2sgaW5mbyBpbiBkZWJ1Z2dlcikKKyAgICB0YXNrLT50ZF9pZGVudCAgICA9IGxvY19yZWY7CisgICAgdGFzay0+dGRfdGFza3dhaXRfaWRlbnQgICA9IE5VTEw7CisgICAgdGFzay0+dGRfdGFza3dhaXRfY291bnRlciA9IDA7CisgICAgdGFzay0+dGRfdGFza3dhaXRfdGhyZWFkICA9IDA7CisKKyAgICB0YXNrLT50ZF9mbGFncy50aWVkbmVzcyAgICA9IFRBU0tfVElFRDsKKyAgICB0YXNrLT50ZF9mbGFncy50YXNrdHlwZSAgICA9IFRBU0tfSU1QTElDSVQ7CisjaWYgT01QXzQxX0VOQUJMRUQKKyAgICB0YXNrLT50ZF9mbGFncy5wcm94eSAgICAgICA9IFRBU0tfRlVMTDsKKyNlbmRpZgorCisgICAgLy8gQWxsIGltcGxpY2l0IHRhc2tzIGFyZSBleGVjdXRlZCBpbW1lZGlhdGVseSwgbm90IGRlZmVycmVkCisgICAgdGFzay0+dGRfZmxhZ3MudGFza19zZXJpYWwgPSAxOworICAgIHRhc2stPnRkX2ZsYWdzLnRhc2tpbmdfc2VyID0gKCBfX2ttcF90YXNraW5nX21vZGUgPT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApOworICAgIHRhc2stPnRkX2ZsYWdzLnRlYW1fc2VyaWFsID0gKCB0ZWFtLT50LnRfc2VyaWFsaXplZCApID8gMSA6IDA7CisKKyAgICB0YXNrLT50ZF9mbGFncy5zdGFydGVkICAgICA9IDE7CisgICAgdGFzay0+dGRfZmxhZ3MuZXhlY3V0aW5nICAgPSAxOworICAgIHRhc2stPnRkX2ZsYWdzLmNvbXBsZXRlICAgID0gMDsKKyAgICB0YXNrLT50ZF9mbGFncy5mcmVlZCAgICAgICA9IDA7CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIHRhc2stPnRkX2RlcGhhc2ggPSBOVUxMOworICAgIHRhc2stPnRkX2RlcG5vZGUgPSBOVUxMOworI2VuZGlmCisKKyAgICBpZiAoc2V0X2N1cnJfdGFzaykgeyAgLy8gb25seSBkbyB0aGlzIGluaXRpYWxpemF0aW9uIHRoZSBmaXJzdCB0aW1lIGEgdGhyZWFkIGlzIGNyZWF0ZWQKKyAgICAgICAgdGFzay0+dGRfaW5jb21wbGV0ZV9jaGlsZF90YXNrcyA9IDA7CisgICAgICAgIHRhc2stPnRkX2FsbG9jYXRlZF9jaGlsZF90YXNrcyAgPSAwOyAvLyBOb3QgdXNlZCBiZWNhdXNlIGRvIG5vdCBuZWVkIHRvIGRlYWxsb2NhdGUgaW1wbGljaXQgdGFzaworI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgIHRhc2stPnRkX3Rhc2tncm91cCA9IE5VTEw7ICAgICAgICAgICAvLyBBbiBpbXBsaWNpdCB0YXNrIGRvZXMgbm90IGhhdmUgdGFza2dyb3VwCisjZW5kaWYKKyAgICAgICAgX19rbXBfcHVzaF9jdXJyZW50X3Rhc2tfdG9fdGhyZWFkKCB0aGlzX3RociwgdGVhbSwgdGlkICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0YXNrLT50ZF9pbmNvbXBsZXRlX2NoaWxkX3Rhc2tzID09IDApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHRhc2stPnRkX2FsbG9jYXRlZF9jaGlsZF90YXNrcyAgPT0gMCk7CisgICAgfQorCisjaWYgT01QVF9TVVBQT1JUCisgICAgX19rbXBfdGFza19pbml0X29tcHQodGFzaywgdGlkLCBOVUxMKTsKKyNlbmRpZgorCisgICAgS0ZfVFJBQ0UoMTAsICgiX19rbXBfaW5pdF9pbXBsaWNpdF90YXNrKGV4aXQpOiBUIzolZCB0ZWFtPSVwIHRhc2s9JXBcbiIsCisgICAgICAgICAgICAgICAgICB0aWQsIHRlYW0sIHRhc2sgKSApOworfQorCisvLyBSb3VuZCB1cCBhIHNpemUgdG8gYSBwb3dlciBvZiB0d28gc3BlY2lmaWVkIGJ5IHZhbAorLy8gVXNlZCB0byBpbnNlcnQgcGFkZGluZyBiZXR3ZWVuIHN0cnVjdHVyZXMgY28tYWxsb2NhdGVkIHVzaW5nIGEgc2luZ2xlIG1hbGxvYygpIGNhbGwKK3N0YXRpYyBzaXplX3QKK19fa21wX3JvdW5kX3VwX3RvX3ZhbCggc2l6ZV90IHNpemUsIHNpemVfdCB2YWwgKSB7CisgICAgaWYgKCBzaXplICYgKCB2YWwgLSAxICkgKSB7CisgICAgICAgIHNpemUgJj0gfiAoIHZhbCAtIDEgKTsKKyAgICAgICAgaWYgKCBzaXplIDw9IEtNUF9TSVpFX1RfTUFYIC0gdmFsICkgeworICAgICAgICAgICAgc2l6ZSArPSB2YWw7ICAgIC8vIFJvdW5kIHVwIGlmIHRoZXJlIGlzIG5vIG92ZXJmbG93LgorICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGlmCisgICAgcmV0dXJuIHNpemU7Cit9IC8vIF9fa21wX3JvdW5kX3VwX3RvX3ZhCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX3Rhc2tfYWxsb2M6IEFsbG9jYXRlIHRoZSB0YXNrZGF0YSBhbmQgdGFzayBkYXRhIHN0cnVjdHVyZXMgZm9yIGEgdGFzaworLy8KKy8vIGxvY19yZWY6IHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorLy8gZ3RpZDogZ2xvYmFsIHRocmVhZCBudW1iZXIuCisvLyBmbGFnczogaW5jbHVkZSB0aWVkbmVzcyAmIHRhc2sgdHlwZSAoZXhwbGljaXQgdnMuIGltcGxpY2l0KSBvZiB0aGUgJyduZXcnJyB0YXNrIGVuY291bnRlcmVkLgorLy8gICAgICAgIENvbnZlcnRlZCBmcm9tIGttcF9pbnQzMiB0byBrbXBfdGFza2luZ19mbGFnc190IGluIHJvdXRpbmUuCisvLyBzaXplb2Zfa21wX3Rhc2tfdDogIFNpemUgaW4gYnl0ZXMgb2Yga21wX3Rhc2tfdCBkYXRhIHN0cnVjdHVyZSBpbmNsdWRpbmcgcHJpdmF0ZSB2YXJzIGFjY2Vzc2VkIGluIHRhc2suCisvLyBzaXplb2Zfc2hhcmVkczogIFNpemUgaW4gYnl0ZXMgb2YgYXJyYXkgb2YgcG9pbnRlcnMgdG8gc2hhcmVkIHZhcnMgYWNjZXNzZWQgaW4gdGFzay4KKy8vIHRhc2tfZW50cnk6IFBvaW50ZXIgdG8gdGFzayBjb2RlIGVudHJ5IHBvaW50IGdlbmVyYXRlZCBieSBjb21waWxlci4KKy8vIHJldHVybnM6IGEgcG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIGttcF90YXNrX3Qgc3RydWN0dXJlICh0YXNrKS4KKwora21wX3Rhc2tfdCAqCitfX2ttcF90YXNrX2FsbG9jKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tpbmdfZmxhZ3NfdCAqZmxhZ3MsCisgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZW9mX2ttcF90YXNrX3QsIHNpemVfdCBzaXplb2Zfc2hhcmVkcywKKyAgICAgICAgICAgICAgICAgIGttcF9yb3V0aW5lX2VudHJ5X3QgdGFza19lbnRyeSApCit7CisgICAga21wX3Rhc2tfdCAqdGFzazsKKyAgICBrbXBfdGFza2RhdGFfdCAqdGFza2RhdGE7CisgICAga21wX2luZm9fdCAqdGhyZWFkID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIGttcF90ZWFtX3QgKnRlYW0gPSB0aHJlYWQtPnRoLnRoX3RlYW07CisgICAga21wX3Rhc2tkYXRhX3QgKnBhcmVudF90YXNrID0gdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2s7CisgICAgc2l6ZV90IHNoYXJlZHNfb2Zmc2V0OworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfdGFza19hbGxvYyhlbnRlcik6IFQjJWQgbG9jPSVwLCBmbGFncz0oMHgleCkgIgorICAgICAgICAgICAgICAgICAgInNpemVvZl90YXNrPSVsZCBzaXplb2Zfc2hhcmVkPSVsZCBlbnRyeT0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIGxvY19yZWYsICooKGttcF9pbnQzMiAqKWZsYWdzKSwgc2l6ZW9mX2ttcF90YXNrX3QsCisgICAgICAgICAgICAgICAgICBzaXplb2Zfc2hhcmVkcywgdGFza19lbnRyeSkgKTsKKworICAgIGlmICggcGFyZW50X3Rhc2stPnRkX2ZsYWdzLmZpbmFsICkgeworICAgICAgICBpZiAoZmxhZ3MtPm1lcmdlZF9pZjApIHsKKyAgICAgICAgfQorICAgICAgICBmbGFncy0+ZmluYWwgPSAxOworICAgIH0KKworI2lmIE9NUF80MV9FTkFCTEVECisgICAgaWYgKCBmbGFncy0+cHJveHkgPT0gVEFTS19QUk9YWSApIHsKKyAgICAgICAgZmxhZ3MtPnRpZWRuZXNzID0gVEFTS19VTlRJRUQ7CisgICAgICAgIGZsYWdzLT5tZXJnZWRfaWYwID0gMTsKKworICAgICAgICAvKiBhcmUgd2UgcnVubmluZyBpbiBhIHNlcXVlbnRpYWwgcGFyYWxsZWwgb3IgdHNrbV9pbW1lZGlhdGVfZXhlYy4uLiB3ZSBuZWVkIHRhc2tpbmcgc3VwcG9ydCBlbmFibGVkICovCisgICAgICAgIGlmICggKHRocmVhZC0+dGgudGhfdGFza190ZWFtKSA9PSBOVUxMICkgeworICAgICAgICAgICAgLyogVGhpcyBzaG91bGQgb25seSBoYXBwZW4gaWYgdGhlIHRlYW0gaXMgc2VyaWFsaXplZAorICAgICAgICAgICAgICAgIHNldHVwIGEgdGFzayB0ZWFtIGFuZCBwcm9wYWdhdGUgaXQgdG8gdGhlIHRocmVhZAorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGVhbS0+dC50X3NlcmlhbGl6ZWQpOworICAgICAgICAgICAgS0FfVFJBQ0UoMzAsKCJUIyVkIGNyZWF0aW5nIHRhc2sgdGVhbSBpbiBfX2ttcF90YXNrX2FsbG9jIGZvciBwcm94eSB0YXNrXG4iLCBndGlkKSk7CisgICAgICAgICAgICBfX2ttcF90YXNrX3RlYW1fc2V0dXAodGhyZWFkLHRlYW0sMSk7IC8vIDEgaW5kaWNhdGVzIHNldHVwIHRoZSBjdXJyZW50IHRlYW0gcmVnYXJkbGVzcyBvZiBudGhyZWFkcworICAgICAgICAgICAgdGhyZWFkLT50aC50aF90YXNrX3RlYW0gPSB0ZWFtLT50LnRfdGFza190ZWFtW3RocmVhZC0+dGgudGhfdGFza19zdGF0ZV07CisgICAgICAgIH0KKyAgICAgICAga21wX3Rhc2tfdGVhbV90ICogdGFza190ZWFtID0gdGhyZWFkLT50aC50aF90YXNrX3RlYW07CisKKyAgICAgICAgLyogdGFza2luZyBtdXN0IGJlIGVuYWJsZWQgbm93IGFzIHRoZSB0YXNrIG1pZ2h0IG5vdCBiZSBwdXNoZWQgKi8KKyAgICAgICAgaWYgKCAhS01QX1RBU0tJTkdfRU5BQkxFRCggdGFza190ZWFtICkgKSB7CisgICAgICAgICAgICBLQV9UUkFDRSgzMCwoIlQjJWQgZW5hYmxpbmcgdGFza2luZyBpbiBfX2ttcF90YXNrX2FsbG9jIGZvciBwcm94eSB0YXNrXG4iLCBndGlkKSk7CisgICAgICAgICAgICBfX2ttcF9lbmFibGVfdGFza2luZyggdGFza190ZWFtLCB0aHJlYWQgKTsKKyAgICAgICAgICAgIGttcF9pbnQzMiB0aWQgPSB0aHJlYWQtPnRoLnRoX2luZm8uZHMuZHNfdGlkOworICAgICAgICAgICAga21wX3RocmVhZF9kYXRhX3QgKiB0aHJlYWRfZGF0YSA9ICYgdGFza190ZWFtIC0+IHR0LnR0X3RocmVhZHNfZGF0YVsgdGlkIF07CisgICAgICAgICAgICAvLyBObyBsb2NrIG5lZWRlZCBzaW5jZSBvbmx5IG93bmVyIGNhbiBhbGxvY2F0ZQorICAgICAgICAgICAgaWYgKHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlID09IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfYWxsb2NfdGFza19kZXF1ZSggdGhyZWFkLCB0aHJlYWRfZGF0YSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCB0YXNrX3RlYW0tPnR0LnR0X2ZvdW5kX3Byb3h5X3Rhc2tzID09IEZBTFNFICkKKyAgICAgICAgICBUQ1dfNCh0YXNrX3RlYW0gLT4gdHQudHRfZm91bmRfcHJveHlfdGFza3MsIFRSVUUpOworICAgIH0KKyNlbmRpZgorCisgICAgLy8gQ2FsY3VsYXRlIHNoYXJlZCBzdHJ1Y3R1cmUgb2Zmc2V0IGluY2x1ZGluZyBwYWRkaW5nIGFmdGVyIGttcF90YXNrX3Qgc3RydWN0CisgICAgLy8gdG8gYWxpZ24gcG9pbnRlcnMgaW4gc2hhcmVkIHN0cnVjdAorICAgIHNoYXJlZHNfb2Zmc2V0ID0gc2l6ZW9mKCBrbXBfdGFza2RhdGFfdCApICsgc2l6ZW9mX2ttcF90YXNrX3Q7CisgICAgc2hhcmVkc19vZmZzZXQgPSBfX2ttcF9yb3VuZF91cF90b192YWwoIHNoYXJlZHNfb2Zmc2V0LCBzaXplb2YoIHZvaWQgKiApKTsKKworICAgIC8vIEFsbG9jYXRlIGEga21wX3Rhc2tkYXRhX3QgYmxvY2sgYW5kIGEga21wX3Rhc2tfdCBibG9jay4KKyAgICBLQV9UUkFDRSgzMCwgKCJfX2ttcF90YXNrX2FsbG9jOiBUIyVkIEZpcnN0IG1hbGxvYyBzaXplOiAlbGRcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBzaGFyZWRzX29mZnNldCkgKTsKKyAgICBLQV9UUkFDRSgzMCwgKCJfX2ttcF90YXNrX2FsbG9jOiBUIyVkIFNlY29uZCBtYWxsb2Mgc2l6ZTogJWxkXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgc2l6ZW9mX3NoYXJlZHMpICk7CisKKyAgICAvLyBBdm9pZCBkb3VibGUgYWxsb2NhdGlvbiBoZXJlIGJ5IGNvbWJpbmluZyBzaGFyZWRzIHdpdGggdGFza2RhdGEKKyAgICAjaWYgVVNFX0ZBU1RfTUVNT1JZCisgICAgdGFza2RhdGEgPSAoa21wX3Rhc2tkYXRhX3QgKikgX19rbXBfZmFzdF9hbGxvY2F0ZSggdGhyZWFkLCBzaGFyZWRzX29mZnNldCArIHNpemVvZl9zaGFyZWRzICk7CisgICAgI2Vsc2UgLyogISBVU0VfRkFTVF9NRU1PUlkgKi8KKyAgICB0YXNrZGF0YSA9IChrbXBfdGFza2RhdGFfdCAqKSBfX2ttcF90aHJlYWRfbWFsbG9jKCB0aHJlYWQsIHNoYXJlZHNfb2Zmc2V0ICsgc2l6ZW9mX3NoYXJlZHMgKTsKKyAgICAjZW5kaWYgLyogVVNFX0ZBU1RfTUVNT1JZICovCisKKyAgICB0YXNrICAgICAgICAgICAgICAgICAgICAgID0gS01QX1RBU0tEQVRBX1RPX1RBU0sodGFza2RhdGEpOworCisgICAgLy8gTWFrZSBzdXJlIHRhc2sgJiB0YXNrZGF0YSBhcmUgYWxpZ25lZCBhcHByb3ByaWF0ZWx5CisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1BQQzY0IHx8ICFLTVBfSEFWRV9RVUFECisgICAgS01QX0RFQlVHX0FTU0VSVCggKCAoKGttcF91aW50cHRyX3QpdGFza2RhdGEpICYgKHNpemVvZihkb3VibGUpLTEpICkgPT0gMCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoICggKChrbXBfdWludHB0cl90KXRhc2spICYgKHNpemVvZihkb3VibGUpLTEpICkgPT0gMCApOworI2Vsc2UKKyAgICBLTVBfREVCVUdfQVNTRVJUKCAoICgoa21wX3VpbnRwdHJfdCl0YXNrZGF0YSkgJiAoc2l6ZW9mKF9RdWFkKS0xKSApID09IDAgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCAoICgoa21wX3VpbnRwdHJfdCl0YXNrKSAmIChzaXplb2YoX1F1YWQpLTEpICkgPT0gMCApOworI2VuZGlmCisgICAgaWYgKHNpemVvZl9zaGFyZWRzID4gMCkgeworICAgICAgICAvLyBBdm9pZCBkb3VibGUgYWxsb2NhdGlvbiBoZXJlIGJ5IGNvbWJpbmluZyBzaGFyZWRzIHdpdGggdGFza2RhdGEKKyAgICAgICAgdGFzay0+c2hhcmVkcyAgICAgICAgID0gJiAoKGNoYXIgKikgdGFza2RhdGEpWyBzaGFyZWRzX29mZnNldCBdOworICAgICAgICAvLyBNYWtlIHN1cmUgc2hhcmVkcyBzdHJ1Y3QgaXMgYWxpZ25lZCB0byBwb2ludGVyIHNpemUKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggKCAoKGttcF91aW50cHRyX3QpdGFzay0+c2hhcmVkcykgJiAoc2l6ZW9mKHZvaWQgKiktMSkgKSA9PSAwICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGFzay0+c2hhcmVkcyAgICAgICAgID0gTlVMTDsKKyAgICB9CisgICAgdGFzay0+cm91dGluZSAgICAgICAgICAgICA9IHRhc2tfZW50cnk7CisgICAgdGFzay0+cGFydF9pZCAgICAgICAgICAgICA9IDA7ICAgICAgLy8gQUM6IEFsd2F5cyBzdGFydCB3aXRoIDAgcGFydCBpZAorCisgICAgdGFza2RhdGEtPnRkX3Rhc2tfaWQgICAgICA9IEtNUF9HRU5fVEFTS19JRCgpOworICAgIHRhc2tkYXRhLT50ZF90ZWFtICAgICAgICAgPSB0ZWFtOworICAgIHRhc2tkYXRhLT50ZF9hbGxvY190aHJlYWQgPSB0aHJlYWQ7CisgICAgdGFza2RhdGEtPnRkX3BhcmVudCAgICAgICA9IHBhcmVudF90YXNrOworICAgIHRhc2tkYXRhLT50ZF9sZXZlbCAgICAgICAgPSBwYXJlbnRfdGFzay0+dGRfbGV2ZWwgKyAxOyAvLyBpbmNyZW1lbnQgbmVzdGluZyBsZXZlbAorICAgIHRhc2tkYXRhLT50ZF9pZGVudCAgICAgICAgPSBsb2NfcmVmOworICAgIHRhc2tkYXRhLT50ZF90YXNrd2FpdF9pZGVudCAgID0gTlVMTDsKKyAgICB0YXNrZGF0YS0+dGRfdGFza3dhaXRfY291bnRlciA9IDA7CisgICAgdGFza2RhdGEtPnRkX3Rhc2t3YWl0X3RocmVhZCAgPSAwOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhLT50ZF9wYXJlbnQgIT0gTlVMTCApOworI2lmIE9NUF80MV9FTkFCTEVECisgICAgLy8gYXZvaWQgY29weWluZyBpY3ZzIGZvciBwcm94eSB0YXNrcworICAgIGlmICggZmxhZ3MtPnByb3h5ID09IFRBU0tfRlVMTCApCisjZW5kaWYKKyAgICAgICBjb3B5X2ljdnMoICZ0YXNrZGF0YS0+dGRfaWN2cywgJnRhc2tkYXRhLT50ZF9wYXJlbnQtPnRkX2ljdnMgKTsKKworICAgIHRhc2tkYXRhLT50ZF9mbGFncy50aWVkbmVzcyAgICA9IGZsYWdzLT50aWVkbmVzczsKKyAgICB0YXNrZGF0YS0+dGRfZmxhZ3MuZmluYWwgICAgICAgPSBmbGFncy0+ZmluYWw7CisgICAgdGFza2RhdGEtPnRkX2ZsYWdzLm1lcmdlZF9pZjAgID0gZmxhZ3MtPm1lcmdlZF9pZjA7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICB0YXNrZGF0YS0+dGRfZmxhZ3MuZGVzdHJ1Y3RvcnNfdGh1bmsgPSBmbGFncy0+ZGVzdHJ1Y3RvcnNfdGh1bms7CisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKyNpZiBPTVBfNDFfRU5BQkxFRAorICAgIHRhc2tkYXRhLT50ZF9mbGFncy5wcm94eSAgICAgICAgICAgPSBmbGFncy0+cHJveHk7CisjZW5kaWYKKyAgICB0YXNrZGF0YS0+dGRfZmxhZ3MudGFza3R5cGUgICAgPSBUQVNLX0VYUExJQ0lUOworCisgICAgLy8gR0VIIC0gVE9ETzogZml4IHRoaXMgdG8gY29weSBwYXJlbnQgdGFzaydzIHZhbHVlIG9mIHRhc2tpbmdfc2VyIGZsYWcKKyAgICB0YXNrZGF0YS0+dGRfZmxhZ3MudGFza2luZ19zZXIgPSAoIF9fa21wX3Rhc2tpbmdfbW9kZSA9PSB0c2ttX2ltbWVkaWF0ZV9leGVjICk7CisKKyAgICAvLyBHRUggLSBUT0RPOiBmaXggdGhpcyB0byBjb3B5IHBhcmVudCB0YXNrJ3MgdmFsdWUgb2YgdGVhbV9zZXJpYWwgZmxhZworICAgIHRhc2tkYXRhLT50ZF9mbGFncy50ZWFtX3NlcmlhbCA9ICggdGVhbS0+dC50X3NlcmlhbGl6ZWQgKSA/IDEgOiAwOworCisgICAgLy8gR0VIIC0gTm90ZSB3ZSBzZXJpYWxpemUgdGhlIHRhc2sgaWYgdGhlIHRlYW0gaXMgc2VyaWFsaXplZCB0byBtYWtlIHN1cmUgaW1wbGljaXQgcGFyYWxsZWwgcmVnaW9uCisgICAgLy8gICAgICAgdGFza3MgYXJlIG5vdCBsZWZ0IHVudGlsIHByb2dyYW0gdGVybWluYXRpb24gdG8gZXhlY3V0ZS4gIEFsc28sIGl0IGhlbHBzIGxvY2FsaXR5IHRvIGV4ZWN1dGUKKyAgICAvLyAgICAgICBpbW1lZGlhdGVseS4KKyAgICB0YXNrZGF0YS0+dGRfZmxhZ3MudGFza19zZXJpYWwgPSAoIHBhcmVudF90YXNrLT50ZF9mbGFncy5maW5hbAorICAgICAgfHwgdGFza2RhdGEtPnRkX2ZsYWdzLnRlYW1fc2VyaWFsIHx8IHRhc2tkYXRhLT50ZF9mbGFncy50YXNraW5nX3NlciApOworCisgICAgdGFza2RhdGEtPnRkX2ZsYWdzLnN0YXJ0ZWQgICAgID0gMDsKKyAgICB0YXNrZGF0YS0+dGRfZmxhZ3MuZXhlY3V0aW5nICAgPSAwOworICAgIHRhc2tkYXRhLT50ZF9mbGFncy5jb21wbGV0ZSAgICA9IDA7CisgICAgdGFza2RhdGEtPnRkX2ZsYWdzLmZyZWVkICAgICAgID0gMDsKKworICAgIHRhc2tkYXRhLT50ZF9mbGFncy5uYXRpdmUgICAgICA9IGZsYWdzLT5uYXRpdmU7CisKKyAgICB0YXNrZGF0YS0+dGRfaW5jb21wbGV0ZV9jaGlsZF90YXNrcyA9IDA7CisgICAgdGFza2RhdGEtPnRkX2FsbG9jYXRlZF9jaGlsZF90YXNrcyAgPSAxOyAvLyBzdGFydCBhdCBvbmUgYmVjYXVzZSBjb3VudHMgY3VycmVudCB0YXNrIGFuZCBjaGlsZHJlbgorI2lmIE9NUF80MF9FTkFCTEVECisgICAgdGFza2RhdGEtPnRkX3Rhc2tncm91cCA9IHBhcmVudF90YXNrLT50ZF90YXNrZ3JvdXA7IC8vIHRhc2sgaW5oZXJpdHMgdGhlIHRhc2tncm91cCBmcm9tIHRoZSBwYXJlbnQgdGFzaworICAgIHRhc2tkYXRhLT50ZF9kZXBoYXNoID0gTlVMTDsKKyAgICB0YXNrZGF0YS0+dGRfZGVwbm9kZSA9IE5VTEw7CisjZW5kaWYKKworICAgIC8vIE9ubHkgbmVlZCB0byBrZWVwIHRyYWNrIG9mIGNoaWxkIHRhc2sgY291bnRzIGlmIHRlYW0gcGFyYWxsZWwgYW5kIHRhc2tpbmcgbm90IHNlcmlhbGl6ZWQgb3IgaWYgaXQgaXMgYSBwcm94eSB0YXNrCisjaWYgT01QXzQxX0VOQUJMRUQKKyAgICBpZiAoIGZsYWdzLT5wcm94eSA9PSBUQVNLX1BST1hZIHx8ICEoIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLnRlYW1fc2VyaWFsIHx8IHRhc2tkYXRhIC0+IHRkX2ZsYWdzLnRhc2tpbmdfc2VyICkgKSAKKyNlbHNlCisgICAgaWYgKCAhKCB0YXNrZGF0YSAtPiB0ZF9mbGFncy50ZWFtX3NlcmlhbCB8fCB0YXNrZGF0YSAtPiB0ZF9mbGFncy50YXNraW5nX3NlciApICkgCisjZW5kaWYKKyAgICB7CisgICAgICAgIEtNUF9URVNUX1RIRU5fSU5DMzIoIChrbXBfaW50MzIgKikoJiBwYXJlbnRfdGFzay0+dGRfaW5jb21wbGV0ZV9jaGlsZF90YXNrcykgKTsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICBpZiAoIHBhcmVudF90YXNrLT50ZF90YXNrZ3JvdXAgKQorICAgICAgICAgICAgS01QX1RFU1RfVEhFTl9JTkMzMiggKGttcF9pbnQzMiAqKSgmIHBhcmVudF90YXNrLT50ZF90YXNrZ3JvdXAtPmNvdW50KSApOworI2VuZGlmCisgICAgICAgIC8vIE9ubHkgbmVlZCB0byBrZWVwIHRyYWNrIG9mIGFsbG9jYXRlZCBjaGlsZCB0YXNrcyBmb3IgZXhwbGljaXQgdGFza3Mgc2luY2UgaW1wbGljaXQgbm90IGRlYWxsb2NhdGVkCisgICAgICAgIGlmICggdGFza2RhdGEtPnRkX3BhcmVudC0+dGRfZmxhZ3MudGFza3R5cGUgPT0gVEFTS19FWFBMSUNJVCApIHsKKyAgICAgICAgICAgIEtNUF9URVNUX1RIRU5fSU5DMzIoIChrbXBfaW50MzIgKikoJiB0YXNrZGF0YS0+dGRfcGFyZW50LT50ZF9hbGxvY2F0ZWRfY2hpbGRfdGFza3MpICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF90YXNrX2FsbG9jKGV4aXQpOiBUIyVkIGNyZWF0ZWQgdGFzayAlcCBwYXJlbnQ9JXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0YXNrZGF0YSwgdGFza2RhdGEtPnRkX3BhcmVudCkgKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIF9fa21wX3Rhc2tfaW5pdF9vbXB0KHRhc2tkYXRhLCBndGlkLCAodm9pZCopIHRhc2tfZW50cnkpOworI2VuZGlmCisKKyAgICByZXR1cm4gdGFzazsKK30KKworCitrbXBfdGFza190ICoKK19fa21wY19vbXBfdGFza19hbGxvYyggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemVvZl9rbXBfdGFza190LCBzaXplX3Qgc2l6ZW9mX3NoYXJlZHMsCisgICAgICAgICAgICAgICAgICAgICAgIGttcF9yb3V0aW5lX2VudHJ5X3QgdGFza19lbnRyeSApCit7CisgICAga21wX3Rhc2tfdCAqcmV0dmFsOworICAgIGttcF90YXNraW5nX2ZsYWdzX3QgKmlucHV0X2ZsYWdzID0gKGttcF90YXNraW5nX2ZsYWdzX3QgKikgJiBmbGFnczsKKworICAgIGlucHV0X2ZsYWdzLT5uYXRpdmUgPSBGQUxTRTsKKyAgICAvLyBfX2ttcF90YXNrX2FsbG9jKCkgc2V0cyB1cCBhbGwgb3RoZXIgcnVudGltZSBmbGFncworCisjaWYgT01QXzQxX0VOQUJMRUQKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3Rhc2tfYWxsb2MoZW50ZXIpOiBUIyVkIGxvYz0lcCwgZmxhZ3M9KCVzICVzKSAiCisgICAgICAgICAgICAgICAgICAic2l6ZW9mX3Rhc2s9JWxkIHNpemVvZl9zaGFyZWQ9JWxkIGVudHJ5PSVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgbG9jX3JlZiwgaW5wdXRfZmxhZ3MtPnRpZWRuZXNzID8gInRpZWQgICIgOiAidW50aWVkIiwKKyAgICAgICAgICAgICAgICAgIGlucHV0X2ZsYWdzLT5wcm94eSA/ICJwcm94eSIgOiAiIiwKKyAgICAgICAgICAgICAgICAgIHNpemVvZl9rbXBfdGFza190LCBzaXplb2Zfc2hhcmVkcywgdGFza19lbnRyeSkgKTsKKyNlbHNlCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrX2FsbG9jKGVudGVyKTogVCMlZCBsb2M9JXAsIGZsYWdzPSglcykgIgorICAgICAgICAgICAgICAgICAgInNpemVvZl90YXNrPSVsZCBzaXplb2Zfc2hhcmVkPSVsZCBlbnRyeT0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIGxvY19yZWYsIGlucHV0X2ZsYWdzLT50aWVkbmVzcyA/ICJ0aWVkICAiIDogInVudGllZCIsCisgICAgICAgICAgICAgICAgICBzaXplb2Zfa21wX3Rhc2tfdCwgc2l6ZW9mX3NoYXJlZHMsIHRhc2tfZW50cnkpICk7CisjZW5kaWYKKworICAgIHJldHZhbCA9IF9fa21wX3Rhc2tfYWxsb2MoIGxvY19yZWYsIGd0aWQsIGlucHV0X2ZsYWdzLCBzaXplb2Zfa21wX3Rhc2tfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Zfc2hhcmVkcywgdGFza19lbnRyeSApOworCisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBjX29tcF90YXNrX2FsbG9jKGV4aXQpOiBUIyVkIHJldHZhbCAlcFxuIiwgZ3RpZCwgcmV0dmFsKSApOworCisgICAgcmV0dXJuIHJldHZhbDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIF9fa21wX2ludm9rZV90YXNrOiBpbnZva2UgdGhlIHNwZWNpZmllZCB0YXNrCisvLworLy8gZ3RpZDogZ2xvYmFsIHRocmVhZCBJRCBvZiBjYWxsZXIKKy8vIHRhc2s6IHRoZSB0YXNrIHRvIGludm9rZQorLy8gY3VycmVudF90YXNrOiB0aGUgdGFzayB0byByZXN1bWUgYWZ0ZXIgdGFzayBpbnZva2F0aW9uCisKK3N0YXRpYyB2b2lkCitfX2ttcF9pbnZva2VfdGFzaygga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKnRhc2ssIGttcF90YXNrZGF0YV90ICogY3VycmVudF90YXNrICkKK3sKKyAgICBrbXBfdGFza2RhdGFfdCAqIHRhc2tkYXRhID0gS01QX1RBU0tfVE9fVEFTS0RBVEEodGFzayk7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBpbnQgZGlzY2FyZCA9IDAgLyogZmFsc2UgKi87CisjZW5kaWYKKyAgICBLQV9UUkFDRSgzMCwgKCJfX2ttcF9pbnZva2VfdGFzayhlbnRlcik6IFQjJWQgaW52b2tpbmcgdGFzayAlcCwgY3VycmVudF90YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFza2RhdGEsIGN1cnJlbnRfdGFzaykgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRhc2spOworI2lmIE9NUF80MV9FTkFCTEVECisgICAgaWYgKCB0YXNrZGF0YS0+dGRfZmxhZ3MucHJveHkgPT0gVEFTS19QUk9YWSAmJgorICAgICAgICAgdGFza2RhdGEtPnRkX2ZsYWdzLmNvbXBsZXRlID09IDEpCisgICAgICAgICB7CisgICAgICAgICAgICAvLyBUaGlzIGlzIGEgcHJveHkgdGFzayB0aGF0IHdhcyBhbHJlYWR5IGNvbXBsZXRlZCBidXQgaXQgbmVlZHMgdG8gcnVuCisgICAgICAgICAgICAvLyBpdHMgYm90dG9tLWhhbGYgZmluaXNoCisgICAgICAgICAgICBLQV9UUkFDRSgzMCwgKCJfX2ttcF9pbnZva2VfdGFzazogVCMlZCBydW5uaW5nIGJvdHRvbSBmaW5pc2ggZm9yIHByb3h5IHRhc2sgJXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0YXNrZGF0YSkgKTsKKworICAgICAgICAgICAgX19rbXBfYm90dG9tX2hhbGZfZmluaXNoX3Byb3h5KGd0aWQsdGFzayk7CisKKyAgICAgICAgICAgIEtBX1RSQUNFKDMwLCAoIl9fa21wX2ludm9rZV90YXNrKGV4aXQpOiBUIyVkIGNvbXBsZXRlZCBib3R0b20gZmluaXNoIGZvciBwcm94eSB0YXNrICVwLCByZXN1bWluZyB0YXNrICVwXG4iLCBndGlkLCB0YXNrZGF0YSwgY3VycmVudF90YXNrKSApOworCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICB9CisjZW5kaWYKKworI2lmIE9NUF80MV9FTkFCTEVECisgICAgLy8gUHJveHkgdGFza3MgYXJlIG5vdCBoYW5kbGVkIGJ5IHRoZSBydW50aW1lCisgICAgaWYgKCB0YXNrZGF0YS0+dGRfZmxhZ3MucHJveHkgIT0gVEFTS19QUk9YWSApCisjZW5kaWYKKyAgICBfX2ttcF90YXNrX3N0YXJ0KCBndGlkLCB0YXNrLCBjdXJyZW50X3Rhc2sgKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIG9tcHRfdGhyZWFkX2luZm9fdCBvbGRJbmZvOworICAgIGttcF9pbmZvX3QgKiB0aHJlYWQ7CisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICAvLyBTdG9yZSB0aGUgdGhyZWFkcyBzdGF0ZXMgYW5kIHJlc3RvcmUgdGhlbSBhZnRlciB0aGUgdGFzaworICAgICAgICB0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAgICAgIG9sZEluZm8gPSB0aHJlYWQtPnRoLm9tcHRfdGhyZWFkX2luZm87CisgICAgICAgIHRocmVhZC0+dGgub21wdF90aHJlYWRfaW5mby53YWl0X2lkID0gMDsKKyAgICAgICAgdGhyZWFkLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID0gb21wdF9zdGF0ZV93b3JrX3BhcmFsbGVsOworICAgICAgICB0YXNrZGF0YS0+b21wdF90YXNrX2luZm8uZnJhbWUuZXhpdF9ydW50aW1lX2ZyYW1lID0gX19idWlsdGluX2ZyYW1lX2FkZHJlc3MoMCk7CisgICAgfQorI2VuZGlmCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIC8vIFRPRE86IGNhbmNlbCB0YXNrcyBpZiB0aGUgcGFyYWxsZWwgcmVnaW9uIGhhcyBhbHNvIGJlZW4gY2FuY2VsbGVkCisgICAgLy8gVE9ETzogY2hlY2sgaWYgdGhpcyBzZXF1ZW5jZSBjYW4gYmUgaG9pc3RlZCBhYm92ZSBfX2ttcF90YXNrX3N0YXJ0CisgICAgLy8gaWYgY2FuY2VsbGF0aW9uIGhhcyBiZWVuIGVuYWJsZWQgZm9yIHRoaXMgcnVuIC4uLgorICAgIGlmIChfX2ttcF9vbXBfY2FuY2VsbGF0aW9uKSB7CisgICAgICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyID0gX19rbXBfdGhyZWFkcyBbIGd0aWQgXTsKKyAgICAgICAga21wX3RlYW1fdCAqIHRoaXNfdGVhbSA9IHRoaXNfdGhyLT50aC50aF90ZWFtOworICAgICAgICBrbXBfdGFza2dyb3VwX3QgKiB0YXNrZ3JvdXAgPSB0YXNrZGF0YS0+dGRfdGFza2dyb3VwOworICAgICAgICBpZiAoKHRhc2tncm91cCAmJiB0YXNrZ3JvdXAtPmNhbmNlbF9yZXF1ZXN0KSB8fCAodGhpc190ZWFtLT50LnRfY2FuY2VsX3JlcXVlc3QgPT0gY2FuY2VsX3BhcmFsbGVsKSkgeworICAgICAgICAgICAgS01QX0NPVU5UX0JMT0NLKFRBU0tfY2FuY2VsbGVkKTsKKyAgICAgICAgICAgIC8vIHRoaXMgdGFzayBiZWxvbmdzIHRvIGEgdGFzayBncm91cCBhbmQgd2UgbmVlZCB0byBjYW5jZWwgaXQKKyAgICAgICAgICAgIGRpc2NhcmQgPSAxIC8qIHRydWUgKi87CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLworICAgIC8vIEludm9rZSB0aGUgdGFzayByb3V0aW5lIGFuZCBwYXNzIGluIHJlbGV2YW50IGRhdGEuCisgICAgLy8gVGh1bmtzIGdlbmVyYXRlZCBieSBnY2MgdGFrZSBhIGRpZmZlcmVudCBhcmd1bWVudCBsaXN0LgorICAgIC8vCisgICAgaWYgKCFkaXNjYXJkKSB7CisgICAgICAgIEtNUF9DT1VOVF9CTE9DSyhUQVNLX2V4ZWN1dGVkKTsKKyAgICAgICAgS01QX1RJTUVfQkxPQ0sgKFRBU0tfZXhlY3V0aW9uKTsKKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgICAgICAgLyogbGV0IE9NUFQga25vdyB0aGF0IHdlJ3JlIGFib3V0IHRvIHJ1biB0aGlzIHRhc2sgKi8KKyAgICAgICAgaWYgKG9tcHRfZW5hYmxlZCAmJgorICAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF90YXNrX3N3aXRjaCkpCisgICAgICAgIHsKKyAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfdGFza19zd2l0Y2gpKAorICAgICAgICAgICAgY3VycmVudF90YXNrLT5vbXB0X3Rhc2tfaW5mby50YXNrX2lkLAorICAgICAgICAgICAgdGFza2RhdGEtPm9tcHRfdGFza19pbmZvLnRhc2tfaWQpOworICAgICAgICB9CisjZW5kaWYKKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgICAgICBpZiAodGFza2RhdGEtPnRkX2ZsYWdzLm5hdGl2ZSkgeworICAgICAgICAgICAgKCh2b2lkICgqKSh2b2lkICopKSgqKHRhc2stPnJvdXRpbmUpKSkodGFzay0+c2hhcmVkcyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworICAgICAgICB7CisgICAgICAgICAgICAoKih0YXNrLT5yb3V0aW5lKSkoZ3RpZCwgdGFzayk7CisgICAgICAgIH0KKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgICAgICAgIC8qIGxldCBPTVBUIGtub3cgdGhhdCB3ZSdyZSByZXR1cm5pbmcgdG8gdGhlIGNhbGxlZSB0YXNrICovCisgICAgICAgIGlmIChvbXB0X2VuYWJsZWQgJiYKKyAgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfdGFza19zd2l0Y2gpKQorICAgICAgICB7CisgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3Rhc2tfc3dpdGNoKSgKKyAgICAgICAgICAgIHRhc2tkYXRhLT5vbXB0X3Rhc2tfaW5mby50YXNrX2lkLAorICAgICAgICAgICAgY3VycmVudF90YXNrLT5vbXB0X3Rhc2tfaW5mby50YXNrX2lkKTsKKyAgICAgICAgfQorI2VuZGlmCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIH0KKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorCisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIHRocmVhZC0+dGgub21wdF90aHJlYWRfaW5mbyA9IG9sZEluZm87CisgICAgICAgIHRhc2tkYXRhLT5vbXB0X3Rhc2tfaW5mby5mcmFtZS5leGl0X3J1bnRpbWVfZnJhbWUgPSAwOworICAgIH0KKyNlbmRpZgorCisjaWYgT01QXzQxX0VOQUJMRUQKKyAgICAvLyBQcm94eSB0YXNrcyBhcmUgbm90IGhhbmRsZWQgYnkgdGhlIHJ1bnRpbWUKKyAgICBpZiAoIHRhc2tkYXRhLT50ZF9mbGFncy5wcm94eSAhPSBUQVNLX1BST1hZICkKKyNlbmRpZgorICAgICAgIF9fa21wX3Rhc2tfZmluaXNoKCBndGlkLCB0YXNrLCBjdXJyZW50X3Rhc2sgKTsKKworICAgIEtBX1RSQUNFKDMwLCAoIl9fa21wX2ludm9rZV90YXNrKGV4aXQpOiBUIyVkIGNvbXBsZXRlZCB0YXNrICVwLCByZXN1bWluZyB0YXNrICVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFza2RhdGEsIGN1cnJlbnRfdGFzaykgKTsKKyAgICByZXR1cm47Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wY19vbXBfdGFza19wYXJ0czogU2NoZWR1bGUgYSB0aHJlYWQtc3dpdGNoYWJsZSB0YXNrIGZvciBleGVjdXRpb24KKy8vCisvLyBsb2NfcmVmOiBsb2NhdGlvbiBvZiBvcmlnaW5hbCB0YXNrIHByYWdtYSAoaWdub3JlZCkKKy8vIGd0aWQ6IEdsb2JhbCBUaHJlYWQgSUQgb2YgZW5jb3VudGVyaW5nIHRocmVhZAorLy8gbmV3X3Rhc2s6IHRhc2sgdGh1bmsgYWxsb2NhdGVkIGJ5IF9fa21wX29tcF90YXNrX2FsbG9jKCkgZm9yIHRoZSAnJ25ldyB0YXNrJycKKy8vIFJldHVybnM6CisvLyAgICBUQVNLX0NVUlJFTlRfTk9UX1FVRVVFRCAoMCkgaWYgZGlkIG5vdCBzdXNwZW5kIGFuZCBxdWV1ZSBjdXJyZW50IHRhc2sgdG8gYmUgcmVzdW1lZCBsYXRlci4KKy8vICAgIFRBU0tfQ1VSUkVOVF9RVUVVRUQgKDEpIGlmIHN1c3BlbmRlZCBhbmQgcXVldWVkIHRoZSBjdXJyZW50IHRhc2sgdG8gYmUgcmVzdW1lZCBsYXRlci4KKwora21wX2ludDMyCitfX2ttcGNfb21wX3Rhc2tfcGFydHMoIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICogbmV3X3Rhc2spCit7CisgICAga21wX3Rhc2tkYXRhX3QgKiBuZXdfdGFza2RhdGEgPSBLTVBfVEFTS19UT19UQVNLREFUQShuZXdfdGFzayk7CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3Rhc2tfcGFydHMoZW50ZXIpOiBUIyVkIGxvYz0lcCB0YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgbG9jX3JlZiwgbmV3X3Rhc2tkYXRhICkgKTsKKworICAgIC8qIFNob3VsZCB3ZSBleGVjdXRlIHRoZSBuZXcgdGFzayBvciBxdWV1ZSBpdD8gICBGb3Igbm93LCBsZXQncyBqdXN0IGFsd2F5cyB0cnkgdG8KKyAgICAgICBxdWV1ZSBpdC4gIElmIHRoZSBxdWV1ZSBmaWxscyB1cCwgdGhlbiB3ZSdsbCBleGVjdXRlIGl0LiAgKi8KKworICAgIGlmICggX19rbXBfcHVzaF90YXNrKCBndGlkLCBuZXdfdGFzayApID09IFRBU0tfTk9UX1BVU0hFRCApIC8vIGlmIGNhbm5vdCBkZWZlcgorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4ZWN1dGUgdGhpcyB0YXNrIGltbWVkaWF0ZWx5CisgICAgICAgIGttcF90YXNrZGF0YV90ICogY3VycmVudF90YXNrID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdIC0+IHRoLnRoX2N1cnJlbnRfdGFzazsKKyAgICAgICAgbmV3X3Rhc2tkYXRhLT50ZF9mbGFncy50YXNrX3NlcmlhbCA9IDE7CisgICAgICAgIF9fa21wX2ludm9rZV90YXNrKCBndGlkLCBuZXdfdGFzaywgY3VycmVudF90YXNrICk7CisgICAgfQorCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrX3BhcnRzKGV4aXQpOiBUIyVkIHJldHVybmluZyBUQVNLX0NVUlJFTlRfTk9UX1FVRVVFRDogIgorICAgICAgICAgICAgICAgICAgImxvYz0lcCB0YXNrPSVwLCByZXR1cm46IFRBU0tfQ1VSUkVOVF9OT1RfUVVFVUVEXG4iLCBndGlkLCBsb2NfcmVmLAorICAgICAgICAgICAgICAgICAgbmV3X3Rhc2tkYXRhICkgKTsKKworICAgIHJldHVybiBUQVNLX0NVUlJFTlRfTk9UX1FVRVVFRDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX29tcF90YXNrOiBTY2hlZHVsZSBhIG5vbi10aHJlYWQtc3dpdGNoYWJsZSB0YXNrIGZvciBleGVjdXRpb24KKy8vIGd0aWQ6IEdsb2JhbCBUaHJlYWQgSUQgb2YgZW5jb3VudGVyaW5nIHRocmVhZAorLy8gbmV3X3Rhc2s6IG5vbi10aHJlYWQtc3dpdGNoYWJsZSB0YXNrIHRodW5rIGFsbG9jYXRlZCBieSBfX2ttcF9vbXBfdGFza19hbGxvYygpCisvLyBzZXJpYWxpemVfaW1tZWRpYXRlOiBpZiBUUlVFIHRoZW4gaWYgdGhlIHRhc2sgaXMgZXhlY3V0ZWQgaW1tZWRpYXRlbHkgaXRzIGV4ZWN1dGlvbiB3aWxsIGJlIHNlcmlhbGl6ZWQKKy8vIHJldHVybnM6CisvLworLy8gICAgVEFTS19DVVJSRU5UX05PVF9RVUVVRUQgKDApIGlmIGRpZCBub3Qgc3VzcGVuZCBhbmQgcXVldWUgY3VycmVudCB0YXNrIHRvIGJlIHJlc3VtZWQgbGF0ZXIuCisvLyAgICBUQVNLX0NVUlJFTlRfUVVFVUVEICgxKSBpZiBzdXNwZW5kZWQgYW5kIHF1ZXVlZCB0aGUgY3VycmVudCB0YXNrIHRvIGJlIHJlc3VtZWQgbGF0ZXIuCitrbXBfaW50MzIKK19fa21wX29tcF90YXNrKCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqIG5ld190YXNrLCBib29sIHNlcmlhbGl6ZV9pbW1lZGlhdGUgKQoreworICAgIGttcF90YXNrZGF0YV90ICogbmV3X3Rhc2tkYXRhID0gS01QX1RBU0tfVE9fVEFTS0RBVEEobmV3X3Rhc2spOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICBuZXdfdGFza2RhdGEtPm9tcHRfdGFza19pbmZvLmZyYW1lLnJlZW50ZXJfcnVudGltZV9mcmFtZSA9CisgICAgICAgICAgICBfX2J1aWx0aW5fZnJhbWVfYWRkcmVzcygwKTsKKyAgICB9CisjZW5kaWYKKworICAgIC8qIFNob3VsZCB3ZSBleGVjdXRlIHRoZSBuZXcgdGFzayBvciBxdWV1ZSBpdD8gICBGb3Igbm93LCBsZXQncyBqdXN0IGFsd2F5cyB0cnkgdG8KKyAgICAgICBxdWV1ZSBpdC4gIElmIHRoZSBxdWV1ZSBmaWxscyB1cCwgdGhlbiB3ZSdsbCBleGVjdXRlIGl0LiAgKi8KKyNpZiBPTVBfNDFfRU5BQkxFRAorICAgIGlmICggbmV3X3Rhc2tkYXRhLT50ZF9mbGFncy5wcm94eSA9PSBUQVNLX1BST1hZIHx8IF9fa21wX3B1c2hfdGFzayggZ3RpZCwgbmV3X3Rhc2sgKSA9PSBUQVNLX05PVF9QVVNIRUQgKSAvLyBpZiBjYW5ub3QgZGVmZXIKKyNlbHNlCisgICAgaWYgKCBfX2ttcF9wdXNoX3Rhc2soIGd0aWQsIG5ld190YXNrICkgPT0gVEFTS19OT1RfUFVTSEVEICkgLy8gaWYgY2Fubm90IGRlZmVyCisjZW5kaWYKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFeGVjdXRlIHRoaXMgdGFzayBpbW1lZGlhdGVseQorICAgICAgICBrbXBfdGFza2RhdGFfdCAqIGN1cnJlbnRfdGFzayA9IF9fa21wX3RocmVhZHNbIGd0aWQgXSAtPiB0aC50aF9jdXJyZW50X3Rhc2s7CisgICAgICAgIGlmICggc2VyaWFsaXplX2ltbWVkaWF0ZSApCisgICAgICAgICAgbmV3X3Rhc2tkYXRhIC0+IHRkX2ZsYWdzLnRhc2tfc2VyaWFsID0gMTsKKyAgICAgICAgX19rbXBfaW52b2tlX3Rhc2soIGd0aWQsIG5ld190YXNrLCBjdXJyZW50X3Rhc2sgKTsKKyAgICB9CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIG5ld190YXNrZGF0YS0+b21wdF90YXNrX2luZm8uZnJhbWUucmVlbnRlcl9ydW50aW1lX2ZyYW1lID0gMDsKKyAgICB9CisjZW5kaWYKKworICAgIHJldHVybiBUQVNLX0NVUlJFTlRfTk9UX1FVRVVFRDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wY19vbXBfdGFzazogV3JhcHBlciBhcm91bmQgX19rbXBfb21wX3Rhc2sgdG8gc2NoZWR1bGUgYSBub24tdGhyZWFkLXN3aXRjaGFibGUgdGFzayBmcm9tCisvLyB0aGUgcGFyZW50IHRocmVhZCBvbmx5IQorLy8gbG9jX3JlZjogbG9jYXRpb24gb2Ygb3JpZ2luYWwgdGFzayBwcmFnbWEgKGlnbm9yZWQpCisvLyBndGlkOiBHbG9iYWwgVGhyZWFkIElEIG9mIGVuY291bnRlcmluZyB0aHJlYWQKKy8vIG5ld190YXNrOiBub24tdGhyZWFkLXN3aXRjaGFibGUgdGFzayB0aHVuayBhbGxvY2F0ZWQgYnkgX19rbXBfb21wX3Rhc2tfYWxsb2MoKQorLy8gcmV0dXJuczoKKy8vCisvLyAgICBUQVNLX0NVUlJFTlRfTk9UX1FVRVVFRCAoMCkgaWYgZGlkIG5vdCBzdXNwZW5kIGFuZCBxdWV1ZSBjdXJyZW50IHRhc2sgdG8gYmUgcmVzdW1lZCBsYXRlci4KKy8vICAgIFRBU0tfQ1VSUkVOVF9RVUVVRUQgKDEpIGlmIHN1c3BlbmRlZCBhbmQgcXVldWVkIHRoZSBjdXJyZW50IHRhc2sgdG8gYmUgcmVzdW1lZCBsYXRlci4KKwora21wX2ludDMyCitfX2ttcGNfb21wX3Rhc2soIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICogbmV3X3Rhc2spCit7CisgICAga21wX2ludDMyIHJlczsKKworI2lmIEtNUF9ERUJVRworICAgIGttcF90YXNrZGF0YV90ICogbmV3X3Rhc2tkYXRhID0gS01QX1RBU0tfVE9fVEFTS0RBVEEobmV3X3Rhc2spOworI2VuZGlmCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrKGVudGVyKTogVCMlZCBsb2M9JXAgdGFzaz0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIGxvY19yZWYsIG5ld190YXNrZGF0YSApICk7CisKKyAgICByZXMgPSAgX19rbXBfb21wX3Rhc2soZ3RpZCxuZXdfdGFzayx0cnVlKTsKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFzayhleGl0KTogVCMlZCByZXR1cm5pbmcgVEFTS19DVVJSRU5UX05PVF9RVUVVRUQ6IGxvYz0lcCB0YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgbG9jX3JlZiwgbmV3X3Rhc2tkYXRhICkgKTsKKyAgICByZXR1cm4gcmVzOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wY19vbXBfdGFza3dhaXQ6IFdhaXQgdW50aWwgYWxsIHRhc2tzIGdlbmVyYXRlZCBieSB0aGUgY3VycmVudCB0YXNrIGFyZSBjb21wbGV0ZQorCitrbXBfaW50MzIKK19fa21wY19vbXBfdGFza3dhaXQoIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBrbXBfdGFza2RhdGFfdCAqIHRhc2tkYXRhOworICAgIGttcF9pbmZvX3QgKiB0aHJlYWQ7CisgICAgaW50IHRocmVhZF9maW5pc2hlZCA9IEZBTFNFOworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrd2FpdChlbnRlcik6IFQjJWQgbG9jPSVwXG4iLCBndGlkLCBsb2NfcmVmKSApOworCisgICAgaWYgKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApIHsKKyAgICAgICAgLy8gR0VIIFRPRE86IHNob3VsZG4ndCB3ZSBoYXZlIHNvbWUgc29ydCBvZiBPTVBSQVAgQVBJIGNhbGxzIGhlcmUgdG8gbWFyayBiZWdpbiB3YWl0PworCisgICAgICAgIHRocmVhZCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICAgICAgdGFza2RhdGEgPSB0aHJlYWQgLT4gdGgudGhfY3VycmVudF90YXNrOworCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgICAgICAgb21wdF90YXNrX2lkX3QgbXlfdGFza19pZDsKKyAgICAgICAgb21wdF9wYXJhbGxlbF9pZF90IG15X3BhcmFsbGVsX2lkOworICAgICAgICAKKyAgICAgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICAgICAga21wX3RlYW1fdCAqdGVhbSA9IHRocmVhZC0+dGgudGhfdGVhbTsKKyAgICAgICAgICAgIG15X3Rhc2tfaWQgPSB0YXNrZGF0YS0+b21wdF90YXNrX2luZm8udGFza19pZDsKKyAgICAgICAgICAgIG15X3BhcmFsbGVsX2lkID0gdGVhbS0+dC5vbXB0X3RlYW1faW5mby5wYXJhbGxlbF9pZDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF90YXNrd2FpdF9iZWdpbikpIHsKKyAgICAgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfdGFza3dhaXRfYmVnaW4pKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteV9wYXJhbGxlbF9pZCwgbXlfdGFza19pZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZgorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAvLyBOb3RlOiBUaGVzZSB2YWx1ZXMgYXJlIHVzZWQgYnkgSVRUIGV2ZW50cyBhcyB3ZWxsLgorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICAgICAgdGFza2RhdGEtPnRkX3Rhc2t3YWl0X2NvdW50ZXIgKz0gMTsKKyAgICAgICAgdGFza2RhdGEtPnRkX3Rhc2t3YWl0X2lkZW50ICAgID0gbG9jX3JlZjsKKyAgICAgICAgdGFza2RhdGEtPnRkX3Rhc2t3YWl0X3RocmVhZCAgID0gZ3RpZCArIDE7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIHZvaWQgKiBpdHRfc3luY19vYmogPSBfX2ttcF9pdHRfdGFza3dhaXRfb2JqZWN0KCBndGlkICk7CisgICAgICAgIGlmICggaXR0X3N5bmNfb2JqICE9IE5VTEwgKQorICAgICAgICAgICAgX19rbXBfaXR0X3Rhc2t3YWl0X3N0YXJ0aW5nKCBndGlkLCBpdHRfc3luY19vYmogKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyNpZiBPTVBfNDFfRU5BQkxFRAorICAgICAgICBpZiAoICEgdGFza2RhdGEtPnRkX2ZsYWdzLnRlYW1fc2VyaWFsIHx8ICh0aHJlYWQtPnRoLnRoX3Rhc2tfdGVhbSAhPSBOVUxMICYmIHRocmVhZC0+dGgudGhfdGFza190ZWFtLT50dC50dF9mb3VuZF9wcm94eV90YXNrcykgKSAKKyNlbHNlCisgICAgICAgIGlmICggISB0YXNrZGF0YS0+dGRfZmxhZ3MudGVhbV9zZXJpYWwgKSAKKyNlbmRpZgorICAgICAgICB7CisgICAgICAgICAgICAvLyBHRUg6IGlmIHRlYW0gc2VyaWFsaXplZCwgYXZvaWQgcmVhZGluZyB0aGUgdm9sYXRpbGUgdmFyaWFibGUgYmVsb3cuCisgICAgICAgICAgICBrbXBfZmxhZ18zMiBmbGFnKCYodGFza2RhdGEtPnRkX2luY29tcGxldGVfY2hpbGRfdGFza3MpLCAwVSk7CisgICAgICAgICAgICB3aGlsZSAoIFRDUl80KHRhc2tkYXRhIC0+IHRkX2luY29tcGxldGVfY2hpbGRfdGFza3MpICE9IDAgKSB7CisgICAgICAgICAgICAgICAgZmxhZy5leGVjdXRlX3Rhc2tzKHRocmVhZCwgZ3RpZCwgRkFMU0UsICZ0aHJlYWRfZmluaXNoZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSwgX19rbXBfdGFza19zdGVhbGluZ19jb25zdHJhaW50ICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIGlmICggaXR0X3N5bmNfb2JqICE9IE5VTEwgKQorICAgICAgICAgICAgX19rbXBfaXR0X3Rhc2t3YWl0X2ZpbmlzaGVkKCBndGlkLCBpdHRfc3luY19vYmogKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICAgICAgLy8gR0VIIFRPRE86IHNob3VsZG4ndCB3ZSBoYXZlIHNvbWUgc29ydCBvZiBPTVBSQVAgQVBJIGNhbGxzIGhlcmUgdG8gbWFyayBlbmQgb2Ygd2FpdD8KKyAgICAgICAgdGFza2RhdGEtPnRkX3Rhc2t3YWl0X3RocmVhZCA9IC0gdGFza2RhdGEtPnRkX3Rhc2t3YWl0X3RocmVhZDsKKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgICAgICAgIGlmIChvbXB0X2VuYWJsZWQgJiYKKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF90YXNrd2FpdF9lbmQpKSB7CisgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfdGFza3dhaXRfZW5kKSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlfcGFyYWxsZWxfaWQsIG15X3Rhc2tfaWQpOworICAgICAgICB9CisjZW5kaWYKKyAgICB9CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3Rhc2t3YWl0KGV4aXQpOiBUIyVkIHRhc2sgJXAgZmluaXNoZWQgd2FpdGluZywgIgorICAgICAgICAgICAgICAgICAgInJldHVybmluZyBUQVNLX0NVUlJFTlRfTk9UX1FVRVVFRFxuIiwgZ3RpZCwgdGFza2RhdGEpICk7CisKKyAgICByZXR1cm4gVEFTS19DVVJSRU5UX05PVF9RVUVVRUQ7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcGNfb21wX3Rhc2t5aWVsZDogc3dpdGNoIHRvIGEgZGlmZmVyZW50IHRhc2sKKwora21wX2ludDMyCitfX2ttcGNfb21wX3Rhc2t5aWVsZCggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGludCBlbmRfcGFydCApCit7CisgICAga21wX3Rhc2tkYXRhX3QgKiB0YXNrZGF0YTsKKyAgICBrbXBfaW5mb190ICogdGhyZWFkOworICAgIGludCB0aHJlYWRfZmluaXNoZWQgPSBGQUxTRTsKKworICAgIEtNUF9DT1VOVF9CTE9DSyhPTVBfVEFTS1lJRUxEKTsKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza3lpZWxkKGVudGVyKTogVCMlZCBsb2M9JXAgZW5kX3BhcnQgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIGxvY19yZWYsIGVuZF9wYXJ0KSApOworCisgICAgaWYgKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyAmJiBfX2ttcF9pbml0X3BhcmFsbGVsICkgeworICAgICAgICAvLyBHRUggVE9ETzogc2hvdWxkbid0IHdlIGhhdmUgc29tZSBzb3J0IG9mIE9NUFJBUCBBUEkgY2FsbHMgaGVyZSB0byBtYXJrIGJlZ2luIHdhaXQ/CisKKyAgICAgICAgdGhyZWFkID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgICAgICB0YXNrZGF0YSA9IHRocmVhZCAtPiB0aC50aF9jdXJyZW50X3Rhc2s7CisgICAgICAgIC8vIFNob3VsZCB3ZSBtb2RlbCB0aGlzIGFzIGEgdGFzayB3YWl0IG9yIG5vdD8KKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIC8vIE5vdGU6IFRoZXNlIHZhbHVlcyBhcmUgdXNlZCBieSBJVFQgZXZlbnRzIGFzIHdlbGwuCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgICAgICB0YXNrZGF0YS0+dGRfdGFza3dhaXRfY291bnRlciArPSAxOworICAgICAgICB0YXNrZGF0YS0+dGRfdGFza3dhaXRfaWRlbnQgICAgPSBsb2NfcmVmOworICAgICAgICB0YXNrZGF0YS0+dGRfdGFza3dhaXRfdGhyZWFkICAgPSBndGlkICsgMTsKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgdm9pZCAqIGl0dF9zeW5jX29iaiA9IF9fa21wX2l0dF90YXNrd2FpdF9vYmplY3QoIGd0aWQgKTsKKyAgICAgICAgaWYgKCBpdHRfc3luY19vYmogIT0gTlVMTCApCisgICAgICAgICAgICBfX2ttcF9pdHRfdGFza3dhaXRfc3RhcnRpbmcoIGd0aWQsIGl0dF9zeW5jX29iaiApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICAgICAgaWYgKCAhIHRhc2tkYXRhLT50ZF9mbGFncy50ZWFtX3NlcmlhbCApIHsKKyAgICAgICAgICAgIGttcF90YXNrX3RlYW1fdCAqIHRhc2tfdGVhbSA9IHRocmVhZC0+dGgudGhfdGFza190ZWFtOworICAgICAgICAgICAgaWYgKHRhc2tfdGVhbSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKEtNUF9UQVNLSU5HX0VOQUJMRUQodGFza190ZWFtKSkgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9leGVjdXRlX3Rhc2tzXzMyKCB0aHJlYWQsIGd0aWQsIE5VTEwsIEZBTFNFLCAmdGhyZWFkX2ZpbmlzaGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaiksIF9fa21wX3Rhc2tfc3RlYWxpbmdfY29uc3RyYWludCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgaWYgKCBpdHRfc3luY19vYmogIT0gTlVMTCApCisgICAgICAgICAgICBfX2ttcF9pdHRfdGFza3dhaXRfZmluaXNoZWQoIGd0aWQsIGl0dF9zeW5jX29iaiApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgICAgICAvLyBHRUggVE9ETzogc2hvdWxkbid0IHdlIGhhdmUgc29tZSBzb3J0IG9mIE9NUFJBUCBBUEkgY2FsbHMgaGVyZSB0byBtYXJrIGVuZCBvZiB3YWl0PworICAgICAgICB0YXNrZGF0YS0+dGRfdGFza3dhaXRfdGhyZWFkID0gLSB0YXNrZGF0YS0+dGRfdGFza3dhaXRfdGhyZWFkOworICAgIH0KKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza3lpZWxkKGV4aXQpOiBUIyVkIHRhc2sgJXAgcmVzdW1pbmcsICIKKyAgICAgICAgICAgICAgICAgICJyZXR1cm5pbmcgVEFTS19DVVJSRU5UX05PVF9RVUVVRURcbiIsIGd0aWQsIHRhc2tkYXRhKSApOworCisgICAgcmV0dXJuIFRBU0tfQ1VSUkVOVF9OT1RfUVVFVUVEOworfQorCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcGNfdGFza2dyb3VwOiBTdGFydCBhIG5ldyB0YXNrZ3JvdXAKKwordm9pZAorX19rbXBjX3Rhc2tncm91cCggaWRlbnRfdCogbG9jLCBpbnQgZ3RpZCApCit7CisgICAga21wX2luZm9fdCAgICAgICogdGhyZWFkID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIGttcF90YXNrZGF0YV90ICAqIHRhc2tkYXRhID0gdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2s7CisgICAga21wX3Rhc2tncm91cF90ICogdGdfbmV3ID0KKyAgICAgICAgKGttcF90YXNrZ3JvdXBfdCAqKV9fa21wX3RocmVhZF9tYWxsb2MoIHRocmVhZCwgc2l6ZW9mKCBrbXBfdGFza2dyb3VwX3QgKSApOworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY190YXNrZ3JvdXA6IFQjJWQgbG9jPSVwIGdyb3VwPSVwXG4iLCBndGlkLCBsb2MsIHRnX25ldykgKTsKKyAgICB0Z19uZXctPmNvdW50ID0gMDsKKyAgICB0Z19uZXctPmNhbmNlbF9yZXF1ZXN0ID0gY2FuY2VsX25vcmVxOworICAgIHRnX25ldy0+cGFyZW50ID0gdGFza2RhdGEtPnRkX3Rhc2tncm91cDsKKyAgICB0YXNrZGF0YS0+dGRfdGFza2dyb3VwID0gdGdfbmV3OworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBjX2VuZF90YXNrZ3JvdXA6IFdhaXQgdW50aWwgYWxsIHRhc2tzIGdlbmVyYXRlZCBieSB0aGUgY3VycmVudCB0YXNrCisvLyAgICAgICAgICAgICAgICAgICAgICAgYW5kIGl0cyBkZXNjZW5kYW50cyBhcmUgY29tcGxldGUKKwordm9pZAorX19rbXBjX2VuZF90YXNrZ3JvdXAoIGlkZW50X3QqIGxvYywgaW50IGd0aWQgKQoreworICAgIGttcF9pbmZvX3QgICAgICAqIHRocmVhZCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICBrbXBfdGFza2RhdGFfdCAgKiB0YXNrZGF0YSA9IHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrOworICAgIGttcF90YXNrZ3JvdXBfdCAqIHRhc2tncm91cCA9IHRhc2tkYXRhLT50ZF90YXNrZ3JvdXA7CisgICAgaW50IHRocmVhZF9maW5pc2hlZCA9IEZBTFNFOworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX2VuZF90YXNrZ3JvdXAoZW50ZXIpOiBUIyVkIGxvYz0lcFxuIiwgZ3RpZCwgbG9jKSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tncm91cCAhPSBOVUxMICk7CisKKyAgICBpZiAoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICkgeworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgLy8gRm9yIElUVCB0aGUgdGFza2dyb3VwIHdhaXQgaXMgc2ltaWxhciB0byB0YXNrd2FpdCB1bnRpbCB3ZSBuZWVkIHRvIGRpc3Rpbmd1aXNoIHRoZW0KKyAgICAgICAgdm9pZCAqIGl0dF9zeW5jX29iaiA9IF9fa21wX2l0dF90YXNrd2FpdF9vYmplY3QoIGd0aWQgKTsKKyAgICAgICAgaWYgKCBpdHRfc3luY19vYmogIT0gTlVMTCApCisgICAgICAgICAgICBfX2ttcF9pdHRfdGFza3dhaXRfc3RhcnRpbmcoIGd0aWQsIGl0dF9zeW5jX29iaiApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworI2lmIE9NUF80MV9FTkFCTEVECisgICAgICAgIGlmICggISB0YXNrZGF0YS0+dGRfZmxhZ3MudGVhbV9zZXJpYWwgfHwgKHRocmVhZC0+dGgudGhfdGFza190ZWFtICE9IE5VTEwgJiYgdGhyZWFkLT50aC50aF90YXNrX3RlYW0tPnR0LnR0X2ZvdW5kX3Byb3h5X3Rhc2tzKSApIAorI2Vsc2UKKyAgICAgICAgaWYgKCAhIHRhc2tkYXRhLT50ZF9mbGFncy50ZWFtX3NlcmlhbCApIAorI2VuZGlmCisgICAgICAgIHsKKyAgICAgICAgICAgIGttcF9mbGFnXzMyIGZsYWcoJih0YXNrZ3JvdXAtPmNvdW50KSwgMFUpOworICAgICAgICAgICAgd2hpbGUgKCBUQ1JfNCh0YXNrZ3JvdXAtPmNvdW50KSAhPSAwICkgeworICAgICAgICAgICAgICAgIGZsYWcuZXhlY3V0ZV90YXNrcyh0aHJlYWQsIGd0aWQsIEZBTFNFLCAmdGhyZWFkX2ZpbmlzaGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaiksIF9fa21wX3Rhc2tfc3RlYWxpbmdfY29uc3RyYWludCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIGlmICggaXR0X3N5bmNfb2JqICE9IE5VTEwgKQorICAgICAgICAgICAgX19rbXBfaXR0X3Rhc2t3YWl0X2ZpbmlzaGVkKCBndGlkLCBpdHRfc3luY19vYmogKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tncm91cC0+Y291bnQgPT0gMCApOworCisgICAgLy8gUmVzdG9yZSBwYXJlbnQgdGFza2dyb3VwIGZvciB0aGUgY3VycmVudCB0YXNrCisgICAgdGFza2RhdGEtPnRkX3Rhc2tncm91cCA9IHRhc2tncm91cC0+cGFyZW50OworICAgIF9fa21wX3RocmVhZF9mcmVlKCB0aHJlYWQsIHRhc2tncm91cCApOworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX2VuZF90YXNrZ3JvdXAoZXhpdCk6IFQjJWQgdGFzayAlcCBmaW5pc2hlZCB3YWl0aW5nXG4iLCBndGlkLCB0YXNrZGF0YSkgKTsKK30KKyNlbmRpZgorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF9yZW1vdmVfbXlfdGFzazogcmVtb3ZlIGEgdGFzayBmcm9tIG15IG93biBkZXF1ZQorCitzdGF0aWMga21wX3Rhc2tfdCAqCitfX2ttcF9yZW1vdmVfbXlfdGFzaygga21wX2luZm9fdCAqIHRocmVhZCwga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtLAorICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBpc19jb25zdHJhaW5lZCApCit7CisgICAga21wX3Rhc2tfdCAqIHRhc2s7CisgICAga21wX3Rhc2tkYXRhX3QgKiB0YXNrZGF0YTsKKyAgICBrbXBfdGhyZWFkX2RhdGFfdCAqdGhyZWFkX2RhdGE7CisgICAga21wX3VpbnQzMiB0YWlsOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrX3RlYW0gLT4gdHQudHRfdGhyZWFkc19kYXRhICE9IE5VTEwgKTsgLy8gQ2FsbGVyIHNob3VsZCBjaGVjayB0aGlzIGNvbmRpdGlvbgorCisgICAgICAgIHRocmVhZF9kYXRhID0gJiB0YXNrX3RlYW0gLT4gdHQudHRfdGhyZWFkc19kYXRhWyBfX2ttcF90aWRfZnJvbV9ndGlkKCBndGlkICkgXTsKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3JlbW92ZV9teV90YXNrKGVudGVyKTogVCMlZCBudGFza3M9JWQgaGVhZD0ldSB0YWlsPSV1XG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX250YXNrcywgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX2hlYWQsCisgICAgICAgICAgICAgICAgICB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfdGFpbCkgKTsKKworICAgIGlmIChUQ1JfNCh0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9udGFza3MpID09IDApIHsKKyAgICAgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfcmVtb3ZlX215X3Rhc2soZXhpdCAjMSk6IFQjJWQgTm8gdGFza3MgdG8gcmVtb3ZlOiBudGFza3M9JWQgaGVhZD0ldSB0YWlsPSV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV9udGFza3MsIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV9oZWFkLAorICAgICAgICAgICAgICAgICAgICAgIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV90YWlsKSApOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX2xvY2sgKTsKKworICAgIGlmIChUQ1JfNCh0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9udGFza3MpID09IDApIHsKKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9sb2NrICk7CisgICAgICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3JlbW92ZV9teV90YXNrKGV4aXQgIzIpOiBUIyVkIE5vIHRhc2tzIHRvIHJlbW92ZTogbnRhc2tzPSVkIGhlYWQ9JXUgdGFpbD0ldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfbnRhc2tzLCB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfaGVhZCwKKyAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfdGFpbCkgKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgdGFpbCA9ICggdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfdGFpbCAtIDEgKSAmIFRBU0tfREVRVUVfTUFTSzsgIC8vIFdyYXAgaW5kZXguCisgICAgdGFza2RhdGEgPSB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZVsgdGFpbCBdOworCisgICAgaWYgKGlzX2NvbnN0cmFpbmVkKSB7CisgICAgICAgIC8vIHdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIGNhbmRpZGF0ZSBvYmV5cyB0YXNrIHNjaGVkdWxpbmcgY29uc3RyYWludDoKKyAgICAgICAgLy8gb25seSBjaGlsZCBvZiBjdXJyZW50IHRhc2sgY2FuIGJlIHNjaGVkdWxlZAorICAgICAgICBrbXBfdGFza2RhdGFfdCAqIGN1cnJlbnQgPSB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzazsKKyAgICAgICAga21wX2ludDMyICAgICAgICBsZXZlbCA9IGN1cnJlbnQtPnRkX2xldmVsOworICAgICAgICBrbXBfdGFza2RhdGFfdCAqIHBhcmVudCA9IHRhc2tkYXRhLT50ZF9wYXJlbnQ7CisgICAgICAgIHdoaWxlICggcGFyZW50ICE9IGN1cnJlbnQgJiYgcGFyZW50LT50ZF9sZXZlbCA+IGxldmVsICkgeworICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LT50ZF9wYXJlbnQ7ICAvLyBjaGVjayBnZW5lcmF0aW9uIHVwIHRvIHRoZSBsZXZlbCBvZiB0aGUgY3VycmVudCB0YXNrCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHBhcmVudCAhPSBOVUxMKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIHBhcmVudCAhPSBjdXJyZW50ICkgeworICAgICAgICAgICAgLy8gSWYgdGhlIHRhaWwgdGFzayBpcyBub3QgYSBjaGlsZCwgdGhlbiBubyBvdGhlciBjaGlsZHMgY2FuIGFwcGVhciBpbiB0aGUgZGVxdWUuCisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX2xvY2sgKTsKKyAgICAgICAgICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3JlbW92ZV9teV90YXNrKGV4aXQgIzIpOiBUIyVkIE5vIHRhc2tzIHRvIHJlbW92ZTogbnRhc2tzPSVkIGhlYWQ9JXUgdGFpbD0ldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX250YXNrcywgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX2hlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV90YWlsKSApOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV90YWlsID0gdGFpbDsKKyAgICBUQ1dfNCh0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9udGFza3MsIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX250YXNrcyAtIDEpOworCisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfbG9jayApOworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfcmVtb3ZlX215X3Rhc2soZXhpdCAjMik6IFQjJWQgdGFzayAlcCByZW1vdmVkOiBudGFza3M9JWQgaGVhZD0ldSB0YWlsPSV1XG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFza2RhdGEsIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV9udGFza3MsIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV9oZWFkLAorICAgICAgICAgICAgICAgICAgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX3RhaWwpICk7CisKKyAgICB0YXNrID0gS01QX1RBU0tEQVRBX1RPX1RBU0soIHRhc2tkYXRhICk7CisgICAgcmV0dXJuIHRhc2s7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfc3RlYWxfdGFzazogcmVtb3ZlIGEgdGFzayBmcm9tIGFub3RoZXIgdGhyZWFkJ3MgZGVxdWUKKy8vIEFzc3VtZSB0aGF0IGNhbGxpbmcgdGhyZWFkIGhhcyBhbHJlYWR5IGNoZWNrZWQgZXhpc3RlbmNlIG9mCisvLyB0YXNrX3RlYW0gdGhyZWFkX2RhdGEgYmVmb3JlIGNhbGxpbmcgdGhpcyByb3V0aW5lLgorCitzdGF0aWMga21wX3Rhc2tfdCAqCitfX2ttcF9zdGVhbF90YXNrKCBrbXBfaW5mb190ICp2aWN0aW0sIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ZWFtX3QgKnRhc2tfdGVhbSwKKyAgICAgICAgICAgICAgICAgIHZvbGF0aWxlIGttcF91aW50MzIgKnVuZmluaXNoZWRfdGhyZWFkcywgaW50ICp0aHJlYWRfZmluaXNoZWQsCisgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgaXNfY29uc3RyYWluZWQgKQoreworICAgIGttcF90YXNrX3QgKiB0YXNrOworICAgIGttcF90YXNrZGF0YV90ICogdGFza2RhdGE7CisgICAga21wX3RocmVhZF9kYXRhX3QgKnZpY3RpbV90ZCwgKnRocmVhZHNfZGF0YTsKKyAgICBrbXBfaW50MzIgdmljdGltX3RpZDsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICk7CisKKyAgICB0aHJlYWRzX2RhdGEgPSB0YXNrX3RlYW0gLT4gdHQudHRfdGhyZWFkc19kYXRhOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRocmVhZHNfZGF0YSAhPSBOVUxMICk7ICAvLyBDYWxsZXIgc2hvdWxkIGNoZWNrIHRoaXMgY29uZGl0aW9uCisKKyAgICB2aWN0aW1fdGlkID0gdmljdGltLT50aC50aF9pbmZvLmRzLmRzX3RpZDsKKyAgICB2aWN0aW1fdGQgPSAmIHRocmVhZHNfZGF0YVsgdmljdGltX3RpZCBdOworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfc3RlYWxfdGFzayhlbnRlcik6IFQjJWQgdHJ5IHRvIHN0ZWFsIGZyb20gVCMlZDogdGFza190ZWFtPSVwIG50YXNrcz0lZCAiCisgICAgICAgICAgICAgICAgICAiaGVhZD0ldSB0YWlsPSV1XG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdmljdGltICksIHRhc2tfdGVhbSwgdmljdGltX3RkLT50ZC50ZF9kZXF1ZV9udGFza3MsCisgICAgICAgICAgICAgICAgICB2aWN0aW1fdGQtPnRkLnRkX2RlcXVlX2hlYWQsIHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfdGFpbCkgKTsKKworICAgIGlmICggKFRDUl80KHZpY3RpbV90ZCAtPiB0ZC50ZF9kZXF1ZV9udGFza3MpID09IDApIHx8IC8vIENhbGxlciBzaG91bGQgbm90IGNoZWNrIHRoaXMgY29uZGl0aW9uCisgICAgICAgICAoVENSX1BUUih2aWN0aW0tPnRoLnRoX3Rhc2tfdGVhbSkgIT0gdGFza190ZWFtKSkgLy8gR0VIOiB3aHkgd291bGQgdGhpcyBoYXBwZW4/CisgICAgeworICAgICAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9zdGVhbF90YXNrKGV4aXQgIzEpOiBUIyVkIGNvdWxkIG5vdCBzdGVhbCBmcm9tIFQjJWQ6IHRhc2tfdGVhbT0lcCAiCisgICAgICAgICAgICAgICAgICAgICAgIm50YXNrcz0lZCBoZWFkPSV1IHRhaWw9JXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdmljdGltICksIHRhc2tfdGVhbSwgdmljdGltX3RkLT50ZC50ZF9kZXF1ZV9udGFza3MsCisgICAgICAgICAgICAgICAgICAgICAgdmljdGltX3RkLT50ZC50ZF9kZXF1ZV9oZWFkLCB2aWN0aW1fdGQtPnRkLnRkX2RlcXVlX3RhaWwpICk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgdmljdGltX3RkIC0+IHRkLnRkX2RlcXVlX2xvY2sgKTsKKworICAgIC8vIENoZWNrIGFnYWluIGFmdGVyIHdlIGFjcXVpcmUgdGhlIGxvY2sKKyAgICBpZiAoIChUQ1JfNCh2aWN0aW1fdGQgLT4gdGQudGRfZGVxdWVfbnRhc2tzKSA9PSAwKSB8fAorICAgICAgICAgKFRDUl9QVFIodmljdGltLT50aC50aF90YXNrX3RlYW0pICE9IHRhc2tfdGVhbSkpIC8vIEdFSDogd2h5IHdvdWxkIHRoaXMgaGFwcGVuPworICAgIHsKKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiB2aWN0aW1fdGQgLT4gdGQudGRfZGVxdWVfbG9jayApOworICAgICAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9zdGVhbF90YXNrKGV4aXQgIzIpOiBUIyVkIGNvdWxkIG5vdCBzdGVhbCBmcm9tIFQjJWQ6IHRhc2tfdGVhbT0lcCAiCisgICAgICAgICAgICAgICAgICAgICAgIm50YXNrcz0lZCBoZWFkPSV1IHRhaWw9JXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdmljdGltICksIHRhc2tfdGVhbSwgdmljdGltX3RkLT50ZC50ZF9kZXF1ZV9udGFza3MsCisgICAgICAgICAgICAgICAgICAgICAgdmljdGltX3RkLT50ZC50ZF9kZXF1ZV9oZWFkLCB2aWN0aW1fdGQtPnRkLnRkX2RlcXVlX3RhaWwpICk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHZpY3RpbV90ZCAtPiB0ZC50ZF9kZXF1ZSAhPSBOVUxMICk7CisKKyAgICBpZiAoICFpc19jb25zdHJhaW5lZCApIHsKKyAgICAgICAgdGFza2RhdGEgPSB2aWN0aW1fdGQgLT4gdGQudGRfZGVxdWVbIHZpY3RpbV90ZCAtPiB0ZC50ZF9kZXF1ZV9oZWFkIF07CisgICAgICAgIC8vIEJ1bXAgaGVhZCBwb2ludGVyIGFuZCBXcmFwLgorICAgICAgICB2aWN0aW1fdGQgLT4gdGQudGRfZGVxdWVfaGVhZCA9ICggdmljdGltX3RkIC0+IHRkLnRkX2RlcXVlX2hlYWQgKyAxICkgJiBUQVNLX0RFUVVFX01BU0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gV2hpbGUgd2UgaGF2ZSBwb3N0cG9uZWQgdGFza3MgbGV0J3Mgc3RlYWwgZnJvbSB0YWlsIG9mIHRoZSBkZXF1ZSAoc21hbGxlciB0YXNrcykKKyAgICAgICAga21wX2ludDMyIHRhaWwgPSAoIHZpY3RpbV90ZCAtPiB0ZC50ZF9kZXF1ZV90YWlsIC0gMSApICYgVEFTS19ERVFVRV9NQVNLOyAgLy8gV3JhcCBpbmRleC4KKyAgICAgICAgdGFza2RhdGEgPSB2aWN0aW1fdGQgLT4gdGQudGRfZGVxdWVbIHRhaWwgXTsKKyAgICAgICAgLy8gd2UgbmVlZCB0byBjaGVjayBpZiB0aGUgY2FuZGlkYXRlIG9iZXlzIHRhc2sgc2NoZWR1bGluZyBjb25zdHJhaW50OgorICAgICAgICAvLyBvbmx5IGNoaWxkIG9mIGN1cnJlbnQgdGFzayBjYW4gYmUgc2NoZWR1bGVkCisgICAgICAgIGttcF90YXNrZGF0YV90ICogY3VycmVudCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXS0+dGgudGhfY3VycmVudF90YXNrOworICAgICAgICBrbXBfaW50MzIgICAgICAgIGxldmVsID0gY3VycmVudC0+dGRfbGV2ZWw7CisgICAgICAgIGttcF90YXNrZGF0YV90ICogcGFyZW50ID0gdGFza2RhdGEtPnRkX3BhcmVudDsKKyAgICAgICAgd2hpbGUgKCBwYXJlbnQgIT0gY3VycmVudCAmJiBwYXJlbnQtPnRkX2xldmVsID4gbGV2ZWwgKSB7CisgICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQtPnRkX3BhcmVudDsgIC8vIGNoZWNrIGdlbmVyYXRpb24gdXAgdG8gdGhlIGxldmVsIG9mIHRoZSBjdXJyZW50IHRhc2sKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQocGFyZW50ICE9IE5VTEwpOworICAgICAgICB9CisgICAgICAgIGlmICggcGFyZW50ICE9IGN1cnJlbnQgKSB7CisgICAgICAgICAgICAvLyBJZiB0aGUgdGFpbCB0YXNrIGlzIG5vdCBhIGNoaWxkLCB0aGVuIG5vIG90aGVyIGNoaWxkcyBjYW4gYXBwZWFyIGluIHRoZSBkZXF1ZSAoPykuCisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIHZpY3RpbV90ZCAtPiB0ZC50ZF9kZXF1ZV9sb2NrICk7CisgICAgICAgICAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9zdGVhbF90YXNrKGV4aXQgIzIpOiBUIyVkIGNvdWxkIG5vdCBzdGVhbCBmcm9tIFQjJWQ6IHRhc2tfdGVhbT0lcCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJudGFza3M9JWQgaGVhZD0ldSB0YWlsPSV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aHJlYWRzX2RhdGFbdmljdGltX3RpZF0udGQudGRfdGhyICksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tfdGVhbSwgdmljdGltX3RkLT50ZC50ZF9kZXF1ZV9udGFza3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfaGVhZCwgdmljdGltX3RkLT50ZC50ZF9kZXF1ZV90YWlsKSApOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgdmljdGltX3RkIC0+IHRkLnRkX2RlcXVlX3RhaWwgPSB0YWlsOworICAgIH0KKyAgICBpZiAoKnRocmVhZF9maW5pc2hlZCkgeworICAgICAgICAvLyBXZSBuZWVkIHRvIHVuLW1hcmsgdGhpcyB2aWN0aW0gYXMgYSBmaW5pc2hlZCB2aWN0aW0uICBUaGlzIG11c3QgYmUgZG9uZSBiZWZvcmUKKyAgICAgICAgLy8gcmVsZWFzaW5nIHRoZSBsb2NrLCBvciBlbHNlIG90aGVyIHRocmVhZHMgKHN0YXJ0aW5nIHdpdGggdGhlIG1hc3RlciB2aWN0aW0pCisgICAgICAgIC8vIG1pZ2h0IGJlIHByZW1hdHVyZWx5IHJlbGVhc2VkIGZyb20gdGhlIGJhcnJpZXIhISEKKyAgICAgICAga21wX3VpbnQzMiBjb3VudDsKKworICAgICAgICBjb3VudCA9IEtNUF9URVNUX1RIRU5fSU5DMzIoIChrbXBfaW50MzIgKil1bmZpbmlzaGVkX3RocmVhZHMgKTsKKworICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9zdGVhbF90YXNrOiBUIyVkIGluYyB1bmZpbmlzaGVkX3RocmVhZHMgdG8gJWQ6IHRhc2tfdGVhbT0lcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBndGlkLCBjb3VudCArIDEsIHRhc2tfdGVhbSkgKTsKKworICAgICAgICAqdGhyZWFkX2ZpbmlzaGVkID0gRkFMU0U7CisgICAgfQorICAgIFRDV180KHZpY3RpbV90ZCAtPiB0ZC50ZF9kZXF1ZV9udGFza3MsIFRDUl80KHZpY3RpbV90ZCAtPiB0ZC50ZF9kZXF1ZV9udGFza3MpIC0gMSk7CisKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIHZpY3RpbV90ZCAtPiB0ZC50ZF9kZXF1ZV9sb2NrICk7CisKKyAgICBLTVBfQ09VTlRfQkxPQ0soVEFTS19zdG9sZW4pOworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3N0ZWFsX3Rhc2soZXhpdCAjMyk6IFQjJWQgc3RvbGUgdGFzayAlcCBmcm9tIFQjJWQ6IHRhc2tfdGVhbT0lcCAiCisgICAgICAgICAgICAgICAgICAibnRhc2tzPSVkIGhlYWQ9JXUgdGFpbD0ldVxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRhc2tkYXRhLCBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB2aWN0aW0gKSwgdGFza190ZWFtLAorICAgICAgICAgICAgICAgICAgdmljdGltX3RkLT50ZC50ZF9kZXF1ZV9udGFza3MsIHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfaGVhZCwKKyAgICAgICAgICAgICAgICAgIHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfdGFpbCkgKTsKKworICAgIHRhc2sgPSBLTVBfVEFTS0RBVEFfVE9fVEFTSyggdGFza2RhdGEgKTsKKyAgICByZXR1cm4gdGFzazsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF9leGVjdXRlX3Rhc2tzX3RlbXBsYXRlOiBDaG9vc2UgYW5kIGV4ZWN1dGUgdGFza3MgdW50aWwgZWl0aGVyIHRoZSBjb25kaXRpb24KKy8vIGlzIHN0YXRpc2ZpZWQgKHJldHVybiB0cnVlKSBvciB0aGVyZSBhcmUgbm9uZSBsZWZ0IChyZXR1cm4gZmFsc2UpLgorLy8gZmluYWxfc3BpbiBpcyBUUlVFIGlmIHRoaXMgaXMgdGhlIHNwaW4gYXQgdGhlIHJlbGVhc2UgYmFycmllci4KKy8vIHRocmVhZF9maW5pc2hlZCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgdGhyZWFkIGlzIGZpbmlzaGVkIGV4ZWN1dGluZyBhbGwKKy8vIHRoZSB0YXNrcyBpdCBoYXMgb24gaXRzIGRlcXVlLCBhbmQgaXMgYXQgdGhlIHJlbGVhc2UgYmFycmllci4KKy8vIHNwaW5uZXIgaXMgdGhlIGxvY2F0aW9uIG9uIHdoaWNoIHRvIHNwaW4uCisvLyBzcGlubmVyID09IE5VTEwgbWVhbnMgb25seSBleGVjdXRlIGEgc2luZ2xlIHRhc2sgYW5kIHJldHVybi4KKy8vIGNoZWNrZXIgaXMgdGhlIHZhbHVlIHRvIGNoZWNrIHRvIHRlcm1pbmF0ZSB0aGUgc3Bpbi4KK3RlbXBsYXRlIDxjbGFzcyBDPgorc3RhdGljIGlubGluZSBpbnQgX19rbXBfZXhlY3V0ZV90YXNrc190ZW1wbGF0ZShrbXBfaW5mb190ICp0aHJlYWQsIGttcF9pbnQzMiBndGlkLCBDICpmbGFnLCBpbnQgZmluYWxfc3BpbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqdGhyZWFkX2ZpbmlzaGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKHZvaWQgKiBpdHRfc3luY19vYmopLCBrbXBfaW50MzIgaXNfY29uc3RyYWluZWQpCit7CisgICAga21wX3Rhc2tfdGVhbV90ICogICAgIHRhc2tfdGVhbTsKKyAgICBrbXBfdGhyZWFkX2RhdGFfdCAqICAgdGhyZWFkc19kYXRhOworICAgIGttcF90YXNrX3QgKiAgICAgICAgICB0YXNrOworICAgIGttcF90YXNrZGF0YV90ICogICAgICBjdXJyZW50X3Rhc2sgPSB0aHJlYWQgLT4gdGgudGhfY3VycmVudF90YXNrOworICAgIHZvbGF0aWxlIGttcF91aW50MzIgKiB1bmZpbmlzaGVkX3RocmVhZHM7CisgICAga21wX2ludDMyICAgICAgICAgICAgIG50aHJlYWRzLCBsYXN0X3N0b2xlbiwgaywgdGlkOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aHJlYWQgPT0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdICk7CisKKyAgICB0YXNrX3RlYW0gPSB0aHJlYWQgLT4gdGgudGhfdGFza190ZWFtOworICAgIGlmICh0YXNrX3RlYW0gPT0gTlVMTCkgcmV0dXJuIEZBTFNFOworCisgICAgS0FfVFJBQ0UoMTUsICgiX19rbXBfZXhlY3V0ZV90YXNrc190ZW1wbGF0ZShlbnRlcik6IFQjJWQgZmluYWxfc3Bpbj0lZCAqdGhyZWFkX2ZpbmlzaGVkPSVkXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgZmluYWxfc3BpbiwgKnRocmVhZF9maW5pc2hlZCkgKTsKKworICAgIHRocmVhZHNfZGF0YSA9IChrbXBfdGhyZWFkX2RhdGFfdCAqKVRDUl9QVFIodGFza190ZWFtIC0+IHR0LnR0X3RocmVhZHNfZGF0YSk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhyZWFkc19kYXRhICE9IE5VTEwgKTsKKworICAgIG50aHJlYWRzID0gdGFza190ZWFtIC0+IHR0LnR0X25wcm9jOworICAgIHVuZmluaXNoZWRfdGhyZWFkcyA9ICYodGFza190ZWFtIC0+IHR0LnR0X3VuZmluaXNoZWRfdGhyZWFkcyk7CisjaWYgT01QXzQxX0VOQUJMRUQKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBudGhyZWFkcyA+IDEgfHwgdGFza190ZWFtLT50dC50dF9mb3VuZF9wcm94eV90YXNrcyk7CisjZWxzZQorICAgIEtNUF9ERUJVR19BU1NFUlQoIG50aHJlYWRzID4gMSApOworI2VuZGlmCisgICAgS01QX0RFQlVHX0FTU0VSVCggVENSXzQoKGludCkqdW5maW5pc2hlZF90aHJlYWRzKSA+PSAwICk7CisKKyAgICAvLyBDaG9vc2UgdGFza3MgZnJvbSBvdXIgb3duIHdvcmsgcXVldWUuCisgICAgc3RhcnQ6CisgICAgd2hpbGUgKCggdGFzayA9IF9fa21wX3JlbW92ZV9teV90YXNrKCB0aHJlYWQsIGd0aWQsIHRhc2tfdGVhbSwgaXNfY29uc3RyYWluZWQgKSkgIT0gTlVMTCApIHsKKyNpZiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZCisgICAgICAgIGlmICggX19pdHRfc3luY19jcmVhdGVfcHRyIHx8IEtNUF9JVFRfREVCVUcgKSB7CisgICAgICAgICAgICBpZiAoIGl0dF9zeW5jX29iaiA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgIC8vIHdlIGFyZSBhdCBmb3JrIGJhcnJpZXIgd2hlcmUgd2UgY291bGQgbm90IGdldCB0aGUgb2JqZWN0IHJlbGlhYmx5CisgICAgICAgICAgICAgICAgaXR0X3N5bmNfb2JqICA9IF9fa21wX2l0dF9iYXJyaWVyX29iamVjdCggZ3RpZCwgYnNfZm9ya2pvaW5fYmFycmllciApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX19rbXBfaXR0X3Rhc2tfc3RhcnRpbmcoIGl0dF9zeW5jX29iaiApOworICAgICAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWSAqLworICAgICAgICBfX2ttcF9pbnZva2VfdGFzayggZ3RpZCwgdGFzaywgY3VycmVudF90YXNrICk7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICBpZiAoIGl0dF9zeW5jX29iaiAhPSBOVUxMICkKKyAgICAgICAgICAgIF9fa21wX2l0dF90YXNrX2ZpbmlzaGVkKCBpdHRfc3luY19vYmogKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICAgICAgLy8gSWYgdGhpcyB0aHJlYWQgaXMgb25seSBwYXJ0d2F5IHRocm91Z2ggdGhlIGJhcnJpZXIgYW5kIHRoZSBjb25kaXRpb24KKyAgICAgICAgLy8gaXMgbWV0LCB0aGVuIHJldHVybiBub3csIHNvIHRoYXQgdGhlIGJhcnJpZXIgZ2F0aGVyL3JlbGVhc2UgcGF0dGVybiBjYW4gcHJvY2VlZC4KKyAgICAgICAgLy8gSWYgdGhpcyB0aHJlYWQgaXMgaW4gdGhlIGxhc3Qgc3BpbiBsb29wIGluIHRoZSBiYXJyaWVyLCB3YWl0aW5nIHRvIGJlCisgICAgICAgIC8vIHJlbGVhc2VkLCB3ZSBrbm93IHRoYXQgdGhlIHRlcm1pbmF0aW9uIGNvbmRpdGlvbiB3aWxsIG5vdCBiZSBzYXRpc2lmaWVkLAorICAgICAgICAvLyBzbyBkb24ndCB3YXN0ZSBhbnkgY3ljbGVzIGNoZWNraW5nIGl0LgorICAgICAgICBpZiAoZmxhZyA9PSBOVUxMIHx8ICghZmluYWxfc3BpbiAmJiBmbGFnLT5kb25lX2NoZWNrKCkpKSB7CisgICAgICAgICAgICBLQV9UUkFDRSgxNSwgKCJfX2ttcF9leGVjdXRlX3Rhc2tzX3RlbXBsYXRlKGV4aXQgIzEpOiBUIyVkIHNwaW4gY29uZGl0aW9uIHNhdGlzZmllZFxuIiwgZ3RpZCkgKTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisgICAgICAgIGlmICh0aHJlYWQtPnRoLnRoX3Rhc2tfdGVhbSA9PSBOVUxMKSBicmVhazsKKyAgICAgICAgS01QX1lJRUxEKCBfX2ttcF9saWJyYXJ5ID09IGxpYnJhcnlfdGhyb3VnaHB1dCApOyAgIC8vIFlpZWxkIGJlZm9yZSBleGVjdXRpbmcgbmV4dCB0YXNrCisgICAgfQorCisgICAgLy8gVGhpcyB0aHJlYWQncyB3b3JrIHF1ZXVlIGlzIGVtcHR5LiAgSWYgd2UgYXJlIGluIHRoZSBmaW5hbCBzcGluIGxvb3AKKyAgICAvLyBvZiB0aGUgYmFycmllciwgY2hlY2sgYW5kIHNlZSBpZiB0aGUgdGVybWluYXRpb24gY29uZGl0aW9uIGlzIHNhdGlzZmllZC4KKyNpZiBPTVBfNDFfRU5BQkxFRAorICAgIC8vIFRoZSB3b3JrIHF1ZXVlIG1heSBiZSBlbXB0eSBidXQgdGhlcmUgbWlnaHQgYmUgcHJveHkgdGFza3Mgc3RpbGwgZXhlY3V0aW5nCisgICAgaWYgKGZpbmFsX3NwaW4gJiYgVENSXzQoY3VycmVudF90YXNrIC0+IHRkX2luY29tcGxldGVfY2hpbGRfdGFza3MpID09IDApIAorI2Vsc2UKKyAgICBpZiAoZmluYWxfc3BpbikgCisjZW5kaWYKKyAgICB7CisgICAgICAgIC8vIEZpcnN0LCBkZWNyZW1lbnQgdGhlICN1bmZpbmlzaGVkIHRocmVhZHMsIGlmIHRoYXQgaGFzIG5vdCBhbHJlYWR5CisgICAgICAgIC8vIGJlZW4gZG9uZS4gIFRoaXMgZGVjcmVtZW50IG1pZ2h0IGJlIHRvIHRoZSBzcGluIGxvY2F0aW9uLCBhbmQKKyAgICAgICAgLy8gcmVzdWx0IGluIHRoZSB0ZXJtaW5hdGlvbiBjb25kaXRpb24gYmVpbmcgc2F0aXNmaWVkLgorICAgICAgICBpZiAoISAqdGhyZWFkX2ZpbmlzaGVkKSB7CisgICAgICAgICAgICBrbXBfdWludDMyIGNvdW50OworCisgICAgICAgICAgICBjb3VudCA9IEtNUF9URVNUX1RIRU5fREVDMzIoIChrbXBfaW50MzIgKil1bmZpbmlzaGVkX3RocmVhZHMgKSAtIDE7CisgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9leGVjdXRlX3Rhc2tzX3RlbXBsYXRlKGRlYyAjMSk6IFQjJWQgZGVjIHVuZmluaXNoZWRfdGhyZWFkcyB0byAlZCB0YXNrX3RlYW09JXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIGNvdW50LCB0YXNrX3RlYW0pICk7CisgICAgICAgICAgICAqdGhyZWFkX2ZpbmlzaGVkID0gVFJVRTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEl0IGlzIG5vdyB1bnNhZmUgdG8gcmVmZXJlbmNlIHRocmVhZC0+dGgudGhfdGVhbSAhISEKKyAgICAgICAgLy8gRGVjcmVtZW50aW5nIHRhc2tfdGVhbS0+dHQudHRfdW5maW5pc2hlZF90aHJlYWRzIGNhbiBhbGxvdyB0aGUgbWFzdGVyCisgICAgICAgIC8vIHRocmVhZCB0byBwYXNzIHRocm91Z2ggdGhlIGJhcnJpZXIsIHdoZXJlIGl0IG1pZ2h0IHJlc2V0IGVhY2ggdGhyZWFkJ3MKKyAgICAgICAgLy8gdGgudGhfdGVhbSBmaWVsZCBmb3IgdGhlIG5leHQgcGFyYWxsZWwgcmVnaW9uLgorICAgICAgICAvLyBJZiB3ZSBjYW4gc3RlYWwgbW9yZSB3b3JrLCB3ZSBrbm93IHRoYXQgdGhpcyBoYXMgbm90IGhhcHBlbmVkIHlldC4KKyAgICAgICAgaWYgKGZsYWcgIT0gTlVMTCAmJiBmbGFnLT5kb25lX2NoZWNrKCkpIHsKKyAgICAgICAgICAgIEtBX1RSQUNFKDE1LCAoIl9fa21wX2V4ZWN1dGVfdGFza3NfdGVtcGxhdGUoZXhpdCAjMik6IFQjJWQgc3BpbiBjb25kaXRpb24gc2F0aXNmaWVkXG4iLCBndGlkKSApOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodGhyZWFkLT50aC50aF90YXNrX3RlYW0gPT0gTlVMTCkgcmV0dXJuIEZBTFNFOworI2lmIE9NUF80MV9FTkFCTEVECisgICAgLy8gY2hlY2sgaWYgdGhlcmUgYXJlIG90aGVyIHRocmVhZHMgdG8gc3RlYWwgZnJvbSwgb3RoZXJ3aXNlIGdvIGJhY2sKKyAgICBpZiAoIG50aHJlYWRzICA9PSAxICkKKyAgICAgICAgZ290byBzdGFydDsKKyNlbmRpZgorCisgICAgLy8gVHJ5IHRvIHN0ZWFsIGZyb20gdGhlIGxhc3QgcGxhY2UgSSBzdG9sZSBmcm9tIHN1Y2Nlc3NmdWxseS4KKyAgICB0aWQgPSB0aHJlYWQgLT4gdGgudGhfaW5mby5kcy5kc190aWQ7Ly9fX2ttcF90aWRfZnJvbV9ndGlkKCBndGlkICk7CisgICAgbGFzdF9zdG9sZW4gPSB0aHJlYWRzX2RhdGFbIHRpZCBdLnRkLnRkX2RlcXVlX2xhc3Rfc3RvbGVuOworCisgICAgaWYgKGxhc3Rfc3RvbGVuICE9IC0xKSB7CisgICAgICAgIGttcF9pbmZvX3QgKm90aGVyX3RocmVhZCA9IHRocmVhZHNfZGF0YVtsYXN0X3N0b2xlbl0udGQudGRfdGhyOworCisgICAgICAgIHdoaWxlICgodGFzayA9IF9fa21wX3N0ZWFsX3Rhc2soIG90aGVyX3RocmVhZCwgZ3RpZCwgdGFza190ZWFtLCB1bmZpbmlzaGVkX3RocmVhZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZF9maW5pc2hlZCwgaXNfY29uc3RyYWluZWQgKSkgIT0gTlVMTCkKKyAgICAgICAgeworI2lmIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgICAgIGlmICggX19pdHRfc3luY19jcmVhdGVfcHRyIHx8IEtNUF9JVFRfREVCVUcgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBpdHRfc3luY19vYmogPT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gd2UgYXJlIGF0IGZvcmsgYmFycmllciB3aGVyZSB3ZSBjb3VsZCBub3QgZ2V0IHRoZSBvYmplY3QgcmVsaWFibHkKKyAgICAgICAgICAgICAgICAgICAgaXR0X3N5bmNfb2JqICA9IF9fa21wX2l0dF9iYXJyaWVyX29iamVjdCggZ3RpZCwgYnNfZm9ya2pvaW5fYmFycmllciApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfX2ttcF9pdHRfdGFza19zdGFydGluZyggaXR0X3N5bmNfb2JqICk7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWSAqLworICAgICAgICAgICAgX19rbXBfaW52b2tlX3Rhc2soIGd0aWQsIHRhc2ssIGN1cnJlbnRfdGFzayApOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgICAgIGlmICggaXR0X3N5bmNfb2JqICE9IE5VTEwgKQorICAgICAgICAgICAgICAgIF9fa21wX2l0dF90YXNrX2ZpbmlzaGVkKCBpdHRfc3luY19vYmogKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICAgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGlzIHRocmVhZCBjYW4gcHJvY2VlZC4KKyAgICAgICAgICAgIGlmIChmbGFnID09IE5VTEwgfHwgKCFmaW5hbF9zcGluICYmIGZsYWctPmRvbmVfY2hlY2soKSkpIHsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSgxNSwgKCJfX2ttcF9leGVjdXRlX3Rhc2tzX3RlbXBsYXRlKGV4aXQgIzMpOiBUIyVkIHNwaW4gY29uZGl0aW9uIHNhdGlzZmllZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQpICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0aHJlYWQtPnRoLnRoX3Rhc2tfdGVhbSA9PSBOVUxMKSBicmVhazsKKyAgICAgICAgICAgIEtNUF9ZSUVMRCggX19rbXBfbGlicmFyeSA9PSBsaWJyYXJ5X3Rocm91Z2hwdXQgKTsgICAvLyBZaWVsZCBiZWZvcmUgZXhlY3V0aW5nIG5leHQgdGFzaworICAgICAgICAgICAgLy8gSWYgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgc3RvbGVuIHRhc2sgcmVzdWx0ZWQgaW4gbW9yZSB0YXNrcyBiZWluZworICAgICAgICAgICAgLy8gcGxhY2VkIG9uIG91ciBydW4gcXVldWUsIHRoZW4gcmVzdGFydCB0aGUgd2hvbGUgcHJvY2Vzcy4KKyAgICAgICAgICAgIGlmIChUQ1JfNCh0aHJlYWRzX2RhdGFbIHRpZCBdLnRkLnRkX2RlcXVlX250YXNrcykgIT0gMCkgeworICAgICAgICAgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2V4ZWN1dGVfdGFza3NfdGVtcGxhdGU6IFQjJWQgc3RvbGVuIHRhc2sgc3Bhd25lZCBvdGhlciB0YXNrcywgcmVzdGFydFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQpICk7CisgICAgICAgICAgICAgICAgZ290byBzdGFydDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIERvbid0IGdpdmUgcHJpb3JpdHkgdG8gc3RlYWxpbmcgZnJvbSB0aGlzIHRocmVhZCBhbnltb3JlLgorICAgICAgICB0aHJlYWRzX2RhdGFbIHRpZCBdLnRkLnRkX2RlcXVlX2xhc3Rfc3RvbGVuID0gLTE7CisKKyAgICAgICAgLy8gVGhlIHZpY3RpbXMncyB3b3JrIHF1ZXVlIGlzIGVtcHR5LiAgSWYgd2UgYXJlIGluIHRoZSBmaW5hbCBzcGluIGxvb3AKKyAgICAgICAgLy8gb2YgdGhlIGJhcnJpZXIsIGNoZWNrIGFuZCBzZWUgaWYgdGhlIHRlcm1pbmF0aW9uIGNvbmRpdGlvbiBpcyBzYXRpc2ZpZWQuCisjaWYgT01QXzQxX0VOQUJMRUQKKyAgICAgICAgLy8gVGhlIHdvcmsgcXVldWUgbWF5IGJlIGVtcHR5IGJ1dCB0aGVyZSBtaWdodCBiZSBwcm94eSB0YXNrcyBzdGlsbCBleGVjdXRpbmcKKyAgICAgICAgaWYgKGZpbmFsX3NwaW4gJiYgVENSXzQoY3VycmVudF90YXNrIC0+IHRkX2luY29tcGxldGVfY2hpbGRfdGFza3MpID09IDApIAorI2Vsc2UKKyAgICAgICAgaWYgKGZpbmFsX3NwaW4pIAorI2VuZGlmCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEZpcnN0LCBkZWNyZW1lbnQgdGhlICN1bmZpbmlzaGVkIHRocmVhZHMsIGlmIHRoYXQgaGFzIG5vdCBhbHJlYWR5CisgICAgICAgICAgICAvLyBiZWVuIGRvbmUuICBUaGlzIGRlY3JlbWVudCBtaWdodCBiZSB0byB0aGUgc3BpbiBsb2NhdGlvbiwgYW5kCisgICAgICAgICAgICAvLyByZXN1bHQgaW4gdGhlIHRlcm1pbmF0aW9uIGNvbmRpdGlvbiBiZWluZyBzYXRpc2ZpZWQuCisgICAgICAgICAgICBpZiAoISAqdGhyZWFkX2ZpbmlzaGVkKSB7CisgICAgICAgICAgICAgICAga21wX3VpbnQzMiBjb3VudDsKKworICAgICAgICAgICAgICAgIGNvdW50ID0gS01QX1RFU1RfVEhFTl9ERUMzMiggKGttcF9pbnQzMiAqKXVuZmluaXNoZWRfdGhyZWFkcyApIC0gMTsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9leGVjdXRlX3Rhc2tzX3RlbXBsYXRlKGRlYyAjMik6IFQjJWQgZGVjIHVuZmluaXNoZWRfdGhyZWFkcyB0byAlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFza190ZWFtPSVwXG4iLCBndGlkLCBjb3VudCwgdGFza190ZWFtKSApOworICAgICAgICAgICAgICAgICp0aHJlYWRfZmluaXNoZWQgPSBUUlVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJZiBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYworICAgICAgICAgICAgLy8gdGhlbiBpdCBpcyBub3cgdW5zYWZlIHRvIHJlZmVyZW5jZSB0aHJlYWQtPnRoLnRoX3RlYW0gISEhCisgICAgICAgICAgICAvLyBEZWNyZW1lbnRpbmcgdGFza190ZWFtLT50dC50dF91bmZpbmlzaGVkX3RocmVhZHMgY2FuIGFsbG93IHRoZSBtYXN0ZXIKKyAgICAgICAgICAgIC8vIHRocmVhZCB0byBwYXNzIHRocm91Z2ggdGhlIGJhcnJpZXIsIHdoZXJlIGl0IG1pZ2h0IHJlc2V0IGVhY2ggdGhyZWFkJ3MKKyAgICAgICAgICAgIC8vIHRoLnRoX3RlYW0gZmllbGQgZm9yIHRoZSBuZXh0IHBhcmFsbGVsIHJlZ2lvbi4KKyAgICAgICAgICAgIC8vIElmIHdlIGNhbiBzdGVhbCBtb3JlIHdvcmssIHdlIGtub3cgdGhhdCB0aGlzIGhhcyBub3QgaGFwcGVuZWQgeWV0LgorICAgICAgICAgICAgaWYgKGZsYWcgIT0gTlVMTCAmJiBmbGFnLT5kb25lX2NoZWNrKCkpIHsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSgxNSwgKCJfX2ttcF9leGVjdXRlX3Rhc2tzX3RlbXBsYXRlKGV4aXQgIzQpOiBUIyVkIHNwaW4gY29uZGl0aW9uIHNhdGlzZmllZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQpICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRocmVhZC0+dGgudGhfdGFza190ZWFtID09IE5VTEwpIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICAvLyBGaW5kIGEgZGlmZmVyZW50IHRocmVhZCB0byBzdGVhbCB3b3JrIGZyb20uICBQaWNrIGEgcmFuZG9tIHRocmVhZC4KKyAgICAvLyBNeSBpbml0aWFsIHBsYW4gd2FzIHRvIGN5Y2xlIHRocm91Z2ggYWxsIHRoZSB0aHJlYWRzLCBhbmQgb25seSByZXR1cm4KKyAgICAvLyBpZiB3ZSB0cmllZCB0byBzdGVhbCBmcm9tIGV2ZXJ5IHRocmVhZCwgYW5kIGZhaWxlZC4gIEFyY2ggc2F5cyB0aGF0J3MKKyAgICAvLyBub3Qgc3VjaCBhIGdyZWF0IGlkZWEuCisgICAgLy8gR0VIIC0gbmVlZCB5aWVsZCBjb2RlIGluIHRoaXMgbG9vcCBmb3IgdGhyb3VnaHB1dCBsaWJyYXJ5IG1vZGU/CisgICAgbmV3X3ZpY3RpbToKKyAgICBrID0gX19rbXBfZ2V0X3JhbmRvbSggdGhyZWFkICkgJSAobnRocmVhZHMgLSAxKTsKKyAgICBpZiAoIGsgPj0gdGhyZWFkIC0+IHRoLnRoX2luZm8uZHMuZHNfdGlkICkgeworICAgICAgICArK2s7ICAgICAgICAgICAgICAgLy8gQWRqdXN0cyByYW5kb20gZGlzdHJpYnV0aW9uIHRvIGV4Y2x1ZGUgc2VsZgorICAgIH0KKyAgICB7CisgICAgICAgIGttcF9pbmZvX3QgKm90aGVyX3RocmVhZCA9IHRocmVhZHNfZGF0YVtrXS50ZC50ZF90aHI7CisgICAgICAgIGludCBmaXJzdDsKKworICAgICAgICAvLyBUaGVyZSBpcyBhIHNsaWdodCBjaGFuY2UgdGhhdCBfX2ttcF9lbmFibGVfdGFza2luZygpIGRpZCBub3Qgd2FrZSB1cAorICAgICAgICAvLyBhbGwgdGhyZWFkcyB3YWl0aW5nIGF0IHRoZSBiYXJyaWVyLiAgSWYgdGhpcyB0aHJlYWQgaXMgc2xlZXBpbmcsIHRoZW4KKyAgICAgICAgLy8gd2FrZSBpdCB1cC4gIFNpbmNlIHdlIHdlcmUgZ29pbmcgdG8gcGF5IHRoZSBjYWNoZSBtaXNzIHBlbmFsdHkKKyAgICAgICAgLy8gZm9yIHJlZmVyZW5jaW5nIGFub3RoZXIgdGhyZWFkJ3Mga21wX2luZm9fdCBzdHJ1Y3QgYW55d2F5LCB0aGUgY2hlY2sKKyAgICAgICAgLy8gc2hvdWxkbid0IGNvc3QgdG9vIG11Y2ggcGVyZm9ybWFuY2UgYXQgdGhpcyBwb2ludC4KKyAgICAgICAgLy8gSW4gZXh0cmEgYmFycmllciBtb2RlLCB0YXNrcyBkbyBub3Qgc2xlZXAgYXQgdGhlIHNlcGFyYXRlIHRhc2tpbmcKKyAgICAgICAgLy8gYmFycmllciwgc28gdGhpcyBpc24ndCBhIHByb2JsZW0uCisgICAgICAgIGlmICggKCBfX2ttcF90YXNraW5nX21vZGUgPT0gdHNrbV90YXNrX3RlYW1zICkgJiYKKyAgICAgICAgICAgICAoX19rbXBfZGZsdF9ibG9ja3RpbWUgIT0gS01QX01BWF9CTE9DS1RJTUUpICYmCisgICAgICAgICAgICAgKFRDUl9QVFIob3RoZXJfdGhyZWFkLT50aC50aF9zbGVlcF9sb2MpICE9IE5VTEwpKQorICAgICAgICB7CisgICAgICAgICAgICBfX2ttcF9udWxsX3Jlc3VtZV93cmFwcGVyKF9fa21wX2d0aWRfZnJvbV90aHJlYWQob3RoZXJfdGhyZWFkKSwgb3RoZXJfdGhyZWFkLT50aC50aF9zbGVlcF9sb2MpOworICAgICAgICAgICAgLy8gQSBzbGVlcGluZyB0aHJlYWQgc2hvdWxkIG5vdCBoYXZlIGFueSB0YXNrcyBvbiBpdCdzIHF1ZXVlLgorICAgICAgICAgICAgLy8gVGhlcmUgaXMgYSBzbGlnaHQgcG9zc2liaWxpdHkgdGhhdCBpdCByZXN1bWVzLCBzdGVhbHMgYSB0YXNrIGZyb20KKyAgICAgICAgICAgIC8vIGFub3RoZXIgdGhyZWFkLCB3aGljaCBzcGF3bnMgbW9yZSB0YXNrcywgYWxsIGluIHRoZSB0aW1lIHRoYXQgaXQgdGFrZXMKKyAgICAgICAgICAgIC8vIHRoaXMgdGhyZWFkIHRvIGNoZWNrID0+IGRvbid0IHdyaXRlIGFuIGFzc2VydGlvbiB0aGF0IHRoZSB2aWN0aW0ncworICAgICAgICAgICAgLy8gcXVldWUgaXMgZW1wdHkuICBUcnkgc3RlYWxpbmcgZnJvbSBhIGRpZmZlcmVudCB0aHJlYWQuCisgICAgICAgICAgICBnb3RvIG5ld192aWN0aW07CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3cgdHJ5IHRvIHN0ZWFsIHdvcmsgZnJvbSB0aGUgc2VsZWN0ZWQgdGhyZWFkCisgICAgICAgIGZpcnN0ID0gVFJVRTsKKyAgICAgICAgd2hpbGUgKCh0YXNrID0gX19rbXBfc3RlYWxfdGFzayggb3RoZXJfdGhyZWFkLCBndGlkLCB0YXNrX3RlYW0sIHVuZmluaXNoZWRfdGhyZWFkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkX2ZpbmlzaGVkLCBpc19jb25zdHJhaW5lZCApKSAhPSBOVUxMKQorICAgICAgICB7CisjaWYgVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWQorICAgICAgICAgICAgaWYgKCBfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgfHwgS01QX0lUVF9ERUJVRyApIHsKKyAgICAgICAgICAgICAgICBpZiAoIGl0dF9zeW5jX29iaiA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgICAgICAvLyB3ZSBhcmUgYXQgZm9yayBiYXJyaWVyIHdoZXJlIHdlIGNvdWxkIG5vdCBnZXQgdGhlIG9iamVjdCByZWxpYWJseQorICAgICAgICAgICAgICAgICAgICBpdHRfc3luY19vYmogID0gX19rbXBfaXR0X2JhcnJpZXJfb2JqZWN0KCBndGlkLCBic19mb3Jram9pbl9iYXJyaWVyICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9fa21wX2l0dF90YXNrX3N0YXJ0aW5nKCBpdHRfc3luY19vYmogKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZICovCisgICAgICAgICAgICBfX2ttcF9pbnZva2VfdGFzayggZ3RpZCwgdGFzaywgY3VycmVudF90YXNrICk7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAgICAgaWYgKCBpdHRfc3luY19vYmogIT0gTlVMTCApCisgICAgICAgICAgICAgICAgX19rbXBfaXR0X3Rhc2tfZmluaXNoZWQoIGl0dF9zeW5jX29iaiApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgICAgICAgICAgLy8gVHJ5IHN0ZWFsaW5nIGZyb20gdGhpcyB2aWN0aW0gYWdhaW4sIGluIHRoZSBmdXR1cmUuCisgICAgICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICAgICAgICB0aHJlYWRzX2RhdGFbIHRpZCBdLnRkLnRkX2RlcXVlX2xhc3Rfc3RvbGVuID0gazsKKyAgICAgICAgICAgICAgICBmaXJzdCA9IEZBTFNFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhpcyB0aHJlYWQgY2FuIHByb2NlZWQuCisgICAgICAgICAgICBpZiAoZmxhZyA9PSBOVUxMIHx8ICghZmluYWxfc3BpbiAmJiBmbGFnLT5kb25lX2NoZWNrKCkpKSB7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMTUsICgiX19rbXBfZXhlY3V0ZV90YXNrc190ZW1wbGF0ZShleGl0ICM1KTogVCMlZCBzcGluIGNvbmRpdGlvbiBzYXRpc2ZpZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkKSApOworICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRocmVhZC0+dGgudGhfdGFza190ZWFtID09IE5VTEwpIGJyZWFrOworICAgICAgICAgICAgS01QX1lJRUxEKCBfX2ttcF9saWJyYXJ5ID09IGxpYnJhcnlfdGhyb3VnaHB1dCApOyAgIC8vIFlpZWxkIGJlZm9yZSBleGVjdXRpbmcgbmV4dCB0YXNrCisKKyAgICAgICAgICAgIC8vIElmIHRoZSBleGVjdXRpb24gb2YgdGhlIHN0b2xlbiB0YXNrIHJlc3VsdGVkIGluIG1vcmUgdGFza3MgYmVpbmcKKyAgICAgICAgICAgIC8vIHBsYWNlZCBvbiBvdXIgcnVuIHF1ZXVlLCB0aGVuIHJlc3RhcnQgdGhlIHdob2xlIHByb2Nlc3MuCisgICAgICAgICAgICBpZiAoVENSXzQodGhyZWFkc19kYXRhWyB0aWQgXS50ZC50ZF9kZXF1ZV9udGFza3MpICE9IDApIHsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9leGVjdXRlX3Rhc2tzX3RlbXBsYXRlOiBUIyVkIHN0b2xlbiB0YXNrIHNwYXduZWQgb3RoZXIgdGFza3MsIHJlc3RhcnRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkKSApOworICAgICAgICAgICAgICAgIGdvdG8gc3RhcnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBUaGUgdmljdGltcydzIHdvcmsgcXVldWUgaXMgZW1wdHkuICBJZiB3ZSBhcmUgaW4gdGhlIGZpbmFsIHNwaW4gbG9vcAorICAgICAgICAvLyBvZiB0aGUgYmFycmllciwgY2hlY2sgYW5kIHNlZSBpZiB0aGUgdGVybWluYXRpb24gY29uZGl0aW9uIGlzIHNhdGlzZmllZC4KKyAgICAgICAgLy8gR29pbmcgb24gYW5kIGZpbmRpbmcgYSBuZXcgdmljdGltIHRvIHN0ZWFsIGZyb20gaXMgZXhwZW5zaXZlLCBhcyBpdAorICAgICAgICAvLyBpbnZvbHZlcyBhIGxvdCBvZiBjYWNoZSBtaXNzZXMsIHNvIHdlIGRlZmluaXRlbHkgd2FudCB0byByZS1jaGVjayB0aGUKKyAgICAgICAgLy8gdGVybWluYXRpb24gY29uZGl0aW9uIGJlZm9yZSBkb2luZyB0aGF0LgorI2lmIE9NUF80MV9FTkFCTEVECisgICAgICAgIC8vIFRoZSB3b3JrIHF1ZXVlIG1heSBiZSBlbXB0eSBidXQgdGhlcmUgbWlnaHQgYmUgcHJveHkgdGFza3Mgc3RpbGwgZXhlY3V0aW5nCisgICAgICAgIGlmIChmaW5hbF9zcGluICYmIFRDUl80KGN1cnJlbnRfdGFzayAtPiB0ZF9pbmNvbXBsZXRlX2NoaWxkX3Rhc2tzKSA9PSAwKSAKKyNlbHNlCisgICAgICAgIGlmIChmaW5hbF9zcGluKSAKKyNlbmRpZgorICAgICAgICB7CisgICAgICAgICAgICAvLyBGaXJzdCwgZGVjcmVtZW50IHRoZSAjdW5maW5pc2hlZCB0aHJlYWRzLCBpZiB0aGF0IGhhcyBub3QgYWxyZWFkeQorICAgICAgICAgICAgLy8gYmVlbiBkb25lLiAgVGhpcyBkZWNyZW1lbnQgbWlnaHQgYmUgdG8gdGhlIHNwaW4gbG9jYXRpb24sIGFuZAorICAgICAgICAgICAgLy8gcmVzdWx0IGluIHRoZSB0ZXJtaW5hdGlvbiBjb25kaXRpb24gYmVpbmcgc2F0aXNmaWVkLgorICAgICAgICAgICAgaWYgKCEgKnRocmVhZF9maW5pc2hlZCkgeworICAgICAgICAgICAgICAgIGttcF91aW50MzIgY291bnQ7CisKKyAgICAgICAgICAgICAgICBjb3VudCA9IEtNUF9URVNUX1RIRU5fREVDMzIoIChrbXBfaW50MzIgKil1bmZpbmlzaGVkX3RocmVhZHMgKSAtIDE7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfZXhlY3V0ZV90YXNrc190ZW1wbGF0ZShkZWMgIzMpOiBUIyVkIGRlYyB1bmZpbmlzaGVkX3RocmVhZHMgdG8gJWQ7ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXNrX3RlYW09JXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCBjb3VudCwgdGFza190ZWFtKSApOworICAgICAgICAgICAgICAgICp0aHJlYWRfZmluaXNoZWQgPSBUUlVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJZiBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYywKKyAgICAgICAgICAgIC8vIHRoZW4gaXQgaXMgbm93IHVuc2FmZSB0byByZWZlcmVuY2UgdGhyZWFkLT50aC50aF90ZWFtICEhIQorICAgICAgICAgICAgLy8gRGVjcmVtZW50aW5nIHRhc2tfdGVhbS0+dHQudHRfdW5maW5pc2hlZF90aHJlYWRzIGNhbiBhbGxvdyB0aGUgbWFzdGVyCisgICAgICAgICAgICAvLyB0aHJlYWQgdG8gcGFzcyB0aHJvdWdoIHRoZSBiYXJyaWVyLCB3aGVyZSBpdCBtaWdodCByZXNldCBlYWNoIHRocmVhZCdzCisgICAgICAgICAgICAvLyB0aC50aF90ZWFtIGZpZWxkIGZvciB0aGUgbmV4dCBwYXJhbGxlbCByZWdpb24uCisgICAgICAgICAgICAvLyBJZiB3ZSBjYW4gc3RlYWwgbW9yZSB3b3JrLCB3ZSBrbm93IHRoYXQgdGhpcyBoYXMgbm90IGhhcHBlbmVkIHlldC4KKyAgICAgICAgICAgIGlmIChmbGFnICE9IE5VTEwgJiYgZmxhZy0+ZG9uZV9jaGVjaygpKSB7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMTUsICgiX19rbXBfZXhlY3V0ZV90YXNrc190ZW1wbGF0ZShleGl0ICM2KTogVCMlZCBzcGluIGNvbmRpdGlvbiBzYXRpc2ZpZWRcbiIsIGd0aWQpICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRocmVhZC0+dGgudGhfdGFza190ZWFtID09IE5VTEwpIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBLQV9UUkFDRSgxNSwgKCJfX2ttcF9leGVjdXRlX3Rhc2tzX3RlbXBsYXRlKGV4aXQgIzcpOiBUIyVkIGNhbid0IGZpbmQgd29ya1xuIiwgZ3RpZCkgKTsKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKK2ludCBfX2ttcF9leGVjdXRlX3Rhc2tzXzMyKGttcF9pbmZvX3QgKnRocmVhZCwga21wX2ludDMyIGd0aWQsIGttcF9mbGFnXzMyICpmbGFnLCBpbnQgZmluYWxfc3BpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqdGhyZWFkX2ZpbmlzaGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyh2b2lkICogaXR0X3N5bmNfb2JqKSwga21wX2ludDMyIGlzX2NvbnN0cmFpbmVkKQoreworICAgIHJldHVybiBfX2ttcF9leGVjdXRlX3Rhc2tzX3RlbXBsYXRlKHRocmVhZCwgZ3RpZCwgZmxhZywgZmluYWxfc3BpbiwgdGhyZWFkX2ZpbmlzaGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSwgaXNfY29uc3RyYWluZWQpOworfQorCitpbnQgX19rbXBfZXhlY3V0ZV90YXNrc182NChrbXBfaW5mb190ICp0aHJlYWQsIGttcF9pbnQzMiBndGlkLCBrbXBfZmxhZ182NCAqZmxhZywgaW50IGZpbmFsX3NwaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnRocmVhZF9maW5pc2hlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqIGl0dF9zeW5jX29iaiksIGttcF9pbnQzMiBpc19jb25zdHJhaW5lZCkKK3sKKyAgICByZXR1cm4gX19rbXBfZXhlY3V0ZV90YXNrc190ZW1wbGF0ZSh0aHJlYWQsIGd0aWQsIGZsYWcsIGZpbmFsX3NwaW4sIHRocmVhZF9maW5pc2hlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaiksIGlzX2NvbnN0cmFpbmVkKTsKK30KKworaW50IF9fa21wX2V4ZWN1dGVfdGFza3Nfb25jb3JlKGttcF9pbmZvX3QgKnRocmVhZCwga21wX2ludDMyIGd0aWQsIGttcF9mbGFnX29uY29yZSAqZmxhZywgaW50IGZpbmFsX3NwaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp0aHJlYWRfZmluaXNoZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyh2b2lkICogaXR0X3N5bmNfb2JqKSwga21wX2ludDMyIGlzX2NvbnN0cmFpbmVkKQoreworICAgIHJldHVybiBfX2ttcF9leGVjdXRlX3Rhc2tzX3RlbXBsYXRlKHRocmVhZCwgZ3RpZCwgZmxhZywgZmluYWxfc3BpbiwgdGhyZWFkX2ZpbmlzaGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSwgaXNfY29uc3RyYWluZWQpOworfQorCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfZW5hYmxlX3Rhc2tpbmc6IEFsbG9jYXRlIHRhc2sgdGVhbSBhbmQgcmVzdW1lIHRocmVhZHMgc2xlZXBpbmcgYXQgdGhlCisvLyBuZXh0IGJhcnJpZXIgc28gdGhleSBjYW4gYXNzaXN0IGluIGV4ZWN1dGluZyBlbnF1ZXVlZCB0YXNrcy4KKy8vIEZpcnN0IHRocmVhZCBpbiBhbGxvY2F0ZXMgdGhlIHRhc2sgdGVhbSBhdG9taWNhbGx5LgorCitzdGF0aWMgdm9pZAorX19rbXBfZW5hYmxlX3Rhc2tpbmcoIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtLCBrbXBfaW5mb190ICp0aGlzX3RociApCit7CisgICAga21wX3RocmVhZF9kYXRhX3QgKnRocmVhZHNfZGF0YTsKKyAgICBpbnQgbnRocmVhZHMsIGksIGlzX2luaXRfdGhyZWFkOworCisgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcF9lbmFibGVfdGFza2luZyhlbnRlcik6IFQjJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRoaXNfdGhyICkgKSApOworCisgICAgS01QX0RFQlVHX0FTU0VSVCh0YXNrX3RlYW0gIT0gTlVMTCk7CisgICAgS01QX0RFQlVHX0FTU0VSVCh0aGlzX3Roci0+dGgudGhfdGVhbSAhPSBOVUxMKTsKKworICAgIG50aHJlYWRzID0gdGFza190ZWFtLT50dC50dF9ucHJvYzsKKyAgICBLTVBfREVCVUdfQVNTRVJUKG50aHJlYWRzID4gMCk7CisgICAgS01QX0RFQlVHX0FTU0VSVChudGhyZWFkcyA9PSB0aGlzX3Roci0+dGgudGhfdGVhbS0+dC50X25wcm9jKTsKKworICAgIC8vIEFsbG9jYXRlIG9yIGluY3JlYXNlIHRoZSBzaXplIG9mIHRocmVhZHNfZGF0YSBpZiBuZWNlc3NhcnkKKyAgICBpc19pbml0X3RocmVhZCA9IF9fa21wX3JlYWxsb2NfdGFza190aHJlYWRzX2RhdGEoIHRoaXNfdGhyLCB0YXNrX3RlYW0gKTsKKworICAgIGlmICghaXNfaW5pdF90aHJlYWQpIHsKKyAgICAgICAgLy8gU29tZSBvdGhlciB0aHJlYWQgYWxyZWFkeSBzZXQgdXAgdGhlIGFycmF5LgorICAgICAgICBLQV9UUkFDRSggMjAsICggIl9fa21wX2VuYWJsZV90YXNraW5nKGV4aXQpOiBUIyVkOiB0aHJlYWRzIGFycmF5IGFscmVhZHkgc2V0IHVwLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRoaXNfdGhyICkgKSApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHRocmVhZHNfZGF0YSA9IChrbXBfdGhyZWFkX2RhdGFfdCAqKVRDUl9QVFIodGFza190ZWFtIC0+IHR0LnR0X3RocmVhZHNfZGF0YSk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhyZWFkc19kYXRhICE9IE5VTEwgKTsKKworICAgIGlmICggKCBfX2ttcF90YXNraW5nX21vZGUgPT0gdHNrbV90YXNrX3RlYW1zICkgJiYKKyAgICAgICAgICggX19rbXBfZGZsdF9ibG9ja3RpbWUgIT0gS01QX01BWF9CTE9DS1RJTUUgKSApCisgICAgeworICAgICAgICAvLyBSZWxlYXNlIGFueSB0aHJlYWRzIHNsZWVwaW5nIGF0IHRoZSBiYXJyaWVyLCBzbyB0aGF0IHRoZXkgY2FuIHN0ZWFsCisgICAgICAgIC8vIHRhc2tzIGFuZCBleGVjdXRlIHRoZW0uICBJbiBleHRyYSBiYXJyaWVyIG1vZGUsIHRhc2tzIGRvIG5vdCBzbGVlcAorICAgICAgICAvLyBhdCB0aGUgc2VwYXJhdGUgdGFza2luZyBiYXJyaWVyLCBzbyB0aGlzIGlzbid0IGEgcHJvYmxlbS4KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG50aHJlYWRzOyBpKyspIHsKKyAgICAgICAgICAgIHZvbGF0aWxlIHZvaWQgKnNsZWVwX2xvYzsKKyAgICAgICAgICAgIGttcF9pbmZvX3QgKnRocmVhZCA9IHRocmVhZHNfZGF0YVtpXS50ZC50ZF90aHI7CisKKyAgICAgICAgICAgIGlmIChpID09IHRoaXNfdGhyLT50aC50aF9pbmZvLmRzLmRzX3RpZCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gU2luY2Ugd2UgaGF2ZW4ndCBsb2NrZWQgdGhlIHRocmVhZCdzIHN1c3BlbmQgbXV0ZXggbG9jayBhdCB0aGlzCisgICAgICAgICAgICAvLyBwb2ludCwgdGhlcmUgaXMgYSBzbWFsbCB3aW5kb3cgd2hlcmUgYSB0aHJlYWQgbWlnaHQgYmUgcHV0dGluZworICAgICAgICAgICAgLy8gaXRzZWxmIHRvIHNsZWVwLCBidXQgaGFzbid0IHNldCB0aGUgdGhfc2xlZXBfbG9jIGZpZWxkIHlldC4KKyAgICAgICAgICAgIC8vIFRvIHdvcmsgYXJvdW5kIHRoaXMsIF9fa21wX2V4ZWN1dGVfdGFza3NfdGVtcGxhdGUoKSBwZXJpb2RpY2FsbHkgY2hlY2tzCisgICAgICAgICAgICAvLyBzZWUgaWYgb3RoZXIgdGhyZWFkcyBhcmUgc2xlZXBpbmcgKHVzaW5nIHRoZSBzYW1lIHJhbmRvbQorICAgICAgICAgICAgLy8gbWVjaGFuaXNtIHRoYXQgaXMgdXNlZCBmb3IgdGFzayBzdGVhbGluZykgYW5kIGF3YWtlbnMgdGhlbSBpZgorICAgICAgICAgICAgLy8gdGhleSBhcmUuCisgICAgICAgICAgICBpZiAoICggc2xlZXBfbG9jID0gVENSX1BUUiggdGhyZWFkIC0+IHRoLnRoX3NsZWVwX2xvYykgKSAhPSBOVUxMICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBLRl9UUkFDRSggNTAsICggIl9fa21wX2VuYWJsZV90YXNraW5nOiBUIyVkIHdha2luZyB1cCB0aHJlYWQgVCMlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRoaXNfdGhyICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aHJlYWQgKSApICk7CisgICAgICAgICAgICAgICAgX19rbXBfbnVsbF9yZXN1bWVfd3JhcHBlcihfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKHRocmVhZCksIHNsZWVwX2xvYyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBLRl9UUkFDRSggNTAsICggIl9fa21wX2VuYWJsZV90YXNraW5nOiBUIyVkIGRvbid0IHdha2UgdXAgdGhyZWFkIFQjJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aGlzX3RociApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhyZWFkICkgKSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcF9lbmFibGVfdGFza2luZyhleGl0KTogVCMlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhpc190aHIgKSApICk7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAvLyBUT0RPOiBDaGVjayB0aGUgY29tbWVudCBjb25zaXN0ZW5jeQorICogVXRpbGl0eSByb3V0aW5lcyBmb3IgInRhc2sgdGVhbXMiLiAgQSB0YXNrIHRlYW0gKGttcF90YXNrX3QpIGlzIGtpbmQgb2YKKyAqIGxpa2UgYSBzaGFkb3cgb2YgdGhlIGttcF90ZWFtX3QgZGF0YSBzdHJ1Y3QsIHdpdGggYSBkaWZmZXJlbnQgbGlmZXRpbWUuCisgKiBBZnRlciBhIGNoaWxkICogdGhyZWFkIGNoZWNrcyBpbnRvIGEgYmFycmllciBhbmQgY2FsbHMgX19rbXBfcmVsZWFzZSgpIGZyb20KKyAqIHRoZSBwYXJ0aWN1bGFyIHZhcmlhbnQgb2YgX19rbXBfPGJhcnJpZXJfa2luZD5fYmFycmllcl9nYXRoZXIoKSwgaXQgY2FuIG5vCisgKiBsb25nZXIgYXNzdW1lIHRoYXQgdGhlIGttcF90ZWFtX3Qgc3RydWN0dXJlIGlzIGludGFjdCAoYXQgYW55IG1vbWVudCwgdGhlCisgKiBtYXN0ZXIgdGhyZWFkIG1heSBleGl0IHRoZSBiYXJyaWVyIGNvZGUgYW5kIGZyZWUgdGhlIHRlYW0gZGF0YSBzdHJ1Y3R1cmUsCisgKiBhbmQgcmV0dXJuIHRoZSB0aHJlYWRzIHRvIHRoZSB0aHJlYWQgcG9vbCkuCisgKgorICogVGhpcyBkb2VzIG5vdCB3b3JrIHdpdGggdGhlIHRoZSB0YXNraW5nIGNvZGUsIGFzIHRoZSB0aHJlYWQgaXMgc3RpbGwKKyAqIGV4cGVjdGVkIHRvIHBhcnRpY2lwYXRlIGluIHRoZSBleGVjdXRpb24gb2YgYW55IHRhc2tzIHRoYXQgbWF5IGhhdmUgYmVlbgorICogc3Bhd25lZCBteSBhIG1lbWJlciBvZiB0aGUgdGVhbSwgYW5kIHRoZSB0aHJlYWQgc3RpbGwgbmVlZHMgYWNjZXNzIHRvIGFsbAorICogdG8gZWFjaCB0aHJlYWQgaW4gdGhlIHRlYW0sIHNvIHRoYXQgaXQgY2FuIHN0ZWFsIHdvcmsgZnJvbSBpdC4KKyAqCisgKiBFbnRlciB0aGUgZXhpc3RlbmNlIG9mIHRoZSBrbXBfdGFza190ZWFtX3Qgc3RydWN0LiAgSXQgZW1wbG95cyBhIHJlZmVyZW5jZQorICogY291bnRpbmcgbWVjaGFuaW1zLCBhbmQgaXMgYWxsb2NhdGVkIGJ5IHRoZSBtYXN0ZXIgdGhyZWFkIGJlZm9yZSBjYWxsaW5nCisgKiBfX2ttcF88YmFycmllcl9raW5kPl9yZWxlYXNlLCBhbmQgdGhlbiBpcyByZWxlYXNlIGJ5IHRoZSBsYXN0IHRocmVhZCB0bworICogZXhpdCBfX2ttcF88YmFycmllcl9raW5kPl9yZWxlYXNlIGF0IHRoZSBuZXh0IGJhcnJpZXIuICBJLmUuIHRoZSBsaWZldGltZXMKKyAqIG9mIHRoZSBrbXBfdGFza190ZWFtX3Qgc3RydWN0cyBmb3IgY29uc2VjdXRpdmUgYmFycmllcnMgY2FuIG92ZXJsYXAKKyAqIChhbmQgd2lsbCwgdW5sZXNzIHRoZSBtYXN0ZXIgdGhyZWFkIGlzIHRoZSBsYXN0IHRocmVhZCB0byBleGl0IHRoZSBiYXJyaWVyCisgKiByZWxlYXNlIHBoYXNlLCB3aGljaCBpcyBub3QgdHlwaWNhbCkuCisgKgorICogVGhlIGV4aXN0ZW5jZSBvZiBzdWNoIGEgc3RydWN0IGlzIHVzZWZ1bCBvdXRzaWRlIHRoZSBjb250ZXh0IG9mIHRhc2tpbmcsCisgKiBidXQgZm9yIG5vdywgSSdtIHRyeWluZyB0byBrZWVwIGl0IHNwZWNpZmljIHRvIHRoZSBPTVBfMzBfRU5BQkxFRCBtYWNybywKKyAqIHNvIHRoYXQgYW55IHBlcmZvcm1hbmNlIGRpZmZlcmVuY2VzIHNob3cgdXAgd2hlbiBjb21wYXJpbmcgdGhlIDIuNSB2cy4gMy4wCisgKiBsaWJyYXJpZXMuCisgKgorICogV2UgY3VycmVudGx5IHVzZSB0aGUgZXhpc3RlbmNlIG9mIHRoZSB0aHJlYWRzIGFycmF5IGFzIGFuIGluZGljYXRvciB0aGF0CisgKiB0YXNrcyB3ZXJlIHNwYXduZWQgc2luY2UgdGhlIGxhc3QgYmFycmllci4gIElmIHRoZSBzdHJ1Y3R1cmUgaXMgdG8gYmUKKyAqIHVzZWZ1bCBvdXRzaWRlIHRoZSBjb250ZXh0IG9mIHRhc2tpbmcsIHRoZW4gdGhpcyB3aWxsIGhhdmUgdG8gY2hhbmdlLCBidXQKKyAqIG5vdCBzZXR0dGluZyB0aGUgZmllbGQgbWluaW1pemVzIHRoZSBwZXJmb3JtYW5jZSBpbXBhY3Qgb2YgdGFza2luZyBvbgorICogYmFycmllcnMsIHdoZW4gbm8gZXhwbGljaXQgdGFza3Mgd2VyZSBzcGF3bmVkIChwdXNoZWQsIGFjdHVhbGx5KS4KKyAqLworCisKK3N0YXRpYyBrbXBfdGFza190ZWFtX3QgKl9fa21wX2ZyZWVfdGFza190ZWFtcyA9IE5VTEw7ICAgICAgICAgICAvLyBGcmVlIGxpc3QgZm9yIHRhc2tfdGVhbSBkYXRhIHN0cnVjdHVyZXMKKy8vIExvY2sgZm9yIHRhc2sgdGVhbSBkYXRhIHN0cnVjdHVyZXMKK3N0YXRpYyBrbXBfYm9vdHN0cmFwX2xvY2tfdCBfX2ttcF90YXNrX3RlYW1fbG9jayA9IEtNUF9CT09UU1RSQVBfTE9DS19JTklUSUFMSVpFUiggX19rbXBfdGFza190ZWFtX2xvY2sgKTsKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfYWxsb2NfdGFza19kZXF1ZToKKy8vIEFsbG9jYXRlcyBhIHRhc2sgZGVxdWUgZm9yIGEgcGFydGljdWxhciB0aHJlYWQsIGFuZCBpbml0aWFsaXplIHRoZSBuZWNlc3NhcnkKKy8vIGRhdGEgc3RydWN0dXJlcyByZWxhdGluZyB0byB0aGUgZGVxdWUuICBUaGlzIG9ubHkgaGFwcGVucyBvbmNlIHBlciB0aHJlYWQKKy8vIHBlciB0YXNrIHRlYW0gc2luY2UgdGFzayB0ZWFtcyBhcmUgcmVjeWNsZWQuCisvLyBObyBsb2NrIGlzIG5lZWRlZCBkdXJpbmcgYWxsb2NhdGlvbiBzaW5jZSBlYWNoIHRocmVhZCBhbGxvY2F0ZXMgaXRzIG93bgorLy8gZGVxdWUuCisKK3N0YXRpYyB2b2lkCitfX2ttcF9hbGxvY190YXNrX2RlcXVlKCBrbXBfaW5mb190ICp0aHJlYWQsIGttcF90aHJlYWRfZGF0YV90ICp0aHJlYWRfZGF0YSApCit7CisgICAgX19rbXBfaW5pdF9ib290c3RyYXBfbG9jayggJiB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9sb2NrICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWUgPT0gTlVMTCApOworCisgICAgLy8gSW5pdGlhbGl6ZSBsYXN0IHN0b2xlbiB0YXNrIGZpZWxkIHRvICJub25lIgorICAgIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX2xhc3Rfc3RvbGVuID0gLTE7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBUQ1JfNCh0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9udGFza3MpID09IDAgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9oZWFkID09IDAgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV90YWlsID09IDAgKTsKKworICAgIEtFX1RSQUNFKCAxMCwgKCAiX19rbXBfYWxsb2NfdGFza19kZXF1ZTogVCMlZCBhbGxvY2F0aW5nIGRlcXVlWyVkXSBmb3IgdGhyZWFkX2RhdGEgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhyZWFkICksIFRBU0tfREVRVUVfU0laRSwgdGhyZWFkX2RhdGEgKSApOworICAgIC8vIEFsbG9jYXRlIHNwYWNlIGZvciB0YXNrIGRlcXVlLCBhbmQgemVybyB0aGUgZGVxdWUKKyAgICAvLyBDYW5ub3QgdXNlIF9fa21wX3RocmVhZF9jYWxsb2MoKSBiZWNhdXNlIHRocmVhZHMgbm90IGFyb3VuZCBmb3IKKyAgICAvLyBrbXBfcmVhcF90YXNrX3RlYW0oICkuCisgICAgdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWUgPSAoa21wX3Rhc2tkYXRhX3QgKiopCisgICAgICAgICAgICBfX2ttcF9hbGxvY2F0ZSggVEFTS19ERVFVRV9TSVpFICogc2l6ZW9mKGttcF90YXNrZGF0YV90ICopKTsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfZnJlZV90YXNrX2RlcXVlOgorLy8gRGVhbGxvY2F0ZXMgYSB0YXNrIGRlcXVlIGZvciBhIHBhcnRpY3VsYXIgdGhyZWFkLgorLy8gSGFwcGVucyBhdCBsaWJyYXJ5IGRlYWxsb2NhdGlvbiBzbyBkb24ndCBuZWVkIHRvIHJlc2V0IGFsbCB0aHJlYWQgZGF0YSBmaWVsZHMuCisKK3N0YXRpYyB2b2lkCitfX2ttcF9mcmVlX3Rhc2tfZGVxdWUoIGttcF90aHJlYWRfZGF0YV90ICp0aHJlYWRfZGF0YSApCit7CisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9sb2NrICk7CisKKyAgICBpZiAoIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlICE9IE5VTEwgKSB7CisgICAgICAgIFRDV180KHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX250YXNrcywgMCk7CisgICAgICAgICBfX2ttcF9mcmVlKCB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZSApOworICAgICAgICB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZSA9IE5VTEw7CisgICAgfQorICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbG9jayApOworCisjaWZkZWYgQlVJTERfVElFRF9UQVNLX1NUQUNLCisgICAgLy8gR0VIOiBGaWd1cmUgb3V0IHdoYXQgdG8gZG8gaGVyZSBmb3IgdGRfc3VzcF90aWVkX3Rhc2tzCisgICAgaWYgKCB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9zdXNwX3RpZWRfdGFza3MudHNfZW50cmllcyAhPSBUQVNLX1NUQUNLX0VNUFRZICkgeworICAgICAgICBfX2ttcF9mcmVlX3Rhc2tfc3RhY2soIF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIGd0aWQgKSwgdGhyZWFkX2RhdGEgKTsKKyAgICB9CisjZW5kaWYgLy8gQlVJTERfVElFRF9UQVNLX1NUQUNLCit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX3JlYWxsb2NfdGFza190aHJlYWRzX2RhdGE6CisvLyBBbGxvY2F0ZXMgYSB0aHJlYWRzX2RhdGEgYXJyYXkgZm9yIGEgdGFzayB0ZWFtLCBlaXRoZXIgYnkgYWxsb2NhdGluZyBhbiBpbml0aWFsCisvLyBhcnJheSBvciBlbmxhcmdpbmcgYW4gZXhpc3RpbmcgYXJyYXkuICBPbmx5IHRoZSBmaXJzdCB0aHJlYWQgdG8gZ2V0IHRoZSBsb2NrCisvLyBhbGxvY3Mgb3IgZW5sYXJnZXMgdGhlIGFycmF5IGFuZCByZS1pbml0aWFsaXplcyB0aGUgYXJyYXkgZWxlZW1udHMuCisvLyBUaGF0IHRocmVhZCByZXR1cm5zICJUUlVFIiwgdGhlIHJlc3QgcmV0dXJuICJGQUxTRSIuCisvLyBBc3N1bWVzIHRoYXQgdGhlIG5ldyBhcnJheSBzaXplIGlzIGdpdmVuIGJ5IHRhc2tfdGVhbSAtPiB0dC50dF9ucHJvYy4KKy8vIFRoZSBjdXJyZW50IHNpemUgaXMgZ2l2ZW4gYnkgdGFza190ZWFtIC0+IHR0LnR0X21heF90aHJlYWRzLgorCitzdGF0aWMgaW50CitfX2ttcF9yZWFsbG9jX3Rhc2tfdGhyZWFkc19kYXRhKCBrbXBfaW5mb190ICp0aHJlYWQsIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtICkKK3sKKyAgICBrbXBfdGhyZWFkX2RhdGFfdCAqKiB0aHJlYWRzX2RhdGFfcDsKKyAgICBrbXBfaW50MzIgICAgICAgICAgICBudGhyZWFkcywgbWF4dGhyZWFkczsKKyAgICBpbnQgICAgICAgICAgICAgICAgICBpc19pbml0X3RocmVhZCA9IEZBTFNFOworCisgICAgaWYgKCBUQ1JfNCh0YXNrX3RlYW0gLT4gdHQudHRfZm91bmRfdGFza3MpICkgeworICAgICAgICAvLyBBbHJlYWR5IHJlYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZC4KKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHRocmVhZHNfZGF0YV9wID0gJiB0YXNrX3RlYW0gLT4gdHQudHRfdGhyZWFkc19kYXRhOworICAgIG50aHJlYWRzICAgPSB0YXNrX3RlYW0gLT4gdHQudHRfbnByb2M7CisgICAgbWF4dGhyZWFkcyA9IHRhc2tfdGVhbSAtPiB0dC50dF9tYXhfdGhyZWFkczsKKworICAgIC8vIEFsbCB0aHJlYWRzIG11c3QgbG9jayB3aGVuIHRoZXkgZW5jb3VudGVyIHRoZSBmaXJzdCB0YXNrIG9mIHRoZSBpbXBsaWNpdCB0YXNrCisgICAgLy8gcmVnaW9uIHRvIG1ha2Ugc3VyZSB0aHJlYWRzX2RhdGEgZmllbGRzIGFyZSAocmUpaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZWQuCisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiB0YXNrX3RlYW0gLT4gdHQudHRfdGhyZWFkc19sb2NrICk7CisKKyAgICBpZiAoICEgVENSXzQodGFza190ZWFtIC0+IHR0LnR0X2ZvdW5kX3Rhc2tzKSApIHsKKyAgICAgICAgLy8gZmlyc3QgdGhyZWFkIHRvIGVuYWJsZSB0YXNraW5nCisgICAgICAgIGttcF90ZWFtX3QgKnRlYW0gPSB0aHJlYWQgLT4gdGgudGhfdGVhbTsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgaXNfaW5pdF90aHJlYWQgPSBUUlVFOworICAgICAgICBpZiAoIG1heHRocmVhZHMgPCBudGhyZWFkcyApIHsKKworICAgICAgICAgICAgaWYgKCAqdGhyZWFkc19kYXRhX3AgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBrbXBfdGhyZWFkX2RhdGFfdCAqb2xkX2RhdGEgPSAqdGhyZWFkc19kYXRhX3A7CisgICAgICAgICAgICAgICAga21wX3RocmVhZF9kYXRhX3QgKm5ld19kYXRhID0gTlVMTDsKKworICAgICAgICAgICAgICAgIEtFX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVhbGxvY190YXNrX3RocmVhZHNfZGF0YTogVCMlZCByZWFsbG9jYXRpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRzIGRhdGEgZm9yIHRhc2tfdGVhbSAlcCwgbmV3X3NpemUgPSAlZCwgb2xkX3NpemUgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aHJlYWQgKSwgdGFza190ZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG50aHJlYWRzLCBtYXh0aHJlYWRzICkgKTsKKyAgICAgICAgICAgICAgICAvLyBSZWFsbG9jYXRlIHRocmVhZHNfZGF0YSB0byBoYXZlIG1vcmUgZWxlbWVudHMgdGhhbiBjdXJyZW50IGFycmF5CisgICAgICAgICAgICAgICAgLy8gQ2Fubm90IHVzZSBfX2ttcF90aHJlYWRfcmVhbGxvYygpIGJlY2F1c2UgdGhyZWFkcyBub3QgYXJvdW5kIGZvcgorICAgICAgICAgICAgICAgIC8vIGttcF9yZWFwX3Rhc2tfdGVhbSggKS4gIE5vdGUgYWxsIG5ldyBhcnJheSBlbnRyaWVzIGFyZSBpbml0aWFsaXplZAorICAgICAgICAgICAgICAgIC8vIHRvIHplcm8gYnkgX19rbXBfYWxsb2NhdGUoKS4KKyAgICAgICAgICAgICAgICBuZXdfZGF0YSA9IChrbXBfdGhyZWFkX2RhdGFfdCAqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2FsbG9jYXRlKCBudGhyZWFkcyAqIHNpemVvZihrbXBfdGhyZWFkX2RhdGFfdCkgKTsKKyAgICAgICAgICAgICAgICAvLyBjb3B5IG9sZCBkYXRhIHRvIG5ldyBkYXRhCisgICAgICAgICAgICAgICAgS01QX01FTUNQWV9TKCAodm9pZCAqKSBuZXdfZGF0YSwgbnRocmVhZHMgKiBzaXplb2Yoa21wX3RocmVhZF9kYXRhX3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgb2xkX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXh0aHJlYWRzICogc2l6ZW9mKGttcF90YXNrZGF0YV90ICopICk7CisKKyNpZmRlZiBCVUlMRF9USUVEX1RBU0tfU1RBQ0sKKyAgICAgICAgICAgICAgICAvLyBHRUg6IEZpZ3VyZSBvdXQgaWYgdGhpcyBpcyB0aGUgcmlnaHQgdGhpbmcgdG8gZG8KKyAgICAgICAgICAgICAgICBmb3IgKGkgPSBtYXh0aHJlYWRzOyBpIDwgbnRocmVhZHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBrbXBfdGhyZWFkX2RhdGFfdCAqdGhyZWFkX2RhdGEgPSAmICgqdGhyZWFkc19kYXRhX3ApW2ldOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9pbml0X3Rhc2tfc3RhY2soIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRocmVhZCApLCB0aHJlYWRfZGF0YSApOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBCVUlMRF9USUVEX1RBU0tfU1RBQ0sKKyAgICAgICAgICAgICAgICAvLyBJbnN0YWxsIHRoZSBuZXcgZGF0YSBhbmQgZnJlZSB0aGUgb2xkIGRhdGEKKyAgICAgICAgICAgICAgICAoKnRocmVhZHNfZGF0YV9wKSA9IG5ld19kYXRhOworICAgICAgICAgICAgICAgIF9fa21wX2ZyZWUoIG9sZF9kYXRhICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBLRV9UUkFDRSggMTAsICggIl9fa21wX3JlYWxsb2NfdGFza190aHJlYWRzX2RhdGE6IFQjJWQgYWxsb2NhdGluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRocmVhZHMgZGF0YSBmb3IgdGFza190ZWFtICVwLCBzaXplID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhyZWFkICksIHRhc2tfdGVhbSwgbnRocmVhZHMgKSApOworICAgICAgICAgICAgICAgIC8vIE1ha2UgdGhlIGluaXRpYWwgYWxsb2NhdGUgZm9yIHRocmVhZHNfZGF0YSBhcnJheSwgYW5kIHplcm8gZW50cmllcworICAgICAgICAgICAgICAgIC8vIENhbm5vdCB1c2UgX19rbXBfdGhyZWFkX2NhbGxvYygpIGJlY2F1c2UgdGhyZWFkcyBub3QgYXJvdW5kIGZvcgorICAgICAgICAgICAgICAgIC8vIGttcF9yZWFwX3Rhc2tfdGVhbSggKS4KKyAgICAgICAgICAgICAgICAqdGhyZWFkc19kYXRhX3AgPSAoa21wX3RocmVhZF9kYXRhX3QgKikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hbGxvY2F0ZSggbnRocmVhZHMgKiBzaXplb2Yoa21wX3RocmVhZF9kYXRhX3QpICk7CisjaWZkZWYgQlVJTERfVElFRF9UQVNLX1NUQUNLCisgICAgICAgICAgICAgICAgLy8gR0VIOiBGaWd1cmUgb3V0IGlmIHRoaXMgaXMgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG50aHJlYWRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAga21wX3RocmVhZF9kYXRhX3QgKnRocmVhZF9kYXRhID0gJiAoKnRocmVhZHNfZGF0YV9wKVtpXTsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfaW5pdF90YXNrX3N0YWNrKCBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aHJlYWQgKSwgdGhyZWFkX2RhdGEgKTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYgLy8gQlVJTERfVElFRF9UQVNLX1NUQUNLCisgICAgICAgICAgICB9CisgICAgICAgICAgICB0YXNrX3RlYW0gLT4gdHQudHRfbWF4X3RocmVhZHMgPSBudGhyZWFkczsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIElmIGFycmF5IGhhcyAobW9yZSB0aGFuKSBlbm91Z2ggZWxlbWVudHMsIGdvIGFoZWFkIGFuZCB1c2UgaXQKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoICp0aHJlYWRzX2RhdGFfcCAhPSBOVUxMICk7CisgICAgICAgIH0KKworICAgICAgICAvLyBpbml0aWFsaXplIHRocmVhZHNfZGF0YSBwb2ludGVycyBiYWNrIHRvIHRocmVhZF9pbmZvIHN0cnVjdHVyZXMKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG50aHJlYWRzOyBpKyspIHsKKyAgICAgICAgICAgIGttcF90aHJlYWRfZGF0YV90ICp0aHJlYWRfZGF0YSA9ICYgKCp0aHJlYWRzX2RhdGFfcClbaV07CisgICAgICAgICAgICB0aHJlYWRfZGF0YSAtPiB0ZC50ZF90aHIgPSB0ZWFtIC0+IHQudF90aHJlYWRzW2ldOworCisgICAgICAgICAgICBpZiAoIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX2xhc3Rfc3RvbGVuID49IG50aHJlYWRzKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIGxhc3Qgc3RvbGVuIGZpZWxkIHN1cnZpdmVzIGFjcm9zcyB0ZWFtcyAvIGJhcnJpZXIsIGFuZCB0aGUgbnVtYmVyCisgICAgICAgICAgICAgICAgLy8gb2YgdGhyZWFkcyBtYXkgaGF2ZSBjaGFuZ2VkLiAgSXQncyBwb3NzaWJsZSAobGlrZWx5PykgdGhhdCBhIG5ldworICAgICAgICAgICAgICAgIC8vIHBhcmFsbGVsIHJlZ2lvbiB3aWxsIGV4aGliaXQgdGhlIHNhbWUgYmVoYXZpb3IgYXMgdGhlIHByZXZpb3VzIHJlZ2lvbi4KKyAgICAgICAgICAgICAgICB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9sYXN0X3N0b2xlbiA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIFRDV19TWU5DXzQodGFza190ZWFtIC0+IHR0LnR0X2ZvdW5kX3Rhc2tzLCBUUlVFKTsKKyAgICB9CisKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2xvY2sgKTsKKyAgICByZXR1cm4gaXNfaW5pdF90aHJlYWQ7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX2ZyZWVfdGFza190aHJlYWRzX2RhdGE6CisvLyBEZWFsbG9jYXRlcyBhIHRocmVhZHNfZGF0YSBhcnJheSBmb3IgYSB0YXNrIHRlYW0sIGluY2x1ZGluZyBhbnkgYXR0YWNoZWQKKy8vIHRhc2tpbmcgZGVxdWVzLiAgT25seSBvY2N1cnMgYXQgbGlicmFyeSBzaHV0ZG93bi4KKworc3RhdGljIHZvaWQKK19fa21wX2ZyZWVfdGFza190aHJlYWRzX2RhdGEoIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtICkKK3sKKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2xvY2sgKTsKKyAgICBpZiAoIHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2RhdGEgIT0gTlVMTCApIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0YXNrX3RlYW0tPnR0LnR0X21heF90aHJlYWRzOyBpKysgKSB7CisgICAgICAgICAgICBfX2ttcF9mcmVlX3Rhc2tfZGVxdWUoICYgdGFza190ZWFtIC0+IHR0LnR0X3RocmVhZHNfZGF0YVtpXSApOworICAgICAgICB9CisgICAgICAgIF9fa21wX2ZyZWUoIHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2RhdGEgKTsKKyAgICAgICAgdGFza190ZWFtIC0+IHR0LnR0X3RocmVhZHNfZGF0YSA9IE5VTEw7CisgICAgfQorICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgdGFza190ZWFtIC0+IHR0LnR0X3RocmVhZHNfbG9jayApOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF9hbGxvY2F0ZV90YXNrX3RlYW06CisvLyBBbGxvY2F0ZXMgYSB0YXNrIHRlYW0gYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWMgdGVhbSwgdGFraW5nIGl0IGZyb20KKy8vIHRoZSBnbG9iYWwgdGFzayB0ZWFtIGZyZWUgbGlzdCBpZiBwb3NzaWJsZS4gIEFsc28gaW5pdGlhbGl6ZXMgZGF0YSBzdHJ1Y3R1cmVzLgorCitzdGF0aWMga21wX3Rhc2tfdGVhbV90ICoKK19fa21wX2FsbG9jYXRlX3Rhc2tfdGVhbSgga21wX2luZm9fdCAqdGhyZWFkLCBrbXBfdGVhbV90ICp0ZWFtICkKK3sKKyAgICBrbXBfdGFza190ZWFtX3QgKnRhc2tfdGVhbSA9IE5VTEw7CisgICAgaW50IG50aHJlYWRzOworCisgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF9hbGxvY2F0ZV90YXNrX3RlYW06IFQjJWQgZW50ZXJpbmc7IHRlYW0gPSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgKHRocmVhZCA/IF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRocmVhZCApIDogLTEpLCB0ZWFtICkgKTsKKworICAgIGlmIChUQ1JfUFRSKF9fa21wX2ZyZWVfdGFza190ZWFtcykgIT0gTlVMTCkgeworICAgICAgICAvLyBUYWtlIGEgdGFzayB0ZWFtIGZyb20gdGhlIHRhc2sgdGVhbSBwb29sCisgICAgICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZfX2ttcF90YXNrX3RlYW1fbG9jayApOworICAgICAgICBpZiAoX19rbXBfZnJlZV90YXNrX3RlYW1zICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHRhc2tfdGVhbSA9IF9fa21wX2ZyZWVfdGFza190ZWFtczsKKyAgICAgICAgICAgIFRDV19QVFIoX19rbXBfZnJlZV90YXNrX3RlYW1zLCB0YXNrX3RlYW0gLT4gdHQudHRfbmV4dCk7CisgICAgICAgICAgICB0YXNrX3RlYW0gLT4gdHQudHRfbmV4dCA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX3Rhc2tfdGVhbV9sb2NrICk7CisgICAgfQorCisgICAgaWYgKHRhc2tfdGVhbSA9PSBOVUxMKSB7CisgICAgICAgIEtFX1RSQUNFKCAxMCwgKCAiX19rbXBfYWxsb2NhdGVfdGFza190ZWFtOiBUIyVkIGFsbG9jYXRpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAidGFzayB0ZWFtIGZvciB0ZWFtICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aHJlYWQgKSwgdGVhbSApICk7CisgICAgICAgIC8vIEFsbG9jYXRlIGEgbmV3IHRhc2sgdGVhbSBpZiBvbmUgaXMgbm90IGF2YWlsYWJsZS4KKyAgICAgICAgLy8gQ2Fubm90IHVzZSBfX2ttcF90aHJlYWRfbWFsbG9jKCkgYmVjYXVzZSB0aHJlYWRzIG5vdCBhcm91bmQgZm9yCisgICAgICAgIC8vIGttcF9yZWFwX3Rhc2tfdGVhbSggKS4KKyAgICAgICAgdGFza190ZWFtID0gKGttcF90YXNrX3RlYW1fdCAqKSBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKGttcF90YXNrX3RlYW1fdCkgKTsKKyAgICAgICAgX19rbXBfaW5pdF9ib290c3RyYXBfbG9jayggJiB0YXNrX3RlYW0gLT4gdHQudHRfdGhyZWFkc19sb2NrICk7CisgICAgICAgIC8vdGFza190ZWFtIC0+IHR0LnR0X3RocmVhZHNfZGF0YSA9IE5VTEw7ICAgLy8gQUM6IF9fa21wX2FsbG9jYXRlIHplcm9lcyByZXR1cm5lZCBtZW1vcnkKKyAgICAgICAgLy90YXNrX3RlYW0gLT4gdHQudHRfbWF4X3RocmVhZHMgPSAwOworICAgICAgICAvL3Rhc2tfdGVhbSAtPiB0dC50dF9uZXh0ID0gTlVMTDsKKyAgICB9CisKKyAgICBUQ1dfNCh0YXNrX3RlYW0gLT4gdHQudHRfZm91bmRfdGFza3MsIEZBTFNFKTsKKyNpZiBPTVBfNDFfRU5BQkxFRAorICAgIFRDV180KHRhc2tfdGVhbSAtPiB0dC50dF9mb3VuZF9wcm94eV90YXNrcywgRkFMU0UpOworI2VuZGlmCisgICAgdGFza190ZWFtIC0+IHR0LnR0X25wcm9jID0gbnRocmVhZHMgPSB0ZWFtLT50LnRfbnByb2M7CisKKyAgICBUQ1dfNCggdGFza190ZWFtIC0+IHR0LnR0X3VuZmluaXNoZWRfdGhyZWFkcywgbnRocmVhZHMgKTsKKyAgICBUQ1dfNCggdGFza190ZWFtIC0+IHR0LnR0X2FjdGl2ZSwgVFJVRSApOworCisgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF9hbGxvY2F0ZV90YXNrX3RlYW06IFQjJWQgZXhpdGluZzsgdGFza190ZWFtID0gJXAgdW5maW5pc2hlZF90aHJlYWRzIGluaXQnZCB0byAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgKHRocmVhZCA/IF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRocmVhZCApIDogLTEpLCB0YXNrX3RlYW0sIHRhc2tfdGVhbSAtPiB0dC50dF91bmZpbmlzaGVkX3RocmVhZHMpICk7CisgICAgcmV0dXJuIHRhc2tfdGVhbTsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfZnJlZV90YXNrX3RlYW06CisvLyBGcmVlcyB0aGUgdGFzayB0ZWFtIGFzc29jaWF0ZWQgd2l0aCBhIHNwZWNpZmljIHRocmVhZCwgYW5kIGFkZHMgaXQKKy8vIHRvIHRoZSBnbG9iYWwgdGFzayB0ZWFtIGZyZWUgbGlzdC4KKwordm9pZAorX19rbXBfZnJlZV90YXNrX3RlYW0oIGttcF9pbmZvX3QgKnRocmVhZCwga21wX3Rhc2tfdGVhbV90ICp0YXNrX3RlYW0gKQoreworICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfZnJlZV90YXNrX3RlYW06IFQjJWQgdGFza190ZWFtID0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgIHRocmVhZCA/IF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRocmVhZCApIDogLTEsIHRhc2tfdGVhbSApICk7CisKKyAgICAvLyBQdXQgdGFzayB0ZWFtIGJhY2sgb24gZnJlZSBsaXN0CisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiBfX2ttcF90YXNrX3RlYW1fbG9jayApOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza190ZWFtIC0+IHR0LnR0X25leHQgPT0gTlVMTCApOworICAgIHRhc2tfdGVhbSAtPiB0dC50dF9uZXh0ID0gX19rbXBfZnJlZV90YXNrX3RlYW1zOworICAgIFRDV19QVFIoX19rbXBfZnJlZV90YXNrX3RlYW1zLCB0YXNrX3RlYW0pOworCisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiBfX2ttcF90YXNrX3RlYW1fbG9jayApOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF9yZWFwX3Rhc2tfdGVhbXM6CisvLyBGcmVlIGFsbCB0aGUgdGFzayB0ZWFtcyBvbiB0aGUgdGFzayB0ZWFtIGZyZWUgbGlzdC4KKy8vIFNob3VsZCBvbmx5IGJlIGRvbmUgZHVyaW5nIGxpYnJhcnkgc2h1dGRvd24uCisvLyBDYW5ub3QgZG8gYW55dGhpbmcgdGhhdCBuZWVkcyBhIHRocmVhZCBzdHJ1Y3R1cmUgb3IgZ3RpZCBzaW5jZSB0aGV5IGFyZSBhbHJlYWR5IGdvbmUuCisKK3ZvaWQKK19fa21wX3JlYXBfdGFza190ZWFtcyggdm9pZCApCit7CisgICAga21wX3Rhc2tfdGVhbV90ICAgKnRhc2tfdGVhbTsKKworICAgIGlmICggVENSX1BUUihfX2ttcF9mcmVlX3Rhc2tfdGVhbXMpICE9IE5VTEwgKSB7CisgICAgICAgIC8vIEZyZWUgYWxsIHRhc2tfdGVhbXMgb24gdGhlIGZyZWUgbGlzdAorICAgICAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfdGFza190ZWFtX2xvY2sgKTsKKyAgICAgICAgd2hpbGUgKCAoIHRhc2tfdGVhbSA9IF9fa21wX2ZyZWVfdGFza190ZWFtcyApICE9IE5VTEwgKSB7CisgICAgICAgICAgICBfX2ttcF9mcmVlX3Rhc2tfdGVhbXMgPSB0YXNrX3RlYW0gLT4gdHQudHRfbmV4dDsKKyAgICAgICAgICAgIHRhc2tfdGVhbSAtPiB0dC50dF9uZXh0ID0gTlVMTDsKKworICAgICAgICAgICAgLy8gRnJlZSB0aHJlYWRzX2RhdGEgaWYgbmVjZXNzYXJ5CisgICAgICAgICAgICBpZiAoIHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2RhdGEgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9mcmVlX3Rhc2tfdGhyZWFkc19kYXRhKCB0YXNrX3RlYW0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9fa21wX2ZyZWUoIHRhc2tfdGVhbSApOworICAgICAgICB9CisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF90YXNrX3RlYW1fbG9jayApOworICAgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX3dhaXRfdG9fdW5yZWZfdGFza190ZWFtczoKKy8vIFNvbWUgdGhyZWFkcyBjb3VsZCBzdGlsbCBiZSBpbiB0aGUgZm9yayBiYXJyaWVyIHJlbGVhc2UgY29kZSwgcG9zc2libHkKKy8vIHRyeWluZyB0byBzdGVhbCB0YXNrcy4gIFdhaXQgZm9yIGVhY2ggdGhyZWFkIHRvIHVucmVmZXJlbmNlIGl0cyB0YXNrIHRlYW0uCisvLwordm9pZAorX19rbXBfd2FpdF90b191bnJlZl90YXNrX3RlYW1zKHZvaWQpCit7CisgICAga21wX2luZm9fdCAqdGhyZWFkOworICAgIGttcF91aW50MzIgc3BpbnM7CisgICAgaW50IGRvbmU7CisKKyAgICBLTVBfSU5JVF9ZSUVMRCggc3BpbnMgKTsKKworCisgICAgZm9yICg7OykgeworICAgICAgICBkb25lID0gVFJVRTsKKworICAgICAgICAvLyBUT0RPOiBHRUggLSB0aGlzIG1heSBiZSBpcyB3cm9uZyBiZWNhdXNlIHNvbWUgc3luYyB3b3VsZCBiZSBuZWNlc3NhcnkKKyAgICAgICAgLy8gICAgICAgICAgICAgaW4gY2FzZSB0aHJlYWRzIGFyZSBhZGRlZCB0byB0aGUgcG9vbCBkdXJpbmcgdGhlIHRyYXZlcnNhbC4KKyAgICAgICAgLy8gICAgICAgICAgICAgTmVlZCB0byB2ZXJpZnkgdGhhdCBsb2NrIGZvciB0aHJlYWQgcG9vbCBpcyBoZWxkIHdoZW4gY2FsbGluZworICAgICAgICAvLyAgICAgICAgICAgICB0aGlzIHJvdXRpbmUuCisgICAgICAgIGZvciAodGhyZWFkID0gKGttcF9pbmZvX3QgKilfX2ttcF90aHJlYWRfcG9vbDsKKyAgICAgICAgICAgICB0aHJlYWQgIT0gTlVMTDsKKyAgICAgICAgICAgICB0aHJlYWQgPSB0aHJlYWQtPnRoLnRoX25leHRfcG9vbCkKKyAgICAgICAgeworI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgICAgICBEV09SRCBleGl0X3ZhbDsKKyNlbmRpZgorICAgICAgICAgICAgaWYgKCBUQ1JfUFRSKHRocmVhZC0+dGgudGhfdGFza190ZWFtKSA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF93YWl0X3RvX3VucmVmX3Rhc2tfdGVhbTogVCMlZCB0YXNrX3RlYW0gPT0gTlVMTFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aHJlYWQgKSApICk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgICAgIC8vIFRPRE86IEdFSCAtIGFkZCB0aGlzIGNoZWNrIGZvciBMaW51eCogT1MgLyBPUyBYKiBhcyB3ZWxsPworICAgICAgICAgICAgaWYgKCFfX2ttcF9pc190aHJlYWRfYWxpdmUodGhyZWFkLCAmZXhpdF92YWwpKSB7CisgICAgICAgICAgICAgICAgdGhyZWFkLT50aC50aF90YXNrX3RlYW0gPSBOVUxMOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgIGRvbmUgPSBGQUxTRTsgIC8vIEJlY2F1c2UgdGhfdGFza190ZWFtIHBvaW50ZXIgaXMgbm90IE5VTEwgZm9yIHRoaXMgdGhyZWFkCisKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF93YWl0X3RvX3VucmVmX3Rhc2tfdGVhbTogV2FpdGluZyBmb3IgVCMlZCB0byB1bnJlZmVyZW5jZSB0YXNrX3RlYW1cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aHJlYWQgKSApICk7CisKKyAgICAgICAgICAgIGlmICggX19rbXBfZGZsdF9ibG9ja3RpbWUgIT0gS01QX01BWF9CTE9DS1RJTUUgKSB7CisgICAgICAgICAgICAgICAgdm9sYXRpbGUgdm9pZCAqc2xlZXBfbG9jOworICAgICAgICAgICAgICAgIC8vIElmIHRoZSB0aHJlYWQgaXMgc2xlZXBpbmcsIGF3YWtlbiBpdC4KKyAgICAgICAgICAgICAgICBpZiAoICggc2xlZXBfbG9jID0gVENSX1BUUiggdGhyZWFkLT50aC50aF9zbGVlcF9sb2MpICkgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcF93YWl0X3RvX3VucmVmX3Rhc2tfdGVhbTogVCMlZCB3YWtpbmcgdXAgdGhyZWFkIFQjJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aHJlYWQgKSwgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhyZWFkICkgKSApOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9udWxsX3Jlc3VtZV93cmFwcGVyKF9fa21wX2d0aWRfZnJvbV90aHJlYWQodGhyZWFkKSwgc2xlZXBfbG9jKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRvbmUpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgd2UgYXJlIG92ZXJzdWJzY3JpYmVkLAorICAgICAgICAvLyBvciBoYXZlIHdhaXRlZCBhIGJpdCAoYW5kIGxpYnJhcnkgbW9kZSBpcyB0aHJvdWdocHV0KSwgeWllbGQuCisgICAgICAgIC8vIFBhdXNlIGlzIGluIHRoZSBmb2xsb3dpbmcgY29kZS4KKyAgICAgICAgS01QX1lJRUxEKCBUQ1JfNChfX2ttcF9udGgpID4gX19rbXBfYXZhaWxfcHJvYyApOworICAgICAgICBLTVBfWUlFTERfU1BJTiggc3BpbnMgKTsgICAgICAgIC8vIFlpZWxkcyBvbmx5IGlmIEtNUF9MSUJSQVJZPXRocm91Z2hwdXQKKyAgICB9CisKKworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF90YXNrX3RlYW1fc2V0dXA6ICBDcmVhdGUgYSB0YXNrX3RlYW0gZm9yIHRoZSBjdXJyZW50IHRlYW0sIGJ1dCB1c2UKKy8vIGFuIGFscmVhZHkgY3JlYXRlZCwgdW51c2VkIG9uZSBpZiBpdCBhbHJlYWR5IGV4aXN0cy4KK3ZvaWQKK19fa21wX3Rhc2tfdGVhbV9zZXR1cCgga21wX2luZm9fdCAqdGhpc190aHIsIGttcF90ZWFtX3QgKnRlYW0sIGludCBhbHdheXMgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICk7CisKKyAgICAvLyBJZiB0aGlzIHRhc2tfdGVhbSBoYXNuJ3QgYmVlbiBjcmVhdGVkIHlldCwgYWxsb2NhdGUgaXQuIEl0IHdpbGwgYmUgdXNlZCBpbiB0aGUgcmVnaW9uIGFmdGVyIHRoZSBuZXh0LgorICAgIC8vIElmIGl0IGV4aXN0cywgaXQgaXMgdGhlIGN1cnJlbnQgdGFzayB0ZWFtIGFuZCBzaG91bGRuJ3QgYmUgdG91Y2hlZCB5ZXQgYXMgaXQgbWF5IHN0aWxsIGJlIGluIHVzZS4KKyAgICBpZiAodGVhbS0+dC50X3Rhc2tfdGVhbVt0aGlzX3Roci0+dGgudGhfdGFza19zdGF0ZV0gPT0gTlVMTCAmJiAoYWx3YXlzIHx8IHRlYW0tPnQudF9ucHJvYyA+IDEpICkgeyAKKyAgICAgICAgdGVhbS0+dC50X3Rhc2tfdGVhbVt0aGlzX3Roci0+dGgudGhfdGFza19zdGF0ZV0gPSBfX2ttcF9hbGxvY2F0ZV90YXNrX3RlYW0oIHRoaXNfdGhyLCB0ZWFtICk7CisgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3Rhc2tfdGVhbV9zZXR1cDogTWFzdGVyIFQjJWQgY3JlYXRlZCBuZXcgdGFza190ZWFtICVwIGZvciB0ZWFtICVkIGF0IHBhcml0eT0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKHRoaXNfdGhyKSwgdGVhbS0+dC50X3Rhc2tfdGVhbVt0aGlzX3Roci0+dGgudGhfdGFza19zdGF0ZV0sCisgICAgICAgICAgICAgICAgICAgICAgKCh0ZWFtICE9IE5VTEwpID8gdGVhbS0+dC50X2lkIDogLTEpLCB0aGlzX3Roci0+dGgudGhfdGFza19zdGF0ZSkpOworICAgIH0KKworICAgIC8vIEFmdGVyIHRocmVhZHMgZXhpdCB0aGUgcmVsZWFzZSwgdGhleSB3aWxsIGNhbGwgc3luYywgYW5kIHRoZW4gcG9pbnQgdG8gdGhpcyBvdGhlciB0YXNrX3RlYW07IG1ha2Ugc3VyZSBpdCBpcyAKKyAgICAvLyBhbGxvY2F0ZWQgYW5kIHByb3Blcmx5IGluaXRpYWxpemVkLiBBcyB0aHJlYWRzIHNwaW4gaW4gdGhlIGJhcnJpZXIgcmVsZWFzZSBwaGFzZSwgdGhleSB3aWxsIGNvbnRpbnVlIHRvIHVzZSB0aGUKKyAgICAvLyBwcmV2aW91cyB0YXNrX3RlYW0gc3RydWN0KGFib3ZlKSwgdW50aWwgdGhleSByZWNlaXZlIHRoZSBzaWduYWwgdG8gc3RvcCBjaGVja2luZyBmb3IgdGFza3MgKHRoZXkgY2FuJ3Qgc2FmZWx5CisgICAgLy8gcmVmZXJlbmNlIHRoZSBrbXBfdGVhbV90IHN0cnVjdCwgd2hpY2ggY291bGQgYmUgcmVhbGxvY2F0ZWQgYnkgdGhlIG1hc3RlciB0aHJlYWQpLiBObyB0YXNrIHRlYW1zIGFyZSBmb3JtZWQgZm9yIAorICAgIC8vIHNlcmlhbGl6ZWQgdGVhbXMuCisgICAgaWYgKHRlYW0tPnQudF9ucHJvYyA+IDEpIHsKKyAgICAgICAgaW50IG90aGVyX3RlYW0gPSAxIC0gdGhpc190aHItPnRoLnRoX3Rhc2tfc3RhdGU7CisgICAgICAgIGlmICh0ZWFtLT50LnRfdGFza190ZWFtW290aGVyX3RlYW1dID09IE5VTEwpIHsgLy8gc2V0dXAgb3RoZXIgdGVhbSBhcyB3ZWxsCisgICAgICAgICAgICAgICAgdGVhbS0+dC50X3Rhc2tfdGVhbVtvdGhlcl90ZWFtXSA9IF9fa21wX2FsbG9jYXRlX3Rhc2tfdGVhbSggdGhpc190aHIsIHRlYW0gKTsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF90YXNrX3RlYW1fc2V0dXA6IE1hc3RlciBUIyVkIGNyZWF0ZWQgc2Vjb25kIG5ldyB0YXNrX3RlYW0gJXAgZm9yIHRlYW0gJWQgYXQgcGFyaXR5PSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aGlzX3RociApLCB0ZWFtLT50LnRfdGFza190ZWFtW290aGVyX3RlYW1dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh0ZWFtICE9IE5VTEwpID8gdGVhbS0+dC50X2lkIDogLTEpLCBvdGhlcl90ZWFtICkpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeyAvLyBMZWF2ZSB0aGUgb2xkIHRhc2sgdGVhbSBzdHJ1Y3QgaW4gcGxhY2UgZm9yIHRoZSB1cGNvbWluZyByZWdpb247IGFkanVzdCBhcyBuZWVkZWQKKyAgICAgICAgICAgIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtID0gdGVhbS0+dC50X3Rhc2tfdGVhbVtvdGhlcl90ZWFtXTsKKyAgICAgICAgICAgIGlmICghdGFza190ZWFtLT50dC50dF9hY3RpdmUgfHwgdGVhbS0+dC50X25wcm9jICE9IHRhc2tfdGVhbS0+dHQudHRfbnByb2MpIHsKKyAgICAgICAgICAgICAgICBUQ1dfNCh0YXNrX3RlYW0tPnR0LnR0X25wcm9jLCB0ZWFtLT50LnRfbnByb2MpOworICAgICAgICAgICAgICAgIFRDV180KHRhc2tfdGVhbS0+dHQudHRfZm91bmRfdGFza3MsIEZBTFNFKTsKKyNpZiBPTVBfNDFfRU5BQkxFRAorICAgICAgICAgICAgICAgIFRDV180KHRhc2tfdGVhbS0+dHQudHRfZm91bmRfcHJveHlfdGFza3MsIEZBTFNFKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIFRDV180KHRhc2tfdGVhbS0+dHQudHRfdW5maW5pc2hlZF90aHJlYWRzLCB0ZWFtLT50LnRfbnByb2MgKTsKKyAgICAgICAgICAgICAgICBUQ1dfNCh0YXNrX3RlYW0tPnR0LnR0X2FjdGl2ZSwgVFJVRSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gaWYgdGVhbSBzaXplIGhhcyBjaGFuZ2VkLCB0aGUgZmlyc3QgdGhyZWFkIHRvIGVuYWJsZSB0YXNraW5nIHdpbGwgcmVhbGxvYyB0aHJlYWRzX2RhdGEgaWYgbmVjZXNzYXJ5CisgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF90YXNrX3RlYW1fc2V0dXA6IE1hc3RlciBUIyVkIHJlc2V0IG5leHQgdGFza190ZWFtICVwIGZvciB0ZWFtICVkIGF0IHBhcml0eT0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhpc190aHIgKSwgdGVhbS0+dC50X3Rhc2tfdGVhbVtvdGhlcl90ZWFtXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCh0ZWFtICE9IE5VTEwpID8gdGVhbS0+dC50X2lkIDogLTEpLCBvdGhlcl90ZWFtICkpOworICAgICAgICB9CisgICAgfQorfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF90YXNrX3RlYW1fc3luYzogUHJvcGFnYXRpb24gb2YgdGFzayB0ZWFtIGRhdGEgZnJvbSB0ZWFtIHRvIHRocmVhZHMKKy8vIHdoaWNoIGhhcHBlbnMganVzdCBhZnRlciB0aGUgcmVsZWFzZSBwaGFzZSBvZiBhIHRlYW0gYmFycmllci4gIFRoaXMgbWF5IGJlCisvLyBjYWxsZWQgYnkgYW55IHRocmVhZCwgYnV0IG9ubHkgZm9yIHRlYW1zIHdpdGggIyB0aHJlYWRzID4gMS4KKwordm9pZAorX19rbXBfdGFza190ZWFtX3N5bmMoIGttcF9pbmZvX3QgKnRoaXNfdGhyLCBrbXBfdGVhbV90ICp0ZWFtICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApOworCisgICAgLy8gVG9nZ2xlIHRoZSB0aF90YXNrX3N0YXRlIGZpZWxkLCB0byBzd2l0Y2ggd2hpY2ggdGFza190ZWFtIHRoaXMgdGhyZWFkIHJlZmVycyB0bworICAgIHRoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlID0gMSAtIHRoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlOworICAgIC8vIEl0IGlzIG5vdyBzYWZlIHRvIHByb3BhZ2F0ZSB0aGUgdGFzayB0ZWFtIHBvaW50ZXIgZnJvbSB0aGUgdGVhbSBzdHJ1Y3QgdG8gdGhlIGN1cnJlbnQgdGhyZWFkLgorICAgIFRDV19QVFIodGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSwgdGVhbS0+dC50X3Rhc2tfdGVhbVt0aGlzX3Roci0+dGgudGhfdGFza19zdGF0ZV0pOworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3Rhc2tfdGVhbV9zeW5jOiBUaHJlYWQgVCMlZCB0YXNrIHRlYW0gc3dpdGNoZWQgdG8gdGFza190ZWFtICVwIGZyb20gVGVhbSAjJWQgKHBhcml0eT0lZClcbiIsCisgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aGlzX3RociApLCB0aGlzX3Roci0+dGgudGhfdGFza190ZWFtLAorICAgICAgICAgICAgICAgICAgKCh0ZWFtICE9IE5VTEwpID8gdGVhbS0+dC50X2lkIDogLTEpLCB0aGlzX3Roci0+dGgudGhfdGFza19zdGF0ZSkpOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX3Rhc2tfdGVhbV93YWl0OiBNYXN0ZXIgdGhyZWFkIHdhaXRzIGZvciBvdXRzdGFuZGluZyB0YXNrcyBhZnRlciB0aGUgYmFycmllciBnYXRoZXIKKy8vIHBoYXNlLiAgT25seSBjYWxsZWQgYnkgbWFzdGVyIHRocmVhZCBpZiAjdGhyZWFkcyBpbiB0ZWFtID4gMSBvciBpZiBwcm94eSB0YXNrcyB3ZXJlIGNyZWF0ZWQuCisvLyB3YWl0IGlzIGEgZmxhZyB0aGF0IGRlZmF1bHRzIHRvIDEgKHNlZSBrbXAuaCksIGJ1dCB3YWl0aW5nIGNhbiBiZSB0dXJuZWQgb2ZmIGJ5IHBhc3NpbmcgaW4gMAorLy8gb3B0aW9uYWxseSBhcyB0aGUgbGFzdCBhcmd1bWVudC4gV2hlbiB3YWl0IGlzIHplcm8sIG1hc3RlciB0aHJlYWQgZG9lcyBub3Qgd2FpdCBmb3IKKy8vIHVuZmluaXNoZWRfdGhyZWFkcyB0byByZWFjaCAwLgordm9pZAorX19rbXBfdGFza190ZWFtX3dhaXQoIGttcF9pbmZvX3QgKnRoaXNfdGhyLCBrbXBfdGVhbV90ICp0ZWFtCisgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqIGl0dF9zeW5jX29iaikKKyAgICAgICAgICAgICAgICAgICAgICAsIGludCB3YWl0KQoreworICAgIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtID0gdGVhbS0+dC50X3Rhc2tfdGVhbVt0aGlzX3Roci0+dGgudGhfdGFza19zdGF0ZV07CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tfdGVhbSA9PSB0aGlzX3Roci0+dGgudGhfdGFza190ZWFtICk7CisKKyAgICBpZiAoICggdGFza190ZWFtICE9IE5VTEwgKSAmJiBLTVBfVEFTS0lOR19FTkFCTEVEKHRhc2tfdGVhbSkgKSB7CisgICAgICAgIGlmICh3YWl0KSB7CisgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF90YXNrX3RlYW1fd2FpdDogTWFzdGVyIFQjJWQgd2FpdGluZyBmb3IgYWxsIHRhc2tzIChmb3IgdW5maW5pc2hlZF90aHJlYWRzIHRvIHJlYWNoIDApIG9uIHRhc2tfdGVhbSA9ICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKHRoaXNfdGhyKSwgdGFza190ZWFtKSk7CisgICAgICAgICAgICAvLyBXb3JrZXIgdGhyZWFkcyBtYXkgaGF2ZSBkcm9wcGVkIHRocm91Z2ggdG8gcmVsZWFzZSBwaGFzZSwgYnV0IGNvdWxkIHN0aWxsIGJlIGV4ZWN1dGluZyB0YXNrcy4gV2FpdAorICAgICAgICAgICAgLy8gaGVyZSBmb3IgdGFza3MgdG8gY29tcGxldGUuIFRvIGF2b2lkIG1lbW9yeSBjb250ZW50aW9uLCBvbmx5IG1hc3RlciB0aHJlYWQgY2hlY2tzIHRlcm1pbmF0aW9uIGNvbmRpdGlvbi4KKyAgICAgICAgICAgIGttcF9mbGFnXzMyIGZsYWcoJnRhc2tfdGVhbS0+dHQudHRfdW5maW5pc2hlZF90aHJlYWRzLCAwVSk7CisgICAgICAgICAgICBmbGFnLndhaXQodGhpc190aHIsIFRSVUUKKyAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopKTsKKyAgICAgICAgfQorICAgICAgICAvLyBEZWFjdGl2YXRlIHRoZSBvbGQgdGFzayB0ZWFtLCBzbyB0aGF0IHRoZSB3b3JrZXIgdGhyZWFkcyB3aWxsIHN0b3AgcmVmZXJlbmNpbmcgaXQgd2hpbGUgc3Bpbm5pbmcuCisgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3Rhc2tfdGVhbV93YWl0OiBNYXN0ZXIgVCMlZCBkZWFjdGl2YXRpbmcgdGFza190ZWFtICVwOiAiCisgICAgICAgICAgICAgICAgICAgICAgInNldHRpbmcgYWN0aXZlIHRvIGZhbHNlLCBzZXR0aW5nIGxvY2FsIGFuZCB0ZWFtJ3MgcG9pbnRlciB0byBOVUxMXG4iLAorICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQodGhpc190aHIpLCB0YXNrX3RlYW0pKTsKKyNpZiBPTVBfNDFfRU5BQkxFRAorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrX3RlYW0tPnR0LnR0X25wcm9jID4gMSB8fCB0YXNrX3RlYW0tPnR0LnR0X2ZvdW5kX3Byb3h5X3Rhc2tzID09IFRSVUUgKTsKKyAgICAgICAgVENXX1NZTkNfNCggdGFza190ZWFtLT50dC50dF9mb3VuZF9wcm94eV90YXNrcywgRkFMU0UgKTsKKyNlbHNlCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tfdGVhbS0+dHQudHRfbnByb2MgPiAxICk7CisjZW5kaWYKKyAgICAgICAgVENXX1NZTkNfNCggdGFza190ZWFtLT50dC50dF9hY3RpdmUsIEZBTFNFICk7CisgICAgICAgIEtNUF9NQigpOworCisgICAgICAgIFRDV19QVFIodGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSwgTlVMTCk7CisgICAgfQorfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF90YXNraW5nX2JhcnJpZXI6CisvLyBUaGlzIHJvdXRpbmUgbWF5IG9ubHkgY2FsbGVkIHdoZW4gX19rbXBfdGFza2luZ19tb2RlID09IHRza21fZXh0cmFfYmFycmllci4KKy8vIEludGVybmFsIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgYWxsIHRhc2tzIHByaW9yIHRvIGEgcmVndWxhciBiYXJyaWVyIG9yIGEKKy8vIGpvaW4gYmFycmllci4gIEl0IGlzIGEgZnVsbCBiYXJyaWVyIGl0c2VsZiwgd2hpY2ggdW5mb3J0dW5hdGVseSB0dXJucworLy8gcmVndWxhciBiYXJyaWVycyBpbnRvIGRvdWJsZSBiYXJyaWVycyBhbmQgam9pbiBiYXJyaWVycyBpbnRvIDEgMS8yCisvLyBiYXJyaWVycy4KK3ZvaWQKK19fa21wX3Rhc2tpbmdfYmFycmllcigga21wX3RlYW1fdCAqdGVhbSwga21wX2luZm9fdCAqdGhyZWFkLCBpbnQgZ3RpZCApCit7CisgICAgdm9sYXRpbGUga21wX3VpbnQzMiAqc3BpbiA9ICZ0ZWFtLT50LnRfdGFza190ZWFtW3RocmVhZC0+dGgudGhfdGFza19zdGF0ZV0tPnR0LnR0X3VuZmluaXNoZWRfdGhyZWFkczsKKyAgICBpbnQgZmxhZyA9IEZBTFNFOworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3Rhc2tpbmdfbW9kZSA9PSB0c2ttX2V4dHJhX2JhcnJpZXIgKTsKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBLTVBfRlNZTkNfU1BJTl9JTklUKCBzcGluLCAoa21wX3VpbnQzMiopIE5VTEwgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAga21wX2ZsYWdfMzIgc3Bpbl9mbGFnKHNwaW4sIDBVKTsKKyAgICB3aGlsZSAoISBzcGluX2ZsYWcuZXhlY3V0ZV90YXNrcyh0aHJlYWQsIGd0aWQsIFRSVUUsICZmbGFnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoTlVMTCksIDAgKSApIHsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIC8vIFRPRE86IFdoYXQgYWJvdXQgaXR0X3N5bmNfb2JqPz8KKyAgICAgICAgS01QX0ZTWU5DX1NQSU5fUFJFUEFSRSggc3BpbiApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgICAgICBpZiggVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSApIHsKKyAgICAgICAgICAgIGlmKCBfX2ttcF9nbG9iYWwuZy5nX2Fib3J0ICkKKyAgICAgICAgICAgICAgICBfX2ttcF9hYm9ydF90aHJlYWQoICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBLTVBfWUlFTEQoIFRSVUUgKTsgICAgICAgLy8gR0g6IFdlIGFsd2F5cyB5aWVsZCBoZXJlCisgICAgfQorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBLTVBfRlNZTkNfU1BJTl9BQ1FVSVJFRCggKHZvaWQqKSBzcGluICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworfQorCisKKyNpZiBPTVBfNDFfRU5BQkxFRAorCisvKiBfX2ttcF9naXZlX3Rhc2sgcHV0cyBhIHRhc2sgaW50byBhIGdpdmVuIHRocmVhZCBxdWV1ZSBpZjoKKyAgICAtIHRoZSBxdWV1ZSBmb3IgdGhhdCB0aHJlYWQgaXQgd2FzIGNyZWF0ZWQKKyAgICAtIHRoZXJlJ3Mgc3BhY2UgaW4gdGhhdCBxdWV1ZQorCisgICAgQmVjYXVzZSBvZiB0aGlzLCBfX2ttcF9wdXNoX3Rhc2sgbmVlZHMgdG8gY2hlY2sgaWYgdGhlcmUncyBzcGFjZSBhZnRlciBnZXR0aW5nIHRoZSBsb2NrCisgKi8KK3N0YXRpYyBib29sIF9fa21wX2dpdmVfdGFzayAoIGttcF9pbmZvX3QgKnRocmVhZCwga21wX2ludDMyIHRpZCwga21wX3Rhc2tfdCAqIHRhc2sgKQoreworICAgIGttcF90YXNrX3RlYW1fdCAqICAgdGFza190ZWFtID0gdGhyZWFkLT50aC50aF90YXNrX3RlYW07CisgICAga21wX3RocmVhZF9kYXRhX3QgKiB0aHJlYWRfZGF0YSA9ICYgdGFza190ZWFtIC0+IHR0LnR0X3RocmVhZHNfZGF0YVsgdGlkIF07CisgICAga21wX3Rhc2tkYXRhX3QgKiAgICB0YXNrZGF0YSA9IEtNUF9UQVNLX1RPX1RBU0tEQVRBKHRhc2spOworICAgIGJvb2wgcmVzdWx0ID0gZmFsc2U7CisKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9naXZlX3Rhc2s6IHRyeWluZyB0byBnaXZlIHRhc2sgJXAgdG8gdGhyZWFkICVkLlxuIiwgdGFza2RhdGEsIHRpZCApICk7CisKKyAgICAvLyBhc3NlcnQgdGFza2luZyBpcyBlbmFibGVkPyB3aGF0IGlmIG5vdD8KKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrX3RlYW0gIT0gTlVMTCApOworCisgICAgaWYgKHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlID09IE5VTEwgKSB7CisgICAgICAgIC8vIFRoZXJlJ3Mgbm8gcXVldWUgaW4gdGhpcyB0aHJlYWQsIGdvIGZpbmQgYW5vdGhlciBvbmUKKyAgICAgICAgLy8gV2UncmUgZ3VhcmFudGVlZCB0aGF0IGF0IGxlYXN0IG9uZSB0aHJlYWQgaGFzIGEgcXVldWUKKyAgICAgICAgS0FfVFJBQ0UoMzAsICgiX19rbXBfZ2l2ZV90YXNrOiB0aHJlYWQgJWQgaGFzIG5vIHF1ZXVlIHdoaWxlIGdpdmluZyB0YXNrICVwLlxuIiwgdGlkLCB0YXNrZGF0YSApICk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgaWYgKCBUQ1JfNCh0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9udGFza3MpID49IFRBU0tfREVRVUVfU0laRSApCisgICAgeworICAgICAgICBLQV9UUkFDRSgzMCwgKCJfX2ttcF9naXZlX3Rhc2s6IHF1ZXVlIGlzIGZ1bGwgd2hpbGUgZ2l2aW5nIHRhc2sgJXAgdG8gdGhyZWFkICVkLlxuIiwgdGFza2RhdGEsIHRpZCApICk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiB0aHJlYWRfZGF0YS0+IHRkLnRkX2RlcXVlX2xvY2sgKTsKKworICAgIGlmICggVENSXzQodGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbnRhc2tzKSA+PSBUQVNLX0RFUVVFX1NJWkUgKQorICAgIHsKKyAgICAgICAgS0FfVFJBQ0UoMzAsICgiX19rbXBfZ2l2ZV90YXNrOiBxdWV1ZSBpcyBmdWxsIHdoaWxlIGdpdmluZyB0YXNrICVwIHRvIHRocmVhZCAlZC5cbiIsIHRhc2tkYXRhLCB0aWQgKSApOworICAgICAgICBnb3RvIHJlbGVhc2VfYW5kX2V4aXQ7CisgICAgfQorCisgICAgdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVbIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX3RhaWwgXSA9IHRhc2tkYXRhOworICAgIC8vIFdyYXAgaW5kZXguCisgICAgdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfdGFpbCA9ICggdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfdGFpbCArIDEgKSAmIFRBU0tfREVRVUVfTUFTSzsKKyAgICBUQ1dfNCh0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9udGFza3MsIFRDUl80KHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX250YXNrcykgKyAxKTsKKworICAgIHJlc3VsdCA9IHRydWU7CisgICAgS0FfVFJBQ0UoMzAsICgiX19rbXBfZ2l2ZV90YXNrOiBzdWNjZXNzZnVsbHkgZ2F2ZSB0YXNrICVwIHRvIHRocmVhZCAlZC5cbiIsIHRhc2tkYXRhLCB0aWQgKSApOworCityZWxlYXNlX2FuZF9leGl0OgorICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgdGhyZWFkX2RhdGEtPiB0ZC50ZF9kZXF1ZV9sb2NrICk7CisKKyAgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCisvKiBUaGUgZmluaXNoIG9mIHRoZSBhIHByb3h5IHRhc2tzIGlzIGRpdmlkZWQgaW4gdHdvIHBpZWNlczoKKyAgICAtIHRoZSB0b3AgaGFsZiBpcyB0aGUgb25lIHRoYXQgY2FuIGJlIGRvbmUgZnJvbSBhIHRocmVhZCBvdXRzaWRlIHRoZSB0ZWFtCisgICAgLSB0aGUgYm90dG9tIGhhbGYgbXVzdCBiZSBydW4gZnJvbSBhIHRoZW0gd2l0aGluIHRoZSB0ZWFtCisKKyAgICBJbiBvcmRlciB0byBydW4gdGhlIGJvdHRvbSBoYWxmIHRoZSB0YXNrIGdldHMgcXVldWVkIGJhY2sgaW50byBvbmUgb2YgdGhlIHRocmVhZHMgb2YgdGhlIHRlYW0uCisgICAgT25jZSB0aGUgdGRfaW5jb21wbGV0ZV9jaGlsZF90YXNrIGNvdW50ZXIgb2YgdGhlIHBhcmVudCBpcyBkZWNyZW1lbnRlZCB0aGUgdGhyZWFkcyBjYW4gbGVhdmUgdGhlIGJhcnJpZXJzLgorICAgIFNvLCB0aGUgYm90dG9tIGhhbGYgbmVlZHMgdG8gYmUgcXVldWVkIGJlZm9yZSB0aGUgY291bnRlciBpcyBkZWNyZW1lbnRlZC4gVGhlIHRvcCBoYWxmIGlzIHRoZXJlZm9yZSBkaXZpZGVkIGluIHR3byBwYXJ0czoKKyAgICAtIHRoaW5ncyB0aGF0IGNhbiBiZSBydW4gYmVmb3JlIHF1ZXVpbmcgdGhlIGJvdHRvbSBoYWxmCisgICAgLSB0aGluZ3MgdGhhdCBtdXN0IGJlIHJ1biBhZnRlciBxdWV1aW5nIHRoZSBib3R0b20gaGFsZgorCisgICAgVGhpcyBjcmVhdGVzIGEgc2Vjb25kIHJhY2UgYXMgdGhlIGJvdHRvbSBoYWxmIGNhbiBmcmVlIHRoZSB0YXNrIGJlZm9yZSB0aGUgc2Vjb25kIHRvcCBoYWxmIGlzIGV4ZWN1dGVkLiBUbyBhdm9pZCB0aGlzCisgICAgd2UgdXNlIHRoZSB0ZF9pbmNvbXBsZXRlX2NoaWxkX3Rhc2sgb2YgdGhlIHByb3h5IHRhc2sgdG8gc3luY2hyb25pemUgdGhlIHRvcCBhbmQgYm90dG9tIGhhbGYuCisqLworCitzdGF0aWMgdm9pZCBfX2ttcF9maXJzdF90b3BfaGFsZl9maW5pc2hfcHJveHkoIGttcF90YXNrZGF0YV90ICogdGFza2RhdGEgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLnRhc2t0eXBlID09IFRBU0tfRVhQTElDSVQgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YSAtPiB0ZF9mbGFncy5wcm94eSA9PSBUQVNLX1BST1hZICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza2RhdGEgLT4gdGRfZmxhZ3MuY29tcGxldGUgPT0gMCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLmZyZWVkID09IDAgKTsKKworICAgIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLmNvbXBsZXRlID0gMTsgICAvLyBtYXJrIHRoZSB0YXNrIGFzIGNvbXBsZXRlZAorCisgICAgaWYgKCB0YXNrZGF0YS0+dGRfdGFza2dyb3VwICkKKyAgICAgICBLTVBfVEVTVF9USEVOX0RFQzMyKCAoa21wX2ludDMyICopKCYgdGFza2RhdGEtPnRkX3Rhc2tncm91cC0+Y291bnQpICk7CisKKyAgICAvLyBDcmVhdGUgYW4gaW1hZ2luYXJ5IGNoaWxkcmVuIGZvciB0aGlzIHRhc2sgc28gdGhlIGJvdHRvbSBoYWxmIGNhbm5vdCByZWxlYXNlIHRoZSB0YXNrIGJlZm9yZSB3ZSBoYXZlIGNvbXBsZXRlZCB0aGUgc2Vjb25kIHRvcCBoYWxmCisgICAgVENSXzQodGFza2RhdGEtPnRkX2luY29tcGxldGVfY2hpbGRfdGFza3MrKyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fa21wX3NlY29uZF90b3BfaGFsZl9maW5pc2hfcHJveHkoIGttcF90YXNrZGF0YV90ICogdGFza2RhdGEgKQoreworICAgIGttcF9pbnQzMiBjaGlsZHJlbiA9IDA7CisKKyAgICAvLyBQcmVkZWNyZW1lbnQgc2ltdWxhdGVkIGJ5ICItIDEiIGNhbGN1bGF0aW9uCisgICAgY2hpbGRyZW4gPSBLTVBfVEVTVF9USEVOX0RFQzMyKCAoa21wX2ludDMyICopKCYgdGFza2RhdGEgLT4gdGRfcGFyZW50IC0+IHRkX2luY29tcGxldGVfY2hpbGRfdGFza3MpICkgLSAxOworICAgIEtNUF9ERUJVR19BU1NFUlQoIGNoaWxkcmVuID49IDAgKTsKKworICAgIC8vIFJlbW92ZSB0aGUgaW1hZ2luYXJ5IGNoaWxkcmVuCisgICAgVENSXzQodGFza2RhdGEtPnRkX2luY29tcGxldGVfY2hpbGRfdGFza3MtLSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fa21wX2JvdHRvbV9oYWxmX2ZpbmlzaF9wcm94eSgga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKiBwdGFzayApCit7CisgICAga21wX3Rhc2tkYXRhX3QgKiB0YXNrZGF0YSA9IEtNUF9UQVNLX1RPX1RBU0tEQVRBKHB0YXNrKTsKKyAgICBrbXBfaW5mb190ICogdGhyZWFkID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza2RhdGEgLT4gdGRfZmxhZ3MucHJveHkgPT0gVEFTS19QUk9YWSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLmNvbXBsZXRlID09IDEgKTsgLy8gdG9wIGhhbGYgbXVzdCBydW4gYmVmb3JlIGJvdHRvbSBoYWxmCisKKyAgICAvLyBXZSBuZWVkIHRvIHdhaXQgdG8gbWFrZSBzdXJlIHRoZSB0b3AgaGFsZiBpcyBmaW5pc2hlZAorICAgIC8vIFNwaW5uaW5nIGhlcmUgc2hvdWxkIGJlIG9rIGFzIHRoaXMgc2hvdWxkIGhhcHBlbiBxdWlja2x5CisgICAgd2hpbGUgKCBUQ1JfNCh0YXNrZGF0YS0+dGRfaW5jb21wbGV0ZV9jaGlsZF90YXNrcykgPiAwICkgOworCisgICAgX19rbXBfcmVsZWFzZV9kZXBzKGd0aWQsdGFza2RhdGEpOworICAgIF9fa21wX2ZyZWVfdGFza19hbmRfYW5jZXN0b3JzKGd0aWQsIHRhc2tkYXRhLCB0aHJlYWQpOworfQorCisvKiEKK0Bpbmdyb3VwIFRBU0tJTkcKK0BwYXJhbSBndGlkIEdsb2JhbCBUaHJlYWQgSUQgb2YgZW5jb3VudGVyaW5nIHRocmVhZAorQHBhcmFtIHB0YXNrIFRhc2sgd2hpY2ggZXhlY3V0aW9uIGlzIGNvbXBsZXRlZAorCitFeGVjdXRlIHRoZSBjb21wbGV0YXRpb24gb2YgYSBwcm94eSB0YXNrIGZyb20gYSB0aHJlYWQgb2YgdGhhdCBpcyBwYXJ0IG9mIHRoZSB0ZWFtLiBSdW4gZmlyc3QgYW5kIGJvdHRvbSBoYWx2ZXMgZGlyZWN0bHkuCisqLwordm9pZCBfX2ttcGNfcHJveHlfdGFza19jb21wbGV0ZWQoIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICpwdGFzayApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggcHRhc2sgIT0gTlVMTCApOworICAgIGttcF90YXNrZGF0YV90ICogdGFza2RhdGEgPSBLTVBfVEFTS19UT19UQVNLREFUQShwdGFzayk7CisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfcHJveHlfdGFza19jb21wbGV0ZWQoZW50ZXIpOiBUIyVkIHByb3h5IHRhc2sgJXAgY29tcGxldGluZ1xuIiwgZ3RpZCwgdGFza2RhdGEgKSApOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza2RhdGEtPnRkX2ZsYWdzLnByb3h5ID09IFRBU0tfUFJPWFkgKTsKKworICAgIF9fa21wX2ZpcnN0X3RvcF9oYWxmX2ZpbmlzaF9wcm94eSh0YXNrZGF0YSk7CisgICAgX19rbXBfc2Vjb25kX3RvcF9oYWxmX2ZpbmlzaF9wcm94eSh0YXNrZGF0YSk7CisgICAgX19rbXBfYm90dG9tX2hhbGZfZmluaXNoX3Byb3h5KGd0aWQscHRhc2spOworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfcHJveHlfdGFza19jb21wbGV0ZWQoZXhpdCk6IFQjJWQgcHJveHkgdGFzayAlcCBjb21wbGV0aW5nXG4iLCBndGlkLCB0YXNrZGF0YSApICk7Cit9CisKKy8qIQorQGluZ3JvdXAgVEFTS0lORworQHBhcmFtIHB0YXNrIFRhc2sgd2hpY2ggZXhlY3V0aW9uIGlzIGNvbXBsZXRlZAorCitFeGVjdXRlIHRoZSBjb21wbGV0YXRpb24gb2YgYSBwcm94eSB0YXNrIGZyb20gYSB0aHJlYWQgdGhhdCBjb3VsZCBub3QgYmVsb25nIHRvIHRoZSB0ZWFtLgorKi8KK3ZvaWQgX19rbXBjX3Byb3h5X3Rhc2tfY29tcGxldGVkX29vbyAoIGttcF90YXNrX3QgKnB0YXNrICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBwdGFzayAhPSBOVUxMICk7CisgICAga21wX3Rhc2tkYXRhX3QgKiB0YXNrZGF0YSA9IEtNUF9UQVNLX1RPX1RBU0tEQVRBKHB0YXNrKTsKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3Byb3h5X3Rhc2tfY29tcGxldGVkX29vbyhlbnRlcik6IHByb3h5IHRhc2sgY29tcGxldGluZyBvb28gJXBcbiIsIHRhc2tkYXRhICkgKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhLT50ZF9mbGFncy5wcm94eSA9PSBUQVNLX1BST1hZICk7CisKKyAgICBfX2ttcF9maXJzdF90b3BfaGFsZl9maW5pc2hfcHJveHkodGFza2RhdGEpOworCisgICAgLy8gRW5xdWV1ZSB0YXNrIHRvIGNvbXBsZXRlIGJvdHRvbSBoYWxmIGNvbXBsZXRhdGlvbiBmcm9tIGEgdGhyZWFkIHdpdGhpbiB0aGUgY29ycmVzcG9uZGluZyB0ZWFtCisgICAga21wX3RlYW1fdCAqIHRlYW0gPSB0YXNrZGF0YS0+dGRfdGVhbTsKKyAgICBrbXBfaW50MzIgbnRocmVhZHMgPSB0ZWFtLT50LnRfbnByb2M7CisgICAga21wX2luZm9fdCAqdGhyZWFkOworICAgIGttcF9pbnQzMiBrID0gMDsKKworICAgIGRvIHsKKyAgICAgICAgLy9UaGlzIHNob3VsZCBiZSBzaW1pbGFyIHRvIGsgPSBfX2ttcF9nZXRfcmFuZG9tKCB0aHJlYWQgKSAlIG50aHJlYWRzIGJ1dCB3ZSBjYW5ub3QgdXNlIF9fa21wX2dldF9yYW5kb20gaGVyZQorICAgICAgICAvL0ZvciBub3cgd2UncmUganVzdCBsaW5lYXJseSB0cnlpbmcgdG8gZmluZCBhIHRocmVhZAorICAgICAgICBrID0gKGsrMSkgJSBudGhyZWFkczsKKyAgICAgICAgdGhyZWFkID0gdGVhbS0+dC50X3RocmVhZHNba107CisgICAgfSB3aGlsZSAoICFfX2ttcF9naXZlX3Rhc2soIHRocmVhZCwgaywgIHB0YXNrICkgKTsKKworICAgIF9fa21wX3NlY29uZF90b3BfaGFsZl9maW5pc2hfcHJveHkodGFza2RhdGEpOworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfcHJveHlfdGFza19jb21wbGV0ZWRfb29vKGV4aXQpOiBwcm94eSB0YXNrIGNvbXBsZXRpbmcgb29vICVwXG4iLCB0YXNrZGF0YSApICk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX3Rhc2txLmMgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfdGFza3EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDc5ZDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX3Rhc2txLmMKQEAgLTAsMCArMSwyMDMyIEBACisvKgorICoga21wX3Rhc2txLmMgLS0gVEFTS1Egc3VwcG9ydCBmb3IgT3Blbk1QLgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKyNpbmNsdWRlICJrbXBfaW8uaCIKKyNpbmNsdWRlICJrbXBfZXJyb3IuaCIKKworI2RlZmluZSBNQVhfTUVTU0FHRSA1MTIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIFRhc2txIHJvdXRpbmVzIGFuZCBnbG9iYWwgdmFyaWFibGVzCisgKi8KKworI2RlZmluZSBLTVBfREVCVUdfUkVGX0NUUyh4KSAgICBLRl9UUkFDRSgxLCB4KTsKKworI2RlZmluZSBUSFJFQURfQUxMT0NfRk9SX1RBU0tRCisKK3N0YXRpYyBpbnQKK2luX3BhcmFsbGVsX2NvbnRleHQoIGttcF90ZWFtX3QgKnRlYW0gKQoreworICAgIHJldHVybiAhIHRlYW0gLT4gdC50X3NlcmlhbGl6ZWQ7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF90YXNrcV9lbyggaW50ICpndGlkX3JlZiwgaW50ICpjaWRfcmVmLCBpZGVudF90ICpsb2NfcmVmICkKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgZ3RpZCA9ICpndGlkX3JlZjsKKyAgICBpbnQgICAgICAgICAgICAgICAgdGlkICA9IF9fa21wX3RpZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICBrbXBfdWludDMyICAgICAgICAgbXlfdG9rZW47CisgICAga21wY190YXNrX3F1ZXVlX3QgKnRhc2txOworICAgIGttcF90YXNrcV90ICAgICAgICp0cSAgID0gJiBfX2ttcF90aHJlYWRzW2d0aWRdIC0+IHRoLnRoX3RlYW0gLT4gdC50X3Rhc2txOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgICAgICAgIF9fa21wX3B1c2hfc3luYyggZ3RpZCwgY3Rfb3JkZXJlZF9pbl90YXNrcSwgbG9jX3JlZiwgTlVMTCwgMCApOworI2Vsc2UKKyAgICAgICAgX19rbXBfcHVzaF9zeW5jKCBndGlkLCBjdF9vcmRlcmVkX2luX3Rhc2txLCBsb2NfcmVmLCBOVUxMICk7CisjZW5kaWYKKworICAgIGlmICggISBfX2ttcF90aHJlYWRzWyBndGlkIF0tPiB0aC50aF90ZWFtIC0+IHQudF9zZXJpYWxpemVkICkgeworICAgICAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgICAgICAvKiBHRUggLSBuZWVkIGNoZWNrIGhlcmUgdW5kZXIgc3RhdHMgdG8gbWFrZSBzdXJlICAgKi8KKyAgICAgICAgLyogICAgICAgaW5zaWRlIHRhc2sgKGN1cnJfdGh1bmtbKnRpZF9yZWZdICE9IE5VTEwpICovCisKKyAgICAgICAgbXlfdG9rZW4gPXRxLT50cV9jdXJyX3RodW5rWyB0aWQgXS0+IHRoX3Rhc2tudW07CisKKyAgICAgICAgdGFza3EgPSB0cS0+dHFfY3Vycl90aHVua1sgdGlkIF0tPiB0aC50aF9zaGFyZWRzIC0+IHN2X3F1ZXVlOworCisgICAgICAgIEtNUF9XQUlUX1lJRUxEKCZ0YXNrcS0+dHFfdGFza251bV9zZXJ2aW5nLCBteV90b2tlbiwgS01QX0VRLCBOVUxMKTsKKyAgICAgICAgS01QX01CKCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorX19rbXBfdGFza3FfeG8oIGludCAqZ3RpZF9yZWYsIGludCAqY2lkX3JlZiwgaWRlbnRfdCAqbG9jX3JlZiApCit7CisgICAgaW50ICAgICAgICAgICBndGlkID0gKmd0aWRfcmVmOworICAgIGludCAgICAgICAgICAgdGlkICA9IF9fa21wX3RpZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICBrbXBfdWludDMyICAgIG15X3Rva2VuOworICAgIGttcF90YXNrcV90ICAqdHEgICA9ICYgX19rbXBfdGhyZWFkc1tndGlkXSAtPiB0aC50aF90ZWFtIC0+IHQudF90YXNrcTsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgX19rbXBfcG9wX3N5bmMoIGd0aWQsIGN0X29yZGVyZWRfaW5fdGFza3EsIGxvY19yZWYgKTsKKworICAgIGlmICggISBfX2ttcF90aHJlYWRzWyBndGlkIF0tPiB0aC50aF90ZWFtIC0+IHQudF9zZXJpYWxpemVkICkgeworICAgICAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgICAgICAvKiBHRUggLSBuZWVkIGNoZWNrIGhlcmUgdW5kZXIgc3RhdHMgdG8gbWFrZSBzdXJlICovCisgICAgICAgIC8qICAgICAgIGluc2lkZSB0YXNrIChjdXJyX3RodW5rW3RpZF0gIT0gTlVMTCkgICAgKi8KKworICAgICAgICBteV90b2tlbiA9IHRxLT50cV9jdXJyX3RodW5rWyB0aWQgXS0+dGhfdGFza251bTsKKworICAgICAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgICAgICB0cS0+dHFfY3Vycl90aHVua1sgdGlkIF0tPiB0aC50aF9zaGFyZWRzIC0+IHN2X3F1ZXVlIC0+IHRxX3Rhc2tudW1fc2VydmluZyA9IG15X3Rva2VuICsgMTsKKworICAgICAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF90YXNrcV9jaGVja19vcmRlcmVkKCBrbXBfaW50MzIgZ3RpZCwga21wY190aHVua190ICp0aHVuayApCit7CisgICAga21wX3VpbnQzMiBteV90b2tlbjsKKyAgICBrbXBjX3Rhc2tfcXVldWVfdCAqdGFza3E7CisKKyAgICAvKiBhc3N1bWUgd2UgYXJlIGFsd2F5cyBjYWxsZWQgZnJvbSBhbiBhY3RpdmUgcGFyYWxsZWwgY29udGV4dCAqLworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBteV90b2tlbiA9ICB0aHVuayAtPiB0aF90YXNrbnVtOworCisgICAgdGFza3EgPSAgdGh1bmsgLT4gdGgudGhfc2hhcmVkcyAtPiBzdl9xdWV1ZTsKKworICAgIGlmKHRhc2txLT50cV90YXNrbnVtX3NlcnZpbmcgPD0gbXlfdG9rZW4pIHsKKyAgICAgICAgS01QX1dBSVRfWUlFTEQoJnRhc2txLT50cV90YXNrbnVtX3NlcnZpbmcsIG15X3Rva2VuLCBLTVBfR0UsIE5VTEwpOworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgdGFza3EtPnRxX3Rhc2tudW1fc2VydmluZyA9IG15X3Rva2VuICsxOworICAgICAgICBLTVBfTUIoKTsKKyAgICB9Cit9CisKKyNpZmRlZiBLTVBfREVCVUcKKworc3RhdGljIHZvaWQKK19fa21wX2R1bXBfVFFGKGttcF9pbnQzMiBmbGFncykKK3sKKyAgICBpZiAoZmxhZ3MgJiBUUUZfSVNfT1JERVJFRCkKKyAgICAgICAgX19rbXBfcHJpbnRmKCJPUkRFUkVEICIpOworICAgIGlmIChmbGFncyAmIFRRRl9JU19MQVNUUFJJVkFURSkKKyAgICAgICAgX19rbXBfcHJpbnRmKCJMQVNUX1BSSVYgIik7CisgICAgaWYgKGZsYWdzICYgVFFGX0lTX05PV0FJVCkKKyAgICAgICAgX19rbXBfcHJpbnRmKCJOT1dBSVQgIik7CisgICAgaWYgKGZsYWdzICYgVFFGX0hFVVJJU1RJQ1MpCisgICAgICAgIF9fa21wX3ByaW50ZigiSEVVUklTVCAiKTsKKyAgICBpZiAoZmxhZ3MgJiBUUUZfSU5URVJGQUNFX1JFU0VSVkVEMSkKKyAgICAgICAgX19rbXBfcHJpbnRmKCJSRVNFUlYxICIpOworICAgIGlmIChmbGFncyAmIFRRRl9JTlRFUkZBQ0VfUkVTRVJWRUQyKQorICAgICAgICBfX2ttcF9wcmludGYoIlJFU0VSVjIgIik7CisgICAgaWYgKGZsYWdzICYgVFFGX0lOVEVSRkFDRV9SRVNFUlZFRDMpCisgICAgICAgIF9fa21wX3ByaW50ZigiUkVTRVJWMyAiKTsKKyAgICBpZiAoZmxhZ3MgJiBUUUZfSU5URVJGQUNFX1JFU0VSVkVENCkKKyAgICAgICAgX19rbXBfcHJpbnRmKCJSRVNFUlY0ICIpOworICAgIGlmIChmbGFncyAmIFRRRl9JU19MQVNUX1RBU0spCisgICAgICAgIF9fa21wX3ByaW50ZigiTEFTVF9UQVNLICIpOworICAgIGlmIChmbGFncyAmIFRRRl9UQVNLUV9UQVNLKQorICAgICAgICBfX2ttcF9wcmludGYoIlRBU0tRX1RBU0sgIik7CisgICAgaWYgKGZsYWdzICYgVFFGX1JFTEVBU0VfV09SS0VSUykKKyAgICAgICAgX19rbXBfcHJpbnRmKCJSRUxFQVNFICIpOworICAgIGlmIChmbGFncyAmIFRRRl9BTExfVEFTS1NfUVVFVUVEKQorICAgICAgICBfX2ttcF9wcmludGYoIkFMTF9RVUVVRUQgIik7CisgICAgaWYgKGZsYWdzICYgVFFGX1BBUkFMTEVMX0NPTlRFWFQpCisgICAgICAgIF9fa21wX3ByaW50ZigiUEFSQUxMRUwgIik7CisgICAgaWYgKGZsYWdzICYgVFFGX0RFQUxMT0NBVEVEKQorICAgICAgICBfX2ttcF9wcmludGYoIkRFQUxMT0MgIik7CisgICAgaWYgKCEoZmxhZ3MgJiAoVFFGX0lOVEVSTkFMX0ZMQUdTfFRRRl9JTlRFUkZBQ0VfRkxBR1MpKSkKKyAgICAgICAgX19rbXBfcHJpbnRmKCIoTk9ORSkiKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2R1bXBfdGh1bmsoIGttcF90YXNrcV90ICp0cSwga21wY190aHVua190ICp0aHVuaywga21wX2ludDMyIGdsb2JhbF90aWQgKQoreworICAgIGludCBpOworICAgIGludCBucHJvYyA9IF9fa21wX3RocmVhZHNbZ2xvYmFsX3RpZF0gLT4gdGgudGhfdGVhbSAtPiB0LnRfbnByb2M7CisKKyAgICBfX2ttcF9wcmludGYoIlx0VGh1bmsgYXQgJXAgb24gKCVkKTogICIsIHRodW5rLCBnbG9iYWxfdGlkKTsKKworICAgIGlmICh0aHVuayAhPSBOVUxMKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBucHJvYzsgaSsrKSB7CisgICAgICAgICAgICBpZiggdHEtPnRxX2N1cnJfdGh1bmtbaV0gPT0gdGh1bmsgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRmKCJbJWldICIsIGkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIF9fa21wX3ByaW50ZigidGhfc2hhcmVkcz0lcCwgIiwgdGh1bmstPnRoLnRoX3NoYXJlZHMpOworICAgICAgICBfX2ttcF9wcmludGYoInRoX3Rhc2s9JXAsICIsIHRodW5rLT50aF90YXNrKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCJ0aF9lbmNsX3RodW5rPSVwLCAiLCB0aHVuay0+dGhfZW5jbF90aHVuayk7CisgICAgICAgIF9fa21wX3ByaW50ZigidGhfc3RhdHVzPSVkLCAiLCB0aHVuay0+dGhfc3RhdHVzKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCJ0aF90YXNrbnVtPSV1LCAiLCB0aHVuay0+dGhfdGFza251bSk7CisgICAgICAgIF9fa21wX3ByaW50ZigidGhfZmxhZ3M9Iik7IF9fa21wX2R1bXBfVFFGKHRodW5rLT50aF9mbGFncyk7CisgICAgfQorCisgICAgX19rbXBfcHJpbnRmKCJcbiIpOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZHVtcF90aHVua19zdGFjayhrbXBjX3RodW5rX3QgKnRodW5rLCBrbXBfaW50MzIgdGhyZWFkX251bSkKK3sKKyAgICBrbXBjX3RodW5rX3QgKnRoOworCisgICAgX19rbXBfcHJpbnRmKCIgICAgVGh1bmsgc3RhY2sgZm9yIFQjJWQ6ICAiLCB0aHJlYWRfbnVtKTsKKworICAgIGZvciAodGggPSB0aHVuazsgdGggIT0gTlVMTDsgdGggPSB0aC0+dGhfZW5jbF90aHVuayApCisgICAgICAgIF9fa21wX3ByaW50ZigiJXAgIiwgdGgpOworCisgICAgX19rbXBfcHJpbnRmKCJcbiIpOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZHVtcF90YXNrX3F1ZXVlKCBrbXBfdGFza3FfdCAqdHEsIGttcGNfdGFza19xdWV1ZV90ICpxdWV1ZSwga21wX2ludDMyIGdsb2JhbF90aWQgKQoreworICAgIGludCAgICAgICAgICAgICAgICAgIHFzLCBjb3VudCwgaTsKKyAgICBrbXBjX3RodW5rX3QgICAgICAgICp0aHVuazsKKyAgICBrbXBjX3Rhc2tfcXVldWVfdCAgICp0YXNrcTsKKworICAgIF9fa21wX3ByaW50ZigiVGFzayBRdWV1ZSBhdCAlcCBvbiAoJWQpOlxuIiwgcXVldWUsIGdsb2JhbF90aWQpOworCisgICAgaWYgKHF1ZXVlICE9IE5VTEwpIHsKKyAgICAgICAgaW50IGluX3BhcmFsbGVsID0gcXVldWUtPnRxX2ZsYWdzICYgVFFGX1BBUkFMTEVMX0NPTlRFWFQ7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfbG9jICAgICAgICAgICAgIDogIik7CisgICAgfQorICAgICAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKworICAgICAgICAgICAgLy9pZiAocXVldWUtPnRxLnRxX3BhcmVudCAhPSAwKQorICAgICAgICAgICAgICAgIC8vX19rbXBfYWNxdWlyZV9sb2NrKCYgcXVldWUtPnRxLnRxX3BhcmVudC0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICAvL19fa21wX2FjcXVpcmVfbG9jaygmIHF1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworCisgICAgICAgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV9wYXJlbnQgICAgICAgICAgOiAlcFxuIiwgcXVldWUtPnRxLnRxX3BhcmVudCk7CisgICAgICAgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV9maXJzdF9jaGlsZCAgICAgOiAlcFxuIiwgcXVldWUtPnRxX2ZpcnN0X2NoaWxkKTsKKyAgICAgICAgICAgIF9fa21wX3ByaW50ZigiICAgIHRxX25leHRfY2hpbGQgICAgICA6ICVwXG4iLCBxdWV1ZS0+dHFfbmV4dF9jaGlsZCk7CisgICAgICAgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV9wcmV2X2NoaWxkICAgICAgOiAlcFxuIiwgcXVldWUtPnRxX3ByZXZfY2hpbGQpOworICAgICAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfcmVmX2NvdW50ICAgICAgIDogJWRcbiIsIHF1ZXVlLT50cV9yZWZfY291bnQpOworCisgICAgICAgICAgICAvL19fa21wX3JlbGVhc2VfbG9jaygmIHF1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgICAgIC8vaWYgKHF1ZXVlLT50cS50cV9wYXJlbnQgIT0gMCkKKyAgICAgICAgICAgICAgICAvL19fa21wX3JlbGVhc2VfbG9jaygmIHF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICAgICAgLy9fX2ttcF9hY3F1aXJlX2xvY2soJiBxdWV1ZS0+dHFfZnJlZV90aHVua3NfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgICAgIC8vX19rbXBfYWNxdWlyZV9sb2NrKCYgcXVldWUtPnRxX3F1ZXVlX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworICAgICAgICB9CisKKyAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfc2hhcmVkcyAgICAgICAgIDogIik7CisgICAgICAgIGZvciAoaT0wOyBpPCgocXVldWUgPT0gdHEtPnRxX3Jvb3QpID8gcXVldWUtPnRxX25wcm9jIDogMSk7IGkrKykKKyAgICAgICAgICAgIF9fa21wX3ByaW50ZigiJXAgIiwgcXVldWUtPnRxX3NoYXJlZHNbaV0uYWlfZGF0YSk7CisgICAgICAgIF9fa21wX3ByaW50ZigiXG4iKTsKKworICAgICAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgICAgIF9fa21wX3ByaW50ZigiICAgIHRxX3Rhc2tudW1fcXVldWluZyA6ICV1XG4iLCBxdWV1ZS0+dHFfdGFza251bV9xdWV1aW5nKTsKKyAgICAgICAgICAgIF9fa21wX3ByaW50ZigiICAgIHRxX3Rhc2tudW1fc2VydmluZyA6ICV1XG4iLCBxdWV1ZS0+dHFfdGFza251bV9zZXJ2aW5nKTsKKyAgICAgICAgfQorCisgICAgICAgIF9fa21wX3ByaW50ZigiICAgIHRxX3F1ZXVlICAgICAgICAgICA6ICVwXG4iLCBxdWV1ZS0+dHFfcXVldWUpOworICAgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV90aHVua19zcGFjZSAgICAgOiAlcFxuIiwgcXVldWUtPnRxX3RodW5rX3NwYWNlKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfdGFza3Ffc2xvdCAgICAgIDogJXBcbiIsIHF1ZXVlLT50cV90YXNrcV9zbG90KTsKKworICAgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV9mcmVlX3RodW5rcyAgICAgOiAiKTsKKyAgICAgICAgZm9yICh0aHVuayA9IHF1ZXVlLT50cV9mcmVlX3RodW5rczsgdGh1bmsgIT0gTlVMTDsgdGh1bmsgPSB0aHVuay0+dGgudGhfbmV4dF9mcmVlICkKKyAgICAgICAgICAgIF9fa21wX3ByaW50ZigiJXAgIiwgdGh1bmspOworICAgICAgICBfX2ttcF9wcmludGYoIlxuIik7CisKKyAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfbnNsb3RzICAgICAgICAgIDogJWRcbiIsIHF1ZXVlLT50cV9uc2xvdHMpOworICAgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV9oZWFkICAgICAgICAgICAgOiAlZFxuIiwgcXVldWUtPnRxX2hlYWQpOworICAgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV90YWlsICAgICAgICAgICAgOiAlZFxuIiwgcXVldWUtPnRxX3RhaWwpOworICAgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV9uZnVsbCAgICAgICAgICAgOiAlZFxuIiwgcXVldWUtPnRxX25mdWxsKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfaGl3YXQgICAgICAgICAgIDogJWRcbiIsIHF1ZXVlLT50cV9oaXdhdCk7CisgICAgICAgIF9fa21wX3ByaW50ZigiICAgIHRxX2ZsYWdzICAgICAgICAgICA6ICIpOyBfX2ttcF9kdW1wX1RRRihxdWV1ZS0+dHFfZmxhZ3MpOworICAgICAgICBfX2ttcF9wcmludGYoIlxuIik7CisKKyAgICAgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV90aF90aHVua3MgICAgICAgOiAiKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBxdWV1ZS0+dHFfbnByb2M7IGkrKykgeworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50ZigiJWQgIiwgcXVldWUtPnRxX3RoX3RodW5rc1tpXS5haV9kYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9fa21wX3ByaW50ZigiXG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIF9fa21wX3ByaW50ZigiXG4iKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgUXVldWUgc2xvdHM6XG4iKTsKKworCisgICAgICAgIHFzID0gcXVldWUtPnRxX3RhaWw7CisgICAgICAgIGZvciAoIGNvdW50ID0gMDsgY291bnQgPCBxdWV1ZS0+dHFfbmZ1bGw7ICsrY291bnQgKSB7CisgICAgICAgICAgICBfX2ttcF9wcmludGYoIiglZCkiLCBxcyk7CisgICAgICAgICAgICBfX2ttcF9kdW1wX3RodW5rKCB0cSwgcXVldWUtPnRxX3F1ZXVlW3FzXS5xc190aHVuaywgZ2xvYmFsX3RpZCApOworICAgICAgICAgICAgcXMgPSAocXMrMSkgJSBxdWV1ZS0+dHFfbnNsb3RzOworICAgICAgICB9CisKKyAgICAgICAgX19rbXBfcHJpbnRmKCJcbiIpOworCisgICAgICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICAgICAgaWYgKHF1ZXVlLT50cV90YXNrcV9zbG90ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoIiAgICBUYXNrUSBzbG90OlxuIik7CisgICAgICAgICAgICAgICAgX19rbXBfZHVtcF90aHVuayggdHEsIChrbXBjX3RodW5rX3QgKikgcXVldWUtPnRxX3Rhc2txX3Nsb3QsIGdsb2JhbF90aWQgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoIlxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL19fa21wX3JlbGVhc2VfbG9jaygmIHF1ZXVlLT50cV9xdWV1ZV9sY2ssIGdsb2JhbF90aWQpOworICAgICAgICAgICAgLy9fX2ttcF9yZWxlYXNlX2xvY2soJiBxdWV1ZS0+dHFfZnJlZV90aHVua3NfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIF9fa21wX3ByaW50ZigiICAgIFRhc2txIGZyZWVsaXN0OiAiKTsKKworICAgIC8vX19rbXBfYWNxdWlyZV9sb2NrKCAmIHRxLT50cV9mcmVlbGlzdF9sY2ssIGdsb2JhbF90aWQgKTsKKworICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKworICAgIGZvciggdGFza3EgPSB0cS0+dHFfZnJlZWxpc3Q7IHRhc2txICE9IE5VTEw7IHRhc2txID0gdGFza3EtPnRxLnRxX25leHRfZnJlZSApCisgICAgICAgIF9fa21wX3ByaW50ZigiJXAgIiwgdGFza3EpOworCisgICAgLy9fX2ttcF9yZWxlYXNlX2xvY2soICYgdHEtPnRxX2ZyZWVsaXN0X2xjaywgZ2xvYmFsX3RpZCApOworCisgICAgX19rbXBfcHJpbnRmKCJcblxuIik7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9hdXhfZHVtcF90YXNrX3F1ZXVlX3RyZWUoIGttcF90YXNrcV90ICp0cSwga21wY190YXNrX3F1ZXVlX3QgKmN1cnJfcXVldWUsIGttcF9pbnQzMiBsZXZlbCwga21wX2ludDMyIGdsb2JhbF90aWQgKQoreworICAgIGludCBpLCBjb3VudCwgcXM7CisgICAgaW50IG5wcm9jID0gX19rbXBfdGhyZWFkc1tnbG9iYWxfdGlkXSAtPiB0aC50aF90ZWFtIC0+IHQudF9ucHJvYzsKKyAgICBrbXBjX3Rhc2tfcXVldWVfdCAqcXVldWUgPSBjdXJyX3F1ZXVlOworCisgICAgaWYgKGN1cnJfcXVldWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworCisgICAgX19rbXBfcHJpbnRmKCIgICAgIik7CisKKyAgICBmb3IgKGk9MDsgaTxsZXZlbDsgaSsrKQorICAgICAgICBfX2ttcF9wcmludGYoIiAgIik7CisKKyAgICBfX2ttcF9wcmludGYoIiVwIiwgY3Vycl9xdWV1ZSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnByb2M7IGkrKykgeworICAgICAgICBpZiggdHEtPnRxX2N1cnJfdGh1bmtbaV0gJiYgdHEtPnRxX2N1cnJfdGh1bmtbaV0tPnRoLnRoX3NoYXJlZHMtPnN2X3F1ZXVlID09IGN1cnJfcXVldWUgKSB7CisgICAgICAgICAgICBfX2ttcF9wcmludGYoIiBbJWldIiwgaSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX2ttcF9wcmludGYoIjoiKTsKKworICAgIC8vX19rbXBfYWNxdWlyZV9sb2NrKCYgY3Vycl9xdWV1ZS0+dHFfcXVldWVfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKworICAgIHFzID0gY3Vycl9xdWV1ZS0+dHFfdGFpbDsKKworICAgIGZvciAoIGNvdW50ID0gMDsgY291bnQgPCBjdXJyX3F1ZXVlLT50cV9uZnVsbDsgKytjb3VudCApIHsKKyAgICAgICAgX19rbXBfcHJpbnRmKCIlcCAiLCBjdXJyX3F1ZXVlLT50cV9xdWV1ZVtxc10ucXNfdGh1bmspOworICAgICAgICAgcXMgPSAocXMrMSkgJSBjdXJyX3F1ZXVlLT50cV9uc2xvdHM7CisgICAgfQorCisgICAgLy9fX2ttcF9yZWxlYXNlX2xvY2soJiBjdXJyX3F1ZXVlLT50cV9xdWV1ZV9sY2ssIGdsb2JhbF90aWQpOworCisgICAgX19rbXBfcHJpbnRmKCJcbiIpOworCisgICAgaWYgKGN1cnJfcXVldWUtPnRxX2ZpcnN0X2NoaWxkKSB7CisgICAgICAgIC8vX19rbXBfYWNxdWlyZV9sb2NrKCYgY3Vycl9xdWV1ZS0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgICAgIC8qIFNlZW1zIHRvIHdvcmsgZmluZSB3aXRob3V0IHRoaXMgY2FsbCBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwICovCisKKyAgICAgICAgaWYgKGN1cnJfcXVldWUtPnRxX2ZpcnN0X2NoaWxkKSB7CisgICAgICAgICAgICBmb3IocXVldWUgPSAoa21wY190YXNrX3F1ZXVlX3QgKiljdXJyX3F1ZXVlLT50cV9maXJzdF9jaGlsZDsKKyAgICAgICAgICAgICAgICBxdWV1ZSAhPSBOVUxMOworICAgICAgICAgICAgICAgIHF1ZXVlID0gcXVldWUtPnRxX25leHRfY2hpbGQpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9hdXhfZHVtcF90YXNrX3F1ZXVlX3RyZWUoIHRxLCBxdWV1ZSwgbGV2ZWwrMSwgZ2xvYmFsX3RpZCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy9fX2ttcF9yZWxlYXNlX2xvY2soJiBjdXJyX3F1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorX19rbXBfZHVtcF90YXNrX3F1ZXVlX3RyZWUoIGttcF90YXNrcV90ICp0cSwga21wY190YXNrX3F1ZXVlX3QgKnRxcm9vdCwga21wX2ludDMyIGdsb2JhbF90aWQpCit7CisgICAgX19rbXBfcHJpbnRmKCJUYXNrUSBUcmVlIGF0IHJvb3QgJXAgb24gKCVkKTpcbiIsIHRxcm9vdCwgZ2xvYmFsX3RpZCk7CisKKyAgICBfX2ttcF9hdXhfZHVtcF90YXNrX3F1ZXVlX3RyZWUoIHRxLCB0cXJvb3QsIDAsIGdsb2JhbF90aWQgKTsKKworICAgIF9fa21wX3ByaW50ZigiXG4iKTsKK30KKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAgICBOZXcgdGFza3Egc3RvcmFnZSByb3V0aW5lcyB0aGF0IHRyeSB0byBtaW5pbWl6ZSBvdmVyaGVhZCBvZiBtYWxsb2NzIGJ1dAorICAgIHN0aWxsIHByb3ZpZGUgY2FjaGUgbGluZSBhbGlnbm1lbnQuCisqLworCisKK3N0YXRpYyB2b2lkICoKK19fa21wX3Rhc2txX2FsbG9jYXRlKHNpemVfdCBzaXplLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCkKK3sKKyAgICB2b2lkICphZGRyLCAqb3JpZ19hZGRyOworICAgIHNpemVfdCBieXRlczsKKworICAgIEtCX1RSQUNFKCA1LCAoIl9fa21wX3Rhc2txX2FsbG9jYXRlOiBjYWxsZWQgc2l6ZT0lZCwgZ3RpZD0lZFxuIiwgKGludCkgc2l6ZSwgZ2xvYmFsX3RpZCApICk7CisKKyAgICBieXRlcyA9IHNpemVvZih2b2lkICopICsgQ0FDSEVfTElORSArIHNpemU7CisKKyNpZmRlZiBUSFJFQURfQUxMT0NfRk9SX1RBU0tRCisgICAgb3JpZ19hZGRyID0gKHZvaWQgKikgX19rbXBfdGhyZWFkX21hbGxvYyggX19rbXBfdGhyZWFkX2Zyb21fZ3RpZChnbG9iYWxfdGlkKSwgYnl0ZXMgKTsKKyNlbHNlCisgICAgS0VfVFJBQ0UoIDEwLCAoIiUlJSUlJSBNQUxMT0MoICVkIClcbiIsIGJ5dGVzICkgKTsKKyAgICBvcmlnX2FkZHIgPSAodm9pZCAqKSBLTVBfSU5URVJOQUxfTUFMTE9DKCBieXRlcyApOworI2VuZGlmIC8qIFRIUkVBRF9BTExPQ19GT1JfVEFTS1EgKi8KKworICAgIGlmIChvcmlnX2FkZHIgPT0gMCkKKyAgICAgICAgS01QX0ZBVEFMKCBPdXRPZkhlYXBNZW1vcnkgKTsKKworICAgIGFkZHIgPSBvcmlnX2FkZHI7CisKKyAgICBpZiAoKChrbXBfdWludHB0cl90KSBhZGRyICYgKCBDQUNIRV9MSU5FIC0gMSApKSAhPSAwKSB7CisgICAgICAgIEtCX1RSQUNFKCA1MCwgKCJfX2ttcF90YXNrcV9hbGxvY2F0ZTogIGFkanVzdCBmb3IgY2FjaGUgYWxpZ25tZW50XG4iICkgKTsKKyAgICAgICAgYWRkciA9ICh2b2lkICopICgoKGttcF91aW50cHRyX3QpIGFkZHIgKyBDQUNIRV9MSU5FKSAmIH4oIENBQ0hFX0xJTkUgLSAxICkpOworICAgIH0KKworICAgICgqICh2b2lkICoqKSBhZGRyKSA9IG9yaWdfYWRkcjsKKworICAgIEtCX1RSQUNFKCAxMCwgKCJfX2ttcF90YXNrcV9hbGxvY2F0ZTogIGFsbG9jYXRlOiAlcCwgdXNlOiAlcCAtICVwLCBzaXplOiAlZCwgZ3RpZDogJWRcbiIsCisgICAgICAgICAgICAgb3JpZ19hZGRyLCAoKHZvaWQgKiopIGFkZHIpICsgMSwgKChjaGFyICopKCgodm9pZCAqKikgYWRkcikgKyAxKSkgKyBzaXplLTEsCisgICAgICAgICAgICAgKGludCkgc2l6ZSwgZ2xvYmFsX3RpZCApKTsKKworICAgIHJldHVybiAoICgodm9pZCAqKikgYWRkcikgKyAxICk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcGNfdGFza3FfZnJlZSh2b2lkICpwLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCkKK3sKKyAgICBLQl9UUkFDRSggNSwgKCJfX2ttcGNfdGFza3FfZnJlZTogY2FsbGVkIGFkZHI9JXAsIGd0aWQ9JWRcbiIsIHAsIGdsb2JhbF90aWQgKSApOworCisgICAgS0JfVFJBQ0UoMTAsICgiX19rbXBjX3Rhc2txX2ZyZWU6ICBmcmVlaW5nOiAlcCwgZ3RpZDogJWRcbiIsICgqKCAoKHZvaWQgKiopIHApLTEpKSwgZ2xvYmFsX3RpZCApKTsKKworI2lmZGVmIFRIUkVBRF9BTExPQ19GT1JfVEFTS1EKKyAgICBfX2ttcF90aHJlYWRfZnJlZSggX19rbXBfdGhyZWFkX2Zyb21fZ3RpZChnbG9iYWxfdGlkKSwgKiggKCh2b2lkICoqKSBwKS0xKSApOworI2Vsc2UKKyAgICBLTVBfSU5URVJOQUxfRlJFRSggKiggKCh2b2lkICoqKSBwKS0xKSApOworI2VuZGlmIC8qIFRIUkVBRF9BTExPQ19GT1JfVEFTS1EgKi8KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiAgICAgIEtlZXAgZnJlZWQga21wY190YXNrX3F1ZXVlX3Qgb24gYW4gaW50ZXJuYWwgZnJlZWxpc3QgYW5kIHJlY3ljbGUgc2luY2UKKyAqICAgICAgdGhleSdyZSBvZiBjb25zdGFudCBzaXplLgorICovCisKK3N0YXRpYyBrbXBjX3Rhc2tfcXVldWVfdCAqCitfX2ttcF9hbGxvY190YXNrcSAoIGttcF90YXNrcV90ICp0cSwgaW50IGluX3BhcmFsbGVsLCBrbXBfaW50MzIgbnNsb3RzLCBrbXBfaW50MzIgbnRodW5rcywKKyAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIG5zaGFyZWRzLCBrbXBfaW50MzIgbnByb2MsIHNpemVfdCBzaXplb2ZfdGh1bmssCisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplb2Zfc2hhcmVkcywga21wY190aHVua190ICoqbmV3X3Rhc2txX3RodW5rLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApCit7CisgICAga21wX2ludDMyICAgICAgICAgICAgICAgICAgaTsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICBieXRlczsKKyAgICBrbXBjX3Rhc2tfcXVldWVfdCAgICAgICAgICAqbmV3X3F1ZXVlOworICAgIGttcGNfYWxpZ25lZF9zaGFyZWRfdmFyc190ICpzaGFyZWRfdmFyX2FycmF5OworICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICAgICpzaGFyZWRfdmFyX3N0b3JhZ2U7CisgICAgY2hhciAgICAgICAgICAgICAgICAgICAgICAgKnB0OyAvKiBmb3IgZG9pbmcgYnl0ZS1hZGp1c3RlZCBhZGRyZXNzIGNvbXB1dGF0aW9ucyAqLworCisgICAgX19rbXBfYWNxdWlyZV9sb2NrKCAmIHRxLT50cV9mcmVlbGlzdF9sY2ssIGdsb2JhbF90aWQgKTsKKworICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKworICAgIGlmKCB0cS0+dHFfZnJlZWxpc3QgKSB7CisgICAgICAgIG5ld19xdWV1ZSA9ICB0cSAtPiB0cV9mcmVlbGlzdDsKKyAgICAgICAgdHEgLT4gdHFfZnJlZWxpc3QgPSAgdHEgLT4gdHFfZnJlZWxpc3QgLT4gdHEudHFfbmV4dF9mcmVlOworCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQobmV3X3F1ZXVlLT50cV9mbGFncyAmIFRRRl9ERUFMTE9DQVRFRCk7CisKKyAgICAgICAgbmV3X3F1ZXVlLT50cV9mbGFncyA9IDA7CisKKyAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCAmIHRxLT50cV9mcmVlbGlzdF9sY2ssIGdsb2JhbF90aWQgKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jayggJiB0cS0+dHFfZnJlZWxpc3RfbGNrLCBnbG9iYWxfdGlkICk7CisKKyAgICAgICAgbmV3X3F1ZXVlID0gKGttcGNfdGFza19xdWV1ZV90ICopIF9fa21wX3Rhc2txX2FsbG9jYXRlIChzaXplb2YgKGttcGNfdGFza19xdWV1ZV90KSwgZ2xvYmFsX3RpZCk7CisgICAgICAgIG5ld19xdWV1ZS0+dHFfZmxhZ3MgPSAwOworICAgIH0KKworICAgIC8qICBzcGFjZSBpbiB0aGUgdGFzayBxdWV1ZSBmb3IgcXVldWUgc2xvdHMgKGFsbG9jYXRlIGFzIG9uZSBiaWcgY2h1bmsgKi8KKyAgICAvKiBvZiBzdG9yYWdlIGluY2x1ZGluZyBuZXdfdGFza3FfdGFzayBzcGFjZSkgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICBzaXplb2ZfdGh1bmsgKz0gKENBQ0hFX0xJTkUgLSAoc2l6ZW9mX3RodW5rICUgQ0FDSEVfTElORSkpOyAgICAgICAgIC8qIHBhZCB0byBjYWNoZSBsaW5lIHNpemUgKi8KKyAgICBwdCA9IChjaGFyICopIF9fa21wX3Rhc2txX2FsbG9jYXRlIChudGh1bmtzICogc2l6ZW9mX3RodW5rLCBnbG9iYWxfdGlkKTsKKyAgICBuZXdfcXVldWUtPnRxX3RodW5rX3NwYWNlID0gKGttcGNfdGh1bmtfdCAqKXB0OworICAgICpuZXdfdGFza3FfdGh1bmsgPSAoa21wY190aHVua190ICopKHB0ICsgKG50aHVua3MgLSAxKSAqIHNpemVvZl90aHVuayk7CisKKyAgICAvKiAgY2hhaW4gdGhlIGFsbG9jYXRlZCB0aHVua3MgaW50byBhIGZyZWVsaXN0IGZvciB0aGlzIHF1ZXVlICAqLworCisgICAgbmV3X3F1ZXVlLT50cV9mcmVlX3RodW5rcyA9IChrbXBjX3RodW5rX3QgKilwdDsKKworICAgIGZvciAoaSA9IDA7IGkgPCAobnRodW5rcyAtIDIpOyBpKyspIHsKKyAgICAgICAgKChrbXBjX3RodW5rX3QgKikocHQraSpzaXplb2ZfdGh1bmspKS0+dGgudGhfbmV4dF9mcmVlID0gKGttcGNfdGh1bmtfdCAqKShwdCArIChpKzEpKnNpemVvZl90aHVuayk7CisjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICgoa21wY190aHVua190ICopKHB0K2kqc2l6ZW9mX3RodW5rKSktPnRoX2ZsYWdzID0gVFFGX0RFQUxMT0NBVEVEOworI2VuZGlmCisgICAgfQorCisgICAgKChrbXBjX3RodW5rX3QgKikocHQrKG50aHVua3MtMikqc2l6ZW9mX3RodW5rKSktPnRoLnRoX25leHRfZnJlZSA9IE5VTEw7CisjaWZkZWYgS01QX0RFQlVHCisgICAgKChrbXBjX3RodW5rX3QgKikocHQrKG50aHVua3MtMikqc2l6ZW9mX3RodW5rKSktPnRoX2ZsYWdzID0gVFFGX0RFQUxMT0NBVEVEOworI2VuZGlmCisKKyAgICAvKiBpbml0aWFsaXplIHRoZSBsb2NrcyAqLworCisgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgIF9fa21wX2luaXRfbG9jayggJiBuZXdfcXVldWUtPnRxX2xpbmtfbGNrICk7CisgICAgICAgIF9fa21wX2luaXRfbG9jayggJiBuZXdfcXVldWUtPnRxX2ZyZWVfdGh1bmtzX2xjayApOworICAgICAgICBfX2ttcF9pbml0X2xvY2soICYgbmV3X3F1ZXVlLT50cV9xdWV1ZV9sY2sgKTsKKyAgICB9CisKKyAgICAvKiBub3cgYWxsb2NhdGUgdGhlIHNsb3RzICovCisKKyAgICBieXRlcyA9IG5zbG90cyAqIHNpemVvZiAoa21wY19hbGlnbmVkX3F1ZXVlX3Nsb3RfdCk7CisgICAgbmV3X3F1ZXVlLT50cV9xdWV1ZSA9IChrbXBjX2FsaWduZWRfcXVldWVfc2xvdF90ICopIF9fa21wX3Rhc2txX2FsbG9jYXRlKCBieXRlcywgZ2xvYmFsX3RpZCApOworCisgICAgLyogIHNwYWNlIGZvciBhcnJheSBvZiBwb2ludGVycyB0byBzaGFyZWQgdmFyaWFibGUgc3RydWN0dXJlcyAqLworICAgIHNpemVvZl9zaGFyZWRzICs9IHNpemVvZihrbXBjX3Rhc2tfcXVldWVfdCAqKTsKKyAgICBzaXplb2Zfc2hhcmVkcyArPSAoQ0FDSEVfTElORSAtIChzaXplb2Zfc2hhcmVkcyAlIENBQ0hFX0xJTkUpKTsgICAgIC8qIHBhZCB0byBjYWNoZSBsaW5lIHNpemUgKi8KKworICAgIGJ5dGVzID0gbnNoYXJlZHMgKiBzaXplb2YgKGttcGNfYWxpZ25lZF9zaGFyZWRfdmFyc190KTsKKyAgICBzaGFyZWRfdmFyX2FycmF5ID0gKGttcGNfYWxpZ25lZF9zaGFyZWRfdmFyc190ICopIF9fa21wX3Rhc2txX2FsbG9jYXRlICggYnl0ZXMsIGdsb2JhbF90aWQpOworCisgICAgYnl0ZXMgPSBuc2hhcmVkcyAqIHNpemVvZl9zaGFyZWRzOworICAgIHNoYXJlZF92YXJfc3RvcmFnZSA9IChjaGFyICopIF9fa21wX3Rhc2txX2FsbG9jYXRlICggYnl0ZXMsIGdsb2JhbF90aWQpOworCisgICAgZm9yIChpPTA7IGk8bnNoYXJlZHM7IGkrKykgeworICAgICAgICBzaGFyZWRfdmFyX2FycmF5W2ldLmFpX2RhdGEgPSAoa21wY19zaGFyZWRfdmFyc190ICopIChzaGFyZWRfdmFyX3N0b3JhZ2UgKyBpKnNpemVvZl9zaGFyZWRzKTsKKyAgICAgICAgc2hhcmVkX3Zhcl9hcnJheVtpXS5haV9kYXRhLT5zdl9xdWV1ZSA9IG5ld19xdWV1ZTsKKyAgICB9CisgICAgbmV3X3F1ZXVlLT50cV9zaGFyZWRzID0gc2hhcmVkX3Zhcl9hcnJheTsKKworCisgICAgLyogYXJyYXkgZm9yIG51bWJlciBvZiBvdXRzdGFuZGluZyB0aHVua3MgcGVyIHRocmVhZCAqLworCisgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgIGJ5dGVzID0gbnByb2MgKiBzaXplb2Yoa21wY19hbGlnbmVkX2ludDMyX3QpOworICAgICAgICBuZXdfcXVldWUtPnRxX3RoX3RodW5rcyA9IChrbXBjX2FsaWduZWRfaW50MzJfdCAqKSBfX2ttcF90YXNrcV9hbGxvY2F0ZSAoIGJ5dGVzLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgbmV3X3F1ZXVlLT50cV9ucHJvYyAgICAgPSBucHJvYzsKKworICAgICAgICBmb3IgKGk9MDsgaTxucHJvYzsgaSsrKQorICAgICAgICAgICAgbmV3X3F1ZXVlLT50cV90aF90aHVua3NbaV0uYWlfZGF0YSA9IDA7CisgICAgfQorCisgICAgcmV0dXJuIG5ld19xdWV1ZTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2ZyZWVfdGFza3EgKGttcF90YXNrcV90ICp0cSwga21wY190YXNrX3F1ZXVlX3QgKnAsIGludCBpbl9wYXJhbGxlbCwga21wX2ludDMyIGdsb2JhbF90aWQpCit7CisgICAgX19rbXBjX3Rhc2txX2ZyZWUocC0+dHFfdGh1bmtfc3BhY2UsIGdsb2JhbF90aWQpOworICAgIF9fa21wY190YXNrcV9mcmVlKHAtPnRxX3F1ZXVlLCBnbG9iYWxfdGlkKTsKKworICAgIC8qIGZyZWUgc2hhcmVkIHZhciBzdHJ1Y3R1cmUgc3RvcmFnZSAqLworICAgIF9fa21wY190YXNrcV9mcmVlKCh2b2lkICopIHAtPnRxX3NoYXJlZHNbMF0uYWlfZGF0YSwgZ2xvYmFsX3RpZCk7CisKKyAgICAvKiBmcmVlIGFycmF5IG9mIHBvaW50ZXJzIHRvIHNoYXJlZCB2YXJzIHN0b3JhZ2UgKi8KKyAgICBfX2ttcGNfdGFza3FfZnJlZShwLT50cV9zaGFyZWRzLCBnbG9iYWxfdGlkKTsKKworI2lmZGVmIEtNUF9ERUJVRworICAgIHAtPnRxX2ZpcnN0X2NoaWxkID0gTlVMTDsKKyAgICBwLT50cV9uZXh0X2NoaWxkID0gTlVMTDsKKyAgICBwLT50cV9wcmV2X2NoaWxkID0gTlVMTDsKKyAgICBwLT50cV9yZWZfY291bnQgPSAtMTA7CisgICAgcC0+dHFfc2hhcmVkcyA9IE5VTEw7CisgICAgcC0+dHFfdGFza251bV9xdWV1aW5nID0gMDsKKyAgICBwLT50cV90YXNrbnVtX3NlcnZpbmcgPSAwOworICAgIHAtPnRxX3F1ZXVlID0gTlVMTDsKKyAgICBwLT50cV90aHVua19zcGFjZSA9IE5VTEw7CisgICAgcC0+dHFfdGFza3Ffc2xvdCA9IE5VTEw7CisgICAgcC0+dHFfZnJlZV90aHVua3MgPSBOVUxMOworICAgIHAtPnRxX25zbG90cyA9IDA7CisgICAgcC0+dHFfaGVhZCA9IDA7CisgICAgcC0+dHFfdGFpbCA9IDA7CisgICAgcC0+dHFfbmZ1bGwgPSAwOworICAgIHAtPnRxX2hpd2F0ID0gMDsKKworICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICBpbnQgaTsKKworICAgICAgICBmb3IgKGk9MDsgaTxwLT50cV9ucHJvYzsgaSsrKQorICAgICAgICAgICAgcC0+dHFfdGhfdGh1bmtzW2ldLmFpX2RhdGEgPSAwOworICAgIH0KKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApCisgICAgICAgIHAtPnRxX2xvYyA9IE5VTEw7CisgICAgS01QX0RFQlVHX0FTU0VSVCggcC0+dHFfZmxhZ3MgJiBUUUZfREVBTExPQ0FURUQgKTsKKyAgICBwLT50cV9mbGFncyA9IFRRRl9ERUFMTE9DQVRFRDsKKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKworICAgIGlmIChpbl9wYXJhbGxlbCkgIHsKKyAgICAgICAgX19rbXBjX3Rhc2txX2ZyZWUocC0+dHFfdGhfdGh1bmtzLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgX19rbXBfZGVzdHJveV9sb2NrKCYgcC0+dHFfbGlua19sY2spOworICAgICAgICBfX2ttcF9kZXN0cm95X2xvY2soJiBwLT50cV9xdWV1ZV9sY2spOworICAgICAgICBfX2ttcF9kZXN0cm95X2xvY2soJiBwLT50cV9mcmVlX3RodW5rc19sY2spOworICAgIH0KKyNpZmRlZiBLTVBfREVCVUcKKyAgICBwLT50cV90aF90aHVua3MgPSBOVUxMOworI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworCisgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICovCisgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworCisgICAgX19rbXBfYWNxdWlyZV9sb2NrKCAmIHRxLT50cV9mcmVlbGlzdF9sY2ssIGdsb2JhbF90aWQgKTsKKyAgICBwLT50cS50cV9uZXh0X2ZyZWUgPSB0cS0+dHFfZnJlZWxpc3Q7CisKKyAgICB0cS0+dHFfZnJlZWxpc3QgPSBwOworICAgIF9fa21wX3JlbGVhc2VfbG9jayggJiB0cS0+dHFfZnJlZWxpc3RfbGNrLCBnbG9iYWxfdGlkICk7Cit9CisKKy8qCisgKiAgICBPbmNlIGEgZ3JvdXAgb2YgdGh1bmtzIGhhcyBiZWVuIGFsbG9jYXRlZCBmb3IgdXNlIGluIGEgcGFydGljdWxhciBxdWV1ZSwKKyAqICAgIHRoZXNlIGFyZSBtYW5hZ2VkIHZpYSBhIHBlci1xdWV1ZSBmcmVlbGlzdC4KKyAqICAgIFdlIGZvcmNlIGEgY2hlY2sgdGhhdCB0aGVyZSdzIGFsd2F5cyBhIHRodW5rIGZyZWUgaWYgd2UgbmVlZCBvbmUuCisgKi8KKworc3RhdGljIGttcGNfdGh1bmtfdCAqCitfX2ttcF9hbGxvY190aHVuayAoa21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlLCBpbnQgaW5fcGFyYWxsZWwsIGttcF9pbnQzMiBnbG9iYWxfdGlkKQoreworICAgIGttcGNfdGh1bmtfdCAqZmw7CisKKyAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCYgcXVldWUtPnRxX2ZyZWVfdGh1bmtzX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICovCisgICAgICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKyAgICB9CisKKyAgICBmbCA9IHF1ZXVlLT50cV9mcmVlX3RodW5rczsKKworICAgIEtNUF9ERUJVR19BU1NFUlQgKGZsICE9IE5VTEwpOworCisgICAgcXVldWUtPnRxX2ZyZWVfdGh1bmtzID0gZmwtPnRoLnRoX25leHRfZnJlZTsKKyAgICBmbC0+dGhfZmxhZ3MgPSAwOworCisgICAgaWYgKGluX3BhcmFsbGVsKQorICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBxdWV1ZS0+dHFfZnJlZV90aHVua3NfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgIHJldHVybiBmbDsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2ZyZWVfdGh1bmsgKGttcGNfdGFza19xdWV1ZV90ICpxdWV1ZSwga21wY190aHVua190ICpwLCBpbnQgaW5fcGFyYWxsZWwsIGttcF9pbnQzMiBnbG9iYWxfdGlkKQoreworI2lmZGVmIEtNUF9ERUJVRworICAgIHAtPnRoX3Rhc2sgPSAwOworICAgIHAtPnRoX2VuY2xfdGh1bmsgPSAwOworICAgIHAtPnRoX3N0YXR1cyA9IDA7CisgICAgcC0+dGhfdGFza251bSA9IDA7CisgICAgLyogQWxzbyBjb3VsZCB6ZXJvIHBvaW50ZXJzIHRvIHByaXZhdGUgdmFycyAqLworI2VuZGlmCisKKyAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCYgcXVldWUtPnRxX2ZyZWVfdGh1bmtzX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICovCisgICAgICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKyAgICB9CisKKyAgICBwLT50aC50aF9uZXh0X2ZyZWUgPSBxdWV1ZS0+dHFfZnJlZV90aHVua3M7CisgICAgcXVldWUtPnRxX2ZyZWVfdGh1bmtzID0gcDsKKworI2lmZGVmIEtNUF9ERUJVRworICAgIHAtPnRoX2ZsYWdzID0gVFFGX0RFQUxMT0NBVEVEOworI2VuZGlmCisKKyAgICBpZiAoaW5fcGFyYWxsZWwpCisgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIHF1ZXVlLT50cV9mcmVlX3RodW5rc19sY2ssIGdsb2JhbF90aWQpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogIHJldHVybnMgbm9uemVybyBpZiB0aGUgcXVldWUganVzdCBiZWNhbWUgZnVsbCBhZnRlciB0aGUgZW5xdWV1ZSAgKi8KKworc3RhdGljIGttcF9pbnQzMgorX19rbXBfZW5xdWV1ZV90YXNrICgga21wX3Rhc2txX3QgKnRxLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlLCBrbXBjX3RodW5rX3QgKnRodW5rLCBpbnQgaW5fcGFyYWxsZWwgKQoreworICAgIGttcF9pbnQzMiAgICByZXQ7CisKKyAgICAvKiAgZGtwOiBjYW4gd2UgZ2V0IGFyb3VuZCB0aGUgbG9jayBpbiB0aGUgVFFGX1JFTEVBU0VfV09SS0VSUyBjYXNlIChvbmx5IHRoZSBtYXN0ZXIgaXMgZXhlY3V0aW5nIHRoZW4pICAqLworICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJiBxdWV1ZS0+dHFfcXVldWVfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworICAgIH0KKworICAgIEtNUF9ERUJVR19BU1NFUlQgKHF1ZXVlLT50cV9uZnVsbCA8IHF1ZXVlLT50cV9uc2xvdHMpOyAgLyogIGNoZWNrIHF1ZXVlIG5vdCBmdWxsICAqLworCisgICAgcXVldWUtPnRxX3F1ZXVlWyhxdWV1ZS0+dHFfaGVhZCkrK10ucXNfdGh1bmsgPSB0aHVuazsKKworICAgIGlmIChxdWV1ZS0+dHFfaGVhZCA+PSBxdWV1ZS0+dHFfbnNsb3RzKQorICAgICAgICBxdWV1ZS0+dHFfaGVhZCA9IDA7CisKKyAgICAocXVldWUtPnRxX25mdWxsKSsrOworCisgICAgS01QX01CKCk7ICAgLyogdG8gYXNzdXJlIHRoYXQgbmZ1bGwgaXMgc2VlbiB0byBpbmNyZWFzZSBiZWZvcmUgVFFGX0FMTF9UQVNLU19RVUVVRUQgaXMgc2V0ICovCisKKyAgICByZXQgPSAoaW5fcGFyYWxsZWwpID8gKHF1ZXVlLT50cV9uZnVsbCA9PSBxdWV1ZS0+dHFfbnNsb3RzKSA6IEZBTFNFOworCisgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgIC8qIGRvbid0IG5lZWQgdG8gd2FpdCB1bnRpbCB3b3JrZXJzIGFyZSByZWxlYXNlZCBiZWZvcmUgdW5sb2NraW5nICovCisgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIHF1ZXVlLT50cV9xdWV1ZV9sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgIGlmKCB0cS0+dHFfZ2xvYmFsX2ZsYWdzICYgVFFGX1JFTEVBU0VfV09SS0VSUyApIHsKKyAgICAgICAgICAgIC8qIElmIGp1c3QgY3JlYXRpbmcgdGhlIHJvb3QgcXVldWUsIHRoZSB3b3JrZXIgdGhyZWFkcyBhcmUgd2FpdGluZyBhdCAqLworICAgICAgICAgICAgLyogYSBqb2luIGJhcnJpZXIgdW50aWwgbm93LCB3aGVuIHRoZXJlJ3Mgc29tZXRoaW5nIGluIHRoZSBxdWV1ZSBmb3IgICovCisgICAgICAgICAgICAvKiB0aGVtIHRvIGRvOyByZWxlYXNlIHRoZW0gbm93IHRvIGRvIHdvcmsuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIC8qIFRoaXMgc2hvdWxkIG9ubHkgYmUgZG9uZSB3aGVuIHRoaXMgaXMgdGhlIGZpcnN0IHRhc2sgZW5xdWV1ZWQsICAgICAqLworICAgICAgICAgICAgLyogc28gcmVzZXQgdGhlIGZsYWcgaGVyZSBhbHNvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIHRxLT50cV9nbG9iYWxfZmxhZ3MgJj0gflRRRl9SRUxFQVNFX1dPUktFUlM7ICAvKiBubyBsb2NrIG5lZWRlZCwgd29ya2VycyBhcmUgc3RpbGwgaW4gc3BpbiBtb2RlICovCisKKyAgICAgICAgICAgIEtNUF9NQigpOyAgIC8qIGF2b2lkIHJlbGVhc2luZyBiYXJyaWVyIHR3aWNlIGlmIHRhc2txX3Rhc2sgc3dpdGNoZXMgdGhyZWFkcyAqLworCisgICAgICAgICAgICBfX2ttcGNfZW5kX2JhcnJpZXJfbWFzdGVyKCBOVUxMLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBrbXBjX3RodW5rX3QgKgorX19rbXBfZGVxdWV1ZV90YXNrIChrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlLCBpbnQgaW5fcGFyYWxsZWwpCit7CisgICAga21wY190aHVua190ICpwdDsKKyAgICBpbnQgICAgICAgICAgIHRpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoIGdsb2JhbF90aWQgKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQgKHF1ZXVlLT50cV9uZnVsbCA+IDApOyAgLyogIGNoZWNrIHF1ZXVlIG5vdCBlbXB0eSAgKi8KKworICAgIGlmIChxdWV1ZS0+dHEudHFfcGFyZW50ICE9IE5VTEwgJiYgaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgaW50IGN0OworICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJiBxdWV1ZS0+dHEudHFfcGFyZW50LT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgIGN0ID0gKysocXVldWUtPnRxX3JlZl9jb3VudCk7CisgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIHF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgS01QX0RFQlVHX1JFRl9DVFMoKCJsaW5lICVkIGd0aWQgJWQ6IFEgJXAgaW5jICVkXG4iLAorICAgICAgICAgIF9fTElORV9fLCBnbG9iYWxfdGlkLCBxdWV1ZSwgY3QpKTsKKyAgICB9CisKKyAgICBwdCA9IHF1ZXVlLT50cV9xdWV1ZVsocXVldWUtPnRxX3RhaWwpKytdLnFzX3RodW5rOworCisgICAgaWYgKHF1ZXVlLT50cV90YWlsID49IHF1ZXVlLT50cV9uc2xvdHMpCisgICAgICAgIHF1ZXVlLT50cV90YWlsID0gMDsKKworICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICBxdWV1ZS0+dHFfdGhfdGh1bmtzW3RpZF0uYWlfZGF0YSsrOworCisgICAgICAgIEtNUF9NQigpOyAvKiBuZWNlc3Nhcnkgc28gYWlfZGF0YSBpbmNyZW1lbnQgaXMgcHJvcGFnYXRlZCB0byBvdGhlciB0aHJlYWRzIGltbWVkaWF0ZWx5IChkaWdpdGFsKSAqLworCisgICAgICAgIEtGX1RSQUNFKDIwMCwgKCJfX2ttcF9kZXF1ZXVlX3Rhc2s6IFQjJWQoOiVkKSBub3cgaGFzICVkIG91dHN0YW5kaW5nIHRodW5rcyBmcm9tIHF1ZXVlICVwXG4iLAorICAgICAgICAgICAgZ2xvYmFsX3RpZCwgdGlkLCBxdWV1ZS0+dHFfdGhfdGh1bmtzW3RpZF0uYWlfZGF0YSwgcXVldWUpKTsKKyAgICB9CisKKyAgICAocXVldWUtPnRxX25mdWxsKS0tOworCisjaWZkZWYgS01QX0RFQlVHCisgICAgS01QX01CKCk7CisKKyAgICAvKiBuZWNlc3Nhcnkgc28gKHF1ZXVlLT50cV9uZnVsbCA+IDApIGFib3ZlIHN1Y2NlZWRzIGFmdGVyIHRxX25mdWxsIGlzIGRlY3JlbWVudGVkICovCisKKyAgICBLTVBfREVCVUdfQVNTRVJUKHF1ZXVlLT50cV9uZnVsbCA+PSAwKTsKKworICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHF1ZXVlLT50cV90aF90aHVua3NbdGlkXS5haV9kYXRhIDw9IF9fS01QX1RBU0tRX1RIVU5LU19QRVJfVEgpOworICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIHB0OworfQorCisvKgorICogRmluZCB0aGUgbmV4dCAobm9uLW51bGwpIHRhc2sgdG8gZGVxdWV1ZSBhbmQgcmV0dXJuIGl0LgorICogVGhpcyBpcyBuZXZlciBjYWxsZWQgdW5sZXNzIGluX3BhcmFsbGVsPVRSVUUKKyAqCisgKiBIZXJlIGFyZSB0aGUgcnVsZXMgZm9yIGRlY2lkaW5nIHdoaWNoIHF1ZXVlIHRvIHRha2UgdGhlIHRhc2sgZnJvbToKKyAqIDEuICBXYWxrIHVwIHRoZSB0YXNrIHF1ZXVlIHRyZWUgZnJvbSB0aGUgY3VycmVudCBxdWV1ZSdzIHBhcmVudCBhbmQgbG9vaworICogICAgICBvbiB0aGUgd2F5IHVwIChmb3IgbG9vcCwgYmVsb3cpLgorICogMi4gIERvIGEgZGVwdGgtZmlyc3Qgc2VhcmNoIGJhY2sgZG93biB0aGUgdHJlZSBmcm9tIHRoZSByb290IGFuZAorICogICAgICBsb29rIChmaW5kX3Rhc2tfaW5fZGVzY2VuZGFudF9xdWV1ZSgpKS4KKyAqCisgKiBIZXJlIGFyZSB0aGUgcnVsZXMgZm9yIGRlY2lkaW5nIHdoaWNoIHRhc2sgdG8gdGFrZSBmcm9tIGEgcXVldWUKKyAqIChfX2ttcF9maW5kX3Rhc2tfaW5fcXVldWUgKCkpOgorICogMS4gIE5ldmVyIHRha2UgdGhlIGxhc3QgdGFzayBmcm9tIGEgcXVldWUgaWYgVFFGX0lTX0xBU1RQUklWQVRFOyB0aGlzIHRhc2sKKyAqICAgICBtdXN0IGJlIHN0YWdlZCB0byBtYWtlIHN1cmUgd2UgZXhlY3V0ZSB0aGUgbGFzdCBvbmUgd2l0aAorICogICAgIFRRRl9JU19MQVNUX1RBU0sgYXQgdGhlIGVuZCBvZiB0YXNrIHF1ZXVlIGV4ZWN1dGlvbi4KKyAqIDIuICBJZiB0aGUgcXVldWUgbGVuZ3RoIGlzIGJlbG93IHNvbWUgaGlnaCB3YXRlciBtYXJrIGFuZCB0aGUgdGFza3EgdGFzaworICogICAgIGlzIGVucXVldWVkLCBwcmVmZXIgcnVubmluZyB0aGUgdGFza3EgdGFzay4KKyAqIDMuICBPdGhlcndpc2UsIHRha2UgYSAobm9ybWFsKSB0YXNrIGZyb20gdGhlIHF1ZXVlLgorICoKKyAqIElmIHdlIGRvIGFsbCB0aGlzIGFuZCByZXR1cm4gcHQgPT0gTlVMTCBhdCB0aGUgYm90dG9tIG9mIHRoaXMgcm91dGluZSwKKyAqIHRoaXMgbWVhbnMgdGhlcmUgYXJlIG5vIG1vcmUgdGFza3MgdG8gZXhlY3V0ZSAoZXhjZXB0IHBvc3NpYmx5IGZvcgorICogVFFGX0lTX0xBU1RQUklWQVRFKS4KKyAqLworCitzdGF0aWMga21wY190aHVua190ICoKK19fa21wX2ZpbmRfdGFza19pbl9xdWV1ZSAoa21wX2ludDMyIGdsb2JhbF90aWQsIGttcGNfdGFza19xdWV1ZV90ICpxdWV1ZSkKK3sKKyAgICBrbXBjX3RodW5rX3QgKnB0ICA9IE5VTEw7CisgICAgaW50ICAgICAgICAgICB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKCBnbG9iYWxfdGlkICk7CisKKyAgICAvKiBUbyBwcmV2ZW50IGRlYWRsb2NrIGZyb20gdHFfcXVldWVfbGNrIGlmIHF1ZXVlIGFscmVhZHkgZGVhbGxvY2F0ZWQgKi8KKyAgICBpZiAoICEocXVldWUtPnRxX2ZsYWdzICYgVFFGX0RFQUxMT0NBVEVEKSApIHsKKworICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJiBxdWV1ZS0+dHFfcXVldWVfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICAvKiBDaGVjayBhZ2FpbiB0byBhdm9pZCByYWNlIGluIF9fa21wY19lbmRfdGFza3EoKSAqLworICAgICAgICBpZiAoICEocXVldWUtPnRxX2ZsYWdzICYgVFFGX0RFQUxMT0NBVEVEKSApIHsKKworICAgICAgICAgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICovCisgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlZW1zIHRvIHdvcmsgZmluZSB3aXRob3V0IHRoaXMgY2FsbCBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwICovCisKKyAgICAgICAgICAgIGlmICgocXVldWUtPnRxX3Rhc2txX3Nsb3QgIT0gTlVMTCkgJiYgKHF1ZXVlLT50cV9uZnVsbCA8PSBxdWV1ZS0+dHFfaGl3YXQpKSB7CisgICAgICAgICAgICAgICAgLyogaWYgdGhlcmUncyBlbm91Z2ggcm9vbSBpbiB0aGUgcXVldWUgYW5kIHRoZSBkaXNwYXRjaGVyICovCisgICAgICAgICAgICAgICAgLyogKHRhc2txIHRhc2spIGlzIGF2YWlsYWJsZSwgc2NoZWR1bGUgbW9yZSB0YXNrcyAgICAgICAgICovCisgICAgICAgICAgICAgICAgcHQgPSAoa21wY190aHVua190ICopIHF1ZXVlLT50cV90YXNrcV9zbG90OworICAgICAgICAgICAgICAgIHF1ZXVlLT50cV90YXNrcV9zbG90ID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHF1ZXVlLT50cV9uZnVsbCA9PSAwIHx8CisgICAgICAgICAgICAgICAgICAgICBxdWV1ZS0+dHFfdGhfdGh1bmtzW3RpZF0uYWlfZGF0YSA+PSBfX0tNUF9UQVNLUV9USFVOS1NfUEVSX1RIKSB7CisgICAgICAgICAgICAgICAgLyogZG8gbm90aGluZyBpZiBubyB0aHVua3MgYXZhaWxhYmxlIG9yIHRoaXMgdGhyZWFkIGNhbid0ICovCisgICAgICAgICAgICAgICAgLyogcnVuIGFueSBiZWNhdXNlIGl0IGFscmVhZHkgaXMgZXhlY3V0aW5nIHRvbyBtYW55ICAgICAgICovCisKKyAgICAgICAgICAgICAgICBwdCA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChxdWV1ZS0+dHFfbmZ1bGwgPiAxKSB7CisgICAgICAgICAgICAgICAgLyogIGFsd2F5cyBzYWZlIHRvIHNjaGVkdWxlIGEgdGFzayBldmVuIGlmIFRRRl9JU19MQVNUUFJJVkFURSAgKi8KKworICAgICAgICAgICAgICAgIHB0ID0gX19rbXBfZGVxdWV1ZV90YXNrIChnbG9iYWxfdGlkLCBxdWV1ZSwgVFJVRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICghKHF1ZXVlLT50cV9mbGFncyAmIFRRRl9JU19MQVNUUFJJVkFURSkpIHsKKyAgICAgICAgICAgICAgICAvKiAgb25lIHRoaW5nIGluIHF1ZXVlLCBhbHdheXMgc2FmZSB0byBzY2hlZHVsZSBpZiAhVFFGX0lTX0xBU1RQUklWQVRFICAqLworCisgICAgICAgICAgICAgICAgcHQgPSBfX2ttcF9kZXF1ZXVlX3Rhc2sgKGdsb2JhbF90aWQsIHF1ZXVlLCBUUlVFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHF1ZXVlLT50cV9mbGFncyAmIFRRRl9JU19MQVNUX1RBU0spIHsKKyAgICAgICAgICAgICAgICAvKiBUUUZfSVNfTEFTVFBSSVZBVEUsIG9uZSB0aGluZyBpbiBxdWV1ZSwga21wY19lbmRfdGFza3FfdGFzaygpICAgKi8KKyAgICAgICAgICAgICAgICAvKiBoYXMgYmVlbiBydW4gc28gdGhpcyBpcyBsYXN0IHRhc2ssIHJ1biB3aXRoIFRRRl9JU19MQVNUX1RBU0sgc28gKi8KKyAgICAgICAgICAgICAgICAvKiBpbnN0cnVtZW50YXRpb24gZG9lcyBjb3B5LW91dC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgIHB0ID0gX19rbXBfZGVxdWV1ZV90YXNrIChnbG9iYWxfdGlkLCBxdWV1ZSwgVFJVRSk7CisgICAgICAgICAgICAgICAgcHQtPnRoX2ZsYWdzIHw9IFRRRl9JU19MQVNUX1RBU0s7ICAvKiBkb24ndCBuZWVkIHRlc3RfdGhlbl9vciBzaW5jZSBhbHJlYWR5IGxvY2tlZCAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogR0VIIC0gV2hhdCBoYXBwZW5zIGhlcmUgaWYgaXMgbGFzdHByaXZhdGUsIGJ1dCBub3QgbGFzdCB0YXNrPyAqLworICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBxdWV1ZS0+dHFfcXVldWVfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICB9CisKKyAgICByZXR1cm4gcHQ7Cit9CisKKy8qCisgKiBXYWxrIGEgdHJlZSBvZiBxdWV1ZXMgc3RhcnRpbmcgYXQgcXVldWUncyBmaXJzdCBjaGlsZAorICogYW5kIHJldHVybiBhIG5vbi1OVUxMIHRodW5rIGlmIG9uZSBjYW4gYmUgc2NoZWR1bGVkLgorICogTXVzdCBvbmx5IGJlIGNhbGxlZCB3aGVuIGluX3BhcmFsbGVsPVRSVUUKKyAqLworCitzdGF0aWMga21wY190aHVua190ICoKK19fa21wX2ZpbmRfdGFza19pbl9kZXNjZW5kYW50X3F1ZXVlIChrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190YXNrX3F1ZXVlX3QgKmN1cnJfcXVldWUpCit7CisgICAga21wY190aHVua190ICpwdCA9IE5VTEw7CisgICAga21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlID0gY3Vycl9xdWV1ZTsKKworICAgIGlmIChjdXJyX3F1ZXVlLT50cV9maXJzdF9jaGlsZCAhPSBOVUxMKSB7CisgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIGN1cnJfcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworCisgICAgICAgIHF1ZXVlID0gKGttcGNfdGFza19xdWV1ZV90ICopIGN1cnJfcXVldWUtPnRxX2ZpcnN0X2NoaWxkOworICAgICAgICBpZiAocXVldWUgPT0gTlVMTCkgeworICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgY3Vycl9xdWV1ZS0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAocXVldWUgIT0gTlVMTCkgIHsKKyAgICAgICAgICAgIGludCBjdDsKKyAgICAgICAgICAgIGttcGNfdGFza19xdWV1ZV90ICpuZXh0OworCisgICAgICAgICAgICBjdD0gKysocXVldWUtPnRxX3JlZl9jb3VudCk7CisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBjdXJyX3F1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgICAgICBLTVBfREVCVUdfUkVGX0NUUygoImxpbmUgJWQgZ3RpZCAlZDogUSAlcCBpbmMgJWRcbiIsCisgICAgICAgICAgICAgIF9fTElORV9fLCBnbG9iYWxfdGlkLCBxdWV1ZSwgY3QpKTsKKworICAgICAgICAgICAgcHQgPSBfX2ttcF9maW5kX3Rhc2tfaW5fcXVldWUgKGdsb2JhbF90aWQsIHF1ZXVlKTsKKworICAgICAgICAgICAgaWYgKHB0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpbnQgY3Q7CisKKyAgICAgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJiBjdXJyX3F1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgICAgICAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlZW1zIHRvIHdvcmsgZmluZSB3aXRob3V0IHRoaXMgY2FsbCBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwICovCisKKyAgICAgICAgICAgICAgICBjdCA9IC0tKHF1ZXVlLT50cV9yZWZfY291bnQpOworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19SRUZfQ1RTKCgibGluZSAlZCBndGlkICVkOiBRICVwIGRlYyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIF9fTElORV9fLCBnbG9iYWxfdGlkLCBxdWV1ZSwgY3QpKTsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBxdWV1ZS0+dHFfcmVmX2NvdW50ID49IDAgKTsKKworICAgICAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIGN1cnJfcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBwdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogYWx0aG91Z2ggcmVmZXJlbmNlIGNvdW50IHN0YXlzIGFjdGl2ZSBkdXJpbmcgZGVzY2VuZGFudCB3YWxrLCBzaG91bGRuJ3QgbWF0dGVyICAqLworICAgICAgICAgICAgLyogc2luY2UgaWYgY2hpbGRyZW4gc3RpbGwgZXhpc3QsIHJlZmVyZW5jZSBjb3VudHMgYXJlbid0IGJlaW5nIG1vbml0b3JlZCBhbnl3YXkgICAqLworCisgICAgICAgICAgICBwdCA9IF9fa21wX2ZpbmRfdGFza19pbl9kZXNjZW5kYW50X3F1ZXVlIChnbG9iYWxfdGlkLCBxdWV1ZSk7CisKKyAgICAgICAgICAgIGlmIChwdCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaW50IGN0OworCisgICAgICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCYgY3Vycl9xdWV1ZS0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICAgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworCisgICAgICAgICAgICAgICAgY3QgPSAtLShxdWV1ZS0+dHFfcmVmX2NvdW50KTsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfUkVGX0NUUygoImxpbmUgJWQgZ3RpZCAlZDogUSAlcCBkZWMgJWRcbiIsCisgICAgICAgICAgICAgICAgICBfX0xJTkVfXywgZ2xvYmFsX3RpZCwgcXVldWUsIGN0KSk7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggY3QgPj0gMCApOworCisgICAgICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgY3Vycl9xdWV1ZS0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHB0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJiBjdXJyX3F1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworCisgICAgICAgICAgICBuZXh0ID0gcXVldWUtPnRxX25leHRfY2hpbGQ7CisKKyAgICAgICAgICAgIGN0ID0gLS0ocXVldWUtPnRxX3JlZl9jb3VudCk7CisgICAgICAgICAgICBLTVBfREVCVUdfUkVGX0NUUygoImxpbmUgJWQgZ3RpZCAlZDogUSAlcCBkZWMgJWRcbiIsCisgICAgICAgICAgICAgIF9fTElORV9fLCBnbG9iYWxfdGlkLCBxdWV1ZSwgY3QpKTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGN0ID49IDAgKTsKKworICAgICAgICAgICAgcXVldWUgPSBuZXh0OworICAgICAgICB9CisKKyAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgY3Vycl9xdWV1ZS0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworICAgIH0KKworICAgIHJldHVybiBwdDsKK30KKworLyoKKyAqIFdhbGsgdXAgdGhlIHRhc2txIHRyZWUgbG9va2luZyBmb3IgYSB0YXNrIHRvIGV4ZWN1dGUuCisgKiBJZiB3ZSBnZXQgdG8gdGhlIHJvb3QsIHNlYXJjaCB0aGUgdHJlZSBmb3IgYSBkZXNjZW5kZW50IHF1ZXVlIHRhc2suCisgKiBNdXN0IG9ubHkgYmUgY2FsbGVkIHdoZW4gaW5fcGFyYWxsZWw9VFJVRQorICovCisKK3N0YXRpYyBrbXBjX3RodW5rX3QgKgorX19rbXBfZmluZF90YXNrX2luX2FuY2VzdG9yX3F1ZXVlIChrbXBfdGFza3FfdCAqdHEsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3Rhc2tfcXVldWVfdCAqY3Vycl9xdWV1ZSkKK3sKKyAgICBrbXBjX3Rhc2tfcXVldWVfdCAqcXVldWU7CisgICAga21wY190aHVua190ICAgICAgKnB0OworCisgICAgcHQgPSBOVUxMOworCisgICAgaWYgKGN1cnJfcXVldWUtPnRxLnRxX3BhcmVudCAhPSBOVUxMKSB7CisgICAgICAgIHF1ZXVlID0gY3Vycl9xdWV1ZS0+dHEudHFfcGFyZW50OworCisgICAgICAgIHdoaWxlIChxdWV1ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAocXVldWUtPnRxLnRxX3BhcmVudCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaW50IGN0OworICAgICAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIHF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICAgICAgICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKworICAgICAgICAgICAgICAgIGN0ID0gKysocXVldWUtPnRxX3JlZl9jb3VudCk7CisgICAgICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgcXVldWUtPnRxLnRxX3BhcmVudC0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19SRUZfQ1RTKCgibGluZSAlZCBndGlkICVkOiBRICVwIGluYyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIF9fTElORV9fLCBnbG9iYWxfdGlkLCBxdWV1ZSwgY3QpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHQgPSBfX2ttcF9maW5kX3Rhc2tfaW5fcXVldWUgKGdsb2JhbF90aWQsIHF1ZXVlKTsKKyAgICAgICAgICAgIGlmIChwdCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKHF1ZXVlLT50cS50cV9wYXJlbnQgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBpbnQgY3Q7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIHF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICAgICAgICAgICAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlZW1zIHRvIHdvcmsgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworCisgICAgICAgICAgICAgICAgICAgIGN0ID0gLS0ocXVldWUtPnRxX3JlZl9jb3VudCk7CisgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19SRUZfQ1RTKCgibGluZSAlZCBndGlkICVkOiBRICVwIGRlYyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX0xJTkVfXywgZ2xvYmFsX3RpZCwgcXVldWUsIGN0KSk7CisgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGN0ID49IDAgKTsKKworICAgICAgICAgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBxdWV1ZS0+dHEudHFfcGFyZW50LT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIHB0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocXVldWUtPnRxLnRxX3BhcmVudCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaW50IGN0OworICAgICAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIHF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICAgICAgICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKworICAgICAgICAgICAgICAgIGN0ID0gLS0ocXVldWUtPnRxX3JlZl9jb3VudCk7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX1JFRl9DVFMoKCJsaW5lICVkIGd0aWQgJWQ6IFEgJXAgZGVjICVkXG4iLAorICAgICAgICAgICAgICAgICAgX19MSU5FX18sIGdsb2JhbF90aWQsIHF1ZXVlLCBjdCkpOworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGN0ID49IDAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHF1ZXVlID0gcXVldWUtPnRxLnRxX3BhcmVudDsKKworICAgICAgICAgICAgaWYgKHF1ZXVlICE9IE5VTEwpCisgICAgICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHQgPSBfX2ttcF9maW5kX3Rhc2tfaW5fZGVzY2VuZGFudF9xdWV1ZSggZ2xvYmFsX3RpZCwgdHEtPnRxX3Jvb3QgKTsKKworICAgIHJldHVybiBwdDsKK30KKworc3RhdGljIGludAorX19rbXBfdGFza3FfdGFza3NfZmluaXNoZWQgKGttcGNfdGFza19xdWV1ZV90ICpxdWV1ZSkKK3sKKyAgICBpbnQgaTsKKworICAgIC8qIEtNUF9NQigpOyAqLy8qIGlzIHRoaXMgcmVhbGx5IG5lY2Vzc2FyeT8gKi8KKworICAgIGZvciAoaT0wOyBpPHF1ZXVlLT50cV9ucHJvYzsgaSsrKSB7CisgICAgICAgIGlmIChxdWV1ZS0+dHFfdGhfdGh1bmtzW2ldLmFpX2RhdGEgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludAorX19rbXBfdGFza3FfaGFzX2FueV9jaGlsZHJlbiAoa21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlKQoreworICAgIHJldHVybiAocXVldWUtPnRxX2ZpcnN0X2NoaWxkICE9IE5VTEwpOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfcmVtb3ZlX3F1ZXVlX2Zyb21fdHJlZSgga21wX3Rhc2txX3QgKnRxLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlLCBpbnQgaW5fcGFyYWxsZWwgKQoreworI2lmZGVmIEtNUF9ERUJVRworICAgIGttcF9pbnQzMiAgICAgaTsKKyAgICBrbXBjX3RodW5rX3QgKnRodW5rOworI2VuZGlmCisKKyAgICBLRl9UUkFDRSg1MCwgKCJCZWZvcmUgRGVsZXRpb24gb2YgVGFza1EgYXQgJXAgb24gKCVkKTpcbiIsIHF1ZXVlLCBnbG9iYWxfdGlkKSk7CisgICAgS0ZfRFVNUCg1MCwgX19rbXBfZHVtcF90YXNrX3F1ZXVlKCB0cSwgcXVldWUsIGdsb2JhbF90aWQgKSk7CisKKyAgICAvKiAgc3ViLXF1ZXVlIGluIGEgcmVjdXJzaW9uLCBub3QgdGhlIHJvb3QgdGFzayBxdWV1ZSAgKi8KKyAgICBLTVBfREVCVUdfQVNTRVJUIChxdWV1ZS0+dHEudHFfcGFyZW50ICE9IE5VTEwpOworCisgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIHF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworICAgIH0KKworICAgIEtNUF9ERUJVR19BU1NFUlQgKHF1ZXVlLT50cV9maXJzdF9jaGlsZCA9PSBOVUxMKTsKKworICAgIC8qICB1bmxpbmsgcXVldWUgZnJvbSBpdHMgc2libGluZ3MgaWYgYW55IGF0IHRoaXMgbGV2ZWwgICovCisgICAgaWYgKHF1ZXVlLT50cV9wcmV2X2NoaWxkICE9IE5VTEwpCisgICAgICAgIHF1ZXVlLT50cV9wcmV2X2NoaWxkLT50cV9uZXh0X2NoaWxkID0gcXVldWUtPnRxX25leHRfY2hpbGQ7CisgICAgaWYgKHF1ZXVlLT50cV9uZXh0X2NoaWxkICE9IE5VTEwpCisgICAgICAgIHF1ZXVlLT50cV9uZXh0X2NoaWxkLT50cV9wcmV2X2NoaWxkID0gcXVldWUtPnRxX3ByZXZfY2hpbGQ7CisgICAgaWYgKHF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2ZpcnN0X2NoaWxkID09IHF1ZXVlKQorICAgICAgICBxdWV1ZS0+dHEudHFfcGFyZW50LT50cV9maXJzdF9jaGlsZCA9IHF1ZXVlLT50cV9uZXh0X2NoaWxkOworCisgICAgcXVldWUtPnRxX3ByZXZfY2hpbGQgPSBOVUxMOworICAgIHF1ZXVlLT50cV9uZXh0X2NoaWxkID0gTlVMTDsKKworICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICBLTVBfREVCVUdfUkVGX0NUUygoImxpbmUgJWQgZ3RpZCAlZDogUSAlcCB3YWl0aW5nIGZvciByZWZfY291bnQgb2YgJWQgdG8gcmVhY2ggMVxuIiwKKyAgICAgICAgICBfX0xJTkVfXywgZ2xvYmFsX3RpZCwgcXVldWUsIHF1ZXVlLT50cV9yZWZfY291bnQpKTsKKworICAgICAgICAvKiB3YWl0IHVudGlsIGFsbCBvdGhlciB0aHJlYWRzIGhhdmUgc3RvcHBlZCBhY2Nlc3NpbmcgdGhpcyBxdWV1ZSAqLworICAgICAgICB3aGlsZSAocXVldWUtPnRxX3JlZl9jb3VudCA+IDEpIHsKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIHF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICAgICAgS01QX1dBSVRfWUlFTEQoKHZvbGF0aWxlIGttcF91aW50MzIqKSZxdWV1ZS0+dHFfcmVmX2NvdW50LCAxLCBLTVBfTEUsIE5VTEwpOworCisgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJiBxdWV1ZS0+dHEudHFfcGFyZW50LT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworICAgICAgICB9CisKKyAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgcXVldWUtPnRxLnRxX3BhcmVudC0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworICAgIH0KKworICAgIEtNUF9ERUJVR19SRUZfQ1RTKCgibGluZSAlZCBndGlkICVkOiBRICVwIGZyZWVpbmcgcXVldWVcbiIsCisgICAgICBfX0xJTkVfXywgZ2xvYmFsX3RpZCwgcXVldWUpKTsKKworI2lmZGVmIEtNUF9ERUJVRworICAgIEtNUF9ERUJVR19BU1NFUlQocXVldWUtPnRxX2ZsYWdzICYgVFFGX0FMTF9UQVNLU19RVUVVRUQpOworICAgIEtNUF9ERUJVR19BU1NFUlQocXVldWUtPnRxX25mdWxsID09IDApOworCisgICAgZm9yIChpPTA7IGk8cXVldWUtPnRxX25wcm9jOyBpKyspIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChxdWV1ZS0+dHFfdGhfdGh1bmtzW2ldLmFpX2RhdGEgPT0gMCk7CisgICAgfQorCisgICAgaSA9IDA7CisgICAgZm9yICh0aHVuaz1xdWV1ZS0+dHFfZnJlZV90aHVua3M7IHRodW5rICE9IE5VTEw7IHRodW5rPXRodW5rLT50aC50aF9uZXh0X2ZyZWUpCisgICAgICAgICsraTsKKworICAgIEtNUF9BU1NFUlQgKGkgPT0gcXVldWUtPnRxX25zbG90cyArIChxdWV1ZS0+dHFfbnByb2MgKiBfX0tNUF9UQVNLUV9USFVOS1NfUEVSX1RIKSk7CisjZW5kaWYKKworICAgIC8qICByZWxlYXNlIHN0b3JhZ2UgZm9yIHF1ZXVlIGVudHJ5ICAqLworICAgIF9fa21wX2ZyZWVfdGFza3EgKCB0cSwgcXVldWUsIFRSVUUsIGdsb2JhbF90aWQgKTsKKworICAgIEtGX1RSQUNFKDUwLCAoIkFmdGVyIERlbGV0aW9uIG9mIFRhc2tRIGF0ICVwIG9uICglZCk6XG4iLCBxdWV1ZSwgZ2xvYmFsX3RpZCkpOworICAgIEtGX0RVTVAoNTAsIF9fa21wX2R1bXBfdGFza19xdWV1ZV90cmVlKCB0cSwgdHEtPnRxX3Jvb3QsIGdsb2JhbF90aWQgKSk7Cit9CisKKy8qCisgKiBTdGFydGluZyBmcm9tIGluZGljYXRlZCBxdWV1ZSwgcHJvY2VlZCBkb3dud2FyZCB0aHJvdWdoIHRyZWUgYW5kCisgKiByZW1vdmUgYWxsIHRhc2txcyB3aGljaCBhcmUgZmluaXNoZWQsIGJ1dCBvbmx5IGdvIGRvd24gdG8gdGFza3FzCisgKiB3aGljaCBoYXZlIHRoZSAibm93YWl0IiBjbGF1c2UgcHJlc2VudC4gIEFzc3VtZSB0aGlzIGlzIG9ubHkgY2FsbGVkCisgKiB3aGVuIGluX3BhcmFsbGVsPVRSVUUuCisgKi8KKworc3RhdGljIHZvaWQKK19fa21wX2ZpbmRfYW5kX3JlbW92ZV9maW5pc2hlZF9jaGlsZF90YXNrcSgga21wX3Rhc2txX3QgKnRxLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190YXNrX3F1ZXVlX3QgKmN1cnJfcXVldWUgKQoreworICAgIGttcGNfdGFza19xdWV1ZV90ICpxdWV1ZSA9IGN1cnJfcXVldWU7CisKKyAgICBpZiAoY3Vycl9xdWV1ZS0+dHFfZmlyc3RfY2hpbGQgIT0gTlVMTCkgeworICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJiBjdXJyX3F1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICovCisgICAgICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKworICAgICAgICBxdWV1ZSA9IChrbXBjX3Rhc2tfcXVldWVfdCAqKSBjdXJyX3F1ZXVlLT50cV9maXJzdF9jaGlsZDsKKyAgICAgICAgaWYgKHF1ZXVlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIGN1cnJfcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlIChxdWV1ZSAhPSBOVUxMKSAgeworICAgICAgICAgICAga21wY190YXNrX3F1ZXVlX3QgKm5leHQ7CisgICAgICAgICAgICBpbnQgY3QgPSArKyhxdWV1ZS0+dHFfcmVmX2NvdW50KTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19SRUZfQ1RTKCgibGluZSAlZCBndGlkICVkOiBRICVwIGluYyAlZFxuIiwKKyAgICAgICAgICAgICAgX19MSU5FX18sIGdsb2JhbF90aWQsIHF1ZXVlLCBjdCkpOworCisKKyAgICAgICAgICAgIC8qIGFsdGhvdWdoIHJlZmVyZW5jZSBjb3VudCBzdGF5cyBhY3RpdmUgZHVyaW5nIGRlc2NlbmRhbnQgd2FsaywgKi8KKyAgICAgICAgICAgIC8qIHNob3VsZG4ndCBtYXR0ZXIgc2luY2UgaWYgY2hpbGRyZW4gc3RpbGwgZXhpc3QsIHJlZmVyZW5jZSAgICAgKi8KKyAgICAgICAgICAgIC8qIGNvdW50cyBhcmVuJ3QgYmVpbmcgbW9uaXRvcmVkIGFueXdheSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgaWYgKHF1ZXVlLT50cV9mbGFncyAmIFRRRl9JU19OT1dBSVQpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9maW5kX2FuZF9yZW1vdmVfZmluaXNoZWRfY2hpbGRfdGFza3EgKCB0cSwgZ2xvYmFsX3RpZCwgcXVldWUgKTsKKworICAgICAgICAgICAgICAgIGlmICgocXVldWUtPnRxX2ZsYWdzICYgVFFGX0FMTF9UQVNLU19RVUVVRUQpICYmIChxdWV1ZS0+dHFfbmZ1bGwgPT0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfdGFza3FfdGFza3NfZmluaXNoZWQocXVldWUpICYmICEgX19rbXBfdGFza3FfaGFzX2FueV9jaGlsZHJlbihxdWV1ZSkpIHsKKworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgT25seSByZW1vdmUgdGhpcyBpZiB3ZSBoYXZlIG5vdCBhbHJlYWR5IG1hcmtlZCBpdCBmb3IgZGVhbGxvY2F0aW9uLgorICAgICAgICAgICAgICAgICAgICAgVGhpcyBzaG91bGQgcHJldmVudCBtdWx0aXBsZSB0aHJlYWRzIGZyb20gdHJ5aW5nIHRvIGZyZWUgdGhpcy4KKyAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF90ZXN0X2xvY2soJiBxdWV1ZS0+dHFfcXVldWVfbGNrLCBnbG9iYWxfdGlkKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggIShxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfREVBTExPQ0FURUQpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLT50cV9mbGFncyB8PSBUUUZfREVBTExPQ0FURUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgcXVldWUtPnRxX3F1ZXVlX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9yZW1vdmVfcXVldWVfZnJvbV90cmVlKCB0cSwgZ2xvYmFsX3RpZCwgcXVldWUsIFRSVUUgKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENhbid0IGRvIGFueSBtb3JlIGhlcmUgc2luY2UgY2FuJ3QgYmUgc3VyZSB3aGVyZSBzaWJsaW5nIHF1ZXVlIGlzIHNvIGp1c3QgZXhpdCB0aGlzIGxldmVsICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgcXVldWUtPnRxX3F1ZXVlX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLyogb3RoZXJ3aXNlLCBqdXN0IGZhbGwgdGhyb3VnaCBhbmQgZGVjcmVtZW50IHJlZmVyZW5jZSBjb3VudCAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCYgY3Vycl9xdWV1ZS0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKworICAgICAgICAgICAgbmV4dCA9IHF1ZXVlLT50cV9uZXh0X2NoaWxkOworCisgICAgICAgICAgICBjdCA9IC0tKHF1ZXVlLT50cV9yZWZfY291bnQpOworICAgICAgICAgICAgS01QX0RFQlVHX1JFRl9DVFMoKCJsaW5lICVkIGd0aWQgJWQ6IFEgJXAgZGVjICVkXG4iLAorICAgICAgICAgICAgICBfX0xJTkVfXywgZ2xvYmFsX3RpZCwgcXVldWUsIGN0KSk7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBjdCA+PSAwICk7CisKKyAgICAgICAgICAgIHF1ZXVlID0gbmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIGN1cnJfcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICB9Cit9CisKKy8qCisgKiBTdGFydGluZyBmcm9tIGluZGljYXRlZCBxdWV1ZSwgcHJvY2VlZCBkb3dud2FyZCB0aHJvdWdoIHRyZWUgYW5kCisgKiByZW1vdmUgYWxsIHRhc2txJ3MgYXNzdW1pbmcgYWxsIGFyZSBmaW5pc2hlZCBhbmQKKyAqIGFzc3VtaW5nIE5PIG90aGVyIHRocmVhZHMgYXJlIGV4ZWN1dGluZyBhdCB0aGlzIHBvaW50LgorICovCisKK3N0YXRpYyB2b2lkCitfX2ttcF9yZW1vdmVfYWxsX2NoaWxkX3Rhc2txKCBrbXBfdGFza3FfdCAqdHEsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3Rhc2tfcXVldWVfdCAqcXVldWUgKQoreworICAgIGttcGNfdGFza19xdWV1ZV90ICpuZXh0X2NoaWxkOworCisgICAgcXVldWUgPSAoa21wY190YXNrX3F1ZXVlX3QgKikgcXVldWUtPnRxX2ZpcnN0X2NoaWxkOworCisgICAgd2hpbGUgKHF1ZXVlICE9IE5VTEwpICB7CisgICAgICAgIF9fa21wX3JlbW92ZV9hbGxfY2hpbGRfdGFza3EgKCB0cSwgZ2xvYmFsX3RpZCwgcXVldWUgKTsKKworICAgICAgICBuZXh0X2NoaWxkID0gcXVldWUtPnRxX25leHRfY2hpbGQ7CisgICAgICAgIHF1ZXVlLT50cV9mbGFncyB8PSBUUUZfREVBTExPQ0FURUQ7CisgICAgICAgIF9fa21wX3JlbW92ZV9xdWV1ZV9mcm9tX3RyZWUgKCB0cSwgZ2xvYmFsX3RpZCwgcXVldWUsIEZBTFNFICk7CisgICAgICAgIHF1ZXVlID0gbmV4dF9jaGlsZDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9leGVjdXRlX3Rhc2tfZnJvbV9xdWV1ZSgga21wX3Rhc2txX3QgKnRxLCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3RodW5rX3QgKnRodW5rLCBpbnQgaW5fcGFyYWxsZWwgKQoreworICAgIGttcGNfdGFza19xdWV1ZV90ICpxdWV1ZSA9IHRodW5rLT50aC50aF9zaGFyZWRzLT5zdl9xdWV1ZTsKKyAgICBrbXBfaW50MzIgICAgICAgICAgdGlkICAgPSBfX2ttcF90aWRfZnJvbV9ndGlkKCBnbG9iYWxfdGlkICk7CisKKyAgICBLRl9UUkFDRSgxMDAsICgiQWZ0ZXIgZGVxdWV1ZWluZyB0aGlzIFRhc2sgb24gKCVkKTpcbiIsIGdsb2JhbF90aWQpKTsKKyAgICBLRl9EVU1QKDEwMCwgX19rbXBfZHVtcF90aHVuayggdHEsIHRodW5rLCBnbG9iYWxfdGlkICkpOworICAgIEtGX1RSQUNFKDEwMCwgKCJUYXNrIFF1ZXVlOiAlcCBsb29rcyBsaWtlIHRoaXMgKCVkKTpcbiIsIHF1ZXVlLCBnbG9iYWxfdGlkKSk7CisgICAgS0ZfRFVNUCgxMDAsIF9fa21wX2R1bXBfdGFza19xdWV1ZSggdHEsIHF1ZXVlLCBnbG9iYWxfdGlkICkpOworCisgICAgLyoKKyAgICAgKiBGb3IgdGhlIHRhc2txIHRhc2ssIHRoZSBjdXJyX3RodW5rIHB1c2hlcyBhbmQgcG9wIHBhaXJzIGFyZSBzZXQgdXAgYXMgZm9sbG93czoKKyAgICAgKgorICAgICAqIGhhcHBlbnMgZXhhY3RseSBvbmNlOgorICAgICAqIDEpIF9fa21wY190YXNrcSAgICAgICAgICAgICA6IHB1c2ggKGlmIHJldHVybmluZyB0aHVuayBvbmx5KQorICAgICAqIDQpIF9fa21wY19lbmRfdGFza3FfdGFzayAgICA6IHBvcAorICAgICAqCisgICAgICogb3B0aW9uYWxseSBoYXBwZW5zICplYWNoKiB0aW1lIHRhc2txIHRhc2sgaXMgZGVxdWV1ZWQvZW5xdWV1ZWQ6CisgICAgICogMikgX19rbXBjX3Rhc2txX3Rhc2sgICAgICAgIDogcG9wCisgICAgICogMykgX19rbXBfZXhlY3V0ZV90YXNrX2Zyb21fcXVldWUgIDogcHVzaAorICAgICAqCisgICAgICogZXhlY3V0aW9uIG9yZGVyaW5nOiAgMSwoMiwzKSosNAorICAgICAqLworCisgICAgaWYgKCEodGh1bmstPnRoX2ZsYWdzICYgVFFGX1RBU0tRX1RBU0spKSB7CisgICAgICAgIGttcF9pbnQzMiBpbmRleCA9IChxdWV1ZSA9PSB0cS0+dHFfcm9vdCkgPyB0aWQgOiAwOworICAgICAgICB0aHVuay0+dGgudGhfc2hhcmVkcyA9IChrbXBjX3NoYXJlZF92YXJzX3QgKikgcXVldWUtPnRxX3NoYXJlZHNbaW5kZXhdLmFpX2RhdGE7CisKKyAgICAgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgICAgICBfX2ttcF9wdXNoX3dvcmtzaGFyZSggZ2xvYmFsX3RpZCwKKyAgICAgICAgICAgICAgICAgICAgKHF1ZXVlLT50cV9mbGFncyAmIFRRRl9JU19PUkRFUkVEKSA/IGN0X3Rhc2tfb3JkZXJlZCA6IGN0X3Rhc2ssCisgICAgICAgICAgICAgICAgICAgIHF1ZXVlLT50cV9sb2MgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICAgICAgX19rbXBfcHVzaF93b3Jrc2hhcmUoIGdsb2JhbF90aWQsIGN0X3Rhc2txLCBxdWV1ZS0+dHFfbG9jICk7CisgICAgfQorCisgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgIHRodW5rLT50aF9lbmNsX3RodW5rID0gdHEtPnRxX2N1cnJfdGh1bmtbdGlkXTsKKyAgICAgICAgdHEtPnRxX2N1cnJfdGh1bmtbdGlkXSA9IHRodW5rOworCisgICAgICAgIEtGX0RVTVAoIDIwMCwgX19rbXBfZHVtcF90aHVua19zdGFjayggdHEtPnRxX2N1cnJfdGh1bmtbdGlkXSwgZ2xvYmFsX3RpZCApKTsKKyAgICB9CisKKyAgICBLRl9UUkFDRSggNTAsICgiQmVnaW4gRXhlY3V0aW5nIFRodW5rICVwIGZyb20gcXVldWUgJXAgb24gKCVkKVxuIiwgdGh1bmssIHF1ZXVlLCBnbG9iYWxfdGlkKSk7CisgICAgdGh1bmstPnRoX3Rhc2sgKGdsb2JhbF90aWQsIHRodW5rKTsKKyAgICBLRl9UUkFDRSggNTAsICgiRW5kIEV4ZWN1dGluZyBUaHVuayAlcCBmcm9tIHF1ZXVlICVwIG9uICglZClcbiIsIHRodW5rLCBxdWV1ZSwgZ2xvYmFsX3RpZCkpOworCisgICAgaWYgKCEodGh1bmstPnRoX2ZsYWdzICYgVFFGX1RBU0tRX1RBU0spKSB7CisgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgICAgIF9fa21wX3BvcF93b3Jrc2hhcmUoIGdsb2JhbF90aWQsIChxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfSVNfT1JERVJFRCkgPyBjdF90YXNrX29yZGVyZWQgOiBjdF90YXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUtPnRxX2xvYyApOworCisgICAgICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICAgICAgdHEtPnRxX2N1cnJfdGh1bmtbdGlkXSA9IHRodW5rLT50aF9lbmNsX3RodW5rOworICAgICAgICAgICAgdGh1bmstPnRoX2VuY2xfdGh1bmsgPSBOVUxMOworICAgICAgICAgICAgS0ZfRFVNUCggMjAwLCBfX2ttcF9kdW1wX3RodW5rX3N0YWNrKCB0cS0+dHFfY3Vycl90aHVua1t0aWRdLCBnbG9iYWxfdGlkICkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCh0aHVuay0+dGhfZmxhZ3MgJiBUUUZfSVNfT1JERVJFRCkgJiYgaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgICAgIF9fa21wX3Rhc2txX2NoZWNrX29yZGVyZWQoZ2xvYmFsX3RpZCwgdGh1bmspOworICAgICAgICB9CisKKyAgICAgICAgX19rbXBfZnJlZV90aHVuayAocXVldWUsIHRodW5rLCBpbl9wYXJhbGxlbCwgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgS0ZfVFJBQ0UoMTAwLCAoIlQjJWQgQWZ0ZXIgZnJlZWluZyB0aHVuazogJXAsIFRhc2tRIGxvb2tzIGxpa2UgdGhpczpcbiIsIGdsb2JhbF90aWQsIHRodW5rKSk7CisgICAgICAgIEtGX0RVTVAoMTAwLCBfX2ttcF9kdW1wX3Rhc2tfcXVldWUoIHRxLCBxdWV1ZSwgZ2xvYmFsX3RpZCApKTsKKworICAgICAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgICAgIEtNUF9NQigpOyAgIC8qIG5lZWRlZCBzbyB0aHVuayBwdXQgb24gZnJlZSBsaXN0IGJlZm9yZSBvdXRzdGFuZGluZyB0aHVuayBjb3VudCBpcyBkZWNyZW1lbnRlZCAqLworCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHF1ZXVlLT50cV90aF90aHVua3NbdGlkXS5haV9kYXRhID49IDEpOworCisgICAgICAgICAgICBLRl9UUkFDRSggMjAwLCAoIl9fa21wX2V4ZWN1dGVfdGFza19mcm9tX3F1ZXVlOiBUIyVkIGhhcyAlZCB0aHVua3MgaW4gcXVldWUgJXBcbiIsCisgICAgICAgICAgICAgICAgZ2xvYmFsX3RpZCwgcXVldWUtPnRxX3RoX3RodW5rc1t0aWRdLmFpX2RhdGEtMSwgcXVldWUpKTsKKworICAgICAgICAgICAgcXVldWUtPnRxX3RoX3RodW5rc1t0aWRdLmFpX2RhdGEtLTsKKworICAgICAgICAgICAgLyogS01QX01CKCk7ICovICAgICAvKiBpcyBNQiByZWFsbHkgbmVjZXNzYXJ5ID8gKi8KKyAgICAgICAgfQorCisgICAgICAgIGlmIChxdWV1ZS0+dHEudHFfcGFyZW50ICE9IE5VTEwgJiYgaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgICAgIGludCBjdDsKKyAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIHF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgICAgIGN0ID0gLS0ocXVldWUtPnRxX3JlZl9jb3VudCk7CisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBxdWV1ZS0+dHEudHFfcGFyZW50LT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgICAgICBLTVBfREVCVUdfUkVGX0NUUygoImxpbmUgJWQgZ3RpZCAlZDogUSAlcCBkZWMgJWRcbiIsCisgICAgICAgICAgICAgIF9fTElORV9fLCBnbG9iYWxfdGlkLCBxdWV1ZSwgY3QpKTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGN0ID49IDAgKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIHN0YXJ0cyBhIHRhc2txOyBjcmVhdGVzIGFuZCByZXR1cm5zIGEgdGh1bmsgZm9yIHRoZSB0YXNrcV90YXNrICAgICAgICAqLworLyogYWxzbywgcmV0dXJucyBwb2ludGVyIHRvIHNoYXJlZCB2YXJzIGZvciB0aGlzIHRocmVhZCBpbiAic2hhcmVkcyIgYXJnICovCisKK2ttcGNfdGh1bmtfdCAqCitfX2ttcGNfdGFza3EoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcGNfdGFza190IHRhc2txX3Rhc2ssCisgICAgICAgICAgICAgIHNpemVfdCBzaXplb2ZfdGh1bmssIHNpemVfdCBzaXplb2Zfc2hhcmVkcywKKyAgICAgICAgICAgICAga21wX2ludDMyIGZsYWdzLCBrbXBjX3NoYXJlZF92YXJzX3QgKipzaGFyZWRzICkKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgICBpbl9wYXJhbGxlbDsKKyAgICBrbXBfaW50MzIgICAgICAgICAgICBuc2xvdHMsIG50aHVua3MsIG5zaGFyZWRzLCBucHJvYzsKKyAgICBrbXBjX3Rhc2tfcXVldWVfdCAgICpuZXdfcXVldWUsICpjdXJyX3F1ZXVlOworICAgIGttcGNfdGh1bmtfdCAgICAgICAgKm5ld190YXNrcV90aHVuazsKKyAgICBrbXBfaW5mb190ICAgICAgICAgICp0aDsKKyAgICBrbXBfdGVhbV90ICAgICAgICAgICp0ZWFtOworICAgIGttcF90YXNrcV90ICAgICAgICAgKnRxOworICAgIGttcF9pbnQzMiAgICAgICAgICAgIHRpZDsKKworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfdGFza3EgY2FsbGVkICglZClcbiIsIGdsb2JhbF90aWQpKTsKKworICAgIHRoID0gX19rbXBfdGhyZWFkc1sgZ2xvYmFsX3RpZCBdOworICAgIHRlYW0gPSB0aCAtPiB0aC50aF90ZWFtOworICAgIHRxID0gJiB0ZWFtIC0+IHQudF90YXNrcTsKKyAgICBucHJvYyA9IHRlYW0gLT4gdC50X25wcm9jOworICAgIHRpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoIGdsb2JhbF90aWQgKTsKKworICAgIC8qIGZpbmQgb3V0IHdoZXRoZXIgdGhpcyBpcyBhIHBhcmFsbGVsIHRhc2txIG9yIHNlcmlhbGl6ZWQgb25lLiAqLworICAgIGluX3BhcmFsbGVsID0gaW5fcGFyYWxsZWxfY29udGV4dCggdGVhbSApOworCisgICAgaWYoICEgdHEtPnRxX3Jvb3QgKSB7CisgICAgICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICAgICAgLyogVmVjdG9yIE9SREVSRUQgU0VDVElPTiB0byB0YXNrcSB2ZXJzaW9uICovCisgICAgICAgICAgICB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rlb19mY24gPSBfX2ttcF90YXNrcV9lbzsKKworICAgICAgICAgICAgLyogVmVjdG9yIE9SREVSRUQgU0VDVElPTiB0byB0YXNrcSB2ZXJzaW9uICovCisgICAgICAgICAgICB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2R4b19mY24gPSBfX2ttcF90YXNrcV94bzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICAgICAgLyogVGhpcyBzaG91bGRuJ3QgYmUgYSBiYXJyaWVyIHJlZ2lvbiBib3VuZGFyeSwgaXQgd2lsbCBjb25mdXNlIHRoZSB1c2VyLiAqLworICAgICAgICAgICAgLyogTmVlZCB0aGUgYm91bmRhcnkgdG8gYmUgYXQgdGhlIGVuZCB0YXNrcSBpbnN0ZWFkLiAqLworICAgICAgICAgICAgaWYgKCBfX2ttcF9iYXJyaWVyKCBic19wbGFpbl9iYXJyaWVyLCBnbG9iYWxfdGlkLCBUUlVFLCAwLCBOVUxMLCBOVUxMICkpIHsKKyAgICAgICAgICAgICAgICAvKiBDcmVhdGluZyB0aGUgYWN0aXZlIHJvb3QgcXVldWUsIGFuZCB3ZSBhcmUgbm90IHRoZSBtYXN0ZXIgdGhyZWFkLiAqLworICAgICAgICAgICAgICAgIC8qIFRoZSBtYXN0ZXIgdGhyZWFkIGJlbG93IGNyZWF0ZWQgdGhlIHF1ZXVlIGFuZCB0YXNrcyBoYXZlIGJlZW4gICAgICovCisgICAgICAgICAgICAgICAgLyogZW5xdWV1ZWQsIGFuZCB0aGUgbWFzdGVyIHRocmVhZCByZWxlYXNlZCB0aGlzIGJhcnJpZXIuICBUaGlzICAgICAgKi8KKyAgICAgICAgICAgICAgICAvKiB3b3JrZXIgdGhyZWFkIGNhbiBub3cgcHJvY2VlZCBhbmQgZXhlY3V0ZSB0YXNrcy4gIFNlZSBhbHNvIHRoZSAgICAqLworICAgICAgICAgICAgICAgIC8qIFRRRl9SRUxFQVNFX1dPUktFUlMgd2hpY2ggaXMgdXNlZCB0byBoYW5kbGUgdGhpcyBjYXNlLiAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICAqc2hhcmVkcyA9IChrbXBjX3NoYXJlZF92YXJzX3QgKikgdHEtPnRxX3Jvb3QtPnRxX3NoYXJlZHNbdGlkXS5haV9kYXRhOworCisgICAgICAgICAgICAgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wY190YXNrcSByZXR1cm4gKCVkKVxuIiwgZ2xvYmFsX3RpZCkpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBtYXN0ZXIgdGhyZWFkIG9ubHkgZXhlY3V0ZXMgdGhpcyBjb2RlICovCisKKyAgICAgICAgaWYoIHRxLT50cV9jdXJyX3RodW5rX2NhcGFjaXR5IDwgbnByb2MgKSB7CisgICAgICAgICAgICBpZih0cS0+dHFfY3Vycl90aHVuaykKKyAgICAgICAgICAgICAgICBfX2ttcF9mcmVlKHRxLT50cV9jdXJyX3RodW5rKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8qIG9ubHkgbmVlZCB0byBkbyB0aGlzIG9uY2UgYXQgb3V0ZXIgbGV2ZWwsIGkuZS4gd2hlbiB0cV9jdXJyX3RodW5rIGlzIHN0aWxsIE5VTEwgKi8KKyAgICAgICAgICAgICAgICBfX2ttcF9pbml0X2xvY2soICYgdHEtPnRxX2ZyZWVsaXN0X2xjayApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cS0+dHFfY3Vycl90aHVuayA9IChrbXBjX3RodW5rX3QgKiopIF9fa21wX2FsbG9jYXRlKCBucHJvYyAqIHNpemVvZihrbXBjX3RodW5rX3QgKikgKTsKKyAgICAgICAgICAgIHRxIC0+IHRxX2N1cnJfdGh1bmtfY2FwYWNpdHkgPSBucHJvYzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbl9wYXJhbGxlbCkKKyAgICAgICAgICAgIHRxLT50cV9nbG9iYWxfZmxhZ3MgPSBUUUZfUkVMRUFTRV9XT1JLRVJTOworICAgIH0KKworICAgIC8qIGRrcDogaW4gZnV0dXJlLCBpZiBmbGFncyAmIFRRRl9IRVVSSVNUSUNTLCB3aWxsIGNob29zZSBuc2xvdHMgYmFzZWQgKi8KKyAgICAvKiAgICAgIG9uIHNvbWUgaGV1cmlzdGljcyAoZS5nLiwgZGVwdGggb2YgcXVldWUgbmVzdGluZz8pLiAgICAgICAgICAgICovCisKKyAgICBuc2xvdHMgPSAoaW5fcGFyYWxsZWwpID8gKDIgKiBucHJvYykgOiAxOworCisgICAgLyogVGhlcmUgbXVzdCBiZSBucHJvYyAqIF9fS01QX1RBU0tRX1RIVU5LU19QRVJfVEggZXh0cmEgc2xvdHMgZm9yIHBlbmRpbmcgKi8KKyAgICAvKiBqb2JzIGJlaW5nIGV4ZWN1dGVkIGJ5IG90aGVyIHRocmVhZHMsIGFuZCBvbmUgZXh0cmEgZm9yIHRhc2txIHNsb3QgICAgICAgICAgKi8KKworICAgIG50aHVua3MgPSAoaW5fcGFyYWxsZWwpID8gKG5zbG90cyArIChucHJvYyAqIF9fS01QX1RBU0tRX1RIVU5LU19QRVJfVEgpICsgMSkgOiBuc2xvdHMgKyAyOworCisgICAgLyogT25seSB0aGUgcm9vdCB0YXNrcSBnZXRzIGEgcGVyLXRocmVhZCBhcnJheSBvZiBzaGFyZWRzLiAgICAgICAqLworICAgIC8qIFRoZSByZXN0IG9mIHRoZSB0YXNrcSdzIG9ubHkgZ2V0IG9uZSBjb3B5IG9mIHRoZSBzaGFyZWQgdmFycy4gKi8KKworICAgIG5zaGFyZWRzID0gKCAhdHEtPnRxX3Jvb3QgJiYgaW5fcGFyYWxsZWwpID8gbnByb2MgOiAxOworCisgICAgLyogIGNyZWF0ZSBvdmVyYWxsIHF1ZXVlIGRhdGEgc3RydWN0dXJlIGFuZCBpdHMgY29tcG9uZW50cyB0aGF0IHJlcXVpcmUgYWxsb2NhdGlvbiAqLworCisgICAgbmV3X3F1ZXVlID0gX19rbXBfYWxsb2NfdGFza3EgKCB0cSwgaW5fcGFyYWxsZWwsIG5zbG90cywgbnRodW5rcywgbnNoYXJlZHMsIG5wcm9jLAorICAgICAgICBzaXplb2ZfdGh1bmssIHNpemVvZl9zaGFyZWRzLCAmbmV3X3Rhc2txX3RodW5rLCBnbG9iYWxfdGlkICk7CisKKyAgICAvKiAgcmVzdCBvZiBuZXdfcXVldWUgaW5pdGlhbGl6YXRpb25zICAqLworCisgICAgbmV3X3F1ZXVlLT50cV9mbGFncyAgICAgICAgICAgPSBmbGFncyAmIFRRRl9JTlRFUkZBQ0VfRkxBR1M7CisKKyAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgbmV3X3F1ZXVlLT50cV90YXNrbnVtX3F1ZXVpbmcgID0gMDsKKyAgICAgICAgbmV3X3F1ZXVlLT50cV90YXNrbnVtX3NlcnZpbmcgID0gMDsKKyAgICAgICAgbmV3X3F1ZXVlLT50cV9mbGFncyAgICAgICAgICAgfD0gVFFGX1BBUkFMTEVMX0NPTlRFWFQ7CisgICAgfQorCisgICAgbmV3X3F1ZXVlLT50cV90YXNrcV9zbG90ICAgPSBOVUxMOworICAgIG5ld19xdWV1ZS0+dHFfbnNsb3RzICAgICAgID0gbnNsb3RzOworICAgIG5ld19xdWV1ZS0+dHFfaGl3YXQgICAgICAgID0gSElHSF9XQVRFUl9NQVJLIChuc2xvdHMpOworICAgIG5ld19xdWV1ZS0+dHFfbmZ1bGwgICAgICAgID0gMDsKKyAgICBuZXdfcXVldWUtPnRxX2hlYWQgICAgICAgICA9IDA7CisgICAgbmV3X3F1ZXVlLT50cV90YWlsICAgICAgICAgPSAwOworICAgIG5ld19xdWV1ZS0+dHFfbG9jICAgICAgICAgID0gbG9jOworCisgICAgaWYgKChuZXdfcXVldWUtPnRxX2ZsYWdzICYgVFFGX0lTX09SREVSRUQpICYmIGluX3BhcmFsbGVsKSB7CisgICAgICAgIC8qIHByZXBhcmUgdG8gc2VydmUgdGhlIGZpcnN0LXF1ZXVlZCB0YXNrJ3MgT1JERVJFRCBkaXJlY3RpdmUgKi8KKyAgICAgICAgbmV3X3F1ZXVlLT50cV90YXNrbnVtX3NlcnZpbmcgPSAxOworCisgICAgICAgIC8qIFZlY3RvciBPUkRFUkVEIFNFQ1RJT04gdG8gdGFza3EgdmVyc2lvbiAqLworICAgICAgICB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rlb19mY24gPSBfX2ttcF90YXNrcV9lbzsKKworICAgICAgICAvKiBWZWN0b3IgT1JERVJFRCBTRUNUSU9OIHRvIHRhc2txIHZlcnNpb24gKi8KKyAgICAgICAgdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9keG9fZmNuID0gX19rbXBfdGFza3FfeG87CisgICAgfQorCisgICAgLyogIGNyZWF0ZSBhIG5ldyB0aHVuayBmb3IgdGhlIHRhc2txX3Rhc2sgaW4gdGhlIG5ld19xdWV1ZSAgKi8KKyAgICAqc2hhcmVkcyA9IChrbXBjX3NoYXJlZF92YXJzX3QgKikgbmV3X3F1ZXVlLT50cV9zaGFyZWRzWzBdLmFpX2RhdGE7CisKKyAgICBuZXdfdGFza3FfdGh1bmstPnRoLnRoX3NoYXJlZHMgPSAqc2hhcmVkczsKKyAgICBuZXdfdGFza3FfdGh1bmstPnRoX3Rhc2sgICAgICAgPSB0YXNrcV90YXNrOworICAgIG5ld190YXNrcV90aHVuay0+dGhfZmxhZ3MgICAgICA9IG5ld19xdWV1ZS0+dHFfZmxhZ3MgfCBUUUZfVEFTS1FfVEFTSzsKKyAgICBuZXdfdGFza3FfdGh1bmstPnRoX3N0YXR1cyAgICAgPSAwOworCisgICAgS01QX0RFQlVHX0FTU0VSVCAobmV3X3Rhc2txX3RodW5rLT50aF9mbGFncyAmIFRRRl9UQVNLUV9UQVNLKTsKKworICAgIC8qIEtNUF9NQigpOyAqLyAvKiBtYWtlIHN1cmUgdGhlc2UgaW5pdHMgY29tcGxldGUgYmVmb3JlIHRocmVhZHMgc3RhcnQgdXNpbmcgdGhpcyBxdWV1ZSAobmVjZXNzYXJ5PykgKi8KKworICAgIC8qIGluc2VydCB0aGUgbmV3IHRhc2sgcXVldWUgaW50byB0aGUgdHJlZSwgYnV0IG9ubHkgYWZ0ZXIgYWxsIGZpZWxkcyBpbml0aWFsaXplZCAqLworCisgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgIGlmKCAhIHRxLT50cV9yb290ICkgeworICAgICAgICAgICAgbmV3X3F1ZXVlLT50cS50cV9wYXJlbnQgICA9IE5VTEw7CisgICAgICAgICAgICBuZXdfcXVldWUtPnRxX2ZpcnN0X2NoaWxkID0gTlVMTDsKKyAgICAgICAgICAgIG5ld19xdWV1ZS0+dHFfbmV4dF9jaGlsZCAgPSBOVUxMOworICAgICAgICAgICAgbmV3X3F1ZXVlLT50cV9wcmV2X2NoaWxkICA9IE5VTEw7CisgICAgICAgICAgICBuZXdfcXVldWUtPnRxX3JlZl9jb3VudCAgID0gMTsKKyAgICAgICAgICAgIHRxLT50cV9yb290ID0gbmV3X3F1ZXVlOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY3Vycl9xdWV1ZSA9IHRxLT50cV9jdXJyX3RodW5rW3RpZF0tPnRoLnRoX3NoYXJlZHMtPnN2X3F1ZXVlOworICAgICAgICAgICAgbmV3X3F1ZXVlLT50cS50cV9wYXJlbnQgICA9IGN1cnJfcXVldWU7CisgICAgICAgICAgICBuZXdfcXVldWUtPnRxX2ZpcnN0X2NoaWxkID0gTlVMTDsKKyAgICAgICAgICAgIG5ld19xdWV1ZS0+dHFfcHJldl9jaGlsZCAgPSBOVUxMOworICAgICAgICAgICAgbmV3X3F1ZXVlLT50cV9yZWZfY291bnQgICA9IDE7ICAgICAgLyogZm9yIHRoaXMgdGhlIHRocmVhZCB0aGF0IGJ1aWx0IHRoZSBxdWV1ZSAqLworCisgICAgICAgICAgICBLTVBfREVCVUdfUkVGX0NUUygoImxpbmUgJWQgZ3RpZCAlZDogUSAlcCBhbGxvYyAlZFxuIiwKKyAgICAgICAgICAgICAgX19MSU5FX18sIGdsb2JhbF90aWQsIG5ld19xdWV1ZSwgbmV3X3F1ZXVlLT50cV9yZWZfY291bnQpKTsKKworICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCYgY3Vycl9xdWV1ZS0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKworICAgICAgICAgICAgbmV3X3F1ZXVlLT50cV9uZXh0X2NoaWxkID0gKHN0cnVjdCBrbXBjX3Rhc2tfcXVldWVfdCAqKSBjdXJyX3F1ZXVlLT50cV9maXJzdF9jaGlsZDsKKworICAgICAgICAgICAgaWYgKGN1cnJfcXVldWUtPnRxX2ZpcnN0X2NoaWxkICE9IE5VTEwpCisgICAgICAgICAgICAgICAgY3Vycl9xdWV1ZS0+dHFfZmlyc3RfY2hpbGQtPnRxX3ByZXZfY2hpbGQgPSBuZXdfcXVldWU7CisKKyAgICAgICAgICAgIGN1cnJfcXVldWUtPnRxX2ZpcnN0X2NoaWxkID0gbmV3X3F1ZXVlOworCisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBjdXJyX3F1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBzZXQgdXAgdGh1bmsgc3RhY2sgb25seSBhZnRlciBjb2RlIHRoYXQgZGV0ZXJtaW5lcyBjdXJyX3F1ZXVlIGFib3ZlICovCisgICAgICAgIG5ld190YXNrcV90aHVuay0+dGhfZW5jbF90aHVuayA9IHRxLT50cV9jdXJyX3RodW5rW3RpZF07CisgICAgICAgIHRxLT50cV9jdXJyX3RodW5rW3RpZF0gPSBuZXdfdGFza3FfdGh1bms7CisKKyAgICAgICAgS0ZfRFVNUCggMjAwLCBfX2ttcF9kdW1wX3RodW5rX3N0YWNrKCB0cS0+dHFfY3Vycl90aHVua1t0aWRdLCBnbG9iYWxfdGlkICkpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbmV3X3Rhc2txX3RodW5rLT50aF9lbmNsX3RodW5rID0gMDsKKyAgICAgICAgbmV3X3F1ZXVlLT50cS50cV9wYXJlbnQgICA9IE5VTEw7CisgICAgICAgIG5ld19xdWV1ZS0+dHFfZmlyc3RfY2hpbGQgPSBOVUxMOworICAgICAgICBuZXdfcXVldWUtPnRxX25leHRfY2hpbGQgID0gTlVMTDsKKyAgICAgICAgbmV3X3F1ZXVlLT50cV9wcmV2X2NoaWxkICA9IE5VTEw7CisgICAgICAgIG5ld19xdWV1ZS0+dHFfcmVmX2NvdW50ICAgPSAxOworICAgIH0KKworI2lmZGVmIEtNUF9ERUJVRworICAgIEtGX1RSQUNFKDE1MCwgKCJDcmVhdGluZyBUYXNrUSBUYXNrIG9uICglZCk6XG4iLCBnbG9iYWxfdGlkKSk7CisgICAgS0ZfRFVNUCgxNTAsIF9fa21wX2R1bXBfdGh1bmsoIHRxLCBuZXdfdGFza3FfdGh1bmssIGdsb2JhbF90aWQgKSk7CisKKyAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgS0ZfVFJBQ0UoMjUsICgiQWZ0ZXIgVGFza1EgYXQgJXAgQ3JlYXRpb24gb24gKCVkKTpcbiIsIG5ld19xdWV1ZSwgZ2xvYmFsX3RpZCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIEtGX1RSQUNFKDI1LCAoIkFmdGVyIFNlcmlhbCBUYXNrUSBhdCAlcCBDcmVhdGlvbiBvbiAoJWQpOlxuIiwgbmV3X3F1ZXVlLCBnbG9iYWxfdGlkKSk7CisgICAgfQorCisgICAgS0ZfRFVNUCgyNSwgX19rbXBfZHVtcF90YXNrX3F1ZXVlKCB0cSwgbmV3X3F1ZXVlLCBnbG9iYWxfdGlkICkpOworCisgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgIEtGX0RVTVAoNTAsIF9fa21wX2R1bXBfdGFza19xdWV1ZV90cmVlKCB0cSwgdHEtPnRxX3Jvb3QsIGdsb2JhbF90aWQgKSk7CisgICAgfQorI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wdXNoX3dvcmtzaGFyZSggZ2xvYmFsX3RpZCwgY3RfdGFza3EsIG5ld19xdWV1ZS0+dHFfbG9jICk7CisKKyAgICBLRV9UUkFDRSggMTAsICgiX19rbXBjX3Rhc2txIHJldHVybiAoJWQpXG4iLCBnbG9iYWxfdGlkKSk7CisKKyAgICByZXR1cm4gbmV3X3Rhc2txX3RodW5rOworfQorCisKKy8qICBlbmRzIGEgdGFza3E7IGxhc3QgdGhyZWFkIG91dCBkZXN0cm95cyB0aGUgcXVldWUgICovCisKK3ZvaWQKK19fa21wY19lbmRfdGFza3EoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190aHVua190ICp0YXNrcV90aHVuaykKK3sKKyNpZmRlZiBLTVBfREVCVUcKKyAgICBrbXBfaW50MzIgICAgICAgICAgIGk7CisjZW5kaWYKKyAgICBrbXBfdGFza3FfdCAgICAgICAgKnRxOworICAgIGludCAgICAgICAgICAgICAgICAgaW5fcGFyYWxsZWw7CisgICAga21wX2luZm9fdCAgICAgICAgICp0aDsKKyAgICBrbXBfaW50MzIgICAgICAgICAgIGlzX291dGVybW9zdDsKKyAgICBrbXBjX3Rhc2tfcXVldWVfdCAgKnF1ZXVlOworICAgIGttcGNfdGh1bmtfdCAgICAgICAqdGh1bms7CisgICAgaW50ICAgICAgICAgICAgICAgICBucHJvYzsKKworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfZW5kX3Rhc2txIGNhbGxlZCAoJWQpXG4iLCBnbG9iYWxfdGlkKSk7CisKKyAgICB0cSA9ICYgX19rbXBfdGhyZWFkc1tnbG9iYWxfdGlkXSAtPiB0aC50aF90ZWFtIC0+IHQudF90YXNrcTsKKyAgICBucHJvYyA9IF9fa21wX3RocmVhZHNbZ2xvYmFsX3RpZF0gLT4gdGgudGhfdGVhbSAtPiB0LnRfbnByb2M7CisKKyAgICAvKiBGb3IgdGhlIG91dGVybW9zdCB0YXNrcSBvbmx5LCBhbGwgYnV0IG9uZSB0aHJlYWQgd2lsbCBoYXZlIHRhc2txX3RodW5rID09IE5VTEwgKi8KKyAgICBxdWV1ZSA9ICh0YXNrcV90aHVuayA9PSBOVUxMKSA/IHRxLT50cV9yb290IDogdGFza3FfdGh1bmstPnRoLnRoX3NoYXJlZHMtPnN2X3F1ZXVlOworCisgICAgS0VfVFJBQ0UoIDUwLCAoIl9fa21wY19lbmRfdGFza3EgcXVldWU9JXAgKCVkKSBcbiIsIHF1ZXVlLCBnbG9iYWxfdGlkKSk7CisgICAgaXNfb3V0ZXJtb3N0ID0gKHF1ZXVlID09IHRxLT50cV9yb290KTsKKyAgICBpbl9wYXJhbGxlbCA9IChxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfUEFSQUxMRUxfQ09OVEVYVCk7CisKKyAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAga21wX3VpbnQzMiBzcGluczsKKworICAgICAgICAvKiB0aGlzIGlzIGp1c3QgYSBzYWZlZ3VhcmQgdG8gcmVsZWFzZSB0aGUgd2FpdGluZyB0aHJlYWRzIGlmICovCisgICAgICAgIC8qIHRoZSBvdXRlcm1vc3QgdGFza3EgbmV2ZXIgcXVldWVzIGEgdGFzayAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICBpZiAoaXNfb3V0ZXJtb3N0ICYmIChLTVBfTUFTVEVSX0dUSUQoIGdsb2JhbF90aWQgKSkpIHsKKyAgICAgICAgICAgIGlmKCB0cS0+dHFfZ2xvYmFsX2ZsYWdzICYgVFFGX1JFTEVBU0VfV09SS0VSUyApIHsKKyAgICAgICAgICAgICAgICAvKiBubyBsb2NrIG5lZWRlZCwgd29ya2VycyBhcmUgc3RpbGwgaW4gc3BpbiBtb2RlICovCisgICAgICAgICAgICAgICAgdHEtPnRxX2dsb2JhbF9mbGFncyAmPSB+VFFGX1JFTEVBU0VfV09SS0VSUzsKKworICAgICAgICAgICAgICAgIF9fa21wX2VuZF9zcGxpdF9iYXJyaWVyKCBic19wbGFpbl9iYXJyaWVyLCBnbG9iYWxfdGlkICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBrZWVwIGRlcXVldWVpbmcgd29yayB1bnRpbCBhbGwgdGFza3MgYXJlIHF1ZXVlZCBhbmQgZGVxdWV1ZWQgKi8KKworICAgICAgICBkbyB7CisgICAgICAgICAgICAvKiB3YWl0IHVudGlsIHNvbWV0aGluZyBpcyBhdmFpbGFibGUgdG8gZGVxdWV1ZSAqLworICAgICAgICAgICAgS01QX0lOSVRfWUlFTEQoc3BpbnMpOworCisgICAgICAgICAgICB3aGlsZSAoIChxdWV1ZS0+dHFfbmZ1bGwgPT0gMCkKKyAgICAgICAgICAgICAgICAgJiYgKHF1ZXVlLT50cV90YXNrcV9zbG90ID09IE5VTEwpCisgICAgICAgICAgICAgICAgICYmICghIF9fa21wX3Rhc2txX2hhc19hbnlfY2hpbGRyZW4ocXVldWUpICkKKyAgICAgICAgICAgICAgICAgJiYgKCEgKHF1ZXVlLT50cV9mbGFncyAmIFRRRl9BTExfVEFTS1NfUVVFVUVEKSApCisgICAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICBLTVBfWUlFTERfV0hFTiggVFJVRSwgc3BpbnMgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogY2hlY2sgdG8gc2VlIGlmIHdlIGNhbiBleGVjdXRlIHRhc2tzIGluIHRoZSBxdWV1ZSAqLworICAgICAgICAgICAgd2hpbGUgKCAoIChxdWV1ZS0+dHFfbmZ1bGwgIT0gMCkgfHwgKHF1ZXVlLT50cV90YXNrcV9zbG90ICE9IE5VTEwpICkKKyAgICAgICAgICAgICAgICAgJiYgKHRodW5rID0gX19rbXBfZmluZF90YXNrX2luX3F1ZXVlKGdsb2JhbF90aWQsIHF1ZXVlKSkgIT0gTlVMTAorICAgICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgS0ZfVFJBQ0UoNTAsICgiRm91bmQgdGh1bms6ICVwIGluIHByaW1hcnkgcXVldWUgJXAgKCVkKVxuIiwgdGh1bmssIHF1ZXVlLCBnbG9iYWxfdGlkKSk7CisgICAgICAgICAgICAgICAgX19rbXBfZXhlY3V0ZV90YXNrX2Zyb21fcXVldWUoIHRxLCBsb2MsIGdsb2JhbF90aWQsIHRodW5rLCBpbl9wYXJhbGxlbCApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBzZWUgaWYgd29yayBmb3VuZCBjYW4gYmUgZm91bmQgaW4gYSBkZXNjZW5kYW50IHF1ZXVlICovCisgICAgICAgICAgICBpZiAoIChfX2ttcF90YXNrcV9oYXNfYW55X2NoaWxkcmVuKHF1ZXVlKSkKKyAgICAgICAgICAgICAgJiYgKHRodW5rID0gX19rbXBfZmluZF90YXNrX2luX2Rlc2NlbmRhbnRfcXVldWUoZ2xvYmFsX3RpZCwgcXVldWUpKSAhPSBOVUxMCisgICAgICAgICAgICAgICApIHsKKworICAgICAgICAgICAgICAgIEtGX1RSQUNFKDUwLCAoIlN0b2xlIHRodW5rOiAlcCBpbiBkZXNjZW5kYW50IHF1ZXVlOiAlcCB3aGlsZSB3YWl0aW5nIGluIHF1ZXVlOiAlcCAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICB0aHVuaywgdGh1bmstPnRoLnRoX3NoYXJlZHMtPnN2X3F1ZXVlLCBxdWV1ZSwgZ2xvYmFsX3RpZCApKTsKKworICAgICAgICAgICAgICAgIF9fa21wX2V4ZWN1dGVfdGFza19mcm9tX3F1ZXVlKCB0cSwgbG9jLCBnbG9iYWxfdGlkLCB0aHVuaywgaW5fcGFyYWxsZWwgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IHdoaWxlICggKCEgKHF1ZXVlLT50cV9mbGFncyAmIFRRRl9BTExfVEFTS1NfUVVFVUVEKSkKKyAgICAgICAgICAgICAgIHx8IChxdWV1ZS0+dHFfbmZ1bGwgIT0gMCkKKyAgICAgICAgICAgICAgICApOworCisgICAgICAgIEtGX1RSQUNFKDUwLCAoIkFsbCB0YXNrcyBxdWV1ZWQgYW5kIGRlcXVldWVkIGluIHF1ZXVlOiAlcCAoJWQpXG4iLCBxdWV1ZSwgZ2xvYmFsX3RpZCkpOworCisgICAgICAgIC8qIHdhaXQgd2hpbGUgYWxsIHRhc2tzIGFyZSBub3QgZmluaXNoZWQgYW5kIG1vcmUgd29yayBmb3VuZAorICAgICAgICAgICBpbiBkZXNjZW5kYW50IHF1ZXVlcyAqLworCisgICAgICAgIHdoaWxlICggKCFfX2ttcF90YXNrcV90YXNrc19maW5pc2hlZChxdWV1ZSkpCisgICAgICAgICAgICAgJiYgKHRodW5rID0gX19rbXBfZmluZF90YXNrX2luX2Rlc2NlbmRhbnRfcXVldWUoZ2xvYmFsX3RpZCwgcXVldWUpKSAhPSBOVUxMCisgICAgICAgICAgICAgICkgeworCisgICAgICAgICAgICBLRl9UUkFDRSg1MCwgKCJTdG9sZSB0aHVuazogJXAgaW4gZGVzY2VuZGFudCBxdWV1ZTogJXAgd2hpbGUgd2FpdGluZyBpbiBxdWV1ZTogJXAgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICB0aHVuaywgdGh1bmstPnRoLnRoX3NoYXJlZHMtPnN2X3F1ZXVlLCBxdWV1ZSwgZ2xvYmFsX3RpZCkpOworCisgICAgICAgICAgICBfX2ttcF9leGVjdXRlX3Rhc2tfZnJvbV9xdWV1ZSggdHEsIGxvYywgZ2xvYmFsX3RpZCwgdGh1bmssIGluX3BhcmFsbGVsICk7CisgICAgICAgIH0KKworICAgICAgICBLRl9UUkFDRSg1MCwgKCJObyB3b3JrIGZvdW5kIGluIGRlc2NlbmRlbnQgcXVldWVzIG9yIGFsbCB3b3JrIGZpbmlzaGVkIGluIHF1ZXVlOiAlcCAoJWQpXG4iLCBxdWV1ZSwgZ2xvYmFsX3RpZCkpOworCisgICAgICAgIGlmICghaXNfb3V0ZXJtb3N0KSB7CisgICAgICAgICAgICAvKiBuZWVkIHRvIHJldHVybiBpZiBOT1dBSVQgcHJlc2VudCBhbmQgbm90IG91dGVybW9zdCB0YXNrcSAqLworCisgICAgICAgICAgICBpZiAocXVldWUtPnRxX2ZsYWdzICYgVFFGX0lTX05PV0FJVCkgeworICAgICAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIHF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgICAgICAgICBxdWV1ZS0+dHFfcmVmX2NvdW50LS07CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggcXVldWUtPnRxX3JlZl9jb3VudCA+PSAwICk7CisgICAgICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgcXVldWUtPnRxLnRxX3BhcmVudC0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICAgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wY19lbmRfdGFza3EgcmV0dXJuIGZvciBub3dhaXQgY2FzZSAoJWQpXG4iLCBnbG9iYWxfdGlkKSk7CisKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9fa21wX2ZpbmRfYW5kX3JlbW92ZV9maW5pc2hlZF9jaGlsZF90YXNrcSggdHEsIGdsb2JhbF90aWQsIHF1ZXVlICk7CisKKyAgICAgICAgICAgIC8qIFdBSVQgdW50aWwgYWxsIHRhc2tzIGFyZSBmaW5pc2hlZCBhbmQgbm8gY2hpbGQgcXVldWVzIGV4aXN0IGJlZm9yZSBwcm9jZWVkaW5nICovCisgICAgICAgICAgICBLTVBfSU5JVF9ZSUVMRChzcGlucyk7CisKKyAgICAgICAgICAgIHdoaWxlICghX19rbXBfdGFza3FfdGFza3NfZmluaXNoZWQocXVldWUpIHx8IF9fa21wX3Rhc2txX2hhc19hbnlfY2hpbGRyZW4ocXVldWUpKSB7CisgICAgICAgICAgICAgICAgdGh1bmsgPSBfX2ttcF9maW5kX3Rhc2tfaW5fYW5jZXN0b3JfcXVldWUoIHRxLCBnbG9iYWxfdGlkLCBxdWV1ZSApOworCisgICAgICAgICAgICAgICAgaWYgKHRodW5rICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgS0ZfVFJBQ0UoNTAsICgiU3RvbGUgdGh1bms6ICVwIGluIGFuY2VzdG9yIHF1ZXVlOiAlcCB3aGlsZSB3YWl0aW5nIGluIHF1ZXVlOiAlcCAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRodW5rLCB0aHVuay0+dGgudGhfc2hhcmVkcy0+c3ZfcXVldWUsIHF1ZXVlLCBnbG9iYWxfdGlkKSk7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2V4ZWN1dGVfdGFza19mcm9tX3F1ZXVlKCB0cSwgbG9jLCBnbG9iYWxfdGlkLCB0aHVuaywgaW5fcGFyYWxsZWwgKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBLTVBfWUlFTERfV0hFTiggdGh1bmsgPT0gTlVMTCwgc3BpbnMgKTsKKworICAgICAgICAgICAgICAgIF9fa21wX2ZpbmRfYW5kX3JlbW92ZV9maW5pc2hlZF9jaGlsZF90YXNrcSggdHEsIGdsb2JhbF90aWQsIHF1ZXVlICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIHF1ZXVlLT50cV9xdWV1ZV9sY2ssIGdsb2JhbF90aWQpOworICAgICAgICAgICAgaWYgKCAhKHF1ZXVlLT50cV9mbGFncyAmIFRRRl9ERUFMTE9DQVRFRCkgKSB7CisgICAgICAgICAgICAgICAgcXVldWUtPnRxX2ZsYWdzIHw9IFRRRl9ERUFMTE9DQVRFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIHF1ZXVlLT50cV9xdWV1ZV9sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICAvKiBvbmx5IHRoZSBhbGxvY2F0aW5nIHRocmVhZCBjYW4gZGVhbGxvY2F0ZSB0aGUgcXVldWUgKi8KKyAgICAgICAgICAgIGlmICh0YXNrcV90aHVuayAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgX19rbXBfcmVtb3ZlX3F1ZXVlX2Zyb21fdHJlZSggdHEsIGdsb2JhbF90aWQsIHF1ZXVlLCBUUlVFICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfZW5kX3Rhc2txIHJldHVybiBmb3Igbm9uX291dGVybW9zdCBxdWV1ZSwgd2FpdCBjYXNlICglZClcbiIsIGdsb2JhbF90aWQpKTsKKworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLyogT3V0ZXJtb3N0IFF1ZXVlOiBzdGVhbCB3b3JrIGZyb20gZGVzY2VuZGFudHMgdW50aWwgYWxsIHRhc2tzIGFyZSBmaW5pc2hlZCAqLworCisgICAgICAgIEtNUF9JTklUX1lJRUxEKHNwaW5zKTsKKworICAgICAgICB3aGlsZSAoIV9fa21wX3Rhc2txX3Rhc2tzX2ZpbmlzaGVkKHF1ZXVlKSkgeworICAgICAgICAgICAgdGh1bmsgPSBfX2ttcF9maW5kX3Rhc2tfaW5fZGVzY2VuZGFudF9xdWV1ZShnbG9iYWxfdGlkLCBxdWV1ZSk7CisKKyAgICAgICAgICAgIGlmICh0aHVuayAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgS0ZfVFJBQ0UoNTAsICgiU3RvbGUgdGh1bms6ICVwIGluIGRlc2NlbmRhbnQgcXVldWU6ICVwIHdoaWxlIHdhaXRpbmcgaW4gcXVldWU6ICVwICglZClcbiIsCisgICAgICAgICAgICAgICAgICAgIHRodW5rLCB0aHVuay0+dGgudGhfc2hhcmVkcy0+c3ZfcXVldWUsIHF1ZXVlLCBnbG9iYWxfdGlkKSk7CisKKyAgICAgICAgICAgICAgICBfX2ttcF9leGVjdXRlX3Rhc2tfZnJvbV9xdWV1ZSggdHEsIGxvYywgZ2xvYmFsX3RpZCwgdGh1bmssIGluX3BhcmFsbGVsICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEtNUF9ZSUVMRF9XSEVOKCB0aHVuayA9PSBOVUxMLCBzcGlucyApOworICAgICAgICB9CisKKyAgICAgICAgLyogTmVlZCB0aGlzIGJhcnJpZXIgdG8gcHJldmVudCBkZXN0cnVjdGlvbiBvZiBxdWV1ZSBiZWZvcmUgdGhyZWFkcyBoYXZlIGFsbCBleGVjdXRlZCBhYm92ZSBjb2RlICovCisgICAgICAgIC8qIFRoaXMgbWF5IG5lZWQgdG8gYmUgZG9uZSBlYXJsaWVyIHdoZW4gTk9XQUlUIGlzIGltcGxlbWVudGVkIGZvciB0aGUgb3V0ZXJtb3N0IGxldmVsICovCisKKyAgICAgICAgaWYgKCAhX19rbXBfYmFycmllciggYnNfcGxhaW5fYmFycmllciwgZ2xvYmFsX3RpZCwgVFJVRSwgMCwgTlVMTCwgTlVMTCApKSB7CisgICAgICAgICAgICAvKiB0aGUgcXVldWUtPnRxX2ZsYWdzICYgVFFGX0lTX05PV0FJVCBjYXNlIGlzIG5vdCB5ZXQgaGFuZGxlZCBoZXJlOyAgICovCisgICAgICAgICAgICAvKiBmb3IgcmlnaHQgbm93LCBldmVyeWJvZHkgd2FpdHMsIGFuZCB0aGUgbWFzdGVyIHRocmVhZCBkZXN0cm95cyB0aGUgICovCisgICAgICAgICAgICAvKiByZW1haW5pbmcgcXVldWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIF9fa21wX3JlbW92ZV9hbGxfY2hpbGRfdGFza3EoIHRxLCBnbG9iYWxfdGlkLCBxdWV1ZSApOworCisgICAgICAgICAgICAvKiBOb3cgZGVzdHJveSB0aGUgcm9vdCBxdWV1ZSAqLworICAgICAgICAgICAgS0ZfVFJBQ0UoMTAwLCAoIlQjJWQgQmVmb3JlIERlbGV0aW9uIG9mIHRvcC1sZXZlbCBUYXNrUSBhdCAlcDpcbiIsIGdsb2JhbF90aWQsIHF1ZXVlICkpOworICAgICAgICAgICAgS0ZfRFVNUCgxMDAsIF9fa21wX2R1bXBfdGFza19xdWV1ZSggdHEsIHF1ZXVlLCBnbG9iYWxfdGlkICkpOworCisjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICAvKiAgdGhlIHJvb3QgcXVldWUgZW50cnkgICovCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUICgocXVldWUtPnRxLnRxX3BhcmVudCA9PSBOVUxMKSAmJiAocXVldWUtPnRxX25leHRfY2hpbGQgPT0gTlVMTCkpOworCisgICAgICAgICAgICAvKiAgY2hpbGRyZW4gbXVzdCBhbGwgYmUgZ29uZSBieSBub3cgYmVjYXVzZSBvZiBiYXJyaWVyIGFib3ZlICovCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUIChxdWV1ZS0+dHFfZmlyc3RfY2hpbGQgPT0gTlVMTCk7CisKKyAgICAgICAgICAgIGZvciAoaT0wOyBpPG5wcm9jOyBpKyspIHsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHF1ZXVlLT50cV90aF90aHVua3NbaV0uYWlfZGF0YSA9PSAwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpPTAsIHRodW5rPXF1ZXVlLT50cV9mcmVlX3RodW5rczsgdGh1bmsgIT0gTlVMTDsgaSsrLCB0aHVuaz10aHVuay0+dGgudGhfbmV4dF9mcmVlKTsKKworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCAoaSA9PSBxdWV1ZS0+dHFfbnNsb3RzICsgKG5wcm9jICogX19LTVBfVEFTS1FfVEhVTktTX1BFUl9USCkpOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnByb2M7IGkrKykgeworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoICEgdHEtPnRxX2N1cnJfdGh1bmtbaV0gKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgLyogIHVubGluayB0aGUgcm9vdCBxdWV1ZSBlbnRyeSAgKi8KKyAgICAgICAgICAgIHRxIC0+IHRxX3Jvb3QgPSAgTlVMTDsKKworICAgICAgICAgICAgLyogIHJlbGVhc2Ugc3RvcmFnZSBmb3Igcm9vdCBxdWV1ZSBlbnRyeSAgKi8KKyAgICAgICAgICAgIEtGX1RSQUNFKDUwLCAoIkFmdGVyIERlbGV0aW9uIG9mIHRvcC1sZXZlbCBUYXNrUSBhdCAlcCBvbiAoJWQpOlxuIiwgcXVldWUsIGdsb2JhbF90aWQpKTsKKworICAgICAgICAgICAgcXVldWUtPnRxX2ZsYWdzIHw9IFRRRl9ERUFMTE9DQVRFRDsKKyAgICAgICAgICAgIF9fa21wX2ZyZWVfdGFza3EgKCB0cSwgcXVldWUsIGluX3BhcmFsbGVsLCBnbG9iYWxfdGlkICk7CisKKyAgICAgICAgICAgIEtGX0RVTVAoNTAsIF9fa21wX2R1bXBfdGFza19xdWV1ZV90cmVlKCB0cSwgdHEtPnRxX3Jvb3QsIGdsb2JhbF90aWQgKSk7CisKKyAgICAgICAgICAgIC8qIHJlbGVhc2UgdGhlIHdvcmtlcnMgbm93IHRoYXQgdGhlIGRhdGEgc3RydWN0dXJlcyBhcmUgdXAgdG8gZGF0ZSAqLworICAgICAgICAgICAgX19rbXBfZW5kX3NwbGl0X2JhcnJpZXIoIGJzX3BsYWluX2JhcnJpZXIsIGdsb2JhbF90aWQgKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoID0gX19rbXBfdGhyZWFkc1sgZ2xvYmFsX3RpZCBdOworCisgICAgICAgIC8qIFJlc2V0IE9SREVSRUQgU0VDVElPTiB0byBwYXJhbGxlbCB2ZXJzaW9uICovCisgICAgICAgIHRoLT50aC50aF9kaXNwYXRjaC0+dGhfZGVvX2ZjbiA9IDA7CisKKyAgICAgICAgLyogUmVzZXQgT1JERVJFRCBTRUNUSU9OIHRvIHBhcmFsbGVsIHZlcnNpb24gKi8KKyAgICAgICAgdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9keG9fZmNuID0gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIGluIHNlcmlhbCBleGVjdXRpb24gY29udGV4dCwgZGVxdWV1ZSB0aGUgbGFzdCB0YXNrICAqLworICAgICAgICAvKiBhbmQgZXhlY3V0ZSBpdCwgaWYgdGhlcmUgd2VyZSBhbnkgdGFza3MgZW5jb3VudGVyZWQgKi8KKworICAgICAgICBpZiAocXVldWUtPnRxX25mdWxsID4gMCkgeworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChxdWV1ZS0+dHFfbmZ1bGwgPT0gMSk7CisKKyAgICAgICAgICAgIHRodW5rID0gX19rbXBfZGVxdWV1ZV90YXNrKGdsb2JhbF90aWQsIHF1ZXVlLCBpbl9wYXJhbGxlbCk7CisKKyAgICAgICAgICAgIGlmIChxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfSVNfTEFTVF9UQVNLKSB7CisgICAgICAgICAgICAgICAgLyogVFFGX0lTX0xBU1RQUklWQVRFLCBvbmUgdGhpbmcgaW4gcXVldWUsIF9fa21wY19lbmRfdGFza3FfdGFzaygpICovCisgICAgICAgICAgICAgICAgLyogaGFzIGJlZW4gcnVuIHNvIHRoaXMgaXMgbGFzdCB0YXNrLCBydW4gd2l0aCBUUUZfSVNfTEFTVF9UQVNLIHNvICovCisgICAgICAgICAgICAgICAgLyogaW5zdHJ1bWVudGF0aW9uIGRvZXMgY29weS1vdXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICAvKiBubyBuZWVkIGZvciB0ZXN0X3RoZW5fb3IgY2FsbCBzaW5jZSBhbHJlYWR5IGxvY2tlZCAqLworICAgICAgICAgICAgICAgIHRodW5rLT50aF9mbGFncyB8PSBUUUZfSVNfTEFTVF9UQVNLOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBLRl9UUkFDRSg1MCwgKCJUIyVkIGZvdW5kIHRodW5rOiAlcCBpbiBzZXJpYWwgcXVldWU6ICVwXG4iLCBnbG9iYWxfdGlkLCB0aHVuaywgcXVldWUpKTsKKworICAgICAgICAgICAgX19rbXBfZXhlY3V0ZV90YXNrX2Zyb21fcXVldWUoIHRxLCBsb2MsIGdsb2JhbF90aWQsIHRodW5rLCBpbl9wYXJhbGxlbCApOworICAgICAgICB9CisKKyAgICAgICAgLyogZGVzdHJveSB0aGUgdW5hdHRhY2hlZCBzZXJpYWwgcXVldWUgbm93IHRoYXQgdGhlcmUgaXMgbm8gbW9yZSB3b3JrIHRvIGRvICovCisgICAgICAgIEtGX1RSQUNFKDEwMCwgKCJCZWZvcmUgRGVsZXRpb24gb2YgU2VyaWFsaXplZCBUYXNrUSBhdCAlcCBvbiAoJWQpOlxuIiwgcXVldWUsIGdsb2JhbF90aWQpKTsKKyAgICAgICAgS0ZfRFVNUCgxMDAsIF9fa21wX2R1bXBfdGFza19xdWV1ZSggdHEsIHF1ZXVlLCBnbG9iYWxfdGlkICkpOworCisjaWZkZWYgS01QX0RFQlVHCisgICAgICAgIGkgPSAwOworICAgICAgICBmb3IgKHRodW5rPXF1ZXVlLT50cV9mcmVlX3RodW5rczsgdGh1bmsgIT0gTlVMTDsgdGh1bms9dGh1bmstPnRoLnRoX25leHRfZnJlZSkKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCAoaSA9PSBxdWV1ZS0+dHFfbnNsb3RzICsgMSk7CisjZW5kaWYKKyAgICAgICAgLyogIHJlbGVhc2Ugc3RvcmFnZSBmb3IgdW5hdHRhY2hlZCBzZXJpYWwgcXVldWUgICovCisgICAgICAgIEtGX1RSQUNFKDUwLCAoIlNlcmlhbGl6ZWQgVGFza1EgYXQgJXAgZGVsZXRlZCBvbiAoJWQpLlxuIiwgcXVldWUsIGdsb2JhbF90aWQpKTsKKworICAgICAgICBxdWV1ZS0+dHFfZmxhZ3MgfD0gVFFGX0RFQUxMT0NBVEVEOworICAgICAgICBfX2ttcF9mcmVlX3Rhc2txICggdHEsIHF1ZXVlLCBpbl9wYXJhbGxlbCwgZ2xvYmFsX3RpZCApOworICAgIH0KKworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfZW5kX3Rhc2txIHJldHVybiAoJWQpXG4iLCBnbG9iYWxfdGlkKSk7Cit9CisKKy8qICBFbnF1ZXVlcyBhIHRhc2sgZm9yIHRodW5rIHByZXZpb3VzbHkgY3JlYXRlZCBieSBfX2ttcGNfdGFza19idWZmZXIuICovCisvKiAgUmV0dXJucyBub256ZXJvIGlmIGp1c3QgZmlsbGVkIHVwIHF1ZXVlICAqLworCitrbXBfaW50MzIKK19fa21wY190YXNrKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcGNfdGh1bmtfdCAqdGh1bmspCit7CisgICAga21wX2ludDMyICAgICAgICAgIHJldDsKKyAgICBrbXBjX3Rhc2tfcXVldWVfdCAqcXVldWU7CisgICAgaW50ICAgICAgICAgICAgICAgIGluX3BhcmFsbGVsOworICAgIGttcF90YXNrcV90ICAgICAgICp0cTsKKworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfdGFzayBjYWxsZWQgKCVkKVxuIiwgZ2xvYmFsX3RpZCkpOworCisgICAgS01QX0RFQlVHX0FTU0VSVCAoISh0aHVuay0+dGhfZmxhZ3MgJiBUUUZfVEFTS1FfVEFTSykpOyAgLyogIHRodW5rLT50aF90YXNrIGlzIGEgcmVndWxhciB0YXNrICAqLworCisgICAgdHEgICAgICAgICAgPSAmX19rbXBfdGhyZWFkc1tnbG9iYWxfdGlkXSAtPiB0aC50aF90ZWFtIC0+IHQudF90YXNrcTsKKyAgICBxdWV1ZSAgICAgICA9IHRodW5rLT50aC50aF9zaGFyZWRzLT5zdl9xdWV1ZTsKKyAgICBpbl9wYXJhbGxlbCA9IChxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfUEFSQUxMRUxfQ09OVEVYVCk7CisKKyAgICBpZiAoaW5fcGFyYWxsZWwgJiYgKHRodW5rLT50aF9mbGFncyAmIFRRRl9JU19PUkRFUkVEKSkKKyAgICAgICAgdGh1bmstPnRoX3Rhc2tudW0gPSArK3F1ZXVlLT50cV90YXNrbnVtX3F1ZXVpbmc7CisKKyAgICAvKiBGb3Igc2VyaWFsIGV4ZWN1dGlvbiBkZXF1ZXVlIHRoZSBwcmVjZWRpbmcgdGFzayBhbmQgZXhlY3V0ZSBpdCwgaWYgb25lIGV4aXN0cyAqLworICAgIC8qIFRoaXMgY2Fubm90IGJlIHRoZSBsYXN0IHRhc2suICBUaGF0IG9uZSBpcyBoYW5kbGVkIGluIF9fa21wY19lbmRfdGFza3EgKi8KKworICAgIGlmICghaW5fcGFyYWxsZWwgJiYgcXVldWUtPnRxX25mdWxsID4gMCkgeworICAgICAgICBrbXBjX3RodW5rX3QgKnByZXZfdGh1bms7CisKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChxdWV1ZS0+dHFfbmZ1bGwgPT0gMSk7CisKKyAgICAgICAgcHJldl90aHVuayA9IF9fa21wX2RlcXVldWVfdGFzayhnbG9iYWxfdGlkLCBxdWV1ZSwgaW5fcGFyYWxsZWwpOworCisgICAgICAgIEtGX1RSQUNFKDUwLCAoIlQjJWQgZm91bmQgdGh1bms6ICVwIGluIHNlcmlhbCBxdWV1ZTogJXBcbiIsIGdsb2JhbF90aWQsIHByZXZfdGh1bmssIHF1ZXVlKSk7CisKKyAgICAgICAgX19rbXBfZXhlY3V0ZV90YXNrX2Zyb21fcXVldWUoIHRxLCBsb2MsIGdsb2JhbF90aWQsIHByZXZfdGh1bmssIGluX3BhcmFsbGVsICk7CisgICAgfQorCisgICAgLyogVGhlIGluc3RydW1lbnRhdGlvbiBzZXF1ZW5jZSBpczogIF9fa21wY190YXNrX2J1ZmZlcigpLCBpbml0aWFsaXplIHByaXZhdGUgICAgKi8KKyAgICAvKiB2YXJpYWJsZXMsIF9fa21wY190YXNrKCkuICBUaGUgX19rbXBjX3Rhc2tfYnVmZmVyIHJvdXRpbmUgY2hlY2tzIHRoYXQgdGhlICAgICAqLworICAgIC8qIHRhc2sgcXVldWUgaXMgbm90IGZ1bGwgYW5kIGFsbG9jYXRlcyBhIHRodW5rICh3aGljaCBpcyB0aGVuIHBhc3NlZCB0byAgICAgICAgICovCisgICAgLyogX19rbXBjX3Rhc2soKSkuICBTbywgdGhlIGVucXVldWUgYmVsb3cgc2hvdWxkIG5ldmVyIGZhaWwgZHVlIHRvIGEgZnVsbCBxdWV1ZS4gKi8KKworICAgIEtGX1RSQUNFKDEwMCwgKCJBZnRlciBlbnF1ZXVlaW5nIHRoaXMgVGFzayBvbiAoJWQpOlxuIiwgZ2xvYmFsX3RpZCkpOworICAgIEtGX0RVTVAoMTAwLCBfX2ttcF9kdW1wX3RodW5rKCB0cSwgdGh1bmssIGdsb2JhbF90aWQgKSk7CisKKyAgICByZXQgPSBfX2ttcF9lbnF1ZXVlX3Rhc2sgKCB0cSwgZ2xvYmFsX3RpZCwgcXVldWUsIHRodW5rLCBpbl9wYXJhbGxlbCApOworCisgICAgS0ZfVFJBQ0UoMTAwLCAoIlRhc2sgUXVldWUgbG9va3MgbGlrZSB0aGlzIG9uICglZCk6XG4iLCBnbG9iYWxfdGlkKSk7CisgICAgS0ZfRFVNUCgxMDAsIF9fa21wX2R1bXBfdGFza19xdWV1ZSggdHEsIHF1ZXVlLCBnbG9iYWxfdGlkICkpOworCisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wY190YXNrIHJldHVybiAoJWQpXG4iLCBnbG9iYWxfdGlkKSk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKiAgZW5xdWV1ZXMgYSB0YXNrcV90YXNrIGZvciB0aHVuayBwcmV2aW91c2x5IGNyZWF0ZWQgYnkgX19rbXBjX3Rhc2txICAqLworLyogIHRoaXMgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCB1bmxlc3MgaW4gYSBwYXJhbGxlbCBjb250ZXh0ICAgICAgICAgICAgKi8KKwordm9pZAorX19rbXBjX3Rhc2txX3Rhc2soaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190aHVua190ICp0aHVuaywga21wX2ludDMyIHN0YXR1cykKK3sKKyAgICBrbXBjX3Rhc2tfcXVldWVfdCAqcXVldWU7CisgICAga21wX3Rhc2txX3QgICAgICAgKnRxICA9ICZfX2ttcF90aHJlYWRzW2dsb2JhbF90aWRdIC0+IHRoLnRoX3RlYW0gLT4gdC50X3Rhc2txOworICAgIGludCAgICAgICAgICAgICAgICB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKCBnbG9iYWxfdGlkICk7CisKKyAgICBLRV9UUkFDRSggMTAsICgiX19rbXBjX3Rhc2txX3Rhc2sgY2FsbGVkICglZClcbiIsIGdsb2JhbF90aWQpKTsKKyAgICBLRl9UUkFDRSgxMDAsICgiVGFza1EgVGFzayBhcmd1bWVudCB0aHVuayBvbiAoJWQpOlxuIiwgZ2xvYmFsX3RpZCkpOworICAgIEtGX0RVTVAoMTAwLCBfX2ttcF9kdW1wX3RodW5rKCB0cSwgdGh1bmssIGdsb2JhbF90aWQgKSk7CisKKyAgICBxdWV1ZSA9IHRodW5rLT50aC50aF9zaGFyZWRzLT5zdl9xdWV1ZTsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgX19rbXBfcG9wX3dvcmtzaGFyZSggZ2xvYmFsX3RpZCwgY3RfdGFza3EsIGxvYyApOworCisgICAgLyogIHRodW5rLT50aF90YXNrIGlzIHRoZSB0YXNrcV90YXNrICAqLworICAgIEtNUF9ERUJVR19BU1NFUlQgKHRodW5rLT50aF9mbGFncyAmIFRRRl9UQVNLUV9UQVNLKTsKKworICAgIC8qICBub3Qgc3VwcG9zZWQgdG8gY2FsbCBfX2ttcGNfdGFza3FfdGFzayBpZiBpdCdzIGFscmVhZHkgZW5xdWV1ZWQgICovCisgICAgS01QX0RFQlVHX0FTU0VSVCAocXVldWUtPnRxX3Rhc2txX3Nsb3QgPT0gTlVMTCk7CisKKyAgICAvKiBkZXF1ZXVlIHRhc2txIHRodW5rIGZyb20gY3Vycl90aHVuayBzdGFjayAqLworICAgIHRxLT50cV9jdXJyX3RodW5rW3RpZF0gPSB0aHVuay0+dGhfZW5jbF90aHVuazsKKyAgICB0aHVuay0+dGhfZW5jbF90aHVuayA9IE5VTEw7CisKKyAgICBLRl9EVU1QKCAyMDAsIF9fa21wX2R1bXBfdGh1bmtfc3RhY2soIHRxLT50cV9jdXJyX3RodW5rW3RpZF0sIGdsb2JhbF90aWQgKSk7CisKKyAgICB0aHVuay0+dGhfc3RhdHVzID0gc3RhdHVzOworCisgICAgS01QX01CKCk7ICAvKiAgZmx1c2ggdGh1bmstPnRoX3N0YXR1cyBiZWZvcmUgdGFza3FfdGFzayBlbnF1ZXVlZCB0byBhdm9pZCByYWNlIGNvbmRpdGlvbiAgKi8KKworICAgIC8qICBlbnF1ZXVlIHRhc2txX3Rhc2sgaW4gdGh1bmsgaW50byBzcGVjaWFsIHNsb3QgaW4gcXVldWUgICAgICovCisgICAgLyogR0VIIC0gcHJvYmFibHkgZG9uJ3QgbmVlZCB0byBsb2NrIHRhc2txIHNsb3Qgc2luY2Ugb25seSBvbmUgKi8KKyAgICAvKiAgICAgICB0aHJlYWQgZW5xdWV1ZXMgJiBhbHJlYWR5IGEgbG9jayBzZXQgYXQgZGVxdWV1ZSBwb2ludCAqLworCisgICAgcXVldWUtPnRxX3Rhc2txX3Nsb3QgPSB0aHVuazsKKworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfdGFza3FfdGFzayByZXR1cm4gKCVkKVxuIiwgZ2xvYmFsX3RpZCkpOworfQorCisvKiAgZW5kcyBhIHRhc2txX3Rhc2s7IGRvbmUgZ2VuZXJhdGluZyB0YXNrcyAgKi8KKwordm9pZAorX19rbXBjX2VuZF90YXNrcV90YXNrKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcGNfdGh1bmtfdCAqdGh1bmspCit7CisgICAga21wX3Rhc2txX3QgICAgICAgKnRxOworICAgIGttcGNfdGFza19xdWV1ZV90ICpxdWV1ZTsKKyAgICBpbnQgICAgICAgICAgICAgICAgaW5fcGFyYWxsZWw7CisgICAgaW50ICAgICAgICAgICAgICAgIHRpZDsKKworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfZW5kX3Rhc2txX3Rhc2sgY2FsbGVkICglZClcbiIsIGdsb2JhbF90aWQpKTsKKworICAgIHRxICAgICAgICAgID0gJl9fa21wX3RocmVhZHNbZ2xvYmFsX3RpZF0gLT4gdGgudGhfdGVhbSAtPiB0LnRfdGFza3E7CisgICAgcXVldWUgICAgICAgPSB0aHVuay0+dGgudGhfc2hhcmVkcy0+c3ZfcXVldWU7CisgICAgaW5fcGFyYWxsZWwgPSAocXVldWUtPnRxX2ZsYWdzICYgVFFGX1BBUkFMTEVMX0NPTlRFWFQpOworICAgIHRpZCAgICAgICAgID0gX19rbXBfdGlkX2Zyb21fZ3RpZCggZ2xvYmFsX3RpZCApOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wb3Bfd29ya3NoYXJlKCBnbG9iYWxfdGlkLCBjdF90YXNrcSwgbG9jICk7CisKKyAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyNpZiBLTVBfQVJDSF9YODYgfHwgXAorICAgIEtNUF9BUkNIX1g4Nl82NAorCisgICAgICAgIEtNUF9URVNUX1RIRU5fT1IzMiggJnF1ZXVlLT50cV9mbGFncywgKGttcF9pbnQzMikgVFFGX0FMTF9UQVNLU19RVUVVRUQgKTsKKyNlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIHF1ZXVlLT50cV9xdWV1ZV9sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKworICAgICAgICAgICAgcXVldWUtPnRxX2ZsYWdzIHw9IFRRRl9BTExfVEFTS1NfUVVFVUVEOworCisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBxdWV1ZS0+dHFfcXVldWVfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorCisgICAgaWYgKHRodW5rLT50aF9mbGFncyAmIFRRRl9JU19MQVNUUFJJVkFURSkgeworICAgICAgICAvKiBOb3JtYWxseSwgX19rbXBfZmluZF90YXNrX2luX3F1ZXVlKCkgcmVmdXNlcyB0byBzY2hlZHVsZSB0aGUgbGFzdCB0YXNrIGluIHRoZSAqLworICAgICAgICAvKiBxdWV1ZSBpZiBUUUZfSVNfTEFTVFBSSVZBVEUgc28gd2UgY2FuIHBvc2l0aXZlbHkgaWRlbnRpZnkgdGhhdCBsYXN0IHRhc2sgICAgICAqLworICAgICAgICAvKiBhbmQgcnVuIGl0IHdpdGggaXRzIFRRRl9JU19MQVNUX1RBU0sgYml0IHR1cm5lZCBvbiBpbiB0aF9mbGFncy4gIFdoZW4gICAgICAgICAqLworICAgICAgICAvKiBfX2ttcGNfZW5kX3Rhc2txX3Rhc2soKSBpcyBjYWxsZWQgd2UgYXJlIGRvbmUgZ2VuZXJhdGluZyBhbGwgdGhlIHRhc2tzLCBzbyAgICAqLworICAgICAgICAvKiB3ZSBrbm93IHRoZSBsYXN0IG9uZSBpbiB0aGUgcXVldWUgaXMgdGhlIGxhc3Rwcml2YXRlIHRhc2suICBNYXJrIHRoZSBxdWV1ZSAgICAqLworICAgICAgICAvKiBhcyBoYXZpbmcgZ290dGVuIHRvIHRoaXMgc3RhdGUgdmlhIHRxX2ZsYWdzICYgVFFGX0lTX0xBU1RfVEFTSzsgd2hlbiB0aGF0ICAgICAqLworICAgICAgICAvKiB0YXNrIGFjdHVhbGx5IGV4ZWN1dGVzIG1hcmsgaXQgdmlhIHRoX2ZsYWdzICYgVFFGX0lTX0xBU1RfVEFTSyAodGhpcyB0aF9mbGFncyAqLworICAgICAgICAvKiBiaXQgc2lnbmFscyB0aGUgaW5zdHJ1bWVudGVkIGNvZGUgdG8gZG8gY29weS1vdXRzIGFmdGVyIGV4ZWN1dGlvbikuICAgICAgICAgICAqLworCisgICAgICAgIGlmICghIGluX3BhcmFsbGVsKSB7CisgICAgICAgICAgICAvKiBObyBzeW5jaHJvbml6YXRpb24gbmVlZGVkIGZvciBzZXJpYWwgY29udGV4dCAqLworICAgICAgICAgICAgcXVldWUtPnRxX2ZsYWdzIHw9IFRRRl9JU19MQVNUX1RBU0s7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisjaWYgS01QX0FSQ0hfWDg2IHx8IFwKKyAgICBLTVBfQVJDSF9YODZfNjQKKworICAgICAgICAgICAgS01QX1RFU1RfVEhFTl9PUjMyKCAmcXVldWUtPnRxX2ZsYWdzLCAoa21wX2ludDMyKSBUUUZfSVNfTEFTVF9UQVNLICk7CisjZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIHF1ZXVlLT50cV9xdWV1ZV9sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICAgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKworICAgICAgICAgICAgICAgIHF1ZXVlLT50cV9mbGFncyB8PSBUUUZfSVNfTEFTVF9UQVNLOworCisgICAgICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgcXVldWUtPnRxX3F1ZXVlX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIC8qIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb24gd2hlcmUgbGFzdCB0YXNrIGlzIGRlcXVldWVkIGJ1dCAqLworICAgICAgICAgICAgLyogZmxhZyBpc24ndCB2aXNpYmxlIHlldCAobm90IHN1cmUgYWJvdXQgdGhpcykgICAgICAgICAgICAgICovCisgICAgICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGRlcXVldWUgdGFza3EgdGh1bmsgZnJvbSBjdXJyX3RodW5rIHN0YWNrICovCisgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgIHRxLT50cV9jdXJyX3RodW5rW3RpZF0gPSB0aHVuay0+dGhfZW5jbF90aHVuazsKKyAgICAgICAgdGh1bmstPnRoX2VuY2xfdGh1bmsgPSBOVUxMOworCisgICAgICAgIEtGX0RVTVAoIDIwMCwgX19rbXBfZHVtcF90aHVua19zdGFjayggdHEtPnRxX2N1cnJfdGh1bmtbdGlkXSwgZ2xvYmFsX3RpZCApKTsKKyAgICB9CisKKyAgICBLRV9UUkFDRSggMTAsICgiX19rbXBjX2VuZF90YXNrcV90YXNrIHJldHVybiAoJWQpXG4iLCBnbG9iYWxfdGlkKSk7Cit9CisKKy8qIHJldHVybnMgdGh1bmsgZm9yIGEgcmVndWxhciB0YXNrIGJhc2VkIG9uIHRhc2txX3RodW5rICAgICAgICAgICAgICAqLworLyogKF9fa21wY190YXNrcV90YXNrIGRvZXMgdGhlIGFuYWxvZ291cyB0aGluZyBmb3IgYSBUUUZfVEFTS1FfVEFTSykgICovCisKK2ttcGNfdGh1bmtfdCAqCitfX2ttcGNfdGFza19idWZmZXIoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190aHVua190ICp0YXNrcV90aHVuaywga21wY190YXNrX3QgdGFzaykKK3sKKyAgICBrbXBfdGFza3FfdCAgICAgICAqdHE7CisgICAga21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlOworICAgIGttcGNfdGh1bmtfdCAgICAgICpuZXdfdGh1bms7CisgICAgaW50ICAgICAgICAgICAgICAgIGluX3BhcmFsbGVsOworCisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wY190YXNrX2J1ZmZlciBjYWxsZWQgKCVkKVxuIiwgZ2xvYmFsX3RpZCkpOworCisgICAgS01QX0RFQlVHX0FTU0VSVCAodGFza3FfdGh1bmstPnRoX2ZsYWdzICYgVFFGX1RBU0tRX1RBU0spOyAgLyogIHRhc2txX3RodW5rLT50aF90YXNrIGlzIHRoZSB0YXNrcV90YXNrICAqLworCisgICAgdHEgICAgICAgICAgPSAmX19rbXBfdGhyZWFkc1tnbG9iYWxfdGlkXSAtPiB0aC50aF90ZWFtIC0+IHQudF90YXNrcTsKKyAgICBxdWV1ZSAgICAgICA9IHRhc2txX3RodW5rLT50aC50aF9zaGFyZWRzLT5zdl9xdWV1ZTsKKyAgICBpbl9wYXJhbGxlbCA9IChxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfUEFSQUxMRUxfQ09OVEVYVCk7CisKKyAgICAvKiBUaGUgaW5zdHJ1bWVudGF0aW9uIHNlcXVlbmNlIGlzOiAgX19rbXBjX3Rhc2tfYnVmZmVyKCksIGluaXRpYWxpemUgcHJpdmF0ZSAqLworICAgIC8qIHZhcmlhYmxlcywgX19rbXBjX3Rhc2soKS4gIFRoZSBfX2ttcGNfdGFza19idWZmZXIgcm91dGluZSBjaGVja3MgdGhhdCB0aGUgICovCisgICAgLyogdGFzayBxdWV1ZSBpcyBub3QgZnVsbCBhbmQgYWxsb2NhdGVzIGEgdGh1bmsgKHdoaWNoIGlzIHRoZW4gcGFzc2VkIHRvICAgICAgKi8KKyAgICAvKiBfX2ttcGNfdGFzaygpKS4gIFNvLCB3ZSBjYW4gcHJlLWFsbG9jYXRlIGEgdGh1bmsgaGVyZSBhc3N1bWluZyBpdCB3aWxsIGJlICAqLworICAgIC8qIHRoZSBuZXh0IHRvIGJlIGVucXVldWVkIGluIF9fa21wY190YXNrKCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICBuZXdfdGh1bmsgPSBfX2ttcF9hbGxvY190aHVuayAocXVldWUsIGluX3BhcmFsbGVsLCBnbG9iYWxfdGlkKTsKKyAgICBuZXdfdGh1bmstPnRoLnRoX3NoYXJlZHMgPSAoa21wY19zaGFyZWRfdmFyc190ICopIHF1ZXVlLT50cV9zaGFyZWRzWzBdLmFpX2RhdGE7CisgICAgbmV3X3RodW5rLT50aF9lbmNsX3RodW5rID0gTlVMTDsKKyAgICBuZXdfdGh1bmstPnRoX3Rhc2sgICAgICAgPSB0YXNrOworCisgICAgLyogR0VIIC0gc2hvdWxkbid0IG5lZWQgdG8gbG9jayB0aGUgcmVhZCBvZiB0cV9mbGFncyBoZXJlICovCisgICAgbmV3X3RodW5rLT50aF9mbGFncyAgICAgID0gcXVldWUtPnRxX2ZsYWdzICYgVFFGX0lOVEVSRkFDRV9GTEFHUzsKKworICAgIG5ld190aHVuay0+dGhfc3RhdHVzICAgICA9IDA7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUICghKG5ld190aHVuay0+dGhfZmxhZ3MgJiBUUUZfVEFTS1FfVEFTSykpOworCisgICAgS0ZfVFJBQ0UoMTAwLCAoIkNyZWF0aW5nIFJlZ3VsYXIgVGFzayBvbiAoJWQpOlxuIiwgZ2xvYmFsX3RpZCkpOworICAgIEtGX0RVTVAoMTAwLCBfX2ttcF9kdW1wX3RodW5rKCB0cSwgbmV3X3RodW5rLCBnbG9iYWxfdGlkICkpOworCisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wY190YXNrX2J1ZmZlciByZXR1cm4gKCVkKVxuIiwgZ2xvYmFsX3RpZCkpOworCisgICAgcmV0dXJuIG5ld190aHVuazsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfdGhyZWFkcHJpdmF0ZS5jIGIvZmluYWwvcnVudGltZS9zcmMva21wX3RocmVhZHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDAzMTlmCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX3RocmVhZHByaXZhdGUuYwpAQCAtMCwwICsxLDczMyBAQAorLyoKKyAqIGttcF90aHJlYWRwcml2YXRlLmMgLS0gT3Blbk1QIHRocmVhZHByaXZhdGUgc3VwcG9ydCBsaWJyYXJ5CisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfaXR0LmgiCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBVU0VfQ0hFQ0tTX0NPTU1PTgorCisjZGVmaW5lIEtNUF9JTkxJTkVfU1VCUiAgICAgICAgIDEKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkCitrbXBfdGhyZWFkcHJpdmF0ZV9pbnNlcnRfcHJpdmF0ZV9kYXRhKCBpbnQgZ3RpZCwgdm9pZCAqcGNfYWRkciwgdm9pZCAqZGF0YV9hZGRyLCBzaXplX3QgcGNfc2l6ZSApOworc3RydWN0IHByaXZhdGVfY29tbW9uICoKK2ttcF90aHJlYWRwcml2YXRlX2luc2VydCggaW50IGd0aWQsIHZvaWQgKnBjX2FkZHIsIHZvaWQgKmRhdGFfYWRkciwgc2l6ZV90IHBjX3NpemUgKTsKKworc3RydWN0IHNoYXJlZF90YWJsZSAgICAgX19rbXBfdGhyZWFkcHJpdmF0ZV9kX3RhYmxlOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMKKyNpZmRlZiBLTVBfSU5MSU5FX1NVQlIKK19fZm9yY2VpbmxpbmUKKyNlbmRpZgorc3RydWN0IHByaXZhdGVfY29tbW9uICoKK19fa21wX3RocmVhZHByaXZhdGVfZmluZF90YXNrX2NvbW1vbiggc3RydWN0IGNvbW1vbl90YWJsZSAqdGJsLCBpbnQgZ3RpZCwgdm9pZCAqcGNfYWRkciApCisKK3sKKyAgICBzdHJ1Y3QgcHJpdmF0ZV9jb21tb24gKnRuOworCisjaWZkZWYgS01QX1RBU0tfQ09NTU9OX0RFQlVHCisgICAgS0NfVFJBQ0UoIDEwLCAoICJfX2ttcF90aHJlYWRwcml2YXRlX2ZpbmRfdGFza19jb21tb246IHRocmVhZCMlZCwgY2FsbGVkIHdpdGggYWRkcmVzcyAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgZ3RpZCwgcGNfYWRkciApICk7CisgICAgZHVtcF9saXN0KCk7CisjZW5kaWYKKworICAgIGZvciAodG4gPSB0YmwtPmRhdGFbIEtNUF9IQVNIKHBjX2FkZHIpIF07IHRuOyB0biA9IHRuLT5uZXh0KSB7CisgICAgICAgIGlmICh0bi0+Z2JsX2FkZHIgPT0gcGNfYWRkcikgeworI2lmZGVmIEtNUF9UQVNLX0NPTU1PTl9ERUJVRworICAgICAgICAgICAgS0NfVFJBQ0UoIDEwLCAoICJfX2ttcF90aHJlYWRwcml2YXRlX2ZpbmRfdGFza19jb21tb246IHRocmVhZCMlZCwgZm91bmQgbm9kZSAlcCBvbiBsaXN0XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHBjX2FkZHIgKSApOworI2VuZGlmCisgICAgICAgICAgICByZXR1cm4gdG47CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYworI2lmZGVmIEtNUF9JTkxJTkVfU1VCUgorX19mb3JjZWlubGluZQorI2VuZGlmCitzdHJ1Y3Qgc2hhcmVkX2NvbW1vbiAqCitfX2ttcF9maW5kX3NoYXJlZF90YXNrX2NvbW1vbiggc3RydWN0IHNoYXJlZF90YWJsZSAqdGJsLCBpbnQgZ3RpZCwgdm9pZCAqcGNfYWRkciApCit7CisgICAgc3RydWN0IHNoYXJlZF9jb21tb24gKnRuOworCisgICAgZm9yICh0biA9IHRibC0+ZGF0YVsgS01QX0hBU0gocGNfYWRkcikgXTsgdG47IHRuID0gdG4tPm5leHQpIHsKKyAgICAgICAgaWYgKHRuLT5nYmxfYWRkciA9PSBwY19hZGRyKSB7CisjaWZkZWYgS01QX1RBU0tfQ09NTU9OX0RFQlVHCisgICAgICAgICAgICBLQ19UUkFDRSggMTAsICggIl9fa21wX2ZpbmRfc2hhcmVkX3Rhc2tfY29tbW9uOiB0aHJlYWQjJWQsIGZvdW5kIG5vZGUgJXAgb24gbGlzdFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCBwY19hZGRyICkgKTsKKyNlbmRpZgorICAgICAgICAgICAgcmV0dXJuIHRuOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCisKKy8qCisgKiAgICAgIENyZWF0ZSBhIHRlbXBsYXRlIGZvciB0aGUgZGF0YSBpbml0aWFsaXplZCBzdG9yYWdlLgorICogICAgICBFaXRoZXIgdGhlIHRlbXBsYXRlIGlzIE5VTEwgaW5kaWNhdGluZyB6ZXJvIGZpbGwsCisgKiAgICAgIG9yIHRoZSB0ZW1wbGF0ZSBpcyBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIGRhdGEuCisgKi8KKworc3RhdGljIHN0cnVjdCBwcml2YXRlX2RhdGEgKgorX19rbXBfaW5pdF9jb21tb25fZGF0YSggdm9pZCAqcGNfYWRkciwgc2l6ZV90IHBjX3NpemUgKQoreworICAgIHN0cnVjdCBwcml2YXRlX2RhdGEgKmQ7CisgICAgc2l6ZV90ICAgICAgIGk7CisgICAgY2hhciAgICAgICAgKnA7CisKKyAgICBkID0gKHN0cnVjdCBwcml2YXRlX2RhdGEgKikgX19rbXBfYWxsb2NhdGUoIHNpemVvZiggc3RydWN0IHByaXZhdGVfZGF0YSApICk7CisvKgorICAgIGQtPmRhdGEgPSAwOyAgLy8gQUM6IGNvbW1lbnRlZCBvdXQgYmVjYXVzZSBfX2ttcF9hbGxvY2F0ZSB6ZXJvZXMgdGhlIG1lbW9yeQorICAgIGQtPm5leHQgPSAwOworKi8KKyAgICBkLT5zaXplID0gcGNfc2l6ZTsKKyAgICBkLT5tb3JlID0gMTsKKworICAgIHAgPSAoY2hhciopcGNfYWRkcjsKKworICAgIGZvciAoaSA9IHBjX3NpemU7ICBpID4gMDsgLS1pKSB7CisgICAgICAgIGlmICgqcCsrICE9ICdcMCcpIHsKKyAgICAgICAgICAgIGQtPmRhdGEgPSBfX2ttcF9hbGxvY2F0ZSggcGNfc2l6ZSApOworICAgICAgICAgICAgS01QX01FTUNQWSggZC0+ZGF0YSwgcGNfYWRkciwgcGNfc2l6ZSApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZDsKK30KKworLyoKKyAqICAgICAgSW5pdGlhbGl6ZSB0aGUgZGF0YSBhcmVhIGZyb20gdGhlIHRlbXBsYXRlLgorICovCisKK3N0YXRpYyB2b2lkCitfX2ttcF9jb3B5X2NvbW1vbl9kYXRhKCB2b2lkICpwY19hZGRyLCBzdHJ1Y3QgcHJpdmF0ZV9kYXRhICpkICkKK3sKKyAgICBjaGFyICphZGRyID0gKGNoYXIgKikgcGNfYWRkcjsKKyAgICBpbnQgICBpLCBvZmZzZXQ7CisKKyAgICBmb3IgKG9mZnNldCA9IDA7IGQgIT0gMDsgZCA9IGQtPm5leHQpIHsKKyAgICAgICAgZm9yIChpID0gZC0+bW9yZTsgaSA+IDA7IC0taSkgeworICAgICAgICAgICAgaWYgKGQtPmRhdGEgPT0gMCkKKyAgICAgICAgICAgICAgICBtZW1zZXQoICYgYWRkclsgb2Zmc2V0IF0sICdcMCcsIGQtPnNpemUgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBLTVBfTUVNQ1BZKCAmIGFkZHJbIG9mZnNldCBdLCBkLT5kYXRhLCBkLT5zaXplICk7CisgICAgICAgICAgICBvZmZzZXQgKz0gZC0+c2l6ZTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogd2UgYXJlIGNhbGxlZCBmcm9tIF9fa21wX3NlcmlhbF9pbml0aWFsaXplKCkgd2l0aCBfX2ttcF9pbml0el9sb2NrIGhlbGQuICovCit2b2lkCitfX2ttcF9jb21tb25faW5pdGlhbGl6ZSggdm9pZCApCit7CisgICAgaWYoICEgVENSXzQoX19rbXBfaW5pdF9jb21tb24pICkgeworICAgICAgICBpbnQgcTsKKyNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgaW50IGd0aWQ7CisjZW5kaWYKKworICAgICAgICBfX2ttcF90aHJlYWRwcml2X2NhY2hlX2xpc3QgPSBOVUxMOworCisjaWZkZWYgS01QX0RFQlVHCisgICAgICAgIC8qIHZlcmlmeSB0aGUgdWJlciBtYXN0ZXJzIHdlcmUgaW5pdGlhbGl6ZWQgKi8KKyAgICAgICAgZm9yKGd0aWQgPSAwIDsgZ3RpZCA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7IGd0aWQrKyApCisgICAgICAgICAgICBpZiggX19rbXBfcm9vdFtndGlkXSApIHsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9yb290W2d0aWRdLT5yLnJfdWJlcl90aHJlYWQgKTsKKyAgICAgICAgICAgICAgICBmb3IgKCBxID0gMDsgcTwgS01QX0hBU0hfVEFCTEVfU0laRTsgKytxKQorICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAhX19rbXBfcm9vdFtndGlkXS0+ci5yX3ViZXJfdGhyZWFkLT50aC50aF9wcmlfY29tbW9uLT5kYXRhW3FdICk7CisvKiAgICAgICAgICAgICAgICAgICAgX19rbXBfcm9vdFsgZ2l0ZCBdLT4gci5yX3ViZXJfdGhyZWFkIC0+IHRoLnRoX3ByaV9jb21tb24gLT4gZGF0YVsgcSBdID0gMDsqLworICAgICAgICAgICAgfQorI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworCisgICAgICAgIGZvciAocSA9IDA7IHEgPCBLTVBfSEFTSF9UQUJMRV9TSVpFOyArK3EpCisgICAgICAgICAgICBfX2ttcF90aHJlYWRwcml2YXRlX2RfdGFibGUuZGF0YVsgcSBdID0gMDsKKworICAgICAgICBUQ1dfNChfX2ttcF9pbml0X2NvbW1vbiwgVFJVRSk7CisgICAgfQorfQorCisvKiBDYWxsIGFsbCBkZXN0cnVjdG9ycyBmb3IgdGhyZWFkcHJpdmF0ZSBkYXRhIGJlbG9uZ2luZyB0byBhbGwgdGhyZWFkcy4KKyAgIEN1cnJlbnRseSB1bnVzZWQhICovCit2b2lkCitfX2ttcF9jb21tb25fZGVzdHJveSggdm9pZCApCit7CisgICAgaWYoIFRDUl80KF9fa21wX2luaXRfY29tbW9uKSApIHsKKyAgICAgICAgaW50IHE7CisKKyAgICAgICAgVENXXzQoX19rbXBfaW5pdF9jb21tb24sIEZBTFNFKTsKKworICAgICAgICBmb3IgKHEgPSAwOyBxIDwgS01QX0hBU0hfVEFCTEVfU0laRTsgKytxKSB7CisgICAgICAgICAgICBpbnQgZ3RpZDsKKyAgICAgICAgICAgIHN0cnVjdCBwcml2YXRlX2NvbW1vbiAqdG47CisgICAgICAgICAgICBzdHJ1Y3Qgc2hhcmVkX2NvbW1vbiAgKmRfdG47CisKKyAgICAgICAgICAgIC8qICBDKysgZGVzdHJ1Y3RvcnMgbmVlZCB0byBiZSBjYWxsZWQgb25jZSBwZXIgdGhyZWFkIGJlZm9yZSBleGl0aW5nICAqLworICAgICAgICAgICAgLyogIGRvbid0IGNhbGwgZGVzdHJ1Y3RvcnMgZm9yIG1hc3RlciB0aHJlYWQgdGhvdWdoIHVubGVzcyB3ZSB1c2VkIGNvcHkgY29uc3RydWN0b3IgKi8KKworICAgICAgICAgICAgZm9yIChkX3RuID0gX19rbXBfdGhyZWFkcHJpdmF0ZV9kX3RhYmxlLmRhdGFbIHEgXTsgZF90bjsgZF90biA9IGRfdG4tPm5leHQpIHsKKyAgICAgICAgICAgICAgICBpZiAoZF90bi0+aXNfdmVjKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkX3RuLT5kdC5kdG9ydiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGd0aWQgPSAwOyBndGlkIDwgX19rbXBfYWxsX250aDsgKytndGlkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIF9fa21wX3RocmVhZHNbZ3RpZF0gKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAoX19rbXBfZm9yZWlnbl90cCkgPyAoISBLTVBfSU5JVElBTF9HVElEIChndGlkKSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCEgS01QX1VCRVJfR1RJRCAoZ3RpZCkpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG4gPSBfX2ttcF90aHJlYWRwcml2YXRlX2ZpbmRfdGFza19jb21tb24oIF9fa21wX3RocmVhZHNbIGd0aWQgXS0+dGgudGhfcHJpX2NvbW1vbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCBkX3RuLT5nYmxfYWRkciApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpkX3RuLT5kdC5kdG9ydikgKHRuLT5wYXJfYWRkciwgZF90bi0+dmVjX2xlbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZF90bi0+b2JqX2luaXQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZF90bi0+ZHQuZHRvcnYpIChkX3RuLT5vYmpfaW5pdCwgZF90bi0+dmVjX2xlbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoZF90bi0+ZHQuZHRvciAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGd0aWQgPSAwOyBndGlkIDwgX19rbXBfYWxsX250aDsgKytndGlkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIF9fa21wX3RocmVhZHNbZ3RpZF0gKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAoX19rbXBfZm9yZWlnbl90cCkgPyAoISBLTVBfSU5JVElBTF9HVElEIChndGlkKSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCEgS01QX1VCRVJfR1RJRCAoZ3RpZCkpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG4gPSBfX2ttcF90aHJlYWRwcml2YXRlX2ZpbmRfdGFza19jb21tb24oIF9fa21wX3RocmVhZHNbIGd0aWQgXS0+dGgudGhfcHJpX2NvbW1vbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCBkX3RuLT5nYmxfYWRkciApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpkX3RuLT5kdC5kdG9yKSAodG4tPnBhcl9hZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkX3RuLT5vYmpfaW5pdCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpkX3RuLT5kdC5kdG9yKSAoZF90bi0+b2JqX2luaXQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX19rbXBfdGhyZWFkcHJpdmF0ZV9kX3RhYmxlLmRhdGFbIHEgXSA9IDA7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIENhbGwgYWxsIGRlc3RydWN0b3JzIGZvciB0aHJlYWRwcml2YXRlIGRhdGEgYmVsb25naW5nIHRvIHRoaXMgdGhyZWFkICovCit2b2lkCitfX2ttcF9jb21tb25fZGVzdHJveV9ndGlkKCBpbnQgZ3RpZCApCit7CisgICAgc3RydWN0IHByaXZhdGVfY29tbW9uICp0bjsKKyAgICBzdHJ1Y3Qgc2hhcmVkX2NvbW1vbiAqZF90bjsKKworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcF9jb21tb25fZGVzdHJveV9ndGlkOiBUIyVkIGNhbGxlZFxuIiwgZ3RpZCApICk7CisgICAgaWYoIChfX2ttcF9mb3JlaWduX3RwKSA/ICghIEtNUF9JTklUSUFMX0dUSUQgKGd0aWQpKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICghIEtNUF9VQkVSX0dUSUQgKGd0aWQpKSApIHsKKworICAgICAgICBpZiggVENSXzQoX19rbXBfaW5pdF9jb21tb24pICkgeworCisgICAgICAgICAgICAvKiBDYW5ub3QgZG8gdGhpcyBoZXJlIHNpbmNlIG5vdCBhbGwgdGhyZWFkcyBoYXZlIGRlc3Ryb3llZCB0aGVpciBkYXRhICovCisgICAgICAgICAgICAvKiBUQ1dfNChfX2ttcF9pbml0X2NvbW1vbiwgRkFMU0UpOyAqLworCisgICAgICAgICAgICBmb3IgKHRuID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF9wcmlfaGVhZDsgdG47IHRuID0gdG4tPmxpbmspIHsKKworICAgICAgICAgICAgICAgIGRfdG4gPSBfX2ttcF9maW5kX3NoYXJlZF90YXNrX2NvbW1vbiggJl9fa21wX3RocmVhZHByaXZhdGVfZF90YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRuLT5nYmxfYWRkciApOworCisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggZF90biApOworCisgICAgICAgICAgICAgICAgaWYgKGRfdG4tPmlzX3ZlYykgeworICAgICAgICAgICAgICAgICAgICBpZiAoZF90bi0+ZHQuZHRvcnYgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpICgqZF90bi0+ZHQuZHRvcnYpICh0bi0+cGFyX2FkZHIsIGRfdG4tPnZlY19sZW4pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChkX3RuLT5vYmpfaW5pdCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCkgKCpkX3RuLT5kdC5kdG9ydikgKGRfdG4tPm9ial9pbml0LCBkX3RuLT52ZWNfbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkX3RuLT5kdC5kdG9yICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSAoKmRfdG4tPmR0LmR0b3IpICh0bi0+cGFyX2FkZHIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChkX3RuLT5vYmpfaW5pdCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCkgKCpkX3RuLT5kdC5kdG9yKSAoZF90bi0+b2JqX2luaXQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgS0NfVFJBQ0UoIDMwLCAoIl9fa21wX2NvbW1vbl9kZXN0cm95X2d0aWQ6IFQjJWQgdGhyZWFkcHJpdmF0ZSBkZXN0cnVjdG9ycyBjb21wbGV0ZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQgKSApOworICAgICAgICB9CisgICAgfQorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgS01QX1RBU0tfQ09NTU9OX0RFQlVHCitzdGF0aWMgdm9pZAorZHVtcF9saXN0KCB2b2lkICkKK3sKKyAgICBpbnQgcCwgcTsKKworICAgIGZvciAocCA9IDA7IHAgPCBfX2ttcF9hbGxfbnRoOyArK3ApIHsKKyAgICAgICAgaWYoICFfX2ttcF90aHJlYWRzW3BdICkgY29udGludWU7CisgICAgICAgIGZvciAocSA9IDA7IHEgPCBLTVBfSEFTSF9UQUJMRV9TSVpFOyArK3EpIHsKKyAgICAgICAgICAgIGlmIChfX2ttcF90aHJlYWRzWyBwIF0tPnRoLnRoX3ByaV9jb21tb24tPmRhdGFbIHEgXSkgeworICAgICAgICAgICAgICAgIHN0cnVjdCBwcml2YXRlX2NvbW1vbiAqdG47CisKKyAgICAgICAgICAgICAgICBLQ19UUkFDRSggMTAsICggIlx0ZHVtcF9saXN0OiBndGlkOiVkIGFkZHJlc3Nlc1xuIiwgcCApICk7CisKKyAgICAgICAgICAgICAgICBmb3IgKHRuID0gX19rbXBfdGhyZWFkc1sgcCBdLT50aC50aF9wcmlfY29tbW9uLT5kYXRhWyBxIF07IHRuOyB0biA9IHRuLT5uZXh0KSAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBLQ19UUkFDRSggMTAsICggIlx0ZHVtcF9saXN0OiBUSFJFQURQUklWQVRFOiBTZXJpYWwgJXAgLT4gUGFyYWxsZWwgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bi0+Z2JsX2FkZHIsIHRuLT5wYXJfYWRkciApICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorI2VuZGlmIC8qIEtNUF9UQVNLX0NPTU1PTl9ERUJVRyAqLworCisKKy8qCisgKiBOT1RFOiB0aGlzIHJvdXRpbmUgaXMgdG8gYmUgY2FsbGVkIG9ubHkgZnJvbSB0aGUgc2VyaWFsIHBhcnQgb2YgdGhlIHByb2dyYW0uCisgKi8KKwordm9pZAora21wX3RocmVhZHByaXZhdGVfaW5zZXJ0X3ByaXZhdGVfZGF0YSggaW50IGd0aWQsIHZvaWQgKnBjX2FkZHIsIHZvaWQgKmRhdGFfYWRkciwgc2l6ZV90IHBjX3NpemUgKQoreworICAgIHN0cnVjdCBzaGFyZWRfY29tbW9uICoqbG5rX3RuLCAqZF90bjsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90aHJlYWRzWyBndGlkIF0gJiYKKyAgICAgICAgICAgIF9fa21wX3RocmVhZHNbIGd0aWQgXSAtPiB0aC50aF9yb290IC0+IHIucl9hY3RpdmUgPT0gMCApOworCisgICAgZF90biA9IF9fa21wX2ZpbmRfc2hhcmVkX3Rhc2tfY29tbW9uKCAmX19rbXBfdGhyZWFkcHJpdmF0ZV9kX3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgcGNfYWRkciApOworCisgICAgaWYgKGRfdG4gPT0gMCkgeworICAgICAgICBkX3RuID0gKHN0cnVjdCBzaGFyZWRfY29tbW9uICopIF9fa21wX2FsbG9jYXRlKCBzaXplb2YoIHN0cnVjdCBzaGFyZWRfY29tbW9uICkgKTsKKworICAgICAgICBkX3RuLT5nYmxfYWRkciA9IHBjX2FkZHI7CisgICAgICAgIGRfdG4tPnBvZF9pbml0ID0gX19rbXBfaW5pdF9jb21tb25fZGF0YSggZGF0YV9hZGRyLCBwY19zaXplICk7CisvKgorICAgICAgICBkX3RuLT5vYmpfaW5pdCA9IDA7ICAvLyBBQzogY29tbWVudGVkIG91dCBiZWNhdXNlIF9fa21wX2FsbG9jYXRlIHplcm9lcyB0aGUgbWVtb3J5CisgICAgICAgIGRfdG4tPmN0LmN0b3IgPSAwOworICAgICAgICBkX3RuLT5jY3QuY2N0b3IgPSAwOzsKKyAgICAgICAgZF90bi0+ZHQuZHRvciA9IDA7CisgICAgICAgIGRfdG4tPmlzX3ZlYyA9IEZBTFNFOworICAgICAgICBkX3RuLT52ZWNfbGVuID0gMEw7CisqLworICAgICAgICBkX3RuLT5jbW5fc2l6ZSA9IHBjX3NpemU7CisKKyAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCAmX19rbXBfZ2xvYmFsX2xvY2ssIGd0aWQgKTsKKworICAgICAgICBsbmtfdG4gPSAmKF9fa21wX3RocmVhZHByaXZhdGVfZF90YWJsZS5kYXRhWyBLTVBfSEFTSChwY19hZGRyKSBdKTsKKworICAgICAgICBkX3RuLT5uZXh0ID0gKmxua190bjsKKyAgICAgICAgKmxua190biA9IGRfdG47CisKKyAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCAmX19rbXBfZ2xvYmFsX2xvY2ssIGd0aWQgKTsKKyAgICB9Cit9CisKK3N0cnVjdCBwcml2YXRlX2NvbW1vbiAqCitrbXBfdGhyZWFkcHJpdmF0ZV9pbnNlcnQoIGludCBndGlkLCB2b2lkICpwY19hZGRyLCB2b2lkICpkYXRhX2FkZHIsIHNpemVfdCBwY19zaXplICkKK3sKKyAgICBzdHJ1Y3QgcHJpdmF0ZV9jb21tb24gKnRuLCAqKnR0OworICAgIHN0cnVjdCBzaGFyZWRfY29tbW9uICAqZF90bjsKKworICAgIC8qICsrKysrKysrKyBTVEFSVCBPRiBDUklUSUNBTCBTRUNUSU9OICsrKysrKysrKyAqLworCisgICAgX19rbXBfYWNxdWlyZV9sb2NrKCAmIF9fa21wX2dsb2JhbF9sb2NrLCBndGlkICk7CisKKyAgICB0biA9IChzdHJ1Y3QgcHJpdmF0ZV9jb21tb24gKikgX19rbXBfYWxsb2NhdGUoIHNpemVvZiAoc3RydWN0IHByaXZhdGVfY29tbW9uKSApOworCisgICAgdG4tPmdibF9hZGRyID0gcGNfYWRkcjsKKworICAgIGRfdG4gPSBfX2ttcF9maW5kX3NoYXJlZF90YXNrX2NvbW1vbiggJl9fa21wX3RocmVhZHByaXZhdGVfZF90YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHBjX2FkZHIgKTsgICAgIC8qIE9ubHkgdGhlIE1BU1RFUiBkYXRhIHRhYmxlIGV4aXN0cy4gKi8KKworICAgIGlmIChkX3RuICE9IDApIHsKKyAgICAgICAgLyogVGhpcyB0aHJlYWRwcml2YXRlIHZhcmlhYmxlIGhhcyBhbHJlYWR5IGJlZW4gc2Vlbi4gKi8KKworICAgICAgICBpZiAoIGRfdG4tPnBvZF9pbml0ID09IDAgJiYgZF90bi0+b2JqX2luaXQgPT0gMCApIHsKKyAgICAgICAgICAgIGRfdG4tPmNtbl9zaXplID0gcGNfc2l6ZTsKKworICAgICAgICAgICAgaWYgKGRfdG4tPmlzX3ZlYykgeworICAgICAgICAgICAgICAgIGlmIChkX3RuLT5jdC5jdG9ydiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIENvbnN0cnVjdCBmcm9tIHNjcmF0Y2ggc28gbm8gcHJvdG90eXBlIGV4aXN0cyAqLworICAgICAgICAgICAgICAgICAgICBkX3RuLT5vYmpfaW5pdCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRfdG4tPmNjdC5jY3RvcnYgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvKiBOb3cgZGF0YSBpbml0aWFsaXplIHRoZSBwcm90b3R5cGUgc2luY2UgaXQgd2FzIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCAqLworICAgICAgICAgICAgICAgICAgICBkX3RuLT5vYmpfaW5pdCA9ICh2b2lkICopIF9fa21wX2FsbG9jYXRlKCBkX3RuLT5jbW5fc2l6ZSApOworICAgICAgICAgICAgICAgICAgICAodm9pZCkgKCpkX3RuLT5jY3QuY2N0b3J2KSAoZF90bi0+b2JqX2luaXQsIHBjX2FkZHIsIGRfdG4tPnZlY19sZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZF90bi0+cG9kX2luaXQgPSBfX2ttcF9pbml0X2NvbW1vbl9kYXRhKCBkYXRhX2FkZHIsIGRfdG4tPmNtbl9zaXplICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoZF90bi0+Y3QuY3RvciAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIENvbnN0cnVjdCBmcm9tIHNjcmF0Y2ggc28gbm8gcHJvdG90eXBlIGV4aXN0cyAqLworICAgICAgICAgICAgICAgICAgICBkX3RuLT5vYmpfaW5pdCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRfdG4tPmNjdC5jY3RvciAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIE5vdyBkYXRhIGluaXRpYWxpemUgdGhlIHByb3RvdHlwZSBzaW5jZSBpdCB3YXMgcHJldmlvdXNseSByZWdpc3RlcmVkICovCisgICAgICAgICAgICAgICAgICAgIGRfdG4tPm9ial9pbml0ID0gKHZvaWQgKikgX19rbXBfYWxsb2NhdGUoIGRfdG4tPmNtbl9zaXplICk7CisgICAgICAgICAgICAgICAgICAgICh2b2lkKSAoKmRfdG4tPmNjdC5jY3RvcikgKGRfdG4tPm9ial9pbml0LCBwY19hZGRyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRfdG4tPnBvZF9pbml0ID0gX19rbXBfaW5pdF9jb21tb25fZGF0YSggZGF0YV9hZGRyLCBkX3RuLT5jbW5fc2l6ZSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgc3RydWN0IHNoYXJlZF9jb21tb24gKipsbmtfdG47CisKKyAgICAgICAgZF90biA9IChzdHJ1Y3Qgc2hhcmVkX2NvbW1vbiAqKSBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKCBzdHJ1Y3Qgc2hhcmVkX2NvbW1vbiApICk7CisgICAgICAgIGRfdG4tPmdibF9hZGRyID0gcGNfYWRkcjsKKyAgICAgICAgZF90bi0+Y21uX3NpemUgPSBwY19zaXplOworICAgICAgICBkX3RuLT5wb2RfaW5pdCA9IF9fa21wX2luaXRfY29tbW9uX2RhdGEoIGRhdGFfYWRkciwgcGNfc2l6ZSApOworLyoKKyAgICAgICAgZF90bi0+b2JqX2luaXQgPSAwOyAgLy8gQUM6IGNvbW1lbnRlZCBvdXQgYmVjYXVzZSBfX2ttcF9hbGxvY2F0ZSB6ZXJvZXMgdGhlIG1lbW9yeQorICAgICAgICBkX3RuLT5jdC5jdG9yID0gMDsKKyAgICAgICAgZF90bi0+Y2N0LmNjdG9yID0gMDsKKyAgICAgICAgZF90bi0+ZHQuZHRvciA9IDA7CisgICAgICAgIGRfdG4tPmlzX3ZlYyA9IEZBTFNFOworICAgICAgICBkX3RuLT52ZWNfbGVuID0gMEw7CisqLworICAgICAgICBsbmtfdG4gPSAmKF9fa21wX3RocmVhZHByaXZhdGVfZF90YWJsZS5kYXRhWyBLTVBfSEFTSChwY19hZGRyKSBdKTsKKworICAgICAgICBkX3RuLT5uZXh0ID0gKmxua190bjsKKyAgICAgICAgKmxua190biA9IGRfdG47CisgICAgfQorCisgICAgdG4tPmNtbl9zaXplID0gZF90bi0+Y21uX3NpemU7CisKKyAgICBpZiAoIChfX2ttcF9mb3JlaWduX3RwKSA/IChLTVBfSU5JVElBTF9HVElEIChndGlkKSkgOiAoS01QX1VCRVJfR1RJRCAoZ3RpZCkpICkgeworICAgICAgICB0bi0+cGFyX2FkZHIgPSAodm9pZCAqKSBwY19hZGRyOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgdG4tPnBhcl9hZGRyID0gKHZvaWQgKikgX19rbXBfYWxsb2NhdGUoIHRuLT5jbW5fc2l6ZSApOworICAgIH0KKworICAgIF9fa21wX3JlbGVhc2VfbG9jayggJiBfX2ttcF9nbG9iYWxfbG9jaywgZ3RpZCApOworCisgICAgLyogKysrKysrKysrIEVORCBPRiBDUklUSUNBTCBTRUNUSU9OICsrKysrKysrKyAqLworCisjaWZkZWYgVVNFX0NIRUNLU19DT01NT04KKyAgICAgICAgaWYgKHBjX3NpemUgPiBkX3RuLT5jbW5fc2l6ZSkgeworICAgICAgICAgICAgS0NfVFJBQ0UoIDEwLCAoICJfX2ttcF90aHJlYWRwcml2YXRlX2luc2VydDogVEhSRUFEUFJJVkFURTogJXAgKCUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX1VJTlRQVFJfU1BFQyAiICwlIiBLTVBfVUlOVFBUUl9TUEVDICIpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjX2FkZHIsIHBjX3NpemUsIGRfdG4tPmNtbl9zaXplICkgKTsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggVFBDb21tb25CbG9ja3NJbmNvbnNpc3QgKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIFVTRV9DSEVDS1NfQ09NTU9OICovCisKKyAgICB0dCA9ICYoX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF9wcmlfY29tbW9uLT5kYXRhWyBLTVBfSEFTSChwY19hZGRyKSBdKTsKKworI2lmZGVmIEtNUF9UQVNLX0NPTU1PTl9ERUJVRworICAgIGlmICgqdHQgIT0gMCkgeworICAgICAgICBLQ19UUkFDRSggMTAsICggIl9fa21wX3RocmVhZHByaXZhdGVfaW5zZXJ0OiBXQVJOSU5HISB0aHJlYWQjJWQ6IGNvbGxpc2lvbiBvbiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHBjX2FkZHIgKSApOworICAgIH0KKyNlbmRpZgorICAgIHRuLT5uZXh0ID0gKnR0OworICAgICp0dCA9IHRuOworCisjaWZkZWYgS01QX1RBU0tfQ09NTU9OX0RFQlVHCisgICAgS0NfVFJBQ0UoIDEwLCAoICJfX2ttcF90aHJlYWRwcml2YXRlX2luc2VydDogdGhyZWFkIyVkLCBpbnNlcnRlZCBub2RlICVwIG9uIGxpc3RcbiIsCisgICAgICAgICAgICAgICAgICAgIGd0aWQsIHBjX2FkZHIgKSApOworICAgIGR1bXBfbGlzdCggKTsKKyNlbmRpZgorCisgICAgLyogTGluayB0aGUgbm9kZSBpbnRvIGEgc2ltcGxlIGxpc3QgKi8KKworICAgIHRuLT5saW5rID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF9wcmlfaGVhZDsKKyAgICBfX2ttcF90aHJlYWRzWyBndGlkIF0tPnRoLnRoX3ByaV9oZWFkID0gdG47CisKKyNpZmRlZiBCVUlMRF9UVgorICAgIF9fa21wX3R2X3RocmVhZHByaXZhdGVfc3RvcmUoIF9fa21wX3RocmVhZHNbIGd0aWQgXSwgdG4tPmdibF9hZGRyLCB0bi0+cGFyX2FkZHIgKTsKKyNlbmRpZgorCisgICAgaWYoIChfX2ttcF9mb3JlaWduX3RwKSA/IChLTVBfSU5JVElBTF9HVElEIChndGlkKSkgOiAoS01QX1VCRVJfR1RJRCAoZ3RpZCkpICkKKyAgICAgICAgcmV0dXJuIHRuOworCisgICAgLyoKKyAgICAgKiBpZiBDKysgb2JqZWN0IHdpdGggY29weSBjb25zdHJ1Y3RvciwgdXNlIGl0OworICAgICAqIGVsc2UgaWYgQysrIG9iamVjdCB3aXRoIGNvbnN0cnVjdG9yLCB1c2UgaXQgZm9yIHRoZSBub24tbWFzdGVyIGNvcGllcyBvbmx5OworICAgICAqIGVsc2UgdXNlIHBvZF9pbml0IGFuZCBtZW1jcHkKKyAgICAgKgorICAgICAqIEMrKyBjb25zdHJ1Y3RvcnMgbmVlZCB0byBiZSBjYWxsZWQgb25jZSBmb3IgZWFjaCBub24tbWFzdGVyIHRocmVhZCBvbiBhbGxvY2F0ZQorICAgICAqIEMrKyBjb3B5IGNvbnN0cnVjdG9ycyBuZWVkIHRvIGJlIGNhbGxlZCBvbmNlIGZvciBlYWNoIHRocmVhZCBvbiBhbGxvY2F0ZQorICAgICAqLworCisgICAgLyoKKyAgICAgKiBDKysgb2JqZWN0IHdpdGggY29uc3RydWN0b3JzL2Rlc3RydWN0b3JzOworICAgICAqIGRvbid0IGNhbGwgY29uc3RydWN0b3JzIGZvciBtYXN0ZXIgdGhyZWFkIHRob3VnaAorICAgICAqLworICAgIGlmIChkX3RuLT5pc192ZWMpIHsKKyAgICAgICAgaWYgKCBkX3RuLT5jdC5jdG9ydiAhPSAwKSB7CisgICAgICAgICAgICAodm9pZCkgKCpkX3RuLT5jdC5jdG9ydikgKHRuLT5wYXJfYWRkciwgZF90bi0+dmVjX2xlbik7CisgICAgICAgIH0gZWxzZSBpZiAoZF90bi0+Y2N0LmNjdG9ydiAhPSAwKSB7CisgICAgICAgICAgICAodm9pZCkgKCpkX3RuLT5jY3QuY2N0b3J2KSAodG4tPnBhcl9hZGRyLCBkX3RuLT5vYmpfaW5pdCwgZF90bi0+dmVjX2xlbik7CisgICAgICAgIH0gZWxzZSBpZiAodG4tPnBhcl9hZGRyICE9IHRuLT5nYmxfYWRkcikgeworICAgICAgICAgICAgX19rbXBfY29weV9jb21tb25fZGF0YSggdG4tPnBhcl9hZGRyLCBkX3RuLT5wb2RfaW5pdCApOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCBkX3RuLT5jdC5jdG9yICE9IDAgKSB7CisgICAgICAgICAgICAodm9pZCkgKCpkX3RuLT5jdC5jdG9yKSAodG4tPnBhcl9hZGRyKTsKKyAgICAgICAgfSBlbHNlIGlmIChkX3RuLT5jY3QuY2N0b3IgIT0gMCkgeworICAgICAgICAgICAgKHZvaWQpICgqZF90bi0+Y2N0LmNjdG9yKSAodG4tPnBhcl9hZGRyLCBkX3RuLT5vYmpfaW5pdCk7CisgICAgICAgIH0gZWxzZSBpZiAodG4tPnBhcl9hZGRyICE9IHRuLT5nYmxfYWRkcikgeworICAgICAgICAgICAgX19rbXBfY29weV9jb21tb25fZGF0YSggdG4tPnBhcl9hZGRyLCBkX3RuLT5wb2RfaW5pdCApOworICAgICAgICB9CisgICAgfQorLyogIUJVSUxEX09QRU5NUF9DCisgICAgaWYgKHRuLT5wYXJfYWRkciAhPSB0bi0+Z2JsX2FkZHIpCisgICAgICAgIF9fa21wX2NvcHlfY29tbW9uX2RhdGEoIHRuLT5wYXJfYWRkciwgZF90bi0+cG9kX2luaXQgKTsgKi8KKworICAgIHJldHVybiB0bjsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBXZSBhcmUgY3VycmVudGx5IHBhcmFsbGVsLCBhbmQgd2Uga25vdyB0aGUgdGhyZWFkIGlkLiAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiEKKyBAaW5ncm91cCBUSFJFQURQUklWQVRFCisKKyBAcGFyYW0gbG9jIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiAKKyBAcGFyYW0gZGF0YSAgcG9pbnRlciB0byBkYXRhIGJlaW5nIHByaXZhdGl6ZWQgCisgQHBhcmFtIGN0b3IgIHBvaW50ZXIgdG8gY29uc3RydWN0b3IgZnVuY3Rpb24gZm9yIGRhdGEgCisgQHBhcmFtIGNjdG9yICBwb2ludGVyIHRvIGNvcHkgY29uc3RydWN0b3IgZnVuY3Rpb24gZm9yIGRhdGEgCisgQHBhcmFtIGR0b3IgIHBvaW50ZXIgdG8gZGVzdHJ1Y3RvciBmdW5jdGlvbiBmb3IgZGF0YSAKKworIFJlZ2lzdGVyIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgZm9yIHRocmVhZCBwcml2YXRlIGRhdGEuCisgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBleGVjdXRpbmcgaW4gcGFyYWxsZWwsIHdoZW4gd2Uga25vdyB0aGUgdGhyZWFkIGlkLgorKi8KK3ZvaWQKK19fa21wY190aHJlYWRwcml2YXRlX3JlZ2lzdGVyKGlkZW50X3QgKmxvYywgdm9pZCAqZGF0YSwga21wY19jdG9yIGN0b3IsIGttcGNfY2N0b3IgY2N0b3IsIGttcGNfZHRvciBkdG9yKQoreworICAgIHN0cnVjdCBzaGFyZWRfY29tbW9uICpkX3RuLCAqKmxua190bjsKKworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfdGhyZWFkcHJpdmF0ZV9yZWdpc3RlcjogY2FsbGVkXG4iICkgKTsKKworI2lmZGVmIFVTRV9DSEVDS1NfQ09NTU9OCisgICAgLyogY29weSBjb25zdHJ1Y3RvciBtdXN0IGJlIHplcm8gZm9yIGN1cnJlbnQgY29kZSBnZW4gKE5vdiAyMDAyIC0ganBoKSAqLworICAgIEtNUF9BU1NFUlQoIGNjdG9yID09IDApOworI2VuZGlmIC8qIFVTRV9DSEVDS1NfQ09NTU9OICovCisKKyAgICAvKiBPbmx5IHRoZSBnbG9iYWwgZGF0YSB0YWJsZSBleGlzdHMuICovCisgICAgZF90biA9IF9fa21wX2ZpbmRfc2hhcmVkX3Rhc2tfY29tbW9uKCAmX19rbXBfdGhyZWFkcHJpdmF0ZV9kX3RhYmxlLCAtMSwgZGF0YSApOworCisgICAgaWYgKGRfdG4gPT0gMCkgeworICAgICAgICBkX3RuID0gKHN0cnVjdCBzaGFyZWRfY29tbW9uICopIF9fa21wX2FsbG9jYXRlKCBzaXplb2YoIHN0cnVjdCBzaGFyZWRfY29tbW9uICkgKTsKKyAgICAgICAgZF90bi0+Z2JsX2FkZHIgPSBkYXRhOworCisgICAgICAgIGRfdG4tPmN0LmN0b3IgPSBjdG9yOworICAgICAgICBkX3RuLT5jY3QuY2N0b3IgPSBjY3RvcjsKKyAgICAgICAgZF90bi0+ZHQuZHRvciA9IGR0b3I7CisvKgorICAgICAgICBkX3RuLT5pc192ZWMgPSBGQUxTRTsgIC8vIEFDOiBjb21tZW50ZWQgb3V0IGJlY2F1c2UgX19rbXBfYWxsb2NhdGUgemVyb2VzIHRoZSBtZW1vcnkKKyAgICAgICAgZF90bi0+dmVjX2xlbiA9IDBMOworICAgICAgICBkX3RuLT5vYmpfaW5pdCA9IDA7CisgICAgICAgIGRfdG4tPnBvZF9pbml0ID0gMDsKKyovCisgICAgICAgIGxua190biA9ICYoX19rbXBfdGhyZWFkcHJpdmF0ZV9kX3RhYmxlLmRhdGFbIEtNUF9IQVNIKGRhdGEpIF0pOworCisgICAgICAgIGRfdG4tPm5leHQgPSAqbG5rX3RuOworICAgICAgICAqbG5rX3RuID0gZF90bjsKKyAgICB9Cit9CisKK3ZvaWQgKgorX19rbXBjX3RocmVhZHByaXZhdGUoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpCit7CisgICAgdm9pZCAqcmV0OworICAgIHN0cnVjdCBwcml2YXRlX2NvbW1vbiAqdG47CisKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX3RocmVhZHByaXZhdGU6IFQjJWQgY2FsbGVkXG4iLCBnbG9iYWxfdGlkICkgKTsKKworI2lmZGVmIFVTRV9DSEVDS1NfQ09NTU9OCisgICAgaWYgKCEgX19rbXBfaW5pdF9zZXJpYWwpCisgICAgICAgIEtNUF9GQVRBTCggUlRMTm90SW5pdGlhbGl6ZWQgKTsKKyNlbmRpZiAvKiBVU0VfQ0hFQ0tTX0NPTU1PTiAqLworCisgICAgaWYgKCAhIF9fa21wX3RocmVhZHNbZ2xvYmFsX3RpZF0gLT4gdGgudGhfcm9vdCAtPiByLnJfYWN0aXZlICYmICEgX19rbXBfZm9yZWlnbl90cCApIHsKKyAgICAgICAgLyogVGhlIHBhcmFsbGVsIGFkZHJlc3Mgd2lsbCBORVZFUiBvdmVybGFwIHdpdGggdGhlIGRhdGFfYWRkcmVzcyAqLworICAgICAgICAvKiBka3A6IDNyZCBhcmcgdG8ga21wX3RocmVhZHByaXZhdGVfaW5zZXJ0X3ByaXZhdGVfZGF0YSgpIGlzIHRoZSBkYXRhX2FkZHJlc3M7IHVzZSBkYXRhX2FkZHJlc3MgPSBkYXRhICovCisKKyAgICAgICAgS0NfVFJBQ0UoIDIwLCAoIl9fa21wY190aHJlYWRwcml2YXRlOiBUIyVkIGluc2VydGluZyBwcml2YXRlIGRhdGFcbiIsIGdsb2JhbF90aWQgKSApOworICAgICAgICBrbXBfdGhyZWFkcHJpdmF0ZV9pbnNlcnRfcHJpdmF0ZV9kYXRhKCBnbG9iYWxfdGlkLCBkYXRhLCBkYXRhLCBzaXplICk7CisKKyAgICAgICAgcmV0ID0gZGF0YTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEtDX1RSQUNFKCA1MCwgKCJfX2ttcGNfdGhyZWFkcHJpdmF0ZTogVCMlZCB0cnkgdG8gZmluZCBwcml2YXRlIGRhdGEgYXQgYWRkcmVzcyAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX3RpZCwgZGF0YSApICk7CisgICAgICAgIHRuID0gX19rbXBfdGhyZWFkcHJpdmF0ZV9maW5kX3Rhc2tfY29tbW9uKCBfX2ttcF90aHJlYWRzWyBnbG9iYWxfdGlkIF0tPnRoLnRoX3ByaV9jb21tb24sIGdsb2JhbF90aWQsIGRhdGEgKTsKKworICAgICAgICBpZiAoIHRuICkgeworICAgICAgICAgICAgS0NfVFJBQ0UoIDIwLCAoIl9fa21wY190aHJlYWRwcml2YXRlOiBUIyVkIGZvdW5kIGRhdGFcbiIsIGdsb2JhbF90aWQgKSApOworI2lmZGVmIFVTRV9DSEVDS1NfQ09NTU9OCisgICAgICAgICAgICBpZiAoKHNpemVfdCkgc2l6ZSA+IHRuLT5jbW5fc2l6ZSkgeworICAgICAgICAgICAgICAgIEtDX1RSQUNFKCAxMCwgKCAiVEhSRUFEUFJJVkFURTogJXAgKCUiIEtNUF9VSU5UUFRSX1NQRUMgIiAsJSIgS01QX1VJTlRQVFJfU1BFQyAiKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgc2l6ZSwgdG4tPmNtbl9zaXplICkgKTsKKyAgICAgICAgICAgICAgICBLTVBfRkFUQUwoIFRQQ29tbW9uQmxvY2tzSW5jb25zaXN0ICk7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogVVNFX0NIRUNLU19DT01NT04gKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8qIFRoZSBwYXJhbGxlbCBhZGRyZXNzIHdpbGwgTkVWRVIgb3ZlcmxhcCB3aXRoIHRoZSBkYXRhX2FkZHJlc3MgKi8KKyAgICAgICAgICAgIC8qIGRrcDogM3JkIGFyZyB0byBrbXBfdGhyZWFkcHJpdmF0ZV9pbnNlcnQoKSBpcyB0aGUgZGF0YV9hZGRyZXNzOyB1c2UgZGF0YV9hZGRyZXNzID0gZGF0YSAqLworICAgICAgICAgICAgS0NfVFJBQ0UoIDIwLCAoIl9fa21wY190aHJlYWRwcml2YXRlOiBUIyVkIGluc2VydGluZyBkYXRhXG4iLCBnbG9iYWxfdGlkICkgKTsKKyAgICAgICAgICAgIHRuID0ga21wX3RocmVhZHByaXZhdGVfaW5zZXJ0KCBnbG9iYWxfdGlkLCBkYXRhLCBkYXRhLCBzaXplICk7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSB0bi0+cGFyX2FkZHI7CisgICAgfQorICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfdGhyZWFkcHJpdmF0ZTogVCMlZCBleGl0aW5nOyByZXR1cm4gdmFsdWUgPSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICBnbG9iYWxfdGlkLCByZXQgKSApOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyohCisgQGluZ3JvdXAgVEhSRUFEUFJJVkFURQorIEBwYXJhbSBsb2Mgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uIAorIEBwYXJhbSBnbG9iYWxfdGlkICBnbG9iYWwgdGhyZWFkIG51bWJlciAKKyBAcGFyYW0gZGF0YSAgcG9pbnRlciB0byBkYXRhIHRvIHByaXZhdGl6ZSAKKyBAcGFyYW0gc2l6ZSAgc2l6ZSBvZiBkYXRhIHRvIHByaXZhdGl6ZSAKKyBAcGFyYW0gY2FjaGUgIHBvaW50ZXIgdG8gY2FjaGUgCisgQHJldHVybiBwb2ludGVyIHRvIHByaXZhdGUgc3RvcmFnZSAKKworIEFsbG9jYXRlIHByaXZhdGUgc3RvcmFnZSBmb3IgdGhyZWFkcHJpdmF0ZSBkYXRhLiAKKyovCit2b2lkICoKK19fa21wY190aHJlYWRwcml2YXRlX2NhY2hlZCgKKyAgICBpZGVudF90ICogIGxvYywKKyAgICBrbXBfaW50MzIgIGdsb2JhbF90aWQsICAgLy8gZ3RpZC4KKyAgICB2b2lkICogICAgIGRhdGEsICAgICAgICAgLy8gUG9pbnRlciB0byBvcmlnaW5hbCBnbG9iYWwgdmFyaWFibGUuCisgICAgc2l6ZV90ICAgICBzaXplLCAgICAgICAgIC8vIFNpemUgb2Ygb3JpZ2luYWwgZ2xvYmFsIHZhcmlhYmxlLgorICAgIHZvaWQgKioqICAgY2FjaGUKKykgeworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfdGhyZWFkcHJpdmF0ZV9jYWNoZWQ6IFQjJWQgY2FsbGVkIHdpdGggY2FjaGU6ICVwLCBhZGRyZXNzOiAlcCwgc2l6ZTogJSIKKyAgICAgICAgICAgICAgICAgICBLTVBfU0laRV9UX1NQRUMgIlxuIiwKKyAgICAgICAgICAgICAgICAgICBnbG9iYWxfdGlkLCAqY2FjaGUsIGRhdGEsIHNpemUgKSApOworCisgICAgaWYgKCBUQ1JfUFRSKCpjYWNoZSkgPT0gMCkgeworICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soICYgX19rbXBfZ2xvYmFsX2xvY2ssIGdsb2JhbF90aWQgKTsKKworICAgICAgICBpZiAoIFRDUl9QVFIoKmNhY2hlKSA9PSAwKSB7CisgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCZfX2ttcF90cF9jYWNoZWRfbG9jayk7CisgICAgICAgICAgICBfX2ttcF90cF9jYWNoZWQgPSAxOworICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jaygmX19rbXBfdHBfY2FjaGVkX2xvY2spOworICAgICAgICAgICAgdm9pZCAqKiBteV9jYWNoZTsKKyAgICAgICAgICAgIEtNUF9JVFRfSUdOT1JFKAorICAgICAgICAgICAgbXlfY2FjaGUgPSAodm9pZCoqKQorICAgICAgICAgICAgICAgIF9fa21wX2FsbG9jYXRlKHNpemVvZiggdm9pZCAqICkgKiBfX2ttcF90cF9jYXBhY2l0eSArIHNpemVvZiAoIGttcF9jYWNoZWRfYWRkcl90ICkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gemVybyB0aGUgYWxsb2NhdGVkIG1lbW9yeTsgX19rbXBfYWxsb2NhdGUgZG9lcyB0aGF0LgorICAgICAgICAgICAgS0NfVFJBQ0UoIDUwLCAoIl9fa21wY190aHJlYWRwcml2YXRlX2NhY2hlZDogVCMlZCBhbGxvY2F0ZWQgY2FjaGUgYXQgYWRkcmVzcyAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF90aWQsIG15X2NhY2hlICkgKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyogVE9ETzogZnJlZSBhbGwgdGhpcyBtZW1vcnkgaW4gX19rbXBfY29tbW9uX2Rlc3Ryb3kgdXNpbmcgX19rbXBfdGhyZWFkcHJpdl9jYWNoZV9saXN0ICovCisgICAgICAgICAgICAvKiBBZGQgYWRkcmVzcyBvZiBteWNhY2hlIHRvIGxpbmtlZCBsaXN0IGZvciBjbGVhbnVwIGxhdGVyICAqLworICAgICAgICAgICAga21wX2NhY2hlZF9hZGRyX3QgKnRwX2NhY2hlX2FkZHI7CisKKyAgICAgICAgICAgIHRwX2NhY2hlX2FkZHIgPSAoa21wX2NhY2hlZF9hZGRyX3QgKikgJiBteV9jYWNoZVtfX2ttcF90cF9jYXBhY2l0eV07CisgICAgICAgICAgICB0cF9jYWNoZV9hZGRyIC0+IGFkZHIgPSBteV9jYWNoZTsKKyAgICAgICAgICAgIHRwX2NhY2hlX2FkZHIgLT4gbmV4dCA9IF9fa21wX3RocmVhZHByaXZfY2FjaGVfbGlzdDsKKyAgICAgICAgICAgIF9fa21wX3RocmVhZHByaXZfY2FjaGVfbGlzdCA9IHRwX2NhY2hlX2FkZHI7CisKKyAgICAgICAgICAgIEtNUF9NQigpOworCisgICAgICAgICAgICBUQ1dfUFRSKCAqY2FjaGUsIG15X2NhY2hlKTsKKworICAgICAgICAgICAgS01QX01CKCk7CisgICAgICAgIH0KKworICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soICYgX19rbXBfZ2xvYmFsX2xvY2ssIGdsb2JhbF90aWQgKTsKKyAgICB9CisKKyAgICB2b2lkICpyZXQ7CisgICAgaWYgKChyZXQgPSBUQ1JfUFRSKCgqY2FjaGUpWyBnbG9iYWxfdGlkIF0pKSA9PSAwKSB7CisgICAgICAgIHJldCA9IF9fa21wY190aHJlYWRwcml2YXRlKCBsb2MsIGdsb2JhbF90aWQsIGRhdGEsIChzaXplX3QpIHNpemUpOworCisgICAgICAgIFRDV19QVFIoICgqY2FjaGUpWyBnbG9iYWxfdGlkIF0sIHJldCk7CisgICAgfQorICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfdGhyZWFkcHJpdmF0ZV9jYWNoZWQ6IFQjJWQgZXhpdGluZzsgcmV0dXJuIHZhbHVlID0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgZ2xvYmFsX3RpZCwgcmV0ICkgKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qIQorIEBpbmdyb3VwIFRIUkVBRFBSSVZBVEUKKyBAcGFyYW0gbG9jIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiAKKyBAcGFyYW0gZGF0YSAgcG9pbnRlciB0byBkYXRhIGJlaW5nIHByaXZhdGl6ZWQgCisgQHBhcmFtIGN0b3IgIHBvaW50ZXIgdG8gY29uc3RydWN0b3IgZnVuY3Rpb24gZm9yIGRhdGEgCisgQHBhcmFtIGNjdG9yICBwb2ludGVyIHRvIGNvcHkgY29uc3RydWN0b3IgZnVuY3Rpb24gZm9yIGRhdGEgCisgQHBhcmFtIGR0b3IgIHBvaW50ZXIgdG8gZGVzdHJ1Y3RvciBmdW5jdGlvbiBmb3IgZGF0YSAKKyBAcGFyYW0gdmVjdG9yX2xlbmd0aCBsZW5ndGggb2YgdGhlIHZlY3RvciAoYnl0ZXMgb3IgZWxlbWVudHM/KQorIFJlZ2lzdGVyIHZlY3RvciBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIGZvciB0aHJlYWQgcHJpdmF0ZSBkYXRhLgorKi8KK3ZvaWQKK19fa21wY190aHJlYWRwcml2YXRlX3JlZ2lzdGVyX3ZlYyggaWRlbnRfdCAqbG9jLCB2b2lkICpkYXRhLCBrbXBjX2N0b3JfdmVjIGN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcGNfY2N0b3JfdmVjIGNjdG9yLCBrbXBjX2R0b3JfdmVjIGR0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2ZWN0b3JfbGVuZ3RoICkKK3sKKyAgICBzdHJ1Y3Qgc2hhcmVkX2NvbW1vbiAqZF90biwgKipsbmtfdG47CisKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX3RocmVhZHByaXZhdGVfcmVnaXN0ZXJfdmVjOiBjYWxsZWRcbiIgKSApOworCisjaWZkZWYgVVNFX0NIRUNLU19DT01NT04KKyAgICAvKiBjb3B5IGNvbnN0cnVjdG9yIG11c3QgYmUgemVybyBmb3IgY3VycmVudCBjb2RlIGdlbiAoTm92IDIwMDIgLSBqcGgpICovCisgICAgS01QX0FTU0VSVCggY2N0b3IgPT0gMCk7CisjZW5kaWYgLyogVVNFX0NIRUNLU19DT01NT04gKi8KKworICAgIGRfdG4gPSBfX2ttcF9maW5kX3NoYXJlZF90YXNrX2NvbW1vbiggJl9fa21wX3RocmVhZHByaXZhdGVfZF90YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCBkYXRhICk7ICAgICAgICAvKiBPbmx5IHRoZSBnbG9iYWwgZGF0YSB0YWJsZSBleGlzdHMuICovCisKKyAgICBpZiAoZF90biA9PSAwKSB7CisgICAgICAgIGRfdG4gPSAoc3RydWN0IHNoYXJlZF9jb21tb24gKikgX19rbXBfYWxsb2NhdGUoIHNpemVvZiggc3RydWN0IHNoYXJlZF9jb21tb24gKSApOworICAgICAgICBkX3RuLT5nYmxfYWRkciA9IGRhdGE7CisKKyAgICAgICAgZF90bi0+Y3QuY3RvcnYgPSBjdG9yOworICAgICAgICBkX3RuLT5jY3QuY2N0b3J2ID0gY2N0b3I7CisgICAgICAgIGRfdG4tPmR0LmR0b3J2ID0gZHRvcjsKKyAgICAgICAgZF90bi0+aXNfdmVjID0gVFJVRTsKKyAgICAgICAgZF90bi0+dmVjX2xlbiA9IChzaXplX3QpIHZlY3Rvcl9sZW5ndGg7CisvKgorICAgICAgICBkX3RuLT5vYmpfaW5pdCA9IDA7ICAvLyBBQzogY29tbWVudGVkIG91dCBiZWNhdXNlIF9fa21wX2FsbG9jYXRlIHplcm9lcyB0aGUgbWVtb3J5CisgICAgICAgIGRfdG4tPnBvZF9pbml0ID0gMDsKKyovCisgICAgICAgIGxua190biA9ICYoX19rbXBfdGhyZWFkcHJpdmF0ZV9kX3RhYmxlLmRhdGFbIEtNUF9IQVNIKGRhdGEpIF0pOworCisgICAgICAgIGRfdG4tPm5leHQgPSAqbG5rX3RuOworICAgICAgICAqbG5rX3RuID0gZF90bjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfdXRpbGl0eS5jIGIvZmluYWwvcnVudGltZS9zcmMva21wX3V0aWxpdHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTlmMDdjCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX3V0aWxpdHkuYwpAQCAtMCwwICsxLDQzNiBAQAorLyoKKyAqIGttcF91dGlsaXR5LmMgLS0gVXRpbGl0eSByb3V0aW5lcyBmb3IgdGhlIE9wZW5NUCBzdXBwb3J0IGxpYnJhcnkuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfd3JhcHBlcl9nZXRwaWQuaCIKKyNpbmNsdWRlICJrbXBfc3RyLmgiCisjaW5jbHVkZSA8ZmxvYXQuaD4KKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgY29uc3QgY2hhciAqdW5rbm93biA9ICJ1bmtub3duIjsKKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworLyogTk9URTogSWYgY2FsbGVkIGJlZm9yZSBzZXJpYWxfaW5pdGlhbGl6ZSAoaS5lLiBmcm9tIHJ1bnRpbWVfaW5pdGlhbGl6ZSksIHRoZW4gKi8KKy8qIHRoZSBkZWJ1Z2dpbmcgcGFja2FnZSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0LCBhbmQgb25seSAiMCIgd2lsbCBwcmludCAgICovCisvKiBkZWJ1Z2dpbmcgb3V0cHV0IHNpbmNlIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgaGF2ZSBub3QgYmVlbiByZWFkLiAgICAgICAgICAqLworCisjaWZkZWYgS01QX0RFQlVHCitzdGF0aWMgaW50IHRyYWNlX2xldmVsID0gNTsKKyNlbmRpZgorCisvKgorICogTE9HX0lEX0JJVFMgID0gKCAxICsgZmxvb3IoIGxvZ18yKCBtYXgoIGxvZ19wZXJfcGh5IC0gMSwgMSApKSkpCisgKiBBUElDX0lEICAgICAgPSAoUEhZX0lEIDw8IExPR19JRF9CSVRTKSB8IExPR19JRAorICogUEhZX0lEICAgICAgID0gQVBJQ19JRCA+PiBMT0dfSURfQklUUworICovCitpbnQKK19fa21wX2dldF9waHlzaWNhbF9pZCggaW50IGxvZ19wZXJfcGh5LCBpbnQgYXBpY19pZCApCit7CisgICBpbnQgaW5kZXhfbHNiLCBpbmRleF9tc2IsIHRlbXA7CisKKyAgIGlmIChsb2dfcGVyX3BoeSA+IDEpIHsKKwlpbmRleF9sc2IgPSAwOworCWluZGV4X21zYiA9IDMxOworCisJdGVtcCA9IGxvZ19wZXJfcGh5OworICAgICAgICB3aGlsZSAoICh0ZW1wICYgMSkgPT0gMCApIHsKKwkgICAgdGVtcCAgPj49IDE7CisJICAgIGluZGV4X2xzYisrOworCX0KKworCXRlbXAgPSBsb2dfcGVyX3BoeTsKKwl3aGlsZSAoICh0ZW1wICYgMHg4MDAwMDAwMCk9PTAgKSB7CisJICAgIHRlbXAgPDw9IDE7CisJICAgIGluZGV4X21zYi0tOworCX0KKworCS8qIElmID4xIGJpdHMgd2VyZSBzZXQgaW4gbG9nX3Blcl9waHksIGNob29zZSBuZXh0IGhpZ2hlciBwb3dlciBvZiAyICovCisJaWYgKGluZGV4X2xzYiAhPSBpbmRleF9tc2IpIGluZGV4X21zYisrOworCisJcmV0dXJuICggKGludCkgKGFwaWNfaWQgPj4gaW5kZXhfbXNiKSApOworICAgfQorCisgICByZXR1cm4gYXBpY19pZDsKK30KKworCisvKgorICogTE9HX0lEX0JJVFMgID0gKCAxICsgZmxvb3IoIGxvZ18yKCBtYXgoIGxvZ19wZXJfcGh5IC0gMSwgMSApKSkpCisgKiBBUElDX0lEICAgICAgPSAoUEhZX0lEIDw8IExPR19JRF9CSVRTKSB8IExPR19JRAorICogTE9HX0lEICAgICAgID0gQVBJQ19JRCAmICgoIDEgPDwgTE9HX0lEX0JJVFMgKSAtIDEgKQorICovCitpbnQKK19fa21wX2dldF9sb2dpY2FsX2lkKCBpbnQgbG9nX3Blcl9waHksIGludCBhcGljX2lkICkKK3sKKyAgIHVuc2lnbmVkIGN1cnJlbnRfYml0OworICAgaW50IGJpdHNfc2VlbjsKKworICAgaWYgKGxvZ19wZXJfcGh5IDw9IDEpIHJldHVybiAoIDAgKTsKKworICAgYml0c19zZWVuID0gMDsKKworICAgZm9yIChjdXJyZW50X2JpdCA9IDE7IGxvZ19wZXJfcGh5ICE9IDA7IGN1cnJlbnRfYml0IDw8PSAxKSB7CisJaWYgKCBsb2dfcGVyX3BoeSAmIGN1cnJlbnRfYml0ICkgeworCSAgICBsb2dfcGVyX3BoeSAmPSB+Y3VycmVudF9iaXQ7CisJICAgIGJpdHNfc2VlbisrOworCX0KKyAgIH0KKworICAgLyogSWYgZXhhY3RseSAxIGJpdCB3YXMgc2V0IGluIGxvZ19wZXJfcGh5LCBjaG9vc2UgbmV4dCBsb3dlciBwb3dlciBvZiAyICovCisgICBpZiAoYml0c19zZWVuID09IDEpIHsKKwljdXJyZW50X2JpdCA+Pj0gMTsKKyAgIH0KKworICAgcmV0dXJuICggKGludCkgKChjdXJyZW50X2JpdCAtIDEpICYgYXBpY19pZCkgKTsKK30KKworCitzdGF0aWMKK2ttcF91aW50NjQKK19fa21wX3BhcnNlX2ZyZXF1ZW5jeSggICAgICAgIC8vIFI6IEZyZXF1ZW5jeSBpbiBIei4KKyAgICBjaGFyIGNvbnN0ICogZnJlcXVlbmN5ICAgIC8vIEk6IEZsb2F0IG51bWJlciBhbmQgdW5pdDogTUh6LCBHSHosIG9yIFRHei4KKykgeworCisgICAgZG91YmxlICAgICAgIHZhbHVlICA9IDAuMDsKKyAgICBjaGFyIGNvbnN0ICogdW5pdCAgID0gTlVMTDsKKyAgICBrbXBfdWludDY0ICAgcmVzdWx0ID0gfiAwOworCisgICAgaWYgKCBmcmVxdWVuY3kgPT0gTlVMTCApIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9OyAvLyBpZgorICAgIHZhbHVlID0gc3RydG9kKCBmcmVxdWVuY3ksIChjaGFyICogKikgJiB1bml0ICk7IC8vIHN0cnRvZCgpIGRvZXMgbm90IGxpa2UgImNoYXIgY29udHMgKiIuCisgICAgaWYgKCAwIDwgdmFsdWUgJiYgdmFsdWUgPD0gREJMX01BWCApIHsgICAgICAgICAgLy8gR29vZCB2YWx1ZSAobm90IG92ZXJmbG93LCB1bmRlcmZsb3csIGV0YykuCisgICAgICAgIGlmICggc3RyY21wKCB1bml0LCAiTUh6IiApID09IDAgKSB7CisgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlICogMS4wRSs2OworICAgICAgICB9IGVsc2UgaWYgKCBzdHJjbXAoIHVuaXQsICJHSHoiICkgPT0gMCApIHsKKyAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgKiAxLjBFKzk7CisgICAgICAgIH0gZWxzZSBpZiAoIHN0cmNtcCggdW5pdCwgIlRIeiIgKSA9PSAwICkgeworICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSAqIDEuMEUrMTI7CisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgIC8vIFdyb25nIHVuaXQuCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9OyAvLyBpZgorICAgICAgICByZXN1bHQgPSB2YWx1ZTsKKyAgICB9OyAvLyBpZgorICAgIHJldHVybiByZXN1bHQ7CisKK307IC8vIGZ1bmMgX19rbXBfcGFyc2VfY3B1X2ZyZXF1ZW5jeQorCit2b2lkCitfX2ttcF9xdWVyeV9jcHVpZCgga21wX2NwdWluZm9fdCAqcCApCit7CisgICAgc3RydWN0IGttcF9jcHVpZCBidWY7CisgICAgaW50IG1heF9hcmc7CisgICAgaW50IGxvZ19wZXJfcGh5OworI2lmZGVmIEtNUF9ERUJVRworICAgIGludCBjZmx1c2hfc2l6ZTsKKyNlbmRpZgorCisgICAgcC0+aW5pdGlhbGl6ZWQgPSAxOworCisgICAgcC0+c3NlMiA9IDE7IC8vIEFzc3VtZSBTU0UyIGJ5IGRlZmF1bHQuCisKKyAgICBfX2ttcF94ODZfY3B1aWQoIDAsIDAsICZidWYgKTsKKworICAgIEtBX1RSQUNFKCB0cmFjZV9sZXZlbCwgKCJJTkZPOiBDUFVJRCAlZDogRUFYPTB4JTA4WCBFQlg9MHglMDhYIEVDWD0weCUwOFggRURYPTB4JTA4WFxuIiwKKyAgICAgICAgMCwgYnVmLmVheCwgYnVmLmVieCwgYnVmLmVjeCwgYnVmLmVkeCApICk7CisKKyAgICBtYXhfYXJnID0gYnVmLmVheDsKKworICAgIHAtPmFwaWNfaWQgPSAtMTsKKworICAgIGlmIChtYXhfYXJnID49IDEpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGttcF91aW50MzIgdCwgZGF0YVsgNCBdOworCisgICAgICAgIF9fa21wX3g4Nl9jcHVpZCggMSwgMCwgJmJ1ZiApOworICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICgiSU5GTzogQ1BVSUQgJWQ6IEVBWD0weCUwOFggRUJYPTB4JTA4WCBFQ1g9MHglMDhYIEVEWD0weCUwOFhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIGJ1Zi5lYXgsIGJ1Zi5lYngsIGJ1Zi5lY3gsIGJ1Zi5lZHggKSApOworCisgICAgICAgIHsKKyNkZWZpbmUgZ2V0X3ZhbHVlKHJlZyxsbyxtYXNrKSAoICggKCByZWcgKSA+PiAoIGxvICkgKSAmICggbWFzayAgKSApCisKKyAgICAgICAgICAgIHAtPnNpZ25hdHVyZSA9IGJ1Zi5lYXg7CisgICAgICAgICAgICBwLT5mYW1pbHkgICAgPSAgIGdldF92YWx1ZSggYnVmLmVheCwgMjAsIDB4ZmYgKSAgICAgICAgKyBnZXRfdmFsdWUoIGJ1Zi5lYXgsIDgsIDB4MGYgKTsKKyAgICAgICAgICAgIHAtPm1vZGVsICAgICA9ICggZ2V0X3ZhbHVlKCBidWYuZWF4LCAxNiwgMHgwZiApIDw8IDQgKSArIGdldF92YWx1ZSggYnVmLmVheCwgNCwgMHgwZiApOworICAgICAgICAgICAgcC0+c3RlcHBpbmcgID0gICBnZXRfdmFsdWUoIGJ1Zi5lYXgsICAwLCAweDBmICk7CisKKyN1bmRlZiBnZXRfdmFsdWUKKworICAgICAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLCAoIiBmYW1pbHkgPSAlZCwgbW9kZWwgPSAlZCwgc3RlcHBpbmcgPSAlZFxuIiwgcC0+ZmFtaWx5LCBwLT5tb2RlbCwgcC0+c3RlcHBpbmcgKSApOworICAgICAgICB9CisKKyAgICAgICAgZm9yICggdCA9IGJ1Zi5lYngsIGkgPSAwOyBpIDwgNDsgdCA+Pj0gOCwgKytpICkgeworICAgICAgICAgICAgZGF0YVsgaSBdID0gKHQgJiAweGZmKTsKKyAgICAgICAgfTsgLy8gZm9yCisKKyAgICAgICAgcC0+c3NlMiA9ICggYnVmLmVkeCA+PiAyNiApICYgMTsKKworI2lmZGVmIEtNUF9ERUJVRworCisgICAgICAgIGlmICggKGJ1Zi5lZHggPj4gNCkgJiAxICkgeworICAgICAgICAgICAgLyogVFNDIC0gVGltZXN0YW1wIENvdW50ZXIgQXZhaWxhYmxlICovCisgICAgICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICgiIFRTQyIgKSApOworICAgICAgICB9CisgICAgICAgIGlmICggKGJ1Zi5lZHggPj4gOCkgJiAxICkgeworICAgICAgICAgICAgLyogQ1g4IC0gQ01QWENIRzhCIEluc3RydWN0aW9uIEF2YWlsYWJsZSAqLworICAgICAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLCAoIiBDWDgiICkgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIChidWYuZWR4ID4+IDkpICYgMSApIHsKKyAgICAgICAgICAgIC8qIEFQSUMgLSBMb2NhbCBBUElDIFByZXNlbnQgKG11bHRpLXByb2Nlc3NvciBvcGVyYXRpb24gc3VwcG9ydCAqLworICAgICAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLCAoIiBBUElDIiApICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAoYnVmLmVkeCA+PiAxNSkgJiAxICkgeworICAgICAgICAgICAgLyogQ01PViAtIENvbmRpdGlvbmFsIE1PVmUgSW5zdHJ1Y3Rpb24gQXZhaWxhYmxlICovCisgICAgICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICgiIENNT1YiICkgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIChidWYuZWR4ID4+IDE4KSAmIDEgKSB7CisgICAgICAgICAgICAvKiBQU04gLSBQcm9jZXNzb3IgU2VyaWFsIE51bWJlciBBdmFpbGFibGUgKi8KKyAgICAgICAgICAgIEtBX1RSQUNFKCB0cmFjZV9sZXZlbCwgKCIgUFNOIiApICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAoYnVmLmVkeCA+PiAxOSkgJiAxICkgeworICAgICAgICAgICAgLyogQ0xGVUxTSCAtIENhY2hlIEZsdXNoIEluc3RydWN0aW9uIEF2YWlsYWJsZSAqLworICAgICAgICAgICAgY2ZsdXNoX3NpemUgPSBkYXRhWyAxIF0gKiA4OyAgICAvKiBCaXRzIDE1LTA4OiBDTEZMVVNIIGxpbmUgc2l6ZSA9IDggKDY0IGJ5dGVzKSAqLworICAgICAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLCAoIiBDTEZMVVNIKCVkYikiLCBjZmx1c2hfc2l6ZSApICk7CisKKyAgICAgICAgfQorICAgICAgICBpZiAoIChidWYuZWR4ID4+IDIxKSAmIDEgKSB7CisgICAgICAgICAgICAvKiBEVEVTIC0gRGVidWcgVHJhY2UgJiBFTU9OIFN0b3JlICovCisgICAgICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICgiIERURVMiICkgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIChidWYuZWR4ID4+IDIyKSAmIDEgKSB7CisgICAgICAgICAgICAvKiBBQ1BJIC0gQUNQSSBTdXBwb3J0IEF2YWlsYWJsZSAqLworICAgICAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLCAoIiBBQ1BJIiApICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAoYnVmLmVkeCA+PiAyMykgJiAxICkgeworICAgICAgICAgICAgLyogTU1YIC0gTXVsdGltZWRpYSBFeHRlbnNpb25zICovCisgICAgICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICgiIE1NWCIgKSApOworICAgICAgICB9CisgICAgICAgIGlmICggKGJ1Zi5lZHggPj4gMjUpICYgMSApIHsKKyAgICAgICAgICAgIC8qIFNTRSAtIFNTRSBJbnN0cnVjdGlvbnMgKi8KKyAgICAgICAgICAgIEtBX1RSQUNFKCB0cmFjZV9sZXZlbCwgKCIgU1NFIiApICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAoYnVmLmVkeCA+PiAyNikgJiAxICkgeworICAgICAgICAgICAgLyogU1NFMiAtIFNTRTIgSW5zdHJ1Y3Rpb25zICovCisgICAgICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICgiIFNTRTIiICkgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIChidWYuZWR4ID4+IDI3KSAmIDEgKSB7CisgICAgICAgICAgICAvKiBTTEZTTlAgLSBTZWxmLVNub29waW5nIENhY2hlICovCisgICAgICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICgiIFNMRlNOUCIgKSApOworICAgICAgICB9CisjZW5kaWYgLyogS01QX0RFQlVHICovCisKKyAgICAgICAgaWYgKCAoYnVmLmVkeCA+PiAyOCkgJiAxICkgeworICAgICAgICAgICAgLyogQml0cyAyMy0xNjogTG9naWNhbCBQcm9jZXNzb3JzIHBlciBQaHlzaWNhbCBQcm9jZXNzb3IgKDEgZm9yIFA0KSAqLworICAgICAgICAgICAgbG9nX3Blcl9waHkgPSBkYXRhWyAyIF07CisgICAgICAgICAgICBwLT5hcGljX2lkICAgICA9IGRhdGFbIDMgXTsgLyogQml0cyAzMS0yNDogUHJvY2Vzc29yIEluaXRpYWwgQVBJQyBJRCAoWCkgKi8KKyAgICAgICAgICAgIEtBX1RSQUNFKCB0cmFjZV9sZXZlbCwgKCIgSFQoJWQgVFBVcykiLCBsb2dfcGVyX3BoeSApICk7CisKKyAgICAgICAgICAgIGlmKCBsb2dfcGVyX3BoeSA+IDEgKSB7CisgICAgICAgICAgICAgICAgLyogZGVmYXVsdCB0byAxayBGT1IgSlQtZW5hYmxlZCBwcm9jZXNzb3JzICg0ayBvbiBPUyBYKikgKi8KKyNpZiBLTVBfT1NfREFSV0lOCisgICAgICAgICAgICAgICAgcC0+Y3B1X3N0YWNrb2Zmc2V0ID0gNCAqIDEwMjQ7CisjZWxzZQorICAgICAgICAgICAgICAgIHAtPmNwdV9zdGFja29mZnNldCA9IDEgKiAxMDI0OworI2VuZGlmCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHAtPnBoeXNpY2FsX2lkID0gX19rbXBfZ2V0X3BoeXNpY2FsX2lkKCBsb2dfcGVyX3BoeSwgcC0+YXBpY19pZCApOworICAgICAgICAgICAgcC0+bG9naWNhbF9pZCAgPSBfX2ttcF9nZXRfbG9naWNhbF9pZCggbG9nX3Blcl9waHksIHAtPmFwaWNfaWQgKTsKKyAgICAgICAgfQorI2lmZGVmIEtNUF9ERUJVRworICAgICAgICBpZiAoIChidWYuZWR4ID4+IDI5KSAmIDEgKSB7CisgICAgICAgICAgICAvKiBBVEhST1RMIC0gQXV0b21hdGljIFRocm90dGxlIENvbnRyb2wgKi8KKyAgICAgICAgICAgIEtBX1RSQUNFKCB0cmFjZV9sZXZlbCwgKCIgQVRIUk9UTCIgKSApOworICAgICAgICB9CisgICAgICAgIEtBX1RSQUNFKCB0cmFjZV9sZXZlbCwgKCIgXVxuIiApICk7CisKKyAgICAgICAgZm9yIChpID0gMjsgaSA8PSBtYXhfYXJnOyArK2kpIHsKKyAgICAgICAgICAgIF9fa21wX3g4Nl9jcHVpZCggaSwgMCwgJmJ1ZiApOworICAgICAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICggIklORk86IENQVUlEICVkOiBFQVg9MHglMDhYIEVCWD0weCUwOFggRUNYPTB4JTA4WCBFRFg9MHglMDhYXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaSwgYnVmLmVheCwgYnVmLmVieCwgYnVmLmVjeCwgYnVmLmVkeCApICk7CisgICAgICAgIH0KKyNlbmRpZgorI2lmIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKyAgICAgICAgcC0+cnRtID0gMDsKKyAgICAgICAgaWYgKG1heF9hcmcgPiA3KQorICAgICAgICB7CisgICAgICAgICAgICAvKiBSVE0gYml0IENQVUlELjA3OkVCWCwgYml0IDExICovCisgICAgICAgICAgICBfX2ttcF94ODZfY3B1aWQoNywgMCwgJmJ1Zik7CisgICAgICAgICAgICBwLT5ydG0gPSAoYnVmLmVieCA+PiAxMSkgJiAxOworICAgICAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLCAoIiBSVE0iICkgKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfTsgLy8gaWYKKworICAgIHsgLy8gUGFyc2UgQ1BVIGJyYW5kIHN0cmluZyBmb3IgZnJlcXVlbmN5LgorCisgICAgICAgIHVuaW9uIGttcF9jcHVfYnJhbmRfc3RyaW5nIHsKKyAgICAgICAgICAgIHN0cnVjdCBrbXBfY3B1aWQgYnVmWyAzIF07CisgICAgICAgICAgICBjaGFyICAgICAgICAgICAgIHN0cmluZ1sgc2l6ZW9mKCBzdHJ1Y3Qga21wX2NwdWlkICkgKiAzICsgMSBdOworICAgICAgICB9OyAvLyB1bmlvbiBrbXBfY3B1X2JyYW5kX3N0cmluZworICAgICAgICB1bmlvbiBrbXBfY3B1X2JyYW5kX3N0cmluZyBicmFuZDsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgcC0+ZnJlcXVlbmN5ID0gMDsKKworICAgICAgICAvLyBHZXQgQ1BVIGJyYW5kIHN0cmluZy4KKyAgICAgICAgZm9yICggaSA9IDA7IGkgPCAzOyArKyBpICkgeworICAgICAgICAgICAgX19rbXBfeDg2X2NwdWlkKCAweDgwMDAwMDAyICsgaSwgMCwgJmJyYW5kLmJ1ZlsgaSBdICk7CisgICAgICAgIH07IC8vIGZvcgorICAgICAgICBicmFuZC5zdHJpbmdbIHNpemVvZiggYnJhbmQuc3RyaW5nICkgLSAxIF0gPSAwOyAvLyBKdXN0IGluIGNhc2UuIDstKQorICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICggImNwdSBicmFuZCBzdHJpbmc6IFwiJXNcIlxuIiwgYnJhbmQuc3RyaW5nICkgKTsKKworICAgICAgICAvLyBQYXJzZSBmcmVxdWVuY3kuCisgICAgICAgIHAtPmZyZXF1ZW5jeSA9IF9fa21wX3BhcnNlX2ZyZXF1ZW5jeSggc3RycmNociggYnJhbmQuc3RyaW5nLCAnICcgKSApOworICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICggImNwdSBmcmVxdWVuY3kgZnJvbSBicmFuZCBzdHJpbmc6ICUiIEtNUF9VSU5UNjRfU1BFQyAiXG4iLCBwLT5mcmVxdWVuY3kgKSApOworICAgIH0KK30KKworI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZAorX19rbXBfZXhwYW5kX2hvc3RfbmFtZSggY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVChzaXplID49IHNpemVvZih1bmtub3duKSk7CisjaWYgS01QX09TX1dJTkRPV1MKKyAgICB7CisJRFdPUkQJcyA9IHNpemU7CisKKwlpZiAoISBHZXRDb21wdXRlck5hbWVBKCBidWZmZXIsICYgcyApKQorCSAgICBLTVBfU1RSQ1BZX1MoIGJ1ZmZlciwgc2l6ZSwgdW5rbm93biApOworICAgIH0KKyNlbHNlCisgICAgYnVmZmVyW3NpemUgLSAyXSA9IDA7CisgICAgaWYgKGdldGhvc3RuYW1lKCBidWZmZXIsIHNpemUgKSB8fCBidWZmZXJbc2l6ZSAtIDJdICE9IDApCisJS01QX1NUUkNQWV9TKCBidWZmZXIsIHNpemUsIHVua25vd24gKTsKKyNlbmRpZgorfQorCisvKiBFeHBhbmQgdGhlIG1ldGEgY2hhcmFjdGVycyBpbiB0aGUgZmlsZW5hbWU6CisgKgorICogQ3VycmVudGx5IGRlZmluZWQgY2hhcmFjdGVycyBhcmU6CisgKgorICogJUggdGhlIGhvc3RuYW1lCisgKiAlUCB0aGUgbnVtYmVyIG9mIHRocmVhZHMgdXNlZC4KKyAqICVJIHRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBydW4uCisgKi8KKwordm9pZAorX19rbXBfZXhwYW5kX2ZpbGVfbmFtZSggY2hhciAqcmVzdWx0LCBzaXplX3QgcmxlbiwgY2hhciAqcGF0dGVybiApCit7CisgICAgY2hhcgkqcG9zID0gcmVzdWx0LCAqZW5kID0gcmVzdWx0ICsgcmxlbiAtIDE7CisgICAgY2hhcgkgYnVmZmVyWzI1Nl07CisgICAgaW50CQkgZGVmYXVsdF9jcHVfd2lkdGggPSAxOworICAgIGludCAgICAgICAgICBzbnBfcmVzdWx0OworCisgICAgS01QX0RFQlVHX0FTU0VSVChybGVuID4gMCk7CisgICAgKmVuZCA9IDA7CisgICAgeworCWludCBpOworCWZvcihpID0gX19rbXBfeHByb2M7IGkgPj0gMTA7IGkgLz0gMTAsICsrZGVmYXVsdF9jcHVfd2lkdGgpOworICAgIH0KKworICAgIGlmIChwYXR0ZXJuICE9IE5VTEwpIHsKKwl3aGlsZSAoKnBhdHRlcm4gIT0gJ1wwJyAmJiBwb3MgPCBlbmQpIHsKKwkgICAgaWYgKCpwYXR0ZXJuICE9ICclJykgeworCQkqcG9zKysgPSAqcGF0dGVybisrOworCSAgICB9IGVsc2UgeworCQljaGFyICpvbGRfcGF0dGVybiA9IHBhdHRlcm47CisJCWludCB3aWR0aCA9IDE7CisJCWludCBjcHVfd2lkdGggPSBkZWZhdWx0X2NwdV93aWR0aDsKKworCQkrK3BhdHRlcm47CisKKwkJaWYgKCpwYXR0ZXJuID49ICcwJyAmJiAqcGF0dGVybiA8PSAnOScpIHsKKwkJICAgIHdpZHRoID0gMDsKKwkJICAgIGRvIHsKKwkJCXdpZHRoID0gKHdpZHRoICogMTApICsgKnBhdHRlcm4rKyAtICcwJzsKKwkJICAgIH0gd2hpbGUgKCpwYXR0ZXJuID49ICcwJyAmJiAqcGF0dGVybiA8PSAnOScpOworCQkgICAgaWYgKHdpZHRoIDwgMCB8fCB3aWR0aCA+IDEwMjQpCisJCQl3aWR0aCA9IDE7CisKKwkJICAgIGNwdV93aWR0aCA9IHdpZHRoOworCQl9CisKKwkJc3dpdGNoICgqcGF0dGVybikgeworCQljYXNlICdIJzoKKwkJY2FzZSAnaCc6CisJCSAgICB7CisJCQlfX2ttcF9leHBhbmRfaG9zdF9uYW1lKCBidWZmZXIsIHNpemVvZiggYnVmZmVyICkgKTsKKwkJCUtNUF9TVFJOQ1BZKCBwb3MsICBidWZmZXIsIGVuZCAtIHBvcyArIDEpOworCQkJaWYoKmVuZCA9PSAwKSB7CisJCQkgICAgd2hpbGUgKCAqcG9zICkKKwkJCQkrK3BvczsKKwkJCSAgICArK3BhdHRlcm47CisJCQl9IGVsc2UKKwkJCSAgICBwb3MgPSBlbmQ7CisJCSAgICB9CisJCSAgICBicmVhazsKKwkJY2FzZSAnUCc6CisJCWNhc2UgJ3AnOgorCQkgICAgeworCQkJc25wX3Jlc3VsdCA9IEtNUF9TTlBSSU5URiggcG9zLCBlbmQgLSBwb3MgKyAxLCAiJTAqZCIsIGNwdV93aWR0aCwgX19rbXBfZGZsdF90ZWFtX250aCApOworCQkJaWYoc25wX3Jlc3VsdCA+PSAwICYmIHNucF9yZXN1bHQgPD0gZW5kIC0gcG9zKSB7CisJCQkgICAgd2hpbGUgKCAqcG9zICkKKwkJCQkrK3BvczsKKwkJCSAgICArK3BhdHRlcm47CisJCQl9IGVsc2UKKwkJCSAgICBwb3MgPSBlbmQ7CisJCSAgICB9CisJCSAgICBicmVhazsKKwkJY2FzZSAnSSc6CisJCWNhc2UgJ2knOgorCQkgICAgeworCQkJcGlkX3QgaWQgPSBnZXRwaWQoKTsKKwkJCXNucF9yZXN1bHQgPSBLTVBfU05QUklOVEYoIHBvcywgZW5kIC0gcG9zICsgMSwgIiUwKmQiLCB3aWR0aCwgaWQgKTsKKwkJCWlmKHNucF9yZXN1bHQgPj0gMCAmJiBzbnBfcmVzdWx0IDw9IGVuZCAtIHBvcykgeworCQkJICAgIHdoaWxlICggKnBvcyApCisJCQkJKytwb3M7CisJCQkgICAgKytwYXR0ZXJuOworCQkJfSBlbHNlCisJCQkgICAgcG9zID0gZW5kOworCQkJYnJlYWs7CisJCSAgICB9CisJCWNhc2UgJyUnOgorCQkgICAgeworCQkJKnBvcysrID0gJyUnOworCQkJKytwYXR0ZXJuOworCQkJYnJlYWs7CisJCSAgICB9CisJCWRlZmF1bHQ6CisJCSAgICB7CisJCQkqcG9zKysgPSAnJSc7CisJCQlwYXR0ZXJuID0gb2xkX3BhdHRlcm4gKyAxOworCQkJYnJlYWs7CisJCSAgICB9CisJCX0KKwkgICAgfQorCX0KKwkvKiBUT0RPOiBIb3cgZG8gd2UgZ2V0IHJpZCBvZiB0aGlzPyAqLworCWlmKCpwYXR0ZXJuICE9ICdcMCcpCisJICAgIEtNUF9GQVRBTCggRmlsZU5hbWVUb29Mb25nICk7CisgICAgfQorCisgICAgKnBvcyA9ICdcMCc7Cit9CisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF92ZXJzaW9uLmMgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfdmVyc2lvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyOGFhMDkKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfdmVyc2lvbi5jCkBAIC0wLDAgKzEsMjExIEBACisvKgorICoga21wX3ZlcnNpb24uYworICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2lvLmgiCisjaW5jbHVkZSAia21wX3ZlcnNpb24uaCIKKworLy8gUmVwbGFjZSB3aXRoIHNuYXBzaG90IGRhdGUgWVlZWU1NREQgZm9yIHByb21vdGlvbiBidWlsZC4KKyNkZWZpbmUgS01QX1ZFUlNJT05fQlVJTEQgICAgMjAxNDA5MjYKKworLy8gSGVscGVyIG1hY3JvcyB0byBjb252ZXJ0IHZhbHVlIG9mIG1hY3JvIHRvIHN0cmluZyBsaXRlcmFsLgorI2RlZmluZSBfc3RyaW5nZXIoIHggKSAjeAorI2RlZmluZSBzdHJpbmdlciggeCApICBfc3RyaW5nZXIoIHggKQorCisvLyBEZXRlY3QgY29tcGlsZXIuCisjaWYgS01QX0NPTVBJTEVSX0lDQworICAgICNpZiAgIF9fSU5URUxfQ09NUElMRVIgPT0gMTAxMAorICAgICAgICAjZGVmaW5lIEtNUF9DT01QSUxFUiAiSW50ZWwgQysrIENvbXBpbGVyIDEwLjEiCisgICAgI2VsaWYgX19JTlRFTF9DT01QSUxFUiA9PSAxMTAwCisgICAgICAgICNkZWZpbmUgS01QX0NPTVBJTEVSICJJbnRlbCBDKysgQ29tcGlsZXIgMTEuMCIKKyAgICAjZWxpZiBfX0lOVEVMX0NPTVBJTEVSID09IDExMTAKKyAgICAgICAgI2RlZmluZSBLTVBfQ09NUElMRVIgIkludGVsIEMrKyBDb21waWxlciAxMS4xIgorICAgICNlbGlmIF9fSU5URUxfQ09NUElMRVIgPT0gMTIwMAorICAgICAgICAjZGVmaW5lIEtNUF9DT01QSUxFUiAiSW50ZWwgQysrIENvbXBpbGVyIDEyLjAiCisgICAgI2VsaWYgX19JTlRFTF9DT01QSUxFUiA9PSAxMjEwCisgICAgICAgICNkZWZpbmUgS01QX0NPTVBJTEVSICJJbnRlbCBDKysgQ29tcGlsZXIgMTIuMSIKKyAgICAjZWxpZiBfX0lOVEVMX0NPTVBJTEVSID09IDEzMDAKKyAgICAgICAgI2RlZmluZSBLTVBfQ09NUElMRVIgIkludGVsIEMrKyBDb21waWxlciAxMy4wIgorICAgICNlbGlmIF9fSU5URUxfQ09NUElMRVIgPT0gMTMxMAorICAgICAgICAjZGVmaW5lIEtNUF9DT01QSUxFUiAiSW50ZWwgQysrIENvbXBpbGVyIDEzLjEiCisgICAgI2VsaWYgX19JTlRFTF9DT01QSUxFUiA9PSAxNDAwCisgICAgICAgICNkZWZpbmUgS01QX0NPTVBJTEVSICJJbnRlbCBDKysgQ29tcGlsZXIgMTQuMCIKKyAgICAjZWxpZiBfX0lOVEVMX0NPTVBJTEVSID09IDE0MTAKKyAgICAgICAgI2RlZmluZSBLTVBfQ09NUElMRVIgIkludGVsIEMrKyBDb21waWxlciAxNC4xIgorICAgICNlbGlmIF9fSU5URUxfQ09NUElMRVIgPT0gMTUwMAorICAgICAgICAjZGVmaW5lIEtNUF9DT01QSUxFUiAiSW50ZWwgQysrIENvbXBpbGVyIDE1LjAiCisgICAgI2VsaWYgX19JTlRFTF9DT01QSUxFUiA9PSAxNjAwCisgICAgICAgICNkZWZpbmUgS01QX0NPTVBJTEVSICJJbnRlbCBDKysgQ29tcGlsZXIgMTYuMCIKKyAgICAjZWxpZiBfX0lOVEVMX0NPTVBJTEVSID09IDk5OTkKKyAgICAgICAgI2RlZmluZSBLTVBfQ09NUElMRVIgIkludGVsIEMrKyBDb21waWxlciBtYWlubGluZSIKKyAgICAjZW5kaWYKKyNlbGlmIEtNUF9DT01QSUxFUl9DTEFORworICAgICNkZWZpbmUgS01QX0NPTVBJTEVSICJDbGFuZyAiIHN0cmluZ2VyKCBfX2NsYW5nX21ham9yX18gKSAiLiIgc3RyaW5nZXIoIF9fY2xhbmdfbWlub3JfXyApCisjZWxpZiBLTVBfQ09NUElMRVJfR0NDCisgICAgI2RlZmluZSBLTVBfQ09NUElMRVIgIkdDQyAiIHN0cmluZ2VyKCBfX0dOVUNfXyApICIuIiBzdHJpbmdlciggX19HTlVDX01JTk9SX18gKQorI2VsaWYgS01QX0NPTVBJTEVSX01TVkMKKyAgICAjZGVmaW5lIEtNUF9DT01QSUxFUiAiTVNWQyAiIHN0cmluZ2VyKCBfTVNDX0ZVTExfVkVSICkKKyNlbmRpZgorI2lmbmRlZiBLTVBfQ09NUElMRVIKKyAgICAjd2FybmluZyAiVW5rbm93biBjb21waWxlciIKKyAgICAjZGVmaW5lIEtNUF9DT01QSUxFUiAidW5rbm93biBjb21waWxlciIKKyNlbmRpZgorCisvLyBEZXRlY3QgbGlicnJheSB0eXBlIChwZXJmLCBzdHViKS4KKyNpZmRlZiBLTVBfU1RVQgorICAgICNkZWZpbmUgS01QX0xJQl9UWVBFICJzdHViIgorI2Vsc2UKKyAgICAjZGVmaW5lIEtNUF9MSUJfVFlQRSAicGVyZm9ybWFuY2UiCisjZW5kaWYgLy8gS01QX0xJQl9UWVBFCisKKy8vIERldGVjdCBsaW5rIHR5cGUgKHN0YXRpYywgZHluYW1pYykuCisjaWZkZWYgS01QX0RZTkFNSUNfTElCCisgICAgI2RlZmluZSBLTVBfTElOS19UWVBFICJkeW5hbWljIgorI2Vsc2UKKyAgICAjZGVmaW5lIEtNUF9MSU5LX1RZUEUgInN0YXRpYyIKKyNlbmRpZiAvLyBLTVBfTElOS19UWVBFCisKKy8vIEZpbmFsbHksIGRlZmluZSBzdHJpbmdzLgorI2RlZmluZSBLTVBfTElCUkFSWSAgIEtNUF9MSUJfVFlQRSAiIGxpYnJhcnkgKCIgS01QX0xJTktfVFlQRSAiKSIKKyNkZWZpbmUgS01QX0NPUFlSSUdIVCAiIgorCitpbnQgY29uc3QgX19rbXBfdmVyc2lvbl9tYWpvciA9IEtNUF9WRVJTSU9OX01BSk9SOworaW50IGNvbnN0IF9fa21wX3ZlcnNpb25fbWlub3IgPSBLTVBfVkVSU0lPTl9NSU5PUjsKK2ludCBjb25zdCBfX2ttcF92ZXJzaW9uX2J1aWxkID0gS01QX1ZFUlNJT05fQlVJTEQ7CitpbnQgY29uc3QgX19rbXBfb3Blbm1wX3ZlcnNpb24gPQorICAgICNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAyMDEzMDc7CisgICAgI2Vsc2UKKyAgICAgICAgMjAxMTA3OworICAgICNlbmRpZgorCisvKiBEbyBOT1QgY2hhbmdlIHRoZSBmb3JtYXQgb2YgdGhpcyBzdHJpbmchICBJbnRlbChSKSBUaHJlYWQgUHJvZmlsZXIgY2hlY2tzIGZvciBhCisgICBzcGVjaWZpYyBmb3JtYXQgc29tZSBjaGFuZ2VzIGluIHRoZSByZWNvZ25pdGlvbiByb3V0aW5lIHRoZXJlIG5lZWQgdG8KKyAgIGJlIG1hZGUgYmVmb3JlIHRoaXMgaXMgY2hhbmdlZC4KKyovCitjaGFyIGNvbnN0IF9fa21wX2NvcHlyaWdodFtdID0KKyAgICBLTVBfVkVSU0lPTl9QUkVGSVggS01QX0xJQlJBUlkKKyAgICAiIHZlci4gIiBzdHJpbmdlciggS01QX1ZFUlNJT05fTUFKT1IgKSAiLiIgc3RyaW5nZXIoIEtNUF9WRVJTSU9OX01JTk9SICkKKyAgICAiLiIgc3RyaW5nZXIoIEtNUF9WRVJTSU9OX0JVSUxEICkgIiAiCisgICAgS01QX0NPUFlSSUdIVDsKKworY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2NvcHlyaWdodFtdICAgICAgPSBLTVBfVkVSU0lPTl9QUkVGSVggS01QX0NPUFlSSUdIVDsKK2NoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9saWJfdmVyW10gICAgICAgID0gS01QX1ZFUlNJT05fUFJFRklYICJ2ZXJzaW9uOiAiIHN0cmluZ2VyKCBLTVBfVkVSU0lPTl9NQUpPUiApICIuIiBzdHJpbmdlciggS01QX1ZFUlNJT05fTUlOT1IgKSAiLiIgc3RyaW5nZXIoIEtNUF9WRVJTSU9OX0JVSUxEICk7CitjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fbGliX3R5cGVbXSAgICAgICA9IEtNUF9WRVJTSU9OX1BSRUZJWCAibGlicmFyeSB0eXBlOiAiIEtNUF9MSUJfVFlQRTsKK2NoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9saW5rX3R5cGVbXSAgICAgID0gS01QX1ZFUlNJT05fUFJFRklYICJsaW5rIHR5cGU6ICIgS01QX0xJTktfVFlQRTsKK2NoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9idWlsZF90aW1lW10gICAgID0gS01QX1ZFUlNJT05fUFJFRklYICJidWlsZCB0aW1lOiAiICJub190aW1lc3RhbXAiOworI2lmIEtNUF9NSUMyCisgICAgY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX3RhcmdldF9lbnZbXSA9IEtNUF9WRVJTSU9OX1BSRUZJWCAidGFyZ2V0IGVudmlyb25tZW50OiBNSUMyIjsKKyNlbmRpZgorY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2J1aWxkX2NvbXBpbGVyW10gPSBLTVBfVkVSU0lPTl9QUkVGSVggImJ1aWxkIGNvbXBpbGVyOiAiIEtNUF9DT01QSUxFUjsKKworLy8KKy8vIENhbGxlZCBhdCBzZXJpYWwgaW5pdGlhbGl6YXRpb24gdGltZS4KKy8vCitzdGF0aWMgaW50IF9fa21wX3ZlcnNpb25fMV9wcmludGVkID0gRkFMU0U7CisKK3ZvaWQKK19fa21wX3ByaW50X3ZlcnNpb25fMSggdm9pZCApCit7CisgICAgaWYgKCBfX2ttcF92ZXJzaW9uXzFfcHJpbnRlZCApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisgICAgX19rbXBfdmVyc2lvbl8xX3ByaW50ZWQgPSBUUlVFOworCisgICAgI2lmbmRlZiBLTVBfU1RVQgorICAgICAgICBrbXBfc3RyX2J1Zl90IGJ1ZmZlcjsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmIGJ1ZmZlciApOworICAgICAgICAvLyBQcmludCB2ZXJzaW9uIHN0cmluZ3Mgc2tpcHBpbmcgaW5pdGlhbCBtYWdpYy4KKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIlc1xuIiwgJiBfX2ttcF92ZXJzaW9uX2xpYl92ZXJbIEtNUF9WRVJTSU9OX01BR0lDX0xFTiBdICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiJXNcbiIsICYgX19rbXBfdmVyc2lvbl9saWJfdHlwZVsgS01QX1ZFUlNJT05fTUFHSUNfTEVOIF0gKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIlc1xuIiwgJiBfX2ttcF92ZXJzaW9uX2xpbmtfdHlwZVsgS01QX1ZFUlNJT05fTUFHSUNfTEVOIF0gKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIlc1xuIiwgJiBfX2ttcF92ZXJzaW9uX2J1aWxkX3RpbWVbIEtNUF9WRVJTSU9OX01BR0lDX0xFTiBdICk7CisgICAgICAjaWYgS01QX01JQworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIiVzXG4iLCAmIF9fa21wX3ZlcnNpb25fdGFyZ2V0X2VudlsgS01QX1ZFUlNJT05fTUFHSUNfTEVOIF0gKTsKKyAgICAgICNlbmRpZgorICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIiVzXG4iLCAmIF9fa21wX3ZlcnNpb25fYnVpbGRfY29tcGlsZXJbIEtNUF9WRVJTSU9OX01BR0lDX0xFTiBdICk7CisgICAgICAgICNpZiBkZWZpbmVkKEtNUF9HT01QX0NPTVBBVCkKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiJXNcbiIsICYgX19rbXBfdmVyc2lvbl9hbHRfY29tcFsgS01QX1ZFUlNJT05fTUFHSUNfTEVOIF0gKTsKKyAgICAgICAgI2VuZGlmIC8qIGRlZmluZWQoS01QX0dPTVBfQ09NUEFUKSAqLworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIiVzXG4iLCAmIF9fa21wX3ZlcnNpb25fb21wX2FwaVsgS01QX1ZFUlNJT05fTUFHSUNfTEVOIF0gKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIlc2R5bmFtaWMgZXJyb3IgY2hlY2tpbmc6ICVzXG4iLCBLTVBfVkVSU0lPTl9QUkVGX1NUUiwgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgPyAieWVzIiA6ICJubyIgKSAgKTsKKyAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgZm9yICggaW50IGkgPSBic19wbGFpbl9iYXJyaWVyOyBpIDwgYnNfbGFzdF9iYXJyaWVyOyArKyBpICkgeworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoCisgICAgICAgICAgICAgICAgICAgICYgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAiJXMlcyBiYXJyaWVyIGJyYW5jaCBiaXRzOiBnYXRoZXI9JXUsIHJlbGVhc2U9JXVcbiIsCisgICAgICAgICAgICAgICAgICAgIEtNUF9WRVJTSU9OX1BSRUZfU1RSLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX3R5cGVfbmFtZVsgaSBdLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX2dhdGhlcl9icmFuY2hfYml0c1sgaSBdLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHNbIGkgXQorICAgICAgICAgICAgICAgICk7IC8vIF9fa21wX3N0cl9idWZfcHJpbnQKKyAgICAgICAgICAgIH07IC8vIGZvciBpCisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IGJzX3BsYWluX2JhcnJpZXI7IGkgPCBic19sYXN0X2JhcnJpZXI7ICsrIGkgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgKKyAgICAgICAgICAgICAgICAgICAgJiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICIlcyVzIGJhcnJpZXIgcGF0dGVybjogZ2F0aGVyPSVzLCByZWxlYXNlPSVzXG4iLAorICAgICAgICAgICAgICAgICAgICBLTVBfVkVSU0lPTl9QUkVGX1NUUiwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfYmFycmllcl90eXBlX25hbWVbIGkgXSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfYmFycmllcl9wYXR0ZXJuX25hbWVbIF9fa21wX2JhcnJpZXJfZ2F0aGVyX3BhdHRlcm5bIGkgXSBdLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX3BhdHRlcm5fbmFtZVsgX19rbXBfYmFycmllcl9yZWxlYXNlX3BhdHRlcm5bIGkgXSBdCisgICAgICAgICAgICAgICAgKTsgLy8gX19rbXBfc3RyX2J1Zl9wcmludAorICAgICAgICAgICAgfTsgLy8gZm9yIGkKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiJXNcbiIsICYgX19rbXBfdmVyc2lvbl9sb2NrWyBLTVBfVkVSU0lPTl9NQUdJQ19MRU4gXSApOworICAgICAgICAjZW5kaWYKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgKKyAgICAgICAgICAgICYgYnVmZmVyLAorICAgICAgICAgICAgIiVzdGhyZWFkIGFmZmluaXR5IHN1cHBvcnQ6ICVzXG4iLAorICAgICAgICAgICAgS01QX1ZFUlNJT05fUFJFRl9TVFIsCisgICAgICAgICAgICAjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAgICAgS01QX0FGRklOSVRZX0NBUEFCTEUoKQorICAgICAgICAgICAgICAgICAgICA/CisgICAgICAgICAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgPworICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCB1c2VkIgorICAgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgICAgICAgICAgICAgInllcyIKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICAgICAgICAgICJubyIKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgICJubyIKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICApOworICAgICAgICBfX2ttcF9wcmludGYoICIlcyIsIGJ1ZmZlci5zdHIgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIGJ1ZmZlciApOworICAgICAgICBLX0RJQUcoIDEsICggIktNUF9WRVJTSU9OIGlzIHRydWVcbiIgKSApOworICAgICNlbmRpZiAvLyBLTVBfU1RVQgorfSAvLyBfX2ttcF9wcmludF92ZXJzaW9uXzEKKworLy8KKy8vIENhbGxlZCBhdCBwYXJhbGxlbCBpbml0aWFsaXphdGlvbiB0aW1lLgorLy8KK3N0YXRpYyBpbnQgX19rbXBfdmVyc2lvbl8yX3ByaW50ZWQgPSBGQUxTRTsKKwordm9pZAorX19rbXBfcHJpbnRfdmVyc2lvbl8yKCB2b2lkICkgeworICAgIGlmICggX19rbXBfdmVyc2lvbl8yX3ByaW50ZWQgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9OyAvLyBpZgorICAgIF9fa21wX3ZlcnNpb25fMl9wcmludGVkID0gVFJVRTsKKworICAgICNpZm5kZWYgS01QX1NUVUIKKyAgICAjZW5kaWYgLy8gS01QX1NUVUIKK30gLy8gX19rbXBfcHJpbnRfdmVyc2lvbl8yCisKKy8vIGVuZCBvZiBmaWxlIC8vCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfdmVyc2lvbi5oIGIvZmluYWwvcnVudGltZS9zcmMva21wX3ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTI4NTNiCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX3ZlcnNpb24uaApAQCAtMCwwICsxLDY4IEBACisvKgorICoga21wX3ZlcnNpb24uaCAtLSB2ZXJzaW9uIG51bWJlciBmb3IgdGhpcyByZWxlYXNlCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX1ZFUlNJT05fSAorI2RlZmluZSBLTVBfVkVSU0lPTl9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIGV4dGVybiAiQyIgeworI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKyNpZm5kZWYgS01QX1ZFUlNJT05fTUFKT1IKKyAgICAjZXJyb3IgS01QX1ZFUlNJT05fTUFKT1IgbWFjcm8gaXMgbm90IGRlZmluZWQuCisjZW5kaWYKKyNkZWZpbmUgS01QX1ZFUlNJT05fTUlOT1IgICAgICAgMAorLyoKKyAgICBVc2luZyAibWFnaWMiIHByZWZpeCBpbiBhbGwgdGhlIHZlcnNpb24gc3RyaW5ncyBpcyByYXRoZXIgY29udmVuaWVudCB0byBnZXQgc3RhdGljIHZlcnNpb24gaW5mbworICAgIGZyb20gYmluYXJpZXMgYnkgdXNpbmcgc3RhbmRhcmQgdXRpbGl0aWVzICJzdHJpbmdzIiBhbmQgImdyZXAiLCBlLiBnLjoKKyAgICAgICAgJCBzdHJpbmdzIGxpYm9tcC5zbyB8IGdyZXAgIkAoIykiCisgICAgZ2l2ZXMgY2xlYW4gbGlzdCBvZiBhbGwgdmVyc2lvbiBzdHJpbmdzIGluIHRoZSBsaWJyYXJ5LiBMZWFkaW5nIHplcm8gaGVscHMgdG8ga2VlcCB2ZXJzaW9uCisgICAgc3RyaW5nIHNlcGFyYXRlIGZyb20gcHJpbnRhYmxlIGNoYXJhY3RlcnMgd2hpY2ggbWF5IG9jY3VycyBqdXN0IGJlZm9yZSB2ZXJzaW9uIHN0cmluZy4KKyovCisjZGVmaW5lIEtNUF9WRVJTSU9OX01BR0lDX1NUUiAgICJceDAwQCgjKSAiCisjZGVmaW5lIEtNUF9WRVJTSU9OX01BR0lDX0xFTiAgIDYgICAgICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIEtNUF9WRVJTSU9OX01BR0lDX1NUUi4KKyNkZWZpbmUgS01QX1ZFUlNJT05fUFJFRl9TVFIgICAgIkludGVsKFIpIE9NUCAiCisjZGVmaW5lIEtNUF9WRVJTSU9OX1BSRUZJWCAgICAgIEtNUF9WRVJTSU9OX01BR0lDX1NUUiBLTVBfVkVSU0lPTl9QUkVGX1NUUgorCisvKiBkZWNsYXJlIGFsbCB0aGUgdmVyc2lvbiBzdHJpbmcgY29uc3RhbnRzIGZvciBLTVBfVkVSU0lPTiBlbnYuIHZhcmlhYmxlICovCitleHRlcm4gaW50ICBjb25zdCBfX2ttcF92ZXJzaW9uX21ham9yOworZXh0ZXJuIGludCAgY29uc3QgX19rbXBfdmVyc2lvbl9taW5vcjsKK2V4dGVybiBpbnQgIGNvbnN0IF9fa21wX3ZlcnNpb25fYnVpbGQ7CitleHRlcm4gaW50ICBjb25zdCBfX2ttcF9vcGVubXBfdmVyc2lvbjsKK2V4dGVybiBjaGFyIGNvbnN0IF9fa21wX2NvcHlyaWdodFtdOyAgICAvLyBPbGQgdmFyaWFibGUsIGtlcHQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBJVEMgYW5kIElUUC4KK2V4dGVybiBjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fY29weXJpZ2h0W107CitleHRlcm4gY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2xpYl92ZXJbXTsKK2V4dGVybiBjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fbGliX3R5cGVbXTsKK2V4dGVybiBjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fbGlua190eXBlW107CitleHRlcm4gY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2J1aWxkX3RpbWVbXTsKK2V4dGVybiBjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fdGFyZ2V0X2VudltdOworZXh0ZXJuIGNoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9idWlsZF9jb21waWxlcltdOworZXh0ZXJuIGNoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9hbHRfY29tcFtdOworZXh0ZXJuIGNoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9vbXBfYXBpW107CisvLyA/Pz8gZXh0ZXJuIGNoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9kZWJ1Z1tdOworZXh0ZXJuIGNoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9sb2NrW107CitleHRlcm4gY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX25lc3RlZF9zdGF0c19yZXBvcnRpbmdbXTsKK2V4dGVybiBjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fZnRuc3RkY2FsbFtdOworZXh0ZXJuIGNoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9mdG5jZGVjbFtdOworZXh0ZXJuIGNoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9mdG5leHRyYVtdOworCit2b2lkIF9fa21wX3ByaW50X3ZlcnNpb25fMSggdm9pZCApOwordm9pZCBfX2ttcF9wcmludF92ZXJzaW9uXzIoIHZvaWQgKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgfSAvLyBleHRlcm4gIkMiCisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworI2VuZGlmIC8qIEtNUF9WRVJTSU9OX0ggKi8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF93YWl0X3JlbGVhc2UuY3BwIGIvZmluYWwvcnVudGltZS9zcmMva21wX3dhaXRfcmVsZWFzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg2NWJmNgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF93YWl0X3JlbGVhc2UuY3BwCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBrbXBfd2FpdF9yZWxlYXNlLmNwcCAtLSBXYWl0L1JlbGVhc2UgaW1wbGVtZW50YXRpb24KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJrbXBfd2FpdF9yZWxlYXNlLmgiCisKK3ZvaWQgX19rbXBfd2FpdF8zMihrbXBfaW5mb190ICp0aGlzX3Rociwga21wX2ZsYWdfMzIgKmZsYWcsIGludCBmaW5hbF9zcGluCisgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqIGl0dF9zeW5jX29iaikgKQoreworICAgIF9fa21wX3dhaXRfdGVtcGxhdGUodGhpc190aHIsIGZsYWcsIGZpbmFsX3NwaW4KKyAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKK30KKwordm9pZCBfX2ttcF93YWl0XzY0KGttcF9pbmZvX3QgKnRoaXNfdGhyLCBrbXBfZmxhZ182NCAqZmxhZywgaW50IGZpbmFsX3NwaW4KKyAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyh2b2lkICogaXR0X3N5bmNfb2JqKSApCit7CisgICAgX19rbXBfd2FpdF90ZW1wbGF0ZSh0aGlzX3RociwgZmxhZywgZmluYWxfc3BpbgorICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworfQorCit2b2lkIF9fa21wX3dhaXRfb25jb3JlKGttcF9pbmZvX3QgKnRoaXNfdGhyLCBrbXBfZmxhZ19vbmNvcmUgKmZsYWcsIGludCBmaW5hbF9zcGluCisgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKHZvaWQgKiBpdHRfc3luY19vYmopICkKK3sKKyAgICBfX2ttcF93YWl0X3RlbXBsYXRlKHRoaXNfdGhyLCBmbGFnLCBmaW5hbF9zcGluCisgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopICk7Cit9CisKKworCit2b2lkIF9fa21wX3JlbGVhc2VfMzIoa21wX2ZsYWdfMzIgKmZsYWcpIHsKKyAgICBfX2ttcF9yZWxlYXNlX3RlbXBsYXRlKGZsYWcpOworfQorCit2b2lkIF9fa21wX3JlbGVhc2VfNjQoa21wX2ZsYWdfNjQgKmZsYWcpIHsKKyAgICBfX2ttcF9yZWxlYXNlX3RlbXBsYXRlKGZsYWcpOworfQorCit2b2lkIF9fa21wX3JlbGVhc2Vfb25jb3JlKGttcF9mbGFnX29uY29yZSAqZmxhZykgeworICAgIF9fa21wX3JlbGVhc2VfdGVtcGxhdGUoZmxhZyk7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfd2FpdF9yZWxlYXNlLmggYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfd2FpdF9yZWxlYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMwMjYwNwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF93YWl0X3JlbGVhc2UuaApAQCAtMCwwICsxLDU2NiBAQAorLyoKKyAqIGttcF93YWl0X3JlbGVhc2UuaCAtLSBXYWl0L1JlbGVhc2UgaW1wbGVtZW50YXRpb24KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBLTVBfV0FJVF9SRUxFQVNFX0gKKyNkZWZpbmUgS01QX1dBSVRfUkVMRUFTRV9ICisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfaXR0LmgiCisKKy8qIQorQGRlZmdyb3VwIFdBSVRfUkVMRUFTRSBXYWl0L1JlbGVhc2Ugb3BlcmF0aW9ucworCitUaGUgZGVmaW5pdGlvbnMgYW5kIGZ1bmN0aW9ucyBoZXJlIGltcGxlbWVudCB0aGUgbG93ZXN0IGxldmVsIHRocmVhZAorc3luY2hyb25pemF0aW9ucyBvZiBzdXNwZW5kaW5nIGEgdGhyZWFkIGFuZCBhd2FraW5nIGl0LiBUaGV5IGFyZSB1c2VkCit0byBidWlsZCBoaWdoZXIgbGV2ZWwgb3BlcmF0aW9ucyBzdWNoIGFzIGJhcnJpZXJzIGFuZCBmb3JrL2pvaW4uCisqLworCisvKiEKK0Bpbmdyb3VwIFdBSVRfUkVMRUFTRQorQHsKKyovCisKKy8qISAKKyAqIFRoZSBmbGFnX3R5cGUgZGVzY3JpYmVzIHRoZSBzdG9yYWdlIHVzZWQgZm9yIHRoZSBmbGFnLgorICovCitlbnVtIGZsYWdfdHlwZSB7CisgICAgZmxhZzMyLCAgICAgICAgLyoqPCAzMiBiaXQgZmxhZ3MgKi8KKyAgICBmbGFnNjQsICAgICAgICAvKio8IDY0IGJpdCBmbGFncyAqLworICAgIGZsYWdfb25jb3JlICAgIC8qKjwgc3BlY2lhbCA2NC1iaXQgZmxhZyBmb3Igb24tY29yZSBiYXJyaWVyIChoaWVyYXJjaGljYWwpICovCit9OworCisvKiEKKyAqIEJhc2UgY2xhc3MgZm9yIHdhaXQvcmVsZWFzZSB2b2xhdGlsZSBmbGFnCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBQPgorY2xhc3Mga21wX2ZsYWcgeworICAgIHZvbGF0aWxlIFAgKiBsb2M7ICAvKio8IFBvaW50ZXIgdG8gdGhlIGZsYWcgc3RvcmFnZSB0aGF0IGlzIG1vZGlmaWVkIGJ5IGFub3RoZXIgdGhyZWFkICovCisgICAgZmxhZ190eXBlIHQ7ICAgICAgIC8qKjwgIlR5cGUiIG9mIHRoZSBmbGFnIGluIGxvYyAqLworIHB1YmxpYzoKKyAgICB0eXBlZGVmIFAgZmxhZ190OworICAgIGttcF9mbGFnKHZvbGF0aWxlIFAgKnAsIGZsYWdfdHlwZSBmdCkgOiBsb2MocCksIHQoZnQpIHt9CisgICAgLyohCisgICAgICogQHJlc3VsdCB0aGUgcG9pbnRlciB0byB0aGUgYWN0dWFsIGZsYWcKKyAgICAgKi8KKyAgICB2b2xhdGlsZSBQICogZ2V0KCkgeyByZXR1cm4gbG9jOyB9CisgICAgLyohCisgICAgICogQHBhcmFtIG5ld19sb2MgaW4gICBzZXQgbG9jIHRvIHBvaW50IGF0IG5ld19sb2MKKyAgICAgKi8KKyAgICB2b2lkIHNldCh2b2xhdGlsZSBQICpuZXdfbG9jKSB7IGxvYyA9IG5ld19sb2M7IH0KKyAgICAvKiEKKyAgICAgKiBAcmVzdWx0IHRoZSBmbGFnX3R5cGUKKyAgICAgKi8KKyAgICBmbGFnX3R5cGUgZ2V0X3R5cGUoKSB7IHJldHVybiB0OyB9CisgICAgLy8gRGVyaXZlZCBjbGFzc2VzIG11c3QgcHJvdmlkZSB0aGUgZm9sbG93aW5nOgorICAgIC8qCisgICAga21wX2luZm9fdCAqIGdldF93YWl0ZXIoa21wX3VpbnQzMiBpKTsKKyAgICBrbXBfdWludDMyIGdldF9udW1fd2FpdGVycygpOworICAgIGJvb2wgZG9uZV9jaGVjaygpOworICAgIGJvb2wgZG9uZV9jaGVja192YWwoUCBvbGRfbG9jKTsKKyAgICBib29sIG5vdGRvbmVfY2hlY2soKTsKKyAgICBQIGludGVybmFsX3JlbGVhc2UoKTsKKyAgICB2b2lkIHN1c3BlbmQoaW50IHRoX2d0aWQpOworICAgIHZvaWQgcmVzdW1lKGludCB0aF9ndGlkKTsKKyAgICBQIHNldF9zbGVlcGluZygpOworICAgIFAgdW5zZXRfc2xlZXBpbmcoKTsKKyAgICBib29sIGlzX3NsZWVwaW5nKCk7CisgICAgYm9vbCBpc19hbnlfc2xlZXBpbmcoKTsKKyAgICBib29sIGlzX3NsZWVwaW5nX3ZhbChQIG9sZF9sb2MpOworICAgIGludCBleGVjdXRlX3Rhc2tzKGttcF9pbmZvX3QgKnRoaXNfdGhyLCBrbXBfaW50MzIgZ3RpZCwgaW50IGZpbmFsX3NwaW4sIGludCAqdGhyZWFkX2ZpbmlzaGVkCisgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqIGl0dF9zeW5jX29iaiksIGttcF9pbnQzMiBpc19jb25zdHJhaW5lZCk7CisgICAgKi8KK307CisKKy8qIFNwaW4gd2FpdCBsb29wIHRoYXQgZmlyc3QgZG9lcyBwYXVzZSwgdGhlbiB5aWVsZCwgdGhlbiBzbGVlcC4gQSB0aHJlYWQgdGhhdCBjYWxscyBfX2ttcF93YWl0XyoKKyAgIG11c3QgbWFrZSBjZXJ0YWluIHRoYXQgYW5vdGhlciB0aHJlYWQgY2FsbHMgX19rbXBfcmVsZWFzZSB0byB3YWtlIGl0IGJhY2sgdXAgdG8gcHJldmVudCBkZWFkbG9ja3MhICAqLwordGVtcGxhdGUgPGNsYXNzIEM+CitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX3dhaXRfdGVtcGxhdGUoa21wX2luZm9fdCAqdGhpc190aHIsIEMgKmZsYWcsIGludCBmaW5hbF9zcGluCisgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKHZvaWQgKiBpdHRfc3luY19vYmopICkKK3sKKyAgICAvLyBOT1RFOiBXZSBtYXkgbm90IGJlbG9uZyB0byBhIHRlYW0gYXQgdGhpcyBwb2ludC4KKyAgICB2b2xhdGlsZSB0eXBlbmFtZSBDOjpmbGFnX3QgKnNwaW4gPSBmbGFnLT5nZXQoKTsKKyAgICBrbXBfdWludDMyIHNwaW5zOworICAgIGttcF91aW50MzIgaGliZXJuYXRlOworICAgIGludCB0aF9ndGlkOworICAgIGludCB0YXNrc19jb21wbGV0ZWQgPSBGQUxTRTsKKworICAgIEtNUF9GU1lOQ19TUElOX0lOSVQoc3BpbiwgTlVMTCk7CisgICAgaWYgKGZsYWctPmRvbmVfY2hlY2soKSkgeworICAgICAgICBLTVBfRlNZTkNfU1BJTl9BQ1FVSVJFRChzcGluKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB0aF9ndGlkID0gdGhpc190aHItPnRoLnRoX2luZm8uZHMuZHNfZ3RpZDsKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF93YWl0X3NsZWVwOiBUIyVkIHdhaXRpbmcgZm9yIGZsYWcoJXApXG4iLCB0aF9ndGlkLCBmbGFnKSk7CisKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9CTEFNRQorICAgIG9tcHRfc3RhdGVfdCBvbXB0X3N0YXRlID0gdGhpc190aHItPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGU7CisgICAgaWYgKG9tcHRfZW5hYmxlZCAmJgorICAgICAgICBvbXB0X3N0YXRlICE9IG9tcHRfc3RhdGVfdW5kZWZpbmVkKSB7CisgICAgICAgIGlmIChvbXB0X3N0YXRlID09IG9tcHRfc3RhdGVfaWRsZSkgeworICAgICAgICAgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pZGxlX2JlZ2luKSkgeworICAgICAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pZGxlX2JlZ2luKSh0aF9ndGlkICsgMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3dhaXRfYmFycmllcl9iZWdpbikpIHsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQob21wdF9zdGF0ZSA9PSBvbXB0X3N0YXRlX3dhaXRfYmFycmllciB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbXB0X3N0YXRlID09IG9tcHRfc3RhdGVfd2FpdF9iYXJyaWVyX2ltcGxpY2l0IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9tcHRfc3RhdGUgPT0gb21wdF9zdGF0ZV93YWl0X2JhcnJpZXJfZXhwbGljaXQpOworCisgICAgICAgICAgICBvbXB0X2x3X3Rhc2t0ZWFtX3QqIHRlYW0gPSB0aGlzX3Roci0+dGgudGhfdGVhbS0+dC5vbXB0X3NlcmlhbGl6ZWRfdGVhbV9pbmZvOworICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9pZF90IHBJZDsKKyAgICAgICAgICAgIG9tcHRfdGFza19pZF90IHRJZDsKKyAgICAgICAgICAgIGlmICh0ZWFtKXsKKyAgICAgICAgICAgICAgICBwSWQgPSB0ZWFtLT5vbXB0X3RlYW1faW5mby5wYXJhbGxlbF9pZDsKKyAgICAgICAgICAgICAgICB0SWQgPSB0ZWFtLT5vbXB0X3Rhc2tfaW5mby50YXNrX2lkOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwSWQgPSB0aGlzX3Roci0+dGgudGhfdGVhbS0+dC5vbXB0X3RlYW1faW5mby5wYXJhbGxlbF9pZDsKKyAgICAgICAgICAgICAgICB0SWQgPSB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrLT5vbXB0X3Rhc2tfaW5mby50YXNrX2lkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3dhaXRfYmFycmllcl9iZWdpbikocElkLCB0SWQpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICAvLyBTZXR1cCBmb3Igd2FpdGluZworICAgIEtNUF9JTklUX1lJRUxEKHNwaW5zKTsKKworICAgIGlmIChfX2ttcF9kZmx0X2Jsb2NrdGltZSAhPSBLTVBfTUFYX0JMT0NLVElNRSkgeworICAgICAgICAvLyBUaGUgd29ya2VyIHRocmVhZHMgY2Fubm90IHJlbHkgb24gdGhlIHRlYW0gc3RydWN0IGV4aXN0aW5nIGF0IHRoaXMgcG9pbnQuCisgICAgICAgIC8vIFVzZSB0aGUgYnQgdmFsdWVzIGNhY2hlZCBpbiB0aGUgdGhyZWFkIHN0cnVjdCBpbnN0ZWFkLgorI2lmZGVmIEtNUF9BREpVU1RfQkxPQ0tUSU1FCisgICAgICAgIGlmIChfX2ttcF96ZXJvX2J0ICYmICF0aGlzX3Roci0+dGgudGhfdGVhbV9idF9zZXQpCisgICAgICAgICAgICAvLyBGb3JjZSBpbW1lZGlhdGUgc3VzcGVuZCBpZiBub3Qgc2V0IGJ5IHVzZXIgYW5kIG1vcmUgdGhyZWFkcyB0aGFuIGF2YWlsYWJsZSBwcm9jcworICAgICAgICAgICAgaGliZXJuYXRlID0gMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaGliZXJuYXRlID0gdGhpc190aHItPnRoLnRoX3RlYW1fYnRfaW50ZXJ2YWxzOworI2Vsc2UKKyAgICAgICAgaGliZXJuYXRlID0gdGhpc190aHItPnRoLnRoX3RlYW1fYnRfaW50ZXJ2YWxzOworI2VuZGlmIC8qIEtNUF9BREpVU1RfQkxPQ0tUSU1FICovCisKKyAgICAgICAgLyogSWYgdGhlIGJsb2NrdGltZSBpcyBub256ZXJvLCB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IHdlIHNwaW4gd2FpdCBmb3IgdGhlIGVudGlyZXR5CisgICAgICAgICAgIG9mIHRoZSBzcGVjaWZpZWQgI2ludGVydmFscywgcGx1cyB1cCB0byBvbmUgaW50ZXJ2YWwgbW9yZS4gIFRoaXMgaW5jcmVtZW50IG1ha2UKKyAgICAgICAgICAgY2VydGFpbiB0aGF0IHRoaXMgdGhyZWFkIGRvZXNuJ3QgZ28gdG8gc2xlZXAgdG9vIHNvb24uICAqLworICAgICAgICBpZiAoaGliZXJuYXRlICE9IDApCisgICAgICAgICAgICBoaWJlcm5hdGUrKzsKKworICAgICAgICAvLyBBZGQgaW4gdGhlIGN1cnJlbnQgdGltZSB2YWx1ZS4KKyAgICAgICAgaGliZXJuYXRlICs9IFRDUl80KF9fa21wX2dsb2JhbC5nLmdfdGltZS5kdC50X3ZhbHVlKTsKKyAgICAgICAgS0ZfVFJBQ0UoMjAsICgiX19rbXBfd2FpdF9zbGVlcDogVCMlZCBub3c9JWQsIGhpYmVybmF0ZT0lZCwgaW50ZXJ2YWxzPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgIHRoX2d0aWQsIF9fa21wX2dsb2JhbC5nLmdfdGltZS5kdC50X3ZhbHVlLCBoaWJlcm5hdGUsCisgICAgICAgICAgICAgICAgICAgICAgaGliZXJuYXRlIC0gX19rbXBfZ2xvYmFsLmcuZ190aW1lLmR0LnRfdmFsdWUpKTsKKyAgICB9CisKKyAgICBLTVBfTUIoKTsKKworICAgIC8vIE1haW4gd2FpdCBzcGluIGxvb3AKKyAgICB3aGlsZSAoZmxhZy0+bm90ZG9uZV9jaGVjaygpKSB7CisgICAgICAgIGludCBpbl9wb29sOworCisgICAgICAgIC8qIElmIHRoZSB0YXNrIHRlYW0gaXMgTlVMTCwgaXQgbWVhbnMgb25lIG9mIHRoaW5nczoKKyAgICAgICAgICAgMSkgQSBuZXdseS1jcmVhdGVkIHRocmVhZCBpcyBmaXJzdCBiZWluZyByZWxlYXNlZCBieSBfX2ttcF9mb3JrX2JhcnJpZXIoKSwgYW5kCisgICAgICAgICAgICAgIGl0cyB0YXNrIHRlYW0gaGFzIG5vdCBiZWVuIHNldCB1cCB5ZXQuCisgICAgICAgICAgIDIpIEFsbCB0YXNrcyBoYXZlIGJlZW4gZXhlY3V0ZWQgdG8gY29tcGxldGlvbiwgdGhpcyB0aHJlYWQgaGFzIGRlY3JlbWVudGVkIHRoZSB0YXNrCisgICAgICAgICAgICAgIHRlYW0ncyByZWYgY3QgYW5kIHBvc3NpYmx5IGRlYWxsb2NhdGVkIGl0LCBhbmQgc2hvdWxkIG5vIGxvbmdlciByZWZlcmVuY2UgaXQuCisgICAgICAgICAgIDMpIFRhc2tpbmcgaXMgb2ZmIGZvciB0aGlzIHJlZ2lvbi4gIFRoaXMgY291bGQgYmUgYmVjYXVzZSB3ZSBhcmUgaW4gYSBzZXJpYWxpemVkIHJlZ2lvbgorICAgICAgICAgICAgICAocGVyaGFwcyB0aGUgb3V0ZXIgb25lKSwgb3IgZWxzZSB0YXNraW5nIHdhcyBtYW51YWxseSBkaXNhYmxlZCAoS01QX1RBU0tJTkc9MCkuICAqLworICAgICAgICBrbXBfdGFza190ZWFtX3QgKiB0YXNrX3RlYW0gPSBOVUxMOworICAgICAgICBpZiAoX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMpIHsKKyAgICAgICAgICAgIHRhc2tfdGVhbSA9IHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW07CisgICAgICAgICAgICBpZiAodGFza190ZWFtICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAoVENSX1NZTkNfNCh0YXNrX3RlYW0tPnR0LnR0X2FjdGl2ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEtNUF9UQVNLSU5HX0VOQUJMRUQodGFza190ZWFtKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsYWctPmV4ZWN1dGVfdGFza3ModGhpc190aHIsIHRoX2d0aWQsIGZpbmFsX3NwaW4sICZ0YXNrc19jb21wbGV0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSwgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCFLTVBfTUFTVEVSX1RJRCh0aGlzX3Roci0+dGgudGhfaW5mby5kcy5kc190aWQpKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICB9IC8vIGlmCisKKyAgICAgICAgS01QX0ZTWU5DX1NQSU5fUFJFUEFSRShzcGluKTsKKyAgICAgICAgaWYgKFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkpIHsKKyAgICAgICAgICAgIGlmIChfX2ttcF9nbG9iYWwuZy5nX2Fib3J0KQorICAgICAgICAgICAgICAgIF9fa21wX2Fib3J0X3RocmVhZCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB3ZSBhcmUgb3ZlcnN1YnNjcmliZWQsIG9yIGhhdmUgd2FpdGVkIGEgYml0IChhbmQgS01QX0xJQlJBUlk9dGhyb3VnaHB1dCksIHRoZW4geWllbGQKKyAgICAgICAgS01QX1lJRUxEKFRDUl80KF9fa21wX250aCkgPiBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICAgICAgLy8gVE9ETzogU2hvdWxkIGl0IGJlIG51bWJlciBvZiBjb3JlcyBpbnN0ZWFkIG9mIHRocmVhZCBjb250ZXh0cz8gTGlrZToKKyAgICAgICAgLy8gS01QX1lJRUxEKFRDUl80KF9fa21wX250aCkgPiBfX2ttcF9uY29yZXMpOworICAgICAgICAvLyBOZWVkIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IGRhdGEgdG8gbWFrZSB0aGUgY2hhbmdlLi4uCisgICAgICAgIEtNUF9ZSUVMRF9TUElOKHNwaW5zKTsKKworICAgICAgICAvLyBDaGVjayBpZiB0aGlzIHRocmVhZCB3YXMgdHJhbnNmZXJyZWQgZnJvbSBhIHRlYW0KKyAgICAgICAgLy8gdG8gdGhlIHRocmVhZCBwb29sIChvciB2aWNlLXZlcnNhKSB3aGlsZSBzcGlubmluZy4KKyAgICAgICAgaW5fcG9vbCA9ICEhVENSXzQodGhpc190aHItPnRoLnRoX2luX3Bvb2wpOworICAgICAgICBpZiAoaW5fcG9vbCAhPSAhIXRoaXNfdGhyLT50aC50aF9hY3RpdmVfaW5fcG9vbCkgeworICAgICAgICAgICAgaWYgKGluX3Bvb2wpIHsgLy8gUmVjZW50bHkgdHJhbnNmZXJyZWQgZnJvbSB0ZWFtIHRvIHBvb2wKKyAgICAgICAgICAgICAgICBLTVBfVEVTVF9USEVOX0lOQzMyKChrbXBfaW50MzIgKikmX19rbXBfdGhyZWFkX3Bvb2xfYWN0aXZlX250aCk7CisgICAgICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX2FjdGl2ZV9pbl9wb29sID0gVFJVRTsKKyAgICAgICAgICAgICAgICAvKiBIZXJlLCB3ZSBjYW5ub3QgYXNzZXJ0IHRoYXQ6CisgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChUQ1JfNChfX2ttcF90aHJlYWRfcG9vbF9hY3RpdmVfbnRoKSA8PSBfX2ttcF90aHJlYWRfcG9vbF9udGgpOworICAgICAgICAgICAgICAgICAgIF9fa21wX3RocmVhZF9wb29sX250aCBpcyBpbmMvZGVjJ2QgYnkgdGhlIG1hc3RlciB0aHJlYWQgd2hpbGUgdGhlIGZvcmsvam9pbgorICAgICAgICAgICAgICAgICAgIGxvY2sgaXMgaGVsZCwgd2hlcmVhcyBfX2ttcF90aHJlYWRfcG9vbF9hY3RpdmVfbnRoIGlzIGluYy9kZWMnZCBhc3luY2hyb25vdXNseQorICAgICAgICAgICAgICAgICAgIGJ5IHRoZSB3b3JrZXJzLiAgVGhlIHR3byBjYW4gZ2V0IG91dCBvZiBzeW5jIGZvciBicmllZiBwZXJpb2RzIG9mIHRpbWUuICAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7IC8vIFJlY2VudGx5IHRyYW5zZmVycmVkIGZyb20gcG9vbCB0byB0ZWFtCisgICAgICAgICAgICAgICAgS01QX1RFU1RfVEhFTl9ERUMzMigoa21wX2ludDMyICopICZfX2ttcF90aHJlYWRfcG9vbF9hY3RpdmVfbnRoKTsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKFRDUl80KF9fa21wX3RocmVhZF9wb29sX2FjdGl2ZV9udGgpID49IDApOworICAgICAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9hY3RpdmVfaW5fcG9vbCA9IEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRG9uJ3Qgc3VzcGVuZCBpZiBLTVBfQkxPQ0tUSU1FIGlzIHNldCB0byAiaW5maW5pdGUiCisgICAgICAgIGlmIChfX2ttcF9kZmx0X2Jsb2NrdGltZSA9PSBLTVBfTUFYX0JMT0NLVElNRSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIC8vIERvbid0IHN1c3BlbmQgaWYgdGhlcmUgaXMgYSBsaWtlbGlob29kIG9mIG5ldyB0YXNrcyBiZWluZyBzcGF3bmVkLgorICAgICAgICBpZiAoKHRhc2tfdGVhbSAhPSBOVUxMKSAmJiBUQ1JfNCh0YXNrX3RlYW0tPnR0LnR0X2ZvdW5kX3Rhc2tzKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIC8vIElmIHdlIGhhdmUgd2FpdGVkIGEgYml0IG1vcmUsIGZhbGwgYXNsZWVwCisgICAgICAgIGlmIChUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX3RpbWUuZHQudF92YWx1ZSkgPCBoaWJlcm5hdGUpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBLRl9UUkFDRSg1MCwgKCJfX2ttcF93YWl0X3NsZWVwOiBUIyVkIHN1c3BlbmQgdGltZSByZWFjaGVkXG4iLCB0aF9ndGlkKSk7CisKKyAgICAgICAgZmxhZy0+c3VzcGVuZCh0aF9ndGlkKTsKKworICAgICAgICBpZiAoVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSkgeworICAgICAgICAgICAgaWYgKF9fa21wX2dsb2JhbC5nLmdfYWJvcnQpCisgICAgICAgICAgICAgICAgX19rbXBfYWJvcnRfdGhyZWFkKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvLyBUT0RPOiBJZiB0aHJlYWQgaXMgZG9uZSB3aXRoIHdvcmsgYW5kIHRpbWVzIG91dCwgZGlzYmFuZC9mcmVlCisgICAgfQorCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfQkxBTUUKKyAgICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICAgIG9tcHRfc3RhdGUgIT0gb21wdF9zdGF0ZV91bmRlZmluZWQpIHsKKyAgICAgICAgaWYgKG9tcHRfc3RhdGUgPT0gb21wdF9zdGF0ZV9pZGxlKSB7CisgICAgICAgICAgICBpZiAob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2lkbGVfZW5kKSkgeworICAgICAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pZGxlX2VuZCkodGhfZ3RpZCArIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF93YWl0X2JhcnJpZXJfZW5kKSkgeworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChvbXB0X3N0YXRlID09IG9tcHRfc3RhdGVfd2FpdF9iYXJyaWVyIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9tcHRfc3RhdGUgPT0gb21wdF9zdGF0ZV93YWl0X2JhcnJpZXJfaW1wbGljaXQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21wdF9zdGF0ZSA9PSBvbXB0X3N0YXRlX3dhaXRfYmFycmllcl9leHBsaWNpdCk7CisKKyAgICAgICAgICAgIG9tcHRfbHdfdGFza3RlYW1fdCogdGVhbSA9IHRoaXNfdGhyLT50aC50aF90ZWFtLT50Lm9tcHRfc2VyaWFsaXplZF90ZWFtX2luZm87CisgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2lkX3QgcElkOworICAgICAgICAgICAgb21wdF90YXNrX2lkX3QgdElkOworICAgICAgICAgICAgaWYgKHRlYW0peworICAgICAgICAgICAgICAgIHBJZCA9IHRlYW0tPm9tcHRfdGVhbV9pbmZvLnBhcmFsbGVsX2lkOworICAgICAgICAgICAgICAgIHRJZCA9IHRlYW0tPm9tcHRfdGFza19pbmZvLnRhc2tfaWQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBJZCA9IHRoaXNfdGhyLT50aC50aF90ZWFtLT50Lm9tcHRfdGVhbV9pbmZvLnBhcmFsbGVsX2lkOworICAgICAgICAgICAgICAgIHRJZCA9IHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2stPm9tcHRfdGFza19pbmZvLnRhc2tfaWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfd2FpdF9iYXJyaWVyX2VuZCkocElkLCB0SWQpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBLTVBfRlNZTkNfU1BJTl9BQ1FVSVJFRChzcGluKTsKK30KKworLyogUmVsZWFzZSBhbnkgdGhyZWFkcyBzcGVjaWZpZWQgYXMgd2FpdGluZyBvbiB0aGUgZmxhZyBieSByZWxlYXNpbmcgdGhlIGZsYWcgYW5kIHJlc3VtZSB0aGUgd2FpdGluZyB0aHJlYWQKKyAgIGlmIGluZGljYXRlZCBieSB0aGUgc2xlZXAgYml0KHMpLiBBIHRocmVhZCB0aGF0IGNhbGxzIF9fa21wX3dhaXRfdGVtcGxhdGUgbXVzdCBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gd2FrZQorICAgdXAgdGhlIHBvdGVudGlhbGx5IHNsZWVwaW5nIHRocmVhZCBhbmQgcHJldmVudCBkZWFkbG9ja3MhICAqLwordGVtcGxhdGUgPGNsYXNzIEM+CitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX3JlbGVhc2VfdGVtcGxhdGUoQyAqZmxhZykKK3sKKyNpZmRlZiBLTVBfREVCVUcKKyAgICBpbnQgZ3RpZCA9IFRDUl80KF9fa21wX2luaXRfZ3RpZCkgPyBfX2ttcF9nZXRfZ3RpZCgpIDogLTE7CisjZW5kaWYKKyAgICBLRl9UUkFDRSgyMCwgKCJfX2ttcF9yZWxlYXNlOiBUIyVkIHJlbGVhc2luZyBmbGFnKCV4KVxuIiwgZ3RpZCwgZmxhZy0+Z2V0KCkpKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKGZsYWctPmdldCgpKTsKKyAgICBLTVBfRlNZTkNfUkVMRUFTSU5HKGZsYWctPmdldCgpKTsKKworICAgIGZsYWctPmludGVybmFsX3JlbGVhc2UoKTsKKworICAgIEtGX1RSQUNFKDEwMCwgKCJfX2ttcF9yZWxlYXNlOiBUIyVkIHNldCBuZXcgc3Bpbj0lZFxuIiwgZ3RpZCwgZmxhZy0+Z2V0KCksICooZmxhZy0+Z2V0KCkpKSk7CisKKyAgICBpZiAoX19rbXBfZGZsdF9ibG9ja3RpbWUgIT0gS01QX01BWF9CTE9DS1RJTUUpIHsKKyAgICAgICAgLy8gT25seSBuZWVkIHRvIGNoZWNrIHNsZWVwIHN0dWZmIGlmIGluZmluaXRlIGJsb2NrIHRpbWUgbm90IHNldAorICAgICAgICBpZiAoZmxhZy0+aXNfYW55X3NsZWVwaW5nKCkpIHsgLy8gQXJlICphbnkqIG9mIHRoZSB0aHJlYWRzIHRoYXQgd2FpdCBvbiB0aGlzIGZsYWcgc2xlZXBpbmc/CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpPTA7IGk8ZmxhZy0+Z2V0X251bV93YWl0ZXJzKCk7ICsraSkgeworICAgICAgICAgICAgICAgIGttcF9pbmZvX3QgKiB3YWl0ZXIgPSBmbGFnLT5nZXRfd2FpdGVyKGkpOyAvLyBpZiBhIHNsZWVwaW5nIHdhaXRlciBleGlzdHMgYXQgaSwgc2V0cyBjdXJyZW50X3dhaXRlciB0byBpIGluc2lkZSB0aGUgZmxhZworICAgICAgICAgICAgICAgIGlmICh3YWl0ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHdhaXRfZ3RpZCA9IHdhaXRlci0+dGgudGhfaW5mby5kcy5kc19ndGlkOworICAgICAgICAgICAgICAgICAgICAvLyBXYWtlIHVwIHRocmVhZCBpZiBuZWVkZWQKKyAgICAgICAgICAgICAgICAgICAgS0ZfVFJBQ0UoNTAsICgiX19rbXBfcmVsZWFzZTogVCMlZCB3YWtpbmcgdXAgdGhyZWFkIFQjJWQgc2luY2Ugc2xlZXAgZmxhZyglcCkgc2V0XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHdhaXRfZ3RpZCwgZmxhZy0+Z2V0KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgZmxhZy0+cmVzdW1lKHdhaXRfZ3RpZCk7IC8vIHVuc2V0cyBmbGFnJ3MgY3VycmVudF93YWl0ZXIgd2hlbiBkb25lCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRmxhZ1R5cGU+CitzdHJ1Y3QgZmxhZ190cmFpdHMge307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgZmxhZ190cmFpdHM8a21wX3VpbnQzMj4geworICAgIHR5cGVkZWYga21wX3VpbnQzMiBmbGFnX3Q7CisgICAgc3RhdGljIGNvbnN0IGZsYWdfdHlwZSB0ID0gZmxhZzMyOworICAgIHN0YXRpYyBpbmxpbmUgZmxhZ190IHRjcihmbGFnX3QgZikgeyByZXR1cm4gVENSXzQoZik7IH0KKyAgICBzdGF0aWMgaW5saW5lIGZsYWdfdCB0ZXN0X3RoZW5fYWRkNCh2b2xhdGlsZSBmbGFnX3QgKmYpIHsgcmV0dXJuIEtNUF9URVNUX1RIRU5fQURENF8zMigodm9sYXRpbGUga21wX2ludDMyICopZik7IH0KKyAgICBzdGF0aWMgaW5saW5lIGZsYWdfdCB0ZXN0X3RoZW5fb3Iodm9sYXRpbGUgZmxhZ190ICpmLCBmbGFnX3QgdikgeyByZXR1cm4gS01QX1RFU1RfVEhFTl9PUjMyKCh2b2xhdGlsZSBrbXBfaW50MzIgKilmLCB2KTsgfQorICAgIHN0YXRpYyBpbmxpbmUgZmxhZ190IHRlc3RfdGhlbl9hbmQodm9sYXRpbGUgZmxhZ190ICpmLCBmbGFnX3QgdikgeyByZXR1cm4gS01QX1RFU1RfVEhFTl9BTkQzMigodm9sYXRpbGUga21wX2ludDMyICopZiwgdik7IH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgZmxhZ190cmFpdHM8a21wX3VpbnQ2ND4geworICAgIHR5cGVkZWYga21wX3VpbnQ2NCBmbGFnX3Q7CisgICAgc3RhdGljIGNvbnN0IGZsYWdfdHlwZSB0ID0gZmxhZzY0OworICAgIHN0YXRpYyBpbmxpbmUgZmxhZ190IHRjcihmbGFnX3QgZikgeyByZXR1cm4gVENSXzgoZik7IH0KKyAgICBzdGF0aWMgaW5saW5lIGZsYWdfdCB0ZXN0X3RoZW5fYWRkNCh2b2xhdGlsZSBmbGFnX3QgKmYpIHsgcmV0dXJuIEtNUF9URVNUX1RIRU5fQURENF82NCgodm9sYXRpbGUga21wX2ludDY0ICopZik7IH0KKyAgICBzdGF0aWMgaW5saW5lIGZsYWdfdCB0ZXN0X3RoZW5fb3Iodm9sYXRpbGUgZmxhZ190ICpmLCBmbGFnX3QgdikgeyByZXR1cm4gS01QX1RFU1RfVEhFTl9PUjY0KCh2b2xhdGlsZSBrbXBfaW50NjQgKilmLCB2KTsgfQorICAgIHN0YXRpYyBpbmxpbmUgZmxhZ190IHRlc3RfdGhlbl9hbmQodm9sYXRpbGUgZmxhZ190ICpmLCBmbGFnX3QgdikgeyByZXR1cm4gS01QX1RFU1RfVEhFTl9BTkQ2NCgodm9sYXRpbGUga21wX2ludDY0ICopZiwgdik7IH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBGbGFnVHlwZT4KK2NsYXNzIGttcF9iYXNpY19mbGFnIDogcHVibGljIGttcF9mbGFnPEZsYWdUeXBlPiB7CisgICAgdHlwZWRlZiBmbGFnX3RyYWl0czxGbGFnVHlwZT4gdHJhaXRzX3R5cGU7CisgICAgRmxhZ1R5cGUgY2hlY2tlcjsgIC8qKjwgVmFsdWUgdG8gY29tcGFyZSBmbGFnIHRvIHRvIGNoZWNrIGlmIGZsYWcgaGFzIGJlZW4gcmVsZWFzZWQuICovCisgICAga21wX2luZm9fdCAqIHdhaXRpbmdfdGhyZWFkc1sxXTsgIC8qKjwgQXJyYXkgb2YgdGhyZWFkcyBzbGVlcGluZyBvbiB0aGlzIHRocmVhZC4gKi8KKyAgICBrbXBfdWludDMyIG51bV93YWl0aW5nX3RocmVhZHM7ICAgICAgIC8qKjwgTnVtYmVyIG9mIHRocmVhZHMgc2xlZXBpbmcgb24gdGhpcyB0aHJlYWQuICovCisgcHVibGljOgorICAgIGttcF9iYXNpY19mbGFnKHZvbGF0aWxlIEZsYWdUeXBlICpwKSA6IGttcF9mbGFnPEZsYWdUeXBlPihwLCB0cmFpdHNfdHlwZTo6dCksIG51bV93YWl0aW5nX3RocmVhZHMoMCkge30KKyAgICBrbXBfYmFzaWNfZmxhZyh2b2xhdGlsZSBGbGFnVHlwZSAqcCwga21wX2luZm9fdCAqdGhyKSA6IGttcF9mbGFnPEZsYWdUeXBlPihwLCB0cmFpdHNfdHlwZTo6dCksIG51bV93YWl0aW5nX3RocmVhZHMoMSkgeworICAgICAgICB3YWl0aW5nX3RocmVhZHNbMF0gPSB0aHI7IAorICAgIH0KKyAgICBrbXBfYmFzaWNfZmxhZyh2b2xhdGlsZSBGbGFnVHlwZSAqcCwgRmxhZ1R5cGUgYykgOiBrbXBfZmxhZzxGbGFnVHlwZT4ocCwgdHJhaXRzX3R5cGU6OnQpLCBjaGVja2VyKGMpLCBudW1fd2FpdGluZ190aHJlYWRzKDApIHt9CisgICAgLyohCisgICAgICogcGFyYW0gaSBpbiAgIGluZGV4IGludG8gd2FpdGluZ190aHJlYWRzCisgICAgICogQHJlc3VsdCB0aGUgdGhyZWFkIHRoYXQgaXMgd2FpdGluZyBhdCBpbmRleCBpCisgICAgICovCisgICAga21wX2luZm9fdCAqIGdldF93YWl0ZXIoa21wX3VpbnQzMiBpKSB7IAorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGk8bnVtX3dhaXRpbmdfdGhyZWFkcyk7CisgICAgICAgIHJldHVybiB3YWl0aW5nX3RocmVhZHNbaV07IAorICAgIH0KKyAgICAvKiEKKyAgICAgKiBAcmVzdWx0IG51bV93YWl0aW5nX3RocmVhZHMKKyAgICAgKi8KKyAgICBrbXBfdWludDMyIGdldF9udW1fd2FpdGVycygpIHsgcmV0dXJuIG51bV93YWl0aW5nX3RocmVhZHM7IH0KKyAgICAvKiEKKyAgICAgKiBAcGFyYW0gdGhyIGluICAgdGhlIHRocmVhZCB3aGljaCBpcyBub3cgd2FpdGluZworICAgICAqCisgICAgICogSW5zZXJ0IGEgd2FpdGluZyB0aHJlYWQgYXQgaW5kZXggMC4KKyAgICAgKi8KKyAgICB2b2lkIHNldF93YWl0ZXIoa21wX2luZm9fdCAqdGhyKSB7IAorICAgICAgICB3YWl0aW5nX3RocmVhZHNbMF0gPSB0aHI7IAorICAgICAgICBudW1fd2FpdGluZ190aHJlYWRzID0gMTsKKyAgICB9CisgICAgLyohCisgICAgICogQHJlc3VsdCB0cnVlIGlmIHRoZSBmbGFnIG9iamVjdCBoYXMgYmVlbiByZWxlYXNlZC4KKyAgICAgKi8KKyAgICBib29sIGRvbmVfY2hlY2soKSB7IHJldHVybiB0cmFpdHNfdHlwZTo6dGNyKCoodGhpcy0+Z2V0KCkpKSA9PSBjaGVja2VyOyB9CisgICAgLyohCisgICAgICogQHBhcmFtIG9sZF9sb2MgaW4gICBvbGQgdmFsdWUgb2YgZmxhZworICAgICAqIEByZXN1bHQgdHJ1ZSBpZiB0aGUgZmxhZydzIG9sZCB2YWx1ZSBpbmRpY2F0ZXMgaXQgd2FzIHJlbGVhc2VkLgorICAgICAqLworICAgIGJvb2wgZG9uZV9jaGVja192YWwoRmxhZ1R5cGUgb2xkX2xvYykgeyByZXR1cm4gb2xkX2xvYyA9PSBjaGVja2VyOyB9CisgICAgLyohCisgICAgICogQHJlc3VsdCB0cnVlIGlmIHRoZSBmbGFnIG9iamVjdCBpcyBub3QgeWV0IHJlbGVhc2VkLgorICAgICAqIFVzZWQgaW4gX19rbXBfd2FpdF90ZW1wbGF0ZSBsaWtlOgorICAgICAqIEBjb2RlCisgICAgICogd2hpbGUgKGZsYWcubm90ZG9uZV9jaGVjaygpKSB7IHBhdXNlKCk7IH0KKyAgICAgKiBAZW5kY29kZQorICAgICAqLworICAgIGJvb2wgbm90ZG9uZV9jaGVjaygpIHsgcmV0dXJuIHRyYWl0c190eXBlOjp0Y3IoKih0aGlzLT5nZXQoKSkpICE9IGNoZWNrZXI7IH0KKyAgICAvKiEKKyAgICAgKiBAcmVzdWx0IEFjdHVhbCBmbGFnIHZhbHVlIGJlZm9yZSByZWxlYXNlIHdhcyBhcHBsaWVkLgorICAgICAqIFRyaWdnZXIgYWxsIHdhaXRpbmcgdGhyZWFkcyB0byBydW4gYnkgbW9kaWZ5aW5nIGZsYWcgdG8gcmVsZWFzZSBzdGF0ZS4KKyAgICAgKi8KKyAgICB2b2lkIGludGVybmFsX3JlbGVhc2UoKSB7CisgICAgICAgICh2b2lkKSB0cmFpdHNfdHlwZTo6dGVzdF90aGVuX2FkZDQoKHZvbGF0aWxlIEZsYWdUeXBlICopdGhpcy0+Z2V0KCkpOworICAgIH0KKyAgICAvKiEKKyAgICAgKiBAcmVzdWx0IEFjdHVhbCBmbGFnIHZhbHVlIGJlZm9yZSBzbGVlcCBiaXQocykgc2V0LgorICAgICAqIE5vdGVzIHRoYXQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHRocmVhZCBzbGVlcGluZyBvbiB0aGUgZmxhZyBieSBzZXR0aW5nIHNsZWVwIGJpdChzKS4KKyAgICAgKi8KKyAgICBGbGFnVHlwZSBzZXRfc2xlZXBpbmcoKSB7IAorICAgICAgICByZXR1cm4gdHJhaXRzX3R5cGU6OnRlc3RfdGhlbl9vcigodm9sYXRpbGUgRmxhZ1R5cGUgKil0aGlzLT5nZXQoKSwgS01QX0JBUlJJRVJfU0xFRVBfU1RBVEUpOworICAgIH0KKyAgICAvKiEKKyAgICAgKiBAcmVzdWx0IEFjdHVhbCBmbGFnIHZhbHVlIGJlZm9yZSBzbGVlcCBiaXQocykgY2xlYXJlZC4KKyAgICAgKiBOb3RlcyB0aGF0IHRoZXJlIGFyZSBubyBsb25nZXIgdGhyZWFkcyBzbGVlcGluZyBvbiB0aGUgZmxhZyBieSBjbGVhcmluZyBzbGVlcCBiaXQocykuCisgICAgICovCisgICAgRmxhZ1R5cGUgdW5zZXRfc2xlZXBpbmcoKSB7IAorICAgICAgICByZXR1cm4gdHJhaXRzX3R5cGU6OnRlc3RfdGhlbl9hbmQoKHZvbGF0aWxlIEZsYWdUeXBlICopdGhpcy0+Z2V0KCksIH5LTVBfQkFSUklFUl9TTEVFUF9TVEFURSk7CisgICAgfQorICAgIC8qISAKKyAgICAgKiBAcGFyYW0gb2xkX2xvYyBpbiAgIG9sZCB2YWx1ZSBvZiBmbGFnCisgICAgICogVGVzdCB3aGV0aGVyIHRoZXJlIGFyZSB0aHJlYWRzIHNsZWVwaW5nIG9uIHRoZSBmbGFnJ3Mgb2xkIHZhbHVlIGluIG9sZF9sb2MuCisgICAgICovCisgICAgYm9vbCBpc19zbGVlcGluZ192YWwoRmxhZ1R5cGUgb2xkX2xvYykgeyByZXR1cm4gb2xkX2xvYyAmIEtNUF9CQVJSSUVSX1NMRUVQX1NUQVRFOyB9CisgICAgLyohIAorICAgICAqIFRlc3Qgd2hldGhlciB0aGVyZSBhcmUgdGhyZWFkcyBzbGVlcGluZyBvbiB0aGUgZmxhZy4KKyAgICAgKi8KKyAgICBib29sIGlzX3NsZWVwaW5nKCkgeyByZXR1cm4gaXNfc2xlZXBpbmdfdmFsKCoodGhpcy0+Z2V0KCkpKTsgfQorICAgIGJvb2wgaXNfYW55X3NsZWVwaW5nKCkgeyByZXR1cm4gaXNfc2xlZXBpbmdfdmFsKCoodGhpcy0+Z2V0KCkpKTsgfQorICAgIGttcF91aW50OCAqZ2V0X3N0b2xlbigpIHsgcmV0dXJuIE5VTEw7IH0KKyAgICBlbnVtIGJhcnJpZXJfdHlwZSBnZXRfYnQoKSB7IHJldHVybiBic19sYXN0X2JhcnJpZXI7IH0KK307CisKK2NsYXNzIGttcF9mbGFnXzMyIDogcHVibGljIGttcF9iYXNpY19mbGFnPGttcF91aW50MzI+IHsKKyBwdWJsaWM6CisgICAga21wX2ZsYWdfMzIodm9sYXRpbGUga21wX3VpbnQzMiAqcCkgOiBrbXBfYmFzaWNfZmxhZzxrbXBfdWludDMyPihwKSB7fQorICAgIGttcF9mbGFnXzMyKHZvbGF0aWxlIGttcF91aW50MzIgKnAsIGttcF9pbmZvX3QgKnRocikgOiBrbXBfYmFzaWNfZmxhZzxrbXBfdWludDMyPihwLCB0aHIpIHt9CisgICAga21wX2ZsYWdfMzIodm9sYXRpbGUga21wX3VpbnQzMiAqcCwga21wX3VpbnQzMiBjKSA6IGttcF9iYXNpY19mbGFnPGttcF91aW50MzI+KHAsIGMpIHt9CisgICAgdm9pZCBzdXNwZW5kKGludCB0aF9ndGlkKSB7IF9fa21wX3N1c3BlbmRfMzIodGhfZ3RpZCwgdGhpcyk7IH0KKyAgICB2b2lkIHJlc3VtZShpbnQgdGhfZ3RpZCkgeyBfX2ttcF9yZXN1bWVfMzIodGhfZ3RpZCwgdGhpcyk7IH0KKyAgICBpbnQgZXhlY3V0ZV90YXNrcyhrbXBfaW5mb190ICp0aGlzX3Rociwga21wX2ludDMyIGd0aWQsIGludCBmaW5hbF9zcGluLCBpbnQgKnRocmVhZF9maW5pc2hlZAorICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKHZvaWQgKiBpdHRfc3luY19vYmopLCBrbXBfaW50MzIgaXNfY29uc3RyYWluZWQpIHsKKyAgICAgICAgcmV0dXJuIF9fa21wX2V4ZWN1dGVfdGFza3NfMzIodGhpc190aHIsIGd0aWQsIHRoaXMsIGZpbmFsX3NwaW4sIHRocmVhZF9maW5pc2hlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopLCBpc19jb25zdHJhaW5lZCk7CisgICAgfQorICAgIHZvaWQgd2FpdChrbXBfaW5mb190ICp0aGlzX3RociwgaW50IGZpbmFsX3NwaW4KKyAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqIGl0dF9zeW5jX29iaikpIHsKKyAgICAgICAgX19rbXBfd2FpdF90ZW1wbGF0ZSh0aGlzX3RociwgdGhpcywgZmluYWxfc3BpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikpOworICAgIH0KKyAgICB2b2lkIHJlbGVhc2UoKSB7IF9fa21wX3JlbGVhc2VfdGVtcGxhdGUodGhpcyk7IH0KKyAgICBmbGFnX3R5cGUgZ2V0X3B0cl90eXBlKCkgeyByZXR1cm4gZmxhZzMyOyB9Cit9OworCitjbGFzcyBrbXBfZmxhZ182NCA6IHB1YmxpYyBrbXBfYmFzaWNfZmxhZzxrbXBfdWludDY0PiB7CisgcHVibGljOgorICAgIGttcF9mbGFnXzY0KHZvbGF0aWxlIGttcF91aW50NjQgKnApIDoga21wX2Jhc2ljX2ZsYWc8a21wX3VpbnQ2ND4ocCkge30KKyAgICBrbXBfZmxhZ182NCh2b2xhdGlsZSBrbXBfdWludDY0ICpwLCBrbXBfaW5mb190ICp0aHIpIDoga21wX2Jhc2ljX2ZsYWc8a21wX3VpbnQ2ND4ocCwgdGhyKSB7fQorICAgIGttcF9mbGFnXzY0KHZvbGF0aWxlIGttcF91aW50NjQgKnAsIGttcF91aW50NjQgYykgOiBrbXBfYmFzaWNfZmxhZzxrbXBfdWludDY0PihwLCBjKSB7fQorICAgIHZvaWQgc3VzcGVuZChpbnQgdGhfZ3RpZCkgeyBfX2ttcF9zdXNwZW5kXzY0KHRoX2d0aWQsIHRoaXMpOyB9CisgICAgdm9pZCByZXN1bWUoaW50IHRoX2d0aWQpIHsgX19rbXBfcmVzdW1lXzY0KHRoX2d0aWQsIHRoaXMpOyB9CisgICAgaW50IGV4ZWN1dGVfdGFza3Moa21wX2luZm9fdCAqdGhpc190aHIsIGttcF9pbnQzMiBndGlkLCBpbnQgZmluYWxfc3BpbiwgaW50ICp0aHJlYWRfZmluaXNoZWQKKyAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyh2b2lkICogaXR0X3N5bmNfb2JqKSwga21wX2ludDMyIGlzX2NvbnN0cmFpbmVkKSB7CisgICAgICAgIHJldHVybiBfX2ttcF9leGVjdXRlX3Rhc2tzXzY0KHRoaXNfdGhyLCBndGlkLCB0aGlzLCBmaW5hbF9zcGluLCB0aHJlYWRfZmluaXNoZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSwgaXNfY29uc3RyYWluZWQpOworICAgIH0KKyAgICB2b2lkIHdhaXQoa21wX2luZm9fdCAqdGhpc190aHIsIGludCBmaW5hbF9zcGluCisgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKHZvaWQgKiBpdHRfc3luY19vYmopKSB7CisgICAgICAgIF9fa21wX3dhaXRfdGVtcGxhdGUodGhpc190aHIsIHRoaXMsIGZpbmFsX3NwaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopKTsKKyAgICB9CisgICAgdm9pZCByZWxlYXNlKCkgeyBfX2ttcF9yZWxlYXNlX3RlbXBsYXRlKHRoaXMpOyB9CisgICAgZmxhZ190eXBlIGdldF9wdHJfdHlwZSgpIHsgcmV0dXJuIGZsYWc2NDsgfQorfTsKKworLy8gSGllcmFyY2hpY2FsIDY0LWJpdCBvbi1jb3JlIGJhcnJpZXIgaW5zdGFudGlhdGlvbgorY2xhc3Mga21wX2ZsYWdfb25jb3JlIDogcHVibGljIGttcF9mbGFnPGttcF91aW50NjQ+IHsKKyAgICBrbXBfdWludDY0IGNoZWNrZXI7CisgICAga21wX2luZm9fdCAqIHdhaXRpbmdfdGhyZWFkc1sxXTsKKyAgICBrbXBfdWludDMyIG51bV93YWl0aW5nX3RocmVhZHM7CisgICAga21wX3VpbnQzMiBvZmZzZXQ7ICAgICAgLyoqPCBQb3J0aW9uIG9mIGZsYWcgdGhhdCBpcyBvZiBpbnRlcmVzdCBmb3IgYW4gb3BlcmF0aW9uLiAqLworICAgIGJvb2wgZmxhZ19zd2l0Y2g7ICAgICAgIC8qKjwgSW5kaWNhdGVzIGEgc3dpdGNoIGluIGZsYWcgbG9jYXRpb24uICovCisgICAgZW51bSBiYXJyaWVyX3R5cGUgYnQ7ICAgLyoqPCBCYXJyaWVyIHR5cGUuICovCisgICAga21wX2luZm9fdCAqIHRoaXNfdGhyOyAgLyoqPCBUaHJlYWQgdGhhdCBtYXkgYmUgcmVkaXJlY3RlZCB0byBkaWZmZXJlbnQgZmxhZyBsb2NhdGlvbi4gKi8KKyNpZiBVU0VfSVRUX0JVSUxECisgICAgdm9pZCAqaXR0X3N5bmNfb2JqOyAgICAgLyoqPCBJVFQgb2JqZWN0IHRoYXQgbXVzdCBiZSBwYXNzZWQgdG8gbmV3IGZsYWcgbG9jYXRpb24uICovCisjZW5kaWYKKyAgICB1bnNpZ25lZCBjaGFyJiBieXRlcmVmKHZvbGF0aWxlIGttcF91aW50NjQqIGxvYywgc2l6ZV90IG9mZnNldCkgeyByZXR1cm4gKCh1bnNpZ25lZCBjaGFyICopbG9jKVtvZmZzZXRdOyB9CitwdWJsaWM6CisgICAga21wX2ZsYWdfb25jb3JlKHZvbGF0aWxlIGttcF91aW50NjQgKnApCisgICAgICAgIDoga21wX2ZsYWc8a21wX3VpbnQ2ND4ocCwgZmxhZ19vbmNvcmUpLCBudW1fd2FpdGluZ190aHJlYWRzKDApLCBmbGFnX3N3aXRjaChmYWxzZSkge30KKyAgICBrbXBfZmxhZ19vbmNvcmUodm9sYXRpbGUga21wX3VpbnQ2NCAqcCwga21wX3VpbnQzMiBpZHgpCisgICAgICAgIDoga21wX2ZsYWc8a21wX3VpbnQ2ND4ocCwgZmxhZ19vbmNvcmUpLCBudW1fd2FpdGluZ190aHJlYWRzKDApLCBvZmZzZXQoaWR4KSwgZmxhZ19zd2l0Y2goZmFsc2UpIHt9CisgICAga21wX2ZsYWdfb25jb3JlKHZvbGF0aWxlIGttcF91aW50NjQgKnAsIGttcF91aW50NjQgYywga21wX3VpbnQzMiBpZHgsIGVudW0gYmFycmllcl90eXBlIGJhcl90LAorICAgICAgICAgICAgICAgICAgICBrbXBfaW5mb190ICogdGhyCisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAgICAgICAgICAgICAsIHZvaWQgKml0dAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgOiBrbXBfZmxhZzxrbXBfdWludDY0PihwLCBmbGFnX29uY29yZSksIGNoZWNrZXIoYyksIG51bV93YWl0aW5nX3RocmVhZHMoMCksIG9mZnNldChpZHgpLAorICAgICAgICAgIGZsYWdfc3dpdGNoKGZhbHNlKSwgYnQoYmFyX3QpLCB0aGlzX3Rocih0aHIpCisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAsIGl0dF9zeW5jX29iaihpdHQpCisjZW5kaWYKKyAgICAgICAge30KKyAgICBrbXBfaW5mb190ICogZ2V0X3dhaXRlcihrbXBfdWludDMyIGkpIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChpPG51bV93YWl0aW5nX3RocmVhZHMpOworICAgICAgICByZXR1cm4gd2FpdGluZ190aHJlYWRzW2ldOworICAgIH0KKyAgICBrbXBfdWludDMyIGdldF9udW1fd2FpdGVycygpIHsgcmV0dXJuIG51bV93YWl0aW5nX3RocmVhZHM7IH0KKyAgICB2b2lkIHNldF93YWl0ZXIoa21wX2luZm9fdCAqdGhyKSB7CisgICAgICAgIHdhaXRpbmdfdGhyZWFkc1swXSA9IHRocjsKKyAgICAgICAgbnVtX3dhaXRpbmdfdGhyZWFkcyA9IDE7CisgICAgfQorICAgIGJvb2wgZG9uZV9jaGVja192YWwoa21wX3VpbnQ2NCBvbGRfbG9jKSB7IHJldHVybiBieXRlcmVmKCZvbGRfbG9jLG9mZnNldCkgPT0gY2hlY2tlcjsgfQorICAgIGJvb2wgZG9uZV9jaGVjaygpIHsgcmV0dXJuIGRvbmVfY2hlY2tfdmFsKCpnZXQoKSk7IH0KKyAgICBib29sIG5vdGRvbmVfY2hlY2soKSB7CisgICAgICAgIC8vIENhbGN1bGF0ZSBmbGFnX3N3aXRjaAorICAgICAgICBpZiAodGhpc190aHItPnRoLnRoX2JhcltidF0uYmIud2FpdF9mbGFnID09IEtNUF9CQVJSSUVSX1NXSVRDSF9UT19PV05fRkxBRykKKyAgICAgICAgICAgIGZsYWdfc3dpdGNoID0gdHJ1ZTsKKyAgICAgICAgaWYgKGJ5dGVyZWYoZ2V0KCksb2Zmc2V0KSAhPSAxICYmICFmbGFnX3N3aXRjaCkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBlbHNlIGlmIChmbGFnX3N3aXRjaCkgeworICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX2JhcltidF0uYmIud2FpdF9mbGFnID0gS01QX0JBUlJJRVJfU1dJVENISU5HOworICAgICAgICAgICAga21wX2ZsYWdfNjQgZmxhZygmdGhpc190aHItPnRoLnRoX2JhcltidF0uYmIuYl9nbywgKGttcF91aW50NjQpS01QX0JBUlJJRVJfU1RBVEVfQlVNUCk7CisgICAgICAgICAgICBfX2ttcF93YWl0XzY0KHRoaXNfdGhyLCAmZmxhZywgVFJVRQorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLCBpdHRfc3luY19vYmoKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdm9pZCBpbnRlcm5hbF9yZWxlYXNlKCkgeworICAgICAgICBpZiAoX19rbXBfZGZsdF9ibG9ja3RpbWUgPT0gS01QX01BWF9CTE9DS1RJTUUpIHsKKyAgICAgICAgICAgIGJ5dGVyZWYoZ2V0KCksb2Zmc2V0KSA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBrbXBfdWludDY0IG1hc2s9MDsKKyAgICAgICAgICAgIGJ5dGVyZWYoJm1hc2ssb2Zmc2V0KSA9IDE7CisgICAgICAgICAgICAodm9pZCkgS01QX1RFU1RfVEhFTl9PUjY0KCh2b2xhdGlsZSBrbXBfaW50NjQgKilnZXQoKSwgbWFzayk7CisgICAgICAgIH0KKyAgICB9CisgICAga21wX3VpbnQ2NCBzZXRfc2xlZXBpbmcoKSB7CisgICAgICAgIHJldHVybiBLTVBfVEVTVF9USEVOX09SNjQoKGttcF9pbnQ2NCB2b2xhdGlsZSAqKWdldCgpLCBLTVBfQkFSUklFUl9TTEVFUF9TVEFURSk7CisgICAgfQorICAgIGttcF91aW50NjQgdW5zZXRfc2xlZXBpbmcoKSB7CisgICAgICAgIHJldHVybiBLTVBfVEVTVF9USEVOX0FORDY0KChrbXBfaW50NjQgdm9sYXRpbGUgKilnZXQoKSwgfktNUF9CQVJSSUVSX1NMRUVQX1NUQVRFKTsKKyAgICB9CisgICAgYm9vbCBpc19zbGVlcGluZ192YWwoa21wX3VpbnQ2NCBvbGRfbG9jKSB7IHJldHVybiBvbGRfbG9jICYgS01QX0JBUlJJRVJfU0xFRVBfU1RBVEU7IH0KKyAgICBib29sIGlzX3NsZWVwaW5nKCkgeyByZXR1cm4gaXNfc2xlZXBpbmdfdmFsKCpnZXQoKSk7IH0KKyAgICBib29sIGlzX2FueV9zbGVlcGluZygpIHsgcmV0dXJuIGlzX3NsZWVwaW5nX3ZhbCgqZ2V0KCkpOyB9CisgICAgdm9pZCB3YWl0KGttcF9pbmZvX3QgKnRoaXNfdGhyLCBpbnQgZmluYWxfc3BpbikgeworICAgICAgICBfX2ttcF93YWl0X3RlbXBsYXRlPGttcF9mbGFnX29uY29yZT4odGhpc190aHIsIHRoaXMsIGZpbmFsX3NwaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopKTsKKyAgICB9CisgICAgdm9pZCByZWxlYXNlKCkgeyBfX2ttcF9yZWxlYXNlX3RlbXBsYXRlKHRoaXMpOyB9CisgICAgdm9pZCBzdXNwZW5kKGludCB0aF9ndGlkKSB7IF9fa21wX3N1c3BlbmRfb25jb3JlKHRoX2d0aWQsIHRoaXMpOyB9CisgICAgdm9pZCByZXN1bWUoaW50IHRoX2d0aWQpIHsgX19rbXBfcmVzdW1lX29uY29yZSh0aF9ndGlkLCB0aGlzKTsgfQorICAgIGludCBleGVjdXRlX3Rhc2tzKGttcF9pbmZvX3QgKnRoaXNfdGhyLCBrbXBfaW50MzIgZ3RpZCwgaW50IGZpbmFsX3NwaW4sIGludCAqdGhyZWFkX2ZpbmlzaGVkCisgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqIGl0dF9zeW5jX29iaiksIGttcF9pbnQzMiBpc19jb25zdHJhaW5lZCkgeworICAgICAgICByZXR1cm4gX19rbXBfZXhlY3V0ZV90YXNrc19vbmNvcmUodGhpc190aHIsIGd0aWQsIHRoaXMsIGZpbmFsX3NwaW4sIHRocmVhZF9maW5pc2hlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSwgaXNfY29uc3RyYWluZWQpOworICAgIH0KKyAgICBrbXBfdWludDggKmdldF9zdG9sZW4oKSB7IHJldHVybiBOVUxMOyB9CisgICAgZW51bSBiYXJyaWVyX3R5cGUgZ2V0X2J0KCkgeyByZXR1cm4gYnQ7IH0KKyAgICBmbGFnX3R5cGUgZ2V0X3B0cl90eXBlKCkgeyByZXR1cm4gZmxhZ19vbmNvcmU7IH0KK307CisKKworLyohCitAfQorKi8KKworI2VuZGlmIC8vIEtNUF9XQUlUX1JFTEVBU0VfSApkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX3dyYXBwZXJfZ2V0cGlkLmggYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfd3JhcHBlcl9nZXRwaWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWEwNDZjCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX3dyYXBwZXJfZ2V0cGlkLmgKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIGttcF93cmFwcGVyX2dldHBpZC5oIC0tIGdldHBpZCgpIGRlY2xhcmF0aW9uLgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIEtNUF9XUkFQUEVSX0dFVFBJRF9ICisjZGVmaW5lIEtNUF9XUkFQUEVSX0dFVFBJRF9ICisKKyNpZiBLTVBfT1NfVU5JWAorCisgICAgLy8gT24gVW5peC1saWtlIHN5c3RlbXMgKExpbnV4KiBPUyBhbmQgT1MgWCopIGdldHBpZCgpIGlzIGRlY2xhcmVkIGluIHN0YW5kYXJkIGhlYWRlcnMuCisgICAgI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorICAgICNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2VsaWYgS01QX09TX1dJTkRPV1MKKworICAgIC8vIE9uIFdpbmRvd3MqIE9TIF9nZXRwaWQoKSByZXR1cm5zIGludCAobm90IHBpZF90KSBhbmQgaXMgZGVjbGFyZWQgaW4gInByb2Nlc3MuaCIuCisgICAgI2luY2x1ZGUgPHByb2Nlc3MuaD4KKyAgICAvLyBMZXQgdXMgc2ltdWxhdGUgVW5peC4KKyAgICB0eXBlZGVmIGludCBwaWRfdDsKKyAgICAjZGVmaW5lIGdldHBpZCBfZ2V0cGlkCisKKyNlbHNlCisKKyAgICAjZXJyb3IgVW5rbm93biBvciB1bnN1cHBvcnRlZCBPUy4KKworI2VuZGlmCisKKy8qCisgICAgVE9ETzogQWxsIHRoZSBsaWJvbXAgc291cmNlIGNvZGUgdXNlcyBwaWRfdCB0eXBlIGZvciBzdG9yaW5nIHRoZSByZXN1bHQgb2YgZ2V0cGlkKCksIGl0IGlzIGdvb2QuCisgICAgQnV0IG9mdGVuIGl0IHByaW50ZWQgYXMgIiVkIiwgdGhhdCBpcyBub3QgZ29vZCwgYmVjYXVzZSBpdCBpZ25vcmVzIHBpZF90IGRlZmluaXRpb24gKG1heSBwaWRfdAorICAgIGJlIGxvbmdlciB0aGF0IGludD8pLiBJdCBzZWVtcyBhbGwgcGlkIHByaW50cyBzaG91bGQgYmUgcmV3cml0dGVuIGFzCisKKyAgICAgICAgcHJpbnRmKCAiJSIgS01QX1VJTlQ2NF9TUEVDLCAoa21wX3VpbnQ2NCkgcGlkICk7CisKKyAgICBvciAoYXQgbGVhc3QpIGFzCisKKyAgICAgICAgcHJpbnRmKCAiJSIgS01QX1VJTlQzMl9TUEVDLCAoa21wX3VpbnQzMikgcGlkICk7CisKKyAgICAoa21wX3VpbnQzMiwga21wX3VpbnQ2NCwgS01QX1VJTlQ2NF9TUEVDLCBhbmQgS01QX1VOSVQzMl9TUEVDIGFyZSBkZWZpbmVkIGluICJrbXBfb3MuaCIuKQorCisqLworCisjZW5kaWYgLy8gS01QX1dSQVBQRVJfR0VUUElEX0gKKworLy8gZW5kIG9mIGZpbGUgLy8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF93cmFwcGVyX21hbGxvYy5oIGIvZmluYWwvcnVudGltZS9zcmMva21wX3dyYXBwZXJfbWFsbG9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUzZDFlZgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF93cmFwcGVyX21hbGxvYy5oCkBAIC0wLDAgKzEsMjA1IEBACisvKgorICoga21wX3dyYXBwZXJfbWFsbG9jLmggLS0gV3JhcHBlcnMgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAobWFsbG9jKCksIGZyZWUoKSwgYW5kIG90aGVycykuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX1dSQVBQRVJfTUFMTE9DX0gKKyNkZWZpbmUgS01QX1dSQVBQRVJfTUFMTE9DX0gKKworLyoKKyAgICBUaGlzIGhlYWRlciBzZXJ2ZXMgZm9yIDMgcHVycG9zZXM6CisKKyAgICAgICAgMS4gRGVjbGFyaW5nIHN0YW5kYXJkIG1lbW9yeSBhbGxvY2F0aW9uIHJvdXJpbmVzIGluIE9TLWluZGVwZW5kZW50IHdheS4KKyAgICAgICAgMi4gUGFzc2luZyBzb3VyY2UgbG9jYXRpb24gaW5mbyB0aHJvdWdoIG1lbW9yeSBhbGxvY2F0aW9uIHdyYXBwZXJzLgorICAgICAgICAzLiBFbmFibGluZyBuYXRpdmUgbWVtb3J5IGRlYnVnZ2luZyBjYXBhYmlsaXRpZXMuCisKKworICAgIDEuIERlY2xhcmluZyBzdGFuZGFyZCBtZW1vcnkgYWxsb2NhdGlvbiByb3VyaW5lcyBpbiBPUy1pbmRlcGVuZGVudCB3YXkuCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIE9uIExpbnV4KiBPUywgYWxsb2NhKCkgZnVuY3Rpb24gaXMgZGVjbGFyZWQgaW4gPGFsbG9jYS5oPiBoZWFkZXIsIHdoaWxlIG9uIFdpbmRvd3MqIE9TIHRoZXJlIGlzIG5vCisgICAgPGFsbG9jYS5oPiBoZWFkZXIsIGZ1bmN0aW9uIF9hbGxvY2EoKSAobm90ZSB1bmRlcnNjb3JlISkgaXMgZGVjbGFyZWQgaW4gPG1hbGxvYy5oPi4gVGhpcyBoZWFkZXIKKyAgICBlbGltaW5hdGVzIHRoZXNlIGRpZmZlcmVuY2VzLCBzbyBjbGllbnQgY29kZSBpbmNsdWlkaW5nICJrbXBfd3JhcHBlcl9tYWxsb2MuaCIgY2FuIHJlbHkgb24KKyAgICBmb2xsb3dpbmcgcm91dGluZXM6CisKKyAgICAgICAgbWFsbG9jCisgICAgICAgIGNhbGxvYworICAgICAgICByZWFsbG9jCisgICAgICAgIGZyZWUKKyAgICAgICAgYWxsb2NhCisKKyAgICBpbiBPUy1pbmRlcGVuZGVudCB3YXkuIEl0IGFsc28gZW5hYmxlcyBtZW1vcnkgdHJhY2tpbmcgY2FwYWJpbGl0aWVzIGluIGRlYnVnIGJ1aWxkLiAoQ3VycmVudGx5CisgICAgaXQgaXMgYXZhaWxhYmxlIG9ubHkgb24gV2luZG93cyogT1MuKQorCisKKyAgICAyLiBQYXNzaW5nIHNvdXJjZSBsb2NhdGlvbiBpbmZvIHRocm91Z2ggbWVtb3J5IGFsbG9jYXRpb24gd3JhcHBlcnMuCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgU29tZSB0b29scyBtYXkgaGVscCBkZWJ1Z2dpbmcgbWVtb3J5IGVycm9ycywgZm9yIGV4YW1wbGUsIHJlcG9ydCBtZW1vcnkgbGVha3MuIEhvd2V2ZXIsIG1lbW9yeQorICAgIGFsbG9jYXRpb24gd3JhcHBlcnMgbWF5IGhpbmRlciBzb3VyY2UgbG9jYXRpb24uCisKKyAgICBGb3IgZXhhbXBsZToKKworICAgICAgICB2b2lkICogYWxpZ25lZF9tYWxsb2MoIGludCBzaXplICkgeworICAgICAgICAgICAgdm9pZCAqIHB0ciA9IG1hbGxvYyggc2l6ZSApOyAvLyBBbGwgdGhlIG1lbW9yeSBsZWFrcyB3aWxsIGJlIHJlcG9ydGVkIGF0IHRoaXMgbGluZS4KKyAgICAgICAgICAgIC8vIHNvbWUgYWRqdXN0bWVudHMuLi4KKyAgICAgICAgICAgIHJldHVybiBwdHI7CisgICAgICAgIH07CisKKyAgICAgICAgcHRyID0gYWxpZ25lZF9tYWxsb2MoIHNpemUgKTsgICAgLy8gTWVtb3J5IGxlYWsgd2lsbCAqbm90KiBiZSBkZXRlY3RlZCBoZXJlLiA6LSgKKworICAgIFRvIG92ZXJjb21lIHRoZSBwcm9ibGVtLCBpbmZvcm1hdGlvbiBhYm91dCBvcmlnaW5hbCBzb3VyY2UgbG9jYXRpb24gc2hvdWxkIGJlIHBhc3NlZCB0aHJvdWdoIGFsbAorICAgIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiB3cmFwcGVycywgZm9yIGV4YW1wbGU6CisKKyAgICAgICAgdm9pZCAqIGFsaWduZWRfbWFsbG9jKCBpbnQgc2l6ZSwgY2hhciBjb25zdCAqIGZpbGUsIGludCBsaW5lICkgeworICAgICAgICAgICAgdm9pZCAqIHB0ciA9IF9tYWxsb2NfZGJnKCBzaXplLCBmaWxlLCBsaW5lICk7CisgICAgICAgICAgICAvLyBzb21lIGFkanVzdG1lbnRzLi4uCisgICAgICAgICAgICByZXR1cm4gcHRyOworICAgICAgICB9OworCisgICAgICAgIHZvaWQgKiBwdHIgPSBhbGlnbmVkX21hbGxvYyggc2l6ZSwgX19GSUxFX18sIF9fTElORV9fICk7CisKKyAgICBUaGlzIGlzIGEgZ29vZCBpZGVhIGZvciBkZWJ1ZywgYnV0IHBhc3NpbmcgYWRkaXRpb25hbCBhcmd1bWVudHMgaW1wYWN0cyBwZXJmb3JtYW5jZS4gRGlzYWJsaW5nCisgICAgZXh0cmEgYXJndW1lbnRzIGluIHJlbGVhc2UgdmVyc2lvbiBvZiB0aGUgc29mdHdhcmUgaW50cm9kdWNlcyB0b28gbWFueSBjb25kaXRpb25hbCBjb21waWxhdGlvbiwKKyAgICB3aGljaCBtYWtlcyBjb2RlIHVucmVhZGFibGUuIFRoaXMgaGVhZGVyIGRlZmluZXMgZmV3IG1hY3JvcyBhbmQgZnVuY3Rpb25zIGZhY2lsaXRhdGluZyBpdDoKKworICAgICAgICB2b2lkICogX2FsaWduZWRfbWFsbG9jKCBpbnQgc2l6ZSBLTVBfU1JDX0xPQ19ERUNMICkgeworICAgICAgICAgICAgdm9pZCAqIHB0ciA9IG1hbGxvY19zcmNfbG9jKCBzaXplIEtNUF9TUkNfTE9DX1BBUk0gKTsKKyAgICAgICAgICAgIC8vIHNvbWUgYWRqdXN0bWVudHMuLi4KKyAgICAgICAgICAgIHJldHVybiBwdHI7CisgICAgICAgIH07CisgICAgICAgICNkZWZpbmUgYWxpZ25lZF9tYWxsb2MoIHNpemUgKSBfYWxpZ25lZF9tYWxsb2MoIChzaXplKSBLTVBfU1JDX0xPQ19DVVJSICkKKyAgICAgICAgICAgIC8vIFVzZSBtYWNybyBpbnN0ZWFkIG9mIGRpcmVjdCBjYWxsIHRvIGZ1bmN0aW9uLgorCisgICAgICAgIHZvaWQgKiBwdHIgPSBhbGlnbmVkX21hbGxvYyggc2l6ZSApOyAgLy8gQmluZ28hIE1lbW9yeSBsZWFrIHdpbGwgYmUgcmVwb3J0ZWQgYXQgdGhpcyBsaW5lLgorCisKKyAgICAzLiBFbmFibGluZyBuYXRpdmUgbWVtb3J5IGRlYnVnZ2luZyBjYXBhYmlsaXRpZXMuCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgU29tZSBwbGF0Zm9ybXMgbWF5IG9mZmVyIG1lbW9yeSBkZWJ1Z2dpbmcgY2FwYWJpbGl0aWVzLiBGb3IgZXhhbXBsZSwgZGVidWcgdmVyc2lvbiBvZiBNaWNyb3NvZnQKKyAgICBSVEwgdHJhY2tzIGFsbCBtZW1vcnkgYWxsb2NhdGlvbnMgYW5kIGNhbiByZXBvcnQgbWVtb3J5IGxlYWtzLiBUaGlzIGhlYWRlciBlbmFibGVzIHRoaXMsIGFuZAorICAgIG1ha2VzIHJlcG9ydCBtb3JlIHVzZWZ1bCAoc2VlICJQYXNzaW5nIHNvdXJjZSBsb2NhdGlvbiBpbmZvIHRocm91Z2ggbWVtb3J5IGFsbG9jYXRpb24KKyAgICB3cmFwcGVycyIpLgorCisqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJrbXBfb3MuaCIKKworLy8gSW5jbHVkZSBhbGxvY2EoKSBkZWNsYXJhdGlvbi4KKyNpZiBLTVBfT1NfV0lORE9XUworICAgICNpbmNsdWRlIDxtYWxsb2MuaD4gICAgICAgIC8vIFdpbmRvd3MqIE9TOiBfYWxsb2NhKCkgZGVjbGFyZWQgaW4gIm1hbGxvYy5oIi4KKyAgICAjZGVmaW5lIGFsbG9jYSBfYWxsb2NhICAgICAvLyBBbGxvdyB0byB1c2UgYWxsb2NhKCkgd2l0aCBubyB1bmRlcnNjb3JlLgorI2VsaWYgS01QX09TX0ZSRUVCU0QgfHwgS01QX09TX05FVEJTRAorICAgIC8vIERlY2xhcmVkIGluICJzdGRsaWIuaCIuCisjZWxpZiBLTVBfT1NfVU5JWAorICAgICNpbmNsdWRlIDxhbGxvY2EuaD4gICAgICAgIC8vIExpbnV4KiBPUyBhbmQgT1MgWCo6IGFsbG9jKCkgZGVjbGFyZWQgaW4gImFsbG9jYSIuCisjZWxzZQorICAgICNlcnJvciBVbmtub3duIG9yIHVuc3VwcG9ydGVkIE9TLgorI2VuZGlmCisKKy8qCisgICAgS01QX1NSQ19MT0NfREVDTCAtLSBEZWNsYXJpbmcgc291cmNlIGxvY2F0aW9uIHBhcmFtZW10ZXJzLCB0byBiZSB1c2VkIGluIGZ1bmN0aW9uIGRlY2xhcmF0aW9uLgorICAgIEtNUF9TUkNfTE9DX1BBUk0gLS0gU291cmNlIGxvY2F0aW9uIHBhcmFtZW10ZXJzLCB0byBiZSB1c2VkIHRvIHBhc3MgcGFyYW1ldGVycyB0byB1bmRlcmx5aW5nCisgICAgICAgIGxldmVscy4KKyAgICBLTVBfU1JDX0xPQ19DVVJSIC0tIFNvdXJjZSBsb2NhdGlvbiBhcmd1bWVudHMgZGVzY3JpYmluZyBjdXJyZW50IGxvY2F0aW9uLCB0byBiZSB1c2VkIGF0CisgICAgICAgIHRvcC1sZXZlbC4KKworICAgIFR5cGljYWwgdXNhZ2U6CisKKyAgICAgICAgdm9pZCAqIF9hbGlnbmVkX21hbGxvYyggaW50IHNpemUgS01QX1NSQ19MT0NfREVDTCApIHsKKyAgICAgICAgICAgIC8vIE5vdGU6IENvbW1hIGlzIG1pc3NlZCBiZWZvcmUgS01QX1NSQ19MT0NfREVDTC4KKyAgICAgICAgICAgIEtFX1RSQUNFKCAyNSwgKCAiY2FsbGVkIGZyb20gJXM6JWRcbiIsIEtNUF9TUkNfTE9DX1BBUk0gKSApOworICAgICAgICAgICAgLi4uCisgICAgICAgIH0KKyAgICAgICAgI2RlZmluZSBhbGlnbmVkX21hbGxvYyggc2l6ZSApIF9hbGlnbmVkX21hbGxvYyggKHNpemUpIEtNUF9TUkNfTE9DX0NVUlIgKQorICAgICAgICAgICAgLy8gVXNlIG1hY3JvIGluc3RlYWQgb2YgZGlyZWN0IGNhbGwgdG8gZnVuY3Rpb24gLS0gbWFjcm8gcGFzc2VzIGluZm8gYWJvdXQgY3VycmVudAorICAgICAgICAgICAgLy8gc291cmNlIGxvY2F0aW9uIHRvIHRoZSBmdW5jLgorKi8KKyNpZiBLTVBfREVCVUcKKyAgICAjZGVmaW5lIEtNUF9TUkNfTE9DX0RFQ0wgICAgLCBjaGFyIGNvbnN0ICogX2ZpbGVfLCBpbnQgX2xpbmVfCisgICAgI2RlZmluZSBLTVBfU1JDX0xPQ19QQVJNICAgICwgX2ZpbGVfLCBfbGluZV8KKyAgICAjZGVmaW5lIEtNUF9TUkNfTE9DX0NVUlIgICAgLCBfX0ZJTEVfXywgX19MSU5FX18KKyNlbHNlCisgICAgI2RlZmluZSBLTVBfU1JDX0xPQ19ERUNMCisgICAgI2RlZmluZSBLTVBfU1JDX0xPQ19QQVJNCisgICAgI2RlZmluZSBLTVBfU1JDX0xPQ19DVVJSCisjZW5kaWYgLy8gS01QX0RFQlVHCisKKy8qCisgICAgbWFsbG9jX3NyY19sb2MoKSBhbmQgZnJlZV9zcmNfbG9jKCkgYXJlIHBzZXVkby1mdW5jdGlvbnMgKHJlYWxseSBtYWNyb3MpIHdpdGggYWNjZXB0cyBleHRyYQorICAgIGFyZ3VtZW50cyAoc291cmNlIGxvY2F0aW9uIGluZm8pIGluIGRlYnVnIG1vZGUuIFRoZXkgc2hvdWxkIGJlIHVzZWQgaW4gcGxhY2Ugb2YgbWFsbG9jKCkgYW5kCisgICAgZnJlZSgpLCB0aGlzIGFsbG93cyBlbmFibGluZyBuYXRpdmUgbWVtb3J5IGRlYnVnZ2luZyBjYXBhYmlsaXRpZXMgKGlmIGFueSkuCisKKyAgICBUeXBpY2FsIHVzYWdlOgorCisgICAgICAgIHB0ciA9IG1hbGxvY19zcmNfbG9jKCBzaXplIEtNUF9TUkNfTE9DX1BBUk0gKTsKKyAgICAgICAgICAgIC8vIEluc2lkZSBtZW1vcnkgYWxsb2NhdGlvbiB3cmFwcGVyLCBvcgorICAgICAgICBwdHIgPSBtYWxsb2Nfc3JjX2xvYyggc2l6ZSBLTVBfU1JDX0xPQ19DVVJSICk7CisgICAgICAgICAgICAvLyBPdXRzaWRlIG9mIG1lbW9yeSBhbGxvY2F0aW9uIHdyYXBwZXIuCisKKworKi8KKyNkZWZpbmUgbWFsbG9jX3NyY19sb2MoIGFyZ3MgKSAgICBfbWFsbG9jX3NyY19sb2MoIGFyZ3MgKQorI2RlZmluZSBmcmVlX3NyY19sb2MoICAgYXJncyApICAgIF9mcmVlX3NyY19sb2MoICAgYXJncyApCisgICAgLyoKKyAgICAgICAgRGVwZW5kaW5nIG9uIGJ1aWxkIG1vZGUgKGRlYnVnIG9yIHJlbGVhc2UpLCBtYWxsb2Nfc3JjX2xvYyBpcyBkZWNsYXJlZCB3aXRoIDEgb3IgMworICAgICAgICBwYXJhbWV0ZXJzLCBidXQgY2FsbHMgdG8gbWFsbG9jX3NyY19sb2MoKSBhcmUgYWx3YXlzIHRoZSBzYW1lOgorCisgICAgICAgICAgICAuLi4gbWFsbG9jX3NyY19sb2MoIHNpemUgS01QX1NSQ19MT0NfUEFSTSApOyAvLyBvciBLTVBfU1JDX0xPQ19DVVJSCisKKyAgICAgICAgQ29tcGlsZXIgaXNzdWVzIHdhcm5pbmcvZXJyb3IgInRvbyBmZXcgYXJndW1lbnRzIGluIG1hY3JvIGludm9jYXRpb24iLiBEZWNsYXJpbmcgdHdvCisgICAgICAgIG1hY3Jvc2VzLCBtYWxsb2Nfc3JjX2xvYygpIGFuZCBfbWFsbG9jX3NyY19sb2MoKSBvdmVyY29tZXMgdGhlIHByb2JsZW0uCisgICAgKi8KKworI2lmIEtNUF9ERUJVRworCisgICAgI2lmIEtNUF9PU19XSU5ET1dTICYmIF9ERUJVRworICAgICAgICAvLyBLTVBfREVCVUcgIT0gX0RFQlVHLiBNUyBkZWJ1ZyBSVEwgaXMgYXZhaWxhYmxlIG9ubHkgaWYgX0RFQlVHIGlzIGRlZmluZWQuCisKKyAgICAgICAgLy8gV2luZG93cyogT1MgaGFzIG5hdGl2ZSBtZW1vcnkgZGVidWdnaW5nIGNhcGFiaWxpdGllcy4gRW5hYmxlIHRoZW0uCisKKyAgICAgICAgI2luY2x1ZGUgPGNydGRiZy5oPgorCisgICAgICAgICNkZWZpbmUgS01QX01FTV9CTE9DSyAgICAgICAgICAgX0NMSUVOVF9CTE9DSworICAgICAgICAjZGVmaW5lIG1hbGxvYyggc2l6ZSApICAgICAgICAgIF9tYWxsb2NfZGJnKCAoc2l6ZSksIEtNUF9NRU1fQkxPQ0ssIF9fRklMRV9fLCBfX0xJTkVfXyApCisgICAgICAgICNkZWZpbmUgY2FsbG9jKCBudW0sIHNpemUgKSAgICAgX2NhbGxvY19kYmcoIChudW0pLCAoc2l6ZSksIEtNUF9NRU1fQkxPQ0ssIF9fRklMRV9fLCBfX0xJTkVfXyApCisgICAgICAgICNkZWZpbmUgcmVhbGxvYyggcHRyLCBzaXplICkgICAgX3JlYWxsb2NfZGJnKCAocHRyKSwgKHNpemUpLCBLTVBfTUVNX0JMT0NLLCBfX0ZJTEVfXywgX19MSU5FX18gKQorICAgICAgICAjZGVmaW5lIGZyZWUoIHB0ciApICAgICAgICAgICAgIF9mcmVlX2RiZyggKHB0ciksIEtNUF9NRU1fQkxPQ0sgKQorCisgICAgICAgICNkZWZpbmUgX21hbGxvY19zcmNfbG9jKCBzaXplLCBmaWxlLCBsaW5lICkgIF9tYWxsb2NfZGJnKCAoc2l6ZSksIEtNUF9NRU1fQkxPQ0ssIChmaWxlKSwgKGxpbmUpICkKKyAgICAgICAgI2RlZmluZSBfZnJlZV9zcmNfbG9jKCAgICBwdHIsIGZpbGUsIGxpbmUgKSAgX2ZyZWVfZGJnKCAgIChwdHIpLCAgS01QX01FTV9CTE9DSyAgICAgICAgICAgICAgICAgKQorCisgICAgI2Vsc2UKKworICAgICAgICAvLyBMaW51eCogT1MsIE9TIFgqLCBvciBub24tZGVidWcgV2luZG93cyogT1MuCisKKyAgICAgICAgI2RlZmluZSBfbWFsbG9jX3NyY19sb2MoIHNpemUsIGZpbGUsIGxpbmUgKSAgICBtYWxsb2MoIChzaXplKSApCisgICAgICAgICNkZWZpbmUgX2ZyZWVfc3JjX2xvYyggcHRyLCBmaWxlLCBsaW5lICkgICAgICAgZnJlZSggKHB0cikgKQorCisgICAgI2VuZGlmCisKKyNlbHNlCisKKyAgICAvLyBJbiByZWxlYXNlIGJ1aWxkIG1hbGxvY19zcmNfbG9jKCkgYW5kIGZyZWVfc3JjX2xvYygpIGRvIG5vdCBoYXZlIGV4dHJhIHBhcmFtZXRlcnMuCisgICAgI2RlZmluZSBfbWFsbG9jX3NyY19sb2MoIHNpemUgKSAgICBtYWxsb2MoIChzaXplKSApCisgICAgI2RlZmluZSBfZnJlZV9zcmNfbG9jKCBwdHIgKSAgICAgICBmcmVlKCAocHRyKSApCisKKyNlbmRpZiAvLyBLTVBfREVCVUcKKworI2VuZGlmIC8vIEtNUF9XUkFQUEVSX01BTExPQ19ICisKKy8vIGVuZCBvZiBmaWxlIC8vCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9saWJvbXAucmMudmFyIGIvZmluYWwvcnVudGltZS9zcmMvbGlib21wLnJjLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjZhOWM5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvbGlib21wLnJjLnZhcgpAQCAtMCwwICsxLDcwIEBACisvLyBsaWJvbXAucmMudmFyCisKKy8vCisvLy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8vCisvLy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vLy8KKy8vLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8vLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vLy8KKy8vLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisKKyNpbmNsdWRlICJ3aW5yZXMuaCIKKyNpbmNsdWRlICJrbXBfY29uZmlnLmgiCisKK0xBTkdVQUdFIExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX1VTICAgIC8vIEVuZ2xpc2ggKFUuUy4pIHJlc291cmNlcworI3ByYWdtYSBjb2RlX3BhZ2UoMTI1MikKKworVlNfVkVSU0lPTl9JTkZPIFZFUlNJT05JTkZPCisgICAgLy8gUGFydHMgb2YgRklMRVZFUlNJT04gYW5kIFBST0RVQ1RWRVJTSU9OIGFyZSAxNi1iaXQgZmllbGRzLCBlbnRpcmUgYnVpbGQgZGF0ZSB5eXl5bW1kZAorICAgIC8vIGRvZXMgbm90IGZpdCBpbnRvIG9uZSB2ZXJzaW9uIHBhcnQsIHNvIHdlIG5lZWQgdG8gc3BsaXQgaXQgaW50byB5eXl5IGFuZCBtbWRkOgorICAgIEZJTEVWRVJTSU9OICAgIEBMSUJPTVBfVkVSU0lPTl9NQUpPUkAsQExJQk9NUF9WRVJTSU9OX01JTk9SQCxATElCT01QX1ZFUlNJT05fQlVJTERfWUVBUkAsQExJQk9NUF9WRVJTSU9OX0JVSUxEX01PTlRIX0RBWUAKKyAgICBQUk9EVUNUVkVSU0lPTiBATElCT01QX1ZFUlNJT05fTUFKT1JALEBMSUJPTVBfVkVSU0lPTl9NSU5PUkAsQExJQk9NUF9WRVJTSU9OX0JVSUxEX1lFQVJALEBMSUJPTVBfVkVSU0lPTl9CVUlMRF9NT05USF9EQVlACisgICAgRklMRUZMQUdTTUFTSyAgVlNfRkZJX0ZJTEVGTEFHU01BU0sKKyAgICBGSUxFRkxBR1MgICAgICAwCisjaWYgS01QX0RFQlVHCisgICAgICAgIHwgVlNfRkZfREVCVUcKKyNlbmRpZgorI2lmIEBMSUJPTVBfVkVSU0lPTl9CVUlMREAgPT0gMAorICAgICAgICB8IFZTX0ZGX1BSSVZBVEVCVUlMRCB8IFZTX0ZGX1BSRVJFTEVBU0UKKyNlbmRpZgorICAgIEZJTEVPUyAgICAgICAgICBWT1NfTlRfV0lORE9XUzMyICAgIC8vIFdpbmRvd3MqIFNlcnZlciogMjAwMywgWFAqLCAyMDAwLCBvciBOVCoKKyAgICBGSUxFVFlQRSAgICAgICAgVkZUX0RMTAorICAgIEJFR0lOCisgICAgICAgIEJMT0NLICJTdHJpbmdGaWxlSW5mbyIKKyAgICAgICAgQkVHSU4KKyAgICAgICAgICAgIEJMT0NLICIwNDA5MDRiMCIgICAgICAgICAgICAvLyBVLlMuIEVuZ2xpc2gsIFVuaWNvZGUgKDB4MDRiMCA9PSAxMjAwKQorICAgICAgICAgICAgQkVHSU4KKworICAgICAgICAgICAgICAgIC8vIEZpbGVEZXNjcmlwdGlvbiBhbmQgTGVnYWxDb3B5cmlnaHQgc2hvdWxkIGJlIHNob3J0LgorICAgICAgICAgICAgICAgIFZBTFVFICJGaWxlRGVzY3JpcHRpb24iLCAgIkxMVk0qIE9wZW5NUCogUnVudGltZSBMaWJyYXJ5XDAiCisgICAgICAgICAgICAgICAgLy8gRm9sbG93aW5nIHZhbHVlcyBtYXkgYmUgcmVsYXRpdmVseSBsb25nLgorICAgICAgICAgICAgICAgIFZBTFVFICJDb21wYW55TmFtZSIsICAgICAgIkxMVk1cMCIKKyAgICAgICAgICAgICAgICAvLyBWQUxVRSAiTGVnYWxUcmFkZW1hcmtzIiwgICJcMCIgIC8vIE5vdCB1c2VkIGZvciBub3cuCisgICAgICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3ROYW1lIiwgICAgICAiTExWTSogT3Blbk1QKiBSdW50aW1lIExpYnJhcnlcMCIKKyAgICAgICAgICAgICAgICBWQUxVRSAiUHJvZHVjdFZlcnNpb24iLCAgICJATElCT01QX1ZFUlNJT05fTUFKT1JALkBMSUJPTVBfVkVSU0lPTl9NSU5PUkBcMCIKKyAgICAgICAgICAgICAgICBWQUxVRSAiRmlsZVZlcnNpb24iLCAgICAgICJATElCT01QX1ZFUlNJT05fQlVJTERAXDAiCisgICAgICAgICAgICAgICAgVkFMVUUgIkludGVybmFsTmFtZSIsICAgICAiQExJQk9NUF9MSUJfRklMRUBcMCIKKyAgICAgICAgICAgICAgICBWQUxVRSAiT3JpZ2luYWxGaWxlbmFtZSIsICJATElCT01QX0xJQl9GSUxFQFwwIgorICAgICAgICAgICAgICAgIFZBTFVFICJDb21tZW50cyIsCisgICAgICAgICAgICAgICAgICAgICJMTFZNKiBPcGVuTVAqIEBMSUJPTVBfTEVHQUxfVFlQRUAgTGlicmFyeSAiCisgICAgICAgICAgICAgICAgICAgICJ2ZXJzaW9uIEBMSUJPTVBfVkVSU0lPTl9NQUpPUkAuQExJQk9NUF9WRVJTSU9OX01JTk9SQC5ATElCT01QX1ZFUlNJT05fQlVJTERAICIKKyAgICAgICAgICAgICAgICAgICAgImZvciBATElCT01QX0xFR0FMX0FSQ0hAIGFyY2hpdGVjdHVyZSBidWlsdCBvbiBATElCT01QX0JVSUxEX0RBVEVALlwwIgorI2lmIEBMSUJPTVBfVkVSU0lPTl9CVUlMREAgPT0gMAorICAgICAgICAgICAgICAgICAgICBWQUxVRSAiUHJpdmF0ZUJ1aWxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIGlzIGEgZGV2ZWxvcG1lbnQgYnVpbGQuXDAiCisjZW5kaWYKKyAgICAgICAgICAgICAgICAvLyBWQUxVRSAiU3BlY2lhbEJ1aWxkIiwgICAgICJcMCIgICAgLy8gTm90IHVzZWQgZm9yIG5vdy4KKworICAgICAgICAgICAgRU5ECisgICAgICAgIEVORAorICAgICAgICBCTE9DSyAiVmFyRmlsZUluZm8iCisgICAgICAgIEJFR0lOCisgICAgICAgICAgICBWQUxVRSAiVHJhbnNsYXRpb24iLCAxMDMzLCAxMjAwCisgICAgICAgICAgICAvLyAxMDMzIC0tIFUuUy4gRW5nbGlzaCwgMTIwMCAtLSBVbmljb2RlCisgICAgICAgIEVORAorICAgIEVORAorCisvLyBlbmQgb2YgZmlsZSAvLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvb21wdC1ldmVudC1zcGVjaWZpYy5oIGIvZmluYWwvcnVudGltZS9zcmMvb21wdC1ldmVudC1zcGVjaWZpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YzE1MTIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9vbXB0LWV2ZW50LXNwZWNpZmljLmgKQEAgLTAsMCArMSwxNDQgQEAKKyNpZm5kZWYgIF9fT01QVF9FVkVOVF9TUEVDSUZJQ19IX18KKyNkZWZpbmUgIF9fT01QVF9FVkVOVF9TUEVDSUZJQ19IX18KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRmlsZTogb21wdC1ldmVudC1zcGVjaWZpYy5oCisgKgorICogRGVzY3JpcHRpb246CisgKgorICogICBzcGVjaWZ5IHdoaWNoIG9mIHRoZSBPTVBUIGV2ZW50cyBhcmUgaW1wbGVtZW50ZWQgYnkgdGhpcyBydW50aW1lIHN5c3RlbQorICogICBhbmQgdGhlIGxldmVsIG9mIHRoZWlyIGltcGxlbWVudGF0aW9uIGJ5IGEgcnVudGltZSBzeXN0ZW0uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgX29tcHRfdG9rZW5wYXN0ZV9oZWxwZXIoeCx5KSAgICAgICAgeCAjIyB5CisjZGVmaW5lIF9vbXB0X3Rva2VucGFzdGUoeCx5KSAgICAgICAgICAgICAgIF9vbXB0X3Rva2VucGFzdGVfaGVscGVyKHgseSkKKyNkZWZpbmUgb21wdF9ldmVudF9pbXBsZW1lbnRhdGlvbl9zdGF0dXMoZSkgX29tcHRfdG9rZW5wYXN0ZShlLF9pbXBsZW1lbnRlZCkKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyB8IFNwZWNpZnkgd2hldGhlciBhbiBldmVudCBtYXkgb2NjdXIgb3Igbm90LCBhbmQgd2hldGhlciBldmVudCBjYWxsYmFja3MKKyB8IG5ldmVyLCBzb21ldGltZXMsIG9yIGFsd2F5cyBvY2N1ci4KKyB8CisgfCBUaGUgdmFsdWVzIGZvciB0aGVzZSBjb25zdGFudHMgYXJlIGRlZmluZWQgaW4gc2VjdGlvbiA2LjEuMiBvZgorIHwgdGhlIE9NUFQgVFIuIFRoZXkgYXJlIGV4cG9zZWQgdG8gdG9vbHMgdGhyb3VnaCBvbXB0X3NldF9jYWxsYmFjay4KKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIG9tcHRfZXZlbnRfTkVWRVIgICAgICAgICAgICAgb21wdF9zZXRfcmVzdWx0X2V2ZW50X25ldmVyX29jY3VycworI2RlZmluZSBvbXB0X2V2ZW50X1VOSU1QTEVNRU5URUQgICAgIG9tcHRfc2V0X3Jlc3VsdF9ldmVudF9tYXlfb2NjdXJfbm9fY2FsbGJhY2sKKyNkZWZpbmUgb21wdF9ldmVudF9NQVlfQ09OVkVOSUVOVCAgICBvbXB0X3NldF9yZXN1bHRfZXZlbnRfbWF5X29jY3VyX2NhbGxiYWNrX3NvbWUKKyNkZWZpbmUgb21wdF9ldmVudF9NQVlfQUxXQVlTICAgICAgICBvbXB0X3NldF9yZXN1bHRfZXZlbnRfbWF5X29jY3VyX2NhbGxiYWNrX2Fsd2F5cworCisjaWYgT01QVF9UUkFDRQorI2RlZmluZSBvbXB0X2V2ZW50X01BWV9BTFdBWVNfVFJBQ0UgICBvbXB0X2V2ZW50X01BWV9BTFdBWVMKKyNlbHNlCisjZGVmaW5lIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRSAgIG9tcHRfZXZlbnRfVU5JTVBMRU1FTlRFRAorI2VuZGlmCisKKyNpZiBPTVBUX0JMQU1FCisjZGVmaW5lIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19CTEFNRSAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZUworI2Vsc2UKKyNkZWZpbmUgb21wdF9ldmVudF9NQVlfQUxXQVlTX0JMQU1FICAgb21wdF9ldmVudF9VTklNUExFTUVOVEVECisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgfCBNYW5kYXRvcnkgRXZlbnRzCisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBvbXB0X2V2ZW50X3BhcmFsbGVsX2JlZ2luX2ltcGxlbWVudGVkICAgICAgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVMKKyNkZWZpbmUgb21wdF9ldmVudF9wYXJhbGxlbF9lbmRfaW1wbGVtZW50ZWQgICAgICAgICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTCisKKyNkZWZpbmUgb21wdF9ldmVudF90YXNrX2JlZ2luX2ltcGxlbWVudGVkICAgICAgICAgICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTCisjZGVmaW5lIG9tcHRfZXZlbnRfdGFza19lbmRfaW1wbGVtZW50ZWQgICAgICAgICAgICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZUworCisjZGVmaW5lIG9tcHRfZXZlbnRfdGhyZWFkX2JlZ2luX2ltcGxlbWVudGVkICAgICAgICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZUworI2RlZmluZSBvbXB0X2V2ZW50X3RocmVhZF9lbmRfaW1wbGVtZW50ZWQgICAgICAgICAgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVMKKworI2RlZmluZSBvbXB0X2V2ZW50X2NvbnRyb2xfaW1wbGVtZW50ZWQgICAgICAgICAgICAgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVMKKworI2RlZmluZSBvbXB0X2V2ZW50X3J1bnRpbWVfc2h1dGRvd25faW1wbGVtZW50ZWQgICAgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVMKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyB8IE9wdGlvbmFsIEV2ZW50cyAoYmxhbWUgc2hpZnRpbmcpCisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBvbXB0X2V2ZW50X2lkbGVfYmVnaW5faW1wbGVtZW50ZWQgICAgICAgICAgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfQkxBTUUKKyNkZWZpbmUgb21wdF9ldmVudF9pZGxlX2VuZF9pbXBsZW1lbnRlZCAgICAgICAgICAgICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTX0JMQU1FCisKKyNkZWZpbmUgb21wdF9ldmVudF93YWl0X2JhcnJpZXJfYmVnaW5faW1wbGVtZW50ZWQgICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTX0JMQU1FCisjZGVmaW5lIG9tcHRfZXZlbnRfd2FpdF9iYXJyaWVyX2VuZF9pbXBsZW1lbnRlZCAgICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19CTEFNRQorCisjZGVmaW5lIG9tcHRfZXZlbnRfd2FpdF90YXNrd2FpdF9iZWdpbl9pbXBsZW1lbnRlZCAgICAgIG9tcHRfZXZlbnRfVU5JTVBMRU1FTlRFRAorI2RlZmluZSBvbXB0X2V2ZW50X3dhaXRfdGFza3dhaXRfZW5kX2ltcGxlbWVudGVkICAgICAgICBvbXB0X2V2ZW50X1VOSU1QTEVNRU5URUQKKworI2RlZmluZSBvbXB0X2V2ZW50X3dhaXRfdGFza2dyb3VwX2JlZ2luX2ltcGxlbWVudGVkICAgICBvbXB0X2V2ZW50X1VOSU1QTEVNRU5URUQKKyNkZWZpbmUgb21wdF9ldmVudF93YWl0X3Rhc2tncm91cF9lbmRfaW1wbGVtZW50ZWQgICAgICAgb21wdF9ldmVudF9VTklNUExFTUVOVEVECisKKyNkZWZpbmUgb21wdF9ldmVudF9yZWxlYXNlX2xvY2tfaW1wbGVtZW50ZWQgICAgICAgICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTX0JMQU1FCisjZGVmaW5lIG9tcHRfZXZlbnRfcmVsZWFzZV9uZXN0X2xvY2tfbGFzdF9pbXBsZW1lbnRlZCAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19CTEFNRQorI2RlZmluZSBvbXB0X2V2ZW50X3JlbGVhc2VfY3JpdGljYWxfaW1wbGVtZW50ZWQgICAgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfQkxBTUUKKyNkZWZpbmUgb21wdF9ldmVudF9yZWxlYXNlX2F0b21pY19pbXBsZW1lbnRlZCAgICAgICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTX0JMQU1FCisjZGVmaW5lIG9tcHRfZXZlbnRfcmVsZWFzZV9vcmRlcmVkX2ltcGxlbWVudGVkICAgICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19CTEFNRQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHwgT3B0aW9uYWwgRXZlbnRzIChzeW5jaHJvbm91cyBldmVudHMpCisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW5faW1wbGVtZW50ZWQgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfVFJBQ0UKKyNkZWZpbmUgb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZF9pbXBsZW1lbnRlZCAgICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTX1RSQUNFCisKKyNkZWZpbmUgb21wdF9ldmVudF9pbml0aWFsX3Rhc2tfYmVnaW5faW1wbGVtZW50ZWQgICAgICAgb21wdF9ldmVudF9VTklNUExFTUVOVEVECisjZGVmaW5lIG9tcHRfZXZlbnRfaW5pdGlhbF90YXNrX2VuZF9pbXBsZW1lbnRlZCAgICAgICAgIG9tcHRfZXZlbnRfVU5JTVBMRU1FTlRFRAorCisjZGVmaW5lIG9tcHRfZXZlbnRfdGFza19zd2l0Y2hfaW1wbGVtZW50ZWQgICAgICAgICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorCisjZGVmaW5lIG9tcHRfZXZlbnRfbG9vcF9iZWdpbl9pbXBsZW1lbnRlZCAgICAgICAgICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorI2RlZmluZSBvbXB0X2V2ZW50X2xvb3BfZW5kX2ltcGxlbWVudGVkICAgICAgICAgICAgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfVFJBQ0UKKworI2RlZmluZSBvbXB0X2V2ZW50X3NlY3Rpb25zX2JlZ2luX2ltcGxlbWVudGVkICAgICAgICAgICBvbXB0X2V2ZW50X1VOSU1QTEVNRU5URUQKKyNkZWZpbmUgb21wdF9ldmVudF9zZWN0aW9uc19lbmRfaW1wbGVtZW50ZWQgICAgICAgICAgICAgb21wdF9ldmVudF9VTklNUExFTUVOVEVECisKKyNkZWZpbmUgb21wdF9ldmVudF9zaW5nbGVfaW5fYmxvY2tfYmVnaW5faW1wbGVtZW50ZWQgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTX1RSQUNFCisjZGVmaW5lIG9tcHRfZXZlbnRfc2luZ2xlX2luX2Jsb2NrX2VuZF9pbXBsZW1lbnRlZCAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorI2RlZmluZSBvbXB0X2V2ZW50X3NpbmdsZV9vdGhlcnNfYmVnaW5faW1wbGVtZW50ZWQgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfVFJBQ0UKKyNkZWZpbmUgb21wdF9ldmVudF9zaW5nbGVfb3RoZXJzX2VuZF9pbXBsZW1lbnRlZCAgICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTX1RSQUNFCisKKyNkZWZpbmUgb21wdF9ldmVudF93b3Jrc2hhcmVfYmVnaW5faW1wbGVtZW50ZWQgICAgICAgICAgb21wdF9ldmVudF9VTklNUExFTUVOVEVECisjZGVmaW5lIG9tcHRfZXZlbnRfd29ya3NoYXJlX2VuZF9pbXBsZW1lbnRlZCAgICAgICAgICAgIG9tcHRfZXZlbnRfVU5JTVBMRU1FTlRFRAorCisjZGVmaW5lIG9tcHRfZXZlbnRfbWFzdGVyX2JlZ2luX2ltcGxlbWVudGVkICAgICAgICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorI2RlZmluZSBvbXB0X2V2ZW50X21hc3Rlcl9lbmRfaW1wbGVtZW50ZWQgICAgICAgICAgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfVFJBQ0UKKworI2RlZmluZSBvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW5faW1wbGVtZW50ZWQgICAgICAgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfVFJBQ0UKKyNkZWZpbmUgb21wdF9ldmVudF9iYXJyaWVyX2VuZF9pbXBsZW1lbnRlZCAgICAgICAgICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTX1RSQUNFCisKKyNkZWZpbmUgb21wdF9ldmVudF90YXNrd2FpdF9iZWdpbl9pbXBsZW1lbnRlZCAgICAgICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTX1RSQUNFCisjZGVmaW5lIG9tcHRfZXZlbnRfdGFza3dhaXRfZW5kX2ltcGxlbWVudGVkICAgICAgICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorCisjZGVmaW5lIG9tcHRfZXZlbnRfdGFza2dyb3VwX2JlZ2luX2ltcGxlbWVudGVkICAgICAgICAgIG9tcHRfZXZlbnRfVU5JTVBMRU1FTlRFRAorI2RlZmluZSBvbXB0X2V2ZW50X3Rhc2tncm91cF9lbmRfaW1wbGVtZW50ZWQgICAgICAgICAgICBvbXB0X2V2ZW50X1VOSU1QTEVNRU5URUQKKworI2RlZmluZSBvbXB0X2V2ZW50X3JlbGVhc2VfbmVzdF9sb2NrX3ByZXZfaW1wbGVtZW50ZWQgICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfVFJBQ0UKKyNkZWZpbmUgb21wdF9ldmVudF93YWl0X2xvY2tfaW1wbGVtZW50ZWQgICAgICAgICAgICAgICAgb21wdF9ldmVudF9VTklNUExFTUVOVEVECisjZGVmaW5lIG9tcHRfZXZlbnRfd2FpdF9uZXN0X2xvY2tfaW1wbGVtZW50ZWQgICAgICAgICAgIG9tcHRfZXZlbnRfVU5JTVBMRU1FTlRFRAorI2RlZmluZSBvbXB0X2V2ZW50X3dhaXRfY3JpdGljYWxfaW1wbGVtZW50ZWQgICAgICAgICAgICBvbXB0X2V2ZW50X1VOSU1QTEVNRU5URUQKKyNkZWZpbmUgb21wdF9ldmVudF93YWl0X2F0b21pY19pbXBsZW1lbnRlZCAgICAgICAgICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTX1RSQUNFCisjZGVmaW5lIG9tcHRfZXZlbnRfd2FpdF9vcmRlcmVkX2ltcGxlbWVudGVkICAgICAgICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorCisjZGVmaW5lIG9tcHRfZXZlbnRfYWNxdWlyZWRfbG9ja19pbXBsZW1lbnRlZCAgICAgICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorI2RlZmluZSBvbXB0X2V2ZW50X2FjcXVpcmVkX25lc3RfbG9ja19maXJzdF9pbXBsZW1lbnRlZCBvbXB0X2V2ZW50X01BWV9BTFdBWVNfVFJBQ0UKKyNkZWZpbmUgb21wdF9ldmVudF9hY3F1aXJlZF9uZXN0X2xvY2tfbmV4dF9pbXBsZW1lbnRlZCAgb21wdF9ldmVudF9NQVlfQUxXQVlTX1RSQUNFCisjZGVmaW5lIG9tcHRfZXZlbnRfYWNxdWlyZWRfY3JpdGljYWxfaW1wbGVtZW50ZWQgICAgICAgIG9tcHRfZXZlbnRfVU5JTVBMRU1FTlRFRAorI2RlZmluZSBvbXB0X2V2ZW50X2FjcXVpcmVkX2F0b21pY19pbXBsZW1lbnRlZCAgICAgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfVFJBQ0UKKyNkZWZpbmUgb21wdF9ldmVudF9hY3F1aXJlZF9vcmRlcmVkX2ltcGxlbWVudGVkICAgICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTX1RSQUNFCisKKyNkZWZpbmUgb21wdF9ldmVudF9pbml0X2xvY2tfaW1wbGVtZW50ZWQgICAgICAgICAgICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTX1RSQUNFCisjZGVmaW5lIG9tcHRfZXZlbnRfaW5pdF9uZXN0X2xvY2tfaW1wbGVtZW50ZWQgICAgICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorCisjZGVmaW5lIG9tcHRfZXZlbnRfZGVzdHJveV9sb2NrX2ltcGxlbWVudGVkICAgICAgICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorI2RlZmluZSBvbXB0X2V2ZW50X2Rlc3Ryb3lfbmVzdF9sb2NrX2ltcGxlbWVudGVkICAgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfVFJBQ0UKKworI2RlZmluZSBvbXB0X2V2ZW50X2ZsdXNoX2ltcGxlbWVudGVkICAgICAgICAgICAgICAgICAgICBvbXB0X2V2ZW50X1VOSU1QTEVNRU5URUQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9vbXB0LWdlbmVyYWwuYyBiL2ZpbmFsL3J1bnRpbWUvc3JjL29tcHQtZ2VuZXJhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkYWFlODEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9vbXB0LWdlbmVyYWwuYwpAQCAtMCwwICsxLDUzNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBzeXN0ZW0gaW5jbHVkZSBmaWxlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIG9tcHQgaW5jbHVkZSBmaWxlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJvbXB0LXNwZWNpZmljLmMiCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIG1hY3JvcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgb21wdF9nZXRfY2FsbGJhY2tfc3VjY2VzcyAxCisjZGVmaW5lIG9tcHRfZ2V0X2NhbGxiYWNrX2ZhaWx1cmUgMAorCisjZGVmaW5lIG5vX3Rvb2xfcHJlc2VudCAwCisKKyNkZWZpbmUgT01QVF9BUElfUk9VVElORSBzdGF0aWMKKworI2lmbmRlZiBPTVBUX1NUUl9NQVRDSAorI2RlZmluZSBPTVBUX1NUUl9NQVRDSChoYXlzdGFjaywgbmVlZGxlKSAoIXN0cmNhc2VjbXAoaGF5c3RhY2ssIG5lZWRsZSkpCisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHR5cGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIgKnN0YXRlX25hbWU7CisgICAgb21wdF9zdGF0ZV90ICBzdGF0ZV9pZDsKK30gb21wdF9zdGF0ZV9pbmZvX3Q7CisKKworZW51bSB0b29sX3NldHRpbmdfZSB7CisgICAgb21wX3Rvb2xfZXJyb3IsCisgICAgb21wX3Rvb2xfdW5zZXQsCisgICAgb21wX3Rvb2xfZGlzYWJsZWQsCisgICAgb21wX3Rvb2xfZW5hYmxlZAorfTsKKworCit0eXBlZGVmIHZvaWQgKCpvbXB0X2luaXRpYWxpemVfdCkgKAorICAgIG9tcHRfZnVuY3Rpb25fbG9va3VwX3Qgb21wdF9mbl9sb29rdXAsIAorICAgIGNvbnN0IGNoYXIgKnZlcnNpb24sCisgICAgdW5zaWduZWQgaW50IG9tcHRfdmVyc2lvbgorKTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2xvYmFsIHZhcmlhYmxlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBvbXB0X2VuYWJsZWQgPSAwOworCitvbXB0X3N0YXRlX2luZm9fdCBvbXB0X3N0YXRlX2luZm9bXSA9IHsKKyNkZWZpbmUgb21wdF9zdGF0ZV9tYWNybyhzdGF0ZSwgY29kZSkgeyAjIHN0YXRlLCBzdGF0ZSB9LAorICAgIEZPUkVBQ0hfT01QVF9TVEFURShvbXB0X3N0YXRlX21hY3JvKQorI3VuZGVmIG9tcHRfc3RhdGVfbWFjcm8KK307CisKK29tcHRfY2FsbGJhY2tzX3Qgb21wdF9jYWxsYmFja3M7CisKK3N0YXRpYyBvbXB0X2luaXRpYWxpemVfdCAgb21wdF9pbml0aWFsaXplX2ZuID0gTlVMTDsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZm9yd2FyZCBkZWNsYXJhdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgb21wdF9pbnRlcmZhY2VfZm5fdCBvbXB0X2ZuX2xvb2t1cChjb25zdCBjaGFyICpzKTsKKworT01QVF9BUElfUk9VVElORSBvbXB0X3RocmVhZF9pZF90IG9tcHRfZ2V0X3RocmVhZF9pZCh2b2lkKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGluaXRpYWxpemF0aW9uIGFuZCBmaW5hbGl6YXRpb24gKHByaXZhdGUgb3BlcmF0aW9ucykKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBPbiBVbml4LWxpa2Ugc3lzdGVtcyB0aGF0IHN1cHBvcnQgd2VhayBzeW1ib2xzIHRoZSBmb2xsb3dpbmcgaW1wbGVtZW50YXRpb24KKyAqIG9mIG9tcHRfdG9vbCgpIHdpbGwgYmUgdXNlZCBpbiBjYXNlIG5vIHRvb2wtc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YKKyAqIHRoaXMgZnVuY3Rpb24gaXMgcHJlc2VudCBpbiB0aGUgYWRkcmVzcyBzcGFjZSBvZiBhIHByb2Nlc3MuCisgKgorICogT24gV2luZG93cywgdGhlIG9tcHRfdG9vbF93aW5kb3dzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZmluZCB0aGUKKyAqIG9tcHRfdG9vbCBzeW1ib2wgYWNyb3NzIGFsbCBtb2R1bGVzIGxvYWRlZCBieSBhIHByb2Nlc3MuIElmIG9tcHRfdG9vbCBpcworICogZm91bmQsIG9tcHRfdG9vbCdzIHJldHVybiB2YWx1ZSBpcyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIHRvb2wuIE90aGVyd2lzZSwKKyAqIE5VTEwgaXMgcmV0dXJuZWQgYW5kIE9NUFQgd29uJ3QgYmUgZW5hYmxlZCAqLworI2lmIE9NUFRfSEFWRV9XRUFLX0FUVFJJQlVURQorX09NUF9FWFRFUk4gCitfX2F0dHJpYnV0ZV9fICgoIHdlYWsgKSkKK29tcHRfaW5pdGlhbGl6ZV90IG9tcHRfdG9vbCgpCit7CisjaWYgT01QVF9ERUJVRworICAgIHByaW50Zigib21wdF90b29sKCkgaXMgY2FsbGVkIGZyb20gdGhlIFJUTFxuIik7CisjZW5kaWYKKyAgICByZXR1cm4gTlVMTDsKK30KKworI2VsaWYgT01QVF9IQVZFX1BTQVBJCisKKyNpbmNsdWRlIDxwc2FwaS5oPgorI3ByYWdtYSBjb21tZW50KGxpYiwgInBzYXBpLmxpYiIpCisjZGVmaW5lIG9tcHRfdG9vbCBvbXB0X3Rvb2xfd2luZG93cworCisvLyBUaGUgbnVtYmVyIG9mIGxvYWRlZCBtb2R1bGVzIHRvIHN0YXJ0IGVudW1lcmF0aW9uIHdpdGggRW51bVByb2Nlc3NNb2R1bGVzKCkKKyNkZWZpbmUgTlVNX01PRFVMRVMgMTI4CisKK3N0YXRpYworb21wdF9pbml0aWFsaXplX3Qgb21wdF90b29sX3dpbmRvd3MoKQoreworICAgIGludCBpOworICAgIERXT1JEIG5lZWRlZCwgbmV3X3NpemU7CisgICAgSE1PRFVMRSAqbW9kdWxlczsKKyAgICBIQU5ETEUgIHByb2Nlc3MgPSBHZXRDdXJyZW50UHJvY2VzcygpOworICAgIG1vZHVsZXMgPSAoSE1PRFVMRSopbWFsbG9jKCBOVU1fTU9EVUxFUyAqIHNpemVvZihITU9EVUxFKSApOworICAgIG9tcHRfaW5pdGlhbGl6ZV90ICgqb21wdF90b29sX3ApKCkgPSBOVUxMOworCisjaWYgT01QVF9ERUJVRworICAgIHByaW50Zigib21wdF90b29sX3dpbmRvd3MoKTogbG9va2luZyBmb3Igb21wdF90b29sXG4iKTsKKyNlbmRpZgorICAgIGlmICghRW51bVByb2Nlc3NNb2R1bGVzKCBwcm9jZXNzLCBtb2R1bGVzLCBOVU1fTU9EVUxFUyAqIHNpemVvZihITU9EVUxFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZWVkZWQpKSB7CisgICAgICAgIC8vIFJlZ2FyZGxlc3Mgb2YgdGhlIGVycm9yIHJlYXNvbiB1c2UgdGhlIHN0dWIgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24KKyAgICAgICAgZnJlZShtb2R1bGVzKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIC8vIENoZWNrIGlmIE5VTV9NT0RVTEVTIGlzIGVub3VnaCB0byBsaXN0IGFsbCBtb2R1bGVzCisgICAgbmV3X3NpemUgPSBuZWVkZWQgLyBzaXplb2YoSE1PRFVMRSk7CisgICAgaWYgKG5ld19zaXplID4gTlVNX01PRFVMRVMpIHsKKyNpZiBPTVBUX0RFQlVHCisgICAgcHJpbnRmKCJvbXB0X3Rvb2xfd2luZG93cygpOiByZXNpemUgYnVmZmVyIHRvICVkIGJ5dGVzXG4iLCBuZWVkZWQpOworI2VuZGlmCisgICAgICAgIG1vZHVsZXMgPSAoSE1PRFVMRSopcmVhbGxvYyggbW9kdWxlcywgbmVlZGVkICk7CisgICAgICAgIC8vIElmIHJlc2l6aW5nIGZhaWxlZCB1c2UgdGhlIHN0dWIgZnVuY3Rpb24uCisgICAgICAgIGlmICghRW51bVByb2Nlc3NNb2R1bGVzKHByb2Nlc3MsIG1vZHVsZXMsIG5lZWRlZCwgJm5lZWRlZCkpIHsKKyAgICAgICAgICAgIGZyZWUobW9kdWxlcyk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbmV3X3NpemU7ICsraSkgeworICAgICAgICAoRkFSUFJPQyAmKW9tcHRfdG9vbF9wID0gR2V0UHJvY0FkZHJlc3MobW9kdWxlc1tpXSwgIm9tcHRfdG9vbCIpOworICAgICAgICBpZiAob21wdF90b29sX3ApIHsKKyNpZiBPTVBUX0RFQlVHCisgICAgICAgICAgICBUQ0hBUiBtb2ROYW1lW01BWF9QQVRIXTsKKyAgICAgICAgICAgIGlmIChHZXRNb2R1bGVGaWxlTmFtZShtb2R1bGVzW2ldLCBtb2ROYW1lLCBNQVhfUEFUSCkpCisgICAgICAgICAgICAgICAgcHJpbnRmKCJvbXB0X3Rvb2xfd2luZG93cygpOiBvbXB0X3Rvb2wgZm91bmQgaW4gbW9kdWxlICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBtb2ROYW1lKTsKKyNlbmRpZgorICAgICAgICAgICAgZnJlZShtb2R1bGVzKTsKKyAgICAgICAgICAgIHJldHVybiBvbXB0X3Rvb2xfcCgpOworICAgICAgICB9CisjaWYgT01QVF9ERUJVRworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFRDSEFSIG1vZE5hbWVbTUFYX1BBVEhdOworICAgICAgICAgICAgaWYgKEdldE1vZHVsZUZpbGVOYW1lKG1vZHVsZXNbaV0sIG1vZE5hbWUsIE1BWF9QQVRIKSkKKyAgICAgICAgICAgICAgICBwcmludGYoIm9tcHRfdG9vbF93aW5kb3dzKCk6IG9tcHRfdG9vbCBub3QgZm91bmQgaW4gbW9kdWxlICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBtb2ROYW1lKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorICAgIGZyZWUobW9kdWxlcyk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisjZWxzZQorIyBlcnJvciBFaXRoZXIgX19hdHRyaWJ1dGVfXygod2VhaykpIG9yIHBzYXBpLmRsbCBhcmUgcmVxdWlyZWQgZm9yIE9NUFQgc3VwcG9ydAorI2VuZGlmIC8vIE9NUFRfSEFWRV9XRUFLX0FUVFJJQlVURQorCit2b2lkIG9tcHRfcHJlX2luaXQoKQoreworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBFeGVjdXRlIHRoZSBwcmUtaW5pdGlhbGl6YXRpb24gbG9naWMgb25seSBvbmNlLgorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBzdGF0aWMgaW50IG9tcHRfcHJlX2luaXRpYWxpemVkID0gMDsKKworICAgIGlmIChvbXB0X3ByZV9pbml0aWFsaXplZCkgcmV0dXJuOworCisgICAgb21wdF9wcmVfaW5pdGlhbGl6ZWQgPSAxOworCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIFVzZSBhIHRvb2wgaWZmIGEgdG9vbCBpcyBlbmFibGVkIGFuZCBhdmFpbGFibGUuCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIGNvbnN0IGNoYXIgKm9tcHRfZW52X3ZhciA9IGdldGVudigiT01QX1RPT0wiKTsKKyAgICB0b29sX3NldHRpbmdfZSB0b29sX3NldHRpbmcgPSBvbXBfdG9vbF9lcnJvcjsKKworICAgIGlmICghb21wdF9lbnZfdmFyICB8fCAhc3RyY21wKG9tcHRfZW52X3ZhciwgIiIpKQorICAgICAgICB0b29sX3NldHRpbmcgPSBvbXBfdG9vbF91bnNldDsKKyAgICBlbHNlIGlmIChPTVBUX1NUUl9NQVRDSChvbXB0X2Vudl92YXIsICJkaXNhYmxlZCIpKQorICAgICAgICB0b29sX3NldHRpbmcgPSBvbXBfdG9vbF9kaXNhYmxlZDsKKyAgICBlbHNlIGlmIChPTVBUX1NUUl9NQVRDSChvbXB0X2Vudl92YXIsICJlbmFibGVkIikpCisgICAgICAgIHRvb2xfc2V0dGluZyA9IG9tcF90b29sX2VuYWJsZWQ7CisKKyNpZiBPTVBUX0RFQlVHCisgICAgcHJpbnRmKCJvbXB0X3ByZV9pbml0KCk6IHRvb2xfc2V0dGluZyA9ICVkXG4iLCB0b29sX3NldHRpbmcpOworI2VuZGlmCisgICAgc3dpdGNoKHRvb2xfc2V0dGluZykgeworICAgIGNhc2Ugb21wX3Rvb2xfZGlzYWJsZWQ6CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBvbXBfdG9vbF91bnNldDoKKyAgICBjYXNlIG9tcF90b29sX2VuYWJsZWQ6CisgICAgICAgIG9tcHRfaW5pdGlhbGl6ZV9mbiA9IG9tcHRfdG9vbCgpOworICAgICAgICBpZiAob21wdF9pbml0aWFsaXplX2ZuKSB7CisgICAgICAgICAgICBvbXB0X2VuYWJsZWQgPSAxOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBvbXBfdG9vbF9lcnJvcjoKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAiV2FybmluZzogT01QX1RPT0wgaGFzIGludmFsaWQgdmFsdWUgXCIlc1wiLlxuIgorICAgICAgICAgICAgIiAgbGVnYWwgdmFsdWVzIGFyZSAoTlVMTCxcIlwiLFwiZGlzYWJsZWRcIiwiCisgICAgICAgICAgICAiXCJlbmFibGVkXCIpLlxuIiwgb21wdF9lbnZfdmFyKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorI2lmIE9NUFRfREVCVUcKKyAgICBwcmludGYoIm9tcHRfcHJlX2luaXQoKTogb21wdF9lbmFibGVkID0gJWRcbiIsIG9tcHRfZW5hYmxlZCk7CisjZW5kaWYKK30KKworCit2b2lkIG9tcHRfcG9zdF9pbml0KCkKK3sKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gRXhlY3V0ZSB0aGUgcG9zdC1pbml0aWFsaXphdGlvbiBsb2dpYyBvbmx5IG9uY2UuCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHN0YXRpYyBpbnQgb21wdF9wb3N0X2luaXRpYWxpemVkID0gMDsKKworICAgIGlmIChvbXB0X3Bvc3RfaW5pdGlhbGl6ZWQpIHJldHVybjsKKworICAgIG9tcHRfcG9zdF9pbml0aWFsaXplZCA9IDE7CisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gSW5pdGlhbGl6ZSB0aGUgdG9vbCBpZiBzbyBpbmRpY2F0ZWQuCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgb21wdF9pbml0aWFsaXplX2ZuKG9tcHRfZm5fbG9va3VwLCBvbXB0X2dldF9ydW50aW1lX3ZlcnNpb24oKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVBUX1ZFUlNJT04pOworCisgICAgICAgIG9tcHRfdGhyZWFkX3QgKnJvb3RfdGhyZWFkID0gb21wdF9nZXRfdGhyZWFkKCk7CisKKyAgICAgICAgb21wdF9zZXRfdGhyZWFkX3N0YXRlKHJvb3RfdGhyZWFkLCBvbXB0X3N0YXRlX292ZXJoZWFkKTsKKworICAgICAgICBpZiAob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3RocmVhZF9iZWdpbikpIHsKKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF90aHJlYWRfYmVnaW4pCisgICAgICAgICAgICAgICAgKG9tcHRfdGhyZWFkX2luaXRpYWwsIG9tcHRfZ2V0X3RocmVhZF9pZCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIG9tcHRfc2V0X3RocmVhZF9zdGF0ZShyb290X3RocmVhZCwgb21wdF9zdGF0ZV93b3JrX3NlcmlhbCk7CisgICAgfQorfQorCisKK3ZvaWQgb21wdF9maW5pKCkKK3sKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcnVudGltZV9zaHV0ZG93bikpIHsKKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9ydW50aW1lX3NodXRkb3duKSgpOworICAgICAgICB9CisgICAgfQorCisgICAgb21wdF9lbmFibGVkID0gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGludGVyZmFjZSBvcGVyYXRpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBzdGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK09NUFRfQVBJX1JPVVRJTkUgaW50IG9tcHRfZW51bWVyYXRlX3N0YXRlKGludCBjdXJyZW50X3N0YXRlLCBpbnQgKm5leHRfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqbmV4dF9zdGF0ZV9uYW1lKQoreworICAgIGNvbnN0IHN0YXRpYyBpbnQgbGVuID0gc2l6ZW9mKG9tcHRfc3RhdGVfaW5mbykgLyBzaXplb2Yob21wdF9zdGF0ZV9pbmZvX3QpOworICAgIGludCBpID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW4gLSAxOyBpKyspIHsKKyAgICAgICAgaWYgKG9tcHRfc3RhdGVfaW5mb1tpXS5zdGF0ZV9pZCA9PSBjdXJyZW50X3N0YXRlKSB7CisgICAgICAgICAgICAqbmV4dF9zdGF0ZSA9IG9tcHRfc3RhdGVfaW5mb1tpKzFdLnN0YXRlX2lkOworICAgICAgICAgICAgKm5leHRfc3RhdGVfbmFtZSA9IG9tcHRfc3RhdGVfaW5mb1tpKzFdLnN0YXRlX25hbWU7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjYWxsYmFja3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitPTVBUX0FQSV9ST1VUSU5FIGludCBvbXB0X3NldF9jYWxsYmFjayhvbXB0X2V2ZW50X3QgZXZpZCwgb21wdF9jYWxsYmFja190IGNiKQoreworICAgIHN3aXRjaCAoZXZpZCkgeworCisjZGVmaW5lIG9tcHRfZXZlbnRfbWFjcm8oZXZlbnRfbmFtZSwgY2FsbGJhY2tfdHlwZSwgZXZlbnRfaWQpICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgZXZlbnRfbmFtZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKG9tcHRfZXZlbnRfaW1wbGVtZW50YXRpb25fc3RhdHVzKGV2ZW50X25hbWUpKSB7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKGV2ZW50X25hbWUpID0gKGNhbGxiYWNrX3R5cGUpIGNiOyAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIG9tcHRfZXZlbnRfaW1wbGVtZW50YXRpb25fc3RhdHVzKGV2ZW50X25hbWUpOworCisgICAgRk9SRUFDSF9PTVBUX0VWRU5UKG9tcHRfZXZlbnRfbWFjcm8pCisKKyN1bmRlZiBvbXB0X2V2ZW50X21hY3JvCisKKyAgICBkZWZhdWx0OiByZXR1cm4gb21wdF9zZXRfcmVzdWx0X3JlZ2lzdHJhdGlvbl9lcnJvcjsKKyAgICB9Cit9CisKKworT01QVF9BUElfUk9VVElORSBpbnQgb21wdF9nZXRfY2FsbGJhY2sob21wdF9ldmVudF90IGV2aWQsIG9tcHRfY2FsbGJhY2tfdCAqY2IpCit7CisgICAgc3dpdGNoIChldmlkKSB7CisKKyNkZWZpbmUgb21wdF9ldmVudF9tYWNybyhldmVudF9uYW1lLCBjYWxsYmFja190eXBlLCBldmVudF9pZCkgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSBldmVudF9uYW1lOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAob21wdF9ldmVudF9pbXBsZW1lbnRhdGlvbl9zdGF0dXMoZXZlbnRfbmFtZSkpIHsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tfdCBteWNiID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKG9tcHRfY2FsbGJhY2tfdCkgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhldmVudF9uYW1lKTsgICAgXAorICAgICAgICAgICAgaWYgKG15Y2IpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAqY2IgPSBteWNiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgcmV0dXJuIG9tcHRfZ2V0X2NhbGxiYWNrX3N1Y2Nlc3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBvbXB0X2dldF9jYWxsYmFja19mYWlsdXJlOworCisgICAgRk9SRUFDSF9PTVBUX0VWRU5UKG9tcHRfZXZlbnRfbWFjcm8pCisKKyN1bmRlZiBvbXB0X2V2ZW50X21hY3JvCisKKyAgICBkZWZhdWx0OiByZXR1cm4gb21wdF9nZXRfY2FsbGJhY2tfZmFpbHVyZTsKKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBwYXJhbGxlbCByZWdpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworT01QVF9BUElfUk9VVElORSBvbXB0X3BhcmFsbGVsX2lkX3Qgb21wdF9nZXRfcGFyYWxsZWxfaWQoaW50IGFuY2VzdG9yX2xldmVsKQoreworICAgIHJldHVybiBfX29tcHRfZ2V0X3BhcmFsbGVsX2lkX2ludGVybmFsKGFuY2VzdG9yX2xldmVsKTsKK30KKworCitPTVBUX0FQSV9ST1VUSU5FIGludCBvbXB0X2dldF9wYXJhbGxlbF90ZWFtX3NpemUoaW50IGFuY2VzdG9yX2xldmVsKQoreworICAgIHJldHVybiBfX29tcHRfZ2V0X3BhcmFsbGVsX3RlYW1fc2l6ZV9pbnRlcm5hbChhbmNlc3Rvcl9sZXZlbCk7Cit9CisKKworT01QVF9BUElfUk9VVElORSB2b2lkICpvbXB0X2dldF9wYXJhbGxlbF9mdW5jdGlvbihpbnQgYW5jZXN0b3JfbGV2ZWwpCit7CisgICAgcmV0dXJuIF9fb21wdF9nZXRfcGFyYWxsZWxfZnVuY3Rpb25faW50ZXJuYWwoYW5jZXN0b3JfbGV2ZWwpOworfQorCisKK09NUFRfQVBJX1JPVVRJTkUgb21wdF9zdGF0ZV90IG9tcHRfZ2V0X3N0YXRlKG9tcHRfd2FpdF9pZF90ICpvbXB0X3dhaXRfaWQpCit7CisgICAgb21wdF9zdGF0ZV90IHRocmVhZF9zdGF0ZSA9IF9fb21wdF9nZXRfc3RhdGVfaW50ZXJuYWwob21wdF93YWl0X2lkKTsKKworICAgIGlmICh0aHJlYWRfc3RhdGUgPT0gb21wdF9zdGF0ZV91bmRlZmluZWQpIHsKKyAgICAgICAgdGhyZWFkX3N0YXRlID0gb21wdF9zdGF0ZV93b3JrX3NlcmlhbDsKKyAgICB9CisKKyAgICByZXR1cm4gdGhyZWFkX3N0YXRlOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB0aHJlYWRzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitPTVBUX0FQSV9ST1VUSU5FIHZvaWQgKm9tcHRfZ2V0X2lkbGVfZnJhbWUoKQoreworICAgIHJldHVybiBfX29tcHRfZ2V0X2lkbGVfZnJhbWVfaW50ZXJuYWwoKTsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogdGFza3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK09NUFRfQVBJX1JPVVRJTkUgb21wdF90aHJlYWRfaWRfdCBvbXB0X2dldF90aHJlYWRfaWQodm9pZCkKK3sKKyAgICByZXR1cm4gX19vbXB0X2dldF90aHJlYWRfaWRfaW50ZXJuYWwoKTsKK30KKworT01QVF9BUElfUk9VVElORSBvbXB0X3Rhc2tfaWRfdCBvbXB0X2dldF90YXNrX2lkKGludCBkZXB0aCkKK3sKKyAgICByZXR1cm4gX19vbXB0X2dldF90YXNrX2lkX2ludGVybmFsKGRlcHRoKTsKK30KKworCitPTVBUX0FQSV9ST1VUSU5FIG9tcHRfZnJhbWVfdCAqb21wdF9nZXRfdGFza19mcmFtZShpbnQgZGVwdGgpCit7CisgICAgcmV0dXJuIF9fb21wdF9nZXRfdGFza19mcmFtZV9pbnRlcm5hbChkZXB0aCk7Cit9CisKKworT01QVF9BUElfUk9VVElORSB2b2lkICpvbXB0X2dldF90YXNrX2Z1bmN0aW9uKGludCBkZXB0aCkKK3sKKyAgICByZXR1cm4gX19vbXB0X2dldF90YXNrX2Z1bmN0aW9uX2ludGVybmFsKGRlcHRoKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHBsYWNlaG9sZGVycworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vIERvbid0IGRlZmluZSB0aGlzIGFzIHN0YXRpYy4gVGhlIGxvYWRlciBtYXkgY2hvb3NlIHRvIGVsaW1pbmF0ZSB0aGUgc3ltYm9sCisvLyBldmVuIHRob3VnaCBpdCBpcyBuZWVkZWQgYnkgdG9vbHMuICAKKyNkZWZpbmUgT01QVF9BUElfUExBQ0VIT0xERVIgCisKKy8vIEVuc3VyZSB0aGF0IHBsYWNlaG9sZGVycyBkb24ndCBoYXZlIG1hbmdsZWQgbmFtZXMgaW4gdGhlIHN5bWJvbCB0YWJsZS4KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCitPTVBUX0FQSV9QTEFDRUhPTERFUiB2b2lkIG9tcHRfaWRsZSh2b2lkKSAgCit7CisgICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBhIHBsYWNlaG9sZGVyIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBjYWxsaW5nIGNvbnRleHQgb2YKKyAgICAvLyBpZGxlIE9wZW5NUCB3b3JrZXIgdGhyZWFkcy4gSXQgaXMgbm90IG1lYW50IHRvIGJlIGludm9rZWQuCisgICAgYXNzZXJ0KDApOworfQorCisKK09NUFRfQVBJX1BMQUNFSE9MREVSIHZvaWQgb21wdF9vdmVyaGVhZCh2b2lkKQoreworICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgYSBwbGFjZWhvbGRlciB1c2VkIHRvIHJlcHJlc2VudCB0aGUgT3Blbk1QIGNvbnRleHQgb2YKKyAgICAvLyB0aHJlYWRzIHdvcmtpbmcgaW4gdGhlIE9wZW5NUCBydW50aW1lLiAgSXQgaXMgbm90IG1lYW50IHRvIGJlIGludm9rZWQuCisgICAgYXNzZXJ0KDApOworfQorCisKK09NUFRfQVBJX1BMQUNFSE9MREVSIHZvaWQgb21wdF9iYXJyaWVyX3dhaXQodm9pZCkKK3sKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGEgcGxhY2Vob2xkZXIgdXNlZCB0byByZXByZXNlbnQgdGhlIE9wZW5NUCBjb250ZXh0IG9mCisgICAgLy8gdGhyZWFkcyB3YWl0aW5nIGZvciBhIGJhcnJpZXIgaW4gdGhlIE9wZW5NUCBydW50aW1lLiBJdCBpcyBub3QgbWVhbnQKKyAgICAvLyB0byBiZSBpbnZva2VkLgorICAgIGFzc2VydCgwKTsKK30KKworCitPTVBUX0FQSV9QTEFDRUhPTERFUiB2b2lkIG9tcHRfdGFza193YWl0KHZvaWQpCit7CisgICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBhIHBsYWNlaG9sZGVyIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBPcGVuTVAgY29udGV4dCBvZgorICAgIC8vIHRocmVhZHMgd2FpdGluZyBmb3IgYSB0YXNrIGluIHRoZSBPcGVuTVAgcnVudGltZS4gSXQgaXMgbm90IG1lYW50CisgICAgLy8gdG8gYmUgaW52b2tlZC4KKyAgICBhc3NlcnQoMCk7Cit9CisKKworT01QVF9BUElfUExBQ0VIT0xERVIgdm9pZCBvbXB0X211dGV4X3dhaXQodm9pZCkKK3sKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGEgcGxhY2Vob2xkZXIgdXNlZCB0byByZXByZXNlbnQgdGhlIE9wZW5NUCBjb250ZXh0IG9mCisgICAgLy8gdGhyZWFkcyB3YWl0aW5nIGZvciBhIG11dGV4IGluIHRoZSBPcGVuTVAgcnVudGltZS4gSXQgaXMgbm90IG1lYW50CisgICAgLy8gdG8gYmUgaW52b2tlZC4KKyAgICBhc3NlcnQoMCk7Cit9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsKKyNlbmRpZgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY29tcGF0YWJpbGl0eQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK09NUFRfQVBJX1JPVVRJTkUgaW50IG9tcHRfZ2V0X29tcHRfdmVyc2lvbigpCit7CisgICAgcmV0dXJuIE9NUFRfVkVSU0lPTjsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogYXBwbGljYXRpb24tZmFjaW5nIEFQSQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgfCBjb250cm9sCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworX09NUF9FWFRFUk4gdm9pZCBvbXB0X2NvbnRyb2wodWludDY0X3QgY29tbWFuZCwgdWludDY0X3QgbW9kaWZpZXIpCit7CisgICAgaWYgKG9tcHRfZW5hYmxlZCAmJiBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfY29udHJvbCkpIHsKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2NvbnRyb2wpKGNvbW1hbmQsIG1vZGlmaWVyKTsKKyAgICB9Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFQSSBpbnF1aXJ5IGZvciB0b29sCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIG9tcHRfaW50ZXJmYWNlX2ZuX3Qgb21wdF9mbl9sb29rdXAoY29uc3QgY2hhciAqcykKK3sKKworI2RlZmluZSBvbXB0X2ludGVyZmFjZV9mbihmbikgXAorICAgIGlmIChzdHJjbXAocywgI2ZuKSA9PSAwKSByZXR1cm4gKG9tcHRfaW50ZXJmYWNlX2ZuX3QpIGZuOworCisgICAgRk9SRUFDSF9PTVBUX0lOUVVJUllfRk4ob21wdF9pbnRlcmZhY2VfZm4pCisKKyAgICBGT1JFQUNIX09NUFRfUExBQ0VIT0xERVJfRk4ob21wdF9pbnRlcmZhY2VfZm4pCisKKyAgICByZXR1cm4gKG9tcHRfaW50ZXJmYWNlX2ZuX3QpIDA7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9vbXB0LWludGVybmFsLmggYi9maW5hbC9ydW50aW1lL3NyYy9vbXB0LWludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRlOGQyZQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL29tcHQtaW50ZXJuYWwuaApAQCAtMCwwICsxLDc5IEBACisjaWZuZGVmIF9fT01QVF9JTlRFUk5BTF9IX18KKyNkZWZpbmUgX19PTVBUX0lOVEVSTkFMX0hfXworCisjaW5jbHVkZSAib21wdC5oIgorI2luY2x1ZGUgIm9tcHQtZXZlbnQtc3BlY2lmaWMuaCIKKworI2RlZmluZSBPTVBUX1ZFUlNJT04gMQorCisjZGVmaW5lIF9PTVBfRVhURVJOIGV4dGVybiAiQyIKKworI2RlZmluZSBPTVBUX0lOVk9LRVIoeCkgXAorICAoKHggPT0gZm9ya19jb250ZXh0X2dudSkgPyBvbXB0X2ludm9rZXJfcHJvZ3JhbSA6IG9tcHRfaW52b2tlcl9ydW50aW1lKQorCisKKyNkZWZpbmUgb21wdF9jYWxsYmFjayhlKSBlICMjIF9jYWxsYmFjaworCisKK3R5cGVkZWYgc3RydWN0IG9tcHRfY2FsbGJhY2tzX3MgeworI2RlZmluZSBvbXB0X2V2ZW50X21hY3JvKGV2ZW50LCBjYWxsYmFjaywgZXZlbnRpZCkgY2FsbGJhY2sgb21wdF9jYWxsYmFjayhldmVudCk7CisKKyAgICBGT1JFQUNIX09NUFRfRVZFTlQob21wdF9ldmVudF9tYWNybykKKworI3VuZGVmIG9tcHRfZXZlbnRfbWFjcm8KK30gb21wdF9jYWxsYmFja3NfdDsKKworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBvbXB0X2ZyYW1lX3QgICAgICAgIGZyYW1lOworICAgIHZvaWQqICAgICAgICAgICAgICAgZnVuY3Rpb247CisgICAgb21wdF90YXNrX2lkX3QgICAgICB0YXNrX2lkOworfSBvbXB0X3Rhc2tfaW5mb190OworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBvbXB0X3BhcmFsbGVsX2lkX3QgIHBhcmFsbGVsX2lkOworICAgIHZvaWQgICAgICAgICAgICAgICAgKm1pY3JvdGFzazsKK30gb21wdF90ZWFtX2luZm9fdDsKKworCit0eXBlZGVmIHN0cnVjdCBvbXB0X2x3X3Rhc2t0ZWFtX3MgeworICAgIG9tcHRfdGVhbV9pbmZvX3QgICAgb21wdF90ZWFtX2luZm87CisgICAgb21wdF90YXNrX2luZm9fdCAgICBvbXB0X3Rhc2tfaW5mbzsKKyAgICBzdHJ1Y3Qgb21wdF9sd190YXNrdGVhbV9zICpwYXJlbnQ7Cit9IG9tcHRfbHdfdGFza3RlYW1fdDsKKworCit0eXBlZGVmIHN0cnVjdCBvbXB0X3BhcmFsbGVsX2luZm9fcyB7CisgICAgb21wdF90YXNrX2lkX3QgcGFyZW50X3Rhc2tfaWQ7ICAgIC8qIGlkIG9mIHBhcmVudCB0YXNrICAgICAgICAgICAgKi8KKyAgICBvbXB0X3BhcmFsbGVsX2lkX3QgcGFyYWxsZWxfaWQ7ICAgLyogaWQgb2YgcGFyYWxsZWwgcmVnaW9uICAgICAgICAqLworICAgIG9tcHRfZnJhbWVfdCAqcGFyZW50X3Rhc2tfZnJhbWU7ICAvKiBmcmFtZSBkYXRhIG9mIHBhcmVudCB0YXNrICAgICovCisgICAgdm9pZCAqcGFyYWxsZWxfZnVuY3Rpb247ICAgICAgICAgIC8qIHBvaW50ZXIgdG8gb3V0bGluZWQgZnVuY3Rpb24gKi8KK30gb21wdF9wYXJhbGxlbF9pbmZvX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIG9tcHRfc3RhdGVfdCAgICAgICAgc3RhdGU7CisgICAgb21wdF93YWl0X2lkX3QgICAgICB3YWl0X2lkOworICAgIHZvaWQgICAgICAgICAgICAgICAgKmlkbGVfZnJhbWU7Cit9IG9tcHRfdGhyZWFkX2luZm9fdDsKKworCitleHRlcm4gb21wdF9jYWxsYmFja3NfdCBvbXB0X2NhbGxiYWNrczsKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit2b2lkIG9tcHRfcHJlX2luaXQodm9pZCk7Cit2b2lkIG9tcHRfcG9zdF9pbml0KHZvaWQpOwordm9pZCBvbXB0X2Zpbmkodm9pZCk7CisKK2V4dGVybiBpbnQgb21wdF9lbmFibGVkOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9vbXB0LXNwZWNpZmljLmMgYi9maW5hbC9ydW50aW1lL3NyYy9vbXB0LXNwZWNpZmljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlmNjY4YQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL29tcHQtc3BlY2lmaWMuYwpAQCAtMCwwICsxLDMzMiBAQAorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIGluY2x1ZGUgZmlsZXMKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJvbXB0LWludGVybmFsLmgiCisjaW5jbHVkZSAib21wdC1zcGVjaWZpYy5oIgorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gbWFjcm9zCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisjZGVmaW5lIEdUSURfVE9fT01QVF9USFJFQURfSUQoaWQpICgob21wdF90aHJlYWRfaWRfdCkgKGlkID49MCkgPyBpZCArIDE6IDApCisKKyNkZWZpbmUgTFdUX0ZST01fVEVBTSh0ZWFtKSAodGVhbSktPnQub21wdF9zZXJpYWxpemVkX3RlYW1faW5mbzsKKworI2RlZmluZSBPTVBUX1RIUkVBRF9JRF9CSVRTIDE2CisKKy8vIDIwMTMgMDggMjQgLSBKb2huIE1lbGxvci1DcnVtbWV5CisvLyAgIGlkZWFsbHksIGEgdGhyZWFkIHNob3VsZCBhc3NpZ24gaXRzIG93biBpZHMgYmFzZWQgb24gdGhyZWFkIHByaXZhdGUgZGF0YS4KKy8vICAgaG93ZXZlciwgdGhlIHdheSB0aGUgaW50ZWwgcnVudGltZSByZWluaXRpYWxpemVzIHRocmVhZCBkYXRhIHN0cnVjdHVyZXMKKy8vICAgd2hlbiBpdCBjcmVhdGVzIHRlYW1zIG1ha2VzIGl0IGRpZmZpY3VsdCB0byBtYWludGFpbiBwZXJzaXN0ZW50IHRocmVhZAorLy8gICBkYXRhLiB1c2luZyBhIHNoYXJlZCB2YXJpYWJsZSBpbnN0ZWFkIGlzIHNpbXBsZS4gSSBsZWF2ZSBpdCB0byBpbnRlbCB0bworLy8gICBzb3J0IG91dCBob3cgdG8gaW1wbGVtZW50IGEgaGlnaGVyIHBlcmZvcm1hbmNlIHZlcnNpb24gaW4gdGhlaXIgcnVudGltZS4KKworLy8gd2hlbiB1c2luZyBmZXRjaF9hbmRfYWRkIHRvIGdlbmVyYXRlIHRoZSBJRHMsIHRoZXJlIGlzbid0IGFueSByZWFzb24gdG8gd2FzdGUKKy8vIGJpdHMgZm9yIHRocmVhZCBpZC4KKyNpZiAwCisjZGVmaW5lIE5FWFRfSUQoaWRfcHRyLHRpZCkgXAorICAoKEtNUF9URVNUX1RIRU5fSU5DNjQoaWRfcHRyKSA8PCBPTVBUX1RIUkVBRF9JRF9CSVRTKSB8ICh0aWQpKQorI2Vsc2UKKyNkZWZpbmUgTkVYVF9JRChpZF9wdHIsdGlkKSAoS01QX1RFU1RfVEhFTl9JTkM2NCgodm9sYXRpbGUga21wX2ludDY0ICopaWRfcHRyKSkKKyNlbmRpZgorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gcHJpdmF0ZSBvcGVyYXRpb25zCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHRyYXZlcnNlIHRoZSB0ZWFtIGFuZCB0YXNrIGhpZXJhcmNoeQorLy8gbm90ZTogX19vbXB0X2dldF90ZWFtaW5mbyBhbmQgX19vbXB0X2dldF90YXNraW5mbworLy8gICAgICAgdHJhdmVyc2UgdGhlIGhpZXJhcmNoeSBzaW1pbGFybHkgYW5kIG5lZWQgdG8gYmUKKy8vICAgICAgIGtlcHQgY29uc2lzdGVudAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK29tcHRfdGVhbV9pbmZvX3QgKgorX19vbXB0X2dldF90ZWFtaW5mbyhpbnQgZGVwdGgsIGludCAqc2l6ZSkKK3sKKyAgICBrbXBfaW5mb190ICp0aHIgPSBvbXB0X2dldF90aHJlYWQoKTsKKworICAgIGlmICh0aHIpIHsKKyAgICAgICAga21wX3RlYW0gKnRlYW0gPSB0aHItPnRoLnRoX3RlYW07CisgICAgICAgIGlmICh0ZWFtID09IE5VTEwpIHJldHVybiBOVUxMOworCisgICAgICAgIG9tcHRfbHdfdGFza3RlYW1fdCAqbHd0ID0gTFdUX0ZST01fVEVBTSh0ZWFtKTsKKworICAgICAgICB3aGlsZShkZXB0aCA+IDApIHsKKyAgICAgICAgICAgIC8vIG5leHQgbGlnaHR3ZWlnaHQgdGVhbSAoaWYgYW55KQorICAgICAgICAgICAgaWYgKGx3dCkgbHd0ID0gbHd0LT5wYXJlbnQ7CisKKyAgICAgICAgICAgIC8vIG5leHQgaGVhdnl3ZWlnaHQgdGVhbSAoaWYgYW55KSBhZnRlcgorICAgICAgICAgICAgLy8gbGlnaHR3ZWlnaHQgdGVhbXMgYXJlIGV4aGF1c3RlZAorICAgICAgICAgICAgaWYgKCFsd3QgJiYgdGVhbSkgdGVhbT10ZWFtLT50LnRfcGFyZW50OworCisgICAgICAgICAgICBkZXB0aC0tOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGx3dCkgeworICAgICAgICAgICAgLy8gbGlnaHR3ZWlnaHQgdGVhbXMgaGF2ZSBvbmUgdGFzaworICAgICAgICAgICAgaWYgKHNpemUpICpzaXplID0gMTsKKworICAgICAgICAgICAgLy8gcmV0dXJuIHRlYW0gaW5mbyBmb3IgbGlnaHR3ZWlnaHQgdGVhbQorICAgICAgICAgICAgcmV0dXJuICZsd3QtPm9tcHRfdGVhbV9pbmZvOworICAgICAgICB9IGVsc2UgaWYgKHRlYW0pIHsKKyAgICAgICAgICAgIC8vIGV4dHJhY3Qgc2l6ZSBmcm9tIGhlYXZ5d2VpZ2h0IHRlYW0KKyAgICAgICAgICAgIGlmIChzaXplKSAqc2l6ZSA9IHRlYW0tPnQudF9ucHJvYzsKKworICAgICAgICAgICAgLy8gcmV0dXJuIHRlYW0gaW5mbyBmb3IgaGVhdnl3ZWlnaHQgdGVhbQorICAgICAgICAgICAgcmV0dXJuICZ0ZWFtLT50Lm9tcHRfdGVhbV9pbmZvOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7Cit9CisKKworb21wdF90YXNrX2luZm9fdCAqCitfX29tcHRfZ2V0X3Rhc2tpbmZvKGludCBkZXB0aCkKK3sKKyAgICBvbXB0X3Rhc2tfaW5mb190ICppbmZvID0gTlVMTDsKKyAgICBrbXBfaW5mb190ICp0aHIgPSBvbXB0X2dldF90aHJlYWQoKTsKKworICAgIGlmICh0aHIpIHsKKyAgICAgICAga21wX3Rhc2tkYXRhX3QgICp0YXNrZGF0YSA9IHRoci0+dGgudGhfY3VycmVudF90YXNrOworICAgICAgICBvbXB0X2x3X3Rhc2t0ZWFtX3QgKmx3dCA9IExXVF9GUk9NX1RFQU0odGFza2RhdGEtPnRkX3RlYW0pOworCisgICAgICAgIHdoaWxlIChkZXB0aCA+IDApIHsKKyAgICAgICAgICAgIC8vIG5leHQgbGlnaHR3ZWlnaHQgdGVhbSAoaWYgYW55KQorICAgICAgICAgICAgaWYgKGx3dCkgbHd0ID0gbHd0LT5wYXJlbnQ7CisKKyAgICAgICAgICAgIC8vIG5leHQgaGVhdnl3ZWlnaHQgdGVhbSAoaWYgYW55KSBhZnRlcgorICAgICAgICAgICAgLy8gbGlnaHR3ZWlnaHQgdGVhbXMgYXJlIGV4aGF1c3RlZAorICAgICAgICAgICAgaWYgKCFsd3QgJiYgdGFza2RhdGEpIHsKKyAgICAgICAgICAgICAgICB0YXNrZGF0YSA9IHRhc2tkYXRhLT50ZF9wYXJlbnQ7CisgICAgICAgICAgICAgICAgaWYgKHRhc2tkYXRhKSB7CisgICAgICAgICAgICAgICAgICAgIGx3dCA9IExXVF9GUk9NX1RFQU0odGFza2RhdGEtPnRkX3RlYW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlcHRoLS07CisgICAgICAgIH0KKworICAgICAgICBpZiAobHd0KSB7CisgICAgICAgICAgICBpbmZvID0gJmx3dC0+b21wdF90YXNrX2luZm87CisgICAgICAgIH0gZWxzZSBpZiAodGFza2RhdGEpIHsKKyAgICAgICAgICAgIGluZm8gPSAmdGFza2RhdGEtPm9tcHRfdGFza19pbmZvOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGluZm87Cit9CisKKworCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gaW50ZXJmYWNlIG9wZXJhdGlvbnMKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdGhyZWFkIHN1cHBvcnQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitvbXB0X3BhcmFsbGVsX2lkX3QKK19fb21wdF90aHJlYWRfaWRfbmV3KCkKK3sKKyAgICBzdGF0aWMgdWludDY0X3Qgb21wdF90aHJlYWRfaWQgPSAxOworICAgIHJldHVybiBORVhUX0lEKCZvbXB0X3RocmVhZF9pZCwgMCk7Cit9CisKK3ZvaWQKK19fb21wdF90aHJlYWRfYmVnaW4ob21wdF90aHJlYWRfdHlwZV90IHRocmVhZF90eXBlLCBpbnQgZ3RpZCkKK3sKKyAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfdGhyZWFkX2JlZ2luKSgKKyAgICAgICAgdGhyZWFkX3R5cGUsIEdUSURfVE9fT01QVF9USFJFQURfSUQoZ3RpZCkpOworfQorCisKK3ZvaWQKK19fb21wdF90aHJlYWRfZW5kKG9tcHRfdGhyZWFkX3R5cGVfdCB0aHJlYWRfdHlwZSwgaW50IGd0aWQpCit7CisgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3RocmVhZF9lbmQpKAorICAgICAgICB0aHJlYWRfdHlwZSwgR1RJRF9UT19PTVBUX1RIUkVBRF9JRChndGlkKSk7Cit9CisKKworb21wdF90aHJlYWRfaWRfdAorX19vbXB0X2dldF90aHJlYWRfaWRfaW50ZXJuYWwoKQoreworICAgIC8vIEZJWE1FCisgICAgLy8gdW50aWwgd2UgaGF2ZSBhIGJldHRlciB3YXkgb2YgYXNzaWduaW5nIGlkcywgdXNlIF9fa21wX2dldF9ndGlkCisgICAgLy8gc2luY2UgdGhlIHJldHVybiB2YWx1ZSBtaWdodCBiZSBuZWdhdGl2ZSwgd2UgbmVlZCB0byB0ZXN0IHRoYXQgYmVmb3JlCisgICAgLy8gYXNzaWduaW5nIGl0IHRvIGFuIG9tcHRfdGhyZWFkX2lkX3QsIHdoaWNoIGlzIHVuc2lnbmVkLgorICAgIGludCBpZCA9IF9fa21wX2dldF9ndGlkKCk7CisgICAgYXNzZXJ0KGlkID49IDApOworCisgICAgcmV0dXJuIEdUSURfVE9fT01QVF9USFJFQURfSUQoaWQpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHN0YXRlIHN1cHBvcnQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkCitfX29tcHRfdGhyZWFkX2Fzc2lnbl93YWl0X2lkKHZvaWQgKnZhcmlhYmxlKQoreworICAgIGludCBndGlkID0gX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKTsKKyAgICBrbXBfaW5mb190ICp0aSA9IG9tcHRfZ2V0X3RocmVhZF9ndGlkKGd0aWQpOworCisgICAgdGktPnRoLm9tcHRfdGhyZWFkX2luZm8ud2FpdF9pZCA9IChvbXB0X3dhaXRfaWRfdCkgdmFyaWFibGU7Cit9CisKK29tcHRfc3RhdGVfdAorX19vbXB0X2dldF9zdGF0ZV9pbnRlcm5hbChvbXB0X3dhaXRfaWRfdCAqb21wdF93YWl0X2lkKQoreworICAgIGttcF9pbmZvX3QgKnRpID0gb21wdF9nZXRfdGhyZWFkKCk7CisKKyAgICBpZiAodGkpIHsKKyAgICAgICAgaWYgKG9tcHRfd2FpdF9pZCkKKyAgICAgICAgICAgICpvbXB0X3dhaXRfaWQgPSB0aS0+dGgub21wdF90aHJlYWRfaW5mby53YWl0X2lkOworICAgICAgICByZXR1cm4gdGktPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGU7CisgICAgfQorICAgIHJldHVybiBvbXB0X3N0YXRlX3VuZGVmaW5lZDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBpZGxlIGZyYW1lIHN1cHBvcnQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkICoKK19fb21wdF9nZXRfaWRsZV9mcmFtZV9pbnRlcm5hbCh2b2lkKQoreworICAgIGttcF9pbmZvX3QgKnRpID0gb21wdF9nZXRfdGhyZWFkKCk7CisgICAgcmV0dXJuIHRpID8gdGktPnRoLm9tcHRfdGhyZWFkX2luZm8uaWRsZV9mcmFtZSA6IE5VTEw7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBwYXJhbGxlbCByZWdpb24gc3VwcG9ydAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK29tcHRfcGFyYWxsZWxfaWRfdAorX19vbXB0X3BhcmFsbGVsX2lkX25ldyhpbnQgZ3RpZCkKK3sKKyAgICBzdGF0aWMgdWludDY0X3Qgb21wdF9wYXJhbGxlbF9pZCA9IDE7CisgICAgcmV0dXJuIGd0aWQgPj0gMCA/IE5FWFRfSUQoJm9tcHRfcGFyYWxsZWxfaWQsIGd0aWQpIDogMDsKK30KKworCit2b2lkICoKK19fb21wdF9nZXRfcGFyYWxsZWxfZnVuY3Rpb25faW50ZXJuYWwoaW50IGRlcHRoKQoreworICAgIG9tcHRfdGVhbV9pbmZvX3QgKmluZm8gPSBfX29tcHRfZ2V0X3RlYW1pbmZvKGRlcHRoLCBOVUxMKTsKKyAgICB2b2lkICpmdW5jdGlvbiA9IGluZm8gPyBpbmZvLT5taWNyb3Rhc2sgOiBOVUxMOworICAgIHJldHVybiBmdW5jdGlvbjsKK30KKworCitvbXB0X3BhcmFsbGVsX2lkX3QKK19fb21wdF9nZXRfcGFyYWxsZWxfaWRfaW50ZXJuYWwoaW50IGRlcHRoKQoreworICAgIG9tcHRfdGVhbV9pbmZvX3QgKmluZm8gPSBfX29tcHRfZ2V0X3RlYW1pbmZvKGRlcHRoLCBOVUxMKTsKKyAgICBvbXB0X3BhcmFsbGVsX2lkX3QgaWQgPSBpbmZvID8gaW5mby0+cGFyYWxsZWxfaWQgOiAwOworICAgIHJldHVybiBpZDsKK30KKworCitpbnQKK19fb21wdF9nZXRfcGFyYWxsZWxfdGVhbV9zaXplX2ludGVybmFsKGludCBkZXB0aCkKK3sKKyAgICAvLyBpbml0aWFsaXplIHRoZSByZXR1cm4gdmFsdWUgd2l0aCB0aGUgZXJyb3IgdmFsdWUuCisgICAgLy8gaWYgdGhlcmUgaXMgYSB0ZWFtIGF0IHRoZSBzcGVjaWZpZWQgZGVwdGgsIHRoZSBkZWZhdWx0CisgICAgLy8gdmFsdWUgd2lsbCBiZSBvdmVyd3JpdHRlbiB0aGUgc2l6ZSBvZiB0aGF0IHRlYW0uCisgICAgaW50IHNpemUgPSAtMTsKKyAgICAodm9pZCkgX19vbXB0X2dldF90ZWFtaW5mbyhkZXB0aCwgJnNpemUpOworICAgIHJldHVybiBzaXplOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbGlnaHR3ZWlnaHQgdGFzayB0ZWFtIHN1cHBvcnQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkCitfX29tcHRfbHdfdGFza3RlYW1faW5pdChvbXB0X2x3X3Rhc2t0ZWFtX3QgKmx3dCwga21wX2luZm9fdCAqdGhyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGd0aWQsIHZvaWQgKm1pY3JvdGFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBvbXB0X3BpZCkKK3sKKyAgICBsd3QtPm9tcHRfdGVhbV9pbmZvLnBhcmFsbGVsX2lkID0gb21wdF9waWQ7CisgICAgbHd0LT5vbXB0X3RlYW1faW5mby5taWNyb3Rhc2sgPSBtaWNyb3Rhc2s7CisgICAgbHd0LT5vbXB0X3Rhc2tfaW5mby50YXNrX2lkID0gMDsKKyAgICBsd3QtPm9tcHRfdGFza19pbmZvLmZyYW1lLnJlZW50ZXJfcnVudGltZV9mcmFtZSA9IDA7CisgICAgbHd0LT5vbXB0X3Rhc2tfaW5mby5mcmFtZS5leGl0X3J1bnRpbWVfZnJhbWUgPSAwOworICAgIGx3dC0+b21wdF90YXNrX2luZm8uZnVuY3Rpb24gPSBOVUxMOworICAgIGx3dC0+cGFyZW50ID0gMDsKK30KKworCit2b2lkCitfX29tcHRfbHdfdGFza3RlYW1fbGluayhvbXB0X2x3X3Rhc2t0ZWFtX3QgKmx3dCwgIGttcF9pbmZvX3QgKnRocikKK3sKKyAgICBvbXB0X2x3X3Rhc2t0ZWFtX3QgKm15X3BhcmVudCA9IHRoci0+dGgudGhfdGVhbS0+dC5vbXB0X3NlcmlhbGl6ZWRfdGVhbV9pbmZvOworICAgIGx3dC0+cGFyZW50ID0gbXlfcGFyZW50OworICAgIHRoci0+dGgudGhfdGVhbS0+dC5vbXB0X3NlcmlhbGl6ZWRfdGVhbV9pbmZvID0gbHd0OworfQorCisKK29tcHRfbHdfdGFza3RlYW1fdCAqCitfX29tcHRfbHdfdGFza3RlYW1fdW5saW5rKGttcF9pbmZvX3QgKnRocikKK3sKKyAgICBvbXB0X2x3X3Rhc2t0ZWFtX3QgKmx3dGFzayA9IHRoci0+dGgudGhfdGVhbS0+dC5vbXB0X3NlcmlhbGl6ZWRfdGVhbV9pbmZvOworICAgIGlmIChsd3Rhc2spIHRoci0+dGgudGhfdGVhbS0+dC5vbXB0X3NlcmlhbGl6ZWRfdGVhbV9pbmZvID0gbHd0YXNrLT5wYXJlbnQ7CisgICAgcmV0dXJuIGx3dGFzazsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHRhc2sgc3VwcG9ydAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK29tcHRfdGFza19pZF90CitfX29tcHRfdGFza19pZF9uZXcoaW50IGd0aWQpCit7CisgICAgc3RhdGljIHVpbnQ2NF90IG9tcHRfdGFza19pZCA9IDE7CisgICAgcmV0dXJuIE5FWFRfSUQoJm9tcHRfdGFza19pZCwgZ3RpZCk7Cit9CisKKworb21wdF90YXNrX2lkX3QKK19fb21wdF9nZXRfdGFza19pZF9pbnRlcm5hbChpbnQgZGVwdGgpCit7CisgICAgb21wdF90YXNrX2luZm9fdCAqaW5mbyA9IF9fb21wdF9nZXRfdGFza2luZm8oZGVwdGgpOworICAgIG9tcHRfdGFza19pZF90IHRhc2tfaWQgPSBpbmZvID8gIGluZm8tPnRhc2tfaWQgOiAwOworICAgIHJldHVybiB0YXNrX2lkOworfQorCisKK3ZvaWQgKgorX19vbXB0X2dldF90YXNrX2Z1bmN0aW9uX2ludGVybmFsKGludCBkZXB0aCkKK3sKKyAgICBvbXB0X3Rhc2tfaW5mb190ICppbmZvID0gX19vbXB0X2dldF90YXNraW5mbyhkZXB0aCk7CisgICAgdm9pZCAqZnVuY3Rpb24gPSBpbmZvID8gaW5mby0+ZnVuY3Rpb24gOiBOVUxMOworICAgIHJldHVybiBmdW5jdGlvbjsKK30KKworCitvbXB0X2ZyYW1lX3QgKgorX19vbXB0X2dldF90YXNrX2ZyYW1lX2ludGVybmFsKGludCBkZXB0aCkKK3sKKyAgICBvbXB0X3Rhc2tfaW5mb190ICppbmZvID0gX19vbXB0X2dldF90YXNraW5mbyhkZXB0aCk7CisgICAgb21wdF9mcmFtZV90ICpmcmFtZSA9IGluZm8gPyBmcmFtZSA9ICZpbmZvLT5mcmFtZSA6IE5VTEw7CisgICAgcmV0dXJuIGZyYW1lOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdGVhbSBzdXBwb3J0CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZAorX19vbXB0X3RlYW1fYXNzaWduX2lkKGttcF90ZWFtX3QgKnRlYW0sIG9tcHRfcGFyYWxsZWxfaWRfdCBvbXB0X3BpZCkKK3sKKyAgICB0ZWFtLT50Lm9tcHRfdGVhbV9pbmZvLnBhcmFsbGVsX2lkID0gb21wdF9waWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9vbXB0LXNwZWNpZmljLmggYi9maW5hbC9ydW50aW1lL3NyYy9vbXB0LXNwZWNpZmljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThmODRhOQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL29tcHQtc3BlY2lmaWMuaApAQCAtMCwwICsxLDkwIEBACisjaWZuZGVmIE9NUFRfU1BFQ0lGSUNfSAorI2RlZmluZSBPTVBUX1NQRUNJRklDX0gKKworI2luY2x1ZGUgImttcC5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHR5cGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBrbXBfaW5mb190IG9tcHRfdGhyZWFkX3Q7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGZvcndhcmQgZGVjbGFyYXRpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBfX29tcHRfdGVhbV9hc3NpZ25faWQoa21wX3RlYW1fdCAqdGVhbSwgb21wdF9wYXJhbGxlbF9pZF90IG9tcHRfcGlkKTsKK3ZvaWQgX19vbXB0X3RocmVhZF9hc3NpZ25fd2FpdF9pZCh2b2lkICp2YXJpYWJsZSk7CisKK3ZvaWQgX19vbXB0X2x3X3Rhc2t0ZWFtX2luaXQob21wdF9sd190YXNrdGVhbV90ICpsd3QsIG9tcHRfdGhyZWFkX3QgKnRociwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGd0aWQsIHZvaWQgKm1pY3JvdGFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9pZF90IG9tcHRfcGlkKTsKKwordm9pZCBfX29tcHRfbHdfdGFza3RlYW1fbGluayhvbXB0X2x3X3Rhc2t0ZWFtX3QgKmx3dCwgIG9tcHRfdGhyZWFkX3QgKnRocik7CisKK29tcHRfbHdfdGFza3RlYW1fdCAqIF9fb21wdF9sd190YXNrdGVhbV91bmxpbmsob21wdF90aHJlYWRfdCAqdGhyKTsKKworb21wdF9wYXJhbGxlbF9pZF90IF9fb21wdF9wYXJhbGxlbF9pZF9uZXcoaW50IGd0aWQpOworb21wdF90YXNrX2lkX3QgX19vbXB0X3Rhc2tfaWRfbmV3KGludCBndGlkKTsKKworb21wdF90ZWFtX2luZm9fdCAqX19vbXB0X2dldF90ZWFtaW5mbyhpbnQgZGVwdGgsIGludCAqc2l6ZSk7CisKK29tcHRfdGFza19pbmZvX3QgKl9fb21wdF9nZXRfdGFza2luZm8oaW50IGRlcHRoKTsKKwordm9pZCBfX29tcHRfdGhyZWFkX2JlZ2luKG9tcHRfdGhyZWFkX3R5cGVfdCB0aHJlYWRfdHlwZSwgaW50IGd0aWQpOworCit2b2lkIF9fb21wdF90aHJlYWRfZW5kKG9tcHRfdGhyZWFkX3R5cGVfdCB0aHJlYWRfdHlwZSwgaW50IGd0aWQpOworCitpbnQgX19vbXB0X2dldF9wYXJhbGxlbF90ZWFtX3NpemVfaW50ZXJuYWwoaW50IGFuY2VzdG9yX2xldmVsKTsKKworb21wdF90YXNrX2lkX3QgX19vbXB0X2dldF90YXNrX2lkX2ludGVybmFsKGludCBkZXB0aCk7CisKK29tcHRfZnJhbWVfdCAqX19vbXB0X2dldF90YXNrX2ZyYW1lX2ludGVybmFsKGludCBkZXB0aCk7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIG1hY3JvcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgT01QVF9IQVZFX1dFQUtfQVRUUklCVVRFIEtNUF9IQVZFX1dFQUtfQVRUUklCVVRFCisjZGVmaW5lIE9NUFRfSEFWRV9QU0FQSSBLTVBfSEFWRV9QU0FQSQorI2RlZmluZSBPTVBUX1NUUl9NQVRDSChoYXlzdGFjaywgbmVlZGxlKSBfX2ttcF9zdHJfbWF0Y2goaGF5c3RhY2ssIDAsIG5lZWRsZSkKKworCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBpbmxpbmUgZnVuY3Rpb25zCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitpbmxpbmUgb21wdF90aHJlYWRfdCAqCitvbXB0X2dldF90aHJlYWRfZ3RpZChpbnQgZ3RpZCkKK3sKKyAgICByZXR1cm4gKGd0aWQgPj0gMCkgPyBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKGd0aWQpIDogTlVMTDsKK30KKworCitpbmxpbmUgb21wdF90aHJlYWRfdCAqCitvbXB0X2dldF90aHJlYWQoKQoreworICAgIGludCBndGlkID0gX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKTsKKyAgICByZXR1cm4gb21wdF9nZXRfdGhyZWFkX2d0aWQoZ3RpZCk7Cit9CisKKworaW5saW5lIHZvaWQgCitvbXB0X3NldF90aHJlYWRfc3RhdGUob21wdF90aHJlYWRfdCAqdGhyZWFkLCBvbXB0X3N0YXRlX3Qgc3RhdGUpCit7CisgICAgdGhyZWFkLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID0gc3RhdGU7IAorfQorCisKK2lubGluZSBjb25zdCBjaGFyICoKK29tcHRfZ2V0X3J1bnRpbWVfdmVyc2lvbigpCit7CisgICAgcmV0dXJuICZfX2ttcF92ZXJzaW9uX2xpYl92ZXJbS01QX1ZFUlNJT05fTUFHSUNfTEVOXTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy90ZXN0LXRvdWNoLmMgYi9maW5hbC9ydW50aW1lL3NyYy90ZXN0LXRvdWNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNlNTI5YQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL3Rlc3QtdG91Y2guYwpAQCAtMCwwICsxLDMxIEBACisvLyB0ZXN0LXRvdWNoLmMgLy8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKK2V4dGVybiBkb3VibGUgb21wX2dldF93dGltZSgpOworZXh0ZXJuIGludCAgICBvbXBfZ2V0X251bV90aHJlYWRzKCk7CitleHRlcm4gaW50ICAgIG9tcF9nZXRfbWF4X3RocmVhZHMoKTsKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKK2ludCBtYWluKCkgeworICAgIG9tcF9nZXRfd3RpbWUoKTsKKyAgICBvbXBfZ2V0X251bV90aHJlYWRzKCk7CisgICAgb21wX2dldF9tYXhfdGhyZWFkcygpOworICAgIHJldHVybiAwOworfQorCisvLyBlbmQgb2YgZmlsZSAvLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvZGlzYWJsZV93YXJuaW5ncy5oIGIvZmluYWwvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvZGlzYWJsZV93YXJuaW5ncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMjQyZmQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9kaXNhYmxlX3dhcm5pbmdzLmgKQEAgLTAsMCArMSwyOSBAQAorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiaXR0bm90aWZ5X2NvbmZpZy5oIgorCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisKKyNwcmFnbWEgd2FybmluZyAoZGlzYWJsZTogNTkzKSAgIC8qIHBhcmFtZXRlciAiWFhYWCIgd2FzIHNldCBidXQgbmV2ZXIgdXNlZCAgICAgICAgICAgICAgICAgKi8KKyNwcmFnbWEgd2FybmluZyAoZGlzYWJsZTogMzQ0KSAgIC8qIHR5cGVkZWYgbmFtZSBoYXMgYWxyZWFkeSBiZWVuIGRlY2xhcmVkICh3aXRoIHNhbWUgdHlwZSkgKi8KKyNwcmFnbWEgd2FybmluZyAoZGlzYWJsZTogMTc0KSAgIC8qIGV4cHJlc3Npb24gaGFzIG5vIGVmZmVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNwcmFnbWEgd2FybmluZyAoZGlzYWJsZTogNDEyNykgIC8qIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gaXMgY29uc3RhbnQgICAgICAgICAgICAgICAgICAgICAgKi8KKyNwcmFnbWEgd2FybmluZyAoZGlzYWJsZTogNDMwNikgIC8qIGNvbnZlcnNpb24gZnJvbSAnPycgdG8gJz8nIG9mIGdyZWF0ZXIgc2l6ZSAgICAgICAgICAgICAgKi8KKworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisjaWYgZGVmaW5lZCBfX0lOVEVMX0NPTVBJTEVSCisKKyNwcmFnbWEgd2FybmluZyAoZGlzYWJsZTogODY5KSAgLyogcGFyYW1ldGVyICJYWFhYWCIgd2FzIG5ldmVyIHJlZmVyZW5jZWQgICAgICAgICAgICAgICAgICAqLworI3ByYWdtYSB3YXJuaW5nIChkaXNhYmxlOiAxNDE4KSAvKiBleHRlcm5hbCBmdW5jdGlvbiBkZWZpbml0aW9uIHdpdGggbm8gcHJpb3IgZGVjbGFyYXRpb24gICovCisjcHJhZ21hIHdhcm5pbmcgKGRpc2FibGU6IDE0MTkpIC8qIGV4dGVybmFsIGRlY2xhcmF0aW9uIGluIHByaW1hcnkgc291cmNlIGZpbGUgICAgICAgICAgICAgKi8KKworI2VuZGlmIC8qIF9fSU5URUxfQ09NUElMRVIgKi8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2l0dG5vdGlmeS5oIGIvZmluYWwvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvaXR0bm90aWZ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM3OTJmMwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2l0dG5vdGlmeS5oCkBAIC0wLDAgKzEsMzgwNCBAQAorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9JVFROT1RJRllfSF8KKyNkZWZpbmUgX0lUVE5PVElGWV9IXworCisvKioKK0BmaWxlCitAYnJpZWYgUHVibGljIFVzZXIgQVBJIGZ1bmN0aW9ucyBhbmQgdHlwZXMKK0BtYWlucGFnZQorCitUaGUgSVRUIEFQSSBpcyB1c2VkIHRvIGFubm90YXRlIGEgdXNlcidzIHByb2dyYW0gd2l0aCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCit0aGF0IGNhbiBiZSB1c2VkIGJ5IGNvcnJlY3RuZXNzIGFuZCBwZXJmb3JtYW5jZSB0b29scy4gVGhlIHVzZXIgaW5zZXJ0cworY2FsbHMgaW4gdGhlaXIgcHJvZ3JhbS4gVGhvc2UgY2FsbHMgZ2VuZXJhdGUgaW5mb3JtYXRpb24gdGhhdCBpcyBjb2xsZWN0ZWQKK2F0IHJ1bnRpbWUsIGFuZCB1c2VkIGJ5IEludGVsKFIpIFRocmVhZGluZyBUb29scy4KKworQHNlY3Rpb24gQVBJIENvbmNlcHRzCitUaGUgZm9sbG93aW5nIGdlbmVyYWwgY29uY2VwdHMgYXJlIHVzZWQgdGhyb3VnaG91dCB0aGUgQVBJLgorCitAc3Vic2VjdGlvbiBVbmljb2RlIFN1cHBvcnQKK01hbnkgQVBJIGZ1bmN0aW9ucyB0YWtlIGNoYXJhY3RlciBzdHJpbmcgYXJndW1lbnRzLiBPbiBXaW5kb3dzLCB0aGVyZQorYXJlIHR3byB2ZXJzaW9ucyBvZiBlYWNoIHN1Y2ggZnVuY3Rpb24uIFRoZSBmdW5jdGlvbiBuYW1lIGlzIHN1ZmZpeGVkCitieSBXIGlmIFVuaWNvZGUgc3VwcG9ydCBpcyBlbmFibGVkLCBhbmQgYnkgQSBvdGhlcndpc2UuIEFueSBBUEkgZnVuY3Rpb24KK3RoYXQgdGFrZXMgYSBjaGFyYWN0ZXIgc3RyaW5nIGFyZ3VtZW50IGFkaGVyZXMgdG8gdGhpcyBjb252ZW50aW9uLgorCitAc3Vic2VjdGlvbiBDb25kaXRpb25hbCBDb21waWxhdGlvbgorTWFueSB1c2VycyBwcmVmZXIgaGF2aW5nIGFuIG9wdGlvbiB0byBtb2RpZnkgSVRUIEFQSSBjb2RlIHdoZW4gbGlua2luZyBpdAoraW5zaWRlIHRoZWlyIHJ1bnRpbWVzLiBJVFQgQVBJIGhlYWRlciBmaWxlIHByb3ZpZGVzIGEgbWVjaGFuaXNtIHRvIHJlcGxhY2UKK0lUVCBBUEkgZnVuY3Rpb24gbmFtZXMgaW5zaWRlIHlvdXIgY29kZSB3aXRoIGVtcHR5IHN0cmluZ3MuIFRvIGRvIHRoaXMsCitkZWZpbmUgdGhlIG1hY3JvcyBJTlRFTF9OT19JVFROT1RJRllfQVBJIGR1cmluZyBjb21waWxhdGlvbiBhbmQgcmVtb3ZlIHRoZQorc3RhdGljIGxpYnJhcnkgZnJvbSB0aGUgbGlua2VyIHNjcmlwdC4KKworQHN1YnNlY3Rpb24gRG9tYWlucworW3NlZSBkb21haW5zXQorRG9tYWlucyBwcm92aWRlIGEgd2F5IHRvIHNlcGFyYXRlIG5vdGlmaWNhdGlvbiBmb3IgZGlmZmVyZW50IG1vZHVsZXMgb3IKK2xpYnJhcmllcyBpbiBhIHByb2dyYW0uIERvbWFpbnMgYXJlIHNwZWNpZmllZCBieSBkb3R0ZWQgY2hhcmFjdGVyIHN0cmluZ3MsCitlLmcuIFRCQi5JbnRlcm5hbC5Db250cm9sLgorCitBIG1lY2hhbmlzbSAodG8gYmUgc3BlY2lmaWVkKSBpcyBwcm92aWRlZCB0byBlbmFibGUgYW5kIGRpc2FibGUKK2RvbWFpbnMuIEJ5IGRlZmF1bHQsIGFsbCBkb21haW5zIGFyZSBlbmFibGVkLgorQHN1YnNlY3Rpb24gTmFtZWQgRW50aXRpZXMgYW5kIEluc3RhbmNlcworTmFtZWQgZW50aXRpZXMgKGZyYW1lcywgcmVnaW9ucywgdGFza3MsIGFuZCBtYXJrZXJzKSBjb21tdW5pY2F0ZQoraW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb2dyYW0gdG8gdGhlIGFuYWx5c2lzIHRvb2xzLiBBIG5hbWVkIGVudGl0eSBvZnRlbgorcmVmZXJzIHRvIGEgc2VjdGlvbiBvZiBwcm9ncmFtIGNvZGUsIG9yIHRvIHNvbWUgc2V0IG9mIGxvZ2ljYWwgY29uY2VwdHMKK3RoYXQgdGhlIHByb2dyYW1tZXIgd2FudHMgdG8gZ3JvdXAgdG9nZXRoZXIuCisKK05hbWVkIGVudGl0aWVzIHJlbGF0ZSB0byB0aGUgcHJvZ3JhbW1lcidzIHN0YXRpYyB2aWV3IG9mIHRoZSBwcm9ncmFtLiBXaGVuCit0aGUgcHJvZ3JhbSBhY3R1YWxseSBleGVjdXRlcywgbWFueSBpbnN0YW5jZXMgb2YgYSBnaXZlbiBuYW1lZCBlbnRpdHkKK21heSBiZSBjcmVhdGVkLgorCitUaGUgQVBJIGFubm90YXRpb25zIGRlbm90ZSBpbnN0YW5jZXMgb2YgbmFtZWQgZW50aXRpZXMuIFRoZSBhY3R1YWwKK25hbWVkIGVudGl0aWVzIGFyZSBkaXNwbGF5ZWQgdXNpbmcgdGhlIGFuYWx5c2lzIHRvb2xzLiBJbiBvdGhlciB3b3JkcywKK3RoZSBuYW1lZCBlbnRpdGllcyBjb21lIGludG8gZXhpc3RlbmNlIHdoZW4gaW5zdGFuY2VzIGFyZSBjcmVhdGVkLgorCitJbnN0YW5jZXMgb2YgbmFtZWQgZW50aXRpZXMgbWF5IGhhdmUgaW5zdGFuY2UgaWRlbnRpZmllcnMgKElEcykuIFNvbWUKK0FQSSBjYWxscyB1c2UgaW5zdGFuY2UgaWRlbnRpZmllcnMgdG8gY3JlYXRlIHJlbGF0aW9uc2hpcHMgYmV0d2VlbgorZGlmZmVyZW50IGluc3RhbmNlcyBvZiBuYW1lZCBlbnRpdGllcy4gT3RoZXIgQVBJIGNhbGxzIGFzc29jaWF0ZSBkYXRhCit3aXRoIGluc3RhbmNlcyBvZiBuYW1lZCBlbnRpdGllcy4KKworU29tZSBuYW1lZCBlbnRpdGllcyBtdXN0IGFsd2F5cyBoYXZlIGluc3RhbmNlIElEcy4gSW4gcGFydGljdWxhciwgcmVnaW9ucworYW5kIGZyYW1lcyBhbHdheXMgaGF2ZSBJRHMuIFRhc2sgYW5kIG1hcmtlcnMgbmVlZCBJRHMgb25seSBpZiB0aGUgSUQgaXMKK25lZWRlZCBpbiBhbm90aGVyIEFQSSBjYWxsIChzdWNoIGFzIGFkZGluZyBhIHJlbGF0aW9uIG9yIG1ldGFkYXRhKS4KKworVGhlIGxpZmV0aW1lIG9mIGluc3RhbmNlIElEcyBpcyBkaXN0aW5jdCBmcm9tIHRoZSBsaWZldGltZSBvZgoraW5zdGFuY2VzLiBUaGlzIGFsbG93cyB2YXJpb3VzIHJlbGF0aW9uc2hpcHMgdG8gYmUgc3BlY2lmaWVkIHNlcGFyYXRlCitmcm9tIHRoZSBhY3R1YWwgZXhlY3V0aW9uIG9mIGluc3RhbmNlcy4gVGhpcyBmbGV4aWJpbGl0eSBjb21lcyBhdCB0aGUKK2V4cGVuc2Ugb2YgZXh0cmEgQVBJIGNhbGxzLgorCitUaGUgc2FtZSBJRCBtYXkgbm90IGJlIHJldXNlZCBmb3IgZGlmZmVyZW50IGluc3RhbmNlcywgdW5sZXNzIGEgcHJldmlvdXMKK1tyZWZdIF9faXR0X2lkX2Rlc3Ryb3kgY2FsbCBmb3IgdGhhdCBJRCBoYXMgYmVlbiBpc3N1ZWQuCisqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSVRUX09TX1dJTgorIyAgZGVmaW5lIElUVF9PU19XSU4gICAxCisjZW5kaWYgLyogSVRUX09TX1dJTiAqLworCisjaWZuZGVmIElUVF9PU19MSU5VWAorIyAgZGVmaW5lIElUVF9PU19MSU5VWCAyCisjZW5kaWYgLyogSVRUX09TX0xJTlVYICovCisKKyNpZm5kZWYgSVRUX09TX01BQworIyAgZGVmaW5lIElUVF9PU19NQUMgICAzCisjZW5kaWYgLyogSVRUX09TX01BQyAqLworCisjaWZuZGVmIElUVF9PUworIyAgaWYgZGVmaW5lZCBXSU4zMiB8fCBkZWZpbmVkIF9XSU4zMgorIyAgICBkZWZpbmUgSVRUX09TIElUVF9PU19XSU4KKyMgIGVsaWYgZGVmaW5lZCggX19BUFBMRV9fICkgJiYgZGVmaW5lZCggX19NQUNIX18gKQorIyAgICBkZWZpbmUgSVRUX09TIElUVF9PU19NQUMKKyMgIGVsc2UKKyMgICAgZGVmaW5lIElUVF9PUyBJVFRfT1NfTElOVVgKKyMgIGVuZGlmCisjZW5kaWYgLyogSVRUX09TICovCisKKyNpZm5kZWYgSVRUX1BMQVRGT1JNX1dJTgorIyAgZGVmaW5lIElUVF9QTEFURk9STV9XSU4gMQorI2VuZGlmIC8qIElUVF9QTEFURk9STV9XSU4gKi8KKworI2lmbmRlZiBJVFRfUExBVEZPUk1fUE9TSVgKKyMgIGRlZmluZSBJVFRfUExBVEZPUk1fUE9TSVggMgorI2VuZGlmIC8qIElUVF9QTEFURk9STV9QT1NJWCAqLworCisjaWZuZGVmIElUVF9QTEFURk9STV9NQUMKKyMgIGRlZmluZSBJVFRfUExBVEZPUk1fTUFDIDMKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk1fTUFDICovCisKKyNpZm5kZWYgSVRUX1BMQVRGT1JNCisjICBpZiBJVFRfT1M9PUlUVF9PU19XSU4KKyMgICAgZGVmaW5lIElUVF9QTEFURk9STSBJVFRfUExBVEZPUk1fV0lOCisjICBlbGlmIElUVF9PUz09SVRUX09TX01BQworIyAgICBkZWZpbmUgSVRUX1BMQVRGT1JNIElUVF9QTEFURk9STV9NQUMKKyMgIGVsc2UKKyMgICAgZGVmaW5lIElUVF9QTEFURk9STSBJVFRfUExBVEZPUk1fUE9TSVgKKyMgIGVuZGlmCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNICovCisKKyNpZiBkZWZpbmVkKF9VTklDT0RFKSAmJiAhZGVmaW5lZChVTklDT0RFKQorI2RlZmluZSBVTklDT0RFCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2luY2x1ZGUgPHRjaGFyLmg+CisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorI2luY2x1ZGUgPHdjaGFyLmg+CisjZW5kaWYgLyogVU5JQ09ERSB8fCBfVU5JQ09ERSAqLworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisjaWZuZGVmIENERUNMCisjICBpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyMgICAgZGVmaW5lIENERUNMIF9fY2RlY2wKKyMgIGVsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjICAgIGlmIGRlZmluZWQgX01fSVg4NiB8fCBkZWZpbmVkIF9faTM4Nl9fIAorIyAgICAgIGRlZmluZSBDREVDTCBfX2F0dHJpYnV0ZV9fICgoY2RlY2wpKQorIyAgICBlbHNlICAvKiBfTV9JWDg2IHx8IF9faTM4Nl9fICovCisjICAgICAgZGVmaW5lIENERUNMIC8qIGFjdHVhbCBvbmx5IG9uIHg4NiBwbGF0Zm9ybSAqLworIyAgICBlbmRpZiAvKiBfTV9JWDg2IHx8IF9faTM4Nl9fICovCisjICBlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBDREVDTCAqLworCisjaWZuZGVmIFNURENBTEwKKyMgIGlmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorIyAgICBkZWZpbmUgU1REQ0FMTCBfX3N0ZGNhbGwKKyMgIGVsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjICAgIGlmIGRlZmluZWQgX01fSVg4NiB8fCBkZWZpbmVkIF9faTM4Nl9fCisjICAgICAgZGVmaW5lIFNURENBTEwgX19hdHRyaWJ1dGVfXyAoKHN0ZGNhbGwpKSAKKyMgICAgZWxzZSAgLyogX01fSVg4NiB8fCBfX2kzODZfXyAqLworIyAgICAgIGRlZmluZSBTVERDQUxMIC8qIHN1cHBvcnRlZCBvbmx5IG9uIHg4NiBwbGF0Zm9ybSAqLworIyAgICBlbmRpZiAvKiBfTV9JWDg2IHx8IF9faTM4Nl9fICovCisjICBlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBTVERDQUxMICovCisKKyNkZWZpbmUgSVRUQVBJICAgIENERUNMCisjZGVmaW5lIExJQklUVEFQSSBDREVDTAorCisvKiBUT0RPOiBUZW1wb3JhcnkgZm9yIGNvbXBhdGliaWxpdHkhICovCisjZGVmaW5lIElUVEFQSV9DQUxMICAgIENERUNMCisjZGVmaW5lIExJQklUVEFQSV9DQUxMIENERUNMCisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKy8qIHVzZSBfX2ZvcmNlaW5saW5lIChWQysrIHNwZWNpZmljKSAqLworI2RlZmluZSBJVFRfSU5MSU5FICAgICAgICAgICBfX2ZvcmNlaW5saW5lCisjZGVmaW5lIElUVF9JTkxJTkVfQVRUUklCVVRFIC8qIG5vdGhpbmcgKi8KKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKy8qCisgKiBHZW5lcmFsbHksIGZ1bmN0aW9ucyBhcmUgbm90IGlubGluZWQgdW5sZXNzIG9wdGltaXphdGlvbiBpcyBzcGVjaWZpZWQuCisgKiBGb3IgZnVuY3Rpb25zIGRlY2xhcmVkIGlubGluZSwgdGhpcyBhdHRyaWJ1dGUgaW5saW5lcyB0aGUgZnVuY3Rpb24gZXZlbgorICogaWYgbm8gb3B0aW1pemF0aW9uIGxldmVsIHdhcyBzcGVjaWZpZWQuCisgKi8KKyNpZmRlZiBfX1NUUklDVF9BTlNJX18KKyNkZWZpbmUgSVRUX0lOTElORSAgICAgICAgICAgc3RhdGljCisjZGVmaW5lIElUVF9JTkxJTkVfQVRUUklCVVRFIF9fYXR0cmlidXRlX18oKHVudXNlZCkpCisjZWxzZSAgLyogX19TVFJJQ1RfQU5TSV9fICovCisjZGVmaW5lIElUVF9JTkxJTkUgICAgICAgICAgIHN0YXRpYyBpbmxpbmUKKyNkZWZpbmUgSVRUX0lOTElORV9BVFRSSUJVVEUgX19hdHRyaWJ1dGVfXygoYWx3YXlzX2lubGluZSwgdW51c2VkKSkKKyNlbmRpZiAvKiBfX1NUUklDVF9BTlNJX18gKi8KKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKy8qKiBAZW5kY29uZCAqLworCisjaWZkZWYgSU5URUxfSVRUTk9USUZZX0VOQUJMRV9MRUdBQ1kKKyMgIGlmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorIyAgICBwcmFnbWEgbWVzc2FnZSgiV0FSTklORyEhISBEZXByZWNhdGVkIEFQSSBpcyB1c2VkLiBQbGVhc2UgdW5kZWZpbmUgSU5URUxfSVRUTk9USUZZX0VOQUJMRV9MRUdBQ1kgbWFjcm8iKQorIyAgZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyMgICAgd2FybmluZyAiRGVwcmVjYXRlZCBBUEkgaXMgdXNlZC4gUGxlYXNlIHVuZGVmaW5lIElOVEVMX0lUVE5PVElGWV9FTkFCTEVfTEVHQUNZIG1hY3JvIgorIyAgZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjICBpbmNsdWRlICJsZWdhY3kvaXR0bm90aWZ5LmgiCisjZW5kaWYgLyogSU5URUxfSVRUTk9USUZZX0VOQUJMRV9MRUdBQ1kgKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisvKiBIZWxwZXIgbWFjcm8gZm9yIGpvaW5pbmcgdG9rZW5zICovCisjZGVmaW5lIElUVF9KT0lOX0FVWChwLG4pIHAjI24KKyNkZWZpbmUgSVRUX0pPSU4ocCxuKSAgICAgSVRUX0pPSU5fQVVYKHAsbikKKworI2lmZGVmIElUVF9NQUpPUgorI3VuZGVmIElUVF9NQUpPUgorI2VuZGlmCisjaWZkZWYgSVRUX01JTk9SCisjdW5kZWYgSVRUX01JTk9SCisjZW5kaWYKKyNkZWZpbmUgSVRUX01BSk9SICAgICAzCisjZGVmaW5lIElUVF9NSU5PUiAgICAgMAorCisvKiBTdGFuZGFyZCB2ZXJzaW9uaW5nIG9mIGEgdG9rZW4gd2l0aCBtYWpvciBhbmQgbWlub3IgdmVyc2lvbiBudW1iZXJzICovCisjZGVmaW5lIElUVF9WRVJTSU9OSVpFKHgpICAgIFwKKyAgICBJVFRfSk9JTih4LCAgICAgICAgICAgICAgXAorICAgIElUVF9KT0lOKF8sICAgICAgICAgICAgICBcCisgICAgSVRUX0pPSU4oSVRUX01BSk9SLCAgICAgIFwKKyAgICBJVFRfSk9JTihfLCBJVFRfTUlOT1IpKSkpCisKKyNpZm5kZWYgSU5URUxfSVRUTk9USUZZX1BSRUZJWAorIyAgZGVmaW5lIElOVEVMX0lUVE5PVElGWV9QUkVGSVggX19pdHRfCisjZW5kaWYgLyogSU5URUxfSVRUTk9USUZZX1BSRUZJWCAqLworI2lmbmRlZiBJTlRFTF9JVFROT1RJRllfUE9TVEZJWAorIyAgZGVmaW5lIElOVEVMX0lUVE5PVElGWV9QT1NURklYIF9wdHJfCisjZW5kaWYgLyogSU5URUxfSVRUTk9USUZZX1BPU1RGSVggKi8KKworI2RlZmluZSBJVFROT1RJRllfTkFNRV9BVVgobikgSVRUX0pPSU4oSU5URUxfSVRUTk9USUZZX1BSRUZJWCxuKQorI2RlZmluZSBJVFROT1RJRllfTkFNRShuKSAgICAgSVRUX1ZFUlNJT05JWkUoSVRUTk9USUZZX05BTUVfQVVYKElUVF9KT0lOKG4sSU5URUxfSVRUTk9USUZZX1BPU1RGSVgpKSkKKworI2RlZmluZSBJVFROT1RJRllfVk9JRChuKSAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICh2b2lkKTAgOiBJVFROT1RJRllfTkFNRShuKQorI2RlZmluZSBJVFROT1RJRllfREFUQShuKSAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICAgICAgIDAgOiBJVFROT1RJRllfTkFNRShuKQorCisjZGVmaW5lIElUVE5PVElGWV9WT0lEX0QwKG4sZCkgICAgICAgKCEoZCktPmZsYWdzKSA/ICh2b2lkKTAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICh2b2lkKTAgOiBJVFROT1RJRllfTkFNRShuKShkKQorI2RlZmluZSBJVFROT1RJRllfVk9JRF9EMShuLGQseCkgICAgICghKGQpLT5mbGFncykgPyAodm9pZCkwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAodm9pZCkwIDogSVRUTk9USUZZX05BTUUobikoZCx4KQorI2RlZmluZSBJVFROT1RJRllfVk9JRF9EMihuLGQseCx5KSAgICghKGQpLT5mbGFncykgPyAodm9pZCkwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAodm9pZCkwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkpCisjZGVmaW5lIElUVE5PVElGWV9WT0lEX0QzKG4sZCx4LHkseikgKCEoZCktPmZsYWdzKSA/ICh2b2lkKTAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICh2b2lkKTAgOiBJVFROT1RJRllfTkFNRShuKShkLHgseSx6KQorI2RlZmluZSBJVFROT1RJRllfVk9JRF9ENChuLGQseCx5LHosYSkgICAgICghKGQpLT5mbGFncykgPyAodm9pZCkwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAodm9pZCkwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkseixhKQorI2RlZmluZSBJVFROT1RJRllfVk9JRF9ENShuLGQseCx5LHosYSxiKSAgICghKGQpLT5mbGFncykgPyAodm9pZCkwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAodm9pZCkwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkseixhLGIpCisjZGVmaW5lIElUVE5PVElGWV9WT0lEX0Q2KG4sZCx4LHkseixhLGIsYykgKCEoZCktPmZsYWdzKSA/ICh2b2lkKTAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICh2b2lkKTAgOiBJVFROT1RJRllfTkFNRShuKShkLHgseSx6LGEsYixjKQorI2RlZmluZSBJVFROT1RJRllfREFUQV9EMChuLGQpICAgICAgICghKGQpLT5mbGFncykgPyAgICAgICAwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAgICAgICAwIDogSVRUTk9USUZZX05BTUUobikoZCkKKyNkZWZpbmUgSVRUTk9USUZZX0RBVEFfRDEobixkLHgpICAgICAoIShkKS0+ZmxhZ3MpID8gICAgICAgMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gICAgICAgMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCkKKyNkZWZpbmUgSVRUTk9USUZZX0RBVEFfRDIobixkLHgseSkgICAoIShkKS0+ZmxhZ3MpID8gICAgICAgMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gICAgICAgMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5KQorI2RlZmluZSBJVFROT1RJRllfREFUQV9EMyhuLGQseCx5LHopICghKGQpLT5mbGFncykgPyAgICAgICAwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAgICAgICAwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkseikKKyNkZWZpbmUgSVRUTk9USUZZX0RBVEFfRDQobixkLHgseSx6LGEpICAgICAoIShkKS0+ZmxhZ3MpID8gMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gICAgICAgMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5LHosYSkKKyNkZWZpbmUgSVRUTk9USUZZX0RBVEFfRDUobixkLHgseSx6LGEsYikgICAoIShkKS0+ZmxhZ3MpID8gMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gICAgICAgMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5LHosYSxiKQorI2RlZmluZSBJVFROT1RJRllfREFUQV9ENihuLGQseCx5LHosYSxiLGMpICghKGQpLT5mbGFncykgPyAwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAgICAgICAwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkseixhLGIsYykKKworI2lmZGVmIElUVF9TVFVCCisjdW5kZWYgSVRUX1NUVUIKKyNlbmRpZgorI2lmZGVmIElUVF9TVFVCVgorI3VuZGVmIElUVF9TVFVCVgorI2VuZGlmCisjZGVmaW5lIElUVF9TVFVCVihhcGksdHlwZSxuYW1lLGFyZ3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdHlwZWRlZiB0eXBlIChhcGkqIElUVF9KT0lOKElUVE5PVElGWV9OQU1FKG5hbWUpLF90KSkgYXJnczsgICBcCisgICAgZXh0ZXJuIElUVF9KT0lOKElUVE5PVElGWV9OQU1FKG5hbWUpLF90KSBJVFROT1RJRllfTkFNRShuYW1lKTsKKyNkZWZpbmUgSVRUX1NUVUIgSVRUX1NUVUJWCisvKiogQGVuZGNvbmQgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2dwYV9kb2N1bWVudGF0aW9uICovCisvKioKKyAqIEBkZWZncm91cCBwdWJsaWMgUHVibGljIEFQSQorICogQHsKKyAqIEB9CisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgY29udHJvbCBDb2xsZWN0aW9uIENvbnRyb2wKKyAqIEBpbmdyb3VwIHB1YmxpYworICogR2VuZXJhbCBiZWhhdmlvcjogYXBwbGljYXRpb24gY29udGludWVzIHRvIHJ1biwgYnV0IG5vIHByb2ZpbGluZyBpbmZvcm1hdGlvbiBpcyBiZWluZyBjb2xsZWN0ZWQKKyAqCisgKiBQYXVzaW5nIG9jY3VycyBub3Qgb25seSBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkIGJ1dCBmb3IgYWxsIHByb2Nlc3MgYXMgd2VsbCBhcyBzcGF3bmVkIHByb2Nlc3NlcworICogLSBJbnRlbChSKSBQYXJhbGxlbCBJbnNwZWN0b3IgYW5kIEludGVsKFIpIEluc3BlY3RvciBYRToKKyAqICAgLSBEb2VzIG5vdCBhbmFseXplIG9yIHJlcG9ydCBlcnJvcnMgdGhhdCBpbnZvbHZlIG1lbW9yeSBhY2Nlc3MuCisgKiAgIC0gT3RoZXIgZXJyb3JzIGFyZSByZXBvcnRlZCBhcyB1c3VhbC4gUGF1c2luZyBkYXRhIGNvbGxlY3Rpb24gaW4KKyAqICAgICBJbnRlbChSKSBQYXJhbGxlbCBJbnNwZWN0b3IgYW5kIEludGVsKFIpIEluc3BlY3RvciBYRQorICogICAgIG9ubHkgcGF1c2VzIHRyYWNpbmcgYW5kIGFuYWx5emluZyBtZW1vcnkgYWNjZXNzLgorICogICAgIEl0IGRvZXMgbm90IHBhdXNlIHRyYWNpbmcgb3IgYW5hbHl6aW5nIHRocmVhZGluZyBBUElzLgorICogICAuCisgKiAtIEludGVsKFIpIFBhcmFsbGVsIEFtcGxpZmllciBhbmQgSW50ZWwoUikgVlR1bmUoVE0pIEFtcGxpZmllciBYRToKKyAqICAgLSBEb2VzIGNvbnRpbnVlIHRvIHJlY29yZCB3aGVuIG5ldyB0aHJlYWRzIGFyZSBzdGFydGVkLgorICogICAuCisgKiAtIE90aGVyIGVmZmVjdHM6CisgKiAgIC0gUG9zc2libGUgcmVkdWN0aW9uIG9mIHJ1bnRpbWUgb3ZlcmhlYWQuCisgKiAgIC4KKyAqIEB7CisgKi8KKy8qKiBAYnJpZWYgUGF1c2UgY29sbGVjdGlvbiAqLwordm9pZCBJVFRBUEkgX19pdHRfcGF1c2Uodm9pZCk7CisvKiogQGJyaWVmIFJlc3VtZSBjb2xsZWN0aW9uICovCit2b2lkIElUVEFQSSBfX2l0dF9yZXN1bWUodm9pZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHBhdXNlLCAgKHZvaWQpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgcmVzdW1lLCAodm9pZCkpCisjZGVmaW5lIF9faXR0X3BhdXNlICAgICAgSVRUTk9USUZZX1ZPSUQocGF1c2UpCisjZGVmaW5lIF9faXR0X3BhdXNlX3B0ciAgSVRUTk9USUZZX05BTUUocGF1c2UpCisjZGVmaW5lIF9faXR0X3Jlc3VtZSAgICAgSVRUTk9USUZZX1ZPSUQocmVzdW1lKQorI2RlZmluZSBfX2l0dF9yZXN1bWVfcHRyIElUVE5PVElGWV9OQU1FKHJlc3VtZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3BhdXNlKCkKKyNkZWZpbmUgX19pdHRfcGF1c2VfcHRyICAwCisjZGVmaW5lIF9faXR0X3Jlc3VtZSgpCisjZGVmaW5lIF9faXR0X3Jlc3VtZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3BhdXNlX3B0ciAgMAorI2RlZmluZSBfX2l0dF9yZXN1bWVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSBjb250cm9sIGdyb3VwICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgdGhyZWFkcyBUaHJlYWRzCisgKiBAaW5ncm91cCBwdWJsaWMKKyAqIEdpdmUgbmFtZXMgdG8gdGhyZWFkcworICogQHsKKyAqLworLyoqCisgKiBAYnJpZWYgU2V0cyB0aHJlYWQgbmFtZSBvZiBjYWxsaW5nIHRocmVhZAorICogQHBhcmFtW2luXSBuYW1lIC0gbmFtZSBvZiB0aHJlYWQKKyAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgordm9pZCBJVFRBUEkgX19pdHRfdGhyZWFkX3NldF9uYW1lQShjb25zdCBjaGFyICAgICpuYW1lKTsKK3ZvaWQgSVRUQVBJIF9faXR0X3RocmVhZF9zZXRfbmFtZVcoY29uc3Qgd2NoYXJfdCAqbmFtZSk7CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorIyAgZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZSAgICAgX19pdHRfdGhyZWFkX3NldF9uYW1lVworIyAgZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZV9wdHIgX19pdHRfdGhyZWFkX3NldF9uYW1lV19wdHIKKyNlbHNlIC8qIFVOSUNPREUgKi8KKyMgIGRlZmluZSBfX2l0dF90aHJlYWRfc2V0X25hbWUgICAgIF9faXR0X3RocmVhZF9zZXRfbmFtZUEKKyMgIGRlZmluZSBfX2l0dF90aHJlYWRfc2V0X25hbWVfcHRyIF9faXR0X3RocmVhZF9zZXRfbmFtZUFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLwordm9pZCBJVFRBUEkgX19pdHRfdGhyZWFkX3NldF9uYW1lKGNvbnN0IGNoYXIgKm5hbWUpOworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0aHJlYWRfc2V0X25hbWVBLCAoY29uc3QgY2hhciAgICAqbmFtZSkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0aHJlYWRfc2V0X25hbWVXLCAoY29uc3Qgd2NoYXJfdCAqbmFtZSkpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0aHJlYWRfc2V0X25hbWUsICAoY29uc3QgY2hhciAgICAqbmFtZSkpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZUEgICAgIElUVE5PVElGWV9WT0lEKHRocmVhZF9zZXRfbmFtZUEpCisjZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZUFfcHRyIElUVE5PVElGWV9OQU1FKHRocmVhZF9zZXRfbmFtZUEpCisjZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZVcgICAgIElUVE5PVElGWV9WT0lEKHRocmVhZF9zZXRfbmFtZVcpCisjZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZVdfcHRyIElUVE5PVElGWV9OQU1FKHRocmVhZF9zZXRfbmFtZVcpCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfdGhyZWFkX3NldF9uYW1lICAgICBJVFROT1RJRllfVk9JRCh0aHJlYWRfc2V0X25hbWUpCisjZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZV9wdHIgSVRUTk9USUZZX05BTUUodGhyZWFkX3NldF9uYW1lKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfdGhyZWFkX3NldF9uYW1lQShuYW1lKQorI2RlZmluZSBfX2l0dF90aHJlYWRfc2V0X25hbWVBX3B0ciAwCisjZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZVcobmFtZSkKKyNkZWZpbmUgX19pdHRfdGhyZWFkX3NldF9uYW1lV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZShuYW1lKQorI2RlZmluZSBfX2l0dF90aHJlYWRfc2V0X25hbWVfcHRyIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF90aHJlYWRfc2V0X25hbWVBX3B0ciAwCisjZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF90aHJlYWRfc2V0X25hbWVfcHRyIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9ncGFfZG9jdW1lbnRhdGlvbiAqLworCisvKioKKyAqIEBicmllZiBNYXJrIGN1cnJlbnQgdGhyZWFkIGFzIGlnbm9yZWQgZnJvbSB0aGlzIHBvaW50IG9uLCBmb3IgdGhlIGR1cmF0aW9uIG9mIGl0cyBleGlzdGVuY2UuCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3RocmVhZF9pZ25vcmUodm9pZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRocmVhZF9pZ25vcmUsICh2b2lkKSkKKyNkZWZpbmUgX19pdHRfdGhyZWFkX2lnbm9yZSAgICAgSVRUTk9USUZZX1ZPSUQodGhyZWFkX2lnbm9yZSkKKyNkZWZpbmUgX19pdHRfdGhyZWFkX2lnbm9yZV9wdHIgSVRUTk9USUZZX05BTUUodGhyZWFkX2lnbm9yZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3RocmVhZF9pZ25vcmUoKQorI2RlZmluZSBfX2l0dF90aHJlYWRfaWdub3JlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfdGhyZWFkX2lnbm9yZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IHRocmVhZHMgZ3JvdXAgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgc3VwcHJlc3MgRXJyb3Igc3VwcHJlc3Npb24KKyAqIEBpbmdyb3VwIHB1YmxpYworICogR2VuZXJhbCBiZWhhdmlvcjogYXBwbGljYXRpb24gY29udGludWVzIHRvIHJ1biwgYnV0IGVycm9ycyBhcmUgc3VwcHJlc3NlZAorICoKKyAqIEB7CisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKgorICogQG5hbWUgZ3JvdXAgb2YgZnVuY3Rpb25zIHVzZWQgZm9yIGVycm9yIHN1cHByZXNzaW9uIGluIGNvcnJlY3RuZXNzIHRvb2xzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIEB7ICovCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIgCisgKiBAYnJpZWYgcG9zc2libGUgdmFsdWUgZm9yIHN1cHByZXNzaW9uIG1hc2sKKyAqLworI2RlZmluZSBfX2l0dF9zdXBwcmVzc19hbGxfZXJyb3JzIDB4N2ZmZmZmZmYKKworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyIAorICogQGJyaWVmIHBvc3NpYmxlIHZhbHVlIGZvciBzdXBwcmVzc2lvbiBtYXNrIChzdXBwcmVzc2VzIGVycm9ycyBmcm9tIHRocmVhZGluZyBhbmFseXNpcykKKyAqLworI2RlZmluZSBfX2l0dF9zdXBwcmVzc190aHJlYWRpbmdfZXJyb3JzIDB4MDAwMDAwZmYKKworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyIAorICogQGJyaWVmIHBvc3NpYmxlIHZhbHVlIGZvciBzdXBwcmVzc2lvbiBtYXNrIChzdXBwcmVzc2VzIGVycm9ycyBmcm9tIG1lbW9yeSBhbmFseXNpcykKKyAqLworI2RlZmluZSBfX2l0dF9zdXBwcmVzc19tZW1vcnlfZXJyb3JzIDB4MDAwMGZmMDAKKworLyoqCisgKiBAYnJpZWYgU3RhcnQgc3VwcHJlc3NpbmcgZXJyb3JzIGlkZW50aWZpZWQgaW4gbWFzayBvbiB0aGlzIHRocmVhZAorICovCit2b2lkIElUVEFQSSBfX2l0dF9zdXBwcmVzc19wdXNoKHVuc2lnbmVkIGludCBtYXNrKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3VwcHJlc3NfcHVzaCwgKHVuc2lnbmVkIGludCBtYXNrKSkKKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfcHVzaCAgICAgSVRUTk9USUZZX1ZPSUQoc3VwcHJlc3NfcHVzaCkKKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfcHVzaF9wdHIgSVRUTk9USUZZX05BTUUoc3VwcHJlc3NfcHVzaCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX3B1c2gobWFzaykKKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfcHVzaF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX3B1c2hfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgVW5kbyB0aGUgZWZmZWN0cyBvZiB0aGUgbWF0Y2hpbmcgY2FsbCB0byBfX2l0dF9zdXBwcmVzc19wdXNoICAKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfc3VwcHJlc3NfcG9wKHZvaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzdXBwcmVzc19wb3AsICh2b2lkKSkKKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfcG9wICAgICBJVFROT1RJRllfVk9JRChzdXBwcmVzc19wb3ApCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX3BvcF9wdHIgSVRUTk9USUZZX05BTUUoc3VwcHJlc3NfcG9wKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfcG9wKCkKKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfcG9wX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfcG9wX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGVudW0gX19pdHRfbW9kZWxfZGlzYWJsZQorICogQGJyaWVmIEVudW1lcmF0b3IgZm9yIHRoZSBkaXNhYmxlIG1ldGhvZHMKKyAqLwordHlwZWRlZiBlbnVtIF9faXR0X3N1cHByZXNzX21vZGUgeworICAgIF9faXR0X3Vuc3VwcHJlc3NfcmFuZ2UsCisgICAgX19pdHRfc3VwcHJlc3NfcmFuZ2UKK30gX19pdHRfc3VwcHJlc3NfbW9kZV90OworCisvKioKKyAqIEBicmllZiBNYXJrIGEgcmFuZ2Ugb2YgbWVtb3J5IGZvciBlcnJvciBzdXBwcmVzc2lvbiBvciB1bnN1cHByZXNzaW9uIGZvciBlcnJvciB0eXBlcyBpbmNsdWRlZCBpbiBtYXNrCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3N1cHByZXNzX21hcmtfcmFuZ2UoX19pdHRfc3VwcHJlc3NfbW9kZV90IG1vZGUsIHVuc2lnbmVkIGludCBtYXNrLCB2b2lkICogYWRkcmVzcywgc2l6ZV90IHNpemUpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzdXBwcmVzc19tYXJrX3JhbmdlLCAoX19pdHRfc3VwcHJlc3NfbW9kZV90IG1vZGUsIHVuc2lnbmVkIGludCBtYXNrLCB2b2lkICogYWRkcmVzcywgc2l6ZV90IHNpemUpKQorI2RlZmluZSBfX2l0dF9zdXBwcmVzc19tYXJrX3JhbmdlICAgICBJVFROT1RJRllfVk9JRChzdXBwcmVzc19tYXJrX3JhbmdlKQorI2RlZmluZSBfX2l0dF9zdXBwcmVzc19tYXJrX3JhbmdlX3B0ciBJVFROT1RJRllfTkFNRShzdXBwcmVzc19tYXJrX3JhbmdlKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfbWFya19yYW5nZShtYXNrKQorI2RlZmluZSBfX2l0dF9zdXBwcmVzc19tYXJrX3JhbmdlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfbWFya19yYW5nZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBVbmRvIHRoZSBlZmZlY3Qgb2YgYSBtYXRjaGluZyBjYWxsIHRvIF9faXR0X3N1cHByZXNzX21hcmtfcmFuZ2UuICAgSWYgbm90IG1hdGNoaW5nCisgKiAgICAgICAgY2FsbCBpcyBmb3VuZCwgbm90aGluZyBpcyBjaGFuZ2VkLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9zdXBwcmVzc19jbGVhcl9yYW5nZShfX2l0dF9zdXBwcmVzc19tb2RlX3QgbW9kZSwgdW5zaWduZWQgaW50IG1hc2ssIHZvaWQgKiBhZGRyZXNzLCBzaXplX3Qgc2l6ZSk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN1cHByZXNzX2NsZWFyX3JhbmdlLCAoX19pdHRfc3VwcHJlc3NfbW9kZV90IG1vZGUsIHVuc2lnbmVkIGludCBtYXNrLCB2b2lkICogYWRkcmVzcywgc2l6ZV90IHNpemUpKQorI2RlZmluZSBfX2l0dF9zdXBwcmVzc19jbGVhcl9yYW5nZSAgICAgSVRUTk9USUZZX1ZPSUQoc3VwcHJlc3NfY2xlYXJfcmFuZ2UpCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX2NsZWFyX3JhbmdlX3B0ciBJVFROT1RJRllfTkFNRShzdXBwcmVzc19jbGVhcl9yYW5nZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX2NsZWFyX3JhbmdlKG1hc2spCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX2NsZWFyX3JhbmdlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfY2xlYXJfcmFuZ2VfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSAqLworLyoqIEB9IHN1cHByZXNzIGdyb3VwICovCisKKy8qKgorICogQGRlZmdyb3VwIHN5bmMgU3luY2hyb25pemF0aW9uCisgKiBAaW5ncm91cCBwdWJsaWMKKyAqIEluZGljYXRlIHVzZXItd3JpdHRlbiBzeW5jaHJvbml6YXRpb24gY29kZQorICogQHsKKyAqLworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBAYnJpZWYgcG9zc2libGUgdmFsdWUgb2YgYXR0cmlidXRlIGFyZ3VtZW50IGZvciBzeW5jIG9iamVjdCB0eXBlCisgKi8KKyNkZWZpbmUgX19pdHRfYXR0cl9iYXJyaWVyIDEKKworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBAYnJpZWYgcG9zc2libGUgdmFsdWUgb2YgYXR0cmlidXRlIGFyZ3VtZW50IGZvciBzeW5jIG9iamVjdCB0eXBlCisgKi8KKyNkZWZpbmUgX19pdHRfYXR0cl9tdXRleCAgIDIKKworLyoqCitAYnJpZWYgTmFtZSBhIHN5bmNocm9uaXphdGlvbiBvYmplY3QKK0BwYXJhbVtpbl0gYWRkciAgICAgICBIYW5kbGUgZm9yIHRoZSBzeW5jaHJvbml6YXRpb24gb2JqZWN0LiBZb3Ugc2hvdWxkCit1c2UgYSByZWFsIGFkZHJlc3MgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhlIHN5bmNocm9uaXphdGlvbiBvYmplY3QuCitAcGFyYW1baW5dIG9ianR5cGUgICAgbnVsbC10ZXJtaW5hdGVkIG9iamVjdCB0eXBlIHN0cmluZy4gSWYgTlVMTCBpcworcGFzc2VkLCB0aGUgbmFtZSB3aWxsIGJlICJVc2VyIFN5bmNocm9uaXphdGlvbiIuCitAcGFyYW1baW5dIG9iam5hbWUgICAgbnVsbC10ZXJtaW5hdGVkIG9iamVjdCBuYW1lIHN0cmluZy4gSWYgTlVMTCwKK25vIG5hbWUgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgb2JqZWN0LgorQHBhcmFtW2luXSBhdHRyaWJ1dGUgIG9uZSBvZiBbI19faXR0X2F0dHJfYmFycmllciwgI19faXR0X2F0dHJfbXV0ZXhdCisgKi8KKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgordm9pZCBJVFRBUEkgX19pdHRfc3luY19jcmVhdGVBKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm9ianR5cGUsIGNvbnN0IGNoYXIgICAgKm9iam5hbWUsIGludCBhdHRyaWJ1dGUpOwordm9pZCBJVFRBUEkgX19pdHRfc3luY19jcmVhdGVXKHZvaWQgKmFkZHIsIGNvbnN0IHdjaGFyX3QgKm9ianR5cGUsIGNvbnN0IHdjaGFyX3QgKm9iam5hbWUsIGludCBhdHRyaWJ1dGUpOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZSAgICAgX19pdHRfc3luY19jcmVhdGVXCisjICBkZWZpbmUgX19pdHRfc3luY19jcmVhdGVfcHRyIF9faXR0X3N5bmNfY3JlYXRlV19wdHIKKyNlbHNlIC8qIFVOSUNPREUgKi8KKyMgIGRlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZSAgICAgX19pdHRfc3luY19jcmVhdGVBCisjICBkZWZpbmUgX19pdHRfc3luY19jcmVhdGVfcHRyIF9faXR0X3N5bmNfY3JlYXRlQV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3N5bmNfY3JlYXRlICh2b2lkICphZGRyLCBjb25zdCBjaGFyICpvYmp0eXBlLCBjb25zdCBjaGFyICpvYmpuYW1lLCBpbnQgYXR0cmlidXRlKTsKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19jcmVhdGVBLCAodm9pZCAqYWRkciwgY29uc3QgY2hhciAgICAqb2JqdHlwZSwgY29uc3QgY2hhciAgICAqb2JqbmFtZSwgaW50IGF0dHJpYnV0ZSkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX2NyZWF0ZVcsICh2b2lkICphZGRyLCBjb25zdCB3Y2hhcl90ICpvYmp0eXBlLCBjb25zdCB3Y2hhcl90ICpvYmpuYW1lLCBpbnQgYXR0cmlidXRlKSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfY3JlYXRlLCAgKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIqICAgIG9ianR5cGUsIGNvbnN0IGNoYXIqICAgIG9iam5hbWUsIGludCBhdHRyaWJ1dGUpKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZUEgICAgIElUVE5PVElGWV9WT0lEKHN5bmNfY3JlYXRlQSkKKyNkZWZpbmUgX19pdHRfc3luY19jcmVhdGVBX3B0ciBJVFROT1RJRllfTkFNRShzeW5jX2NyZWF0ZUEpCisjZGVmaW5lIF9faXR0X3N5bmNfY3JlYXRlVyAgICAgSVRUTk9USUZZX1ZPSUQoc3luY19jcmVhdGVXKQorI2RlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZVdfcHRyIElUVE5PVElGWV9OQU1FKHN5bmNfY3JlYXRlVykKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZSAgICAgSVRUTk9USUZZX1ZPSUQoc3luY19jcmVhdGUpCisjZGVmaW5lIF9faXR0X3N5bmNfY3JlYXRlX3B0ciBJVFROT1RJRllfTkFNRShzeW5jX2NyZWF0ZSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X3N5bmNfY3JlYXRlQShhZGRyLCBvYmp0eXBlLCBvYmpuYW1lLCBhdHRyaWJ1dGUpCisjZGVmaW5lIF9faXR0X3N5bmNfY3JlYXRlQV9wdHIgMAorI2RlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZVcoYWRkciwgb2JqdHlwZSwgb2JqbmFtZSwgYXR0cmlidXRlKQorI2RlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZShhZGRyLCBvYmp0eXBlLCBvYmpuYW1lLCBhdHRyaWJ1dGUpCisjZGVmaW5lIF9faXR0X3N5bmNfY3JlYXRlX3B0ciAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfc3luY19jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X3N5bmNfY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X3N5bmNfY3JlYXRlX3B0ciAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorQGJyaWVmIFJlbmFtZSBhIHN5bmNocm9uaXphdGlvbiBvYmplY3QKKworWW91IGNhbiB1c2UgdGhlIHJlbmFtZSBjYWxsIHRvIGFzc2lnbiBvciByZWFzc2lnbiBhIG5hbWUgdG8gYSBnaXZlbgorc3luY2hyb25pemF0aW9uIG9iamVjdC4KK0BwYXJhbVtpbl0gYWRkciAgaGFuZGxlIGZvciB0aGUgc3luY2hyb25pemF0aW9uIG9iamVjdC4KK0BwYXJhbVtpbl0gbmFtZSAgbnVsbC10ZXJtaW5hdGVkIG9iamVjdCBuYW1lIHN0cmluZy4KKyovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCit2b2lkIElUVEFQSSBfX2l0dF9zeW5jX3JlbmFtZUEodm9pZCAqYWRkciwgY29uc3QgY2hhciAgICAqbmFtZSk7Cit2b2lkIElUVEFQSSBfX2l0dF9zeW5jX3JlbmFtZVcodm9pZCAqYWRkciwgY29uc3Qgd2NoYXJfdCAqbmFtZSk7CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorIyAgZGVmaW5lIF9faXR0X3N5bmNfcmVuYW1lICAgICBfX2l0dF9zeW5jX3JlbmFtZVcKKyMgIGRlZmluZSBfX2l0dF9zeW5jX3JlbmFtZV9wdHIgX19pdHRfc3luY19yZW5hbWVXX3B0cgorI2Vsc2UgLyogVU5JQ09ERSAqLworIyAgZGVmaW5lIF9faXR0X3N5bmNfcmVuYW1lICAgICBfX2l0dF9zeW5jX3JlbmFtZUEKKyMgIGRlZmluZSBfX2l0dF9zeW5jX3JlbmFtZV9wdHIgX19pdHRfc3luY19yZW5hbWVBX3B0cgorI2VuZGlmIC8qIFVOSUNPREUgKi8KKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLwordm9pZCBJVFRBUEkgX19pdHRfc3luY19yZW5hbWUodm9pZCAqYWRkciwgY29uc3QgY2hhciAqbmFtZSk7CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfcmVuYW1lQSwgKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm5hbWUpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19yZW5hbWVXLCAodm9pZCAqYWRkciwgY29uc3Qgd2NoYXJfdCAqbmFtZSkpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX3JlbmFtZSwgICh2b2lkICphZGRyLCBjb25zdCBjaGFyICAgICpuYW1lKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfc3luY19yZW5hbWVBICAgICBJVFROT1RJRllfVk9JRChzeW5jX3JlbmFtZUEpCisjZGVmaW5lIF9faXR0X3N5bmNfcmVuYW1lQV9wdHIgSVRUTk9USUZZX05BTUUoc3luY19yZW5hbWVBKQorI2RlZmluZSBfX2l0dF9zeW5jX3JlbmFtZVcgICAgIElUVE5PVElGWV9WT0lEKHN5bmNfcmVuYW1lVykKKyNkZWZpbmUgX19pdHRfc3luY19yZW5hbWVXX3B0ciBJVFROT1RJRllfTkFNRShzeW5jX3JlbmFtZVcpCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfc3luY19yZW5hbWUgICAgIElUVE5PVElGWV9WT0lEKHN5bmNfcmVuYW1lKQorI2RlZmluZSBfX2l0dF9zeW5jX3JlbmFtZV9wdHIgSVRUTk9USUZZX05BTUUoc3luY19yZW5hbWUpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9zeW5jX3JlbmFtZUEoYWRkciwgbmFtZSkKKyNkZWZpbmUgX19pdHRfc3luY19yZW5hbWVBX3B0ciAwCisjZGVmaW5lIF9faXR0X3N5bmNfcmVuYW1lVyhhZGRyLCBuYW1lKQorI2RlZmluZSBfX2l0dF9zeW5jX3JlbmFtZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9zeW5jX3JlbmFtZShhZGRyLCBuYW1lKQorI2RlZmluZSBfX2l0dF9zeW5jX3JlbmFtZV9wdHIgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X3N5bmNfcmVuYW1lQV9wdHIgMAorI2RlZmluZSBfX2l0dF9zeW5jX3JlbmFtZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9zeW5jX3JlbmFtZV9wdHIgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyBAYnJpZWYgRGVzdHJveSBhIHN5bmNocm9uaXphdGlvbiBvYmplY3QuCisgQHBhcmFtIGFkZHIgSGFuZGxlIGZvciB0aGUgc3luY2hyb25pemF0aW9uIG9iamVjdC4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfc3luY19kZXN0cm95KHZvaWQgKmFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX2Rlc3Ryb3ksICh2b2lkICphZGRyKSkKKyNkZWZpbmUgX19pdHRfc3luY19kZXN0cm95ICAgICBJVFROT1RJRllfVk9JRChzeW5jX2Rlc3Ryb3kpCisjZGVmaW5lIF9faXR0X3N5bmNfZGVzdHJveV9wdHIgSVRUTk9USUZZX05BTUUoc3luY19kZXN0cm95KQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc3luY19kZXN0cm95KGFkZHIpCisjZGVmaW5lIF9faXR0X3N5bmNfZGVzdHJveV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3N5bmNfZGVzdHJveV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqCisgKiBAbmFtZSBncm91cCBvZiBmdW5jdGlvbnMgaXMgdXNlZCBmb3IgcGVyZm9ybWFuY2UgbWVhc3VyZW1lbnQgdG9vbHMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogQHsgKi8KKy8qKgorICogQGJyaWVmIEVudGVyIHNwaW4gbG9vcCBvbiB1c2VyLWRlZmluZWQgc3luYyBvYmplY3QKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfc3luY19wcmVwYXJlKHZvaWQqIGFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX3ByZXBhcmUsICh2b2lkICphZGRyKSkKKyNkZWZpbmUgX19pdHRfc3luY19wcmVwYXJlICAgICBJVFROT1RJRllfVk9JRChzeW5jX3ByZXBhcmUpCisjZGVmaW5lIF9faXR0X3N5bmNfcHJlcGFyZV9wdHIgSVRUTk9USUZZX05BTUUoc3luY19wcmVwYXJlKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc3luY19wcmVwYXJlKGFkZHIpCisjZGVmaW5lIF9faXR0X3N5bmNfcHJlcGFyZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3N5bmNfcHJlcGFyZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBRdWl0IHNwaW4gbG9vcCB3aXRob3V0IGFjcXVpcmluZyBzcGluIG9iamVjdAorICovCit2b2lkIElUVEFQSSBfX2l0dF9zeW5jX2NhbmNlbCh2b2lkICphZGRyKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19jYW5jZWwsICh2b2lkICphZGRyKSkKKyNkZWZpbmUgX19pdHRfc3luY19jYW5jZWwgICAgIElUVE5PVElGWV9WT0lEKHN5bmNfY2FuY2VsKQorI2RlZmluZSBfX2l0dF9zeW5jX2NhbmNlbF9wdHIgSVRUTk9USUZZX05BTUUoc3luY19jYW5jZWwpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9zeW5jX2NhbmNlbChhZGRyKQorI2RlZmluZSBfX2l0dF9zeW5jX2NhbmNlbF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3N5bmNfY2FuY2VsX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIFN1Y2Nlc3NmdWwgc3BpbiBsb29wIGNvbXBsZXRpb24gKHN5bmMgb2JqZWN0IGFjcXVpcmVkKQorICovCit2b2lkIElUVEFQSSBfX2l0dF9zeW5jX2FjcXVpcmVkKHZvaWQgKmFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX2FjcXVpcmVkLCAodm9pZCAqYWRkcikpCisjZGVmaW5lIF9faXR0X3N5bmNfYWNxdWlyZWQgICAgIElUVE5PVElGWV9WT0lEKHN5bmNfYWNxdWlyZWQpCisjZGVmaW5lIF9faXR0X3N5bmNfYWNxdWlyZWRfcHRyIElUVE5PVElGWV9OQU1FKHN5bmNfYWNxdWlyZWQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9zeW5jX2FjcXVpcmVkKGFkZHIpCisjZGVmaW5lIF9faXR0X3N5bmNfYWNxdWlyZWRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9zeW5jX2FjcXVpcmVkX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIFN0YXJ0IHN5bmMgb2JqZWN0IHJlbGVhc2luZyBjb2RlLiBJcyBjYWxsZWQgYmVmb3JlIHRoZSBsb2NrIHJlbGVhc2UgY2FsbC4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfc3luY19yZWxlYXNpbmcodm9pZCogYWRkcik7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfcmVsZWFzaW5nLCAodm9pZCAqYWRkcikpCisjZGVmaW5lIF9faXR0X3N5bmNfcmVsZWFzaW5nICAgICBJVFROT1RJRllfVk9JRChzeW5jX3JlbGVhc2luZykKKyNkZWZpbmUgX19pdHRfc3luY19yZWxlYXNpbmdfcHRyIElUVE5PVElGWV9OQU1FKHN5bmNfcmVsZWFzaW5nKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc3luY19yZWxlYXNpbmcoYWRkcikKKyNkZWZpbmUgX19pdHRfc3luY19yZWxlYXNpbmdfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9zeW5jX3JlbGVhc2luZ19wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9ICovCisKKy8qKiBAfSBzeW5jIGdyb3VwICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioKKyAqIEBuYW1lIGdyb3VwIG9mIGZ1bmN0aW9ucyBpcyB1c2VkIGZvciBjb3JyZWN0bmVzcyBjaGVja2luZyB0b29scworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBAeyAqLworLyoqCisgKiBAaW5ncm91cCBsZWdhY3kKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBGYXN0IHN5bmNocm9uaXphdGlvbiB3aGljaCBkb2VzIG5vIHJlcXVpcmUgc3Bpbm5pbmcuCisgKiAtIFRoaXMgc3BlY2lhbCBmdW5jdGlvbiBpcyB0byBiZSB1c2VkIGJ5IFRCQiBhbmQgT3Blbk1QIGxpYnJhcmllcyBvbmx5IHdoZW4gdGhleSBrbm93CisgKiAgIHRoZXJlIGlzIG5vIHNwaW4gYnV0IHRoZXkgbmVlZCB0byBzdXBwcmVzcyBUQyB3YXJuaW5ncyBhYm91dCBzaGFyZWQgdmFyaWFibGUgbW9kaWZpY2F0aW9ucy4KKyAqIC0gSXQgb25seSBoYXMgY29ycmVzcG9uZGluZyBwb2ludGVycyBpbiBzdGF0aWMgbGlicmFyeSBhbmQgZG9lcyBub3QgaGF2ZSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9uCisgKiAgIGluIGR5bmFtaWMgbGlicmFyeS4KKyAqIEBzZWUgdm9pZCBfX2l0dF9zeW5jX3ByZXBhcmUodm9pZCogYWRkcik7CisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2ZzeW5jX3ByZXBhcmUodm9pZCogYWRkcik7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGZzeW5jX3ByZXBhcmUsICh2b2lkICphZGRyKSkKKyNkZWZpbmUgX19pdHRfZnN5bmNfcHJlcGFyZSAgICAgSVRUTk9USUZZX1ZPSUQoZnN5bmNfcHJlcGFyZSkKKyNkZWZpbmUgX19pdHRfZnN5bmNfcHJlcGFyZV9wdHIgSVRUTk9USUZZX05BTUUoZnN5bmNfcHJlcGFyZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2ZzeW5jX3ByZXBhcmUoYWRkcikKKyNkZWZpbmUgX19pdHRfZnN5bmNfcHJlcGFyZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2ZzeW5jX3ByZXBhcmVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAaW5ncm91cCBsZWdhY3kKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBGYXN0IHN5bmNocm9uaXphdGlvbiB3aGljaCBkb2VzIG5vIHJlcXVpcmUgc3Bpbm5pbmcuCisgKiAtIFRoaXMgc3BlY2lhbCBmdW5jdGlvbiBpcyB0byBiZSB1c2VkIGJ5IFRCQiBhbmQgT3Blbk1QIGxpYnJhcmllcyBvbmx5IHdoZW4gdGhleSBrbm93CisgKiAgIHRoZXJlIGlzIG5vIHNwaW4gYnV0IHRoZXkgbmVlZCB0byBzdXBwcmVzcyBUQyB3YXJuaW5ncyBhYm91dCBzaGFyZWQgdmFyaWFibGUgbW9kaWZpY2F0aW9ucy4KKyAqIC0gSXQgb25seSBoYXMgY29ycmVzcG9uZGluZyBwb2ludGVycyBpbiBzdGF0aWMgbGlicmFyeSBhbmQgZG9lcyBub3QgaGF2ZSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9uCisgKiAgIGluIGR5bmFtaWMgbGlicmFyeS4KKyAqIEBzZWUgdm9pZCBfX2l0dF9zeW5jX2NhbmNlbCh2b2lkICphZGRyKTsKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfZnN5bmNfY2FuY2VsKHZvaWQgKmFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmc3luY19jYW5jZWwsICh2b2lkICphZGRyKSkKKyNkZWZpbmUgX19pdHRfZnN5bmNfY2FuY2VsICAgICBJVFROT1RJRllfVk9JRChmc3luY19jYW5jZWwpCisjZGVmaW5lIF9faXR0X2ZzeW5jX2NhbmNlbF9wdHIgSVRUTk9USUZZX05BTUUoZnN5bmNfY2FuY2VsKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfZnN5bmNfY2FuY2VsKGFkZHIpCisjZGVmaW5lIF9faXR0X2ZzeW5jX2NhbmNlbF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2ZzeW5jX2NhbmNlbF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBpbmdyb3VwIGxlZ2FjeQorICogQGRlcHJlY2F0ZWQgTGVnYWN5IEFQSQorICogQGJyaWVmIEZhc3Qgc3luY2hyb25pemF0aW9uIHdoaWNoIGRvZXMgbm8gcmVxdWlyZSBzcGlubmluZy4KKyAqIC0gVGhpcyBzcGVjaWFsIGZ1bmN0aW9uIGlzIHRvIGJlIHVzZWQgYnkgVEJCIGFuZCBPcGVuTVAgbGlicmFyaWVzIG9ubHkgd2hlbiB0aGV5IGtub3cKKyAqICAgdGhlcmUgaXMgbm8gc3BpbiBidXQgdGhleSBuZWVkIHRvIHN1cHByZXNzIFRDIHdhcm5pbmdzIGFib3V0IHNoYXJlZCB2YXJpYWJsZSBtb2RpZmljYXRpb25zLgorICogLSBJdCBvbmx5IGhhcyBjb3JyZXNwb25kaW5nIHBvaW50ZXJzIGluIHN0YXRpYyBsaWJyYXJ5IGFuZCBkb2VzIG5vdCBoYXZlIGNvcnJlc3BvbmRpbmcgZnVuY3Rpb24KKyAqICAgaW4gZHluYW1pYyBsaWJyYXJ5LgorICogQHNlZSB2b2lkIF9faXR0X3N5bmNfYWNxdWlyZWQodm9pZCAqYWRkcik7CisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2ZzeW5jX2FjcXVpcmVkKHZvaWQgKmFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmc3luY19hY3F1aXJlZCwgKHZvaWQgKmFkZHIpKQorI2RlZmluZSBfX2l0dF9mc3luY19hY3F1aXJlZCAgICAgSVRUTk9USUZZX1ZPSUQoZnN5bmNfYWNxdWlyZWQpCisjZGVmaW5lIF9faXR0X2ZzeW5jX2FjcXVpcmVkX3B0ciBJVFROT1RJRllfTkFNRShmc3luY19hY3F1aXJlZCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2ZzeW5jX2FjcXVpcmVkKGFkZHIpCisjZGVmaW5lIF9faXR0X2ZzeW5jX2FjcXVpcmVkX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfZnN5bmNfYWNxdWlyZWRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAaW5ncm91cCBsZWdhY3kKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBGYXN0IHN5bmNocm9uaXphdGlvbiB3aGljaCBkb2VzIG5vIHJlcXVpcmUgc3Bpbm5pbmcuCisgKiAtIFRoaXMgc3BlY2lhbCBmdW5jdGlvbiBpcyB0byBiZSB1c2VkIGJ5IFRCQiBhbmQgT3Blbk1QIGxpYnJhcmllcyBvbmx5IHdoZW4gdGhleSBrbm93CisgKiAgIHRoZXJlIGlzIG5vIHNwaW4gYnV0IHRoZXkgbmVlZCB0byBzdXBwcmVzcyBUQyB3YXJuaW5ncyBhYm91dCBzaGFyZWQgdmFyaWFibGUgbW9kaWZpY2F0aW9ucy4KKyAqIC0gSXQgb25seSBoYXMgY29ycmVzcG9uZGluZyBwb2ludGVycyBpbiBzdGF0aWMgbGlicmFyeSBhbmQgZG9lcyBub3QgaGF2ZSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9uCisgKiAgIGluIGR5bmFtaWMgbGlicmFyeS4KKyAqIEBzZWUgdm9pZCBfX2l0dF9zeW5jX3JlbGVhc2luZyh2b2lkKiBhZGRyKTsKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfZnN5bmNfcmVsZWFzaW5nKHZvaWQqIGFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmc3luY19yZWxlYXNpbmcsICh2b2lkICphZGRyKSkKKyNkZWZpbmUgX19pdHRfZnN5bmNfcmVsZWFzaW5nICAgICBJVFROT1RJRllfVk9JRChmc3luY19yZWxlYXNpbmcpCisjZGVmaW5lIF9faXR0X2ZzeW5jX3JlbGVhc2luZ19wdHIgSVRUTk9USUZZX05BTUUoZnN5bmNfcmVsZWFzaW5nKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfZnN5bmNfcmVsZWFzaW5nKGFkZHIpCisjZGVmaW5lIF9faXR0X2ZzeW5jX3JlbGVhc2luZ19wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2ZzeW5jX3JlbGVhc2luZ19wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9ICovCisKKy8qKgorICogQGRlZmdyb3VwIG1vZGVsIE1vZGVsaW5nIGJ5IEludGVsKFIpIFBhcmFsbGVsIEFkdmlzb3IKKyAqIEBpbmdyb3VwIHB1YmxpYworICogVGhpcyBpcyB0aGUgc3Vic2V0IG9mIGl0dCB1c2VkIGZvciBtb2RlbGluZyBieSBJbnRlbChSKSBQYXJhbGxlbCBBZHZpc29yLgorICogVGhpcyBBUEkgaXMgY2FsbGVkIE9OTFkgdXNpbmcgYW5ub3RhdGUuaCwgYnkgIkFubm90YXRpb24iIG1hY3JvcworICogdGhlIHVzZXIgcGxhY2VzIGluIHRoZWlyIHNvdXJjZXMgZHVyaW5nIHRoZSBwYXJhbGxlbGlzbSBtb2RlbGluZyBzdGVwcy4KKyAqCisgKiBzaXRlX2JlZ2luL2VuZCBhbmQgdGFza19iZWdpbi9lbmQgdGFrZSB0aGUgYWRkcmVzcyBvZiBoYW5kbGUgdmFyaWFibGVzLAorICogd2hpY2ggYXJlIHdyaXRlYWJsZSBieSB0aGUgQVBJLiAgSGFuZGxlcyBtdXN0IGJlIDAgaW5pdGlhbGl6ZWQgcHJpb3IKKyAqIHRvIHRoZSBmaXJzdCBjYWxsIHRvIGJlZ2luLCBvciBtYXkgY2F1c2UgYSBydW4tdGltZSBmYWlsdXJlLgorICogVGhlIGhhbmRsZXMgYXJlIGluaXRpYWxpemVkIGluIGEgbXVsdGktdGhyZWFkIHNhZmUgd2F5IGJ5IHRoZSBBUEkgaWYKKyAqIHRoZSBoYW5kbGUgaXMgMC4gIFRoZSBjb21tb25seSBleHBlY3RlZCBpZGlvbSBpcyBvbmUgc3RhdGljIGhhbmRsZSB0bworICogaWRlbnRpZnkgYSBzaXRlIG9yIHRhc2suICBJZiBhIHNpdGUgb3IgdGFzayBvZiB0aGUgc2FtZSBuYW1lIGhhcyBhbHJlYWR5CisgKiBiZWVuIHN0YXJ0ZWQgZHVyaW5nIHRoaXMgY29sbGVjdGlvbiwgdGhlIHNhbWUgaGFuZGxlIE1BWSBiZSByZXR1cm5lZCwKKyAqIGJ1dCBpcyBub3QgcmVxdWlyZWQgdG8gYmUgLSBpdCBpcyB1bnNwZWNpZmllZCBpZiBkYXRhIG1lcmdpbmcgaXMgZG9uZQorICogYmFzZWQgb24gbmFtZS4gIFRoZXNlIHJvdXRpbmVzIGFsc28gdGFrZSBhbiBpbnN0YW5jZSB2YXJpYWJsZS4gIExpa2UKKyAqIHRoZSBsZXhpY2FsIGluc3RhbmNlLCB0aGVzZSBtdXN0IGJlIDAgaW5pdGlhbGl6ZWQuICBVbmxpa2UgdGhlIGxleGljYWwKKyAqIGluc3RhbmNlLCB0aGlzIGlzIHVzZWQgdG8gdHJhY2sgYSBzaW5nbGUgZHluYW1pYyBpbnN0YW5jZS4KKyAqCisgKiBBUEkgdXNlZCBieSB0aGUgSW50ZWwoUikgUGFyYWxsZWwgQWR2aXNvciB0byBkZXNjcmliZSBwb3RlbnRpYWwgY29uY3VycmVuY3kKKyAqIGFuZCByZWxhdGVkIGFjdGl2aXRpZXMuIFVzZXItYWRkZWQgc291cmNlIGFubm90YXRpb25zIGV4cGFuZCB0byBjYWxscworICogdG8gdGhlc2UgcHJvY2VkdXJlcyB0byBlbmFibGUgbW9kZWxpbmcgb2YgYSBoeXBvdGhldGljYWwgY29uY3VycmVudAorICogZXhlY3V0aW9uIHNlcmlhbGx5LgorICogQHsKKyAqLworI2lmICFkZWZpbmVkKF9BRFZJU09SX0FOTk9UQVRFX0hfKSB8fCBkZWZpbmVkKEFOTk9UQVRFX0VYUEFORF9OVUxMKQorCit0eXBlZGVmIHZvaWQqIF9faXR0X21vZGVsX3NpdGU7ICAgICAgICAgICAgIC8qITwgQGJyaWVmIGhhbmRsZSBmb3IgbGV4aWNhbCBzaXRlICAgICAqLwordHlwZWRlZiB2b2lkKiBfX2l0dF9tb2RlbF9zaXRlX2luc3RhbmNlOyAgICAvKiE8IEBicmllZiBoYW5kbGUgZm9yIGR5bmFtaWMgaW5zdGFuY2UgKi8KK3R5cGVkZWYgdm9pZCogX19pdHRfbW9kZWxfdGFzazsgICAgICAgICAgICAgLyohPCBAYnJpZWYgaGFuZGxlIGZvciBsZXhpY2FsIHNpdGUgICAgICovCit0eXBlZGVmIHZvaWQqIF9faXR0X21vZGVsX3Rhc2tfaW5zdGFuY2U7ICAgIC8qITwgQGJyaWVmIGhhbmRsZSBmb3IgZHluYW1pYyBpbnN0YW5jZSAqLworCisvKioKKyAqIEBlbnVtIF9faXR0X21vZGVsX2Rpc2FibGUKKyAqIEBicmllZiBFbnVtZXJhdG9yIGZvciB0aGUgZGlzYWJsZSBtZXRob2RzCisgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgX19pdHRfbW9kZWxfZGlzYWJsZV9vYnNlcnZhdGlvbiwKKyAgICBfX2l0dF9tb2RlbF9kaXNhYmxlX2NvbGxlY3Rpb24KK30gX19pdHRfbW9kZWxfZGlzYWJsZTsKKworI2VuZGlmIC8qICFfQURWSVNPUl9BTk5PVEFURV9IXyB8fCBBTk5PVEFURV9FWFBBTkRfTlVMTCAqLworCisvKioKKyAqIEBicmllZiBBTk5PVEFURV9TSVRFX0JFR0lOL0FOTk9UQVRFX1NJVEVfRU5EIHN1cHBvcnQuCisgKgorICogc2l0ZV9iZWdpbi9lbmQgbW9kZWwgYSBwb3RlbnRpYWwgY29uY3VycmVuY3kgc2l0ZS4KKyAqIHNpdGUgaW5zdGFuY2VzIG1heSBiZSByZWN1cnNpdmVseSBuZXN0ZWQgd2l0aCB0aGVtc2VsdmVzLgorICogc2l0ZV9lbmQgZXhpdHMgdGhlIG1vc3QgcmVjZW50bHkgc3RhcnRlZCBidXQgdW5lbmRlZCBzaXRlIGZvciB0aGUgY3VycmVudAorICogdGhyZWFkLiAgVGhlIGhhbmRsZSBwYXNzZWQgdG8gZW5kIG1heSBiZSB1c2VkIHRvIHZhbGlkYXRlIHN0cnVjdHVyZS4KKyAqIEluc3RhbmNlcyBvZiBhIHNpdGUgZW5jb3VudGVyZWQgb24gZGlmZmVyZW50IHRocmVhZHMgY29uY3VycmVudGx5CisgKiBhcmUgY29uc2lkZXJlZCBjb21wbGV0ZWx5IGRpc3RpbmN0LiBJZiB0aGUgc2l0ZSBuYW1lIGZvciB0d28gZGlmZmVyZW50CisgKiBsZXhpY2FsIHNpdGVzIG1hdGNoLCBpdCBpcyB1bnNwZWNpZmllZCB3aGV0aGVyIHRoZXkgYXJlIHRyZWF0ZWQgYXMgdGhlCisgKiBzYW1lIG9yIGRpZmZlcmVudCBmb3IgZGF0YSBwcmVzZW50YXRpb24uCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX3NpdGVfYmVnaW4oX19pdHRfbW9kZWxfc2l0ZSAqc2l0ZSwgX19pdHRfbW9kZWxfc2l0ZV9pbnN0YW5jZSAqaW5zdGFuY2UsIGNvbnN0IGNoYXIgKm5hbWUpOworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfc2l0ZV9iZWdpblcoY29uc3Qgd2NoYXJfdCAqbmFtZSk7CisjZW5kaWYKK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX3NpdGVfYmVnaW5BKGNvbnN0IGNoYXIgKm5hbWUpOwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfc2l0ZV9iZWdpbkFMKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBzaXRlTmFtZUxlbik7Cit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF9zaXRlX2VuZCAgKF9faXR0X21vZGVsX3NpdGUgKnNpdGUsIF9faXR0X21vZGVsX3NpdGVfaW5zdGFuY2UgKmluc3RhbmNlKTsKK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX3NpdGVfZW5kXzIodm9pZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3NpdGVfYmVnaW4sICAoX19pdHRfbW9kZWxfc2l0ZSAqc2l0ZSwgX19pdHRfbW9kZWxfc2l0ZV9pbnN0YW5jZSAqaW5zdGFuY2UsIGNvbnN0IGNoYXIgKm5hbWUpKQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfc2l0ZV9iZWdpblcsICAoY29uc3Qgd2NoYXJfdCAqbmFtZSkpCisjZW5kaWYKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3NpdGVfYmVnaW5BLCAgKGNvbnN0IGNoYXIgKm5hbWUpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfc2l0ZV9iZWdpbkFMLCAgKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBzaXRlTmFtZUxlbikpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9zaXRlX2VuZCwgICAgKF9faXR0X21vZGVsX3NpdGUgKnNpdGUsIF9faXR0X21vZGVsX3NpdGVfaW5zdGFuY2UgKmluc3RhbmNlKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3NpdGVfZW5kXzIsICAodm9pZCkpCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfYmVnaW4gICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9zaXRlX2JlZ2luKQorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luX3B0ciAgSVRUTk9USUZZX05BTUUobW9kZWxfc2l0ZV9iZWdpbikKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9iZWdpblcgICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9zaXRlX2JlZ2luVykKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9iZWdpbldfcHRyICBJVFROT1RJRllfTkFNRShtb2RlbF9zaXRlX2JlZ2luVykKKyNlbmRpZgorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luQSAgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX3NpdGVfYmVnaW5BKQorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luQV9wdHIgIElUVE5PVElGWV9OQU1FKG1vZGVsX3NpdGVfYmVnaW5BKQorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luQUwgICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9zaXRlX2JlZ2luQUwpCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfYmVnaW5BTF9wdHIgIElUVE5PVElGWV9OQU1FKG1vZGVsX3NpdGVfYmVnaW5BTCkKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9lbmQgICAgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX3NpdGVfZW5kKQorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2VuZF9wdHIgICAgSVRUTk9USUZZX05BTUUobW9kZWxfc2l0ZV9lbmQpCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfZW5kXzIgICAgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX3NpdGVfZW5kXzIpCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfZW5kXzJfcHRyICAgIElUVE5PVElGWV9OQU1FKG1vZGVsX3NpdGVfZW5kXzIpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luKHNpdGUsIGluc3RhbmNlLCBuYW1lKQorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luX3B0ciAgMAorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luVyhuYW1lKQorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luV19wdHIgIDAKKyNlbmRpZgorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luQShuYW1lKQorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luQV9wdHIgIDAKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9iZWdpbkFMKG5hbWUsIHNpdGVOYW1lTGVuKQorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luQUxfcHRyICAwCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfZW5kKHNpdGUsIGluc3RhbmNlKQorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2VuZF9wdHIgICAgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2VuZF8yKCkKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9lbmRfMl9wdHIgICAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfYmVnaW5fcHRyICAwCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfYmVnaW5XX3B0ciAgMAorI2VuZGlmCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfYmVnaW5BX3B0ciAgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luQUxfcHRyICAwCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfZW5kX3B0ciAgICAwCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfZW5kXzJfcHRyICAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgQU5OT1RBVEVfVEFTS19CRUdJTi9BTk5PVEFURV9UQVNLX0VORCBzdXBwb3J0CisgKgorICogdGFza19iZWdpbi9lbmQgbW9kZWwgYSBwb3RlbnRpYWwgdGFzaywgd2hpY2ggaXMgY29udGFpbmVkIHdpdGhpbiB0aGUgbW9zdAorICogY2xvc2VseSBlbmNsb3NpbmcgZHluYW1pYyBzaXRlLiAgdGFza19lbmQgZXhpdHMgdGhlIG1vc3QgcmVjZW50bHkgc3RhcnRlZAorICogYnV0IHVuZW5kZWQgdGFzay4gIFRoZSBoYW5kbGUgcGFzc2VkIHRvIGVuZCBtYXkgYmUgdXNlZCB0byB2YWxpZGF0ZQorICogc3RydWN0dXJlLiAgSXQgaXMgdW5zcGVjaWZpZWQgaWYgYmFkIGR5bmFtaWMgbmVzdGluZyBpcyBkZXRlY3RlZC4gIElmIGl0CisgKiBpcywgaXQgc2hvdWxkIGJlIGVuY29kZWQgaW4gdGhlIHJlc3VsdGluZyBkYXRhIGNvbGxlY3Rpb24uICBUaGUgY29sbGVjdG9yCisgKiBzaG91bGQgbm90IGZhaWwgZHVlIHRvIGNvbnN0cnVjdCBuZXN0aW5nIGlzc3Vlcywgbm9yIGF0dGVtcHQgdG8gZGlyZWN0bHkKKyAqIGluZGljYXRlIHRoZSBwcm9ibGVtLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luKF9faXR0X21vZGVsX3Rhc2sgKnRhc2ssIF9faXR0X21vZGVsX3Rhc2tfaW5zdGFuY2UgKmluc3RhbmNlLCBjb25zdCBjaGFyICpuYW1lKTsKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX3Rhc2tfYmVnaW5XKGNvbnN0IHdjaGFyX3QgKm5hbWUpOwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfaXRlcmF0aW9uX3Rhc2tXKGNvbnN0IHdjaGFyX3QgKm5hbWUpOworI2VuZGlmCit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luQShjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX3Rhc2tfYmVnaW5BTChjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgdGFza05hbWVMZW4pOwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfaXRlcmF0aW9uX3Rhc2tBKGNvbnN0IGNoYXIgKm5hbWUpOwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfaXRlcmF0aW9uX3Rhc2tBTChjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgdGFza05hbWVMZW4pOwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfdGFza19lbmQgIChfX2l0dF9tb2RlbF90YXNrICp0YXNrLCBfX2l0dF9tb2RlbF90YXNrX2luc3RhbmNlICppbnN0YW5jZSk7Cit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF90YXNrX2VuZF8yKHZvaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF90YXNrX2JlZ2luLCAgKF9faXR0X21vZGVsX3Rhc2sgKnRhc2ssIF9faXR0X21vZGVsX3Rhc2tfaW5zdGFuY2UgKmluc3RhbmNlLCBjb25zdCBjaGFyICpuYW1lKSkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3Rhc2tfYmVnaW5XLCAgKGNvbnN0IHdjaGFyX3QgKm5hbWUpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfaXRlcmF0aW9uX3Rhc2tXLCAoY29uc3Qgd2NoYXJfdCAqbmFtZSkpCisjZW5kaWYKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3Rhc2tfYmVnaW5BLCAgKGNvbnN0IGNoYXIgKm5hbWUpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfdGFza19iZWdpbkFMLCAgKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCB0YXNrTmFtZUxlbikpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9pdGVyYXRpb25fdGFza0EsICAoY29uc3QgY2hhciAqbmFtZSkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9pdGVyYXRpb25fdGFza0FMLCAgKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCB0YXNrTmFtZUxlbikpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF90YXNrX2VuZCwgICAgKF9faXR0X21vZGVsX3Rhc2sgKnRhc2ssIF9faXR0X21vZGVsX3Rhc2tfaW5zdGFuY2UgKmluc3RhbmNlKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3Rhc2tfZW5kXzIsICAodm9pZCkpCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfYmVnaW4gICAgICBJVFROT1RJRllfVk9JRChtb2RlbF90YXNrX2JlZ2luKQorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luX3B0ciAgSVRUTk9USUZZX05BTUUobW9kZWxfdGFza19iZWdpbikKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpblcgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX3Rhc2tfYmVnaW5XKQorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luV19wdHIgSVRUTk9USUZZX05BTUUobW9kZWxfdGFza19iZWdpblcpCisjZGVmaW5lIF9faXR0X21vZGVsX2l0ZXJhdGlvbl90YXNrVyAgICAgSVRUTk9USUZZX1ZPSUQobW9kZWxfaXRlcmF0aW9uX3Rhc2tXKQorI2RlZmluZSBfX2l0dF9tb2RlbF9pdGVyYXRpb25fdGFza1dfcHRyIElUVE5PVElGWV9OQU1FKG1vZGVsX2l0ZXJhdGlvbl90YXNrVykKKyNlbmRpZgorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luQSAgICBJVFROT1RJRllfVk9JRChtb2RlbF90YXNrX2JlZ2luQSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpbkFfcHRyIElUVE5PVElGWV9OQU1FKG1vZGVsX3Rhc2tfYmVnaW5BKQorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luQUwgICAgSVRUTk9USUZZX1ZPSUQobW9kZWxfdGFza19iZWdpbkFMKQorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luQUxfcHRyIElUVE5PVElGWV9OQU1FKG1vZGVsX3Rhc2tfYmVnaW5BTCkKKyNkZWZpbmUgX19pdHRfbW9kZWxfaXRlcmF0aW9uX3Rhc2tBICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX2l0ZXJhdGlvbl90YXNrQSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfaXRlcmF0aW9uX3Rhc2tBX3B0ciBJVFROT1RJRllfTkFNRShtb2RlbF9pdGVyYXRpb25fdGFza0EpCisjZGVmaW5lIF9faXR0X21vZGVsX2l0ZXJhdGlvbl90YXNrQUwgICAgSVRUTk9USUZZX1ZPSUQobW9kZWxfaXRlcmF0aW9uX3Rhc2tBTCkKKyNkZWZpbmUgX19pdHRfbW9kZWxfaXRlcmF0aW9uX3Rhc2tBTF9wdHIgSVRUTk9USUZZX05BTUUobW9kZWxfaXRlcmF0aW9uX3Rhc2tBTCkKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19lbmQgICAgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX3Rhc2tfZW5kKQorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2VuZF9wdHIgICAgSVRUTk9USUZZX05BTUUobW9kZWxfdGFza19lbmQpCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfZW5kXzIgICAgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX3Rhc2tfZW5kXzIpCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfZW5kXzJfcHRyICAgIElUVE5PVElGWV9OQU1FKG1vZGVsX3Rhc2tfZW5kXzIpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luKHRhc2ssIGluc3RhbmNlLCBuYW1lKQorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luX3B0ciAgMAorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luVyhuYW1lKQorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luV19wdHIgIDAKKyNlbmRpZgorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luQShuYW1lKQorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luQV9wdHIgIDAKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpbkFMKG5hbWUsIHNpdGVOYW1lTGVuKQorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luQUxfcHRyICAwCisjZGVmaW5lIF9faXR0X21vZGVsX2l0ZXJhdGlvbl90YXNrQShuYW1lKQorI2RlZmluZSBfX2l0dF9tb2RlbF9pdGVyYXRpb25fdGFza0FfcHRyICAwCisjZGVmaW5lIF9faXR0X21vZGVsX2l0ZXJhdGlvbl90YXNrQUwobmFtZSwgc2l0ZU5hbWVMZW4pCisjZGVmaW5lIF9faXR0X21vZGVsX2l0ZXJhdGlvbl90YXNrQUxfcHRyICAwCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfZW5kKHRhc2ssIGluc3RhbmNlKQorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2VuZF9wdHIgICAgMAorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2VuZF8yKCkKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19lbmRfMl9wdHIgICAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfYmVnaW5fcHRyICAwCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfYmVnaW5XX3B0ciAwCisjZW5kaWYKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpbkFfcHRyICAwCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfYmVnaW5BTF9wdHIgIDAKKyNkZWZpbmUgX19pdHRfbW9kZWxfaXRlcmF0aW9uX3Rhc2tBX3B0ciAgICAwCisjZGVmaW5lIF9faXR0X21vZGVsX2l0ZXJhdGlvbl90YXNrQUxfcHRyICAgIDAKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19lbmRfcHRyICAgIDAKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19lbmRfMl9wdHIgICAgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBBTk5PVEFURV9MT0NLX0FDUVVJUkUvQU5OT1RBVEVfTE9DS19SRUxFQVNFIHN1cHBvcnQKKyAqCisgKiBsb2NrX2FjcXVpcmUvcmVsZWFzZSBtb2RlbCBhIHBvdGVudGlhbCBsb2NrIGZvciBib3RoIGxvY2tzZXQgYW5kCisgKiBwZXJmb3JtYW5jZSBtb2RlbGluZy4gIEVhY2ggdW5pcXVlIGFkZHJlc3MgaXMgbW9kZWxlZCBhcyBhIHNlcGFyYXRlCisgKiBsb2NrLCB3aXRoIGludmFsaWQgYWRkcmVzc2VzIGJlaW5nIHZhbGlkIGxvY2sgSURzLiAgU3BlY2lmaWNhbGx5OgorICogbm8gc3RvcmFnZSBpcyBhY2Nlc3NlZCBieSB0aGUgQVBJIGF0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcyAtIGl0IGlzIG9ubHkKKyAqIHVzZWQgZm9yIGxvY2sgaWRlbnRpZmljYXRpb24uICBMb2NrIGFjcXVpcmVzIG1heSBiZSBzZWxmLW5lc3RlZCBhbmQgYXJlCisgKiB1bmxvY2tlZCBieSBhIGNvcnJlc3BvbmRpbmcgbnVtYmVyIG9mIHJlbGVhc2VzLgorICogKFRoZXNlIGNsb3NlbHkgY29ycmVzcG9uZCB0byBfX2l0dF9zeW5jX2FjcXVpcmVkL19faXR0X3N5bmNfcmVsZWFzaW5nLAorICogYnV0IG1heSBub3QgaGF2ZSBpZGVudGljYWwgc2VtYW50aWNzLikKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfbG9ja19hY3F1aXJlKHZvaWQgKmxvY2spOwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfbG9ja19hY3F1aXJlXzIodm9pZCAqbG9jayk7Cit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF9sb2NrX3JlbGVhc2Uodm9pZCAqbG9jayk7Cit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF9sb2NrX3JlbGVhc2VfMih2b2lkICpsb2NrKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfbG9ja19hY3F1aXJlLCAodm9pZCAqbG9jaykpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9sb2NrX2FjcXVpcmVfMiwgKHZvaWQgKmxvY2spKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfbG9ja19yZWxlYXNlLCAodm9pZCAqbG9jaykpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9sb2NrX3JlbGVhc2VfMiwgKHZvaWQgKmxvY2spKQorI2RlZmluZSBfX2l0dF9tb2RlbF9sb2NrX2FjcXVpcmUgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX2xvY2tfYWNxdWlyZSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfbG9ja19hY3F1aXJlX3B0ciBJVFROT1RJRllfTkFNRShtb2RlbF9sb2NrX2FjcXVpcmUpCisjZGVmaW5lIF9faXR0X21vZGVsX2xvY2tfYWNxdWlyZV8yICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9sb2NrX2FjcXVpcmVfMikKKyNkZWZpbmUgX19pdHRfbW9kZWxfbG9ja19hY3F1aXJlXzJfcHRyIElUVE5PVElGWV9OQU1FKG1vZGVsX2xvY2tfYWNxdWlyZV8yKQorI2RlZmluZSBfX2l0dF9tb2RlbF9sb2NrX3JlbGVhc2UgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX2xvY2tfcmVsZWFzZSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfbG9ja19yZWxlYXNlX3B0ciBJVFROT1RJRllfTkFNRShtb2RlbF9sb2NrX3JlbGVhc2UpCisjZGVmaW5lIF9faXR0X21vZGVsX2xvY2tfcmVsZWFzZV8yICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9sb2NrX3JlbGVhc2VfMikKKyNkZWZpbmUgX19pdHRfbW9kZWxfbG9ja19yZWxlYXNlXzJfcHRyIElUVE5PVElGWV9OQU1FKG1vZGVsX2xvY2tfcmVsZWFzZV8yKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbW9kZWxfbG9ja19hY3F1aXJlKGxvY2spCisjZGVmaW5lIF9faXR0X21vZGVsX2xvY2tfYWNxdWlyZV9wdHIgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9sb2NrX2FjcXVpcmVfMihsb2NrKQorI2RlZmluZSBfX2l0dF9tb2RlbF9sb2NrX2FjcXVpcmVfMl9wdHIgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9sb2NrX3JlbGVhc2UobG9jaykKKyNkZWZpbmUgX19pdHRfbW9kZWxfbG9ja19yZWxlYXNlX3B0ciAwCisjZGVmaW5lIF9faXR0X21vZGVsX2xvY2tfcmVsZWFzZV8yKGxvY2spCisjZGVmaW5lIF9faXR0X21vZGVsX2xvY2tfcmVsZWFzZV8yX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbW9kZWxfbG9ja19hY3F1aXJlX3B0ciAwCisjZGVmaW5lIF9faXR0X21vZGVsX2xvY2tfYWNxdWlyZV8yX3B0ciAwCisjZGVmaW5lIF9faXR0X21vZGVsX2xvY2tfcmVsZWFzZV9wdHIgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9sb2NrX3JlbGVhc2VfMl9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBBTk5PVEFURV9SRUNPUkRfQUxMT0NBVElPTi9BTk5PVEFURV9SRUNPUkRfREVBTExPQ0FUSU9OIHN1cHBvcnQKKyAqCisgKiByZWNvcmRfYWxsb2NhdGlvbi9kZWFsbG9jYXRpb24gZGVzY3JpYmUgdXNlci1kZWZpbmVkIG1lbW9yeSBhbGxvY2F0b3IKKyAqIGJlaGF2aW9yLCB3aGljaCBtYXkgYmUgcmVxdWlyZWQgZm9yIGNvcnJlY3RuZXNzIG1vZGVsaW5nIHRvIHVuZGVyc3RhbmQKKyAqIHdoZW4gc3RvcmFnZSBpcyBub3QgZXhwZWN0ZWQgdG8gYmUgYWN0dWFsbHkgcmV1c2VkIGFjcm9zcyB0aHJlYWRzLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF9yZWNvcmRfYWxsb2NhdGlvbiAgKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKTsKK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX3JlY29yZF9kZWFsbG9jYXRpb24odm9pZCAqYWRkcik7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3JlY29yZF9hbGxvY2F0aW9uLCAgICh2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9yZWNvcmRfZGVhbGxvY2F0aW9uLCAodm9pZCAqYWRkcikpCisjZGVmaW5lIF9faXR0X21vZGVsX3JlY29yZF9hbGxvY2F0aW9uICAgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX3JlY29yZF9hbGxvY2F0aW9uKQorI2RlZmluZSBfX2l0dF9tb2RlbF9yZWNvcmRfYWxsb2NhdGlvbl9wdHIgICBJVFROT1RJRllfTkFNRShtb2RlbF9yZWNvcmRfYWxsb2NhdGlvbikKKyNkZWZpbmUgX19pdHRfbW9kZWxfcmVjb3JkX2RlYWxsb2NhdGlvbiAgICAgSVRUTk9USUZZX1ZPSUQobW9kZWxfcmVjb3JkX2RlYWxsb2NhdGlvbikKKyNkZWZpbmUgX19pdHRfbW9kZWxfcmVjb3JkX2RlYWxsb2NhdGlvbl9wdHIgSVRUTk9USUZZX05BTUUobW9kZWxfcmVjb3JkX2RlYWxsb2NhdGlvbikKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X21vZGVsX3JlY29yZF9hbGxvY2F0aW9uKGFkZHIsIHNpemUpCisjZGVmaW5lIF9faXR0X21vZGVsX3JlY29yZF9hbGxvY2F0aW9uX3B0ciAgIDAKKyNkZWZpbmUgX19pdHRfbW9kZWxfcmVjb3JkX2RlYWxsb2NhdGlvbihhZGRyKQorI2RlZmluZSBfX2l0dF9tb2RlbF9yZWNvcmRfZGVhbGxvY2F0aW9uX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbW9kZWxfcmVjb3JkX2FsbG9jYXRpb25fcHRyICAgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9yZWNvcmRfZGVhbGxvY2F0aW9uX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIEFOTk9UQVRFX0lORFVDVElPTl9VU0VTIHN1cHBvcnQKKyAqCisgKiBOb3RlIHBhcnRpY3VsYXIgc3RvcmFnZSBpcyBpbmR1Y3RpdmUgdGhyb3VnaCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHNpdGUKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfaW5kdWN0aW9uX3VzZXModm9pZCogYWRkciwgc2l6ZV90IHNpemUpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9pbmR1Y3Rpb25fdXNlcywgKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfaW5kdWN0aW9uX3VzZXMgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX2luZHVjdGlvbl91c2VzKQorI2RlZmluZSBfX2l0dF9tb2RlbF9pbmR1Y3Rpb25fdXNlc19wdHIgSVRUTk9USUZZX05BTUUobW9kZWxfaW5kdWN0aW9uX3VzZXMpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9tb2RlbF9pbmR1Y3Rpb25fdXNlcyhhZGRyLCBzaXplKQorI2RlZmluZSBfX2l0dF9tb2RlbF9pbmR1Y3Rpb25fdXNlc19wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbW9kZWxfaW5kdWN0aW9uX3VzZXNfcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBBTk5PVEFURV9SRURVQ1RJT05fVVNFUyBzdXBwb3J0CisgKgorICogTm90ZSBwYXJ0aWN1bGFyIHN0b3JhZ2UgaXMgdXNlZCBmb3IgcmVkdWN0aW9uIHRocm91Z2ggdGhlIGVuZAorICogb2YgdGhlIGN1cnJlbnQgc2l0ZQorICovCit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF9yZWR1Y3Rpb25fdXNlcyh2b2lkKiBhZGRyLCBzaXplX3Qgc2l6ZSk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3JlZHVjdGlvbl91c2VzLCAodm9pZCAqYWRkciwgc2l6ZV90IHNpemUpKQorI2RlZmluZSBfX2l0dF9tb2RlbF9yZWR1Y3Rpb25fdXNlcyAgICAgSVRUTk9USUZZX1ZPSUQobW9kZWxfcmVkdWN0aW9uX3VzZXMpCisjZGVmaW5lIF9faXR0X21vZGVsX3JlZHVjdGlvbl91c2VzX3B0ciBJVFROT1RJRllfTkFNRShtb2RlbF9yZWR1Y3Rpb25fdXNlcykKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X21vZGVsX3JlZHVjdGlvbl91c2VzKGFkZHIsIHNpemUpCisjZGVmaW5lIF9faXR0X21vZGVsX3JlZHVjdGlvbl91c2VzX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9tb2RlbF9yZWR1Y3Rpb25fdXNlc19wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIEFOTk9UQVRFX09CU0VSVkVfVVNFUyBzdXBwb3J0CisgKgorICogSGF2ZSBjb3JyZWN0bmVzcyBtb2RlbGluZyByZWNvcmQgb2JzZXJ2YXRpb25zIGFib3V0IHVzZXMgb2Ygc3RvcmFnZQorICogdGhyb3VnaCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHNpdGUKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfb2JzZXJ2ZV91c2VzKHZvaWQqIGFkZHIsIHNpemVfdCBzaXplKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfb2JzZXJ2ZV91c2VzLCAodm9pZCAqYWRkciwgc2l6ZV90IHNpemUpKQorI2RlZmluZSBfX2l0dF9tb2RlbF9vYnNlcnZlX3VzZXMgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX29ic2VydmVfdXNlcykKKyNkZWZpbmUgX19pdHRfbW9kZWxfb2JzZXJ2ZV91c2VzX3B0ciBJVFROT1RJRllfTkFNRShtb2RlbF9vYnNlcnZlX3VzZXMpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9tb2RlbF9vYnNlcnZlX3VzZXMoYWRkciwgc2l6ZSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfb2JzZXJ2ZV91c2VzX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9tb2RlbF9vYnNlcnZlX3VzZXNfcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBBTk5PVEFURV9DTEVBUl9VU0VTIHN1cHBvcnQKKyAqCisgKiBDbGVhciB0aGUgc3BlY2lhbCBoYW5kbGluZyBvZiBhIHBpZWNlIG9mIHN0b3JhZ2UgcmVsYXRlZCB0byBpbmR1Y3Rpb24sCisgKiByZWR1Y3Rpb24gb3Igb2JzZXJ2ZV91c2VzCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX2NsZWFyX3VzZXModm9pZCogYWRkcik7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2NsZWFyX3VzZXMsICh2b2lkICphZGRyKSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfY2xlYXJfdXNlcyAgICAgSVRUTk9USUZZX1ZPSUQobW9kZWxfY2xlYXJfdXNlcykKKyNkZWZpbmUgX19pdHRfbW9kZWxfY2xlYXJfdXNlc19wdHIgSVRUTk9USUZZX05BTUUobW9kZWxfY2xlYXJfdXNlcykKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X21vZGVsX2NsZWFyX3VzZXMoYWRkcikKKyNkZWZpbmUgX19pdHRfbW9kZWxfY2xlYXJfdXNlc19wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X21vZGVsX2NsZWFyX3VzZXNfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgQU5OT1RBVEVfRElTQUJMRV8qX1BVU0gvQU5OT1RBVEVfRElTQUJMRV8qX1BPUCBzdXBwb3J0CisgKgorICogZGlzYWJsZV9wdXNoL2Rpc2FibGVfcG9wIHB1c2ggYW5kIHBvcCBkaXNhYmxpbmcgYmFzZWQgb24gYSBwYXJhbWV0ZXIuCisgKiBEaXNhYmxpbmcgb2JzZXJ2YXRpb25zIHN0b3BzIHByb2Nlc3Npbmcgb2YgbWVtb3J5IHJlZmVyZW5jZXMgZHVyaW5nCisgKiBjb3JyZWN0bmVzcyBtb2RlbGluZywgYW5kIGFsbCBhbm5vdGF0aW9ucyB0aGF0IG9jY3VyIGluIHRoZSBkaXNhYmxlZAorICogcmVnaW9uLiAgVGhpcyBhbGxvd3MgZGVzY3JpcHRpb24gb2YgY29kZSB0aGF0IGlzIGV4cGVjdGVkIHRvIGJlIGhhbmRsZWQKKyAqIHNwZWNpYWxseSBkdXJpbmcgY29udmVyc2lvbiB0byBwYXJhbGxlbGlzbSBvciB0aGF0IGlzIG5vdCByZWNvZ25pemVkCisgKiBieSB0b29scyAoZS5nLiBzb21lIGtpbmRzIG9mIHN5bmNocm9uaXphdGlvbiBvcGVyYXRpb25zLikKKyAqIFRoaXMgbWVjaGFuaXNtIGNhdXNlcyBhbGwgYW5ub3RhdGlvbnMgaW4gdGhlIGRpc2FibGVkIHJlZ2lvbiwgb3RoZXIKKyAqIHRoYW4gZGlzYWJsZV9wdXNoIGFuZCBkaXNhYmxlX3BvcCwgdG8gYmUgaWdub3JlZC4gIChGb3IgZXhhbXBsZSwgdGhpcworICogbWlnaHQgdmFsaWRseSBiZSB1c2VkIHRvIGRpc2FibGUgYW4gZW50aXJlIHBhcmFsbGVsIHNpdGUgYW5kIHRoZSBjb250YWluZWQKKyAqIHRhc2tzIGFuZCBsb2NraW5nIGluIGl0IGZvciBkYXRhIGNvbGxlY3Rpb24gcHVycG9zZXMuKQorICogVGhlIGRpc2FibGUgZm9yIGNvbGxlY3Rpb24gaXMgYSBtb3JlIGV4cGVuc2l2ZSBvcGVyYXRpb24sIGJ1dCByZWR1Y2VzCisgKiBjb2xsZWN0b3Igb3ZlcmhlYWQgc2lnbmlmaWNhbnRseS4gIFRoaXMgYXBwbGllcyB0byBCT1RIIGNvcnJlY3RuZXNzIGRhdGEKKyAqIGNvbGxlY3Rpb24gYW5kIHBlcmZvcm1hbmNlIGRhdGEgY29sbGVjdGlvbi4gIEZvciBleGFtcGxlLCBhIHNpdGUKKyAqIGNvbnRhaW5pbmcgYSB0YXNrIG1pZ2h0IG9ubHkgZW5hYmxlIGRhdGEgY29sbGVjdGlvbiBmb3IgdGhlIGZpcnN0IDEwCisgKiBpdGVyYXRpb25zLiAgQm90aCBwZXJmb3JtYW5jZSBhbmQgY29ycmVjdG5lc3MgZGF0YSBzaG91bGQgcmVmbGVjdCB0aGlzLAorICogYW5kIHRoZSBwcm9ncmFtIHNob3VsZCBydW4gYXMgY2xvc2UgdG8gZnVsbCBzcGVlZCBhcyBwb3NzaWJsZSB3aGVuCisgKiBjb2xsZWN0aW9uIGlzIGRpc2FibGVkLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF9kaXNhYmxlX3B1c2goX19pdHRfbW9kZWxfZGlzYWJsZSB4KTsKK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX2Rpc2FibGVfcG9wKHZvaWQpOwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfYWdncmVnYXRlX3Rhc2soc2l6ZV90IHgpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9kaXNhYmxlX3B1c2gsIChfX2l0dF9tb2RlbF9kaXNhYmxlIHgpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfZGlzYWJsZV9wb3AsICAodm9pZCkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9hZ2dyZWdhdGVfdGFzaywgKHNpemVfdCB4KSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfZGlzYWJsZV9wdXNoICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9kaXNhYmxlX3B1c2gpCisjZGVmaW5lIF9faXR0X21vZGVsX2Rpc2FibGVfcHVzaF9wdHIgSVRUTk9USUZZX05BTUUobW9kZWxfZGlzYWJsZV9wdXNoKQorI2RlZmluZSBfX2l0dF9tb2RlbF9kaXNhYmxlX3BvcCAgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX2Rpc2FibGVfcG9wKQorI2RlZmluZSBfX2l0dF9tb2RlbF9kaXNhYmxlX3BvcF9wdHIgIElUVE5PVElGWV9OQU1FKG1vZGVsX2Rpc2FibGVfcG9wKQorI2RlZmluZSBfX2l0dF9tb2RlbF9hZ2dyZWdhdGVfdGFzayAgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX2FnZ3JlZ2F0ZV90YXNrKQorI2RlZmluZSBfX2l0dF9tb2RlbF9hZ2dyZWdhdGVfdGFza19wdHIgIElUVE5PVElGWV9OQU1FKG1vZGVsX2FnZ3JlZ2F0ZV90YXNrKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbW9kZWxfZGlzYWJsZV9wdXNoKHgpCisjZGVmaW5lIF9faXR0X21vZGVsX2Rpc2FibGVfcHVzaF9wdHIgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9kaXNhYmxlX3BvcCgpCisjZGVmaW5lIF9faXR0X21vZGVsX2Rpc2FibGVfcG9wX3B0ciAwCisjZGVmaW5lIF9faXR0X21vZGVsX2FnZ3JlZ2F0ZV90YXNrKHgpCisjZGVmaW5lIF9faXR0X21vZGVsX2FnZ3JlZ2F0ZV90YXNrX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbW9kZWxfZGlzYWJsZV9wdXNoX3B0ciAwCisjZGVmaW5lIF9faXR0X21vZGVsX2Rpc2FibGVfcG9wX3B0ciAwCisjZGVmaW5lIF9faXR0X21vZGVsX2FnZ3JlZ2F0ZV90YXNrX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gbW9kZWwgZ3JvdXAgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgaGVhcCBIZWFwCisgKiBAaW5ncm91cCBwdWJsaWMKKyAqIEhlYXAgZ3JvdXAKKyAqIEB7CisgKi8KKwordHlwZWRlZiB2b2lkKiBfX2l0dF9oZWFwX2Z1bmN0aW9uOworCisvKioKKyAqIEBicmllZiBDcmVhdGUgYW4gaWRlbnRpZmljYXRpb24gZm9yIGhlYXAgZnVuY3Rpb24KKyAqIEByZXR1cm4gbm9uLXplcm8gaWRlbnRpZmllciBvciBOVUxMCisgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK19faXR0X2hlYXBfZnVuY3Rpb24gSVRUQVBJIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlQShjb25zdCBjaGFyKiAgICBuYW1lLCBjb25zdCBjaGFyKiAgICBkb21haW4pOworX19pdHRfaGVhcF9mdW5jdGlvbiBJVFRBUEkgX19pdHRfaGVhcF9mdW5jdGlvbl9jcmVhdGVXKGNvbnN0IHdjaGFyX3QqIG5hbWUsIGNvbnN0IHdjaGFyX3QqIGRvbWFpbik7CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorIyAgZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlICAgICBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZVcKKyMgIGRlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZV9wdHIgX19pdHRfaGVhcF9mdW5jdGlvbl9jcmVhdGVXX3B0cgorI2Vsc2UKKyMgIGRlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZSAgICAgX19pdHRfaGVhcF9mdW5jdGlvbl9jcmVhdGVBCisjICBkZWZpbmUgX19pdHRfaGVhcF9mdW5jdGlvbl9jcmVhdGVfcHRyIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlQV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitfX2l0dF9oZWFwX2Z1bmN0aW9uIElUVEFQSSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZShjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiBkb21haW4pOworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2hlYXBfZnVuY3Rpb24sIGhlYXBfZnVuY3Rpb25fY3JlYXRlQSwgKGNvbnN0IGNoYXIqICAgIG5hbWUsIGNvbnN0IGNoYXIqICAgIGRvbWFpbikpCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2hlYXBfZnVuY3Rpb24sIGhlYXBfZnVuY3Rpb25fY3JlYXRlVywgKGNvbnN0IHdjaGFyX3QqIG5hbWUsIGNvbnN0IHdjaGFyX3QqIGRvbWFpbikpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2hlYXBfZnVuY3Rpb24sIGhlYXBfZnVuY3Rpb25fY3JlYXRlLCAgKGNvbnN0IGNoYXIqICAgIG5hbWUsIGNvbnN0IGNoYXIqICAgIGRvbWFpbikpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlQSAgICAgSVRUTk9USUZZX0RBVEEoaGVhcF9mdW5jdGlvbl9jcmVhdGVBKQorI2RlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZUFfcHRyIElUVE5PVElGWV9OQU1FKGhlYXBfZnVuY3Rpb25fY3JlYXRlQSkKKyNkZWZpbmUgX19pdHRfaGVhcF9mdW5jdGlvbl9jcmVhdGVXICAgICBJVFROT1RJRllfREFUQShoZWFwX2Z1bmN0aW9uX2NyZWF0ZVcpCisjZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlV19wdHIgSVRUTk9USUZZX05BTUUoaGVhcF9mdW5jdGlvbl9jcmVhdGVXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlICAgICAgSVRUTk9USUZZX0RBVEEoaGVhcF9mdW5jdGlvbl9jcmVhdGUpCisjZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlX3B0ciAgSVRUTk9USUZZX05BTUUoaGVhcF9mdW5jdGlvbl9jcmVhdGUpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZUEobmFtZSwgZG9tYWluKSAoX19pdHRfaGVhcF9mdW5jdGlvbikwCisjZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlQV9wdHIgMAorI2RlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZVcobmFtZSwgZG9tYWluKSAoX19pdHRfaGVhcF9mdW5jdGlvbikwCisjZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlKG5hbWUsIGRvbWFpbikgIChfX2l0dF9oZWFwX2Z1bmN0aW9uKTAKKyNkZWZpbmUgX19pdHRfaGVhcF9mdW5jdGlvbl9jcmVhdGVfcHRyICAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfaGVhcF9mdW5jdGlvbl9jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlX3B0ciAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBSZWNvcmQgYW4gYWxsb2NhdGlvbiBiZWdpbiBvY2N1cnJlbmNlLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9oZWFwX2FsbG9jYXRlX2JlZ2luKF9faXR0X2hlYXBfZnVuY3Rpb24gaCwgc2l6ZV90IHNpemUsIGludCBpbml0aWFsaXplZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfYWxsb2NhdGVfYmVnaW4sIChfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHNpemVfdCBzaXplLCBpbnQgaW5pdGlhbGl6ZWQpKQorI2RlZmluZSBfX2l0dF9oZWFwX2FsbG9jYXRlX2JlZ2luICAgICBJVFROT1RJRllfVk9JRChoZWFwX2FsbG9jYXRlX2JlZ2luKQorI2RlZmluZSBfX2l0dF9oZWFwX2FsbG9jYXRlX2JlZ2luX3B0ciBJVFROT1RJRllfTkFNRShoZWFwX2FsbG9jYXRlX2JlZ2luKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9hbGxvY2F0ZV9iZWdpbihoLCBzaXplLCBpbml0aWFsaXplZCkKKyNkZWZpbmUgX19pdHRfaGVhcF9hbGxvY2F0ZV9iZWdpbl9wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9hbGxvY2F0ZV9iZWdpbl9wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIFJlY29yZCBhbiBhbGxvY2F0aW9uIGVuZCBvY2N1cnJlbmNlLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9oZWFwX2FsbG9jYXRlX2VuZChfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHZvaWQqKiBhZGRyLCBzaXplX3Qgc2l6ZSwgaW50IGluaXRpYWxpemVkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9hbGxvY2F0ZV9lbmQsIChfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHZvaWQqKiBhZGRyLCBzaXplX3Qgc2l6ZSwgaW50IGluaXRpYWxpemVkKSkKKyNkZWZpbmUgX19pdHRfaGVhcF9hbGxvY2F0ZV9lbmQgICAgIElUVE5PVElGWV9WT0lEKGhlYXBfYWxsb2NhdGVfZW5kKQorI2RlZmluZSBfX2l0dF9oZWFwX2FsbG9jYXRlX2VuZF9wdHIgSVRUTk9USUZZX05BTUUoaGVhcF9hbGxvY2F0ZV9lbmQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9oZWFwX2FsbG9jYXRlX2VuZChoLCBhZGRyLCBzaXplLCBpbml0aWFsaXplZCkKKyNkZWZpbmUgX19pdHRfaGVhcF9hbGxvY2F0ZV9lbmRfcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2hlYXBfYWxsb2NhdGVfZW5kX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgUmVjb3JkIGFuIGZyZWUgYmVnaW4gb2NjdXJyZW5jZS4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfaGVhcF9mcmVlX2JlZ2luKF9faXR0X2hlYXBfZnVuY3Rpb24gaCwgdm9pZCogYWRkcik7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfZnJlZV9iZWdpbiwgKF9faXR0X2hlYXBfZnVuY3Rpb24gaCwgdm9pZCogYWRkcikpCisjZGVmaW5lIF9faXR0X2hlYXBfZnJlZV9iZWdpbiAgICAgSVRUTk9USUZZX1ZPSUQoaGVhcF9mcmVlX2JlZ2luKQorI2RlZmluZSBfX2l0dF9oZWFwX2ZyZWVfYmVnaW5fcHRyIElUVE5PVElGWV9OQU1FKGhlYXBfZnJlZV9iZWdpbikKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2hlYXBfZnJlZV9iZWdpbihoLCBhZGRyKQorI2RlZmluZSBfX2l0dF9oZWFwX2ZyZWVfYmVnaW5fcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2hlYXBfZnJlZV9iZWdpbl9wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIFJlY29yZCBhbiBmcmVlIGVuZCBvY2N1cnJlbmNlLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9oZWFwX2ZyZWVfZW5kKF9faXR0X2hlYXBfZnVuY3Rpb24gaCwgdm9pZCogYWRkcik7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfZnJlZV9lbmQsIChfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHZvaWQqIGFkZHIpKQorI2RlZmluZSBfX2l0dF9oZWFwX2ZyZWVfZW5kICAgICBJVFROT1RJRllfVk9JRChoZWFwX2ZyZWVfZW5kKQorI2RlZmluZSBfX2l0dF9oZWFwX2ZyZWVfZW5kX3B0ciBJVFROT1RJRllfTkFNRShoZWFwX2ZyZWVfZW5kKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9mcmVlX2VuZChoLCBhZGRyKQorI2RlZmluZSBfX2l0dF9oZWFwX2ZyZWVfZW5kX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9oZWFwX2ZyZWVfZW5kX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgUmVjb3JkIGFuIHJlYWxsb2NhdGlvbiBiZWdpbiBvY2N1cnJlbmNlLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9oZWFwX3JlYWxsb2NhdGVfYmVnaW4oX19pdHRfaGVhcF9mdW5jdGlvbiBoLCB2b2lkKiBhZGRyLCBzaXplX3QgbmV3X3NpemUsIGludCBpbml0aWFsaXplZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfcmVhbGxvY2F0ZV9iZWdpbiwgKF9faXR0X2hlYXBfZnVuY3Rpb24gaCwgdm9pZCogYWRkciwgc2l6ZV90IG5ld19zaXplLCBpbnQgaW5pdGlhbGl6ZWQpKQorI2RlZmluZSBfX2l0dF9oZWFwX3JlYWxsb2NhdGVfYmVnaW4gICAgIElUVE5PVElGWV9WT0lEKGhlYXBfcmVhbGxvY2F0ZV9iZWdpbikKKyNkZWZpbmUgX19pdHRfaGVhcF9yZWFsbG9jYXRlX2JlZ2luX3B0ciBJVFROT1RJRllfTkFNRShoZWFwX3JlYWxsb2NhdGVfYmVnaW4pCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9oZWFwX3JlYWxsb2NhdGVfYmVnaW4oaCwgYWRkciwgbmV3X3NpemUsIGluaXRpYWxpemVkKQorI2RlZmluZSBfX2l0dF9oZWFwX3JlYWxsb2NhdGVfYmVnaW5fcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2hlYXBfcmVhbGxvY2F0ZV9iZWdpbl9wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIFJlY29yZCBhbiByZWFsbG9jYXRpb24gZW5kIG9jY3VycmVuY2UuCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2hlYXBfcmVhbGxvY2F0ZV9lbmQoX19pdHRfaGVhcF9mdW5jdGlvbiBoLCB2b2lkKiBhZGRyLCB2b2lkKiogbmV3X2FkZHIsIHNpemVfdCBuZXdfc2l6ZSwgaW50IGluaXRpYWxpemVkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9yZWFsbG9jYXRlX2VuZCwgKF9faXR0X2hlYXBfZnVuY3Rpb24gaCwgdm9pZCogYWRkciwgdm9pZCoqIG5ld19hZGRyLCBzaXplX3QgbmV3X3NpemUsIGludCBpbml0aWFsaXplZCkpCisjZGVmaW5lIF9faXR0X2hlYXBfcmVhbGxvY2F0ZV9lbmQgICAgIElUVE5PVElGWV9WT0lEKGhlYXBfcmVhbGxvY2F0ZV9lbmQpCisjZGVmaW5lIF9faXR0X2hlYXBfcmVhbGxvY2F0ZV9lbmRfcHRyIElUVE5PVElGWV9OQU1FKGhlYXBfcmVhbGxvY2F0ZV9lbmQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9oZWFwX3JlYWxsb2NhdGVfZW5kKGgsIGFkZHIsIG5ld19hZGRyLCBuZXdfc2l6ZSwgaW5pdGlhbGl6ZWQpCisjZGVmaW5lIF9faXR0X2hlYXBfcmVhbGxvY2F0ZV9lbmRfcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2hlYXBfcmVhbGxvY2F0ZV9lbmRfcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKiogQGJyaWVmIGludGVybmFsIGFjY2VzcyBiZWdpbiAqLwordm9pZCBJVFRBUEkgX19pdHRfaGVhcF9pbnRlcm5hbF9hY2Nlc3NfYmVnaW4odm9pZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfaW50ZXJuYWxfYWNjZXNzX2JlZ2luLCAgKHZvaWQpKQorI2RlZmluZSBfX2l0dF9oZWFwX2ludGVybmFsX2FjY2Vzc19iZWdpbiAgICAgIElUVE5PVElGWV9WT0lEKGhlYXBfaW50ZXJuYWxfYWNjZXNzX2JlZ2luKQorI2RlZmluZSBfX2l0dF9oZWFwX2ludGVybmFsX2FjY2Vzc19iZWdpbl9wdHIgIElUVE5PVElGWV9OQU1FKGhlYXBfaW50ZXJuYWxfYWNjZXNzX2JlZ2luKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9pbnRlcm5hbF9hY2Nlc3NfYmVnaW4oKQorI2RlZmluZSBfX2l0dF9oZWFwX2ludGVybmFsX2FjY2Vzc19iZWdpbl9wdHIgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9oZWFwX2ludGVybmFsX2FjY2Vzc19iZWdpbl9wdHIgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqIEBicmllZiBpbnRlcm5hbCBhY2Nlc3MgZW5kICovCit2b2lkIElUVEFQSSBfX2l0dF9oZWFwX2ludGVybmFsX2FjY2Vzc19lbmQodm9pZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfaW50ZXJuYWxfYWNjZXNzX2VuZCwgKHZvaWQpKQorI2RlZmluZSBfX2l0dF9oZWFwX2ludGVybmFsX2FjY2Vzc19lbmQgICAgIElUVE5PVElGWV9WT0lEKGhlYXBfaW50ZXJuYWxfYWNjZXNzX2VuZCkKKyNkZWZpbmUgX19pdHRfaGVhcF9pbnRlcm5hbF9hY2Nlc3NfZW5kX3B0ciBJVFROT1RJRllfTkFNRShoZWFwX2ludGVybmFsX2FjY2Vzc19lbmQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9oZWFwX2ludGVybmFsX2FjY2Vzc19lbmQoKQorI2RlZmluZSBfX2l0dF9oZWFwX2ludGVybmFsX2FjY2Vzc19lbmRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9oZWFwX2ludGVybmFsX2FjY2Vzc19lbmRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqIEBicmllZiByZWNvcmQgbWVtb3J5IGdyb3d0aCBiZWdpbiAqLwordm9pZCBJVFRBUEkgX19pdHRfaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9iZWdpbih2b2lkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9iZWdpbiwgICh2b2lkKSkKKyNkZWZpbmUgX19pdHRfaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9iZWdpbiAgICAgIElUVE5PVElGWV9WT0lEKGhlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfYmVnaW4pCisjZGVmaW5lIF9faXR0X2hlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfYmVnaW5fcHRyICBJVFROT1RJRllfTkFNRShoZWFwX3JlY29yZF9tZW1vcnlfZ3Jvd3RoX2JlZ2luKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9iZWdpbigpCisjZGVmaW5lIF9faXR0X2hlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfYmVnaW5fcHRyICAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9iZWdpbl9wdHIgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqIEBicmllZiByZWNvcmQgbWVtb3J5IGdyb3d0aCBlbmQgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2hlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfZW5kKHZvaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX3JlY29yZF9tZW1vcnlfZ3Jvd3RoX2VuZCwgKHZvaWQpKQorI2RlZmluZSBfX2l0dF9oZWFwX3JlY29yZF9tZW1vcnlfZ3Jvd3RoX2VuZCAgICAgSVRUTk9USUZZX1ZPSUQoaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9lbmQpCisjZGVmaW5lIF9faXR0X2hlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfZW5kX3B0ciBJVFROT1RJRllfTkFNRShoZWFwX3JlY29yZF9tZW1vcnlfZ3Jvd3RoX2VuZCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2hlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfZW5kKCkKKyNkZWZpbmUgX19pdHRfaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9lbmRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9oZWFwX3JlY29yZF9tZW1vcnlfZ3Jvd3RoX2VuZF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBTcGVjaWZ5IHRoZSB0eXBlIG9mIGhlYXAgZGV0ZWN0aW9uL3JlcG9ydGluZyB0byBtb2RpZnkuCisgKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplciAKKyAqIEBicmllZiBSZXBvcnQgb24gbWVtb3J5IGxlYWtzLgorICovCisjZGVmaW5lIF9faXR0X2hlYXBfbGVha3MgMHgwMDAwMDAwMQorCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIgCisgKiBAYnJpZWYgUmVwb3J0IG9uIG1lbW9yeSBncm93dGguCisgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9ncm93dGggMHgwMDAwMDAwMgorCisKKy8qKiBAYnJpZWYgaGVhcCByZXNldCBkZXRlY3Rpb24gKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2hlYXBfcmVzZXRfZGV0ZWN0aW9uKHVuc2lnbmVkIGludCByZXNldF9tYXNrKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9yZXNldF9kZXRlY3Rpb24sICAodW5zaWduZWQgaW50IHJlc2V0X21hc2spKQorI2RlZmluZSBfX2l0dF9oZWFwX3Jlc2V0X2RldGVjdGlvbiAgICAgIElUVE5PVElGWV9WT0lEKGhlYXBfcmVzZXRfZGV0ZWN0aW9uKQorI2RlZmluZSBfX2l0dF9oZWFwX3Jlc2V0X2RldGVjdGlvbl9wdHIgIElUVE5PVElGWV9OQU1FKGhlYXBfcmVzZXRfZGV0ZWN0aW9uKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9yZXNldF9kZXRlY3Rpb24oKQorI2RlZmluZSBfX2l0dF9oZWFwX3Jlc2V0X2RldGVjdGlvbl9wdHIgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9oZWFwX3Jlc2V0X2RldGVjdGlvbl9wdHIgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqIEBicmllZiByZXBvcnQgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2hlYXBfcmVjb3JkKHVuc2lnbmVkIGludCByZWNvcmRfbWFzayk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfcmVjb3JkLCAodW5zaWduZWQgaW50IHJlY29yZF9tYXNrKSkKKyNkZWZpbmUgX19pdHRfaGVhcF9yZWNvcmQgICAgIElUVE5PVElGWV9WT0lEKGhlYXBfcmVjb3JkKQorI2RlZmluZSBfX2l0dF9oZWFwX3JlY29yZF9wdHIgSVRUTk9USUZZX05BTUUoaGVhcF9yZWNvcmQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9oZWFwX3JlY29yZCgpCisjZGVmaW5lIF9faXR0X2hlYXBfcmVjb3JkX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9yZWNvcmRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqIEB9IGhlYXAgZ3JvdXAgKi8KKy8qKiBAZW5kY29uZCAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgZG9tYWlucyBEb21haW5zCisgKiBAaW5ncm91cCBwdWJsaWMKKyAqIERvbWFpbnMgZ3JvdXAKKyAqIEB7CisgKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjcHJhZ21hIHBhY2socHVzaCwgOCkKKwordHlwZWRlZiBzdHJ1Y3QgX19faXR0X2RvbWFpbgoreworICAgIHZvbGF0aWxlIGludCBmbGFnczsgLyohPCBaZXJvIGlmIGRpc2FibGVkLCBub24temVybyBpZiBlbmFibGVkLiBUaGUgbWVhbmluZyBvZiBkaWZmZXJlbnQgbm9uLXplcm8gdmFsdWVzIGlzIHJlc2VydmVkIHRvIHRoZSBydW50aW1lICovCisgICAgY29uc3QgY2hhciogbmFtZUE7ICAvKiE8IENvcHkgb2Ygb3JpZ2luYWwgbmFtZSBpbiBBU0NJSS4gKi8KKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisgICAgY29uc3Qgd2NoYXJfdCogbmFtZVc7IC8qITwgQ29weSBvZiBvcmlnaW5hbCBuYW1lIGluIFVOSUNPREUuICovCisjZWxzZSAgLyogVU5JQ09ERSB8fCBfVU5JQ09ERSAqLworICAgIHZvaWQqIG5hbWVXOworI2VuZGlmIC8qIFVOSUNPREUgfHwgX1VOSUNPREUgKi8KKyAgICBpbnQgICBleHRyYTE7IC8qITwgUmVzZXJ2ZWQgdG8gdGhlIHJ1bnRpbWUgKi8KKyAgICB2b2lkKiBleHRyYTI7IC8qITwgUmVzZXJ2ZWQgdG8gdGhlIHJ1bnRpbWUgKi8KKyAgICBzdHJ1Y3QgX19faXR0X2RvbWFpbiogbmV4dDsKK30gX19pdHRfZG9tYWluOworCisjcHJhZ21hIHBhY2socG9wKQorLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGluZ3JvdXAgZG9tYWlucworICogQGJyaWVmIENyZWF0ZSBhIGRvbWFpbi4KKyAqIENyZWF0ZSBkb21haW4gdXNpbmcgc29tZSBkb21haW4gbmFtZTogdGhlIFVSSSBuYW1pbmcgc3R5bGUgaXMgcmVjb21tZW5kZWQuCisgKiBCZWNhdXNlIHRoZSBzZXQgb2YgZG9tYWlucyBpcyBleHBlY3RlZCB0byBiZSBzdGF0aWMgb3ZlciB0aGUgYXBwbGljYXRpb24ncyAKKyAqIGV4ZWN1dGlvbiB0aW1lLCB0aGVyZSBpcyBubyBtZWNoYW5pc20gdG8gZGVzdHJveSBhIGRvbWFpbi4KKyAqIEFueSBkb21haW4gY2FuIGJlIGFjY2Vzc2VkIGJ5IGFueSB0aHJlYWQgaW4gdGhlIHByb2Nlc3MsIHJlZ2FyZGxlc3Mgb2YKKyAqIHdoaWNoIHRocmVhZCBjcmVhdGVkIHRoZSBkb21haW4uIFRoaXMgY2FsbCBpcyB0aHJlYWQtc2FmZS4KKyAqIEBwYXJhbVtpbl0gbmFtZSBuYW1lIG9mIGRvbWFpbgorICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitfX2l0dF9kb21haW4qIElUVEFQSSBfX2l0dF9kb21haW5fY3JlYXRlQShjb25zdCBjaGFyICAgICpuYW1lKTsKK19faXR0X2RvbWFpbiogSVRUQVBJIF9faXR0X2RvbWFpbl9jcmVhdGVXKGNvbnN0IHdjaGFyX3QgKm5hbWUpOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF9kb21haW5fY3JlYXRlICAgICBfX2l0dF9kb21haW5fY3JlYXRlVworIyAgZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGVfcHRyIF9faXR0X2RvbWFpbl9jcmVhdGVXX3B0cgorI2Vsc2UgLyogVU5JQ09ERSAqLworIyAgZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGUgICAgIF9faXR0X2RvbWFpbl9jcmVhdGVBCisjICBkZWZpbmUgX19pdHRfZG9tYWluX2NyZWF0ZV9wdHIgX19pdHRfZG9tYWluX2NyZWF0ZUFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworX19pdHRfZG9tYWluKiBJVFRBUEkgX19pdHRfZG9tYWluX2NyZWF0ZShjb25zdCBjaGFyICpuYW1lKTsKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9kb21haW4qLCBkb21haW5fY3JlYXRlQSwgKGNvbnN0IGNoYXIgICAgKm5hbWUpKQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9kb21haW4qLCBkb21haW5fY3JlYXRlVywgKGNvbnN0IHdjaGFyX3QgKm5hbWUpKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9kb21haW4qLCBkb21haW5fY3JlYXRlLCAgKGNvbnN0IGNoYXIgICAgKm5hbWUpKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9kb21haW5fY3JlYXRlQSAgICAgSVRUTk9USUZZX0RBVEEoZG9tYWluX2NyZWF0ZUEpCisjZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGVBX3B0ciBJVFROT1RJRllfTkFNRShkb21haW5fY3JlYXRlQSkKKyNkZWZpbmUgX19pdHRfZG9tYWluX2NyZWF0ZVcgICAgIElUVE5PVElGWV9EQVRBKGRvbWFpbl9jcmVhdGVXKQorI2RlZmluZSBfX2l0dF9kb21haW5fY3JlYXRlV19wdHIgSVRUTk9USUZZX05BTUUoZG9tYWluX2NyZWF0ZVcpCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfZG9tYWluX2NyZWF0ZSAgICAgSVRUTk9USUZZX0RBVEEoZG9tYWluX2NyZWF0ZSkKKyNkZWZpbmUgX19pdHRfZG9tYWluX2NyZWF0ZV9wdHIgSVRUTk9USUZZX05BTUUoZG9tYWluX2NyZWF0ZSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGVBKG5hbWUpIChfX2l0dF9kb21haW4qKTAKKyNkZWZpbmUgX19pdHRfZG9tYWluX2NyZWF0ZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfZG9tYWluX2NyZWF0ZVcobmFtZSkgKF9faXR0X2RvbWFpbiopMAorI2RlZmluZSBfX2l0dF9kb21haW5fY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGUobmFtZSkgIChfX2l0dF9kb21haW4qKTAKKyNkZWZpbmUgX19pdHRfZG9tYWluX2NyZWF0ZV9wdHIgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfZG9tYWluX2NyZWF0ZV9wdHIgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSBkb21haW5zIGdyb3VwICovCisKKy8qKgorICogQGRlZmdyb3VwIGlkcyBJRHMKKyAqIEBpbmdyb3VwIHB1YmxpYworICogSURzIGdyb3VwCisgKiBAeworICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI3ByYWdtYSBwYWNrKHB1c2gsIDgpCisKK3R5cGVkZWYgc3RydWN0IF9fX2l0dF9pZAoreworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBkMSwgZDIsIGQzOworfSBfX2l0dF9pZDsKKworI3ByYWdtYSBwYWNrKHBvcCkKKy8qKiBAZW5kY29uZCAqLworCitzdGF0aWMgY29uc3QgX19pdHRfaWQgX19pdHRfbnVsbCA9IHsgMCwgMCwgMCB9OworCisvKioKKyAqIEBpbmdyb3VwIGlkcworICogQGJyaWVmIEEgY29udmVuaWVuY2UgZnVuY3Rpb24gaXMgcHJvdmlkZWQgdG8gY3JlYXRlIGFuIElEIHdpdGhvdXQgZG9tYWluIGNvbnRyb2wuCisgKiBAYnJpZWYgVGhpcyBpcyBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgYW4gX19pdHRfaWQgc3RydWN0dXJlLgorICogQWZ0ZXIgeW91IG1ha2UgdGhlIElEIHdpdGggdGhpcyBmdW5jdGlvbiwgeW91IHN0aWxsIG11c3QgY3JlYXRlIGl0IHdpdGggdGhlCisgKiBfX2l0dF9pZF9jcmVhdGUgZnVuY3Rpb24gYmVmb3JlIHVzaW5nIHRoZSBJRCB0byBpZGVudGlmeSBhIG5hbWVkIGVudGl0eS4KKyAqIEBwYXJhbVtpbl0gYWRkciBUaGUgYWRkcmVzcyBvZiBvYmplY3Q7IGhpZ2ggUVdPUkQgb2YgdGhlIElEIHZhbHVlLgorICogQHBhcmFtW2luXSBleHRyYSBUaGUgZXh0cmEgZGF0YSB0byB1bmlxdWUgaWRlbnRpZnkgb2JqZWN0OyBsb3cgUVdPUkQgb2YgdGhlIElEIHZhbHVlLgorICovCisKK0lUVF9JTkxJTkUgX19pdHRfaWQgSVRUQVBJIF9faXR0X2lkX21ha2Uodm9pZCogYWRkciwgdW5zaWduZWQgbG9uZyBsb25nIGV4dHJhKSBJVFRfSU5MSU5FX0FUVFJJQlVURTsKK0lUVF9JTkxJTkUgX19pdHRfaWQgSVRUQVBJIF9faXR0X2lkX21ha2Uodm9pZCogYWRkciwgdW5zaWduZWQgbG9uZyBsb25nIGV4dHJhKQoreworICAgIF9faXR0X2lkIGlkID0gX19pdHRfbnVsbDsKKyAgICBpZC5kMSA9ICh1bnNpZ25lZCBsb25nIGxvbmcpKCh1aW50cHRyX3QpYWRkcik7CisgICAgaWQuZDIgPSAodW5zaWduZWQgbG9uZyBsb25nKWV4dHJhOworICAgIGlkLmQzID0gKHVuc2lnbmVkIGxvbmcgbG9uZykwOyAvKiBSZXNlcnZlZC4gTXVzdCBiZSB6ZXJvICovCisgICAgcmV0dXJuIGlkOworfQorCisvKioKKyAqIEBpbmdyb3VwIGlkcworICogQGJyaWVmIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBpZGVudGlmaWVyLgorICogVGhpcyBlc3RhYmxpc2hlcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaWZldGltZSBvZiBhbiBpbnN0YW5jZSBvZgorICogdGhlIGdpdmVuIElEIGluIHRoZSB0cmFjZS4gT25jZSB0aGlzIGxpZmV0aW1lIHN0YXJ0cywgdGhlIElECisgKiBjYW4gYmUgdXNlZCB0byB0YWcgbmFtZWQgZW50aXR5IGluc3RhbmNlcyBpbiBjYWxscyBzdWNoIGFzCisgKiBfX2l0dF90YXNrX2JlZ2luLCBhbmQgdG8gc3BlY2lmeSByZWxhdGlvbnNoaXBzIGFtb25nCisgKiBpZGVudGlmaWVkIG5hbWVkIGVudGl0eSBpbnN0YW5jZXMsIHVzaW5nIHRoZSBccmVmIHJlbGF0aW9ucyBBUElzLgorICogSW5zdGFuY2UgSURzIGFyZSBub3QgZG9tYWluIHNwZWNpZmljIQorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBjb250cm9sbGluZyB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgY2FsbC4KKyAqIEBwYXJhbVtpbl0gaWQgVGhlIElEIHRvIGNyZWF0ZS4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfaWRfY3JlYXRlKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGlkX2NyZWF0ZSwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCkpCisjZGVmaW5lIF9faXR0X2lkX2NyZWF0ZShkLHgpIElUVE5PVElGWV9WT0lEX0QxKGlkX2NyZWF0ZSxkLHgpCisjZGVmaW5lIF9faXR0X2lkX2NyZWF0ZV9wdHIgIElUVE5PVElGWV9OQU1FKGlkX2NyZWF0ZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2lkX2NyZWF0ZShkb21haW4saWQpCisjZGVmaW5lIF9faXR0X2lkX2NyZWF0ZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2lkX2NyZWF0ZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBpbmdyb3VwIGlkcworICogQGJyaWVmIERlc3Ryb3kgYW4gaW5zdGFuY2Ugb2YgaWRlbnRpZmllci4KKyAqIFRoaXMgZW5kcyB0aGUgbGlmZXRpbWUgb2YgdGhlIGN1cnJlbnQgaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIElEIHZhbHVlIGluIHRoZSB0cmFjZS4KKyAqIEFueSByZWxhdGlvbnNoaXBzIHRoYXQgYXJlIGVzdGFibGlzaGVkIGFmdGVyIHRoaXMgbGlmZXRpbWUgZW5kcyBhcmUgaW52YWxpZC4KKyAqIFRoaXMgY2FsbCBtdXN0IGJlIHBlcmZvcm1lZCBiZWZvcmUgdGhlIGdpdmVuIElEIHZhbHVlIGNhbiBiZSByZXVzZWQgZm9yIGEgZGlmZmVyZW50IAorICogbmFtZWQgZW50aXR5IGluc3RhbmNlLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBjb250cm9sbGluZyB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgY2FsbC4KKyAqIEBwYXJhbVtpbl0gaWQgVGhlIElEIHRvIGRlc3Ryb3kuCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2lkX2Rlc3Ryb3koY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaWRfZGVzdHJveSwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCkpCisjZGVmaW5lIF9faXR0X2lkX2Rlc3Ryb3koZCx4KSBJVFROT1RJRllfVk9JRF9EMShpZF9kZXN0cm95LGQseCkKKyNkZWZpbmUgX19pdHRfaWRfZGVzdHJveV9wdHIgIElUVE5PVElGWV9OQU1FKGlkX2Rlc3Ryb3kpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9pZF9kZXN0cm95KGRvbWFpbixpZCkKKyNkZWZpbmUgX19pdHRfaWRfZGVzdHJveV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2lkX2Rlc3Ryb3lfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSBpZHMgZ3JvdXAgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgaGFuZGxlc3MgU3RyaW5nIEhhbmRsZXMKKyAqIEBpbmdyb3VwIHB1YmxpYworICogU3RyaW5nIEhhbmRsZXMgZ3JvdXAKKyAqIEB7CisgKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjcHJhZ21hIHBhY2socHVzaCwgOCkKKwordHlwZWRlZiBzdHJ1Y3QgX19faXR0X3N0cmluZ19oYW5kbGUKK3sKKyAgICBjb25zdCBjaGFyKiBzdHJBOyAvKiE8IENvcHkgb2Ygb3JpZ2luYWwgc3RyaW5nIGluIEFTQ0lJLiAqLworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyAgICBjb25zdCB3Y2hhcl90KiBzdHJXOyAvKiE8IENvcHkgb2Ygb3JpZ2luYWwgc3RyaW5nIGluIFVOSUNPREUuICovCisjZWxzZSAgLyogVU5JQ09ERSB8fCBfVU5JQ09ERSAqLworICAgIHZvaWQqIHN0clc7CisjZW5kaWYgLyogVU5JQ09ERSB8fCBfVU5JQ09ERSAqLworICAgIGludCAgIGV4dHJhMTsgLyohPCBSZXNlcnZlZC4gTXVzdCBiZSB6ZXJvICAgKi8KKyAgICB2b2lkKiBleHRyYTI7IC8qITwgUmVzZXJ2ZWQuIE11c3QgYmUgemVybyAgICovCisgICAgc3RydWN0IF9fX2l0dF9zdHJpbmdfaGFuZGxlKiBuZXh0OworfSBfX2l0dF9zdHJpbmdfaGFuZGxlOworCisjcHJhZ21hIHBhY2socG9wKQorLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGluZ3JvdXAgaGFuZGxlcworICogQGJyaWVmIENyZWF0ZSBhIHN0cmluZyBoYW5kbGUuCisgKiBDcmVhdGUgYW5kIHJldHVybiBoYW5kbGUgdmFsdWUgdGhhdCBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGEgc3RyaW5nLgorICogQ29uc2VjdXRpdmUgY2FsbHMgdG8gX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGUgd2l0aCB0aGUgc2FtZSBuYW1lCisgKiByZXR1cm4gdGhlIHNhbWUgdmFsdWUuIEJlY2F1c2UgdGhlIHNldCBvZiBzdHJpbmcgaGFuZGxlcyBpcyBleHBlY3RlZCB0byByZW1haW4KKyAqIHN0YXRpYyBkdXJpbmcgdGhlIGFwcGxpY2F0aW9uJ3MgZXhlY3V0aW9uIHRpbWUsIHRoZXJlIGlzIG5vIG1lY2hhbmlzbSB0byBkZXN0cm95IGEgc3RyaW5nIGhhbmRsZS4KKyAqIEFueSBzdHJpbmcgaGFuZGxlIGNhbiBiZSBhY2Nlc3NlZCBieSBhbnkgdGhyZWFkIGluIHRoZSBwcm9jZXNzLCByZWdhcmRsZXNzIG9mIHdoaWNoIHRocmVhZCBjcmVhdGVkCisgKiB0aGUgc3RyaW5nIGhhbmRsZS4gVGhpcyBjYWxsIGlzIHRocmVhZC1zYWZlLgorICogQHBhcmFtW2luXSBuYW1lIFRoZSBpbnB1dCBzdHJpbmcKKyAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorX19pdHRfc3RyaW5nX2hhbmRsZSogSVRUQVBJIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlQShjb25zdCBjaGFyICAgICpuYW1lKTsKK19faXR0X3N0cmluZ19oYW5kbGUqIElUVEFQSSBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZVcoY29uc3Qgd2NoYXJfdCAqbmFtZSk7CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorIyAgZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlICAgICBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZVcKKyMgIGRlZmluZSBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZV9wdHIgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGVXX3B0cgorI2Vsc2UgLyogVU5JQ09ERSAqLworIyAgZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlICAgICBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZUEKKyMgIGRlZmluZSBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZV9wdHIgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGVBX3B0cgorI2VuZGlmIC8qIFVOSUNPREUgKi8KKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK19faXR0X3N0cmluZ19oYW5kbGUqIElUVEFQSSBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZShjb25zdCBjaGFyICpuYW1lKTsKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9zdHJpbmdfaGFuZGxlKiwgc3RyaW5nX2hhbmRsZV9jcmVhdGVBLCAoY29uc3QgY2hhciAgICAqbmFtZSkpCitJVFRfU1RVQihJVFRBUEksIF9faXR0X3N0cmluZ19oYW5kbGUqLCBzdHJpbmdfaGFuZGxlX2NyZWF0ZVcsIChjb25zdCB3Y2hhcl90ICpuYW1lKSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfc3RyaW5nX2hhbmRsZSosIHN0cmluZ19oYW5kbGVfY3JlYXRlLCAgKGNvbnN0IGNoYXIgICAgKm5hbWUpKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZUEgICAgIElUVE5PVElGWV9EQVRBKHN0cmluZ19oYW5kbGVfY3JlYXRlQSkKKyNkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGVBX3B0ciBJVFROT1RJRllfTkFNRShzdHJpbmdfaGFuZGxlX2NyZWF0ZUEpCisjZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlVyAgICAgSVRUTk9USUZZX0RBVEEoc3RyaW5nX2hhbmRsZV9jcmVhdGVXKQorI2RlZmluZSBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZVdfcHRyIElUVE5PVElGWV9OQU1FKHN0cmluZ19oYW5kbGVfY3JlYXRlVykKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZSAgICAgSVRUTk9USUZZX0RBVEEoc3RyaW5nX2hhbmRsZV9jcmVhdGUpCisjZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlX3B0ciBJVFROT1RJRllfTkFNRShzdHJpbmdfaGFuZGxlX2NyZWF0ZSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlQShuYW1lKSAoX19pdHRfc3RyaW5nX2hhbmRsZSopMAorI2RlZmluZSBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGVXKG5hbWUpIChfX2l0dF9zdHJpbmdfaGFuZGxlKikwCisjZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlKG5hbWUpICAoX19pdHRfc3RyaW5nX2hhbmRsZSopMAorI2RlZmluZSBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZV9wdHIgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlQV9wdHIgMAorI2RlZmluZSBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZV9wdHIgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSBoYW5kbGVzIGdyb3VwICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgX19pdHRfdGltZXN0YW1wOworLyoqIEBlbmRjb25kICovCisKK3N0YXRpYyBjb25zdCBfX2l0dF90aW1lc3RhbXAgX19pdHRfdGltZXN0YW1wX25vbmUgPSAoX19pdHRfdGltZXN0YW1wKS0xTEw7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZ3BhX2RvY3VtZW50YXRpb24gKi8KKworLyoqCisgKiBAaW5ncm91cCB0aW1lc3RhbXBzCisgKiBAYnJpZWYgUmV0dXJuIHRpbWVzdGFtcCBjb3JyZXNwb25kaW5nIHRvIHRoZSBjdXJyZW50IG1vbWVudC4KKyAqIFRoaXMgcmV0dXJucyB0aGUgdGltZXN0YW1wIGluIHRoZSBmb3JtYXQgdGhhdCBpcyB0aGUgbW9zdCByZWxldmFudCBmb3IgdGhlIGN1cnJlbnQKKyAqIGhvc3Qgb3IgcGxhdGZvcm0gKFJEVFNDLCBRUEMsIGFuZCBvdGhlcnMpLiBZb3UgY2FuIHVzZSB0aGUgIjwiIG9wZXJhdG9yIHRvCisgKiBjb21wYXJlIF9faXR0X3RpbWVzdGFtcCB2YWx1ZXMuCisgKi8KK19faXR0X3RpbWVzdGFtcCBJVFRBUEkgX19pdHRfZ2V0X3RpbWVzdGFtcCh2b2lkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF90aW1lc3RhbXAsIGdldF90aW1lc3RhbXAsICh2b2lkKSkKKyNkZWZpbmUgX19pdHRfZ2V0X3RpbWVzdGFtcCAgICAgIElUVE5PVElGWV9EQVRBKGdldF90aW1lc3RhbXApCisjZGVmaW5lIF9faXR0X2dldF90aW1lc3RhbXBfcHRyICBJVFROT1RJRllfTkFNRShnZXRfdGltZXN0YW1wKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfZ2V0X3RpbWVzdGFtcCgpCisjZGVmaW5lIF9faXR0X2dldF90aW1lc3RhbXBfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9nZXRfdGltZXN0YW1wX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gdGltZXN0YW1wcyAqLworLyoqIEBlbmRjb25kICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZ3BhX2RvY3VtZW50YXRpb24gKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgcmVnaW9ucyBSZWdpb25zCisgKiBAaW5ncm91cCBwdWJsaWMKKyAqIFJlZ2lvbnMgZ3JvdXAKKyAqIEB7CisgKi8KKy8qKgorICogQGluZ3JvdXAgcmVnaW9ucworICogQGJyaWVmIEJlZ2luIG9mIHJlZ2lvbiBpbnN0YW5jZS4KKyAqIFN1Y2Nlc3NpdmUgY2FsbHMgdG8gX19pdHRfcmVnaW9uX2JlZ2luIHdpdGggdGhlIHNhbWUgSUQgYXJlIGlnbm9yZWQKKyAqIHVudGlsIGEgY2FsbCB0byBfX2l0dF9yZWdpb25fZW5kIHdpdGggdGhlIHNhbWUgSUQKKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gZm9yIHRoaXMgcmVnaW9uIGluc3RhbmNlCisgKiBAcGFyYW1baW5dIGlkIFRoZSBpbnN0YW5jZSBJRCBmb3IgdGhpcyByZWdpb24gaW5zdGFuY2UuIE11c3Qgbm90IGJlIF9faXR0X251bGwKKyAqIEBwYXJhbVtpbl0gcGFyZW50aWQgVGhlIGluc3RhbmNlIElEIGZvciB0aGUgcGFyZW50IG9mIHRoaXMgcmVnaW9uIGluc3RhbmNlLCBvciBfX2l0dF9udWxsCisgKiBAcGFyYW1baW5dIG5hbWUgVGhlIG5hbWUgb2YgdGhpcyByZWdpb24KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfcmVnaW9uX2JlZ2luKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfaWQgcGFyZW50aWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUpOworCisvKioKKyAqIEBpbmdyb3VwIHJlZ2lvbnMKKyAqIEBicmllZiBFbmQgb2YgcmVnaW9uIGluc3RhbmNlLgorICogVGhlIGZpcnN0IGNhbGwgdG8gX19pdHRfcmVnaW9uX2VuZCB3aXRoIGEgZ2l2ZW4gSUQgZW5kcyB0aGUKKyAqIHJlZ2lvbi4gU3VjY2Vzc2l2ZSBjYWxscyB3aXRoIHRoZSBzYW1lIElEIGFyZSBpZ25vcmVkLCBhcyBhcmUKKyAqIGNhbGxzIHRoYXQgZG8gbm90IGhhdmUgYSBtYXRjaGluZyBfX2l0dF9yZWdpb25fYmVnaW4gY2FsbC4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gZm9yIHRoaXMgcmVnaW9uIGluc3RhbmNlCisgKiBAcGFyYW1baW5dIGlkIFRoZSBpbnN0YW5jZSBJRCBmb3IgdGhpcyByZWdpb24gaW5zdGFuY2UKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfcmVnaW9uX2VuZChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCByZWdpb25fYmVnaW4sIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X2lkIHBhcmVudGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHJlZ2lvbl9lbmQsICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCkpCisjZGVmaW5lIF9faXR0X3JlZ2lvbl9iZWdpbihkLHgseSx6KSBJVFROT1RJRllfVk9JRF9EMyhyZWdpb25fYmVnaW4sZCx4LHkseikKKyNkZWZpbmUgX19pdHRfcmVnaW9uX2JlZ2luX3B0ciAgICAgIElUVE5PVElGWV9OQU1FKHJlZ2lvbl9iZWdpbikKKyNkZWZpbmUgX19pdHRfcmVnaW9uX2VuZChkLHgpICAgICAgIElUVE5PVElGWV9WT0lEX0QxKHJlZ2lvbl9lbmQsZCx4KQorI2RlZmluZSBfX2l0dF9yZWdpb25fZW5kX3B0ciAgICAgICAgSVRUTk9USUZZX05BTUUocmVnaW9uX2VuZCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3JlZ2lvbl9iZWdpbihkLHgseSx6KQorI2RlZmluZSBfX2l0dF9yZWdpb25fYmVnaW5fcHRyIDAKKyNkZWZpbmUgX19pdHRfcmVnaW9uX2VuZChkLHgpCisjZGVmaW5lIF9faXR0X3JlZ2lvbl9lbmRfcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3JlZ2lvbl9iZWdpbl9wdHIgMAorI2RlZmluZSBfX2l0dF9yZWdpb25fZW5kX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSByZWdpb25zIGdyb3VwICovCisKKy8qKgorICogQGRlZmdyb3VwIGZyYW1lcyBGcmFtZXMKKyAqIEBpbmdyb3VwIHB1YmxpYworICogRnJhbWVzIGFyZSBzaW1pbGFyIHRvIHJlZ2lvbnMsIGJ1dCBhcmUgaW50ZW5kZWQgdG8gYmUgZWFzaWVyIHRvIHVzZSBhbmQgdG8gaW1wbGVtZW50LgorICogSW4gcGFydGljdWxhcjoKKyAqIC0gRnJhbWVzIGFsd2F5cyByZXByZXNlbnQgcGVyaW9kcyBvZiBlbGFwc2VkIHRpbWUKKyAqIC0gQnkgZGVmYXVsdCwgZnJhbWVzIGhhdmUgbm8gbmVzdGluZyByZWxhdGlvbnNoaXBzCisgKiBAeworICovCisKKy8qKgorICogQGluZ3JvdXAgZnJhbWVzCisgKiBAYnJpZWYgQmVnaW4gYSBmcmFtZSBpbnN0YW5jZS4KKyAqIFN1Y2Nlc3NpdmUgY2FsbHMgdG8gX19pdHRfZnJhbWVfYmVnaW4gd2l0aCB0aGUKKyAqIHNhbWUgSUQgYXJlIGlnbm9yZWQgdW50aWwgYSBjYWxsIHRvIF9faXR0X2ZyYW1lX2VuZCB3aXRoIHRoZSBzYW1lIElELgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBmb3IgdGhpcyBmcmFtZSBpbnN0YW5jZQorICogQHBhcmFtW2luXSBpZCBUaGUgaW5zdGFuY2UgSUQgZm9yIHRoaXMgZnJhbWUgaW5zdGFuY2Ugb3IgTlVMTAorICovCit2b2lkIElUVEFQSSBfX2l0dF9mcmFtZV9iZWdpbl92Myhjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgKmlkKTsKKworLyoqCisgKiBAaW5ncm91cCBmcmFtZXMKKyAqIEBicmllZiBFbmQgYSBmcmFtZSBpbnN0YW5jZS4KKyAqIFRoZSBmaXJzdCBjYWxsIHRvIF9faXR0X2ZyYW1lX2VuZCB3aXRoIGEgZ2l2ZW4gSUQKKyAqIGVuZHMgdGhlIGZyYW1lLiBTdWNjZXNzaXZlIGNhbGxzIHdpdGggdGhlIHNhbWUgSUQgYXJlIGlnbm9yZWQsIGFzIGFyZQorICogY2FsbHMgdGhhdCBkbyBub3QgaGF2ZSBhIG1hdGNoaW5nIF9faXR0X2ZyYW1lX2JlZ2luIGNhbGwuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGZvciB0aGlzIGZyYW1lIGluc3RhbmNlCisgKiBAcGFyYW1baW5dIGlkIFRoZSBpbnN0YW5jZSBJRCBmb3IgdGhpcyBmcmFtZSBpbnN0YW5jZSBvciBOVUxMIGZvciBjdXJyZW50CisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2ZyYW1lX2VuZF92Myhjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgKmlkKTsKKworLyoqCisgKiBAaW5ncm91cCBmcmFtZXMKKyAqIEBicmllZiBTdWJtaXRzIGEgZnJhbWUgaW5zdGFuY2UuCisgKiBTdWNjZXNzaXZlIGNhbGxzIHRvIF9faXR0X2ZyYW1lX2JlZ2luIG9yIF9faXR0X2ZyYW1lX3N1Ym1pdCB3aXRoIHRoZQorICogc2FtZSBJRCBhcmUgaWdub3JlZCB1bnRpbCBhIGNhbGwgdG8gX19pdHRfZnJhbWVfZW5kIG9yIF9faXR0X2ZyYW1lX3N1Ym1pdAorICogd2l0aCB0aGUgc2FtZSBJRC4KKyAqIFBhc3Npbmcgc3BlY2lhbCBfX2l0dF90aW1lc3RhbXBfbm9uZSB2YWx1ZSBhcyAiZW5kIiBhcmd1bWVudCBtZWFucworICogdGFrZSB0aGUgY3VycmVudCB0aW1lc3RhbXAgYXMgdGhlIGVuZCB0aW1lc3RhbXAuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGZvciB0aGlzIGZyYW1lIGluc3RhbmNlCisgKiBAcGFyYW1baW5dIGlkIFRoZSBpbnN0YW5jZSBJRCBmb3IgdGhpcyBmcmFtZSBpbnN0YW5jZSBvciBOVUxMCisgKiBAcGFyYW1baW5dIGJlZ2luIFRpbWVzdGFtcCBvZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmcmFtZQorICogQHBhcmFtW2luXSBlbmQgVGltZXN0YW1wIG9mIHRoZSBlbmQgb2YgdGhlIGZyYW1lCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2ZyYW1lX3N1Ym1pdF92Myhjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgKmlkLAorICAgIF9faXR0X3RpbWVzdGFtcCBiZWdpbiwgX19pdHRfdGltZXN0YW1wIGVuZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGZyYW1lX2JlZ2luX3YzLCAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCAqaWQpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgZnJhbWVfZW5kX3YzLCAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkICppZCkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmcmFtZV9zdWJtaXRfdjMsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgKmlkLCBfX2l0dF90aW1lc3RhbXAgYmVnaW4sIF9faXR0X3RpbWVzdGFtcCBlbmQpKQorI2RlZmluZSBfX2l0dF9mcmFtZV9iZWdpbl92MyhkLHgpICAgICAgSVRUTk9USUZZX1ZPSURfRDEoZnJhbWVfYmVnaW5fdjMsZCx4KQorI2RlZmluZSBfX2l0dF9mcmFtZV9iZWdpbl92M19wdHIgICAgICAgSVRUTk9USUZZX05BTUUoZnJhbWVfYmVnaW5fdjMpCisjZGVmaW5lIF9faXR0X2ZyYW1lX2VuZF92MyhkLHgpICAgICAgICBJVFROT1RJRllfVk9JRF9EMShmcmFtZV9lbmRfdjMsZCx4KQorI2RlZmluZSBfX2l0dF9mcmFtZV9lbmRfdjNfcHRyICAgICAgICAgSVRUTk9USUZZX05BTUUoZnJhbWVfZW5kX3YzKQorI2RlZmluZSBfX2l0dF9mcmFtZV9zdWJtaXRfdjMoZCx4LGIsZSkgSVRUTk9USUZZX1ZPSURfRDMoZnJhbWVfc3VibWl0X3YzLGQseCxiLGUpCisjZGVmaW5lIF9faXR0X2ZyYW1lX3N1Ym1pdF92M19wdHIgICAgICBJVFROT1RJRllfTkFNRShmcmFtZV9zdWJtaXRfdjMpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9mcmFtZV9iZWdpbl92Myhkb21haW4saWQpCisjZGVmaW5lIF9faXR0X2ZyYW1lX2JlZ2luX3YzX3B0ciAwCisjZGVmaW5lIF9faXR0X2ZyYW1lX2VuZF92Myhkb21haW4saWQpCisjZGVmaW5lIF9faXR0X2ZyYW1lX2VuZF92M19wdHIgICAwCisjZGVmaW5lIF9faXR0X2ZyYW1lX3N1Ym1pdF92Myhkb21haW4saWQsYmVnaW4sZW5kKQorI2RlZmluZSBfX2l0dF9mcmFtZV9zdWJtaXRfdjNfcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2ZyYW1lX2JlZ2luX3YzX3B0ciAwCisjZGVmaW5lIF9faXR0X2ZyYW1lX2VuZF92M19wdHIgICAwCisjZGVmaW5lIF9faXR0X2ZyYW1lX3N1Ym1pdF92M19wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gZnJhbWVzIGdyb3VwICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgdGFza2dyb3VwIFRhc2sgR3JvdXAKKyAqIEBpbmdyb3VwIHB1YmxpYworICogVGFzayBHcm91cAorICogQHsKKyAqLworLyoqCisgKiBAaW5ncm91cCB0YXNrX2dyb3VwcworICogQGJyaWVmIERlbm90ZXMgYSB0YXNrX2dyb3VwIGluc3RhbmNlLgorICogU3VjY2Vzc2l2ZSBjYWxscyB0byBfX2l0dF90YXNrX2dyb3VwIHdpdGggdGhlIHNhbWUgSUQgYXJlIGlnbm9yZWQuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGZvciB0aGlzIHRhc2tfZ3JvdXAgaW5zdGFuY2UKKyAqIEBwYXJhbVtpbl0gaWQgVGhlIGluc3RhbmNlIElEIGZvciB0aGlzIHRhc2tfZ3JvdXAgaW5zdGFuY2UuIE11c3Qgbm90IGJlIF9faXR0X251bGwuCisgKiBAcGFyYW1baW5dIHBhcmVudGlkIFRoZSBpbnN0YW5jZSBJRCBmb3IgdGhlIHBhcmVudCBvZiB0aGlzIHRhc2tfZ3JvdXAgaW5zdGFuY2UsIG9yIF9faXR0X251bGwuCisgKiBAcGFyYW1baW5dIG5hbWUgVGhlIG5hbWUgb2YgdGhpcyB0YXNrX2dyb3VwCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3Rhc2tfZ3JvdXAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9pZCBwYXJlbnRpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfZ3JvdXAsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X2lkIHBhcmVudGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lKSkKKyNkZWZpbmUgX19pdHRfdGFza19ncm91cChkLHgseSx6KSBJVFROT1RJRllfVk9JRF9EMyh0YXNrX2dyb3VwLGQseCx5LHopCisjZGVmaW5lIF9faXR0X3Rhc2tfZ3JvdXBfcHRyICAgICAgSVRUTk9USUZZX05BTUUodGFza19ncm91cCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3Rhc2tfZ3JvdXAoZCx4LHkseikKKyNkZWZpbmUgX19pdHRfdGFza19ncm91cF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3Rhc2tfZ3JvdXBfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSB0YXNrZ3JvdXAgZ3JvdXAgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgdGFza3MgVGFza3MKKyAqIEBpbmdyb3VwIHB1YmxpYworICogQSB0YXNrIGluc3RhbmNlIHJlcHJlc2VudHMgYSBwaWVjZSBvZiB3b3JrIHBlcmZvcm1lZCBieSBhIHBhcnRpY3VsYXIKKyAqIHRocmVhZCBmb3IgYSBwZXJpb2Qgb2YgdGltZS4gQSBjYWxsIHRvIF9faXR0X3Rhc2tfYmVnaW4gY3JlYXRlcyBhCisgKiB0YXNrIGluc3RhbmNlLiBUaGlzIGJlY29tZXMgdGhlIGN1cnJlbnQgaW5zdGFuY2UgZm9yIHRoYXQgdGFzayBvbiB0aGF0CisgKiB0aHJlYWQuIEEgZm9sbG93aW5nIGNhbGwgdG8gX19pdHRfdGFza19lbmQgb24gdGhlIHNhbWUgdGhyZWFkIGVuZHMgdGhlCisgKiBpbnN0YW5jZS4gVGhlcmUgbWF5IGJlIG11bHRpcGxlIHNpbXVsdGFuZW91cyBpbnN0YW5jZXMgb2YgdGFza3Mgd2l0aCB0aGUKKyAqIHNhbWUgbmFtZSBvbiBkaWZmZXJlbnQgdGhyZWFkcy4gSWYgYW4gSUQgaXMgc3BlY2lmaWVkLCB0aGUgdGFzayBpbnN0YW5jZQorICogcmVjZWl2ZXMgdGhhdCBJRC4gTmVzdGVkIHRhc2tzIGFyZSBhbGxvd2VkLgorICoKKyAqIE5vdGU6IFRoZSB0YXNrIGlzIGRlZmluZWQgYnkgdGhlIGJyYWNrZXRpbmcgb2YgX19pdHRfdGFza19iZWdpbiBhbmQKKyAqIF9faXR0X3Rhc2tfZW5kIG9uIHRoZSBzYW1lIHRocmVhZC4gSWYgc29tZSBzY2hlZHVsaW5nIG1lY2hhbmlzbSBjYXVzZXMKKyAqIHRhc2sgc3dpdGNoaW5nICh0aGUgdGhyZWFkIGV4ZWN1dGVzIGEgZGlmZmVyZW50IHVzZXIgdGFzaykgb3IgdGFzaworICogc3dpdGNoaW5nICh0aGUgdXNlciB0YXNrIHN3aXRjaGVzIHRvIGEgZGlmZmVyZW50IHRocmVhZCkgdGhlbiB0aGlzIGJyZWFrcworICogdGhlIG5vdGlvbiBvZiAgY3VycmVudCBpbnN0YW5jZS4gQWRkaXRpb25hbCBBUEkgY2FsbHMgYXJlIHJlcXVpcmVkIHRvCisgKiBkZWFsIHdpdGggdGhhdCBwb3NzaWJpbGl0eS4KKyAqIEB7CisgKi8KKworLyoqCisgKiBAaW5ncm91cCB0YXNrcworICogQGJyaWVmIEJlZ2luIGEgdGFzayBpbnN0YW5jZS4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gZm9yIHRoaXMgdGFzaworICogQHBhcmFtW2luXSB0YXNraWQgVGhlIGluc3RhbmNlIElEIGZvciB0aGlzIHRhc2sgaW5zdGFuY2UsIG9yIF9faXR0X251bGwKKyAqIEBwYXJhbVtpbl0gcGFyZW50aWQgVGhlIHBhcmVudCBpbnN0YW5jZSB0byB3aGljaCB0aGlzIHRhc2sgaW5zdGFuY2UgYmVsb25ncywgb3IgX19pdHRfbnVsbAorICogQHBhcmFtW2luXSBuYW1lIFRoZSBuYW1lIG9mIHRoaXMgdGFzaworICovCit2b2lkIElUVEFQSSBfX2l0dF90YXNrX2JlZ2luKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCB0YXNraWQsIF9faXR0X2lkIHBhcmVudGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lKTsKKworLyoqCisgKiBAaW5ncm91cCB0YXNrcworICogQGJyaWVmIEJlZ2luIGEgdGFzayBpbnN0YW5jZS4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gZm9yIHRoaXMgdGFzaworICogQHBhcmFtW2luXSB0YXNraWQgVGhlIGlkZW50aWZpZXIgZm9yIHRoaXMgdGFzayBpbnN0YW5jZSAobWF5IGJlIDApCisgKiBAcGFyYW1baW5dIHBhcmVudGlkIFRoZSBwYXJlbnQgb2YgdGhpcyB0YXNrIChtYXkgYmUgMCkKKyAqIEBwYXJhbVtpbl0gZm4gVGhlIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHlvdSBhcmUgdHJhY2luZworICovCit2b2lkIElUVEFQSSBfX2l0dF90YXNrX2JlZ2luX2ZuKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCB0YXNraWQsIF9faXR0X2lkIHBhcmVudGlkLCB2b2lkKiBmbik7CisKKy8qKgorICogQGluZ3JvdXAgdGFza3MKKyAqIEBicmllZiBFbmQgdGhlIGN1cnJlbnQgdGFzayBpbnN0YW5jZS4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gZm9yIHRoaXMgdGFzaworICovCit2b2lkIElUVEFQSSBfX2l0dF90YXNrX2VuZChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbik7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfYmVnaW4sICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X2lkIHBhcmVudGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfYmVnaW5fZm4sIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X2lkIHBhcmVudGlkLCB2b2lkKiBmbikpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2VuZCwgICAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4pKQorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luKGQseCx5LHopICAgIElUVE5PVElGWV9WT0lEX0QzKHRhc2tfYmVnaW4sZCx4LHkseikKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9wdHIgICAgICAgICBJVFROT1RJRllfTkFNRSh0YXNrX2JlZ2luKQorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX2ZuKGQseCx5LHopIElUVE5PVElGWV9WT0lEX0QzKHRhc2tfYmVnaW5fZm4sZCx4LHkseikKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9mbl9wdHIgICAgICBJVFROT1RJRllfTkFNRSh0YXNrX2JlZ2luX2ZuKQorI2RlZmluZSBfX2l0dF90YXNrX2VuZChkKSAgICAgICAgICAgIElUVE5PVElGWV9WT0lEX0QwKHRhc2tfZW5kLGQpCisjZGVmaW5lIF9faXR0X3Rhc2tfZW5kX3B0ciAgICAgICAgICAgSVRUTk9USUZZX05BTUUodGFza19lbmQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luKGRvbWFpbixpZCxwYXJlbnRpZCxuYW1lKQorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX3B0ciAgICAwCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fZm4oZG9tYWluLGlkLHBhcmVudGlkLGZuKQorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX2ZuX3B0ciAwCisjZGVmaW5lIF9faXR0X3Rhc2tfZW5kKGRvbWFpbikKKyNkZWZpbmUgX19pdHRfdGFza19lbmRfcHRyICAgICAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fcHRyICAgIDAKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9mbl9wdHIgMAorI2RlZmluZSBfX2l0dF90YXNrX2VuZF9wdHIgICAgICAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gdGFza3MgZ3JvdXAgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgY291bnRlcnMgQ291bnRlcnMKKyAqIEBpbmdyb3VwIHB1YmxpYworICogQ291bnRlcnMgYXJlIHVzZXItZGVmaW5lZCBvYmplY3RzIHdpdGggYSBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcKKyAqIHZhbHVlLiBDb3VudGVyIHZhbHVlcyBhcmUgNjQtYml0IHVuc2lnbmVkIGludGVnZXJzLiBDb3VudGVyIHZhbHVlcworICogYXJlIHRyYWNrZWQgcGVyLXRocmVhZC4gQ291bnRlcnMgaGF2ZSBuYW1lcyB0aGF0IGNhbiBiZSBkaXNwbGF5ZWQgaW4KKyAqIHRoZSB0b29scy4KKyAqIEB7CisgKi8KKworLyoqCisgKiBAaW5ncm91cCBjb3VudGVycworICogQGJyaWVmIEluY3JlbWVudCBhIGNvdW50ZXIgYnkgb25lLgorICogVGhlIGZpcnN0IGNhbGwgd2l0aCBhIGdpdmVuIG5hbWUgY3JlYXRlcyBhIGNvdW50ZXIgYnkgdGhhdCBuYW1lIGFuZCBzZXRzIGl0cworICogdmFsdWUgdG8gemVybyBvbiBldmVyeSB0aHJlYWQuIFN1Y2Nlc3NpdmUgY2FsbHMgaW5jcmVtZW50IHRoZSBjb3VudGVyIHZhbHVlCisgKiBvbiB0aGUgdGhyZWFkIG9uIHdoaWNoIHRoZSBjYWxsIGlzIGlzc3VlZC4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gY29udHJvbGxpbmcgdGhlIGNhbGwuIENvdW50ZXIgbmFtZXMgYXJlIG5vdCBkb21haW4gc3BlY2lmaWMuCisgKiAgICAgICAgICAgIFRoZSBkb21haW4gYXJndW1lbnQgaXMgdXNlZCBvbmx5IHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBBUEkgY2FsbHMuCisgKiBAcGFyYW1baW5dIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGNvdW50ZXIKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfY291bnRlcl9pbmNfdjMoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUpOworCisvKioKKyAqIEBpbmdyb3VwIGNvdW50ZXJzCisgKiBAYnJpZWYgSW5jcmVtZW50IGEgY291bnRlciBieSB0aGUgdmFsdWUgc3BlY2lmaWVkIGluIGRlbHRhLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBjb250cm9sbGluZyB0aGUgY2FsbC4gQ291bnRlciBuYW1lcyBhcmUgbm90IGRvbWFpbiBzcGVjaWZpYy4KKyAqICAgICAgICAgICAgVGhlIGRvbWFpbiBhcmd1bWVudCBpcyB1c2VkIG9ubHkgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIEFQSSBjYWxscy4KKyAqIEBwYXJhbVtpbl0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgY291bnRlcgorICogQHBhcmFtW2luXSBkZWx0YSBUaGUgYW1vdW50IGJ5IHdoaWNoIHRvIGluY3JlbWVudCB0aGUgY291bnRlcgorICovCit2b2lkIElUVEFQSSBfX2l0dF9jb3VudGVyX2luY19kZWx0YV92Myhjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSwgdW5zaWduZWQgbG9uZyBsb25nIGRlbHRhKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgY291bnRlcl9pbmNfdjMsICAgICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBjb3VudGVyX2luY19kZWx0YV92MywgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lLCB1bnNpZ25lZCBsb25nIGxvbmcgZGVsdGEpKQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2luY192MyhkLHgpICAgICAgICAgSVRUTk9USUZZX1ZPSURfRDEoY291bnRlcl9pbmNfdjMsZCx4KQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2luY192M19wdHIgICAgICAgICAgSVRUTk9USUZZX05BTUUoY291bnRlcl9pbmNfdjMpCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfaW5jX2RlbHRhX3YzKGQseCx5KSBJVFROT1RJRllfVk9JRF9EMihjb3VudGVyX2luY19kZWx0YV92MyxkLHgseSkKKyNkZWZpbmUgX19pdHRfY291bnRlcl9pbmNfZGVsdGFfdjNfcHRyICAgIElUVE5PVElGWV9OQU1FKGNvdW50ZXJfaW5jX2RlbHRhX3YzKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfY291bnRlcl9pbmNfdjMoZG9tYWluLG5hbWUpCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfaW5jX3YzX3B0ciAgICAgICAwCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfaW5jX2RlbHRhX3YzKGRvbWFpbixuYW1lLGRlbHRhKQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2luY19kZWx0YV92M19wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfaW5jX3YzX3B0ciAgICAgICAwCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfaW5jX2RlbHRhX3YzX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gY291bnRlcnMgZ3JvdXAgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgbWFya2VycyBNYXJrZXJzCisgKiBNYXJrZXJzIHJlcHJlc2VudCBhIHNpbmdsZSBkaXNjcmVldCBldmVudCBpbiB0aW1lLiBNYXJrZXJzIGhhdmUgYSBzY29wZSwKKyAqIGRlc2NyaWJlZCBieSBhbiBlbnVtZXJhdGVkIHR5cGUgX19pdHRfc2NvcGUuIE1hcmtlcnMgYXJlIGNyZWF0ZWQgYnkKKyAqIHRoZSBBUEkgY2FsbCBfX2l0dF9tYXJrZXIuIEEgbWFya2VyIGluc3RhbmNlIGNhbiBiZSBnaXZlbiBhbiBJRCBmb3IgdXNlIGluCisgKiBhZGRpbmcgbWV0YWRhdGEuCisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmIERlc2NyaWJlcyB0aGUgc2NvcGUgb2YgYW4gZXZlbnQgb2JqZWN0IGluIHRoZSB0cmFjZS4KKyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgX19pdHRfc2NvcGVfdW5rbm93biA9IDAsCisgICAgX19pdHRfc2NvcGVfZ2xvYmFsLAorICAgIF9faXR0X3Njb3BlX3RyYWNrX2dyb3VwLAorICAgIF9faXR0X3Njb3BlX3RyYWNrLAorICAgIF9faXR0X3Njb3BlX3Rhc2ssCisgICAgX19pdHRfc2NvcGVfbWFya2VyCit9IF9faXR0X3Njb3BlOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNkZWZpbmUgX19pdHRfbWFya2VyX3Njb3BlX3Vua25vd24gIF9faXR0X3Njb3BlX3Vua25vd24KKyNkZWZpbmUgX19pdHRfbWFya2VyX3Njb3BlX2dsb2JhbCAgIF9faXR0X3Njb3BlX2dsb2JhbAorI2RlZmluZSBfX2l0dF9tYXJrZXJfc2NvcGVfcHJvY2VzcyAgX19pdHRfc2NvcGVfdHJhY2tfZ3JvdXAKKyNkZWZpbmUgX19pdHRfbWFya2VyX3Njb3BlX3RocmVhZCAgIF9faXR0X3Njb3BlX3RyYWNrCisjZGVmaW5lIF9faXR0X21hcmtlcl9zY29wZV90YXNrICAgICBfX2l0dF9zY29wZV90YXNrCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAaW5ncm91cCBtYXJrZXJzCisgKiBAYnJpZWYgQ3JlYXRlIGEgbWFya2VyIGluc3RhbmNlCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGZvciB0aGlzIG1hcmtlcgorICogQHBhcmFtW2luXSBpZCBUaGUgaW5zdGFuY2UgSUQgZm9yIHRoaXMgbWFya2VyIG9yIF9faXR0X251bGwKKyAqIEBwYXJhbVtpbl0gbmFtZSBUaGUgbmFtZSBmb3IgdGhpcyBtYXJrZXIKKyAqIEBwYXJhbVtpbl0gc2NvcGUgVGhlIHNjb3BlIGZvciB0aGlzIG1hcmtlcgorICovCit2b2lkIElUVEFQSSBfX2l0dF9tYXJrZXIoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lLCBfX2l0dF9zY29wZSBzY29wZSk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1hcmtlciwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSwgX19pdHRfc2NvcGUgc2NvcGUpKQorI2RlZmluZSBfX2l0dF9tYXJrZXIoZCx4LHkseikgSVRUTk9USUZZX1ZPSURfRDMobWFya2VyLGQseCx5LHopCisjZGVmaW5lIF9faXR0X21hcmtlcl9wdHIgICAgICBJVFROT1RJRllfTkFNRShtYXJrZXIpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9tYXJrZXIoZG9tYWluLGlkLG5hbWUsc2NvcGUpCisjZGVmaW5lIF9faXR0X21hcmtlcl9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X21hcmtlcl9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IG1hcmtlcnMgZ3JvdXAgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgbWV0YWRhdGEgTWV0YWRhdGEKKyAqIFRoZSBtZXRhZGF0YSBBUEkgaXMgdXNlZCB0byBhdHRhY2ggZXh0cmEgaW5mb3JtYXRpb24gdG8gbmFtZWQKKyAqIGVudGl0aWVzLiBNZXRhZGF0YSBjYW4gYmUgYXR0YWNoZWQgdG8gYW4gaWRlbnRpZmllZCBuYW1lZCBlbnRpdHkgYnkgSUQsCisgKiBvciB0byB0aGUgY3VycmVudCBlbnRpdHkgKHdoaWNoIGlzIGFsd2F5cyBhIHRhc2spLgorICoKKyAqIENvbmNlcHR1YWxseSBtZXRhZGF0YSBoYXMgYSB0eXBlICh3aGF0IGtpbmQgb2YgbWV0YWRhdGEpLCBhIGtleSAodGhlCisgKiBuYW1lIG9mIHRoZSBtZXRhZGF0YSksIGFuZCBhIHZhbHVlICh0aGUgYWN0dWFsIGRhdGEpLiBUaGUgZW5jb2Rpbmcgb2YKKyAqIHRoZSB2YWx1ZSBkZXBlbmRzIG9uIHRoZSB0eXBlIG9mIHRoZSBtZXRhZGF0YS4KKyAqCisgKiBUaGUgdHlwZSBvZiBtZXRhZGF0YSBpcyBzcGVjaWZpZWQgYnkgYW4gZW51bWVyYXRlZCB0eXBlIF9faXR0X21ldGRhdGFfdHlwZS4KKyAqIEB7CisgKi8KKworLyoqCisgKiBAaW5ncm91cCBwYXJhbWV0ZXJzCisgKiBAYnJpZWYgZGVzY3JpYmVzIHRoZSB0eXBlIG9mIG1ldGFkYXRhCisgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgX19pdHRfbWV0YWRhdGFfdW5rbm93biA9IDAsCisgICAgX19pdHRfbWV0YWRhdGFfdTY0LCAgICAgLyoqPCBVbnNpZ25lZCA2NC1iaXQgaW50ZWdlciAqLworICAgIF9faXR0X21ldGFkYXRhX3M2NCwgICAgIC8qKjwgU2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCisgICAgX19pdHRfbWV0YWRhdGFfdTMyLCAgICAgLyoqPCBVbnNpZ25lZCAzMi1iaXQgaW50ZWdlciAqLworICAgIF9faXR0X21ldGFkYXRhX3MzMiwgICAgIC8qKjwgU2lnbmVkIDMyLWJpdCBpbnRlZ2VyICovCisgICAgX19pdHRfbWV0YWRhdGFfdTE2LCAgICAgLyoqPCBVbnNpZ25lZCAxNi1iaXQgaW50ZWdlciAqLworICAgIF9faXR0X21ldGFkYXRhX3MxNiwgICAgIC8qKjwgU2lnbmVkIDE2LWJpdCBpbnRlZ2VyICovCisgICAgX19pdHRfbWV0YWRhdGFfZmxvYXQsICAgLyoqPCBTaWduZWQgMzItYml0IGZsb2F0aW5nLXBvaW50ICovCisgICAgX19pdHRfbWV0YWRhdGFfZG91YmxlICAgLyoqPCBTSWduZWQgNjQtYml0IGZsb2F0aW5nLXBvaW50ICovCit9IF9faXR0X21ldGFkYXRhX3R5cGU7CisKKy8qKgorICogQGluZ3JvdXAgcGFyYW1ldGVycworICogQGJyaWVmIEFkZCBtZXRhZGF0YSB0byBhbiBpbnN0YW5jZSBvZiBhIG5hbWVkIGVudGl0eS4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gY29udHJvbGxpbmcgdGhlIGNhbGwKKyAqIEBwYXJhbVtpbl0gaWQgVGhlIGlkZW50aWZpZXIgb2YgdGhlIGluc3RhbmNlIHRvIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyB0byBiZSBhZGRlZCwgb3IgX19pdHRfbnVsbCB0byBhZGQgdG8gdGhlIGN1cnJlbnQgdGFzaworICogQHBhcmFtW2luXSBrZXkgVGhlIG5hbWUgb2YgdGhlIG1ldGFkYXRhCisgKiBAcGFyYW1baW5dIHR5cGUgVGhlIHR5cGUgb2YgdGhlIG1ldGFkYXRhCisgKiBAcGFyYW1baW5dIGNvdW50IFRoZSBudW1iZXIgb2YgZWxlbWVudHMgb2YgdGhlIGdpdmVuIHR5cGUuIElmIGNvdW50ID09IDAsIG5vIG1ldGFkYXRhIHdpbGwgYmUgYWRkZWQuCisgKiBAcGFyYW1baW5dIGRhdGEgVGhlIG1ldGFkYXRhIGl0c2VsZgorKi8KK3ZvaWQgSVRUQVBJIF9faXR0X21ldGFkYXRhX2FkZChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgX19pdHRfbWV0YWRhdGFfdHlwZSB0eXBlLCBzaXplX3QgY291bnQsIHZvaWQgKmRhdGEpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtZXRhZGF0YV9hZGQsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgX19pdHRfbWV0YWRhdGFfdHlwZSB0eXBlLCBzaXplX3QgY291bnQsIHZvaWQgKmRhdGEpKQorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9hZGQoZCx4LHkseixhLGIpIElUVE5PVElGWV9WT0lEX0Q1KG1ldGFkYXRhX2FkZCxkLHgseSx6LGEsYikKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfYWRkX3B0ciAgICAgICAgICBJVFROT1RJRllfTkFNRShtZXRhZGF0YV9hZGQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9hZGQoZCx4LHkseixhLGIpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX2FkZF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX2FkZF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBpbmdyb3VwIHBhcmFtZXRlcnMKKyAqIEBicmllZiBBZGQgc3RyaW5nIG1ldGFkYXRhIHRvIGFuIGluc3RhbmNlIG9mIGEgbmFtZWQgZW50aXR5LgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBjb250cm9sbGluZyB0aGUgY2FsbAorICogQHBhcmFtW2luXSBpZCBUaGUgaWRlbnRpZmllciBvZiB0aGUgaW5zdGFuY2UgdG8gd2hpY2ggdGhlIG1ldGFkYXRhIGlzIHRvIGJlIGFkZGVkLCBvciBfX2l0dF9udWxsIHRvIGFkZCB0byB0aGUgY3VycmVudCB0YXNrCisgKiBAcGFyYW1baW5dIGtleSBUaGUgbmFtZSBvZiB0aGUgbWV0YWRhdGEKKyAqIEBwYXJhbVtpbl0gZGF0YSBUaGUgbWV0YWRhdGEgaXRzZWxmCisgKiBAcGFyYW1baW5dIGxlbmd0aCBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZywgb3IgLTEgaWYgdGhlIGxlbmd0aCBpcyB1bmtub3duIGJ1dCB0aGUgc3RyaW5nIGlzIG51bGwtdGVybWluYXRlZCAKKyovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCit2b2lkIElUVEFQSSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkQShjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxlbmd0aCk7Cit2b2lkIElUVEFQSSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkVyhjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgY29uc3Qgd2NoYXJfdCAqZGF0YSwgc2l6ZV90IGxlbmd0aCk7CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorIyAgZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGQgICAgIF9faXR0X21ldGFkYXRhX3N0cl9hZGRXCisjICBkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF9wdHIgX19pdHRfbWV0YWRhdGFfc3RyX2FkZFdfcHRyCisjZWxzZSAvKiBVTklDT0RFICovCisjICBkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZCAgICAgX19pdHRfbWV0YWRhdGFfc3RyX2FkZEEKKyMgIGRlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3B0ciBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkQV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK3ZvaWQgSVRUQVBJIF9faXR0X21ldGFkYXRhX3N0cl9hZGQoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBsZW5ndGgpOworI2VuZGlmCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1ldGFkYXRhX3N0cl9hZGRBLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBsZW5ndGgpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWV0YWRhdGFfc3RyX2FkZFcsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgY29uc3Qgd2NoYXJfdCAqZGF0YSwgc2l6ZV90IGxlbmd0aCkpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtZXRhZGF0YV9zdHJfYWRkLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBsZW5ndGgpKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkQShkLHgseSx6LGEpIElUVE5PVElGWV9WT0lEX0Q0KG1ldGFkYXRhX3N0cl9hZGRBLGQseCx5LHosYSkKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZEFfcHRyICAgICAgICBJVFROT1RJRllfTkFNRShtZXRhZGF0YV9zdHJfYWRkQSkKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZFcoZCx4LHkseixhKSBJVFROT1RJRllfVk9JRF9ENChtZXRhZGF0YV9zdHJfYWRkVyxkLHgseSx6LGEpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRXX3B0ciAgICAgICAgSVRUTk9USUZZX05BTUUobWV0YWRhdGFfc3RyX2FkZFcpCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZChkLHgseSx6LGEpICBJVFROT1RJRllfVk9JRF9ENChtZXRhZGF0YV9zdHJfYWRkLGQseCx5LHosYSkKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF9wdHIgICAgICAgICBJVFROT1RJRllfTkFNRShtZXRhZGF0YV9zdHJfYWRkKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZEEoZCx4LHkseixhKSAKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZEFfcHRyIDAKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZFcoZCx4LHkseixhKSAKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZFdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkKGQseCx5LHosYSkKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF9wdHIgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRBX3B0ciAwCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF9wdHIgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAaW5ncm91cCBwYXJhbWV0ZXJzCisgKiBAYnJpZWYgQWRkIG1ldGFkYXRhIHRvIGFuIGluc3RhbmNlIG9mIGEgbmFtZWQgZW50aXR5LgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBjb250cm9sbGluZyB0aGUgY2FsbAorICogQHBhcmFtW2luXSBzY29wZSBUaGUgc2NvcGUgb2YgdGhlIGluc3RhbmNlIHRvIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyB0byBiZSBhZGRlZAorCisgKiBAcGFyYW1baW5dIGlkIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBpbnN0YW5jZSB0byB3aGljaCB0aGUgbWV0YWRhdGEgaXMgdG8gYmUgYWRkZWQsIG9yIF9faXR0X251bGwgdG8gYWRkIHRvIHRoZSBjdXJyZW50IHRhc2sKKyAKKyAqIEBwYXJhbVtpbl0ga2V5IFRoZSBuYW1lIG9mIHRoZSBtZXRhZGF0YQorICogQHBhcmFtW2luXSB0eXBlIFRoZSB0eXBlIG9mIHRoZSBtZXRhZGF0YQorICogQHBhcmFtW2luXSBjb3VudCBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiB0eXBlLiBJZiBjb3VudCA9PSAwLCBubyBtZXRhZGF0YSB3aWxsIGJlIGFkZGVkLgorICogQHBhcmFtW2luXSBkYXRhIFRoZSBtZXRhZGF0YSBpdHNlbGYKKyovCit2b2lkIElUVEFQSSBfX2l0dF9tZXRhZGF0YV9hZGRfd2l0aF9zY29wZShjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfc2NvcGUgc2NvcGUsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgX19pdHRfbWV0YWRhdGFfdHlwZSB0eXBlLCBzaXplX3QgY291bnQsIHZvaWQgKmRhdGEpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtZXRhZGF0YV9hZGRfd2l0aF9zY29wZSwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9zY29wZSBzY29wZSwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBfX2l0dF9tZXRhZGF0YV90eXBlIHR5cGUsIHNpemVfdCBjb3VudCwgdm9pZCAqZGF0YSkpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX2FkZF93aXRoX3Njb3BlKGQseCx5LHosYSxiKSBJVFROT1RJRllfVk9JRF9ENShtZXRhZGF0YV9hZGRfd2l0aF9zY29wZSxkLHgseSx6LGEsYikKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfYWRkX3dpdGhfc2NvcGVfcHRyICAgICAgICAgIElUVE5PVElGWV9OQU1FKG1ldGFkYXRhX2FkZF93aXRoX3Njb3BlKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfYWRkX3dpdGhfc2NvcGUoZCx4LHkseixhLGIpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX2FkZF93aXRoX3Njb3BlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfYWRkX3dpdGhfc2NvcGVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAaW5ncm91cCBwYXJhbWV0ZXJzCisgKiBAYnJpZWYgQWRkIHN0cmluZyBtZXRhZGF0YSB0byBhbiBpbnN0YW5jZSBvZiBhIG5hbWVkIGVudGl0eS4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gY29udHJvbGxpbmcgdGhlIGNhbGwKKyAqIEBwYXJhbVtpbl0gc2NvcGUgVGhlIHNjb3BlIG9mIHRoZSBpbnN0YW5jZSB0byB3aGljaCB0aGUgbWV0YWRhdGEgaXMgdG8gYmUgYWRkZWQKKworICogQHBhcmFtW2luXSBpZCBUaGUgaWRlbnRpZmllciBvZiB0aGUgaW5zdGFuY2UgdG8gd2hpY2ggdGhlIG1ldGFkYXRhIGlzIHRvIGJlIGFkZGVkLCBvciBfX2l0dF9udWxsIHRvIGFkZCB0byB0aGUgY3VycmVudCB0YXNrCisKKyAqIEBwYXJhbVtpbl0ga2V5IFRoZSBuYW1lIG9mIHRoZSBtZXRhZGF0YQorICogQHBhcmFtW2luXSBkYXRhIFRoZSBtZXRhZGF0YSBpdHNlbGYKKyAqIEBwYXJhbVtpbl0gbGVuZ3RoIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nLCBvciAtMSBpZiB0aGUgbGVuZ3RoIGlzIHVua25vd24gYnV0IHRoZSBzdHJpbmcgaXMgbnVsbC10ZXJtaW5hdGVkIAorKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK3ZvaWQgSVRUQVBJIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZUEoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3Njb3BlIHNjb3BlLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBsZW5ndGgpOwordm9pZCBJVFRBUEkgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlVyhjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfc2NvcGUgc2NvcGUsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgY29uc3Qgd2NoYXJfdCAqZGF0YSwgc2l6ZV90IGxlbmd0aCk7CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorIyAgZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZSAgICAgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlVworIyAgZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZV9wdHIgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlV19wdHIKKyNlbHNlIC8qIFVOSUNPREUgKi8KKyMgIGRlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGUgICAgIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZUEKKyMgIGRlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVfcHRyIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZUFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCit2b2lkIElUVEFQSSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGUoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3Njb3BlIHNjb3BlLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBsZW5ndGgpOworI2VuZGlmCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZUEsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfc2NvcGUgc2NvcGUsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxlbmd0aCkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVXLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3Njb3BlIHNjb3BlLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIGNvbnN0IHdjaGFyX3QgKmRhdGEsIHNpemVfdCBsZW5ndGgpKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3Njb3BlIHNjb3BlLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBsZW5ndGgpKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVBKGQseCx5LHosYSkgSVRUTk9USUZZX1ZPSURfRDQobWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlQSxkLHgseSx6LGEpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZUFfcHRyICAgICAgICBJVFROT1RJRllfTkFNRShtZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVBKQorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVXKGQseCx5LHosYSkgSVRUTk9USUZZX1ZPSURfRDQobWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlVyxkLHgseSx6LGEpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZVdfcHRyICAgICAgICBJVFROT1RJRllfTkFNRShtZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZShkLHgseSx6LGEpICBJVFROT1RJRllfVk9JRF9ENChtZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGUsZCx4LHkseixhKQorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVfcHRyICAgICAgICAgSVRUTk9USUZZX05BTUUobWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlQShkLHgseSx6LGEpIAorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVBX3B0ciAgMAorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVXKGQseCx5LHosYSkgCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZVdfcHRyICAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlKGQseCx5LHosYSkKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlX3B0ciAgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVBX3B0ciAgMAorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVXX3B0ciAgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZV9wdHIgICAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKiBAfSBtZXRhZGF0YSBncm91cCAqLworCisvKioKKyAqIEBkZWZncm91cCByZWxhdGlvbnMgUmVsYXRpb25zCisgKiBJbnN0YW5jZXMgb2YgbmFtZWQgZW50aXRpZXMgY2FuIGJlIGV4cGxpY2l0bHkgYXNzb2NpYXRlZCB3aXRoIG90aGVyCisgKiBpbnN0YW5jZXMgdXNpbmcgaW5zdGFuY2UgSURzIGFuZCB0aGUgcmVsYXRpb25zaGlwIEFQSSBjYWxscy4KKyAqCisgKiBAeworICovCisKKy8qKgorICogQGluZ3JvdXAgcmVsYXRpb25zCisgKiBAYnJpZWYgVGhlIGtpbmQgb2YgcmVsYXRpb24gYmV0d2VlbiB0d28gaW5zdGFuY2VzIGlzIHNwZWNpZmllZCBieSB0aGUgZW51bWVyYXRlZCB0eXBlIF9faXR0X3JlbGF0aW9uLgorICogUmVsYXRpb25zIGJldHdlZW4gaW5zdGFuY2VzIGNhbiBiZSBhZGRlZCB3aXRoIGFuIEFQSSBjYWxsLiBUaGUgcmVsYXRpb24KKyAqIEFQSSB1c2VzIGluc3RhbmNlIElEcy4gUmVsYXRpb25zIGNhbiBiZSBhZGRlZCBiZWZvcmUgb3IgYWZ0ZXIgdGhlIGFjdHVhbAorICogaW5zdGFuY2VzIGFyZSBjcmVhdGVkIGFuZCBwZXJzaXN0IGluZGVwZW5kZW50bHkgb2YgdGhlIGluc3RhbmNlcy4gVGhpcworICogaXMgdGhlIG1vdGl2YXRpb24gZm9yIGhhdmluZyBkaWZmZXJlbnQgbGlmZXRpbWVzIGZvciBpbnN0YW5jZSBJRHMgYW5kCisgKiB0aGUgYWN0dWFsIGluc3RhbmNlcy4KKyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgX19pdHRfcmVsYXRpb25faXNfdW5rbm93biA9IDAsCisgICAgX19pdHRfcmVsYXRpb25faXNfZGVwZW5kZW50X29uLCAgICAgICAgIC8qKjwgIkEgaXMgZGVwZW5kZW50IG9uIEIiIG1lYW5zIHRoYXQgQSBjYW5ub3Qgc3RhcnQgdW50aWwgQiBjb21wbGV0ZXMgKi8KKyAgICBfX2l0dF9yZWxhdGlvbl9pc19zaWJsaW5nX29mLCAgICAgICAgICAgLyoqPCAiQSBpcyBzaWJsaW5nIG9mIEIiIG1lYW5zIHRoYXQgQSBhbmQgQiB3ZXJlIGNyZWF0ZWQgYXMgYSBncm91cCAqLworICAgIF9faXR0X3JlbGF0aW9uX2lzX3BhcmVudF9vZiwgICAgICAgICAgICAvKio8ICJBIGlzIHBhcmVudCBvZiBCIiBtZWFucyB0aGF0IEEgY3JlYXRlZCBCICovCisgICAgX19pdHRfcmVsYXRpb25faXNfY29udGludWF0aW9uX29mLCAgICAgIC8qKjwgIkEgaXMgY29udGludWF0aW9uIG9mIEIiIG1lYW5zIHRoYXQgQSBhc3N1bWVzIHRoZSBkZXBlbmRlbmNpZXMgb2YgQiAqLworICAgIF9faXR0X3JlbGF0aW9uX2lzX2NoaWxkX29mLCAgICAgICAgICAgICAvKio8ICJBIGlzIGNoaWxkIG9mIEIiIG1lYW5zIHRoYXQgQSB3YXMgY3JlYXRlZCBieSBCIChpbnZlcnNlIG9mIGlzX3BhcmVudF9vZikgKi8KKyAgICBfX2l0dF9yZWxhdGlvbl9pc19jb250aW51ZWRfYnksICAgICAgICAgLyoqPCAiQSBpcyBjb250aW51ZWQgYnkgQiIgbWVhbnMgdGhhdCBCIGFzc3VtZXMgdGhlIGRlcGVuZGVuY2llcyBvZiBBIChpbnZlcnNlIG9mIGlzX2NvbnRpbnVhdGlvbl9vZikgKi8KKyAgICBfX2l0dF9yZWxhdGlvbl9pc19wcmVkZWNlc3Nvcl90byAgICAgICAgLyoqPCAiQSBpcyBwcmVkZWNlc3NvciB0byBCIiBtZWFucyB0aGF0IEIgY2Fubm90IHN0YXJ0IHVudGlsIEEgY29tcGxldGVzIChpbnZlcnNlIG9mIGlzX2RlcGVuZGVudF9vbikgKi8KK30gX19pdHRfcmVsYXRpb247CisKKy8qKgorICogQGluZ3JvdXAgcmVsYXRpb25zCisgKiBAYnJpZWYgQWRkIGEgcmVsYXRpb24gdG8gdGhlIGN1cnJlbnQgdGFzayBpbnN0YW5jZS4KKyAqIFRoZSBjdXJyZW50IHRhc2sgaW5zdGFuY2UgaXMgdGhlIGhlYWQgb2YgdGhlIHJlbGF0aW9uLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBjb250cm9sbGluZyB0aGlzIGNhbGwKKyAqIEBwYXJhbVtpbl0gcmVsYXRpb24gVGhlIGtpbmQgb2YgcmVsYXRpb24KKyAqIEBwYXJhbVtpbl0gdGFpbCBUaGUgSUQgZm9yIHRoZSB0YWlsIG9mIHRoZSByZWxhdGlvbgorICovCit2b2lkIElUVEFQSSBfX2l0dF9yZWxhdGlvbl9hZGRfdG9fY3VycmVudChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfcmVsYXRpb24gcmVsYXRpb24sIF9faXR0X2lkIHRhaWwpOworCisvKioKKyAqIEBpbmdyb3VwIHJlbGF0aW9ucworICogQGJyaWVmIEFkZCBhIHJlbGF0aW9uIGJldHdlZW4gdHdvIGluc3RhbmNlIGlkZW50aWZpZXJzLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBjb250cm9sbGluZyB0aGlzIGNhbGwKKyAqIEBwYXJhbVtpbl0gaGVhZCBUaGUgSUQgZm9yIHRoZSBoZWFkIG9mIHRoZSByZWxhdGlvbgorICogQHBhcmFtW2luXSByZWxhdGlvbiBUaGUga2luZCBvZiByZWxhdGlvbgorICogQHBhcmFtW2luXSB0YWlsIFRoZSBJRCBmb3IgdGhlIHRhaWwgb2YgdGhlIHJlbGF0aW9uCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3JlbGF0aW9uX2FkZChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaGVhZCwgX19pdHRfcmVsYXRpb24gcmVsYXRpb24sIF9faXR0X2lkIHRhaWwpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCByZWxhdGlvbl9hZGRfdG9fY3VycmVudCwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9yZWxhdGlvbiByZWxhdGlvbiwgX19pdHRfaWQgdGFpbCkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCByZWxhdGlvbl9hZGQsICAgICAgICAgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBoZWFkLCBfX2l0dF9yZWxhdGlvbiByZWxhdGlvbiwgX19pdHRfaWQgdGFpbCkpCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF90b19jdXJyZW50KGQseCx5KSBJVFROT1RJRllfVk9JRF9EMihyZWxhdGlvbl9hZGRfdG9fY3VycmVudCxkLHgseSkKKyNkZWZpbmUgX19pdHRfcmVsYXRpb25fYWRkX3RvX2N1cnJlbnRfcHRyICAgIElUVE5PVElGWV9OQU1FKHJlbGF0aW9uX2FkZF90b19jdXJyZW50KQorI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGQoZCx4LHkseikgICAgICAgICAgSVRUTk9USUZZX1ZPSURfRDMocmVsYXRpb25fYWRkLGQseCx5LHopCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF9wdHIgICAgICAgICAgICAgICBJVFROT1RJRllfTkFNRShyZWxhdGlvbl9hZGQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGRfdG9fY3VycmVudChkLHgseSkKKyNkZWZpbmUgX19pdHRfcmVsYXRpb25fYWRkX3RvX2N1cnJlbnRfcHRyIDAKKyNkZWZpbmUgX19pdHRfcmVsYXRpb25fYWRkKGQseCx5LHopCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF90b19jdXJyZW50X3B0ciAwCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IHJlbGF0aW9ucyBncm91cCAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNwcmFnbWEgcGFjayhwdXNoLCA4KQorCit0eXBlZGVmIHN0cnVjdCBfX19pdHRfY2xvY2tfaW5mbworeworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBjbG9ja19mcmVxOyAvKiE8IENsb2NrIGRvbWFpbiBmcmVxdWVuY3kgKi8KKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgY2xvY2tfYmFzZTsgLyohPCBDbG9jayBkb21haW4gYmFzZSB0aW1lc3RhbXAgKi8KK30gX19pdHRfY2xvY2tfaW5mbzsKKworI3ByYWdtYSBwYWNrKHBvcCkKKy8qKiBAZW5kY29uZCAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KK3R5cGVkZWYgdm9pZCAoSVRUQVBJICpfX2l0dF9nZXRfY2xvY2tfaW5mb19mbikoX19pdHRfY2xvY2tfaW5mbyogY2xvY2tfaW5mbywgdm9pZCogZGF0YSk7CisvKiogQGVuZGNvbmQgKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjcHJhZ21hIHBhY2socHVzaCwgOCkKKwordHlwZWRlZiBzdHJ1Y3QgX19faXR0X2Nsb2NrX2RvbWFpbgoreworICAgIF9faXR0X2Nsb2NrX2luZm8gaW5mbzsgICAgICAvKiE8IE1vc3QgcmVjZW50IGNsb2NrIGRvbWFpbiBpbmZvICovCisgICAgX19pdHRfZ2V0X2Nsb2NrX2luZm9fZm4gZm47IC8qITwgQ2FsbGJhY2sgZnVuY3Rpb24gcG9pbnRlciAqLworICAgIHZvaWQqIGZuX2RhdGE7ICAgICAgICAgICAgICAvKiE8IElucHV0IGFyZ3VtZW50IGZvciB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gKi8KKyAgICBpbnQgICBleHRyYTE7ICAgICAgICAgICAgICAgLyohPCBSZXNlcnZlZC4gTXVzdCBiZSB6ZXJvICovCisgICAgdm9pZCogZXh0cmEyOyAgICAgICAgICAgICAgIC8qITwgUmVzZXJ2ZWQuIE11c3QgYmUgemVybyAqLworICAgIHN0cnVjdCBfX19pdHRfY2xvY2tfZG9tYWluKiBuZXh0OworfSBfX2l0dF9jbG9ja19kb21haW47CisKKyNwcmFnbWEgcGFjayhwb3ApCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAaW5ncm91cCBjbG9ja2RvbWFpbnMKKyAqIEBicmllZiBDcmVhdGUgYSBjbG9jayBkb21haW4uCisgKiBDZXJ0YWluIGFwcGxpY2F0aW9ucyByZXF1aXJlIHRoZSBjYXBhYmlsaXR5IHRvIHRyYWNlIHRoZWlyIGFwcGxpY2F0aW9uIHVzaW5nCisgKiBhIGNsb2NrIGRvbWFpbiBkaWZmZXJlbnQgdGhhbiB0aGUgQ1BVLCBmb3IgaW5zdGFuY2UgdGhlIGluc3RydW1lbnRhdGlvbiBvZiBldmVudHMKKyAqIHRoYXQgb2NjdXIgb24gYSBHUFUuCisgKiBCZWNhdXNlIHRoZSBzZXQgb2YgZG9tYWlucyBpcyBleHBlY3RlZCB0byBiZSBzdGF0aWMgb3ZlciB0aGUgYXBwbGljYXRpb24ncyBleGVjdXRpb24gdGltZSwKKyAqIHRoZXJlIGlzIG5vIG1lY2hhbmlzbSB0byBkZXN0cm95IGEgZG9tYWluLgorICogQW55IGRvbWFpbiBjYW4gYmUgYWNjZXNzZWQgYnkgYW55IHRocmVhZCBpbiB0aGUgcHJvY2VzcywgcmVnYXJkbGVzcyBvZiB3aGljaCB0aHJlYWQgY3JlYXRlZAorICogdGhlIGRvbWFpbi4gVGhpcyBjYWxsIGlzIHRocmVhZC1zYWZlLgorICogQHBhcmFtW2luXSBmbiBBIHBvaW50ZXIgdG8gYSBjYWxsYmFjayBmdW5jdGlvbiB3aGljaCByZXRyaWV2ZXMgYWx0ZXJuYXRpdmUgQ1BVIHRpbWVzdGFtcHMKKyAqIEBwYXJhbVtpbl0gZm5fZGF0YSBBcmd1bWVudCBmb3IgYSBjYWxsYmFjayBmdW5jdGlvbjsgbWF5IGJlIE5VTEwKKyAqLworX19pdHRfY2xvY2tfZG9tYWluKiBJVFRBUEkgX19pdHRfY2xvY2tfZG9tYWluX2NyZWF0ZShfX2l0dF9nZXRfY2xvY2tfaW5mb19mbiBmbiwgdm9pZCogZm5fZGF0YSk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfY2xvY2tfZG9tYWluKiwgY2xvY2tfZG9tYWluX2NyZWF0ZSwgKF9faXR0X2dldF9jbG9ja19pbmZvX2ZuIGZuLCB2b2lkKiBmbl9kYXRhKSkKKyNkZWZpbmUgX19pdHRfY2xvY2tfZG9tYWluX2NyZWF0ZSAgICAgSVRUTk9USUZZX0RBVEEoY2xvY2tfZG9tYWluX2NyZWF0ZSkKKyNkZWZpbmUgX19pdHRfY2xvY2tfZG9tYWluX2NyZWF0ZV9wdHIgSVRUTk9USUZZX05BTUUoY2xvY2tfZG9tYWluX2NyZWF0ZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2Nsb2NrX2RvbWFpbl9jcmVhdGUoZm4sZm5fZGF0YSkgKF9faXR0X2Nsb2NrX2RvbWFpbiopMAorI2RlZmluZSBfX2l0dF9jbG9ja19kb21haW5fY3JlYXRlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfY2xvY2tfZG9tYWluX2NyZWF0ZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBpbmdyb3VwIGNsb2NrZG9tYWlucworICogQGJyaWVmIFJlY2FsY3VsYXRlIGNsb2NrIGRvbWFpbnMgZnJlcXVlbmNlcyBhbmQgY2xvY2sgYmFzZSB0aW1lc3RhbXBzLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9jbG9ja19kb21haW5fcmVzZXQodm9pZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGNsb2NrX2RvbWFpbl9yZXNldCwgKHZvaWQpKQorI2RlZmluZSBfX2l0dF9jbG9ja19kb21haW5fcmVzZXQgICAgIElUVE5PVElGWV9WT0lEKGNsb2NrX2RvbWFpbl9yZXNldCkKKyNkZWZpbmUgX19pdHRfY2xvY2tfZG9tYWluX3Jlc2V0X3B0ciBJVFROT1RJRllfTkFNRShjbG9ja19kb21haW5fcmVzZXQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9jbG9ja19kb21haW5fcmVzZXQoKQorI2RlZmluZSBfX2l0dF9jbG9ja19kb21haW5fcmVzZXRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9jbG9ja19kb21haW5fcmVzZXRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAaW5ncm91cCBjbG9ja2RvbWFpbgorICogQGJyaWVmIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBpZGVudGlmaWVyLiBUaGlzIGVzdGFibGlzaGVzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpZmV0aW1lIG9mCisgKiBhbiBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gSUQgaW4gdGhlIHRyYWNlLiBPbmNlIHRoaXMgbGlmZXRpbWUgc3RhcnRzLCB0aGUgSUQgY2FuIGJlIHVzZWQgdG8KKyAqIHRhZyBuYW1lZCBlbnRpdHkgaW5zdGFuY2VzIGluIGNhbGxzIHN1Y2ggYXMgX19pdHRfdGFza19iZWdpbiwgYW5kIHRvIHNwZWNpZnkgcmVsYXRpb25zaGlwcyBhbW9uZworICogaWRlbnRpZmllZCBuYW1lZCBlbnRpdHkgaW5zdGFuY2VzLCB1c2luZyB0aGUgXHJlZiByZWxhdGlvbnMgQVBJcy4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gY29udHJvbGxpbmcgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIGNhbGwuCisgKiBAcGFyYW1baW5dIGNsb2NrX2RvbWFpbiBUaGUgY2xvY2sgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBleGVjdXRpb24gb2YgdGhpcyBjYWxsLgorICogQHBhcmFtW2luXSB0aW1lc3RhbXAgVGhlIHVzZXIgZGVmaW5lZCB0aW1lc3RhbXAuCisgKiBAcGFyYW1baW5dIGlkIFRoZSBJRCB0byBjcmVhdGUuCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2lkX2NyZWF0ZV9leChjb25zdCBfX2l0dF9kb21haW4qIGRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIGlkKTsKKworLyoqCisgKiBAaW5ncm91cCBjbG9ja2RvbWFpbgorICogQGJyaWVmIERlc3Ryb3kgYW4gaW5zdGFuY2Ugb2YgaWRlbnRpZmllci4gVGhpcyBlbmRzIHRoZSBsaWZldGltZSBvZiB0aGUgY3VycmVudCBpbnN0YW5jZSBvZiB0aGUKKyAqIGdpdmVuIElEIHZhbHVlIGluIHRoZSB0cmFjZS4gQW55IHJlbGF0aW9uc2hpcHMgdGhhdCBhcmUgZXN0YWJsaXNoZWQgYWZ0ZXIgdGhpcyBsaWZldGltZSBlbmRzIGFyZQorICogaW52YWxpZC4gVGhpcyBjYWxsIG11c3QgYmUgcGVyZm9ybWVkIGJlZm9yZSB0aGUgZ2l2ZW4gSUQgdmFsdWUgY2FuIGJlIHJldXNlZCBmb3IgYSBkaWZmZXJlbnQKKyAqIG5hbWVkIGVudGl0eSBpbnN0YW5jZS4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gY29udHJvbGxpbmcgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIGNhbGwuCisgKiBAcGFyYW1baW5dIGNsb2NrX2RvbWFpbiBUaGUgY2xvY2sgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBleGVjdXRpb24gb2YgdGhpcyBjYWxsLgorICogQHBhcmFtW2luXSB0aW1lc3RhbXAgVGhlIHVzZXIgZGVmaW5lZCB0aW1lc3RhbXAuCisgKiBAcGFyYW1baW5dIGlkIFRoZSBJRCB0byBkZXN0cm95LgorICovCit2b2lkIElUVEFQSSBfX2l0dF9pZF9kZXN0cm95X2V4KGNvbnN0IF9faXR0X2RvbWFpbiogZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBpZF9jcmVhdGVfZXgsICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCBpZCkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBpZF9kZXN0cm95X2V4LCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCBpZCkpCisjZGVmaW5lIF9faXR0X2lkX2NyZWF0ZV9leChkLHgseSx6KSAgSVRUTk9USUZZX1ZPSURfRDMoaWRfY3JlYXRlX2V4LGQseCx5LHopCisjZGVmaW5lIF9faXR0X2lkX2NyZWF0ZV9leF9wdHIgICAgICAgSVRUTk9USUZZX05BTUUoaWRfY3JlYXRlX2V4KQorI2RlZmluZSBfX2l0dF9pZF9kZXN0cm95X2V4KGQseCx5LHopIElUVE5PVElGWV9WT0lEX0QzKGlkX2Rlc3Ryb3lfZXgsZCx4LHkseikKKyNkZWZpbmUgX19pdHRfaWRfZGVzdHJveV9leF9wdHIgICAgICBJVFROT1RJRllfTkFNRShpZF9kZXN0cm95X2V4KQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfaWRfY3JlYXRlX2V4KGRvbWFpbixjbG9ja19kb21haW4sdGltZXN0YW1wLGlkKQorI2RlZmluZSBfX2l0dF9pZF9jcmVhdGVfZXhfcHRyICAgIDAKKyNkZWZpbmUgX19pdHRfaWRfZGVzdHJveV9leChkb21haW4sY2xvY2tfZG9tYWluLHRpbWVzdGFtcCxpZCkKKyNkZWZpbmUgX19pdHRfaWRfZGVzdHJveV9leF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2lkX2NyZWF0ZV9leF9wdHIgICAgMAorI2RlZmluZSBfX2l0dF9pZF9kZXN0cm95X2V4X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGluZ3JvdXAgY2xvY2tkb21haW4KKyAqIEBicmllZiBCZWdpbiBhIHRhc2sgaW5zdGFuY2UuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGZvciB0aGlzIHRhc2sKKyAqIEBwYXJhbVtpbl0gY2xvY2tfZG9tYWluIFRoZSBjbG9jayBkb21haW4gY29udHJvbGxpbmcgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIGNhbGwuCisgKiBAcGFyYW1baW5dIHRpbWVzdGFtcCBUaGUgdXNlciBkZWZpbmVkIHRpbWVzdGFtcC4KKyAqIEBwYXJhbVtpbl0gdGFza2lkIFRoZSBpbnN0YW5jZSBJRCBmb3IgdGhpcyB0YXNrIGluc3RhbmNlLCBvciBfX2l0dF9udWxsCisgKiBAcGFyYW1baW5dIHBhcmVudGlkIFRoZSBwYXJlbnQgaW5zdGFuY2UgdG8gd2hpY2ggdGhpcyB0YXNrIGluc3RhbmNlIGJlbG9uZ3MsIG9yIF9faXR0X251bGwKKyAqIEBwYXJhbVtpbl0gbmFtZSBUaGUgbmFtZSBvZiB0aGlzIHRhc2sKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfdGFza19iZWdpbl9leChjb25zdCBfX2l0dF9kb21haW4qIGRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIHRhc2tpZCwgX19pdHRfaWQgcGFyZW50aWQsIF9faXR0X3N0cmluZ19oYW5kbGUqIG5hbWUpOworCisvKioKKyAqIEBpbmdyb3VwIGNsb2NrZG9tYWluCisgKiBAYnJpZWYgQmVnaW4gYSB0YXNrIGluc3RhbmNlLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBmb3IgdGhpcyB0YXNrCisgKiBAcGFyYW1baW5dIGNsb2NrX2RvbWFpbiBUaGUgY2xvY2sgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBleGVjdXRpb24gb2YgdGhpcyBjYWxsLgorICogQHBhcmFtW2luXSB0aW1lc3RhbXAgVGhlIHVzZXIgZGVmaW5lZCB0aW1lc3RhbXAuCisgKiBAcGFyYW1baW5dIHRhc2tpZCBUaGUgaWRlbnRpZmllciBmb3IgdGhpcyB0YXNrIGluc3RhbmNlLCBvciBfX2l0dF9udWxsCisgKiBAcGFyYW1baW5dIHBhcmVudGlkIFRoZSBwYXJlbnQgb2YgdGhpcyB0YXNrLCBvciBfX2l0dF9udWxsCisgKiBAcGFyYW1baW5dIGZuIFRoZSBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB5b3UgYXJlIHRyYWNpbmcKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfdGFza19iZWdpbl9mbl9leChjb25zdCBfX2l0dF9kb21haW4qIGRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIHRhc2tpZCwgX19pdHRfaWQgcGFyZW50aWQsIHZvaWQqIGZuKTsKKworLyoqCisgKiBAaW5ncm91cCBjbG9ja2RvbWFpbgorICogQGJyaWVmIEVuZCB0aGUgY3VycmVudCB0YXNrIGluc3RhbmNlLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBmb3IgdGhpcyB0YXNrCisgKiBAcGFyYW1baW5dIGNsb2NrX2RvbWFpbiBUaGUgY2xvY2sgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBleGVjdXRpb24gb2YgdGhpcyBjYWxsLgorICogQHBhcmFtW2luXSB0aW1lc3RhbXAgVGhlIHVzZXIgZGVmaW5lZCB0aW1lc3RhbXAuCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3Rhc2tfZW5kX2V4KGNvbnN0IF9faXR0X2RvbWFpbiogZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfYmVnaW5fZXgsICAgICAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCBpZCwgX19pdHRfaWQgcGFyZW50aWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19iZWdpbl9mbl9leCwgICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIGlkLCBfX2l0dF9pZCBwYXJlbnRpZCwgdm9pZCogZm4pKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19lbmRfZXgsICAgICAgICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXApKQorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX2V4KGQseCx5LHosYSxiKSAgICAgIElUVE5PVElGWV9WT0lEX0Q1KHRhc2tfYmVnaW5fZXgsZCx4LHkseixhLGIpCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fZXhfcHRyICAgICAgICAgICAgICAgSVRUTk9USUZZX05BTUUodGFza19iZWdpbl9leCkKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9mbl9leChkLHgseSx6LGEsYikgICBJVFROT1RJRllfVk9JRF9ENSh0YXNrX2JlZ2luX2ZuX2V4LGQseCx5LHosYSxiKQorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX2ZuX2V4X3B0ciAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHRhc2tfYmVnaW5fZm5fZXgpCisjZGVmaW5lIF9faXR0X3Rhc2tfZW5kX2V4KGQseCx5KSAgICAgICAgICAgICAgSVRUTk9USUZZX1ZPSURfRDIodGFza19lbmRfZXgsZCx4LHkpCisjZGVmaW5lIF9faXR0X3Rhc2tfZW5kX2V4X3B0ciAgICAgICAgICAgICAgICAgSVRUTk9USUZZX05BTUUodGFza19lbmRfZXgpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX2V4KGRvbWFpbixjbG9ja19kb21haW4sdGltZXN0YW1wLGlkLHBhcmVudGlkLG5hbWUpCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fZXhfcHRyICAgICAgICAgIDAKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9mbl9leChkb21haW4sY2xvY2tfZG9tYWluLHRpbWVzdGFtcCxpZCxwYXJlbnRpZCxmbikKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9mbl9leF9wdHIgICAgICAgMAorI2RlZmluZSBfX2l0dF90YXNrX2VuZF9leChkb21haW4sY2xvY2tfZG9tYWluLHRpbWVzdGFtcCkKKyNkZWZpbmUgX19pdHRfdGFza19lbmRfZXhfcHRyICAgICAgICAgICAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fZXhfcHRyICAgICAgICAgIDAKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9mbl9leF9wdHIgICAgICAgMAorI2RlZmluZSBfX2l0dF90YXNrX2VuZF9leF9wdHIgICAgICAgICAgICAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGluZ3JvdXAgbWFya2VycworICogQGJyaWVmIENyZWF0ZSBhIG1hcmtlciBpbnN0YW5jZS4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gZm9yIHRoaXMgbWFya2VyCisgKiBAcGFyYW1baW5dIGNsb2NrX2RvbWFpbiBUaGUgY2xvY2sgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBleGVjdXRpb24gb2YgdGhpcyBjYWxsLgorICogQHBhcmFtW2luXSB0aW1lc3RhbXAgVGhlIHVzZXIgZGVmaW5lZCB0aW1lc3RhbXAuCisgKiBAcGFyYW1baW5dIGlkIFRoZSBpbnN0YW5jZSBJRCBmb3IgdGhpcyBtYXJrZXIsIG9yIF9faXR0X251bGwKKyAqIEBwYXJhbVtpbl0gbmFtZSBUaGUgbmFtZSBmb3IgdGhpcyBtYXJrZXIKKyAqIEBwYXJhbVtpbl0gc2NvcGUgVGhlIHNjb3BlIGZvciB0aGlzIG1hcmtlcgorICovCit2b2lkIElUVEFQSSBfX2l0dF9tYXJrZXJfZXgoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sICBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUsIF9faXR0X3Njb3BlIHNjb3BlKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWFya2VyX2V4LCAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sICBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUsIF9faXR0X3Njb3BlIHNjb3BlKSkKKyNkZWZpbmUgX19pdHRfbWFya2VyX2V4KGQseCx5LHosYSxiKSAgICBJVFROT1RJRllfVk9JRF9ENShtYXJrZXJfZXgsZCx4LHkseixhLGIpCisjZGVmaW5lIF9faXR0X21hcmtlcl9leF9wdHIgICAgICAgICAgICAgSVRUTk9USUZZX05BTUUobWFya2VyX2V4KQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbWFya2VyX2V4KGRvbWFpbixjbG9ja19kb21haW4sdGltZXN0YW1wLGlkLG5hbWUsc2NvcGUpCisjZGVmaW5lIF9faXR0X21hcmtlcl9leF9wdHIgICAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X21hcmtlcl9leF9wdHIgICAgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBpbmdyb3VwIGNsb2NrZG9tYWluCisgKiBAYnJpZWYgQWRkIGEgcmVsYXRpb24gdG8gdGhlIGN1cnJlbnQgdGFzayBpbnN0YW5jZS4KKyAqIFRoZSBjdXJyZW50IHRhc2sgaW5zdGFuY2UgaXMgdGhlIGhlYWQgb2YgdGhlIHJlbGF0aW9uLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBjb250cm9sbGluZyB0aGlzIGNhbGwKKyAqIEBwYXJhbVtpbl0gY2xvY2tfZG9tYWluIFRoZSBjbG9jayBkb21haW4gY29udHJvbGxpbmcgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIGNhbGwuCisgKiBAcGFyYW1baW5dIHRpbWVzdGFtcCBUaGUgdXNlciBkZWZpbmVkIHRpbWVzdGFtcC4KKyAqIEBwYXJhbVtpbl0gcmVsYXRpb24gVGhlIGtpbmQgb2YgcmVsYXRpb24KKyAqIEBwYXJhbVtpbl0gdGFpbCBUaGUgSUQgZm9yIHRoZSB0YWlsIG9mIHRoZSByZWxhdGlvbgorICovCit2b2lkIElUVEFQSSBfX2l0dF9yZWxhdGlvbl9hZGRfdG9fY3VycmVudF9leChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9yZWxhdGlvbiByZWxhdGlvbiwgX19pdHRfaWQgdGFpbCk7CisKKy8qKgorICogQGluZ3JvdXAgY2xvY2tkb21haW4KKyAqIEBicmllZiBBZGQgYSByZWxhdGlvbiBiZXR3ZWVuIHR3byBpbnN0YW5jZSBpZGVudGlmaWVycy4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gY29udHJvbGxpbmcgdGhpcyBjYWxsCisgKiBAcGFyYW1baW5dIGNsb2NrX2RvbWFpbiBUaGUgY2xvY2sgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBleGVjdXRpb24gb2YgdGhpcyBjYWxsLgorICogQHBhcmFtW2luXSB0aW1lc3RhbXAgVGhlIHVzZXIgZGVmaW5lZCB0aW1lc3RhbXAuCisgKiBAcGFyYW1baW5dIGhlYWQgVGhlIElEIGZvciB0aGUgaGVhZCBvZiB0aGUgcmVsYXRpb24KKyAqIEBwYXJhbVtpbl0gcmVsYXRpb24gVGhlIGtpbmQgb2YgcmVsYXRpb24KKyAqIEBwYXJhbVtpbl0gdGFpbCBUaGUgSUQgZm9yIHRoZSB0YWlsIG9mIHRoZSByZWxhdGlvbgorICovCit2b2lkIElUVEFQSSBfX2l0dF9yZWxhdGlvbl9hZGRfZXgoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sICBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaGVhZCwgX19pdHRfcmVsYXRpb24gcmVsYXRpb24sIF9faXR0X2lkIHRhaWwpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCByZWxhdGlvbl9hZGRfdG9fY3VycmVudF9leCwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfcmVsYXRpb24gcmVsYXRpb24sIF9faXR0X2lkIHRhaWwpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgcmVsYXRpb25fYWRkX2V4LCAgICAgICAgICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIGhlYWQsIF9faXR0X3JlbGF0aW9uIHJlbGF0aW9uLCBfX2l0dF9pZCB0YWlsKSkKKyNkZWZpbmUgX19pdHRfcmVsYXRpb25fYWRkX3RvX2N1cnJlbnRfZXgoZCx4LHkseixhKSBJVFROT1RJRllfVk9JRF9ENChyZWxhdGlvbl9hZGRfdG9fY3VycmVudF9leCxkLHgseSx6LGEpCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF90b19jdXJyZW50X2V4X3B0ciAgICAgICAgSVRUTk9USUZZX05BTUUocmVsYXRpb25fYWRkX3RvX2N1cnJlbnRfZXgpCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF9leChkLHgseSx6LGEsYikgICAgICAgICAgSVRUTk9USUZZX1ZPSURfRDUocmVsYXRpb25fYWRkX2V4LGQseCx5LHosYSxiKQorI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGRfZXhfcHRyICAgICAgICAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHJlbGF0aW9uX2FkZF9leCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF90b19jdXJyZW50X2V4KGRvbWFpbixjbG9ja19kb21haW4sdGltZXN0YW1lLHJlbGF0aW9uLHRhaWwpCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF90b19jdXJyZW50X2V4X3B0ciAwCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF9leChkb21haW4sY2xvY2tfZG9tYWluLHRpbWVzdGFtcCxoZWFkLHJlbGF0aW9uLHRhaWwpCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF9leF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF90b19jdXJyZW50X2V4X3B0ciAwCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF9leF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KK3R5cGVkZWYgZW51bSBfX19pdHRfdHJhY2tfZ3JvdXBfdHlwZQoreworICAgIF9faXR0X3RyYWNrX2dyb3VwX3R5cGVfbm9ybWFsID0gMAorfSBfX2l0dF90cmFja19ncm91cF90eXBlOworLyoqIEBlbmRjb25kICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI3ByYWdtYSBwYWNrKHB1c2gsIDgpCisKK3R5cGVkZWYgc3RydWN0IF9fX2l0dF90cmFja19ncm91cAoreworICAgIF9faXR0X3N0cmluZ19oYW5kbGUqIG5hbWU7ICAgICAvKiE8IE5hbWUgb2YgdGhlIHRyYWNrIGdyb3VwICovCisgICAgc3RydWN0IF9fX2l0dF90cmFjayogdHJhY2s7ICAgIC8qITwgTGlzdCBvZiBjaGlsZCB0cmFja3MgICAgKi8KKyAgICBfX2l0dF90cmFja19ncm91cF90eXBlIHRndHlwZTsgLyohPCBUeXBlIG9mIHRoZSB0cmFjayBncm91cCAqLworICAgIGludCAgIGV4dHJhMTsgICAgICAgICAgICAgICAgICAvKiE8IFJlc2VydmVkLiBNdXN0IGJlIHplcm8gICovCisgICAgdm9pZCogZXh0cmEyOyAgICAgICAgICAgICAgICAgIC8qITwgUmVzZXJ2ZWQuIE11c3QgYmUgemVybyAgKi8KKyAgICBzdHJ1Y3QgX19faXR0X3RyYWNrX2dyb3VwKiBuZXh0OworfSBfX2l0dF90cmFja19ncm91cDsKKworI3ByYWdtYSBwYWNrKHBvcCkKKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBQbGFjZWhvbGRlciBmb3IgY3VzdG9tIHRyYWNrIHR5cGVzLiBDdXJyZW50bHksICJub3JtYWwiIGN1c3RvbSB0cmFjaworICogaXMgdGhlIG9ubHkgYXZhaWxhYmxlIHRyYWNrIHR5cGUuCisgKi8KK3R5cGVkZWYgZW51bSBfX19pdHRfdHJhY2tfdHlwZQoreworICAgIF9faXR0X3RyYWNrX3R5cGVfbm9ybWFsID0gMAorI2lmZGVmIElOVEVMX0lUVE5PVElGWV9BUElfUFJJVkFURQorICAgICwgX19pdHRfdHJhY2tfdHlwZV9xdWV1ZQorI2VuZGlmIC8qIElOVEVMX0lUVE5PVElGWV9BUElfUFJJVkFURSAqLworfSBfX2l0dF90cmFja190eXBlOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNwcmFnbWEgcGFjayhwdXNoLCA4KQorCit0eXBlZGVmIHN0cnVjdCBfX19pdHRfdHJhY2sKK3sKKyAgICBfX2l0dF9zdHJpbmdfaGFuZGxlKiBuYW1lOyAvKiE8IE5hbWUgb2YgdGhlIHRyYWNrIGdyb3VwICovCisgICAgX19pdHRfdHJhY2tfZ3JvdXAqIGdyb3VwOyAgLyohPCBQYXJlbnQgZ3JvdXAgdG8gYSB0cmFjayAqLworICAgIF9faXR0X3RyYWNrX3R5cGUgdHR5cGU7ICAgIC8qITwgVHlwZSBvZiB0aGUgdHJhY2sgICAgICAgKi8KKyAgICBpbnQgICBleHRyYTE7ICAgICAgICAgICAgICAvKiE8IFJlc2VydmVkLiBNdXN0IGJlIHplcm8gICovCisgICAgdm9pZCogZXh0cmEyOyAgICAgICAgICAgICAgLyohPCBSZXNlcnZlZC4gTXVzdCBiZSB6ZXJvICAqLworICAgIHN0cnVjdCBfX19pdHRfdHJhY2sqIG5leHQ7Cit9IF9faXR0X3RyYWNrOworCisjcHJhZ21hIHBhY2socG9wKQorLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIENyZWF0ZSBsb2dpY2FsIHRyYWNrIGdyb3VwLgorICovCitfX2l0dF90cmFja19ncm91cCogSVRUQVBJIF9faXR0X3RyYWNrX2dyb3VwX2NyZWF0ZShfX2l0dF9zdHJpbmdfaGFuZGxlKiBuYW1lLCBfX2l0dF90cmFja19ncm91cF90eXBlIHRyYWNrX2dyb3VwX3R5cGUpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQihJVFRBUEksIF9faXR0X3RyYWNrX2dyb3VwKiwgdHJhY2tfZ3JvdXBfY3JlYXRlLCAoX19pdHRfc3RyaW5nX2hhbmRsZSogbmFtZSwgX19pdHRfdHJhY2tfZ3JvdXBfdHlwZSB0cmFja19ncm91cF90eXBlKSkKKyNkZWZpbmUgX19pdHRfdHJhY2tfZ3JvdXBfY3JlYXRlICAgICBJVFROT1RJRllfREFUQSh0cmFja19ncm91cF9jcmVhdGUpCisjZGVmaW5lIF9faXR0X3RyYWNrX2dyb3VwX2NyZWF0ZV9wdHIgSVRUTk9USUZZX05BTUUodHJhY2tfZ3JvdXBfY3JlYXRlKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfdHJhY2tfZ3JvdXBfY3JlYXRlKG5hbWUpICAoX19pdHRfdHJhY2tfZ3JvdXAqKTAKKyNkZWZpbmUgX19pdHRfdHJhY2tfZ3JvdXBfY3JlYXRlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfdHJhY2tfZ3JvdXBfY3JlYXRlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIENyZWF0ZSBsb2dpY2FsIHRyYWNrLgorICovCitfX2l0dF90cmFjayogSVRUQVBJIF9faXR0X3RyYWNrX2NyZWF0ZShfX2l0dF90cmFja19ncm91cCogdHJhY2tfZ3JvdXAsIF9faXR0X3N0cmluZ19oYW5kbGUqIG5hbWUsIF9faXR0X3RyYWNrX3R5cGUgdHJhY2tfdHlwZSk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfdHJhY2sqLCB0cmFja19jcmVhdGUsIChfX2l0dF90cmFja19ncm91cCogdHJhY2tfZ3JvdXAsX19pdHRfc3RyaW5nX2hhbmRsZSogbmFtZSwgX19pdHRfdHJhY2tfdHlwZSB0cmFja190eXBlKSkKKyNkZWZpbmUgX19pdHRfdHJhY2tfY3JlYXRlICAgICBJVFROT1RJRllfREFUQSh0cmFja19jcmVhdGUpCisjZGVmaW5lIF9faXR0X3RyYWNrX2NyZWF0ZV9wdHIgSVRUTk9USUZZX05BTUUodHJhY2tfY3JlYXRlKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfdHJhY2tfY3JlYXRlKHRyYWNrX2dyb3VwLG5hbWUsdHJhY2tfdHlwZSkgIChfX2l0dF90cmFjayopMAorI2RlZmluZSBfX2l0dF90cmFja19jcmVhdGVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF90cmFja19jcmVhdGVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgU2V0IHRoZSBsb2dpY2FsIHRyYWNrLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9zZXRfdHJhY2soX19pdHRfdHJhY2sqIHRyYWNrKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc2V0X3RyYWNrLCAoX19pdHRfdHJhY2sgKnRyYWNrKSkKKyNkZWZpbmUgX19pdHRfc2V0X3RyYWNrICAgICBJVFROT1RJRllfVk9JRChzZXRfdHJhY2spCisjZGVmaW5lIF9faXR0X3NldF90cmFja19wdHIgSVRUTk9USUZZX05BTUUoc2V0X3RyYWNrKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc2V0X3RyYWNrKHRyYWNrKQorI2RlZmluZSBfX2l0dF9zZXRfdHJhY2tfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9zZXRfdHJhY2tfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZ3BhX2RvY3VtZW50YXRpb24gKi8KKy8qKgorICogQGRlZmdyb3VwIGV2ZW50cyBFdmVudHMKKyAqIEBpbmdyb3VwIHB1YmxpYworICogRXZlbnRzIGdyb3VwCisgKiBAeworICovCisvKiogQGJyaWVmIHVzZXIgZXZlbnQgdHlwZSAqLwordHlwZWRlZiBpbnQgX19pdHRfZXZlbnQ7CisKKy8qKgorICogQGJyaWVmIENyZWF0ZSBhbiBldmVudCBub3RpZmljYXRpb24KKyAqIEBub3RlIG5hbWUgb3IgbmFtZWxlbiBiZWluZyBudWxsL25hbWUgYW5kIG5hbWVsZW4gbm90IG1hdGNoaW5nLCB1c2VyIGV2ZW50IGZlYXR1cmUgbm90IGVuYWJsZWQKKyAqIEByZXR1cm4gbm9uLXplcm8gZXZlbnQgaWRlbnRpZmllciB1cG9uIHN1Y2Nlc3MgYW5kIF9faXR0X2VyciBvdGhlcndpc2UKKyAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorX19pdHRfZXZlbnQgTElCSVRUQVBJIF9faXR0X2V2ZW50X2NyZWF0ZUEoY29uc3QgY2hhciAgICAqbmFtZSwgaW50IG5hbWVsZW4pOworX19pdHRfZXZlbnQgTElCSVRUQVBJIF9faXR0X2V2ZW50X2NyZWF0ZVcoY29uc3Qgd2NoYXJfdCAqbmFtZSwgaW50IG5hbWVsZW4pOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF9ldmVudF9jcmVhdGUgICAgIF9faXR0X2V2ZW50X2NyZWF0ZVcKKyMgIGRlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVfcHRyIF9faXR0X2V2ZW50X2NyZWF0ZVdfcHRyCisjZWxzZQorIyAgZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZSAgICAgX19pdHRfZXZlbnRfY3JlYXRlQQorIyAgZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZV9wdHIgX19pdHRfZXZlbnRfY3JlYXRlQV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitfX2l0dF9ldmVudCBMSUJJVFRBUEkgX19pdHRfZXZlbnRfY3JlYXRlKGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuKTsKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoTElCSVRUQVBJLCBfX2l0dF9ldmVudCwgZXZlbnRfY3JlYXRlQSwgKGNvbnN0IGNoYXIgICAgKm5hbWUsIGludCBuYW1lbGVuKSkKK0lUVF9TVFVCKExJQklUVEFQSSwgX19pdHRfZXZlbnQsIGV2ZW50X2NyZWF0ZVcsIChjb25zdCB3Y2hhcl90ICpuYW1lLCBpbnQgbmFtZWxlbikpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihMSUJJVFRBUEksIF9faXR0X2V2ZW50LCBldmVudF9jcmVhdGUsICAoY29uc3QgY2hhciAgICAqbmFtZSwgaW50IG5hbWVsZW4pKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVBICAgICBJVFROT1RJRllfREFUQShldmVudF9jcmVhdGVBKQorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVBX3B0ciBJVFROT1RJRllfTkFNRShldmVudF9jcmVhdGVBKQorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVXICAgICBJVFROT1RJRllfREFUQShldmVudF9jcmVhdGVXKQorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVXX3B0ciBJVFROT1RJRllfTkFNRShldmVudF9jcmVhdGVXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZSAgICAgIElUVE5PVElGWV9EQVRBKGV2ZW50X2NyZWF0ZSkKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlX3B0ciAgSVRUTk9USUZZX05BTUUoZXZlbnRfY3JlYXRlKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlQShuYW1lLCBuYW1lbGVuKSAoX19pdHRfZXZlbnQpMAorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZVcobmFtZSwgbmFtZWxlbikgKF9faXR0X2V2ZW50KTAKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZShuYW1lLCBuYW1lbGVuKSAgKF9faXR0X2V2ZW50KTAKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlX3B0ciAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZV9wdHIgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgUmVjb3JkIGFuIGV2ZW50IG9jY3VycmVuY2UuCisgKiBAcmV0dXJuIF9faXR0X2VyciB1cG9uIGZhaWx1cmUgKGludmFsaWQgZXZlbnQgaWQvdXNlciBldmVudCBmZWF0dXJlIG5vdCBlbmFibGVkKQorICovCitpbnQgTElCSVRUQVBJIF9faXR0X2V2ZW50X3N0YXJ0KF9faXR0X2V2ZW50IGV2ZW50KTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsIGV2ZW50X3N0YXJ0LCAoX19pdHRfZXZlbnQgZXZlbnQpKQorI2RlZmluZSBfX2l0dF9ldmVudF9zdGFydCAgICAgSVRUTk9USUZZX0RBVEEoZXZlbnRfc3RhcnQpCisjZGVmaW5lIF9faXR0X2V2ZW50X3N0YXJ0X3B0ciBJVFROT1RJRllfTkFNRShldmVudF9zdGFydCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2V2ZW50X3N0YXJ0KGV2ZW50KSAoaW50KTAKKyNkZWZpbmUgX19pdHRfZXZlbnRfc3RhcnRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9ldmVudF9zdGFydF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBSZWNvcmQgYW4gZXZlbnQgZW5kIG9jY3VycmVuY2UuCisgKiBAbm90ZSBJdCBpcyBvcHRpb25hbCBpZiBldmVudHMgZG8gbm90IGhhdmUgZHVyYXRpb25zLgorICogQHJldHVybiBfX2l0dF9lcnIgdXBvbiBmYWlsdXJlIChpbnZhbGlkIGV2ZW50IGlkL3VzZXIgZXZlbnQgZmVhdHVyZSBub3QgZW5hYmxlZCkKKyAqLworaW50IExJQklUVEFQSSBfX2l0dF9ldmVudF9lbmQoX19pdHRfZXZlbnQgZXZlbnQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQihMSUJJVFRBUEksIGludCwgZXZlbnRfZW5kLCAoX19pdHRfZXZlbnQgZXZlbnQpKQorI2RlZmluZSBfX2l0dF9ldmVudF9lbmQgICAgIElUVE5PVElGWV9EQVRBKGV2ZW50X2VuZCkKKyNkZWZpbmUgX19pdHRfZXZlbnRfZW5kX3B0ciBJVFROT1RJRllfTkFNRShldmVudF9lbmQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9ldmVudF9lbmQoZXZlbnQpIChpbnQpMAorI2RlZmluZSBfX2l0dF9ldmVudF9lbmRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9ldmVudF9lbmRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSBldmVudHMgZ3JvdXAgKi8KKworCisvKioKKyAqIEBkZWZncm91cCBhcnJheXMgQXJyYXlzIFZpc3VhbGl6ZXIKKyAqIEBpbmdyb3VwIHB1YmxpYworICogVmlzdWFsaXplIGFycmF5cworICogQHsKKyAqLworCisvKioKKyAqIEBlbnVtIF9faXR0X2F2X2RhdGFfdHlwZQorICogQGJyaWVmIERlZmluZXMgdHlwZXMgb2YgYXJyYXlzIGRhdGEgKGZvciBDL0MrKyBpbnRyaW5zaWMgdHlwZXMpIAorICovCit0eXBlZGVmIGVudW0gCit7CisgICAgX19pdHRfZV9maXJzdCA9IDAsCisgICAgX19pdHRfZV9jaGFyID0gMCwgIC8qIDEtYnl0ZSBpbnRlZ2VyICovCisgICAgX19pdHRfZV91Y2hhciwgICAgIC8qIDEtYnl0ZSB1bnNpZ25lZCBpbnRlZ2VyICovCisgICAgX19pdHRfZV9pbnQxNiwgICAgIC8qIDItYnl0ZSBpbnRlZ2VyICovCisgICAgX19pdHRfZV91aW50MTYsICAgIC8qIDItYnl0ZSB1bnNpZ25lZCBpbnRlZ2VyICAqLworICAgIF9faXR0X2VfaW50MzIsICAgICAvKiA0LWJ5dGUgaW50ZWdlciAqLworICAgIF9faXR0X2VfdWludDMyLCAgICAvKiA0LWJ5dGUgdW5zaWduZWQgaW50ZWdlciAqLworICAgIF9faXR0X2VfaW50NjQsICAgICAvKiA4LWJ5dGUgaW50ZWdlciAqLworICAgIF9faXR0X2VfdWludDY0LCAgICAvKiA4LWJ5dGUgdW5zaWduZWQgaW50ZWdlciAqLworICAgIF9faXR0X2VfZmxvYXQsICAgICAvKiA0LWJ5dGUgZmxvYXRpbmcgKi8KKyAgICBfX2l0dF9lX2RvdWJsZSwgICAgLyogOC1ieXRlIGZsb2F0aW5nICovCisgICAgX19pdHRfZV9sYXN0ID0gX19pdHRfZV9kb3VibGUKK30gX19pdHRfYXZfZGF0YV90eXBlOworCisvKioKKyAqIEBicmllZiBTYXZlIGFuIGFycmF5IGRhdGEgdG8gYSBmaWxlLgorICogT3V0cHV0IGZvcm1hdCBpcyBkZWZpbmVkIGJ5IHRoZSBmaWxlIGV4dGVuc2lvbi4gVGhlIGNzdiBhbmQgYm1wIGZvcm1hdHMgYXJlIHN1cHBvcnRlZCAoYm1wIC0gZm9yIDItZGltZW5zaW9uYWwgYXJyYXkgb25seSkuCisgKiBAcGFyYW1baW5dIGRhdGEgLSBwb2ludGVyIHRvIHRoZSBhcnJheSBkYXRhCisgKiBAcGFyYW1baW5dIHJhbmsgLSB0aGUgcmFuayBvZiB0aGUgYXJyYXkgCisgKiBAcGFyYW1baW5dIGRpbWVuc2lvbnMgLSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGludGVnZXJzLCB3aGljaCBzcGVjaWZpZXMgdGhlIGFycmF5IGRpbWVuc2lvbnMuIAorICogVGhlIHNpemUgb2YgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIHRvIHRoZSByYW5rCisgKiBAcGFyYW1baW5dIHR5cGUgLSB0aGUgdHlwZSBvZiB0aGUgYXJyYXksIHNwZWNpZmllZCBhcyBvbmUgb2YgdGhlIF9faXR0X2F2X2RhdGFfdHlwZSB2YWx1ZXMgKGZvciBpbnRyaW5zaWMgdHlwZXMpCisgKiBAcGFyYW1baW5dIGZpbGVQYXRoIC0gdGhlIGZpbGUgcGF0aDsgdGhlIG91dHB1dCBmb3JtYXQgaXMgZGVmaW5lZCBieSB0aGUgZmlsZSBleHRlbnNpb24KKyAqIEBwYXJhbVtpbl0gY29sdW1uT3JkZXIgLSBkZWZpbmVzIGhvdyB0aGUgYXJyYXkgaXMgc3RvcmVkIGluIHRoZSBsaW5lYXIgbWVtb3J5LgorICogSXQgc2hvdWxkIGJlIDEgZm9yIGNvbHVtbi1tYWpvciBvcmRlciAoZS5nLiBpbiBGT1JUUkFOKSBvciAwIC0gZm9yIHJvdy1tYWpvciBvcmRlciAoZS5nLiBpbiBDKS4KKyAqLworCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitpbnQgSVRUQVBJIF9faXR0X2F2X3NhdmVBKHZvaWQgKmRhdGEsIGludCByYW5rLCBjb25zdCBpbnQgKmRpbWVuc2lvbnMsIGludCB0eXBlLCBjb25zdCBjaGFyICpmaWxlUGF0aCwgaW50IGNvbHVtbk9yZGVyKTsKK2ludCBJVFRBUEkgX19pdHRfYXZfc2F2ZVcodm9pZCAqZGF0YSwgaW50IHJhbmssIGNvbnN0IGludCAqZGltZW5zaW9ucywgaW50IHR5cGUsIGNvbnN0IHdjaGFyX3QgKmZpbGVQYXRoLCBpbnQgY29sdW1uT3JkZXIpOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF9hdl9zYXZlICAgICBfX2l0dF9hdl9zYXZlVworIyAgZGVmaW5lIF9faXR0X2F2X3NhdmVfcHRyIF9faXR0X2F2X3NhdmVXX3B0cgorI2Vsc2UgLyogVU5JQ09ERSAqLworIyAgZGVmaW5lIF9faXR0X2F2X3NhdmUgICAgIF9faXR0X2F2X3NhdmVBCisjICBkZWZpbmUgX19pdHRfYXZfc2F2ZV9wdHIgX19pdHRfYXZfc2F2ZUFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworaW50IElUVEFQSSBfX2l0dF9hdl9zYXZlKHZvaWQgKmRhdGEsIGludCByYW5rLCBjb25zdCBpbnQgKmRpbWVuc2lvbnMsIGludCB0eXBlLCBjb25zdCBjaGFyICpmaWxlUGF0aCwgaW50IGNvbHVtbk9yZGVyKTsKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBpbnQsIGF2X3NhdmVBLCAodm9pZCAqZGF0YSwgaW50IHJhbmssIGNvbnN0IGludCAqZGltZW5zaW9ucywgaW50IHR5cGUsIGNvbnN0IGNoYXIgKmZpbGVQYXRoLCBpbnQgY29sdW1uT3JkZXIpKQorSVRUX1NUVUIoSVRUQVBJLCBpbnQsIGF2X3NhdmVXLCAodm9pZCAqZGF0YSwgaW50IHJhbmssIGNvbnN0IGludCAqZGltZW5zaW9ucywgaW50IHR5cGUsIGNvbnN0IHdjaGFyX3QgKmZpbGVQYXRoLCBpbnQgY29sdW1uT3JkZXIpKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBpbnQsIGF2X3NhdmUsICAodm9pZCAqZGF0YSwgaW50IHJhbmssIGNvbnN0IGludCAqZGltZW5zaW9ucywgaW50IHR5cGUsIGNvbnN0IGNoYXIgKmZpbGVQYXRoLCBpbnQgY29sdW1uT3JkZXIpKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9hdl9zYXZlQSAgICAgSVRUTk9USUZZX0RBVEEoYXZfc2F2ZUEpCisjZGVmaW5lIF9faXR0X2F2X3NhdmVBX3B0ciBJVFROT1RJRllfTkFNRShhdl9zYXZlQSkKKyNkZWZpbmUgX19pdHRfYXZfc2F2ZVcgICAgIElUVE5PVElGWV9EQVRBKGF2X3NhdmVXKQorI2RlZmluZSBfX2l0dF9hdl9zYXZlV19wdHIgSVRUTk9USUZZX05BTUUoYXZfc2F2ZVcpCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfYXZfc2F2ZSAgICAgSVRUTk9USUZZX0RBVEEoYXZfc2F2ZSkKKyNkZWZpbmUgX19pdHRfYXZfc2F2ZV9wdHIgSVRUTk9USUZZX05BTUUoYXZfc2F2ZSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2F2X3NhdmVBKG5hbWUpCisjZGVmaW5lIF9faXR0X2F2X3NhdmVBX3B0ciAwCisjZGVmaW5lIF9faXR0X2F2X3NhdmVXKG5hbWUpCisjZGVmaW5lIF9faXR0X2F2X3NhdmVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfYXZfc2F2ZShuYW1lKQorI2RlZmluZSBfX2l0dF9hdl9zYXZlX3B0ciAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfYXZfc2F2ZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfYXZfc2F2ZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9hdl9zYXZlX3B0ciAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKK3ZvaWQgSVRUQVBJIF9faXR0X2VuYWJsZV9hdHRhY2godm9pZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGVuYWJsZV9hdHRhY2gsICh2b2lkKSkKKyNkZWZpbmUgX19pdHRfZW5hYmxlX2F0dGFjaCAgICAgSVRUTk9USUZZX1ZPSUQoZW5hYmxlX2F0dGFjaCkKKyNkZWZpbmUgX19pdHRfZW5hYmxlX2F0dGFjaF9wdHIgSVRUTk9USUZZX05BTUUoZW5hYmxlX2F0dGFjaCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2VuYWJsZV9hdHRhY2goKQorI2RlZmluZSBfX2l0dF9lbmFibGVfYXR0YWNoX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfZW5hYmxlX2F0dGFjaF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2dwYV9kb2N1bWVudGF0aW9uICovCisKKy8qKiBAfSBhcnJheXMgZ3JvdXAgKi8KKworLyoqIEBlbmRjb25kICovCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmIC8qIF9JVFROT1RJRllfSF8gKi8KKworI2lmZGVmIElOVEVMX0lUVE5PVElGWV9BUElfUFJJVkFURQorCisjaWZuZGVmIF9JVFROT1RJRllfUFJJVkFURV8KKyNkZWZpbmUgX0lUVE5PVElGWV9QUklWQVRFXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKy8qKgorICogQGluZ3JvdXAgdGFza3MKKyAqIEBicmllZiBCZWdpbiBhbiBvdmVybGFwcGVkIHRhc2sgaW5zdGFuY2UuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGZvciB0aGlzIHRhc2suCisgKiBAcGFyYW1baW5dIHRhc2tpZCBUaGUgaWRlbnRpZmllciBmb3IgdGhpcyB0YXNrIGluc3RhbmNlLCAqY2Fubm90KiBiZSBfX2l0dF9udWxsLgorICogQHBhcmFtW2luXSBwYXJlbnRpZCBUaGUgcGFyZW50IG9mIHRoaXMgdGFzaywgb3IgX19pdHRfbnVsbC4KKyAqIEBwYXJhbVtpbl0gbmFtZSBUaGUgbmFtZSBvZiB0aGlzIHRhc2suCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3Rhc2tfYmVnaW5fb3ZlcmxhcHBlZChjb25zdCBfX2l0dF9kb21haW4qIGRvbWFpbiwgX19pdHRfaWQgdGFza2lkLCBfX2l0dF9pZCBwYXJlbnRpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSogbmFtZSk7CisKKy8qKgorICogQGluZ3JvdXAgY2xvY2tkb21haW4KKyAqIEBicmllZiBCZWdpbiBhbiBvdmVybGFwcGVkIHRhc2sgaW5zdGFuY2UuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGZvciB0aGlzIHRhc2sKKyAqIEBwYXJhbVtpbl0gY2xvY2tfZG9tYWluIFRoZSBjbG9jayBkb21haW4gY29udHJvbGxpbmcgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIGNhbGwuCisgKiBAcGFyYW1baW5dIHRpbWVzdGFtcCBUaGUgdXNlciBkZWZpbmVkIHRpbWVzdGFtcC4KKyAqIEBwYXJhbVtpbl0gdGFza2lkIFRoZSBpZGVudGlmaWVyIGZvciB0aGlzIHRhc2sgaW5zdGFuY2UsICpjYW5ub3QqIGJlIF9faXR0X251bGwuCisgKiBAcGFyYW1baW5dIHBhcmVudGlkIFRoZSBwYXJlbnQgb2YgdGhpcyB0YXNrLCBvciBfX2l0dF9udWxsLgorICogQHBhcmFtW2luXSBuYW1lIFRoZSBuYW1lIG9mIHRoaXMgdGFzay4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfdGFza19iZWdpbl9vdmVybGFwcGVkX2V4KGNvbnN0IF9faXR0X2RvbWFpbiogZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgdGFza2lkLCBfX2l0dF9pZCBwYXJlbnRpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSogbmFtZSk7CisKKy8qKgorICogQGluZ3JvdXAgdGFza3MKKyAqIEBicmllZiBFbmQgYW4gb3ZlcmxhcHBlZCB0YXNrIGluc3RhbmNlLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBmb3IgdGhpcyB0YXNrCisgKiBAcGFyYW1baW5dIHRhc2tpZCBFeHBsaWNpdCBJRCBvZiBmaW5pc2hlZCB0YXNrCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3Rhc2tfZW5kX292ZXJsYXBwZWQoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIHRhc2tpZCk7CisKKy8qKgorICogQGluZ3JvdXAgY2xvY2tkb21haW4KKyAqIEBicmllZiBFbmQgYW4gb3ZlcmxhcHBlZCB0YXNrIGluc3RhbmNlLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBmb3IgdGhpcyB0YXNrCisgKiBAcGFyYW1baW5dIGNsb2NrX2RvbWFpbiBUaGUgY2xvY2sgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBleGVjdXRpb24gb2YgdGhpcyBjYWxsLgorICogQHBhcmFtW2luXSB0aW1lc3RhbXAgVGhlIHVzZXIgZGVmaW5lZCB0aW1lc3RhbXAuCisgKiBAcGFyYW1baW5dIHRhc2tpZCBFeHBsaWNpdCBJRCBvZiBmaW5pc2hlZCB0YXNrCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3Rhc2tfZW5kX292ZXJsYXBwZWRfZXgoY29uc3QgX19pdHRfZG9tYWluKiBkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCB0YXNraWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2JlZ2luX292ZXJsYXBwZWQsICAgICAgICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgdGFza2lkLCBfX2l0dF9pZCBwYXJlbnRpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2JlZ2luX292ZXJsYXBwZWRfZXgsICAgICAgIChjb25zdCBfX2l0dF9kb21haW4qIGRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIHRhc2tpZCwgX19pdHRfaWQgcGFyZW50aWQsIF9faXR0X3N0cmluZ19oYW5kbGUqIG5hbWUpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19lbmRfb3ZlcmxhcHBlZCwgICAgICAgICAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIHRhc2tpZCkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2VuZF9vdmVybGFwcGVkX2V4LCAgICAgICAgIChjb25zdCBfX2l0dF9kb21haW4qIGRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIHRhc2tpZCkpCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fb3ZlcmxhcHBlZChkLHgseSx6KSAgICAgICAgICAgIElUVE5PVElGWV9WT0lEX0QzKHRhc2tfYmVnaW5fb3ZlcmxhcHBlZCxkLHgseSx6KQorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX292ZXJsYXBwZWRfcHRyICAgICAgICAgICAgICAgICBJVFROT1RJRllfTkFNRSh0YXNrX2JlZ2luX292ZXJsYXBwZWQpCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fb3ZlcmxhcHBlZF9leChkLHgseSx6LGEsYikgICAgIElUVE5PVElGWV9WT0lEX0Q1KHRhc2tfYmVnaW5fb3ZlcmxhcHBlZF9leCxkLHgseSx6LGEsYikKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9vdmVybGFwcGVkX2V4X3B0ciAgICAgICAgICAgICAgSVRUTk9USUZZX05BTUUodGFza19iZWdpbl9vdmVybGFwcGVkX2V4KQorI2RlZmluZSBfX2l0dF90YXNrX2VuZF9vdmVybGFwcGVkKGQseCkgICAgICAgICAgICAgICAgICBJVFROT1RJRllfVk9JRF9EMSh0YXNrX2VuZF9vdmVybGFwcGVkLGQseCkKKyNkZWZpbmUgX19pdHRfdGFza19lbmRfb3ZlcmxhcHBlZF9wdHIgICAgICAgICAgICAgICAgICAgSVRUTk9USUZZX05BTUUodGFza19lbmRfb3ZlcmxhcHBlZCkKKyNkZWZpbmUgX19pdHRfdGFza19lbmRfb3ZlcmxhcHBlZF9leChkLHgseSx6KSAgICAgICAgICAgSVRUTk9USUZZX1ZPSURfRDModGFza19lbmRfb3ZlcmxhcHBlZF9leCxkLHgseSx6KQorI2RlZmluZSBfX2l0dF90YXNrX2VuZF9vdmVybGFwcGVkX2V4X3B0ciAgICAgICAgICAgICAgICBJVFROT1RJRllfTkFNRSh0YXNrX2VuZF9vdmVybGFwcGVkX2V4KQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9vdmVybGFwcGVkKGRvbWFpbix0YXNraWQscGFyZW50aWQsbmFtZSkKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9vdmVybGFwcGVkX3B0ciAgICAgICAgIDAKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9vdmVybGFwcGVkX2V4KGRvbWFpbixjbG9ja19kb21haW4sdGltZXN0YW1wLHRhc2tpZCxwYXJlbnRpZCxuYW1lKQorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX292ZXJsYXBwZWRfZXhfcHRyICAgICAgMAorI2RlZmluZSBfX2l0dF90YXNrX2VuZF9vdmVybGFwcGVkKGRvbWFpbix0YXNraWQpCisjZGVmaW5lIF9faXR0X3Rhc2tfZW5kX292ZXJsYXBwZWRfcHRyICAgICAgICAgICAwCisjZGVmaW5lIF9faXR0X3Rhc2tfZW5kX292ZXJsYXBwZWRfZXgoZG9tYWluLGNsb2NrX2RvbWFpbix0aW1lc3RhbXAsdGFza2lkKQorI2RlZmluZSBfX2l0dF90YXNrX2VuZF9vdmVybGFwcGVkX2V4X3B0ciAgICAgICAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fb3ZlcmxhcHBlZF9wdHIgICAgICAgICAwCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fb3ZlcmxhcHBlZF9leF9wdHIgICAgICAwCisjZGVmaW5lIF9faXR0X3Rhc2tfZW5kX292ZXJsYXBwZWRfcHRyICAgICAgICAgICAwCisjZGVmaW5lIF9faXR0X3Rhc2tfZW5kX292ZXJsYXBwZWRfZXhfcHRyICAgICAgICAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGRlZmdyb3VwIG1ha3JzX2ludGVybmFsIE1hcmtzCisgKiBAaW5ncm91cCBpbnRlcm5hbAorICogTWFya3MgZ3JvdXAKKyAqIEB3YXJuaW5nIEludGVybmFsIEFQSToKKyAqICAgLSBJdCBpcyBub3Qgc2hpcHBlZCB0byBvdXRzaWRlIG9mIEludGVsCisgKiAgIC0gSXQgaXMgZGVsaXZlcmVkIHRvIGludGVybmFsIEludGVsIHRlYW1zIHVzaW5nIGUtbWFpbCBvciBTVk4gYWNjZXNzIG9ubHkKKyAqIEB7CisgKi8KKy8qKiBAYnJpZWYgdXNlciBtYXJrIHR5cGUgKi8KK3R5cGVkZWYgaW50IF9faXR0X21hcmtfdHlwZTsKKworLyoqCisgKiBAYnJpZWYgQ3JlYXRlcyBhIHVzZXIgbWFyayB0eXBlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIHVzaW5nIGNoYXIgb3IgVW5pY29kZSBzdHJpbmcuCisgKiBAcGFyYW1baW5dIG5hbWUgLSBuYW1lIG9mIG1hcmsgdG8gY3JlYXRlCisgKiBAcmV0dXJuIFJldHVybnMgYSBoYW5kbGUgdG8gdGhlIG1hcmsgdHlwZQorICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitfX2l0dF9tYXJrX3R5cGUgSVRUQVBJIF9faXR0X21hcmtfY3JlYXRlQShjb25zdCBjaGFyICAgICpuYW1lKTsKK19faXR0X21hcmtfdHlwZSBJVFRBUEkgX19pdHRfbWFya19jcmVhdGVXKGNvbnN0IHdjaGFyX3QgKm5hbWUpOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZSAgICAgX19pdHRfbWFya19jcmVhdGVXCisjICBkZWZpbmUgX19pdHRfbWFya19jcmVhdGVfcHRyIF9faXR0X21hcmtfY3JlYXRlV19wdHIKKyNlbHNlIC8qIFVOSUNPREUgKi8KKyMgIGRlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZSAgICAgX19pdHRfbWFya19jcmVhdGVBCisjICBkZWZpbmUgX19pdHRfbWFya19jcmVhdGVfcHRyIF9faXR0X21hcmtfY3JlYXRlQV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK19faXR0X21hcmtfdHlwZSBJVFRBUEkgX19pdHRfbWFya19jcmVhdGUoY29uc3QgY2hhciAqbmFtZSk7CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfbWFya190eXBlLCBtYXJrX2NyZWF0ZUEsIChjb25zdCBjaGFyICAgICpuYW1lKSkKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfbWFya190eXBlLCBtYXJrX2NyZWF0ZVcsIChjb25zdCB3Y2hhcl90ICpuYW1lKSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfbWFya190eXBlLCBtYXJrX2NyZWF0ZSwgIChjb25zdCBjaGFyICpuYW1lKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbWFya19jcmVhdGVBICAgICBJVFROT1RJRllfREFUQShtYXJrX2NyZWF0ZUEpCisjZGVmaW5lIF9faXR0X21hcmtfY3JlYXRlQV9wdHIgSVRUTk9USUZZX05BTUUobWFya19jcmVhdGVBKQorI2RlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZVcgICAgIElUVE5PVElGWV9EQVRBKG1hcmtfY3JlYXRlVykKKyNkZWZpbmUgX19pdHRfbWFya19jcmVhdGVXX3B0ciBJVFROT1RJRllfTkFNRShtYXJrX2NyZWF0ZVcpCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfbWFya19jcmVhdGUgICAgICBJVFROT1RJRllfREFUQShtYXJrX2NyZWF0ZSkKKyNkZWZpbmUgX19pdHRfbWFya19jcmVhdGVfcHRyICBJVFROT1RJRllfTkFNRShtYXJrX2NyZWF0ZSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X21hcmtfY3JlYXRlQShuYW1lKSAoX19pdHRfbWFya190eXBlKTAKKyNkZWZpbmUgX19pdHRfbWFya19jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X21hcmtfY3JlYXRlVyhuYW1lKSAoX19pdHRfbWFya190eXBlKTAKKyNkZWZpbmUgX19pdHRfbWFya19jcmVhdGVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfbWFya19jcmVhdGUobmFtZSkgIChfX2l0dF9tYXJrX3R5cGUpMAorI2RlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZV9wdHIgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfbWFya19jcmVhdGVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfbWFya19jcmVhdGVfcHRyICAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIENyZWF0ZXMgYSAiZGlzY3JldGUiIHVzZXIgbWFyayB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBhbmQgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIHVzaW5nIGNoYXIgb3IgVW5pY29kZSBzdHJpbmcuCisgKgorICogLSBUaGUgbWFyayBvZiAiZGlzY3JldGUiIHR5cGUgaXMgcGxhY2VkIHRvIGNvbGxlY3Rpb24gcmVzdWx0cyBpbiBjYXNlIG9mIHN1Y2Nlc3MuIEl0IGFwcGVhcnMgaW4gb3ZlcnRpbWUgdmlldyhzKSBhcyBhIHNwZWNpYWwgdGljayBzaWduLgorICogLSBUaGUgY2FsbCBpcyAic3luY2hyb25vdXMiIC0gZnVuY3Rpb24gcmV0dXJucyBhZnRlciBtYXJrIGlzIGFjdHVhbGx5IGFkZGVkIHRvIHJlc3VsdHMuCisgKiAtIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsLCBmb3IgZXhhbXBsZSwgdG8gbWFyayBkaWZmZXJlbnQgcGhhc2VzIG9mIGFwcGxpY2F0aW9uCisgKiAgIChiZWdpbm5pbmcgb2YgdGhlIG5leHQgbWFyayBhdXRvbWF0aWNhbGx5IG1lYW5kIGVuZCBvZiBjdXJyZW50IHJlZ2lvbikuCisgKiAtIENhbiBiZSB1c2VkIHRvZ2V0aGVyIHdpdGggImNvbnRpbnVvdXMiIG1hcmtzIChzZWUgYmVsb3cpIGF0IHRoZSBzYW1lIGNvbGxlY3Rpb24gc2Vzc2lvbgorICogQHBhcmFtW2luXSBtdCAtIG1hcmssIGNyZWF0ZWQgYnkgX19pdHRfbWFya19jcmVhdGUoY29uc3QgY2hhciogbmFtZSkgZnVuY3Rpb24KKyAqIEBwYXJhbVtpbl0gcGFyYW1ldGVyIC0gc3RyaW5nIHBhcmFtZXRlciBvZiBtYXJrCisgKiBAcmV0dXJuIFJldHVybnMgemVybyB2YWx1ZSBpbiBjYXNlIG9mIHN1Y2Nlc3MsIG5vbi16ZXJvIHZhbHVlIG90aGVyd2lzZS4KKyAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgoraW50IElUVEFQSSBfX2l0dF9tYXJrQShfX2l0dF9tYXJrX3R5cGUgbXQsIGNvbnN0IGNoYXIgICAgKnBhcmFtZXRlcik7CitpbnQgSVRUQVBJIF9faXR0X21hcmtXKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3Qgd2NoYXJfdCAqcGFyYW1ldGVyKTsKKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjICBkZWZpbmUgX19pdHRfbWFyayAgICAgX19pdHRfbWFya1cKKyMgIGRlZmluZSBfX2l0dF9tYXJrX3B0ciBfX2l0dF9tYXJrV19wdHIKKyNlbHNlIC8qIFVOSUNPREUgICovCisjICBkZWZpbmUgX19pdHRfbWFyayAgICAgX19pdHRfbWFya0EKKyMgIGRlZmluZSBfX2l0dF9tYXJrX3B0ciBfX2l0dF9tYXJrQV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK2ludCBJVFRBUEkgX19pdHRfbWFyayhfX2l0dF9tYXJrX3R5cGUgbXQsIGNvbnN0IGNoYXIgKnBhcmFtZXRlcik7CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKElUVEFQSSwgaW50LCBtYXJrQSwgKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3QgY2hhciAgICAqcGFyYW1ldGVyKSkKK0lUVF9TVFVCKElUVEFQSSwgaW50LCBtYXJrVywgKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3Qgd2NoYXJfdCAqcGFyYW1ldGVyKSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKElUVEFQSSwgaW50LCBtYXJrLCAgKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3QgY2hhciAqcGFyYW1ldGVyKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbWFya0EgICAgIElUVE5PVElGWV9EQVRBKG1hcmtBKQorI2RlZmluZSBfX2l0dF9tYXJrQV9wdHIgSVRUTk9USUZZX05BTUUobWFya0EpCisjZGVmaW5lIF9faXR0X21hcmtXICAgICBJVFROT1RJRllfREFUQShtYXJrVykKKyNkZWZpbmUgX19pdHRfbWFya1dfcHRyIElUVE5PVElGWV9OQU1FKG1hcmtXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X21hcmsgICAgICBJVFROT1RJRllfREFUQShtYXJrKQorI2RlZmluZSBfX2l0dF9tYXJrX3B0ciAgSVRUTk9USUZZX05BTUUobWFyaykKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X21hcmtBKG10LCBwYXJhbWV0ZXIpIChpbnQpMAorI2RlZmluZSBfX2l0dF9tYXJrQV9wdHIgMAorI2RlZmluZSBfX2l0dF9tYXJrVyhtdCwgcGFyYW1ldGVyKSAoaW50KTAKKyNkZWZpbmUgX19pdHRfbWFya1dfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9tYXJrKG10LCBwYXJhbWV0ZXIpICAoaW50KTAKKyNkZWZpbmUgX19pdHRfbWFya19wdHIgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tYXJrQV9wdHIgMAorI2RlZmluZSBfX2l0dF9tYXJrV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X21hcmtfcHRyICAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIFVzZSB0aGlzIGlmIG5lY2Vzc2FyeSB0byBjcmVhdGUgYSAiZGlzY3JldGUiIHVzZXIgZXZlbnQgdHlwZSAobWFyaykgZm9yIHByb2Nlc3MKKyAqIHJhdGhlciB0aGVuIGZvciBvbmUgdGhyZWFkCisgKiBAc2VlIGludCBfX2l0dF9tYXJrKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3QgY2hhciogcGFyYW1ldGVyKTsKKyAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgoraW50IElUVEFQSSBfX2l0dF9tYXJrX2dsb2JhbEEoX19pdHRfbWFya190eXBlIG10LCBjb25zdCBjaGFyICAgICpwYXJhbWV0ZXIpOworaW50IElUVEFQSSBfX2l0dF9tYXJrX2dsb2JhbFcoX19pdHRfbWFya190eXBlIG10LCBjb25zdCB3Y2hhcl90ICpwYXJhbWV0ZXIpOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF9tYXJrX2dsb2JhbCAgICAgX19pdHRfbWFya19nbG9iYWxXCisjICBkZWZpbmUgX19pdHRfbWFya19nbG9iYWxfcHRyIF9faXR0X21hcmtfZ2xvYmFsV19wdHIKKyNlbHNlIC8qIFVOSUNPREUgICovCisjICBkZWZpbmUgX19pdHRfbWFya19nbG9iYWwgICAgIF9faXR0X21hcmtfZ2xvYmFsQQorIyAgZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsX3B0ciBfX2l0dF9tYXJrX2dsb2JhbEFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitpbnQgSVRUQVBJIF9faXR0X21hcmtfZ2xvYmFsKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3QgY2hhciAqcGFyYW1ldGVyKTsKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBpbnQsIG1hcmtfZ2xvYmFsQSwgKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3QgY2hhciAgICAqcGFyYW1ldGVyKSkKK0lUVF9TVFVCKElUVEFQSSwgaW50LCBtYXJrX2dsb2JhbFcsIChfX2l0dF9tYXJrX3R5cGUgbXQsIGNvbnN0IHdjaGFyX3QgKnBhcmFtZXRlcikpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihJVFRBUEksIGludCwgbWFya19nbG9iYWwsICAoX19pdHRfbWFya190eXBlIG10LCBjb25zdCBjaGFyICpwYXJhbWV0ZXIpKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbEEgICAgIElUVE5PVElGWV9EQVRBKG1hcmtfZ2xvYmFsQSkKKyNkZWZpbmUgX19pdHRfbWFya19nbG9iYWxBX3B0ciBJVFROT1RJRllfTkFNRShtYXJrX2dsb2JhbEEpCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsVyAgICAgSVRUTk9USUZZX0RBVEEobWFya19nbG9iYWxXKQorI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbFdfcHRyIElUVE5PVElGWV9OQU1FKG1hcmtfZ2xvYmFsVykKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbCAgICAgIElUVE5PVElGWV9EQVRBKG1hcmtfZ2xvYmFsKQorI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbF9wdHIgIElUVE5PVElGWV9OQU1FKG1hcmtfZ2xvYmFsKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbWFya19nbG9iYWxBKG10LCBwYXJhbWV0ZXIpIChpbnQpMAorI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbEFfcHRyIDAKKyNkZWZpbmUgX19pdHRfbWFya19nbG9iYWxXKG10LCBwYXJhbWV0ZXIpIChpbnQpMAorI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbFdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbChtdCwgcGFyYW1ldGVyKSAgKGludCkwCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsX3B0ciAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsQV9wdHIgMAorI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbFdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbF9wdHIgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgQ3JlYXRlcyBhbiAiZW5kIiBwb2ludCBmb3IgImNvbnRpbnVvdXMiIG1hcmsgd2l0aCBzcGVjaWZpZWQgbmFtZS4KKyAqCisgKiAtIFJldHVybnMgemVybyB2YWx1ZSBpbiBjYXNlIG9mIHN1Y2Nlc3MsIG5vbi16ZXJvIHZhbHVlIG90aGVyd2lzZS4KKyAqICAgQWxzbyByZXR1cm5zIG5vbi16ZXJvIHZhbHVlIHdoZW4gcHJlY2VkaW5nICJiZWdpbiIgcG9pbnQgZm9yIHRoZQorICogICBtYXJrIHdpdGggdGhlIHNhbWUgbmFtZSBmYWlsZWQgdG8gYmUgY3JlYXRlZCBvciBub3QgY3JlYXRlZC4KKyAqIC0gVGhlIG1hcmsgb2YgImNvbnRpbnVvdXMiIHR5cGUgaXMgcGxhY2VkIHRvIGNvbGxlY3Rpb24gcmVzdWx0cyBpbgorICogICBjYXNlIG9mIHN1Y2Nlc3MuIEl0IGFwcGVhcnMgaW4gb3ZlcnRpbWUgdmlldyhzKSBhcyBhIHNwZWNpYWwgdGljaworICogICBzaWduIChkaWZmZXJlbnQgZnJvbSAiZGlzY3JldGUiIG1hcmspIHRvZ2V0aGVyIHdpdGggbGluZSBmcm9tCisgKiAgIGNvcnJlc3BvbmRpbmcgImJlZ2luIiBtYXJrIHRvICJlbmQiIG1hcmsuCisgKiBAbm90ZSBDb250aW51b3VzIG1hcmtzIGNhbiBvdmVybGFwIGFuZCBiZSBuZXN0ZWQgaW5zaWRlIGVhY2ggb3RoZXIuCisgKiBEaXNjcmV0ZSBtYXJrIGNhbiBiZSBuZXN0ZWQgaW5zaWRlIG1hcmtlZCByZWdpb24KKyAqIEBwYXJhbVtpbl0gbXQgLSBtYXJrLCBjcmVhdGVkIGJ5IF9faXR0X21hcmtfY3JlYXRlKGNvbnN0IGNoYXIqIG5hbWUpIGZ1bmN0aW9uCisgKiBAcmV0dXJuIFJldHVybnMgemVybyB2YWx1ZSBpbiBjYXNlIG9mIHN1Y2Nlc3MsIG5vbi16ZXJvIHZhbHVlIG90aGVyd2lzZS4KKyAqLworaW50IElUVEFQSSBfX2l0dF9tYXJrX29mZihfX2l0dF9tYXJrX3R5cGUgbXQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQihJVFRBUEksIGludCwgbWFya19vZmYsIChfX2l0dF9tYXJrX3R5cGUgbXQpKQorI2RlZmluZSBfX2l0dF9tYXJrX29mZiAgICAgSVRUTk9USUZZX0RBVEEobWFya19vZmYpCisjZGVmaW5lIF9faXR0X21hcmtfb2ZmX3B0ciBJVFROT1RJRllfTkFNRShtYXJrX29mZikKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X21hcmtfb2ZmKG10KSAoaW50KTAKKyNkZWZpbmUgX19pdHRfbWFya19vZmZfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9tYXJrX29mZl9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBVc2UgdGhpcyBpZiBuZWNlc3NhcnkgdG8gY3JlYXRlIGFuICJlbmQiIHBvaW50IGZvciBtYXJrIG9mIHByb2Nlc3MKKyAqIEBzZWUgaW50IF9faXR0X21hcmtfb2ZmKF9faXR0X21hcmtfdHlwZSBtdCk7CisgKi8KK2ludCBJVFRBUEkgX19pdHRfbWFya19nbG9iYWxfb2ZmKF9faXR0X21hcmtfdHlwZSBtdCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCKElUVEFQSSwgaW50LCBtYXJrX2dsb2JhbF9vZmYsIChfX2l0dF9tYXJrX3R5cGUgbXQpKQorI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbF9vZmYgICAgIElUVE5PVElGWV9EQVRBKG1hcmtfZ2xvYmFsX29mZikKKyNkZWZpbmUgX19pdHRfbWFya19nbG9iYWxfb2ZmX3B0ciBJVFROT1RJRllfTkFNRShtYXJrX2dsb2JhbF9vZmYpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbF9vZmYobXQpIChpbnQpMAorI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbF9vZmZfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbF9vZmZfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSBtYXJrcyBncm91cCAqLworCisvKioKKyAqIEBkZWZncm91cCBjb3VudGVyc19pbnRlcm5hbCBDb3VudGVycworICogQGluZ3JvdXAgaW50ZXJuYWwKKyAqIENvdW50ZXJzIGdyb3VwCisgKiBAeworICovCisvKioKKyAqIEBicmllZiBvcGFxdWUgc3RydWN0dXJlIGZvciBjb3VudGVyIGlkZW50aWZpY2F0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IF9fX2l0dF9jb3VudGVyICpfX2l0dF9jb3VudGVyOworCisvKioKKyAqIEBicmllZiBDcmVhdGUgYSBjb3VudGVyIHdpdGggZ2l2ZW4gbmFtZS9kb21haW4gZm9yIHRoZSBjYWxsaW5nIHRocmVhZAorICoKKyAqIEFmdGVyIF9faXR0X2NvdW50ZXJfY3JlYXRlKCkgaXMgY2FsbGVkLCBfX2l0dF9jb3VudGVyX2luYygpIC8gX19pdHRfY291bnRlcl9pbmNfZGVsdGEoKSBjYW4gYmUgdXNlZAorICogdG8gaW5jcmVtZW50IHRoZSBjb3VudGVyIG9uIGFueSB0aHJlYWQKKyAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorX19pdHRfY291bnRlciBJVFRBUEkgX19pdHRfY291bnRlcl9jcmVhdGVBKGNvbnN0IGNoYXIgICAgKm5hbWUsIGNvbnN0IGNoYXIgICAgKmRvbWFpbik7CitfX2l0dF9jb3VudGVyIElUVEFQSSBfX2l0dF9jb3VudGVyX2NyZWF0ZVcoY29uc3Qgd2NoYXJfdCAqbmFtZSwgY29uc3Qgd2NoYXJfdCAqZG9tYWluKTsKKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjICBkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGUgICAgIF9faXR0X2NvdW50ZXJfY3JlYXRlVworIyAgZGVmaW5lIF9faXR0X2NvdW50ZXJfY3JlYXRlX3B0ciBfX2l0dF9jb3VudGVyX2NyZWF0ZVdfcHRyCisjZWxzZSAvKiBVTklDT0RFICovCisjICBkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGUgICAgIF9faXR0X2NvdW50ZXJfY3JlYXRlQQorIyAgZGVmaW5lIF9faXR0X2NvdW50ZXJfY3JlYXRlX3B0ciBfX2l0dF9jb3VudGVyX2NyZWF0ZUFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitfX2l0dF9jb3VudGVyIElUVEFQSSBfX2l0dF9jb3VudGVyX2NyZWF0ZShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkb21haW4pOworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2NvdW50ZXIsIGNvdW50ZXJfY3JlYXRlQSwgKGNvbnN0IGNoYXIgICAgKm5hbWUsIGNvbnN0IGNoYXIgICAgKmRvbWFpbikpCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2NvdW50ZXIsIGNvdW50ZXJfY3JlYXRlVywgKGNvbnN0IHdjaGFyX3QgKm5hbWUsIGNvbnN0IHdjaGFyX3QgKmRvbWFpbikpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2NvdW50ZXIsIGNvdW50ZXJfY3JlYXRlLCAgKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRvbWFpbikpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfY3JlYXRlQSAgICAgSVRUTk9USUZZX0RBVEEoY291bnRlcl9jcmVhdGVBKQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2NyZWF0ZUFfcHRyIElUVE5PVElGWV9OQU1FKGNvdW50ZXJfY3JlYXRlQSkKKyNkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGVXICAgICBJVFROT1RJRllfREFUQShjb3VudGVyX2NyZWF0ZVcpCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfY3JlYXRlV19wdHIgSVRUTk9USUZZX05BTUUoY291bnRlcl9jcmVhdGVXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfY3JlYXRlICAgICBJVFROT1RJRllfREFUQShjb3VudGVyX2NyZWF0ZSkKKyNkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGVfcHRyIElUVE5PVElGWV9OQU1FKGNvdW50ZXJfY3JlYXRlKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGVBKG5hbWUsIGRvbWFpbikKKyNkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfY3JlYXRlVyhuYW1lLCBkb21haW4pCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfY3JlYXRlKG5hbWUsIGRvbWFpbikKKyNkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGVfcHRyICAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfY3JlYXRlX3B0ciAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBEZXN0cm95IHRoZSBjb3VudGVyIGlkZW50aWZpZWQgYnkgdGhlIHBvaW50ZXIgcHJldmlvdXNseSByZXR1cm5lZCBieSBfX2l0dF9jb3VudGVyX2NyZWF0ZSgpCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2NvdW50ZXJfZGVzdHJveShfX2l0dF9jb3VudGVyIGlkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgY291bnRlcl9kZXN0cm95LCAoX19pdHRfY291bnRlciBpZCkpCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfZGVzdHJveSAgICAgSVRUTk9USUZZX1ZPSUQoY291bnRlcl9kZXN0cm95KQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2Rlc3Ryb3lfcHRyIElUVE5PVElGWV9OQU1FKGNvdW50ZXJfZGVzdHJveSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfZGVzdHJveShpZCkKKyNkZWZpbmUgX19pdHRfY291bnRlcl9kZXN0cm95X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfY291bnRlcl9kZXN0cm95X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIEluY3JlbWVudCB0aGUgY291bnRlciB2YWx1ZQorICovCit2b2lkIElUVEFQSSBfX2l0dF9jb3VudGVyX2luYyhfX2l0dF9jb3VudGVyIGlkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgY291bnRlcl9pbmMsIChfX2l0dF9jb3VudGVyIGlkKSkKKyNkZWZpbmUgX19pdHRfY291bnRlcl9pbmMgICAgIElUVE5PVElGWV9WT0lEKGNvdW50ZXJfaW5jKQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2luY19wdHIgSVRUTk9USUZZX05BTUUoY291bnRlcl9pbmMpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9jb3VudGVyX2luYyhpZCkKKyNkZWZpbmUgX19pdHRfY291bnRlcl9pbmNfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9jb3VudGVyX2luY19wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBJbmNyZW1lbnQgdGhlIGNvdW50ZXIgdmFsdWUgd2l0aCB4CisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2NvdW50ZXJfaW5jX2RlbHRhKF9faXR0X2NvdW50ZXIgaWQsIHVuc2lnbmVkIGxvbmcgbG9uZyB2YWx1ZSk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGNvdW50ZXJfaW5jX2RlbHRhLCAoX19pdHRfY291bnRlciBpZCwgdW5zaWduZWQgbG9uZyBsb25nIHZhbHVlKSkKKyNkZWZpbmUgX19pdHRfY291bnRlcl9pbmNfZGVsdGEgICAgIElUVE5PVElGWV9WT0lEKGNvdW50ZXJfaW5jX2RlbHRhKQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2luY19kZWx0YV9wdHIgSVRUTk9USUZZX05BTUUoY291bnRlcl9pbmNfZGVsdGEpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9jb3VudGVyX2luY19kZWx0YShpZCwgdmFsdWUpCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfaW5jX2RlbHRhX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfY291bnRlcl9pbmNfZGVsdGFfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSBjb3VudGVycyBncm91cCAqLworCisvKioKKyAqIEBkZWZncm91cCBzdGl0Y2ggU3RhY2sgU3RpdGNoaW5nCisgKiBAaW5ncm91cCBpbnRlcm5hbAorICogU3RhY2sgU3RpdGNoaW5nIGdyb3VwCisgKiBAeworICovCisvKioKKyAqIEBicmllZiBvcGFxdWUgc3RydWN0dXJlIGZvciBjb3VudGVyIGlkZW50aWZpY2F0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IF9fX2l0dF9jYWxsZXIgKl9faXR0X2NhbGxlcjsKKworLyoqCisgKiBAYnJpZWYgQ3JlYXRlIHRoZSBzdGl0Y2ggcG9pbnQgZS5nLiBhIHBvaW50IGluIGNhbGwgc3RhY2sgd2hlcmUgb3RoZXIgc3RhY2tzIHNob3VsZCBiZSBzdGl0Y2hlZCB0by4KKyAqIFRoZSBmdW5jdGlvbiByZXR1cm5zIGEgdW5pcXVlIGlkZW50aWZpZXIgd2hpY2ggaXMgdXNlZCB0byBtYXRjaCB0aGUgY3V0IHBvaW50cyB3aXRoIGNvcnJlc3BvbmRpbmcgc3RpdGNoIHBvaW50cy4KKyAqLworX19pdHRfY2FsbGVyIElUVEFQSSBfX2l0dF9zdGFja19jYWxsZXJfY3JlYXRlKHZvaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2NhbGxlciwgc3RhY2tfY2FsbGVyX2NyZWF0ZSwgKHZvaWQpKQorI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZXJfY3JlYXRlICAgICBJVFROT1RJRllfREFUQShzdGFja19jYWxsZXJfY3JlYXRlKQorI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZXJfY3JlYXRlX3B0ciBJVFROT1RJRllfTkFNRShzdGFja19jYWxsZXJfY3JlYXRlKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc3RhY2tfY2FsbGVyX2NyZWF0ZSgpIChfX2l0dF9jYWxsZXIpMAorI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZXJfY3JlYXRlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfc3RhY2tfY2FsbGVyX2NyZWF0ZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBEZXN0cm95IHRoZSBpbmZvcmFtdGlvbiBhYm91dCBzdGl0Y2ggcG9pbnQgaWRlbnRpZmllZCBieSB0aGUgcG9pbnRlciBwcmV2aW91c2x5IHJldHVybmVkIGJ5IF9faXR0X3N0YWNrX2NhbGxlcl9jcmVhdGUoKQorICovCit2b2lkIElUVEFQSSBfX2l0dF9zdGFja19jYWxsZXJfZGVzdHJveShfX2l0dF9jYWxsZXIgaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzdGFja19jYWxsZXJfZGVzdHJveSwgKF9faXR0X2NhbGxlciBpZCkpCisjZGVmaW5lIF9faXR0X3N0YWNrX2NhbGxlcl9kZXN0cm95ICAgICBJVFROT1RJRllfVk9JRChzdGFja19jYWxsZXJfZGVzdHJveSkKKyNkZWZpbmUgX19pdHRfc3RhY2tfY2FsbGVyX2Rlc3Ryb3lfcHRyIElUVE5PVElGWV9OQU1FKHN0YWNrX2NhbGxlcl9kZXN0cm95KQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc3RhY2tfY2FsbGVyX2Rlc3Ryb3koaWQpCisjZGVmaW5lIF9faXR0X3N0YWNrX2NhbGxlcl9kZXN0cm95X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfc3RhY2tfY2FsbGVyX2Rlc3Ryb3lfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgU2V0cyB0aGUgY3V0IHBvaW50LiBTdGFjayBmcm9tIGVhY2ggZXZlbnQgd2hpY2ggb2NjdXJzIGFmdGVyIHRoaXMgY2FsbCB3aWxsIGJlIGN1dAorICogYXQgdGhlIHNhbWUgc3RhY2sgbGV2ZWwgdGhlIGZ1bmN0aW9uIHdhcyBjYWxsZWQgYW5kIHN0aXRjaGVkIHRvIHRoZSBjb3JyZXNwb25kaW5nIHN0aXRjaCBwb2ludC4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfc3RhY2tfY2FsbGVlX2VudGVyKF9faXR0X2NhbGxlciBpZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN0YWNrX2NhbGxlZV9lbnRlciwgKF9faXR0X2NhbGxlciBpZCkpCisjZGVmaW5lIF9faXR0X3N0YWNrX2NhbGxlZV9lbnRlciAgICAgSVRUTk9USUZZX1ZPSUQoc3RhY2tfY2FsbGVlX2VudGVyKQorI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZWVfZW50ZXJfcHRyIElUVE5PVElGWV9OQU1FKHN0YWNrX2NhbGxlZV9lbnRlcikKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3N0YWNrX2NhbGxlZV9lbnRlcihpZCkKKyNkZWZpbmUgX19pdHRfc3RhY2tfY2FsbGVlX2VudGVyX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfc3RhY2tfY2FsbGVlX2VudGVyX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIFRoaXMgZnVuY3Rpb24gZWxpbWluYXRlcyB0aGUgY3V0IHBvaW50IHdoaWNoIHdhcyBzZXQgYnkgbGF0ZXN0IF9faXR0X3N0YWNrX2NhbGxlZV9lbnRlcigpLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9zdGFja19jYWxsZWVfbGVhdmUoX19pdHRfY2FsbGVyIGlkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3RhY2tfY2FsbGVlX2xlYXZlLCAoX19pdHRfY2FsbGVyIGlkKSkKKyNkZWZpbmUgX19pdHRfc3RhY2tfY2FsbGVlX2xlYXZlICAgICBJVFROT1RJRllfVk9JRChzdGFja19jYWxsZWVfbGVhdmUpCisjZGVmaW5lIF9faXR0X3N0YWNrX2NhbGxlZV9sZWF2ZV9wdHIgSVRUTk9USUZZX05BTUUoc3RhY2tfY2FsbGVlX2xlYXZlKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc3RhY2tfY2FsbGVlX2xlYXZlKGlkKQorI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZWVfbGVhdmVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZWVfbGVhdmVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqIEB9IHN0aXRjaCBncm91cCAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLwordHlwZWRlZiBlbnVtIF9faXR0X2Vycm9yX2NvZGUKK3sKKyAgICBfX2l0dF9lcnJvcl9zdWNjZXNzICAgICAgID0gMCwgLyohPCBubyBlcnJvciAqLworICAgIF9faXR0X2Vycm9yX25vX21vZHVsZSAgICAgPSAxLCAvKiE8IG1vZHVsZSBjYW4ndCBiZSBsb2FkZWQgKi8KKyAgICAvKiAlMSRzIC0tIGxpYnJhcnkgbmFtZTsgd2luOiAlMiRkIC0tIHN5c3RlbSBlcnJvciBjb2RlOyB1bng6ICUyJHMgLS0gc3lzdGVtIGVycm9yIG1lc3NhZ2UuICovCisgICAgX19pdHRfZXJyb3Jfbm9fc3ltYm9sICAgICA9IDIsIC8qITwgc3ltYm9sIG5vdCBmb3VuZCAqLworICAgIC8qICUxJHMgLS0gbGlicmFyeSBuYW1lLCAlMiRzIC0tIHN5bWJvbCBuYW1lLiAqLworICAgIF9faXR0X2Vycm9yX3Vua25vd25fZ3JvdXAgPSAzLCAvKiE8IHVua25vd24gZ3JvdXAgc3BlY2lmaWVkICovCisgICAgLyogJTEkcyAtLSBlbnYgdmFyIG5hbWUsICUyJHMgLS0gZ3JvdXAgbmFtZS4gKi8KKyAgICBfX2l0dF9lcnJvcl9jYW50X3JlYWRfZW52ID0gNCwgLyohPCBHZXRFbnZpcm9ubWVudFZhcmlhYmxlKCkgZmFpbGVkICovCisgICAgLyogJTEkcyAtLSBlbnYgdmFyIG5hbWUsICUyJGQgLS0gc3lzdGVtIGVycm9yLiAqLworICAgIF9faXR0X2Vycm9yX2Vudl90b29fbG9uZyAgPSA1LCAvKiE8IHZhcmlhYmxlIHZhbHVlIHRvbyBsb25nICovCisgICAgLyogJTEkcyAtLSBlbnYgdmFyIG5hbWUsICUyJGQgLS0gYWN0dWFsIGxlbmd0aCBvZiB0aGUgdmFyLCAlMyRkIC0tIG1heCBhbGxvd2VkIGxlbmd0aC4gKi8KKyAgICBfX2l0dF9lcnJvcl9zeXN0ZW0gICAgICAgID0gNiAgLyohPCBwdGhyZWFkX211dGV4YXR0cl9pbml0IG9yIHB0aHJlYWRfbXV0ZXhfaW5pdCBmYWlsZWQgKi8KKyAgICAvKiAlMSRzIC0tIGZ1bmN0aW9uIG5hbWUsICUyJGQgLS0gZXJybm8uICovCit9IF9faXR0X2Vycm9yX2NvZGU7CisKK3R5cGVkZWYgdm9pZCAoX19pdHRfZXJyb3JfaGFuZGxlcl90KShfX2l0dF9lcnJvcl9jb2RlIGNvZGUsIHZhX2xpc3QpOworX19pdHRfZXJyb3JfaGFuZGxlcl90KiBfX2l0dF9zZXRfZXJyb3JfaGFuZGxlcihfX2l0dF9lcnJvcl9oYW5kbGVyX3QqKTsKKworY29uc3QgY2hhciogSVRUQVBJIF9faXR0X2FwaV92ZXJzaW9uKHZvaWQpOworLyoqIEBlbmRjb25kICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNkZWZpbmUgX19pdHRfZXJyb3JfaGFuZGxlciBJVFRfSk9JTihJTlRFTF9JVFROT1RJRllfUFJFRklYLCBlcnJvcl9oYW5kbGVyKQordm9pZCBfX2l0dF9lcnJvcl9oYW5kbGVyKF9faXR0X2Vycm9yX2NvZGUgY29kZSwgdmFfbGlzdCBhcmdzKTsKK2V4dGVybiBjb25zdCBpbnQgSVRUTk9USUZZX05BTUUoZXJyKTsKKyNkZWZpbmUgX19pdHRfZXJyIElUVE5PVElGWV9OQU1FKGVycikKK0lUVF9TVFVCKElUVEFQSSwgY29uc3QgY2hhciosIGFwaV92ZXJzaW9uLCAodm9pZCkpCisjZGVmaW5lIF9faXR0X2FwaV92ZXJzaW9uICAgICBJVFROT1RJRllfREFUQShhcGlfdmVyc2lvbikKKyNkZWZpbmUgX19pdHRfYXBpX3ZlcnNpb25fcHRyIElUVE5PVElGWV9OQU1FKGFwaV92ZXJzaW9uKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfYXBpX3ZlcnNpb24oKSAgIChjb25zdCBjaGFyKikwCisjZGVmaW5lIF9faXR0X2FwaV92ZXJzaW9uX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfYXBpX3ZlcnNpb25fcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmIC8qIF9JVFROT1RJRllfUFJJVkFURV8gKi8KKworI2VuZGlmIC8qIElOVEVMX0lUVE5PVElGWV9BUElfUFJJVkFURSAqLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvaXR0bm90aWZ5X2NvbmZpZy5oIGIvZmluYWwvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvaXR0bm90aWZ5X2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMGJiZTkKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9pdHRub3RpZnlfY29uZmlnLmgKQEAgLTAsMCArMSw0NzggQEAKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfSVRUTk9USUZZX0NPTkZJR19IXworI2RlZmluZSBfSVRUTk9USUZZX0NPTkZJR19IXworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSVRUX09TX1dJTgorIyAgZGVmaW5lIElUVF9PU19XSU4gICAxCisjZW5kaWYgLyogSVRUX09TX1dJTiAqLworCisjaWZuZGVmIElUVF9PU19MSU5VWAorIyAgZGVmaW5lIElUVF9PU19MSU5VWCAyCisjZW5kaWYgLyogSVRUX09TX0xJTlVYICovCisKKyNpZm5kZWYgSVRUX09TX01BQworIyAgZGVmaW5lIElUVF9PU19NQUMgICAzCisjZW5kaWYgLyogSVRUX09TX01BQyAqLworCisjaWZuZGVmIElUVF9PUworIyAgaWYgZGVmaW5lZCBXSU4zMiB8fCBkZWZpbmVkIF9XSU4zMgorIyAgICBkZWZpbmUgSVRUX09TIElUVF9PU19XSU4KKyMgIGVsaWYgZGVmaW5lZCggX19BUFBMRV9fICkgJiYgZGVmaW5lZCggX19NQUNIX18gKQorIyAgICBkZWZpbmUgSVRUX09TIElUVF9PU19NQUMKKyMgIGVsc2UKKyMgICAgZGVmaW5lIElUVF9PUyBJVFRfT1NfTElOVVgKKyMgIGVuZGlmCisjZW5kaWYgLyogSVRUX09TICovCisKKyNpZm5kZWYgSVRUX1BMQVRGT1JNX1dJTgorIyAgZGVmaW5lIElUVF9QTEFURk9STV9XSU4gMQorI2VuZGlmIC8qIElUVF9QTEFURk9STV9XSU4gKi8KKworI2lmbmRlZiBJVFRfUExBVEZPUk1fUE9TSVgKKyMgIGRlZmluZSBJVFRfUExBVEZPUk1fUE9TSVggMgorI2VuZGlmIC8qIElUVF9QTEFURk9STV9QT1NJWCAqLworCisjaWZuZGVmIElUVF9QTEFURk9STV9NQUMKKyMgIGRlZmluZSBJVFRfUExBVEZPUk1fTUFDIDMKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk1fTUFDICovCisKKyNpZm5kZWYgSVRUX1BMQVRGT1JNCisjICBpZiBJVFRfT1M9PUlUVF9PU19XSU4KKyMgICAgZGVmaW5lIElUVF9QTEFURk9STSBJVFRfUExBVEZPUk1fV0lOCisjICBlbGlmIElUVF9PUz09SVRUX09TX01BQworIyAgICBkZWZpbmUgSVRUX1BMQVRGT1JNIElUVF9QTEFURk9STV9NQUMKKyMgIGVsc2UKKyMgICAgZGVmaW5lIElUVF9QTEFURk9STSBJVFRfUExBVEZPUk1fUE9TSVgKKyMgIGVuZGlmCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNICovCisKKyNpZiBkZWZpbmVkKF9VTklDT0RFKSAmJiAhZGVmaW5lZChVTklDT0RFKQorI2RlZmluZSBVTklDT0RFCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2luY2x1ZGUgPHRjaGFyLmg+CisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorI2luY2x1ZGUgPHdjaGFyLmg+CisjZW5kaWYgLyogVU5JQ09ERSB8fCBfVU5JQ09ERSAqLworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisjaWZuZGVmIENERUNMCisjICBpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyMgICAgZGVmaW5lIENERUNMIF9fY2RlY2wKKyMgIGVsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjICAgIGlmIGRlZmluZWQgX01fSVg4NiB8fCBkZWZpbmVkIF9faTM4Nl9fIAorIyAgICAgIGRlZmluZSBDREVDTCBfX2F0dHJpYnV0ZV9fICgoY2RlY2wpKQorIyAgICBlbHNlICAvKiBfTV9JWDg2IHx8IF9faTM4Nl9fICovCisjICAgICAgZGVmaW5lIENERUNMIC8qIGFjdHVhbCBvbmx5IG9uIHg4NiBwbGF0Zm9ybSAqLworIyAgICBlbmRpZiAvKiBfTV9JWDg2IHx8IF9faTM4Nl9fICovCisjICBlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBDREVDTCAqLworCisjaWZuZGVmIFNURENBTEwKKyMgIGlmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorIyAgICBkZWZpbmUgU1REQ0FMTCBfX3N0ZGNhbGwKKyMgIGVsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjICAgIGlmIGRlZmluZWQgX01fSVg4NiB8fCBkZWZpbmVkIF9faTM4Nl9fCisjICAgICAgZGVmaW5lIFNURENBTEwgX19hdHRyaWJ1dGVfXyAoKHN0ZGNhbGwpKSAKKyMgICAgZWxzZSAgLyogX01fSVg4NiB8fCBfX2kzODZfXyAqLworIyAgICAgIGRlZmluZSBTVERDQUxMIC8qIHN1cHBvcnRlZCBvbmx5IG9uIHg4NiBwbGF0Zm9ybSAqLworIyAgICBlbmRpZiAvKiBfTV9JWDg2IHx8IF9faTM4Nl9fICovCisjICBlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBTVERDQUxMICovCisKKyNkZWZpbmUgSVRUQVBJICAgIENERUNMCisjZGVmaW5lIExJQklUVEFQSSBDREVDTAorCisvKiBUT0RPOiBUZW1wb3JhcnkgZm9yIGNvbXBhdGliaWxpdHkhICovCisjZGVmaW5lIElUVEFQSV9DQUxMICAgIENERUNMCisjZGVmaW5lIExJQklUVEFQSV9DQUxMIENERUNMCisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKy8qIHVzZSBfX2ZvcmNlaW5saW5lIChWQysrIHNwZWNpZmljKSAqLworI2RlZmluZSBJVFRfSU5MSU5FICAgICAgICAgICBfX2ZvcmNlaW5saW5lCisjZGVmaW5lIElUVF9JTkxJTkVfQVRUUklCVVRFIC8qIG5vdGhpbmcgKi8KKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKy8qCisgKiBHZW5lcmFsbHksIGZ1bmN0aW9ucyBhcmUgbm90IGlubGluZWQgdW5sZXNzIG9wdGltaXphdGlvbiBpcyBzcGVjaWZpZWQuCisgKiBGb3IgZnVuY3Rpb25zIGRlY2xhcmVkIGlubGluZSwgdGhpcyBhdHRyaWJ1dGUgaW5saW5lcyB0aGUgZnVuY3Rpb24gZXZlbgorICogaWYgbm8gb3B0aW1pemF0aW9uIGxldmVsIHdhcyBzcGVjaWZpZWQuCisgKi8KKyNpZmRlZiBfX1NUUklDVF9BTlNJX18KKyNkZWZpbmUgSVRUX0lOTElORSAgICAgICAgICAgc3RhdGljCisjZGVmaW5lIElUVF9JTkxJTkVfQVRUUklCVVRFIF9fYXR0cmlidXRlX18oKHVudXNlZCkpCisjZWxzZSAgLyogX19TVFJJQ1RfQU5TSV9fICovCisjZGVmaW5lIElUVF9JTkxJTkUgICAgICAgICAgIHN0YXRpYyBpbmxpbmUKKyNkZWZpbmUgSVRUX0lOTElORV9BVFRSSUJVVEUgX19hdHRyaWJ1dGVfXygoYWx3YXlzX2lubGluZSwgdW51c2VkKSkKKyNlbmRpZiAvKiBfX1NUUklDVF9BTlNJX18gKi8KKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKy8qKiBAZW5kY29uZCAqLworCisjaWZuZGVmIElUVF9BUkNIX0lBMzIKKyMgIGRlZmluZSBJVFRfQVJDSF9JQTMyICAxCisjZW5kaWYgLyogSVRUX0FSQ0hfSUEzMiAqLworCisjaWZuZGVmIElUVF9BUkNIX0lBMzJFCisjICBkZWZpbmUgSVRUX0FSQ0hfSUEzMkUgMgorI2VuZGlmIC8qIElUVF9BUkNIX0lBMzJFICovCisKKy8qIFdhcyB0aGVyZSBhIG1hZ2ljYWwgcmVhc29uIHdlIGRpZG4ndCBoYXZlIDMgaGVyZSBiZWZvcmU/ICovCisjaWZuZGVmIElUVF9BUkNIX0FBUkNINjQKKyMgIGRlZmluZSBJVFRfQVJDSF9BQVJDSDY0ICAzCisjZW5kaWYgLyogSVRUX0FSQ0hfQUFSQ0g2NCAqLworCisjaWZuZGVmIElUVF9BUkNIX0FSTQorIyAgZGVmaW5lIElUVF9BUkNIX0FSTSAgNAorI2VuZGlmIC8qIElUVF9BUkNIX0FSTSAqLworCisjaWZuZGVmIElUVF9BUkNIX1BQQzY0CisjICBkZWZpbmUgSVRUX0FSQ0hfUFBDNjQgIDUKKyNlbmRpZiAvKiBJVFRfQVJDSF9QUEM2NCAqLworCisKKyNpZm5kZWYgSVRUX0FSQ0gKKyMgIGlmIGRlZmluZWQgX01fSVg4NiB8fCBkZWZpbmVkIF9faTM4Nl9fCisjICAgIGRlZmluZSBJVFRfQVJDSCBJVFRfQVJDSF9JQTMyCisjICBlbGlmIGRlZmluZWQgX01fWDY0IHx8IGRlZmluZWQgX01fQU1ENjQgfHwgZGVmaW5lZCBfX3g4Nl82NF9fCisjICAgIGRlZmluZSBJVFRfQVJDSCBJVFRfQVJDSF9JQTMyRQorIyAgZWxpZiBkZWZpbmVkIF9NX0lBNjQgfHwgZGVmaW5lZCBfX2lhNjRfXworIyAgICBkZWZpbmUgSVRUX0FSQ0ggSVRUX0FSQ0hfSUE2NAorIyAgZWxpZiBkZWZpbmVkIF9NX0FSTSB8fCBfX2FybV9fCisjICAgIGRlZmluZSBJVFRfQVJDSCBJVFRfQVJDSF9BUk0KKyMgIGVsaWYgZGVmaW5lZCBfX3Bvd2VycGM2NF9fCisjICAgIGRlZmluZSBJVFRfQVJDSCBJVFRfQVJDSF9QUEM2NAorIyAgZWxpZiBkZWZpbmVkIF9fYWFyY2g2NF9fCisjICAgIGRlZmluZSBJVFRfQVJDSCBJVFRfQVJDSF9BQVJDSDY0CisjICBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworIyAgZGVmaW5lIElUVF9FWFRFUk5fQyBleHRlcm4gIkMiCisjICBkZWZpbmUgSVRUX0VYVEVSTl9DX0JFR0lOIGV4dGVybiAiQyIgeworIyAgZGVmaW5lIElUVF9FWFRFUk5fQ19FTkQgfQorI2Vsc2UKKyMgIGRlZmluZSBJVFRfRVhURVJOX0MgLyogbm90aGluZyAqLworIyAgZGVmaW5lIElUVF9FWFRFUk5fQ19CRUdJTiAvKiBub3RoaW5nICovCisjICBkZWZpbmUgSVRUX0VYVEVSTl9DX0VORCAvKiBub3RoaW5nICovCisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2RlZmluZSBJVFRfVE9fU1RSX0FVWCh4KSAjeAorI2RlZmluZSBJVFRfVE9fU1RSKHgpICAgICBJVFRfVE9fU1RSX0FVWCh4KQorCisjZGVmaW5lIF9fSVRUX0JVSUxEX0FTU0VSVChleHByLCBzdWZmaXgpIGRvIHsgXAorICAgIHN0YXRpYyBjaGFyIF9faXR0X2J1aWxkX2NoZWNrXyMjc3VmZml4WyhleHByKSA/IDEgOiAtMV07IFwKKyAgICBfX2l0dF9idWlsZF9jaGVja18jI3N1ZmZpeFswXSA9IDA7IFwKK30gd2hpbGUoMCkKKyNkZWZpbmUgX0lUVF9CVUlMRF9BU1NFUlQoZXhwciwgc3VmZml4KSAgX19JVFRfQlVJTERfQVNTRVJUKChleHByKSwgc3VmZml4KQorI2RlZmluZSBJVFRfQlVJTERfQVNTRVJUKGV4cHIpICAgICAgICAgICBfSVRUX0JVSUxEX0FTU0VSVCgoZXhwciksIF9fTElORV9fKQorCisjZGVmaW5lIElUVF9NQUdJQyB7IDB4RUQsIDB4QUIsIDB4QUIsIDB4RUMsIDB4MEQsIDB4RUUsIDB4REEsIDB4MzAgfQorCisvKiBSZXBsYWNlIHdpdGggc25hcHNob3QgZGF0ZSBZWVlZTU1ERCBmb3IgcHJvbW90aW9uIGJ1aWxkLiAqLworI2RlZmluZSBBUElfVkVSU0lPTl9CVUlMRCAgICAyMDExMTExMQorCisjaWZuZGVmIEFQSV9WRVJTSU9OX05VTQorI2RlZmluZSBBUElfVkVSU0lPTl9OVU0gMC4wLjAKKyNlbmRpZiAvKiBBUElfVkVSU0lPTl9OVU0gKi8KKworI2RlZmluZSBBUElfVkVSU0lPTiAiSVRULUFQSS1WZXJzaW9uICIgSVRUX1RPX1NUUihBUElfVkVSU0lPTl9OVU0pIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAoIiBJVFRfVE9fU1RSKEFQSV9WRVJTSU9OX0JVSUxEKSAiKSIKKworLyogT1MgY29tbXVuaWNhdGlvbiBmdW5jdGlvbnMgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+Cit0eXBlZGVmIEhNT0RVTEUgICAgICAgICAgIGxpYl90OwordHlwZWRlZiBEV09SRCAgICAgICAgICAgICBUSURUOwordHlwZWRlZiBDUklUSUNBTF9TRUNUSU9OICBtdXRleF90OworI2RlZmluZSBNVVRFWF9JTklUSUFMSVpFUiB7IDAgfQorI2RlZmluZSBzdHJvbmdfYWxpYXMobmFtZSwgYWxpYXNuYW1lKSAvKiBlbXB0eSBmb3IgV2luZG93cyAqLworI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2luY2x1ZGUgPGRsZmNuLmg+CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorI2luY2x1ZGUgPHdjaGFyLmg+CisjZW5kaWYgLyogVU5JQ09ERSAqLworI2lmbmRlZiBfR05VX1NPVVJDRQorI2RlZmluZSBfR05VX1NPVVJDRSAxIC8qIG5lZWQgZm9yIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFICovCisjZW5kaWYgLyogX0dOVV9TT1VSQ0UgKi8KKyNpZm5kZWYgX19VU0VfVU5JWDk4CisjZGVmaW5lIF9fVVNFX1VOSVg5OCAxIC8qIG5lZWQgZm9yIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFLCBvbiBTTEVTMTEuMSB3aXRoIGdjYyA0LjMuNCB3aGVyZWluIHB0aHJlYWQuaCBtaXNzaW5nIGRlcGVuZGVuY3kgb24gX19VU0VfWE9QRU4ySzggKi8KKyNlbmRpZiAvKl9fVVNFX1VOSVg5OCovCisjaW5jbHVkZSA8cHRocmVhZC5oPgordHlwZWRlZiB2b2lkKiAgICAgICAgICAgICBsaWJfdDsKK3R5cGVkZWYgcHRocmVhZF90ICAgICAgICAgVElEVDsKK3R5cGVkZWYgcHRocmVhZF9tdXRleF90ICAgbXV0ZXhfdDsKKyNkZWZpbmUgTVVURVhfSU5JVElBTElaRVIgUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUgorI2RlZmluZSBfc3Ryb25nX2FsaWFzKG5hbWUsIGFsaWFzbmFtZSkgXAorICAgICAgICAgICAgZXh0ZXJuIF9fdHlwZW9mIChuYW1lKSBhbGlhc25hbWUgX19hdHRyaWJ1dGVfXyAoKGFsaWFzICgjbmFtZSkpKTsKKyNkZWZpbmUgc3Ryb25nX2FsaWFzKG5hbWUsIGFsaWFzbmFtZSkgX3N0cm9uZ19hbGlhcyhuYW1lLCBhbGlhc25hbWUpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfZ2V0X3Byb2MobGliLCBuYW1lKSBHZXRQcm9jQWRkcmVzcyhsaWIsIG5hbWUpCisjZGVmaW5lIF9faXR0X211dGV4X2luaXQobXV0ZXgpICAgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbihtdXRleCkKKyNkZWZpbmUgX19pdHRfbXV0ZXhfbG9jayhtdXRleCkgICBFbnRlckNyaXRpY2FsU2VjdGlvbihtdXRleCkKKyNkZWZpbmUgX19pdHRfbXV0ZXhfdW5sb2NrKG11dGV4KSBMZWF2ZUNyaXRpY2FsU2VjdGlvbihtdXRleCkKKyNkZWZpbmUgX19pdHRfbG9hZF9saWIobmFtZSkgICAgICBMb2FkTGlicmFyeUEobmFtZSkKKyNkZWZpbmUgX19pdHRfdW5sb2FkX2xpYihoYW5kbGUpICBGcmVlTGlicmFyeShoYW5kbGUpCisjZGVmaW5lIF9faXR0X3N5c3RlbV9lcnJvcigpICAgICAgKGludClHZXRMYXN0RXJyb3IoKQorI2RlZmluZSBfX2l0dF9mc3RyY21wKHMxLCBzMikgICAgIGxzdHJjbXBBKHMxLCBzMikKKyNkZWZpbmUgX19pdHRfZnN0cmxlbihzKSAgICAgICAgICBsc3RybGVuQShzKQorI2RlZmluZSBfX2l0dF9mc3RyY3B5bihzMSwgczIsIGwpIGxzdHJjcHluQShzMSwgczIsIGwpCisjZGVmaW5lIF9faXR0X2ZzdHJkdXAocykgICAgICAgICAgX3N0cmR1cChzKQorI2RlZmluZSBfX2l0dF90aHJlYWRfaWQoKSAgICAgICAgIEdldEN1cnJlbnRUaHJlYWRJZCgpCisjZGVmaW5lIF9faXR0X3RocmVhZF95aWVsZCgpICAgICAgU3dpdGNoVG9UaHJlYWQoKQorI2lmbmRlZiBJVFRfU0lNUExFX0lOSVQKK0lUVF9JTkxJTkUgbG9uZworX19pdHRfaW50ZXJsb2NrZWRfaW5jcmVtZW50KHZvbGF0aWxlIGxvbmcqIHB0cikgSVRUX0lOTElORV9BVFRSSUJVVEU7CitJVFRfSU5MSU5FIGxvbmcgX19pdHRfaW50ZXJsb2NrZWRfaW5jcmVtZW50KHZvbGF0aWxlIGxvbmcqIHB0cikKK3sKKyAgICByZXR1cm4gSW50ZXJsb2NrZWRJbmNyZW1lbnQocHRyKTsKK30KKyNlbmRpZiAvKiBJVFRfU0lNUExFX0lOSVQgKi8KKyNlbHNlIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9nZXRfcHJvYyhsaWIsIG5hbWUpIGRsc3ltKGxpYiwgbmFtZSkKKyNkZWZpbmUgX19pdHRfbXV0ZXhfaW5pdChtdXRleCkgICB7XAorICAgIHB0aHJlYWRfbXV0ZXhhdHRyX3QgbXV0ZXhfYXR0cjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgZXJyb3JfY29kZSA9IHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQoJm11dGV4X2F0dHIpOyAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGVycm9yX2NvZGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfX2l0dF9yZXBvcnRfZXJyb3IoX19pdHRfZXJyb3Jfc3lzdGVtLCAicHRocmVhZF9tdXRleGF0dHJfaW5pdCIsICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX2NvZGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZXJyb3JfY29kZSA9IHB0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUoJm11dGV4X2F0dHIsICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFKTsgICAgICAgIFwKKyAgICBpZiAoZXJyb3JfY29kZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF9faXR0X3JlcG9ydF9lcnJvcihfX2l0dF9lcnJvcl9zeXN0ZW0sICJwdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlIiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfY29kZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlcnJvcl9jb2RlID0gcHRocmVhZF9tdXRleF9pbml0KG11dGV4LCAmbXV0ZXhfYXR0cik7ICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGVycm9yX2NvZGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfX2l0dF9yZXBvcnRfZXJyb3IoX19pdHRfZXJyb3Jfc3lzdGVtLCAicHRocmVhZF9tdXRleF9pbml0IiwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX2NvZGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZXJyb3JfY29kZSA9IHB0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3koJm11dGV4X2F0dHIpOyAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChlcnJvcl9jb2RlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX19pdHRfcmVwb3J0X2Vycm9yKF9faXR0X2Vycm9yX3N5c3RlbSwgInB0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3kiLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9jb2RlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2RlZmluZSBfX2l0dF9tdXRleF9sb2NrKG11dGV4KSAgIHB0aHJlYWRfbXV0ZXhfbG9jayhtdXRleCkKKyNkZWZpbmUgX19pdHRfbXV0ZXhfdW5sb2NrKG11dGV4KSBwdGhyZWFkX211dGV4X3VubG9jayhtdXRleCkKKyNkZWZpbmUgX19pdHRfbG9hZF9saWIobmFtZSkgICAgICBkbG9wZW4obmFtZSwgUlRMRF9MQVpZKQorI2RlZmluZSBfX2l0dF91bmxvYWRfbGliKGhhbmRsZSkgIGRsY2xvc2UoaGFuZGxlKQorI2RlZmluZSBfX2l0dF9zeXN0ZW1fZXJyb3IoKSAgICAgIGVycm5vCisjZGVmaW5lIF9faXR0X2ZzdHJjbXAoczEsIHMyKSAgICAgc3RyY21wKHMxLCBzMikKKyNkZWZpbmUgX19pdHRfZnN0cmxlbihzKSAgICAgICAgICBzdHJsZW4ocykKKyNkZWZpbmUgX19pdHRfZnN0cmNweW4oczEsIHMyLCBsKSBzdHJuY3B5KHMxLCBzMiwgbCkKKyNkZWZpbmUgX19pdHRfZnN0cmR1cChzKSAgICAgICAgICBzdHJkdXAocykKKyNkZWZpbmUgX19pdHRfdGhyZWFkX2lkKCkgICAgICAgICBwdGhyZWFkX3NlbGYoKQorI2RlZmluZSBfX2l0dF90aHJlYWRfeWllbGQoKSAgICAgIHNjaGVkX3lpZWxkKCkKKyNpZiBJVFRfQVJDSD09SVRUX0FSQ0hfSUE2NAorI2lmZGVmIF9fSU5URUxfQ09NUElMRVIKKyNkZWZpbmUgX19UQkJfbWFjaGluZV9mZXRjaGFkZDQoYWRkciwgdmFsKSBfX2ZldGNoYWRkNF9hY3EoKHZvaWQgKilhZGRyLCB2YWwpCisjZWxzZSAgLyogX19JTlRFTF9DT01QSUxFUiAqLworLyogVE9ETzogQWRkIFN1cHBvcnQgZm9yIG5vdCBJbnRlbCBjb21waWxlcnMgZm9yIElBLTY0IGFyY2hpdGVjdHVyZSAqLworI2VuZGlmIC8qIF9fSU5URUxfQ09NUElMRVIgKi8KKyNlbGlmIElUVF9BUkNIPT1JVFRfQVJDSF9JQTMyIHx8IElUVF9BUkNIPT1JVFRfQVJDSF9JQTMyRSAvKiBJVFRfQVJDSCE9SVRUX0FSQ0hfSUE2NCAqLworSVRUX0lOTElORSBsb25nCitfX1RCQl9tYWNoaW5lX2ZldGNoYWRkNCh2b2xhdGlsZSB2b2lkKiBwdHIsIGxvbmcgYWRkZW5kKSBJVFRfSU5MSU5FX0FUVFJJQlVURTsKK0lUVF9JTkxJTkUgbG9uZyBfX1RCQl9tYWNoaW5lX2ZldGNoYWRkNCh2b2xhdGlsZSB2b2lkKiBwdHIsIGxvbmcgYWRkZW5kKQoreworICAgIGxvbmcgcmVzdWx0OworICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJsb2NrXG54YWRkICUwLCUxIgorICAgICAgICAgICAgICAgICAgICAgICAgICA6ICI9ciIocmVzdWx0KSwiPW0iKCooaW50KilwdHIpCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogIjAiKGFkZGVuZCksICJtIigqKGludCopcHRyKQorICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJtZW1vcnkiKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorI2VsaWYgSVRUX0FSQ0g9PUlUVF9BUkNIX0FSTSB8fCBJVFRfQVJDSD09SVRUX0FSQ0hfUFBDNjQgfHwgSVRUX0FSQ0g9PUlUVF9BUkNIX0FBUkNINjQKKyNkZWZpbmUgX19UQkJfbWFjaGluZV9mZXRjaGFkZDQoYWRkciwgdmFsKSBfX3N5bmNfZmV0Y2hfYW5kX2FkZChhZGRyLCB2YWwpCisjZW5kaWYgLyogSVRUX0FSQ0g9PUlUVF9BUkNIX0lBNjQgKi8KKyNpZm5kZWYgSVRUX1NJTVBMRV9JTklUCitJVFRfSU5MSU5FIGxvbmcKK19faXR0X2ludGVybG9ja2VkX2luY3JlbWVudCh2b2xhdGlsZSBsb25nKiBwdHIpIElUVF9JTkxJTkVfQVRUUklCVVRFOworSVRUX0lOTElORSBsb25nIF9faXR0X2ludGVybG9ja2VkX2luY3JlbWVudCh2b2xhdGlsZSBsb25nKiBwdHIpCit7CisgICAgcmV0dXJuIF9fVEJCX21hY2hpbmVfZmV0Y2hhZGQ0KHB0ciwgMSkgKyAxTDsKK30KKyNlbmRpZiAvKiBJVFRfU0lNUExFX0lOSVQgKi8KKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBfX2l0dF9jb2xsZWN0aW9uX25vcm1hbCA9IDAsCisgICAgX19pdHRfY29sbGVjdGlvbl9wYXVzZWQgPSAxCit9IF9faXR0X2NvbGxlY3Rpb25fc3RhdGU7CisKK3R5cGVkZWYgZW51bSB7CisgICAgX19pdHRfdGhyZWFkX25vcm1hbCAgPSAwLAorICAgIF9faXR0X3RocmVhZF9pZ25vcmVkID0gMQorfSBfX2l0dF90aHJlYWRfc3RhdGU7CisKKyNwcmFnbWEgcGFjayhwdXNoLCA4KQorCit0eXBlZGVmIHN0cnVjdCBfX19pdHRfdGhyZWFkX2luZm8KK3sKKyAgICBjb25zdCBjaGFyKiBuYW1lQTsgLyohPCBDb3B5IG9mIG9yaWdpbmFsIG5hbWUgaW4gQVNDSUkuICovCisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorICAgIGNvbnN0IHdjaGFyX3QqIG5hbWVXOyAvKiE8IENvcHkgb2Ygb3JpZ2luYWwgbmFtZSBpbiBVTklDT0RFLiAqLworI2Vsc2UgIC8qIFVOSUNPREUgfHwgX1VOSUNPREUgKi8KKyAgICB2b2lkKiBuYW1lVzsKKyNlbmRpZiAvKiBVTklDT0RFIHx8IF9VTklDT0RFICovCisgICAgVElEVCAgICAgICAgICAgICAgIHRpZDsKKyAgICBfX2l0dF90aHJlYWRfc3RhdGUgc3RhdGU7ICAgLyohPCBUaHJlYWQgc3RhdGUgKHBhdXNlZCBvciBub3JtYWwpICovCisgICAgaW50ICAgICAgICAgICAgICAgIGV4dHJhMTsgIC8qITwgUmVzZXJ2ZWQgdG8gdGhlIHJ1bnRpbWUgKi8KKyAgICB2b2lkKiAgICAgICAgICAgICAgZXh0cmEyOyAgLyohPCBSZXNlcnZlZCB0byB0aGUgcnVudGltZSAqLworICAgIHN0cnVjdCBfX19pdHRfdGhyZWFkX2luZm8qIG5leHQ7Cit9IF9faXR0X3RocmVhZF9pbmZvOworCisjaW5jbHVkZSAiaXR0bm90aWZ5X3R5cGVzLmgiIC8qIEZvciBfX2l0dF9ncm91cF9pZCBkZWZpbml0aW9uICovCisKK3R5cGVkZWYgc3RydWN0IF9fX2l0dF9hcGlfaW5mb18yMDEwMTAwMQoreworICAgIGNvbnN0IGNoYXIqICAgIG5hbWU7CisgICAgdm9pZCoqICAgICAgICAgZnVuY19wdHI7CisgICAgdm9pZCogICAgICAgICAgaW5pdF9mdW5jOworICAgIF9faXR0X2dyb3VwX2lkIGdyb3VwOworfSAgX19pdHRfYXBpX2luZm9fMjAxMDEwMDE7CisKK3R5cGVkZWYgc3RydWN0IF9fX2l0dF9hcGlfaW5mbworeworICAgIGNvbnN0IGNoYXIqICAgIG5hbWU7CisgICAgdm9pZCoqICAgICAgICAgZnVuY19wdHI7CisgICAgdm9pZCogICAgICAgICAgaW5pdF9mdW5jOworICAgIHZvaWQqICAgICAgICAgIG51bGxfZnVuYzsKKyAgICBfX2l0dF9ncm91cF9pZCBncm91cDsKK30gIF9faXR0X2FwaV9pbmZvOworCitzdHJ1Y3QgX19faXR0X2RvbWFpbjsKK3N0cnVjdCBfX19pdHRfc3RyaW5nX2hhbmRsZTsKKwordHlwZWRlZiBzdHJ1Y3QgX19faXR0X2dsb2JhbAoreworICAgIHVuc2lnbmVkIGNoYXIgICAgICAgICAgbWFnaWNbOF07CisgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICB2ZXJzaW9uX21ham9yOworICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgdmVyc2lvbl9taW5vcjsKKyAgICB1bnNpZ25lZCBsb25nICAgICAgICAgIHZlcnNpb25fYnVpbGQ7CisgICAgdm9sYXRpbGUgbG9uZyAgICAgICAgICBhcGlfaW5pdGlhbGl6ZWQ7CisgICAgdm9sYXRpbGUgbG9uZyAgICAgICAgICBtdXRleF9pbml0aWFsaXplZDsKKyAgICB2b2xhdGlsZSBsb25nICAgICAgICAgIGF0b21pY19jb3VudGVyOworICAgIG11dGV4X3QgICAgICAgICAgICAgICAgbXV0ZXg7CisgICAgbGliX3QgICAgICAgICAgICAgICAgICBsaWI7CisgICAgdm9pZCogICAgICAgICAgICAgICAgICBlcnJvcl9oYW5kbGVyOworICAgIGNvbnN0IGNoYXIqKiAgICAgICAgICAgZGxsX3BhdGhfcHRyOworICAgIF9faXR0X2FwaV9pbmZvKiAgICAgICAgYXBpX2xpc3RfcHRyOworICAgIHN0cnVjdCBfX19pdHRfZ2xvYmFsKiAgbmV4dDsKKyAgICAvKiBKb2luYWJsZSBzdHJ1Y3R1cmVzIGJlbG93ICovCisgICAgX19pdHRfdGhyZWFkX2luZm8qICAgICB0aHJlYWRfbGlzdDsKKyAgICBzdHJ1Y3QgX19faXR0X2RvbWFpbiogIGRvbWFpbl9saXN0OworICAgIHN0cnVjdCBfX19pdHRfc3RyaW5nX2hhbmRsZSogc3RyaW5nX2xpc3Q7CisgICAgX19pdHRfY29sbGVjdGlvbl9zdGF0ZSBzdGF0ZTsKK30gX19pdHRfZ2xvYmFsOworCisjcHJhZ21hIHBhY2socG9wKQorCisjZGVmaW5lIE5FV19USFJFQURfSU5GT19XKGdwdHIsaCxoX3RhaWwsdCxzLG4pIHsgXAorICAgIGggPSAoX19pdHRfdGhyZWFkX2luZm8qKW1hbGxvYyhzaXplb2YoX19pdHRfdGhyZWFkX2luZm8pKTsgXAorICAgIGlmIChoICE9IE5VTEwpIHsgXAorICAgICAgICBoLT50aWQgICAgPSB0OyBcCisgICAgICAgIGgtPm5hbWVBICA9IE5VTEw7IFwKKyAgICAgICAgaC0+bmFtZVcgID0gbiA/IF93Y3NkdXAobikgOiBOVUxMOyBcCisgICAgICAgIGgtPnN0YXRlICA9IHM7IFwKKyAgICAgICAgaC0+ZXh0cmExID0gMDsgICAgLyogcmVzZXJ2ZWQgKi8gXAorICAgICAgICBoLT5leHRyYTIgPSBOVUxMOyAvKiByZXNlcnZlZCAqLyBcCisgICAgICAgIGgtPm5leHQgICA9IE5VTEw7IFwKKyAgICAgICAgaWYgKGhfdGFpbCA9PSBOVUxMKSBcCisgICAgICAgICAgICAoZ3B0ciktPnRocmVhZF9saXN0ID0gaDsgXAorICAgICAgICBlbHNlIFwKKyAgICAgICAgICAgIGhfdGFpbC0+bmV4dCA9IGg7IFwKKyAgICB9IFwKK30KKworI2RlZmluZSBORVdfVEhSRUFEX0lORk9fQShncHRyLGgsaF90YWlsLHQscyxuKSB7IFwKKyAgICBoID0gKF9faXR0X3RocmVhZF9pbmZvKiltYWxsb2Moc2l6ZW9mKF9faXR0X3RocmVhZF9pbmZvKSk7IFwKKyAgICBpZiAoaCAhPSBOVUxMKSB7IFwKKyAgICAgICAgaC0+dGlkICAgID0gdDsgXAorICAgICAgICBoLT5uYW1lQSAgPSBuID8gX19pdHRfZnN0cmR1cChuKSA6IE5VTEw7IFwKKyAgICAgICAgaC0+bmFtZVcgID0gTlVMTDsgXAorICAgICAgICBoLT5zdGF0ZSAgPSBzOyBcCisgICAgICAgIGgtPmV4dHJhMSA9IDA7ICAgIC8qIHJlc2VydmVkICovIFwKKyAgICAgICAgaC0+ZXh0cmEyID0gTlVMTDsgLyogcmVzZXJ2ZWQgKi8gXAorICAgICAgICBoLT5uZXh0ICAgPSBOVUxMOyBcCisgICAgICAgIGlmIChoX3RhaWwgPT0gTlVMTCkgXAorICAgICAgICAgICAgKGdwdHIpLT50aHJlYWRfbGlzdCA9IGg7IFwKKyAgICAgICAgZWxzZSBcCisgICAgICAgICAgICBoX3RhaWwtPm5leHQgPSBoOyBcCisgICAgfSBcCit9CisKKyNkZWZpbmUgTkVXX0RPTUFJTl9XKGdwdHIsaCxoX3RhaWwsbmFtZSkgeyBcCisgICAgaCA9IChfX2l0dF9kb21haW4qKW1hbGxvYyhzaXplb2YoX19pdHRfZG9tYWluKSk7IFwKKyAgICBpZiAoaCAhPSBOVUxMKSB7IFwKKyAgICAgICAgaC0+ZmxhZ3MgID0gMDsgICAgLyogZG9tYWluIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgKi8gXAorICAgICAgICBoLT5uYW1lQSAgPSBOVUxMOyBcCisgICAgICAgIGgtPm5hbWVXICA9IG5hbWUgPyBfd2NzZHVwKG5hbWUpIDogTlVMTDsgXAorICAgICAgICBoLT5leHRyYTEgPSAwOyAgICAvKiByZXNlcnZlZCAqLyBcCisgICAgICAgIGgtPmV4dHJhMiA9IE5VTEw7IC8qIHJlc2VydmVkICovIFwKKyAgICAgICAgaC0+bmV4dCAgID0gTlVMTDsgXAorICAgICAgICBpZiAoaF90YWlsID09IE5VTEwpIFwKKyAgICAgICAgICAgIChncHRyKS0+ZG9tYWluX2xpc3QgPSBoOyBcCisgICAgICAgIGVsc2UgXAorICAgICAgICAgICAgaF90YWlsLT5uZXh0ID0gaDsgXAorICAgIH0gXAorfQorCisjZGVmaW5lIE5FV19ET01BSU5fQShncHRyLGgsaF90YWlsLG5hbWUpIHsgXAorICAgIGggPSAoX19pdHRfZG9tYWluKiltYWxsb2Moc2l6ZW9mKF9faXR0X2RvbWFpbikpOyBcCisgICAgaWYgKGggIT0gTlVMTCkgeyBcCisgICAgICAgIGgtPmZsYWdzICA9IDA7ICAgIC8qIGRvbWFpbiBpcyBkaXNhYmxlZCBieSBkZWZhdWx0ICovIFwKKyAgICAgICAgaC0+bmFtZUEgID0gbmFtZSA/IF9faXR0X2ZzdHJkdXAobmFtZSkgOiBOVUxMOyBcCisgICAgICAgIGgtPm5hbWVXICA9IE5VTEw7IFwKKyAgICAgICAgaC0+ZXh0cmExID0gMDsgICAgLyogcmVzZXJ2ZWQgKi8gXAorICAgICAgICBoLT5leHRyYTIgPSBOVUxMOyAvKiByZXNlcnZlZCAqLyBcCisgICAgICAgIGgtPm5leHQgICA9IE5VTEw7IFwKKyAgICAgICAgaWYgKGhfdGFpbCA9PSBOVUxMKSBcCisgICAgICAgICAgICAoZ3B0ciktPmRvbWFpbl9saXN0ID0gaDsgXAorICAgICAgICBlbHNlIFwKKyAgICAgICAgICAgIGhfdGFpbC0+bmV4dCA9IGg7IFwKKyAgICB9IFwKK30KKworI2RlZmluZSBORVdfU1RSSU5HX0hBTkRMRV9XKGdwdHIsaCxoX3RhaWwsbmFtZSkgeyBcCisgICAgaCA9IChfX2l0dF9zdHJpbmdfaGFuZGxlKiltYWxsb2Moc2l6ZW9mKF9faXR0X3N0cmluZ19oYW5kbGUpKTsgXAorICAgIGlmIChoICE9IE5VTEwpIHsgXAorICAgICAgICBoLT5zdHJBICAgPSBOVUxMOyBcCisgICAgICAgIGgtPnN0clcgICA9IG5hbWUgPyBfd2NzZHVwKG5hbWUpIDogTlVMTDsgXAorICAgICAgICBoLT5leHRyYTEgPSAwOyAgICAvKiByZXNlcnZlZCAqLyBcCisgICAgICAgIGgtPmV4dHJhMiA9IE5VTEw7IC8qIHJlc2VydmVkICovIFwKKyAgICAgICAgaC0+bmV4dCAgID0gTlVMTDsgXAorICAgICAgICBpZiAoaF90YWlsID09IE5VTEwpIFwKKyAgICAgICAgICAgIChncHRyKS0+c3RyaW5nX2xpc3QgPSBoOyBcCisgICAgICAgIGVsc2UgXAorICAgICAgICAgICAgaF90YWlsLT5uZXh0ID0gaDsgXAorICAgIH0gXAorfQorCisjZGVmaW5lIE5FV19TVFJJTkdfSEFORExFX0EoZ3B0cixoLGhfdGFpbCxuYW1lKSB7IFwKKyAgICBoID0gKF9faXR0X3N0cmluZ19oYW5kbGUqKW1hbGxvYyhzaXplb2YoX19pdHRfc3RyaW5nX2hhbmRsZSkpOyBcCisgICAgaWYgKGggIT0gTlVMTCkgeyBcCisgICAgICAgIGgtPnN0ckEgICA9IG5hbWUgPyBfX2l0dF9mc3RyZHVwKG5hbWUpIDogTlVMTDsgXAorICAgICAgICBoLT5zdHJXICAgPSBOVUxMOyBcCisgICAgICAgIGgtPmV4dHJhMSA9IDA7ICAgIC8qIHJlc2VydmVkICovIFwKKyAgICAgICAgaC0+ZXh0cmEyID0gTlVMTDsgLyogcmVzZXJ2ZWQgKi8gXAorICAgICAgICBoLT5uZXh0ICAgPSBOVUxMOyBcCisgICAgICAgIGlmIChoX3RhaWwgPT0gTlVMTCkgXAorICAgICAgICAgICAgKGdwdHIpLT5zdHJpbmdfbGlzdCA9IGg7IFwKKyAgICAgICAgZWxzZSBcCisgICAgICAgICAgICBoX3RhaWwtPm5leHQgPSBoOyBcCisgICAgfSBcCit9CisKKyNlbmRpZiAvKiBfSVRUTk9USUZZX0NPTkZJR19IXyAqLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvaXR0bm90aWZ5X3N0YXRpYy5jIGIvZmluYWwvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvaXR0bm90aWZ5X3N0YXRpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMmE4NTkKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9pdHRub3RpZnlfc3RhdGljLmMKQEAgLTAsMCArMSwxMDUxIEBACisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJrbXBfY29uZmlnLmgiCisjaW5jbHVkZSAiaXR0bm90aWZ5X2NvbmZpZy5oIgorCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIFBBVEhfTUFYIDUxMgorI2Vsc2UgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8ZGxmY24uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgSU5URUxfTk9fTUFDUk9fQk9EWSAKKyNkZWZpbmUgSU5URUxfSVRUTk9USUZZX0FQSV9QUklWQVRFCisjaW5jbHVkZSAiaXR0bm90aWZ5LmgiCisjaW5jbHVkZSAibGVnYWN5L2l0dG5vdGlmeS5oIgorCisjaW5jbHVkZSAiZGlzYWJsZV93YXJuaW5ncy5oIgorCitzdGF0aWMgY29uc3QgY2hhciBhcGlfdmVyc2lvbltdID0gQVBJX1ZFUlNJT04gIlwwXG5AKCMpICRSZXZpc2lvbjogNDMzNzUgJFxuIjsKKworI2RlZmluZSBfTl8obikgSVRUX0pPSU4oSU5URUxfSVRUTk9USUZZX1BSRUZJWCxuKQorCisjaWYgSVRUX09TPT1JVFRfT1NfV0lOCitzdGF0aWMgY29uc3QgY2hhciogaXR0bm90aWZ5X2xpYl9uYW1lID0gImxpYml0dG5vdGlmeS5kbGwiOworI2VsaWYgSVRUX09TPT1JVFRfT1NfTElOVVgKK3N0YXRpYyBjb25zdCBjaGFyKiBpdHRub3RpZnlfbGliX25hbWUgPSAibGliaXR0bm90aWZ5LnNvIjsKKyNlbGlmIElUVF9PUz09SVRUX09TX01BQworc3RhdGljIGNvbnN0IGNoYXIqIGl0dG5vdGlmeV9saWJfbmFtZSA9ICJsaWJpdHRub3RpZnkuZHlsaWIiOworI2Vsc2UKKyNlcnJvciBVbnN1cHBvcnRlZCBvciB1bmtub3duIE9TLgorI2VuZGlmCisKKyNpZmRlZiBfX0FORFJPSURfXworI2luY2x1ZGUgPGFuZHJvaWQvbG9nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvbGltaXRzLmg+CisKKyNpZmRlZiBJVFRfQU5EUk9JRF9MT0cKKyAgICAjZGVmaW5lIElUVF9BTkRST0lEX0xPR19UQUcgICAiSU5URUxfVlRVTkVfVVNFUkFQSSIKKyAgICAjZGVmaW5lIElUVF9BTkRST0lEX0xPR0koLi4uKSAoKHZvaWQpX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19JTkZPLCBJVFRfQU5EUk9JRF9MT0dfVEFHLCBfX1ZBX0FSR1NfXykpCisgICAgI2RlZmluZSBJVFRfQU5EUk9JRF9MT0dXKC4uLikgKCh2b2lkKV9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfV0FSTiwgSVRUX0FORFJPSURfTE9HX1RBRywgX19WQV9BUkdTX18pKQorICAgICNkZWZpbmUgSVRUX0FORFJPSURfTE9HRSguLi4pICgodm9pZClfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0VSUk9SLElUVF9BTkRST0lEX0xPR19UQUcsIF9fVkFfQVJHU19fKSkKKyAgICAjZGVmaW5lIElUVF9BTkRST0lEX0xPR0QoLi4uKSAoKHZvaWQpX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19ERUJVRyxJVFRfQU5EUk9JRF9MT0dfVEFHLCBfX1ZBX0FSR1NfXykpCisjZWxzZQorICAgICNkZWZpbmUgSVRUX0FORFJPSURfTE9HSSguLi4pCisgICAgI2RlZmluZSBJVFRfQU5EUk9JRF9MT0dXKC4uLikKKyAgICAjZGVmaW5lIElUVF9BTkRST0lEX0xPR0UoLi4uKQorICAgICNkZWZpbmUgSVRUX0FORFJPSURfTE9HRCguLi4pCisjZW5kaWYKKworLyogZGVmYXVsdCBsb2NhdGlvbiBvZiB1c2VyYXBpIGNvbGxlY3RvciBvbiBBbmRyb2lkICovCisjZGVmaW5lIEFORFJPSURfSVRUTk9USUZZX0RFRkFVTFRfUEFUSCAgIi9kYXRhL2RhdGEvY29tLmludGVsLnZ0dW5lL2ludGVsL2xpYml0dG5vdGlmeS5zbyIKKyNlbmRpZgorCisKKyNpZm5kZWYgTElCX1ZBUl9OQU1FCisjaWYgSVRUX0FSQ0g9PUlUVF9BUkNIX0lBMzIgfHwgSVRUX0FSQ0g9PUlUVF9BUkNIX0FSTQorI2RlZmluZSBMSUJfVkFSX05BTUUgSU5URUxfTElCSVRUTk9USUZZMzIKKyNlbHNlCisjZGVmaW5lIExJQl9WQVJfTkFNRSBJTlRFTF9MSUJJVFROT1RJRlk2NAorI2VuZGlmCisjZW5kaWYgLyogTElCX1ZBUl9OQU1FICovCisKKyNkZWZpbmUgSVRUX01VVEVYX0lOSVRfQU5EX0xPQ0socCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCFwLm11dGV4X2luaXRpYWxpemVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmIChfX2l0dF9pbnRlcmxvY2tlZF9pbmNyZW1lbnQoJnAuYXRvbWljX2NvdW50ZXIpID09IDEpIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfX2l0dF9tdXRleF9pbml0KCZwLm11dGV4KTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBwLm11dGV4X2luaXRpYWxpemVkID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB3aGlsZSAoIXAubXV0ZXhfaW5pdGlhbGl6ZWQpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgX19pdHRfdGhyZWFkX3lpZWxkKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX19pdHRfbXV0ZXhfbG9jaygmcC5tdXRleCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworY29uc3QgaW50IF9OXyhlcnIpID0gMDsKKwordHlwZWRlZiBpbnQgKF9faXR0X2luaXRfaXR0bGliX3QpKGNvbnN0IGNoYXIqLCBfX2l0dF9ncm91cF9pZCk7CisKKy8qIHRoaXMgZGVmaW5lIHVzZWQgdG8gY29udHJvbCBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBuYW1lLiAqLworI2lmbmRlZiBfX2l0dF9pbml0X2l0dGxpYl9uYW1lCitJVFRfRVhURVJOX0MgaW50IF9OXyhpbml0X2l0dGxpYikoY29uc3QgY2hhciosIF9faXR0X2dyb3VwX2lkKTsKK3N0YXRpYyBfX2l0dF9pbml0X2l0dGxpYl90KiBfX2l0dF9pbml0X2l0dGxpYl9wdHIgPSBfTl8oaW5pdF9pdHRsaWIpOworI2RlZmluZSBfX2l0dF9pbml0X2l0dGxpYl9uYW1lIF9faXR0X2luaXRfaXR0bGliX3B0cgorI2VuZGlmIC8qIF9faXR0X2luaXRfaXR0bGliX25hbWUgKi8KKwordHlwZWRlZiB2b2lkIChfX2l0dF9maW5pX2l0dGxpYl90KSh2b2lkKTsKKworLyogdGhpcyBkZWZpbmUgdXNlZCB0byBjb250cm9sIGZpbmFsaXphdGlvbiBmdW5jdGlvbiBuYW1lLiAqLworI2lmbmRlZiBfX2l0dF9maW5pX2l0dGxpYl9uYW1lCitJVFRfRVhURVJOX0Mgdm9pZCBfTl8oZmluaV9pdHRsaWIpKHZvaWQpOworc3RhdGljIF9faXR0X2ZpbmlfaXR0bGliX3QqIF9faXR0X2ZpbmlfaXR0bGliX3B0ciA9IF9OXyhmaW5pX2l0dGxpYik7CisjZGVmaW5lIF9faXR0X2ZpbmlfaXR0bGliX25hbWUgX19pdHRfZmluaV9pdHRsaWJfcHRyCisjZW5kaWYgLyogX19pdHRfZmluaV9pdHRsaWJfbmFtZSAqLworCisvKiBidWlsZGluZyBwb2ludGVycyB0byBpbXBvcnRlZCBmdW5jcyAqLworI3VuZGVmIElUVF9TVFVCVgorI3VuZGVmIElUVF9TVFVCCisjZGVmaW5lIElUVF9TVFVCKGFwaSx0eXBlLG5hbWUsYXJncyxwYXJhbXMscHRyLGdyb3VwLGZvcm1hdCkgICBcCitzdGF0aWMgdHlwZSBhcGkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKG5hbWUpLF9pbml0KSkgYXJncztcCit0eXBlZGVmIHR5cGUgYXBpIElUVF9KT0lOKF9OXyhuYW1lKSxfdCkgYXJnczsgICAgICAgICAgICAgICAgICBcCitJVFRfRVhURVJOX0NfQkVHSU4gSVRUX0pPSU4oX05fKG5hbWUpLF90KSogSVRUTk9USUZZX05BTUUobmFtZSkgPSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8obmFtZSksX2luaXQpKTsgSVRUX0VYVEVSTl9DX0VORCBcCitzdGF0aWMgdHlwZSBhcGkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKG5hbWUpLF9pbml0KSkgYXJncyBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19pdHRfaW5pdF9pdHRsaWJfbmFtZShOVUxMLCBfX2l0dF9ncm91cF9hbGwpOyAgICAgICAgICAgICBcCisgICAgaWYgKElUVE5PVElGWV9OQU1FKG5hbWUpICYmIElUVE5PVElGWV9OQU1FKG5hbWUpICE9IElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhuYW1lKSxfaW5pdCkpKSBcCisgICAgICAgIHJldHVybiBJVFROT1RJRllfTkFNRShuYW1lKSBwYXJhbXM7ICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiAodHlwZSkwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgSVRUX1NUVUJWKGFwaSx0eXBlLG5hbWUsYXJncyxwYXJhbXMscHRyLGdyb3VwLGZvcm1hdCkgIFwKK3N0YXRpYyB0eXBlIGFwaSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8obmFtZSksX2luaXQpKSBhcmdzO1wKK3R5cGVkZWYgdHlwZSBhcGkgSVRUX0pPSU4oX05fKG5hbWUpLF90KSBhcmdzOyAgICAgICAgICAgICAgICAgIFwKK0lUVF9FWFRFUk5fQ19CRUdJTiBJVFRfSk9JTihfTl8obmFtZSksX3QpKiBJVFROT1RJRllfTkFNRShuYW1lKSA9IElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhuYW1lKSxfaW5pdCkpOyBJVFRfRVhURVJOX0NfRU5EIFwKK3N0YXRpYyB0eXBlIGFwaSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8obmFtZSksX2luaXQpKSBhcmdzIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2l0dF9pbml0X2l0dGxpYl9uYW1lKE5VTEwsIF9faXR0X2dyb3VwX2FsbCk7ICAgICAgICAgICAgIFwKKyAgICBpZiAoSVRUTk9USUZZX05BTUUobmFtZSkgJiYgSVRUTk9USUZZX05BTUUobmFtZSkgIT0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKG5hbWUpLF9pbml0KSkpIFwKKyAgICAgICAgSVRUTk9USUZZX05BTUUobmFtZSkgcGFyYW1zOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI3VuZGVmIF9fSVRUX0lOVEVSTkFMX0lOSVQKKyNpbmNsdWRlICJpdHRub3RpZnlfc3RhdGljLmgiCisKKyN1bmRlZiBJVFRfU1RVQgorI3VuZGVmIElUVF9TVFVCVgorI2RlZmluZSBJVFRfU1RVQihhcGksdHlwZSxuYW1lLGFyZ3MscGFyYW1zLHB0cixncm91cCxmb3JtYXQpICAgXAorc3RhdGljIHR5cGUgYXBpIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhuYW1lKSxfaW5pdCkpIGFyZ3M7XAordHlwZWRlZiB0eXBlIGFwaSBJVFRfSk9JTihfTl8obmFtZSksX3QpIGFyZ3M7ICAgICAgICAgICAgICAgICAgXAorSVRUX0VYVEVSTl9DX0JFR0lOIElUVF9KT0lOKF9OXyhuYW1lKSxfdCkqIElUVE5PVElGWV9OQU1FKG5hbWUpID0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKG5hbWUpLF9pbml0KSk7IElUVF9FWFRFUk5fQ19FTkQKKworI2RlZmluZSBJVFRfU1RVQlYoYXBpLHR5cGUsbmFtZSxhcmdzLHBhcmFtcyxwdHIsZ3JvdXAsZm9ybWF0KSAgXAorc3RhdGljIHR5cGUgYXBpIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhuYW1lKSxfaW5pdCkpIGFyZ3M7XAordHlwZWRlZiB0eXBlIGFwaSBJVFRfSk9JTihfTl8obmFtZSksX3QpIGFyZ3M7ICAgICAgICAgICAgICAgICAgXAorSVRUX0VYVEVSTl9DX0JFR0lOIElUVF9KT0lOKF9OXyhuYW1lKSxfdCkqIElUVE5PVElGWV9OQU1FKG5hbWUpID0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKG5hbWUpLF9pbml0KSk7IElUVF9FWFRFUk5fQ19FTkQKKworI2RlZmluZSBfX0lUVF9JTlRFUk5BTF9JTklUCisjaW5jbHVkZSAiaXR0bm90aWZ5X3N0YXRpYy5oIgorI3VuZGVmIF9fSVRUX0lOVEVSTkFMX0lOSVQKKworSVRUX0dST1VQX0xJU1QoZ3JvdXBfbGlzdCk7CisKKyNwcmFnbWEgcGFjayhwdXNoLCA4KQorCit0eXBlZGVmIHN0cnVjdCBfX19pdHRfZ3JvdXBfYWxpYXMKK3sKKyAgICBjb25zdCBjaGFyKiAgICBlbnZfdmFyOworICAgIF9faXR0X2dyb3VwX2lkIGdyb3VwczsKK30gX19pdHRfZ3JvdXBfYWxpYXM7CisKK3N0YXRpYyBfX2l0dF9ncm91cF9hbGlhcyBncm91cF9hbGlhc1tdID0geworICAgIHsgIktNUF9GT1JfVFBST0ZJTEUiLCAoX19pdHRfZ3JvdXBfaWQpKF9faXR0X2dyb3VwX2NvbnRyb2wgfCBfX2l0dF9ncm91cF90aHJlYWQgfCBfX2l0dF9ncm91cF9zeW5jICB8IF9faXR0X2dyb3VwX21hcmspIH0sCisgICAgeyAiS01QX0ZPUl9UQ0hFQ0siLCAgIChfX2l0dF9ncm91cF9pZCkoX19pdHRfZ3JvdXBfY29udHJvbCB8IF9faXR0X2dyb3VwX3RocmVhZCB8IF9faXR0X2dyb3VwX3N5bmMgIHwgX19pdHRfZ3JvdXBfZnN5bmMgfCBfX2l0dF9ncm91cF9tYXJrIHwgX19pdHRfZ3JvdXBfc3VwcHJlc3MpIH0sCisgICAgeyBOVUxMLCAgICAgICAgICAgICAgIChfX2l0dF9ncm91cF9ub25lKSB9LAorICAgIHsgYXBpX3ZlcnNpb24sICAgICAgICAoX19pdHRfZ3JvdXBfbm9uZSkgfSAvKiAhISEgSnVzdCB0byBhdm9pZCB1bnVzZWQgY29kZSBlbGltaW5hdGlvbiAhISEgKi8KK307CisKKyNwcmFnbWEgcGFjayhwb3ApCisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNwcmFnbWEgd2FybmluZyhwdXNoKQorI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6IDQwNTQpIC8qIHdhcm5pbmcgQzQwNTQ6ICd0eXBlIGNhc3QnIDogZnJvbSBmdW5jdGlvbiBwb2ludGVyICdYWFgnIHRvIGRhdGEgcG9pbnRlciAndm9pZCAqJyAqLworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCitzdGF0aWMgX19pdHRfYXBpX2luZm8gYXBpX2xpc3RbXSA9IHsKKy8qIERlZmluZSBmdW5jdGlvbnMgd2l0aCBzdGF0aWMgaW1wbGVtZW50YXRpb24gKi8KKyN1bmRlZiBJVFRfU1RVQgorI3VuZGVmIElUVF9TVFVCVgorI2RlZmluZSBJVFRfU1RVQihhcGksdHlwZSxuYW1lLGFyZ3MscGFyYW1zLG5hbWVpbmRsbCxncm91cCxmb3JtYXQpIHsgSVRUX1RPX1NUUihJVFRfSk9JTihfX2l0dF8sbmFtZWluZGxsKSksICh2b2lkKiopKHZvaWQqKSZJVFROT1RJRllfTkFNRShuYW1lKSwgKHZvaWQqKShzaXplX3QpJklUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhuYW1lKSxfaW5pdCkpLCAodm9pZCopKHNpemVfdCkmSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKG5hbWUpLF9pbml0KSksIChfX2l0dF9ncm91cF9pZCkoZ3JvdXApfSwKKyNkZWZpbmUgSVRUX1NUVUJWIElUVF9TVFVCCisjZGVmaW5lIF9fSVRUX0lOVEVSTkFMX0lOSVQKKyNpbmNsdWRlICJpdHRub3RpZnlfc3RhdGljLmgiCisjdW5kZWYgX19JVFRfSU5URVJOQUxfSU5JVAorLyogRGVmaW5lIGZ1bmN0aW9ucyB3aXRob3V0IHN0YXRpYyBpbXBsZW1lbnRhdGlvbiAqLworI3VuZGVmIElUVF9TVFVCCisjdW5kZWYgSVRUX1NUVUJWCisjZGVmaW5lIElUVF9TVFVCKGFwaSx0eXBlLG5hbWUsYXJncyxwYXJhbXMsbmFtZWluZGxsLGdyb3VwLGZvcm1hdCkge0lUVF9UT19TVFIoSVRUX0pPSU4oX19pdHRfLG5hbWVpbmRsbCkpLCAodm9pZCoqKSh2b2lkKikmSVRUTk9USUZZX05BTUUobmFtZSksICh2b2lkKikoc2l6ZV90KSZJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8obmFtZSksX2luaXQpKSwgTlVMTCwgKF9faXR0X2dyb3VwX2lkKShncm91cCl9LAorI2RlZmluZSBJVFRfU1RVQlYgSVRUX1NUVUIKKyNpbmNsdWRlICJpdHRub3RpZnlfc3RhdGljLmgiCisgICAge05VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIF9faXR0X2dyb3VwX25vbmV9Cit9OworCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjcHJhZ21hIHdhcm5pbmcocG9wKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisvKiBwcml2YXRlLCBpbml0IHRocmVhZCBpbmZvIGl0ZW0uIHVzZWQgZm9yIGludGVybmFsIHB1cnBvc2VzICovCitzdGF0aWMgX19pdHRfdGhyZWFkX2luZm8gaW5pdF90aHJlYWRfaW5mbyA9IHsKKyAgICAoY29uc3QgY2hhciopTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYW1lQSAqLworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyAgICAoY29uc3Qgd2NoYXJfdCopTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBuYW1lVyAqLworI2Vsc2UKKyAgICAodm9pZCopTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYW1lVyAqLworI2VuZGlmCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGlkICovCisgICAgX19pdHRfdGhyZWFkX25vcm1hbCwgICAgICAgICAgICAgICAgICAgICAgLyogc3RhdGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBleHRyYTEgKi8KKyAgICAodm9pZCopTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBleHRyYTIgKi8KKyAgICAoX19pdHRfdGhyZWFkX2luZm8qKU5VTEwgICAgICAgICAgICAgICAgICAvKiBuZXh0ICovCit9OworCisvKiBwcml2YXRlLCBOVUxMIGRvbWFpbiBpdGVtLiB1c2VkIGZvciBpbnRlcm5hbCBwdXJwb3NlcyAqLworc3RhdGljIF9faXR0X2RvbWFpbiBudWxsX2RvbWFpbiA9IHsKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmbGFnczogIGRpc2FibGVkIGJ5IGRlZmF1bHQgKi8KKyAgICAoY29uc3QgY2hhciopTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYW1lQSAqLworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyAgICAoY29uc3Qgd2NoYXJfdCopTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBuYW1lVyAqLworI2Vsc2UKKyAgICAodm9pZCopTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYW1lVyAqLworI2VuZGlmCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZXh0cmExICovCisgICAgKHZvaWQqKU5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZXh0cmEyICovCisgICAgKF9faXR0X2RvbWFpbiopTlVMTCAgICAgICAgICAgICAgICAgICAgICAgLyogbmV4dCAqLworfTsKKworLyogcHJpdmF0ZSwgTlVMTCBzdHJpbmcgaGFuZGxlIGl0ZW0uIHVzZWQgZm9yIGludGVybmFsIHB1cnBvc2VzICovCitzdGF0aWMgX19pdHRfc3RyaW5nX2hhbmRsZSBudWxsX3N0cmluZ19oYW5kbGUgPSB7CisgICAgKGNvbnN0IGNoYXIqKU5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RyQSAqLworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyAgICAoY29uc3Qgd2NoYXJfdCopTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBzdHJXICovCisjZWxzZQorICAgICh2b2lkKilOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0clcgKi8KKyNlbmRpZgorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV4dHJhMSAqLworICAgICh2b2lkKilOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV4dHJhMiAqLworICAgIChfX2l0dF9zdHJpbmdfaGFuZGxlKilOVUxMICAgICAgICAgICAgICAgIC8qIG5leHQgKi8KK307CisKK3N0YXRpYyBjb25zdCBjaGFyIGRsbF9wYXRoW1BBVEhfTUFYXSA9IHsgMCB9OworCisvKiBzdGF0aWMgcGFydCBkZXNjcmlwdG9yIHdoaWNoIGhhbmRsZXMuIGFsbCBub3RpZmljYXRpb24gYXBpIGF0dHJpYnV0ZXMuICovCitfX2l0dF9nbG9iYWwgX05fKF9pdHRhcGlfZ2xvYmFsKSA9IHsKKyAgICBJVFRfTUFHSUMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlkZW50aWZpY2F0aW9uIGluZm8gKi8KKyAgICBJVFRfTUFKT1IsIElUVF9NSU5PUiwgQVBJX1ZFUlNJT05fQlVJTEQsICAgICAgIC8qIHZlcnNpb24gaW5mbyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYXBpX2luaXRpYWxpemVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtdXRleF9pbml0aWFsaXplZCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYXRvbWljX2NvdW50ZXIgKi8KKyAgICBNVVRFWF9JTklUSUFMSVpFUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11dGV4ICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkeW5hbWljIGxpYnJhcnkgaGFuZGxlICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlcnJvcl9oYW5kbGVyICovCisgICAgKGNvbnN0IGNoYXIqKikmZGxsX3BhdGgsICAgICAgICAgICAgICAgICAgICAgICAvKiBkbGxfcGF0aF9wdHIgKi8KKyAgICAoX19pdHRfYXBpX2luZm8qKSZhcGlfbGlzdCwgICAgICAgICAgICAgICAgICAgIC8qIGFwaV9saXN0X3B0ciAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmV4dCBfX2l0dF9nbG9iYWwgKi8KKyAgICAoX19pdHRfdGhyZWFkX2luZm8qKSZpbml0X3RocmVhZF9pbmZvLCAgICAgICAgIC8qIHRocmVhZF9saXN0ICovCisgICAgKF9faXR0X2RvbWFpbiopJm51bGxfZG9tYWluLCAgICAgICAgICAgICAgICAgICAvKiBkb21haW5fbGlzdCAqLworICAgIChfX2l0dF9zdHJpbmdfaGFuZGxlKikmbnVsbF9zdHJpbmdfaGFuZGxlLCAgICAgLyogc3RyaW5nX2xpc3QgKi8KKyAgICBfX2l0dF9jb2xsZWN0aW9uX25vcm1hbCAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbGxlY3Rpb24gc3RhdGUgKi8KK307CisKK3R5cGVkZWYgdm9pZCAoX19pdHRfYXBpX2luaXRfdCkoX19pdHRfZ2xvYmFsKiwgX19pdHRfZ3JvdXBfaWQpOwordHlwZWRlZiB2b2lkIChfX2l0dF9hcGlfZmluaV90KShfX2l0dF9nbG9iYWwqKTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisjaWZkZWYgSVRUX05PVElGWV9FWFRfUkVQT1JUCitJVFRfRVhURVJOX0Mgdm9pZCBfTl8oZXJyb3JfaGFuZGxlcikoX19pdHRfZXJyb3JfY29kZSwgdmFfbGlzdCBhcmdzKTsKKyNlbmRpZiAvKiBJVFRfTk9USUZZX0VYVF9SRVBPUlQgKi8KKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI3ByYWdtYSB3YXJuaW5nKHB1c2gpCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTogNDA1NSkgLyogd2FybmluZyBDNDA1NTogJ3R5cGUgY2FzdCcgOiBmcm9tIGRhdGEgcG9pbnRlciAndm9pZCAqJyB0byBmdW5jdGlvbiBwb2ludGVyICdYWFgnICovCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKK3N0YXRpYyB2b2lkIF9faXR0X3JlcG9ydF9lcnJvcihfX2l0dF9lcnJvcl9jb2RlIGNvZGUsIC4uLikKK3sKKyAgICB2YV9saXN0IGFyZ3M7CisgICAgdmFfc3RhcnQoYXJncywgY29kZSk7CisgICAgaWYgKF9OXyhfaXR0YXBpX2dsb2JhbCkuZXJyb3JfaGFuZGxlciAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgX19pdHRfZXJyb3JfaGFuZGxlcl90KiBoYW5kbGVyID0gKF9faXR0X2Vycm9yX2hhbmRsZXJfdCopKHNpemVfdClfTl8oX2l0dGFwaV9nbG9iYWwpLmVycm9yX2hhbmRsZXI7CisgICAgICAgIGhhbmRsZXIoY29kZSwgYXJncyk7CisgICAgfQorI2lmZGVmIElUVF9OT1RJRllfRVhUX1JFUE9SVAorICAgIF9OXyhlcnJvcl9oYW5kbGVyKShjb2RlLCBhcmdzKTsKKyNlbmRpZiAvKiBJVFRfTk9USUZZX0VYVF9SRVBPUlQgKi8KKyAgICB2YV9lbmQoYXJncyk7Cit9CisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNwcmFnbWEgd2FybmluZyhwb3ApCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK3N0YXRpYyBfX2l0dF9kb21haW4qIElUVEFQSSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8oZG9tYWluX2NyZWF0ZVcpLF9pbml0KSkoY29uc3Qgd2NoYXJfdCogbmFtZSkKK3sKKyAgICBfX2l0dF9kb21haW4gKmhfdGFpbCwgKmg7CisKKyAgICBpZiAoIV9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2luaXRpYWxpemVkICYmIF9OXyhfaXR0YXBpX2dsb2JhbCkudGhyZWFkX2xpc3QtPnRpZCA9PSAwKQorICAgIHsKKyAgICAgICAgX19pdHRfaW5pdF9pdHRsaWJfbmFtZShOVUxMLCBfX2l0dF9ncm91cF9hbGwpOworICAgICAgICBpZiAoSVRUTk9USUZZX05BTUUoZG9tYWluX2NyZWF0ZVcpICYmIElUVE5PVElGWV9OQU1FKGRvbWFpbl9jcmVhdGVXKSAhPSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8oZG9tYWluX2NyZWF0ZVcpLF9pbml0KSkpCisgICAgICAgICAgICByZXR1cm4gSVRUTk9USUZZX05BTUUoZG9tYWluX2NyZWF0ZVcpKG5hbWUpOworICAgIH0KKworICAgIGlmIChuYW1lID09IE5VTEwpCisgICAgICAgIHJldHVybiBfTl8oX2l0dGFwaV9nbG9iYWwpLmRvbWFpbl9saXN0OworCisgICAgSVRUX01VVEVYX0lOSVRfQU5EX0xPQ0soX05fKF9pdHRhcGlfZ2xvYmFsKSk7CisgICAgZm9yIChoX3RhaWwgPSBOVUxMLCBoID0gX05fKF9pdHRhcGlfZ2xvYmFsKS5kb21haW5fbGlzdDsgaCAhPSBOVUxMOyBoX3RhaWwgPSBoLCBoID0gaC0+bmV4dCkKKyAgICAgICAgaWYgKGgtPm5hbWVXICE9IE5VTEwgJiYgIXdjc2NtcChoLT5uYW1lVywgbmFtZSkpCisgICAgICAgICAgICBicmVhazsKKyAgICBpZiAoaCA9PSBOVUxMKSB7CisgICAgICAgIE5FV19ET01BSU5fVygmX05fKF9pdHRhcGlfZ2xvYmFsKSxoLGhfdGFpbCxuYW1lKTsKKyAgICB9CisgICAgX19pdHRfbXV0ZXhfdW5sb2NrKCZfTl8oX2l0dGFwaV9nbG9iYWwpLm11dGV4KTsKKyAgICByZXR1cm4gaDsKK30KKworc3RhdGljIF9faXR0X2RvbWFpbiogSVRUQVBJIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhkb21haW5fY3JlYXRlQSksX2luaXQpKShjb25zdCBjaGFyKiBuYW1lKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworc3RhdGljIF9faXR0X2RvbWFpbiogSVRUQVBJIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhkb21haW5fY3JlYXRlKSxfaW5pdCkpKGNvbnN0IGNoYXIqIG5hbWUpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCit7CisgICAgX19pdHRfZG9tYWluICpoX3RhaWwsICpoOworCisgICAgaWYgKCFfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9pbml0aWFsaXplZCAmJiBfTl8oX2l0dGFwaV9nbG9iYWwpLnRocmVhZF9saXN0LT50aWQgPT0gMCkKKyAgICB7CisgICAgICAgIF9faXR0X2luaXRfaXR0bGliX25hbWUoTlVMTCwgX19pdHRfZ3JvdXBfYWxsKTsKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyAgICAgICAgaWYgKElUVE5PVElGWV9OQU1FKGRvbWFpbl9jcmVhdGVBKSAmJiBJVFROT1RJRllfTkFNRShkb21haW5fY3JlYXRlQSkgIT0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKGRvbWFpbl9jcmVhdGVBKSxfaW5pdCkpKQorICAgICAgICAgICAgcmV0dXJuIElUVE5PVElGWV9OQU1FKGRvbWFpbl9jcmVhdGVBKShuYW1lKTsKKyNlbHNlCisgICAgICAgIGlmIChJVFROT1RJRllfTkFNRShkb21haW5fY3JlYXRlKSAmJiBJVFROT1RJRllfTkFNRShkb21haW5fY3JlYXRlKSAhPSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8oZG9tYWluX2NyZWF0ZSksX2luaXQpKSkKKyAgICAgICAgICAgIHJldHVybiBJVFROT1RJRllfTkFNRShkb21haW5fY3JlYXRlKShuYW1lKTsKKyNlbmRpZgorICAgIH0KKworICAgIGlmIChuYW1lID09IE5VTEwpCisgICAgICAgIHJldHVybiBfTl8oX2l0dGFwaV9nbG9iYWwpLmRvbWFpbl9saXN0OworCisgICAgSVRUX01VVEVYX0lOSVRfQU5EX0xPQ0soX05fKF9pdHRhcGlfZ2xvYmFsKSk7CisgICAgZm9yIChoX3RhaWwgPSBOVUxMLCBoID0gX05fKF9pdHRhcGlfZ2xvYmFsKS5kb21haW5fbGlzdDsgaCAhPSBOVUxMOyBoX3RhaWwgPSBoLCBoID0gaC0+bmV4dCkKKyAgICAgICAgaWYgKGgtPm5hbWVBICE9IE5VTEwgJiYgIV9faXR0X2ZzdHJjbXAoaC0+bmFtZUEsIG5hbWUpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgaWYgKGggPT0gTlVMTCkgeworICAgICAgICBORVdfRE9NQUlOX0EoJl9OXyhfaXR0YXBpX2dsb2JhbCksaCxoX3RhaWwsbmFtZSk7CisgICAgfQorICAgIF9faXR0X211dGV4X3VubG9jaygmX05fKF9pdHRhcGlfZ2xvYmFsKS5tdXRleCk7CisgICAgcmV0dXJuIGg7Cit9CisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK3N0YXRpYyBfX2l0dF9zdHJpbmdfaGFuZGxlKiBJVFRBUEkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHN0cmluZ19oYW5kbGVfY3JlYXRlVyksX2luaXQpKShjb25zdCB3Y2hhcl90KiBuYW1lKQoreworICAgIF9faXR0X3N0cmluZ19oYW5kbGUgKmhfdGFpbCwgKmg7CisKKyAgICBpZiAoIV9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2luaXRpYWxpemVkICYmIF9OXyhfaXR0YXBpX2dsb2JhbCkudGhyZWFkX2xpc3QtPnRpZCA9PSAwKQorICAgIHsKKyAgICAgICAgX19pdHRfaW5pdF9pdHRsaWJfbmFtZShOVUxMLCBfX2l0dF9ncm91cF9hbGwpOworICAgICAgICBpZiAoSVRUTk9USUZZX05BTUUoc3RyaW5nX2hhbmRsZV9jcmVhdGVXKSAmJiBJVFROT1RJRllfTkFNRShzdHJpbmdfaGFuZGxlX2NyZWF0ZVcpICE9IElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhzdHJpbmdfaGFuZGxlX2NyZWF0ZVcpLF9pbml0KSkpCisgICAgICAgICAgICByZXR1cm4gSVRUTk9USUZZX05BTUUoc3RyaW5nX2hhbmRsZV9jcmVhdGVXKShuYW1lKTsKKyAgICB9CisKKyAgICBpZiAobmFtZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gX05fKF9pdHRhcGlfZ2xvYmFsKS5zdHJpbmdfbGlzdDsKKworICAgIElUVF9NVVRFWF9JTklUX0FORF9MT0NLKF9OXyhfaXR0YXBpX2dsb2JhbCkpOworICAgIGZvciAoaF90YWlsID0gTlVMTCwgaCA9IF9OXyhfaXR0YXBpX2dsb2JhbCkuc3RyaW5nX2xpc3Q7IGggIT0gTlVMTDsgaF90YWlsID0gaCwgaCA9IGgtPm5leHQpCisgICAgICAgIGlmIChoLT5zdHJXICE9IE5VTEwgJiYgIXdjc2NtcChoLT5zdHJXLCBuYW1lKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIGlmIChoID09IE5VTEwpIHsKKyAgICAgICAgTkVXX1NUUklOR19IQU5ETEVfVygmX05fKF9pdHRhcGlfZ2xvYmFsKSxoLGhfdGFpbCxuYW1lKTsKKyAgICB9CisgICAgX19pdHRfbXV0ZXhfdW5sb2NrKCZfTl8oX2l0dGFwaV9nbG9iYWwpLm11dGV4KTsKKyAgICByZXR1cm4gaDsKK30KKworc3RhdGljIF9faXR0X3N0cmluZ19oYW5kbGUqIElUVEFQSSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8oc3RyaW5nX2hhbmRsZV9jcmVhdGVBKSxfaW5pdCkpKGNvbnN0IGNoYXIqIG5hbWUpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCitzdGF0aWMgX19pdHRfc3RyaW5nX2hhbmRsZSogSVRUQVBJIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhzdHJpbmdfaGFuZGxlX2NyZWF0ZSksX2luaXQpKShjb25zdCBjaGFyKiBuYW1lKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworeworICAgIF9faXR0X3N0cmluZ19oYW5kbGUgKmhfdGFpbCwgKmg7CisKKyAgICBpZiAoIV9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2luaXRpYWxpemVkICYmIF9OXyhfaXR0YXBpX2dsb2JhbCkudGhyZWFkX2xpc3QtPnRpZCA9PSAwKQorICAgIHsKKyAgICAgICAgX19pdHRfaW5pdF9pdHRsaWJfbmFtZShOVUxMLCBfX2l0dF9ncm91cF9hbGwpOworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorICAgICAgICBpZiAoSVRUTk9USUZZX05BTUUoc3RyaW5nX2hhbmRsZV9jcmVhdGVBKSAmJiBJVFROT1RJRllfTkFNRShzdHJpbmdfaGFuZGxlX2NyZWF0ZUEpICE9IElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhzdHJpbmdfaGFuZGxlX2NyZWF0ZUEpLF9pbml0KSkpCisgICAgICAgICAgICByZXR1cm4gSVRUTk9USUZZX05BTUUoc3RyaW5nX2hhbmRsZV9jcmVhdGVBKShuYW1lKTsKKyNlbHNlCisgICAgICAgIGlmIChJVFROT1RJRllfTkFNRShzdHJpbmdfaGFuZGxlX2NyZWF0ZSkgJiYgSVRUTk9USUZZX05BTUUoc3RyaW5nX2hhbmRsZV9jcmVhdGUpICE9IElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhzdHJpbmdfaGFuZGxlX2NyZWF0ZSksX2luaXQpKSkKKyAgICAgICAgICAgIHJldHVybiBJVFROT1RJRllfTkFNRShzdHJpbmdfaGFuZGxlX2NyZWF0ZSkobmFtZSk7CisjZW5kaWYKKyAgICB9CisKKyAgICBpZiAobmFtZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gX05fKF9pdHRhcGlfZ2xvYmFsKS5zdHJpbmdfbGlzdDsKKworICAgIElUVF9NVVRFWF9JTklUX0FORF9MT0NLKF9OXyhfaXR0YXBpX2dsb2JhbCkpOworICAgIGZvciAoaF90YWlsID0gTlVMTCwgaCA9IF9OXyhfaXR0YXBpX2dsb2JhbCkuc3RyaW5nX2xpc3Q7IGggIT0gTlVMTDsgaF90YWlsID0gaCwgaCA9IGgtPm5leHQpCisgICAgICAgIGlmIChoLT5zdHJBICE9IE5VTEwgJiYgIV9faXR0X2ZzdHJjbXAoaC0+c3RyQSwgbmFtZSkpCisgICAgICAgICAgICBicmVhazsKKyAgICBpZiAoaCA9PSBOVUxMKSB7CisgICAgICAgIE5FV19TVFJJTkdfSEFORExFX0EoJl9OXyhfaXR0YXBpX2dsb2JhbCksaCxoX3RhaWwsbmFtZSk7CisgICAgfQorICAgIF9faXR0X211dGV4X3VubG9jaygmX05fKF9pdHRhcGlfZ2xvYmFsKS5tdXRleCk7CisgICAgcmV0dXJuIGg7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIElUVEFQSSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8ocGF1c2UpLF9pbml0KSkodm9pZCkKK3sKKyAgICBpZiAoIV9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2luaXRpYWxpemVkICYmIF9OXyhfaXR0YXBpX2dsb2JhbCkudGhyZWFkX2xpc3QtPnRpZCA9PSAwKQorICAgIHsKKyAgICAgICAgX19pdHRfaW5pdF9pdHRsaWJfbmFtZShOVUxMLCBfX2l0dF9ncm91cF9hbGwpOworICAgICAgICBpZiAoSVRUTk9USUZZX05BTUUocGF1c2UpICYmIElUVE5PVElGWV9OQU1FKHBhdXNlKSAhPSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8ocGF1c2UpLF9pbml0KSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHBhdXNlKSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIF9OXyhfaXR0YXBpX2dsb2JhbCkuc3RhdGUgPSBfX2l0dF9jb2xsZWN0aW9uX3BhdXNlZDsKK30KKworc3RhdGljIHZvaWQgSVRUQVBJIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhyZXN1bWUpLF9pbml0KSkodm9pZCkKK3sKKyAgICBpZiAoIV9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2luaXRpYWxpemVkICYmIF9OXyhfaXR0YXBpX2dsb2JhbCkudGhyZWFkX2xpc3QtPnRpZCA9PSAwKQorICAgIHsKKyAgICAgICAgX19pdHRfaW5pdF9pdHRsaWJfbmFtZShOVUxMLCBfX2l0dF9ncm91cF9hbGwpOworICAgICAgICBpZiAoSVRUTk9USUZZX05BTUUocmVzdW1lKSAmJiBJVFROT1RJRllfTkFNRShyZXN1bWUpICE9IElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhyZXN1bWUpLF9pbml0KSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHJlc3VtZSkoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBfTl8oX2l0dGFwaV9nbG9iYWwpLnN0YXRlID0gX19pdHRfY29sbGVjdGlvbl9ub3JtYWw7Cit9CisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK3N0YXRpYyB2b2lkIElUVEFQSSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8odGhyZWFkX3NldF9uYW1lVyksX2luaXQpKShjb25zdCB3Y2hhcl90KiBuYW1lKQoreworICAgIFRJRFQgdGlkID0gX19pdHRfdGhyZWFkX2lkKCk7CisgICAgX19pdHRfdGhyZWFkX2luZm8gKmhfdGFpbCwgKmg7CisKKyAgICBpZiAoIV9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2luaXRpYWxpemVkICYmIF9OXyhfaXR0YXBpX2dsb2JhbCkudGhyZWFkX2xpc3QtPnRpZCA9PSAwKQorICAgIHsKKyAgICAgICAgX19pdHRfaW5pdF9pdHRsaWJfbmFtZShOVUxMLCBfX2l0dF9ncm91cF9hbGwpOworICAgICAgICBpZiAoSVRUTk9USUZZX05BTUUodGhyZWFkX3NldF9uYW1lVykgJiYgSVRUTk9USUZZX05BTUUodGhyZWFkX3NldF9uYW1lVykgIT0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHRocmVhZF9zZXRfbmFtZVcpLF9pbml0KSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHRocmVhZF9zZXRfbmFtZVcpKG5hbWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgX19pdHRfbXV0ZXhfbG9jaygmX05fKF9pdHRhcGlfZ2xvYmFsKS5tdXRleCk7CisgICAgZm9yIChoX3RhaWwgPSBOVUxMLCBoID0gX05fKF9pdHRhcGlfZ2xvYmFsKS50aHJlYWRfbGlzdDsgaCAhPSBOVUxMOyBoX3RhaWwgPSBoLCBoID0gaC0+bmV4dCkKKyAgICAgICAgaWYgKGgtPnRpZCA9PSB0aWQpCisgICAgICAgICAgICBicmVhazsKKyAgICBpZiAoaCA9PSBOVUxMKSB7CisgICAgICAgIE5FV19USFJFQURfSU5GT19XKCZfTl8oX2l0dGFwaV9nbG9iYWwpLCBoLCBoX3RhaWwsIHRpZCwgX19pdHRfdGhyZWFkX25vcm1hbCwgbmFtZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGgtPm5hbWVXID0gbmFtZSA/IF93Y3NkdXAobmFtZSkgOiBOVUxMOworICAgIH0KKyAgICBfX2l0dF9tdXRleF91bmxvY2soJl9OXyhfaXR0YXBpX2dsb2JhbCkubXV0ZXgpOworfQorCitzdGF0aWMgaW50IElUVEFQSSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8odGhyX25hbWVfc2V0VyksX2luaXQpKShjb25zdCB3Y2hhcl90KiBuYW1lLCBpbnQgbmFtZWxlbikKK3sKKyAgICBuYW1lbGVuID0gbmFtZWxlbjsKKyAgICBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8odGhyZWFkX3NldF9uYW1lVyksX2luaXQpKShuYW1lKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgSVRUQVBJIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyh0aHJlYWRfc2V0X25hbWVBKSxfaW5pdCkpKGNvbnN0IGNoYXIqIG5hbWUpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitzdGF0aWMgdm9pZCBJVFRBUEkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHRocmVhZF9zZXRfbmFtZSksX2luaXQpKShjb25zdCBjaGFyKiBuYW1lKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworeworICAgIFRJRFQgdGlkID0gX19pdHRfdGhyZWFkX2lkKCk7CisgICAgX19pdHRfdGhyZWFkX2luZm8gKmhfdGFpbCwgKmg7CisKKyAgICBpZiAoIV9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2luaXRpYWxpemVkICYmIF9OXyhfaXR0YXBpX2dsb2JhbCkudGhyZWFkX2xpc3QtPnRpZCA9PSAwKQorICAgIHsKKyAgICAgICAgX19pdHRfaW5pdF9pdHRsaWJfbmFtZShOVUxMLCBfX2l0dF9ncm91cF9hbGwpOworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorICAgICAgICBpZiAoSVRUTk9USUZZX05BTUUodGhyZWFkX3NldF9uYW1lQSkgJiYgSVRUTk9USUZZX05BTUUodGhyZWFkX3NldF9uYW1lQSkgIT0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHRocmVhZF9zZXRfbmFtZUEpLF9pbml0KSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHRocmVhZF9zZXRfbmFtZUEpKG5hbWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisgICAgICAgIGlmIChJVFROT1RJRllfTkFNRSh0aHJlYWRfc2V0X25hbWUpICYmIElUVE5PVElGWV9OQU1FKHRocmVhZF9zZXRfbmFtZSkgIT0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHRocmVhZF9zZXRfbmFtZSksX2luaXQpKSkKKyAgICAgICAgeworICAgICAgICAgICAgSVRUTk9USUZZX05BTUUodGhyZWFkX3NldF9uYW1lKShuYW1lKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworICAgIH0KKworICAgIF9faXR0X211dGV4X2xvY2soJl9OXyhfaXR0YXBpX2dsb2JhbCkubXV0ZXgpOworICAgIGZvciAoaF90YWlsID0gTlVMTCwgaCA9IF9OXyhfaXR0YXBpX2dsb2JhbCkudGhyZWFkX2xpc3Q7IGggIT0gTlVMTDsgaF90YWlsID0gaCwgaCA9IGgtPm5leHQpCisgICAgICAgIGlmIChoLT50aWQgPT0gdGlkKQorICAgICAgICAgICAgYnJlYWs7CisgICAgaWYgKGggPT0gTlVMTCkgeworICAgICAgICBORVdfVEhSRUFEX0lORk9fQSgmX05fKF9pdHRhcGlfZ2xvYmFsKSwgaCwgaF90YWlsLCB0aWQsIF9faXR0X3RocmVhZF9ub3JtYWwsIG5hbWUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBoLT5uYW1lQSA9IG5hbWUgPyBfX2l0dF9mc3RyZHVwKG5hbWUpIDogTlVMTDsKKyAgICB9CisgICAgX19pdHRfbXV0ZXhfdW5sb2NrKCZfTl8oX2l0dGFwaV9nbG9iYWwpLm11dGV4KTsKK30KKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorc3RhdGljIGludCBJVFRBUEkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHRocl9uYW1lX3NldEEpLF9pbml0KSkoY29uc3QgY2hhciogbmFtZSwgaW50IG5hbWVsZW4pCit7CisgICAgbmFtZWxlbiA9IG5hbWVsZW47CisgICAgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHRocmVhZF9zZXRfbmFtZUEpLF9pbml0KSkobmFtZSk7CisgICAgcmV0dXJuIDA7Cit9CisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitzdGF0aWMgaW50IElUVEFQSSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8odGhyX25hbWVfc2V0KSxfaW5pdCkpKGNvbnN0IGNoYXIqIG5hbWUsIGludCBuYW1lbGVuKQoreworICAgIG5hbWVsZW4gPSBuYW1lbGVuOworICAgIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyh0aHJlYWRfc2V0X25hbWUpLF9pbml0KSkobmFtZSk7CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKK3N0YXRpYyB2b2lkIElUVEFQSSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8odGhyZWFkX2lnbm9yZSksX2luaXQpKSh2b2lkKQoreworICAgIFRJRFQgdGlkID0gX19pdHRfdGhyZWFkX2lkKCk7CisgICAgX19pdHRfdGhyZWFkX2luZm8gKmhfdGFpbCwgKmg7CisKKyAgICBpZiAoIV9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2luaXRpYWxpemVkICYmIF9OXyhfaXR0YXBpX2dsb2JhbCkudGhyZWFkX2xpc3QtPnRpZCA9PSAwKQorICAgIHsKKyAgICAgICAgX19pdHRfaW5pdF9pdHRsaWJfbmFtZShOVUxMLCBfX2l0dF9ncm91cF9hbGwpOworICAgICAgICBpZiAoSVRUTk9USUZZX05BTUUodGhyZWFkX2lnbm9yZSkgJiYgSVRUTk9USUZZX05BTUUodGhyZWFkX2lnbm9yZSkgIT0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHRocmVhZF9pZ25vcmUpLF9pbml0KSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHRocmVhZF9pZ25vcmUpKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX2l0dF9tdXRleF9sb2NrKCZfTl8oX2l0dGFwaV9nbG9iYWwpLm11dGV4KTsKKyAgICBmb3IgKGhfdGFpbCA9IE5VTEwsIGggPSBfTl8oX2l0dGFwaV9nbG9iYWwpLnRocmVhZF9saXN0OyBoICE9IE5VTEw7IGhfdGFpbCA9IGgsIGggPSBoLT5uZXh0KQorICAgICAgICBpZiAoaC0+dGlkID09IHRpZCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIGlmIChoID09IE5VTEwpIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIqIG5hbWUgPSAidW5rbm93biI7CisgICAgICAgIE5FV19USFJFQURfSU5GT19BKCZfTl8oX2l0dGFwaV9nbG9iYWwpLCBoLCBoX3RhaWwsIHRpZCwgX19pdHRfdGhyZWFkX2lnbm9yZWQsIG5hbWUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBoLT5zdGF0ZSA9IF9faXR0X3RocmVhZF9pZ25vcmVkOworICAgIH0KKyAgICBfX2l0dF9tdXRleF91bmxvY2soJl9OXyhfaXR0YXBpX2dsb2JhbCkubXV0ZXgpOworfQorCitzdGF0aWMgdm9pZCBJVFRBUEkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHRocl9pZ25vcmUpLF9pbml0KSkodm9pZCkKK3sKKyAgICBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8odGhyZWFkX2lnbm9yZSksX2luaXQpKSgpOworfQorCitzdGF0aWMgdm9pZCBJVFRBUEkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKGVuYWJsZV9hdHRhY2gpLF9pbml0KSkodm9pZCkKK3sKKyNpZmRlZiBfX0FORFJPSURfXworICAgIC8qCisgICAgICogaWYgTElCX1ZBUl9OQU1FIGVudiB2YXJpYWJsZSB3ZXJlIHNldCBiZWZvcmUgdGhlbiBzdGF5IHByZXZpb3VzIHZhbHVlCisgICAgICogZWxzZSBzZXQgZGVmYXVsdCBwYXRoCisgICAgKi8KKyAgICBzZXRlbnYoSVRUX1RPX1NUUihMSUJfVkFSX05BTUUpLCBBTkRST0lEX0lUVE5PVElGWV9ERUZBVUxUX1BBVEgsIDApOworI2VuZGlmCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBjb25zdCBjaGFyKiBfX2l0dF9mc3BsaXQoY29uc3QgY2hhciogcywgY29uc3QgY2hhciogc2VwLCBjb25zdCBjaGFyKiogb3V0LCBpbnQqIGxlbikKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgajsKKworICAgIGlmICghcyB8fCAhc2VwIHx8ICFvdXQgfHwgIWxlbikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBmb3IgKGkgPSAwOyBzW2ldOyBpKyspCisgICAgeworICAgICAgICBpbnQgYiA9IDA7CisgICAgICAgIGZvciAoaiA9IDA7IHNlcFtqXTsgaisrKQorICAgICAgICAgICAgaWYgKHNbaV0gPT0gc2VwW2pdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGIgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICBpZiAoIWIpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIXNbaV0pCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgKmxlbiA9IDA7CisgICAgKm91dCA9ICZzW2ldOworCisgICAgZm9yICg7IHNbaV07IGkrKywgKCpsZW4pKyspCisgICAgeworICAgICAgICBpbnQgYiA9IDA7CisgICAgICAgIGZvciAoaiA9IDA7IHNlcFtqXTsgaisrKQorICAgICAgICAgICAgaWYgKHNbaV0gPT0gc2VwW2pdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGIgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICBpZiAoYikKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGZvciAoOyBzW2ldOyBpKyspCisgICAgeworICAgICAgICBpbnQgYiA9IDA7CisgICAgICAgIGZvciAoaiA9IDA7IHNlcFtqXTsgaisrKQorICAgICAgICAgICAgaWYgKHNbaV0gPT0gc2VwW2pdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGIgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICBpZiAoIWIpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gJnNbaV07Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gcmV0dXJuIHZhbHVlIG9mIGVudiB2YXJpYWJsZSB0aGF0IHBsYWNlZCBpbnRvIHN0YXRpYyBidWZmZXIuCisgKiAhISEgVGhlIHNhbWUgc3RhdGljIGJ1ZmZlciBpcyB1c2VkIGZvciBzdWJzZXF1ZW50IGNhbGxzLiAhISEKKyAqIFRoaXMgd2FzIGRvbmUgdG8gYXZpb2QgZHluYW1pYyBhbGxvY2F0aW9uIGZvciBmZXcgY2FsbHMuCisgKiBBY3R1YWxseSB3ZSBuZWVkIHRoaXMgZnVuY3Rpb24gb25seSBmb3VyIHRpbWVzLgorICovCitzdGF0aWMgY29uc3QgY2hhciogX19pdHRfZ2V0X2Vudl92YXIoY29uc3QgY2hhciogbmFtZSkKK3sKKyNkZWZpbmUgTUFYX0VOVl9WQUxVRV9TSVpFIDQwODYKKyAgICBzdGF0aWMgY2hhciAgZW52X2J1ZmZbTUFYX0VOVl9WQUxVRV9TSVpFXTsKKyAgICBzdGF0aWMgY2hhciogZW52X3ZhbHVlID0gKGNoYXIqKWVudl9idWZmOworCisgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICB7CisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisgICAgICAgIHNpemVfdCBtYXhfbGVuID0gTUFYX0VOVl9WQUxVRV9TSVpFIC0gKHNpemVfdCkoZW52X3ZhbHVlIC0gZW52X2J1ZmYpOworICAgICAgICBEV09SRCByYyA9IEdldEVudmlyb25tZW50VmFyaWFibGVBKG5hbWUsIGVudl92YWx1ZSwgKERXT1JEKW1heF9sZW4pOworICAgICAgICBpZiAocmMgPj0gbWF4X2xlbikKKyAgICAgICAgICAgIF9faXR0X3JlcG9ydF9lcnJvcihfX2l0dF9lcnJvcl9lbnZfdG9vX2xvbmcsIG5hbWUsIChzaXplX3QpcmMgLSAxLCAoc2l6ZV90KShtYXhfbGVuIC0gMSkpOworICAgICAgICBlbHNlIGlmIChyYyA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIHJldCA9IChjb25zdCBjaGFyKillbnZfdmFsdWU7CisgICAgICAgICAgICBlbnZfdmFsdWUgKz0gcmMgKyAxOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIElmIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIGVtcHR5LCBHZXRFbnZpcm9ybm1lbnRWYXJpYWJsZXMoKQorICAgICAgICAgICAgICogcmV0dXJucyB6ZXJvIChudW1iZXIgb2YgY2hhcmFjdGVycyAobm90IGluY2x1ZGluZyB0ZXJtaW5hdGluZyBudWxsKSwKKyAgICAgICAgICAgICAqIGFuZCBHZXRMYXN0RXJyb3IoKSByZXR1cm5zIEVSUk9SX1NVQ0NFU1MuICovCisgICAgICAgICAgICBEV09SRCBlcnIgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gRVJST1JfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICByZXR1cm4gZW52X3ZhbHVlOworCisgICAgICAgICAgICBpZiAoZXJyICE9IEVSUk9SX0VOVlZBUl9OT1RfRk9VTkQpCisgICAgICAgICAgICAgICAgX19pdHRfcmVwb3J0X2Vycm9yKF9faXR0X2Vycm9yX2NhbnRfcmVhZF9lbnYsIG5hbWUsIChpbnQpZXJyKTsKKyAgICAgICAgfQorI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworICAgICAgICBjaGFyKiBlbnYgPSBnZXRlbnYobmFtZSk7CisgICAgICAgIGlmIChlbnYgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbihlbnYpOworICAgICAgICAgICAgc2l6ZV90IG1heF9sZW4gPSBNQVhfRU5WX1ZBTFVFX1NJWkUgLSAoc2l6ZV90KShlbnZfdmFsdWUgLSBlbnZfYnVmZik7CisgICAgICAgICAgICBpZiAobGVuIDwgbWF4X2xlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiByZXQgPSAoY29uc3QgY2hhciopZW52X3ZhbHVlOworICAgICAgICAgICAgICAgIHN0cm5jcHkoZW52X3ZhbHVlLCBlbnYsIGxlbiArIDEpOworICAgICAgICAgICAgICAgIGVudl92YWx1ZSArPSBsZW4gKyAxOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBfX2l0dF9yZXBvcnRfZXJyb3IoX19pdHRfZXJyb3JfZW52X3Rvb19sb25nLCBuYW1lLCAoc2l6ZV90KWxlbiwgKHNpemVfdCkobWF4X2xlbiAtIDEpKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIqIF9faXR0X2dldF9saWJfbmFtZSh2b2lkKQoreworICAgIGNvbnN0IGNoYXIqIGxpYl9uYW1lID0gX19pdHRfZ2V0X2Vudl92YXIoSVRUX1RPX1NUUihMSUJfVkFSX05BTUUpKTsKKworI2lmZGVmIF9fQU5EUk9JRF9fCisgICAgaWYgKGxpYl9uYW1lID09IE5VTEwpCisgICAgeworICAgICAgICBjb25zdCBjaGFyKiBjb25zdCBzeXN0ZW1fd2lkZV9tYXJrZXJfZmlsZW5hbWUgPSAiL2RhdGEvbG9jYWwvdG1wL2NvbS5pbnRlbC5pdHQuY29sbGVjdG9yX2xpYiI7CisgICAgICAgIGludCBpdHRfbWFya2VyX2ZpbGVfZmQgPSBvcGVuKHN5c3RlbV93aWRlX21hcmtlcl9maWxlbmFtZSwgT19SRE9OTFkpOworICAgICAgICBzc2l6ZV90IHJlcyA9IDA7CisKKyAgICAgICAgaWYgKGl0dF9tYXJrZXJfZmlsZV9mZCA9PSAtMSkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgcGlkX3QgbXlfcGlkID0gZ2V0cGlkKCk7CisgICAgICAgICAgICBjaGFyIGNtZGxpbmVfcGF0aFtQQVRIX01BWF0gPSB7MH07CisgICAgICAgICAgICBjaGFyIHBhY2thZ2VfbmFtZVtQQVRIX01BWF0gPSB7MH07CisgICAgICAgICAgICBjaGFyIGFwcF9zYW5kYm94X2ZpbGVbUEFUSF9NQVhdID0gezB9OworICAgICAgICAgICAgaW50IGNtZGxpbmVfZmQgPSAwOworCisgICAgICAgICAgICBJVFRfQU5EUk9JRF9MT0dJKCJVbmFibGUgdG8gb3BlbiBzeXN0ZW0td2lkZSBtYXJrZXIgZmlsZS4iKTsKKyAgICAgICAgICAgIHNucHJpbnRmKGNtZGxpbmVfcGF0aCwgUEFUSF9NQVggLSAxLCAiL3Byb2MvJWQvY21kbGluZSIsIG15X3BpZCk7CisgICAgICAgICAgICBJVFRfQU5EUk9JRF9MT0dJKCJDTUQgZmlsZTogJXNcbiIsIGNtZGxpbmVfcGF0aCk7CisgICAgICAgICAgICBjbWRsaW5lX2ZkID0gb3BlbihjbWRsaW5lX3BhdGgsIE9fUkRPTkxZKTsKKyAgICAgICAgICAgIGlmIChjbWRsaW5lX2ZkID09IC0xKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElUVF9BTkRST0lEX0xPR0UoIlVuYWJsZSB0byBvcGVuICVzIGZpbGUhIiwgY21kbGluZV9wYXRoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGliX25hbWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXMgPSByZWFkKGNtZGxpbmVfZmQsIHBhY2thZ2VfbmFtZSwgUEFUSF9NQVggLSAxKTsKKyAgICAgICAgICAgIGlmIChyZXMgPT0gLTEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSVRUX0FORFJPSURfTE9HRSgiVW5hYmxlIHRvIHJlYWQgJXMgZmlsZSEiLCBjbWRsaW5lX3BhdGgpOworICAgICAgICAgICAgICAgIHJlcyA9IGNsb3NlKGNtZGxpbmVfZmQpOworICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gLTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBJVFRfQU5EUk9JRF9MT0dFKCJVbmFibGUgdG8gY2xvc2UgJXMgZmlsZSEiLCBjbWRsaW5lX3BhdGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbGliX25hbWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXMgPSBjbG9zZShjbWRsaW5lX2ZkKTsKKyAgICAgICAgICAgIGlmIChyZXMgPT0gLTEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSVRUX0FORFJPSURfTE9HRSgiVW5hYmxlIHRvIGNsb3NlICVzIGZpbGUhIiwgY21kbGluZV9wYXRoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGliX25hbWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBJVFRfQU5EUk9JRF9MT0dJKCJQYWNrYWdlIG5hbWU6ICVzXG4iLCBwYWNrYWdlX25hbWUpOworICAgICAgICAgICAgc25wcmludGYoYXBwX3NhbmRib3hfZmlsZSwgUEFUSF9NQVggLSAxLCAiL2RhdGEvZGF0YS8lcy9jb20uaW50ZWwuaXR0LmNvbGxlY3Rvcl9saWIiLCBwYWNrYWdlX25hbWUpOworICAgICAgICAgICAgSVRUX0FORFJPSURfTE9HSSgiTGliIG1hcmtlciBmaWxlIG5hbWU6ICVzXG4iLCBhcHBfc2FuZGJveF9maWxlKTsKKyAgICAgICAgICAgIGl0dF9tYXJrZXJfZmlsZV9mZCA9IG9wZW4oYXBwX3NhbmRib3hfZmlsZSwgT19SRE9OTFkpOworICAgICAgICAgICAgaWYgKGl0dF9tYXJrZXJfZmlsZV9mZCA9PSAtMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJVFRfQU5EUk9JRF9MT0dFKCJVbmFibGUgdG8gb3BlbiBhcHAgbWFya2VyIGZpbGUhIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxpYl9uYW1lOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgeworICAgICAgICAgICAgY2hhciBpdHRfbGliX25hbWVbUEFUSF9NQVhdID0gezB9OworCisgICAgICAgICAgICByZXMgPSByZWFkKGl0dF9tYXJrZXJfZmlsZV9mZCwgaXR0X2xpYl9uYW1lLCBQQVRIX01BWCAtIDEpOworICAgICAgICAgICAgaWYgKHJlcyA9PSAtMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJVFRfQU5EUk9JRF9MT0dFKCJVbmFibGUgdG8gcmVhZCAlcyBmaWxlISIsIGl0dF9tYXJrZXJfZmlsZV9mZCk7CisgICAgICAgICAgICAgICAgcmVzID0gY2xvc2UoaXR0X21hcmtlcl9maWxlX2ZkKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzID09IC0xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgSVRUX0FORFJPSURfTE9HRSgiVW5hYmxlIHRvIGNsb3NlICVzIGZpbGUhIiwgaXR0X21hcmtlcl9maWxlX2ZkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGxpYl9uYW1lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgSVRUX0FORFJPSURfTE9HSSgiSVRUIExpYiBwYXRoOiAlcyIsIGl0dF9saWJfbmFtZSk7CisgICAgICAgICAgICByZXMgPSBjbG9zZShpdHRfbWFya2VyX2ZpbGVfZmQpOworICAgICAgICAgICAgaWYgKHJlcyA9PSAtMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJVFRfQU5EUk9JRF9MT0dFKCJVbmFibGUgdG8gY2xvc2UgJXMgZmlsZSEiLCBpdHRfbWFya2VyX2ZpbGVfZmQpOworICAgICAgICAgICAgICAgIHJldHVybiBsaWJfbmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIElUVF9BTkRST0lEX0xPR0koIlNldCBlbnYiKTsKKyAgICAgICAgICAgIHJlcyA9IHNldGVudihJVFRfVE9fU1RSKExJQl9WQVJfTkFNRSksIGl0dF9saWJfbmFtZSwgMCk7CisgICAgICAgICAgICBpZiAocmVzID09IC0xKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElUVF9BTkRST0lEX0xPR0UoIlVuYWJsZSB0byBzZXQgZW52IHZhciEiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGliX25hbWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsaWJfbmFtZSA9IF9faXR0X2dldF9lbnZfdmFyKElUVF9UT19TVFIoTElCX1ZBUl9OQU1FKSk7CisgICAgICAgICAgICBJVFRfQU5EUk9JRF9MT0dJKCJJVFQgTGliIHBhdGggZnJvbSBlbnY6ICVzIiwgaXR0X2xpYl9uYW1lKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIGxpYl9uYW1lOworfQorCisjaWZuZGVmIG1pbgorI2RlZmluZSBtaW4oYSxiKSAoYSkgPCAoYikgPyAoYSkgOiAoYikKKyNlbmRpZiAvKiBtaW4gKi8KKworc3RhdGljIF9faXR0X2dyb3VwX2lkIF9faXR0X2dldF9ncm91cHModm9pZCkKK3sKKyAgICByZWdpc3RlciBpbnQgaTsKKyAgICBfX2l0dF9ncm91cF9pZCByZXMgPSBfX2l0dF9ncm91cF9ub25lOworICAgIGNvbnN0IGNoYXIqIHZhcl9uYW1lICA9ICJJTlRFTF9JVFROT1RJRllfR1JPVVBTIjsKKyAgICBjb25zdCBjaGFyKiBncm91cF9zdHIgPSBfX2l0dF9nZXRfZW52X3Zhcih2YXJfbmFtZSk7CisKKyAgICBpZiAoZ3JvdXBfc3RyICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnQgbGVuOworICAgICAgICBjaGFyIGdyWzI1NV07CisgICAgICAgIGNvbnN0IGNoYXIqIGNodW5rOworICAgICAgICB3aGlsZSAoKGdyb3VwX3N0ciA9IF9faXR0X2ZzcGxpdChncm91cF9zdHIsICIsOyAiLCAmY2h1bmssICZsZW4pKSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBfX2l0dF9mc3RyY3B5bihnciwgY2h1bmssIHNpemVvZihncikgLSAxKTsKKyAgICAgICAgICAgIGdyW21pbihsZW4sIChpbnQpKHNpemVvZihncikgLSAxKSldID0gMDsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgZ3JvdXBfbGlzdFtpXS5uYW1lICE9IE5VTEw7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIV9faXR0X2ZzdHJjbXAoZ3IsIGdyb3VwX2xpc3RbaV0ubmFtZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXMgPSAoX19pdHRfZ3JvdXBfaWQpKHJlcyB8IGdyb3VwX2xpc3RbaV0uaWQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogVE9ETzogISEhIFdvcmthcm91bmQgZm9yIGJ1ZyB3aXRoIHdhcm5pbmcgZm9yIHVua25vd24gZ3JvdXAgISEhCisgICAgICAgICAqIFNob3VsZCBiZSBmaXhlZCBpbiBuZXcgaW5pdGlhbGl6YXRpb24gc2NoZW1lLgorICAgICAgICAgKiBOb3cgdGhlIGZvbGxvd2luZyBncm91cHMgc2hvdWxkIGJlIHNldCBhbHdheXMuICovCisgICAgICAgIGZvciAoaSA9IDA7IGdyb3VwX2xpc3RbaV0uaWQgIT0gX19pdHRfZ3JvdXBfbm9uZTsgaSsrKQorICAgICAgICAgICAgaWYgKGdyb3VwX2xpc3RbaV0uaWQgIT0gX19pdHRfZ3JvdXBfYWxsICYmCisgICAgICAgICAgICAgICAgZ3JvdXBfbGlzdFtpXS5pZCA+IF9faXR0X2dyb3VwX3NwbGl0dGVyX21pbiAmJgorICAgICAgICAgICAgICAgIGdyb3VwX2xpc3RbaV0uaWQgPCBfX2l0dF9ncm91cF9zcGxpdHRlcl9tYXgpCisgICAgICAgICAgICAgICAgcmVzID0gKF9faXR0X2dyb3VwX2lkKShyZXMgfCBncm91cF9saXN0W2ldLmlkKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgZ3JvdXBfYWxpYXNbaV0uZW52X3ZhciAhPSBOVUxMOyBpKyspCisgICAgICAgICAgICBpZiAoX19pdHRfZ2V0X2Vudl92YXIoZ3JvdXBfYWxpYXNbaV0uZW52X3ZhcikgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZ3JvdXBfYWxpYXNbaV0uZ3JvdXBzOworICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQgX19pdHRfbGliX3ZlcnNpb24obGliX3QgbGliKQoreworICAgIGlmIChsaWIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKF9faXR0X2dldF9wcm9jKGxpYiwgIl9faXR0X2FwaV9pbml0IikpCisgICAgICAgIHJldHVybiAyOworICAgIGlmIChfX2l0dF9nZXRfcHJvYyhsaWIsICJfX2l0dF9hcGlfdmVyc2lvbiIpKQorICAgICAgICByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKK30KKworLyogSXQncyBub3QgdXNlZCByaWdodCBub3chIENvbW1lbnQgaXQgb3V0IHRvIGF2b2lkIHdhcm5pbmdzLgorc3RhdGljIHZvaWQgX19pdHRfcmVpbml0X2FsbF9wb2ludGVycyh2b2lkKQoreworICAgIHJlZ2lzdGVyIGludCBpOworICAgIC8vIEZpbGwgYWxsIHBvaW50ZXJzIHdpdGggaW5pdGlhbCBzdHVicworICAgIGZvciAoaSA9IDA7IF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorICAgICAgICAqX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0uZnVuY19wdHIgPSBfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5pbml0X2Z1bmM7Cit9CisqLworCitzdGF0aWMgdm9pZCBfX2l0dF9udWxsaWZ5X2FsbF9wb2ludGVycyh2b2lkKQoreworICAgIHJlZ2lzdGVyIGludCBpOworICAgIC8qIE51bGlmeSBhbGwgcG9pbnRlcnMgZXhjZXB0IGRvbWFpbl9jcmVhdGUgYW5kIHN0cmluZ19oYW5kbGVfY3JlYXRlICovCisgICAgZm9yIChpID0gMDsgX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0ubmFtZSAhPSBOVUxMOyBpKyspCisgICAgICAgICpfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5mdW5jX3B0ciA9IF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLm51bGxfZnVuYzsKK30KKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI3ByYWdtYSB3YXJuaW5nKHB1c2gpCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTogNDA1NCkgLyogd2FybmluZyBDNDA1NDogJ3R5cGUgY2FzdCcgOiBmcm9tIGZ1bmN0aW9uIHBvaW50ZXIgJ1hYWCcgdG8gZGF0YSBwb2ludGVyICd2b2lkIConICovCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTogNDA1NSkgLyogd2FybmluZyBDNDA1NTogJ3R5cGUgY2FzdCcgOiBmcm9tIGRhdGEgcG9pbnRlciAndm9pZCAqJyB0byBmdW5jdGlvbiBwb2ludGVyICdYWFgnICovCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKK0lUVF9FWFRFUk5fQyB2b2lkIF9OXyhmaW5pX2l0dGxpYikodm9pZCkKK3sKKyAgICBfX2l0dF9hcGlfZmluaV90KiBfX2l0dF9hcGlfZmluaV9wdHI7CisgICAgc3RhdGljIHZvbGF0aWxlIFRJRFQgY3VycmVudF90aHJlYWQgPSAwOworCisgICAgaWYgKF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2luaXRpYWxpemVkKQorICAgIHsKKyAgICAgICAgX19pdHRfbXV0ZXhfbG9jaygmX05fKF9pdHRhcGlfZ2xvYmFsKS5tdXRleCk7CisgICAgICAgIGlmIChfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9pbml0aWFsaXplZCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGN1cnJlbnRfdGhyZWFkID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3VycmVudF90aHJlYWQgPSBfX2l0dF90aHJlYWRfaWQoKTsKKyAgICAgICAgICAgICAgICBfX2l0dF9hcGlfZmluaV9wdHIgPSAoX19pdHRfYXBpX2ZpbmlfdCopKHNpemVfdClfX2l0dF9nZXRfcHJvYyhfTl8oX2l0dGFwaV9nbG9iYWwpLmxpYiwgIl9faXR0X2FwaV9maW5pIik7CisgICAgICAgICAgICAgICAgaWYgKF9faXR0X2FwaV9maW5pX3B0cikKKyAgICAgICAgICAgICAgICAgICAgX19pdHRfYXBpX2ZpbmlfcHRyKCZfTl8oX2l0dGFwaV9nbG9iYWwpKTsKKworICAgICAgICAgICAgICAgIF9faXR0X251bGxpZnlfYWxsX3BvaW50ZXJzKCk7CisKKyAvKiBUT0RPOiAhISEgbm90IHNhZmUgISEhIGRvbid0IHN1cHBvcnQgdW5sb2FkIHNvIGZhci4KKyAgKiAgICAgICAgICAgICBpZiAoX05fKF9pdHRhcGlfZ2xvYmFsKS5saWIgIT0gTlVMTCkKKyAgKiAgICAgICAgICAgICAgICAgX19pdHRfdW5sb2FkX2xpYihfTl8oX2l0dGFwaV9nbG9iYWwpLmxpYik7CisgICogICAgICAgICAgICAgX05fKF9pdHRhcGlfZ2xvYmFsKS5saWIgPSBOVUxMOworICAqLworICAgICAgICAgICAgICAgIF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2luaXRpYWxpemVkID0gMDsKKyAgICAgICAgICAgICAgICBjdXJyZW50X3RocmVhZCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgX19pdHRfbXV0ZXhfdW5sb2NrKCZfTl8oX2l0dGFwaV9nbG9iYWwpLm11dGV4KTsKKyAgICB9Cit9CisKK0lUVF9FWFRFUk5fQyBpbnQgX05fKGluaXRfaXR0bGliKShjb25zdCBjaGFyKiBsaWJfbmFtZSwgX19pdHRfZ3JvdXBfaWQgaW5pdF9ncm91cHMpCit7CisgICAgcmVnaXN0ZXIgaW50IGk7CisgICAgX19pdHRfZ3JvdXBfaWQgZ3JvdXBzOworI2lmZGVmIElUVF9DT01QTEVURV9HUk9VUAorICAgIF9faXR0X2dyb3VwX2lkIHplcm9fZ3JvdXAgPSBfX2l0dF9ncm91cF9ub25lOworI2VuZGlmIC8qIElUVF9DT01QTEVURV9HUk9VUCAqLworICAgIHN0YXRpYyB2b2xhdGlsZSBUSURUIGN1cnJlbnRfdGhyZWFkID0gMDsKKworICAgIGlmICghX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfaW5pdGlhbGl6ZWQpCisgICAgeworI2lmbmRlZiBJVFRfU0lNUExFX0lOSVQKKyAgICAgICAgSVRUX01VVEVYX0lOSVRfQU5EX0xPQ0soX05fKF9pdHRhcGlfZ2xvYmFsKSk7CisjZW5kaWYgLyogSVRUX1NJTVBMRV9JTklUICovCisKKyAgICAgICAgaWYgKCFfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9pbml0aWFsaXplZCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGN1cnJlbnRfdGhyZWFkID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3VycmVudF90aHJlYWQgPSBfX2l0dF90aHJlYWRfaWQoKTsKKyAgICAgICAgICAgICAgICBfTl8oX2l0dGFwaV9nbG9iYWwpLnRocmVhZF9saXN0LT50aWQgPSBjdXJyZW50X3RocmVhZDsKKyAgICAgICAgICAgICAgICBpZiAobGliX25hbWUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgbGliX25hbWUgPSBfX2l0dF9nZXRfbGliX25hbWUoKTsKKyAgICAgICAgICAgICAgICBncm91cHMgPSBfX2l0dF9nZXRfZ3JvdXBzKCk7CisgICAgICAgICAgICAgICAgaWYgKGdyb3VwcyAhPSBfX2l0dF9ncm91cF9ub25lIHx8IGxpYl9uYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfTl8oX2l0dGFwaV9nbG9iYWwpLmxpYiA9IF9faXR0X2xvYWRfbGliKChsaWJfbmFtZSA9PSBOVUxMKSA/IGl0dG5vdGlmeV9saWJfbmFtZSA6IGxpYl9uYW1lKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoX05fKF9pdHRhcGlfZ2xvYmFsKS5saWIgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX19pdHRfYXBpX2luaXRfdCogX19pdHRfYXBpX2luaXRfcHRyOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpYl92ZXJzaW9uID0gX19pdHRfbGliX3ZlcnNpb24oX05fKF9pdHRhcGlfZ2xvYmFsKS5saWIpOworCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGxpYl92ZXJzaW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBzID0gX19pdHRfZ3JvdXBfbGVnYWN5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbGwgYWxsIHBvaW50ZXJzIGZyb20gZHluYW1pYyBsaWJyYXJ5ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0ubmFtZSAhPSBOVUxMOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0uZ3JvdXAgJiBncm91cHMgJiBpbml0X2dyb3VwcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKl9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLmZ1bmNfcHRyID0gKHZvaWQqKV9faXR0X2dldF9wcm9jKF9OXyhfaXR0YXBpX2dsb2JhbCkubGliLCBfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0uZnVuY19wdHIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXN0b3JlIHBvaW50ZXJzIGZvciBmdW5jdGlvbiB3aXRoIHN0YXRpYyBpbXBsZW1lbnRhdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5mdW5jX3B0ciA9IF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLm51bGxfZnVuYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2l0dF9yZXBvcnRfZXJyb3IoX19pdHRfZXJyb3Jfbm9fc3ltYm9sLCBsaWJfbmFtZSwgX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0ubmFtZSk7CisjaWZkZWYgSVRUX0NPTVBMRVRFX0dST1VQCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemVyb19ncm91cCA9IChfX2l0dF9ncm91cF9pZCkoemVyb19ncm91cCB8IF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLmdyb3VwKTsKKyNlbmRpZiAvKiBJVFRfQ09NUExFVEVfR1JPVVAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0uZnVuY19wdHIgPSBfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5udWxsX2Z1bmM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwcyA9PSBfX2l0dF9ncm91cF9sZWdhY3kpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb21wYXRpYmlsaXR5IHdpdGggbGVnYWN5IHRvb2xzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHRocmVhZF9pZ25vcmUpICA9IElUVE5PVElGWV9OQU1FKHRocl9pZ25vcmUpOworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVFROT1RJRllfTkFNRShzeW5jX2NyZWF0ZUEpICAgPSBJVFROT1RJRllfTkFNRShzeW5jX3NldF9uYW1lQSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHN5bmNfY3JlYXRlVykgICA9IElUVE5PVElGWV9OQU1FKHN5bmNfc2V0X25hbWVXKTsKKyNlbHNlICAvKiBJVFRfUExBVEZPUk0hPUlUVF9QTEFURk9STV9XSU4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRUTk9USUZZX05BTUUoc3luY19jcmVhdGUpICAgID0gSVRUTk9USUZZX05BTUUoc3luY19zZXRfbmFtZSk7CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHN5bmNfcHJlcGFyZSkgICA9IElUVE5PVElGWV9OQU1FKG5vdGlmeV9zeW5jX3ByZXBhcmUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVFROT1RJRllfTkFNRShzeW5jX2NhbmNlbCkgICAgPSBJVFROT1RJRllfTkFNRShub3RpZnlfc3luY19jYW5jZWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVFROT1RJRllfTkFNRShzeW5jX2FjcXVpcmVkKSAgPSBJVFROT1RJRllfTkFNRShub3RpZnlfc3luY19hY3F1aXJlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHN5bmNfcmVsZWFzaW5nKSA9IElUVE5PVElGWV9OQU1FKG5vdGlmeV9zeW5jX3JlbGVhc2luZyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisjaWZkZWYgSVRUX0NPTVBMRVRFX0dST1VQCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0ubmFtZSAhPSBOVUxMOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5ncm91cCAmIHplcm9fZ3JvdXApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0uZnVuY19wdHIgPSBfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5udWxsX2Z1bmM7CisjZW5kaWYgLyogSVRUX0NPTVBMRVRFX0dST1VQICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pdHRfYXBpX2luaXRfcHRyID0gKF9faXR0X2FwaV9pbml0X3QqKShzaXplX3QpX19pdHRfZ2V0X3Byb2MoX05fKF9pdHRhcGlfZ2xvYmFsKS5saWIsICJfX2l0dF9hcGlfaW5pdCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfX2l0dF9hcGlfaW5pdF9wdHIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faXR0X2FwaV9pbml0X3B0cigmX05fKF9pdHRhcGlfZ2xvYmFsKSwgaW5pdF9ncm91cHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX19pdHRfbnVsbGlmeV9hbGxfcG9pbnRlcnMoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgX19pdHRfcmVwb3J0X2Vycm9yKF9faXR0X2Vycm9yX25vX21vZHVsZSwgbGliX25hbWUsCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pdHRfc3lzdGVtX2Vycm9yKCkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbGVycm9yKCkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX19pdHRfbnVsbGlmeV9hbGxfcG9pbnRlcnMoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfaW5pdGlhbGl6ZWQgPSAxOworICAgICAgICAgICAgICAgIGN1cnJlbnRfdGhyZWFkID0gMDsKKyAgICAgICAgICAgICAgICAvKiAhISEgSnVzdCB0byBhdm9pZCB1bnVzZWQgY29kZSBlbGltaW5hdGlvbiAhISEgKi8KKyAgICAgICAgICAgICAgICBpZiAoX19pdHRfZmluaV9pdHRsaWJfcHRyID09IF9OXyhmaW5pX2l0dGxpYikpIGN1cnJlbnRfdGhyZWFkID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisjaWZuZGVmIElUVF9TSU1QTEVfSU5JVAorICAgICAgICBfX2l0dF9tdXRleF91bmxvY2soJl9OXyhfaXR0YXBpX2dsb2JhbCkubXV0ZXgpOworI2VuZGlmIC8qIElUVF9TSU1QTEVfSU5JVCAqLworICAgIH0KKworICAgIC8qIEV2YWx1YXRpbmcgaWYgYW55IGZ1bmN0aW9uIHB0ciBpcyBub24gZW1wdHkgYW5kIGl0J3MgaW4gaW5pdF9ncm91cHMgKi8KKyAgICBmb3IgKGkgPSAwOyBfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5uYW1lICE9IE5VTEw7IGkrKykKKyAgICAgICAgaWYgKCpfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5mdW5jX3B0ciAhPSBfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5udWxsX2Z1bmMgJiYKKyAgICAgICAgICAgIF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLmdyb3VwICYgaW5pdF9ncm91cHMpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKK30KKworSVRUX0VYVEVSTl9DIF9faXR0X2Vycm9yX2hhbmRsZXJfdCogX05fKHNldF9lcnJvcl9oYW5kbGVyKShfX2l0dF9lcnJvcl9oYW5kbGVyX3QqIGhhbmRsZXIpCit7CisgICAgX19pdHRfZXJyb3JfaGFuZGxlcl90KiBwcmV2ID0gKF9faXR0X2Vycm9yX2hhbmRsZXJfdCopKHNpemVfdClfTl8oX2l0dGFwaV9nbG9iYWwpLmVycm9yX2hhbmRsZXI7CisgICAgX05fKF9pdHRhcGlfZ2xvYmFsKS5lcnJvcl9oYW5kbGVyID0gKHZvaWQqKShzaXplX3QpaGFuZGxlcjsKKyAgICByZXR1cm4gcHJldjsKK30KKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI3ByYWdtYSB3YXJuaW5nKHBvcCkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvaXR0bm90aWZ5X3N0YXRpYy5oIGIvZmluYWwvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvaXR0bm90aWZ5X3N0YXRpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMThjYzgKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9pdHRub3RpZnlfc3RhdGljLmgKQEAgLTAsMCArMSwzMTYgQEAKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIml0dG5vdGlmeV9jb25maWcuaCIKKworI2lmbmRlZiBJVFRfRk9STUFUX0RFRklORUQKKyMgIGlmbmRlZiBJVFRfRk9STUFUCisjICAgIGRlZmluZSBJVFRfRk9STUFUCisjICBlbmRpZiAvKiBJVFRfRk9STUFUICovCisjICBpZm5kZWYgSVRUX05PX1BBUkFNUworIyAgICBkZWZpbmUgSVRUX05PX1BBUkFNUworIyAgZW5kaWYgLyogSVRUX05PX1BBUkFNUyAqLworI2VuZGlmIC8qIElUVF9GT1JNQVRfREVGSU5FRCAqLworCisvKgorICogcGFyYW1ldGVycyBmb3IgbWFjcm8gZXhwZWN0ZWQ6CisgKiBJVFRfU1RVQihhcGksIHR5cGUsIGZ1bmNfbmFtZSwgYXJndW1lbnRzLCBwYXJhbXMsIGZ1bmNfbmFtZV9pbl9kbGwsIGdyb3VwLCBwcmludGZfZm10KQorICovCisjaWZkZWYgX19JVFRfSU5URVJOQUxfSU5JVAorCisjaWZuZGVmIF9fSVRUX0lOVEVSTkFMX0JPRFkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfZG9tYWluKiwgZG9tYWluX2NyZWF0ZUEsIChjb25zdCBjaGFyICAgICpuYW1lKSwgKElUVF9GT1JNQVQgbmFtZSksIGRvbWFpbl9jcmVhdGVBLCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICJcIiVzXCIiKQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9kb21haW4qLCBkb21haW5fY3JlYXRlVywgKGNvbnN0IHdjaGFyX3QgKm5hbWUpLCAoSVRUX0ZPUk1BVCBuYW1lKSwgZG9tYWluX2NyZWF0ZVcsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIlwiJVNcIiIpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2RvbWFpbiosIGRvbWFpbl9jcmVhdGUsICAoY29uc3QgY2hhciAgICAqbmFtZSksIChJVFRfRk9STUFUIG5hbWUpLCBkb21haW5fY3JlYXRlLCAgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiXCIlc1wiIikKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9zdHJpbmdfaGFuZGxlKiwgc3RyaW5nX2hhbmRsZV9jcmVhdGVBLCAoY29uc3QgY2hhciAgICAqbmFtZSksIChJVFRfRk9STUFUIG5hbWUpLCBzdHJpbmdfaGFuZGxlX2NyZWF0ZUEsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIlwiJXNcIiIpCitJVFRfU1RVQihJVFRBUEksIF9faXR0X3N0cmluZ19oYW5kbGUqLCBzdHJpbmdfaGFuZGxlX2NyZWF0ZVcsIChjb25zdCB3Y2hhcl90ICpuYW1lKSwgKElUVF9GT1JNQVQgbmFtZSksIHN0cmluZ19oYW5kbGVfY3JlYXRlVywgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiXCIlU1wiIikKKyNlbHNlICAvKiBJVFRfUExBVEZPUk0hPUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfc3RyaW5nX2hhbmRsZSosIHN0cmluZ19oYW5kbGVfY3JlYXRlLCAgKGNvbnN0IGNoYXIgICAgKm5hbWUpLCAoSVRUX0ZPUk1BVCBuYW1lKSwgc3RyaW5nX2hhbmRsZV9jcmVhdGUsICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICJcIiVzXCIiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBwYXVzZSwgICh2b2lkKSwgKElUVF9OT19QQVJBTVMpLCBwYXVzZSwgIF9faXR0X2dyb3VwX2NvbnRyb2wgfCBfX2l0dF9ncm91cF9sZWdhY3ksICJubyBhcmdzIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHJlc3VtZSwgKHZvaWQpLCAoSVRUX05PX1BBUkFNUyksIHJlc3VtZSwgX19pdHRfZ3JvdXBfY29udHJvbCB8IF9faXR0X2dyb3VwX2xlZ2FjeSwgIm5vIGFyZ3MiKQorCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0aHJlYWRfc2V0X25hbWVBLCAoY29uc3QgY2hhciAgICAqbmFtZSksIChJVFRfRk9STUFUIG5hbWUpLCB0aHJlYWRfc2V0X25hbWVBLCBfX2l0dF9ncm91cF90aHJlYWQsICJcIiVzXCIiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGhyZWFkX3NldF9uYW1lVywgKGNvbnN0IHdjaGFyX3QgKm5hbWUpLCAoSVRUX0ZPUk1BVCBuYW1lKSwgdGhyZWFkX3NldF9uYW1lVywgX19pdHRfZ3JvdXBfdGhyZWFkLCAiXCIlU1wiIikKKyNlbHNlICAvKiBJVFRfUExBVEZPUk0hPUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRocmVhZF9zZXRfbmFtZSwgIChjb25zdCBjaGFyICAgICpuYW1lKSwgKElUVF9GT1JNQVQgbmFtZSksIHRocmVhZF9zZXRfbmFtZSwgIF9faXR0X2dyb3VwX3RocmVhZCwgIlwiJXNcIiIpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0aHJlYWRfaWdub3JlLCAodm9pZCksIChJVFRfTk9fUEFSQU1TKSwgdGhyZWFkX2lnbm9yZSwgX19pdHRfZ3JvdXBfdGhyZWFkLCAibm8gYXJncyIpCisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKExJQklUVEFQSSwgaW50LCAgdGhyX25hbWVfc2V0QSwgKGNvbnN0IGNoYXIgICAgKm5hbWUsIGludCBuYW1lbGVuKSwgKElUVF9GT1JNQVQgbmFtZSwgbmFtZWxlbiksIHRocl9uYW1lX3NldEEsIF9faXR0X2dyb3VwX3RocmVhZCB8IF9faXR0X2dyb3VwX2xlZ2FjeSwgIlwiJXNcIiwgJWQiKQorSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsICB0aHJfbmFtZV9zZXRXLCAoY29uc3Qgd2NoYXJfdCAqbmFtZSwgaW50IG5hbWVsZW4pLCAoSVRUX0ZPUk1BVCBuYW1lLCBuYW1lbGVuKSwgdGhyX25hbWVfc2V0VywgX19pdHRfZ3JvdXBfdGhyZWFkIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiXCIlU1wiLCAlZCIpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihMSUJJVFRBUEksIGludCwgIHRocl9uYW1lX3NldCwgIChjb25zdCBjaGFyICAgICpuYW1lLCBpbnQgbmFtZWxlbiksIChJVFRfRk9STUFUIG5hbWUsIG5hbWVsZW4pLCB0aHJfbmFtZV9zZXQsICBfX2l0dF9ncm91cF90aHJlYWQgfCBfX2l0dF9ncm91cF9sZWdhY3ksICJcIiVzXCIsICVkIikKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCVihMSUJJVFRBUEksIHZvaWQsIHRocl9pZ25vcmUsICAgKHZvaWQpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9OT19QQVJBTVMpLCAgICAgICAgICAgIHRocl9pZ25vcmUsICAgIF9faXR0X2dyb3VwX3RocmVhZCB8IF9faXR0X2dyb3VwX2xlZ2FjeSwgIm5vIGFyZ3MiKQorI2VuZGlmIC8qIF9fSVRUX0lOVEVSTkFMX0JPRFkgKi8KKworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgZW5hYmxlX2F0dGFjaCwgKHZvaWQpLCAoSVRUX05PX1BBUkFNUyksIGVuYWJsZV9hdHRhY2gsIF9faXR0X2dyb3VwX2FsbCwgIm5vIGFyZ3MiKQorCisjZWxzZSAgLyogX19JVFRfSU5URVJOQUxfSU5JVCAqLworCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX2NyZWF0ZUEsICh2b2lkICphZGRyLCBjb25zdCBjaGFyICAgICpvYmp0eXBlLCBjb25zdCBjaGFyICAgICpvYmpuYW1lLCBpbnQgYXR0cmlidXRlKSwgKElUVF9GT1JNQVQgYWRkciwgb2JqdHlwZSwgb2JqbmFtZSwgYXR0cmlidXRlKSwgc3luY19jcmVhdGVBLCBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMsICIlcCwgXCIlc1wiLCBcIiVzXCIsICV4IikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfY3JlYXRlVywgKHZvaWQgKmFkZHIsIGNvbnN0IHdjaGFyX3QgKm9ianR5cGUsIGNvbnN0IHdjaGFyX3QgKm9iam5hbWUsIGludCBhdHRyaWJ1dGUpLCAoSVRUX0ZPUk1BVCBhZGRyLCBvYmp0eXBlLCBvYmpuYW1lLCBhdHRyaWJ1dGUpLCBzeW5jX2NyZWF0ZVcsIF9faXR0X2dyb3VwX3N5bmMgfCBfX2l0dF9ncm91cF9mc3luYywgIiVwLCBcIiVTXCIsIFwiJVNcIiwgJXgiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19yZW5hbWVBLCAodm9pZCAqYWRkciwgY29uc3QgY2hhciAgICAqbmFtZSksIChJVFRfRk9STUFUIGFkZHIsIG5hbWUpLCBzeW5jX3JlbmFtZUEsIF9faXR0X2dyb3VwX3N5bmMgfCBfX2l0dF9ncm91cF9mc3luYywgIiVwLCBcIiVzXCIiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19yZW5hbWVXLCAodm9pZCAqYWRkciwgY29uc3Qgd2NoYXJfdCAqbmFtZSksIChJVFRfRk9STUFUIGFkZHIsIG5hbWUpLCBzeW5jX3JlbmFtZVcsIF9faXR0X2dyb3VwX3N5bmMgfCBfX2l0dF9ncm91cF9mc3luYywgIiVwLCBcIiVTXCIiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19jcmVhdGUsICAodm9pZCAqYWRkciwgY29uc3QgY2hhciAgICAqb2JqdHlwZSwgY29uc3QgY2hhciAgICAqb2JqbmFtZSwgaW50IGF0dHJpYnV0ZSksIChJVFRfRk9STUFUIGFkZHIsIG9ianR5cGUsIG9iam5hbWUsIGF0dHJpYnV0ZSksIHN5bmNfY3JlYXRlLCAgX19pdHRfZ3JvdXBfc3luYyB8IF9faXR0X2dyb3VwX2ZzeW5jLCAiJXAsIFwiJXNcIiwgXCIlc1wiLCAleCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX3JlbmFtZSwgICh2b2lkICphZGRyLCBjb25zdCBjaGFyICAgICpuYW1lKSwgKElUVF9GT1JNQVQgYWRkciwgbmFtZSksIHN5bmNfcmVuYW1lLCAgX19pdHRfZ3JvdXBfc3luYyB8IF9faXR0X2dyb3VwX2ZzeW5jLCAiJXAsIFwiJXNcIiIpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX2Rlc3Ryb3ksICAgICh2b2lkICphZGRyKSwgKElUVF9GT1JNQVQgYWRkciksIHN5bmNfZGVzdHJveSwgICBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMsICIlcCIpCisKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfcHJlcGFyZSwgICAgKHZvaWQqIGFkZHIpLCAoSVRUX0ZPUk1BVCBhZGRyKSwgc3luY19wcmVwYXJlLCAgIF9faXR0X2dyb3VwX3N5bmMsICAiJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19jYW5jZWwsICAgICAodm9pZCAqYWRkciksIChJVFRfRk9STUFUIGFkZHIpLCBzeW5jX2NhbmNlbCwgICAgX19pdHRfZ3JvdXBfc3luYywgICIlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX2FjcXVpcmVkLCAgICh2b2lkICphZGRyKSwgKElUVF9GT1JNQVQgYWRkciksIHN5bmNfYWNxdWlyZWQsICBfX2l0dF9ncm91cF9zeW5jLCAgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfcmVsZWFzaW5nLCAgKHZvaWQqIGFkZHIpLCAoSVRUX0ZPUk1BVCBhZGRyKSwgc3luY19yZWxlYXNpbmcsIF9faXR0X2dyb3VwX3N5bmMsICAiJXAiKQorCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzdXBwcmVzc19wdXNoLCAgICAgICAodW5zaWduZWQgaW50IG1hc2spLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgbWFzayksIHN1cHByZXNzX3B1c2gsICBfX2l0dF9ncm91cF9zdXBwcmVzcywgICIlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzdXBwcmVzc19wb3AsICAgICAgICAodm9pZCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9OT19QQVJBTVMpLCAgIHN1cHByZXNzX3BvcCwgICBfX2l0dF9ncm91cF9zdXBwcmVzcywgICJubyBhcmdzIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN1cHByZXNzX21hcmtfcmFuZ2UsIChfX2l0dF9zdXBwcmVzc19tb2RlX3QgbW9kZSwgdW5zaWduZWQgaW50IG1hc2ssIHZvaWQgKiBhZGRyZXNzLCBzaXplX3Qgc2l6ZSksKElUVF9GT1JNQVQgbW9kZSwgbWFzaywgYWRkcmVzcywgc2l6ZSksIHN1cHByZXNzX21hcmtfcmFuZ2UsIF9faXR0X2dyb3VwX3N1cHByZXNzLCAiJWQsICVwLCAlcCwgJWQiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3VwcHJlc3NfY2xlYXJfcmFuZ2UsKF9faXR0X3N1cHByZXNzX21vZGVfdCBtb2RlLCB1bnNpZ25lZCBpbnQgbWFzaywgdm9pZCAqIGFkZHJlc3MsIHNpemVfdCBzaXplKSwoSVRUX0ZPUk1BVCBtb2RlLCBtYXNrLCBhZGRyZXNzLCBzaXplKSwgc3VwcHJlc3NfY2xlYXJfcmFuZ2UsX19pdHRfZ3JvdXBfc3VwcHJlc3MsICIlZCwgJXAsICVwLCAlZCIpCisKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGZzeW5jX3ByZXBhcmUsICAgKHZvaWQqIGFkZHIpLCAoSVRUX0ZPUk1BVCBhZGRyKSwgc3luY19wcmVwYXJlLCAgIF9faXR0X2dyb3VwX2ZzeW5jLCAiJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgZnN5bmNfY2FuY2VsLCAgICAodm9pZCAqYWRkciksIChJVFRfRk9STUFUIGFkZHIpLCBzeW5jX2NhbmNlbCwgICAgX19pdHRfZ3JvdXBfZnN5bmMsICIlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmc3luY19hY3F1aXJlZCwgICh2b2lkICphZGRyKSwgKElUVF9GT1JNQVQgYWRkciksIHN5bmNfYWNxdWlyZWQsICBfX2l0dF9ncm91cF9mc3luYywgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGZzeW5jX3JlbGVhc2luZywgKHZvaWQqIGFkZHIpLCAoSVRUX0ZPUk1BVCBhZGRyKSwgc3luY19yZWxlYXNpbmcsIF9faXR0X2dyb3VwX2ZzeW5jLCAiJXAiKQorCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9zaXRlX2JlZ2luLCAgICAgICAgICAoX19pdHRfbW9kZWxfc2l0ZSAqc2l0ZSwgX19pdHRfbW9kZWxfc2l0ZV9pbnN0YW5jZSAqaW5zdGFuY2UsIGNvbnN0IGNoYXIgKm5hbWUpLCAoSVRUX0ZPUk1BVCBzaXRlLCBpbnN0YW5jZSwgbmFtZSksIG1vZGVsX3NpdGVfYmVnaW4sIF9faXR0X2dyb3VwX21vZGVsLCAiJXAsICVwLCBcIiVzXCIiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfc2l0ZV9lbmQsICAgICAgICAgICAgKF9faXR0X21vZGVsX3NpdGUgKnNpdGUsIF9faXR0X21vZGVsX3NpdGVfaW5zdGFuY2UgKmluc3RhbmNlKSwgICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgc2l0ZSwgaW5zdGFuY2UpLCAgICAgICBtb2RlbF9zaXRlX2VuZCwgICBfX2l0dF9ncm91cF9tb2RlbCwgIiVwLCAlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF90YXNrX2JlZ2luLCAgICAgICAgICAoX19pdHRfbW9kZWxfdGFzayAqdGFzaywgX19pdHRfbW9kZWxfdGFza19pbnN0YW5jZSAqaW5zdGFuY2UsIGNvbnN0IGNoYXIgKm5hbWUpLCAoSVRUX0ZPUk1BVCB0YXNrLCBpbnN0YW5jZSwgbmFtZSksIG1vZGVsX3Rhc2tfYmVnaW4sIF9faXR0X2dyb3VwX21vZGVsLCAiJXAsICVwLCBcIiVzXCIiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfdGFza19lbmQsICAgICAgICAgICAgKF9faXR0X21vZGVsX3Rhc2sgKnRhc2ssIF9faXR0X21vZGVsX3Rhc2tfaW5zdGFuY2UgKmluc3RhbmNlKSwgICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgdGFzaywgaW5zdGFuY2UpLCAgICAgICBtb2RlbF90YXNrX2VuZCwgICBfX2l0dF9ncm91cF9tb2RlbCwgIiVwLCAlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9sb2NrX2FjcXVpcmUsICAgICAgICAodm9pZCAqbG9jayksIChJVFRfRk9STUFUIGxvY2spLCBtb2RlbF9sb2NrX2FjcXVpcmUsIF9faXR0X2dyb3VwX21vZGVsLCAiJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfbG9ja19yZWxlYXNlLCAgICAgICAgKHZvaWQgKmxvY2spLCAoSVRUX0ZPUk1BVCBsb2NrKSwgbW9kZWxfbG9ja19yZWxlYXNlLCBfX2l0dF9ncm91cF9tb2RlbCwgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3JlY29yZF9hbGxvY2F0aW9uLCAgICh2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSksIChJVFRfRk9STUFUIGFkZHIsIHNpemUpLCBtb2RlbF9yZWNvcmRfYWxsb2NhdGlvbiwgICBfX2l0dF9ncm91cF9tb2RlbCwgIiVwLCAlZCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9yZWNvcmRfZGVhbGxvY2F0aW9uLCAodm9pZCAqYWRkciksICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBhZGRyKSwgICAgICAgbW9kZWxfcmVjb3JkX2RlYWxsb2NhdGlvbiwgX19pdHRfZ3JvdXBfbW9kZWwsICIlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9pbmR1Y3Rpb25fdXNlcywgICAgICAodm9pZCogYWRkciwgc2l6ZV90IHNpemUpLCAoSVRUX0ZPUk1BVCBhZGRyLCBzaXplKSwgbW9kZWxfaW5kdWN0aW9uX3VzZXMsICAgICAgX19pdHRfZ3JvdXBfbW9kZWwsICIlcCwgJWQiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfcmVkdWN0aW9uX3VzZXMsICAgICAgKHZvaWQqIGFkZHIsIHNpemVfdCBzaXplKSwgKElUVF9GT1JNQVQgYWRkciwgc2l6ZSksIG1vZGVsX3JlZHVjdGlvbl91c2VzLCAgICAgIF9faXR0X2dyb3VwX21vZGVsLCAiJXAsICVkIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX29ic2VydmVfdXNlcywgICAgICAgICh2b2lkKiBhZGRyLCBzaXplX3Qgc2l6ZSksIChJVFRfRk9STUFUIGFkZHIsIHNpemUpLCBtb2RlbF9vYnNlcnZlX3VzZXMsICAgICAgICBfX2l0dF9ncm91cF9tb2RlbCwgIiVwLCAlZCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9jbGVhcl91c2VzLCAgICAgICAgICAodm9pZCogYWRkciksICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBhZGRyKSwgICAgICAgbW9kZWxfY2xlYXJfdXNlcywgICAgICAgICAgX19pdHRfZ3JvdXBfbW9kZWwsICIlcCIpCisKKyNpZm5kZWYgX19JVFRfSU5URVJOQUxfQk9EWQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfc2l0ZV9iZWdpblcsICAgICAgICAgKGNvbnN0IHdjaGFyX3QgKm5hbWUpLCAgICAgKElUVF9GT1JNQVQgbmFtZSksICAgICAgIG1vZGVsX3NpdGVfYmVnaW5XLCAgICAgICAgIF9faXR0X2dyb3VwX21vZGVsLCAiXCIlc1wiIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3Rhc2tfYmVnaW5XLCAgICAgICAgIChjb25zdCB3Y2hhcl90ICpuYW1lKSwgICAgIChJVFRfRk9STUFUIG5hbWUpLCAgICAgICBtb2RlbF90YXNrX2JlZ2luVywgICAgICAgICBfX2l0dF9ncm91cF9tb2RlbCwgIlwiJXNcIiIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9pdGVyYXRpb25fdGFza1csICAgICAoY29uc3Qgd2NoYXJfdCAqbmFtZSksICAgICAoSVRUX0ZPUk1BVCBuYW1lKSwgICAgICAgbW9kZWxfaXRlcmF0aW9uX3Rhc2tXLCAgICAgX19pdHRfZ3JvdXBfbW9kZWwsICJcIiVzXCIiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfc2l0ZV9iZWdpbkEsICAgICAgICAgKGNvbnN0IGNoYXIgKm5hbWUpLCAgICAgICAgKElUVF9GT1JNQVQgbmFtZSksICAgICAgIG1vZGVsX3NpdGVfYmVnaW5BLCAgICAgICAgIF9faXR0X2dyb3VwX21vZGVsLCAiXCIlc1wiIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3NpdGVfYmVnaW5BTCwgICAgICAgIChjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbGVuKSwgKElUVF9GT1JNQVQgbmFtZSwgbGVuKSwgbW9kZWxfc2l0ZV9iZWdpbkFMLCAgICBfX2l0dF9ncm91cF9tb2RlbCwgIlwiJXNcIiwgJWQiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfdGFza19iZWdpbkEsICAgICAgICAgKGNvbnN0IGNoYXIgKm5hbWUpLCAgICAgICAgKElUVF9GT1JNQVQgbmFtZSksICAgICAgIG1vZGVsX3Rhc2tfYmVnaW5BLCAgICAgICAgIF9faXR0X2dyb3VwX21vZGVsLCAiXCIlc1wiIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3Rhc2tfYmVnaW5BTCwgICAgICAgIChjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbGVuKSwgKElUVF9GT1JNQVQgbmFtZSwgbGVuKSwgbW9kZWxfdGFza19iZWdpbkFMLCAgICBfX2l0dF9ncm91cF9tb2RlbCwgIlwiJXNcIiwgJWQiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfaXRlcmF0aW9uX3Rhc2tBLCAgICAgKGNvbnN0IGNoYXIgKm5hbWUpLCAgICAgICAgKElUVF9GT1JNQVQgbmFtZSksICAgICAgIG1vZGVsX2l0ZXJhdGlvbl90YXNrQSwgICAgIF9faXR0X2dyb3VwX21vZGVsLCAiXCIlc1wiIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2l0ZXJhdGlvbl90YXNrQUwsICAgIChjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbGVuKSwgKElUVF9GT1JNQVQgbmFtZSwgbGVuKSwgbW9kZWxfaXRlcmF0aW9uX3Rhc2tBTCwgX19pdHRfZ3JvdXBfbW9kZWwsICJcIiVzXCIsICVkIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3NpdGVfZW5kXzIsICAgICAgICAgICh2b2lkKSwgICAgICAgICAgICAgICAgICAgIChJVFRfTk9fUEFSQU1TKSwgICAgICAgICBtb2RlbF9zaXRlX2VuZF8yLCAgICAgICAgICBfX2l0dF9ncm91cF9tb2RlbCwgIm5vIGFyZ3MiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfdGFza19lbmRfMiwgICAgICAgICAgKHZvaWQpLCAgICAgICAgICAgICAgICAgICAgKElUVF9OT19QQVJBTVMpLCAgICAgICAgIG1vZGVsX3Rhc2tfZW5kXzIsICAgICAgICAgIF9faXR0X2dyb3VwX21vZGVsLCAibm8gYXJncyIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9sb2NrX2FjcXVpcmVfMiwgICAgICAodm9pZCAqbG9jayksICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBsb2NrKSwgICAgICAgbW9kZWxfbG9ja19hY3F1aXJlXzIsICAgICAgX19pdHRfZ3JvdXBfbW9kZWwsICIlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9sb2NrX3JlbGVhc2VfMiwgICAgICAodm9pZCAqbG9jayksICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBsb2NrKSwgICAgICAgbW9kZWxfbG9ja19yZWxlYXNlXzIsICAgICAgX19pdHRfZ3JvdXBfbW9kZWwsICIlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9hZ2dyZWdhdGVfdGFzaywgICAgICAoc2l6ZV90IGNvdW50KSwgICAgICAgICAgICAoSVRUX0ZPUk1BVCBjb3VudCksICAgICAgbW9kZWxfYWdncmVnYXRlX3Rhc2ssICAgICAgX19pdHRfZ3JvdXBfbW9kZWwsICIlZCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9kaXNhYmxlX3B1c2gsICAgICAgICAoX19pdHRfbW9kZWxfZGlzYWJsZSB4KSwgICAoSVRUX0ZPUk1BVCB4KSwgICAgICAgICAgbW9kZWxfZGlzYWJsZV9wdXNoLCAgICAgICAgX19pdHRfZ3JvdXBfbW9kZWwsICIlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9kaXNhYmxlX3BvcCwgICAgICAgICAodm9pZCksICAgICAgICAgICAgICAgICAgICAoSVRUX05PX1BBUkFNUyksICAgICAgICAgbW9kZWxfZGlzYWJsZV9wb3AsICAgICAgICAgX19pdHRfZ3JvdXBfbW9kZWwsICJubyBhcmdzIikKKyNlbmRpZiAvKiBfX0lUVF9JTlRFUk5BTF9CT0RZICovCisKKyNpZm5kZWYgX19JVFRfSU5URVJOQUxfQk9EWQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9oZWFwX2Z1bmN0aW9uLCBoZWFwX2Z1bmN0aW9uX2NyZWF0ZUEsIChjb25zdCBjaGFyICAgICpuYW1lLCBjb25zdCBjaGFyICAgICpkb21haW4pLCAoSVRUX0ZPUk1BVCBuYW1lLCBkb21haW4pLCBoZWFwX2Z1bmN0aW9uX2NyZWF0ZUEsIF9faXR0X2dyb3VwX2hlYXAsICJcIiVzXCIsIFwiJXNcIiIpCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2hlYXBfZnVuY3Rpb24sIGhlYXBfZnVuY3Rpb25fY3JlYXRlVywgKGNvbnN0IHdjaGFyX3QgKm5hbWUsIGNvbnN0IHdjaGFyX3QgKmRvbWFpbiksIChJVFRfRk9STUFUIG5hbWUsIGRvbWFpbiksIGhlYXBfZnVuY3Rpb25fY3JlYXRlVywgX19pdHRfZ3JvdXBfaGVhcCwgIlwiJXNcIiwgXCIlc1wiIikKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfaGVhcF9mdW5jdGlvbiwgaGVhcF9mdW5jdGlvbl9jcmVhdGUsICAoY29uc3QgY2hhciAgICAqbmFtZSwgY29uc3QgY2hhciAgICAqZG9tYWluKSwgKElUVF9GT1JNQVQgbmFtZSwgZG9tYWluKSwgaGVhcF9mdW5jdGlvbl9jcmVhdGUsICBfX2l0dF9ncm91cF9oZWFwLCAiXCIlc1wiLCBcIiVzXCIiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIF9fSVRUX0lOVEVSTkFMX0JPRFkgKi8KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfYWxsb2NhdGVfYmVnaW4sICAgKF9faXR0X2hlYXBfZnVuY3Rpb24gaCwgc2l6ZV90IHNpemUsIGludCBpbml0aWFsaXplZCksICAgICAgICAgICAgIChJVFRfRk9STUFUIGgsIHNpemUsIGluaXRpYWxpemVkKSwgICAgICAgaGVhcF9hbGxvY2F0ZV9iZWdpbiwgX19pdHRfZ3JvdXBfaGVhcCwgIiVwLCAlbHUsICVkIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfYWxsb2NhdGVfZW5kLCAgICAgKF9faXR0X2hlYXBfZnVuY3Rpb24gaCwgdm9pZCoqIGFkZHIsIHNpemVfdCBzaXplLCBpbnQgaW5pdGlhbGl6ZWQpLCAoSVRUX0ZPUk1BVCBoLCBhZGRyLCBzaXplLCBpbml0aWFsaXplZCksIGhlYXBfYWxsb2NhdGVfZW5kLCAgIF9faXR0X2dyb3VwX2hlYXAsICIlcCwgJXAsICVsdSwgJWQiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9mcmVlX2JlZ2luLCAgICAgICAoX19pdHRfaGVhcF9mdW5jdGlvbiBoLCB2b2lkKiAgYWRkciksIChJVFRfRk9STUFUIGgsIGFkZHIpLCBoZWFwX2ZyZWVfYmVnaW4sIF9faXR0X2dyb3VwX2hlYXAsICIlcCwgJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9mcmVlX2VuZCwgICAgICAgICAoX19pdHRfaGVhcF9mdW5jdGlvbiBoLCB2b2lkKiAgYWRkciksIChJVFRfRk9STUFUIGgsIGFkZHIpLCBoZWFwX2ZyZWVfZW5kLCAgIF9faXR0X2dyb3VwX2hlYXAsICIlcCwgJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9yZWFsbG9jYXRlX2JlZ2luLCAoX19pdHRfaGVhcF9mdW5jdGlvbiBoLCB2b2lkKiAgYWRkciwgc2l6ZV90IG5ld19zaXplLCBpbnQgaW5pdGlhbGl6ZWQpLCAgICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIGgsIGFkZHIsIG5ld19zaXplLCBpbml0aWFsaXplZCksICAgICAgICAgICBoZWFwX3JlYWxsb2NhdGVfYmVnaW4sIF9faXR0X2dyb3VwX2hlYXAsICIlcCwgJXAsICVsdSwgJWQiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9yZWFsbG9jYXRlX2VuZCwgICAoX19pdHRfaGVhcF9mdW5jdGlvbiBoLCB2b2lkKiAgYWRkciwgdm9pZCoqIG5ld19hZGRyLCBzaXplX3QgbmV3X3NpemUsIGludCBpbml0aWFsaXplZCksIChJVFRfRk9STUFUIGgsIGFkZHIsIG5ld19hZGRyLCBuZXdfc2l6ZSwgaW5pdGlhbGl6ZWQpLCBoZWFwX3JlYWxsb2NhdGVfZW5kLCAgIF9faXR0X2dyb3VwX2hlYXAsICIlcCwgJXAsICVwLCAlbHUsICVkIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfaW50ZXJuYWxfYWNjZXNzX2JlZ2luLCAodm9pZCksIChJVFRfTk9fUEFSQU1TKSwgaGVhcF9pbnRlcm5hbF9hY2Nlc3NfYmVnaW4sIF9faXR0X2dyb3VwX2hlYXAsICJubyBhcmdzIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfaW50ZXJuYWxfYWNjZXNzX2VuZCwgICAodm9pZCksIChJVFRfTk9fUEFSQU1TKSwgaGVhcF9pbnRlcm5hbF9hY2Nlc3NfZW5kLCAgIF9faXR0X2dyb3VwX2hlYXAsICJubyBhcmdzIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfYmVnaW4sICh2b2lkKSwgKElUVF9OT19QQVJBTVMpLCBoZWFwX3JlY29yZF9tZW1vcnlfZ3Jvd3RoX2JlZ2luLCBfX2l0dF9ncm91cF9oZWFwLCAibm8gYXJncyIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX3JlY29yZF9tZW1vcnlfZ3Jvd3RoX2VuZCwgICAodm9pZCksIChJVFRfTk9fUEFSQU1TKSwgaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9lbmQsICAgX19pdHRfZ3JvdXBfaGVhcCwgIm5vIGFyZ3MiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9yZXNldF9kZXRlY3Rpb24sICh1bnNpZ25lZCBpbnQgcmVzZXRfbWFzayksICAoSVRUX0ZPUk1BVCByZXNldF9tYXNrKSwgaGVhcF9yZXNldF9kZXRlY3Rpb24sIF9faXR0X2dyb3VwX2hlYXAsICIldSIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX3JlY29yZCwgICAgICAgICAgKHVuc2lnbmVkIGludCByZWNvcmRfbWFzayksIChJVFRfRk9STUFUIHJlY29yZF9tYXNrKSwgIGhlYXBfcmVjb3JkLCAgICAgICAgX19pdHRfZ3JvdXBfaGVhcCwgIiV1IikKKworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaWRfY3JlYXRlLCAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCksIChJVFRfRk9STUFUIGRvbWFpbiwgaWQpLCBpZF9jcmVhdGUsICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWx1IikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGlkX2Rlc3Ryb3ksIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQpLCAoSVRUX0ZPUk1BVCBkb21haW4sIGlkKSwgaWRfZGVzdHJveSwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVsdSIpCisKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfdGltZXN0YW1wLCBnZXRfdGltZXN0YW1wLCAodm9pZCksIChJVFRfTk9fUEFSQU1TKSwgZ2V0X3RpbWVzdGFtcCwgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIm5vIGFyZ3MiKQorCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCByZWdpb25fYmVnaW4sIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X2lkIHBhcmVudCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSksIChJVFRfRk9STUFUIGRvbWFpbiwgaWQsIHBhcmVudCwgbmFtZSksIHJlZ2lvbl9iZWdpbiwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVsdSwgJWx1LCAlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCByZWdpb25fZW5kLCAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIGRvbWFpbiwgaWQpLCAgICAgICAgICAgICAgIHJlZ2lvbl9lbmQsICAgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVsdSIpCisKKyNpZm5kZWYgX19JVFRfSU5URVJOQUxfQk9EWQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgZnJhbWVfYmVnaW5fdjMsICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkICppZCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgZG9tYWluLCBpZCksICAgICAgICAgICAgIGZyYW1lX2JlZ2luX3YzLCAgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGZyYW1lX2VuZF92MywgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCAqaWQpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIGRvbWFpbiwgaWQpLCAgICAgICAgICAgICBmcmFtZV9lbmRfdjMsICAgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmcmFtZV9zdWJtaXRfdjMsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgKmlkLCBfX2l0dF90aW1lc3RhbXAgYmVnaW4sIF9faXR0X3RpbWVzdGFtcCBlbmQpLCAoSVRUX0ZPUk1BVCBkb21haW4sIGlkLCBiZWdpbiwgZW5kKSwgZnJhbWVfc3VibWl0X3YzLCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJXAsICVsdSwgJWx1IikKKyNlbmRpZiAvKiBfX0lUVF9JTlRFUk5BTF9CT0RZICovCisKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfZ3JvdXAsICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfaWQgcGFyZW50LCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lKSwgKElUVF9GT1JNQVQgZG9tYWluLCBpZCwgcGFyZW50LCBuYW1lKSwgdGFza19ncm91cCwgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlbHUsICVsdSwgJXAiKQorCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2JlZ2luLCAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9pZCBwYXJlbnQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUpLCAoSVRUX0ZPUk1BVCBkb21haW4sIGlkLCBwYXJlbnQsIG5hbWUpLCB0YXNrX2JlZ2luLCAgICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWx1LCAlbHUsICVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfYmVnaW5fZm4sIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X2lkIHBhcmVudCwgdm9pZCogZm4pLCAgICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIGRvbWFpbiwgaWQsIHBhcmVudCwgZm4pLCAgIHRhc2tfYmVnaW5fZm4sIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlbHUsICVsdSwgJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19lbmQsICAgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgZG9tYWluKSwgICAgICAgICAgICAgICAgICAgdGFza19lbmQsICAgICAgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAiKQorCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBjb3VudGVyX2luY192MywgICAgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBkb21haW4sIG5hbWUpLCAgICAgICAgY291bnRlcl9pbmNfdjMsICAgICAgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBjb3VudGVyX2luY19kZWx0YV92MywgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lLCB1bnNpZ25lZCBsb25nIGxvbmcgdmFsdWUpLCAoSVRUX0ZPUk1BVCBkb21haW4sIG5hbWUsIHZhbHVlKSwgY291bnRlcl9pbmNfZGVsdGFfdjMsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCwgJWx1IikKKworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWFya2VyLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lLCBfX2l0dF9zY29wZSBzY29wZSksIChJVFRfRk9STUFUIGRvbWFpbiwgaWQsIG5hbWUsIHNjb3BlKSwgbWFya2VyLCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWx1LCAlcCwgJWQiKQorCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtZXRhZGF0YV9hZGQsICAgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBfX2l0dF9tZXRhZGF0YV90eXBlIHR5cGUsIHNpemVfdCBjb3VudCwgdm9pZCAqZGF0YSksIChJVFRfRk9STUFUIGRvbWFpbiwgaWQsIGtleSwgdHlwZSwgY291bnQsIGRhdGEpLCBtZXRhZGF0YV9hZGQsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlbHUsICVwLCAlZCwgJWx1LCAlcCIpCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtZXRhZGF0YV9zdHJfYWRkQSwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBjb25zdCBjaGFyKiBkYXRhLCBzaXplX3QgbGVuZ3RoKSwgICAgKElUVF9GT1JNQVQgZG9tYWluLCBpZCwga2V5LCBkYXRhLCBsZW5ndGgpLCBtZXRhZGF0YV9zdHJfYWRkQSwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVsdSwgJXAsICVwLCAlbHUiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWV0YWRhdGFfc3RyX2FkZFcsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgY29uc3Qgd2NoYXJfdCogZGF0YSwgc2l6ZV90IGxlbmd0aCksIChJVFRfRk9STUFUIGRvbWFpbiwgaWQsIGtleSwgZGF0YSwgbGVuZ3RoKSwgbWV0YWRhdGFfc3RyX2FkZFcsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlbHUsICVwLCAlcCwgJWx1IikKKyNlbHNlICAvKiBJVFRfUExBVEZPUk0hPUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1ldGFkYXRhX3N0cl9hZGQsICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBsZW5ndGgpLCAgICAoSVRUX0ZPUk1BVCBkb21haW4sIGlkLCBrZXksIGRhdGEsIGxlbmd0aCksIG1ldGFkYXRhX3N0cl9hZGQsICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWx1LCAlcCwgJXAsICVsdSIpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHJlbGF0aW9uX2FkZF90b19jdXJyZW50LCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3JlbGF0aW9uIHJlbGF0aW9uLCBfX2l0dF9pZCB0YWlsKSwgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgZG9tYWluLCByZWxhdGlvbiwgdGFpbCksICAgICAgIHJlbGF0aW9uX2FkZF90b19jdXJyZW50LCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWx1LCAlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCByZWxhdGlvbl9hZGQsICAgICAgICAgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBoZWFkLCBfX2l0dF9yZWxhdGlvbiByZWxhdGlvbiwgX19pdHRfaWQgdGFpbCksIChJVFRfRk9STUFUIGRvbWFpbiwgaGVhZCwgcmVsYXRpb24sIHRhaWwpLCByZWxhdGlvbl9hZGQsICAgICAgICAgICAgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVwLCAlbHUsICVwIikKKworI2lmbmRlZiBfX0lUVF9JTlRFUk5BTF9CT0RZCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihMSUJJVFRBUEksIF9faXR0X2V2ZW50LCBldmVudF9jcmVhdGVBLCAoY29uc3QgY2hhciAgICAqbmFtZSwgaW50IG5hbWVsZW4pLCAoSVRUX0ZPUk1BVCBuYW1lLCBuYW1lbGVuKSwgZXZlbnRfY3JlYXRlQSwgX19pdHRfZ3JvdXBfbWFyayB8IF9faXR0X2dyb3VwX2xlZ2FjeSwgIlwiJXNcIiwgJWQiKQorSVRUX1NUVUIoTElCSVRUQVBJLCBfX2l0dF9ldmVudCwgZXZlbnRfY3JlYXRlVywgKGNvbnN0IHdjaGFyX3QgKm5hbWUsIGludCBuYW1lbGVuKSwgKElUVF9GT1JNQVQgbmFtZSwgbmFtZWxlbiksIGV2ZW50X2NyZWF0ZVcsIF9faXR0X2dyb3VwX21hcmsgfCBfX2l0dF9ncm91cF9sZWdhY3ksICJcIiVTXCIsICVkIikKKyNlbHNlICAvKiBJVFRfUExBVEZPUk0hPUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKExJQklUVEFQSSwgX19pdHRfZXZlbnQsIGV2ZW50X2NyZWF0ZSwgIChjb25zdCBjaGFyICAgICpuYW1lLCBpbnQgbmFtZWxlbiksIChJVFRfRk9STUFUIG5hbWUsIG5hbWVsZW4pLCBldmVudF9jcmVhdGUsICBfX2l0dF9ncm91cF9tYXJrIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiXCIlc1wiLCAlZCIpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihMSUJJVFRBUEksIGludCwgIGV2ZW50X3N0YXJ0LCAgICAgICAgICAoX19pdHRfZXZlbnQgZXZlbnQpLCAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBldmVudCksICAgICAgICAgZXZlbnRfc3RhcnQsICAgX19pdHRfZ3JvdXBfbWFyayB8IF9faXR0X2dyb3VwX2xlZ2FjeSwgIiVkIikKK0lUVF9TVFVCKExJQklUVEFQSSwgaW50LCAgZXZlbnRfZW5kLCAgICAgICAgICAgIChfX2l0dF9ldmVudCBldmVudCksICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIGV2ZW50KSwgICAgICAgICBldmVudF9lbmQsICAgICBfX2l0dF9ncm91cF9tYXJrIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJWQiKQorI2VuZGlmIC8qIF9fSVRUX0lOVEVSTkFMX0JPRFkgKi8KKworI2lmbmRlZiBfX0lUVF9JTlRFUk5BTF9CT0RZCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX3NldF9uYW1lQSwgKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm9ianR5cGUsIGNvbnN0IGNoYXIgICAgKm9iam5hbWUsIGludCBhdHRyaWJ1dGUpLCAoSVRUX0ZPUk1BVCBhZGRyLCBvYmp0eXBlLCBvYmpuYW1lLCBhdHRyaWJ1dGUpLCBzeW5jX3NldF9uYW1lQSwgX19pdHRfZ3JvdXBfc3luYyB8IF9faXR0X2dyb3VwX2ZzeW5jIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJXAsIFwiJXNcIiwgXCIlc1wiLCAleCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX3NldF9uYW1lVywgKHZvaWQgKmFkZHIsIGNvbnN0IHdjaGFyX3QgKm9ianR5cGUsIGNvbnN0IHdjaGFyX3QgKm9iam5hbWUsIGludCBhdHRyaWJ1dGUpLCAoSVRUX0ZPUk1BVCBhZGRyLCBvYmp0eXBlLCBvYmpuYW1lLCBhdHRyaWJ1dGUpLCBzeW5jX3NldF9uYW1lVywgX19pdHRfZ3JvdXBfc3luYyB8IF9faXR0X2dyb3VwX2ZzeW5jIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJXAsIFwiJVNcIiwgXCIlU1wiLCAleCIpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX3NldF9uYW1lLCAgKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm9ianR5cGUsIGNvbnN0IGNoYXIgICAgKm9iam5hbWUsIGludCBhdHRyaWJ1dGUpLCAoSVRUX0ZPUk1BVCBhZGRyLCBvYmp0eXBlLCBvYmpuYW1lLCBhdHRyaWJ1dGUpLCBzeW5jX3NldF9uYW1lLCAgX19pdHRfZ3JvdXBfc3luYyB8IF9faXR0X2dyb3VwX2ZzeW5jIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAicCwgXCIlc1wiLCBcIiVzXCIsICV4IikKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsIG5vdGlmeV9zeW5jX25hbWVBLCAodm9pZCAqcCwgY29uc3QgY2hhciAgICAqb2JqdHlwZSwgaW50IHR5cGVsZW4sIGNvbnN0IGNoYXIgICAgKm9iam5hbWUsIGludCBuYW1lbGVuLCBpbnQgYXR0cmlidXRlKSwgKElUVF9GT1JNQVQgcCwgb2JqdHlwZSwgdHlwZWxlbiwgb2JqbmFtZSwgbmFtZWxlbiwgYXR0cmlidXRlKSwgbm90aWZ5X3N5bmNfbmFtZUEsIF9faXR0X2dyb3VwX3N5bmMgfCBfX2l0dF9ncm91cF9mc3luYyB8IF9faXR0X2dyb3VwX2xlZ2FjeSwgIiVwLCBcIiVzXCIsICVkLCBcIiVzXCIsICVkLCAleCIpCitJVFRfU1RVQihMSUJJVFRBUEksIGludCwgbm90aWZ5X3N5bmNfbmFtZVcsICh2b2lkICpwLCBjb25zdCB3Y2hhcl90ICpvYmp0eXBlLCBpbnQgdHlwZWxlbiwgY29uc3Qgd2NoYXJfdCAqb2JqbmFtZSwgaW50IG5hbWVsZW4sIGludCBhdHRyaWJ1dGUpLCAoSVRUX0ZPUk1BVCBwLCBvYmp0eXBlLCB0eXBlbGVuLCBvYmpuYW1lLCBuYW1lbGVuLCBhdHRyaWJ1dGUpLCBub3RpZnlfc3luY19uYW1lVywgX19pdHRfZ3JvdXBfc3luYyB8IF9faXR0X2dyb3VwX2ZzeW5jIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJXAsIFwiJVNcIiwgJWQsIFwiJVNcIiwgJWQsICV4IikKKyNlbHNlICAvKiBJVFRfUExBVEZPUk0hPUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKExJQklUVEFQSSwgaW50LCBub3RpZnlfc3luY19uYW1lLCAgKHZvaWQgKnAsIGNvbnN0IGNoYXIgICAgKm9ianR5cGUsIGludCB0eXBlbGVuLCBjb25zdCBjaGFyICAgICpvYmpuYW1lLCBpbnQgbmFtZWxlbiwgaW50IGF0dHJpYnV0ZSksIChJVFRfRk9STUFUIHAsIG9ianR5cGUsIHR5cGVsZW4sIG9iam5hbWUsIG5hbWVsZW4sIGF0dHJpYnV0ZSksIG5vdGlmeV9zeW5jX25hbWUsICBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMgfCBfX2l0dF9ncm91cF9sZWdhY3ksICIlcCwgXCIlc1wiLCAlZCwgXCIlc1wiLCAlZCwgJXgiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCitJVFRfU1RVQlYoTElCSVRUQVBJLCB2b2lkLCBub3RpZnlfc3luY19wcmVwYXJlLCAgICh2b2lkICpwKSwgKElUVF9GT1JNQVQgcCksIG5vdGlmeV9zeW5jX3ByZXBhcmUsICAgX19pdHRfZ3JvdXBfc3luYyB8IF9faXR0X2dyb3VwX2ZzeW5jIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJXAiKQorSVRUX1NUVUJWKExJQklUVEFQSSwgdm9pZCwgbm90aWZ5X3N5bmNfY2FuY2VsLCAgICAodm9pZCAqcCksIChJVFRfRk9STUFUIHApLCBub3RpZnlfc3luY19jYW5jZWwsICAgIF9faXR0X2dyb3VwX3N5bmMgfCBfX2l0dF9ncm91cF9mc3luYyB8IF9faXR0X2dyb3VwX2xlZ2FjeSwgIiVwIikKK0lUVF9TVFVCVihMSUJJVFRBUEksIHZvaWQsIG5vdGlmeV9zeW5jX2FjcXVpcmVkLCAgKHZvaWQgKnApLCAoSVRUX0ZPUk1BVCBwKSwgbm90aWZ5X3N5bmNfYWNxdWlyZWQsICBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMgfCBfX2l0dF9ncm91cF9sZWdhY3ksICIlcCIpCitJVFRfU1RVQlYoTElCSVRUQVBJLCB2b2lkLCBub3RpZnlfc3luY19yZWxlYXNpbmcsICh2b2lkICpwKSwgKElUVF9GT1JNQVQgcCksIG5vdGlmeV9zeW5jX3JlbGVhc2luZywgX19pdHRfZ3JvdXBfc3luYyB8IF9faXR0X2dyb3VwX2ZzeW5jIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJXAiKQorI2VuZGlmIC8qIF9fSVRUX0lOVEVSTkFMX0JPRFkgKi8KKworSVRUX1NUVUJWKExJQklUVEFQSSwgdm9pZCwgbWVtb3J5X3JlYWQsICAgKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKSwgKElUVF9GT1JNQVQgYWRkciwgc2l6ZSksIG1lbW9yeV9yZWFkLCAgIF9faXR0X2dyb3VwX2xlZ2FjeSwgIiVwLCAlbHUiKQorSVRUX1NUVUJWKExJQklUVEFQSSwgdm9pZCwgbWVtb3J5X3dyaXRlLCAgKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKSwgKElUVF9GT1JNQVQgYWRkciwgc2l6ZSksIG1lbW9yeV93cml0ZSwgIF9faXR0X2dyb3VwX2xlZ2FjeSwgIiVwLCAlbHUiKQorSVRUX1NUVUJWKExJQklUVEFQSSwgdm9pZCwgbWVtb3J5X3VwZGF0ZSwgKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKSwgKElUVF9GT1JNQVQgYWRkciwgc2l6ZSksIG1lbW9yeV91cGRhdGUsIF9faXR0X2dyb3VwX2xlZ2FjeSwgIiVwLCAlbHUiKQorCitJVFRfU1RVQihMSUJJVFRBUEksIF9faXR0X3N0YXRlX3QsICAgICBzdGF0ZV9nZXQsICAgICh2b2lkKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX05PX1BBUkFNUyksICAgc3RhdGVfZ2V0LCAgICBfX2l0dF9ncm91cF9sZWdhY3ksICJubyBhcmdzIikKK0lUVF9TVFVCKExJQklUVEFQSSwgX19pdHRfc3RhdGVfdCwgICAgIHN0YXRlX3NldCwgICAgKF9faXR0X3N0YXRlX3QgcyksICAgICAgICAgICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIHMpLCAgICBzdGF0ZV9zZXQsICAgIF9faXR0X2dyb3VwX2xlZ2FjeSwgIiVkIikKK0lUVF9TVFVCKExJQklUVEFQSSwgX19pdHRfb2JqX3N0YXRlX3QsIG9ial9tb2RlX3NldCwgKF9faXR0X29ial9wcm9wX3QgcCwgX19pdHRfb2JqX3N0YXRlX3QgcyksIChJVFRfRk9STUFUIHAsIHMpLCBvYmpfbW9kZV9zZXQsIF9faXR0X2dyb3VwX2xlZ2FjeSwgIiVkLCAlZCIpCitJVFRfU1RVQihMSUJJVFRBUEksIF9faXR0X3Rocl9zdGF0ZV90LCB0aHJfbW9kZV9zZXQsIChfX2l0dF90aHJfcHJvcF90IHAsIF9faXR0X3Rocl9zdGF0ZV90IHMpLCAoSVRUX0ZPUk1BVCBwLCBzKSwgdGhyX21vZGVfc2V0LCBfX2l0dF9ncm91cF9sZWdhY3ksICIlZCwgJWQiKQorCisjaWZuZGVmIF9fSVRUX0lOVEVSTkFMX0JPRFkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfZnJhbWUsIGZyYW1lX2NyZWF0ZUEsIChjb25zdCBjaGFyICAgICpkb21haW4pLCAoSVRUX0ZPUk1BVCBkb21haW4pLCBmcmFtZV9jcmVhdGVBLCBfX2l0dF9ncm91cF9mcmFtZSwgIlwiJXNcIiIpCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2ZyYW1lLCBmcmFtZV9jcmVhdGVXLCAoY29uc3Qgd2NoYXJfdCAqZG9tYWluKSwgKElUVF9GT1JNQVQgZG9tYWluKSwgZnJhbWVfY3JlYXRlVywgX19pdHRfZ3JvdXBfZnJhbWUsICJcIiVzXCIiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9mcmFtZSwgZnJhbWVfY3JlYXRlLCAgKGNvbnN0IGNoYXIgICAgKmRvbWFpbiksIChJVFRfRk9STUFUIGRvbWFpbiksIGZyYW1lX2NyZWF0ZSwgIF9faXR0X2dyb3VwX2ZyYW1lLCAiXCIlc1wiIikKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBfX0lUVF9JTlRFUk5BTF9CT0RZICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmcmFtZV9iZWdpbiwgICAgICAgICAoX19pdHRfZnJhbWUgZnJhbWUpLCAgICAgKElUVF9GT1JNQVQgZnJhbWUpLCAgZnJhbWVfYmVnaW4sICAgX19pdHRfZ3JvdXBfZnJhbWUsICIlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmcmFtZV9lbmQsICAgICAgICAgICAoX19pdHRfZnJhbWUgZnJhbWUpLCAgICAgKElUVF9GT1JNQVQgZnJhbWUpLCAgZnJhbWVfZW5kLCAgICAgX19pdHRfZ3JvdXBfZnJhbWUsICIlcCIpCisKKyNpZm5kZWYgX19JVFRfSU5URVJOQUxfQk9EWQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9jb3VudGVyLCBjb3VudGVyX2NyZWF0ZUEsIChjb25zdCBjaGFyICAgICpuYW1lLCBjb25zdCBjaGFyICAgICpkb21haW4pLCAoSVRUX0ZPUk1BVCBuYW1lLCBkb21haW4pLCBjb3VudGVyX2NyZWF0ZUEsIF9faXR0X2dyb3VwX2NvdW50ZXIsICJcIiVzXCIsIFwiJXNcIiIpCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2NvdW50ZXIsIGNvdW50ZXJfY3JlYXRlVywgKGNvbnN0IHdjaGFyX3QgKm5hbWUsIGNvbnN0IHdjaGFyX3QgKmRvbWFpbiksIChJVFRfRk9STUFUIG5hbWUsIGRvbWFpbiksIGNvdW50ZXJfY3JlYXRlVywgX19pdHRfZ3JvdXBfY291bnRlciwgIlwiJXNcIiwgXCIlc1wiIikKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfY291bnRlciwgY291bnRlcl9jcmVhdGUsICAoY29uc3QgY2hhciAgICAqbmFtZSwgY29uc3QgY2hhciAgICAqZG9tYWluKSwgKElUVF9GT1JNQVQgbmFtZSwgZG9tYWluKSwgY291bnRlcl9jcmVhdGUsICBfX2l0dF9ncm91cF9jb3VudGVyLCAiXCIlc1wiLCBcIiVzXCIiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIF9fSVRUX0lOVEVSTkFMX0JPRFkgKi8KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGNvdW50ZXJfZGVzdHJveSwgICAoX19pdHRfY291bnRlciBpZCksICAgICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgaWQpLCAgICAgICAgY291bnRlcl9kZXN0cm95LCAgIF9faXR0X2dyb3VwX2NvdW50ZXIsICIlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBjb3VudGVyX2luYywgICAgICAgKF9faXR0X2NvdW50ZXIgaWQpLCAgICAgICAgICAgICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIGlkKSwgICAgICAgIGNvdW50ZXJfaW5jLCAgICAgICBfX2l0dF9ncm91cF9jb3VudGVyLCAiJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgY291bnRlcl9pbmNfZGVsdGEsIChfX2l0dF9jb3VudGVyIGlkLCB1bnNpZ25lZCBsb25nIGxvbmcgdmFsdWUpLCAoSVRUX0ZPUk1BVCBpZCwgdmFsdWUpLCBjb3VudGVyX2luY19kZWx0YSwgX19pdHRfZ3JvdXBfY291bnRlciwgIiVwLCAlbHUiKQorCisjaWZuZGVmIF9fSVRUX0lOVEVSTkFMX0JPRFkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfbWFya190eXBlLCBtYXJrX2NyZWF0ZUEsIChjb25zdCBjaGFyICAgICpuYW1lKSwgKElUVF9GT1JNQVQgbmFtZSksIG1hcmtfY3JlYXRlQSwgX19pdHRfZ3JvdXBfbWFyaywgIlwiJXNcIiIpCitJVFRfU1RVQihJVFRBUEksIF9faXR0X21hcmtfdHlwZSwgbWFya19jcmVhdGVXLCAoY29uc3Qgd2NoYXJfdCAqbmFtZSksIChJVFRfRk9STUFUIG5hbWUpLCBtYXJrX2NyZWF0ZVcsIF9faXR0X2dyb3VwX21hcmssICJcIiVTXCIiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9tYXJrX3R5cGUsIG1hcmtfY3JlYXRlLCAgKGNvbnN0IGNoYXIgICAgKm5hbWUpLCAoSVRUX0ZPUk1BVCBuYW1lKSwgbWFya19jcmVhdGUsICBfX2l0dF9ncm91cF9tYXJrLCAiXCIlc1wiIikKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBfX0lUVF9JTlRFUk5BTF9CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihJVFRBUEksIGludCwgIG1hcmtBLCAgICAgICAgKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3QgY2hhciAgICAqcGFyYW1ldGVyKSwgKElUVF9GT1JNQVQgbXQsIHBhcmFtZXRlciksIG1hcmtBLCBfX2l0dF9ncm91cF9tYXJrLCAiJWQsIFwiJXNcIiIpCitJVFRfU1RVQihJVFRBUEksIGludCwgIG1hcmtXLCAgICAgICAgKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3Qgd2NoYXJfdCAqcGFyYW1ldGVyKSwgKElUVF9GT1JNQVQgbXQsIHBhcmFtZXRlciksIG1hcmtXLCBfX2l0dF9ncm91cF9tYXJrLCAiJWQsIFwiJVNcIiIpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihJVFRBUEksIGludCwgIG1hcmssICAgICAgICAgKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3QgY2hhciAgICAqcGFyYW1ldGVyKSwgKElUVF9GT1JNQVQgbXQsIHBhcmFtZXRlciksIG1hcmssICBfX2l0dF9ncm91cF9tYXJrLCAiJWQsIFwiJXNcIiIpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihJVFRBUEksIGludCwgIG1hcmtfb2ZmLCAoX19pdHRfbWFya190eXBlIG10KSwgKElUVF9GT1JNQVQgbXQpLCBtYXJrX29mZiwgX19pdHRfZ3JvdXBfbWFyaywgIiVkIikKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKElUVEFQSSwgaW50LCAgbWFya19nbG9iYWxBLCAoX19pdHRfbWFya190eXBlIG10LCBjb25zdCBjaGFyICAgICpwYXJhbWV0ZXIpLCAoSVRUX0ZPUk1BVCBtdCwgcGFyYW1ldGVyKSwgbWFya19nbG9iYWxBLCBfX2l0dF9ncm91cF9tYXJrLCAiJWQsIFwiJXNcIiIpCitJVFRfU1RVQihJVFRBUEksIGludCwgIG1hcmtfZ2xvYmFsVywgKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3Qgd2NoYXJfdCAqcGFyYW1ldGVyKSwgKElUVF9GT1JNQVQgbXQsIHBhcmFtZXRlciksIG1hcmtfZ2xvYmFsVywgX19pdHRfZ3JvdXBfbWFyaywgIiVkLCBcIiVTXCIiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBpbnQsICBtYXJrX2dsb2JhbCwgIChfX2l0dF9tYXJrX3R5cGUgbXQsIGNvbnN0IGNoYXIgICAgKnBhcmFtZXRlciksIChJVFRfRk9STUFUIG10LCBwYXJhbWV0ZXIpLCBtYXJrX2dsb2JhbCwgIF9faXR0X2dyb3VwX21hcmssICIlZCwgXCIlU1wiIikKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKElUVEFQSSwgaW50LCAgbWFya19nbG9iYWxfb2ZmLCAoX19pdHRfbWFya190eXBlIG10KSwgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBtdCksICAgICAgICAgICAgbWFya19nbG9iYWxfb2ZmLCBfX2l0dF9ncm91cF9tYXJrLCAiJWQiKQorCisjaWZuZGVmIF9fSVRUX0lOVEVSTkFMX0JPRFkKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfY2FsbGVyLCBzdGFja19jYWxsZXJfY3JlYXRlLCAodm9pZCksIChJVFRfTk9fUEFSQU1TKSwgc3RhY2tfY2FsbGVyX2NyZWF0ZSwgIF9faXR0X2dyb3VwX3N0aXRjaCwgIm5vIGFyZ3MiKQorI2VuZGlmIC8qIF9fSVRUX0lOVEVSTkFMX0JPRFkgKi8KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN0YWNrX2NhbGxlcl9kZXN0cm95LCAoX19pdHRfY2FsbGVyIGlkKSwgKElUVF9GT1JNQVQgaWQpLCBzdGFja19jYWxsZXJfZGVzdHJveSwgX19pdHRfZ3JvdXBfc3RpdGNoLCAiJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3RhY2tfY2FsbGVlX2VudGVyLCAgIChfX2l0dF9jYWxsZXIgaWQpLCAoSVRUX0ZPUk1BVCBpZCksIHN0YWNrX2NhbGxlZV9lbnRlciwgICBfX2l0dF9ncm91cF9zdGl0Y2gsICIlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzdGFja19jYWxsZWVfbGVhdmUsICAgKF9faXR0X2NhbGxlciBpZCksIChJVFRfRk9STUFUIGlkKSwgc3RhY2tfY2FsbGVlX2xlYXZlLCAgIF9faXR0X2dyb3VwX3N0aXRjaCwgIiVwIikKKworSVRUX1NUVUIoSVRUQVBJLCAgX19pdHRfY2xvY2tfZG9tYWluKiwgY2xvY2tfZG9tYWluX2NyZWF0ZSwgKF9faXR0X2dldF9jbG9ja19pbmZvX2ZuIGZuLCB2b2lkKiBmbl9kYXRhKSwgKElUVF9GT1JNQVQgZm4sIGZuX2RhdGEpLCBjbG9ja19kb21haW5fY3JlYXRlLCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgICAgICAgICAgICAgICAgY2xvY2tfZG9tYWluX3Jlc2V0LCAgKHZvaWQpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9OT19QQVJBTVMpLCAgICAgICAgICBjbG9ja19kb21haW5fcmVzZXQsICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICJubyBhcmdzIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGlkX2NyZWF0ZV9leCwgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIGlkKSwgKElUVF9GT1JNQVQgZG9tYWluLCBjbG9ja19kb21haW4sIHRpbWVzdGFtcCwgaWQpLCBpZF9jcmVhdGVfZXgsICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJXAsICVsdSwgJWx1IikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGlkX2Rlc3Ryb3lfZXgsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIGlkKSwgKElUVF9GT1JNQVQgZG9tYWluLCBjbG9ja19kb21haW4sIHRpbWVzdGFtcCwgaWQpLCBpZF9kZXN0cm95X2V4LCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJXAsICVsdSwgJWx1IikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfYmVnaW5fZXgsICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIGlkLCBfX2l0dF9pZCBwYXJlbnRpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSksIChJVFRfRk9STUFUIGRvbWFpbiwgY2xvY2tfZG9tYWluLCB0aW1lc3RhbXAsIGlkLCBwYXJlbnRpZCwgbmFtZSksIHRhc2tfYmVnaW5fZXgsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCwgJWx1LCAlbHUsICVsdSwgJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19iZWdpbl9mbl9leCwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaWQsIF9faXR0X2lkIHBhcmVudGlkLCB2b2lkKiBmbiksICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgZG9tYWluLCBjbG9ja19kb21haW4sIHRpbWVzdGFtcCwgaWQsIHBhcmVudGlkLCBmbiksIHRhc2tfYmVnaW5fZm5fZXgsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCwgJWx1LCAlbHUsICVsdSwgJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19lbmRfZXgsICAgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgZG9tYWluLCBjbG9ja19kb21haW4sIHRpbWVzdGFtcCksIHRhc2tfZW5kX2V4LCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJXAsICVsdSIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2JlZ2luX292ZXJsYXBwZWQsICAgICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X2lkIHBhcmVudCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIGRvbWFpbiwgaWQsIHBhcmVudCwgbmFtZSksIHRhc2tfYmVnaW5fb3ZlcmxhcHBlZCwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVsdSwgJWx1LCAlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2JlZ2luX292ZXJsYXBwZWRfZXgsICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIGlkLCBfX2l0dF9pZCBwYXJlbnRpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSksIChJVFRfRk9STUFUIGRvbWFpbiwgY2xvY2tfZG9tYWluLCB0aW1lc3RhbXAsIGlkLCBwYXJlbnRpZCwgbmFtZSksIHRhc2tfYmVnaW5fb3ZlcmxhcHBlZF9leCwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVwLCAlbHUsICVsdSwgJWx1LCAlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2VuZF9vdmVybGFwcGVkLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIGRvbWFpbiwgaWQpLCB0YXNrX2VuZF9vdmVybGFwcGVkLCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWx1IikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfZW5kX292ZXJsYXBwZWRfZXgsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIGlkKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgZG9tYWluLCBjbG9ja19kb21haW4sIHRpbWVzdGFtcCwgaWQpLCB0YXNrX2VuZF9vdmVybGFwcGVkX2V4LCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJXAsICVsdSwgJWx1IikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1hcmtlcl9leCwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUsIF9faXR0X3Njb3BlIHNjb3BlKSwgKElUVF9GT1JNQVQgZG9tYWluLCBjbG9ja19kb21haW4sIHRpbWVzdGFtcCwgaWQsIG5hbWUsIHNjb3BlKSwgbWFya2VyX2V4LCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJXAsICVsdSwgJWx1LCAlcCwgJWQiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWV0YWRhdGFfYWRkX3dpdGhfc2NvcGUsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfc2NvcGUgc2NvcGUsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgX19pdHRfbWV0YWRhdGFfdHlwZSB0eXBlLCBzaXplX3QgY291bnQsIHZvaWQgKmRhdGEpLCAoSVRUX0ZPUk1BVCBkb21haW4sIHNjb3BlLCBrZXksIHR5cGUsIGNvdW50LCBkYXRhKSwgbWV0YWRhdGFfYWRkX3dpdGhfc2NvcGUsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlZCwgJXAsICVkLCAlbHUsICVwIikKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZUEsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfc2NvcGUgc2NvcGUsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxlbmd0aCksICAgIChJVFRfRk9STUFUIGRvbWFpbiwgc2NvcGUsIGtleSwgZGF0YSwgbGVuZ3RoKSwgbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlQSwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVkLCAlcCwgJXAsICVsdSIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVXLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3Njb3BlIHNjb3BlLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIGNvbnN0IHdjaGFyX3QgKmRhdGEsIHNpemVfdCBsZW5ndGgpLCAoSVRUX0ZPUk1BVCBkb21haW4sIHNjb3BlLCBrZXksIGRhdGEsIGxlbmd0aCksIG1ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZVcsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlZCwgJXAsICVwLCAlbHUiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlLCAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9zY29wZSBzY29wZSwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgbGVuZ3RoKSwgICAgKElUVF9GT1JNQVQgZG9tYWluLCBzY29wZSwga2V5LCBkYXRhLCBsZW5ndGgpLCBtZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGUsICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWQsICVwLCAlcCwgJWx1IikKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHJlbGF0aW9uX2FkZF90b19jdXJyZW50X2V4LCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9yZWxhdGlvbiByZWxhdGlvbiwgX19pdHRfaWQgdGFpbCksICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIGRvbWFpbiwgY2xvY2tfZG9tYWluLCB0aW1lc3RhbXAsIHJlbGF0aW9uLCB0YWlsKSwgICAgICAgcmVsYXRpb25fYWRkX3RvX2N1cnJlbnRfZXgsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCwgJWx1LCAlZCwgJWx1IikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHJlbGF0aW9uX2FkZF9leCwgICAgICAgICAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCBoZWFkLCBfX2l0dF9yZWxhdGlvbiByZWxhdGlvbiwgX19pdHRfaWQgdGFpbCksIChJVFRfRk9STUFUIGRvbWFpbiwgY2xvY2tfZG9tYWluLCB0aW1lc3RhbXAsIGhlYWQsIHJlbGF0aW9uLCB0YWlsKSwgcmVsYXRpb25fYWRkX2V4LCAgICAgICAgICAgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCwgJWx1LCAlbHUsICVkLCAlbHUiKQorSVRUX1NUVUIoSVRUQVBJLCAgX19pdHRfdHJhY2tfZ3JvdXAqLCB0cmFja19ncm91cF9jcmVhdGUsIChfX2l0dF9zdHJpbmdfaGFuZGxlKiBuYW1lLCBfX2l0dF90cmFja19ncm91cF90eXBlIHRyYWNrX2dyb3VwX3R5cGUpLCAgICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgbmFtZSwgdHJhY2tfZ3JvdXBfdHlwZSksICAgICAgICB0cmFja19ncm91cF9jcmVhdGUsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlZCIpCitJVFRfU1RVQihJVFRBUEksICBfX2l0dF90cmFjayosICAgICAgIHRyYWNrX2NyZWF0ZSwgICAgICAgKF9faXR0X3RyYWNrX2dyb3VwKiB0cmFja19ncm91cCxfX2l0dF9zdHJpbmdfaGFuZGxlKiBuYW1lLCBfX2l0dF90cmFja190eXBlIHRyYWNrX3R5cGUpLCAoSVRUX0ZPUk1BVCB0cmFja19ncm91cCwgbmFtZSwgdHJhY2tfdHlwZSksIHRyYWNrX2NyZWF0ZSwgICAgICAgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVwLCAlZCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCAgICAgICAgICAgICAgIHNldF90cmFjaywgICAgICAgICAgKF9faXR0X3RyYWNrICp0cmFjayksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCB0cmFjayksICAgICAgICAgICAgICAgICAgICAgICAgIHNldF90cmFjaywgICAgICAgICAgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAiKQorCisjaWZuZGVmIF9fSVRUX0lOVEVSTkFMX0JPRFkKK0lUVF9TVFVCKElUVEFQSSwgY29uc3QgY2hhciosIGFwaV92ZXJzaW9uLCAodm9pZCksIChJVFRfTk9fUEFSQU1TKSwgYXBpX3ZlcnNpb24sIF9faXR0X2dyb3VwX2FsbCAmIH5fX2l0dF9ncm91cF9sZWdhY3ksICJubyBhcmdzIikKKyNlbmRpZiAvKiBfX0lUVF9JTlRFUk5BTF9CT0RZICovCisKKyNpZm5kZWYgX19JVFRfSU5URVJOQUxfQk9EWQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBpbnQsIGF2X3NhdmVBLCAodm9pZCAqZGF0YSwgaW50IHJhbmssIGNvbnN0IGludCAqZGltZW5zaW9ucywgaW50IHR5cGUsIGNvbnN0IGNoYXIgKmZpbGVQYXRoLCBpbnQgY29sdW1uT3JkZXIpLCAoSVRUX0ZPUk1BVCBkYXRhLCByYW5rLCBkaW1lbnNpb25zLCB0eXBlLCBmaWxlUGF0aCwgY29sdW1uT3JkZXIpLCBhdl9zYXZlQSwgX19pdHRfZ3JvdXBfYXJyYXlzLCAiJXAsICVkLCAlcCwgJWQsIFwiJXNcIiwgJWQiKQorSVRUX1NUVUIoSVRUQVBJLCBpbnQsIGF2X3NhdmVXLCAodm9pZCAqZGF0YSwgaW50IHJhbmssIGNvbnN0IGludCAqZGltZW5zaW9ucywgaW50IHR5cGUsIGNvbnN0IHdjaGFyX3QgKmZpbGVQYXRoLCBpbnQgY29sdW1uT3JkZXIpLCAoSVRUX0ZPUk1BVCBkYXRhLCByYW5rLCBkaW1lbnNpb25zLCB0eXBlLCBmaWxlUGF0aCwgY29sdW1uT3JkZXIpLCBhdl9zYXZlVywgX19pdHRfZ3JvdXBfYXJyYXlzLCAiJXAsICVkLCAlcCwgJWQsIFwiJVNcIiwgJWQiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBpbnQsIGF2X3NhdmUsICAodm9pZCAqZGF0YSwgaW50IHJhbmssIGNvbnN0IGludCAqZGltZW5zaW9ucywgaW50IHR5cGUsIGNvbnN0IGNoYXIgKmZpbGVQYXRoLCBpbnQgY29sdW1uT3JkZXIpLCAoSVRUX0ZPUk1BVCBkYXRhLCByYW5rLCBkaW1lbnNpb25zLCB0eXBlLCBmaWxlUGF0aCwgY29sdW1uT3JkZXIpLCBhdl9zYXZlLCAgX19pdHRfZ3JvdXBfYXJyYXlzLCAiJXAsICVkLCAlcCwgJWQsIFwiJXNcIiwgJWQiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIF9fSVRUX0lOVEVSTkFMX0JPRFkgKi8KKworI2VuZGlmIC8qIF9fSVRUX0lOVEVSTkFMX0lOSVQgKi8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2l0dG5vdGlmeV90eXBlcy5oIGIvZmluYWwvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvaXR0bm90aWZ5X3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY5NWE2NwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2l0dG5vdGlmeV90eXBlcy5oCkBAIC0wLDAgKzEsNjcgQEAKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfSVRUTk9USUZZX1RZUEVTX0hfCisjZGVmaW5lIF9JVFROT1RJRllfVFlQRVNfSF8KKwordHlwZWRlZiBlbnVtIF9fX2l0dF9ncm91cF9pZAoreworICAgIF9faXR0X2dyb3VwX25vbmUgICAgICA9IDAsCisgICAgX19pdHRfZ3JvdXBfbGVnYWN5ICAgID0gMTw8MCwKKyAgICBfX2l0dF9ncm91cF9jb250cm9sICAgPSAxPDwxLAorICAgIF9faXR0X2dyb3VwX3RocmVhZCAgICA9IDE8PDIsCisgICAgX19pdHRfZ3JvdXBfbWFyayAgICAgID0gMTw8MywKKyAgICBfX2l0dF9ncm91cF9zeW5jICAgICAgPSAxPDw0LAorICAgIF9faXR0X2dyb3VwX2ZzeW5jICAgICA9IDE8PDUsCisgICAgX19pdHRfZ3JvdXBfaml0ICAgICAgID0gMTw8NiwKKyAgICBfX2l0dF9ncm91cF9tb2RlbCAgICAgPSAxPDw3LAorICAgIF9faXR0X2dyb3VwX3NwbGl0dGVyX21pbiA9IDE8PDcsCisgICAgX19pdHRfZ3JvdXBfY291bnRlciAgID0gMTw8OCwKKyAgICBfX2l0dF9ncm91cF9mcmFtZSAgICAgPSAxPDw5LAorICAgIF9faXR0X2dyb3VwX3N0aXRjaCAgICA9IDE8PDEwLAorICAgIF9faXR0X2dyb3VwX2hlYXAgICAgICA9IDE8PDExLAorICAgIF9faXR0X2dyb3VwX3NwbGl0dGVyX21heCA9IDE8PDEyLAorICAgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSA9IDE8PDEyLAorICAgIF9faXR0X2dyb3VwX3N1cHByZXNzID0gMTw8MTMsCisgICAgX19pdHRfZ3JvdXBfYXJyYXlzICAgID0gMTw8MTQsCisgICAgX19pdHRfZ3JvdXBfYWxsICAgICAgID0gLTEKK30gX19pdHRfZ3JvdXBfaWQ7CisKKyNwcmFnbWEgcGFjayhwdXNoLCA4KQorCit0eXBlZGVmIHN0cnVjdCBfX19pdHRfZ3JvdXBfbGlzdAoreworICAgIF9faXR0X2dyb3VwX2lkIGlkOworICAgIGNvbnN0IGNoYXIqICAgIG5hbWU7Cit9IF9faXR0X2dyb3VwX2xpc3Q7CisKKyNwcmFnbWEgcGFjayhwb3ApCisKKyNkZWZpbmUgSVRUX0dST1VQX0xJU1QodmFybmFtZSkgXAorICAgIHN0YXRpYyBfX2l0dF9ncm91cF9saXN0IHZhcm5hbWVbXSA9IHsgICAgICAgXAorICAgICAgICB7IF9faXR0X2dyb3VwX2FsbCwgICAgICAgImFsbCIgICAgICAgfSwgXAorICAgICAgICB7IF9faXR0X2dyb3VwX2NvbnRyb2wsICAgImNvbnRyb2wiICAgfSwgXAorICAgICAgICB7IF9faXR0X2dyb3VwX3RocmVhZCwgICAgInRocmVhZCIgICAgfSwgXAorICAgICAgICB7IF9faXR0X2dyb3VwX21hcmssICAgICAgIm1hcmsiICAgICAgfSwgXAorICAgICAgICB7IF9faXR0X2dyb3VwX3N5bmMsICAgICAgInN5bmMiICAgICAgfSwgXAorICAgICAgICB7IF9faXR0X2dyb3VwX2ZzeW5jLCAgICAgImZzeW5jIiAgICAgfSwgXAorICAgICAgICB7IF9faXR0X2dyb3VwX2ppdCwgICAgICAgImppdCIgICAgICAgfSwgXAorICAgICAgICB7IF9faXR0X2dyb3VwX21vZGVsLCAgICAgIm1vZGVsIiAgICAgfSwgXAorICAgICAgICB7IF9faXR0X2dyb3VwX2NvdW50ZXIsICAgImNvdW50ZXIiICAgfSwgXAorICAgICAgICB7IF9faXR0X2dyb3VwX2ZyYW1lLCAgICAgImZyYW1lIiAgICAgfSwgXAorICAgICAgICB7IF9faXR0X2dyb3VwX3N0aXRjaCwgICAgInN0aXRjaCIgICAgfSwgXAorICAgICAgICB7IF9faXR0X2dyb3VwX2hlYXAsICAgICAgImhlYXAiICAgICAgfSwgXAorICAgICAgICB7IF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgInN0cnVjdHVyZSIgfSwgXAorICAgICAgICB7IF9faXR0X2dyb3VwX3N1cHByZXNzLCAgInN1cHByZXNzIiAgfSwgXAorICAgICAgICB7IF9faXR0X2dyb3VwX2FycmF5cywgICAgImFycmF5cyIgICAgfSwgXAorICAgICAgICB7IF9faXR0X2dyb3VwX25vbmUsICAgICAgTlVMTCAgICAgICAgfSAgXAorICAgIH0KKworI2VuZGlmIC8qIF9JVFROT1RJRllfVFlQRVNfSF8gKi8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2xlZ2FjeS9pdHRub3RpZnkuaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2xlZ2FjeS9pdHRub3RpZnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2Y4MWRiCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvbGVnYWN5L2l0dG5vdGlmeS5oCkBAIC0wLDAgKzEsOTcyIEBACisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xFR0FDWV9JVFROT1RJRllfSF8KKyNkZWZpbmUgX0xFR0FDWV9JVFROT1RJRllfSF8KKworLyoqCisgKiBAZmlsZQorICogQGJyaWVmIExlZ2FjeSBVc2VyIEFQSSBmdW5jdGlvbnMgYW5kIHR5cGVzCisgKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElUVF9PU19XSU4KKyMgIGRlZmluZSBJVFRfT1NfV0lOICAgMQorI2VuZGlmIC8qIElUVF9PU19XSU4gKi8KKworI2lmbmRlZiBJVFRfT1NfTElOVVgKKyMgIGRlZmluZSBJVFRfT1NfTElOVVggMgorI2VuZGlmIC8qIElUVF9PU19MSU5VWCAqLworCisjaWZuZGVmIElUVF9PU19NQUMKKyMgIGRlZmluZSBJVFRfT1NfTUFDICAgMworI2VuZGlmIC8qIElUVF9PU19NQUMgKi8KKworI2lmbmRlZiBJVFRfT1MKKyMgIGlmIGRlZmluZWQgV0lOMzIgfHwgZGVmaW5lZCBfV0lOMzIKKyMgICAgZGVmaW5lIElUVF9PUyBJVFRfT1NfV0lOCisjICBlbGlmIGRlZmluZWQoIF9fQVBQTEVfXyApICYmIGRlZmluZWQoIF9fTUFDSF9fICkKKyMgICAgZGVmaW5lIElUVF9PUyBJVFRfT1NfTUFDCisjICBlbHNlCisjICAgIGRlZmluZSBJVFRfT1MgSVRUX09TX0xJTlVYCisjICBlbmRpZgorI2VuZGlmIC8qIElUVF9PUyAqLworCisjaWZuZGVmIElUVF9QTEFURk9STV9XSU4KKyMgIGRlZmluZSBJVFRfUExBVEZPUk1fV0lOIDEKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk1fV0lOICovCisKKyNpZm5kZWYgSVRUX1BMQVRGT1JNX1BPU0lYCisjICBkZWZpbmUgSVRUX1BMQVRGT1JNX1BPU0lYIDIKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk1fUE9TSVggKi8KKworI2lmbmRlZiBJVFRfUExBVEZPUk1fTUFDCisjICBkZWZpbmUgSVRUX1BMQVRGT1JNX01BQyAzCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNX01BQyAqLworCisjaWZuZGVmIElUVF9QTEFURk9STQorIyAgaWYgSVRUX09TPT1JVFRfT1NfV0lOCisjICAgIGRlZmluZSBJVFRfUExBVEZPUk0gSVRUX1BMQVRGT1JNX1dJTgorIyAgZWxpZiBJVFRfT1M9PUlUVF9PU19NQUMKKyMgICAgZGVmaW5lIElUVF9QTEFURk9STSBJVFRfUExBVEZPUk1fTUFDCisjICBlbHNlCisjICAgIGRlZmluZSBJVFRfUExBVEZPUk0gSVRUX1BMQVRGT1JNX1BPU0lYCisjICBlbmRpZgorI2VuZGlmIC8qIElUVF9QTEFURk9STSAqLworCisjaWYgZGVmaW5lZChfVU5JQ09ERSkgJiYgIWRlZmluZWQoVU5JQ09ERSkKKyNkZWZpbmUgVU5JQ09ERQorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNpbmNsdWRlIDx0Y2hhci5oPgorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2luY2x1ZGUgPHN0ZGludC5oPgorI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyNpbmNsdWRlIDx3Y2hhci5oPgorI2VuZGlmIC8qIFVOSUNPREUgfHwgX1VOSUNPREUgKi8KKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworI2lmbmRlZiBDREVDTAorIyAgaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjICAgIGRlZmluZSBDREVDTCBfX2NkZWNsCisjICBlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworIyAgICBpZiBkZWZpbmVkIF9NX0lYODYgfHwgZGVmaW5lZCBfX2kzODZfXyAKKyMgICAgICBkZWZpbmUgQ0RFQ0wgX19hdHRyaWJ1dGVfXyAoKGNkZWNsKSkKKyMgICAgZWxzZSAgLyogX01fSVg4NiB8fCBfX2kzODZfXyAqLworIyAgICAgIGRlZmluZSBDREVDTCAvKiBhY3R1YWwgb25seSBvbiB4ODYgcGxhdGZvcm0gKi8KKyMgICAgZW5kaWYgLyogX01fSVg4NiB8fCBfX2kzODZfXyAqLworIyAgZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogQ0RFQ0wgKi8KKworI2lmbmRlZiBTVERDQUxMCisjICBpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyMgICAgZGVmaW5lIFNURENBTEwgX19zdGRjYWxsCisjICBlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworIyAgICBpZiBkZWZpbmVkIF9NX0lYODYgfHwgZGVmaW5lZCBfX2kzODZfXworIyAgICAgIGRlZmluZSBTVERDQUxMIF9fYXR0cmlidXRlX18gKChzdGRjYWxsKSkgCisjICAgIGVsc2UgIC8qIF9NX0lYODYgfHwgX19pMzg2X18gKi8KKyMgICAgICBkZWZpbmUgU1REQ0FMTCAvKiBzdXBwb3J0ZWQgb25seSBvbiB4ODYgcGxhdGZvcm0gKi8KKyMgICAgZW5kaWYgLyogX01fSVg4NiB8fCBfX2kzODZfXyAqLworIyAgZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogU1REQ0FMTCAqLworCisjZGVmaW5lIElUVEFQSSAgICBDREVDTAorI2RlZmluZSBMSUJJVFRBUEkgQ0RFQ0wKKworLyogVE9ETzogVGVtcG9yYXJ5IGZvciBjb21wYXRpYmlsaXR5ISAqLworI2RlZmluZSBJVFRBUElfQ0FMTCAgICBDREVDTAorI2RlZmluZSBMSUJJVFRBUElfQ0FMTCBDREVDTAorCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisvKiB1c2UgX19mb3JjZWlubGluZSAoVkMrKyBzcGVjaWZpYykgKi8KKyNkZWZpbmUgSVRUX0lOTElORSAgICAgICAgICAgX19mb3JjZWlubGluZQorI2RlZmluZSBJVFRfSU5MSU5FX0FUVFJJQlVURSAvKiBub3RoaW5nICovCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisvKgorICogR2VuZXJhbGx5LCBmdW5jdGlvbnMgYXJlIG5vdCBpbmxpbmVkIHVubGVzcyBvcHRpbWl6YXRpb24gaXMgc3BlY2lmaWVkLgorICogRm9yIGZ1bmN0aW9ucyBkZWNsYXJlZCBpbmxpbmUsIHRoaXMgYXR0cmlidXRlIGlubGluZXMgdGhlIGZ1bmN0aW9uIGV2ZW4KKyAqIGlmIG5vIG9wdGltaXphdGlvbiBsZXZlbCB3YXMgc3BlY2lmaWVkLgorICovCisjaWZkZWYgX19TVFJJQ1RfQU5TSV9fCisjZGVmaW5lIElUVF9JTkxJTkUgICAgICAgICAgIHN0YXRpYworI2RlZmluZSBJVFRfSU5MSU5FX0FUVFJJQlVURSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKQorI2Vsc2UgIC8qIF9fU1RSSUNUX0FOU0lfXyAqLworI2RlZmluZSBJVFRfSU5MSU5FICAgICAgICAgICBzdGF0aWMgaW5saW5lCisjZGVmaW5lIElUVF9JTkxJTkVfQVRUUklCVVRFIF9fYXR0cmlidXRlX18oKGFsd2F5c19pbmxpbmUsIHVudXNlZCkpCisjZW5kaWYgLyogX19TVFJJQ1RfQU5TSV9fICovCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisvKiBIZWxwZXIgbWFjcm8gZm9yIGpvaW5pbmcgdG9rZW5zICovCisjZGVmaW5lIElUVF9KT0lOX0FVWChwLG4pIHAjI24KKyNkZWZpbmUgSVRUX0pPSU4ocCxuKSAgICAgSVRUX0pPSU5fQVVYKHAsbikKKworI2lmZGVmIElUVF9NQUpPUgorI3VuZGVmIElUVF9NQUpPUgorI2VuZGlmCisjaWZkZWYgSVRUX01JTk9SCisjdW5kZWYgSVRUX01JTk9SCisjZW5kaWYKKyNkZWZpbmUgSVRUX01BSk9SICAgICAzCisjZGVmaW5lIElUVF9NSU5PUiAgICAgMAorCisvKiBTdGFuZGFyZCB2ZXJzaW9uaW5nIG9mIGEgdG9rZW4gd2l0aCBtYWpvciBhbmQgbWlub3IgdmVyc2lvbiBudW1iZXJzICovCisjZGVmaW5lIElUVF9WRVJTSU9OSVpFKHgpICAgIFwKKyAgICBJVFRfSk9JTih4LCAgICAgICAgICAgICAgXAorICAgIElUVF9KT0lOKF8sICAgICAgICAgICAgICBcCisgICAgSVRUX0pPSU4oSVRUX01BSk9SLCAgICAgIFwKKyAgICBJVFRfSk9JTihfLCBJVFRfTUlOT1IpKSkpCisKKyNpZm5kZWYgSU5URUxfSVRUTk9USUZZX1BSRUZJWAorIyAgZGVmaW5lIElOVEVMX0lUVE5PVElGWV9QUkVGSVggX19pdHRfCisjZW5kaWYgLyogSU5URUxfSVRUTk9USUZZX1BSRUZJWCAqLworI2lmbmRlZiBJTlRFTF9JVFROT1RJRllfUE9TVEZJWAorIyAgZGVmaW5lIElOVEVMX0lUVE5PVElGWV9QT1NURklYIF9wdHJfCisjZW5kaWYgLyogSU5URUxfSVRUTk9USUZZX1BPU1RGSVggKi8KKworI2RlZmluZSBJVFROT1RJRllfTkFNRV9BVVgobikgSVRUX0pPSU4oSU5URUxfSVRUTk9USUZZX1BSRUZJWCxuKQorI2RlZmluZSBJVFROT1RJRllfTkFNRShuKSAgICAgSVRUX1ZFUlNJT05JWkUoSVRUTk9USUZZX05BTUVfQVVYKElUVF9KT0lOKG4sSU5URUxfSVRUTk9USUZZX1BPU1RGSVgpKSkKKworI2RlZmluZSBJVFROT1RJRllfVk9JRChuKSAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICh2b2lkKTAgOiBJVFROT1RJRllfTkFNRShuKQorI2RlZmluZSBJVFROT1RJRllfREFUQShuKSAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICAgICAgIDAgOiBJVFROT1RJRllfTkFNRShuKQorCisjZGVmaW5lIElUVE5PVElGWV9WT0lEX0QwKG4sZCkgICAgICAgKCEoZCktPmZsYWdzKSA/ICh2b2lkKTAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICh2b2lkKTAgOiBJVFROT1RJRllfTkFNRShuKShkKQorI2RlZmluZSBJVFROT1RJRllfVk9JRF9EMShuLGQseCkgICAgICghKGQpLT5mbGFncykgPyAodm9pZCkwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAodm9pZCkwIDogSVRUTk9USUZZX05BTUUobikoZCx4KQorI2RlZmluZSBJVFROT1RJRllfVk9JRF9EMihuLGQseCx5KSAgICghKGQpLT5mbGFncykgPyAodm9pZCkwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAodm9pZCkwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkpCisjZGVmaW5lIElUVE5PVElGWV9WT0lEX0QzKG4sZCx4LHkseikgKCEoZCktPmZsYWdzKSA/ICh2b2lkKTAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICh2b2lkKTAgOiBJVFROT1RJRllfTkFNRShuKShkLHgseSx6KQorI2RlZmluZSBJVFROT1RJRllfVk9JRF9ENChuLGQseCx5LHosYSkgICAgICghKGQpLT5mbGFncykgPyAodm9pZCkwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAodm9pZCkwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkseixhKQorI2RlZmluZSBJVFROT1RJRllfVk9JRF9ENShuLGQseCx5LHosYSxiKSAgICghKGQpLT5mbGFncykgPyAodm9pZCkwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAodm9pZCkwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkseixhLGIpCisjZGVmaW5lIElUVE5PVElGWV9WT0lEX0Q2KG4sZCx4LHkseixhLGIsYykgKCEoZCktPmZsYWdzKSA/ICh2b2lkKTAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICh2b2lkKTAgOiBJVFROT1RJRllfTkFNRShuKShkLHgseSx6LGEsYixjKQorI2RlZmluZSBJVFROT1RJRllfREFUQV9EMChuLGQpICAgICAgICghKGQpLT5mbGFncykgPyAgICAgICAwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAgICAgICAwIDogSVRUTk9USUZZX05BTUUobikoZCkKKyNkZWZpbmUgSVRUTk9USUZZX0RBVEFfRDEobixkLHgpICAgICAoIShkKS0+ZmxhZ3MpID8gICAgICAgMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gICAgICAgMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCkKKyNkZWZpbmUgSVRUTk9USUZZX0RBVEFfRDIobixkLHgseSkgICAoIShkKS0+ZmxhZ3MpID8gICAgICAgMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gICAgICAgMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5KQorI2RlZmluZSBJVFROT1RJRllfREFUQV9EMyhuLGQseCx5LHopICghKGQpLT5mbGFncykgPyAgICAgICAwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAgICAgICAwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkseikKKyNkZWZpbmUgSVRUTk9USUZZX0RBVEFfRDQobixkLHgseSx6LGEpICAgICAoIShkKS0+ZmxhZ3MpID8gMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gICAgICAgMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5LHosYSkKKyNkZWZpbmUgSVRUTk9USUZZX0RBVEFfRDUobixkLHgseSx6LGEsYikgICAoIShkKS0+ZmxhZ3MpID8gMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gICAgICAgMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5LHosYSxiKQorI2RlZmluZSBJVFROT1RJRllfREFUQV9ENihuLGQseCx5LHosYSxiLGMpICghKGQpLT5mbGFncykgPyAwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAgICAgICAwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkseixhLGIsYykKKworI2lmZGVmIElUVF9TVFVCCisjdW5kZWYgSVRUX1NUVUIKKyNlbmRpZgorI2lmZGVmIElUVF9TVFVCVgorI3VuZGVmIElUVF9TVFVCVgorI2VuZGlmCisjZGVmaW5lIElUVF9TVFVCVihhcGksdHlwZSxuYW1lLGFyZ3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdHlwZWRlZiB0eXBlIChhcGkqIElUVF9KT0lOKElUVE5PVElGWV9OQU1FKG5hbWUpLF90KSkgYXJnczsgICBcCisgICAgZXh0ZXJuIElUVF9KT0lOKElUVE5PVElGWV9OQU1FKG5hbWUpLF90KSBJVFROT1RJRllfTkFNRShuYW1lKTsKKyNkZWZpbmUgSVRUX1NUVUIgSVRUX1NUVUJWCisvKiogQGVuZGNvbmQgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisvKioKKyAqIEBkZWZncm91cCBsZWdhY3kgTGVnYWN5IEFQSQorICogQHsKKyAqIEB9CisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgbGVnYWN5X2NvbnRyb2wgQ29sbGVjdGlvbiBDb250cm9sCisgKiBAaW5ncm91cCBsZWdhY3kKKyAqIEdlbmVyYWwgYmVoYXZpb3I6IGFwcGxpY2F0aW9uIGNvbnRpbnVlcyB0byBydW4sIGJ1dCBubyBwcm9maWxpbmcgaW5mb3JtYXRpb24gaXMgYmVpbmcgY29sbGVjdGVkCisgKgorICogUGF1c2luZyBvY2N1cnMgbm90IG9ubHkgZm9yIHRoZSBjdXJyZW50IHRocmVhZCBidXQgZm9yIGFsbCBwcm9jZXNzIGFzIHdlbGwgYXMgc3Bhd25lZCBwcm9jZXNzZXMKKyAqIC0gSW50ZWwoUikgUGFyYWxsZWwgSW5zcGVjdG9yIGFuZCBJbnRlbChSKSBJbnNwZWN0b3IgWEU6CisgKiAgIC0gRG9lcyBub3QgYW5hbHl6ZSBvciByZXBvcnQgZXJyb3JzIHRoYXQgaW52b2x2ZSBtZW1vcnkgYWNjZXNzLgorICogICAtIE90aGVyIGVycm9ycyBhcmUgcmVwb3J0ZWQgYXMgdXN1YWwuIFBhdXNpbmcgZGF0YSBjb2xsZWN0aW9uIGluCisgKiAgICAgSW50ZWwoUikgUGFyYWxsZWwgSW5zcGVjdG9yIGFuZCBJbnRlbChSKSBJbnNwZWN0b3IgWEUKKyAqICAgICBvbmx5IHBhdXNlcyB0cmFjaW5nIGFuZCBhbmFseXppbmcgbWVtb3J5IGFjY2Vzcy4KKyAqICAgICBJdCBkb2VzIG5vdCBwYXVzZSB0cmFjaW5nIG9yIGFuYWx5emluZyB0aHJlYWRpbmcgQVBJcy4KKyAqICAgLgorICogLSBJbnRlbChSKSBQYXJhbGxlbCBBbXBsaWZpZXIgYW5kIEludGVsKFIpIFZUdW5lKFRNKSBBbXBsaWZpZXIgWEU6CisgKiAgIC0gRG9lcyBjb250aW51ZSB0byByZWNvcmQgd2hlbiBuZXcgdGhyZWFkcyBhcmUgc3RhcnRlZC4KKyAqICAgLgorICogLSBPdGhlciBlZmZlY3RzOgorICogICAtIFBvc3NpYmxlIHJlZHVjdGlvbiBvZiBydW50aW1lIG92ZXJoZWFkLgorICogICAuCisgKiBAeworICovCisjaWZuZGVmIF9JVFROT1RJRllfSF8KKy8qKiBAYnJpZWYgUGF1c2UgY29sbGVjdGlvbiAqLwordm9pZCBJVFRBUEkgX19pdHRfcGF1c2Uodm9pZCk7CisvKiogQGJyaWVmIFJlc3VtZSBjb2xsZWN0aW9uICovCit2b2lkIElUVEFQSSBfX2l0dF9yZXN1bWUodm9pZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHBhdXNlLCAgICh2b2lkKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHJlc3VtZSwgICh2b2lkKSkKKyNkZWZpbmUgX19pdHRfcGF1c2UgICAgICBJVFROT1RJRllfVk9JRChwYXVzZSkKKyNkZWZpbmUgX19pdHRfcGF1c2VfcHRyICBJVFROT1RJRllfTkFNRShwYXVzZSkKKyNkZWZpbmUgX19pdHRfcmVzdW1lICAgICBJVFROT1RJRllfVk9JRChyZXN1bWUpCisjZGVmaW5lIF9faXR0X3Jlc3VtZV9wdHIgSVRUTk9USUZZX05BTUUocmVzdW1lKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfcGF1c2UoKQorI2RlZmluZSBfX2l0dF9wYXVzZV9wdHIgIDAKKyNkZWZpbmUgX19pdHRfcmVzdW1lKCkKKyNkZWZpbmUgX19pdHRfcmVzdW1lX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfcGF1c2VfcHRyICAwCisjZGVmaW5lIF9faXR0X3Jlc3VtZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworI2VuZGlmIC8qIF9JVFROT1RJRllfSF8gKi8KKy8qKiBAfSBsZWdhY3lfY29udHJvbCBncm91cCAqLworCisvKioKKyAqIEBkZWZncm91cCBsZWdhY3lfdGhyZWFkcyBUaHJlYWRzCisgKiBAaW5ncm91cCBsZWdhY3kKKyAqIFRocmVhZHMgZ3JvdXAKKyAqIEB3YXJuaW5nIExlZ2FjeSBBUEkKKyAqIEB7CisgKi8KKy8qKgorICogQGRlcHJlY2F0ZWQgTGVnYWN5IEFQSQorICogQGJyaWVmIFNldCBuYW1lIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aHJlYWQgaW4gYW5hbHlzaXMgR1VJLgorICogQHJldHVybiBfX2l0dF9lcnIgdXBvbiBmYWlsdXJlIChuYW1lIG9yIG5hbWVsZW4gYmVpbmcgbnVsbCxuYW1lIGFuZCBuYW1lbGVuIG1pc21hdGNoZWQpCisgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK2ludCBMSUJJVFRBUEkgX19pdHRfdGhyX25hbWVfc2V0QShjb25zdCBjaGFyICAgICpuYW1lLCBpbnQgbmFtZWxlbik7CitpbnQgTElCSVRUQVBJIF9faXR0X3Rocl9uYW1lX3NldFcoY29uc3Qgd2NoYXJfdCAqbmFtZSwgaW50IG5hbWVsZW4pOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF90aHJfbmFtZV9zZXQgICAgIF9faXR0X3Rocl9uYW1lX3NldFcKKyMgIGRlZmluZSBfX2l0dF90aHJfbmFtZV9zZXRfcHRyIF9faXR0X3Rocl9uYW1lX3NldFdfcHRyCisjZWxzZQorIyAgZGVmaW5lIF9faXR0X3Rocl9uYW1lX3NldCAgICAgX19pdHRfdGhyX25hbWVfc2V0QQorIyAgZGVmaW5lIF9faXR0X3Rocl9uYW1lX3NldF9wdHIgX19pdHRfdGhyX25hbWVfc2V0QV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK2ludCBMSUJJVFRBUEkgX19pdHRfdGhyX25hbWVfc2V0KGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuKTsKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsIHRocl9uYW1lX3NldEEsIChjb25zdCBjaGFyICAgICpuYW1lLCBpbnQgbmFtZWxlbikpCitJVFRfU1RVQihMSUJJVFRBUEksIGludCwgdGhyX25hbWVfc2V0VywgKGNvbnN0IHdjaGFyX3QgKm5hbWUsIGludCBuYW1lbGVuKSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKExJQklUVEFQSSwgaW50LCB0aHJfbmFtZV9zZXQsICAoY29uc3QgY2hhciAgICAqbmFtZSwgaW50IG5hbWVsZW4pKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF90aHJfbmFtZV9zZXRBICAgICBJVFROT1RJRllfREFUQSh0aHJfbmFtZV9zZXRBKQorI2RlZmluZSBfX2l0dF90aHJfbmFtZV9zZXRBX3B0ciBJVFROT1RJRllfTkFNRSh0aHJfbmFtZV9zZXRBKQorI2RlZmluZSBfX2l0dF90aHJfbmFtZV9zZXRXICAgICBJVFROT1RJRllfREFUQSh0aHJfbmFtZV9zZXRXKQorI2RlZmluZSBfX2l0dF90aHJfbmFtZV9zZXRXX3B0ciBJVFROT1RJRllfTkFNRSh0aHJfbmFtZV9zZXRXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X3Rocl9uYW1lX3NldCAgICAgSVRUTk9USUZZX0RBVEEodGhyX25hbWVfc2V0KQorI2RlZmluZSBfX2l0dF90aHJfbmFtZV9zZXRfcHRyIElUVE5PVElGWV9OQU1FKHRocl9uYW1lX3NldCkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X3Rocl9uYW1lX3NldEEobmFtZSwgbmFtZWxlbikKKyNkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0QV9wdHIgMAorI2RlZmluZSBfX2l0dF90aHJfbmFtZV9zZXRXKG5hbWUsIG5hbWVsZW4pCisjZGVmaW5lIF9faXR0X3Rocl9uYW1lX3NldFdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF90aHJfbmFtZV9zZXQobmFtZSwgbmFtZWxlbikKKyNkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0X3B0ciAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0QV9wdHIgMAorI2RlZmluZSBfX2l0dF90aHJfbmFtZV9zZXRXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0X3B0ciAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGRlcHJlY2F0ZWQgTGVnYWN5IEFQSQorICogQGJyaWVmIE1hcmsgY3VycmVudCB0aHJlYWQgYXMgaWdub3JlZCBmcm9tIHRoaXMgcG9pbnQgb24sIGZvciB0aGUgZHVyYXRpb24gb2YgaXRzIGV4aXN0ZW5jZS4KKyAqLwordm9pZCBMSUJJVFRBUEkgX19pdHRfdGhyX2lnbm9yZSh2b2lkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKExJQklUVEFQSSwgdm9pZCwgdGhyX2lnbm9yZSwgKHZvaWQpKQorI2RlZmluZSBfX2l0dF90aHJfaWdub3JlICAgICBJVFROT1RJRllfVk9JRCh0aHJfaWdub3JlKQorI2RlZmluZSBfX2l0dF90aHJfaWdub3JlX3B0ciBJVFROT1RJRllfTkFNRSh0aHJfaWdub3JlKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfdGhyX2lnbm9yZSgpCisjZGVmaW5lIF9faXR0X3Rocl9pZ25vcmVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF90aHJfaWdub3JlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gbGVnYWN5X3RocmVhZHMgZ3JvdXAgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgbGVnYWN5X3N5bmMgU3luY2hyb25pemF0aW9uCisgKiBAaW5ncm91cCBsZWdhY3kKKyAqIFN5bmNocm9uaXphdGlvbiBncm91cAorICogQHdhcm5pbmcgTGVnYWN5IEFQSQorICogQHsKKyAqLworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBAYnJpZWYgcG9zc2libGUgdmFsdWUgb2YgYXR0cmlidXRlIGFyZ3VtZW50IGZvciBzeW5jIG9iamVjdCB0eXBlCisgKi8KKyNkZWZpbmUgX19pdHRfYXR0cl9iYXJyaWVyIDEKKworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBAYnJpZWYgcG9zc2libGUgdmFsdWUgb2YgYXR0cmlidXRlIGFyZ3VtZW50IGZvciBzeW5jIG9iamVjdCB0eXBlCisgKi8KKyNkZWZpbmUgX19pdHRfYXR0cl9tdXRleCAgIDIKKworLyoqCisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgQXNzaWduIGEgbmFtZSB0byBhIHN5bmMgb2JqZWN0IHVzaW5nIGNoYXIgb3IgVW5pY29kZSBzdHJpbmcKKyAqIEBwYXJhbVtpbl0gYWRkciAgICAtIHBvaW50ZXIgdG8gdGhlIHN5bmMgb2JqZWN0LiBZb3Ugc2hvdWxkIHVzZSBhIHJlYWwgcG9pbnRlciB0byB5b3VyIG9iamVjdAorICogICAgICAgICAgICAgICAgICAgICAgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHZhbHVlcyBkb24ndCBjbGFzaCB3aXRoIG90aGVyIG9iamVjdCBhZGRyZXNzZXMKKyAqIEBwYXJhbVtpbl0gb2JqdHlwZSAtIG51bGwtdGVybWluYXRlZCBvYmplY3QgdHlwZSBzdHJpbmcuIElmIE5VTEwgaXMgcGFzc2VkLCB0aGUgb2JqZWN0IHdpbGwKKyAqICAgICAgICAgICAgICAgICAgICAgIGJlIGFzc3VtZWQgdG8gYmUgb2YgZ2VuZXJpYyAiVXNlciBTeW5jaHJvbml6YXRpb24iIHR5cGUKKyAqIEBwYXJhbVtpbl0gb2JqbmFtZSAtIG51bGwtdGVybWluYXRlZCBvYmplY3QgbmFtZSBzdHJpbmcuIElmIE5VTEwsIG5vIG5hbWUgd2lsbCBiZSBhc3NpZ25lZAorICogICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIG9iamVjdCAtLSB5b3UgY2FuIHVzZSB0aGUgX19pdHRfc3luY19yZW5hbWUgY2FsbCBsYXRlciB0byBhc3NpZ24KKyAqICAgICAgICAgICAgICAgICAgICAgIHRoZSBuYW1lCisgKiBAcGFyYW1baW5dIGF0dHJpYnV0ZSAtIG9uZSBvZiBbI19faXR0X2F0dHJfYmFycmllciwgI19faXR0X2F0dHJfbXV0ZXhdIHZhbHVlcyB3aGljaCBkZWZpbmVzIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgZXhhY3Qgc2VtYW50aWNzIG9mIGhvdyBwcmVwYXJlL2FjcXVpcmVkL3JlbGVhc2luZyBjYWxscyB3b3JrLgorICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCit2b2lkIElUVEFQSSBfX2l0dF9zeW5jX3NldF9uYW1lQSh2b2lkICphZGRyLCBjb25zdCBjaGFyICAgICpvYmp0eXBlLCBjb25zdCBjaGFyICAgICpvYmpuYW1lLCBpbnQgYXR0cmlidXRlKTsKK3ZvaWQgSVRUQVBJIF9faXR0X3N5bmNfc2V0X25hbWVXKHZvaWQgKmFkZHIsIGNvbnN0IHdjaGFyX3QgKm9ianR5cGUsIGNvbnN0IHdjaGFyX3QgKm9iam5hbWUsIGludCBhdHRyaWJ1dGUpOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lICAgICBfX2l0dF9zeW5jX3NldF9uYW1lVworIyAgZGVmaW5lIF9faXR0X3N5bmNfc2V0X25hbWVfcHRyIF9faXR0X3N5bmNfc2V0X25hbWVXX3B0cgorI2Vsc2UgLyogVU5JQ09ERSAqLworIyAgZGVmaW5lIF9faXR0X3N5bmNfc2V0X25hbWUgICAgIF9faXR0X3N5bmNfc2V0X25hbWVBCisjICBkZWZpbmUgX19pdHRfc3luY19zZXRfbmFtZV9wdHIgX19pdHRfc3luY19zZXRfbmFtZUFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCit2b2lkIElUVEFQSSBfX2l0dF9zeW5jX3NldF9uYW1lKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIqIG9ianR5cGUsIGNvbnN0IGNoYXIqIG9iam5hbWUsIGludCBhdHRyaWJ1dGUpOworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX3NldF9uYW1lQSwgKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm9ianR5cGUsIGNvbnN0IGNoYXIgICAgKm9iam5hbWUsIGludCBhdHRyaWJ1dGUpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19zZXRfbmFtZVcsICh2b2lkICphZGRyLCBjb25zdCB3Y2hhcl90ICpvYmp0eXBlLCBjb25zdCB3Y2hhcl90ICpvYmpuYW1lLCBpbnQgYXR0cmlidXRlKSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfc2V0X25hbWUsICAodm9pZCAqYWRkciwgY29uc3QgY2hhciAgICAqb2JqdHlwZSwgY29uc3QgY2hhciAgICAqb2JqbmFtZSwgaW50IGF0dHJpYnV0ZSkpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X3N5bmNfc2V0X25hbWVBICAgICBJVFROT1RJRllfVk9JRChzeW5jX3NldF9uYW1lQSkKKyNkZWZpbmUgX19pdHRfc3luY19zZXRfbmFtZUFfcHRyIElUVE5PVElGWV9OQU1FKHN5bmNfc2V0X25hbWVBKQorI2RlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lVyAgICAgSVRUTk9USUZZX1ZPSUQoc3luY19zZXRfbmFtZVcpCisjZGVmaW5lIF9faXR0X3N5bmNfc2V0X25hbWVXX3B0ciBJVFROT1RJRllfTkFNRShzeW5jX3NldF9uYW1lVykKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lICAgICBJVFROT1RJRllfVk9JRChzeW5jX3NldF9uYW1lKQorI2RlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lX3B0ciBJVFROT1RJRllfTkFNRShzeW5jX3NldF9uYW1lKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfc3luY19zZXRfbmFtZUEoYWRkciwgb2JqdHlwZSwgb2JqbmFtZSwgYXR0cmlidXRlKQorI2RlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lQV9wdHIgMAorI2RlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lVyhhZGRyLCBvYmp0eXBlLCBvYmpuYW1lLCBhdHRyaWJ1dGUpCisjZGVmaW5lIF9faXR0X3N5bmNfc2V0X25hbWVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfc3luY19zZXRfbmFtZShhZGRyLCBvYmp0eXBlLCBvYmpuYW1lLCBhdHRyaWJ1dGUpCisjZGVmaW5lIF9faXR0X3N5bmNfc2V0X25hbWVfcHRyIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lQV9wdHIgMAorI2RlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X3N5bmNfc2V0X25hbWVfcHRyIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgQXNzaWduIGEgbmFtZSBhbmQgdHlwZSB0byBhIHN5bmMgb2JqZWN0IHVzaW5nIGNoYXIgb3IgVW5pY29kZSBzdHJpbmcKKyAqIEBwYXJhbVtpbl0gYWRkciAtICAgICAgcG9pbnRlciB0byB0aGUgc3luYyBvYmplY3QuIFlvdSBzaG91bGQgdXNlIGEgcmVhbCBwb2ludGVyIHRvIHlvdXIgb2JqZWN0CisgKiAgICAgICAgICAgICAgICAgICAgICAgIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB2YWx1ZXMgZG9uJ3QgY2xhc2ggd2l0aCBvdGhlciBvYmplY3QgYWRkcmVzc2VzCisgKiBAcGFyYW1baW5dIG9ianR5cGUgLSAgIG51bGwtdGVybWluYXRlZCBvYmplY3QgdHlwZSBzdHJpbmcuIElmIE5VTEwgaXMgcGFzc2VkLCB0aGUgb2JqZWN0IHdpbGwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYmUgYXNzdW1lZCB0byBiZSBvZiBnZW5lcmljICJVc2VyIFN5bmNocm9uaXphdGlvbiIgdHlwZQorICogQHBhcmFtW2luXSBvYmpuYW1lIC0gICBudWxsLXRlcm1pbmF0ZWQgb2JqZWN0IG5hbWUgc3RyaW5nLiBJZiBOVUxMLCBubyBuYW1lIHdpbGwgYmUgYXNzaWduZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIG9iamVjdCAtLSB5b3UgY2FuIHVzZSB0aGUgX19pdHRfc3luY19yZW5hbWUgY2FsbCBsYXRlciB0byBhc3NpZ24KKyAqICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG5hbWUKKyAqIEBwYXJhbVtpbl0gdHlwZWxlbiwgbmFtZWxlbiAtICAgYSBsZW5ndGggb2Ygc3RyaW5nIGZvciBhcHByb3ByaWF0ZSBvYmp0eXBlIGFuZCBvYmpuYW1lIHBhcmFtZXRlcgorICogQHBhcmFtW2luXSBhdHRyaWJ1dGUgLSBvbmUgb2YgWyNfX2l0dF9hdHRyX2JhcnJpZXIsICNfX2l0dF9hdHRyX211dGV4XSB2YWx1ZXMgd2hpY2ggZGVmaW5lcyB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgZXhhY3Qgc2VtYW50aWNzIG9mIGhvdyBwcmVwYXJlL2FjcXVpcmVkL3JlbGVhc2luZyBjYWxscyB3b3JrLgorICogQHJldHVybiBfX2l0dF9lcnIgdXBvbiBmYWlsdXJlIChuYW1lIG9yIG5hbWVsZW4gYmVpbmcgbnVsbCxuYW1lIGFuZCBuYW1lbGVuIG1pc21hdGNoZWQpCisgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK2ludCBMSUJJVFRBUEkgX19pdHRfbm90aWZ5X3N5bmNfbmFtZUEodm9pZCAqYWRkciwgY29uc3QgY2hhciAgICAqb2JqdHlwZSwgaW50IHR5cGVsZW4sIGNvbnN0IGNoYXIgICAgKm9iam5hbWUsIGludCBuYW1lbGVuLCBpbnQgYXR0cmlidXRlKTsKK2ludCBMSUJJVFRBUEkgX19pdHRfbm90aWZ5X3N5bmNfbmFtZVcodm9pZCAqYWRkciwgY29uc3Qgd2NoYXJfdCAqb2JqdHlwZSwgaW50IHR5cGVsZW4sIGNvbnN0IHdjaGFyX3QgKm9iam5hbWUsIGludCBuYW1lbGVuLCBpbnQgYXR0cmlidXRlKTsKKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjICBkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfbmFtZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lVworI2Vsc2UKKyMgIGRlZmluZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lIF9faXR0X25vdGlmeV9zeW5jX25hbWVBCisjZW5kaWYKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworaW50IExJQklUVEFQSSBfX2l0dF9ub3RpZnlfc3luY19uYW1lKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgKm9ianR5cGUsIGludCB0eXBlbGVuLCBjb25zdCBjaGFyICpvYmpuYW1lLCBpbnQgbmFtZWxlbiwgaW50IGF0dHJpYnV0ZSk7CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKExJQklUVEFQSSwgaW50LCBub3RpZnlfc3luY19uYW1lQSwgKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm9ianR5cGUsIGludCB0eXBlbGVuLCBjb25zdCBjaGFyICAgICpvYmpuYW1lLCBpbnQgbmFtZWxlbiwgaW50IGF0dHJpYnV0ZSkpCitJVFRfU1RVQihMSUJJVFRBUEksIGludCwgbm90aWZ5X3N5bmNfbmFtZVcsICh2b2lkICphZGRyLCBjb25zdCB3Y2hhcl90ICpvYmp0eXBlLCBpbnQgdHlwZWxlbiwgY29uc3Qgd2NoYXJfdCAqb2JqbmFtZSwgaW50IG5hbWVsZW4sIGludCBhdHRyaWJ1dGUpKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsIG5vdGlmeV9zeW5jX25hbWUsICAodm9pZCAqYWRkciwgY29uc3QgY2hhciAgICAqb2JqdHlwZSwgaW50IHR5cGVsZW4sIGNvbnN0IGNoYXIgICAgKm9iam5hbWUsIGludCBuYW1lbGVuLCBpbnQgYXR0cmlidXRlKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfbmFtZUEgICAgIElUVE5PVElGWV9EQVRBKG5vdGlmeV9zeW5jX25hbWVBKQorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lQV9wdHIgSVRUTk9USUZZX05BTUUobm90aWZ5X3N5bmNfbmFtZUEpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWVXICAgICBJVFROT1RJRllfREFUQShub3RpZnlfc3luY19uYW1lVykKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfbmFtZVdfcHRyIElUVE5PVElGWV9OQU1FKG5vdGlmeV9zeW5jX25hbWVXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWUgICAgIElUVE5PVElGWV9EQVRBKG5vdGlmeV9zeW5jX25hbWUpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWVfcHRyIElUVE5PVElGWV9OQU1FKG5vdGlmeV9zeW5jX25hbWUpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lQShhZGRyLCBvYmp0eXBlLCB0eXBlbGVuLCBvYmpuYW1lLCBuYW1lbGVuLCBhdHRyaWJ1dGUpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWVBX3B0ciAwCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWVXKGFkZHIsIG9ianR5cGUsIHR5cGVsZW4sIG9iam5hbWUsIG5hbWVsZW4sIGF0dHJpYnV0ZSkKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfbmFtZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lKGFkZHIsIG9ianR5cGUsIHR5cGVsZW4sIG9iam5hbWUsIG5hbWVsZW4sIGF0dHJpYnV0ZSkKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfbmFtZV9wdHIgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWVBX3B0ciAwCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfbmFtZV9wdHIgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBFbnRlciBzcGluIGxvb3Agb24gdXNlci1kZWZpbmVkIHN5bmMgb2JqZWN0CisgKi8KK3ZvaWQgTElCSVRUQVBJIF9faXR0X25vdGlmeV9zeW5jX3ByZXBhcmUodm9pZCogYWRkcik7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihMSUJJVFRBUEksIHZvaWQsIG5vdGlmeV9zeW5jX3ByZXBhcmUsICh2b2lkICphZGRyKSkKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfcHJlcGFyZSAgICAgSVRUTk9USUZZX1ZPSUQobm90aWZ5X3N5bmNfcHJlcGFyZSkKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfcHJlcGFyZV9wdHIgSVRUTk9USUZZX05BTUUobm90aWZ5X3N5bmNfcHJlcGFyZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX3ByZXBhcmUoYWRkcikKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfcHJlcGFyZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX3ByZXBhcmVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgUXVpdCBzcGluIGxvb3Agd2l0aG91dCBhY3F1aXJpbmcgc3BpbiBvYmplY3QKKyAqLwordm9pZCBMSUJJVFRBUEkgX19pdHRfbm90aWZ5X3N5bmNfY2FuY2VsKHZvaWQgKmFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoTElCSVRUQVBJLCB2b2lkLCBub3RpZnlfc3luY19jYW5jZWwsICh2b2lkICphZGRyKSkKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfY2FuY2VsICAgICBJVFROT1RJRllfVk9JRChub3RpZnlfc3luY19jYW5jZWwpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX2NhbmNlbF9wdHIgSVRUTk9USUZZX05BTUUobm90aWZ5X3N5bmNfY2FuY2VsKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfY2FuY2VsKGFkZHIpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX2NhbmNlbF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX2NhbmNlbF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBTdWNjZXNzZnVsIHNwaW4gbG9vcCBjb21wbGV0aW9uIChzeW5jIG9iamVjdCBhY3F1aXJlZCkKKyAqLwordm9pZCBMSUJJVFRBUEkgX19pdHRfbm90aWZ5X3N5bmNfYWNxdWlyZWQodm9pZCAqYWRkcik7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihMSUJJVFRBUEksIHZvaWQsIG5vdGlmeV9zeW5jX2FjcXVpcmVkLCAodm9pZCAqYWRkcikpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX2FjcXVpcmVkICAgICBJVFROT1RJRllfVk9JRChub3RpZnlfc3luY19hY3F1aXJlZCkKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfYWNxdWlyZWRfcHRyIElUVE5PVElGWV9OQU1FKG5vdGlmeV9zeW5jX2FjcXVpcmVkKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfYWNxdWlyZWQoYWRkcikKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfYWNxdWlyZWRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19hY3F1aXJlZF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBTdGFydCBzeW5jIG9iamVjdCByZWxlYXNpbmcgY29kZS4gSXMgY2FsbGVkIGJlZm9yZSB0aGUgbG9jayByZWxlYXNlIGNhbGwuCisgKi8KK3ZvaWQgTElCSVRUQVBJIF9faXR0X25vdGlmeV9zeW5jX3JlbGVhc2luZyh2b2lkKiBhZGRyKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKExJQklUVEFQSSwgdm9pZCwgbm90aWZ5X3N5bmNfcmVsZWFzaW5nLCAodm9pZCAqYWRkcikpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX3JlbGVhc2luZyAgICAgSVRUTk9USUZZX1ZPSUQobm90aWZ5X3N5bmNfcmVsZWFzaW5nKQorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19yZWxlYXNpbmdfcHRyIElUVE5PVElGWV9OQU1FKG5vdGlmeV9zeW5jX3JlbGVhc2luZykKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX3JlbGVhc2luZyhhZGRyKQorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19yZWxlYXNpbmdfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19yZWxlYXNpbmdfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSBsZWdhY3lfc3luYyBncm91cCAqLworCisjaWZuZGVmIF9JVFROT1RJRllfSF8KKy8qKgorICogQGRlZmdyb3VwIGxlZ2FjeV9ldmVudHMgRXZlbnRzCisgKiBAaW5ncm91cCBsZWdhY3kKKyAqIEV2ZW50cyBncm91cAorICogQHsKKyAqLworCisvKiogQGJyaWVmIHVzZXIgZXZlbnQgdHlwZSAqLwordHlwZWRlZiBpbnQgX19pdHRfZXZlbnQ7CisKKy8qKgorICogQGJyaWVmIENyZWF0ZSBhbiBldmVudCBub3RpZmljYXRpb24KKyAqIEBub3RlIG5hbWUgb3IgbmFtZWxlbiBiZWluZyBudWxsL25hbWUgYW5kIG5hbWVsZW4gbm90IG1hdGNoaW5nLCB1c2VyIGV2ZW50IGZlYXR1cmUgbm90IGVuYWJsZWQKKyAqIEByZXR1cm4gbm9uLXplcm8gZXZlbnQgaWRlbnRpZmllciB1cG9uIHN1Y2Nlc3MgYW5kIF9faXR0X2VyciBvdGhlcndpc2UKKyAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorX19pdHRfZXZlbnQgTElCSVRUQVBJIF9faXR0X2V2ZW50X2NyZWF0ZUEoY29uc3QgY2hhciAgICAqbmFtZSwgaW50IG5hbWVsZW4pOworX19pdHRfZXZlbnQgTElCSVRUQVBJIF9faXR0X2V2ZW50X2NyZWF0ZVcoY29uc3Qgd2NoYXJfdCAqbmFtZSwgaW50IG5hbWVsZW4pOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF9ldmVudF9jcmVhdGUgICAgIF9faXR0X2V2ZW50X2NyZWF0ZVcKKyMgIGRlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVfcHRyIF9faXR0X2V2ZW50X2NyZWF0ZVdfcHRyCisjZWxzZQorIyAgZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZSAgICAgX19pdHRfZXZlbnRfY3JlYXRlQQorIyAgZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZV9wdHIgX19pdHRfZXZlbnRfY3JlYXRlQV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitfX2l0dF9ldmVudCBMSUJJVFRBUEkgX19pdHRfZXZlbnRfY3JlYXRlKGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuKTsKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoTElCSVRUQVBJLCBfX2l0dF9ldmVudCwgZXZlbnRfY3JlYXRlQSwgKGNvbnN0IGNoYXIgICAgKm5hbWUsIGludCBuYW1lbGVuKSkKK0lUVF9TVFVCKExJQklUVEFQSSwgX19pdHRfZXZlbnQsIGV2ZW50X2NyZWF0ZVcsIChjb25zdCB3Y2hhcl90ICpuYW1lLCBpbnQgbmFtZWxlbikpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihMSUJJVFRBUEksIF9faXR0X2V2ZW50LCBldmVudF9jcmVhdGUsICAoY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4pKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVBICAgICBJVFROT1RJRllfREFUQShldmVudF9jcmVhdGVBKQorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVBX3B0ciBJVFROT1RJRllfTkFNRShldmVudF9jcmVhdGVBKQorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVXICAgICBJVFROT1RJRllfREFUQShldmVudF9jcmVhdGVXKQorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVXX3B0ciBJVFROT1RJRllfTkFNRShldmVudF9jcmVhdGVXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZSAgICAgIElUVE5PVElGWV9EQVRBKGV2ZW50X2NyZWF0ZSkKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlX3B0ciAgSVRUTk9USUZZX05BTUUoZXZlbnRfY3JlYXRlKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlQShuYW1lLCBuYW1lbGVuKSAoX19pdHRfZXZlbnQpMAorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZVcobmFtZSwgbmFtZWxlbikgKF9faXR0X2V2ZW50KTAKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZShuYW1lLCBuYW1lbGVuKSAgKF9faXR0X2V2ZW50KTAKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlX3B0ciAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZV9wdHIgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgUmVjb3JkIGFuIGV2ZW50IG9jY3VycmVuY2UuCisgKiBAcmV0dXJuIF9faXR0X2VyciB1cG9uIGZhaWx1cmUgKGludmFsaWQgZXZlbnQgaWQvdXNlciBldmVudCBmZWF0dXJlIG5vdCBlbmFibGVkKQorICovCitpbnQgTElCSVRUQVBJIF9faXR0X2V2ZW50X3N0YXJ0KF9faXR0X2V2ZW50IGV2ZW50KTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsIGV2ZW50X3N0YXJ0LCAoX19pdHRfZXZlbnQgZXZlbnQpKQorI2RlZmluZSBfX2l0dF9ldmVudF9zdGFydCAgICAgSVRUTk9USUZZX0RBVEEoZXZlbnRfc3RhcnQpCisjZGVmaW5lIF9faXR0X2V2ZW50X3N0YXJ0X3B0ciBJVFROT1RJRllfTkFNRShldmVudF9zdGFydCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2V2ZW50X3N0YXJ0KGV2ZW50KSAoaW50KTAKKyNkZWZpbmUgX19pdHRfZXZlbnRfc3RhcnRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9ldmVudF9zdGFydF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBSZWNvcmQgYW4gZXZlbnQgZW5kIG9jY3VycmVuY2UuCisgKiBAbm90ZSBJdCBpcyBvcHRpb25hbCBpZiBldmVudHMgZG8gbm90IGhhdmUgZHVyYXRpb25zLgorICogQHJldHVybiBfX2l0dF9lcnIgdXBvbiBmYWlsdXJlIChpbnZhbGlkIGV2ZW50IGlkL3VzZXIgZXZlbnQgZmVhdHVyZSBub3QgZW5hYmxlZCkKKyAqLworaW50IExJQklUVEFQSSBfX2l0dF9ldmVudF9lbmQoX19pdHRfZXZlbnQgZXZlbnQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQihMSUJJVFRBUEksIGludCwgZXZlbnRfZW5kLCAoX19pdHRfZXZlbnQgZXZlbnQpKQorI2RlZmluZSBfX2l0dF9ldmVudF9lbmQgICAgIElUVE5PVElGWV9EQVRBKGV2ZW50X2VuZCkKKyNkZWZpbmUgX19pdHRfZXZlbnRfZW5kX3B0ciBJVFROT1RJRllfTkFNRShldmVudF9lbmQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9ldmVudF9lbmQoZXZlbnQpIChpbnQpMAorI2RlZmluZSBfX2l0dF9ldmVudF9lbmRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9ldmVudF9lbmRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSBsZWdhY3lfZXZlbnRzIGdyb3VwICovCisjZW5kaWYgLyogX0lUVE5PVElGWV9IXyAqLworCisvKioKKyAqIEBkZWZncm91cCBsZWdhY3lfbWVtb3J5IE1lbW9yeSBBY2Nlc3NlcworICogQGluZ3JvdXAgbGVnYWN5CisgKi8KKworLyoqCisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgSW5mb3JtIHRoZSB0b29sIG9mIG1lbW9yeSBhY2Nlc3NlcyBvbiByZWFkaW5nCisgKi8KK3ZvaWQgTElCSVRUQVBJIF9faXR0X21lbW9yeV9yZWFkKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKExJQklUVEFQSSwgdm9pZCwgbWVtb3J5X3JlYWQsICh2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSkpCisjZGVmaW5lIF9faXR0X21lbW9yeV9yZWFkICAgICBJVFROT1RJRllfVk9JRChtZW1vcnlfcmVhZCkKKyNkZWZpbmUgX19pdHRfbWVtb3J5X3JlYWRfcHRyIElUVE5PVElGWV9OQU1FKG1lbW9yeV9yZWFkKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbWVtb3J5X3JlYWQoYWRkciwgc2l6ZSkKKyNkZWZpbmUgX19pdHRfbWVtb3J5X3JlYWRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9tZW1vcnlfcmVhZF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBJbmZvcm0gdGhlIHRvb2wgb2YgbWVtb3J5IGFjY2Vzc2VzIG9uIHdyaXRpbmcKKyAqLwordm9pZCBMSUJJVFRBUEkgX19pdHRfbWVtb3J5X3dyaXRlKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKExJQklUVEFQSSwgdm9pZCwgbWVtb3J5X3dyaXRlLCAodm9pZCAqYWRkciwgc2l6ZV90IHNpemUpKQorI2RlZmluZSBfX2l0dF9tZW1vcnlfd3JpdGUgICAgIElUVE5PVElGWV9WT0lEKG1lbW9yeV93cml0ZSkKKyNkZWZpbmUgX19pdHRfbWVtb3J5X3dyaXRlX3B0ciBJVFROT1RJRllfTkFNRShtZW1vcnlfd3JpdGUpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9tZW1vcnlfd3JpdGUoYWRkciwgc2l6ZSkKKyNkZWZpbmUgX19pdHRfbWVtb3J5X3dyaXRlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbWVtb3J5X3dyaXRlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGRlcHJlY2F0ZWQgTGVnYWN5IEFQSQorICogQGJyaWVmIEluZm9ybSB0aGUgdG9vbCBvZiBtZW1vcnkgYWNjZXNzZXMgb24gdXBkYXRpbmcKKyAqLwordm9pZCBMSUJJVFRBUEkgX19pdHRfbWVtb3J5X3VwZGF0ZSh2b2lkICphZGRyZXNzLCBzaXplX3Qgc2l6ZSk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihMSUJJVFRBUEksIHZvaWQsIG1lbW9yeV91cGRhdGUsICh2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSkpCisjZGVmaW5lIF9faXR0X21lbW9yeV91cGRhdGUgICAgIElUVE5PVElGWV9WT0lEKG1lbW9yeV91cGRhdGUpCisjZGVmaW5lIF9faXR0X21lbW9yeV91cGRhdGVfcHRyIElUVE5PVElGWV9OQU1FKG1lbW9yeV91cGRhdGUpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9tZW1vcnlfdXBkYXRlKGFkZHIsIHNpemUpCisjZGVmaW5lIF9faXR0X21lbW9yeV91cGRhdGVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9tZW1vcnlfdXBkYXRlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gbGVnYWN5X21lbW9yeSBncm91cCAqLworCisvKioKKyAqIEBkZWZncm91cCBsZWdhY3lfc3RhdGUgVGhyZWFkIGFuZCBPYmplY3QgU3RhdGVzCisgKiBAaW5ncm91cCBsZWdhY3kKKyAqLworCisvKiogQGJyaWVmIHN0YXRlIHR5cGUgKi8KK3R5cGVkZWYgaW50IF9faXR0X3N0YXRlX3Q7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLwordHlwZWRlZiBlbnVtIF9faXR0X29ial9zdGF0ZSB7CisgICAgX19pdHRfb2JqX3N0YXRlX2VyciA9IDAsCisgICAgX19pdHRfb2JqX3N0YXRlX2NsciA9IDEsCisgICAgX19pdHRfb2JqX3N0YXRlX3NldCA9IDIsCisgICAgX19pdHRfb2JqX3N0YXRlX3VzZSA9IDMKK30gX19pdHRfb2JqX3N0YXRlX3Q7CisKK3R5cGVkZWYgZW51bSBfX2l0dF90aHJfc3RhdGUgeworICAgIF9faXR0X3Rocl9zdGF0ZV9lcnIgPSAwLAorICAgIF9faXR0X3Rocl9zdGF0ZV9jbHIgPSAxLAorICAgIF9faXR0X3Rocl9zdGF0ZV9zZXQgPSAyCit9IF9faXR0X3Rocl9zdGF0ZV90OworCit0eXBlZGVmIGVudW0gX19pdHRfb2JqX3Byb3AgeworICAgIF9faXR0X29ial9wcm9wX3dhdGNoICAgID0gMSwKKyAgICBfX2l0dF9vYmpfcHJvcF9pZ25vcmUgICA9IDIsCisgICAgX19pdHRfb2JqX3Byb3Bfc2hhcmFibGUgPSAzCit9IF9faXR0X29ial9wcm9wX3Q7CisKK3R5cGVkZWYgZW51bSBfX2l0dF90aHJfcHJvcCB7CisgICAgX19pdHRfdGhyX3Byb3BfcXVpZXQgPSAxCit9IF9faXR0X3Rocl9wcm9wX3Q7CisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgbWFuYWdpbmcgdGhyZWFkIGFuZCBvYmplY3Qgc3RhdGVzCisgKi8KK19faXR0X3N0YXRlX3QgTElCSVRUQVBJIF9faXR0X3N0YXRlX2dldCh2b2lkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9zdGF0ZV90LCBzdGF0ZV9nZXQsICh2b2lkKSkKKyNkZWZpbmUgX19pdHRfc3RhdGVfZ2V0ICAgICBJVFROT1RJRllfREFUQShzdGF0ZV9nZXQpCisjZGVmaW5lIF9faXR0X3N0YXRlX2dldF9wdHIgSVRUTk9USUZZX05BTUUoc3RhdGVfZ2V0KQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc3RhdGVfZ2V0KHZvaWQpIChfX2l0dF9zdGF0ZV90KTAKKyNkZWZpbmUgX19pdHRfc3RhdGVfZ2V0X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfc3RhdGVfZ2V0X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGRlcHJlY2F0ZWQgTGVnYWN5IEFQSQorICogQGJyaWVmIG1hbmFnaW5nIHRocmVhZCBhbmQgb2JqZWN0IHN0YXRlcworICovCitfX2l0dF9zdGF0ZV90IExJQklUVEFQSSBfX2l0dF9zdGF0ZV9zZXQoX19pdHRfc3RhdGVfdCBzKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9zdGF0ZV90LCBzdGF0ZV9zZXQsIChfX2l0dF9zdGF0ZV90IHMpKQorI2RlZmluZSBfX2l0dF9zdGF0ZV9zZXQgICAgIElUVE5PVElGWV9EQVRBKHN0YXRlX3NldCkKKyNkZWZpbmUgX19pdHRfc3RhdGVfc2V0X3B0ciBJVFROT1RJRllfTkFNRShzdGF0ZV9zZXQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9zdGF0ZV9zZXQocykgKF9faXR0X3N0YXRlX3QpMAorI2RlZmluZSBfX2l0dF9zdGF0ZV9zZXRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9zdGF0ZV9zZXRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgbWFuYWdpbmcgdGhyZWFkIGFuZCBvYmplY3QgbW9kZXMKKyAqLworX19pdHRfdGhyX3N0YXRlX3QgTElCSVRUQVBJIF9faXR0X3Rocl9tb2RlX3NldChfX2l0dF90aHJfcHJvcF90IHAsIF9faXR0X3Rocl9zdGF0ZV90IHMpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQihJVFRBUEksIF9faXR0X3Rocl9zdGF0ZV90LCB0aHJfbW9kZV9zZXQsIChfX2l0dF90aHJfcHJvcF90IHAsIF9faXR0X3Rocl9zdGF0ZV90IHMpKQorI2RlZmluZSBfX2l0dF90aHJfbW9kZV9zZXQgICAgIElUVE5PVElGWV9EQVRBKHRocl9tb2RlX3NldCkKKyNkZWZpbmUgX19pdHRfdGhyX21vZGVfc2V0X3B0ciBJVFROT1RJRllfTkFNRSh0aHJfbW9kZV9zZXQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF90aHJfbW9kZV9zZXQocCwgcykgKF9faXR0X3Rocl9zdGF0ZV90KTAKKyNkZWZpbmUgX19pdHRfdGhyX21vZGVfc2V0X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfdGhyX21vZGVfc2V0X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGRlcHJlY2F0ZWQgTGVnYWN5IEFQSQorICogQGJyaWVmIG1hbmFnaW5nIHRocmVhZCBhbmQgb2JqZWN0IG1vZGVzCisgKi8KK19faXR0X29ial9zdGF0ZV90IExJQklUVEFQSSBfX2l0dF9vYmpfbW9kZV9zZXQoX19pdHRfb2JqX3Byb3BfdCBwLCBfX2l0dF9vYmpfc3RhdGVfdCBzKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9vYmpfc3RhdGVfdCwgb2JqX21vZGVfc2V0LCAoX19pdHRfb2JqX3Byb3BfdCBwLCBfX2l0dF9vYmpfc3RhdGVfdCBzKSkKKyNkZWZpbmUgX19pdHRfb2JqX21vZGVfc2V0ICAgICBJVFROT1RJRllfREFUQShvYmpfbW9kZV9zZXQpCisjZGVmaW5lIF9faXR0X29ial9tb2RlX3NldF9wdHIgSVRUTk9USUZZX05BTUUob2JqX21vZGVfc2V0KQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfb2JqX21vZGVfc2V0KHAsIHMpIChfX2l0dF9vYmpfc3RhdGVfdCkwCisjZGVmaW5lIF9faXR0X29ial9tb2RlX3NldF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X29ial9tb2RlX3NldF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IGxlZ2FjeV9zdGF0ZSBncm91cCAqLworCisvKioKKyAqIEBkZWZncm91cCBmcmFtZXMgRnJhbWVzCisgKiBAaW5ncm91cCBsZWdhY3kKKyAqIEZyYW1lcyBncm91cAorICogQHsKKyAqLworLyoqCisgKiBAYnJpZWYgb3BhcXVlIHN0cnVjdHVyZSBmb3IgZnJhbWUgaWRlbnRpZmljYXRpb24KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX19pdHRfZnJhbWVfdCAqX19pdHRfZnJhbWU7CisKKy8qKgorICogQGJyaWVmIENyZWF0ZSBhIGdsb2JhbCBmcmFtZSB3aXRoIGdpdmVuIGRvbWFpbgorICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitfX2l0dF9mcmFtZSBJVFRBUEkgX19pdHRfZnJhbWVfY3JlYXRlQShjb25zdCBjaGFyICAgICpkb21haW4pOworX19pdHRfZnJhbWUgSVRUQVBJIF9faXR0X2ZyYW1lX2NyZWF0ZVcoY29uc3Qgd2NoYXJfdCAqZG9tYWluKTsKKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjICBkZWZpbmUgX19pdHRfZnJhbWVfY3JlYXRlICAgICBfX2l0dF9mcmFtZV9jcmVhdGVXCisjICBkZWZpbmUgX19pdHRfZnJhbWVfY3JlYXRlX3B0ciBfX2l0dF9mcmFtZV9jcmVhdGVXX3B0cgorI2Vsc2UgLyogVU5JQ09ERSAqLworIyAgZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZSAgICAgX19pdHRfZnJhbWVfY3JlYXRlQQorIyAgZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZV9wdHIgX19pdHRfZnJhbWVfY3JlYXRlQV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK19faXR0X2ZyYW1lIElUVEFQSSBfX2l0dF9mcmFtZV9jcmVhdGUoY29uc3QgY2hhciAqZG9tYWluKTsKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9mcmFtZSwgZnJhbWVfY3JlYXRlQSwgKGNvbnN0IGNoYXIgICAgKmRvbWFpbikpCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2ZyYW1lLCBmcmFtZV9jcmVhdGVXLCAoY29uc3Qgd2NoYXJfdCAqZG9tYWluKSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfZnJhbWUsIGZyYW1lX2NyZWF0ZSwgIChjb25zdCBjaGFyICpkb21haW4pKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGVBICAgICBJVFROT1RJRllfREFUQShmcmFtZV9jcmVhdGVBKQorI2RlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGVBX3B0ciBJVFROT1RJRllfTkFNRShmcmFtZV9jcmVhdGVBKQorI2RlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGVXICAgICBJVFROT1RJRllfREFUQShmcmFtZV9jcmVhdGVXKQorI2RlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGVXX3B0ciBJVFROT1RJRllfTkFNRShmcmFtZV9jcmVhdGVXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZSAgICAgSVRUTk9USUZZX0RBVEEoZnJhbWVfY3JlYXRlKQorI2RlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGVfcHRyIElUVE5PVElGWV9OQU1FKGZyYW1lX2NyZWF0ZSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZUEoZG9tYWluKQorI2RlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZVcoZG9tYWluKQorI2RlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfZnJhbWVfY3JlYXRlKGRvbWFpbikKKyNkZWZpbmUgX19pdHRfZnJhbWVfY3JlYXRlX3B0ciAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfZnJhbWVfY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZV9wdHIgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqIEBicmllZiBSZWNvcmQgYW4gZnJhbWUgYmVnaW4gb2NjdXJyZW5jZS4gKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2ZyYW1lX2JlZ2luKF9faXR0X2ZyYW1lIGZyYW1lKTsKKy8qKiBAYnJpZWYgUmVjb3JkIGFuIGZyYW1lIGVuZCBvY2N1cnJlbmNlLiAqLwordm9pZCBJVFRBUEkgX19pdHRfZnJhbWVfZW5kICAoX19pdHRfZnJhbWUgZnJhbWUpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmcmFtZV9iZWdpbiwgKF9faXR0X2ZyYW1lIGZyYW1lKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGZyYW1lX2VuZCwgICAoX19pdHRfZnJhbWUgZnJhbWUpKQorI2RlZmluZSBfX2l0dF9mcmFtZV9iZWdpbiAgICAgSVRUTk9USUZZX1ZPSUQoZnJhbWVfYmVnaW4pCisjZGVmaW5lIF9faXR0X2ZyYW1lX2JlZ2luX3B0ciBJVFROT1RJRllfTkFNRShmcmFtZV9iZWdpbikKKyNkZWZpbmUgX19pdHRfZnJhbWVfZW5kICAgICAgIElUVE5PVElGWV9WT0lEKGZyYW1lX2VuZCkKKyNkZWZpbmUgX19pdHRfZnJhbWVfZW5kX3B0ciAgIElUVE5PVElGWV9OQU1FKGZyYW1lX2VuZCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2ZyYW1lX2JlZ2luKGZyYW1lKQorI2RlZmluZSBfX2l0dF9mcmFtZV9iZWdpbl9wdHIgMAorI2RlZmluZSBfX2l0dF9mcmFtZV9lbmQoZnJhbWUpCisjZGVmaW5lIF9faXR0X2ZyYW1lX2VuZF9wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfZnJhbWVfYmVnaW5fcHRyIDAKKyNkZWZpbmUgX19pdHRfZnJhbWVfZW5kX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSBmcmFtZXMgZ3JvdXAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmIC8qIF9MRUdBQ1lfSVRUTk9USUZZX0hfICovCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy96X0xpbnV4X2FzbS5zIGIvZmluYWwvcnVudGltZS9zcmMvel9MaW51eF9hc20ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjY0OWI4Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvel9MaW51eF9hc20ucwpAQCAtMCwwICsxLDE0NDUgQEAKKy8vICB6X0xpbnV4X2FzbS5zOiAgLSBtaWNyb3Rhc2tpbmcgcm91dGluZXMgc3BlY2lmaWNhbGx5CisvLyAgICAgICAgICAgICAgICAgICAgd3JpdHRlbiBmb3IgSW50ZWwgcGxhdGZvcm1zIHJ1bm5pbmcgTGludXgqIE9TCisKKy8vCisvLy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8vCisvLy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vLy8KKy8vLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8vLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vLy8KKy8vLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtYWNyb3MKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpbmNsdWRlICJrbXBfY29uZmlnLmgiCisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisKKyMgaWYgS01QX01JQworLy8KKy8vIHRoZSAnZGVsYXkgcjE2L3IzMi9yNjQnIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlICdwYXVzZScuCisvLyBUaGUgZGVsYXkgb3BlcmF0aW9uIGhhcyB0aGUgZWZmZWN0IG9mIHJlbW92aW5nIHRoZSBjdXJyZW50IHRocmVhZCBmcm9tCisvLyB0aGUgcm91bmQtcm9iaW4gSFQgbWVjaGFuaXNtLCBhbmQgdGhlcmVmb3JlIHNwZWVkcyB1cCB0aGUgaXNzdWUgcmF0ZSBvZgorLy8gdGhlIG90aGVyIHRocmVhZHMgb24gdGhlIHNhbWUgY29yZS4KKy8vCisvLyBBIHZhbHVlIG9mIDAgd29ya3MgZmluZSBmb3IgPD0gMiB0aHJlYWRzIHBlciBjb3JlLCBidXQgY2F1c2VzIHRoZSBFUENDCisvLyBiYXJyaWVyIHRpbWUgdG8gaW5jcmVhc2UgZ3JlYXRseSBmb3IgMyBvciBtb3JlIHRocmVhZHMgcGVyIGNvcmUuCisvLworLy8gQSB2YWx1ZSBvZiAxMDAgd29ya3MgcHJldHR5IHdlbGwgZm9yIHVwIHRvIDQgdGhyZWFkcyBwZXIgY29yZSwgYnV0IGlzbid0CisvLyBxdWl0ZSBhcyBmYXN0IGFzIDAgZm9yIDIgdGhyZWFkcyBwZXIgY29yZS4KKy8vCisvLyBXZSBuZWVkIHRvIGNoZWNrIHdoYXQgaGFwcGVucyBmb3Igb3ZlcnN1YnNjcmlwdGlvbiAvID4gNCB0aHJlYWRzIHBlciBjb3JlLgorLy8gSXQgaXMgcG9zc2libGUgdGhhdCB3ZSBuZWVkIHRvIHBhc3MgdGhlIGRlbGF5IHZhbHVlIGluIGFzIGEgcGFyYW1ldGVyCisvLyB0aGF0IHRoZSBjYWxsZXIgZGV0ZXJtaW5lcyBiYXNlZCBvbiB0aGUgdG90YWwgIyB0aHJlYWRzIC8gIyBjb3Jlcy4KKy8vCisvLy5tYWNybyBwYXVzZV9vcAorLy8JbW92ICAgICQxMDAsICVyYXgKKy8vCWRlbGF5ICAlcmF4CisvLy5lbmRtCisjIGVsc2UKKyMgIGRlZmluZSBwYXVzZV9vcCAgIC5ieXRlIDB4ZjMsMHg5MAorIyBlbmRpZiAvLyBLTVBfTUlDCisKKyMgaWYgS01QX09TX0RBUldJTgorIyAgZGVmaW5lIEtNUF9QUkVGSVhfVU5ERVJTQ09SRSh4KSBfIyN4ICAvLyBleHRyYSB1bmRlcnNjb3JlIGZvciBPUyBYKiBzeW1ib2xzCisjICBkZWZpbmUgS01QX0xBQkVMKHgpIExfIyN4ICAgICAgICAgICAgIC8vIGZvcm0gdGhlIG5hbWUgb2YgbGFiZWwKKy5tYWNybyBLTVBfQ0ZJX0RFRl9PRkZTRVQKKy5lbmRtYWNybworLm1hY3JvIEtNUF9DRklfT0ZGU0VUCisuZW5kbWFjcm8KKy5tYWNybyBLTVBfQ0ZJX1JFR0lTVEVSCisuZW5kbWFjcm8KKy5tYWNybyBLTVBfQ0ZJX0RFRgorLmVuZG1hY3JvCisubWFjcm8gQUxJR04KKwkuYWxpZ24gJDAKKy5lbmRtYWNybworLm1hY3JvIERFQlVHX0lORk8KKy8qIE5vdCBzdXJlIHdoYXQgLnNpemUgZG9lcyBpbiBpY2MsIG5vdCBzdXJlIGlmIHdlIG5lZWQgdG8gZG8gc29tZXRoaW5nCisgICBzaW1pbGFyIGZvciBPUyBYKi4KKyovCisuZW5kbWFjcm8KKy5tYWNybyBQUk9DCisJQUxJR04gIDQKKwkuZ2xvYmwgS01QX1BSRUZJWF9VTkRFUlNDT1JFKCQwKQorS01QX1BSRUZJWF9VTkRFUlNDT1JFKCQwKToKKy5lbmRtYWNybworIyBlbHNlIC8vIEtNUF9PU19EQVJXSU4KKyMgIGRlZmluZSBLTVBfUFJFRklYX1VOREVSU0NPUkUoeCkgeCAgLy8gbm8gZXh0cmEgdW5kZXJzY29yZSBmb3IgTGludXgqIE9TIHN5bWJvbHMKKy8vIEZvcm1hdCBsYWJlbHMgc28gdGhhdCB0aGV5IGRvbid0IG92ZXJyaWRlIGZ1bmN0aW9uIG5hbWVzIGluIGdkYidzIGJhY2t0cmFjZXMKKy8vIE1JQyBhc3NlbWJsZXIgZG9lc24ndCBhY2NlcHQgLkwgc3ludGF4LCB0aGUgTCB3b3JrcyBmaW5lIHRoZXJlIChhcyB3ZWxsIGFzIG9uIE9TIFgqKQorIyBpZiBLTVBfTUlDCisjICBkZWZpbmUgS01QX0xBQkVMKHgpIExfIyN4ICAgICAgICAgIC8vIGxvY2FsIGxhYmVsCisjIGVsc2UKKyMgIGRlZmluZSBLTVBfTEFCRUwoeCkgLkxfIyN4ICAgICAgICAgLy8gbG9jYWwgbGFiZWwgaGlkZGVuIGZyb20gYmFja3RyYWNlcworIyBlbmRpZiAvLyBLTVBfTUlDCisubWFjcm8gQUxJR04gc2l6ZQorCS5hbGlnbiAxPDwoXHNpemUpCisuZW5kbQorLm1hY3JvIERFQlVHX0lORk8gcHJvYworCS5jZmlfZW5kcHJvYworLy8gTm90IHN1cmUgd2h5IHdlIG5lZWQgLnR5cGUgYW5kIC5zaXplIGZvciB0aGUgZnVuY3Rpb25zCisJLmFsaWduIDE2CisJLnR5cGUgIFxwcm9jLEBmdW5jdGlvbgorICAgICAgICAuc2l6ZSAgXHByb2MsLi1ccHJvYworLmVuZG0KKy5tYWNybyBQUk9DIHByb2MKKwlBTElHTiAgNAorICAgICAgICAuZ2xvYmwgS01QX1BSRUZJWF9VTkRFUlNDT1JFKFxwcm9jKQorS01QX1BSRUZJWF9VTkRFUlNDT1JFKFxwcm9jKToKKwkuY2ZpX3N0YXJ0cHJvYworLmVuZG0KKy5tYWNybyBLTVBfQ0ZJX0RFRl9PRkZTRVQgc3oKKwkuY2ZpX2RlZl9jZmFfb2Zmc2V0CVxzegorLmVuZG0KKy5tYWNybyBLTVBfQ0ZJX09GRlNFVCByZWcsIHN6CisJLmNmaV9vZmZzZXQJXHJlZyxcc3oKKy5lbmRtCisubWFjcm8gS01QX0NGSV9SRUdJU1RFUiByZWcKKwkuY2ZpX2RlZl9jZmFfcmVnaXN0ZXIJXHJlZworLmVuZG0KKy5tYWNybyBLTVBfQ0ZJX0RFRiByZWcsIHN6CisJLmNmaV9kZWZfY2ZhCVxyZWcsXHN6CisuZW5kbQorIyBlbmRpZiAvLyBLTVBfT1NfREFSV0lOCisjZW5kaWYgLy8gS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX3g4Nl82NAorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBkYXRhCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisKKy8vCisvLyBTdXBwb3J0IGZvciB1bm5hbWVkIGNvbW1vbiBibG9ja3MuCisvLworLy8gQmVjYXVzZSB0aGUgc3ltYm9sICIuZ29tcF9jcml0aWNhbF91c2VyXyIgY29udGFpbnMgYSAiLiIsIHdlIGhhdmUgdG8KKy8vIHB1dCB0aGlzIHN0dWZmIGluIGFzc2VtYmx5LgorLy8KKworIyBpZiBLTVBfQVJDSF9YODYKKyMgIGlmIEtNUF9PU19EQVJXSU4KKyAgICAgICAgLmRhdGEKKyAgICAgICAgLmNvbW0gLmdvbXBfY3JpdGljYWxfdXNlcl8sMzIKKyAgICAgICAgLmRhdGEKKyAgICAgICAgLmdsb2JsIF9fX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHIKK19fX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHI6CisgICAgICAgIC5sb25nIC5nb21wX2NyaXRpY2FsX3VzZXJfCisjICBlbHNlIC8qIExpbnV4KiBPUyAqLworICAgICAgICAuZGF0YQorICAgICAgICAuY29tbSAuZ29tcF9jcml0aWNhbF91c2VyXywzMiw4CisgICAgICAgIC5kYXRhCisJQUxJR04gNAorICAgICAgICAuZ2xvYmFsIF9fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkcgorX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyOgorICAgICAgICAuNGJ5dGUgLmdvbXBfY3JpdGljYWxfdXNlcl8KKyAgICAgICAgLnR5cGUgX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyLEBvYmplY3QKKyAgICAgICAgLnNpemUgX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyLDQKKyMgIGVuZGlmIC8qIEtNUF9PU19EQVJXSU4gKi8KKyMgZW5kaWYgLyogS01QX0FSQ0hfWDg2ICovCisKKyMgaWYgS01QX0FSQ0hfWDg2XzY0CisjICBpZiBLTVBfT1NfREFSV0lOCisgICAgICAgIC5kYXRhCisgICAgICAgIC5jb21tIC5nb21wX2NyaXRpY2FsX3VzZXJfLDMyCisgICAgICAgIC5kYXRhCisgICAgICAgIC5nbG9ibCBfX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyCitfX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyOgorICAgICAgICAucXVhZCAuZ29tcF9jcml0aWNhbF91c2VyXworIyAgZWxzZSAvKiBMaW51eCogT1MgKi8KKyAgICAgICAgLmRhdGEKKyAgICAgICAgLmNvbW0gLmdvbXBfY3JpdGljYWxfdXNlcl8sMzIsOAorICAgICAgICAuZGF0YQorCUFMSUdOIDgKKyAgICAgICAgLmdsb2JhbCBfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHIKK19fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkcjoKKyAgICAgICAgLjhieXRlIC5nb21wX2NyaXRpY2FsX3VzZXJfCisgICAgICAgIC50eXBlIF9fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkcixAb2JqZWN0CisgICAgICAgIC5zaXplIF9fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkciw4CisjICBlbmRpZiAvKiBLTVBfT1NfREFSV0lOICovCisjIGVuZGlmIC8qIEtNUF9BUkNIX1g4Nl82NCAqLworCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisKKworI2lmIEtNUF9BUkNIX1g4NiAmJiAhS01QX0FSQ0hfUFBDNjQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1pY3JvdGFza2luZyByb3V0aW5lcyBzcGVjaWZpY2FsbHkgd3JpdHRlbiBmb3IgSUEtMzIgYXJjaGl0ZWN0dXJlCisvLyBydW5uaW5nIExpbnV4KiBPUworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisKKwkuaWRlbnQgIkludGVsIENvcnBvcmF0aW9uIgorCS5kYXRhCisJQUxJR04gNAorLy8gdm9pZAorLy8gX19rbXBfeDg2X3BhdXNlKCB2b2lkICk7CisvLworCisgICAgICAgIC50ZXh0CisJUFJPQyAgX19rbXBfeDg2X3BhdXNlCisKKyAgICAgICAgcGF1c2Vfb3AKKyAgICAgICAgcmV0CisKKwlERUJVR19JTkZPIF9fa21wX3g4Nl9wYXVzZQorCisvLworLy8gdm9pZAorLy8gX19rbXBfeDg2X2NwdWlkKCBpbnQgbW9kZSwgaW50IG1vZGUyLCB2b2lkICpjcHVpZF9idWZmZXIgKTsKKy8vCisJUFJPQyAgX19rbXBfeDg2X2NwdWlkCisKKwlwdXNobCAlZWJwCisJbW92bCAgJWVzcCwlZWJwCisgICAgICAgIHB1c2hsICVlZGkKKyAgICAgICAgcHVzaGwgJWVieAorICAgICAgICBwdXNobCAlZWN4CisgICAgICAgIHB1c2hsICVlZHgKKworCW1vdmwgIDgoJWVicCksICVlYXgKKwltb3ZsICAxMiglZWJwKSwgJWVjeAorCWNwdWlkCQkJCS8vIFF1ZXJ5IHRoZSBDUFVJRCBmb3IgdGhlIGN1cnJlbnQgcHJvY2Vzc29yCisKKwltb3ZsICAxNiglZWJwKSwgJWVkaQorCW1vdmwgICVlYXgsIDAoJWVkaSkKKwltb3ZsICAlZWJ4LCA0KCVlZGkpCisJbW92bCAgJWVjeCwgOCglZWRpKQorCW1vdmwgICVlZHgsIDEyKCVlZGkpCisKKyAgICAgICAgcG9wbCAgJWVkeAorICAgICAgICBwb3BsICAlZWN4CisgICAgICAgIHBvcGwgICVlYngKKyAgICAgICAgcG9wbCAgJWVkaQorICAgICAgICBtb3ZsICAlZWJwLCAlZXNwCisgICAgICAgIHBvcGwgICVlYnAKKwlyZXQKKworCURFQlVHX0lORk8gX19rbXBfeDg2X2NwdWlkCisKKworIyBpZiAhS01QX0FTTV9JTlRSSU5TCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8ga21wX2ludDMyCisvLyBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGQgKTsKKy8vCisKKyAgICAgICAgUFJPQyAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQzMgorCisgICAgICAgIG1vdmwgICAgICA0KCVlc3ApLCAlZWN4CisgICAgICAgIG1vdmwgICAgICA4KCVlc3ApLCAlZWF4CisgICAgICAgIGxvY2sKKyAgICAgICAgeGFkZGwgICAgICVlYXgsKCVlY3gpCisgICAgICAgIHJldAorCisJREVCVUdfSU5GTyBfX2ttcF90ZXN0X3RoZW5fYWRkMzIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF94Y2hnX2ZpeGVkOAorLy8KKy8vIGttcF9pbnQzMgorLy8gX19rbXBfeGNoZ19maXhlZDgoIHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCBkICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgk0KCVlc3ApCisvLyAJZDoJOCglZXNwKQorLy8KKy8vIHJldHVybjoJJWFsCisKKyAgICAgICAgUFJPQyAgX19rbXBfeGNoZ19maXhlZDgKKworICAgICAgICBtb3ZsICAgICAgNCglZXNwKSwgJWVjeCAgICAvLyAicCIKKyAgICAgICAgbW92YiAgICAgIDgoJWVzcCksICVhbAkvLyAiZCIKKworICAgICAgICBsb2NrCisgICAgICAgIHhjaGdiICAgICAlYWwsKCVlY3gpCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfeGNoZ19maXhlZDgKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX3hjaGdfZml4ZWQxNgorLy8KKy8vIGttcF9pbnQxNgorLy8gX19rbXBfeGNoZ19maXhlZDE2KCB2b2xhdGlsZSBrbXBfaW50MTYgKnAsIGttcF9pbnQxNiBkICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgk0KCVlc3ApCisvLyAJZDoJOCglZXNwKQorLy8gcmV0dXJuOiAgICAgJWF4CisKKyAgICAgICAgUFJPQyAgX19rbXBfeGNoZ19maXhlZDE2CisKKyAgICAgICAgbW92bCAgICAgIDQoJWVzcCksICVlY3ggICAgLy8gInAiCisgICAgICAgIG1vdncgICAgICA4KCVlc3ApLCAlYXgJLy8gImQiCisKKyAgICAgICAgbG9jaworICAgICAgICB4Y2hndyAgICAgJWF4LCglZWN4KQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX3hjaGdfZml4ZWQxNgorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfeGNoZ19maXhlZDMyCisvLworLy8ga21wX2ludDMyCisvLyBfX2ttcF94Y2hnX2ZpeGVkMzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGQgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CTQoJWVzcCkKKy8vIAlkOgk4KCVlc3ApCisvLworLy8gcmV0dXJuOgklZWF4CisKKyAgICAgICAgUFJPQyAgX19rbXBfeGNoZ19maXhlZDMyCisKKyAgICAgICAgbW92bCAgICAgIDQoJWVzcCksICVlY3ggICAgLy8gInAiCisgICAgICAgIG1vdmwgICAgICA4KCVlc3ApLCAlZWF4CS8vICJkIgorCisgICAgICAgIGxvY2sKKyAgICAgICAgeGNoZ2wgICAgICVlYXgsKCVlY3gpCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfeGNoZ19maXhlZDMyCisKKworLy8KKy8vIGttcF9pbnQ4CisvLyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgoIHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCBjdiwga21wX2ludDggc3YgKTsKKy8vCisKKyAgICAgICAgUFJPQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4CisKKyAgICAgICAgbW92bCAgICAgIDQoJWVzcCksICVlY3gKKyAgICAgICAgbW92YiAgICAgIDgoJWVzcCksICVhbAorICAgICAgICBtb3ZiICAgICAgMTIoJWVzcCksICVkbAorICAgICAgICBsb2NrCisgICAgICAgIGNtcHhjaGdiICAlZGwsKCVlY3gpCisgICAgICAgIHNldGUgICAgICAlYWwgICAgICAgICAgIC8vIGlmICVhbCA9PSAoJWVjeCkgc2V0ICVhbCA9IDEgZWxzZSBzZXQgJWFsID0gMAorICAgICAgICBhbmQgICAgICAgJDEsICVlYXggICAgICAvLyBzaWduIGV4dGVuZCBwcmV2aW91cyBpbnN0cnVjdGlvbgorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOAorCisvLworLy8ga21wX2ludDE2CisvLyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2KCB2b2xhdGlsZSBrbXBfaW50MTYgKnAsIGttcF9pbnQxNiBjdiwga21wX2ludDE2IHN2ICk7CisvLworCisgICAgICAgIFBST0MgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYKKworICAgICAgICBtb3ZsICAgICAgNCglZXNwKSwgJWVjeAorICAgICAgICBtb3Z3ICAgICAgOCglZXNwKSwgJWF4CisgICAgICAgIG1vdncgICAgICAxMiglZXNwKSwgJWR4CisgICAgICAgIGxvY2sKKyAgICAgICAgY21weGNoZ3cgICVkeCwoJWVjeCkKKyAgICAgICAgc2V0ZSAgICAgICVhbCAgICAgICAgICAgLy8gaWYgJWF4ID09ICglZWN4KSBzZXQgJWFsID0gMSBlbHNlIHNldCAlYWwgPSAwCisgICAgICAgIGFuZCAgICAgICAkMSwgJWVheCAgICAgIC8vIHNpZ24gZXh0ZW5kIHByZXZpb3VzIGluc3RydWN0aW9uCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNgorCisvLworLy8ga21wX2ludDMyCisvLyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBjdiwga21wX2ludDMyIHN2ICk7CisvLworCisgICAgICAgIFBST0MgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIKKworICAgICAgICBtb3ZsICAgICAgNCglZXNwKSwgJWVjeAorICAgICAgICBtb3ZsICAgICAgOCglZXNwKSwgJWVheAorICAgICAgICBtb3ZsICAgICAgMTIoJWVzcCksICVlZHgKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hnbCAgJWVkeCwoJWVjeCkKKyAgICAgICAgc2V0ZSAgICAgICVhbCAgICAgICAgICAgLy8gaWYgJWVheCA9PSAoJWVjeCkgc2V0ICVhbCA9IDEgZWxzZSBzZXQgJWFsID0gMAorICAgICAgICBhbmQgICAgICAgJDEsICVlYXggICAgICAvLyBzaWduIGV4dGVuZCBwcmV2aW91cyBpbnN0cnVjdGlvbgorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIKKworLy8KKy8vIGttcF9pbnQzMgorLy8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgY3YsIGttcF9pbnQ2NCBzdiApOworLy8KKyAgICAgICAgUFJPQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NAorCisgICAgICAgIHB1c2hsICAgICAlZWJwCisgICAgICAgIG1vdmwgICAgICAlZXNwLCAlZWJwCisgICAgICAgIHB1c2hsICAgICAlZWJ4CisgICAgICAgIHB1c2hsICAgICAlZWRpCisgICAgICAgIG1vdmwgICAgICA4KCVlYnApLCAlZWRpCisgICAgICAgIG1vdmwgICAgICAxMiglZWJwKSwgJWVheCAgICAgICAgLy8gImN2IiBsb3cgb3JkZXIgd29yZAorICAgICAgICBtb3ZsICAgICAgMTYoJWVicCksICVlZHggICAgICAgIC8vICJjdiIgaGlnaCBvcmRlciB3b3JkCisgICAgICAgIG1vdmwgICAgICAyMCglZWJwKSwgJWVieCAgICAgICAgLy8gInN2IiBsb3cgb3JkZXIgd29yZAorICAgICAgICBtb3ZsICAgICAgMjQoJWVicCksICVlY3ggICAgICAgIC8vICJzdiIgaGlnaCBvcmRlciB3b3JkCisgICAgICAgIGxvY2sKKyAgICAgICAgY21weGNoZzhiICglZWRpKQorICAgICAgICBzZXRlICAgICAgJWFsICAgICAgICAgICAvLyBpZiAlZWR4OmVheCA9PSAoJWVkaSkgc2V0ICVhbCA9IDEgZWxzZSBzZXQgJWFsID0gMAorICAgICAgICBhbmQgICAgICAgJDEsICVlYXggICAgICAvLyBzaWduIGV4dGVuZCBwcmV2aW91cyBpbnN0cnVjdGlvbgorICAgICAgICBwb3BsICAgICAgJWVkaQorICAgICAgICBwb3BsICAgICAgJWVieAorICAgICAgICBtb3ZsICAgICAgJWVicCwgJWVzcAorICAgICAgICBwb3BsICAgICAgJWVicAorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQKKworLy8KKy8vIGttcF9pbnQ4CisvLyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggY3YsIGttcF9pbnQ4IHN2ICk7CisvLworCisgICAgICAgIFBST0MgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDgKKworICAgICAgICBtb3ZsICAgICAgNCglZXNwKSwgJWVjeAorICAgICAgICBtb3ZiICAgICAgOCglZXNwKSwgJWFsCisgICAgICAgIG1vdmIgICAgICAxMiglZXNwKSwgJWRsCisgICAgICAgIGxvY2sKKyAgICAgICAgY21weGNoZ2IgICVkbCwoJWVjeCkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ4CisKKy8vCisvLyBrbXBfaW50MTYKKy8vIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2KCB2b2xhdGlsZSBrbXBfaW50MTYgKnAsIGttcF9pbnQxNiBjdiwga21wX2ludDE2IHN2ICk7CisvLworCisgICAgICAgIFBST0MgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2CisKKyAgICAgICAgbW92bCAgICAgIDQoJWVzcCksICVlY3gKKyAgICAgICAgbW92dyAgICAgIDgoJWVzcCksICVheAorICAgICAgICBtb3Z3ICAgICAgMTIoJWVzcCksICVkeAorICAgICAgICBsb2NrCisgICAgICAgIGNtcHhjaGd3ICAlZHgsKCVlY3gpCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYKKworLy8KKy8vIGttcF9pbnQzMgorLy8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGN2LCBrbXBfaW50MzIgc3YgKTsKKy8vCisKKyAgICAgICAgUFJPQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIKKworICAgICAgICBtb3ZsICAgICAgNCglZXNwKSwgJWVjeAorICAgICAgICBtb3ZsICAgICAgOCglZXNwKSwgJWVheAorICAgICAgICBtb3ZsICAgICAgMTIoJWVzcCksICVlZHgKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hnbCAgJWVkeCwoJWVjeCkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMgorCisvLworLy8ga21wX2ludDY0CisvLyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgY3YsIGttcF9pbnQ2NCBzdiApOworLy8KKyAgICAgICAgUFJPQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQKKworICAgICAgICBwdXNobCAgICAgJWVicAorICAgICAgICBtb3ZsICAgICAgJWVzcCwgJWVicAorICAgICAgICBwdXNobCAgICAgJWVieAorICAgICAgICBwdXNobCAgICAgJWVkaQorICAgICAgICBtb3ZsICAgICAgOCglZWJwKSwgJWVkaQorICAgICAgICBtb3ZsICAgICAgMTIoJWVicCksICVlYXggICAgICAgIC8vICJjdiIgbG93IG9yZGVyIHdvcmQKKyAgICAgICAgbW92bCAgICAgIDE2KCVlYnApLCAlZWR4ICAgICAgICAvLyAiY3YiIGhpZ2ggb3JkZXIgd29yZAorICAgICAgICBtb3ZsICAgICAgMjAoJWVicCksICVlYnggICAgICAgIC8vICJzdiIgbG93IG9yZGVyIHdvcmQKKyAgICAgICAgbW92bCAgICAgIDI0KCVlYnApLCAlZWN4ICAgICAgICAvLyAic3YiIGhpZ2ggb3JkZXIgd29yZAorICAgICAgICBsb2NrCisgICAgICAgIGNtcHhjaGc4YiAoJWVkaSkKKyAgICAgICAgcG9wbCAgICAgICVlZGkKKyAgICAgICAgcG9wbCAgICAgICVlYngKKyAgICAgICAgbW92bCAgICAgICVlYnAsICVlc3AKKyAgICAgICAgcG9wbCAgICAgICVlYnAKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NAorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfeGNoZ19yZWFsMzIKKy8vCisvLyBrbXBfcmVhbDMyCisvLyBfX2ttcF94Y2hnX3JlYWwzMiggdm9sYXRpbGUga21wX3JlYWwzMiAqYWRkciwga21wX3JlYWwzMiBkYXRhICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlhZGRyOgk0KCVlc3ApCisvLyAJZGF0YToJOCglZXNwKQorLy8KKy8vIHJldHVybjoJJWVheAorCisKKyAgICAgICAgUFJPQyAgX19rbXBfeGNoZ19yZWFsMzIKKworICAgICAgICBwdXNobCAgICVlYnAKKyAgICAgICAgbW92bCAgICAlZXNwLCAlZWJwCisgICAgICAgIHN1YmwgICAgJDQsICVlc3AKKyAgICAgICAgcHVzaGwgICAlZXNpCisKKyAgICAgICAgbW92bCAgICA0KCVlYnApLCAlZXNpCisgICAgICAgIGZsZHMgICAgKCVlc2kpCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2FkIDxhZGRyPgorICAgICAgICBmc3RzICAgIC00KCVlYnApCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdG9yZSBvbGQgdmFsdWUKKworICAgICAgICBtb3ZsICAgIDgoJWVicCksICVlYXgKKworICAgICAgICBsb2NrCisgICAgICAgIHhjaGdsICAgJWVheCwgKCVlc2kpCisKKyAgICAgICAgZmxkcyAgICAtNCglZWJwKQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIG9sZCB2YWx1ZQorCisgICAgICAgIHBvcGwgICAgJWVzaQorICAgICAgICBtb3ZsICAgICVlYnAsICVlc3AKKyAgICAgICAgcG9wbCAgICAlZWJwCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfeGNoZ19yZWFsMzIKKworIyBlbmRpZiAvKiAhS01QX0FTTV9JTlRSSU5TICovCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkCisvLworLy8gdm9pZAorLy8gX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZCgga21wX2ludDE2ICpwICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgk0KCVlc3ApCisvLworCisgICAgICAgIFBST0MgIF9fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQKKworICAgICAgICBtb3ZsICA0KCVlc3ApLCAlZWF4CisgICAgICAgIGZsZGN3ICglZWF4KQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkCisvLworLy8gdm9pZAorLy8gX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQoIGttcF9pbnQxNiAqcCApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJNCglZXNwKQorLy8KKworICAgICAgICBQUk9DICBfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZAorCisgICAgICAgIG1vdmwgIDQoJWVzcCksICVlYXgKKyAgICAgICAgZnN0Y3cgKCVlYXgpCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQKKy8vCisvLyB2b2lkCisvLyBfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkKCk7CisvLworLy8KKworICAgICAgICBQUk9DICBfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkCisKKyAgICAgICAgZm5jbGV4CisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZAorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gdHlwZWRlZiB2b2lkCSgqbWljcm90YXNrX3QpKCBpbnQgKmd0aWQsIGludCAqdGlkLCAuLi4gKTsKKy8vCisvLyBpbnQKKy8vIF9fa21wX2ludm9rZV9taWNyb3Rhc2soIG1pY3JvdGFza190IHBrZm4sIGludCBndGlkLCBpbnQgdGlkLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZ2MsIHZvaWQgKnBfYXJndltdICkgeworLy8gICAgKCpwa2ZuKSggJiBndGlkLCAmIGd0aWQsIGFyZ3ZbMF0sIC4uLiApOworLy8gICAgcmV0dXJuIDE7CisvLyB9CisKKy8vIC0tIEJlZ2luIF9fa21wX2ludm9rZV9taWNyb3Rhc2sKKy8vIG1hcmtfYmVnaW47CisJUFJPQyAgX19rbXBfaW52b2tlX21pY3JvdGFzaworCisJcHVzaGwgJWVicAorCUtNUF9DRklfREVGX09GRlNFVCA4CisJS01QX0NGSV9PRkZTRVQgZWJwLC04CisJbW92bCAlZXNwLCVlYnAJCS8vIGVzdGFibGlzaCB0aGUgYmFzZSBwb2ludGVyIGZvciB0aGlzIHJvdXRpbmUuCisJS01QX0NGSV9SRUdJU1RFUiBlYnAKKwlzdWJsICQ4LCVlc3AJCS8vIGFsbG9jYXRlIHNwYWNlIGZvciB0d28gbG9jYWwgdmFyaWFibGVzLgorCQkJCS8vIFRoZXNlIHZhcmliYWxlcyBhcmU6CisJCQkJLy8JYXJndjogLTQoJWVicCkKKwkJCQkvLwl0ZW1wOiAtOCglZWJwKQorCQkJCS8vCisJcHVzaGwgJWVieAkJLy8gc2F2ZSAlZWJ4IHRvIHVzZSBkdXJpbmcgdGhpcyByb3V0aW5lCisJCQkJLy8KKyNpZiBPTVBUX1NVUFBPUlQKKwltb3ZsIDI4KCVlYnApLCVlYngJLy8gZ2V0IGV4aXRfZnJhbWUgYWRkcmVzcworCW1vdmwgJWVicCwoJWVieCkJLy8gc2F2ZSBleGl0X2ZyYW1lCisjZW5kaWYKKworCW1vdmwgMjAoJWVicCksJWVieAkvLyBTdGFjayBhbGlnbm1lbnQgLSAjIGFyZ3MKKwlhZGRsICQyLCVlYngJCS8vICNhcmdzICsyICBBbHdheXMgcGFzcyBhdCBsZWFzdCAyIGFyZ3MgKGd0aWQgYW5kIHRpZCkKKwlzaGxsICQyLCVlYngJCS8vIE51bWJlciBvZiBieXRlcyB1c2VkIG9uIHN0YWNrOiAoI2FyZ3MrMikqNAorCW1vdmwgJWVzcCwlZWF4CQkvLworCXN1YmwgJWVieCwlZWF4CQkvLyAlZXNwLSgoI2FyZ3MrMikqNCkgLT4gJWVheCAtLSB3aXRob3V0IG1vZHMsIHN0YWNrIHB0ciB3b3VsZCBiZSB0aGlzCisJbW92bCAlZWF4LCVlYngJCS8vIFNhdmUgdG8gJWVieAorCWFuZGwgJDB4RkZGRkZGODAsJWVheAkvLyBtYXNrIG9mZiA3IGJpdHMKKwlzdWJsICVlYXgsJWVieAkJLy8gQW1vdW50IHRvIHN1YnRyYWN0IGZyb20gJWVzcAorCXN1YmwgJWVieCwlZXNwCQkvLyBQcmVwYXJlIHRoZSBzdGFjayBwdHIgLS0KKwkJCQkvLyAgIG5vdyBpdCB3aWxsIGJlIGFsaWduZWQgb24gMTI4LWJ5dGUgYm91bmRhcnkgYXQgdGhlIGNhbGwKKworCW1vdmwgMjQoJWVicCksJWVheAkvLyBjb3B5IGZyb20gcF9hcmd2W10KKwltb3ZsICVlYXgsLTQoJWVicCkJLy8gaW50byB0aGUgbG9jYWwgdmFyaWFibGUgKmFyZ3YuCisKKwltb3ZsIDIwKCVlYnApLCVlYngJLy8gYXJnYyBpcyAyMCglZWJwKQorCXNobGwgJDIsJWVieAorCitLTVBfTEFCRUwoaW52b2tlXzIpOgorCWNtcGwgJDAsJWVieAorCWpnICBLTVBfTEFCRUwoaW52b2tlXzQpCisJam1wIEtNUF9MQUJFTChpbnZva2VfMykKKwlBTElHTiAyCitLTVBfTEFCRUwoaW52b2tlXzQpOgorCW1vdmwgLTQoJWVicCksJWVheAorCXN1YmwgJDQsJWVieAkJCS8vIGRlY3JlbWVudCBhcmdjLgorCWFkZGwgJWVieCwlZWF4CQkJLy8gaW5kZXggaW50byBhcmd2LgorCW1vdmwgKCVlYXgpLCVlZHgKKwlwdXNobCAlZWR4CisKKwlqbXAgS01QX0xBQkVMKGludm9rZV8yKQorCUFMSUdOIDIKK0tNUF9MQUJFTChpbnZva2VfMyk6CisJbGVhbCAxNiglZWJwKSwlZWF4CQkvLyBwdXNoICYgdGlkCisJcHVzaGwgJWVheAorCisJbGVhbCAxMiglZWJwKSwlZWF4CQkvLyBwdXNoICYgZ3RpZAorCXB1c2hsICVlYXgKKworCW1vdmwgOCglZWJwKSwlZWJ4CisJY2FsbCAqJWVieAkJCS8vIGNhbGwgKCpwa2ZuKSgpOworCisJbW92bCAkMSwlZWF4CQkJLy8gcmV0dXJuIDE7CisKKwltb3ZsIC0xMiglZWJwKSwlZWJ4CQkvLyByZXN0b3JlICVlYngKKwlsZWF2ZQorCUtNUF9DRklfREVGIGVzcCw0CisJcmV0CisKKwlERUJVR19JTkZPIF9fa21wX2ludm9rZV9taWNyb3Rhc2sKKy8vIC0tIEVuZCAgX19rbXBfaW52b2tlX21pY3JvdGFzaworCisKKy8vIGttcF91aW50NjQKKy8vIF9fa21wX2hhcmR3YXJlX3RpbWVzdGFtcCh2b2lkKQorCVBST0MgIF9fa21wX2hhcmR3YXJlX3RpbWVzdGFtcAorCXJkdHNjCisJcmV0CisKKwlERUJVR19JTkZPIF9fa21wX2hhcmR3YXJlX3RpbWVzdGFtcAorLy8gLS0gRW5kICBfX2ttcF9oYXJkd2FyZV90aW1lc3RhbXAKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgKi8KKworCisjaWYgS01QX0FSQ0hfWDg2XzY0CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtaWNyb3Rhc2tpbmcgcm91dGluZXMgc3BlY2lmaWNhbGx5IHdyaXR0ZW4gZm9yIElBLTMyIGFyY2hpdGVjdHVyZSBhbmQKKy8vIEludGVsKFIpIDY0IHJ1bm5pbmcgTGludXgqIE9TCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyAtLSBNYWNoaW5lIHR5cGUgUAorLy8gbWFya19kZXNjcmlwdGlvbiAiSW50ZWwgQ29ycG9yYXRpb24iOworCS5pZGVudCAiSW50ZWwgQ29ycG9yYXRpb24iCisvLyAtLQkuZmlsZSAiel9MaW51eF9hc20ucyIKKwkuZGF0YQorCUFMSUdOIDQKKworLy8gVG8gcHJldmVudCBnZXR0aW5nIG91ciBjb2RlIGludG8gLmRhdGEgc2VjdGlvbiAudGV4dCBhZGRlZCB0byBldmVyeSByb3V0aW5lIGRlZmluaXRpb24gZm9yIHg4Nl82NC4KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfeDg2X2NwdWlkCisvLworLy8gdm9pZAorLy8gX19rbXBfeDg2X2NwdWlkKCBpbnQgbW9kZSwgaW50IG1vZGUyLCB2b2lkICpjcHVpZF9idWZmZXIgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCW1vZGU6CQklZWRpCisvLyAJbW9kZTI6CQklZXNpCisvLyAJY3B1aWRfYnVmZmVyOgklcmR4CisKKyAgICAgICAgLnRleHQKKwlQUk9DICBfX2ttcF94ODZfY3B1aWQKKworCXB1c2hxICAlcmJwCisJbW92cSAgICVyc3AsJXJicAorICAgICAgICBwdXNocSAgJXJieAkJCS8vIGNhbGxlZS1zYXZlIHJlZ2lzdGVyCisKKwltb3ZsICAgJWVzaSwgJWVjeAkJLy8gIm1vZGUyIgorCW1vdmwgICAlZWRpLCAlZWF4CQkvLyAibW9kZSIKKyAgICAgICAgbW92cSAgICVyZHgsICVyc2kgICAgICAgICAgICAgICAvLyBjcHVpZF9idWZmZXIKKwljcHVpZAkJCQkvLyBRdWVyeSB0aGUgQ1BVSUQgZm9yIHRoZSBjdXJyZW50IHByb2Nlc3NvcgorCisJbW92bCAgICVlYXgsIDAoJXJzaSkJCS8vIHN0b3JlIHJlc3VsdHMgaW50byBidWZmZXIKKwltb3ZsICAgJWVieCwgNCglcnNpKQorCW1vdmwgICAlZWN4LCA4KCVyc2kpCisJbW92bCAgICVlZHgsIDEyKCVyc2kpCisKKyAgICAgICAgcG9wcSAgICVyYngJCQkvLyBjYWxsZWUtc2F2ZSByZWdpc3RlcgorICAgICAgICBtb3ZxICAgJXJicCwgJXJzcAorICAgICAgICBwb3BxICAgJXJicAorCXJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfeDg2X2NwdWlkCisKKworCisjIGlmICFLTVBfQVNNX0lOVFJJTlMKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF90ZXN0X3RoZW5fYWRkMzIKKy8vCisvLyBrbXBfaW50MzIKKy8vIF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgZCApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJJXJkaQorLy8gCWQ6CSVlc2kKKy8vCisvLyByZXR1cm46CSVlYXgKKworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF90ZXN0X3RoZW5fYWRkMzIKKworICAgICAgICBtb3ZsICAgICAgJWVzaSwgJWVheAkvLyAiZCIKKyAgICAgICAgbG9jaworICAgICAgICB4YWRkbCAgICAgJWVheCwoJXJkaSkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF90ZXN0X3RoZW5fYWRkMzIKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NAorLy8KKy8vIGttcF9pbnQ2NAorLy8gX19rbXBfdGVzdF90aGVuX2FkZDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBkICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgklcmRpCisvLyAJZDoJJXJzaQorLy8JcmV0dXJuOgklcmF4CisKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfdGVzdF90aGVuX2FkZDY0CisKKyAgICAgICAgbW92cSAgICAgICVyc2ksICVyYXgJLy8gImQiCisgICAgICAgIGxvY2sKKyAgICAgICAgeGFkZHEgICAgICVyYXgsKCVyZGkpCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfdGVzdF90aGVuX2FkZDY0CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF94Y2hnX2ZpeGVkOAorLy8KKy8vIGttcF9pbnQzMgorLy8gX19rbXBfeGNoZ19maXhlZDgoIHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCBkICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgklcmRpCisvLyAJZDoJJXNpbAorLy8KKy8vIHJldHVybjoJJWFsCisKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfeGNoZ19maXhlZDgKKworICAgICAgICBtb3ZiICAgICAgJXNpbCwgJWFsCS8vICJkIgorCisgICAgICAgIGxvY2sKKyAgICAgICAgeGNoZ2IgICAgICVhbCwoJXJkaSkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF94Y2hnX2ZpeGVkOAorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfeGNoZ19maXhlZDE2CisvLworLy8ga21wX2ludDE2CisvLyBfX2ttcF94Y2hnX2ZpeGVkMTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IGQgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CSVyZGkKKy8vIAlkOgklc2kKKy8vIHJldHVybjogICAgICVheAorCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX3hjaGdfZml4ZWQxNgorCisgICAgICAgIG1vdncgICAgICAlc2ksICVheAkvLyAiZCIKKworICAgICAgICBsb2NrCisgICAgICAgIHhjaGd3ICAgICAlYXgsKCVyZGkpCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfeGNoZ19maXhlZDE2CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF94Y2hnX2ZpeGVkMzIKKy8vCisvLyBrbXBfaW50MzIKKy8vIF9fa21wX3hjaGdfZml4ZWQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgZCApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJJXJkaQorLy8gCWQ6CSVlc2kKKy8vCisvLyByZXR1cm46CSVlYXgKKworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF94Y2hnX2ZpeGVkMzIKKworICAgICAgICBtb3ZsICAgICAgJWVzaSwgJWVheAkvLyAiZCIKKworICAgICAgICBsb2NrCisgICAgICAgIHhjaGdsICAgICAlZWF4LCglcmRpKQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX3hjaGdfZml4ZWQzMgorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfeGNoZ19maXhlZDY0CisvLworLy8ga21wX2ludDY0CisvLyBfX2ttcF94Y2hnX2ZpeGVkNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGQgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CSVyZGkKKy8vIAlkOgklcnNpCisvLyByZXR1cm46CSVyYXgKKworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF94Y2hnX2ZpeGVkNjQKKworICAgICAgICBtb3ZxICAgICAgJXJzaSwgJXJheAkvLyAiZCIKKworICAgICAgICBsb2NrCisgICAgICAgIHhjaGdxICAgICAlcmF4LCglcmRpKQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX3hjaGdfZml4ZWQ2NAorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4CisvLworLy8ga21wX2ludDgKKy8vIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGN2LCBrbXBfaW50OCBzdiApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJJXJkaQorLy8gCWN2OgklZXNpCisvLwlzdjoJJWVkeAorLy8KKy8vIHJldHVybjoJJWVheAorCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOAorCisgICAgICAgIG1vdmIgICAgICAlc2lsLCAlYWwJLy8gImN2IgorICAgICAgICBsb2NrCisgICAgICAgIGNtcHhjaGdiICAlZGwsKCVyZGkpCisgICAgICAgIHNldGUgICAgICAlYWwgICAgICAgICAgIC8vIGlmICVhbCA9PSAoJXJkaSkgc2V0ICVhbCA9IDEgZWxzZSBzZXQgJWFsID0gMAorICAgICAgICBhbmRxICAgICAgJDEsICVyYXggICAgICAvLyBzaWduIGV4dGVuZCBwcmV2aW91cyBpbnN0cnVjdGlvbiBmb3IgcmV0dXJuIHZhbHVlCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2CisvLworLy8ga21wX2ludDE2CisvLyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2KCB2b2xhdGlsZSBrbXBfaW50MTYgKnAsIGttcF9pbnQxNiBjdiwga21wX2ludDE2IHN2ICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgklcmRpCisvLyAJY3Y6CSVzaQorLy8Jc3Y6CSVkeAorLy8KKy8vIHJldHVybjoJJWVheAorCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYKKworICAgICAgICBtb3Z3ICAgICAgJXNpLCAlYXgJLy8gImN2IgorICAgICAgICBsb2NrCisgICAgICAgIGNtcHhjaGd3ICAlZHgsKCVyZGkpCisgICAgICAgIHNldGUgICAgICAlYWwgICAgICAgICAgIC8vIGlmICVheCA9PSAoJXJkaSkgc2V0ICVhbCA9IDEgZWxzZSBzZXQgJWFsID0gMAorICAgICAgICBhbmRxICAgICAgJDEsICVyYXggICAgICAvLyBzaWduIGV4dGVuZCBwcmV2aW91cyBpbnN0cnVjdGlvbiBmb3IgcmV0dXJuIHZhbHVlCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNgorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMgorLy8KKy8vIGttcF9pbnQzMgorLy8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgY3YsIGttcF9pbnQzMiBzdiApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJJXJkaQorLy8gCWN2OgklZXNpCisvLwlzdjoJJWVkeAorLy8KKy8vIHJldHVybjoJJWVheAorCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIKKworICAgICAgICBtb3ZsICAgICAgJWVzaSwgJWVheAkvLyAiY3YiCisgICAgICAgIGxvY2sKKyAgICAgICAgY21weGNoZ2wgICVlZHgsKCVyZGkpCisgICAgICAgIHNldGUgICAgICAlYWwgICAgICAgICAgIC8vIGlmICVlYXggPT0gKCVyZGkpIHNldCAlYWwgPSAxIGVsc2Ugc2V0ICVhbCA9IDAKKyAgICAgICAgYW5kcSAgICAgICQxLCAlcmF4ICAgICAgLy8gc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gZm9yIHJldHVybiB2YWx1ZQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQKKy8vCisvLyBrbXBfaW50MzIKKy8vIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGN2LCBrbXBfaW50NjQgc3YgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CSVyZGkKKy8vIAljdjoJJXJzaQorLy8Jc3Y6CSVyZHgKKy8vCXJldHVybjoJJWVheAorCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQKKworICAgICAgICBtb3ZxICAgICAgJXJzaSwgJXJheCAgICAvLyAiY3YiCisgICAgICAgIGxvY2sKKyAgICAgICAgY21weGNoZ3EgICVyZHgsKCVyZGkpCisgICAgICAgIHNldGUgICAgICAlYWwgICAgICAgICAgIC8vIGlmICVyYXggPT0gKCVyZGkpIHNldCAlYWwgPSAxIGVsc2Ugc2V0ICVhbCA9IDAKKyAgICAgICAgYW5kcSAgICAgICQxLCAlcmF4ICAgICAgLy8gc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gZm9yIHJldHVybiB2YWx1ZQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ4CisvLworLy8ga21wX2ludDgKKy8vIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDgoIHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCBjdiwga21wX2ludDggc3YgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CSVyZGkKKy8vIAljdjoJJWVzaQorLy8Jc3Y6CSVlZHgKKy8vCisvLyByZXR1cm46CSVlYXgKKworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ4CisKKyAgICAgICAgbW92YiAgICAgICVzaWwsICVhbAkvLyAiY3YiCisgICAgICAgIGxvY2sKKyAgICAgICAgY21weGNoZ2IgICVkbCwoJXJkaSkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ4CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNgorLy8KKy8vIGttcF9pbnQxNgorLy8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNl9yZXQoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IGN2LCBrbXBfaW50MTYgc3YgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CSVyZGkKKy8vIAljdjoJJXNpCisvLwlzdjoJJWR4CisvLworLy8gcmV0dXJuOgklZWF4CisKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYKKworICAgICAgICBtb3Z3ICAgICAgJXNpLCAlYXgJLy8gImN2IgorICAgICAgICBsb2NrCisgICAgICAgIGNtcHhjaGd3ICAlZHgsKCVyZGkpCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDMyCisvLworLy8ga21wX2ludDMyCisvLyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgY3YsIGttcF9pbnQzMiBzdiApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJJXJkaQorLy8gCWN2OgklZXNpCisvLwlzdjoJJWVkeAorLy8KKy8vIHJldHVybjoJJWVheAorCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDMyCisKKyAgICAgICAgbW92bCAgICAgICVlc2ksICVlYXgJLy8gImN2IgorICAgICAgICBsb2NrCisgICAgICAgIGNtcHhjaGdsICAlZWR4LCglcmRpKQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDMyCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NAorLy8KKy8vIGttcF9pbnQ2NAorLy8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGN2LCBrbXBfaW50NjQgc3YgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CSVyZGkKKy8vIAljdjoJJXJzaQorLy8Jc3Y6CSVyZHgKKy8vCXJldHVybjoJJWVheAorCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0CisKKyAgICAgICAgbW92cSAgICAgICVyc2ksICVyYXggICAgLy8gImN2IgorICAgICAgICBsb2NrCisgICAgICAgIGNtcHhjaGdxICAlcmR4LCglcmRpKQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0CisKKyMgZW5kaWYgLyogIUtNUF9BU01fSU5UUklOUyAqLworCisKKyMgaWYgIUtNUF9NSUMKKworIyBpZiAhS01QX0FTTV9JTlRSSU5TCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfeGNoZ19yZWFsMzIKKy8vCisvLyBrbXBfcmVhbDMyCisvLyBfX2ttcF94Y2hnX3JlYWwzMiggdm9sYXRpbGUga21wX3JlYWwzMiAqYWRkciwga21wX3JlYWwzMiBkYXRhICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlhZGRyOgklcmRpCisvLyAJZGF0YToJJXhtbTAgKGxvd2VyIDQgYnl0ZXMpCisvLworLy8gcmV0dXJuOgkleG1tMCAobG93ZXIgNCBieXRlcykKKworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF94Y2hnX3JlYWwzMgorCisJbW92ZAkleG1tMCwgJWVheAkvLyBsb2FkICJkYXRhIiB0byBlYXgKKworICAgICAgICAgbG9jaworICAgICAgICAgeGNoZ2wgJWVheCwgKCVyZGkpCisKKwltb3ZkCSVlYXgsICV4bW0wCS8vIGxvYWQgb2xkIHZhbHVlIGludG8gcmV0dXJuIHJlZ2lzdGVyCisKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF94Y2hnX3JlYWwzMgorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfeGNoZ19yZWFsNjQKKy8vCisvLyBrbXBfcmVhbDY0CisvLyBfX2ttcF94Y2hnX3JlYWw2NCggdm9sYXRpbGUga21wX3JlYWw2NCAqYWRkciwga21wX3JlYWw2NCBkYXRhICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vICAgICAgYWRkcjogICAlcmRpCisvLyAgICAgIGRhdGE6ICAgJXhtbTAgKGxvd2VyIDggYnl0ZXMpCisvLyAgICAgIHJldHVybjogJXhtbTAgKGxvd2VyIDggYnl0ZXMpCisvLworCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX3hjaGdfcmVhbDY0CisKKwltb3ZkCSV4bW0wLCAlcmF4CS8vIGxvYWQgImRhdGEiIHRvIHJheAorCisgICAgICAgICBsb2NrCisJeGNoZ3EgICVyYXgsICglcmRpKQorCisJbW92ZAklcmF4LCAleG1tMAkvLyBsb2FkIG9sZCB2YWx1ZSBpbnRvIHJldHVybiByZWdpc3RlcgorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX3hjaGdfcmVhbDY0CisKKworIyBlbmRpZiAvKiAhS01QX01JQyAqLworCisjIGVuZGlmIC8qICFLTVBfQVNNX0lOVFJJTlMgKi8KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQKKy8vCisvLyB2b2lkCisvLyBfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkKCBrbXBfaW50MTYgKnAgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CSVyZGkKKy8vCisKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZAorCisgICAgICAgIGZsZGN3ICglcmRpKQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkCisvLworLy8gdm9pZAorLy8gX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQoIGttcF9pbnQxNiAqcCApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJJXJkaQorLy8KKworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZAorCisgICAgICAgIGZzdGN3ICglcmRpKQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkCisvLworLy8gdm9pZAorLy8gX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZCgpOworLy8KKy8vCisKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZAorCisjaWYgS01QX01JQworLy8gVE9ETzogcmVtb3ZlIHRoZSB3b3JrYXJvdW5kIGZvciBwcm9ibGVtIHdpdGggZm5jbGV4IGluc3RydWN0aW9uIChubyBDUSBrbm93bikKKyAgICAgICAgZnN0ZW52ICAtMzIoJXJzcCkgICAgICAgICAgICAgIC8vIHN0b3JlIEZQIGVudgorICAgICAgICBhbmR3ICAgICR+MHg4MGZmLCA0LTMyKCVyc3ApICAgLy8gY2xlYXIgMC03LDE1IGJpdHMgb2YgRlAgU1cKKyAgICAgICAgZmxkZW52ICAtMzIoJXJzcCkgICAgICAgICAgICAgIC8vIGxvYWQgRlAgZW52IGJhY2sKKyAgICAgICAgcmV0CisjZWxzZQorICAgICAgICBmbmNsZXgKKyAgICAgICAgcmV0CisjZW5kaWYKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIHR5cGVkZWYgdm9pZAkoKm1pY3JvdGFza190KSggaW50ICpndGlkLCBpbnQgKnRpZCwgLi4uICk7CisvLworLy8gaW50CisvLyBfX2ttcF9pbnZva2VfbWljcm90YXNrKCB2b2lkICgqcGtmbikgKGludCBndGlkLCBpbnQgdGlkLCAuLi4pLAorLy8JCSAgICAgICAgICAgaW50IGd0aWQsIGludCB0aWQsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJnYywgdm9pZCAqcF9hcmd2W10gKSB7CisvLyAgICAoKnBrZm4pKCAmIGd0aWQsICYgdGlkLCBhcmd2WzBdLCAuLi4gKTsKKy8vICAgIHJldHVybiAxOworLy8gfQorLy8KKy8vIG5vdGU6CisvLwlhdCBjYWxsIHRvIHBrZm4gbXVzdCBoYXZlICVyc3AgMTI4LWJ5dGUgYWxpZ25lZCBmb3IgY29tcGlsZXIKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gICAgICAlcmRpOiAgCXBrZm4KKy8vCSVlc2k6CWd0aWQKKy8vCSVlZHg6CXRpZAorLy8JJWVjeDoJYXJnYworLy8JJXI4OglwX2FyZ3YKKy8vCSVyOToJJmV4aXRfZnJhbWUKKy8vCisvLyBsb2NhbHM6CisvLwlfX2d0aWQ6CWd0aWQgcGFybSBwdXNoZWQgb24gc3RhY2sgc28gY2FuIHBhc3MgJmd0aWQgdG8gcGtmbgorLy8JX190aWQ6CXRpZCBwYXJtIHB1c2hlZCBvbiBzdGFjayBzbyBjYW4gcGFzcyAmdGlkIHRvIHBrZm4KKy8vCisvLyByZWcgdGVtcHM6CisvLwklcmF4Ogl1c2VkIGFsbCBvdmVyIHRoZSBwbGFjZQorLy8JJXJkeDoJdXNlZCBpbiBzdGFjayBwb2ludGVyIGFsaWdubWVudCBjYWxjdWxhdGlvbgorLy8JJXIxMToJdXNlZCB0byB0cmF2ZXJzZSBwX2FyZ3YgYXJyYXkKKy8vCSVyc2k6CXVzZWQgYXMgdGVtcG9yYXJ5IGZvciBzdGFjayBwYXJhbWV0ZXJzCisvLwkJdXNlZCBhcyB0ZW1wb3JhcnkgZm9yIG51bWJlciBvZiBwa2ZuIHBhcm1zIHRvIHB1c2gKKy8vCSVyYng6CXVzZWQgdG8gaG9sZCBwa2ZuIGFkZHJlc3MsIGFuZCB6ZXJvIGNvbnN0YW50LCBjYWxsZWUtc2F2ZQorLy8KKy8vIHJldHVybjoJJWVheCAJKGFsd2F5cyAxL1RSVUUpCisvLworCitfX2d0aWQgPSAtMTYKK19fdGlkID0gLTI0CisKKy8vIC0tIEJlZ2luIF9fa21wX2ludm9rZV9taWNyb3Rhc2sKKy8vIG1hcmtfYmVnaW47CisgICAgICAgIC50ZXh0CisJUFJPQyAgX19rbXBfaW52b2tlX21pY3JvdGFzaworCisJcHVzaHEgCSVyYnAJCS8vIHNhdmUgYmFzZSBwb2ludGVyCisJS01QX0NGSV9ERUZfT0ZGU0VUIDE2CisJS01QX0NGSV9PRkZTRVQgcmJwLC0xNgorCW1vdnEgCSVyc3AsJXJicAkvLyBlc3RhYmxpc2ggdGhlIGJhc2UgcG9pbnRlciBmb3IgdGhpcyByb3V0aW5lLgorCUtNUF9DRklfUkVHSVNURVIgcmJwCisKKyNpZiBPTVBUX1NVUFBPUlQKKwltb3ZxCSVyYnAsICglcjkpCS8vIHNhdmUgZXhpdF9mcmFtZQorI2VuZGlmCisKKwlwdXNocSAJJXJieAkJLy8gJXJieCBpcyBjYWxsZWUtc2F2ZWQgcmVnaXN0ZXIKKwlwdXNocQklcnNpCQkvLyBQdXQgZ3RpZCBvbiBzdGFjayBzbyBjYW4gcGFzcyAmdGdpZCB0byBwa2ZuCisJcHVzaHEJJXJkeAkJLy8gUHV0IHRpZCBvbiBzdGFjayBzbyBjYW4gcGFzcyAmdGlkIHRvIHBrZm4KKworCW1vdnEJJXJjeCwgJXJheAkvLyBTdGFjayBhbGlnbm1lbnQgY2FsY3VsYXRpb24gYmVnaW5zOyBhcmdjIC0+ICVyYXgKKwltb3ZxCSQwLCAlcmJ4CS8vIGNvbnN0YW50IGZvciBjbW92cyBsYXRlcgorCXN1YnEJJDQsICVyYXgJLy8gc3VidHJhY3QgZm91ciBhcmdzIHBhc3NlZCBpbiByZWdpc3RlcnMgdG8gcGtmbgorI2lmIEtNUF9NSUMKKwlqcwlLTVBfTEFCRUwoa21wXzApCS8vIGp1bXAgdG8gbW92cQorCWptcAlLTVBfTEFCRUwoa21wXzBfZXhpdCkJLy8ganVtcCBhaGVhZAorS01QX0xBQkVMKGttcF8wKToKKwltb3ZxCSVyYngsICVyYXgJLy8gemVybyBuZWdhdGl2ZSB2YWx1ZSBpbiAlcmF4IDwtIG1heCgwLCBhcmdjLTQpCitLTVBfTEFCRUwoa21wXzBfZXhpdCk6CisjZWxzZQorCWNtb3ZzcQklcmJ4LCAlcmF4CS8vIHplcm8gbmVnYXRpdmUgdmFsdWUgaW4gJXJheCA8LSBtYXgoMCwgYXJnYy00KQorI2VuZGlmIC8vIEtNUF9NSUMKKworCW1vdnEJJXJheCwgJXJzaQkvLyBzYXZlIG1heCgwLCBhcmdjLTQpIC0+ICVyc2kgZm9yIGxhdGVyCisJc2hscSAJJDMsICVyYXgJLy8gTnVtYmVyIG9mIGJ5dGVzIHVzZWQgb24gc3RhY2s6IG1heCgwLCBhcmdjLTQpKjgKKworCW1vdnEgCSVyc3AsICVyZHgJLy8KKwlzdWJxIAklcmF4LCAlcmR4CS8vICVyc3AtKG1heCgwLGFyZ2MtNCkqOCkgLT4gJXJkeCAtLQorCQkJCS8vIHdpdGhvdXQgYWxpZ24sIHN0YWNrIHB0ciB3b3VsZCBiZSB0aGlzCisJbW92cSAJJXJkeCwgJXJheAkvLyBTYXZlIHRvICVyYXgKKworCWFuZHEgCSQweEZGRkZGRkZGRkZGRkZGODAsICVyYXggIC8vIG1hc2sgb2ZmIGxvd2VyIDcgYml0cyAoMTI4IGJ5dGVzIGFsaWduKQorCXN1YnEgCSVyYXgsICVyZHgJLy8gQW1vdW50IHRvIHN1YnRyYWN0IGZyb20gJXJzcAorCXN1YnEgCSVyZHgsICVyc3AJLy8gUHJlcGFyZSB0aGUgc3RhY2sgcHRyIC0tCisJCQkJLy8gbm93ICVyc3Agd2lsbCBhbGlnbiB0byAxMjgtYnl0ZSBib3VuZGFyeSBhdCBjYWxsIHNpdGUKKworCQkJCS8vIHNldHVwIHBrZm4gcGFyYW1ldGVyIHJlZyBhbmQgc3RhY2sKKwltb3ZxCSVyY3gsICVyYXgJLy8gYXJnYyAtPiAlcmF4CisJY21wcQkkMCwgJXJzaQorCWplCUtNUF9MQUJFTChrbXBfaW52b2tlX3Bhc3NfcGFybXMpCS8vIGp1bXAgYWhlYWQgaWYgbm8gcGFybXMgdG8gcHVzaAorCXNobHEJJDMsICVyY3gJLy8gYXJnYyo4IC0+ICVyY3gKKwltb3ZxIAklcjgsICVyZHgJLy8gcF9hcmd2IC0+ICVyZHgKKwlhZGRxCSVyY3gsICVyZHgJLy8gJnBfYXJndlthcmdjXSAtPiAlcmR4CisKKwltb3ZxCSVyc2ksICVyY3gJLy8gbWF4ICgwLCBhcmdjLTQpIC0+ICVyY3gKKworS01QX0xBQkVMKGttcF9pbnZva2VfcHVzaF9wYXJtcyk6CisJLy8gcHVzaCBudGggLSA3dGggcGFybXMgdG8gcGtmbiBvbiBzdGFjaworCXN1YnEJJDgsICVyZHgJLy8gZGVjcmVtZW50IHBfYXJndiBwb2ludGVyIHRvIHByZXZpb3VzIHBhcm0KKwltb3ZxCSglcmR4KSwgJXJzaQkvLyBwX2FyZ3ZbJXJjeC0xXSAtPiAlcnNpCisJcHVzaHEJJXJzaQkJLy8gcHVzaCBwX2FyZ3ZbJXJjeC0xXSBvbnRvIHN0YWNrIChyZXZlcnNlIG9yZGVyKQorCXN1YmwJJDEsICVlY3gKKworLy8gQzY5NTcwOiAiWDg2XzY0X1JFTE9DX0JSQU5DSCBub3Qgc3VwcG9ydGVkIiBlcnJvciBhdCBsaW5raW5nIG9uIG1hY18zMmUKKy8vCQlpZiB0aGUgbmFtZSBvZiB0aGUgbGFiZWwgdGhhdCBpcyBhbiBvcGVyYW5kIG9mIHRoaXMgamVjeHogc3RhcnRzIHdpdGggYSBkb3QgKCIuIik7CisvLwkgICBBcHBsZSdzIGxpbmtlciBkb2VzIG5vdCBzdXBwb3J0IDEtYnl0ZSBsZW5ndGggcmVsb2NhdGlvbjsKKy8vICAgICAgICAgUmVzb2x1dGlvbjogcmVwbGFjZSBhbGwgLmxhYmVsWCBlbnRyaWVzIHdpdGggTF9sYWJlbFguCisKKwlqZWN4eiAgIEtNUF9MQUJFTChrbXBfaW52b2tlX3Bhc3NfcGFybXMpICAvLyBzdG9wIHdoZW4gZm91ciBwX2FyZ3ZbXSBwYXJtcyBsZWZ0CisJam1wCUtNUF9MQUJFTChrbXBfaW52b2tlX3B1c2hfcGFybXMpCisJQUxJR04gMworS01QX0xBQkVMKGttcF9pbnZva2VfcGFzc19wYXJtcyk6CS8vIHB1dCAxc3QgLSA2dGggcGFybXMgdG8gcGtmbiBpbiByZWdpc3RlcnMuCisJCQkJLy8gb3JkZXIgaGVyZSBpcyBpbXBvcnRhbnQgdG8gYXZvaWQgdHJhc2hpbmcKKwkJCQkvLyByZWdpc3RlcnMgdXNlZCBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0IHBhcm1zIQorCW1vdnEJJXJkaSwgJXJieAkvLyBwa2ZuIC0+ICVyYngKKwlsZWFxCV9fZ3RpZCglcmJwKSwgJXJkaSAvLyAmZ3RpZCAtPiAlcmRpIChzdG9yZSAxc3QgcGFybSB0byBwa2ZuKQorCWxlYXEJX190aWQoJXJicCksICVyc2kgIC8vICZ0aWQgLT4gJXJzaSAoc3RvcmUgMm5kIHBhcm0gdG8gcGtmbikKKworCW1vdnEJJXI4LCAlcjExCS8vIHBfYXJndiAtPiAlcjExCisKKyNpZiBLTVBfTUlDCisJY21wcQkkNCwgJXJheAkvLyBhcmdjID49IDQ/CisJam5zCUtNUF9MQUJFTChrbXBfNCkJLy8ganVtcCB0byBtb3ZxCisJam1wCUtNUF9MQUJFTChrbXBfNF9leGl0KQkvLyBqdW1wIGFoZWFkCitLTVBfTEFCRUwoa21wXzQpOgorCW1vdnEJMjQoJXIxMSksICVyOQkvLyBwX2FyZ3ZbM10gLT4gJXI5IChzdG9yZSA2dGggcGFybSB0byBwa2ZuKQorS01QX0xBQkVMKGttcF80X2V4aXQpOgorCisJY21wcQkkMywgJXJheAkvLyBhcmdjID49IDM/CisJam5zCUtNUF9MQUJFTChrbXBfMykJLy8ganVtcCB0byBtb3ZxCisJam1wCUtNUF9MQUJFTChrbXBfM19leGl0KQkvLyBqdW1wIGFoZWFkCitLTVBfTEFCRUwoa21wXzMpOgorCW1vdnEJMTYoJXIxMSksICVyOAkvLyBwX2FyZ3ZbMl0gLT4gJXI4IChzdG9yZSA1dGggcGFybSB0byBwa2ZuKQorS01QX0xBQkVMKGttcF8zX2V4aXQpOgorCisJY21wcQkkMiwgJXJheAkvLyBhcmdjID49IDI/CisJam5zCUtNUF9MQUJFTChrbXBfMikJLy8ganVtcCB0byBtb3ZxCisJam1wCUtNUF9MQUJFTChrbXBfMl9leGl0KQkvLyBqdW1wIGFoZWFkCitLTVBfTEFCRUwoa21wXzIpOgorCW1vdnEJOCglcjExKSwgJXJjeAkvLyBwX2FyZ3ZbMV0gLT4gJXJjeCAoc3RvcmUgNHRoIHBhcm0gdG8gcGtmbikKK0tNUF9MQUJFTChrbXBfMl9leGl0KToKKworCWNtcHEJJDEsICVyYXgJLy8gYXJnYyA+PSAxPworCWpucwlLTVBfTEFCRUwoa21wXzEpCS8vIGp1bXAgdG8gbW92cQorCWptcAlLTVBfTEFCRUwoa21wXzFfZXhpdCkJLy8ganVtcCBhaGVhZAorS01QX0xBQkVMKGttcF8xKToKKwltb3ZxCSglcjExKSwgJXJkeAkvLyBwX2FyZ3ZbMF0gLT4gJXJkeCAoc3RvcmUgM3JkIHBhcm0gdG8gcGtmbikKK0tNUF9MQUJFTChrbXBfMV9leGl0KToKKyNlbHNlCisJY21wcQkkNCwgJXJheAkvLyBhcmdjID49IDQ/CisJY21vdm5zcQkyNCglcjExKSwgJXI5CS8vIHBfYXJndlszXSAtPiAlcjkgKHN0b3JlIDZ0aCBwYXJtIHRvIHBrZm4pCisKKwljbXBxCSQzLCAlcmF4CS8vIGFyZ2MgPj0gMz8KKwljbW92bnNxCTE2KCVyMTEpLCAlcjgJLy8gcF9hcmd2WzJdIC0+ICVyOCAoc3RvcmUgNXRoIHBhcm0gdG8gcGtmbikKKworCWNtcHEJJDIsICVyYXgJLy8gYXJnYyA+PSAyPworCWNtb3Zuc3EJOCglcjExKSwgJXJjeAkvLyBwX2FyZ3ZbMV0gLT4gJXJjeCAoc3RvcmUgNHRoIHBhcm0gdG8gcGtmbikKKworCWNtcHEJJDEsICVyYXgJLy8gYXJnYyA+PSAxPworCWNtb3Zuc3EJKCVyMTEpLCAlcmR4CS8vIHBfYXJndlswXSAtPiAlcmR4IChzdG9yZSAzcmQgcGFybSB0byBwa2ZuKQorI2VuZGlmIC8vIEtNUF9NSUMKKworCWNhbGwJKiVyYngJCS8vIGNhbGwgKCpwa2ZuKSgpOworCW1vdnEJJDEsICVyYXgJLy8gbW92ZSAxIGludG8gcmV0dXJuIHJlZ2lzdGVyOworCisJbW92cQktOCglcmJwKSwgJXJieAkvLyByZXN0b3JlICVyYngJdXNpbmcgJXJicCBzaW5jZSAlcnNwIHdhcyBtb2RpZmllZAorCW1vdnEgCSVyYnAsICVyc3AJLy8gcmVzdG9yZSBzdGFjayBwb2ludGVyCisJcG9wcSAJJXJicAkJLy8gcmVzdG9yZSBmcmFtZSBwb2ludGVyCisJS01QX0NGSV9ERUYgcnNwLDgKKwlyZXQKKworCURFQlVHX0lORk8gX19rbXBfaW52b2tlX21pY3JvdGFzaworLy8gLS0gRW5kICBfX2ttcF9pbnZva2VfbWljcm90YXNrCisKKy8vIGttcF91aW50NjQKKy8vIF9fa21wX2hhcmR3YXJlX3RpbWVzdGFtcCh2b2lkKQorICAgICAgICAudGV4dAorCVBST0MgIF9fa21wX2hhcmR3YXJlX3RpbWVzdGFtcAorCXJkdHNjCisJc2hscSAgICAkMzIsICVyZHgKKwlvcnEgICAgICVyZHgsICVyYXgKKwlyZXQKKworCURFQlVHX0lORk8gX19rbXBfaGFyZHdhcmVfdGltZXN0YW1wCisvLyAtLSBFbmQgIF9fa21wX2hhcmR3YXJlX3RpbWVzdGFtcAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX2JzcjMyCisvLworLy8gaW50CisvLyBfX2ttcF9ic3IzMiggaW50ICk7CisvLworCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX2JzcjMyCisKKyAgICAgICAgYnNyICAgICVlZGksJWVheAorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2JzcjMyCisKKwkKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZW5kaWYgLyogS01QX0FSQ0hfWDg2XzY0ICovCisKKyNpZiBLTVBfQVJDSF9BUk0KKyAgICAuZGF0YQorICAgIC5jb21tIC5nb21wX2NyaXRpY2FsX3VzZXJfLDMyLDgKKyAgICAuZGF0YQorICAgIC5hbGlnbiA0CisgICAgLmdsb2JhbCBfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHIKK19fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkcjoKKyAgICAuNGJ5dGUgLmdvbXBfY3JpdGljYWxfdXNlcl8KKyAgICAuc2l6ZSBfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHIsNAorI2VuZGlmIC8qIEtNUF9BUkNIX0FSTSAqLworCisjaWYgS01QX0FSQ0hfUFBDNjQgfHwgS01QX0FSQ0hfQUFSQ0g2NAorICAgIC5kYXRhCisgICAgLmNvbW0gLmdvbXBfY3JpdGljYWxfdXNlcl8sMzIsOAorICAgIC5kYXRhCisgICAgLmFsaWduIDgKKyAgICAuZ2xvYmFsIF9fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkcgorX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyOgorICAgIC44Ynl0ZSAuZ29tcF9jcml0aWNhbF91c2VyXworICAgIC5zaXplIF9fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkciw4CisjZW5kaWYgLyogS01QX0FSQ0hfUFBDNjQgfHwgS01QX0FSQ0hfQUFSQ0g2NCAqLworCisjaWYgS01QX09TX0xJTlVYCisjIGlmIEtNUF9BUkNIX0FSTQorLnNlY3Rpb24gLm5vdGUuR05VLXN0YWNrLCIiLCVwcm9nYml0cworIyBlbHNlCisuc2VjdGlvbiAubm90ZS5HTlUtc3RhY2ssIiIsQHByb2diaXRzCisjIGVuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL3pfTGludXhfdXRpbC5jIGIvZmluYWwvcnVudGltZS9zcmMvel9MaW51eF91dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGViZDljNAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL3pfTGludXhfdXRpbC5jCkBAIC0wLDAgKzEsMjcxNCBAQAorLyoKKyAqIHpfTGludXhfdXRpbC5jIC0tIHBsYXRmb3JtIHNwZWNpZmljIHJvdXRpbmVzLgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX3dyYXBwZXJfZ2V0cGlkLmgiCisjaW5jbHVkZSAia21wX2l0dC5oIgorI2luY2x1ZGUgImttcF9zdHIuaCIKKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorI2luY2x1ZGUgImttcF9pby5oIgorI2luY2x1ZGUgImttcF9zdGF0cy5oIgorI2luY2x1ZGUgImttcF93YWl0X3JlbGVhc2UuaCIKKworI2lmICFLTVBfT1NfRlJFRUJTRCAmJiAhS01QX09TX05FVEJTRAorIyBpbmNsdWRlIDxhbGxvY2EuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPG1hdGguaD4gICAgICAgICAgICAgICAvLyBIVUdFX1ZBTC4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy90aW1lcy5oPgorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisKKyNpZiBLTVBfT1NfTElOVVggJiYgIUtNUF9PU19DTksKKyMgaW5jbHVkZSA8c3lzL3N5c2luZm8uaD4KKyMgaWYgS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KQorLy8gV2Ugc2hvdWxkIHJlYWxseSBpbmNsdWRlIDxmdXRleC5oPiwgYnV0IHRoYXQgY2F1c2VzIGNvbXBhdGliaWxpdHkgcHJvYmxlbXMgb24gZGlmZmVyZW50CisvLyBMaW51eCogT1MgZGlzdHJpYnV0aW9ucyB0aGF0IGVpdGhlciByZXF1aXJlIHRoYXQgeW91IGluY2x1ZGUgKG9yIGJyZWFrIHdoZW4geW91IHRyeSB0byBpbmNsdWRlKQorLy8gPHBjaS90eXBlcy5oPi4KKy8vIFNpbmNlIGFsbCB3ZSBuZWVkIGlzIHRoZSB0d28gbWFjcm9zIGJlbG93ICh3aGljaCBhcmUgcGFydCBvZiB0aGUga2VybmVsIEFCSSwgc28gY2FuJ3QgY2hhbmdlKQorLy8gd2UganVzdCBkZWZpbmUgdGhlIGNvbnN0YW50cyBoZXJlIGFuZCBkb24ndCBpbmNsdWRlIDxmdXRleC5oPgorIyAgaWZuZGVmIEZVVEVYX1dBSVQKKyMgICBkZWZpbmUgRlVURVhfV0FJVCAgICAwCisjICBlbmRpZgorIyAgaWZuZGVmIEZVVEVYX1dBS0UKKyMgICBkZWZpbmUgRlVURVhfV0FLRSAgICAxCisjICBlbmRpZgorIyBlbmRpZgorI2VsaWYgS01QX09TX0RBUldJTgorIyBpbmNsdWRlIDxzeXMvc3lzY3RsLmg+CisjIGluY2x1ZGUgPG1hY2gvbWFjaC5oPgorI2VsaWYgS01QX09TX0ZSRUVCU0QKKyMgaW5jbHVkZSA8cHRocmVhZF9ucC5oPgorI2VuZGlmCisKKworI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RydWN0IGttcF9zeXNfdGltZXIgeworICAgIHN0cnVjdCB0aW1lc3BlYyAgICAgc3RhcnQ7Cit9OworCisvLyBDb252ZXJ0IHRpbWVzcGVjIHRvIG5hbm9zZWNvbmRzLgorI2RlZmluZSBUUzJOUyh0aW1lc3BlYykgKCgodGltZXNwZWMpLnR2X3NlYyAqIDFlOSkgKyAodGltZXNwZWMpLnR2X25zZWMpCisKK3N0YXRpYyBzdHJ1Y3Qga21wX3N5c190aW1lciBfX2ttcF9zeXNfdGltZXJfZGF0YTsKKworI2lmIEtNUF9IQU5ETEVfU0lHTkFMUworICAgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBzaWdfZnVuY190ICkoIGludCApOworICAgIFNUQVRJQ19FRkkyX1dPUktBUk9VTkQgc3RydWN0IHNpZ2FjdGlvbiAgICBfX2ttcF9zaWdobGRyc1sgTlNJRyBdOworICAgIHN0YXRpYyBzaWdzZXRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zaWdzZXQ7CisjZW5kaWYKKworc3RhdGljIGludCBfX2ttcF9pbml0X3J1bnRpbWUgICA9IEZBTFNFOworCitzdGF0aWMgaW50IF9fa21wX2ZvcmtfY291bnQgPSAwOworCitzdGF0aWMgcHRocmVhZF9jb25kYXR0cl90ICBfX2ttcF9zdXNwZW5kX2NvbmRfYXR0cjsKK3N0YXRpYyBwdGhyZWFkX211dGV4YXR0cl90IF9fa21wX3N1c3BlbmRfbXV0ZXhfYXR0cjsKKworc3RhdGljIGttcF9jb25kX2FsaWduX3QgICAgX19rbXBfd2FpdF9jdjsKK3N0YXRpYyBrbXBfbXV0ZXhfYWxpZ25fdCAgIF9fa21wX3dhaXRfbXg7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZmRlZiBERUJVR19TVVNQRU5ECitzdGF0aWMgdm9pZAorX19rbXBfcHJpbnRfY29uZCggY2hhciAqYnVmZmVyLCBrbXBfY29uZF9hbGlnbl90ICpjb25kICkKK3sKKyAgICBLTVBfU05QUklOVEYoIGJ1ZmZlciwgMTI4LCAiKGNvbmQgKGxvY2sgKCVsZCwgJWQpKSwgKGRlc2NyICglcCkpKSIsCisgICAgICAgICAgICAgICAgICAgICAgY29uZC0+Y19jb25kLl9fY19sb2NrLl9fc3RhdHVzLCBjb25kLT5jX2NvbmQuX19jX2xvY2suX19zcGlubG9jaywKKyAgICAgICAgICAgICAgICAgICAgICBjb25kLT5jX2NvbmQuX19jX3dhaXRpbmcgKTsKK30KKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgKCBLTVBfT1NfTElOVVggJiYgS01QX0FGRklOSVRZX1NVUFBPUlRFRCkKKworLyoKKyAqIEFmZmluaXR5IHN1cHBvcnQKKyAqLworCisvKgorICogT24gc29tZSBvZiB0aGUgb2xkZXIgT1MncyB0aGF0IHdlIGJ1aWxkIG9uLCB0aGVzZSBjb25zdGFudHMgYXJlbid0IHByZXNlbnQKKyAqIGluIDxhc20vdW5pc3RkLmg+ICNpbmNsdWRlZCBmcm9tIDxzeXMuc3lzY2FsbC5oPi4gIFRoZXkgbXVzdCBiZSB0aGUgc2FtZSBvbgorICogYWxsIHN5c3RlbXMgb2YgdGhlIHNhbWUgYXJjaCB3aGVyZSB0aGV5IGFyZSBkZWZpbmVkLCBhbmQgdGhleSBjYW5ub3QgY2hhbmdlLgorICogc3RvbmUgZm9yZXZlci4KKyAqLworCisjICBpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfQVJNCisjICAgaWZuZGVmIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkKKyMgICAgZGVmaW5lIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkgIDI0MQorIyAgIGVsaWYgX19OUl9zY2hlZF9zZXRhZmZpbml0eSAhPSAyNDEKKyMgICAgZXJyb3IgV3JvbmcgY29kZSBmb3Igc2V0YWZmaW5pdHkgc3lzdGVtIGNhbGwuCisjICAgZW5kaWYgLyogX19OUl9zY2hlZF9zZXRhZmZpbml0eSAqLworIyAgIGlmbmRlZiBfX05SX3NjaGVkX2dldGFmZmluaXR5CisjICAgIGRlZmluZSBfX05SX3NjaGVkX2dldGFmZmluaXR5ICAyNDIKKyMgICBlbGlmIF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHkgIT0gMjQyCisjICAgIGVycm9yIFdyb25nIGNvZGUgZm9yIGdldGFmZmluaXR5IHN5c3RlbSBjYWxsLgorIyAgIGVuZGlmIC8qIF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHkgKi8KKworIyAgZWxpZiBLTVBfQVJDSF9BQVJDSDY0CisjICAgaWZuZGVmIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkKKyMgICAgZGVmaW5lIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkgIDEyMgorIyAgIGVsaWYgX19OUl9zY2hlZF9zZXRhZmZpbml0eSAhPSAxMjIKKyMgICAgZXJyb3IgV3JvbmcgY29kZSBmb3Igc2V0YWZmaW5pdHkgc3lzdGVtIGNhbGwuCisjICAgZW5kaWYgLyogX19OUl9zY2hlZF9zZXRhZmZpbml0eSAqLworIyAgIGlmbmRlZiBfX05SX3NjaGVkX2dldGFmZmluaXR5CisjICAgIGRlZmluZSBfX05SX3NjaGVkX2dldGFmZmluaXR5ICAxMjMKKyMgICBlbGlmIF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHkgIT0gMTIzCisjICAgIGVycm9yIFdyb25nIGNvZGUgZm9yIGdldGFmZmluaXR5IHN5c3RlbSBjYWxsLgorIyAgIGVuZGlmIC8qIF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHkgKi8KKworIyAgZWxpZiBLTVBfQVJDSF9YODZfNjQKKyMgICBpZm5kZWYgX19OUl9zY2hlZF9zZXRhZmZpbml0eQorIyAgICBkZWZpbmUgX19OUl9zY2hlZF9zZXRhZmZpbml0eSAgMjAzCisjICAgZWxpZiBfX05SX3NjaGVkX3NldGFmZmluaXR5ICE9IDIwMworIyAgICBlcnJvciBXcm9uZyBjb2RlIGZvciBzZXRhZmZpbml0eSBzeXN0ZW0gY2FsbC4KKyMgICBlbmRpZiAvKiBfX05SX3NjaGVkX3NldGFmZmluaXR5ICovCisjICAgaWZuZGVmIF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHkKKyMgICAgZGVmaW5lIF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHkgIDIwNAorIyAgIGVsaWYgX19OUl9zY2hlZF9nZXRhZmZpbml0eSAhPSAyMDQKKyMgICAgZXJyb3IgV3JvbmcgY29kZSBmb3IgZ2V0YWZmaW5pdHkgc3lzdGVtIGNhbGwuCisjICAgZW5kaWYgLyogX19OUl9zY2hlZF9nZXRhZmZpbml0eSAqLworCisjICBlbGlmIEtNUF9BUkNIX1BQQzY0CisjICAgaWZuZGVmIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkKKyMgICAgZGVmaW5lIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkgIDIyMgorIyAgIGVsaWYgX19OUl9zY2hlZF9zZXRhZmZpbml0eSAhPSAyMjIKKyMgICAgZXJyb3IgV3JvbmcgY29kZSBmb3Igc2V0YWZmaW5pdHkgc3lzdGVtIGNhbGwuCisjICAgZW5kaWYgLyogX19OUl9zY2hlZF9zZXRhZmZpbml0eSAqLworIyAgIGlmbmRlZiBfX05SX3NjaGVkX2dldGFmZmluaXR5CisjICAgIGRlZmluZSBfX05SX3NjaGVkX2dldGFmZmluaXR5ICAyMjMKKyMgICBlbGlmIF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHkgIT0gMjIzCisjICAgIGVycm9yIFdyb25nIGNvZGUgZm9yIGdldGFmZmluaXR5IHN5c3RlbSBjYWxsLgorIyAgIGVuZGlmIC8qIF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHkgKi8KKworCisjICBlbHNlCisjICAgZXJyb3IgVW5rbm93biBvciB1bnN1cHBvcnRlZCBhcmNoaXRlY3R1cmUKKworIyAgZW5kaWYgLyogS01QX0FSQ0hfKiAqLworCitpbnQKK19fa21wX3NldF9zeXN0ZW1fYWZmaW5pdHkoIGttcF9hZmZpbl9tYXNrX3QgY29uc3QgKm1hc2ssIGludCBhYm9ydF9vbl9lcnJvciApCit7CisgICAgS01QX0FTU0VSVDIoS01QX0FGRklOSVRZX0NBUEFCTEUoKSwKKyAgICAgICJJbGxlZ2FsIHNldCBhZmZpbml0eSBvcGVyYXRpb24gd2hlbiBub3QgY2FwYWJsZSIpOworI2lmIEtNUF9VU0VfSFdMT0MKKyAgICBpbnQgcmV0dmFsID0gaHdsb2Nfc2V0X2NwdWJpbmQoX19rbXBfaHdsb2NfdG9wb2xvZ3ksIChod2xvY19jcHVzZXRfdCltYXNrLCBIV0xPQ19DUFVCSU5EX1RIUkVBRCk7CisjZWxzZQorICAgIGludCByZXR2YWwgPSBzeXNjYWxsKCBfX05SX3NjaGVkX3NldGFmZmluaXR5LCAwLCBfX2ttcF9hZmZpbl9tYXNrX3NpemUsIG1hc2sgKTsKKyNlbmRpZgorICAgIGlmIChyZXR2YWwgPj0gMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaW50IGVycm9yID0gZXJybm87CisgICAgaWYgKGFib3J0X29uX2Vycm9yKSB7CisgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgIEtNUF9NU0coIEZhdGFsU3lzRXJyb3IgKSwKKyAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICApOworICAgIH0KKyAgICByZXR1cm4gZXJyb3I7Cit9CisKK2ludAorX19rbXBfZ2V0X3N5c3RlbV9hZmZpbml0eSgga21wX2FmZmluX21hc2tfdCAqbWFzaywgaW50IGFib3J0X29uX2Vycm9yICkKK3sKKyAgICBLTVBfQVNTRVJUMihLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpLAorICAgICAgIklsbGVnYWwgZ2V0IGFmZmluaXR5IG9wZXJhdGlvbiB3aGVuIG5vdCBjYXBhYmxlIik7CisKKyNpZiBLTVBfVVNFX0hXTE9DCisgICAgaW50IHJldHZhbCA9IGh3bG9jX2dldF9jcHViaW5kKF9fa21wX2h3bG9jX3RvcG9sb2d5LCAoaHdsb2NfY3B1c2V0X3QpbWFzaywgSFdMT0NfQ1BVQklORF9USFJFQUQpOworI2Vsc2UKKyAgICBpbnQgcmV0dmFsID0gc3lzY2FsbCggX19OUl9zY2hlZF9nZXRhZmZpbml0eSwgMCwgX19rbXBfYWZmaW5fbWFza19zaXplLCBtYXNrICk7CisjZW5kaWYKKyAgICBpZiAocmV0dmFsID49IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGludCBlcnJvciA9IGVycm5vOworICAgIGlmIChhYm9ydF9vbl9lcnJvcikgeworICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICBLTVBfTVNHKCBGYXRhbFN5c0Vycm9yICksCisgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgKTsKKyAgICB9CisgICAgcmV0dXJuIGVycm9yOworfQorCit2b2lkCitfX2ttcF9hZmZpbml0eV9iaW5kX3RocmVhZCggaW50IHdoaWNoICkKK3sKKyAgICBLTVBfQVNTRVJUMihLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpLAorICAgICAgIklsbGVnYWwgc2V0IGFmZmluaXR5IG9wZXJhdGlvbiB3aGVuIG5vdCBjYXBhYmxlIik7CisKKyAgICBrbXBfYWZmaW5fbWFza190ICptYXNrOworICAgIEtNUF9DUFVfQUxMT0NfT05fU1RBQ0sobWFzayk7CisgICAgS01QX0NQVV9aRVJPKG1hc2spOworICAgIEtNUF9DUFVfU0VUKHdoaWNoLCBtYXNrKTsKKyAgICBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KG1hc2ssIFRSVUUpOworICAgIEtNUF9DUFVfRlJFRV9GUk9NX1NUQUNLKG1hc2spOworfQorCisvKgorICogRGV0ZXJtaW5lIGlmIHdlIGNhbiBhY2Nlc3MgYWZmaW5pdHkgZnVuY3Rpb25hbGl0eSBvbiB0aGlzIHZlcnNpb24gb2YKKyAqIExpbnV4KiBPUyBieSBjaGVja2luZyBfX05SX3NjaGVkX3tnZXQsc2V0fWFmZmluaXR5IHN5c3RlbSBjYWxscywgYW5kIHNldAorICogX19rbXBfYWZmaW5fbWFza19zaXplIHRvIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZSAoMCBtZWFucyBub3QgY2FwYWJsZSkuCisgKi8KK3ZvaWQKK19fa21wX2FmZmluaXR5X2RldGVybWluZV9jYXBhYmxlKGNvbnN0IGNoYXIgKmVudl92YXIpCit7CisgICAgLy8KKyAgICAvLyBDaGVjayBhbmQgc2VlIGlmIHRoZSBPUyBzdXBwb3J0cyB0aHJlYWQgYWZmaW5pdHkuCisgICAgLy8KKworIyBkZWZpbmUgS01QX0NQVV9TRVRfU0laRV9MSU1JVCAgICAgICAgICAoMTAyNCoxMDI0KQorCisgICAgaW50IGdDb2RlOworICAgIGludCBzQ29kZTsKKyAgICBrbXBfYWZmaW5fbWFza190ICpidWY7CisgICAgYnVmID0gKCBrbXBfYWZmaW5fbWFza190ICogKSBLTVBfSU5URVJOQUxfTUFMTE9DKCBLTVBfQ1BVX1NFVF9TSVpFX0xJTUlUICk7CisKKyAgICAvLyBJZiBMaW51eCogT1M6CisgICAgLy8gSWYgdGhlIHN5c2NhbGwgZmFpbHMgb3IgcmV0dXJucyBhIHN1Z2dlc3Rpb24gZm9yIHRoZSBzaXplLAorICAgIC8vIHRoZW4gd2UgZG9uJ3QgaGF2ZSB0byBzZWFyY2ggZm9yIGFuIGFwcHJvcHJpYXRlIHNpemUuCisgICAgZ0NvZGUgPSBzeXNjYWxsKCBfX05SX3NjaGVkX2dldGFmZmluaXR5LCAwLCBLTVBfQ1BVX1NFVF9TSVpFX0xJTUlULCBidWYgKTsKKyAgICBLQV9UUkFDRSgzMCwgKCAiX19rbXBfYWZmaW5pdHlfZGV0ZXJtaW5lX2NhcGFibGU6ICIKKyAgICAgICAiaW5pdGlhbCBnZXRhZmZpbml0eSBjYWxsIHJldHVybmVkICVkIGVycm5vID0gJWRcbiIsCisgICAgICAgZ0NvZGUsIGVycm5vKSk7CisKKyAgICAvL2lmICgoZ0NvZGUgPCAwKSAmJiAoZXJybm8gPT0gRU5PU1lTKSkKKyAgICBpZiAoZ0NvZGUgPCAwKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIFN5c3RlbSBjYWxsIG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgLy8KKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgKF9fa21wX2FmZmluaXR5X3dhcm5pbmdzCisgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkKKyAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9kZWZhdWx0KQorICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X2Rpc2FibGVkKSkpIHsKKyAgICAgICAgICAgIGludCBlcnJvciA9IGVycm5vOworICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgIGttcF9tc193YXJuaW5nLAorICAgICAgICAgICAgICAgIEtNUF9NU0coIEdldEFmZlN5c0NhbGxOb3RTdXBwb3J0ZWQsIGVudl92YXIgKSwKKyAgICAgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICApOworICAgICAgICB9CisgICAgICAgIEtNUF9BRkZJTklUWV9ESVNBQkxFKCk7CisgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKGJ1Zik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGdDb2RlID4gMCkgeyAvLyBMaW51eCogT1Mgb25seQorICAgICAgICAvLyBUaGUgb3B0aW1hbCBzaXR1YXRpb246IHRoZSBPUyByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBidWZmZXIKKyAgICAgICAgLy8gaXQgZXhwZWN0cy4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gQSB2ZXJpZmljYXRpb24gb2YgY29ycmVjdCBiZWhhdmlvciBpcyB0aGF0IElzZXRhZmZpbml0eSBvbiBhIE5VTEwKKyAgICAgICAgLy8gYnVmZmVyIHdpdGggdGhlIHNhbWUgc2l6ZSBmYWlscyB3aXRoIGVycm5vIHNldCB0byBFRkFVTFQuCisgICAgICAgIHNDb2RlID0gc3lzY2FsbCggX19OUl9zY2hlZF9zZXRhZmZpbml0eSwgMCwgZ0NvZGUsIE5VTEwgKTsKKyAgICAgICAgS0FfVFJBQ0UoMzAsICggIl9fa21wX2FmZmluaXR5X2RldGVybWluZV9jYXBhYmxlOiAiCisgICAgICAgICAgICJzZXRhZmZpbml0eSBmb3IgbWFzayBzaXplICVkIHJldHVybmVkICVkIGVycm5vID0gJWRcbiIsCisgICAgICAgICAgIGdDb2RlLCBzQ29kZSwgZXJybm8pKTsKKyAgICAgICAgaWYgKHNDb2RlIDwgMCkgeworICAgICAgICAgICAgaWYgKGVycm5vID09IEVOT1NZUykgeworICAgICAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IChfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkKKyAgICAgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X2RlZmF1bHQpCisgICAgICAgICAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9kaXNhYmxlZCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBlcnJvciA9IGVycm5vOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbXNfd2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIFNldEFmZlN5c0NhbGxOb3RTdXBwb3J0ZWQsIGVudl92YXIgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBLTVBfQUZGSU5JVFlfRElTQUJMRSgpOworICAgICAgICAgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKGJ1Zik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZXJybm8gPT0gRUZBVUxUKSB7CisgICAgICAgICAgICAgICAgS01QX0FGRklOSVRZX0VOQUJMRShnQ29kZSk7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMTAsICggIl9fa21wX2FmZmluaXR5X2RldGVybWluZV9jYXBhYmxlOiAiCisgICAgICAgICAgICAgICAgICAiYWZmaW5pdHkgc3VwcG9ydGVkIChtYXNrIHNpemUgJWQpXG4iLAorICAgICAgICAgICAgICAgICAgKGludClfX2ttcF9hZmZpbl9tYXNrX3NpemUpKTsKKyAgICAgICAgICAgICAgICBLTVBfSU5URVJOQUxfRlJFRShidWYpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vCisgICAgLy8gQ2FsbCB0aGUgZ2V0YWZmaW5pdHkgc3lzdGVtIGNhbGwgcmVwZWF0ZWRseSB3aXRoIGluY3JlYXNpbmcgc2V0IHNpemVzCisgICAgLy8gdW50aWwgd2Ugc3VjY2VlZCwgb3IgcmVhY2ggYW4gdXBwZXIgYm91bmQgb24gdGhlIHNlYXJjaC4KKyAgICAvLworICAgIEtBX1RSQUNFKDMwLCAoICJfX2ttcF9hZmZpbml0eV9kZXRlcm1pbmVfY2FwYWJsZTogIgorICAgICAgInNlYXJjaGluZyBmb3IgcHJvcGVyIHNldCBzaXplXG4iKSk7CisgICAgaW50IHNpemU7CisgICAgZm9yIChzaXplID0gMTsgc2l6ZSA8PSBLTVBfQ1BVX1NFVF9TSVpFX0xJTUlUOyBzaXplICo9IDIpIHsKKyAgICAgICAgZ0NvZGUgPSBzeXNjYWxsKCBfX05SX3NjaGVkX2dldGFmZmluaXR5LCAwLCAgc2l6ZSwgYnVmICk7CisgICAgICAgIEtBX1RSQUNFKDMwLCAoICJfX2ttcF9hZmZpbml0eV9kZXRlcm1pbmVfY2FwYWJsZTogIgorICAgICAgICAgICJnZXRhZmZpbml0eSBmb3IgbWFzayBzaXplICVkIHJldHVybmVkICVkIGVycm5vID0gJWRcbiIsIHNpemUsCisgICAgICAgICAgICBnQ29kZSwgZXJybm8pKTsKKworICAgICAgICBpZiAoZ0NvZGUgPCAwKSB7CisgICAgICAgICAgICBpZiAoIGVycm5vID09IEVOT1NZUyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBXZSBzaG91bGRuJ3QgZ2V0IGhlcmUKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIEtBX1RSQUNFKDMwLCAoICJfX2ttcF9hZmZpbml0eV9kZXRlcm1pbmVfY2FwYWJsZTogIgorICAgICAgICAgICAgICAgICAgImluY29uc2lzdGVudCBPUyBjYWxsIGJlaGF2aW9yOiBlcnJubyA9PSBFTk9TWVMgZm9yIG1hc2sgc2l6ZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBzaXplKSk7CisgICAgICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgKF9fa21wX2FmZmluaXR5X3dhcm5pbmdzCisgICAgICAgICAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9ub25lKQorICAgICAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfZGVmYXVsdCkKKyAgICAgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X2Rpc2FibGVkKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yID0gZXJybm87CisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAgICAgIGttcF9tc193YXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgS01QX01TRyggR2V0QWZmU3lzQ2FsbE5vdFN1cHBvcnRlZCwgZW52X3ZhciApLAorICAgICAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEtNUF9BRkZJTklUWV9ESVNBQkxFKCk7CisgICAgICAgICAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoYnVmKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHNDb2RlID0gc3lzY2FsbCggX19OUl9zY2hlZF9zZXRhZmZpbml0eSwgMCwgZ0NvZGUsIE5VTEwgKTsKKyAgICAgICAgS0FfVFJBQ0UoMzAsICggIl9fa21wX2FmZmluaXR5X2RldGVybWluZV9jYXBhYmxlOiAiCisgICAgICAgICAgICJzZXRhZmZpbml0eSBmb3IgbWFzayBzaXplICVkIHJldHVybmVkICVkIGVycm5vID0gJWRcbiIsCisgICAgICAgICAgIGdDb2RlLCBzQ29kZSwgZXJybm8pKTsKKyAgICAgICAgaWYgKHNDb2RlIDwgMCkgeworICAgICAgICAgICAgaWYgKGVycm5vID09IEVOT1NZUykgeyAvLyBMaW51eCogT1Mgb25seQorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gV2Ugc2hvdWxkbid0IGdldCBoZXJlCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBLQV9UUkFDRSgzMCwgKCAiX19rbXBfYWZmaW5pdHlfZGV0ZXJtaW5lX2NhcGFibGU6ICIKKyAgICAgICAgICAgICAgICAgICJpbmNvbnNpc3RlbnQgT1MgY2FsbCBiZWhhdmlvcjogZXJybm8gPT0gRU5PU1lTIGZvciBtYXNrIHNpemUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgc2l6ZSkpOworICAgICAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IChfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkKKyAgICAgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X2RlZmF1bHQpCisgICAgICAgICAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9kaXNhYmxlZCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBlcnJvciA9IGVycm5vOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbXNfd2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIFNldEFmZlN5c0NhbGxOb3RTdXBwb3J0ZWQsIGVudl92YXIgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBLTVBfQUZGSU5JVFlfRElTQUJMRSgpOworICAgICAgICAgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKGJ1Zik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVycm5vID09IEVGQVVMVCkgeworICAgICAgICAgICAgICAgIEtNUF9BRkZJTklUWV9FTkFCTEUoZ0NvZGUpOworICAgICAgICAgICAgICAgIEtBX1RSQUNFKDEwLCAoICJfX2ttcF9hZmZpbml0eV9kZXRlcm1pbmVfY2FwYWJsZTogIgorICAgICAgICAgICAgICAgICAgImFmZmluaXR5IHN1cHBvcnRlZCAobWFzayBzaXplICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAoaW50KV9fa21wX2FmZmluX21hc2tfc2l6ZSkpOworICAgICAgICAgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKGJ1Zik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8vaW50IGVycm9yID0gZXJybm87ICAvLyBzYXZlIHVuY2F1Z2h0IGVycm9yIGNvZGUKKyAgICBLTVBfSU5URVJOQUxfRlJFRShidWYpOworICAgIC8vIGVycm5vID0gZXJyb3I7ICAvLyByZXN0b3JlIHVuY2F1Z2h0IGVycm9yIGNvZGUsIHdpbGwgYmUgcHJpbnRlZCBhdCB0aGUgbmV4dCBLTVBfV0FSTklORyBiZWxvdworCisgICAgLy8KKyAgICAvLyBBZmZpbml0eSBpcyBub3Qgc3VwcG9ydGVkCisgICAgLy8KKyAgICBLTVBfQUZGSU5JVFlfRElTQUJMRSgpOworICAgIEtBX1RSQUNFKDEwLCAoICJfX2ttcF9hZmZpbml0eV9kZXRlcm1pbmVfY2FwYWJsZTogIgorICAgICAgImNhbm5vdCBkZXRlcm1pbmUgbWFzayBzaXplIC0gYWZmaW5pdHkgbm90IHN1cHBvcnRlZFxuIikpOworICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IChfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkKKyAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X2RlZmF1bHQpCisgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9kaXNhYmxlZCkpKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZDYW50R2V0TWFza1NpemUsIGVudl92YXIgKTsKKyAgICB9Cit9CisKKyNlbmRpZiAvLyBLTVBfT1NfTElOVVggJiYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KSAmJiAhS01QX09TX0NOSworCitpbnQKK19fa21wX2Z1dGV4X2RldGVybWluZV9jYXBhYmxlKCkKK3sKKyAgICBpbnQgbG9jID0gMDsKKyAgICBpbnQgcmMgPSBzeXNjYWxsKCBfX05SX2Z1dGV4LCAmbG9jLCBGVVRFWF9XQUtFLCAxLCBOVUxMLCBOVUxMLCAwICk7CisgICAgaW50IHJldHZhbCA9ICggcmMgPT0gMCApIHx8ICggZXJybm8gIT0gRU5PU1lTICk7CisKKyAgICBLQV9UUkFDRSgxMCwgKCAiX19rbXBfZnV0ZXhfZGV0ZXJtaW5lX2NhcGFibGU6IHJjID0gJWQgZXJybm8gPSAlZFxuIiwgcmMsCisgICAgICBlcnJubyApICk7CisgICAgS0FfVFJBQ0UoMTAsICggIl9fa21wX2Z1dGV4X2RldGVybWluZV9jYXBhYmxlOiBmdXRleCBzeXNjYWxsJXMgc3VwcG9ydGVkXG4iLAorICAgICAgICByZXR2YWwgPyAiIiA6ICIgbm90IiApICk7CisKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisjZW5kaWYgLy8gS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSkgJiYgIUtNUF9PU19DTksKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0KSAmJiAoISBLTVBfQVNNX0lOVFJJTlMpCisvKgorICogT25seSAzMi1iaXQgImFkZC1leGNoYW5nZSIgaW5zdHJ1Y3Rpb24gb24gSUEtMzIgYXJjaGl0ZWN0dXJlIGNhdXNlcyB1cyB0bworICogdXNlIGNvbXBhcmVfYW5kX3N0b3JlIGZvciB0aGVzZSByb3V0aW5lcworICovCisKK2ttcF9pbnQ4CitfX2ttcF90ZXN0X3RoZW5fb3I4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggZCApCit7CisgICAga21wX2ludDggb2xkX3ZhbHVlLCBuZXdfdmFsdWU7CisKKyAgICBvbGRfdmFsdWUgPSBUQ1JfMSggKnAgKTsKKyAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgfCBkOworCisgICAgd2hpbGUgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUw4ICggcCwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUgKSApCisgICAgeworICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgIG9sZF92YWx1ZSA9IFRDUl8xKCAqcCApOworICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgfCBkOworICAgIH0KKyAgICByZXR1cm4gb2xkX3ZhbHVlOworfQorCitrbXBfaW50OAorX19rbXBfdGVzdF90aGVuX2FuZDgoIHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCBkICkKK3sKKyAgICBrbXBfaW50OCBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworICAgIG9sZF92YWx1ZSA9IFRDUl8xKCAqcCApOworICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSAmIGQ7CisKKyAgICB3aGlsZSAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDggKCBwLCBvbGRfdmFsdWUsIG5ld192YWx1ZSApICkKKyAgICB7CisgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgb2xkX3ZhbHVlID0gVENSXzEoICpwICk7CisgICAgICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSAmIGQ7CisgICAgfQorICAgIHJldHVybiBvbGRfdmFsdWU7Cit9CisKK2ttcF9pbnQzMgorX19rbXBfdGVzdF90aGVuX29yMzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGQgKQoreworICAgIGttcF9pbnQzMiBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworICAgIG9sZF92YWx1ZSA9IFRDUl80KCAqcCApOworICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSB8IGQ7CisKKyAgICB3aGlsZSAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDMyICggcCwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUgKSApCisgICAgeworICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgIG9sZF92YWx1ZSA9IFRDUl80KCAqcCApOworICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgfCBkOworICAgIH0KKyAgICByZXR1cm4gb2xkX3ZhbHVlOworfQorCitrbXBfaW50MzIKK19fa21wX3Rlc3RfdGhlbl9hbmQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgZCApCit7CisgICAga21wX2ludDMyIG9sZF92YWx1ZSwgbmV3X3ZhbHVlOworCisgICAgb2xkX3ZhbHVlID0gVENSXzQoICpwICk7CisgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlICYgZDsKKworICAgIHdoaWxlICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMMzIgKCBwLCBvbGRfdmFsdWUsIG5ld192YWx1ZSApICkKKyAgICB7CisgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgb2xkX3ZhbHVlID0gVENSXzQoICpwICk7CisgICAgICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSAmIGQ7CisgICAgfQorICAgIHJldHVybiBvbGRfdmFsdWU7Cit9CisKKyMgaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1BQQzY0IHx8IEtNUF9BUkNIX0FBUkNINjQKK2ttcF9pbnQ4CitfX2ttcF90ZXN0X3RoZW5fYWRkOCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGQgKQoreworICAgIGttcF9pbnQ4IG9sZF92YWx1ZSwgbmV3X3ZhbHVlOworCisgICAgb2xkX3ZhbHVlID0gVENSXzEoICpwICk7CisgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlICsgZDsKKworICAgIHdoaWxlICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMOCAoIHAsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlICkgKQorICAgIHsKKyAgICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgICAgICBvbGRfdmFsdWUgPSBUQ1JfMSggKnAgKTsKKyAgICAgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlICsgZDsKKyAgICB9CisgICAgcmV0dXJuIG9sZF92YWx1ZTsKK30KKwora21wX2ludDY0CitfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGQgKQoreworICAgIGttcF9pbnQ2NCBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworICAgIG9sZF92YWx1ZSA9IFRDUl84KCAqcCApOworICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSArIGQ7CisKKyAgICB3aGlsZSAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDY0ICggcCwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUgKSApCisgICAgeworICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgIG9sZF92YWx1ZSA9IFRDUl84KCAqcCApOworICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgKyBkOworICAgIH0KKyAgICByZXR1cm4gb2xkX3ZhbHVlOworfQorIyBlbmRpZiAvKiBLTVBfQVJDSF9YODYgKi8KKwora21wX2ludDY0CitfX2ttcF90ZXN0X3RoZW5fb3I2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgZCApCit7CisgICAga21wX2ludDY0IG9sZF92YWx1ZSwgbmV3X3ZhbHVlOworCisgICAgb2xkX3ZhbHVlID0gVENSXzgoICpwICk7CisgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlIHwgZDsKKyAgICB3aGlsZSAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDY0ICggcCwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUgKSApCisgICAgeworICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgIG9sZF92YWx1ZSA9IFRDUl84KCAqcCApOworICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgfCBkOworICAgIH0KKyAgICByZXR1cm4gb2xkX3ZhbHVlOworfQorCitrbXBfaW50NjQKK19fa21wX3Rlc3RfdGhlbl9hbmQ2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgZCApCit7CisgICAga21wX2ludDY0IG9sZF92YWx1ZSwgbmV3X3ZhbHVlOworCisgICAgb2xkX3ZhbHVlID0gVENSXzgoICpwICk7CisgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlICYgZDsKKyAgICB3aGlsZSAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDY0ICggcCwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUgKSApCisgICAgeworICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgIG9sZF92YWx1ZSA9IFRDUl84KCAqcCApOworICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgJiBkOworICAgIH0KKyAgICByZXR1cm4gb2xkX3ZhbHVlOworfQorCisjZW5kaWYgLyogKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQpICYmICghIEtNUF9BU01fSU5UUklOUykgKi8KKwordm9pZAorX19rbXBfdGVybWluYXRlX3RocmVhZCggaW50IGd0aWQgKQoreworICAgIGludCBzdGF0dXM7CisgICAga21wX2luZm9fdCAgKnRoID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworCisgICAgaWYgKCAhdGggKSByZXR1cm47CisKKyAgICAjaWZkZWYgS01QX0NBTkNFTF9USFJFQURTCisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF90ZXJtaW5hdGVfdGhyZWFkOiBraWxsICglZClcbiIsIGd0aWQgKSApOworICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2NhbmNlbCggdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkICk7CisgICAgICAgIGlmICggc3RhdHVzICE9IDAgJiYgc3RhdHVzICE9IEVTUkNIICkgeworICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50VGVybWluYXRlV29ya2VyVGhyZWFkICksCisgICAgICAgICAgICAgICAgS01QX0VSUiggc3RhdHVzICksCisgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICk7CisgICAgICAgIH07IC8vIGlmCisgICAgI2VuZGlmCisgICAgX19rbXBfeWllbGQoIFRSVUUgKTsKK30gLy8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIFNldCB0aHJlYWQgc3RhY2sgaW5mbyBhY2NvcmRpbmcgdG8gdmFsdWVzIHJldHVybmVkIGJ5CisgKiBwdGhyZWFkX2dldGF0dHJfbnAoKS4KKyAqIElmIHZhbHVlcyBhcmUgdW5yZWFzb25hYmxlLCBhc3N1bWUgY2FsbCBmYWlsZWQgYW5kIHVzZQorICogaW5jcmVtZW50YWwgc3RhY2sgcmVmaW5lbWVudCBtZXRob2QgaW5zdGVhZC4KKyAqIFJldHVybnMgVFJVRSBpZiB0aGUgc3RhY2sgcGFyYW1ldGVycyBjb3VsZCBiZSBkZXRlcm1pbmVkIGV4YWN0bHksCisgKiBGQUxTRSBpZiBpbmNyZW1lbnRhbCByZWZpbmVtZW50IGlzIG5lY2Vzc2FyeS4KKyAqLworc3RhdGljIGttcF9pbnQzMgorX19rbXBfc2V0X3N0YWNrX2luZm8oIGludCBndGlkLCBrbXBfaW5mb190ICp0aCApCit7CisgICAgaW50ICAgICAgICAgICAgc3RhY2tfZGF0YTsKKyNpZiBLTVBfT1NfTElOVVggfHwgS01QX09TX0ZSRUVCU0QgfHwgS01QX09TX05FVEJTRAorICAgIC8qIExpbnV4KiBPUyBvbmx5IC0tIG5vIHB0aHJlYWRfZ2V0YXR0cl9ucCBzdXBwb3J0IG9uIE9TIFgqICovCisgICAgcHRocmVhZF9hdHRyX3QgYXR0cjsKKyAgICBpbnQgICAgICAgICAgICBzdGF0dXM7CisgICAgc2l6ZV90ICAgICAgICAgc2l6ZSA9IDA7CisgICAgdm9pZCAqICAgICAgICAgYWRkciA9IDA7CisKKyAgICAvKiBBbHdheXMgZG8gaW5jcmVtZW50YWwgc3RhY2sgcmVmaW5lbWVudCBmb3IgdWJlcm1hc3RlciB0aHJlYWRzIHNpbmNlIHRoZSBpbml0aWFsCisgICAgICAgdGhyZWFkIHN0YWNrIHJhbmdlIGNhbiBiZSByZWR1Y2VkIGJ5IHNpYmxpbmcgdGhyZWFkIGNyZWF0aW9uIHNvIHB0aHJlYWRfYXR0cl9nZXRzdGFjaworICAgICAgIG1heSBjYXVzZSB0aHJlYWQgZ3RpZCBhbGlhc2luZyAqLworICAgIGlmICggISBLTVBfVUJFUl9HVElEKGd0aWQpICkgeworCisgICAgICAgIC8qIEZldGNoIHRoZSByZWFsIHRocmVhZCBhdHRyaWJ1dGVzICovCisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfYXR0cl9pbml0KCAmYXR0ciApOworICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfYXR0cl9pbml0Iiwgc3RhdHVzICk7CisjaWYgS01QX09TX0ZSRUVCU0QgfHwgS01QX09TX05FVEJTRAorICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2F0dHJfZ2V0X25wKCBwdGhyZWFkX3NlbGYoKSwgJmF0dHIgKTsKKyAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX2F0dHJfZ2V0X25wIiwgc3RhdHVzICk7CisjZWxzZQorICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2dldGF0dHJfbnAoIHB0aHJlYWRfc2VsZigpLCAmYXR0ciApOworICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfZ2V0YXR0cl9ucCIsIHN0YXR1cyApOworI2VuZGlmCisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfYXR0cl9nZXRzdGFjayggJmF0dHIsICZhZGRyLCAmc2l6ZSApOworICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfYXR0cl9nZXRzdGFjayIsIHN0YXR1cyApOworICAgICAgICBLQV9UUkFDRSggNjAsICggIl9fa21wX3NldF9zdGFja19pbmZvOiBUIyVkIHB0aHJlYWRfYXR0cl9nZXRzdGFjayByZXR1cm5lZCBzaXplOiAlbHUsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJsb3cgYWRkcjogJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCBzaXplLCBhZGRyICkpOworCisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfYXR0cl9kZXN0cm95KCAmYXR0ciApOworICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfYXR0cl9kZXN0cm95Iiwgc3RhdHVzICk7CisgICAgfQorCisgICAgaWYgKCBzaXplICE9IDAgJiYgYWRkciAhPSAwICkgeyAgICAgLyogd2FzIHN0YWNrIHBhcmFtZXRlciBkZXRlcm1pbmF0aW9uIHN1Y2Nlc3NmdWw/ICovCisgICAgICAgIC8qIFN0b3JlIHRoZSBjb3JyZWN0IGJhc2UgYW5kIHNpemUgKi8KKyAgICAgICAgVENXX1BUUih0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja2Jhc2UsICgoKGNoYXIgKilhZGRyKSArIHNpemUpKTsKKyAgICAgICAgVENXX1BUUih0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja3NpemUsIHNpemUpOworICAgICAgICBUQ1dfNCh0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja2dyb3csIEZBTFNFKTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorI2VuZGlmIC8qIEtNUF9PU19MSU5VWCB8fCBLTVBfT1NfRlJFRUJTRCB8fCBLTVBfT1NfTkVUQlNEICovCisgICAgLyogVXNlIGluY3JlbWVudGFsIHJlZmluZW1lbnQgc3RhcnRpbmcgZnJvbSBpbml0aWFsIGNvbnNlcnZhdGl2ZSBlc3RpbWF0ZSAqLworICAgIFRDV19QVFIodGgtPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tzaXplLCAwKTsKKyAgICBUQ1dfUFRSKHRoIC0+IHRoLnRoX2luZm8uZHMuZHNfc3RhY2tiYXNlLCAmc3RhY2tfZGF0YSk7CisgICAgVENXXzQodGgtPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tncm93LCBUUlVFKTsKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyB2b2lkKgorX19rbXBfbGF1bmNoX3dvcmtlciggdm9pZCAqdGhyICkKK3sKKyAgICBpbnQgc3RhdHVzLCBvbGRfdHlwZSwgb2xkX3N0YXRlOworI2lmZGVmIEtNUF9CTE9DS19TSUdOQUxTCisgICAgc2lnc2V0X3QgICAgbmV3X3NldCwgb2xkX3NldDsKKyNlbmRpZiAvKiBLTVBfQkxPQ0tfU0lHTkFMUyAqLworICAgIHZvaWQgKmV4aXRfdmFsOworI2lmIEtNUF9PU19MSU5VWCB8fCBLTVBfT1NfRlJFRUJTRCB8fCBLTVBfT1NfTkVUQlNECisgICAgdm9pZCAqIHZvbGF0aWxlIHBhZGRpbmcgPSAwOworI2VuZGlmCisgICAgaW50IGd0aWQ7CisKKyAgICBndGlkID0gKChrbXBfaW5mb190Kil0aHIpIC0+IHRoLnRoX2luZm8uZHMuZHNfZ3RpZDsKKyAgICBfX2ttcF9ndGlkX3NldF9zcGVjaWZpYyggZ3RpZCApOworI2lmZGVmIEtNUF9UREFUQV9HVElECisgICAgX19rbXBfZ3RpZCA9IGd0aWQ7CisjZW5kaWYKKyNpZiBLTVBfU1RBVFNfRU5BQkxFRAorICAgIC8vIHNldCBfX3RocmVhZCBsb2NhbCBpbmRleCB0byBwb2ludCB0byB0aHJlYWQtc3BlY2lmaWMgc3RhdHMKKyAgICBfX2ttcF9zdGF0c190aHJlYWRfcHRyID0gKChrbXBfaW5mb190Kil0aHIpLT50aC50aF9zdGF0czsKKyNlbmRpZgorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF90aHJlYWRfbmFtZSggZ3RpZCApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICBfX2ttcF9hZmZpbml0eV9zZXRfaW5pdF9tYXNrKCBndGlkLCBGQUxTRSApOworI2VuZGlmCisKKyNpZmRlZiBLTVBfQ0FOQ0VMX1RIUkVBRFMKKyAgICBzdGF0dXMgPSBwdGhyZWFkX3NldGNhbmNlbHR5cGUoIFBUSFJFQURfQ0FOQ0VMX0FTWU5DSFJPTk9VUywgJiBvbGRfdHlwZSApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9zZXRjYW5jZWx0eXBlIiwgc3RhdHVzICk7CisgICAgLyogam9zaCB0b2RvOiBpc24ndCBQVEhSRUFEX0NBTkNFTF9FTkFCTEUgZGVmYXVsdCBmb3IgbmV3bHktY3JlYXRlZCB0aHJlYWRzPyAqLworICAgIHN0YXR1cyA9IHB0aHJlYWRfc2V0Y2FuY2Vsc3RhdGUoIFBUSFJFQURfQ0FOQ0VMX0VOQUJMRSwgJiBvbGRfc3RhdGUgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfc2V0Y2FuY2Vsc3RhdGUiLCBzdGF0dXMgKTsKKyNlbmRpZgorCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorICAgIC8vCisgICAgLy8gU2V0IHRoZSBGUCBjb250cm9sIHJlZ3MgdG8gYmUgYSBjb3B5IG9mCisgICAgLy8gdGhlIHBhcmFsbGVsIGluaXRpYWxpemF0aW9uIHRocmVhZCdzLgorICAgIC8vCisgICAgX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZCgpOworICAgIF9fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQoICZfX2ttcF9pbml0X3g4N19mcHVfY29udHJvbF93b3JkICk7CisgICAgX19rbXBfbG9hZF9teGNzciggJl9fa21wX2luaXRfbXhjc3IgKTsKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKyNpZmRlZiBLTVBfQkxPQ0tfU0lHTkFMUworICAgIHN0YXR1cyA9IHNpZ2ZpbGxzZXQoICYgbmV3X3NldCApOworICAgIEtNUF9DSEVDS19TWVNGQUlMX0VSUk5PKCAic2lnZmlsbHNldCIsIHN0YXR1cyApOworICAgIHN0YXR1cyA9IHB0aHJlYWRfc2lnbWFzayggU0lHX0JMT0NLLCAmIG5ld19zZXQsICYgb2xkX3NldCApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9zaWdtYXNrIiwgc3RhdHVzICk7CisjZW5kaWYgLyogS01QX0JMT0NLX1NJR05BTFMgKi8KKworI2lmIEtNUF9PU19MSU5VWCB8fCBLTVBfT1NfRlJFRUJTRCB8fCBLTVBfT1NfTkVUQlNECisgICAgaWYgKCBfX2ttcF9zdGtvZmZzZXQgPiAwICYmIGd0aWQgPiAwICkgeworICAgICAgICBwYWRkaW5nID0gS01QX0FMTE9DQSggZ3RpZCAqIF9fa21wX3N0a29mZnNldCApOworICAgIH0KKyNlbmRpZgorCisgICAgS01QX01CKCk7CisgICAgX19rbXBfc2V0X3N0YWNrX2luZm8oIGd0aWQsIChrbXBfaW5mb190Kil0aHIgKTsKKworICAgIF9fa21wX2NoZWNrX3N0YWNrX292ZXJsYXAoIChrbXBfaW5mb190Kil0aHIgKTsKKworICAgIGV4aXRfdmFsID0gX19rbXBfbGF1bmNoX3RocmVhZCggKGttcF9pbmZvX3QgKikgdGhyICk7CisKKyNpZmRlZiBLTVBfQkxPQ0tfU0lHTkFMUworICAgIHN0YXR1cyA9IHB0aHJlYWRfc2lnbWFzayggU0lHX1NFVE1BU0ssICYgb2xkX3NldCwgTlVMTCApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9zaWdtYXNrIiwgc3RhdHVzICk7CisjZW5kaWYgLyogS01QX0JMT0NLX1NJR05BTFMgKi8KKworICAgIHJldHVybiBleGl0X3ZhbDsKK30KKworCisvKiBUaGUgbW9uaXRvciB0aHJlYWQgY29udHJvbHMgYWxsIG9mIHRoZSB0aHJlYWRzIGluIHRoZSBjb21wbGV4ICovCisKK3N0YXRpYyB2b2lkKgorX19rbXBfbGF1bmNoX21vbml0b3IoIHZvaWQgKnRociApCit7CisgICAgaW50ICAgICAgICAgc3RhdHVzLCBvbGRfdHlwZSwgb2xkX3N0YXRlOworI2lmZGVmIEtNUF9CTE9DS19TSUdOQUxTCisgICAgc2lnc2V0X3QgICAgbmV3X3NldDsKKyNlbmRpZiAvKiBLTVBfQkxPQ0tfU0lHTkFMUyAqLworICAgIHN0cnVjdCB0aW1lc3BlYyAgaW50ZXJ2YWw7CisgICAgaW50IHlpZWxkX2NvdW50OworICAgIGludCB5aWVsZF9jeWNsZXMgPSAwOworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfbGF1bmNoX21vbml0b3I6ICMxIGxhdW5jaGVkXG4iICkgKTsKKworICAgIC8qIHJlZ2lzdGVyIHVzIGFzIHRoZSBtb25pdG9yIHRocmVhZCAqLworICAgIF9fa21wX2d0aWRfc2V0X3NwZWNpZmljKCBLTVBfR1RJRF9NT05JVE9SICk7CisjaWZkZWYgS01QX1REQVRBX0dUSUQKKyAgICBfX2ttcF9ndGlkID0gS01QX0dUSURfTU9OSVRPUjsKKyNlbmRpZgorCisgICAgS01QX01CKCk7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X3RocmVhZF9pZ25vcmUoKTsgICAgLy8gSW5zdHJ1Y3QgSW50ZWwoUikgVGhyZWFkaW5nIFRvb2xzIHRvIGlnbm9yZSBtb25pdG9yIHRocmVhZC4KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICBfX2ttcF9zZXRfc3RhY2tfaW5mbyggKChrbXBfaW5mb190Kil0aHIpLT50aC50aF9pbmZvLmRzLmRzX2d0aWQsIChrbXBfaW5mb190Kil0aHIgKTsKKworICAgIF9fa21wX2NoZWNrX3N0YWNrX292ZXJsYXAoIChrbXBfaW5mb190Kil0aHIgKTsKKworI2lmZGVmIEtNUF9DQU5DRUxfVEhSRUFEUworICAgIHN0YXR1cyA9IHB0aHJlYWRfc2V0Y2FuY2VsdHlwZSggUFRIUkVBRF9DQU5DRUxfQVNZTkNIUk9OT1VTLCAmIG9sZF90eXBlICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX3NldGNhbmNlbHR5cGUiLCBzdGF0dXMgKTsKKyAgICAvKiBqb3NoIHRvZG86IGlzbid0IFBUSFJFQURfQ0FOQ0VMX0VOQUJMRSBkZWZhdWx0IGZvciBuZXdseS1jcmVhdGVkIHRocmVhZHM/ICovCisgICAgc3RhdHVzID0gcHRocmVhZF9zZXRjYW5jZWxzdGF0ZSggUFRIUkVBRF9DQU5DRUxfRU5BQkxFLCAmIG9sZF9zdGF0ZSApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9zZXRjYW5jZWxzdGF0ZSIsIHN0YXR1cyApOworI2VuZGlmCisKKyAgICAjaWYgS01QX1JFQUxfVElNRV9GSVgKKyAgICAvLyBUaGlzIGlzIGEgcG90ZW50aWFsIGZpeCB3aGljaCBhbGxvd3MgYXBwbGljYXRpb24gd2l0aCByZWFsLXRpbWUgc2NoZWR1bGluZyBwb2xpY3kgd29yay4KKyAgICAvLyBIb3dldmVyLCBkZWNpc2lvbiBhYm91dCB0aGUgZml4IGlzIG5vdCBtYWRlIHlldCwgc28gaXQgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4KKyAgICB7IC8vIEFyZSBwcm9ncmFtIHN0YXJ0ZWQgd2l0aCByZWFsLXRpbWUgc2NoZWR1bGluZyBwb2xpY3k/CisgICAgICAgIGludCBzY2hlZCA9IHNjaGVkX2dldHNjaGVkdWxlciggMCApOworICAgICAgICBpZiAoIHNjaGVkID09IFNDSEVEX0ZJRk8gfHwgc2NoZWQgPT0gU0NIRURfUlIgKSB7CisgICAgICAgICAgICAvLyBZZXMsIHdlIGFyZSBhIHBhcnQgb2YgcmVhbC10aW1lIGFwcGxpY2F0aW9uLiBUcnkgdG8gaW5jcmVhc2UgdGhlIHByaW9yaXR5IG9mIHRoZQorICAgICAgICAgICAgLy8gbW9uaXRvci4KKyAgICAgICAgICAgIHN0cnVjdCBzY2hlZF9wYXJhbSBwYXJhbTsKKyAgICAgICAgICAgIGludCAgICBtYXhfcHJpb3JpdHkgPSBzY2hlZF9nZXRfcHJpb3JpdHlfbWF4KCBzY2hlZCApOworICAgICAgICAgICAgaW50ICAgIHJjOworICAgICAgICAgICAgS01QX1dBUk5JTkcoIFJlYWxUaW1lU2NoZWROb3RTdXBwb3J0ZWQgKTsKKyAgICAgICAgICAgIHNjaGVkX2dldHBhcmFtKCAwLCAmIHBhcmFtICk7CisgICAgICAgICAgICBpZiAoIHBhcmFtLnNjaGVkX3ByaW9yaXR5IDwgbWF4X3ByaW9yaXR5ICkgeworICAgICAgICAgICAgICAgIHBhcmFtLnNjaGVkX3ByaW9yaXR5ICs9IDE7CisgICAgICAgICAgICAgICAgcmMgPSBzY2hlZF9zZXRzY2hlZHVsZXIoIDAsIHNjaGVkLCAmIHBhcmFtICk7CisgICAgICAgICAgICAgICAgaWYgKCByYyAhPSAwICkgeworICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3IgPSBlcnJubzsKKyAgICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAgICBrbXBfbXNfd2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50Q2hhbmdlTW9uaXRvclByaW9yaXR5ICksCisgICAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBNb25pdG9yV2lsbFN0YXJ2ZSApLAorICAgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFdlIGNhbm5vdCBhYm9ydCBoZXJlLCBiZWNhdXNlIG51bWJlciBvZiBDUFVzIG1heSBiZSBlbm91Z2ggZm9yIGFsbCB0aGUgdGhyZWFkcywKKyAgICAgICAgICAgICAgICAvLyBpbmNsdWRpbmcgdGhlIG1vbml0b3IgdGhyZWFkLCBzbyBhcHBsaWNhdGlvbiBjb3VsZCBwb3RlbnRpYWxseSB3b3JrLi4uCisgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICBrbXBfbXNfd2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgS01QX01TRyggUnVubmluZ0F0TWF4UHJpb3JpdHkgKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX01TRyggTW9uaXRvcldpbGxTdGFydmUgKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0hOVCggUnVubmluZ0F0TWF4UHJpb3JpdHkgKSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgVENXXzQoIF9fa21wX2dsb2JhbC5nLmdfdGltZS5kdC50X3ZhbHVlLCAwICk7ICAvLyBBQzogZnJlZSB0aHJlYWQgdGhhdCB3YWl0cyBmb3IgbW9uaXRvciBzdGFydGVkCisgICAgfQorICAgICNlbmRpZiAvLyBLTVBfUkVBTF9USU1FX0ZJWAorCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBpZiAoIF9fa21wX21vbml0b3Jfd2FrZXVwcyA9PSAxICkgeworICAgICAgICBpbnRlcnZhbC50dl9zZWMgID0gMTsKKyAgICAgICAgaW50ZXJ2YWwudHZfbnNlYyA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50ZXJ2YWwudHZfc2VjICA9IDA7CisgICAgICAgIGludGVydmFsLnR2X25zZWMgPSAoS01QX05TRUNfUEVSX1NFQyAvIF9fa21wX21vbml0b3Jfd2FrZXVwcyk7CisgICAgfQorCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2xhdW5jaF9tb25pdG9yOiAjMiBtb25pdG9yXG4iICkgKTsKKworICAgIGlmIChfX2ttcF95aWVsZF9jeWNsZSkgeworICAgICAgICBfX2ttcF95aWVsZGluZ19vbiA9IDA7ICAvKiBTdGFydCBvdXQgd2l0aCB5aWVsZGluZyBzaHV0IG9mZiAqLworICAgICAgICB5aWVsZF9jb3VudCA9IF9fa21wX3lpZWxkX29mZl9jb3VudDsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF95aWVsZGluZ19vbiA9IDE7ICAvKiBZaWVsZGluZyBpcyBvbiBwZXJtYW5lbnRseSAqLworICAgIH0KKworICAgIHdoaWxlKCAhIFRDUl80KCBfX2ttcF9nbG9iYWwuZy5nX2RvbmUgKSApIHsKKyAgICAgICAgc3RydWN0IHRpbWVzcGVjICBub3c7CisgICAgICAgIHN0cnVjdCB0aW1ldmFsICAgdHZhbDsKKworICAgICAgICAvKiAgVGhpcyB0aHJlYWQgbW9uaXRvcnMgdGhlIHN0YXRlIG9mIHRoZSBzeXN0ZW0gKi8KKworICAgICAgICBLQV9UUkFDRSggMTUsICggIl9fa21wX2xhdW5jaF9tb25pdG9yOiB1cGRhdGVcbiIgKSApOworCisgICAgICAgIHN0YXR1cyA9IGdldHRpbWVvZmRheSggJnR2YWwsIE5VTEwgKTsKKyAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUxfRVJSTk8oICJnZXR0aW1lb2ZkYXkiLCBzdGF0dXMgKTsKKyAgICAgICAgVElNRVZBTF9UT19USU1FU1BFQyggJnR2YWwsICZub3cgKTsKKworICAgICAgICBub3cudHZfc2VjICArPSBpbnRlcnZhbC50dl9zZWM7CisgICAgICAgIG5vdy50dl9uc2VjICs9IGludGVydmFsLnR2X25zZWM7CisKKyAgICAgICAgaWYgKG5vdy50dl9uc2VjID49IEtNUF9OU0VDX1BFUl9TRUMpIHsKKyAgICAgICAgICAgIG5vdy50dl9zZWMgICs9IDE7CisgICAgICAgICAgICBub3cudHZfbnNlYyAtPSBLTVBfTlNFQ19QRVJfU0VDOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF9sb2NrKCAmIF9fa21wX3dhaXRfbXgubV9tdXRleCApOworICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfbXV0ZXhfbG9jayIsIHN0YXR1cyApOworICAgICAgICAvLyBBQzogdGhlIG1vbml0b3Igc2hvdWxkIG5vdCBmYWxsIGFzbGVlcCBpZiBnX2RvbmUgaGFzIGJlZW4gc2V0CisgICAgICAgIGlmICggIVRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkgKSB7ICAvLyBjaGVjayBvbmNlIG1vcmUgdW5kZXIgbXV0ZXgKKyAgICAgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZF90aW1lZHdhaXQoICZfX2ttcF93YWl0X2N2LmNfY29uZCwgJl9fa21wX3dhaXRfbXgubV9tdXRleCwgJm5vdyApOworICAgICAgICAgICAgaWYgKCBzdGF0dXMgIT0gMCApIHsKKyAgICAgICAgICAgICAgICBpZiAoIHN0YXR1cyAhPSBFVElNRURPVVQgJiYgc3RhdHVzICE9IEVJTlRSICkgeworICAgICAgICAgICAgICAgICAgICBLTVBfU1lTRkFJTCggInB0aHJlYWRfY29uZF90aW1lZHdhaXQiLCBzdGF0dXMgKTsKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgfTsKKyAgICAgICAgfTsKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF91bmxvY2soICYgX19rbXBfd2FpdF9teC5tX211dGV4ICk7CisgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9tdXRleF91bmxvY2siLCBzdGF0dXMgKTsKKworICAgICAgICBpZiAoX19rbXBfeWllbGRfY3ljbGUpIHsKKyAgICAgICAgICAgIHlpZWxkX2N5Y2xlcysrOworICAgICAgICAgICAgaWYgKCAoeWllbGRfY3ljbGVzICUgeWllbGRfY291bnQpID09IDAgKSB7CisgICAgICAgICAgICAgICAgaWYgKF9fa21wX3lpZWxkaW5nX29uKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX3lpZWxkaW5nX29uID0gMDsgICAvKiBUdXJuIGl0IG9mZiBub3cgKi8KKyAgICAgICAgICAgICAgICAgICAgeWllbGRfY291bnQgPSBfX2ttcF95aWVsZF9vZmZfY291bnQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfeWllbGRpbmdfb24gPSAxOyAgIC8qIFR1cm4gaXQgb24gbm93ICovCisgICAgICAgICAgICAgICAgICAgIHlpZWxkX2NvdW50ID0gX19rbXBfeWllbGRfb25fY291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHlpZWxkX2N5Y2xlcyA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfX2ttcF95aWVsZGluZ19vbiA9IDE7CisgICAgICAgIH0KKworICAgICAgICBUQ1dfNCggX19rbXBfZ2xvYmFsLmcuZ190aW1lLmR0LnRfdmFsdWUsCisgICAgICAgICAgVENSXzQoIF9fa21wX2dsb2JhbC5nLmdfdGltZS5kdC50X3ZhbHVlICkgKyAxICk7CisKKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisgICAgfQorCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2xhdW5jaF9tb25pdG9yOiAjMyBjbGVhbnVwXG4iICkgKTsKKworI2lmZGVmIEtNUF9CTE9DS19TSUdOQUxTCisgICAgc3RhdHVzID0gc2lnZmlsbHNldCggJiBuZXdfc2V0ICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUxfRVJSTk8oICJzaWdmaWxsc2V0Iiwgc3RhdHVzICk7CisgICAgc3RhdHVzID0gcHRocmVhZF9zaWdtYXNrKCBTSUdfVU5CTE9DSywgJiBuZXdfc2V0LCBOVUxMICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX3NpZ21hc2siLCBzdGF0dXMgKTsKKyNlbmRpZiAvKiBLTVBfQkxPQ0tfU0lHTkFMUyAqLworCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2xhdW5jaF9tb25pdG9yOiAjNCBmaW5pc2hlZFxuIiApICk7CisKKyAgICBpZiggX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCAhPSAwICkgeworICAgICAgICAvKiBub3cgd2UgbmVlZCB0byB0ZXJtaW5hdGUgdGhlIHdvcmtlciB0aHJlYWRzICAqLworICAgICAgICAvKiB0aGUgdmFsdWUgb2YgdF9hYm9ydCBpcyB0aGUgc2lnbmFsIHdlIGNhdWdodCAqLworCisgICAgICAgIGludCBndGlkOworCisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9sYXVuY2hfbW9uaXRvcjogIzUgdGVybWluYXRlIHNpZz0lZFxuIiwgX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCApICk7CisKKyAgICAgICAgLyogdGVybWluYXRlIHRoZSBPcGVuTVAgd29ya2VyIHRocmVhZHMgKi8KKyAgICAgICAgLyogVE9ETyB0aGlzIGlzIG5vdCB2YWxpZCBmb3Igc2libGluZyB0aHJlYWRzISEKKyAgICAgICAgICogdGhlIHViZXIgbWFzdGVyIG1pZ2h0IG5vdCBiZSAwIGFueW1vcmUuLiAqLworICAgICAgICBmb3IgKGd0aWQgPSAxOyBndGlkIDwgX19rbXBfdGhyZWFkc19jYXBhY2l0eTsgKytndGlkKQorICAgICAgICAgICAgX19rbXBfdGVybWluYXRlX3RocmVhZCggZ3RpZCApOworCisgICAgICAgIF9fa21wX2NsZWFudXAoKTsKKworICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfbGF1bmNoX21vbml0b3I6ICM2IHJhaXNlIHNpZz0lZFxuIiwgX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCApICk7CisKKyAgICAgICAgaWYgKF9fa21wX2dsb2JhbC5nLmdfYWJvcnQgPiAwKQorICAgICAgICAgICAgcmFpc2UoIF9fa21wX2dsb2JhbC5nLmdfYWJvcnQgKTsKKworICAgIH0KKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9sYXVuY2hfbW9uaXRvcjogIzcgZXhpdFxuIiApICk7CisKKyAgICByZXR1cm4gdGhyOworfQorCit2b2lkCitfX2ttcF9jcmVhdGVfd29ya2VyKCBpbnQgZ3RpZCwga21wX2luZm9fdCAqdGgsIHNpemVfdCBzdGFja19zaXplICkKK3sKKyAgICBwdGhyZWFkX3QgICAgICBoYW5kbGU7CisgICAgcHRocmVhZF9hdHRyX3QgdGhyZWFkX2F0dHI7CisgICAgaW50ICAgICAgICAgICAgc3RhdHVzOworCisKKyAgICB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkID0gZ3RpZDsKKworI2lmIEtNUF9TVEFUU19FTkFCTEVECisgICAgLy8gc2V0cyB1cCB3b3JrZXIgdGhyZWFkIHN0YXRzCisgICAgX19rbXBfYWNxdWlyZV90YXNfbG9jaygmX19rbXBfc3RhdHNfbG9jaywgZ3RpZCk7CisKKyAgICAvLyB0aC0+dGgudGhfc3RhdHMgaXMgdXNlZCB0byB0cmFuc2ZlciB0aHJlYWQgc3BlY2lmaWMgc3RhdHMtcG9pbnRlciB0byBfX2ttcF9sYXVuY2hfd29ya2VyCisgICAgLy8gU28gd2hlbiB0aHJlYWQgaXMgY3JlYXRlZCAoZ29lcyBpbnRvIF9fa21wX2xhdW5jaF93b3JrZXIpIGl0IHdpbGwKKyAgICAvLyBzZXQgaXQncyBfX3RocmVhZCBsb2NhbCBwb2ludGVyIHRvIHRoLT50aC50aF9zdGF0cworICAgIHRoLT50aC50aF9zdGF0cyA9IF9fa21wX3N0YXRzX2xpc3QucHVzaF9iYWNrKGd0aWQpOworICAgIGlmKEtNUF9VQkVSX0dUSUQoZ3RpZCkpIHsKKyAgICAgICAgX19rbXBfc3RhdHNfc3RhcnRfdGltZSA9IHRzY190aWNrX2NvdW50Ojpub3coKTsKKyAgICAgICAgX19rbXBfc3RhdHNfdGhyZWFkX3B0ciA9IHRoLT50aC50aF9zdGF0czsKKyAgICAgICAgX19rbXBfc3RhdHNfaW5pdCgpOworICAgICAgICBLTVBfU1RBUlRfRVhQTElDSVRfVElNRVIoT01QX3NlcmlhbCk7CisgICAgICAgIEtNUF9TVEFSVF9FWFBMSUNJVF9USU1FUihPTVBfc3RhcnRfZW5kKTsKKyAgICB9CisgICAgX19rbXBfcmVsZWFzZV90YXNfbG9jaygmX19rbXBfc3RhdHNfbG9jaywgZ3RpZCk7CisKKyNlbmRpZiAvLyBLTVBfU1RBVFNfRU5BQkxFRAorCisgICAgaWYgKCBLTVBfVUJFUl9HVElEKGd0aWQpICkgeworICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfY3JlYXRlX3dvcmtlcjogdWJlciB0aHJlYWQgKCVkKVxuIiwgZ3RpZCApICk7CisgICAgICAgIHRoIC0+IHRoLnRoX2luZm8uZHMuZHNfdGhyZWFkID0gcHRocmVhZF9zZWxmKCk7CisgICAgICAgIF9fa21wX3NldF9zdGFja19pbmZvKCBndGlkLCB0aCApOworICAgICAgICBfX2ttcF9jaGVja19zdGFja19vdmVybGFwKCB0aCApOworICAgICAgICByZXR1cm47CisgICAgfTsgLy8gaWYKKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9jcmVhdGVfd29ya2VyOiB0cnkgdG8gY3JlYXRlIHRocmVhZCAoJWQpXG4iLCBndGlkICkgKTsKKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisjaWZkZWYgS01QX1RIUkVBRF9BVFRSCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfYXR0cl9pbml0KCAmdGhyZWFkX2F0dHIgKTsKKyAgICAgICAgICAgIGlmICggc3RhdHVzICE9IDAgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRJbml0VGhyZWFkQXR0cnMgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggc3RhdHVzICksCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgc3RhdHVzID0gcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCAmIHRocmVhZF9hdHRyLCBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSApOworICAgICAgICAgICAgaWYgKCBzdGF0dXMgIT0gMCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudFNldFdvcmtlclN0YXRlICksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoIHN0YXR1cyApLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfTsgLy8gaWYKKworICAgICAgICAgICAgLyogU2V0IHN0YWNrIHNpemUgZm9yIHRoaXMgdGhyZWFkIG5vdy4gCisgICAgICAgICAgICAgKiBUaGUgbXVsdGlwbGUgb2YgMiBpcyB0aGVyZSBiZWNhdXNlIG9uIHNvbWUgbWFjaGluZXMsIHJlcXVlc3RpbmcgYW4gdW51c3VhbCBzdGFja3NpemUKKyAgICAgICAgICAgICAqIGNhdXNlcyB0aGUgdGhyZWFkIHRvIGhhdmUgYW4gb2Zmc2V0IGJlZm9yZSB0aGUgZHVtbXkgYWxsb2NhKCkgdGFrZXMgcGxhY2UgdG8gY3JlYXRlIHRoZQorICAgICAgICAgICAgICogb2Zmc2V0LiAgU2luY2Ugd2Ugd2FudCB0aGUgdXNlciB0byBoYXZlIGEgc3VmZmljaWVudCBzdGFja3NpemUgQU5EIHN1cHBvcnQgYSBzdGFjayBvZmZzZXQsIHdlIAorICAgICAgICAgICAgICogYWxsb2NhKCkgdHdpY2UgdGhlIG9mZnNldCBzbyB0aGF0IHRoZSB1cGNvbWluZyBhbGxvY2EoKSBkb2VzIG5vdCBlbGltaW5hdGUgYW55IHByZW1hZGUKKyAgICAgICAgICAgICAqIG9mZnNldCwgYW5kIGFsc28gZ2l2ZXMgdGhlIHVzZXIgdGhlIHN0YWNrIHNwYWNlIHRoZXkgcmVxdWVzdGVkIGZvciBhbGwgdGhyZWFkcyAqLworICAgICAgICAgICAgc3RhY2tfc2l6ZSArPSBndGlkICogX19rbXBfc3Rrb2Zmc2V0ICogMjsKKworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcF9jcmVhdGVfd29ya2VyOiBUIyVkLCBkZWZhdWx0IHN0YWNrc2l6ZSA9ICVsdSBieXRlcywgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfX2ttcF9zdGtzaXplID0gJWx1IGJ5dGVzLCBmaW5hbCBzdGFja3NpemUgPSAlbHUgYnl0ZXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgS01QX0RFRkFVTFRfU1RLU0laRSwgX19rbXBfc3Rrc2l6ZSwgc3RhY2tfc2l6ZSApICk7CisKKyMgaWZkZWYgX1BPU0lYX1RIUkVBRF9BVFRSX1NUQUNLU0laRQorICAgICAgICAgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfYXR0cl9zZXRzdGFja3NpemUoICYgdGhyZWFkX2F0dHIsIHN0YWNrX3NpemUgKTsKKyMgIGlmZGVmIEtNUF9CQUNLVVBfU1RLU0laRQorICAgICAgICAgICAgaWYgKCBzdGF0dXMgIT0gMCApIHsKKyAgICAgICAgICAgICAgICBpZiAoICEgX19rbXBfZW52X3N0a3NpemUgKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YWNrX3NpemUgPSBLTVBfQkFDS1VQX1NUS1NJWkUgKyBndGlkICogX19rbXBfc3Rrb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGtzaXplID0gS01QX0JBQ0tVUF9TVEtTSVpFOworICAgICAgICAgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfY3JlYXRlX3dvcmtlcjogVCMlZCwgZGVmYXVsdCBzdGFja3NpemUgPSAlbHUgYnl0ZXMsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fa21wX3N0a3NpemUgPSAlbHUgYnl0ZXMsIChiYWNrdXApIGZpbmFsIHN0YWNrc2l6ZSA9ICVsdSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgS01QX0RFRkFVTFRfU1RLU0laRSwgX19rbXBfc3Rrc2l6ZSwgc3RhY2tfc2l6ZSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2F0dHJfc2V0c3RhY2tzaXplKCAmdGhyZWFkX2F0dHIsIHN0YWNrX3NpemUgKTsKKyAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgfTsgLy8gaWYKKyMgIGVuZGlmIC8qIEtNUF9CQUNLVVBfU1RLU0laRSAqLworICAgICAgICAgICAgaWYgKCBzdGF0dXMgIT0gMCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudFNldFdvcmtlclN0YWNrU2l6ZSwgc3RhY2tfc2l6ZSApLAorICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBzdGF0dXMgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0hOVCggQ2hhbmdlV29ya2VyU3RhY2tTaXplICApLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfTsgLy8gaWYKKyMgZW5kaWYgLyogX1BPU0lYX1RIUkVBRF9BVFRSX1NUQUNLU0laRSAqLworICAgICAgICB9CisjZW5kaWYgLyogS01QX1RIUkVBRF9BVFRSICovCisKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gcHRocmVhZF9jcmVhdGUoICYgaGFuZGxlLCAmIHRocmVhZF9hdHRyLCBfX2ttcF9sYXVuY2hfd29ya2VyLCAodm9pZCAqKSB0aCApOworICAgICAgICAgICAgaWYgKCBzdGF0dXMgIT0gMCB8fCAhIGhhbmRsZSApIHsgLy8gPz8/IFdoeSBkbyB3ZSBjaGVjayBoYW5kbGU/PworI2lmZGVmIF9QT1NJWF9USFJFQURfQVRUUl9TVEFDS1NJWkUKKyAgICAgICAgICAgICAgICBpZiAoIHN0YXR1cyA9PSBFSU5WQUwgKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRTZXRXb3JrZXJTdGFja1NpemUsIHN0YWNrX3NpemUgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoIHN0YXR1cyApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0hOVCggSW5jcmVhc2VXb3JrZXJTdGFja1NpemUgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgaWYgKCBzdGF0dXMgPT0gRU5PTUVNICkgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50U2V0V29ya2VyU3RhY2tTaXplLCBzdGFja19zaXplICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBzdGF0dXMgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9ITlQoIERlY3JlYXNlV29ya2VyU3RhY2tTaXplICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICB9OworI2VuZGlmIC8qIF9QT1NJWF9USFJFQURfQVRUUl9TVEFDS1NJWkUgKi8KKyAgICAgICAgICAgICAgICBpZiAoIHN0YXR1cyA9PSBFQUdBSU4gKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIE5vUmVzb3VyY2VzRm9yV29ya2VyVGhyZWFkICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBzdGF0dXMgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9ITlQoIERlY3JlYXNlX05VTV9USFJFQURTICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgICAgIEtNUF9TWVNGQUlMKCAicHRocmVhZF9jcmVhdGUiLCBzdGF0dXMgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisKKyAgICAgICAgICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCA9IGhhbmRsZTsKKyAgICAgICAgfQorCisjaWZkZWYgS01QX1RIUkVBRF9BVFRSCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfYXR0cl9kZXN0cm95KCAmIHRocmVhZF9hdHRyICk7CisgICAgICAgICAgICBpZiAoIHN0YXR1cyApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9tc193YXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50RGVzdHJveVRocmVhZEF0dHJzICksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoIHN0YXR1cyApLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfQorI2VuZGlmIC8qIEtNUF9USFJFQURfQVRUUiAqLworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfY3JlYXRlX3dvcmtlcjogZG9uZSBjcmVhdGluZyB0aHJlYWQgKCVkKVxuIiwgZ3RpZCApICk7CisKK30gLy8gX19rbXBfY3JlYXRlX3dvcmtlcgorCisKK3ZvaWQKK19fa21wX2NyZWF0ZV9tb25pdG9yKCBrbXBfaW5mb190ICp0aCApCit7CisgICAgcHRocmVhZF90ICAgICAgICAgICBoYW5kbGU7CisgICAgcHRocmVhZF9hdHRyX3QgICAgICB0aHJlYWRfYXR0cjsKKyAgICBzaXplX3QgICAgICAgICAgICAgIHNpemU7CisgICAgaW50ICAgICAgICAgICAgICAgICBzdGF0dXM7CisgICAgaW50ICAgICAgICAgICAgICAgICBhdXRvX2Fkal9zaXplID0gRkFMU0U7CisKKyAgICBpZiggX19rbXBfZGZsdF9ibG9ja3RpbWUgPT0gS01QX01BWF9CTE9DS1RJTUUgKSB7CisgICAgICAgIC8vIFdlIGRvbid0IG5lZWQgbW9uaXRvciB0aHJlYWQgaW4gY2FzZSBvZiBNQVhfQkxPQ0tUSU1FCisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9jcmVhdGVfbW9uaXRvcjogc2tpcHBpbmcgbW9uaXRvciB0aHJlYWQgYmVjYXVzZSBvZiBNQVggYmxvY2t0aW1lXG4iICkgKTsKKyAgICAgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGlkICA9IDA7IC8vIHRoaXMgbWFrZXMgcmVhcF9tb25pdG9yIG5vLW9wCisgICAgICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgPSAwOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9jcmVhdGVfbW9uaXRvcjogdHJ5IHRvIGNyZWF0ZSBtb25pdG9yXG4iICkgKTsKKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGlkICA9IEtNUF9HVElEX01PTklUT1I7CisgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCA9IEtNUF9HVElEX01PTklUT1I7CisgICAgI2lmIEtNUF9SRUFMX1RJTUVfRklYCisgICAgICAgIFRDV180KCBfX2ttcF9nbG9iYWwuZy5nX3RpbWUuZHQudF92YWx1ZSwgLTEgKTsgLy8gV2lsbCB1c2UgaXQgZm9yIHN5bmNocm9uaXphdGlvbiBhIGJpdCBsYXRlci4KKyAgICAjZWxzZQorICAgICAgICBUQ1dfNCggX19rbXBfZ2xvYmFsLmcuZ190aW1lLmR0LnRfdmFsdWUsIDAgKTsKKyAgICAjZW5kaWYgLy8gS01QX1JFQUxfVElNRV9GSVgKKworICAgICNpZmRlZiBLTVBfVEhSRUFEX0FUVFIKKyAgICAgICAgaWYgKCBfX2ttcF9tb25pdG9yX3N0a3NpemUgPT0gMCApIHsKKyAgICAgICAgICAgIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSA9IEtNUF9ERUZBVUxUX01PTklUT1JfU1RLU0laRTsKKyAgICAgICAgICAgIGF1dG9fYWRqX3NpemUgPSBUUlVFOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfYXR0cl9pbml0KCAmdGhyZWFkX2F0dHIgKTsKKyAgICAgICAgaWYgKCBzdGF0dXMgIT0gMCApIHsKKyAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudEluaXRUaHJlYWRBdHRycyApLAorICAgICAgICAgICAgICAgIEtNUF9FUlIoIHN0YXR1cyApLAorICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICApOworICAgICAgICB9OyAvLyBpZgorICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUoICYgdGhyZWFkX2F0dHIsIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFICk7CisgICAgICAgIGlmICggc3RhdHVzICE9IDAgKSB7CisgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRTZXRNb25pdG9yU3RhdGUgKSwKKyAgICAgICAgICAgICAgICBLTVBfRVJSKCBzdGF0dXMgKSwKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgKTsKKyAgICAgICAgfTsgLy8gaWYKKworICAgICAgICAjaWZkZWYgX1BPU0lYX1RIUkVBRF9BVFRSX1NUQUNLU0laRQorICAgICAgICAgICAgc3RhdHVzID0gcHRocmVhZF9hdHRyX2dldHN0YWNrc2l6ZSggJiB0aHJlYWRfYXR0ciwgJiBzaXplICk7CisgICAgICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfYXR0cl9nZXRzdGFja3NpemUiLCBzdGF0dXMgKTsKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgIHNpemUgPSBfX2ttcF9zeXNfbWluX3N0a3NpemU7CisgICAgICAgICNlbmRpZiAvKiBfUE9TSVhfVEhSRUFEX0FUVFJfU1RBQ0tTSVpFICovCisgICAgI2VuZGlmIC8qIEtNUF9USFJFQURfQVRUUiAqLworCisgICAgaWYgKCBfX2ttcF9tb25pdG9yX3N0a3NpemUgPT0gMCApIHsKKyAgICAgICAgX19rbXBfbW9uaXRvcl9zdGtzaXplID0gS01QX0RFRkFVTFRfTU9OSVRPUl9TVEtTSVpFOworICAgIH0KKyAgICBpZiAoIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSA8IF9fa21wX3N5c19taW5fc3Rrc2l6ZSApIHsKKyAgICAgICAgX19rbXBfbW9uaXRvcl9zdGtzaXplID0gX19rbXBfc3lzX21pbl9zdGtzaXplOworICAgIH0KKworICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBfY3JlYXRlX21vbml0b3I6IGRlZmF1bHQgc3RhY2tzaXplID0gJWx1IGJ5dGVzLCIKKyAgICAgICAgICAgICAgICAgICAgInJlcXVlc3RlZCBzdGFja3NpemUgPSAlbHUgYnl0ZXNcbiIsCisgICAgICAgICAgICAgICAgICAgIHNpemUsIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSApICk7CisKKyAgICByZXRyeToKKworICAgIC8qIFNldCBzdGFjayBzaXplIGZvciB0aGlzIHRocmVhZCBub3cuICovCisKKyAgICAjaWZkZWYgX1BPU0lYX1RIUkVBRF9BVFRSX1NUQUNLU0laRQorICAgICAgICBLQV9UUkFDRSggMTAsICggIl9fa21wX2NyZWF0ZV9tb25pdG9yOiBzZXR0aW5nIHN0YWNrc2l6ZSA9ICVsdSBieXRlcywiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfbW9uaXRvcl9zdGtzaXplICkgKTsKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9hdHRyX3NldHN0YWNrc2l6ZSggJiB0aHJlYWRfYXR0ciwgX19rbXBfbW9uaXRvcl9zdGtzaXplICk7CisgICAgICAgIGlmICggc3RhdHVzICE9IDAgKSB7CisgICAgICAgICAgICBpZiAoIGF1dG9fYWRqX3NpemUgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfbW9uaXRvcl9zdGtzaXplICo9IDI7CisgICAgICAgICAgICAgICAgZ290byByZXRyeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICBrbXBfbXNfd2FybmluZywgIC8vIHNob3VsZCB0aGlzIGJlIGZhdGFsPyAgQkIKKyAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50U2V0TW9uaXRvclN0YWNrU2l6ZSwgKGxvbmcgaW50KSBfX2ttcF9tb25pdG9yX3N0a3NpemUgKSwKKyAgICAgICAgICAgICAgICBLTVBfRVJSKCBzdGF0dXMgKSwKKyAgICAgICAgICAgICAgICBLTVBfSE5UKCBDaGFuZ2VNb25pdG9yU3RhY2tTaXplICksCisgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICk7CisgICAgICAgIH07IC8vIGlmCisgICAgI2VuZGlmIC8qIF9QT1NJWF9USFJFQURfQVRUUl9TVEFDS1NJWkUgKi8KKworICAgIHN0YXR1cyA9IHB0aHJlYWRfY3JlYXRlKCAmaGFuZGxlLCAmIHRocmVhZF9hdHRyLCBfX2ttcF9sYXVuY2hfbW9uaXRvciwgKHZvaWQgKikgdGggKTsKKworICAgIGlmICggc3RhdHVzICE9IDAgKSB7CisgICAgICAgICNpZmRlZiBfUE9TSVhfVEhSRUFEX0FUVFJfU1RBQ0tTSVpFCisgICAgICAgICAgICBpZiAoIHN0YXR1cyA9PSBFSU5WQUwgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBhdXRvX2Fkal9zaXplICAmJiAoIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSA8IChzaXplX3QpMHg0MDAwMDAwMCApICkgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9tb25pdG9yX3N0a3NpemUgKj0gMjsKKyAgICAgICAgICAgICAgICAgICAgZ290byByZXRyeTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRTZXRNb25pdG9yU3RhY2tTaXplLCBfX2ttcF9tb25pdG9yX3N0a3NpemUgKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggc3RhdHVzICksCisgICAgICAgICAgICAgICAgICAgIEtNUF9ITlQoIEluY3JlYXNlTW9uaXRvclN0YWNrU2l6ZSApLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgaWYgKCBzdGF0dXMgPT0gRU5PTUVNICkgeworICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50U2V0TW9uaXRvclN0YWNrU2l6ZSwgX19rbXBfbW9uaXRvcl9zdGtzaXplICksCisgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoIHN0YXR1cyApLAorICAgICAgICAgICAgICAgICAgICBLTVBfSE5UKCBEZWNyZWFzZU1vbml0b3JTdGFja1NpemUgKSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgI2VuZGlmIC8qIF9QT1NJWF9USFJFQURfQVRUUl9TVEFDS1NJWkUgKi8KKyAgICAgICAgaWYgKCBzdGF0dXMgPT0gRUFHQUlOICkgeworICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICBLTVBfTVNHKCBOb1Jlc291cmNlc0Zvck1vbml0b3JUaHJlYWQgKSwKKyAgICAgICAgICAgICAgICBLTVBfRVJSKCBzdGF0dXMgKSwKKyAgICAgICAgICAgICAgICBLTVBfSE5UKCBEZWNyZWFzZU51bWJlck9mVGhyZWFkc0luVXNlICksCisgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICk7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIEtNUF9TWVNGQUlMKCAicHRocmVhZF9jcmVhdGUiLCBzdGF0dXMgKTsKKyAgICB9OyAvLyBpZgorCisgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkID0gaGFuZGxlOworCisgICAgI2lmIEtNUF9SRUFMX1RJTUVfRklYCisgICAgICAgIC8vIFdhaXQgZm9yIHRoZSBtb25pdG9yIHRocmVhZCBpcyByZWFsbHkgc3RhcnRlZCBhbmQgc2V0IGl0cyAqcHJpb3JpdHkqLgorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBzaXplb2YoIGttcF91aW50MzIgKSA9PSBzaXplb2YoIF9fa21wX2dsb2JhbC5nLmdfdGltZS5kdC50X3ZhbHVlICkgKTsKKyAgICAgICAgX19rbXBfd2FpdF95aWVsZF80KAorICAgICAgICAgICAgKGttcF91aW50MzIgdm9sYXRpbGUgKikgJiBfX2ttcF9nbG9iYWwuZy5nX3RpbWUuZHQudF92YWx1ZSwgLTEsICYgX19rbXBfbmVxXzQsIE5VTEwKKyAgICAgICAgKTsKKyAgICAjZW5kaWYgLy8gS01QX1JFQUxfVElNRV9GSVgKKworICAgICNpZmRlZiBLTVBfVEhSRUFEX0FUVFIKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9hdHRyX2Rlc3Ryb3koICYgdGhyZWFkX2F0dHIgKTsKKyAgICAgICAgaWYgKCBzdGF0dXMgIT0gMCApIHsKKyAgICAgICAgICAgIF9fa21wX21zZyggICAgLy8KKyAgICAgICAgICAgICAgICBrbXBfbXNfd2FybmluZywKKyAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50RGVzdHJveVRocmVhZEF0dHJzICksCisgICAgICAgICAgICAgICAgS01QX0VSUiggc3RhdHVzICksCisgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICk7CisgICAgICAgIH07IC8vIGlmCisgICAgI2VuZGlmCisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBfY3JlYXRlX21vbml0b3I6IG1vbml0b3IgY3JlYXRlZCAlIy44bHhcbiIsIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCApICk7CisKK30gLy8gX19rbXBfY3JlYXRlX21vbml0b3IKKwordm9pZAorX19rbXBfZXhpdF90aHJlYWQoCisgICAgaW50IGV4aXRfc3RhdHVzCispIHsKKyAgICBwdGhyZWFkX2V4aXQoICh2b2lkICopKGludHB0cl90KSBleGl0X3N0YXR1cyApOworfSAvLyBfX2ttcF9leGl0X3RocmVhZAorCit2b2lkIF9fa21wX3Jlc3VtZV9tb25pdG9yKCk7CisKK3ZvaWQKK19fa21wX3JlYXBfbW9uaXRvcigga21wX2luZm9fdCAqdGggKQoreworICAgIGludCAgICAgICAgICBzdGF0dXM7CisgICAgdm9pZCAgICAgICAgKmV4aXRfdmFsOworCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3JlYXBfbW9uaXRvcjogdHJ5IHRvIHJlYXAgbW9uaXRvciB0aHJlYWQgd2l0aCBoYW5kbGUgJSMuOGx4XG4iLAorICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCApICk7CisKKyAgICAvLyBJZiBtb25pdG9yIGhhcyBiZWVuIGNyZWF0ZWQsIGl0cyB0aWQgYW5kIGd0aWQgc2hvdWxkIGJlIEtNUF9HVElEX01PTklUT1IuCisgICAgLy8gSWYgYm90aCB0aWQgYW5kIGd0aWQgYXJlIDAsIGl0IG1lYW5zIHRoZSBtb25pdG9yIGRpZCBub3QgZXZlciBzdGFydC4KKyAgICAvLyBJZiBib3RoIHRpZCBhbmQgZ3RpZCBhcmUgS01QX0dUSURfRE5FLCB0aGUgbW9uaXRvciBoYXMgYmVlbiBzaHV0IGRvd24uCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGgtPnRoLnRoX2luZm8uZHMuZHNfdGlkID09IHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgKTsKKyAgICBpZiAoIHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgIT0gS01QX0dUSURfTU9OSVRPUiApIHsKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3JlYXBfbW9uaXRvcjogbW9uaXRvciBkaWQgbm90IHN0YXJ0LCByZXR1cm5pbmdcbiIpICk7CisgICAgICAgIHJldHVybjsKKyAgICB9OyAvLyBpZgorCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKworICAgIC8qIEZpcnN0LCBjaGVjayB0byBzZWUgd2hldGhlciB0aGUgbW9uaXRvciB0aHJlYWQgZXhpc3RzLiAgVGhpcyBjb3VsZCBwcmV2ZW50IGEgaGFuZywKKyAgICAgICBidXQgaWYgdGhlIG1vbml0b3IgZGllcyBhZnRlciB0aGUgcHRocmVhZF9raWxsIGNhbGwgYW5kIGJlZm9yZSB0aGUgcHRocmVhZF9qb2luCisgICAgICAgY2FsbCwgaXQgd2lsbCBzdGlsbCBoYW5nLiAqLworCisgICAgc3RhdHVzID0gcHRocmVhZF9raWxsKCB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQsIDAgKTsKKyAgICBpZiAoc3RhdHVzID09IEVTUkNIKSB7CisKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3JlYXBfbW9uaXRvcjogbW9uaXRvciBkb2VzIG5vdCBleGlzdCwgcmV0dXJuaW5nXG4iKSApOworCisgICAgfSBlbHNlCisgICAgeworICAgICAgICBfX2ttcF9yZXN1bWVfbW9uaXRvcigpOyAgIC8vIFdha2UgdXAgdGhlIG1vbml0b3IgdGhyZWFkCisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfam9pbiggdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkLCAmIGV4aXRfdmFsKTsKKyAgICAgICAgaWYgKGV4aXRfdmFsICE9IHRoKSB7CisgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgIEtNUF9NU0coIFJlYXBNb25pdG9yRXJyb3IgKSwKKyAgICAgICAgICAgICAgICBLTVBfRVJSKCBzdGF0dXMgKSwKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX3RpZCAgPSBLTVBfR1RJRF9ETkU7CisgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCA9IEtNUF9HVElEX0RORTsKKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9yZWFwX21vbml0b3I6IGRvbmUgcmVhcGluZyBtb25pdG9yIHRocmVhZCB3aXRoIGhhbmRsZSAlIy44bHhcbiIsCisgICAgICAgICAgICAgICAgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkICkgKTsKKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCit9CisKK3ZvaWQKK19fa21wX3JlYXBfd29ya2VyKCBrbXBfaW5mb190ICp0aCApCit7CisgICAgaW50ICAgICAgICAgIHN0YXR1czsKKyAgICB2b2lkICAgICAgICAqZXhpdF92YWw7CisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9yZWFwX3dvcmtlcjogdHJ5IHRvIHJlYXAgVCMlZFxuIiwgdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCApICk7CisKKyAgICAvKiBGaXJzdCwgY2hlY2sgdG8gc2VlIHdoZXRoZXIgdGhlIHdvcmtlciB0aHJlYWQgZXhpc3RzLiAgVGhpcyBjb3VsZCBwcmV2ZW50IGEgaGFuZywKKyAgICAgICBidXQgaWYgdGhlIHdvcmtlciBkaWVzIGFmdGVyIHRoZSBwdGhyZWFkX2tpbGwgY2FsbCBhbmQgYmVmb3JlIHRoZSBwdGhyZWFkX2pvaW4KKyAgICAgICBjYWxsLCBpdCB3aWxsIHN0aWxsIGhhbmcuICovCisKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gcHRocmVhZF9raWxsKCB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQsIDAgKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gRVNSQ0gpIHsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfcmVhcF93b3JrZXI6IHdvcmtlciBUIyVkIGRvZXMgbm90IGV4aXN0LCByZXR1cm5pbmdcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCApICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfcmVhcF93b3JrZXI6IHRyeSB0byBqb2luIHdpdGggd29ya2VyIFQjJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCApICk7CisKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2pvaW4oIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCwgJiBleGl0X3ZhbCk7CisjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICAgICAgLyogRG9uJ3QgZXhwb3NlIHRoZXNlIHRvIHRoZSB1c2VyIHVudGlsIHdlIHVuZGVyc3RhbmQgd2hlbiB0aGV5IHRyaWdnZXIgKi8KKyAgICAgICAgICAgICAgICBpZiAoIHN0YXR1cyAhPSAwICkgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBSZWFwV29ya2VyRXJyb3IgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoIHN0YXR1cyApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICggZXhpdF92YWwgIT0gdGggKSB7CisgICAgICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVhcF93b3JrZXI6IHdvcmtlciBUIyVkIGRpZCBub3QgcmVhcCBwcm9wZXJseSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4aXRfdmFsID0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkLCBleGl0X3ZhbCApICk7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfcmVhcF93b3JrZXI6IGRvbmUgcmVhcGluZyBUIyVkXG4iLCB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkICkgKTsKKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBLTVBfSEFORExFX1NJR05BTFMKKworCitzdGF0aWMgdm9pZAorX19rbXBfbnVsbF9oYW5kbGVyKCBpbnQgc2lnbm8gKQoreworICAgIC8vICBEbyBub3RoaW5nLCBmb3IgZG9pbmcgU0lHX0lHTi10eXBlIGFjdGlvbnMuCit9IC8vIF9fa21wX251bGxfaGFuZGxlcgorCisKK3N0YXRpYyB2b2lkCitfX2ttcF90ZWFtX2hhbmRsZXIoIGludCBzaWdubyApCit7CisgICAgaWYgKCBfX2ttcF9nbG9iYWwuZy5nX2Fib3J0ID09IDAgKSB7CisgICAgICAgIC8qIFN0YWdlIDEgc2lnbmFsIGhhbmRsZXIsIGxldCdzIHNodXQgZG93biBhbGwgb2YgdGhlIHRocmVhZHMgKi8KKyAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgX19rbXBfZGVidWdfcHJpbnRmKCAiX19rbXBfdGVhbV9oYW5kbGVyOiBjYXVnaHQgc2lnbmFsID0gJWRcbiIsIHNpZ25vICk7CisgICAgICAgICNlbmRpZgorICAgICAgICBzd2l0Y2ggKCBzaWdubyApIHsKKyAgICAgICAgICAgIGNhc2UgU0lHSFVQICA6CisgICAgICAgICAgICBjYXNlIFNJR0lOVCAgOgorICAgICAgICAgICAgY2FzZSBTSUdRVUlUIDoKKyAgICAgICAgICAgIGNhc2UgU0lHSUxMICA6CisgICAgICAgICAgICBjYXNlIFNJR0FCUlQgOgorICAgICAgICAgICAgY2FzZSBTSUdGUEUgIDoKKyAgICAgICAgICAgIGNhc2UgU0lHQlVTICA6CisgICAgICAgICAgICBjYXNlIFNJR1NFR1YgOgorICAgICAgICAgICAgI2lmZGVmIFNJR1NZUworICAgICAgICAgICAgICAgIGNhc2UgU0lHU1lTIDoKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgY2FzZSBTSUdURVJNIDoKKyAgICAgICAgICAgICAgICBpZiAoIF9fa21wX2RlYnVnX2J1ZiApIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfZHVtcF9kZWJ1Z19idWZmZXIoICk7CisgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICAgICBLTVBfTUIoKTsgICAgICAgLy8gRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLgorICAgICAgICAgICAgICAgIFRDV180KCBfX2ttcF9nbG9iYWwuZy5nX2Fib3J0LCBzaWdubyApOworICAgICAgICAgICAgICAgIEtNUF9NQigpOyAgICAgICAvLyBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuCisgICAgICAgICAgICAgICAgVENXXzQoIF9fa21wX2dsb2JhbC5nLmdfZG9uZSwgVFJVRSApOworICAgICAgICAgICAgICAgIEtNUF9NQigpOyAgICAgICAvLyBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfZGVidWdfcHJpbnRmKCAiX19rbXBfdGVhbV9oYW5kbGVyOiB1bmtub3duIHNpZ25hbCB0eXBlIiApOworICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9OyAvLyBzd2l0Y2gKKyAgICB9OyAvLyBpZgorfSAvLyBfX2ttcF90ZWFtX2hhbmRsZXIKKworCitzdGF0aWMKK3ZvaWQgX19rbXBfc2lnYWN0aW9uKCBpbnQgc2lnbnVtLCBjb25zdCBzdHJ1Y3Qgc2lnYWN0aW9uICogYWN0LCBzdHJ1Y3Qgc2lnYWN0aW9uICogb2xkYWN0ICkgeworICAgIGludCByYyA9IHNpZ2FjdGlvbiggc2lnbnVtLCBhY3QsIG9sZGFjdCApOworICAgIEtNUF9DSEVDS19TWVNGQUlMX0VSUk5PKCAic2lnYWN0aW9uIiwgcmMgKTsKK30KKworCitzdGF0aWMgdm9pZAorX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlciggaW50IHNpZywgc2lnX2Z1bmNfdCBoYW5kbGVyX2Z1bmMsIGludCBwYXJhbGxlbF9pbml0ICkKK3sKKyAgICBLTVBfTUIoKTsgICAgICAgLy8gRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLgorICAgIEtCX1RSQUNFKCA2MCwgKCAiX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlciggJWQsIC4uLiwgJWQgKVxuIiwgc2lnLCBwYXJhbGxlbF9pbml0ICkgKTsKKyAgICBpZiAoIHBhcmFsbGVsX2luaXQgKSB7CisgICAgICAgIHN0cnVjdCBzaWdhY3Rpb24gbmV3X2FjdGlvbjsKKyAgICAgICAgc3RydWN0IHNpZ2FjdGlvbiBvbGRfYWN0aW9uOworICAgICAgICBuZXdfYWN0aW9uLnNhX2hhbmRsZXIgPSBoYW5kbGVyX2Z1bmM7CisgICAgICAgIG5ld19hY3Rpb24uc2FfZmxhZ3MgICA9IDA7CisgICAgICAgIHNpZ2ZpbGxzZXQoICYgbmV3X2FjdGlvbi5zYV9tYXNrICk7CisgICAgICAgIF9fa21wX3NpZ2FjdGlvbiggc2lnLCAmIG5ld19hY3Rpb24sICYgb2xkX2FjdGlvbiApOworICAgICAgICBpZiAoIG9sZF9hY3Rpb24uc2FfaGFuZGxlciA9PSBfX2ttcF9zaWdobGRyc1sgc2lnIF0uc2FfaGFuZGxlciApIHsKKyAgICAgICAgICAgIHNpZ2FkZHNldCggJiBfX2ttcF9zaWdzZXQsIHNpZyApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gUmVzdG9yZS9rZWVwIHVzZXIncyBoYW5kbGVyIGlmIG9uZSBwcmV2aW91c2x5IGluc3RhbGxlZC4KKyAgICAgICAgICAgIF9fa21wX3NpZ2FjdGlvbiggc2lnLCAmIG9sZF9hY3Rpb24sIE5VTEwgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBTYXZlIGluaXRpYWwvc3lzdGVtIHNpZ25hbCBoYW5kbGVycyB0byBzZWUgaWYgdXNlciBoYW5kbGVycyBpbnN0YWxsZWQuCisgICAgICAgIF9fa21wX3NpZ2FjdGlvbiggc2lnLCBOVUxMLCAmIF9fa21wX3NpZ2hsZHJzWyBzaWcgXSApOworICAgIH07IC8vIGlmCisgICAgS01QX01CKCk7ICAgICAgIC8vIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4KK30gLy8gX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlcgorCisKK3N0YXRpYyB2b2lkCitfX2ttcF9yZW1vdmVfb25lX2hhbmRsZXIoIGludCBzaWcgKQoreworICAgIEtCX1RSQUNFKCA2MCwgKCAiX19rbXBfcmVtb3ZlX29uZV9oYW5kbGVyKCAlZCApXG4iLCBzaWcgKSApOworICAgIGlmICggc2lnaXNtZW1iZXIoICYgX19rbXBfc2lnc2V0LCBzaWcgKSApIHsKKyAgICAgICAgc3RydWN0IHNpZ2FjdGlvbiBvbGQ7CisgICAgICAgIEtNUF9NQigpOyAgICAgICAvLyBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuCisgICAgICAgIF9fa21wX3NpZ2FjdGlvbiggc2lnLCAmIF9fa21wX3NpZ2hsZHJzWyBzaWcgXSwgJiBvbGQgKTsKKyAgICAgICAgaWYgKCAoIG9sZC5zYV9oYW5kbGVyICE9IF9fa21wX3RlYW1faGFuZGxlciApICYmICggb2xkLnNhX2hhbmRsZXIgIT0gX19rbXBfbnVsbF9oYW5kbGVyICkgKSB7CisgICAgICAgICAgICAvLyBSZXN0b3JlIHRoZSB1c2VycyBzaWduYWwgaGFuZGxlci4KKyAgICAgICAgICAgIEtCX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVtb3ZlX29uZV9oYW5kbGVyOiBvb3BzLCBub3Qgb3VyIGhhbmRsZXIsIHJlc3RvcmluZzogc2lnPSVkXG4iLCBzaWcgKSApOworICAgICAgICAgICAgX19rbXBfc2lnYWN0aW9uKCBzaWcsICYgb2xkLCBOVUxMICk7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIHNpZ2RlbHNldCggJiBfX2ttcF9zaWdzZXQsIHNpZyApOworICAgICAgICBLTVBfTUIoKTsgICAgICAgLy8gRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLgorICAgIH07IC8vIGlmCit9IC8vIF9fa21wX3JlbW92ZV9vbmVfaGFuZGxlcgorCisKK3ZvaWQKK19fa21wX2luc3RhbGxfc2lnbmFscyggaW50IHBhcmFsbGVsX2luaXQgKQoreworICAgIEtCX1RSQUNFKCAxMCwgKCAiX19rbXBfaW5zdGFsbF9zaWduYWxzKCAlZCApXG4iLCBwYXJhbGxlbF9pbml0ICkgKTsKKyAgICBpZiAoIF9fa21wX2hhbmRsZV9zaWduYWxzIHx8ICEgcGFyYWxsZWxfaW5pdCApIHsKKyAgICAgICAgLy8gSWYgISBwYXJhbGxlbF9pbml0LCB3ZSBkbyBub3QgaW5zdGFsbCBoYW5kbGVycywganVzdCBzYXZlIG9yaWdpbmFsIGhhbmRsZXJzLgorICAgICAgICAvLyBMZXQgdXMgZG8gaXQgZXZlbiBfX2hhbmRsZV9zaWduYWxzIGlzIDAuCisgICAgICAgIHNpZ2VtcHR5c2V0KCAmIF9fa21wX3NpZ3NldCApOworICAgICAgICBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKCBTSUdIVVAsICBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQgKTsKKyAgICAgICAgX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlciggU0lHSU5ULCAgX19rbXBfdGVhbV9oYW5kbGVyLCBwYXJhbGxlbF9pbml0ICk7CisgICAgICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoIFNJR1FVSVQsIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCApOworICAgICAgICBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKCBTSUdJTEwsICBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQgKTsKKyAgICAgICAgX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlciggU0lHQUJSVCwgX19rbXBfdGVhbV9oYW5kbGVyLCBwYXJhbGxlbF9pbml0ICk7CisgICAgICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoIFNJR0ZQRSwgIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCApOworICAgICAgICBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKCBTSUdCVVMsICBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQgKTsKKyAgICAgICAgX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlciggU0lHU0VHViwgX19rbXBfdGVhbV9oYW5kbGVyLCBwYXJhbGxlbF9pbml0ICk7CisgICAgICAgICNpZmRlZiBTSUdTWVMKKyAgICAgICAgICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoIFNJR1NZUywgIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCApOworICAgICAgICAjZW5kaWYgLy8gU0lHU1lTCisgICAgICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoIFNJR1RFUk0sIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCApOworICAgICAgICAjaWZkZWYgU0lHUElQRQorICAgICAgICAgICAgX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlciggU0lHUElQRSwgX19rbXBfdGVhbV9oYW5kbGVyLCBwYXJhbGxlbF9pbml0ICk7CisgICAgICAgICNlbmRpZiAvLyBTSUdQSVBFCisgICAgfTsgLy8gaWYKK30gLy8gX19rbXBfaW5zdGFsbF9zaWduYWxzCisKKwordm9pZAorX19rbXBfcmVtb3ZlX3NpZ25hbHMoIHZvaWQgKQoreworICAgIGludCAgICBzaWc7CisgICAgS0JfVFJBQ0UoIDEwLCAoICJfX2ttcF9yZW1vdmVfc2lnbmFscygpXG4iICkgKTsKKyAgICBmb3IgKCBzaWcgPSAxOyBzaWcgPCBOU0lHOyArKyBzaWcgKSB7CisgICAgICAgIF9fa21wX3JlbW92ZV9vbmVfaGFuZGxlciggc2lnICk7CisgICAgfTsgLy8gZm9yIHNpZworfSAvLyBfX2ttcF9yZW1vdmVfc2lnbmFscworCisKKyNlbmRpZiAvLyBLTVBfSEFORExFX1NJR05BTFMKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZAorX19rbXBfZW5hYmxlKCBpbnQgbmV3X3N0YXRlICkKK3sKKyAgICAjaWZkZWYgS01QX0NBTkNFTF9USFJFQURTCisgICAgICAgIGludCBzdGF0dXMsIG9sZF9zdGF0ZTsKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9zZXRjYW5jZWxzdGF0ZSggbmV3X3N0YXRlLCAmIG9sZF9zdGF0ZSApOworICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfc2V0Y2FuY2Vsc3RhdGUiLCBzdGF0dXMgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggb2xkX3N0YXRlID09IFBUSFJFQURfQ0FOQ0VMX0RJU0FCTEUgKTsKKyAgICAjZW5kaWYKK30KKwordm9pZAorX19rbXBfZGlzYWJsZSggaW50ICogb2xkX3N0YXRlICkKK3sKKyAgICAjaWZkZWYgS01QX0NBTkNFTF9USFJFQURTCisgICAgICAgIGludCBzdGF0dXM7CisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfc2V0Y2FuY2Vsc3RhdGUoIFBUSFJFQURfQ0FOQ0VMX0RJU0FCTEUsIG9sZF9zdGF0ZSApOworICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfc2V0Y2FuY2Vsc3RhdGUiLCBzdGF0dXMgKTsKKyAgICAjZW5kaWYKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQKK19fa21wX2F0Zm9ya19wcmVwYXJlICh2b2lkKQoreworICAgIC8qICBub3RoaW5nIHRvIGRvICAqLworfQorCitzdGF0aWMgdm9pZAorX19rbXBfYXRmb3JrX3BhcmVudCAodm9pZCkKK3sKKyAgICAvKiAgbm90aGluZyB0byBkbyAgKi8KK30KKworLyoKKyAgICBSZXNldCB0aGUgbGlicmFyeSBzbyBleGVjdXRpb24gaW4gdGhlIGNoaWxkIHN0YXJ0cyAiYWxsIG92ZXIgYWdhaW4iIHdpdGgKKyAgICBjbGVhbiBkYXRhIHN0cnVjdHVyZXMgaW4gaW5pdGlhbCBzdGF0ZXMuICBEb24ndCB3b3JyeSBhYm91dCBmcmVlaW5nIG1lbW9yeQorICAgIGFsbG9jYXRlZCBieSBwYXJlbnQsIGp1c3QgYWJhbmRvbiBpdCB0byBiZSBzYWZlLgorKi8KK3N0YXRpYyB2b2lkCitfX2ttcF9hdGZvcmtfY2hpbGQgKHZvaWQpCit7CisgICAgLyogVE9ETyBtYWtlIHN1cmUgdGhpcyBpcyBkb25lIHJpZ2h0IGZvciBuZXN0ZWQvc2libGluZyAqLworICAgIC8vIEFUVDogIE1lbW9yeSBsZWFrcyBhcmUgaGVyZT8gVE9ETzogQ2hlY2sgaXQgYW5kIGZpeC4KKyAgICAvKiBLTVBfQVNTRVJUKCAwICk7ICovCisKKyAgICArK19fa21wX2ZvcmtfY291bnQ7CisKKyAgICBfX2ttcF9pbml0X3J1bnRpbWUgPSBGQUxTRTsKKyAgICBfX2ttcF9pbml0X21vbml0b3IgPSAwOworICAgIF9fa21wX2luaXRfcGFyYWxsZWwgPSBGQUxTRTsKKyAgICBfX2ttcF9pbml0X21pZGRsZSA9IEZBTFNFOworICAgIF9fa21wX2luaXRfc2VyaWFsID0gRkFMU0U7CisgICAgVENXXzQoX19rbXBfaW5pdF9ndGlkLCBGQUxTRSk7CisgICAgX19rbXBfaW5pdF9jb21tb24gPSBGQUxTRTsKKworICAgIFRDV180KF9fa21wX2luaXRfdXNlcl9sb2NrcywgRkFMU0UpOworI2lmICEgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKyAgICBfX2ttcF91c2VyX2xvY2tfdGFibGUudXNlZCA9IDE7CisgICAgX19rbXBfdXNlcl9sb2NrX3RhYmxlLmFsbG9jYXRlZCA9IDA7CisgICAgX19rbXBfdXNlcl9sb2NrX3RhYmxlLnRhYmxlID0gTlVMTDsKKyAgICBfX2ttcF9sb2NrX2Jsb2NrcyA9IE5VTEw7CisjZW5kaWYKKworICAgIF9fa21wX2FsbF9udGggPSAwOworICAgIFRDV180KF9fa21wX250aCwgMCk7CisKKyAgICAvKiBNdXN0IGFjdHVhbGx5IHplcm8gYWxsIHRoZSAqY2FjaGUgYXJndW1lbnRzIHBhc3NlZCB0byBfX2ttcGNfdGhyZWFkcHJpdmF0ZSBoZXJlCisgICAgICAgc28gdGhyZWFkcHJpdmF0ZSBkb2Vzbid0IHVzZSBzdGFsZSBkYXRhICovCisgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcF9hdGZvcmtfY2hpbGQ6IGNoZWNraW5nIGNhY2hlIGFkZHJlc3MgbGlzdCAlcFxuIiwKKyAgICAgICAgICAgICAgICAgX19rbXBfdGhyZWFkcHJpdl9jYWNoZV9saXN0ICkgKTsKKworICAgIHdoaWxlICggX19rbXBfdGhyZWFkcHJpdl9jYWNoZV9saXN0ICE9IE5VTEwgKSB7CisKKyAgICAgICAgaWYgKCAqX19rbXBfdGhyZWFkcHJpdl9jYWNoZV9saXN0IC0+IGFkZHIgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIEtDX1RSQUNFKCA1MCwgKCAiX19rbXBfYXRmb3JrX2NoaWxkOiB6ZXJvaW5nIGNhY2hlIGF0IGFkZHJlc3MgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAmKCpfX2ttcF90aHJlYWRwcml2X2NhY2hlX2xpc3QgLT4gYWRkcikgKSApOworCisgICAgICAgICAgICAqX19rbXBfdGhyZWFkcHJpdl9jYWNoZV9saXN0IC0+IGFkZHIgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIF9fa21wX3RocmVhZHByaXZfY2FjaGVfbGlzdCA9IF9fa21wX3RocmVhZHByaXZfY2FjaGVfbGlzdCAtPiBuZXh0OworICAgIH0KKworICAgIF9fa21wX2luaXRfcnVudGltZSA9IEZBTFNFOworCisgICAgLyogcmVzZXQgc3RhdGljYWxseSBpbml0aWFsaXplZCBsb2NrcyAqLworICAgIF9fa21wX2luaXRfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisgICAgX19rbXBfaW5pdF9ib290c3RyYXBfbG9jayggJl9fa21wX3N0ZGlvX2xvY2sgKTsKKyAgICBfX2ttcF9pbml0X2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfY29uc29sZV9sb2NrICk7CisKKyAgICAvKiBUaGlzIGlzIG5lY2Vzc2FyeSB0byBtYWtlIHN1cmUgbm8gc3RhbGUgZGF0YSBpcyBsZWZ0IGFyb3VuZCAqLworICAgIC8qIEFDOiBjdXN0b21lcnMgY29tcGxhaW4gdGhhdCB3ZSB1c2UgdW5zYWZlIHJvdXRpbmVzIGluIHRoZSBhdGZvcmsKKyAgICAgICBoYW5kbGVyLiBNYXRod29ya3M6IGRsc3ltKCkgaXMgdW5zYWZlLiBXZSBjYWxsIGRsc3ltIGFuZCBkbG9wZW4KKyAgICAgICBpbiBkeW5hbWljX2xpbmsgd2hlbiBjaGVjayB0aGUgcHJlc2VuY2Ugb2Ygc2hhcmVkIHRiYm1hbGxvYyBsaWJyYXJ5LgorICAgICAgIFN1Z2dlc3Rpb24gaXMgdG8gbWFrZSB0aGUgbGlicmFyeSBpbml0aWFsaXphdGlvbiBsYXppZXIsIHNpbWlsYXIKKyAgICAgICB0byB3aGF0IGRvbmUgZm9yIF9fa21wY19iZWdpbigpLiAqLworICAgIC8vIFRPRE86IHN5bmNocm9uaXplIGFsbCBzdGF0aWMgaW5pdGlhbGl6YXRpb25zIHdpdGggcmVndWxhciBsaWJyYXJ5CisgICAgLy8gICAgICAgc3RhcnR1cDsgbG9vayBhdCBrbXBfZ2xvYmFsLmMgYW5kIGV0Yy4KKyAgICAvL19fa21wX2ludGVybmFsX2JlZ2luICgpOworCit9CisKK3ZvaWQKK19fa21wX3JlZ2lzdGVyX2F0Zm9yayh2b2lkKSB7CisgICAgaWYgKCBfX2ttcF9uZWVkX3JlZ2lzdGVyX2F0Zm9yayApIHsKKyAgICAgICAgaW50IHN0YXR1cyA9IHB0aHJlYWRfYXRmb3JrKCBfX2ttcF9hdGZvcmtfcHJlcGFyZSwgX19rbXBfYXRmb3JrX3BhcmVudCwgX19rbXBfYXRmb3JrX2NoaWxkICk7CisgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9hdGZvcmsiLCBzdGF0dXMgKTsKKyAgICAgICAgX19rbXBfbmVlZF9yZWdpc3Rlcl9hdGZvcmsgPSBGQUxTRTsKKyAgICB9Cit9CisKK3ZvaWQKK19fa21wX3N1c3BlbmRfaW5pdGlhbGl6ZSggdm9pZCApCit7CisgICAgaW50IHN0YXR1czsKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4YXR0cl9pbml0KCAmX19rbXBfc3VzcGVuZF9tdXRleF9hdHRyICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX211dGV4YXR0cl9pbml0Iiwgc3RhdHVzICk7CisgICAgc3RhdHVzID0gcHRocmVhZF9jb25kYXR0cl9pbml0KCAmX19rbXBfc3VzcGVuZF9jb25kX2F0dHIgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfY29uZGF0dHJfaW5pdCIsIHN0YXR1cyApOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfc3VzcGVuZF9pbml0aWFsaXplX3RocmVhZCgga21wX2luZm9fdCAqdGggKQoreworICAgIGlmICggdGgtPnRoLnRoX3N1c3BlbmRfaW5pdF9jb3VudCA8PSBfX2ttcF9mb3JrX2NvdW50ICkgeworICAgICAgICAvKiB0aGlzIG1lYW5zIHdlIGhhdmVuJ3QgaW5pdGlhbGl6ZWQgdGhlIHN1c3BlbnNpb24gcHRocmVhZCBvYmplY3RzIGZvciB0aGlzIHRocmVhZAorICAgICAgICAgICBpbiB0aGlzIGluc3RhbmNlIG9mIHRoZSBwcm9jZXNzICovCisgICAgICAgIGludCAgICAgc3RhdHVzOworICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2NvbmRfaW5pdCggJnRoLT50aC50aF9zdXNwZW5kX2N2LmNfY29uZCwgJl9fa21wX3N1c3BlbmRfY29uZF9hdHRyICk7CisgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9jb25kX2luaXQiLCBzdGF0dXMgKTsKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF9pbml0KCAmdGgtPnRoLnRoX3N1c3BlbmRfbXgubV9tdXRleCwgJiBfX2ttcF9zdXNwZW5kX211dGV4X2F0dHIgKTsKKyAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX211dGV4X2luaXQiLCBzdGF0dXMgKTsKKyAgICAgICAgKih2b2xhdGlsZSBpbnQqKSZ0aC0+dGgudGhfc3VzcGVuZF9pbml0X2NvdW50ID0gX19rbXBfZm9ya19jb3VudCArIDE7CisgICAgfTsKK30KKwordm9pZAorX19rbXBfc3VzcGVuZF91bmluaXRpYWxpemVfdGhyZWFkKCBrbXBfaW5mb190ICp0aCApCit7CisgICAgaWYodGgtPnRoLnRoX3N1c3BlbmRfaW5pdF9jb3VudCA+IF9fa21wX2ZvcmtfY291bnQpIHsKKyAgICAgICAgLyogdGhpcyBtZWFucyB3ZSBoYXZlIGluaXRpYWxpemUgdGhlIHN1c3BlbnNpb24gcHRocmVhZCBvYmplY3RzIGZvciB0aGlzIHRocmVhZAorICAgICAgICAgICBpbiB0aGlzIGluc3RhbmNlIG9mIHRoZSBwcm9jZXNzICovCisgICAgICAgIGludCBzdGF0dXM7CisKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9jb25kX2Rlc3Ryb3koICZ0aC0+dGgudGhfc3VzcGVuZF9jdi5jX2NvbmQgKTsKKyAgICAgICAgaWYgKCBzdGF0dXMgIT0gMCAmJiBzdGF0dXMgIT0gRUJVU1kgKSB7CisgICAgICAgICAgICBLTVBfU1lTRkFJTCggInB0aHJlYWRfY29uZF9kZXN0cm95Iiwgc3RhdHVzICk7CisgICAgICAgIH07CisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfZGVzdHJveSggJnRoLT50aC50aF9zdXNwZW5kX214Lm1fbXV0ZXggKTsKKyAgICAgICAgaWYgKCBzdGF0dXMgIT0gMCAmJiBzdGF0dXMgIT0gRUJVU1kgKSB7CisgICAgICAgICAgICBLTVBfU1lTRkFJTCggInB0aHJlYWRfbXV0ZXhfZGVzdHJveSIsIHN0YXR1cyApOworICAgICAgICB9OworICAgICAgICAtLXRoLT50aC50aF9zdXNwZW5kX2luaXRfY291bnQ7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGgtPnRoLnRoX3N1c3BlbmRfaW5pdF9jb3VudCA9PSBfX2ttcF9mb3JrX2NvdW50KTsKKyAgICB9Cit9CisKKy8qIFRoaXMgcm91dGluZSBwdXRzIHRoZSBjYWxsaW5nIHRocmVhZCB0byBzbGVlcCBhZnRlciBzZXR0aW5nIHRoZQorICogc2xlZXAgYml0IGZvciB0aGUgaW5kaWNhdGVkIGZsYWcgdmFyaWFibGUgdG8gdHJ1ZS4KKyAqLwordGVtcGxhdGUgPGNsYXNzIEM+CitzdGF0aWMgaW5saW5lIHZvaWQgX19rbXBfc3VzcGVuZF90ZW1wbGF0ZSggaW50IHRoX2d0aWQsIEMgKmZsYWcgKQoreworICAgIEtNUF9USU1FX0RFVkVMT1BFUl9CTE9DSyhVU0VSX3N1c3BlbmQpOworICAgIGttcF9pbmZvX3QgKnRoID0gX19rbXBfdGhyZWFkc1t0aF9ndGlkXTsKKyAgICBpbnQgc3RhdHVzOworICAgIHR5cGVuYW1lIEM6OmZsYWdfdCBvbGRfc3BpbjsKKworICAgIEtGX1RSQUNFKCAzMCwgKCJfX2ttcF9zdXNwZW5kX3RlbXBsYXRlOiBUIyVkIGVudGVyIGZvciBmbGFnID0gJXBcbiIsIHRoX2d0aWQsIGZsYWctPmdldCgpICkgKTsKKworICAgIF9fa21wX3N1c3BlbmRfaW5pdGlhbGl6ZV90aHJlYWQoIHRoICk7CisKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2xvY2soICZ0aC0+dGgudGhfc3VzcGVuZF9teC5tX211dGV4ICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX211dGV4X2xvY2siLCBzdGF0dXMgKTsKKworICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfc3VzcGVuZF90ZW1wbGF0ZTogVCMlZCBzZXR0aW5nIHNsZWVwIGJpdCBmb3Igc3BpbiglcClcbiIsCisgICAgICAgICAgICAgICAgICAgIHRoX2d0aWQsIGZsYWctPmdldCgpICkgKTsKKworICAgIC8qIFRPRE86IHNob3VsZG4ndCB0aGlzIHVzZSByZWxlYXNlIHNlbWFudGljcyB0byBlbnN1cmUgdGhhdCBfX2ttcF9zdXNwZW5kX2luaXRpYWxpemVfdGhyZWFkCisgICAgICAgZ2V0cyBjYWxsZWQgZmlyc3Q/CisgICAgKi8KKyAgICBvbGRfc3BpbiA9IGZsYWctPnNldF9zbGVlcGluZygpOworCisgICAgS0ZfVFJBQ0UoIDUsICggIl9fa21wX3N1c3BlbmRfdGVtcGxhdGU6IFQjJWQgc2V0IHNsZWVwIGJpdCBmb3Igc3BpbiglcCk9PSV4LCB3YXMgJXhcbiIsCisgICAgICAgICAgICAgICAgICAgdGhfZ3RpZCwgZmxhZy0+Z2V0KCksICooZmxhZy0+Z2V0KCkpLCBvbGRfc3BpbiApICk7CisKKyAgICBpZiAoIGZsYWctPmRvbmVfY2hlY2tfdmFsKG9sZF9zcGluKSApIHsKKyAgICAgICAgb2xkX3NwaW4gPSBmbGFnLT51bnNldF9zbGVlcGluZygpOworICAgICAgICBLRl9UUkFDRSggNSwgKCAiX19rbXBfc3VzcGVuZF90ZW1wbGF0ZTogVCMlZCBmYWxzZSBhbGFybSwgcmVzZXQgc2xlZXAgYml0IGZvciBzcGluKCVwKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgdGhfZ3RpZCwgZmxhZy0+Z2V0KCkpICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogRW5jYXBzdWxhdGUgaW4gYSBsb29wIGFzIHRoZSBkb2N1bWVudGF0aW9uIHN0YXRlcyB0aGF0IHRoaXMgbWF5CisgICAgICAgICAqICJ3aXRoIGxvdyBwcm9iYWJpbGl0eSIgcmV0dXJuIHdoZW4gdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSBoYXMKKyAgICAgICAgICogbm90IGJlZW4gc2lnbmFsZWQgb3IgYnJvYWRjYXN0CisgICAgICAgICAqLworICAgICAgICBpbnQgZGVhY3RpdmF0ZWQgPSBGQUxTRTsKKyAgICAgICAgVENXX1BUUih0aC0+dGgudGhfc2xlZXBfbG9jLCAodm9pZCAqKWZsYWcpOworICAgICAgICB3aGlsZSAoIGZsYWctPmlzX3NsZWVwaW5nKCkgKSB7CisjaWZkZWYgREVCVUdfU1VTUEVORAorICAgICAgICAgICAgY2hhciBidWZmZXJbMTI4XTsKKyAgICAgICAgICAgIF9fa21wX3N1c3BlbmRfY291bnQrKzsKKyAgICAgICAgICAgIF9fa21wX3ByaW50X2NvbmQoIGJ1ZmZlciwgJnRoLT50aC50aF9zdXNwZW5kX2N2ICk7CisgICAgICAgICAgICBfX2ttcF9wcmludGYoICJfX2ttcF9zdXNwZW5kX3RlbXBsYXRlOiBzdXNwZW5kaW5nIFQjJWQ6ICVzXG4iLCB0aF9ndGlkLCBidWZmZXIgKTsKKyNlbmRpZgorICAgICAgICAgICAgLy8gTWFyayB0aGUgdGhyZWFkIGFzIG5vIGxvbmdlciBhY3RpdmUgKG9ubHkgaW4gdGhlIGZpcnN0IGl0ZXJhdGlvbiBvZiB0aGUgbG9vcCkuCisgICAgICAgICAgICBpZiAoICEgZGVhY3RpdmF0ZWQgKSB7CisgICAgICAgICAgICAgICAgdGgtPnRoLnRoX2FjdGl2ZSA9IEZBTFNFOworICAgICAgICAgICAgICAgIGlmICggdGgtPnRoLnRoX2FjdGl2ZV9pbl9wb29sICkgeworICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfYWN0aXZlX2luX3Bvb2wgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgS01QX1RFU1RfVEhFTl9ERUMzMigKKyAgICAgICAgICAgICAgICAgICAgICAoa21wX2ludDMyICopICZfX2ttcF90aHJlYWRfcG9vbF9hY3RpdmVfbnRoICk7CisgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIFRDUl80KF9fa21wX3RocmVhZF9wb29sX2FjdGl2ZV9udGgpID49IDAgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVhY3RpdmF0ZWQgPSBUUlVFOworCisKKyAgICAgICAgICAgIH0KKworI2lmIFVTRV9TVVNQRU5EX1RJTUVPVVQKKyAgICAgICAgICAgIHN0cnVjdCB0aW1lc3BlYyAgbm93OworICAgICAgICAgICAgc3RydWN0IHRpbWV2YWwgICB0dmFsOworICAgICAgICAgICAgaW50IG1zZWNzOworCisgICAgICAgICAgICBzdGF0dXMgPSBnZXR0aW1lb2ZkYXkoICZ0dmFsLCBOVUxMICk7CisgICAgICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTF9FUlJOTyggImdldHRpbWVvZmRheSIsIHN0YXR1cyApOworICAgICAgICAgICAgVElNRVZBTF9UT19USU1FU1BFQyggJnR2YWwsICZub3cgKTsKKworICAgICAgICAgICAgbXNlY3MgPSAoNCpfX2ttcF9kZmx0X2Jsb2NrdGltZSkgKyAyMDA7CisgICAgICAgICAgICBub3cudHZfc2VjICArPSBtc2VjcyAvIDEwMDA7CisgICAgICAgICAgICBub3cudHZfbnNlYyArPSAobXNlY3MgJSAxMDAwKSoxMDAwOworCisgICAgICAgICAgICBLRl9UUkFDRSggMTUsICggIl9fa21wX3N1c3BlbmRfdGVtcGxhdGU6IFQjJWQgYWJvdXQgdG8gcGVyZm9ybSBwdGhyZWFkX2NvbmRfdGltZWR3YWl0XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoX2d0aWQgKSApOworICAgICAgICAgICAgc3RhdHVzID0gcHRocmVhZF9jb25kX3RpbWVkd2FpdCggJnRoLT50aC50aF9zdXNwZW5kX2N2LmNfY29uZCwgJnRoLT50aC50aF9zdXNwZW5kX214Lm1fbXV0ZXgsICYgbm93ICk7CisjZWxzZQorICAgICAgICAgICAgS0ZfVFJBQ0UoIDE1LCAoICJfX2ttcF9zdXNwZW5kX3RlbXBsYXRlOiBUIyVkIGFib3V0IHRvIHBlcmZvcm0gcHRocmVhZF9jb25kX3dhaXRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhfZ3RpZCApICk7CisgICAgICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2NvbmRfd2FpdCggJnRoLT50aC50aF9zdXNwZW5kX2N2LmNfY29uZCwgJnRoLT50aC50aF9zdXNwZW5kX214Lm1fbXV0ZXggKTsKKyNlbmRpZgorCisgICAgICAgICAgICBpZiAoIChzdGF0dXMgIT0gMCkgJiYgKHN0YXR1cyAhPSBFSU5UUikgJiYgKHN0YXR1cyAhPSBFVElNRURPVVQpICkgeworICAgICAgICAgICAgICAgIEtNUF9TWVNGQUlMKCAicHRocmVhZF9jb25kX3dhaXQiLCBzdGF0dXMgKTsKKyAgICAgICAgICAgIH0KKyNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gRVRJTUVET1VUKSB7CisgICAgICAgICAgICAgICAgaWYgKCBmbGFnLT5pc19zbGVlcGluZygpICkgeworICAgICAgICAgICAgICAgICAgICBLRl9UUkFDRSggMTAwLCAoICJfX2ttcF9zdXNwZW5kX3RlbXBsYXRlOiBUIyVkIHRpbWVvdXQgd2FrZXVwXG4iLCB0aF9ndGlkICkgKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBLRl9UUkFDRSggMiwgKCAiX19rbXBfc3VzcGVuZF90ZW1wbGF0ZTogVCMlZCB0aW1lb3V0IHdha2V1cCwgc2xlZXAgYml0IG5vdCBzZXQhXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aF9ndGlkICkgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKCBmbGFnLT5pc19zbGVlcGluZygpICkgeworICAgICAgICAgICAgICAgIEtGX1RSQUNFKCAxMDAsICggIl9fa21wX3N1c3BlbmRfdGVtcGxhdGU6IFQjJWQgc3B1cmlvdXMgd2FrZXVwXG4iLCB0aF9ndGlkICkgKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9IC8vIHdoaWxlCisKKyAgICAgICAgLy8gTWFyayB0aGUgdGhyZWFkIGFzIGFjdGl2ZSBhZ2FpbiAoaWYgaXQgd2FzIHByZXZpb3VzIG1hcmtlZCBhcyBpbmFjdGl2ZSkKKyAgICAgICAgaWYgKCBkZWFjdGl2YXRlZCApIHsKKyAgICAgICAgICAgIHRoLT50aC50aF9hY3RpdmUgPSBUUlVFOworICAgICAgICAgICAgaWYgKCBUQ1JfNCh0aC0+dGgudGhfaW5fcG9vbCkgKSB7CisgICAgICAgICAgICAgICAgS01QX1RFU1RfVEhFTl9JTkMzMiggKGttcF9pbnQzMiAqKSAmX19rbXBfdGhyZWFkX3Bvb2xfYWN0aXZlX250aCApOworICAgICAgICAgICAgICAgIHRoLT50aC50aF9hY3RpdmVfaW5fcG9vbCA9IFRSVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyNpZmRlZiBERUJVR19TVVNQRU5ECisgICAgeworICAgICAgICBjaGFyIGJ1ZmZlclsxMjhdOworICAgICAgICBfX2ttcF9wcmludF9jb25kKCBidWZmZXIsICZ0aC0+dGgudGhfc3VzcGVuZF9jdik7CisgICAgICAgIF9fa21wX3ByaW50ZiggIl9fa21wX3N1c3BlbmRfdGVtcGxhdGU6IFQjJWQgaGFzIGF3YWtlbmVkOiAlc1xuIiwgdGhfZ3RpZCwgYnVmZmVyICk7CisgICAgfQorI2VuZGlmCisKKworICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCAmdGgtPnRoLnRoX3N1c3BlbmRfbXgubV9tdXRleCApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9tdXRleF91bmxvY2siLCBzdGF0dXMgKTsKKworICAgIEtGX1RSQUNFKCAzMCwgKCJfX2ttcF9zdXNwZW5kX3RlbXBsYXRlOiBUIyVkIGV4aXRcbiIsIHRoX2d0aWQgKSApOworfQorCit2b2lkIF9fa21wX3N1c3BlbmRfMzIoaW50IHRoX2d0aWQsIGttcF9mbGFnXzMyICpmbGFnKSB7CisgICAgX19rbXBfc3VzcGVuZF90ZW1wbGF0ZSh0aF9ndGlkLCBmbGFnKTsKK30KK3ZvaWQgX19rbXBfc3VzcGVuZF82NChpbnQgdGhfZ3RpZCwga21wX2ZsYWdfNjQgKmZsYWcpIHsKKyAgICBfX2ttcF9zdXNwZW5kX3RlbXBsYXRlKHRoX2d0aWQsIGZsYWcpOworfQordm9pZCBfX2ttcF9zdXNwZW5kX29uY29yZShpbnQgdGhfZ3RpZCwga21wX2ZsYWdfb25jb3JlICpmbGFnKSB7CisgICAgX19rbXBfc3VzcGVuZF90ZW1wbGF0ZSh0aF9ndGlkLCBmbGFnKTsKK30KKworCisvKiBUaGlzIHJvdXRpbmUgc2lnbmFscyB0aGUgdGhyZWFkIHNwZWNpZmllZCBieSB0YXJnZXRfZ3RpZCB0byB3YWtlIHVwCisgKiBhZnRlciBzZXR0aW5nIHRoZSBzbGVlcCBiaXQgaW5kaWNhdGVkIGJ5IHRoZSBmbGFnIGFyZ3VtZW50IHRvIEZBTFNFLgorICogVGhlIHRhcmdldCB0aHJlYWQgbXVzdCBhbHJlYWR5IGhhdmUgY2FsbGVkIF9fa21wX3N1c3BlbmRfdGVtcGxhdGUoKQorICovCit0ZW1wbGF0ZSA8Y2xhc3MgQz4KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2ttcF9yZXN1bWVfdGVtcGxhdGUoIGludCB0YXJnZXRfZ3RpZCwgQyAqZmxhZyApCit7CisgICAgS01QX1RJTUVfREVWRUxPUEVSX0JMT0NLKFVTRVJfcmVzdW1lKTsKKyAgICBrbXBfaW5mb190ICp0aCA9IF9fa21wX3RocmVhZHNbdGFyZ2V0X2d0aWRdOworICAgIGludCBzdGF0dXM7CisKKyNpZmRlZiBLTVBfREVCVUcKKyAgICBpbnQgZ3RpZCA9IFRDUl80KF9fa21wX2luaXRfZ3RpZCkgPyBfX2ttcF9nZXRfZ3RpZCgpIDogLTE7CisjZW5kaWYKKworICAgIEtGX1RSQUNFKCAzMCwgKCAiX19rbXBfcmVzdW1lX3RlbXBsYXRlOiBUIyVkIHdhbnRzIHRvIHdha2V1cCBUIyVkIGVudGVyXG4iLCBndGlkLCB0YXJnZXRfZ3RpZCApICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCAhPSB0YXJnZXRfZ3RpZCApOworCisgICAgX19rbXBfc3VzcGVuZF9pbml0aWFsaXplX3RocmVhZCggdGggKTsKKworICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfbG9jayggJnRoLT50aC50aF9zdXNwZW5kX214Lm1fbXV0ZXggKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfbXV0ZXhfbG9jayIsIHN0YXR1cyApOworCisgICAgaWYgKCFmbGFnKSB7IC8vIGNvbWluZyBmcm9tIF9fa21wX251bGxfcmVzdW1lX3dyYXBwZXIKKyAgICAgICAgZmxhZyA9IChDICopdGgtPnRoLnRoX3NsZWVwX2xvYzsKKyAgICB9CisKKyAgICAvLyBGaXJzdCwgY2hlY2sgaWYgdGhlIGZsYWcgaXMgbnVsbCBvciBpdHMgdHlwZSBoYXMgY2hhbmdlZC4gSWYgc28sIHNvbWVvbmUgZWxzZSB3b2tlIGl0IHVwLgorICAgIGlmICghZmxhZyB8fCBmbGFnLT5nZXRfdHlwZSgpICE9IGZsYWctPmdldF9wdHJfdHlwZSgpKSB7IC8vIGdldF9wdHJfdHlwZSBzaW1wbHkgc2hvd3Mgd2hhdCBmbGFnIHdhcyBjYXN0IHRvCisgICAgICAgIEtGX1RSQUNFKCA1LCAoICJfX2ttcF9yZXN1bWVfdGVtcGxhdGU6IFQjJWQgZXhpdGluZywgdGhyZWFkIFQjJWQgYWxyZWFkeSBhd2FrZTogZmxhZyglcClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRhcmdldF9ndGlkLCBOVUxMICkgKTsKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF91bmxvY2soICZ0aC0+dGgudGhfc3VzcGVuZF9teC5tX211dGV4ICk7CisgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9tdXRleF91bmxvY2siLCBzdGF0dXMgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBlbHNlIHsgLy8gaWYgbXVsdGlwbGUgdGhyZWFkcyBhcmUgc2xlZXBpbmcsIGZsYWcgc2hvdWxkIGJlIGludGVybmFsbHkgcmVmZXJyaW5nIHRvIGEgc3BlY2lmaWMgdGhyZWFkIGhlcmUKKyAgICAgICAgdHlwZW5hbWUgQzo6ZmxhZ190IG9sZF9zcGluID0gZmxhZy0+dW5zZXRfc2xlZXBpbmcoKTsKKyAgICAgICAgaWYgKCAhIGZsYWctPmlzX3NsZWVwaW5nX3ZhbChvbGRfc3BpbikgKSB7CisgICAgICAgICAgICBLRl9UUkFDRSggNSwgKCAiX19rbXBfcmVzdW1lX3RlbXBsYXRlOiBUIyVkIGV4aXRpbmcsIHRocmVhZCBUIyVkIGFscmVhZHkgYXdha2U6IGZsYWcoJXApOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXUgPT4gJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0YXJnZXRfZ3RpZCwgZmxhZy0+Z2V0KCksIG9sZF9zcGluLCAqZmxhZy0+Z2V0KCkgKSApOworCisgICAgICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X3VubG9jayggJnRoLT50aC50aF9zdXNwZW5kX214Lm1fbXV0ZXggKTsKKyAgICAgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9tdXRleF91bmxvY2siLCBzdGF0dXMgKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBLRl9UUkFDRSggNSwgKCAiX19rbXBfcmVzdW1lX3RlbXBsYXRlOiBUIyVkIGFib3V0IHRvIHdha2V1cCBUIyVkLCByZXNldCBzbGVlcCBiaXQgZm9yIGZsYWcncyBsb2MoJXApOiAiCisgICAgICAgICAgICAgICAgICAgICAgICIldSA9PiAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFyZ2V0X2d0aWQsIGZsYWctPmdldCgpLCBvbGRfc3BpbiwgKmZsYWctPmdldCgpICkgKTsKKyAgICB9CisgICAgVENXX1BUUih0aC0+dGgudGhfc2xlZXBfbG9jLCBOVUxMKTsKKworCisjaWZkZWYgREVCVUdfU1VTUEVORAorICAgIHsKKyAgICAgICAgY2hhciBidWZmZXJbMTI4XTsKKyAgICAgICAgX19rbXBfcHJpbnRfY29uZCggYnVmZmVyLCAmdGgtPnRoLnRoX3N1c3BlbmRfY3YgKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCAiX19rbXBfcmVzdW1lX3RlbXBsYXRlOiBUIyVkIHJlc3VtaW5nIFQjJWQ6ICVzXG4iLCBndGlkLCB0YXJnZXRfZ3RpZCwgYnVmZmVyICk7CisgICAgfQorI2VuZGlmCisKKworICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZF9zaWduYWwoICZ0aC0+dGgudGhfc3VzcGVuZF9jdi5jX2NvbmQgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfY29uZF9zaWduYWwiLCBzdGF0dXMgKTsKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X3VubG9jayggJnRoLT50aC50aF9zdXNwZW5kX214Lm1fbXV0ZXggKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfbXV0ZXhfdW5sb2NrIiwgc3RhdHVzICk7CisgICAgS0ZfVFJBQ0UoIDMwLCAoICJfX2ttcF9yZXN1bWVfdGVtcGxhdGU6IFQjJWQgZXhpdGluZyBhZnRlciBzaWduYWxpbmcgd2FrZSB1cCBmb3IgVCMlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFyZ2V0X2d0aWQgKSApOworfQorCit2b2lkIF9fa21wX3Jlc3VtZV8zMihpbnQgdGFyZ2V0X2d0aWQsIGttcF9mbGFnXzMyICpmbGFnKSB7CisgICAgX19rbXBfcmVzdW1lX3RlbXBsYXRlKHRhcmdldF9ndGlkLCBmbGFnKTsKK30KK3ZvaWQgX19rbXBfcmVzdW1lXzY0KGludCB0YXJnZXRfZ3RpZCwga21wX2ZsYWdfNjQgKmZsYWcpIHsKKyAgICBfX2ttcF9yZXN1bWVfdGVtcGxhdGUodGFyZ2V0X2d0aWQsIGZsYWcpOworfQordm9pZCBfX2ttcF9yZXN1bWVfb25jb3JlKGludCB0YXJnZXRfZ3RpZCwga21wX2ZsYWdfb25jb3JlICpmbGFnKSB7CisgICAgX19rbXBfcmVzdW1lX3RlbXBsYXRlKHRhcmdldF9ndGlkLCBmbGFnKTsKK30KKwordm9pZAorX19rbXBfcmVzdW1lX21vbml0b3IoKQoreworICAgIGludCBzdGF0dXM7CisjaWZkZWYgS01QX0RFQlVHCisgICAgaW50IGd0aWQgPSBUQ1JfNChfX2ttcF9pbml0X2d0aWQpID8gX19rbXBfZ2V0X2d0aWQoKSA6IC0xOworICAgIEtGX1RSQUNFKCAzMCwgKCAiX19rbXBfcmVzdW1lX21vbml0b3I6IFQjJWQgd2FudHMgdG8gd2FrZXVwIFQjJWQgZW50ZXJcbiIsCisgICAgICAgICAgICAgICAgICAgIGd0aWQsIEtNUF9HVElEX01PTklUT1IgKSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIGd0aWQgIT0gS01QX0dUSURfTU9OSVRPUiApOworI2VuZGlmCisgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF9sb2NrKCAmX19rbXBfd2FpdF9teC5tX211dGV4ICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX211dGV4X2xvY2siLCBzdGF0dXMgKTsKKyNpZmRlZiBERUJVR19TVVNQRU5ECisgICAgeworICAgICAgICBjaGFyIGJ1ZmZlclsxMjhdOworICAgICAgICBfX2ttcF9wcmludF9jb25kKCBidWZmZXIsICZfX2ttcF93YWl0X2N2LmNfY29uZCApOworICAgICAgICBfX2ttcF9wcmludGYoICJfX2ttcF9yZXN1bWVfbW9uaXRvcjogVCMlZCByZXN1bWluZyBUIyVkOiAlc1xuIiwgZ3RpZCwgS01QX0dUSURfTU9OSVRPUiwgYnVmZmVyICk7CisgICAgfQorI2VuZGlmCisgICAgc3RhdHVzID0gcHRocmVhZF9jb25kX3NpZ25hbCggJl9fa21wX3dhaXRfY3YuY19jb25kICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX2NvbmRfc2lnbmFsIiwgc3RhdHVzICk7CisgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF91bmxvY2soICZfX2ttcF93YWl0X214Lm1fbXV0ZXggKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfbXV0ZXhfdW5sb2NrIiwgc3RhdHVzICk7CisgICAgS0ZfVFJBQ0UoIDMwLCAoICJfX2ttcF9yZXN1bWVfbW9uaXRvcjogVCMlZCBleGl0aW5nIGFmdGVyIHNpZ25hbGluZyB3YWtlIHVwIGZvciBUIyVkXG4iLAorICAgICAgICAgICAgICAgICAgICBndGlkLCBLTVBfR1RJRF9NT05JVE9SICkgKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZAorX19rbXBfeWllbGQoIGludCBjb25kICkKK3sKKyAgICBpZiAoY29uZCAmJiBfX2ttcF95aWVsZGluZ19vbikgeworICAgICAgICBzY2hlZF95aWVsZCgpOworICAgIH0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZAorX19rbXBfZ3RpZF9zZXRfc3BlY2lmaWMoIGludCBndGlkICkKK3sKKyAgICBpbnQgc3RhdHVzOworICAgIEtNUF9BU1NFUlQoIF9fa21wX2luaXRfcnVudGltZSApOworICAgIHN0YXR1cyA9IHB0aHJlYWRfc2V0c3BlY2lmaWMoIF9fa21wX2d0aWRfdGhyZWFkcHJpdmF0ZV9rZXksICh2b2lkKikoaW50cHRyX3QpKGd0aWQrMSkgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfc2V0c3BlY2lmaWMiLCBzdGF0dXMgKTsKK30KKworaW50CitfX2ttcF9ndGlkX2dldF9zcGVjaWZpYygpCit7CisgICAgaW50IGd0aWQ7CisgICAgaWYgKCAhX19rbXBfaW5pdF9ydW50aW1lICkgeworICAgICAgICBLQV9UUkFDRSggNTAsICgiX19rbXBfZ2V0X3NwZWNpZmljOiBydW50aW1lIHNodXRkb3duLCByZXR1cm5pbmcgS01QX0dUSURfU0hVVERPV05cbiIgKSApOworICAgICAgICByZXR1cm4gS01QX0dUSURfU0hVVERPV047CisgICAgfQorICAgIGd0aWQgPSAoaW50KShzaXplX3QpcHRocmVhZF9nZXRzcGVjaWZpYyggX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSApOworICAgIGlmICggZ3RpZCA9PSAwICkgeworICAgICAgICBndGlkID0gS01QX0dUSURfRE5FOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZ3RpZC0tOworICAgIH0KKyAgICBLQV9UUkFDRSggNTAsICgiX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWM6IGtleTolZCBndGlkOiVkXG4iLAorICAgICAgICAgICAgICAgX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSwgZ3RpZCApKTsKKyAgICByZXR1cm4gZ3RpZDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworZG91YmxlCitfX2ttcF9yZWFkX2NwdV90aW1lKCB2b2lkICkKK3sKKyAgICAvKmNsb2NrX3QgICB0OyovCisgICAgc3RydWN0IHRtcyAgYnVmZmVyOworCisgICAgLyp0ID0qLyAgdGltZXMoICYgYnVmZmVyICk7CisKKyAgICByZXR1cm4gKGJ1ZmZlci50bXNfdXRpbWUgKyBidWZmZXIudG1zX2N1dGltZSkgLyAoZG91YmxlKSBDTE9DS1NfUEVSX1NFQzsKK30KKworaW50CitfX2ttcF9yZWFkX3N5c3RlbV9pbmZvKCBzdHJ1Y3Qga21wX3N5c19pbmZvICppbmZvICkKK3sKKyAgICBpbnQgc3RhdHVzOworICAgIHN0cnVjdCBydXNhZ2Ugcl91c2FnZTsKKworICAgIG1lbXNldCggaW5mbywgMCwgc2l6ZW9mKCAqaW5mbyApICk7CisKKyAgICBzdGF0dXMgPSBnZXRydXNhZ2UoIFJVU0FHRV9TRUxGLCAmcl91c2FnZSk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUxfRVJSTk8oICJnZXRydXNhZ2UiLCBzdGF0dXMgKTsKKworICAgIGluZm8tPm1heHJzcyAgPSByX3VzYWdlLnJ1X21heHJzczsgIC8qIHRoZSBtYXhpbXVtIHJlc2lkZW50IHNldCBzaXplIHV0aWxpemVkIChpbiBraWxvYnl0ZXMpICAgICAqLworICAgIGluZm8tPm1pbmZsdCAgPSByX3VzYWdlLnJ1X21pbmZsdDsgIC8qIHRoZSBudW1iZXIgb2YgcGFnZSBmYXVsdHMgc2VydmljZWQgd2l0aG91dCBhbnkgSS9PICAgICAgICAqLworICAgIGluZm8tPm1hamZsdCAgPSByX3VzYWdlLnJ1X21hamZsdDsgIC8qIHRoZSBudW1iZXIgb2YgcGFnZSBmYXVsdHMgc2VydmljZWQgdGhhdCByZXF1aXJlZCBJL08gICAgICAqLworICAgIGluZm8tPm5zd2FwICAgPSByX3VzYWdlLnJ1X25zd2FwOyAgIC8qIHRoZSBudW1iZXIgb2YgdGltZXMgYSBwcm9jZXNzIHdhcyAic3dhcHBlZCIgb3V0IG9mIG1lbW9yeSAqLworICAgIGluZm8tPmluYmxvY2sgPSByX3VzYWdlLnJ1X2luYmxvY2s7IC8qIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGZpbGUgc3lzdGVtIGhhZCB0byBwZXJmb3JtIGlucHV0ICAqLworICAgIGluZm8tPm91YmxvY2sgPSByX3VzYWdlLnJ1X291YmxvY2s7IC8qIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGZpbGUgc3lzdGVtIGhhZCB0byBwZXJmb3JtIG91dHB1dCAqLworICAgIGluZm8tPm52Y3N3ICAgPSByX3VzYWdlLnJ1X252Y3N3OyAgIC8qIHRoZSBudW1iZXIgb2YgdGltZXMgYSBjb250ZXh0IHN3aXRjaCB3YXMgdm9sdW50YXJpbHkgICAgICAqLworICAgIGluZm8tPm5pdmNzdyAgPSByX3VzYWdlLnJ1X25pdmNzdzsgIC8qIHRoZSBudW1iZXIgb2YgdGltZXMgYSBjb250ZXh0IHN3aXRjaCB3YXMgZm9yY2VkICAgICAgICAgICAqLworCisgICAgcmV0dXJuIChzdGF0dXMgIT0gMCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQKK19fa21wX3JlYWRfc3lzdGVtX3RpbWUoIGRvdWJsZSAqZGVsdGEgKQoreworICAgIGRvdWJsZSAgICAgICAgICAgICAgdF9uczsKKyAgICBzdHJ1Y3QgdGltZXZhbCAgICAgIHR2YWw7CisgICAgc3RydWN0IHRpbWVzcGVjICAgICBzdG9wOworICAgIGludCBzdGF0dXM7CisKKyAgICBzdGF0dXMgPSBnZXR0aW1lb2ZkYXkoICZ0dmFsLCBOVUxMICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUxfRVJSTk8oICJnZXR0aW1lb2ZkYXkiLCBzdGF0dXMgKTsKKyAgICBUSU1FVkFMX1RPX1RJTUVTUEVDKCAmdHZhbCwgJnN0b3AgKTsKKyAgICB0X25zID0gVFMyTlMoc3RvcCkgLSBUUzJOUyhfX2ttcF9zeXNfdGltZXJfZGF0YS5zdGFydCk7CisgICAgKmRlbHRhID0gKHRfbnMgKiAxZS05KTsKK30KKwordm9pZAorX19rbXBfY2xlYXJfc3lzdGVtX3RpbWUoIHZvaWQgKQoreworICAgIHN0cnVjdCB0aW1ldmFsIHR2YWw7CisgICAgaW50IHN0YXR1czsKKyAgICBzdGF0dXMgPSBnZXR0aW1lb2ZkYXkoICZ0dmFsLCBOVUxMICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUxfRVJSTk8oICJnZXR0aW1lb2ZkYXkiLCBzdGF0dXMgKTsKKyAgICBUSU1FVkFMX1RPX1RJTUVTUEVDKCAmdHZhbCwgJl9fa21wX3N5c190aW1lcl9kYXRhLnN0YXJ0ICk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZmRlZiBCVUlMRF9UVgorCit2b2lkCitfX2ttcF90dl90aHJlYWRwcml2YXRlX3N0b3JlKCBrbXBfaW5mb190ICp0aCwgdm9pZCAqZ2xvYmFsX2FkZHIsIHZvaWQgKnRocmVhZF9hZGRyICkKK3sKKyAgICBzdHJ1Y3QgdHZfZGF0YSAqcDsKKworICAgIHAgPSAoc3RydWN0IHR2X2RhdGEgKikgX19rbXBfYWxsb2NhdGUoIHNpemVvZiggKnAgKSApOworCisgICAgcC0+dS50cC5nbG9iYWxfYWRkciA9IGdsb2JhbF9hZGRyOworICAgIHAtPnUudHAudGhyZWFkX2FkZHIgPSB0aHJlYWRfYWRkcjsKKworICAgIHAtPnR5cGUgPSAodm9pZCAqKSAxOworCisgICAgcC0+bmV4dCA9ICB0aC0+dGgudGhfbG9jYWwudHZfZGF0YTsKKyAgICB0aC0+dGgudGhfbG9jYWwudHZfZGF0YSA9IHA7CisKKyAgICBpZiAoIHAtPm5leHQgPT0gMCApIHsKKyAgICAgICAgaW50IHJjID0gcHRocmVhZF9zZXRzcGVjaWZpYyggX19rbXBfdHZfa2V5LCBwICk7CisgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9zZXRzcGVjaWZpYyIsIHJjICk7CisgICAgfQorfQorCisjZW5kaWYgLyogQlVJTERfVFYgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludAorX19rbXBfZ2V0X3hwcm9jKCB2b2lkICkgeworCisgICAgaW50IHIgPSAwOworCisgICAgI2lmIEtNUF9PU19MSU5VWCB8fCBLTVBfT1NfRlJFRUJTRCB8fCBLTVBfT1NfTkVUQlNECisKKyAgICAgICAgciA9IHN5c2NvbmYoIF9TQ19OUFJPQ0VTU09SU19PTkxOICk7CisKKyAgICAjZWxpZiBLTVBfT1NfREFSV0lOCisKKyAgICAgICAgLy8gQnVnIEM3NzAxMSBIaWdoICJPcGVuTVAgVGhyZWFkcyBhbmQgbnVtYmVyIG9mIGFjdGl2ZSBjb3JlcyIuCisKKyAgICAgICAgLy8gRmluZCB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBDUFVzLgorICAgICAgICBrZXJuX3JldHVybl90ICAgICAgICAgIHJjOworICAgICAgICBob3N0X2Jhc2ljX2luZm9fZGF0YV90IGluZm87CisgICAgICAgIG1hY2hfbXNnX3R5cGVfbnVtYmVyX3QgbnVtID0gSE9TVF9CQVNJQ19JTkZPX0NPVU5UOworICAgICAgICByYyA9IGhvc3RfaW5mbyggbWFjaF9ob3N0X3NlbGYoKSwgSE9TVF9CQVNJQ19JTkZPLCAoaG9zdF9pbmZvX3QpICYgaW5mbywgJiBudW0gKTsKKyAgICAgICAgaWYgKCByYyA9PSAwICYmIG51bSA9PSBIT1NUX0JBU0lDX0lORk9fQ09VTlQgKSB7CisgICAgICAgICAgICAvLyBDYW5ub3QgdXNlIEtBX1RSQUNFKCkgaGVyZSBiZWNhdXNlIHRoaXMgY29kZSB3b3JrcyBiZWZvcmUgdHJhY2Ugc3VwcG9ydCBpcworICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZWQuCisgICAgICAgICAgICByID0gaW5mby5hdmFpbF9jcHVzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIENhbnRHZXROdW1BdmFpbENQVSApOworICAgICAgICAgICAgS01QX0lORk9STSggQXNzdW1lZE51bUNQVSApOworICAgICAgICB9OyAvLyBpZgorCisgICAgI2Vsc2UKKworICAgICAgICAjZXJyb3IgIlVua25vd24gb3IgdW5zdXBwb3J0ZWQgT1MuIgorCisgICAgI2VuZGlmCisKKyAgICByZXR1cm4gciA+IDAgPyByIDogMjsgLyogZ3Vlc3MgdmFsdWUgb2YgMiBpZiBPUyB0b2xkIHVzIDAgKi8KKworfSAvLyBfX2ttcF9nZXRfeHByb2MKKworaW50CitfX2ttcF9yZWFkX2Zyb21fZmlsZSggY2hhciBjb25zdCAqcGF0aCwgY2hhciBjb25zdCAqZm9ybWF0LCAuLi4gKQoreworICAgIGludCByZXN1bHQ7CisgICAgdmFfbGlzdCBhcmdzOworCisgICAgdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKyAgICBGSUxFICpmID0gZm9wZW4ocGF0aCwgInJiIik7CisgICAgaWYgKCBmID09IE5VTEwgKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXN1bHQgPSB2ZnNjYW5mKGYsIGZvcm1hdCwgYXJncyk7CisgICAgZmNsb3NlKGYpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZAorX19rbXBfcnVudGltZV9pbml0aWFsaXplKCB2b2lkICkKK3sKKyAgICBpbnQgc3RhdHVzOworICAgIHB0aHJlYWRfbXV0ZXhhdHRyX3QgbXV0ZXhfYXR0cjsKKyAgICBwdGhyZWFkX2NvbmRhdHRyX3QgIGNvbmRfYXR0cjsKKworICAgIGlmICggX19rbXBfaW5pdF9ydW50aW1lICkgeworICAgICAgICByZXR1cm47CisgICAgfTsgLy8gaWYKKworICAgICNpZiAoIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKQorICAgICAgICBpZiAoICEgX19rbXBfY3B1aW5mby5pbml0aWFsaXplZCApIHsKKyAgICAgICAgICAgIF9fa21wX3F1ZXJ5X2NwdWlkKCAmX19rbXBfY3B1aW5mbyApOworICAgICAgICB9OyAvLyBpZgorICAgICNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKyAgICBfX2ttcF94cHJvYyA9IF9fa21wX2dldF94cHJvYygpOworCisgICAgaWYgKCBzeXNjb25mKCBfU0NfVEhSRUFEUyApICkgeworCisgICAgICAgIC8qIFF1ZXJ5IHRoZSBtYXhpbXVtIG51bWJlciBvZiB0aHJlYWRzICovCisgICAgICAgIF9fa21wX3N5c19tYXhfbnRoID0gc3lzY29uZiggX1NDX1RIUkVBRF9USFJFQURTX01BWCApOworICAgICAgICBpZiAoIF9fa21wX3N5c19tYXhfbnRoID09IC0xICkgeworICAgICAgICAgICAgLyogVW5saW1pdGVkIHRocmVhZHMgZm9yIE5QVEwgKi8KKyAgICAgICAgICAgIF9fa21wX3N5c19tYXhfbnRoID0gSU5UX01BWDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggX19rbXBfc3lzX21heF9udGggPD0gMSApIHsKKyAgICAgICAgICAgIC8qIENhbid0IHRlbGwsIGp1c3QgdXNlIFBUSFJFQURfVEhSRUFEU19NQVggKi8KKyAgICAgICAgICAgIF9fa21wX3N5c19tYXhfbnRoID0gS01QX01BWF9OVEg7CisgICAgICAgIH0KKworICAgICAgICAvKiBRdWVyeSB0aGUgbWluaW11bSBzdGFjayBzaXplICovCisgICAgICAgIF9fa21wX3N5c19taW5fc3Rrc2l6ZSA9IHN5c2NvbmYoIF9TQ19USFJFQURfU1RBQ0tfTUlOICk7CisgICAgICAgIGlmICggX19rbXBfc3lzX21pbl9zdGtzaXplIDw9IDEgKSB7CisgICAgICAgICAgICBfX2ttcF9zeXNfbWluX3N0a3NpemUgPSBLTVBfTUlOX1NUS1NJWkU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBTZXQgdXAgbWluaW11bSBudW1iZXIgb2YgdGhyZWFkcyB0byBzd2l0Y2ggdG8gVExTIGd0aWQgKi8KKyAgICBfX2ttcF90bHNfZ3RpZF9taW4gPSBLTVBfVExTX0dUSURfTUlOOworCisgICAgI2lmZGVmIEJVSUxEX1RWCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCByYyA9IHB0aHJlYWRfa2V5X2NyZWF0ZSggJiBfX2ttcF90dl9rZXksIDAgKTsKKyAgICAgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9rZXlfY3JlYXRlIiwgcmMgKTsKKyAgICAgICAgfQorICAgICNlbmRpZgorCisgICAgc3RhdHVzID0gcHRocmVhZF9rZXlfY3JlYXRlKCAmX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSwgX19rbXBfaW50ZXJuYWxfZW5kX2Rlc3QgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfa2V5X2NyZWF0ZSIsIHN0YXR1cyApOworICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQoICYgbXV0ZXhfYXR0ciApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9tdXRleGF0dHJfaW5pdCIsIHN0YXR1cyApOworICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfaW5pdCggJiBfX2ttcF93YWl0X214Lm1fbXV0ZXgsICYgbXV0ZXhfYXR0ciApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9tdXRleF9pbml0Iiwgc3RhdHVzICk7CisgICAgc3RhdHVzID0gcHRocmVhZF9jb25kYXR0cl9pbml0KCAmIGNvbmRfYXR0ciApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9jb25kYXR0cl9pbml0Iiwgc3RhdHVzICk7CisgICAgc3RhdHVzID0gcHRocmVhZF9jb25kX2luaXQoICYgX19rbXBfd2FpdF9jdi5jX2NvbmQsICYgY29uZF9hdHRyICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX2NvbmRfaW5pdCIsIHN0YXR1cyApOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfaW5pdGlhbGl6ZSgpOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIF9fa21wX2luaXRfcnVudGltZSA9IFRSVUU7Cit9CisKK3ZvaWQKK19fa21wX3J1bnRpbWVfZGVzdHJveSggdm9pZCApCit7CisgICAgaW50IHN0YXR1czsKKworICAgIGlmICggISBfX2ttcF9pbml0X3J1bnRpbWUgKSB7CisgICAgICAgIHJldHVybjsgLy8gTm90aGluZyB0byBkby4KKyAgICB9OworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9kZXN0cm95KCk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgc3RhdHVzID0gcHRocmVhZF9rZXlfZGVsZXRlKCBfX2ttcF9ndGlkX3RocmVhZHByaXZhdGVfa2V5ICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX2tleV9kZWxldGUiLCBzdGF0dXMgKTsKKyAgICAjaWZkZWYgQlVJTERfVFYKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9rZXlfZGVsZXRlKCBfX2ttcF90dl9rZXkgKTsKKyAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX2tleV9kZWxldGUiLCBzdGF0dXMgKTsKKyAgICAjZW5kaWYKKworICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfZGVzdHJveSggJiBfX2ttcF93YWl0X214Lm1fbXV0ZXggKTsKKyAgICBpZiAoIHN0YXR1cyAhPSAwICYmIHN0YXR1cyAhPSBFQlVTWSApIHsKKyAgICAgICAgS01QX1NZU0ZBSUwoICJwdGhyZWFkX211dGV4X2Rlc3Ryb3kiLCBzdGF0dXMgKTsKKyAgICB9CisgICAgc3RhdHVzID0gcHRocmVhZF9jb25kX2Rlc3Ryb3koICYgX19rbXBfd2FpdF9jdi5jX2NvbmQgKTsKKyAgICBpZiAoIHN0YXR1cyAhPSAwICYmIHN0YXR1cyAhPSBFQlVTWSApIHsKKyAgICAgICAgS01QX1NZU0ZBSUwoICJwdGhyZWFkX2NvbmRfZGVzdHJveSIsIHN0YXR1cyApOworICAgIH0KKyAgICAjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICBfX2ttcF9hZmZpbml0eV91bmluaXRpYWxpemUoKTsKKyAgICAjZW5kaWYKKworICAgIF9fa21wX2luaXRfcnVudGltZSA9IEZBTFNFOworfQorCisKKy8qIFB1dCB0aGUgdGhyZWFkIHRvIHNsZWVwIGZvciBhIHRpbWUgcGVyaW9kICovCisvKiBOT1RFOiBub3QgY3VycmVudGx5IHVzZWQgYW55d2hlcmUgKi8KK3ZvaWQKK19fa21wX3RocmVhZF9zbGVlcCggaW50IG1pbGxpcyApCit7CisgICAgc2xlZXAoICAoIG1pbGxpcyArIDUwMCApIC8gMTAwMCApOworfQorCisvKiBDYWxjdWxhdGUgdGhlIGVsYXBzZWQgd2FsbCBjbG9jayB0aW1lIGZvciB0aGUgdXNlciAqLwordm9pZAorX19rbXBfZWxhcHNlZCggZG91YmxlICp0ICkKK3sKKyAgICBpbnQgc3RhdHVzOworIyBpZmRlZiBGSVhfU0dJX0NMT0NLCisgICAgc3RydWN0IHRpbWVzcGVjIHRzOworCisgICAgc3RhdHVzID0gY2xvY2tfZ2V0dGltZSggQ0xPQ0tfUFJPQ0VTU19DUFVUSU1FX0lELCAmdHMgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTF9FUlJOTyggImNsb2NrX2dldHRpbWUiLCBzdGF0dXMgKTsKKyAgICAqdCA9IChkb3VibGUpIHRzLnR2X25zZWMgKiAoMS4wIC8gKGRvdWJsZSkgS01QX05TRUNfUEVSX1NFQykgKworICAgICAgICAoZG91YmxlKSB0cy50dl9zZWM7CisjIGVsc2UKKyAgICBzdHJ1Y3QgdGltZXZhbCB0djsKKworICAgIHN0YXR1cyA9IGdldHRpbWVvZmRheSggJiB0diwgTlVMTCApOworICAgIEtNUF9DSEVDS19TWVNGQUlMX0VSUk5PKCAiZ2V0dGltZW9mZGF5Iiwgc3RhdHVzICk7CisgICAgKnQgPSAoZG91YmxlKSB0di50dl91c2VjICogKDEuMCAvIChkb3VibGUpIEtNUF9VU0VDX1BFUl9TRUMpICsKKyAgICAgICAgKGRvdWJsZSkgdHYudHZfc2VjOworIyBlbmRpZgorfQorCisvKiBDYWxjdWxhdGUgdGhlIGVsYXBzZWQgd2FsbCBjbG9jayB0aWNrIGZvciB0aGUgdXNlciAqLwordm9pZAorX19rbXBfZWxhcHNlZF90aWNrKCBkb3VibGUgKnQgKQoreworICAgICp0ID0gMSAvIChkb3VibGUpIENMT0NLU19QRVJfU0VDOworfQorCisvKgorICAgIERldGVybWluZSB3aGV0aGVyIHRoZSBnaXZlbiBhZGRyZXNzIGlzIG1hcHBlZCBpbnRvIHRoZSBjdXJyZW50IGFkZHJlc3Mgc3BhY2UuCisqLworCitpbnQKK19fa21wX2lzX2FkZHJlc3NfbWFwcGVkKCB2b2lkICogYWRkciApIHsKKworICAgIGludCBmb3VuZCA9IDA7CisgICAgaW50IHJjOworCisgICAgI2lmIEtNUF9PU19MSU5VWCB8fCBLTVBfT1NfRlJFRUJTRAorCisgICAgICAgIC8qCisgICAgICAgICAgICBPbiBMaW51eCogT1MsIHJlYWQgdGhlIC9wcm9jLzxwaWQ+L21hcHMgcHNldWRvLWZpbGUgdG8gZ2V0IGFsbCB0aGUgYWRkcmVzcyByYW5nZXMgbWFwcGVkCisgICAgICAgICAgICBpbnRvIHRoZSBhZGRyZXNzIHNwYWNlLgorICAgICAgICAqLworCisgICAgICAgIGNoYXIgKiBuYW1lID0gX19rbXBfc3RyX2Zvcm1hdCggIi9wcm9jLyVkL21hcHMiLCBnZXRwaWQoKSApOworICAgICAgICBGSUxFICogZmlsZSAgPSBOVUxMOworCisgICAgICAgIGZpbGUgPSBmb3BlbiggbmFtZSwgInIiICk7CisgICAgICAgIEtNUF9BU1NFUlQoIGZpbGUgIT0gTlVMTCApOworCisgICAgICAgIGZvciAoIDsgOyApIHsKKworICAgICAgICAgICAgdm9pZCAqIGJlZ2lubmluZyA9IE5VTEw7CisgICAgICAgICAgICB2b2lkICogZW5kaW5nICAgID0gTlVMTDsKKyAgICAgICAgICAgIGNoYXIgICBwZXJtc1sgNSBdOworCisgICAgICAgICAgICByYyA9IGZzY2FuZiggZmlsZSwgIiVwLSVwICU0cyAlKlteXG5dXG4iLCAmIGJlZ2lubmluZywgJiBlbmRpbmcsIHBlcm1zICk7CisgICAgICAgICAgICBpZiAoIHJjID09IEVPRiApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICBLTVBfQVNTRVJUKCByYyA9PSAzICYmIEtNUF9TVFJMRU4oIHBlcm1zICkgPT0gNCApOyAvLyBNYWtlIHN1cmUgYWxsIGZpZWxkcyBhcmUgcmVhZC4KKworICAgICAgICAgICAgLy8gRW5kaW5nIGFkZHJlc3MgaXMgbm90IGluY2x1ZGVkIGluIHRoZSByZWdpb24sIGJ1dCBiZWdpbm5pbmcgaXMuCisgICAgICAgICAgICBpZiAoICggYWRkciA+PSBiZWdpbm5pbmcgKSAmJiAoIGFkZHIgPCBlbmRpbmcgKSApIHsKKyAgICAgICAgICAgICAgICBwZXJtc1sgMiBdID0gMDsgICAgLy8gM3RoIGFuZCA0dGggY2hhcmFjdGVyIGRvZXMgbm90IG1hdHRlci4KKyAgICAgICAgICAgICAgICBpZiAoIHN0cmNtcCggcGVybXMsICJydyIgKSA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICAvLyBNZW1vcnkgd2UgYXJlIGxvb2tpbmcgZm9yIHNob3VsZCBiZSByZWFkYWJsZSBhbmQgd3JpdGFibGUuCisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gMTsKKyAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfTsgLy8gaWYKKworICAgICAgICB9OyAvLyBmb3JldmVyCisKKyAgICAgICAgLy8gRnJlZSByZXNvdXJjZXMuCisgICAgICAgIGZjbG9zZSggZmlsZSApOworICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSggbmFtZSApOworCisgICAgI2VsaWYgS01QX09TX0RBUldJTgorCisgICAgICAgIC8qCisgICAgICAgICAgICBPbiBPUyBYKiwgL3Byb2MgcHNldWRvIGZpbGVzeXN0ZW0gaXMgbm90IGF2YWlsYWJsZS4gVHJ5IHRvIHJlYWQgbWVtb3J5IHVzaW5nIHZtCisgICAgICAgICAgICBpbnRlcmZhY2UuCisgICAgICAgICovCisKKyAgICAgICAgaW50ICAgICAgIGJ1ZmZlcjsKKyAgICAgICAgdm1fc2l6ZV90IGNvdW50OworICAgICAgICByYyA9CisgICAgICAgICAgICB2bV9yZWFkX292ZXJ3cml0ZSgKKyAgICAgICAgICAgICAgICBtYWNoX3Rhc2tfc2VsZigpLCAgICAgICAgICAgLy8gVGFzayB0byByZWFkIG1lbW9yeSBvZi4KKyAgICAgICAgICAgICAgICAodm1fYWRkcmVzc190KSggYWRkciApLCAgICAgLy8gQWRkcmVzcyB0byByZWFkIGZyb20uCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE51bWJlciBvZiBieXRlcyB0byBiZSByZWFkLgorICAgICAgICAgICAgICAgICh2bV9hZGRyZXNzX3QpKCAmIGJ1ZmZlciApLCAvLyBBZGRyZXNzIG9mIGJ1ZmZlciB0byBzYXZlIHJlYWQgYnl0ZXMgaW4uCisgICAgICAgICAgICAgICAgJiBjb3VudCAgICAgICAgICAgICAgICAgICAgIC8vIEFkZHJlc3Mgb2YgdmFyIHRvIHNhdmUgbnVtYmVyIG9mIHJlYWQgYnl0ZXMgaW4uCisgICAgICAgICAgICApOworICAgICAgICBpZiAoIHJjID09IDAgKSB7CisgICAgICAgICAgICAvLyBNZW1vcnkgc3VjY2Vzc2Z1bGx5IHJlYWQuCisgICAgICAgICAgICBmb3VuZCA9IDE7CisgICAgICAgIH07IC8vIGlmCisKKyAgICAjZWxpZiBLTVBfT1NfRlJFRUJTRCB8fCBLTVBfT1NfTkVUQlNECisKKyAgICAgICAgLy8gRklYTUUoRnJlZUJTRCwgTmV0QlNEKTogSW1wbGVtZW50IHRoaXMKKyAgICAgICAgZm91bmQgPSAxOworCisgICAgI2Vsc2UKKworICAgICAgICAjZXJyb3IgIlVua25vd24gb3IgdW5zdXBwb3J0ZWQgT1MiCisKKyAgICAjZW5kaWYKKworICAgIHJldHVybiBmb3VuZDsKKworfSAvLyBfX2ttcF9pc19hZGRyZXNzX21hcHBlZAorCisjaWZkZWYgVVNFX0xPQURfQkFMQU5DRQorCisKKyMgaWYgS01QX09TX0RBUldJTgorCisvLyBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgcm91bmRlZCB2YWx1ZSBvZiB0aGUgc3lzdGVtIGxvYWQgYXZlcmFnZQorLy8gZHVyaW5nIGdpdmVuIHRpbWUgaW50ZXJ2YWwgd2hpY2ggZGVwZW5kcyBvbiB0aGUgdmFsdWUgb2YKKy8vIF9fa21wX2xvYWRfYmFsYW5jZV9pbnRlcnZhbCB2YXJpYWJsZSAoZGVmYXVsdCBpcyA2MCBzZWMsIG90aGVyIHZhbHVlcworLy8gbWF5IGJlIDMwMCBzZWMgb3IgOTAwIHNlYykuCisvLyBJdCByZXR1cm5zIC0xIGluIGNhc2Ugb2YgZXJyb3IuCitpbnQKK19fa21wX2dldF9sb2FkX2JhbGFuY2UoIGludCBtYXggKQoreworICAgIGRvdWJsZSBhdmVyYWdlc1szXTsKKyAgICBpbnQgcmV0X2F2ZyA9IDA7CisKKyAgICBpbnQgcmVzID0gZ2V0bG9hZGF2ZyggYXZlcmFnZXMsIDMgKTsKKworICAgIC8vQ2hlY2sgX19rbXBfbG9hZF9iYWxhbmNlX2ludGVydmFsIHRvIGRldGVybWluZSB3aGljaCBvZiBhdmVyYWdlcyB0byB1c2UuCisgICAgLy8gZ2V0bG9hZGF2ZygpIG1heSByZXR1cm4gdGhlIG51bWJlciBvZiBzYW1wbGVzIGxlc3MgdGhhbiByZXF1ZXN0ZWQgdGhhdCBpcworICAgIC8vIGxlc3MgdGhhbiAzLgorICAgIGlmICggX19rbXBfbG9hZF9iYWxhbmNlX2ludGVydmFsIDwgMTgwICYmICggcmVzID49IDEgKSApIHsKKyAgICAgICAgcmV0X2F2ZyA9IGF2ZXJhZ2VzWzBdOy8vIDEgbWluCisgICAgfSBlbHNlIGlmICggKCBfX2ttcF9sb2FkX2JhbGFuY2VfaW50ZXJ2YWwgPj0gMTgwCisgICAgICAgICAgICAgICAgICAmJiBfX2ttcF9sb2FkX2JhbGFuY2VfaW50ZXJ2YWwgPCA2MDAgKSAmJiAoIHJlcyA+PSAyICkgKSB7CisgICAgICAgIHJldF9hdmcgPSBhdmVyYWdlc1sxXTsvLyA1IG1pbgorICAgIH0gZWxzZSBpZiAoICggX19rbXBfbG9hZF9iYWxhbmNlX2ludGVydmFsID49IDYwMCApICYmICggcmVzID09IDMgKSApIHsKKyAgICAgICAgcmV0X2F2ZyA9IGF2ZXJhZ2VzWzJdOy8vIDE1IG1pbgorICAgIH0gZWxzZSB7Ly8gRXJyb3Igb2NjdXJyZWQKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiByZXRfYXZnOworfQorCisjIGVsc2UgLy8gTGludXgqIE9TCisKKy8vIFRoZSBmdWN0aW9uIHJldHVybnMgbnVtYmVyIG9mIHJ1bm5pbmcgKG5vdCBzbGVlcGluZykgdGhyZWFkcywgb3IgLTEgaW4gY2FzZSBvZiBlcnJvci4KKy8vIEVycm9yIGNvdWxkIGJlIHJlcG9ydGVkIGlmIExpbnV4KiBPUyBrZXJuZWwgdG9vIG9sZCAod2l0aG91dCAiL3Byb2MiIHN1cHBvcnQpLgorLy8gQ291bnRpbmcgcnVubmluZyB0aHJlYWRzIHN0b3BzIGlmIG1heCBydW5uaW5nIHRocmVhZHMgZW5jb3VudGVyZWQuCitpbnQKK19fa21wX2dldF9sb2FkX2JhbGFuY2UoIGludCBtYXggKQoreworICAgIHN0YXRpYyBpbnQgcGVybWFuZW50X2Vycm9yID0gMDsKKworICAgIHN0YXRpYyBpbnQgICAgIGdsYl9ydW5uaW5nX3RocmVhZHMgICAgICAgICAgPSAwOyAgLyogU2F2ZWQgY291bnQgb2YgdGhlIHJ1bm5pbmcgdGhyZWFkcyBmb3IgdGhlIHRocmVhZCBiYWxhbmNlIGFsZ29ydGlobSAqLworICAgIHN0YXRpYyBkb3VibGUgIGdsYl9jYWxsX3RpbWUgPSAwOyAgLyogVGhyZWFkIGJhbGFuY2UgYWxnb3JpdGhtIGNhbGwgdGltZSAqLworCisgICAgaW50IHJ1bm5pbmdfdGhyZWFkcyA9IDA7ICAgICAgICAgICAgICAvLyBOdW1iZXIgb2YgcnVubmluZyB0aHJlYWRzIGluIHRoZSBzeXN0ZW0uCisKKyAgICBESVIgICogICAgICAgICAgcHJvY19kaXIgICA9IE5VTEw7ICAgIC8vIEhhbmRsZSBvZiAiL3Byb2MvIiBkaXJlY3RvcnkuCisgICAgc3RydWN0IGRpcmVudCAqIHByb2NfZW50cnkgPSBOVUxMOworCisgICAga21wX3N0cl9idWZfdCAgIHRhc2tfcGF0aDsgICAgICAgICAgICAvLyAiL3Byb2MvPHBpZD4vdGFzay88dGlkPi8iIHBhdGguCisgICAgRElSICAqICAgICAgICAgIHRhc2tfZGlyICAgPSBOVUxMOyAgICAvLyBIYW5kbGUgb2YgIi9wcm9jLzxwaWQ+L3Rhc2svPHRpZD4vIiBkaXJlY3RvcnkuCisgICAgc3RydWN0IGRpcmVudCAqIHRhc2tfZW50cnkgPSBOVUxMOworICAgIGludCAgICAgICAgICAgICB0YXNrX3BhdGhfZml4ZWRfbGVuOworCisgICAga21wX3N0cl9idWZfdCAgIHN0YXRfcGF0aDsgICAgICAgICAgICAvLyAiL3Byb2MvPHBpZD4vdGFzay88dGlkPi9zdGF0IiBwYXRoLgorICAgIGludCAgICAgICAgICAgICBzdGF0X2ZpbGUgPSAtMTsKKyAgICBpbnQgICAgICAgICAgICAgc3RhdF9wYXRoX2ZpeGVkX2xlbjsKKworICAgIGludCB0b3RhbF9wcm9jZXNzZXMgPSAwOyAgICAgICAgICAgICAgLy8gVG90YWwgbnVtYmVyIG9mIHByb2Nlc3NlcyBpbiBzeXN0ZW0uCisgICAgaW50IHRvdGFsX3RocmVhZHMgICA9IDA7ICAgICAgICAgICAgICAvLyBUb3RhbCBudW1iZXIgb2YgdGhyZWFkcyBpbiBzeXN0ZW0uCisKKyAgICBkb3VibGUgY2FsbF90aW1lID0gMC4wOworCisgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmIHRhc2tfcGF0aCApOworICAgIF9fa21wX3N0cl9idWZfaW5pdCggJiBzdGF0X3BhdGggKTsKKworICAgICBfX2ttcF9lbGFwc2VkKCAmIGNhbGxfdGltZSApOworCisgICAgaWYgKCBnbGJfY2FsbF90aW1lICYmCisgICAgICAgICAgICAoIGNhbGxfdGltZSAtIGdsYl9jYWxsX3RpbWUgPCBfX2ttcF9sb2FkX2JhbGFuY2VfaW50ZXJ2YWwgKSApIHsKKyAgICAgICAgcnVubmluZ190aHJlYWRzID0gZ2xiX3J1bm5pbmdfdGhyZWFkczsKKyAgICAgICAgZ290byBmaW5pc2g7CisgICAgfQorCisgICAgZ2xiX2NhbGxfdGltZSA9IGNhbGxfdGltZTsKKworICAgIC8vIERvIG5vdCBzcGVuZCB0aW1lIG9uIHNjYW5uaW5nICIvcHJvYy8iIGlmIHdlIGhhdmUgYSBwZXJtYW5lbnQgZXJyb3IuCisgICAgaWYgKCBwZXJtYW5lbnRfZXJyb3IgKSB7CisgICAgICAgIHJ1bm5pbmdfdGhyZWFkcyA9IC0xOworICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICB9OyAvLyBpZgorCisgICAgaWYgKCBtYXggPD0gMCApIHsKKyAgICAgICAgbWF4ID0gSU5UX01BWDsKKyAgICB9OyAvLyBpZgorCisgICAgLy8gT3BlbiAiL3Byb2MvIiBkaXJlY3RvcnkuCisgICAgcHJvY19kaXIgPSBvcGVuZGlyKCAiL3Byb2MiICk7CisgICAgaWYgKCBwcm9jX2RpciA9PSBOVUxMICkgeworICAgICAgICAvLyBDYW5ub3Qgb3BlbiAiL3Bycm9jLyIuIFByb2JhYmx5IHRoZSBrZXJuZWwgZG9lcyBub3Qgc3VwcG9ydCBpdC4gUmV0dXJuIGFuIGVycm9yIG5vdyBhbmQKKyAgICAgICAgLy8gaW4gc3Vic2VxdWVudCBjYWxscy4KKyAgICAgICAgcnVubmluZ190aHJlYWRzID0gLTE7CisgICAgICAgIHBlcm1hbmVudF9lcnJvciA9IDE7CisgICAgICAgIGdvdG8gZmluaXNoOworICAgIH07IC8vIGlmCisKKyAgICAvLyBJbml0aWFsaXplIGZpeGVkIHBhcnQgb2YgdGFza19wYXRoLiBUaGlzIHBhcnQgd2lsbCBub3QgY2hhbmdlLgorICAgIF9fa21wX3N0cl9idWZfY2F0KCAmIHRhc2tfcGF0aCwgIi9wcm9jLyIsIDYgKTsKKyAgICB0YXNrX3BhdGhfZml4ZWRfbGVuID0gdGFza19wYXRoLnVzZWQ7ICAgIC8vIFJlbWVtYmVyIG51bWJlciBvZiB1c2VkIGNoYXJhY3RlcnMuCisKKyAgICBwcm9jX2VudHJ5ID0gcmVhZGRpciggcHJvY19kaXIgKTsKKyAgICB3aGlsZSAoIHByb2NfZW50cnkgIT0gTlVMTCApIHsKKyAgICAgICAgLy8gUHJvYyBlbnRyeSBpcyBhIGRpcmVjdG9yeSBhbmQgbmFtZSBzdGFydHMgd2l0aCBhIGRpZ2l0LiBBc3N1bWUgaXQgaXMgYSBwcm9jZXNzJworICAgICAgICAvLyBkaXJlY3RvcnkuCisgICAgICAgIGlmICggcHJvY19lbnRyeS0+ZF90eXBlID09IERUX0RJUiAmJiBpc2RpZ2l0KCBwcm9jX2VudHJ5LT5kX25hbWVbIDAgXSApICkgeworCisgICAgICAgICAgICArKyB0b3RhbF9wcm9jZXNzZXM7CisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgaW5pdCBwcm9jZXNzIGlzIHRoZSB2ZXJ5IGZpcnN0IGluICIvcHJvYyIsIHNvIHdlIGNhbiByZXBsYWNlCisgICAgICAgICAgICAvLyBzdHJjbXAoIHByb2NfZW50cnktPmRfbmFtZSwgIjEiICkgPT0gMCB3aXRoIHNpbXBsZXIgdG90YWxfcHJvY2Vzc2VzID09IDEuCisgICAgICAgICAgICAvLyBXZSBhcmUgZ29pbmcgdG8gY2hlY2sgdGhhdCB0b3RhbF9wcm9jZXNzZXMgPT0gMSA9PiBkX25hbWUgPT0gIjEiIGlzIHRydWUgKHdoZXJlCisgICAgICAgICAgICAvLyAiPT4iIGlzIGltcGxpY2F0aW9uKS4gU2luY2UgQysrIGRvZXMgbm90IGhhdmUgPT4gb3BlcmF0b3IsIGxldCB1cyByZXBsYWNlIGl0IHdpdGggaXRzCisgICAgICAgICAgICAvLyBlcXVpdmFsZW50OiBhID0+IGIgPT0gISBhIHx8IGIuCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0b3RhbF9wcm9jZXNzZXMgIT0gMSB8fCBzdHJjbXAoIHByb2NfZW50cnktPmRfbmFtZSwgIjEiICkgPT0gMCApOworCisgICAgICAgICAgICAvLyBDb25zdHJ1Y3QgdGFza19wYXRoLgorICAgICAgICAgICAgdGFza19wYXRoLnVzZWQgPSB0YXNrX3BhdGhfZml4ZWRfbGVuOyAgICAvLyBSZXNldCB0YXNrX3BhdGggdG8gIi9wcm9jLyIuCisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX2NhdCggJiB0YXNrX3BhdGgsIHByb2NfZW50cnktPmRfbmFtZSwgS01QX1NUUkxFTiggcHJvY19lbnRyeS0+ZF9uYW1lICkgKTsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfY2F0KCAmIHRhc2tfcGF0aCwgIi90YXNrIiwgNSApOworCisgICAgICAgICAgICB0YXNrX2RpciA9IG9wZW5kaXIoIHRhc2tfcGF0aC5zdHIgKTsKKyAgICAgICAgICAgIGlmICggdGFza19kaXIgPT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICAvLyBQcm9jZXNzIGNhbiBmaW5pc2ggYmV0d2VlbiByZWFkaW5nICIvcHJvYy8iIGRpcmVjdG9yeSBlbnRyeSBhbmQgb3BlbmluZyBwcm9jZXNzJworICAgICAgICAgICAgICAgIC8vICJ0YXNrLyIgZGlyZWN0b3J5LiBTbywgaW4gZ2VuZXJhbCBjYXNlIHdlIHNob3VsZCBub3QgY29tcGxhaW4sIGJ1dCBoYXZlIHRvIHNraXAKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHByb2Nlc3MgYW5kIHJlYWQgdGhlIG5leHQgb25lLgorICAgICAgICAgICAgICAgIC8vIEJ1dCBvbiBzeXN0ZW1zIHdpdGggbm8gInRhc2svIiBzdXBwb3J0IHdlIHdpbGwgc3BlbmQgbG90IG9mIHRpbWUgdG8gc2NhbiAiL3Byb2MvIgorICAgICAgICAgICAgICAgIC8vIHRyZWUgYWdhaW4gYW5kIGFnYWluIHdpdGhvdXQgYW55IGJlbmVmaXQuICJpbml0IiBwcm9jZXNzIChpdHMgcGlkIGlzIDEpIHNob3VsZAorICAgICAgICAgICAgICAgIC8vIGV4aXN0IGFsd2F5cywgc28sIGlmIHdlIGNhbm5vdCBvcGVuICIvcHJvYy8xL3Rhc2svIiBkaXJlY3RvcnksIGl0IG1lYW5zICJ0YXNrLyIKKyAgICAgICAgICAgICAgICAvLyBpcyBub3Qgc3VwcG9ydGVkIGJ5IGtlcm5lbC4gUmVwb3J0IGFuIGVycm9yIG5vdyBhbmQgaW4gdGhlIGZ1dHVyZS4KKyAgICAgICAgICAgICAgICBpZiAoIHN0cmNtcCggcHJvY19lbnRyeS0+ZF9uYW1lLCAiMSIgKSA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICBydW5uaW5nX3RocmVhZHMgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgcGVybWFuZW50X2Vycm9yID0gMTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBmaW5pc2g7CisgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgIC8vIENvbnN0cnVjdCBmaXhlZCBwYXJ0IG9mIHN0YXQgZmlsZSBwYXRoLgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfY2xlYXIoICYgc3RhdF9wYXRoICk7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9jYXQoICYgc3RhdF9wYXRoLCB0YXNrX3BhdGguc3RyLCB0YXNrX3BhdGgudXNlZCApOworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfY2F0KCAmIHN0YXRfcGF0aCwgIi8iLCAxICk7CisgICAgICAgICAgICAgICAgc3RhdF9wYXRoX2ZpeGVkX2xlbiA9IHN0YXRfcGF0aC51c2VkOworCisgICAgICAgICAgICAgICAgdGFza19lbnRyeSA9IHJlYWRkaXIoIHRhc2tfZGlyICk7CisgICAgICAgICAgICAgICAgd2hpbGUgKCB0YXNrX2VudHJ5ICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEl0IGlzIGEgZGlyZWN0b3J5IGFuZCBuYW1lIHN0YXJ0cyB3aXRoIGEgZGlnaXQuCisgICAgICAgICAgICAgICAgICAgIGlmICggcHJvY19lbnRyeS0+ZF90eXBlID09IERUX0RJUiAmJiBpc2RpZ2l0KCB0YXNrX2VudHJ5LT5kX25hbWVbIDAgXSApICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICArKyB0b3RhbF90aHJlYWRzOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25zcnVjdCBjb21wbGV0ZSBzdGF0IGZpbGUgcGF0aC4gRWFzaWVzdCB3YXkgd291bGQgYmU6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBzdGF0X3BhdGgsICIlcy8lcy9zdGF0IiwgdGFza19wYXRoLnN0ciwgdGFza19lbnRyeS0+ZF9uYW1lICk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBidXQgc2VyaWFlIG9mIF9fa21wX3N0cl9idWZfY2F0IHdvcmtzIGEgYml0IGZhc3Rlci4KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRfcGF0aC51c2VkID0gc3RhdF9wYXRoX2ZpeGVkX2xlbjsgICAgLy8gUmVzZXQgc3RhdCBwYXRoIHRvIGl0cyBmaXhlZCBwYXJ0LgorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9jYXQoICYgc3RhdF9wYXRoLCB0YXNrX2VudHJ5LT5kX25hbWUsIEtNUF9TVFJMRU4oIHRhc2tfZW50cnktPmRfbmFtZSApICk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX2NhdCggJiBzdGF0X3BhdGgsICIvc3RhdCIsIDUgKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogTG93LWxldmVsIEFQSSAob3Blbi9yZWFkL2Nsb3NlKSBpcyB1c2VkLiBIaWdoLWxldmVsIEFQSQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGZvcGVuL2ZjbG9zZSkgIHdvcmtzIH4gMzAgJSBzbG93ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0X2ZpbGUgPSBvcGVuKCBzdGF0X3BhdGguc3RyLCBPX1JET05MWSApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0X2ZpbGUgPT0gLTEgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgY2Fubm90IHJlcG9ydCBhbiBlcnJvciBiZWNhdXNlIHRhc2sgKHRocmVhZCkgY2FuIHRlcm1pbmF0ZSBqdXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIHJlYWRpbmcgdGhpcyBmaWxlLgorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50IG9mICJzdGF0IiBmaWxlIGxvb2tzIGxpa2U6CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0Mjg1IChwcm9ncmFtKSBTIC4uLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0IGlzIGEgc2luZ2xlIGxpbmUgKGlmIHByb2dyYW0gbmFtZSBkb2VzIG5vdCBpbmNsdWRlIGZhbm55CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbHMpLiBGaXJzdCBudW1iZXIgaXMgYSB0aHJlYWQgaWQsIHRoZW4gbmFtZSBvZiBleGVjdXRhYmxlIGZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSBpbiBwYXJldGhlc2VzLCB0aGVuIHN0YXRlIG9mIHRoZSB0aHJlYWQuIFdlIG5lZWQganVzdCB0aHJlYWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR29vZCBuZXdzOiBMZW5ndGggb2YgcHJvZ3JhbSBuYW1lIGlzIDE1IGNoYXJhY3RlcnMgbWF4LiBMb25nZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXMgYXJlIHRydW5jYXRlZC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHVzLCB3ZSBuZWVkIHJhdGhlciBzaG9ydCBidWZmZXI6IDE1IGNoYXJzIGZvciBwcm9ncmFtIG5hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIHBhcmVudGhlc2lzLCArIDMgc3BhY2VzICsgfjcgZGlnaXRzIG9mIHBpZCA9IDM3LgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhZCBuZXdzOiBQcm9ncmFtIG5hbWUgbWF5IGNvbnRhaW4gc3BlY2lhbCBzeW1ib2xzIGxpa2Ugc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NpbmcgcGFyZW50aGVzaXMsIG9yIGV2ZW4gbmV3IGxpbmUuIFRoaXMgbWFrZXMgcGFyc2luZyAic3RhdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSBub3QgMTAwICUgcmVsaWFibGUuIEluIGNhc2Ugb2YgZmFubnkgcHJvZ3JhbSBuYW1lcyBwYXJzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heSBmYWlsIChyZXBvcnQgaW5jb3JyZWN0IHRocmVhZCBzdGF0ZSkuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2luZyAic3RhdHVzIiBmaWxlIGxvb2tzIG1vcmUgcHJvbWlzc2luZyAoZHVlIHRvIGRpZmZlcmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIHN0cnVjdHVyZSBhbmQgZXNjYXBpbmcgc3BlY2lhbCBzeW1ib2xzKSBidXQgcmVhZGluZyBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2luZyBvZiAic3RhdHVzIiBmaWxlIHdvcmtzIHNsb3dlci4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBsbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBidWZmZXJbIDY1IF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSByZWFkKCBzdGF0X2ZpbGUsIGJ1ZmZlciwgc2l6ZW9mKCBidWZmZXIgKSAtIDEgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGxlbiA+PSAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJbIGxlbiBdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNpbmcgc2NhbmY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBzc2NhbmYoIGJ1ZmZlciwgIiUqZCAoJSpzKSAlYyAiLCAmIHN0YXRlICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvb2tzIHZlcnkgbmljZSwgYnV0IHNlYXJjaGluZyBmb3IgYSBjbG9zaW5nIHBhcmVudGhlc2lzIHdvcmtzIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0IGZhc3Rlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqIGNsb3NlX3BhcmVudCA9IHN0cnN0ciggYnVmZmVyLCAiKSAiICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggY2xvc2VfcGFyZW50ICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHN0YXRlID0gKiAoIGNsb3NlX3BhcmVudCArIDIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUgPT0gJ1InICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrIHJ1bm5pbmdfdGhyZWFkczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHJ1bm5pbmdfdGhyZWFkcyA+PSBtYXggKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2UoIHN0YXRfZmlsZSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRfZmlsZSA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgdGFza19lbnRyeSA9IHJlYWRkaXIoIHRhc2tfZGlyICk7CisgICAgICAgICAgICAgICAgfTsgLy8gd2hpbGUKKyAgICAgICAgICAgICAgICBjbG9zZWRpciggdGFza19kaXIgKTsKKyAgICAgICAgICAgICAgICB0YXNrX2RpciA9IE5VTEw7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9OyAvLyBpZgorICAgICAgICBwcm9jX2VudHJ5ID0gcmVhZGRpciggcHJvY19kaXIgKTsKKyAgICB9OyAvLyB3aGlsZQorCisgICAgLy8KKyAgICAvLyBUaGVyZSBfbWlnaHRfIGJlIGEgdGltaW5nIGhvbGUgd2hlcmUgdGhlIHRocmVhZCBleGVjdXRpbmcgdGhpcworICAgIC8vIGNvZGUgZ2V0IHNraXBwZWQgaW4gdGhlIGxvYWQgYmFsYW5jZSwgYW5kIHJ1bm5pbmdfdGhyZWFkcyBpcyAwLgorICAgIC8vIEFzc2VydCBpbiB0aGUgZGVidWcgYnVpbGRzIG9ubHkhISEKKyAgICAvLworICAgIEtNUF9ERUJVR19BU1NFUlQoIHJ1bm5pbmdfdGhyZWFkcyA+IDAgKTsKKyAgICBpZiAoIHJ1bm5pbmdfdGhyZWFkcyA8PSAwICkgeworICAgICAgICBydW5uaW5nX3RocmVhZHMgPSAxOworICAgIH0KKworICAgIGZpbmlzaDogLy8gQ2xlYW4gdXAgYW5kIGV4aXQuCisgICAgICAgIGlmICggcHJvY19kaXIgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIGNsb3NlZGlyKCBwcm9jX2RpciApOworICAgICAgICB9OyAvLyBpZgorICAgICAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoICYgdGFza19wYXRoICk7CisgICAgICAgIGlmICggdGFza19kaXIgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIGNsb3NlZGlyKCB0YXNrX2RpciApOworICAgICAgICB9OyAvLyBpZgorICAgICAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoICYgc3RhdF9wYXRoICk7CisgICAgICAgIGlmICggc3RhdF9maWxlICE9IC0xICkgeworICAgICAgICAgICAgY2xvc2UoIHN0YXRfZmlsZSApOworICAgICAgICB9OyAvLyBpZgorCisgICAgZ2xiX3J1bm5pbmdfdGhyZWFkcyA9IHJ1bm5pbmdfdGhyZWFkczsKKworICAgIHJldHVybiBydW5uaW5nX3RocmVhZHM7CisKK30gLy8gX19rbXBfZ2V0X2xvYWRfYmFsYW5jZQorCisjIGVuZGlmIC8vIEtNUF9PU19EQVJXSU4KKworI2VuZGlmIC8vIFVTRV9MT0FEX0JBTEFOQ0UKKworI2lmICEoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfTUlDKQorCisvLyB3ZSByZWFsbHkgb25seSBuZWVkIHRoZSBjYXNlIHdpdGggMSBhcmd1bWVudCwgYmVjYXVzZSBDTEFORyBhbHdheXMgYnVpbGQKKy8vIGEgc3RydWN0IG9mIHBvaW50ZXJzIHRvIHNoYXJlZCB2YXJpYWJsZXMgcmVmZXJlbmNlZCBpbiB0aGUgb3V0bGluZWQgZnVuY3Rpb24KK2ludAorX19rbXBfaW52b2tlX21pY3JvdGFzayggbWljcm90YXNrX3QgcGtmbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBndGlkLCBpbnQgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZ2MsIHZvaWQgKnBfYXJndltdIAorI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAgICAgLCB2b2lkICoqZXhpdF9mcmFtZV9wdHIKKyNlbmRpZgorKSAKK3sKKyNpZiBPTVBUX1NVUFBPUlQKKyAgKmV4aXRfZnJhbWVfcHRyID0gX19idWlsdGluX2ZyYW1lX2FkZHJlc3MoMCk7CisjZW5kaWYKKworICBzd2l0Y2ggKGFyZ2MpIHsKKyAgZGVmYXVsdDoKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlRvbyBtYW55IGFyZ3MgdG8gbWljcm90YXNrOiAlZCFcbiIsIGFyZ2MpOworICAgIGZmbHVzaChzdGRlcnIpOworICAgIGV4aXQoLTEpOworICBjYXNlIDA6CisgICAgKCpwa2ZuKSgmZ3RpZCwgJnRpZCk7CisgICAgYnJlYWs7CisgIGNhc2UgMToKKyAgICAoKnBrZm4pKCZndGlkLCAmdGlkLCBwX2FyZ3ZbMF0pOworICAgIGJyZWFrOworICBjYXNlIDI6CisgICAgKCpwa2ZuKSgmZ3RpZCwgJnRpZCwgcF9hcmd2WzBdLCBwX2FyZ3ZbMV0pOworICAgIGJyZWFrOworICBjYXNlIDM6CisgICAgKCpwa2ZuKSgmZ3RpZCwgJnRpZCwgcF9hcmd2WzBdLCBwX2FyZ3ZbMV0sIHBfYXJndlsyXSk7CisgICAgYnJlYWs7CisgIGNhc2UgNDoKKyAgICAoKnBrZm4pKCZndGlkLCAmdGlkLCBwX2FyZ3ZbMF0sIHBfYXJndlsxXSwgcF9hcmd2WzJdLCBwX2FyZ3ZbM10pOworICAgIGJyZWFrOworICBjYXNlIDU6CisgICAgKCpwa2ZuKSgmZ3RpZCwgJnRpZCwgcF9hcmd2WzBdLCBwX2FyZ3ZbMV0sIHBfYXJndlsyXSwgcF9hcmd2WzNdLCBwX2FyZ3ZbNF0pOworICAgIGJyZWFrOworICBjYXNlIDY6CisgICAgKCpwa2ZuKSgmZ3RpZCwgJnRpZCwgcF9hcmd2WzBdLCBwX2FyZ3ZbMV0sIHBfYXJndlsyXSwgcF9hcmd2WzNdLCBwX2FyZ3ZbNF0sCisgICAgICAgICAgICBwX2FyZ3ZbNV0pOworICAgIGJyZWFrOworICBjYXNlIDc6CisgICAgKCpwa2ZuKSgmZ3RpZCwgJnRpZCwgcF9hcmd2WzBdLCBwX2FyZ3ZbMV0sIHBfYXJndlsyXSwgcF9hcmd2WzNdLCBwX2FyZ3ZbNF0sCisgICAgICAgICAgICBwX2FyZ3ZbNV0sIHBfYXJndls2XSk7CisgICAgYnJlYWs7CisgIGNhc2UgODoKKyAgICAoKnBrZm4pKCZndGlkLCAmdGlkLCBwX2FyZ3ZbMF0sIHBfYXJndlsxXSwgcF9hcmd2WzJdLCBwX2FyZ3ZbM10sIHBfYXJndls0XSwKKyAgICAgICAgICAgIHBfYXJndls1XSwgcF9hcmd2WzZdLCBwX2FyZ3ZbN10pOworICAgIGJyZWFrOworICBjYXNlIDk6CisgICAgKCpwa2ZuKSgmZ3RpZCwgJnRpZCwgcF9hcmd2WzBdLCBwX2FyZ3ZbMV0sIHBfYXJndlsyXSwgcF9hcmd2WzNdLCBwX2FyZ3ZbNF0sCisgICAgICAgICAgICBwX2FyZ3ZbNV0sIHBfYXJndls2XSwgcF9hcmd2WzddLCBwX2FyZ3ZbOF0pOworICAgIGJyZWFrOworICBjYXNlIDEwOgorICAgICgqcGtmbikoJmd0aWQsICZ0aWQsIHBfYXJndlswXSwgcF9hcmd2WzFdLCBwX2FyZ3ZbMl0sIHBfYXJndlszXSwgcF9hcmd2WzRdLAorICAgICAgICAgICAgcF9hcmd2WzVdLCBwX2FyZ3ZbNl0sIHBfYXJndls3XSwgcF9hcmd2WzhdLCBwX2FyZ3ZbOV0pOworICAgIGJyZWFrOworICBjYXNlIDExOgorICAgICgqcGtmbikoJmd0aWQsICZ0aWQsIHBfYXJndlswXSwgcF9hcmd2WzFdLCBwX2FyZ3ZbMl0sIHBfYXJndlszXSwgcF9hcmd2WzRdLAorICAgICAgICAgICAgcF9hcmd2WzVdLCBwX2FyZ3ZbNl0sIHBfYXJndls3XSwgcF9hcmd2WzhdLCBwX2FyZ3ZbOV0sIHBfYXJndlsxMF0pOworICAgIGJyZWFrOworICBjYXNlIDEyOgorICAgICgqcGtmbikoJmd0aWQsICZ0aWQsIHBfYXJndlswXSwgcF9hcmd2WzFdLCBwX2FyZ3ZbMl0sIHBfYXJndlszXSwgcF9hcmd2WzRdLAorICAgICAgICAgICAgcF9hcmd2WzVdLCBwX2FyZ3ZbNl0sIHBfYXJndls3XSwgcF9hcmd2WzhdLCBwX2FyZ3ZbOV0sIHBfYXJndlsxMF0sCisgICAgICAgICAgICBwX2FyZ3ZbMTFdKTsKKyAgICBicmVhazsKKyAgY2FzZSAxMzoKKyAgICAoKnBrZm4pKCZndGlkLCAmdGlkLCBwX2FyZ3ZbMF0sIHBfYXJndlsxXSwgcF9hcmd2WzJdLCBwX2FyZ3ZbM10sIHBfYXJndls0XSwKKyAgICAgICAgICAgIHBfYXJndls1XSwgcF9hcmd2WzZdLCBwX2FyZ3ZbN10sIHBfYXJndls4XSwgcF9hcmd2WzldLCBwX2FyZ3ZbMTBdLAorICAgICAgICAgICAgcF9hcmd2WzExXSwgcF9hcmd2WzEyXSk7CisgICAgYnJlYWs7CisgIGNhc2UgMTQ6CisgICAgKCpwa2ZuKSgmZ3RpZCwgJnRpZCwgcF9hcmd2WzBdLCBwX2FyZ3ZbMV0sIHBfYXJndlsyXSwgcF9hcmd2WzNdLCBwX2FyZ3ZbNF0sCisgICAgICAgICAgICBwX2FyZ3ZbNV0sIHBfYXJndls2XSwgcF9hcmd2WzddLCBwX2FyZ3ZbOF0sIHBfYXJndls5XSwgcF9hcmd2WzEwXSwKKyAgICAgICAgICAgIHBfYXJndlsxMV0sIHBfYXJndlsxMl0sIHBfYXJndlsxM10pOworICAgIGJyZWFrOworICBjYXNlIDE1OgorICAgICgqcGtmbikoJmd0aWQsICZ0aWQsIHBfYXJndlswXSwgcF9hcmd2WzFdLCBwX2FyZ3ZbMl0sIHBfYXJndlszXSwgcF9hcmd2WzRdLAorICAgICAgICAgICAgcF9hcmd2WzVdLCBwX2FyZ3ZbNl0sIHBfYXJndls3XSwgcF9hcmd2WzhdLCBwX2FyZ3ZbOV0sIHBfYXJndlsxMF0sCisgICAgICAgICAgICBwX2FyZ3ZbMTFdLCBwX2FyZ3ZbMTJdLCBwX2FyZ3ZbMTNdLCBwX2FyZ3ZbMTRdKTsKKyAgICBicmVhazsKKyAgfQorCisjaWYgT01QVF9TVVBQT1JUCisgICpleGl0X2ZyYW1lX3B0ciA9IDA7CisjZW5kaWYKKworICByZXR1cm4gMTsKK30KKworI2VuZGlmCisKKy8vIGVuZCBvZiBmaWxlIC8vCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL3pfV2luZG93c19OVC01ODZfYXNtLmFzbSBiL2ZpbmFsL3J1bnRpbWUvc3JjL3pfV2luZG93c19OVC01ODZfYXNtLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGY5YTM4Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvel9XaW5kb3dzX05ULTU4Nl9hc20uYXNtCkBAIC0wLDAgKzEsMTQwMiBAQAorOyAgel9XaW5kb3dzX05ULTU4Nl9hc20uYXNtOiAgLSBtaWNyb3Rhc2tpbmcgcm91dGluZXMgc3BlY2lmaWNhbGx5Cis7ICAgIHdyaXR0ZW4gZm9yIElBLTMyIGFyY2hpdGVjdHVyZSBhbmQgSW50ZWwoUikgNjQgcnVubmluZyBXaW5kb3dzKiBPUworCis7Cis7Ly89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKzsvLworOy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKzsvLworOy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKzsvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKzsvLworOy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCis7CisKKyAgICAgICAgVElUTEUgICB6X1dpbmRvd3NfTlQtNTg2X2FzbS5hc20KKworOyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBJQS0zMiBhcmNoaXRlY3R1cmUgPT09PT09PT09PT09PT09PT09PT09PT09PT0KK2lmZGVmIF9NX0lBMzIKKworICAgICAgICAuNTg2UAorCitpZiBAVmVyc2lvbiBndCA1MTAKKyAgICAgICAgLm1vZGVsIEhVR0UKK2Vsc2UKK19URVhUICAgU0VHTUVOVCBQQVJBIFVTRTMyIFBVQkxJQyAnQ09ERScKK19URVhUICAgRU5EUworX0RBVEEgICBTRUdNRU5UIERXT1JEIFVTRTMyIFBVQkxJQyAnREFUQScKK19EQVRBICAgRU5EUworQ09OU1QgICBTRUdNRU5UIERXT1JEIFVTRTMyIFBVQkxJQyAnQ09OU1QnCitDT05TVCAgIEVORFMKK19CU1MgICAgU0VHTUVOVCBEV09SRCBVU0UzMiBQVUJMSUMgJ0JTUycKK19CU1MgICAgRU5EUworJCRTWU1CT0xTICAgICAgIFNFR01FTlQgQllURSBVU0UzMiAnREVCU1lNJworJCRTWU1CT0xTICAgICAgIEVORFMKKyQkVFlQRVMgU0VHTUVOVCBCWVRFIFVTRTMyICdERUJUWVAnCiskJFRZUEVTIEVORFMKK19UTFMgICAgU0VHTUVOVCBEV09SRCBVU0UzMiBQVUJMSUMgJ1RMUycKK19UTFMgICAgRU5EUworRkxBVCAgICBHUk9VUCBfREFUQSwgQ09OU1QsIF9CU1MKKyAgICAgICAgQVNTVU1FICBDUzogRkxBVCwgRFM6IEZMQVQsIFNTOiBGTEFUCitlbmRpZgorCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19fa21wX3g4Nl9wYXVzZQorOworOyB2b2lkCis7IF9fa21wX3g4Nl9wYXVzZSggdm9pZCApCis7CisKK1BVQkxJQyAgX19fa21wX3g4Nl9wYXVzZQorX3AkID0gNAorX2QkID0gOAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfX19rbXBfeDg2X3BhdXNlIFBST0MgTkVBUgorCisgICAgICAgIGRiICAgICAgMGYzSAorICAgICAgICBkYiAgICAgIDA5MEggICAgOzsgcGF1c2UKKyAgICAgICAgcmV0CisKK19fX2ttcF94ODZfcGF1c2UgRU5EUAorX1RFWFQgICBFTkRTCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19fa21wX3g4Nl9jcHVpZAorOworOyB2b2lkCis7IF9fa21wX3g4Nl9jcHVpZCggaW50IG1vZGUsIGludCBtb2RlMiwgc3RydWN0IGttcF9jcHVpZCAqcCApOworOworCitQVUJMSUMgIF9fX2ttcF94ODZfY3B1aWQKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX21vZGUkICA9IDgKK19tb2RlMiQgPSAxMgorX3AkICAgICA9IDE2CitfZWF4JCAgID0gMAorX2VieCQgICA9IDQKK19lY3gkICAgPSA4CitfZWR4JCAgID0gMTIKKworX19fa21wX3g4Nl9jcHVpZCBQUk9DIE5FQVIKKworICAgICAgICBwdXNoICAgICAgZWJwCisgICAgICAgIG1vdiAgICAgICBlYnAsIGVzcAorCisgICAgICAgIHB1c2ggICAgICBlZGkKKyAgICAgICAgcHVzaCAgICAgIGVieAorICAgICAgICBwdXNoICAgICAgZWN4CisgICAgICAgIHB1c2ggICAgICBlZHgKKworICAgICAgICBtb3YJICBlYXgsIERXT1JEIFBUUiBfbW9kZSRbZWJwXQorICAgICAgICBtb3YJICBlY3gsIERXT1JEIFBUUiBfbW9kZTIkW2VicF0KKwljcHVpZAkJCQkJOyBRdWVyeSB0aGUgQ1BVSUQgZm9yIHRoZSBjdXJyZW50IHByb2Nlc3NvcgorCisgICAgICAgIG1vdiAgICAgICBlZGksIERXT1JEIFBUUiBfcCRbZWJwXQorCW1vdiAJICBEV09SRCBQVFIgX2VheCRbIGVkaSBdLCBlYXgKKwltb3YgCSAgRFdPUkQgUFRSIF9lYngkWyBlZGkgXSwgZWJ4CisJbW92IAkgIERXT1JEIFBUUiBfZWN4JFsgZWRpIF0sIGVjeAorCW1vdiAJICBEV09SRCBQVFIgX2VkeCRbIGVkaSBdLCBlZHgKKworICAgICAgICBwb3AgICAgICAgZWR4CisgICAgICAgIHBvcCAgICAgICBlY3gKKyAgICAgICAgcG9wICAgICAgIGVieAorICAgICAgICBwb3AgICAgICAgZWRpCisKKyAgICAgICAgbW92ICAgICAgIGVzcCwgZWJwCisgICAgICAgIHBvcCAgICAgICBlYnAKKyAgICAgICAgcmV0CisKK19fX2ttcF94ODZfY3B1aWQgRU5EUAorX1RFWFQgICAgIEVORFMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfdGVzdF90aGVuX2FkZDMyCis7Cis7IGttcF9pbnQzMgorOyBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGQgKTsKKzsKKworUFVCTElDICBfX19rbXBfdGVzdF90aGVuX2FkZDMyCitfcCQgPSA0CitfZCQgPSA4CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19fX2ttcF90ZXN0X3RoZW5fYWRkMzIgUFJPQyBORUFSCisKKyAgICAgICAgbW92ICAgICBlYXgsIERXT1JEIFBUUiBfZCRbZXNwXQorICAgICAgICBtb3YgICAgIGVjeCwgRFdPUkQgUFRSIF9wJFtlc3BdCitsb2NrICAgIHhhZGQgICAgRFdPUkQgUFRSIFtlY3hdLCBlYXgKKyAgICAgICAgcmV0CisKK19fX2ttcF90ZXN0X3RoZW5fYWRkMzIgRU5EUAorX1RFWFQgICBFTkRTCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlOAorOworOyBrbXBfaW50OAorOyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgoIHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCBjdiwga21wX2ludDggc3YgKTsKKzsKKworUFVCTElDICBfX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19wJCA9IDQKK19jdiQgPSA4Citfc3YkID0gMTIKKworX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlOCBQUk9DIE5FQVIKKworICAgICAgICBtb3YgICAgICAgZWN4LCBEV09SRCBQVFIgX3AkW2VzcF0KKyAgICAgICAgbW92ICAgICAgIGFsLCBCWVRFIFBUUiBfY3YkW2VzcF0KKyAgICAgICAgbW92ICAgICAgIGRsLCBCWVRFIFBUUiBfc3YkW2VzcF0KK2xvY2sgICAgY21weGNoZyAgIEJZVEUgUFRSIFtlY3hdLCBkbAorICAgICAgICBzZXRlICAgICAgYWwgICAgICAgICAgIDsgaWYgYWwgPT0gW2VjeF0gc2V0IGFsID0gMSBlbHNlIHNldCBhbCA9IDAKKyAgICAgICAgYW5kICAgICAgIGVheCwgMSAgICAgICA7IHNpZ24gZXh0ZW5kIHByZXZpb3VzIGluc3RydWN0aW9uCisgICAgICAgIHJldAorCitfX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4IEVORFAKK19URVhUICAgICBFTkRTCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYKKzsKKzsga21wX2ludDE2Cis7IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IGN2LCBrbXBfaW50MTYgc3YgKTsKKzsKKworUFVCTElDICBfX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNgorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfcCQgPSA0CitfY3YkID0gOAorX3N2JCA9IDEyCisKK19fX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2IFBST0MgTkVBUgorCisgICAgICAgIG1vdiAgICAgICBlY3gsIERXT1JEIFBUUiBfcCRbZXNwXQorICAgICAgICBtb3YgICAgICAgYXgsIFdPUkQgUFRSIF9jdiRbZXNwXQorICAgICAgICBtb3YgICAgICAgZHgsIFdPUkQgUFRSIF9zdiRbZXNwXQorbG9jayAgICBjbXB4Y2hnICAgV09SRCBQVFIgW2VjeF0sIGR4CisgICAgICAgIHNldGUgICAgICBhbCAgICAgICAgICAgOyBpZiBheCA9PSBbZWN4XSBzZXQgYWwgPSAxIGVsc2Ugc2V0IGFsID0gMAorICAgICAgICBhbmQgICAgICAgZWF4LCAxICAgICAgIDsgc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24KKyAgICAgICAgcmV0CisKK19fX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2IEVORFAKK19URVhUICAgICBFTkRTCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIKKzsKKzsga21wX2ludDMyCis7IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGN2LCBrbXBfaW50MzIgc3YgKTsKKzsKKworUFVCTElDICBfX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMgorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfcCQgPSA0CitfY3YkID0gOAorX3N2JCA9IDEyCisKK19fX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyIFBST0MgTkVBUgorCisgICAgICAgIG1vdiAgICAgICBlY3gsIERXT1JEIFBUUiBfcCRbZXNwXQorICAgICAgICBtb3YgICAgICAgZWF4LCBEV09SRCBQVFIgX2N2JFtlc3BdCisgICAgICAgIG1vdiAgICAgICBlZHgsIERXT1JEIFBUUiBfc3YkW2VzcF0KK2xvY2sgICAgY21weGNoZyAgIERXT1JEIFBUUiBbZWN4XSwgZWR4CisgICAgICAgIHNldGUgICAgICBhbCAgICAgICAgICAgOyBpZiBlYXggPT0gW2VjeF0gc2V0IGFsID0gMSBlbHNlIHNldCBhbCA9IDAKKyAgICAgICAgYW5kICAgICAgIGVheCwgMSAgICAgICA7IHNpZ24gZXh0ZW5kIHByZXZpb3VzIGluc3RydWN0aW9uCisgICAgICAgIHJldAorCitfX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMiBFTkRQCitfVEVYVCAgICAgRU5EUworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0Cis7Cis7IGttcF9pbnQzMgorOyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBjdiwga21wX2ludDY0IHN2ICk7Cis7CisKK1BVQkxJQyAgX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX3AkID0gOAorX2N2X2xvdyQgPSAxMgorX2N2X2hpZ2gkID0gMTYKK19zdl9sb3ckID0gMjAKK19zdl9oaWdoJCA9IDI0CisKK19fX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0IFBST0MgTkVBUgorCisgICAgICAgIHB1c2ggICAgICBlYnAKKyAgICAgICAgbW92ICAgICAgIGVicCwgZXNwCisgICAgICAgIHB1c2ggICAgICBlYngKKyAgICAgICAgcHVzaCAgICAgIGVkaQorICAgICAgICBtb3YgICAgICAgZWRpLCBEV09SRCBQVFIgX3AkW2VicF0KKyAgICAgICAgbW92ICAgICAgIGVheCwgRFdPUkQgUFRSIF9jdl9sb3ckW2VicF0KKyAgICAgICAgbW92ICAgICAgIGVkeCwgRFdPUkQgUFRSIF9jdl9oaWdoJFtlYnBdCisgICAgICAgIG1vdiAgICAgICBlYngsIERXT1JEIFBUUiBfc3ZfbG93JFtlYnBdCisgICAgICAgIG1vdiAgICAgICBlY3gsIERXT1JEIFBUUiBfc3ZfaGlnaCRbZWJwXQorbG9jayAgICBjbXB4Y2hnOGIgUVdPUkQgUFRSIFtlZGldCisgICAgICAgIHNldGUgICAgICBhbCAgICAgICAgICAgOyBpZiBlZHg6ZWF4ID09IFtlZGldIHNldCBhbCA9IDEgZWxzZSBzZXQgYWwgPSAwCisgICAgICAgIGFuZCAgICAgICBlYXgsIDEgICAgICAgOyBzaWduIGV4dGVuZCBwcmV2aW91cyBpbnN0cnVjdGlvbgorICAgICAgICBwb3AgICAgICAgZWRpCisgICAgICAgIHBvcCAgICAgICBlYngKKyAgICAgICAgbW92ICAgICAgIGVzcCwgZWJwCisgICAgICAgIHBvcCAgICAgICBlYnAKKyAgICAgICAgcmV0CisKK19fX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0IEVORFAKK19URVhUICAgICBFTkRTCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19fa21wX3hjaGdfZml4ZWQ4Cis7Cis7IGttcF9pbnQ4Cis7IF9fa21wX3hjaGdfZml4ZWQ4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggZCApOworOworCitQVUJMSUMgIF9fX2ttcF94Y2hnX2ZpeGVkOAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfcCQgPSA0CitfZCQgPSA4CisKK19fX2ttcF94Y2hnX2ZpeGVkOCBQUk9DIE5FQVIKKworICAgICAgICBtb3YgICAgICAgZWN4LCBEV09SRCBQVFIgX3AkW2VzcF0KKyAgICAgICAgbW92ICAgICAgIGFsLCAgQllURSBQVFIgX2QkW2VzcF0KK2xvY2sgICAgeGNoZyAgICAgIEJZVEUgUFRSIFtlY3hdLCBhbAorICAgICAgICByZXQKKworX19fa21wX3hjaGdfZml4ZWQ4IEVORFAKK19URVhUICAgICBFTkRTCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19fa21wX3hjaGdfZml4ZWQxNgorOworOyBrbXBfaW50MTYKKzsgX19rbXBfeGNoZ19maXhlZDE2KCB2b2xhdGlsZSBrbXBfaW50MTYgKnAsIGttcF9pbnQxNiBkICk7Cis7CisKK1BVQkxJQyAgX19fa21wX3hjaGdfZml4ZWQxNgorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfcCQgPSA0CitfZCQgPSA4CisKK19fX2ttcF94Y2hnX2ZpeGVkMTYgUFJPQyBORUFSCisKKyAgICAgICAgbW92ICAgICAgIGVjeCwgRFdPUkQgUFRSIF9wJFtlc3BdCisgICAgICAgIG1vdiAgICAgICBheCwgIFdPUkQgUFRSICBfZCRbZXNwXQorbG9jayAgICB4Y2hnICAgICAgV09SRCBQVFIgW2VjeF0sIGF4CisgICAgICAgIHJldAorCitfX19rbXBfeGNoZ19maXhlZDE2IEVORFAKK19URVhUICAgICBFTkRTCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19fa21wX3hjaGdfZml4ZWQzMgorOworOyBrbXBfaW50MzIKKzsgX19rbXBfeGNoZ19maXhlZDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBkICk7Cis7CisKK1BVQkxJQyAgX19fa21wX3hjaGdfZml4ZWQzMgorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfcCQgPSA0CitfZCQgPSA4CisKK19fX2ttcF94Y2hnX2ZpeGVkMzIgUFJPQyBORUFSCisKKyAgICAgICAgbW92ICAgICAgIGVjeCwgRFdPUkQgUFRSIF9wJFtlc3BdCisgICAgICAgIG1vdiAgICAgICBlYXgsIERXT1JEIFBUUiBfZCRbZXNwXQorbG9jayAgICB4Y2hnICAgICAgRFdPUkQgUFRSIFtlY3hdLCBlYXgKKyAgICAgICAgcmV0CisKK19fX2ttcF94Y2hnX2ZpeGVkMzIgRU5EUAorX1RFWFQgICAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF94Y2hnX3JlYWwzMgorOworOyBrbXBfcmVhbDMyCis7IF9fa21wX3hjaGdfcmVhbDMyKCB2b2xhdGlsZSBrbXBfcmVhbDMyICpwLCBrbXBfcmVhbDMyIGQgKTsKKzsKKworUFVCTElDICBfX19rbXBfeGNoZ19yZWFsMzIKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX3AkID0gOAorX2QkID0gMTIKK19vbGRfdmFsdWUkID0gLTQKKworX19fa21wX3hjaGdfcmVhbDMyIFBST0MgTkVBUgorCisgICAgICAgIHB1c2ggICAgZWJwCisgICAgICAgIG1vdiAgICAgZWJwLCBlc3AKKyAgICAgICAgc3ViICAgICBlc3AsIDQKKyAgICAgICAgcHVzaCAgICBlc2kKKyAgICAgICAgbW92ICAgICBlc2ksIERXT1JEIFBUUiBfcCRbZWJwXQorCisgICAgICAgIGZsZCAgICAgRFdPUkQgUFRSIFtlc2ldCisgICAgICAgICAgICAgICAgICAgICAgICA7OyBsb2FkIDxhZGRyPgorICAgICAgICBmc3QgICAgIERXT1JEIFBUUiBfb2xkX3ZhbHVlJFtlYnBdCisgICAgICAgICAgICAgICAgICAgICAgICA7OyBzdG9yZSBpbnRvIG9sZF92YWx1ZQorCisgICAgICAgIG1vdiAgICAgZWF4LCBEV09SRCBQVFIgX2QkW2VicF0KKworbG9jayAgICB4Y2hnICAgIERXT1JEIFBUUiBbZXNpXSwgZWF4CisKKyAgICAgICAgZmxkICAgICBEV09SRCBQVFIgX29sZF92YWx1ZSRbZWJwXQorICAgICAgICAgICAgICAgICAgICAgICAgOzsgcmV0dXJuIG9sZF92YWx1ZQorICAgICAgICBwb3AgICAgIGVzaQorICAgICAgICBtb3YgICAgIGVzcCwgZWJwCisgICAgICAgIHBvcCAgICAgZWJwCisgICAgICAgIHJldAorCitfX19rbXBfeGNoZ19yZWFsMzIgRU5EUAorX1RFWFQgICBFTkRTCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OAorOworOyBrbXBfaW50OAorOyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggY3YsIGttcF9pbnQ4IHN2ICk7Cis7CisKK1BVQkxJQyAgX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDgKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX3AkID0gNAorX2N2JCA9IDgKK19zdiQgPSAxMgorCitfX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OCBQUk9DIE5FQVIKKworICAgICAgICBtb3YgICAgICAgZWN4LCBEV09SRCBQVFIgX3AkW2VzcF0KKyAgICAgICAgbW92ICAgICAgIGFsLCBCWVRFIFBUUiBfY3YkW2VzcF0KKyAgICAgICAgbW92ICAgICAgIGRsLCBCWVRFIFBUUiBfc3YkW2VzcF0KK2xvY2sgICAgY21weGNoZyAgIEJZVEUgUFRSIFtlY3hdLCBkbAorICAgICAgICByZXQKKworX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDggRU5EUAorX1RFWFQgICAgIEVORFMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYKKzsKKzsga21wX2ludDE2Cis7IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2KCB2b2xhdGlsZSBrbXBfaW50MTYgKnAsIGttcF9pbnQxNiBjdiwga21wX2ludDE2IHN2ICk7Cis7CisKK1BVQkxJQyAgX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19wJCA9IDQKK19jdiQgPSA4Citfc3YkID0gMTIKKworX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2IFBST0MgTkVBUgorCisgICAgICAgIG1vdiAgICAgICBlY3gsIERXT1JEIFBUUiBfcCRbZXNwXQorICAgICAgICBtb3YgICAgICAgYXgsIFdPUkQgUFRSIF9jdiRbZXNwXQorICAgICAgICBtb3YgICAgICAgZHgsIFdPUkQgUFRSIF9zdiRbZXNwXQorbG9jayAgICBjbXB4Y2hnICAgV09SRCBQVFIgW2VjeF0sIGR4CisgICAgICAgIHJldAorCitfX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYgRU5EUAorX1RFWFQgICAgIEVORFMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIKKzsKKzsga21wX2ludDMyCis7IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBjdiwga21wX2ludDMyIHN2ICk7Cis7CisKK1BVQkxJQyAgX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDMyCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19wJCA9IDQKK19jdiQgPSA4Citfc3YkID0gMTIKKworX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDMyIFBST0MgTkVBUgorCisgICAgICAgIG1vdiAgICAgICBlY3gsIERXT1JEIFBUUiBfcCRbZXNwXQorICAgICAgICBtb3YgICAgICAgZWF4LCBEV09SRCBQVFIgX2N2JFtlc3BdCisgICAgICAgIG1vdiAgICAgICBlZHgsIERXT1JEIFBUUiBfc3YkW2VzcF0KK2xvY2sgICAgY21weGNoZyAgIERXT1JEIFBUUiBbZWN4XSwgZWR4CisgICAgICAgIHJldAorCitfX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIgRU5EUAorX1RFWFQgICAgIEVORFMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQKKzsKKzsga21wX2ludDY0Cis7IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBjdiwga21wX2ludDY0IHN2ICk7Cis7CisKK1BVQkxJQyAgX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19wJCA9IDgKK19jdl9sb3ckID0gMTIKK19jdl9oaWdoJCA9IDE2Citfc3ZfbG93JCA9IDIwCitfc3ZfaGlnaCQgPSAyNAorCitfX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQgUFJPQyBORUFSCisKKyAgICAgICAgcHVzaCAgICAgIGVicAorICAgICAgICBtb3YgICAgICAgZWJwLCBlc3AKKyAgICAgICAgcHVzaCAgICAgIGVieAorICAgICAgICBwdXNoICAgICAgZWRpCisgICAgICAgIG1vdiAgICAgICBlZGksIERXT1JEIFBUUiBfcCRbZWJwXQorICAgICAgICBtb3YgICAgICAgZWF4LCBEV09SRCBQVFIgX2N2X2xvdyRbZWJwXQorICAgICAgICBtb3YgICAgICAgZWR4LCBEV09SRCBQVFIgX2N2X2hpZ2gkW2VicF0KKyAgICAgICAgbW92ICAgICAgIGVieCwgRFdPUkQgUFRSIF9zdl9sb3ckW2VicF0KKyAgICAgICAgbW92ICAgICAgIGVjeCwgRFdPUkQgUFRSIF9zdl9oaWdoJFtlYnBdCitsb2NrICAgIGNtcHhjaGc4YiBRV09SRCBQVFIgW2VkaV0KKyAgICAgICAgcG9wICAgICAgIGVkaQorICAgICAgICBwb3AgICAgICAgZWJ4CisgICAgICAgIG1vdiAgICAgICBlc3AsIGVicAorICAgICAgICBwb3AgICAgICAgZWJwCisgICAgICAgIHJldAorCitfX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQgRU5EUAorX1RFWFQgICAgIEVORFMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZAorOworOyB2b2lkCis7IF9fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQoIGttcF9pbnQxNiAqcCApOworOworOyBwYXJhbWV0ZXJzOgorOyAgICAgICBwOiAgICAgIDQoJWVzcCkKKworUFVCTElDICBfX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfcCQgPSA0CisKK19fX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkIFBST0MgTkVBUgorCisgICAgICAgIG1vdiAgICAgICBlYXgsIERXT1JEIFBUUiBfcCRbZXNwXQorICAgICAgICBmbGRjdyAgICAgV09SRCBQVFIgW2VheF0KKyAgICAgICAgcmV0CisKK19fX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkIEVORFAKK19URVhUICAgICBFTkRTCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkCis7Cis7IHZvaWQKKzsgX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQoIGttcF9pbnQxNiAqcCApOworOworOyBwYXJhbWV0ZXJzOgorOyAgICAgICBwOiAgICAgIDQoJWVzcCkKKworUFVCTElDICBfX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX3AkID0gNAorCitfX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQgUFJPQyBORUFSCisKKyAgICAgICAgbW92ICAgICAgIGVheCwgRFdPUkQgUFRSIF9wJFtlc3BdCisgICAgICAgIGZzdGN3ICAgICBXT1JEIFBUUiBbZWF4XQorICAgICAgICByZXQKKworX19fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkIEVORFAKK19URVhUICAgICBFTkRTCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQKKzsKKzsgdm9pZAorOyBfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkKCk7Cis7CisKK1BVQkxJQyAgX19fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorCitfX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZCBQUk9DIE5FQVIKKworICAgICAgICBmbmNsZXgKKyAgICAgICAgcmV0CisKK19fX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkIEVORFAKK19URVhUICAgICBFTkRTCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfaW52b2tlX21pY3JvdGFzaworOworOyB0eXBlZGVmIHZvaWQgICgqbWljcm90YXNrX3QpKCBpbnQgKmd0aWQsIGludCAqdGlkLCAuLi4gKTsKKzsKKzsgaW50Cis7IF9fa21wX2ludm9rZV9taWNyb3Rhc2soIG1pY3JvdGFza190IHBrZm4sCis7ICAgICAgICAgICAgICAgICAgICAgICAgIGludCBndGlkLCBpbnQgdGlkLAorOyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJnYywgdm9pZCAqcF9hcmd2W10gKQorOworCitQVUJMSUMgIF9fX2ttcF9pbnZva2VfbWljcm90YXNrCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19wa2ZuJCA9IDgKK19ndGlkJCA9IDEyCitfdGlkJCA9IDE2CitfYXJnYyQgPSAyMAorX2FyZ3YkID0gMjQKK2lmIE9NUFRfU1VQUE9SVAorX2V4aXRfZnJhbWUkID0gMjgKK2VuZGlmCitfaSQgPSAtOAorX3N0a19hZGokID0gLTE2CitfdnB0ciQgPSAtMTIKK19xcHRyJCA9IC00CisKK19fX2ttcF9pbnZva2VfbWljcm90YXNrIFBST0MgTkVBUgorOyBMaW5lIDEwMgorICAgICAgICBwdXNoICAgIGVicAorICAgICAgICBtb3YgICAgIGVicCwgZXNwCisgICAgICAgIHN1YiAgICAgZXNwLCAxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgMDAwMDAwMTBICisgICAgICAgIHB1c2ggICAgZWJ4CisgICAgICAgIHB1c2ggICAgZXNpCisgICAgICAgIHB1c2ggICAgZWRpCitpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgbW92ICAgICBlYXgsIERXT1JEIFBUUiBfZXhpdF9mcmFtZSRbZWJwXQorICAgICAgICBtb3YgICAgIERXT1JEIFBUUiBbZWF4XSwgZWJwCitlbmRpZgorOyBMaW5lIDExNAorICAgICAgICBtb3YgICAgIGVheCwgRFdPUkQgUFRSIF9hcmdjJFtlYnBdCisgICAgICAgIG1vdiAgICAgRFdPUkQgUFRSIF9pJFtlYnBdLCBlYXgKKworOzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJbGVhICAgICBlZHgsIERXT1JEIFBUUiBbZWF4KjQrOF0KKwltb3YgICAgIGVjeCwgZXNwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IFNhdmUgY3VycmVudCBTUCBpbnRvIEVDWAorCW1vdgllYXgsZWR4CQk7IFNhdmUgdGhlIHNpemUgb2YgdGhlIGFyZ3MgaW4gZWF4CisJc3ViCWVjeCxlZHgJCTsgZXNwLSgoI2FyZ3MrMikqNCkgLT4gZWN4IC0tIHdpdGhvdXQgbW9kcywgc3RhY2sgcHRyIHdvdWxkIGJlIHRoaXMKKwltb3YJZWR4LGVjeAkJOyBTYXZlIHRvIGVkeAorCWFuZAllY3gsLTEyOAk7IE1hc2sgb2ZmIDcgYml0cworCXN1YgllZHgsZWN4CQk7IEFtb3VudCB0byBzdWJ0cmFjdCBmcm9tIGVzcAorCXN1Ygllc3AsZWR4CQk7IFByZXBhcmUgc3RhY2sgcHRyLS0gTm93IGl0IHdpbGwgYmUgYWxpZ25lZCBvbiAxMjgtYnl0ZSBib3VuZGFyeSBhdCB0aGUgY2FsbAorCisJYWRkCWVkeCxlYXgJCTsgQ2FsY3VsYXRlIHRvdGFsIHNpemUgb2YgdGhlIHN0YWNrIGRlY3JlbWVudC4KKyAgICAgICAgbW92ICAgICBEV09SRCBQVFIgX3N0a19hZGokW2VicF0sIGVkeAorOzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgam1wICAgICBTSE9SVCAkTDIyMjM3CiskTDIyMjM4OgorICAgICAgICBtb3YgICAgIGVjeCwgRFdPUkQgUFRSIF9pJFtlYnBdCisgICAgICAgIHN1YiAgICAgZWN4LCAxCisgICAgICAgIG1vdiAgICAgRFdPUkQgUFRSIF9pJFtlYnBdLCBlY3gKKyRMMjIyMzc6CisgICAgICAgIGNtcCAgICAgRFdPUkQgUFRSIF9pJFtlYnBdLCAwCisgICAgICAgIGpsZSAgICAgU0hPUlQgJEwyMjIzOQorOyBMaW5lIDExNgorICAgICAgICBtb3YgICAgIGVkeCwgRFdPUkQgUFRSIF9pJFtlYnBdCisgICAgICAgIG1vdiAgICAgZWF4LCBEV09SRCBQVFIgX2FyZ3YkW2VicF0KKyAgICAgICAgbW92ICAgICBlY3gsIERXT1JEIFBUUiBbZWF4K2VkeCo0LTRdCisgICAgICAgIG1vdiAgICAgRFdPUkQgUFRSIF92cHRyJFtlYnBdLCBlY3gKKzsgTGluZSAxMjMKKyAgICAgICAgbW92ICAgICBlYXgsIERXT1JEIFBUUiBfdnB0ciRbZWJwXQorOyBMaW5lIDEyNAorICAgICAgICBwdXNoICAgIGVheAorOyBMaW5lIDEyNworICAgICAgICBqbXAgICAgIFNIT1JUICRMMjIyMzgKKyRMMjIyMzk6Cis7IExpbmUgMTI5CisgICAgICAgIGxlYSAgICAgZWR4LCBEV09SRCBQVFIgX3RpZCRbZWJwXQorICAgICAgICBtb3YgICAgIERXT1JEIFBUUiBfdnB0ciRbZWJwXSwgZWR4Cis7IExpbmUgMTMwCisgICAgICAgIGxlYSAgICAgZWF4LCBEV09SRCBQVFIgX2d0aWQkW2VicF0KKyAgICAgICAgbW92ICAgICBEV09SRCBQVFIgX3FwdHIkW2VicF0sIGVheAorOyBMaW5lIDE0MworICAgICAgICBtb3YgICAgIGVheCwgRFdPUkQgUFRSIF92cHRyJFtlYnBdCis7IExpbmUgMTQ0CisgICAgICAgIHB1c2ggICAgZWF4Cis7IExpbmUgMTQ1CisgICAgICAgIG1vdiAgICAgZWF4LCBEV09SRCBQVFIgX3FwdHIkW2VicF0KKzsgTGluZSAxNDYKKyAgICAgICAgcHVzaCAgICBlYXgKKzsgTGluZSAxNDcKKyAgICAgICAgY2FsbCAgICBEV09SRCBQVFIgX3BrZm4kW2VicF0KKzsgTGluZSAxNDgKKyAgICAgICAgYWRkICAgICBlc3AsIERXT1JEIFBUUiBfc3RrX2FkaiRbZWJwXQorOyBMaW5lIDE1MgorICAgICAgICBtb3YgICAgIGVheCwgMQorOyBMaW5lIDE1MworICAgICAgICBwb3AgICAgIGVkaQorICAgICAgICBwb3AgICAgIGVzaQorICAgICAgICBwb3AgICAgIGVieAorICAgICAgICBtb3YgICAgIGVzcCwgZWJwCisgICAgICAgIHBvcCAgICAgZWJwCisgICAgICAgIHJldCAgICAgMAorX19fa21wX2ludm9rZV9taWNyb3Rhc2sgRU5EUAorX1RFWFQgICBFTkRTCisKK2VuZGlmCisKKzsgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEludGVsKFIpIDY0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2lmZGVmIF9NX0FNRDY0CisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19rbXBfeDg2X2NwdWlkCis7Cis7IHZvaWQKKzsgX19rbXBfeDg2X2NwdWlkKCBpbnQgbW9kZSwgaW50IG1vZGUyLCBzdHJ1Y3Qga21wX2NwdWlkICpwICk7Cis7Cis7IHBhcmFtZXRlcnM6Cis7CW1vZGU6CQllY3gKKzsJbW9kZTI6CQllZHgKKzsJY3B1aWRfYnVmZmVyOiAJcjgKKworUFVCTElDICBfX2ttcF94ODZfY3B1aWQKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorCitfX2ttcF94ODZfY3B1aWQgUFJPQyBGUkFNRSA7TkVBUgorCisgICAgICAgIHB1c2ggICAgICByYnAKKyAgICAgICAgLnB1c2hyZWcgIHJicAorICAgICAgICBtb3YgICAgICAgcmJwLCByc3AKKyAgICAgICAgLnNldGZyYW1lIHJicCwgMAorICAgICAgICBwdXNoICAgICAgcmJ4CQkJCTsgY2FsbGVlLXNhdmUgcmVnaXN0ZXIKKyAgICAgICAgLnB1c2hyZWcgIHJieAorICAgICAgICAuRU5EUFJPTE9HCisKKwltb3YJICByMTAsIHI4ICAgICAgICAgICAgICAgICAgICAgICA7IHAgcGFyYW1ldGVyCisgICAgICAgIG1vdgkgIGVheCwgZWN4CQkJOyBtb2RlIHBhcmFtZXRlcgorICAgICAgICBtb3YJICBlY3gsIGVkeCAgICAgICAgICAgICAgICAgICAgICA7IG1vZGUyIHBhcmFtZXRlcgorCWNwdWlkCQkJCQk7IFF1ZXJ5IHRoZSBDUFVJRCBmb3IgdGhlIGN1cnJlbnQgcHJvY2Vzc29yCisKKwltb3YgCSAgRFdPUkQgUFRSIDBbIHIxMCBdLCBlYXgJOyBzdG9yZSByZXN1bHRzIGludG8gYnVmZmVyCisJbW92IAkgIERXT1JEIFBUUiA0WyByMTAgXSwgZWJ4CisJbW92IAkgIERXT1JEIFBUUiA4WyByMTAgXSwgZWN4CisJbW92IAkgIERXT1JEIFBUUiAxMlsgcjEwIF0sIGVkeAorCisgICAgICAgIHBvcCAgICAgICByYngJCQkJOyBjYWxsZWUtc2F2ZSByZWdpc3RlcgorICAgICAgICBtb3YgICAgICAgcnNwLCByYnAKKyAgICAgICAgcG9wICAgICAgIHJicAorICAgICAgICByZXQKKworX19rbXBfeDg2X2NwdWlkIEVORFAKK19URVhUICAgICBFTkRTCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX2ttcF90ZXN0X3RoZW5fYWRkMzIKKzsKKzsga21wX2ludDMyCis7IF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgZCApOworOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJZDoJZWR4Cis7Cis7IHJldHVybjogCWVheAorCitQVUJMSUMgIF9fa21wX3Rlc3RfdGhlbl9hZGQzMgorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfX2ttcF90ZXN0X3RoZW5fYWRkMzIgUFJPQyA7TkVBUgorCisgICAgICAgIG1vdiAgICAgZWF4LCBlZHgKK2xvY2sgICAgeGFkZCAgICBEV09SRCBQVFIgW3JjeF0sIGVheAorICAgICAgICByZXQKKworX19rbXBfdGVzdF90aGVuX2FkZDMyIEVORFAKK19URVhUICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19rbXBfdGVzdF90aGVuX2FkZDY0Cis7Cis7IGttcF9pbnQzMgorOyBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGQgKTsKKzsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CWQ6CXJkeAorOworOyByZXR1cm46IAlyYXgKKworUFVCTElDICBfX2ttcF90ZXN0X3RoZW5fYWRkNjQKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX19rbXBfdGVzdF90aGVuX2FkZDY0IFBST0MgO05FQVIKKworICAgICAgICBtb3YgICAgIHJheCwgcmR4Citsb2NrICAgIHhhZGQgICAgUVdPUkQgUFRSIFtyY3hdLCByYXgKKyAgICAgICAgcmV0CisKK19fa21wX3Rlc3RfdGhlbl9hZGQ2NCBFTkRQCitfVEVYVCAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOAorOworOyBrbXBfaW50OAorOyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgoIHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCBjdiwga21wX2ludDggc3YgKTsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CWN2OgllZHgKKzsJc3Y6CXI4ZAorOworOyByZXR1cm46CWVheAorCitQVUJMSUMgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlOCBQUk9DIDtORUFSCisKKyAgICAgICAgbW92ICAgICAgIGFsLCBkbAk7ICJjdiIKKwltb3YJICBlZHgsIHI4ZAk7ICJzdiIKK2xvY2sgICAgY21weGNoZyAgIEJZVEUgUFRSIFtyY3hdLCBkbAorICAgICAgICBzZXRlICAgICAgYWwgICAgICAgICAgIAk7IGlmIGFsID09IFtyY3hdIHNldCBhbCA9IDEgZWxzZSBzZXQgYWwgPSAwCisgICAgICAgIGFuZCAgICAgICByYXgsIDEgICAgICAgCTsgc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24KKyAgICAgICAgcmV0CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlOCBFTkRQCitfVEVYVCAgICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNgorOworOyBrbXBfaW50MTYKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNiggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgY3YsIGttcF9pbnQxNiBzdiApOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJY3Y6CWVkeAorOwlzdjoJcjhkCis7Cis7IHJldHVybjoJZWF4CisKK1BVQkxJQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNgorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYgUFJPQyA7TkVBUgorCisgICAgICAgIG1vdiAgICAgICBheCwgZHgJOyAiY3YiCisJbW92CSAgZWR4LCByOGQJOyAic3YiCitsb2NrICAgIGNtcHhjaGcgICBXT1JEIFBUUiBbcmN4XSwgZHgKKyAgICAgICAgc2V0ZSAgICAgIGFsICAgICAgICAgICAJOyBpZiBheCA9PSBbcmN4XSBzZXQgYWwgPSAxIGVsc2Ugc2V0IGFsID0gMAorICAgICAgICBhbmQgICAgICAgcmF4LCAxICAgICAgIAk7IHNpZ24gZXh0ZW5kIHByZXZpb3VzIGluc3RydWN0aW9uCisgICAgICAgIHJldAorCitfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2IEVORFAKK19URVhUICAgICBFTkRTCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyCis7Cis7IGttcF9pbnQzMgorOyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBjdiwga21wX2ludDMyIHN2ICk7Cis7IHBhcmFtZXRlcnM6Cis7CXA6CXJjeAorOwljdjoJZWR4Cis7CXN2OglyOGQKKzsKKzsgcmV0dXJuOgllYXgKKworUFVCTElDICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKKworX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMiBQUk9DIDtORUFSCisKKyAgICAgICAgbW92ICAgICAgIGVheCwgZWR4CTsgImN2IgorCW1vdgkgIGVkeCwgcjhkCTsgInN2IgorbG9jayAgICBjbXB4Y2hnICAgRFdPUkQgUFRSIFtyY3hdLCBlZHgKKyAgICAgICAgc2V0ZSAgICAgIGFsICAgICAgICAgICAJOyBpZiBlYXggPT0gW3JjeF0gc2V0IGFsID0gMSBlbHNlIHNldCBhbCA9IDAKKyAgICAgICAgYW5kICAgICAgIHJheCwgMSAgICAgICAJOyBzaWduIGV4dGVuZCBwcmV2aW91cyBpbnN0cnVjdGlvbgorICAgICAgICByZXQKKworX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMiBFTkRQCitfVEVYVCAgICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NAorOworOyBrbXBfaW50MzIKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgY3YsIGttcF9pbnQ2NCBzdiApOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJY3Y6CXJkeAorOwlzdjoJcjgKKzsKKzsgcmV0dXJuOgllYXgKKworUFVCTElDICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKKworX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NCBQUk9DIDtORUFSCisKKyAgICAgICAgbW92ICAgICAgIHJheCwgcmR4CTsgImN2IgorCW1vdgkgIHJkeCwgcjgJOyAic3YiCitsb2NrICAgIGNtcHhjaGcgICBRV09SRCBQVFIgW3JjeF0sIHJkeAorICAgICAgICBzZXRlICAgICAgYWwgICAgICAgICAgIDsgaWYgcmF4ID09IFtyY3hdIHNldCBhbCA9IDEgZWxzZSBzZXQgYWwgPSAwCisgICAgICAgIGFuZCAgICAgICByYXgsIDEgICAgICAgOyBzaWduIGV4dGVuZCBwcmV2aW91cyBpbnN0cnVjdGlvbgorICAgICAgICByZXQKKworX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NCBFTkRQCitfVEVYVCAgICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19fa21wX3hjaGdfZml4ZWQ4Cis7Cis7IGttcF9pbnQ4Cis7IF9fa21wX3hjaGdfZml4ZWQ4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggZCApOworOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJZDoJZGwKKzsKKzsgcmV0dXJuOiAJYWwKKworUFVCTElDICBfX2ttcF94Y2hnX2ZpeGVkOAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CisKK19fa21wX3hjaGdfZml4ZWQ4IFBST0MgO05FQVIKKworICAgICAgICBtb3YgICAgICAgYWwsICBkbAorbG9jayAgICB4Y2hnICAgICAgQllURSBQVFIgW3JjeF0sIGFsCisgICAgICAgIHJldAorCitfX2ttcF94Y2hnX2ZpeGVkOCBFTkRQCitfVEVYVCAgICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19fa21wX3hjaGdfZml4ZWQxNgorOworOyBrbXBfaW50MTYKKzsgX19rbXBfeGNoZ19maXhlZDE2KCB2b2xhdGlsZSBrbXBfaW50MTYgKnAsIGttcF9pbnQxNiBkICk7Cis7Cis7IHBhcmFtZXRlcnM6Cis7CXA6CXJjeAorOwlkOglkeAorOworOyByZXR1cm46IAlheAorCitQVUJMSUMgIF9fa21wX3hjaGdfZml4ZWQxNgorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CisKK19fa21wX3hjaGdfZml4ZWQxNiBQUk9DIDtORUFSCisKKyAgICAgICAgbW92ICAgICAgIGF4LCAgZHgKK2xvY2sgICAgeGNoZyAgICAgIFdPUkQgUFRSIFtyY3hdLCBheAorICAgICAgICByZXQKKworX19rbXBfeGNoZ19maXhlZDE2IEVORFAKK19URVhUICAgICBFTkRTCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfeGNoZ19maXhlZDMyCis7Cis7IGttcF9pbnQzMgorOyBfX2ttcF94Y2hnX2ZpeGVkMzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGQgKTsKKzsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CWQ6CWVkeAorOworOyByZXR1cm46IAllYXgKKworUFVCTElDICBfX2ttcF94Y2hnX2ZpeGVkMzIKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX19rbXBfeGNoZ19maXhlZDMyIFBST0MgO05FQVIKKworICAgICAgICBtb3YgICAgIGVheCwgZWR4Citsb2NrICAgIHhjaGcgICAgRFdPUkQgUFRSIFtyY3hdLCBlYXgKKyAgICAgICAgcmV0CisKK19fa21wX3hjaGdfZml4ZWQzMiBFTkRQCitfVEVYVCAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF94Y2hnX2ZpeGVkNjQKKzsKKzsga21wX2ludDY0Cis7IF9fa21wX3hjaGdfZml4ZWQ2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgZCApOworOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJZDoJcmR4Cis7Cis7IHJldHVybjogCXJheAorCitQVUJMSUMgIF9fa21wX3hjaGdfZml4ZWQ2NAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfX2ttcF94Y2hnX2ZpeGVkNjQgUFJPQyA7TkVBUgorCisgICAgICAgIG1vdiAgICAgcmF4LCByZHgKK2xvY2sgICAgeGNoZyAgICBRV09SRCBQVFIgW3JjeF0sIHJheAorICAgICAgICByZXQKKworX19rbXBfeGNoZ19maXhlZDY0IEVORFAKK19URVhUICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OAorOworOyBrbXBfaW50OAorOyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggY3YsIGttcF9pbnQ4IHN2ICk7Cis7IHBhcmFtZXRlcnM6Cis7CXA6CXJjeAorOwljdjoJZWR4Cis7CXN2OglyOGQKKzsKKzsgcmV0dXJuOgllYXgKKworUFVCTElDICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ4CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKKworX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OCBQUk9DIDtORUFSCisgICAgICAgIG1vdiAgICAgICBhbCwgZGwJOyAiY3YiCisJbW92CSAgZWR4LCByOGQJOyAic3YiCitsb2NrICAgIGNtcHhjaGcgICBCWVRFIFBUUiBbcmN4XSwgZGwKKyAgICAgICAgICAgICAgICAgICAgICAgIDsgQ29tcGFyZSBBTCB3aXRoIFtyY3hdLiAgSWYgZXF1YWwgc2V0CisgICAgICAgICAgICAgICAgICAgICAgICA7IFpGIGFuZCBleGNoYW5nZSBETCB3aXRoIFtyY3hdLiAgRWxzZSwgY2xlYXIKKyAgICAgICAgICAgICAgICAgICAgICAgIDsgWkYgYW5kIGxvYWQgW3JjeF0gaW50byBBTC4KKyAgICAgICAgcmV0CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDggRU5EUAorX1RFWFQgICAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2Cis7Cis7IGttcF9pbnQxNgorOyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNiggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgY3YsIGttcF9pbnQxNiBzdiApOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJY3Y6CWVkeAorOwlzdjoJcjhkCis7Cis7IHJldHVybjoJZWF4CisKK1BVQkxJQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorCitfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNiBQUk9DIDtORUFSCisKKyAgICAgICAgbW92ICAgICAgIGF4LCBkeAk7ICJjdiIKKwltb3YJICBlZHgsIHI4ZAk7ICJzdiIKK2xvY2sgICAgY21weGNoZyAgIFdPUkQgUFRSIFtyY3hdLCBkeAorICAgICAgICByZXQKKworX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYgRU5EUAorX1RFWFQgICAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDMyCis7Cis7IGttcF9pbnQzMgorOyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgY3YsIGttcF9pbnQzMiBzdiApOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJY3Y6CWVkeAorOwlzdjoJcjhkCis7Cis7IHJldHVybjoJZWF4CisKK1BVQkxJQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorCitfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMiBQUk9DIDtORUFSCisKKyAgICAgICAgbW92ICAgICAgIGVheCwgZWR4CTsgImN2IgorCW1vdgkgIGVkeCwgcjhkCTsgInN2IgorbG9jayAgICBjbXB4Y2hnICAgRFdPUkQgUFRSIFtyY3hdLCBlZHgKKyAgICAgICAgcmV0CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDMyIEVORFAKK19URVhUICAgICBFTkRTCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NAorOworOyBrbXBfaW50NjQKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGN2LCBrbXBfaW50NjQgc3YgKTsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CWN2OglyZHgKKzsJc3Y6CXI4Cis7Cis7IHJldHVybjoJcmF4CisKK1BVQkxJQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorCitfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NCBQUk9DIDtORUFSCisKKyAgICAgICAgbW92ICAgICAgIHJheCwgcmR4CTsgImN2IgorCW1vdgkgIHJkeCwgcjgJOyAic3YiCitsb2NrICAgIGNtcHhjaGcgICBRV09SRCBQVFIgW3JjeF0sIHJkeAorICAgICAgICByZXQKKworX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQgRU5EUAorX1RFWFQgICAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX2xvb3A4Cis7Cis7IGttcF9pbnQ4Cis7IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX2xvb3A4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggY3YsIGttcF9pbnQ4IHN2ICk7Cis7IHBhcmFtZXRlcnM6Cis7CXA6CXJjeAorOwljdjoJZWR4Cis7CXN2OglyOGQKKzsKKzsgcmV0dXJuOglhbAorCitQVUJMSUMgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX2xvb3A4CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKKworX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfbG9vcDggUFJPQyA7TkVBUgorJF9fa21wX2xvb3A6CisgICAgICAgIG1vdiAgICAgICBhbCwgZGwJOyAiY3YiCisJbW92CSAgZWR4LCByOGQJOyAic3YiCitsb2NrICAgIGNtcHhjaGcgICBCWVRFIFBUUiBbcmN4XSwgZGwKKyAgICAgICAgICAgICAgICAgICAgICAgIDsgQ29tcGFyZSBBTCB3aXRoIFtyY3hdLiAgSWYgZXF1YWwgc2V0CisgICAgICAgICAgICAgICAgICAgICAgICA7IFpGIGFuZCBleGNoYW5nZSBETCB3aXRoIFtyY3hdLiAgRWxzZSwgY2xlYXIKKyAgICAgICAgICAgICAgICAgICAgICAgIDsgWkYgYW5kIGxvYWQgW3JjeF0gaW50byBBTC4KKyAgICAgICAganogICAgIAlTSE9SVCAkX19rbXBfc3VjY2VzcworCisgICAgICAgIGRiICAgICAgMGYzSAorICAgICAgICBkYiAgICAgIDA5MEggICAgCQk7IHBhdXNlCisKKwlqbXAJU0hPUlQgJF9fa21wX2xvb3AKKworJF9fa21wX3N1Y2Nlc3M6CisgICAgICAgIHJldAorCitfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9sb29wOCBFTkRQCitfVEVYVCAgICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19rbXBfeGNoZ19yZWFsMzIKKzsKKzsga21wX3JlYWwzMgorOyBfX2ttcF94Y2hnX3JlYWwzMiggdm9sYXRpbGUga21wX3JlYWwzMiAqcCwga21wX3JlYWwzMiBkICk7Cis7Cis7IHBhcmFtZXRlcnM6Cis7CXA6CXJjeAorOyAgICAgICBkOgl4bW0xIChsb3dlciA0IGJ5dGVzKQorOworOyByZXR1cm46CXhtbTAgKGxvd2VyIDQgYnl0ZXMpCisKK1BVQkxJQyAgX19rbXBfeGNoZ19yZWFsMzIKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX19rbXBfeGNoZ19yZWFsMzIgUFJPQyA7TkVBUgorCisJbW92ZAllYXgsIHhtbTEJCTsgbG9hZCBkCisKK2xvY2sgICAgeGNoZyAgICBEV09SRCBQVFIgW3JjeF0sIGVheAorCisJbW92ZAl4bW0wLCBlYXgJCTsgbG9hZCBvbGQgdmFsdWUgaW50byByZXR1cm4gcmVnaXN0ZXIKKyAgICAgICAgcmV0CisKK19fa21wX3hjaGdfcmVhbDMyIEVORFAKK19URVhUICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19rbXBfeGNoZ19yZWFsNjQKKzsKKzsga21wX3JlYWw2NAorOyBfX2ttcF94Y2hnX3JlYWw2NCggdm9sYXRpbGUga21wX3JlYWw2NCAqcCwga21wX3JlYWw2NCBkICk7Cis7Cis7IHBhcmFtZXRlcnM6Cis7CXA6CXJjeAorOwlkOgl4bW0xIChsb3dlciA4IGJ5dGVzKQorOworOyByZXR1cm46CXhtbTAgKGxvd2VyIDggYnl0ZXMpCisKK1BVQkxJQyAgX19rbXBfeGNoZ19yZWFsNjQKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX19rbXBfeGNoZ19yZWFsNjQgUFJPQyA7TkVBUgorCisJbW92ZAlyYXgsIHhtbTEJCTsgbG9hZCAiZCIKKworbG9jayAgICB4Y2hnICAgIFFXT1JEIFBUUiBbcmN4XSwgcmF4CisKKwltb3ZkCXhtbTAsIHJheAkJOyBsb2FkIG9sZCB2YWx1ZSBpbnRvIHJldHVybiByZWdpc3RlcgorICAgICAgICByZXQKKworX19rbXBfeGNoZ19yZWFsNjQgRU5EUAorX1RFWFQgICBFTkRTCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZAorOworOyB2b2lkCis7IF9fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQoIGttcF9pbnQxNiAqcCApOworOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsKKworUFVCTElDICBfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQgUFJPQyA7TkVBUgorCisgICAgICAgIGZsZGN3ICAgV09SRCBQVFIgW3JjeF0KKyAgICAgICAgcmV0CisKK19fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQgRU5EUAorX1RFWFQgICBFTkRTCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZAorOworOyB2b2lkCis7IF9fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkKCBrbXBfaW50MTYgKnAgKTsKKzsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CisKK1BVQkxJQyAgX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQgUFJPQyA7TkVBUgorCisgICAgICAgIGZzdGN3ICAgV09SRCBQVFIgW3JjeF0KKyAgICAgICAgcmV0CisKK19fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkIEVORFAKK19URVhUICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZAorOworOyB2b2lkCis7IF9fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQoKQorOworCitQVUJMSUMgIF9fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZCBQUk9DIDtORUFSCisKKyAgICAgICAgZm5jbGV4CisgICAgICAgIHJldAorCitfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkIEVORFAKK19URVhUICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19rbXBfaW52b2tlX21pY3JvdGFzaworOworOyB0eXBlZGVmIHZvaWQgICgqbWljcm90YXNrX3QpKCBpbnQgKmd0aWQsIGludCAqdGlkLCAuLi4gKTsKKzsKKzsgaW50Cis7IF9fa21wX2ludm9rZV9taWNyb3Rhc2soIG1pY3JvdGFza190IHBrZm4sCis7ICAgICAgICAgICAgICAgICAgICAgICAgIGludCBndGlkLCBpbnQgdGlkLAorOyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJnYywgdm9pZCAqcF9hcmd2W10gKSB7Cis7Cis7ICAgICAoKnBrZm4pICggJmd0aWQsICZ0aWQsIGFyZ3ZbMF0sIC4uLiApOworOyAgICAgcmV0dXJuIDE7Cis7IH0KKzsKKzsgbm90ZToKKzsgICAgICBqdXN0IGJlZm9yZSBjYWxsIHRvIHBrZm4gbXVzdCBoYXZlIHJzcCAxMjgtYnl0ZSBhbGlnbmVkIGZvciBjb21waWxlcgorOworOyBwYXJhbWV0ZXJzOgorOyAgICAgIHJjeDogICBwa2ZuCTE2W3JicF0KKzsgICAgICBlZHg6ICAgZ3RpZAkyNFtyYnBdCis7ICAgICAgcjhkOiAgIHRpZAkzMltyYnBdCis7ICAgICAgcjlkOiAgIGFyZ2MJNDBbcmJwXQorOyAgICAgIFtzdF06ICBwX2FyZ3YJNDhbcmJwXQorOworOyByZWcgdGVtcHM6Cis7ICAgICAgcmF4OiAgIHVzZWQgYWxsIG92ZXIgdGhlIHBsYWNlCis7ICAgICAgcmR4OiAgIHVzZWQgYWxsIG92ZXIgdGhlIHBsYWNlCis7ICAgICAgcmN4OiAgIHVzZWQgYXMgYXJndW1lbnQgY291bnRlciBmb3IgcHVzaCBwYXJtcyBsb29wCis7ICAgICAgcjEwOiAgIHVzZWQgdG8gaG9sZCBwa2ZuIGZ1bmN0aW9uIHBvaW50ZXIgYXJndW1lbnQKKzsKKzsgcmV0dXJuOiAgICAgIGVheCAgICAoYWx3YXlzIDEvVFJVRSkKKzsKKworJF9wa2ZuICAgPSAxNgorJF9ndGlkICAgPSAyNAorJF90aWQgICAgPSAzMgorJF9hcmdjICAgPSA0MAorJF9wX2FyZ3YgPSA0OAoraWYgT01QVF9TVVBQT1JUCiskX2V4aXRfZnJhbWUgPSA1NgorZW5kaWYKKworUFVCTElDICBfX2ttcF9pbnZva2VfbWljcm90YXNrCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKKworX19rbXBfaW52b2tlX21pY3JvdGFzayBQUk9DIEZSQU1FIDtORUFSCisJbW92CVFXT1JEIFBUUiAxNltyc3BdLCByZHgJOyBob21lIGd0aWQgcGFyYW1ldGVyCisJbW92IAlRV09SRCBQVFIgMjRbcnNwXSwgcjgJOyBob21lIHRpZCBwYXJhbWV0ZXIKKyAgICAgICAgcHVzaCAgICByYnAJCTsgc2F2ZSBiYXNlIHBvaW50ZXIKKyAgICAgICAgLnB1c2hyZWcgcmJwCisJc3ViCXJzcCwgMAkJOyBubyBmaXhlZCBhbGxvY2F0aW9uIG5lY2Vzc2FyeSAtIGVuZCBwcm9sb2cKKworICAgICAgICBsZWEgICAgIHJicCwgUVdPUkQgUFRSIFtyc3BdICAgCTsgZXN0YWJsaXNoIHRoZSBiYXNlIHBvaW50ZXIKKyAgICAgICAgLnNldGZyYW1lIHJicCwgMAorICAgICAgICAuRU5EUFJPTE9HCitpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgbW92ICAgICByYXgsIFFXT1JEIFBUUiAkX2V4aXRfZnJhbWVbcmJwXQorICAgICAgICBtb3YgICAgIFFXT1JEIFBUUiBbcmF4XSwgcmJwCitlbmRpZgorCW1vdglyMTAsIHJjeAk7IHNhdmUgcGtmbiBwb2ludGVyIGZvciBsYXRlcgorCis7OyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgbW92ICAgICByYXgsIHI5CQk7IHJheCA8PSBhcmdjCisgICAgICAgIGNtcCAgICAgcmF4LCAyCisgICAgICAgIGpnZSAgICAgU0hPUlQgJF9rbXBfaW52b2tlX3N0YWNrX2FsaWduCisgICAgICAgIG1vdiAgICAgcmF4LCAyICAgICAgICAgIDsgc2V0IDQgaG9tZXMgaWYgbGVzcyB0aGFuIDIgcGFybXMKKyRfa21wX2ludm9rZV9zdGFja19hbGlnbjoKKwlsZWEgICAgIHJkeCwgUVdPUkQgUFRSIFtyYXgqOCsxNl0gOyByYXggPD0gKGFyZ2MgKyAyKSAqIDgKKwltb3YgICAgIHJheCwgcnNwICAgICAgICA7IFNhdmUgY3VycmVudCBTUCBpbnRvIHJheAorCXN1YglyYXgsIHJkeAk7IHJzcCAtICgoYXJnYysyKSo4KSAtPiByYXgKKwkJCQk7IHdpdGhvdXQgYWxpZ24sIHJzcCB3b3VsZCBiZSB0aGlzCisJYW5kICAgICByYXgsIC0xMjggICAgICAgOyBNYXNrIG9mZiA3IGJpdHMgKDEyOC1ieXRlIGFsaWduKQorCWFkZCAgICAgcmF4LCByZHggICAgICAgIDsgYWRkIHNwYWNlIGZvciBwdXNoJ3MgaW4gYSBsb29wIGJlbG93CisJbW92ICAgICByc3AsIHJheCAgICAgICAgOyBQcmVwYXJlIHRoZSBzdGFjayBwdHIKKwkJCQk7IE5vdyBpdCB3aWxsIGFsaWduIHRvIDEyOC1ieXRlIGF0IHRoZSBjYWxsCis7OyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgCQkJOyBzZXR1cCBwa2ZuIHBhcmFtZXRlciBzdGFjaworCW1vdglyYXgsIHI5CQk7IHJheCA8PSBhcmdjCisJc2hsCXJheCwgMwkJOyByYXggPD0gYXJnYyo4CisJbW92CXJkeCwgUVdPUkQgUFRSICRfcF9hcmd2W3JicF0JOyByZHggPD0gcF9hcmd2CisJYWRkCXJkeCwgcmF4CTsgcmR4IDw9ICZwX2FyZ3ZbYXJnY10KKwltb3YJcmN4LCByOQkJOyByY3ggPD0gYXJnYworCWplY3h6CVNIT1JUICRfa21wX2ludm9rZV9wYXNzX3Bhcm1zCTsgbm90aGluZyB0byBwdXNoIGlmIGFyZ2M9MAorCWNtcAllY3gsIDEJCTsgaWYgYXJnYz0xIGJyYW5jaCBhaGVhZAorCWplCVNIT1JUICRfa21wX2ludm9rZV9vbmVfcGFybQorCXN1YgllY3gsIDIJCTsgaWYgYXJnYz0yIGJyYW5jaCBhaGVhZCwgc3VidHJhY3QgdHdvIGZyb20KKwlqZQlTSE9SVCAkX2ttcF9pbnZva2VfdHdvX3Bhcm1zCisKKyRfa21wX2ludm9rZV9wdXNoX3Bhcm1zOgk7IHB1c2ggbGFzdCAtIDV0aCBwYXJtcyB0byBwa2ZuIG9uIHN0YWNrCisJc3ViCXJkeCwgOAkJOyBkZWNyZW1lbnQgcF9hcmd2IHBvaW50ZXIgdG8gcHJldmlvdXMgcGFybQorCW1vdiAJcjgsIFFXT1JEIFBUUiBbcmR4XSA7IHI4IDw9IHBfYXJndltyY3gtMV0KKwlwdXNoCXI4CQk7IHB1c2ggcF9hcmd2W3JjeC0xXSBvbnRvIHN0YWNrIChyZXZlcnNlIG9yZGVyKQorCXN1YgllY3gsIDEKKwlqZWN4eglTSE9SVCAkX2ttcF9pbnZva2VfdHdvX3Bhcm1zCisJam1wCVNIT1JUICRfa21wX2ludm9rZV9wdXNoX3Bhcm1zCisKKyRfa21wX2ludm9rZV90d29fcGFybXM6CisJc3ViCXJkeCwgOAkJOyBwdXQgNHRoIHBhcm0gdG8gcGtmbiBpbiByOQorCW1vdglyOSwgUVdPUkQgUFRSIFtyZHhdIDsgcjkgPD0gcF9hcmd2WzFdCisKKyRfa21wX2ludm9rZV9vbmVfcGFybToKKyAgICAgICAgc3ViCXJkeCwgOAkJOyBwdXQgM3JkIHBhcm0gdG8gcGtmbiBpbiByOAorCW1vdglyOCwgUVdPUkQgUFRSIFtyZHhdIDsgcjggPD0gcF9hcmd2WzBdCisKKyRfa21wX2ludm9rZV9wYXNzX3Bhcm1zOgk7IHB1dCAxc3QgJiAybmQgcGFybXMgdG8gcGtmbiBpbiByZWdpc3RlcnMKKwlsZWEJcmR4LCBRV09SRCBQVFIgJF90aWRbcmJwXSAgOyByZHggPD0gJnRpZCAoMm5kIHBhcm0gdG8gcGtmbikKKwlsZWEJcmN4LCBRV09SRCBQVFIgJF9ndGlkW3JicF0gOyByY3ggPD0gJmd0aWQgKDFzdCBwYXJtIHRvIHBrZm4pCisgICAgICAgIHN1YiAgICAgcnNwLCAzMiAgICAgICAgIDsgYWRkIHN0YWNrIHNwYWNlIGZvciBmaXJzdCBmb3VyIHBhcm1zCisJbW92CXJheCwgcjEwCTsgcmF4IDw9IHBrZm4KKwljYWxsCXJheAkJOyBjYWxsICgqcGtmbikoKQorCW1vdglyYXgsIDEJCTsgbW92ZSAxIGludG8gcmV0dXJuIHJlZ2lzdGVyOworCisgICAgICAgIGxlYSAgICAgcnNwLCBRV09SRCBQVFIgW3JicF0JOyByZXN0b3JlIHN0YWNrIHBvaW50ZXIKKworOwlhZGQJcnNwLCAwCQk7IG5vIGZpeGVkIGFsbG9jYXRpb24gbmVjZXNzYXJ5IC0gc3RhcnQgZXBpbG9nCisgICAgICAgIHBvcCAgICAgcmJwCQk7IHJlc3RvcmUgZnJhbWUgcG9pbnRlcgorICAgICAgICByZXQKK19fa21wX2ludm9rZV9taWNyb3Rhc2sgRU5EUAorX1RFWFQgICBFTkRTCisKK2VuZGlmCisKK0VORApkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvel9XaW5kb3dzX05ULTU4Nl91dGlsLmMgYi9maW5hbC9ydW50aW1lL3NyYy96X1dpbmRvd3NfTlQtNTg2X3V0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWVhZmFlCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvel9XaW5kb3dzX05ULTU4Nl91dGlsLmMKQEAgLTAsMCArMSwxNjMgQEAKKy8qCisgKiB6X1dpbmRvd3NfTlQtNTg2X3V0aWwuYyAtLSBwbGF0Zm9ybSBzcGVjaWZpYyByb3V0aW5lcy4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorCisjaWYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQpCisvKiBPbmx5IDMyLWJpdCAiYWRkLWV4Y2hhbmdlIiBpbnN0cnVjdGlvbiBvbiBJQS0zMiBhcmNoaXRlY3R1cmUgY2F1c2VzIHVzIHRvCisgKiB1c2UgY29tcGFyZV9hbmRfc3RvcmUgZm9yIHRoZXNlIHJvdXRpbmVzCisgKi8KKwora21wX2ludDgKK19fa21wX3Rlc3RfdGhlbl9vcjgoIHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCBkICkKK3sKKyAgICBrbXBfaW50OCBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworICAgIG9sZF92YWx1ZSA9IFRDUl8xKCAqcCApOworICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSB8IGQ7CisKKyAgICB3aGlsZSAoICEgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4ICggcCwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUgKSApCisgICAgeworICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgIG9sZF92YWx1ZSA9IFRDUl8xKCAqcCApOworICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgfCBkOworICAgIH0KKyAgICByZXR1cm4gb2xkX3ZhbHVlOworfQorCitrbXBfaW50OAorX19rbXBfdGVzdF90aGVuX2FuZDgoIHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCBkICkKK3sKKyAgICBrbXBfaW50OCBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworICAgIG9sZF92YWx1ZSA9IFRDUl8xKCAqcCApOworICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSAmIGQ7CisKKyAgICB3aGlsZSAoICEgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4ICggcCwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUgKSApCisgICAgeworICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgIG9sZF92YWx1ZSA9IFRDUl8xKCAqcCApOworICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgJiBkOworICAgIH0KKyAgICByZXR1cm4gb2xkX3ZhbHVlOworfQorCitrbXBfaW50MzIKK19fa21wX3Rlc3RfdGhlbl9vcjMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBkICkKK3sKKyAgICBrbXBfaW50MzIgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7CisKKyAgICBvbGRfdmFsdWUgPSBUQ1JfNCggKnAgKTsKKyAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgfCBkOworCisgICAgd2hpbGUgKCAhIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIgKCBwLCBvbGRfdmFsdWUsIG5ld192YWx1ZSApICkKKyAgICB7CisgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgb2xkX3ZhbHVlID0gVENSXzQoICpwICk7CisgICAgICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSB8IGQ7CisgICAgfQorICAgIHJldHVybiBvbGRfdmFsdWU7Cit9CisKK2ttcF9pbnQzMgorX19rbXBfdGVzdF90aGVuX2FuZDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBkICkKK3sKKyAgICBrbXBfaW50MzIgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7CisKKyAgICBvbGRfdmFsdWUgPSBUQ1JfNCggKnAgKTsKKyAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgJiBkOworCisgICAgd2hpbGUgKCAhIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIgKCBwLCBvbGRfdmFsdWUsIG5ld192YWx1ZSApICkKKyAgICB7CisgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgb2xkX3ZhbHVlID0gVENSXzQoICpwICk7CisgICAgICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSAmIGQ7CisgICAgfQorICAgIHJldHVybiBvbGRfdmFsdWU7Cit9CisKK2ttcF9pbnQ4CitfX2ttcF90ZXN0X3RoZW5fYWRkOCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGQgKQoreworICAgIGttcF9pbnQ2NCBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworICAgIG9sZF92YWx1ZSA9IFRDUl8xKCAqcCApOworICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSArIGQ7CisgICAgd2hpbGUgKCAhIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOCAoIHAsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlICkgKQorICAgIHsKKyAgICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgICAgICBvbGRfdmFsdWUgPSBUQ1JfMSggKnAgKTsKKyAgICAgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlICsgZDsKKyAgICB9CisgICAgcmV0dXJuIG9sZF92YWx1ZTsKK30KKworI2lmIEtNUF9BUkNIX1g4Ngora21wX2ludDY0CitfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGQgKQoreworICAgIGttcF9pbnQ2NCBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworICAgIG9sZF92YWx1ZSA9IFRDUl84KCAqcCApOworICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSArIGQ7CisgICAgd2hpbGUgKCAhIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQgKCBwLCBvbGRfdmFsdWUsIG5ld192YWx1ZSApICkKKyAgICB7CisgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgb2xkX3ZhbHVlID0gVENSXzgoICpwICk7CisgICAgICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSArIGQ7CisgICAgfQorICAgIHJldHVybiBvbGRfdmFsdWU7Cit9CisjZW5kaWYgLyogS01QX0FSQ0hfWDg2ICovCisKK2ttcF9pbnQ2NAorX19rbXBfdGVzdF90aGVuX29yNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGQgKQoreworICAgIGttcF9pbnQ2NCBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworICAgIG9sZF92YWx1ZSA9IFRDUl84KCAqcCApOworICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSB8IGQ7CisgICAgd2hpbGUgKCAhIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQgKCBwLCBvbGRfdmFsdWUsIG5ld192YWx1ZSApICkKKyAgICB7CisgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgb2xkX3ZhbHVlID0gVENSXzgoICpwICk7CisgICAgICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSB8IGQ7CisgICAgfQorCisgICAgcmV0dXJuIG9sZF92YWx1ZTsKK30KKwora21wX2ludDY0CitfX2ttcF90ZXN0X3RoZW5fYW5kNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGQgKQoreworICAgIGttcF9pbnQ2NCBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworICAgIG9sZF92YWx1ZSA9IFRDUl84KCAqcCApOworICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSAmIGQ7CisgICAgd2hpbGUgKCAhIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQgKCBwLCBvbGRfdmFsdWUsIG5ld192YWx1ZSApICkKKyAgICB7CisgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgb2xkX3ZhbHVlID0gVENSXzgoICpwICk7CisgICAgICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSAmIGQ7CisgICAgfQorCisgICAgcmV0dXJuIG9sZF92YWx1ZTsKK30KKworI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvel9XaW5kb3dzX05UX3V0aWwuYyBiL2ZpbmFsL3J1bnRpbWUvc3JjL3pfV2luZG93c19OVF91dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FjM2VhZQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL3pfV2luZG93c19OVF91dGlsLmMKQEAgLTAsMCArMSwxOTQxIEBACisvKgorICogel9XaW5kb3dzX05UX3V0aWwuYyAtLSBwbGF0Zm9ybSBzcGVjaWZpYyByb3V0aW5lcy4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9pdHQuaCIKKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorI2luY2x1ZGUgImttcF9pby5oIgorI2luY2x1ZGUgImttcF93YWl0X3JlbGVhc2UuaCIKKworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBUaGlzIGNvZGUgaXMgcmVsYXRlZCB0byBOdFF1ZXJ5U3lzdGVtSW5mb3JtYXRpb24oKSBmdW5jdGlvbi4gVGhpcyBmdW5jdGlvbgorICAgaXMgdXNlZCBpbiB0aGUgTG9hZCBiYWxhbmNlIGFsZ29yaXRobSBmb3IgT01QX0RZTkFNSUM9dHJ1ZSB0byBmaW5kIHRoZQorICAgbnVtYmVyIG9mIHJ1bm5pbmcgdGhyZWFkcyBpbiB0aGUgc3lzdGVtLiAqLworCisjaW5jbHVkZSA8bnRzdGF0dXMuaD4KKyNpbmNsdWRlIDxudHNlY2FwaS5oPiAgIC8vIFVOSUNPREVfU1RSSU5HCisKK2VudW0gU1lTVEVNX0lORk9STUFUSU9OX0NMQVNTIHsKKyAgICBTeXN0ZW1Qcm9jZXNzSW5mb3JtYXRpb24gPSA1Cit9OyAvLyBTWVNURU1fSU5GT1JNQVRJT05fQ0xBU1MKKworc3RydWN0IENMSUVOVF9JRCB7CisgICAgSEFORExFIFVuaXF1ZVByb2Nlc3M7CisgICAgSEFORExFIFVuaXF1ZVRocmVhZDsKK307IC8vIHN0cnVjdCBDTElFTlRfSUQKKworZW51bSBUSFJFQURfU1RBVEUgeworICAgIFN0YXRlSW5pdGlhbGl6ZWQsCisgICAgU3RhdGVSZWFkeSwKKyAgICBTdGF0ZVJ1bm5pbmcsCisgICAgU3RhdGVTdGFuZGJ5LAorICAgIFN0YXRlVGVybWluYXRlZCwKKyAgICBTdGF0ZVdhaXQsCisgICAgU3RhdGVUcmFuc2l0aW9uLAorICAgIFN0YXRlVW5rbm93bgorfTsgLy8gZW51bSBUSFJFQURfU1RBVEUKKworc3RydWN0IFZNX0NPVU5URVJTIHsKKyAgICBTSVpFX1QgICAgICAgIFBlYWtWaXJ0dWFsU2l6ZTsKKyAgICBTSVpFX1QgICAgICAgIFZpcnR1YWxTaXplOworICAgIFVMT05HICAgICAgICAgUGFnZUZhdWx0Q291bnQ7CisgICAgU0laRV9UICAgICAgICBQZWFrV29ya2luZ1NldFNpemU7CisgICAgU0laRV9UICAgICAgICBXb3JraW5nU2V0U2l6ZTsKKyAgICBTSVpFX1QgICAgICAgIFF1b3RhUGVha1BhZ2VkUG9vbFVzYWdlOworICAgIFNJWkVfVCAgICAgICAgUXVvdGFQYWdlZFBvb2xVc2FnZTsKKyAgICBTSVpFX1QgICAgICAgIFF1b3RhUGVha05vblBhZ2VkUG9vbFVzYWdlOworICAgIFNJWkVfVCAgICAgICAgUXVvdGFOb25QYWdlZFBvb2xVc2FnZTsKKyAgICBTSVpFX1QgICAgICAgIFBhZ2VmaWxlVXNhZ2U7CisgICAgU0laRV9UICAgICAgICBQZWFrUGFnZWZpbGVVc2FnZTsKKyAgICBTSVpFX1QgICAgICAgIFByaXZhdGVQYWdlQ291bnQ7Cit9OyAvLyBzdHJ1Y3QgVk1fQ09VTlRFUlMKKworc3RydWN0IFNZU1RFTV9USFJFQUQgeworICBMQVJHRV9JTlRFR0VSICAgS2VybmVsVGltZTsKKyAgTEFSR0VfSU5URUdFUiAgIFVzZXJUaW1lOworICBMQVJHRV9JTlRFR0VSICAgQ3JlYXRlVGltZTsKKyAgVUxPTkcgICAgICAgICAgIFdhaXRUaW1lOworICBMUFZPSUQgICAgICAgICAgU3RhcnRBZGRyZXNzOworICBDTElFTlRfSUQgICAgICAgQ2xpZW50SWQ7CisgIERXT1JEICAgICAgICAgICBQcmlvcml0eTsKKyAgTE9ORyAgICAgICAgICAgIEJhc2VQcmlvcml0eTsKKyAgVUxPTkcgICAgICAgICAgIENvbnRleHRTd2l0Y2hDb3VudDsKKyAgVEhSRUFEX1NUQVRFICAgIFN0YXRlOworICBVTE9ORyAgICAgICAgICAgV2FpdFJlYXNvbjsKK307IC8vIFNZU1RFTV9USFJFQUQKKworS01QX0JVSUxEX0FTU0VSVCggb2Zmc2V0b2YoIFNZU1RFTV9USFJFQUQsIEtlcm5lbFRpbWUgKSA9PSAwICk7CisjaWYgS01QX0FSQ0hfWDg2CisgICAgS01QX0JVSUxEX0FTU0VSVCggb2Zmc2V0b2YoIFNZU1RFTV9USFJFQUQsIFN0YXJ0QWRkcmVzcyApID09IDI4ICk7CisgICAgS01QX0JVSUxEX0FTU0VSVCggb2Zmc2V0b2YoIFNZU1RFTV9USFJFQUQsIFN0YXRlICAgICAgICApID09IDUyICk7CisjZWxzZQorICAgIEtNUF9CVUlMRF9BU1NFUlQoIG9mZnNldG9mKCBTWVNURU1fVEhSRUFELCBTdGFydEFkZHJlc3MgKSA9PSAzMiApOworICAgIEtNUF9CVUlMRF9BU1NFUlQoIG9mZnNldG9mKCBTWVNURU1fVEhSRUFELCBTdGF0ZSAgICAgICAgKSA9PSA2OCApOworI2VuZGlmCisKK3N0cnVjdCBTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTiB7CisgIFVMT05HICAgICAgICAgICBOZXh0RW50cnlPZmZzZXQ7CisgIFVMT05HICAgICAgICAgICBOdW1iZXJPZlRocmVhZHM7CisgIExBUkdFX0lOVEVHRVIgICBSZXNlcnZlZFsgMyBdOworICBMQVJHRV9JTlRFR0VSICAgQ3JlYXRlVGltZTsKKyAgTEFSR0VfSU5URUdFUiAgIFVzZXJUaW1lOworICBMQVJHRV9JTlRFR0VSICAgS2VybmVsVGltZTsKKyAgVU5JQ09ERV9TVFJJTkcgIEltYWdlTmFtZTsKKyAgRFdPUkQgICAgICAgICAgIEJhc2VQcmlvcml0eTsKKyAgSEFORExFICAgICAgICAgIFByb2Nlc3NJZDsKKyAgSEFORExFICAgICAgICAgIFBhcmVudFByb2Nlc3NJZDsKKyAgVUxPTkcgICAgICAgICAgIEhhbmRsZUNvdW50OworICBVTE9ORyAgICAgICAgICAgUmVzZXJ2ZWQyWyAyIF07CisgIFZNX0NPVU5URVJTICAgICBWTUNvdW50ZXJzOworICBJT19DT1VOVEVSUyAgICAgSU9Db3VudGVyczsKKyAgU1lTVEVNX1RIUkVBRCAgIFRocmVhZHNbIDEgXTsKK307IC8vIFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OCit0eXBlZGVmIFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OICogUFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OOworCitLTVBfQlVJTERfQVNTRVJUKCBvZmZzZXRvZiggU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04sIE5leHRFbnRyeU9mZnNldCApID09ICAwICk7CitLTVBfQlVJTERfQVNTRVJUKCBvZmZzZXRvZiggU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04sIENyZWF0ZVRpbWUgICAgICApID09IDMyICk7CitLTVBfQlVJTERfQVNTRVJUKCBvZmZzZXRvZiggU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04sIEltYWdlTmFtZSAgICAgICApID09IDU2ICk7CisjaWYgS01QX0FSQ0hfWDg2CisgICAgS01QX0JVSUxEX0FTU0VSVCggb2Zmc2V0b2YoIFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OLCBQcm9jZXNzSWQgICAgICAgKSA9PSAgNjggKTsKKyAgICBLTVBfQlVJTERfQVNTRVJUKCBvZmZzZXRvZiggU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04sIEhhbmRsZUNvdW50ICAgICApID09ICA3NiApOworICAgIEtNUF9CVUlMRF9BU1NFUlQoIG9mZnNldG9mKCBTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTiwgVk1Db3VudGVycyAgICAgICkgPT0gIDg4ICk7CisgICAgS01QX0JVSUxEX0FTU0VSVCggb2Zmc2V0b2YoIFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OLCBJT0NvdW50ZXJzICAgICAgKSA9PSAxMzYgKTsKKyAgICBLTVBfQlVJTERfQVNTRVJUKCBvZmZzZXRvZiggU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04sIFRocmVhZHMgICAgICAgICApID09IDE4NCApOworI2Vsc2UKKyAgICBLTVBfQlVJTERfQVNTRVJUKCBvZmZzZXRvZiggU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04sIFByb2Nlc3NJZCAgICAgICApID09ICA4MCApOworICAgIEtNUF9CVUlMRF9BU1NFUlQoIG9mZnNldG9mKCBTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTiwgSGFuZGxlQ291bnQgICAgICkgPT0gIDk2ICk7CisgICAgS01QX0JVSUxEX0FTU0VSVCggb2Zmc2V0b2YoIFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OLCBWTUNvdW50ZXJzICAgICAgKSA9PSAxMTIgKTsKKyAgICBLTVBfQlVJTERfQVNTRVJUKCBvZmZzZXRvZiggU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04sIElPQ291bnRlcnMgICAgICApID09IDIwOCApOworICAgIEtNUF9CVUlMRF9BU1NFUlQoIG9mZnNldG9mKCBTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTiwgVGhyZWFkcyAgICAgICAgICkgPT0gMjU2ICk7CisjZW5kaWYKKwordHlwZWRlZiBOVFNUQVRVUyAoTlRBUEkgKk50UXVlcnlTeXN0ZW1JbmZvcm1hdGlvbl90KSggU1lTVEVNX0lORk9STUFUSU9OX0NMQVNTLCBQVk9JRCwgVUxPTkcsIFBVTE9ORyApOworTnRRdWVyeVN5c3RlbUluZm9ybWF0aW9uX3QgTnRRdWVyeVN5c3RlbUluZm9ybWF0aW9uID0gTlVMTDsKKworSE1PRFVMRSBudGRsbCA9IE5VTEw7CisKKy8qIEVuZCBvZiBOdFF1ZXJ5U3lzdGVtSW5mb3JtYXRpb24oKS1yZWxhdGVkIGNvZGUgKi8KKworI2lmIEtNUF9HUk9VUF9BRkZJTklUWQorc3RhdGljIEhNT0RVTEUga2VybmVsMzIgPSBOVUxMOworI2VuZGlmIC8qIEtNUF9HUk9VUF9BRkZJTklUWSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIEtNUF9IQU5ETEVfU0lHTkFMUworICAgIHR5cGVkZWYgdm9pZCAgICAoKiBzaWdfZnVuY190ICkoIGludCApOworICAgIHN0YXRpYyBzaWdfZnVuY190ICBfX2ttcF9zaWdobGRyc1sgTlNJRyBdOworICAgIHN0YXRpYyBpbnQgICAgICAgICBfX2ttcF9zaWdpbnN0YWxsZWRbIE5TSUcgXTsKKyNlbmRpZgorCitzdGF0aWMgSEFORExFICAgX19rbXBfbW9uaXRvcl9ldjsKK3N0YXRpYyBrbXBfaW50NjQgX19rbXBfd2luMzJfdGltZTsKK2RvdWJsZSBfX2ttcF93aW4zMl90aWNrOworCitpbnQgX19rbXBfaW5pdF9ydW50aW1lID0gRkFMU0U7CitDUklUSUNBTF9TRUNUSU9OIF9fa21wX3dpbjMyX3NlY3Rpb247CisKK3ZvaWQKK19fa21wX3dpbjMyX211dGV4X2luaXQoIGttcF93aW4zMl9tdXRleF90ICpteCApCit7CisgICAgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbiggJiBteC0+Y3MgKTsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X3N5c3RlbV9vYmplY3RfY3JlYXRlZCggJiBteC0+Y3MsICJDcml0aWNhbCBTZWN0aW9uIiApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KK30KKwordm9pZAorX19rbXBfd2luMzJfbXV0ZXhfZGVzdHJveSgga21wX3dpbjMyX211dGV4X3QgKm14ICkKK3sKKyAgICBEZWxldGVDcml0aWNhbFNlY3Rpb24oICYgbXgtPmNzICk7Cit9CisKK3ZvaWQKK19fa21wX3dpbjMyX211dGV4X2xvY2soIGttcF93aW4zMl9tdXRleF90ICpteCApCit7CisgICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICYgbXgtPmNzICk7Cit9CisKK3ZvaWQKK19fa21wX3dpbjMyX211dGV4X3VubG9jaygga21wX3dpbjMyX211dGV4X3QgKm14ICkKK3sKKyAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJiBteC0+Y3MgKTsKK30KKwordm9pZAorX19rbXBfd2luMzJfY29uZF9pbml0KCBrbXBfd2luMzJfY29uZF90ICpjdiApCit7CisgICAgY3YtPndhaXRlcnNfY291bnRfICAgICAgICAgPSAwOworICAgIGN2LT53YWl0X2dlbmVyYXRpb25fY291bnRfID0gMDsKKyAgICBjdi0+cmVsZWFzZV9jb3VudF8gICAgICAgICA9IDA7CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBjcml0aWNhbCBzZWN0aW9uICovCisgICAgX19rbXBfd2luMzJfbXV0ZXhfaW5pdCggJiBjdi0+d2FpdGVyc19jb3VudF9sb2NrXyApOworCisgICAgLyogQ3JlYXRlIGEgbWFudWFsLXJlc2V0IGV2ZW50LiAqLworICAgIGN2LT5ldmVudF8gPSBDcmVhdGVFdmVudCggTlVMTCwgICAgIC8vIG5vIHNlY3VyaXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFLCAgICAgLy8gbWFudWFsLXJlc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgICAgLy8gbm9uLXNpZ25hbGVkIGluaXRpYWxseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCApOyAgIC8vIHVubmFtZWQKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X3N5c3RlbV9vYmplY3RfY3JlYXRlZCggY3YtPmV2ZW50XywgIkV2ZW50IiApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KK30KKwordm9pZAorX19rbXBfd2luMzJfY29uZF9kZXN0cm95KCBrbXBfd2luMzJfY29uZF90ICpjdiApCit7CisgICAgX19rbXBfd2luMzJfbXV0ZXhfZGVzdHJveSggJiBjdi0+d2FpdGVyc19jb3VudF9sb2NrXyApOworICAgIF9fa21wX2ZyZWVfaGFuZGxlKCBjdi0+ZXZlbnRfICk7CisgICAgbWVtc2V0KCBjdiwgJ1wwJywgc2l6ZW9mKCAqY3YgKSApOworfQorCisvKiBUT0RPIGFzc29jaWF0ZSBjdiB3aXRoIGEgdGVhbSBpbnN0ZWFkIG9mIGEgdGhyZWFkIHNvIGFzIHRvIG9wdGltaXplCisgKiB0aGUgY2FzZSB3aGVyZSB3ZSB3YWtlIHVwIGEgd2hvbGUgdGVhbSAqLworCit2b2lkCitfX2ttcF93aW4zMl9jb25kX3dhaXQoIGttcF93aW4zMl9jb25kX3QgKmN2LCBrbXBfd2luMzJfbXV0ZXhfdCAqbXgsIGttcF9pbmZvX3QgKnRoLCBpbnQgbmVlZF9kZWNyZWFzZV9sb2FkICkKK3sKKyAgICBpbnQgbXlfZ2VuZXJhdGlvbjsKKyAgICBpbnQgbGFzdF93YWl0ZXI7CisKKyAgICAvKiBBdm9pZCByYWNlIGNvbmRpdGlvbnMgKi8KKyAgICBfX2ttcF93aW4zMl9tdXRleF9sb2NrKCAmY3YtPndhaXRlcnNfY291bnRfbG9ja18gKTsKKworICAgIC8qIEluY3JlbWVudCBjb3VudCBvZiB3YWl0ZXJzICovCisgICAgY3YtPndhaXRlcnNfY291bnRfKys7CisKKyAgICAvKiBTdG9yZSBjdXJyZW50IGdlbmVyYXRpb24gaW4gb3VyIGFjdGl2YXRpb24gcmVjb3JkLiAqLworICAgIG15X2dlbmVyYXRpb24gPSBjdi0+d2FpdF9nZW5lcmF0aW9uX2NvdW50XzsKKworICAgIF9fa21wX3dpbjMyX211dGV4X3VubG9jayggJmN2LT53YWl0ZXJzX2NvdW50X2xvY2tfICk7CisgICAgX19rbXBfd2luMzJfbXV0ZXhfdW5sb2NrKCBteCApOworCisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGludCB3YWl0X2RvbmU7CisKKyAgICAgICAgLyogV2FpdCB1bnRpbCB0aGUgZXZlbnQgaXMgc2lnbmFsZWQgKi8KKyAgICAgICAgV2FpdEZvclNpbmdsZU9iamVjdCggY3YtPmV2ZW50XywgSU5GSU5JVEUgKTsKKworICAgICAgICBfX2ttcF93aW4zMl9tdXRleF9sb2NrKCAmY3YtPndhaXRlcnNfY291bnRfbG9ja18gKTsKKworICAgICAgICAvKiBFeGl0IHRoZSBsb29wIHdoZW4gdGhlIDxjdi0+ZXZlbnRfPiBpcyBzaWduYWxlZCBhbmQKKyAgICAgICAgICogdGhlcmUgYXJlIHN0aWxsIHdhaXRpbmcgdGhyZWFkcyBmcm9tIHRoaXMgPHdhaXRfZ2VuZXJhdGlvbj4KKyAgICAgICAgICogdGhhdCBoYXZlbid0IGJlZW4gcmVsZWFzZWQgZnJvbSB0aGlzIHdhaXQgeWV0LiAgICAgICAgICAgICAgKi8KKyAgICAgICAgd2FpdF9kb25lID0gKCBjdi0+cmVsZWFzZV9jb3VudF8gPiAwICkgJiYKKyAgICAgICAgICAgICAgICAgICAgKCBjdi0+d2FpdF9nZW5lcmF0aW9uX2NvdW50XyAhPSBteV9nZW5lcmF0aW9uICk7CisKKyAgICAgICAgX19rbXBfd2luMzJfbXV0ZXhfdW5sb2NrKCAmY3YtPndhaXRlcnNfY291bnRfbG9ja18pOworCisgICAgICAgIC8qIHRoZXJlIHVzZWQgdG8gYmUgYSBzZW1pY29sb24gYWZ0ZXIgdGhlIGlmIHN0YXRlbWVudCwKKyAgICAgICAgICogaXQgbG9va2VkIGxpa2UgYSBidWcsIHNvIGkgcmVtb3ZlZCBpdCAqLworICAgICAgICBpZiggd2FpdF9kb25lICkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIF9fa21wX3dpbjMyX211dGV4X2xvY2soIG14ICk7CisgICAgX19rbXBfd2luMzJfbXV0ZXhfbG9jayggJmN2LT53YWl0ZXJzX2NvdW50X2xvY2tfICk7CisKKyAgICBjdi0+d2FpdGVyc19jb3VudF8tLTsKKyAgICBjdi0+cmVsZWFzZV9jb3VudF8tLTsKKworICAgIGxhc3Rfd2FpdGVyID0gICggY3YtPnJlbGVhc2VfY291bnRfID09IDAgKTsKKworICAgIF9fa21wX3dpbjMyX211dGV4X3VubG9jayggJmN2LT53YWl0ZXJzX2NvdW50X2xvY2tfICk7CisKKyAgICBpZiggbGFzdF93YWl0ZXIgKSB7CisgICAgICAgIC8qIFdlJ3JlIHRoZSBsYXN0IHdhaXRlciB0byBiZSBub3RpZmllZCwgc28gcmVzZXQgdGhlIG1hbnVhbCBldmVudC4gKi8KKyAgICAgICAgUmVzZXRFdmVudCggY3YtPmV2ZW50XyApOworICAgIH0KK30KKwordm9pZAorX19rbXBfd2luMzJfY29uZF9icm9hZGNhc3QoIGttcF93aW4zMl9jb25kX3QgKmN2ICkKK3sKKyAgICBfX2ttcF93aW4zMl9tdXRleF9sb2NrKCAmY3YtPndhaXRlcnNfY291bnRfbG9ja18gKTsKKworICAgIGlmKCBjdi0+d2FpdGVyc19jb3VudF8gPiAwICkgeworICAgICAgICBTZXRFdmVudCggY3YtPmV2ZW50XyApOworICAgICAgICAvKiBSZWxlYXNlIGFsbCB0aGUgdGhyZWFkcyBpbiB0aGlzIGdlbmVyYXRpb24uICovCisKKyAgICAgICAgY3YtPnJlbGVhc2VfY291bnRfID0gY3YtPndhaXRlcnNfY291bnRfOworCisgICAgICAgIC8qIFN0YXJ0IGEgbmV3IGdlbmVyYXRpb24uICovCisgICAgICAgIGN2LT53YWl0X2dlbmVyYXRpb25fY291bnRfKys7CisgICAgfQorCisgICAgX19rbXBfd2luMzJfbXV0ZXhfdW5sb2NrKCAmY3YtPndhaXRlcnNfY291bnRfbG9ja18gKTsKK30KKwordm9pZAorX19rbXBfd2luMzJfY29uZF9zaWduYWwoIGttcF93aW4zMl9jb25kX3QgKmN2ICkKK3sKKyAgICBfX2ttcF93aW4zMl9jb25kX2Jyb2FkY2FzdCggY3YgKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZAorX19rbXBfZW5hYmxlKCBpbnQgbmV3X3N0YXRlICkKK3sKKyAgICBpZiAoX19rbXBfaW5pdF9ydW50aW1lKQorICAgICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJiBfX2ttcF93aW4zMl9zZWN0aW9uICk7Cit9CisKK3ZvaWQKK19fa21wX2Rpc2FibGUoIGludCAqb2xkX3N0YXRlICkKK3sKKyAgICAqb2xkX3N0YXRlID0gMDsKKworICAgIGlmIChfX2ttcF9pbml0X3J1bnRpbWUpCisgICAgICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmIF9fa21wX3dpbjMyX3NlY3Rpb24gKTsKK30KKwordm9pZAorX19rbXBfc3VzcGVuZF9pbml0aWFsaXplKCB2b2lkICkKK3sKKyAgICAvKiBkbyBub3RoaW5nICovCit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdXNwZW5kX2luaXRpYWxpemVfdGhyZWFkKCBrbXBfaW5mb190ICp0aCApCit7CisgICAgaWYgKCAhIFRDUl80KCB0aC0+dGgudGhfc3VzcGVuZF9pbml0ICkgKSB7CisgICAgICAvKiB0aGlzIG1lYW5zIHdlIGhhdmVuJ3QgaW5pdGlhbGl6ZWQgdGhlIHN1c3BlbnNpb24gcHRocmVhZCBvYmplY3RzIGZvciB0aGlzIHRocmVhZAorICAgICAgICAgaW4gdGhpcyBpbnN0YW5jZSBvZiB0aGUgcHJvY2VzcyAqLworICAgICAgICBfX2ttcF93aW4zMl9jb25kX2luaXQoICAmdGgtPnRoLnRoX3N1c3BlbmRfY3YgKTsKKyAgICAgICAgX19rbXBfd2luMzJfbXV0ZXhfaW5pdCggJnRoLT50aC50aF9zdXNwZW5kX214ICk7CisgICAgICAgIFRDV180KCB0aC0+dGgudGhfc3VzcGVuZF9pbml0LCBUUlVFICk7CisgICAgfQorfQorCit2b2lkCitfX2ttcF9zdXNwZW5kX3VuaW5pdGlhbGl6ZV90aHJlYWQoIGttcF9pbmZvX3QgKnRoICkKK3sKKyAgICBpZiAoIFRDUl80KCB0aC0+dGgudGhfc3VzcGVuZF9pbml0ICkgKSB7CisgICAgICAvKiB0aGlzIG1lYW5zIHdlIGhhdmUgaW5pdGlhbGl6ZSB0aGUgc3VzcGVuc2lvbiBwdGhyZWFkIG9iamVjdHMgZm9yIHRoaXMgdGhyZWFkCisgICAgICAgICBpbiB0aGlzIGluc3RhbmNlIG9mIHRoZSBwcm9jZXNzICovCisgICAgICBfX2ttcF93aW4zMl9jb25kX2Rlc3Ryb3koICYgdGgtPnRoLnRoX3N1c3BlbmRfY3YgKTsKKyAgICAgIF9fa21wX3dpbjMyX211dGV4X2Rlc3Ryb3koICYgdGgtPnRoLnRoX3N1c3BlbmRfbXggKTsKKyAgICAgIFRDV180KCB0aC0+dGgudGhfc3VzcGVuZF9pbml0LCBGQUxTRSApOworICAgIH0KK30KKworLyogVGhpcyByb3V0aW5lIHB1dHMgdGhlIGNhbGxpbmcgdGhyZWFkIHRvIHNsZWVwIGFmdGVyIHNldHRpbmcgdGhlCisgKiBzbGVlcCBiaXQgZm9yIHRoZSBpbmRpY2F0ZWQgZmxhZyB2YXJpYWJsZSB0byB0cnVlLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgQz4KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2ttcF9zdXNwZW5kX3RlbXBsYXRlKCBpbnQgdGhfZ3RpZCwgQyAqZmxhZyApCit7CisgICAga21wX2luZm9fdCAqdGggPSBfX2ttcF90aHJlYWRzW3RoX2d0aWRdOworICAgIGludCBzdGF0dXM7CisgICAgdHlwZW5hbWUgQzo6ZmxhZ190IG9sZF9zcGluOworCisgICAgS0ZfVFJBQ0UoIDMwLCAoIl9fa21wX3N1c3BlbmRfdGVtcGxhdGU6IFQjJWQgZW50ZXIgZm9yIGZsYWcncyBsb2MoJXApXG4iLCB0aF9ndGlkLCBmbGFnLT5nZXQoKSApICk7CisKKyAgICBfX2ttcF9zdXNwZW5kX2luaXRpYWxpemVfdGhyZWFkKCB0aCApOworICAgIF9fa21wX3dpbjMyX211dGV4X2xvY2soICZ0aC0+dGgudGhfc3VzcGVuZF9teCApOworCisgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9zdXNwZW5kX3RlbXBsYXRlOiBUIyVkIHNldHRpbmcgc2xlZXAgYml0IGZvciBmbGFnJ3MgbG9jKCVwKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgdGhfZ3RpZCwgZmxhZy0+Z2V0KCkgKSApOworCisgICAgLyogVE9ETzogc2hvdWxkbid0IHRoaXMgdXNlIHJlbGVhc2Ugc2VtYW50aWNzIHRvIGVuc3VyZSB0aGF0IF9fa21wX3N1c3BlbmRfaW5pdGlhbGl6ZV90aHJlYWQKKyAgICAgICBnZXRzIGNhbGxlZCBmaXJzdD8KKyAgICAqLworICAgIG9sZF9zcGluID0gZmxhZy0+c2V0X3NsZWVwaW5nKCk7CisKKyAgICBLRl9UUkFDRSggNSwgKCAiX19rbXBfc3VzcGVuZF90ZW1wbGF0ZTogVCMlZCBzZXQgc2xlZXAgYml0IGZvciBmbGFnJ3MgbG9jKCVwKT09JWRcbiIsCisgICAgICAgICAgICAgICAgICAgdGhfZ3RpZCwgZmxhZy0+Z2V0KCksICooZmxhZy0+Z2V0KCkpICkgKTsKKworICAgIGlmICggZmxhZy0+ZG9uZV9jaGVja192YWwob2xkX3NwaW4pICkgeworICAgICAgICBvbGRfc3BpbiA9IGZsYWctPnVuc2V0X3NsZWVwaW5nKCk7CisgICAgICAgIEtGX1RSQUNFKCA1LCAoICJfX2ttcF9zdXNwZW5kX3RlbXBsYXRlOiBUIyVkIGZhbHNlIGFsYXJtLCByZXNldCBzbGVlcCBiaXQgZm9yIGZsYWcncyBsb2MoJXApXG4iLAorICAgICAgICAgICAgICAgICAgICAgICB0aF9ndGlkLCBmbGFnLT5nZXQoKSkgKTsKKyAgICB9IGVsc2UgeworI2lmZGVmIERFQlVHX1NVU1BFTkQKKyAgICAgICAgX19rbXBfc3VzcGVuZF9jb3VudCsrOworI2VuZGlmCisgICAgICAgIC8qIEVuY2Fwc3VsYXRlIGluIGEgbG9vcCBhcyB0aGUgZG9jdW1lbnRhdGlvbiBzdGF0ZXMgdGhhdCB0aGlzIG1heQorICAgICAgICAgKiAid2l0aCBsb3cgcHJvYmFiaWxpdHkiIHJldHVybiB3aGVuIHRoZSBjb25kaXRpb24gdmFyaWFibGUgaGFzCisgICAgICAgICAqIG5vdCBiZWVuIHNpZ25hbGVkIG9yIGJyb2FkY2FzdAorICAgICAgICAgKi8KKyAgICAgICAgaW50IGRlYWN0aXZhdGVkID0gRkFMU0U7CisgICAgICAgIFRDV19QVFIodGgtPnRoLnRoX3NsZWVwX2xvYywgKHZvaWQgKilmbGFnKTsKKyAgICAgICAgd2hpbGUgKCBmbGFnLT5pc19zbGVlcGluZygpICkgeworICAgICAgICAgICAgS0ZfVFJBQ0UoIDE1LCAoIl9fa21wX3N1c3BlbmRfdGVtcGxhdGU6IFQjJWQgYWJvdXQgdG8gcGVyZm9ybSBrbXBfd2luMzJfY29uZF93YWl0KClcbiIsCisgICAgICAgICAgICAgICAgICAgICB0aF9ndGlkICkgKTsKKyAgICAgICAgICAgIC8vIE1hcmsgdGhlIHRocmVhZCBhcyBubyBsb25nZXIgYWN0aXZlIChvbmx5IGluIHRoZSBmaXJzdCBpdGVyYXRpb24gb2YgdGhlIGxvb3ApLgorICAgICAgICAgICAgaWYgKCAhIGRlYWN0aXZhdGVkICkgeworICAgICAgICAgICAgICAgIHRoLT50aC50aF9hY3RpdmUgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBpZiAoIHRoLT50aC50aF9hY3RpdmVfaW5fcG9vbCApIHsKKyAgICAgICAgICAgICAgICAgICAgdGgtPnRoLnRoX2FjdGl2ZV9pbl9wb29sID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIEtNUF9URVNUX1RIRU5fREVDMzIoCisgICAgICAgICAgICAgICAgICAgICAgKGttcF9pbnQzMiAqKSAmX19rbXBfdGhyZWFkX3Bvb2xfYWN0aXZlX250aCApOworICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBUQ1JfNChfX2ttcF90aHJlYWRfcG9vbF9hY3RpdmVfbnRoKSA+PSAwICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlYWN0aXZhdGVkID0gVFJVRTsKKworCisgICAgICAgICAgICAgICAgX19rbXBfd2luMzJfY29uZF93YWl0KCAmdGgtPnRoLnRoX3N1c3BlbmRfY3YsICZ0aC0+dGgudGhfc3VzcGVuZF9teCwgMCwgMCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgX19rbXBfd2luMzJfY29uZF93YWl0KCAmdGgtPnRoLnRoX3N1c3BlbmRfY3YsICZ0aC0+dGgudGhfc3VzcGVuZF9teCwgMCwgMCApOworICAgICAgICAgICAgfQorCisjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICBpZiggZmxhZy0+aXNfc2xlZXBpbmcoKSApIHsKKyAgICAgICAgICAgICAgICBLRl9UUkFDRSggMTAwLCAoIl9fa21wX3N1c3BlbmRfdGVtcGxhdGU6IFQjJWQgc3B1cmlvdXMgd2FrZXVwXG4iLCB0aF9ndGlkICkpOworICAgICAgICAgICAgfQorI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworCisgICAgICAgIH0gLy8gd2hpbGUKKworICAgICAgICAvLyBNYXJrIHRoZSB0aHJlYWQgYXMgYWN0aXZlIGFnYWluIChpZiBpdCB3YXMgcHJldmlvdXMgbWFya2VkIGFzIGluYWN0aXZlKQorICAgICAgICBpZiAoIGRlYWN0aXZhdGVkICkgeworICAgICAgICAgICAgdGgtPnRoLnRoX2FjdGl2ZSA9IFRSVUU7CisgICAgICAgICAgICBpZiAoIFRDUl80KHRoLT50aC50aF9pbl9wb29sKSApIHsKKyAgICAgICAgICAgICAgICBLTVBfVEVTVF9USEVOX0lOQzMyKAorICAgICAgICAgICAgICAgICAgKGttcF9pbnQzMiAqKSAmX19rbXBfdGhyZWFkX3Bvb2xfYWN0aXZlX250aCApOworICAgICAgICAgICAgICAgIHRoLT50aC50aF9hY3RpdmVfaW5fcG9vbCA9IFRSVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIF9fa21wX3dpbjMyX211dGV4X3VubG9jayggJnRoLT50aC50aF9zdXNwZW5kX214ICk7CisKKyAgICBLRl9UUkFDRSggMzAsICgiX19rbXBfc3VzcGVuZF90ZW1wbGF0ZTogVCMlZCBleGl0XG4iLCB0aF9ndGlkICkgKTsKK30KKwordm9pZCBfX2ttcF9zdXNwZW5kXzMyKGludCB0aF9ndGlkLCBrbXBfZmxhZ18zMiAqZmxhZykgeworICAgIF9fa21wX3N1c3BlbmRfdGVtcGxhdGUodGhfZ3RpZCwgZmxhZyk7Cit9Cit2b2lkIF9fa21wX3N1c3BlbmRfNjQoaW50IHRoX2d0aWQsIGttcF9mbGFnXzY0ICpmbGFnKSB7CisgICAgX19rbXBfc3VzcGVuZF90ZW1wbGF0ZSh0aF9ndGlkLCBmbGFnKTsKK30KK3ZvaWQgX19rbXBfc3VzcGVuZF9vbmNvcmUoaW50IHRoX2d0aWQsIGttcF9mbGFnX29uY29yZSAqZmxhZykgeworICAgIF9fa21wX3N1c3BlbmRfdGVtcGxhdGUodGhfZ3RpZCwgZmxhZyk7Cit9CisKKworLyogVGhpcyByb3V0aW5lIHNpZ25hbHMgdGhlIHRocmVhZCBzcGVjaWZpZWQgYnkgdGFyZ2V0X2d0aWQgdG8gd2FrZSB1cAorICogYWZ0ZXIgc2V0dGluZyB0aGUgc2xlZXAgYml0IGluZGljYXRlZCBieSB0aGUgZmxhZyBhcmd1bWVudCB0byBGQUxTRQorICovCit0ZW1wbGF0ZSA8Y2xhc3MgQz4KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2ttcF9yZXN1bWVfdGVtcGxhdGUoIGludCB0YXJnZXRfZ3RpZCwgQyAqZmxhZyApCit7CisgICAga21wX2luZm9fdCAqdGggPSBfX2ttcF90aHJlYWRzW3RhcmdldF9ndGlkXTsKKyAgICBpbnQgc3RhdHVzOworCisjaWZkZWYgS01QX0RFQlVHCisgICAgaW50IGd0aWQgPSBUQ1JfNChfX2ttcF9pbml0X2d0aWQpID8gX19rbXBfZ2V0X2d0aWQoKSA6IC0xOworI2VuZGlmCisKKyAgICBLRl9UUkFDRSggMzAsICggIl9fa21wX3Jlc3VtZV90ZW1wbGF0ZTogVCMlZCB3YW50cyB0byB3YWtldXAgVCMlZCBlbnRlclxuIiwgZ3RpZCwgdGFyZ2V0X2d0aWQgKSApOworCisgICAgX19rbXBfc3VzcGVuZF9pbml0aWFsaXplX3RocmVhZCggdGggKTsKKyAgICBfX2ttcF93aW4zMl9tdXRleF9sb2NrKCAmdGgtPnRoLnRoX3N1c3BlbmRfbXggKTsKKworICAgIGlmICghZmxhZykgeyAvLyBjb21pbmcgZnJvbSBfX2ttcF9udWxsX3Jlc3VtZV93cmFwcGVyCisgICAgICAgIGZsYWcgPSAoQyAqKXRoLT50aC50aF9zbGVlcF9sb2M7CisgICAgfQorCisgICAgLy8gRmlyc3QsIGNoZWNrIGlmIHRoZSBmbGFnIGlzIG51bGwgb3IgaXRzIHR5cGUgaGFzIGNoYW5nZWQuIElmIHNvLCBzb21lb25lIGVsc2Ugd29rZSBpdCB1cC4KKyAgICBpZiAoIWZsYWcgfHwgZmxhZy0+Z2V0X3R5cGUoKSAhPSBmbGFnLT5nZXRfcHRyX3R5cGUoKSkgeyAvLyBnZXRfcHRyX3R5cGUgc2ltcGx5IHNob3dzIHdoYXQgZmxhZyB3YXMgY2FzdCB0bworICAgICAgICBLRl9UUkFDRSggNSwgKCAiX19rbXBfcmVzdW1lX3RlbXBsYXRlOiBUIyVkIGV4aXRpbmcsIHRocmVhZCBUIyVkIGFscmVhZHkgYXdha2U6IGZsYWcncyBsb2MoJXApXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0YXJnZXRfZ3RpZCwgTlVMTCApICk7CisgICAgICAgIF9fa21wX3dpbjMyX211dGV4X3VubG9jayggJnRoLT50aC50aF9zdXNwZW5kX214ICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHR5cGVuYW1lIEM6OmZsYWdfdCBvbGRfc3BpbiA9IGZsYWctPnVuc2V0X3NsZWVwaW5nKCk7CisgICAgICAgIGlmICggIWZsYWctPmlzX3NsZWVwaW5nX3ZhbChvbGRfc3BpbikgKSB7CisgICAgICAgICAgICBLRl9UUkFDRSggNSwgKCAiX19rbXBfcmVzdW1lX3RlbXBsYXRlOiBUIyVkIGV4aXRpbmcsIHRocmVhZCBUIyVkIGFscmVhZHkgYXdha2U6IGZsYWcncyBsb2MoJXApOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXUgPT4gJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0YXJnZXRfZ3RpZCwgZmxhZy0+Z2V0KCksIG9sZF9zcGluLCAqKGZsYWctPmdldCgpKSApICk7CisgICAgICAgICAgICBfX2ttcF93aW4zMl9tdXRleF91bmxvY2soICZ0aC0+dGgudGhfc3VzcGVuZF9teCApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIFRDV19QVFIodGgtPnRoLnRoX3NsZWVwX2xvYywgTlVMTCk7CisKKyAgICBLRl9UUkFDRSggNSwgKCAiX19rbXBfcmVzdW1lX3RlbXBsYXRlOiBUIyVkIGFib3V0IHRvIHdha2V1cCBUIyVkLCByZXNldCBzbGVlcCBiaXQgZm9yIGZsYWcncyBsb2MoJXApXG4iLAorICAgICAgICAgICAgICAgICAgIGd0aWQsIHRhcmdldF9ndGlkLCBmbGFnLT5nZXQoKSApICk7CisKKworICAgIF9fa21wX3dpbjMyX2NvbmRfc2lnbmFsKCAgJnRoLT50aC50aF9zdXNwZW5kX2N2ICk7CisgICAgX19rbXBfd2luMzJfbXV0ZXhfdW5sb2NrKCAmdGgtPnRoLnRoX3N1c3BlbmRfbXggKTsKKworICAgIEtGX1RSQUNFKCAzMCwgKCAiX19rbXBfcmVzdW1lX3RlbXBsYXRlOiBUIyVkIGV4aXRpbmcgYWZ0ZXIgc2lnbmFsaW5nIHdha2UgdXAgZm9yIFQjJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRhcmdldF9ndGlkICkgKTsKK30KKwordm9pZCBfX2ttcF9yZXN1bWVfMzIoaW50IHRhcmdldF9ndGlkLCBrbXBfZmxhZ18zMiAqZmxhZykgeworICAgIF9fa21wX3Jlc3VtZV90ZW1wbGF0ZSh0YXJnZXRfZ3RpZCwgZmxhZyk7Cit9Cit2b2lkIF9fa21wX3Jlc3VtZV82NChpbnQgdGFyZ2V0X2d0aWQsIGttcF9mbGFnXzY0ICpmbGFnKSB7CisgICAgX19rbXBfcmVzdW1lX3RlbXBsYXRlKHRhcmdldF9ndGlkLCBmbGFnKTsKK30KK3ZvaWQgX19rbXBfcmVzdW1lX29uY29yZShpbnQgdGFyZ2V0X2d0aWQsIGttcF9mbGFnX29uY29yZSAqZmxhZykgeworICAgIF9fa21wX3Jlc3VtZV90ZW1wbGF0ZSh0YXJnZXRfZ3RpZCwgZmxhZyk7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZAorX19rbXBfeWllbGQoIGludCBjb25kICkKK3sKKyAgICBpZiAoY29uZCkKKyAgICAgICAgU2xlZXAoMCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQKK19fa21wX2d0aWRfc2V0X3NwZWNpZmljKCBpbnQgZ3RpZCApCit7CisgICAgS0FfVFJBQ0UoIDUwLCAoIl9fa21wX2d0aWRfc2V0X3NwZWNpZmljOiBUIyVkIGtleTolZFxuIiwKKyAgICAgICAgICAgICAgICBndGlkLCBfX2ttcF9ndGlkX3RocmVhZHByaXZhdGVfa2V5ICkpOworICAgIEtNUF9BU1NFUlQoIF9fa21wX2luaXRfcnVudGltZSApOworICAgIGlmKCAhIFRsc1NldFZhbHVlKCBfX2ttcF9ndGlkX3RocmVhZHByaXZhdGVfa2V5LCAoTFBWT0lEKShndGlkKzEpKSApCisgICAgICAgIEtNUF9GQVRBTCggVExTU2V0VmFsdWVGYWlsZWQgKTsKK30KKworaW50CitfX2ttcF9ndGlkX2dldF9zcGVjaWZpYygpCit7CisgICAgaW50IGd0aWQ7CisgICAgaWYoICFfX2ttcF9pbml0X3J1bnRpbWUgKSB7CisgICAgICAgIEtBX1RSQUNFKCA1MCwgKCJfX2ttcF9nZXRfc3BlY2lmaWM6IHJ1bnRpbWUgc2h1dGRvd24sIHJldHVybmluZyBLTVBfR1RJRF9TSFVURE9XTlxuIiApICk7CisgICAgICAgIHJldHVybiBLTVBfR1RJRF9TSFVURE9XTjsKKyAgICB9CisgICAgZ3RpZCA9IChpbnQpKGttcF9pbnRwdHJfdClUbHNHZXRWYWx1ZSggX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSApOworICAgIGlmICggZ3RpZCA9PSAwICkgeworICAgICAgICBndGlkID0gS01QX0dUSURfRE5FOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZ3RpZC0tOworICAgIH0KKyAgICBLQV9UUkFDRSggNTAsICgiX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWM6IGtleTolZCBndGlkOiVkXG4iLAorICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfdGhyZWFkcHJpdmF0ZV9rZXksIGd0aWQgKSk7CisgICAgcmV0dXJuIGd0aWQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBLTVBfR1JPVVBfQUZGSU5JVFkKKworLy8KKy8vIE9ubHkgMSBEV09SRCBpbiB0aGUgbWFzayBzaG91bGQgaGF2ZSBhbnkgcHJvY3Mgc2V0LgorLy8gUmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBpbmRleCwgb3IgLTEgZm9yIGFuIGludmFsaWQgbWFzay4KKy8vCitpbnQKK19fa21wX2dldF9wcm9jX2dyb3VwKCBrbXBfYWZmaW5fbWFza190IGNvbnN0ICptYXNrICkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgZ3JvdXAgPSAtMTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgX19rbXBfbnVtX3Byb2NfZ3JvdXBzOyBpKyspIHsKKyAgICAgICAgaWYgKG1hc2tbaV0gPT0gMCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdyb3VwID49IDApIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBncm91cCA9IGk7CisgICAgfQorICAgIHJldHVybiBncm91cDsKK30KKworI2VuZGlmIC8qIEtNUF9HUk9VUF9BRkZJTklUWSAqLworCitpbnQKK19fa21wX3NldF9zeXN0ZW1fYWZmaW5pdHkoIGttcF9hZmZpbl9tYXNrX3QgY29uc3QgKm1hc2ssIGludCBhYm9ydF9vbl9lcnJvciApCit7CisKKyNpZiBLTVBfR1JPVVBfQUZGSU5JVFkKKworICAgIGlmIChfX2ttcF9udW1fcHJvY19ncm91cHMgPiAxKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIENoZWNrIGZvciBhIHZhbGlkIG1hc2suCisgICAgICAgIC8vCisgICAgICAgIEdST1VQX0FGRklOSVRZIGdhOworICAgICAgICBpbnQgZ3JvdXAgPSBfX2ttcF9nZXRfcHJvY19ncm91cCggbWFzayApOworICAgICAgICBpZiAoZ3JvdXAgPCAwKSB7CisgICAgICAgICAgICBpZiAoYWJvcnRfb25fZXJyb3IpIHsKKyAgICAgICAgICAgICAgICBLTVBfRkFUQUwoQWZmaW5pdHlJbnZhbGlkTWFzaywgImttcF9zZXRfYWZmaW5pdHkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIFRyYW5zZm9ybSB0aGUgYml0IHZlY3RvciBpbnRvIGEgR1JPVVBfQUZGSU5JVFkgc3RydWN0CisgICAgICAgIC8vIGFuZCBtYWtlIHRoZSBzeXN0ZW0gY2FsbCB0byBzZXQgYWZmaW5pdHkuCisgICAgICAgIC8vCisgICAgICAgIGdhLkdyb3VwID0gZ3JvdXA7CisgICAgICAgIGdhLk1hc2sgPSBtYXNrW2dyb3VwXTsKKyAgICAgICAgZ2EuUmVzZXJ2ZWRbMF0gPSBnYS5SZXNlcnZlZFsxXSA9IGdhLlJlc2VydmVkWzJdID0gMDsKKworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX1NldFRocmVhZEdyb3VwQWZmaW5pdHkgIT0gTlVMTCk7CisgICAgICAgIGlmIChfX2ttcF9TZXRUaHJlYWRHcm91cEFmZmluaXR5KEdldEN1cnJlbnRUaHJlYWQoKSwgJmdhLCBOVUxMKSA9PSAwKSB7CisgICAgICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgaWYgKGFib3J0X29uX2Vycm9yKSB7CisgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRTZXRUaHJlYWRBZmZNYXNrICksCisgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisKKyNlbmRpZiAvKiBLTVBfR1JPVVBfQUZGSU5JVFkgKi8KKworICAgIHsKKyAgICAgICAgaWYgKCFTZXRUaHJlYWRBZmZpbml0eU1hc2soIEdldEN1cnJlbnRUaHJlYWQoKSwgKm1hc2sgKSkgeworICAgICAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgIGlmIChhYm9ydF9vbl9lcnJvcikgeworICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50U2V0VGhyZWFkQWZmTWFzayApLAorICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludAorX19rbXBfZ2V0X3N5c3RlbV9hZmZpbml0eSgga21wX2FmZmluX21hc2tfdCAqbWFzaywgaW50IGFib3J0X29uX2Vycm9yICkKK3sKKworI2lmIEtNUF9HUk9VUF9BRkZJTklUWQorCisgICAgaWYgKF9fa21wX251bV9wcm9jX2dyb3VwcyA+IDEpIHsKKyAgICAgICAgS01QX0NQVV9aRVJPKG1hc2spOworICAgICAgICBHUk9VUF9BRkZJTklUWSBnYTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9HZXRUaHJlYWRHcm91cEFmZmluaXR5ICE9IE5VTEwpOworCisgICAgICAgIGlmIChfX2ttcF9HZXRUaHJlYWRHcm91cEFmZmluaXR5KEdldEN1cnJlbnRUaHJlYWQoKSwgJmdhKSA9PSAwKSB7CisgICAgICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgaWYgKGFib3J0X29uX2Vycm9yKSB7CisgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coRnVuY3Rpb25FcnJvciwgIkdldFRocmVhZEdyb3VwQWZmaW5pdHkoKSIpLAorICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKGVycm9yKSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGVycm9yOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChnYS5Hcm91cCA8IDApIHx8IChnYS5Hcm91cCA+IF9fa21wX251bV9wcm9jX2dyb3VwcykKKyAgICAgICAgICB8fCAoZ2EuTWFzayA9PSAwKSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgbWFza1tnYS5Hcm91cF0gPSBnYS5NYXNrOworICAgIH0KKyAgICBlbHNlCisKKyNlbmRpZiAvKiBLTVBfR1JPVVBfQUZGSU5JVFkgKi8KKworICAgIHsKKyAgICAgICAga21wX2FmZmluX21hc2tfdCBuZXdNYXNrLCBzeXNNYXNrLCByZXR2YWw7CisKKyAgICAgICAgaWYgKCFHZXRQcm9jZXNzQWZmaW5pdHlNYXNrKEdldEN1cnJlbnRQcm9jZXNzKCksICZuZXdNYXNrLCAmc3lzTWFzaykpIHsKKyAgICAgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBpZiAoYWJvcnRfb25fZXJyb3IpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgS01QX01TRyhGdW5jdGlvbkVycm9yLCAiR2V0UHJvY2Vzc0FmZmluaXR5TWFzaygpIiksCisgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoZXJyb3IpLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgcmV0dmFsID0gU2V0VGhyZWFkQWZmaW5pdHlNYXNrKEdldEN1cnJlbnRUaHJlYWQoKSwgbmV3TWFzayk7CisgICAgICAgIGlmICghIHJldHZhbCkgeworICAgICAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgIGlmIChhYm9ydF9vbl9lcnJvcikgeworICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKEZ1bmN0aW9uRXJyb3IsICJTZXRUaHJlYWRBZmZpbml0eU1hc2soKSIpLAorICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKGVycm9yKSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGVycm9yOworICAgICAgICB9CisgICAgICAgIG5ld01hc2sgPSBTZXRUaHJlYWRBZmZpbml0eU1hc2soR2V0Q3VycmVudFRocmVhZCgpLCByZXR2YWwpOworICAgICAgICBpZiAoISBuZXdNYXNrKSB7CisgICAgICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgaWYgKGFib3J0X29uX2Vycm9yKSB7CisgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coRnVuY3Rpb25FcnJvciwgIlNldFRocmVhZEFmZmluaXR5TWFzaygpIiksCisgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoZXJyb3IpLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKm1hc2sgPSByZXR2YWw7CisgICAgfQorICAgIHJldHVybiAwOworfQorCit2b2lkCitfX2ttcF9hZmZpbml0eV9iaW5kX3RocmVhZCggaW50IHByb2MgKQoreworCisjaWYgS01QX0dST1VQX0FGRklOSVRZCisKKyAgICBpZiAoX19rbXBfbnVtX3Byb2NfZ3JvdXBzID4gMSkgeworICAgICAgICAvLworICAgICAgICAvLyBGb3JtIHRoZSBHUk9VUF9BRkZJTklUWSBzdHJ1Y3QgZGlyZWN0bHksIHJhdGhlciB0aGFuIGZpbGxpbmcKKyAgICAgICAgLy8gb3V0IGEgYml0IHZlY3RvciBhbmQgY2FsbGluZyBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KCkuCisgICAgICAgIC8vCisgICAgICAgIEdST1VQX0FGRklOSVRZIGdhOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKChwcm9jID49IDApICYmIChwcm9jIDwgKF9fa21wX251bV9wcm9jX2dyb3VwcworICAgICAgICAgICAqIENIQVJfQklUICogc2l6ZW9mKERXT1JEX1BUUikpKSk7CisgICAgICAgIGdhLkdyb3VwID0gcHJvYyAvIChDSEFSX0JJVCAqIHNpemVvZihEV09SRF9QVFIpKTsKKyAgICAgICAgZ2EuTWFzayA9ICh1bnNpZ25lZCBsb25nIGxvbmcpMSA8PCAocHJvYyAlIChDSEFSX0JJVCAqIHNpemVvZihEV09SRF9QVFIpKSk7CisgICAgICAgIGdhLlJlc2VydmVkWzBdID0gZ2EuUmVzZXJ2ZWRbMV0gPSBnYS5SZXNlcnZlZFsyXSA9IDA7CisKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9TZXRUaHJlYWRHcm91cEFmZmluaXR5ICE9IE5VTEwpOworICAgICAgICBpZiAoX19rbXBfU2V0VGhyZWFkR3JvdXBBZmZpbml0eShHZXRDdXJyZW50VGhyZWFkKCksICZnYSwgTlVMTCkgPT0gMCkgeworICAgICAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7IC8vIEFDOiBjb250aW51ZSBzaWxlbnRseSBpZiBub3QgdmVyYm9zZQorICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAga21wX21zX3dhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRTZXRUaHJlYWRBZmZNYXNrICksCisgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisKKyNlbmRpZiAvKiBLTVBfR1JPVVBfQUZGSU5JVFkgKi8KKworICAgIHsKKyAgICAgICAga21wX2FmZmluX21hc2tfdCBtYXNrOworICAgICAgICBLTVBfQ1BVX1pFUk8oJm1hc2spOworICAgICAgICBLTVBfQ1BVX1NFVChwcm9jLCAmbWFzayk7CisgICAgICAgIF9fa21wX3NldF9zeXN0ZW1fYWZmaW5pdHkoJm1hc2ssIFRSVUUpOworICAgIH0KK30KKwordm9pZAorX19rbXBfYWZmaW5pdHlfZGV0ZXJtaW5lX2NhcGFibGUoIGNvbnN0IGNoYXIgKmVudl92YXIgKQoreworICAgIC8vCisgICAgLy8gQWxsIHZlcnNpb25zIG9mIFdpbmRvd3MqIE9TIChzaW5jZSBXaW4gJzk1KSBzdXBwb3J0IFNldFRocmVhZEFmZmluaXR5TWFzaygpLgorICAgIC8vCisKKyNpZiBLTVBfR1JPVVBfQUZGSU5JVFkKKyAgICBLTVBfQUZGSU5JVFlfRU5BQkxFKF9fa21wX251bV9wcm9jX2dyb3VwcypzaXplb2Yoa21wX2FmZmluX21hc2tfdCkpOworI2Vsc2UKKyAgICBLTVBfQUZGSU5JVFlfRU5BQkxFKHNpemVvZihrbXBfYWZmaW5fbWFza190KSk7CisjZW5kaWYKKworICAgIEtBX1RSQUNFKCAxMCwgKAorICAgICAgICAiX19rbXBfYWZmaW5pdHlfZGV0ZXJtaW5lX2NhcGFibGU6ICIKKyAgICAgICAgICAgICJXaW5kb3dzKiBPUyBhZmZpbml0eSBpbnRlcmZhY2UgZnVuY3Rpb25hbCAobWFzayBzaXplID0gJSIgS01QX1NJWkVfVF9TUEVDICIpLlxuIiwKKyAgICAgICAgX19rbXBfYWZmaW5fbWFza19zaXplCisgICAgKSApOworfQorCitkb3VibGUKK19fa21wX3JlYWRfY3B1X3RpbWUoIHZvaWQgKQoreworICAgIEZJTEVUSU1FICAgIENyZWF0aW9uVGltZSwgRXhpdFRpbWUsIEtlcm5lbFRpbWUsIFVzZXJUaW1lOworICAgIGludCAgICAgICAgIHN0YXR1czsKKyAgICBkb3VibGUgICAgICBjcHVfdGltZTsKKworICAgIGNwdV90aW1lID0gMDsKKworICAgIHN0YXR1cyA9IEdldFByb2Nlc3NUaW1lcyggR2V0Q3VycmVudFByb2Nlc3MoKSwgJkNyZWF0aW9uVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFeGl0VGltZSwgJktlcm5lbFRpbWUsICZVc2VyVGltZSApOworCisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBkb3VibGUgIHNlYyA9IDA7CisKKyAgICAgICAgc2VjICs9IEtlcm5lbFRpbWUuZHdIaWdoRGF0ZVRpbWU7CisgICAgICAgIHNlYyArPSBVc2VyVGltZS5kd0hpZ2hEYXRlVGltZTsKKworICAgICAgICAvKiBTaGlmdCBsZWZ0IGJ5IDMyIGJpdHMgKi8KKyAgICAgICAgc2VjICo9IChkb3VibGUpICgxIDw8IDE2KSAqIChkb3VibGUpICgxIDw8IDE2KTsKKworICAgICAgICBzZWMgKz0gS2VybmVsVGltZS5kd0xvd0RhdGVUaW1lOworICAgICAgICBzZWMgKz0gVXNlclRpbWUuZHdMb3dEYXRlVGltZTsKKworICAgICAgICBjcHVfdGltZSArPSAoc2VjICogMTAwLjApIC8gS01QX05TRUNfUEVSX1NFQzsKKyAgICB9CisKKyAgICByZXR1cm4gY3B1X3RpbWU7Cit9CisKK2ludAorX19rbXBfcmVhZF9zeXN0ZW1faW5mbyggc3RydWN0IGttcF9zeXNfaW5mbyAqaW5mbyApCit7CisgICAgaW5mby0+bWF4cnNzICA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIHRoZSBtYXhpbXVtIHJlc2lkZW50IHNldCBzaXplIHV0aWxpemVkIChpbiBraWxvYnl0ZXMpICAgICAqLworICAgIGluZm8tPm1pbmZsdCAgPSAwOyAgICAgICAgICAgICAgICAgICAvKiB0aGUgbnVtYmVyIG9mIHBhZ2UgZmF1bHRzIHNlcnZpY2VkIHdpdGhvdXQgYW55IEkvTyAgICAgICAgKi8KKyAgICBpbmZvLT5tYWpmbHQgID0gMDsgICAgICAgICAgICAgICAgICAgLyogdGhlIG51bWJlciBvZiBwYWdlIGZhdWx0cyBzZXJ2aWNlZCB0aGF0IHJlcXVpcmVkIEkvTyAgICAgICovCisgICAgaW5mby0+bnN3YXAgICA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIHRoZSBudW1iZXIgb2YgdGltZXMgYSBwcm9jZXNzIHdhcyAic3dhcHBlZCIgb3V0IG9mIG1lbW9yeSAqLworICAgIGluZm8tPmluYmxvY2sgPSAwOyAgICAgICAgICAgICAgICAgICAvKiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBmaWxlIHN5c3RlbSBoYWQgdG8gcGVyZm9ybSBpbnB1dCAgKi8KKyAgICBpbmZvLT5vdWJsb2NrID0gMDsgICAgICAgICAgICAgICAgICAgLyogdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgZmlsZSBzeXN0ZW0gaGFkIHRvIHBlcmZvcm0gb3V0cHV0ICovCisgICAgaW5mby0+bnZjc3cgICA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIHRoZSBudW1iZXIgb2YgdGltZXMgYSBjb250ZXh0IHN3aXRjaCB3YXMgdm9sdW50YXJpbHkgICAgICAqLworICAgIGluZm8tPm5pdmNzdyAgPSAwOyAgICAgICAgICAgICAgICAgICAvKiB0aGUgbnVtYmVyIG9mIHRpbWVzIGEgY29udGV4dCBzd2l0Y2ggd2FzIGZvcmNlZCAgICAgICAgICAgKi8KKworICAgIHJldHVybiAxOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKK3ZvaWQKK19fa21wX3J1bnRpbWVfaW5pdGlhbGl6ZSggdm9pZCApCit7CisgICAgU1lTVEVNX0lORk8gaW5mbzsKKyAgICBrbXBfc3RyX2J1Zl90IHBhdGg7CisgICAgVUlOVCBwYXRoX3NpemU7CisKKyAgICBpZiAoIF9fa21wX2luaXRfcnVudGltZSApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH07CisKKyNpZiBLTVBfRFlOQU1JQ19MSUIKKyAgICAvKiBQaW4gZHluYW1pYyBsaWJyYXJ5IGZvciB0aGUgbGlmZXRpbWUgb2YgYXBwbGljYXRpb24gKi8KKyAgICB7CisgICAgICAgIC8vIEZpcnN0LCB0dXJuIG9mZiBlcnJvciBtZXNzYWdlIGJveGVzCisgICAgICAgIFVJTlQgZXJyX21vZGUgPSBTZXRFcnJvck1vZGUgKFNFTV9GQUlMQ1JJVElDQUxFUlJPUlMpOworICAgICAgICBITU9EVUxFIGg7CisgICAgICAgIEJPT0wgcmV0ID0gR2V0TW9kdWxlSGFuZGxlRXgoIEdFVF9NT0RVTEVfSEFORExFX0VYX0ZMQUdfRlJPTV9BRERSRVNTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfEdFVF9NT0RVTEVfSEFORExFX0VYX0ZMQUdfUElOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUENUU1RSKSZfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZSwgJmgpOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUMihoICYmIHJldCwgIk9wZW5NUCBSVEwgY2Fubm90IGZpbmQgaXRzZWxmIGxvYWRlZCIpOworICAgICAgICBTZXRFcnJvck1vZGUgKGVycl9tb2RlKTsgICAvLyBSZXN0b3JlIGVycm9yIG1vZGUKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3J1bnRpbWVfaW5pdGlhbGl6ZTogZHluYW1pYyBsaWJyYXJ5IHBpbm5lZFxuIikgKTsKKyAgICB9CisjZW5kaWYKKworICAgIEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oICYgX19rbXBfd2luMzJfc2VjdGlvbiApOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfc3lzdGVtX29iamVjdF9jcmVhdGVkKCAmIF9fa21wX3dpbjMyX3NlY3Rpb24sICJDcml0aWNhbCBTZWN0aW9uIiApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICBfX2ttcF9pbml0aWFsaXplX3N5c3RlbV90aWNrKCk7CisKKyAgICAjaWYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQpCisgICAgICAgIGlmICggISBfX2ttcF9jcHVpbmZvLmluaXRpYWxpemVkICkgeworICAgICAgICAgICAgX19rbXBfcXVlcnlfY3B1aWQoICYgX19rbXBfY3B1aW5mbyApOworICAgICAgICB9OyAvLyBpZgorICAgICNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKyAgICAvKiBTZXQgdXAgbWluaW11bSBudW1iZXIgb2YgdGhyZWFkcyB0byBzd2l0Y2ggdG8gVExTIGd0aWQgKi8KKyAgICAjaWYgS01QX09TX1dJTkRPV1MgJiYgISBkZWZpbmVkIEtNUF9EWU5BTUlDX0xJQgorICAgICAgICAvLyBXaW5kb3dzKiBPUywgc3RhdGljIGxpYnJhcnkuCisgICAgICAgIC8qCisgICAgICAgICAgICBOZXcgdGhyZWFkIG1heSB1c2Ugc3RhY2sgc3BhY2UgcHJldmlvdXNseSB1c2VkIGJ5IGFub3RoZXIgdGhyZWFkLCBjdXJyZW50bHkgdGVybWluYXRlZC4KKyAgICAgICAgICAgIE9uIFdpbmRvd3MqIE9TLCBpbiBjYXNlIG9mIHN0YXRpYyBsaW5raW5nLCB3ZSBkbyBub3Qga25vdyB0aGUgbW9tZW50IG9mIHRocmVhZCB0ZXJtaW5hdGlvbiwKKyAgICAgICAgICAgIGFuZCBvdXIgc3RydWN0dXJlcyAoX19rbXBfdGhyZWFkcyBhbmQgX19rbXBfcm9vdCBhcnJheXMpIGFyZSBzdGlsbCBrZWVwIGluZm8gYWJvdXQgZGVhZAorICAgICAgICAgICAgdGhyZWFkcy4gVGhpcyBsZWFkcyB0byBwcm9ibGVtIGluIF9fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkKCkgZnVuY3Rpb246IGl0IHdyb25nbHkKKyAgICAgICAgICAgIGZpbmRzIGd0aWQgKGJ5IHNlYXJjaGluZyB0aHJvdWdoIHN0YWNrIGFkZHJlc3NlcyBvZiBhbGwga25vd24gdGhyZWFkcykgZm9yIHVucmVnaXN0ZXJlZAorICAgICAgICAgICAgZm9yZWlnbiB0cmVhZC4KKworICAgICAgICAgICAgU2V0dGluZyBfX2ttcF90bHNfZ3RpZF9taW4gdG8gMCB3b3JrYXJvdW5kcyB0aGlzIHByb2JsZW06IF9fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkKCkKKyAgICAgICAgICAgIGRvZXMgbm90IHNlYXJjaCB0aHJvdWdoIHN0YWNrcywgYnV0IGdldCBndGlkIGZyb20gVExTIGltbWVkaWF0ZWx5LgorCisgICAgICAgICAgICAtLWxuCisgICAgICAgICovCisgICAgICAgIF9fa21wX3Rsc19ndGlkX21pbiA9IDA7CisgICAgI2Vsc2UKKyAgICAgICAgX19rbXBfdGxzX2d0aWRfbWluID0gS01QX1RMU19HVElEX01JTjsKKyAgICAjZW5kaWYKKworICAgIC8qIGZvciB0aGUgc3RhdGljIGxpYnJhcnkgKi8KKyAgICBpZiAoICFfX2ttcF9ndGlkX3RocmVhZHByaXZhdGVfa2V5ICkgeworICAgICAgICBfX2ttcF9ndGlkX3RocmVhZHByaXZhdGVfa2V5ID0gVGxzQWxsb2MoKTsKKyAgICAgICAgaWYoIF9fa21wX2d0aWRfdGhyZWFkcHJpdmF0ZV9rZXkgPT0gVExTX09VVF9PRl9JTkRFWEVTICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBUTFNPdXRPZkluZGV4ZXMgKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLy8KKyAgICAvLyBMb2FkIG50ZGxsLmRsbC4KKyAgICAvLworICAgIC8qCisgICAgICAgIFNpbXBsZQorICAgICAgICAgICAgR2V0TW9kdWxlSGFuZGxlKCAibnRkbGwuZGwiICkKKyAgICAgICAgaXMgbm90IHN1aXRhYmxlIGR1ZSB0byBzZWN1cml0eSBpc3N1ZSAoc2VlCisgICAgICAgIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS90ZWNobmV0L3NlY3VyaXR5L2Fkdmlzb3J5LzIyNjk2MzcubXNweCkuIFdlIGhhdmUgdG8gc3BlY2lmeSBmdWxsCisgICAgICAgIHBhdGggdG8gdGhlIGxpYnJhcnkuCisgICAgKi8KKyAgICBfX2ttcF9zdHJfYnVmX2luaXQoICYgcGF0aCApOworICAgIHBhdGhfc2l6ZSA9IEdldFN5c3RlbURpcmVjdG9yeSggcGF0aC5zdHIsIHBhdGguc2l6ZSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHBhdGhfc2l6ZSA+IDAgKTsKKyAgICBpZiAoIHBhdGhfc2l6ZSA+PSBwYXRoLnNpemUgKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIEJ1ZmZlciBpcyB0b28gc2hvcnQuICBFeHBhbmQgdGhlIGJ1ZmZlciBhbmQgdHJ5IGFnYWluLgorICAgICAgICAvLworICAgICAgICBfX2ttcF9zdHJfYnVmX3Jlc2VydmUoICYgcGF0aCwgcGF0aF9zaXplICk7CisgICAgICAgIHBhdGhfc2l6ZSA9IEdldFN5c3RlbURpcmVjdG9yeSggcGF0aC5zdHIsIHBhdGguc2l6ZSApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBwYXRoX3NpemUgPiAwICk7CisgICAgfTsgLy8gaWYKKyAgICBpZiAoIHBhdGhfc2l6ZSA+IDAgJiYgcGF0aF9zaXplIDwgcGF0aC5zaXplICkgeworICAgICAgICAvLworICAgICAgICAvLyBOb3cgd2UgaGF2ZSBzeXN0ZW0gZGlyZWN0b3J5IG5hbWUgaW4gdGhlIGJ1ZmZlci4KKyAgICAgICAgLy8gQXBwZW5kIGJhY2tzbGFzaCBhbmQgbmFtZSBvZiBkbGwgdG8gZm9ybSBmdWxsIHBhdGgsCisgICAgICAgIC8vCisgICAgICAgIHBhdGgudXNlZCA9IHBhdGhfc2l6ZTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBwYXRoLCAiXFwlcyIsICJudGRsbC5kbGwiICk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gTm93IGxvYWQgbnRkbGwgdXNpbmcgZnVsbCBwYXRoLgorICAgICAgICAvLworICAgICAgICBudGRsbCA9IEdldE1vZHVsZUhhbmRsZSggcGF0aC5zdHIgKTsKKyAgICB9CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBudGRsbCAhPSBOVUxMICk7CisgICAgaWYgKCBudGRsbCAhPSBOVUxMICkgeworICAgICAgICBOdFF1ZXJ5U3lzdGVtSW5mb3JtYXRpb24gPSAoTnRRdWVyeVN5c3RlbUluZm9ybWF0aW9uX3QpIEdldFByb2NBZGRyZXNzKCBudGRsbCwgIk50UXVlcnlTeXN0ZW1JbmZvcm1hdGlvbiIgKTsKKyAgICB9CisgICAgS01QX0RFQlVHX0FTU0VSVCggTnRRdWVyeVN5c3RlbUluZm9ybWF0aW9uICE9IE5VTEwgKTsKKworI2lmIEtNUF9HUk9VUF9BRkZJTklUWQorICAgIC8vCisgICAgLy8gTG9hZCBrZXJuZWwzMi5kbGwuCisgICAgLy8gU2FtZSBjYXZlYXQgLSBtdXN0IHVzZSBmdWxsIHN5c3RlbSBwYXRoIG5hbWUuCisgICAgLy8KKyAgICBpZiAoIHBhdGhfc2l6ZSA+IDAgJiYgcGF0aF9zaXplIDwgcGF0aC5zaXplICkgeworICAgICAgICAvLworICAgICAgICAvLyBUcnVuY2F0ZSB0aGUgYnVmZmVyIGJhY2sgdG8ganVzdCB0aGUgc3lzdGVtIHBhdGggbGVuZ3RoLAorICAgICAgICAvLyBkaXNjYXJkaW5nICJcXG50ZGxsLmRsbCIsIGFuZCByZXBsYWNpbmcgaXQgd2l0aCAia2VybmVsMzIuZGxsIi4KKyAgICAgICAgLy8KKyAgICAgICAgcGF0aC51c2VkID0gcGF0aF9zaXplOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIHBhdGgsICJcXCVzIiwgImtlcm5lbDMyLmRsbCIgKTsKKworICAgICAgICAvLworICAgICAgICAvLyBMb2FkIGtlcm5lbDMyLmRsbCB1c2luZyBmdWxsIHBhdGguCisgICAgICAgIC8vCisgICAgICAgIGtlcm5lbDMyID0gR2V0TW9kdWxlSGFuZGxlKCBwYXRoLnN0ciApOworICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfcnVudGltZV9pbml0aWFsaXplOiBrZXJuZWwzMi5kbGwgPSAlc1xuIiwgcGF0aC5zdHIgKSApOworCisgICAgICAgIC8vCisgICAgICAgIC8vIExvYWQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIGtlcm5lbDMyLmRsbCByb3V0aW5lcworICAgICAgICAvLyB0aGF0IG1heSBvciBtYXkgbm90IGV4aXN0IG9uIHRoaXMgc3lzdGVtLgorICAgICAgICAvLworICAgICAgICBpZiAoIGtlcm5lbDMyICE9IE5VTEwgKSB7CisgICAgICAgICAgICBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JDb3VudCA9IChrbXBfR2V0QWN0aXZlUHJvY2Vzc29yQ291bnRfdCkgR2V0UHJvY0FkZHJlc3MoIGtlcm5lbDMyLCAiR2V0QWN0aXZlUHJvY2Vzc29yQ291bnQiICk7CisgICAgICAgICAgICBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JHcm91cENvdW50ID0gKGttcF9HZXRBY3RpdmVQcm9jZXNzb3JHcm91cENvdW50X3QpIEdldFByb2NBZGRyZXNzKCBrZXJuZWwzMiwgIkdldEFjdGl2ZVByb2Nlc3Nvckdyb3VwQ291bnQiICk7CisgICAgICAgICAgICBfX2ttcF9HZXRUaHJlYWRHcm91cEFmZmluaXR5ID0gKGttcF9HZXRUaHJlYWRHcm91cEFmZmluaXR5X3QpIEdldFByb2NBZGRyZXNzKCBrZXJuZWwzMiwgIkdldFRocmVhZEdyb3VwQWZmaW5pdHkiICk7CisgICAgICAgICAgICBfX2ttcF9TZXRUaHJlYWRHcm91cEFmZmluaXR5ID0gKGttcF9TZXRUaHJlYWRHcm91cEFmZmluaXR5X3QpIEdldFByb2NBZGRyZXNzKCBrZXJuZWwzMiwgIlNldFRocmVhZEdyb3VwQWZmaW5pdHkiICk7CisKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9ydW50aW1lX2luaXRpYWxpemU6IF9fa21wX0dldEFjdGl2ZVByb2Nlc3NvckNvdW50ID0gJXBcbiIsIF9fa21wX0dldEFjdGl2ZVByb2Nlc3NvckNvdW50ICkgKTsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9ydW50aW1lX2luaXRpYWxpemU6IF9fa21wX0dldEFjdGl2ZVByb2Nlc3Nvckdyb3VwQ291bnQgPSAlcFxuIiwgX19rbXBfR2V0QWN0aXZlUHJvY2Vzc29yR3JvdXBDb3VudCApICk7CisgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfcnVudGltZV9pbml0aWFsaXplOl9fa21wX0dldFRocmVhZEdyb3VwQWZmaW5pdHkgPSAlcFxuIiwgX19rbXBfR2V0VGhyZWFkR3JvdXBBZmZpbml0eSApICk7CisgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfcnVudGltZV9pbml0aWFsaXplOiBfX2ttcF9TZXRUaHJlYWRHcm91cEFmZmluaXR5ID0gJXBcbiIsIF9fa21wX1NldFRocmVhZEdyb3VwQWZmaW5pdHkgKSApOworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3J1bnRpbWVfaW5pdGlhbGl6ZTogc2l6ZW9mKGttcF9hZmZpbl9tYXNrX3QpID0gJWRcbiIsIHNpemVvZihrbXBfYWZmaW5fbWFza190KSApICk7CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBTZWUgaWYgZ3JvdXAgYWZmaW5pdHkgaXMgc3VwcG9ydGVkIG9uIHRoaXMgc3lzdGVtLgorICAgICAgICAgICAgLy8gSWYgc28sIGNhbGN1bGF0ZSB0aGUgI2dyb3VwcyBhbmQgI3Byb2NzLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIEdyb3VwIGFmZmluaXR5IHdhcyBpbnRyb2R1Y2VkIHdpdGggV2luZG93cyogNyBPUyBhbmQKKyAgICAgICAgICAgIC8vIFdpbmRvd3MqIFNlcnZlciAyMDA4IFIyIE9TLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmICggKCBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JDb3VudCAhPSBOVUxMICkKKyAgICAgICAgICAgICAgJiYgKCBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JHcm91cENvdW50ICE9IE5VTEwgKQorICAgICAgICAgICAgICAmJiAoIF9fa21wX0dldFRocmVhZEdyb3VwQWZmaW5pdHkgIT0gTlVMTCApCisgICAgICAgICAgICAgICYmICggX19rbXBfU2V0VGhyZWFkR3JvdXBBZmZpbml0eSAhPSBOVUxMICkKKyAgICAgICAgICAgICAgJiYgKCAoIF9fa21wX251bV9wcm9jX2dyb3VwcworICAgICAgICAgICAgICA9IF9fa21wX0dldEFjdGl2ZVByb2Nlc3Nvckdyb3VwQ291bnQoKSApID4gMSApICkgeworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSB0b3RhbCBudW1iZXIgb2YgYWN0aXZlIE9TIHByb2NzLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgaW50IGk7CisKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfcnVudGltZV9pbml0aWFsaXplOiAlZCBwcm9jZXNzb3IgZ3JvdXBzIGRldGVjdGVkXG4iLCBfX2ttcF9udW1fcHJvY19ncm91cHMgKSApOworCisgICAgICAgICAgICAgICAgX19rbXBfeHByb2MgPSAwOworCisgICAgICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPCBfX2ttcF9udW1fcHJvY19ncm91cHM7IGkrKyApIHsKKyAgICAgICAgICAgICAgICAgICAgRFdPUkQgc2l6ZSA9IF9fa21wX0dldEFjdGl2ZVByb2Nlc3NvckNvdW50KCBpICk7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX3hwcm9jICs9IHNpemU7CisgICAgICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9ydW50aW1lX2luaXRpYWxpemU6IHByb2MgZ3JvdXAgJWQgc2l6ZSA9ICVkXG4iLCBpLCBzaXplICkgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3J1bnRpbWVfaW5pdGlhbGl6ZTogJWQgcHJvY2Vzc29yIGdyb3VwcyBkZXRlY3RlZFxuIiwgX19rbXBfbnVtX3Byb2NfZ3JvdXBzICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIF9fa21wX251bV9wcm9jX2dyb3VwcyA8PSAxICkgeworICAgICAgICBHZXRTeXN0ZW1JbmZvKCAmIGluZm8gKTsKKyAgICAgICAgX19rbXBfeHByb2MgPSBpbmZvLmR3TnVtYmVyT2ZQcm9jZXNzb3JzOworICAgIH0KKyNlbHNlCisgICAgR2V0U3lzdGVtSW5mbyggJiBpbmZvICk7CisgICAgX19rbXBfeHByb2MgPSBpbmZvLmR3TnVtYmVyT2ZQcm9jZXNzb3JzOworI2VuZGlmIC8qIEtNUF9HUk9VUF9BRkZJTklUWSAqLworCisgICAgLy8KKyAgICAvLyBJZiB0aGUgT1Mgc2FpZCB0aGVyZSB3ZXJlIDAgcHJvY3MsIHRha2UgYSBndWVzcyBhbmQgdXNlIGEgdmFsdWUgb2YgMi4KKyAgICAvLyBUaGlzIGlzIGRvbmUgZm9yIExpbnV4KiBPUywgYWxzby4gIERvIHdlIG5lZWQgZXJyb3IgLyB3YXJuaW5nPworICAgIC8vCisgICAgaWYgKCBfX2ttcF94cHJvYyA8PSAwICkgeworICAgICAgICBfX2ttcF94cHJvYyA9IDI7CisgICAgfQorCisgICAgS0FfVFJBQ0UoIDUsICgiX19rbXBfcnVudGltZV9pbml0aWFsaXplOiB0b3RhbCBwcm9jZXNzb3JzID0gJWRcbiIsIF9fa21wX3hwcm9jKSApOworCisgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIHBhdGggKTsKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfaW5pdGlhbGl6ZSgpOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIF9fa21wX2luaXRfcnVudGltZSA9IFRSVUU7Cit9IC8vIF9fa21wX3J1bnRpbWVfaW5pdGlhbGl6ZQorCit2b2lkCitfX2ttcF9ydW50aW1lX2Rlc3Ryb3koIHZvaWQgKQoreworICAgIGlmICggISBfX2ttcF9pbml0X3J1bnRpbWUgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2Rlc3Ryb3koKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICAvKiB3ZSBjYW4ndCBEZWxldGVDcml0aWNhbHNlY3Rpb24oICYgX19rbXBfd2luMzJfc2VjdGlvbiApOyAqLworICAgIC8qIGR1ZSB0byB0aGUgS1hfVFJBQ0UoKSBjb21tYW5kcyAqLworICAgIEtBX1RSQUNFKCA0MCwgKCJfX2ttcF9ydW50aW1lX2Rlc3Ryb3lcbiIgKSk7CisKKyAgICBpZiggX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSApIHsKKyAgICAgICAgVGxzRnJlZSggX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSApOworICAgICAgICBfX2ttcF9ndGlkX3RocmVhZHByaXZhdGVfa2V5ID0gMDsKKyAgICB9CisKKyAgICBfX2ttcF9hZmZpbml0eV91bmluaXRpYWxpemUoKTsKKyAgICBEZWxldGVDcml0aWNhbFNlY3Rpb24oICYgX19rbXBfd2luMzJfc2VjdGlvbiApOworCisgICAgbnRkbGwgPSBOVUxMOworICAgIE50UXVlcnlTeXN0ZW1JbmZvcm1hdGlvbiA9IE5VTEw7CisKKyNpZiBLTVBfQVJDSF9YODZfNjQKKyAgICBrZXJuZWwzMiA9IE5VTEw7CisgICAgX19rbXBfR2V0QWN0aXZlUHJvY2Vzc29yQ291bnQgPSBOVUxMOworICAgIF9fa21wX0dldEFjdGl2ZVByb2Nlc3Nvckdyb3VwQ291bnQgPSBOVUxMOworICAgIF9fa21wX0dldFRocmVhZEdyb3VwQWZmaW5pdHkgPSBOVUxMOworICAgIF9fa21wX1NldFRocmVhZEdyb3VwQWZmaW5pdHkgPSBOVUxMOworI2VuZGlmIC8vIEtNUF9BUkNIX1g4Nl82NAorCisgICAgX19rbXBfaW5pdF9ydW50aW1lID0gRkFMU0U7Cit9CisKKwordm9pZAorX19rbXBfdGVybWluYXRlX3RocmVhZCggaW50IGd0aWQgKQoreworICAgIGttcF9pbmZvX3QgICp0aCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKworICAgIGlmKCAhdGggKSByZXR1cm47CisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfdGVybWluYXRlX3RocmVhZDoga2lsbCAoJWQpXG4iLCBndGlkICkgKTsKKworICAgIGlmIChUZXJtaW5hdGVUaHJlYWQoIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCwgKERXT1JEKSAtMSkgPT0gRkFMU0UpIHsKKyAgICAgICAgLyogSXQncyBPSywgdGhlIHRocmVhZCBtYXkgaGF2ZSBleGl0ZWQgYWxyZWFkeSAqLworICAgIH0KKyAgICBfX2ttcF9mcmVlX2hhbmRsZSggdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkICk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQKK19fa21wX2NsZWFyX3N5c3RlbV90aW1lKCB2b2lkICkKK3sKKyAgICBCT09MIHN0YXR1czsKKyAgICBMQVJHRV9JTlRFR0VSIHRpbWU7CisgICAgc3RhdHVzID0gUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoICYgdGltZSApOworICAgIF9fa21wX3dpbjMyX3RpbWUgPSAoa21wX2ludDY0KSB0aW1lLlF1YWRQYXJ0OworfQorCit2b2lkCitfX2ttcF9pbml0aWFsaXplX3N5c3RlbV90aWNrKCB2b2lkICkKK3sKKyAgICB7CisgIEJPT0wgc3RhdHVzOworICBMQVJHRV9JTlRFR0VSIGZyZXE7CisKKyAgc3RhdHVzID0gUXVlcnlQZXJmb3JtYW5jZUZyZXF1ZW5jeSggJiBmcmVxICk7CisgIGlmICghIHN0YXR1cykgeworICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICBLTVBfTVNHKCBGdW5jdGlvbkVycm9yLCAiUXVlcnlQZXJmb3JtYW5jZUZyZXF1ZW5jeSgpIiApLAorICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICk7CisKKyAgfQorICBlbHNlIHsKKyAgICAgIF9fa21wX3dpbjMyX3RpY2sgPSAoKGRvdWJsZSkgMS4wKSAvIChkb3VibGUpIGZyZXEuUXVhZFBhcnQ7CisgIH0KKyAgICB9Cit9CisKKy8qIENhbGN1bGF0ZSB0aGUgZWxhcHNlZCB3YWxsIGNsb2NrIHRpbWUgZm9yIHRoZSB1c2VyICovCisKK3ZvaWQKK19fa21wX2VsYXBzZWQoIGRvdWJsZSAqdCApCit7CisgICAgQk9PTCBzdGF0dXM7CisgICAgTEFSR0VfSU5URUdFUiBub3c7CisgICAgc3RhdHVzID0gUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoICYgbm93ICk7CisgICAgKnQgPSAoKGRvdWJsZSkgbm93LlF1YWRQYXJ0KSAqIF9fa21wX3dpbjMyX3RpY2s7Cit9CisKKy8qIENhbGN1bGF0ZSB0aGUgZWxhcHNlZCB3YWxsIGNsb2NrIHRpY2sgZm9yIHRoZSB1c2VyICovCisKK3ZvaWQKK19fa21wX2VsYXBzZWRfdGljayggZG91YmxlICp0ICkKK3sKKyAgICAqdCA9IF9fa21wX3dpbjMyX3RpY2s7Cit9CisKK3ZvaWQKK19fa21wX3JlYWRfc3lzdGVtX3RpbWUoIGRvdWJsZSAqZGVsdGEgKQoreworCisgICAgaWYgKGRlbHRhICE9IE5VTEwpIHsKKyAgICAgICAgQk9PTCBzdGF0dXM7CisgICAgICAgIExBUkdFX0lOVEVHRVIgbm93OworCisgICAgICAgIHN0YXR1cyA9IFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCAmIG5vdyApOworCisgICAgICAgICpkZWx0YSA9ICgoZG91YmxlKSAoKChrbXBfaW50NjQpIG5vdy5RdWFkUGFydCkgLSBfX2ttcF93aW4zMl90aW1lKSkKKyAgICAqIF9fa21wX3dpbjMyX3RpY2s7CisgICAgfQorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkICogX19zdGRjYWxsCitfX2ttcF9sYXVuY2hfd29ya2VyKCB2b2lkICphcmcgKQoreworICAgIHZvbGF0aWxlIHZvaWQgKnN0YWNrX2RhdGE7CisgICAgdm9pZCAqZXhpdF92YWw7CisgICAgdm9pZCAqcGFkZGluZyA9IDA7CisgICAga21wX2luZm9fdCAqdGhpc190aHIgPSAoa21wX2luZm9fdCAqKSBhcmc7CisgICAgaW50IGd0aWQ7CisKKyAgICBndGlkID0gdGhpc190aHItPnRoLnRoX2luZm8uZHMuZHNfZ3RpZDsKKyAgICBfX2ttcF9ndGlkX3NldF9zcGVjaWZpYyggZ3RpZCApOworI2lmZGVmIEtNUF9UREFUQV9HVElECisgICAgI2Vycm9yICJUaGlzIGRlZmluZSBjYXVzZXMgcHJvYmxlbXMgd2l0aCBMb2FkTGlicmFyeSgpICsgZGVjbHNwZWModGhyZWFkKSAiIFwKKyAgICAgICAgIm9uIFdpbmRvd3MqIE9TLiAgU2VlIENRNTA1NjQsIHRlc3RzIGttcF9sb2FkX2xpYnJhcnkqLmMgYW5kIHRoaXMgTVNETiAiIFwKKyAgICAgICAgInJlZmVyZW5jZTogaHR0cDovL3N1cHBvcnQubWljcm9zb2Z0LmNvbS9rYi8xMTg4MTYiCisgICAgLy9fX2ttcF9ndGlkID0gZ3RpZDsKKyNlbmRpZgorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF90aHJlYWRfbmFtZSggZ3RpZCApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIF9fa21wX2FmZmluaXR5X3NldF9pbml0X21hc2soIGd0aWQsIEZBTFNFICk7CisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisgICAgLy8KKyAgICAvLyBTZXQgdGhlIEZQIGNvbnRyb2wgcmVncyB0byBiZSBhIGNvcHkgb2YKKyAgICAvLyB0aGUgcGFyYWxsZWwgaW5pdGlhbGl6YXRpb24gdGhyZWFkJ3MuCisgICAgLy8KKyAgICBfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkKCk7CisgICAgX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZCggJl9fa21wX2luaXRfeDg3X2ZwdV9jb250cm9sX3dvcmQgKTsKKyAgICBfX2ttcF9sb2FkX214Y3NyKCAmX19rbXBfaW5pdF9teGNzciApOworI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworICAgIGlmICggX19rbXBfc3Rrb2Zmc2V0ID4gMCAmJiBndGlkID4gMCApIHsKKyAgICAgICAgcGFkZGluZyA9IEtNUF9BTExPQ0EoIGd0aWQgKiBfX2ttcF9zdGtvZmZzZXQgKTsKKyAgICB9CisKKyAgICBLTVBfRlNZTkNfUkVMRUFTSU5HKCAmdGhpc190aHIgLT4gdGgudGhfaW5mby5kcy5kc19hbGl2ZSApOworICAgIHRoaXNfdGhyIC0+IHRoLnRoX2luZm8uZHMuZHNfdGhyZWFkX2lkID0gR2V0Q3VycmVudFRocmVhZElkKCk7CisgICAgVENXXzQoIHRoaXNfdGhyIC0+IHRoLnRoX2luZm8uZHMuZHNfYWxpdmUsIFRSVUUgKTsKKworICAgIGlmICggVENSXzQoX19rbXBfZ3RpZF9tb2RlKSA8IDIgKSB7IC8vIGNoZWNrIHN0YWNrIG9ubHkgaWYgaXQgaXMgdXNlZCB0byBnZXQgZ3RpZAorICAgICAgICBUQ1dfUFRSKHRoaXNfdGhyLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrYmFzZSwgJnN0YWNrX2RhdGEpOworICAgICAgICBLTVBfQVNTRVJUKCB0aGlzX3RociAtPiB0aC50aF9pbmZvLmRzLmRzX3N0YWNrZ3JvdyA9PSBGQUxTRSApOworICAgICAgICBfX2ttcF9jaGVja19zdGFja19vdmVybGFwKCB0aGlzX3RociApOworICAgIH0KKyAgICBLTVBfTUIoKTsKKyAgICBleGl0X3ZhbCA9IF9fa21wX2xhdW5jaF90aHJlYWQoIHRoaXNfdGhyICk7CisgICAgS01QX0ZTWU5DX1JFTEVBU0lORyggJnRoaXNfdGhyIC0+IHRoLnRoX2luZm8uZHMuZHNfYWxpdmUgKTsKKyAgICBUQ1dfNCggdGhpc190aHIgLT4gdGgudGhfaW5mby5kcy5kc19hbGl2ZSwgRkFMU0UgKTsKKyAgICBLTVBfTUIoKTsKKyAgICByZXR1cm4gZXhpdF92YWw7Cit9CisKKworLyogVGhlIG1vbml0b3IgdGhyZWFkIGNvbnRyb2xzIGFsbCBvZiB0aGUgdGhyZWFkcyBpbiB0aGUgY29tcGxleCAqLworCit2b2lkICogX19zdGRjYWxsCitfX2ttcF9sYXVuY2hfbW9uaXRvciggdm9pZCAqYXJnICkKK3sKKyAgICBEV09SRCAgICAgICAgd2FpdF9zdGF0dXM7CisgICAga21wX3RocmVhZF90IG1vbml0b3I7CisgICAgaW50ICAgICAgICAgIHN0YXR1czsKKyAgICBpbnQgICAgICAgICAgaW50ZXJ2YWw7CisgICAga21wX2luZm9fdCAqdGhpc190aHIgPSAoa21wX2luZm9fdCAqKSBhcmc7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2luaXRfbW9uaXRvcik7CisgICAgVENXXzQoIF9fa21wX2luaXRfbW9uaXRvciwgMiApOyAgICAvLyBBQzogU2lnbmFsIHRoZSBsaWJyYXJ5IHRoYXQgbW9uaXRvciBoYXMgc3RhcnRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogaGlkZSAiMiIgaW4gZW51bSAobGlrZSB7dHJ1ZSxmYWxzZSxzdGFydGVkfSkKKyAgICB0aGlzX3RociAtPiB0aC50aF9pbmZvLmRzLmRzX3RocmVhZF9pZCA9IEdldEN1cnJlbnRUaHJlYWRJZCgpOworICAgIFRDV180KCB0aGlzX3RociAtPiB0aC50aF9pbmZvLmRzLmRzX2FsaXZlLCBUUlVFICk7CisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfbGF1bmNoX21vbml0b3I6IGxhdW5jaGVkXG4iICkgKTsKKworICAgIG1vbml0b3IgPSBHZXRDdXJyZW50VGhyZWFkKCk7CisKKyAgICAvKiBzZXQgdGhyZWFkIHByaW9yaXR5ICovCisgICAgc3RhdHVzID0gU2V0VGhyZWFkUHJpb3JpdHkoIG1vbml0b3IsIFRIUkVBRF9QUklPUklUWV9ISUdIRVNUICk7CisgICAgaWYgKCEgc3RhdHVzKSB7CisgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgIEtNUF9NU0coIENhbnRTZXRUaHJlYWRQcmlvcml0eSApLAorICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICk7CisgICAgfQorCisgICAgLyogcmVnaXN0ZXIgdXMgYXMgbW9uaXRvciAqLworICAgIF9fa21wX2d0aWRfc2V0X3NwZWNpZmljKCBLTVBfR1RJRF9NT05JVE9SICk7CisjaWZkZWYgS01QX1REQVRBX0dUSUQKKyAgICAjZXJyb3IgIlRoaXMgZGVmaW5lIGNhdXNlcyBwcm9ibGVtcyB3aXRoIExvYWRMaWJyYXJ5KCkgKyBkZWNsc3BlYyh0aHJlYWQpICIgXAorICAgICAgICAib24gV2luZG93cyogT1MuICBTZWUgQ1E1MDU2NCwgdGVzdHMga21wX2xvYWRfbGlicmFyeSouYyBhbmQgdGhpcyBNU0ROICIgXAorICAgICAgICAicmVmZXJlbmNlOiBodHRwOi8vc3VwcG9ydC5taWNyb3NvZnQuY29tL2tiLzExODgxNiIKKyAgICAvL19fa21wX2d0aWQgPSBLTVBfR1RJRF9NT05JVE9SOworI2VuZGlmCisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X3RocmVhZF9pZ25vcmUoKTsgICAgLy8gSW5zdHJ1Y3QgSW50ZWwoUikgVGhyZWFkaW5nIFRvb2xzIHRvIGlnbm9yZSBtb25pdG9yIHRocmVhZC4KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIGludGVydmFsID0gKCAxMDAwIC8gX19rbXBfbW9uaXRvcl93YWtldXBzICk7IC8qIGluIG1pbGxpc2Vjb25kcyAqLworCisgICAgd2hpbGUgKCEgVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSkgeworICAgICAgICAvKiAgVGhpcyB0aHJlYWQgbW9uaXRvcnMgdGhlIHN0YXRlIG9mIHRoZSBzeXN0ZW0gKi8KKworICAgICAgICBLQV9UUkFDRSggMTUsICggIl9fa21wX2xhdW5jaF9tb25pdG9yOiB1cGRhdGVcbiIgKSApOworCisgICAgICAgIHdhaXRfc3RhdHVzID0gV2FpdEZvclNpbmdsZU9iamVjdCggX19rbXBfbW9uaXRvcl9ldiwgaW50ZXJ2YWwgKTsKKworICAgICAgICBpZiAod2FpdF9zdGF0dXMgPT0gV0FJVF9USU1FT1VUKSB7CisgICAgICAgICAgICBUQ1dfNCggX19rbXBfZ2xvYmFsLmcuZ190aW1lLmR0LnRfdmFsdWUsCisgICAgICAgICAgICAgIFRDUl80KCBfX2ttcF9nbG9iYWwuZy5nX3RpbWUuZHQudF92YWx1ZSApICsgMSApOworICAgICAgICB9CisKKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisgICAgfQorCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2xhdW5jaF9tb25pdG9yOiBmaW5pc2hlZFxuIiApICk7CisKKyAgICBzdGF0dXMgPSBTZXRUaHJlYWRQcmlvcml0eSggbW9uaXRvciwgVEhSRUFEX1BSSU9SSVRZX05PUk1BTCApOworICAgIGlmICghIHN0YXR1cykgeworICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICBLTVBfTVNHKCBDYW50U2V0VGhyZWFkUHJpb3JpdHkgKSwKKyAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICApOworICAgIH0KKworICAgIGlmIChfX2ttcF9nbG9iYWwuZy5nX2Fib3J0ICE9IDApIHsKKyAgICAgICAgLyogbm93IHdlIG5lZWQgdG8gdGVybWluYXRlIHRoZSB3b3JrZXIgdGhyZWFkcyAgICovCisgICAgICAgIC8qIHRoZSB2YWx1ZSBvZiB0X2Fib3J0IGlzIHRoZSBzaWduYWwgd2UgY2F1Z2h0ICovCisKKyAgICAgICAgaW50IGd0aWQ7CisKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2xhdW5jaF9tb25pdG9yOiB0ZXJtaW5hdGUgc2lnPSVkXG4iLCAoX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCkgKSApOworCisgICAgICAgIC8qIHRlcm1pbmF0ZSB0aGUgT3Blbk1QIHdvcmtlciB0aHJlYWRzICovCisgICAgICAgIC8qIFRPRE8gdGhpcyBpcyBub3QgdmFsaWQgZm9yIHNpYmxpbmcgdGhyZWFkcyEhCisgICAgICAgICAqIHRoZSB1YmVyIG1hc3RlciBtaWdodCBub3QgYmUgMCBhbnltb3JlLi4gKi8KKyAgICAgICAgZm9yIChndGlkID0gMTsgZ3RpZCA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7ICsrZ3RpZCkKKyAgICAgICAgICAgIF9fa21wX3Rlcm1pbmF0ZV90aHJlYWQoIGd0aWQgKTsKKworICAgICAgICBfX2ttcF9jbGVhbnVwKCk7CisKKyAgICAgICAgU2xlZXAoIDAgKTsKKworICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfbGF1bmNoX21vbml0b3I6IHJhaXNlIHNpZz0lZFxuIiwgKF9fa21wX2dsb2JhbC5nLmdfYWJvcnQpICkgKTsKKworICAgICAgICBpZiAoX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCA+IDApIHsKKyAgICAgICAgICAgIHJhaXNlKCBfX2ttcF9nbG9iYWwuZy5nX2Fib3J0ICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBUQ1dfNCggdGhpc190aHIgLT4gdGgudGhfaW5mby5kcy5kc19hbGl2ZSwgRkFMU0UgKTsKKworICAgIEtNUF9NQigpOworICAgIHJldHVybiBhcmc7Cit9CisKK3ZvaWQKK19fa21wX2NyZWF0ZV93b3JrZXIoIGludCBndGlkLCBrbXBfaW5mb190ICp0aCwgc2l6ZV90IHN0YWNrX3NpemUgKQoreworICAgIGttcF90aHJlYWRfdCAgIGhhbmRsZTsKKyAgICBEV09SRCAgICAgICAgICBpZFRocmVhZDsKKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9jcmVhdGVfd29ya2VyOiB0cnkgdG8gY3JlYXRlIHRocmVhZCAoJWQpXG4iLCBndGlkICkgKTsKKworICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgPSBndGlkOworCisgICAgaWYgKCBLTVBfVUJFUl9HVElEKGd0aWQpICkgeworICAgICAgICBpbnQgICAgIHN0YWNrX2RhdGE7CisKKyAgICAgICAgLyogVE9ETzogR2V0Q3VycmVudFRocmVhZCgpIHJldHVybnMgYSBwc2V1ZG8taGFuZGxlIHRoYXQgaXMgdW5zdWl0YWJsZSBmb3Igb3RoZXIgdGhyZWFkcyB0byB1c2UuCisgICAgICAgICAgIElzIGl0IGFwcHJvcHJpYXRlIHRvIGp1c3QgdXNlIEdldEN1cnJlbnRUaHJlYWQ/ICBXaGVuIHNob3VsZCB3ZSBjbG9zZSB0aGlzIGhhbmRsZT8gIFdoZW4KKyAgICAgICAgICAgdW5yZWdpc3RlcmluZyB0aGUgcm9vdD8KKyAgICAgICAgKi8KKyAgICAgICAgeworICAgICAgICAgICAgQk9PTCByYzsKKyAgICAgICAgICAgIHJjID0gRHVwbGljYXRlSGFuZGxlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Q3VycmVudFByb2Nlc3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEN1cnJlbnRUaHJlYWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEN1cnJlbnRQcm9jZXNzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFVQTElDQVRFX1NBTUVfQUNDRVNTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgS01QX0FTU0VSVCggcmMgKTsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCIgX19rbXBfY3JlYXRlX3dvcmtlcjogUk9PVCBIYW5kbGUgZHVwbGljYXRlZCwgdGggPSAlcCwgaGFuZGxlID0gJSIgS01QX1VJTlRQVFJfU1BFQyAiXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQVk9JRCl0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCApICk7CisgICAgICAgICAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWRfaWQgPSBHZXRDdXJyZW50VGhyZWFkSWQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIFRDUl80KF9fa21wX2d0aWRfbW9kZSkgPCAyICkgeyAvLyBjaGVjayBzdGFjayBvbmx5IGlmIGl0IGlzIHVzZWQgdG8gZ2V0IGd0aWQKKyAgICAgICAgICAgIC8qIHdlIHdpbGwgZHluYW1pY2FsbHkgdXBkYXRlIHRoZSBzdGFjayByYW5nZSBpZiBndGlkX21vZGUgPT0gMSAqLworICAgICAgICAgICAgVENXX1BUUih0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja2Jhc2UsICZzdGFja19kYXRhKTsKKyAgICAgICAgICAgIFRDV19QVFIodGgtPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tzaXplLCAwKTsKKyAgICAgICAgICAgIFRDV180KHRoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrZ3JvdywgVFJVRSk7CisgICAgICAgICAgICBfX2ttcF9jaGVja19zdGFja19vdmVybGFwKCB0aCApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgICAgICAvKiBTZXQgc3RhY2sgc2l6ZSBmb3IgdGhpcyB0aHJlYWQgbm93LiAqLworICAgICAgICBLQV9UUkFDRSggMTAsICggIl9fa21wX2NyZWF0ZV93b3JrZXI6IHN0YWNrX3NpemUgPSAlIiBLTVBfU0laRV9UX1NQRUMKKyAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXNcbiIsIHN0YWNrX3NpemUgKSApOworCisgICAgICAgIHN0YWNrX3NpemUgKz0gZ3RpZCAqIF9fa21wX3N0a29mZnNldDsKKworICAgICAgICBUQ1dfUFRSKHRoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrc2l6ZSwgc3RhY2tfc2l6ZSk7CisgICAgICAgIFRDV180KHRoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrZ3JvdywgRkFMU0UpOworCisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBfY3JlYXRlX3dvcmtlcjogKGJlZm9yZSkgc3RhY2tfc2l6ZSA9ICUiCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfU0laRV9UX1NQRUMKKyAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMsICZfX2ttcF9sYXVuY2hfd29ya2VyID0gJXAsIHRoID0gJXAsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICImaWRUaHJlYWQgPSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChTSVpFX1QpIHN0YWNrX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAoTFBUSFJFQURfU1RBUlRfUk9VVElORSkgJiBfX2ttcF9sYXVuY2hfd29ya2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgKExQVk9JRCkgdGgsICZpZFRocmVhZCApICk7CisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBoYW5kbGUgPSBDcmVhdGVUaHJlYWQoIE5VTEwsIChTSVpFX1QpIHN0YWNrX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBUSFJFQURfU1RBUlRfUk9VVElORSkgX19rbXBfbGF1bmNoX3dvcmtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUFZPSUQpIHRoLCBTVEFDS19TSVpFX1BBUkFNX0lTX0FfUkVTRVJWQVRJT04sICZpZFRocmVhZCApOworICAgICAgICAgICAgfQorCisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBfY3JlYXRlX3dvcmtlcjogKGFmdGVyKSBzdGFja19zaXplID0gJSIKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9TSVpFX1RfU1BFQworICAgICAgICAgICAgICAgICAgICAgICAgIiBieXRlcywgJl9fa21wX2xhdW5jaF93b3JrZXIgPSAlcCwgdGggPSAlcCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgImlkVGhyZWFkID0gJXUsIGhhbmRsZSA9ICUiIEtNUF9VSU5UUFRSX1NQRUMgIlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChTSVpFX1QpIHN0YWNrX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAoTFBUSFJFQURfU1RBUlRfUk9VVElORSkgJiBfX2ttcF9sYXVuY2hfd29ya2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgKExQVk9JRCkgdGgsIGlkVGhyZWFkLCBoYW5kbGUgKSApOworCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCBoYW5kbGUgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudENyZWF0ZVRocmVhZCApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCA9IGhhbmRsZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworICAgIH0KKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9jcmVhdGVfd29ya2VyOiBkb25lIGNyZWF0aW5nIHRocmVhZCAoJWQpXG4iLCBndGlkICkgKTsKK30KKworaW50CitfX2ttcF9zdGlsbF9ydW5uaW5nKGttcF9pbmZvX3QgKnRoKSB7CisgICAgcmV0dXJuIChXQUlUX1RJTUVPVVQgPT0gV2FpdEZvclNpbmdsZU9iamVjdCggdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkLCAwKSk7Cit9CisKK3ZvaWQKK19fa21wX2NyZWF0ZV9tb25pdG9yKCBrbXBfaW5mb190ICp0aCApCit7CisgICAga21wX3RocmVhZF90ICAgICAgICBoYW5kbGU7CisgICAgRFdPUkQgICAgICAgICAgICAgICBpZFRocmVhZDsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGlkZWFsLCBuZXdfaWRlYWw7CisKKyAgICBpZiggX19rbXBfZGZsdF9ibG9ja3RpbWUgPT0gS01QX01BWF9CTE9DS1RJTUUgKSB7CisgICAgICAgIC8vIFdlIGRvbid0IG5lZWQgbW9uaXRvciB0aHJlYWQgaW4gY2FzZSBvZiBNQVhfQkxPQ0tUSU1FCisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9jcmVhdGVfbW9uaXRvcjogc2tpcHBpbmcgbW9uaXRvciB0aHJlYWQgYmVjYXVzZSBvZiBNQVggYmxvY2t0aW1lXG4iICkgKTsKKyAgICAgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGlkICA9IDA7IC8vIHRoaXMgbWFrZXMgcmVhcF9tb25pdG9yIG5vLW9wCisgICAgICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgPSAwOworICAgICAgICBUQ1dfNCggX19rbXBfaW5pdF9tb25pdG9yLCAyICk7IC8vIFNpZ25hbCB0byBzdG9wIHdhaXRpbmcgZm9yIG1vbml0b3IgY3JlYXRpb24KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfY3JlYXRlX21vbml0b3I6IHRyeSB0byBjcmVhdGUgbW9uaXRvclxuIiApICk7CisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIF9fa21wX21vbml0b3JfZXYgPSBDcmVhdGVFdmVudCggTlVMTCwgVFJVRSwgRkFMU0UsIE5VTEwgKTsKKyAgICBpZiAoIF9fa21wX21vbml0b3JfZXYgPT0gTlVMTCApIHsKKyAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgS01QX01TRyggQ2FudENyZWF0ZUV2ZW50ICksCisgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgKTsKKyAgICB9OyAvLyBpZgorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfc3lzdGVtX29iamVjdF9jcmVhdGVkKCBfX2ttcF9tb25pdG9yX2V2LCAiRXZlbnQiICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGlkICA9IEtNUF9HVElEX01PTklUT1I7CisgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCA9IEtNUF9HVElEX01PTklUT1I7CisKKyAgICAvLyBGSVhNRSAtIG9uIFdpbmRvd3MqIE9TLCBpZiBfX2ttcF9tb25pdG9yX3N0a3NpemUgPSAwLCBmaWd1cmUgb3V0IGhvdworICAgIC8vIHRvIGF1dG9tYXRpY2FsbHkgZXhwYW5kIHN0YWNrc2l6ZSBiYXNlZCBvbiBDcmVhdGVUaHJlYWQgZXJyb3IgY29kZS4KKyAgICBpZiAoIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSA9PSAwICkgeworICAgICAgICBfX2ttcF9tb25pdG9yX3N0a3NpemUgPSBLTVBfREVGQVVMVF9NT05JVE9SX1NUS1NJWkU7CisgICAgfQorICAgIGlmICggX19rbXBfbW9uaXRvcl9zdGtzaXplIDwgX19rbXBfc3lzX21pbl9zdGtzaXplICkgeworICAgICAgICBfX2ttcF9tb25pdG9yX3N0a3NpemUgPSBfX2ttcF9zeXNfbWluX3N0a3NpemU7CisgICAgfQorCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2NyZWF0ZV9tb25pdG9yOiByZXF1ZXN0ZWQgc3RhY2tzaXplID0gJWQgYnl0ZXNcbiIsCisgICAgICAgICAgICAgICAgICAgKGludCkgX19rbXBfbW9uaXRvcl9zdGtzaXplICkgKTsKKworICAgIFRDV180KCBfX2ttcF9nbG9iYWwuZy5nX3RpbWUuZHQudF92YWx1ZSwgMCApOworCisgICAgaGFuZGxlID0gQ3JlYXRlVGhyZWFkKCBOVUxMLCAoU0laRV9UKSBfX2ttcF9tb25pdG9yX3N0a3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBUSFJFQURfU1RBUlRfUk9VVElORSkgX19rbXBfbGF1bmNoX21vbml0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBWT0lEKSB0aCwgU1RBQ0tfU0laRV9QQVJBTV9JU19BX1JFU0VSVkFUSU9OLCAmaWRUaHJlYWQgKTsKKyAgICBpZiAoaGFuZGxlID09IDApIHsKKyAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgS01QX01TRyggQ2FudENyZWF0ZVRocmVhZCApLAorICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkID0gaGFuZGxlOworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfY3JlYXRlX21vbml0b3I6IG1vbml0b3IgY3JlYXRlZCAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAodm9pZCAqKSB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQgKSApOworfQorCisvKgorICBDaGVjayB0byBzZWUgaWYgdGhyZWFkIGlzIHN0aWxsIGFsaXZlLgorCisgIE5PVEU6ICBUaGUgRXhpdFByb2Nlc3MoY29kZSkgc3lzdGVtIGNhbGwgY2F1c2VzIGFsbCB0aHJlYWRzIHRvIFRlcm1pbmF0ZQorICAgICAgICAgd2l0aCBhIGV4aXRfdmFsID0gY29kZS4gIEJlY2F1c2Ugb2YgdGhpcyB3ZSBjYW4gbm90IHJlbHkgb24KKyAgICAgICAgIGV4aXRfdmFsIGhhdmluZyBhbnkgcGFydGljdWxhciB2YWx1ZS4gIFNvIHRoaXMgcm91dGluZSBtYXkKKyAgICAgICAgIHJldHVybiBTVElMTF9BTElWRSBpbiBleGl0X3ZhbCBldmVuIGFmdGVyIHRoZSB0aHJlYWQgaXMgZGVhZC4KKyovCisKK2ludAorX19rbXBfaXNfdGhyZWFkX2FsaXZlKCBrbXBfaW5mb190ICogdGgsIERXT1JEICpleGl0X3ZhbCApCit7CisgICAgRFdPUkQgcmM7CisgICAgcmMgPSBHZXRFeGl0Q29kZVRocmVhZCggdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkLCBleGl0X3ZhbCApOworICAgIGlmICggcmMgPT0gMCApIHsKKyAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgS01QX01TRyggRnVuY3Rpb25FcnJvciwgIkdldEV4aXRDb2RlVGhyZWFkKCkiICksCisgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgKTsKKyAgICB9OyAvLyBpZgorICAgIHJldHVybiAoICpleGl0X3ZhbCA9PSBTVElMTF9BQ1RJVkUgKTsKK30KKworCit2b2lkCitfX2ttcF9leGl0X3RocmVhZCgKKyAgICBpbnQgZXhpdF9zdGF0dXMKKykgeworICAgIEV4aXRUaHJlYWQoIGV4aXRfc3RhdHVzICk7Cit9IC8vIF9fa21wX2V4aXRfdGhyZWFkCisKKy8qCisgICAgVGhpcyBpcyBhIGNvbW1vbiBwYXJ0IGZvciBib3RoIF9fa21wX3JlYXBfd29ya2VyKCkgYW5kIF9fa21wX3JlYXBfbW9uaXRvcigpLgorKi8KK3N0YXRpYyB2b2lkCitfX2ttcF9yZWFwX2NvbW1vbigga21wX2luZm9fdCAqIHRoICkKK3sKKyAgICBEV09SRCBleGl0X3ZhbDsKKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcF9yZWFwX2NvbW1vbjogdHJ5IHRvIHJlYXAgKCVkKVxuIiwgdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCApICk7CisKKyAgICAvKgorICAgICAgICAyMDA2LTEwLTE5OgorCisgICAgICAgIFRoZXJlIGFyZSB0d28gb3Bwb3NpdGUgc2l0dWF0aW9uczoKKworICAgICAgICAgICAgMS4gV2luZG93cyogT1Mga2VlcCB0aHJlYWQgYWxpdmUgYWZ0ZXIgaXQgcmVzZXRzIGRzX2FsaXZlIGZsYWcgYW5kIGV4aXRzIGZyb20gdGhyZWFkCisgICAgICAgICAgICAgICBmdW5jdGlvbi4gKEZvciBleGFtcGxlLCBzZWUgQzcwNzcwL1EzOTQyODEgInVubG9hZGluZyBvZiBkbGwgYmFzZWQgb24gT01QIGlzIHZlcnkKKyAgICAgICAgICAgICAgIHNsb3ciLikKKyAgICAgICAgICAgIDIuIFdpbmRvd3MqIE9TIG1heSBraWxsIHRocmVhZCBiZWZvcmUgaXQgcmVzZXRzIGRzX2FsaXZlIGZsYWcuCisKKyAgICAgICAgUmlnaHQgc29sdXRpb24gc2VlbXMgdG8gYmUgd2FpdGluZyBmb3IgKmVpdGhlciogdGhyZWFkIHRlcm1pbmF0aW9uICpvciogZHNfYWxpdmUgcmVzZXR0aW5nLgorCisgICAgKi8KKworICAgIHsKKyAgICAgICAgLy8gVE9ETzogVGhpcyBjb2RlIGlzIHZlcnkgc2ltaWxhciB0byBLTVBfV0FJVF9ZSUVMRC4gTmVlZCB0byBnZW5lcmFsaXplIEtNUF9XQUlUX1lJRUxEIHRvCisgICAgICAgIC8vIGNvdmVyIHRoaXMgdXNhZ2UgYWxzby4KKyAgICAgICAgdm9pZCAqIG9iaiA9IE5VTEw7CisgICAgICAgIHJlZ2lzdGVyIGttcF91aW50MzIgc3BpbnM7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICBLTVBfRlNZTkNfU1BJTl9JTklUKCBvYmosICh2b2lkKikgJiB0aC0+dGgudGhfaW5mby5kcy5kc19hbGl2ZSApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICAgICAgS01QX0lOSVRfWUlFTEQoIHNwaW5zICk7CisgICAgICAgIGRvIHsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICBLTVBfRlNZTkNfU1BJTl9QUkVQQVJFKCBvYmogKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgICAgICAgICBfX2ttcF9pc190aHJlYWRfYWxpdmUoIHRoLCAmZXhpdF92YWwgKTsKKyAgICAgICAgICAgIEtNUF9ZSUVMRCggVENSXzQoX19rbXBfbnRoKSA+IF9fa21wX2F2YWlsX3Byb2MgKTsKKyAgICAgICAgICAgIEtNUF9ZSUVMRF9TUElOKCBzcGlucyApOworICAgICAgICB9IHdoaWxlICggZXhpdF92YWwgPT0gU1RJTExfQUNUSVZFICYmIFRDUl80KCB0aC0+dGgudGhfaW5mby5kcy5kc19hbGl2ZSApICk7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICBpZiAoIGV4aXRfdmFsID09IFNUSUxMX0FDVElWRSApIHsKKyAgICAgICAgICAgIEtNUF9GU1lOQ19DQU5DRUwoIG9iaiApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgS01QX0ZTWU5DX1NQSU5fQUNRVUlSRUQoIG9iaiApOworICAgICAgICB9OyAvLyBpZgorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICB9CisKKyAgICBfX2ttcF9mcmVlX2hhbmRsZSggdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkICk7CisKKyAgICAvKgorICAgICAqIE5PVEU6ICBUaGUgRXhpdFByb2Nlc3MoY29kZSkgc3lzdGVtIGNhbGwgY2F1c2VzIGFsbCB0aHJlYWRzIHRvIFRlcm1pbmF0ZQorICAgICAqICAgICAgICB3aXRoIGEgZXhpdF92YWwgPSBjb2RlLiAgQmVjYXVzZSBvZiB0aGlzIHdlIGNhbiBub3QgcmVseSBvbgorICAgICAqICAgICAgICBleGl0X3ZhbCBoYXZpbmcgYW55IHBhcnRpY3VsYXIgdmFsdWUuCisgICAgICovCisgICAgaWYgKCBleGl0X3ZhbCA9PSBTVElMTF9BQ1RJVkUgKSB7CisgICAgICAgIEtBX1RSQUNFKCAxLCAoICJfX2ttcF9yZWFwX2NvbW1vbjogdGhyZWFkIHN0aWxsIGFjdGl2ZS5cbiIgKSApOworICAgIH0gZWxzZSBpZiAoICh2b2lkICopIGV4aXRfdmFsICE9ICh2b2lkICopIHRoKSB7CisgICAgICAgIEtBX1RSQUNFKCAxLCAoICJfX2ttcF9yZWFwX2NvbW1vbjogRXhpdFByb2Nlc3MgLyBUZXJtaW5hdGVUaHJlYWQgdXNlZD9cbiIgKSApOworICAgIH07IC8vIGlmCisKKyAgICBLQV9UUkFDRSggMTAsCisgICAgICAgICgKKyAgICAgICAgICAgICJfX2ttcF9yZWFwX2NvbW1vbjogZG9uZSByZWFwaW5nICglZCksIGhhbmRsZSA9ICUiIEtNUF9VSU5UUFRSX1NQRUMgIlxuIiwKKyAgICAgICAgICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQsCisgICAgICAgICAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQKKyAgICAgICAgKQorICAgICk7CisKKyAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQgICAgPSAwOworICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX3RpZCAgICAgICA9IEtNUF9HVElEX0RORTsKKyAgICB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkICAgICAgPSBLTVBfR1RJRF9ETkU7CisgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkX2lkID0gMDsKKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworfQorCit2b2lkCitfX2ttcF9yZWFwX21vbml0b3IoIGttcF9pbmZvX3QgKnRoICkKK3sKKyAgICBpbnQgc3RhdHVzOworCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3JlYXBfbW9uaXRvcjogdHJ5IHRvIHJlYXAgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkICkgKTsKKworICAgIC8vIElmIG1vbml0b3IgaGFzIGJlZW4gY3JlYXRlZCwgaXRzIHRpZCBhbmQgZ3RpZCBzaG91bGQgYmUgS01QX0dUSURfTU9OSVRPUi4KKyAgICAvLyBJZiBib3RoIHRpZCBhbmQgZ3RpZCBhcmUgMCwgaXQgbWVhbnMgdGhlIG1vbml0b3IgZGlkIG5vdCBldmVyIHN0YXJ0LgorICAgIC8vIElmIGJvdGggdGlkIGFuZCBndGlkIGFyZSBLTVBfR1RJRF9ETkUsIHRoZSBtb25pdG9yIGhhcyBiZWVuIHNodXQgZG93bi4KKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aC0+dGgudGhfaW5mby5kcy5kc190aWQgPT0gdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCApOworICAgIGlmICggdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCAhPSBLTVBfR1RJRF9NT05JVE9SICkgeworICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfcmVhcF9tb25pdG9yOiBtb25pdG9yIGRpZCBub3Qgc3RhcnQsIHJldHVybmluZ1xuIikgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIHN0YXR1cyA9IFNldEV2ZW50KCBfX2ttcF9tb25pdG9yX2V2ICk7CisgICAgaWYgKCBzdGF0dXMgPT0gRkFMU0UgKSB7CisgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgIEtNUF9NU0coIENhbnRTZXRFdmVudCApLAorICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICk7CisgICAgfQorICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVhcF9tb25pdG9yOiByZWFwaW5nIHRocmVhZCAoJWQpXG4iLCB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkICkgKTsKKyAgICBfX2ttcF9yZWFwX2NvbW1vbiggdGggKTsKKworICAgIF9fa21wX2ZyZWVfaGFuZGxlKCBfX2ttcF9tb25pdG9yX2V2ICk7CisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KK30KKwordm9pZAorX19rbXBfcmVhcF93b3JrZXIoIGttcF9pbmZvX3QgKiB0aCApCit7CisgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcF9yZWFwX3dvcmtlcjogcmVhcGluZyB0aHJlYWQgKCVkKVxuIiwgdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCApICk7CisgICAgX19rbXBfcmVhcF9jb21tb24oIHRoICk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBLTVBfSEFORExFX1NJR05BTFMKKworCitzdGF0aWMgdm9pZAorX19rbXBfdGVhbV9oYW5kbGVyKCBpbnQgc2lnbm8gKQoreworICAgIGlmICggX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCA9PSAwICkgeworICAgICAgICAvLyBTdGFnZSAxIHNpZ25hbCBoYW5kbGVyLCBsZXQncyBzaHV0IGRvd24gYWxsIG9mIHRoZSB0aHJlYWRzLgorICAgICAgICBpZiAoIF9fa21wX2RlYnVnX2J1ZiApIHsKKyAgICAgICAgICAgIF9fa21wX2R1bXBfZGVidWdfYnVmZmVyKCk7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIEtNUF9NQigpOyAgICAgICAvLyBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuCisgICAgICAgIFRDV180KCBfX2ttcF9nbG9iYWwuZy5nX2Fib3J0LCBzaWdubyApOworICAgICAgICBLTVBfTUIoKTsgICAgICAgLy8gRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLgorICAgICAgICBUQ1dfNCggX19rbXBfZ2xvYmFsLmcuZ19kb25lLCBUUlVFICk7CisgICAgICAgIEtNUF9NQigpOyAgICAgICAvLyBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuCisgICAgfQorfSAvLyBfX2ttcF90ZWFtX2hhbmRsZXIKKworCisKK3N0YXRpYworc2lnX2Z1bmNfdCBfX2ttcF9zaWduYWwoIGludCBzaWdudW0sIHNpZ19mdW5jX3QgaGFuZGxlciApIHsKKyAgICBzaWdfZnVuY190IG9sZCA9IHNpZ25hbCggc2lnbnVtLCBoYW5kbGVyICk7CisgICAgaWYgKCBvbGQgPT0gU0lHX0VSUiApIHsKKyAgICAgICAgaW50IGVycm9yID0gZXJybm87CisgICAgICAgIF9fa21wX21zZygga21wX21zX2ZhdGFsLCBLTVBfTVNHKCBGdW5jdGlvbkVycm9yLCAic2lnbmFsIiApLCBLTVBfRVJSKCBlcnJvciApLCBfX2ttcF9tc2dfbnVsbCApOworICAgIH07IC8vIGlmCisgICAgcmV0dXJuIG9sZDsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoCisgICAgaW50ICAgICAgICAgICBzaWcsCisgICAgc2lnX2Z1bmNfdCAgICBoYW5kbGVyLAorICAgIGludCAgICAgICAgICAgcGFyYWxsZWxfaW5pdAorKSB7CisgICAgc2lnX2Z1bmNfdCBvbGQ7CisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisgICAgS0JfVFJBQ0UoIDYwLCAoIl9fa21wX2luc3RhbGxfb25lX2hhbmRsZXI6IGNhbGxlZDogc2lnPSVkXG4iLCBzaWcgKSApOworICAgIGlmICggcGFyYWxsZWxfaW5pdCApIHsKKyAgICAgICAgb2xkID0gX19rbXBfc2lnbmFsKCBzaWcsIGhhbmRsZXIgKTsKKyAgICAgICAgLy8gU0lHX0RGTCBvbiBXaW5kb3dzKiBPUyBpbiBOVUxMIG9yIDAuCisgICAgICAgIGlmICggb2xkID09IF9fa21wX3NpZ2hsZHJzWyBzaWcgXSApIHsKKyAgICAgICAgICAgIF9fa21wX3NpZ2luc3RhbGxlZFsgc2lnIF0gPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gUmVzdG9yZS9rZWVwIHVzZXIncyBoYW5kbGVyIGlmIG9uZSBwcmV2aW91c2x5IGluc3RhbGxlZC4KKyAgICAgICAgICAgIG9sZCA9IF9fa21wX3NpZ25hbCggc2lnLCBvbGQgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBTYXZlIGluaXRpYWwvc3lzdGVtIHNpZ25hbCBoYW5kbGVycyB0byBzZWUgaWYgdXNlciBoYW5kbGVycyBpbnN0YWxsZWQuCisgICAgICAgIC8vIDIwMDktMDktMjM6IEl0IGlzIGEgZGVhZCBjb2RlLiBPbiBXaW5kb3dzKiBPUyBfX2ttcF9pbnN0YWxsX3NpZ25hbHMgY2FsbGVkIG9uY2Ugd2l0aAorICAgICAgICAvLyBwYXJhbGxlbF9pbml0ID09IFRSVUUuCisgICAgICAgIG9sZCA9IF9fa21wX3NpZ25hbCggc2lnLCBTSUdfREZMICk7CisgICAgICAgIF9fa21wX3NpZ2hsZHJzWyBzaWcgXSA9IG9sZDsKKyAgICAgICAgX19rbXBfc2lnbmFsKCBzaWcsIG9sZCApOworICAgIH07IC8vIGlmCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCit9IC8vIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIKKworc3RhdGljIHZvaWQKK19fa21wX3JlbW92ZV9vbmVfaGFuZGxlciggaW50IHNpZyApIHsKKyAgICBpZiAoIF9fa21wX3NpZ2luc3RhbGxlZFsgc2lnIF0gKSB7CisgICAgICAgIHNpZ19mdW5jX3Qgb2xkOworICAgICAgICBLTVBfTUIoKTsgICAgICAgLy8gRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLgorICAgICAgICBLQl9UUkFDRSggNjAsICggIl9fa21wX3JlbW92ZV9vbmVfaGFuZGxlcjogY2FsbGVkOiBzaWc9JWRcbiIsIHNpZyApICk7CisgICAgICAgIG9sZCA9IF9fa21wX3NpZ25hbCggc2lnLCBfX2ttcF9zaWdobGRyc1sgc2lnIF0gKTsKKyAgICAgICAgaWYgKCBvbGQgIT0gX19rbXBfdGVhbV9oYW5kbGVyICkgeworICAgICAgICAgICAgS0JfVFJBQ0UoIDEwLCAoICJfX2ttcF9yZW1vdmVfb25lX2hhbmRsZXI6IG9vcHMsIG5vdCBvdXIgaGFuZGxlciwgcmVzdG9yaW5nOiBzaWc9JWRcbiIsIHNpZyApICk7CisgICAgICAgICAgICBvbGQgPSBfX2ttcF9zaWduYWwoIHNpZywgb2xkICk7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIF9fa21wX3NpZ2hsZHJzWyBzaWcgXSA9IE5VTEw7CisgICAgICAgIF9fa21wX3NpZ2luc3RhbGxlZFsgc2lnIF0gPSAwOworICAgICAgICBLTVBfTUIoKTsgICAgICAgLy8gRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLgorICAgIH07IC8vIGlmCit9IC8vIF9fa21wX3JlbW92ZV9vbmVfaGFuZGxlcgorCisKK3ZvaWQKK19fa21wX2luc3RhbGxfc2lnbmFscyggaW50IHBhcmFsbGVsX2luaXQgKQoreworICAgIEtCX1RSQUNFKCAxMCwgKCAiX19rbXBfaW5zdGFsbF9zaWduYWxzOiBjYWxsZWRcbiIgKSApOworICAgIGlmICggISBfX2ttcF9oYW5kbGVfc2lnbmFscyApIHsKKyAgICAgICAgS0JfVFJBQ0UoIDEwLCAoICJfX2ttcF9pbnN0YWxsX3NpZ25hbHM6IEtNUF9IQU5ETEVfU0lHTkFMUyBpcyBmYWxzZSAtIGhhbmRsZXJzIG5vdCBpbnN0YWxsZWRcbiIgKSApOworICAgICAgICByZXR1cm47CisgICAgfTsgLy8gaWYKKyAgICBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKCBTSUdJTlQsICBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQgKTsKKyAgICBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKCBTSUdJTEwsICBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQgKTsKKyAgICBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKCBTSUdBQlJULCBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQgKTsKKyAgICBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKCBTSUdGUEUsICBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQgKTsKKyAgICBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKCBTSUdTRUdWLCBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQgKTsKKyAgICBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKCBTSUdURVJNLCBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQgKTsKK30gLy8gX19rbXBfaW5zdGFsbF9zaWduYWxzCisKKwordm9pZAorX19rbXBfcmVtb3ZlX3NpZ25hbHMoIHZvaWQgKQoreworICAgIGludCBzaWc7CisgICAgS0JfVFJBQ0UoIDEwLCAoIl9fa21wX3JlbW92ZV9zaWduYWxzOiBjYWxsZWRcbiIgKSApOworICAgIGZvciAoIHNpZyA9IDE7IHNpZyA8IE5TSUc7ICsrIHNpZyApIHsKKyAgICAgICAgX19rbXBfcmVtb3ZlX29uZV9oYW5kbGVyKCBzaWcgKTsKKyAgICB9OyAvLyBmb3Igc2lnCit9IC8vIF9fa21wX3JlbW92ZV9zaWduYWxzCisKKworI2VuZGlmIC8vIEtNUF9IQU5ETEVfU0lHTkFMUworCisvKiBQdXQgdGhlIHRocmVhZCB0byBzbGVlcCBmb3IgYSB0aW1lIHBlcmlvZCAqLwordm9pZAorX19rbXBfdGhyZWFkX3NsZWVwKCBpbnQgbWlsbGlzICkKK3sKKyAgICBEV09SRCBzdGF0dXM7CisKKyAgICBzdGF0dXMgPSBTbGVlcEV4KCAoRFdPUkQpIG1pbGxpcywgRkFMU0UgKTsKKyAgICBpZiAoIHN0YXR1cyApIHsKKyAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgS01QX01TRyggRnVuY3Rpb25FcnJvciwgIlNsZWVwRXgoKSIgKSwKKyAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICApOworICAgIH0KK30KKworLyogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGdpdmVuIGFkZHJlc3MgaXMgbWFwcGVkIGludG8gdGhlIGN1cnJlbnQgYWRkcmVzcyBzcGFjZS4gKi8KK2ludAorX19rbXBfaXNfYWRkcmVzc19tYXBwZWQoIHZvaWQgKiBhZGRyICkKK3sKKyAgICBEV09SRCBzdGF0dXM7CisgICAgTUVNT1JZX0JBU0lDX0lORk9STUFUSU9OIGxwQnVmZmVyOworICAgIFNJWkVfVCBkd0xlbmd0aDsKKworICAgIGR3TGVuZ3RoID0gc2l6ZW9mKE1FTU9SWV9CQVNJQ19JTkZPUk1BVElPTik7CisKKyAgICBzdGF0dXMgPSBWaXJ0dWFsUXVlcnkoIGFkZHIsICZscEJ1ZmZlciwgZHdMZW5ndGggKTsKKworICAgIHJldHVybiAhKCgoIGxwQnVmZmVyLlN0YXRlID09IE1FTV9SRVNFUlZFKSB8fCAoIGxwQnVmZmVyLlN0YXRlID09IE1FTV9GUkVFICkpIHx8CisgICAgICAgKCggbHBCdWZmZXIuUHJvdGVjdCA9PSBQQUdFX05PQUNDRVNTICkgfHwgKCBscEJ1ZmZlci5Qcm90ZWN0ID09IFBBR0VfRVhFQ1VURSApKSk7Cit9CisKK2ttcF91aW50NjQKK19fa21wX2hhcmR3YXJlX3RpbWVzdGFtcCh2b2lkKQoreworICAgIGttcF91aW50NjQgciA9IDA7CisKKyAgICBRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigoTEFSR0VfSU5URUdFUiopICZyKTsKKyAgICByZXR1cm4gcjsKK30KKworLyogRnJlZSBoYW5kbGUgYW5kIGNoZWNrIHRoZSBlcnJvciBjb2RlICovCit2b2lkCitfX2ttcF9mcmVlX2hhbmRsZSgga21wX3RocmVhZF90IHRIYW5kbGUgKQoreworLyogY2FsbGVkIHdpdGggcGFyYW1ldGVyIHR5cGUgSEFORExFIGFsc28sIHRodXMgc3VwcG9zZSBrbXBfdGhyZWFkX3QgZGVmaW5lZCBhcyBIQU5ETEUgKi8KKyAgICBCT09MIHJjOworICAgIHJjID0gQ2xvc2VIYW5kbGUoIHRIYW5kbGUgKTsKKyAgICBpZiAoICFyYyApIHsKKyAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgS01QX01TRyggQ2FudENsb3NlSGFuZGxlICksCisgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgKTsKKyAgICB9Cit9CisKK2ludAorX19rbXBfZ2V0X2xvYWRfYmFsYW5jZSggaW50IG1heCApIHsKKworICAgIHN0YXRpYyBVTE9ORyBnbGJfYnVmZl9zaXplID0gMTAwICogMTAyNDsKKworICAgIHN0YXRpYyBpbnQgICAgIGdsYl9ydW5uaW5nX3RocmVhZHMgID0gMDsgIC8qIFNhdmVkIGNvdW50IG9mIHRoZSBydW5uaW5nIHRocmVhZHMgZm9yIHRoZSB0aHJlYWQgYmFsYW5jZSBhbGdvcnRpaG0gKi8KKyAgICBzdGF0aWMgZG91YmxlICBnbGJfY2FsbF90aW1lICAgICAgICA9IDA7ICAvKiBUaHJlYWQgYmFsYW5jZSBhbGdvcml0aG0gY2FsbCB0aW1lICovCisKKyAgICBpbnQgcnVubmluZ190aHJlYWRzID0gMDsgICAgICAgICAgICAgIC8vIE51bWJlciBvZiBydW5uaW5nIHRocmVhZHMgaW4gdGhlIHN5c3RlbS4KKyAgICBOVFNUQVRVUyAgc3RhdHVzICAgICAgICA9IDA7CisgICAgVUxPTkcgICAgIGJ1ZmZfc2l6ZSAgICAgPSAwOworICAgIFVMT05HICAgICBpbmZvX3NpemUgICAgID0gMDsKKyAgICB2b2lkICogICAgYnVmZmVyICAgICAgICA9IE5VTEw7CisgICAgUFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OIHNwaSA9IE5VTEw7CisgICAgaW50IGZpcnN0X3RpbWUgICAgICAgICAgPSAxOworCisgICAgZG91YmxlIGNhbGxfdGltZSA9IDAuMDsgLy9zdGFydCwgZmluaXNoOworCisgICAgX19rbXBfZWxhcHNlZCggJiBjYWxsX3RpbWUgKTsKKworICAgIGlmICggZ2xiX2NhbGxfdGltZSAmJgorICAgICAgICAgICAgKCBjYWxsX3RpbWUgLSBnbGJfY2FsbF90aW1lIDwgX19rbXBfbG9hZF9iYWxhbmNlX2ludGVydmFsICkgKSB7CisgICAgICAgIHJ1bm5pbmdfdGhyZWFkcyA9IGdsYl9ydW5uaW5nX3RocmVhZHM7CisgICAgICAgIGdvdG8gZmluaXNoOworICAgIH0KKyAgICBnbGJfY2FsbF90aW1lID0gY2FsbF90aW1lOworCisgICAgLy8gRG8gbm90IHNwZW5kIHRpbWUgb24gcnVubmluZyBhbGdvcml0aG0gaWYgd2UgaGF2ZSBhIHBlcm1hbmVudCBlcnJvci4KKyAgICBpZiAoIE50UXVlcnlTeXN0ZW1JbmZvcm1hdGlvbiA9PSBOVUxMICkgeworICAgICAgICBydW5uaW5nX3RocmVhZHMgPSAtMTsKKyAgICAgICAgZ290byBmaW5pc2g7CisgICAgfTsgLy8gaWYKKworICAgIGlmICggbWF4IDw9IDAgKSB7CisgICAgICAgIG1heCA9IElOVF9NQVg7CisgICAgfTsgLy8gaWYKKworICAgIGRvIHsKKworICAgICAgICBpZiAoIGZpcnN0X3RpbWUgKSB7CisgICAgICAgICAgICBidWZmX3NpemUgPSBnbGJfYnVmZl9zaXplOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnVmZl9zaXplID0gMiAqIGJ1ZmZfc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIGJ1ZmZlciA9IEtNUF9JTlRFUk5BTF9SRUFMTE9DKCBidWZmZXIsIGJ1ZmZfc2l6ZSApOworICAgICAgICBpZiAoIGJ1ZmZlciA9PSBOVUxMICkgeworICAgICAgICAgICAgcnVubmluZ190aHJlYWRzID0gLTE7CisgICAgICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgc3RhdHVzID0gTnRRdWVyeVN5c3RlbUluZm9ybWF0aW9uKCBTeXN0ZW1Qcm9jZXNzSW5mb3JtYXRpb24sIGJ1ZmZlciwgYnVmZl9zaXplLCAmIGluZm9fc2l6ZSApOworICAgICAgICBmaXJzdF90aW1lID0gMDsKKworICAgIH0gd2hpbGUgKCBzdGF0dXMgPT0gU1RBVFVTX0lORk9fTEVOR1RIX01JU01BVENIICk7CisgICAgZ2xiX2J1ZmZfc2l6ZSA9IGJ1ZmZfc2l6ZTsKKworICAgICNkZWZpbmUgQ0hFQ0soIGNvbmQgKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggY29uZCApOyAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKCAhICggY29uZCApICkgeyAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHJ1bm5pbmdfdGhyZWFkcyA9IC0xOyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9CisKKyAgICBDSEVDSyggYnVmZl9zaXplID49IGluZm9fc2l6ZSApOworICAgIHNwaSA9IFBTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTiggYnVmZmVyICk7CisgICAgZm9yICggOyA7ICkgeworICAgICAgICBwdHJkaWZmX3Qgb2Zmc2V0ID0gdWludHB0cl90KCBzcGkgKSAtIHVpbnRwdHJfdCggYnVmZmVyICk7CisgICAgICAgIENIRUNLKCAwIDw9IG9mZnNldCAmJiBvZmZzZXQgKyBzaXplb2YoIFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OICkgPCBpbmZvX3NpemUgKTsKKyAgICAgICAgSEFORExFIHBpZCA9IHNwaS0+UHJvY2Vzc0lkOworICAgICAgICBVTE9ORyBudW0gPSBzcGktPk51bWJlck9mVGhyZWFkczsKKyAgICAgICAgQ0hFQ0soIG51bSA+PSAxICk7CisgICAgICAgIHNpemVfdCBzcGlfc2l6ZSA9IHNpemVvZiggU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04gKSArIHNpemVvZiggU1lTVEVNX1RIUkVBRCApICogKCBudW0gLSAxICk7CisgICAgICAgIENIRUNLKCBvZmZzZXQgKyBzcGlfc2l6ZSA8IGluZm9fc2l6ZSApOyAgICAgICAgICAvLyBNYWtlIHN1cmUgcHJvY2VzcyBpbmZvIHJlY29yZCBmaXRzIHRoZSBidWZmZXIuCisgICAgICAgIGlmICggc3BpLT5OZXh0RW50cnlPZmZzZXQgIT0gMCApIHsKKyAgICAgICAgICAgIENIRUNLKCBzcGlfc2l6ZSA8PSBzcGktPk5leHRFbnRyeU9mZnNldCApOyAgIC8vIEFuZCBkbyBub3Qgb3ZlcmxhcCB3aXRoIHRoZSBuZXh0IHJlY29yZC4KKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgLy8gcGlkID09IDAgY29ycmVzcG9uZHMgdG8gdGhlIFN5c3RlbSBJZGxlIFByb2Nlc3MuIEl0IGFsd2F5cyBoYXMgcnVubmluZyB0aHJlYWRzCisgICAgICAgIC8vIG9uIGFsbCBjb3Jlcy4gU28sIHdlIGRvbid0IGNvbnNpZGVyIHRoZSBydW5uaW5nIHRocmVhZHMgb2YgdGhpcyBwcm9jZXNzLgorICAgICAgICBpZiAoIHBpZCAhPSAwICkgeworICAgICAgICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgbnVtOyArKyBpICkgeworICAgICAgICAgICAgICAgIFRIUkVBRF9TVEFURSBzdGF0ZSA9IHNwaS0+VGhyZWFkc1sgaSBdLlN0YXRlOworICAgICAgICAgICAgICAgIC8vIENvdW50IHRocmVhZHMgdGhhdCBoYXZlIFJlYWR5IG9yIFJ1bm5pbmcgc3RhdGUuCisgICAgICAgICAgICAgICAgLy8gISEhIFRPRE86IFdoeSBjb21tZW50IGRvZXMgbm90IG1hdGNoIHRoZSBjb2RlPz8/CisgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZSA9PSBTdGF0ZVJ1bm5pbmcgKSB7CisgICAgICAgICAgICAgICAgICAgICsrIHJ1bm5pbmdfdGhyZWFkczsKKyAgICAgICAgICAgICAgICAgICAgLy8gU3RvcCBjb3VudGluZyBydW5uaW5nIHRocmVhZHMgaWYgdGhlIG51bWJlciBpcyBhbHJlYWR5IGdyZWF0ZXIgdGhhbgorICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBjb3JlcworICAgICAgICAgICAgICAgICAgICBpZiAoIHJ1bm5pbmdfdGhyZWFkcyA+PSBtYXggKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgIH07IC8vIGZvciBpCisgICAgICAgIH0gLy8gaWYKKyAgICAgICAgaWYgKCBzcGktPk5leHRFbnRyeU9mZnNldCA9PSAwICkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIHNwaSA9IFBTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTiggdWludHB0cl90KCBzcGkgKSArIHNwaS0+TmV4dEVudHJ5T2Zmc2V0ICk7CisgICAgfTsgLy8gZm9yZXZlcgorCisgICAgI3VuZGVmIENIRUNLCisKKyAgICBmaW5pc2g6IC8vIENsZWFuIHVwIGFuZCBleGl0LgorCisgICAgICAgIGlmICggYnVmZmVyICE9IE5VTEwgKSB7CisgICAgICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSggYnVmZmVyICk7CisgICAgICAgIH07IC8vIGlmCisKKyAgICAgICAgZ2xiX3J1bm5pbmdfdGhyZWFkcyA9IHJ1bm5pbmdfdGhyZWFkczsKKworICAgICAgICByZXR1cm4gcnVubmluZ190aHJlYWRzOworCit9IC8vX19rbXBfZ2V0X2xvYWRfYmFsYW5jZSgpCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC9DTWFrZUxpc3RzLnR4dCBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmNjZmMxCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsODAgQEAKKyMgQ01ha2VMaXN0cy50eHQgZmlsZSBmb3IgdW5pdCB0ZXN0aW5nIE9wZW5NUCBMaWJyYXJ5CitpbmNsdWRlKEZpbmRQeXRob25JbnRlcnApCitpbmNsdWRlKENoZWNrVHlwZVNpemUpCisKK2lmKE5PVCBQWVRIT05JTlRFUlBfRk9VTkQpCisgIGxpYm9tcF93YXJuaW5nX3NheSgiQ291bGQgbm90IGZpbmQgUHl0aG9uLiIpCisgIGxpYm9tcF93YXJuaW5nX3NheSgiVGhlIGNoZWNrLWxpYm9tcCB0YXJnZXQgd2lsbCBub3QgYmUgYXZhaWxhYmxlISIpCisgIHJldHVybigpCitlbmRpZigpCisKK21hY3JvKHB5dGhvbml6ZV9ib29sIHZhcikKKyAgaWYgKCR7dmFyfSkKKyAgICBzZXQoJHt2YXJ9IFRydWUpCisgIGVsc2UoKQorICAgIHNldCgke3Zhcn0gRmFsc2UpCisgIGVuZGlmKCkKK2VuZG1hY3JvKCkKKworcHl0aG9uaXplX2Jvb2woTElCT01QX1VTRV9IV0xPQykKKworc2V0KExJQk9NUF9URVNUX0NGTEFHUyAiIiBDQUNIRSBTVFJJTkcKKyAgIkV4dHJhIGNvbXBpbGVyIGZsYWdzIHRvIHNlbmQgdG8gdGhlIHRlc3QgY29tcGlsZXIiKQorCitpZigke0xJQk9NUF9TVEFOREFMT05FX0JVSUxEfSkKKyAgIyBNYWtlIHN1cmUgd2UgY2FuIHVzZSB0aGUgY29uc29sZSBwb29sIGZvciByZWNlbnQgY21ha2UgYW5kIG5pbmphID4gMS41CisgIGlmKENNQUtFX1ZFUlNJT04gVkVSU0lPTl9MRVNTIDMuMS4yMDE0MTExNykKKyAgICBzZXQoY21ha2VfM18yX1VTRVNfVEVSTUlOQUwpCisgIGVsc2UoKQorICAgIHNldChjbWFrZV8zXzJfVVNFU19URVJNSU5BTCBVU0VTX1RFUk1JTkFMKQorICBlbmRpZigpCisgIHNldChMSUJPTVBfVEVTVF9DT01QSUxFUiAke0NNQUtFX0NfQ09NUElMRVJ9IENBQ0hFIFNUUklORworICAgICJDb21waWxlciB0byB1c2UgZm9yIHRlc3RpbmcgT3Blbk1QIGxpYnJhcnkiKQorICBzZXQoTElCT01QX1RFU1RfT1BFTk1QX0ZMQUcgLWZvcGVubXAgQ0FDSEUgU1RSSU5HCisgICAgIk9wZW5NUCBjb21waWxlciBmbGFnIHRvIHVzZSBmb3IgdGVzdGluZyBPcGVuTVAgbGlicmFyeSIpCisgIHNldChMSUJPTVBfTExWTV9MSVRfRVhFQ1VUQUJMRSAiIiBDQUNIRSBTVFJJTkcKKyAgICAiUGF0aCB0byBsbHZtLWxpdCIpCisgIGZpbmRfcHJvZ3JhbShMSVRfRVhFQ1VUQUJMRSBOQU1FUyBsbHZtLWxpdCAke0xJQk9NUF9MTFZNX0xJVF9FWEVDVVRBQkxFfSkKKyAgaWYoTk9UIExJVF9FWEVDVVRBQkxFKQorICAgIGxpYm9tcF9zYXkoIkNhbm5vdCBmaW5kIGxsdm0tbGl0LiIpCisgICAgbGlib21wX3NheSgiUGxlYXNlIHB1dCBsbHZtLWxpdCBpbiB5b3VyIFBBVEggb3Igc2V0IExJQk9NUF9MTFZNX0xJVF9FWEVDVVRBQkxFIHRvIGl0cyBmdWxsIHBhdGgiKQorICAgIGxpYm9tcF93YXJuaW5nX3NheSgiVGhlIGNoZWNrLWxpYm9tcCB0YXJnZXQgd2lsbCBub3QgYmUgYXZhaWxhYmxlISIpCisgICAgcmV0dXJuKCkKKyAgZW5kaWYoKQorICAjIFNldCBsaXQgYXJndW1lbnRzCisgICMgVGhlIC1qIDEgbGV0cyB0aGUgYWN0dWFsIHRlc3RzIHJ1biB3aXRoIHRoZSBlbnRpcmUgbWFjaGluZS4KKyAgIyBXZSBoYXZlIG9uZSB0ZXN0IHRocmVhZCB0aGF0IHNwYXducyB0aGUgdGVzdHMgc2VyaWFsbHkuICBUaGlzIGFsbG93cworICAjIEVhY2ggdGVzdCB0byB1c2UgdGhlIGVudGlyZSBtYWNoaW5lLgorICBzZXQoTElCT01QX0xJVF9BUkdTX0RFRkFVTFQgIi1zdiAtLXNob3ctdW5zdXBwb3J0ZWQgLS1zaG93LXhmYWlsIikKKyAgaWYoTVNWQyBPUiBYQ09ERSkKKyAgICBzZXQoTElCT01QX0xJVF9BUkdTX0RFRkFVTFQgIiR7TElCT01QX0xJVF9BUkdTX0RFRkFVTFR9IC0tbm8tcHJvZ3Jlc3MtYmFyIikKKyAgZW5kaWYoKQorICBzZXQoTElCT01QX0xJVF9BUkdTICIke0xJQk9NUF9MSVRfQVJHU19ERUZBVUxUfSIgQ0FDSEUgU1RSSU5HCisgICAgIkRlZmF1bHQgb3B0aW9ucyBmb3IgbGl0IikKKyAgc2VwYXJhdGVfYXJndW1lbnRzKExJQk9NUF9MSVRfQVJHUykKKyAgYWRkX2N1c3RvbV90YXJnZXQoY2hlY2stbGlib21wCisgICAgQ09NTUFORCAke1BZVEhPTl9FWEVDVVRBQkxFfSAke0xJVF9FWEVDVVRBQkxFfSAke0xJQk9NUF9MSVRfQVJHU30gJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9CisgICAgREVQRU5EUyBvbXAKKyAgICBDT01NRU5UICJSdW5uaW5nIGxpYm9tcCB0ZXN0cyIKKyAgICAke2NtYWtlXzNfMl9VU0VTX1RFUk1JTkFMfQorICApCitlbHNlKCkKKyAgIyBMTFZNIHNvdXJjZSB0cmVlIGJ1aWxkLCB0ZXN0IGp1c3QtYnVpbHQgY2xhbmcKKyAgaWYoTk9UIE1TVkMpCisgICAgc2V0KExJQk9NUF9URVNUX0NPTVBJTEVSICR7TExWTV9SVU5USU1FX09VVFBVVF9JTlRESVJ9L2NsYW5nKQorICBlbHNlKCkKKyAgICBzZXQoTElCT01QX1RFU1RfQ09NUElMRVIgJHtMTFZNX1JVTlRJTUVfT1VUUFVUX0lOVERJUn0vY2xhbmcuZXhlKQorICBlbmRpZigpCisgIHNldChMSUJPTVBfVEVTVF9PUEVOTVBfRkxBRyAtZm9wZW5tcD1saWJvbXApCisgICMgVXNlIGFkZF9saXRfdGVzdHN1aXRlKCkgZnJvbSBMTFZNIENNYWtlLgorICBhZGRfbGl0X3Rlc3RzdWl0ZShjaGVjay1saWJvbXAKKyAgICAiUnVubmluZyBsaWJvbXAgdGVzdHMiCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9CisgICAgREVQRU5EUyBjbGFuZyBjbGFuZy1oZWFkZXJzIEZpbGVDaGVjayBvbXAKKyAgKQorZW5kaWYoKQorCisjIENvbmZpZ3VyZSB0aGUgbGl0LnNpdGUuY2ZnLmluIGZpbGUKK3NldChBVVRPX0dFTl9DT01NRU5UICIjIyBBdXRvZ2VuZXJhdGVkIGJ5IGxpYm9tcCBjb25maWd1cmF0aW9uLlxuIyBEbyBub3QgZWRpdCEiKQorY29uZmlndXJlX2ZpbGUobGl0LnNpdGUuY2ZnLmluIGxpdC5zaXRlLmNmZyBAT05MWSkKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L2FwaS9oYXNfb3Blbm1wLmMgYi9maW5hbC9ydW50aW1lL3Rlc3QvYXBpL2hhc19vcGVubXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTk1ZjU5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L2FwaS9oYXNfb3Blbm1wLmMKQEAgLTAsMCArMSwyMyBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgdGVzdF9oYXNfb3Blbm1wKCkKK3sKKyAgaW50IHJ2YWx1ZSA9IDA7CisjaWZkZWYgX09QRU5NUAorICBydmFsdWUgPSAxOworI2VuZGlmCisgIHJldHVybiAocnZhbHVlKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKyAgaWYoIXRlc3RfaGFzX29wZW5tcCgpKSB7CisgICAgbnVtX2ZhaWxlZCsrOworICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L2FwaS9vbXBfZ2V0X251bV90aHJlYWRzLmMgYi9maW5hbC9ydW50aW1lL3Rlc3QvYXBpL29tcF9nZXRfbnVtX3RocmVhZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGExNDM0Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L2FwaS9vbXBfZ2V0X251bV90aHJlYWRzLmMKQEAgLTAsMCArMSwzOSBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgdGVzdF9vbXBfZ2V0X251bV90aHJlYWRzKCkKK3sKKyAgLyogY2hlY2tzIHRoYXQgb21wX2dldF9udW1fdGhyZWFkcyBpcyBlcXVhbCB0byB0aGUgbnVtYmVyIG9mCisgICAgIHRocmVhZHMgKi8KKyAgaW50IG50aHJlYWRzX2xpYjsKKyAgaW50IG50aHJlYWRzID0gMDsKKworICBudGhyZWFkc19saWIgPSAtMTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgeworICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgeworICAgICAgbnRocmVhZHMrKzsKKyAgICB9IC8qIGVuZCBvZiBjcml0aWNhbCAqLworICAgICNwcmFnbWEgb21wIHNpbmdsZQorICAgIHsgCisgICAgICBudGhyZWFkc19saWIgPSBvbXBfZ2V0X251bV90aHJlYWRzICgpOworICAgIH0gIC8qIGVuZCBvZiBzaW5nbGUgKi8KKyAgfSAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKyAgcmV0dXJuIChudGhyZWFkcyA9PSBudGhyZWFkc19saWIpOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfZ2V0X251bV90aHJlYWRzKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3QvYXBpL29tcF9nZXRfd3RpY2suYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9hcGkvb21wX2dldF93dGljay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMzUyMjYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3QvYXBpL29tcF9nZXRfd3RpY2suYwpAQCAtMCwwICsxLDI0IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCB0ZXN0X29tcF9nZXRfd3RpY2soKQoreworICBkb3VibGUgdGljazsKKyAgdGljayA9IC0xLjsKKyAgdGljayA9IG9tcF9nZXRfd3RpY2sgKCk7CisgIHJldHVybiAoKHRpY2sgPiAwLjApICYmICh0aWNrIDwgMC4wMSkpOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfZ2V0X3d0aWNrKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3QvYXBpL29tcF9nZXRfd3RpbWUuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9hcGkvb21wX2dldF93dGltZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZGNkNGEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3QvYXBpL29tcF9nZXRfd3RpbWUuYwpAQCAtMCwwICsxLDMzIEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKK2ludCB0ZXN0X29tcF9nZXRfd3RpbWUoKQoreworICBkb3VibGUgc3RhcnQ7CisgIGRvdWJsZSBlbmQ7CisgIGRvdWJsZSBtZWFzdXJlZF90aW1lOworICBkb3VibGUgd2FpdF90aW1lID0gNS4wOyAKKyAgc3RhcnQgPSAwOworICBlbmQgPSAwOworICBzdGFydCA9IG9tcF9nZXRfd3RpbWUoKTsKKyAgbXlfc2xlZXAgKHdhaXRfdGltZSk7IAorICBlbmQgPSBvbXBfZ2V0X3d0aW1lKCk7CisgIG1lYXN1cmVkX3RpbWUgPSBlbmQtc3RhcnQ7CisgIHJldHVybiAoKG1lYXN1cmVkX3RpbWUgPiAwLjk3ICogd2FpdF90aW1lKSAmJiAobWVhc3VyZWRfdGltZSA8IDEuMDMgKiB3YWl0X3RpbWUpKSA7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9nZXRfd3RpbWUoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC9hcGkvb21wX2luX3BhcmFsbGVsLmMgYi9maW5hbC9ydW50aW1lL3Rlc3QvYXBpL29tcF9pbl9wYXJhbGxlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwY2MzODUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3QvYXBpL29tcF9pbl9wYXJhbGxlbC5jCkBAIC0wLDAgKzEsMzkgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworLyoKKyAqIENoZWNrcyB0aGF0IGZhbHNlIGlzIHJldHVybmVkIHdoZW4gY2FsbGVkIGZyb20gc2VyaWFsIHJlZ2lvbgorICogYW5kIHRydWUgaXMgcmV0dXJuZWQgd2hlbiBjYWxsZWQgd2l0aGluIHBhcmFsbGVsIHJlZ2lvbi4gCisgKi8KK2ludCB0ZXN0X29tcF9pbl9wYXJhbGxlbCgpCit7CisgIGludCBzZXJpYWw7CisgIGludCBpc3BhcmFsbGVsOworCisgIHNlcmlhbCA9IDE7CisgIGlzcGFyYWxsZWwgPSAwOworICBzZXJpYWwgPSBvbXBfaW5fcGFyYWxsZWwoKTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgeworICAgICAgaXNwYXJhbGxlbCA9IG9tcF9pbl9wYXJhbGxlbCgpOworICAgIH0KKyAgfQorICByZXR1cm4gKCEoc2VyaWFsKSAmJiBpc3BhcmFsbGVsKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX2luX3BhcmFsbGVsKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3QvYXRvbWljL29tcF9hdG9taWMuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9hdG9taWMvb21wX2F0b21pYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NjY2MGUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3QvYXRvbWljL29tcF9hdG9taWMuYwpAQCAtMCwwICsxLDM2NiBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworI2RlZmluZSBET1VCTEVfRElHSVRTIDIwICAvKiBkdF5ET1VCTEVfRElHSVRTICovCisjZGVmaW5lIE1BWF9GQUNUT1IgMTAKKyNkZWZpbmUgS05PV05fUFJPRFVDVCAzNjI4ODAwICAvKiAxMCEgKi8KKworaW50IHRlc3Rfb21wX2F0b21pYygpCit7CisgIGludCBzdW07CisgIGludCBkaWZmOworICBkb3VibGUgZHN1bSA9IDA7CisgIGRvdWJsZSBkdCA9IDAuNTsgIC8qIGJhc2Ugb2YgZ2VvbWV0cmljIHJvdyBmb3IgKyBhbmQgLSB0ZXN0Ki8KKyAgZG91YmxlIGRkaWZmOworICBpbnQgcHJvZHVjdDsKKyAgaW50IHg7CisgIGludCAqbG9naWNzOworICBpbnQgYml0X2FuZCA9IDE7CisgIGludCBiaXRfb3IgPSAwOworICBpbnQgZXhjbHVzaXZfYml0X29yID0gMDsKKyAgaW50IGo7CisgIGludCBrbm93bl9zdW07CisgIGludCBrbm93bl9kaWZmOworICBpbnQga25vd25fcHJvZHVjdDsKKyAgaW50IHJlc3VsdCA9IDA7CisgIGludCBsb2dpY19hbmQgPSAxOworICBpbnQgbG9naWNfb3IgPSAwOworICBkb3VibGUgZGtub3duX3N1bTsKKyAgZG91YmxlIHJvdW5kaW5nX2Vycm9yID0gMS5FLTk7CisgIGRvdWJsZSBkcHQsIGRpdjsKKyAgaW50IGxvZ2ljc0FycmF5W0xPT1BDT1VOVF07CisgIGxvZ2ljcyA9IGxvZ2ljc0FycmF5OworICAKKyAgc3VtID0gMDsKKyAgZGlmZiA9IDA7CisgIHByb2R1Y3QgPSAxOworCisgIC8vIHN1bSBvZiBpbnRlZ2VycyB0ZXN0CisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgaTsKKyAgICAjcHJhZ21hIG9tcCBmb3IKKyAgICBmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKSB7CisgICAgICAjcHJhZ21hIG9tcCBhdG9taWMKKyAgICAgIHN1bSArPSBpOworICAgIH0KKyAgCisgIH0KKyAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyOworICBpZiAoa25vd25fc3VtICE9IHN1bSkKKyAgeworICAgIGZwcmludGYoc3RkZXJyLCAKKyAgICAgICJFcnJvciBpbiBzdW0gd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mICVkLlxuIiwgCisgICAgICBzdW0sIGtub3duX3N1bSk7CisgICAgcmVzdWx0Kys7CisgIH0KKyAgCisgIC8vIGRpZmZlcmVuY2Ugb2YgaW50ZWdlcnMgdGVzdAorICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgaW50IGk7CisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKSB7CisgICAgICAjcHJhZ21hIG9tcCBhdG9taWMKKyAgICAgIGRpZmYgLT0gaTsKKyAgICB9CisgIH0KKyAga25vd25fZGlmZiA9ICgoTE9PUENPVU5UIC0gMSkgKiBMT09QQ09VTlQpIC8gMiAqIC0xOworICBpZiAoZGlmZiAhPSBrbm93bl9kaWZmKQorICB7CisgICAgZnByaW50ZiAoc3RkZXJyLAorICAgICAgIkVycm9yIGluIGRpZmZlcmVuY2Ugd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mIDAuXG4iLAorICAgICAgZGlmZik7CisgICAgcmVzdWx0Kys7CisgIH0KKworICAvLyBzdW0gb2YgZG91YmxlcyB0ZXN0CisgIGRzdW0gPSAwOworICBkcHQgPSAxOworICBmb3IgKGogPSAwOyBqIDwgRE9VQkxFX0RJR0lUUzsgKytqKSB7CisgICAgZHB0ICo9IGR0OworICB9CisgIGRrbm93bl9zdW0gPSAoMSAtIGRwdCkgLyAoMSAtZHQpOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgaW50IGk7CisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yIChpID0gMDsgaSA8IERPVUJMRV9ESUdJVFM7ICsraSkgeworICAgICAgI3ByYWdtYSBvbXAgYXRvbWljCisgICAgICBkc3VtICs9IHBvdyAoZHQsIGkpOworICAgIH0KKyAgfQorICBpZiAoZHN1bSAhPSBka25vd25fc3VtICYmIChmYWJzIChkc3VtIC0gZGtub3duX3N1bSkgPiByb3VuZGluZ19lcnJvcikpIHsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvciBpbiBzdW0gd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICVmIgorICAgICAgIiBpbnN0ZWFkIG9mOiAlZiAoRGlmZmVyZW5jZTogJUUpXG4iLAorICAgICAgZHN1bSwgZGtub3duX3N1bSwgZHN1bSAtIGRrbm93bl9zdW0pOworICAgIHJlc3VsdCsrOworICB9CisKKyAgLy8gZGlmZmVyZW5jZSBvZiBkb3VibGVzIHRlc3QKKyAgZHB0ID0gMTsKKyAgZm9yIChqID0gMDsgaiA8IERPVUJMRV9ESUdJVFM7ICsraikgeworICAgIGRwdCAqPSBkdDsKKyAgfQorICBkZGlmZiA9ICgxIC0gZHB0KSAvICgxIC0gZHQpOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgaW50IGk7CisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yIChpID0gMDsgaSA8IERPVUJMRV9ESUdJVFM7ICsraSkgeworICAgICAgI3ByYWdtYSBvbXAgYXRvbWljCisgICAgICBkZGlmZiAtPSBwb3cgKGR0LCBpKTsKKyAgICB9CisgIH0gCisgIGlmIChmYWJzIChkZGlmZikgPiByb3VuZGluZ19lcnJvcikgeworICAgIGZwcmludGYgKHN0ZGVyciwKKyAgICAgICJFcnJvciBpbiBkaWZmZXJlbmNlIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlRSBpbnN0ZWFkIG9mIDAuMFxuIiwKKyAgICAgIGRkaWZmKTsKKyAgICByZXN1bHQrKzsKKyAgfQorCisgIC8vIHByb2R1Y3Qgb2YgaW50ZWdlcnMgdGVzdAorICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgaW50IGk7CisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yIChpID0gMTsgaSA8PSBNQVhfRkFDVE9SOyBpKyspIHsKKyAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgcHJvZHVjdCAqPSBpOworICAgIH0KKyAgfQorICBrbm93bl9wcm9kdWN0ID0gS05PV05fUFJPRFVDVDsKKyAgaWYgKGtub3duX3Byb2R1Y3QgIT0gcHJvZHVjdCkgeworICAgIGZwcmludGYgKHN0ZGVyciwKKyAgICAgICJFcnJvciBpbiBwcm9kdWN0IHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAlZFxuIiwKKyAgICAgIHByb2R1Y3QsIGtub3duX3Byb2R1Y3QpOworICAgIHJlc3VsdCsrOworICB9CisKKyAgLy8gZGl2aXNpb24gb2YgaW50ZWdlcnMgdGVzdAorICBwcm9kdWN0ID0gS05PV05fUFJPRFVDVDsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICBpbnQgaTsKKyAgICAjcHJhZ21hIG9tcCBmb3IKKyAgICBmb3IgKGkgPSAxOyBpIDw9IE1BWF9GQUNUT1I7ICsraSkgeworICAgICAgI3ByYWdtYSBvbXAgYXRvbWljCisgICAgICBwcm9kdWN0IC89IGk7CisgICAgfQorICB9CisgIGlmIChwcm9kdWN0ICE9IDEpIHsKKyAgICBmcHJpbnRmIChzdGRlcnIsCisgICAgICAiRXJyb3IgaW4gcHJvZHVjdCBkaXZpc2lvbiB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIgorICAgICAgIiBpbnN0ZWFkIG9mIDFcbiIsCisgICAgICBwcm9kdWN0KTsKKyAgICByZXN1bHQrKzsKKyAgfQorICAKKyAgLy8gZGl2aXNpb24gb2YgZG91YmxlcyB0ZXN0CisgIGRpdiA9IDUuMEUrNTsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIGludCBpOworICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvciAoaSA9IDE7IGkgPD0gTUFYX0ZBQ1RPUjsgaSsrKSB7CisgICAgICAjcHJhZ21hIG9tcCBhdG9taWMKKyAgICAgIGRpdiAvPSBpOworICAgIH0KKyAgfQorICBpZiAoZmFicyhkaXYtMC4xMzc3ODcpID49IDEuMEUtNCApIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvciBpbiBkaXZpc2lvbiB3aXRoIGRvdWJsZTogUmVzdWx0IHdhcyAlZiIKKyAgICAgICIgaW5zdGVhZCBvZiAwLjEzNzc4N1xuIiwgZGl2KTsKKyAgfQorCisgIC8vICsrIHRlc3QKKyAgeCA9IDA7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgaTsKKyAgICAjcHJhZ21hIG9tcCBmb3IKKyAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyArK2kpIHsKKyAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgeCsrOworICAgIH0KKyAgfQorICBpZiAoeCAhPSBMT09QQ09VTlQpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvciBpbiArK1xuIik7CisgIH0KKworICAvLyAtLSB0ZXN0CisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgaTsKKyAgICAjcHJhZ21hIG9tcCBmb3IKKyAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyArK2kpIHsKKyAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgeC0tOworICAgIH0KKyAgfQorICBpZiAoeCAhPSAwKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgaW4gLS1cbiIpOworICB9CisKKyAgLy8gYml0LWFuZCB0ZXN0IHBhcnQgMQorICBmb3IgKGogPSAwOyBqIDwgTE9PUENPVU5UOyArK2opIHsKKyAgICBsb2dpY3Nbal0gPSAxOworICB9CisgIGJpdF9hbmQgPSAxOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgIGludCBpOworICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7ICsraSkgeworICAgICAgI3ByYWdtYSBvbXAgYXRvbWljCisgICAgICBiaXRfYW5kICY9IGxvZ2ljc1tpXTsKKyAgICB9CisgIH0KKyAgaWYgKCFiaXRfYW5kKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDFcbiIpOworICB9CisKKyAgLy8gYml0LWFuZCB0ZXN0IHBhcnQgMgorICBiaXRfYW5kID0gMTsKKyAgbG9naWNzW0xPT1BDT1VOVCAvIDJdID0gMDsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIGludCBpOworICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7ICsraSkgeworICAgICAgI3ByYWdtYSBvbXAgYXRvbWljCisgICAgICBiaXRfYW5kICY9IGxvZ2ljc1tpXTsKKyAgICB9CisgIH0KKyAgaWYgKGJpdF9hbmQpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMlxuIik7CisgIH0KKworICAvLyBiaXQtb3IgdGVzdCBwYXJ0IDEKKyAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgaisrKSB7CisgICAgbG9naWNzW2pdID0gMDsKKyAgfQorICBiaXRfb3IgPSAwOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgaW50IGk7CisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgKytpKSB7CisgICAgICAjcHJhZ21hIG9tcCBhdG9taWMKKyAgICAgIGJpdF9vciB8PSBsb2dpY3NbaV07CisgICAgfQorICB9CisgIGlmIChiaXRfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvciBpbiBCSVQgT1IgcGFydCAxXG4iKTsKKyAgfQorCisgIC8vIGJpdC1vciB0ZXN0IHBhcnQgMgorICBiaXRfb3IgPSAwOworICBsb2dpY3NbTE9PUENPVU5UIC8gMl0gPSAxOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgCisgICAgaW50IGk7CisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgKytpKSB7CisgICAgICAjcHJhZ21hIG9tcCBhdG9taWMKKyAgICAgIGJpdF9vciB8PSBsb2dpY3NbaV07CisgICAgfQorICB9CisgIGlmICghYml0X29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgaW4gQklUIE9SIHBhcnQgMlxuIik7CisgIH0KKworICAvLyBiaXQteG9yIHRlc3QgcGFydCAxCisgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7IGorKykgeworICAgIGxvZ2ljc1tqXSA9IDA7CisgIH0KKyAgZXhjbHVzaXZfYml0X29yID0gMDsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIGludCBpOworICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7ICsraSkgeworICAgICAgI3ByYWdtYSBvbXAgYXRvbWljCisgICAgICBleGNsdXNpdl9iaXRfb3IgXj0gbG9naWNzW2ldOworICAgIH0KKyAgfQorICBpZiAoZXhjbHVzaXZfYml0X29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMVxuIik7CisgIH0KKworICAvLyBiaXQteG9yIHRlc3QgcGFydCAyCisgIGV4Y2x1c2l2X2JpdF9vciA9IDA7CisgIGxvZ2ljc1tMT09QQ09VTlQgLyAyXSA9IDE7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgaTsKKyAgICAjcHJhZ21hIG9tcCBmb3IKKyAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyArK2kpIHsKKyAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgZXhjbHVzaXZfYml0X29yIF49IGxvZ2ljc1tpXTsKKyAgICB9CisgICAgCisgIH0KKyAgaWYgKCFleGNsdXNpdl9iaXRfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAyXG4iKTsKKyAgfQorCisgIC8vIGxlZnQgc2hpZnQgdGVzdAorICB4ID0gMTsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIGludCBpOworICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvciAoaSA9IDA7IGkgPCAxMDsgKytpKSB7CisgICAgICAjcHJhZ21hIG9tcCBhdG9taWMKKyAgICAgIHggPDw9IDE7CisgICAgfQorICAgIAorICB9CisgIGlmICggeCAhPSAxMDI0KSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgaW4gPDxcbiIpOworICAgIHggPSAxMDI0OworICB9CisKKyAgLy8gcmlnaHQgc2hpZnQgdGVzdAorICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgaW50IGk7CisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yIChpID0gMDsgaSA8IDEwOyArK2kpIHsKKyAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgeCA+Pj0gMTsKKyAgICB9CisgIH0KKyAgaWYgKHggIT0gMSkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yIGluID4+XG4iKTsKKyAgfQorCisgIHJldHVybiAocmVzdWx0ID09IDApOworfSAvLyB0ZXN0X29tcF9hdG9taWMoKQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfYXRvbWljKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3QvYmFycmllci9vbXBfYmFycmllci5jIGIvZmluYWwvcnVudGltZS90ZXN0L2JhcnJpZXIvb21wX2JhcnJpZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2ZiMDYwCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L2JhcnJpZXIvb21wX2JhcnJpZXIuYwpAQCAtMCwwICsxLDQ0IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKK2ludCB0ZXN0X29tcF9iYXJyaWVyKCkKK3sKKyAgaW50IHJlc3VsdDE7CisgIGludCByZXN1bHQyOworICByZXN1bHQxID0gMDsKKyAgcmVzdWx0MiA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIGludCByYW5rOworICAgIHJhbmsgPSBvbXBfZ2V0X3RocmVhZF9udW0gKCk7CisgICAgaWYgKHJhbmsgPT0xKSB7CisgICAgICBteV9zbGVlcCgoKGRvdWJsZSlTTEVFUFRJTUUpL1JFUEVUSVRJT05TKTsgLy8gZ2l2ZSAxIHNlYyB0byB3aG9sZSB0ZXN0CisgICAgICByZXN1bHQyID0gMzsKKyAgICB9CisgICAgI3ByYWdtYSBvbXAgYmFycmllcgorICAgIGlmIChyYW5rID09IDIpIHsKKyAgICAgIHJlc3VsdDEgPSByZXN1bHQyOworICAgIH0KKyAgfQorICByZXR1cm4gKHJlc3VsdDEgPT0gMyk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyNpZmRlZiBfT1BFTk1QCisgIG9tcF9zZXRfZHluYW1pYygwKTsgLy8gcHJldmVudCBydW50aW1lIHRvIGNoYW5nZSBudW1iZXIgb2YgdGhyZWFkcworICBvbXBfc2V0X251bV90aHJlYWRzKDQpOyAvLyB0aGUgdGVzdCBleHBlY3RzIGF0IGxlYXN0IDMgdGhyZWFkcworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX2JhcnJpZXIoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorI2VuZGlmCisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L2NyaXRpY2FsL29tcF9jcml0aWNhbC5jIGIvZmluYWwvcnVudGltZS90ZXN0L2NyaXRpY2FsL29tcF9jcml0aWNhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwN2RiY2IKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3QvY3JpdGljYWwvb21wX2NyaXRpY2FsLmMKQEAgLTAsMCArMSwzNyBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgdGVzdF9vbXBfY3JpdGljYWwoKQoreworICBpbnQgc3VtOworICBpbnQga25vd25fc3VtOworCisgIHN1bT0wOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgaW50IG15c3VtPTA7CisgICAgaW50IGk7CisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yIChpID0gMDsgaSA8IDEwMDA7IGkrKykKKyAgICAgIG15c3VtID0gbXlzdW0gKyBpOworCisgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICBzdW0gPSBteXN1bSArc3VtOworICB9CisgIGtub3duX3N1bSA9IDk5OSAqIDEwMDAgLyAyOworICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfY3JpdGljYWwoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC9mbHVzaC9vbXBfZmx1c2guYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9mbHVzaC9vbXBfZmx1c2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmQzY2RmCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L2ZsdXNoL29tcF9mbHVzaC5jCkBAIC0wLDAgKzEsNDUgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworaW50IHRlc3Rfb21wX2ZsdXNoKCkKK3sKKyAgaW50IHJlc3VsdDE7CisgIGludCByZXN1bHQyOworICBpbnQgZHVtbXk7CisKKyAgcmVzdWx0MSA9IDA7CisgIHJlc3VsdDIgPSAwOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgcmFuazsKKyAgICByYW5rID0gb21wX2dldF90aHJlYWRfbnVtICgpOworICAgICNwcmFnbWEgb21wIGJhcnJpZXIKKyAgICBpZiAocmFuayA9PSAxKSB7CisgICAgICByZXN1bHQyID0gMzsKKyAgICAgICNwcmFnbWEgb21wIGZsdXNoIChyZXN1bHQyKQorICAgICAgZHVtbXkgPSByZXN1bHQyOworICAgIH0KKyAgICBpZiAocmFuayA9PSAwKSB7CisgICAgICBteV9zbGVlcChTTEVFUFRJTUUpOworICAgICAgI3ByYWdtYSBvbXAgZmx1c2ggKHJlc3VsdDIpCisgICAgICByZXN1bHQxID0gcmVzdWx0MjsKKyAgICB9CisgIH0gIC8qIGVuZCBvZiBwYXJhbGxlbCAqLworICByZXR1cm4gKChyZXN1bHQxID09IHJlc3VsdDIpICYmIChyZXN1bHQyID09IGR1bW15KSAmJiAocmVzdWx0MiA9PSAzKSk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yIChpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfZmx1c2goKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC9saXQuY2ZnIGIvZmluYWwvcnVudGltZS90ZXN0L2xpdC5jZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZkNDQ2NwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9saXQuY2ZnCkBAIC0wLDAgKzEsNzcgQEAKKyMgLSotIFB5dGhvbiAtKi0gdmltOiBzZXQgZnQ9cHl0aG9uIHRzPTQgc3c9NCBleHBhbmR0YWIgdHc9Nzk6CisjIENvbmZpZ3VyYXRpb24gZmlsZSBmb3IgdGhlICdsaXQnIHRlc3QgcnVubmVyLgorCitpbXBvcnQgb3MKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgbGl0LmZvcm1hdHMKKworIyBUZWxsIHB5bGludCB0aGF0IHdlIGtub3cgY29uZmlnIGFuZCBsaXRfY29uZmlnIGV4aXN0IHNvbWV3aGVyZS4KK2lmICdQWUxJTlRfSU1QT1JUJyBpbiBvcy5lbnZpcm9uOgorICAgIGNvbmZpZyA9IG9iamVjdCgpCisgICAgbGl0X2NvbmZpZyA9IG9iamVjdCgpCisKK2RlZiBhcHBlbmRfZHluYW1pY19saWJyYXJ5X3BhdGgocGF0aCk6CisgICAgaWYgY29uZmlnLm9wZXJhdGluZ19zeXN0ZW0gPT0gJ1dpbmRvd3MnOgorICAgICAgICBuYW1lID0gJ1BBVEgnCisgICAgICAgIHNlcCA9ICc7JworICAgIGVsaWYgY29uZmlnLm9wZXJhdGluZ19zeXN0ZW0gPT0gJ0Rhcndpbic6CisgICAgICAgIG5hbWUgPSAnRFlMRF9MSUJSQVJZX1BBVEgnCisgICAgICAgIHNlcCA9ICc6JworICAgIGVsc2U6CisgICAgICAgIG5hbWUgPSAnTERfTElCUkFSWV9QQVRIJworICAgICAgICBzZXAgPSAnOicKKyAgICBpZiBuYW1lIGluIGNvbmZpZy5lbnZpcm9ubWVudDoKKyAgICAgICAgY29uZmlnLmVudmlyb25tZW50W25hbWVdID0gcGF0aCArIHNlcCArIGNvbmZpZy5lbnZpcm9ubWVudFtuYW1lXQorICAgIGVsc2U6CisgICAgICAgIGNvbmZpZy5lbnZpcm9ubWVudFtuYW1lXSA9IHBhdGgKKworIyBuYW1lOiBUaGUgbmFtZSBvZiB0aGlzIHRlc3Qgc3VpdGUuCitjb25maWcubmFtZSA9ICdsaWJvbXAnCisKKyMgc3VmZml4ZXM6IEEgbGlzdCBvZiBmaWxlIGV4dGVuc2lvbnMgdG8gdHJlYXQgYXMgdGVzdCBmaWxlcy4KK2NvbmZpZy5zdWZmaXhlcyA9IFsnLmMnXQorCisjIHRlc3Rfc291cmNlX3Jvb3Q6IFRoZSByb290IHBhdGggd2hlcmUgdGVzdHMgYXJlIGxvY2F0ZWQuCitjb25maWcudGVzdF9zb3VyY2Vfcm9vdCA9IG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykKKworIyB0ZXN0X2V4ZWNfcm9vdDogVGhlIHJvb3Qgb2JqZWN0IGRpcmVjdG9yeSB3aGVyZSBvdXRwdXQgaXMgcGxhY2VkCitjb25maWcudGVzdF9leGVjX3Jvb3QgPSBjb25maWcubGlib21wX29ial9yb290CisKKyMgdGVzdCBmb3JtYXQKK2NvbmZpZy50ZXN0X2Zvcm1hdCA9IGxpdC5mb3JtYXRzLlNoVGVzdCgpCisKKyMgY29tcGlsZXIgZmxhZ3MKK2NvbmZpZy50ZXN0X2NmbGFncyA9IGNvbmZpZy50ZXN0X29wZW5tcF9mbGFnICsgXAorICAgICIgLUkgIiArIGNvbmZpZy50ZXN0X3NvdXJjZV9yb290ICsgXAorICAgICIgLUkgIiArIGNvbmZpZy5vbXBfaGVhZGVyX2RpcmVjdG9yeSArIFwKKyAgICAiIC1MICIgKyBjb25maWcubGlicmFyeV9kaXIgKyBcCisgICAgIiAiICsgY29uZmlnLnRlc3RfZXh0cmFfY2ZsYWdzCisKKyMgU2V0dXAgZW52aXJvbm1lbnQgdG8gZmluZCBkeW5hbWljIGxpYnJhcnkgYXQgcnVudGltZQorYXBwZW5kX2R5bmFtaWNfbGlicmFyeV9wYXRoKGNvbmZpZy5saWJyYXJ5X2RpcikKK2lmIGNvbmZpZy51c2luZ19od2xvYzoKKyAgICBhcHBlbmRfZHluYW1pY19saWJyYXJ5X3BhdGgoY29uZmlnLmh3bG9jX2xpYnJhcnlfZGlyKQorCisjIFJwYXRoIG1vZGlmaWNhdGlvbnMgZm9yIERhcndpbgoraWYgY29uZmlnLm9wZXJhdGluZ19zeXN0ZW0gPT0gJ0Rhcndpbic6CisgICAgY29uZmlnLnRlc3RfY2ZsYWdzICs9ICIgLVdsLC1ycGF0aCwiICsgY29uZmlnLmxpYnJhcnlfZGlyCisgICAgaWYgY29uZmlnLnVzaW5nX2h3bG9jOgorICAgICAgICBjb25maWcudGVzdF9jZmxhZ3MgKz0gIiAtV2wsLXJwYXRoLCIgKyBjb25maWcuaHdsb2NfbGlicmFyeV9kaXIKKworIyBGaW5kIHRoZSBTREsgb24gRGFyd2luCitpZiBjb25maWcub3BlcmF0aW5nX3N5c3RlbSA9PSAnRGFyd2luJzoKKyAgY21kID0gc3VicHJvY2Vzcy5Qb3BlbihbJ3hjcnVuJywgJy0tc2hvdy1zZGstcGF0aCddLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpCisgIG91dCwgZXJyID0gY21kLmNvbW11bmljYXRlKCkKKyAgb3V0ID0gb3V0LnN0cmlwKCkKKyAgcmVzID0gY21kLndhaXQoKQorICBpZiByZXMgPT0gMCBhbmQgb3V0OgorICAgIGNvbmZpZy50ZXN0X2NmbGFncyArPSAiIC1pc3lzcm9vdCAiICsgb3V0CisKKyMgc3Vic3RpdHV0aW9ucworY29uZmlnLnN1YnN0aXR1dGlvbnMuYXBwZW5kKCgiJWxpYm9tcC1jb21waWxlLWFuZC1ydW4iLCBcCisgICAgIiVjbGFuZyAlY2ZsYWdzICVzIC1vICV0IC1sbSAmJiAldCIpKQorY29uZmlnLnN1YnN0aXR1dGlvbnMuYXBwZW5kKCgiJWNsYW5nIiwgY29uZmlnLnRlc3RfY29tcGlsZXIpKQorY29uZmlnLnN1YnN0aXR1dGlvbnMuYXBwZW5kKCgiJW9wZW5tcF9mbGFnIiwgY29uZmlnLnRlc3Rfb3Blbm1wX2ZsYWcpKQorY29uZmlnLnN1YnN0aXR1dGlvbnMuYXBwZW5kKCgiJWNmbGFncyIsIGNvbmZpZy50ZXN0X2NmbGFncykpCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC9saXQuc2l0ZS5jZmcuaW4gYi9maW5hbC9ydW50aW1lL3Rlc3QvbGl0LnNpdGUuY2ZnLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZGFlYjgKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3QvbGl0LnNpdGUuY2ZnLmluCkBAIC0wLDAgKzEsMTUgQEAKK0BBVVRPX0dFTl9DT01NRU5UQAorCitjb25maWcudGVzdF9jb21waWxlciA9ICJATElCT01QX1RFU1RfQ09NUElMRVJAIgorY29uZmlnLnRlc3Rfb3Blbm1wX2ZsYWcgPSAiQExJQk9NUF9URVNUX09QRU5NUF9GTEFHQCIKK2NvbmZpZy50ZXN0X2V4dHJhX2NmbGFncyA9ICJATElCT01QX1RFU1RfQ0ZMQUdTQCIKK2NvbmZpZy5saWJvbXBfb2JqX3Jvb3QgPSAiQENNQUtFX0NVUlJFTlRfQklOQVJZX0RJUkAiCitjb25maWcubGlicmFyeV9kaXIgPSAiQExJQk9NUF9MSUJSQVJZX0RJUkAiCitjb25maWcub21wX2hlYWRlcl9kaXJlY3RvcnkgPSAiQExJQk9NUF9CSU5BUllfRElSQC9zcmMiCitjb25maWcub3BlcmF0aW5nX3N5c3RlbSA9ICJAQ01BS0VfU1lTVEVNX05BTUVAIgorY29uZmlnLmh3bG9jX2xpYnJhcnlfZGlyID0gIkBMSUJPTVBfSFdMT0NfTElCUkFSWV9ESVJAIgorY29uZmlnLnVzaW5nX2h3bG9jID0gQExJQk9NUF9VU0VfSFdMT0NACisKKyMgTGV0IHRoZSBtYWluIGNvbmZpZyBkbyB0aGUgcmVhbCB3b3JrLgorbGl0X2NvbmZpZy5sb2FkX2NvbmZpZyhjb25maWcsICJATElCT01QX0JBU0VfRElSQC90ZXN0L2xpdC5jZmciKQorCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3QvbG9jay9vbXBfbG9jay5jIGIvZmluYWwvcnVudGltZS90ZXN0L2xvY2svb21wX2xvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjhjNDYxCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L2xvY2svb21wX2xvY2suYwpAQCAtMCwwICsxLDQ1IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK29tcF9sb2NrX3QgbGNrOworCitpbnQgdGVzdF9vbXBfbG9jaygpCit7CisgIGludCBucl90aHJlYWRzX2luX3NpbmdsZSA9IDA7CisgIGludCByZXN1bHQgPSAwOworICBpbnQgbnJfaXRlcmF0aW9ucyA9IDA7CisgIGludCBpOworCisgIG9tcF9pbml0X2xvY2soJmxjayk7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHNoYXJlZChsY2spCisgIHsKKyAgICAjcHJhZ21hIG9tcCBmb3IKKyAgICBmb3IoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykgeworICAgICAgb21wX3NldF9sb2NrKCZsY2spOworICAgICAgI3ByYWdtYSBvbXAgZmx1c2gKKyAgICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlKys7CisgICAgICAjcHJhZ21hIG9tcCBmbHVzaCAgICAgICAKKyAgICAgIG5yX2l0ZXJhdGlvbnMrKzsKKyAgICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlLS07CisgICAgICByZXN1bHQgPSByZXN1bHQgKyBucl90aHJlYWRzX2luX3NpbmdsZTsKKyAgICAgIG9tcF91bnNldF9sb2NrKCZsY2spOworICAgIH0KKyAgfQorICBvbXBfZGVzdHJveV9sb2NrKCZsY2spOworCisgIHJldHVybiAoKHJlc3VsdCA9PSAwKSAmJiAobnJfaXRlcmF0aW9ucyA9PSBMT09QQ09VTlQpKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX2xvY2soKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC9sb2NrL29tcF9uZXN0X2xvY2suYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9sb2NrL29tcF9uZXN0X2xvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWNmNDQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L2xvY2svb21wX25lc3RfbG9jay5jCkBAIC0wLDAgKzEsNDUgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworb21wX25lc3RfbG9ja190IGxjazsKKworaW50IHRlc3Rfb21wX25lc3RfbG9jaygpCit7CisgIGludCBucl90aHJlYWRzX2luX3NpbmdsZSA9IDA7CisgIGludCByZXN1bHQgPSAwOworICBpbnQgbnJfaXRlcmF0aW9ucyA9IDA7CisgIGludCBpOworCisgIG9tcF9pbml0X25lc3RfbG9jaygmbGNrKTsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKGxjaykgIAorICB7CisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspIHsKKyAgICAgIG9tcF9zZXRfbmVzdF9sb2NrKCZsY2spOworICAgICAgI3ByYWdtYSBvbXAgZmx1c2gKKyAgICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlKys7CisgICAgICAjcHJhZ21hIG9tcCBmbHVzaCAgICAgICAKKyAgICAgIG5yX2l0ZXJhdGlvbnMrKzsKKyAgICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlLS07CisgICAgICByZXN1bHQgPSByZXN1bHQgKyBucl90aHJlYWRzX2luX3NpbmdsZTsKKyAgICAgIG9tcF91bnNldF9uZXN0X2xvY2soJmxjayk7CisgICAgfQorICB9CisgIG9tcF9kZXN0cm95X25lc3RfbG9jaygmbGNrKTsKKworICByZXR1cm4gKChyZXN1bHQgPT0gMCkgJiYgKG5yX2l0ZXJhdGlvbnMgPT0gTE9PUENPVU5UKSk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9uZXN0X2xvY2soKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC9sb2NrL29tcF90ZXN0X2xvY2suYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9sb2NrL29tcF90ZXN0X2xvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2FhZTBmCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L2xvY2svb21wX3Rlc3RfbG9jay5jCkBAIC0wLDAgKzEsNDUgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworb21wX2xvY2tfdCBsY2s7CisKK2ludCB0ZXN0X29tcF90ZXN0X2xvY2soKQoreworICBpbnQgbnJfdGhyZWFkc19pbl9zaW5nbGUgPSAwOworICBpbnQgcmVzdWx0ID0gMDsKKyAgaW50IG5yX2l0ZXJhdGlvbnMgPSAwOworICBpbnQgaTsKKworICBvbXBfaW5pdF9sb2NrICgmbGNrKTsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKGxjaykgIAorICB7CisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKSB7CisgICAgICB3aGlsZSAoIW9tcF90ZXN0X2xvY2sgKCZsY2spKQorICAgICAge307CisgICAgICAjcHJhZ21hIG9tcCBmbHVzaAorICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUrKzsKKyAgICAgICNwcmFnbWEgb21wIGZsdXNoICAgICAgIAorICAgICAgbnJfaXRlcmF0aW9ucysrOworICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUtLTsKKyAgICAgIHJlc3VsdCA9IHJlc3VsdCArIG5yX3RocmVhZHNfaW5fc2luZ2xlOworICAgICAgb21wX3Vuc2V0X2xvY2sgKCZsY2spOworICAgIH0KKyAgfQorICBvbXBfZGVzdHJveV9sb2NrKCZsY2spOworICByZXR1cm4gKChyZXN1bHQgPT0gMCkgJiYgKG5yX2l0ZXJhdGlvbnMgPT0gTE9PUENPVU5UKSk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF90ZXN0X2xvY2soKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC9sb2NrL29tcF90ZXN0X25lc3RfbG9jay5jIGIvZmluYWwvcnVudGltZS90ZXN0L2xvY2svb21wX3Rlc3RfbmVzdF9sb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDljNWRkZQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9sb2NrL29tcF90ZXN0X25lc3RfbG9jay5jCkBAIC0wLDAgKzEsNDcgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworc3RhdGljIG9tcF9uZXN0X2xvY2tfdCBsY2s7CisKK2ludCB0ZXN0X29tcF90ZXN0X25lc3RfbG9jaygpCit7CisgIGludCBucl90aHJlYWRzX2luX3NpbmdsZSA9IDA7CisgIGludCByZXN1bHQgPSAwOworICBpbnQgbnJfaXRlcmF0aW9ucyA9IDA7CisgIGludCBpOworCisgIG9tcF9pbml0X25lc3RfbG9jayAoJmxjayk7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHNoYXJlZChsY2spIAorICB7CisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKQorICAgIHsKKyAgICAgIC8qb21wX3NldF9sb2NrKCZsY2spOyovCisgICAgICB3aGlsZSghb21wX3Rlc3RfbmVzdF9sb2NrICgmbGNrKSkKKyAgICAgIHt9OworICAgICAgI3ByYWdtYSBvbXAgZmx1c2gKKyAgICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlKys7CisgICAgICAjcHJhZ21hIG9tcCBmbHVzaCAgICAgICAKKyAgICAgIG5yX2l0ZXJhdGlvbnMrKzsKKyAgICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlLS07CisgICAgICByZXN1bHQgPSByZXN1bHQgKyBucl90aHJlYWRzX2luX3NpbmdsZTsKKyAgICAgIG9tcF91bnNldF9uZXN0X2xvY2sgKCZsY2spOworICAgIH0KKyAgfQorICBvbXBfZGVzdHJveV9uZXN0X2xvY2sgKCZsY2spOworICByZXR1cm4gKChyZXN1bHQgPT0gMCkgJiYgKG5yX2l0ZXJhdGlvbnMgPT0gTE9PUENPVU5UKSk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF90ZXN0X25lc3RfbG9jaygpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L21hc3Rlci9vbXBfbWFzdGVyLmMgYi9maW5hbC9ydW50aW1lL3Rlc3QvbWFzdGVyL29tcF9tYXN0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWM0MmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L21hc3Rlci9vbXBfbWFzdGVyLmMKQEAgLTAsMCArMSwzOCBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgdGVzdF9vbXBfbWFzdGVyKCkKK3sKKyAgaW50IG50aHJlYWRzOworICBpbnQgZXhlY3V0aW5nX3RocmVhZDsKKworICBudGhyZWFkcyA9IDA7CisgIGV4ZWN1dGluZ190aHJlYWQgPSAtMTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgbWFzdGVyIAorICAgIHsKKyAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICB7CisgICAgICAgIG50aHJlYWRzKys7CisgICAgICB9CisgICAgICBleGVjdXRpbmdfdGhyZWFkID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgfSAvKiBlbmQgb2YgbWFzdGVyKi8KKyAgfSAvKiBlbmQgb2YgcGFyYWxsZWwqLworICByZXR1cm4gKChudGhyZWFkcyA9PSAxKSAmJiAoZXhlY3V0aW5nX3RocmVhZCA9PSAwKSk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9tYXN0ZXIoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC9tYXN0ZXIvb21wX21hc3Rlcl8zLmMgYi9maW5hbC9ydW50aW1lL3Rlc3QvbWFzdGVyL29tcF9tYXN0ZXJfMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMTEzMmUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3QvbWFzdGVyL29tcF9tYXN0ZXJfMy5jCkBAIC0wLDAgKzEsNDQgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IHRlc3Rfb21wX21hc3Rlcl8zKCkKK3sKKyAgaW50IG50aHJlYWRzOworICBpbnQgZXhlY3V0aW5nX3RocmVhZDsKKyAgaW50IHRpZF9yZXN1bHQgPSAwOyAvKiBjb3VudHMgdXAgdGhlIG51bWJlciBvZiB3cm9uZyB0aHJlYWQgbm8uIGZvcgorICAgICAgICAgICAgICAgdGhlIG1hc3RlciB0aHJlYWQuIChNdXN0IGJlIDApICovCisgIG50aHJlYWRzID0gMDsKKyAgZXhlY3V0aW5nX3RocmVhZCA9IC0xOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICAjcHJhZ21hIG9tcCBtYXN0ZXIgCisgICAgeworICAgICAgaW50IHRpZCA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgICAgaWYgKHRpZCAhPSAwKSB7CisgICAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICAgIHsgdGlkX3Jlc3VsdCsrOyB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgeworICAgICAgICBudGhyZWFkcysrOworICAgICAgfQorICAgICAgZXhlY3V0aW5nX3RocmVhZCA9IG9tcF9nZXRfdGhyZWFkX251bSAoKTsKKyAgICB9IC8qIGVuZCBvZiBtYXN0ZXIqLworICB9IC8qIGVuZCBvZiBwYXJhbGxlbCovCisgIHJldHVybiAoKG50aHJlYWRzID09IDEpICYmIChleGVjdXRpbmdfdGhyZWFkID09IDApICYmICh0aWRfcmVzdWx0ID09IDApKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX21hc3Rlcl8zKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3Qvb21wX215X3NsZWVwLmggYi9maW5hbC9ydW50aW1lL3Rlc3Qvb21wX215X3NsZWVwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM4ZDkzMAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9vbXBfbXlfc2xlZXAuaApAQCAtMCwwICsxLDMzIEBACisjaWZuZGVmIE1ZX1NMRUVQX0gKKyNkZWZpbmUgTVlfU0xFRVBfSAorCisvKiEgVXRpbGl0eSBmdW5jdGlvbiB0byBoYXZlIGEgc2xlZXAgZnVuY3Rpb24gd2l0aCBiZXR0ZXIgcmVzb2x1dGlvbiBhbmQKKyAqICB3aGljaCBvbmx5IHN0b3BzIG9uZSB0aHJlYWQuICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dGltZS5oPgorCisjaWYgZGVmaW5lZChfV0lOMzIpCisjIGluY2x1ZGUgPHdpbmRvd3MuaD4KKy8vIFdpbmRvd3MgdmVyc2lvbiBvZiBteV9zbGVlcCgpIGZ1bmN0aW9uCitzdGF0aWMgdm9pZCBteV9zbGVlcChkb3VibGUgc2xlZXB0aW1lKSB7CisgIERXT1JEIG1zID0gKERXT1JEKSAoc2xlZXB0aW1lICogMTAwMC4wKTsKKyAgU2xlZXAobXMpOworfQorCisKKyNlbHNlIC8vIF9XSU4zMgorCisvLyBVbmljZXMgdmVyc2lvbiBvZiBteV9zbGVlcCgpIGZ1bmN0aW9uCitzdGF0aWMgdm9pZCBteV9zbGVlcChkb3VibGUgc2xlZXB0aW1lKSB7CisgIHN0cnVjdCB0aW1lc3BlYyB0czsKKyAgdHMudHZfc2VjID0gKHRpbWVfdClzbGVlcHRpbWU7CisgIHRzLnR2X25zZWMgPSAobG9uZykoKHNsZWVwdGltZSAtIChkb3VibGUpdHMudHZfc2VjKSAqIDFFOSk7CisgIG5hbm9zbGVlcCgmdHMsIE5VTEwpOworfQorCisjZW5kaWYgLy8gX1dJTjMyCisKKyNlbmRpZiAvLyBNWV9TTEVFUF9ICmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3Qvb21wX3Rlc3RzdWl0ZS5oIGIvZmluYWwvcnVudGltZS90ZXN0L29tcF90ZXN0c3VpdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjJkZmU2Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L29tcF90ZXN0c3VpdGUuaApAQCAtMCwwICsxLDIyIEBACisvKiBHbG9iYWwgaGVhZGVyZmlsZSBvZiB0aGUgT3Blbk1QIFRlc3RzdWl0ZSAqLworCisjaWZuZGVmIE9NUF9URVNUU1VJVEVfSAorI2RlZmluZSBPTVBfVEVTVFNVSVRFX0gKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b21wLmg+CisKKy8qIEdlbmVyYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIExPT1BDT1VOVCAxMDAwIC8qIE51bWJlciBvZiBpdGVyYXRpb25zIHRvIHNsaXQgYW1vbmdzdCB0aHJlYWRzICovCisjZGVmaW5lIFJFUEVUSVRJT05TIDEwIC8qIE51bWJlciBvZiB0aW1lcyB0byBydW4gZWFjaCB0ZXN0ICovCisKKy8qIGZvbGxvd2luZyB0aW1lcyBhcmUgaW4gc2Vjb25kcyAqLworI2RlZmluZSBTTEVFUFRJTUUgMQorCisvKiBEZWZpbml0aW9ucyBmb3IgdGFza3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBOVU1fVEFTS1MgMjUKKyNkZWZpbmUgTUFYX1RBU0tTX1BFUl9USFJFQUQgNQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC9wYXJhbGxlbC9vbXBfbmVzdGVkLmMgYi9maW5hbC9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX25lc3RlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3M2UwNzIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX25lc3RlZC5jCkBAIC0wLDAgKzEsNDEgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworLyoKKyAqIFRlc3QgaWYgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIG5lc3RlZCBwYXJhbGxlbGlzbQorICogQnkgQ2h1bmh1YSBMaWFvLCBVbml2ZXJzaXR5IG9mIEhvdXN0b24KKyAqIE9jdC4gMjAwNQorICovCitpbnQgdGVzdF9vbXBfbmVzdGVkKCkKK3sKKyAgaW50IGNvdW50ZXIgPSAwOworI2lmZGVmIF9PUEVOTVAKKyAgb21wX3NldF9uZXN0ZWQoMSk7CisjZW5kaWYKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQoY291bnRlcikKKyAgeworICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgY291bnRlcisrOworICAgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgIGNvdW50ZXItLTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIChjb3VudGVyICE9IDApOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfbmVzdGVkKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX3BhcmFsbGVsX2NvcHlpbi5jIGIvZmluYWwvcnVudGltZS90ZXN0L3BhcmFsbGVsL29tcF9wYXJhbGxlbF9jb3B5aW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTQ5MzNiCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3BhcmFsbGVsL29tcF9wYXJhbGxlbF9jb3B5aW4uYwpAQCAtMCwwICsxLDQ3IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK3N0YXRpYyBpbnQgc3VtMSA9IDc4OTsKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoc3VtMSkKKworaW50IHRlc3Rfb21wX3BhcmFsbGVsX2NvcHlpbigpCit7CisgIGludCBzdW0sIG51bV90aHJlYWRzOworICBpbnQga25vd25fc3VtOworCisgIHN1bSA9IDA7CisgIHN1bTEgPSA3OworICBudW1fdGhyZWFkcyA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgY29weWluKHN1bTEpCisgIHsKKyAgICAvKnByaW50Zigic3VtMT0lZFxuIixzdW0xKTsqLworICAgIGludCBpOworICAgICNwcmFnbWEgb21wIGZvciAKKyAgICBmb3IgKGkgPSAxOyBpIDwgMTAwMDsgaSsrKSB7CisgICAgICBzdW0xID0gc3VtMSArIGk7CisgICAgfSAvKmVuZCBvZiBmb3IqLworICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgeworICAgICAgc3VtID0gc3VtICsgc3VtMTsKKyAgICAgIG51bV90aHJlYWRzKys7CisgICAgfSAvKmVuZCBvZiBjcml0aWNhbCovCisgIH0gLyogZW5kIG9mIHBhcmFsbGVsKi8gIAorICBrbm93bl9zdW0gPSAoOTk5ICogMTAwMCkgLyAyICsgNyAqIG51bV90aHJlYWRzOworICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfcGFyYWxsZWxfY29weWluKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX3BhcmFsbGVsX2RlZmF1bHQuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9wYXJhbGxlbC9vbXBfcGFyYWxsZWxfZGVmYXVsdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MWQwZjUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX3BhcmFsbGVsX2RlZmF1bHQuYwpAQCAtMCwwICsxLDQzIEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9kZWZhdWx0KCkKK3sKKyAgaW50IGk7CisgIGludCBzdW07CisgIGludCBteXN1bTsKKyAgaW50IGtub3duX3N1bTsKKyAgc3VtID0wOworICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDIgOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGRlZmF1bHQoc2hhcmVkKSBwcml2YXRlKGkpIHByaXZhdGUobXlzdW0pCisgIHsKKyAgICBteXN1bSA9IDA7CisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yIChpID0gMTsgaSA8PSBMT09QQ09VTlQ7IGkrKykgeworICAgICAgbXlzdW0gPSBteXN1bSArIGk7CisgICAgfSAKKyAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgIHsKKyAgICAgIHN1bSA9IHN1bSArIG15c3VtOworICAgIH0gICAvKiBlbmQgb2YgY3JpdGljYWwgKi8KKyAgfSAgIC8qIGVuZCBvZiBwYXJhbGxlbCAqLworICBpZiAoa25vd25fc3VtICE9IHN1bSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiS05PV05fU1VNID0gJWQ7IFNVTSA9ICVkXG4iLCBrbm93bl9zdW0sIHN1bSk7CisgIH0KKyAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3BhcmFsbGVsX2RlZmF1bHQoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC9wYXJhbGxlbC9vbXBfcGFyYWxsZWxfZmlyc3Rwcml2YXRlLmMgYi9maW5hbC9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX3BhcmFsbGVsX2ZpcnN0cHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NWE4YjcKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX3BhcmFsbGVsX2ZpcnN0cHJpdmF0ZS5jCkBAIC0wLDAgKzEsNDYgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworLy9zdGF0aWMgaW50IHN1bTEgPSA3ODk7CisKK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9maXJzdHByaXZhdGUoKQoreworICBpbnQgc3VtLCBudW1fdGhyZWFkcyxzdW0xOworICBpbnQga25vd25fc3VtOworCisgIHN1bSA9IDA7CisgIHN1bTE9NzsKKyAgbnVtX3RocmVhZHMgPSAwOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZpcnN0cHJpdmF0ZShzdW0xKQorICB7CisgICAgLypwcmludGYoInN1bTE9JWRcbiIsc3VtMSk7Ki8KKyAgICBpbnQgaTsKKyAgICAjcHJhZ21hIG9tcCBmb3IgCisgICAgZm9yIChpID0gMTsgaSA8IDEwMDA7IGkrKykgeworICAgICAgc3VtMSA9IHN1bTEgKyBpOworICAgIH0gLyplbmQgb2YgZm9yKi8KKyAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgIHsKKyAgICAgIHN1bSA9IHN1bSArIHN1bTE7CisgICAgICBudW1fdGhyZWFkcysrOworICAgIH0gLyplbmQgb2YgY3JpdGljYWwqLworICB9IC8qIGVuZCBvZiBwYXJhbGxlbCovICAKKyAga25vd25fc3VtID0gKDk5OSAqIDEwMDApIC8gMiArIDcgKiBudW1fdGhyZWFkczsKKyAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3BhcmFsbGVsX2ZpcnN0cHJpdmF0ZSgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3BhcmFsbGVsL29tcF9wYXJhbGxlbF9pZi5jIGIvZmluYWwvcnVudGltZS90ZXN0L3BhcmFsbGVsL29tcF9wYXJhbGxlbF9pZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNTJmMTEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX3BhcmFsbGVsX2lmLmMKQEAgLTAsMCArMSw0MCBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfaWYoKQoreworICBpbnQgaTsKKyAgaW50IHN1bTsKKyAgaW50IGtub3duX3N1bTsKKyAgaW50IG15c3VtOworICBpbnQgY29udHJvbD0xOworCisgIHN1bSA9MDsKKyAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyIDsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgcHJpdmF0ZShpKSBpZihjb250cm9sPT0wKQorICB7CisgICAgbXlzdW0gPSAwOworICAgIGZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspIHsKKyAgICAgIG15c3VtID0gbXlzdW0gKyBpOworICAgIH0gCisgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICB7CisgICAgICBzdW0gPSBzdW0gKyBteXN1bTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3BhcmFsbGVsX2lmKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX3BhcmFsbGVsX251bV90aHJlYWRzLmMgYi9maW5hbC9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX3BhcmFsbGVsX251bV90aHJlYWRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFmMWY5ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9wYXJhbGxlbC9vbXBfcGFyYWxsZWxfbnVtX3RocmVhZHMuYwpAQCAtMCwwICsxLDQ2IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9udW1fdGhyZWFkcygpCit7CisgIGludCBudW1fZmFpbGVkOworICBpbnQgdGhyZWFkczsKKyAgaW50IG50aHJlYWRzOworICBpbnQgbWF4X3RocmVhZHMgPSAwOworCisgIG51bV9mYWlsZWQgPSAwOworCisgIC8qIGZpcnN0IHdlIGNoZWNrIGhvdyBtYW55IHRocmVhZHMgYXJlIGF2YWlsYWJsZSAqLworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgbWFzdGVyCisgICAgbWF4X3RocmVhZHMgPSBvbXBfZ2V0X251bV90aHJlYWRzICgpOworICB9CisKKyAgLyogd2UgaW5jcmVhc2UgdGhlIG51bWJlciBvZiB0aHJlYWRzIGZyb20gb25lIHRvIG1heGltdW06Ki8KKyAgZm9yKHRocmVhZHMgPSAxOyB0aHJlYWRzIDw9IG1heF90aHJlYWRzOyB0aHJlYWRzKyspIHsKKyAgICBudGhyZWFkcyA9IDA7CisgICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgcmVkdWN0aW9uKCs6bnVtX2ZhaWxlZCkgbnVtX3RocmVhZHModGhyZWFkcykKKyAgICB7CisgICAgICBudW1fZmFpbGVkID0gbnVtX2ZhaWxlZCArICEodGhyZWFkcyA9PSBvbXBfZ2V0X251bV90aHJlYWRzKCkpOworICAgICAgI3ByYWdtYSBvbXAgYXRvbWljCisgICAgICBudGhyZWFkcyArPSAxOworICAgIH0KKyAgICBudW1fZmFpbGVkID0gbnVtX2ZhaWxlZCArICEobnRocmVhZHMgPT0gdGhyZWFkcyk7CisgIH0KKyAgcmV0dXJuICghbnVtX2ZhaWxlZCk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9wYXJhbGxlbF9udW1fdGhyZWFkcygpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3BhcmFsbGVsL29tcF9wYXJhbGxlbF9wcml2YXRlLmMgYi9maW5hbC9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX3BhcmFsbGVsX3ByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGE0N2ExCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3BhcmFsbGVsL29tcF9wYXJhbGxlbF9wcml2YXRlLmMKQEAgLTAsMCArMSw0NiBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisvL3N0YXRpYyBpbnQgc3VtMSA9IDc4OTsKKworaW50IHRlc3Rfb21wX3BhcmFsbGVsX3ByaXZhdGUoKQoreworICBpbnQgc3VtLCBudW1fdGhyZWFkcyxzdW0xOworICBpbnQga25vd25fc3VtOworCisgIHN1bSA9IDA7CisgIG51bV90aHJlYWRzID0gMDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBwcml2YXRlKHN1bTEpCisgIHsKKyAgICBpbnQgaTsKKyAgICBzdW0xID0gNzsKKyAgICAvKnByaW50Zigic3VtMT0lZFxuIixzdW0xKTsqLworICAgICNwcmFnbWEgb21wIGZvciAKKyAgICBmb3IgKGkgPSAxOyBpIDwgMTAwMDsgaSsrKSB7CisgICAgICBzdW0xID0gc3VtMSArIGk7CisgICAgfQorICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgeworICAgICAgc3VtID0gc3VtICsgc3VtMTsKKyAgICAgIG51bV90aHJlYWRzKys7CisgICAgfQorICB9CisgIGtub3duX3N1bSA9ICg5OTkgKiAxMDAwKSAvIDIgKyA3ICogbnVtX3RocmVhZHM7CisgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9wYXJhbGxlbF9wcml2YXRlKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX3BhcmFsbGVsX3JlZHVjdGlvbi5jIGIvZmluYWwvcnVudGltZS90ZXN0L3BhcmFsbGVsL29tcF9wYXJhbGxlbF9yZWR1Y3Rpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjc4M2YyCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3BhcmFsbGVsL29tcF9wYXJhbGxlbF9yZWR1Y3Rpb24uYwpAQCAtMCwwICsxLDI1NCBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworI2RlZmluZSBET1VCTEVfRElHSVRTIDIwICAgIC8qIGR0XkRPVUJMRV9ESUdJVFMgKi8KKyNkZWZpbmUgTUFYX0ZBQ1RPUiAxMAorI2RlZmluZSBLTk9XTl9QUk9EVUNUIDM2Mjg4MDAgIC8qIDEwISAqLworCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfcmVkdWN0aW9uKCkKK3sKKyAgaW50IHN1bTsKKyAgaW50IGtub3duX3N1bTsKKyAgZG91YmxlIGRzdW07CisgIGRvdWJsZSBka25vd25fc3VtOworICBkb3VibGUgZHQ9MC41OyAvKiBiYXNlIG9mIGdlb21ldHJpYyByb3cgZm9yICsgYW5kIC0gdGVzdCovCisgIGRvdWJsZSByb3VuZGluZ19lcnJvcj0gMS5FLTk7CisgIGludCBkaWZmOworICBkb3VibGUgZGRpZmY7CisgIGludCBwcm9kdWN0OworICBpbnQga25vd25fcHJvZHVjdDsKKyAgaW50IGxvZ2ljX2FuZDsKKyAgaW50IGxvZ2ljX29yOworICBpbnQgYml0X2FuZDsKKyAgaW50IGJpdF9vcjsKKyAgaW50IGV4Y2x1c2l2X2JpdF9vcjsKKyAgaW50IGxvZ2ljc1tMT09QQ09VTlRdOworICBpbnQgaTsKKyAgZG91YmxlIGRwdDsKKyAgaW50IHJlc3VsdDsKKworICBzdW0gPTA7CisgIGRzdW09MDsKKyAgcHJvZHVjdD0xOworICBsb2dpY19hbmQ9MTsKKyAgbG9naWNfb3I9MDsKKyAgYml0X2FuZD0xOworICBiaXRfb3I9MDsKKyAgZXhjbHVzaXZfYml0X29yPTA7CisgIHJlc3VsdD0wOworICBkdCA9IDEuLzMuOworICBrbm93bl9zdW0gPSAoTE9PUENPVU5UKihMT09QQ09VTlQrMSkpLzI7CisKKyAgLyogVGVzdHMgZm9yIGludGVnZXJzICovCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgcmVkdWN0aW9uKCs6c3VtKQorICBmb3IgKGk9MTtpPD1MT09QQ09VTlQ7aSsrKSB7CisgICAgc3VtPXN1bStpOworICB9CisKKyAgaWYoa25vd25fc3VtIT1zdW0pIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gc3VtIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAlZFxuIixzdW0sa25vd25fc3VtKTsgCisgIH0KKworICBkaWZmID0gKExPT1BDT1VOVCooTE9PUENPVU5UKzEpKS8yOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIHJlZHVjdGlvbigtOmRpZmYpCisgIGZvciAoaT0xO2k8PUxPT1BDT1VOVDsrK2kpIHsKKyAgICBkaWZmPWRpZmYtaTsKKyAgfQorCisgIGlmKGRpZmYgIT0gMCkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBkaWZmZXJlbmNlIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAwLlxuIixkaWZmKTsKKyAgfQorCisgIC8qIFRlc3RzIGZvciBkb3VibGVzICovCisgIGRzdW09MDsKKyAgZHB0PTE7CisgIGZvciAoaT0wO2k8RE9VQkxFX0RJR0lUUzsrK2kpIHsKKyAgICBkcHQqPWR0OworICB9CisgIGRrbm93bl9zdW0gPSAoMS1kcHQpLygxLWR0KTsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSByZWR1Y3Rpb24oKzpkc3VtKQorICBmb3IgKGk9MDtpPERPVUJMRV9ESUdJVFM7KytpKSB7CisgICAgZHN1bSArPSBwb3coZHQsaSk7CisgIH0KKworICBpZiggZmFicyhkc3VtLWRrbm93bl9zdW0pID4gcm91bmRpbmdfZXJyb3IgKSB7CisgICAgcmVzdWx0Kys7IAorICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBzdW0gd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICVmIGluc3RlYWQgb2YgJWYgKERpZmZlcmVuY2U6ICVFKVxuIixkc3VtLGRrbm93bl9zdW0sIGRzdW0tZGtub3duX3N1bSk7CisgIH0KKworICBkcHQ9MTsKKworICBmb3IgKGk9MDtpPERPVUJMRV9ESUdJVFM7KytpKSB7CisgICAgZHB0Kj1kdDsKKyAgfQorICBmcHJpbnRmKHN0ZGVyciwiXG4iKTsKKyAgZGRpZmYgPSAoMS1kcHQpLygxLWR0KTsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSByZWR1Y3Rpb24oLTpkZGlmZikKKyAgZm9yIChpPTA7aTxET1VCTEVfRElHSVRTOysraSkgeworICAgIGRkaWZmIC09IHBvdyhkdCxpKTsKKyAgfQorICBpZiggZmFicyhkZGlmZikgPiByb3VuZGluZ19lcnJvcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBEaWZmZXJlbmNlIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlRSBpbnN0ZWFkIG9mIDAuMFxuIixkZGlmZik7CisgIH0KKworICAvKiBUZXN0cyBmb3IgcHJvZHVjdCBvZiBpbnRlZ2VycyAqLworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIHJlZHVjdGlvbigqOnByb2R1Y3QpCisgIGZvcihpPTE7aTw9TUFYX0ZBQ1RPUjtpKyspIHsKKyAgICBwcm9kdWN0ICo9IGk7CisgIH0KKworICBrbm93bl9wcm9kdWN0ID0gS05PV05fUFJPRFVDVDsKKyAgaWYoa25vd25fcHJvZHVjdCAhPSBwcm9kdWN0KSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIFByb2R1Y3Qgd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mICVkXG5cbiIscHJvZHVjdCxrbm93bl9wcm9kdWN0KTsKKyAgfQorCisgIC8qIFRlc3RzIGZvciBsb2dpY2FsIGFuZCAqLworICBmb3IoaT0wO2k8TE9PUENPVU5UO2krKykgeworICAgIGxvZ2ljc1tpXT0xOworICB9CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSByZWR1Y3Rpb24oJiY6bG9naWNfYW5kKQorICBmb3IoaT0wO2k8TE9PUENPVU5UOysraSkgeworICAgIGxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKyAgfQorICBpZighbG9naWNfYW5kKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDEuXG4iKTsKKyAgfQorCisgIGxvZ2ljX2FuZCA9IDE7CisgIGxvZ2ljc1tMT09QQ09VTlQvMl09MDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIHJlZHVjdGlvbigmJjpsb2dpY19hbmQpCisgIGZvcihpPTA7aTxMT09QQ09VTlQ7KytpKSB7CisgICAgbG9naWNfYW5kID0gbG9naWNfYW5kICYmIGxvZ2ljc1tpXTsKKyAgfQorICBpZihsb2dpY19hbmQpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gbG9naWMgQU5EIHBhcnQgMi5cbiIpOworICB9CisKKyAgLyogVGVzdHMgZm9yIGxvZ2ljYWwgb3IgKi8KKyAgZm9yKGk9MDtpPExPT1BDT1VOVDtpKyspIHsKKyAgICBsb2dpY3NbaV09MDsKKyAgfQorCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgcmVkdWN0aW9uKHx8OmxvZ2ljX29yKQorICBmb3IoaT0wO2k8TE9PUENPVU5UOysraSkgeworICAgIGxvZ2ljX29yID0gbG9naWNfb3IgfHwgbG9naWNzW2ldOworICB9CisgIGlmKGxvZ2ljX29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMS5cbiIpOworICB9CisgIGxvZ2ljX29yID0gMDsKKyAgbG9naWNzW0xPT1BDT1VOVC8yXT0xOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgcmVkdWN0aW9uKHx8OmxvZ2ljX29yKQorICBmb3IoaT0wO2k8TE9PUENPVU5UOysraSkgeworICAgIGxvZ2ljX29yID0gbG9naWNfb3IgfHwgbG9naWNzW2ldOworICB9CisgIGlmKCFsb2dpY19vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDIuXG4iKTsKKyAgfQorCisgIC8qIFRlc3RzIGZvciBiaXR3aXNlIGFuZCAqLworICBmb3IoaT0wO2k8TE9PUENPVU5UOysraSkgeworICAgIGxvZ2ljc1tpXT0xOworICB9CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSByZWR1Y3Rpb24oJjpiaXRfYW5kKQorICBmb3IoaT0wO2k8TE9PUENPVU5UOysraSkgeworICAgIGJpdF9hbmQgPSAoYml0X2FuZCAmIGxvZ2ljc1tpXSk7CisgIH0KKyAgaWYoIWJpdF9hbmQpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDEuXG4iKTsKKyAgfQorCisgIGJpdF9hbmQgPSAxOworICBsb2dpY3NbTE9PUENPVU5ULzJdPTA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSByZWR1Y3Rpb24oJjpiaXRfYW5kKQorICBmb3IoaT0wO2k8TE9PUENPVU5UOysraSkgeworICAgIGJpdF9hbmQgPSBiaXRfYW5kICYgbG9naWNzW2ldOworICB9CisgIGlmKGJpdF9hbmQpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDIuXG4iKTsKKyAgfQorCisgIGZvcihpPTA7aTxMT09QQ09VTlQ7aSsrKSB7CisgICAgbG9naWNzW2ldPTA7CisgIH0KKworICAvKiBUZXN0cyBmb3IgYml0d2lzZSBvciAqLworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIHJlZHVjdGlvbih8OmJpdF9vcikKKyAgZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpIHsKKyAgICBiaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisgIH0KKyAgaWYoYml0X29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIEJJVCBPUiBwYXJ0IDFcbiIpOworICB9CisgIGJpdF9vciA9IDA7CisgIGxvZ2ljc1tMT09QQ09VTlQvMl09MTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIHJlZHVjdGlvbih8OmJpdF9vcikKKyAgZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpIHsKKyAgICBiaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisgIH0KKyAgaWYoIWJpdF9vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBCSVQgT1IgcGFydCAyXG4iKTsKKyAgfQorCisgIGZvcihpPTA7aTxMT09QQ09VTlQ7aSsrKSB7CisgICAgbG9naWNzW2ldPTA7CisgIH0KKworICAvKiBUZXN0cyBmb3IgYml0d2lzZSB4b3IgKi8KKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSByZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpCisgIGZvcihpPTA7aTxMT09QQ09VTlQ7KytpKSB7CisgICAgZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworICB9CisgIGlmKGV4Y2x1c2l2X2JpdF9vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAxXG4iKTsKKyAgfQorCisgIGV4Y2x1c2l2X2JpdF9vciA9IDA7CisgIGxvZ2ljc1tMT09QQ09VTlQvMl09MTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIHJlZHVjdGlvbiheOmV4Y2x1c2l2X2JpdF9vcikKKyAgZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpIHsKKyAgICBleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisgIH0KKyAgaWYoIWV4Y2x1c2l2X2JpdF9vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAyXG4iKTsKKyAgfQorCisgIC8qcHJpbnRmKCJcblJlc3VsdDolZFxuIixyZXN1bHQpOyovCisgIHJldHVybiAocmVzdWx0PT0wKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3BhcmFsbGVsX3JlZHVjdGlvbigpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3BhcmFsbGVsL29tcF9wYXJhbGxlbF9zaGFyZWQuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9wYXJhbGxlbC9vbXBfcGFyYWxsZWxfc2hhcmVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZhMzcwNgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9wYXJhbGxlbC9vbXBfcGFyYWxsZWxfc2hhcmVkLmMKQEAgLTAsMCArMSw0NiBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfc2hhcmVkKCkKK3sKKyAgaW50IGk7CisgIGludCBzdW07CisgIGludCBrbm93bl9zdW07CisKKyAgc3VtID0gMDsKKyAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyIDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBwcml2YXRlKGkpIHNoYXJlZChzdW0pIAorICB7CisKKyAgICBpbnQgbXlzdW0gPSAwOworICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspIHsKKyAgICAgIG15c3VtID0gbXlzdW0gKyBpOworICAgIH0gCisgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICB7CisgICAgICBzdW0gPSBzdW0gKyBteXN1bTsKKyAgICB9CisKKworICB9CisgIGlmIChrbm93bl9zdW0gIT0gc3VtKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJLTk9XTl9TVU0gPSAlZDsgU1VNID0gJWRcbiIsIGtub3duX3N1bSwgc3VtKTsKKyAgfQorICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfcGFyYWxsZWxfc2hhcmVkKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3QvdGFza2luZy9vbXBfdGFzay5jIGIvZmluYWwvcnVudGltZS90ZXN0L3Rhc2tpbmcvb21wX3Rhc2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmUyOGFhCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3Rhc2tpbmcvb21wX3Rhc2suYwpAQCAtMCwwICsxLDUyIEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCitpbnQgdGVzdF9vbXBfdGFzaygpCit7CisgIGludCB0aWRzW05VTV9UQVNLU107CisgIGludCBpOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIAorICB7CisgICAgI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgeworICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9UQVNLUzsgaSsrKSB7CisgICAgICAgIC8qIEZpcnN0IHdlIGhhdmUgdG8gc3RvcmUgdGhlIHZhbHVlIG9mIHRoZSBsb29wIGluZGV4IGluIGEgbmV3IHZhcmlhYmxlCisgICAgICAgICAqIHdoaWNoIHdpbGwgYmUgcHJpdmF0ZSBmb3IgZWFjaCB0YXNrIGJlY2F1c2Ugb3RoZXJ3aXNlIGl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4KKyAgICAgICAgICogaWYgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgdGFzayB0YWtlcyBsb25nZXIgdGhhbiB0aGUgdGltZSB3aGljaCBpcyBuZWVkZWQgdG8gCisgICAgICAgICAqIGVudGVyIHRoZSBuZXh0IHN0ZXAgb2YgdGhlIGxvb3AhCisgICAgICAgICAqLworICAgICAgICBpbnQgbXlpOworICAgICAgICBteWkgPSBpOworICAgICAgICAjcHJhZ21hIG9tcCB0YXNrCisgICAgICAgIHsKKyAgICAgICAgICBteV9zbGVlcCAoU0xFRVBUSU1FKTsKKyAgICAgICAgICB0aWRzW215aV0gPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKyAgICAgICAgfSAvKiBlbmQgb2Ygb21wIHRhc2sgKi8KKyAgICAgIH0gLyogZW5kIG9mIGZvciAqLworICAgIH0gLyogZW5kIG9mIHNpbmdsZSAqLworICB9IC8qZW5kIG9mIHBhcmFsbGVsICovCisKKyAgLyogTm93IHdlIGNrZWNrIGlmIG1vcmUgdGhhbiBvbmUgdGhyZWFkIGV4ZWN1dGVkIHRoZSB0YXNrcy4gKi8KKyAgZm9yIChpID0gMTsgaSA8IE5VTV9UQVNLUzsgaSsrKSB7CisgICAgaWYgKHRpZHNbMF0gIT0gdGlkc1tpXSkKKyAgICAgIHJldHVybiAxOworICB9CisgIHJldHVybiAwOworfSAvKiBlbmQgb2YgY2hlY2tfcGFyYWxsZWxfZm9yX3ByaXZhdGUgKi8KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3Rhc2soKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC90YXNraW5nL29tcF90YXNrX2ZpbmFsLmMgYi9maW5hbC9ydW50aW1lL3Rlc3QvdGFza2luZy9vbXBfdGFza19maW5hbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmOTZiMzcKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3QvdGFza2luZy9vbXBfdGFza19maW5hbC5jCkBAIC0wLDAgKzEsNjUgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKK2ludCB0ZXN0X29tcF90YXNrX2ZpbmFsKCkKK3sKKyAgaW50IHRpZHNbTlVNX1RBU0tTXTsKKyAgaW50IGluY2x1ZGVkdGlkc1tOVU1fVEFTS1NdOworICBpbnQgaTsKKyAgaW50IGVycm9yID0gMDsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1RBU0tTOyBpKyspIHsKKyAgICAgICAgLyogRmlyc3Qgd2UgaGF2ZSB0byBzdG9yZSB0aGUgdmFsdWUgb2YgdGhlIGxvb3AgaW5kZXggaW4gYSBuZXcgdmFyaWFibGUKKyAgICAgICAgICogd2hpY2ggd2lsbCBiZSBwcml2YXRlIGZvciBlYWNoIHRhc2sgYmVjYXVzZSBvdGhlcndpc2UgaXQgd2lsbCBiZSBvdmVyd3JpdHRlbgorICAgICAgICAgKiBpZiB0aGUgZXhlY3V0aW9uIG9mIHRoZSB0YXNrIHRha2VzIGxvbmdlciB0aGFuIHRoZSB0aW1lIHdoaWNoIGlzIG5lZWRlZCB0byAKKyAgICAgICAgICogZW50ZXIgdGhlIG5leHQgc3RlcCBvZiB0aGUgbG9vcCEKKyAgICAgICAgICovCisgICAgICAgIGludCBteWk7CisgICAgICAgIG15aSA9IGk7CisKKyAgICAgICAgI3ByYWdtYSBvbXAgdGFzayBmaW5hbChpPj0xMCkKKyAgICAgICAgeworICAgICAgICAgIHRpZHNbbXlpXSA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgICAgICAgIC8qIHdlIGdlbmVyYXRlIGluY2x1ZGVkIHRhc2tzIGZvciBmaW5hbCB0YXNrcyAqLworICAgICAgICAgIGlmKG15aSA+PSAxMCkgeworICAgICAgICAgICAgaW50IGluY2x1ZGVkID0gbXlpOworICAgICAgICAgICAgI3ByYWdtYSBvbXAgdGFzaworICAgICAgICAgICAgeworICAgICAgICAgICAgICBteV9zbGVlcCAoU0xFRVBUSU1FKTsKKyAgICAgICAgICAgICAgaW5jbHVkZWR0aWRzW2luY2x1ZGVkXSA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgICAgICAgICAgfSAvKiBlbmQgb2Ygb21wIGluY2x1ZGVkIHRhc2sgb2YgdGhlIGZpbmFsIHRhc2sgKi8KKyAgICAgICAgICAgIG15X3NsZWVwIChTTEVFUFRJTUUpOworICAgICAgICAgIH0gLyogZW5kIG9mIGlmIGl0IGlzIGEgZmluYWwgdGFzayovCisgICAgICAgIH0gLyogZW5kIG9mIG9tcCB0YXNrICovCisgICAgICB9IC8qIGVuZCBvZiBmb3IgKi8KKyAgICB9IC8qIGVuZCBvZiBzaW5nbGUgKi8KKyAgfSAvKmVuZCBvZiBwYXJhbGxlbCAqLworCisgIC8qIE5vdyB3ZSBja2VjayBpZiBtb3JlIHRoYW4gb25lIHRocmVhZCBleGVjdXRlZCB0aGUgZmluYWwgdGFzayBhbmQgaXRzIGluY2x1ZGVkIHRhc2suICovCisgIGZvciAoaSA9IDEwOyBpIDwgTlVNX1RBU0tTOyBpKyspIHsKKyAgICBpZiAodGlkc1tpXSAhPSBpbmNsdWRlZHRpZHNbaV0pIHsKKyAgICAgIGVycm9yKys7CisgICAgfQorICB9CisgIHJldHVybiAoZXJyb3I9PTApOworfSAvKiBlbmQgb2YgY2hlY2tfcGFyYWxlbF9mb3JfcHJpdmF0ZSAqLworCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfdGFza19maW5hbCgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQorCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3QvdGFza2luZy9vbXBfdGFza19maXJzdHByaXZhdGUuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC90YXNraW5nL29tcF90YXNrX2ZpcnN0cHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZjRkMjMKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3QvdGFza2luZy9vbXBfdGFza19maXJzdHByaXZhdGUuYwpAQCAtMCwwICsxLDUxIEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgdGVzdF9vbXBfdGFza19maXJzdHByaXZhdGUoKQoreworICBpbnQgaTsKKyAgaW50IHN1bSA9IDEyMzQ7CisgIGludCBrbm93bl9zdW07CisgIGludCByZXN1bHQgPSAwOyAvKiBjb3VudHMgdGhlIHdyb25nIHN1bXMgZnJvbSB0YXNrcyAqLworCisgIGtub3duX3N1bSA9IDEyMzQgKyAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIHNpbmdsZQorICAgIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVEFTS1M7IGkrKykgeworICAgICAgICAjcHJhZ21hIG9tcCB0YXNrIGZpcnN0cHJpdmF0ZShzdW0pCisgICAgICAgIHsKKyAgICAgICAgICBpbnQgajsKKyAgICAgICAgICBmb3IgKGogPSAwOyBqIDw9IExPT1BDT1VOVDsgaisrKSB7CisgICAgICAgICAgICAjcHJhZ21hIG9tcCBmbHVzaAorICAgICAgICAgICAgc3VtICs9IGo7CisgICAgICAgICAgfQorCisgICAgICAgICAgLyogY2hlY2sgaWYgY2FsY3VsYXRlZCBzdW0gd2FzIHJpZ2h0ICovCisgICAgICAgICAgaWYgKHN1bSAhPSBrbm93bl9zdW0pIHsKKyAgICAgICAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsIAorICAgICAgICAgICAgeyByZXN1bHQrKzsgfQorICAgICAgICAgIH0KKyAgICAgICAgfSAvKiBvbXAgdGFzayAqLworICAgICAgfSAvKiBmb3IgbG9vcCAqLworICAgIH0gLyogb21wIHNpbmdsZSAqLworICB9IC8qIG9tcCBwYXJhbGxlbCAqLworICByZXR1cm4gKHJlc3VsdCA9PSAwKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3Rhc2tfZmlyc3Rwcml2YXRlKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3QvdGFza2luZy9vbXBfdGFza19pZi5jIGIvZmluYWwvcnVudGltZS90ZXN0L3Rhc2tpbmcvb21wX3Rhc2tfaWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmI3NTI1Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3Rhc2tpbmcvb21wX3Rhc2tfaWYuYwpAQCAtMCwwICsxLDQzIEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCitpbnQgdGVzdF9vbXBfdGFza19pZigpCit7CisgIGludCBjb25kaXRpb25fZmFsc2U7CisgIGludCBjb3VudDsKKyAgaW50IHJlc3VsdDsKKworICBjb3VudD0wOworICBjb25kaXRpb25fZmFsc2UgPSAoY291bnQgPT0gMSk7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIAorICB7CisgICAgI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgeworICAgICAgI3ByYWdtYSBvbXAgdGFzayBpZiAoY29uZGl0aW9uX2ZhbHNlKSBzaGFyZWQoY291bnQsIHJlc3VsdCkKKyAgICAgIHsKKyAgICAgICAgbXlfc2xlZXAgKFNMRUVQVElNRSk7CisgICAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICAgIHJlc3VsdCA9ICgwID09IGNvdW50KTsKKyAgICAgIH0gLyogZW5kIG9mIG9tcCB0YXNrICovCisgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgY291bnQgPSAxOworICAgIH0gLyogZW5kIG9mIHNpbmdsZSAqLworICB9IC8qZW5kIG9mIHBhcmFsbGVsICovCisgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF90YXNrX2lmKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3QvdGFza2luZy9vbXBfdGFza19pbXBfZmlyc3Rwcml2YXRlLmMgYi9maW5hbC9ydW50aW1lL3Rlc3QvdGFza2luZy9vbXBfdGFza19pbXBfZmlyc3Rwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA1YWI5YQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC90YXNraW5nL29tcF90YXNrX2ltcF9maXJzdHByaXZhdGUuYwpAQCAtMCwwICsxLDQ3IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisvKiBVdGlsaXR5IGZ1bmN0aW9uIGRvIHNwZW5kIHNvbWUgdGltZSBpbiBhIGxvb3AgKi8KK2ludCB0ZXN0X29tcF90YXNrX2ltcF9maXJzdHByaXZhdGUoKQoreworICBpbnQgaT01OworICBpbnQgayA9IDA7CisgIGludCByZXN1bHQgPSAwOworICBpbnQgdGFza19yZXN1bHQgPSAxOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmaXJzdHByaXZhdGUoaSkKKyAgeworICAgICNwcmFnbWEgb21wIHNpbmdsZQorICAgIHsKKyAgICAgIGZvciAoayA9IDA7IGsgPCBOVU1fVEFTS1M7IGsrKykgeworICAgICAgICAjcHJhZ21hIG9tcCB0YXNrIHNoYXJlZChyZXN1bHQgLCB0YXNrX3Jlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgIGludCBqOworICAgICAgICAgIC8vY2hlY2sgaWYgaSBpcyBwcml2YXRlCisgICAgICAgICAgaWYoaSAhPSA1KQorICAgICAgICAgICAgdGFza19yZXN1bHQgPSAwOworICAgICAgICAgIGZvcihqID0gMDsgaiA8IE5VTV9UQVNLUzsgaisrKQorICAgICAgICAgICAgaSsrOworICAgICAgICAgIC8vdGhpcyBzaG91bGQgYmUgZmlyc3Rwcml2YXRlIGltcGxpY2l0bHkKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgdGFza3dhaXQKKyAgICAgIHJlc3VsdCA9ICh0YXNrX3Jlc3VsdCAmJiBpPT01KTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3Rhc2tfaW1wX2ZpcnN0cHJpdmF0ZSgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3Rhc2tpbmcvb21wX3Rhc2tfcHJpdmF0ZS5jIGIvZmluYWwvcnVudGltZS90ZXN0L3Rhc2tpbmcvb21wX3Rhc2tfcHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMTY0NDcKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3QvdGFza2luZy9vbXBfdGFza19wcml2YXRlLmMKQEAgLTAsMCArMSw1MyBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworLyogVXRpbGl0eSBmdW5jdGlvbiBkbyBzcGVuZCBzb21lIHRpbWUgaW4gYSBsb29wICovCitpbnQgdGVzdF9vbXBfdGFza19wcml2YXRlKCkKK3sKKyAgaW50IGk7CisgIGludCBrbm93bl9zdW07CisgIGludCBzdW0gPSAwOworICBpbnQgcmVzdWx0ID0gMDsgLyogY291bnRzIHRoZSB3cm9uZyBzdW1zIGZyb20gdGFza3MgKi8KKworICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIHNpbmdsZQorICAgIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVEFTS1M7IGkrKykgeworICAgICAgICAjcHJhZ21hIG9tcCB0YXNrIHByaXZhdGUoc3VtKSBzaGFyZWQocmVzdWx0LCBrbm93bl9zdW0pCisgICAgICAgIHsKKyAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAvL2lmIHN1bSBpcyBwcml2YXRlLCBpbml0aWFsaXplIHRvIDAKKyAgICAgICAgICBzdW0gPSAwOworICAgICAgICAgIGZvciAoaiA9IDA7IGogPD0gTE9PUENPVU5UOyBqKyspIHsKKyAgICAgICAgICAgICNwcmFnbWEgb21wIGZsdXNoCisgICAgICAgICAgICBzdW0gKz0gajsKKyAgICAgICAgICB9CisgICAgICAgICAgLyogY2hlY2sgaWYgY2FsY3VsYXRlZCBzdW0gd2FzIHJpZ2h0ICovCisgICAgICAgICAgaWYgKHN1bSAhPSBrbm93bl9zdW0pIHsKKyAgICAgICAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsIAorICAgICAgICAgICAgcmVzdWx0Kys7CisgICAgICAgICAgfQorICAgICAgICB9IC8qIGVuZCBvZiBvbXAgdGFzayAqLworICAgICAgfSAvKiBlbmQgb2YgZm9yICovCisgICAgfSAvKiBlbmQgb2Ygc2luZ2xlICovCisgIH0gLyogZW5kIG9mIHBhcmFsbGVsKi8KKyAgcmV0dXJuIChyZXN1bHQgPT0gMCk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF90YXNrX3ByaXZhdGUoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC90YXNraW5nL29tcF90YXNrX3NoYXJlZC5jIGIvZmluYWwvcnVudGltZS90ZXN0L3Rhc2tpbmcvb21wX3Rhc2tfc2hhcmVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMwNDAyNgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC90YXNraW5nL29tcF90YXNrX3NoYXJlZC5jCkBAIC0wLDAgKzEsNDEgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKy8qIFV0aWxpdHkgZnVuY3Rpb24gZG8gc3BlbmQgc29tZSB0aW1lIGluIGEgbG9vcCAqLworaW50IHRlc3Rfb21wX3Rhc2tfaW1wX3NoYXJlZCgpCit7CisgIGludCBpOworICBpbnQgayA9IDA7CisgIGludCByZXN1bHQgPSAwOworICBpPTA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIHNpbmdsZQorICAgIGZvciAoayA9IDA7IGsgPCBOVU1fVEFTS1M7IGsrKykgeworICAgICAgI3ByYWdtYSBvbXAgdGFzayBzaGFyZWQoaSkKKyAgICAgIHsKKyAgICAgICAgI3ByYWdtYSBvbXAgYXRvbWljCisgICAgICAgIGkrKzsKKyAgICAgICAgLy90aGlzIHNob3VsZCBiZSBzaGFyZWQgaW1wbGljaXRseQorICAgICAgfQorICAgIH0KKyAgfQorICByZXN1bHQgPSBpOworICByZXR1cm4gKChyZXN1bHQgPT0gTlVNX1RBU0tTKSk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF90YXNrX2ltcF9zaGFyZWQoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC90YXNraW5nL29tcF90YXNrd2FpdC5jIGIvZmluYWwvcnVudGltZS90ZXN0L3Rhc2tpbmcvb21wX3Rhc2t3YWl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRjYWE3NwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC90YXNraW5nL29tcF90YXNrd2FpdC5jCkBAIC0wLDAgKzEsNzQgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKK2ludCB0ZXN0X29tcF90YXNrd2FpdCgpCit7CisgIGludCByZXN1bHQxID0gMDsgICAvKiBTdG9yZXMgbnVtYmVyIG9mIG5vdCBmaW5pc2hlZCB0YXNrcyBhZnRlciB0aGUgdGFza3dhaXQgKi8KKyAgaW50IHJlc3VsdDIgPSAwOyAgIC8qIFN0b3JlcyBudW1iZXIgb2Ygd3JvbmcgYXJyYXkgZWxlbWVudHMgYXQgdGhlIGVuZCAqLworICBpbnQgYXJyYXlbTlVNX1RBU0tTXTsKKyAgaW50IGk7CisKKyAgLyogZmlsbCBhcnJheSAqLworICBmb3IgKGkgPSAwOyBpIDwgTlVNX1RBU0tTOyBpKyspIAorICAgIGFycmF5W2ldID0gMDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgeworICAgICNwcmFnbWEgb21wIHNpbmdsZQorICAgIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVEFTS1M7IGkrKykgeworICAgICAgICAvKiBGaXJzdCB3ZSBoYXZlIHRvIHN0b3JlIHRoZSB2YWx1ZSBvZiB0aGUgbG9vcCBpbmRleCBpbiBhIG5ldyB2YXJpYWJsZQorICAgICAgICAgKiB3aGljaCB3aWxsIGJlIHByaXZhdGUgZm9yIGVhY2ggdGFzayBiZWNhdXNlIG90aGVyd2lzZSBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuCisgICAgICAgICAqIGlmIHRoZSBleGVjdXRpb24gb2YgdGhlIHRhc2sgdGFrZXMgbG9uZ2VyIHRoYW4gdGhlIHRpbWUgd2hpY2ggaXMgbmVlZGVkIHRvIAorICAgICAgICAgKiBlbnRlciB0aGUgbmV4dCBzdGVwIG9mIHRoZSBsb29wIQorICAgICAgICAgKi8KKyAgICAgICAgaW50IG15aTsKKyAgICAgICAgbXlpID0gaTsKKyAgICAgICAgI3ByYWdtYSBvbXAgdGFzaworICAgICAgICB7CisgICAgICAgICAgbXlfc2xlZXAgKFNMRUVQVElNRSk7CisgICAgICAgICAgYXJyYXlbbXlpXSA9IDE7CisgICAgICAgIH0gLyogZW5kIG9mIG9tcCB0YXNrICovCisgICAgICB9IC8qIGVuZCBvZiBmb3IgKi8KKyAgICAgICNwcmFnbWEgb21wIHRhc2t3YWl0CisgICAgICAvKiBjaGVjayBpZiBhbGwgdGFza3Mgd2VyZSBmaW5pc2hlZCAqLworICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9UQVNLUzsgaSsrKSAKKyAgICAgICAgaWYgKGFycmF5W2ldICE9IDEpCisgICAgICAgICAgcmVzdWx0MSsrOworCisgICAgICAvKiBnZW5lcmF0ZSBzb21lIG1vcmUgdGFza3Mgd2hpY2ggbm93IHNoYWxsIG92ZXJ3cml0ZSAKKyAgICAgICAqIHRoZSB2YWx1ZXMgaW4gdGhlIHRpZHMgYXJyYXkgKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVEFTS1M7IGkrKykgeworICAgICAgICBpbnQgbXlpOworICAgICAgICBteWkgPSBpOworICAgICAgICAjcHJhZ21hIG9tcCB0YXNrCisgICAgICAgIHsKKyAgICAgICAgICBhcnJheVtteWldID0gMjsKKyAgICAgICAgfSAvKiBlbmQgb2Ygb21wIHRhc2sgKi8KKyAgICAgIH0gLyogZW5kIG9mIGZvciAqLworICAgIH0gLyogZW5kIG9mIHNpbmdsZSAqLworICB9IC8qZW5kIG9mIHBhcmFsbGVsICovCisKKyAgLyogZmluYWwgY2hlY2ssIGlmIGFsbCBhcnJheSBlbGVtZW50cyBjb250YWluIHRoZSByaWdodCB2YWx1ZXM6ICovCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fVEFTS1M7IGkrKykgeworICAgIGlmIChhcnJheVtpXSAhPSAyKQorICAgICAgcmVzdWx0MisrOworICB9CisgIHJldHVybiAoKHJlc3VsdDEgPT0gMCkgJiYgKHJlc3VsdDIgPT0gMCkpOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfdGFza3dhaXQoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC90YXNraW5nL29tcF90YXNreWllbGQuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC90YXNraW5nL29tcF90YXNreWllbGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmI2OTg0Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3Rhc2tpbmcvb21wX3Rhc2t5aWVsZC5jCkBAIC0wLDAgKzEsNTggQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKK2ludCB0ZXN0X29tcF90YXNreWllbGQoKQoreworICBpbnQgaTsKKyAgaW50IGNvdW50ID0gMDsKKyAgaW50IHN0YXJ0X3RpZFtOVU1fVEFTS1NdOworICBpbnQgY3VycmVudF90aWRbTlVNX1RBU0tTXTsKKworICBmb3IgKGk9MDsgaTwgTlVNX1RBU0tTOyBpKyspIHsKKyAgICBzdGFydF90aWRbaV09MDsKKyAgICBjdXJyZW50X3RpZFtpXT0wOworICB9CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIHNpbmdsZQorICAgIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVEFTS1M7IGkrKykgeworICAgICAgICBpbnQgbXlpID0gaTsKKyAgICAgICAgI3ByYWdtYSBvbXAgdGFzayB1bnRpZWQKKyAgICAgICAgeworICAgICAgICAgIG15X3NsZWVwKFNMRUVQVElNRSk7CisgICAgICAgICAgc3RhcnRfdGlkW215aV0gPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKyAgICAgICAgICAjcHJhZ21hIG9tcCB0YXNreWllbGQKKyAgICAgICAgICBpZigoc3RhcnRfdGlkW215aV0gJTIpID09MCl7CisgICAgICAgICAgICBteV9zbGVlcChTTEVFUFRJTUUpOworICAgICAgICAgICAgY3VycmVudF90aWRbbXlpXSA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgICAgICAgIH0gLyplbmQgb2YgaWYqLworICAgICAgICB9IC8qIGVuZCBvZiBvbXAgdGFzayAqLworICAgICAgfSAvKiBlbmQgb2YgZm9yICovCisgICAgfSAvKiBlbmQgb2Ygc2luZ2xlICovCisgIH0gLyogZW5kIG9mIHBhcmFsbGVsICovCisgIGZvciAoaT0wO2k8TlVNX1RBU0tTOyBpKyspIHsKKyAgICAvL3ByaW50Zigic3RhcnRfdGlkWyVkXT0lZCwgY3VycmVudF90aWRbJWRdPSVkXG4iLAorICAgICAgLy9pLCBzdGFydF90aWRbaV0sIGkgLCBjdXJyZW50X3RpZFtpXSk7CisgICAgaWYgKGN1cnJlbnRfdGlkW2ldID09IHN0YXJ0X3RpZFtpXSkKKyAgICAgIGNvdW50Kys7CisgIH0KKyAgcmV0dXJuIChjb3VudDxOVU1fVEFTS1MpOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfdGFza3lpZWxkKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3QvdGhyZWFkcHJpdmF0ZS9vbXBfdGhyZWFkcHJpdmF0ZS5jIGIvZmluYWwvcnVudGltZS90ZXN0L3RocmVhZHByaXZhdGUvb21wX3RocmVhZHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGFiYWRiCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3RocmVhZHByaXZhdGUvb21wX3RocmVhZHByaXZhdGUuYwpAQCAtMCwwICsxLDEwMiBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorLyoKKyAqIFRocmVhZHByaXZhdGUgaXMgdGVzdGVkIGluIDIgd2F5czoKKyAqIDEuIFRoZSBnbG9iYWwgdmFyaWFibGUgZGVjbGFyZWQgYXMgdGhyZWFkcHJpdmF0ZSBzaG91bGQgaGF2ZQorICogIGxvY2FsIGNvcHkgZm9yIGVhY2ggdGhyZWFkLiBPdGhlcndpc2UgcmFjZSBjb25kaXRpb24gYW5kIAorICogIHdyb25nIHJlc3VsdC4KKyAqIDIuIElmIHRoZSB2YWx1ZSBvZiBsb2NhbCBjb3B5IGlzIHJldGFpbmVkIGZvciB0aGUgdHdvIGFkamFjZW50CisgKiAgcGFyYWxsZWwgcmVnaW9ucworICovCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK3N0YXRpYyBpbnQgc3VtMD0wOworc3RhdGljIGludCBteXZhbHVlID0gMDsKKworI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShzdW0wKQorI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShteXZhbHVlKQorCitpbnQgdGVzdF9vbXBfdGhyZWFkcHJpdmF0ZSgpCit7CisgIGludCBzdW0gPSAwOworICBpbnQga25vd25fc3VtOworICBpbnQgaTsgCisgIGludCBpdGVyOworICBpbnQgKmRhdGE7CisgIGludCBzaXplOworICBpbnQgbnVtX2ZhaWxlZCA9IDA7CisgIGludCBteV9yYW5kb207CisgIG9tcF9zZXRfZHluYW1pYygwKTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBwcml2YXRlKGkpIAorICB7CisgICAgc3VtMCA9IDA7CisgICAgI3ByYWdtYSBvbXAgZm9yIAorICAgIGZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspIHsKKyAgICAgIHN1bTAgPSBzdW0wICsgaTsKKyAgICB9IC8qZW5kIG9mIGZvciovCisgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICB7CisgICAgICBzdW0gPSBzdW0gKyBzdW0wOworICAgIH0gLyplbmQgb2YgY3JpdGljYWwgKi8KKyAgfSAvKiBlbmQgb2YgcGFyYWxsZWwgKi8gIAorICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgIGlmIChrbm93bl9zdW0gIT0gc3VtICkgeworICAgIGZwcmludGYgKHN0ZGVyciwgIiBrbm93bl9zdW0gPSAlZCwgc3VtID0gJWRcbiIsIGtub3duX3N1bSwgc3VtKTsKKyAgfQorCisgIC8qIHRoZSBuZXh0IHBhcmFsbGVsIHJlZ2lvbiBpcyBqdXN0IHVzZWQgdG8gZ2V0IHRoZSBudW1iZXIgb2YgdGhyZWFkcyovCisgIG9tcF9zZXRfZHluYW1pYygwKTsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIG1hc3RlcgorICAgIHsKKyAgICAgIHNpemU9b21wX2dldF9udW1fdGhyZWFkcygpOworICAgICAgZGF0YT0oaW50KikgbWFsbG9jKHNpemUqc2l6ZW9mKGludCkpOworICAgIH0KKyAgfS8qIGVuZCBwYXJhbGxlbCovCisKKyAgc3JhbmQoNDUpOworICBmb3IgKGl0ZXIgPSAwOyBpdGVyIDwgMTAwOyBpdGVyKyspIHsKKyAgICBteV9yYW5kb20gPSByYW5kKCk7IC8qIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGlzIAorICAgICAgICAgICAgICAgICBjYWxsZWQgaW5zaWRlIHNlcmlhbCByZWdpb24qLworCisgICAgLyogdGhlIGZpcnN0IHBhcmFsbGVsIHJlZ2lvbiBpcyB1c2VkIHRvIGluaXRpYWxpeWUgbXl2YWx1ZQorICAgICAgIGFuZCB0aGUgYXJyYXkgd2l0aCBteV9yYW5kb20rcmFuayAqLworICAgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgaW50IHJhbms7CisgICAgICByYW5rID0gb21wX2dldF90aHJlYWRfbnVtICgpOworICAgICAgbXl2YWx1ZSA9IGRhdGFbcmFua10gPSBteV9yYW5kb20gKyByYW5rOworICAgIH0KKworICAgIC8qIHRoZSBzZWNvbmQgcGFyYWxsZWwgcmVnaW9uIHZlcmlmaWVzIHRoYXQgdGhlIAorICAgICAgIHZhbHVlIG9mICJteXZhbHVlIiBpcyByZXRhaW5lZCAqLworICAgICNwcmFnbWEgb21wIHBhcmFsbGVsIHJlZHVjdGlvbigrOm51bV9mYWlsZWQpCisgICAgeworICAgICAgaW50IHJhbms7CisgICAgICByYW5rID0gb21wX2dldF90aHJlYWRfbnVtICgpOworICAgICAgbnVtX2ZhaWxlZCA9IG51bV9mYWlsZWQgKyAobXl2YWx1ZSAhPSBkYXRhW3JhbmtdKTsKKyAgICAgIGlmKG15dmFsdWUgIT0gZGF0YVtyYW5rXSkgeworICAgICAgICBmcHJpbnRmIChzdGRlcnIsICIgbXl2YWx1ZSA9ICVkLCBkYXRhW3JhbmtdPSAlZFxuIiwKKyAgICAgICAgICBteXZhbHVlLCBkYXRhW3JhbmtdKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZnJlZSAoZGF0YSk7CisgIHJldHVybiAoa25vd25fc3VtID09IHN1bSkgJiYgIW51bV9mYWlsZWQ7Cit9IC8qIGVuZCBvZiBjaGVja190aHJlYWRwcml2YXRlKi8KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3RocmVhZHByaXZhdGUoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC90aHJlYWRwcml2YXRlL29tcF90aHJlYWRwcml2YXRlX2Zvci5jIGIvZmluYWwvcnVudGltZS90ZXN0L3RocmVhZHByaXZhdGUvb21wX3RocmVhZHByaXZhdGVfZm9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE2M2E5OQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC90aHJlYWRwcml2YXRlL29tcF90aHJlYWRwcml2YXRlX2Zvci5jCkBAIC0wLDAgKzEsNDggQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworc3RhdGljIGludCBpOworI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShpKQorCitpbnQgdGVzdF9vbXBfdGhyZWFkcHJpdmF0ZV9mb3IoKQoreworICBpbnQga25vd25fc3VtOworICBpbnQgc3VtOworCisgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKyAgc3VtID0gMDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgaW50IHN1bTAgPSAwLCBpMDsKKyAgICAjcHJhZ21hIG9tcCBmb3IKKyAgICBmb3IgKGkwID0gMTsgaTAgPD0gTE9PUENPVU5UOyBpMCsrKSB7CisgICAgICBpID0gaTA7CisgICAgICBzdW0wID0gc3VtMCArIGk7CisgICAgfQorICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgeworICAgICAgc3VtID0gc3VtICsgc3VtMDsKKyAgICB9CisgIH0gLyogZW5kIG9mIHBhcmFsbGVsICovICAKKworICBpZiAoa25vd25fc3VtICE9IHN1bSApIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiBrbm93bl9zdW0gPSAlZCwgc3VtID0gJWRcbiIsIGtub3duX3N1bSwgc3VtKTsKKyAgfQorICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworfSAvKiBlbmQgb2YgY2hlY2tfdGhyZWFkcHJpdmF0ZSovCisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF90aHJlYWRwcml2YXRlX2ZvcigpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9idWdfc2V0X3NjaGVkdWxlXzAuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3IvYnVnX3NldF9zY2hlZHVsZV8wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY0NjRkZQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3IvYnVnX3NldF9zY2hlZHVsZV8wLmMKQEAgLTAsMCArMSw0MCBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b21wLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisvKiBUZXN0IHRoYXQgdGhlIGNodW5rIHNpemUgaXMgc2V0IHRvIGRlZmF1bHQgKDEpIHdoZW4KKyAgIGNodW5rIHNpemUgPD0gMCBpcyBzcGVjaWZpZWQgKi8KK2ludCBhID0gMDsKKworaW50IHRlc3Rfc2V0X3NjaGVkdWxlXzAoKQoreworICBpbnQgaTsKKyAgYSA9IDA7CisgIG9tcF9zZXRfc2NoZWR1bGUob21wX3NjaGVkX2R5bmFtaWMsMCk7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShydW50aW1lKQorICAgIGZvcihpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgYSsrOworICAgICAgaWYoYSA+IDEwKQorICAgICAgICBleGl0KDEpOworICAgIH0KKyAgfSAgICAKKyAgcmV0dXJuIGE9PTEwOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9zZXRfc2NoZWR1bGVfMCgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX2NvbGxhcHNlLmMgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3JfY29sbGFwc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDc5ZTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX2NvbGxhcHNlLmMKQEAgLTAsMCArMSw1MSBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworLyogVXRpbGl0eSBmdW5jdGlvbiB0byBjaGVjayB0aGF0IGkgaXMgaW5jcmVhc2luZyBtb25vdG9uaWNhbGx5IAorICAgd2l0aCBlYWNoIGNhbGwgKi8KK3N0YXRpYyBpbnQgY2hlY2tfaV9pc2xhcmdlciAoaW50IGkpCit7CisgIHN0YXRpYyBpbnQgbGFzdF9pOworICBpbnQgaXNsYXJnZXI7CisgIGlmIChpPT0xKQorICAgIGxhc3RfaT0wOworICBpc2xhcmdlciA9ICgoaSA+PSBsYXN0X2kpJiYoaSAtIGxhc3RfaTw9MSkpOworICBsYXN0X2kgPSBpOworICByZXR1cm4gKGlzbGFyZ2VyKTsKK30KKworaW50IHRlc3Rfb21wX2Zvcl9jb2xsYXBzZSgpCit7CisgIGludCBpc19sYXJnZXIgPSAxOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgaSxqOworICAgIGludCBteV9pc2xhcmdlciA9IDE7CisgICAgI3ByYWdtYSBvbXAgZm9yIHByaXZhdGUoaSxqKSBzY2hlZHVsZShzdGF0aWMsMSkgY29sbGFwc2UoMikgb3JkZXJlZAorICAgIGZvciAoaSA9IDE7IGkgPCAxMDA7IGkrKykgeworICAgICAgZm9yIChqID0xOyBqIDwxMDA7IGorKykgeworICAgICAgICAjcHJhZ21hIG9tcCBvcmRlcmVkCisgICAgICAgIG15X2lzbGFyZ2VyID0gY2hlY2tfaV9pc2xhcmdlcihpKSYmbXlfaXNsYXJnZXI7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgaXNfbGFyZ2VyID0gaXNfbGFyZ2VyICYmIG15X2lzbGFyZ2VyOworICB9CisgIHJldHVybiAoaXNfbGFyZ2VyKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX2Zvcl9jb2xsYXBzZSgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX2ZpcnN0cHJpdmF0ZS5jIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX2ZpcnN0cHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlY2ViNTIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3JfZmlyc3Rwcml2YXRlLmMKQEAgLTAsMCArMSw1NSBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IHN1bTE7CisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKHN1bTEpCisKK2ludCB0ZXN0X29tcF9mb3JfZmlyc3Rwcml2YXRlKCkKK3sKKyAgaW50IHN1bTsKKyAgaW50IHN1bTA7CisgIGludCBrbm93bl9zdW07CisgIGludCB0aHJlYWRzbnVtOworCisgIHN1bSA9IDA7CisgIHN1bTAgPSAxMjM0NTsKKyAgc3VtMSA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIHNpbmdsZQorICAgIHsKKyAgICAgIHRocmVhZHNudW09b21wX2dldF9udW1fdGhyZWFkcygpOworICAgIH0KKyAgICAvKiBzdW0wID0gMDsgKi8KKyAgCisgICAgaW50IGk7CisgICAgI3ByYWdtYSBvbXAgZm9yIGZpcnN0cHJpdmF0ZShzdW0wKQorICAgIGZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspIHsKKyAgICAgIHN1bTAgPSBzdW0wICsgaTsKKyAgICAgIHN1bTEgPSBzdW0wOworICAgIH0gIC8qIGVuZCBvZiBmb3IgKi8KKyAgCisgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICB7CisgICAgICBzdW0gPSBzdW0gKyBzdW0xOworICAgIH0gIC8qIGVuZCBvZiBjcml0aWNhbCAqLworICB9ICAvKiBlbmQgb2YgcGFyYWxsZWwgKi8gIAorICBrbm93bl9zdW0gPSAxMjM0NSogdGhyZWFkc251bSsgKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyOworICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfZm9yX2ZpcnN0cHJpdmF0ZSgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX2xhc3Rwcml2YXRlLmMgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3JfbGFzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTg5NzI5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX2xhc3Rwcml2YXRlLmMKQEAgLTAsMCArMSw1MiBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IHN1bTA7CisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKHN1bTApCisKK2ludCB0ZXN0X29tcF9mb3JfbGFzdHByaXZhdGUoKQoreworICBpbnQgc3VtID0gMDsKKyAgaW50IGtub3duX3N1bTsKKyAgaW50IGkwOworICAKKyAgaTAgPSAtMTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgc3VtMCA9IDA7CisgICAgeyAgLyogQmVnaW4gb2Ygb3JwaGFuZWQgYmxvY2sgKi8KKyAgICAgIGludCBpOworICAgICAgI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKHN0YXRpYyw3KSBsYXN0cHJpdmF0ZShpMCkKKyAgICAgIGZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspIHsKKyAgICAgICAgc3VtMCA9IHN1bTAgKyBpOworICAgICAgICBpMCA9IGk7CisgICAgICB9ICAvKiBlbmQgb2YgZm9yICovCisgICAgfSAgLyogZW5kIG9mIG9ycGhhbmVkIGJsb2NrICovCisKKyAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgIHsKKyAgICAgIHN1bSA9IHN1bSArIHN1bTA7CisgICAgfSAgLyogZW5kIG9mIGNyaXRpY2FsICovCisgIH0gIC8qIGVuZCBvZiBwYXJhbGxlbCAqLyAgCisKKyAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyOworICBmcHJpbnRmKHN0ZGVyciwgImtub3duX3N1bSA9ICVkICwgc3VtID0gJWRcbiIsa25vd25fc3VtLHN1bSk7CisgIGZwcmludGYoc3RkZXJyLCAiTE9PUENPVU5UID0gJWQgLCBpMCA9ICVkXG4iLExPT1BDT1VOVCxpMCk7CisgIHJldHVybiAoKGtub3duX3N1bSA9PSBzdW0pICYmIChpMCA9PSBMT09QQ09VTlQpKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IgKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9mb3JfbGFzdHByaXZhdGUoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9ub3dhaXQuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9ub3dhaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTg1ZjFlCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX25vd2FpdC5jCkBAIC0wLDAgKzEsNTMgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworaW50IHRlc3Rfb21wX2Zvcl9ub3dhaXQoKQoreworICBpbnQgcmVzdWx0OworICBpbnQgY291bnQ7CisgIGludCBqOworICBpbnQgbXlhcnJheVtMT09QQ09VTlRdOworCisgIHJlc3VsdCA9IDA7CisgIGNvdW50ID0gMDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgeworICAgIGludCByYW5rOworICAgIGludCBpOworCisgICAgcmFuayA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworCisgICAgI3ByYWdtYSBvbXAgZm9yIG5vd2FpdCAKKyAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspIHsKKyAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgbXlfc2xlZXAoU0xFRVBUSU1FKTsKKyAgICAgICAgY291bnQgPSAxOworICAgICAgICAjcHJhZ21hIG9tcCBmbHVzaChjb3VudCkKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKSB7CisgICAgICAjcHJhZ21hIG9tcCBmbHVzaChjb3VudCkKKyAgICAgIGlmIChjb3VudCA9PSAwKQorICAgICAgICByZXN1bHQgPSAxOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfZm9yX25vd2FpdCgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX29yZGVyZWQuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9vcmRlcmVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJmMGVkMgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9vcmRlcmVkLmMKQEAgLTAsMCArMSw2MCBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworc3RhdGljIGludCBsYXN0X2kgPSAwOworCisvKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGNoZWNrIHRoYXQgaSBpcyBpbmNyZWFzaW5nIG1vbm90b25pY2FsbHkgCisgICB3aXRoIGVhY2ggY2FsbCAqLworc3RhdGljIGludCBjaGVja19pX2lzbGFyZ2VyIChpbnQgaSkKK3sKKyAgaW50IGlzbGFyZ2VyOworICBpc2xhcmdlciA9IChpID4gbGFzdF9pKTsKKyAgbGFzdF9pID0gaTsKKyAgcmV0dXJuIChpc2xhcmdlcik7Cit9CisKK2ludCB0ZXN0X29tcF9mb3Jfb3JkZXJlZCgpCit7CisgIGludCBzdW07CisgIGludCBpc19sYXJnZXIgPSAxOworICBpbnQga25vd25fc3VtOworCisgIGxhc3RfaSA9IDA7CisgIHN1bSA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIGludCBpOworICAgIGludCBteV9pc2xhcmdlciA9IDE7CisgICAgI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKHN0YXRpYywxKSBvcmRlcmVkCisgICAgZm9yIChpID0gMTsgaSA8IDEwMDsgaSsrKSB7CisgICAgICAjcHJhZ21hIG9tcCBvcmRlcmVkCisgICAgICB7CisgICAgICAgIG15X2lzbGFyZ2VyID0gY2hlY2tfaV9pc2xhcmdlcihpKSAmJiBteV9pc2xhcmdlcjsKKyAgICAgICAgc3VtID0gc3VtICsgaTsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICB7CisgICAgICBpc19sYXJnZXIgPSBpc19sYXJnZXIgJiYgbXlfaXNsYXJnZXI7CisgICAgfQorICB9CisKKyAga25vd25fc3VtPSg5OSAqIDEwMCkgLyAyOworICByZXR1cm4gKChrbm93bl9zdW0gPT0gc3VtKSAmJiBpc19sYXJnZXIpOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfZm9yX29yZGVyZWQoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9wcml2YXRlLmMgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3JfcHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MTY5OGUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3JfcHJpdmF0ZS5jCkBAIC0wLDAgKzEsNjMgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKy8qIFV0aWxpdHkgZnVuY3Rpb24gZG8gc3BlbmQgc29tZSB0aW1lIGluIGEgbG9vcCAqLworc3RhdGljIHZvaWQgZG9fc29tZV93b3JrKCkKK3sKKyAgaW50IGk7CisgIGRvdWJsZSBzdW0gPSAwOworICBmb3IoaSA9IDA7IGkgPCAxMDAwOyBpKyspeworICBzdW0gKz0gc3FydCAoKGRvdWJsZSkgaSk7CisgIH0KK30KKworaW50IHN1bTE7CisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKHN1bTEpCisKK2ludCB0ZXN0X29tcF9mb3JfcHJpdmF0ZSgpCit7CisgIGludCBzdW0gPSAwOworICBpbnQgc3VtMDsKKyAgaW50IGtub3duX3N1bTsKKworICBzdW0wID0gMDsgIC8qIHNldHRpbmcgKGdsb2JhbCkgc3VtMCA9IDAgKi8KKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgc3VtMSA9IDA7ICAvKiBzZXR0aW5nIHN1bTEgaW4gZWFjaCB0aHJlYWQgdG8gMCAqLworICAgIHsgIC8qIGJlZ2luIG9mIG9ycGhhbmVkIGJsb2NrICovCisgICAgICBpbnQgaTsKKyAgICAgICNwcmFnbWEgb21wIGZvciBwcml2YXRlKHN1bTApIHNjaGVkdWxlKHN0YXRpYywxKQorICAgICAgZm9yIChpID0gMTsgaSA8PSBMT09QQ09VTlQ7IGkrKykgeworICAgICAgICBzdW0wID0gc3VtMTsKKyAgICAgICAgI3ByYWdtYSBvbXAgZmx1c2gKKyAgICAgICAgc3VtMCA9IHN1bTAgKyBpOworICAgICAgICBkb19zb21lX3dvcmsgKCk7CisgICAgICAgICNwcmFnbWEgb21wIGZsdXNoCisgICAgICAgIHN1bTEgPSBzdW0wOworICAgICAgfQorICAgIH0gIC8qIGVuZCBvZiBvcnBoYW5lZCBibG9jayAqLworCisgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICB7CisgICAgICBzdW0gPSBzdW0gKyBzdW0xOworICAgIH0gIC8qZW5kIG9mIGNyaXRpY2FsKi8KKyAgfSAgLyogZW5kIG9mIHBhcmFsbGVsKi8gIAorICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7Cit9ICAgICAgICAgICAgICAgIAorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfZm9yX3ByaXZhdGUoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9yZWR1Y3Rpb24uYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9yZWR1Y3Rpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjY5MGIyCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX3JlZHVjdGlvbi5jCkBAIC0wLDAgKzEsMzM5IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisjZGVmaW5lIERPVUJMRV9ESUdJVFMgMjAgIC8qIGR0XkRPVUJMRV9ESUdJVFMgKi8KKyNkZWZpbmUgTUFYX0ZBQ1RPUiAxMAorI2RlZmluZSBLTk9XTl9QUk9EVUNUIDM2Mjg4MDAgIC8qIDEwISAqLworCitpbnQgdGVzdF9vbXBfZm9yX3JlZHVjdGlvbiAoKQoreworICBkb3VibGUgZHQ7CisgIGludCBzdW07CisgIGludCBkaWZmOworICBpbnQgcHJvZHVjdCA9IDE7CisgIGRvdWJsZSBkc3VtOworICBkb3VibGUgZGtub3duX3N1bTsKKyAgZG91YmxlIGRkaWZmOworICBpbnQgbG9naWNfYW5kOworICBpbnQgbG9naWNfb3I7CisgIGludCBiaXRfYW5kOworICBpbnQgYml0X29yOworICBpbnQgZXhjbHVzaXZfYml0X29yOworICBpbnQgKmxvZ2ljczsKKyAgaW50IGk7CisgIGludCBrbm93bl9zdW07CisgIGludCBrbm93bl9wcm9kdWN0OworICBkb3VibGUgcm91bmRpbmdfZXJyb3IgPSAxLkUtOTsgLyogb3ZlciBhbGwgcm91bmRpbmcgZXJyb3IgdG8gYmUKKyAgICAgICAgICAgICAgICAgICAgaWdub3JlZCBpbiB0aGUgZG91YmxlIHRlc3RzICovCisgIGRvdWJsZSBkcHQ7CisgIGludCByZXN1bHQgPSAwOworICBpbnQgbG9naWNzQXJyYXlbTE9PUENPVU5UXTsKKworICAvKiBWYXJpYWJsZXMgZm9yIGludGVnZXIgdGVzdHMgKi8KKyAgc3VtID0gMDsKKyAgcHJvZHVjdCA9IDE7CisgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKyAgLyogdmFyaWFiZWxzIGZvciBkb3VibGUgdGVzdHMgKi8KKyAgZHQgPSAxLiAvIDMuOyAgLyogYmFzZSBvZiBnZW9tZXRyaWMgcm93IGZvciArIGFuZCAtIHRlc3QqLworICBkc3VtID0gMC47CisgIC8qIFZhcmlhYmVsZXMgZm9yIGxvZ2ljICB0ZXN0cyAqLworICBsb2dpY3MgPSBsb2dpY3NBcnJheTsKKyAgbG9naWNfYW5kID0gMTsKKyAgbG9naWNfb3IgPSAwOworICAvKiBWYXJpYWJlbGVzIGZvciBiaXQgb3BlcmF0b3JzIHRlc3RzICovCisgIGJpdF9hbmQgPSAxOworICBiaXRfb3IgPSAwOworICAvKiBWYXJpYWJsZXMgZm9yIGV4Y2x1c2l2IGJpdCBvciAqLworICBleGNsdXNpdl9iaXRfb3IgPSAwOworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKiBUZXN0cyBmb3IgaW50ZWdlcnMgICAgICAgICAgICAgICAgICAgICAgICAgKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgLyoqKiogVGVzdGluZyBpbnRlZ2VyIGFkZGl0aW9uICoqKiovCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIAorICB7CisgICAgaW50IGo7CisgICAgI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcmVkdWN0aW9uKCs6c3VtKQorICAgIGZvciAoaiA9IDE7IGogPD0gTE9PUENPVU5UOyBqKyspIHsKKyAgICAgIHN1bSA9IHN1bSArIGo7CisgICAgfQorICB9CisgIGlmIChrbm93bl9zdW0gIT0gc3VtKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgaW4gc3VtIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQiCisgICAgICAiIGluc3RlYWQgb2YgJWQuXG4iLCBzdW0sIGtub3duX3N1bSk7IAorICB9CisKKyAgLyoqKiogVGVzdGluZyBpbnRlZ2VyIHN1YnRyYWN0b24gKioqKi8KKyAgZGlmZiA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgIHsKKyAgICBpbnQgajsKKyAgICAjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSByZWR1Y3Rpb24oLTpkaWZmKQorICAgIGZvciAoaiA9IDE7IGogPD0gTE9PUENPVU5UOyBqKyspIHsKKyAgICAgIGRpZmYgPSBkaWZmIC0gajsKKyAgICB9CisgIH0KKyAgaWYgKGRpZmYgIT0gMCkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yIGluIGRpZmZlcmVuY2Ugd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCIKKyAgICAgICIgaW5zdGVhZCBvZiAwLlxuIiwgZGlmZik7CisgIH0KKworICAvKioqKiBUZXN0aW5nIGludGVnZXIgbXVsdGlwbGljYXRpb24gKioqKi8KKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgIHsKKyAgICBpbnQgajsKKyAgICAjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSByZWR1Y3Rpb24oKjpwcm9kdWN0KQorICAgIGZvciAoaiA9IDE7IGogPD0gTUFYX0ZBQ1RPUjsgaisrKSB7CisgICAgICBwcm9kdWN0ICo9IGo7CisgICAgfQorICB9CisgIGtub3duX3Byb2R1Y3QgPSBLTk9XTl9QUk9EVUNUOworICBpZihrbm93bl9wcm9kdWN0ICE9IHByb2R1Y3QpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmIChzdGRlcnIsIkVycm9yIGluIFByb2R1Y3Qgd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCIKKyAgICAgICIgaW5zdGVhZCBvZiAlZFxuIixwcm9kdWN0LGtub3duX3Byb2R1Y3QpOworICB9CisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqIFRlc3RzIGZvciBkb3VibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAvKioqKiBUZXN0aW5nIGRvdWJsZSBhZGRpdGlvbiAqKioqLworICBkc3VtID0gMC47CisgIGRwdCA9IDEuOworICBmb3IgKGkgPSAwOyBpIDwgRE9VQkxFX0RJR0lUUzsgKytpKSB7CisgICAgZHB0ICo9IGR0OworICB9CisgIGRrbm93bl9zdW0gPSAoMSAtIGRwdCkgLyAoMSAtIGR0KTsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgIHsKKyAgICBpbnQgajsKKyAgICAjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSByZWR1Y3Rpb24oKzpkc3VtKQorICAgIGZvciAoaiA9IDA7IGogPCBET1VCTEVfRElHSVRTOyBqKyspIHsgIAorICAgICAgZHN1bSArPSBwb3cgKGR0LCBqKTsKKyAgICB9CisgIH0KKyAgaWYgKGZhYnMgKGRzdW0gLSBka25vd25fc3VtKSA+IHJvdW5kaW5nX2Vycm9yKSB7CisgICAgcmVzdWx0Kys7IAorICAgIGZwcmludGYgKHN0ZGVyciwgIlxuRXJyb3IgaW4gc3VtIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlZiIKKyAgICAgICIgaW5zdGVhZCBvZjogJWYgKERpZmZlcmVuY2U6ICVFKVxuIiwKKyAgICAgIGRzdW0sIGRrbm93bl9zdW0sIGRzdW0tZGtub3duX3N1bSk7CisgIH0KKworICAvKioqKiBUZXN0aW5nIGRvdWJsZSBzdWJ0cmFjdGlvbiAqKioqLworICBkZGlmZiA9ICgxIC0gZHB0KSAvICgxIC0gZHQpOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgeworICAgIGludCBqOworICAgICNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHJlZHVjdGlvbigtOmRkaWZmKQorICAgIGZvciAoaiA9IDA7IGogPCBET1VCTEVfRElHSVRTOyArK2opIHsKKyAgICAgIGRkaWZmIC09IHBvdyAoZHQsIGopOworICAgIH0KKyAgfQorICBpZiAoZmFicyAoZGRpZmYpID4gcm91bmRpbmdfZXJyb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvciBpbiBEaWZmZXJlbmNlIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlRSIKKyAgICAgICIgaW5zdGVhZCBvZiAwLjBcbiIsIGRkaWZmKTsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqIFRlc3RzIGZvciBsb2dpY2FsIHZhbHVlcyAgICAgICAgICAgICAgICAgICAgICAgKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgLyoqKiogVGVzdGluZyBsb2dpYyBhbmQgKioqKi8KKyAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKSB7CisgICAgbG9naWNzW2ldID0gMTsKKyAgfQorCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIAorICB7CisgICAgaW50IGo7CisgICAgI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcmVkdWN0aW9uKCYmOmxvZ2ljX2FuZCkKKyAgICBmb3IgKGogPSAwOyBqIDwgTE9PUENPVU5UOyArK2opIHsKKyAgICAgIGxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2pdKTsKKyAgICB9CisgIH0KKyAgaWYoIWxvZ2ljX2FuZCkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDFcbiIpOworICB9CisKKyAgbG9naWNfYW5kID0gMTsKKyAgbG9naWNzW0xPT1BDT1VOVCAvIDJdID0gMDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgeworICAgIGludCBqOworICAgICNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHJlZHVjdGlvbigmJjpsb2dpY19hbmQpCisgICAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgKytqKSB7CisgICAgICBsb2dpY19hbmQgPSBsb2dpY19hbmQgJiYgbG9naWNzW2pdOworICAgIH0KKyAgfQorICBpZihsb2dpY19hbmQpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAyXG4iKTsKKyAgfQorCisgIC8qKioqIFRlc3RpbmcgbG9naWMgb3IgKioqKi8KKyAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKSB7CisgICAgbG9naWNzW2ldID0gMDsKKyAgfQorCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIAorICB7CisgICAgaW50IGo7CisgICAgI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcmVkdWN0aW9uKHx8OmxvZ2ljX29yKSAgCisgICAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgKytqKSB7CisgICAgICBsb2dpY19vciA9IGxvZ2ljX29yIHx8IGxvZ2ljc1tqXTsKKyAgICB9CisgIH0KKyAgaWYgKGxvZ2ljX29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAxXG4iKTsKKyAgfQorCisgIGxvZ2ljX29yID0gMDsKKyAgbG9naWNzW0xPT1BDT1VOVCAvIDJdID0gMTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgeworICAgIGludCBqOworICAgICNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHJlZHVjdGlvbih8fDpsb2dpY19vcikKKyAgICBmb3IgKGogPSAwOyBqIDwgTE9PUENPVU5UOyArK2opIHsKKyAgICAgIGxvZ2ljX29yID0gbG9naWNfb3IgfHwgbG9naWNzW2pdOworICAgIH0KKyAgfQorICBpZighbG9naWNfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDJcbiIpOworICB9CisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqIFRlc3RzIGZvciBiaXQgdmFsdWVzICAgICAgICAgICAgICAgICAgICAgICAgICoqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIC8qKioqIFRlc3RpbmcgYml0IGFuZCAqKioqLworICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyArK2kpIHsKKyAgICBsb2dpY3NbaV0gPSAxOworICB9CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgIHsKKyAgICBpbnQgajsKKyAgICAjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSByZWR1Y3Rpb24oJjpiaXRfYW5kKSAgCisgICAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgKytqKSB7CisgICAgICBiaXRfYW5kID0gKGJpdF9hbmQgJiBsb2dpY3Nbal0pOworICAgIH0KKyAgfQorICBpZiAoIWJpdF9hbmQpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMVxuIik7CisgIH0KKworICBiaXRfYW5kID0gMTsKKyAgbG9naWNzW0xPT1BDT1VOVCAvIDJdID0gMDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgeworICAgIGludCBqOworICAgICNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHJlZHVjdGlvbigmOmJpdF9hbmQpCisgICAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgKytqKSB7CisgICAgICBiaXRfYW5kID0gYml0X2FuZCAmIGxvZ2ljc1tqXTsKKyAgICB9CisgIH0KKyAgaWYgKGJpdF9hbmQpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMlxuIik7CisgIH0KKworICAvKioqKiBUZXN0aW5nIGJpdCBvciAqKioqLworICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspIHsKKyAgICBsb2dpY3NbaV0gPSAwOworICB9CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgIHsKKyAgICBpbnQgajsKKyAgICAjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSByZWR1Y3Rpb24ofDpiaXRfb3IpCisgICAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgKytqKSB7CisgICAgICBiaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3Nbal07CisgICAgfQorICB9CisgIGlmIChiaXRfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvciBpbiBCSVQgT1IgcGFydCAxXG4iKTsKKyAgfQorCisgIGJpdF9vciA9IDA7CisgIGxvZ2ljc1tMT09QQ09VTlQgLyAyXSA9IDE7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgIHsKKyAgICBpbnQgajsKKyAgICAjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSByZWR1Y3Rpb24ofDpiaXRfb3IpCisgICAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgKytqKSB7CisgICAgICBiaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3Nbal07CisgICAgfQorICB9CisgIGlmICghYml0X29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgaW4gQklUIE9SIHBhcnQgMlxuIik7CisgIH0KKworICAvKioqKiBUZXN0aW5nIGV4Y2x1c2l2ZSBiaXQgb3IgKioqKi8KKyAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKSB7CisgICAgbG9naWNzW2ldID0gMDsKKyAgfQorCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIAorICB7CisgICAgaW50IGo7CisgICAgI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcmVkdWN0aW9uKF46ZXhjbHVzaXZfYml0X29yKQorICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7ICsraikgeworICAgICAgZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2pdOworICAgIH0KKyAgfQorICBpZiAoZXhjbHVzaXZfYml0X29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMVxuIik7CisgIH0KKworICBleGNsdXNpdl9iaXRfb3IgPSAwOworICBsb2dpY3NbTE9PUENPVU5UIC8gMl0gPSAxOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIAorICB7CisgICAgaW50IGo7CisgICAgI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcmVkdWN0aW9uKF46ZXhjbHVzaXZfYml0X29yKQorICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7ICsraikgeworICAgICAgZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2pdOworICAgIH0KKyAgfQorICBpZiAoIWV4Y2x1c2l2X2JpdF9vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yIGluIEVYQ0xVU0lWIEJJVCBPUiBwYXJ0IDJcbiIpOworICB9CisKKyAgcmV0dXJuIChyZXN1bHQgPT0gMCk7CisgIGZyZWUgKGxvZ2ljcyk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9mb3JfcmVkdWN0aW9uKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3Jfc2NoZWR1bGVfYXV0by5jIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX3NjaGVkdWxlX2F1dG8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGQwM2M2Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX3NjaGVkdWxlX2F1dG8uYwpAQCAtMCwwICsxLDY5IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgc3VtMTsKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoc3VtMSkKKworaW50IHRlc3Rfb21wX2Zvcl9hdXRvKCkKK3sKKyAgaW50IGo7CisgIGludCBzdW07CisgIGludCBzdW0wOworICBpbnQga25vd25fc3VtOworICBpbnQgdGhyZWFkc251bTsKKworICBzdW0gPSAwOworICBzdW0wID0gMTIzNDU7CisKKyAgLy8gYXJyYXkgd2hpY2gga2VlcHMgdHJhY2sgb2Ygd2hpY2ggdGhyZWFkcyBwYXJ0aWNpcGF0ZWQgaW4gdGhlIGZvciBsb29wCisgIC8vIGUuZy4sIGdpdmVuIDQgdGhyZWFkcywgWyAwIHwgMSB8IDEgfCAwIF0gaW1wbGllcworICAvLyAgICAgICB0aHJlYWRzIDAgYW5kIDMgZGlkIG5vdCwgdGhyZWFkcyAxIGFuZCAyIGRpZAorICBpbnQgbWF4X3RocmVhZHMgPSBvbXBfZ2V0X21heF90aHJlYWRzKCk7CisgIGludCogYWN0aXZlX3RocmVhZHMgPSAoaW50KiltYWxsb2Moc2l6ZW9mKGludCkqbWF4X3RocmVhZHMpOworICBmb3IoaiA9IDA7IGogPCBtYXhfdGhyZWFkczsgaisrKSAKKyAgICBhY3RpdmVfdGhyZWFkc1tqXSA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIGludCBpOworICAgIHN1bTEgPSAwOworICAgICNwcmFnbWEgb21wIGZvciBmaXJzdHByaXZhdGUoc3VtMCkgc2NoZWR1bGUoYXV0bykKKyAgICBmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKSB7CisgICAgICBhY3RpdmVfdGhyZWFkc1tvbXBfZ2V0X3RocmVhZF9udW0oKV0gPSAxOworICAgICAgc3VtMCA9IHN1bTAgKyBpOworICAgICAgc3VtMSA9IHN1bTA7CisgICAgfQorICAKKyAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgIHsKKyAgICAgIHN1bSA9IHN1bSArIHN1bTE7CisgICAgfQorICB9CisKKyAgLy8gY291bnQgdGhlIHRocmVhZHMgdGhhdCBwYXJ0aWNpcGF0ZWQgKHN1bSBpcyBzdG9yZWQgaW4gdGhyZWFkc251bSkKKyAgdGhyZWFkc251bT0wOworICBmb3IoaiA9IDA7IGogPCBtYXhfdGhyZWFkczsgaisrKSB7CisgICAgaWYoYWN0aXZlX3RocmVhZHNbal0pCisgICAgICB0aHJlYWRzbnVtKys7CisgIH0KKyAgZnJlZShhY3RpdmVfdGhyZWFkcyk7CisKKyAga25vd25fc3VtID0gMTIzNDUgKiB0aHJlYWRzbnVtICsgKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyOworICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfZm9yX2F1dG8oKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9zY2hlZHVsZV9keW5hbWljLmMgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3Jfc2NoZWR1bGVfZHluYW1pYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYTZkMDkKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3Jfc2NoZWR1bGVfZHluYW1pYy5jCkBAIC0wLDAgKzEsOTAgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKy8qCisgKiBUZXN0IGZvciBkeW5hbWljIHNjaGVkdWxpbmcgd2l0aCBjaHVuayBzaXplCisgKiBNZXRob2Q6IGNhY3VsYXRlIGhvdyBtYW55IHRpbWVzIHRoZSBpdGVyYXRpb24gc3BhY2UgaXMgZGlzcGF0Y2hlZAorICogICAgIGFuZCBqdWRnZSBpZiBlYWNoIGRpc3BhdGNoIGhhcyB0aGUgcmVxdWVzdGVkIGNodW5rIHNpemUKKyAqICAgICB1bmxlc3MgaXQgaXMgdGhlIGxhc3Qgb25lLgorICogSXQgaXMgcG9zc2libGUgZm9yIHR3byBhZGphY2VudCBjaHVua3MgYXJlIGFzc2lnbmVkIHRvIHRoZSBzYW1lIHRocmVhZAorICogTW9kaWZpZWQgYnkgQ2h1bmh1YSBMaWFvCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9tcC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworI2RlZmluZSBDRkRNQVhfU0laRSAxMDAKK2NvbnN0IGludCBjaHVua19zaXplID0gNzsKKworaW50IHRlc3Rfb21wX2Zvcl9zY2hlZHVsZV9keW5hbWljKCkKK3sKKyAgaW50IHRpZDsKKyAgaW50ICp0aWRzOworICBpbnQgaTsKKyAgaW50IHRpZHNBcnJheVtDRkRNQVhfU0laRV07CisgIGludCBjb3VudCA9IDA7CisgIGludCB0bXBfY291bnQgPSAwOyAvKmRpc3BhdGNoIHRpbWVzKi8KKyAgaW50ICp0bXA7ICAvKnN0b3JlIGNodW5rIHNpemUgZm9yIGVhY2ggZGlzcGF0Y2gqLworICBpbnQgcmVzdWx0ID0gMDsKKyAgCisgIHRpZHMgPSB0aWRzQXJyYXk7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgcHJpdmF0ZSh0aWQpIHNoYXJlZCh0aWRzKQorICB7ICAgICAgICAvKiBiZWdpbiBvZiBwYXJhbGxlbCAqLworICAgIGludCB0aWQ7CisgICAgdGlkID0gb21wX2dldF90aHJlYWRfbnVtICgpOworICAgICNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLGNodW5rX3NpemUpCisgICAgZm9yIChpID0gMDsgaSA8IENGRE1BWF9TSVpFOyBpKyspIHsKKyAgICAgIHRpZHNbaV0gPSB0aWQ7CisgICAgfQorICB9CisKKyAgZm9yIChpID0gMDsgaSA8IENGRE1BWF9TSVpFIC0gMTsgKytpKSB7CisgICAgaWYgKHRpZHNbaV0gIT0gdGlkc1tpICsgMV0pIHsKKyAgICAgIGNvdW50Kys7CisgICAgfQorICB9CisKKyAgdG1wID0gKGludCAqKSBtYWxsb2MgKHNpemVvZiAoaW50KSAqIChjb3VudCArIDEpKTsKKyAgdG1wWzBdID0gMTsKKworICBmb3IgKGkgPSAwOyBpIDwgQ0ZETUFYX1NJWkUgLSAxOyArK2kpIHsKKyAgICBpZiAodG1wX2NvdW50ID4gY291bnQpIHsKKyAgICAgIHByaW50ZiAoIi0tLS0tLS0tLS0tLS0tLS0tLS0tXG5UZXN0aW50ZXJuYWwgRXJyb3I6IExpc3QgdG9vIHNtYWxsISEhXG4tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7ICAvKiBFcnJvciBoYW5kbGluZyAqLworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICh0aWRzW2ldICE9IHRpZHNbaSArIDFdKSB7CisgICAgICB0bXBfY291bnQrKzsKKyAgICAgIHRtcFt0bXBfY291bnRdID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgdG1wW3RtcF9jb3VudF0rKzsKKyAgICB9CisgIH0KKyAgLyogaXMgZHluYW1pYyBzdGF0ZW1lbnQgd29ya2luZz8gKi8KKyAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICBpZiAoKHRtcFtpXSVjaHVua19zaXplKSE9MCkgeworICAgICAgLyogaXQgaXMgcG9zc2libGUgZm9yIDIgYWRqYWNlbnQgY2h1bmtzIGFzc2lnbmVkIHRvIGEgc2FtZSB0aHJlYWQgKi8KKyAgICAgIHJlc3VsdCsrOworICAgICAgZnByaW50ZihzdGRlcnIsIlRoZSBpbnRlcm1lZGlhdGUgZGlzcGF0Y2ggaGFzIHdyb25nIGNodW5rc2l6ZS5cbiIpOworICAgICAgLyogcmVzdWx0ICs9ICgodG1wW2ldIC8gY2h1bmtfc2l6ZSkgLSAxKTsgKi8KKyAgICB9CisgIH0KKyAgaWYgKCh0bXBbY291bnRdJWNodW5rX3NpemUpIT0oQ0ZETUFYX1NJWkUlY2h1bmtfc2l6ZSkpIHsgCisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsInRoZSBsYXN0IGRpc3BhdGNoIGhhcyB3cm9uZyBjaHVua3NpemUuXG4iKTsKKyAgfQorICAvKiBmb3IgKGludCBpPTA7aTxjb3VudCsxOysraSkgcHJpbnRmKCIlZFx0Oj1cdCVkXG4iLGkrMSx0bXBbaV0pOyAqLworICByZXR1cm4gKHJlc3VsdD09MCk7Cit9CitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfZm9yX3NjaGVkdWxlX2R5bmFtaWMoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9zY2hlZHVsZV9ndWlkZWQuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9zY2hlZHVsZV9ndWlkZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2MyYjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX3NjaGVkdWxlX2d1aWRlZC5jCkBAIC0wLDAgKzEsMjE4IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisKKy8qIFRlc3QgZm9yIGd1aWRlZCBzY2hlZHVsaW5nCisgKiBFbnN1cmUgdGhyZWFkcyBnZXQgY2h1bmtzIGludGVybGVhdmVseSBmaXJzdAorICogVGhlbiBqdWRnZSB0aGUgY2h1bmsgc2l6ZXMgYXJlIGRlY3JlYXNpbmcgdG8gYSBzdGFibGUgdmFsdWUKKyAqIE1vZGlmaWVkIGJ5IENodW5odWEgTGlhbworICogRm9yIGV4YW1wbGUsIDEwMCBpdGVyYXRpb24gb24gMiB0aHJlYWRzLCBjaHVua3NpemUgNworICogb25lIGxpbmUgZm9yIGVhY2ggZGlzcGF0Y2gsIDAvMSBtZWFucyB0aHJlYWQgaWQKKyAqIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwICAyNAorICogMSAxIDEgMSAxIDEgMSAxIDEgMSAxIDEgMSAxIDEgMSAxIDEgICAgICAgIDE4CisgKiAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgICAgICAgICAgICAxNAorICogMSAxIDEgMSAxIDEgMSAxIDEgMSAgICAgICAgICAgICAgICAxMAorICogMCAwIDAgMCAwIDAgMCAwICAgICAgICAgICAgICAgICAgIDgKKyAqIDEgMSAxIDEgMSAxIDEgICAgICAgICAgICAgICAgICAgNworICogMCAwIDAgMCAwIDAgMCAgICAgICAgICAgICAgICAgICA3CisgKiAxIDEgMSAxIDEgMSAxICAgICAgICAgICAgICAgICAgIDcKKyAqIDAgMCAwIDAgMCAgICAgICAgICAgICAgICAgICAgIDUKKyovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKKyNkZWZpbmUgQ0ZTTUFYX1NJWkUgMTAwMAorI2RlZmluZSBNQVhfVElNRSAgMC4wMDUKKworI2lmZGVmIFNMRUVQVElNRQorI3VuZGVmIFNMRUVQVElNRQorI2RlZmluZSBTTEVFUFRJTUUgMC4wMDAxCisjZW5kaWYKKworaW50IHRlc3Rfb21wX2Zvcl9zY2hlZHVsZV9ndWlkZWQoKQoreworICBpbnQgKiB0aWRzOworICBpbnQgKiBjaHVua3NpemVzOworICBpbnQgbm90b3V0OworICBpbnQgbWF4aXRlcjsKKyAgaW50IHRocmVhZHM7CisgIGludCBpOworICBpbnQgcmVzdWx0OworCisgIHRpZHMgPSAoaW50ICopIG1hbGxvYyAoc2l6ZW9mIChpbnQpICogKENGU01BWF9TSVpFICsgMSkpOworICBtYXhpdGVyID0gMDsKKyAgcmVzdWx0ID0gMTsKKyAgbm90b3V0ID0gMTsKKworICAvKiBUZXN0aW5nIGlmIGVub3VnaCB0aHJlYWRzIGFyZSBhdmFpbGFibGUgZm9yIHRoaXMgY2hlY2suICovCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICB7CisgICAgICB0aHJlYWRzID0gb21wX2dldF9udW1fdGhyZWFkcygpOworICAgIH0KKyAgfQorCisgIC8qIGVuc3VyZSB0aGVyZSBhcmUgYXQgbGVhc3QgdHdvIHRocmVhZHMgKi8KKyAgaWYgKHRocmVhZHMgPCAyKSB7CisgICAgb21wX3NldF9udW1fdGhyZWFkcygyKTsKKyAgICB0aHJlYWRzID0gMjsKKyAgfQorCisgIC8qIE5vdyB0aGUgcmVhbCBwYXJhbGxlbCB3b3JrOiAgCisgICAqIEVhY2ggdGhyZWFkIHdpbGwgc3RhcnQgaW1tZWRpYXRlbHkgd2l0aCB0aGUgZmlyc3QgY2h1bmsuCisgICAqLworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQodGlkcyxtYXhpdGVyKQorICB7ICAvKiBiZWdpbiBvZiBwYXJhbGxlbCAqLworICAgIGRvdWJsZSBjb3VudDsKKyAgICBpbnQgdGlkOworICAgIGludCBqOworCisgICAgdGlkID0gb21wX2dldF90aHJlYWRfbnVtICgpOworCisgICAgI3ByYWdtYSBvbXAgZm9yIG5vd2FpdCBzY2hlZHVsZShndWlkZWQpCisgICAgZm9yKGogPSAwOyBqIDwgQ0ZTTUFYX1NJWkU7ICsraikgeworICAgICAgY291bnQgPSAwLjsKKyAgICAgICNwcmFnbWEgb21wIGZsdXNoKG1heGl0ZXIpCisgICAgICBpZiAoaiA+IG1heGl0ZXIpIHsKKyAgICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgICAgeworICAgICAgICAgIG1heGl0ZXIgPSBqOworICAgICAgICB9CisgICAgICB9CisgICAgICAvKnByaW50ZiAoInRocmVhZCAlZCBzbGVlcGluZ1xuIiwgdGlkKTsqLworICAgICAgI3ByYWdtYSBvbXAgZmx1c2gobWF4aXRlcixub3RvdXQpICAKKyAgICAgIHdoaWxlIChub3RvdXQgJiYgKGNvdW50IDwgTUFYX1RJTUUpICYmIChtYXhpdGVyID09IGopKSB7CisgICAgICAgICNwcmFnbWEgb21wIGZsdXNoKG1heGl0ZXIsbm90b3V0KQorICAgICAgICBteV9zbGVlcCAoU0xFRVBUSU1FKTsKKyAgICAgICAgY291bnQgKz0gU0xFRVBUSU1FOworI2lmZGVmIFZFUkJPU0UKKyAgICAgICAgcHJpbnRmKCIuIik7CisjZW5kaWYKKyAgICAgIH0KKyNpZmRlZiBWRVJCT1NFCisgICAgICBpZiAoY291bnQgPiAwLikgcHJpbnRmKCIgd2FpdGVkICVsZiBzXG4iLCBjb3VudCk7CisjZW5kaWYKKyAgICAgIC8qcHJpbnRmICgidGhyZWFkICVkIGF3YWtlXG4iLCB0aWQpOyovCisgICAgICB0aWRzW2pdID0gdGlkOworI2lmZGVmIFZFUkJPU0UKKyAgICAgIHByaW50ZigiJWQgZmluaXNoZWQgYnkgJWRcbiIsaix0aWQpOworI2VuZGlmCisgICAgfSAvKiBlbmQgb2YgZm9yICovCisgICAgbm90b3V0ID0gMDsKKyAgICAjcHJhZ21hIG9tcCBmbHVzaChtYXhpdGVyLG5vdG91dCkKKyAgfSAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKiBldmFsdWF0aW9uIG9mIHRoZSB2YWx1ZXMgICAgICAgICAgICAgICoKKyAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIHsKKyAgICBpbnQgZGV0ZXJtaW5lZF9jaHVua3NpemUgPSAxOworICAgIGludCBsYXN0X3RocmVhZG5yID0gdGlkc1swXTsKKyAgICBpbnQgZ2xvYmFsX2NodW5rbnIgPSAwOworICAgIGludCBvcGVud29yayA9IENGU01BWF9TSVpFOworICAgIGludCBleHBlY3RlZF9jaHVua19zaXplOworICAgIGludCogbG9jYWxfY2h1bmtuciA9IChpbnQqKW1hbGxvYyh0aHJlYWRzICogc2l6ZW9mKGludCkpOworICAgIGRvdWJsZSBjID0gMTsKKworICAgIGZvciAoaSA9IDA7IGkgPCB0aHJlYWRzOyBpKyspCisgICAgICBsb2NhbF9jaHVua25yW2ldID0gMDsKKworICAgIHRpZHNbQ0ZTTUFYX1NJWkVdID0gLTE7CisKKyAgICAvKgorICAgICAqIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIGdsb2JhbCBjaHVua3MKKyAgICAgKi8KKyAgICAvLyBmcHJpbnRmKHN0ZGVyciwiIyBnbG9iYWxfY2h1bmtuciB0aHJlYWQgbG9jYWxfY2h1bmtuciBjaHVua3NpemVcbiIpOworICAgIGZvcihpID0gMTsgaSA8PSBDRlNNQVhfU0laRTsgKytpKSB7CisgICAgICBpZiAobGFzdF90aHJlYWRucj09dGlkc1tpXSkgeyAKKyAgICAgICAgZGV0ZXJtaW5lZF9jaHVua3NpemUrKzsgCisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBmcHJpbnRmKHN0ZGVyciwgIiVkXHQlZFx0JWRcdCVkXG4iLCBnbG9iYWxfY2h1bmtuciwKKyAgICAgICAgICAgbGFzdF90aHJlYWRuciwgbG9jYWxfY2h1bmtucltsYXN0X3RocmVhZG5yXSwgbSk7ICovCisgICAgICAgIGdsb2JhbF9jaHVua25yKys7CisgICAgICAgIGxvY2FsX2NodW5rbnJbbGFzdF90aHJlYWRucl0rKzsKKyAgICAgICAgbGFzdF90aHJlYWRuciA9IHRpZHNbaV07CisgICAgICAgIGRldGVybWluZWRfY2h1bmtzaXplID0gMTsKKyAgICAgIH0KKyAgICB9CisgICAgLyogbm93IGFsbG9jYXRlIHRoZSBtZW1vcnkgZm9yIHNhdmluZyB0aGUgc2l6ZXMgb2YgdGhlIGdsb2JhbCBjaHVua3MgKi8KKyAgICBjaHVua3NpemVzID0gKGludCopbWFsbG9jKGdsb2JhbF9jaHVua25yICogc2l6ZW9mKGludCkpOworCisgICAgLyoKKyAgICAqIEV2YWx1YXRlIHRoZSBzaXplcyBvZiB0aGUgZ2xvYmFsIGNodW5rcworICAgICovCisgICAgZ2xvYmFsX2NodW5rbnIgPSAwOworICAgIGRldGVybWluZWRfY2h1bmtzaXplID0gMTsKKyAgICBsYXN0X3RocmVhZG5yID0gdGlkc1swXTsgICAgCisgICAgZm9yIChpID0gMTsgaSA8PSBDRlNNQVhfU0laRTsgKytpKSB7CisgICAgICAvKiBJZiB0aGUgdGhyZWFkbnVtYmVyIHdhcyB0aGUgc2FtZSBhcyBiZWZvcmUgaW5jcmVhc2UgdGhlCisgICAgICAgKiBkZXRlY3RlZCBjaHVua3NpemUgZm9yIHRoaXMgY2h1bmsgb3RoZXJ3aXNlIHNldCB0aGUgZGV0ZWN0ZWQgCisgICAgICAgKiBjaHVua3NpemUgYWdhaW4gdG8gb25lIGFuZCBzYXZlIHRoZSBudW1iZXIgb2YgdGhlIG5leHQgCisgICAgICAgKiB0aHJlYWQgaW4gbGFzdF90aHJlYWRuci4gCisgICAgICAgKi8KKyAgICAgIGlmIChsYXN0X3RocmVhZG5yID09IHRpZHNbaV0pIHsgCisgICAgICAgIGRldGVybWluZWRfY2h1bmtzaXplKys7IAorICAgICAgfSBlbHNlIHsKKyAgICAgICAgY2h1bmtzaXplc1tnbG9iYWxfY2h1bmtucl0gPSBkZXRlcm1pbmVkX2NodW5rc2l6ZTsKKyAgICAgICAgZ2xvYmFsX2NodW5rbnIrKzsKKyAgICAgICAgbG9jYWxfY2h1bmtucltsYXN0X3RocmVhZG5yXSsrOworICAgICAgICBsYXN0X3RocmVhZG5yID0gdGlkc1tpXTsKKyAgICAgICAgZGV0ZXJtaW5lZF9jaHVua3NpemUgPSAxOworICAgICAgfQorICAgIH0KKworI2lmZGVmIFZFUkJPU0UKKyAgICBmcHJpbnRmKHN0ZGVyciwgImZvdW5kXHRleHBlY3RlZFx0Y29uc3RhbnRcbiIpOworI2VuZGlmCisKKyAgICAvKiBpZGVudGlmeSB0aGUgY29uc3RhbnQgYyBmb3IgdGhlIGV4cG9uZW50aWFsIAorICAgICAgIGRlY3JlYXNlIG9mIHRoZSBjaHVua3NpemUgKi8KKyAgICBleHBlY3RlZF9jaHVua19zaXplID0gb3BlbndvcmsgLyB0aHJlYWRzOworICAgIGMgPSAoZG91YmxlKSBjaHVua3NpemVzWzBdIC8gZXhwZWN0ZWRfY2h1bmtfc2l6ZTsKKyAgICAKKyAgICBmb3IgKGkgPSAwOyBpIDwgZ2xvYmFsX2NodW5rbnI7IGkrKykgeworICAgICAgLyogY2FsY3VsYXRlIHRoZSBuZXcgZXhwZWN0ZWQgY2h1bmtzaXplICovCisgICAgICBpZiAoZXhwZWN0ZWRfY2h1bmtfc2l6ZSA+IDEpIAorICAgICAgICBleHBlY3RlZF9jaHVua19zaXplID0gYyAqIG9wZW53b3JrIC8gdGhyZWFkczsKKyNpZmRlZiBWRVJCT1NFCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiU4ZFx0JThkXHQlbGZcbiIsIGNodW5rc2l6ZXNbaV0sCisgICAgICAgIGV4cGVjdGVkX2NodW5rX3NpemUsIGMgKiBjaHVua3NpemVzW2ldL2V4cGVjdGVkX2NodW5rX3NpemUpOworI2VuZGlmCisgICAgICAvKiBjaGVjayBpZiBjaHVua3NpemUgaXMgaW5zaWRlIHRoZSByb3VuZGluZyBlcnJvcnMgKi8KKyAgICAgIGlmIChhYnMgKGNodW5rc2l6ZXNbaV0gLSBleHBlY3RlZF9jaHVua19zaXplKSA+PSAyKSB7CisgICAgICAgIHJlc3VsdCA9IDA7CisjaWZuZGVmIFZFUkJPU0UKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDaHVua3NpemUgZGlmZmVyZWQgZnJvbSBleHBlY3RlZCAiCisgICAgICAgICAgInZhbHVlOiAlZCBpbnN0ZWFkIG9mICVkXG4iLCBjaHVua3NpemVzW2ldLAorICAgICAgICAgIGV4cGVjdGVkX2NodW5rX3NpemUpOworICAgICAgICByZXR1cm4gMDsKKyNlbmRpZgorICAgICAgfSAvKiBlbmQgaWYgKi8KKworI2lmbmRlZiBWRVJCT1NFCisgICAgICBpZiAoZXhwZWN0ZWRfY2h1bmtfc2l6ZSAtIGNodW5rc2l6ZXNbaV0gPCAwKQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNodW5rc2l6ZSBkaWQgbm90IGRlY3JlYXNlOiAlZCIKKyAgICAgICAgICAiIGluc3RlYWQgb2YgJWRcbiIsIGNodW5rc2l6ZXNbaV0sZXhwZWN0ZWRfY2h1bmtfc2l6ZSk7CisjZW5kaWYKKworICAgICAgLyogY2FsY3VsYXRpbmcgdGhlIHJlbWFpbmluZyBhbW91bnQgb2Ygd29yayAqLworICAgICAgb3BlbndvcmsgLT0gY2h1bmtzaXplc1tpXTsKKyAgICB9ICAKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfZm9yX3NjaGVkdWxlX2d1aWRlZCgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX3NjaGVkdWxlX3N0YXRpYy5jIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX3NjaGVkdWxlX3N0YXRpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYjhiZmYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3Jfc2NoZWR1bGVfc3RhdGljLmMKQEAgLTAsMCArMSwxNTUgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworI2RlZmluZSBDRlNNQVhfU0laRSAxMDAwCisjZGVmaW5lIE1BWF9USU1FIDAuMDEKKworI2lmZGVmIFNMRUVQVElNRQorI3VuZGVmIFNMRUVQVElNRQorI2RlZmluZSBTTEVFUFRJTUUgMC4wMDA1CisjZW5kaWYKKworaW50IHRlc3Rfb21wX2Zvcl9zY2hlZHVsZV9zdGF0aWMoKQoreworICBpbnQgdGhyZWFkczsKKyAgaW50IGksbGFzdHRpZDsKKyAgaW50ICogdGlkczsKKyAgaW50IG5vdG91dDsKKyAgaW50IG1heGl0ZXI7CisgIGludCBjaHVua19zaXplOworICBpbnQgY291bnRlciA9IDA7CisgIGludCB0bXBfY291bnQ9MTsKKyAgaW50IGxhc3R0aHJlYWRzc3RhcnR0aWQgPSAtMTsKKyAgaW50IHJlc3VsdCA9IDE7CisKKyAgY2h1bmtfc2l6ZSA9IDc7CisgIHRpZHMgPSAoaW50ICopIG1hbGxvYyAoc2l6ZW9mIChpbnQpICogKENGU01BWF9TSVpFICsgMSkpOworICBub3RvdXQgPSAxOworICBtYXhpdGVyID0gMDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQodGlkcyxjb3VudGVyKQorICB7ICAvKiBiZWdpbiBvZiBwYXJhbGxlbCovCisgICAgI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgeworICAgICAgdGhyZWFkcyA9IG9tcF9nZXRfbnVtX3RocmVhZHMgKCk7CisgICAgfSAgLyogZW5kIG9mIHNpbmdsZSAqLworICB9ICAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworICBpZiAodGhyZWFkcyA8IDIpIHsKKyAgICBvbXBfc2V0X251bV90aHJlYWRzKDIpOworICAgIHRocmVhZHMgPSAyOworICB9CisgIGZwcmludGYgKHN0ZGVyciwiVXNpbmcgYW4gaW50ZXJuYWwgY291bnQgb2YgJWRcblVzaW5nIGEgc3BlY2lmaWVkIgorICAgICIgY2h1bmtzaXplIG9mICVkXG4iLCBDRlNNQVhfU0laRSwgY2h1bmtfc2l6ZSk7CisgIHRpZHNbQ0ZTTUFYX1NJWkVdID0gLTE7ICAvKiBzZXR0aW5nIGVuZGZsYWcgKi8KKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKHRpZHMpCisgIHsgLyogYmVnaW4gb2YgcGFyYWxsZWwgKi8KKyAgICBkb3VibGUgY291bnQ7CisgICAgaW50IHRpZDsKKyAgICBpbnQgajsKKworICAgIHRpZCA9IG9tcF9nZXRfdGhyZWFkX251bSAoKTsKKworICAgICNwcmFnbWEgb21wIGZvciBub3dhaXQgc2NoZWR1bGUoc3RhdGljLGNodW5rX3NpemUpCisgICAgZm9yKGogPSAwOyBqIDwgQ0ZTTUFYX1NJWkU7ICsraikgeworICAgICAgY291bnQgPSAwLjsKKyAgICAgICNwcmFnbWEgb21wIGZsdXNoKG1heGl0ZXIpCisgICAgICBpZiAoaiA+IG1heGl0ZXIpIHsKKyAgICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgICAgeworICAgICAgICAgIG1heGl0ZXIgPSBqOworICAgICAgICB9CisgICAgICB9CisgICAgICAvKnByaW50ZiAoInRocmVhZCAlZCBzbGVlcGluZ1xuIiwgdGlkKTsqLworICAgICAgd2hpbGUgKG5vdG91dCAmJiAoY291bnQgPCBNQVhfVElNRSkgJiYgKG1heGl0ZXIgPT0gaikpIHsKKyAgICAgICAgI3ByYWdtYSBvbXAgZmx1c2gobWF4aXRlcixub3RvdXQpCisgICAgICAgIG15X3NsZWVwIChTTEVFUFRJTUUpOworICAgICAgICBjb3VudCArPSBTTEVFUFRJTUU7CisgICAgICAgIHByaW50ZigiLiIpOworICAgICAgfQorI2lmZGVmIFZFUkJPU0UKKyAgICAgIGlmIChjb3VudCA+IDAuKSBwcmludGYoIiB3YWl0ZWQgJWxmIHNcbiIsIGNvdW50KTsKKyNlbmRpZgorICAgICAgLypwcmludGYgKCJ0aHJlYWQgJWQgYXdha2VcbiIsIHRpZCk7Ki8KKyAgICAgIHRpZHNbal0gPSB0aWQ7CisjaWZkZWYgVkVSQk9TRQorICAgICAgcHJpbnRmKCIlZCBmaW5pc2hlZCBieSAlZFxuIixqLHRpZCk7CisjZW5kaWYKKyAgICB9IC8qIGVuZCBvZiBmb3IgKi8KKyAgICBub3RvdXQgPSAwOworICAgICNwcmFnbWEgb21wIGZsdXNoKG1heGl0ZXIsbm90b3V0KQorICB9IC8qIGVuZCBvZiBwYXJhbGxlbCAqLworCisgIC8qKioqIGFuYWx5c2luZyB0aGUgZGF0YSBpbiBhcnJheSB0aWRzICoqKiovCisKKyAgbGFzdHRpZCA9IHRpZHNbMF07CisgIHRtcF9jb3VudCA9IDA7IAorCisgIGZvciAoaSA9IDA7IGkgPCBDRlNNQVhfU0laRSArIDE7ICsraSkgeworICAgIC8qIElmIHRoZSB3b3JrICB3YXMgZG9uZSBieSB0aGUgc2FtZSB0aHJlYWQgaW5jcmVhc2UgdG1wX2NvdW50IGJ5IG9uZS4gKi8KKyAgICBpZiAodGlkc1tpXSA9PSBsYXN0dGlkKSB7CisgICAgICB0bXBfY291bnQrKzsKKyNpZmRlZiBWRVJCT1NFCisgICAgICBmcHJpbnRmIChzdGRlcnIsICIlZDogJWQgXG4iLCBpLCB0aWRzW2ldKTsKKyNlbmRpZgorICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLyogQ2hlY2sgaWYgdGhlIG5leHQgdGhyZWFkIGhhZCBoYXMgdGhlIHJpZ2h0IHRocmVhZCBudW1iZXIuIFdoZW4gZmluZGluZyAKKyAgICAgKiB0aHJlYWRudW1iZXIgLTEgdGhlIGVuZCBzaG91bGQgYmUgcmVhY2hlZC4gCisgICAgICovICAgIAorICAgIGlmICh0aWRzW2ldID09IChsYXN0dGlkICsgMSkgJSB0aHJlYWRzIHx8IHRpZHNbaV0gPT0gLTEpIHsKKyAgICAgIC8qIGNoZWNraW5nIGZvciB0aGUgcmlnaHQgY2h1bmsgc2l6ZSAqLworICAgICAgaWYgKHRtcF9jb3VudCA9PSBjaHVua19zaXplKSB7CisgICAgICAgIHRtcF9jb3VudCA9IDE7CisgICAgICAgIGxhc3R0aWQgPSB0aWRzW2ldOworI2lmZGVmIFZFUkJPU0UKKyAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiT0tcbiIpOworI2VuZGlmCisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBJZiB0aGUgY2h1bmsgc2l6ZSB3YXMgd3JvbmcsIGNoZWNrIGlmIHRoZSBlbmQgd2FzIHJlYWNoZWQgKi8KKyAgICAgICAgaWYgKHRpZHNbaV0gPT0gLTEpIHsKKyAgICAgICAgICBpZiAoaSA9PSBDRlNNQVhfU0laRSkgeworICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiTGFzdCB0aHJlYWQgaGFkIGNodW5rIHNpemUgJWRcbiIsCisgICAgICAgICAgICAgIHRtcF9jb3VudCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRVJST1I6IExhc3QgdGhyZWFkICh0aHJlYWQgd2l0aCIKKyAgICAgICAgICAgICAgIiBudW1iZXIgLTEpIHdhcyBmb3VuZCBiZWZvcmUgdGhlIGVuZC5cbiIpOworICAgICAgICAgICAgcmVzdWx0ID0gMDsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRVJST1I6IGNodW5rIHNpemUgd2FzICVkLiAoYXNzaWduZWQiCisgICAgICAgICAgICAiIHdhcyAlZClcbiIsIHRtcF9jb3VudCwgY2h1bmtfc2l6ZSk7CisgICAgICAgICAgcmVzdWx0ID0gMDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBGb3VuZCB0aHJlYWQgd2l0aCBudW1iZXIgJWQgKHNob3VsZCBiZSIKKyAgICAgICAgIiBpbmJldHdlZW4gMCBhbmQgJWQpLiIsIHRpZHNbaV0sIHRocmVhZHMgLSAxKTsKKyAgICAgIHJlc3VsdCA9IDA7CisgICAgfQorI2lmZGVmIFZFUkJPU0UKKyAgICBmcHJpbnRmIChzdGRlcnIsICIlZDogJWQgXG4iLCBpLCB0aWRzW2ldKTsKKyNlbmRpZgorICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX2Zvcl9zY2hlZHVsZV9zdGF0aWMoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9zY2hlZHVsZV9zdGF0aWNfMy5jIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX3NjaGVkdWxlX3N0YXRpY18zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk5ODBkNAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9zY2hlZHVsZV9zdGF0aWNfMy5jCkBAIC0wLDAgKzEsMjAzIEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKKyNkZWZpbmUgQ0ZTTUFYX1NJWkUgMTAwMAorI2RlZmluZSBNQVhfVElNRSAwLjAxCisKKyNpZmRlZiBTTEVFUFRJTUUKKyN1bmRlZiBTTEVFUFRJTUUKKyNkZWZpbmUgU0xFRVBUSU1FIDAuMDAwNQorI2VuZGlmCisKKyNkZWZpbmUgVkVSQk9TRSAwCisKK2ludCB0ZXN0X29tcF9mb3Jfc2NoZWR1bGVfc3RhdGljXzMoKQoreworICBpbnQgdGhyZWFkczsKKyAgaW50IGksbGFzdHRpZDsKKworICBpbnQgKiB0aWRzOworICBpbnQgKiB0aWRzMjsKKyAgaW50IG5vdG91dDsKKyAgaW50IG1heGl0ZXI7CisgIGludCBjaHVua19zaXplOworCisgIGludCBjb3VudGVyID0gMDsKKyAgaW50IHRtcF9jb3VudD0xOworICBpbnQgbGFzdHRocmVhZHNzdGFydHRpZCA9IC0xOworICBpbnQgcmVzdWx0ID0gMTsKKyAgY2h1bmtfc2l6ZSA9IDc7CisKKyAgdGlkcyA9IChpbnQgKikgbWFsbG9jIChzaXplb2YgKGludCkgKiAoQ0ZTTUFYX1NJWkUgKyAxKSk7CisgIG5vdG91dCA9IDE7CisgIG1heGl0ZXIgPSAwOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHNoYXJlZCh0aWRzLGNvdW50ZXIpCisgIHsgIC8qIGJlZ2luIG9mIHBhcmFsbGVsKi8KKyAgICAjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICB7CisgICAgICB0aHJlYWRzID0gb21wX2dldF9udW1fdGhyZWFkcyAoKTsKKyAgICB9ICAvKiBlbmQgb2Ygc2luZ2xlICovCisgIH0gIC8qIGVuZCBvZiBwYXJhbGxlbCAqLworCisgIC8qIEVuc3VyZSB0aGF0IGF0IGxlYXN0IHR3byB0aHJlYWRzIGFyZSBjcmVhdGVkICovCisgIGlmICh0aHJlYWRzIDwgMikgeworICAgIG9tcF9zZXRfbnVtX3RocmVhZHMoMik7CisgICAgdGhyZWFkcyA9IDI7CisgIH0gCisgIGZwcmludGYgKHN0ZGVyciwiVXNpbmcgYW4gaW50ZXJuYWwgY291bnQgb2YgJWRcblVzaW5nIGEiCisgICAgIiBzcGVjaWZpZWQgY2h1bmtzaXplIG9mICVkXG4iLCBDRlNNQVhfU0laRSwgY2h1bmtfc2l6ZSk7CisgIHRpZHNbQ0ZTTUFYX1NJWkVdID0gLTE7ICAvKiBzZXR0aW5nIGVuZGZsYWcgKi8KKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQodGlkcykKKyAgeyAgLyogYmVnaW4gb2YgcGFyYWxsZWwgKi8KKyAgICBkb3VibGUgY291bnQ7CisgICAgaW50IHRpZDsKKyAgICBpbnQgajsKKworICAgIHRpZCA9IG9tcF9nZXRfdGhyZWFkX251bSAoKTsKKworICAgICNwcmFnbWEgb21wIGZvciBub3dhaXQgc2NoZWR1bGUoc3RhdGljLGNodW5rX3NpemUpCisgICAgZm9yKGogPSAwOyBqIDwgQ0ZTTUFYX1NJWkU7ICsraikgeworICAgICAgY291bnQgPSAwLjsKKyAgICAgICNwcmFnbWEgb21wIGZsdXNoKG1heGl0ZXIpCisgICAgICBpZiAoaiA+IG1heGl0ZXIpIHsKKyAgICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgICAgeworICAgICAgICAgIG1heGl0ZXIgPSBqOworICAgICAgICB9CisgICAgICB9CisgICAgICAvKnByaW50ZiAoInRocmVhZCAlZCBzbGVlcGluZ1xuIiwgdGlkKTsqLworICAgICAgd2hpbGUgKG5vdG91dCAmJiAoY291bnQgPCBNQVhfVElNRSkgJiYgKG1heGl0ZXIgPT0gaikpIHsKKyAgICAgICAgI3ByYWdtYSBvbXAgZmx1c2gobWF4aXRlcixub3RvdXQpCisgICAgICAgIG15X3NsZWVwIChTTEVFUFRJTUUpOworICAgICAgICBjb3VudCArPSBTTEVFUFRJTUU7CisgICAgICAgIHByaW50ZigiLiIpOworICAgICAgfQorI2lmZGVmIFZFUkJPU0UKKyAgICAgIGlmIChjb3VudCA+IDAuKSBwcmludGYoIiB3YWl0ZWQgJWxmIHNcbiIsIGNvdW50KTsKKyNlbmRpZgorICAgICAgLypwcmludGYgKCJ0aHJlYWQgJWQgYXdha2VcbiIsIHRpZCk7Ki8KKyAgICAgIHRpZHNbal0gPSB0aWQ7CisjaWZkZWYgVkVSQk9TRQorICAgICAgcHJpbnRmKCIlZCBmaW5pc2hlZCBieSAlZFxuIixqLHRpZCk7CisjZW5kaWYKKyAgICB9IC8qIGVuZCBvZiBvbXAgcGFyYWxsZWwgZm9yICovCisKKyAgICBub3RvdXQgPSAwOworICAgICNwcmFnbWEgb21wIGZsdXNoKG1heGl0ZXIsbm90b3V0KQorICB9IC8qIGVuZCBvZiBwYXJhbGxlbCAqLworCisgIC8qKioqIGFuYWx5c2luZyB0aGUgZGF0YSBpbiBhcnJheSB0aWRzICoqKiovCisKKyAgbGFzdHRpZCA9IHRpZHNbMF07CisgIHRtcF9jb3VudCA9IDA7IAorCisgIGZvciAoaSA9IDA7IGkgPCBDRlNNQVhfU0laRSArIDE7ICsraSkgeworICAgIC8qIElmIHRoZSB3b3JrICB3YXMgZG9uZSBieSB0aGUgc2FtZSB0aHJlYWQgCisgICAgICAgaW5jcmVhc2UgdG1wX2NvdW50IGJ5IG9uZS4gKi8KKyAgICBpZiAodGlkc1tpXSA9PSBsYXN0dGlkKSB7CisgICAgICB0bXBfY291bnQrKzsKKyNpZmRlZiBWRVJCT1NFCisgICAgICBmcHJpbnRmIChzdGRlcnIsICIlZDogJWQgXG4iLCBpLCB0aWRzW2ldKTsKKyNlbmRpZgorICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLyogQ2hlY2sgaWYgdGhlIG5leHQgdGhyZWFkIGhhZCBoYXMgdGhlIHJpZ2h0IHRocmVhZCBudW1iZXIuIAorICAgICAqIFdoZW4gZmluZGluZyB0aHJlYWRudW1iZXIgLTEgdGhlIGVuZCBzaG91bGQgYmUgcmVhY2hlZC4gCisgICAgICovICAgIAorICAgIGlmICh0aWRzW2ldID09IChsYXN0dGlkICsgMSkgJSB0aHJlYWRzIHx8IHRpZHNbaV0gPT0gLTEpIHsKKyAgICAgIC8qIGNoZWNraW5nIGZvciB0aGUgcmlnaHQgY2h1bmsgc2l6ZSAqLworICAgICAgaWYgKHRtcF9jb3VudCA9PSBjaHVua19zaXplKSB7CisgICAgICAgIHRtcF9jb3VudCA9IDE7CisgICAgICAgIGxhc3R0aWQgPSB0aWRzW2ldOworI2lmZGVmIFZFUkJPU0UKKyAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiT0tcbiIpOworI2VuZGlmCisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBJZiB0aGUgY2h1bmsgc2l6ZSB3YXMgd3JvbmcsIGNoZWNrIGlmIHRoZSBlbmQgd2FzIHJlYWNoZWQgKi8KKyAgICAgICAgaWYgKHRpZHNbaV0gPT0gLTEpIHsKKyAgICAgICAgICBpZiAoaSA9PSBDRlNNQVhfU0laRSkgeworICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiTGFzdCB0aHJlYWQgaGFkIGNodW5rIHNpemUgJWRcbiIsCisgICAgICAgICAgICAgIHRtcF9jb3VudCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRVJST1I6IExhc3QgdGhyZWFkICh0aHJlYWQgd2l0aCIKKyAgICAgICAgICAgICAgIiBudW1iZXIgLTEpIHdhcyBmb3VuZCBiZWZvcmUgdGhlIGVuZC5cbiIpOworICAgICAgICAgICAgcmVzdWx0ID0gMDsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRVJST1I6IGNodW5rIHNpemUgd2FzICVkLiAoYXNzaWduZWQiCisgICAgICAgICAgICAiIHdhcyAlZClcbiIsIHRtcF9jb3VudCwgY2h1bmtfc2l6ZSk7CisgICAgICAgICAgcmVzdWx0ID0gMDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBGb3VuZCB0aHJlYWQgd2l0aCBudW1iZXIgJWQgKHNob3VsZCBiZSIKKyAgICAgICAgIiBpbmJldHdlZW4gMCBhbmQgJWQpLiIsIHRpZHNbaV0sIHRocmVhZHMgLSAxKTsKKyAgICAgIHJlc3VsdCA9IDA7CisgICAgfQorI2lmZGVmIFZFUkJPU0UKKyAgICBmcHJpbnRmIChzdGRlcnIsICIlZDogJWQgXG4iLCBpLCB0aWRzW2ldKTsKKyNlbmRpZgorICB9CisKKyAgLyogTm93IHdlIGNoZWNrIGlmIHNldmVyYWwgbG9vcCByZWdpb25zIGluIG9uZSBwYXJhbGxlbCByZWdpb24gaGF2ZSB0aGUKKyAgICogc2FtZSBsb2dpY2FsIGFzc2lnbmVtZW50IG9mIGNodW5rcyB0byB0aHJlYWRzLiBXZSB1c2UgdGhlIG5vd2FpdCAKKyAgICogY2xhdXNlIHRvIGluY3JlYXNlIHRoZSBwcm9iYWJpbGl0eSB0byBnZXQgYW4gZXJyb3IuICovCisKKyAgLyogRmlyc3Qgd2UgYWxsb2NhdGUgc29tZSBtb3JlIG1lbW1vcnkgKi8KKyAgZnJlZSAodGlkcyk7CisgIHRpZHMgPSAoaW50ICopIG1hbGxvYyAoc2l6ZW9mIChpbnQpICogTE9PUENPVU5UKTsKKyAgdGlkczIgPSAoaW50ICopIG1hbGxvYyAoc2l6ZW9mIChpbnQpICogTE9PUENPVU5UKTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgeworICAgIHsKKyAgICAgIGludCBuOworICAgICAgI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKHN0YXRpYykgbm93YWl0CisgICAgICBmb3IgKG4gPSAwOyBuIDwgTE9PUENPVU5UOyBuKyspIHsKKyAgICAgICAgaWYgKExPT1BDT1VOVCA9PSBuICsgMSApCisgICAgICAgICAgbXlfc2xlZXAoU0xFRVBUSU1FKTsKKworICAgICAgICB0aWRzW25dID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICB9CisgICAgfQorICAgIHsKKyAgICAgIGludCBtOworICAgICAgI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKHN0YXRpYykgbm93YWl0CisgICAgICBmb3IgKG0gPSAxOyBtIDw9IExPT1BDT1VOVDsgbSsrKSB7CisgICAgICAgIHRpZHMyW20tMV0gPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspCisgIGlmICh0aWRzW2ldICE9IHRpZHMyW2ldKSB7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiQ2h1bmsgbm8uICVkIHdhcyBhc3NpZ25lZCBvbmNlIHRvIHRocmVhZCAlZCBhbmQiCisgICAgICAiIGxhdGVyIHRvIHRocmVhZCAlZC5cbiIsIGksIHRpZHNbaV0sdGlkczJbaV0pOworICAgIHJlc3VsdCA9IDA7CisgIH0KKworICBmcmVlICh0aWRzKTsKKyAgZnJlZSAodGlkczIpOworICByZXR1cm4gcmVzdWx0OworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvciAoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX2Zvcl9zY2hlZHVsZV9zdGF0aWNfMygpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfcGFyYWxsZWxfZm9yX2ZpcnN0cHJpdmF0ZS5jIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfcGFyYWxsZWxfZm9yX2ZpcnN0cHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiM2JmN2QKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9wYXJhbGxlbF9mb3JfZmlyc3Rwcml2YXRlLmMKQEAgLTAsMCArMSwzNSBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfZm9yX2ZpcnN0cHJpdmF0ZSgpCit7CisgIGludCBzdW0gOworICBpbnQgaTI7CisgIGludCBpOworICBpbnQga25vd25fc3VtOworCisgIHN1bT0wOworICBpMj0zOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciByZWR1Y3Rpb24oKzpzdW0pIHByaXZhdGUoaSkgZmlyc3Rwcml2YXRlKGkyKQorICBmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKSB7CisgICAgc3VtID0gc3VtICsgKGkgKyBpMik7CisgIH0KKworICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDIgKyBpMiAqIExPT1BDT1VOVDsKKyAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKK30gLyogZW5kIG9mIGNoZWNrX3BhcmFsbGVsX2Zvcl9maXN0cHJpdmF0ZSAqLworCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfcGFyYWxsZWxfZm9yX2ZpcnN0cHJpdmF0ZSgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfcGFyYWxsZWxfZm9yX2lmLmMgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9wYXJhbGxlbF9mb3JfaWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2ZlNDk4Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfcGFyYWxsZWxfZm9yX2lmLmMKQEAgLTAsMCArMSw0MiBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IHRlc3Rfb21wX3BhcmFsbGVsX2Zvcl9pZigpCit7CisgIGludCBrbm93bl9zdW07CisgIGludCBudW1fdGhyZWFkczsKKyAgaW50IHN1bSwgc3VtMjsKKyAgaW50IGk7CisgIGludCBjb250cm9sOworCisgIGNvbnRyb2wgPSAwOworICBudW1fdGhyZWFkcz0wOworICBzdW0gPSAwOworICBzdW0yID0gMDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3IgcHJpdmF0ZShpKSBpZiAoY29udHJvbD09MSkKKyAgZm9yIChpPTA7IGkgPD0gTE9PUENPVU5UOyBpKyspIHsKKyAgICBudW1fdGhyZWFkcyA9IG9tcF9nZXRfbnVtX3RocmVhZHMoKTsKKyAgICBzdW0gPSBzdW0gKyBpOworICB9CisKKyAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyOworICBmcHJpbnRmKHN0ZGVyciwgIk51bWJlciBvZiB0aHJlYWRzIGRldGVybWluZWQgYnkiCisgICAgIiBvbXBfZ2V0X251bV90aHJlYWRzOiAlZFxuIiwgbnVtX3RocmVhZHMpOworICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0gJiYgbnVtX3RocmVhZHMgPT0gMSk7Cit9IC8qIGVuZCBvZiBjaGVja19wYXJhbGxlbF9mb3JfcHJpdmF0ZSAqLworCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfcGFyYWxsZWxfZm9yX2lmKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9wYXJhbGxlbF9mb3JfbGFzdHByaXZhdGUuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX3BhcmFsbGVsX2Zvcl9sYXN0cHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1M2NmYjIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9wYXJhbGxlbF9mb3JfbGFzdHByaXZhdGUuYwpAQCAtMCwwICsxLDM3IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9mb3JfbGFzdHByaXZhdGUoKQoreworICBpbnQgc3VtOworICBpbnQgaTsKKyAgaW50IGkwOworICBpbnQga25vd25fc3VtOworCisgIHN1bSA9MDsKKyAgaTAgPSAtMTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3IgcmVkdWN0aW9uKCs6c3VtKSBcCisgICAgc2NoZWR1bGUoc3RhdGljLDcpIHByaXZhdGUoaSkgbGFzdHByaXZhdGUoaTApCisgIGZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspIHsKKyAgICBzdW0gPSBzdW0gKyBpOworICAgIGkwID0gaTsKKyAgfSAvKiBlbmQgb2YgcGFyYWxsZWwgZm9yICovCisKKyAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyOworICByZXR1cm4gKChrbm93bl9zdW0gPT0gc3VtKSAmJiAoaTAgPT0gTE9PUENPVU5UKSk7Cit9IC8qIGVuZCBvZiBjaGVja19wYXJhbGxlbF9mb3JfbGFzdHByaXZhdGUgKi8KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3BhcmFsbGVsX2Zvcl9sYXN0cHJpdmF0ZSgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfcGFyYWxsZWxfZm9yX29yZGVyZWQuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX3BhcmFsbGVsX2Zvcl9vcmRlcmVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJjYzk3YgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX3BhcmFsbGVsX2Zvcl9vcmRlcmVkLmMKQEAgLTAsMCArMSw2NCBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitzdGF0aWMgaW50IGxhc3RfaSA9IDA7CisKK2ludCBpOworI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShpKQorCisvKiBWYXJpYWJsZSBpaSBpcyB1c2VkIHRvIGF2b2lkIHByb2JsZW1zIHdpdGggYSB0aHJlYWRwcml2YXRlIHZhcmlhYmxlIHVzZWQgYXMgYSBsb29wCisgKiBpbmRleC4gU2VlIHRlc3Qgb21wX3RocmVhZHByaXZhdGVfZm9yLgorICovCitzdGF0aWMgaW50IGlpOworI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShpaSkKKworLyohIAorICBVdGlsaXR5IGZ1bmN0aW9uOiByZXR1cm5zIHRydWUgaWYgdGhlIHBhc3NlZCBhcmd1bWVudCBpcyBsYXJnZXIgdGhhbiAKKyAgdGhlIGFyZ3VtZW50IG9mIHRoZSBsYXN0IGNhbGwgb2YgdGhpcyBmdW5jdGlvbi4KKyAqLworc3RhdGljIGludCBjaGVja19pX2lzbGFyZ2VyMihpbnQgaSkKK3sKKyAgaW50IGlzbGFyZ2VyOworICBpc2xhcmdlciA9IChpID4gbGFzdF9pKTsKKyAgbGFzdF9pID0gaTsKKyAgcmV0dXJuIChpc2xhcmdlcik7Cit9CisKK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9mb3Jfb3JkZXJlZCgpCit7CisgIGludCBzdW07CisgIGludCBpc19sYXJnZXI7CisgIGludCBrbm93bl9zdW07CisgIGludCBpOworCisgIHN1bSA9IDA7CisgIGlzX2xhcmdlciA9IDE7CisgIGxhc3RfaSA9IDA7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShzdGF0aWMsMSkgcHJpdmF0ZShpKSBvcmRlcmVkCisgIGZvciAoaSA9IDE7IGkgPCAxMDA7IGkrKykgeworICAgIGlpID0gaTsKKyAgICAjcHJhZ21hIG9tcCBvcmRlcmVkCisgICAgeworICAgICAgaXNfbGFyZ2VyID0gY2hlY2tfaV9pc2xhcmdlcjIgKGlpKSAmJiBpc19sYXJnZXI7CisgICAgICBzdW0gID0gc3VtICsgaWk7CisgICAgfQorICB9CisgIGtub3duX3N1bSA9ICg5OSAqIDEwMCkgLyAyOworICBmcHJpbnRmIChzdGRlcnIsIiBrbm93bl9zdW0gPSAlZCAsIHN1bSA9ICVkIFxuIiwga25vd25fc3VtLCBzdW0pOworICBmcHJpbnRmIChzdGRlcnIsIiBpc19sYXJnZXIgPSAlZFxuIiwgaXNfbGFyZ2VyKTsKKyAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKSAmJiBpc19sYXJnZXI7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9wYXJhbGxlbF9mb3Jfb3JkZXJlZCgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfcGFyYWxsZWxfZm9yX3ByaXZhdGUuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX3BhcmFsbGVsX2Zvcl9wcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIzMWQzNgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX3BhcmFsbGVsX2Zvcl9wcml2YXRlLmMKQEAgLTAsMCArMSw1MCBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworLyohIFV0aWxpdHkgZnVuY3Rpb24gdG8gc3BlbmQgc29tZSB0aW1lIGluIGEgbG9vcCAqLworc3RhdGljIHZvaWQgZG9fc29tZV93b3JrICh2b2lkKQoreworICBpbnQgaTsKKyAgZG91YmxlIHN1bSA9IDA7CisgIGZvcihpID0gMDsgaSA8IDEwMDA7IGkrKyl7CisgICAgc3VtICs9IHNxcnQgKGkpOworICB9Cit9CisKK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9mb3JfcHJpdmF0ZSgpCit7CisgIGludCBzdW07CisgIGludCBpOworICBpbnQgaTI7CisgIGludCBrbm93bl9zdW07CisKKyAgc3VtID0wOworICBpMj0wOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciByZWR1Y3Rpb24oKzpzdW0pIHNjaGVkdWxlKHN0YXRpYywxKSBwcml2YXRlKGkpIHByaXZhdGUoaTIpCisgIGZvciAoaT0xO2k8PUxPT1BDT1VOVDtpKyspCisgIHsKKyAgICBpMiA9IGk7CisgICAgI3ByYWdtYSBvbXAgZmx1c2gKKyAgICBkb19zb21lX3dvcmsgKCk7CisgICAgI3ByYWdtYSBvbXAgZmx1c2gKKyAgICBzdW0gPSBzdW0gKyBpMjsKKyAgfSAvKmVuZCBvZiBmb3IqLworICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7Cit9IC8qIGVuZCBvZiBjaGVja19wYXJhbGxlbF9mb3JfcHJpdmF0ZSAqLworCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfcGFyYWxsZWxfZm9yX3ByaXZhdGUoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX3BhcmFsbGVsX2Zvcl9yZWR1Y3Rpb24uYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX3BhcmFsbGVsX2Zvcl9yZWR1Y3Rpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWY4NTU1Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfcGFyYWxsZWxfZm9yX3JlZHVjdGlvbi5jCkBAIC0wLDAgKzEsMjY2IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisjZGVmaW5lIERPVUJMRV9ESUdJVFMgMjAgICAgLyogZHReRE9VQkxFX0RJR0lUUyAqLworI2RlZmluZSBNQVhfRkFDVE9SIDEwCisjZGVmaW5lIEtOT1dOX1BST0RVQ1QgMzYyODgwMCAgLyogMTAhICovCisKK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9mb3JfcmVkdWN0aW9uKCkKK3sKKyAgaW50IHN1bTsKKyAgaW50IGtub3duX3N1bTsKKyAgZG91YmxlIGRzdW07CisgIGRvdWJsZSBka25vd25fc3VtOworICBkb3VibGUgZHQ9MC41OyAgLyogYmFzZSBvZiBnZW9tZXRyaWMgcm93IGZvciArIGFuZCAtIHRlc3QqLworICBkb3VibGUgcm91bmRpbmdfZXJyb3I9IDEuRS05OworICBpbnQgZGlmZjsKKyAgZG91YmxlIGRkaWZmOworICBpbnQgcHJvZHVjdDsKKyAgaW50IGtub3duX3Byb2R1Y3Q7CisgIGludCBsb2dpY19hbmQ7CisgIGludCBsb2dpY19vcjsKKyAgaW50IGJpdF9hbmQ7CisgIGludCBiaXRfb3I7CisgIGludCBleGNsdXNpdl9iaXRfb3I7CisgIGludCBsb2dpY3NbTE9PUENPVU5UXTsKKyAgaW50IGk7CisgIGRvdWJsZSBkcHQ7CisgIGludCByZXN1bHQ7CisKKyAgc3VtID0wOworICBkc3VtPTA7CisgIGR0ID0gMS4vMy47CisgIHJlc3VsdCA9IDA7CisgIHByb2R1Y3QgPSAxOworICBsb2dpY19hbmQ9MTsKKyAgbG9naWNfb3I9MDsKKyAgYml0X2FuZD0xOworICBiaXRfb3I9MDsKKyAgZXhjbHVzaXZfYml0X29yPTA7CisKKyAgLyogVGVzdHMgZm9yIGludGVnZXJzICovCisgIGtub3duX3N1bSA9IChMT09QQ09VTlQqKExPT1BDT1VOVCsxKSkvMjsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSByZWR1Y3Rpb24oKzpzdW0pCisgIGZvciAoaT0xO2k8PUxPT1BDT1VOVDtpKyspIHsKKyAgICBzdW09c3VtK2k7CisgIH0KKyAgaWYoa25vd25fc3VtIT1zdW0pIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gc3VtIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQiCisgICAgICAiIGluc3RlYWQgb2YgJWRcbiIsc3VtLGtub3duX3N1bSk7IAorICB9CisKKyAgZGlmZiA9IChMT09QQ09VTlQqKExPT1BDT1VOVCsxKSkvMjsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSByZWR1Y3Rpb24oLTpkaWZmKQorICBmb3IgKGk9MTtpPD1MT09QQ09VTlQ7KytpKSB7CisgICAgZGlmZj1kaWZmLWk7CisgIH0KKyAgaWYoZGlmZiAhPSAwKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIGRpZmZlcmVuY2Ugd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCIKKyAgICAgICIgaW5zdGVhZCBvZiAwLlxuIixkaWZmKTsKKyAgfQorCisgIC8qIFRlc3RzIGZvciBkb3VibGVzICovCisgIGRzdW09MDsKKyAgZHB0PTE7CisgIGZvciAoaT0wO2k8RE9VQkxFX0RJR0lUUzsrK2kpIHsKKyAgICBkcHQqPWR0OworICB9CisgIGRrbm93bl9zdW0gPSAoMS1kcHQpLygxLWR0KTsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSByZWR1Y3Rpb24oKzpkc3VtKQorICBmb3IgKGk9MDtpPERPVUJMRV9ESUdJVFM7KytpKSB7CisgICAgZHN1bSArPSBwb3coZHQsaSk7CisgIH0KKyAgaWYoIGZhYnMoZHN1bS1ka25vd25fc3VtKSA+IHJvdW5kaW5nX2Vycm9yICkgeworICAgIHJlc3VsdCsrOyAKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gc3VtIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlZiIKKyAgICAgICIgaW5zdGVhZCBvZiAlZiAoRGlmZmVyZW5jZTogJUUpXG4iLAorICAgICAgZHN1bSwgZGtub3duX3N1bSwgZHN1bS1ka25vd25fc3VtKTsKKyAgfQorCisgIGRwdD0xOworCisgIGZvciAoaT0wO2k8RE9VQkxFX0RJR0lUUzsrK2kpIHsKKyAgICBkcHQqPWR0OworICB9CisgIGZwcmludGYoc3RkZXJyLCJcbiIpOworICBkZGlmZiA9ICgxLWRwdCkvKDEtZHQpOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIHJlZHVjdGlvbigtOmRkaWZmKQorICBmb3IgKGk9MDtpPERPVUJMRV9ESUdJVFM7KytpKSB7CisgICAgZGRpZmYgLT0gcG93KGR0LGkpOworICB9CisgIGlmKCBmYWJzKGRkaWZmKSA+IHJvdW5kaW5nX2Vycm9yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIERpZmZlcmVuY2Ugd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICVFIgorICAgICAgIiBpbnN0ZWFkIG9mIDAuMFxuIixkZGlmZik7CisgIH0KKworICAvKiBUZXN0cyBmb3IgaW50ZWdlcnMgKi8KKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSByZWR1Y3Rpb24oKjpwcm9kdWN0KQorICBmb3IoaT0xO2k8PU1BWF9GQUNUT1I7aSsrKSB7CisgICAgcHJvZHVjdCAqPSBpOworICB9CisgIGtub3duX3Byb2R1Y3QgPSBLTk9XTl9QUk9EVUNUOworICBpZihrbm93bl9wcm9kdWN0ICE9IHByb2R1Y3QpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gUHJvZHVjdCB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIgorICAgICAgIiBpbnN0ZWFkIG9mICVkXG5cbiIscHJvZHVjdCxrbm93bl9wcm9kdWN0KTsKKyAgfQorCisgIC8qIFRlc3RzIGZvciBsb2dpYyBBTkQgKi8KKyAgZm9yKGk9MDtpPExPT1BDT1VOVDtpKyspIHsKKyAgICBsb2dpY3NbaV09MTsKKyAgfQorCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgXAorICAgIHJlZHVjdGlvbigmJjpsb2dpY19hbmQpCisgIGZvcihpPTA7aTxMT09QQ09VTlQ7KytpKSB7CisgICAgbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworICB9CisgIGlmKCFsb2dpY19hbmQpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gbG9naWMgQU5EIHBhcnQgMS5cbiIpOworICB9CisKKyAgbG9naWNfYW5kID0gMTsKKyAgbG9naWNzW0xPT1BDT1VOVC8yXT0wOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgXAorICAgIHJlZHVjdGlvbigmJjpsb2dpY19hbmQpCisgIGZvcihpPTA7aTxMT09QQ09VTlQ7KytpKSB7CisgICAgbG9naWNfYW5kID0gbG9naWNfYW5kICYmIGxvZ2ljc1tpXTsKKyAgfQorICBpZihsb2dpY19hbmQpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gbG9naWMgQU5EIHBhcnQgMi5cbiIpOworICB9CisKKyAgLyogVGVzdHMgZm9yIGxvZ2ljIE9SICovCisgIGZvcihpPTA7aTxMT09QQ09VTlQ7aSsrKSB7CisgICAgbG9naWNzW2ldPTA7CisgIH0KKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIFwKKyAgICByZWR1Y3Rpb24ofHw6bG9naWNfb3IpCisgIGZvcihpPTA7aTxMT09QQ09VTlQ7KytpKSB7CisgICAgbG9naWNfb3IgPSBsb2dpY19vciB8fCBsb2dpY3NbaV07CisgIH0KKyAgaWYobG9naWNfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAxLlxuIik7CisgIH0KKyAgbG9naWNfb3IgPSAwOworICBsb2dpY3NbTE9PUENPVU5ULzJdPTE7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSBcCisgICAgcmVkdWN0aW9uKHx8OmxvZ2ljX29yKQorICBmb3IoaT0wO2k8TE9PUENPVU5UOysraSkgeworICAgIGxvZ2ljX29yID0gbG9naWNfb3IgfHwgbG9naWNzW2ldOworICB9CisgIGlmKCFsb2dpY19vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDIuXG4iKTsKKyAgfQorCisgIC8qIFRlc3RzIGZvciBiaXR3aXNlIEFORCAqLworICBmb3IoaT0wO2k8TE9PUENPVU5UOysraSkgeworICAgIGxvZ2ljc1tpXT0xOworICB9CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSBcCisgICAgcmVkdWN0aW9uKCY6Yml0X2FuZCkKKyAgZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpIHsKKyAgICBiaXRfYW5kID0gKGJpdF9hbmQgJiBsb2dpY3NbaV0pOworICB9CisgIGlmKCFiaXRfYW5kKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIEJJVCBBTkQgcGFydCAxLlxuIik7CisgIH0KKworICBiaXRfYW5kID0gMTsKKyAgbG9naWNzW0xPT1BDT1VOVC8yXT0wOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgXAorICAgIHJlZHVjdGlvbigmOmJpdF9hbmQpCisgIGZvcihpPTA7aTxMT09QQ09VTlQ7KytpKSB7CisgICAgYml0X2FuZCA9IGJpdF9hbmQgJiBsb2dpY3NbaV07CisgIH0KKyAgaWYoYml0X2FuZCkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMi5cbiIpOworICB9CisKKyAgLyogVGVzdHMgZm9yIGJpdHdpc2UgT1IgKi8KKyAgZm9yKGk9MDtpPExPT1BDT1VOVDtpKyspIHsKKyAgICBsb2dpY3NbaV09MDsKKyAgfQorCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgXAorICAgIHJlZHVjdGlvbih8OmJpdF9vcikKKyAgZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpIHsKKyAgICBiaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisgIH0KKyAgaWYoYml0X29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIEJJVCBPUiBwYXJ0IDFcbiIpOworICB9CisgIGJpdF9vciA9IDA7CisgIGxvZ2ljc1tMT09QQ09VTlQvMl09MTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIFwKKyAgICByZWR1Y3Rpb24ofDpiaXRfb3IpCisgIGZvcihpPTA7aTxMT09QQ09VTlQ7KytpKSB7CisgICAgYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworICB9CisgIGlmKCFiaXRfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gQklUIE9SIHBhcnQgMlxuIik7CisgIH0KKworICAvKiBUZXN0cyBmb3IgYml0d2lzZSBYT1IgKi8KKyAgZm9yKGk9MDtpPExPT1BDT1VOVDtpKyspIHsKKyAgICBsb2dpY3NbaV09MDsKKyAgfQorCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgXAorICAgIHJlZHVjdGlvbiheOmV4Y2x1c2l2X2JpdF9vcikKKyAgZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpIHsKKyAgICBleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisgIH0KKyAgaWYoZXhjbHVzaXZfYml0X29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIEVYQ0xVU0lWIEJJVCBPUiBwYXJ0IDFcbiIpOworICB9CisKKyAgZXhjbHVzaXZfYml0X29yID0gMDsKKyAgbG9naWNzW0xPT1BDT1VOVC8yXT0xOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgXAorICAgIHJlZHVjdGlvbiheOmV4Y2x1c2l2X2JpdF9vcikKKyAgZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpIHsKKyAgICBleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisgIH0KKyAgaWYoIWV4Y2x1c2l2X2JpdF9vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAyXG4iKTsKKyAgfQorCisgIC8qcHJpbnRmKCJcblJlc3VsdDolZFxuIixyZXN1bHQpOyovCisgIHJldHVybiAocmVzdWx0PT0wKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3BhcmFsbGVsX2Zvcl9yZWR1Y3Rpb24oKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zZWN0aW9ucy9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfZmlyc3Rwcml2YXRlLmMgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2VjdGlvbnMvb21wX3BhcmFsbGVsX3NlY3Rpb25zX2ZpcnN0cHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NGE1ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2VjdGlvbnMvb21wX3BhcmFsbGVsX3NlY3Rpb25zX2ZpcnN0cHJpdmF0ZS5jCkBAIC0wLDAgKzEsNTQgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IHRlc3Rfb21wX3BhcmFsbGVsX3NlY3Rpb25zX2ZpcnN0cHJpdmF0ZSgpCit7CisgIGludCBzdW07CisgIGludCBzdW0wOworICBpbnQga25vd25fc3VtOworCisgIHN1bSA9NzsKKyAgc3VtMD0xMTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBmaXJzdHByaXZhdGUoc3VtMCkKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb24gCisgICAgeworICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgIHsKKyAgICAgICAgc3VtPSBzdW0rc3VtMDsKKyAgICAgIH0KKyAgICB9ICAKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgIHsKKyAgICAgICAgc3VtPSBzdW0rc3VtMDsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICB7CisgICAgICAgIHN1bT0gc3VtK3N1bTA7CisgICAgICB9CisgICAgfSAgICAgICAgIAorICB9CisKKyAga25vd25fc3VtPTExKjMrNzsKKyAgcmV0dXJuIChrbm93bl9zdW09PXN1bSk7IAorfSAvKiBlbmQgb2YgY2hlY2tfc2VjdGlvbl9maXJzdHByaXZhdGUqLworCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfZmlyc3Rwcml2YXRlKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2VjdGlvbnMvb21wX3BhcmFsbGVsX3NlY3Rpb25zX2xhc3Rwcml2YXRlLmMgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2VjdGlvbnMvb21wX3BhcmFsbGVsX3NlY3Rpb25zX2xhc3Rwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkyNzM1ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zZWN0aW9ucy9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfbGFzdHByaXZhdGUuYwpAQCAtMCwwICsxLDcxIEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9zZWN0aW9uc19sYXN0cHJpdmF0ZSgpCit7CisgIGludCBzdW07CisgIGludCBzdW0wOworICBpbnQgaTsKKyAgaW50IGkwOworICBpbnQga25vd25fc3VtOworICBzdW0gPTA7CisgIHN1bTAgPSAwOworICBpMCA9IC0xOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSxzdW0wKSBsYXN0cHJpdmF0ZShpMCkKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb24gIAorICAgIHsKKyAgICAgIHN1bTA9MDsKKyAgICAgIGZvciAoaT0xO2k8NDAwO2krKykgeworICAgICAgICBzdW0wPXN1bTAraTsKKyAgICAgICAgaTA9aTsKKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICB7CisgICAgICAgIHN1bT0gc3VtK3N1bTA7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24gCisgICAgeworICAgICAgc3VtMD0wOworICAgICAgZm9yKGk9NDAwO2k8NzAwO2krKykgeworICAgICAgICBzdW0wPXN1bTAraTsKKyAgICAgICAgaTA9aTsKKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICB7CisgICAgICAgIHN1bT0gc3VtK3N1bTA7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24gCisgICAgeworICAgICAgc3VtMD0wOworICAgICAgZm9yKGk9NzAwO2k8MTAwMDtpKyspIHsKKyAgICAgICAgc3VtMD1zdW0wK2k7CisgICAgICAgIGkwPWk7CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgeworICAgICAgICBzdW09IHN1bStzdW0wOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGtub3duX3N1bT0oOTk5KjEwMDApLzI7CisgIHJldHVybiAoKGtub3duX3N1bT09c3VtKSAmJiAoaTA9PTk5OSkgKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3BhcmFsbGVsX3NlY3Rpb25zX2xhc3Rwcml2YXRlKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2VjdGlvbnMvb21wX3BhcmFsbGVsX3NlY3Rpb25zX3ByaXZhdGUuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zZWN0aW9ucy9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfcHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NGQ2MWUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2VjdGlvbnMvb21wX3BhcmFsbGVsX3NlY3Rpb25zX3ByaXZhdGUuYwpAQCAtMCwwICsxLDY0IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9zZWN0aW9uc19wcml2YXRlKCkKK3sKKyAgaW50IHN1bTsKKyAgaW50IHN1bTA7CisgIGludCBpOworICBpbnQga25vd25fc3VtOworCisgIHN1bSA9IDc7CisgIHN1bTA9MDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKHN1bTAsIGkpCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uIAorICAgIHsKKyAgICAgIHN1bTA9MDsKKyAgICAgIGZvciAoaT0xO2k8NDAwO2krKykKKyAgICAgICAgc3VtMD1zdW0wK2k7CisgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgeworICAgICAgICBzdW09IHN1bStzdW0wOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgc3VtMD0wOworICAgICAgZm9yKGk9NDAwO2k8NzAwO2krKykKKyAgICAgICAgc3VtMD1zdW0wK2k7CisgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgeworICAgICAgICBzdW09IHN1bStzdW0wOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgc3VtMD0wOworICAgICAgZm9yKGk9NzAwO2k8MTAwMDtpKyspCisgICAgICAgIHN1bTA9c3VtMCtpOworICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgIHsKKyAgICAgICAgc3VtPSBzdW0rc3VtMDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBrbm93bl9zdW09KDk5OSoxMDAwKS8yKzc7CisgIHJldHVybiAoa25vd25fc3VtPT1zdW0pOyAKK30gLyogZW5kIG9mIGNoZWNrX3NlY3Rpb25fcHJpdmF0ZSovCisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9wYXJhbGxlbF9zZWN0aW9uc19wcml2YXRlKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2VjdGlvbnMvb21wX3BhcmFsbGVsX3NlY3Rpb25zX3JlZHVjdGlvbi5jIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9wYXJhbGxlbF9zZWN0aW9uc19yZWR1Y3Rpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWQ1Y2UzCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9wYXJhbGxlbF9zZWN0aW9uc19yZWR1Y3Rpb24uYwpAQCAtMCwwICsxLDUwOCBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IHRlc3Rfb21wX3BhcmFsbGVsX3NlY3Rpb25zX3JlZHVjdGlvbigpCit7CisgIGludCBzdW07CisgIGludCBrbm93bl9zdW07ICAKKyAgZG91YmxlIGRwdDsKKyAgZG91YmxlIGRzdW07CisgIGRvdWJsZSBka25vd25fc3VtOworICBkb3VibGUgZHQ9MC41OyAvKiBiYXNlIG9mIGdlb21ldHJpYyByb3cgZm9yICsgYW5kIC0gdGVzdCovCisgIGRvdWJsZSByb3VuZGluZ19lcnJvcj0gMS5FLTU7CisgIGludCBkaWZmOworICBkb3VibGUgZGRpZmY7CisgIGludCBwcm9kdWN0OworICBpbnQga25vd25fcHJvZHVjdDsKKyAgaW50IGxvZ2ljX2FuZDsKKyAgaW50IGJpdF9hbmQ7CisgIGludCBsb2dpY19vcjsKKyAgaW50IGJpdF9vcjsKKyAgaW50IGV4Y2x1c2l2X2JpdF9vcjsKKyAgaW50IGxvZ2ljc1sxMDAwXTsKKyAgaW50IGk7CisgIGludCByZXN1bHQ7CisKKyAgc3VtID0gNzsKKyAgZHN1bT0wOworICBwcm9kdWN0ID0xOworICBkcHQgPSAxOworICBsb2dpY19hbmQ9MTsKKyAgYml0X2FuZD0xOworICBsb2dpY19vcj0wOworICBiaXRfb3I9MDsKKyAgZXhjbHVzaXZfYml0X29yPTA7CisgIHJlc3VsdCA9MDsKKyAgLyogIGludCBteV9pc2xhcmdlcjsqLworICAvKmludCBpc19sYXJnZXI9MTsqLworCisgIC8vIFRlc3Qgc3VtbWF0aW9uIG9mIGludGVnZXJzCisgIGtub3duX3N1bSA9ICg5OTkqMTAwMCkvMis3OworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIHJlZHVjdGlvbigrOnN1bSkKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IgKGk9MTtpPDMwMDtpKyspIHsKKyAgICAgICAgc3VtPXN1bStpOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yIChpPTMwMDtpPDcwMDtpKyspIHsKKyAgICAgICAgc3VtPXN1bStpOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yIChpPTcwMDtpPDEwMDA7aSsrKSB7CisgICAgICAgIHN1bT1zdW0raTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoa25vd25fc3VtIT1zdW0pIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gc3VtIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQiCisgICAgICAiIGluc3RlYWQgb2YgJWQuXG4iLHN1bSwga25vd25fc3VtKTsKKyAgfQorCisgIC8vIFRlc3QgZGlmZmVyZW5jZXMgb2YgaW50ZWdlcnMKKyAgZGlmZiA9ICg5OTkqMTAwMCkvMjsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24oLTpkaWZmKQorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvciAoaT0xO2k8MzAwO2krKykgeworICAgICAgICBkaWZmPWRpZmYtaTsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvciAoaT0zMDA7aTw3MDA7aSsrKSB7CisgICAgICAgIGRpZmY9ZGlmZi1pOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yIChpPTcwMDtpPDEwMDA7aSsrKSB7CisgICAgICAgIGRpZmY9ZGlmZi1pOworICAgICAgfQorICAgIH0KKyAgfQorICBpZihkaWZmICE9IDApIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gRGlmZmVyZW5jZSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIgorICAgICAgIiBpbnN0ZWFkIG9mIDAuXG4iLGRpZmYpOworICB9CisKKyAgLy8gVGVzdCBzdW1tYXRpb24gb2YgZG91YmxlcworICBmb3IgKGk9MDtpPDIwOysraSkgeworICAgIGRwdCo9ZHQ7CisgIH0KKyAgZGtub3duX3N1bSA9ICgxLWRwdCkvKDEtZHQpOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIHJlZHVjdGlvbigrOmRzdW0pCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yIChpPTA7aTw2OysraSkgeworICAgICAgICBkc3VtICs9IHBvdyhkdCxpKTsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvciAoaT02O2k8MTI7KytpKSB7CisgICAgICAgIGRzdW0gKz0gcG93KGR0LGkpOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yIChpPTEyO2k8MjA7KytpKSB7CisgICAgICAgIGRzdW0gKz0gcG93KGR0LGkpOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiggZmFicyhkc3VtLWRrbm93bl9zdW0pID4gcm91bmRpbmdfZXJyb3IgKSB7CisgICAgcmVzdWx0Kys7IAorICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBzdW0gd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICVmIgorICAgICAgIiBpbnN0ZWFkIG9mICVmIChEaWZmZXJlbmNlOiAlRSlcbiIsCisgICAgICBkc3VtLCBka25vd25fc3VtLCBkc3VtLWRrbm93bl9zdW0pOworICB9CisKKyAgLy8gVGVzdCBkaWZmZXJlbmNlcyBvZiBkb3VibGVzCisgIGRwdD0xOworICBmb3IgKGk9MDtpPDIwOysraSkgeworICAgIGRwdCo9ZHQ7CisgIH0KKyAgZnByaW50ZihzdGRlcnIsIlxuIik7CisgIGRkaWZmID0gKDEtZHB0KS8oMS1kdCk7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgcmVkdWN0aW9uKC06ZGRpZmYpCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yIChpPTA7aTw2OysraSkgeworICAgICAgICBkZGlmZiAtPSBwb3coZHQsaSk7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IgKGk9NjtpPDEyOysraSkgeworICAgICAgICBkZGlmZiAtPSBwb3coZHQsaSk7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IgKGk9MTI7aTwyMDsrK2kpIHsKKyAgICAgICAgZGRpZmYgLT0gcG93KGR0LGkpOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiggZmFicyhkZGlmZikgPiByb3VuZGluZ19lcnJvcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBEaWZmZXJlbmNlIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlRSIKKyAgICAgICIgaW5zdGVhZCBvZiAwLjBcbiIsZGRpZmYpOworICB9CisKKyAgLy8gVGVzdCBwcm9kdWN0IG9mIGludGVnZXJzCisgIGtub3duX3Byb2R1Y3QgPSAzNjI4ODAwOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIHJlZHVjdGlvbigqOnByb2R1Y3QpCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeyAgCisgICAgICBmb3IoaT0xO2k8MztpKyspIHsKKyAgICAgICAgcHJvZHVjdCAqPSBpOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yKGk9MztpPDc7aSsrKSB7CisgICAgICAgIHByb2R1Y3QgKj0gaTsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvcihpPTc7aTwxMTtpKyspIHsKKyAgICAgICAgcHJvZHVjdCAqPSBpOworICAgICAgfQorICAgIH0KKyAgfQorICBpZihrbm93bl9wcm9kdWN0ICE9IHByb2R1Y3QpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gUHJvZHVjdCB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIgorICAgICAgIiBpbnN0ZWFkIG9mICVkXG4iLHByb2R1Y3Qsa25vd25fcHJvZHVjdCk7CisgIH0KKworICAvLyBUZXN0IGxvZ2ljYWwgQU5ECisgIGZvcihpPTA7aTwxMDAwO2krKykgeworICAgIGxvZ2ljc1tpXT0xOworICB9CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24oJiY6bG9naWNfYW5kKQorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvciAoaT0xO2k8MzAwO2krKykgeworICAgICAgICBsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IgKGk9MzAwO2k8NzAwO2krKykgeworICAgICAgICBsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IgKGk9NzAwO2k8MTAwMDtpKyspIHsKKyAgICAgICAgbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworICAgICAgfQorICAgIH0KKyAgfQorICBpZighbG9naWNfYW5kKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDFcbiIpOworICB9CisgIGxvZ2ljX2FuZCA9IDE7CisgIGxvZ2ljc1s1MDFdID0gMDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIHJlZHVjdGlvbigmJjpsb2dpY19hbmQpCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yIChpPTE7aTwzMDA7aSsrKSB7CisgICAgICAgIGxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvciAoaT0zMDA7aTw3MDA7aSsrKSB7CisgICAgICAgIGxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvciAoaT03MDA7aTwxMDAwO2krKykgeworICAgICAgICBsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisgICAgICB9CisgICAgfQorICB9CisgIGlmKGxvZ2ljX2FuZCkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAyIik7CisgIH0KKworICAvLyBUZXN0IGxvZ2ljYWwgT1IKKyAgZm9yKGk9MDtpPDEwMDA7aSsrKSB7CisgICAgbG9naWNzW2ldPTA7CisgIH0KKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIHJlZHVjdGlvbih8fDpsb2dpY19vcikKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IgKGk9MTtpPDMwMDtpKyspIHsKKyAgICAgICAgbG9naWNfb3IgPSAobG9naWNfb3IgfHwgbG9naWNzW2ldKTsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvciAoaT0zMDA7aTw3MDA7aSsrKSB7CisgICAgICAgIGxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IgKGk9NzAwO2k8MTAwMDtpKyspIHsKKyAgICAgICAgbG9naWNfb3IgPSAobG9naWNfb3IgfHwgbG9naWNzW2ldKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYobG9naWNfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAxXG4iKTsKKyAgfQorCisgIGxvZ2ljX29yID0gMDsKKyAgbG9naWNzWzUwMV09MTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIHJlZHVjdGlvbih8fDpsb2dpY19vcikKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IgKGk9MTtpPDMwMDtpKyspIHsKKyAgICAgICAgbG9naWNfb3IgPSAobG9naWNfb3IgfHwgbG9naWNzW2ldKTsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvciAoaT0zMDA7aTw3MDA7aSsrKSB7CisgICAgICAgIGxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IgKGk9NzAwO2k8MTAwMDtpKyspIHsKKyAgICAgICAgbG9naWNfb3IgPSAobG9naWNfb3IgfHwgbG9naWNzW2ldKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoIWxvZ2ljX29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMlxuIik7CisgIH0KKworICAvLyBUZXN0IGJpdHdpc2UgQU5ECisgIGZvcihpPTA7aTwxMDAwOysraSkgeworICAgIGxvZ2ljc1tpXT0xOworICB9CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24oJjpiaXRfYW5kKQorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsgIAorICAgICAgZm9yKGk9MDtpPDMwMDsrK2kpIHsKKyAgICAgICAgYml0X2FuZCA9IChiaXRfYW5kICYgbG9naWNzW2ldKTsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsgIAorICAgICAgZm9yKGk9MzAwO2k8NzAwOysraSkgeworICAgICAgICBiaXRfYW5kID0gKGJpdF9hbmQgJiBsb2dpY3NbaV0pOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeyAgCisgICAgICBmb3IoaT03MDA7aTwxMDAwOysraSkgeworICAgICAgICBiaXRfYW5kID0gKGJpdF9hbmQgJiBsb2dpY3NbaV0pOworICAgICAgfQorICAgIH0KKyAgfQorICBpZighYml0X2FuZCkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMVxuIik7CisgIH0KKworICBiaXRfYW5kID0gMTsKKyAgbG9naWNzWzUwMV09MDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIHJlZHVjdGlvbigmOmJpdF9hbmQpCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yKGk9MDtpPDMwMDsrK2kpIHsKKyAgICAgICAgYml0X2FuZCA9IGJpdF9hbmQgJiBsb2dpY3NbaV07CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IoaT0zMDA7aTw3MDA7KytpKSB7CisgICAgICAgIGJpdF9hbmQgPSBiaXRfYW5kICYgbG9naWNzW2ldOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yKGk9NzAwO2k8MTAwMDsrK2kpIHsKKyAgICAgICAgYml0X2FuZCA9IGJpdF9hbmQgJiBsb2dpY3NbaV07CisgICAgICB9CisgICAgfQorICB9CisgIGlmKGJpdF9hbmQpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDIiKTsKKyAgfQorCisgIC8vIFRlc3QgYml0d2lzZSBPUgorICBmb3IoaT0wO2k8MTAwMDtpKyspIHsKKyAgICBsb2dpY3NbaV09MDsKKyAgfQorCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgcmVkdWN0aW9uKHw6Yml0X29yKQorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvcihpPTA7aTwzMDA7KytpKSB7CisgICAgICAgIGJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvcihpPTMwMDtpPDcwMDsrK2kpIHsKKyAgICAgICAgYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yKGk9NzAwO2k8MTAwMDsrK2kpIHsKKyAgICAgICAgYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworICAgICAgfQorICAgIH0KKyAgfQorICBpZihiaXRfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gQklUIE9SIHBhcnQgMVxuIik7CisgIH0KKyAgYml0X29yID0gMDsKKyAgbG9naWNzWzUwMV09MTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIHJlZHVjdGlvbih8OmJpdF9vcikKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IoaT0wO2k8MzAwOysraSkgeworICAgICAgICBiaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IoaT0zMDA7aTw3MDA7KytpKSB7CisgICAgICAgIGJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvcihpPTcwMDtpPDEwMDA7KytpKSB7CisgICAgICAgIGJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoIWJpdF9vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBCSVQgT1IgcGFydCAyXG4iKTsKKyAgfQorCisgIC8vIFRlc3QgYml0d2lzZSBYT1IKKyAgZm9yKGk9MDtpPDEwMDA7aSsrKSB7CisgICAgbG9naWNzW2ldPTA7CisgIH0KKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIHJlZHVjdGlvbiheOmV4Y2x1c2l2X2JpdF9vcikKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7ICAKKyAgICAgIGZvcihpPTA7aTwzMDA7KytpKSB7CisgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsgIAorICAgICAgZm9yKGk9MzAwO2k8NzAwOysraSkgeworICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7ICAKKyAgICAgIGZvcihpPTcwMDtpPDEwMDA7KytpKSB7CisgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoZXhjbHVzaXZfYml0X29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIEVYQ0xVU0lWIEJJVCBPUiBwYXJ0IDFcbiIpOworICB9CisKKyAgZXhjbHVzaXZfYml0X29yID0gMDsKKyAgbG9naWNzWzUwMV09MTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIHJlZHVjdGlvbiheOmV4Y2x1c2l2X2JpdF9vcikKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IoaT0wO2k8MzAwOysraSkgeworICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IoaT0zMDA7aTw3MDA7KytpKSB7CisgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvcihpPTcwMDtpPDEwMDA7KytpKSB7CisgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoIWV4Y2x1c2l2X2JpdF9vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAyXG4iKTsKKyAgfQorCisgIC8qcHJpbnRmKCJcblJlc3VsdDolZFxuIixyZXN1bHQpOyovCisgIHJldHVybiAocmVzdWx0PT0wKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3BhcmFsbGVsX3NlY3Rpb25zX3JlZHVjdGlvbigpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9zZWN0aW9uX2ZpcnN0cHJpdmF0ZS5jIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9zZWN0aW9uX2ZpcnN0cHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZDIyNjcKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2VjdGlvbnMvb21wX3NlY3Rpb25fZmlyc3Rwcml2YXRlLmMKQEAgLTAsMCArMSw1NSBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgdGVzdF9vbXBfc2VjdGlvbl9maXJzdHByaXZhdGUoKQoreworICBpbnQgc3VtOworICBpbnQgc3VtMDsKKyAgaW50IGtub3duX3N1bTsKKworICBzdW0wID0gMTE7CisgIHN1bSA9IDc7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICAjcHJhZ21hIG9tcCAgc2VjdGlvbnMgZmlyc3Rwcml2YXRlKHN1bTApCisgICAgeworICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbiAKKyAgICAgIHsKKyAgICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgICAgeworICAgICAgICAgIHN1bSA9IHN1bSArIHN1bTA7CisgICAgICAgIH0KKyAgICAgIH0gIAorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgICB7CisgICAgICAgICAgc3VtID0gc3VtICsgc3VtMDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgICB7CisgICAgICAgICAgc3VtID0gc3VtICsgc3VtMDsKKyAgICAgICAgfQorICAgICAgfSAgICAgICAgIAorICAgIH0KKyAgfQorICBrbm93bl9zdW0gPSAxMSAqIDMgKyA3OworICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOyAKK30gLyogZW5kIG9mIGNoZWNrX3NlY3Rpb25fZmlyc3Rwcml2YXRlKi8KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3NlY3Rpb25fZmlyc3Rwcml2YXRlKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2VjdGlvbnMvb21wX3NlY3Rpb25fbGFzdHByaXZhdGUuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zZWN0aW9ucy9vbXBfc2VjdGlvbl9sYXN0cHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZWJkMmYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2VjdGlvbnMvb21wX3NlY3Rpb25fbGFzdHByaXZhdGUuYwpAQCAtMCwwICsxLDc2IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCB0ZXN0X29tcF9zZWN0aW9uX2xhc3Rwcml2YXRlKCkKK3sKKyAgaW50IGkwID0gLTE7CisgIGludCBzdW0gPSAwOworICBpbnQgaTsKKyAgaW50IHN1bTAgPSAwOworICBpbnQga25vd25fc3VtOworCisgIGkwID0gLTE7CisgIHN1bSA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb25zIGxhc3Rwcml2YXRlKGkwKSBwcml2YXRlKGksc3VtMCkKKyAgICB7CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uICAKKyAgICAgIHsKKyAgICAgICAgc3VtMCA9IDA7CisgICAgICAgIGZvciAoaSA9IDE7IGkgPCA0MDA7IGkrKykKKyAgICAgICAgeworICAgICAgICAgIHN1bTAgPSBzdW0wICsgaTsKKyAgICAgICAgICBpMCA9IGk7CisgICAgICAgIH0KKyAgICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgICAgeworICAgICAgICAgIHN1bSA9IHN1bSArIHN1bTA7CisgICAgICAgIH0gLyplbmQgb2YgY3JpdGljYWwqLworICAgICAgfSAvKiBlbmQgb2Ygc2VjdGlvbiAqLworICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbiAKKyAgICAgIHsKKyAgICAgICAgc3VtMCA9IDA7CisgICAgICAgIGZvcihpID0gNDAwOyBpIDwgNzAwOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGk7CisgICAgICAgICAgaTAgPSBpOworICAgICAgICB9CisgICAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICAgIHsKKyAgICAgICAgICBzdW0gPSBzdW0gKyBzdW0wOworICAgICAgICB9IC8qZW5kIG9mIGNyaXRpY2FsKi8KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24gCisgICAgICB7CisgICAgICAgIHN1bTAgPSAwOworICAgICAgICBmb3IoaSA9IDcwMDsgaSA8IDEwMDA7IGkrKykKKyAgICAgICAgeworICAgICAgICAgIHN1bTAgPSBzdW0wICsgaTsKKyAgICAgICAgICBpMCA9IGk7CisgICAgICAgIH0KKyAgICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgICAgeworICAgICAgICAgIHN1bSA9IHN1bSArIHN1bTA7CisgICAgICAgIH0gLyplbmQgb2YgY3JpdGljYWwqLworICAgICAgfSAvKiBlbmQgb2Ygc2VjdGlvbiAqLworICAgIH0gLyogZW5kIG9mIHNlY3Rpb25zKi8KKyAgfSAvKiBlbmQgb2YgcGFyYWxsZWwqLyAgCisgIGtub3duX3N1bSA9ICg5OTkgKiAxMDAwKSAvIDI7CisgIHJldHVybiAoKGtub3duX3N1bSA9PSBzdW0pICYmIChpMCA9PSA5OTkpICk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9zZWN0aW9uX2xhc3Rwcml2YXRlKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2VjdGlvbnMvb21wX3NlY3Rpb25fcHJpdmF0ZS5jIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9zZWN0aW9uX3ByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmYzZjFjCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9zZWN0aW9uX3ByaXZhdGUuYwpAQCAtMCwwICsxLDY2IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCB0ZXN0X29tcF9zZWN0aW9uX3ByaXZhdGUoKQoreworICBpbnQgc3VtOworICBpbnQgc3VtMDsKKyAgaW50IGk7CisgIGludCBrbm93bl9zdW07CisKKyAgc3VtID0gNzsKKyAgc3VtMCA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoc3VtMCxpKQorICAgIHsKKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24gCisgICAgICB7CisgICAgICAgIHN1bTAgPSAwOworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgNDAwOyBpKyspCisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpOworICAgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgICB7CisgICAgICAgICAgc3VtID0gc3VtICsgc3VtMDsKKyAgICAgICAgfQorICAgICAgfSAgCisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIHN1bTAgPSAwOworICAgICAgICBmb3IgKGkgPSA0MDA7IGkgPCA3MDA7IGkrKykKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGk7CisgICAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICAgIHsKKyAgICAgICAgICBzdW0gPSBzdW0gKyBzdW0wOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIHN1bTAgPSAwOworICAgICAgICBmb3IgKGkgPSA3MDA7IGkgPCAxMDAwOyBpKyspCisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpOworICAgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgICB7CisgICAgICAgICAgc3VtID0gc3VtICsgc3VtMDsKKyAgICAgICAgfQorICAgICAgfSAgICAgICAgIAorICAgIH0gLyplbmQgb2Ygc2VjdGlvbnMqLworICB9IC8qIGVuZCBvZiBwYXJhbGxlbCAqLworICBrbm93bl9zdW0gPSAoOTk5ICogMTAwMCkgLyAyICsgNzsKKyAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsgCit9IC8qIGVuZCBvZiBjaGVja19zZWN0aW9uX3ByaXZhdGUqLworCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfc2VjdGlvbl9wcml2YXRlKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2VjdGlvbnMvb21wX3NlY3Rpb25zX25vd2FpdC5jIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9zZWN0aW9uc19ub3dhaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjgyOTg4Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9zZWN0aW9uc19ub3dhaXQuYwpAQCAtMCwwICsxLDY5IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKK2ludCB0ZXN0X29tcF9zZWN0aW9uc19ub3dhaXQoKQoreworICBpbnQgcmVzdWx0OworICBpbnQgY291bnQ7CisgIGludCBqOworCisgIHJlc3VsdCA9IDA7CisgIGNvdW50ID0gMDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgeworICAgIGludCByYW5rOworICAgIHJhbmsgPSBvbXBfZ2V0X3RocmVhZF9udW0gKCk7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbnMgbm93YWl0CisgICAgeworICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlRocmVhZCBuciAlZCBlbnRlcnMgZmlyc3Qgc2VjdGlvbiIKKyAgICAgICAgICAiIGFuZCBnZXRzIHNsZWVwaW5nLlxuIiwgcmFuayk7CisgICAgICAgIG15X3NsZWVwKFNMRUVQVElNRSk7CisgICAgICAgIGNvdW50ID0gMTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJUaHJlYWQgbnIgJWQgd29rZSB1cCBhbiBzZXQiCisgICAgICAgICAgIiBjb3VudCB0byAxLlxuIiwgcmFuayk7CisgICAgICAgICNwcmFnbWEgb21wIGZsdXNoKGNvdW50KQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlRocmVhZCBuciAlZCBleGVjdXRlZCB3b3JrIGluIHRoZSIKKyAgICAgICAgICAiIGZpcnN0IHNlY3Rpb24uXG4iLCByYW5rKTsKKyAgICAgIH0KKyAgICB9CisgICAgLyogQmVnaW4gb2Ygc2Vjb25kIHNlY3Rpb25zIGVudmlyb25tZW50ICovCisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbnMKKyAgICB7CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVGhyZWFkIG5yICVkIGV4ZWN1dGVkIHdvcmsgaW4gdGhlIgorICAgICAgICAgICIgc2Vjb25kIHNlY3Rpb24uXG4iLCByYW5rKTsKKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJUaHJlYWQgbnIgJWQgZXhlY3V0ZWQgd29yayBpbiB0aGUiCisgICAgICAgICAgIiBzZWNvbmQgc2VjdGlvbiBhbmQgY29udHJvbHMgdGhlIHZhbHVlIG9mIGNvdW50XG4iLCByYW5rKTsKKyAgICAgICAgaWYgKGNvdW50ID09IDApCisgICAgICAgICAgcmVzdWx0ID0gMTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb3VudCB3YXMgJWRcbiIsIGNvdW50KTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3NlY3Rpb25zX25vd2FpdCgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9zZWN0aW9uc19yZWR1Y3Rpb24uYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zZWN0aW9ucy9vbXBfc2VjdGlvbnNfcmVkdWN0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTllOTJjZgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zZWN0aW9ucy9vbXBfc2VjdGlvbnNfcmVkdWN0aW9uLmMKQEAgLTAsMCArMSw1NDMgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCB0ZXN0X29tcF9zZWN0aW9uc19yZWR1Y3Rpb24oKQoreworICBpbnQgc3VtOworICBpbnQga25vd25fc3VtOworICBkb3VibGUgZHB0LGRzdW07CisgIGRvdWJsZSBka25vd25fc3VtOworICBkb3VibGUgZHQ9MC41OyAvKiBiYXNlIG9mIGdlb21ldHJpYyByb3cgZm9yICsgYW5kIC0gdGVzdCovCisgIGRvdWJsZSByb3VuZGluZ19lcnJvcj0gMS5FLTk7CisgIGludCBkaWZmOworICBkb3VibGUgZGRpZmY7CisgIGludCBwcm9kdWN0OworICBpbnQga25vd25fcHJvZHVjdDsKKyAgaW50IGxvZ2ljX2FuZDsKKyAgaW50IGJpdF9hbmQ7CisgIGludCBsb2dpY19vcjsKKyAgaW50IGJpdF9vcjsKKyAgaW50IGV4Y2x1c2l2X2JpdF9vcjsKKyAgaW50IGxvZ2ljc1sxMDAwXTsKKyAgaW50IGk7CisgIGludCByZXN1bHQ7CisgIC8qIGludCBteV9pc2xhcmdlcjsgKi8KKyAgLyppbnQgaXNfbGFyZ2VyPTE7Ki8KKyAgc3VtID03OworICBkcHQgPTE7CisgIGRzdW09MDsKKyAgcHJvZHVjdCA9MTsKKyAgbG9naWNfYW5kPTE7CisgIGJpdF9hbmQ9MTsKKyAgbG9naWNfb3I9MDsKKyAgYml0X29yPTA7CisgIGV4Y2x1c2l2X2JpdF9vcj0wOworICByZXN1bHQgPSAwOworICBkdCA9IDEuLzMuOworCisgIGtub3duX3N1bSA9ICg5OTkqMTAwMCkvMis3OworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24oKzpzdW0pCisgICAgeworICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IgKGk9MTtpPDMwMDtpKyspIHsKKyAgICAgICAgICBzdW09c3VtK2k7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yIChpPTMwMDtpPDcwMDtpKyspIHsKKyAgICAgICAgICBzdW09c3VtK2k7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yIChpPTcwMDtpPDEwMDA7aSsrKSB7CisgICAgICAgICAgc3VtPXN1bStpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGlmKGtub3duX3N1bSE9c3VtKSB7CisgICAgKytyZXN1bHQ7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIHN1bSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIgorICAgICAgIiBpbnN0ZWFkIG9mICVkXG4iLCBzdW0sa25vd25fc3VtKTsKKyAgfQorCisgIGRpZmYgPSAoOTk5KjEwMDApLzI7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIHJlZHVjdGlvbigtOmRpZmYpCisgICAgeworICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IgKGk9MTtpPDMwMDtpKyspIHsKKyAgICAgICAgICBkaWZmPWRpZmYtaTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IgKGk9MzAwO2k8NzAwO2krKykgeworICAgICAgICAgIGRpZmY9ZGlmZi1pOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvciAoaT03MDA7aTwxMDAwO2krKykgeworICAgICAgICAgIGRpZmY9ZGlmZi1pOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGlmKGRpZmYgIT0gMCkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBEaWZmZXJlbmNlIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQiCisgICAgICAiIGluc3RlYWQgb2YgMC5cbiIsZGlmZik7CisgIH0KKworICBmb3IgKGk9MDtpPDIwOysraSkgeworICAgIGRwdCo9ZHQ7CisgIH0KKyAgZGtub3duX3N1bSA9ICgxLWRwdCkvKDEtZHQpOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24oKzpkc3VtKQorICAgIHsKKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yIChpPTA7aTw2OysraSkgeworICAgICAgICAgIGRzdW0gKz0gcG93KGR0LGkpOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvciAoaT02O2k8MTI7KytpKSB7CisgICAgICAgICAgZHN1bSArPSBwb3coZHQsaSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yIChpPTEyO2k8MjA7KytpKSB7CisgICAgICAgICAgZHN1bSArPSBwb3coZHQsaSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoIGZhYnMoZHN1bS1ka25vd25fc3VtKSA+IHJvdW5kaW5nX2Vycm9yICkgeworICAgIHJlc3VsdCsrOyAKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gc3VtIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlZiIKKyAgICAgICIgaW5zdGVhZCBvZiAlZiAoRGlmZmVyZW5jZTogJUUpXG4iLAorICAgICAgZHN1bSwgZGtub3duX3N1bSwgZHN1bS1ka25vd25fc3VtKTsKKyAgfQorCisgIGRwdD0xOworICBmb3IgKGk9MDtpPDIwOysraSkgeworICAgIGRwdCo9ZHQ7CisgIH0KKyAgZnByaW50ZihzdGRlcnIsIlxuIik7CisgIGRkaWZmID0gKDEtZHB0KS8oMS1kdCk7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIHJlZHVjdGlvbigtOmRkaWZmKQorICAgIHsKKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yIChpPTA7aTw2OysraSkgeworICAgICAgICAgIGRkaWZmIC09IHBvdyhkdCxpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IgKGk9NjtpPDEyOysraSkgeworICAgICAgICAgIGRkaWZmIC09IHBvdyhkdCxpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IgKGk9MTI7aTwyMDsrK2kpIHsKKyAgICAgICAgICBkZGlmZiAtPSBwb3coZHQsaSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZihmYWJzKGRkaWZmKSA+IHJvdW5kaW5nX2Vycm9yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIERpZmZlcmVuY2Ugd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICVFIgorICAgICAgIiBpbnN0ZWFkIG9mIDAuMFxuIixkZGlmZik7CisgIH0KKworICBrbm93bl9wcm9kdWN0ID0gMzYyODgwMDsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgcmVkdWN0aW9uKCo6cHJvZHVjdCkKKyAgICB7CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7ICAKKyAgICAgICAgZm9yKGk9MTtpPDM7aSsrKSB7CisgICAgICAgICAgcHJvZHVjdCAqPSBpOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvcihpPTM7aTw3O2krKykgeworICAgICAgICAgIHByb2R1Y3QgKj0gaTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IoaT03O2k8MTE7aSsrKSB7CisgICAgICAgICAgcHJvZHVjdCAqPSBpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGlmKGtub3duX3Byb2R1Y3QgIT0gcHJvZHVjdCkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBQcm9kdWN0IHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQiCisgICAgICAiIGluc3RlYWQgb2YgJWRcbiIscHJvZHVjdCxrbm93bl9wcm9kdWN0KTsKKyAgfQorCisgIGZvcihpPTA7aTwxMDAwO2krKykgeworICAgIGxvZ2ljc1tpXT0xOworICB9CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgcmVkdWN0aW9uKCYmOmxvZ2ljX2FuZCkKKyAgICB7CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvciAoaT0xO2k8MzAwO2krKykgeworICAgICAgICAgIGxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IgKGk9MzAwO2k8NzAwO2krKykgeworICAgICAgICAgIGxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IgKGk9NzAwO2k8MTAwMDtpKyspIHsKKyAgICAgICAgICBsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoIWxvZ2ljX2FuZCkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAxXG4iKTsKKyAgfQorCisgIGxvZ2ljX2FuZCA9IDE7CisgIGxvZ2ljc1s1MDFdID0gMDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24oJiY6bG9naWNfYW5kKQorICAgIHsKKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yIChpPTE7aTwzMDA7aSsrKSB7CisgICAgICAgICAgbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvciAoaT0zMDA7aTw3MDA7aSsrKSB7CisgICAgICAgICAgbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvciAoaT03MDA7aTwxMDAwO2krKykgeworICAgICAgICAgIGxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZihsb2dpY19hbmQpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gbG9naWMgQU5EIHBhcnQgMlxuIik7CisgIH0KKworICBmb3IoaT0wO2k8MTAwMDtpKyspIHsKKyAgICBsb2dpY3NbaV09MDsKKyAgfQorCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIAorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24ofHw6bG9naWNfb3IpCisgICAgeworICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IgKGk9MTtpPDMwMDtpKyspIHsKKyAgICAgICAgICBsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvciAoaT0zMDA7aTw3MDA7aSsrKSB7CisgICAgICAgICAgbG9naWNfb3IgPSAobG9naWNfb3IgfHwgbG9naWNzW2ldKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IgKGk9NzAwO2k8MTAwMDtpKyspIHsKKyAgICAgICAgICBsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGlmKGxvZ2ljX29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIlxuRXJyb3IgaW4gbG9naWMgT1IgcGFydCAxXG4iKTsKKyAgfQorCisgIGxvZ2ljX29yID0gMDsKKyAgbG9naWNzWzUwMV09MTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgcmVkdWN0aW9uKHx8OmxvZ2ljX29yKQorICAgIHsKKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yIChpPTE7aTwzMDA7aSsrKSB7CisgICAgICAgICAgbG9naWNfb3IgPSAobG9naWNfb3IgfHwgbG9naWNzW2ldKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IgKGk9MzAwO2k8NzAwO2krKykgeworICAgICAgICAgIGxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yIChpPTcwMDtpPDEwMDA7aSsrKSB7CisgICAgICAgICAgbG9naWNfb3IgPSAobG9naWNfb3IgfHwgbG9naWNzW2ldKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZighbG9naWNfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAyXG4iKTsKKyAgfQorCisgIGZvcihpPTA7aTwxMDAwOysraSkgeworICAgIGxvZ2ljc1tpXT0xOworICB9CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIHJlZHVjdGlvbigmOmJpdF9hbmQpCisgICAgeworICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeyAgCisgICAgICAgIGZvcihpPTA7aTwzMDA7KytpKSB7CisgICAgICAgICAgYml0X2FuZCA9IChiaXRfYW5kICYgbG9naWNzW2ldKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeyAgCisgICAgICAgIGZvcihpPTMwMDtpPDcwMDsrK2kpIHsKKyAgICAgICAgICBiaXRfYW5kID0gKGJpdF9hbmQgJiBsb2dpY3NbaV0pOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7ICAKKyAgICAgICAgZm9yKGk9NzAwO2k8MTAwMDsrK2kpIHsKKyAgICAgICAgICBiaXRfYW5kID0gKGJpdF9hbmQgJiBsb2dpY3NbaV0pOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGlmKCFiaXRfYW5kKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIEJJVCBBTkQgcGFydCAxXG4iKTsKKyAgfQorCisgIGJpdF9hbmQgPSAxOworICBsb2dpY3NbNTAxXT0wOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIAorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24oJjpiaXRfYW5kKQorICAgIHsKKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yKGk9MDtpPDMwMDsrK2kpIHsKKyAgICAgICAgICBiaXRfYW5kID0gYml0X2FuZCAmIGxvZ2ljc1tpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IoaT0zMDA7aTw3MDA7KytpKSB7CisgICAgICAgICAgYml0X2FuZCA9IGJpdF9hbmQgJiBsb2dpY3NbaV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yKGk9NzAwO2k8MTAwMDsrK2kpIHsKKyAgICAgICAgICBiaXRfYW5kID0gYml0X2FuZCAmIGxvZ2ljc1tpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZihiaXRfYW5kKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIEJJVCBBTkQgcGFydCAyXG4iKTsKKyAgfQorCisgIGZvcihpPTA7aTwxMDAwO2krKykgeworICAgIGxvZ2ljc1tpXT0wOworICB9CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIHJlZHVjdGlvbih8OmJpdF9vcikKKyAgICB7CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvcihpPTA7aTwzMDA7KytpKSB7CisgICAgICAgICAgYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvcihpPTMwMDtpPDcwMDsrK2kpIHsKKyAgICAgICAgICBiaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yKGk9NzAwO2k8MTAwMDsrK2kpIHsKKyAgICAgICAgICBiaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoYml0X29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIEJJVCBPUiBwYXJ0IDFcbiIpOworICB9CisgIGJpdF9vciA9IDA7CisgIGxvZ2ljc1s1MDFdPTE7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIHJlZHVjdGlvbih8OmJpdF9vcikKKyAgICB7CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvcihpPTA7aTwzMDA7KytpKSB7CisgICAgICAgICAgYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvcihpPTMwMDtpPDcwMDsrK2kpIHsKKyAgICAgICAgICBiaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yKGk9NzAwO2k8MTAwMDsrK2kpIHsKKyAgICAgICAgICBiaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoIWJpdF9vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBCSVQgT1IgcGFydCAyXG4iKTsKKyAgfQorCisgIGZvcihpPTA7aTwxMDAwO2krKykgeworICAgIGxvZ2ljc1tpXT0wOworICB9CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIHJlZHVjdGlvbiheOmV4Y2x1c2l2X2JpdF9vcikKKyAgICB7CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7ICAKKyAgICAgICAgZm9yKGk9MDtpPDMwMDsrK2kpIHsKKyAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsgIAorICAgICAgICBmb3IoaT0zMDA7aTw3MDA7KytpKSB7CisgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7ICAKKyAgICAgICAgZm9yKGk9NzAwO2k8MTAwMDsrK2kpIHsKKyAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoZXhjbHVzaXZfYml0X29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIEVYQ0xVU0lWIEJJVCBPUiBwYXJ0IDFcbiIpOworICB9CisKKyAgZXhjbHVzaXZfYml0X29yID0gMDsKKyAgbG9naWNzWzUwMV09MTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgcmVkdWN0aW9uKF46ZXhjbHVzaXZfYml0X29yKQorICAgIHsKKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yKGk9MDtpPDMwMDsrK2kpIHsKKyAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yKGk9MzAwO2k8NzAwOysraSkgeworICAgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IoaT03MDA7aTwxMDAwOysraSkgeworICAgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZighZXhjbHVzaXZfYml0X29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIEVYQ0xVU0lWIEJJVCBPUiBwYXJ0IDJcbiIpOworICB9CisKKyAgLypwcmludGYoIlxuUmVzdWx0OiVkXG4iLHJlc3VsdCk7Ki8KKyAgcmV0dXJuIChyZXN1bHQ9PTApOworfQoraW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3NlY3Rpb25zX3JlZHVjdGlvbigpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NpbmdsZS9vbXBfc2luZ2xlLmMgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2luZ2xlL29tcF9zaW5nbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTNjMzQxCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NpbmdsZS9vbXBfc2luZ2xlLmMKQEAgLTAsMCArMSw0NCBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgdGVzdF9vbXBfc2luZ2xlKCkKK3sKKyAgaW50IG5yX3RocmVhZHNfaW5fc2luZ2xlOworICBpbnQgcmVzdWx0OworICBpbnQgbnJfaXRlcmF0aW9uczsKKyAgaW50IGk7CisKKyAgbnJfdGhyZWFkc19pbl9zaW5nbGUgPSAwOworICByZXN1bHQgPSAwOworICBucl9pdGVyYXRpb25zID0gMDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBwcml2YXRlKGkpCisgIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspIHsKKyAgICAgICNwcmFnbWEgb21wIHNpbmdsZSAKKyAgICAgIHsgIAorICAgICAgICAjcHJhZ21hIG9tcCBmbHVzaAorICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZSsrOworICAgICAgICAjcHJhZ21hIG9tcCBmbHVzaCAgICAgICAgICAgICAKKyAgICAgICAgbnJfaXRlcmF0aW9ucysrOworICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZS0tOworICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBucl90aHJlYWRzX2luX3NpbmdsZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuICgocmVzdWx0ID09IDApICYmIChucl9pdGVyYXRpb25zID09IExPT1BDT1VOVCkpOworfSAvKiBlbmQgb2YgY2hlY2tfc2luZ2xlKi8KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3NpbmdsZSgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NpbmdsZS9vbXBfc2luZ2xlX2NvcHlwcml2YXRlLmMgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2luZ2xlL29tcF9zaW5nbGVfY29weXByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjVjZDk1Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NpbmdsZS9vbXBfc2luZ2xlX2NvcHlwcml2YXRlLmMKQEAgLTAsMCArMSw2MCBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworI2RlZmluZSBERUJVR19URVNUIDAKKworaW50IGo7CisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKGopCisKK2ludCB0ZXN0X29tcF9zaW5nbGVfY29weXByaXZhdGUoKQoreworICBpbnQgcmVzdWx0OworICBpbnQgbnJfaXRlcmF0aW9uczsKKworICByZXN1bHQgPSAwOworICBucl9pdGVyYXRpb25zID0gMDsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykKKyAgICB7CisjaWYgREVCVUdfVEVTVAorICAgICAgICAgaW50IHRocmVhZDsKKyAgICAgICAgIHRocmVhZCA9IG9tcF9nZXRfdGhyZWFkX251bSAoKTsKKyNlbmRpZgorICAgICAgI3ByYWdtYSBvbXAgc2luZ2xlIGNvcHlwcml2YXRlKGopCisgICAgICB7CisgICAgICAgIG5yX2l0ZXJhdGlvbnMrKzsKKyAgICAgICAgaiA9IGk7CisjaWYgREVCVUdfVEVTVAorICAgICAgICBwcmludGYgKCJ0aHJlYWQgJWQgYXNzaWducywgaiA9ICVkLCBpID0gJWRcbiIsIHRocmVhZCwgaiwgaSk7CisjZW5kaWYKKyAgICAgIH0KKyNpZiBERUJVR19URVNUCisgICAgICAjcHJhZ21hIG9tcCBiYXJyaWVyCisjZW5kaWYKKyAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICB7CisjaWYgREVCVUdfVEVTVAorICAgICAgICBwcmludGYgKCJ0aHJlYWQgPSAlZCwgaiA9ICVkLCBpID0gJWRcbiIsIHRocmVhZCwgaiwgaSk7CisjZW5kaWYKKyAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgaiAtIGk7CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBiYXJyaWVyCisgICAgfSAvKiBlbmQgb2YgZm9yICovCisgIH0gLyogZW5kIG9mIHBhcmFsbGVsICovCisgIHJldHVybiAoKHJlc3VsdCA9PSAwKSAmJiAobnJfaXRlcmF0aW9ucyA9PSBMT09QQ09VTlQpKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3NpbmdsZV9jb3B5cHJpdmF0ZSgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NpbmdsZS9vbXBfc2luZ2xlX25vd2FpdC5jIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NpbmdsZS9vbXBfc2luZ2xlX25vd2FpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4Mzc0OGQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2luZ2xlL29tcF9zaW5nbGVfbm93YWl0LmMKQEAgLTAsMCArMSw1NyBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgbXlfaXRlcmF0aW9uczsKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUobXlfaXRlcmF0aW9ucykKKworaW50IHRlc3Rfb21wX3NpbmdsZV9ub3dhaXQoKQoreworICBpbnQgbnJfaXRlcmF0aW9uczsKKyAgaW50IHRvdGFsX2l0ZXJhdGlvbnMgPSAwOworICBpbnQgaTsKKworICBucl9pdGVyYXRpb25zID0gMDsKKyAgbXlfaXRlcmF0aW9ucyA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgcHJpdmF0ZShpKQorICB7CisgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKSB7CisgICAgICAjcHJhZ21hIG9tcCBzaW5nbGUgbm93YWl0CisgICAgICB7CisgICAgICAgICNwcmFnbWEgb21wIGF0b21pYyAgCisgICAgICAgIG5yX2l0ZXJhdGlvbnMrKzsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBwcml2YXRlKGkpIAorICB7CisgICAgbXlfaXRlcmF0aW9ucyA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKSB7CisgICAgICAjcHJhZ21hIG9tcCBzaW5nbGUgbm93YWl0CisgICAgICB7CisgICAgICAgIG15X2l0ZXJhdGlvbnMrKzsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICB7CisgICAgICB0b3RhbF9pdGVyYXRpb25zICs9IG15X2l0ZXJhdGlvbnM7CisgICAgfQorCisgIH0KKyAgcmV0dXJuICgobnJfaXRlcmF0aW9ucyA9PSBMT09QQ09VTlQpICYmICh0b3RhbF9pdGVyYXRpb25zID09IExPT1BDT1VOVCkpOworfSAvKiBlbmQgb2YgY2hlY2tfc2luZ2xlX25vd2FpdCovCisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9zaW5nbGVfbm93YWl0KCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2luZ2xlL29tcF9zaW5nbGVfcHJpdmF0ZS5jIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NpbmdsZS9vbXBfc2luZ2xlX3ByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzU1NmNmCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NpbmdsZS9vbXBfc2luZ2xlX3ByaXZhdGUuYwpAQCAtMCwwICsxLDU3IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCBteWl0ID0gMDsKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUobXlpdCkKK2ludCBteXJlc3VsdCA9IDA7CisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKG15cmVzdWx0KQorCitpbnQgdGVzdF9vbXBfc2luZ2xlX3ByaXZhdGUoKQoreworICBpbnQgbnJfdGhyZWFkc19pbl9zaW5nbGU7CisgIGludCByZXN1bHQ7CisgIGludCBucl9pdGVyYXRpb25zOworICBpbnQgaTsKKworICBteWl0ID0gMDsKKyAgbnJfdGhyZWFkc19pbl9zaW5nbGUgPSAwOworICBucl9pdGVyYXRpb25zID0gMDsKKyAgcmVzdWx0ID0gMDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBwcml2YXRlKGkpCisgIHsKKyAgICBteXJlc3VsdCA9IDA7CisgICAgbXlpdCA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKSB7CisgICAgICAjcHJhZ21hIG9tcCBzaW5nbGUgcHJpdmF0ZShucl90aHJlYWRzX2luX3NpbmdsZSkgbm93YWl0CisgICAgICB7ICAKKyAgICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUgPSAwOworICAgICAgICAjcHJhZ21hIG9tcCBmbHVzaAorICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZSsrOworICAgICAgICAjcHJhZ21hIG9tcCBmbHVzaCAgICAgICAgICAgICAKKyAgICAgICAgbXlpdCsrOworICAgICAgICBteXJlc3VsdCA9IG15cmVzdWx0ICsgbnJfdGhyZWFkc19pbl9zaW5nbGU7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgeworICAgICAgcmVzdWx0ICs9IG5yX3RocmVhZHNfaW5fc2luZ2xlOworICAgICAgbnJfaXRlcmF0aW9ucyArPSBteWl0OworICAgIH0KKyAgfQorICByZXR1cm4gKChyZXN1bHQgPT0gMCkgJiYgKG5yX2l0ZXJhdGlvbnMgPT0gTE9PUENPVU5UKSk7Cit9IC8qIGVuZCBvZiBjaGVja19zaW5nbGUgcHJpdmF0ZSAqLyAKKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3NpbmdsZV9wcml2YXRlKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rvb2xzL2NoZWNrLWRlcGVuZHMucGwgYi9maW5hbC9ydW50aW1lL3Rvb2xzL2NoZWNrLWRlcGVuZHMucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDJhN2RkZAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvY2hlY2stZGVwZW5kcy5wbApAQCAtMCwwICsxLDUwMiBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorCisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBGaW5kQmluOwordXNlIGxpYiAiJEZpbmRCaW46OkJpbi9saWIiOworCit1c2UgdG9vbHM7Cit1c2UgUGxhdGZvcm0gIjp2YXJzIjsKKworb3VyICRWRVJTSU9OID0gIjAuMDA1IjsKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBPdXB1dCBwYXJzZSBlcnJvci4KKyMgICAgICR0b29sIC0tIE5hbWUgb2YgdG9vbC4KKyMgICAgIEBidWxrIC0tIE91dHB1dCBvZiB0aGUgdG9vbC4KKyMgICAgICRuICAgIC0tIE51bWJlciBvZiBsaW5lIGNhdXNlZCBwYXJzZSBlcnJvci4KK3N1YiBwYXJzZV9lcnJvcigkXEAkKSB7CisgICAgbXkgKCAkdG9vbCwgJGJ1bGssICRuICkgPSBAXzsKKyAgICBteSBAYnVsazsKKyAgICBmb3IgKCBteSAkaSA9IDA7ICRpIDwgQCRidWxrOyArKyAkaSApIHsKKyAgICAgICAgcHVzaCggQGJ1bGssICggJGkgPT0gJG4gPyAiPj4+ICIgOiAiICAgICIgKSAuICRidWxrLT5bICRpIF0gKTsKKyAgICB9OyAjIGZvciAkaQorICAgIHJ1bnRpbWVfZXJyb3IoICJGYWlsIHRvIHBhcnNlICR0b29sIG91dHB1dDoiLCBAYnVsaywgIihlb2YpIiApOworfTsgIyBzdWIgcGFyc2VfZXJyb3IKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExpbnV4KiBPUyB2ZXJzaW9uIG9mIGdldF9kZXBzKCkgcGFyc2VzIG91dHB1dCBvZiBsZGQ6CisjCisjICQgbGRkIGxpYm5hbWUuc28KKyMgICBsaWJjLnNvLjYgPT4gL2xpYjY0L2xpYmMuc28uNiAoMHgwMDAwMmI2MGZlZGQ4MDAwKQorIyAgIGxpYmRsLnNvLjIgPT4gL2xpYjY0L2xpYmRsLnNvLjIgKDB4MDAwMDJiNjBmZjEyYjAwMCkKKyMgICBsaWJwdGhyZWFkLnNvLjAgPT4gL2xpYjY0L2xpYnB0aHJlYWQuc28uMCAoMHgwMDAwMmI2MGZmMzJmMDAwKQorIyAgIC9saWI2NC9sZC1saW51eC14ODYtNjQuc28uMiAoMHgwMDAwMDAzODc5NDAwMDAwKQorIworIyBOb3RlOiBsZGQgcHJpbnRkIGFsbCB0aGUgZGVwZW5kZW5jaWVzLCBkaXJlY3QgYW5kIGluZGlyZWN0LiAoRm9yIGV4YW1wbGUsIGlmIHNwZWNpZmllZCBsaWJyYXJ5CisjIHJlcXVpcmVzIGxpYmRsLnNvLCBhbmQgbGliZGwuc28gcmVxdWlyZXMgL2xpYi9sZC1saW51eC5zbywgbGRkIHByaW50cyBib3RoIGxpYmRsLnNvIGFuZAorIyAvbGliL2xkLWxpbnV4LnNvKS4gSWYgeW91IGRvIG5vdCB3YW50IGluZGlyZWN0IGRlcGVuZGVuY2llcywgbG9vayBhdCByZWFkZWxmIHRvb2wuCisjCitzdWIgZ2V0X2RlcHNfbGRkKCQpIHsKKworICAgIG15ICRsaWIgPSBzaGlmdCAoIEBfICk7CisgICAgbXkgJHRvb2wgPSAibGRkIjsKKyAgICBteSBAYnVsazsKKyAgICBteSBAZGVwczsKKworICAgIGV4ZWN1dGUoIFsgJHRvb2wsICRsaWIgXSwgLXN0ZG91dCA9PiBcQGJ1bGsgKTsKKyAgICBkZWJ1ZyggQGJ1bGssICIoZW9mKSIgKTsKKworICAgIGZvcmVhY2ggbXkgJGkgKCAwIC4uIEBidWxrIC0gMSApIHsKKyAgICAgICAgbXkgJGxpbmUgPSAkYnVsa1sgJGkgXTsKKyAgICAgICAgaWYgKCAkbGluZSAhfiBte15ccyooPzooW19hLXowLTkuKy0vXSopXHMrPT5ccyspPyhbX2EtejAtOS4rLS9dKilccytcKDB4WzAtOWEtel0qXCkkfWkgKSB7CisgICAgICAgICAgICBwYXJzZV9lcnJvciggJHRvb2wsIEBidWxrLCAkaSApOworICAgICAgICB9OyAjIGlmCisgICAgICAgIG15ICRkZXAgPSAoIGRlZmluZWQoICQxICkgPyAkMSA6ICQyICk7CisgICAgICAgIHB1c2goIEBkZXBzLCAkZGVwICk7CisgICAgfTsgIyBmb3JlYWNoICRpCisKKyAgICByZXR1cm4gQGRlcHM7CisKK307ICMgc3ViIGdldF9kZXBzX2xkZAorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQW5vdGhlciBMaW51eCogT1MgdmVyc2lvbiBvZiBnZXRfZGVwcygpIHBhcnNlcyBvdXRwdXQgb2YgcmVhZGVsZjoKKyMKKyMgJCByZWFkZWxmIC1kIGV4cG9ydHMvbGluXzMyZS9saWIvbGlib21wLnNvCisjCisjIER5bmFtaWMgc2VnbWVudCBhdCBvZmZzZXQgMHg4NzAwOCBjb250YWlucyAyNCBlbnRyaWVzOgorIyAgIFRhZyAgICAgICAgVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lL1ZhbHVlCisjICAweDAwMDAwMDAwMDAwMDAwMDEgKE5FRURFRCkgICAgICAgICAgICAgU2hhcmVkIGxpYnJhcnk6IFtsaWJjLnNvLjZdCisjICAweDAwMDAwMDAwMDAwMDAwMDEgKE5FRURFRCkgICAgICAgICAgICAgU2hhcmVkIGxpYnJhcnk6IFtsaWJkbC5zby4yXQorIyAgMHgwMDAwMDAwMDAwMDAwMDAxIChORUVERUQpICAgICAgICAgICAgIFNoYXJlZCBsaWJyYXJ5OiBbbGlicHRocmVhZC5zby4wXQorIyAgMHgwMDAwMDAwMDAwMDAwMDBlIChTT05BTUUpICAgICAgICAgICAgIExpYnJhcnkgc29uYW1lOiBbbGlib21wLnNvXQorIyAgMHgwMDAwMDAwMDAwMDAwMDBkIChGSU5JKSAgICAgICAgICAgICAgIDB4NTFjYWEKKyMgIDB4MDAwMDAwMDAwMDAwMDAwNCAoSEFTSCkgICAgICAgICAgICAgICAweDE1OAorIyAgMHgwMDAwMDAwMDAwMDAwMDA1IChTVFJUQUIpICAgICAgICAgICAgIDB4OTM1MAorIyAgLi4uCisjCisjIE5vdGU6IEluIGNvbnRyYXN0IHRvIGxkZCwgcmVhZGxlZiBzaG93cyBvbmx5IGRpcmVjdCBkZXBlbmRlbmNpZXMuCisjCitzdWIgZ2V0X2RlcHNfcmVhZGVsZigkKSB7CisKKyAgICBteSAkZmlsZSA9IHNoaWZ0ICggQF8gKTsKKyAgICBteSAkdG9vbDsKKyAgICBteSBAYnVsazsKKyAgICBteSBAZGVwczsKKworICAgIGlmKCR0YXJnZXRfYXJjaCBlcSAibWljIikgeworICAgICAgICAkdG9vbCA9ICJ4ODZfNjQtazFvbS1saW51eC1yZWFkZWxmIjsKKyAgICB9IGVsc2UgeworICAgICAgICAkdG9vbCA9ICJyZWFkZWxmIjsKKyAgICB9CisKKyAgICAjIEZvcmNlIHRoZSByZWFkZWxmIGNhbGwgdG8gYmUgaW4gRW5nbGlzaC4gRm9yIGV4YW1wbGUsIHdoZW4gcmVhZGVsZgorICAgICMgaXMgY2FsbGVkIG9uIGEgZnJlbmNoIGxvY2FsaXphdGlvbiwgaXQgd2lsbCBmaW5kICJMaWJyYWlyaWUgcGFydGFnZWVzIgorICAgICMgaW5zdGVhZCBvZiBzaGFyZWQgbGlicmFyeQorICAgICRFTlZ7IExBTkcgfSA9ICJDIjsKKworICAgIGV4ZWN1dGUoIFsgJHRvb2wsICItZCIsICRmaWxlIF0sIC1zdGRvdXQgPT4gXEBidWxrICk7CisgICAgZGVidWcoIEBidWxrLCAiKGVvZikiICk7CisKKyAgICBteSAkaSA9IDA7CisgICAgIyBQYXJzZSBoZWFkZXIuCisgICAgKCAkaSA8IEBidWxrIGFuZCAkYnVsa1sgJGkgXSA9fiBte15ccyokfSApCisgICAgICAgIG9yIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7CisgICAgKysgJGk7CisgICAgaWYgKCAkaSA9PSBAYnVsayAtIDEgYW5kICRidWxrWyAkaSBdID1+IG17XlRoZXJlIGlzIG5vIGR5bmFtaWMgc2VjdGlvbiBpbiB0aGlzIGZpbGVcLlxzKiR9ICkgeworICAgICAgICAjIFRoaXMgaXMgbm90IGR5bmFtaWMgZXhlY3V0YWJsZSA9PiBubyBkZXBlbmRlbmNpZXMuCisgICAgICAgIHJldHVybiBAZGVwczsKKyAgICB9OyAjIGlmCisgICAgKCAkaSA8IEBidWxrIGFuZCAkYnVsa1sgJGkgXSA9fiBte15EeW5hbWljICg/OnNlZ21lbnR8c2VjdGlvbikgYXQgb2Zmc2V0IDB4WzAtOWEtZl0rIGNvbnRhaW5zIFxkKyBlbnRyaWVzOlxzKiR9ICkKKyAgICAgICAgb3IgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsKKyAgICArKyAkaTsKKyAgICAoICRpIDwgQGJ1bGsgYW5kICRidWxrWyAkaSBdID1+IG17XlxzKlRhZ1xzK1R5cGVccytOYW1lL1ZhbHVlXHMqJH0gKQorICAgICAgICBvciBwYXJzZV9lcnJvciggJHRvb2wsIEBidWxrLCAkaSApOworICAgICsrICRpOworICAgICMgUGFyc2UgYm9keS4KKyAgICB3aGlsZSAoICRpIDwgQGJ1bGsgKSB7CisgICAgICAgIG15ICRsaW5lID0gJGJ1bGtbICRpIF07CisgICAgICAgIGlmICggJGxpbmUgIX4gbXteXHMqMHhbMC05YS1mXStccytcKChbX0EtWjAtOV0rKVwpXHMrKC4qKVxzKiR9aSApIHsKKyAgICAgICAgICAgIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgbXkgKCAkdHlwZSwgJHZhbHVlICkgPSAoICQxLCAkMiApOworICAgICAgICBpZiAoICR0eXBlIGVxICJORUVERUQiICkgeworICAgICAgICAgICAgaWYgKCAkdmFsdWUgIX4gbXtcQVNoYXJlZCBsaWJyYXJ5OiBcWyguKilcXVx6fSApIHsKKyAgICAgICAgICAgICAgICBwYXJzZV9lcnJvciggJHRvb2wsIEBidWxrLCAkaSApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgbXkgJGRlcCA9ICQxOworICAgICAgICAgICAgcHVzaCggQGRlcHMsICRkZXAgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICArKyAkaTsKKyAgICB9OyAjIGZvcmVhY2ggJGkKKworICAgIHJldHVybiBAZGVwczsKKworfTsgIyBzdWIgZ2V0X2RlcHNfcmVhZGVsZgorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgT1MgWCogdmVyc2lvbiBvZiBnZXRfZGVwcygpIHBhcnNlcyBvdXRwdXQgb2Ygb3Rvb2w6CisjCisjICQgb3Rvb2wgLUwgbGlibmFtZS5keWxpYgorIyBleHBvcnRzL21hY18zMi9saWIudGhpbi9saWJvbXAuZHlsaWI6CisjICAgICAgICBsaWJvbXAuZHlsaWIgKGNvbXBhdGliaWxpdHkgdmVyc2lvbiA1LjAuMCwgY3VycmVudCB2ZXJzaW9uIDUuMC4wKQorIyAgICAgICAgL3Vzci9saWIvbGliU3lzdGVtLkIuZHlsaWIgKGNvbXBhdGliaWxpdHkgdmVyc2lvbiAxLjAuMCwgY3VycmVudCB2ZXJzaW9uIDg4LjEuMykKKyMKK3N1YiBnZXRfZGVwc19vdG9vbCgkKSB7CisKKyAgICBteSAkZmlsZSA9IHNoaWZ0ICggQF8gKTsKKyAgICBteSAkbmFtZSA9IGdldF9maWxlKCAkZmlsZSApOworICAgIG15ICR0b29sID0gIm90b29sIjsKKyAgICBteSBAYnVsazsKKyAgICBteSBAZGVwczsKKworICAgIGlmICggJHRhcmdldF9hcmNoIGVxICIzMmUiICkgeworICAgICAgICAjIE9uIG9sZGVyIChUaWdlcikgc3lzdGVtcyBvdG9vbCBkb2VzIG5vdCByZWNvZ25pemUgNjQtYml0IGJpbmFyaWVzLCBzbyB0cnkgdG8gbG9jYXRlCisgICAgICAgICMgb3Rvb2w2NC4KKyAgICAgICAgbXkgJHBhdGggPSB3aGljaCggIm90b29sNjQiICk7CisgICAgICAgIGlmICggZGVmaW5lZCAoICRwYXRoICkgKSB7CisgICAgICAgICAgICAkdG9vbCA9ICJvdG9vbDY0IjsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKworICAgIGV4ZWN1dGUoIFsgJHRvb2wsICItTCIsICRmaWxlIF0sIC1zdGRvdXQgPT4gXEBidWxrICk7CisgICAgZGVidWcoIEBidWxrLCAiKGVvZikiICk7CisKKyAgICBteSAkaSA9IDA7CisgICAgIyBQYXJzZSB0aGUgZmlyc3Qgb25lIG9yIHR3byBsaW5lcyBzZXBhcmF0ZWx5LgorICAgICggJGkgPCBAYnVsayBhbmQgJGJ1bGtbICRpIF0gPX4gbXteXFEkZmlsZVxFOiR9ICkKKyAgICAgICAgb3IgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsKKyAgICArKyAkaTsKKyAgICBpZiAoICRuYW1lID1+IG17XC5keWxpYlx6fSApIHsKKyAgICAgICAgIyBJbiBjYXNlIG9mIGR5bmFtaWMgbGlicmFyeSBvdG9vbCBwcmludCB0aGUgbGlicmFyeSBpdHNlbGYgYXMgYSBkZXBlbmRlbnQgbGlicmFyeS4KKyAgICAgICAgKCAkaSA8IEBidWxrIGFuZCAkYnVsa1sgJGkgXSA9fiBte15ccytcUSRuYW1lXEVccytcKGNvbXBhdGliaWxpdHkgdmVyc2lvbi4qXCkkfSApCisgICAgICAgICAgICBvciBwYXJzZV9lcnJvciggJHRvb2wsIEBidWxrLCAkaSApOworICAgICAgICArKyAkaTsKKyAgICB9OyAjIGlmCisKKyAgICAjIFRoZW4gcGFyc2UgdGhlIHJlc3QuCisgICAgd2hpbGUgKCAkaSA8IEBidWxrICkgeworICAgICAgICBteSAkbGluZSA9ICRidWxrWyAkaSBdOworICAgICAgICBpZiAoICRsaW5lICF+IG0vXlxzKiguKilccytcKGNvbXBhdGliaWxpdHkgdmVyc2lvblxzLipcKSQvICkgeworICAgICAgICAgICAgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBteSAoICRkZXAgKSA9ICggJDEgKTsKKyAgICAgICAgcHVzaCggQGRlcHMsICRkZXAgKTsKKyAgICAgICAgKysgJGk7CisgICAgfTsgIyB3aGlsZQorCisgICAgcmV0dXJuIEBkZXBzOworCit9OyAjIHN1YiBnZXRfZGVwc19vdG9vbAorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgV2luZG93cyogT1MgdmVyc2lvbiBvZiBnZXRfZGVwcygpIHBhcnNlcyBvdXRwdXQgb2YgbGluazoKKyMKKyMgPiBsaW5rIC1kdW1wIC1kZXBlbmRlbnRzIGxpYm5hbWUuZGxsCisjIE1pY3Jvc29mdCAoUikgQ09GRi9QRSBEdW1wZXIgVmVyc2lvbiA4LjAwLjQwMzEwLjM5CisjIENvcHlyaWdodCAoQykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgRHVtcCBvZiBmaWxlIFM6XFByb2plY3RzLk9NUFx1c2Vyc1xvbWFseXNoZVxvbXBcbGlib21wXGV4cG9ydHNcd2luXzY0XGxpYlxsaWJvbXBtZC5kbGwKKyMgRmlsZSBUeXBlOiBETEwKKyMgICBJbWFnZSBoYXMgdGhlIGZvbGxvd2luZyBkZXBlbmRlbmNpZXM6CisjICAgICBLRVJORUwzMi5kbGwKKyMgICBTdW1tYXJ5CisjICAgICAgICAgQzAwMCAuZGF0YQorIyAgICAgICAgIDYwMDAgLnBkYXRhCisjICAgICAgICAxODAwMCAucmRhdGEKKyMgICAgICAgIC4uLgorIworIyA+IGxpbmsgLWR1bXAgLWRpcmVjdGl2ZXMgbGlibmFtZS5saWIKKyMgTWljcm9zb2Z0IChSKSBDT0ZGL1BFIER1bXBlciBWZXJzaW9uIDguMDAuNDAzMTAuMzkKKyMgQ29weXJpZ2h0IChDKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBEdW1wIG9mIGZpbGUgUzpcUHJvamVjdHMuT01QXHVzZXJzXG9tYWx5c2hlXG9tcFxsaWJvbXBcZXhwb3J0c1x3aW5fMzJlXGxpYlxsaWJpbXA1bXQubGliCisjIEZpbGUgVHlwZTogTElCUkFSWQorIyAgIExpbmtlciBEaXJlY3RpdmVzCisjICAgLS0tLS0tLS0tLS0tLS0tLS0KKyMgICAtZGVmYXVsdGxpYjoidXVpZC5saWIiCisjICAgLWRlZmF1bHRsaWI6InV1aWQubGliIgorIyAgIC4uLi4uCisjICAgU3VtbWFyeQorIyAgICAgICAzMjUwIC5ic3MKKyMgICAgICAgM0ZCQyAuZGF0YQorIyAgICAgICAgIDM0IC5kYXRhMQorIyAgICAgICAuLi4uCitzdWIgZ2V0X2RlcHNfbGluaygkKSB7CisKKyAgICBteSAoICRsaWIgKSA9IEBfOworICAgIG15ICR0b29sID0gImxpbmsiOworICAgIG15IEBidWxrOworICAgIG15IEBkZXBzOworCisgICAgbXkgJGV4dCA9IGxjKCBnZXRfZXh0KCAkbGliICkgKTsKKyAgICBpZiAoICRleHQgIX4gbXtcQVwuKD86bGlifGRsbHxleGUpXHp9aSApIHsKKyAgICAgICAgcnVudGltZV9lcnJvciggIkluY29ycmVjdCBmaWxlIGlzIHNwZWNpZmllZDogYCRsaWInOyBvbmx5IGBsaWInLCBgZGxsJyBvciBgZXhlJyBmaWxlIGV4cGVjdGVkIiApOworICAgIH07ICMgaWYKKworICAgIGV4ZWN1dGUoCisgICAgICAgIFsgJHRvb2wsICIvZHVtcCIsICggJGV4dCBlcSAiLmxpYiIgPyAiL2RpcmVjdGl2ZXMiIDogIi9kZXBlbmRlbnRzIiApLCAkbGliIF0sCisgICAgICAgIC1zdGRvdXQgPT4gXEBidWxrCisgICAgKTsKKworICAgIGRlYnVnKCBAYnVsaywgIihlb2YpIiApOworCisgICAgbXkgJGkgPSAwOworICAgICggJGkgPCBAYnVsayBhbmQgJGJ1bGtbICRpIF0gPX4gbXteTWljcm9zb2Z0IFwoUlwpIENPRkZcL1BFIER1bXBlciBWZXJzaW9uLiokfSApIG9yIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7ICsrICRpOworICAgICggJGkgPCBAYnVsayBhbmQgJGJ1bGtbICRpIF0gPX4gbXteQ29weXJpZ2h0IFwoQ1wpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvblwuLiokfSApIG9yIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7ICsrICRpOworICAgICggJGkgPCBAYnVsayBhbmQgJGJ1bGtbICRpIF0gPX4gbXteXHMqJH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIG9yIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7ICsrICRpOworICAgICggJGkgPCBAYnVsayBhbmQgJGJ1bGtbICRpIF0gPX4gbXteXHMqJH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIG9yIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7ICsrICRpOworICAgICggJGkgPCBAYnVsayBhbmQgJGJ1bGtbICRpIF0gPX4gbXteRHVtcCBvZiBmaWxlXHNcUSRsaWJcRSR9ICAgICAgICAgICAgICAgICAgICApIG9yIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7ICsrICRpOworICAgICggJGkgPCBAYnVsayBhbmQgJGJ1bGtbICRpIF0gPX4gbXteXHMqJH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIG9yIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7ICsrICRpOworICAgICggJGkgPCBAYnVsayBhbmQgJGJ1bGtbICRpIF0gPX4gbXteRmlsZSBUeXBlOlxzKC4qKSR9ICAgICAgICAgICAgICAgICAgICAgICAgICApIG9yIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7ICsrICRpOworICAgICggJGkgPCBAYnVsayBhbmQgJGJ1bGtbICRpIF0gPX4gbXteXHMqJH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIG9yIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7ICsrICRpOworCisgICAgaWYgKCAkZXh0IGVxICIubGliIiApIHsKKworICAgICAgICBteSAlZGVwczsKKyAgICAgICAgd2hpbGUgKCAkaSA8IEBidWxrICkgeworICAgICAgICAgICAgbXkgJGxpbmUgPSAkYnVsa1sgJGkgXTsKKyAgICAgICAgICAgIGlmICggMCApIHsKKyAgICAgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccypbLS9dZGVmYXVsdGxpYlw6KC4qKVxzKiR9aSApIHsKKyAgICAgICAgICAgICAgICBteSAkZGVwID0gJDE7CisgICAgICAgICAgICAgICAgIyBOb3JtYWxpemUgbGlicmFyeSBuYW1lOgorICAgICAgICAgICAgICAgICRkZXAgPSBsYyggJDEgKTsgICAgICAgICAgICAgICMgQ29udmVydCB0byBsb3dlciBjYXNlLgorICAgICAgICAgICAgICAgICRkZXAgPX4gc3tcQSIoLiopIlx6fXskMX07ICAgICMgRHJvcCBzdXJyb3VuZGluZyBxdW90ZXMgKGlmIGFueSkuCisgICAgICAgICAgICAgICAgJGRlcCA9fiBze1wubGliXHp9e307ICAgICAgICAgIyBEcm9wIC5saWIgc3VmZml4IChpZiBhbnkpLgorICAgICAgICAgICAgICAgICRkZXBzeyAkZGVwIH0gPSAxOworICAgICAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XlxzKkxpbmtlciBEaXJlY3RpdmVzXHMqJH0gKSB7CisgICAgICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteXHMqLStccyokfSApIHsKKyAgICAgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccyovYWx0ZXJuYXRlbmFtZVw6LiokfSApIHsKKyAgICAgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccyokfSApIHsKKyAgICAgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccyovRkFJTElGTUlTTUFUQ0hcOi4qJH0gKSB7CisgICAgICAgICAgICAgICAgIyBUaGlzIGRpcmVjdGl2ZSBpcyBwcm9kdWNlZCBvbmx5IGJ5IF9NU0NfVkVSPTE2MDAKKyAgICAgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccypTdW1tYXJ5XHMqJH0gKSB7CisgICAgICAgICAgICAgICAgbGFzdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICsrICRpOworICAgICAgICB9ICMgd2hpbGUKKyAgICAgICAgQGRlcHMgPSBrZXlzKCAlZGVwcyApOworCisgICAgfSBlbHNlIHsKKworICAgICAgICAoICRpIDwgQGJ1bGsgYW5kICRidWxrWyAkaSBdID1+IG17XHMqSW1hZ2UgaGFzIHRoZSBmb2xsb3dpbmcgZGVwZW5kZW5jaWVzXDokfSApCisgICAgICAgICAgICBvciBwYXJzZV9lcnJvciggJHRvb2wsIEBidWxrLCAkaSApOworICAgICAgICArKyAkaTsKKyAgICAgICAgd2hpbGUgKCAkaSA8IEBidWxrICkgeworICAgICAgICAgICAgbXkgJGxpbmUgPSAkYnVsa1sgJGkgXTsKKyAgICAgICAgICAgIGlmICggMCApIHsKKyAgICAgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccyokfSApIHsKKyAgICAgICAgICAgICAgICAjIElnbm9yZSBlbXB0eSBsaW5lcy4KKyAgICAgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccyooLipcLmRsbCkkfWkgKSB7CisgICAgICAgICAgICAgICAgbXkgJGRlcCA9IGxjKCAkMSApOworICAgICAgICAgICAgICAgIHB1c2goIEBkZXBzLCAkZGVwICk7CisgICAgICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteXHMqU3VtbWFyeSR9ICkgeworICAgICAgICAgICAgICAgIGxhc3Q7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICArKyAkaTsKKyAgICAgICAgfTsgIyB3aGlsZQorCisgICAgfTsgIyBpZgorCisgICAgcmV0dXJuIEBkZXBzOworCit9OyAjIHN1YiBnZXRfZGVwc19saW5rCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBNYWluLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFBhcnNlIGNvbW1hbmQgbGluZS4KK215ICRleHBlY3RlZDsKK215ICRiYXJlOworR2V0b3B0OjpMb25nOjpDb25maWd1cmUoICJwZXJtdXRlIiApOworZ2V0X29wdGlvbnMoCisgICAgUGxhdGZvcm06OnRhcmdldF9vcHRpb25zKCksCisgICAgImJhcmUiICAgICAgID0+IFwkYmFyZSwKKyAgICAiZXhwZWN0ZWQ9cyIgPT4gXCRleHBlY3RlZCwKKyk7CitteSBAZXhwZWN0ZWQ7CitpZiAoIGRlZmluZWQoICRleHBlY3RlZCApICkgeworICAgIGlmICggJGV4cGVjdGVkIG5lICJub25lIiApIHsKKyAgICAgICAgQGV4cGVjdGVkID0gc29ydCggc3BsaXQoICIsIiwgJGV4cGVjdGVkICkgKTsKKyAgICAgICAgaWYgKCAkdGFyZ2V0X29zIGVxICJ3aW4iICkgeworICAgICAgICAgICAgQGV4cGVjdGVkID0gbWFwKCBsYyggJF8gKSwgQGV4cGVjdGVkICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGlmCit9OyAjIGlmCitpZiAoIEBBUkdWIDwgMSApIHsKKyAgICBjbWRsaW5lX2Vycm9yKCAiU3BlY2lmeSBhIGxpYnJhcnkgbmFtZSB0byBjaGVjayBmb3IgZGVwZW5kZW5jaWVzIiApOworfTsgIyBpZgoraWYgKCBAQVJHViA+IDEgKSB7CisgICAgY21kbGluZV9lcnJvciggIlRvbyBtYW55IGFyZ3VtZW50cyIgKTsKK307ICMgaWYKK215ICRsaWIgPSBzaGlmdCggQEFSR1YgKTsKK2lmICggbm90IC1lICRsaWIgKXsKKyAgICBydW50aW1lX2Vycm9yKCAiU3BlY2lmaWVkIGZpbGUgZG9lcyBub3QgZXhpc3Q6IFwiJGxpYlwiIiApOworfTsgIyBpZgorCisjIFNlbGVjdCBhcHByb3ByaWF0ZSBnZXRfZGVwcyBpbXBsZW1lbnRhdGlvbi4KK2lmICggMCApIHsKK30gZWxzaWYgKCAkdGFyZ2V0X29zIGVxICJsaW4iICkgeworICAgICpnZXRfZGVwcyA9IFwqZ2V0X2RlcHNfcmVhZGVsZjsKK30gZWxzaWYgKCAkdGFyZ2V0X29zIGVxICJtYWMiICkgeworICAgICpnZXRfZGVwcyA9IFwqZ2V0X2RlcHNfb3Rvb2w7Cit9IGVsc2lmICggJHRhcmdldF9vcyBlcSAid2luIiApIHsKKyAgICAqZ2V0X2RlcHMgPSBcKmdldF9kZXBzX2xpbms7Cit9IGVsc2UgeworICAgIHJ1bnRpbWVfZXJyb3IoICJPUyBcIiR0YXJnZXRfb3NcIiBub3Qgc3VwcG9ydGVkIiApOworfTsgIyBpZgorCisjIERvIHRoZSB3b3JrLgorbXkgQGRlcHMgPSBzb3J0KCBnZXRfZGVwcyggJGxpYiApICk7CitpZiAoICRiYXJlICkgeworICAgIHByaW50KCBtYXAoICIkX1xuIiwgQGRlcHMgKSApOworfSBlbHNlIHsKKyAgICBpbmZvKCAiRGVwZW5kZW5jaWVzOiIsIEBkZXBzID8gbWFwKCAiICAgICRfIiwgQGRlcHMgKSA6ICIobm9uZSkiICk7Cit9OyAjIGlmCitpZiAoIGRlZmluZWQoICRleHBlY3RlZCApICkgeworICAgIG15ICVkZXBzID0gbWFwKCAoICRfID0+IDEgKSwgQGRlcHMgKTsKKyAgICBmb3JlYWNoIG15ICRkZXAgKCBAZXhwZWN0ZWQgKSB7CisgICAgICAgIGRlbGV0ZSggJGRlcHN7ICRkZXAgfSApOworICAgIH07ICMgZm9yZWFjaAorICAgIG15IEB1bmV4cGVjdGVkID0gc29ydCgga2V5cyggJWRlcHMgKSApOworICAgIGlmICggQHVuZXhwZWN0ZWQgKSB7CisgICAgICAgIHJ1bnRpbWVfZXJyb3IoICJVbmV4cGVjdGVkIGRlcGVuZGVuY2llczoiLCBtYXAoICIgICAgJF8iLCBAdW5leHBlY3RlZCApICk7CisgICAgfTsgIyBpZgorfTsgIyBpZgorCitleGl0KCAwICk7CisKK19fRU5EX18KKworPXBvZAorCis9aGVhZDEgTkFNRQorCitCPGNoZWNrLWRlcGVuZHMucGw+IC0tIENoZWNrIGRlcGVuZGVuY2llcyBmb3IgYSBzcGVjaWZpZWQgbGlicmFyeS4KKworPWhlYWQxIFNZTk9QU0lTCisKK0I8Y2hlY2stZGVwZW5kcy5wbD4gSTxPUFRJT05TPi4uLiBJPGxpYnJhcnk+CisKKz1oZWFkMSBERVNDUklQVElPTgorCitDPGNoZWNrLWRlcGVuZHMucGw+IGZpbmRzIGRpcmVjdCBkZXBlbmRlbmNpZXMgZm9yIGEgc3BlY2lmaWVkIGxpYnJhcnkuIExpc3Qgb2YgYWN0dWFsIGRlcGVuZGVuY2llcworaXMgc29ydGVkIGFscGhhYmV0aWNhbGx5IGFuZCBwcmludGVkLiBJZiBsaXN0IG9mIGV4cGVjdGVkIGRlcGVuZGVuY2llcyBpcyBzcGVjaWZpZWQsIHRoZSBzY3JpcHRzCitjaGVja3MgdGhlIGxpYnJhcnkgaGFzIG9ubHkgYWxsb3dlZCBkZXBlbmRlbmNpZXMuIEluIGNhc2Ugb2Ygbm90IGV4cGVjdGVkIGRlcG5kZW5jaWVzIHRoZSBzY3JpcHQKK2lzc3VlcyBlcnJvciBtZXNzYWdlIGFuZCBleGl0cyB3aXRoIG5vbi16ZXJvIGNvZGUuCisKK0xpbnV4KiBPUyBhbmQgT1MgWCo6IFRoZSBzY3JpcHQgZmluZHMgZGVwZW5kZW5jaWVzIG9ubHkgZm9yIGR5bWFtaWMgbGlicmFyaWVzLiBXaW5kb3dzKiBPUzogVGhlIHNjcmlwdAorZmluZHMgZGVwZW5kZW5jaWVzIGZvciBlaXRoZXIgc3RhdGljIG9yIGR5bWFtaWMgbGlicmFyaWVzLgorCitUaGUgc2NyaXB0IHVzZXMgZXh0ZXJuYWwgdG9vbHMuIE9uIExpbnV4KiBPUywgaXQgcnVucyBGPHJlYWRlbGY+LCBvbiBPUyBYKiAtLSBGPG90b29sPiAob3IgRjxvdG9vbDY0PiksCitvbiBXaW5kb3dzKiBPUyAtLSBGPGxpbms+LgorCitPbiBXaW5kb3dzKiBPUyBkZXBlbmRlbmNpZXMgYXJlIHByaW50ZWQgaW4gbG93ZXIgY2FzZSwgY2FzZSBvZiBleHBlY3RlZCBkZXBlbmRlbmNpZXMgaWdub3JlZC4KKworPWhlYWQxIE9QVElPTlMKKworPW92ZXIKKworPWl0ZW0gQjwtLWJhcmU+CisKK0RvIG5vdCB1c2UgZmFuY3kgZm9ybWF0dGluZzsgcHJvZHVjZSBwbGFpbiwgYmFyZSBvdXRwdXQ6IGp1c3QgYSBsaXN0IG9mIGxpYnJhcmllcywKK2EgbGlicmFyeSBwZXIgbGluZS4KKworPWl0ZW0gQjwtLWV4cGVjdGVkPT5JPGxpc3Q+CisKK0k8bGlzdD4gaXMgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZXhwZWN0ZWQgZGVwZW5kZW5jaWVzIChvciBDPG5vbmU+KS4KK0lmIEM8LS1leHBlY3RlZD4gb3B0aW9uIHNwZWNpZmllZCwgQzxjaGVjay1kZXBlbmRzLnBsPiBjaGVja3MgdGhlIHNwZWNpZmllZCBsaWJyYXJ5CitoYXMgb25seSBleHBlY3RlZCBkZXBlbmRlbmNpZXMuCisKKz1pdGVtIEI8LS1vcz0+STxzdHI+CisKK1NwZWNpZnkgdGFyZ2V0IE9TICh0b29sIHRvIHVzZSkgbWFudWFsbHkuCitVc2VmdWwgZm9yIGNyb3NzLWJ1aWxkLCB3aGVuIGhvc3QgT1MgaXMgbm90IHRoZSBzYW1lIGFzIHRhcmdldCBPUy4KK0k8c3RyPiBzaG91bGQgYmUgZWl0aGVyIEM8bGluPiwgQzxtYWM+LCBvciBDPHdpbj4uCisKKz1iYWNrCisKKz1oZWFkMiBTdGFuZGFyZCBPcHRpb25zCisKKz1vdmVyCisKKz1pdGVtIEI8LS1oZWxwPgorCitQcmludCBzaG9ydCBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQuCisKKz1pdGVtIEI8LS1kb2M+CisKKz1pdGVtIEI8LS1tYW51YWw+CisKK1ByaW50IGZ1bGwgZG9jdW1lbnRhdGlvbiBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLXF1aWV0PgorCitEbyBub3Qgb3V0cHV0IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMuCisKKz1pdGVtIEI8LS12ZXJzaW9uPgorCitQcmludCB2ZXJzaW9uIGFuZCBleGl0LgorCis9YmFjaworCis9aGVhZDEgQVJHVU1FTlRTCisKKz1vdmVyCisKKz1pdGVtIEk8bGlicmFyeT4KKworQSBuYW1lIG9mIGxpYnJhcnkgdG8gZmluZCBvciBjaGVjayBkZXBlbmRlbmNpZXMuCisKKz1iYWNrCisKKz1oZWFkMSBFWEFNUExFUworCitKdXN0IHByaW50IGxpYnJhcnkgZGVwZW5kZW5jaWVzIChXaW5kb3dzKiBPUyk6CisKKyAgICA+IGNoZWNrLWRlcGVuZHMucGwgZXhwb3J0cy93aW5fMzIvbGliL2xpYm9tcG1kLmRsbAorICAgIGNoZWNrLWRlcGVuZHMucGw6IChpKSBEZXBlbmRlbmNpZXM6CisgICAgY2hlY2stZGVwZW5kcy5wbDogKGkpICAgICBrZXJuZWwzMi5kbGwKKworUHJpbnQgbGlicmFyeSBkZXBlbmRlbmNpZXMsIHVzZSBiYXJlIG91dHB1dCAoTGludXgqIE9TKToKKworICAgICQgY2hlY2stZGVwZW5kcy5wbCAtLWJhcmUgZXhwb3J0cy9saW5fMzJlL2xpYi9saWJvbXBfZGIuc28KKyAgICBsaWJjLnNvLjYKKyAgICBsaWJkbC5zby4yCisgICAgbGlicHRocmVhZC5zby4wCisKK0NoZWNrIHRoZSBsaWJyYXJ5IGRvZXMgbm90IGhhdmUgYW55IGRlcGVuZGVuY2llcyAoT1MgWCopOgorCisgICAgJCBjaGVjay1kZXBlbmRzLnBsIC0tZXhwZWN0ZWQ9bm9uZSBleHBvcnRzL21hY18zMi9saWIvbGlib21wLmR5bGliCisgICAgY2hlY2stZGVwZW5kcy5wbDogKGkpIERlcGVuZGVuY2llczoKKyAgICBjaGVjay1kZXBlbmRzLnBsOiAoaSkgICAgIC91c3IvbGliL2xpYlN5c3RlbS5CLmR5bGliCisgICAgY2hlY2stZGVwZW5kcy5wbDogKHgpIFVuZXhwZWN0ZWQgZGVwZW5kZW5jaWVzOgorICAgIGNoZWNrLWRlcGVuZHMucGw6ICh4KSAgICAgL3Vzci9saWIvbGliU3lzdGVtLkIuZHlsaWIKKyAgICAkIGVjaG8gJD8KKyAgICAyCisKKz1jdXQKKworIyBlbmQgb2YgZmlsZSAjCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdG9vbHMvY2hlY2stZXhlY3N0YWNrLnBsIGIvZmluYWwvcnVudGltZS90b29scy9jaGVjay1leGVjc3RhY2sucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDNjMmJiMgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvY2hlY2stZXhlY3N0YWNrLnBsCkBAIC0wLDAgKzEsMTQ2IEBACisjIS91c3IvYmluL3BlcmwKKworIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgRmluZEJpbjsKK3VzZSBsaWIgIiRGaW5kQmluOjpCaW4vbGliIjsKKwordXNlIHRvb2xzOwordXNlIFBsYXRmb3JtICI6dmFycyI7CisKK291ciAkVkVSU0lPTiA9ICIwLjAwMiI7CisKK3N1YiBleGVjc3RhY2soJCkgeworICAgIG15ICggJGZpbGUgKSA9IEBfOworICAgIG15IEBvdXRwdXQ7CisgICAgbXkgQHN0YWNrOworICAgIG15ICR0b29sOworICAgIGlmKCR0YXJnZXRfYXJjaCBlcSAibWljIikgeworICAgICAgICAkdG9vbCA9ICJ4ODZfNjQtazFvbS1saW51eC1yZWFkZWxmIjsKKyAgICB9IGVsc2UgeworICAgICAgICAkdG9vbCA9ICJyZWFkZWxmIjsKKyAgICB9CisgICAgZXhlY3V0ZSggWyAkdG9vbCwgIi1sIiwgIi1XIiwgJGZpbGUgXSwgLXN0ZG91dCA9PiBcQG91dHB1dCApOworICAgIEBzdGFjayA9IGdyZXAoICRfID1+IG17XEFccyooPzpHTlVfKT9TVEFDS1xzK30sIEBvdXRwdXQgKTsKKyAgICBpZiAoIG5vdCBAc3RhY2sgKSB7CisgICAgICAgICMgSW50ZXJwcmV0IG1pc3NlZCAiU1RBQ0siIGxpbmUgYXMgZXJyb3IuCisgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkZmlsZTogTm8gc3RhY2sgc2VnbWVudCBmb3VuZDsgbG9va3MgbGlrZSBzdGFjayB3b3VsZCBiZSBleGVjdXRhYmxlLiIgKTsKKyAgICB9OyAjIGlmCisgICAgaWYgKCBAc3RhY2sgPiAxICkgeworICAgICAgICBydW50aW1lX2Vycm9yKCAiJGZpbGU6IE1vcmUgdGhhbiBvbmUgc3RhY2sgc2VnbWVudCBmb3VuZC4iLCAicmVhZGVsZiBvdXRwdXQ6IiwgQG91dHB1dCwgIihlb2YpIiApOworICAgIH07ICMgaWYKKyAgICAjIFR5cGljYWwgc3RhY2sgbGluZXMgYXJlOgorICAgICMgTGludXgqIE9TIElBLTMyIGFyY2hpdGVjdHVyZToKKyAgICAjICAgIEdOVV9TVEFDSyAgICAgIDB4MDAwMDAwIDB4MDAwMDAwMDAgMHgwMDAwMDAwMCAweDAwMDAwIDB4MDAwMDAgUldFIDB4NAorICAgICMgTGludXgqIE9TIEludGVsKFIpIDY0OgorICAgICMgICAgR05VX1NUQUNLICAgICAgMHgwMDAwMDAgMHgwMDAwMDAwMDAwMDAwMDAwIDB4MDAwMDAwMDAwMDAwMDAwMCAweDAwMDAwMCAweDAwMDAwMCBSV0UgMHg4CisgICAgaWYgKCAkc3RhY2tbIDAgXSAhfiBte1xBXHMqKD86R05VXyk/U1RBQ0soPzpccysweFswLTlhLWZdKyl7NX1ccysoW1IgXVtXIF1bRSBdKVxzKzB4WzAtOWEtZl0rXHMqXHp9ICkgeworICAgICAgICBydW50aW1lX2Vycm9yKCAiJGZpbGU6IENhbm5vdCBwYXJzZSBzdGFjayBzZWdtZW50IGxpbmU6IiwgIj4+PiAkc3RhY2tbIDAgXSIgKTsKKyAgICB9OyAjIGlmCisgICAgbXkgJGF0dHJzID0gJDE7CisgICAgaWYgKCAkYXR0cnMgPX4gbXtFfSApIHsKKyAgICAgICAgcnVudGltZV9lcnJvciggIiRmaWxlOiBTdGFjayBpcyBleGVjdXRhYmxlIiApOworICAgIH07ICMgaWYKK307ICMgc3ViIGV4ZWNzdGFjaworCitnZXRfb3B0aW9ucygKKyAgICBQbGF0Zm9ybTo6dGFyZ2V0X29wdGlvbnMoKSwKKyk7CisKK2ZvcmVhY2ggbXkgJGZpbGUgKCBAQVJHViApIHsKKyAgICBleGVjc3RhY2soICRmaWxlICk7Cit9OyAjIGZvcmVhY2ggJGZpbGUKKworZXhpdCggMCApOworCitfX0VORF9fCisKKz1wb2QKKworPWhlYWQxIE5BTUUKKworQjxjaGVjay1leGVjc3RhY2sucGw+IC0tIENoZWNrIHdoZXRoZXIgc3RhY2sgaXMgZXhlY3V0YWJsZSwgaXNzdWUgYW4gZXJyb3IgaWYgc28uCisKKz1oZWFkMSBTWU5PUFNJUworCitCPGNoZWNrLWV4ZWNzdGFjay5wbD4gSTxvcHRpaW9uPi4uLiBJPGZpbGU+Li4uCisKKz1oZWFkMSBERVNDUklQVElPTgorCitUaGUgc2NyaXB0IGNoZWNrcyB3aGV0aGVyIHN0YWNrIG9mIHNwZWNpZmllZCBleGVjdXRhYmxlIGZpbGUsIGFuZCBpc3N1ZXMgZXJyb3IgaWYgc3RhY2sgaXMKK2V4ZWN1dGFibGUuIElmIHN0YWNrIGlzIG5vdCBleGVjdXRhYmxlLCB0aGUgc2NyaXB0IGV4aXRzIHNpbGVudGx5IHdpdGggemVybyBleGl0IGNvZGUuCisKK1RoZSBzY3JpcHQgcnVucyBDPHJlYWRlbGY+IHV0aWxpdHkgdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IHNwZWNpZmllZCBleGVjdXRhYmxlIGZpbGUuIFNvLCB0aGUKK3NjcmlwdCBmYWlscyBpZiBDPHJlYWRlbGY+IGlzIG5vdCBhdmFpbGFibGUuIEVmZmVjdGl2ZWx5IGl0IG1lYW5zIHRoZSBzY3JpcHQgd29ya3Mgb25seSBvbiBMaW51eCogT1MKKyhhbmQsIHByb2JhYmx5LCBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUpLgorCis9aGVhZDEgT1BUSU9OUworCis9b3ZlcgorCis9aXRlbSBTdGFuZGFyZCBPcHRpb25zCisKKz1vdmVyCisKKz1pdGVtIEI8LS1kb2M+CisKKz1pdGVtIEI8LS1tYW51YWw+CisKK1ByaW50IGZ1bGwgaGVscCBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0taGVscD4KKworUHJpbnQgc2hvcnQgaGVscCBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0tdXNhZ2U+CisKK1ByaW50IHZlcnkgc2hvcnQgdXNhZ2UgbWVzc2FnZSBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLXZlcmJvc2U+CisKK0RvIHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMuCisKKz1pdGVtIEI8LS12ZXJzaW9uPgorCitQcmludCBwcm9ncmFtIHZlcnNpb24gYW5kIGV4aXQuCisKKz1pdGVtIEI8LS1xdWlldD4KKworV29yayBxdWlldCwgZG8gbm90IHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMuCisKKz1iYWNrCisKKz1iYWNrCisKKz1oZWFkMSBBUkdVTUVOVFMKKworPW92ZXIKKworPWl0ZW0gSTxmaWxlPgorCitBIG5hbWUgb2YgZXhlY3V0YWJsZSBvciBzaGFyZWQgb2JqZWN0IHRvIGNoZWNrLiBNdWx0aXBsZSBmaWxlcyBtYXkgYmUgc3BlY2lmaWVkLgorCis9YmFjaworCis9aGVhZDEgRVhBTVBMRVMKKworQ2hlY2sgbGlib21wLnNvIGxpYnJhcnk6CisKKyAgICAkIGNoZWNrLWV4ZWNzdGFjay5wbCBsaWJvbXAuc28KKworPWN1dAorCisjIGVuZCBvZiBmaWxlICMKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90b29scy9jaGVjay1pbnN0cnVjdGlvbi1zZXQucGwgYi9maW5hbC9ydW50aW1lL3Rvb2xzL2NoZWNrLWluc3RydWN0aW9uLXNldC5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iNzdlMjA3Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90b29scy9jaGVjay1pbnN0cnVjdGlvbi1zZXQucGwKQEAgLTAsMCArMSwzMTYgQEAKKyMhL3Vzci9iaW4vcGVybAorCisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBGaW5kQmluOwordXNlIGxpYiAiJEZpbmRCaW46OkJpbi9saWIiOworCit1c2UgUGxhdGZvcm0gIjp2YXJzIjsKK3VzZSB0b29sczsKKworb3VyICRWRVJTSU9OID0gIjAuMDA0IjsKKworbXkgJGhleCA9IHFye1swLTlhLWZdfWk7ICAgICMgaGV4IGRpZ2l0LgorCisjIG1pYy1zcGVjaWZpYyBkZXRhaWxzLgorCitzdWIgYmFkX21pY19mbXQoJCkgeworICAgICMgQmVmb3JlIHdlIGFsbG93ZWQgYm90aCBlbGY2NC14ODYtNjQtZnJlZWJzZCBhbmQgZWxmLWwxb20tZnJlZWJzZC4KKyAgICAjIE5vdyB0aGUgZmlyc3Qgb25lIGlzIG9ic29sZXRlLCBvbmx5IGVsZjY0LWwxb20tZnJlZWJzZCBpcyBhbGxvd2VkLgorICAgIG15ICggJGZtdCApID0gQF87CisgICAgaWYgKCAwICkgeworICAgIH0gZWxzaWYgKCAiJHRhcmdldF9taWNfYXJjaCIgZXEgImtuZiIgKSB7CisJICAgIHJldHVybiAkZm10ICF+IG17XEFlbGY2NC1sMW9tP1x6fTsKKyAgICB9IGVsc2lmICggIiR0YXJnZXRfbWljX2FyY2giIGVxICJrbmMiICkgeworCSAgICByZXR1cm4gJGZtdCAhfiBte1xBZWxmNjQtazFvbT9cen07CisJfSBlbHNlIHsKKwkgICAgcmV0dXJuIDE7CisJfTsKK307ICMgc3ViIGJhZF9taWNfZm10CisKKyMgVW5kZXNpcmVkIGluc3RydWN0aW9ucyBmb3IgbWljOiBhbGwgeDg3IGFuZCBzb21lIG90aGVyLgorIyBBQzogU2luY2UgY29tcGlsZXIgMjAxMC0wNi0zMCB4ODcgaW5zdHJ1Y3Rpb25zIGFyZSBzdXBwb3J0ZWQsIHJlbW92ZWQgdGhlIGNoZWNrIG9mIHg4Ny4KK215ICRtaWNfYmFkX3JlOworc3ViIGJhZF9taWNfaW5zdHIoJCQpIHsKKyAgICBteSAoICRpbnN0ciwgJGFyZ3MgKSA9IEBfOworICAgIGlmICggIiR0YXJnZXRfbWljX2FyY2giIGVxICJrbmMiICkgeworCSMgd29ya2Fyb3VuZCBvZiBiYWQgY29kZSBnZW5lcmF0aW9uIG9uIEtORiBMaW51eCogT1M6CisJcmV0dXJuICggZGVmaW5lZCggJGluc3RyICkgYW5kICRpbnN0ciA9fiAkbWljX2JhZF9yZSApOworICAgIH0gZWxzZSB7CisJcmV0dXJuICggZGVmaW5lZCggJGluc3RyICkgYW5kICRpbnN0ciA9fiAkbWljX2JhZF9yZSBvciBkZWZpbmVkKCAkYXJncyApIGFuZCAkYXJncyA9fiBte3htbX1pICk7CisgICAgfQorfTsgIyBzdWIgYmFkX21pY19pbnN0cgorCisjIGxpbl8zMi1zcGVjaWZpYyBkZXRhaWxzLgorCitzdWIgYmFkX2lhMzJfZm10KCQpIHsKKyAgICBteSAoICRmbXQgKSA9IEBfOworICAgIHJldHVybiAkZm10ICF+IG17XEFlbGYzMi1pMzg2XHp9OworfTsgIyBzdWIgYmFkX2lhMzJfZm10CisKK215IEBzc2UyID0KKyAgICBxd3sKKyAgICAgICAgbW92YXBkIG1vdnVwZCBtb3ZocGQgbW92bHBkIG1vdm1za3BkIG1vdnNkCisgICAgICAgIGFkZHBkIGFkZHNkIHN1YnBkIHN1YnNkIG11bHBkIG11bHNkIGRpdnBkIGRpdnNkIHNxcnRwZCBzcXJ0c2QgbWF4cGQgbWF4c2QgbWlucGQgbWluc2QKKyAgICAgICAgYW5kcGQgYW5kbnBkIG9ycGQgeG9ycGQKKyAgICAgICAgY21wcGQgY21wc2QgY29taXNkIHVjb21pc2QKKyAgICAgICAgc2h1ZnBkIHVucGNraHBkIHVucGNrbHBkCisgICAgICAgIGN2dHBkMnBpIGN2dHRwZDJwaSBjdnRwaTJwZCBjdnRwZDJkcSBjdnR0cGQyZHEgY3Z0ZHEycGQgY3Z0cHMycGQgY3Z0cGQycHMgY3Z0c3Myc2QgY3Z0c2Qyc3MKKyAgICAgICAgY3Z0c2Qyc2kgY3Z0dHNkMnNpIGN2dHNpMnNkIGN2dGRxMnBzIGN2dHBzMmRxIGN2dHRwczJkcSBtb3ZkcWEgbW92ZHF1IG1vdnEyZHEgbW92ZHEycQorICAgICAgICBwbXVsdWRxIHBhZGRxIHBzdWJxIHBzaHVmbHcgcHNodWZodyBwc2h1ZmQgcHNsbGRxIHBzcmxkcSBwdW5wY2tocWRxIHB1bnBja2xxZHEgY2xmbHVzaAorICAgICAgICBsZmVuY2UgbWZlbmNlIG1hc2ttb3ZkcXUgbW92bnRwZCBtb3ZudGRxIG1vdm50aQorICAgIH07CitteSBAc3NlMyA9CisgICAgcXd7CisgICAgICAgIGZpc3R0cCBsZGRxdSBhZGRzdWJwcyBhZGRzdWJwZCBoYWRkcHMgaHN1YnBzIGhhZGRwZCBoc3VicGQgbW92c2hkdXAgbW92c2xkdXAgbW92ZGR1cCBtb25pdG9yCisgICAgICAgIG13YWl0CisgICAgfTsKK215IEBzc3NlMyA9CisgICAgcXd7CisgICAgICAgIHBoYWRkdyBwaGFkZHN3IHBoYWRkZCBwaHN1YncgcGhzdWJzdyBwaHN1YmQgcGFic2IgcGFic3cgcGFic2QgcG1hZGR1YnN3IHBtdWxocnN3IHBzaHVmYgorICAgICAgICBwc2lnbmIgcHNpZ253IHBzaWduZCBwYWxpZ25yCisgICAgfTsKK215IEBzc2U0ID0KKyAgICAoCisgICAgICAgICMgU1NFNC4xCisgICAgICAgIHF3eworICAgICAgICAgICAgcG11bGxkIHBtdWxkcSBkcHBkIGRwcHMgbW92bnRkcWEgYmxlbmRwZCBibGVuZHBzIGJsZW5kdnBkIGJsZW5kdnBzIHBibGVuZHZiIHBibGVuZHcgcG1pbnV3CisgICAgICAgICAgICBwbWludWQgcG1pbnNiIHBtaW5zZCBwbWF4dXcgcG1heHVkIHBtYXhzYiBwbWF4c2Qgcm91bmRwcyByb3VuZHBkIHJvdW5kc3Mgcm91bmRzZCBleHRyYWN0cHMKKyAgICAgICAgICAgIGluc2VydHBzIHBpbnNyYiBwaW5zcmQgcGluc3JxIHBleHRyYiBwZXh0cncgcGV4dHJkIHBleHRycSBwbW92c3hidyBwbW92enhidyBwbW92c3hiZAorICAgICAgICAgICAgcG1vdnp4YmQgcG1vdnN4d2QgcG1vdnp4d2QgcG1vdnN4YnEgcG1vdnp4YnEgcG1vdnN4d3EgcG1vdnp4d3EgcG1vdnN4ZHEgcG1vdnp4ZHEgbXBzYWRidworICAgICAgICAgICAgcGhtaW5wb3N1dyBwdGVzdCBwY21wZXFxIHBhY2t1c2R3CisgICAgICAgIH0sCisgICAgICAgICMgU1NFNC4yCisgICAgICAgIHF3eworICAgICAgICAgICAgcGNtcGVzdHJpIHBjbXBlc3RybSBwY21waXN0cmkgcGNtcGlzdHJtIHBjbXBndHEgY3JjMzIgcG9wY250CisgICAgICAgIH0KKyAgICApOworCisjIFVuZGVzaXJlZCBpbnN0cnVjdGlvbnMgZm9yIElBLTMyIGFyY2hpdGVjdHVyZTogUGVudGl1bSA0IChTU0UyKSBhbmQgbmV3ZXIuCisjIFRPRE86IEl0IHdvdWxkIGJlIG11Y2ggbW9yZSByZWxpYWJsZSB0byBsaXN0ICphbGxvd2VkKiBpbnN0cnVjdGlvbnMgcmF0aGVyIHRoYW4gbGlzdCB1bmRlc2lyZWQKKyMgaW5zdHJ1Y3Rpb25zLiBJbiBzdWNoIGEgY2FzZSB0aGUgbGlzdCB3aWxsIGJlIHN0YWJsZSBhbmQgbm90IHJlcXVpcmUgdXBkYXRlIHdoZW4gU1NFNSBpcyByZWxlYXNlZC4KK215IEBpYTMyX2JhZF9saXN0ID0gKCBAc3NlMiwgQHNzZTMsIEBzc3NlMywgQHNzZTQgKTsKKworbXkgJGlhMzJfYmFkX3JlID0gcXJ7QHtbICJeKD86IiAuIGpvaW4oICJ8IiwgQGlhMzJfYmFkX2xpc3QgKSAuICIpIiBdfX1pOworCitzdWIgYmFkX2lhMzJfaW5zdHIoJCQpIHsKKyAgICBteSAoICRpbnN0ciwgJGFyZ3MgKSA9IEBfOworICAgIHJldHVybiAoIGRlZmluZWQoICRpbnN0ciApIGFuZCAkaW5zdHIgPX4gJGlhMzJfYmFkX3JlICk7Cit9OyAjIHN1YiBiYWRfaWEzMl9pbnN0cgorCitzdWIgY2hlY2tfZmlsZSgkOyQkKSB7CisKKyAgICBteSAoICRmaWxlLCAkc2hvd19pbnN0cnVjdGlvbnMsICRtYXhfaW5zdHJ1Y3Rpb25zICkgPSBAXzsKKyAgICBteSBAYnVsazsKKworICAgIGlmICggbm90IGRlZmluZWQoICRtYXhfaW5zdHJ1Y3Rpb25zICkgKSB7CisgICAgICAgICRtYXhfaW5zdHJ1Y3Rpb25zID0gMTAwOworICAgIH07ICMgaWYKKworICAgIGV4ZWN1dGUoIFsgIng4Nl82NC1rMW9tLWxpbnV4LW9iamR1bXAiLCAiLWQiLCAkZmlsZSBdLCAtc3Rkb3V0ID0+IFxAYnVsayApOworCisgICAgbXkgJG4gPSAwOworICAgIG15ICRlcnJvcnMgPSAwOworICAgIG15ICRjdXJyZW50X2Z1bmMgID0gIiI7ICAgICMgTmFtZSBvZiBjdXJyZW50IGZ1Y3Rpb24uCisgICAgbXkgJHJlcG9ydGVkX2Z1bmMgPSAiIjsgICAgIyBuYW1lIG9mIGxhc3QgcmVwb3J0ZWQgZnVuY3Rpb24uCisgICAgZm9yZWFjaCBteSAkbGluZSAoIEBidWxrICkgeworICAgICAgICArKyAkbjsKKyAgICAgICAgaWYgKCAwICkgeworICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteXHMqJH0gKSB7CisgICAgICAgICAgICAjIEVtcHR5IGxpbmUuCisgICAgICAgICAgICAjIElnbm9yZS4KKyAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XkluIGFyY2hpdmUgKC4qPyk6XHMqJH0gKSB7CisgICAgICAgICAgICAjIEluIGFyY2hpdmUgbGlib21wLmE6CisgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte14oPzouKj8pOlxzKmZpbGUgZm9ybWF0ICguKj8pXHMqJH0gKSB7CisgICAgICAgICAgICAjIGxpYm9tcC5zbzogICAgIGZpbGUgZm9ybWF0IGVsZjY0LXg4Ni02NC1mcmVlYnNkCisgICAgICAgICAgICAjIGttcF9mdG5fY2RlY2wubzogICAgIGZpbGUgZm9ybWF0IGVsZjY0LXg4Ni02NAorICAgICAgICAgICAgbXkgJGZtdCA9ICQxOworICAgICAgICAgICAgaWYgKCBiYWRfZm10KCAkZm10ICkgKSB7CisgICAgICAgICAgICAgICAgcnVudGltZV9lcnJvciggIkludmFsaWQgZmlsZSBmb3JtYXQ6ICRmbXQuIiApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAoLio/KTpccyokfSApIHsKKyAgICAgICAgICAgICMgRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAucGx0OgorICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteJGhleCsgPChbXj5dKyk+OlxzKiR9ICkgeworICAgICAgICAgICAgIyAwMDAwMDAwMDAwMDE3ZTk4IDxfX2ttcF9zdHJfZm9ybWF0QHBsdC0weDEwPjoKKyAgICAgICAgICAgICRjdXJyZW50X2Z1bmMgPSAkMTsKKyAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XlxzKlwuezN9XHMqJH0gKSB7CisgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccyooJGhleCspOlxzKygkaGV4JGhleCg/OiAkaGV4JGhleCkqKVxzKyg/OmxvY2tccyt8cmV4Wy5hLXpdKlxzKyk/KFteIF0rKSg/OlxzKyhbXiNdKz8pKT9ccyooPzojfCQpfSApIHsKKyAgICAgICAgICAgICMgICAxN2U5ODogICAgICAgZmYgMzUgZmEgN2QgMjYgMDAgICAgICAgcHVzaHEgIDB4MjY3ZGZhKCVyaXApICAgICAgICAjIDI3ZmM5OCA8X0dMT0JBTF9PRkZTRVRfVEFCTEU+CisgICAgICAgICAgICBteSAoICRhZGRyLCAkZHVtcCwgJGluc3RyLCAkYXJncyApID0gKCAkMSwgJDIsICQzLCAkNCApOworICAgICAgICAgICAgIyBDaGVjayB0aGlzIGlzIG5vdCBhIGJhZCBpbnN0cnVjdGlvbiBhbmQgeG1tIHJlZ2lzdGVycyBhcmUgbm90IHVzZWQuCisgICAgICAgICAgICBpZiAoIGJhZF9pbnN0ciggJGluc3RyLCAkYXJncyApICkgeworICAgICAgICAgICAgICAgIGlmICggJGVycm9ycyA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCAiSW52YWxpZCBpbnN0cnVjdGlvbnMgZm91bmQgaW4gYCRmaWxlJzoiICk7CisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgICAgIGlmICggJGN1cnJlbnRfZnVuYyBuZSAkcmVwb3J0ZWRfZnVuYyApIHsKKyAgICAgICAgICAgICAgICAgICAgd2FybmluZyggIiAgICAkY3VycmVudF9mdW5jIiApOworICAgICAgICAgICAgICAgICAgICAkcmVwb3J0ZWRfZnVuYyA9ICRjdXJyZW50X2Z1bmM7CisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgICAgICsrICRlcnJvcnM7CisgICAgICAgICAgICAgICAgaWYgKCAkc2hvd19pbnN0cnVjdGlvbnMgKSB7CisgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoICIgICAgICAgICRsaW5lIiApOworICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICAgICBpZiAoICRlcnJvcnMgPj0gJG1heF9pbnN0cnVjdGlvbnMgKSB7CisgICAgICAgICAgICAgICAgICAgIGluZm8oICIkZXJyb3JzIGludmFsaWQgaW5zdHJ1Y3Rpb25zIGZvdW5kOyBzY2FubmluZyBzdG9wcGVkLiIgKTsKKyAgICAgICAgICAgICAgICAgICAgbGFzdDsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBydW50aW1lX2Vycm9yKCAiRXJyb3IgcGFyc2luZyBvYmpkdW1wIG91dHB1dCBsaW5lICRuOlxuPj4+PiAkbGluZVxuIiApOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBmb3JlYWNoICRsaW5lCisKKyAgICByZXR1cm4gJGVycm9yczsKKworfTsgIyBzdWIgY2hlY2tfZmlsZQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgUGFyc2UgY29tbWFuZCBsaW5lLgorbXkgJG1heF9pbnN0cnVjdGlvbnM7CitteSAkc2hvd19pbnN0cnVjdGlvbnM7CitnZXRfb3B0aW9ucygKKyAgICAibWF4LWluc3RydWN0aW9ucz1pIiA9PiBcJG1heF9pbnN0cnVjdGlvbnMsCisgICAgInNob3ctaW5zdHJ1Y3Rpb25zISIgPT4gXCRzaG93X2luc3RydWN0aW9ucywKKyAgICBQbGF0Zm9ybTo6dGFyZ2V0X29wdGlvbnMoKSwKKyk7CitpZiAoICIkdGFyZ2V0X29zIiBlcSAibGluIiBhbmQgIiR0YXJnZXRfbWljX2FyY2giIGVxICJrbmYiICkgeworICAgICRtaWNfYmFkX3JlID0gcXJ7Xig/OnBhdXNlfFtzbG1dZmVuY2V8c2NhdHRlcnxnYXRoZXJ8Y21weGNoZzE2YnxjbGV2aWN0WzEyXSl9aTsKK30gZWxzZSB7CisgICAgJG1pY19iYWRfcmUgPSBxcnteKD86cGF1c2V8W3NsbV1mZW5jZXxzY2F0dGVyfGdhdGhlcnxjbW92fGNtcHhjaGcxNmJ8Y2xldmljdFsxMl0pfWk7Cit9OworaWYgKCAwICkgeworfSBlbHNpZiAoICR0YXJnZXRfb3MgZXEgImxpbiIgYW5kICR0YXJnZXRfYXJjaCBlcSAibWljIiApIHsKKyAgICAqYmFkX2luc3RyID0gXCpiYWRfbWljX2luc3RyOworICAgICpiYWRfZm10ICAgPSBcKmJhZF9taWNfZm10OworfSBlbHNpZiAoICR0YXJnZXRfcGxhdGZvcm0gZXEgImxpbl8zMiIgKSB7CisgICAgKmJhZF9pbnN0ciA9IFwqYmFkX2lhMzJfaW5zdHI7CisgICAgKmJhZF9mbXQgICA9IFwqYmFkX2lhMzJfZm10OworfSBlbHNlIHsKKyAgICBydW50aW1lX2Vycm9yKCAiT25seSB3b3JrcyBvbiBsaW5fMzIgYW5kIGxpbl9taWMgcGxhdGZvcm1zLiIgKTsKK307ICMgaWYKKworIyBEbyB0aGUgd29yay4KK215ICRyYyA9IDA7CitpZiAoIG5vdCBAQVJHViApIHsKKyAgICBpbmZvKCAiTm8gYXJndW1lbnRzIHNwZWNpZmllZCAtLSBub3RoaW5nIHRvIGRvLiIgKTsKK30gZWxzZSB7CisgICAgZm9yZWFjaCBteSAkYXJnICggQEFSR1YgKSB7CisgICAgICAgIG15ICRlcnJzID0gY2hlY2tfZmlsZSggJGFyZywgJHNob3dfaW5zdHJ1Y3Rpb25zLCAkbWF4X2luc3RydWN0aW9ucyApOworICAgICAgICBpZiAoICRlcnJzID4gMCApIHsKKyAgICAgICAgICAgICRyYyA9IDM7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGZvcmVhY2ggJGFyZworfTsgIyBpZgorCitleGl0KCAkcmMgKTsKKworX19FTkRfXworCis9cG9kCisKKz1oZWFkMSBOQU1FCisKK0I8Y2hlY2staW5zdHJ1Y3Rpb24tc2V0LnBsPiAtLSBNYWtlIHN1cmUgYmluYXJ5IGZpbGUgZG9lcyBub3QgY29udGFpbiB1bmRlc2lyZWQgaW5zdHJ1Y3Rpb25zLgorCis9aGVhZDEgU1lOT1BTSVMKKworQjxjaGVjay1pbnN0cnVjdGlvbnMucGw+IEk8b3B0aW9uPi4uLiBJPGZpbGU+Li4uCisKKz1oZWFkMSBPUFRJT05TCisKKz1vdmVyCisKKz1pdGVtIEI8LS1hcmNoaXRlY3R1cmU9Pkk8YXJjaD4KKworU3BlY2lmeSB0YXJnZXQgYXJjaGl0ZWN0dXJlLgorCis9aXRlbSBCPC0tbWF4LWluc3RydWN0aW9ucz0+STxudW1iZXI+CisKK1N0b3Agc2Nhbm5pbmcgaWYgSTxudW1iZXI+IGludmFsaWQgaW5zdHJ1Y3Rpb25zIGZvdW5kLiAxMDAgYnkgZGVmYXVsdC4KKworPWl0ZW0gQjwtLW9zPT5JPG9zPgorCitTcGVjaWZ5IHRhcmdldCBPUy4KKworPWl0ZW0gQjwtLT5bQjxuby0+XUI8c2hvdy1pbnN0cnVjdGlvbnM+CisKK1Nob3cgaW52YWxpZCBpbnN0cnVjdGlvbnMgZm91bmQgaW4gdGhlIGZpbGUuIEJ1IGRlZmF1bHQsIGluc3RydWN0aW9ucyBhcmUgbm90IHNob3duLgorCis9aXRlbSBTdGFuZGFyZCBPcHRpb25zCisKKz1vdmVyCisKKz1pdGVtIEI8LS1kb2M+CisKKz1pdGVtIEI8LS1tYW51YWw+CisKK1ByaW50IGZ1bGwgaGVscCBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0taGVscD4KKworUHJpbnQgc2hvcnQgaGVscCBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0tdXNhZ2U+CisKK1ByaW50IHZlcnkgc2hvcnQgdXNhZ2UgbWVzc2FnZSBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLXZlcmJvc2U+CisKK0RvIHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMuCisKKz1pdGVtIEI8LS12ZXJzaW9uPgorCitQcmludCBwcm9ncmFtIHZlcnNpb24gYW5kIGV4aXQuCisKKz1pdGVtIEI8LS1xdWlldD4KKworV29yayBxdWlldCwgZG8gbm90IHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMuCisKKz1iYWNrCisKKz1iYWNrCisKKz1oZWFkMSBBUkdVTUVOVFMKKworPW92ZXIKKworPWl0ZW0gSTxmaWxlPgorCitGaWxlIChvYmplY3QgZmlsZSBvciBsaWJyYXJ5LCBlaXRoZXIgc3RhdGljIG9yIGR5bmFtaWMpIHRvIGNoZWNrLgorCis9YmFjaworCis9aGVhZDEgREVTQ1JJUFRJT04KKworVGhlIHNjcmlwdCBydW5zIEY8b2JqZHVtcD4gdXRpbGl0eSB0byBnZXQgZGlzYXNzZW1ibGVyIGxpc3RpbmcgYW5kIGNoZWNrcyB0aGUgZmlsZSBkb2VzIG5vdCBjb250YWluCit1bndhbnRlZCBpbnN0cnVjdGlvbnMuCisKK0N1cnJlbnRseSB0aGUgc2NyaXB0IHdvcmtzIG9ubHkgZm9yOgorCis9b3ZlcgorCis9aXRlbSBDPGxpbl9taWM+CisKK0ludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZSB0YXJnZXQgT1MuIFVuZGVzaXJlZCB1bnN0cnVjdGlvbnMgYXJlOiBhbGwgeDg3IGluc3RydWN0aW9ucyBhbmQgc29tZSBvdGhlcnMuCisKKz1pdGVtIEM8bGluXzMyPgorCitVbmRlc2lyZWQgaW5zdHJ1Y3Rpb25zIGFyZSBpbnN0cnVjdGlvbnMgbm90IHZhbGlkIGZvciBQZW50aXVtIDMgcHJvY2Vzc29yIChTU0UyIGFuZCBuZXdlcikuCisKKz1iYWNrCisKKz1jdXQKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90b29scy9nZW5lcmF0ZS1kZWYucGwgYi9maW5hbC9ydW50aW1lL3Rvb2xzL2dlbmVyYXRlLWRlZi5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43YzJiMGYzCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90b29scy9nZW5lcmF0ZS1kZWYucGwKQEAgLTAsMCArMSwzMjEgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKworIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCisjIFNvbWUgcHJhZ21hcy4KK3VzZSBzdHJpY3Q7ICAgICAgICAgICMgUmVzdHJpY3QgdW5zYWZlIGNvbnN0cnVjdHMuCit1c2Ugd2FybmluZ3M7ICAgICAgICAjIEVuYWJsZSBhbGwgd2FybmluZ3MuCisKK3VzZSBGaW5kQmluOwordXNlIGxpYiAiJEZpbmRCaW46OkJpbi9saWIiOworCit1c2UgdG9vbHM7CisKK291ciAkVkVSU0lPTiA9ICIwLjAwNCI7CisKKyMKKyMgU3Vicm91dGluZXMuCisjCisKK3N1YiBwYXJzZV9pbnB1dCgkXCUpIHsKKworICAgIG15ICggJGlucHV0LCAkZGVmcyApID0gQF87CisgICAgbXkgQGJ1bGsgPSByZWFkX2ZpbGUoICRpbnB1dCApOworICAgIG15ICVlbnRyaWVzOworICAgIG15ICVvcmRpbmFsczsKKyAgICBteSBAZGlyczsKKyAgICBteSAkdmFsdWUgPSAxOworCisgICAgbXkgJGVycm9yID0KKyAgICAgICAgc3ViIHsKKyAgICAgICAgICAgIG15ICggJG1zZywgJGwsICRsaW5lICkgPSBAXzsKKyAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoCisgICAgICAgICAgICAgICAgIkVycm9yIHBhcnNpbmcgZmlsZSBcIiRpbnB1dFwiIGxpbmUgJGw6XG4iIC4KKyAgICAgICAgICAgICAgICAiICAgICRsaW5lIiAuCisgICAgICAgICAgICAgICAgKCAkbXNnID8gJG1zZyAuICJcbiIgOiAoKSApCisgICAgICAgICAgICApOworICAgICAgICB9OyAjIHN1YgorCisgICAgbXkgJG4gPSAwOyAgICAjIExpbmUgbnVtYmVyLgorICAgIGZvcmVhY2ggbXkgJGxpbmUgKCBAYnVsayApIHsKKyAgICAgICAgKysgJG47CisgICAgICAgIGlmICggMCApIHsKKyAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XlxzKig/OiN8XG4pfSApIHsKKyAgICAgICAgICAgICMgRW1wdHkgbGluZSBvciBjb21tZW50LiBTa2lwIGl0LgorICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteXHMqJX0gKSB7CisgICAgICAgICAgICAjIEEgZGlyZWN0aXZlLgorICAgICAgICAgICAgaWYgKCAwICApIHsKKyAgICAgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccyolXHMqaWYobik/ZGVmXHMrKFtBLVphLXowLTlfXSspXHMqKD86I3xcbil9ICkgeworICAgICAgICAgICAgICAgIG15ICggJG5lZ2F0aW9uLCAkbmFtZSApID0gKCAkMSwgJDIgKTsKKyAgICAgICAgICAgICAgICBteSAkZGlyID0geyBuID0+ICRuLCBsaW5lID0+ICRsaW5lLCBuYW1lID0+ICRuYW1lLCB2YWx1ZSA9PiAkdmFsdWUgfTsKKyAgICAgICAgICAgICAgICBwdXNoKCBAZGlycywgJGRpciApOworICAgICAgICAgICAgICAgICR2YWx1ZSA9ICggJHZhbHVlIGFuZCAoICRuZWdhdGlvbiB4b3IgJGRlZnMtPnsgJG5hbWUgfSApICk7CisgICAgICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteXHMqJVxzKmVuZGlmXHMqKD86I3xcbil9ICkgeworICAgICAgICAgICAgICAgIGlmICggbm90IEBkaXJzICkgeworICAgICAgICAgICAgICAgICAgICAkZXJyb3ItPiggIk9ycGhhbiAlZW5kaWYgZGlyZWN0aXZlLiIsICRuLCAkbGluZSApOworICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICAgICBteSAkZGlyID0gcG9wKCBAZGlycyApOworICAgICAgICAgICAgICAgICR2YWx1ZSA9ICRkaXItPnsgdmFsdWUgfTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgJGVycm9yLT4oICJCYWQgZGlyZWN0aXZlLiIsICRuLCAkbGluZSApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteXHMqKC0pP1xzKihbQS1aYS16MC05X10rKSg/OlxzKyhcZCt8REFUQSkpP1xzKig/OiN8XG4pfSApIHsKKyAgICAgICAgICAgIG15ICggJG9ic29sZXRlLCAkZW50cnksICRvcmRpbmFsICkgPSAoICQxLCAkMiwgJDMgKTsKKyAgICAgICAgICAgIGlmICggJHZhbHVlICkgeworICAgICAgICAgICAgICAgIGlmICggZXhpc3RzKCAkZW50cmllc3sgJGVudHJ5IH0gKSApIHsKKyAgICAgICAgICAgICAgICAgICAgJGVycm9yLT4oICJFbnRyeSBcIiRlbnRyeVwiIGhhcyBhbHJlYWR5IGJlZW4gc3BlY2lmaWVkLiIsICRuLCAkbGluZSApOworICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICAgICAkZW50cmllc3sgJGVudHJ5IH0gPSB7IG9yZGluYWwgPT4gJG9yZGluYWwsIG9ic29sZXRlID0+IGRlZmluZWQoICRvYnNvbGV0ZSApIH07CisgICAgICAgICAgICAgICAgaWYgKCBkZWZpbmVkKCAkb3JkaW5hbCApIGFuZCAkb3JkaW5hbCBuZSAiREFUQSIgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggJG9yZGluYWwgPj0gMTAwMCBhbmQgJGVudHJ5ID1+IG17XEFbb2tdbXBffSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRlcnJvci0+KCAiT3JkaW5hbCBvZiB1c2VyLWNhbGxhYmxlIGVudHJ5IG11c3QgYmUgPCAxMDAwIiwgJG4sICRsaW5lICk7CisgICAgICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAkb3JkaW5hbCA+PSAxMDAwIGFuZCAkb3JkaW5hbCA8IDIwMDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkZXJyb3ItPiggIk9yZGluYWxzIGJldHdlZW4gMTAwMCBhbmQgMTk5OSBhcmUgcmVzZXJ2ZWQuIiwgJG4sICRsaW5lICk7CisgICAgICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBleGlzdHMoICRvcmRpbmFsc3sgJG9yZGluYWwgfSApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgJGVycm9yLT4oICJPcmRpbmFsICRvcmRpbmFsIGhhcyBhbHJlYWR5IGJlZW4gdXNlZC4iLCAkbiwgJGxpbmUgKTsKKyAgICAgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgICAgICAgICAkb3JkaW5hbHN7ICRvcmRpbmFsIH0gPSAkZW50cnk7CisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJGVycm9yLT4oICIiLCAkbiwgJGxpbmUgKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgZm9yZWFjaAorCisgICAgaWYgKCBAZGlycyApIHsKKyAgICAgICAgbXkgJGRpciA9IHBvcCggQGRpcnMgKTsKKyAgICAgICAgJGVycm9yLT4oICJVbnRlcm1pbmF0ZWQgJWlmIGRpcmVjaXZlLiIsICRkaXItPnsgbiB9LCAkZGlyLT57IGxpbmUgfSApOworICAgIH07ICMgd2hpbGUKKworICAgIHJldHVybiAlZW50cmllczsKKworfTsgIyBzdWIgcGFyc2VfaW5wdXQKKworc3ViIHByb2Nlc3MoXCUpIHsKKworICAgIG15ICggJGVudHJpZXMgKSA9IEBfOworCisgICAgZm9yZWFjaCBteSAkZW50cnkgKCBrZXlzKCAlJGVudHJpZXMgKSApIHsKKyAgICAgICAgaWYgKCBub3QgJGVudHJpZXMtPnsgJGVudHJ5IH0tPnsgb2Jzb2xldGUgfSApIHsKKyAgICAgICAgICAgIG15ICRvcmRpbmFsID0gJGVudHJpZXMtPnsgJGVudHJ5IH0tPnsgb3JkaW5hbCB9OworICAgICAgICAgICAgaWYgKCAkZW50cnkgPX4gbXtcQVtva11tcF99ICkgeworICAgICAgICAgICAgICAgIGlmICggbm90IGRlZmluZWQoICRvcmRpbmFsICkgb3IgJG9yZGluYWwgZXEgIkRBVEEiICkgeworICAgICAgICAgICAgICAgICAgICBydW50aW1lX2Vycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgIkJhZCBlbnRyeSBcIiRlbnRyeVwiOiBvcmRpbmFsIG51bWJlciBpcyBub3Qgc3BlY2lmaWVkLiIKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAgICAgJGVudHJpZXMtPnsgdWMoICRlbnRyeSApIH0gPSB7IG9yZGluYWwgPT4gMTAwMCArICRvcmRpbmFsIH07CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGZvcmVhY2gKKworICAgIHJldHVybiAlJGVudHJpZXM7CisKK307ICMgc3ViIHByb2Nlc3MKKworc3ViIGdlbmVyYXRlX291dHB1dChcJSQpIHsKKworICAgIG15ICggJGVudHJpZXMsICRvdXRwdXQgKSA9IEBfOworICAgIG15ICRidWxrOworCisgICAgJGJ1bGsgPSAiRVhQT1JUU1xuIjsKKyAgICBmb3JlYWNoIG15ICRlbnRyeSAoIHNvcnQoIGtleXMoICUkZW50cmllcyApICkgKSB7CisgICAgICAgIGlmICggbm90ICRlbnRyaWVzLT57ICRlbnRyeSB9LT57IG9ic29sZXRlIH0gKSB7CisgICAgICAgICAgICAkYnVsayAuPSBzcHJpbnRmKCAiICAgICUtNDBzICIsICRlbnRyeSApOworICAgICAgICAgICAgbXkgJG9yZGluYWwgPSAkZW50cmllcy0+eyAkZW50cnkgfS0+eyBvcmRpbmFsIH07CisgICAgICAgICAgICBpZiAoIGRlZmluZWQoICRvcmRpbmFsICkgKSB7CisgICAgICAgICAgICAgICAgaWYgKCAkb3JkaW5hbCBlcSAiREFUQSIgKSB7CisgICAgICAgICAgICAgICAgICAgICRidWxrIC49ICJEQVRBIjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkYnVsayAuPSAiXEAiIC4gJG9yZGluYWw7CisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgJGJ1bGsgLj0gIlxuIjsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgZm9yZWFjaAorICAgIGlmICggZGVmaW5lZCggJG91dHB1dCApICkgeworICAgICAgICB3cml0ZV9maWxlKCAkb3V0cHV0LCBcJGJ1bGsgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludCggJGJ1bGsgKTsKKyAgICB9OyAjIGlmCisKK307ICMgc3ViIGdlbmVyYXRlX291cHV0CisKKyMKKyMgUGFyc2UgY29tbWFuZCBsaW5lLgorIworCitteSAkaW5wdXQ7ICAgIyBUaGUgbmFtZSBvZiBpbnB1dCBmaWxlLgorbXkgJG91dHB1dDsgICMgVGhlIG5hbWUgb2Ygb3V0cHV0IGZpbGUuCitteSAlZGVmczsKKworZ2V0X29wdGlvbnMoCisgICAgIm91dHB1dD1zIiAgICA9PiBcJG91dHB1dCwKKyAgICAiRHxkZWZpbmU9cyIgID0+CisgICAgICAgIHN1YiB7CisgICAgICAgICAgICBteSAoICRvcHRfbmFtZSwgJG9wdF92YWx1ZSApID0gQF87CisgICAgICAgICAgICBteSAoICRkZWZfbmFtZSwgJGRlZl92YWx1ZSApOworICAgICAgICAgICAgaWYgKCAkb3B0X3ZhbHVlID1+IG17XEEoLio/KT0oLiopXHp9ICkgeworICAgICAgICAgICAgICAgICggJGRlZl9uYW1lLCAkZGVmX3ZhbHVlICkgPSAoICQxLCAkMiApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAoICRkZWZfbmFtZSwgJGRlZl92YWx1ZSApID0gKCAkb3B0X3ZhbHVlLCAxICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAkZGVmc3sgJGRlZl9uYW1lIH0gPSAkZGVmX3ZhbHVlOworICAgICAgICB9LAorKTsKKworaWYgKCBAQVJHViA9PSAwICkgeworICAgIGNtZGxpbmVfZXJyb3IoICJOb3QgZW5vdWdoIGFyZ3VtZW50cy4iICk7Cit9OyAjIGlmCitpZiAoIEBBUkdWID4gMSApIHsKKyAgICBjbWRsaW5lX2Vycm9yKCAiVG9vIG1hbnkgYXJndW1lbnRzLiIgKTsKK307ICMgaWYKKyRpbnB1dCA9IHNoaWZ0KCBAQVJHViApOworCisjCisjIFdvcmsuCisjCisKK215ICVkYXRhID0gcGFyc2VfaW5wdXQoICRpbnB1dCwgJWRlZnMgKTsKKyVkYXRhID0gcHJvY2VzcyggJWRhdGEgKTsKK2dlbmVyYXRlX291dHB1dCggJWRhdGEsICRvdXRwdXQgKTsKK2V4aXQoIDAgKTsKKworX19FTkRfXworCisjCisjIEVtYmVkZGVkIGRvY3VtZW50YXRpb24uCisjCisKKz1wb2QKKworPWhlYWQxIE5BTUUKKworQjxnZW5lcmF0ZS1kZWYucGw+IC0tIEdlbmVyYXRlIGRlZiBmaWxlIGZvciBPcGVuTVAgUlRMLgorCis9aGVhZDEgU1lOT1BTSVMKKworQjxnZW5lcmF0ZS1kZWYucGw+IEk8T1BUSU9OPi4uLiBJPGZpbGU+CisKKz1oZWFkMSBPUFRJT05TCisKKz1vdmVyCisKKz1pdGVtIEI8LS1kZWZpbmU9Pkk8bmFtZT5bPUk8dmFsdWU+XQorCis9aXRlbSBCPC1EPiBJPG5hbWU+Wz1JPHZhbHVlPl0KKworRGVmaW5lIHNwZWNpZmllZCBuYW1lLiBJZiBJPHZhbHVlPiBpcyBvbWl0dGVkLCBJPG5hbWU+IGlzIGRlZmluZWQgdG8gMS4gSWYgSTx2YWx1ZT4gaXMgMCBvciBlbXB0eSwKK25hbWUgaXMgQjxub3Q+IGRlZmluZWQuCisKKz1pdGVtIEI8LS1vdXRwdXQ9Pkk8ZmlsZT4KKworPWl0ZW0gQjwtbz4gSTxmaWxlPgorCitTcGVjaWZ5IG91dHB1dCBmaWxlIG5hbWUuIElmIG9wdGlvbiBpcyBub3QgcHJlc2VudCwgcmVzdWx0IGlzIHByaW50ZWQgdG8gc3Rkb3V0LgorCis9aXRlbSBCPC0tZG9jPgorCis9aXRlbSBCPC0tbWFudWFsPgorCitQcmludCBmdWxsIGhlbHAgbWVzc2FnZSBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLWhlbHA+CisKK1ByaW50IHNob3J0IGhlbHAgbWVzc2FnZSBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLXVzYWdlPgorCitQcmludCB2ZXJ5IHNob3J0IHVzYWdlIG1lc3NhZ2UgYW5kIGV4aXQuCisKKz1pdGVtIEI8LS12ZXJib3NlPgorCitEbyBwcmludCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLgorCis9aXRlbSBCPC0tdmVyc2lvbj4KKworUHJpbnQgdmVyc2lvbiBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLXF1aWV0PgorCitXb3JrIHF1aWV0LCBkbyBub3QgcHJpbnQgaW5mb3JtYXRpb25hbCBtZXNzYWdlcy4KKworPWJhY2sKKworPWhlYWQxIEFSR1VNRU5UUworCis9b3ZlcgorCis9aXRlbSBJPGZpbGU+CisKK0EgbmFtZSBvZiBpbnB1dCBmaWxlLgorCis9YmFjaworCis9aGVhZDEgREVTQ1JJUFRJT04KKworVGhlIHNjcmlwdCByZWFkcyBpbnB1dCBmaWxlLCBwcm9jZXNzIGNvbmRpdGlvbmFsIGRpcmVjdGl2ZXMsIGNoZWNrcyBjb250ZW50IGZvciBjb25zaXN0ZW5jeSwgYW5kCitnZW5lcmF0ZXMgb3VwdHB1dCBmaWxlIHN1aXRhYmxlIGZvciBsaW5rZXIuCisKKz1oZWFkMiBJbnB1dCBGaWxlIEZvcm1hdAorCis9b3ZlcgorCis9aXRlbSBDb21tZW50cworCisgICAgIyBJdCdzIGEgY29tbWVudC4KKworQ29tbWVudHMgc3RhcnQgd2l0aCBDPCM+IHN5bWJvbCBhbmQgY29udGludWUgdG8gdGhlIGVuZCBvZiBsaW5lLgorCis9aXRlbSBDb25kaXRpb25hbCBEaXJlY3RpdmVzCisKKyAgICAlaWZkZWYgbmFtZQorICAgICVpZm5kZWYgbmFtZQorICAgICVlbmRpZgorCitBIHBhcnQgb2YgZmlsZSBzdXJyb3VuZGVkIGJ5IEM8JWlmZGVmIEk8bmFtZT4+IGFuZCBDPCVlbmRpZj4gZGlyZWN0aXZlcyBpcyBhIGNvbmRpdGlvbmFsIHBhcnQgLS0gaXQKK2hhcyBlZmZlY3Qgb25seSBpZiBJPG5hbWU+IGlzIGRlZmluZWQgaW4gdGhlIGNvbW1hbiBsaW5lIGJ5IEI8LS1kZWZpbmU+IG9wdGlvbi4gQzwlaWZuZGVmPiBpcyBhCituZWdhdGVkIHZlcnNpb24gb2YgQzwlaWZkZWY+IC0tIGNvbmRpdGlvbmFsIHBhcnQgaGFzIGFuIGVmZmVjdCBvbmx5IGlmIEk8bmFtZT4gaXMgQjxub3Q+IGRlZmluZWQuCisKK0NvbmRpdGlvbmFsIHBhcnRzIG1heSBiZSBuZXN0ZWQuCisKKz1pdGVtIEV4cG9ydCBEZWZpbml0aW9ucworCisgICAgc3ltYm9sCisgICAgc3ltYm9sIG9yZGluYWwKKyAgICBzeW1ib2wgREFUQQorCitTeW1ib2xzIHN0YXJ0aW5nIHdpdGggQzxvbXBfPiBvciBDPGttcF8+IG11c3QgaGF2ZSBvcmRpbmFsIHNwZWNpZmllZC4gVGhleSBhcmUgc3ViamVjdHMgZm9yIHNwZWNpYWwKK3Byb2Nlc3Npbmc6IGVhY2ggc3ltYm9sIGdlbmVyYXRlcyB0d28gb3V0cHV0IGxpbmVzOiBvcmlnaW5hbCBvbmUgYW5kIHVwcGVyIGNhc2UgdmVyc2lvbi4gVGhlIG9yZGluYWwKK251bWJlciBvZiB0aGUgc2Vjb25kIGlzIG9yaWdpbmFsIG9yZGluYWwgaW5jcmVhc2VkIGJ5IDEwMDAuCisKKz1pdGVtIE9ic29sZXRlIFN5bWJvbHMKKworICAgIC0gc3ltYm9sCisgICAgLSBzeW1ib2wgb3JkaW5hbAorICAgIC0gc3ltYm9sIERBVEEKKworT2Jzb2xldGUgc3ltYm9scyBsb29rIGxpa2UgZXhwb3J0IGRlZmluaXRpb25zIHByZWZpeGVkIHdpdGggbWludXMgc2lnbi4gT2Jzb2xldGUgc3ltYm9scyBkbyBub3QKK2FmZmVjdCB0aGUgb3V0cHV0LCBidXQgb2Jzb2xldGUgc3ltYm9scyBhbmQgdGhlaXIgb3JkaW5hbHMgY2Fubm90IGJlIChyZSl1c2VkIGluIGV4cG9ydCBkZWZpbml0aW9ucy4KKworPWJhY2sKKworPWhlYWQxIEVYQU1QTEVTCisKKyAgICAkIGdlbmVyYXRlLWRlZi5wbCAtRCBzdHViIC1EIFVTRV9UQ0hFQ0s9MCAtbyBsaWJndWlkZS5kZWYgZGxsZXhwb3J0CisKKz1jdXQKKworIyBlbmQgb2YgZmlsZSAjCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdG9vbHMvbGliL0J1aWxkLnBtIGIvZmluYWwvcnVudGltZS90b29scy9saWIvQnVpbGQucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y2NzE1NgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvbGliL0J1aWxkLnBtCkBAIC0wLDAgKzEsMjY0IEBACisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCitwYWNrYWdlIEJ1aWxkOworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgQ3dkIHF3e307CisKK3VzZSBMaWJPTVA7Cit1c2UgdG9vbHM7Cit1c2UgVW5hbWU7Cit1c2UgUGxhdGZvcm0gIjp2YXJzIjsKKworbXkgJGhvc3QgPSBVbmFtZTo6aG9zdF9uYW1lKCk7CitteSAkcm9vdCA9ICRFTlZ7IExJQk9NUF9XT1JLICAgIH07CitteSAkdG1wICA9ICRFTlZ7IExJQk9NUF9UTVAgICAgIH07CitteSAkb3V0ICA9ICRFTlZ7IExJQk9NUF9FWFBPUlRTIH07CisKK215IEBqb2JzOworb3VyICRzdGFydCA9IHRpbWUoKTsKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBIZWxwZXIgZnVuY3Rpb25zLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIHRzdHIgLS0gVGltZSBzdHJpbmcuIFJldHVybnMgc3RyaW5nICJ5eXl5LWRkLW1tIGhoOm1tOnNzIFVUQyIuCitzdWIgdHN0cig7JCkgeworICAgIG15ICggJHRpbWUgKSA9IEBfOworICAgIGlmICggbm90IGRlZmluZWQoICR0aW1lICkgKSB7CisgICAgICAgICR0aW1lID0gdGltZSgpOworICAgIH07ICMgaWYKKyAgICBteSAoICRzZWMsICRtaW4sICRob3VyLCAkZGF5LCAkbW9udGgsICR5ZWFyICkgPSBnbXRpbWUoICR0aW1lICk7CisgICAgJG1vbnRoICs9IDE7CisgICAgJHllYXIgICs9IDE5MDA7CisgICAgbXkgJHN0ciA9IHNwcmludGYoICIlMDRkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6JTAyZCBVVEMiLCAkeWVhciwgJG1vbnRoLCAkZGF5LCAkaG91ciwgJG1pbiwgJHNlYyApOworICAgIHJldHVybiAkc3RyOworfTsgIyBzdWIgdHN0cgorCisjIGRzdHIgLS0gRHVyYXRpb24gc3RyaW5nLiBSZXR1cm5zIHN0cmluZyAiaGg6bW06c3MiLgorc3ViIGRzdHIoJCkgeworICAgICMgR2V0IHRpbWUgaW4gc2Vjb25kcyBhbmQgZm9ybWF0IGl0IGFzIHRpbWUgaW4gaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMuCisgICAgbXkgKCAkc2VjICkgPSBAXzsKKyAgICBteSAoICRoLCAkbSwgJHMgKTsKKyAgICAkaCAgID0gaW50KCAkc2VjIC8gMzYwMCApOworICAgICRzZWMgPSAkc2VjIC0gJGggKiAzNjAwOworICAgICRtICAgPSBpbnQoICRzZWMgLyA2MCApOworICAgICRzZWMgPSAkc2VjIC0gJG0gKiA2MDsKKyAgICAkcyAgID0gaW50KCAkc2VjICk7CisgICAgJHNlYyA9ICRzZWMgLSAkczsKKyAgICByZXR1cm4gc3ByaW50ZiggIiUwMmQ6JTAyZDolMDJkIiwgJGgsICRtLCAkcyApOworfTsgIyBzdWIgZHN0cgorCisjIHJzdHIgLS0gUmVzdWx0IHN0cmluZy4KK3N1YiByc3RyKCQpIHsKKyAgICBteSAoICRyYyApID0gQF87CisgICAgcmV0dXJuICggJHJjID09IDAgPyAiKysrIFN1Y2Nlc3MgKysrIiA6ICItLS0gRmFpbHVyZSAtLS0iICk7Cit9OyAjIHN1YiByc3RyCisKK3N1YiBzaG9ydGVyKCQ7JCkgeworICAgICMgUmV0dXJuIHNob3J0ZXIgdmFyaWFudCBvZiBwYXRoIC0tIGVpdGhlciBhYnNvbHV0ZSBvciByZWxhdGl2ZS4KKyAgICBteSAoICRwYXRoLCAkYmFzZSApID0gQF87CisgICAgbXkgJGFicyA9IGFic19wYXRoKCAkcGF0aCApOworICAgIG15ICRyZWwgPSByZWxfcGF0aCggJHBhdGgsICRiYXNlICk7CisgICAgaWYgKCAkcmVsIGVxICIiICkgeworICAgICAgICAkcmVsID0gIi4iOworICAgIH07ICMgaWYKKyAgICAkcGF0aCA9ICggbGVuZ3RoKCAkcmVsICkgPCBsZW5ndGgoICRhYnMgKSA/ICRyZWwgOiAkYWJzICk7CisgICAgaWYgKCAkdGFyZ2V0X29zIGVxICJ3aW4iICkgeworICAgICAgICAkcGF0aCA9fiBze1xcfXsvfWc7CisgICAgfTsgIyBpZgorICAgIHJldHVybiAkcGF0aDsKK307ICMgc3ViIHNob3J0ZXIKKworc3ViIHRlZSgkJCkgeworCisgICAgbXkgKCAkYWN0aW9uLCAkZmlsZSApID0gQF87CisgICAgbXkgJHBpZCA9IDA7CisKKyAgICBteSAkc2F2ZV9zdGRvdXQgPSBTeW1ib2w6OmdlbnN5bSgpOworICAgIG15ICRzYXZlX3N0ZGVyciA9IFN5bWJvbDo6Z2Vuc3ltKCk7CisKKyAgICAjIC0tLSByZWRpcmVjdCBzdGRvdXQgLS0tCisgICAgU1RET1VULT5mbHVzaCgpOworICAgICMgU2F2ZSBzdGRvdXQgaW4gJHNhdmVfc3Rkb3V0LgorICAgIG9wZW4oICRzYXZlX3N0ZG91dCwgIj4mIiAuIFNURE9VVC0+ZmlsZW5vKCkgKQorICAgICAgICBvciBkaWUoICJDYW5ub3QgZHVwIGZpbGVoYW5kbGU6ICQhOyBzdG9wcGVkIiApOworICAgICMgUmVkaXJlY3Qgc3Rkb3V0IHRvIHRlZSBvciB0byBmaWxlLgorICAgIGlmICggJHRvb2xzOjp2ZXJib3NlICkgeworICAgICAgICAkcGlkID0gb3BlbiggU1RET1VULCAifCB0ZWUgLWEgXCIkZmlsZVwiIiApCisgICAgICAgICAgICBvciBkaWUgIkNhbm5vdCBvcGVuIHBpcGUgdG8gXCJ0ZWVcIjogJCE7IHN0b3BwZWQiOworICAgIH0gZWxzZSB7CisgICAgICAgIG9wZW4oIFNURE9VVCwgIj4+JGZpbGUiICkKKyAgICAgICAgICAgIG9yIGRpZSAiQ2Fubm90IG9wZW4gZmlsZSBcIiRmaWxlXCIgZm9yIHdyaXRpbmc6ICQhOyBzdG9wcGVkIjsKKyAgICB9OyAjIGlmCisKKyAgICAjIC0tLSByZWRpcmVjdCBzdGRlcnIgLS0tCisgICAgU1RERVJSLT5mbHVzaCgpOworICAgICMgU2F2ZSBzdGRlcnIgaW4gJHNhdmVfc3RkZXJyLgorICAgIG9wZW4oICRzYXZlX3N0ZGVyciwgIj4mIiAuIFNUREVSUi0+ZmlsZW5vKCkgKQorICAgICAgICBvciBkaWUoICJDYW5ub3QgZHVwIGZpbGVoYW5kbGU6ICQhOyBzdG9wcGVkIiApOworICAgICMgUmVkaXJlY3Qgc3RkZXJyIHRvIHN0ZG91dC4KKyAgICBvcGVuKCBTVERFUlIsICI+JiIgLiBTVERPVVQtPmZpbGVubygpICkKKyAgICAgICAgb3IgZGllKCAiQ2Fubm90IGR1cCBmaWxlaGFuZGxlOiAkITsgc3RvcHBlZCIgKTsKKworICAgICMgUGVyZm9ybSBhY3Rpb25zLgorICAgICRhY3Rpb24tPigpOworCisgICAgIyAtLS0gcmVzdG9yZSBzdGRlcnIgLS0tCisgICAgU1RERVJSLT5mbHVzaCgpOworICAgICMgUmVzdG9yZSBzdGRlcnIgZnJvbSAkc2F2ZV9zdGRlcnIuCisgICAgb3BlbiggU1RERVJSLCAiPiYiIC4gJHNhdmVfc3RkZXJyLT5maWxlbm8oKSApCisgICAgICAgIG9yIGRpZSggIkNhbm5vdCBkdXAgZmlsZWhhbmRsZTogJCE7IHN0b3BwZWQiICk7CisgICAgIyBDbG9zZSAkc2F2ZV9zdGRlcnIuCisgICAgJHNhdmVfc3RkZXJyLT5jbG9zZSgpIG9yIGRpZSAoICJDYW5ub3QgY2xvc2UgZmlsZWhhbmRsZTogJCE7IHN0b3BwZWQiICk7CisKKyAgICAjIC0tLSByZXN0b3JlIHN0ZG91dCAtLS0KKyAgICBTVERPVVQtPmZsdXNoKCk7CisgICAgIyBSZXN0b3JlIHN0ZG91dCBmcm9tICRzYXZlX3N0ZG91dC4KKyAgICBvcGVuKCBTVERPVVQsICI+JiIgLiAkc2F2ZV9zdGRvdXQtPmZpbGVubygpICkKKyAgICAgICAgb3IgZGllKCAiQ2Fubm90IGR1cCBmaWxlaGFuZGxlOiAkITsgc3RvcHBlZCIgKTsKKyAgICAjIENsb3NlICRzYXZlX3N0ZG91dC4KKyAgICAkc2F2ZV9zdGRvdXQtPmNsb3NlKCkgb3IgZGllICggIkNhbm5vdCBjbG9zZSBmaWxlaGFuZGxlOiAkITsgc3RvcHBlZCIgKTsKKworICAgICMgV2FpdCBmb3IgdGhlIGNoaWxkIHRlZSBwcm9jZXNzLCBvdGhlcndpc2Ugb3V0cHV0IG9mIG1ha2UgYW5kIGJ1aWxkLnBsIGludGVybGVhdmVzLgorICAgIGlmICggJHBpZCAhPSAwICkgeworICAgICAgICB3YWl0cGlkKCAkcGlkLCAwICk7CisgICAgfTsgIyBpZgorCit9OyAjIHN1YiB0ZWUKKworc3ViIGxvZ19pdCgkJEApIHsKKyAgICBteSAoICR0aXRsZSwgJGZvcm1hdCwgQGFyZ3MgKSA9IEBfOworICAgIG15ICRtZXNzYWdlICA9IHNwcmludGYoICRmb3JtYXQsIEBhcmdzICk7CisgICAgbXkgJHByb2dyZXNzID0gY2F0X2ZpbGUoICR0bXAsIHNwcmludGYoICIlcy0lcy5sb2ciLCAkdGFyZ2V0X3BsYXRmb3JtLCBVbmFtZTo6aG9zdF9uYW1lKCkgKSApOworICAgIGlmICggJHRpdGxlIG5lICIiIGFuZCAkbWVzc2FnZSBuZSAiIiApIHsKKyAgICAgICAgbXkgJGxpbmUgPSBzcHJpbnRmKCAiJS0xNXMgOiAlc1xuIiwgJHRpdGxlLCAkbWVzc2FnZSApOworICAgICAgICBpbmZvKCAkbGluZSApOworICAgICAgICB3cml0ZV9maWxlKCAkcHJvZ3Jlc3MsIHRzdHIoKSAuICI6ICIgLiAkbGluZSwgLWFwcGVuZCA9PiAxICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgd3JpdGVfZmlsZSggJHByb2dyZXNzLCAiXG4iLCAtYXBwZW5kID0+IDEgKTsKKyAgICB9OyAjIGlmCit9OyAjIHN1YiBsb2dfaXQKKworc3ViIHByb2dyZXNzKCQkQCkgeworICAgIG15ICggJHRpdGxlLCAkZm9ybWF0LCBAYXJncyApID0gQF87CisgICAgbG9nX2l0KCAkdGl0bGUsICRmb3JtYXQsIEBhcmdzICk7Cit9OyAjIHN1YiBwcm9ncmVzcworCitzdWIgc3VtbWFyeSgpIHsKKyAgICBteSAkdG90YWwgICA9IEBqb2JzOworICAgIG15ICRzdWNjZXNzID0gMDsKKyAgICBteSAkZmluaXNoID0gdGltZSgpOworICAgIGZvcmVhY2ggbXkgJGpvYiAoIEBqb2JzICkgeworICAgICAgICBteSAoICRidWlsZF9kaXIsICRyYyApID0gKCAkam9iLT57IGJ1aWxkX2RpciB9LCAkam9iLT57IHJjIH0gKTsKKyAgICAgICAgcHJvZ3Jlc3MoIHJzdHIoICRyYyApLCAiJXMiLCAkYnVpbGRfZGlyICk7CisgICAgICAgIGlmICggJHJjID09IDAgKSB7CisgICAgICAgICAgICArKyAkc3VjY2VzczsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgZm9yZWFjaCAkam9iCisgICAgbXkgJGZhaWx1cmUgPSAkdG90YWwgLSAkc3VjY2VzczsKKyAgICBwcm9ncmVzcyggIlN1Y2Nlc3NlcyIsICAgICAgIiUzZCBvZiAlM2QiLCAkc3VjY2VzcywgJHRvdGFsICk7CisgICAgcHJvZ3Jlc3MoICJGYWlsdXJlcyIsICAgICAgICIlM2Qgb2YgJTNkIiwgJGZhaWx1cmUsICR0b3RhbCApOworICAgIHByb2dyZXNzKCAiVGltZSBlbGFwc2VkIiwgICAiICAlcyIsIGRzdHIoICRmaW5pc2ggLSAkc3RhcnQgKSApOworICAgIHByb2dyZXNzKCAiT3ZlcmFsbCByZXN1bHQiLCAiJXMiLCByc3RyKCAkZmFpbHVyZSApICk7CisgICAgcmV0dXJuICRmYWlsdXJlOworfTsgIyBzdWIgc3VtbWFyeQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFdvcmtlciBmdW5jdGlvbnMuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N1YiBpbml0KCkgeworICAgIG1ha2VfZGlyKCAkdG1wICk7Cit9OyAjIHN1YiBpbml0CisKK3N1YiBjbGVhbihAKSB7CisgICAgIyBDbGVhbiBkaXJlY3Rvcmllcy4KKyAgICBteSAoIEBkaXJzICkgPSBAXzsKKyAgICBteSAkZXhpdCA9IDA7CisgICAgIyBNaW1pc2MgbWFrZWZpbGUgLS0gcHJpbnQgYSBjb21tYW5kLgorICAgIHByaW50KCAicm0gLWYgLXIgIiAuIGpvaW4oICIgIiwgbWFwKCBzaG9ydGVyKCAkXyApIC4gIi8qIiwgQGRpcnMgKSApIC4gIlxuIiApOworICAgICRleGl0ID0KKyAgICAgICAgZXhlY3V0ZSgKKyAgICAgICAgICAgIFsgJF5YLCBjYXRfZmlsZSggJEVOVnsgTElCT01QX1dPUksgfSwgInRvb2xzIiwgImNsZWFuLWRpci5wbCIgKSwgQGRpcnMgXSwKKyAgICAgICAgICAgIC1pZ25vcmVfc3RhdHVzID0+IDEsCisgICAgICAgICAgICAoICR0b29sczo6dmVyYm9zZSA/ICgpIDogKCAtc3Rkb3V0ID0+IHVuZGVmLCAtc3RkZXJyID0+ICIiICkgKSwKKyAgICAgICAgKTsKKyAgICByZXR1cm4gJGV4aXQ7Cit9OyAjIHN1YiBjbGVhbgorCitzdWIgbWFrZSgkJCQpIHsKKyAgICAjIENoYW5nZSBkaXIgdG8gYnVpbGQgb25lIGFuZCBydW4gbWFrZS4KKyAgICBteSAoICRqb2IsICRjbGVhbiwgJG1hcmtlciApID0gQF87CisgICAgbXkgJGRpciAgICAgID0gJGpvYi0+eyBidWlsZF9kaXIgfTsKKyAgICBteSAkbWFrZWZpbGUgPSAkam9iLT57IG1ha2VmaWxlIH07CisgICAgbXkgJGFyZ3MgICAgID0gJGpvYi0+eyBtYWtlX2FyZ3MgfTsKKyAgICBteSAkY3dkICAgICAgPSBDd2Q6OmN3ZCgpOworICAgIG15ICR3aWR0aCAgICA9IC0xMDsKKworICAgIG15ICRleGl0OworICAgICRkaXIgPSBjYXRfZGlyKCAkdG1wLCAkZGlyICk7CisgICAgbWFrZV9kaXIoICRkaXIgKTsKKyAgICBjaGFuZ2VfZGlyKCAkZGlyICk7CisKKyAgICBteSAkYWN0aW9ucyA9CisgICAgICAgIHN1YiB7CisgICAgICAgICAgICBteSAkc3RhcnQgPSB0aW1lKCk7CisgICAgICAgICAgICAkbWFrZWZpbGUgPSBzaG9ydGVyKCAkbWFrZWZpbGUgKTsKKyAgICAgICAgICAgIHByaW50KCAiLSIgeCA3OSwgIlxuIiApOworICAgICAgICAgICAgcHJpbnRmKCAiJSR7d2lkdGh9czogJXNcbiIsICJTdGFydGVkIiwgICB0c3RyKCAkc3RhcnQgKSApOworICAgICAgICAgICAgcHJpbnRmKCAiJSR7d2lkdGh9czogJXNcbiIsICJSb290IGRpciIsICAkcm9vdCApOworICAgICAgICAgICAgcHJpbnRmKCAiJSR7d2lkdGh9czogJXNcbiIsICJCdWlsZCBkaXIiLCBzaG9ydGVyKCAkZGlyLCAkcm9vdCApICk7CisgICAgICAgICAgICBwcmludGYoICIlJHt3aWR0aH1zOiAlc1xuIiwgIk1ha2VmaWxlIiwgICRtYWtlZmlsZSApOworICAgICAgICAgICAgcHJpbnQoICItIiB4IDc5LCAiXG4iICk7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIyBVc2Ugc2hvcnRlciBMSUJPTVBfV09SSyB0byBoYXZlIHNob3J0ZXIgY29tbWFuZCBsaW5lcy4KKyAgICAgICAgICAgICAgICAjIE5vdGU6IFNvbWUgdG9vbHMgbWF5IG5vdCB3b3JrIGlmIGN1cnJlbnQgZGlyIGlzIGNoYW5nZWQuCisgICAgICAgICAgICAgICAgbG9jYWwgJEVOVnsgTElCT01QX1dPUksgfSA9IHNob3J0ZXIoICRFTlZ7IExJQk9NUF9XT1JLIH0gKTsKKyAgICAgICAgICAgICAgICAkZXhpdCA9CisgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGUoCisgICAgICAgICAgICAgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1ha2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICItciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi1mIiwgJG1ha2VmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcmNoPSIgLiAkdGFyZ2V0X2FyY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hcmtlcj0kbWFya2VyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBAJGFyZ3MKKyAgICAgICAgICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgICAgICAgICAtaWdub3JlX3N0YXR1cyA9PiAxCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgaWYgKCAkY2xlYW4gYW5kICRleGl0ID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICRleGl0ID0gY2xlYW4oICRkaXIgKTsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICB9CisgICAgICAgICAgICBteSAkZmluaXNoID0gdGltZSgpOworICAgICAgICAgICAgcHJpbnQoICItIiB4IDc5LCAiXG4iICk7CisgICAgICAgICAgICBwcmludGYoICIlJHt3aWR0aH1zOiAlc1xuIiwgIkZpbmlzaGVkIiwgdHN0ciggJGZpbmlzaCApICk7CisgICAgICAgICAgICBwcmludGYoICIlJHt3aWR0aH1zOiAlc1xuIiwgIkVsYXBzZWQiLCBkc3RyKCAkZmluaXNoIC0gJHN0YXJ0ICkgKTsKKyAgICAgICAgICAgIHByaW50ZiggIiUke3dpZHRofXM6ICVzXG4iLCAiUmVzdWx0IiwgcnN0ciggJGV4aXQgKSApOworICAgICAgICAgICAgcHJpbnQoICItIiB4IDc5LCAiXG4iICk7CisgICAgICAgICAgICBwcmludCggIlxuIiApOworICAgICAgICB9OyAjIHN1YgorICAgIHRlZSggJGFjdGlvbnMsICJidWlsZC5sb2ciICk7CisKKyAgICBjaGFuZ2VfZGlyKCAkY3dkICk7CisKKyAgICAjIFNhdmUgY29tcGxldGVkIGpvYiB0byBiZSBhYmxlIHByaW50IHN1bW1hcnkgbGF0ZXIuCisgICAgJGpvYi0+eyByYyB9ID0gJGV4aXQ7CisgICAgcHVzaCggQGpvYnMsICRqb2IgKTsKKworICAgIHJldHVybiAkZXhpdDsKKworfTsgIyBzdWIgbWFrZQorCisxOwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90b29scy9saWIvTGliT01QLnBtIGIvZmluYWwvcnVudGltZS90b29scy9saWIvTGliT01QLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YTM3MWYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rvb2xzL2xpYi9MaWJPTVAucG0KQEAgLTAsMCArMSw4NSBAQAorIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworcGFja2FnZSBMaWJPTVA7CisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSB0b29sczsKKworc3ViIGVtcHR5KCQpIHsKKyAgICBteSAoICR2YXIgKSA9IEBfOworICAgIHJldHVybiBub3QgZXhpc3RzKCAkRU5WeyAkdmFyIH0gKSBvciBub3QgZGVmaW5lZCggJEVOVnsgJHZhciB9ICkgb3IgJEVOVnsgJHZhciB9IGVxICIiOworfTsgIyBzdWIgZW1wdHkKKworbXkgKCAkYmFzZSwgJG91dCwgJHRtcCApOworaWYgKCBlbXB0eSggIkxJQk9NUF9XT1JLIiApICkgeworICAgICMgJEZpbmRCaW46OkJpbiBpcyBub3QgdXNlZCBpbnRlbnRpb25hbGx5IGJlY2F1c2UgaXQgZ2l2ZXMgcmVhbCBwYXRoLiBJIHdhbnQgdG8gdXNlIGFic29sdXRlLAorICAgICMgYnV0IG5vdCByZWFsIG9uZSAocmVhbCBwYXRoIGRvZXMgbm90IGNvbnRhaW4gc3ltbGlua3Mgd2hpbGUgYWJzb2x1dGUgcGF0aCBtYXkgY29udGFpbgorICAgICMgc3ltbGlua3MpLgorICAgICRiYXNlID0gZ2V0X2RpciggZ2V0X2RpciggYWJzX3BhdGgoICQwICkgKSApOworfSBlbHNlIHsKKyAgICAkYmFzZSA9IGFic19wYXRoKCAkRU5WeyBMSUJPTVBfV09SSyB9ICk7Cit9OyAjIGlmCisKK2lmICggZW1wdHkoICJMSUJPTVBfRVhQT1JUUyIgKSApIHsKKyAgICAkb3V0ID0gY2F0X2RpciggJGJhc2UsICJleHBvcnRzIiApOworfSBlbHNlIHsKKyAgICAkb3V0ID0gYWJzX3BhdGgoICRFTlZ7IExJQk9NUF9FWFBPUlRTIH0gKTsKK307ICMgaWYKKworaWYgKCBlbXB0eSggIkxJQk9NUF9UTVAiICkgKSB7CisgICAgJHRtcCA9IGNhdF9kaXIoICRiYXNlLCAidG1wIiApOworfSBlbHNlIHsKKyAgICAkdG1wID0gYWJzX3BhdGgoICRFTlZ7IExJQk9NUF9UTVAgfSApOworfTsgIyBpZgorCiskRU5WeyBMSUJPTVBfV09SSyAgICB9ID0gJGJhc2U7CiskRU5WeyBMSUJPTVBfRVhQT1JUUyB9ID0gJG91dDsKKyRFTlZ7IExJQk9NUF9UTVAgICAgIH0gPSAkdG1wOworCityZXR1cm4gMTsKKworX19FTkRfXworCis9cG9kCisKKz1oZWFkMSBOQU1FCisKK0I8TGliT01QLnBtPiAtLQorCis9aGVhZDEgU1lOT1BTSVMKKworICAgIHVzZSBGaW5kQmluOworICAgIHVzZSBsaWIgIiRGaW5kQmluOjpCaW4vbGliIjsKKyAgICB1c2UgTGliT01QOworCisgICAgJEVOVnsgTElCT01QX1dPUksgICAgfQorICAgICRFTlZ7IExJQk9NUF9UTVAgICAgIH0KKyAgICAkRU5WeyBMSUJPTVBfRVhQT1JUUyB9CisKKz1oZWFkMSBERVNDUklQVElPTgorCitUaGUgbW9kdWxlIGNoZWNrcyBDPExJQk9NUF9XT1JLPiwgQzxMSUJPTVBfRVhQT1JUUz4sIGFuZCBDPExJQk9NUF9UTVA+IGVudmlyb25tZW50cyB2YXJpYWJsZXMuCitJZiBhIHZhcmlhYmxlIHNldCwgdGhlIG1vZHVsZSBtYWtlcyBzdXJlIGl0IGlzIGFic29sdXRlLiBJZiBhIHZhcmlhYmxlIGRvZXMgbm90IGV4aXN0LCB0aGUgbW9kdWxlCitzZXRzIGl0IHRvIGRlZmF1bHQgdmFsdWUuCisKK0RlZmF1bHQgdmFsdWUgZm9yIEM8TElCT01QX0VYUE9SVFM+IGlzIEM8JExJQk9NUF9XT1JLL2V4cG9ydHM+LCBmb3IgQzxMSUJPTVBfVE1QPiAtLQorQzwkTElCT01QX1dPUksvdG1wPi4KKworVmFsdWUgZm9yIEM8TElCT01QX1dPUks+IGlzIGd1ZXNzZWQuIFRoZSBtb2R1bGUgYXNzdW1lcyB0aGUgc2NyaXB0ICh3aGljaCB1c2VzIHRoZSBtb2R1bGUpIGlzCitsb2NhdGVkIGluIEM8dG9vbHMvPiBkaXJlY3Rvcnkgb2YgbGlib21wIGRpcmVjdG9yeSB0cmVlLCBhbmQgdXNlcyBwYXRoIG9mIHRoZSBzY3JpcHQgdG8gY2FsY3VsYXRlCitDPExJQk9NUF9XT1JLPiwKKworPWN1dAorCisjIGVuZCBvZiBmaWxlICMKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90b29scy9saWIvUGxhdGZvcm0ucG0gYi9maW5hbC9ydW50aW1lL3Rvb2xzL2xpYi9QbGF0Zm9ybS5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTg4MmQzCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90b29scy9saWIvUGxhdGZvcm0ucG0KQEAgLTAsMCArMSw0NzMgQEAKKyMKKyMgVGhpcyBpcyBub3QgYSBydW5uYWJsZSBzY3JpcHQsIGl0IGlzIGEgUGVybCBtb2R1bGUsIGEgY29sbGVjdGlvbiBvZiB2YXJpYWJsZXMsIHN1YnJvdXRpbmVzLCBldGMuCisjIHRvIGJlIHVzZWQgaW4gUGVybCBzY3JpcHRzLgorIworIyBUbyBnZXQgaGVscCBhYm91dCBleHBvcnRlZCB2YXJpYWJsZXMgYW5kIHN1YnJvdXRpbmVzLCBleGVjdXRlIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKKyMKKyMgICAgIHBlcmxkb2MgUGxhdGZvcm0ucG0KKyMKKyMgb3Igc2VlIFBPRCAoUGxhaW4gT2xkIERvY3VtZW50YXRpb24pIGltYmVkZGVkIHRvIHRoZSBzb3VyY2UuLi4KKyMKKyMKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworcGFja2FnZSBQbGF0Zm9ybTsKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIGJhc2UgIkV4cG9ydGVyIjsKKwordXNlIFVuYW1lOworCitteSBAdmFyczsKKworQkVHSU4geworICAgIEB2YXJzID0gcXd7ICRob3N0X2FyY2ggJGhvc3Rfb3MgJGhvc3RfcGxhdGZvcm0gJHRhcmdldF9hcmNoICR0YXJnZXRfbWljX2FyY2ggJHRhcmdldF9vcyAkdGFyZ2V0X3BsYXRmb3JtIH07Cit9CisKK291ciAkVkVSU0lPTiAgICAgPSAiMC4wMTQiOworb3VyIEBFWFBPUlQgICAgICA9IHF3e307CitvdXIgQEVYUE9SVF9PSyAgID0gKCBxd3sgY2Fub25fYXJjaCBjYW5vbl9vcyBjYW5vbl9taWNfYXJjaCBsZWdhbF9hcmNoIGFyY2hfb3B0IH0sIEB2YXJzICk7CitvdXIgJUVYUE9SVF9UQUdTID0gKCBhbGwgPT4gWyBARVhQT1JUX09LIF0sIHZhcnMgPT4gXEB2YXJzICk7CisKKyMgQ2Fub25pemUgYXJjaGl0ZWN0dXJlIG5hbWUuCitzdWIgY2Fub25fYXJjaCgkKSB7CisgICAgbXkgKCAkYXJjaCApID0gQF87CisgICAgaWYgKCBkZWZpbmVkKCAkYXJjaCApICkgeworICAgICAgICBpZiAoICRhcmNoID1+IG17XEFccyooPzozMnxJQS0/MzJ8SUEtPzMyIGFyY2hpdGVjdHVyZXxpWzM0NTZdODZ8eDg2KVxzKlx6fWkgKSB7CisgICAgICAgICAgICAkYXJjaCA9ICIzMiI7CisgICAgICAgIH0gZWxzaWYgKCAkYXJjaCA9fiBte1xBXHMqKD86NDh8KD86aWEpPzMyZXxJbnRlbFxzKjY0fEludGVsXChSXClccyo2NHx4ODZbXy1dNjR8eDY0fEFNRDY0KVxzKlx6fWkgKSB7CisgICAgICAgICAgICAkYXJjaCA9ICIzMmUiOworICAgICAgICB9IGVsc2lmICggJGFyY2ggPX4gbXtcQWFybSg/OnY3XEQqKT9cen0gKSB7CisgICAgICAgICAgICAkYXJjaCA9ICJhcm0iOworICAgICAgICB9IGVsc2lmICggJGFyY2ggPX4gbXtcQXBwYzY0bGV9ICkgeworCQkJJGFyY2ggPSAicHBjNjRsZSI7CisgICAgICAgIH0gZWxzaWYgKCAkYXJjaCA9fiBte1xBcHBjNjR9ICkgeworICAgICAgICAJJGFyY2ggPSAicHBjNjQiOyAgICAgICAgICAgIAorICAgICAgICB9IGVsc2lmICggJGFyY2ggPX4gbXtcQWFhcmNoNjR9ICkgeyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICRhcmNoID0gImFhcmNoNjQiOworICAgICAgICB9IGVsc2lmICggJGFyY2ggPX4gbXtcQW1pY30gKSB7CisgICAgICAgICAgICAkYXJjaCA9ICJtaWMiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJGFyY2ggPSB1bmRlZjsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKyAgICByZXR1cm4gJGFyY2g7Cit9OyAjIHN1YiBjYW5vbl9hcmNoCisKKyMgQ2Fub25pemUgSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlIG5hbWUuCitzdWIgY2Fub25fbWljX2FyY2goJCkgeworICAgIG15ICggJG1pY19hcmNoICkgPSBAXzsKKyAgICBpZiAoIGRlZmluZWQoICRtaWNfYXJjaCApICkgeworICAgICAgICBpZiAoICRtaWNfYXJjaCA9fiBte1xBa25mfSApIHsKKyAgICAgICAgICAgICRtaWNfYXJjaCA9ICJrbmYiOworICAgICAgICB9IGVsc2lmICggJG1pY19hcmNoID1+IG17XEFrbmN9KSB7CisgICAgICAgICAgICAkbWljX2FyY2ggPSAia25jIjsKKyAgICAgICAgfSBlbHNpZiAoICRtaWNfYXJjaCA9fiBte1xBa25sfSApIHsKKyAgICAgICAgICAgICRtaWNfYXJjaCA9ICJrbmwiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJG1pY19hcmNoID0gdW5kZWY7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGlmCisgICAgcmV0dXJuICRtaWNfYXJjaDsKK307ICMgc3ViIGNhbm9uX21pY19hcmNoCisKK3sgICMgUmV0dXJuIGxlZ2FsIGFwcHJvdmVkIGFyY2hpdGVjdHVyZSBuYW1lLgorICAgIG15ICVsZWdhbCA9ICgKKyAgICAgICAgIjMyIiAgPT4gIklBLTMyIGFyY2hpdGVjdHVyZSIsCisgICAgICAgICIzMmUiID0+ICJJbnRlbChSKSA2NCIsCisgICAgICAgICJhcm0iID0+ICJBUk0iLAorICAgICAgICAiYWFyY2g2NCIgPT4gIkFBcmNoNjQiLAorICAgICAgICAibWljIiA9PiAiSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlIiwKKyAgICApOworCisgICAgc3ViIGxlZ2FsX2FyY2goJCkgeworICAgICAgICBteSAoICRhcmNoICkgPSBAXzsKKyAgICAgICAgJGFyY2ggPSBjYW5vbl9hcmNoKCAkYXJjaCApOworICAgICAgICBpZiAoIGRlZmluZWQoICRhcmNoICkgKSB7CisgICAgICAgICAgICAkYXJjaCA9ICRsZWdhbHsgJGFyY2ggfTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICByZXR1cm4gJGFyY2g7CisgICAgfTsgIyBzdWIgbGVnYWxfYXJjaAorfQorCit7ICAjIFJldHVybiBhcmNoaXRlY3R1cmUgbmFtZSBzdWl0YWJsZSBmb3IgSW50ZWwgY29tcGlsZXIgc2V0dXAgc2NyaXB0cy4KKyAgICBteSAlb3B0aW9uID0gKAorICAgICAgICAiMzIiICA9PiAiaWEzMiIsCisgICAgICAgICIzMmUiID0+ICJpbnRlbDY0IiwKKyAgICAgICAgIjY0IiAgPT4gImlhNjQiLAorICAgICAgICAiYXJtIiA9PiAiYXJtIiwKKyAgICAgICAgImFhcmNoNjQiID0+ICJhYXJjaCIsCisgICAgICAgICJtaWMiID0+ICJpbnRlbDY0IiwKKyAgICApOworCisgICAgc3ViIGFyY2hfb3B0KCQpIHsKKyAgICAgICAgbXkgKCAkYXJjaCApID0gQF87CisgICAgICAgICRhcmNoID0gY2Fub25fYXJjaCggJGFyY2ggKTsKKyAgICAgICAgaWYgKCBkZWZpbmVkKCAkYXJjaCApICkgeworICAgICAgICAgICAgJGFyY2ggPSAkb3B0aW9ueyAkYXJjaCB9OworICAgICAgICB9OyAjIGlmCisgICAgICAgIHJldHVybiAkYXJjaDsKKyAgICB9OyAjIHN1YiBhcmNoX29wdAorfQorCisjIENhbm9uaXplIE9TIG5hbWUuCitzdWIgY2Fub25fb3MoJCkgeworICAgIG15ICggJG9zICkgPSBAXzsKKyAgICBpZiAoIGRlZmluZWQoICRvcyApICkgeworICAgICAgICBpZiAoICRvcyA9fiBte1xBXHMqKD86TGludXh8bGlufGwpXHMqXHp9aSApIHsKKyAgICAgICAgICAgICRvcyA9ICJsaW4iOworICAgICAgICB9IGVsc2lmICggJG9zID1+IG17XEFccyooPzpNYWMoPzpccypPUyg/OlxzKlgpPyk/fG1hY3xtfERhcndpbilccypcen1pICkgeworICAgICAgICAgICAgJG9zID0gIm1hYyI7CisgICAgICAgIH0gZWxzaWYgKCAkb3MgPX4gbXtcQVxzKig/Oldpbig/OmRvd3MpPyg/Oig/Ol98XHMqKT8oPzpOVHxYUHw5NXw5OHwyMDAzKSk/fHcpXHMqXHp9aSApIHsKKyAgICAgICAgICAgICRvcyA9ICJ3aW4iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJG9zID0gdW5kZWY7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGlmCisgICAgcmV0dXJuICRvczsKK307ICMgc3ViIGNhbm9uX29zCisKK215ICggJF9ob3N0X29zLCAkX2hvc3RfYXJjaCwgJF90YXJnZXRfb3MsICRfdGFyZ2V0X2FyY2gsICRfdGFyZ2V0X21pY19hcmNoLCAkX2RlZmF1bHRfbWljX2FyY2gpOworCisjIFNldCB0aGUgZGVmYXVsdCBtaWMtYXJjaCB2YWx1ZS4KKyRfZGVmYXVsdF9taWNfYXJjaCA9ICJrbmMiOworCitzdWIgc2V0X3RhcmdldF9hcmNoKCQpIHsKKyAgICBteSAoICRhcmNoICkgPSBjYW5vbl9hcmNoKCAkX1sgMCBdICk7CisgICAgaWYgKCBkZWZpbmVkKCAkYXJjaCApICkgeworICAgICAgICAkX3RhcmdldF9hcmNoICAgICAgID0gJGFyY2g7CisgICAgICAgICRFTlZ7IExJQk9NUF9BUkNIIH0gPSAkYXJjaDsKKyAgICB9OyAjIGlmCisgICAgcmV0dXJuICRhcmNoOworfTsgIyBzdWIgc2V0X3RhcmdldF9hcmNoCisKK3N1YiBzZXRfdGFyZ2V0X21pY19hcmNoKCQpIHsKKyAgICBteSAoICRtaWNfYXJjaCApID0gY2Fub25fbWljX2FyY2goICRfWyAwIF0gKTsKKyAgICBpZiAoIGRlZmluZWQoICRtaWNfYXJjaCApICkgeworICAgICAgICAkX3RhcmdldF9taWNfYXJjaCAgICAgICA9ICRtaWNfYXJjaDsKKyAgICAgICAgJEVOVnsgTElCT01QX01JQ19BUkNIIH0gPSAkbWljX2FyY2g7CisgICAgfTsgIyBpZgorICAgIHJldHVybiAkbWljX2FyY2g7Cit9OyAjIHN1YiBzZXRfdGFyZ2V0X21pY19hcmNoCisKK3N1YiBzZXRfdGFyZ2V0X29zKCQpIHsKKyAgICBteSAoICRvcyApID0gY2Fub25fb3MoICRfWyAwIF0gKTsKKyAgICBpZiAoIGRlZmluZWQoICRvcyApICkgeworICAgICAgICAkX3RhcmdldF9vcyAgICAgICA9ICRvczsKKyAgICAgICAgJEVOVnsgTElCT01QX09TIH0gPSAkb3M7CisgICAgfTsgIyBpZgorICAgIHJldHVybiAkb3M7Cit9OyAjIHN1YiBzZXRfdGFyZ2V0X29zCisKK3N1YiB0YXJnZXRfb3B0aW9ucygpIHsKKyAgICBteSBAb3B0aW9ucyA9ICgKKyAgICAgICAgInRhcmdldC1vc3xvcz1zIiA9PgorICAgICAgICAgICAgc3ViIHsKKyAgICAgICAgICAgICAgICBzZXRfdGFyZ2V0X29zKCAkX1sgMSBdICkgb3IKKyAgICAgICAgICAgICAgICAgICAgZGllICJCYWQgdmFsdWUgb2YgLS10YXJnZXQtb3Mgb3B0aW9uOiBcIiRfWyAxIF1cIlxuIjsKKyAgICAgICAgICAgIH0sCisgICAgICAgICJ0YXJnZXQtYXJjaGl0ZWN0dXJlfHRhcmdlcnQtYXJjaHxhcmNoaXRlY3R1cmV8YXJjaD1zIiA9PgorICAgICAgICAgICBzdWIgeworICAgICAgICAgICAgICAgc2V0X3RhcmdldF9hcmNoKCAkX1sgMSBdICkgb3IKKyAgICAgICAgICAgICAgICAgICBkaWUgIkJhZCB2YWx1ZSBvZiAtLXRhcmdldC1hcmNoaXRlY3R1cmUgb3B0aW9uOiBcIiRfWyAxIF1cIlxuIjsKKyAgICAgICAgICAgfSwKKyAgICAgICAgInRhcmdldC1taWMtYXJjaGl0ZWN0dXJlfHRhcmdlcnQtbWljLWFyY2h8bWljLWFyY2hpdGVjdHVyZXxtaWMtYXJjaD1zIiA9PgorICAgICAgICAgICBzdWIgeworICAgICAgICAgICAgICAgc2V0X3RhcmdldF9taWNfYXJjaCggJF9bIDEgXSApIG9yCisgICAgICAgICAgICAgICAgICAgZGllICJCYWQgdmFsdWUgb2YgLS10YXJnZXQtbWljLWFyY2hpdGVjdHVyZSBvcHRpb246IFwiJF9bIDEgXVwiXG4iOworICAgICAgICAgICB9LAorICAgICk7CisgICAgcmV0dXJuIEBvcHRpb25zOworfTsgIyBzdWIgdGFyZ2V0X29wdGlvbnMKKworIyBEZXRlY3QgaG9zdCBhcmNoLgoreworICAgIG15ICRoYXJkd2FyZV9wbGF0Zm9ybSA9IFVuYW1lOjpoYXJkd2FyZV9wbGF0Zm9ybSgpOworICAgIGlmICggMCApIHsKKyAgICB9IGVsc2lmICggJGhhcmR3YXJlX3BsYXRmb3JtIGVxICJpMzg2IiApIHsKKyAgICAgICAgJF9ob3N0X2FyY2ggPSAiMzIiOworICAgIH0gZWxzaWYgKCAkaGFyZHdhcmVfcGxhdGZvcm0gZXEgImlhNjQiICkgeworICAgICAgICAkX2hvc3RfYXJjaCA9ICI2NCI7CisgICAgfSBlbHNpZiAoICRoYXJkd2FyZV9wbGF0Zm9ybSBlcSAieDg2XzY0IiApIHsKKyAgICAgICAgJF9ob3N0X2FyY2ggPSAiMzJlIjsKKyAgICB9IGVsc2lmICggJGhhcmR3YXJlX3BsYXRmb3JtIGVxICJhcm0iICkgeworICAgICAgICAkX2hvc3RfYXJjaCA9ICJhcm0iOworICAgIH0gZWxzaWYgKCAkaGFyZHdhcmVfcGxhdGZvcm0gZXEgInBwYzY0bGUiICkgeworICAgICAgICAkX2hvc3RfYXJjaCA9ICJwcGM2NGxlIjsKKyAgICB9IGVsc2lmICggJGhhcmR3YXJlX3BsYXRmb3JtIGVxICJwcGM2NCIgKSB7CisgICAgICAgICRfaG9zdF9hcmNoID0gInBwYzY0IjsKKyAgICB9IGVsc2lmICggJGhhcmR3YXJlX3BsYXRmb3JtIGVxICJhYXJjaDY0IiApIHsgICAgICAgICAKKyAgICAgICAgJF9ob3N0X2FyY2ggPSAiYWFyY2g2NCI7ICAKKyAgICB9IGVsc2UgeworICAgICAgICBkaWUgIlVuc3VwcG9ydGVkIGhvc3QgaGFyZHdhcmUgcGxhdGZvcm06IFwiJGhhcmR3YXJlX3BsYXRmb3JtXCI7IHN0b3BwZWQiOworICAgIH07ICMgaWYKK30KKworIyBEZXRlY3QgaG9zdCBPUy4KK3sKKyAgICBteSAkb3BlcmF0aW5nX3N5c3RlbSA9IFVuYW1lOjpvcGVyYXRpbmdfc3lzdGVtKCk7CisgICAgaWYgKCAwICkgeworICAgIH0gZWxzaWYgKCAkb3BlcmF0aW5nX3N5c3RlbSBlcSAiR05VL0xpbnV4IiApIHsKKyAgICAgICAgJF9ob3N0X29zID0gImxpbiI7CisgICAgfSBlbHNpZiAoICRvcGVyYXRpbmdfc3lzdGVtIGVxICJGcmVlQlNEIiApIHsKKyAgICAgICAgIyBIb3N0IE9TIHJlc2VtYmxlcyBMaW51eC4KKyAgICAgICAgJF9ob3N0X29zID0gImxpbiI7CisgICAgfSBlbHNpZiAoICRvcGVyYXRpbmdfc3lzdGVtIGVxICJOZXRCU0QiICkgeworICAgICAgICAjIEhvc3QgT1MgcmVzZW1ibGVzIExpbnV4LgorICAgICAgICAkX2hvc3Rfb3MgPSAibGluIjsKKyAgICB9IGVsc2lmICggJG9wZXJhdGluZ19zeXN0ZW0gZXEgIkRhcndpbiIgKSB7CisgICAgICAgICRfaG9zdF9vcyA9ICJtYWMiOworICAgIH0gZWxzaWYgKCAkb3BlcmF0aW5nX3N5c3RlbSBlcSAiTVMgV2luZG93cyIgKSB7CisgICAgICAgICRfaG9zdF9vcyA9ICJ3aW4iOworICAgIH0gZWxzZSB7CisgICAgICAgIGRpZSAiVW5zdXBwb3J0ZWQgaG9zdCBvcGVyYXRpbmcgc3lzdGVtOiBcIiRvcGVyYXRpbmdfc3lzdGVtXCI7IHN0b3BwZWQiOworICAgIH07ICMgaWYKK30KKworIyBEZXRlY3QgdGFyZ2V0IGFyY2guCitpZiAoIGRlZmluZWQoICRFTlZ7IExJQk9NUF9BUkNIIH0gKSApIHsKKyAgICAjIFVzZSBhcmNoIHNwZWNpZmllZCBpbiBMSUJPTVBfQVJDSC4KKyAgICAkX3RhcmdldF9hcmNoID0gY2Fub25fYXJjaCggJEVOVnsgTElCT01QX0FSQ0ggfSApOworICAgIGlmICggbm90IGRlZmluZWQoICRfdGFyZ2V0X2FyY2ggKSApIHsKKyAgICAgICAgZGllICJVbmtub3duIGFyY2hpdGVjdHVyZSBzcGVjaWZpZWQgaW4gTElCT01QX0FSQ0ggZW52aXJvbm1lbnQgdmFyaWFibGU6IFwiJEVOVnsgTElCT01QX0FSQ0ggfVwiIjsKKyAgICB9OyAjIGlmCit9IGVsc2UgeworICAgICMgT3RoZXJ3aXNlIHVzZSBob3N0IGFyY2hpdGVjdHVyZS4KKyAgICAkX3RhcmdldF9hcmNoID0gJF9ob3N0X2FyY2g7Cit9OyAjIGlmCiskRU5WeyBMSUJPTVBfQVJDSCB9ID0gJF90YXJnZXRfYXJjaDsKKworIyBEZXRlY3QgdGFyZ2V0IEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZS4KK2lmICggZGVmaW5lZCggJEVOVnsgTElCT01QX01JQ19BUkNIIH0gKSApIHsKKyAgICAjIFVzZSBtaWMgYXJjaCBzcGVjaWZpZWQgaW4gTElCT01QX01JQ19BUkNILgorICAgICRfdGFyZ2V0X21pY19hcmNoID0gY2Fub25fbWljX2FyY2goICRFTlZ7IExJQk9NUF9NSUNfQVJDSCB9ICk7CisgICAgaWYgKCBub3QgZGVmaW5lZCggJF90YXJnZXRfbWljX2FyY2ggKSApIHsKKyAgICAgICAgZGllICJVbmtub3duIGFyY2hpdGVjdHVyZSBzcGVjaWZpZWQgaW4gTElCT01QX01JQ19BUkNIIGVudmlyb25tZW50IHZhcmlhYmxlOiBcIiRFTlZ7IExJQk9NUF9NSUNfQVJDSCB9XCIiOworICAgIH07ICMgaWYKK30gZWxzZSB7CisgICAgIyBPdGhlcndpc2UgdXNlIGRlZmF1bHQgSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlLgorICAgICRfdGFyZ2V0X21pY19hcmNoID0gJF9kZWZhdWx0X21pY19hcmNoOworfTsgIyBpZgorJEVOVnsgTElCT01QX01JQ19BUkNIIH0gPSAkX3RhcmdldF9taWNfYXJjaDsKKworIyBEZXRlY3QgdGFyZ2V0IE9TLgoraWYgKCBkZWZpbmVkKCAkRU5WeyBMSUJPTVBfT1MgfSApICkgeworICAgICMgVXNlIE9TIHNwZWNpZmllZCBpbiBMSUJPTVBfT1MuCisgICAgJF90YXJnZXRfb3MgPSBjYW5vbl9vcyggJEVOVnsgTElCT01QX09TIH0gKTsKKyAgICBpZiAoIG5vdCBkZWZpbmVkKCAkX3RhcmdldF9vcyApICkgeworICAgICAgICBkaWUgIlVua25vd24gT1Mgc3BlY2lmaWVkIGluIExJQk9NUF9PUyBlbnZpcm9ubWVudCB2YXJpYWJsZTogXCIkRU5WeyBMSUJPTVBfT1MgfVwiIjsKKyAgICB9OyAjIGlmCit9IGVsc2UgeworICAgICMgT3RoZXJ3aXNlIHVzZSBob3N0IE9TLgorICAgICRfdGFyZ2V0X29zID0gJF9ob3N0X29zOworfTsgIyBpZgorJEVOVnsgTElCT01QX09TIH0gPSAkX3RhcmdldF9vczsKKwordXNlIHZhcnMgQHZhcnM7CisKK3RpZSggJGhvc3RfYXJjaCwgICAgICAgIlBsYXRmb3JtOjpob3N0X2FyY2giICk7Cit0aWUoICRob3N0X29zLCAgICAgICAgICJQbGF0Zm9ybTo6aG9zdF9vcyIgKTsKK3RpZSggJGhvc3RfcGxhdGZvcm0sICAgIlBsYXRmb3JtOjpob3N0X3BsYXRmb3JtIiApOwordGllKCAkdGFyZ2V0X2FyY2gsICAgICAiUGxhdGZvcm06OnRhcmdldF9hcmNoIiApOwordGllKCAkdGFyZ2V0X21pY19hcmNoLCAiUGxhdGZvcm06OnRhcmdldF9taWNfYXJjaCIgKTsKK3RpZSggJHRhcmdldF9vcywgICAgICAgIlBsYXRmb3JtOjp0YXJnZXRfb3MiICk7Cit0aWUoICR0YXJnZXRfcGxhdGZvcm0sICJQbGF0Zm9ybTo6dGFyZ2V0X3BsYXRmb3JtIiApOworCit7IHBhY2thZ2UgUGxhdGZvcm06OmJhc2U7CisKKyAgICB1c2UgQ2FycDsKKworICAgIHVzZSBUaWU6OlNjYWxhcjsKKyAgICB1c2UgYmFzZSAiVGllOjpTdGRTY2FsYXIiOworCisgICAgc3ViIFNUT1JFIHsKKyAgICAgICAgbXkgJHNlbGYgPSBzaGlmdCggQF8gKTsKKyAgICAgICAgY3JvYWsoICJNb2RpZnlpbmcgXCQiIC4gcmVmKCAkc2VsZiApIC4gIiBpcyBub3QgYWxsb3dlZDsgc3RvcHBlZCIgKTsKKyAgICB9OyAjIHN1YiBTVE9SRQorCit9ICMgcGFja2FnZSBQbGF0Zm9ybTo6YmFzZQorCit7IHBhY2thZ2UgUGxhdGZvcm06Omhvc3RfYXJjaDsKKyAgICB1c2UgYmFzZSAiUGxhdGZvcm06OmJhc2UiOworICAgIHN1YiBGRVRDSCB7CisgICAgICAgIHJldHVybiAkX2hvc3RfYXJjaDsKKyAgICB9OyAjIHN1YiBGRVRDSAorfSAjIHBhY2thZ2UgUGxhdGZvcm06Omhvc3RfYXJjaAorCit7IHBhY2thZ2UgUGxhdGZvcm06Omhvc3Rfb3M7CisgICAgdXNlIGJhc2UgIlBsYXRmb3JtOjpiYXNlIjsKKyAgICBzdWIgRkVUQ0ggeworICAgICAgICByZXR1cm4gJF9ob3N0X29zOworICAgIH07ICMgc3ViIEZFVENICit9ICMgcGFja2FnZSBQbGF0Zm9ybTo6aG9zdF9vcworCit7IHBhY2thZ2UgUGxhdGZvcm06Omhvc3RfcGxhdGZvcm07CisgICAgdXNlIGJhc2UgIlBsYXRmb3JtOjpiYXNlIjsKKyAgICBzdWIgRkVUQ0ggeworICAgICAgICByZXR1cm4gIiR7X2hvc3Rfb3N9XyR7X2hvc3RfYXJjaH0iOworICAgIH07ICMgc3ViIEZFVENICit9ICMgcGFja2FnZSBQbGF0Zm9ybTo6aG9zdF9wbGF0Zm9ybQorCit7IHBhY2thZ2UgUGxhdGZvcm06OnRhcmdldF9hcmNoOworICAgIHVzZSBiYXNlICJQbGF0Zm9ybTo6YmFzZSI7CisgICAgc3ViIEZFVENIIHsKKyAgICAgICAgcmV0dXJuICRfdGFyZ2V0X2FyY2g7CisgICAgfTsgIyBzdWIgRkVUQ0gKK30gIyBwYWNrYWdlIFBsYXRmb3JtOjp0YXJnZXRfYXJjaAorCit7IHBhY2thZ2UgUGxhdGZvcm06OnRhcmdldF9taWNfYXJjaDsKKyAgICB1c2UgYmFzZSAiUGxhdGZvcm06OmJhc2UiOworICAgIHN1YiBGRVRDSCB7CisgICAgICAgIHJldHVybiAkX3RhcmdldF9taWNfYXJjaDsKKyAgICB9OyAjIHN1YiBGRVRDSAorfSAjIHBhY2thZ2UgUGxhdGZvcm06OnRhcmdldF9taWNfYXJjaAorCit7IHBhY2thZ2UgUGxhdGZvcm06OnRhcmdldF9vczsKKyAgICB1c2UgYmFzZSAiUGxhdGZvcm06OmJhc2UiOworICAgIHN1YiBGRVRDSCB7CisgICAgICAgIHJldHVybiAkX3RhcmdldF9vczsKKyAgICB9OyAjIHN1YiBGRVRDSAorfSAjIHBhY2thZ2UgUGxhdGZvcm06OnRhcmdldF9vcworCit7IHBhY2thZ2UgUGxhdGZvcm06OnRhcmdldF9wbGF0Zm9ybTsKKyAgICB1c2UgYmFzZSAiUGxhdGZvcm06OmJhc2UiOworICAgIHN1YiBGRVRDSCB7CisgICAgICAgIGlmICgkX3RhcmdldF9hcmNoIGVxICJtaWMiKSB7CisgICAgICAgICAgICByZXR1cm4gIiR7X3RhcmdldF9vc31fJHtfdGFyZ2V0X21pY19hcmNofSI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAiJHtfdGFyZ2V0X29zfV8ke190YXJnZXRfYXJjaH0iOworICAgICAgICB9CisgICAgfTsgIyBzdWIgRkVUQ0gKK30gIyBwYWNrYWdlIFBsYXRmb3JtOjp0YXJnZXRfcGxhdGZvcm0KKworCityZXR1cm4gMTsKKworX19FTkRfXworCis9cG9kCisKKz1oZWFkMSBOQU1FCisKK0I8UGxhdGZvcm0ucG0+IC0tIEZldyBzdWJyb3V0aW5lcyB0byBnZXQgT1MsIGFyY2hpdGVjdHVyZSBhbmQgcGxhdGZvcm0gbmFtZSBpbiBmb3JtIHN1aXRhYmxlIGZvcgorbmFtaW5nIGZpbGVzLCBkaXJlY3RvcmllcywgbWFjcm9zLCBldGMuCisKKz1oZWFkMSBTWU5PUFNJUworCisgICAgdXNlIFBsYXRmb3JtICI6YWxsIjsKKyAgICB1c2UgdG9vbHM7CisKKyAgICBteSAkYXJjaCAgID0gY2Fub25fYXJjaCggImVtNjRUIiApOyAgICAgICAgIyBSZXR1cm5zICIzMmUiLgorICAgIG15ICRsZWdhbCAgPSBsZWdhbF9hcmNoKCAiZW02NHQiICk7ICAgICAgICAjIFJldHVybnMgIkludGVsKFIpIDY0Ii4KKyAgICBteSAkb3B0aW9uID0gYXJjaF9vcHQoICJlbTY0dCIgKTsgICAgICAgICAgIyBSZXR1cm5zICJpbnRlbDY0Ii4KKyAgICBteSAkb3MgICAgID0gY2Fub25fb3MoICJXaW5kb3dzIE5UIiApOyAgICAgIyBSZXR1cm5zICJ3aW4iLgorCisgICAgcHJpbnQoICRob3N0X2FyY2gsICRob3N0X29zLCAkaG9zdF9wbGF0Zm9ybSApOworICAgIHByaW50KCAkdGFyZWd0X2FyY2gsICR0YXJnZXRfb3MsICR0YXJnZXRfcGxhdGZvcm0gKTsKKworICAgIHRvb2xzOjpnZXRfb3B0aW9ucygKKyAgICAgICAgUGxhdGZvcm06OnRhcmdldF9vcHRpb25zKCksCisgICAgICAgIC4uLgorICAgICk7CisKKworPWhlYWQxIERFU0NSSVBUSU9OCisKK0Vudmlyb25tZW50IHZhcmlhYmxlIExJQk9NUF9PUyBzcGVjaWZpZXMgdGFyZ2V0IE9TIHRvIHJlcG9ydC4gSWYgTElCT01QX09TIGlkIG5vdCBkZWZpbmVkLAordGhlIHNjcmlwdCBhc3N1bWVzIGhvc3QgT1MgaXMgdGFyZ2V0IE9TLgorCitFbnZpcm9ubWVudCB2YXJpYWJsZSBMSUJPTVBfQVJDSCBzcGVjaWZpZXMgdGFyZ2V0IGFyY2hpdGVjdHVyZSB0byByZXBvcnQuIElmIExJQk9NUF9BUkNIIGlzIG5vdCBkZWZpbmVkLAordGhlIHNjcmlwdCBhc3N1bWVzIGhvc3QgYXJjaGl0ZWN0dXJlIGlzIHRhcmdldCBvbmUuCisKKz1oZWFkMiBGdW5jdGlvbnMuCisKKz1vdmVyCisKKz1pdGVtIEI8Y2Fub25fYXJjaCggJGFyY2ggKT4KKworSW5wdXQgc3RyaW5nIGlzIGFuIGFyY2hpdGVjdHVyZSBuYW1lIHRvIGNhbm9uaXplLiBUaGUgZnVuY3Rpb24gcmVjb2duaXplcyBtYW55IHZhcmlhbnRzLCBmb3IgZXhhbXBsZToKK0M8MzJlPiwgQzxJbnRlbDY0PiwgQzxJbnRlbChSKSA2ND4sIGV0Yy4gUmV0dXJuZWQgc3RyaW5nIGlzIGEgY2Fub25vbml6ZWQgYXJjaGl0ZWN0dXJlIG5hbWUsCitvbmUgb2Y6IEM8MzI+LCBDPDMyZT4sIEM8NjQ+LCBDPGFybT4sIEM8cHBjNjRsZT4sIEM8cHBjNjQ+LCBDPG1pYz4sIG9yIEM8dW5kZWY+IGlzIGlucHV0IHN0cmluZyBpcyBub3QgcmVjb2duaXplZC4KKworPWl0ZW0gQjxsZWdhbF9hcmNoKCAkYXJjaCApPgorCitJbnB1dCBzdHJpbmcgaXMgYXJjaGl0ZWN0dXJlIG5hbWUuIFRoZSBmdW5jdGlvbiByZWNvZ25pemVzIHRoZSBzYW1lIHZhcmlhbnRzIGFzIEM8YXJjaF9jYW5vbigpPiBkb2VzLgorUmV0dXJuZWQgc3RyaW5nIGlzIGEgbmFtZSBhcHByb3ZlZCBieSBJbnRlbCBMZWdhbCwgb25lIG9mOiBDPElBLTMyIGFyY2hpdGVjdHVyZT4sIEM8SW50ZWwoUikgNjQ+CitvciBDPHVuZGVmPiBpZiBpbnB1dCBzdHJpbmcgaXMgbm90IHJlY29nbml6ZWQuCisKKz1pdGVtIEI8YXJjaF9vcHQoICRhcmNoICk+CisKK0lucHV0IHN0cmluZyBpcyBhcmNoaXRlY3R1cmUgbmFtZS4gVGhlIGZ1bmN0aW9uIHJlY29nbml6ZXMgdGhlIHNhbWUgdmFyaWFudHMgYXMgQzxhcmNoX2Nhbm9uKCk+IGRvZXMuCitSZXR1cm5lZCBzdHJpbmcgaXMgYW4gYXJjaGl0ZWN0dXJlIG5hbWUgc3VpdGFibGUgZm9yIHBhc3NpbmcgdG8gY29tcGlsZXIgc2V0dXAgc2NyaXB0cworKGUuIGcuIEM8aWNjdmFycy5zaD4pLCBvbmUgb2Y6IEM8SUEtMzIgYXJjaGl0ZWN0dXJlPiwgQzxJbnRlbChSKSA2ND4gb3IgQzx1bmRlZj4gaWYgaW5wdXQgc3RyaW5nIGlzIG5vdAorcmVjb2duaXplZC4KKworPWl0ZW0gQjxjYW5vbl9vcyggJG9zICk+CisKK0lucHV0IHN0cmluZyBpcyBPUyBuYW1lIHRvIGNhbm9uaXplLiBUaGUgZnVuY3Rpb24gcmVjb2duaXplcyBtYW55IHZhcmlhbnRzLCBmb3IgZXhhbXBsZTogQzxtYWM+LCBDPE9TIFg+LCBldGMuIFJldHVybmVkIHN0cmluZyBpcyBhIGNhbm9uaXplZCBPUyBuYW1lLCBvbmUgb2Y6IEM8bGluPiwKK0M8bWFjPiwgQzx3aW4+LCBvciBDPHVuZGVmPiBpcyBpbnB1dCBzdHJpbmcgaXMgbm90IHJlY29nbml6ZWQuCisKKz1pdGVtIEI8dGFyZ2V0X29wdGlvbnMoKT4KKworUmV0dXJucyBhcnJheSBzdWl0YWJsZSBmb3IgcGFzc2luZyB0byBDPHRvb2xzOjpnZXRfb3B0aW9ucygpPiB0byBsZXQgYSBzY3JpcHQgcmVjb2duaXplCitDPC0tdGFyZ2V0LWFyY2hpdGVjdHVyZT1JPHN0cj4+IGFuZCBDPC0tdGFyZ2V0LW9zPUk8c3RyPj4gb3B0aW9ucy4gVHlwaWNhbCB1c2FnZSBpczoKKworICAgIHVzZSB0b29sczsKKyAgICB1c2UgUGxhdGZvcm07CisKKyAgICBteSAoICRvcywgJGFyY2gsICRwbGF0Zm9ybSApOyAgICAjIEdsb2JhbCB2YXJpYWJsZXMsIG5vdCBpbml0aWFsaXplZC4KKworICAgIC4uLgorCisgICAgZ2V0X29wdGlvbnMoCisgICAgICAgIFBsYXRmb3JtOjp0YXJnZXRfb3B0aW9ucygpLCAgIyBMZXQgc2NyaXB0IHJlY29nbml6ZSAtLXRhcmdldC1vcyBhbmQgLS10YXJnZXQtYXJjaCBvcHRpb25zLgorICAgICAgICAuLi4KKyAgICApOworICAgICMgSW5pdGlhbGl6ZSB2YXJpYWJscyBhZnRlciBwYXJzaW5nIGNvbW1hbmQgbGluZS4KKyAgICAoICRvcywgJGFyY2gsICRwbGF0Zm9ybSApID0gKCBQbGF0Zm9ybTo6dGFyZ2V0X29zKCksIFBsYXRmb3JtOjp0YXJnZXRfYXJjaCgpLCBQbGF0Zm9ybTo6dGFyZ2V0X3BsYXRmb3JtKCkgKTsKKworPWJhY2sKKworPWhlYWQyIFZhcmlhYmxlcworCis9aXRlbSBCPCRob3N0X2FyY2g+CisKK0Nhbm9uaXplZCBuYW1lIG9mIGhvc3QgYXJjaGl0ZWN0dXJlLgorCis9aXRlbSBCPCRob3N0X29zPgorCitDYW5vbml6ZWQgbmFtZSBvZiBob3N0IE9TLgorCis9aXRlbSBCPCRob3N0X3BsYXRmb3JtPgorCitIb3N0IHBsYXRmb3JtIG5hbWUgKGNvbmNhdGVuYXRlZCBjYW5vbml6ZWQgT1MgbmFtZSwgdW5kZXJzY29yZSwgYW5kIGNhbm9uaXplZCBhcmNoaXRlY3R1cmUgbmFtZSkuCisKKz1pdGVtIEI8JHRhcmdldF9hcmNoPgorCitDYW5vbml6ZWQgbmFtZSBvZiB0YXJnZXQgYXJjaGl0ZWN0dXJlLgorCis9aXRlbSBCPCR0YXJnZXRfb3M+CisKK0Nhbm9uaXplZCBuYW1lIG9mIHRhcmdldCBPUy4KKworPWl0ZW0gQjwkdGFyZ2V0X3BsYXRmb3JtPgorCitUYXJnZXQgcGxhdGZvcm0gbmFtZSAoY29uY2F0ZW5hdGVkIGNhbm9uaXplZCBPUyBuYW1lLCB1bmRlcnNjb3JlLCBhbmQgY2Fub25pemVkIGFyY2hpdGVjdHVyZSBuYW1lKS4KKworPWJhY2sKKworPWN1dAorCisjIGVuZCBvZiBmaWxlICMKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90b29scy9saWIvVW5hbWUucG0gYi9maW5hbC9ydW50aW1lL3Rvb2xzL2xpYi9VbmFtZS5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTUwNzBiCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90b29scy9saWIvVW5hbWUucG0KQEAgLTAsMCArMSw2MzUgQEAKKyMKKyMgVGhpcyBpcyBub3QgYSBydW5uYWJsZSBzY3JpcHQsIGl0IGlzIGEgUGVybCBtb2R1bGUsIGEgY29sbGVjdGlvbiBvZiB2YXJpYWJsZXMsIHN1YnJvdXRpbmVzLCBldGMuCisjIFRvIGdldCBoZWxwIGFib3V0IGV4cG9ydGVkIHZhcmlhYmxlcyBhbmQgc3Vicm91dGluZXMsIGV4ZWN1dGUgdGhlIGZvbGxvd2luZyBjb21tYW5kOgorIworIyAgICAgcGVybGRvYyBVbmFtZS5wbQorIworIyBvciBzZWUgUE9EIChQbGFpbiBPbGQgRG9jdW1lbnRhdGlvbikgZW1iZWRkZWQgdG8gdGhlIHNvdXJjZS4uLgorIworIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCitwYWNrYWdlIFVuYW1lOworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOwordXNlIHdhcm5pbmdzOjpyZWdpc3RlcjsKK3VzZSBFeHBvcnRlcjsKKwordXNlIFBPU0lYOwordXNlIEZpbGU6Okdsb2IgIjpnbG9iIjsKK3VzZSBOZXQ6OkRvbWFpbiBxd3t9OworCisjIEZvbGxvd2luZyBjb2RlIGRvZXMgbm90IHdvcmsgd2l0aCBQZXJsIDUuNiBvbiBMaW51eCogT1MgYW5kIFdpbmRvd3MqIE9TOgorIworIyAgICAgdXNlIGlmICReTyBlcSAiZGFyd2luIiwgdG9vbHMgPT4gcXd7fTsKKyMKKyMgVGhlIHdvcmthcm91bmQgZm9yIFBlcmwgNS42OgorIworQkVHSU4geworICAgIGlmICggJF5PIGVxICJkYXJ3aW4iIG9yICReTyBlcSAibGludXgiICkgeworCXJlcXVpcmUgdG9vbHM7CisgICAgICAgIGltcG9ydCB0b29sczsKKyAgICB9OyAjIGlmCisgICAgaWYgKCAkXk8gZXEgIk1TV2luMzIiICkgeworICAgICAgICByZXF1aXJlIFdpbjMyOworICAgIH07ICMgaWYKK307ICMgQkVHSU4KKworbXkgJG1zd2luID0gcXJ7XEEoPzpNU1dpbjMyfFdpbmRvd3NfTlQpXHp9OworCitteSBAcG9zaXggPSBxd3sga2VybmVsX25hbWUgZnFkbiBrZXJuZWxfcmVsZWFzZSBrZXJuZWxfdmVyc2lvbiBtYWNoaW5lIH07CisgICAgIyBQcm9wZXJ0aWVzIHN1cHBvcnRlZCBieSBQT1NJWDo6dW5hbWUoKS4KK215IEBsaW51eCA9CisgICAgcXd7IHByb2Nlc3NvciBoYXJkd2FyZV9wbGF0Zm9ybSBvcGVyYXRpbmdfc3lzdGVtIH07CisgICAgIyBQcm9wZXJ0aWVzIHJlcG9ydGVkIGJ5IHVuYW1lIGluIExpbnV4KiBPUy4KK215IEBiYXNlID0gKCBAcG9zaXgsIEBsaW51eCApOworICAgICMgQmFzZSBwcm9wZXJ0aWVzLgorbXkgQGF1eCA9CisgICAgKAorICAgICAgICBxd3sgaG9zdF9uYW1lIGRvbWFpbl9uYW1lIH0sCisgICAgICAgIG1hcCggIm9wZXJhdGluZ19zeXN0ZW1fJF8iLCBxd3sgbmFtZSByZWxlYXNlIGNvZGVuYW1lIGRlc2NyaXB0aW9uIH0gKQorICAgICk7CisgICAgIyBBdXhpbGlhcnkgcHJvcGVydGllcy4KK215IEBhbGwgPSAoIEBiYXNlLCBAYXV4ICk7CisgICAgIyBBbGwgdGhlIHByb3BlcnRpZXMuCitteSBAbWV0YSA9IHF3eyBiYXNlX25hbWVzIGFsbF9uYW1lcyB2YWx1ZSB9OworICAgICMgTWV0YSBmdW5jdGlvbnMuCisKK291ciAkVkVSU0lPTiAgICAgPSAiMC4wNyI7CitvdXIgQElTQSAgICAgICAgID0gcXd7IEV4cG9ydGVyIH07CitvdXIgQEVYUE9SVCAgICAgID0gcXd7fTsKK291ciBARVhQT1JUX09LICAgPSAoIEBhbGwsIEBtZXRhICk7CitvdXIgJUVYUE9SVF9UQUdTID0KKyAgICAoCisgICAgICAgIGJhc2UgPT4gWyBAYmFzZSBdLAorICAgICAgICBhbGwgID0+IFsgQGFsbCAgXSwKKyAgICAgICAgbWV0YSA9PiBbIEBtZXRhIF0sCisgICAgKTsKKworbXkgJXZhbHVlczsKKyAgICAjIEhhc2ggb2YgdmFsdWVzLiBTb21lIHZhbHVlcyBhcmUgc3RyaW5ncywgc29tZSBtYXkgYmUgcmVmZXJlbmNlcyB0byBjb2RlIHdoaWNoIHNob3VsZCBiZQorICAgICMgZXZhbHVhdGVkIHRvIGdldCByZWFsIHZhbHVlLiBUaGlzIHRyaWNrIGlzIGltcGxlbWVudGVkIGJlY2F1c2UgY2FsbCB0byBOZXQ6OkRvbWFpbjo6aG9zdGZxZG4oKQorICAgICMgaXMgcmVsYXRpdmVseSBzbG93LgorCisjIEdldCB2YWx1ZXMgZnJvbSBQT1NJWDo6dW5hbWUoKS4KK0B2YWx1ZXN7IEBwb3NpeCB9ID0gUE9TSVg6OnVuYW1lKCk7CisKKyMgT24gc29tZSBzeXN0ZW1zIFBPU0lYOjp1bmFtZSgpIHJldHVybnMgInNob3J0IiBub2RlIG5hbWUgKHdpdGhvdXQgZG9tYWluIG5hbWUpLiBUbyBiZSBjb25zaXN0ZW50CisjIG9uIGFsbCBzeXN0ZW1zLCB3ZSB3aWxsIGdldCBub2RlIG5hbWUgZnJvbSBhbHRlcm5hdGl2ZSBzb3VyY2UuCitpZiAoICReTyA9fiBtL2N5Z3dpbi9pICkgeworICAgICMgRnVuY3Rpb24gZnJvbSBOZXQ6OkRvbWFpbiBtb2R1bGUgd29ya3Mgd2VsbCwgYnV0IG9uIEN5Z3dpbiBpdCBwcmludHMgdG8KKyAgICAjIHN0ZGVyciAiZG9tYWlubmFtZTogbm90IGZvdW5kIi4gU28gd2Ugd2lsbCB1c2UgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBub3cuCisgICAgJHZhbHVlc3sgZnFkbiB9ID0gbGMoICRFTlZ7IENPTVBVVEVSTkFNRSB9IC4gIi4iIC4gJEVOVnsgVVNFUkROU0RPTUFJTiB9ICk7Cit9IGVsc2UgeworICAgICMgT24gc3lzdGVtcyBvdGhlciB0aGFuIEN5Z3dpbiwgbGV0IHVzIHVzZSBOZXQ6OkRvbWFpbjo6aG9zdGZxZG4oKSwgYnV0IGRvIGl0IG9ubHkgbm9kZSBuYW1lCisgICAgIyBpcyByZWFsbHkgcmVxdWVzdGVkLgorICAgICR2YWx1ZXN7IGZxZG4gfSA9CisgICAgICAgIHN1YiB7CisgICAgICAgICAgICBteSAkZnFkbiA9IE5ldDo6RG9tYWluOjpob3N0ZnFkbigpOyAjICJmcWRuIiBzdGFuZHMgZm9yICJmdWxseSBxdWFsaWZpZWQgZG9hbWFpbiBuYW1lIi4KKyAgICAgICAgICAgICMgT24gc29tZSBzeXN0ZW1zIFBPU0lYOjp1bmFtZSgpIGFuZCBOZXQ6OkRvbWFpbjo6aG9zdGZxZG4oKSByZXBvcnRzIGRpZmZlcmVudCBuYW1lcy4KKyAgICAgICAgICAgICMgTGV0IHVzIGlzc3VlIGEgd2FybmluZyBpZiB0aGV5IHNpZ25pZmljYW50bHkgZGlmZmVyZW50LiBOYW1lcyBhcmUgaW5zaWduaWZpY2FudGx5CisgICAgICAgICAgICAjIGRpZmZlcmVudCBpZiBQT1NJWDo6dW5hbWUoKSBtYXRjaGVzIHRoZSBiZWdpbm5pbmcgb2YgTmV0OjpEb21haW46Omhvc3RmcWRuKCkuCisgICAgICAgICAgICBpZiAoCisgICAgICAgICAgICAgICAgJGZxZG4gZXEgc3Vic3RyKCAkZnFkbiwgMCwgbGVuZ3RoKCAkZnFkbiApICkKKyAgICAgICAgICAgICAgICAmJgorICAgICAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKCAkZnFkbiApID09IGxlbmd0aCggJGZxZG4gKQorICAgICAgICAgICAgICAgICAgICB8fAorICAgICAgICAgICAgICAgICAgICBzdWJzdHIoICRmcWRuLCBsZW5ndGgoICRmcWRuICksIDEgKSBlcSAiLiIKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICAjIE9rLgorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB3YXJuaW5nczo6d2FybmlmKAorICAgICAgICAgICAgICAgICAgICAiUE9TSVg6OnVuYW1lKCkgYW5kIE5ldDo6RG9tYWluOjpob3N0ZnFkbigpIHJlcG9ydGVkIGRpZmZlcmVudCBuYW1lczogIiAuCisgICAgICAgICAgICAgICAgICAgICAgICAiXCIkdmFsdWVzeyBmcWRuIH1cIiBhbmQgXCIkZnFkblwiIHJlc3BlY3RpdmVseVxuIgorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICByZXR1cm4gJGZxZG47CisgICAgICAgIH07ICMgc3ViCit9OyAjIGlmCisKK2lmICggJF5PID1+ICRtc3dpbiApIHsKKyAgICBpZiAoCisgICAgICAgICR2YWx1ZXN7IG1hY2hpbmUgfSA9fiBte1xBKD86eDg2fFs1Nl04Nilcen0KKyAgICAgICAgYW5kCisgICAgICAgIGV4aXN0cyggJEVOVnsgUFJPQ0VTU09SX0FSQ0hJVEVDVFVSRSB9ICkgYW5kICRFTlZ7IFBST0NFU1NPUl9BUkNISVRFQ1RVUkUgfSBlcSAieDg2IgorICAgICAgICBhbmQKKyAgICAgICAgZXhpc3RzKCAkRU5WeyBQUk9DRVNTT1JfQVJDSElURVc2NDMyIH0gKQorICAgICkgeworICAgICAgICBpZiAoICRFTlZ7IFBST0NFU1NPUl9BUkNISVRFVzY0MzIgfSBlcSAiQU1ENjQiICkgeworICAgICAgICAgICAgJHZhbHVlc3sgbWFjaGluZSB9ID0gIng4Nl82NCI7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGlmCit9OyAjIGlmCisKKyMgU29tZSB2YWx1ZXMgYXJlIG5vdCByZXR1cm5lZCBieSBQT1NJWDo6dW5hbWUoKSwgbGV0IHVzIGNvbXB1dGUgdGhlbS4KKworIyBwcm9jZXNzb3IuCiskdmFsdWVzeyBwcm9jZXNzb3IgfSA9ICR2YWx1ZXN7IG1hY2hpbmUgfTsKKworIyBoYXJkd2FyZV9wbGF0Zm9ybS4KK2lmICggMCApIHsKK30gZWxzaWYgKCAkXk8gZXEgImxpbnV4IiBvciAkXk8gZXEgImZyZWVic2QiIG9yICReTyBlcSAibmV0YnNkIiApIHsKKyAgICBpZiAoIDAgKSB7CisgICAgfSBlbHNpZiAoICR2YWx1ZXN7IG1hY2hpbmUgfSA9fiBte1xBaVszNDU2XTg2XHp9ICkgeworICAgICAgICAkdmFsdWVzeyBoYXJkd2FyZV9wbGF0Zm9ybSB9ID0gImkzODYiOworICAgIH0gZWxzaWYgKCAkdmFsdWVzeyBtYWNoaW5lIH0gPX4gbXtcQSh4ODZfNjR8YW1kNjQpXHp9ICkgeworICAgICAgICAkdmFsdWVzeyBoYXJkd2FyZV9wbGF0Zm9ybSB9ID0gIng4Nl82NCI7CisgICAgfSBlbHNpZiAoICR2YWx1ZXN7IG1hY2hpbmUgfSA9fiBte1xBYXJtdjdcRCpcen0gKSB7CisgICAgICAgICR2YWx1ZXN7IGhhcmR3YXJlX3BsYXRmb3JtIH0gPSAiYXJtIjsKKyAgICB9IGVsc2lmICggJHZhbHVlc3sgbWFjaGluZSB9ID1+IG17XEFwcGM2NGxlXHp9ICkgeworICAgICAgICAkdmFsdWVzeyBoYXJkd2FyZV9wbGF0Zm9ybSB9ID0gInBwYzY0bGUiOworICAgIH0gZWxzaWYgKCAkdmFsdWVzeyBtYWNoaW5lIH0gPX4gbXtcQXBwYzY0XHp9ICkgeworICAgICAgICAkdmFsdWVzeyBoYXJkd2FyZV9wbGF0Zm9ybSB9ID0gInBwYzY0IjsKKyAgICB9IGVsc2lmICggJHZhbHVlc3sgbWFjaGluZSB9ID1+IG17XEFhYXJjaDY0XHp9ICkgeworICAgICAgICAkdmFsdWVzeyBoYXJkd2FyZV9wbGF0Zm9ybSB9ID0gImFhcmNoNjQiOworICAgIH0gZWxzZSB7CisgICAgICAgIGRpZSAiVW5zdXBwb3J0ZWQgbWFjaGluZSAoXCIkdmFsdWVzeyBtYWNoaW5lIH1cIikgcmV0dXJuZWQgYnkgUE9TSVg6OnVuYW1lKCk7IHN0b3BwZWQiOworICAgIH07ICMgaWYKK30gZWxzaWYgKCAkXk8gZXEgImRhcndpbiIgKSB7CisgICAgaWYgKCAwICkgeworICAgIH0gZWxzaWYgKCAkdmFsdWVzeyBtYWNoaW5lIH0gZXEgIng4NiIgb3IgJHZhbHVlc3sgbWFjaGluZSB9IGVxICJpMzg2IiApIHsKKyAgICAgICAgJHZhbHVlc3sgaGFyZHdhcmVfcGxhdGZvcm0gfSA9CisgICAgICAgICAgICBzdWIgeworICAgICAgICAgICAgICAgIG15ICRwbGF0Zm9ybSA9ICJpMzg2IjsKKyAgICAgICAgICAgICAgICAjIFNvbWUgT1NlcyBvbiBJbnRlbChSKSA2NCBzdGlsbCByZXBvcnRzICJpMzg2IiBtYWNoaW5lLiBWZXJpZnkgaXQgYnkgdXNpbmcKKyAgICAgICAgICAgICAgICAjIHRoZSB2YWx1ZSByZXR1cm5lZCBieSAnc3lzY3RsIC1uIGh3Lm9wdGlvbmFsLng4Nl82NCcuIE9uIEludGVsKFIpIDY0LWJpdCBzeXN0ZW1zIHRoZQorICAgICAgICAgICAgICAgICMgdmFsdWUgPT0gMTsgb24gMzItYml0IHN5c3RlbXMgdGhlICdody5vcHRpb25hbC54ODZfNjQnIHByb3BlcnR5IGVpdGhlciBkb2VzIG5vdCBleGlzdAorICAgICAgICAgICAgICAgICMgb3IgdGhlIHZhbHVlID09IDAuIFRoZSBwYXRoIHZhcmlhYmxlIGRvZXMgbm90IGNvbnRhaW4gYSBwYXRoIHRvIHN5c2N0bCB3aGVuCisgICAgICAgICAgICAgICAgIyBzdGFydGVkIGJ5IGNyb250YWIuCisgICAgICAgICAgICAgICAgbXkgJHN5c2N0bCA9ICggd2hpY2goICJzeXNjdGwiICkgb3IgIi91c3Ivc2Jpbi9zeXNjdGwiICk7CisgICAgICAgICAgICAgICAgbXkgJG91dHB1dDsKKyAgICAgICAgICAgICAgICBkZWJ1ZyggIkV4ZWN1dGluZyAkc3lzY3RsLi4uIiApOworICAgICAgICAgICAgICAgIGV4ZWN1dGUoIFsgJHN5c2N0bCwgIi1uIiwgImh3Lm9wdGlvbmFsLng4Nl82NCIgXSwgLXN0ZG91dCA9PiBcJG91dHB1dCwgLXN0ZGVyciA9PiB1bmRlZiApOworICAgICAgICAgICAgICAgIGNob21wKCAkb3V0cHV0ICk7CisgICAgICAgICAgICAgICAgaWYgKCAwICkgeworICAgICAgICAgICAgICAgIH0gZWxzaWYgKCAiJG91dHB1dCIgZXEgIiIgb3IgIiRvdXRwdXQiIGVxICIwIiApIHsKKyAgICAgICAgICAgICAgICAgICAgJHBsYXRmb3JtID0gImkzODYiOworICAgICAgICAgICAgICAgIH0gZWxzaWYgKCAiJG91dHB1dCIgZXEgIjEiICkgeworICAgICAgICAgICAgICAgICAgICAkcGxhdGZvcm0gPSAieDg2XzY0IjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkaWUgIlVuc3VwcG9ydGVkIHZhbHVlIChcIiRvdXRwdXRcIikgcmV0dXJuZWQgYnkgXCIkc3lzY3RsIC1uIGh3Lm9wdGlvbmFsLng4Nl82NFwiOyBzdG9wcGVkIjsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAgICAgcmV0dXJuICRwbGF0Zm9ybTsKKyAgICAgICAgICAgIH07ICMgc3ViIHsKKyAgICB9IGVsc2lmICggJHZhbHVlc3sgbWFjaGluZSB9IGVxICJ4ODZfNjQiICkgeworCSMgU29tZSBPUyBYKiB2ZXJzaW9ucyByZXBvcnQgIng4Nl82NCIuCisJJHZhbHVlc3sgaGFyZHdhcmVfcGxhdGZvcm0gfSA9ICJ4ODZfNjQiOworICAgIH0gZWxzZSB7CisgICAgICAgIGRpZSAiVW5zdXBwb3J0ZWQgbWFjaGluZSAoXCIkdmFsdWVzeyBtYWNoaW5lIH1cIikgcmV0dXJuZWQgYnkgUE9TSVg6OnVuYW1lKCk7IHN0b3BwZWQiOworICAgIH07ICMgaWYKK30gZWxzaWYgKCAkXk8gPX4gJG1zd2luICkgeworICAgIGlmICggMCApIHsKKyAgICB9IGVsc2lmICggJHZhbHVlc3sgbWFjaGluZSB9ID1+IG17XEEoPzp4ODZ8WzU2XTg2KVx6fSApIHsKKyAgICAgICAgJHZhbHVlc3sgaGFyZHdhcmVfcGxhdGZvcm0gfSA9ICJpMzg2IjsKKyAgICB9IGVsc2lmICggJHZhbHVlc3sgbWFjaGluZSB9IGVxICJ4ODZfNjQiIG9yICR2YWx1ZXN7IG1hY2hpbmUgfSBlcSAiYW1kNjQiICkgeworICAgICAgICAjIEFjdGl2ZVBlcmwgZm9yIElBLTMyIGFyY2hpdGVjdHVyZSByZXR1cm5zICJ4ODZfNjQiLCB3aGlsZSBBY3RpdmVQZXJsIGZvciBJbnRlbChSKSA2NCByZXR1cm5zICJhbWQ2NCIuCisgICAgICAgICR2YWx1ZXN7IGhhcmR3YXJlX3BsYXRmb3JtIH0gPSAieDg2XzY0IjsKKyAgICB9IGVsc2UgeworICAgICAgICBkaWUgIlVuc3VwcG9ydGVkIG1hY2hpbmUgKFwiJHZhbHVlc3sgbWFjaGluZSB9XCIpIHJldHVybmVkIGJ5IFBPU0lYOjp1bmFtZSgpOyBzdG9wcGVkIjsKKyAgICB9OyAjIGlmCit9IGVsc2lmICggJF5PIGVxICJjeWd3aW4iICkgeworICAgIGlmICggMCApIHsKKyAgICB9IGVsc2lmICggJHZhbHVlc3sgbWFjaGluZSB9ID1+IG17XEFpWzM0NTZdODZcen0gKSB7CisgICAgICAgICR2YWx1ZXN7IGhhcmR3YXJlX3BsYXRmb3JtIH0gPSAiaTM4NiI7CisgICAgfSBlbHNpZiAoICR2YWx1ZXN7IG1hY2hpbmUgfSBlcSAieDg2XzY0IiApIHsKKyAgICAgICAgJHZhbHVlc3sgaGFyZHdhcmVfcGxhdGZvcm0gfSA9ICJ4ODZfNjQiOworICAgIH0gZWxzZSB7CisgICAgICAgIGRpZSAiVW5zdXBwb3J0ZWQgbWFjaGluZSAoXCIkdmFsdWVzeyBtYWNoaW5lIH1cIikgcmV0dXJuZWQgYnkgUE9TSVg6OnVuYW1lKCk7IHN0b3BwZWQiOworICAgIH07ICMgaWYKK30gZWxzZSB7CisgICAgZGllICJVbnN1cHBvcnRlZCBPUyAoXCIkXk9cIik7IHN0b3BwZWQiOworfTsgIyBpZgorCisjIG9wZXJhdGluZ19zeXN0ZW0uCitpZiAoIDAgKSB7Cit9IGVsc2lmICggJHZhbHVlc3sga2VybmVsX25hbWUgfSBlcSAiTGludXgiICkgeworICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW0gfSA9ICJHTlUvTGludXgiOworICAgIG15ICRyZWxlYXNlOyAgICAjIE5hbWUgb2YgY2hvc2VuICIqLXJlbGVhc2UiIGZpbGUuCisgICAgbXkgJGJ1bGs7ICAgICAgICMgQ29udGVudCBvZiByZWxlYXNlIGZpbGUuCisgICAgIyBPbiBVYnVudHUsIGxzYi1yZWxlYXNlIGlzIHF1aXRlIGluZm9ybWF0aXZlLCBlLiBnLjoKKyAgICAjICAgICBESVNUUklCX0lEPVVidW50dQorICAgICMgICAgIERJU1RSSUJfUkVMRUFTRT05LjA0CisgICAgIyAgICAgRElTVFJJQl9DT0RFTkFNRT1qYXVudHkKKyAgICAjICAgICBESVNUUklCX0RFU0NSSVBUSU9OPSJVYnVudHUgOS4wNCIKKyAgICAjIFRyeSBsc2ItcmVsZWFzZSBmaXJzdC4gQnV0IG9uIHNvbWUgb2xkZXIgc3lzdGVtcyBsc2ItcmVsZWFzZSBpcyBub3QgaW5mb3JtYXRpdmUuCisgICAgIyBJdCBtYXkgY29udGFpbiBqdXN0IG9uZSBsaW5lOgorICAgICMgICAgIExTQl9WRVJTSU9OPSIxLjMiCisgICAgJHJlbGVhc2UgPSAiL2V0Yy9sc2ItcmVsZWFzZSI7CisgICAgaWYgKCAtZSAkcmVsZWFzZSApIHsKKyAgICAgICAgJGJ1bGsgPSByZWFkX2ZpbGUoICRyZWxlYXNlICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgJGJ1bGsgPSAiIjsKKyAgICB9OyAjIGlmCisgICAgaWYgKCAkYnVsayA9fiBte15ESVNUUklCX30gKSB7CisgICAgICAgICMgT2ssIHRoaXMgbHNiLXJlbGVhc2UgaXMgaW5mb3JtYXRpdmUuCisgICAgICAgICRidWxrID1+IG17XkRJU1RSSUJfSURccyo9XHMqKC4qPylccyokfW0KKyAgICAgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICIkcmVsZWFzZTogVGhlcmUgaXMgbm8gRElTVFJJQl9JRDoiLCAkYnVsaywgIihlb2YpIiApOworICAgICAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX25hbWUgfSA9ICQxOworICAgICAgICAkYnVsayA9fiBte15ESVNUUklCX1JFTEVBU0Vccyo9XHMqKC4qPylccyokfW0KKyAgICAgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICIkcmVsZWFzZTogVGhlcmUgaXMgbm8gRElTVFJJQl9SRUxFQVNFOiIsICRidWxrLCAiKGVvZikiICk7CisgICAgICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fcmVsZWFzZSB9ID0gJDE7CisgICAgICAgICRidWxrID1+IG17XkRJU1RSSUJfQ09ERU5BTUVccyo9XHMqKC4qPylccyokfW0KKyAgICAgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICIkcmVsZWFzZTogVGhlcmUgaXMgbm8gRElTVFJJQl9DT0RFTkFNRToiLCAkYnVsaywgIihlb2YpIiApOworICAgICAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX2NvZGVuYW1lIH0gPSAkMTsKKyAgICAgICAgJGJ1bGsgPX4gbXteRElTVFJJQl9ERVNDUklQVElPTlxzKj0iP1xzKiguKj8pIj9ccyokfW0KKyAgICAgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICIkcmVsZWFzZTogVGhlcmUgaXMgbm8gRElTVFJJQl9ERVNDUklQVElPTjoiLCAkYnVsaywgIihlb2YpIiApOworICAgICAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX2Rlc2NyaXB0aW9uIH0gPSAkMTsKKyAgICB9IGVsc2UgeworICAgICAgICAjIE9vcHMuIGxzYi1yZWxlYXNlIGlzIG1pc3NlZCBvciBub3QgaW5mb3JtYXRpdmUuIFRyeSBvdGhlciAqLXJlbGVhc2UgZmlsZXMuCisgICAgICAgICRyZWxlYXNlID0gIi9ldGMvc3lzdGVtLXJlbGVhc2UiOworICAgICAgICBpZiAoIG5vdCAtZSAkcmVsZWFzZSApIHsgICAgIyBVc2UgL2V0Yy9zeXN0ZW0tcmVsZWFzZSIgaWYgc3VjaCBmaWxlIGV4aXN0cy4KKyAgICAgICAgICAgICMgT3RoZXJ3aXNlIHRyeSBvdGhlciAiL2V0Yy8qLXJlbGVhc2UiIGZpbGVzLCBidXQgaWdub3JlICIvZXRjL2xzYi1yZWxlYXNlIi4KKyAgICAgICAgICAgIG15IEByZWxlYXNlcyA9IGdyZXAoICRfIG5lICIvZXRjL2xzYi1yZWxlYXNlIiwgYnNkX2dsb2IoICIvZXRjLyotcmVsZWFzZSIgKSApOworICAgICAgICAgICAgIyBPbiBzb21lIEZlZG9yYSBzeXN0ZW1zIHRoZXJlIGFyZSB0d28gZmlsZXM6IGZlZG9yYS1yZWxlYXNlIGFuZCByZWRoYXQtcmVsZWFzZQorICAgICAgICAgICAgIyB3aXRoIGlkZW50aWNhbCBjb250ZW50LiBJZiBmZWRvcmEtcmVsZWFzZSBwcmVzZW50LCBpZ25vcmUgcmVkamF0LXJlbGVhc2UuCisgICAgICAgICAgICBpZiAoIGdyZXAoICRfIGVxICIvZXRjL2ZlZG9yYS1yZWxlYXNlIiwgQHJlbGVhc2VzICkgKSB7CisgICAgICAgICAgICAgICAgQHJlbGVhc2VzID0gZ3JlcCggJF8gbmUgIi9ldGMvcmVkaGF0LXJlbGVhc2UiLCBAcmVsZWFzZXMgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgIGlmICggQHJlbGVhc2VzID09IDEgKSB7CisgICAgICAgICAgICAgICAgJHJlbGVhc2UgPSAkcmVsZWFzZXNbIDAgXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCBAcmVsZWFzZXMgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgIyBObyAqLXJlbGVhc2UgZmlsZXMgZm91bmQsIHRyeSBkZWJpYW5fdmVyc2lvbi4KKyAgICAgICAgICAgICAgICAgICAgJHJlbGVhc2UgPSAiL2V0Yy9kZWJpYW5fdmVyc2lvbiI7CisgICAgICAgICAgICAgICAgICAgIGlmICggbm90IC1lICRyZWxlYXNlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgJHJlbGVhc2UgPSB1bmRlZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoICJObyByZWxlYXNlIGZpbGVzIGZvdW5kIGluIFwiL2V0Yy9cIiBkaXJlY3RvcnkuIiApOworICAgICAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJHJlbGVhc2UgPSB1bmRlZjsKKyAgICAgICAgICAgICAgICAgICAgd2FybmluZyggIk1vcmUgdGhhbiBvbmUgcmVsZWFzZSBmaWxlcyBmb3VuZCBpbiBcIi9ldGMvXCIgZGlyZWN0b3J5OiIsIEByZWxlYXNlcyApOworICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBpZiAoIGRlZmluZWQoICRyZWxlYXNlICkgKSB7CisgICAgICAgICAgICAkYnVsayA9IHJlYWRfZmlsZSggJHJlbGVhc2UgKTsKKyAgICAgICAgICAgIGlmICggJHJlbGVhc2UgPX4gbXtzeXN0ZW18cmVkaGF0fGZlZG9yYX0gKSB7CisgICAgICAgICAgICAgICAgIyBSZWQgSGF0IG9yIEZlZG9yYS4gUGFyc2UgdGhlIGZpcnN0IGxpbmUgb2YgZmlsZS4KKyAgICAgICAgICAgICAgICAjIFR5cGljYWwgdmFsdWVzIG9mICotcmVsZWFzZSAob25lIG9mKToKKyAgICAgICAgICAgICAgICAjICAgICBSZWQgSGF0IEVudGVycHJpc2UgTGludXgqIE9TIFNlcnZlciByZWxlYXNlIDUuMiAoVGlrYW5nYSkKKyAgICAgICAgICAgICAgICAjICAgICBSZWQgSGF0IEVudGVycHJpc2UgTGludXgqIE9TIEFTIHJlbGVhc2UgMyAoVGFyb29uIFVwZGF0ZSA0KQorICAgICAgICAgICAgICAgICMgICAgIEZlZG9yYSByZWxlYXNlIDEwIChDYW1icmlkZ2UpCisgICAgICAgICAgICAgICAgJGJ1bGsgPX4gbXtcQSguKikkfW0KKyAgICAgICAgICAgICAgICAgICAgb3IgcnVudGltZV9lcnJvciggIiRyZWxlYXNlOiBDYW5ub3QgZmluZCB0aGUgZmlyc3QgbGluZToiLCAkYnVsaywgIihlb2YpIiApOworICAgICAgICAgICAgICAgIG15ICRmaXJzdF9saW5lID0gJDE7CisgICAgICAgICAgICAgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9kZXNjcmlwdGlvbiB9ID0gJGZpcnN0X2xpbmU7CisgICAgICAgICAgICAgICAgJGZpcnN0X2xpbmUgPX4gbXtcQSguKj8pXHMrcmVsZWFzZVxzKyguKj8pKD86XHMrXCgoLio/KSg/OlxzK1VwZGF0ZVxzKyguKj8pKT9cKSk/XHMqJH0KKyAgICAgICAgICAgICAgICAgICAgb3IgcnVudGltZV9lcnJvciggIiRyZWxlYXNlOjE6IENhbm5vdCBwYXJzZSBsaW5lOiIsICRmaXJzdF9saW5lICk7CisgICAgICAgICAgICAgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9uYW1lICAgIH0gID0gJDE7CisgICAgICAgICAgICAgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9yZWxlYXNlIH0gID0gJDIgLiAoIGRlZmluZWQoICQ0ICkgPyAiLiQ0IiA6ICIiICk7CisgICAgICAgICAgICAgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9jb2RlbmFtZSB9ID0gJDM7CisgICAgICAgICAgICB9IGVsc2lmICggJHJlbGVhc2UgPX4gbXtTdVNFfSApIHsKKyAgICAgICAgICAgICAgICAjIFR5cGljYWwgU3VTRS1yZWxlYXNlOgorICAgICAgICAgICAgICAgICMgICAgIFNVU0UgTGludXgqIE9TIEVudGVycHJpc2UgU2VydmVyIDEwICh4ODZfNjQpCisgICAgICAgICAgICAgICAgIyAgICAgVkVSU0lPTiA9IDEwCisgICAgICAgICAgICAgICAgIyAgICAgUEFUQ0hMRVZFTCA9IDIKKyAgICAgICAgICAgICAgICAkYnVsayA9fiBte1xBKC4qKSR9bQorICAgICAgICAgICAgICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiJHJlbGVhc2U6IENhbm5vdCBmaW5kIHRoZSBmaXJzdCBsaW5lOiIsICRidWxrLCAiKGVvZikiICk7CisgICAgICAgICAgICAgICAgbXkgJGZpcnN0X2xpbmUgPSAkMTsKKyAgICAgICAgICAgICAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX2Rlc2NyaXB0aW9uIH0gPSAkZmlyc3RfbGluZTsKKyAgICAgICAgICAgICAgICAkZmlyc3RfbGluZSA9fiBte14oLio/KVxzKihcZCspXHMqXCguKj9cKVxzKiR9CisgICAgICAgICAgICAgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICIkcmVsZWFzZToxOiBDYW5ub3QgcGFyc2UgbGluZToiLCAkZmlyc3RfbGluZSApOworICAgICAgICAgICAgICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fbmFtZSB9ID0gJDE7CisgICAgICAgICAgICAgICAgJGJ1bGsgPX4gbXteVkVSU0lPTlxzKj1ccyooLiopXHMqJH1tCisgICAgICAgICAgICAgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICIkcmVsZWFzZTogVGhlcmUgaXMgbm8gVkVSU0lPTjoiLCAkYnVsaywgIihlb2YpIiApOworICAgICAgICAgICAgICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fcmVsZWFzZSB9ID0gJDE7CisgICAgICAgICAgICAgICAgaWYgKCAkYnVsayA9fiBte15QQVRDSExFVkVMXHMqPVxzKiguKilccyokfW0gKSB7CisgICAgICAgICAgICAgICAgICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fcmVsZWFzZSB9IC49ICIuJDEiOworICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgIH0gZWxzaWYgKCAkcmVsZWFzZSA9fiBte2RlYmlhbl92ZXJzaW9ufSApIHsKKyAgICAgICAgICAgICAgICAjIERlYmlhbi4gVGhlIGZpbGUgZGViaWFuX3ZlcnNpb24gY29udGFpbnMganVzdCB2ZXJzaW9uIG51bWJlciwgbm90aGluZyBtb3JlOgorICAgICAgICAgICAgICAgICMgICAgIDQuMAorICAgICAgICAgICAgICAgIG15ICRuYW1lID0gIkRlYmlhbiI7CisgICAgICAgICAgICAgICAgJGJ1bGsgPX4gbXtcQSguKikkfW0KKyAgICAgICAgICAgICAgICAgICAgb3IgcnVudGltZV9lcnJvciggIiRyZWxlYXNlOiBDYW5ub3QgZmluZCB0aGUgZmlyc3QgbGluZToiLCAkYnVsaywgIihlb2YpIiApOworICAgICAgICAgICAgICAgIG15ICR2ZXJzaW9uID0gJDE7CisgICAgICAgICAgICAgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9uYW1lICAgICAgICB9ID0gJG5hbWU7CisgICAgICAgICAgICAgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9yZWxlYXNlICAgICB9ID0gJHZlcnNpb247CisgICAgICAgICAgICAgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9jb2RlbmFtZSAgICB9ID0gInVua25vd24iOworICAgICAgICAgICAgICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fZGVzY3JpcHRpb24gfSA9IHNwcmludGYoICIlcyAlcyIsICRuYW1lLCAkdmVyc2lvbiApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorICAgIGlmICggbm90IGRlZmluZWQoICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fbmFtZSB9ICkgKSB7CisgICAgICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fbmFtZSB9ID0gIkdOVS9MaW51eCI7CisgICAgfTsgIyBpZgorfSBlbHNpZiAoICR2YWx1ZXN7IGtlcm5lbF9uYW1lIH0gZXEgIkRhcndpbiIgKSB7CisgICAgbXkgJWNvZGVuYW1lcyA9ICgKKyAgICAgICAgMTAuNCA9PiAiVGlnZXIiLAorICAgICAgICAxMC41ID0+ICJMZW9wYXJkIiwKKyAgICAgICAgMTAuNiA9PiAiU25vdyBMZW9wYXJkIiwKKyAgICApOworICAgbXkgJGRhcndpbjsKKyAgIG15ICRnZXRfb3NfaW5mbyA9CisgICAgICAgc3ViIHsKKyAgICAgICAgICAgbXkgKCAkbmFtZSApID0gQF87CisgICAgICAgICAgIGlmICggbm90IGRlZmluZWQgJGRhcndpbiApIHsKKyAgICAgICAgICAgICAgICRkYXJ3aW4tPnsgb3BlcmF0aW5nX3N5c3RlbSB9ID0gIkRhcndpbiI7CisgICAgICAgICAgICAgICAjIHN3X3ZlcnMgcHJpbnRzIE9TIFgqIHZlcnNpb24gdG8gc3Rkb3V0OgorICAgICAgICAgICAgICAgIyAgICAgUHJvZHVjdE5hbWU6ICAgICAgIE9TIFgqCisgICAgICAgICAgICAgICAjICAgICBQcm9kdWN0VmVyc2lvbjogICAgMTAuNC4xMQorICAgICAgICAgICAgICAgIyAgICAgQnVpbGRWZXJzaW9uOiAgICAgIDhTMjE2NworICAgICAgICAgICAgICAgIyBJdCBkb2VzIG5vdCBwcmludCBjb2RlbmFtZSwgc28gd2UgY29kZSBPUyBYKiBjb2RlbmFtZXMgaGVyZS4KKyAgICAgICAgICAgICAgIG15ICRzd192ZXJzID0gd2hpY2goICJzd192ZXJzIiApIHx8ICIvdXNyL2Jpbi9zd192ZXJzIjsKKyAgICAgICAgICAgICAgIG15ICRvdXRwdXQ7CisgICAgICAgICAgICAgICBkZWJ1ZyggIkV4ZWN1dGluZyAkc3dfdmVycy4uLiIgKTsKKyAgICAgICAgICAgICAgIGV4ZWN1dGUoIFsgJHN3X3ZlcnMgXSwgLXN0ZG91dCA9PiBcJG91dHB1dCwgLXN0ZGVyciA9PiB1bmRlZiApOworICAgICAgICAgICAgICAgJG91dHB1dCA9fiBte15Qcm9kdWN0TmFtZTpccyooLiopXHMqJH1tCisgICAgICAgICAgICAgICAgICAgb3IgcnVudGltZV9lcnJvciggIlRoZXJlIGlzIG5vIFByb2R1Y3ROYW1lIGluIHN3X3ZlcnMgb3V0cHV0OiIsICRvdXRwdXQsICIoZW9mKSIgKTsKKyAgICAgICAgICAgICAgIG15ICRuYW1lID0gJDE7CisgICAgICAgICAgICAgICAkb3V0cHV0ID1+IG17XlByb2R1Y3RWZXJzaW9uOlxzKiguKilccyokfW0KKyAgICAgICAgICAgICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiVGhlcmUgaXMgbm8gUHJvZHVjdFZlcnNpb24gaW4gc3dfdmVycyBvdXRwdXQ6IiwgJG91dHB1dCwgIihlb2YpIiApOworICAgICAgICAgICAgICAgbXkgJHJlbGVhc2UgPSAkMTsKKyAgICAgICAgICAgICAgICMgU29tZXRpbWVzIHJlbGVhc2UgcmVwb3J0ZWQgYXMgIjEwLjQuMTEiICgzIGNvbXBvbmVudGVzKSwgc29tZXRpbWVzIGFzICIxMC42Ii4KKyAgICAgICAgICAgICAgICMgSGFuZGxlIGJvdGggdmFyaWFudHMuCisgICAgICAgICAgICAgICAkcmVsZWFzZSA9fiBte14oXGQrLlxkKykoPzpcLlxkKyk/KD89XHN8JCl9CisgICAgICAgICAgICAgICAgICAgb3IgcnVudGltZV9lcnJvciggIkNhbm5vdCBwYXJzZSBPUyBYKiB2ZXJzaW9uOiAkcmVsZWFzZSIgKTsKKyAgICAgICAgICAgICAgIG15ICR2ZXJzaW9uID0gJDE7CisgICAgICAgICAgICAgICBteSAkY29kZW5hbWUgPSAoICRjb2RlbmFtZXN7ICR2ZXJzaW9uIH0gb3IgInVua25vd24iICk7CisgICAgICAgICAgICAgICAkZGFyd2luLT57IG9wZXJhdGluZ19zeXN0ZW1fbmFtZSAgICAgICAgfSA9ICRuYW1lOworICAgICAgICAgICAgICAgJGRhcndpbi0+eyBvcGVyYXRpbmdfc3lzdGVtX3JlbGVhc2UgICAgIH0gPSAkcmVsZWFzZTsKKyAgICAgICAgICAgICAgICRkYXJ3aW4tPnsgb3BlcmF0aW5nX3N5c3RlbV9jb2RlbmFtZSAgICB9ID0gJGNvZGVuYW1lOworICAgICAgICAgICAgICAgJGRhcndpbi0+eyBvcGVyYXRpbmdfc3lzdGVtX2Rlc2NyaXB0aW9uIH0gPSBzcHJpbnRmKCAiJXMgJXMgKCVzKSIsICRuYW1lLCAkcmVsZWFzZSwgJGNvZGVuYW1lICk7CisgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgcmV0dXJuICRkYXJ3aW4tPnsgJG5hbWUgfTsKKyAgICAgICB9OyAjIHN1YgorICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW0gICAgICAgICAgICAgfSA9IHN1YiB7ICRnZXRfb3NfaW5mby0+KCAib3BlcmF0aW5nX3N5c3RlbSIgICAgICAgICAgICAgKTsgfTsKKyAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX25hbWUgICAgICAgIH0gPSBzdWIgeyAkZ2V0X29zX2luZm8tPiggIm9wZXJhdGluZ19zeXN0ZW1fbmFtZSIgICAgICAgICk7IH07CisgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9yZWxlYXNlICAgICB9ID0gc3ViIHsgJGdldF9vc19pbmZvLT4oICJvcGVyYXRpbmdfc3lzdGVtX3JlbGVhc2UiICAgICApOyB9OworICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fY29kZW5hbWUgICAgfSA9IHN1YiB7ICRnZXRfb3NfaW5mby0+KCAib3BlcmF0aW5nX3N5c3RlbV9jb2RlbmFtZSIgICAgKTsgfTsKKyAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX2Rlc2NyaXB0aW9uIH0gPSBzdWIgeyAkZ2V0X29zX2luZm8tPiggIm9wZXJhdGluZ19zeXN0ZW1fZGVzY3JpcHRpb24iICk7IH07Cit9IGVsc2lmICggJHZhbHVlc3sga2VybmVsX25hbWUgfSA9fiBte1xBV2luZG93c1sgX11OVFx6fSApIHsKKyAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtIH0gPSAiTVMgV2luZG93cyI7CisgICAgIyBteSBAb3NfbmFtZSA9IFdpbjMyOjpHZXRPU05hbWUoKTsKKyAgICAjICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fcmVsZWFzZSB9ID0gJG9zX25hbWVbIDAgXTsKKyAgICAjICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fdXBkYXRlICB9ID0gJG9zX25hbWVbIDEgXTsKK30gZWxzaWYgKCAkdmFsdWVzeyBrZXJuZWxfbmFtZSB9ID1+IG17XEFDWUdXSU5fTlQtfSApIHsKKyAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtIH0gPSAiTVMgV2luZG93cyI7Cit9IGVsc2lmICggJHZhbHVlc3sga2VybmVsX25hbWUgfSA9fiBte1xBRnJlZUJTRH0gKSB7CisgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbSB9ID0gIkZyZWVCU0QiOworfSBlbHNpZiAoICR2YWx1ZXN7IGtlcm5lbF9uYW1lIH0gPX4gbXtcQU5ldEJTRH0gKSB7CisgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbSB9ID0gIk5ldEJTRCI7Cit9IGVsc2UgeworICAgIGRpZSAiVW5zdXBwb3J0ZWQga2VybmVsX25hbWUgKFwiJHZhbHVlc3sga2VybmVsX25hbWUgfVwiKSByZXR1cm5lZCBieSBQT1NJWDo6dW5hbWUoKTsgc3RvcHBlZCI7Cit9OyAjIGlmCisKKyMgaG9zdF9uYW1lIGFuZCBkb21haW5fbmFtZQorJHZhbHVlc3sgaG9zdF9uYW1lIH0gPQorICAgIHN1YiB7CisgICAgICAgIG15ICRmcWRuID0gdmFsdWUoICJmcWRuIiApOworICAgICAgICAkZnFkbiA9fiBte1xBKFteLl0qKSg/OlwuKC4qKSk/XHp9OworICAgICAgICBteSAkaG9zdF9uYW1lID0gJDE7CisgICAgICAgIGlmICggbm90IGRlZmluZWQoICRob3N0X25hbWUgKSBvciAkaG9zdF9uYW1lIGVxICIiICkgeworICAgICAgICAgICAgZGllICJVbmV4cGVjdGVkIGVycm9yOiB1bmRlZmluZWQgb3IgZW1wdHkgaG9zdCBuYW1lOyBzdG9wcGVkIjsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICByZXR1cm4gJGhvc3RfbmFtZTsKKyAgICB9OworJHZhbHVlc3sgZG9tYWluX25hbWUgfSA9CisgICAgc3ViIHsKKyAgICAgICAgbXkgJGZxZG4gPSB2YWx1ZSggImZxZG4iICk7CisgICAgICAgICRmcWRuID1+IG17XEEoW14uXSopKD86XC4oLiopKT9cen07CisgICAgICAgIG15ICRkb21haW5fbmFtZSA9ICQyOworICAgICAgICBpZiAoIG5vdCBkZWZpbmVkKCAkZG9tYWluX25hbWUgKSBvciAkZG9tYWluX25hbWUgZXEgIiIgKSB7CisgICAgICAgICAgICBkaWUgIlVuZXhwZWN0ZWQgZXJyb3I6IHVuZGVmaW5lZCBvciBlbXB0eSBkb21haW4gbmFtZTsgc3RvcHBlZCI7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgcmV0dXJuICRkb21haW5fbmFtZTsKKyAgICB9OworCisjIFJlcGxhY2UgdW5kZWZpbmVkIHZhbHVlcyB3aXRoICJ1bmtub3duIi4KK2ZvcmVhY2ggbXkgJG5hbWUgKCBAYWxsICkgeworICAgIGlmICggbm90IGRlZmluZWQoICR2YWx1ZXN7ICRuYW1lIH0gKSApIHsKKyAgICAgICAgJHZhbHVlc3sgJG5hbWUgfSA9ICJ1bmtub3duIjsKKyAgICB9OyAjIGlmCit9OyAjIGZvcmVhY2ggJG5hbWUKKworIyBFeHBvcnQgZnVuY3Rpb25zIHJlcG9ydGluZyBwcm9wZXJ0aWVzLgorZm9yZWFjaCBteSAkbmFtZSAoIEBhbGwgKSB7CisgICAgbm8gc3RyaWN0ICJyZWZzIjsKKyAgICAqJG5hbWUgPSBzdWIgeyByZXR1cm4gdmFsdWUoICRuYW1lICk7IH07Cit9OyAjIGZvcmVhY2ggJG5hbWUKKworIyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYmFzZSBuYW1lcy4KK3N1YiBiYXNlX25hbWVzIHsKKyAgICByZXR1cm4gQGJhc2U7Cit9OyAjIHN1YiBiYXNlX25hbWVzCisKKyMgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFsbCB0aGUgbmFtZXMuCitzdWIgYWxsX25hbWVzIHsKKyAgICByZXR1cm4gQGFsbDsKK307ICMgc3ViIGFsbF9uYW1lcworCisjIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB2YWx1ZSBieSB0aGUgc3BlY2lmaWVkIG5hbWUuCitzdWIgdmFsdWUoJCkgeworICAgIG15ICRuYW1lID0gc2hpZnQoIEBfICk7CisgICAgaWYgKCByZWYoICR2YWx1ZXN7ICRuYW1lIH0gKSApIHsKKyAgICAgICAgbXkgJHZhbHVlID0gJHZhbHVlc3sgJG5hbWUgfS0+KCk7CisgICAgICAgICR2YWx1ZXN7ICRuYW1lIH0gPSAkdmFsdWU7CisgICAgfTsgIyBpZgorICAgIHJldHVybiAkdmFsdWVzeyAkbmFtZSB9OworfTsgIyBzdWIgdmFsdWUKKworcmV0dXJuIDE7CisKK19fRU5EX18KKworPXBvZAorCis9aGVhZDEgTkFNRQorCitCPFVuYW1lLnBtPiAtLSBBIGZldyBzdWJyb3V0aW5lcyB0byBnZXQgc3lzdGVtIGluZm9ybWF0aW9uIHVzdWFsbHkgcHJvdmlkZWQgYnkKK0M8L2Jpbi91bmFtZT4gYW5kIEM8UE9TSVg6OnVuYW1lKCk+LgorCis9aGVhZDEgU1lOT1BTSVMKKworICAgIHVzZSBVbmFtZTsKKworICAgICMgQmFzZSBwcm9wZXJ0eSBmdW5jdGlvbnMuCisgICAgJGtlcm5lbF9uYW1lICAgICAgID0gVW5hbWU6Omtlcm5lbF9uYW1lKCk7CisgICAgJGZxZG4gICAgICAgICAgICAgID0gVW5hbWU6OmZxZG4oKTsKKyAgICAka2VybmVsX3JlbGVhc2UgICAgPSBVbmFtZTo6a2VybmVsX3JlbGVhc2UoKTsKKyAgICAka2VybmVsX3ZlcnNpb24gICAgPSBVbmFtZTo6a2VybmVsX3ZlcnNpb24oKTsKKyAgICAkbWFjaGluZSAgICAgICAgICAgPSBVbmFtZTo6bWFjaGluZSgpOworICAgICRwcm9jZXNzb3IgICAgICAgICA9IFVuYW1lOjpwcm9jZXNzb3IoKTsKKyAgICAkaGFyZHdhcmVfcGxhdGZvcm0gPSBVbmFtZTo6aGFyZHdhcmVfcGxhdGZvcm0oKTsKKyAgICAkb3BlcmF0aW5nX3N5c3RlbSAgPSBVbmFtZTo6b3BlcmF0aW5nX3N5c3RlbSgpOworCisgICAgIyBBdXhpbGlhcnkgcHJvcGVydHkgZnVuY3Rpb25zLgorICAgICRob3N0X25hbWUgICAgICAgICA9IFVuYW1lOjpob3N0X25hbWUoKTsKKyAgICAkZG9tYWluX25hbWUgICAgICAgPSBVbmFtZTo6ZG9tYWluX25hbWUoKTsKKyAgICAkb3NfbmFtZSAgICAgICAgICAgPSBVbmFtZTo6b3BlcmF0aW5nX3N5c3RlbV9uYW1lKCk7CisgICAgJG9zX3JlbGVhc2UgICAgICAgID0gVW5hbWU6Om9wZXJhdGluZ19zeXN0ZW1fcmVsZWFzZSgpOworICAgICRvc19jb2RlbmFtZSAgICAgICA9IFVuYW1lOjpvcGVyYXRpbmdfc3lzdGVtX2NvZGVuYW1lKCk7CisgICAgJG9zX2Rlc2NyaXB0aW9uICAgID0gVW5hbWU6Om9wZXJhdGluZ19zeXN0ZW1fZGVzY3JpcHRpb24oKTsKKworICAgICMgTWV0YSBmdW5jdGlvbnMuCisgICAgQGJhc2VfbmFtZXMgID0gVW5hbWU6OmJhc2VfbmFtZXMoKTsKKyAgICBAYWxsX25hbWVzICAgPSBVbmFtZTo6YWxsX25hbWVzKCk7CisgICAgJGtlcm5lbF9uYW1lID0gVW5hbWU6OnZhbHVlKCAia2VybmVsX25hbWUiICk7CisKKz1oZWFkMSBERVNDUklQVElPTgorCitCPFVuYW1lLnBtPiByZXNlbWJsZXMgZnVuY3Rpb25hbGl0eSBmb3VuZCBpbiBDPFBPU0lYOjp1bmFtZSgpPiBmdW5jdGlvbiBvciBpbiBDPHVuYW1lPiBwcm9ncmFtLgorSG93ZXZlciwgYm90aCBDPFBPU0lYOjp1bmFtZSgpPiBhbmQgQzwvYmluL3VuYW1lPiBoYXZlIHNvbWUgZGlzYWR2YW50YWdlczoKKworPW92ZXIKKworPWl0ZW0gKgorCitDPHVuYW1lPiBtYXkgYmUgbm90IGF2YWlsYWJsZSBpbiBzb21lIGVudmlyb25tZW50cywgZm9yIGV4YW1wbGUsIGluIFdpbmRvd3MqIE9TCisoQzx1bmFtZT4gbWF5IGJlIGZvdW5kIGluIHNvbWUgdGhpcmQtcGFydHkgc29mdHdhcmUgcGFja2FnZXMsIGxpa2UgTUtTIFRvb2xraXQgb3IgQ3lnd2luLCBidXQgaXQgaXMKK25vdCBhIHBhcnQgb2YgT1MpLgorCis9aXRlbSAqCisKK1RoZXJlIGFyZSBtYW55IGRpZmZlcmVudCB2ZXJzaW9ucyBvZiBDPHVuYW1lPi4gRm9yIGV4YW1wbGUsIEM8dW5hbWU+IG9uIE9TIFgqIGRvZXMgbm90CityZWNvZ25pemUgb3B0aW9ucyBDPC1pPiwgQzwtbz4sIGFuZCBhbnkgbG9uZyBvcHRpb25zLgorCis9aXRlbSAqCisKK0RpZmZlcmVudCB2ZXJzaW9ucyBvZiBDPHVuYW1lPiBtYXkgcmVwb3J0IHRoZSBzYW1lIHByb3BlcnR5IGRpZmZlcmVudGx5LiBGb3IgZXhhbXBsZSwKK0M8dW5hbWU+IG9uIExpbnV4KiBPUyByZXBvcnRzIG1hY2hpbmUgYXMgQzxpNjg2Piwgd2hpbGUgQzx1bmFtZT4gb24gT1MgWCogcmVwb3J0cyB0aGUgc2FtZSBtYWNoaW5lIGFzCitDPHg4Nj4uCisKKz1pdGVtICoKKworQzxQT1NJWDo6dW5hbWUoKT4gcmV0dXJucyBsaXN0IG9mIHZhbHVlcy4gSSBjYW5ub3QgcmVjYWxsIHdoYXQgaXMgdGhlIGZvdXJ0aCBlbGVtZW50IG9mIHRoZSBsaXN0LgorCis9YmFjaworCis9aGVhZDIgQmFzZSBGdW5jdGlvbnMKKworQmFzZSBwcm9wZXJ0eSBmdW5jdGlvbnMgcHJvdmlkZSB0aGUgaW5mb3JtYXRpb24gYXMgQzx1bmFtZT4gcHJvZ3JhbS4KKworPW92ZXIKKworPWl0ZW0gQjxrZXJuZWxfbmFtZSgpPgorCitSZXR1cm5zIHRoZSBrZXJuZWwgbmFtZSwgYXMgcmVwb3J0ZWQgYnkgQzxQT1NJWDo6dW5hbWUoKT4uCisKKz1pdGVtIEI8ZnFkbigpPgorCitSZXR1cm5zIHRoZSBGUUROLCBmdWxseSBxdWFsaWZpZWQgZG9tYWluIG5hbWUuIE9uIHNvbWUgc3lzdGVtcyBDPFBPU0lYOjp1bmFtZSgpPiByZXBvcnRzIHNob3J0IG5vZGUKK25hbWUgKHdpdGggbm8gZG9tYWluIG5hbWUpLCBvbiBvdGhlcnMgQzxQT1NJWDo6dW5hbWUoKT4gcmVwb3J0cyBmdWxsIG5vZGUgbmFtZS4gVGhpcworZnVuY3Rpb24gc3RyaXZlIHRvIHJldHVybiBGUUROIGFsd2F5cyAoYnkgcmVmaW5pbmcgQzxQT1NJWDo6dW5hbWUoKT4gd2l0aAorQzxOZXQ6OkRvbWFpbjo6aG9zdGZxZG4oKT4pLgorCis9aXRlbSBCPGtlcm5lbF9yZWxlYXNlKCk+CisKK1JldHVybnMgdGhlIGtlcm5lbCByZWxlYXNlIHN0cmluZywgYXMgcmVwb3J0ZWQgYnkgQzxQT1NJWDo6dW5hbWUoKT4uIFVzdWFsbHkgdGhlIHN0cmluZyBjb25zaXN0cyBvZgorc2V2ZXJhbCBudW1iZXJzLCBzZXBhcmF0ZWQgYnkgZG90cyBhbmQgZGFzaGVzLCBidXQgbWF5IGFsc28gaW5jbHVkZSBzb21lIG5vbi1udW1lcmljIHN1YnN0cmluZ3MgbGlrZQorInNtcCIuCisKKz1pdGVtIEI8a2VybmVsX3ZlcnNpb24oKT4KKworUmV0dXJucyB0aGUga2VybmVsIHZlcnNpb24gc3RyaW5nLCBhcyByZXBvcnRlZCBieSBDPFBPU0lYOjp1bmFtZSgpPi4gSXQgaXMgQjxub3Q+IHNldmVyYWwKK2RvdC1zZXBhcmF0ZWQgbnVtYmVycyBidXQgbXVjaCBsb25nZXIgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGtlcm5lbC4KK0ZvciBleGFtcGxlLCBvbiBMaW51eCogT1MgaXQgaW5jbHVkZXMgYnVpbGQgZGF0ZS4KK0lmIHlvdSBsb29rIGZvciBzb21ldGhpbmcgaWRlbnRpZnlpbmcgdGhlIGtlcm5lbCwgbG9vayBhdCBMPGtlcm5lbF9yZWxlYXNlPi4KKworPWl0ZW0gQjxtYWNoaW5lKCk+CisKK1JldHVybnMgdGhlIG1hY2hpbmUgaGFyZHdhcmUgbmFtZSwgYXMgcmVwb3J0ZWQgYnkgUE9TSVg6OnVuYW1lKCkuIE5vdCByZWxpYWJsZS4gRGlmZmVyZW50IE9TZXMgbWF5CityZXBvcnQgdGhlIHNhbWUgbWFjaGluZSBoYXJkd2FyZSBuYW1lIGRpZmZlcmVudGx5LiBGb3IgZXhhbXBsZSwgTGludXgqIE9TIHJlcG9ydHMgQzxpNjg2Piwgd2hpbGUgT1MgWCoKK3JlcG9ydHMgQzx4ODY+IG9uIHRoZSBzYW1lIG1hY2hpbmUuCisKKz1pdGVtIEI8cHJvY2Vzc29yKCk+CisKK1JldHVybnMgdGhlIHByb2Nlc3NvciB0eXBlLiBOb3QgcmVsaWFibGUuIFVzdWFsbHkgdGhlIHNhbWUgYXMgQzxtYWNoaW5lPi4KKworPWl0ZW0gQjxoYXJkd2FyZV9wbGF0Zm9ybSgpPgorCitPbmUgb2Y6IEM8aTM4Nj4gb3IgQzx4ODZfNjQ+LgorCis9aXRlbSBCPG9wZXJhdGluZ19zeXN0ZW0oKT4KKworT25lIG9mOiBDPEdOVS9MaW51eD4sIEM8T1MgWCo+LCBvciBDPE1TIFdpbmRvd3M+LgorCis9YmFjaworCis9aGVhZDIgQXV4aWxpYXJ5IEZ1bmN0aW9ucworCitBdXhpbGlhcnkgZnVuY3Rpb25zIGV4dGVuZHMgYmFzZSBmdW5jdGlvbnMgd2l0aCBpbmZvcm1hdGlvbiBub3QgcmVwb3J0ZWQgYnkgQzx1bmFtZT4gcHJvZ3JhbS4KKworQXV4aWxpYXJ5IGZ1bmN0aW9ucyBjb2xsZWN0IGluZm9ybWF0aW9uIGZyb20gZGlmZmVyZW50IHNvdXJjZXMuIEZvciBleGFtcGxlLCBvbiBPUyBYKiwgdGhleSBtYXkKK2NhbGwgQzxzd192ZXJzPiBwcm9ncmFtIHRvIGZpbmQgb3V0IE9TIHJlbGVhc2U7IG9uIExpbnV4KiBPUyB0aGV5IG1heSBwYXJzZSBDPC9ldGMvcmVkaGF0LXJlbGVhc2U+IGZpbGUsCitldGMuCisKKz1vdmVyCisKKz1pdGVtIEI8aG9zdF9uYW1lKCk+CisKK1JldHVybnMgaG9zdCBuYW1lIChGUUROIHdpdGggZHJvcHBlZCBkb21haW4gcGFydCkuCisKKz1pdGVtIEI8ZG9tYWluX25hbWUoKT4KKworUmV0dXJucyBkb21haW4gbmFtZSAoRlFETiB3aXRoIGRyb3BwZWQgaG9zdCBwYXJ0KS4KKworPWl0ZW0gQjxvcGVyYXRpbmdfc3lzdGVtX25hbWU+CisKK05hbWUgb2Ygb3BlcmF0aW5nIHN5c3RlbSBvciBuYW1lIG9mIExpbnV4KiBPUyBkaXN0cmlidXRpb24sIGxpa2UgIkZlZG9yYSIgb3IKKyJSZWQgSGF0IEVudGVycHJpc2UgTGludXgqIE9TIFNlcnZlciIuCisKKz1pdGVtIEI8b3BlcmF0aW5nX3N5c3RlbV9yZWxlYXNlPgorCitSZWxlYXNlICh2ZXJzaW9uKSBvZiBvcGVyYXRpbmcgc3lzdGVtIG9yIExpbnV4KiBPUyBkaXN0cmlidXRpb24uIFVzdWFsbHkgaXQgaXMgYSBzZXJpZXMgb2YKK2RvdC1zZXBhcmF0ZWQgbnVtYmVycy4KKworPWl0ZW0gQjxvcGVyYXRpbmdfc3lzdGVtX2NvZGVuYW1lPgorCitDb2RlbmFtZSBvZiBvcGVyYXRpbmcgc3lzdGVtIHJlbGVhc2Ugb3IgTGludXgqIE9TIGRpc3RyaWJ1dGlvbi4gRm9yIGV4YW1wbGUsIEZlZG9yYSAxMCBpcyAiQ2FtYnJpZGdlIgord2hpbGUgT1MgWCogMTAuNCBpcyAiVGlnZXIiLgorCis9aXRlbSBCPG9wZXJhdGluZ19zeXN0ZW1fZGVzY3JpcHRpb24+CisKK0xvbmdlciBzdHJpbmcuIFVzdWFsbHkgaXQgaW5jbHVkZXMgYWxsIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHByb3BlcnRpbmcgbWVudGlvbmVkIGFib3ZlIC0tIG5hbWUsCityZWxlYXNlLCBjb2RlbmFtZSBpbiBwYXJlbnRoZXNlcy4KKworPWJhY2sKKworPWhlYWQyIE1ldGEgRnVuY3Rpb25zCisKKz1vdmVyCisKKz1pdGVtIEI8YmFzZV9uYW1lcygpPgorCitUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGxpc3Qgb2YgYmFzZSBwcm9wZXJ0eSBuYW1lcy4KKworPWl0ZW0gQjxhbGxfbmFtZXMoKT4KKworVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBsaXN0IG9mIGFsbCBwcm9wZXJ0eSBuYW1lcy4KKworPWl0ZW0gQjx2YWx1ZSg+IEk8bmFtZT4gQjwpPgorCitUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBzcGVjaWZpZWQgYnkgSTxuYW1lPi4KKworPWJhY2sKKworPWhlYWQxIEVYQU1QTEVTCisKKyAgICB1c2UgVW5hbWU7CisKKyAgICBwcmludCggVW5hbWU6OnN0cmluZygpLCAiXG4iICk7CisKKyAgICBmb3JlYWNoIG15ICRuYW1lICggVW5hbWU6OmFsbF9uYW1lcygpICkgeworICAgICAgICBwcmludCggIiRuYW1lPVwiIiAuIFVuYW1lOjp2YWx1ZSggJG5hbWUgKSAuICJcIlxuIiApOworICAgIH07ICMgZm9yZWFjaCAkbmFtZQorCis9aGVhZDEgU0VFIEFMU08KKworTDxQT1NJWDo6dW5hbWU+LCBMPHVuYW1lPi4KKworPWN1dAorCisjIGVuZCBvZiBmaWxlICMKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90b29scy9saWIvdG9vbHMucG0gYi9maW5hbC9ydW50aW1lL3Rvb2xzL2xpYi90b29scy5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTVjZjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90b29scy9saWIvdG9vbHMucG0KQEAgLTAsMCArMSwxOTgxIEBACisjCisjIFRoaXMgaXMgbm90IGEgcnVubmFibGUgc2NyaXB0LCBpdCBpcyBhIFBlcmwgbW9kdWxlLCBhIGNvbGxlY3Rpb24gb2YgdmFyaWFibGVzLCBzdWJyb3V0aW5lcywgZXRjLgorIyB0byBiZSB1c2VkIGluIG90aGVyIHNjcmlwdHMuCisjCisjIFRvIGdldCBoZWxwIGFib3V0IGV4cG9ydGVkIHZhcmlhYmxlcyBhbmQgc3Vicm91dGluZXMsIHBsZWFzZSBleGVjdXRlIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKKyMKKyMgICAgIHBlcmxkb2MgdG9vbHMucG0KKyMKKyMgb3Igc2VlIFBPRCAoUGxhaW4gT2xkIERvY3VtZW50YXRpb24pIGltYmVkZGVkIHRvIHRoZSBzb3VyY2UuLi4KKyMKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworPWhlYWQxIE5BTUUKKworQjx0b29scy5wbT4gLS0gQSBjb2xsZWN0aW9uIG9mIHN1YnJvdXRpbmVzIHdoaWNoIGFyZSB3aWRlbHkgdXNlZCBpbiBQZXJsIHNjcmlwdHMuCisKKz1oZWFkMSBTWU5PUFNJUworCisgICAgdXNlIEZpbmRCaW47CisgICAgdXNlIGxpYiAiJEZpbmRCaW46OkJpbi9saWIiOworICAgIHVzZSB0b29sczsKKworPWhlYWQxIERFU0NSSVBUSU9OCisKK0I8Tm90ZTo+IEJlY2F1c2UgdGhpcyBjb2xsZWN0aW9uIGlzIHNtYWxsIGFuZCBpbnRlbmRlZCBmb3Igd2lkZWx5IHVzaW5nIGluIHBhcnRpY3VsYXIgcHJvamVjdCwKK2FsbCB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9ucyBhcmUgZXhwb3J0ZWQgYnkgZGVmYXVsdC4KKworQjxOb3RlOj4gSSBoYXZlIHNvbWUgaWRlYXMgaG93IHRvIGltcHJvdmUgdGhpcyBjb2xsZWN0aW9uLCBidXQgaXQgaXMgaW4gbXkgbG9uZy10ZXJtIHBsYW5zLgorQ3VycmVudCBzaGFwZSBpcyBub3QgaWRlYWwsIGJ1dCBnb29kIGVub3VnaCB0byB1c2UuCisKKz1jdXQKKworcGFja2FnZSB0b29sczsKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIHZhcnMgcXcoIEBJU0EgQEVYUE9SVCBARVhQT1JUX09LICVFWFBPUlRfVEFHUyApOworcmVxdWlyZSBFeHBvcnRlcjsKK0BJU0EgPSBxdyggRXhwb3J0ZXIgKTsKKworbXkgQHZhcnMgICA9IHF3KCAkdG9vbCApOworbXkgQHV0aWxzICA9IHF3KCBjaGVja19vcHRzIHZhbGlkYXRlICk7CitteSBAb3B0cyAgID0gcXcoIGdldF9vcHRpb25zICk7CitteSBAcHJpbnQgID0gcXcoIGRlYnVnIGluZm8gd2FybmluZyBjbWRsaW5lX2Vycm9yIHJ1bnRpbWVfZXJyb3IgcXVlc3Rpb24gKTsKK215IEBuYW1lICAgPSBxdyggZ2V0X3ZvbCBnZXRfZGlyIGdldF9maWxlIGdldF9uYW1lIGdldF9leHQgY2F0X2ZpbGUgY2F0X2RpciApOworbXkgQGZpbGUgICA9IHF3KCB3aGljaCBhYnNfcGF0aCByZWxfcGF0aCByZWFsX3BhdGggbWFrZV9kaXIgY2xlYW5fZGlyIGNvcHlfZGlyIG1vdmVfZGlyIGRlbF9kaXIgY2hhbmdlX2RpciBjb3B5X2ZpbGUgbW92ZV9maWxlIGRlbF9maWxlICk7CitteSBAaW8gICAgID0gcXcoIHJlYWRfZmlsZSB3cml0ZV9maWxlICk7CitteSBAZXhlYyAgID0gcXcoIGV4ZWN1dGUgYmFja3RpY2tzICk7CitteSBAc3RyaW5nID0gcXd7IHBhZCB9OworQEVYUE9SVCA9ICggQHV0aWxzLCBAb3B0cywgQHZhcnMsIEBwcmludCwgQG5hbWUsIEBmaWxlLCBAaW8sIEBleGVjLCBAc3RyaW5nICk7CisKK3VzZSBVTklWRVJTQUwgICAgKCk7CisKK3VzZSBGaW5kQmluOwordXNlIElPOjpIYW5kbGU7Cit1c2UgSU86OkZpbGU7Cit1c2UgSU86OkRpcjsKKyMgTm90IGF2YWlsYWJsZSBvbiBzb21lIG1hY2hpbmVzOiB1c2UgSU86OlpsaWI7CisKK3VzZSBHZXRvcHQ6OkxvbmcgKCk7Cit1c2UgUG9kOjpVc2FnZSAgICgpOwordXNlIENhcnAgICAgICAgICAoKTsKK3VzZSBGaWxlOjpDb3B5ICAgKCk7Cit1c2UgRmlsZTo6UGF0aCAgICgpOwordXNlIEZpbGU6OlRlbXAgICAoKTsKK3VzZSBGaWxlOjpTcGVjICAgKCk7Cit1c2UgUE9TSVggICAgICAgIHF3eyA6ZmNudGxfaCA6ZXJybm9faCB9OwordXNlIEN3ZCAgICAgICAgICAoKTsKK3VzZSBTeW1ib2wgICAgICAgKCk7CisKK3VzZSBEYXRhOjpEdW1wZXI7CisKK3VzZSB2YXJzIHF3KCAkdG9vbCAkdmVyYm9zZSAkdGltZXN0YW1wcyApOworJHRvb2wgPSAkRmluZEJpbjo6U2NyaXB0OworCitteSBAd2FybmluZyA9ICggc3ViIHt9LCBcJndhcm5pbmcsIFwmcnVudGltZV9lcnJvciApOworCisKK3N1YiBjaGVja19vcHRzKFwlJDskKSB7CisKKyAgICBteSAkb3B0cyA9IHNoaWZ0KCBAXyApOyAgIyBSZWZlcmVuc2UgdG8gaGFzaCBjb250YWluaW5nIHJlYWwgb3B0aW9ucyBhbmQgdGhlaXIgdmFsdWVzLgorICAgIG15ICRnb29kID0gc2hpZnQoIEBfICk7ICAjIFJlZmVyZW5jZSB0byBhbiBhcnJheSBjb250YWluaW5nIGFsbCBrbm93biBvcHRpb24gbmFtZXMuCisgICAgbXkgJG1zZyAgPSBzaGlmdCggQF8gKTsgICMgT3B0aW9uYWwgKG5vbi1tYW5kYXRvcnkpIG1lc3NhZ2UuCisKKyAgICBpZiAoIG5vdCBkZWZpbmVkKCAkbXNnICkgKSB7CisgICAgICAgICRtc2cgPSAidW5rbm93biBvcHRpb24ocykgcGFzc2VkIjsgICAjIERlZmF1bHQgdmFsdWUgZm9yICRtc2cuCisgICAgfTsgIyBpZgorCisgICAgIyBJJ2xsIHVzZSB0aGVzZSBoYXNoZXMgYXMgc2V0cyBvZiBvcHRpb25zLgorICAgIG15ICVnb29kID0gbWFwKCAoICRfID0+IDEgKSwgQCRnb29kICk7ICAgIyAlZ29vZCBub3cgaXMgZmlsbGVkIHdpdGggYWxsIGtub3duIG9wdGlvbnMuCisgICAgbXkgJWJhZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICViYWQgaXMgZW1wdHkuCisKKyAgICBmb3JlYWNoIG15ICRvcHQgKCBrZXlzKCAlJG9wdHMgKSApIHsgICAgICMgRm9yIGVhY2ggcmVhbCBvcHRpb24uLi4KKyAgICAgICAgaWYgKCBub3QgZXhpc3RzKCAkZ29vZHsgJG9wdCB9ICkgKSB7ICMgTG9vayBpdHMgbmFtZSBpbiB0aGUgc2V0IG9mIGtub3duIG9wdGlvbnMuLi4KKyAgICAgICAgICAgICRiYWR7ICRvcHQgfSA9IDE7ICAgICAgICAgICAgICAgICMgQWRkIHVua25vd24gb3B0aW9uIHRvICViYWQgc2V0LgorICAgICAgICAgICAgZGVsZXRlKCAkb3B0cy0+eyAkb3B0IH0gKTsgICAgICAgIyBBbmQgZGVsZXRlIG9yaWdpbmFsIG9wdGlvbi4KKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgZm9yZWFjaCAkb3B0CisgICAgaWYgKCAlYmFkICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIElmICViYWQgc2V0IGlzIG5vdCBlbXB0eS4uLgorICAgICAgICBteSBAY2FsbGVyID0gY2FsbGVyKCAxICk7ICAgICAgICAgICAgIyBJc3N1ZSBhIHdhcm5pbmcuCisgICAgICAgIGxvY2FsICRDYXJwOjpDYXJwTGV2ZWwgPSAyOworICAgICAgICBDYXJwOjpjbHVjayggJGNhbGxlclsgMyBdIC4gIjogIiAuICRtc2cgLiAiOiAiIC4gam9pbiggIiwgIiwgc29ydCgga2V5cyggJWJhZCApICkgKSApOworICAgIH07ICMgaWYKKworICAgIHJldHVybiAxOworCit9OyAjIHN1YiBjaGVja19vcHRzCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBQdXJwb3NlOgorIyAgICAgQ2hlY2sgc3Vicm91dGluZSBhcmd1bWVudHMuCisjIFN5bm9wc2lzOgorIyAgICAgbXkgJW9wdHMgPSB2YWxpZGF0ZSggcGFyYW1zID0+IFxAXywgc3BlYyA9PiB7IC4uLiB9LCBjYWxsZXIgPT4gbiApOworIyBBcmd1bWVudHM6CisjICAgICBwYXJhbXMgLS0gQSByZWZlcmVuY2UgdG8gc3Vicm91dGluZSdzIGFjdHVhbCBhcmd1bWVudHMuCisjICAgICBzcGVjICAgLS0gU3BlY2lmaWNhdGlvbiBvZiBleHBlY3RlZCBhcmd1bWVudHMuCisjICAgICBjYWxsZXIgLS0gLi4uCisjIFJldHVybiB2YWx1ZToKKyMgICAgIEEgaGFzaCBvZiB2YWxpZGF0ZWQgb3B0aW9ucy4KKyMgRGVzY3JpcHRpb246CisjICAgICBJIHdvdWxkIGxpa2UgdG8gdXNlIFBhcmFtczo6VmFsaWRhdGUgbW9kdWxlLCBidXQgaXQgaXMgbm90IGEgcGFydCBvZiBkZWZhdWx0IFBlcmwKKyMgICAgIGRpc3RyaWJ1dGlvbiwgc28gSSBjYW5ub3QgcmVseSBvbiBpdC4gVGhpcyBzdWJyb3V0aW5lIHJlc2VtYmxlcyB0byBzb21lIGV4dGVudCB0bworIyAgICAgUGFyYW1zOjpWYWxpZGF0ZTo6dmFsaWRhdGVfd2l0aCgpLgorIyAgICAgU3BlY2lmaWNhdGlvbiBvZiBleHBlY3RlZCBhcmd1bWVudHM6CisjICAgICAgICB7ICRvcHQgPT4geyB0eXBlID0+ICR0eXBlLCBkZWZhdWx0ID0+ICRkZWZhdWx0IH0sIC4uLiB9CisjICAgICAgICAkb3B0ICAgICAtLSBTdHJpbmcsIG9wdGlvbiBuYW1lLgorIyAgICAgICAgJHR5cGUgICAgLS0gU3RyaW5nLCBleHBlY3RlZCB0eXBlKHMpLiBBbGxvd2VkIHZhbHVlcyBhcmUgIlNDQUxBUiIsICJVTkRFRiIsICJCT09MRUFOIiwKKyMgICAgICAgICAgICAgICAgICAgICJBUlJBWVJFRiIsICJIQVNIUkVGIiwgIkNPREVSRUYiLiBNdWx0aXBsZSB0eXBlcyBtYXkgbGlzdGVkIHVzaW5nIGJhcjoKKyMgICAgICAgICAgICAgICAgICAgICJTQ0FMQVJ8QVJSQVlSRUYiLiBUaGUgdHlwZSBzdHJpbmcgaXMgY2FzZS1pbnNlbnNpdGl2ZS4KKyMgICAgICAgICRkZWZhdWx0IC0tIERlZmF1bHQgdmFsdWUgZm9yIGFuIG9wdGlvbi4gV2lsbCBiZSB1c2VkIGlmIG9wdGlvbiBpcyBub3Qgc3BlY2lmaWVkIG9yCisjICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWQuCisjCitzdWIgdmFsaWRhdGUoQCkgeworCisgICAgbXkgJW9wdHMgPSBAXzsgICAgIyBUZW1wb3JhcnkgdXNlICVvcHRzIGZvciBwYXJhbWV0ZXJzIG9mIGB2YWxpZGF0ZScgc3Vicm91dGluZS4KKyAgICBteSAkcGFyYW1zID0gJG9wdHN7IHBhcmFtcyB9OworICAgIG15ICRjYWxsZXIgPSAoICRvcHRzeyBjYWxsZXIgfSBvciAwICkgKyAxOworICAgIG15ICRzcGVjICAgPSAkb3B0c3sgc3BlYyB9OworICAgIHVuZGVmKCAlb3B0cyApOyAgICMgT2ssIENsZWFuICVvcHRzLCBub3cgd2Ugd2lsbCBjb2xsZWN0IHJlc3VsdCBvZiB0aGUgc3Vicm91dGluZS4KKworICAgICMgRmluZCBvdXQgY2FsbGVyIHBhY2thZ2UsIGZpbGVuYW1lLCBsaW5lLCBhbmQgc3Vicm91dGluZSBuYW1lLgorICAgIG15ICggJHBrZywgJGZpbGUsICRsaW5lLCAkc3ViciApID0gY2FsbGVyKCAkY2FsbGVyICk7CisgICAgbXkgQGVycm9yczsgICAgIyBXZSB3aWxsIGNvbGxlY3QgZXJyb3JzIGluIGFycmF5IG5vdCB0byBzdG9wIG9uIHRoZSBmaXJzdCBmb3VuZCBlcnJvci4KKyAgICBteSAkZXJyb3IgPQorICAgICAgICBzdWIgKCQpIHsKKyAgICAgICAgICAgIG15ICRtc2cgPSBzaGlmdCggQF8gKTsKKyAgICAgICAgICAgIHB1c2goIEBlcnJvcnMsICIkbXNnIGF0ICRmaWxlIGxpbmUgJGxpbmUuXG4iICk7CisgICAgICAgIH07ICMgc3ViCisKKyAgICAjIENoZWNrIG9wdGlvbnMuCisgICAgd2hpbGUgKCBAJHBhcmFtcyApIHsKKyAgICAgICAgIyBDaGVjayBvcHRpb24gbmFtZS4KKyAgICAgICAgbXkgJG9wdCA9IHNoaWZ0KCBAJHBhcmFtcyApOworICAgICAgICBpZiAoIG5vdCBleGlzdHMoICRzcGVjLT57ICRvcHQgfSApICkgeworICAgICAgICAgICAgJGVycm9yLT4oICJJbnZhbGlkIG9wdGlvbiBgJG9wdCciICk7CisgICAgICAgICAgICBzaGlmdCggQCRwYXJhbXMgKTsgIyBTa2lwIHZhbHVlIG9mIHVua25vdyBvcHRpb24uCisgICAgICAgICAgICBuZXh0OworICAgICAgICB9OyAjIGlmCisgICAgICAgICMgQ2hlY2sgb3B0aW9uIHZhbHVlIGV4aXN0cy4KKyAgICAgICAgaWYgKCBub3QgQCRwYXJhbXMgKSB7CisgICAgICAgICAgICAkZXJyb3ItPiggIk9wdGlvbiBgJG9wdCcgZG9lcyBub3QgaGF2ZSBhIHZhbHVlIiApOworICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBteSAkdmFsID0gc2hpZnQoIEAkcGFyYW1zICk7CisgICAgICAgICMgQ2hlY2sgb3B0aW9uIHZhbHVlIHR5cGUuCisgICAgICAgIGlmICggZXhpc3RzKCAkc3BlYy0+eyAkb3B0IH0tPnsgdHlwZSB9ICkgKSB7CisgICAgICAgICAgICAjIFR5cGUgc3BlY2lmaWNhdGlvbiBleGlzdHMuIENoZWNrIG9wdGlvbiB2YWx1ZSB0eXBlLgorICAgICAgICAgICAgbXkgJGFjdHVhbF90eXBlOworICAgICAgICAgICAgaWYgKCByZWYoICR2YWwgKSBuZSAiIiApIHsKKyAgICAgICAgICAgICAgICAkYWN0dWFsX3R5cGUgPSByZWYoICR2YWwgKSAuICJSRUYiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAkYWN0dWFsX3R5cGUgPSAoIGRlZmluZWQoICR2YWwgKSA/ICJTQ0FMQVIiIDogIlVOREVGIiApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgbXkgQHdhbnRlZF90eXBlcyA9IHNwbGl0KCBte1x8fSwgbGMoICRzcGVjLT57ICRvcHQgfS0+eyB0eXBlIH0gKSApOworICAgICAgICAgICAgbXkgJHdhbnRlZF90eXBlcyA9IGpvaW4oICJ8IiwgbWFwKCAkXyBlcSAiYm9vbGVhbiIgPyAic2NhbGFyfHVuZGVmIiA6IHF1b3RlbWV0YSggJF8gKSwgQHdhbnRlZF90eXBlcyApICk7CisgICAgICAgICAgICBpZiAoICRhY3R1YWxfdHlwZSAhfiBte1xBKD86JHdhbnRlZF90eXBlcylcen1pICkgeworICAgICAgICAgICAgICAgICRhY3R1YWxfdHlwZSA9IGxjKCAkYWN0dWFsX3R5cGUgKTsKKyAgICAgICAgICAgICAgICAkd2FudGVkX3R5cGVzID0gbGMoIGpvaW4oICIgb3IgIiwgbWFwKCAiYCRfJyIsIEB3YW50ZWRfdHlwZXMgKSApICk7CisgICAgICAgICAgICAgICAgJGVycm9yLT4oICJPcHRpb24gYCRvcHQnIHZhbHVlIHR5cGUgaXMgYCRhY3R1YWxfdHlwZScgYnV0IGV4cGVjdGVkIHRvIGJlICR3YW50ZWRfdHlwZXMiICk7CisgICAgICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBpZiAoIGV4aXN0cyggJHNwZWMtPnsgJG9wdCB9LT57IHZhbHVlcyB9ICkgICkgeworICAgICAgICAgICAgbXkgJHZhbHVlcyA9ICRzcGVjLT57ICRvcHQgfS0+eyB2YWx1ZXMgfTsKKyAgICAgICAgICAgIGlmICggbm90IGdyZXAoICRfIGVxICR2YWwsIEAkdmFsdWVzICkgKSB7CisgICAgICAgICAgICAgICAgJHZhbHVlcyA9IGpvaW4oICIsICIsIG1hcCggImAkXyciLCBAJHZhbHVlcyApICk7CisgICAgICAgICAgICAgICAgJGVycm9yLT4oICJPcHRpb24gYCRvcHQnIHZhbHVlIGlzIGAkdmFsJyBidXQgZXhwZWN0ZWQgdG8gYmUgb25lIG9mICR2YWx1ZXMiICk7CisgICAgICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfTsgIyBpZgorICAgICAgICAkb3B0c3sgJG9wdCB9ID0gJHZhbDsKKyAgICB9OyAjIHdoaWxlCisKKyAgICAjIEFzc2lnbiBkZWZhdWx0IHZhbHVlcy4KKyAgICBmb3JlYWNoIG15ICRvcHQgKCBrZXlzKCAlJHNwZWMgKSApIHsKKyAgICAgICAgaWYgKCBub3QgZGVmaW5lZCggJG9wdHN7ICRvcHQgfSApIGFuZCBleGlzdHMoICRzcGVjLT57ICRvcHQgfS0+eyBkZWZhdWx0IH0gKSApIHsKKyAgICAgICAgICAgICRvcHRzeyAkb3B0IH0gPSAkc3BlYy0+eyAkb3B0IH0tPnsgZGVmYXVsdCB9OworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBmb3JlYWNoICRvcHQKKworICAgICMgSWYgd2UgZm91bmQgYW55IGVycm9ycywgcmFpc2UgdGhlbS4KKyAgICBpZiAoIEBlcnJvcnMgKSB7CisgICAgICAgIGRpZSBqb2luKCAiIiwgQGVycm9ycyApOworICAgIH07ICMgaWYKKworICAgIHJldHVybiAlb3B0czsKKworfTsgIyBzdWIgdmFsaWRhdGUKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIEdldCBvcHRpb24gaGVscGVycy4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCis9aGVhZDIgR2V0IG9wdGlvbiBoZWxwZXJzLgorCis9Y3V0CisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9aGVhZDMgZ2V0X29wdGlvbnMKKworQjxTeW5vcHNpczo+CisKKyAgICBnZXRfb3B0aW9ucyggQGFyZ3VtZW50cyApCisKK0I8RGVzY3JpcHRpb246PgorCitJdCBpcyB2ZXJ5IHNpbXBsZSB3cmFwcGVyIGFyb3VuZiBHZXRvcHQ6Okxvbmc6OkdldE9wdGlvbnMuIEl0IHBhc3NlcyBhbGwgYXJndW1lbnRzIHRvIEdldE9wdGlvbnMsCithbmQgYWRkIGRlZmluaXRpb25zIGZvciBzdGFuZGFyZCBoZWxwIG9wdGlvbnM6IC0taGVscCwgLS1kb2MsIC0tdmVyYm9zZSwgYW5kIC0tcXVpZXQuCitXaGVuIEdldE9wdGlvbnMgZmluaWhlcywgdGhpcyBzdWJyb3V0aW5lIGNoZWNrcyBleGl0IGNvZGUsIGlmIGl0IGlzIG5vbi16ZXJvLCBzdGFuZGFyZCBlcnJvcgorbWVzc2FnZSBpcyBpc3N1ZWQgYW5kIHNjcmlwdCB0ZXJtaW5hdGVkLgorCitJZiAtLXZlcmJvc2Ugb3IgLS1xdWlldCBvcHRpb24gaXMgc3BlY2lmaWVkLCBDPHRvb2xzLnBtX3ZlcmJvc2U+IGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldC4KK0l0IGlzIHRoZSB3YXkgdG8gcHJvcGFnYXRlIHZlcmJvc2UvcXVpZXQgbW9kZSB0byBjYWxsZWUgUGVybCBzY3JpcHRzLgorCis9Y3V0CisKK3N1YiBnZXRfb3B0aW9ucyB7CisKKyAgICBHZXRvcHQ6Okxvbmc6OkNvbmZpZ3VyZSggIm5vX2lnbm9yZV9jYXNlIiApOworICAgIEdldG9wdDo6TG9uZzo6R2V0T3B0aW9ucygKKyAgICAgICAgImgwfHVzYWdlIiAgICAgICAgPT4gc3ViIHsgUG9kOjpVc2FnZTo6cG9kMnVzYWdlKCAtZXhpdHZhbCA9PiAwLCAtdmVyYm9zZSA9PiAwICk7IH0sCisgICAgICAgICJoMXxofGhlbHAiICAgICAgID0+IHN1YiB7IFBvZDo6VXNhZ2U6OnBvZDJ1c2FnZSggLWV4aXR2YWwgPT4gMCwgLXZlcmJvc2UgPT4gMSApOyB9LAorICAgICAgICAiaDJ8ZG9jfG1hbnVhbCIgICA9PiBzdWIgeyBQb2Q6OlVzYWdlOjpwb2QydXNhZ2UoIC1leGl0dmFsID0+IDAsIC12ZXJib3NlID0+IDIgKTsgfSwKKyAgICAgICAgInZlcnNpb24iICAgICAgICAgPT4gc3ViIHsgcHJpbnQoICIkdG9vbCB2ZXJzaW9uICRtYWluOjpWRVJTSU9OXG4iICk7IGV4aXQoIDAgKTsgfSwKKyAgICAgICAgInZ8dmVyYm9zZSIgICAgICAgPT4gc3ViIHsgKysgJHZlcmJvc2U7ICAgICAkRU5WeyAidG9vbHMucG1fdmVyYm9zZSIgICAgfSA9ICR2ZXJib3NlOyAgICB9LAorICAgICAgICAicXVpZXQiICAgICAgICAgICA9PiBzdWIgeyAtLSAkdmVyYm9zZTsgICAgICRFTlZ7ICJ0b29scy5wbV92ZXJib3NlIiAgICB9ID0gJHZlcmJvc2U7ICAgIH0sCisgICAgICAgICJ3aXRoLXRpbWVzdGFtcHMiID0+IHN1YiB7ICR0aW1lc3RhbXBzID0gMTsgJEVOVnsgInRvb2xzLnBtX3RpbWVzdGFtcHMiIH0gPSAkdGltZXN0YW1wczsgfSwKKyAgICAgICAgQF8sICMgQ2FsbGVyIGFyZ3VtZXRzYSBhcmUgYXQgdGhlIGVuZCBzbyBjYWxsZXIgb3B0aW9ucyBvdmVycmlkZXMgc3RhbmRhcmQuCisgICAgKSBvciBjbWRsaW5lX2Vycm9yKCk7CisKK307ICMgc3ViIGdldF9vcHRpb25zCisKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIFByaW50IHV0aWxpdGllcy4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCis9cG9kCisKKz1oZWFkMiBQcmludCB1dGlsaXRpZXMuCisKK0VhY2ggb2YgdGhlIHByaW50IHN1YnJvdXRpbmVzIHByZXBlbmRzIGVhY2ggbGluZSBvZiBpdHMgb3V0cHV0IHdpdGggdGhlIG5hbWUgb2YgY3VycmVudCBzY3JpcHQgYW5kCit0aGUgdHlwZSBvZiBpbmZvcm1hdGlvbiwgZm9yIGV4YW1wbGU6CisKKyAgICBpbmZvKCAiV3JpdGluZyBmaWxlLi4uIiApOworCit3aWxsIHByaW50CisKKyAgICA8c2NyaXB0PjogKGkpOiBXcml0aW5nIGZpbGUuLi4KKword2hpbGUKKworICAgIHdhcm5pbmcoICJGaWxlIGRvZXMgbm90IGV4aXN0ISIgKTsKKword2lsbCBwcmludAorCisgICAgPHNjcmlwdD46ICghKTogRmlsZSBkb2VzIG5vdCBleGlzdCEKKworSGVyZSBhcmUgZXhwb3J0ZWQgaXRlbXM6CisKKz1jdXQKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N1YiBfZm9ybWF0X21lc3NhZ2UoJFxAOyQpIHsKKworICAgIG15ICRwcmVmaXggID0gc2hpZnQoIEBfICk7CisgICAgbXkgJGFyZ3MgICAgPSBzaGlmdCggQF8gKTsKKyAgICBteSAkbm9fZW9sICA9IHNoaWZ0KCBAXyApOyAgIyBEbyBub3QgYXBwZW5kICJcbiIgdG8gdGhlIGxhc3QgbGluZS4KKyAgICBteSAkbWVzc2FnZSA9ICIiOworCisgICAgbXkgJHRzID0gIiI7CisgICAgaWYgKCAkdGltZXN0YW1wcyApIHsKKyAgICAgICAgbXkgKCAkc2VjLCAkbWluLCAkaG91ciwgJGRheSwgJG1vbnRoLCAkeWVhciApID0gZ210aW1lKCk7CisgICAgICAgICRtb250aCArPSAxOworICAgICAgICAkeWVhciAgKz0gMTkwMDsKKyAgICAgICAgJHRzID0gc3ByaW50ZiggIiUwNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDolMDJkIFVUQzogIiwgJHllYXIsICRtb250aCwgJGRheSwgJGhvdXIsICRtaW4sICRzZWMgKTsKKyAgICB9OyAjIGlmCisgICAgZm9yIG15ICRpICggMSAuLiBAJGFyZ3MgKSB7CisgICAgICAgIG15IEBsaW5lcyA9IHNwbGl0KCAiXG4iLCAkYXJncy0+WyAkaSAtIDEgXSApOworICAgICAgICBmb3IgbXkgJGogKCAxIC4uIEBsaW5lcyApIHsKKyAgICAgICAgICAgIG15ICRsaW5lID0gJGxpbmVzWyAkaiAtIDEgXTsKKyAgICAgICAgICAgIG15ICRsYXN0X2xpbmUgPSAoICggJGkgPT0gQCRhcmdzICkgYW5kICggJGogPT0gQGxpbmVzICkgKTsKKyAgICAgICAgICAgIG15ICRlb2wgPSAoICggc3Vic3RyKCAkbGluZSwgLTEgKSBlcSAiXG4iICkgb3IgZGVmaW5lZCggJG5vX2VvbCApID8gIiIgOiAiXG4iICk7CisgICAgICAgICAgICAkbWVzc2FnZSAuPSAiJHRzJHRvb2w6ICgkcHJlZml4KSAiIC4gJGxpbmUgLiAkZW9sOworICAgICAgICB9OyAjIGZvcmVhY2ggJGoKKyAgICB9OyAjIGZvcmVhY2ggJGkKKyAgICByZXR1cm4gJG1lc3NhZ2U7CisKK307ICMgc3ViIF9mb3JtYXRfbWVzc2FnZQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPXBvZAorCis9aGVhZDMgJHZlcmJvc2UKKworQjxTeW5vcHNpczo+CisKKyAgICAkdmVyYm9zZQorCitCPERlc2NyaXB0aW9uOj4KKworUGFja2FnZSB2YXJpYWJsZS4gSXQgZGV0ZXJtaW5lcyB2ZXJib3NpdHkgbGV2ZWwsIHdoaWNoIGFmZmVjdHMgQzx3YXJuaW5nKCk+LCBDPGluZm8oKT4sIGFuZAorQzxkZWJ1ZygpPiBzdWJyb3V0bmVzIC4KKworVGhlIHZhcmlhYmxlIGdldHMgaW5pdGlhbCB2YWx1ZSBmcm9tIEM8dG9vbHMucG1fdmVyYm9zZT4gZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgaXQgaXMgZXhpc3RzLgorSWYgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGRvZXMgbm90IGV4aXN0LCB2YXJpYWJsZSBpcyBzZXQgdG8gMi4KKworSW5pdGlhbCB2YWx1ZSBtYXkgYmUgb3ZlcnJpZGRlbiBsYXRlciBkaXJlY3RseSBvciBieSBDPGdldF9vcHRpb25zPiBmdW5jdGlvbi4KKworPWN1dAorCiskdmVyYm9zZSA9IGV4aXN0cyggJEVOVnsgInRvb2xzLnBtX3ZlcmJvc2UiIH0gKSA/ICRFTlZ7ICJ0b29scy5wbV92ZXJib3NlIiB9IDogMjsKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1wb2QKKworPWhlYWQzICR0aW1lc3RhbXBzCisKK0I8U3lub3BzaXM6PgorCisgICAgJHRpbWVzdGFtcHMKKworQjxEZXNjcmlwdGlvbjo+CisKK1BhY2thZ2UgdmFyaWFibGUuIEl0IGRldGVybWluZXMgd2hldGhlciBDPGRlYnVnKCk+LCBDPGluZm8oKT4sIEM8d2FybmluZygpPiwgQzxydW50aW1lX2Vycm9yKCk+CitzdWJyb3V0bmVzIHByaW50IHRpbWVzdGFtcHMgb3Igbm90LgorCitUaGUgdmFyaWFibGUgZ2V0cyBpbml0aWFsIHZhbHVlIGZyb20gQzx0b29scy5wbV90aW1lc3RhbXBzPiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpZiBpdCBpcyBleGlzdHMuCitJZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgZG9lcyBub3QgZXhpc3QsIHZhcmlhYmxlIGlzIHNldCB0byBmYWxzZS4KKworSW5pdGlhbCB2YWx1ZSBtYXkgYmUgb3ZlcnJpZGRlbiBsYXRlciBkaXJlY3RseSBvciBieSBDPGdldF9vcHRpb25zKCk+IGZ1bmN0aW9uLgorCis9Y3V0CisKKyR0aW1lc3RhbXBzID0gZXhpc3RzKCAkRU5WeyAidG9vbHMucG1fdGltZXN0YW1wcyIgfSApID8gJEVOVnsgInRvb2xzLnBtX3RpbWVzdGFtcHMiIH0gOiAwOworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPXBvZAorCis9aGVhZDMgZGVidWcKKworQjxTeW5vcHNpczo+CisKKyAgICBkZWJ1ZyggQG1lc3NhZ2VzICkKKworQjxEZXNjcmlwdGlvbjo+CisKK0lmIHZlcmJvc2l0eSBsZXZlbCBpcyAzIG9yIGhpZ2hlciwgcHJpbnQgZGVidWcgaW5mb3JtYXRpb24gdG8gdGhlIHN0ZGVyciwgcHJlcGVuZGluZyBpdCB3aXRoICIoIykiCitwcmVmaXguCisKKz1jdXQKKworc3ViIGRlYnVnKEApIHsKKworICAgIGlmICggJHZlcmJvc2UgPj0gMyApIHsKKyAgICAgICAgU1RET1VULT5mbHVzaCgpOworICAgICAgICBTVERFUlItPnByaW50KCBfZm9ybWF0X21lc3NhZ2UoICIjIiwgQF8gKSApOworICAgIH07ICMgaWYKKyAgICByZXR1cm4gMTsKKworfTsgIyBzdWIgZGVidWcKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1wb2QKKworPWhlYWQzIGluZm8KKworQjxTeW5vcHNpczo+CisKKyAgICBpbmZvKCBAbWVzc2FnZXMgKQorCitCPERlc2NyaXB0aW9uOj4KKworSWYgdmVyYm9zaXR5IGxldmVsIGlzIDIgb3IgaGlnaGVyLCBwcmludCBpbmZvcm1hdGlvbiB0byB0aGUgc3RkZXJyLCBwcmVwZW5kaW5nIGl0IHdpdGggIihpKSIgcHJlZml4LgorCis9Y3V0CisKK3N1YiBpbmZvKEApIHsKKworICAgIGlmICggJHZlcmJvc2UgPj0gMiApIHsKKyAgICAgICAgU1RET1VULT5mbHVzaCgpOworICAgICAgICBTVERFUlItPnByaW50KCBfZm9ybWF0X21lc3NhZ2UoICJpIiwgQF8gICkgKTsKKyAgICB9OyAjIGlmCisKK307ICMgc3ViIGluZm8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1oZWFkMyB3YXJuaW5nCisKK0I8U3lub3BzaXM6PgorCisgICAgd2FybmluZyggQG1lc3NhZ2VzICkKKworQjxEZXNjcmlwdGlvbjo+CisKK0lmIHZlcmJvc2l0eSBsZXZlbCBpcyAxIG9yIGhpZ2hlciwgaXNzdWUgYSB3YXJuaW5nLCBwcmVwZW5kaW5nIGl0IHdpdGggIighKSIgcHJlZml4LgorCis9Y3V0CisKK3N1YiB3YXJuaW5nKEApIHsKKworICAgIGlmICggJHZlcmJvc2UgPj0gMSApIHsKKyAgICAgICAgU1RET1VULT5mbHVzaCgpOworICAgICAgICB3YXJuKCBfZm9ybWF0X21lc3NhZ2UoICIhIiwgQF8gICkgKTsKKyAgICB9OyAjIGlmCisKK307ICMgc3ViIHdhcm5pbmcKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1oZWFkMyBjbWRsaW5lX2Vycm9yCisKK0I8U3lub3BzaXM6PgorCisgICAgY21kbGluZV9lcnJvciggQG1lc3NhZ2UgKQorCitCPERlc2NyaXB0aW9uOj4KKworUHJpbnQgZXJyb3IgbWVzc2FnZSBhbmQgZXhpdCB0aGUgcHJvZ3JhbSB3aXRoIHN0YXR1cyAyLgorCitUaGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIHRvIGNvbXBsYWluIG9uIGNvbW1hbmQgbGluZSBlcnJvcnMsIGUuIGcuIHVua25vd24KK29wdGlvbnMsIGludmFsaWQgYXJndW1lbnRzLCBldGMuCisKKz1jdXQKKworc3ViIGNtZGxpbmVfZXJyb3IoOyQpIHsKKworICAgIG15ICRtZXNzYWdlID0gc2hpZnQoIEBfICk7CisKKyAgICBpZiAoIGRlZmluZWQoICRtZXNzYWdlICkgKSB7CisgICAgICAgIGlmICggc3Vic3RyKCAkbWVzc2FnZSwgLTEsIDEgKSBuZSAiXG4iICkgeworICAgICAgICAgICAgJG1lc3NhZ2UgLj0gIlxuIjsKKyAgICAgICAgfTsgIyBpZgorICAgIH0gZWxzZSB7CisgICAgICAgICRtZXNzYWdlID0gIiI7CisgICAgfTsgIyBpZgorICAgIFNURE9VVC0+Zmx1c2goKTsKKyAgICBkaWUgJG1lc3NhZ2UgLiAiVHJ5IC0taGVscCBvcHRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4iOworCit9OyAjIHN1YiBjbWRsaW5lX2Vycm9yCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9aGVhZDMgcnVudGltZV9lcnJvcgorCitCPFN5bm9wc2lzOj4KKworICAgIHJ1bnRpbWVfZXJyb3IoIEBtZXNzYWdlICkKKworQjxEZXNjcmlwdGlvbjo+CisKK1ByaW50IGVycm9yIG1lc3NhZ2UgYW5kIGV4aXRzIHRoZSBwcm9ncmFtIHdpdGggc3RhdHVzIDMuCisKK1RoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgdG8gY29tcGxhaW4gb24gcnVudGltZSBlcnJvcnMsIGUuIGcuCitkaXJlY3RvcmllcyB3aGljaCBhcmUgbm90IGZvdW5kLCBub24td3JpdGFibGUgZmlsZXMsIGV0Yy4KKworPWN1dAorCitzdWIgcnVudGltZV9lcnJvcihAKSB7CisKKyAgICBTVERPVVQtPmZsdXNoKCk7CisgICAgZGllIF9mb3JtYXRfbWVzc2FnZSggIngiLCBAXyApOworCit9OyAjIHN1YiBydW50aW1lX2Vycm9yCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9aGVhZDMgcXVlc3Rpb24KKworQjxTeW5vcHNpczo+CisKKyAgICBxdWVzdGlvbiggJHByb21wdDsgJGFuc3dlciwgJGNob2ljZXMgICkKKworQjxEZXNjcmlwdGlvbjo+CisKK1ByaW50ICRwcm9tcCB0byB0aGUgc3RkZXJyLCBwcmVwZW5kaW5nIGl0IHdpdGggInF1ZXN0aW9uOiIgcHJlZml4LiBSZWFkIGEgbGluZSBmcm9tIHN0ZGluLCBjaG9wCisiXG4iIGZyb20gdGhlIGVuZCwgaXQgaXMgYW5zd2VyLgorCitJZiAkYW5zd2VyIGlzIGRlZmluZWQsIGl0IGlzIHRyZWF0ZWQgYXMgZmlyc3QgdXNlciBpbnB1dC4KKworSWYgJGNob2ljZXMgaXMgc3BlY2lmaWVkLCBpdCBjb3VsZCBiZSBhIHJlZ2V4cCBmb3IgdmFsaWRhdGluZyB1c2VyIGlucHV0LCBvciBhIHN0cmluZy4gSW4gbGF0dGVyCitjYXNlIGl0IGludGVycHJldGVkIGFzIGxpc3Qgb2YgY2hhcmFjdGVycywgYWNjZXB0YWJsZSAoY2FzZS1pbnNlbnNpdGl2ZSkgY2hvaWNlcy4gSWYgdXNlciBlbnRlcnMKK25vbi1hY2NlcHRhYmxlIGFuc3dlciwgcXVlc3Rpb24gY29udGludWUgYXNraW5nIHVudGlsIGFuc3dlciBpcyBhY2NlcHRhYmxlLgorSWYgJGNob2ljZXMgaXMgbm90IHNwZWNpZmllZCwgYW55IGFuc3dlciBpcyBhY2NlcHRhYmxlLgorCitJbiBjYXNlIG9mIGVuZC1vZi1maWxlIChvciBDdHJsK0QgcHJlc3NlZCBieSB1c2VyKSwgJGFuc3dlciBpcyBDPHVuZGVmPi4KKworQjxFeGFtcGxlczo+CisKKyAgICBteSAkYW5zd2VyOworICAgIHF1ZXN0aW9uKCAiU2F2ZSBmaWxlIFt5bl0/ICIsICRhbnN3ZXIsICJ5biIgKTsKKyAgICAgICAgIyBXZSBhY2NlcHRzIG9ubHkgInkiLCAiWSIsICJuIiwgb3IgIk4iLgorICAgIHF1ZXN0aW9uKCAiUHJlc3MgZW50ZXIgdG8gY29udGludWUgb3IgQ3RybCtDIHRvIGFib3J0Li4uIiApOworICAgICAgICAjIFdlIGFyZSBub3QgaW50ZXJlc3RlZCBpbiBhbnN3ZXIgdmFsdWUgLS0gaW4gY2FzZSBvZiBDdHJsK0MgdGhlIHNjcmlwdCB3aWxsIGJlIHRlcm1pbmF0ZWQsCisgICAgICAgICMgb3RoZXJ3aXNlIHdlIGNvbnRpbnVlIGV4ZWN1dGlvbi4KKyAgICBxdWVzdGlvbiggIkZpbGUgbmFtZT8gIiwgJGFuc3dlciApOworICAgICAgICAjIEFueSBhbnN3ZXIgaXMgYWNjZXB0YWJsZS4KKworPWN1dAorCitzdWIgcXVlc3Rpb24oJDtcJCQpIHsKKworICAgIG15ICRwcm9tcHQgID0gc2hpZnQoIEBfICk7CisgICAgbXkgJGFuc3dlciAgPSBzaGlmdCggQF8gKTsKKyAgICBteSAkY2hvaWNlcyA9IHNoaWZ0KCBAXyApOworICAgIG15ICRhICAgICAgID0gKCBkZWZpbmVkKCAkYW5zd2VyICkgPyAkJGFuc3dlciA6IHVuZGVmICk7CisKKyAgICBpZiAoIHJlZiggJGNob2ljZXMgKSBlcSAiUmVnZXhwIiApIHsKKyAgICAgICAgIyBJdCBpcyBhbHJlYWR5IGEgcmVndWxhciBleHByZXNzaW9uLCBkbyBub3RoaW5nLgorICAgIH0gZWxzaWYgKCBkZWZpbmVkKCAkY2hvaWNlcyApICkgeworICAgICAgICAjIENvbnZlcnQgc3RyaW5nIHRvIGEgcmVndWxhciBleHByZXNzaW9uLgorICAgICAgICAkY2hvaWNlcyA9IHFyL1tAeyBbIHF1b3RlbWV0YSggJGNob2ljZXMgKSBdIH1dL2k7CisgICAgfTsgIyBpZgorCisgICAgZm9yICggOyA7ICkgeworICAgICAgICBTVERFUlItPnByaW50KCBfZm9ybWF0X21lc3NhZ2UoICI/IiwgQHsgWyAkcHJvbXB0IF0gfSwgIm5vX2VvbCIgKSApOworICAgICAgICBTVERFUlItPmZsdXNoKCk7CisgICAgICAgIGlmICggZGVmaW5lZCggJGEgKSApIHsKKyAgICAgICAgICAgIFNURE9VVC0+cHJpbnQoICRhIC4gIlxuIiApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJGEgPSA8U1RESU4+OworICAgICAgICB9OyAjIGlmCisgICAgICAgIGlmICggbm90IGRlZmluZWQoICRhICkgKSB7CisgICAgICAgICAgICBsYXN0OworICAgICAgICB9OyAjIGlmCisgICAgICAgIGNob21wKCAkYSApOworICAgICAgICBpZiAoIG5vdCBkZWZpbmVkKCAkY2hvaWNlcyApIG9yICggJGEgPX4gbS9eJGNob2ljZXMkLyApICkgeworICAgICAgICAgICAgbGFzdDsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICAkYSA9IHVuZGVmOworICAgIH07ICMgZm9yZXZlcgorICAgIGlmICggZGVmaW5lZCggJGFuc3dlciApICkgeworICAgICAgICAkJGFuc3dlciA9ICRhOworICAgIH07ICMgaWYKKworfTsgIyBzdWIgcXVlc3Rpb24KKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgUmV0dXJucyB2b2x1bWUgcGFydCBvZiBwYXRoLgorc3ViIGdldF92b2woJCkgeworCisgICAgbXkgJHBhdGggPSBzaGlmdCggQF8gKTsKKyAgICBteSAoICR2b2wsIHVuZGVmLCB1bmRlZiApID0gRmlsZTo6U3BlYy0+c3BsaXRwYXRoKCAkcGF0aCApOworICAgIHJldHVybiAkdm9sOworCit9OyAjIHN1YiBnZXRfdm9sCisKKyMgUmV0dXJucyBkaXJlY3RvcnkgcGFydCBvZiBwYXRoLgorc3ViIGdldF9kaXIoJCkgeworCisgICAgbXkgJHBhdGggPSBGaWxlOjpTcGVjLT5jYW5vbnBhdGgoIHNoaWZ0KCBAXyApICk7CisgICAgbXkgKCAkdm9sLCAkZGlyLCB1bmRlZiApID0gRmlsZTo6U3BlYy0+c3BsaXRwYXRoKCAkcGF0aCApOworICAgIG15IEBkaXJzID0gRmlsZTo6U3BlYy0+c3BsaXRkaXIoICRkaXIgKTsKKyAgICBwb3AoIEBkaXJzICk7CisgICAgJGRpciA9IEZpbGU6OlNwZWMtPmNhdGRpciggQGRpcnMgKTsKKyAgICAkZGlyID0gRmlsZTo6U3BlYy0+Y2F0cGF0aCggJHZvbCwgJGRpciwgdW5kZWYgKTsKKyAgICByZXR1cm4gJGRpcjsKKworfTsgIyBzdWIgZ2V0X2RpcgorCisjIFJldHVybnMgZmlsZSBwYXJ0IG9mIHBhdGguCitzdWIgZ2V0X2ZpbGUoJCkgeworCisgICAgbXkgJHBhdGggPSBzaGlmdCggQF8gKTsKKyAgICBteSAoIHVuZGVmLCB1bmRlZiwgJGZpbGUgKSA9IEZpbGU6OlNwZWMtPnNwbGl0cGF0aCggJHBhdGggKTsKKyAgICByZXR1cm4gJGZpbGU7CisKK307ICMgc3ViIGdldF9maWxlCisKKyMgUmV0dXJucyBmaWxlIHBhcnQgb2YgcGF0aCB3aXRob3V0IGxhc3Qgc3VmZml4Lgorc3ViIGdldF9uYW1lKCQpIHsKKworICAgIG15ICRwYXRoID0gc2hpZnQoIEBfICk7CisgICAgbXkgKCB1bmRlZiwgdW5kZWYsICRmaWxlICkgPSBGaWxlOjpTcGVjLT5zcGxpdHBhdGgoICRwYXRoICk7CisgICAgJGZpbGUgPX4gc3tcLlteLl0qXHp9e307CisgICAgcmV0dXJuICRmaWxlOworCit9OyAjIHN1YiBnZXRfbmFtZQorCisjIFJldHVybnMgbGFzdCBzdWZmaXggb2YgZmlsZSBwYXJ0IG9mIHBhdGguCitzdWIgZ2V0X2V4dCgkKSB7CisKKyAgICBteSAkcGF0aCA9IHNoaWZ0KCBAXyApOworICAgIG15ICggdW5kZWYsIHVuZGVmLCAkZmlsZSApID0gRmlsZTo6U3BlYy0+c3BsaXRwYXRoKCAkcGF0aCApOworICAgIG15ICRleHQgPSAiIjsKKyAgICBpZiAoICRmaWxlID1+IG17KFwuW14uXSopXHp9ICkgeworICAgICAgICAkZXh0ID0gJDE7CisgICAgfTsgIyBpZgorICAgIHJldHVybiAkZXh0OworCit9OyAjIHN1YiBnZXRfZXh0CisKK3N1YiBjYXRfZmlsZShAKSB7CisKKyAgICBteSAkcGF0aCA9IHNoaWZ0KCBAXyApOworICAgIG15ICRmaWxlID0gcG9wKCBAXyApOworICAgIG15IEBkaXJzID0gQF87CisKKyAgICBteSAoICR2b2wsICRkaXJzICkgPSBGaWxlOjpTcGVjLT5zcGxpdHBhdGgoICRwYXRoLCAibm9fZmlsZSIgKTsKKyAgICBAZGlycyA9ICggRmlsZTo6U3BlYy0+c3BsaXRkaXIoICRkaXJzICksIEBkaXJzICk7CisgICAgJGRpcnMgPSBGaWxlOjpTcGVjLT5jYXRkaXIoIEBkaXJzICk7CisgICAgJHBhdGggPSBGaWxlOjpTcGVjLT5jYXRwYXRoKCAkdm9sLCAkZGlycywgJGZpbGUgKTsKKworICAgIHJldHVybiAkcGF0aDsKKworfTsgIyBzdWIgY2F0X2ZpbGUKKworc3ViIGNhdF9kaXIoQCkgeworCisgICAgbXkgJHBhdGggPSBzaGlmdCggQF8gKTsKKyAgICBteSBAZGlycyA9IEBfOworCisgICAgbXkgKCAkdm9sLCAkZGlycyApID0gRmlsZTo6U3BlYy0+c3BsaXRwYXRoKCAkcGF0aCwgIm5vX2ZpbGUiICk7CisgICAgQGRpcnMgPSAoIEZpbGU6OlNwZWMtPnNwbGl0ZGlyKCAkZGlycyApLCBAZGlycyApOworICAgICRkaXJzID0gRmlsZTo6U3BlYy0+Y2F0ZGlyKCBAZGlycyApOworICAgICRwYXRoID0gRmlsZTo6U3BlYy0+Y2F0cGF0aCggJHZvbCwgJGRpcnMsICIiICk7CisKKyAgICByZXR1cm4gJHBhdGg7CisKK307ICMgc3ViIGNhdF9kaXIKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIEZpbGUgYW5kIGRpcmVjdG9yeSBtYW5pcHVsYXRpb24gc3Vicm91dGluZXMuCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworPWhlYWQyIEZpbGUgYW5kIGRpcmVjdG9yeSBtYW5pcHVsYXRpb24gc3Vicm91dGluZXMuCisKKz1vdmVyCisKKz1jdXQKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1pdGVtIEM8d2hpY2goICRmaWxlLCBAb3B0aW9ucyApPgorCitTZWFyY2hlcyBmb3Igc3BlY2lmaWVkIGV4ZWN1dGFibGUgZmlsZSBpbiB0aGUgKHNwZWNpZmllZCkgZGlyZWN0b3JpZXMuCitSYWlzZXMgYSBydW50aW1lIGVyb3JvciBpZiBubyBleGVjdXRhYmxlIGZpbGUgZm91bmQuIFJldHVybnMgYSBmdWxsIHBhdGggb2YgZm91bmQgZXhlY3V0YWJsZShzKS4KKworT3B0aW9uczoKKworPW92ZXIKKworPWl0ZW0gQzwtYWxsPiA9RTxndD4gSTxib29sPgorCitEbyBub3Qgc3RvcCBvbiB0aGUgZmlyc3QgZm91bmQgZmlsZS4gTm90ZSwgdGhhdCBsaXN0IG9mIGZ1bGwgcGF0aHMgaXMgcmV0dXJuZWQgaW4gdGhpcyBjYXNlLgorCis9aXRlbSBDPC1kaXJzPiA9RTxndD4gSTxyZWZfdG9fYXJyYXk+CisKK1NwZWNpZnkgZGlyZWN0b3J5IGxpc3QgdG8gc2VhcmNoIHRocm91Z2guIElmIG9wdGlvbiBpcyBub3QgcGFzc2VkLCBQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlCitpcyB1c2VkIGZvciBkaXJlY3RvcnkgbGlzdC4KKworPWl0ZW0gQzwtZXhlYz4gPUU8Z3Q+IEk8Ym9vbD4KKworV2hldGhlciBjaGVjayBmb3IgZXhlY3V0YWJsZSBmaWxlcyBvciBub3QuIEJ5IGRlZmF1bHQsIEM8d2hpY2g+IHNlYXJjaGVzIGV4ZWN1dGFibGUgZmlsZXMuCitIb3dldmVyLCBvbiBDeWd3aW4gZXhlY3V0YWJsZSBjaGVjayBuZXZlciBwZXJmb3JtZWQuCisKKz1iYWNrCisKK0V4YW1wbGVzOgorCitMb29rIGZvciAiZWNobyIgaW4gdGhlIGRpcmVjdG9yaWVzIHNwZWNpZmllZCBpbiBQQVRIOgorCisgICAgbXkgJGVjaG8gPSB3aGljaCggImVjaG8iICk7CisKK0xvb2sgZm9yIGFsbCBvY2N1cmVuc2VzIG9mICJjcCIgaW4gdGhlIFBBVEg6CisKKyAgICBteSBAY3BzID0gd2hpY2goICJjcCIsIC1hbGwgPT4gMSApOworCitMb29rIGZvciB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiAiaWNjIiBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yaWVzOgorCisgICAgbXkgJGljYyA9IHdoaWNoKCAiaWNjIiwgLWRpcnMgPT4gWyAiLiIsICIvdXNyL2xvY2FsL2JpbiIsICIvdXNyL2JpbiIsICIvYmluIiBdICk7CisKK0xvb2sgZm9yIHRoZSB0aGUgQzxvbXBfbGliLmY+IGZpbGU6CisKKyAgICBteSBAb21wX2xpYiA9IHdoaWNoKCAib21wX2xpYi5mIiwgLWFsbCA9PiAxLCAtZXhlYyA9PiAwLCAtZGlycyA9PiBbIEBpbmNsdWRlIF0gKTsKKworPWN1dAorCitzdWIgd2hpY2goJEApIHsKKworICAgIG15ICRmaWxlID0gc2hpZnQoIEBfICk7CisgICAgbXkgJW9wdHMgPSBAXzsKKworICAgIGNoZWNrX29wdHMoICVvcHRzLCBbIHF3KCAtYWxsIC1kaXJzIC1leGVjICkgXSApOworICAgIGlmICggJG9wdHN7IC1hbGwgfSBhbmQgbm90IHdhbnRhcnJheSgpICkgeworICAgICAgICBsb2NhbCAkQ2FycDo6Q2FycExldmVsID0gMTsKKyAgICAgICAgQ2FycDo6Y2x1Y2soICJgLWFsbCcgb3B0aW9uIHBhc3NlZCB0byBgd2hpY2gnIGJ1dCBsaXN0IGlzIG5vdCBleHBlY3RlZCIgKTsKKyAgICB9OyAjIGlmCisgICAgaWYgKCBub3QgZGVmaW5lZCggJG9wdHN7IC1leGVjIH0gKSApIHsKKyAgICAgICAgJG9wdHN7IC1leGVjIH0gPSAxOworICAgIH07ICMgaWYKKworICAgIG15ICRkaXJzID0gKCBleGlzdHMoICRvcHRzeyAtZGlycyB9ICkgPyAkb3B0c3sgLWRpcnMgfSA6IFsgRmlsZTo6U3BlYy0+cGF0aCgpIF0gKTsKKyAgICBteSBAZm91bmQ7CisKKyAgICBteSBAZXh0cyA9ICggIiIgKTsKKyAgICBpZiAoICReTyBlcSAiTVNXaW4zMiIgYW5kICRvcHRzeyAtZXhlYyB9ICkgeworICAgICAgICBpZiAoIGRlZmluZWQoICRFTlZ7IFBBVEhFWFQgfSApICkgeworICAgICAgICAgICAgcHVzaCggQGV4dHMsIHNwbGl0KCAiOyIsICRFTlZ7IFBBVEhFWFQgfSApICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAjIElmIFBBVEhFWFQgZG9lcyBub3QgZXhpc3QsIHVzZSBkZWZhdWx0IHZhbHVlLgorICAgICAgICAgICAgcHVzaCggQGV4dHMsIHF3eyAuQ09NIC5FWEUgLkJBVCAuQ01EIH0gKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKworICAgIGxvb3A6CisgICAgZm9yZWFjaCBteSAkZGlyICggQCRkaXJzICkgeworICAgICAgICBmb3JlYWNoIG15ICRleHQgKCBAZXh0cyApIHsKKyAgICAgICAgICAgIG15ICRwYXRoID0gRmlsZTo6U3BlYy0+Y2F0ZmlsZSggJGRpciwgJGZpbGUgLiAkZXh0ICk7CisgICAgICAgICAgICBpZiAoIC1lICRwYXRoICkgeworICAgICAgICAgICAgICAgICMgRXhlY3V0YWJsZSBiaXQgaXMgbm90IHJlbGlhYmxlIG9uIEN5Z3dpbiwgZG8gbm90IGNoZWNrIGl0LgorICAgICAgICAgICAgICAgIGlmICggbm90ICRvcHRzeyAtZXhlYyB9IG9yIC14ICRwYXRoIG9yICReTyBlcSAiY3lnd2luIiApIHsKKyAgICAgICAgICAgICAgICAgICAgcHVzaCggQGZvdW5kLCAkcGF0aCApOworICAgICAgICAgICAgICAgICAgICBpZiAoIG5vdCAkb3B0c3sgLWFsbCB9ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCBsb29wOworICAgICAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9OyAjIGZvcmVhY2ggJGV4dAorICAgIH07ICMgZm9yZWFjaCAkZGlyCisKKyAgICBpZiAoIG5vdCBAZm91bmQgKSB7CisgICAgICAgICMgVEJEOiBXZSBuZWVkIHRvIGludHJvZHVjZSBhbiBvcHRpb24gZm9yIGNvbmRpdGlvbmFsIGVuYWJsaW5nIHRoaXMgZXJyb3IuCisgICAgICAgICMgcnVudGltZV9lcnJvciggIkNvdWxkIG5vdCBmaW5kIFwiJGZpbGVcIiBleGVjdXRhYmxlIGZpbGUgaW4gUEFUSC4iICk7CisgICAgfTsgIyBpZgorICAgIGlmICggQGZvdW5kID4gMSApIHsKKyAgICAgICAgIyBUQkQ6IElzc3VlIGEgd2FybmluZz8KKyAgICB9OyAjIGlmCisKKyAgICBpZiAoICRvcHRzeyAtYWxsIH0gKSB7CisgICAgICAgIHJldHVybiBAZm91bmQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuICRmb3VuZFsgMCBdOworICAgIH07ICMgaWYKKworfTsgIyBzdWIgd2hpY2gKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1pdGVtIEM8YWJzX3BhdGgoICRwYXRoLCAkYmFzZSApPgorCitSZXR1cm4gYWJzb2x1dGUgcGF0aCBmb3IgYW4gYXJndW1lbnQuCisKK01vc3Qgb2YgdGhlIHdvcmsgaXMgZG9uZSBieSBDPEZpbGU6OlNwZWMtPnJlbDJhYnMoKT4uIEM8YWJzX3BhdGgoKT4gYWRkaXRpb25hbGx5IGNvbGxhcHNlcworQzxkaXIxLy4uL2RpcjI+IHRvIEM8ZGlyMj4uCisKK0l0IGlzIG5vdCBzbyBuYWl2ZSBhbmQgbWFkZSBpbnRlbnRpb25hbGx5LiBGb3IgZXhhbXBsZSBvbiBMaW51eCogT1MgaW4gQmFzaCBpZiBGPGxpbmsvPiBpcyBhIHN5bWJvbGljCitsaW5rIHRvIGRpcmVjdG9yeSBGPHNvbWVfZGlyLz4KKworICAgICQgY2QgbGluaworICAgICQgY2QgLi4KKworYnJpbmdzIHlvdSBiYWNrIHRvIEY8bGluay8+J3MgcGFyZW50LCBub3QgdG8gcGFyZW50IG9mIEY8c29tZV9kaXIvPiwKKworPWN1dAorCitzdWIgYWJzX3BhdGgoJDskKSB7CisKKyAgICBteSAoICRwYXRoLCAkYmFzZSApID0gQF87CisgICAgJHBhdGggPSBGaWxlOjpTcGVjLT5yZWwyYWJzKCAkcGF0aCwgKCBkZWZpbmVkKCAkYmFzZSApID8gJGJhc2UgOiAkRU5WeyBQV0QgfSApICk7CisgICAgbXkgKCAkdm9sLCAkZGlyLCAkZmlsZSApID0gRmlsZTo6U3BlYy0+c3BsaXRwYXRoKCAkcGF0aCApOworICAgIHdoaWxlICggJGRpciA9fiBzey8oPyFcLlwuKVteL10qL1wuXC4oPzovfFx6KX17L30gKSB7CisgICAgfTsgIyB3aGlsZQorICAgICRwYXRoID0gRmlsZTo6U3BlYy0+Y2Fub25wYXRoKCBGaWxlOjpTcGVjLT5jYXRwYXRoKCAkdm9sLCAkZGlyLCAkZmlsZSApICk7CisgICAgcmV0dXJuICRwYXRoOworCit9OyAjIHN1YiBhYnNfcGF0aAorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWl0ZW0gQzxyZWxfcGF0aCggJHBhdGgsICRiYXNlICk+CisKK1JldHVybiByZWxhdGl2ZSBwYXRoIGZvciBhbiBhcmd1bWVudC4KKworPWN1dAorCitzdWIgcmVsX3BhdGgoJDskKSB7CisKKyAgICBteSAoICRwYXRoLCAkYmFzZSApID0gQF87CisgICAgJHBhdGggPSBGaWxlOjpTcGVjLT5hYnMycmVsKCBhYnNfcGF0aCggJHBhdGggKSwgJGJhc2UgKTsKKyAgICByZXR1cm4gJHBhdGg7CisKK307ICMgc3ViIHJlbF9wYXRoCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9aXRlbSBDPHJlYWxfcGF0aCggJGRpciApPgorCitSZXR1cm4gcmVhbCBhYnNvbHV0ZSBwYXRoIGZvciBhbiBhcmd1bWVudC4gSW4gdGhlIHJlc3VsdCBhbGwgcmVsYXRpdmUgY29tcG9uZW50cyAoRjwuPiBhbmQgRjwuLj4pCithbmQgVTxzeW1ib2xpYyBsaW5rcyBhcmUgcmVzb2x2ZWQ+LgorCitJbiBtb3N0IGNhc2VzIGl0IGlzIG5vdCB3aGF0IHlvdSB3YW50LiBDb25zaWRlciB1c2luZyBDPGFic19wYXRoPiBmaXJzdC4KKworQzxhYnNfcGF0aD4gZnVuY3Rpb24gZnJvbSBCPEN3ZD4gbW9kdWxlIHdvcmtzIHdpdGggZGlyZWN0b3JpZXMgb25seS4gVGhpcyBmdW5jdGlvbiB3b3JrcyB3aXRoIGZpbGVzCithcyB3ZWxsLiBCdXQsIGlmIGZpbGUgaXMgYSBzeW1ib2xpYyBsaW5rLCBmdW5jdGlvbiBkb2VzIG5vdCByZXNvbHZlIGl0ICh5ZXQpLgorCitUaGUgZnVuY3Rpb24gdXNlcyBDPHJ1bnRpbWVfZXJyb3I+IHRvIHJhaXNlIGFuIGVycm9yIGlmIHNvbWV0aGluZyB3cm9uZy4KKworPWN1dAorCitzdWIgcmVhbF9wYXRoKCQpIHsKKworICAgIG15ICRvcmlnX3BhdGggPSBzaGlmdCggQF8gKTsKKyAgICBteSAkcmVhbF9wYXRoOworICAgIG15ICRtZXNzYWdlID0gIiI7CisgICAgaWYgKCBub3QgLWUgJG9yaWdfcGF0aCApIHsKKyAgICAgICAgJG1lc3NhZ2UgPSAiXCIkb3JpZ19wYXRoXCIgZG9lcyBub3QgZXhpc3RzIjsKKyAgICB9IGVsc2UgeworICAgICAgICAjIEN3ZDo6YWJzX3BhdGggZG9lcyBub3Qgd29yayB3aXRoIGZpbGVzLCBzbyBpbiB0aGlzIGNhc2Ugd2Ugc2hvdWxkIGhhbmRsZSBmaWxlIHNlcGFyYXRlbHkuCisgICAgICAgIG15ICRmaWxlOworICAgICAgICBpZiAoIG5vdCAtZCAkb3JpZ19wYXRoICkgeworICAgICAgICAgICAgKCBteSAkdm9sLCBteSAkZGlyLCAkZmlsZSApID0gRmlsZTo6U3BlYy0+c3BsaXRwYXRoKCBGaWxlOjpTcGVjLT5yZWwyYWJzKCAkb3JpZ19wYXRoICkgKTsKKyAgICAgICAgICAgICRvcmlnX3BhdGggPSBGaWxlOjpTcGVjLT5jYXRwYXRoKCAkdm9sLCAkZGlyICk7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgeworICAgICAgICAgICAgbG9jYWwgJFNJR3sgX19XQVJOX18gfSA9IHN1YiB7ICRtZXNzYWdlID0gJF9bIDAgXTsgfTsKKyAgICAgICAgICAgICRyZWFsX3BhdGggPSBDd2Q6OmFic19wYXRoKCAkb3JpZ19wYXRoICk7CisgICAgICAgIH07CisgICAgICAgIGlmICggZGVmaW5lZCggJGZpbGUgKSApIHsKKyAgICAgICAgICAgICRyZWFsX3BhdGggPSBGaWxlOjpTcGVjLT5jYXRmaWxlKCAkcmVhbF9wYXRoLCAkZmlsZSApOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorICAgIGlmICggbm90IGRlZmluZWQoICRyZWFsX3BhdGggKSBvciAkbWVzc2FnZSBuZSAiIiApIHsKKyAgICAgICAgJG1lc3NhZ2UgPX4gcy9ec3RhdFwoLipcKTogKC4qKVxzK2F0IC4qPyBsaW5lIFxkK1xzKlx6LyQxLzsKKyAgICAgICAgcnVudGltZV9lcnJvciggIkNvdWxkIG5vdCBmaW5kIHJlYWwgcGF0aCBmb3IgXCIkb3JpZ19wYXRoXCIiIC4gKCAkbWVzc2FnZSBuZSAiIiA/ICI6ICRtZXNzYWdlIiA6ICIiICkgKTsKKyAgICB9OyAjIGlmCisgICAgcmV0dXJuICRyZWFsX3BhdGg7CisKK307ICMgc3ViIHJlYWxfcGF0aAorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWl0ZW0gQzxtYWtlX2RpciggJGRpciwgQG9wdGlvbnMgKT4KKworTWFrZSBhIGRpcmVjdG9yeS4KKworVGhpcyBmdW5jdGlvbiBtYWtlcyBhIGRpcmVjdG9yeS4gSWYgbmVjZXNzYXJ5LCBtb3JlIHRoYW4gb25lIGxldmVsIGNhbiBiZSBjcmVhdGVkLgorSWYgZGlyZWN0b3J5IGV4aXN0cywgd2FybmluZyBpc3N1ZXMgKHRoZSBzY3JpcHQgYmVoYXZpb3IgZGVwZW5kcyBvbiB2YWx1ZSBvZgorQzwtd2FybmluZ19sZXZlbD4gb3B0aW9uKS4gSWYgZGlyZWN0b3J5IGNyZWF0aW9uIGZhaWxzIG9yIEM8JGRpcj4gZXhpc3RzIGJ1dCBpdCBpcyBub3QgYQorZGlyZWN0b3J5LCBlcnJvciBpc3NzdWVzLgorCitPcHRpb25zOgorCis9b3ZlcgorCis9aXRlbSBDPC1tb2RlPgorCitUaGUgbnVtZXJpYyBtb2RlIGZvciBuZXcgZGlyZWN0b3JpZXMsIDA3NTAgKHJ3eHIteC0tLSkgYnkgZGVmYXVsdC4KKworPWJhY2sKKworPWN1dAorCitzdWIgbWFrZV9kaXIoJEApIHsKKworICAgIG15ICRkaXIgICAgPSBzaGlmdCggQF8gKTsKKyAgICBteSAlb3B0cyAgID0KKyAgICAgICAgdmFsaWRhdGUoCisgICAgICAgICAgICBwYXJhbXMgPT4gXEBfLAorICAgICAgICAgICAgc3BlYyA9PiB7CisgICAgICAgICAgICAgICAgcGFyZW50cyA9PiB7IHR5cGUgPT4gImJvb2xlYW4iLCBkZWZhdWx0ID0+IDEgICAgfSwKKyAgICAgICAgICAgICAgICBtb2RlICAgID0+IHsgdHlwZSA9PiAic2NhbGFyIiwgIGRlZmF1bHQgPT4gMDc3NyB9LAorICAgICAgICAgICAgfSwKKyAgICAgICAgKTsKKworICAgIG15ICRwcmVmaXggPSAiQ291bGQgbm90IGNyZWF0ZSBkaXJlY3RvcnkgXCIkZGlyXCIiOworCisgICAgaWYgKCAtZSAkZGlyICkgeworICAgICAgICBpZiAoIC1kICRkaXIgKSB7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogaXQgZXhpc3RzLCBidXQgbm90IGEgZGlyZWN0b3J5LiIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH0gZWxzZSB7CisgICAgICAgIGV2YWwgeworICAgICAgICAgICAgRmlsZTo6UGF0aDo6bWtwYXRoKCAkZGlyLCAwLCAkb3B0c3sgbW9kZSB9ICk7CisgICAgICAgIH07ICMgZXZhbAorICAgICAgICBpZiAoICRAICkgeworICAgICAgICAgICAgJEAgPX4gc3tccythdCAoPzpbYS16QS1aMC05IC9fLl0qLyk/dG9vbHNcLnBtIGxpbmUgXGQrXHMqfXt9OworICAgICAgICAgICAgcnVudGltZV9lcnJvciggIiRwcmVmaXg6ICRAIiApOworICAgICAgICB9OyAjIGlmCisgICAgICAgIGlmICggbm90IC1kICRkaXIgKSB7ICMgSnVzdCBpbiBjYXNlLCBjaGVjayBpdCBvbmUgbW9yZSB0aW1lLi4uCisgICAgICAgICAgICBydW50aW1lX2Vycm9yKCAiJHByZWZpeC4iICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGlmCisKK307ICMgc3ViIG1ha2VfZGlyCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9aXRlbSBDPGNvcHlfZGlyKCAkc3JjX2RpciwgJGRzdF9kaXIsIEBvcHRpb25zICk+CisKK0NvcHkgZGlyZWN0b3J5IHJlY3Vyc2l2ZWx5LgorCitUaGlzIGZ1bmN0aW9uIGNvcGllcyBhIGRpcmVjdG9yeSByZWN1cnNpdmVseS4KK0lmIHNvdXJjZSBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3Qgb3Igbm90IGEgZGlyZWN0b3J5LCBlcnJvciBpc3N1ZXMuCisKK09wdGlvbnM6CisKKz1vdmVyCisKKz1pdGVtIEM8LW92ZXJ3cml0ZT4KKworT3ZlcndyaXRlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSwgaWYgaXQgZXhpc3RzLgorCis9YmFjaworCis9Y3V0CisKK3N1YiBjb3B5X2RpcigkJEApIHsKKworICAgIG15ICRzcmMgID0gc2hpZnQoIEBfICk7CisgICAgbXkgJGRzdCAgPSBzaGlmdCggQF8gKTsKKyAgICBteSAlb3B0cyA9IEBfOworICAgIG15ICRwcmVmaXggPSAiQ291bGQgbm90IGNvcHkgZGlyZWN0b3J5IFwiJHNyY1wiIHRvIFwiJGRzdFwiIjsKKworICAgIGlmICggbm90IC1lICRzcmMgKSB7CisgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiBcIiRzcmNcIiBkb2VzIG5vdCBleGlzdC4iICk7CisgICAgfTsgIyBpZgorICAgIGlmICggbm90IC1kICRzcmMgKSB7CisgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiBcIiRzcmNcIiBpcyBub3QgYSBkaXJlY3RvcnkuIiApOworICAgIH07ICMgaWYKKyAgICBpZiAoIC1lICRkc3QgKSB7CisgICAgICAgIGlmICggLWQgJGRzdCApIHsKKyAgICAgICAgICAgIGlmICggJG9wdHN7IC1vdmVyd3JpdGUgfSApIHsKKyAgICAgICAgICAgICAgICBkZWxfZGlyKCAkZHN0ICk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiBcIiRkc3RcIiBhbHJlYWR5IGV4aXN0cy4iICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogXCIkZHN0XCIgaXMgbm90IGEgZGlyZWN0b3J5LiIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKworICAgIGV4ZWN1dGUoIFsgImNwIiwgIi1SIiwgJHNyYywgJGRzdCBdICk7CisKK307ICMgc3ViIGNvcHlfZGlyCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9aXRlbSBDPG1vdmVfZGlyKCAkc3JjX2RpciwgJGRzdF9kaXIsIEBvcHRpb25zICk+CisKK01vdmUgZGlyZWN0b3J5LgorCitPcHRpb25zOgorCis9b3ZlcgorCis9aXRlbSBDPC1vdmVyd3JpdGU+CisKK092ZXJ3cml0ZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnksIGlmIGl0IGV4aXN0cy4KKworPWJhY2sKKworPWN1dAorCitzdWIgbW92ZV9kaXIoJCRAKSB7CisKKyAgICBteSAkc3JjICA9IHNoaWZ0KCBAXyApOworICAgIG15ICRkc3QgID0gc2hpZnQoIEBfICk7CisgICAgbXkgJW9wdHMgPSBAXzsKKyAgICBteSAkcHJlZml4ID0gIkNvdWxkIG5vdCBjb3B5IGRpcmVjdG9yeSBcIiRzcmNcIiB0byBcIiRkc3RcIiI7CisKKyAgICBpZiAoIG5vdCAtZSAkc3JjICkgeworICAgICAgICBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogXCIkc3JjXCIgZG9lcyBub3QgZXhpc3QuIiApOworICAgIH07ICMgaWYKKyAgICBpZiAoIG5vdCAtZCAkc3JjICkgeworICAgICAgICBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogXCIkc3JjXCIgaXMgbm90IGEgZGlyZWN0b3J5LiIgKTsKKyAgICB9OyAjIGlmCisgICAgaWYgKCAtZSAkZHN0ICkgeworICAgICAgICBpZiAoIC1kICRkc3QgKSB7CisgICAgICAgICAgICBpZiAoICRvcHRzeyAtb3ZlcndyaXRlIH0gKSB7CisgICAgICAgICAgICAgICAgZGVsX2RpciggJGRzdCApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogXCIkZHN0XCIgYWxyZWFkeSBleGlzdHMuIiApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcnVudGltZV9lcnJvciggIiRwcmVmaXg6IFwiJGRzdFwiIGlzIG5vdCBhIGRpcmVjdG9yeS4iICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGlmCisKKyAgICBleGVjdXRlKCBbICJtdiIsICRzcmMsICRkc3QgXSApOworCit9OyAjIHN1YiBtb3ZlX2RpcgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWl0ZW0gQzxjbGVhbl9kaXIoICRkaXIsIEBvcHRpb25zICk+CisKK0NsZWFuIGEgZGlyZWN0b3J5OiBkZWxldGUgYWxsIHRoZSBlbnRyaWVzIChyZWN1cnNpdmVseSksIGJ1dCBsZWF2ZSB0aGUgZGlyZWN0b3J5LgorCitPcHRpb25zOgorCis9b3ZlcgorCis9aXRlbSBDPC1mb3JjZT4gPT4gYm9vbAorCitJZiBhIGRpcmVjdG9yeSBpcyBub3Qgd3JpdGFibGUsIHRyeSB0byBjaGFuZ2UgcGVybWlzc2lvbnMgZmlyc3QsIHRoZW4gY2xlYW4gaXQuCisKKz1pdGVtIEM8LXNraXA+ID0+IHJlZ2V4cAorCitSZWdleHAuIElmIGEgZGlyZWN0b3J5IGVudHJ5IG1hY2hlZCB0aGUgcmVnZXhwLCBpdCBpcyBza2lwcGVkLCBub3QgZGVsZXRlZC4gKEFzIGEgc3Vic2VxdWVuY2UsCithIGRpcmVjdG9yeSBjb250YWluaW5nIHNraXBwZWQgZW50cmllcyBpcyBub3QgZGVsZXRlZC4pCisKKz1iYWNrCisKKz1jdXQKKworc3ViIF9jbGVhbl9kaXIoJCk7CisKK3N1YiBfY2xlYW5fZGlyKCQpIHsKKyAgICBvdXIgJV9jbGVhbl9kaXJfb3B0czsKKyAgICBteSAoICRkaXIgKSA9IEBfOworICAgIG15ICRza2lwICAgID0gJF9jbGVhbl9kaXJfb3B0c3sgc2tpcCB9OyAgICAjIFJlZ2V4cC4KKyAgICBteSAkc2tpcHBlZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBOdW1iZXIgb2Ygc2tpcHBlZCBmaWxlcy4KKyAgICBteSAkcHJlZml4ICA9ICJDbGVhbmluZyBgJGRpcicgZmFpbGVkOiI7CisgICAgbXkgQHN0YXQgICAgPSBzdGF0KCAkZGlyICk7CisgICAgbXkgJG1vZGUgICAgPSAkc3RhdFsgMiBdOworICAgIGlmICggbm90IEBzdGF0ICkgeworICAgICAgICBydW50aW1lX2Vycm9yKCAkcHJlZml4LCAiQ2Fubm90IHN0YXQgYCRkaXInOiAkISIgKTsKKyAgICB9OyAjIGlmCisgICAgaWYgKCBub3QgLWQgXyApIHsKKyAgICAgICAgcnVudGltZV9lcnJvciggJHByZWZpeCwgIkl0IGlzIG5vdCBhIGRpcmVjdG9yeS4iICk7CisgICAgfTsgIyBpZgorICAgIGlmICggbm90IC13IF8gKSB7ICAgICAgICAjIERpcmVjdG9yeSBpcyBub3Qgd3JpdGFibGUuCisgICAgICAgIGlmICggbm90IC1vIF8gb3Igbm90ICRfY2xlYW5fZGlyX29wdHN7IGZvcmNlIH0gKSB7CisgICAgICAgICAgICBydW50aW1lX2Vycm9yKCAkcHJlZml4LCAiRGlyZWN0b3J5IGlzIG5vdCB3cml0YWJsZS4iICk7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgIyBEaXJlY3RvcnkgaXMgbm90IHdyaXRhYmxlIGJ1dCBtaW5lLiBUcnkgdG8gY2hhbmdlIHBlcm1pc3Npb25zLgorICAgICAgICBjaG1vZCggJG1vZGUgfCBTX0lXVVNSLCAkZGlyICkKKyAgICAgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICRwcmVmaXgsICJDYW5ub3QgbWFrZSBkaXJlY3Rvcnkgd3JpdGFibGU6ICQhIiApOworICAgIH07ICMgaWYKKyAgICBteSAkaGFuZGxlICAgPSBJTzo6RGlyLT5uZXcoICRkaXIgKSBvciBydW50aW1lX2Vycm9yKCAkcHJlZml4LCAiQ2Fubm90IHJlYWQgZGlyZWN0b3J5OiAkISIgKTsKKyAgICBteSBAZW50cmllcyAgPSBGaWxlOjpTcGVjLT5ub191cHdhcmRzKCAkaGFuZGxlLT5yZWFkKCkgKTsKKyAgICAkaGFuZGxlLT5jbG9zZSgpIG9yIHJ1bnRpbWVfZXJyb3IoICRwcmVmaXgsICJDYW5ub3QgcmVhZCBkaXJlY3Rvcnk6ICQhIiApOworICAgIGZvcmVhY2ggbXkgJGVudHJ5ICggQGVudHJpZXMgKSB7CisgICAgICAgIG15ICRwYXRoID0gY2F0X2ZpbGUoICRkaXIsICRlbnRyeSApOworICAgICAgICBpZiAoIGRlZmluZWQoICRza2lwICkgYW5kICRlbnRyeSA9fiAkc2tpcCApIHsKKyAgICAgICAgICAgICsrICRza2lwcGVkOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCAtbCAkcGF0aCApIHsKKyAgICAgICAgICAgICAgICB1bmxpbmsoICRwYXRoICkgb3IgcnVudGltZV9lcnJvciggJHByZWZpeCwgIkNhbm5vdCBkZWxldGUgc3ltbGluayBgJHBhdGgnOiAkISIgKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RhdCggJHBhdGggKSBvciBydW50aW1lX2Vycm9yKCAkcHJlZml4LCAiQ2Fubm90IHN0YXQgYCRwYXRoJzogJCEgIiApOworICAgICAgICAgICAgICAgIGlmICggLWYgXyApIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsX2ZpbGUoICRwYXRoICk7CisgICAgICAgICAgICAgICAgfSBlbHNpZiAoIC1kIF8gKSB7CisgICAgICAgICAgICAgICAgICAgIG15ICRyYyA9IF9jbGVhbl9kaXIoICRwYXRoICk7CisgICAgICAgICAgICAgICAgICAgIGlmICggJHJjID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBybWRpciggJHBhdGggKSBvciBydW50aW1lX2Vycm9yKCAkcHJlZml4LCAiQ2Fubm90IGRlbGV0ZSBkaXJlY3RvcnkgYCRwYXRoJzogJCEiICk7CisgICAgICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICAgICAgICAgJHNraXBwZWQgKz0gJHJjOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICRwcmVmaXgsICJgJHBhdGgnIGlzIG5laXRoZXIgYSBmaWxlIG5vciBhIGRpcmVjdG9yeS4iICk7CisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBmb3JlYWNoCisgICAgcmV0dXJuICRza2lwcGVkOworfTsgIyBzdWIgX2NsZWFuX2RpcgorCisKK3N1YiBjbGVhbl9kaXIoJEApIHsKKyAgICBteSAkZGlyICA9IHNoaWZ0KCBAXyApOworICAgIG91ciAlX2NsZWFuX2Rpcl9vcHRzOworICAgIGxvY2FsICVfY2xlYW5fZGlyX29wdHMgPQorICAgICAgICB2YWxpZGF0ZSgKKyAgICAgICAgICAgIHBhcmFtcyA9PiBcQF8sCisgICAgICAgICAgICBzcGVjID0+IHsKKyAgICAgICAgICAgICAgICBza2lwICA9PiB7IHR5cGUgPT4gInJlZ2V4cHJlZiIgfSwKKyAgICAgICAgICAgICAgICBmb3JjZSA9PiB7IHR5cGUgPT4gImJvb2xlYW4iICAgfSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICk7CisgICAgbXkgJHNraXBwZWQgPSBfY2xlYW5fZGlyKCAkZGlyICk7CisgICAgcmV0dXJuICRza2lwcGVkOworfTsgIyBzdWIgY2xlYW5fZGlyCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1pdGVtIEM8ZGVsX2RpciggJGRpciwgQG9wdGlvbnMgKT4KKworRGVsZXRlIGEgZGlyZWN0b3J5IHJlY3Vyc2l2ZWx5LgorCitUaGlzIGZ1bmN0aW9uIGRlbGV0ZXMgYSBkaXJlY3RvcnkuIElmIGRpcmVjdG9yeSBjYW4gbm90IGJlIGRlbGV0ZWQgb3IgaXQgaXMgbm90IGEgZGlyZWN0b3J5LCBlcnJvcgorbWVzc2FnZSBpc3N1ZXMgKGFuZCBzY3JpcHQgZXhpc3RzKS4KKworT3B0aW9uczoKKworPW92ZXIKKworPWJhY2sKKworPWN1dAorCitzdWIgZGVsX2RpcigkQCkgeworCisgICAgbXkgJGRpciAgPSBzaGlmdCggQF8gKTsKKyAgICBteSAlb3B0cyA9IEBfOworICAgIG15ICRwcmVmaXggPSAiRGVsZXRpbmcgZGlyZWN0b3J5IFwiJGRpclwiIGZhaWxlZCI7CisgICAgb3VyICVfY2xlYW5fZGlyX29wdHM7CisgICAgbG9jYWwgJV9jbGVhbl9kaXJfb3B0cyA9CisgICAgICAgIHZhbGlkYXRlKAorICAgICAgICAgICAgcGFyYW1zID0+IFxAXywKKyAgICAgICAgICAgIHNwZWMgPT4geworICAgICAgICAgICAgICAgIGZvcmNlID0+IHsgdHlwZSA9PiAiYm9vbGVhbiIgfSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICk7CisKKyAgICBpZiAoIG5vdCAtZSAkZGlyICkgeworICAgICAgICAjIE5vdGhpbmcgdG8gZG8uCisgICAgICAgIHJldHVybjsKKyAgICB9OyAjIGlmCisgICAgaWYgKCBub3QgLWQgJGRpciApIHsKKyAgICAgICAgcnVudGltZV9lcnJvciggIiRwcmVmaXg6IGl0IGlzIG5vdCBhIGRpcmVjdG9yeS4iICk7CisgICAgfTsgIyBpZgorICAgIF9jbGVhbl9kaXIoICRkaXIgKTsKKyAgICBybWRpciggJGRpciApIG9yIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4LiIgKTsKKworfTsgIyBzdWIgZGVsX2RpcgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWl0ZW0gQzxjaGFuZ2VfZGlyKCAkZGlyICk+CisKK0NoYW5nZSBjdXJyZW50IGRpcmVjdG9yeS4KKworSWYgYW55IGVycm9yIG9jY3VycmVkLCBlcnJvciBpc3N1ZXMgYW5kIHNjcmlwdCBleGl0cy4KKworPWN1dAorCitzdWIgY2hhbmdlX2RpcigkKSB7CisKKyAgICBteSAkZGlyID0gc2hpZnQoIEBfICk7CisKKyAgICBDd2Q6OmNoZGlyKCAkZGlyICkKKyAgICAgICAgb3IgcnVudGltZV9lcnJvciggIkNvdWxkIG5vdCBjaGRpciB0byBcIiRkaXJcIjogJCEiICk7CisKK307ICMgc3ViIGNoYW5nZV9kaXIKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWl0ZW0gQzxjb3B5X2ZpbGUoICRzcmNfZmlsZSwgJGRzdF9maWxlLCBAb3B0aW9ucyApPgorCitDb3B5IGZpbGUuCisKK1RoaXMgZnVuY3Rpb24gY29waWVzIGEgZmlsZS4gSWYgc291cmNlIGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBhIGZpbGUsIGVycm9yIGlzc3Vlcy4KKworT3B0aW9uczoKKworPW92ZXIKKworPWl0ZW0gQzwtb3ZlcndyaXRlPgorCitPdmVyd3JpdGUgZGVzdGluYXRpb24gZmlsZSwgaWYgaXQgZXhpc3RzLgorCis9YmFjaworCis9Y3V0CisKK3N1YiBjb3B5X2ZpbGUoJCRAKSB7CisKKyAgICBteSAkc3JjICA9IHNoaWZ0KCBAXyApOworICAgIG15ICRkc3QgID0gc2hpZnQoIEBfICk7CisgICAgbXkgJW9wdHMgPSBAXzsKKyAgICBteSAkcHJlZml4ID0gIkNvdWxkIG5vdCBjb3B5IGZpbGUgXCIkc3JjXCIgdG8gXCIkZHN0XCIiOworCisgICAgaWYgKCBub3QgLWUgJHNyYyApIHsKKyAgICAgICAgcnVudGltZV9lcnJvciggIiRwcmVmaXg6IFwiJHNyY1wiIGRvZXMgbm90IGV4aXN0LiIgKTsKKyAgICB9OyAjIGlmCisgICAgaWYgKCBub3QgLWYgJHNyYyApIHsKKyAgICAgICAgcnVudGltZV9lcnJvciggIiRwcmVmaXg6IFwiJHNyY1wiIGlzIG5vdCBhIGZpbGUuIiApOworICAgIH07ICMgaWYKKyAgICBpZiAoIC1lICRkc3QgKSB7CisgICAgICAgIGlmICggLWYgJGRzdCApIHsKKyAgICAgICAgICAgIGlmICggJG9wdHN7IC1vdmVyd3JpdGUgfSApIHsKKyAgICAgICAgICAgICAgICBkZWxfZmlsZSggJGRzdCApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogXCIkZHN0XCIgYWxyZWFkeSBleGlzdHMuIiApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcnVudGltZV9lcnJvciggIiRwcmVmaXg6IFwiJGRzdFwiIGlzIG5vdCBhIGZpbGUuIiApOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorCisgICAgRmlsZTo6Q29weTo6Y29weSggJHNyYywgJGRzdCApIG9yIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiAkISIgKTsKKyAgICAjIE9uIFdpbmRvd3MqIE9TIEZpbGU6OkNvcHkgcHJlc2VydmVzIGZpbGUgYXR0cmlidXRlcywgYnV0IG9uIExpbnV4KiBPUyBpdCBkb2Vzbid0LgorICAgICMgU28gd2Ugc2hvdWxkIGRvIGl0IG1hbnVhbGx5Li4uCisgICAgaWYgKCAkXk8gPX4gbS9ebGludXhcei8gKSB7CisgICAgICAgIG15ICRtb2RlID0gKCBzdGF0KCAkc3JjICkgKVsgMiBdCisgICAgICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogY2Fubm90IGdldCBzdGF0dXMgaW5mbyBmb3Igc291cmNlIGZpbGUuIiApOworICAgICAgICBjaG1vZCggJG1vZGUsICRkc3QgKQorICAgICAgICAgICAgb3IgcnVudGltZV9lcnJvciggIiRwcmVmaXg6IGNhbm5vdCBjaGFuZ2UgbW9kZSBvZiBkZXN0aW5hdGlvbiBmaWxlLiIgKTsKKyAgICB9OyAjIGlmCisKK307ICMgc3ViIGNvcHlfZmlsZQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3ViIG1vdmVfZmlsZSgkJEApIHsKKworICAgIG15ICRzcmMgID0gc2hpZnQoIEBfICk7CisgICAgbXkgJGRzdCAgPSBzaGlmdCggQF8gKTsKKyAgICBteSAlb3B0cyA9IEBfOworICAgIG15ICRwcmVmaXggPSAiQ291bGQgbm90IG1vdmUgZmlsZSBcIiRzcmNcIiB0byBcIiRkc3RcIiI7CisKKyAgICBjaGVja19vcHRzKCAlb3B0cywgWyBxdyggLW92ZXJ3cml0ZSApIF0gKTsKKworICAgIGlmICggbm90IC1lICRzcmMgKSB7CisgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiBcIiRzcmNcIiBkb2VzIG5vdCBleGlzdC4iICk7CisgICAgfTsgIyBpZgorICAgIGlmICggbm90IC1mICRzcmMgKSB7CisgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiBcIiRzcmNcIiBpcyBub3QgYSBmaWxlLiIgKTsKKyAgICB9OyAjIGlmCisgICAgaWYgKCAtZSAkZHN0ICkgeworICAgICAgICBpZiAoIC1mICRkc3QgKSB7CisgICAgICAgICAgICBpZiAoICRvcHRzeyAtb3ZlcndyaXRlIH0gKSB7CisgICAgICAgICAgICAgICAgIworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogXCIkZHN0XCIgYWxyZWFkeSBleGlzdHMuIiApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcnVudGltZV9lcnJvciggIiRwcmVmaXg6IFwiJGRzdFwiIGlzIG5vdCBhIGZpbGUuIiApOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorCisgICAgRmlsZTo6Q29weTo6bW92ZSggJHNyYywgJGRzdCApIG9yIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiAkISIgKTsKKworfTsgIyBzdWIgbW92ZV9maWxlCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdWIgZGVsX2ZpbGUoJCkgeworICAgIG15ICRmaWxlcyA9IHNoaWZ0KCBAXyApOworICAgIGlmICggcmVmKCAkZmlsZXMgKSBlcSAiIiApIHsKKyAgICAgICAgJGZpbGVzID0gWyAkZmlsZXMgXTsKKyAgICB9OyAjIGlmCisgICAgZm9yZWFjaCBteSAkZmlsZSAoIEAkZmlsZXMgKSB7CisgICAgICAgIGRlYnVnKCAiRGVsZXRpbmcgZmlsZSBgJGZpbGUnLi4uIiApOworICAgICAgICBteSAkcmMgPSB1bmxpbmsoICRmaWxlICk7CisgICAgICAgIGlmICggJHJjID09IDAgJiYgJCEgIT0gRU5PRU5UICkgeworICAgICAgICAgICAgIyBSZXBvcm4gYW4gZXJyb3IsIGJ1dCBpZ25vcmUgRU5PRU5ULCBiZWNhdXNlIHRoZSBnb2FsIGlzIGFjaGlldmVkLgorICAgICAgICAgICAgcnVudGltZV9lcnJvciggIkRlbGV0aW5nIGZpbGUgYCRmaWxlJyBmYWlsZWQ6ICQhIiApOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBmb3JlYWNoICRmaWxlCit9OyAjIHN1YiBkZWxfZmlsZQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWJhY2sKKworPWN1dAorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgRmlsZSBJL08gc3Vicm91dGluZXMuCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworPWhlYWQyIEZpbGUgSS9PIHN1YnJvdXRpbmVzLgorCis9Y3V0CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9aGVhZDMgcmVhZF9maWxlCisKK0I8U3lub3BzaXM6PgorCisgICAgcmVhZF9maWxlKCAkZmlsZSwgQG9wdGlvbnMgKQorCitCPERlc2NyaXB0aW9uOj4KKworUmVhZCBmaWxlIGFuZCByZXR1cm4gaXRzIGNvbnRlbnQuIEluIHNjYWxhciBjb250ZXh0IGZ1bmN0aW9uIHJldHVybnMgYSBzY2FsYXIsIGluIGxpc3QgY29udGV4dAorZnVuY3Rpb24gcmV0dXJucyBsaXN0IG9mIGxpbmVzLgorCitOb3RlOiBJZiB0aGUgbGFzdCBvZiBmaWxlIGRvZXMgbm90IHRlcm1pbmF0ZSB3aXRoIG5ld2xpbmUsIGZ1bmN0aW9uIHdpbGwgYXBwZW5kIGl0LgorCitCPEFyZ3VtZW50czo+CisKKz1vdmVyCisKKz1pdGVtIEI8JGZpbGU+CisKK0EgbmFtZSBvciBoYW5kbGUgb2YgZmlsZSB0byByZWFkIGZyb20uCisKKz1iYWNrCisKK0I8T3B0aW9uczo+CisKKz1vdmVyCisKKz1pdGVtIEI8LWJpbmFyeT4KKworSWYgdHJ1ZSwgZmlsZSB0cmVhdHMgYXMgYSBiaW5hcnkgZmlsZTogbm8gbmV3bGluZSBjb252ZXJzaW9uLCBubyB0cnVuY2F0aW5nIHRyYWlsaW5nIHNwYWNlLCBubworbmV3bGluZSByZW1vdmluZyBwZXJmb3JtZWQuIEVudGlyZSBmaWxlIHJldHVybmVkIGFzIGEgc2NhbGFyLgorCis9aXRlbSBCPC1idWxrPgorCitUaGlzIG9wdGlvbiBpcyBhbGxvd2VkIG9ubHkgaW4gYmluYXJ5IG1vZGUuIE9wdGlvbidzIHZhbHVlIHNob3VsZCBiZSBhIHJlZmVyZW5jZSB0byBhIHNjYWxhci4KK0lmIG9wdGlvbiBwcmVzZW50LCBmaWxlIGNvbnRlbnQgcGxhY2VkIHRvIHBvaW50ZWUgc2NhbGFyIGFuZCBmdW5jdGlvbiByZXR1cm5zIHRydWUgKDEpLgorCis9aXRlbSBCPC1jaG9tcD4KKworSWYgdHJ1ZSwgbmV3bGluZSBjaGFyYWN0ZXJzIGFyZSByZW1vdmVkIGZyb20gZmlsZSBjb250ZW50LiBCeSBkZWZhdWx0IG5ld2xpbmUgY2hhcmFjdGVycyByZW1haW4uCitUaGlzIG9wdGlvbiBpcyBub3QgYXBwbGljYWJsZSBpbiBiaW5hcnkgbW9kZS4KKworPWl0ZW0gQjwta2VlcF90cmFpbGluZ19zcGFjZT4KKworSWYgdHJ1ZSwgdHJhaW5saW5nIHNwYWNlIHJlbWFpbiBhdCB0aGUgZW5kcyBvZiBsaW5lcy4gQnkgZGVmYXVsdCBhbGwgdHJhaWxpbmcgc3BhY2VzIGFyZSByZW1vdmVkLgorVGhpcyBvcHRpb24gaXMgbm90IGFwcGxpY2FibGUgaW4gYmluYXJ5IG1vZGUuCisKKz1iYWNrCisKK0I8RXhhbXBsZXM6PgorCitSZXR1cm4gZmlsZSBhcyBzaW5nbGUgbGluZSwgcmVtb3ZlIHRyYWlsaW5nIHNwYWNlcy4KKworICAgIG15ICRidWxrID0gcmVhZF9maWxlKCAibWVzc2FnZS50eHQiICk7CisKK1JldHVybiBmaWxlIGFzIGxpc3Qgb2YgbGluZXMgd2l0aCByZW1vdmVkIHRyYWlsaW5nIHNwYWNlIGFuZAorbmV3bGluZSBjaGFyYWN0ZXJzLgorCisgICAgbXkgQGJ1bGsgPSByZWFkX2ZpbGUoICJtZXNzYWdlLnR4dCIsIC1jaG9tcCA9PiAxICk7CisKK1JlYWQgYSBiaW5hcnkgZmlsZToKKworICAgIG15ICRidWxrID0gcmVhZF9maWxlKCAibWVzc2FnZS50eHQiLCAtYmluYXJ5ID0+IDEgKTsKKworUmVhZCBhIGJpZyBiaW5hcnkgZmlsZToKKworICAgIG15ICRidWxrOworICAgIHJlYWRfZmlsZSggImJpZ19iaW5hcnlfZmlsZSIsIC1iaW5hcnkgPT4gMSwgLWJ1bGsgPT4gXCRidWxrICk7CisKK1JlYWQgZnJvbSBzdGFuZGFyZCBpbnB1dDoKKworICAgIG15IEBidWxrID0gcmVhZF9maWxlKCBcKlNURElOICk7CisKKz1jdXQKKworc3ViIHJlYWRfZmlsZSgkQCkgeworCisgICAgbXkgJGZpbGUgPSBzaGlmdCggQF8gKTsgICMgVGhlIG5hbWUgb3IgaGFuZGxlIG9mIGZpbGUgdG8gcmVhZCBmcm9tLgorICAgIG15ICVvcHRzID0gQF87ICAgICAgICAgICAjIE9wdGlvbnMuCisKKyAgICBteSAkbmFtZTsKKyAgICBteSAkaGFuZGxlOworICAgIG15IEBidWxrOworICAgIG15ICRlcnJvciA9IFwmcnVudGltZV9lcnJvcjsKKworICAgIG15IEBiaW5vcHRzID0gcXcoIC1iaW5hcnkgLWVycm9yIC1idWxrICk7ICAgICAgICAgICAgICAgICAgICAgICAjIE9wdGlvbnMgYXZhaWxhYmxlIGluIGJpbmFyeSBtb2RlLgorICAgIG15IEB0eHRvcHRzID0gcXcoIC1iaW5hcnkgLWVycm9yIC1rZWVwX3RyYWlsaW5nX3NwYWNlIC1jaG9tcCAtbGF5ZXIgKTsgIyBPcHRpb25zIGF2YWlsYWJsZSBpbiB0ZXh0IChub24tYmluYXJ5KSBtb2RlLgorICAgIGNoZWNrX29wdHMoICVvcHRzLCBbIEBiaW5vcHRzLCBAdHh0b3B0cyBdICk7CisgICAgaWYgKCAkb3B0c3sgLWJpbmFyeSB9ICkgeworICAgICAgICBjaGVja19vcHRzKCAlb3B0cywgWyBAYmlub3B0cyBdLCAidGhlc2Ugb3B0aW9ucyBjYW5ub3QgYmUgdXNlZCB3aXRoIC1iaW5hcnkiICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2hlY2tfb3B0cyggJW9wdHMsIFsgQHR4dG9wdHMgXSwgInRoZXNlIG9wdGlvbnMgY2Fubm90IGJlIHVzZWQgd2l0aG91dCAtYmluYXJ5IiApOworICAgIH07ICMgaWYKKyAgICBpZiAoIG5vdCBleGlzdHMoICRvcHRzeyAtZXJyb3IgfSApICkgeworICAgICAgICAkb3B0c3sgLWVycm9yIH0gPSAiZXJyb3IiOworICAgIH07ICMgaWYKKyAgICBpZiAoICRvcHRzeyAtZXJyb3IgfSBlcSAid2FybmluZyIgKSB7CisgICAgICAgICRlcnJvciA9IFwmd2FybmluZzsKKyAgICB9IGVsc2lmKCAkb3B0c3sgLWVycm9yIH0gZXEgImlnbm9yZSIgKSB7CisgICAgICAgICRlcnJvciA9IHN1YiB7fTsKKyAgICB9IGVsc2lmICggcmVmKCAkb3B0c3sgLWVycm9yIH0gKSBlcSAiQVJSQVkiICkgeworICAgICAgICAkZXJyb3IgPSBzdWIgeyBwdXNoKCBAeyAkb3B0c3sgLWVycm9yIH0gfSwgJF9bIDAgXSApOyB9OworICAgIH07ICMgaWYKKworICAgIGlmICggKCByZWYoICRmaWxlICkgZXEgIkdMT0IiICkgb3IgVU5JVkVSU0FMOjppc2EoICRmaWxlLCAiSU86OkhhbmRsZSIgKSApIHsKKyAgICAgICAgJG5hbWUgPSAidW5rbm93biI7CisgICAgICAgICRoYW5kbGUgPSAkZmlsZTsKKyAgICB9IGVsc2UgeworICAgICAgICAkbmFtZSA9ICRmaWxlOworICAgICAgICBpZiAoIGdldF9leHQoICRmaWxlICkgZXEgIi5neiIgYW5kIG5vdCAkb3B0c3sgLWJpbmFyeSB9ICkgeworICAgICAgICAgICAgJGhhbmRsZSA9IElPOjpabGliLT5uZXcoICRuYW1lLCAicmIiICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkaGFuZGxlID0gSU86OkZpbGUtPm5ldyggJG5hbWUsICJyIiApOworICAgICAgICB9OyAjIGlmCisgICAgICAgIGlmICggbm90IGRlZmluZWQoICRoYW5kbGUgKSApIHsKKyAgICAgICAgICAgICRlcnJvci0+KCAiRmlsZSBcIiRuYW1lXCIgY291bGQgbm90IGJlIG9wZW5lZCBmb3IgaW5wdXQ6ICQhIiApOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorICAgIGlmICggZGVmaW5lZCggJGhhbmRsZSApICkgeworICAgICAgICBpZiAoICRvcHRzeyAtYmluYXJ5IH0gKSB7CisgICAgICAgICAgICBiaW5tb2RlKCAkaGFuZGxlICk7CisgICAgICAgICAgICBsb2NhbCAkLyA9IHVuZGVmOyAgICMgU2V0IGlucHV0IHJlY29yZCBzZXBhcmF0b3IgdG8gdW5kZWYgdG8gcmVhZCBlbnRpcmUgZmlsZSBhcyBvbmUgbGluZS4KKyAgICAgICAgICAgIGlmICggZXhpc3RzKCAkb3B0c3sgLWJ1bGsgfSApICkgeworICAgICAgICAgICAgICAgICR7ICRvcHRzeyAtYnVsayB9IH0gPSAkaGFuZGxlLT5nZXRsaW5lKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICRidWxrWyAwIF0gPSAkaGFuZGxlLT5nZXRsaW5lKCk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIGRlZmluZWQoICRvcHRzeyAtbGF5ZXIgfSApICkgeworICAgICAgICAgICAgICAgIGJpbm1vZGUoICRoYW5kbGUsICRvcHRzeyAtbGF5ZXIgfSApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgQGJ1bGsgPSAkaGFuZGxlLT5nZXRsaW5lcygpOworICAgICAgICAgICAgIyBTcGVjaWFsIHRyaWNrIGZvciBVVEYtOCBmaWxlczogRGVsZXRlIEJPTSwgaWYgYW55LgorICAgICAgICAgICAgaWYgKCBkZWZpbmVkKCAkb3B0c3sgLWxheWVyIH0gKSBhbmQgJG9wdHN7IC1sYXllciB9IGVxICI6dXRmOCIgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBzdWJzdHIoICRidWxrWyAwIF0sIDAsIDEgKSBlcSAiXHh7RkVGRn0iICkgeworICAgICAgICAgICAgICAgICAgICBzdWJzdHIoICRidWxrWyAwIF0sIDAsIDEgKSA9ICIiOworICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfTsgIyBpZgorICAgICAgICAkaGFuZGxlLT5jbG9zZSgpCisgICAgICAgICAgICBvciAkZXJyb3ItPiggIkZpbGUgXCIkbmFtZVwiIGNvdWxkIG5vdCBiZSBjbG9zZWQgYWZ0ZXIgaW5wdXQ6ICQhIiApOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICggJG9wdHN7IC1iaW5hcnkgfSBhbmQgZXhpc3RzKCAkb3B0c3sgLWJ1bGsgfSApICkgeworICAgICAgICAgICAgJHsgJG9wdHN7IC1idWxrIH0gfSA9ICIiOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorICAgIGlmICggJG9wdHN7IC1iaW5hcnkgfSApIHsKKyAgICAgICAgaWYgKCBleGlzdHMoICRvcHRzeyAtYnVsayB9ICkgKSB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAkYnVsa1sgMCBdOworICAgICAgICB9OyAjIGlmCisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCAoIEBidWxrID4gMCApIGFuZCAoIHN1YnN0ciggJGJ1bGtbIC0xIF0sIC0xLCAxICkgbmUgIlxuIiApICkgeworICAgICAgICAgICAgJGJ1bGtbIC0xIF0gLj0gIlxuIjsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBpZiAoIG5vdCAkb3B0c3sgLWtlZXBfdHJhaWxpbmdfc3BhY2UgfSApIHsKKyAgICAgICAgICAgIG1hcCggJF8gPX4gcy9ccytcblx6L1xuLywgQGJ1bGsgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBpZiAoICRvcHRzeyAtY2hvbXAgfSApIHsKKyAgICAgICAgICAgIGNob21wKCBAYnVsayApOworICAgICAgICB9OyAjIGlmCisgICAgICAgIGlmICggd2FudGFycmF5KCkgKSB7CisgICAgICAgICAgICByZXR1cm4gQGJ1bGs7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gam9pbiggIiIsIEBidWxrICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGlmCisKK307ICMgc3ViIHJlYWRfZmlsZQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWhlYWQzIHdyaXRlX2ZpbGUKKworQjxTeW5vcHNpczo+CisKKyAgICB3cml0ZV9maWxlKCAkZmlsZSwgJGJ1bGssIEBvcHRpb25zICkKKworQjxEZXNjcmlwdGlvbjo+CisKK1dyaXRlIGZpbGUuCisKK0I8QXJndW1lbnRzOj4KKworPW92ZXIKKworPWl0ZW0gQjwkZmlsZT4KKworVGhlIG5hbWUgb3IgaGFuZGxlIG9mIGZpbGUgdG8gd3JpdHRlIHRvLgorCis9aXRlbSBCPCRidWxrPgorCitCdWxrIHRvIHdyaXRlIHRvIGEgZmlsZS4gQ2FuIGJlIGEgc2NhbGFyLCBvciBhIHJlZmVyZW5jZSB0byBzY2FsYXIgb3IgYW4gYXJyYXkuCisKKz1iYWNrCisKK0I8T3B0aW9uczo+CisKKz1vdmVyCisKKz1pdGVtIEI8LWJhY2t1cD4KKworSWYgdHJ1ZSwgY3JlYXRlIGEgYmFja3VwIGNvcHkgb2YgZmlsZSBvdmVyd3JpdHRlbi4gQmFja3VwIGNvcHkgaXMgcGxhY2VkIGludG8gdGhlIHNhbWUgZGlyZWN0b3J5LgorVGhlIG5hbWUgb2YgYmFja3VwIGNvcHkgaXMgdGhlIHNhbWUgYXMgdGhlIG5hbWUgb2YgZmlsZSB3aXRoIGB+JyBhcHBlbmRlZC4gQnkgZGVmYXVsdCBiYWNrdXAgY29weQoraXMgbm90IGNyZWF0ZWQuCisKKz1pdGVtIEI8LWFwcGVuZD4KKworSWYgdHJ1ZSwgdGhlIHRleHQgd2lsbCBiZSBhZGRlZCB0byBleGlzdGluZyBmaWxlLgorCis9YmFjaworCitCPEV4YW1wbGVzOj4KKworICAgIHdyaXRlX2ZpbGUoICJtZXNzYWdlLnR4dCIsIFwkYnVsayApOworICAgICAgICAjIFdyaXRlIGZpbGUsIHRha2UgY29udGVudCBmcm9tIGEgc2NhbGFyLgorCisgICAgd3JpdGVfZmlsZSggIm1lc3NhZ2UudHh0IiwgXEBidWxrLCAtYmFja3VwID0+IDEgKTsKKyAgICAgICAgIyBXcml0ZSBmaWxlLCB0YWtlIGNvbnRlbnQgZnJvbSBhbiBhcnJheSwgY3JlYXRlIGEgYmFja3VwIGNvcHkuCisKKz1jdXQKKworc3ViIHdyaXRlX2ZpbGUoJCRAKSB7CisKKyAgICBteSAkZmlsZSA9IHNoaWZ0KCBAXyApOyAgIyBUaGUgbmFtZSBvciBoYW5kbGUgb2YgZmlsZSB0byB3cml0ZSB0by4KKyAgICBteSAkYnVsayA9IHNoaWZ0KCBAXyApOyAgIyBUaGUgdGV4dCB0byB3cml0ZS4gQ2FuIGJlIHJlZmVyZW5jZSB0byBhcnJheSBvciBzY2FsYXIuCisgICAgbXkgJW9wdHMgPSBAXzsgICAgICAgICAgICMgT3B0aW9ucy4KKworICAgIG15ICRuYW1lOworICAgIG15ICRoYW5kbGU7CisKKyAgICBjaGVja19vcHRzKCAlb3B0cywgWyBxdyggLWFwcGVuZCAtYmFja3VwIC1iaW5hcnkgLWxheWVyICkgXSApOworCisgICAgbXkgJG1vZGUgPSAkb3B0c3sgLWFwcGVuZCB9ID8gImEiOiAidyI7CisgICAgaWYgKCAoIHJlZiggJGZpbGUgKSBlcSAiR0xPQiIgKSBvciBVTklWRVJTQUw6OmlzYSggJGZpbGUsICJJTzo6SGFuZGxlIiApICkgeworICAgICAgICAkbmFtZSA9ICJ1bmtub3duIjsKKyAgICAgICAgJGhhbmRsZSA9ICRmaWxlOworICAgIH0gZWxzZSB7CisgICAgICAgICRuYW1lID0gJGZpbGU7CisgICAgICAgIGlmICggJG9wdHN7IC1iYWNrdXAgfSBhbmQgKCAtZiAkbmFtZSApICkgeworICAgICAgICAgICAgY29weV9maWxlKCAkbmFtZSwgJG5hbWUgLiAifiIsIC1vdmVyd3JpdGUgPT4gMSApOworICAgICAgICB9OyAjIGlmCisgICAgICAgICRoYW5kbGUgPSBJTzo6RmlsZS0+bmV3KCAkbmFtZSwgJG1vZGUgKQorICAgICAgICAgICAgb3IgcnVudGltZV9lcnJvciggIkZpbGUgXCIkbmFtZVwiIGNvdWxkIG5vdCBiZSBvcGVuZWQgZm9yIG91dHB1dDogJCEiICk7CisgICAgfTsgIyBpZgorICAgIGlmICggJG9wdHN7IC1iaW5hcnkgfSApIHsKKyAgICAgICAgYmlubW9kZSggJGhhbmRsZSApOworICAgIH0gZWxzaWYgKCAkb3B0c3sgLWxheWVyIH0gKSB7CisgICAgICAgIGJpbm1vZGUoICRoYW5kbGUsICRvcHRzeyAtbGF5ZXIgfSApOworICAgIH07ICMgaWYKKyAgICBpZiAoIHJlZiggJGJ1bGsgKSBlcSAiIiApIHsKKyAgICAgICAgaWYgKCBkZWZpbmVkKCAkYnVsayApICkgeworICAgICAgICAgICAgJGhhbmRsZS0+cHJpbnQoICRidWxrICk7CisgICAgICAgICAgICBpZiAoIG5vdCAkb3B0c3sgLWJpbmFyeSB9IGFuZCAoIHN1YnN0ciggJGJ1bGssIC0xICkgbmUgIlxuIiApICkgeworICAgICAgICAgICAgICAgICRoYW5kbGUtPnByaW50KCAiXG4iICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH07ICMgaWYKKyAgICB9IGVsc2lmICggcmVmKCAkYnVsayApIGVxICJTQ0FMQVIiICkgeworICAgICAgICBpZiAoIGRlZmluZWQoICQkYnVsayApICkgeworICAgICAgICAgICAgJGhhbmRsZS0+cHJpbnQoICQkYnVsayApOworICAgICAgICAgICAgaWYgKCBub3QgJG9wdHN7IC1iaW5hcnkgfSBhbmQgKCBzdWJzdHIoICQkYnVsaywgLTEgKSBuZSAiXG4iICkgKSB7CisgICAgICAgICAgICAgICAgJGhhbmRsZS0+cHJpbnQoICJcbiIgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfTsgIyBpZgorICAgIH0gZWxzaWYgKCByZWYoICRidWxrICkgZXEgIkFSUkFZIiApIHsKKyAgICAgICAgZm9yZWFjaCBteSAkbGluZSAoIEAkYnVsayApIHsKKyAgICAgICAgICAgIGlmICggZGVmaW5lZCggJGxpbmUgKSApIHsKKyAgICAgICAgICAgICAgICAkaGFuZGxlLT5wcmludCggJGxpbmUgKTsKKyAgICAgICAgICAgICAgICBpZiAoIG5vdCAkb3B0c3sgLWJpbmFyeSB9IGFuZCAoIHN1YnN0ciggJGxpbmUsIC0xICkgbmUgIlxuIiApICkgeworICAgICAgICAgICAgICAgICAgICAkaGFuZGxlLT5wcmludCggIlxuIiApOworICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfTsgIyBmb3JlYWNoCisgICAgfSBlbHNlIHsKKyAgICAgICAgQ2FycDo6Y3JvYWsoICJ3cml0ZV9maWxlOiBcJGJ1bGsgbXVzdCBiZSBhIHNjYWxhciBvciByZWZlcmVuY2UgdG8gKHNjYWxhciBvciBhcnJheSkiICk7CisgICAgfTsgIyBpZgorICAgICRoYW5kbGUtPmNsb3NlKCkKKyAgICAgICAgb3IgcnVudGltZV9lcnJvciggIkZpbGUgXCIkbmFtZVwiIGNvdWxkIG5vdCBiZSBjbG9zZWQgYWZ0ZXIgb3V0cHV0OiAkISIgKTsKKworfTsgIyBzdWIgd3JpdGVfZmlsZQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWN1dAorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgRXhlY3V0aW9uIHN1YnJvdXRpbmVzLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKz1oZWFkMiBFeGVjdXRpb24gc3Vicm91dGluZXMuCisKKz1vdmVyCisKKz1jdXQKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N1YiBfcHJlIHsKKworICAgIG15ICRhcmcgPSBzaGlmdCggQF8gKTsKKworICAgICMgSWYgcmVkaXJlY3Rpb24gaXMgbm90IHJlcXVpcmVkLCBleGl0LgorICAgIGlmICggbm90IGV4aXN0cyggJGFyZy0+eyByZWRpciB9ICkgKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH07ICMgaWYKKworICAgICMgSW5wdXQgcGFyYW1ldGVycy4KKyAgICBteSAkbW9kZSAgID0gJGFyZy0+eyBtb2RlICAgfTsgIyBNb2RlLCAiPCIgKGlucHV0ICkgb3IgIj4iIChvdXRwdXQpLgorICAgIG15ICRoYW5kbGUgPSAkYXJnLT57IGhhbmRsZSB9OyAjIEhhbmRsZSB0byBtYW5pcHVsYXRlLgorICAgIG15ICRyZWRpciAgPSAkYXJnLT57IHJlZGlyICB9OyAjIERhdGEsIGEgZmlsZSBuYW1lIGlmIGEgc2NhbGFyLCBvciBmaWxlIGNvbnRlbnRzLCBpZiBhIHJlZmVyZW5jZS4KKworICAgICMgT3V0cHV0IHBhcmFtZXRlcnMuCisgICAgbXkgJHNhdmVfaGFuZGxlOworICAgIG15ICR0ZW1wX2hhbmRsZTsKKyAgICBteSAkdGVtcF9uYW1lOworCisgICAgIyBTYXZlIG9yaWdpbmFsIGhhbmRsZSAoYnkgZHVwaW5nIGl0KS4KKyAgICAkc2F2ZV9oYW5kbGUgPSBTeW1ib2w6OmdlbnN5bSgpOworICAgICRoYW5kbGUtPmZsdXNoKCk7CisgICAgb3BlbiggJHNhdmVfaGFuZGxlLCAkbW9kZSAuICImIiAuICRoYW5kbGUtPmZpbGVubygpICkKKyAgICAgICAgb3IgZGllKCAiQ2Fubm90IGR1cCBmaWxlaGFuZGxlOiAkISIgKTsKKworICAgICMgUHJlcGFyZSBhIGZpbGUgdG8gSU8uCisgICAgaWYgKCBVTklWRVJTQUw6OmlzYSggJHJlZGlyLCAiSU86OkhhbmRsZSIgKSBvciAoIHJlZiggJHJlZGlyICkgZXEgIkdMT0IiICkgKSB7CisgICAgICAgICMgJHJlZGlyIGlzIHJlZmVyZW5jZSB0byBhbiBvYmplY3Qgb2YgSU86OkhhbmRsZSBjbGFzcyAob3IgaXRzIGRlY2VkYW50KS4KKyAgICAgICAgJHRlbXBfaGFuZGxlID0gJHJlZGlyOworICAgIH0gZWxzaWYgKCByZWYoICRyZWRpciApICkgeworICAgICAgICAjICRyZWRpciBpcyBhIHJlZmVyZW5jZSB0byBjb250ZW50IHRvIGJlIHJlYWQvd3JpdHRlbi4KKyAgICAgICAgIyBQcmVwYXJlIHRlbXAgZmlsZS4KKyAgICAgICAgKCAkdGVtcF9oYW5kbGUsICR0ZW1wX25hbWUgKSA9CisgICAgICAgICAgICBGaWxlOjpUZW1wOjp0ZW1wZmlsZSgKKyAgICAgICAgICAgICAgICAiJHRvb2wuWFhYWFhYWFgiLAorICAgICAgICAgICAgICAgIERJUiAgICA9PiBGaWxlOjpTcGVjLT50bXBkaXIoKSwKKyAgICAgICAgICAgICAgICBTVUZGSVggPT4gIi50bXAiLAorICAgICAgICAgICAgICAgIFVOTElOSyA9PiAxCisgICAgICAgICAgICApOworICAgICAgICBpZiAoIG5vdCBkZWZpbmVkKCAkdGVtcF9oYW5kbGUgKSApIHsKKyAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICJDb3VsZCBub3QgY3JlYXRlIHRlbXAgZmlsZS4iICk7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgaWYgKCAkbW9kZSBlcSAiPCIgKSB7CisgICAgICAgICAgICAjIEl0IGlzIGEgZmlsZSB0byBiZSByZWFkIGJ5IGNoaWxkLCBwcmVwYXJlIGZpbGUgY29udGVudCB0byBiZSByZWFkLgorICAgICAgICAgICAgJHRlbXBfaGFuZGxlLT5wcmludCggcmVmKCAkcmVkaXIgKSBlcSAiU0NBTEFSIiA/ICR7ICRyZWRpciB9IDogQHsgJHJlZGlyIH0gKTsKKyAgICAgICAgICAgICR0ZW1wX2hhbmRsZS0+Zmx1c2goKTsKKyAgICAgICAgICAgIHNlZWsoICR0ZW1wX2hhbmRsZSwgMCwgMCApOworICAgICAgICAgICAgICAgICMgVW5mb3J0dW5hdGVsbHksIEkgY291bGQgbm90IHVzZSBPTyBpbnRlcmZhY2UgdG8gc2Vlay4KKyAgICAgICAgICAgICAgICAjIEFjdGl2ZVBlcmwgNS42LjEgY29tcGxhaW5zIG9uIGJvdGggZm9ybXM6CisgICAgICAgICAgICAgICAgIyAgICAkdGVtcF9oYW5kbGUtPnNlZWsoIDAgKTsgICAgIyBBcyBkZWNsYXJlZCBpbiBJTzo6U2Vla2FibGUuCisgICAgICAgICAgICAgICAgIyAgICAkdGVtcF9oYW5kbGUtPnNldHBvcyggMCApOyAgIyBBcyBkZXNjcmliZWQgaW4gZG9jdW1lbnRhdGlvbi4KKyAgICAgICAgfSBlbHNpZiAoICRtb2RlIGVxICI+IiApIHsKKyAgICAgICAgICAgICMgSXQgaXMgYSBmaWxlIGZvciBvdXRwdXQuIENsZWFyIG91dHB1dCB2YXJpYWJsZS4KKyAgICAgICAgICAgIGlmICggcmVmKCAkcmVkaXIgKSBlcSAiU0NBTEFSIiApIHsKKyAgICAgICAgICAgICAgICAkeyAkcmVkaXIgfSA9ICIiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBAeyAkcmVkaXIgfSA9ICgpOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9OyAjIGlmCisgICAgfSBlbHNlIHsKKyAgICAgICAgIyAkcmVkaXIgaXMgYSBuYW1lIG9mIGZpbGUgdG8gYmUgcmVhZC93cml0dGVuLgorICAgICAgICAjIEp1c3Qgb3BlbiBmaWxlLgorICAgICAgICBpZiAoIGRlZmluZWQoICRyZWRpciApICkgeworICAgICAgICAgICAgJHRlbXBfbmFtZSA9ICRyZWRpcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR0ZW1wX25hbWUgPSBGaWxlOjpTcGVjLT5kZXZudWxsKCk7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgJHRlbXBfaGFuZGxlID0gSU86OkZpbGUtPm5ldyggJHRlbXBfbmFtZSwgJG1vZGUgKQorICAgICAgICAgICAgb3IgcnVudGltZV9lcnJvciggImZpbGUgXCIkdGVtcF9uYW1lXCIgY291bGQgbm90IGJlIG9wZW5lZCBmb3IgIiAuICggJG1vZGUgZXEgIjwiID8gImlucHV0IiA6ICJvdXRwdXQiICkgLiAiOiAkISIgKTsKKyAgICB9OyAjIGlmCisKKyAgICAjIFJlZGlyZWN0IGhhbmRsZSB0byB0ZW1wIGZpbGUuCisgICAgb3BlbiggJGhhbmRsZSwgJG1vZGUgLiAiJiIgLiAkdGVtcF9oYW5kbGUtPmZpbGVubygpICkKKyAgICAgICAgb3IgZGllKCAiQ2Fubm90IGR1cCBmaWxlaGFuZGxlOiAkISIgKTsKKworICAgICMgU2F2ZSBvdXRwdXQgcGFyYW1ldGVycy4KKyAgICAkYXJnLT57IHNhdmVfaGFuZGxlIH0gPSAkc2F2ZV9oYW5kbGU7CisgICAgJGFyZy0+eyB0ZW1wX2hhbmRsZSB9ID0gJHRlbXBfaGFuZGxlOworICAgICRhcmctPnsgdGVtcF9uYW1lICAgfSA9ICR0ZW1wX25hbWU7CisKK307ICMgc3ViIF9wcmUKKworCitzdWIgX3Bvc3QgeworCisgICAgbXkgJGFyZyA9IHNoaWZ0KCBAXyApOworCisgICAgIyBJbnB1dCBwYXJhbWV0ZXJzLgorICAgIG15ICRtb2RlICAgPSAkYXJnLT57IG1vZGUgICB9OyAjIE1vZGUsICI8IiBvciAiPiIuCisgICAgbXkgJGhhbmRsZSA9ICRhcmctPnsgaGFuZGxlIH07ICMgSGFuZGxlIHRvIHNhdmUgYW5kIHNldC4KKyAgICBteSAkcmVkaXIgID0gJGFyZy0+eyByZWRpciAgfTsgIyBEYXRhLCBhIGZpbGUgbmFtZSBpZiBhIHNjYWxhciwgb3IgZmlsZSBjb250ZW50cywgaWYgYSByZWZlcmVuY2UuCisKKyAgICAjIFBhcmFtZXRlcnMgc2F2ZWQgZHVyaW5nIHByZXByb2Nlc3NpbmcuCisgICAgbXkgJHNhdmVfaGFuZGxlID0gJGFyZy0+eyBzYXZlX2hhbmRsZSB9OworICAgIG15ICR0ZW1wX2hhbmRsZSA9ICRhcmctPnsgdGVtcF9oYW5kbGUgfTsKKyAgICBteSAkdGVtcF9uYW1lICAgPSAkYXJnLT57IHRlbXBfbmFtZSAgIH07CisKKyAgICAjIElmIG5vIGhhbmRsZSB3YXMgc2F2ZWQsIGV4aXQuCisgICAgaWYgKCBub3QgJHNhdmVfaGFuZGxlICkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9OyAjIGlmCisKKyAgICAjIENsb3NlIGhhbmRsZS4KKyAgICAkaGFuZGxlLT5jbG9zZSgpCisgICAgICAgIG9yIGRpZSggIiQhIiApOworCisgICAgIyBSZWFkIHRoZSBjb250ZW50IG9mIHRlbXAgZmlsZSwgaWYgbmVjZXNzYXJ5LCBhbmQgY2xvc2UgdGVtcCBmaWxlLgorICAgIGlmICggKCAkbW9kZSBuZSAiPCIgKSBhbmQgcmVmKCAkcmVkaXIgKSApIHsKKyAgICAgICAgJHRlbXBfaGFuZGxlLT5mbHVzaCgpOworICAgICAgICBzZWVrKCAkdGVtcF9oYW5kbGUsIDAsIDAgKTsKKyAgICAgICAgaWYgKCAkXk8gPX4gbS9NU1dpbi8gKSB7CisgICAgICAgICAgICBiaW5tb2RlKCAkdGVtcF9oYW5kbGUsICI6Y3JsZiIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBpZiAoIHJlZiggJHJlZGlyICkgZXEgIlNDQUxBUiIgKSB7CisgICAgICAgICAgICAkeyAkcmVkaXIgfSAuPSBqb2luKCAiIiwgJHRlbXBfaGFuZGxlLT5nZXRsaW5lcygpICk7CisgICAgICAgIH0gZWxzaWYgKCByZWYoICRyZWRpciApIGVxICJBUlJBWSIgKSB7CisgICAgICAgICAgICBwdXNoKCBAeyAkcmVkaXIgfSwgJHRlbXBfaGFuZGxlLT5nZXRsaW5lcygpICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGlmCisgICAgaWYgKCBub3QgVU5JVkVSU0FMOjppc2EoICRyZWRpciwgIklPOjpIYW5kbGUiICkgKSB7CisgICAgICAgICR0ZW1wX2hhbmRsZS0+Y2xvc2UoKQorICAgICAgICAgICAgb3IgZGllKCAiJCEiICk7CisgICAgfTsgIyBpZgorCisgICAgIyBSZXN0b3JlIGhhbmRsZSB0byBvcmlnaW5hbCB2YWx1ZS4KKyAgICAkc2F2ZV9oYW5kbGUtPmZsdXNoKCk7CisgICAgb3BlbiggJGhhbmRsZSwgJG1vZGUgLiAiJiIgLiAkc2F2ZV9oYW5kbGUtPmZpbGVubygpICkKKyAgICAgICAgb3IgZGllKCAiQ2Fubm90IGR1cCBmaWxlaGFuZGxlOiAkISIgKTsKKworICAgICMgQ2xvc2Ugc2F2ZSBoYW5kbGUuCisgICAgJHNhdmVfaGFuZGxlLT5jbG9zZSgpCisgICAgICAgIG9yIGRpZSggIiQhIiApOworCisgICAgIyBEZWxldGUgcGFyYW1ldGVycyBzYXZlZCBkdXJpbmcgcHJlcHJvY2Vzc2luZy4KKyAgICBkZWxldGUoICRhcmctPnsgc2F2ZV9oYW5kbGUgfSApOworICAgIGRlbGV0ZSggJGFyZy0+eyB0ZW1wX2hhbmRsZSB9ICk7CisgICAgZGVsZXRlKCAkYXJnLT57IHRlbXBfbmFtZSAgIH0gKTsKKworfTsgIyBzdWIgX3Bvc3QKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1pdGVtIEM8ZXhlY3V0ZSggWyBAY29tbWFuZCBdLCBAb3B0aW9ucyApPgorCitFeGVjdXRlIHNwZWNpZmllZCBwcm9ncmFtIG9yIHNoZWxsIGNvbW1hbmQuCisKK1Byb2dyYW0gaXMgc3BlY2lmaWVkIGJ5IHJlZmVyZW5jZSB0byBhbiBhcnJheSwgdGhhdCBhcnJheSBpcyBwYXNzZWQgdG8gQzxzeXN0ZW0oKT4gZnVuY3Rpb24gd2hpY2gKK2V4ZWN1dGVzIHRoZSBjb21tYW5kLiBTZWUgTDxwZXJsZnVuYz4gZm9yIGRldGFpbHMgaG93IEM8c3lzdGVtKCk+IGludGVycHJldHMgdmFyaW91cyBmb3JtcyBvZgorQzxAY29tbWFuZD4uCisKK0J5IGRlZmF1bHQsIGluIGNhc2Ugb2YgYW55IGVycm9yIGVycm9yIG1lc3NhZ2UgaXMgaXNzdWVkIGFuZCBzY3JpcHQgdGVybWluYXRlZCAoYnkgcnVudGltZV9lcnJvcigpKS4KK0Z1bmN0aW9uIHJldHVybnMgYW4gZXhpdCBjb2RlIG9mIHByb2dyYW0uCisKK0FsdGVybmF0aXZlbHksIGhlIGZ1bmN0aW9uIG1heSByZXR1cm4gZXhpdCBzdGF0dXMgb2YgdGhlIHByb2dyYW0gKHNlZSBDPC1pZ25vcmVfc3RhdHVzPikgb3Igc2lnbmFsCisoc2VlIEM8LWlnbm9yZV9zaWduYWw+KSBzbyBjYWxsZXIgbWF5IGFuYWx5emUgaXQgYW5kIGNvbnRpbnVlIGV4ZWN1dGlvbi4KKworT3B0aW9uczoKKworPW92ZXIKKworPWl0ZW0gQzwtc3RkaW4+CisKK1JlZGlyZWN0IHN0ZGluIG9mIHByb2dyYW0uIFRoZSB2YWx1ZSBvZiBvcHRpb24gY2FuIGJlOgorCis9b3ZlcgorCis9aXRlbSBDPHVuZGVmPgorCitTdGRpbiBvZiBjaGlsZCBpcyBhdHRhY2hlZCB0byBudWxsIGRldmljZS4KKworPWl0ZW0gYSBzdHJpbmcKKworU3RkaW4gb2YgY2hpbGQgaXMgYXR0YWNoZWQgdG8gYSBmaWxlIHdpdGggbmFtZSBzcGVjaWZpZWQgYnkgb3B0aW9uLgorCis9aXRlbSBhIHJlZmVyZW5jZSB0byBhIHNjYWxhcgorCitBIGRlcmVmZXJlbmNlZCBzY2FsYXIgaXMgd3JpdHRlbiB0byBhIHRlbXAgZmlsZSwgYW5kIGNoaWxkJ3Mgc3RkaW4gaXMgYXR0YWNoZWQgdG8gdGhhdCBmaWxlLgorCis9aXRlbSBhIHJlZmVyZW5jZSB0byBhbiBhcnJheQorCitBIGRlcmVmZXJlbmNlZCBhcnJheSBpcyB3cml0dGVuIHRvIGEgdGVtcCBmaWxlLCBhbmQgY2hpbGQncyBzdGRpbiBpcyBhdHRhY2hlZCB0byB0aGF0IGZpbGUuCisKKz1iYWNrCisKKz1pdGVtIEM8LXN0ZG91dD4KKworUmVkaXJlY3Qgc3Rkb3V0LiBQb3NzaWJsZSB2YWx1ZXMgYXJlIHRoZSBzYW1lIGFzIGZvciBDPC1zdGRpbj4gb3B0aW9uLiBUaGUgb25seSBkaWZmZXJlbmNlIGlzCityZWZlcmVuY2Ugc3BlY2lmaWVzIGEgdmFyaWFibGUgcmVjZWl2aW5nIHByb2dyYW0ncyBvdXRwdXQuCisKKz1pdGVtIEM8LXN0ZGVycj4KKworSXQgc2ltaWxhciB0byBDPC1zdGRvdXQ+LCBidXQgcmVkaXJlY3RzIHN0ZGVyci4gVGhlcmUgaXMgb25seSBvbmUgYWRkaXRpb25hbCB2YWx1ZToKKworPW92ZXIKKworPWl0ZW0gYW4gZW1wdHkgc3RyaW5nCisKK21lYW5zIHRoYXQgc3RkZXJyIHNob3VsZCBiZSByZWRpcmVjdGVkIHRvIHRoZSBzYW1lIHBsYWNlIHdoZXJlIHN0ZG91dCBpcyByZWRpcmVjdGVkIHRvLgorCis9YmFjaworCis9aXRlbSBDPC1hcHBlbmQ+CisKK1JlZGlyZWN0ZWQgc3RyZWFtIHdpbGwgbm90IG92ZXJ3cml0ZSBwcmV2aW91cyBjb250ZW50IG9mIGZpbGUgKG9yIHZhcmlhYmxlKS4KK05vdGUsIHRoYXQgb3B0aW9uIGFmZmVjdHMgYm90aCBzdGRvdXQgYW5kIHN0ZGVyci4KKworPWl0ZW0gQzwtaWdub3JlX3N0YXR1cz4KKworQnkgZGVmYXVsdCwgc3Vicm91dGluZSByYWlzZXMgYW4gZXJyb3IgYW5kIGV4aXRzIHRoZSBzY3JpcHQgaWYgcHJvZ3JhbSByZXR1cm5zIG5vbi1leGl0IHN0YXR1cy4gSWYKK3RoaXMgb3B0aW9ucyBpcyB0cnVlLCBubyBlcnJvciBpcyByYWlzZWQuIEluc3RlYWQsIHN0YXR1cyBpcyByZXR1cm5lZCBhcyBmdW5jdGlvbiByZXN1bHQgKGFuZCAkQCBpcworc2V0IHRvIGVycm9yIG1lc3NhZ2UpLgorCis9aXRlbSBDPC1pZ25vcmVfc2lnbmFsPgorCitCeSBkZWZhdWx0LCBzdWJyb3V0aW5lIHJhaXNlcyBhbiBlcnJvciBhbmQgZXhpdHMgdGhlIHNjcmlwdCBpZiBwcm9ncmFtIGRpZSB3aXRoIHNpZ25hbC4gSWYKK3RoaXMgb3B0aW9ucyBpcyB0cnVlLCBubyBlcnJvciBpcyByYWlzZWQgaW4gc3VjaCBhIGNhc2UuIEluc3RlYWQsIHNpZ25hbCBudW1iZXIgaXMgcmV0dXJuZWQgKGFzCituZWdhdGl2ZSB2YWx1ZSksIGVycm9yIG1lc3NhZ2UgaXMgcGxhY2VkIHRvIEM8JEA+IHZhcmlhYmxlLgorCitJZiBjb21tYW5kIGlzIG5vdCBldmVuIHN0YXJ0ZWQsIC0yNTYgaXMgcmV0dXJuZWQuCisKKz1iYWNrCisKK0V4YW1wbGVzOgorCisgICAgZXhlY3V0ZSggWyAiY21kLmV4ZSIsICIvYyIsICJkaXIiIF0gKTsKKyAgICAgICAgIyBFeGVjdXRlIE5UIHNoZWxsIHdpdGggc3BlY2lmaWVkIG9wdGlvbnMsIG5vIHJlZGlyZWN0aW9ucyBhcmUKKyAgICAgICAgIyBtYWRlLgorCisgICAgbXkgJG91dHB1dDsKKyAgICBleGVjdXRlKCBbICJjdnMiLCAiLW4iLCAiLXEiLCAidXBkYXRlIiwgIi4iIF0sIC1zdGRvdXQgPT4gXCRvdXRwdXQgKTsKKyAgICAgICAgIyBFeGVjdXRlICJjdnMgLW4gLXEgdXBkYXRlIC4iIGNvbW1hbmQsIG91dHB1dCBpcyBzYXZlZAorICAgICAgICAjIGluICRvdXRwdXQgdmFyaWFibGUuCisKKyAgICBteSBAb3V0cHV0OworICAgIGV4ZWN1dGUoIFsgcXcoIGN2cyAtbiAtcSB1cGRhdGUgLiApIF0sIC1zdGRvdXQgPT4gXEBvdXRwdXQsIC1zdGRlcnIgPT4gdW5kZWYgKTsKKyAgICAgICAgIyBFeGVjdXRlIHNwZWNpZmllZCBjb21tYW5kLCAgb3V0cHV0IGlzIHNhdmVkIGluIEBvdXRwdXQKKyAgICAgICAgIyB2YXJpYWJsZSwgc3RkZXJyIHN0cmVhbSBpcyByZWRpcmVjdGVkIHRvIG51bGwgZGV2aWNlCisgICAgICAgICMgKC9kZXYvbnVsbCBpbiBMaW51eCogT1MgYW4gbnVsIGluIFdpbmRvd3MqIE9TKS4KKworPWN1dAorCitzdWIgZXhlY3V0ZSgkQCkgeworCisgICAgIyAhISEgQWRkIHNvbWV0aGluZyB0byBjb21wbGFpbiBvbiB1bmtub3duIG9wdGlvbnMuLi4KKworICAgIG15ICRjb21tYW5kID0gc2hpZnQoIEBfICk7CisgICAgbXkgJW9wdHMgICAgPSBAXzsKKyAgICBteSAkcHJlZml4ICA9ICJDb3VsZCBub3QgZXhlY3V0ZSAkY29tbWFuZC0+WyAwIF0iOworCisgICAgY2hlY2tfb3B0cyggJW9wdHMsIFsgcXcoIC1zdGRpbiAtc3Rkb3V0IC1zdGRlcnIgLWFwcGVuZCAtaWdub3JlX3N0YXR1cyAtaWdub3JlX3NpZ25hbCApIF0gKTsKKworICAgIGlmICggcmVmKCAkY29tbWFuZCApIG5lICJBUlJBWSIgKSB7CisgICAgICAgIENhcnA6OmNyb2FrKCAiZXhlY3V0ZTogJGNvbW1hbmQgbXVzdCBiZSBhIHJlZmVyZW5jZSB0byBhcnJheSIgKTsKKyAgICB9OyAjIGlmCisKKyAgICBteSAkc3RkaW4gID0geyBoYW5kbGUgPT4gXCpTVERJTiwgIG1vZGUgPT4gIjwiIH07CisgICAgbXkgJHN0ZG91dCA9IHsgaGFuZGxlID0+IFwqU1RET1VULCBtb2RlID0+ICI+IiB9OworICAgIG15ICRzdGRlcnIgPSB7IGhhbmRsZSA9PiBcKlNUREVSUiwgbW9kZSA9PiAiPiIgfTsKKyAgICBteSAkc3RyZWFtcyA9IHsKKyAgICAgICAgc3RkaW4gID0+ICRzdGRpbiwKKyAgICAgICAgc3Rkb3V0ID0+ICRzdGRvdXQsCisgICAgICAgIHN0ZGVyciA9PiAkc3RkZXJyCisgICAgfTsgIyAkc3RyZWFtcworCisgICAgZm9yIG15ICRzdHJlYW0gKCBxdyggc3RkaW4gc3Rkb3V0IHN0ZGVyciApICkgeworICAgICAgICBpZiAoIGV4aXN0cyggJG9wdHN7ICItJHN0cmVhbSIgfSApICkgeworICAgICAgICAgICAgaWYgKCByZWYoICRvcHRzeyAiLSRzdHJlYW0iIH0gKSAhfiBtL1xBKHxTQ0FMQVJ8QVJSQVkpXHovICkgeworICAgICAgICAgICAgICAgIENhcnA6OmNyb2FrKCAiZXhlY3V0ZTogLSRzdHJlYW0gb3B0aW9uOiBtdXN0IGhhdmUgdmFsdWUgb2Ygc2NhbGFyLCBvciByZWZlcmVuY2UgdG8gKHNjYWxhciBvciBhcnJheSkuIiApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgJHN0cmVhbXMtPnsgJHN0cmVhbSB9LT57IHJlZGlyIH0gPSAkb3B0c3sgIi0kc3RyZWFtIiB9OworICAgICAgICB9OyAjIGlmCisgICAgICAgIGlmICggJG9wdHN7IC1hcHBlbmQgfSBhbmQgKCAkc3RyZWFtcy0+eyAkc3RyZWFtIH0tPnsgbW9kZSB9ICkgZXEgIj4iICkgeworICAgICAgICAgICAgJHN0cmVhbXMtPnsgJHN0cmVhbSB9LT57IG1vZGUgfSA9ICI+PiI7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGZvcmVhY2ggJHN0cmVhbQorCisgICAgX3ByZSggJHN0ZGluICApOworICAgIF9wcmUoICRzdGRvdXQgKTsKKyAgICBpZiAoIGRlZmluZWQoICRzdGRlcnItPnsgcmVkaXIgfSApIGFuZCBub3QgcmVmKCAkc3RkZXJyLT57IHJlZGlyIH0gKSBhbmQgKCAkc3RkZXJyLT57IHJlZGlyIH0gZXEgIiIgKSApIHsKKyAgICAgICAgaWYgKCBleGlzdHMoICRzdGRvdXQtPnsgcmVkaXIgfSApICkgeworICAgICAgICAgICAgJHN0ZGVyci0+eyByZWRpciB9ID0gJHN0ZG91dC0+eyB0ZW1wX2hhbmRsZSB9OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHN0ZGVyci0+eyByZWRpciB9ID0gJHsgJHN0ZG91dC0+eyBoYW5kbGUgfSB9OworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorICAgIF9wcmUoICRzdGRlcnIgKTsKKyAgICBteSAkcmMgPSBzeXN0ZW0oIEAkY29tbWFuZCApOworICAgIG15ICRlcnJubyA9ICQhOworICAgIG15ICRjaGlsZCA9ICQ/OworICAgIF9wb3N0KCAkc3RkZXJyICk7CisgICAgX3Bvc3QoICRzdGRvdXQgKTsKKyAgICBfcG9zdCggJHN0ZGluICApOworCisgICAgbXkgJGV4aXQgPSAwOworICAgIG15ICRzaWduYWxfbnVtICA9ICRjaGlsZCAmIDEyNzsKKyAgICBteSAkZXhpdF9zdGF0dXMgPSAkY2hpbGQgPj4gODsKKyAgICAkQCA9ICIiOworCisgICAgaWYgKCAkcmMgPT0gLTEgKSB7CisgICAgICAgICRAID0gIlwiJGNvbW1hbmQtPlsgMCBdXCIgZmFpbGVkOiAkZXJybm8iOworICAgICAgICAkZXhpdCA9IC0yNTY7CisgICAgICAgIGlmICggbm90ICRvcHRzeyAtaWdub3JlX3NpZ25hbCB9ICkgeworICAgICAgICAgICAgcnVudGltZV9lcnJvciggJEAgKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH0gZWxzaWYgKCAkc2lnbmFsX251bSAhPSAwICkgeworICAgICAgICAkQCA9ICJcIiRjb21tYW5kLT5bIDAgXVwiIGZhaWxlZCBkdWUgdG8gc2lnbmFsICRzaWduYWxfbnVtLiI7CisgICAgICAgICRleGl0ID0gLSAkc2lnbmFsX251bTsKKyAgICAgICAgaWYgKCBub3QgJG9wdHN7IC1pZ25vcmVfc2lnbmFsIH0gKSB7CisgICAgICAgICAgICBydW50aW1lX2Vycm9yKCAkQCApOworICAgICAgICB9OyAjIGlmCisgICAgfSBlbHNpZiAoICRleGl0X3N0YXR1cyAhPSAwICkgeworICAgICAgICAkQCA9ICJcIiRjb21tYW5kLT5bIDAgXVwiIHJldHVybmVkIG5vbi16ZXJvIHN0YXR1cyAkZXhpdF9zdGF0dXMuIjsKKyAgICAgICAgJGV4aXQgPSAkZXhpdF9zdGF0dXM7CisgICAgICAgIGlmICggbm90ICRvcHRzeyAtaWdub3JlX3N0YXR1cyB9ICkgeworICAgICAgICAgICAgcnVudGltZV9lcnJvciggJEAgKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKworICAgIHJldHVybiAkZXhpdDsKKworfTsgIyBzdWIgZXhlY3V0ZQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWl0ZW0gQzxiYWNrdGlja3MoIFsgQGNvbW1hbmQgXSwgQG9wdGlvbnMgKT4KKworUnVuIHNwZWNpZmllZCBwcm9ncmFtIG9yIHNoZWxsIGNvbW1hbmQgYW5kIHJldHVybiBvdXRwdXQuCisKK0luIHNjYWxhciBjb250ZXh0IGVudGlyZSBvdXRwdXQgaXMgcmV0dXJuZWQgaW4gYSBzaW5nbGUgc3RyaW5nLiBJbiBsaXN0IGNvbnRleHQgbGlzdCBvZiBzdHJpbmdzCitpcyByZXR1cm5lZC4gRnVuY3Rpb24gaXNzdWVzIGFuIGVycm9yIGFuZCBleGl0cyBzY3JpcHQgaWYgYW55IGVycm9yIG9jY3Vycy4KKworPWN1dAorCisKK3N1YiBiYWNrdGlja3MoJEApIHsKKworICAgIG15ICRjb21tYW5kID0gc2hpZnQoIEBfICk7CisgICAgbXkgJW9wdHMgICAgPSBAXzsKKyAgICBteSBAb3V0cHV0OworCisgICAgY2hlY2tfb3B0cyggJW9wdHMsIFsgcXcoIC1jaG9tcCApIF0gKTsKKworICAgIGV4ZWN1dGUoICRjb21tYW5kLCAtc3Rkb3V0ID0+IFxAb3V0cHV0ICk7CisKKyAgICBpZiAoICRvcHRzeyAtY2hvbXAgfSApIHsKKyAgICAgICAgY2hvbXAoIEBvdXRwdXQgKTsKKyAgICB9OyAjIGlmCisKKyAgICByZXR1cm4gKCB3YW50YXJyYXkoKSA/IEBvdXRwdXQgOiBqb2luKCAiIiwgQG91dHB1dCApICk7CisKK307ICMgc3ViIGJhY2t0aWNrcworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3ViIHBhZCgkJCQpIHsKKyAgICBteSAoICRzdHIsICRsZW5ndGgsICRwYWQgKSA9IEBfOworICAgIG15ICRsc3RyID0gbGVuZ3RoKCAkc3RyICk7ICAgICMgTGVuZ3RoIG9mIHNvdXJjZSBzdHJpbmcuCisgICAgaWYgKCAkbHN0ciA8ICRsZW5ndGggKSB7CisgICAgICAgIG15ICRscGFkICA9IGxlbmd0aCggJHBhZCApOyAgICAgICAgICAgICAgICAgICAgICAgICAjIExlbmd0aCBvZiBwYWQuCisgICAgICAgIG15ICRjb3VudCA9IGludCggKCAkbGVuZ3RoIC0gJGxzdHIgKSAvICRscGFkICk7ICAgICAjIE51bWJlciBvZiBwYWQgcmVwZXRpdGlvbnMuCisgICAgICAgIG15ICR0YWlsICA9ICRsZW5ndGggLSAoICRsc3RyICsgJGxwYWQgKiAkY291bnQgKTsKKyAgICAgICAgJHN0ciA9ICRzdHIgLiAoICRwYWQgeCAkY291bnQgKSAuIHN1YnN0ciggJHBhZCwgMCwgJHRhaWwgKTsKKyAgICB9OyAjIGlmCisgICAgcmV0dXJuICRzdHI7Cit9OyAjIHN1YiBwYWQKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9YmFjaworCis9Y3V0CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCityZXR1cm4gMTsKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1jdXQKKworIyBFbmQgb2YgZmlsZS4KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdG9vbHMvbWVzc2FnZS1jb252ZXJ0ZXIucGwgYi9maW5hbC9ydW50aW1lL3Rvb2xzL21lc3NhZ2UtY29udmVydGVyLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY0ZjRiOTkKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rvb2xzL21lc3NhZ2UtY29udmVydGVyLnBsCkBAIC0wLDAgKzEsNzc1IEBACisjIS91c3IvYmluL3BlcmwKKworIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgRmlsZTo6R2xvYiAiOmdsb2IiOwordXNlIEVuY29kZSBxd3sgZW5jb2RlIH07CisKK3VzZSBGaW5kQmluOwordXNlIGxpYiAiJEZpbmRCaW46OkJpbi9saWIiOworCit1c2UgdG9vbHM7Cit1c2UgUGxhdGZvcm0gIjp2YXJzIjsKKworb3VyICRWRVJTSU9OID0gIjAuMDQiOworbXkgJGVzY2FwZSAgICAgID0gcXJ7JX07CitteSAkcGxhY2Vob2xkZXIgPSBxcnsoXGQpXCQoc3xsP1tkdV0pfTsKKworbXkgJHNlY3Rpb25zID0KKyAgICB7CisgICAgICAgIG1ldGEgICAgID0+IHsgc2hvcnQgPT4gInBycCIgfSwgIyAicHJwIiBzdGFuZHMgZm9yICJwcm9wZXJ0eSIuCisgICAgICAgIHN0cmluZ3MgID0+IHsgc2hvcnQgPT4gInN0ciIgfSwKKyAgICAgICAgZm9ybWF0cyAgPT4geyBzaG9ydCA9PiAiZm10IiB9LAorICAgICAgICBtZXNzYWdlcyA9PiB7IHNob3J0ID0+ICJtc2ciIH0sCisgICAgICAgIGhpbnRzICAgID0+IHsgc2hvcnQgPT4gImhudCIgfSwKKyAgICB9OworbXkgQHNlY3Rpb25zID0gcXd7IG1ldGEgc3RyaW5ncyBmb3JtYXRzIG1lc3NhZ2VzIGhpbnRzIH07CisjIEFzc2lnbiBzZWN0aW9uIHByb3BlcnRpZXM6IGxvbmcgbmFtZSwgc2V0IG51bWJlciwgYmFzZSBudW1iZXIuCittYXAoICRzZWN0aW9ucy0+eyAkc2VjdGlvbnNbICRfIF0gfS0+eyBsb25nIH0gPSAkc2VjdGlvbnNbICRfIF0sICAgICAgKCAwIC4uIEBzZWN0aW9ucyAtIDEgKSApOworbWFwKCAkc2VjdGlvbnMtPnsgJHNlY3Rpb25zWyAkXyBdIH0tPnsgc2V0ICB9ID0gKCAkXyArIDEgKSwgICAgICAgICAgICggMCAuLiBAc2VjdGlvbnMgLSAxICkgKTsKK21hcCggJHNlY3Rpb25zLT57ICRzZWN0aW9uc1sgJF8gXSB9LT57IGJhc2UgfSA9ICggKCAkXyArIDEgKSA8PCAxNiApLCAoIDAgLi4gQHNlY3Rpb25zIC0gMSApICk7CisKKyMgUHJvcGVydGllcyBvZiBNZXRhIHNlY3Rpb24uCitteSBAcHJvcGVydGllcyA9IHF3eyBMYW5ndWFnZSBDb3VudHJ5IExhbmdJZCBWZXJzaW9uIFJldmlzaW9uIH07CisKKworc3ViIF9nZW5lcmF0ZV9jb21tZW50KCQkJCkgeworCisgICAgbXkgKCAkZGF0YSwgJG9wZW4sICRjbG9zZSApID0gQF87CisgICAgbXkgJGJ1bGsgPQorICAgICAgICAkb3BlbiAuICIgRG8gbm90IGVkaXQgdGhpcyBmaWxlISAiIC4gJGNsb3NlIC4gIlxuIiAuCisgICAgICAgICRvcGVuIC4gIiBUaGUgZmlsZSB3YXMgZ2VuZXJhdGVkIGZyb20gIiAuIGdldF9maWxlKCAkZGF0YS0+eyAiJW1ldGEiIH0tPnsgc291cmNlIH0gKSAuCisgICAgICAgICAgICAiIGJ5ICIgLiAkdG9vbCAuICIgb24gIiAuIGxvY2FsdGltZSgpIC4gIi4gIiAuICRjbG9zZSAuICJcbiI7CisgICAgcmV0dXJuICRidWxrOworCit9OyAjIHN1YiBfZ2VuZXJhdGVfY29tbWVudAorCisKK3N1YiBtc2cyc2duKCQpIHsKKworICAgICMgQ29udmVydCBtZXNzYWdlIHN0cmluZyB0byBzaWduYXR1cmUuIFNpZ25hdHVyZSBpcyBhIGxpc3Qgb2YgcGxhY2Vob2xkZXJzIGluIHNvcnRlZCBvcmRlci4KKyAgICAjIEZvciBleGFtcGxlLCBzaWduYXR1cmUgb2YgIiUxJHMgdmFsdWUgXCIlMiRzXCIgaXMgaW52YWxpZC4iIGlzICIlMSRzICUyJHMiLgorCisgICAgbXkgKCAkbXNnICkgPSBAXzsKKyAgICBteSBAcGxhY2Vob2xkZXJzOworICAgIHBvcyggJG1zZyApID0gMDsKKyAgICB3aGlsZSAoICRtc2cgPX4gbXtcRy4qPyRlc2NhcGUkcGxhY2Vob2xkZXJ9ZyApIHsKKyAgICAgICAgJHBsYWNlaG9sZGVyc1sgJDEgLSAxIF0gPSAiJSQxXCQkMiI7CisgICAgfTsgIyB3aGlsZQorICAgIGZvciAoIG15ICRpID0gMTsgJGkgPD0gQHBsYWNlaG9sZGVyczsgKysgJGkgKSB7CisgICAgICAgIGlmICggbm90IGRlZmluZWQoICRwbGFjZWhvbGRlcnNbICRpIC0gMSBdICkgKSB7CisgICAgICAgICAgICAkcGxhY2Vob2xkZXJzWyAkaSAtIDEgXSA9ICIlJGlcJC0iOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBmb3IgJGkKKyAgICByZXR1cm4gam9pbiggIiAiLCBAcGxhY2Vob2xkZXJzICk7CisKK307ICMgc3ViIG1zZzJzZ24KKworCitzdWIgbXNnMnNyYygkKSB7CisKKyAgICAjIENvbnZlcnQgbWVzc2FnZSBzdHJpbmcgdG8gYSBDIHN0cmluZyBjb25zdGFudC4KKworICAgIG15ICggJG1zZyApID0gQF87CisgICAgaWYgKCAkdGFyZ2V0X29zIGVxICJ3aW4iICkgeworICAgICAgICAkbXNnID1+IHN7JGVzY2FwZSRwbGFjZWhvbGRlcn17XCUkMSEkMiF9ZzsKKyAgICB9OyAjIGlmCisgICAgcmV0dXJuICRtc2c7CisKK307ICMgc3ViIG1zZzJzcmMKKworCitteSAkc3BlY2lhbCA9CisgICAgeworICAgICAgICAibiIgPT4gIlxuIiwKKyAgICAgICAgInQiID0+ICJcdCIsCisgICAgfTsKKworc3ViIG1zZzJtYygkKSB7CisgICAgbXkgKCAkbXNnICkgPSBAXzsKKyAgICAkbXNnID0gbXNnMnNyYyggJG1zZyApOyAjIEdldCB3aW5kb3dzIHN0eWxlIHBsYWNlaG9sZGVycy4KKyAgICAkbXNnID1+IHN7XFwoLil9eyBleGlzdHMoICRzcGVjaWFsLT57ICQxIH0gKSA/ICRzcGVjaWFsLT57ICQxIH0gOiAkMSB9Z2U7CisgICAgcmV0dXJuICRtc2c7Cit9OyAjIHN1YiBtc2cybWMKKworCisKK3N1YiBwYXJzZV9tZXNzYWdlKCQpIHsKKworICAgIG15ICggJG1zZyApID0gQF87CisgICAgcG9zKCAkbXNnICkgPSAwOworICAgIGZvciAoIDsgOyApIHsKKyAgICAgICAgaWYgKCAkbXNnICF+IG17XEcuKj8kZXNjYXBlfWdjICkgeworICAgICAgICAgICAgbGFzdDsKKyAgICAgICAgfQorICAgICAgICBpZiAoICRtc2cgIX4gbXtcRyRwbGFjZWhvbGRlcn1nYyApIHsKKyAgICAgICAgICAgIHJldHVybiAiQmFkICUtc2VxdWVuY2UgbmVhciBcIiUiIC4gc3Vic3RyKCAkbXNnLCBwb3MoICRtc2cgKSwgNyApIC4gIlwiIjsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgZm9yZXZlcgorICAgIHJldHVybiB1bmRlZjsKKworfTsgIyBzdWIgcGFyc2VfbWVzc2FnZQorCisKK3N1YiBwYXJzZV9zb3VyY2UoJCkgeworCisgICAgbXkgKCAkbmFtZSApID0gQF87CisKKyAgICBteSBAYnVsayA9IHJlYWRfZmlsZSggJG5hbWUsIC1sYXllciA9PiAiOnV0ZjgiICk7CisgICAgbXkgJGRhdGEgPSB7fTsKKworICAgIG15ICRsaW5lOworICAgIG15ICRuID0gMDsgICAgICAgICAjIExpbmUgbnVtYmVyLgorICAgIG15ICRvYnNvbGV0ZSA9IDA7ICAjIENvdW50ZXIgb2Ygb2Jzb2xldGUgZW50cmllcy4KKyAgICBteSAkbGFzdF9pZHg7CisgICAgbXkgJWlkZW50czsKKyAgICBteSAkc2VjdGlvbjsKKworICAgIG15ICRlcnJvciA9CisgICAgICAgIHN1YiB7CisgICAgICAgICAgICBteSAoICRuLCAkbGluZSwgJG1zZyApID0gQF87CisgICAgICAgICAgICBydW50aW1lX2Vycm9yKCAiRXJyb3IgcGFyc2luZyAkbmFtZSBsaW5lICRuOiAiIC4gIiRtc2c6XG4iIC4gIiAgICAkbGluZSIgKTsKKyAgICAgICAgfTsgIyBzdWIKKworICAgIGZvcmVhY2ggJGxpbmUgKCBAYnVsayApIHsKKyAgICAgICAgKysgJG47CisgICAgICAgICMgU2tpcCBlbXB0eSBsaW5lcyBhbmQgY29tbWVudHMuCisgICAgICAgIGlmICggJGxpbmUgPX4gbXtcQVxzKihcbnwjKX0gKSB7CisgICAgICAgICAgICAkbGFzdF9pZHggPSB1bmRlZjsKKyAgICAgICAgICAgIG5leHQ7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgIyBQYXJzZSBzZWN0aW9uIGhlYWRlci4KKyAgICAgICAgaWYgKCAkbGluZSA9fiBte1xBLVwqLVxzKihbQS1aX10qKVxzKi1cKi1ccypcblx6fWkgKSB7CisgICAgICAgICAgICAkc2VjdGlvbiA9ICggbGMoICQxICkgKTsKKyAgICAgICAgICAgIGlmICggbm90IGdyZXAoICRzZWN0aW9uIGVxICRfLCBAc2VjdGlvbnMgKSApIHsKKyAgICAgICAgICAgICAgICAkZXJyb3ItPiggJG4sICRsaW5lLCAiVW5rbm93biBzZWN0aW9uIFwiJHNlY3Rpb25cIiBzcGVjaWZpZWQiICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICBpZiAoIGV4aXN0cyggJGRhdGEtPnsgJHNlY3Rpb24gfSApICkgeworICAgICAgICAgICAgICAgICRlcnJvci0+KCAkbiwgJGxpbmUsICJNdWx0aXBsZSBzZWN0aW9ucyBvZiB0aGUgc2FtZSB0eXBlIHNwZWNpZmllZCIgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICVpZGVudHMgPSAoKTsgICAgICMgQ2xlYW4gbGlzdCBvZiBrbm93biBtZXNzYWdlIGlkZW50aWZpZXJzLgorICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBpZiAoIG5vdCBkZWZpbmVkKCAkc2VjdGlvbiApICkgeworICAgICAgICAgICAgJGVycm9yLT4oICRuLCAkbGluZSwgIlNlY3Rpb24gaGVhZGluZyBleHBlY3RlZCIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICAjIFBhcnNlIHNlY3Rpb24gYm9keS4KKyAgICAgICAgaWYgKCAkc2VjdGlvbiBlcSAibWV0YSIgKSB7CisgICAgICAgICAgICBpZiAoICRsaW5lID1+IG17XEEoW0EtWl9dW0EtWl8wLTldKilccysiKC4qKSJccyo/XG4/XHp9aSApIHsKKyAgICAgICAgICAgICAgICAjIFBhcnNlIG1ldGEgcHJvcGVydGllcyAoc3VjaCBhcyBMYW5ndWFnZSwgQ291bnRyeSwgYW5kIExhbmdJZCkuCisgICAgICAgICAgICAgICAgbXkgKCAkcHJvcGVydHksICR2YWx1ZSApID0gKCAkMSwgJDIgKTsKKyAgICAgICAgICAgICAgICBpZiAoIG5vdCBncmVwKCAkXyBlcSAkcHJvcGVydHkgLCBAcHJvcGVydGllcyApICkgeworICAgICAgICAgICAgICAgICAgICAkZXJyb3ItPiggJG4sICRsaW5lLCAiVW5rbm93biBwcm9wZXJ0eSBcIiRwcm9wZXJ0eVwiIHNwZWNpZmllZCIgKTsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAgICAgaWYgKCBleGlzdHMoICRkYXRhLT57ICIlbWV0YSIgfS0+eyAkcHJvcGVydHkgfSApICkgeworICAgICAgICAgICAgICAgICAgICAkZXJyb3ItPiggJG4sICRsaW5lLCAiUHJvcGVydHkgXCIkcHJvcGVydHlcIiBoYXMgYWxyZWFkeSBiZWVuIHNwZWNpZmllZCIgKTsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAgICAgJGRhdGEtPnsgIiVtZXRhIiB9LT57ICRwcm9wZXJ0eSB9ID0gJHZhbHVlOworICAgICAgICAgICAgICAgICRsYXN0X2lkeCA9IHVuZGVmOworICAgICAgICAgICAgICAgIG5leHQ7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAkZXJyb3ItPiggJG4sICRsaW5lLCAiUHJvcGVydHkgbGluZSBleHBlY3RlZCIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICAjIFBhcnNlIG1lc3NhZ2UuCisgICAgICAgIGlmICggJGxpbmUgPX4gbXtcQShbQS1aX11bQS1aXzAtOV0qKVxzKyIoLiopIlxzKj9cbj9cen1pICkgeworICAgICAgICAgICAgbXkgKCAkaWRlbnQsICRtZXNzYWdlICkgPSAoICQxLCAkMiApOworICAgICAgICAgICAgaWYgKCAkaWRlbnQgZXEgIk9CU09MRVRFIiApIHsKKyAgICAgICAgICAgICAgICAjIElmIGlkIGlzICJPQlNPTEVURSIsIGFkZCBhIHVuaXF1ZSBzdWZmaXguIEl0IHByb3ZpZGVzIGNvbnZlbmllbnQgd2F5IHRvIG1hcmsKKyAgICAgICAgICAgICAgICAjIG9ic29sZXRlIG1lc3NhZ2VzLgorICAgICAgICAgICAgICAgICsrICRvYnNvbGV0ZTsKKyAgICAgICAgICAgICAgICAkaWRlbnQgLj0gJG9ic29sZXRlOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgaWYgKCBleGlzdHMoICRpZGVudHN7ICRpZGVudCB9ICkgKSB7CisgICAgICAgICAgICAgICAgJGVycm9yLT4oICRuLCAkbGluZSwgIklkZW50aWZpZXIgXCIkaWRlbnRcIiBpcyByZWRlZmluZWQiICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAjIENoZWNrICUtc2VxdWVuY2VzLgorICAgICAgICAgICAgbXkgJGVyciA9IHBhcnNlX21lc3NhZ2UoICRtZXNzYWdlICk7CisgICAgICAgICAgICBpZiAoICRlcnIgKSB7CisgICAgICAgICAgICAgICAgJGVycm9yLT4oICRuLCAkbGluZSwgJGVyciApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgIyBTYXZlIG1lc3NhZ2UuCisgICAgICAgICAgICBwdXNoKCBAeyAkZGF0YS0+eyAkc2VjdGlvbiB9IH0sIFsgJGlkZW50LCAkbWVzc2FnZSBdICk7CisgICAgICAgICAgICAkaWRlbnRzeyAkaWRlbnQgfSA9IDE7CisgICAgICAgICAgICAkbGFzdF9pZHggPSBAeyAkZGF0YS0+eyAkc2VjdGlvbiB9IH0gLSAxOworICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICAjIFBhcnNlIGNvbnRpbnVhdGlvbiBsaW5lLgorICAgICAgICBpZiAoICRsaW5lID1+IG17XEFccyoiKC4qKSJccypcen0gKSB7CisgICAgICAgICAgICBteSAkbWVzc2FnZSA9ICQxOworICAgICAgICAgICAgaWYgKCBub3QgZGVmaW5lZCggJGxhc3RfaWR4ICkgICkgeworICAgICAgICAgICAgICAgICRlcnJvci0+KCAkbiwgJGxpbmUsICJVbmV4cGVjdGVkIGNvbnRpbnVhdGlvbiBsaW5lIiApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgIyBDaGVjayAlLXNlcXVlbmNlcy4KKyAgICAgICAgICAgIG15ICRlcnIgPSBwYXJzZV9tZXNzYWdlKCAkbWVzc2FnZSApOworICAgICAgICAgICAgaWYgKCAkZXJyICkgeworICAgICAgICAgICAgICAgICRlcnJvci0+KCAkbiwgJGxpbmUsICRlcnIgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICMgU2F2ZSBjb250aW51YXRpb24uCisgICAgICAgICAgICAkZGF0YS0+eyAkc2VjdGlvbiB9LT5bICRsYXN0X2lkeCBdLT5bIDEgXSAuPSAkbWVzc2FnZTsKKyAgICAgICAgICAgIG5leHQ7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgJGVycm9yLT4oICRuLCAkbGluZSwgIk1lc3NhZ2UgZGVmaW5pdGlvbiBleHBlY3RlZCIgKTsKKyAgICB9OyAjIGZvcmVhY2gKKyAgICAkZGF0YS0+eyAiJW1ldGEiIH0tPnsgc291cmNlIH0gPSAkbmFtZTsKKyAgICBmb3JlYWNoIG15ICRzZWN0aW9uICggQHNlY3Rpb25zICkgeworICAgICAgICBpZiAoIG5vdCBleGlzdHMoICRkYXRhLT57ICRzZWN0aW9uIH0gKSApIHsKKyAgICAgICAgICAgICRkYXRhLT57ICRzZWN0aW9uIH0gPSBbXTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgZm9yZWFjaCAkc2VjdGlvbgorCisgICAgZm9yZWFjaCBteSAkcHJvcGVydHkgKCBAcHJvcGVydGllcyApIHsKKyAgICAgICAgaWYgKCBub3QgZGVmaW5lZCggJGRhdGEtPnsgIiVtZXRhIiB9LT57ICRwcm9wZXJ0eSB9ICkgKSB7CisgICAgICAgICAgICBydW50aW1lX2Vycm9yKAorICAgICAgICAgICAgICAgICJFcnJvciBwYXJzaW5nICRuYW1lOiAiIC4KKyAgICAgICAgICAgICAgICAgICAgIlJlcXVpcmVkIFwiJHByb3BlcnR5XCIgcHJvcGVydHkgaXMgbm90IHNwZWNpZmllZCIKKyAgICAgICAgICAgICk7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgcHVzaCggQHsgJGRhdGEtPnsgbWV0YSB9IH0sIFsgJHByb3BlcnR5LCAkZGF0YS0+eyAiJW1ldGEiIH0tPnsgJHByb3BlcnR5IH0gXSApOworICAgIH07ICMgZm9yZWFjaAorCisgICAgcmV0dXJuICRkYXRhOworCit9OyAjIHN1YiBwYXJzZV9zb3VyY2UKKworCitzdWIgZ2VuZXJhdGVfZW51bSgkJCQpIHsKKworICAgIG15ICggJGRhdGEsICRmaWxlLCAkcHJlZml4ICkgPSBAXzsKKyAgICBteSAkYnVsayA9ICIiOworCisgICAgJGJ1bGsgPQorICAgICAgICBfZ2VuZXJhdGVfY29tbWVudCggJGRhdGEsICIvLyIsICIvLyIgKSAuCisgICAgICAgICJcbiIgLgorICAgICAgICAiZW51bSAke3ByZWZpeH1faWQge1xuXG4iIC4KKyAgICAgICAgIiAgICAvLyBBIHNwZWNpYWwgaWQgZm9yIGFic2VuY2Ugb2YgbWVzc2FnZS5cbiIgLgorICAgICAgICAiICAgICR7cHJlZml4fV9udWxsID0gMCxcblxuIjsKKworICAgIGZvcmVhY2ggbXkgJHNlY3Rpb24gKCBAc2VjdGlvbnMgKSB7CisgICAgICAgIG15ICRwcm9wcyA9ICRzZWN0aW9ucy0+eyAkc2VjdGlvbiB9OyAgICAjIFNlY3Rpb24gcHJvcGVydGllcy4KKyAgICAgICAgbXkgJHNob3J0ID0gJHByb3BzLT57IHNob3J0IH07ICAgICAgICAgICMgU2hvcnQgc2VjdGlvbiBuYW1lLCBmcmVxdWVudGx5IHVzZWQuCisgICAgICAgICRidWxrIC49CisgICAgICAgICAgICAiICAgIC8vIFNldCAjJHByb3BzLT57IHNldCB9LCAkcHJvcHMtPnsgbG9uZyB9LlxuIiAuCisgICAgICAgICAgICAiICAgICR7cHJlZml4fV8ke3Nob3J0fV9maXJzdCA9ICRwcm9wcy0+eyBiYXNlIH0sXG4iOworICAgICAgICBmb3JlYWNoIG15ICRpdGVtICggQHsgJGRhdGEtPnsgJHNlY3Rpb24gfSB9ICkgeworICAgICAgICAgICAgbXkgKCAkaWRlbnQsIHVuZGVmICkgPSBAJGl0ZW07CisgICAgICAgICAgICAkYnVsayAuPSAiICAgICR7cHJlZml4fV8ke3Nob3J0fV8ke2lkZW50fSxcbiI7CisgICAgICAgIH07ICMgZm9yZWFjaAorICAgICAgICAkYnVsayAuPSAiICAgICR7cHJlZml4fV8ke3Nob3J0fV9sYXN0LFxuXG4iOworICAgIH07ICMgZm9yZWFjaCAkdHlwZQorICAgICRidWxrIC49ICIgICAgJHtwcmVmaXh9X3h4eF9sYXN0ZXN0XG5cbiI7CisKKyAgICAkYnVsayAuPQorICAgICAgICAifTsgLy8gZW51bSAke3ByZWZpeH1faWRcbiIgLgorICAgICAgICAiXG4iIC4KKyAgICAgICAgInR5cGVkZWYgZW51bSAke3ByZWZpeH1faWQgICR7cHJlZml4fV9pZF90O1xuIiAuCisgICAgICAgICJcbiI7CisKKyAgICAkYnVsayAuPQorICAgICAgICAiXG4iIC4KKyAgICAgICAgIi8vIGVuZCBvZiBmaWxlIC8vXG4iOworCisgICAgd3JpdGVfZmlsZSggJGZpbGUsIFwkYnVsayApOworCit9OyAjIHN1YiBnZW5lcmF0ZV9lbnVtCisKKworc3ViIGdlbmVyYXRlX3NpZ25hdHVyZSgkJCkgeworCisgICAgbXkgKCAkZGF0YSwgJGZpbGUgKSA9IEBfOworICAgIG15ICRidWxrID0gIiI7CisKKyAgICAkYnVsayAuPSAiLy8gbWVzc2FnZSBjYXRhbG9nIHNpZ25hdHVyZSBmaWxlIC8vXG5cbiI7CisKKyAgICBmb3JlYWNoIG15ICRzZWN0aW9uICggQHNlY3Rpb25zICkgeworICAgICAgICBteSAkcHJvcHMgPSAkc2VjdGlvbnMtPnsgJHNlY3Rpb24gfTsgICAgIyBTZWN0aW9uIHByb3BlcnRpZXMuCisgICAgICAgIG15ICRzaG9ydCA9ICRwcm9wcy0+eyBzaG9ydCB9OyAgICAgICAgICAjIFNob3J0IHNlY3Rpb24gbmFtZSwgZnJlcXVlbnRseSB1c2VkLgorICAgICAgICAkYnVsayAuPSAiLSotICIgLiB1YyggJHByb3BzLT57IGxvbmcgfSApIC4gIi0qLVxuXG4iOworICAgICAgICBmb3JlYWNoIG15ICRpdGVtICggQHsgJGRhdGEtPnsgJHNlY3Rpb24gfSB9ICkgeworICAgICAgICAgICAgbXkgKCAkaWRlbnQsICRtc2cgKSA9IEAkaXRlbTsKKyAgICAgICAgICAgICRidWxrIC49IHNwcmludGYoICIlLTQwcyAlc1xuIiwgJGlkZW50LCBtc2cyc2duKCAkbXNnICkgKTsKKyAgICAgICAgfTsgIyBmb3JlYWNoCisgICAgICAgICRidWxrIC49ICJcbiI7CisgICAgfTsgIyBmb3JlYWNoICR0eXBlCisKKyAgICAkYnVsayAuPSAiLy8gZW5kIG9mIGZpbGUgLy9cbiI7CisKKyAgICB3cml0ZV9maWxlKCAkZmlsZSwgXCRidWxrICk7CisKK307ICMgc3ViIGdlbmVyYXRlX3NpZ25hdHVyZQorCisKK3N1YiBnZW5lcmF0ZV9kZWZhdWx0KCQkJCkgeworCisgICAgbXkgKCAkZGF0YSwgJGZpbGUsICRwcmVmaXggKSA9IEBfOworICAgIG15ICRidWxrID0gIiI7CisKKyAgICAkYnVsayAuPQorICAgICAgICBfZ2VuZXJhdGVfY29tbWVudCggJGRhdGEsICIvLyIsICIvLyIgKSAuCisgICAgICAgICJcbiI7CisKKyAgICBmb3JlYWNoIG15ICRzZWN0aW9uICggQHNlY3Rpb25zICkgeworICAgICAgICAkYnVsayAuPQorICAgICAgICAgICAgInN0YXRpYyBjaGFyIGNvbnN0ICpcbiIgLgorICAgICAgICAgICAgIl9fJHtwcmVmaXh9X2RlZmF1bHRfJHtzZWN0aW9ufSIgLiAiW10gPVxuIiAuCisgICAgICAgICAgICAiICAgIHtcbiIgLgorICAgICAgICAgICAgIiAgICAgICAgTlVMTCxcbiI7CisgICAgICAgIGZvcmVhY2ggbXkgJGl0ZW0gKCBAeyAkZGF0YS0+eyAkc2VjdGlvbiB9IH0gKSB7CisgICAgICAgICAgICBteSAoIHVuZGVmLCAkbXNnICkgPSBAJGl0ZW07CisgICAgICAgICAgICAkYnVsayAuPSAiICAgICAgICBcIiIgLiBtc2cyc3JjKCAkbXNnICkgLiAiXCIsXG4iOworICAgICAgICB9OyAjIHdoaWxlCisgICAgICAgICRidWxrIC49CisgICAgICAgICAgICAiICAgICAgICBOVUxMXG4iIC4KKyAgICAgICAgICAgICIgICAgfTtcbiIgLgorICAgICAgICAgICAgIlxuIjsKKyAgICB9OyAjIGZvcmVhY2ggJHR5cGUKKworICAgICRidWxrIC49CisgICAgICAgICJzdHJ1Y3Qga21wX2kxOG5fc2VjdGlvbiB7XG4iIC4KKyAgICAgICAgIiAgICBpbnQgICAgICAgICAgIHNpemU7XG4iIC4KKyAgICAgICAgIiAgICBjaGFyIGNvbnN0ICoqIHN0cjtcbiIgLgorICAgICAgICAifTsgLy8gc3RydWN0IGttcF9pMThuX3NlY3Rpb25cbiIgLgorICAgICAgICAidHlwZWRlZiBzdHJ1Y3Qga21wX2kxOG5fc2VjdGlvbiAga21wX2kxOG5fc2VjdGlvbl90O1xuIiAuCisgICAgICAgICJcbiIgLgorICAgICAgICAic3RhdGljIGttcF9pMThuX3NlY3Rpb25fdFxuIiAuCisgICAgICAgICJfXyR7cHJlZml4fV9zZWN0aW9uc1tdID1cbiIgLgorICAgICAgICAiICAgIHtcbiIgLgorICAgICAgICAiICAgICAgICB7IDAsIE5VTEwgfSxcbiI7CisgICAgZm9yZWFjaCBteSAkc2VjdGlvbiAoIEBzZWN0aW9ucyApIHsKKyAgICAgICAgJGJ1bGsgLj0KKyAgICAgICAgICAgICIgICAgICAgIHsgIiAuIEB7ICRkYXRhLT57ICRzZWN0aW9uIH0gfSAuICIsIF9fJHtwcmVmaXh9X2RlZmF1bHRfJHtzZWN0aW9ufSB9LFxuIjsKKyAgICB9OyAjIGZvcmVhY2ggJHR5cGUKKyAgICAkYnVsayAuPQorICAgICAgICAiICAgICAgICB7IDAsIE5VTEwgfVxuIiAuCisgICAgICAgICIgICAgfTtcbiIgLgorICAgICAgICAiXG4iOworCisgICAgJGJ1bGsgLj0KKyAgICAgICAgInN0cnVjdCBrbXBfaTE4bl90YWJsZSB7XG4iIC4KKyAgICAgICAgIiAgICBpbnQgICAgICAgICAgICAgICAgICAgc2l6ZTtcbiIgLgorICAgICAgICAiICAgIGttcF9pMThuX3NlY3Rpb25fdCAqICBzZWN0O1xuIiAuCisgICAgICAgICJ9OyAvLyBzdHJ1Y3Qga21wX2kxOG5fdGFibGVcbiIgLgorICAgICAgICAidHlwZWRlZiBzdHJ1Y3Qga21wX2kxOG5fdGFibGUgIGttcF9pMThuX3RhYmxlX3Q7XG4iIC4KKyAgICAgICAgIlxuIiAuCisgICAgICAgICJzdGF0aWMga21wX2kxOG5fdGFibGVfdCBfX2ttcF9pMThuX2RlZmF1bHRfdGFibGUgPVxuIiAuCisgICAgICAgICIgICAge1xuIiAuCisgICAgICAgICIgICAgICAgICIgLiBAc2VjdGlvbnMgLiAiLFxuIiAuCisgICAgICAgICIgICAgICAgIF9fa21wX2kxOG5fc2VjdGlvbnNcbiIgLgorICAgICAgICAiICAgIH07XG4iIC4KKyAgICAgICAgIlxuIiAuCisgICAgICAgICIvLyBlbmQgb2YgZmlsZSAvL1xuIjsKKworICAgIHdyaXRlX2ZpbGUoICRmaWxlLCBcJGJ1bGsgKTsKKworfTsgIyBzdWIgZ2VuZXJhdGVfZGVmYXVsdAorCisKK3N1YiBnZW5lcmF0ZV9tZXNzYWdlX3VuaXgoJCQpIHsKKworICAgIG15ICggJGRhdGEsICRmaWxlICkgPSBAXzsKKyAgICBteSAkYnVsayAgICAgPSAiIjsKKworICAgICRidWxrIC49CisgICAgICAgIF9nZW5lcmF0ZV9jb21tZW50KCAkZGF0YSwgIlwkIiwgIlwkIiApIC4KKyAgICAgICAgIlxuIiAuCisgICAgICAgICJcJHF1b3RlIFwiXG5cbiI7CisKKyAgICBmb3JlYWNoIG15ICRzZWN0aW9uICggQHNlY3Rpb25zICkgeworICAgICAgICAkYnVsayAuPQorICAgICAgICAgICAgIlwkICIgLiAoICItIiB4IDc4ICkgLiAiXG5cJCAkc2VjdGlvblxuXCQgIiAuICggIi0iIHggNzggKSAuICJcblxuIiAuCisgICAgICAgICAgICAiXCRzZXQgJHNlY3Rpb25zLT57ICRzZWN0aW9uIH0tPnsgc2V0IH1cbiIgLgorICAgICAgICAgICAgIlxuIjsKKyAgICAgICAgbXkgJG4gPSAwOworICAgICAgICBmb3JlYWNoIG15ICRpdGVtICggQHsgJGRhdGEtPnsgJHNlY3Rpb24gfSB9ICkgeworICAgICAgICAgICAgbXkgKCB1bmRlZiwgJG1zZyApID0gQCRpdGVtOworICAgICAgICAgICAgKysgJG47CisgICAgICAgICAgICAkYnVsayAuPSAiJG4gXCIiIC4gbXNnMnNyYyggJG1zZyApIC4gIlwiXG4iOworICAgICAgICB9OyAjIGZvcmVhY2gKKyAgICAgICAgJGJ1bGsgLj0gIlxuIjsKKyAgICB9OyAjIGZvcmVhY2ggJHR5cGUKKworICAgICRidWxrIC49CisgICAgICAgICJcbiIgLgorICAgICAgICAiXCQgZW5kIG9mIGZpbGUgXCRcbiI7CisKKyAgICB3cml0ZV9maWxlKCAkZmlsZSwgXCRidWxrLCAtbGF5ZXIgPT4gIjp1dGY4IiApOworCit9OyAjIHN1YiBnZW5lcmF0ZV9tZXNzYWdlX2xpbnV4CisKKworc3ViIGdlbmVyYXRlX21lc3NhZ2Vfd2luZG93cygkJCkgeworCisgICAgbXkgKCAkZGF0YSwgJGZpbGUgKSA9IEBfOworICAgIG15ICRidWxrID0gIiI7CisgICAgbXkgJGxhbmd1YWdlID0gJGRhdGEtPnsgIiVtZXRhIiB9LT57IExhbmd1YWdlIH07CisgICAgbXkgJGxhbmdpZCAgID0gJGRhdGEtPnsgIiVtZXRhIiB9LT57IExhbmdJZCB9OworCisgICAgJGJ1bGsgLj0KKyAgICAgICAgX2dlbmVyYXRlX2NvbW1lbnQoICRkYXRhLCAiOyIsICI7IiApIC4KKyAgICAgICAgIlxuIiAuCisgICAgICAgICJMYW5ndWFnZU5hbWVzID0gKCRsYW5ndWFnZT0kbGFuZ2lkOm1zZ18kbGFuZ2lkKVxuIiAuCisgICAgICAgICJcbiI7CisKKyAgICAkYnVsayAuPQorICAgICAgICAiRmFjaWxpdHlOYW1lcz0oXG4iOworICAgIGZvcmVhY2ggbXkgJHNlY3Rpb24gKCBAc2VjdGlvbnMgKSB7CisgICAgICAgIG15ICRwcm9wcyA9ICRzZWN0aW9ucy0+eyAkc2VjdGlvbiB9OyAgICAjIFNlY3Rpb24gcHJvcGVydGllcy4KKyAgICAgICAgJGJ1bGsgLj0KKyAgICAgICAgICAgICIgJHByb3BzLT57IHNob3J0IH09IiAuICRwcm9wcy0+eyBzZXQgfSAuIlxuIjsKKyAgICB9OyAjIGZvcmVhY2ggJHNlY3Rpb24KKyAgICAkYnVsayAuPQorICAgICAgICAiKVxuXG4iOworCisgICAgZm9yZWFjaCBteSAkc2VjdGlvbiAoIEBzZWN0aW9ucyApIHsKKyAgICAgICAgbXkgJHNob3J0ID0gJHNlY3Rpb25zLT57ICRzZWN0aW9uIH0tPnsgc2hvcnQgfTsKKyAgICAgICAgbXkgJG4gPSAwOworICAgICAgICBmb3JlYWNoIG15ICRpdGVtICggQHsgJGRhdGEtPnsgJHNlY3Rpb24gfSB9ICkgeworICAgICAgICAgICAgbXkgKCB1bmRlZiwgJG1zZyApID0gQCRpdGVtOworICAgICAgICAgICAgKysgJG47CisgICAgICAgICAgICAkYnVsayAuPQorICAgICAgICAgICAgICAgICJNZXNzYWdlSWQ9JG5cbiIgLgorICAgICAgICAgICAgICAgICJGYWNpbGl0eT0kc2hvcnRcbiIgLgorICAgICAgICAgICAgICAgICJMYW5ndWFnZT0kbGFuZ3VhZ2VcbiIgLgorICAgICAgICAgICAgICAgIG1zZzJtYyggJG1zZyApIC4gIlxuLlxuXG4iOworICAgICAgICB9OyAjIGZvcmVhY2ggJGl0ZW0KKyAgICB9OyAjIGZvcmVhY2ggJHNlY3Rpb24KKworICAgICRidWxrIC49CisgICAgICAgICJcbiIgLgorICAgICAgICAiOyBlbmQgb2YgZmlsZSA7XG4iOworCisgICAgJGJ1bGsgPSBlbmNvZGUoICJVVEYtMTZMRSIsICRidWxrICk7ICMgQ29udmVydCB0ZXh0IHRvIFVURi0xNkxFIHVzZWQgaW4gV2luZG93cyogT1MuCisgICAgd3JpdGVfZmlsZSggJGZpbGUsIFwkYnVsaywgLWJpbmFyeSA9PiAxICk7CisKK307ICMgc3ViIGdlbmVyYXRlX21lc3NhZ2Vfd2luZG93cworCisKKyMKKyMgUGFyc2UgY29tbWFuZCBsaW5lLgorIworCitteSAkaW5wdXRfZmlsZTsKK215ICRlbnVtX2ZpbGU7CitteSAkc2lnbmF0dXJlX2ZpbGU7CitteSAkZGVmYXVsdF9maWxlOworbXkgJG1lc3NhZ2VfZmlsZTsKK215ICRpZDsKK215ICRwcmVmaXggPSAiIjsKK2dldF9vcHRpb25zKAorICAgIFBsYXRmb3JtOjp0YXJnZXRfb3B0aW9ucygpLAorICAgICJlbnVtLWZpbGU9cyIgICAgICA9PiBcJGVudW1fZmlsZSwKKyAgICAic2lnbmF0dXJlLWZpbGU9cyIgPT4gXCRzaWduYXR1cmVfZmlsZSwKKyAgICAiZGVmYXVsdC1maWxlPXMiICAgPT4gXCRkZWZhdWx0X2ZpbGUsCisgICAgIm1lc3NhZ2UtZmlsZT1zIiAgID0+IFwkbWVzc2FnZV9maWxlLAorICAgICJpZHxsYW5nLWlkIiAgICAgICA9PiBcJGlkLAorICAgICJwcmVmaXg9cyIJICAgICAgID0+IFwkcHJlZml4LAorKTsKK2lmICggQEFSR1YgPT0gMCApIHsKKyAgICBjbWRsaW5lX2Vycm9yKCAiTm8gc291cmNlIGZpbGUgc3BlY2lmaWVkIC0tIG5vdGhpbmcgdG8gZG8iICk7Cit9OyAjIGlmCitpZiAoIEBBUkdWID4gMSApIHsKKyAgICBjbWRsaW5lX2Vycm9yKCAiVG9vIG1hbnkgc291cmNlIGZpbGVzIHNwZWNpZmllZCIgKTsKK307ICMgaWYKKyRpbnB1dF9maWxlID0gJEFSR1ZbIDAgXTsKKworCitteSAkZ2VuZXJhdGVfbWVzc2FnZTsKK2lmICggJHRhcmdldF9vcyA9fiBte1xBKD86bGlufG1hYylcen0gKSB7CisgICAgJGdlbmVyYXRlX21lc3NhZ2UgPSBcJmdlbmVyYXRlX21lc3NhZ2VfdW5peDsKK30gZWxzaWYgKCAkdGFyZ2V0X29zIGVxICJ3aW4iICkgeworICAgICRnZW5lcmF0ZV9tZXNzYWdlID0gXCZnZW5lcmF0ZV9tZXNzYWdlX3dpbmRvd3M7Cit9IGVsc2UgeworICAgIHJ1bnRpbWVfZXJyb3IoICJPUyBcIiR0YXJnZXRfb3NcIiBpcyBub3Qgc3VwcG9ydGVkIiApOworfTsgIyBpZgorCisKKyMKKyMgRG8gdGhlIHdvcmsuCisjCisKK215ICRkYXRhID0gcGFyc2Vfc291cmNlKCAkaW5wdXRfZmlsZSApOworaWYgKCBkZWZpbmVkKCAkaWQgKSApIHsKKyAgICBwcmludCggJGRhdGEtPnsgIiVtZXRhIiB9LT57IExhbmdJZCB9LCAiXG4iICk7Cit9OyAjIGlmCitpZiAoIGRlZmluZWQoICRlbnVtX2ZpbGUgKSApIHsKKyAgICBnZW5lcmF0ZV9lbnVtKCAkZGF0YSwgJGVudW1fZmlsZSwgJHByZWZpeCApOworfTsgIyBpZgoraWYgKCBkZWZpbmVkKCAkc2lnbmF0dXJlX2ZpbGUgKSApIHsKKyAgICBnZW5lcmF0ZV9zaWduYXR1cmUoICRkYXRhLCAkc2lnbmF0dXJlX2ZpbGUgKTsKK307ICMgaWYKK2lmICggZGVmaW5lZCggJGRlZmF1bHRfZmlsZSApICkgeworICAgIGdlbmVyYXRlX2RlZmF1bHQoICRkYXRhLCAkZGVmYXVsdF9maWxlLCAkcHJlZml4ICk7Cit9OyAjIGlmCitpZiAoIGRlZmluZWQoICRtZXNzYWdlX2ZpbGUgKSApIHsKKyAgICAkZ2VuZXJhdGVfbWVzc2FnZS0+KCAkZGF0YSwgJG1lc3NhZ2VfZmlsZSApOworfTsgIyBpZgorCitleGl0KCAwICk7CisKK19fRU5EX18KKworPXBvZAorCis9aGVhZDEgTkFNRQorCitCPG1lc3NhZ2UtY29udmVydGVyLnBsPiAtLSBDb252ZXJ0IG1lc3NhZ2UgY2F0YWxvZyBzb3VyY2UgZmlsZSBpbnRvIGFub3RoZXIgdGV4dCBmb3Jtcy4KKworPWhlYWQxIFNZTk9QU0lTCisKK0I8bWVzc2FnZS1jb252ZXJ0ZXIucGw+IEk8b3B0aW9uPi4uLiA8ZmlsZT4KKworPWhlYWQxIE9QVElPTlMKKworPW92ZXIKKworPWl0ZW0gQjwtLWVudW0tZmlsZT0+STxmaWxlPgorCitHZW5lcmF0ZSBlbnVtIGZpbGUgbmFtZWQgSTxmaWxlPi4KKworPWl0ZW0gQjwtLWRlZmF1bHQtZmlsZT0+STxmaWxlPgorCitHZW5lcmF0ZSBkZWZhdWx0IG1lc3NhZ2VzIGZpbGUgbmFtZWQgSTxmaWxlPi4KKworPWl0ZW0gQjwtLWxhbmctaWQ+CisKK1ByaW50IGxhbmd1YWdlIGlkZW50aWZpZXIgb2YgdGhlIG1lc3NhZ2UgY2F0YWxvZyBzb3VyY2UgZmlsZS4KKworPWl0ZW0gQjwtLW1lc3NhZ2UtZmlsZT0+STxmaWxlPgorCitHZW5lcmF0ZSBtZXNzYWdlIGZpbGUuCisKKz1pdGVtIEI8LS1zaWduYXR1cmUtZmlsZT0+STxmaWxlPgorCitHZW5lcmF0ZSBzaWduYXR1cmUgZmlsZS4KKworU2lnbmF0dXJlcyBhcmUgdXNlZCBmb3IgY2hlY2tpbmcgY29tcGF0aWJpbGl0eS4gRm9yIGV4YW1wbGUsIHRvIGNoZWNrIGEgcHJpbWFyeQorY2F0YWxvZyBhbmQgaXRzIHRyYW5zbGF0aW9uIHRvIGFub3RoZXIgbGFuZ3VhZ2UsIHNpZ25hdHVyZXMgb2YgYm90aCBjYXRhbG9ncyBzaG91bGQgYmUgZ2VuZXJhdGVkCithbmQgY29tcGFyZWQuIElmIHNpZ25hdHVyZXMgYXJlIGlkZW50aWNhbCwgY2F0YWxvZ3MgYXJlIGNvbXBhdGlibGUuCisKKz1pdGVtIEI8LS1wcmVmaXg9Pkk8cHJlZml4PgorCitQcmVmaXggdG8gYmUgdXNlZCBmb3IgYWxsIEMgaWRlbnRpZmllcnMgKHR5cGUgYW5kIHZhcmlhYmxlIG5hbWVzKSBpbiBlbnVtIGFuZCBkZWZhdWx0IG1lc3NhZ2VzCitmaWxlcy4KKworPWl0ZW0gQjwtLW9zPT5JPHN0cj4KKworU3BlY2lmeSBPUyBuYW1lIHRoZSBtZXNzYWdlIGZvcm1hdHMgdG8gYmUgY29udmVydGVkIGZvci4gSWYgbm90IHNwZWNpZmllZCBleHBvbGljaXRseSwgdmFsdWUgb2YKK0xJQk9NUF9PUyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyB1c2VkLiBJZiBMSUJPTVBfT1MgaXMgbm90IGRlZmluZWQsIGhvc3QgT1MgaXMgZGV0ZWN0ZWQuCisKK0RlcGVuZGluZyBvbiBPUywgQjxtZXNzYWdlLWNvbnZlcnRlci5wbD4gY29udmVydHMgbWVzc2FnZSBmb3JtYXRzIHRvIEdOVSBzdHlsZSBvciBNUyBzdHlsZS4KKworPWl0ZW0gU3RhbmRhcmQgT3B0aW9ucworCis9b3ZlcgorCis9aXRlbSBCPC0tZG9jPgorCis9aXRlbSBCPC0tbWFudWFsPgorCitQcmludCBmdWxsIGRvY3VtZW50YXRpb24gYW5kIGV4aXQuCisKKz1pdGVtIEI8LS1oZWxwPgorCitQcmludCBzaG9ydCBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQuCisKKz1pdGVtIEI8LS12ZXJzaW9uPgorCitQcmludCB2ZXJzaW9uIHN0cmluZyBhbmQgZXhpdC4KKworPWJhY2sKKworPWJhY2sKKworPWhlYWQxIEFSR1VNRU5UUworCis9b3ZlcgorCis9aXRlbSBJPGZpbGU+CisKK0EgbmFtZSBvZiBpbnB1dCBmaWxlLgorCis9YmFjaworCis9aGVhZDEgREVTQ1JJUFRJT04KKworPWhlYWQyIE1lc3NhZ2UgQ2F0YWxvZyBGaWxlIEZvcm1hdAorCitJdCBpcyBwbGFpbiB0ZXh0IGZpbGUgaW4gVVRGLTggZW5jb2RpbmcuIEVtcHR5IGxpbmVzIGFuZCBsaW5lcyBiZWdpbm5pbmcgd2l0aCBzaGFycCBzaWduIChDPCM+KSBhcmUKK2lnbm9yZWQuIEVCTkYgc3ludGF4IG9mIGNvbnRlbnQ6CisKKyAgICBjYXRhbG9nICAgID0geyBzZWN0aW9uIH07CisgICAgc2VjdGlvbiAgICA9IGhlYWRlciBib2R5OworICAgIGhlYWRlciAgICAgPSAiLSotICIgc2VjdGlvbi1pZCAiIC0qLSIgIlxuIjsKKyAgICBib2R5ICAgICAgID0geyBtZXNzYWdlIH07CisgICAgbWVzc2FnZSAgICA9IG1lc3NhZ2UtaWQgc3RyaW5nICJcbiIgeyBzdHJpbmcgIlxuIiB9OworICAgIHNlY3Rpb24taWQgPSBpZGVudGlmaWVyOworICAgIG1lc3NhZ2UtaWQgPSAiT0JTT0xFVEUiIHwgaWRlbnRpZmllcjsKKyAgICBpZGVudGlmaWVyID0gbGV0dGVyIHsgbGV0dGVyIHwgZGlnaXQgfCAiXyIgfTsKKyAgICBzdHJpbmcgICAgID0gIiIiIHsgY2hhcmFjdGVyIH0gIiIiOworCitJZGVudGlmaWVyIHN0YXJ0cyB3aXRoIGxldHRlciwgd2l0aCBmb2xsb3dpbmcgbGV0dGVycywgZGlnaXRzLCBhbmQgdW5kZXJzY29yZXMuIElkZW50aWZpZXJzIGFyZQorY2FzZS1zZW5zaXRpdmUuIFNldGlvbiBpZGVudGlmaWVycyBhcmUgZml4ZWQ6IEM8TUVUQT4sIEM8U1RSSU5HUz4sIEM8Rk9STUFUUz4sIEM8TUVTU0FHRVM+IGFuZAorQzxISU5UUz4uIE1lc3NhZ2UgaWRlbnRpZmllcnMgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHNlY3Rpb24uIFNwZWNpYWwgQzxPQlNPTEVURT4gcHNldWRvLWlkZW50aWZpZXIKK21heSBiZSB1c2VkIG1hbnkgdGltZXMuCisKK1N0cmluZyBpcyBhIEMgc3RyaW5nIGxpdGVyYWwgd2hpY2ggbXVzdCBub3QgY3Jvc3MgbGluZSBib3VuZGFyaWVzLgorTG9uZyBtZXNzYWdlcyBtYXkgb2NjdXB5IG11bHRpcGxlIGxpbmVzLCBhIHN0cmluZyBwZXIgbGluZS4KKworTWVzc2FnZSBtYXkgaW5jbHVkZSBwcmludGYtbGlrZSBHTlUtc3R5bGUgcGxhY2Vob2xkZXJzIGZvciBhcmd1bWVudHM6IEM8JUk8bj4kSTx0Pj4sCit3aGVyZSBJPG4+IGlzIGFyZ3VtZW50IG51bWJlciAoQzwxPiwgQzwyPiwgLi4uKSwKK0k8dD4gLS0gYXJndW1lbnQgdHlwZSwgQzxzPiAoc3RyaW5nKSBvciBDPGQ+ICgzMi1iaXQgaW50ZWdlcikuCisKK1NlZSBhbHNvIGNvbW1lbnRzIGluIEY8aTE4bi9lbl9VUy50eHQ+LgorCis9aGVhZDIgT3V0cHV0IEZpbGVzCisKK1RoaXMgc2NyaXB0IGNhbiBnZW5lcmF0ZSAzIGRpZmZlcmVudCB0ZXh0IGZpbGVzIGZyb20gc2luZ2xlIHNvdXJjZToKKworPW92ZXIKKworPWl0ZW0gRW51bSBmaWxlLgorCitFbnVtIGZpbGUgaXMgYSBDIGluY2x1ZGUgZmlsZSwgY29udGFpbmluZyBkZWZpbml0aW9ucyBvZiBtZXNzYWdlIGlkZW50aWZpZXJzLCBlLiBnLjoKKworICAgIGVudW0ga21wX2kxOG5faWQgeworCisgICAgICAgIC8vIFNldCAjMSwgbWV0YS4KKyAgICAgICAga21wX2kxOG5fcHJwX2ZpcnN0ID0gNjU1MzYsCisgICAgICAgIGttcF9pMThuX3BycF9MYW5ndWFnZSwKKyAgICAgICAga21wX2kxOG5fcHJwX0NvdW50cnksCisgICAgICAgIGttcF9pMThuX3BycF9MYW5nSWQsCisgICAgICAgIGttcF9pMThuX3BycF9WZXJzaW9uLAorICAgICAgICBrbXBfaTE4bl9wcnBfUmV2aXNpb24sCisgICAgICAgIGttcF9pMThuX3BycF9sYXN0LAorCisgICAgICAgIC8vIFNldCAjMiwgc3RyaW5ncy4KKyAgICAgICAga21wX2kxOG5fc3RyX2ZpcnN0ID0gMTMxMDcyLAorICAgICAgICBrbXBfaTE4bl9zdHJfRXJyb3IsCisgICAgICAgIGttcF9pMThuX3N0cl9Vbmtub3duRmlsZSwKKyAgICAgICAga21wX2kxOG5fc3RyX05vdEFOdW1iZXIsCisgICAgICAgIC4uLgorCisgICAgICAgIC8vIFNldCAjMywgZm90cm1hdHMuCisgICAgICAgIC4uLgorCisgICAgICAgIGttcF9pMThuX3h4eF9sYXN0ZXN0CisKKyAgICB9OyAvLyBlbnVtIGttcF9pMThuX2lkCisKKyAgICB0eXBlZGVmIGVudW0ga21wX2kxOG5faWQgIGttcF9pMThuX2lkX3Q7CisKKz1pdGVtIERlZmF1bHQgbWVzc2FnZXMgZmlsZS4KKworRGVmYXVsdCBtZXNzYWdlcyBmaWxlIGlzIGEgQyBpbmNsdWRlIGZpbGUgY29udGFpbmluZyBkZWZhdWx0IG1lc3NhZ2VzIHRvIGJlIGVtYmVkZGVkIGludG8KK2FwcGxpY2F0aW9uIChhbmQgdXNlZCBpZiBleHRlcm5hbCBtZXNzYWdlIGNhdGFsb2cgZG9lcyBub3QgZXhpc3Qgb3IgY291bGQgbm90IGJlIG9wZW4pOgorCisgICAgc3RhdGljIGNoYXIgY29uc3QgKgorICAgIF9fa21wX2kxOG5fZGVmYXVsdF9tZXRhW10gPQorICAgICAgICB7CisgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgIkVuZ2xpc2giLAorICAgICAgICAgICAgIlVTQSIsCisgICAgICAgICAgICAiMTAzMyIsCisgICAgICAgICAgICAiMiIsCisgICAgICAgICAgICAiMjAwOTA4MDYiLAorICAgICAgICAgICAgTlVMTAorICAgICAgICB9OworCisgICAgc3RhdGljIGNoYXIgY29uc3QgKgorICAgIF9fa21wX2kxOG5fZGVmYXVsdF9zdHJpbmdzW10gPQorICAgICAgICB7CisgICAgICAgICAgICAiRXJyb3IiLAorICAgICAgICAgICAgIih1bmtub3duIGZpbGUpIiwKKyAgICAgICAgICAgICJub3QgYSBudW1iZXIiLAorICAgICAgICAgICAgLi4uCisgICAgICAgICAgICBOVUxMCisgICAgICAgIH07CisKKyAgICAuLi4KKworPWl0ZW0gTWVzc2FnZSBmaWxlLgorCitNZXNzYWdlIGZpbGUgaXMgYW4gaW5wdXQgZm9yIG1lc3NhZ2UgY29tcGlsZXIsIEY8Z2VuY2F0PiBvbiBMaW51eCogT1MgYW5kIE9TIFgqLCBvciBGPG1jLmV4ZT4gb24KK1dpbmRvd3MqIE9TLgorCitIZXJlIGlzIHRoZSBleGFtcGxlIG9mIExpbnV4KiBPUyBtZXNzYWdlIGZpbGU6CisKKyAgICAkcXVvdGUgIgorICAgIDEgIkphcGFuZXNlIgorICAgIDIgIkphcGFuIgorICAgIDMgIjEwNDEiCisgICAgNCAiMiIKKyAgICA1ICJCYXNlZCBvbiBFbmxpc2ggbWVzc2FnZSBjYXRhbG9nIHJldmlzaW9uIDIwMDkwODA2IgorICAgIC4uLgorCitFeGFtcGxlIG9mIFdpbmRvd3MqIE9TIG1lc3NhZ2UgZmlsZToKKworICAgIExhbmd1YWdlTmFtZXMgPSAoSmFwYW5lc2U9MTAwNDE6bXNnXzEwNDEpCisKKyAgICBGYWNpbGl0eU5hbWVzID0gKAorICAgICBwcnA9MQorICAgICBzdHI9MgorICAgICBmbXQ9MworICAgICAuLi4KKyAgICApCisKKyAgICBNZXNzYWdlSWQ9MQorICAgIEZhY2lsaXR5PXBycAorICAgIExhbmd1YWdlPUphcGFuZXNlCisgICAgSmFwYW5lc2UKKyAgICAuCisKKyAgICAuLi4KKworPWl0ZW0gU2lnbmF0dXJlLgorCitTaWduYXR1cmUgaXMgYSBwcm9jZXNzZWQgc291cmNlIGZpbGU6IGNvbW1lbnRzIHN0cmlwcGVkLCBzdHJpbmdzIGRlbGV0ZWQsIGJ1dCBwbGFjZWhvbGRlcnMga2VwdCBhbmQKK3NvcnRlZC4KKworICAgIC0qLSBGT1JNQVRTLSotCisKKyAgICBJbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUxJGQgJTIkcworICAgIFdhcm5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJTEkZCAlMiRzCisgICAgRmF0YWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlMSRkICUyJHMKKyAgICBTeXNFcnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUxJGQgJTIkcworICAgIEhpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJTEkLSAlMiRzCisgICAgUHJhZ21hICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlMSRzICUyJHMgJTMkcyAlNCRzCisKK1RoZSBwdXJwb3NlIG9mIHNpZ25hdHVyZXMgLS0gY29tcGFyZSB0d28gbWVzc2FnZSBzb3VyY2UgZmlsZXMgZm9yIGNvbXBhdGliaWxpdHkuIElmIHNpZ25hdHVyZXMgb2YKK3R3byBtZXNzYWdlIHNvdXJjZXMgYXJlIHRoZSBzYW1lLCBiaW5hcnkgbWVzc2FnZSBjYXRhbG9ncyB3aWxsIGJlIGNvbXBhdGlibGUuCisKKz1iYWNrCisKKz1oZWFkMSBFWEFNUExFUworCitHZW5lcmF0ZSBpbmNsdWRlIGZpbGUgY29udGFpbmluZyBtZXNzYWdlIGlkZW50aWZpZXJzOgorCisgICAgJCBtZXNzYWdlLWNvbnZlcnRlci5wbCAtLWVudW0tZmlsZT1rbXBfaTE4bl9pZC5pbmMgZW5fVVMudHh0CisKK0dlbmVyYXRlIGluY2x1ZGUgZmlsZSBjb250YXRpbmcgZGVmYXVsdCBtZXNzYWdlczoKKworICAgICQgbWVzc2FnZS1jb252ZXJ0ZXIucGwgLS1kZWZhdWx0LWZpbGU9a21wX2kxOG5fZGVmYXVsdC5pbmMgZW5fVVMudHh0CisKK0dlbmVyYXRlIGlucHV0IGZpbGUgZm9yIG1lc3NhZ2UgY29tcGlsZXIsIExpbnV4KiBPUyBleGFtcGxlOgorCisgICAgJCBtZXNzYWdlLWNvbnZlcnRlci5wbCAtLW1lc3NhZ2UtZmlsZT1ydV9SVS5VVEYtOC5tc2cgcnVfUlUudHh0CisKK0dlbmVyYXRlIGlucHV0IGZpbGUgZm9yIG1lc3NhZ2UgY29tcGlsZXIsIFdpbmRvd3MqIE9TIGV4YW1wbGU6CisKKyAgICA+IG1lc3NhZ2UtY29udmVydGVyLnBsIC0tbWVzc2FnZS1maWxlPXJ1X1JVLlVURi04Lm1jIHJ1X1JVLnR4dAorCis9Y3V0CisKKyMgZW5kIG9mIGZpbGUgIworCmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvTElDRU5TRSBiL2ZpbmFsL3Rlc3RzdWl0ZS9MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxOWZiMDEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvTElDRU5TRQpAQCAtMCwwICsxLDM0IEBACisgIENvcHlyaWdodCAoYykgMjAxMSwgMjAxMiAKKyAgVW5pdmVyc2l0eSBvZiBIb3VzdG9uIFN5c3RlbQorICAKKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAgCisgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgYXJlIG1ldDoKKyAgCisgIG8gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgIAorICBvIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgIAorICBvIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgb2YgSG91c3RvbiBTeXN0ZW0gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvCisgICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMKKyAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgIAorICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRAorICBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorIAorCmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvTExWTS1JUi9saXQuY2ZnIGIvZmluYWwvdGVzdHN1aXRlL0xMVk0tSVIvbGl0LmNmZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTU3ODE5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL0xMVk0tSVIvbGl0LmNmZwpAQCAtMCwwICsxLDc4IEBACisjIC0qLSBQeXRob24gLSotCisKKyMgQ29uZmlndXJhdGlvbiBmaWxlIGZvciB0aGUgJ2xpdCcgdGVzdCBydW5uZXIuCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHJlCitpbXBvcnQgcGxhdGZvcm0KKwordHJ5OgorICAgaW1wb3J0IGxpdC51dGlsCisgICBpbXBvcnQgbGl0LmZvcm1hdHMKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgIHBhc3MKKworIyBuYW1lOiBUaGUgbmFtZSBvZiB0aGlzIHRlc3Qgc3VpdGUuCitjb25maWcubmFtZSA9ICdPcGVuTVBWYWxpZGF0aW9uU3VpdGUnCisKKyMgdGVzdEZvcm1hdDogVGhlIHRlc3QgZm9ybWF0IHRvIHVzZSB0byBpbnRlcnByZXQgdGVzdHMuCitjb25maWcudGVzdF9mb3JtYXQgPSBsaXQuZm9ybWF0cy5TaFRlc3QoZXhlY3V0ZV9leHRlcm5hbD1GYWxzZSkKKworIyBzdWZmaXhlczogQSBsaXN0IG9mIGZpbGUgZXh0ZW5zaW9ucyB0byB0cmVhdCBhcyB0ZXN0IGZpbGVzCisjIE5vdGUgdGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiBieSBsaXQubG9jYWwuY2ZnIGZpbGVzCitjb25maWcuc3VmZml4ZXMgPSBbJy5sbCddCisKKyMgdGVzdF9zb3VyY2Vfcm9vdDogVGhlIHJvb3QgcGF0aCB3aGVyZSB0ZXN0cyBhcmUgbG9jYXRlZC4KKyNjb25maWcudGVzdF9zb3VyY2Vfcm9vdCA9ICIvaG9tZS9pY2hveWp4L2luc3RhbGwvb3Blbm1wL3Rlc3RzdWl0ZS9iaW4iCisjb3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKQorCisjIHRlc3RfZXhlY19yb290OiBUaGUgcm9vdCBwYXRoIHdoZXJlIHRlc3RzIHNob3VsZCBiZSBydW4uCisjbXB2c19vYmpfcm9vdCA9IGdldGF0dHIoY29uZmlnLCAnbXB2c19vYmpfcm9vdCcsIE5vbmUpCisjaWYgbXB2c19vYmpfcm9vdCBpcyBub3QgTm9uZToKK2NvbmZpZy50ZXN0X2V4ZWNfcm9vdCA9ICIuLyIKKyNvcy5wYXRoLmpvaW4obXB2c19vYmpfcm9vdCwgJ3NyYycpCisKKyMgRGlzY292ZXIgdGhlICdjbGFuZycgYW5kICdjbGFuZ2NjJyB0byB1c2UuCisKK2ltcG9ydCBvcworCitkZWYgaW5mZXJDbGFuZyhQQVRIKToKKyAgICAjIERldGVybWluZSB3aGljaCBjbGFuZyB0byB1c2UuCisgICAgY2xhbmcgPSBvcy5nZXRlbnYoJ0NMQU5HJykKKworICAgICMgSWYgdGhlIHVzZXIgc2V0IGNsYW5nIGluIHRoZSBlbnZpcm9ubWVudCwgZGVmaW5pdGVseSB1c2UgdGhhdCBhbmQgZG9uJ3QKKyAgICAjIHRyeSB0byB2YWxpZGF0ZS4KKyAgICBpZiBjbGFuZzoKKyAgICAgICAgcmV0dXJuIGNsYW5nCisKKyAgICAjIE90aGVyd2lzZSBsb29rIGluIHRoZSBwYXRoLgorICAgIGNsYW5nID0gbGl0LnV0aWwud2hpY2goJ2NsYW5nJywgUEFUSCkKKworICAgIGlmIG5vdCBjbGFuZzoKKyAgICAgICAgbGl0X2NvbmZpZy5mYXRhbCgiY291bGRuJ3QgZmluZCAnY2xhbmcnIHByb2dyYW0sIHRyeSBzZXR0aW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiQ0xBTkcgaW4geW91ciBlbnZpcm9ubWVudCIpCisKKyAgICByZXR1cm4gY2xhbmcKKworY29uZmlnLmNsYW5nID0gaW5mZXJDbGFuZyhjb25maWcuZW52aXJvbm1lbnRbJ1BBVEgnXSkucmVwbGFjZSgnXFwnLCAnLycpCitjb25maWcuc3Vic3RpdHV0aW9ucy5hcHBlbmQoICgnJWNsYW5nJywgJyAnICsgY29uZmlnLmNsYW5nICsgJyAnKSApCisKKyMgUHJvcG9nYXRlIHNvbWUgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdGVzdCBlbnZpcm9ubWVudC4KK2RlZiBhZGRFbnYobmFtZSk6CisgICAgaWYgbmFtZSBpbiBvcy5lbnZpcm9uOgorICAgICAgICBjb25maWcuZW52aXJvbm1lbnRbbmFtZV0gPSBvcy5lbnZpcm9uW25hbWVdCisKK2FkZEVudignSE9NRScpCithZGRFbnYoJ1BXRCcpCisKKworYWRkRW52KCdDX0lOQ0xVREVfUEFUSCcpCithZGRFbnYoJ0NQTFVTX0lOQ0xVREVfUEFUSCcpCithZGRFbnYoJ0xJQlJBUllfUEFUSCcpCithZGRFbnYoJ0xEX0xJQlJBUllfUEFUSCcpCithZGRFbnYoJ0RZTERfTElCUkFSWV9QQVRIJykKKworIyBDaGVjayB0aGF0IHRoZSBvYmplY3Qgcm9vdCBpcyBrbm93bi4KK2lmIGNvbmZpZy50ZXN0X2V4ZWNfcm9vdCBpcyBOb25lOgorICAgIGxpdC5mYXRhbCgndGVzdCBleGVjdXRpb24gcm9vdCBub3Qgc2V0IScpCmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvTExWTS1JUi9saXQuc2l0ZS5jZmcuaW4gYi9maW5hbC90ZXN0c3VpdGUvTExWTS1JUi9saXQuc2l0ZS5jZmcuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE4NjZkNAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9MTFZNLUlSL2xpdC5zaXRlLmNmZy5pbgpAQCAtMCwwICsxLDMwIEBACisjIyBBdXRvZ2VuZXJhdGVkIGJ5IExMVk0vQ2xhbmcgY29uZmlndXJhdGlvbi4KKyNjb25maWcubXB2c19zcmNfcm9vdCA9ICIvaG9tZS9pY2hveWp4L2luc3RhbGwvb3Blbm1wL3Rlc3RzdWl0ZS9iaW4vYyIKK2NvbmZpZy5tcHZzX29ial9yb290ID0gIi90bXAiCitjb25maWcubGx2bV90b29sc19kaXIgPSAiQExMVk1fVE9PTFNfRElSQCIKKworCisjIE5lZWRlZCB0byBjaGVjayBpZiBhIGhhY2sgbmVlZHMgdG8gYmUgYXBwbGllZAorY29uZmlnLmxsdm1fdmVyc2lvbl9tYWpvciA9ICJATExWTV9WRVJTSU9OX01BSk9SQCIKKworIyBDb21waWxlcnMKKyMgRklYTUU6IHVzZSBsbHZtY2Mgbm90IGxsdm1nY2MKK2NvbmZpZy5sbHZtY2xhbmcgPSAiY2xhbmciCisKKyMgRmVhdHVyZXMKK2NvbmZpZy5lbmFibGVfdWNsaWJjID0gVHJ1ZSBpZiBARU5BQkxFX1VDTElCQ0AgPT0gMSBlbHNlIEZhbHNlCitjb25maWcuZW5hYmxlX3Bvc2l4X3J1bnRpbWUgPSBUcnVlIGlmIEBFTkFCTEVfUE9TSVhfUlVOVElNRUAgPT0gMSBlbHNlIEZhbHNlCitjb25maWcuaGF2ZV9zZWxpbnV4ID0gVHJ1ZSBpZiBASEFWRV9TRUxJTlVYQCA9PSAxIGVsc2UgRmFsc2UKKworIyBDdXJyZW50IHRhcmdldAorY29uZmlnLnRhcmdldF90cmlwbGUgPSAiQFRBUkdFVF9UUklQTEVAIgorCisjIExldCB0aGUgbWFpbiBjb25maWcgZG8gdGhlIHJlYWwgd29yay4KK3RyeToKKyAgbGl0CitleGNlcHQgTmFtZUVycm9yOgorICAjIFVzZSBsaXRfY29uZmlnIGNsYXNzCisgIGxpdF9jb25maWcubG9hZF9jb25maWcoY29uZmlnLCAiQE1QVlNfU09VUkNFX0RJUkAvbGl0LmNmZyIpCitlbHNlOgorICAjIFVzZSBvbGQgbGl0IGNsYXNzCisgIGxpdC5sb2FkX2NvbmZpZyhjb25maWcsICJATVBWU19TT1VSQ0VfRElSQC9saXQuY2ZnIikKZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9MTFZNLUlSL2xpdC50bXAgYi9maW5hbC90ZXN0c3VpdGUvTExWTS1JUi9saXQudG1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZDMwZmIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvTExWTS1JUi9saXQudG1wCkBAIC0wLDAgKzEgQEAKKy4uL0xMVk0tSVIvbGluXzMyZS8KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9NYWtlZmlsZSBiL2ZpbmFsL3Rlc3RzdWl0ZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGJjM2RjCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL01ha2VmaWxlCkBAIC0wLDAgKzEsMjU0IEBACisjIEdlbmVyYWwgTWFrZWZpbGUgY29udGFpbmluZyBhbGwgdGhlIG5lY2Vzc2FyeSBjb21waWxlciBmbGFncyBmb3IgdGhlIHRlc3RzCisKKyMgbW9kaWZ5IENDIGFuZCBDRkxBR1MgZm9yIE9wZW5NUCBDIGNvbXBpbGVycworIyBtb2RpZnkgRkMgYW5kIEZGTEFHUyBmb3IgT3Blbk1QIEZvcnRyYW4gY29tcGlsZXJzCisKKworIyBDb250ZW50OgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgMS4gQmFzaWMgdXNhZ2UKKyMgMi4gR2VuZXJhbCB0ZXN0c3VpdGUgc2V0dGluZ3MKKyMgMy4gQ29tcGlsZXIgc2VsZWN0aW9uIGFuZCBGbGFncworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgMS4gQmFzaWMgdXNhZ2UKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAJbWFrZSBjdGVzdAkJZ2VuZXJhdGUgYyB0ZXN0ICJjdGVzdCIKKyMgCW1ha2UgZnRlc3QJCWdlbmVyYXRlIGZvcnRyYW4gdGVzdCAiZnRlc3QiCisjCW1ha2UgY2xlYW4JCXJlbW92ZXMgYWxsIHNvdXJjZXMgYW5kIGJpbmFyaWVzCisjIAltYWtlIGNsZWFuYWxsCXJlbW92ZXMgc291cmNlcyxiaW5hcmllcyBhbmQgbG9nZmlsZXMKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgMi4gR2VuZXJhbCB0ZXN0c3VpdGUgc2V0dGluZ3MKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIEZvciBnZW5lcmFsIHRlc3RzdWl0ZSBzZXR0aW5ncyBzZWUgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZQorIyBvbXB0cy5jb25mCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAzLiBDb21waWxlciBzZWxlY3Rpb24gYW5kIEZsYWdzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBDTEFORyBDb21waWxlcgorQ0MgICAgID0gY2xhbmcKK0NGTEFHUyA9IC1mb3Blbm1wIC1TIC1lbWl0LWxsdm0KK0ZDICAgICA9IGdmb3J0cmFuCitGRkxBR1MgPSAtZm9wZW5tcCAtbG0KK0ZGTEFHUyA9IC1mb3Blbm1wIC1sbSAtTzMKKworIyBHTlUgQ29tcGlsZXIKKyMgQ0MgICAgID0gZ2NjCisjIENGTEFHUyA9IC1mb3Blbm1wIC1sbSAtTzMKKyMgRkMgICAgID0gZ2ZvcnRyYW4gCisjIEZGTEFHUyA9IC1mb3Blbm1wIC1sbQorIyBGRkxBR1MgPSAtZm9wZW5tcCAtbG0gLU8zCisKKyMgRnVqaXRzdSBDb21waWxlcnM6CisjQ0MgPSBmY2MKKyNDRkxBR1MgPSAtS09NUCxmYXN0X0dQMj0yCisjRkM9ZnJ0CisjRkZMQUdTPS1LT01QLGZhc3RfR1AyPTIgLXcgLUFtIC1YOSAtRml4ZWQKKworCisjIFBHSSBjb21waWxlcnMKKyNDQyA9IHBnY2MKKyNDRkxBR1MgPSAtbXAKKyNDRkxBR1MgPSAtbXAgLURWRVJCT1NFCisjQ0ZMQUdTID0gLWZhc3QgLW1wCisKKyNGQyA9IHBnZjkwCisjRkZMQUdTID0gLWZhc3QgLW1wCisjRkZMQUdTID0gLW1wIC1nCisKKworIyBJbnRlbCBjb21waWxlcnM6CisjQ0MgPSBpY2MKKyNDRkxBR1MgPSAtTzMgLWlwIC1vcGVubXAKKyNDRkxBR1MgPSAtV2FsbCAtTzAgLW9wZW5tcAorI0NGTEFHUyA9ICAtb3Blbm1wIC1sbQorI0NGTEFHUyA9ICAtb3Blbm1wIC1sbSAtRFZFUkJPU0UKKworI0ZDID0gaWZvcnQKKyNGRkxBR1MgPSAtb3Blbm1wIC1sbSAtZnBwCisKKyMgT21uaSBjb21waWxlcnM6CisjQ0MgPSBvbXBjYworI0NGTEFHUyA9IC1PMyAtbG0KKworCisjIEFzc3VyZSBjb21waWxlcnM6CisjQ0MgPSBhc3N1cmVjCisjQ0ZMQUdTID0gLU8zIC1XQXBuYW1lPXByb2plY3QgLURVU0VfQVNTVVJFPTEKKyNGQyA9CisjRkZMQUdTID0KKworIyBORUM6CisjQ0MgPSBjKysKKyNDQyA9IHN4YysrCisjQ0ZMQUdTID0gLVBvcGVubXAKKworI0ZDPXN4ZjkwCisjRkZMQUdTPSAtUG9wZW5tcAorCisKKyMgSGl0YWNoaToKKyNDQyA9IHhjYworI0NGTEFHUyA9IC1PNCAtcHZlYyArT3AgLXBhcmFsbGVsIC1vbXAKKyNGQyA9CisjRkZMQUdTID0KKworCisjIFNHSToKKyNDQyA9IGNjCisjQ0ZMQUdTID0gLW1wIC1sbQorI0ZDID0KKyNGRkxBR1MgPQorCisKKyMgSUJNIGNvbXBpbGVyczoKKyNDQyA9IHhsY19yCisjQ0ZMQUdTID0gLXFzbXA9b21wIC1sbQorCisKKyNGQz14bGY5MF9yCisjRkZMQUdTPS1xc21wPW9tcCAtcWZpeGVkPTEzMiAtcWxhbmdsdmw9ZXh0ZW5kZWQKKworCisjIFNVTiBjb21waWxlcnMKKyNDQyA9IGNjCisjQ0ZMQUdTID0gLWZhc3QgLXhvcGVubXAgLWxtCisKKyNGQyA9ZjkwCisjRkZMQUdTID0gLXhvcGVubXAgLWZhc3QgLWxtCisKKworIyBvcGVuNjQgY29tcGlsZXJzCisjIHJlbWFyazogLUkuIHdhcyBhIHdvcmthcm91bmQgYmVjYXVzZSB0aGUgaW5zdGFsbGF0aW9uIGNhbWUgd2l0aG91dCBvbXAuaCBmaWxlCisjQ0MgPSBvcGVuY2MKKyNDRkxBR1MgPSAtTzAgLW9wZW5tcCAtbG0gLUkuIC1sb21wIC1scHRocmVhZAorI0NGTEFHUyA9IC1PMCAtb3Blbm1wIC1sbSAtSSAvaG9tZS9tYXR0aGV3L29wdC91c3IvaW5jbHVkZSAtbHB0aHJlYWQKKyNDRkxBR1MgPSAtb3Blbm1wIC1sbQorCisjRkMgPSBvcGVuZjkwCisjRkZMQUdTID0gLU8wIC1vcGVubXAgLWxtICAtbG9tcCAtbHB0aHJlYWQKKworCisjUGF0aHNjYWxlIENvbXBpbGVyCisjQ0MgPSBwYXRoY2MKKyNDRkxBR1MgPSAtbXAgLU9mYXN0IC1sbQorCisjRkM9cGF0aGY5MAorI0ZGTEFHUz0gLW1wIC1PZmFzdCAtbG0KKworCisjT3BlblVIIENvbXBpbGVyCisjQ0MgPSB1aGNjCisjQ0ZMQUdTID0gLW1wCisKKyNGQyA9IHVoZjkwCisjRkZMQUdTID0gLW1wCisKKyMgQ2hlY2sgcGF0aAorRklMRT1MTFZNLUlSL2xpdC50bXAKK0NIRUNLX1BBVEg9YGNhdCAkKEZJTEUpYAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2hlbHA6CisJQGVjaG8gIk9wZW5NUCBWYWxpZGF0aW9uIFN1aXRlLCB2My4wIgorCUBlY2hvICIoQykgVW5pdmVyc2l0eSBvZiBTdHV0dGdhcnQsIFVuaXZlcnNpdHkgb2YgSG91c3RvbiIKKwlAZWNobyAiIgorCUBlY2hvICJEbyBtYWtlIFtydWxlXSwgd2hlcmUgcnVsZSBtYXkgYmUgb25lIG9mOiIKKwlAZWNobyAiICBjdGVzdCIKKwlAZWNobyAiICAgIEJ1aWxkIGFuZCBydW4gdGhlIE9wZW5NUC9DIHZhbGlkYXRpb24gdGVzdHMuIgorCUBlY2hvICIgIGZ0ZXN0IgorCUBlY2hvICIgICAgQnVpbGQgYW5kIHJ1biB0aGUgT3Blbk1QL0ZvcnRyYW4gdmFsaWRhdGlvbiB0ZXN0cy4iCisJQGVjaG8gIiAgcHJpbnRfY29tcGlsZV9vcHRpb25zIgorCUBlY2hvICIgICAgRGlzcGxheSB0aGUgZGVmYXVsdCBjb21waWxlciBhbmQgY29tcGlsZXIgb3B0aW9ucyBiZWluZyB0ZXN0ZWQiCisJQGVjaG8gIiAgY2xlYW5zcmNzIgorCUBlY2hvICIgICAgUmVtb3ZlIHNvdXJjZXMgZ2VuZXJhdGVkIGZyb20gdGhlIHRlbXBsYXRlcyIKKwlAZWNobyAiICBjbGVhbmJpbnMiCisJQGVjaG8gIiAgICBSZW1vdmUgZXhlY3V0YWJsZXMgZnJvbSBiaW4vIGRpcmVjdG9yeSIKKwlAZWNobyAiICBjbGVhbm91dHMiCisJQGVjaG8gIiAgICBSZW1vdmUgYWxsICoub3V0IGZpbGVzIGZyb20gYmluLyBkaXJlY3RvcnkiCisJQGVjaG8gIiAgY2xlYW5sb2dzIgorCUBlY2hvICIgICAgUmVtb3ZlIGFsbCAqLmxvZyBmaWxlcyBmcm9tIGJpbi8gZGlyZWN0b3J5IgorCUBlY2hvICIgIGNsZWFuIgorCUBlY2hvICIgICAgQ2xlYW4gb3V0IGFuZCBsb2cgZmlsZXMiCisJQGVjaG8gIiAgZGlzdGNsZWFuIgorCUBlY2hvICIgICAgQ2xlYW4gYXJjaCB0ZXN0IGRpcmVjdG9yeSB3aXRoIGNsZWFuIgorCUBlY2hvICIgIHZlcnljbGVhbiIKKwlAZWNobyAiICAgIFJlbW92ZSB0aGUgZW50aXJlIGJpbi9jIGRpcmVjdG9yeSB3aXRoIGRpc3RjbGVhbiIKKworb21wX215X3NsZWVwOgorCW1rZGlyIC1wIGJpbi9jCisJY3Agb21wX215X3NsZWVwLmggYmluL2MvCitvbXBfdGVzdHN1aXRlOiBvbXBfdGVzdHN1aXRlLmgKKwlta2RpciAtcCBiaW4vYworCWNwIG9tcF90ZXN0c3VpdGUuaCBiaW4vYy8KK29tcF90ZXN0c3VpdGUuaDogb21wdHMtYy5jb25mIGMvKgorCS4vb21wdHNfbWFrZUhlYWRlci5wbCAtZj1vbXB0cy1jLmNvbmYgLXQ9YworLmMubzogb21wX3Rlc3RzdWl0ZSBvbXBfbXlfc2xlZXAKKwkkKENDKSAkKENGTEFHUykgLWMgJDwKKworY3Rlc3Q6IG9tcF9teV9zbGVlcCBvbXBfdGVzdHN1aXRlCisJLi9ydW50ZXN0LnBsIC0tbGFuZz1jIHRlc3RsaXN0LWMudHh0CisJY2QgYmluLzsgbWFrZSAtagorCitmdGVzdDoKKwlta2RpciAtcCBiaW4vZm9ydHJhbgorCWNwIG9tcF90ZXN0c3VpdGUuZiBiaW4vZm9ydHJhbgorCWNwIG9tcF9teV9zbGVlcC5mIGJpbi9mb3J0cmFuCisJLi9ydW50ZXN0LnBsIC0tbGFuZz1mb3J0cmFuIHRlc3RsaXN0LWYudHh0CisKK3ByaW50X2NvbXBpbGVfb3B0aW9uczoKKwlAZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLSIKKwlAZWNobyAiQyBjb21waWxlciIKKwlAZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLSIKKwlAZWNobyAiY29tcGlsYXRpb246ICQoQ0MpICQoQ0ZMQUdTKSIKKwlAJChDQykgLS12ZXJzaW9uCisJQGVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0iCisJQGVjaG8gIkZvcnRyYW4gY29tcGlsZXIiCisJQGVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0iCisJQGVjaG8gImNvbXBpbGF0aW9uOiAkKEZDKSAkKEZGTEFHUykiCisJQCQoRkMpIC0tdmVyc2lvbgorCisKKworcGF0aF90b19hcmNoPSQoc2hlbGwgLi4vcnVudGltZS90b29scy9jaGVjay1vcGVubXAtdGVzdC5wbCkKKworY2xlYW5zcmNzOgorCWZpbmQgYmluLyAtaW5hbWUgIiouW2NmXSIgLWV4ZWMgcm0gLXJmIHt9IFw7CitjbGVhbmJpbnM6CisJZmluZCBiaW4vYyAtcGVybSAvYSt4IC10eXBlIGYgLWV4ZWMgcm0gLXJmIHt9IFw7CisJZmluZCAuL2Jpbi9jIC1ub3QgLW5hbWUgIiouYyIgLWEgLW5vdCAtbmFtZSAiKi5sbCIgLXR5cGUgZiAtZXhlYyBybSAtcmYge30gXDsKK2NsZWFub3V0czoKKwlmaW5kIGJpbi8gLWluYW1lICIqLm91dCIgLWV4ZWMgcm0gLXJmIHt9IFw7CitjbGVhbmxvZ3M6CisJZmluZCBiaW4vIC1pbmFtZSAiKi5sb2ciIC1leGVjIHJtIC1yZiB7fSBcOworCXJtIC1yZiAuLyQocGF0aF90b19hcmNoKQorCitjbGVhbjogY2xlYW5vdXRzIGNsZWFubG9ncyBjbGVhbmJpbnMgY2xlYW5zcmNzCisKK2Rpc3RjbGVhbjogY2xlYW4KKwlybSAtcmYgYmluL2MvKgorCXJtIC1yZiBMTFZNLUlSLyQoQ0hFQ0tfUEFUSCkKKwordmVyeWNsZWFuOiBkaXN0Y2xlYW4KKwlybSAtcmYgYmluL2MvCisJcm0gLXJmIGJpbi9mb3J0cmFuLworCisKK2NsZWFuYWxsOiAKKwlybSAtcmYgLi9iaW4vYy8KKwlybSAtcmYgLi9iaW4vZm9ydHJhbi8KKwlybSAtcmYgLi9MTFZNLUlSLyQocGF0aF90b19hcmNoKQorCXJtIC1yZiAuLyQocGF0aF90b19hcmNoKQorCXJtIC1yZiAuLyoubG9nCisKKwpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL1JFQURNRV9MTFZNX09QRU5NUCBiL2ZpbmFsL3Rlc3RzdWl0ZS9SRUFETUVfTExWTV9PUEVOTVAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA4Y2FkYQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9SRUFETUVfTExWTV9PUEVOTVAKQEAgLTAsMCArMSw0NiBAQAorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3wgICAgICAgICAgICAgIFRvIHVzZSB0aGUgT3Blbk1QIFZhbGlkYXRpb24gU3VpdGUgZm9yIHRlc3RpbmcgICAgICAgICAgICAgICAgfCAKK3wgCQkJTExWTSBPcGVuTVAgSW1wbGVtZW50YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8ICAgICAgIAkgICBIaWdoIFBlcmZvcm1hbmNlIENvbXB1dGluZyBhbmQgVG9vbHMsICAgICAgICAgICAgICAgICAgICAgfCAKK3wJCQlVbml2ZXJzaXR5IG9mIEhvdXN0b24gICAgICAgICAgCQkJICAgICB8Cit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKYW4uIDIwMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1R3byBuZXcgZmlsZXMgaGF2ZSBiZWVuIGFkZGVkIHRvIG9wZW5tcC9ydW50aW1lOiBjaGVjay1vcGVubXAucGwgYW5kIGNoZWNrLW9wZW5tcC10ZXN0LnBsIAorR28gdG8gL29wZW5tcC9ydW50aW1lLCBydW46CittYWtlIHRlc3QgY29tcGlsZXI9Y2xhbmcKK21ha2UgdGVzdC1jbGVhbiAgCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRm9yIHRoZSBPcGVuTVAtTExWTSBQcm9qZWN0LCBmb2xsb3dpbmcgYXJlIHRoZSBGaWxlcyBhbmQgRGlyZWN0b3JpZXMgdG8ga25vdyBhYm91dDogCisKKworICBjICAgICAgICAgICAgICAgICAgICAgICAgIAkgRGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHRlbXBsYXRlcyBmb3IgdGhlIGMgdGVzdHMKKyAgZm9ydHJhbiAgICAgICAgICAgICAgICAgICAJIERpcmVjdG9yeSBjb250YWluaW5nIHRoZSB0ZW1wbGF0ZXMgZm9yIHRoZSBGb3J0cmFuCisgIE1ha2VmaWxlICAgICAgICAgICAgICAgICAgCSBNYWtlZmlsZSBjb250YWluaW5nIG9wdGlvbnMgZm9yIGNvbXBpbGF0aW9uCisgIFJFQURNRV9MTFZNX09QRU5NUCAgICAgICAgICAgICBSRUFETUUgZmlsZSBmb3IgdG8gdXNlIHRoZSBPcGVuTVAgdGVzdC1zdWl0ZSAKKyAgUkVBRE1FX09wZW5NUF9WYWxpZGF0aW9uX1N1aXRlIFJFQURNRSBmaWxlIG9uIHRoZSBWYWxpZGF0aW9uIFN1aXRlLCB0ZW1wbGF0ZXMsIGV0Yy4sIAorCQkJCSBhcyBhIGJhc2lzIGZvciB0ZXN0aW5nIHRoZSBMTFZNIE9wZW5NUCBpbXBsZW1lbnRhdGlvbi4gCisgIExMVk1fSVIJCQkgRGlyZWN0b3J5IGNvbnRhaW5pbmcgdGFyZ2V0LXNwZWNpZmljIElSIGZpbGVzCisgIGJpbi9saXQgZmlsZXMJCSAgICAgICAgIEluIHRoZSBsaXQgbW9kZWwsIGV2ZXJ5IHRlc3QgbXVzdCBleGlzdCBpbnNpZGUgc29tZSB0ZXN0IHN1aXRlLiAKKwkJCQkgbGl0IHJlc29sdmVzIHRoZSBpbnB1dHMgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUgdG8gCisJCQkJIHRlc3Qgc3VpdGVzIGJ5IHNlYXJjaGluZyB1cHdhcmRzIGZyb20gdGhlIGlucHV0IHBhdGggCisJCQkJIHVudGlsIGl0IGZpbmRzIGEgbGl0LmNmZyBvciBsaXQuc2l0ZS5jZmcgZmlsZS4gCisJCQkJIFRoZXNlIGZpbGVzIHNlcnZlIGFzIGJvdGggYSBtYXJrZXIgb2YgdGVzdCBzdWl0ZXMgYW5kIAorCQkJCSBhcyBjb25maWd1cmF0aW9uIGZpbGVzIHdoaWNoIGxpdCBsb2FkcyBpbiBvcmRlciB0byAKKwkJCQkgdW5kZXJzdGFuZCBob3cgdG8gZmluZCBhbmQgcnVuIHRoZSB0ZXN0cyBpbnNpZGUgdGhlIHRlc3Qgc3VpdGUuCQorICBiaW4vaGVhZGVyCQkJIEhlYWRlciBmb3IgdGhlIHRlc3RzLCBjYWxscyBjbGFuZyBkcml2ZXIgZm9yIHRoZSB0ZXN0LCAKKwkJCQkgYW5kIGV4ZWN1dGVzIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZQkJCQorICBiaW4vTWFrZWZpbGUgCQkJIFRvIGdlbmVyYXRlIExMVk1fSVIgZmlsZXMgCisgIGJpbi9kaXN0cmlidXRlLnNoIAkJIEdlbmVyYXRlcyBMTFZNX0lSIGZpbGVzLCBmaW5kcyB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBPUywgbW92ZXMgCisJCQkJIHRoZSBnZW5lcmF0ZWQgSVIgZmlsZXMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZm9sZGVyIAorICBydW50aW1lL3Rvb2xzL2NoZWNrLW9wZW5tcC5wbCAgUmV0cmlldmluZyB0aGUgcmlnaHQgcGF0aCAKKyAgcnVudGltZS90b29scy8KKyAgY2hlY2stb3Blbm1wLXRlc3QucGwJCSBSZXR1cm5zIHRoZSBhcmNoaXRlY3R1cmUgYW5kIE9TLCBlLmcuIGxpbl8zMmUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitDb250YWN0IGFuZCBTdXBwb3J0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQ29udGFjdDogaHR0cDovL3d3dy5jcy51aC5lZHUvfmhwY3Rvb2xzLworRW1haWw6IHN1bml0YUBjcy51aC5lZHUKZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9SRUFETUVfT3Blbk1QX1ZhbGlkYXRpb25fU3VpdGUgYi9maW5hbC90ZXN0c3VpdGUvUkVBRE1FX09wZW5NUF9WYWxpZGF0aW9uX1N1aXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYTdjNjEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvUkVBRE1FX09wZW5NUF9WYWxpZGF0aW9uX1N1aXRlCkBAIC0wLDAgKzEsMzM0IEBACisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorfCAgICAgICAgICAgICAgICAgICBPcGVuTVAgVmFsaWRhdGlvbiBTdWl0ZSAgViAzLjAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8ICAgICAgICAgICAgICBIaWdoIFBlcmZvcm1hbmNlIENvbXB1dGluZyBDZW50ZXIsIFN0dXR0Z2FydCAgICAgICAgICAgICAgICAgIHwKK3wgICAgICAgSGlnaCBQZXJmb3JtYW5jZSBDb21wdXRpbmcgYW5kIFRvb2xzLCBVbml2ZXJzaXR5IG9mIEhvdXN0b24gICAgICAgICAgfAorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEphbi4gMjAxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKK1RBQkxFIE9GIENPTlRFTlRTCisKK0kgICAgCUlOVFJPRFVDVElPTgorSS4xLgkgIEFpbXMgYW5kIGdlbmVyYWwgZnVuY3Rpb24KK0kuMi4gCSAgRmlsZXMgYW5kIGRpcmVjdG9yaWVzCisKK0lJCQlVU0FHRQorSUkuMS4JICBGaXJzdCBydW4gd2l0aCBtYWtlCitJSS4yCSAgV2hlcmUgdG8gc2VhcmNoIGZvciByZXN1bHRzCitJSS4zLgkgIFVzaW5nIHRoZSBydW50ZXN0IHNjcmlwdAorCitJSUkJCUFkZGluZyBhbmQgbW9kaWZ5aW5nIHRlc3RzCitJSUkuMS4JICBUaGUgdGVtcGxhdGUgc3RydWN0dXJlCisKK0lWCQlLbm93biBJc3N1ZXMgYW5kIFdvcmthcm91bmQKKworViAgICAgICBDb250YWN0IGFuZCBTdXBwb3J0CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJLiAgSU5UUk9EVUNUSU9OCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworSS4xLiAgQWltcyBhbmQgZ2VuZXJhbCBmdW5jdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIE9wZW5NUCB2YWxpZGF0aW9uIHN1aXRlIGlzIGRlc2lnbmVkIHRvIHZlcmlmeSB0aGUgY29ycmVjdCBpbXBsZW1lbnRhdGlvbgorb2YgT3Blbk1QIGluIGNvbXBpbGVycy4gSXQgaXMgY2FwYWJsZSBvZiBjaGVja2luZyBGb3J0cmFuIGFzIHdlbGwgYXMgYworY29tcGlsZXIuCisKK1Rlc3RpbmcgdGhlIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIHN0YXRpc3RpY3MuIEVhY2ggZGlyZWN0aXZlIGlzIHRlc3RlZAorYnkgY29tcHV0aW5nIGFuZCB2ZXJpZnlpbmcgdGhlIHJlc3VsdCB3aXRoIHRoZSBhbHJlYWR5IGtub3duIHZhbHVlLiBJbiBtb3N0CitjYXNlcyBhIHdyb25nIGltcGxlbWVudGF0aW9uIGNhbiByZXN1bHQgaW4gdGhlIHJpZ2h0IHZhbHVlcy4gU28gdGhlIHRlc3RzIGFyZQorcnVuIHNldmVyYWwgdGltZXMuCisKK0FkZGl0aW9uYWxseSwgdGhlIHZhbGlkYXRpb24gc3VpdGUgY3JlYXRlcyBzbyBjYWxsZWQgY3Jvc3N0ZXN0cyBmb3IgZWFjaAorZGlyZWN0aXZlLiBUaGVzZSBhcmUgdGVzdHMgaW4gd2hpY2ggZWl0aGVyIHRoZSBkaXJlY3RpdmUgaXMgbWlzc2luZyBvciB1c2VkCit3aXRoIGRpZmZlcmVudCBhcmd1bWVudHMuIElmIHRoaXMgc28gY2FsbGVkIGNyb3NzdGVzdCBmYWlscywgdGhpcyBpbmRpY2F0ZXMKK3N0cm9uZ2x5IHRoYXQgdGhlIHByZXZpb3VzIHRlc3QgaXMgY2FwYWJsZSBvZiB0ZXN0aW5nIHRoZSBkaXJlY3RpdmUuCisKK0xhc3RseSwgYW4gb3JwaGFuZWQgdGVzdCBpcyBhbHNvIHJ1biB0byBkZXRlcm1pbmUgaWYgdGhlIGRpcmVjdGl2ZSBiZWluZwordGVzdGVkIGlzIGFibGUgdG8gY29ycmVjdGx5IHJ1biB3aGVuICdvcnBoYW5lZCcgZnJvbSB0aGUgbWFpbiBmdW5jdGlvbi4KK0Vzc2VudGlhbGx5LCB0aGUgZGlyZWN0aXZlJ3MgY29kZSBpcyBwbGFjZWQgaW50byBpdHMgb3duIGZ1bmN0aW9uIHdoaWNoIGlzCitjYWxsZWQgZHVyaW5nIGV4ZWN1dGlvbiBvZiB0aGUgbWFpbiBmdW5jdGlvbiBhbmQgb2Z0ZW4gaW5zaWRlIGEgcGFyYWxsZWwKK3JlZ2lvbi4KKworCitJLjIuICBGaWxlcyBhbmQgZGlyZWN0b3JpZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitkIGMgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHRlbXBsYXRlcyBmb3IgdGhlIGMgdGVzdHMKK2QgZm9ydHJhbiAgICAgICAgICAgICAgICAgICBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgdGVtcGxhdGVzIGZvciB0aGUgRm9ydHJhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RzCisgIE1ha2VmaWxlICAgICAgICAgICAgICAgICAgTWFrZWZpbGUgY29udGFpbmluZyBvcHRpb25zIGZvciBjb21waWxhdGlvbgorICBjb21tb25fdXRpbGl0eS5mCisgIG9tcF9teV9zbGVlcC5oICAgICAgICAgICAgdGhyZWFkIHNhdmUgc2xlZXAgZnVuY3Rpb24KKyAgb21wX3Rlc3RzdWl0ZS5mICAgICAgICAgICBGb3J0cmFuIGhlYWRlciBmaWxlCisgIG9tcF90ZXN0c3VpdGUuaCAgICAgICAgICAgYXV0b2dlbmVyYXRlZCBjLWhlYWRlciBmaWxlCisgIG9tcHRzLWMuY29uZiAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBmaWxlIGZvciB0aGUgYyB0ZXN0cyBhYm91dCBob3cgb2Z0ZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdGVzdHMgc2hhbGwgYmUgZXhlY3V0ZWQgb3IgaG93IGxhcmdlIHRoZSBsb29wIHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcworICBvbXB0c19tYWtlSGVhZGVyLnBsCSAgICBwZXJsIG1vZHVsZSBmb3IgYXV0b21hdGljYWxseSBnZW5lcmF0aW9uIG9mIGFuIHVwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gZGF0ZSBoZWFkZXIgZmlsZQorICBvbXB0c19wYXJzZXJGdW5jdGlvbnMucG0JcGVybCBtb2R1bGUgY29udGFpbmluZyBnZW5lcmFsIGZ1bmN0aW9ucyBmb3IKKwkJCQkgICAgICAgICAgICB0aGUgcGFyc2VyLnBsIHNjcmlwdAorICBvbXB0c19wYXJzZXIucGwJICAgICAgICBzY3JpcHQgZm9yIGdlbmVyYXRpbmcgdGhlIHNvdXJjZSBjb2RlIG91dCBvZiB0aGUgdGVtcGxhdGVzCisgIG9tcHRzX3N0YW5kYWxvbmVQcm9jLmMJZnJhbWV3b3JrIGZvciB0aGUgYyB0ZXN0cworICBvbXB0c19zdGFuZGFsb25lUHJvYy5mCWZyYW1ld29yayBmb3IgdGhlIEZvcnRyYW4gdGVzdHMKKyAgUkVBRE1FCQkgICAgICAgICAgICB0aGUgUkVBRE1FIGZpbGUgeW91J3ZlIGFscmVhZHkgZm91bmQgOy0pCisgIExJQ0VOU0UgICAgICAgICAgICAgICAgICAgY29udGFpbnMgbGljZW5zZSBpbmZvcm1hdGlvbgorICBydW50ZXN0LnBsCQkgICAgICAgIHRoZSBmcmFtZSBwcm9ncmFtIG9mIHRoZSB0ZXN0IHN1aXRlCisgIHRlc3RsaXN0LWYudHh0CSAgICAgICAgdGVzdCBsaXN0IGNvbnRhaW5pbmcgdGhlIGF2YWlsYWJsZSB0ZXN0cyBmb3IgRm9ydHJhbgorICB0ZXN0bGlzdC1jLnR4dAkgICAgICAgIHRlc3QgbGlzdCBjb250YWluaW5nIHRoZSBhdmFpbGFibGUgdGVzdHMgZm9yIGMKKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSUkuICBVU0FHRQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworSUkuMS4gRmlyc3QgcnVuIHdpdGggbWFrZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitZb3UgY2FuIGRvIGEgZmlyc3Qgc2ltcGxlIHJ1biBvZiB0aGUgdGVzdHN1aXRlIG9ubHkgYWZ0ZXIgb25lIHN0ZXAgb2YKK2NvbmZpZ3VyYXRpb246CisKKzEpIE1vZGlmeSB0aGUgb21wdHMuY29uZiBhbmQgb21wdHMtYy5jb25mIGZpbGUsIGNoYW5nZSB0aGUgbnVtYmVyIG9mIHRocmVhZHMKK2FuZCBudW1iZXIgb2YgcmVwZXRpdGlvbnMgb2YgZWFjaCB0ZXN0LgorCisyKSBNb2RpZnkgdGhlIE1ha2VmaWxlLCB1bmNvbW1lbnRpbmcgdGhlIENDL0ZDIGFuZCBDRkxBR1MvRkZMQUdTIHZhcmlhYmxlcyBmb3IKK3RoZSBjb21waWxlciBvZiB5b3VyIGNob2ljZS4KKworQW5kIG5vdyB5b3UgY2FuIHJ1biB0aGUgdGVzdHN1aXRlIGVpdGhlciBmb3IgYSBDIGNvbXBpbGVyIHdpdGg6CisKKz4JbWFrZSBjdGVzdAorCitvciBmb3IgYSBGb3J0cmFuIGNvbXBpbGVyIHdpdGg6CisKKz4JbWFrZSBmdGVzdAorCisKK0lJLjIuIFJ1bm5pbmcgY3VzdG9tIHRlc3RzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK0luIG9yZGVyIHRvIHJ1biBzaW5nbGUgdGVzdHMgb3IgY3VzdG9tIGdyb3VwcyBvZiB0ZXN0cywgdHdvIG1ha2UgY29tbW1hbmRzCithcmUgZGVmaW5lZDogbWFrZSBzdGVzdCBhbmQgbWFrZSBmc3Rlc3QuIFRoZXNlIHR3byBjb21tYW5kIHJlZmVyZW5jZSB0aGUgZmlsZQorY3VzdG9tdGVzdC50eHQgd2hlbiBsb29raW5nIGZvciBhIHRlc3RsaXN0IHRvIHVzZS4gU2ltcGx5IGVkaXQgY3VzdG9tdGVzdC50eHQKK3RvIGluY2x1ZGUgdGhlIGRlc2lyZWQgdGVzdCBvciB0ZXN0cy4gSWYgY3VzdG9tdGVzdC50eHQgY29udGFpbnMgYyB0ZXN0cywKKworPiAgICAgIG1ha2Ugc3Rlc3QKKworb3IgZm9yIGZvcnRyYW4gdGVzdHMKKworPiAgICAgIG1ha2UgZnN0ZXN0CisKK0luIG9yZGVyIHRvIGNoYW5nZSB0aGUgbnVtYmVyIG9mIHRocmVhZHMgdXNlZCBpbiB0aGUgdGVzdHMsIHNpbXBseSBlZGl0IHRoZQorTWFrZWZpbGUgdmFyaWFibGVzIE1JTlRIUkVBRFMgYW5kIE1BWFRIUkVBRFMuIEJ5IGRlZmF1bHQsIHRoZXkgYXJlIGNvbmZpZ3VyZWQKK3RvIHVzZSAyIHRocmVhZHMuIFRvIGNoYW5nZSB0aGUgbnVtYmVyIG9mIHRpbWVzIGVhY2ggdGVzdCBpcyBydW4sIGZvciBjIHRlc3RzCitlZGl0IHRoZSBSRVBFVElUSU9OUyB2YXJpYWJsZSBpbiB0aGUgZmlsZSBvbXB0cy1jLmNvbmYuIFRoZSBMT09QQ09VTlQgYW5kCitTTEVFUFRJTUUgdmFyaWFibGVzIGNhbiBhbHNvIGJlIGNoYW5nZWQgaGVyZS4gRm9yIGZvcnRyYW4gdGVzdHMsIGVkaXQgdGhlIGZpbGUKK29tcF90ZXN0c3VpdGUuZiB0byBjaGFuZ2UgYm90aCB0aGUgTE9PUENPVU5UIGFuZCB0aGUgbnVtYmVyIG9mIHRpbWVzIGVhY2ggdGVzdAoraXMgcnVuLgorCisKKworSUkuMy4gVW5kZXJzdGFuZGluZyB0aGUgcmVzdWx0cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworV2hlbiBydW5uaW5nIHRoZSB0ZXN0c3VpdGUgdGhlIHJlc3VsdHMgd2lsbCBiZSBzaG93biBvbiB0aGUgc2NyZWVuLgorCitJZiB5b3UgbmVlZCB0aGUgcmVzdWx0cyBmb3IgZnVydGhlciBwdXJwb3NlIHlvdSBjYW4gdXNlIHRoZSByZXN1bHRzLnR4dCwgd2hpY2gKK2lzIGEgc2ltcGxlIGxpc3QgY29udGFpbmluZyB0aGUgcmVzdWx0cyBmb3IgZWFjaCBkaXJlY3RpdmUKK2luIGEgc2luZ2xlIGxpbmUuIEVhY2ggbGluZSBzdGFydHMgd2l0aCB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0aXZlLiBUaGVuIGZvbGxvd3MKK3RoZSByZXN1bHQgb2YgdGhlIHRlc3QgZ2l2ZW4gaW4gdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHBhc3NlZCB0ZXN0cy4gSWYgMTAwJSBvZgordGhlIHRlc3RzIHBhc3NlZCBzdWNjZXNzZnVsbHksIHRoZSBzZWNvbmQgbnVtYmVyIGdpdmVzIHRoZSByZXN1bHQgb2YgdGhlCitjb3JyZXNwb25kaW5nIGNyb3NzdGVzdC4gQ3Jvc3N0ZXN0cyB3aWxsIG9ubHkgYmUgcnVuIGlmIHRoZSBub3JtYWwgdGVzdCBwYXNzZXMKK3dpdGggMTAwJSBhY2N1cmFjeS4gSWYgYSBjcm9zc3Rlc3Qgd2FzIG5vdCBydW4gb3IgYSB0ZXN0IGRvZXMgbm90IGV4aXN0LCBpdCBpcworZGVub3RhdGVkIGJ5IGEgIi0iLgorQWZ0ZXIgdGhlIHJlc3VsdHMgb2YgdGhlIG5vcm1hbCB0ZXN0cywgdGhlcmUgZm9sbG93IGEgc2VyaWVzIG9mIHRlc3RzIGluIHRoZQorb3JwaGFuZWQgbW9kZS4gSWYgdGhlcmUgd2VyZSBubyBvcnBoYW5lZCB0ZXN0cyBhdmFpbGFibGUgdGhpcyBpcyBzaG93biBieSBhICItIi4KKworSWYgeW91IHJ1biB0aGUgdGVzdHN1aXRlIHdpdGggZGlmZmVyZW50IG51bWJlcnMgb2YgdGhyZWFkcyAoZS5nLiB1c2luZyB0aGUKK3J1bnRlc3QucGwgc2NyaXB0KSB0aGUgcmVzdWx0cyBhcmUgc2hvd24gaW4gYmxvY2tzIG9mIDQgY29sdW1ucyBmb3IgZWFjaCBudW1iZXIKK29mIHRocmVhZHMuCisKK0lmIGEgdGVzdCBmYWlscyB5b3UgY2FuIGZpbmQgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBpbiB0aGUgb21wdHMubG9nLAorYmluL2MvKi5vdXQgYW5kICoubG9nIGZpbGVzLiBXaGlsZSB0aGUgb21wdHMubG9nIGZpbGUgY29udGFpbnMgYWxsIGNvbXBpbGVyCitlcnJvciBtZXNzYWdlcyBmb3IgYWxsIHRlc3RzLCB0aGUgKi5vdXQgYW5kICoubG9nIGZpbGVzIGNvbnRhaW4gZGV0YWlsZWQgaW5mb3JhbXRpb24KK29uIHRoZSBleGVjdXRpb24gcHJvY2VzcyBvZiB0aGUgc2luZ2xlIHRlc3RzLgorSW4gdGhlICoub3V0IGZpbGVzIHRoZXJlIGFyZSBsaXN0ZWQgYWxsIHRoZSByZXN1bHRzIG9mIHRoZSBzaW5nbGUgZXhlY3V0aW9ucyBvZgordGhlIHRlc3RzLiBJbiB0aGUgKi5sb2cgZmlsZXMgdGhlcmUgYXJlIGVycm9yIG1lc3NhZ2VzIG9mIHRoZSB0ZXN0cyBpdHNlbGYuCisKKworSUkuNC4gQ2xlYW5pbmcgVXAKKy0tLS0tLS0tLS0tLS0tLS0tCisKKworQmVjYXVzZSBtYW55IGZpbGVzIGFyZSBnZW5lcmF0ZWQgZm9yIGVhY2ggdGVzdGVkIGRpcmVjdGl2ZSwgaXQgaXMgb2Z0ZW4gbmVjZXNzYXJ5Cit0byBjbGVhbiB0aGUgbWFpbiBkaXJlY3RvcnkgYWZ0ZXIgYSBiYXR0ZXJ5IG9mIHRlc3RzLiBUbyBjbGVhbiBhbGwgZ2VuZXJhdGVkIGZpbGVzCitpbiB0aGUgbWFpbiBkaXJlY3RvcnkgaW5jbHVkaW5nIHRoZSByZXN1bHRzIGFuZCBsb2cgZmlsZXMsCisKKz4gICAgIG1ha2UgY2xlYW4KKworCitUbyBjbGVhbiBvbmx5IHRoZSBsb2dzIGFuZCBvdXQgZmlsZXMsCisKKz4gICAgIG1ha2UgY2xlYW5sb2dzCisKK1RvIGNsZWFuIG9ubHkgdGhlIHJlc3VsdHMsCisKKz4gICAgIG1ha2UgY2xlYW5yZXN1bHRzCisKKworCitJSS40LiBVc2luZyB0aGUgcnVudGVzdCBzY3JpcHQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitTbyBmb3Igc3BlY2lhbCBwdXJwb3NlIHlvdSBjYW4gdXNlIHRoZSBydW50ZXN0LnBsIHNjcmlwdCwgd2hpY2ggYWxsb3dzIGEgbG90Cittb3JlIG9wdGlvbnMgZm9yIHRoZSBleGVjdXRpb24gcHJvY2VzcyB0aGFuIHRoZSBleGVjdXRpb24gd2l0aCBtYWtlLgorCitVc2luZyB0aGUgcnVudGVzdC5wbCBzY3JpcHQgaXMgcmF0aGVyIGVhc3kuIFlvdSBjYW4gdXNlIHRoZSB0aGUgdGVzdCBzdWl0ZSBvbmx5CithZnRlciB0d28gc3RlcHMgb2YgbW9kaWZpY2F0aW9uczoKKworMS4pIE1vZGlmeSB0aGUgTWFrZWZpbGUgdG8geW91ciB3aXNoZXMgY2hvb3NpbmcgeW91ciBjb21waWxlciBhbmQgdGhlIG5lY2Vzc2FyeQorICAgIGNvbXBpbGVyIGZsYWdzLgorMi4pIElmIG5lY2Vzc2FyeSBlZGl0IG9uZSBvZiB0aGUgdGVzdCBsaXN0cyAodGVzdGxpc3QtYy50eHQpIGFuZCBjb21tZW50IG91dCB0aGUKKyAgICB0ZXN0cyB5b3UgZG8gbm90IHdhbnQgdG8gcnVuIHVzaW5nICMgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUuIFRlc3RsaXN0cyBmb3IgRm9ydHJhbiBlbmQKKyAgICB3aXRoIC1mLnR4dCB3aGlsZSB0ZXN0IGxpc3RzIGZvciBjIHdpdGggLWMudHh0LgorCitBbmQgbm93IHlvdSBjYW4gcnVuIHRoZSB0ZXN0IHN1aXRlIGVpdGhlciBmb3IgRm9ydHJhbiB1c2luZworCSMJPiAgLi9ydW50ZXN0LnBsIC1sYW5nPWZvcnRyYW4gLWQ9Zm9ydHJhbiB0ZXN0bGlzdC1mLnR4dAorb3IgZm9yIGMKKwkjCT4gIC4vcnVudGVzdC5wbCAtbGFuZz1jIC1kPWMgdGVzdGxpc3QtYy50eHQKKworV2l0aCB0aGUgLS1oZWxwIG9wdGlvbiB5b3UgY2FuIHNob3cgdGhlIGNvbXBsZXRlIGxpc3Qgb2Ygb3B0aW9ucyBhbmQgdGhlaXIKK2V4cGxhbmF0aW9ucy4KKworVGhlIHRlc3QgcmVzdWx0cyBhcmUgc3VtbWFyaXplZCBpbiBjcmVzdWx0cyBvciBmcmVzdWx0cy50eHQgd2hpbGUgKi5sb2cga2VlcAorZGV0YWlscyBmb3IgaW5kaXZpZHVhbCB0ZXN0cy4gVGhlcmUgaXMgYWxzbyBhIGZpbGUgKG9tcHRzLmxvZykga2VlcGluZworY29tcGlsYXRpb24gaW5mb3JtYXRpb24uIChzZWUgc2VjdGlvbiBJSS4yICkKKworSWYgeW91IGRvbid0IHdhbnQgdG8gdGVzdCB0aGUgZGlyZWN0aXZlcyBpbiBvcnBoYW5lZCBtb2RlIHlvdSBjYW4gdXNlIHRoZQorLW5vcnBoYW4gb3B0aW9uLiBZb3UgYWxzbyBjYW4gdXNlIHRoZSBydW50ZXN0LnBsIHNjcmlwdCBlaXRoZXIgdG8gY29tcGlsZSBhbGwKK3Rlc3RzIG9yIHJ1biBjb21waWxlZCB0ZXN0cyBlLmcuIGZvciBjcm9zcyBjb21waWxhdGlvbiBvbiBvdGhlciBwbGF0Zm9ybXMuIEZvcgordGhpcyB0aGVyZSBhcmUgdGhlIG9wdGlvbnMgLW5vcnVuIGFuZCAtbm9jb21waWxlLgorCitIYXBweSB0ZXN0aW5nIQorCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJSUkuCUhvdyB0byBhZGQgbmV3IHRlc3RzIC8gVGhlIHN0cnVjdHVyZSBvZiB0ZXN0IHRlbXBsYXRlcworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0lJSS4xICBUaGUgdGVtcGxhdGUgc3RydWN0dXJlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIHRlc3Qgc3VpdGUgaXMgYmFzZWQgb24gdGVtcGxhdGVzIHNvIHRoYXQgeW91IG9ubHkgaGF2ZSBvbmUgZmlsZSBmb3IgdGVzdCwKK2Nyb3NzdGVzdCBhbmQgdGhlIG9ycGhhbmVkIHZlcnNpb25zIG9mIHRoZW0uCisKKwlBKSBEZXNjcmlwdGlvbiBvZiB0aGUgdGVtcGxhdGUgc3RydWN0dXJlCisKK1RoZSBzeW50YXggb2YgdGhlIHRlbXBsYXRlcyBpcyBtdWNoIGxpa2UgeG1sLiBTbyBlYWNoIHRlc3QgYmVnaW5zIHdpdGgKKyc8b21wdHM6dGVzdD4nIGFuZCBlbmRzIHdpdGggJzwvb21wdHM6dGVzdD4nLgorCitJbiBiZXR3ZWVuIHRoZXJlIGFyZSBzZXZlcmFsIG90aGVyIGJsb2NrcyBob2xkaW5nIGluZm9ybWF0aW9uOgorCistIDxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+IDwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPiBJbiBiZXR3ZWVuIHRoaXMgdGFnIHlvdSBjYW4KKyAgZ2l2ZSBhIGRlc2NyaXB0aW9uIG9uIHdoYXQgdGhlIHRlc3QgY2hlY2tzIGFuZCBob3cgaXQgd29ya3MuCisKKy0gPG9tcHRzOm9tcHZlcnNpb24+IDwvb21wdHM6dmVyc2lvbj4gVGhpcyB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZQorICBPcGVuTVAtdmVyc2lvbiB3aGljaCBpbmNsdWRlcyB0aGUgdGVzdGVkIGRpcmVjdGl2ZS4KKworLSA8b21wdHM6ZGlyZWN0aXZlPiA8L29tcHRzOmRpcmVjdGl2ZT4gVXNlZCB0byBzcGVjaWZ5IHRoZSBkaXJlY3RpdmUgaG93IGl0IGlzCisgIGNhbGxlZCBpbiB0aGUgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuCisKKy0gPG9tcHRzOmRlcGVuZGVuY2VzPiA8L29tcHRzOmRlcGVuZGVuY2VzPiBXaXRoIHRoaXMgdGFnIHlvdSBjYW4gc3BlY2lmeSBvdGhlcgorICBvbXAgZGlyZWN0aXZlcyB3aGljaCBhcmUgbmVjZXNzYXJ5IGZvciB0aGUgY29ycmVjdCBleGVjdXRpb24gb2YgeW91ciB0ZXN0LgorVGhlIGRpcmVjdGl2ZXMgaGF2ZSB0byBiZSBsaXN0ZWQgYnkgdGhlaXIgZGlyZWN0aXZlIG5hbWVzIGFzIGl0IGlzIGNhbGxlZCBpbgordGhlIHByb2dyYW1taW5nIGxhbmd1YWdlLiBNdWx0aXBsZSBkaXJlY3RpdmVzIGFyZSBzZXBhcmF0ZWQgYnkgJywnLgorCistIDxvbXB0czp0ZXN0Y29kZT4gPC9vbXB0czp0ZXN0Y29kZT4gSW4gdGhpcyB0YWcgc3RhbmRzIHRoZSB3aG9sZSBzb3VyY2UgY29kZQorZm9yIHRoZSB0ZXN0IC8gY3Jvc3N0ZXN0LiAgRWFjaCB0ZXN0IGhhcyB0byBiZSB3cml0dGVuIGFzIGEgZnVuY3Rpb24uIFRoZQorc3ludGF4IG9mIHRoZSBmdW5jdGlvbnMgZGlmZmVycyBiZXR3ZWVuIEMgYW5kIEZvcnRyYW46IEluIEMgaXQgaGFzIHRvIHRha2UgYQorZmlsZSBwb2ludGVyICdGSUxFICogbG9nRmlsZScgYW5kIHJldHVybiBhbiBpbnQuIElmIHRoZSB0ZXN0IGhhcyBiZWVuIHBhc3NlZAorc3VjY2Vzc2Z1bCBpdCBoYXMgdG8gcmV0dXJuIGEgdmFsdWUgdW5lcXVhbCB0byAwLiBUaGUgZmlsZSBwb2ludGVyIGNhbiBiZSB1c2VkCit0byB3cml0ZSBpbmZvcm1hdGlvbiBpbnRvIGEgbG9nIGZpbGUuICBJbiBGb3J0cmFuIHRoZSBmdW5jdGlvbiB0YWtlcyBubworYXJndW1lbnQgYW5kIHRoZSBmdW5jdGlvbiBuYW1lIG11c3Qgbm90IGV4Y2VlZCBYWCBjaGFyYWN0ZXJzLiAgVGhlIHJldHVybiB2YWx1ZQoraGFzIHRvIGJlIHNwZWNpZmllZCB1c2luZyB0aGUgJzx0ZXN0ZnVuY3Rpb25uYW1lPicgdGFncy4gSXQgaGFzIHRvIGJlIDEgaWYgdGhlCit0ZXN0IHN1Y2NlZWRlZCBhbmQgMCBpZiB0aGUgdGVzdCBmYWlsZWQuIEZvciBkZXRhaWxzIHNlZSB0aGUgZXhhbXBsZS4KKworVG8gdGVsbCB0aGUgdGVzdCBzdWl0ZSB0aGUgbmFtZSBvZiB5b3VyIHRlc3QgZnVuY3Rpb24geW91IGhhdmUgdG8gZW5jbG9zZSBpdAoraW50byB0aGUgJzxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPicgdGFnLgorCitJZiB0aGVyZSBhcmUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0ZXN0IGFuZCBjcm9zc3Rlc3QgeW91IGNhbiB1c2UgdGhlCis8b21wdHM6Y2hlY2s+IDwvb21wdHM6Y2hlY2s+IGFuZCA8b21wdHM6Y3Jvc3NjaGVjaz4gPC9vbXB0czpjcm9zc2NoZWNrPiB0YWcuCitXaGVuIGdlbmVyYXRpbmcgdGhlIHRlc3QgdGhlIHBhcnNlciB3aWxsIHVzZSB0aGUgY29kZSBlbmNsb3NlZCBpbgorPG9tcHRzOmNoZWNrPiB0YWdzIGFuZCBjdXQgb3V0IHRoZSBjb2RlIHdyaXR0ZW4gaW4gPG9tcHRzOmNyb3NzY2hlY2s+IHRhZ3MuIFNvCit5b3UgaGF2ZSB0d28gcG9zc2liaWxpdGllcyB0byB3cml0ZSB5b3VyIHRlbXBsYXRlIGZvciB0ZXN0IGFuZCBjcm9zc3Rlc3Q6IFRoZQorZmlyc3Qgd2F5IHlvdSBjYW4gd3JpdGUgdGhlIGNvbXBsZXRlIGNvZGUgaXMgdG8gd3JpdGUgdGhlIHRlc3QgaW4gb25lCis8b21wdHM6Y2hlY2s+IHRhZyBhbmQgbGF0ZXIgdGhlIGNyb3NzdGVzdCBpbiBvbmUgPG9tcHRzOmNyb3NzY2hlY2s+IHRhZy4gIFRoZQorc2Vjb25kIHdheSBpcyB0byB3cml0ZSBib3RoIHRlc3RzIG9ubHkgYnkgZW5jbG9zaW5nIGRpZmZlcmluZyBwYXJ0cyBpbgorY29ycmVzcG9uZGluZyB0YWdzLgorCitUaGUgZmlyc3QgbWV0aG9kIHNob3VsZCBiZSBwcmVmZXJyZWQgaWYgdGVzdCBhbmQgY3Jvc3N0ZXN0IGRpZmZlciBtdWNoIGZyb20KK2VhY2ggb3RoZXIuIFRoZSBzZWNvbmQgZS5nLiBpZiB5b3Ugb25seSB3YW50IHRvIGNoYW5nZSBhIGZldyBvcHRpb25zIGxpa2UKK3JlcGxhY2luZyBhbiBvbXAgc2luZ2xlcHJpdmF0ZSBjbGF1c2UgYnkgYW4gb21wIHByaXZhdGUgY2xhdXNlIG9yIHRvIGN1dCBvdXQKK2EgZGlyZWN0aXZlIGxpa2Ugb21wIGZsdXNoLiAgV2hlbiB5b3UgdXNlIHRoZSBmaXJzdCB3YXkgeW91IGhhdmUgdG8gdGFrZSBjYXJlCitvZiB0aGUgZnVuY3Rpb24gbmFtZSEgWW91IGhhdmUgdG8gZGVjbGFyZSBpdCB0d2ljZSB3aXRoCis8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiEKKworLSA8b21wdHM6b3JwaGFuPiA8L29tcHRzOm9ycGhhbj4gVGhpcyB0YWcgY2FuIGJlIHVzZWQgaWYgeW91IHdhbnQgdG8gZW5hYmxlCisgIHlvdXIgdGVzdCB0byBjaGVjayB0aGUgZGlyZWN0aXZlIGluIG9ycGhhbiByZWdpb25zLCB0b28uICBUaGUgY29kZSBlbmNsb3NlZAoraW4gdGhpcyBwYXJ0IHdpbGwgYmUgd3JpdHRlbiB0byBhIHNlcGFyYXRlIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgY2FsbGVkCitpbnN0ZWFkLiAgSWYgeW91IGhhdmUgdmFyaWFibGVzIHdoaWNoIGFyZSB1c2VkIG91dHNpZGUgdGhpcyByZWdpb24geW91IGhhdmUgdG8KK2RlY2xhcmUgdGhlbSBhcyBnbG9iYWwgdmFyaWFibGVzIGVuY2xvc2VkIGluIGFuIDxvbXB0czpvcnBoYW46dmFycz4gdGFnLiBGb3IKK2Z1cnRoZXIgaW5mb3JtYXRpb24gc2VlIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgPG9tcHRzOm9ycGhhbjp2YXJzPiB0YWcuCisKKy0gPG9tcHRzOm9ycGhhbjp2YXJzPiA8L29tcHRzOm9ycGhhbjp2YXJzPiBUaGlzIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgZ2xvYmFsCisgIHZhcmlhYmxlcyBmb3IgYW4gb3JwaGFuIHJlZ2lvbiB3aGljaCBhbGxvdyB0aGUgZXhjaGFuZ2Ugb2YgdmFsdWVzIGJldHdlZW4KK3RoZSBtYWluIHByb2dyYW0gYW5kIHRoZSBvcnBoYW5lZCBmdW5jdGlvbnMuIFRoZSB1c2FnZSBkaWZmZXJzIGJldHdlZW4gQyBhbmQKK0ZvcnRyYW4uICBJbiBDIHlvdSBoYXZlIHRvIHVzZSBhIHNpbmdsZSBkZWNsYXJhdGlvbiBmb3IgZWFjaCB2YXJpYWJsZS4gWW91IGNhbgorZWl0aGVyIGRlY2xhcmUgYWxsIHZhcmlhYmxlcyBpbiBvbmUgc2luZ2xlIG9yIGluIHNldmVyYWwgZGlmZmVyZW50IHJlZ2lvbnMuIFlvdQorbXVzdCBub3QgaW5pdGlhbGl6ZSB0aGUgdmFyaWFibGVzIGluc2lkZSEgIEluIEZvcnRyYW4geW91IGhhdmUgdG8gcHV0IGFsbAorZGVjbGFyYXRpb25zIGluIG9uZSBzaW5nbGUgdGFnLiBCZWNhdXNlIHRoZXJlIGV4aXN0IG5vIGdsb2JhbCB2YXJpYWJsZXMgYXMgaW4KK0MgeW91IGhhdmUgdG8gdXNlIGNvbW1vbiBibG9ja3MuIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHNlZSB0aGUgZXhhbXBsZXMuCisKK0lJSS4yLiAgQWRkaW5nIHRlc3RzIHRvIHRoZSB0ZXN0IGxpc3RzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBZnRlciB5b3UgaGF2ZSBjcmVhdGVkIGEgbmV3IHRlc3QgeW91IGhhdmUgdG8gYWRkIHRoZW0gdG8gYSB0ZXN0bGlzdC4gU2ltcGx5CithZGQgdGhlIGZ1bmN0aW9uIG5hbWUgaW4gYSBuZXcgTGluZSBpbnRvIGEgZmlsZS4KKworCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK0lWLiAgIEtub3duIElzc3VlcyBhbmQgV29ya2Fyb3VuZAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBTdW4gT1MgaGFzIGEgcHJvYmxlbSB3aXRoIHRoZSAtbWF4ZGVwdGggb3B0aW9uIG9uIHRoZSAnbWFrZSBjbGVhbmFsbCcKK2NvbW1hbmQuIFRoaXMgcHJldmVudHMgdGhlIHRlc3RzIGZyb20gYmVpbmcgcmVtb3ZlZCBmcm9tIHRoZSB3b3JraW5nIGRpcmVjdG9yeQorYW5kIGNhbiBjYXVzZSBwcm9ibGVtcyB3aXRoIGZ1dHVyZSB0ZXN0cy4gVG8gcmVtZWR5LCBlZGl0IHRoZSBtYWtlZmlsZSBsaW5lCit1bmRlciB0aGUgY2xlYW4gY29tbWFuZDoKKworICAgICAtcm0gW2NmXXRlc3QqLltjZl0gW2NmXWNyb3NzdGVzdCouW2NmXSBbY2ZdY3Rlc3QqLltjZl0gW2NmXW9ycGhhbiouW2NmXQorCitDaGFuZ2UgdG86CisKKyAgICAgLXJtIFtjZl10ZXN0KiBbY2ZdY3Jvc3N0ZXN0KiBbY2ZdY3Rlc3QqIFtjZl1vcnBoYW4qCisKKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVi4gICBDb250YWN0IGFuZCBTdXBwb3J0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQ29udGFjdDogaHR0cDovL3d3dy5jcy51aC5lZHUvfmhwY3Rvb2xzCmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYWRkaW5nX3hmYWlscy5weSBiL2ZpbmFsL3Rlc3RzdWl0ZS9hZGRpbmdfeGZhaWxzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJhZDQ4ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYWRkaW5nX3hmYWlscy5weQpAQCAtMCwwICsxLDMyIEBACisKK2ltcG9ydCBvcworaW1wb3J0IGNvbW1hbmRzCisKK3BlcmwgPSAiL3Vzci9iaW4vcGVybCIKK0xMVk0gPSAiLi9MTFZNLUlSLyIKK3RlbXBfZmlsZW5hbWUgPSAidGVtcCIKK1hGQUlMX3RleHQgPSAiOyBYRkFJTDogKlxuIgorCisKK2FyY2hfZmlsZV9saXN0ID0gZGljdCgpCithcmNoX2ZpbGVfbGlzdFsnbGluXzMyZSddID0gWyd0ZXN0X29tcF90YXNrX2ZpbmFsLmxsJywgJ3Rlc3Rfb21wX3Rhc2tfdW50aWVkLmxsJ10KKworCithcmNoX3NjcmlwdCA9ICIuLi9ydW50aW1lL3Rvb2xzL2NoZWNrLW9wZW5tcC10ZXN0LnBsIgorYXJjaF9jbWQgPSBwZXJsICsgIiAiICsgYXJjaF9zY3JpcHQKK2FyY2ggPSBjb21tYW5kcy5nZXRvdXRwdXQoYXJjaF9jbWQpCithcmNoID0gYXJjaFs6bGVuKGFyY2gpLTFdCisKK3ByaW50ICJBZGRpbmcgWEZBSUxTIC4uLiIKKworZm9yIGYgaW4gYXJjaF9maWxlX2xpc3RbYXJjaF06CisJZmlsZW5hbWUgPSBMTFZNICsgYXJjaCArICIvIiArIGYKKwlsaW5lcyA9IG9wZW4oZmlsZW5hbWUpLnJlYWRsaW5lcygpCisJbGluZXMuaW5zZXJ0KDEsIFhGQUlMX3RleHQpCisJZjIgPSBvcGVuKHRlbXBfZmlsZW5hbWUsICJ3IikKKwlmb3IgbCBpbiBsaW5lczoKKwkJZjIud3JpdGUobCkKKwlmMi5jbG9zZSgpCisKKwlvcy5zeXN0ZW0oIm12ICIgKyB0ZW1wX2ZpbGVuYW1lICsgIiAiICsgZmlsZW5hbWUpCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9iaW4vTWFrZWZpbGUgYi9maW5hbC90ZXN0c3VpdGUvYmluL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYmQzYmEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYmluL01ha2VmaWxlCkBAIC0wLDAgKzEsMjMgQEAKK0NDICAgICA9IGNsYW5nCitDRkxBR1MgPSAtZm9wZW5tcCAtUyAtZW1pdC1sbHZtCitJTkNMID0KK0xJQlMgPQorCitCSU4gPQorU1JDX0RJUiA9IC4vYworU1JDX0ZJTEVTIDo9ICQoZm9yZWFjaCBESVIsICQoU1JDX0RJUiksICQod2lsZGNhcmQgJChTUkNfRElSKS8qLmMpKQorT0JKUyA6PSAkKHBhdHN1YnN0ICUuYywgJS5vLCAkKFNSQ19GSUxFUykpCitUQVJHRVRMSVNUIDo9ICQocGF0c3Vic3QgJS5jLCAlLCAkKFNSQ19GSUxFUykpCisKK2FsbDokKFRBUkdFVExJU1QpCisJLi9kaXN0cmlidXRlLnNoCisJQCBlY2hvIGFsbCBkb25lCisKKy5QSE9OWTogY2xlYW4KKworJChUQVJHRVRMSVNUKTogJChTUkNfRklMRVMpCisJJChDQykgJChDRkxBR1MpICQoTElCUykgJChJTkNMKSAkQC5jIC1vICRALmxsCisKK2NsZWFuOgorCUAgcm0gLXJmIGMvKgorCUAgZWNobyBjbGVhbiBiaW4gZG9uZQpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Jpbi9kaXN0cmlidXRlLnNoIGIvZmluYWwvdGVzdHN1aXRlL2Jpbi9kaXN0cmlidXRlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRiYjBmNWYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYmluL2Rpc3RyaWJ1dGUuc2gKQEAgLTAsMCArMSwxMjUgQEAKKyMhL2Jpbi9iYXNoCisKKyMgYWRkIGhlYWRlciBmb3IgLmxsIGZpbGVzCisKKyMgZ2V0IHRtcCBoZWFkZXIKK2NwIGhlYWRlciAvdG1wL3RtcC5oZWFkZXIKK2VjaG8gPj4gL3RtcC90bXAuaGVhZGVyCisKKyMgY3JlYXRlIHRlbXBvcmFyeSB0ZXN0IHBhY2thZ2UKK21rZGlyIGMtJE1BQ0hUWVBFJE9TVFlQRQorYGNwIGMvKi5sbCBjLSRNQUNIVFlQRSRPU1RZUEUvYAorCisjIGFkZCBuZXcgaGVhZGVyIGludG8gLmxsIGZpbGVzCitmb3IgZmlsZSBpbiBjLSRNQUNIVFlQRSRPU1RZUEUvKgorZG8KKyAgICBjcCAkZmlsZSAvdG1wL3RtcC5sbC5iZgorICAgIGNhdCAvdG1wL3RtcC5oZWFkZXIgL3RtcC90bXAubGwuYmYgPiAvdG1wL3RtcC5sbAorICAgIG12IC90bXAvdG1wLmxsICRmaWxlCitkb25lCisKKworIyBpbiBiaW4vLCB0YXJnZXQgaXMgLi4vTExWTS1JUi9BUkNIL09TCitMRVZFTD0uLi9MTFZNLUlSLworQVJDSF9QQVRIPS4uL0xMVk0tSVIvCitPU19QQVRIPS4uL0xMVk0tSVIvCisKKyMgZm9yIGxpbnV4IHN5c3RlbSwgYWRkIHlvdXIgYXJjaCBhbmQgb3MgaGVyZQorZGVjbGFyZSAtYSBBUkNIZXM9KHg4NiB4ODZfNjQgcG93ZXJwYyBhcm0gbWlwcyBkYXJ3aW4pCitkZWNsYXJlIC1hIE9TZXM9KGxpbnV4IG1hY29zeCB3aW5kb3dzIGRhcndpbikKKworZGVjbGFyZSBsb3dlckFSQ0gKK2RlY2xhcmUgbG93ZXJPUworCisjIHRhcmdldCBkaXJlY3RvcnkgbmFtZQorZGVjbGFyZSB1cHBlckFSQ0gKK2RlY2xhcmUgdXBwZXJPUworCitsb3dlckFSQ0g9JChlY2hvICIkTUFDSFRZUEUiIHwgdHIgJ1s6dXBwZXI6XScgJ1s6bG93ZXI6XScpCitsb3dlck9TPSQoZWNobyAiJE9TVFlQRSIgfCB0ciAnWzp1cHBlcjpdJyAnWzpsb3dlcjpdJykKKworIyBBUkNICitmb3IgaSBpbiAke0FSQ0hlc1tAXX0KK2RvCisgICAgcmVzdWx0PSQoZWNobyAiJHtsb3dlckFSQ0h9IiB8IGdyZXAgJGkpCisgICAgaWYgW1sgIiRyZXN1bHQiICE9ICIiIF1dCisgICAgdGhlbgorICAgICAgICAjIHVwcGVyQVJDSD0kaQorCQl1cHBlckFSQ0g9JChlY2hvICIkaSIgfCB0ciAnWzpsb3dlcjpdJyAnWzp1cHBlcjpdJykKKyAgICBmaQorZG9uZQorCitpZiBbWyAiJHVwcGVyQVJDSCIgPT0gIiIgXV0KK3RoZW4KKyAgICBlY2hvICJOb3QgZm91bmQgJHtsb3dlckFSQ0h9IGluIHRoZSBbJHtBUkNIZXNbQF19XSEiCisgICAgZXhpdAorZmkKKworIyBPUworZm9yIGkgaW4gJHtPU2VzW0BdfQorZG8KKyAgICByZXN1bHQ9JChlY2hvICIke2xvd2VyT1N9IiB8IGdyZXAgJGkpCisgICAgaWYgW1sgIiRyZXN1bHQiICE9ICIiIF1dCisgICAgdGhlbgorICAgICAgICAjIHVwcGVyT1M9JGkKKwkJdXBwZXJPUz0kKGVjaG8gIiRpIiB8IHRyICdbOmxvd2VyOl0nICdbOnVwcGVyOl0nKQorICAgIGZpCitkb25lCisKK2lmIFtbICIkdXBwZXJPUyIgPT0gIiIgXV0KK3RoZW4KKyAgICBlY2hvICJOb3QgZm91bmQgJHtsb3dlck9TfSBpbiB0aGUgWyR7T1Nlc1tAXX1dISIKKyAgICBleGl0CitmaQorCisjIHN1cnZpdmVkLCBhc3NlbWJsZSB0aGUgcGF0aAorIyBBUkNIX1BBVEgrPSR1cHBlckFSQ0gvCisjIE9TX1BBVEgrPSR1cHBlckFSQ0gvJHVwcGVyT1MvCitBUkNIX25ld0Zvcm1hdD0uCitpZiBbICR1cHBlckFSQ0ggPSAiWDg2IiBdOyB0aGVuCisgICAgQVJDSF9uZXdGb3JtYXQ9MzIKK2Vsc2UKKyAgICBBUkNIX25ld0Zvcm1hdD0zMmUKK2ZpCitPU19uZXdGb3JtYXQ9LgoraWYgWyAkdXBwZXJPUyA9ICJMSU5VWCIgXTsgdGhlbgorICAgIE9TX25ld0Zvcm1hdD1saW4KK2VsaWYgWyAkdXBwZXJPUyA9ICJNQUNPU1giIF07IHRoZW4KKyAgICBPU19uZXdGb3JtYXQ9bWFjCitlbGlmIFsgJHVwcGVyT1MgPSAiV0lORE9XUyIgXTsgdGhlbgorICAgIE9TX25ld0Zvcm1hdD13aW4KK2VsaWYgWyAkdXBwZXJPUyA9ICJEQVJXSU4iIF07IHRoZW4KKyAgICBPU19uZXdGb3JtYXQ9ZGFyCitlbHNlCisgICAgT1NfbmV3Rm9ybWF0PXVua25vd24KK2ZpCitPU19QQVRIKz0kT1NfbmV3Rm9ybWF0Il8iJEFSQ0hfbmV3Rm9ybWF0CisKKyMgdGVzdCBhbmQgY3JlYXRlIGRpcmVjdG9yeQoraWYgWyAhIC1kICIkTEVWRUwiIF07IHRoZW4KKyAgICBta2RpciAkTEVWRUwKKyAgICBta2RpciAkT1NfUEFUSAorZWxzZQorICAgIGlmIFsgISAtZCAiJE9TX1BBVEgiIF07IHRoZW4KKyAgICAgICAgbWtkaXIgJE9TX1BBVEgKKyAgICBmaQorZmkKKworIyByZXNlcnZlIHRoZSB0bXAgcGF0aCB0byBMTFZNLUlSL0FSQ0gvT1MKK2VjaG8gJE9TX1BBVEgiLyIgPiBsaXQudG1wCisKKyMgT1NfQVJDSD0kT1NfbmV3Rm9ybWF0Il8iJEFSQ0hfbmV3Rm9ybWF0CisjIGVjaG8gLWUgImlmIG5vdCAnJE9TX0FSQ0gnIGluIGNvbmZpZy5yb290LnRhcmdldHM6IiA+ICRPU19QQVRIJy8nbGl0LmxvY2FsLmNmZworIyBlY2hvIC1lICJcdGNvbmZpZy51bnN1cHBvcnRlZCA9IFRydWUiID4+ICRPU19QQVRIJy8nbGl0LmxvY2FsLmNmZworCisjIGNvcHkgKi5sbCBmaWxlcyB0byBBUkNIL09TCitgY3AgbGl0LiogJExFVkVMYAorCisjIG9taXQgb3JwaCB0ZXN0Citgcm0gYy0kTUFDSFRZUEUkT1NUWVBFL2N0ZXN0XyoubGxgCitgcm0gYy0kTUFDSFRZUEUkT1NUWVBFL29ycGhfY3Rlc3RfKi5sbGAKK2BjcCBjLSRNQUNIVFlQRSRPU1RZUEUvKi5sbCAkT1NfUEFUSGAKKworIyBjbGVhbgorYHJtIC90bXAvdG1wLipgCitybSAtcmYgYy0kTUFDSFRZUEUkT1NUWVBFLwpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Jpbi9oZWFkZXIgYi9maW5hbC90ZXN0c3VpdGUvYmluL2hlYWRlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzQxZTYyCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Jpbi9oZWFkZXIKQEAgLTAsMCArMSw2IEBACis7IFJVTjogJWNsYW5nIC1sb21wIC1sbSAlcyAtbyAldCAmJiAldCAyPiYxIHwgRmlsZUNoZWNrICVzCis7IENIRUNLLU5PVDogVGVzdCBmYWlsZWQKKzsgQ0hFQ0s6IERpcmVjdGl2ZSB3b3JrZWQgd2l0aG91dCBlcnJvcnMKKworCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9iaW4vbGl0LmNmZyBiL2ZpbmFsL3Rlc3RzdWl0ZS9iaW4vbGl0LmNmZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTU3ODE5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Jpbi9saXQuY2ZnCkBAIC0wLDAgKzEsNzggQEAKKyMgLSotIFB5dGhvbiAtKi0KKworIyBDb25maWd1cmF0aW9uIGZpbGUgZm9yIHRoZSAnbGl0JyB0ZXN0IHJ1bm5lci4KKworaW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgcmUKK2ltcG9ydCBwbGF0Zm9ybQorCit0cnk6CisgICBpbXBvcnQgbGl0LnV0aWwKKyAgIGltcG9ydCBsaXQuZm9ybWF0cworZXhjZXB0IEltcG9ydEVycm9yOgorICAgcGFzcworCisjIG5hbWU6IFRoZSBuYW1lIG9mIHRoaXMgdGVzdCBzdWl0ZS4KK2NvbmZpZy5uYW1lID0gJ09wZW5NUFZhbGlkYXRpb25TdWl0ZScKKworIyB0ZXN0Rm9ybWF0OiBUaGUgdGVzdCBmb3JtYXQgdG8gdXNlIHRvIGludGVycHJldCB0ZXN0cy4KK2NvbmZpZy50ZXN0X2Zvcm1hdCA9IGxpdC5mb3JtYXRzLlNoVGVzdChleGVjdXRlX2V4dGVybmFsPUZhbHNlKQorCisjIHN1ZmZpeGVzOiBBIGxpc3Qgb2YgZmlsZSBleHRlbnNpb25zIHRvIHRyZWF0IGFzIHRlc3QgZmlsZXMKKyMgTm90ZSB0aGlzIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGxpdC5sb2NhbC5jZmcgZmlsZXMKK2NvbmZpZy5zdWZmaXhlcyA9IFsnLmxsJ10KKworIyB0ZXN0X3NvdXJjZV9yb290OiBUaGUgcm9vdCBwYXRoIHdoZXJlIHRlc3RzIGFyZSBsb2NhdGVkLgorI2NvbmZpZy50ZXN0X3NvdXJjZV9yb290ID0gIi9ob21lL2ljaG95angvaW5zdGFsbC9vcGVubXAvdGVzdHN1aXRlL2JpbiIKKyNvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pCisKKyMgdGVzdF9leGVjX3Jvb3Q6IFRoZSByb290IHBhdGggd2hlcmUgdGVzdHMgc2hvdWxkIGJlIHJ1bi4KKyNtcHZzX29ial9yb290ID0gZ2V0YXR0cihjb25maWcsICdtcHZzX29ial9yb290JywgTm9uZSkKKyNpZiBtcHZzX29ial9yb290IGlzIG5vdCBOb25lOgorY29uZmlnLnRlc3RfZXhlY19yb290ID0gIi4vIgorI29zLnBhdGguam9pbihtcHZzX29ial9yb290LCAnc3JjJykKKworIyBEaXNjb3ZlciB0aGUgJ2NsYW5nJyBhbmQgJ2NsYW5nY2MnIHRvIHVzZS4KKworaW1wb3J0IG9zCisKK2RlZiBpbmZlckNsYW5nKFBBVEgpOgorICAgICMgRGV0ZXJtaW5lIHdoaWNoIGNsYW5nIHRvIHVzZS4KKyAgICBjbGFuZyA9IG9zLmdldGVudignQ0xBTkcnKQorCisgICAgIyBJZiB0aGUgdXNlciBzZXQgY2xhbmcgaW4gdGhlIGVudmlyb25tZW50LCBkZWZpbml0ZWx5IHVzZSB0aGF0IGFuZCBkb24ndAorICAgICMgdHJ5IHRvIHZhbGlkYXRlLgorICAgIGlmIGNsYW5nOgorICAgICAgICByZXR1cm4gY2xhbmcKKworICAgICMgT3RoZXJ3aXNlIGxvb2sgaW4gdGhlIHBhdGguCisgICAgY2xhbmcgPSBsaXQudXRpbC53aGljaCgnY2xhbmcnLCBQQVRIKQorCisgICAgaWYgbm90IGNsYW5nOgorICAgICAgICBsaXRfY29uZmlnLmZhdGFsKCJjb3VsZG4ndCBmaW5kICdjbGFuZycgcHJvZ3JhbSwgdHJ5IHNldHRpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJDTEFORyBpbiB5b3VyIGVudmlyb25tZW50IikKKworICAgIHJldHVybiBjbGFuZworCitjb25maWcuY2xhbmcgPSBpbmZlckNsYW5nKGNvbmZpZy5lbnZpcm9ubWVudFsnUEFUSCddKS5yZXBsYWNlKCdcXCcsICcvJykKK2NvbmZpZy5zdWJzdGl0dXRpb25zLmFwcGVuZCggKCclY2xhbmcnLCAnICcgKyBjb25maWcuY2xhbmcgKyAnICcpICkKKworIyBQcm9wb2dhdGUgc29tZSBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0ZXN0IGVudmlyb25tZW50LgorZGVmIGFkZEVudihuYW1lKToKKyAgICBpZiBuYW1lIGluIG9zLmVudmlyb246CisgICAgICAgIGNvbmZpZy5lbnZpcm9ubWVudFtuYW1lXSA9IG9zLmVudmlyb25bbmFtZV0KKworYWRkRW52KCdIT01FJykKK2FkZEVudignUFdEJykKKworCithZGRFbnYoJ0NfSU5DTFVERV9QQVRIJykKK2FkZEVudignQ1BMVVNfSU5DTFVERV9QQVRIJykKK2FkZEVudignTElCUkFSWV9QQVRIJykKK2FkZEVudignTERfTElCUkFSWV9QQVRIJykKK2FkZEVudignRFlMRF9MSUJSQVJZX1BBVEgnKQorCisjIENoZWNrIHRoYXQgdGhlIG9iamVjdCByb290IGlzIGtub3duLgoraWYgY29uZmlnLnRlc3RfZXhlY19yb290IGlzIE5vbmU6CisgICAgbGl0LmZhdGFsKCd0ZXN0IGV4ZWN1dGlvbiByb290IG5vdCBzZXQhJykKZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9iaW4vbGl0LnNpdGUuY2ZnLmluIGIvZmluYWwvdGVzdHN1aXRlL2Jpbi9saXQuc2l0ZS5jZmcuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE4NjZkNAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9iaW4vbGl0LnNpdGUuY2ZnLmluCkBAIC0wLDAgKzEsMzAgQEAKKyMjIEF1dG9nZW5lcmF0ZWQgYnkgTExWTS9DbGFuZyBjb25maWd1cmF0aW9uLgorI2NvbmZpZy5tcHZzX3NyY19yb290ID0gIi9ob21lL2ljaG95angvaW5zdGFsbC9vcGVubXAvdGVzdHN1aXRlL2Jpbi9jIgorY29uZmlnLm1wdnNfb2JqX3Jvb3QgPSAiL3RtcCIKK2NvbmZpZy5sbHZtX3Rvb2xzX2RpciA9ICJATExWTV9UT09MU19ESVJAIgorCisKKyMgTmVlZGVkIHRvIGNoZWNrIGlmIGEgaGFjayBuZWVkcyB0byBiZSBhcHBsaWVkCitjb25maWcubGx2bV92ZXJzaW9uX21ham9yID0gIkBMTFZNX1ZFUlNJT05fTUFKT1JAIgorCisjIENvbXBpbGVycworIyBGSVhNRTogdXNlIGxsdm1jYyBub3QgbGx2bWdjYworY29uZmlnLmxsdm1jbGFuZyA9ICJjbGFuZyIKKworIyBGZWF0dXJlcworY29uZmlnLmVuYWJsZV91Y2xpYmMgPSBUcnVlIGlmIEBFTkFCTEVfVUNMSUJDQCA9PSAxIGVsc2UgRmFsc2UKK2NvbmZpZy5lbmFibGVfcG9zaXhfcnVudGltZSA9IFRydWUgaWYgQEVOQUJMRV9QT1NJWF9SVU5USU1FQCA9PSAxIGVsc2UgRmFsc2UKK2NvbmZpZy5oYXZlX3NlbGludXggPSBUcnVlIGlmIEBIQVZFX1NFTElOVVhAID09IDEgZWxzZSBGYWxzZQorCisjIEN1cnJlbnQgdGFyZ2V0Citjb25maWcudGFyZ2V0X3RyaXBsZSA9ICJAVEFSR0VUX1RSSVBMRUAiCisKKyMgTGV0IHRoZSBtYWluIGNvbmZpZyBkbyB0aGUgcmVhbCB3b3JrLgordHJ5OgorICBsaXQKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICMgVXNlIGxpdF9jb25maWcgY2xhc3MKKyAgbGl0X2NvbmZpZy5sb2FkX2NvbmZpZyhjb25maWcsICJATVBWU19TT1VSQ0VfRElSQC9saXQuY2ZnIikKK2Vsc2U6CisgICMgVXNlIG9sZCBsaXQgY2xhc3MKKyAgbGl0LmxvYWRfY29uZmlnKGNvbmZpZywgIkBNUFZTX1NPVVJDRV9ESVJAL2xpdC5jZmciKQpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Jpbi9saXQudG1wIGIvZmluYWwvdGVzdHN1aXRlL2Jpbi9saXQudG1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZDMwZmIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYmluL2xpdC50bXAKQEAgLTAsMCArMSBAQAorLi4vTExWTS1JUi9saW5fMzJlLwpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2MvaGFzX29wZW5tcC5jIGIvZmluYWwvdGVzdHN1aXRlL2MvaGFzX29wZW5tcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4M2E5NzMKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9oYXNfb3Blbm1wLmMKQEAgLTAsMCArMSwzMCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBPcGVuTXAgc3VwcG9ydC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+X09QRU5NUDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPmhhc19vcGVubXA8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQgcnZhbHVlID0gMDsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgPG9tcHRzOm9ycGhhbj4KKyAgICA8b21wdHM6Y2hlY2s+CisjaWZkZWYgX09QRU5NUAorCXJ2YWx1ZSA9IDE7CisjZW5kaWYKKyAgICA8L29tcHRzOmNoZWNrPgorICAgIDxvbXB0czpjcm9zc2NoZWNrPgorI2lmIDAKKwlydmFsdWUgPSAxOworI2VuZGlmCisgICAgPC9vbXB0czpjcm9zc2NoZWNrPgorICAgICAgPC9vbXB0czpvcnBoYW4+CisJcmV0dXJuIChydmFsdWUpOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9hdG9taWMuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9hdG9taWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzJkMWFhCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2F0b21pYy5jCkBAIC0wLDAgKzEsNDM0IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBhdG9taWMgZGlyZWN0aXZlIGJ5IGNvdW50aW5nIHVwIGEgdmFyaWFibGUgaW4gYSBwYXJhbGxlbGl6ZWQgbG9vcCB3aXRoIGFuIGF0b21pYyBkaXJlY3RpdmUuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBhdG9taWM8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2F0b21pYzwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBzdW07CisgICAgICAgIGludCBkaWZmOworICAgICAgICBkb3VibGUgZHN1bSA9IDA7CisgICAgICAgIGRvdWJsZSBkdCA9IDAuNTsJLyogYmFzZSBvZiBnZW9tZXRyaWMgcm93IGZvciArIGFuZCAtIHRlc3QqLworICAgICAgICBkb3VibGUgZGRpZmY7CisgICAgICAgIGludCBwcm9kdWN0OworICAgICAgICBpbnQgeDsKKyAgICAgICAgaW50ICpsb2dpY3M7CisgICAgICAgIGludCBiaXRfYW5kID0gMTsKKyAgICAgICAgaW50IGJpdF9vciA9IDA7CisgICAgICAgIGludCBleGNsdXNpdl9iaXRfb3IgPSAwOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyNkZWZpbmUgRE9VQkxFX0RJR0lUUyAyMAkvKiBkdF5ET1VCTEVfRElHSVRTICovCisjZGVmaW5lIE1BWF9GQUNUT1IgMTAKKyNkZWZpbmUgS05PV05fUFJPRFVDVCAzNjI4ODAwCS8qIDEwISAqLworICAgIGludCBqOworICAgIGludCBrbm93bl9zdW07CisgICAgaW50IGtub3duX2RpZmY7CisgICAgaW50IGtub3duX3Byb2R1Y3Q7CisgICAgaW50IHJlc3VsdCA9IDA7CisgICAgaW50IGxvZ2ljX2FuZCA9IDE7CisgICAgaW50IGxvZ2ljX29yID0gMDsKKyAgICBkb3VibGUgZGtub3duX3N1bTsKKyAgICBkb3VibGUgcm91bmRpbmdfZXJyb3IgPSAxLkUtOTsKKyAgICBkb3VibGUgZHB0LCBkaXY7CisgICAgaW50IGxvZ2ljc0FycmF5W0xPT1BDT1VOVF07CisgICAgbG9naWNzID0gbG9naWNzQXJyYXk7CisgICAgCisgICAgc3VtID0gMDsKKyAgICBkaWZmID0gMDsKKyAgICBwcm9kdWN0ID0gMTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGk7CisjcHJhZ21hIG9tcCBmb3IKKwkgICAgZm9yIChpID0gMTsgaSA8PSBMT09QQ09VTlQ7IGkrKykKKwkgICAgeworCQk8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgYXRvbWljPC9vbXB0czpjaGVjaz4KKwkJc3VtICs9IGk7CisJICAgIH0KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9CisgICAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyOworICAgIGlmIChrbm93bl9zdW0gIT0gc3VtKQorICAgIHsKKyAgICAgICAgZnByaW50ZiAobG9nRmlsZSwgCisgICAgICAgICAgICAgICAgICJFcnJvciBpbiBzdW0gd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mICVkLlxuIiwgCisgICAgICAgICAgICAgICAgIHN1bSwga25vd25fc3VtKTsKKyAgICAgICAgcmVzdWx0Kys7CisgICAgfQorICAgIAorI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisgICAgICAgIDxvbXB0czpvcnBoYW4+ICAgCisgICAgICAgICAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvcgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgYXRvbWljPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICAgZGlmZiAtPSBpOworICAgICAgICAgICAgfQorICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICB9CisgICAga25vd25fZGlmZiA9ICgoTE9PUENPVU5UIC0gMSkgKiBMT09QQ09VTlQpIC8gMiAqIC0xOworICAgIGlmIChkaWZmICE9IGtub3duX2RpZmYpCisgICAgeworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLAorICAgICAgICAgICAgICAiRXJyb3IgaW4gZGlmZmVyZW5jZSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgMC5cbiIsCisgICAgICAgICAgICAgICBkaWZmKTsKKyAgICAgICAgcmVzdWx0Kys7CisgICAgfQorCisgICAgLyogVGVzdHMgZm9yIGRvdWJsZXMgKi8KKyAgICBkc3VtID0gMDsKKyAgICBkcHQgPSAxOworCisgICAgZm9yIChqID0gMDsgaiA8IERPVUJMRV9ESUdJVFM7ICsraikKKyAgICAgIHsKKyAgICAgICAgZHB0ICo9IGR0OworICAgICAgfQorICAgIGRrbm93bl9zdW0gPSAoMSAtIGRwdCkgLyAoMSAtZHQpOworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvcgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IERPVUJMRV9ESUdJVFM7ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgYXRvbWljPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICBkc3VtICs9IHBvdyAoZHQsIGkpOworICAgICAgICAgICAgfQorICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICB9CisKKyAgICBpZiAoZHN1bSAhPSBka25vd25fc3VtICYmIChmYWJzIChkc3VtIC0gZGtub3duX3N1bSkgPiByb3VuZGluZ19lcnJvcikpCisgICAgeworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLAorICAgICAgICAgICAgICAgICAiRXJyb3IgaW4gc3VtIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlZiBpbnN0ZWFkIG9mOiAlZiAoRGlmZmVyZW5jZTogJUUpXG4iLAorICAgICAgICAgICAgICAgICBkc3VtLCBka25vd25fc3VtLCBkc3VtIC0gZGtub3duX3N1bSk7CisgICAgICAgIHJlc3VsdCsrOworICAgIH0KKworICAgIGRwdCA9IDE7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgRE9VQkxFX0RJR0lUUzsgKytqKQorICAgIHsKKyAgICAgICAgZHB0ICo9IGR0OworICAgIH0KKyAgICBkZGlmZiA9ICgxIC0gZHB0KSAvICgxIC0gZHQpOworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgIHsKKyAgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvcgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IERPVUJMRV9ESUdJVFM7ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgYXRvbWljPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICBkZGlmZiAtPSBwb3cgKGR0LCBpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgIH0gCisgICAgaWYgKGZhYnMgKGRkaWZmKSA+IHJvdW5kaW5nX2Vycm9yKQorICAgIHsKKyAgICAgICAgZnByaW50ZiAobG9nRmlsZSwKKyAgICAgICAgICAgICAgICAgIkVycm9yIGluIGRpZmZlcmVuY2Ugd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICVFIGluc3RlYWQgb2YgMC4wXG4iLAorICAgICAgICAgICAgICAgICBkZGlmZik7CisgICAgICAgIHJlc3VsdCsrOworICAgIH0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisgICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgaW50IGk7CisjcHJhZ21hIG9tcCBmb3IKKyAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gTUFYX0ZBQ1RPUjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIHByb2R1Y3QgKj0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgIH0KKyAgICAKKyAgICBrbm93bl9wcm9kdWN0ID0gS05PV05fUFJPRFVDVDsKKyAgICBpZiAoa25vd25fcHJvZHVjdCAhPSBwcm9kdWN0KQorICAgIHsKKyAgICAgICAgZnByaW50ZiAobG9nRmlsZSwKKyAgICAgICAgICAgICAgICAgIkVycm9yIGluIHByb2R1Y3Qgd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mICVkXG4iLAorICAgICAgICAgICAgICAgICBwcm9kdWN0LCBrbm93bl9wcm9kdWN0KTsKKyAgICAgICAgcmVzdWx0Kys7CisgICAgfQorCisgICAgcHJvZHVjdCA9IEtOT1dOX1BST0RVQ1Q7CisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgaW50IGk7CisjcHJhZ21hIG9tcCBmb3IKKyAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gTUFYX0ZBQ1RPUjsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIHByb2R1Y3QgLz0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmIChwcm9kdWN0ICE9IDEpCisgICAgeworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLAorICAgICAgICAgICAgICAgICAiRXJyb3IgaW4gcHJvZHVjdCBkaXZpc2lvbiB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgMVxuIiwKKyAgICAgICAgICAgICAgICAgcHJvZHVjdCk7CisgICAgICAgIHJlc3VsdCsrOworICAgIH0KKyAgICAKKyAgICBkaXYgPSA1LjBFKzU7CisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyAgICAgICAgICAgIGludCBpOworI3ByYWdtYSBvbXAgZm9yCisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDw9IE1BWF9GQUNUT1I7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgYXRvbWljPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICBkaXYgLz0gaTsKKyAgICAgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZmFicyhkaXYtMC4xMzc3ODcpID49IDEuMEUtNCApCisgICAgeworICAgICAgICByZXN1bHQrKzsKKyAgICAgICAgZnByaW50ZiAobG9nRmlsZSwKKyAgICAgICAgICAgICAgICAgIkVycm9yIGluIGRpdmlzaW9uIHdpdGggZG91YmxlOiBSZXN1bHQgd2FzICVmIGluc3RlYWQgb2YgMC4xMzc3ODdcbiIsIGRpdik7CisgICAgfQorCisgICAgeCA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgaW50IGk7CisjcHJhZ21hIG9tcCBmb3IKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgYXRvbWljPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICB4Kys7CisgICAgICAgICAgICB9CisgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICB9CisKKyAgICBpZiAoeCAhPSBMT09QQ09VTlQpCisgICAgeworICAgICAgICByZXN1bHQrKzsKKyAgICAgICAgZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluICsrXG4iKTsKKyAgICB9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgaW50IGk7CisjcHJhZ21hIG9tcCBmb3IKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgYXRvbWljPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICB4LS07CisgICAgICAgICAgICB9CisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmICh4ICE9IDApCisgICAgeworICAgICAgICByZXN1bHQrKzsKKyAgICAgICAgZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIC0tXG4iKTsKKyAgICB9CisKKyAgICBmb3IgKGogPSAwOyBqIDwgTE9PUENPVU5UOyArK2opCisgICAgeworICAgICAgICBsb2dpY3Nbal0gPSAxOworICAgIH0KKyAgICBiaXRfYW5kID0gMTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgIGludCBpOworI3ByYWdtYSBvbXAgZm9yCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGF0b21pYzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgYml0X2FuZCAmPSBsb2dpY3NbaV07CisgICAgICAgICAgICB9CisgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICB9CisKKyAgICBpZiAoIWJpdF9hbmQpCisgICAgeworICAgICAgICByZXN1bHQrKzsKKyAgICAgICAgZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIEJJVCBBTkQgcGFydCAxXG4iKTsKKyAgICB9CisKKyAgICBiaXRfYW5kID0gMTsKKyAgICBsb2dpY3NbTE9PUENPVU5UIC8gMl0gPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgIGludCBpOworI3ByYWdtYSBvbXAgZm9yCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGF0b21pYzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgYml0X2FuZCAmPSBsb2dpY3NbaV07CisgICAgICAgICAgICB9CisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmIChiaXRfYW5kKQorICAgIHsKKyAgICAgICAgcmVzdWx0Kys7CisgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMlxuIik7CisgICAgfQorCisgICAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgaisrKQorICAgIHsKKyAgICAgICAgbG9naWNzW2pdID0gMDsKKyAgICB9CisgICAgYml0X29yID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvcgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIGJpdF9vciB8PSBsb2dpY3NbaV07CisgICAgICAgICAgICB9CisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmIChiaXRfb3IpCisgICAgeworICAgICAgICByZXN1bHQrKzsKKyAgICAgICAgZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIEJJVCBPUiBwYXJ0IDFcbiIpOworICAgIH0KKyAgICBiaXRfb3IgPSAwOworICAgIGxvZ2ljc1tMT09QQ09VTlQgLyAyXSA9IDE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgaW50IGk7CisjcHJhZ21hIG9tcCBmb3IKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgYXRvbWljPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICBiaXRfb3IgfD0gbG9naWNzW2ldOworICAgICAgICAgICAgfQorICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGlmICghYml0X29yKQorICAgIHsKKyAgICAgICAgcmVzdWx0Kys7CisgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBCSVQgT1IgcGFydCAyXG4iKTsKKyAgICB9CisKKyAgICBmb3IgKGogPSAwOyBqIDwgTE9PUENPVU5UOyBqKyspCisgICAgeworICAgICAgICBsb2dpY3Nbal0gPSAwOworICAgIH0KKyAgICBleGNsdXNpdl9iaXRfb3IgPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4gCisgICAgICAgICAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvcgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgYXRvbWljPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICAgZXhjbHVzaXZfYml0X29yIF49IGxvZ2ljc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBpZiAoZXhjbHVzaXZfYml0X29yKSAKKyAgICB7CisgICAgICAgIHJlc3VsdCsrOworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMVxuIik7CisgICAgfQorCisgICAgZXhjbHVzaXZfYml0X29yID0gMDsKKyAgICBsb2dpY3NbTE9PUENPVU5UIC8gMl0gPSAxOworICAgIAorI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisgICAgICAgIDxvbXB0czpvcnBoYW4+IAorICAgICAgICAgICAgaW50IGk7CisjcHJhZ21hIG9tcCBmb3IKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGF0b21pYzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgIGV4Y2x1c2l2X2JpdF9vciBePSBsb2dpY3NbaV07CisgICAgICAgICAgICB9CisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgaWYgKCFleGNsdXNpdl9iaXRfb3IpIAorICAgIHsKKyAgICAgICAgcmVzdWx0Kys7CisgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAyXG4iKTsKKyAgICB9CisKKyAgICB4ID0gMTsKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgaW50IGk7CisjcHJhZ21hIG9tcCBmb3IKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMDsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgYXRvbWljPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICAgeCA8PD0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKCB4ICE9IDEwMjQpCisgICAgeworICAgICAgICByZXN1bHQrKzsKKyAgICAgICAgZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIDw8XG4iKTsKKyAgICAgICAgeCA9IDEwMjQ7CisgICAgfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgIGludCBpOworI3ByYWdtYSBvbXAgZm9yCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTA7ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgYXRvbWljPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICB4ID4+PSAxOworICAgICAgICAgICAgfQorICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICB9CisKKyAgICBpZiAoeCAhPSAxKQorICAgIHsKKyAgICAgICAgcmVzdWx0Kys7CisgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiA+PlxuIik7CisgICAgfQorCisgICAgcmV0dXJuIChyZXN1bHQgPT0gMCk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2JhcnJpZXIuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9iYXJyaWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY2NjllMgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9iYXJyaWVyLmMKQEAgLTAsMCArMSw0MSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgYmFycmllciBkaXJlY3RpdmUuIFRoZSB0ZXN0IGNyZWF0ZXMgc2V2ZXJhbCB0aHJlYWRzIGFuZCBzZW5kcyBvbmUgb2YgdGhlbSBzbGVlcGluZyBiZWZvcmUgc2V0dGluZyBhIGZsYWcuIEFmdGVyIHRoZSBiYXJyaWVyIHRoZSBvdGhlciBvbmVzIGRvIHNvbWUgbGl0dGxlIHdvcmsgZGVwZW5kaW5nIG9uIHRoZSBmbGFnLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgYmFycmllcjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9iYXJyaWVyPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IHJlc3VsdDE7CisJaW50IHJlc3VsdDI7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgIHJlc3VsdDEgPSAwOworICAgIHJlc3VsdDIgPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyAgICA8b21wdHM6b3JwaGFuPgorCWludCByYW5rOworCXJhbmsgPSBvbXBfZ2V0X3RocmVhZF9udW0gKCk7CisJaWYgKHJhbmsgPT0xKSB7CisgICAgICAgIG15X3NsZWVwKFNMRUVQVElNRV9MT05HKTsKKyAgICAgICAgcmVzdWx0MiA9IDM7CisJfQorPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGJhcnJpZXI8L29tcHRzOmNoZWNrPgorCWlmIChyYW5rID09IDIpIHsKKwkgICAgcmVzdWx0MSA9IHJlc3VsdDI7CisJfQorICAgIDwvb21wdHM6b3JwaGFuPgorICAgIH0KKyAgICBwcmludGYoInJlc3VsdDE9JWRcbiIscmVzdWx0MSk7CisgICAgcmV0dXJuIChyZXN1bHQxID09IDMpOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9jcml0aWNhbC5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2NyaXRpY2FsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IzZjI2NAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9jcml0aWNhbC5jCkBAIC0wLDAgKzEsNDIgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIGNyaXRpY2FsIGRpcmVjdGl2ZSBieSBjb3VudGluZyB1cCBhIHZhcmlhYmxlIGluIGEgcGFyYWxsZWxpemVkIGxvb3Agd2l0aGluIGEgY3JpdGljYWwgc2VjdGlvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGNyaXRpY2FsPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2NyaXRpY2FsPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IHN1bTsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgIHN1bT0wOworICAgIGludCBrbm93bl9zdW07CisJICAKKyAgICA8b21wdHM6b3JwaGFuPgorICAgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgaW50IG15c3VtPTA7CisgICAgICBpbnQgaTsKKyAgICAgIAorICAgICAgI3ByYWdtYSBvbXAgZm9yCisJICAgIGZvciAoaSA9IDA7IGkgPCAxMDAwOyBpKyspCisJICAgICAgbXlzdW0gPSBteXN1bSArIGk7CisKKyAgICA8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgY3JpdGljYWw8L29tcHRzOmNoZWNrPgorCSAgICBzdW0gPSBteXN1bSArc3VtOworICAgICAgICAKKyAgICB9CS8qIGVuZCBvZiBwYXJhbGxlbCAqLworICAgIDwvb21wdHM6b3JwaGFuPgorICAgIAorICAgIHByaW50Zigic3VtPSVkXG4iLHN1bSk7CisgICAga25vd25fc3VtID0gOTk5ICogMTAwMCAvIDI7CisgICAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKKworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mbHVzaC5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2ZsdXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZhYmY4ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mbHVzaC5jCkBAIC0wLDAgKzEsNTAgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIGZsdXNoIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGZsdXNoPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGJhcnJpZXI8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9mbHVzaDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCByZXN1bHQxOworCWludCByZXN1bHQyOworCWludCBkdW1teTsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisJcmVzdWx0MSA9IDA7CisJcmVzdWx0MiA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworCWludCByYW5rOworCXJhbmsgPSBvbXBfZ2V0X3RocmVhZF9udW0gKCk7CisKKyNwcmFnbWEgb21wIGJhcnJpZXIKKwlpZiAocmFuayA9PSAxKSB7CisJICAgIHJlc3VsdDIgPSAzOworCSAgICA8b21wdHM6b3JwaGFuPgorCQk8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgZmx1c2ggKHJlc3VsdDIpPC9vbXB0czpjaGVjaz4KKwkJZHVtbXkgPSByZXN1bHQyOworCSAgICA8L29tcHRzOm9ycGhhbj4KKwl9CisKKwlpZiAocmFuayA9PSAwKSB7CisJICAgIDxvbXB0czpjaGVjaz5teV9zbGVlcChTTEVFUFRJTUVfTE9ORyk7PC9vbXB0czpjaGVjaz4KKwkgICAgPG9tcHRzOm9ycGhhbj4KKwkJPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGZsdXNoIChyZXN1bHQyKTwvb21wdHM6Y2hlY2s+CisJCXJlc3VsdDEgPSByZXN1bHQyOworCSAgICA8L29tcHRzOm9ycGhhbj4KKwl9CisgICAgfQkvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworICAgIHJldHVybiAoKHJlc3VsdDEgPT0gcmVzdWx0MikgJiYgKHJlc3VsdDIgPT0gZHVtbXkpICYmIChyZXN1bHQyID09IDMpKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX2NvbGxhcHNlLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX2NvbGxhcHNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIxNmY0MAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3JfY29sbGFwc2UuYwpAQCAtMCwwICsxLDU2IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aXRoIG9tcCBmb3IgY29sbGFwc2UgY2xhdXNlLiBCaW5kIHdpdGggdHdvIGxvb3BzLiBXaXRob3V0IHRoZSBjb2xsYXBzZSBjbGF1c2UsIHRoZSBmaXJzdCBsb29wIHdpbGwgbm90IGJlIG9yZGVyZWQ8L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGZvciBjb2xsYXBzZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbCxvbXAgZm9yIHNjaGVkdWxlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworCisvKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGNoZWNrIHRoYXQgaSBpcyBpbmNyZWFzaW5nIG1vbm90b25pY2FsbHkgCisgICB3aXRoIGVhY2ggY2FsbCAqLworc3RhdGljIGludCBjaGVja19pX2lzbGFyZ2VyIChpbnQgaSkKK3sKKyAgICBzdGF0aWMgaW50IGxhc3RfaTsKKyAgICBpbnQgaXNsYXJnZXI7CisgICAgaWYgKGk9PTEpCisgICAgICBsYXN0X2k9MDsKKyAgICBpc2xhcmdlciA9ICgoaSA+PSBsYXN0X2kpJiYoaSAtIGxhc3RfaTw9MSkpOworICAgIGxhc3RfaSA9IGk7CisgICAgcmV0dXJuIChpc2xhcmdlcik7Cit9CisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9mb3JfY29sbGFwc2U8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgaXNfbGFyZ2VyID0gMTsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgIGludCBpLGo7CisJICBpbnQgbXlfaXNsYXJnZXIgPSAxOworICAgICAgI3ByYWdtYSBvbXAgZm9yIHByaXZhdGUoaSxqKSBzY2hlZHVsZShzdGF0aWMsMSkgPG9tcHRzOmNoZWNrPmNvbGxhcHNlKDIpPC9vbXB0czpjaGVjaz4gb3JkZXJlZAorCSAgICBmb3IgKGkgPSAxOyBpIDwgMTAwOyBpKyspeworICAgICAgICAgIDxvbXB0czpjcm9zc2NoZWNrPm15X2lzbGFyZ2VyID0gY2hlY2tfaV9pc2xhcmdlcihpKSYmIG15X2lzbGFyZ2VyOzwvb21wdHM6Y3Jvc3NjaGVjaz4KKyAgICAgICAgICBmb3IgKGogPTE7IGogPDEwMDsgaisrKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIDxvbXB0czpjaGVjaz4KKwkJICAgICNwcmFnbWEgb21wIG9yZGVyZWQKKwkJICAgICAgbXlfaXNsYXJnZXIgPSBjaGVja19pX2lzbGFyZ2VyKGkpJiZteV9pc2xhcmdlcjsKKyAgICAgICAgICAgIDwvb21wdHM6Y2hlY2s+CisJICAgICAgfQkvKiBlbmQgb2YgZm9yICovCisgICAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisJCWlzX2xhcmdlciA9IGlzX2xhcmdlciAmJiBteV9pc2xhcmdlcjsKKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9CisKKyAgICByZXR1cm4gKGlzX2xhcmdlcik7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9maXJzdHByaXZhdGUuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3JfZmlyc3Rwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI3MjAxNAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3JfZmlyc3Rwcml2YXRlLmMKQEAgLTAsMCArMSw1NSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgZm9yIGZpcnN0cHJpdmF0ZSBjbGF1c2UgYnkgY291bnRpbmcgdXAgYSB2YXJpYWJsZSBpbiBhIHBhcmFsbGVsaXplZCBsb29wLiBFYWNoIHRocmVhZCBoYXMgYSBmaXJzdHByaXZhdGUgdmFyaWFibGUgKDEpIGFuZCBhbiB2YXJpYWJsZSAoMikgZGVjbGFyZWQgYnkgZm9yIGZpcnN0cHJpdmF0ZS4gRmlyc3QgaXQgc3RvcmVzIHRoZSByZXN1bHQgb2YgaXRzIGxhc3QgaXRlcmF0aW9uIGluIHZhcmlhYmxlICgyKS4gVGhlbiBpdCBzdG9yZXMgdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSAoMikgaW4gaXRzIGZpcnN0cHJpdmF0ZSB2YXJpYWJsZSAoMSkuIEF0IHRoZSBlbmQgYWxsIGZpcnN0cHJpdmF0ZSB2YXJpYWJsZXMgKDEpIGFyZSBhZGRlZCB0byBhIHRvdGFsIHN1bSBpbiBhIGNyaXRpY2FsIHNlY3Rpb24gYW5kIGNvbXBhcmVkIHdpdGggdGhlIGNvcnJlY3QgcmVzdWx0Ljwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZm9yIGZpcnN0cHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbCxvbXAgcGFyYWxsZWwgZmlyc3Rwcml2YXRlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IHN1bTE7CisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKHN1bTEpCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9mb3JfZmlyc3Rwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKyAgICBpbnQgc3VtOworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgc3VtMDsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgaW50IGtub3duX3N1bTsKKyAgICBpbnQgdGhyZWFkc251bTsKKworICAgIHN1bSA9IDA7CisgICAgc3VtMCA9IDEyMzQ1OworICAgIHN1bTEgPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyNwcmFnbWEgb21wIHNpbmdsZQorICAgICAgICB7CisgICAgICAgICAgICB0aHJlYWRzbnVtPW9tcF9nZXRfbnVtX3RocmVhZHMoKTsKKyAgICAgICAgfQorCS8qIHN1bTAgPSAwOyAqLworCTxvbXB0czpvcnBoYW4+CisJaW50IGk7CisjcHJhZ21hIG9tcCBmb3IgPG9tcHRzOmNoZWNrPmZpcnN0cHJpdmF0ZShzdW0wKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+cHJpdmF0ZShzdW0wKTwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKQorCXsKKwkgICAgc3VtMCA9IHN1bTAgKyBpOworCSAgICBzdW0xID0gc3VtMDsKKwl9CS8qIGVuZCBvZiBmb3IgKi8KKwk8L29tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJeworCSAgICBzdW0gPSBzdW0gKyBzdW0xOworCX0JLyogZW5kIG9mIGNyaXRpY2FsICovCisgICAgfQkvKiBlbmQgb2YgcGFyYWxsZWwgKi8gICAgCisKKyAgICBrbm93bl9zdW0gPSAxMjM0NSogdGhyZWFkc251bSsgKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyOworICAgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9sYXN0cHJpdmF0ZS5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9sYXN0cHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMDgwYTIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX2xhc3Rwcml2YXRlLmMKQEAgLTAsMCArMSw1MiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgZm9yIGxhc3Rwcml2YXRlIGNsYXVzZSBieSBjb3VudGluZyB1cCBhIHZhcmlhYmxlIGluIGEgcGFyYWxsZWxpemVkIGxvb3AuIEVhY2ggdGhyZWFkIHNhdmVzIHRoZSBuZXh0IHN1bW1hbmQgaW4gYSBsYXN0cHJpdmF0ZSB2YXJpYWJsZSBpMC4gQXQgdGhlIGVuZCBpMCBpcyBjb21wYXJlZCB0byB0aGUgdmFsdWUgb2YgdGhlIGV4cGVjdGVkIGxhc3Qgc3VtbWFuZC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGZvciBsYXN0cHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbCxvbXAgcGFyYWxsZWwgZmlyc3Rwcml2YXRlLG9tcCBzY2hlZHVsZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCBzdW0wOworI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShzdW0wKQorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfZm9yX2xhc3Rwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKwlpbnQgc3VtID0gMDsKKwlpbnQga25vd25fc3VtOworCTxvbXB0czpvcnBoYW46dmFycz4KKwkgICAgaW50IGkwOworCTwvb21wdHM6b3JwaGFuOnZhcnM+CisKKwlpMCA9IC0xOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorCXsKKwkgICAgc3VtMCA9IDA7CisJICAgIHsJLyogQmVnaW4gb2Ygb3JwaGFuZWQgYmxvY2sgKi8KKwkgICAgPG9tcHRzOm9ycGhhbj4KKwkJaW50IGk7CisjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoc3RhdGljLDcpIDxvbXB0czpjaGVjaz5sYXN0cHJpdmF0ZShpMCk8L29tcHRzOmNoZWNrPgorCQlmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKQorCQl7CisJCSAgICBzdW0wID0gc3VtMCArIGk7CisJCSAgICBpMCA9IGk7CisJCX0JLyogZW5kIG9mIGZvciAqLworCSAgICA8L29tcHRzOm9ycGhhbj4KKwkgICAgfQkvKiBlbmQgb2Ygb3JwaGFuZWQgYmxvY2sgKi8KKworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkgICAgeworCQlzdW0gPSBzdW0gKyBzdW0wOworCSAgICB9CS8qIGVuZCBvZiBjcml0aWNhbCAqLworCX0JLyogZW5kIG9mIHBhcmFsbGVsICovICAgIAorCisJa25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyOworCWZwcmludGYobG9nRmlsZSwiIGtub3duX3N1bSA9ICVkICwgc3VtID0gJWQgXG4iLGtub3duX3N1bSxzdW0pOworCWZwcmludGYobG9nRmlsZSwiIExPT1BDT1VOVCA9ICVkICwgaTAgPSAlZCBcbiIsTE9PUENPVU5ULGkwKTsKKwlyZXR1cm4gKChrbm93bl9zdW0gPT0gc3VtKSAmJiAoaTAgPT0gTE9PUENPVU5UKSApOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfbm93YWl0LmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX25vd2FpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZWM0MGIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX25vd2FpdC5jCkBAIC0wLDAgKzEsNTcgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOmRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgZm9yIG5vd2FpdCBkaXJlY3RpdmUuIEl0IGZpbGxzIGFuIGFycmF5IHdpdGggdmFsdWVzIGFuZCBvcGVyYXRlcyBvbiB0aGVzZSBpbiB0aGUgZm9sbG93aW5nLjwvb21wdHM6ZGVzY3JpcHRpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBmb3Igbm93YWl0PC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dmVyc2lvbj4xLjA8L29tcHRzOnZlcnNpb24+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHBhcmFsbGVsIGZvciwgb21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfZm9yX25vd2FpdDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisJPG9tcHRzOm9ycGhhbjp2YXJzPgorCQlpbnQgcmVzdWx0OworCQlpbnQgY291bnQ7CisJPC9vbXB0czpvcnBoYW46dmFycz4KKwlpbnQgajsKKwlpbnQgbXlhcnJheVtMT09QQ09VTlRdOworCisJcmVzdWx0ID0gMDsKKwljb3VudCA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorCXsKKwk8b21wdHM6b3JwaGFuPgorCQlpbnQgcmFuazsKKwkJaW50IGk7CisKKwkJcmFuayA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworCisjcHJhZ21hIG9tcCBmb3IgPG9tcHRzOmNoZWNrPm5vd2FpdDwvb21wdHM6Y2hlY2s+IAorCQlmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspIHsKKwkJCWlmIChpID09IDApIHsKKwkJCQlmcHJpbnRmIChsb2dGaWxlLCAiVGhyZWFkIG5yICVkIGVudGVyaW5nIGZvciBsb29wIGFuZCBnb2luZyB0byBzbGVlcC5cbiIsIHJhbmspOworCQkJCW15X3NsZWVwKFNMRUVQVElNRSk7CisJCQkJY291bnQgPSAxOworI3ByYWdtYSBvbXAgZmx1c2goY291bnQpCisJCQkJZnByaW50ZiAobG9nRmlsZSwgIlRocmVhZCBuciAlZCB3b2tlIHVwIGFuZCBzZXQgY291bnQgPSAxLlxuIiwgcmFuayk7CisJCQl9CisJCX0KKwkJCisJCWZwcmludGYgKGxvZ0ZpbGUsICJUaHJlYWQgbnIgJWQgZXhpdGVkIGZpcnN0IGZvciBsb29wIGFuZCBlbnRlcnMgdGhlIHNlY29uZC5cbiIsIHJhbmspOworI3ByYWdtYSBvbXAgZm9yCisJCWZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykgCisJCXsKKyNwcmFnbWEgb21wIGZsdXNoKGNvdW50KQorCQkJaWYgKGNvdW50ID09IDApCisJCQkJcmVzdWx0ID0gMTsKKwkJfQorCTwvb21wdHM6b3JwaGFuPgorCX0KKwkKKwlyZXR1cm4gcmVzdWx0OworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfb3JkZXJlZC5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9vcmRlcmVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI5N2QwNAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfb3JkZXJlZC5jCkBAIC0wLDAgKzEsNjAgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIG9yZGVyZWQgZGlyZWN0aXZlIGJ5IGNvdW50aW5nIHVwIGFuIHZhcmlhYmxlIGluIGFuIHBhcmFsbGVsaXplZCBsb29wIGFuZCB3YXRjaGluZyBlYWNoIGl0ZXJhdGlvbiBpZiB0aGUgc3VtYW5kIGlzIGxhcmdlciBhcyB0aGUgbGFzdCBvbmUuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBmb3Igb3JkZXJlZDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbCxvbXAgZm9yIHNjaGVkdWxlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworc3RhdGljIGludCBsYXN0X2kgPSAwOworCisvKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGNoZWNrIHRoYXQgaSBpcyBpbmNyZWFzaW5nIG1vbm90b25pY2FsbHkgCisgICB3aXRoIGVhY2ggY2FsbCAqLworc3RhdGljIGludCBjaGVja19pX2lzbGFyZ2VyIChpbnQgaSkKK3sKKyAgICBpbnQgaXNsYXJnZXI7CisgICAgaXNsYXJnZXIgPSAoaSA+IGxhc3RfaSk7CisgICAgbGFzdF9pID0gaTsKKyAgICByZXR1cm4gKGlzbGFyZ2VyKTsKK30KKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2Zvcl9vcmRlcmVkPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IHN1bTsKKwlpbnQgaXNfbGFyZ2VyID0gMTsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBrbm93bl9zdW07CisKKyAgICBsYXN0X2kgPSAwOworICAgIHN1bSA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIGludCBpOworCSAgICBpbnQgbXlfaXNsYXJnZXIgPSAxOworI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKHN0YXRpYywxKSBvcmRlcmVkCisJICAgIGZvciAoaSA9IDE7IGkgPCAxMDA7IGkrKykKKwkgICAgeworCQk8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgb3JkZXJlZDwvb21wdHM6Y2hlY2s+CisJCXsKKwkJICAgIG15X2lzbGFyZ2VyID0gY2hlY2tfaV9pc2xhcmdlcihpKSAmJiBteV9pc2xhcmdlcjsKKwkJICAgIHN1bSA9IHN1bSArIGk7CisJCX0JLyogZW5kIG9mIG9yZGVyZWQgKi8KKwkgICAgfQkvKiBlbmQgb2YgZm9yICovCisjcHJhZ21hIG9tcCBjcml0aWNhbAorCSAgICB7CisJCWlzX2xhcmdlciA9IGlzX2xhcmdlciAmJiBteV9pc2xhcmdlcjsKKwkgICAgfQkvKiBlbmQgb2YgY3JpdGljYWwgKi8KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9CisKKyAgICBrbm93bl9zdW09KDk5ICogMTAwKSAvIDI7CisgICAgcmV0dXJuICgoa25vd25fc3VtID09IHN1bSkgJiYgaXNfbGFyZ2VyKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX3ByaXZhdGUuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3JfcHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNjUxMTAKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX3ByaXZhdGUuYwpAQCAtMCwwICsxLDY0IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBmb3IgcHJpdmF0ZSBjbGF1c2UgYnkgY291bnRpbmcgdXAgYSB2YXJpYWJsZSBpbiBhIHBhcmFsbGVsaXplZCBsb29wLiBFYWNoIHRocmVhZCBoYXMgYSBwcml2YXRlIHZhcmlhYmxlICgxKSBhbmQgYSB2YXJpYWJsZSAoMikgZGVjbGFyZWQgYnkgZm9yIHByaXZhdGUuIEZpcnN0IGl0IHN0b3JlcyB0aGUgcmVzdWx0IG9mIGl0cyBsYXN0IGl0ZXJhdGlvbiBpbiB2YXJpYWJsZSAoMikuIFRoZW4gdGhpcyB0aHJlYWQgd2FpdHMgc29tZSB0aW1lIGJlZm9yZSBpdCBzdG9yZXMgdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSAoMikgaW4gaXRzIHByaXZhdGUgdmFyaWFibGUgKDEpLiBBdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IGl0ZXJhdGlvbiB0aGUgdmFsdWUgb2YgKDEpIGlzIGFzc2lnbmVkIHRvICgyKS4gQXQgdGhlIGVuZCBhbGwgcHJpdmF0ZSB2YXJpYWJsZXMgKDEpIGFyZSBhZGRlZCB0byBhIHRvdGFsIHN1bSBpbiBhIGNyaXRpY2FsIHNlY3Rpb24gYW5kIGNvbXBhcmVkIHdpdGggdGhlIGNvcnJlY3QgcmVzdWx0Ljwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZm9yIHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgcGFyYWxsZWwsb21wIGZsdXNoLG9tcCBjcml0aWNhbCxvbXAgdGhyZWFkcHJpdmF0ZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisvKiBVdGlsaXR5IGZ1bmN0aW9uIGRvIHNwZW5kIHNvbWUgdGltZSBpbiBhIGxvb3AgKi8KK3N0YXRpYyB2b2lkIGRvX3NvbWVfd29yayAoKXsKKyAgICBpbnQgaTsKKyAgICBkb3VibGUgc3VtID0gMDsKKyAgICBmb3IoaSA9IDA7IGkgPCAxMDAwOyBpKyspeworCXN1bSArPSBzcXJ0ICgoZG91YmxlKSBpKTsKKyAgICB9Cit9CisKK2ludCBzdW0xOworI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShzdW0xKQorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfZm9yX3ByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICAgIGludCBzdW0gPSAwOworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgc3VtMDsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgaW50IGtub3duX3N1bTsKKworICAgIHN1bTAgPSAwOwkvKiBzZXR0aW5nIChnbG9iYWwpIHN1bTAgPSAwICovCisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworCXN1bTEgPSAwOwkvKiBzZXR0aW5nIHN1bTEgaW4gZWFjaCB0aHJlYWQgdG8gMCAqLworCisJewkvKiBiZWdpbiBvZiBvcnBoYW5lZCBibG9jayAqLworCTxvbXB0czpvcnBoYW4+CisJICAgIGludCBpOworI3ByYWdtYSBvbXAgZm9yIDxvbXB0czpjaGVjaz5wcml2YXRlKHN1bTApPC9vbXB0czpjaGVjaz4gc2NoZWR1bGUoc3RhdGljLDEpCisJICAgIGZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspCisJICAgIHsKKwkJc3VtMCA9IHN1bTE7CisjcHJhZ21hIG9tcCBmbHVzaAorCQlzdW0wID0gc3VtMCArIGk7CisJCWRvX3NvbWVfd29yayAoKTsKKyNwcmFnbWEgb21wIGZsdXNoCisJCXN1bTEgPSBzdW0wOworCSAgICB9CS8qIGVuZCBvZiBmb3IgKi8KKwk8L29tcHRzOm9ycGhhbj4KKwl9CS8qIGVuZCBvZiBvcnBoYW5lZCBibG9jayAqLworCisjcHJhZ21hIG9tcCBjcml0aWNhbAorCXsKKwkgICAgc3VtID0gc3VtICsgc3VtMTsKKwl9CS8qZW5kIG9mIGNyaXRpY2FsKi8KKyAgICB9CS8qIGVuZCBvZiBwYXJhbGxlbCovICAgIAorCisgICAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyOworICAgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7Cit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX3JlZHVjdGlvbi5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9yZWR1Y3Rpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGQxOTE3Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9yZWR1Y3Rpb24uYwpAQCAtMCwwICsxLDQyOSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgZm9yIHJlZHVjdGlvbiBkaXJlY3RpdmUgd2ljaCBhbGwgaXRzIG9wdGlvbnMuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBmb3IgcmVkdWN0aW9uPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2Zvcl9yZWR1Y3Rpb248L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlkb3VibGUgZHQ7CisJaW50IHN1bTsKKwlpbnQgZGlmZjsKKwlpbnQgcHJvZHVjdCA9IDE7CisJZG91YmxlIGRzdW07CisJZG91YmxlIGRrbm93bl9zdW07CisJZG91YmxlIGRkaWZmOworCWludCBsb2dpY19hbmQ7CisJaW50IGxvZ2ljX29yOworCWludCBiaXRfYW5kOworCWludCBiaXRfb3I7CisJaW50IGV4Y2x1c2l2X2JpdF9vcjsKKwlpbnQgKmxvZ2ljczsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisjZGVmaW5lIERPVUJMRV9ESUdJVFMgMjAJLyogZHReRE9VQkxFX0RJR0lUUyAqLworI2RlZmluZSBNQVhfRkFDVE9SIDEwCisjZGVmaW5lIEtOT1dOX1BST0RVQ1QgMzYyODgwMAkvKiAxMCEgKi8KKworICAgIGludCBpOworICAgIGludCBrbm93bl9zdW07CisgICAgaW50IGtub3duX3Byb2R1Y3Q7CisgICAgZG91YmxlIHJvdW5kaW5nX2Vycm9yID0gMS5FLTk7CS8qIG92ZXIgYWxsIHJvdW5kaW5nIGVycm9yIHRvIGJlIGlnbm9yZWQgaW4gdGhlIGRvdWJsZSB0ZXN0cyAqLworICAgIGRvdWJsZSBkcHQ7CisgICAgaW50IHJlc3VsdCA9IDA7CisgICAgaW50IGxvZ2ljc0FycmF5W0xPT1BDT1VOVF07CisKKyAgICAvKiBWYXJpYWJsZXMgZm9yIGludGVnZXIgdGVzdHMgKi8KKyAgICBzdW0gPSAwOworICAgIHByb2R1Y3QgPSAxOworICAgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKyAgICAvKiB2YXJpYWJlbHMgZm9yIGRvdWJsZSB0ZXN0cyAqLworICAgIGR0ID0gMS4gLyAzLjsJLyogYmFzZSBvZiBnZW9tZXRyaWMgcm93IGZvciArIGFuZCAtIHRlc3QqLworICAgIGRzdW0gPSAwLjsKKyAgICAvKiBWYXJpYWJlbGVzIGZvciBsb2dpYyAgdGVzdHMgKi8KKyAgICBsb2dpY3MgPSBsb2dpY3NBcnJheTsKKyAgICBsb2dpY19hbmQgPSAxOworICAgIGxvZ2ljX29yID0gMDsKKyAgICAvKiBWYXJpYWJlbGVzIGZvciBiaXQgb3BlcmF0b3JzIHRlc3RzICovCisgICAgYml0X2FuZCA9IDE7CisgICAgYml0X29yID0gMDsKKyAgICAvKiBWYXJpYWJsZXMgZm9yIGV4Y2x1c2l2IGJpdCBvciAqLworICAgIGV4Y2x1c2l2X2JpdF9vciA9IDA7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogVGVzdHMgZm9yIGludGVnZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqIFRlc3RpbmcgaW50ZWdlciBhZGRpdGlvbiAqKioqLworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGo7CisjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCs6c3VtKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCSAgICBmb3IgKGogPSAxOyBqIDw9IExPT1BDT1VOVDsgaisrKQorCSAgICB7CisJCXN1bSA9IHN1bSArIGo7CisJICAgIH0KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9CisKKyAgICBpZiAoa25vd25fc3VtICE9IHN1bSkgeworCXJlc3VsdCsrOworCWZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBzdW0gd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mICVkLlxuIiwgc3VtLCBrbm93bl9zdW0pOyAKKyAgICB9CisKKworLyoqKiogVGVzdGluZyBpbnRlZ2VyIHN1YnRyYWN0b24gKioqKi8KKworICAgIGRpZmYgPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGo7CisjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC06ZGlmZik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkgICAgZm9yIChqID0gMTsgaiA8PSBMT09QQ09VTlQ7IGorKykKKwkgICAgeworCQlkaWZmID0gZGlmZiAtIGo7CisJICAgIH0KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9CisKKyAgICBpZiAoZGlmZiAhPSAwKSB7CisJcmVzdWx0Kys7CisJZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIGRpZmZlcmVuY2Ugd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mIDAuXG4iLCBkaWZmKTsKKyAgICB9CisKKworLyoqKiogVGVzdGluZyBpbnRlZ2VyIG11bHRpcGxpY2F0aW9uICoqKiovCisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgajsKKyNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKjpwcm9kdWN0KTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCSAgICBmb3IgKGogPSAxOyBqIDw9IE1BWF9GQUNUT1I7IGorKykKKwkgICAgeworCQlwcm9kdWN0ICo9IGo7CisJICAgIH0KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9CisKKyAgICBrbm93bl9wcm9kdWN0ID0gS05PV05fUFJPRFVDVDsKKyAgICBpZihrbm93bl9wcm9kdWN0ICE9IHByb2R1Y3QpCisgICAgeworCXJlc3VsdCsrOworCWZwcmludGYgKGxvZ0ZpbGUsIkVycm9yIGluIFByb2R1Y3Qgd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mICVkXG4iLHByb2R1Y3Qsa25vd25fcHJvZHVjdCk7CisgICAgfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIFRlc3RzIGZvciBkb3VibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKioqKiBUZXN0aW5nIGRvdWJsZSBhZGRpdGlvbiAqKioqLworCisgICAgZHN1bSA9IDAuOworICAgIGRwdCA9IDEuOworCisgICAgZm9yIChpID0gMDsgaSA8IERPVUJMRV9ESUdJVFM7ICsraSkKKyAgICB7CisJZHB0ICo9IGR0OworICAgIH0KKyAgICBka25vd25fc3VtID0gKDEgLSBkcHQpIC8gKDEgLSBkdCk7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgajsKKyNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKzpkc3VtKTwvb21wdHM6Y2hlY2s+CisJICAgIGZvciAoaiA9IDA7IGogPCBET1VCTEVfRElHSVRTOyBqKyspCisJICAgIHsJCisJCWRzdW0gKz0gcG93IChkdCwgaik7CisJICAgIH0KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9CisKKyAgICBpZiAoZmFicyAoZHN1bSAtIGRrbm93bl9zdW0pID4gcm91bmRpbmdfZXJyb3IpIHsKKwlyZXN1bHQrKzsgCisJZnByaW50ZiAobG9nRmlsZSwgIlxuRXJyb3IgaW4gc3VtIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlZiBpbnN0ZWFkIG9mOiAlZiAoRGlmZmVyZW5jZTogJUUpXG4iLCBkc3VtLCBka25vd25fc3VtLCBkc3VtLWRrbm93bl9zdW0pOworICAgIH0KKworI2lmIDAKKyAgICBkcHQgPSAxLjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgRE9VQkxFX0RJR0lUUzsgKytpKQorICAgIHsKKwlkcHQgKj0gZHQ7CisgICAgfQorI2VuZGlmCisKKworLyoqKiogVGVzdGluZyBkb3VibGUgc3VidHJhY3Rpb24gKioqKi8KKworICAgIGRkaWZmID0gKDEgLSBkcHQpIC8gKDEgLSBkdCk7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgajsKKyNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLTpkZGlmZik8L29tcHRzOmNoZWNrPgorCSAgICBmb3IgKGogPSAwOyBqIDwgRE9VQkxFX0RJR0lUUzsgKytqKQorCSAgICB7CisJCWRkaWZmIC09IHBvdyAoZHQsIGopOworCSAgICB9CisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKGZhYnMgKGRkaWZmKSA+IHJvdW5kaW5nX2Vycm9yKSB7CisJcmVzdWx0Kys7CisJZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIERpZmZlcmVuY2Ugd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICVFIGluc3RlYWQgb2YgMC4wXG4iLCBkZGlmZik7CisgICAgfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIFRlc3RzIGZvciBsb2dpY2FsIHZhbHVlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKioqKiBUZXN0aW5nIGxvZ2ljIGFuZCAqKioqLworCisgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKQorICAgIHsKKwlsb2dpY3NbaV0gPSAxOworICAgIH0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIGludCBqOworI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigmJjpsb2dpY19hbmQpPC9vbXB0czpjaGVjaz4KKwkgICAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgKytqKQorCSAgICB7CisJCWxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2pdKTsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmKCFsb2dpY19hbmQpIHsKKwlyZXN1bHQrKzsKKwlmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gbG9naWMgQU5EIHBhcnQgMVxuIik7CisgICAgfQorCisgICAgbG9naWNfYW5kID0gMTsKKyAgICBsb2dpY3NbTE9PUENPVU5UIC8gMl0gPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGo7CisjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCYmOmxvZ2ljX2FuZCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkgICAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgKytqKQorCSAgICB7CisJCWxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAmJiBsb2dpY3Nbal07CisJICAgIH0KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9CisKKyAgICBpZihsb2dpY19hbmQpIHsKKwlyZXN1bHQrKzsKKwlmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gbG9naWMgQU5EIHBhcnQgMlxuIik7CisgICAgfQorCisKKy8qKioqIFRlc3RpbmcgbG9naWMgb3IgKioqKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykKKyAgICB7CisJbG9naWNzW2ldID0gMDsKKyAgICB9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgajsKKyNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofHw6bG9naWNfb3IpICA8L29tcHRzOmNoZWNrPgorCSAgICBmb3IgKGogPSAwOyBqIDwgTE9PUENPVU5UOyArK2opCisJICAgIHsKKwkJbG9naWNfb3IgPSBsb2dpY19vciB8fCBsb2dpY3Nbal07CisJICAgIH0KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9CisKKyAgICBpZiAobG9naWNfb3IpIHsKKwlyZXN1bHQrKzsKKwlmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAxXG4iKTsKKyAgICB9CisKKyAgICBsb2dpY19vciA9IDA7CisgICAgbG9naWNzW0xPT1BDT1VOVCAvIDJdID0gMTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIGludCBqOworI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbih8fDpsb2dpY19vcik8L29tcHRzOmNoZWNrPgorCSAgICBmb3IgKGogPSAwOyBqIDwgTE9PUENPVU5UOyArK2opCisJICAgIHsKKwkJbG9naWNfb3IgPSBsb2dpY19vciB8fCBsb2dpY3Nbal07CisJICAgIH0KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9CisKKyAgICBpZighbG9naWNfb3IpIHsKKwlyZXN1bHQrKzsKKwlmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAyXG4iKTsKKyAgICB9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogVGVzdHMgZm9yIGJpdCB2YWx1ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqIFRlc3RpbmcgYml0IGFuZCAqKioqLworCisgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgKytpKQorICAgIHsKKwlsb2dpY3NbaV0gPSAxOworICAgIH0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIGludCBqOworI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigmOmJpdF9hbmQpICA8L29tcHRzOmNoZWNrPgorCSAgICBmb3IgKGogPSAwOyBqIDwgTE9PUENPVU5UOyArK2opCisJICAgIHsKKwkJYml0X2FuZCA9IChiaXRfYW5kICYgbG9naWNzW2pdKTsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmICghYml0X2FuZCkgeworCXJlc3VsdCsrOworCWZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMVxuIik7CisgICAgfQorCisgICAgYml0X2FuZCA9IDE7CisgICAgbG9naWNzW0xPT1BDT1VOVCAvIDJdID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIGludCBqOworI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigmOmJpdF9hbmQpPC9vbXB0czpjaGVjaz4KKwkgICAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgKytqKQorCSAgICB7CisJCWJpdF9hbmQgPSBiaXRfYW5kICYgbG9naWNzW2pdOworCSAgICB9CisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorICAgIGlmIChiaXRfYW5kKSB7CisJcmVzdWx0Kys7CisJZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIEJJVCBBTkQgcGFydCAyXG4iKTsKKyAgICB9CisKKworLyoqKiogVGVzdGluZyBiaXQgb3IgKioqKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykKKyAgICB7CisJbG9naWNzW2ldID0gMDsKKyAgICB9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgajsKKyNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofDpiaXRfb3IpPC9vbXB0czpjaGVjaz4KKwkgICAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgKytqKQorCSAgICB7CisJCWJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tqXTsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmIChiaXRfb3IpIHsKKwlyZXN1bHQrKzsKKwlmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gQklUIE9SIHBhcnQgMVxuIik7CisgICAgfQorCisgICAgYml0X29yID0gMDsKKyAgICBsb2dpY3NbTE9PUENPVU5UIC8gMl0gPSAxOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGo7CisjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHw6Yml0X29yKTwvb21wdHM6Y2hlY2s+CisJICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7ICsraikKKwkgICAgeworCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3Nbal07CisJICAgIH0KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9CisgICAgaWYgKCFiaXRfb3IpIHsKKwlyZXN1bHQrKzsKKwlmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gQklUIE9SIHBhcnQgMlxuIik7CisgICAgfQorCisKKy8qKioqIFRlc3RpbmcgZXhjbHVzaXZlIGJpdCBvciAqKioqLworCisgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKQorICAgIHsKKwlsb2dpY3NbaV0gPSAwOworICAgIH0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIGludCBqOworI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiheOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPgorCSAgICBmb3IgKGogPSAwOyBqIDwgTE9PUENPVU5UOyArK2opCisJICAgIHsKKwkJZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2pdOworCSAgICB9CisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorICAgIGlmIChleGNsdXNpdl9iaXRfb3IpIHsKKwlyZXN1bHQrKzsKKwlmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMVxuIik7CisgICAgfQorCisgICAgZXhjbHVzaXZfYml0X29yID0gMDsKKyAgICBsb2dpY3NbTE9PUENPVU5UIC8gMl0gPSAxOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGo7CisjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKF46ZXhjbHVzaXZfYml0X29yKTwvb21wdHM6Y2hlY2s+CisJICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7ICsraikKKwkgICAgeworCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3Nbal07CisJICAgIH0KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9CisgICAgaWYgKCFleGNsdXNpdl9iaXRfb3IpIHsKKwlyZXN1bHQrKzsKKwlmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMlxuIik7CisgICAgfQorCisgICAgLypmcHJpbnRmICgiXG5SZXN1bHQ6JWRcbiIsIHJlc3VsdCk7Ki8KKyAgICByZXR1cm4gKHJlc3VsdCA9PSAwKTsKKworICAgIGZyZWUgKGxvZ2ljcyk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9zY2hlZHVsZV9hdXRvLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX3NjaGVkdWxlX2F1dG8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjFhMWM0Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9zY2hlZHVsZV9hdXRvLmMKQEAgLTAsMCArMSw1NSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2l0aCBvbXAgZm9yIHNjaGVkdWxlIGF1dG88L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGZvciBhdXRvPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLG9tcCBwYXJhbGxlbCBmaXJzdHByaXZhdGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgc3VtMTsKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoc3VtMSkKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2Zvcl9hdXRvPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKyAgICBpbnQgc3VtOworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgc3VtMDsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgaW50IGtub3duX3N1bTsKKyAgICBpbnQgdGhyZWFkc251bTsKKworICAgIHN1bSA9IDA7CisgICAgc3VtMCA9IDEyMzQ1OworICAgIHN1bTEgPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyNwcmFnbWEgb21wIHNpbmdsZQorICAgICAgICB7CisgICAgICAgICAgICB0aHJlYWRzbnVtPW9tcF9nZXRfbnVtX3RocmVhZHMoKTsKKyAgICAgICAgfQorCS8qIHN1bTAgPSAwOyAqLworCTxvbXB0czpvcnBoYW4+CisJaW50IGk7CisjcHJhZ21hIG9tcCBmb3IgPG9tcHRzOmNoZWNrPmZpcnN0cHJpdmF0ZShzdW0wKSBzY2hlZHVsZShhdXRvKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+cHJpdmF0ZShzdW0wKTwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKQorCXsKKwkgICAgc3VtMCA9IHN1bTAgKyBpOworCSAgICBzdW0xID0gc3VtMDsKKwl9CS8qIGVuZCBvZiBmb3IgKi8KKwk8L29tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJeworCSAgICBzdW0gPSBzdW0gKyBzdW0xOworCX0JLyogZW5kIG9mIGNyaXRpY2FsICovCisgICAgfQkvKiBlbmQgb2YgcGFyYWxsZWwgKi8gICAgCisKKyAgICBrbm93bl9zdW0gPSAxMjM0NSogdGhyZWFkc251bSsgKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyOworICAgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9zY2hlZHVsZV9keW5hbWljLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX3NjaGVkdWxlX2R5bmFtaWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmNkYTU2Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9zY2hlZHVsZV9keW5hbWljLmMKQEAgLTAsMCArMSwxMTEgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgZHluYW1pYyBvcHRpb24gb2YgdGhlIG9tcCBmb3Igc2NoZWR1bGUgZGlyZWN0aXZlPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYyk8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgZmx1c2gsb21wIGZvciBub3dhaXQsb21wIGNyaXRpY2FsLG9tcCBzaW5nbGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorCisvKgorKiBUZXN0IGZvciBkeW5hbWljIHNjaGVkdWxpbmcgd2l0aCBjaHVuayBzaXplCisqIE1ldGhvZDogY2FjdWxhdGUgaG93IG1hbnkgdGltZXMgdGhlIGl0ZXJhdGlvbiBzcGFjZSBpcyBkaXNwYXRjaGVkCisqICAgICAgICAgYW5kIGp1ZGdlIGlmIGVhY2ggZGlzcGF0Y2ggaGFzIHRoZSByZXF1ZXN0ZWQgY2h1bmsgc2l6ZQorKiAgICAgICAgIHVubGVzcyBpdCBpcyB0aGUgbGFzdCBvbmUuCisqIEl0IGlzIHBvc3NpYmxlIGZvciB0d28gYWRqYWNlbnQgY2h1bmtzIGFyZSBhc3NpZ25lZCB0byB0aGUgc2FtZSB0aHJlYWQKKyogTW9kaWZ5aWVkIGJ5IENodW5odWEgTGlhbworKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9tcC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCisjZGVmaW5lIENGRE1BWF9TSVpFIDEwMAorY29uc3QgaW50IGNodW5rX3NpemUgPSA3OworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfZm9yX3NjaGVkdWxlX2R5bmFtaWM8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICBpbnQgdGlkOworPG9tcHRzOm9ycGhhbjp2YXJzPiAgCisgIGludCAqdGlkczsKKyAgaW50IGk7Cis8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgIGludCB0aWRzQXJyYXlbQ0ZETUFYX1NJWkVdOworICBpbnQgY291bnQgPSAwOworICBpbnQgdG1wX2NvdW50ID0gMDsgLypkaXNwYXRjaCB0aW1lcyovCisgIGludCAqdG1wOyAgLypzdG9yZSBjaHVuayBzaXplIGZvciBlYWNoIGRpc3BhdGNoKi8KKyAgaW50IHJlc3VsdCA9IDA7CisgIAorICB0aWRzID0gdGlkc0FycmF5OworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBwcml2YXRlKHRpZCkgc2hhcmVkKHRpZHMpCisgIHsJCQkJLyogYmVnaW4gb2YgcGFyYWxsZWwgKi8KKyAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgIGludCB0aWQ7CisKKyAgICB0aWQgPSBvbXBfZ2V0X3RocmVhZF9udW0gKCk7CisjcHJhZ21hIG9tcCBmb3IgPG9tcHRzOmNoZWNrPnNjaGVkdWxlKGR5bmFtaWMsY2h1bmtfc2l6ZSk8L29tcHRzOmNoZWNrPgorICAgIGZvciAoaSA9IDA7IGkgPCBDRkRNQVhfU0laRTsgaSsrKQorICAgICAgeworCXRpZHNbaV0gPSB0aWQ7CisgICAgICB9CisgICAgIDwvb21wdHM6b3JwaGFuPgorICB9CQkJCS8qIGVuZCBvZiBwYXJhbGxlbCAqLworCisgIGZvciAoaSA9IDA7IGkgPCBDRkRNQVhfU0laRSAtIDE7ICsraSkKKyAgICB7CisgICAgICBpZiAodGlkc1tpXSAhPSB0aWRzW2kgKyAxXSkKKwl7CisJICBjb3VudCsrOworCX0KKyAgICB9CisKKyAgdG1wID0gKGludCAqKSBtYWxsb2MgKHNpemVvZiAoaW50KSAqIChjb3VudCArIDEpKTsKKyAgdG1wWzBdID0gMTsKKworICBmb3IgKGkgPSAwOyBpIDwgQ0ZETUFYX1NJWkUgLSAxOyArK2kpCisgICAgeworICAgICAgaWYgKHRtcF9jb3VudCA+IGNvdW50KQorCXsKKwkgIHByaW50ZiAoIi0tLS0tLS0tLS0tLS0tLS0tLS0tXG5UZXN0aW50ZXJuYWwgRXJyb3I6IExpc3QgdG9vIHNtYWxsISEhXG4tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CS8qIEVycm9yIGhhbmRsaW5nICovCisJICBicmVhazsKKwl9CisgICAgICBpZiAodGlkc1tpXSAhPSB0aWRzW2kgKyAxXSkKKwl7CisJICB0bXBfY291bnQrKzsKKwkgIHRtcFt0bXBfY291bnRdID0gMTsKKwl9CisgICAgICBlbHNlCisJeworCSAgdG1wW3RtcF9jb3VudF0rKzsKKwl9CisgICAgfQorLyoKK3ByaW50ZigiZGVidWctLS0tXG4iKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgQ0ZETUFYX1NJWkU7ICsraSkKKwlwcmludGYoIiVkICIsdGlkc1tpXSk7CitwcmludGYoImRlYnVnLS0tLVxuIik7CisqLworLyogaXMgZHluYW1pYyBzdGF0ZW1lbnQgd29ya2luZz8gKi8KKyAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgeworICAgICAgaWYgKCh0bXBbaV0lY2h1bmtfc2l6ZSkhPTApIAorLyppdCBpcyBwb3NzaWJsZSBmb3IgMiBhZGphY2VudCBjaHVua3MgYXNzaWduZWQgdG8gYSBzYW1lIHRocmVhZCovCisJeworICAgICAgICAgcmVzdWx0Kys7CisgIGZwcmludGYobG9nRmlsZSwiVGhlIGludGVybWVkaWF0ZSBkaXNwYXRjaCBoYXMgd3JvbmcgY2h1bmtzaXplLlxuIik7CisJICAvKnJlc3VsdCArPSAoKHRtcFtpXSAvIGNodW5rX3NpemUpIC0gMSk7Ki8KKwl9CisgICAgfQorICBpZiAoKHRtcFtjb3VudF0lY2h1bmtfc2l6ZSkhPShDRkRNQVhfU0laRSVjaHVua19zaXplKSkKKyAgIHsgCisgICByZXN1bHQrKzsKKyAgZnByaW50Zihsb2dGaWxlLCJ0aGUgbGFzdCBkaXNwYXRjaCBoYXMgd3JvbmcgY2h1bmtzaXplLlxuIik7CisgICB9CisgIC8qIGZvciAoaW50IGk9MDtpPGNvdW50KzE7KytpKSBwcmludGYoIiVkXHQ6PVx0JWRcbiIsaSsxLHRtcFtpXSk7ICovCisgIHJldHVybiAocmVzdWx0PT0wKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX3NjaGVkdWxlX2d1aWRlZC5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9zY2hlZHVsZV9ndWlkZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzU2NGE1Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9zY2hlZHVsZV9ndWlkZWQuYwpAQCAtMCwwICsxLDIyNSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBndWlkZWQgb3B0aW9uIG9mIHRoZSBvbXAgZm9yIHNjaGVkdWxlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGZvciBzY2hlZHVsZShndWlkZWQpPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGZsdXNoLG9tcCBmb3Igbm93YWl0LG9tcCBjcml0aWNhbCxvbXAgc2luZ2xlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKy8qIFRlc3QgZm9yIGd1aWRlZCBzY2hlZHVsaW5nCisgKiBFbnN1cmUgdGhyZWFkcyBnZXQgY2h1bmtzIGludGVybGVhdmVseSBmaXJzdAorICogVGhlbiBqdWRnZSB0aGUgY2h1bmsgc2l6ZXMgYXJlIGRlY3JlYXNpbmcgdG8gYSBzdGFibGUgdmFsdWUKKyAqIE1vZGlmaWVkIGJ5IENodW5odWEgTGlhbworICogRm9yIGV4YW1wbGUsIDEwMCBpdGVyYXRpb24gb24gMiB0aHJlYWRzLCBjaHVua3NpemUgNworICogb25lIGxpbmUgZm9yIGVhY2ggZGlzcGF0Y2gsIDAvMSBtZWFucyB0aHJlYWQgaWQKKyAqIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwICAyNAorICogMSAxIDEgMSAxIDEgMSAxIDEgMSAxIDEgMSAxIDEgMSAxIDEgICAgICAgICAgICAgIDE4CisgKiAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgICAgICAgICAgICAgICAgICAgICAgMTQKKyAqIDEgMSAxIDEgMSAxIDEgMSAxIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMAorICogMCAwIDAgMCAwIDAgMCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4CisgKiAxIDEgMSAxIDEgMSAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcKKyAqIDAgMCAwIDAgMCAwIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNworICogMSAxIDEgMSAxIDEgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3CisgKiAwIDAgMCAwIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUKKyovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworI2RlZmluZSBOVU1CRVJfT0ZfVEhSRUFEUyAxMAorI2RlZmluZSBDRlNNQVhfU0laRSAxMDAwCisjZGVmaW5lIE1BWF9USU1FICAwLjAwNQorCisjaWZkZWYgU0xFRVBUSU1FCisjdW5kZWYgU0xFRVBUSU1FCisjZGVmaW5lIFNMRUVQVElNRSAwLjAwMDEKKyNlbmRpZgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfZm9yX3NjaGVkdWxlX2d1aWRlZDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCAqIHRpZHM7CisJaW50ICogY2h1bmtzaXplczsKKwlpbnQgbm90b3V0OworCWludCBtYXhpdGVyOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICBpbnQgdGhyZWFkczsKKyAgICBpbnQgaTsKKyAgICBpbnQgcmVzdWx0OworCisgICAgdGlkcyA9IChpbnQgKikgbWFsbG9jIChzaXplb2YgKGludCkgKiAoQ0ZTTUFYX1NJWkUgKyAxKSk7CisJbWF4aXRlciA9IDA7CisgICAgcmVzdWx0ID0gMTsKKyAgICBub3RvdXQgPSAxOworCisvKiBUZXN0aW5nIGlmIGVub3VnaHQgdGhyZWFkcyBhcmUgYXZhaWxhYmxlIGZvciB0aGlzIGNoZWNrLiAqLworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKwl7CisjcHJhZ21hIG9tcCBzaW5nbGUKKwkgIHsKKwkJdGhyZWFkcyA9IG9tcF9nZXRfbnVtX3RocmVhZHMgKCk7CisJICB9IC8qIGVuZCBvZiBzaW5nbGUgKi8KKwl9IC8qIGVuZCBvZiBwYXJhbGxlbCAqLworCisJaWYgKHRocmVhZHMgPCAyKSB7CisJICBwcmludGYgKCJUaGlzIHRlc3Qgb25seSB3b3JrcyB3aXRoIGF0IGxlYXN0IHR3byB0aHJlYWRzIC5cbiIpOworCSAgZnByaW50ZiAobG9nRmlsZSwgIlRoaXMgdGVzdCBvbmx5IHdvcmtzIHdpdGggYXQgbGVhc3QgdHdvIHRocmVhZHMuIEF2YWlsYWJsZSB3ZXJlIG9ubHkgJWQgdGhyZWFkKHMpLlxuIiwgdGhyZWFkcyk7CisJICByZXR1cm4gKDApOworCX0gLyogZW5kIGlmICovCisKKworICAgIC8qIE5vdyB0aGUgcmVhbCBwYXJhbGxlbCB3b3JrOiAgCisgICAgICoKKwkgKiBFYWNoIHRocmVhZCB3aWxsIHN0YXJ0IGltbWVkaWF0ZWx5IHdpdGggdGhlIGZpcnN0IGNodW5rLgorICAgICAqLworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKHRpZHMsbWF4aXRlcikKKyAgICB7CS8qIGJlZ2luIG9mIHBhcmFsbGVsICovCisgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgZG91YmxlIGNvdW50OworICAgICAgaW50IHRpZDsKKyAgICAgIGludCBqOworCisgICAgICB0aWQgPSBvbXBfZ2V0X3RocmVhZF9udW0gKCk7CisKKyNwcmFnbWEgb21wIGZvciBub3dhaXQgPG9tcHRzOmNoZWNrPnNjaGVkdWxlKGd1aWRlZCk8L29tcHRzOmNoZWNrPgorICAgICAgZm9yKGogPSAwOyBqIDwgQ0ZTTUFYX1NJWkU7ICsraikKKyAgICAgIHsKKwljb3VudCA9IDAuOworI3ByYWdtYSBvbXAgZmx1c2gobWF4aXRlcikKKwlpZiAoaiA+IG1heGl0ZXIpCisJeworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkgIHsKKwkgICAgbWF4aXRlciA9IGo7CisJICB9CS8qIGVuZCBvZiBjcml0aWNhbCAqLyAKKwl9CisJLypwcmludGYgKCJ0aHJlYWQgJWQgc2xlZXBpbmdcbiIsIHRpZCk7Ki8KKyNwcmFnbWEgb21wIGZsdXNoKG1heGl0ZXIsbm90b3V0KQkKKwl3aGlsZSAobm90b3V0ICYmIChjb3VudCA8IE1BWF9USU1FKSAmJiAobWF4aXRlciA9PSBqKSkKKwl7CisjcHJhZ21hIG9tcCBmbHVzaChtYXhpdGVyLG5vdG91dCkKKwkgIG15X3NsZWVwIChTTEVFUFRJTUUpOworCSAgY291bnQgKz0gU0xFRVBUSU1FOworI2lmZGVmIFZFUkJPU0UKKwkgIHByaW50ZigiLiIpOworI2VuZGlmCisJfQorI2lmZGVmIFZFUkJPU0UKKwlpZiAoY291bnQgPiAwLikgcHJpbnRmKCIgd2FpdGVkICVsZiBzXG4iLCBjb3VudCk7CisjZW5kaWYKKwkvKnByaW50ZiAoInRocmVhZCAlZCBhd2FrZVxuIiwgdGlkKTsqLworCXRpZHNbal0gPSB0aWQ7CisjaWZkZWYgVkVSQk9TRQorCXByaW50ZigiJWQgZmluaXNoZWQgYnkgJWRcbiIsaix0aWQpOworI2VuZGlmCisgICAgICB9CS8qIGVuZCBvZiBmb3IgKi8KKworICAgICAgbm90b3V0ID0gMDsKKyNwcmFnbWEgb21wIGZsdXNoKG1heGl0ZXIsbm90b3V0KQorICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQkvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV2YWx1YXRpb24gb2YgdGhlIHZhbHVlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwl7CisJICBpbnQgZGV0ZXJtaW5lZF9jaHVua3NpemUgPSAxOworCSAgaW50IGxhc3RfdGhyZWFkbnIgPSB0aWRzWzBdOworCSAgaW50IGdsb2JhbF9jaHVua25yID0gMDsKKwkgIGludCBsb2NhbF9jaHVua25yW05VTUJFUl9PRl9USFJFQURTXTsKKwkgIGludCBvcGVud29yayA9IENGU01BWF9TSVpFOworCSAgaW50IGV4cGVjdGVkX2NodW5rX3NpemU7CisJICBkb3VibGUgYyA9IDE7CisKKwkgIGZvciAoaSA9IDA7IGkgPCBOVU1CRVJfT0ZfVEhSRUFEUzsgaSsrKQorCQlsb2NhbF9jaHVua25yW2ldID0gMDsKKworCSAgdGlkc1tDRlNNQVhfU0laRV0gPSAtMTsKKworICAgICAgLyoKKwkgICAqIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIGdsb2JhbCBjaHVua3MKKwkgICAqLworCSAgLypmcHJpbnRmKGxvZ0ZpbGUsIiMgZ2xvYmFsX2NodW5rbnIgdGhyZWFkIGxvY2FsX2NodW5rbnIgY2h1bmtzaXplXG4iKTsgKi8KKwkgIGZvcihpID0gMTsgaSA8PSBDRlNNQVhfU0laRTsgKytpKQorCSAgeworCQlpZiAobGFzdF90aHJlYWRucj09dGlkc1tpXSkgeyAKKwkJICBkZXRlcm1pbmVkX2NodW5rc2l6ZSsrOyAKKwkJfQorCQllbHNlCisJCXsKKwkJICAvKiBmcHJpbnRmIChsb2dGaWxlLCAiJWRcdCVkXHQlZFx0JWRcbiIsIGdsb2JhbF9jaHVua25yLGxhc3RfdGhyZWFkbnIsIGxvY2FsX2NodW5rbnJbbGFzdF90aHJlYWRucl0sIG0pOyAqLworCQkgIGdsb2JhbF9jaHVua25yKys7CisJCSAgbG9jYWxfY2h1bmtucltsYXN0X3RocmVhZG5yXSsrOworCQkgIGxhc3RfdGhyZWFkbnIgPSB0aWRzW2ldOworCQkgIGRldGVybWluZWRfY2h1bmtzaXplID0gMTsKKwkJfQorCSAgfQorCSAgLyogbm93IGFsbG9jYXRlIHRoZSBtZW1vcnkgZm9yIHNhdmluZyB0aGUgc2l6ZXMgb2YgdGhlIGdsb2JhbCBjaHVua3MgKi8KKwkgIGNodW5rc2l6ZXMgPSAoaW50KiltYWxsb2MoZ2xvYmFsX2NodW5rbnIgKiBzaXplb2YoaW50KSk7CisKKyAgICAgIC8qCisJICAgKiBFdmFsdWF0ZSB0aGUgc2l6ZXMgb2YgdGhlIGdsb2JhbCBjaHVua3MKKwkgICAqLworCSAgZ2xvYmFsX2NodW5rbnIgPSAwOworCSAgZGV0ZXJtaW5lZF9jaHVua3NpemUgPSAxOworCSAgbGFzdF90aHJlYWRuciA9IHRpZHNbMF07CSAgICAKKwkgIGZvciAoaSA9IDE7IGkgPD0gQ0ZTTUFYX1NJWkU7ICsraSkKKwkgIHsKKwkJLyogSWYgdGhlIHRocmVhZG51bWJlciB3YXMgdGhlIHNhbWUgYXMgYmVmb3JlIGluY3JlYXNlIHRoZSBkZXRlY3RlZCBjaHVua3NpemUgZm9yIHRoaXMgY2h1bmsKKwkJICogb3RoZXJ3aXNlIHNldCB0aGUgZGV0ZWN0ZWQgY2h1bmtzaXplIGFnYWluIHRvIG9uZSBhbmQgc2F2ZSB0aGUgbnVtYmVyIG9mIHRoZSBuZXh0IHRocmVhZCBpbiBsYXN0X3RocmVhZG5yLiAKKwkJICovCisJCWlmIChsYXN0X3RocmVhZG5yID09IHRpZHNbaV0pIHsgCisJCSAgZGV0ZXJtaW5lZF9jaHVua3NpemUrKzsgCisJCX0KKwkJZWxzZSB7CisJCSAgY2h1bmtzaXplc1tnbG9iYWxfY2h1bmtucl0gPSBkZXRlcm1pbmVkX2NodW5rc2l6ZTsKKwkJICBnbG9iYWxfY2h1bmtucisrOworCQkgIGxvY2FsX2NodW5rbnJbbGFzdF90aHJlYWRucl0rKzsKKwkJICBsYXN0X3RocmVhZG5yID0gdGlkc1tpXTsKKwkJICBkZXRlcm1pbmVkX2NodW5rc2l6ZSA9IDE7CisJCX0KKwkgIH0KKworI2lmZGVmIFZFUkJPU0UKKwkgIGZwcmludGYgKGxvZ0ZpbGUsICJmb3VuZFx0ZXhwZWN0ZWRcdGNvbnN0YW50XG4iKTsKKyNlbmRpZgorCisJICAvKiBpZGVudGlmeSB0aGUgY29uc3RhbnQgYyBmb3IgdGhlIGV4cG9uZW50aWFsIGRlY3JlYXNlIG9mIHRoZSBjaHVua3NpemUgKi8KKwkgIGV4cGVjdGVkX2NodW5rX3NpemUgPSBvcGVud29yayAvIHRocmVhZHM7CisJICBjID0gKGRvdWJsZSkgY2h1bmtzaXplc1swXSAvIGV4cGVjdGVkX2NodW5rX3NpemU7CisJICAKKwkgIGZvciAoaSA9IDA7IGkgPCBnbG9iYWxfY2h1bmtucjsgaSsrKQorCSAgeworCQkvKiBjYWxjdWxhdGUgdGhlIG5ldyBleHBlY3RlZCBjaHVua3NpemUgKi8KKwkJaWYgKGV4cGVjdGVkX2NodW5rX3NpemUgPiAxKSAKKwkJICBleHBlY3RlZF9jaHVua19zaXplID0gYyAqIG9wZW53b3JrIC8gdGhyZWFkczsKKwkJCisjaWZkZWYgVkVSQk9TRQorCQlmcHJpbnRmIChsb2dGaWxlLCAiJThkXHQlOGRcdCVsZlxuIiwgY2h1bmtzaXplc1tpXSwgZXhwZWN0ZWRfY2h1bmtfc2l6ZSwgYyAqIGNodW5rc2l6ZXNbaV0vZXhwZWN0ZWRfY2h1bmtfc2l6ZSk7CisjZW5kaWYKKwkJCisJCS8qIGNoZWNrIGlmIGNodW5rc2l6ZSBpcyBpbnNpZGUgdGhlIHJvdW5kaW5nIGVycm9ycyAqLworCQlpZiAoYWJzIChjaHVua3NpemVzW2ldIC0gZXhwZWN0ZWRfY2h1bmtfc2l6ZSkgPj0gMikgeworCQkgIHJlc3VsdCA9IDA7CisjaWZuZGVmIFZFUkJPU0UKKwkJICBmcHJpbnRmIChsb2dGaWxlLCAiQ2h1bmtzaXplIGRpZmZlcmVkIGZyb20gZXhwZWN0ZWQgdmFsdWU6ICVkIGluc3RlYWQgb2YgJWRcbiIsIGNodW5rc2l6ZXNbaV0sIGV4cGVjdGVkX2NodW5rX3NpemUpOworCQkgIHJldHVybiAwOworI2VuZGlmCisJCX0gLyogZW5kIGlmICovCisKKyNpZm5kZWYgVkVSQk9TRQorCQlpZiAoZXhwZWN0ZWRfY2h1bmtfc2l6ZSAtIGNodW5rc2l6ZXNbaV0gPCAwICkKKwkJICBmcHJpbnRmIChsb2dGaWxlLCAiQ2h1bmtzaXplIGRpZCBub3QgZGVjcmVhc2U6ICVkIGluc3RlYWQgb2YgJWRcbiIsIGNodW5rc2l6ZXNbaV0sZXhwZWN0ZWRfY2h1bmtfc2l6ZSk7CisjZW5kaWYKKworCQkvKiBjYWxjdWxhdGluZyB0aGUgcmVtYWluaW5nIGFtb3VudCBvZiB3b3JrICovCisJCW9wZW53b3JrIC09IGNodW5rc2l6ZXNbaV07CisJICB9CQorCX0KKyAgICByZXR1cm4gcmVzdWx0OworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KKwpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9zY2hlZHVsZV9zdGF0aWMuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfc2NoZWR1bGVfc3RhdGljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDcxZDdkNAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfc2NoZWR1bGVfc3RhdGljLmMKQEAgLTAsMCArMSwxNjUgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgc3RhdGljIG9wdGlvbiBvZiB0aGUgb21wIGZvciBzY2hlZHVsZSBkaXJlY3RpdmUuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBmb3Igc2NoZWR1bGUoc3RhdGljKTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBmb3Igbm93YWl0LG9tcCBmbHVzaCxvbXAgY3JpdGljYWwsb21wIHNpbmdsZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworI2RlZmluZSBOVU1CRVJfT0ZfVEhSRUFEUyAxMAorI2RlZmluZSBDRlNNQVhfU0laRSAxMDAwCisjZGVmaW5lIE1BWF9USU1FIDAuMDEKKworI2lmZGVmIFNMRUVQVElNRQorI3VuZGVmIFNMRUVQVElNRQorI2RlZmluZSBTTEVFUFRJTUUgMC4wMDA1CisjZW5kaWYKKworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfZm9yX3NjaGVkdWxlX3N0YXRpYzwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgIGludCB0aHJlYWRzOworICBpbnQgaSxsYXN0dGlkOworICA8b21wdHM6b3JwaGFuOnZhcnM+CisgIGludCAqIHRpZHM7CisgIGludCBub3RvdXQ7CisgIGludCBtYXhpdGVyOworICBpbnQgY2h1bmtfc2l6ZTsKKyAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgaW50IGNvdW50ZXIgPSAwOworICBpbnQgdG1wX2NvdW50PTE7CisgIGludCBsYXN0dGhyZWFkc3N0YXJ0dGlkID0gLTE7CisgIGludCByZXN1bHQgPSAxOworICBjaHVua19zaXplID0gNzsKKworICB0aWRzID0gKGludCAqKSBtYWxsb2MgKHNpemVvZiAoaW50KSAqIChDRlNNQVhfU0laRSArIDEpKTsKKyAgbm90b3V0ID0gMTsKKyAgbWF4aXRlciA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNoYXJlZCh0aWRzLGNvdW50ZXIpCisgIHsJLyogYmVnaW4gb2YgcGFyYWxsZWwqLworI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgeworICAgICAgdGhyZWFkcyA9IG9tcF9nZXRfbnVtX3RocmVhZHMgKCk7CisgICAgfQkvKiBlbmQgb2Ygc2luZ2xlICovCisgIH0JLyogZW5kIG9mIHBhcmFsbGVsICovCisKKyAgaWYgKHRocmVhZHMgPCAyKQorICB7CisgICAgcHJpbnRmICgiVGhpcyB0ZXN0IG9ubHkgd29ya3Mgd2l0aCBhdCBsZWFzdCB0d28gdGhyZWFkcyIpOworICAgIGZwcmludGYgKGxvZ0ZpbGUsIlRoaXMgdGVzdCBvbmx5IHdvcmtzIHdpdGggYXQgbGVhc3QgdHdvIHRocmVhZHMiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBlbHNlIAorICB7CisgICAgZnByaW50ZiAobG9nRmlsZSwiVXNpbmcgYW4gaW50ZXJuYWwgY291bnQgb2YgJWRcblVzaW5nIGEgc3BlY2lmaWVkIGNodW5rc2l6ZSBvZiAlZFxuIiwgQ0ZTTUFYX1NJWkUsIGNodW5rX3NpemUpOworICAgIHRpZHNbQ0ZTTUFYX1NJWkVdID0gLTE7CS8qIHNldHRpbmcgZW5kZmxhZyAqLworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKHRpZHMpCisgICAgewkvKiBiZWdpbiBvZiBwYXJhbGxlbCAqLworICAgICAgPG9tcHRzOm9ycGhhbj4KKwlkb3VibGUgY291bnQ7CisgICAgICBpbnQgdGlkOworICAgICAgaW50IGo7CisKKyAgICAgIHRpZCA9IG9tcF9nZXRfdGhyZWFkX251bSAoKTsKKworI3ByYWdtYSBvbXAgZm9yIG5vd2FpdCA8b21wdHM6Y2hlY2s+c2NoZWR1bGUoc3RhdGljLGNodW5rX3NpemUpPC9vbXB0czpjaGVjaz4KKyAgICAgIGZvcihqID0gMDsgaiA8IENGU01BWF9TSVpFOyArK2opCisgICAgICB7CisJY291bnQgPSAwLjsKKyNwcmFnbWEgb21wIGZsdXNoKG1heGl0ZXIpCisJaWYgKGogPiBtYXhpdGVyKQorCXsKKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJICB7CisJICAgIG1heGl0ZXIgPSBqOworCSAgfQkvKiBlbmQgb2YgY3JpdGljYWwgKi8gCisJfQorCS8qcHJpbnRmICgidGhyZWFkICVkIHNsZWVwaW5nXG4iLCB0aWQpOyovCisJd2hpbGUgKG5vdG91dCAmJiAoY291bnQgPCBNQVhfVElNRSkgJiYgKG1heGl0ZXIgPT0gaikpCisJeworI3ByYWdtYSBvbXAgZmx1c2gobWF4aXRlcixub3RvdXQpCisJICBteV9zbGVlcCAoU0xFRVBUSU1FKTsKKwkgIGNvdW50ICs9IFNMRUVQVElNRTsKKwkgIHByaW50ZigiLiIpOworCX0KKyNpZmRlZiBWRVJCT1NFCisJaWYgKGNvdW50ID4gMC4pIHByaW50ZigiIHdhaXRlZCAlbGYgc1xuIiwgY291bnQpOworI2VuZGlmCisJLypwcmludGYgKCJ0aHJlYWQgJWQgYXdha2VcbiIsIHRpZCk7Ki8KKwl0aWRzW2pdID0gdGlkOworI2lmZGVmIFZFUkJPU0UKKwlwcmludGYoIiVkIGZpbmlzaGVkIGJ5ICVkXG4iLGosdGlkKTsKKyNlbmRpZgorICAgICAgfQkvKiBlbmQgb2YgZm9yICovCisKKyAgICAgIG5vdG91dCA9IDA7CisjcHJhZ21hIG9tcCBmbHVzaChtYXhpdGVyLG5vdG91dCkKKyAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgIH0JLyogZW5kIG9mIHBhcmFsbGVsICovCisKKyAgICAvKioqKiBhbmFseXNpbmcgdGhlIGRhdGEgaW4gYXJyYXkgdGlkcyAqKioqLworCisgICAgbGFzdHRpZCA9IHRpZHNbMF07CisgICAgdG1wX2NvdW50ID0gMDsgCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgQ0ZTTUFYX1NJWkUgKyAxOyArK2kpCisgICAgeworICAgICAgLyogSWYgdGhlIHdvcmsgIHdhcyBkb25lIGJ5IHRoZSBzYW1lIHRocmVhZCBpbmNyZWFzZSB0bXBfY291bnQgYnkgb25lLiAqLworICAgICAgaWYgKHRpZHNbaV0gPT0gbGFzdHRpZCkgeworCXRtcF9jb3VudCsrOworI2lmZGVmIFZFUkJPU0UKKwlmcHJpbnRmIChsb2dGaWxlLCAiJWQ6ICVkIFxuIiwgaSwgdGlkc1tpXSk7CisjZW5kaWYKKwljb250aW51ZTsKKyAgICAgIH0KKworICAgICAgLyogQ2hlY2sgaWYgdGhlIG5leHQgdGhyZWFkIGhhZCBoYXMgdGhlIHJpZ2h0IHRocmVhZCBudW1iZXIuIFdoZW4gZmluZGluZyAKKyAgICAgICAqIHRocmVhZG51bWJlciAtMSB0aGUgZW5kIHNob3VsZCBiZSByZWFjaGVkLiAKKyAgICAgICAqLwkgIAorICAgICAgaWYgKHRpZHNbaV0gPT0gKGxhc3R0aWQgKyAxKSAlIHRocmVhZHMgfHwgdGlkc1tpXSA9PSAtMSkgeworCS8qIGNoZWNraW5nIGZvciB0aGUgcmlnaHQgY2h1bmsgc2l6ZSAqLworCWlmICh0bXBfY291bnQgPT0gY2h1bmtfc2l6ZSkgeworCSAgdG1wX2NvdW50ID0gMTsKKwkgIGxhc3R0aWQgPSB0aWRzW2ldOworI2lmZGVmIFZFUkJPU0UKKwkgIGZwcmludGYgKGxvZ0ZpbGUsICJPS1xuIik7CisjZW5kaWYKKwl9CisJLyogSWYgdGhlIGNodW5rIHNpemUgd2FzIHdyb25nLCBjaGVjayBpZiB0aGUgZW5kIHdhcyByZWFjaGVkICovCisJZWxzZSB7CisJICBpZiAodGlkc1tpXSA9PSAtMSkgeworCSAgICBpZiAoaSA9PSBDRlNNQVhfU0laRSkgeworCSAgICAgIGZwcmludGYgKGxvZ0ZpbGUsICJMYXN0IHRocmVhZCBoYWQgY2h1bmsgc2l6ZSAlZFxuIiwgdG1wX2NvdW50KTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgICBlbHNlIHsKKwkgICAgICBmcHJpbnRmIChsb2dGaWxlLCAiRVJST1I6IExhc3QgdGhyZWFkICh0aHJlYWQgd2l0aCBudW1iZXIgLTEpIHdhcyBmb3VuZCBiZWZvcmUgdGhlIGVuZC5cbiIpOworCSAgICAgIHJlc3VsdCA9IDA7CisJICAgIH0KKwkgIH0KKwkgIGVsc2UgeworCSAgICBmcHJpbnRmIChsb2dGaWxlLCAiRVJST1I6IGNodW5rIHNpemUgd2FzICVkLiAoYXNzaWduZWQgd2FzICVkKVxuIiwgdG1wX2NvdW50LCBjaHVua19zaXplKTsKKwkgICAgcmVzdWx0ID0gMDsKKwkgIH0KKwl9CisgICAgICB9CisgICAgICBlbHNlIHsKKwlmcHJpbnRmKGxvZ0ZpbGUsICJFUlJPUjogRm91bmQgdGhyZWFkIHdpdGggbnVtYmVyICVkIChzaG91bGQgYmUgaW5iZXR3ZWVuIDAgYW5kICVkKS4iLCB0aWRzW2ldLCB0aHJlYWRzIC0gMSk7CisJcmVzdWx0ID0gMDsKKyAgICAgIH0KKyNpZmRlZiBWRVJCT1NFCisgICAgICBmcHJpbnRmIChsb2dGaWxlLCAiJWQ6ICVkIFxuIiwgaSwgdGlkc1tpXSk7CisjZW5kaWYKKyAgICB9CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfc2NoZWR1bGVfc3RhdGljXzMuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfc2NoZWR1bGVfc3RhdGljXzMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Mjg2NjdmCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9zY2hlZHVsZV9zdGF0aWNfMy5jCkBAIC0wLDAgKzEsMjEyIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIHN0YXRpYyBvcHRpb24gb2YgdGhlIG9tcCBmb3Igc2NoZWR1bGUgZGlyZWN0aXZlIGNvbnNpZGVyaW5nIHRoZSBzcGVjaWZpY2F0aW9ucyBmb3IgdGhlIGNodW5rIGRpc3RyaWJ1dGlvbiBvZiBzZXZlcmFsIGxvb3AgcmVnaW9ucyBpcyB0aGUgc2FtZSBhcyBzcGVjaWZpZWQgaW4gdGhlIE9wZW4gTVAgc3RhbmRhcmQgdmVyc2lvbiAzLjAuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBmb3Igc2NoZWR1bGUoc3RhdGljKTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBmb3Igbm93YWl0LG9tcCBmbHVzaCxvbXAgY3JpdGljYWwsb21wIHNpbmdsZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworI2RlZmluZSBOVU1CRVJfT0ZfVEhSRUFEUyAxMAorI2RlZmluZSBDRlNNQVhfU0laRSAxMDAwCisjZGVmaW5lIE1BWF9USU1FIDAuMDEKKworI2lmZGVmIFNMRUVQVElNRQorI3VuZGVmIFNMRUVQVElNRQorI2RlZmluZSBTTEVFUFRJTUUgMC4wMDA1CisjZW5kaWYKKworI2RlZmluZSBWRVJCT1NFIDAKKworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfZm9yX3NjaGVkdWxlX3N0YXRpY18zPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKyAgaW50IHRocmVhZHM7CisgIGludCBpLGxhc3R0aWQ7CisgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgaW50ICogdGlkczsKKyAgaW50ICogdGlkczI7CisgIGludCBub3RvdXQ7CisgIGludCBtYXhpdGVyOworICBpbnQgY2h1bmtfc2l6ZTsKKyAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgaW50IGNvdW50ZXIgPSAwOworICBpbnQgdG1wX2NvdW50PTE7CisgIGludCBsYXN0dGhyZWFkc3N0YXJ0dGlkID0gLTE7CisgIGludCByZXN1bHQgPSAxOworICBjaHVua19zaXplID0gNzsKKworICB0aWRzID0gKGludCAqKSBtYWxsb2MgKHNpemVvZiAoaW50KSAqIChDRlNNQVhfU0laRSArIDEpKTsKKyAgbm90b3V0ID0gMTsKKyAgbWF4aXRlciA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNoYXJlZCh0aWRzLGNvdW50ZXIpCisgIHsJLyogYmVnaW4gb2YgcGFyYWxsZWwqLworI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgeworICAgICAgdGhyZWFkcyA9IG9tcF9nZXRfbnVtX3RocmVhZHMgKCk7CisgICAgfQkvKiBlbmQgb2Ygc2luZ2xlICovCisgIH0JLyogZW5kIG9mIHBhcmFsbGVsICovCisKKyAgaWYgKHRocmVhZHMgPCAyKQorICB7CisgICAgcHJpbnRmICgiVGhpcyB0ZXN0IG9ubHkgd29ya3Mgd2l0aCBhdCBsZWFzdCB0d28gdGhyZWFkcyIpOworICAgIGZwcmludGYgKGxvZ0ZpbGUsIlRoaXMgdGVzdCBvbmx5IHdvcmtzIHdpdGggYXQgbGVhc3QgdHdvIHRocmVhZHMiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBlbHNlIAorICB7CisgICAgZnByaW50ZiAobG9nRmlsZSwiVXNpbmcgYW4gaW50ZXJuYWwgY291bnQgb2YgJWRcblVzaW5nIGEgc3BlY2lmaWVkIGNodW5rc2l6ZSBvZiAlZFxuIiwgQ0ZTTUFYX1NJWkUsIGNodW5rX3NpemUpOworICAgIHRpZHNbQ0ZTTUFYX1NJWkVdID0gLTE7CS8qIHNldHRpbmcgZW5kZmxhZyAqLworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKHRpZHMpCisgICAgewkvKiBiZWdpbiBvZiBwYXJhbGxlbCAqLworICAgICAgPG9tcHRzOm9ycGhhbj4KKwlkb3VibGUgY291bnQ7CisgICAgICBpbnQgdGlkOworICAgICAgaW50IGo7CisKKyAgICAgIHRpZCA9IG9tcF9nZXRfdGhyZWFkX251bSAoKTsKKworI3ByYWdtYSBvbXAgZm9yIG5vd2FpdCA8b21wdHM6Y2hlY2s+c2NoZWR1bGUoc3RhdGljLGNodW5rX3NpemUpPC9vbXB0czpjaGVjaz4KKyAgICAgIGZvcihqID0gMDsgaiA8IENGU01BWF9TSVpFOyArK2opCisgICAgICB7CisJY291bnQgPSAwLjsKKyNwcmFnbWEgb21wIGZsdXNoKG1heGl0ZXIpCisJaWYgKGogPiBtYXhpdGVyKQorCXsKKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJICB7CisJICAgIG1heGl0ZXIgPSBqOworCSAgfQkvKiBlbmQgb2YgY3JpdGljYWwgKi8gCisJfQorCS8qcHJpbnRmICgidGhyZWFkICVkIHNsZWVwaW5nXG4iLCB0aWQpOyovCisJd2hpbGUgKG5vdG91dCAmJiAoY291bnQgPCBNQVhfVElNRSkgJiYgKG1heGl0ZXIgPT0gaikpCisJeworI3ByYWdtYSBvbXAgZmx1c2gobWF4aXRlcixub3RvdXQpCisJICBteV9zbGVlcCAoU0xFRVBUSU1FKTsKKwkgIGNvdW50ICs9IFNMRUVQVElNRTsKKwkgIHByaW50ZigiLiIpOworCX0KKyNpZmRlZiBWRVJCT1NFCisJaWYgKGNvdW50ID4gMC4pIHByaW50ZigiIHdhaXRlZCAlbGYgc1xuIiwgY291bnQpOworI2VuZGlmCisJLypwcmludGYgKCJ0aHJlYWQgJWQgYXdha2VcbiIsIHRpZCk7Ki8KKwl0aWRzW2pdID0gdGlkOworI2lmZGVmIFZFUkJPU0UKKwlwcmludGYoIiVkIGZpbmlzaGVkIGJ5ICVkXG4iLGosdGlkKTsKKyNlbmRpZgorICAgICAgfQkvKiBlbmQgb2YgZm9yICovCisKKyAgICAgIG5vdG91dCA9IDA7CisjcHJhZ21hIG9tcCBmbHVzaChtYXhpdGVyLG5vdG91dCkKKyAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgIH0JLyogZW5kIG9mIHBhcmFsbGVsICovCisKKyAgICAvKioqKiBhbmFseXNpbmcgdGhlIGRhdGEgaW4gYXJyYXkgdGlkcyAqKioqLworCisgICAgbGFzdHRpZCA9IHRpZHNbMF07CisgICAgdG1wX2NvdW50ID0gMDsgCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgQ0ZTTUFYX1NJWkUgKyAxOyArK2kpCisgICAgeworICAgICAgLyogSWYgdGhlIHdvcmsgIHdhcyBkb25lIGJ5IHRoZSBzYW1lIHRocmVhZCBpbmNyZWFzZSB0bXBfY291bnQgYnkgb25lLiAqLworICAgICAgaWYgKHRpZHNbaV0gPT0gbGFzdHRpZCkgeworCXRtcF9jb3VudCsrOworI2lmZGVmIFZFUkJPU0UKKwlmcHJpbnRmIChsb2dGaWxlLCAiJWQ6ICVkIFxuIiwgaSwgdGlkc1tpXSk7CisjZW5kaWYKKwljb250aW51ZTsKKyAgICAgIH0KKworICAgICAgLyogQ2hlY2sgaWYgdGhlIG5leHQgdGhyZWFkIGhhZCBoYXMgdGhlIHJpZ2h0IHRocmVhZCBudW1iZXIuIFdoZW4gZmluZGluZyAKKyAgICAgICAqIHRocmVhZG51bWJlciAtMSB0aGUgZW5kIHNob3VsZCBiZSByZWFjaGVkLiAKKyAgICAgICAqLwkgIAorICAgICAgaWYgKHRpZHNbaV0gPT0gKGxhc3R0aWQgKyAxKSAlIHRocmVhZHMgfHwgdGlkc1tpXSA9PSAtMSkgeworCS8qIGNoZWNraW5nIGZvciB0aGUgcmlnaHQgY2h1bmsgc2l6ZSAqLworCWlmICh0bXBfY291bnQgPT0gY2h1bmtfc2l6ZSkgeworCSAgdG1wX2NvdW50ID0gMTsKKwkgIGxhc3R0aWQgPSB0aWRzW2ldOworI2lmZGVmIFZFUkJPU0UKKwkgIGZwcmludGYgKGxvZ0ZpbGUsICJPS1xuIik7CisjZW5kaWYKKwl9CisJLyogSWYgdGhlIGNodW5rIHNpemUgd2FzIHdyb25nLCBjaGVjayBpZiB0aGUgZW5kIHdhcyByZWFjaGVkICovCisJZWxzZSB7CisJICBpZiAodGlkc1tpXSA9PSAtMSkgeworCSAgICBpZiAoaSA9PSBDRlNNQVhfU0laRSkgeworCSAgICAgIGZwcmludGYgKGxvZ0ZpbGUsICJMYXN0IHRocmVhZCBoYWQgY2h1bmsgc2l6ZSAlZFxuIiwgdG1wX2NvdW50KTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgICBlbHNlIHsKKwkgICAgICBmcHJpbnRmIChsb2dGaWxlLCAiRVJST1I6IExhc3QgdGhyZWFkICh0aHJlYWQgd2l0aCBudW1iZXIgLTEpIHdhcyBmb3VuZCBiZWZvcmUgdGhlIGVuZC5cbiIpOworCSAgICAgIHJlc3VsdCA9IDA7CisJICAgIH0KKwkgIH0KKwkgIGVsc2UgeworCSAgICBmcHJpbnRmIChsb2dGaWxlLCAiRVJST1I6IGNodW5rIHNpemUgd2FzICVkLiAoYXNzaWduZWQgd2FzICVkKVxuIiwgdG1wX2NvdW50LCBjaHVua19zaXplKTsKKwkgICAgcmVzdWx0ID0gMDsKKwkgIH0KKwl9CisgICAgICB9CisgICAgICBlbHNlIHsKKwlmcHJpbnRmKGxvZ0ZpbGUsICJFUlJPUjogRm91bmQgdGhyZWFkIHdpdGggbnVtYmVyICVkIChzaG91bGQgYmUgaW5iZXR3ZWVuIDAgYW5kICVkKS4iLCB0aWRzW2ldLCB0aHJlYWRzIC0gMSk7CisJcmVzdWx0ID0gMDsKKyAgICAgIH0KKyNpZmRlZiBWRVJCT1NFCisgICAgICBmcHJpbnRmIChsb2dGaWxlLCAiJWQ6ICVkIFxuIiwgaSwgdGlkc1tpXSk7CisjZW5kaWYKKyAgICB9CisgIH0KKworICAvKiBOb3cgd2UgY2hlY2sgaWYgc2V2ZXJhbCBsb29wIHJlZ2lvbnMgaW4gb25lIHBhcmFsbGVsIHJlZ2lvbiBoYXZlIHRoZSBzYW1lIAorICAgKiBsb2dpY2FsIGFzc2lnbmVtZW50IG9mIGNodW5rcyB0byB0aHJlYWRzLgorICAgKiBXZSB1c2UgdGhlIG5vd2FpdCBjbGF1c2UgdG8gaW5jcmVhc2UgdGhlIHByb2JhYmlsaXR5IHRvIGdldCBhbiBlcnJvci4gKi8KKworICAvKiBGaXJzdCB3ZSBhbGxvY2F0ZSBzb21lIG1vcmUgbWVtbW9yeSAqLworIGZyZWUgKHRpZHMpOworICB0aWRzID0gKGludCAqKSBtYWxsb2MgKHNpemVvZiAoaW50KSAqIExPT1BDT1VOVCk7CisgIHRpZHMyID0gKGludCAqKSBtYWxsb2MgKHNpemVvZiAoaW50KSAqIExPT1BDT1VOVCk7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorICB7CisgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgeworICAgICAgICAgIGludCBuOworI3ByYWdtYSBvbXAgZm9yIDxvbXB0czpjaGVjaz5zY2hlZHVsZShzdGF0aWMpPC9vbXB0czpjaGVjaz4gbm93YWl0CisgICAgICAgICAgZm9yIChuID0gMDsgbiA8IExPT1BDT1VOVDsgbisrKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKExPT1BDT1VOVCA9PSBuICsgMSApCisgICAgICAgICAgICAgICAgICBteV9zbGVlcChTTEVFUFRJTUUpOworCisgICAgICAgICAgICAgIHRpZHNbbl0gPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKyAgICAgICAgICB9CisgICAgICB9CisgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICB7CisgICAgICAgICAgaW50IG07CisjcHJhZ21hIG9tcCBmb3IgPG9tcHRzOmNoZWNrPnNjaGVkdWxlKHN0YXRpYyk8L29tcHRzOmNoZWNrPiBub3dhaXQKKyAgICAgICAgICBmb3IgKG0gPSAxOyBtIDw9IExPT1BDT1VOVDsgbSsrKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICAgdGlkczJbbS0xXSA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIDwvb21wdHM6b3JwaGFuPgorICB9CisKKyAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKQorICAgICAgaWYgKHRpZHNbaV0gIT0gdGlkczJbaV0pIHsKKyAgICAgICAgICBmcHJpbnRmIChsb2dGaWxlLCAiQ2h1bmsgbm8uICVkIHdhcyBhc3NpZ25lZCBvbmNlIHRvIHRocmVhZCAlZCBhbmQgbGF0ZXIgdG8gdGhyZWFkICVkLlxuIiwgaSwgdGlkc1tpXSx0aWRzMltpXSk7CisgICAgICAgICAgcmVzdWx0ID0gMDsKKyAgICAgIH0KKworICBmcmVlICh0aWRzKTsKKyAgZnJlZSAodGlkczIpOworICByZXR1cm4gcmVzdWx0OworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9nZXRfbnVtX3RocmVhZHMuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9nZXRfbnVtX3RocmVhZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjA5MmJhCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2dldF9udW1fdGhyZWFkcy5jCkBAIC0wLDAgKzEsMzkgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGF0IHRoZSBvbXBfZ2V0X251bV90aHJlYWRzIHJldHVybnMgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIHRocmVhZHMuIFRoZXJlZm9yIGl0IGNvdW50cyB1cCBhIHZhcmlhYmxlIGluIGEgcGFyYWxsZWxpemVkIHNlY3Rpb24gYW5kIGNvbXBhcnMgdGhpcyB2YWx1ZSB3aXRoIHRoZSByZXN1bHQgb2YgdGhlIG9tcF9nZXRfbnVtX3RocmVhZHMgZnVuY3Rpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcF9nZXRfbnVtX3RocmVhZHM8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfZ2V0X251bV90aHJlYWRzPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKyAgICAvKiBjaGVja3MgdGhhdCBvbXBfZ2V0X251bV90aHJlYWRzIGlzIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YKKyAgICAgICB0aHJlYWRzICovCisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBudGhyZWFkc19saWI7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQgbnRocmVhZHMgPSAwOworCisgICAgbnRocmVhZHNfbGliID0gLTE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorICAgIHsKKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJeworCSAgICBudGhyZWFkcysrOworCX0JLyogZW5kIG9mIGNyaXRpY2FsICovCisjcHJhZ21hIG9tcCBzaW5nbGUKKwl7IAorPG9tcHRzOm9ycGhhbj4KKwkgICAgPG9tcHRzOmNoZWNrPm50aHJlYWRzX2xpYiA9IG9tcF9nZXRfbnVtX3RocmVhZHMgKCk7PC9vbXB0czpjaGVjaz4KKzwvb21wdHM6b3JwaGFuPgorCX0JLyogZW5kIG9mIHNpbmdsZSAqLworICAgIH0JLyogZW5kIG9mIHBhcmFsbGVsICovCisKKwlmcHJpbnRmIChsb2dGaWxlLCAiQ291bnRlZCAlZCB0aHJlYWRzLiBnZXRfbnVtX3RocmVhZHMgcmV0dXJuZWQgJWQuXG4iLCBudGhyZWFkcywgbnRocmVhZHNfbGliKTsKKyAgICByZXR1cm4gKG50aHJlYWRzID09IG50aHJlYWRzX2xpYik7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2dldF93dGljay5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2dldF93dGljay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MmI1N2YKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZ2V0X3d0aWNrLmMKQEAgLTAsMCArMSwyNCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXBfZ2V0X3d0aWNrIGZ1bmN0aW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXBfZ2V0X3d0aWNrPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZTxzdGRpby5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfZ2V0X3d0aWNrPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKQoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlkb3VibGUgdGljazsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgIHRpY2sgPSAtMS47CisKKyAgICA8b21wdHM6b3JwaGFuPgorCTxvbXB0czpjaGVjaz50aWNrID0gb21wX2dldF93dGljayAoKTs8L29tcHRzOmNoZWNrPgorICAgIDwvb21wdHM6b3JwaGFuPgorICAgIGZwcmludGYgKGxvZ0ZpbGUsICJXb3JrIHRvb2sgJWxmIHNlYy4gdGltZS5cbiIsIHRpY2spOworICAgIHJldHVybiAoKHRpY2sgPiAwLjApICYmICh0aWNrIDwgMC4wMSkpOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9nZXRfd3RpbWUuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9nZXRfd3RpbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjAyMjZkCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2dldF93dGltZS5jCkBAIC0wLDAgKzEsMzggQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wX2dldF93dGltZSBmdW5jdGlvbi4gSXQgY29tcGFyZXMgdGhlIHRpbWUgd2l0aCB3aGljaCBpcyBjYWxsZWQgYSBzbGVlcCBmdW5jdGlvbiB3aXRoIHRoZSB0aW1lIGl0IHRvb2sgYnkgbWVzc3VyaW5nIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGNhbGwgb2YgdGhlIHNsZWVwIGZ1bmN0aW9uIGFuZCBpdHMgZW5kLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXBfZ2V0X3d0aW1lPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZTxzdGRpby5oPgorI2luY2x1ZGU8c3RkbGliLmg+CisjaW5jbHVkZTx1bmlzdGQuaD4KKworCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfZ2V0X3d0aW1lPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKQoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlkb3VibGUgc3RhcnQ7CisJZG91YmxlIGVuZDsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgIGRvdWJsZSBtZWFzdXJlZF90aW1lOworICAgIGludCB3YWl0X3RpbWUgPSAxOyAKKworICAgIHN0YXJ0ID0gMDsKKyAgICBlbmQgPSAwOworCisgICAgPG9tcHRzOm9ycGhhbj4KKwk8b21wdHM6Y2hlY2s+c3RhcnQgPSBvbXBfZ2V0X3d0aW1lICgpOzwvb21wdHM6Y2hlY2s+CisgICAgPC9vbXB0czpvcnBoYW4+CisJbXlfc2xlZXAgKHdhaXRfdGltZSk7IAorICAgIDxvbXB0czpvcnBoYW4+CisJPG9tcHRzOmNoZWNrPmVuZCA9IG9tcF9nZXRfd3RpbWUgKCk7PC9vbXB0czpjaGVjaz4KKyAgICA8L29tcHRzOm9ycGhhbj4KKwltZWFzdXJlZF90aW1lID0gZW5kLXN0YXJ0OworICAgIGZwcmludGYobG9nRmlsZSwgIldvcmsgdG9vayAlbGYgc2VjLiB0aW1lLlxuIiwgbWVhc3VyZWRfdGltZSk7CisgICAgcmV0dXJuICgobWVhc3VyZWRfdGltZSA+IDAuOTkgKiB3YWl0X3RpbWUpICYmIChtZWFzdXJlZF90aW1lIDwgMS4wMSAqIHdhaXRfdGltZSkpIDsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfaW5fcGFyYWxsZWwuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9pbl9wYXJhbGxlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5YjYxMTEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfaW5fcGFyYWxsZWwuYwpAQCAtMCwwICsxLDUxIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhhdCBvbXBfaW5fcGFyYWxsZWwgcmV0dXJucyBmYWxzZSB3aGVuIGNhbGxlZCBmcm9tIGEgc2VyaWFsIHJlZ2lvbiBhbmQgdHJ1ZSB3aGVuIGNhbGxlZCB3aXRoaW4gYSBwYXJhbGxlbCByZWdpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcF9pbl9wYXJhbGxlbDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorLyoKKyAqIENoZWNrcyB0aGF0IGZhbHNlIGlzIHJldHVybmVkIHdoZW4gY2FsbGVkIGZyb20gc2VyaWFsIHJlZ2lvbgorICogYW5kIHRydWUgaXMgcmV0dXJuZWQgd2hlbiBjYWxsZWQgd2l0aGluIHBhcmFsbGVsIHJlZ2lvbi4gCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2luX3BhcmFsbGVsPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IHNlcmlhbDsKKwlpbnQgaXNwYXJhbGxlbDsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgc2VyaWFsID0gMTsKKyAgICBpc3BhcmFsbGVsID0gMDsKKworICAgIDxvbXB0czpjaGVjaz4KKwk8b21wdHM6b3JwaGFuPgorCSAgICBzZXJpYWwgPSBvbXBfaW5fcGFyYWxsZWwgKCk7CisJPC9vbXB0czpvcnBoYW4+CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworI3ByYWdtYSBvbXAgc2luZ2xlCisJeworCSAgICA8b21wdHM6b3JwaGFuPgorCQlpc3BhcmFsbGVsID0gb21wX2luX3BhcmFsbGVsICgpOworCSAgICA8L29tcHRzOm9ycGhhbj4KKwl9CisgICAgfQorICAgIDwvb21wdHM6Y2hlY2s+CisKKyAgICA8b21wdHM6Y3Jvc3NjaGVjaz4KKyNwcmFnbWEgb21wIHBhcmFsbGVsCisJeworI3ByYWdtYSBvbXAgc2luZ2xlCisJICAgIHsKKworCSAgICB9CisJfQorICAgIDwvb21wdHM6Y3Jvc3NjaGVjaz4KKworCXJldHVybiAoIShzZXJpYWwpICYmIGlzcGFyYWxsZWwpOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9sb2NrLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfbG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MjljMDcKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfbG9jay5jCkBAIC0wLDAgKzEsNDUgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wX3NldF9sb2NrICBhbmQgdGhlIG9tcF91bnNldF9sb2NrIGZ1bmN0aW9uIGJ5IGNvdW50aW5nIHRoZSB0aHJlYWRzIGVudGVyaW5nIGFuZCBleGl0aW5nIGEgc2luZ2xlIHJlZ2lvbiB3aXRoIGxvY2tzLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXBfbG9jazwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBmbHVzaDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK29tcF9sb2NrX3QgbGNrOworICAgIAoraW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2xvY2s8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpCit7CisgIGludCBucl90aHJlYWRzX2luX3NpbmdsZSA9IDA7CisgIGludCByZXN1bHQgPSAwOworICBpbnQgbnJfaXRlcmF0aW9ucyA9IDA7CisgIGludCBpOworICBvbXBfaW5pdF9sb2NrICgmbGNrKTsKKyAgCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQobGNrKQorICB7CisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspCisgICAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgPG9tcHRzOmNoZWNrPm9tcF9zZXRfbG9jayAoJmxjayk7PC9vbXB0czpjaGVjaz4KKwk8L29tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wIGZsdXNoCisJbnJfdGhyZWFkc19pbl9zaW5nbGUrKzsKKyNwcmFnbWEgb21wIGZsdXNoICAgICAgICAgICAKKwlucl9pdGVyYXRpb25zKys7CisJbnJfdGhyZWFkc19pbl9zaW5nbGUtLTsKKwlyZXN1bHQgPSByZXN1bHQgKyBucl90aHJlYWRzX2luX3NpbmdsZTsKKwk8b21wdHM6b3JwaGFuPgorCSAgICA8b21wdHM6Y2hlY2s+b21wX3Vuc2V0X2xvY2soJmxjayk7PC9vbXB0czpjaGVjaz4KKwk8L29tcHRzOm9ycGhhbj4KKyAgICAgIH0KKyAgfQorICBvbXBfZGVzdHJveV9sb2NrICgmbGNrKTsKKyAgCisgIHJldHVybiAoKHJlc3VsdCA9PSAwKSAmJiAobnJfaXRlcmF0aW9ucyA9PSBMT09QQ09VTlQpKTsKKyAgCit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX21hc3Rlci5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX21hc3Rlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkYjJmMWUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfbWFzdGVyLmMKQEAgLTAsMCArMSwzNyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgbWFzdGVyIGRpcmVjdGl2ZSBieSBjb3VudGluZyB1cCBhIHZhcmlhYmxlIGluIGEgb21wIG1hc3RlciBzZWN0aW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgbWFzdGVyPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX21hc3Rlcjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IG50aHJlYWRzOworCWludCBleGVjdXRpbmdfdGhyZWFkOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICBudGhyZWFkcyA9IDA7CisgICAgZXhlY3V0aW5nX3RocmVhZCA9IC0xOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICA8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgbWFzdGVyIDwvb21wdHM6Y2hlY2s+CisJICAgIHsKKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJCXsKKwkJICAgIG50aHJlYWRzKys7CisJCX0KKwkJZXhlY3V0aW5nX3RocmVhZCA9IG9tcF9nZXRfdGhyZWFkX251bSAoKTsKKworCSAgICB9IC8qIGVuZCBvZiBtYXN0ZXIqLworCTwvb21wdHM6b3JwaGFuPgorICAgIH0gLyogZW5kIG9mIHBhcmFsbGVsKi8KKyAgICByZXR1cm4gKChudGhyZWFkcyA9PSAxKSAmJiAoZXhlY3V0aW5nX3RocmVhZCA9PSAwKSk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX21hc3Rlcl8zLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfbWFzdGVyXzMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTk4MTI5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX21hc3Rlcl8zLmMKQEAgLTAsMCArMSw0NCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgbWFzdGVyIGRpcmVjdGl2ZSBieSBjb3VudGluZyB1cCBhIHZhcmlhYmxlIGluIGEgb21wIG1hc3RlciBzZWN0aW9uLiBJdCBhbHNvIGNoZWNrcyB0aGF0IHRoZSBtYXN0ZXIgdGhyZWFkIGhhcyB0aGUgdGhyZWFkIG51bWJlciAwIGFzIHNwZWNpZmllZCBpbiB0aGUgT3BlbiBNUCBzdGFuZGFyZCB2ZXJzaW9uIDMuMC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIG1hc3Rlcjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9tYXN0ZXJfMzwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IG50aHJlYWRzOworCWludCBleGVjdXRpbmdfdGhyZWFkOworICAgICAgICBpbnQgdGlkX3Jlc3VsdCA9IDA7IC8qIGNvdW50cyB1cCB0aGUgbnVtYmVyIG9mIHdyb25nIHRocmVhZCBuby4gZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1hc3RlciB0aHJlYWQuIChNdXN0IGJlIDApICovCisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgIG50aHJlYWRzID0gMDsKKyAgICBleGVjdXRpbmdfdGhyZWFkID0gLTE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBtYXN0ZXIgPC9vbXB0czpjaGVjaz4KKwkgICAgeworICAgICAgICAgICAgICAgIGludCB0aWQgPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKyAgICAgICAgICAgICAgICBpZiAodGlkICE9IDApIHsKKyNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICAgICAgICAgICAgICAgIHsgdGlkX3Jlc3VsdCsrOyB9CisgICAgICAgICAgICAgICAgfQorI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkJeworCQkgICAgbnRocmVhZHMrKzsKKwkJfQorCQlleGVjdXRpbmdfdGhyZWFkID0gb21wX2dldF90aHJlYWRfbnVtICgpOworCisJICAgIH0gLyogZW5kIG9mIG1hc3RlciovCisJPC9vbXB0czpvcnBoYW4+CisgICAgfSAvKiBlbmQgb2YgcGFyYWxsZWwqLworICAgIHJldHVybiAoKG50aHJlYWRzID09IDEpICYmIChleGVjdXRpbmdfdGhyZWFkID09IDApICYmICh0aWRfcmVzdWx0ID09IDApKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfbmVzdF9sb2NrLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfbmVzdF9sb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FkZTM4OQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9uZXN0X2xvY2suYwpAQCAtMCwwICsxLDQ1IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcF9zZXRfbmVzdF9sb2NrIGFuZCB0aGUgb21wX3Vuc2V0X25lc3RfbG9jayBmdW5jdGlvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX25lc3RfbG9jazwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBmbHVzaDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK29tcF9uZXN0X2xvY2tfdCBsY2s7CisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9uZXN0X2xvY2s8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgaW50IG5yX3RocmVhZHNfaW5fc2luZ2xlID0gMDsKKyAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICBpbnQgbnJfaXRlcmF0aW9ucyA9IDA7CisgICAgaW50IGk7CisKKyAgICBvbXBfaW5pdF9uZXN0X2xvY2sgKCZsY2spOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQobGNrKSAgCisgICAgeworI3ByYWdtYSBvbXAgZm9yCisJZm9yKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspCisJeworCSAgICA8b21wdHM6b3JwaGFuPgorCQk8b21wdHM6Y2hlY2s+b21wX3NldF9uZXN0X2xvY2sgKCZsY2spOzwvb21wdHM6Y2hlY2s+CisJICAgIDwvb21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgZmx1c2gKKwkJbnJfdGhyZWFkc19pbl9zaW5nbGUrKzsKKyNwcmFnbWEgb21wIGZsdXNoICAgICAgICAgICAKKwkgICAgbnJfaXRlcmF0aW9ucysrOworCSAgICBucl90aHJlYWRzX2luX3NpbmdsZS0tOworCSAgICByZXN1bHQgPSByZXN1bHQgKyBucl90aHJlYWRzX2luX3NpbmdsZTsKKwkgICAgPG9tcHRzOm9ycGhhbj4KKwkJPG9tcHRzOmNoZWNrPm9tcF91bnNldF9uZXN0X2xvY2sgKCZsY2spOzwvb21wdHM6Y2hlY2s+CisJICAgIDwvb21wdHM6b3JwaGFuPgorCX0KKyAgICB9CisgICAgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrICgmbGNrKTsKKworICAgIHJldHVybiAoKHJlc3VsdCA9PSAwKSAmJiAobnJfaXRlcmF0aW9ucyA9PSBMT09QQ09VTlQpKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfbmVzdGVkLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfbmVzdGVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY1N2JjOAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9uZXN0ZWQuYwpAQCAtMCwwICsxLDQyIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcF9uZXN0ZWQgZnVuY3Rpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcF9uZXN0ZWQ8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorLyoKKyAqIFRlc3QgaWYgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIG5lc3RlZCBwYXJhbGxlbGlzbQorICogQnkgQ2h1bmh1YSBMaWFvLCBVbml2ZXJzaXR5IG9mIEhvdXN0b24KKyAqIE9jdC4gMjAwNQorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9uZXN0ZWQ8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpCit7CisKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIGludCBjb3VudGVyID0gMDsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisjaWZkZWYgX09QRU5NUAorICAgIDxvbXB0czpjaGVjaz5vbXBfc2V0X25lc3RlZCgxKTs8L29tcHRzOmNoZWNrPgorICAgIDxvbXB0czpjcm9zc2NoZWNrPm9tcF9zZXRfbmVzdGVkKDApOzwvb21wdHM6Y3Jvc3NjaGVjaz4KKyNlbmRpZgorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQoY291bnRlcikKK3sKKzxvbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgIGNvdW50ZXIgKys7CisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICAgIGNvdW50ZXIgLS07CisgICAgfQorPC9vbXB0czpvcnBoYW4+Cit9CisgICAgcmV0dXJuIChjb3VudGVyICE9IDApOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9jb3B5aW4uYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9jb3B5aW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODJiZmEyCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2NvcHlpbi5jCkBAIC0wLDAgKzEsNDcgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIGNvcHlpbiBkaXJlY3RpdmUuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBjb3B5aW48L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWwsb21wIHRocmVhZHByaXZhdGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitzdGF0aWMgaW50IHN1bTEgPSA3ODk7CisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKHN1bTEpCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9wYXJhbGxlbF9jb3B5aW48L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBzdW0sIG51bV90aHJlYWRzOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IGtub3duX3N1bTsKKworICAgIHN1bSA9IDA7CisgICAgc3VtMSA9IDc7CisgICAgbnVtX3RocmVhZHMgPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCA8b21wdHM6Y2hlY2s+Y29weWluKHN1bTEpPC9vbXB0czpjaGVjaz4KKyAgICB7CisJLypwcmludGYoInN1bTE9JWRcbiIsc3VtMSk7Ki8KKwk8b21wdHM6b3JwaGFuPgorCWludCBpOworI3ByYWdtYSBvbXAgZm9yIAorCSAgICBmb3IgKGkgPSAxOyBpIDwgMTAwMDsgaSsrKQorCSAgICB7CisJCXN1bTEgPSBzdW0xICsgaTsKKwkgICAgfSAvKmVuZCBvZiBmb3IqLworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwl7CisJICAgIHN1bSA9IHN1bSArIHN1bTE7CisgICAgICAgICAgICBudW1fdGhyZWFkcysrOworCX0gLyplbmQgb2YgY3JpdGljYWwqLworCTwvb21wdHM6b3JwaGFuPgorICAgIH0gLyogZW5kIG9mIHBhcmFsbGVsKi8gICAgCisgICAga25vd25fc3VtID0gKDk5OSAqIDEwMDApIC8gMiArIDcgKiBudW1fdGhyZWFkczsKKyAgICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworCit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2RlZmF1bHQuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9kZWZhdWx0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM4NzM3MQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9kZWZhdWx0LmMKQEAgLTAsMCArMSw0NCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBkZWZhdWx0IG9wdGlvbiBvZiB0aGUgcGFyYWxsZWwgY29uc3RydWN0Ljwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgZGVmYXVsdDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9wYXJhbGxlbF9kZWZhdWx0PC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKyAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICBpbnQgaTsKKyAgaW50IHN1bTsKKyAgaW50IG15c3VtOworICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAKKyAgaW50IGtub3duX3N1bTsKKyAgc3VtID0wOworICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDIgOworCisgIDxvbXB0czpvcnBoYW4+CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIDxvbXB0czpjaGVjaz5kZWZhdWx0KHNoYXJlZCk8L29tcHRzOmNoZWNrPiBwcml2YXRlKGkpIHByaXZhdGUobXlzdW08b21wdHM6Y3Jvc3NjaGVjaz4sc3VtPC9vbXB0czpjcm9zc2NoZWNrPikKKyAgeworCW15c3VtID0gMDsKKyAgI3ByYWdtYSBvbXAgZm9yCisJZm9yIChpID0gMTsgaSA8PSBMT09QQ09VTlQ7IGkrKykKKwl7CisJICBteXN1bSA9IG15c3VtICsgaTsKKwl9IAorI3ByYWdtYSBvbXAgY3JpdGljYWwKKwl7CisJICBzdW0gPSBzdW0gKyBteXN1bTsKKwl9ICAgLyogZW5kIG9mIGNyaXRpY2FsICovCisgIH0gICAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKyAgPC9vbXB0czpvcnBoYW4+CisgIGlmIChrbm93bl9zdW0gIT0gc3VtKSB7CisgIAlmcHJpbnRmKGxvZ0ZpbGUsICJLTk9XTl9TVU0gPSAlZDsgU1VNID0gJWRcbiIsIGtub3duX3N1bSwgc3VtKTsKKyAgfQorICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9maXJzdHByaXZhdGUuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9maXJzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDE1YjRjCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2ZpcnN0cHJpdmF0ZS5jCkBAIC0wLDAgKzEsNDggQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIGZpcnN0cHJpdmF0ZSBkaXJlY3RpdmUuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBmaXJzdHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgZm9yIG9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKy8vc3RhdGljIGludCBzdW0xID0gNzg5OworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfZmlyc3Rwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKQoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgc3VtLCBudW1fdGhyZWFkcyxzdW0xOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IGtub3duX3N1bTsKKworICAgIHN1bSA9IDA7CisgICAgc3VtMT03OworICAgIG51bV90aHJlYWRzID0gMDsKKworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCA8b21wdHM6Y2hlY2s+Zmlyc3Rwcml2YXRlKHN1bTEpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz5wcml2YXRlKHN1bTEpPC9vbXB0czpjcm9zc2NoZWNrPgorICAgIHsKKworCS8qcHJpbnRmKCJzdW0xPSVkXG4iLHN1bTEpOyovCisJPG9tcHRzOm9ycGhhbj4KKwlpbnQgaTsKKyNwcmFnbWEgb21wIGZvciAKKwkgICAgZm9yIChpID0gMTsgaSA8IDEwMDA7IGkrKykKKwkgICAgeworCQlzdW0xID0gc3VtMSArIGk7CisJICAgIH0gLyplbmQgb2YgZm9yKi8KKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJeworCSAgICBzdW0gPSBzdW0gKyBzdW0xOworICAgICAgICAgICAgbnVtX3RocmVhZHMrKzsKKwl9IC8qZW5kIG9mIGNyaXRpY2FsKi8KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9IC8qIGVuZCBvZiBwYXJhbGxlbCovICAgIAorICAgIGtub3duX3N1bSA9ICg5OTkgKiAxMDAwKSAvIDIgKyA3ICogbnVtX3RocmVhZHM7CisgICAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKKworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3JfZmlyc3Rwcml2YXRlLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZm9yX2ZpcnN0cHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYjQ5MjYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZm9yX2ZpcnN0cHJpdmF0ZS5jCkBAIC0wLDAgKzEsMzYgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIGZvciBmaXJzdHByaXZhdGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgZm9yIGZpcnN0cHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBwYXJhbGxlbCBmb3IgcmVkdWN0aW9uLG9tcCBwYXJhbGxlbCBmb3IgcHJpdmF0ZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9wYXJhbGxlbF9mb3JfZmlyc3Rwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKQoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQgc3VtIDsKKyAgICBpbnQgaTI7CisgICAgaW50IGk7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICAKKyAgICBzdW09MDsKKyAgICBpMj0zOworICAgIGludCBrbm93bl9zdW07CisKKyAgICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3IgcmVkdWN0aW9uKCs6c3VtKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5maXJzdHByaXZhdGUoaTIpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz5wcml2YXRlKGkyKTwvb21wdHM6Y3Jvc3NjaGVjaz4KKyAgICA8b21wdHM6b3JwaGFuPgorICAgIGZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspCisgICAgeworCSAgc3VtID0gc3VtICsgKGkgKyBpMik7CisgICAgfSAvKmVuZCBvZiBmb3IqLworICAgIDwvb21wdHM6b3JwaGFuPgorICAgIAorICAgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMiArIGkyICogTE9PUENPVU5UOworICAgIAorICAgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7CisKK30gLyogZW5kIG9mIGNoZWNrX3BhcmFsbGVsX2Zvcl9maXN0cHJpdmF0ZSAqLworPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3JfaWYuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3JfaWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Mjg4NmJhCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2Zvcl9pZi5jCkBAIC0wLDAgKzEsMzggQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIGZvciBpZiBkaXJlY3RpdmUuIE5lZWRzIGF0IGxlYXN0IHR3byB0aHJlYWRzLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgZm9yIGlmPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+PC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9wYXJhbGxlbF9mb3JfaWY8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworICAgIGludCBrbm93bl9zdW07CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBudW1fdGhyZWFkczsKKyAgICBpbnQgc3VtLCBzdW0yOworICAgIGludCBpOworICAgIGludCBjb250cm9sOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgY29udHJvbCA9IDA7CisgICAgbnVtX3RocmVhZHM9MDsKKyAgICBzdW0gPSAwOworICAgIHN1bTIgPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3IgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+aWYgKGNvbnRyb2w9PTEpPC9vbXB0czpjaGVjaz4KKyAgICA8b21wdHM6b3JwaGFuPgorICAgIGZvciAoaT0wOyBpIDw9IExPT1BDT1VOVDsgaSsrKQorICAgIHsKKyAgICAgICAgbnVtX3RocmVhZHMgPSBvbXBfZ2V0X251bV90aHJlYWRzKCk7CisJc3VtID0gc3VtICsgaTsKKyAgICB9IC8qZW5kIG9mIGZvciovCisKKyAgICA8L29tcHRzOm9ycGhhbj4KKyAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgICAgZnByaW50ZiAobG9nRmlsZSwgIk51bWJlciBvZiB0aHJlYWRzIGRldGVybWluZWQgYnkgb21wX2dldF9udW1fdGhyZWFkczogJWRcbiIsIG51bV90aHJlYWRzKTsKKyAgICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0gJiYgbnVtX3RocmVhZHMgPT0gMSk7Cit9IC8qIGVuZCBvZiBjaGVja19wYXJhbGxlbF9mb3JfcHJpdmF0ZSAqLworPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3JfbGFzdHByaXZhdGUuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3JfbGFzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDlkZWJhCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2Zvcl9sYXN0cHJpdmF0ZS5jCkBAIC0wLDAgKzEsMzQgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIGZvciBsYXN0cHJpdmF0ZSBkaXJlY3RpdmUuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBmb3IgbGFzdHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgcGFyYWxsZWwgZm9yIHJlZHVjdGlvbixvbXAgcGFyYWxsZWwgZm9yIHByaXZhdGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfZm9yX2xhc3Rwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IHN1bTsKKyAgICBpbnQgaTsKKyAgICBpbnQgaTA7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgIHN1bSA9MDsKKyAgICBpMCA9IC0xOworICAgIGludCBrbm93bl9zdW07CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciByZWR1Y3Rpb24oKzpzdW0pIHNjaGVkdWxlKHN0YXRpYyw3KSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5sYXN0cHJpdmF0ZShpMCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPnByaXZhdGUoaTApPC9vbXB0czpjcm9zc2NoZWNrPgorICAgIDxvbXB0czpvcnBoYW4+CisgICAgZm9yIChpID0gMTsgaSA8PSBMT09QQ09VTlQ7IGkrKykKKyAgICB7CisJc3VtID0gc3VtICsgaTsKKwlpMCA9IGk7CisgICAgfSAvKmVuZCBvZiBmb3IqLworICAgIC8qIGVuZCBvZiBwYXJhbGxlbCovICAgIAorICAgIDwvb21wdHM6b3JwaGFuPgorICAgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKyAgICByZXR1cm4gKChrbm93bl9zdW0gPT0gc3VtKSAmJiAoaTAgPT0gTE9PUENPVU5UKSk7Cit9IC8qIGVuZCBvZiBjaGVja19wYXJhbGxlbF9mb3JfbGFzdHByaXZhdGUgKi8KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZm9yX29yZGVyZWQuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3Jfb3JkZXJlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxYTRiYzkKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZm9yX29yZGVyZWQuYwpAQCAtMCwwICsxLDYyIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBmb3Igb3JkZXJlZCBkaXJlY3RpdmU8L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIGZvciBvcmRlcmVkPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHBhcmFsbGVsIHNjaGVkdWxlKHN0YXRpYyk8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitzdGF0aWMgaW50IGxhc3RfaSA9IDA7CitpbnQgaTsKKworI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShpKQorCisvKiBWYXJpYWJsZSBpaSBpcyB1c2VkIHRvIGF2b2lkIHByb2JsZW1zIHdpdGggYSB0aHJlYWRwcml2YXRlIHZhcmlhYmxlIHVzZWQgYXMgYSBsb29wCisgKiBpbmRleC4gU2VlIHRlc3Qgb21wX3RocmVhZHByaXZhdGVfZm9yLgorICovCitzdGF0aWMgaW50IGlpOworI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShpaSkKKworLyohIAorICBVdGlsaXR5IGZ1bmN0aW9uOiByZXR1cm5zIHRydWUgaWYgdGhlIHBhc3NlZCBhcmd1bWVudCBpcyBsYXJnZXIgdGhhbiAKKyAgdGhlIGFyZ3VtZW50IG9mIHRoZSBsYXN0IGNhbGwgb2YgdGhpcyBmdW5jdGlvbi4KKyAgKi8KK3N0YXRpYyBpbnQgY2hlY2tfaV9pc2xhcmdlcjIgKGludCBpKXsKKwlpbnQgaXNsYXJnZXI7CisJaXNsYXJnZXIgPSAoaSA+IGxhc3RfaSk7CisJbGFzdF9pID0gaTsKKwlyZXR1cm4gKGlzbGFyZ2VyKTsKK30KKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3BhcmFsbGVsX2Zvcl9vcmRlcmVkPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKwk8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IHN1bTsKKwlpbnQgaXNfbGFyZ2VyOworCTwvb21wdHM6b3JwaGFuOnZhcnM+CisKKwlpbnQga25vd25fc3VtOworCWludCBpOworCQorCXN1bSA9IDA7CisJaXNfbGFyZ2VyID0gMTsKKwlsYXN0X2kgPSAwOworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKHN0YXRpYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5vcmRlcmVkPC9vbXB0czpjaGVjaz4KKwlmb3IgKGkgPSAxOyBpIDwgMTAwOyBpKyspCisJeworCQlpaSA9IGk7CisJPG9tcHRzOm9ycGhhbj4KKzxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBvcmRlcmVkPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJCXsKKwkJCWlzX2xhcmdlciA9IGNoZWNrX2lfaXNsYXJnZXIyIChpaSkgJiYgaXNfbGFyZ2VyOworCQkJc3VtICA9IHN1bSArIGlpOworCQl9CisJPC9vbXB0czpvcnBoYW4+CisJfQorCWtub3duX3N1bSA9ICg5OSAqIDEwMCkgLyAyOworCWZwcmludGYgKGxvZ0ZpbGUsIiBrbm93bl9zdW0gPSAlZCAsIHN1bSA9ICVkIFxuIiwga25vd25fc3VtLCBzdW0pOworCWZwcmludGYgKGxvZ0ZpbGUsIiBpc19sYXJnZXIgPSAlZFxuIiwgaXNfbGFyZ2VyKTsKKwlyZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pICYmIGlzX2xhcmdlcjsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZm9yX3ByaXZhdGUuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3JfcHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMjgwY2MKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZm9yX3ByaXZhdGUuYwpAQCAtMCwwICsxLDQ4IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBmb3IgcHJpdmF0ZSBkaXJlY3RpdmUuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBmb3IgcHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBwYXJhbGxlbCBmb3IgcmVkdWN0aW9uLG9tcCBmbHVzaDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisvKiEgVXRpbGl0eSBmdW5jdGlvbiB0byBzcGVuZCBzb21lIHRpbWUgaW4gYSBsb29wICovCitzdGF0aWMgdm9pZCBkb19zb21lX3dvcmsgKHZvaWQpeworICAgIGludCBpOworICAgIGRvdWJsZSBzdW0gPSAwOworICAgIGZvcihpID0gMDsgaSA8IDEwMDA7IGkrKyl7CisJc3VtICs9IHNxcnQgKGkpOworICAgIH0KK30KKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3BhcmFsbGVsX2Zvcl9wcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IHN1bTsKKyAgICBpbnQgaTsKKyAgICBpbnQgaTI7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICAKKyAgICBzdW0gPTA7CisgICAgaTI9MDsKKyAgICBpbnQga25vd25fc3VtOworICAKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciByZWR1Y3Rpb24oKzpzdW0pIHNjaGVkdWxlKHN0YXRpYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5wcml2YXRlKGkyKTwvb21wdHM6Y2hlY2s+CisgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAKKyAgICBmb3IgKGk9MTtpPD1MT09QQ09VTlQ7aSsrKQorICAgIHsKKwlpMiA9IGk7CisjcHJhZ21hIG9tcCBmbHVzaAorCWRvX3NvbWVfd29yayAoKTsKKyNwcmFnbWEgb21wIGZsdXNoCisJc3VtID0gc3VtICsgaTI7CisgICAgfSAvKmVuZCBvZiBmb3IqLworICAgIDwvb21wdHM6b3JwaGFuPgorCisgICAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyOworICAgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7Cit9IC8qIGVuZCBvZiBjaGVja19wYXJhbGxlbF9mb3JfcHJpdmF0ZSAqLworPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3JfcmVkdWN0aW9uLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZm9yX3JlZHVjdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjOTkxZjcKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZm9yX3JlZHVjdGlvbi5jCkBAIC0wLDAgKzEsMjgwIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBmb3IgcmVkdWN0aW9uIGRpcmVjdGl2ZSB3aXRoIGFsbCBpdHMgb3B0aW9ucy48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIGZvciByZWR1Y3Rpb248L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3BhcmFsbGVsX2Zvcl9yZWR1Y3Rpb248L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworCTxvbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQgc3VtOworCWludCBrbm93bl9zdW07CisJZG91YmxlIGRzdW07CisJZG91YmxlIGRrbm93bl9zdW07CisJZG91YmxlIGR0PTAuNTsJCQkJLyogYmFzZSBvZiBnZW9tZXRyaWMgcm93IGZvciArIGFuZCAtIHRlc3QqLworCWRvdWJsZSByb3VuZGluZ19lcnJvcj0gMS5FLTk7CisjZGVmaW5lIERPVUJMRV9ESUdJVFMgMjAJCS8qIGR0XkRPVUJMRV9ESUdJVFMgKi8KKwlpbnQgZGlmZjsKKwlkb3VibGUgZGRpZmY7CisJaW50IHByb2R1Y3Q7CisJaW50IGtub3duX3Byb2R1Y3Q7CisjZGVmaW5lIE1BWF9GQUNUT1IgMTAKKyNkZWZpbmUgS05PV05fUFJPRFVDVCAzNjI4ODAwCS8qIDEwISAqLworCWludCBsb2dpY19hbmQ7CisJaW50IGxvZ2ljX29yOworCWludCBiaXRfYW5kOworCWludCBiaXRfb3I7CisJaW50IGV4Y2x1c2l2X2JpdF9vcjsKKwlpbnQgbG9naWNzW0xPT1BDT1VOVF07CisJaW50IGk7CisJZG91YmxlIGRwdDsKKwlpbnQgcmVzdWx0OworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICBzdW0gPTA7CisgICAgZHN1bT0wOworCWR0ID0gMS4vMy47CisgICAgcmVzdWx0ID0gMDsKKyAgICBwcm9kdWN0ID0gMTsKKwlsb2dpY19hbmQ9MTsKKwlsb2dpY19vcj0wOworCWJpdF9hbmQ9MTsKKwliaXRfb3I9MDsKKwlleGNsdXNpdl9iaXRfb3I9MDsKKworCWtub3duX3N1bSA9IChMT09QQ09VTlQqKExPT1BDT1VOVCsxKSkvMjsKKzxvbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKzpzdW0pPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yIChpPTE7aTw9TE9PUENPVU5UO2krKykKKwl7CisJCXN1bT1zdW0raTsKKwl9CisKKwlpZihrbm93bl9zdW0hPXN1bSkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIHN1bSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgJWRcbiIsc3VtLGtub3duX3N1bSk7IAorCX0KKworCWRpZmYgPSAoTE9PUENPVU5UKihMT09QQ09VTlQrMSkpLzI7CisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLTpkaWZmKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvciAoaT0xO2k8PUxPT1BDT1VOVDsrK2kpCisJeworCQlkaWZmPWRpZmYtaTsKKwl9CisKKwlpZihkaWZmICE9IDApCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBkaWZmZXJlbmNlIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAwLlxuIixkaWZmKTsKKwl9CisKKwkvKiBUZXN0cyBmb3IgZG91YmxlcyAqLworCWRzdW09MDsKKwlkcHQ9MTsKKwlmb3IgKGk9MDtpPERPVUJMRV9ESUdJVFM7KytpKQorCXsKKwkJZHB0Kj1kdDsKKwl9CisJZGtub3duX3N1bSA9ICgxLWRwdCkvKDEtZHQpOworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCs6ZHN1bSk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IgKGk9MDtpPERPVUJMRV9ESUdJVFM7KytpKQorCXsKKwkJZHN1bSArPSBwb3coZHQsaSk7CisJfQorCisJaWYoIGZhYnMoZHN1bS1ka25vd25fc3VtKSA+IHJvdW5kaW5nX2Vycm9yICkKKwl7CisJCXJlc3VsdCsrOyAKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBzdW0gd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICVmIGluc3RlYWQgb2YgJWYgKERpZmZlcmVuY2U6ICVFKVxuIixkc3VtLGRrbm93bl9zdW0sIGRzdW0tZGtub3duX3N1bSk7CisJfQorCisJZHB0PTE7CisKKwlmb3IgKGk9MDtpPERPVUJMRV9ESUdJVFM7KytpKQorCXsKKwkJZHB0Kj1kdDsKKwl9CisJZnByaW50Zihsb2dGaWxlLCJcbiIpOworCWRkaWZmID0gKDEtZHB0KS8oMS1kdCk7CisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLTpkZGlmZik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IgKGk9MDtpPERPVUJMRV9ESUdJVFM7KytpKQorCXsKKwkJZGRpZmYgLT0gcG93KGR0LGkpOworCX0KKwlpZiggZmFicyhkZGlmZikgPiByb3VuZGluZ19lcnJvcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIERpZmZlcmVuY2Ugd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICVFIGluc3RlYWQgb2YgMC4wXG4iLGRkaWZmKTsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigqOnByb2R1Y3QpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MTtpPD1NQVhfRkFDVE9SO2krKykKKwl7CisJCXByb2R1Y3QgKj0gaTsKKwl9CisKKwlrbm93bl9wcm9kdWN0ID0gS05PV05fUFJPRFVDVDsKKwlpZihrbm93bl9wcm9kdWN0ICE9IHByb2R1Y3QpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBQcm9kdWN0IHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAlZFxuXG4iLHByb2R1Y3Qsa25vd25fcHJvZHVjdCk7CisJfQorCisJZm9yKGk9MDtpPExPT1BDT1VOVDtpKyspCisJeworCQlsb2dpY3NbaV09MTsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigmJjpsb2dpY19hbmQpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQlsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisJfQorCWlmKCFsb2dpY19hbmQpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAxLlxuIik7CisJfQorCisJbG9naWNfYW5kID0gMTsKKwlsb2dpY3NbTE9PUENPVU5ULzJdPTA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigmJjpsb2dpY19hbmQpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQlsb2dpY19hbmQgPSBsb2dpY19hbmQgJiYgbG9naWNzW2ldOworCX0KKwlpZihsb2dpY19hbmQpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAyLlxuIik7CisJfQorCisJZm9yKGk9MDtpPExPT1BDT1VOVDtpKyspCisJeworCQlsb2dpY3NbaV09MDsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbih8fDpsb2dpY19vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWxvZ2ljX29yID0gbG9naWNfb3IgfHwgbG9naWNzW2ldOworCX0KKwlpZihsb2dpY19vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMS5cbiIpOworCX0KKwlsb2dpY19vciA9IDA7CisJbG9naWNzW0xPT1BDT1VOVC8yXT0xOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofHw6bG9naWNfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQlsb2dpY19vciA9IGxvZ2ljX29yIHx8IGxvZ2ljc1tpXTsKKwl9CisJaWYoIWxvZ2ljX29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAyLlxuIik7CisJfQorCisKKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWxvZ2ljc1tpXT0xOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCY6Yml0X2FuZCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWJpdF9hbmQgPSAoYml0X2FuZCAmIGxvZ2ljc1tpXSk7CisJfQorCWlmKCFiaXRfYW5kKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDEuXG4iKTsKKwl9CisKKwliaXRfYW5kID0gMTsKKwlsb2dpY3NbTE9PUENPVU5ULzJdPTA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigmOmJpdF9hbmQpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQliaXRfYW5kID0gYml0X2FuZCAmIGxvZ2ljc1tpXTsKKwl9CisJaWYoYml0X2FuZCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEJJVCBBTkQgcGFydCAyLlxuIik7CisJfQorCisJZm9yKGk9MDtpPExPT1BDT1VOVDtpKyspCisJeworCQlsb2dpY3NbaV09MDsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbih8OmJpdF9vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKwl9CisJaWYoYml0X29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gQklUIE9SIHBhcnQgMVxuIik7CisJfQorCWJpdF9vciA9IDA7CisJbG9naWNzW0xPT1BDT1VOVC8yXT0xOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofDpiaXRfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisJfQorCWlmKCFiaXRfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBCSVQgT1IgcGFydCAyXG4iKTsKKwl9CisKKwlmb3IoaT0wO2k8TE9PUENPVU5UO2krKykKKwl7CisJCWxvZ2ljc1tpXT0wOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKF46ZXhjbHVzaXZfYml0X29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworCX0KKwlpZihleGNsdXNpdl9iaXRfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAxXG4iKTsKKwl9CisKKwlleGNsdXNpdl9iaXRfb3IgPSAwOworCWxvZ2ljc1tMT09QQ09VTlQvMl09MTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKF46ZXhjbHVzaXZfYml0X29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworCX0KKwlpZighZXhjbHVzaXZfYml0X29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMlxuIik7CisJfQorPC9vbXB0czpvcnBoYW4+CisJLypwcmludGYoIlxuUmVzdWx0OiVkXG4iLHJlc3VsdCk7Ki8KKwlyZXR1cm4gKHJlc3VsdD09MCk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2lmLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfaWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2Y0NWIxCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2lmLmMKQEAgLTAsMCArMSw0MCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBpZiBvcHRpb24gb2YgdGhlIHBhcmFsbGVsIGNvbnN0cnVjdC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIGlmPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3BhcmFsbGVsX2lmPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKzxvbXB0czpvcnBoYW46dmFycz4KKyAgaW50IGk7CisgIGludCBzdW07CisgIGludCBrbm93bl9zdW07CisgIGludCBteXN1bTsKKyAgaW50IGNvbnRyb2w9MTsKKzwvb21wdHM6b3JwaGFuOnZhcnM+CisgIHN1bSA9MDsKKyAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyIDsKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPmlmKGNvbnRyb2w9PTApPC9vbXB0czpjaGVjaz4KKyAgeworCTxvbXB0czpvcnBoYW4+CisgICAgbXlzdW0gPSAwOworCWZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspCisJeworCSAgbXlzdW0gPSBteXN1bSArIGk7CisJfSAKKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJeworCSAgc3VtID0gc3VtICsgbXlzdW07CisJfSAgIC8qIGVuZCBvZiBjcml0aWNhbCAqLworICA8L29tcHRzOm9ycGhhbj4KKyAgfSAgIC8qIGVuZCBvZiBwYXJhbGxlbCAqLworCisgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX251bV90aHJlYWRzLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfbnVtX3RocmVhZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTdmZWQyCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX251bV90aHJlYWRzLmMKQEAgLTAsMCArMSw0NiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXBfcGFyYWxsZWxfbnVtX3RocmVhZHMgZGlyZWN0aXZlIGJ5IGNvdW50aW5nIHRoZSB0aHJlYWRzIGluIGEgcGFyYWxsZWwgcmVnaW9uIHdoaWNoIHdhcyBzdGFydGVkIHdpdGggYW4gZXhwbGljaXRseSBzdGF0ZWQgbnVtYmVyIG9mIHRocmVhZHMuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJlbGxlbCBudW1fdGhyZWFkczwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBtYXN0ZXIsb21wIHBhcmFsbGVsIHJlZHVjdGlvbixvbXAgYXRvbWljPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3BhcmFsbGVsX251bV90aHJlYWRzPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IGZhaWxlZDsKKwlpbnQgdGhyZWFkczsKKwlpbnQgbnRocmVhZHM7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgIGludCBtYXhfdGhyZWFkcyA9IDA7CisKKyAgICBmYWlsZWQgPSAwOworCisgICAgLyogZmlyc3Qgd2UgY2hlY2sgaG93IG1hbnkgdGhyZWFkcyBhcmUgYXZhaWxhYmxlICovCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyNwcmFnbWEgb21wIG1hc3RlcgorCW1heF90aHJlYWRzID0gb21wX2dldF9udW1fdGhyZWFkcyAoKTsKKyAgICB9CisKKyAgICAvKiB3ZSBpbmNyZWFzZSB0aGUgbnVtYmVyIG9mIHRocmVhZHMgZnJvbSBvbmUgdG8gbWF4aW11bToqLworICAgIGZvciAodGhyZWFkcyA9IDE7IHRocmVhZHMgPD0gbWF4X3RocmVhZHM7IHRocmVhZHMrKykKKyAgICB7CisJbnRocmVhZHMgPSAwOworCisJPG9tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wIHBhcmFsbGVsIHJlZHVjdGlvbigrOmZhaWxlZCkgPG9tcHRzOmNoZWNrPm51bV90aHJlYWRzKHRocmVhZHMpPC9vbXB0czpjaGVjaz4KKwkgICAgeworCQlmYWlsZWQgPSBmYWlsZWQgKyAhKHRocmVhZHMgPT0gb21wX2dldF9udW1fdGhyZWFkcyAoKSk7CisjcHJhZ21hIG9tcCBhdG9taWMKKwkgICAgbnRocmVhZHMgKz0gMTsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorCWZhaWxlZCA9IGZhaWxlZCArICEobnRocmVhZHMgPT0gdGhyZWFkcyk7CisgICAgfQorICAgIHJldHVybiAoIWZhaWxlZCk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3ByaXZhdGUuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9wcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRjY2MwOQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9wcml2YXRlLmMKQEAgLTAsMCArMSw1MCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgcHJpdmF0ZSBkaXJlY3RpdmUuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGZvciBvbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisvL3N0YXRpYyBpbnQgc3VtMSA9IDc4OTsKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3BhcmFsbGVsX3ByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBzdW0sIG51bV90aHJlYWRzLHN1bTE7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQga25vd25fc3VtOworCisgICAgc3VtID0gMDsKKyAgICA8b21wdHM6Y3Jvc3NjaGVjaz4gc3VtMT0wOyA8L29tcHRzOmNyb3NzY2hlY2s+CisgICAgbnVtX3RocmVhZHMgPSAwOworCisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIDxvbXB0czpjaGVjaz5wcml2YXRlKHN1bTEpPC9vbXB0czpjaGVjaz4KKyAgICB7CisJPG9tcHRzOmNoZWNrPgorCXN1bTEgPSA3OworCTwvb21wdHM6Y2hlY2s+CisJLypwcmludGYoInN1bTE9JWRcbiIsc3VtMSk7Ki8KKwk8b21wdHM6b3JwaGFuPgorCWludCBpOworI3ByYWdtYSBvbXAgZm9yIAorCSAgICBmb3IgKGkgPSAxOyBpIDwgMTAwMDsgaSsrKQorCSAgICB7CisJCXN1bTEgPSBzdW0xICsgaTsKKwkgICAgfSAvKmVuZCBvZiBmb3IqLworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwl7CisJICAgIHN1bSA9IHN1bSArIHN1bTE7CisgICAgICAgICAgICBudW1fdGhyZWFkcysrOworCX0gLyplbmQgb2YgY3JpdGljYWwqLworCTwvb21wdHM6b3JwaGFuPgorICAgIH0gLyogZW5kIG9mIHBhcmFsbGVsKi8gICAgCisgICAga25vd25fc3VtID0gKDk5OSAqIDEwMDApIC8gMiArIDcgKiBudW1fdGhyZWFkczsKKyAgICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworCit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3JlZHVjdGlvbi5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3JlZHVjdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZjgzOTQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfcmVkdWN0aW9uLmMKQEAgLTAsMCArMSwyNzggQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIHJlZHVjdGlvbiBkaXJlY3RpdmUgd2l0aCBhbGwgaXRzIG9wdGlvbnMuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCByZWR1Y3Rpb248L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3BhcmFsbGVsX3JlZHVjdGlvbjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisJPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBzdW07CisJaW50IGtub3duX3N1bTsKKwlkb3VibGUgZHN1bTsKKwlkb3VibGUgZGtub3duX3N1bTsKKwlkb3VibGUgZHQ9MC41OwkJCQkvKiBiYXNlIG9mIGdlb21ldHJpYyByb3cgZm9yICsgYW5kIC0gdGVzdCovCisJZG91YmxlIHJvdW5kaW5nX2Vycm9yPSAxLkUtOTsKKyNkZWZpbmUgRE9VQkxFX0RJR0lUUyAyMAkJLyogZHReRE9VQkxFX0RJR0lUUyAqLworCWludCBkaWZmOworCWRvdWJsZSBkZGlmZjsKKwlpbnQgcHJvZHVjdDsKKwlpbnQga25vd25fcHJvZHVjdDsKKyNkZWZpbmUgTUFYX0ZBQ1RPUiAxMAorI2RlZmluZSBLTk9XTl9QUk9EVUNUIDM2Mjg4MDAJLyogMTAhICovCisJaW50IGxvZ2ljX2FuZDsKKwlpbnQgbG9naWNfb3I7CisJaW50IGJpdF9hbmQ7CisJaW50IGJpdF9vcjsKKwlpbnQgZXhjbHVzaXZfYml0X29yOworCWludCBsb2dpY3NbTE9PUENPVU5UXTsKKwlpbnQgaTsKKwlkb3VibGUgZHB0OworCWludCByZXN1bHQ7Cis8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgIHN1bSA9MDsKKyAgICBkc3VtPTA7CisgICAgcHJvZHVjdD0xOworCWxvZ2ljX2FuZD0xOworCWxvZ2ljX29yPTA7CisJYml0X2FuZD0xOworCWJpdF9vcj0wOworCWV4Y2x1c2l2X2JpdF9vcj0wOworICAgIHJlc3VsdD0wOworCWR0ID0gMS4vMy47CisJa25vd25fc3VtID0gKExPT1BDT1VOVCooTE9PUENPVU5UKzEpKS8yOworPG9tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigrOnN1bSk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IgKGk9MTtpPD1MT09QQ09VTlQ7aSsrKQorCXsKKwkJc3VtPXN1bStpOworCX0KKworCWlmKGtub3duX3N1bSE9c3VtKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gc3VtIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAlZFxuIixzdW0sa25vd25fc3VtKTsgCisJfQorCisJZGlmZiA9IChMT09QQ09VTlQqKExPT1BDT1VOVCsxKSkvMjsKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigtOmRpZmYpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yIChpPTE7aTw9TE9PUENPVU5UOysraSkKKwl7CisJCWRpZmY9ZGlmZi1pOworCX0KKworCWlmKGRpZmYgIT0gMCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIGRpZmZlcmVuY2Ugd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mIDAuXG4iLGRpZmYpOworCX0KKworCS8qIFRlc3RzIGZvciBkb3VibGVzICovCisJZHN1bT0wOworCWRwdD0xOworCWZvciAoaT0wO2k8RE9VQkxFX0RJR0lUUzsrK2kpCisJeworCQlkcHQqPWR0OworCX0KKwlka25vd25fc3VtID0gKDEtZHB0KS8oMS1kdCk7CisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKzpkc3VtKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvciAoaT0wO2k8RE9VQkxFX0RJR0lUUzsrK2kpCisJeworCQlkc3VtICs9IHBvdyhkdCxpKTsKKwl9CisKKwlpZiggZmFicyhkc3VtLWRrbm93bl9zdW0pID4gcm91bmRpbmdfZXJyb3IgKQorCXsKKwkJcmVzdWx0Kys7IAorCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIHN1bSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJWYgaW5zdGVhZCBvZiAlZiAoRGlmZmVyZW5jZTogJUUpXG4iLGRzdW0sZGtub3duX3N1bSwgZHN1bS1ka25vd25fc3VtKTsKKwl9CisKKwlkcHQ9MTsKKworCWZvciAoaT0wO2k8RE9VQkxFX0RJR0lUUzsrK2kpCisJeworCQlkcHQqPWR0OworCX0KKwlmcHJpbnRmKGxvZ0ZpbGUsIlxuIik7CisJZGRpZmYgPSAoMS1kcHQpLygxLWR0KTsKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigtOmRkaWZmKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvciAoaT0wO2k8RE9VQkxFX0RJR0lUUzsrK2kpCisJeworCQlkZGlmZiAtPSBwb3coZHQsaSk7CisJfQorCWlmKCBmYWJzKGRkaWZmKSA+IHJvdW5kaW5nX2Vycm9yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gRGlmZmVyZW5jZSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJUUgaW5zdGVhZCBvZiAwLjBcbiIsZGRpZmYpOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCo6cHJvZHVjdCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0xO2k8PU1BWF9GQUNUT1I7aSsrKQorCXsKKwkJcHJvZHVjdCAqPSBpOworCX0KKworCWtub3duX3Byb2R1Y3QgPSBLTk9XTl9QUk9EVUNUOworCWlmKGtub3duX3Byb2R1Y3QgIT0gcHJvZHVjdCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIFByb2R1Y3Qgd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mICVkXG5cbiIscHJvZHVjdCxrbm93bl9wcm9kdWN0KTsKKwl9CisKKwlmb3IoaT0wO2k8TE9PUENPVU5UO2krKykKKwl7CisJCWxvZ2ljc1tpXT0xOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCYmOmxvZ2ljX2FuZCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKwl9CisJaWYoIWxvZ2ljX2FuZCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDEuXG4iKTsKKwl9CisKKwlsb2dpY19hbmQgPSAxOworCWxvZ2ljc1tMT09QQ09VTlQvMl09MDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCYmOmxvZ2ljX2FuZCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV07CisJfQorCWlmKGxvZ2ljX2FuZCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDIuXG4iKTsKKwl9CisKKwlmb3IoaT0wO2k8TE9PUENPVU5UO2krKykKKwl7CisJCWxvZ2ljc1tpXT0wOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHx8OmxvZ2ljX29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJbG9naWNfb3IgPSBsb2dpY19vciB8fCBsb2dpY3NbaV07CisJfQorCWlmKGxvZ2ljX29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAxLlxuIik7CisJfQorCWxvZ2ljX29yID0gMDsKKwlsb2dpY3NbTE9PUENPVU5ULzJdPTE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbih8fDpsb2dpY19vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWxvZ2ljX29yID0gbG9naWNfb3IgfHwgbG9naWNzW2ldOworCX0KKwlpZighbG9naWNfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDIuXG4iKTsKKwl9CisKKworCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJbG9naWNzW2ldPTE7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJjpiaXRfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJYml0X2FuZCA9IChiaXRfYW5kICYgbG9naWNzW2ldKTsKKwl9CisJaWYoIWJpdF9hbmQpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMS5cbiIpOworCX0KKworCWJpdF9hbmQgPSAxOworCWxvZ2ljc1tMT09QQ09VTlQvMl09MDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCY6Yml0X2FuZCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWJpdF9hbmQgPSBiaXRfYW5kICYgbG9naWNzW2ldOworCX0KKwlpZihiaXRfYW5kKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDIuXG4iKTsKKwl9CisKKwlmb3IoaT0wO2k8TE9PUENPVU5UO2krKykKKwl7CisJCWxvZ2ljc1tpXT0wOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHw6Yml0X29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworCX0KKwlpZihiaXRfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBCSVQgT1IgcGFydCAxXG4iKTsKKwl9CisJYml0X29yID0gMDsKKwlsb2dpY3NbTE9PUENPVU5ULzJdPTE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbih8OmJpdF9vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKwl9CisJaWYoIWJpdF9vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEJJVCBPUiBwYXJ0IDJcbiIpOworCX0KKworCWZvcihpPTA7aTxMT09QQ09VTlQ7aSsrKQorCXsKKwkJbG9naWNzW2ldPTA7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJfQorCWlmKGV4Y2x1c2l2X2JpdF9vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEVYQ0xVU0lWIEJJVCBPUiBwYXJ0IDFcbiIpOworCX0KKworCWV4Y2x1c2l2X2JpdF9vciA9IDA7CisJbG9naWNzW0xPT1BDT1VOVC8yXT0xOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJfQorCWlmKCFleGNsdXNpdl9iaXRfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAyXG4iKTsKKwl9CisgICAgPC9vbXB0czpvcnBoYW4+CisJLypwcmludGYoIlxuUmVzdWx0OiVkXG4iLHJlc3VsdCk7Ki8KKwlyZXR1cm4gKHJlc3VsdD09MCk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3NlY3Rpb25zX2ZpcnN0cHJpdmF0ZS5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3NlY3Rpb25zX2ZpcnN0cHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MzM4MzkKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfZmlyc3Rwcml2YXRlLmMKQEAgLTAsMCArMSw0OSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgZmlyc3Rwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIHNlY3Rpb25zIGZpcnN0cHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9wYXJhbGxlbF9zZWN0aW9uc19maXJzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworICA8b21wdHM6b3JwaGFuOnZhcnM+CisgIGludCBzdW07CisgIGludCBzdW0wOworICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICBpbnQga25vd25fc3VtOworICBzdW0gPTc7CisgIHN1bTA9MTE7CisKKzxvbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+Zmlyc3Rwcml2YXRlKHN1bTApPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz5wcml2YXRlKHN1bTApPC9vbXB0czpjcm9zc2NoZWNrPgorICB7CisjcHJhZ21hIG9tcCBzZWN0aW9uIAorICAgIHsKKyNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICB7CisJc3VtPSBzdW0rc3VtMDsKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgLyplbmQgb2YgY3JpdGljYWwgKi8KKyAgICB9ICAgIAorI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICB7CisJc3VtPSBzdW0rc3VtMDsKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgLyplbmQgb2YgY3JpdGljYWwgKi8KKyAgICB9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgIHsKKwlzdW09IHN1bStzdW0wOworICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAvKmVuZCBvZiBjcml0aWNhbCAqLworICAgIH0gICAgICAgICAgICAgICAKKyAgICB9ICAgICAgLyplbmQgb2YgcGFyYWxsZWwgc2VjdGlvbnMqLworPC9vbXB0czpvcnBoYW4+Citrbm93bl9zdW09MTEqMys3OworcmV0dXJuIChrbm93bl9zdW09PXN1bSk7IAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCBvZiBjaGVja19zZWN0aW9uX2ZpcnN0cHJpdmF0ZSovCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3NlY3Rpb25zX2xhc3Rwcml2YXRlLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfbGFzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWFlNWYwCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3NlY3Rpb25zX2xhc3Rwcml2YXRlLmMKQEAgLTAsMCArMSw3MCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgbGFzdHByaXZhdGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgc2VjdGlvbnMgbGFzdHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWwsb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfc2VjdGlvbnNfbGFzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworICA8b21wdHM6b3JwaGFuOnZhcnM+CisgIGludCBzdW07CisgIGludCBzdW0wOworICBpbnQgaTsKKyAgaW50IGkwOworICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICBpbnQga25vd25fc3VtOworICBzdW0gPTA7CisgIHN1bTAgPSAwOworICBpMCA9IC0xOworICAKKyAgPG9tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSxzdW0wKSA8b21wdHM6Y2hlY2s+bGFzdHByaXZhdGUoaTApPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz5wcml2YXRlKGkwKTwvb21wdHM6Y3Jvc3NjaGVjaz4KKyAgICB7CisjcHJhZ21hIG9tcCBzZWN0aW9uICAKKyAgICAgIHsKKwlzdW0wPTA7CisJZm9yIChpPTE7aTw0MDA7aSsrKQorCSAgeworCSAgICBzdW0wPXN1bTAraTsKKwkgICAgaTA9aTsKKwkgIH0KKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJeworCSAgc3VtPSBzdW0rc3VtMDsKKwl9ICAgICAgICAgICAgICAgICAgICAgICAgIC8qZW5kIG9mIGNyaXRpY2FsKi8KKyAgICAgIH0vKiBlbmQgb2Ygc2VjdGlvbiAqLworI3ByYWdtYSBvbXAgc2VjdGlvbiAKKyAgICAgIHsKKwlzdW0wPTA7CisJZm9yKGk9NDAwO2k8NzAwO2krKykKKwkgIHsKKwkgICAgc3VtMD1zdW0wK2k7ICAgICAgICAgICAgICAgICAgICAgICAvKmVuZCBvZiBmb3IqLworCSAgICBpMD1pOworCSAgfQorI3ByYWdtYSBvbXAgY3JpdGljYWwKKwl7CisJICBzdW09IHN1bStzdW0wOworCX0gICAgICAgICAgICAgICAgICAgICAgICAgLyplbmQgb2YgY3JpdGljYWwqLworICAgICAgfQorI3ByYWdtYSBvbXAgc2VjdGlvbiAKKyAgICAgIHsKKwlzdW0wPTA7CisJZm9yKGk9NzAwO2k8MTAwMDtpKyspCisJICB7CisJICAgIHN1bTA9c3VtMCtpOworICAgICAgaTA9aTsKKwkgIH0KKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJeworCSAgc3VtPSBzdW0rc3VtMDsKKwl9ICAgICAgICAgICAgICAgICAgICAgICAgIC8qZW5kIG9mIGNyaXRpY2FsKi8KKyAgICAgIH0KKyAgICB9LyogZW5kIG9mIHBhcmFsbGVsIHNlY3Rpb25zKi8KKyAgPC9vbXB0czpvcnBoYW4+IAorICBrbm93bl9zdW09KDk5OSoxMDAwKS8yOworICByZXR1cm4gKChrbm93bl9zdW09PXN1bSkgJiYgKGkwPT05OTkpICk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3NlY3Rpb25zX3ByaXZhdGUuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9zZWN0aW9uc19wcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVmZTQxNAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9zZWN0aW9uc19wcml2YXRlLmMKQEAgLTAsMCArMSw2NSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZSBkaXJlY3RpdmUuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3BhcmFsbGVsX3NlY3Rpb25zX3ByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworICA8b21wdHM6b3JwaGFuOnZhcnM+CisgIGludCBzdW07CisgIGludCBzdW0wOworICBpbnQgaTsKKyAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgaW50IGtub3duX3N1bTsKKyAgc3VtID0gNzsKKyAgc3VtMD0wOworCis8b21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZSg8b21wdHM6Y2hlY2s+c3VtMCw8L29tcHRzOmNoZWNrPiBpKQorICB7CisjcHJhZ21hIG9tcCBzZWN0aW9uIAorICAgIHsKKyAgICAgIDxvbXB0czpjaGVjaz4KKyAgICAgIHN1bTA9MDsKKyAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICBmb3IgKGk9MTtpPDQwMDtpKyspCisJc3VtMD1zdW0wK2k7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgeworCXN1bT0gc3VtK3N1bTA7CisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgIC8qZW5kIG9mIGNyaXRpY2FsICovCisgICAgfSAgICAKKyNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICA8b21wdHM6Y2hlY2s+CisgICAgICBzdW0wPTA7CisgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgZm9yKGk9NDAwO2k8NzAwO2krKykKKwlzdW0wPXN1bTAraTsKKyNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICB7CisJc3VtPSBzdW0rc3VtMDsKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgLyplbmQgb2YgY3JpdGljYWwgKi8KKyAgICB9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgPG9tcHRzOmNoZWNrPgorICAgICAgc3VtMD0wOworICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgIGZvcihpPTcwMDtpPDEwMDA7aSsrKQorCXN1bTA9c3VtMCtpOworI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgIHsKKwlzdW09IHN1bStzdW0wOworICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAvKmVuZCBvZiBjcml0aWNhbCAqLworICAgIH0gICAgICAgICAgICAgICAKKyAgfSAgICAgICAgLyplbmQgb2YgcGFyYWxsZWwgc2VjdGlvbnMqLworPC9vbXB0czpvcnBoYW4+Citrbm93bl9zdW09KDk5OSoxMDAwKS8yKzc7CityZXR1cm4gKGtub3duX3N1bT09c3VtKTsgCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIG9mIGNoZWNrX3NlY3Rpb25fcHJpdmF0ZSovCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3NlY3Rpb25zX3JlZHVjdGlvbi5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3NlY3Rpb25zX3JlZHVjdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZGVhNmEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfcmVkdWN0aW9uLmMKQEAgLTAsMCArMSw1NjggQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHJlZHVjdGlvbiBkaXJlY3RpdmUgd2l0aCBhbGwgaXRzIG9wdGlvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIHNlY3Rpb25zIHJlZHVjdGlvbjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfc2VjdGlvbnNfcmVkdWN0aW9uPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKwk8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IHN1bTsKKwlpbnQga25vd25fc3VtOwkKKwlkb3VibGUgZHB0OworICAgIGRvdWJsZSBkc3VtOworCWRvdWJsZSBka25vd25fc3VtOworCWRvdWJsZSBkdD0wLjU7CQkJCS8qIGJhc2Ugb2YgZ2VvbWV0cmljIHJvdyBmb3IgKyBhbmQgLSB0ZXN0Ki8KKwlkb3VibGUgcm91bmRpbmdfZXJyb3I9IDEuRS01OworCWludCBkaWZmOworCWRvdWJsZSBkZGlmZjsKKwlpbnQgcHJvZHVjdDsKKwlpbnQga25vd25fcHJvZHVjdDsKKwlpbnQgbG9naWNfYW5kOworCWludCBiaXRfYW5kOworCWludCBsb2dpY19vcjsKKwlpbnQgYml0X29yOworCWludCBleGNsdXNpdl9iaXRfb3I7CisJaW50IGxvZ2ljc1sxMDAwXTsKKwlpbnQgaTsKKwlpbnQgcmVzdWx0OworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgCisgICAgc3VtID0gNzsKKyAgICBkc3VtPTA7CisgICAgcHJvZHVjdCA9MTsKKyAgICBkcHQgPSAxOworCWxvZ2ljX2FuZD0xOworCWJpdF9hbmQ9MTsKKwlsb2dpY19vcj0wOworCWJpdF9vcj0wOworCWV4Y2x1c2l2X2JpdF9vcj0wOworICAgIHJlc3VsdCA9MDsKKwkvKiAgaW50IG15X2lzbGFyZ2VyOyovCisJLyppbnQgaXNfbGFyZ2VyPTE7Ki8KKwlrbm93bl9zdW0gPSAoOTk5KjEwMDApLzIrNzsKKworICAgIDxvbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKzpzdW0pPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9MTtpPDMwMDtpKyspCisJCQl7CisJCQkJc3VtPXN1bStpOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT0zMDA7aTw3MDA7aSsrKQorCQkJeworCQkJCXN1bT1zdW0raTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9NzAwO2k8MTAwMDtpKyspCisJCQl7CisJCQkJc3VtPXN1bStpOworCQkJfQorCQl9CisJfQorCisJaWYoa25vd25fc3VtIT1zdW0pCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBzdW0gd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mICVkLlxuIixzdW0sIGtub3duX3N1bSk7CisJfQorCisJZGlmZiA9ICg5OTkqMTAwMCkvMjsKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigtOmRpZmYpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9MTtpPDMwMDtpKyspCisJCQl7CisJCQkJZGlmZj1kaWZmLWk7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTMwMDtpPDcwMDtpKyspCisJCQl7CisJCQkJZGlmZj1kaWZmLWk7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTcwMDtpPDEwMDA7aSsrKQorCQkJeworCQkJCWRpZmY9ZGlmZi1pOworCQkJfQorCQl9CisJfQorCisKKwlpZihkaWZmICE9IDApCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBEaWZmZXJlbmNlIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAwLlxuIixkaWZmKTsKKwl9CisJZm9yIChpPTA7aTwyMDsrK2kpCisJeworCQlkcHQqPWR0OworCX0KKwlka25vd25fc3VtID0gKDEtZHB0KS8oMS1kdCk7CisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKzpkc3VtKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTA7aTw2OysraSkKKwkJCXsKKwkJCQlkc3VtICs9IHBvdyhkdCxpKTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9NjtpPDEyOysraSkKKwkJCXsKKwkJCQlkc3VtICs9IHBvdyhkdCxpKTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9MTI7aTwyMDsrK2kpCisJCQl7CisJCQkJZHN1bSArPSBwb3coZHQsaSk7CisJCQl9CisJCX0KKwl9CisKKworCWlmKCBmYWJzKGRzdW0tZGtub3duX3N1bSkgPiByb3VuZGluZ19lcnJvciApCisJeworCQlyZXN1bHQrKzsgCisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gc3VtIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlZiBpbnN0ZWFkIG9mICVmIChEaWZmZXJlbmNlOiAlRSlcbiIsZHN1bSxka25vd25fc3VtLCBkc3VtLWRrbm93bl9zdW0pOworCX0KKworCWRwdD0xOworCisJZm9yIChpPTA7aTwyMDsrK2kpCisJeworCQlkcHQqPWR0OworCX0KKwlmcHJpbnRmKGxvZ0ZpbGUsIlxuIik7CisJZGRpZmYgPSAoMS1kcHQpLygxLWR0KTsKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigtOmRkaWZmKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTA7aTw2OysraSkKKwkJCXsKKwkJCQlkZGlmZiAtPSBwb3coZHQsaSk7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTY7aTwxMjsrK2kpCisJCQl7CisJCQkJZGRpZmYgLT0gcG93KGR0LGkpOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT0xMjtpPDIwOysraSkKKwkJCXsKKwkJCQlkZGlmZiAtPSBwb3coZHQsaSk7CisJCQl9CisJCX0KKwl9CisKKwlpZiggZmFicyhkZGlmZikgPiByb3VuZGluZ19lcnJvcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIERpZmZlcmVuY2Ugd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICVFIGluc3RlYWQgb2YgMC4wXG4iLGRkaWZmKTsKKwl9CisKKwlrbm93bl9wcm9kdWN0ID0gMzYyODgwMDsKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigqOnByb2R1Y3QpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CQorCQkJZm9yKGk9MTtpPDM7aSsrKQorCQkJeworCQkJCXByb2R1Y3QgKj0gaTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IoaT0zO2k8NztpKyspCisJCQl7CisJCQkJcHJvZHVjdCAqPSBpOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvcihpPTc7aTwxMTtpKyspCisJCQl7CisJCQkJcHJvZHVjdCAqPSBpOworCQkJfQorCQl9CisJfQorCisKKwlpZihrbm93bl9wcm9kdWN0ICE9IHByb2R1Y3QpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBQcm9kdWN0IHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAlZFxuIixwcm9kdWN0LGtub3duX3Byb2R1Y3QpOworCX0KKworCWZvcihpPTA7aTwxMDAwO2krKykKKwl7CisJCWxvZ2ljc1tpXT0xOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCYmOmxvZ2ljX2FuZCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT0xO2k8MzAwO2krKykKKwkJCXsKKwkJCQlsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTMwMDtpPDcwMDtpKyspCisJCQl7CisJCQkJbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT03MDA7aTwxMDAwO2krKykKKwkJCXsKKwkJCQlsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisJCQl9CisJCX0KKwl9CisKKwlpZighbG9naWNfYW5kKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gbG9naWMgQU5EIHBhcnQgMVxuIik7CisJfQorCisJbG9naWNfYW5kID0gMTsKKwlsb2dpY3NbNTAxXSA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigmJjpsb2dpY19hbmQpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9MTtpPDMwMDtpKyspCisJCQl7CisJCQkJbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT0zMDA7aTw3MDA7aSsrKQorCQkJeworCQkJCWxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9NzAwO2k8MTAwMDtpKyspCisJCQl7CisJCQkJbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworCQkJfQorCQl9CisJfQorCisJaWYobG9naWNfYW5kKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gbG9naWMgQU5EIHBhcnQgMiIpOworCX0KKworCWZvcihpPTA7aTwxMDAwO2krKykKKwl7CisJCWxvZ2ljc1tpXT0wOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHx8OmxvZ2ljX29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTE7aTwzMDA7aSsrKQorCQkJeworCQkJCWxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTMwMDtpPDcwMDtpKyspCisJCQl7CisJCQkJbG9naWNfb3IgPSAobG9naWNfb3IgfHwgbG9naWNzW2ldKTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9NzAwO2k8MTAwMDtpKyspCisJCQl7CisJCQkJbG9naWNfb3IgPSAobG9naWNfb3IgfHwgbG9naWNzW2ldKTsKKwkJCX0KKwkJfQorCX0KKworCWlmKGxvZ2ljX29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAxXG4iKTsKKwl9CisKKwlsb2dpY19vciA9IDA7CisJbG9naWNzWzUwMV09MTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHx8OmxvZ2ljX29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTE7aTwzMDA7aSsrKQorCQkJeworCQkJCWxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTMwMDtpPDcwMDtpKyspCisJCQl7CisJCQkJbG9naWNfb3IgPSAobG9naWNfb3IgfHwgbG9naWNzW2ldKTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9NzAwO2k8MTAwMDtpKyspCisJCQl7CisJCQkJbG9naWNfb3IgPSAobG9naWNfb3IgfHwgbG9naWNzW2ldKTsKKwkJCX0KKwkJfQorCX0KKworCWlmKCFsb2dpY19vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMlxuIik7CisJfQorCisJZm9yKGk9MDtpPDEwMDA7KytpKQorCXsKKwkJbG9naWNzW2ldPTE7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJjpiaXRfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJewkKKwkJCWZvcihpPTA7aTwzMDA7KytpKQorCQkJeworCQkJCWJpdF9hbmQgPSAoYml0X2FuZCAmIGxvZ2ljc1tpXSk7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJewkKKwkJCWZvcihpPTMwMDtpPDcwMDsrK2kpCisJCQl7CisJCQkJYml0X2FuZCA9IChiaXRfYW5kICYgbG9naWNzW2ldKTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CQorCQkJZm9yKGk9NzAwO2k8MTAwMDsrK2kpCisJCQl7CisJCQkJYml0X2FuZCA9IChiaXRfYW5kICYgbG9naWNzW2ldKTsKKwkJCX0KKwkJfQorCX0KKwlpZighYml0X2FuZCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEJJVCBBTkQgcGFydCAxXG4iKTsKKwl9CisKKwliaXRfYW5kID0gMTsKKwlsb2dpY3NbNTAxXT0wOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJjpiaXRfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yKGk9MDtpPDMwMDsrK2kpCisJCQl7CisJCQkJYml0X2FuZCA9IGJpdF9hbmQgJiBsb2dpY3NbaV07CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yKGk9MzAwO2k8NzAwOysraSkKKwkJCXsKKwkJCQliaXRfYW5kID0gYml0X2FuZCAmIGxvZ2ljc1tpXTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IoaT03MDA7aTwxMDAwOysraSkKKwkJCXsKKwkJCQliaXRfYW5kID0gYml0X2FuZCAmIGxvZ2ljc1tpXTsKKwkJCX0KKwkJfQorCX0KKwlpZihiaXRfYW5kKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDIiKTsKKwl9CisKKwlmb3IoaT0wO2k8MTAwMDtpKyspCisJeworCQlsb2dpY3NbaV09MDsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbih8OmJpdF9vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvcihpPTA7aTwzMDA7KytpKQorCQkJeworCQkJCWJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IoaT0zMDA7aTw3MDA7KytpKQorCQkJeworCQkJCWJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IoaT03MDA7aTwxMDAwOysraSkKKwkJCXsKKwkJCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisJCQl9CisJCX0KKwl9CisJaWYoYml0X29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gQklUIE9SIHBhcnQgMVxuIik7CisJfQorCWJpdF9vciA9IDA7CisJbG9naWNzWzUwMV09MTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHw6Yml0X29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yKGk9MDtpPDMwMDsrK2kpCisJCQl7CisJCQkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvcihpPTMwMDtpPDcwMDsrK2kpCisJCQl7CisJCQkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvcihpPTcwMDtpPDEwMDA7KytpKQorCQkJeworCQkJCWJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKwkJCX0KKwkJfQorCX0KKwlpZighYml0X29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gQklUIE9SIHBhcnQgMlxuIik7CisJfQorCisJZm9yKGk9MDtpPDEwMDA7aSsrKQorCXsKKwkJbG9naWNzW2ldPTA7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CQorCQkJZm9yKGk9MDtpPDMwMDsrK2kpCisJCQl7CisJCQkJZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsJCisJCQlmb3IoaT0zMDA7aTw3MDA7KytpKQorCQkJeworCQkJCWV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CQorCQkJZm9yKGk9NzAwO2k8MTAwMDsrK2kpCisJCQl7CisJCQkJZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworCQkJfQorCQl9CisJfQorCWlmKGV4Y2x1c2l2X2JpdF9vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEVYQ0xVU0lWIEJJVCBPUiBwYXJ0IDFcbiIpOworCX0KKworCWV4Y2x1c2l2X2JpdF9vciA9IDA7CisJbG9naWNzWzUwMV09MTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKF46ZXhjbHVzaXZfYml0X29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yKGk9MDtpPDMwMDsrK2kpCisJCQl7CisJCQkJZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvcihpPTMwMDtpPDcwMDsrK2kpCisJCQl7CisJCQkJZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvcihpPTcwMDtpPDEwMDA7KytpKQorCQkJeworCQkJCWV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKwkJCX0KKwkJfQorCX0KKwlpZighZXhjbHVzaXZfYml0X29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMlxuIik7CisJfQorPC9vbXB0czpvcnBoYW4+CisJLypwcmludGYoIlxuUmVzdWx0OiVkXG4iLHJlc3VsdCk7Ki8KKwlyZXR1cm4gKHJlc3VsdD09MCk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3NoYXJlZC5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3NoYXJlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMjhlMzgKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfc2hhcmVkLmMKQEAgLTAsMCArMSw0MyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBzaGFyZWQgb3B0aW9uIG9mIHRoZSBwYXJhbGxlbCBjb25zdHJ1Y3QuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBzaGFyZWQ8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfc2hhcmVkPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKyAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICBpbnQgaTsKKyAgaW50IHN1bTsKKyAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgc3VtID0gMDsKKyAgaW50IGtub3duX3N1bTsKKyAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyIDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+c2hhcmVkKHN1bSk8L29tcHRzOmNoZWNrPiA8b21wdHM6Y3Jvc3NjaGVjaz5maXJzdHByaXZhdGUoc3VtKTwvb21wdHM6Y3Jvc3NjaGVjaz4KKyAgeworICAgIDxvbXB0czpvcnBoYW4+CisgICAgaW50IG15c3VtID0gMDsKKyNwcmFnbWEgb21wIGZvcgorCWZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspCisJeworCSAgbXlzdW0gPSBteXN1bSArIGk7CisJfSAKKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJeworCSAgc3VtID0gc3VtICsgbXlzdW07CisJfSAgIC8qIGVuZCBvZiBjcml0aWNhbCAqLworPC9vbXB0czpvcnBoYW4+CisKKyAgfSAgIC8qIGVuZCBvZiBwYXJhbGxlbCAqLworICBpZiAoa25vd25fc3VtICE9IHN1bSkgeworICAJZnByaW50Zihsb2dGaWxlLCAiS05PV05fU1VNID0gJWQ7IFNVTSA9ICVkXG4iLCBrbm93bl9zdW0sIHN1bSk7CisgIH0KKyAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfc2VjdGlvbl9maXJzdHByaXZhdGUuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9zZWN0aW9uX2ZpcnN0cHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMzVkMTAKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfc2VjdGlvbl9maXJzdHByaXZhdGUuYwpAQCAtMCwwICsxLDUyIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBzZWN0aW9uIGZpcnN0cHJpdmF0ZSBkaXJlY3RpdmUgYnkgYWRkaW5nIGEgdmFyaWFibGUgd2hpY2ggaXMgZGVmaW5lZCBiZWZvcmUgdGhlIHBhcmFsbGVsIHJlZ2lvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGZpcnN0cHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9zZWN0aW9uX2ZpcnN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisJPG9tcHRzOm9ycGhhbjp2YXJzPgorCSAgICBpbnQgc3VtOworCSAgICBpbnQgc3VtMDsKKwk8L29tcHRzOm9ycGhhbjp2YXJzPgorCWludCBrbm93bl9zdW07CisKKwlzdW0wID0gMTE7CisJc3VtID0gNzsKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisJeworPG9tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wICBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+Zmlyc3Rwcml2YXRlKHN1bTApPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz5wcml2YXRlKHN1bTApPC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uIAorCQkJeworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkJCQl7CisJCQkJCXN1bSA9IHN1bSArIHN1bTA7CisJCQkJfSAvKmVuZCBvZiBjcml0aWNhbCAqLworCQkJfSAgICAKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJCQkJeworCQkJCQlzdW0gPSBzdW0gKyBzdW0wOworCQkJCX0gLyplbmQgb2YgY3JpdGljYWwgKi8KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJCQkJeworCQkJCQlzdW0gPSBzdW0gKyBzdW0wOworCQkJCX0gLyplbmQgb2YgY3JpdGljYWwgKi8KKwkJCX0gICAgICAgICAgICAgICAKKwkJfSAvKmVuZCBvZiBzZWN0aW9ucyovCis8L29tcHRzOm9ycGhhbj4KKwl9IC8qIGVuZCBvZiBwYXJhbGxlbCAqLworCWtub3duX3N1bSA9IDExICogMyArIDc7CisJcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsgCit9IC8qIGVuZCBvZiBjaGVja19zZWN0aW9uX2ZpcnN0cHJpdmF0ZSovCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3NlY3Rpb25fbGFzdHByaXZhdGUuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9zZWN0aW9uX2xhc3Rwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZhZTBkZgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9zZWN0aW9uX2xhc3Rwcml2YXRlLmMKQEAgLTAsMCArMSw3MyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgc2VjdGlvbiBsYXN0cHJpdmF0ZSBkaXJlY3RpdmUuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBzZWN0aW9uIGxhc3Rwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3NlY3Rpb25fbGFzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgaTAgPSAtMTsKKwlpbnQgc3VtID0gMDsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGludCBzdW0wID0gMDsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBrbm93bl9zdW07CisKKyAgICBpMCA9IC0xOworICAgIHN1bSA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworCTxvbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+bGFzdHByaXZhdGUoaTApPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz5wcml2YXRlKGkwKTwvb21wdHM6Y3Jvc3NjaGVjaz4gcHJpdmF0ZShpLHN1bTApCisJeworI3ByYWdtYSBvbXAgc2VjdGlvbiAgCisJICAgIHsKKwkJc3VtMCA9IDA7CisJCWZvciAoaSA9IDE7IGkgPCA0MDA7IGkrKykKKwkJeworCQkgICAgc3VtMCA9IHN1bTAgKyBpOworCQkgICAgaTAgPSBpOworCQl9CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCQl7CisJCSAgICBzdW0gPSBzdW0gKyBzdW0wOworCQl9IC8qZW5kIG9mIGNyaXRpY2FsKi8KKwkgICAgfSAvKiBlbmQgb2Ygc2VjdGlvbiAqLworI3ByYWdtYSBvbXAgc2VjdGlvbiAKKwkgICAgeworCQlzdW0wID0gMDsKKwkJZm9yKGkgPSA0MDA7IGkgPCA3MDA7IGkrKykKKwkJeworCQkgICAgc3VtMCA9IHN1bTAgKyBpOworCQkgICAgaTAgPSBpOworCQl9CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCQl7CisJCSAgICBzdW0gPSBzdW0gKyBzdW0wOworCQl9IC8qZW5kIG9mIGNyaXRpY2FsKi8KKwkgICAgfQorI3ByYWdtYSBvbXAgc2VjdGlvbiAKKwkgICAgeworCQlzdW0wID0gMDsKKwkJZm9yKGkgPSA3MDA7IGkgPCAxMDAwOyBpKyspCisJCXsKKwkJICAgIHN1bTAgPSBzdW0wICsgaTsKKwkJICAgIGkwID0gaTsKKwkJfQorI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkJeworCQkgICAgc3VtID0gc3VtICsgc3VtMDsKKwkJfSAvKmVuZCBvZiBjcml0aWNhbCovCisJICAgIH0KKwl9IC8qIGVuZCBvZiBzZWN0aW9ucyovCisJPC9vbXB0czpvcnBoYW4+CisgICAgfSAvKiBlbmQgb2YgcGFyYWxsZWwqLyAgICAKKyAgICBrbm93bl9zdW0gPSAoOTk5ICogMTAwMCkgLyAyOworICAgIHJldHVybiAoKGtub3duX3N1bSA9PSBzdW0pICYmIChpMCA9PSA5OTkpICk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3NlY3Rpb25fcHJpdmF0ZS5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3NlY3Rpb25fcHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5OWEyZjgKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfc2VjdGlvbl9wcml2YXRlLmMKQEAgLTAsMCArMSw2OSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgc2VjdGlvbiBwcml2YXRlIGRpcmVjdGl2ZSBieSB1cGNvdW50aW5nIGEgdmFyaWFibGUgaW4gYSB0byBzZXZlcmFsIHNlY3Rpb25zIHNwbGl0dGVkIGxvb3AuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBzZWN0aW9uIHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfc2VjdGlvbl9wcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IHN1bTsKKwlpbnQgc3VtMDsKKyAgICBpbnQgaTsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBrbm93bl9zdW07CisKKyAgICBzdW0gPSA3OworICAgIHN1bTAgPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5wcml2YXRlKHN1bTAsaSk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPnByaXZhdGUoaSk8L29tcHRzOmNyb3NzY2hlY2s+CisJeworI3ByYWdtYSBvbXAgc2VjdGlvbiAKKwkgICAgeworCQk8b21wdHM6Y2hlY2s+CisgICAgICAgIHN1bTAgPSAwOworICAgICAgICA8L29tcHRzOmNoZWNrPgorCQlmb3IgKGkgPSAxOyBpIDwgNDAwOyBpKyspCisJCSAgICBzdW0wID0gc3VtMCArIGk7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCQl7CisJCSAgICBzdW0gPSBzdW0gKyBzdW0wOworCQl9IC8qZW5kIG9mIGNyaXRpY2FsICovCisJICAgIH0gICAgCisjcHJhZ21hIG9tcCBzZWN0aW9uCisJICAgIHsKKyAgICAgICAgICA8b21wdHM6Y2hlY2s+CisJCXN1bTAgPSAwOworICAgICAgICAgIDwvb21wdHM6Y2hlY2s+CisJCWZvciAoaSA9IDQwMDsgaSA8IDcwMDsgaSsrKQorCQkgICAgc3VtMCA9IHN1bTAgKyBpOworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkJeworCQkgICAgc3VtID0gc3VtICsgc3VtMDsKKwkJfSAvKmVuZCBvZiBjcml0aWNhbCAqLworCSAgICB9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJICAgIHsKKyAgICAgICAgICA8b21wdHM6Y2hlY2s+CisJCXN1bTAgPSAwOworICAgICAgICAgIDwvb21wdHM6Y2hlY2s+CisJCWZvciAoaSA9IDcwMDsgaSA8IDEwMDA7IGkrKykKKwkJICAgIHN1bTAgPSBzdW0wICsgaTsKKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJCXsKKwkJICAgIHN1bSA9IHN1bSArIHN1bTA7CisJCX0gLyplbmQgb2YgY3JpdGljYWwgKi8KKwkgICAgfSAgICAgICAgICAgICAgIAorCX0gLyplbmQgb2Ygc2VjdGlvbnMqLworCTwvb21wdHM6b3JwaGFuPgorICAgIH0gLyogZW5kIG9mIHBhcmFsbGVsICovCisgICAga25vd25fc3VtID0gKDk5OSAqIDEwMDApIC8gMiArIDc7CisgICAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsgCit9IC8qIGVuZCBvZiBjaGVja19zZWN0aW9uX3ByaXZhdGUqLworPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9zZWN0aW9uc19ub3dhaXQuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9zZWN0aW9uc19ub3dhaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTFhMzc1Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3NlY3Rpb25zX25vd2FpdC5jCkBAIC0wLDAgKzEsNjYgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOmRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgZm9yIG5vd2FpdCBkaXJlY3RpdmUuIEl0IGZpbGxzIGFuIGFycmF5IHdpdGggdmFsdWVzIGFuZCBvcGVyYXRlcyBvbiB0aGVzZSBpbiB0aGUgZm9sbG93aW5nLjwvb21wdHM6ZGVzY3JpcHRpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBzZWN0aW9ucyBub3dhaXQ8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp2ZXJzaW9uPjEuMDwvb21wdHM6dmVyc2lvbj4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgcGFyYWxsZWwgc2VjdGlvbnMsIG9tcCBmbHVzaDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3NlY3Rpb25zX25vd2FpdDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisJPG9tcHRzOm9ycGhhbjp2YXJzPgorCQlpbnQgcmVzdWx0OworCQlpbnQgY291bnQ7CisJPC9vbXB0czpvcnBoYW46dmFycz4KKwlpbnQgajsKKworCXJlc3VsdCA9IDA7CisJY291bnQgPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKwl7CisJPG9tcHRzOm9ycGhhbj4KKwlpbnQgcmFuazsKKworCXJhbmsgPSBvbXBfZ2V0X3RocmVhZF9udW0gKCk7CisJCisjcHJhZ21hIG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+bm93YWl0PC9vbXB0czpjaGVjaz4KKwkJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZwcmludGYgKGxvZ0ZpbGUsICJUaHJlYWQgbnIgJWQgZW50ZXJzIGZpcnN0IHNlY3Rpb24gYW5kIGdldHMgc2xlZXBpbmcuXG4iLCByYW5rKTsKKwkJCQlteV9zbGVlcChTTEVFUFRJTUUpOworCQkJCWNvdW50ID0gMTsKKwkJCQlmcHJpbnRmIChsb2dGaWxlLCAiVGhyZWFkIG5yICVkIHdva2UgdXAgYW4gc2V0IGNvdW50IHRvIDEuXG4iLCByYW5rKTsKKyNwcmFnbWEgb21wIGZsdXNoKGNvdW50KQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZwcmludGYgKGxvZ0ZpbGUsICJUaHJlYWQgbnIgJWQgZXhlY3V0ZWQgd29yayBpbiB0aGUgZmlyc3Qgc2VjdGlvbi5cbiIsIHJhbmspOworCQkJfQorCQl9CisvKiBCZWdpbiBvZiBzZWNvbmQgc2VjdGlvbnMgZW52aXJvbm1lbnQgKi8KKyNwcmFnbWEgb21wIHNlY3Rpb25zCisJCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmcHJpbnRmIChsb2dGaWxlLCAiVGhyZWFkIG5yICVkIGV4ZWN1dGVkIHdvcmsgaW4gdGhlIHNlY29uZCBzZWN0aW9uLlxuIiwgcmFuayk7CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZnByaW50ZiAobG9nRmlsZSwgIlRocmVhZCBuciAlZCBleGVjdXRlZCB3b3JrIGluIHRoZSBzZWNvbmQgc2VjdGlvbiBhbmQgY29udHJvbHMgdGhlIHZhbHVlIG9mIGNvdW50XG4iLCByYW5rKTsKKwkJCQlpZiAoY291bnQgPT0gMCkKKwkJCQkJcmVzdWx0ID0gMTsKKwkJCQlmcHJpbnRmIChsb2dGaWxlLCAiY291dCB3YXMgJWQiLCBjb3VudCk7CisJCQl9CisJCX0KKwk8L29tcHRzOm9ycGhhbj4KKwl9CisJCisJcmV0dXJuIHJlc3VsdDsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfc2VjdGlvbnNfcmVkdWN0aW9uLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfc2VjdGlvbnNfcmVkdWN0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U3ODI5YQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9zZWN0aW9uc19yZWR1Y3Rpb24uYwpAQCAtMCwwICsxLDYxMyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgc2VjdGlvbnMgcmVkdWN0aW9uIGRpcmVjdGl2ZSB3aXRoIGFsbCBpdHMgb3B0aW9ucy48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHNlY3Rpb25zIHJlZHVjdGlvbjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfc2VjdGlvbnNfcmVkdWN0aW9uPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKwk8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IHN1bTsKKwlpbnQga25vd25fc3VtOworCWRvdWJsZSBkcHQsZHN1bTsKKwlkb3VibGUgZGtub3duX3N1bTsKKwlkb3VibGUgZHQ9MC41OwkJCQkvKiBiYXNlIG9mIGdlb21ldHJpYyByb3cgZm9yICsgYW5kIC0gdGVzdCovCisJZG91YmxlIHJvdW5kaW5nX2Vycm9yPSAxLkUtOTsKKwlpbnQgZGlmZjsKKwlkb3VibGUgZGRpZmY7CisJaW50IHByb2R1Y3Q7CisJaW50IGtub3duX3Byb2R1Y3Q7CisJaW50IGxvZ2ljX2FuZDsKKwlpbnQgYml0X2FuZDsKKwlpbnQgbG9naWNfb3I7CisJaW50IGJpdF9vcjsKKwlpbnQgZXhjbHVzaXZfYml0X29yOworCWludCBsb2dpY3NbMTAwMF07CisJaW50IGk7CisJaW50IHJlc3VsdDsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCS8qICBpbnQgbXlfaXNsYXJnZXI7Ki8KKwkvKmludCBpc19sYXJnZXI9MTsqLworCisgICAgc3VtID03OworICAgIGRwdCA9MTsKKyAgICBkc3VtPTA7CisgICAgcHJvZHVjdCA9MTsKKwlsb2dpY19hbmQ9MTsKKwliaXRfYW5kPTE7CisJbG9naWNfb3I9MDsKKwliaXRfb3I9MDsKKwlleGNsdXNpdl9iaXRfb3I9MDsKKyAgICByZXN1bHQgPSAwOworCWR0ID0gMS4vMy47CisJa25vd25fc3VtID0gKDk5OSoxMDAwKS8yKzc7Cis8b21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgcGFyYWxsZWwKKwl7CisKKyNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigrOnN1bSk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT0xO2k8MzAwO2krKykKKwkJCQl7CisJCQkJCXN1bT1zdW0raTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTMwMDtpPDcwMDtpKyspCisJCQkJeworCQkJCQlzdW09c3VtK2k7CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT03MDA7aTwxMDAwO2krKykKKwkJCQl7CisJCQkJCXN1bT1zdW0raTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlpZihrbm93bl9zdW0hPXN1bSkKKwl7CisJCSsrcmVzdWx0OworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIHN1bSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgJWRcbiIsIHN1bSxrbm93bl9zdW0pOworCX0KKworCWRpZmYgPSAoOTk5KjEwMDApLzI7CisjcHJhZ21hIG9tcCBwYXJhbGxlbAorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigtOmRpZmYpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9MTtpPDMwMDtpKyspCisJCQkJeworCQkJCQlkaWZmPWRpZmYtaTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTMwMDtpPDcwMDtpKyspCisJCQkJeworCQkJCQlkaWZmPWRpZmYtaTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTcwMDtpPDEwMDA7aSsrKQorCQkJCXsKKwkJCQkJZGlmZj1kaWZmLWk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYoZGlmZiAhPSAwKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gRGlmZmVyZW5jZSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgMC5cbiIsZGlmZik7CisJfQorCisJZm9yIChpPTA7aTwyMDsrK2kpCisJeworCQlkcHQqPWR0OworCX0KKwlka25vd25fc3VtID0gKDEtZHB0KS8oMS1kdCk7CisjcHJhZ21hIG9tcCBwYXJhbGxlbAorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigrOmRzdW0pPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9MDtpPDY7KytpKQorCQkJCXsKKwkJCQkJZHN1bSArPSBwb3coZHQsaSk7CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT02O2k8MTI7KytpKQorCQkJCXsKKwkJCQkJZHN1bSArPSBwb3coZHQsaSk7CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT0xMjtpPDIwOysraSkKKwkJCQl7CisJCQkJCWRzdW0gKz0gcG93KGR0LGkpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWlmKCBmYWJzKGRzdW0tZGtub3duX3N1bSkgPiByb3VuZGluZ19lcnJvciApCisJeworCQlyZXN1bHQrKzsgCisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gc3VtIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlZiBpbnN0ZWFkIG9mICVmIChEaWZmZXJlbmNlOiAlRSlcbiIsZHN1bSxka25vd25fc3VtLCBkc3VtLWRrbm93bl9zdW0pOworCX0KKworCWRwdD0xOworCisJZm9yIChpPTA7aTwyMDsrK2kpCisJeworCQlkcHQqPWR0OworCX0KKwlmcHJpbnRmKGxvZ0ZpbGUsIlxuIik7CisJZGRpZmYgPSAoMS1kcHQpLygxLWR0KTsKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisJeworI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC06ZGRpZmYpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9MDtpPDY7KytpKQorCQkJCXsKKwkJCQkJZGRpZmYgLT0gcG93KGR0LGkpOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9NjtpPDEyOysraSkKKwkJCQl7CisJCQkJCWRkaWZmIC09IHBvdyhkdCxpKTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTEyO2k8MjA7KytpKQorCQkJCXsKKwkJCQkJZGRpZmYgLT0gcG93KGR0LGkpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWlmKCBmYWJzKGRkaWZmKSA+IHJvdW5kaW5nX2Vycm9yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gRGlmZmVyZW5jZSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJUUgaW5zdGVhZCBvZiAwLjBcbiIsZGRpZmYpOworCX0KKworCisJa25vd25fcHJvZHVjdCA9IDM2Mjg4MDA7CisjcHJhZ21hIG9tcCBwYXJhbGxlbAorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigqOnByb2R1Y3QpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsJCisJCQkJZm9yKGk9MTtpPDM7aSsrKQorCQkJCXsKKwkJCQkJcHJvZHVjdCAqPSBpOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IoaT0zO2k8NztpKyspCisJCQkJeworCQkJCQlwcm9kdWN0ICo9IGk7CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvcihpPTc7aTwxMTtpKyspCisJCQkJeworCQkJCQlwcm9kdWN0ICo9IGk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYoa25vd25fcHJvZHVjdCAhPSBwcm9kdWN0KQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gUHJvZHVjdCB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgJWRcbiIscHJvZHVjdCxrbm93bl9wcm9kdWN0KTsKKwl9CisKKwlmb3IoaT0wO2k8MTAwMDtpKyspCisJeworCQlsb2dpY3NbaV09MTsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisJeworI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCYmOmxvZ2ljX2FuZCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT0xO2k8MzAwO2krKykKKwkJCQl7CisJCQkJCWxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTMwMDtpPDcwMDtpKyspCisJCQkJeworCQkJCQlsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT03MDA7aTwxMDAwO2krKykKKwkJCQl7CisJCQkJCWxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlpZighbG9naWNfYW5kKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gbG9naWMgQU5EIHBhcnQgMVxuIik7CisJfQorCisJbG9naWNfYW5kID0gMTsKKwlsb2dpY3NbNTAxXSA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisJeworI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCYmOmxvZ2ljX2FuZCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT0xO2k8MzAwO2krKykKKwkJCQl7CisJCQkJCWxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTMwMDtpPDcwMDtpKyspCisJCQkJeworCQkJCQlsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT03MDA7aTwxMDAwO2krKykKKwkJCQl7CisJCQkJCWxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlpZihsb2dpY19hbmQpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAyXG4iKTsKKwl9CisKKwlmb3IoaT0wO2k8MTAwMDtpKyspCisJeworCQlsb2dpY3NbaV09MDsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbih8fDpsb2dpY19vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT0xO2k8MzAwO2krKykKKwkJCQl7CisJCQkJCWxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT0zMDA7aTw3MDA7aSsrKQorCQkJCXsKKwkJCQkJbG9naWNfb3IgPSAobG9naWNfb3IgfHwgbG9naWNzW2ldKTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTcwMDtpPDEwMDA7aSsrKQorCQkJCXsKKwkJCQkJbG9naWNfb3IgPSAobG9naWNfb3IgfHwgbG9naWNzW2ldKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlpZihsb2dpY19vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIlxuRXJyb3IgaW4gbG9naWMgT1IgcGFydCAxXG4iKTsKKwl9CisKKwlsb2dpY19vciA9IDA7CisJbG9naWNzWzUwMV09MTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisJeworI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHx8OmxvZ2ljX29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTE7aTwzMDA7aSsrKQorCQkJCXsKKwkJCQkJbG9naWNfb3IgPSAobG9naWNfb3IgfHwgbG9naWNzW2ldKTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTMwMDtpPDcwMDtpKyspCisJCQkJeworCQkJCQlsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9NzAwO2k8MTAwMDtpKyspCisJCQkJeworCQkJCQlsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWlmKCFsb2dpY19vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMlxuIik7CisJfQorCisKKwlmb3IoaT0wO2k8MTAwMDsrK2kpCisJeworCQlsb2dpY3NbaV09MTsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigmOmJpdF9hbmQpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsJCisJCQkJZm9yKGk9MDtpPDMwMDsrK2kpCisJCQkJeworCQkJCQliaXRfYW5kID0gKGJpdF9hbmQgJiBsb2dpY3NbaV0pOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsJCisJCQkJZm9yKGk9MzAwO2k8NzAwOysraSkKKwkJCQl7CisJCQkJCWJpdF9hbmQgPSAoYml0X2FuZCAmIGxvZ2ljc1tpXSk7CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJewkKKwkJCQlmb3IoaT03MDA7aTwxMDAwOysraSkKKwkJCQl7CisJCQkJCWJpdF9hbmQgPSAoYml0X2FuZCAmIGxvZ2ljc1tpXSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCWlmKCFiaXRfYW5kKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDFcbiIpOworCX0KKworCWJpdF9hbmQgPSAxOworCWxvZ2ljc1s1MDFdPTA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigmOmJpdF9hbmQpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IoaT0wO2k8MzAwOysraSkKKwkJCQl7CisJCQkJCWJpdF9hbmQgPSBiaXRfYW5kICYgbG9naWNzW2ldOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IoaT0zMDA7aTw3MDA7KytpKQorCQkJCXsKKwkJCQkJYml0X2FuZCA9IGJpdF9hbmQgJiBsb2dpY3NbaV07CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvcihpPTcwMDtpPDEwMDA7KytpKQorCQkJCXsKKwkJCQkJYml0X2FuZCA9IGJpdF9hbmQgJiBsb2dpY3NbaV07CisJCQkJfQorCQkJfQorCQl9CisJfQorCWlmKGJpdF9hbmQpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMlxuIik7CisJfQorCisJZm9yKGk9MDtpPDEwMDA7aSsrKQorCXsKKwkJbG9naWNzW2ldPTA7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofDpiaXRfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IoaT0wO2k8MzAwOysraSkKKwkJCQl7CisJCQkJCWJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yKGk9MzAwO2k8NzAwOysraSkKKwkJCQl7CisJCQkJCWJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yKGk9NzAwO2k8MTAwMDsrK2kpCisJCQkJeworCQkJCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisJCQkJfQorCQkJfQorCQl9CisJfQorCWlmKGJpdF9vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEJJVCBPUiBwYXJ0IDFcbiIpOworCX0KKwliaXRfb3IgPSAwOworCWxvZ2ljc1s1MDFdPTE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbih8OmJpdF9vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvcihpPTA7aTwzMDA7KytpKQorCQkJCXsKKwkJCQkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IoaT0zMDA7aTw3MDA7KytpKQorCQkJCXsKKwkJCQkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IoaT03MDA7aTwxMDAwOysraSkKKwkJCQl7CisJCQkJCWJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJaWYoIWJpdF9vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEJJVCBPUiBwYXJ0IDJcbiIpOworCX0KKworCWZvcihpPTA7aTwxMDAwO2krKykKKwl7CisJCWxvZ2ljc1tpXT0wOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisJeworI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKF46ZXhjbHVzaXZfYml0X29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CQorCQkJCWZvcihpPTA7aTwzMDA7KytpKQorCQkJCXsKKwkJCQkJZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsJCisJCQkJZm9yKGk9MzAwO2k8NzAwOysraSkKKwkJCQl7CisJCQkJCWV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CQorCQkJCWZvcihpPTcwMDtpPDEwMDA7KytpKQorCQkJCXsKKwkJCQkJZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlpZihleGNsdXNpdl9iaXRfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAxXG4iKTsKKwl9CisKKwlleGNsdXNpdl9iaXRfb3IgPSAwOworCWxvZ2ljc1s1MDFdPTE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiheOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvcihpPTA7aTwzMDA7KytpKQorCQkJCXsKKwkJCQkJZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IoaT0zMDA7aTw3MDA7KytpKQorCQkJCXsKKwkJCQkJZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IoaT03MDA7aTwxMDAwOysraSkKKwkJCQl7CisJCQkJCWV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJaWYoIWV4Y2x1c2l2X2JpdF9vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEVYQ0xVU0lWIEJJVCBPUiBwYXJ0IDJcbiIpOworCX0KKzwvb21wdHM6b3JwaGFuPgorCS8qcHJpbnRmKCJcblJlc3VsdDolZFxuIixyZXN1bHQpOyovCisJcmV0dXJuIChyZXN1bHQ9PTApOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9zaW5nbGUuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9zaW5nbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzJiMGQyCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3NpbmdsZS5jCkBAIC0wLDAgKzEsNDMgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHNpbmdsZSBkaXJlY3RpdmUgYnkgY29udHJvbGxpbmcgaG93IG9mdGVuIGEgZGlyZWN0aXZlIGlzIGNhbGxlZCBpbiBhbiBvbXAgc2luZ2xlIHJlZ2lvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHNpbmdsZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBwYXJhbGxlbCBwcml2YXRlLG9tcCBmbHVzaDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9zaW5nbGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBucl90aHJlYWRzX2luX3NpbmdsZTsKKwlpbnQgcmVzdWx0OworCWludCBucl9pdGVyYXRpb25zOworCWludCBpOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICBucl90aHJlYWRzX2luX3NpbmdsZSA9IDA7CisgICAgcmVzdWx0ID0gMDsKKyAgICBucl9pdGVyYXRpb25zID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgcHJpdmF0ZShpKQorICAgIHsKKwlmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspCisJeworCSAgICA8b21wdHM6b3JwaGFuPgorCQk8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgc2luZ2xlIDwvb21wdHM6Y2hlY2s+CisJCXsgIAorI3ByYWdtYSBvbXAgZmx1c2gKKwkJICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlKys7CisjcHJhZ21hIG9tcCBmbHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJICAgIG5yX2l0ZXJhdGlvbnMrKzsKKwkJICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlLS07CisJCSAgICByZXN1bHQgPSByZXN1bHQgKyBucl90aHJlYWRzX2luX3NpbmdsZTsKKwkJfSAvKiBlbmQgb2Ygc2luZ2xlICovICAgIAorCSAgICA8L29tcHRzOm9ycGhhbj4KKwl9IC8qIGVuZCBvZiBmb3IgICovCisgICAgfSAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKyAgICByZXR1cm4gKChyZXN1bHQgPT0gMCkgJiYgKG5yX2l0ZXJhdGlvbnMgPT0gTE9PUENPVU5UKSk7Cit9IC8qIGVuZCBvZiBjaGVja19zaW5nbGUqLworPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9zaW5nbGVfY29weXByaXZhdGUuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9zaW5nbGVfY29weXByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzdjZDU0Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3NpbmdsZV9jb3B5cHJpdmF0ZS5jCkBAIC0wLDAgKzEsNTAgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHNpbmdsZSBjb3B5cHJpdmF0ZSBkaXJlY3RpdmUuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBzaW5nbGUgY29weXByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgcGFybGxlbCxvbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IGo7CisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKGopCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9zaW5nbGVfY29weXByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IHJlc3VsdDsKKwlpbnQgbnJfaXRlcmF0aW9uczsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgcmVzdWx0ID0gMDsKKyAgICBucl9pdGVyYXRpb25zID0gMDsKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIGludCBpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKQorCSAgICB7CisJCS8qCisJCSAgIGludCB0aHJlYWQ7CisJCSAgIHRocmVhZCA9IG9tcF9nZXRfdGhyZWFkX251bSAoKTsKKwkJICovCisjcHJhZ21hIG9tcCBzaW5nbGUgPG9tcHRzOmNoZWNrPmNvcHlwcml2YXRlKGopPC9vbXB0czpjaGVjaz4KKwkJeworCQkgICAgbnJfaXRlcmF0aW9ucysrOworCQkgICAgaiA9IGk7CisJCSAgICAvKnByaW50ZiAoInRocmVhZCAlZCBhc3NpZ25zLCBqID0gJWQsIGkgPSAlZFxuIiwgdGhyZWFkLCBqLCBpKTsqLworCQl9CisJCS8qCSNwcmFnbWEgb21wIGJhcnJpZXIqLworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkJeworCQkgICAgLypwcmludGYgKCJ0aHJlYWQgPSAlZCwgaiA9ICVkLCBpID0gJWRcbiIsIHRocmVhZCwgaiwgaSk7Ki8KKwkJICAgIHJlc3VsdCA9IHJlc3VsdCArIGogLSBpOworCQl9CisjcHJhZ21hIG9tcCBiYXJyaWVyCisJICAgIH0gLyogZW5kIG9mIGZvciAqLworCTwvb21wdHM6b3JwaGFuPgorICAgIH0gLyogZW5kIG9mIHBhcmFsbGVsICovCisgICAgcmV0dXJuICgocmVzdWx0ID09IDApICYmIChucl9pdGVyYXRpb25zID09IExPT1BDT1VOVCkpOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9zaW5nbGVfbm93YWl0LmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfc2luZ2xlX25vd2FpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliN2EyNTAKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfc2luZ2xlX25vd2FpdC5jCkBAIC0wLDAgKzEsNjAgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHNpbmdsZSBub3dhaXQ8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWwsb21wIGF0b21pYzwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCBteV9pdGVyYXRpb25zOworI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShteV9pdGVyYXRpb25zKQorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfc2luZ2xlX25vd2FpdDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IG5yX2l0ZXJhdGlvbnM7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgIGludCB0b3RhbF9pdGVyYXRpb25zID0gMDsKKyAgICBpbnQgaTsKKworICAgIG5yX2l0ZXJhdGlvbnMgPSAwOworICAgIG15X2l0ZXJhdGlvbnMgPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBwcml2YXRlKGkpCisgICAgeworCWZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykKKwl7CisJICAgIDxvbXB0czpvcnBoYW4+CisJCTxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBzaW5nbGUgbm93YWl0PC9vbXB0czpjaGVjaz4KKwkJeworI3ByYWdtYSBvbXAgYXRvbWljICAKKwkJICAgIG5yX2l0ZXJhdGlvbnMrKzsKKwkJfSAvKiBlbmQgb2Ygc2luZ2xlKi8gICAgCisJICAgIDwvb21wdHM6b3JwaGFuPgorCX0gLyogZW5kIG9mIGZvciAgKi8KKyAgICB9IC8qIGVuZCBvZiBwYXJhbGxlbCAqLworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBwcml2YXRlKGkpIAorICAgIHsKKwlteV9pdGVyYXRpb25zID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspCisJeworCSAgICA8b21wdHM6b3JwaGFuPgorCQk8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgc2luZ2xlIG5vd2FpdDwvb21wdHM6Y2hlY2s+CisJCXsKKwkJICAgIG15X2l0ZXJhdGlvbnMrKzsKKwkJfSAvKiBlbmQgb2Ygc2luZ2xlKi8gICAgCisJICAgIDwvb21wdHM6b3JwaGFuPgorCX0gLyogZW5kIG9mIGZvciAgKi8KKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJeworCSAgICB0b3RhbF9pdGVyYXRpb25zICs9IG15X2l0ZXJhdGlvbnM7CisJfQorCisgICAgfSAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKyAgICByZXR1cm4gKChucl9pdGVyYXRpb25zID09IExPT1BDT1VOVCkgJiYgKHRvdGFsX2l0ZXJhdGlvbnMgPT0gTE9PUENPVU5UKSk7Cit9IC8qIGVuZCBvZiBjaGVja19zaW5nbGVfbm93YWl0Ki8KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfc2luZ2xlX3ByaXZhdGUuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9zaW5nbGVfcHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NTAyYzcKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfc2luZ2xlX3ByaXZhdGUuYwpAQCAtMCwwICsxLDU2IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBzaW5nbGUgcHJpdmF0ZSBkaXJlY3RpdmUuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBzaW5nZWwgcHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbCxvbXAgZmx1c2gsb21wIHNpbmdsZSBub3dhaXQ8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgbXlpdCA9IDA7CisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKG15aXQpCitpbnQgbXlyZXN1bHQgPSAwOworI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShteXJlc3VsdCkKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3NpbmdsZV9wcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKQoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgbnJfdGhyZWFkc19pbl9zaW5nbGU7CisJaW50IHJlc3VsdDsKKwlpbnQgbnJfaXRlcmF0aW9uczsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBpOworCisgICAgbXlpdCA9IDA7CisgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUgPSAwOworICAgIG5yX2l0ZXJhdGlvbnMgPSAwOworICAgIHJlc3VsdCA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHByaXZhdGUoaSkKKyAgICB7CisJbXlyZXN1bHQgPSAwOworCW15aXQgPSAwOworCWZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykKKwl7CisJPG9tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wIHNpbmdsZSA8b21wdHM6Y2hlY2s+cHJpdmF0ZShucl90aHJlYWRzX2luX3NpbmdsZSkgPC9vbXB0czpjaGVjaz5ub3dhaXQKKwkgICAgeyAgCisJCW5yX3RocmVhZHNfaW5fc2luZ2xlID0gMDsKKyNwcmFnbWEgb21wIGZsdXNoCisJCW5yX3RocmVhZHNfaW5fc2luZ2xlKys7CisjcHJhZ21hIG9tcCBmbHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJbXlpdCsrOworCQlteXJlc3VsdCA9IG15cmVzdWx0ICsgbnJfdGhyZWFkc19pbl9zaW5nbGU7CisJICAgIH0gLyogZW5kIG9mIHNpbmdsZSAqLyAgICAKKwk8L29tcHRzOm9ycGhhbj4KKwl9IC8qIGVuZCBvZiBmb3IgKi8KKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJeworICAgICAgICAgICAgcmVzdWx0ICs9IG5yX3RocmVhZHNfaW5fc2luZ2xlOworCSAgICBucl9pdGVyYXRpb25zICs9IG15aXQ7CisJfQorICAgIH0gLyogZW5kIG9mIHBhcmFsbGVsICovCisgICAgcmV0dXJuICgocmVzdWx0ID09IDApICYmIChucl9pdGVyYXRpb25zID09IExPT1BDT1VOVCkpOworfSAvKiBlbmQgb2YgY2hlY2tfc2luZ2xlIHByaXZhdGUgKi8gCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2suYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU4OTc5MAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNrLmMKQEAgLTAsMCArMSw1MiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgdGFzayBkaXJlY3RpdmUuIFRoZSBpZGVhIG9mIHRoZSB0ZXN0cyBpcyB0byBnZW5lcmF0ZSBhIHNldCBvZiB0YXNrcyBpbiBhIHNpbmdsZSByZWdpb24uIFdlIGxldCBwYXVzZSB0aGUgdGFza3MgZ2VuZXJhdGVkIHNvIHRoYXQgb3RoZXIgdGhyZWFkcyBnZXQgc2hlZHVsZWQgdG8gdGhlIG5ld2x5IG9wZW5lZCB0YXNrcy48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHRhc2s8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgc2luZ2xlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2s8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQgdGlkc1tOVU1fVEFTS1NdOworICAgIGludCBpOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAoreworI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1RBU0tTOyBpKyspIHsKKyAgICAgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICAvKiBGaXJzdCB3ZSBoYXZlIHRvIHN0b3JlIHRoZSB2YWx1ZSBvZiB0aGUgbG9vcCBpbmRleCBpbiBhIG5ldyB2YXJpYWJsZQorICAgICAgICAgICAgICogd2hpY2ggd2lsbCBiZSBwcml2YXRlIGZvciBlYWNoIHRhc2sgYmVjYXVzZSBvdGhlcndpc2UgaXQgd2lsbCBiZSBvdmVyd3JpdHRlbgorICAgICAgICAgICAgICogaWYgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgdGFzayB0YWtlcyBsb25nZXIgdGhhbiB0aGUgdGltZSB3aGljaCBpcyBuZWVkZWQgdG8gCisgICAgICAgICAgICAgKiBlbnRlciB0aGUgbmV4dCBzdGVwIG9mIHRoZSBsb29wIQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpbnQgbXlpOworICAgICAgICAgICAgbXlpID0gaTsKKworPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIHRhc2s8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG15X3NsZWVwIChTTEVFUFRJTUUpOworCisgICAgICAgICAgICAgICAgdGlkc1tteWldID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICAgICAgICB9IC8qIGVuZCBvZiBvbXAgdGFzayAqLworICAgICAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgICAgIH0gLyogZW5kIG9mIGZvciAqLworICAgIH0gLyogZW5kIG9mIHNpbmdsZSAqLworfSAvKmVuZCBvZiBwYXJhbGxlbCAqLworCisvKiBOb3cgd2UgY2tlY2sgaWYgbW9yZSB0aGFuIG9uZSB0aHJlYWQgZXhlY3V0ZWQgdGhlIHRhc2tzLiAqLworICAgIGZvciAoaSA9IDE7IGkgPCBOVU1fVEFTS1M7IGkrKykgeworICAgICAgICBpZiAodGlkc1swXSAhPSB0aWRzW2ldKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOworfSAvKiBlbmQgb2YgY2hlY2tfcGFyYWxsZWxfZm9yX3ByaXZhdGUgKi8KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGFza19maW5hbC5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfZmluYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTAwYzVmCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfZmluYWwuYwpAQCAtMCwwICsxLDUyIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCB0YXNrIGRpcmVjdGl2ZS4gVGhlIGlkZWEgb2YgdGhlIHRlc3RzIGlzIHRvIGdlbmVyYXRlIGEgc2V0IG9mIHRhc2tzIGluIGEgc2luZ2xlIHJlZ2lvbi4gV2UgbGV0IHBhdXNlIHRoZSB0YXNrcyBnZW5lcmF0ZWQgc28gdGhhdCBvdGhlciB0aHJlYWRzIGdldCBzaGVkdWxlZCB0byB0aGUgbmV3bHkgb3BlbmVkIHRhc2tzLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGFzayBmaW5hbDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBzaW5nbGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGFza19maW5hbDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCB0aWRzW05VTV9UQVNLU107CisgICAgaW50IGk7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQgZXJyb3I7CisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKK3sKKyNwcmFnbWEgb21wIHNpbmdsZQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9UQVNLUzsgaSsrKSB7CisgICAgICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgLyogRmlyc3Qgd2UgaGF2ZSB0byBzdG9yZSB0aGUgdmFsdWUgb2YgdGhlIGxvb3AgaW5kZXggaW4gYSBuZXcgdmFyaWFibGUKKyAgICAgICAgICAgICAqIHdoaWNoIHdpbGwgYmUgcHJpdmF0ZSBmb3IgZWFjaCB0YXNrIGJlY2F1c2Ugb3RoZXJ3aXNlIGl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4KKyAgICAgICAgICAgICAqIGlmIHRoZSBleGVjdXRpb24gb2YgdGhlIHRhc2sgdGFrZXMgbG9uZ2VyIHRoYW4gdGhlIHRpbWUgd2hpY2ggaXMgbmVlZGVkIHRvIAorICAgICAgICAgICAgICogZW50ZXIgdGhlIG5leHQgc3RlcCBvZiB0aGUgbG9vcCEKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaW50IG15aTsKKyAgICAgICAgICAgIG15aSA9IGk7CisKKyAgICAgICAgICAgICNwcmFnbWEgb21wIHRhc2sgPG9tcHRzOmNoZWNrPmZpbmFsKGk+PTEwKTwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbXlfc2xlZXAgKFNMRUVQVElNRSk7CisKKyAgICAgICAgICAgICAgICB0aWRzW215aV0gPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKyAgICAgICAgICAgIH0gLyogZW5kIG9mIG9tcCB0YXNrICovCisgICAgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgfSAvKiBlbmQgb2YgZm9yICovCisgICAgfSAvKiBlbmQgb2Ygc2luZ2xlICovCit9IC8qZW5kIG9mIHBhcmFsbGVsICovCisKKy8qIE5vdyB3ZSBja2VjayBpZiBtb3JlIHRoYW4gb25lIHRocmVhZCBleGVjdXRlZCB0aGUgdGFza3MuICovCisgICAgZm9yIChpID0gMTA7IGkgPCBOVU1fVEFTS1M7IGkrKykgeworICAgICAgICBpZiAodGlkc1sxMF0gIT0gdGlkc1tpXSkKKyAgICAgICAgICAgIGVycm9yKys7CisgICAgfQorICAgIHJldHVybiAoZXJyb3I9PTApOworfSAvKiBlbmQgb2YgY2hlY2tfcGFyYWxsZWxfZm9yX3ByaXZhdGUgKi8KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGFza19maXJzdHByaXZhdGUuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNrX2ZpcnN0cHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYTA3NDYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGFza19maXJzdHByaXZhdGUuYwpAQCAtMCwwICsxLDUxIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIGZpcnN0cHJpdmF0ZSBjbGF1c2Ugb2YgdGhlIHRhc2sgZGlyZWN0aXZlLiBXZSBjcmVhdGUgYSBzZXQgb2YgdGFza3MgaW4gYSBzaW5nbGUgcmVnaW9uLiBXZSBkZWZpbmVzIGEgdmFyaWFibGUgbmFtZWQgc3VtIHVuZXF1YWwgemVybyB3aGljaCBnZXRzIGRlY2xhcmVkIGZpcnN0cHJpdmF0ZSBmb3IgZWFjaCB0YXNrLiBOb3cgZWFjaCB0YXNrIGNhbGN1YWx0ZXMgYSBzdW0gdXNpbmcgdGhpcyBwcml2YXRlIHZhcmlhYmxlLiBCZWZvcmUgZWFjaCBjYWxjdWFsYXRpb24gc3RlcCB3ZSBpbnRyb2R1Y2UgYSBmbHVzaCBjb21tYW5kIHNvIHRoYXQgbWF5YmUgdGhlIHByaXZhdGUgdmFyaWFiZWwgZ2V0cyBiYWQuIEF0IHRoZSBlbmQgd2UgY2hlY2sgaWYgdGhlIGNhbGN1bGF0ZWQgc3VtIHdhcyByaWdodC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHRhc2sgZmlyc3Rwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHNpbmdsZSxvbXAgZmx1c2gsb21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90YXNrX2ZpcnN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgaW50IGk7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBzdW0gPSAxMjM0OworICAgIGludCBrbm93bl9zdW07CisgICAgaW50IHJlc3VsdCA9IDA7IC8qIGNvdW50cyB0aGUgd3Jvbmcgc3VtcyBmcm9tIHRhc2tzICovCisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgIGtub3duX3N1bSA9IDEyMzQgKyAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVEFTS1M7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgdGFzayA8b21wdHM6Y2hlY2s+Zmlyc3Rwcml2YXRlKHN1bSk8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGo7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPD0gTE9PUENPVU5UOyBqKyspIHsKKyNwcmFnbWEgb21wIGZsdXNoCisgICAgICAgICAgICAgICAgICAgICAgICBzdW0gKz0gajsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrIGlmIGNhbGN1bGF0ZWQgc3VtIHdhcyByaWdodCAqLworICAgICAgICAgICAgICAgICAgICBpZiAoc3VtICE9IGtub3duX3N1bSkgeworI3ByYWdtYSBvbXAgY3JpdGljYWwgCisgICAgICAgICAgICAgICAgICAgICAgeyByZXN1bHQrKzsgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSAvKiBlbmQgb2Ygb21wIHRhc2sgKi8KKyAgICAgICAgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgIH0JLyogZW5kIG9mIGZvciAqLworICAgICAgICB9IC8qIGVuZCBvZiBzaW5nbGUgKi8KKyAgICB9CS8qIGVuZCBvZiBwYXJhbGxlbCovCisKKyAgICByZXR1cm4gKHJlc3VsdCA9PSAwKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGFza19pZi5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfaWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDdhYjJmCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfaWYuYwpAQCAtMCwwICsxLDQzIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIGlmIGNsYXVzZSBvZiB0aGUgb21wIHRhc2sgZGlyZWN0aXZlLiBUaGUgaWRlYXIgb2YgdGhlIHRlc3RzIGlzIHRvIGdlbmVyYXRlIGEgdGFza3MgaW4gYSBzaW5nbGUgcmVnaW9uIGFuZCBwYXVzZSBpdCBpbW1lZGlhdGVseS4gVGhlIHBhcmVudCB0aHJlYWQgbm93IHNoYWxsIHNldCBhIGNvdW50ZXIgdmFyaWFibGUgd2hpY2ggdGhlIHBhdXNlZCB0YXNrIHNoYWxsIGV2YWx1YXRlIHdoZW4gd29rZSB1cC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHRhc2sgaWY8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgc2luZ2xlLG9tcCBmbHVzaDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90YXNrX2lmPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IGNvbmRpdGlvbl9mYWxzZTsKKyAgICBpbnQgY291bnQ7CisgICAgaW50IHJlc3VsdDsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgIGNvdW50PTA7CisgICAgY29uZGl0aW9uX2ZhbHNlID0gKGxvZ0ZpbGUgPT0gTlVMTCk7CisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKK3sKKyNwcmFnbWEgb21wIHNpbmdsZQorICAgIHsKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wIHRhc2sgPG9tcHRzOmNoZWNrPmlmIChjb25kaXRpb25fZmFsc2UpPC9vbXB0czpjaGVjaz4gc2hhcmVkKGNvdW50LCByZXN1bHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIG15X3NsZWVwIChTTEVFUFRJTUVfTE9ORyk7CisvLyNwcmFnbWEgb21wIGZsdXNoIChjb3VudCkKKyAgICAgICAgICAgIHJlc3VsdCA9ICgwID09IGNvdW50KTsKKyAgICAgICAgfSAvKiBlbmQgb2Ygb21wIHRhc2sgKi8KKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CisKKyAgICAgICAgY291bnQgPSAxOworLy8jcHJhZ21hIG9tcCBmbHVzaCAoY291bnQpCisKKyAgICB9IC8qIGVuZCBvZiBzaW5nbGUgKi8KK30gLyplbmQgb2YgcGFyYWxsZWwgKi8KKworICAgIHJldHVybiByZXN1bHQ7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfaW1wX2ZpcnN0cHJpdmF0ZS5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfaW1wX2ZpcnN0cHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiOGYwZWYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGFza19pbXBfZmlyc3Rwcml2YXRlLmMKQEAgLTAsMCArMSw1MSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPiBUZXN0IHRvIHNlZSBpZiBpbXBsaWVkIHByaXZhdGUgd29ya3MgcHJvcGVybHk8L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHRhc2s8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgc2luZ2xlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKworCisKKy8qIFV0aWxpdHkgZnVuY3Rpb24gZG8gc3BlbmQgc29tZSB0aW1lIGluIGEgbG9vcCAqLworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2tfaW1wX2ZpcnN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgaW50IGk9NTsKKyAgICBpbnQgayA9IDA7CisgICAgaW50IHJlc3VsdCA9IDA7CisgICAgaW50IHRhc2tfcmVzdWx0ID0gMTsKKyAgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZpcnN0cHJpdmF0ZShpKQorICAgIHsKKyAgICAgICNwcmFnbWEgb21wIHNpbmdsZQorICAgICAgeworICAgICAKKyAgICAgICAgCisgICAgICAgICAgZm9yIChrID0gMDsgayA8IE5VTV9UQVNLUzsgaysrKQorCSAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAjcHJhZ21hIG9tcCB0YXNrIHNoYXJlZChyZXN1bHQgLCB0YXNrX3Jlc3VsdDxvbXB0czpjcm9zc2NoZWNrPiwgaTwvb21wdHM6Y3Jvc3NjaGVjaz4pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBqOworCQkJICAvL2NoZWNrIGlmIGkgaXMgcHJpdmF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpICE9IDUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFza19yZXN1bHQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGogPSAwOyBqIDwgTlVNX1RBU0tTOyBqKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhpcyBzaG91bGQgYmUgZmlyc3Rwcml2YXRlIGltcGxpY2l0bHkKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKwkJfQorCisJICAjcHJhZ21hIG9tcCB0YXNrd2FpdAorCSAgcmVzdWx0ID0gKHRhc2tfcmVzdWx0ICYmIGk9PTUpOworICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGFza19wcml2YXRlLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGFza19wcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTllMjZkZAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNrX3ByaXZhdGUuYwpAQCAtMCwwICsxLDUzIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIHByaXZhdGUgY2xhdXNlIG9mIHRoZSB0YXNrIGRpcmVjdGl2ZS4gV2UgY3JlYXRlIGEgc2V0IG9mIHRhc2tzIGluIGEgc2luZ2xlIHJlZ2lvbi4gV2UgZGVmaW5lcyBhIHZhcmlhYmxlIG5hbWVkIHN1bSB3aGljaCBnZXRzIGRlY2xhcmVkIHByaXZhdGUgZm9yIGVhY2ggdGFzay4gTm93IGVhY2ggdGFzayBjYWxjdWFsdGVzIGEgc3VtIHVzaW5nIHRoaXMgcHJpdmF0ZSB2YXJpYWJsZS4gQmVmb3JlIGVhY2ggY2FsY3VhbGF0aW9uIHN0ZXAgd2UgaW50cm9kdWNlIGEgZmx1c2ggY29tbWFuZCBzbyB0aGF0IG1heWJlIHRoZSBwcml2YXRlIHZhcmlhYmVsIGdldHMgYmFkLiBBdCB0aGUgZW5kIHdlIGNoZWNrIGlmIHRoZSBjYWxjdWxhdGVkIHN1bSB3YXMgcmlnaHQuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0YXNrIHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgc2luZ2xlLG9tcCBmbHVzaCxvbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworLyogVXRpbGl0eSBmdW5jdGlvbiBkbyBzcGVuZCBzb21lIHRpbWUgaW4gYSBsb29wICovCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGFza19wcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKyAgICBpbnQgaTsKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IGtub3duX3N1bTsKKyAgICBpbnQgc3VtID0gMDsKKyAgICBpbnQgcmVzdWx0ID0gMDsgLyogY291bnRzIHRoZSB3cm9uZyBzdW1zIGZyb20gdGFza3MgKi8KKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyNwcmFnbWEgb21wIHNpbmdsZQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1RBU0tTOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wIHRhc2sgPG9tcHRzOmNoZWNrPnByaXZhdGUoc3VtKTwvb21wdHM6Y2hlY2s+IHNoYXJlZChyZXN1bHQsIGtub3duX3N1bSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBqOworCQkgICAgLy9pZiBzdW0gaXMgcHJpdmF0ZSwgaW5pdGlhbGl6ZSB0byAwCisJCSAgICA8b21wdHM6Y2hlY2s+c3VtID0gMDs8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDw9IExPT1BDT1VOVDsgaisrKSB7CisjcHJhZ21hIG9tcCBmbHVzaAorICAgICAgICAgICAgICAgICAgICAgICAgc3VtICs9IGo7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgaWYgY2FsY3VsYXRlZCBzdW0gd2FzIHJpZ2h0ICovCisgICAgICAgICAgICAgICAgICAgIGlmIChzdW0gIT0ga25vd25fc3VtKSB7CisjcHJhZ21hIG9tcCBjcml0aWNhbCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSAvKiBlbmQgb2Ygb21wIHRhc2sgKi8KKyAgICAgICAgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgIH0JLyogZW5kIG9mIGZvciAqLworICAgICAgICB9IC8qIGVuZCBvZiBzaW5nbGUgKi8KKyAgICB9CS8qIGVuZCBvZiBwYXJhbGxlbCovCisKKyAgICByZXR1cm4gKHJlc3VsdCA9PSAwKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGFza19zaGFyZWQuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNrX3NoYXJlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0YzIxMDkKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGFza19zaGFyZWQuYwpAQCAtMCwwICsxLDQ3IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+IFRlc3QgdG8gc2VlIGlmIGltcGxpZWQgc2hhcmVkIHdvcmtzIGNvcnJlY3RseTwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGFzazwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBzaW5nbGUsIG9tcCB0YXNrIGZpcnN0cHJpdmF0ZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisKKworCisvKiBVdGlsaXR5IGZ1bmN0aW9uIGRvIHNwZW5kIHNvbWUgdGltZSBpbiBhIGxvb3AgKi8KK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90YXNrX2ltcF9zaGFyZWQ8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBpOworICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICBpPTA7CisgICAgaW50IGsgPSAwOworICAgIGludCByZXN1bHQgPSAwOworCisgICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyAgICAgICAjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgTlVNX1RBU0tTOyBrKyspICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgICAgICAgICAgI3ByYWdtYSBvbXAgdGFzayA8b21wdHM6Y3Jvc3NjaGVjaz4gZmlyc3Rwcml2YXRlKGkpIDwvb21wdHM6Y3Jvc3NjaGVjaz4gPG9tcHRzOmNoZWNrPiBzaGFyZWQoaSk8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAjcHJhZ21hIG9tcCBhdG9taWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhpcyBzaG91bGQgYmUgc2hhcmVkIGltcGxpY2l0bHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICA8L29tcHRzOm9ycGhhbj4gCisgICAgICAgICAgICAgICAgICB9CisKKyAgICB9CisKK3Jlc3VsdCA9IGk7CityZXR1cm4gKChyZXN1bHQgPT0gTlVNX1RBU0tTKSk7CisgICAgIAorfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNrX3VudGllZC5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfdW50aWVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q2ZWJlMgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNrX3VudGllZC5jCkBAIC0wLDAgKzEsNjkgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IGZvciB1bnRpZWQgY2xhdXNlLiBGaXJzdCBnZW5lcmF0ZSBhIHNldCBvZiB0YXNrcyBhbmQgcGF1c2UgaXQgaW1tZWRpYXRlbHkuIFRoZW4gd2UgcmVzdW1lIGhhbGYgb2YgdGhlbSBhbmQgY2hlY2sgd2hldGhlciB0aGV5IGFyZSBzY2hlZHVsZWQgYnkgZGlmZmVyZW50IHRocmVhZHM8L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHRhc2sgdW50aWVkPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHRhc2t3YWl0PC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90YXNrX3VudGllZDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisKKyAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICBpbnQgaTsKKyAgaW50IGNvdW50OworICBpbnQgc3RhcnRfdGlkW05VTV9UQVNLU107CisgIGludCBjdXJyZW50X3RpZFtOVU1fVEFTS1NdOworICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICBjb3VudCA9IDA7CisgIAorICAvKmluaXRpYWxpemF0aW9uKi8KKyAgZm9yIChpPTA7IGk8IE5VTV9UQVNLUzsgaSsrKXsKKyAgICBzdGFydF90aWRbaV09MDsKKyAgICBjdXJyZW50X3RpZFtpXT0wOworICB9CisgIAorICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmaXJzdHByaXZhdGUoaSkKKyAgeworICAgICNwcmFnbWEgb21wIHNpbmdsZQorICAgIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVEFTS1M7IGkrKykgeworICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICBpbnQgbXlpID0gaTsKKyAgICAgICAgI3ByYWdtYSBvbXAgdGFzayA8b21wdHM6Y2hlY2s+dW50aWVkPC9vbXB0czpjaGVjaz4KKyAgICAgICAgeworICAgICAgICAgIG15X3NsZWVwKFNMRUVQVElNRSk7CisgICAgICAgICAgc3RhcnRfdGlkW215aV0gPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKyAgICAgICAgICBjdXJyZW50X3RpZFtteWldID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICAgICAgCisgICAgICAgICAgI3ByYWdtYSBvbXAgdGFza3dhaXQKKyAgICAgICAgICAKKyAgICAgICAgICA8b21wdHM6Y2hlY2s+aWYoKHN0YXJ0X3RpZFtteWldICUyKSAhPTApezwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICBteV9zbGVlcChTTEVFUFRJTUUpOworICAgICAgICAgICAgY3VycmVudF90aWRbbXlpXSA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgICAgICAgIDxvbXB0czpjaGVjaz4KKyAgICAgICAgICB9IC8qIGVuZCBvZiBpZiAqLyAKKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGN1cnJlbnRfdGlkW215aV0gPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKyAgICAgICAgICB9CisgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKworICAgICAgICB9IC8qZW5kIG9mIG9tcCB0YXNrICovCisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgfSAvKiBlbmQgb2YgZm9yICovCisgICAgfSAvKiBlbmQgb2Ygc2luZ2xlICovCisgIH0gLyogZW5kIG9mIHBhcmFsbGVsICovCisKKyAgZm9yIChpPTA7aTxOVU1fVEFTS1M7IGkrKykKKyAgeworICAgIHByaW50Zigic3RhcnRfdGlkWyVkXT0lZCwgY3VycmVudF90aWRbJWRdPSVkXG4iLGksIHN0YXJ0X3RpZFtpXSwgaSAsIGN1cnJlbnRfdGlkW2ldKTsKKyAgICBpZiAoY3VycmVudF90aWRbaV0gPT0gc3RhcnRfdGlkW2ldKQorICAgICAgY291bnQrKzsKKyAgfQorICByZXR1cm4gKGNvdW50PE5VTV9UQVNLUyk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorCis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGFza3dhaXQuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNrd2FpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NzYxZjIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGFza3dhaXQuYwpAQCAtMCwwICsxLDc1IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCB0YXNrd2FpdCBkaXJlY3RpdmUuIEZpcnN0IHdlIGdlbmVyYXRlIGEgc2V0IG9mIHRhc2tzLCB3aGljaCBzZXQgdGhlIGVsZW1lbnRzIG9mIGFuIGFycmF5IHRvIGEgc3BlY2lmaWMgdmFsdWUuIFRoZW4gd2UgZG8gYSB0YXNrd2FpdCBhbmQgY2hlY2sgaWYgYWxsIHRhc2tzIGZpbmlzaGVkIG1lYW5pbmcgYWxsIGFycmF5IGVsZW1lbnRzIGNvbnRhaW4gdGhlIHJpZ2h0IHZhbHVlLiBUaGVuIHdlIGdlbmVyYXRlIGEgc2Vjb25kIHNldCBzZXR0aW5nIHRoZSBhcnJheSBlbGVtZW50cyB0byBhbm90aGVyIHZhbHVlLiBBZnRlciB0aGUgcGFyYWxsZWwgcmVnaW9uIHdlIGNoZWNrIGlmIGFsbCB0YXNrcyBvZiB0aGUgc2Vjb25kIHNldCBmaW5pc2hlZCBhbmQgd2VyZSBleGVjdXRlZCBhZnRlciB0aGUgdGFza3Mgb2YgdGhlIGZpcnN0IHNldC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHRhc2t3YWl0PC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHNpbmdsZSxvbXAgdGFzazwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90YXNrd2FpdDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisgICAgaW50IHJlc3VsdDEgPSAwOyAgICAgLyogU3RvcmVzIG51bWJlciBvZiBub3QgZmluaXNoZWQgdGFza3MgYWZ0ZXIgdGhlIHRhc2t3YWl0ICovCisgICAgaW50IHJlc3VsdDIgPSAwOyAgICAgLyogU3RvcmVzIG51bWJlciBvZiB3cm9uZyBhcnJheSBlbGVtZW50cyBhdCB0aGUgZW5kICovCisKKyAgICBpbnQgYXJyYXlbTlVNX1RBU0tTXTsKKyAgICBpbnQgaTsKKworICAgIC8qIGZpbGwgYXJyYXkgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1RBU0tTOyBpKyspIAorICAgICAgICBhcnJheVtpXSA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorICAgIHsKKyNwcmFnbWEgb21wIHNpbmdsZQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1RBU0tTOyBpKyspIHsKKyAgICAgICAgICAgICAgICAvKiBGaXJzdCB3ZSBoYXZlIHRvIHN0b3JlIHRoZSB2YWx1ZSBvZiB0aGUgbG9vcCBpbmRleCBpbiBhIG5ldyB2YXJpYWJsZQorICAgICAgICAgICAgICAgICAqIHdoaWNoIHdpbGwgYmUgcHJpdmF0ZSBmb3IgZWFjaCB0YXNrIGJlY2F1c2Ugb3RoZXJ3aXNlIGl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4KKyAgICAgICAgICAgICAgICAgKiBpZiB0aGUgZXhlY3V0aW9uIG9mIHRoZSB0YXNrIHRha2VzIGxvbmdlciB0aGFuIHRoZSB0aW1lIHdoaWNoIGlzIG5lZWRlZCB0byAKKyAgICAgICAgICAgICAgICAgKiBlbnRlciB0aGUgbmV4dCBzdGVwIG9mIHRoZSBsb29wIQorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGludCBteWk7CisgICAgICAgICAgICAgICAgbXlpID0gaTsKKyNwcmFnbWEgb21wIHRhc2sKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG15X3NsZWVwIChTTEVFUFRJTUUpOworICAgICAgICAgICAgICAgICAgICBhcnJheVtteWldID0gMTsKKyAgICAgICAgICAgICAgICB9IC8qIGVuZCBvZiBvbXAgdGFzayAqLworICAgICAgICAgICAgfSAvKiBlbmQgb2YgZm9yICovCisKKzxvbXB0czpvcnBoYW4+Cis8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgdGFza3dhaXQ8L29tcHRzOmNoZWNrPgorPC9vbXB0czpvcnBoYW4+CisKKyAgICAgICAgICAgIC8qIGNoZWNrIGlmIGFsbCB0YXNrcyB3ZXJlIGZpbmlzaGVkICovCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1RBU0tTOyBpKyspIAorICAgICAgICAgICAgICAgIGlmIChhcnJheVtpXSAhPSAxKQorICAgICAgICAgICAgICAgICAgICByZXN1bHQxKys7CisKKyAgICAgICAgICAgIC8qIGdlbmVyYXRlIHNvbWUgbW9yZSB0YXNrcyB3aGljaCBub3cgc2hhbGwgb3ZlcndyaXRlIAorICAgICAgICAgICAgICogdGhlIHZhbHVlcyBpbiB0aGUgdGlkcyBhcnJheSAqLworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9UQVNLUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50IG15aTsKKyAgICAgICAgICAgICAgICBteWkgPSBpOworI3ByYWdtYSBvbXAgdGFzaworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXJyYXlbbXlpXSA9IDI7CisgICAgICAgICAgICAgICAgfSAvKiBlbmQgb2Ygb21wIHRhc2sgKi8KKyAgICAgICAgICAgIH0gLyogZW5kIG9mIGZvciAqLworCisgICAgICAgIH0gLyogZW5kIG9mIHNpbmdsZSAqLworICAgIH0gLyplbmQgb2YgcGFyYWxsZWwgKi8KKworICAgIC8qIGZpbmFsIGNoZWNrLCBpZiBhbGwgYXJyYXkgZWxlbWVudHMgY29udGFpbiB0aGUgcmlnaHQgdmFsdWVzOiAqLworICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVEFTS1M7IGkrKykgeworICAgICAgICBpZiAoYXJyYXlbaV0gIT0gMikKKyAgICAgICAgICAgIHJlc3VsdDIrKzsKKyAgICB9CisKKyAgICByZXR1cm4gKChyZXN1bHQxID09IDApICYmIChyZXN1bHQyID09IDApKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGFza3lpZWxkLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGFza3lpZWxkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQxMjcxZQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNreWllbGQuYwpAQCAtMCwwICsxLDU5IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB0YXNreWllbGQgZGlyZWN0aXZlLiBGaXJzdCBnZW5lcmF0ZSBhIHNldCBvZiB0YXNrcyBhbmQgcGF1c2UgaXQgaW1tZWRpYXRlbHkuIFRoZW4gd2UgcmVzdW1lIGhhbGYgb2YgdGhlbSBhbmQgY2hlY2sgd2hldGhlciB0aGV5IGFyZSBzY2hlZHVsZWQgYnkgZGlmZmVyZW50IHRocmVhZHM8L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHRhc2t5aWVsZDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCB0YXNrd2FpdDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGFza3lpZWxkPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKworICA8b21wdHM6b3JwaGFuOnZhcnM+CisgIGludCBpOworICBpbnQgY291bnQgPSAwOworICBpbnQgc3RhcnRfdGlkW05VTV9UQVNLU107CisgIGludCBjdXJyZW50X3RpZFtOVU1fVEFTS1NdOworICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICBmb3IgKGk9MDsgaTwgTlVNX1RBU0tTOyBpKyspeworICAgIHN0YXJ0X3RpZFtpXT0wOworICAgIGN1cnJlbnRfdGlkW2ldPTA7CisgIH0KKyAgCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1RBU0tTOyBpKyspIHsKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgaW50IG15aSA9IGk7CisgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCB0YXNrIHVudGllZDwvb21wdHM6Y2hlY2s+CisgICAgICAgIHsKKyAgICAgICAgICBteV9zbGVlcChTTEVFUFRJTUUpOworICAgICAgICAgIHN0YXJ0X3RpZFtteWldID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICAgICAgCisgICAgICAgICAgI3ByYWdtYSBvbXAgdGFza3lpZWxkCisgICAgICAgICAgCisgICAgICAgICAgaWYoKHN0YXJ0X3RpZFtteWldICUyKSA9PTApeworICAgICAgICAgICAgbXlfc2xlZXAoU0xFRVBUSU1FKTsKKyAgICAgICAgICAgIGN1cnJlbnRfdGlkW215aV0gPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKyAgICAgICAgICB9IC8qZW5kIG9mIGlmKi8KKyAgICAgICAgfSAvKiBlbmQgb2Ygb21wIHRhc2sgKi8KKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgICB9IC8qIGVuZCBvZiBmb3IgKi8KKyAgICB9IC8qIGVuZCBvZiBzaW5nbGUgKi8KKyAgfSAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworICBmb3IgKGk9MDtpPE5VTV9UQVNLUzsgaSsrKQorICB7CisgICAgLy9wcmludGYoInN0YXJ0X3RpZFslZF09JWQsIGN1cnJlbnRfdGlkWyVkXT0lZFxuIixpLCBzdGFydF90aWRbaV0sIGkgLCBjdXJyZW50X3RpZFtpXSk7CisgICAgaWYgKGN1cnJlbnRfdGlkW2ldID09IHN0YXJ0X3RpZFtpXSkKKyAgICAgIGNvdW50Kys7CisgIH0KKyAgcmV0dXJuIChjb3VudDxOVU1fVEFTS1MpOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKworPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rlc3RfbG9jay5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rlc3RfbG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ODlkZmIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGVzdF9sb2NrLmMKQEAgLTAsMCArMSw0NyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXBfdGVzdGxvY2sgZnVuY3Rpb24uIFRoZSB0ZXN0IGNvdW50cyB0aGUgdGhyZWFkcyBlbnRlcmluZyBhbmQgZXhpdGluZyBhIHNpbmdsZSByZWdpb24gd2hpY2ggaXMgYnVpbGQgd2l0aCBhIHRlc3RfbG9jayBpbiBhbiBlbmRsZXNzIGxvb3AuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcF90ZXN0X2xvY2s8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgZmx1c2g8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitvbXBfbG9ja190IGxjazsKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rlc3RfbG9jazwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkKK3sKKyAgICBpbnQgbnJfdGhyZWFkc19pbl9zaW5nbGUgPSAwOworICAgIGludCByZXN1bHQgPSAwOworICAgIGludCBucl9pdGVyYXRpb25zID0gMDsKKyAgICBpbnQgaTsKKworICAgIG9tcF9pbml0X2xvY2sgKCZsY2spOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQobGNrKSAgCisgICAgeworCisjcHJhZ21hIG9tcCBmb3IKKwlmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspCisJeworCSAgICAvKm9tcF9zZXRfbG9jaygmbGNrKTsqLworCSAgICA8b21wdHM6b3JwaGFuPgorCQk8b21wdHM6Y2hlY2s+d2hpbGUgKCFvbXBfdGVzdF9sb2NrICgmbGNrKSkKKwkJe307PC9vbXB0czpjaGVjaz4KKwkgICAgPC9vbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCBmbHVzaAorCSAgICBucl90aHJlYWRzX2luX3NpbmdsZSsrOworI3ByYWdtYSBvbXAgZmx1c2ggICAgICAgICAgIAorCSAgICBucl9pdGVyYXRpb25zKys7CisJICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlLS07CisJICAgIHJlc3VsdCA9IHJlc3VsdCArIG5yX3RocmVhZHNfaW5fc2luZ2xlOworCSAgICA8b21wdHM6Y2hlY2s+b21wX3Vuc2V0X2xvY2sgKCZsY2spOzwvb21wdHM6Y2hlY2s+CisJfQorICAgIH0KKyAgICBvbXBfZGVzdHJveV9sb2NrKCZsY2spOworCisgICAgcmV0dXJuICgocmVzdWx0ID09IDApICYmIChucl9pdGVyYXRpb25zID09IExPT1BDT1VOVCkpOworCit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rlc3RfbmVzdF9sb2NrLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGVzdF9uZXN0X2xvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGQ2YTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rlc3RfbmVzdF9sb2NrLmMKQEAgLTAsMCArMSw0OCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXBfdGVzdF9uZXN0X2xvY2sgZnVuY3Rpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcF90ZXN0X25lc3RfbG9jazwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBmbHVzaDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKworc3RhdGljIG9tcF9uZXN0X2xvY2tfdCBsY2s7CisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90ZXN0X25lc3RfbG9jazwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkKK3sKKyAgICAKKyAgICBpbnQgbnJfdGhyZWFkc19pbl9zaW5nbGUgPSAwOworICAgIGludCByZXN1bHQgPSAwOworICAgIGludCBucl9pdGVyYXRpb25zID0gMDsKKyAgICBpbnQgaTsKKworICAgIG9tcF9pbml0X25lc3RfbG9jayAoJmxjayk7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNoYXJlZChsY2spIAorICAgIHsKKworI3ByYWdtYSBvbXAgZm9yCisJZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKQorCXsKKwkgICAgLypvbXBfc2V0X2xvY2soJmxjayk7Ki8KKzxvbXB0czpvcnBoYW4+CisJICAgIDxvbXB0czpjaGVjaz53aGlsZSghb21wX3Rlc3RfbmVzdF9sb2NrICgmbGNrKSkKKwkgICAge307PC9vbXB0czpjaGVjaz4KKzwvb21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgZmx1c2gKKwkgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUrKzsKKyNwcmFnbWEgb21wIGZsdXNoICAgICAgICAgICAKKwkgICAgbnJfaXRlcmF0aW9ucysrOworCSAgICBucl90aHJlYWRzX2luX3NpbmdsZS0tOworCSAgICByZXN1bHQgPSByZXN1bHQgKyBucl90aHJlYWRzX2luX3NpbmdsZTsKKwkgICAgPG9tcHRzOmNoZWNrPm9tcF91bnNldF9uZXN0X2xvY2sgKCZsY2spOzwvb21wdHM6Y2hlY2s+CisJfQorICAgIH0KKyAgICBvbXBfZGVzdHJveV9uZXN0X2xvY2sgKCZsY2spOworCisgICAgcmV0dXJuICgocmVzdWx0ID09IDApICYmIChucl9pdGVyYXRpb25zID09IExPT1BDT1VOVCkpOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90aHJlYWRwcml2YXRlLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGhyZWFkcHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNGQ3YWEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGhyZWFkcHJpdmF0ZS5jCkBAIC0wLDAgKzEsOTcgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHRocmVhZHByaXZhdGUgZGlyZWN0aXZlIGJ5IGZpbGxpbmcgYW4gYXJyYXkgd2l0aCByYW5kb20gbnVtYmVycyBpbiBhbiBwYXJhbGxlbGlzZWQgcmVnaW9uLiBFYWNoIHRocmVhZCBnZW5lcmF0ZXMgb25lIG51bWJlciBvZiB0aGUgYXJyYXkgYW5kIHNhdmVzIHRoaXMgaW4gYSB0ZW1wb3JhcnkgdGhyZWFkcHJpdmF0ZSB2YXJpYWJsZS4gSW4gYSBzZWNvbmQgcGFyYWxsZWxpc2VkIHJlZ2lvbiB0aGUgdGVzdCBjb250cm9scywgdGhhdCB0aGUgdGVtcG9yYXJ5IHZhcmlhYmxlIGNvbnRhaW5zIHN0aWxsIHRoZSBmb3JtZXIgdmFsdWUgYnkgY29tcGFyaW5nIGl0IHdpdGggdGhlIG9uZSBpbiB0aGUgYXJyYXkuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0aHJlYWRwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLG9tcF9zZXRfZHluYW1pYyxvbXBfZ2V0X251bV90aHJlYWRzPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKy8qCisgKiBUaHJlYWRwcml2YXRlIGlzIHRlc3RlZCBpbiAyIHdheXM6CisgKiAxLiBUaGUgZ2xvYmFsIHZhcmlhYmxlIGRlY2xhcmVkIGFzIHRocmVhZHByaXZhdGUgc2hvdWxkIGhhdmUKKyAqICAgIGxvY2FsIGNvcHkgZm9yIGVhY2ggdGhyZWFkLiBPdGhlcndpc2UgcmFjZSBjb25kaXRpb24gYW5kIAorICogICAgd3JvbmcgcmVzdWx0LgorICogMi4gSWYgdGhlIHZhbHVlIG9mIGxvY2FsIGNvcHkgaXMgcmV0YWluZWQgZm9yIHRoZSB0d28gYWRqYWNlbnQKKyAqICAgIHBhcmFsbGVsIHJlZ2lvbnMKKyAqLworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCitzdGF0aWMgaW50IHN1bTA9MDsKK3N0YXRpYyBpbnQgbXl2YWx1ZSA9IDA7CisKKzxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKHN1bTApPC9vbXB0czpjaGVjaz4KKzxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKG15dmFsdWUpPC9vbXB0czpjaGVjaz4KKworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGhyZWFkcHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkKK3sKKwlpbnQgc3VtID0gMDsKKwlpbnQga25vd25fc3VtOworCWludCBpOyAKKwlpbnQgaXRlcjsKKwlpbnQgKmRhdGE7CisJaW50IHNpemU7CisJaW50IGZhaWxlZCA9IDA7CisJaW50IG15X3JhbmRvbTsKKwlvbXBfc2V0X2R5bmFtaWMoMCk7CisKKyAgICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBwcml2YXRlKGkpIAorICAgIHsKKwkgIHN1bTAgPSAwOworICAgICAgI3ByYWdtYSBvbXAgZm9yIAorCSAgICBmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKQorCQl7CisJCQlzdW0wID0gc3VtMCArIGk7CisJCX0gLyplbmQgb2YgZm9yKi8KKyAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisJICB7CisJICAgICAgc3VtID0gc3VtICsgc3VtMDsKKwkgIH0gLyplbmQgb2YgY3JpdGljYWwgKi8KKwl9IC8qIGVuZCBvZiBwYXJhbGxlbCAqLyAgICAKKwlrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisJaWYgKGtub3duX3N1bSAhPSBzdW0gKSB7CisJCWZwcmludGYgKGxvZ0ZpbGUsICIga25vd25fc3VtID0gJWQsIHN1bSA9ICVkXG4iLCBrbm93bl9zdW0sIHN1bSk7CisJfQorCisJLyogdGhlIG5leHQgcGFyYWxsZWwgcmVnaW9uIGlzIGp1c3QgdXNlZCB0byBnZXQgdGhlIG51bWJlciBvZiB0aHJlYWRzKi8KKwlvbXBfc2V0X2R5bmFtaWMoMCk7CisgICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKwl7CisgICAgICAjcHJhZ21hIG9tcCBtYXN0ZXIKKwkgIHsKKwkJCXNpemU9b21wX2dldF9udW1fdGhyZWFkcygpOworCQkJZGF0YT0oaW50KikgbWFsbG9jKHNpemUqc2l6ZW9mKGludCkpOworCSAgfQorCX0vKiBlbmQgcGFyYWxsZWwqLworCisKKwlzcmFuZCg0NSk7CisJZm9yIChpdGVyID0gMDsgaXRlciA8IDEwMDsgaXRlcisrKXsKKwkJbXlfcmFuZG9tID0gcmFuZCgpOwkvKiByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBpcyBjYWxsZWQgaW5zaWRlIHNlcmlhbCByZWdpb24qLworCisJLyogdGhlIGZpcnN0IHBhcmFsbGVsIHJlZ2lvbiBpcyB1c2VkIHRvIGluaXRpYWxpeWUgbXl2YWx1ZSBhbmQgdGhlIGFycmF5IHdpdGggbXlfcmFuZG9tK3JhbmsqLworICAgICNwcmFnbWEgb21wIHBhcmFsbGVsCisJeworCSAgICBpbnQgcmFuazsKKwkJcmFuayA9IG9tcF9nZXRfdGhyZWFkX251bSAoKTsKKwkJbXl2YWx1ZSA9IGRhdGFbcmFua10gPSBteV9yYW5kb20gKyByYW5rOworCX0KKworCS8qIHRoZSBzZWNvbmQgcGFyYWxsZWwgcmVnaW9uIHZlcmlmaWVzIHRoYXQgdGhlIHZhbHVlIG9mICJteXZhbHVlIiBpcyByZXRhaW5lZCAqLworICAgICNwcmFnbWEgb21wIHBhcmFsbGVsIHJlZHVjdGlvbigrOmZhaWxlZCkKKwl7CisJICAgIGludCByYW5rOworCQlyYW5rID0gb21wX2dldF90aHJlYWRfbnVtICgpOworCQlmYWlsZWQgPSBmYWlsZWQgKyAobXl2YWx1ZSAhPSBkYXRhW3JhbmtdKTsKKwkJaWYobXl2YWx1ZSAhPSBkYXRhW3JhbmtdKXsKKwkJICBmcHJpbnRmIChsb2dGaWxlLCAiIG15dmFsdWUgPSAlZCwgZGF0YVtyYW5rXT0gJWRcbiIsIG15dmFsdWUsIGRhdGFbcmFua10pOworCQl9CisJfQorICB9CisgIGZyZWUgKGRhdGEpOworCisJcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKSAmJiAhZmFpbGVkOworCit9IC8qIGVuZCBvZiBjaGVja190aHJlYWRwcml2YXRlKi8KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGhyZWFkcHJpdmF0ZV9mb3IuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90aHJlYWRwcml2YXRlX2Zvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNDM1OWQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGhyZWFkcHJpdmF0ZV9mb3IuYwpAQCAtMCwwICsxLDQ0IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgaWYgYSB2YXJpYWJsZSBkZWNsYXJlZCBhcyB0aHJlYWRwcml2YXRlIGNhbiBiZSB1c2VkIGFzIGEgbG9vcGluZGV4Ljwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGhyZWFkcHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK3N0YXRpYyBpbnQgaTsKKzxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKGkpPC9vbXB0czpjaGVjaz4KKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3RocmVhZHByaXZhdGVfZm9yPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKQoreworCQlpbnQga25vd25fc3VtOworCQlpbnQgc3VtOworCQlrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisJCXN1bSA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisJeworCQlpbnQgc3VtMCA9IDA7CisjcHJhZ21hIG9tcCBmb3IKKwkJZm9yIChpID0gMTsgaSA8PSBMT09QQ09VTlQ7IGkrKykKKwkJeworCQkJc3VtMCA9IHN1bTAgKyBpOworCQl9IC8qZW5kIG9mIGZvciovCisjcHJhZ21hIG9tcCBjcml0aWNhbAorCQl7CisJCQlzdW0gPSBzdW0gKyBzdW0wOworCQl9IC8qZW5kIG9mIGNyaXRpY2FsICovCisJfSAvKiBlbmQgb2YgcGFyYWxsZWwgKi8gICAgCisJCisJaWYgKGtub3duX3N1bSAhPSBzdW0gKSB7CisJCWZwcmludGYgKGxvZ0ZpbGUsICIga25vd25fc3VtID0gJWQsIHN1bSA9ICVkXG4iLCBrbm93bl9zdW0sIHN1bSk7CisJfQorCisJcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKKworfSAvKiBlbmQgb2YgY2hlY2tfdGhyZWFkcHJpdmF0ZSovCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgorCmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvY29tbW9uX3V0aWxpdHkuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9jb21tb25fdXRpbGl0eS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZDEwNzgKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvY29tbW9uX3V0aWxpdHkuZgpAQCAtMCwwICsxLDU3IEBACisgICAgICBzdWJyb3V0aW5lIHByaW50X3Jlc3VsdChzLGNyb3NzZmFpbGVkLE0sbmFtZSkgICAgIAorICAgICAgaW1wbGljaXQgbm9uZQorICAgICAgY2hhcmFjdGVyIChsZW49Kik6Om5hbWUKKwkgICByZWFsIGNlcnQKKwkgICBpbnRlZ2VyIE0sY3Jvc3NmYWlsZWQKKwkgICBpbnRlZ2VyIHMKKwkgICBjaGFyYWN0ZXIgKGxlbj0xMSkgOjogYworIAkgICBjaGFyYWN0ZXIgKGxlbj0xOCkgOjogYzIKKwkgICBjZXJ0PTEwMC4wKmNyb3NzZmFpbGVkL00KKyEgICAgICAgICAgIHByaW50ICosICJjZXJ0IiwgY2VydCwgImNyb3NzICIsIGNyb3NzZmFpbGVkCishCXRlc3QxPWh1bmRyZWQqY3Jvc3NmYWlsZWQKKwkgICBjPSIlIGNlcnRhaW50eSIKKwkgICBjMj0iIC4uLiB2ZXJpZmllZCB3aXRoICIKKyAgICAgIGlmKHMuZXEuMSkgdGhlbgorICAgICAgICAgd3JpdGUgKCosIihBLCBBLCBGNy4yLCBBKSIpIG5hbWUsIGMyLCBjZXJ0LCBjCisgICAgICBlbHNlCisgICAgICAgICB3cml0ZSAoKiwiKEEsQSkiKSBuYW1lLCIgLi4uIEZBSUxFRCIKKyAgICAgIGVuZGlmCisJICAgZW5kCisKKyAgICAgIHN1YnJvdXRpbmUgZG9fdGVzdCh0ZXN0X2Z1bmMsY3Jvc3NfdGVzdF9mdW5jLG5hbWUsTixmYWlsZWQsCisgICAgIHggIG51bV90ZXN0cyxjcm9zc2NoZWNrZWQpCisgICAgICBpbXBsaWNpdCBub25lCisgICAgICBpbnRlZ2VyIHN1Y2NlZWQKKyAgICAgIGludGVnZXIgY3Jvc3NmYWlsCisgICAgICBpbnRlZ2VyIGZhaWxlZAorICAgICAgaW50ZWdlciwgZXh0ZXJuYWw6OnRlc3RfZnVuYworICAgICAgaW50ZWdlciwgZXh0ZXJuYWw6OmNyb3NzX3Rlc3RfZnVuYworICAgICAgY2hhcmFjdGVyIChsZW49Kik6Om5hbWUKKyAgICAgIGludGVnZXIgZmFpbAorICAgICAgaW50ZWdlciBOLGkKKyAgICAgIGludGVnZXIgbnVtX3Rlc3RzLGNyb3NzY2hlY2tlZAorICAgICAgbnVtX3Rlc3RzPW51bV90ZXN0cysxCisgICAgICBzdWNjZWVkPTEKKyAgICAgIGNyb3NzZmFpbD0wCisgICAgICBmYWlsPTAKKyAgICAgIGRvIGk9MSxOCisgICAgICAgICBpZih0ZXN0X2Z1bmMoKS5lcS4wKSB0aGVuCisgICAgICAgICAgICBzdWNjZWVkPTAKKyAgICAgICAgICAgIGZhaWw9ZmFpbCsxCisgICAgICAgICAgICBleGl0CisgICAgICAgICBlbmQgaWYKKyAgICAgICAgIGlmKGNyb3NzX3Rlc3RfZnVuYygpLmVxLjApIHRoZW4KKyEgICAgICAgICAgICBwcmludCAqLCBjcm9zc2ZhaWwKKyAgICAgICAgICAgIGNyb3NzZmFpbD1jcm9zc2ZhaWwrMS4wIAorICAgICAgICAgZW5kIGlmCisgICAgICBlbmRkbworICAgICAgCisgICAgICBpZiAoZmFpbCAubmUuIDApIHRoZW4KKyAgICAgICAgIGZhaWxlZD1mYWlsZWQrMQorICAgICAgZWxzZQorICAgICAgICAgaWYoY3Jvc3NmYWlsIC5uZS4gMCkgdGhlbgorICAgICAgICAgICAgY3Jvc3NjaGVja2VkPWNyb3NzY2hlY2tlZCsxCisgICAgICAgICBlbmQgaWYKKyAgICAgIGVuZGlmCisgICAgICBjYWxsIHByaW50X3Jlc3VsdChzdWNjZWVkLGNyb3NzZmFpbCxOLG5hbWUpCisgICAgICBlbmQKZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL09NUDFfVEVTVCBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL09NUDFfVEVTVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTY0Y2UwCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vT01QMV9URVNUCkBAIC0wLDAgKzEsMzYgQEAKK2hhc19vcGVubXAKK29tcF9uZXN0ZWQKK29tcF9nZXRfbnVtX3RocmVhZHMKK29tcF9pbl9wYXJhbGxlbAorZG9fb3JkZXJlZAorZG9fcmVkdWN0aW9uCitkb19wcml2YXRlCitkb19maXJzdHByaXZhdGUKK2RvX2xhc3Rwcml2YXRlCitzZWN0aW9uX3JlZHVjdGlvbgorc2VjdGlvbl9wcml2YXRlCitzZWN0aW9uX2ZpcnN0cHJpdmF0ZQorc2VjdGlvbl9sYXN0cHJpdmF0ZQorc2luZ2xlCitzaW5nbGVfcHJpdmF0ZQorc2luZ2xlX25vd2FpdAorcGFyX2RvX29yZGVyZWQKK3Bhcl9kb19yZWR1Y3Rpb24KK3Bhcl9kb19wcml2YXRlCitwYXJfZG9fZmlyc3Rwcml2YXRlCitwYXJfZG9fbGFzdHByaXZhdGUKK3Bhcl9zZWN0aW9uX3JlZHVjdGlvbgorcGFyX3NlY3Rpb25fcHJpdmF0ZQorcGFyX3NlY3Rpb25fZmlyc3Rwcml2YXRlCitwYXJfc2VjdGlvbl9sYXN0cHJpdmF0ZQorb21wX21hc3Rlcl90aHJlYWQKK29tcF9jcml0aWNhbAorb21wX2F0b21pYworb21wX2JhcnJpZXIKK29tcF9mbHVzaAorb21wX3RocmVhZHByaXZhdGUKK29tcF9jb3B5aW4KK29tcF9sb2NrCitvbXBfdGVzdGxvY2sKK29tcF9uZXN0X2xvY2sKK29tcF9uZXN0X3Rlc3Rsb2NrCmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9PTVAyX1RFU1QgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9PTVAyX1RFU1QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU0NzY2NQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL09NUDJfVEVTVApAQCAtMCwwICsxLDUgQEAKK29tcF9udW1fdGhyZWFkcworb21wX3dvcmtzaGFyZQorb21wX3RpbWUKK29tcF90aWNrc190aW1lCitzaW5nbGVfY29weXByaXZhdGUKZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL2NvbW1vbl91dGlsaXR5LmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9jb21tb25fdXRpbGl0eS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZDEwNzgKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9jb21tb25fdXRpbGl0eS5mCkBAIC0wLDAgKzEsNTcgQEAKKyAgICAgIHN1YnJvdXRpbmUgcHJpbnRfcmVzdWx0KHMsY3Jvc3NmYWlsZWQsTSxuYW1lKSAgICAgCisgICAgICBpbXBsaWNpdCBub25lCisgICAgICBjaGFyYWN0ZXIgKGxlbj0qKTo6bmFtZQorCSAgIHJlYWwgY2VydAorCSAgIGludGVnZXIgTSxjcm9zc2ZhaWxlZAorCSAgIGludGVnZXIgcworCSAgIGNoYXJhY3RlciAobGVuPTExKSA6OiBjCisgCSAgIGNoYXJhY3RlciAobGVuPTE4KSA6OiBjMgorCSAgIGNlcnQ9MTAwLjAqY3Jvc3NmYWlsZWQvTQorISAgICAgICAgICAgcHJpbnQgKiwgImNlcnQiLCBjZXJ0LCAiY3Jvc3MgIiwgY3Jvc3NmYWlsZWQKKyEJdGVzdDE9aHVuZHJlZCpjcm9zc2ZhaWxlZAorCSAgIGM9IiUgY2VydGFpbnR5IgorCSAgIGMyPSIgLi4uIHZlcmlmaWVkIHdpdGggIgorICAgICAgaWYocy5lcS4xKSB0aGVuCisgICAgICAgICB3cml0ZSAoKiwiKEEsIEEsIEY3LjIsIEEpIikgbmFtZSwgYzIsIGNlcnQsIGMKKyAgICAgIGVsc2UKKyAgICAgICAgIHdyaXRlICgqLCIoQSxBKSIpIG5hbWUsIiAuLi4gRkFJTEVEIgorICAgICAgZW5kaWYKKwkgICBlbmQKKworICAgICAgc3Vicm91dGluZSBkb190ZXN0KHRlc3RfZnVuYyxjcm9zc190ZXN0X2Z1bmMsbmFtZSxOLGZhaWxlZCwKKyAgICAgeCAgbnVtX3Rlc3RzLGNyb3NzY2hlY2tlZCkKKyAgICAgIGltcGxpY2l0IG5vbmUKKyAgICAgIGludGVnZXIgc3VjY2VlZAorICAgICAgaW50ZWdlciBjcm9zc2ZhaWwKKyAgICAgIGludGVnZXIgZmFpbGVkCisgICAgICBpbnRlZ2VyLCBleHRlcm5hbDo6dGVzdF9mdW5jCisgICAgICBpbnRlZ2VyLCBleHRlcm5hbDo6Y3Jvc3NfdGVzdF9mdW5jCisgICAgICBjaGFyYWN0ZXIgKGxlbj0qKTo6bmFtZQorICAgICAgaW50ZWdlciBmYWlsCisgICAgICBpbnRlZ2VyIE4saQorICAgICAgaW50ZWdlciBudW1fdGVzdHMsY3Jvc3NjaGVja2VkCisgICAgICBudW1fdGVzdHM9bnVtX3Rlc3RzKzEKKyAgICAgIHN1Y2NlZWQ9MQorICAgICAgY3Jvc3NmYWlsPTAKKyAgICAgIGZhaWw9MAorICAgICAgZG8gaT0xLE4KKyAgICAgICAgIGlmKHRlc3RfZnVuYygpLmVxLjApIHRoZW4KKyAgICAgICAgICAgIHN1Y2NlZWQ9MAorICAgICAgICAgICAgZmFpbD1mYWlsKzEKKyAgICAgICAgICAgIGV4aXQKKyAgICAgICAgIGVuZCBpZgorICAgICAgICAgaWYoY3Jvc3NfdGVzdF9mdW5jKCkuZXEuMCkgdGhlbgorISAgICAgICAgICAgIHByaW50ICosIGNyb3NzZmFpbAorICAgICAgICAgICAgY3Jvc3NmYWlsPWNyb3NzZmFpbCsxLjAgCisgICAgICAgICBlbmQgaWYKKyAgICAgIGVuZGRvCisgICAgICAKKyAgICAgIGlmIChmYWlsIC5uZS4gMCkgdGhlbgorICAgICAgICAgZmFpbGVkPWZhaWxlZCsxCisgICAgICBlbHNlCisgICAgICAgICBpZihjcm9zc2ZhaWwgLm5lLiAwKSB0aGVuCisgICAgICAgICAgICBjcm9zc2NoZWNrZWQ9Y3Jvc3NjaGVja2VkKzEKKyAgICAgICAgIGVuZCBpZgorICAgICAgZW5kaWYKKyAgICAgIGNhbGwgcHJpbnRfcmVzdWx0KHN1Y2NlZWQsY3Jvc3NmYWlsLE4sbmFtZSkKKyAgICAgIGVuZApkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fY29sbGFwc2UuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX2NvbGxhcHNlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgxNzI1MAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX2NvbGxhcHNlLmYKQEAgLTAsMCArMSw2NyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2l0aCBvbXAgZm9yIGNvbGxhcHNlIGNsYXVzZS4gQmluZCB3aXRoIHR3byBsb29wcy4gV2l0aG91dCB0aGUgY29sbGFwc2UgY2xhdXNlLCB0aGUgZmlyc3QgbG9vcCB3aWxsIG5vdCBiZSBvcmRlcmVkPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBkbyBjb2xsYXBzZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbCxvbXAgZG8gc2NoZWR1bGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgTE9HSUNBTCBGVU5DVElPTiBjaGVja19pc19sYXJnZXIoaSkKKyAgICAgICAgaW1wbGljaXQgbm9uZQorICAgICAgICBJTlRFR0VSIDo6IGkKKyAgICAgICAgSU5URUdFUiwgc2F2ZSA6OiBsYXN0X2kKKyAgICAgICAgTE9HSUNBTCA6OiBpc19sYXJnZXIKKworICAgICAgICBpZiAoaSAuZXEuIDEpIGxhc3RfaSA9IDAKKworICAgICAgICBpc19sYXJnZXIgPSAoaSAuZ2UuIGxhc3RfaSkgLmFuZC4gKChpLWxhc3RfaSkgLmxlLiAxKQorICAgICAgICBsYXN0X2kgPSBpCisKKyAgICAgICAgY2hlY2tfaXNfbGFyZ2VyID0gaXNfbGFyZ2VyCisKKyAgICAgIEVORCBGVU5DVElPTiBjaGVja19pc19sYXJnZXIKKworICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPmRvX2NvbGxhcHNlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIGksIGoKKzxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgTE9HSUNBTCBjaGVja19pc19sYXJnZXIKKyAgICAgICAgTE9HSUNBTCBteV9pc19sYXJnZXIKKyAgICAgICAgTE9HSUNBTCBpc19sYXJnZXIKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gaXNfbGFyZ2VyCis8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKworICAgICAgICBpc19sYXJnZXIgPSAudHJ1ZS4KKworISRvbXAgcGFyYWxsZWwgcHJpdmF0ZShteV9pc19sYXJnZXIpCis8b21wdHM6b3JwaGFuPgorICAgICAgICBteV9pc19sYXJnZXIgPSAudHJ1ZS4KKyEkb21wIGRvIHByaXZhdGUoaSxqKSBzY2hlZHVsZShzdGF0aWMsMSkgPG9tcHRzOmNoZWNrPmNvbGxhcHNlKDIpPC9vbXB0czpjaGVjaz4KKyEkb21wKyAgIG9yZGVyZWQKKyAgICAgICAgRE8gaT0xLDEwMAorICAgICAgICAgIDxvbXB0czpjcm9zc2NoZWNrPgorICAgICAgICAgIG15X2lzX2xhcmdlciA9IGNoZWNrX2lzX2xhcmdlcihpKSAuYW5kLiBteV9pc19sYXJnZXIKKyAgICAgICAgICA8L29tcHRzOmNyb3NzY2hlY2s+CisgICAgICAgICAgRE8gaj0xLDAwCisgICAgICAgICAgPG9tcHRzOmNoZWNrPgorISRvbXAgb3JkZXJlZAorICAgICAgICAgICAgbXlfaXNfbGFyZ2VyID0gY2hlY2tfaXNfbGFyZ2VyKGkpIC5hbmQuIG15X2lzX2xhcmdlcgorISRvbXAgZW5kIG9yZGVyZWQKKyAgICAgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgICAgIEVORCBETworICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworISRvbXAgY3JpdGljYWwKKyAgICAgICAgaXNfbGFyZ2VyID0gaXNfbGFyZ2VyIC5hbmQuIG15X2lzX2xhcmdlcgorISRvbXAgZW5kIGNyaXRpY2FsCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICBpZiAoaXNfbGFyZ2VyKSB0aGVuCisgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICBlbHNlCisgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICBlbmQgaWYKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX2ZpcnN0cHJpdmF0ZS5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fZmlyc3Rwcml2YXRlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc5MjM2MQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX2ZpcnN0cHJpdmF0ZS5mCkBAIC0wLDAgKzEsNTYgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIGRvIGZpcnN0cHJpdmF0ZSBjbGF1c2UgYnkgY291bnRpbmcgdXAgYSB2YXJpYWJsZSBpbiBhIHBhcmFsbGVsaXplZCBsb29wLiBFYWNoIHRocmVhZCBoYXMgYSBmaXJzdHByaXZhdGUgdmFyaWFibGUgKDEpIGFuZCBhbiB2YXJpYWJsZSAoMikgZGVjbGFyZWQgYnkgZG8gZmlyc3Rwcml2YXRlLiBGaXJzdCBpdCBzdG9yZXMgdGhlIHJlc3VsdCBvZiBpdHMgbGFzdCBpdGVyYXRpb24gaW4gdmFyaWFibGUgKDIpLiBUaGVuIGl0IHN0b3JlcyB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlICgyKSBpbiBpdHMgZmlyc3Rwcml2YXRlIHZhcmlhYmxlICgxKS4gQXQgdGhlIGVuZCBhbGwgZmlyc3Rwcml2YXRlIHZhcmlhYmxlcyAoMSkgYXJlIGFkZGVkIHRvIGEgdG90YWwgc3VtIGluIGEgY3JpdGljYWwgc2VjdGlvbiBhbmQgY29tcGFyZWQgd2l0aCB0aGUgY29ycmVjdCByZXN1bHQuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6dmVyc2lvbj4yLjA8L29tcHRzOnZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBkbyBmaXJzdHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgcGFyYWxsZWwgcHJpdmF0ZSwgb21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5kb19maXJzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgc3VtLCBrbm93bl9zdW0KKyAgICAgICAgSU5URUdFUiBudW10aHJlYWRzCisgICAgICAgIElOVEVHRVIgb21wX2dldF9udW1fdGhyZWFkcworPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIHN1bTAsIHN1bTEsIGkKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gc3VtMCwgc3VtMSwgaQorPC9vbXB0czpvcnBoYW46dmFycz4KKyAgCisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyAgCisgICAgICAgIHN1bSA9IDAKKyAgICAgICAgc3VtMCA9IDEyMzQ1CisgICAgICAgIHN1bTEgPSAwCisgIAorICAKKyEkb21wIHBhcmFsbGVsIGZpcnN0cHJpdmF0ZShzdW0xKQorISRvbXAgc2luZ2xlCisgICAgICAgIG51bXRocmVhZHMgPSBvbXBfZ2V0X251bV90aHJlYWRzKCkKKyEkb21wIGVuZCBzaW5nbGUKKworCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gPG9tcHRzOmNoZWNrPmZpcnN0cHJpdmF0ZShzdW0wKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+cHJpdmF0ZSAoc3VtMCk8L29tcHRzOmNyb3NzY2hlY2s+CisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGkKKyAgICAgICAgICBzdW0xID0gc3VtMAorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CisKKworISRvbXAgY3JpdGljYWwKKyAgICAgICAgV1JJVEUgKDEsKikgc3VtMAorICAgICAgICBzdW0gPSBzdW0gKyBzdW0xCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIGVuZCBwYXJhbGxlbAorCisKKyAgICAgICAga25vd25fc3VtPTEyMzQ1Km51bXRocmVhZHMrIChMT09QQ09VTlQqKExPT1BDT1VOVCsxKSkvMgorICAgICAgICBJRiAoIGtub3duX3N1bSAuRVEuIHN1bSApIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgV1JJVEUgKDEsKikgIkZvdW5kIHN1bSB3YXMiLCBzdW0sICJpbnN0ZWFkIG9mIiwga25vd25fc3VtCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9kb19sYXN0cHJpdmF0ZS5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fbGFzdHByaXZhdGUuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjAyZTUwCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fbGFzdHByaXZhdGUuZgpAQCAtMCwwICsxLDM5IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBkbyBsYXN0cHJpdmF0ZSBjbGF1c2UgYnkgY291bnRpbmcgdXAgYSB2YXJpYWJsZSBpbiBhIHBhcmFsbGVsaXplZCBsb29wLiBFYWNoIHRocmVhZCBzYXZlcyB0aGUgbmV4dCBzdW1tYW5kIGluIGEgbGFzdHByaXZhdGUgdmFyaWFibGUgaTAuIEF0IHRoZSBlbmQgaTAgaXMgY29tcGFyZWQgdG8gdGhlIHZhbHVlIG9mIHRoZSBleHBlY3RlZCBsYXN0IHN1bW1hbmQuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6dmVyc2lvbj4yLjA8L29tcHRzOnZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBkbyBwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHBhcmFsbGVsIGZpcnN0cHJpdmF0ZSwgb21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5kb19sYXN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBzdW0sa25vd25fc3VtCis8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgc3VtMCxpMCxpCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIHN1bTAsaTAsaQorPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAgICAgICBzdW0gPSAwCisgICAgICAgIHN1bTAgPSAwCisgICAgICAgIGkwID0gLTEKKyEkb21wIHBhcmFsbGVsIGZpcnN0cHJpdmF0ZShzdW0wKQorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIHNjaGVkdWxlKHN0YXRpYyw3KSA8b21wdHM6Y2hlY2s+bGFzdHByaXZhdGUoaTApPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGkKKyAgICAgICAgICBpMCA9IGkKKyAgICAgICAgRU5EIERPCis8b21wdHM6Y2hlY2s+ISRvbXAgZW5kIGRvPC9vbXB0czpjaGVjaz4KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBlbmQgcGFyYWxsZWwKKyAgICAgIGtub3duX3N1bSA9IChMT09QQ09VTlQqKExPT1BDT1VOVCsxKSkvMgorICAgICAgICBJRiAoIGtub3duX3N1bSAuRVEuIHN1bSAuQU5ELiBpMCAuRVEuIExPT1BDT1VOVCApIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9kb19vcmRlcmVkLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9kb19vcmRlcmVkLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA4N2Y4MQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX29yZGVyZWQuZgpAQCAtMCwwICsxLDczIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czpkaXJlY3RpdmU+ZG8gb3JkZXJlZDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnZlcnNpb24+Mi4wPC9vbXB0czp2ZXJzaW9uPgorPG9tcHRzOmRlcGVuZGVuY2VzPnBhcmFsbGVsIHByaXZhdGUsIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gaV9pc2xhcmdlcihpKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgaSwgaXNsYXJnZXIKKyAgICAgICAgSU5URUdFUiBsYXN0X2kKKyAgICAgICAgQ09NTU9OIC9teWNvbS8gbGFzdF9pCisgICAgICAgIElGICggaSAuR1QuIGxhc3RfaSkgVEhFTgorICAgICAgICAgIGlzbGFyZ2VyID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgaXNsYXJnZXIgPSAwCisgICAgICAgIEVORCBJZgorICAgICAgICBsYXN0X2kgPSBpCisgICAgICAgIGlfaXNsYXJnZXIgPSBpc2xhcmdlcgorICAgICAgRU5ECisKKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5kb19vcmRlcmVkPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIGtub3duX3N1bSwgaXNfbGFyZ2VyCisgICAgICAgIElOVEVHRVIgbGFzdF9pCisgICAgICAgIElOVEVHRVIgaV9pc2xhcmdlcgorICAgICAgICBDT01NT04gL215Y29tLyBsYXN0X2kKKworPG9tcHRzOm9ycGhhbjpwYXJtcz4gaSA8L29tcHRzOm9ycGhhbjpwYXJtcz4KKworPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIHN1bSwgaSwgbXlfaXNsYXJnZXIKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gbXlfaXNsYXJnZXIsIHN1bQorPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgICAgICBzdW0gPSAwCisgICAgICAgIGlzX2xhcmdlciA9IDEKKyAgICAgICAgbGFzdF9pID0gMAorISRvbXAgcGFyYWxsZWwgcHJpdmF0ZShteV9pc2xhcmdlcikKKyAgICAgICAgbXlfaXNsYXJnZXIgPSAxCishJG9tcCBkbyBzY2hlZHVsZShzdGF0aWMsMSkgb3JkZXJlZAorICAgICAgICBETyBpPTEsIDk5Cis8b21wdHM6b3JwaGFuPgorPG9tcHRzOmNoZWNrPgorISRvbXAgb3JkZXJlZAorPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICBJRiAoaV9pc2xhcmdlcihpKSAuRVEuIDEgLkFORC4gbXlfaXNsYXJnZXIgLkVRLiAxKSBUSEVOCisgICAgICAgICAgICBteV9pc2xhcmdlciA9IDEKKyAgICAgICAgICBFTFNFCisgICAgICAgICAgICBteV9pc2xhcmdlciA9IDAKKyAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICBzdW0gPSBzdW0gKyBpCis8b21wdHM6Y2hlY2s+CishJG9tcCBlbmQgb3JkZXJlZAorPC9vbXB0czpjaGVjaz4KKzwvb21wdHM6b3JwaGFuPgorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworISRvbXAgY3JpdGljYWwKKyAgICAgICAgSUYgKGlzX2xhcmdlciAuRVEuIDEgLkFORC4gbXlfaXNsYXJnZXIgLkVRLiAxICkgVEhFTgorICAgICAgICAgIGlzX2xhcmdlciA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIGlzX2xhcmdlciA9IDAKKyAgICAgICAgRU5EIElGCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIGVuZCBwYXJhbGxlbAorICAgICAgICBrbm93bl9zdW0gPSAoOTkqMTAwKS8yCisgICAgICAgIElGICgga25vd25fc3VtIC5FUS4gc3VtIC5BTkQuIGlzX2xhcmdlciAuRVEuIDEpIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9kb19wcml2YXRlLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9kb19wcml2YXRlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU1ODdjZgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX3ByaXZhdGUuZgpAQCAtMCwwICsxLDY3IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBkbyBwcml2YXRlIGNsYXVzZSBieSBjb3VudGluZyB1cCBhIHZhcmlhYmxlIGluIGEgcGFyYWxsZWxpemVkIGxvb3AuIEVhY2ggdGhyZWFkIGhhcyBhIHByaXZhdGUgdmFyaWFibGUgKDEpIGFuZCBhbiB2YXJpYWJsZSAoMikgZGVjbGFyZWQgYnkgZm9yIHByaXZhdGUuIEZpcnN0IGl0IHN0b3JlcyB0aGUgcmVzdWx0IG9mIGl0cyBsYXN0IGl0ZXJhdGlvbiBpbiB2YXJpYWJsZSAoMikuIFRoZW4gdGhpcyB0aHJlYWQgd2FpdHMgc29tZSB0aW1lIGJlZm9yZSBpdCBzdG9yZXMgdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSAoMikgaW4gaXRzIHByaXZhdGUgdmFyaWFibGUgKDEpLiBBdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IGl0ZXJhdGlvbiB0aGUgdmFsdWUgb2YgKDEpIGlzIGFzc2lnbmVkIHRvICgyKS4gQXQgdGhlIGVuZCBhbGwgcHJpdmF0ZSB2YXJpYWJsZXMgKDEpIGFyZSBhZGRlZCB0byBhIHRvdGFsIHN1bSBpbiBhIGNyaXRpY2FsIHNlY3Rpb24gYW5kIGNvbXBhcmVkIHdpdGggdGhlIGNvcnJlY3QgcmVzdWx0Ljwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOnZlcnNpb24+Mi4wPC9vbXB0czp2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZG8gcHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBwYXJhbGxlbCBwcml2YXRlLCBvbXAgZmx1c2gsIG9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBTVUJST1VUSU5FIGRvX3NvbWVfd29yaygpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBpCisgICAgICAgIElOVFJJTlNJQyBzcXJ0CisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gc3VtCisKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAgICAgICBzdW09MC4wCisgICAgICAgIERPIGk9MCwgTE9PUENPVU5ULTEKKyAgICAgICAgICBzdW0gPSBzdW0gKyBzcXJ0KFJFQUwoaSkpCisgICAgICAgIEVORERPCisKKyAgICAgIEVORAorCisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+ZG9fcHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBzdW0sIGtub3duX3N1bQorPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIHN1bTAsIHN1bTEsIGkKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gc3VtMCwgc3VtMSwgaQorPC9vbXB0czpvcnBoYW46dmFycz4gICAgICAgIAorCisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKworICAgICAgICBzdW0gID0gMAorICAgICAgICBzdW0wID0gMAorICAgICAgICBzdW0xID0gMAorCishJG9tcCBwYXJhbGxlbCBwcml2YXRlKHN1bTEpCisgICAgICAgIHN1bTAgPSAwCisgICAgICAgIHN1bTEgPSAwCisKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyA8b21wdHM6Y2hlY2s+cHJpdmF0ZShzdW0wKTwvb21wdHM6Y2hlY2s+IHNjaGVkdWxlKHN0YXRpYywxKQorICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgIHN1bTAgPSBzdW0xCishJG9tcCBmbHVzaAorICAgICAgICAgIHN1bTAgPSBzdW0wICsgaQorICAgICAgICAgIENBTEwgZG9fc29tZV93b3JrKCkKKyEkb21wIGZsdXNoCishICAgICAgICAgIHByaW50ICosIHN1bTAKKyAgICAgICAgICBzdW0xID0gc3VtMAorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CisKKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHN1bSA9IHN1bSArIHN1bTEKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAga25vd25fc3VtID0gKExPT1BDT1VOVCooTE9PUENPVU5UKzEpKS8yCishICAgICAgICBwcmludCAqLCAic3VtOiIsIHN1bSwgImtub3duX3N1bSIsIGtub3duX3N1bQorICAgICAgICBJRiAoIGtub3duX3N1bSAuRVEuIHN1bSkgVEhFTgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX3JlZHVjdGlvbi5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fcmVkdWN0aW9uLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIyNWE0NQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX3JlZHVjdGlvbi5mCkBAIC0wLDAgKzEsNTE0IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBkbyByZWR1Y3Rpb24gZGlyZWN0aXZlIHdpY2ggYWxsIGl0cyBvcHRpb25zLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZG8gcmVkdWN0aW9uPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+ZG9fcmVkdWN0aW9uPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHN1bTIsIGtub3duX3N1bQorICAgICAgICBJTlRFR0VSIGtub3duX3Byb2R1Y3QKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiByb3VuZGluZ19lcnJvciwgZHB0CisgICAgICAgIElOVEVHRVIgZG91YmxlX0RJR0lUUworICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIGRrbm93bl9zdW0KKyAgICAgICAgSU5URUdFUiByZXN1bHQKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAgICAgICBQQVJBTUVURVIgKGtub3duX3Byb2R1Y3Q9MzYyODgwMCkKKyAgICAgICAgUEFSQU1FVEVSIChyb3VuZGluZ19lcnJvcj0xLkUtNikKKzxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBzdW0sZGlmZixwcm9kdWN0LGkKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBkc3VtLGRkaWZmLGR0CisgICAgICAgIExPR0lDQUwgbG9naWNfYW5kLCBsb2dpY19vciwgbG9naWNfZXF2LGxvZ2ljX25lcXYKKyAgICAgICAgTE9HSUNBTCBsb2dpY3MoTE9PUENPVU5UKQorICAgICAgICBJTlRFR0VSIGJpdF9hbmQsIGJpdF9vcgorICAgICAgICBJTlRFR0VSIGV4Y2x1c2l2X2JpdF9vcgorICAgICAgICBJTlRFR0VSIG1pbl92YWx1ZSwgbWF4X3ZhbHVlCisgICAgICAgIElOVEVHRVIgaW50X2FycmF5KExPT1BDT1VOVCkKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBkX2FycmF5KExPT1BDT1VOVCkKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBkbWluLCBkbWF4CisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIHN1bSxwcm9kdWN0LGRpZmYsaSxkc3VtLGRkaWZmLGR0LGxvZ2ljX2FuZCwKKyAgICAgJiAgICBsb2dpY19vcixsb2dpY19lcXYsbG9naWNfbmVxdixsb2dpY3MsYml0X2FuZCxiaXRfb3IsaW50X2FycmF5LAorICAgICAmICAgIGV4Y2x1c2l2X2JpdF9vcixtaW5fdmFsdWUsZG1pbixkbWF4LGRfYXJyYXksbWF4X3ZhbHVlCisgICAgICAgIElOVEVHRVIgTUFYX0ZBQ1RPUgorICAgICAgICBQQVJBTUVURVIgKGRvdWJsZV9ESUdJVFM9MjAsTUFYX0ZBQ1RPUj0xMCkKKzwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICAgICAgZHQgPSAxLi8zLgorICAgICAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDIKKyAgICAgICAgcHJvZHVjdCA9IDEKKyAgICAgICAgc3VtMiA9IDAKKyAgICAgICAgc3VtID0gMAorICAgICAgICBkc3VtID0gMC4KKyAgICAgICAgcmVzdWx0ID0wIAorICAgICAgICBsb2dpY19hbmQgPSAudHJ1ZS4KKyAgICAgICAgbG9naWNfb3IgPSAuZmFsc2UuCisgICAgICAgIGJpdF9hbmQgPSAxCisgICAgICAgIGJpdF9vciA9IDAKKyAgICAgICAgZXhjbHVzaXZfYml0X29yID0gMAorISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLCAxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCs6c3VtKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKyAgICAgICAgICBzdW0gPSBzdW0gKyBpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGIChrbm93bl9zdW0gLk5FLiBzdW0pIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gc3VtIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgIiwKKyAgICAgJiAgICBzdW0sImluc3RlYWQgb2YgIiwga25vd25fc3VtCisgICAgICAgIEVORCBJRgorCisKKyAgICAgICAgZGlmZiA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMgorISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLCAxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uICgtOiBkaWZmKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKyAgICAgICAgICBkaWZmID0gZGlmZiAtIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisgIAorICAgICAgICBJRiAoIGRpZmYgLk5FLiAwICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBkaWZmZXJlbmNlIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgIiwKKyAgICAgJiAgICBzdW0sImluc3RlYWQgb2YgMC4iCisgICAgICAgIEVORCBJRgorCishLi4uIFRlc3QgZm9yIGRvdWJsZXMKKyAgICAgICAgZHN1bSA9MC4KKyAgICAgICAgZHB0ID0gMQorCisgICAgICAgIERPIGk9MSwgRE9VQkxFX0RJR0lUUworICAgICAgICAgIGRwdD0gZHB0ICogZHQKKyAgICAgICAgRU5EIERPCisgICAgICAgIGRrbm93bl9zdW0gPSAoMS1kcHQpLygxLWR0KQorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigrOmRzdW0pPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaT0wLERPVUJMRV9ESUdJVFMtMQorICAgICAgICAgIGRzdW0gPSBkc3VtICsgZHQqKmkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAKKyAgICAgICAgSUYoZHN1bSAuTkUuIGRrbm93bl9zdW0gLkFORC4gCisgICAgICYgICAgIEFCUyhkc3VtIC0gZGtub3duX3N1bSkgLkdULiByb3VuZGluZ19lcnJvciApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gc3VtIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgICAgIGRzdW0sImluc3RlYWQgb2YgIixka25vd25fc3VtLCIoRGlmZmVyZW5jZTogIiwKKyAgICAgJiAgICAgICBkc3VtIC0gZGtub3duX3N1bSwiKSIKKyAgICAgICAgRU5EIElGCisgICAgICAgIGRwdCA9IDEKKworCisgICAgICAKKyAgICAgICAgRE8gaT0xLCBET1VCTEVfRElHSVRTCisgICAgICAgICAgIGRwdCA9IGRwdCpkdAorICAgICAgICBFTkQgRE8KKyAgICAgICAgZGRpZmYgPSAoIDEtZHB0KS8oMS1kdCkKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC06ZGRpZmYpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaT0wLCBET1VCTEVfRElHSVRTLTEKKyAgICAgICAgICBkZGlmZiA9IGRkaWZmIC0gZHQqKmkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBBQlMoZGRpZmYpIC5HVC4gcm91bmRpbmdfZXJyb3IgKSBUSEVOCisgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gRGlmZmVyZW5jZSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgIiwKKyAgICAgJiAgICAgICBkZGlmZiwiaW5zdGVhZCBvZiAwLjAiCisgICAgICAgIEVORCBJRgorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigqOnByb2R1Y3QpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaT0xLE1BWF9GQUNUT1IKKyAgICAgICAgICAgcHJvZHVjdCA9IHByb2R1Y3QgKiBpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGIChrbm93bl9wcm9kdWN0IC5ORS4gcHJvZHVjdCkgVEhFTgorICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgIHdyaXRlKDEsKikgIkVycm9yIGluIFByb2R1Y3Qgd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgICAgIHByb2R1Y3QsIiBpbnN0ZWFkIG9mIixrbm93bl9wcm9kdWN0IAorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgbG9naWNzKGkpID0gLlRSVUUuCisgICAgICAgIEVORCBETworCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiguQU5ELjpsb2dpY19hbmQpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgIGxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAuQU5ELiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKC5OT1QuIGxvZ2ljX2FuZCkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworCisgICAgICAgIGxvZ2ljX2FuZCA9IC5UUlVFLgorICAgICAgICBsb2dpY3MoTE9PUENPVU5ULzIpID0gLkZBTFNFLgorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiguQU5ELjpsb2dpY19hbmQpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgIGxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAuQU5ELiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKGxvZ2ljX2FuZCkgVEhFTgorICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIEFORCBwYXNzIDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICBsb2dpY3MoaSkgPSAuRkFMU0UuCisgICAgICAgIEVORCBETworCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiguT1IuOmxvZ2ljX29yKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKyAgICAgICAgICAgbG9naWNfb3IgPSBsb2dpY19vciAuT1IuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAobG9naWNfb3IpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBsb2dpY19vciA9IC5GQUxTRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5UUlVFLgorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiguT1IuOmxvZ2ljX29yKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICAgbG9naWNfb3IgPSBsb2dpY19vciAuT1IuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIC5OT1QuIGxvZ2ljX29yICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCishLi4uIFRlc3QgbG9naWMgRVFWLCB1bmlxdWUgaW4gRm9ydHJhbgorICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgbG9naWNzKGkpID0gLlRSVUUuCisgICAgICAgIEVORCBETworCisgICAgICAgIGxvZ2ljX2VxdiA9IC5UUlVFLgorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiguRVFWLjpsb2dpY19lcXYpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorICAgICAgICAgICBsb2dpY19lcXYgPSBsb2dpY19lcXYgLkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICguTk9ULiBsb2dpY19lcXYpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgRVFWIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgbG9naWNfZXF2ID0gLlRSVUUuCisgICAgICAgIGxvZ2ljcyhMT09QQ09VTlQvMikgPSAuRkFMU0UuCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5FUVYuOmxvZ2ljX2Vxdik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgIGxvZ2ljX2VxdiA9IGxvZ2ljX2VxdiAuRVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBsb2dpY19lcXYgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIEVRViBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCishLi4uIFRlc3QgbG9naWMgTkVRViwgd2hpY2ggaXMgdW5pcXVlIGluIEZvcnRyYW4KKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgIGxvZ2ljcyhpKSA9IC5GQUxTRS4KKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgbG9naWNfbmVxdiA9IC5GQUxTRS4KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLk5FUVYuOmxvZ2ljX25lcXYpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorICAgICAgICAgICBsb2dpY19uZXF2ID0gbG9naWNfbmVxdiAuTkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGIChsb2dpY19uZXF2KSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIE5FUVYgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBsb2dpY19uZXF2ID0gLkZBTFNFLgorICAgICAgICBsb2dpY3MoTE9PUENPVU5ULzIpID0gLlRSVUUuCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5uZXF2Ljpsb2dpY19uZXF2KTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICAgbG9naWNfbmVxdiA9IGxvZ2ljX25lcXYgLk5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIC5OT1QuIGxvZ2ljX25lcXYgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIE5FUVYgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgICBpbnRfYXJyYXkoaSkgPSAxCisgICAgICAgIEVORCBETworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oSUFORDpiaXRfYW5kKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCishLi4uIGlhbmQoSSxKKTogUmV0dXJucyB2YWx1ZSByZXN1bHRpbmcgZnJvbSBib29sZWFuIEFORCBvZiAKKyEuLi4gcGFpciBvZiBiaXRzIGluIGVhY2ggb2YgSSBhbmQgSi4gCisgICAgICAgICAgYml0X2FuZCA9IElBTkQoYml0X2FuZCxpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggYml0X2FuZCAuTFQuIDEgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIElBTkQgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBiaXRfYW5kID0gMQorICAgICAgICBpbnRfYXJyYXkoTE9PUENPVU5ULzIpID0gMAorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihJQU5EOmJpdF9hbmQpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBiaXRfYW5kID0gSUFORCAoIGJpdF9hbmQsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGKCBiaXRfYW5kIC5HRS4gMSkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJQU5EIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBpbnRfYXJyYXkoaSkgPSAwCisgICAgICAgIEVORCBETworCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKElPUjpiaXRfb3IpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyEuLi4gSW9yKEksSik6IFJldHVybnMgdmFsdWUgcmVzdWx0aW5nIGZyb20gYm9vbGVhbiBPUiBvZiAKKyEuLi4gcGFpciBvZiBiaXRzIGluIGVhY2ggb2YgSSBhbmQgSi4gCisgICAgICAgICAgYml0X29yID0gSU9SKGJpdF9vciwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBiaXRfb3IgLkdFLiAxKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIElvciBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisKKyAgICAgICAgYml0X29yID0gMAorICAgICAgICBpbnRfYXJyYXkoTE9PUENPVU5ULzIpID0gMQorISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oSU9SOmJpdF9vcik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgIGJpdF9vciA9IElPUihiaXRfb3IsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggYml0X29yIC5MRS4gMCkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJb3IgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgIGludF9hcnJheShpKSA9IDAKKyAgICAgICAgRU5EIERPCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKElFT1I6ZXhjbHVzaXZfYml0X29yKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKyAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBpZW9yKGV4Y2x1c2l2X2JpdF9vciwgaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGV4Y2x1c2l2X2JpdF9vciAuZ2UuIDEpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSWVvciBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IDAKKyAgICAgICAgaW50X2FycmF5KExPT1BDT1VOVC8yKSA9IDEKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oSUVPUjpleGNsdXNpdl9iaXRfb3IpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorICAgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IElFT1IoZXhjbHVzaXZfYml0X29yLCBpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggZXhjbHVzaXZfYml0X29yIC5MRS4gMCkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJZW9yIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgIGludF9hcnJheShpKSA9IDEwIC0gaQorICAgICAgICBFTkQgRE8KKworICAgICAgICBtaW5fdmFsdWUgPSA2NTUzNQorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihNSU46bWluX3ZhbHVlKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKyAgICAgICAgICBtaW5fdmFsdWUgPSBNSU4obWluX3ZhbHVlLGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggbWluX3ZhbHVlIC5HVC4gKDEwLUxPT1BDT1VOVCkgKVRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gaW50ZWdlciBNSU4iCisgICAgICAgIEVORCBJRgorCisKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgICBpbnRfYXJyYXkoaSkgPSBpCisgICAgICAgIEVORCBETworCisgICAgICAgIG1heF92YWx1ZSA9IC0zMjc2OAorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihNQVg6bWF4X3ZhbHVlKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKyAgICAgICAgICBtYXhfdmFsdWUgPSBNQVgobWF4X3ZhbHVlLGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggbWF4X3ZhbHVlIC5MVC4gTE9PUENPVU5UIClUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGludGVnZXIgTUFYIgorICAgICAgICBFTkQgSUYKKworIS4uLiB0ZXN0IGRvdWJsZSBtaW4sIG1heAorICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgIGRfYXJyYXkoaSkgPSAxMCAtIGkqZHQKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgZG1pbiA9IDIqKjEwCisgICAgICAgIGR0ID0gMC41CisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKE1JTjpkbWluKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKyAgICAgICAgICAgIGRtaW49IE1JTihkbWluLGRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGRtaW4gLkdULiAoMTAtZHQpIClUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGRvdWJsZSBNSU4iCisgICAgICAgIEVORCBJRgorCisKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgICBkX2FycmF5KGkpID0gaSAqIGR0CisgICAgICAgIEVORCBETworCisgICAgICAgIGRtYXg9IC0gKDIqKjEwKQorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihNQVg6ZG1heCk8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgICBkbWF4PSBNQVgoZG1heCxkX2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBkbWF4IC5MVC4gTE9PUENPVU5UKmR0IClUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGRvdWJsZSBNQVgiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIElGICggcmVzdWx0IC5FUS4gMCApIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gIDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAgMAorICAgICAgICBFTkQgSUYKKworICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fc2NoZWR1bGVfZHluYW1pYy5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fc2NoZWR1bGVfZHluYW1pYy5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZjhiYTcKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9kb19zY2hlZHVsZV9keW5hbWljLmYKQEAgLTAsMCArMSw5MCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBkeW5hbWljIG9wdGlvbiBvZiB0aGUgb21wIGRvIHNjaGVkdWxlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGRvIHNjaGVkdWxlKGR5bmFtaWMpPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGZsdXNoLG9tcCBkbyBub3dhaXQsb21wIGNyaXRpY2FsLG9tcCBzaW5nbGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorCisKKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5kb19zY2hlZHVsZV9keW5hbWljPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBDSEFSQUNURVIqMzAgbG9nZmlsZQorICAgICAgICBJTlRFR0VSIG9tcF9nZXRfdGhyZWFkX251bSxvbXBfZ2V0X251bV90aHJlYWRzCisgICAgICAgIElOVEVHRVIgdGhyZWFkcworICAgICAgICBJTlRFR0VSIGNvdW50LCB0bXBfY291bnQKKyAgICAgICAgSU5URUdFUixBTExPQ0FUQUJMRTo6IHRtcCg6KQorICAgICAgICBJTlRFR0VSIGlpCisgICAgICAgIElOVEVHRVIgcmVzdWx0CisKKzxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBDRkRNQVhfU0laRQorICAgICAgICBQQVJBTUVURVIgKENGRE1BWF9TSVpFID0gMTAwMCkKKyAgICAgICAgSU5URUdFUiBpLHRpZHMoMDpDRkRNQVhfU0laRS0xKSx0aWQsY2h1bmtfc2l6ZQorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBpLHRpZHMsdGlkLGNodW5rX3NpemUKKzwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICAgICAgY2h1bmtfc2l6ZSA9IDcKKyAgICAgICAgY291bnQgPSAwCisgICAgICAgIHRtcF9jb3VudCA9IDAKKyAgICAgICAgcmVzdWx0ID0gMAorICAgICAgICBpaSA9IDAKKworISRvbXAgcGFyYWxsZWwgcHJpdmF0ZSh0aWQpCisgICAgICAgIHRpZCA9IG9tcF9nZXRfdGhyZWFkX251bSgpCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gPG9tcHRzOmNoZWNrPnNjaGVkdWxlKGR5bmFtaWMsY2h1bmtfc2l6ZSk8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpPTAsIENGRE1BWF9TSVpFLTEKKyAgICAgICAgICB0aWRzKGkpID0gdGlkCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIERPIGk9MCwgQ0ZETUFYX1NJWkUgLSAyCisgICAgICAgICAgSUYgKCB0aWRzKGkpIC5uZS4gdGlkcyhpKzEpICkgVEhFTgorICAgICAgICAgICAgY291bnQgPSBjb3VudCArIDEKKyAgICAgICAgICBFTkQgSUYKKyAgICAgICAgRU5EIERPCisgCisgICAgICAgIEFMTE9DQVRFKCB0bXAoMDpjb3VudCkgKQorICAgICAgICB0bXAoMCkgPSAxCisgCisgICAgICAgIERPIGkgPSAwLCBDRkRNQVhfU0laRSAtIDIKKyAgICAgICAgICBJRiAoIHRtcF9jb3VudCAuR1QuIGNvdW50ICkgVEhFTgorICAgICAgICAgICAgV1JJVEUoKiwqKSAiLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisgICAgICAgICAgICBXUklURSgqLCopICJUZXN0aW50ZXJuYWwgRXJyb3I6IExpc3QgdG9vIHNtYWxsISEhIgorICAgICAgICAgICAgV1JJVEUoKiwqKSAiLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisgICAgICAgICAgICBHT1RPIDEwCisgICAgICAgICAgRU5EIElmCisgICAgICAgICAgSUYgKCB0aWRzKGkpIC5ORS4gdGlkcyhpKzEpICkgdGhlbgorICAgICAgICAgICAgdG1wX2NvdW50ID0gdG1wX2NvdW50ICsgMQorICAgICAgICAgICAgdG1wKHRtcF9jb3VudCkgPSAxCisgICAgICAgICAgRUxTRQorICAgICAgICAgICAgdG1wKHRtcF9jb3VudCkgPSB0bXAodG1wX2NvdW50KSArMQorICAgICAgICAgIEVORCBJRiAKKyAgICAgICAgRU5EIERPICAgICAgICAgIAorCishLi4uIGlzIGR5bmFtaWMgc3RhdGVtZW50IHdvcmtpbmc/IAorCisgMTAgICAgIERPIGk9MCwgY291bnQgLTEKKyAgICAgICAgICBJRiAoIE1PRCh0bXAoaSksY2h1bmtfc2l6ZSkgLm5lLiAwICkgVEhFTgorISAuLi4gaXQgaXMgcG9zc2libGUgZm9yIDIgYWRqYWNlbnQgY2h1bmtzIGFzc2lnbmVkIHRvIGEgc2FtZSB0aHJlYWQgCisgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgICBXUklURSgxLCopICJUaGUgaW50ZXJtZWRpYXRlIGRpc3BhdGNoIGhhcyB3cm9uZyBjaHVua3NpemUuIgorICAgICAgICAgIEVORCBJRgorICAgICAgICBFTkQgRE8KKworICAgICAgICBJRiAoIE1PRCh0bXAoY291bnQpLCBjaHVua19zaXplKSAuTkUuIAorICAgICAmICAgICBNT0QgKENGRE1BWF9TSVpFLCBjaHVua19zaXplKSApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAidGhlIGxhc3QgZGlzcGF0Y2ggaGFzIHdyb25nIGNodW5rc2l6ZS4iCisgICAgICAgIEVORCBJRgorICAgICAgICAgCisgICAgICAgIElGICggcmVzdWx0IC5lcS4gMCkgVEhFTgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX3NjaGVkdWxlX2d1aWRlZC5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fc2NoZWR1bGVfZ3VpZGVkLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQwZTdlZAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX3NjaGVkdWxlX2d1aWRlZC5mCkBAIC0wLDAgKzEsMTc0IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIGd1aWRlZCBvcHRpb24gb2YgdGhlIG9tcCBkbyBzY2hlZHVsZSBkaXJlY3RpdmUuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBkbyBzY2hlZHVsZShndWlkZWQpPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGZsdXNoLG9tcCBkbyBub3dhaXQsb21wIGNyaXRpY2FsLG9tcCBzaW5nbGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAhIFRPRE86CisgICEgQy4gTmlldGhhbW1lcjoKKyAgISAgICAgICBGaW5kIGNoZWNrIHRvIGRlY2lkZSBpZiB0aGUgdGVzdCB3YXMgcnVuIGFzIHNjaGVkdWxlKHN0YXRpYykgYmVjYXVzZQorICAhICAgICAgIHRoaXMgYWxzbyBjYW4gcGFzcyB0aGUgdGVzdCBpZiB0aGUgd29yayBpcyBkaXZpZGVkIGludG8gdGhyZWFkLWNvdW50cyAKKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5kb19zY2hlZHVsZV9ndWlkZWQ8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgb21wX2dldF90aHJlYWRfbnVtLG9tcF9nZXRfbnVtX3RocmVhZHMKKyAgICAgICAgQ0hBUkFDVEVSKjIwIGxvZ2ZpbGUKKyAgICAgICAgSU5URUdFUiB0aHJlYWRzCisgICAgICAgIElOVEVHRVIgdG1wX2NvdW50CisgICAgICAgIElOVEVHRVIsIGFsbG9jYXRhYmxlIDo6IHRtcCg6KQorICAgICAgICBJTlRFR0VSIGlpLCBmbGFnCisgICAgICAgIElOVEVHRVIgcmVzdWx0CisgICAgICAgIElOVEVHRVIgZXhwZWN0ZWQKKyAgICAgICAgSU5URUdFUiBvcGVud29yaworICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIGMKKworICAgICAgICAgICAgICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBpCisgICAgICAgIElOVEVHRVIgdGlkCisgICAgICAgIElOVEVHRVIgY291bnQKKworICAgICAgICBJTlRFR0VSIERFTEFZIAorICAgICAgICBJTlRFR0VSIE1BWF9USU1FCisgICAgICAgIElOVEVHRVIgQ0ZTTUFYX1NJWkUKKworISAuLi4gY2hvb3NlIHNtYWxsIGl0ZXJhdGlvbiBzcGFjZSBmb3Igc21hbGwgc3luYy4gb3ZlcmhlYWQKKyAgICAgICAgUEFSQU1FVEVSIChERUxBWSA9IDEpCisgICAgICAgIFBBUkFNRVRFUiAoTUFYX1RJTUUgPSA1KQorICAgICAgICBQQVJBTUVURVIgKENGU01BWF9TSVpFID0gMTUwKQorCisgICAgICAgIElOVEVHRVIgbm90b3V0CisgICAgICAgIElOVEVHRVIgbWF4aXRlcgorICAgICAgICBJTlRFR0VSIHRpZHMoMDpDRlNNQVhfU0laRS0xKQorCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIG5vdG91dCxtYXhpdGVyLHRpZHMKKyAgICAgICAgICAgICAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgICAgIHJlc3VsdCA9IDAKKyAgICAgICAgbm90b3V0ID0gMQorICAgICAgICBtYXhpdGVyID0gMAorICAgICAgICBjb3VudCA9IDAKKyAgICAgICAgdG1wX2NvdW50ID0gMAorICAgICAgICBvcGVud29yayA9IENGU01BWF9TSVpFCis8b21wdHM6Y2hlY2s+CisKKyEgRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIHRocmVhZHMKKyEkb21wIHBhcmFsbGVsIAorISRvbXAgc2luZ2xlCisgICAgICAgIHRocmVhZHMgPSBvbXBfZ2V0X251bV90aHJlYWRzKCkKKyEkb21wIGVuZCBzaW5nbGUKKyEkb21wIGVuZCBwYXJhbGxlbAorICAgICAgICBJRiAoIHRocmVhZHMgLkxULiAyKSBUSEVOCisgICAgICAgICAgUFJJTlQgKiwiVGhpcyB0ZXN0IG9ubHkgd29ya3Mgd2l0aCBhdCBsZWFzdCB0d28gdGhyZWFkcyIKKyAgICAgICAgICBXUklURSgxLCopICJUaGlzIHRlc3Qgb25seSB3b3JrcyB3aXRoIGF0IGxlYXN0IHR3byB0aHJlYWRzIgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgICAgU1RPUAorICAgICAgICBFTkQgSUYKKworISAuLi4gTm93IHRoZSByZWFsIHBhcmFsbGVsIHdvcms6CishIC4uLiBFYWNoIHRocmVhZCB3aWxsIHN0YXJ0IGltbWVkaWF0ZWx5IHdpdGggdGhlIGZpcnN0IGNodW5rLgorICAgIAorISRvbXAgcGFyYWxsZWwgcHJpdmF0ZSh0aWQsY291bnQpIHNoYXJlZCh0aWRzLG1heGl0ZXIpCisgICAgICAgIHRpZCA9IG9tcF9nZXRfdGhyZWFkX251bSgpCisgICAgICAgIDxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShndWlkZWQpCisgICAgICAgIERPIGkgPSAwICwgQ0ZTTUFYX1NJWkUtMQorICAgICAgICAgIGNvdW50ID0gMAorISRvbXAgZmx1c2gobWF4aXRlcikKKyAgICAgICAgICBJRiAoIGkgLkdULiBtYXhpdGVyICkgVEhFTiAgICAgICAgICAgICAgICAgCishJG9tcCBjcml0aWNhbAorICAgICAgICAgICAgbWF4aXRlciA9IGkKKyEkb21wIGVuZCBjcml0aWNhbAorICAgICAgICAgIEVORCBJRgorCishLi4gICAgICAgICBpZiBpdCBpcyBub3Qgb3VyIHR1cm4gd2Ugd2FpdAorISAgICAgICAgICAgYSkgdW50aWwgYW5vdGhlciB0aHJlYWQgZXhlY3V0ZWQgYW4gaXRlcmF0aW9uCishICAgICAgICAgICB3aXRoIGEgaGlnaGVyIGl0ZXJhdGlvbiBjb3VudAorISAgICAgICAgICAgYikgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGxvb3AgKGZpcnN0IHRocmVhZCBmaW5pc2hlZAorISAgICAgICAgICAgICBhbmQgc2V0IG5vdG91dD0wIE9SCishICAgICAgICAgICBjKSB0aW1lb3V0IGFycml2ZWQgCisKKyEkb21wIGZsdXNoKG1heGl0ZXIsbm90b3V0KQorICAgICAgICAgIElGICggbm90b3V0IC5HRS4gMSAuQU5ELiBjb3VudCAuTFQuIE1BWF9USU1FCisgICAgICYgICAgICAgICAuQU5ELiBtYXhpdGVyIC5FUS4gaSApIFRIRU4KKyAgICAgICAgICAgICAgRE8gV0hJTEUgKCBub3RvdXQgLkdFLiAxIC5BTkQuIGNvdW50IC5MVC4gTUFYX1RJTUUKKyAgICAgJiAgICAgICAgICAuQU5ELiBtYXhpdGVyIC5FUS4gaSApCisgICAgICAgICAgICAgICAgQ0FMTCBzbGVlcChERUxBWSkKKyAgICAgICAgICAgICAgICBjb3VudCA9IGNvdW50ICsgREVMQVkKKyAgICAgICAgICAgICAgRU5EIERPICAgICAgICAgCisgICAgICAgICAgRU5EIElGCisgICAgICAgICAgIHRpZHMoaSkgPSB0aWQKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8gbm93YWl0CisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorCisgICAgICAgIG5vdG91dCA9IDAKKyEkb21wIGZsdXNoKG5vdG91dCkKKworISRvbXAgZW5kIHBhcmFsbGVsIAorCishKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEKKyEgZXZhbHVhdGlvbiBvZiB0aGUgdmFsdWVzCishKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEKKyAgICAgICAgY291bnQgPSAwCisKKyAgICAgICAgRE8gaT0wLCBDRlNNQVhfU0laRSAtIDIKKyAgICAgICAgICBJRiAoIHRpZHMoaSkgLk5FLiB0aWRzKGkrMSkgKSBUSEVOCisgICAgICAgICAgICBjb3VudCA9IGNvdW50ICsgMQorICAgICAgICAgIEVORCBJRgorICAgICAgICBFTkQgRE8KKworICAgICAgICBBTExPQ0FURSggdG1wKDA6Y291bnQpICApCisgICAgICAgIHRtcF9jb3VudCA9IDAKKyAgICAgICAgdG1wKDApID0gMQorISAuLi4gY2FsY3VsYXRlIHRoZSBjaHVua3NpemUgZm9yIGVhY2ggZGlzcGF0Y2gKKworICAgICAgICBETyBpPTAsIENGU01BWF9TSVpFIC0gMgorICAgICAgICAgIElGICggdGlkcyhpKSAuRVEuIHRpZHMoaSsxKSApIFRIRU4KKyAgICAgICAgICAgdG1wKHRtcF9jb3VudCkgPSB0bXAodG1wX2NvdW50KSArIDEKKyAgICAgICAgICBFTFNFCisgICAgICAgICAgICB0bXBfY291bnQgPSB0bXBfY291bnQgKyAxCisgICAgICAgICAgICB0bXAodG1wX2NvdW50KSA9IDEKKyAgICAgICAgICBFTkQgSUYKKyAgICAgICAgRU5EIERPCisKKyEgLi4uIENoZWNrIGlmIGNodW5rIHNpemVzIGFyZSBkZWNyZWFzZWQgdW50aWwgZXF1YWxzIHRvIAorISAuLi4gdGhlIHNwZWNpZmllZCBvbmUsIGlnbm9yZSB0aGUgbGFzdCBkaXNwYXRjaCAKKyEgLi4uIGZvciBwb3NzaWJsZSBzbWFsbGVyIHJlbWFpbmRlcgorCishIERldGVybWluZSB0aGUgY29uc3RhbnQgCisgICAgICAgIGV4cGVjdGVkID0gb3BlbndvcmsgLyB0aHJlYWRzCisgICAgICAgIGMgPSByZWFsKHRtcCgwKSkgLyByZWFsKGV4cGVjdGVkKQorICAgICAgICBXUklURSgxLCopICJGb3VuZCBjb25zdGFudCB0byBiZSAiLCBjCisKKyAgICAgICAgRE8gaSA9IDAsIGNvdW50IC0gMgorICAgICAgICAgIFdSSVRFKDEsKikgIm9wZW46Iiwgb3BlbndvcmssICJzaXplOiIsIHRtcChpKQorICAgICAgICAgIElGIChleHBlY3RlZCAuR1QuIDEpIFRIRU4KKyAgICAgICAgICAgIGV4cGVjdGVkID0gYyAqIG9wZW53b3JrIC8gdGhyZWFkcworICAgICAgICAgIEVORCBJRgorCisgICAgICAgICAgSUYgKGFicyh0bXAoaSkgLSBleHBlY3RlZCkgLkdFLiAyICkgVEhFTgorICAgICAgICAgICAgcmVzdWx0ID0gMQorICAgICAgICAgICAgV1JJVEUoMSwqKSAiQ2h1bmtzaXplIGRpZmZlcmVkIGZyb20gZXhwZWN0ZWQgIiwKKyAgICAgJiAgICAgICAgICJ2YWx1ZTogIix0bXAoaSksICJpbnN0ZWFkICIsIGV4cGVjdGVkCisgICAgICAgICAgRU5EIElGCisKKyAgICAgICAgICBJRiAoaSAuR1QuIDAgLkFORC4gKHRtcChpLTEpIC0gdG1wKGkpKSAuTFQuIDApIFRIRU4KKyAgICAgICAgICAgIFdSSVRFKDEsKikgIkNodW5rc2l6ZSBkaWQgbm90IGRlY3JlYXNlOiAiLCB0bXAoaSksCisgICAgICYgICAgICAgICAiaW5zdGVhZCIsdG1wKGktMSkKKyAgICAgICAgICBFTkQgSUYKKworICAgICAgICAgIG9wZW53b3JrID0gb3BlbndvcmsgLSB0bXAoaSkgIAorICAgICAgICBFTkQgRE8KKworICAgICAgICBJRiAoIHJlc3VsdCAuRVEuIDAgKSBUSEVOCisgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxIAorICAgICAgICBFTFNFCisgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5ECis8L29tcHRzOmNoZWNrPgorPG9tcHRzOmNyb3NzY2hlY2s+CisgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgRU5ECis8L29tcHRzOmNyb3NzY2hlY2s+Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXRwczp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fc2NoZWR1bGVfc3RhdGljLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9kb19zY2hlZHVsZV9zdGF0aWMuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWIwMmY4Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fc2NoZWR1bGVfc3RhdGljLmYKQEAgLTAsMCArMSw3MCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBzdGF0aWMgb3B0aW9uIG9mIHRoZSBvbXAgZG8gc2NoZWR1bGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZG8gc2NoZWR1bGUoc3RhdGljKTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBkbyBub3dhaXQsb21wIGZsdXNoLG9tcCBjcml0aWNhbCxvbXAgc2luZ2xlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKworICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPmRvX3NjaGVkdWxlX3N0YXRpYzwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBvbXBfZ2V0X3RocmVhZF9udW0sb21wX2dldF9udW1fdGhyZWFkcworICAgICAgICBDSEFSQUNURVIqMzAgbG9nZmlsZQorICAgICAgICBJTlRFR0VSIHRocmVhZHMKKyAgICAgICAgSU5URUdFUiBjb3VudAorICAgICAgICBJTlRFR0VSIGlpCisgICAgICAgIElOVEVHRVIgcmVzdWx0Cis8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgQ0ZTTUFYX1NJWkUKKyAgICAgICAgUEFSQU1FVEVSIChDRlNNQVhfU0laRSA9IDEwMDApCisgICAgICAgIElOVEVHRVIgaSx0aWRzKDA6Q0ZTTUFYX1NJWkUtMSksIHRpZCwgY2h1bmtfc2l6ZQorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBpLHRpZCx0aWRzLGNodW5rX3NpemUKKzwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICAgICAgY2h1bmtfc2l6ZSA9IDcKKyAgICAgICAgcmVzdWx0ID0gMAorICAgICAgICBpaSA9IDAKKworISRvbXAgcGFyYWxsZWwgCishJG9tcCBzaW5nbGUKKyAgICAgICAgdGhyZWFkcyA9IG9tcF9nZXRfbnVtX3RocmVhZHMoKQorISRvbXAgZW5kIHNpbmdsZQorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCB0aHJlYWRzIC5MVC4gMikgVEhFTgorICAgICAgICAgIFBSSU5UICosIlRoaXMgdGVzdCBvbmx5IHdvcmtzIHdpdGggYXQgbGVhc3QgdHdvIHRocmVhZHMiCisgICAgICAgICAgV1JJVEUoMSwqKSAiVGhpcyB0ZXN0IG9ubHkgd29ya3Mgd2l0aCBhdCBsZWFzdCB0d28gdGhyZWFkcyIKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICAgIFNUT1AKKyAgICAgICAgRUxTRQorICAgICAgICAgIFdSSVRFKDEsKikgIlVzaW5nIGFuIGludGVybmFsIGNvdW50IG9mICIsQ0ZTTUFYX1NJWkUKKyAgICAgICAgICBXUklURSgxLCopICJVc2luZyBhIHNwZWNpZmllZCBjaHVua3NpemUgb2YgIixjaHVua19zaXplCisgICAgCishJG9tcCBwYXJhbGxlbCBwcml2YXRlKHRpZCkgc2hhcmVkKHRpZHMpCisgICAgICAgICAgdGlkID0gb21wX2dldF90aHJlYWRfbnVtKCkKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyA8b21wdHM6Y2hlY2s+c2NoZWR1bGUoc3RhdGljLGNodW5rX3NpemUpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICBETyBpID0gMCAsQ0ZTTUFYX1NJWkUgLTEKKyAgICAgICAgICAgIHRpZHMoaSkgPSB0aWQKKyAgICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICAgIERPIGkgPSAwLCBDRlNNQVhfU0laRS0xCishLi4uIHJvdW5kLXJvYmluIGZvciBzdGF0aWMgY2h1bmsKKyAgICAgICAgICAgIGlpID0gbW9kKCBpL2NodW5rX3NpemUsdGhyZWFkcykKKyAgICAgICAgICAgIElGICh0aWRzKGkpIC5ORS4gaWkgKSBUSEVOCisgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICAgICAgV1JJVEUoMSwqKSJJdGVyYXRpb24gIixpLCJzaG91bGQgYmUgYXNzaWduZWQgdG8gIiwKKyAgICAgJiAgICAgICAgICAgaWksImluc3RlYWQgb2YgIix0aWRzKGkpCisgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICBFTkQgRE8KKyAgICAgICAgICBJRiAoIHJlc3VsdCAuRVEuIDAgKVRIRU4KKyAgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgICAgRUxTRQorICAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgICBFTkQgSUYKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9oYXNfb3Blbm1wLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9oYXNfb3Blbm1wLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU4NWVmMgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL2hhc19vcGVubXAuZgpAQCAtMCwwICsxLDI1IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp2ZXJzaW9uPjIuMDwvb21wdHM6dmVyc2lvbj4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdGluZyBpZiB0aGUgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gaXMgc3VwcG9ydGVkIG9yIG5vdC4gIAorWWkgV2VuIGF0IDA1MDMyMDA0OiBEbyB3ZSB3YW50IHRvIHdyaXRlIHR3byB2ZXJzaW9ucyBvZiBoYXNfb21wPyAgYm90aCBDMjM0NTY3ODkgCithbmQgI2lmZGVmIGZvcm1hdHMgYXJlIHN1cHBvc2VkIHRvIHdvcmsuIEF0IGxlYXN0IFN1bidzIGNvbXBpbGVyIGNhbm5vdCBkZWFsIHdpdGggCit0aGUgc2Vjb25kIGZvcm1hdCAoI2lmZGVmKTwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorCis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+aGFzX29wZW5tcDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisKKzxvbXB0czpjaGVjaz4KKyF2ZXJzaW9uIDEuCishQzIzNDU2Nzg5IAorISQgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisKKyEgdmVyc2lvbiAyLgorISNpZmRlZiBfT1BFTk1QCisgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCishI2VuZGlmCis8L29tcHRzOmNoZWNrPgorCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfYXRvbWljLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfYXRvbWljLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU3NDQ1MAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9hdG9taWMuZgpAQCAtMCwwICsxLDU4OCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgYXRvbWljIGRpcmVjdGl2ZSBieSBjb3VudGluZyB1cCBhIHZhcmlhYmxlIGluIGEgcGFyYWxsZWxpemVkIGxvb3Agd2l0aCBhbiBhdG9taWMgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgYXRvbWljPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CishKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyEgRnVuY3Rpb25zOiBvbXBfYXRvbWljCishIGNoYW5nZSAiY2hhcmFjdGVyKjIwIiBpbnRvICJjaGFyYWN0ZXIgKExFTj0yMCk6OiIKKyEgZ2V0IHJpZCBvZiB0aGUgInRhYiIga2V5IGJ5IFpoZW55aW5nIExpdSwgb24gT2N0LiAxNiwgMjAwNS4KKyEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9hdG9taWM8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyAgICAgICAgSU5URUdFUiBzdW0yLCBrbm93bl9zdW0KKyAgICAgICAgSU5URUdFUiBrbm93bl9wcm9kdWN0LCBpbnRfY29uc3QKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiByb3VuZGluZ19lcnJvciwgZHB0CisgICAgICAgIElOVEVHRVIgZG91YmxlX0RJR0lUUworICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIGRrbm93bl9zdW0KKyAgICAgICAgSU5URUdFUiByZXN1bHQKKyAgICAgICAgUEFSQU1FVEVSIChpbnRfY29uc3Q9MTAsa25vd25fcHJvZHVjdD0zNjI4ODAwKQorICAgICAgICBQQVJBTUVURVIgKHJvdW5kaW5nX2Vycm9yPTEuRS0yKQorPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIHN1bSxpLGRpZmYscHJvZHVjdAorICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIGRzdW0sZHQsZGRpZmYKKyAgICAgICAgTE9HSUNBTCBsb2dpY19hbmQsIGxvZ2ljX29yLCBsb2dpY19lcXYsbG9naWNfbmVxdgorICAgICAgICBJTlRFR0VSIGJpdF9hbmQsIGJpdF9vcgorICAgICAgICBJTlRFR0VSIGV4Y2x1c2l2X2JpdF9vcgorICAgICAgICBJTlRFR0VSIG1pbl92YWx1ZSwgbWF4X3ZhbHVlCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZG1pbiwgZG1heAorICAgICAgICBMT0dJQ0FMIGxvZ2ljcyhMT09QQ09VTlQpCisgICAgICAgIElOVEVHRVIgaW50X2FycmF5KExPT1BDT1VOVCkKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBkX2FycmF5KExPT1BDT1VOVCkKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gc3VtLHByb2R1Y3QsZGlmZixpLGRzdW0sZGRpZmYsZHQsbG9naWNfYW5kLAorICAgICAmICAgIGxvZ2ljX29yLGxvZ2ljX2Vxdixsb2dpY19uZXF2LGxvZ2ljcyxiaXRfYW5kLGJpdF9vcixpbnRfYXJyYXksCisgICAgICYgICAgZXhjbHVzaXZfYml0X29yLG1pbl92YWx1ZSxkbWluLGRtYXgsZF9hcnJheSxtYXhfdmFsdWUKKyAgICAgICAgSU5URUdFUiBNQVhfRkFDVE9SCisgICAgICAgIFBBUkFNRVRFUiAoZG91YmxlX0RJR0lUUz0yMCxNQVhfRkFDVE9SPTEwKQorPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgICAgICBkdCA9IDEuLzMuCisgICAgICAgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMgorICAgICAgICBwcm9kdWN0ID0gMQorICAgICAgICBzdW0yID0gMAorICAgICAgICBzdW0gPSAwCisgICAgICAgIGRzdW0gPSAwLgorICAgICAgICByZXN1bHQgPTAgCisgICAgICAgIGxvZ2ljX2FuZCA9IC50cnVlLgorICAgICAgICBsb2dpY19vciA9IC5mYWxzZS4KKyAgICAgICAgYml0X2FuZCA9IDEKKyAgICAgICAgYml0X29yID0gMAorICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSAwCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIAorICAgICAgICBETyBpID0xLCBMT09QQ09VTlQKKzxvbXB0czpjaGVjaz4KKyEkb21wIGF0b21pYworPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICBzdW0gPSBzdW0gKyBpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGIChrbm93bl9zdW0gLk5FLiBzdW0pIFRIRU4KKyAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIHN1bSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICIsCisgICAgICYgICBzdW0sImluc3RlYWQgb2YgIiwga25vd25fc3VtCisgICAgICAgIEVORCBJZgorCisgICAgICAgIGRpZmYgPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDIKKworCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIAorICAgICAgICBETyBpID0xLCBMT09QQ09VTlQKKzxvbXB0czpjaGVjaz4KKyEkb21wIGF0b21pYworPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICBkaWZmID0gZGlmZiAtIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisgIAorICAgICAgICBJRiAoIGRpZmYgLk5FLiAwICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gZGlmZmVyZW5jZSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICIsCisgICAgICYgICBkaWZmLCJpbnN0ZWFkIG9mIDAuIgorICAgICAgICBFTkQgSUYKKworIS4uLiBUZXN0IGZvciBkb3VibGVzCisgICAgICAgIGRzdW0gPSAwLgorICAgICAgICBkcHQgPSAxCisKKyAgICAgICAgRE8gaT0xLCBET1VCTEVfRElHSVRTCisgICAgICAgICAgZHB0PSBkcHQgKiBkdAorICAgICAgICBFTkQgRE8KKyAgICAgICAgZGtub3duX3N1bSA9ICgxLWRwdCkvKDEtZHQpCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIAorICAgICAgICBETyBpPTAsRE9VQkxFX0RJR0lUUy0xCis8b21wdHM6Y2hlY2s+CishJG9tcCBhdG9taWMKKzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgIGRzdW0gPSBkc3VtICsgZHQqKmkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAKKyAgICAgICAgSUYgKGRzdW0gLk5FLiBka25vd25fc3VtIC5BTkQuIAorICAgICAmICAgICBBQlMoZHN1bSAtIGRrbm93bl9zdW0pIC5HVC4gcm91bmRpbmdfZXJyb3IgKSBUSEVOCisgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gc3VtIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgICAgIGRzdW0sImluc3RlYWQgb2YgIixka25vd25fc3VtLCIoRGlmZmVyZW5jZTogIiwKKyAgICAgJiAgICAgICBkc3VtIC0gZGtub3duX3N1bSwiKSIKKyAgICAgICAgRU5EIElGCisgICAgICAgIGRwdCA9IDEKKworICAgICAgCisgICAgICAgIERPIGk9MSwgRE9VQkxFX0RJR0lUUworICAgICAgICAgICBkcHQgPSBkcHQqZHQKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgZGRpZmYgPSAoIDEtZHB0KS8oMS1kdCkKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gCisgICAgICAgIERPIGk9MCwgRE9VQkxFX0RJR0lUUy0xCis8b21wdHM6Y2hlY2s+CishJG9tcCBhdG9taWMKKzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgZGRpZmYgPSBkZGlmZiAtIGR0KippCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggQUJTKGRkaWZmKSAuR1QuIHJvdW5kaW5nX2Vycm9yICkgVEhFTgorICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIERpZmZlcmVuY2Ugd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICIsCisgICAgICYgICAgICAgZGRpZmYsImluc3RlYWQgb2YgMC4wIgorICAgICAgICBFTkQgSUYKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaT0xLE1BWF9GQUNUT1IKKzxvbXB0czpjaGVjaz4KKyEkb21wIGF0b21pYworPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgcHJvZHVjdCA9IHByb2R1Y3QgKiBpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGIChrbm93bl9wcm9kdWN0IC5ORS4gcHJvZHVjdCkgVEhFTgorICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIFByb2R1Y3Qgd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgICAgIHByb2R1Y3QsIiBpbnN0ZWFkIG9mIixrbm93bl9wcm9kdWN0IAorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgbG9naWNzKGkpID0gLlRSVUUuCisgICAgICAgIEVORCBETworCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIAorICAgICAgICBETyBpPTEsTE9PUENPVU5UCis8b21wdHM6Y2hlY2s+CishJG9tcCBhdG9taWMKKzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgbG9naWNfYW5kID0gbG9naWNfYW5kIC5BTkQuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoLk5PVC4gbG9naWNfYW5kKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisKKyAgICAgICAgbG9naWNfYW5kID0gLlRSVUUuCisgICAgICAgIGxvZ2ljcyhMT09QQ09VTlQvMikgPSAuRkFMU0UuCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8KKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgIGxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAuQU5ELiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKGxvZ2ljX2FuZCkgVEhFTgorICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIEFORCBwYXNzIDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICBsb2dpY3MoaSkgPSAuRkFMU0UuCisgICAgICAgIEVORCBETworCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIAorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCis8b21wdHM6Y2hlY2s+CishJG9tcCBhdG9taWMKKzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgIGxvZ2ljX29yID0gbG9naWNfb3IgLk9SLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKGxvZ2ljX29yKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgbG9naWNfb3IgPSAuRkFMU0UuCisgICAgICAgIGxvZ2ljcyhMT09QQ09VTlQvMikgPSAuVFJVRS4KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgICBsb2dpY19vciA9IGxvZ2ljX29yIC5PUi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggLk5PVC4gbG9naWNfb3IgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyEuLi4gVGVzdCBsb2dpYyBFUVYsIHVuaXF1ZSBpbiBGb3J0cmFuCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICBsb2dpY3MoaSkgPSAuVFJVRS4KKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgbG9naWNfZXF2ID0gLlRSVUUuCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gCisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKzxvbXB0czpjaGVjaz4KKyEkb21wIGF0b21pYworPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgbG9naWNfZXF2ID0gbG9naWNfZXF2IC5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoLk5PVC4gbG9naWNfZXF2KSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIEVRViBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGxvZ2ljX2VxdiA9IC5UUlVFLgorICAgICAgICBsb2dpY3MoTE9PUENPVU5ULzIpID0gLkZBTFNFLgorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIAorICAgICAgICBETyBpPTEsTE9PUENPVU5UCis8b21wdHM6Y2hlY2s+CishJG9tcCBhdG9taWMKKzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgIGxvZ2ljX2VxdiA9IGxvZ2ljX2VxdiAuRVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBsb2dpY19lcXYgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIEVRViBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCishLi4uIFRlc3QgbG9naWMgTkVRViwgd2hpY2ggaXMgdW5pcXVlIGluIEZvcnRyYW4KKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgIGxvZ2ljcyhpKSA9IC5GQUxTRS4KKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgbG9naWNfbmVxdiA9IC5GQUxTRS4KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgICBsb2dpY19uZXF2ID0gbG9naWNfbmVxdiAuT1IuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAobG9naWNfbmVxdikgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBORVFWIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgbG9naWNfbmVxdiA9IC5GQUxTRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5UUlVFLgorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIAorICAgICAgICBETyBpPTEsTE9PUENPVU5UCis8b21wdHM6Y2hlY2s+CishJG9tcCBhdG9taWMKKzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgIGxvZ2ljX25lcXYgPSBsb2dpY19uZXF2IC5PUi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggLk5PVC4gbG9naWNfbmVxdiApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgTkVRViBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgaW50X2FycmF5KGkpID0gMQorICAgICAgICBFTkQgRE8KKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCishLi4uIGlhbmQoSSxKKTogUmV0dXJucyB2YWx1ZSByZXN1bHRpbmcgZnJvbSBib29sZWFuIEFORCBvZiAKKyEuLi4gcGFpciBvZiBiaXRzIGluIGVhY2ggb2YgSSBhbmQgSi4gCis8b21wdHM6Y2hlY2s+CishJG9tcCBhdG9taWMKKzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgYml0X2FuZCA9IElBTkQoYml0X2FuZCxpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggYml0X2FuZCAuTFQuIDEgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIElBTkQgcGFydCAxIgorICAgICAgICBFTkQgSWYKKworICAgICAgICBiaXRfYW5kID0gMQorICAgICAgICBpbnRfYXJyYXkoTE9PUENPVU5ULzIpID0gMAorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIAorICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgIGJpdF9hbmQgPSBJQU5EICggYml0X2FuZCwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYoIGJpdF9hbmQgLkdFLiAxKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIElBTkQgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgIGludF9hcnJheShpKSA9IDAKKyAgICAgICAgRU5EIERPCisKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyEuLi4gSW9yKEksSik6IFJldHVybnMgdmFsdWUgcmVzdWx0aW5nIGZyb20gYm9vbGVhbiBPUiBvZiAKKyEuLi4gcGFpciBvZiBiaXRzIGluIGVhY2ggb2YgSSBhbmQgSi4gCis8b21wdHM6Y2hlY2s+CishJG9tcCBhdG9taWMKKzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgYml0X29yID0gSW9yKGJpdF9vciwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBiaXRfb3IgLkdFLiAxKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIElvciBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisKKyAgICAgICAgYml0X29yID0gMAorICAgICAgICBpbnRfYXJyYXkoTE9PUENPVU5ULzIpID0gMQorISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKzxvbXB0czpjaGVjaz4KKyEkb21wIGF0b21pYworPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICBiaXRfb3IgPSBJT1IoYml0X29yLCBpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGJpdF9vciAubGUuIDApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSW9yIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBpbnRfYXJyYXkoaSkgPSAwCisgICAgICAgIEVORCBETworCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIAorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCis8b21wdHM6Y2hlY2s+CishJG9tcCBhdG9taWMKKzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBJRU9SKGV4Y2x1c2l2X2JpdF9vciwgaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGV4Y2x1c2l2X2JpdF9vciAuR0UuIDEpIFRIRU4KKyAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJZW9yIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgZXhjbHVzaXZfYml0X29yID0gMAorICAgICAgICBpbnRfYXJyYXkoTE9PUENPVU5ULzIpID0gMQorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIAorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCis8b21wdHM6Y2hlY2s+CishJG9tcCBhdG9taWMKKzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBpZW9yKGV4Y2x1c2l2X2JpdF9vciwgaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGV4Y2x1c2l2X2JpdF9vciAuTEUuIDApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSWVvciBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICAgaW50X2FycmF5KGkpID0gMTAgLSBpCisgICAgICAgIEVORCBETworCisgICAgICAgIG1pbl92YWx1ZSA9IDY1NTM1CisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gCisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKzxvbXB0czpjaGVjaz4KKyEkb21wIGF0b21pYworPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgIG1pbl92YWx1ZSA9IG1pbihtaW5fdmFsdWUsaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBtaW5fdmFsdWUgLkdULiAoMTAtTE9PUENPVU5UKSApVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBpbnRlZ2VyIE1JTiIKKyAgICAgICAgRU5EIElGCisKKworICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgIGludF9hcnJheShpKSA9IGkKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgbWF4X3ZhbHVlID0gLTMyNzY4CisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gCisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKzxvbXB0czpjaGVjaz4KKyEkb21wIGF0b21pYworPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgIG1heF92YWx1ZSA9IG1heChtYXhfdmFsdWUsaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBtYXhfdmFsdWUgLkxULiBMT09QQ09VTlQgKVRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gaW50ZWdlciBNQVgiCisgICAgICAgIEVORCBJRgorCishLi4uIHRlc3QgZG91YmxlIG1pbiwgbWF4CisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICAgZF9hcnJheShpKSA9IDEwIC0gaSpkdAorICAgICAgICBFTkQgRE8KKworICAgICAgICBkbWluID0gMioqMTAKKyAgICAgICAgZHQgPSAwLjUKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgZG1pbj0gTUlOKGRtaW4sZF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggZG1pbiAuR1QuICgxMC1kdCkgKVRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gZG91YmxlIE1JTiIKKyAgICAgICAgRU5EIElGCisKKworICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgZF9hcnJheShpKSA9IGkgKiBkdAorICAgICAgICBFTkQgRE8KKworICAgICAgICBkbWF4PSAtICgyKioxMCkKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgIGRtYXg9IG1heChkbWF4LGRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGRtYXggLkxULiBMT09QQ09VTlQqZHQgKVRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gZG91YmxlIE1BWCIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgSUYgKCByZXN1bHQgLkVRLiAwICkgVEhFTgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT49ICAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PSAgMAorICAgICAgICBFTkQgSUYKKworICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX2JhcnJpZXIuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9iYXJyaWVyLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEyNTk5NAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9iYXJyaWVyLmYKQEAgLTAsMCArMSw1MCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgYmFycmllciBkaXJlY3RpdmUuIFRoZSB0ZXN0ICAgIGNyZWF0ZXMgc2V2ZXJhbCB0aHJlYWRzIGFuZCBzZW5kcyBvbmUgb2YgdGhlbSBzbGVlcGluZyBiZWZvcmUgc2V0dGluZyBhIGZsYWcuICBBZnRlciB0aGUgYmFycmllciB0aGUgb3RoZXIgb25lcyBkbyBzb21lIGxpdHRsZSB3b3JrIGRlcGVuZGluZyBvbiB0aGUgZmxhZy48LyAgIG9tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGJhcnJpZXI8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKworICAgICAgU1VCUk9VVElORSBkb19zb21lX3dvcmszKCkKKyAgICAgICAgUkVBTCBpCisgICAgICAgIElOVFJJTlNJQyBzcXJ0CisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gc3VtCisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyAgICAgICAgc3VtID0gMC4wCisgICAgICAgIERPIFdISUxFIChpIDwgTE9PUENPVU5ULTEpCisgICAgICAgICAgc3VtID0gc3VtICsgc3FydChpKQorICAgICAgICAgIGkgPSBpICsgMQorICAgICAgICBFTkQgRE8KKyAgICAgIEVORAorCisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2JhcnJpZXI8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgc2xlZXB0aW1lCisgICAgICAgIElOVEVHRVIgb21wX2dldF90aHJlYWRfbnVtCisgICAgICAgIElOVEVHRVIgcmVzdWx0MSwgcmVzdWx0MiwgcmFuaworICAgICAgICByZXN1bHQxID0gMAorICAgICAgICByZXN1bHQyID0gMAorICAgICAgICBzbGVlcHRpbWUgPSAxCishJG9tcCBwYXJhbGxlbCBwcml2YXRlKHJhbmspCisgICAgICAgIHJhbmsgPSBvbXBfZ2V0X3RocmVhZF9udW0oKQorISAgICAgICAgUFJJTlQgKiwgInJhbmsiLCByYW5rCisgICAgICAgIElGICggcmFuayAuRVEuIDEgKSBUSEVOCisgICAgICAgICAgQ0FMTCBzbGVlcChzbGVlcHRpbWUpCisgICAgICAgICAgcmVzdWx0MiA9IDMKKyAgICAgICAgRU5EIElGCisgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgIDxvbXB0czpjaGVjaz4KKyEkb21wIGJhcnJpZXIKKyAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgICAgIElGICggcmFuayAuRVEuIDAgKSBUSEVOCisgICAgICAgICAgcmVzdWx0MSA9IHJlc3VsdDIKKyAgICAgICAgRU5EIElGCishJG9tcCBlbmQgcGFyYWxsZWwKKyAgICAgICAgSUYgKCByZXN1bHQxIC5FUS4gMyApIFRIRU4KKyAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9jb3B5aW4uZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9jb3B5aW4uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTRmMTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX2NvcHlpbi5mCkBAIC0wLDAgKzEsNDcgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIGNvcHlpbiBkaXJlY3RpdmUuPC8gICBvbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBjb3B5aW48L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWwsb21wIHRocmVhZHByaXZhdGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorISBDaGFuZ2Vsb2c6CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2NvcHlpbjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBrbm93bl9zdW0KKwkJPG9tcHRzOm9ycGhhbjp2YXJzPgorISAgICAgICAgSU5URUdFUiwgU0FWRTo6c3VtMSAKKyEgICAgICAgIGltcGxpY2l0bHkgYnkgb21wX3RocmVhZHByaXZhdGUsIHNlZSBzcGVjMjUgQ2hhcC4gMi44LjIKKyAgICAgICAgSU5URUdFUiBzdW0xCisgICAgICAgIENPTU1PTiAvY3N1bTEvIHN1bTEKKyAgICAgICAgSU5URUdFUiBzdW0sIGksIHRocmVhZHMKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gc3VtLCBpLCB0aHJlYWRzCishICAgQy4gTmlldGhhbW1lciAzMC4xMS4wNjogbW92ZWQgdGhyZWFkcHJpdmF0ZSBzdGF0ZW1lbnQgaW50byB0aGUgb3JwaGFuZWQKKyEgICAgICBmdW5jdGlvbgorISRvbXAgdGhyZWFkcHJpdmF0ZSgvY3N1bTEvKQorCQk8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgICAgIHN1bSA9IDAKKyAgICAgICAgc3VtMSA9IDcKKyAgICAgICAgdGhyZWFkcyA9IDAKKwkJPG9tcHRzOm9ycGhhbj4KKyEkb21wIHBhcmFsbGVsIDxvbXB0czpjaGVjaz5jb3B5aW4oc3VtMSk8L29tcHRzOmNoZWNrPgorISAgICAgICAgcHJpbnQgKiwic3VtMSIsc3VtMQorISRvbXAgZG8KKyAgICAgICAgRE8gaT0xLCA5OTkKKyAgICAgICAgICBzdW0xID0gc3VtMSArIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBjcml0aWNhbAorICAgICAgICBzdW0gPSBzdW0gKyBzdW0xCisgICAgICAgIHRocmVhZHMgPSB0aHJlYWRzICsgMQorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBlbmQgcGFyYWxsZWwKKwkJPC9vbXB0czpvcnBoYW4+CisgICAgICAgIGtub3duX3N1bSA9IDk5OSoxMDAwLzIgKyA3KnRocmVhZHMKKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLkVRLiBzdW0gKSBUSEVOCisgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfY3JpdGljYWwuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9jcml0aWNhbC5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MmRkMmIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfY3JpdGljYWwuZgpAQCAtMCwwICsxLDU5IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBjcml0aWNhbCBkaXJlY3RpdmUgYnkgY291bnRpbmcgdXAgYSB2YXJpYWJsZSBpbiBhIHBhcmFsbGVsaXplZCByZWdpb24gd2l0aGluIGEgY3JpdGljYWwgc2VjdGlvbi4KKworPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBjcml0aWNhbDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9jcml0aWNhbDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBrbm93bl9zdW0KKyAgICAgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIGksaixteWksbXlqLCBzdW0KKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gc3VtLCBteWksIG15agorICAgICAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBzdW0gPSAwCisgICAgICAgIG15aSA9IDAKKyAgICAgICAgbXlqID0gNTAwCishJG9tcCBwYXJhbGxlbAorISRvbXAgc2VjdGlvbnMKKworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gMCAsIDQ5OQorICAgICAgICAgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPgorISRvbXAgY3JpdGljYWwKKyAgICAgICAgICAgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgICAgICBzdW0gPSBzdW0gKyBteWkKKyAgICAgICAgICAgbXlpID0gbXlpICsgMQorICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4KKyEkb21wIGVuZCBjcml0aWNhbAorICAgICAgICAgICAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgICAgIEVORCBETworCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGogPSA1MDAgLCA5OTkKKyAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4KKyEkb21wIGNyaXRpY2FsCisgICAgICAgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgc3VtID0gc3VtICsgbXlqCisgICAgICAgICAgIG15aiA9IG15aiArIDEKKyAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+CishJG9tcCBlbmQgY3JpdGljYWwKKyAgICAgICAgICAgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBzZWN0aW9ucworISRvbXAgZW5kIHBhcmFsbGVsCisgICAgICAgIGtub3duX3N1bSA9IDk5OSoxMDAwLzIKKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLkVRLiBzdW0gKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIFdSSVRFICgxLCopICJGb3VuZCBzdW0gd2FzIiwgc3VtLCAiaW5zdGVhZCIsIGtub3duX3N1bQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX2ZsdXNoLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfZmx1c2guZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGRhZjUwCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX2ZsdXNoLmYKQEAgLTAsMCArMSw0OSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgZmx1c2ggZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZmx1c2g8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgYmFycmllcjwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfZmx1c2g8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgcmVzdWx0MSwgZHVtbXksIHJhbmsKKyAgICAgICAgSU5URUdFUiBvbXBfZ2V0X3RocmVhZF9udW0KKyAgICAgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIHJlc3VsdDIKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gcmVzdWx0MgorICAgICAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICByZXN1bHQxPTAKKyAgICAgICAgcmVzdWx0Mj0wCishJG9tcCBwYXJhbGxlbCBwcml2YXRlKHJhbmspCisgICAgICAgIHJhbmsgPSBvbXBfZ2V0X3RocmVhZF9udW0oKQorISRvbXAgYmFycmllcgorICAgICAgICBJRiAoIHJhbmsgLkVRLiAxICkgVEhFTgorICAgICAgICAgIHJlc3VsdDIgPSAzCisgICAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICA8b21wdHM6Y2hlY2s+CishJG9tcCBmbHVzaChyZXN1bHQyKQorICAgICAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgICAgICAgZHVtbXkgPSByZXN1bHQyCisgICAgICAgIEVORCBJRgorICAgICAgICBJRiAoIHJhbmsgLkVRLiAwICkgVEhFTgorICAgICAgICAgIGNhbGwgc2xlZXAoMSkKKyAgICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgIDxvbXB0czpjaGVjaz4KKyEkb21wIGZsdXNoKHJlc3VsdDIpCisgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgICByZXN1bHQxID0gcmVzdWx0MgorICAgICAgICBFTkQgSUYKKyEkb21wIGVuZCBwYXJhbGxlbAorCishICAgICAgICBQUklOVCAqLCIxOiIsIHJlc3VsdDEsICIyOiIsIHJlc3VsdDIsICJkdW1teSIsIGR1bW15CisgICAgICAgIElGICggKHJlc3VsdDEgLkVRLiByZXN1bHQyKSAuQU5ELiAocmVzdWx0MiAuRVEuIGR1bW15KSAuQU5ELgorICAgICAmICAgICAgIChyZXN1bHQyIC5FUS4gMykgKSBUSEVOCisgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfZ2V0X251bV90aHJlYWRzLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfZ2V0X251bV90aHJlYWRzLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY3YWQ5ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9nZXRfbnVtX3RocmVhZHMuZgpAQCAtMCwwICsxLDM3IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhhdCB0aGUgb21wX2dldF9udW1fdGhyZWFkcyByZXR1cm5zIHRoZSBjb3JyZWN0IG51bWJlciBvZiB0aHJlYWRzLiBUaGVyZWZvciBpdCBjb3VudHMgdXAgYSB2YXJpYWJsZSBpbiBhIHBhcmFsbGVsaXplZCBzZWN0aW9uIGFuZCBjb21wYXJzIHRoaXMgdmFsdWUgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZSBvbXBfZ2V0X251bV90aHJlYWRzIGZ1bmN0aW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXBfZ2V0X251bV90aHJlYWRzPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLHNvbXAgc2luZ2xlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfZ2V0X251bV90aHJlYWRzPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU5URUdFUiBudGhyZWFkcworICAgICAgICBJTlRFR0VSIG9tcF9nZXRfbnVtX3RocmVhZHMKKwkJPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIG50aHJlYWRzX2xpYgorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBudGhyZWFkc19saWIKKwkJPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgbnRocmVhZHM9MAorICAgICAgICBudGhyZWFkc19saWI9LTEKKworISRvbXAgcGFyYWxsZWwKKyFzaGFyZWQobnRocmVhZHMsbnRocmVhZHNfbGliKQorISRvbXAgY3JpdGljYWwKKyAgICAgICAgbnRocmVhZHMgPSBudGhyZWFkcyArIDEKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgc2luZ2xlCisJCTxvbXB0czpvcnBoYW4+CisJCTxvbXB0czpjaGVjaz4KKyAgICAgICAgbnRocmVhZHNfbGliPW9tcF9nZXRfbnVtX3RocmVhZHMoKQorCQk8L29tcHRzOmNoZWNrPgorCQk8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBzaW5nbGUKKyEkb21wIGVuZCBwYXJhbGxlbAorICAgICAgICBJRiAobnRocmVhZHMgLkVRLiBudGhyZWFkc19saWIpIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfZ2V0X3d0aWNrcy5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX2dldF93dGlja3MuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjJkMDNkCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX2dldF93dGlja3MuZgpAQCAtMCwwICsxLDI4IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcF9nZXRfd3RpY2sgZnVuY3Rpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcF9nZXRfd3RpY2s8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfZ2V0X3d0aWNrczwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKzxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiB0aWNrCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIHRpY2sKKyAgICAgICAgaW5jbHVkZSAib21wX2xpYi5oIgorPC9vbXB0czpvcnBoYW46dmFycz4KKyEgICAgICAgIERPVUJMRSBQUkVDSVNJT04gb21wX2dldF93dGljaworICAgICAgICB0aWNrID0gMQorICAgICAgICAgICAgICAgIDxvbXB0czpvcnBoYW4+Cis8b21wdHM6Y2hlY2s+CisgICAgICAgIHRpY2s9b21wX2dldF93dGljSygpCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICBXUklURSgxLCopICJ3b3JrIHRvb2siLHRpY2ssInNlYy4gdGltZS4iCisgICAgICAgIElGKHRpY2sgLkdULiAwLiAuQU5ELiB0aWNrIC5MVC4gMC4wMSkgVEhFTgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT49MQorICAgICAgICBFTFNFCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPj0wCisgICAgICAgIEVORCBJRgorICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX2luX3BhcmFsbGVsLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfaW5fcGFyYWxsZWwuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWVkZmY2Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX2luX3BhcmFsbGVsLmYKQEAgLTAsMCArMSw0MSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoYXQgb21wX2luX3BhcmFsbGVsIHJldHVybnMgZmFsc2Ugd2hlbiBjYWxsZWQgZnJvbSBhIHNlcmlhbCByZWdpb24gYW5kIHRydWUgd2hlbiBjYWxsZWQgd2l0aGluIGEgcGFyYWxsZWwgcmVnaW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXBfaW5fcGFyYWxsZWw8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfaW5fcGFyYWxsZWw8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorISAgIGNoZWNrcyB0aGF0IGZhbHNlIGlzIHJldHVybmVkIHdoZW4gY2FsbGVkIGZyb20gc2VyaWFsIHJlZ2lvbgorISAgIGFuZCB0cnVlIGlzIHJldHVybmVkIHdoZW4gY2FsbGVkIHdpdGhpbiBwYXJhbGxlbCByZWdpb24KKyAgICAgICAgTE9HSUNBTCBvbXBfaW5fcGFyYWxsZWwKKwkJPG9tcHRzOm9ycGhhbjp2YXJzPgorISAgICAgICAgTE9HSUNBTCBvbXBfaW5fcGFyYWxsZWwKKyAgICAgICAgTE9HSUNBTCBzZXJpYWwsIHBhcmFsbGVsCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIHNlcmlhbCwgcGFyYWxsZWwKKwkJPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgc2VyaWFsPS5UUlVFLgorICAgICAgICBwYXJhbGxlbD0uRkFMU0UuCisKKwkJPG9tcHRzOm9ycGhhbj4KKwkJPG9tcHRzOmNoZWNrPgorICAgICAgICBzZXJpYWw9b21wX2luX3BhcmFsbGVsKCkKKwkJPC9vbXB0czpjaGVjaz4KKwkJPC9vbXB0czpvcnBoYW4+CisKKyEkb21wIHBhcmFsbGVsCishJG9tcCBzaW5nbGUKKwkJPG9tcHRzOm9ycGhhbj4KKwkJPG9tcHRzOmNoZWNrPgorICAgICAgICBwYXJhbGxlbD1vbXBfaW5fcGFyYWxsZWwoKTsKKwkJPC9vbXB0czpjaGVjaz4KKwkJPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgc2luZ2xlCishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoICguTk9ULiBzZXJpYWwpIC5BTkQuIChwYXJhbGxlbCkgKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPj0xCisgICAgICAgIEVMU0UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PTAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfbG9jay5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX2xvY2suZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTAyNmM1Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX2xvY2suZgpAQCAtMCwwICsxLDU4IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcF9zZXRfbG9jayAgYW5kIHRoZSBvbXBfdW5zZXRfbG9jayBmdW5jdGlvbiBieSBjb3VudGluZyB0aGUgdGhyZWFkcyBlbnRlcmluZyBhbmQgZXhpdGluZyBhIHNpbmdsZSByZWdpb24gd2l0aCBsb2Nrcy48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX2xvY2s8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgZmx1c2g8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9sb2NrPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHJlc3VsdAorICAgICAgICBJTlRFR0VSIG5yX3RocmVhZHNfaW5fc2luZ2xlCisgICAgICAgIElOVEVHRVIgbnJfaXRlcmF0aW9ucworICAgICAgICBJTlRFR0VSIGkKKyFsb2NrIHZhcmlhYmxlCisgICAgICAgICAgICAgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTkNMVURFICJvbXBfbGliLmgiCisgICAgICAgIElOVEVHRVIgKEtJTkQ9T01QX0xPQ0tfS0lORCkgOjogbG9jaworICAgICAgICBDT01NT04gL29ycGh2YXJzLyBsb2NrCisgICAgICAgICAgICAgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorCishcmVzdWx0IGlzOgorISAgMCAtLSBpZiB0aGUgdGVzdCBmYWlscworISAgMSAtLSBpZiB0aGUgdGVzdCBzdWNjZWVkcworICAgICAgICBDQUxMIG9tcF9pbml0X2xvY2sobG9jaykKKyAgICAgICAgbnJfaXRlcmF0aW9ucz0wCisgICAgICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlPTAKKyAgICAgICAgcmVzdWx0PTAKKyEkb21wIHBhcmFsbGVsIHNoYXJlZChsb2NrLG5yX3RocmVhZHNfaW5fc2luZ2xlLG5yX2l0ZXJhdGlvbnMscmVzdWx0KQorISRvbXAgZG8KKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgICAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4KKyAgICAgICAgICBDQUxMIG9tcF9zZXRfbG9jayhsb2NrKQorICAgICAgICAgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorISRvbXAgZmx1c2gKKyAgICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZT1ucl90aHJlYWRzX2luX3NpbmdsZSsxCishJG9tcCBmbHVzaAorICAgICAgICAgIG5yX2l0ZXJhdGlvbnM9bnJfaXRlcmF0aW9ucysxCisgICAgICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGU9bnJfdGhyZWFkc19pbl9zaW5nbGUtMQorICAgICAgICAgIHJlc3VsdD1yZXN1bHQrbnJfdGhyZWFkc19pbl9zaW5nbGUKKyAgICAgICAgICAgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+CisgICAgICAgICAgQ0FMTCBvbXBfdW5zZXRfbG9jayhsb2NrKQorICAgICAgICAgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworISRvbXAgZW5kIHBhcmFsbGVsCisgICAgICAgIENBTEwgb21wX2Rlc3Ryb3lfbG9jayhsb2NrKQorICAgICAgICBJRihyZXN1bHQuRVEuMCAuQU5ELiBucl9pdGVyYXRpb25zIC5FUS4gTE9PUENPVU5UKSBUSEVOCisgICAgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT49MQorICAgICAgICBFTFNFCisgICAgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT49MAorICAgICAgICBFTkRJZgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX21hc3Rlci5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX21hc3Rlci5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZTFmM2QKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfbWFzdGVyLmYKQEAgLTAsMCArMSwzOSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgbWFzdGVyIGRpcmVjdGl2ZSBieSBjb3VudGluZyB1cCBhIHZhcmlhYmxlIGluIGEgb21wIG1hc3RlciBzZWN0aW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgbWFzdGVyPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfbWFzdGVyPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIG9tcF9nZXRfdGhyZWFkX251bQorCQk8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgbnRocmVhZHMsIGV4ZWN1dGluZ190aHJlYWQKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gbnRocmVhZHMsIGV4ZWN1dGluZ190aHJlYWQKKwkJPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgbnRocmVhZHM9MAorICAgICAgICBleGVjdXRpbmdfdGhyZWFkPS0xCisKKyEkb21wIHBhcmFsbGVsCisJCTxvbXB0czpvcnBoYW4+CisJCTxvbXB0czpjaGVjaz4KKyEkb21wIG1hc3RlcgorCQk8L29tcHRzOmNoZWNrPgorISRvbXAgY3JpdGljYWwKKyAgICAgICAgbnRocmVhZHMgPSBudGhyZWFkcyArIDEKKyEkb21wIGVuZCBjcml0aWNhbAorICAgICAgICBleGVjdXRpbmdfdGhyZWFkPW9tcF9nZXRfdGhyZWFkX251bSgpCisJCTxvbXB0czpjaGVjaz4KKyEkb21wIGVuZCBtYXN0ZXIKKwkJPC9vbXB0czpjaGVjaz4KKwkJPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIChudGhyZWFkcyAuRVEuIDEpIC5BTkQuIChleGVjdXRpbmdfdGhyZWFkIC5FUS4gMCkgKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX21hc3Rlcl8zLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfbWFzdGVyXzMuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjIyYzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX21hc3Rlcl8zLmYKQEAgLTAsMCArMSw0OSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgbWFzdGVyIGRpcmVjdGl2ZSBieSBjb3VudGluZyB1cCBhIHZhcmlhYmxlIGluIGEgb21wIG1hc3RlciBzZWN0aW9uLiBJdCBhbHNvIGNoZWNrcyB0aGF0IHRoZSBtYXN0ZXIgdGhyZWFkIGhhcyB0aGUgdGhyZWFkIG51bWJlciAwIGFzIHNwZWNpZmllZCBpbiB0aGUgT3Blbk1QIHN0YW5kYXJkIHZlcnNpb24gMy4wLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgbWFzdGVyPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfbWFzdGVyXzM8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgb21wX2dldF90aHJlYWRfbnVtCisgICAgICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBudGhyZWFkcywgZXhlY3V0aW5nX3RocmVhZAorICAgICAgICBJTlRFR0VSIHRpZF9yZXN1bHQgISBjb3VudHMgdXAgdGhlIG51bWJlciBvZiB3cm9uZyB0aHJlYWQgbm8uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAhIGZvciB0aGUgbWFzdGVyIHRocmVhZAorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBudGhyZWFkcywgZXhlY3V0aW5nX3RocmVhZCwgdGlkX3Jlc3VsdAorICAgICAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICB0aWRfcmVzdWx0ID0gMAorICAgICAgICBudGhyZWFkcz0wCisgICAgICAgIGV4ZWN1dGluZ190aHJlYWQ9LTEKKworISRvbXAgcGFyYWxsZWwKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgPG9tcHRzOmNoZWNrPgorISRvbXAgbWFzdGVyCisgICAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICAgIGlmIChvbXBfZ2V0X3RocmVhZF9udW0oKSAubmUuIDApIHRoZW4KKyEkb21wIGNyaXRpY2FsCisgICAgICAgICAgICB0aWRfcmVzdWx0ID0gdGlkX3Jlc3VsdCArIDEKKyEkb21wIGVuZCBjcml0aWNhbAorICAgICAgICBlbmQgaWYKKyEkb21wIGNyaXRpY2FsCisgICAgICAgIG50aHJlYWRzID0gbnRocmVhZHMgKyAxCishJG9tcCBlbmQgY3JpdGljYWwKKyAgICAgICAgZXhlY3V0aW5nX3RocmVhZD1vbXBfZ2V0X3RocmVhZF9udW0oKQorICAgICAgICA8b21wdHM6Y2hlY2s+CishJG9tcCBlbmQgbWFzdGVyCisgICAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCAobnRocmVhZHMgLkVRLiAxKSAuQU5ELiAoZXhlY3V0aW5nX3RocmVhZCAuRVEuIDApIC5BTkQuCisgICAgICYgICAgICAgKHRpZF9yZXN1bHQgLkVRLiAwKSApIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CisKZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9uZXN0X2xvY2suZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9uZXN0X2xvY2suZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjllM2FhCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX25lc3RfbG9jay5mCkBAIC0wLDAgKzEsNTkgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wX3NldF9uZXN0X2xvY2sgYW5kIHRoZSBvbXBfdW5zZXRfbmVzdF9sb2NrIGZ1bmN0aW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXBfbmVzdF9sb2NrPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfbmVzdF9sb2NrPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorIXJlc3VsdCBpczoKKyEgIDAgLS0gaWYgdGhlIHRlc3QgZmFpbHMKKyEgIDEgLS0gaWYgdGhlIHRlc3Qgc3VjY2VlZHMKKyAgICAgICAgSU5URUdFUiByZXN1bHQKKyAgICAgICAgSU5URUdFUiBucl90aHJlYWRzX2luX3NpbmdsZQorICAgICAgICBJTlRFR0VSIG5yX2l0ZXJhdGlvbnMKKyAgICAgICAgSU5URUdFUiBpCisgICAgICAgICAgICAgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTkNMVURFICJvbXBfbGliLmgiCisgICAgICAgIElOVEVHRVIgKEtJTkQ9T01QX05FU1RfTE9DS19LSU5EKSA6OiBsb2NrCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIGxvY2sKKyAgICAgICAgICAgICAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisKKyAgICAgICAgbnJfaXRlcmF0aW9ucz0wCisgICAgICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlPTAKKyAgICAgICAgQ0FMTCBvbXBfaW5pdF9uZXN0X2xvY2sobG9jaykKKyAgICAgICAgcmVzdWx0PTAKKworISRvbXAgcGFyYWxsZWwgc2hhcmVkKGxvY2ssbnJfdGhyZWFkc19pbl9zaW5nbGUsbnJfaXRlcmF0aW9ucyxyZXN1bHQpCishJG9tcCBkbworICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPgorICAgICAgICBDQUxMIG9tcF9zZXRfbmVzdF9sb2NrKGxvY2spCisgICAgICAgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyEkb21wIGZsdXNoCisgICAgICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlPW5yX3RocmVhZHNfaW5fc2luZ2xlKzEKKyEkb21wIGZsdXNoCisgICAgICAgIG5yX2l0ZXJhdGlvbnM9bnJfaXRlcmF0aW9ucysxCisgICAgICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlPW5yX3RocmVhZHNfaW5fc2luZ2xlLTEKKyAgICAgICAgcmVzdWx0PXJlc3VsdCtucl90aHJlYWRzX2luX3NpbmdsZQorICAgICAgICAgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPgorICAgICAgICBDQUxMIG9tcF91bnNldF9uZXN0X2xvY2sobG9jaykKKyAgICAgICAgICAgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKyEkb21wIGVuZCBwYXJhbGxlbAorICAgICAgQ0FMTCBvbXBfZGVzdHJveV9uZXN0X2xvY2sobG9jaykKKyEgICAgICAgICAgICAgICBQUklOVCAqLCByZXN1bHQsIG5yX2l0ZXJhdGlvbnMKKyAgICAgICAgSUYocmVzdWx0LkVRLjAgLkFORC4gbnJfaXRlcmF0aW9ucyAuRVEuIExPT1BDT1VOVCkgVEhFTgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT49MQorICAgICAgICBFTFNFCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPj0wCisgICAgICAgIEVORCBJRgorICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX25lc3RlZC5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX25lc3RlZC5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MzUxNTEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfbmVzdGVkLmYKQEAgLTAsMCArMSw1MyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3QgaWYgdGhlIGNvbXBpbGVyIHN1cHBvcnQgbmVzdGVkIHBhcmFsbGVsaXNtLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOnZlcnNpb24+Mi41PC9vbXB0czp2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5uZXN0ZWR0ZXN0PC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfbmVzdGVkPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCis8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgY291bnRlcgorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBjb3VudGVyCis8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgICAgIGNvdW50ZXIgPTAKKyAgICAgICAgCisgICAgICAgIDxvbXB0czpjaGVjaz4KKyEkICAgICAgQ0FMTCBPTVBfU0VUX05FU1RFRCguVFJVRS4pCishI2lmZGVmIF9PUEVOTVAKKyEgICAgICAgQ0FMTCBPTVBfU0VUX05FU1RFRCguVFJVRS4pIAorISNlbmRpZgorICAgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgICA8b21wdHM6Y3Jvc3NjaGVjaz4KKyEkICAgICAgQ0FMTCBPTVBfU0VUX05FU1RFRCguRkFMU0UuKQorISNpZmRlZiBfT1BFTk1QCishICAgICAgIENBTEwgT01QX1NFVF9ORVNURUQoLkZBTFNFLikKKyEjZW5kaWYKKyAgICAgICAgPC9vbXB0czpjcm9zc2NoZWNrPgorCishJG9tcCBwYXJhbGxlbAorICAgICAgICA8b21wdHM6b3JwaGFuPgorISRvbXAgY3JpdGljYWwKKyAgICAgICAgICBjb3VudGVyID0gY291bnRlciArIDEKKyEkb21wIGVuZCBjcml0aWNhbAorCishJG9tcCBwYXJhbGxlbAorISRvbXAgY3JpdGljYWwKKyAgICAgICAgICBjb3VudGVyID0gY291bnRlciAtIDEKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgZW5kIHBhcmFsbGVsCisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisgICAgICAgIAorICAgICAgICBJRiAoY291bnRlciAuRVEuIDAgKSBUSEVOCisgICAgICAgICAgIFdSSVRFICgxLCopICJDb3VudGVyIHdhcyAwIgorICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTFNFCisgICAgICAgICAgIFdSSVRFICgxLCopICJDb3VudGVyIHdhcyIsIGNvdW50ZXIKKyAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRU5EIElGIAorICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX251bV90aHJlYWRzLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfbnVtX3RocmVhZHMuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWVkZTczCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX251bV90aHJlYWRzLmYKQEAgLTAsMCArMSw2MCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoYXQgdGhlIG9tcF9nZXRfbnVtX3RocmVhZHMgcmV0dXJucyB0aGUgY29ycmVjdCBudW1iZXIgb2YgdGhyZWFkcy4gVGhlcmVmb3IgaXQgY291bnRzIHVwIGEgdmFyaWFibGUgaW4gYSBwYXJhbGxlbGl6ZWQgc2VjdGlvbiBhbmQgY29tcGFycyB0aGlzIHZhbHVlIHdpdGggdGhlIHJlc3VsdCBvZiB0aGUgb21wX2dldF9udW1fdGhyZWFkcyBmdW5jdGlvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX2dldF9udW1fdGhyZWFkczwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9udW1fdGhyZWFkczwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBpLCBtYXhfdGhyZWFkcworICAgICAgICBJTlRFR0VSIG9tcF9nZXRfbnVtX3RocmVhZHMKKzxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBmYWlsZWQsdGhyZWFkcyxudGhyZWFkcyx0bXAKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gZmFpbGVkLHRocmVhZHMsbnRocmVhZHMKKzwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICAgICAgZmFpbGVkID0gMAorICAgICAgICBtYXhfdGhyZWFkcyA9IDAKKyAgICAgICAgIAorISRvbXAgcGFyYWxsZWwKKyEkb21wIG1hc3RlcgorICAgICAgICBtYXhfdGhyZWFkcyA9IE9NUF9HRVRfTlVNX1RIUkVBRFMoKSAgICAgICAKKyEkb21wIGVuZCBtYXN0ZXIKKyEkb21wIGVuZCBwYXJhbGxlbAorISAgICAgICAgIHByaW50ICosICJtYXggdGhyZWFkczoiLG1heF90aHJlYWRzCisKKyFZaSBXZW4gYWRkZWQgb21wX1NldF9keW5hbWljcyBoZXJlIHRvIG1ha2Ugc3VyZSBudW1fdGhyZWFkcyBjbGF1c2Ugd29yaworIVRoYW5rcyB0byBEci4gWWluIE1hIGluIEFic29mdC4gc2hvdWxkIGJlIG5vdCBiZSBjYWxsZWQgYmVmb3JlIHRoZSB0ZXN0IGxvb3AKKyFiZWNhdXNlIGl0IGFsbG93cyB0aGUgZHluYW1pYyBhZGp1c3RtZW50IG9mIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBhdCBydW50aW1lCishaW5zdGVhZCBvZiB1c2luZyB0aGUgbWF4X3RocmVhZHMgc2V0LiAKKworICAgICAgICAhQ0FMTCBPTVBfU0VUX0RZTkFNSUMoLlRSVUUuKQorICAgICAgICBETyB0aHJlYWRzID0gMSwgbWF4X3RocmVhZHMKKyAgICAgICAgICBudGhyZWFkcyA9IDAKKyAgICAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyEkb21wIHBhcmFsbGVsIG51bV90aHJlYWRzKHRocmVhZHMpIHJlZHVjdGlvbigrOmZhaWxlZCkKKyEgICAgICAgICAgcHJpbnQgKiwgdGhyZWFkcywgb21wX2dldF9udW1fdGhyZWFkcygpCisgICAgICAgICAgdG1wID0gb21wX2dldF9udW1fdGhyZWFkcygpCisgICAgICAgICAgSUYgKCB0aHJlYWRzIC5ORS4gdG1wICkgVEhFTgorICAgICAgICAgICAgZmFpbGVkID0gZmFpbGVkICsgMQorICAgICAgICAgICAgV1JJVEUgKDEsKikgIkVycm9yOiBmb3VuZCAiLCB0bXAsICIgaW5zdGVhZCBvZiAiLAorICAgICAmICAgICAgICAgIHRocmVhZHMsICIgdGhyZWFkcyIKKyAgICAgICAgICBFTkQgSUYKKyEkb21wIGF0b21pYworICAgICAgICAgIG50aHJlYWRzID0gbnRocmVhZHMgKyAxCishJG9tcCBlbmQgcGFyYWxsZWwKKyAgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyEgICAgICAgICAgICBwcmludCAqLCB0aHJlYWRzLCBudGhyZWFkcworICAgICAgICAgIDxvbXB0czpjaGVjaz5JRiAoIG50aHJlYWRzIC5ORS4gdGhyZWFkcyApIFRIRU48L29tcHRzOmNoZWNrPgorICAgICAgICAgIDxvbXB0czpjcm9zc2NoZWNrPklGICggbnRocmVhZHMgLkVRLiB0aHJlYWRzICkgVEhFTjwvb21wdHM6Y3Jvc3NjaGVjaz4KKyAgICAgICAgICAgIGZhaWxlZCA9IGZhaWxlZCArIDEKKyAgICAgICAgICBFTkQgSUYKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgSUYoZmFpbGVkIC5ORS4gMCkgVEhFTgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVMU0UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTkQgSUYKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9zaW5nbGUuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9zaW5nbGUuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODgyMWNhCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3NpbmdsZS5mCkBAIC0wLDAgKzEsNDAgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHNpbmdsZSBkaXJlY3RpdmUgYnkgY29udHJvbGxpbmcgaG93IG9mdGVuIGEgZGlyZWN0aXZlIGlzIGNhbGxlZCBpbiBhbiBvbXAgc2luZ2xlIHJlZ2lvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHNpbmdsZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBwYXJhbGxlbCBwcml2YXRlLG9tcCBmbHVzaDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3NpbmdsZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBpCisJCTxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBucl90aHJlYWRzX2luX3NpbmdsZSxucl9pdGVyYXRpb25zLHJlc3VsdAorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBucl90aHJlYWRzX2luX3NpbmdsZSxucl9pdGVyYXRpb25zLHJlc3VsdAorCQk8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisgICAgICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlPTAKKyAgICAgICAgcmVzdWx0PTAKKyAgICAgICAgbnJfaXRlcmF0aW9ucz0wCishJG9tcCBwYXJhbGxlbAorICAgICAgICBETyBpPTAsIExPT1BDT1VOVC0xCisJCTxvbXB0czpvcnBoYW4+CishJG9tcCBzaW5nbGUKKyEkb21wIGZsdXNoCisgICAgICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUgPSBucl90aHJlYWRzX2luX3NpbmdsZSArIDEKKyEkb21wIGZsdXNoCisgICAgICAgICAgbnJfaXRlcmF0aW9ucyA9IG5yX2l0ZXJhdGlvbnMgKyAxCisgICAgICAgICAgPG9tcHRzOmNoZWNrPm5yX3RocmVhZHNfaW5fc2luZ2xlID0gbnJfdGhyZWFkc19pbl9zaW5nbGUgLSAxPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICA8b21wdHM6Y3Jvc3NjaGVjaz5ucl90aHJlYWRzX2luX3NpbmdsZSA9IG5yX3RocmVhZHNfaW5fc2luZ2xlICsgMTwvb21wdHM6Y3Jvc3NjaGVjaz4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBucl90aHJlYWRzX2luX3NpbmdsZQorISRvbXAgZW5kIHNpbmdsZQorCQk8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwKKyAgICAgICAgSUYgKCByZXN1bHQgLkVRLiAwIC5BTkQuIG5yX2l0ZXJhdGlvbnMgLkVRLiBMT09QQ09VTlQgKSBUSEVOCisgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGFzay5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rhc2suZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzNkN2IwCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rhc2suZgpAQCAtMCwwICsxLDUwIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCB0YXNrIGRpcmVjdGl2ZS4gVGhlIGlkZWEgb2YgdGhlIHRlc3RzIGlzIHRvIGdlbmVyYXRlIGEgc2V0IG9mIHRhc2tzIGluIGEgc2luZ2xlIHJlZ2lvbi4gV2UgbGV0IHBhdXNlIHRoZSB0YXNrcyBnZW5lcmF0ZWQgc28gdGhhdCBvdGhlciB0aHJlYWRzIGdldCBzaGVkdWxlZCB0byB0aGUgbmV3bHkgb3BlbmVkIHRhc2tzLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGFzazwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBzaW5nbGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5DTFVERSAib21wX215X3NsZWVwLmYiCisKKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGFzazwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAgICAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgb21wX2dldF9udW1fdGhyZWFkcywgb21wX2dldF90aHJlYWRfbnVtCisgICAgICAgIEVYVEVSTkFMIG15X3NsZWVwCisgICAgICAgIElOVEVHRVIgbXlqCisgICAgICAgIElOVEVHRVIgaSxqCisgICAgICAgIElOVEVHRVIgdGlkcyhOVU1fVEFTS1MpCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIGosdGlkcworICAgICAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorISRvbXAgcGFyYWxsZWwgcHJpdmF0ZShteWopIHNoYXJlZChqKQorISRvbXAgc2luZ2xlCisgICAgICAgIGRvIGk9MSwgTlVNX1RBU0tTCisgICAgICAgIGogPSBpCisgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgIG15aiA9IGoKKyAgICAgICAgPG9tcHRzOmNoZWNrPgorISRvbXAgdGFzaworICAgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgICAgIGNhbGwgbXlfc2xlZXAoU0xFRVBUSU1FKQorICAgICAgICAgIHRpZHMobXlqKSA9IG9tcF9nZXRfdGhyZWFkX251bSgpCisgICAgICAgIDxvbXB0czpjaGVjaz4KKyEkb21wIGVuZCB0YXNrCisgICAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICBlbmQgZG8KKyEkb21wIGVuZCBzaW5nbGUKKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisKKyAgICAgICAgISBjaGVjayBpZiBtb3JlIHRoYW4gb25lIHRocmVhZCBleGVjdXRlZCB0aGUgdGFza3MuCisgICAgICAgIGRvIGk9MSwgTlVNX1RBU0tTCisgICAgICAgICAgaWYgKHRpZHMoMSkgLm5lLiB0aWRzKGkpKSB0aGVuCisgICAgICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICAgIGVuZCBpZgorICAgICAgICBlbmQgZG8KKworICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rhc2tfZmlyc3Rwcml2YXRlLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGFza19maXJzdHByaXZhdGUuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTc3NTllCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rhc2tfZmlyc3Rwcml2YXRlLmYKQEAgLTAsMCArMSw1NCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBmaXJzdHByaXZhdGUgY2xhdXNlIG9mIHRoZSB0YXNrIGRpcmVjdGl2ZS4gV2UgY3JlYXRlIGEgc2V0IG9mIHRhc2tzIGluIGEgc2luZ2xlIHJlZ2lvbi4gV2UgZGVmaW5lcyBhIHZhcmlhYmxlIG5hbWVkIHN1bSB1bmVxdWFsIHplcm8gd2hpY2ggZ2V0cyBkZWNsYXJlZCBmaXJzdHByaXZhdGUgZm9yIGVhY2ggdGFzay4gTm93IGVhY2ggdGFzayBjYWxjdWFsdGVzIGEgc3VtIHVzaW5nIHRoaXMgcHJpdmF0ZSB2YXJpYWJsZS4gQmVmb3JlIGVhY2ggY2FsY3VhbGF0aW9uIHN0ZXAgd2UgaW50cm9kdWNlIGEgZmx1c2ggY29tbWFuZCBzbyB0aGF0IG1heWJlIHRoZSBwcml2YXRlIHZhcmlhYmVsIGdldHMgYmFkLiBBdCB0aGUgZW5kIHdlIGNoZWNrIGlmIHRoZSBjYWxjdWxhdGVkIHN1bSB3YXMgcmlnaHQuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0YXNrIGZpcnN0cHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBzaW5nbGUsb21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOQ0xVREUgIm9tcF9teV9zbGVlcC5mIgorCisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2tfZmlyc3Rwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisgICAgICAgIElOVEVHRVIgaixpCisgICAgICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgZXh0ZXJuYWwgbXlfc2xlZXAKKyAgICAgICAgSU5URUdFUiBteV9zdW0KKyAgICAgICAgSU5URUdFUiBrbm93bl9zdW0KKyAgICAgICAgSU5URUdFUiByc2x0CisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIG15X3N1bSwga25vd25fc3VtLCByc2x0CisgICAgICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICAgICAgbXlfc3VtID0gMTIzNAorICAgICAgICBrbm93bl9zdW0gPSAxMjM0ICsgKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyCisKKyEkb21wIHBhcmFsbGVsIHByaXZhdGUoaikKKyEkb21wIHNpbmdsZQorICAgICAgICBkbyBpPTEsIE5VTV9UQVNLUworICAgICAgICA8b21wdHM6b3JwaGFuPgorISRvbXAgdGFzayA8b21wdHM6Y2hlY2s+Zmlyc3Rwcml2YXRlKG15X3N1bSk8L29tcHRzOmNoZWNrPgorICAgICAgICAgIGRvIGogPSAwLCBMT09QQ09VTlQKKyEkb21wIGZsdXNoCisgICAgICAgICAgICBteV9zdW0gPSBteV9zdW0gKyBqCisgICAgICAgICAgZW5kIGRvCisKKyAgICAgICAgICAhIGNoZWNrIGlmIGNhbGN1bGF0ZWQgbXlfc3VtIHdhcyByaWdodAorICAgICAgICAgIGlmIChteV9zdW0gLm5lLiBrbm93bl9zdW0pIHRoZW4KKyEkb21wIGNyaXRpY2FsCisgICAgICAgICAgICByc2x0ID0gcnNsdCArIDEKKyEkb21wIGVuZCBjcml0aWNhbAorICAgICAgICAgIGVuZCBpZgorISRvbXAgZW5kIHRhc2sKKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgICAgIGVuZCBkbworISRvbXAgZW5kIHNpbmdsZQorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgaWYgKHJzbHQgLmVxLiAwKSB0aGVuCisgICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBlbHNlCisgICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBlbmQgaWYKKworICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rhc2tfaWYuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90YXNrX2lmLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ5ZjQ1NwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90YXNrX2lmLmYKQEAgLTAsMCArMSw0NSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBpZiBjbGF1c2Ugb2YgdGhlIG9tcCB0YXNrIGRpcmVjdGl2ZS4gVGhlIGlkZWFyIG9mIHRoZSB0ZXN0cyBpcyB0byBnZW5lcmF0ZSBhIHRhc2tzIGluIGEgc2luZ2xlIHJlZ2lvbiBhbmQgcGF1c2UgaXQgaW1tZWRpYXRlbHkuIFRoZSBwYXJlbnQgdGhyZWFkIG5vdyBzaGFsbCBzZXQgYSBjb3VudGVyIHZhcmlhYmxlIHdoaWNoIHRoZSBwYXVzZWQgdGFzayBzaGFsbCBldmFsdWF0ZSB3aGVuIHdva2UgdXAuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0YXNrIGlmPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHNpbmdsZSxvbXAgZmx1c2g8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5DTFVERSAib21wX215X3NsZWVwLmYiCisKKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGFza19pZjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAgICAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIGV4dGVybmFsIG15X3NsZWVwCisgICAgICAgIElOVEVHRVIgZHVtbXkKKyAgICAgICAgTE9HSUNBTCBjb25kaXRpb25fZmFsc2UKKyAgICAgICAgSU5URUdFUiBjbnQKKyAgICAgICAgSU5URUdFUiByc2x0CisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIGNvbmRpdGlvbl9mYWxzZSwgY250LCByc2x0CisgICAgICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICAgICAgY250ID0gMAorICAgICAgICBjb25kaXRpb25fZmFsc2UgPSAoZHVtbXkgLmVxLiAzMTQxNTkpCisKKyEkb21wIHBhcmFsbGVsCishJG9tcCBzaW5nbGUKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyEkb21wIHRhc2sgPG9tcHRzOmNoZWNrPmlmIChjb25kaXRpb25fZmFsc2UpPC9vbXB0czpjaGVjaz4gc2hhcmVkKGNudCxyc2x0KQorICAgICAgICAgIGNhbGwgbXlfc2xlZXAoU0xFRVBUSU1FX0xPTkcpCishJG9tcCBmbHVzaAorICAgICAgICAgIGlmIChjbnQgLmVxLiAwKSB0aGVuCisgICAgICAgICAgICAgIHJzbHQgPSAxCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICByc2x0ID0gMAorICAgICAgICAgIGVuZCBpZgorISRvbXAgZW5kIHRhc2sKKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgICAgIGNudCA9IDEKKyEkb21wIGVuZCBzaW5nbGUKKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSByc2x0CisKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90YXNrX3ByaXZhdGUuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90YXNrX3ByaXZhdGUuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTQ0YmM1Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rhc2tfcHJpdmF0ZS5mCkBAIC0wLDAgKzEsNTUgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgcHJpdmF0ZSBjbGF1c2Ugb2YgdGhlIHRhc2sgZGlyZWN0aXZlLiBXZSBjcmVhdGUgYSBzZXQgb2YgdGFza3MgaW4gYSBzaW5nbGUgcmVnaW9uLiBXZSBkZWZpbmVzIGEgdmFyaWFibGUgbmFtZWQgc3VtIHdoaWNoIGdldHMgZGVjbGFyZWQgcHJpdmF0ZSBmb3IgZWFjaCB0YXNrLiBOb3cgZWFjaCB0YXNrIGNhbGN1YWx0ZXMgYSBzdW0gdXNpbmcgdGhpcyBwcml2YXRlIHZhcmlhYmxlLiBCZWZvcmUgZWFjaCBjYWxjdWFsYXRpb24gc3RlcCB3ZSBpbnRyb2R1Y2UgYSBmbHVzaCBjb21tYW5kIHNvIHRoYXQgbWF5YmUgdGhlIHByaXZhdGUgdmFyaWFiZWwgZ2V0cyBiYWQuIEF0IHRoZSBlbmQgd2UgY2hlY2sgaWYgdGhlIGNhbGN1bGF0ZWQgc3VtIHdhcyByaWdodC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHRhc2sgcHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBzaW5nbGUsb21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOQ0xVREUgIm9tcF9teV9zbGVlcC5mIgorCisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2tfZmlyc3Rwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisgICAgICAgIElOVEVHRVIgaixpCisgICAgICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgZXh0ZXJuYWwgbXlfc2xlZXAKKyAgICAgICAgSU5URUdFUiBteV9zdW0KKyAgICAgICAgSU5URUdFUiBrbm93bl9zdW0KKyAgICAgICAgSU5URUdFUiByc2x0CisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIG15X3N1bSwga25vd25fc3VtLCByc2x0CisgICAgICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICAgICAgbXlfc3VtID0gMAorICAgICAgICByc2x0ID0gMAorICAgICAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDIKKworISRvbXAgcGFyYWxsZWwgcHJpdmF0ZShqKQorISRvbXAgc2luZ2xlCisgICAgICAgIGRvIGk9MSwgTlVNX1RBU0tTCisgICAgICAgIDxvbXB0czpvcnBoYW4+CishJG9tcCB0YXNrIDxvbXB0czpjaGVjaz5wcml2YXRlKG15X3N1bSk8L29tcHRzOmNoZWNrPiBzaGFyZWQocnNsdCwga25vd25fc3VtKQorICAgICAgICAgIDxvbXB0czpjaGVjaz5teV9zdW0gPSAwPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICBkbyBqID0gMCwgTE9PUENPVU5UCisgICAgICAgICAgICBteV9zdW0gPSBteV9zdW0gKyBqCisgICAgICAgICAgZW5kIGRvCisKKyAgICAgICAgICAhIGNoZWNrIGlmIGNhbGN1bGF0ZWQgbXlfc3VtIHdhcyByaWdodAorICAgICAgICAgIGlmIChteV9zdW0gLm5lLiBrbm93bl9zdW0pIHRoZW4KKyEkb21wIGNyaXRpY2FsCisgICAgICAgICAgICByc2x0ID0gcnNsdCArIDEKKyEkb21wIGVuZCBjcml0aWNhbAorICAgICAgICAgIGVuZCBpZgorISRvbXAgZW5kIHRhc2sKKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgICAgIGVuZCBkbworISRvbXAgZW5kIHNpbmdsZQorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgaWYgKHJzbHQgLmVxLiAwKSB0aGVuCisgICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBlbHNlCisgICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBlbmQgaWYKKworICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rhc2tfc2hhcmVkLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGFza19zaGFyZWQuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODU2NGIzCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rhc2tfc2hhcmVkLmYKQEAgLTAsMCArMSw0NyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPiBUZXN0IHRvIHNlZSBpZiBpbXBsaWVkIHNoYXJlZCB3b3JrcyBjb3JyZWN0bHk8L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHRhc2s8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgc2luZ2xlLCBvbXAgdGFzayBmaXJzdHByaXZhdGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5DTFVERSAib21wX215X3NsZWVwLmYiCisKKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGFza19zaGFyZWQ8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyAgICAgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBleHRlcm5hbCBteV9zbGVlcAorICAgICAgICBJTlRFR0VSIGkKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gaQorICAgICAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIHJzbHQKKyAgICAgICAgSU5URUdFUiBrCisKKyAgICAgICAgaSA9IDAKKyAgICAgICAgayA9IDAKKyAgICAgICAgcnNsdCA9IDAKKworISRvbXAgcGFyYWxsZWwgcHJpdmF0ZShrKSBzaGFyZWQoaSkKKyEkb21wIHNpbmdsZQorICAgICAgICBkbyBrPTEsIE5VTV9UQVNLUworICAgICAgICA8b21wdHM6b3JwaGFuPgorISRvbXAgdGFzayA8b21wdHM6Y3Jvc3NjaGVjaz5maXJzdHByaXZhdGUoaSk8L29tcHRzOmNyb3NzY2hlY2s+CishJG9tcCsgICAgIDxvbXB0czpjaGVjaz5zaGFyZWQoaSk8L29tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCisgICAgICAgICAgICBpID0gaSArIDEKKyEkb21wIGVuZCB0YXNrCisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICBlbmQgZG8KKyEkb21wIGVuZCBzaW5nbGUKKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIHJzbHQgPSBpCisgICAgICAgIGlmIChyc2x0IC5lcS4gTlVNX1RBU0tTKSB0aGVuCisgICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBlbHNlCisgICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBlbmQgaWYKKworICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rhc2tfdW50aWVkLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGFza191bnRpZWQuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNThlOTM1Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rhc2tfdW50aWVkLmYKQEAgLTAsMCArMSw2MyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3QgZm9yIHVudGllZCBjbGF1c2UuIEZpcnN0IGdlbmVyYXRlIGEgc2V0IG9mIHRhc2tzIGFuZCBwYXVzZSBpdCBpbW1lZGlhdGVseS4gVGhlbiB3ZSByZXN1bWUgaGFsZiBvZiB0aGVtIGFuZCBjaGVjayB3aGV0aGVyIHRoZXkgYXJlIHNjaGVkdWxlZCBieSBkaWZmZXJlbnQgdGhyZWFkczwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGFzayB1bnRpZWQ8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgdGFza3dhaXQ8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5DTFVERSAib21wX215X3NsZWVwLmYiCisKKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGFza191bnRpZWQ8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyAgICAgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBFWFRFUk5BTCBteV9zbGVlcAorICAgICAgICBJTlRFR0VSIG9tcF9nZXRfbnVtX3RocmVhZHMsIG9tcF9nZXRfdGhyZWFkX251bQorICAgICAgICBJTlRFR0VSIG15agorICAgICAgICBJTlRFR0VSIGksagorICAgICAgICBJTlRFR0VSIGNudAorICAgICAgICBJTlRFR0VSIHN0YXJ0X3RpZChOVU1fVEFTS1MpCisgICAgICAgIElOVEVHRVIgY3VycmVudF90aWQoTlVNX1RBU0tTKQorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBqLCBjbnQsIHN0YXJ0X3RpZCwgY3VycmVudF90aWQKKyAgICAgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgICAgICBjbnQgPSAwCisgICAgICAgIGRvIGkgPSAxLCBOVU1fVEFTS1MKKyAgICAgICAgICBzdGFydF90aWQoaSkgPSAwCisgICAgICAgICAgY3VycmVudF90aWQoaSkgPSAwCisgICAgICAgIGVuZCBkbworCishJG9tcCBwYXJhbGxlbCBwcml2YXRlKG15aikgc2hhcmVkKGopCishJG9tcCBzaW5nbGUKKyAgICAgICAgZG8gaT0xLCBOVU1fVEFTS1MKKyAgICAgICAgaiA9IGkKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgbXlqID0gagorISRvbXAgdGFzayA8b21wdHM6Y2hlY2s+dW50aWVkPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICBjYWxsIG15X3NsZWVwKFNMRUVQVElNRSkKKyAgICAgICAgICBzdGFydF90aWQobXlqKSA9IG9tcF9nZXRfdGhyZWFkX251bSgpCishJG9tcCB0YXNrd2FpdAorICAgICAgPG9tcHRzOmNoZWNrPmlmIChNT0Qoc3RhcnRfdGlkKG15aiksMikgLm5lLiAwKSB0aGVuPC9vbXB0czpjaGVjaz4KKyAgICAgICAgY2FsbCBteV9zbGVlcChTTEVFUFRJTUUpCisgICAgICAgIGN1cnJlbnRfdGlkKG15aikgPSBvbXBfZ2V0X3RocmVhZF9udW0oKQorICAgICAgPG9tcHRzOmNoZWNrPgorICAgICAgIGVsc2UKKyAgICAgICAgY3VycmVudF90aWQobXlqKSA9IG9tcF9nZXRfdGhyZWFkX251bSgpCisgICAgICAgZW5kIGlmPC9vbXB0czpjaGVjaz4KKyEkb21wIGVuZCB0YXNrCisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICBlbmQgZG8KKyEkb21wIGVuZCBzaW5nbGUKKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisKKyAgICAgICAgISBjaGVjayBpZiBhdCBsZWFzdCBvbmUgdW50aWVkIHRhc2sgc3dpdGNoZWQgdGhyZWFkcworICAgICAgICBkbyBpPTEsIE5VTV9UQVNLUworICAgICAgICAgIGlmIChjdXJyZW50X3RpZChpKSAubmUuIHN0YXJ0X3RpZChpKSkgdGhlbgorICAgICAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgICBlbmQgaWYKKyAgICAgICAgZW5kIGRvCisKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90YXNrd2FpdC5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rhc2t3YWl0LmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFhOTRjNAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90YXNrd2FpdC5mCkBAIC0wLDAgKzEsODMgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHRhc2t3YWl0IGRpcmVjdGl2ZS4gRmlyc3Qgd2UgZ2VuZXJhdGUgYSBzZXQgb2YgdGFza3MsIHdoaWNoIHNldCB0aGUgZWxlbWVudHMgb2YgYW4gYXJyYXkgdG8gYSBzcGVjaWZpYyB2YWx1ZS4gVGhlbiB3ZSBkbyBhIHRhc2t3YWl0IGFuZCBjaGVjayBpZiBhbGwgdGFza3MgZmluaXNoZWQgbWVhbmluZyBhbGwgYXJyYXkgZWxlbWVudHMgY29udGFpbiB0aGUgcmlnaHQgdmFsdWUuIFRoZW4gd2UgZ2VuZXJhdGUgYSBzZWNvbmQgc2V0IHNldHRpbmcgdGhlIGFycmF5IGVsZW1lbnRzIHRvIGFub3RoZXIgdmFsdWUuIEFmdGVyIHRoZSBwYXJhbGxlbCByZWdpb24gd2UgY2hlY2sgaWYgYWxsIHRhc2tzIG9mIHRoZSBzZWNvbmQgc2V0IGZpbmlzaGVkIGFuZCB3ZXJlIGV4ZWN1dGVkIGFmdGVyIHRoZSB0YXNrcyBvZiB0aGUgZmlyc3Qgc2V0Ljwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGFza3dhaXQ8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgc2luZ2xlLG9tcCB0YXNrPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOQ0xVREUgIm9tcF9teV9zbGVlcC5mIgorCisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2t3YWl0PC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisgICAgICAgIElOVEVHRVIgcmVzdWx0MSwgcmVzdWx0MgorICAgICAgICBJTlRFR0VSIGFycmF5KE5VTV9UQVNLUykKKyAgICAgICAgSU5URUdFUiBpLCBteWkKKyAgICAgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBleHRlcm5hbCBteV9zbGVlcAorICAgICAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgICAgIHJlc3VsdDEgPSAwCisgICAgICAgIHJlc3VsdDIgPSAwCisKKyAgICAgICAgISBmaWxsIGFycmF5CisgICAgICAgIGRvIGkgPSAxLCBOVU1fVEFTS1MKKyAgICAgICAgICBhcnJheShpKSA9IDAKKyAgICAgICAgZW5kIGRvCisKKyEkb21wIHBhcmFsbGVsIHNoYXJlZChpKSBwcml2YXRlKG15aSkKKyEkb21wIHNpbmdsZQorICAgICAgICBkbyBpPTEsIE5VTV9UQVNLUworICAgICAgICAgISBGaXJzdCB3ZSBoYXZlIHRvIHN0b3JlIHRoZSB2YWx1ZSBvZiB0aGUgbG9vcCBpbmRleCBpbiBhIG5ldyB2YXJpYWJsZQorICAgICAgICAgISB3aGljaCB3aWxsIGJlIHByaXZhdGUgZm9yIGVhY2ggdGFzayBiZWNhdXNlIG90aGVyd2lzZSBpdCB3aWxsIGJlCisgICAgICAgICAhIG92ZXJ3cml0dGVuIGlmIHRoZSBleGVjdXRpb24gb2YgdGhlIHRhc2sgdGFrZXMgbG9uZ2VyIHRoYW4gdGhlIHRpbWUKKyAgICAgICAgICEgd2hpY2ggaXMgbmVlZGVkIHRvIGVudGVyIHRoZSBuZXh0IHN0ZXAgb2YgdGhlIGxvb3AhCisKKyAgICAgICAgIG15aSA9IGkKKworISRvbXAgdGFzaworICAgICAgICAgIGNhbGwgbXlfc2xlZXAoU0xFRVBUSU1FKQorICAgICAgICAgIGFycmF5KG15aSkgPSAxCishJG9tcCBlbmQgdGFzaworICAgICAgICBlbmQgZG8KKworICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICA8b21wdHM6Y2hlY2s+CishJG9tcCB0YXNrd2FpdAorICAgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgICA8L29tcHRzOm9ycGhhbj4KKworICAgICAgICAhIGNoZWNrIGlmIGFsbCB0YXNrcyB3ZXJlIGZpbmlzaGVkCisgICAgICAgIGRvIGk9MSwgTlVNX1RBU0tTCisgICAgICAgICAgaWYgKGFycmF5KGkpIC5uZS4gMSkgdGhlbgorICAgICAgICAgICAgICByZXN1bHQxID0gcmVzdWx0MSArIDEKKyAgICAgICAgICBlbmQgaWYKKyAgICAgICAgZW5kIGRvCisKKyAgICAgICAgISBnZW5lcmF0ZSBzb21lIG1vcmUgdGFza3Mgd2hpY2ggbm93IHNoYWxsIG92ZXJ3cml0ZSB0aGUgdmFsdWVzaW4gdGhlCisgICAgICAgICEgYXJyYXkKKyAgICAgICAgZG8gaT0xLCBOVU1fVEFTS1MKKyAgICAgICAgICBteWkgPSBpCishJG9tcCB0YXNrCisgICAgICAgICAgYXJyYXkobXlpKSA9IDIKKyEkb21wIGVuZCB0YXNrCisgICAgICAgIGVuZCBkbworCishJG9tcCBlbmQgc2luZ2xlCishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICAhIGZpbmFsIGNoZWNrLCBpZiBhbGwgYXJyYXkgZWxlbWVudHMgY29udGFpbiB0aGUgcmlnaHQgdmFsdWVzCisgICAgICAgIGRvIGk9MSwgTlVNX1RBU0tTCisgICAgICAgICAgaWYgKGFycmF5KGkpIC5uZS4gMikgdGhlbgorICAgICAgICAgICAgcmVzdWx0MiA9IHJlc3VsdDIgKyAxCisgICAgICAgICAgZW5kIGlmCisgICAgICAgIGVuZCBkbworCisgICAgICAgIGlmICggKHJlc3VsdDEgLmVxLiAwKSAuYW5kLiAocmVzdWx0MiAuZXEuIDApICkgdGhlbgorICAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgZW5kIGlmCisKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90ZXN0X25lc3RfbG9jay5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rlc3RfbmVzdF9sb2NrLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM5NmQyNAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90ZXN0X25lc3RfbG9jay5mCkBAIC0wLDAgKzEsNjEgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wX3Rlc3RfbmVzdF9sb2NrIGZ1bmN0aW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXBfdGVzdF9uZXN0X2xvY2s8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgZmx1c2g8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90ZXN0X25lc3RfbG9jazwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiByZXN1bHQKKyFyZXN1bHQgaXM6CishICAgICAgMCAtLSBpZiB0aGUgdGVzdCBmYWlscworISAgICAgIDEgLS0gaWYgdGhlIHRlc3Qgc3VjY2VlZHMKKyAgICAgICAgSU5URUdFUiBucl90aHJlYWRzX2luX3NpbmdsZQorICAgICAgICBJTlRFR0VSIG5yX2l0ZXJhdGlvbnMKKyAgICAgICAgSU5URUdFUiBpCisgICAgICAgICAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIGluY2x1ZGUgIm9tcF9saWIuaCIKKyAgICAgICAgSU5URUdFUiAoS0lORD1PTVBfTkVTVF9MT0NLX0tJTkQpIDo6IGxvY2sKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gbG9jaworICAgICAgICAgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyEgICAgICAgIElOVEVHRVIgIGxjaworICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisKKyAgICAgICAgbnJfaXRlcmF0aW9ucz0wCisgICAgICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlPTAKKyAgICAgICAgQ0FMTCBPTVBfSU5JVF9ORVNUX0xPQ0sobG9jaykKKyAgICAgICAgcmVzdWx0PTAKKworISRvbXAgcGFyYWxsZWwgc2hhcmVkKGxvY2ssbnJfdGhyZWFkc19pbl9zaW5nbGUsbnJfaXRlcmF0aW9ucyxyZXN1bHQpCishJG9tcCBkbworICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPgorICAgICAgICAgIERPIFdISUxFKE9NUF9URVNUX05FU1RfTE9DSyhsb2NrKSAuRVEuIDApCisgICAgICAgICAgRU5EIERPCisgICAgICAgICAgICAgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgICAgPC9vbXB0czpvcnBoYW4+CishJG9tcCBmbHVzaAorICAgICAgICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlPW5yX3RocmVhZHNfaW5fc2luZ2xlKzEKKyEkb21wIGZsdXNoCisgICAgICAgICAgbnJfaXRlcmF0aW9ucz1ucl9pdGVyYXRpb25zKzEKKyAgICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZT1ucl90aHJlYWRzX2luX3NpbmdsZS0xCisgICAgICAgICAgcmVzdWx0PXJlc3VsdCtucl90aHJlYWRzX2luX3NpbmdsZQorICAgICAgICAgICAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4KKyAgICAgICAgICBDQUxMIE9NUF9VTlNFVF9ORVNUX0xPQ0sobG9jaykKKyAgICAgICAgICAgICAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKyEkb21wIGVuZCBwYXJhbGxlbAorICAgICAgICBDQUxMIG9tcF9kZXN0cm95X25lc3RfbG9jayhsb2NrKQorISAgICAgICAgICAgICAgIHByaW50ICosIHJlc3VsdCwgbnJfaXRlcmF0aW9ucworICAgICAgICBJRihyZXN1bHQuRVEuMCAuQU5ELiBucl9pdGVyYXRpb25zIC5FUS4gTE9PUENPVU5UKSBUSEVOCisgICAgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT49MQorICAgICAgICBFTFNFCisgICAgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT49MAorICAgICAgICBFTkRJRgorICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rlc3Rsb2NrLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGVzdGxvY2suZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjEzMDRkCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rlc3Rsb2NrLmYKQEAgLTAsMCArMSw1NyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXBfdGVzdGxvY2sgZnVuY3Rpb24uIFRoZSB0ZXN0IGNvdW50cyB0aGUgdGhyZWFkcyBlbnRlcmluZyBhbmQgZXhpdGluZyBhIHNpbmdsZSByZWdpb24gd2hpY2ggaXMgYnVpbGQgd2l0aCBhIHRlc3RfbG9jayBpbiBhbiBlbmRsZXNzIGxvb3AuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcF90ZXN0X2xvY2s8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgZmx1c2g8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90ZXN0bG9jazwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiByZXN1bHQKKyAgICAgICAgSU5URUdFUiBucl90aHJlYWRzX2luX3NpbmdsZQorICAgICAgICBJTlRFR0VSIG5yX2l0ZXJhdGlvbnMKKyAgICAgICAgSU5URUdFUiBpCisgICAgICAgICAgICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgaW5jbHVkZSAib21wX2xpYi5oIgorICAgICAgICBJTlRFR0VSIChLSU5EPU9NUF9MT0NLX0tJTkQpOjpsb2NrCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIGxvY2sKKyAgICAgICAgICAgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorCisgICAgICAgIG5yX2l0ZXJhdGlvbnM9MAorICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZT0wCisgICAgICAgIENBTEwgT01QX0lOSVRfTE9DSyhsb2NrKQorICAgICAgICByZXN1bHQ9MAorCishJG9tcCBwYXJhbGxlbCBzaGFyZWQobG9jayxucl90aHJlYWRzX2luX3NpbmdsZSxucl9pdGVyYXRpb25zLHJlc3VsdCkKKyEkb21wIGRvCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICAgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+CisgICAgICAgICAgRE8gV0hJTEUgKC5OT1QuIE9NUF9URVNUX0xPQ0sobG9jaykpCisgICAgICAgICAgRU5EIERPCisgICAgICAgICAgICAgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgICAgPC9vbXB0czpvcnBoYW4+CishJG9tcCBmbHVzaAorICAgICAgICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlPW5yX3RocmVhZHNfaW5fc2luZ2xlKzEKKyEkb21wIGZsdXNoCisgICAgICAgICAgbnJfaXRlcmF0aW9ucz1ucl9pdGVyYXRpb25zKzEKKyAgICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZT1ucl90aHJlYWRzX2luX3NpbmdsZS0xCisgICAgICAgICAgcmVzdWx0PXJlc3VsdCtucl90aHJlYWRzX2luX3NpbmdsZQorICAgICAgICAgICAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4KKyAgICAgICAgICBDQUxMIE9NUF9VTlNFVF9MT0NLKGxvY2spCisgICAgICAgICAgICAgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCishJG9tcCBlbmQgcGFyYWxsZWwKKyAgICAgICAgQ0FMTCBPTVBfREVTVFJPWV9MT0NLKGxvY2spCishICAgICAgICAgICAgICAgcHJpbnQgKiwgcmVzdWx0LCBucl9pdGVyYXRpb25zCisgICAgICAgIElGKHJlc3VsdC5FUS4wIC5BTkQuIG5yX2l0ZXJhdGlvbnMgLkVRLiBMT09QQ09VTlQpIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PTEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT49MAorICAgICAgICBFTkRJRgorICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rlc3RzdWl0ZS5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rlc3RzdWl0ZS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZDQ4MjEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGVzdHN1aXRlLmYKQEAgLTAsMCArMSwyIEBACisJaW50ZWdlciBMT09QQ09VTlQKKwlwYXJhbWV0ZXIgKExPT1BDT1VOVD0xMDAwKQpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3RocmVhZHByaXZhdGUuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90aHJlYWRwcml2YXRlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkyMDQ5OAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90aHJlYWRwcml2YXRlLmYKQEAgLTAsMCArMSw4OSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgdGhyZWFkcHJpdmF0ZSBkaXJlY3RpdmUgYnkgZmlsbGluZyBhbiBhcnJheSB3aXRoIHJhbmRvbSBudW1iZXJzIGluIGFuIHBhcmFsbGVsaXNlZCByZWdpb24uIEVhY2ggdGhyZWFkIGdlbmVyYXRlcyBvbmUgbnVtYmVyIG9mIHRoZSBhcnJheSBhbmQgc2F2ZXMgdGhpcyBpbiBhIHRlbXBvcmFyeSB0aHJlYWRwcml2YXRlIHZhcmlhYmxlLiBJbiBhIHNlY29uZCBwYXJhbGxlbGlzZWQgcmVnaW9uIHRoZSB0ZXN0IGNvbnRyb2xzLCB0aGF0IHRoZSB0ZW1wb3JhcnkgdmFyaWFibGUgY29udGFpbnMgc3RpbGwgdGhlIGZvcm1lciB2YWx1ZSBieSBjb21wYXJpbmcgaXQgd2l0aCB0aGUgb25lIGluIHRoZSBhcnJheS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHRocmVhZHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWwsb21wX3NldF9keW5hbWljLG9tcF9nZXRfbnVtX3RocmVhZHMsb21wIG1hc3Rlcjwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CishWWkgV2VuIG1vZGlmaWVkIHRoaXMgZnVuY3Rpb24gZnJvbSBoaXMgb3duIHVuZGVyc3RhbmRpbmcgb2YgdGhlIHNlbWFudGljcworIW9mIEMgdmVyc2lvbiBhdCAwNTA0MjAwNAorIVRoZSB1bmRlZXN0YW5kaW5nIGlzIHRoYXQgc3VtMCBhbmQgbXl2YWx1ZSBjYW4gYmUgbG9jYWwgc3RhdGljIHZhcmlhYmxlcworIW9mIHRoZSBjaGtfb21wX3RocmVhZHByaXZhdGUgZnVuY3Rpb24uIFRoZXJlIGlzIG5vIG5lZWQgdG8gdXNlIGNvbW1vbgorIWJsb2NrCisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3RocmVhZHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgc3VtLCBrbm93bl9zdW0sIGkgLCBpdGVyLCByYW5rLHNpemUsIGZhaWxlZAorICAgICAgICBJTlRFR0VSIG9tcF9nZXRfbnVtX3RocmVhZHMsIG9tcF9nZXRfdGhyZWFkX251bQorICAgICAgICBSRUFMIG15X3JhbmRvbQorICAgICAgICBSRUFMLCBBTExPQ0FUQUJMRTo6IGRhdGEoOikKKyAgICAgICAgSU5URUdFUiByYW5kb21fc2l6ZQorICAgICAgICBJTlRSSU5TSUMgcmFuZG9tX251bWJlcgorICAgICAgICBJTlRSSU5TSUMgcmFuZG9tX3NlZWQKKyAgICAgICAgRVhURVJOQUwgb21wX3NldF9keW5hbWljCisKKyFZaSBXZW4gbW9kaWZpZWQgYXQgMDUwNDIwMDQgOiBhZGQgInNhdmUiCisgICAgICAgIElOVEVHRVIsIFNBVkU6OiBzdW0wCisgICAgICAgIFJFQUwsIFNBVkU6Om15dmFsdWUKKyFZaSBXZW4gY29tbWVudGVkIHR3byBjb21tb24gYmxvY2tzCishCWNvbW1vbi9jc3VtMC8gc3VtMAorIQljb21tb24vY215dmFsdWUvIG15dmFsdWUKKyEhISEhISEhISEkb21wIHRocmVhZHByaXZhdGUoL2NzdW0wLywvY215dmFsdWUvKQorCQk8b21wdHM6Y2hlY2s+CishJG9tcCB0aHJlYWRwcml2YXRlKHN1bTAsbXl2YWx1ZSkKKwkJPC9vbXB0czpjaGVjaz4KKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorCisgICAgICAgIHN1bSA9IDAKKyAgICAgICAgZmFpbGVkID0gMAorICAgICAgICBzdW0wPTAKKyAgICAgICAgbXl2YWx1ZT0wCisgICAgICAgIHJhbmRvbV9zaXplPTQ1CisgICAgICAgIENBTEwgb21wX3NldF9keW5hbWljKC5GQUxTRS4pCishJG9tcCBwYXJhbGxlbAorICAgICAgICBzdW0wID0gMAorISRvbXAgZG8KKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHN1bSA9IHN1bSArIHN1bTAKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgZW5kIHBhcmFsbGVsCisgICAgICAgIGtub3duX3N1bSA9IChMT09QQ09VTlQqKExPT1BDT1VOVCsxKSkvMgorICAgICAgICBJRiAoIGtub3duX3N1bSAuTkUuIHN1bSApIFRIRU4KKyAgICAgICAgICBQUklOVCAqLCAnIGtub3duX3N1bSA9Jywga25vd25fc3VtLCAnLCBzdW0gPScsc3VtCisgICAgICAgIEVORCBJRgorCisgICAgICAgIENBTEwgb21wX3NldF9keW5hbWljKC5GQUxTRS4pCisKKyEkb21wIHBhcmFsbGVsCishJG9tcCBtYXN0ZXIKKyAgICAgICAgc2l6ZSA9IG9tcF9nZXRfbnVtX3RocmVhZHMoKQorICAgICAgICBBTExPQ0FURSAoIGRhdGEoc2l6ZSkgKQorISRvbXAgZW5kIG1hc3RlcgorISRvbXAgZW5kIHBhcmFsbGVsCisgICAgICAgIENBTEwgUkFORE9NX1NFRUQoU0laRT1yYW5kb21fc2l6ZSkKKyAgICAgICAgRE8gaXRlciA9IDAsIDk5CisgICAgICAgICAgQ0FMTCBSQU5ET01fTlVNQkVSKEhBUlZFU1Q9bXlfcmFuZG9tKQorISRvbXAgcGFyYWxsZWwgcHJpdmF0ZShyYW5rKQorICAgICAgICAgIHJhbmsgPSBvbXBfZ2V0X3RocmVhZF9udW0oKSsxCisgICAgICAgICAgbXl2YWx1ZSA9IG15X3JhbmRvbSArIHJhbmsKKyAgICAgICAgICBkYXRhKHJhbmspID0gbXl2YWx1ZQorISRvbXAgZW5kIHBhcmFsbGVsCishJG9tcCBwYXJhbGxlbCBwcml2YXRlKHJhbmspCisgICAgICAgICAgcmFuayA9IG9tcF9nZXRfdGhyZWFkX251bSgpKzEKKyAgICAgICAgICBJRiAoIG15dmFsdWUgLk5FLiBkYXRhKHJhbmspICkgVEhFTgorICAgICAgICAgICAgZmFpbGVkID0gZmFpbGVkICsgMQorICAgICAgICAgICAgUFJJTlQgKiwgJyBteXZhbHVlID0nLG15dmFsdWUsJyBkYXRhKHJhbmspPScsIGRhdGEocmFuaykKKyAgICAgICAgICBFTkQgSUYKKyEkb21wIGVuZCBwYXJhbGxlbAorICAgICAgICBFTkQgRE8KKyAgICAgICAgREVBTExPQ0FURSggZGF0YSkKKyAgICAgICAgSUYgKCAoa25vd25fc3VtIC5FUS4gc3VtKSAuQU5ELiAoZmFpbGVkIC5ORS4gMSkgKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgZWxzZQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwIAorICAgICAgICBlbmQgaWYKKyAgICAgIEVORAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF93b3Jrc2hhcmUuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF93b3Jrc2hhcmUuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGZhYTI3Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3dvcmtzaGFyZS5mCkBAIC0wLDAgKzEsMTQyIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgaWYgV09SS1NIQVJFIGlzIHByZXNlbnQuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB3b3Jrc2hhcmU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCishIEZ1bmN0aW9uOiBvbXBfd29ya3NoYXJlCishIAorISBieSBDaHVuaHVhIExpYW8sIFVuaXZlcnNpdHkgb2YgSG91c3RvbgorISBPY3QuIDIwMDUgLSBGaXJzdCB2ZXJzaW9uCishIAorISBUaGUgaWRlYSBmb3IgdGhlIHRlc3QgaXMgdGhhdCBpZiBXT1JLU0hBUkUgaXMgbm90IHByZXNlbnQsCishIHRoZSBhcnJheSBhc3NpZ25tZW50IGluIFBBUkFMTEVMIHJlZ2lvbiB3aWxsIGJlIGV4ZWN1dGVkIGJ5IGVhY2ggCishIHRocmVhZCBhbmQgdGhlbiB3cm9uZ2Z1bGx5IHJlcGVhdGVkIHNldmVyYWwgdGltZXMuCishCishIFRPRE86RG8gd2UgbmVlZCB0ZXN0IGZvciBXSEVSRSBhbmQgRk9SQUxMPworISBBIHNpbXBsZSB0ZXN0IGZvciBXSEVSRSBhbmQgRk9SQUxMIGlzIGFkZGVkIGJ5IFpoZW55aW5nIExpdQorISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfd29ya3NoYXJlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHJlc3VsdCxpCisgICAgICAgIElOVEVHRVIgc2NhbGFyMDIsc2NhbGFyMTIsc2NhbGFyMjIsc2NhbGFyMzIsY291bnQKKyAgICAgICAgUkVBTCwgRElNRU5TSU9OKDEwMDApOjpGRgorPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIHNjYWxhcjAsc2NhbGFyMSxzY2FsYXIyLHNjYWxhcjMKKyAgICAgICAgSU5URUdFUiwgRElNRU5TSU9OKDEwMDApOjpBQSxCQixDQworICAgICAgICBSRUFMLCBESU1FTlNJT04oMTAwMCk6OkRECisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIHNjYWxhcjAsc2NhbGFyMSxzY2FsYXIyLHNjYWxhcjMsCisgICAgICYgICAgICBBQSxCQixDQyxERAorPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgICAgICByZXN1bHQ9MAorICAgICAgICBzY2FsYXIwPTAKKyAgICAgICAgc2NhbGFyMDI9MAorICAgICAgICBzY2FsYXIxPTAKKyAgICAgICAgc2NhbGFyMTI9MAorICAgICAgICBzY2FsYXIyPTAKKyAgICAgICAgc2NhbGFyMjI9MAorICAgICAgICBzY2FsYXIzPTAKKyAgICAgICAgc2NhbGFyMzI9MAorIAorICAgICAgICBjb3VudCA9IDAKKworICAgICAgICBBQT0wCisgICAgICAgIEJCPTAKKworICAgICAgICBkbyBpPTEsMTAwMAorICAgICAgICAgIENDKGkpID0gaQorICAgICAgICAgIEZGKGkpID0gMS4wL2kKKyAgICAgICAgZW5kIGRvCisKKyEkT01QIFBBUkFMTEVMCis8b21wdHM6b3JwaGFuPgorPG9tcHRzOmNoZWNrPiEkT01QICAgV09SS1NIQVJFPC9vbXB0czpjaGVjaz4KKworISB0ZXN0IGlmIHdvcmsgaXMgZGl2aWRlZCBvciBub3QgZm9yIGFycmF5IGFzc2lnbm1lbnQKKyAgICAgICAgQUE9QUErMQorCishIHRlc3QgaWYgc2NhbGFyIGFzc2lnbm1lbnQgaXMgdHJlYXRlZCBhcyBhIHNpbmdsZSB1bml0IG9mIHdvcmsKKyAgICAgICAgc2NhbGFyMD1zY2FsYXIwKzEgCisKKyEgdGVzdCBpZiBhdG9taWMgaXMgdHJlYXRlZCBhcyBhIHNpbmdsZSB1bml0IG9mIHdvcmsKKyEkT01QIEFUT01JQworICAgICAgICBzY2FsYXIxPXNjYWxhcjErMSAKKyEgdGVzdCBpZiBjcml0aWNhbCBpcyB0cmVhdGVkIGFzIGEgc2luZ2xlIHVuaXQgb2Ygd29yaworISRPTVAgQ1JJVElDQUwKKyAgICAgICAgc2NhbGFyMj1zY2FsYXIyKzEKKyEkT01QIEVORCBDUklUSUNBTAorCishIHRlc3QgaWYgUEFSQUxMRUwgaXMgdHJlYXRlZCBhcyBhIHNpbmdsZSB1bml0IG9mIHdvcmsKKyEkT01QIFBBUkFMTEVMCisgICAgICAgIHNjYWxhcjM9c2NhbGFyMysxCishJE9NUCBFTkQgUEFSQUxMRUwKKworICAgICAgICBXSEVSRSAoIENDIC5uZS4gMCApIEREID0gMS4wL0NDCisKKyAgICAgICAgRk9SQUxMIChJPTE6MTAwMCkgQ0MoaSkgPSAtaQorCis8b21wdHM6Y2hlY2s+ISRPTVAgICBFTkQgV09SS1NIQVJFPC9vbXB0czpjaGVjaz4KKzwvb21wdHM6b3JwaGFuPgorISRPTVAgRU5EIFBBUkFMTEVMCisKKyFzZXF1ZW50aWFsIGVxdWl2YWxlbnQgc3RhdGVtZW50cyBmb3IgY29tcGFyaXNvbiAKKyAgICAgICBCQj1CQisxCisgICAgICAgc2NhbGFyMDI9c2NhbGFyMDIrMQorICAgICAgIHNjYWxhcjEyPXNjYWxhcjEyKzEKKyAgICAgICBzY2FsYXIyMj1zY2FsYXIyMisxCisgICAgICAgc2NhbGFyMzI9c2NhbGFyMzIrMQorCishICAgICAgd3JpdGUgKDEsKikgImNrOnN1bSBvZiBBQSBpcyIsU1VNKEFBKSwiIHN1bSBvZiBCQiBpcyAiLHN1bShCQikKKyAgICAgICBpZiAoU1VNKEFBKS89U1VNKEJCKSkgdGhlbgorICAgICAgICAgICAgd3JpdGUoMSwqKSAiQXJyYXkgYXNzaWdubWVudCBoYXMgc29tZSBwcm9ibGVtIgorICAgICAgICAgICAgcmVzdWx0PXJlc3VsdCArMQorICAgICAgIGVuZGlmCisgICAgICAgaWYgKHNjYWxhcjAvPXNjYWxhcjAyKSB0aGVuCisgICAgICAgICAgd3JpdGUoMSwqKSAiU2NhbGFyIGFzc2lnbm1lbnQgaGFzIHNvbWUgcHJvYmxlbSIKKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKzEKKyAgICAgICBlbmRpZgorICAgICAgIGlmIChzY2FsYXIxLz1zY2FsYXIxMikgdGhlbgorICAgICAgICAgIHdyaXRlKDEsKikgIkF0b21pYyBpbnNpZGUgV09SS1NIQVJFIGhhcyBzb21lIHByb2JsZW0iCisgICAgICAgICByZXN1bHQgPSByZXN1bHQgKzEKKyAgICAgICBlbmRpZgorICAgICAgIGlmIChzY2FsYXIyLz1zY2FsYXIyMikgdGhlbgorICAgICAgICAgIHdyaXRlKDEsKikgIkNSSVRJQ0FMIGluc2lkZSBXT1JLU0hBUkUgaGFzIHNvbWUgcHJvYmxlbSIKKyAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArMQorICAgICAgIGVuZGlmCisgICAgICAgaWYgKHNjYWxhcjMvPXNjYWxhcjMyKSB0aGVuCisgICAgICAgICAgIHdyaXRlKDEsKikgIlBBUkFMTEVMIGluc2lkZSBXT1JLU0hBUkUgaGFzIHNvbWUgcHJvYmxlbSIKKyAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsxCisgICAgICAgZW5kaWYKKyAgICAgICBkbyBpPTEsMTAwMAorICAgICAgICAgaWYgKCBhYnMoIEREKGkpLSBGRihpKSkgLmd0LiAxLjBFLTQgKSB0aGVuCisJICAgIGNvdW50ID0gY291bnQgKyAxCisgICAgICAgICBlbmQgaWYKKyAgICAgICBlbmQgZG8KKyAgICAgICBpZiAoIGNvdW50IC5uZS4gMCApIHRoZW4KKyAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgICB3cml0ZSgxLCopICJXSEVSRSBoYXMgc29tZSBwcm9ibGVtIgorICAgICAgIGVuZCBpZgorCisgICAgICAgY291bnQgPSAwCisgICAgICAgZG8gaT0xLDEwMDAKKyAgICAgICAgIGlmICggQ0MoaSkgLm5lLiAtaSApIHRoZW4KKyAgICAgICAgICAgIGNvdW50ID0gY291bnQgKyAxCisgICAgICAgICBlbmQgaWYKKyAgICAgICBlbmQgZG8KKyAgICAgICBpZiAoIGNvdW50IC5uZS4gMCApIHRoZW4KKyAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgICB3cml0ZSgxLCopICJGT1JBTEwgaGFzIHNvbWUgcHJvYmxlbSIKKyAgICAgICBlbmQgaWYKKworCishaWYgYW55dGhpbmcgaXMgd3JvbmcsIHNldCByZXR1cm4gdmFsdWUgdG8gMAorICAgICAgIGlmIChyZXN1bHQ9PTApIHRoZW4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgIGVsc2UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgIGVuZCBpZgorICAgICAgIGVuZAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF93b3Jrc2hhcmVfZGVmYXVsdC5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3dvcmtzaGFyZV9kZWZhdWx0LmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc3NGM0MwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF93b3Jrc2hhcmVfZGVmYXVsdC5mCkBAIC0wLDAgKzEsMzYgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIG1hc3RlciBkaXJlY3RpdmUgYnkgY291bnRpbmcgdXAgYSB2YXJpYWJsZSBpbiBhIG9tcCBtYXN0ZXIgc2VjdGlvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHdvcmtzaGFyZSBkZWZhdWx0PC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfd29ya3NoYXJlX2RlZmF1bHQ8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgc3VtCisgICAgICAgIElOVEVHRVIga25vd25fc3VtCisgICAgICAgIElOVEVHRVIgbXlzdW0KKyAgICAgICAgSU5URUdFUiBpCisKKyAgICAgICAga25vd25fc3VtID0gOTk5KjEwMDAvMgorCishJG9tcCBwYXJhbGxlbCBkZWZhdWx0KHByaXZhdGUpIHNoYXJlZChzdW0pCishJG9tcCBkbyAKKyAgICAgICAgRE8gaSA9IDEsIDk5OQorICAgICAgICAgICBteXN1bSA9IG15c3VtICsgaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbyAKKworISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgbXlzdW0KKyEkb21wIGVuZCBjcml0aWNhbAorCishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIChrbm93bl9zdW0gLkVRLiBzdW0pICkgVEhFTgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF93dGltZS5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3d0aW1lLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU3MzM0ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF93dGltZS5mCkBAIC0wLDAgKzEsNDMgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wX2dldF93dGltZSBmdW5jdGlvbi4gSXQgY29tcGFyZXMgdGhlIHRpbWUgd2l0aCB3aGljaCBpcyBjYWxsZWQgYSBzbGVlcCBmdW5jdGlvbiB3aXRoIHRoZSB0aW1lIGl0IHRvb2sgYnkgbWVzc3VyaW5nIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGNhbGwgb2YgdGhlIHNsZWVwIGZ1bmN0aW9uIGFuZCBpdHMgZW5kLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXBfZ2V0X3d0aW1lPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3d0aW1lPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gc3RhcnQKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBlbmR0aW1lCisgICAgICAgIENPTU1PTiBzdGFydCwgZW5kdGltZQorICAgICAgICBpbmNsdWRlICJvbXBfbGliLmgiCisgICAgICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgd2FpdF90aW1lCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gbWVhc3VyZWRfdGltZQorICAgICAgICBJTlRFR0VSIGZpbGV1bml0CisgICAgICAgIHdhaXRfdGltZT0xCisKKyAgICAgICAgc3RhcnQgPSAwOworICAgICAgICBlbmR0aW1lID0gMDsKKworICAgICAgICAgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPgorICAgICAgICBzdGFydD1vbXBfZ2V0X3d0aW1lKCkKKyAgICAgICAgICAgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICBDQUxMIHNsZWVwKHdhaXRfdGltZSkKKyAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4KKyAgICAgICAgZW5kdGltZT1vbXBfZ2V0X3d0aW1lKCkKKyAgICAgICAgICAgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICBtZWFzdXJlZF90aW1lPWVuZHRpbWUtc3RhcnQKKyAgICAgICAgV1JJVEUoMSwqKSAid29yayB0b29rIixtZWFzdXJlZF90aW1lLCJzZWMuIHRpbWUuIgorICAgICAgICBJRihtZWFzdXJlZF90aW1lLkdULjAuOTkqd2FpdF90aW1lIC5BTkQuCisgICAgICYgbWVhc3VyZWRfdGltZSAuTFQuIDEuMDEqd2FpdF90aW1lKSBUSEVOCisgICAgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT49MQorICAgICAgICBFTFNFCisgICAgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT49MAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9kb19maXJzdHByaXZhdGUuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9kb19maXJzdHByaXZhdGUuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWFlNTI3Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vcGFyX2RvX2ZpcnN0cHJpdmF0ZS5mCkBAIC0wLDAgKzEsMjYgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIGRvIGZpcnN0cHJpdmF0ZSBkaXJlY3RpdmUuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBmb3IgZmlyc3Rwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+cGFyIGRvIHJlZHVjdGlvbixwYXIgZG8gcHJpdmF0ZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+cGFyX2RvX2ZpcnN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBzdW0sa25vd25fc3VtLCBpMiwgaQorICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisgICAgICAgIHN1bSA9MAorICAgICAgICBpMiA9IDMKKyEkb21wIHBhcmFsbGVsIGRvIDxvbXB0czpjaGVjaz5maXJzdHByaXZhdGUoaTIpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz5wcml2YXRlKGkyKTwvb21wdHM6Y3Jvc3NjaGVjaz4gcmVkdWN0aW9uKCs6c3VtKQorICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgIHN1bSA9IHN1bSArICggaSsgaTIpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisgICAgICAgIGtub3duX3N1bSA9IChMT09QQ09VTlQqKExPT1BDT1VOVCsxKSkvMiszKkxPT1BDT1VOVAorICAgICAgICBJRiAoIGtub3duX3N1bSAuRVEuIHN1bSApIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfZG9faWYuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9kb19pZi5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiN2ZjOWEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfZG9faWYuZgpAQCAtMCwwICsxLDMyIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBmb3IgaWYgZGlyZWN0aXZlLiBOZWVkcyBhdCBsZWFzdCB0d28gdGhyZWFkcy48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIGRvIGlmPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+PC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5wYXJfZG9faWY8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgb21wX2dldF9udW1fdGhyZWFkcworICAgICAgICBJTlRFR0VSIHN1bSxrbm93bl9zdW0sIGksIG51bV90aHJlYWRzCisgICAgICAgIElOVEVHRVIgY29udHJvbAorICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisgICAgICAgIHN1bSA9IDAKKworICAgICAgICBjb250cm9sID0gMAorISRvbXAgcGFyYWxsZWwgZG8gPG9tcHRzOmNoZWNrPmlmIChjb250cm9sID09IDEpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBzdW0gPSBzdW0gKyBpCisgICAgICAgICAgbnVtX3RocmVhZHMgPSBvbXBfZ2V0X251bV90aHJlYWRzICgpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisgICAgICAgIFdSSVRFICgxLCopICJOdW1iZXIgb2YgdGhyZWFkcyBkZXRlcm1pbmVkIGJ5OiJcCisgICAgICAgICAgICAgICAgICAgICJvbWdfZ2V0X251bV90aHJlYXNkOiIsIG51bV90aHJlYWRzCisgICAgICAgIGtub3duX3N1bSA9IChMT09QQ09VTlQqKExPT1BDT1VOVCsxKSkvMgorICAgICAgICBJRiAoIGtub3duX3N1bSAuRVEuIHN1bSAuQU5ELiBudW1fdGhyZWFkcyAuRVEuIDEpIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfZG9fbGFzdHByaXZhdGUuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9kb19sYXN0cHJpdmF0ZS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MDIxMGMKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfZG9fbGFzdHByaXZhdGUuZgpAQCAtMCwwICsxLDI4IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBkbyBsYXN0cHJpdmF0ZSBkaXJlY3RpdmUuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBkbyBsYXN0cHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPnBhciBkbyByZWR1Y3Rpb24sIHBhciBkbyBwcml2YXRlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5wYXJfZG9fbGFzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgc3VtLCBrbm93bl9zdW0sIGkgLCBpMAorICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisgICAgICAgIHN1bSA9IDAKKyAgICAgICAgaTAgPSAtMQorCishJG9tcCBwYXJhbGxlbCBkbyByZWR1Y3Rpb24oKzpzdW0pIHNjaGVkdWxlKHN0YXRpYyw3KSA8b21wdHM6Y2hlY2s+bGFzdHByaXZhdGUoaTApPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz5wcml2YXRlKGkwKTwvb21wdHM6Y3Jvc3NjaGVjaz4KKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBzdW0gPSBzdW0gKyBpCisgICAgICAgICAgaTAgPSBpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisgICAgICAgIGtub3duX3N1bSA9IChMT09QQ09VTlQqKExPT1BDT1VOVCsxKSkvMgorICAgICAgICBJRiAoIChrbm93bl9zdW0gLkVRLiBzdW0pIC5BTkQuIChpMCAuRVEuIExPT1BDT1VOVCkgKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5EICAgCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vcGFyX2RvX29yZGVyZWQuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9kb19vcmRlcmVkLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNkNGNkMAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9kb19vcmRlcmVkLmYKQEAgLTAsMCArMSw2NyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgZG8gb3JkZXJlZCBkaXJlY3RpdmU8L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIGRvIG9yZGVyZWQ8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5wYXIgc2NoZWR1bGUgc3RhdDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CishICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyEgSGVscGVyIGZ1bmN0aW9uIGlzX2xhcmdlcgorISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICBJTlRFR0VSIEZVTkNUSU9OIGlfaXNsYXJnZXIyKGkpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBpCisgICAgICAgIElOVEVHRVIgbGFzdF9pLGlzbGFyZ2VyCisgICAgICAgIENPTU1PTiAvY29tLyBsYXN0X2kKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorISAgICAgICAgcHJpbnQgKiwgImxhc3RfaSIsbGFzdF9pLCAiaSIsIGkKKyEgbGFzdF9pIGlzIGEgZ2xvYmFsIHZhcmlhYmxlCisgICAgICAgIElGICggaSAuR1QuIGxhc3RfaSApIFRIRU4KKyAgICAgICAgICBpc2xhcmdlciA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIGlzbGFyZ2VyID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgICAgbGFzdF9pID0gaQorICAgICAgICBpX2lzbGFyZ2VyMiA9IGlzbGFyZ2VyCisgICAgICBFTkQgRlVOQ1RJT04KKworICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPnBhcl9kb19vcmRlcmVkPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBDT01NT04gL2NvbS8gbGFzdF9pCisgICAgICAgIElOVEVHRVIga25vd25fc3VtLGksIGxhc3RfaQorPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIGlzX2xhcmdlcixzdW0saV9pc2xhcmdlcjIKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gaXNfbGFyZ2VyLHN1bSxpCis8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICAKKyAgICAgICAgc3VtPTAKKyAgICAgICAgaXNfbGFyZ2VyPTEKKyAgICAgICAgbGFzdF9pPTAKKyEkb21wIHBhcmFsbGVsIGRvIHNjaGVkdWxlKHN0YXRpYywgMSkgb3JkZXJlZAorICAgICAgICBETyBpPTEsIDk5CisgICAgICAgICAgICAgICAgPG9tcHRzOm9ycGhhbj4KKwkJPG9tcHRzOmNoZWNrPgorISRvbXAgb3JkZXJlZAorCQk8L29tcHRzOmNoZWNrPgorICAgICAgICBJRiggaV9pc2xhcmdlcjIoaSkgLkVRLiAxIC5BTkQuIGlzX2xhcmdlciAuRVEuIDEgKSBUSEVOICAKKyAgICAgICAgICBpc19sYXJnZXIgPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICBpc19sYXJnZXIgPSAwCisgICAgICAgIEVORCBJRgorICAgICAgICBzdW0gPSBzdW0gKyBpCisJCTxvbXB0czpjaGVjaz4KKyEkb21wIGVuZCBvcmRlcmVkCisJCTwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisgICAgICAgIGtub3duX3N1bSA9ICg5OSoxMDApLzIKKyFZaSBXZW47IFN1biBjb21waWxlciB3aWxsIGZhaWwgc29tZXRpbWVzCishICAgICAgICBwcmludCAqLCAic3VtIiwgc3VtLCAia3MiLCBrbm93bl9zdW0sICJsYSIsIGlzX2xhcmdlcgorICAgICAgICBJRiAoIGtub3duX3N1bSAuRVEuIHN1bSAuQU5ELiBpc19sYXJnZXIgLkVRLiAxICkgVEhFTgorICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vcGFyX2RvX3ByaXZhdGUuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9kb19wcml2YXRlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQzOWFiOQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9kb19wcml2YXRlLmYKQEAgLTAsMCArMSw0NiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgZG8gcHJpdmF0ZSBkaXJlY3RpdmUuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBkbyBwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+cGFyIGRvIHJlZHVjdGlvbixvbXAgZmx1c2g8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgU1VCUk9VVElORSBkb19zb21lX3dvcmsyKCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBSRUFMIGkKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBzdW0KKyAgICAgICAgSU5UUklOU0lDIHNxcnQKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAgICAgICBzdW0gPSAwLjAKKyAgICAgICAgaSA9IDAKKyAgICAgICAgRE8gV0hJTEUgKGkgPCBMT09QQ09VTlQpCisgICAgICAgICAgIHN1bSA9IHN1bSArIHNxcnQoaSkKKyAgICAgICAgICAgaSA9IGkgKyAxCisgICAgICAgIEVORCBETworICAgICAgRU5ECisKKyEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+cGFyX2RvX3ByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgc3VtLGtub3duX3N1bSwgaSwgaTIsIGkzCisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyAgICAgICAgc3VtID0gMAorCishJG9tcCBwYXJhbGxlbCBkbyByZWR1Y3Rpb24oKzpzdW0pIDxvbXB0czpjaGVjaz5wcml2YXRlKGkyKTwvb21wdHM6Y2hlY2s+IHNjaGVkdWxlKHN0YXRpYywxKQorICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgIGkyID0gaQorISRvbXAgZmx1c2gKKyAgICAgICAgICBDQUxMIGRvX3NvbWVfd29yazIoKQorISRvbXAgZmx1c2gKKyAgICAgICAgICBzdW0gPSBzdW0gKyBpMgorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworICAgICAgICAgIGtub3duX3N1bSA9IChMT09QQ09VTlQqKExPT1BDT1VOVCsxKSkvMgorICAgICAgICBJRiAoIGtub3duX3N1bSAuRVEuIHN1bSApIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfZG9fcmVkdWN0aW9uLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfZG9fcmVkdWN0aW9uLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWEzZjQ1NQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9kb19yZWR1Y3Rpb24uZgpAQCAtMCwwICsxLDQxNSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgZG8gcmVkdWN0aW9uIGRpcmVjdGl2ZSB3aXRoIGFsbCBpdHMgb3B0aW9ucy48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIGRvIHJlZHVjdGlvbjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPnBhcl9kb19yZWR1Y3Rpb248L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgc3VtLCBzdW0yLCBrbm93bl9zdW0sIGksIGkyLGRpZmYKKyAgICAgICAgSU5URUdFUiBwcm9kdWN0LGtub3duX3Byb2R1Y3QsaW50X2NvbnN0CisgICAgICAgIElOVEVHRVIgTUFYX0ZBQ1RPUgorICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIGRzdW0sZGtub3duX3N1bSxkdCxkcHQKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiByb3VuZGluZ19lcnJvciwgZGRpZmYKKyAgICAgICAgSU5URUdFUiBkb3VibGVfRElHSVRTCisgICAgICAgIExPR0lDQUwgbG9naWNfYW5kLCBsb2dpY19vciwgbG9naWNfZXF2LGxvZ2ljX25lcXYKKyAgICAgICAgSU5URUdFUiBiaXRfYW5kLCBiaXRfb3IKKyAgICAgICAgSU5URUdFUiBleGNsdXNpdl9iaXRfb3IKKyAgICAgICAgSU5URUdFUiBtaW5fdmFsdWUsIG1heF92YWx1ZQorICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIGRtaW4sIGRtYXgKKyAgICAgICAgSU5URUdFUiByZXN1bHQKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAgICAgICBMT0dJQ0FMIGxvZ2ljcyhMT09QQ09VTlQpCisgICAgICAgIElOVEVHRVIgaW50X2FycmF5KExPT1BDT1VOVCkKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBkX2FycmF5KExPT1BDT1VOVCkKKyAgICAgICAgUEFSQU1FVEVSIChpbnRfY29uc3Q9MTAsa25vd25fcHJvZHVjdD0zNjI4ODAwKQorICAgICAgICBQQVJBTUVURVIgKGRvdWJsZV9ESUdJVFM9MjAsTUFYX0ZBQ1RPUj0xMCkKKyAgICAgICAgUEFSQU1FVEVSIChyb3VuZGluZ19lcnJvcj0xLkUtNikKKworICAgICAgICBkdCA9IDEuLzMuCisgICAgICAgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMgorICAgICAgICBwcm9kdWN0ID0gMQorICAgICAgICBzdW0yID0gMAorICAgICAgICBzdW0gPSAwCisgICAgICAgIGRzdW0gPSAwLgorICAgICAgICByZXN1bHQgPTAgCisgICAgICAgIGxvZ2ljX2FuZCA9IC50cnVlLgorICAgICAgICBsb2dpY19vciA9IC5mYWxzZS4KKyAgICAgICAgYml0X2FuZCA9IDEKKyAgICAgICAgYml0X29yID0gMAorICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSAwCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLCAxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCs6c3VtKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGkgPTEsIExPT1BDT1VOVAorICAgICAgICAgIHN1bSA9IHN1bSArIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgZG8KKworICAgICAgICBJRiAoa25vd25fc3VtIC5ORS4gc3VtKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIHN1bSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICIsCisgICAgICYgICAgICAgc3VtLCJpbnN0ZWFkIG9mICIsIGtub3duX3N1bQorICAgICAgICBFTkQgSUYKKworICAgICAgICBkaWZmID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyCisKKworCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLCAxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uICgtOiBkaWZmKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGkgPTEsIExPT1BDT1VOVAorICAgICAgICAgIGRpZmYgPSBkaWZmIC0gaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworICAKKyAgICAgICAgSUYgKCBkaWZmIC5ORS4gMCApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gZGlmZmVyZW5jZSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICIsCisgICAgICYgICAgICAgc3VtLCJpbnN0ZWFkIG9mIDAuIgorICAgICAgICBFTkQgSUYKKworIS4uLiBUZXN0IGZvciBkb3VibGVzCisgICAgICAgIGRzdW0gPTAuCisgICAgICAgIGRwdCA9IDEKKworICAgICAgICBETyBpPTEsIERPVUJMRV9ESUdJVFMKKyAgICAgICAgICBkcHQ9IGRwdCAqIGR0CisgICAgICAgIEVORCBETworICAgICAgICBka25vd25fc3VtID0gKDEtZHB0KS8oMS1kdCkKKyEkb21wIHBhcmFsbGVsIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigrOmRzdW0pPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaT0wLERPVUJMRV9ESUdJVFMtMQorICAgICAgICAgICAgICBkc3VtID0gZHN1bSArIGR0KippCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisKKyAKKyAgICAgICAgSUYoZHN1bSAuTkUuIGRrbm93bl9zdW0gLkFORC4gCisgICAgICYgICAgYWJzKGRzdW0gLSBka25vd25fc3VtKSAuR1QuIHJvdW5kaW5nX2Vycm9yICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICB3cml0ZSgxLCopICJFcnJvciBpbiBzdW0gd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICIsCisgICAgICYgICAgICBkc3VtLCJpbnN0ZWFkIG9mICIsZGtub3duX3N1bSwiKERpZmZlcmVuY2U6ICIsCisgICAgICYgICAgICBkc3VtIC0gZGtub3duX3N1bSwiKSIKKyAgICAgICAgRU5EIElGCisgICAgICAgIGRwdCA9IDEKKworICAgICAgICBETyBpPTEsIERPVUJMRV9ESUdJVFMKKyAgICAgICAgICBkcHQgPSBkcHQqZHQKKyAgICAgICAgRU5EIERPCisgICAgICAgIGRkaWZmID0gKCAxLWRwdCkvKDEtZHQpCisKKyEkb21wIHBhcmFsbGVsIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigtOmRkaWZmKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MCwgRE9VQkxFX0RJR0lUUy0xCisgICAgICAgICAgZGRpZmYgPSBkZGlmZiAtIGR0KippCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisKKyAgICAgICAgSUYgKCBBQlMoZGRpZmYpIC5HVC4gcm91bmRpbmdfZXJyb3IgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIERpZmZlcmVuY2Ugd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICIsCisgICAgICYgICAgICAgZGRpZmYsImluc3RlYWQgb2YgMC4wIgorICAgICAgICBFTkQgSUYKKworISRvbXAgcGFyYWxsZWwgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCo6cHJvZHVjdCk8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpPTEsTUFYX0ZBQ1RPUgorICAgICAgICAgICBwcm9kdWN0ID0gcHJvZHVjdCAqIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgZG8KKworICAgICAgICBJRiAoa25vd25fcHJvZHVjdCAuTkUuIHByb2R1Y3QpIFRIRU4KKyAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBQcm9kdWN0IHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgIiwKKyAgICAgJiAgICAgICBwcm9kdWN0LCIgaW5zdGVhZCBvZiIsa25vd25fcHJvZHVjdCAKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgIGxvZ2ljcyhpKSA9IC5UUlVFLgorICAgICAgICBFTkQgRE8KKworISRvbXAgcGFyYWxsZWwgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5BTkQuOmxvZ2ljX2FuZCk8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgbG9naWNfYW5kID0gbG9naWNfYW5kIC5BTkQuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworCisgICAgICAgIElGICguTk9ULiBsb2dpY19hbmQpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgQU5EIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKworICAgICAgICBsb2dpY19hbmQgPSAuVFJVRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5GQUxTRS4KKworISRvbXAgcGFyYWxsZWwgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5BTkQuOmxvZ2ljX2FuZCk8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgbG9naWNfYW5kID0gbG9naWNfYW5kIC5BTkQuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworCisgICAgICAgIElGIChsb2dpY19hbmQpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgQU5EIHBhc3MgMiIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgIGxvZ2ljcyhpKSA9IC5GQUxTRS4KKyAgICAgICAgRU5EIERPCisKKyEkb21wIHBhcmFsbGVsIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiguT1IuOmxvZ2ljX29yKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKyAgICAgICAgICAgbG9naWNfb3IgPSBsb2dpY19vciAub3IuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworCisgICAgICAgIElGIChsb2dpY19vcikgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGxvZ2ljX29yID0gLkZBTFNFLgorICAgICAgICBsb2dpY3MoTE9PUENPVU5ULzIpID0gLlRSVUUuCisKKyEkb21wIHBhcmFsbGVsIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiguT1IuOmxvZ2ljX29yKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICBsb2dpY19vciA9IGxvZ2ljX29yIC5PUi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisKKyAgICAgICAgSUYgKCAuTk9ULiBsb2dpY19vciApIFRIRW4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworIS4uLiBUZXN0IGxvZ2ljIEVRViwgdW5pcXVlIGluIEZvcnRyYW4KKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgIGxvZ2ljcyhpKSA9IC5UUlVFLgorICAgICAgICBFTkQgRE8KKworICAgICAgICBsb2dpY19lcXYgPSAuVFJVRS4KKworISRvbXAgcGFyYWxsZWwgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5FUVYuOmxvZ2ljX2Vxdik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgIGxvZ2ljX2VxdiA9IGxvZ2ljX2VxdiAuRVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgZG8KKworICAgICAgICBJRiAoLk5PVC4gbG9naWNfZXF2KSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIEVRViBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGxvZ2ljX2VxdiA9IC5UUlVFLgorICAgICAgICBsb2dpY3MoTE9PUENPVU5ULzIpID0gLkZBTFNFLgorCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLkVRVi46bG9naWNfZXF2KTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICAgbG9naWNfZXF2ID0gbG9naWNfZXF2IC5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworCisgICAgICAgIElGICggbG9naWNfZXF2ICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBFUVYgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworIS4uLiBUZXN0IGxvZ2ljIE5FUVYsIHdoaWNoIGlzIHVuaXF1ZSBpbiBGb3J0cmFuCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICBsb2dpY3MoaSkgPSAuRkFMU0UuCisgICAgICAgIEVORCBETworCisgICAgICAgIGxvZ2ljX25lcXYgPSAuRkFMU0UuCisKKyEkb21wIHBhcmFsbGVsIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiguTkVRVi46bG9naWNfbmVxdik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgIGxvZ2ljX25lcXYgPSBsb2dpY19uZXF2IC5ORVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgZG8KKworICAgICAgICBJRiAobG9naWNfbmVxdikgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBORVFWIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgbG9naWNfbmVxdiA9IC5GQUxTRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5UUlVFLgorCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLk5FUVYuOmxvZ2ljX25lcXYpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgICBsb2dpY19uZXF2ID0gbG9naWNfbmVxdiAubmVxdi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisKKyAgICAgICAgSUYgKCAuTk9ULiBsb2dpY19uZXF2ICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBORVFWIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICAgaW50X2FycmF5KGkpID0gMQorICAgICAgICBFTkQgRE8KKyEkb21wIHBhcmFsbGVsIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihJQU5EOmJpdF9hbmQpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyEuLi4gaWFuZChJLEopOiBSZXR1cm5zIHZhbHVlIHJlc3VsdGluZyBmcm9tIGJvb2xlYW4gQU5EIG9mIAorIS4uLiBwYWlyIG9mIGJpdHMgaW4gZWFjaCBvZiBJIGFuZCBKLiAKKyAgICAgICAgICBiaXRfYW5kID0gSUFORChiaXRfYW5kLGludF9hcnJheShpKSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgZG8KKworICAgICAgICBJRiAoIGJpdF9hbmQgLkxULiAxICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJQU5EIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgYml0X2FuZCA9IDEKKyAgICAgICAgaW50X2FycmF5KExPT1BDT1VOVC8yKSA9IDAKKworISRvbXAgcGFyYWxsZWwgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKElBTkQ6Yml0X2FuZCk8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgIGJpdF9hbmQgPSBJQU5EICggYml0X2FuZCwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgZG8KKworICAgICAgICBJRiggYml0X2FuZCAuR0UuIDEpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSUFORCBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgaW50X2FycmF5KGkpID0gMAorICAgICAgICBFTkQgRE8KKworCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIHJlZHVjdGlvbihJT1I6Yml0X29yKQorICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorIS4uLiBJb3IoSSxKKTogUmV0dXJucyB2YWx1ZSByZXN1bHRpbmcgZnJvbSBib29sZWFuIE9SIG9mIAorIS4uLiBwYWlyIG9mIGJpdHMgaW4gZWFjaCBvZiBJIGFuZCBKLiAKKyAgICAgICAgICBiaXRfb3IgPSBJT1IoYml0X29yLCBpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworCisgICAgICAgIElGICggYml0X29yIC5HRS4gMSkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJb3IgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworCisgICAgICAgIGJpdF9vciA9IDAKKyAgICAgICAgaW50X2FycmF5KExPT1BDT1VOVC8yKSA9IDEKKyEkb21wIHBhcmFsbGVsIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihJT1I6Yml0X29yKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgYml0X29yID0gSU9SKGJpdF9vciwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgZG8KKworICAgICAgICBJRiAoIGJpdF9vciAuTEUuIDApIHRoZW4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSW9yIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBpbnRfYXJyYXkoaSkgPSAwCisgICAgICAgIEVORCBETworCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oSUVPUjpleGNsdXNpdl9iaXRfb3IpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorICAgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IGllb3IoZXhjbHVzaXZfYml0X29yLCBpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisKKyAgICAgICAgSUYgKCBleGNsdXNpdl9iaXRfb3IgLkdFLiAxKSBUSEVOCisgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSWVvciBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IDAKKyAgICAgICAgaW50X2FycmF5KExPT1BDT1VOVC8yKSA9IDEKKworISRvbXAgcGFyYWxsZWwgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKElFT1I6ZXhjbHVzaXZfYml0X29yKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKyAgICAgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IElFT1IoZXhjbHVzaXZfYml0X29yLCBpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisKKyAgICAgICAgSUYgKCBleGNsdXNpdl9iaXRfb3IgLmxlLiAwKSB0aGVuCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIEllb3IgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgIGludF9hcnJheShpKSA9IDEwIC0gaQorICAgICAgICBFTkQgRE8KKworICAgICAgICBtaW5fdmFsdWUgPSA2NTUzNQorCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oTUlOOm1pbl92YWx1ZSk8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgICBtaW5fdmFsdWUgPSBNSU4obWluX3ZhbHVlLGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisKKyAgICAgICAgSUYgKCBtaW5fdmFsdWUgLkdULiAoMTAtTE9PUENPVU5UKSApVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBpbnRlZ2VyIE1JTiIKKyAgICAgICAgRU5EIElGCisKKworICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgIGludF9hcnJheShpKSA9IGkKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgbWF4X3ZhbHVlID0gLTMyNzY4CisKKyEkb21wIHBhcmFsbGVsIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihNQVg6bWF4X3ZhbHVlKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKyAgICAgICAgICAgIG1heF92YWx1ZSA9IE1BWChtYXhfdmFsdWUsaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgZG8KKworICAgICAgICBJRiAoIG1heF92YWx1ZSAuTFQuIExPT1BDT1VOVCApVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBpbnRlZ2VyIE1BWCIKKyAgICAgICAgRU5EIElGCisKKyEuLi4gdGVzdCBkb3VibGUgbWluLCBtYXgKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgIGRfYXJyYXkoaSkgPSAxMCAtIGkqZHQKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgZG1pbiA9IDIqKjEwCisgICAgICAgIGR0ID0gMC41CisKKyEkb21wIHBhcmFsbGVsIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihNSU46ZG1pbik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgZG1pbj0gTUlOKGRtaW4sZF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisKKyAgICAgICAgSUYgKCBkbWluIC5HVC4gKDEwLWR0KSApVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBkb3VibGUgTUlOIgorICAgICAgICBFTkQgSUYKKworCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICAgZF9hcnJheShpKSA9IGkgKiBkdAorICAgICAgICBFTkQgRE8KKworICAgICAgICBkbWF4PSAtICgyKioxMCkKKworISRvbXAgcGFyYWxsZWwgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKG1heDpkbWF4KTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKyAgICAgICAgICBkbWF4PSBtYXgoZG1heCxkX2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgZG8KKworICAgICAgICBJRiAoIGRtYXggLkxULiBMT09QQ09VTlQqZHQgKVRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gZG91YmxlIE1BWCIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgSUYgKCByZXN1bHQgLkVRLiAwICkgVEhFTgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAgMQorICAgICAgICBFTFNFCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9ICAwCisgICAgICAgIEVORCBJRgorCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfc2VjdGlvbl9maXJzdHByaXZhdGUuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9zZWN0aW9uX2ZpcnN0cHJpdmF0ZS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMmI4NWMKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfc2VjdGlvbl9maXJzdHByaXZhdGUuZgpAQCAtMCwwICsxLDM0IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBmaXJzdHByaXZhdGUgY2xhdXNlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgc2VjdGlvbnMgZmlyc3Rwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5wYXJfc2VjdGlvbl9maXJzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgc3VtLCBzdW0wLCBrbm93bl9zdW0KKyAgICAgICAgc3VtID0gNworICAgICAgICBzdW0wID0gMTEKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5maXJzdHByaXZhdGUoc3VtMCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPnByaXZhdGUoc3VtMCk8L29tcHRzOmNyb3NzY2hlY2s+ICAKKyEkb21wIHNlY3Rpb24KKyEkb21wIGNyaXRpY2FsIAorICAgICAgICBzdW0gPSBzdW0gKyBzdW0wCishJG9tcCBlbmQgY3JpdGljYWwKKzxvbXB0czpjcm9zc2NoZWNrPiEkb21wIHNlY3Rpb248L29tcHRzOmNyb3NzY2hlY2s+CishJG9tcCBjcml0aWNhbAorICAgICAgICBzdW0gPSBzdW0gKyBzdW0wCishJG9tcCBlbmQgY3JpdGljYWwKKzxvbXB0czpjcm9zc2NoZWNrPiEkb21wIHNlY3Rpb248L29tcHRzOmNyb3NzY2hlY2s+CishJG9tcCBjcml0aWNhbAorICAgICAgICBzdW0gPSBzdW0gKyBzdW0wCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworICAgICAgICBrbm93bl9zdW0gPSAxMSozICsgNworICAgICAgICBJRiAoIGtub3duX3N1bSAuRVEuIHN1bSApIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQgCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vcGFyX3NlY3Rpb25fbGFzdHByaXZhdGUuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9zZWN0aW9uX2xhc3Rwcml2YXRlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDljNzIxZAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9zZWN0aW9uX2xhc3Rwcml2YXRlLmYKQEAgLTAsMCArMSw1MSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgbGFzdHByaXZhdGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgc2VjdGlvbnMgbGFzdHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWwsb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPnBhcl9zZWN0aW9uX2xhc3Rwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHN1bSwgc3VtMCwga25vd25fc3VtLCBpICxpMAorICAgICAgICBzdW0gPSAwCisgICAgICAgIHN1bTAgPSAwCisgICAgICAgIGkwID0gLTEKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5sYXN0cHJpdmF0ZShpMCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPnByaXZhdGUoaTApPC9vbXB0czpjcm9zc2NoZWNrPiBwcml2YXRlKGksc3VtMCkKKyEkb21wIHNlY3Rpb24KKyAgICAgICAgc3VtMCA9IDAKKyAgICAgICAgRE8gaT0xLCAzOTkKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGkKKyAgICAgICAgICBpMD1pCisgICAgICAgIEVORCBETworISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBzZWN0aW9uCisgICAgICAgIHN1bTAgPSAwCisgICAgICAgIERPIGk9NDAwLCA2OTkKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGkKKyAgICAgICAgICBpMCA9IGkKKyAgICAgICAgRU5EIERPCishJG9tcCBjcml0aWNhbAorICAgICAgICBzdW0gPSBzdW0gKyBzdW0wCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIHNlY3Rpb24KKyAgICAgICAgc3VtMCA9IDAKKyAgICAgICAgRE8gaT03MDAsIDk5OQorICAgICAgICAgIHN1bTAgPSBzdW0wICsgaQorICAgICAgICAgIGkwID0gaQorICAgICAgICBFTkQgRE8KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHN1bSA9IHN1bSArIHN1bTAKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgZW5kIHBhcmFsbGVsIHNlY3Rpb25zCisgICAgICAgIGtub3duX3N1bSA9ICg5OTkqMTAwMCkvMgorISAgICAgICAgcHJpbnQgKiwgInN1bSIsIHN1bSwgImtzIiwga25vd25fc3VtLCBpMAorICAgICAgICBJRiAoIGtub3duX3N1bSAuRVEuIHN1bSAuQU5ELiBpMCAuRVEuIDk5OSApIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfc2VjdGlvbl9wcml2YXRlLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfc2VjdGlvbl9wcml2YXRlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQwYWMwZQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9zZWN0aW9uX3ByaXZhdGUuZgpAQCAtMCwwICsxLDg2IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIHBhcmFsbGVsIHNlY3Rpb24gcHJpdmF0ZSBjbGF1c2UuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBzZWN0aW9uIHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPnBhcl9zZWN0aW9uX3ByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgc3VtLCBzdW0wLCBrbm93bl9zdW0sIGkKKyAgICAgICAgc3VtID0gNworICAgICAgICBzdW0wID0gMAorISRvbXAgcGFyYWxsZWwgc2VjdGlvbnM8b21wdHM6Y2hlY2s+cHJpdmF0ZShzdW0wLGkpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz5wcml2YXRlKGkpPC9vbXB0czpjcm9zc2NoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBzdW0wID0gMAorICAgICAgICBETyBpPTEsIDM5OQorICAgICAgICAgIHN1bTAgPSBzdW0wICsgaQorICAgICAgICBFTkQgRE8KKyEkb21wIGNyaXRpY2FsCisgICAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBzZWN0aW9uCisgICAgICAgIHN1bTAgPSAwCisgICAgICAgIERPIGk9NDAwLCA2OTkKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBjcml0aWNhbAorICAgICAgICBzdW0gPSBzdW0gKyBzdW0wCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIHNlY3Rpb24KKyAgICAgICAgc3VtMCA9IDAKKyAgICAgICAgRE8gaT03MDAsIDk5OQorICAgICAgICAgIHN1bTAgPSBzdW0wICsgaQorICAgICAgICBFTkQgRE8KKyEkb21wIGNyaXRpY2FsCisgICAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKyAgICAgICAga25vd25fc3VtID0gKDk5OSoxMDAwKS8yKzcKKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLmVxLiBzdW0gKSB0aGVuCisgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQgCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgorCisgICAgICAgIGludGVnZXIgZnVuY3Rpb24gY3JzY2hrX3Bhcl9zZWN0aW9uX3ByaXZhdGUoKQorICAgICAgICBpbXBsaWNpdCBub25lCisgICAgICAgIGludGVnZXIgc3VtLCBzdW0wLCBrbm93bl9zdW0sIGkKKyAgICAgICAgc3VtID0gNworICAgICAgICBzdW0wID0gMAorISRvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKQorISRvbXAgc2VjdGlvbgorICAgICAgICBzdW0wID0gMAorICAgICAgICBkbyBpPTEsIDM5OQorICAgICAgICAgIHN1bTAgPSBzdW0wICsgaQorICAgICAgICBlbmQgZG8KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHN1bSA9IHN1bSArIHN1bTAKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgc2VjdGlvbgorICAgICAgICBzdW0wID0gMAorICAgICAgICBkbyBpPTQwMCwgNjk5CisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpCisgICAgICAgIGVuZCBkbworISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBzZWN0aW9uCisgICAgICAgIHN1bTAgPSAwCisgICAgICAgIGRvIGk9NzAwLCA5OTkKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGkKKyAgICAgICAgZW5kIGRvCishJG9tcCBjcml0aWNhbAorICAgICAgICBzdW0gPSBzdW0gKyBzdW0wCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworICAgICAgICBrbm93bl9zdW0gPSAoOTk5KjEwMDApLzIrNworICAgICAgICBpZiAoIGtub3duX3N1bSAuZXEuIHN1bSApIHRoZW4KKyAgICAgICAgICBjcnNjaGtfcGFyX3NlY3Rpb25fcHJpdmF0ZSA9IDEKKyAgICAgICAgZWxzZQorICAgICAgICAgIGNyc2Noa19wYXJfc2VjdGlvbl9wcml2YXRlID0gMAorICAgICAgICBlbmQgaWYKKyAgICAgICAgZW5kCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9zZWN0aW9uX3JlZHVjdC5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vcGFyX3NlY3Rpb25fcmVkdWN0LmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRkZTMwNAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9zZWN0aW9uX3JlZHVjdC5mCkBAIC0wLDAgKzEsNjMxIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyByZWR1Y3Rpb24gZGlyZWN0aXZlIHdpdGggYWxsIGl0cyBvcHRpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBzZWN0aW9ucyByZWR1Y3Rpb248L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5wYXJfc2VjdGlvbl9yZWR1Y3Q8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgc3VtLCBzdW0yLCBrbm93bl9zdW0sIGksIGkyLGRpZmYKKyAgICAgICAgSU5URUdFUiBwcm9kdWN0LGtub3duX3Byb2R1Y3QsaW50X2NvbnN0CisgICAgICAgIElOVEVHRVIgTUFYX0ZBQ1RPUgorICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIGRzdW0sZGtub3duX3N1bSxkdCxkcHQKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiByb3VuZGluZ19lcnJvciwgZGRpZmYKKyAgICAgICAgSU5URUdFUiBET1VCTEVfRElHSVRTCisgICAgICAgIExPR0lDQUwgbG9naWNfYW5kLCBsb2dpY19vciwgbG9naWNfZXF2LGxvZ2ljX25lcXYKKyAgICAgICAgSU5URUdFUiBiaXRfYW5kLCBiaXRfb3IKKyAgICAgICAgSU5URUdFUiBleGNsdXNpdl9iaXRfb3IKKyAgICAgICAgSU5URUdFUiBtaW5fdmFsdWUsIG1heF92YWx1ZQorICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIGRtaW4sIGRtYXgKKyAgICAgICAgSU5URUdFUiByZXN1bHQKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAgICAgICBMT0dJQ0FMIGxvZ2ljcyhMT09QQ09VTlQpCisgICAgICAgIElOVEVHRVIgaW50X2FycmF5KExPT1BDT1VOVCkKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBkX2FycmF5KExPT1BDT1VOVCkKKyAgICAgICAgUEFSQU1FVEVSIChpbnRfY29uc3Q9MTAsa25vd25fcHJvZHVjdD0zNjI4ODAwKQorICAgICAgICBQQVJBTUVURVIgKERPVUJMRV9ESUdJVFM9MjAsTUFYX0ZBQ1RPUj0xMCkKKyAgICAgICAgUEFSQU1FVEVSIChyb3VuZGluZ19lcnJvcj0xLkUtNikKKworICAgICAgICBJTlRFR0VSIGN1dDEsIGN1dDIsIGN1dDMsIGN1dDQKKworICAgICAgICBkdCA9IDEuLzMuCisgICAgICAgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMgorICAgICAgICBwcm9kdWN0ID0gMQorICAgICAgICBzdW0yID0gMAorICAgICAgICBzdW0gPSAwCisgICAgICAgIGRzdW0gPSAwLgorICAgICAgICByZXN1bHQgPTAgCisgICAgICAgIGxvZ2ljX2FuZCA9IC5UUlVFLgorICAgICAgICBsb2dpY19vciA9IC5GQUxTRS4KKyAgICAgICAgYml0X2FuZCA9IDEKKyAgICAgICAgYml0X29yID0gMAorICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSAwCisgICAgICAgIGN1dDEgPSBOSU5UKExPT1BDT1VOVCAvIDMuKQorICAgICAgICBjdXQyID0gY3V0MSArIDEKKyAgICAgICAgY3V0MyA9IDIgKiBjdXQxCisgICAgICAgIGN1dDQgPSBjdXQzICsgMQorCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKzpzdW0pPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9MSwgY3V0MQorICAgICAgICAgIHN1bSA9IHN1bSArIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPWN1dDIsIGN1dDMKKyAgICAgICAgICBzdW0gPSBzdW0gKyBpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID1jdXQ0LCBMT09QQ09VTlQKKyAgICAgICAgICBzdW0gPSBzdW0gKyBpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIHNlY3Rpb25zCisKKyAgICAgICAgSUYgKGtub3duX3N1bSAuTkUuIHN1bSkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBzdW0gd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgICAgIHN1bSwiaW5zdGVhZCBvZiAiLCBrbm93bl9zdW0KKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgZGlmZiA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMgorCisKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24gKC06IGRpZmYpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9MSwgY3V0MQorICAgICAgICAgIGRpZmYgPSBkaWZmIC0gaQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9Y3V0MiwgY3V0MworICAgICAgICAgIGRpZmYgPSBkaWZmIC0gaQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9Y3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgZGlmZiA9IGRpZmYgLSBpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIHNlY3Rpb25zCisgIAorICAgICAgICBJRiAoIGRpZmYgLk5FLiAwICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBkaWZmZXJlbmNlIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgIiwKKyAgICAgJiAgICAgICBzdW0sImluc3RlYWQgb2YgMC4iCisgICAgICAgIEVORCBJRgorCishLi4uIFRlc3QgZm9yIGRvdWJsZXMKKyAgICAgICAgZHN1bSA9MC4KKyAgICAgICAgZHB0ID0gMQorCisgICAgICAgIERPIGk9MSwgRE9VQkxFX0RJR0lUUworICAgICAgICAgIGRwdD0gZHB0ICogZHQKKyAgICAgICAgRU5EIERPCisgICAgICAgIGRrbm93bl9zdW0gPSAoMS1kcHQpLygxLWR0KQorISRvbXAgcGFyYWxsZWwgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigrOmRzdW0pPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0wLDYKKyAgICAgICAgICAgZHN1bSA9IGRzdW0gKyBkdCoqaQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT03LDEyCisgICAgICAgICAgIGRzdW0gPSBkc3VtICsgZHQqKmkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9MTMsRE9VQkxFX0RJR0lUUy0xCisgICAgICAgICAgIGRzdW0gPSBkc3VtICsgZHQqKmkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKworIAorICAgICAgICBJRihkc3VtIC5ORS4gZGtub3duX3N1bSAuQU5ELiAKKyAgICAgJiAgICAgQUJTKGRzdW0gLSBka25vd25fc3VtKSAuR1QuIHJvdW5kaW5nX2Vycm9yICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBzdW0gd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICIsCisgICAgICYgICAgICAgZHN1bSwiaW5zdGVhZCBvZiAiLGRrbm93bl9zdW0sIihEaWZmZXJlbmNlOiAiLAorICAgICAmICAgICAgIGRzdW0gLSBka25vd25fc3VtLCIpIgorICAgICAgICBFTkQgSUYKKyAgICAgICAgZHB0ID0gMQorCisKKyAgICAgIAorICAgICAgICBETyBpPTEsIERPVUJMRV9ESUdJVFMKKyAgICAgICAgICAgZHB0ID0gZHB0KmR0CisgICAgICAgIEVORCBETworICAgICAgICBkZGlmZiA9ICggMS1kcHQpLygxLWR0KQorISRvbXAgcGFyYWxsZWwgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigtOmRkaWZmKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9MCwgNgorICAgICAgICAgIGRkaWZmID0gZGRpZmYgLSBkdCoqaQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT03LCAxMgorICAgICAgICAgIGRkaWZmID0gZGRpZmYgLSBkdCoqaQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0xMywgRE9VQkxFX0RJR0lUUy0xCisgICAgICAgICAgZGRpZmYgPSBkZGlmZiAtIGR0KippCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIHNlY3Rpb25zCisKKyAgICAgICAgSUYgKCBBQlMoZGRpZmYpIC5HVC4gcm91bmRpbmdfZXJyb3IgKSBUSEVOCisgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gRGlmZmVyZW5jZSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgIiwKKyAgICAgJiAgICAgICBkZGlmZiwiaW5zdGVhZCBvZiAwLjAiCisgICAgICAgIEVORCBJRgorCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCo6cHJvZHVjdCk8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEsMworICAgICAgICAgICBwcm9kdWN0ID0gcHJvZHVjdCAqIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9NCw2CisgICAgICAgICAgIHByb2R1Y3QgPSBwcm9kdWN0ICogaQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT03LDEwCisgICAgICAgICAgIHByb2R1Y3QgPSBwcm9kdWN0ICogaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworCisgICAgICAgIElGIChrbm93bl9wcm9kdWN0IC5ORS4gcHJvZHVjdCkgVEhFTgorICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIFByb2R1Y3Qgd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgICAgIHByb2R1Y3QsIiBpbnN0ZWFkIG9mIixrbm93bl9wcm9kdWN0IAorICAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgIGxvZ2ljcyhpKSA9IC5UUlVFLgorICAgICAgICBFTkQgRE8KKworISRvbXAgcGFyYWxsZWwgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiguQU5ELjpsb2dpY19hbmQpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0xLGN1dDEKKyAgICAgICAgICBsb2dpY19hbmQgPSBsb2dpY19hbmQgLkFORC4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDIsY3V0MworICAgICAgICAgIGxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAuQU5ELiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0NCxMT09QQ09VTlQKKyAgICAgICAgICBsb2dpY19hbmQgPSBsb2dpY19hbmQgLkFORC4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIHNlY3Rpb25zCisKKyAgICAgICAgaWYgKC5ub3QuIGxvZ2ljX2FuZCkgdGhlbgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICB3cml0ZSgxLCopICJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAxIgorICAgICAgICBlbmQgaWYKKworCisgICAgICAgIGxvZ2ljX2FuZCA9IC5UUlVFLgorICAgICAgICBsb2dpY3MoTE9PUENPVU5ULzIpID0gLkZBTFNFLgorCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5BTkQuOmxvZ2ljX2FuZCk8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEsY3V0MQorICAgICAgICAgIGxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAuQU5ELiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0MixjdXQzCisgICAgICAgICAgbG9naWNfYW5kID0gbG9naWNfYW5kIC5BTkQuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQ0LExPT1BDT1VOVAorICAgICAgICAgIGxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAuQU5ELiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKworICAgICAgICBJRiAobG9naWNfYW5kKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIEFORCBwYXNzIDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgbG9naWNzKGkpID0gLkZBTFNFLgorICAgICAgICBFTkQgRE8KKworISRvbXAgcGFyYWxsZWwgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiguT1IuOmxvZ2ljX29yKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgbG9naWNfb3IgPSBsb2dpY19vciAuT1IuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDIsIGN1dDMKKyAgICAgICAgICBsb2dpY19vciA9IGxvZ2ljX29yIC5PUi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgbG9naWNfb3IgPSBsb2dpY19vciAuT1IuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworCisgICAgICAgIElGIChsb2dpY19vcikgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGxvZ2ljX29yID0gLkZBTFNFLgorICAgICAgICBsb2dpY3MoTE9PUENPVU5ULzIpID0gLlRSVUUuCisKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLk9SLjpsb2dpY19vcik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEsY3V0MQorICAgICAgICAgIGxvZ2ljX29yID0gbG9naWNfb3IgLk9SLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0MixjdXQzCisgICAgICAgICAgbG9naWNfb3IgPSBsb2dpY19vciAuT1IuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQ0LExPT1BDT1VOVAorICAgICAgICAgIGxvZ2ljX29yID0gbG9naWNfb3IgLk9SLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKworICAgICAgICBJRiAoIC5OT1QuIGxvZ2ljX29yICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCishLi4uIFRlc3QgbG9naWMgRVFWLCB1bmlxdWUgaW4gRm9ydHJhbgorICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgIGxvZ2ljcyhpKSA9IC5UUlVFLgorICAgICAgICBFTkQgRE8KKworICAgICAgICBsb2dpY19lcXYgPSAuVFJVRS4KKworISRvbXAgcGFyYWxsZWwgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiguRVFWLjpsb2dpY19lcXYpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IDEsIGN1dDEKKyAgICAgICAgICAgbG9naWNfZXF2ID0gbG9naWNfZXF2IC5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDIsIGN1dDMKKyAgICAgICAgICAgbG9naWNfZXF2ID0gbG9naWNfZXF2IC5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDQsIExPT1BDT1VOVAorICAgICAgICAgICBsb2dpY19lcXYgPSBsb2dpY19lcXYgLkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIHNlY3Rpb25zCisKKyAgICAgICAgSUYgKC5OT1QuIGxvZ2ljX2VxdikgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBFUVYgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBsb2dpY19lcXYgPSAuVFJVRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5GQUxTRS4KKworISRvbXAgcGFyYWxsZWwgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiguRVFWLjpsb2dpY19lcXYpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0xLGN1dDEKKyAgICAgICAgICAgbG9naWNfZXF2ID0gbG9naWNfZXF2IC5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQyLGN1dDMKKyAgICAgICAgICAgbG9naWNfZXF2ID0gbG9naWNfZXF2IC5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQ0LExPT1BDT1VOVAorICAgICAgICAgICBsb2dpY19lcXYgPSBsb2dpY19lcXYgLkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIHNlY3Rpb25zCisKKyAgICAgICAgSUYgKCBsb2dpY19lcXYgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIEVRViBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCishLi4uIFRlc3QgbG9naWMgTkVRViwgd2hpY2ggaXMgdW5pcXVlIGluIEZvcnRyYW4KKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBsb2dpY3MoaSkgPSAuRkFMU0UuCisgICAgICAgIEVORCBETworCisgICAgICAgIGxvZ2ljX25lcXYgPSAuRkFMU0UuCisKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLk5FUVYuOmxvZ2ljX25lcXYpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IDEsIGN1dDEKKyAgICAgICAgICBsb2dpY19uZXF2ID0gbG9naWNfbmVxdiAuTkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0MiwgY3V0MworICAgICAgICAgIGxvZ2ljX25lcXYgPSBsb2dpY19uZXF2IC5ORVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQ0LCBMT09QQ09VTlQKKyAgICAgICAgICBsb2dpY19uZXF2ID0gbG9naWNfbmVxdiAuTkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIHNlY3Rpb25zCisKKyAgICAgICAgSUYgKGxvZ2ljX25lcXYpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgTkVRViBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGxvZ2ljX25lcXYgPSAuRkFMU0UuCisgICAgICAgIGxvZ2ljcyhMT09QQ09VTlQvMikgPSAuVFJVRS4KKworISRvbXAgcGFyYWxsZWwgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiguTkVRVi46bG9naWNfbmVxdik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEsY3V0MQorICAgICAgICAgICBsb2dpY19uZXF2ID0gbG9naWNfbmVxdiAuTkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDIsY3V0MworICAgICAgICAgICBsb2dpY19uZXF2ID0gbG9naWNfbmVxdiAuTkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDQsTE9PUENPVU5UCisgICAgICAgICAgIGxvZ2ljX25lcXYgPSBsb2dpY19uZXF2IC5ORVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKworICAgICAgICBJRiAoIC5OT1QuIGxvZ2ljX25lcXYgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIE5FUVYgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgIGludF9hcnJheShpKSA9IDEKKyAgICAgICAgRU5EIERPCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKElBTkQ6Yml0X2FuZCk8L29tcHRzOmNoZWNrPgorIS4uLiBpYW5kKEksSik6IFJldHVybnMgdmFsdWUgcmVzdWx0aW5nIGZyb20gYm9vbGVhbiBBTkQgb2YKKyEuLi4gcGFpciBvZiBiaXRzIGluIGVhY2ggb2YgSSBhbmQgSi4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0xLCBjdXQxCisgICAgICAgICAgYml0X2FuZCA9IElBTkQoYml0X2FuZCxpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDIsIGN1dDMKKyAgICAgICAgICBiaXRfYW5kID0gSUFORChiaXRfYW5kLGludF9hcnJheShpKSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgYml0X2FuZCA9IElBTkQoYml0X2FuZCxpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIHNlY3Rpb25zCisKKyAgICAgICAgSUYgKCBiaXRfYW5kIC5MVC4gMSApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSUFORCBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGJpdF9hbmQgPSAxCisgICAgICAgIGludF9hcnJheShMT09QQ09VTlQvMikgPSAwCisKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oSUFORDpiaXRfYW5kKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9MSwgY3V0MQorICAgICAgICAgIGJpdF9hbmQgPSBJQU5EICggYml0X2FuZCwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0MiwgY3V0MworICAgICAgICAgIGJpdF9hbmQgPSBJQU5EICggYml0X2FuZCwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgYml0X2FuZCA9IElBTkQgKCBiaXRfYW5kLCBpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworCisgICAgICAgIElGKCBiaXRfYW5kIC5HRS4gMSkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJQU5EIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBpbnRfYXJyYXkoaSkgPSAwCisgICAgICAgIEVORCBETworCisKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oSU9SOmJpdF9vcik8L29tcHRzOmNoZWNrPgorIS4uLiBJb3IoSSxKKTogUmV0dXJucyB2YWx1ZSByZXN1bHRpbmcgZnJvbSBib29sZWFuIE9SIG9mCishLi4uIHBhaXIgb2YgYml0cyBpbiBlYWNoIG9mIEkgYW5kIEouCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9MSwgY3V0MQorICAgICAgICAgIGJpdF9vciA9IElPUihiaXRfb3IsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDIsIGN1dDMKKyAgICAgICAgICBiaXRfb3IgPSBJT1IoYml0X29yLCBpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQ0LCBMT09QQ09VTlQKKyAgICAgICAgICBiaXRfb3IgPSBJT1IoYml0X29yLCBpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworCisgICAgICAgIElGICggYml0X29yIC5HRS4gMSkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJb3IgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworCisgICAgICAgIGJpdF9vciA9IDAKKyAgICAgICAgaW50X2FycmF5KExPT1BDT1VOVC8yKSA9IDEKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oSU9SOmJpdF9vcik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEsIGN1dDEKKyAgICAgICAgICBiaXRfb3IgPSBJT1IoYml0X29yLCBpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQyLCBjdXQzCisgICAgICAgICAgYml0X29yID0gSU9SKGJpdF9vciwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgYml0X29yID0gSU9SKGJpdF9vciwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKworICAgICAgICBJRiAoIGJpdF9vciAuTEUuIDApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSW9yIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBpbnRfYXJyYXkoaSkgPSAwCisgICAgICAgIEVORCBETworCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKElFT1I6ZXhjbHVzaXZfYml0X29yKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gSUVPUihleGNsdXNpdl9iaXRfb3IsIGludF9hcnJheShpKSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQyLCBjdXQzCisgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gSUVPUihleGNsdXNpdl9iaXRfb3IsIGludF9hcnJheShpKSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQ0LCBMT09QQ09VTlQKKyAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBJRU9SKGV4Y2x1c2l2X2JpdF9vciwgaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworCisgICAgICAgIElGICggZXhjbHVzaXZfYml0X29yIC5HRS4gMSkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJZW9yIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgZXhjbHVzaXZfYml0X29yID0gMAorICAgICAgICBpbnRfYXJyYXkoTE9PUENPVU5ULzIpID0gMQorCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKElFT1I6ZXhjbHVzaXZfYml0X29yKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gSUVPUihleGNsdXNpdl9iaXRfb3IsIGludF9hcnJheShpKSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQyLCBjdXQzCisgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gSUVPUihleGNsdXNpdl9iaXRfb3IsIGludF9hcnJheShpKSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQ0LCBMT09QQ09VTlQKKyAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBJRU9SKGV4Y2x1c2l2X2JpdF9vciwgaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworCisgICAgICAgIElGICggZXhjbHVzaXZfYml0X29yIC5MRS4gMCkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJZW9yIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgIGludF9hcnJheShpKSA9IDEwIC0gaQorICAgICAgICBFTkQgRE8KKworICAgICAgICBtaW5fdmFsdWUgPSA2NTUzNQorCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKE1JTjptaW5fdmFsdWUpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IDEsIGN1dDEKKyAgICAgICAgICBtaW5fdmFsdWUgPSBNSU4obWluX3ZhbHVlLGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0MiwgY3V0MworICAgICAgICAgIG1pbl92YWx1ZSA9IE1JTihtaW5fdmFsdWUsaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQ0LCBMT09QQ09VTlQKKyAgICAgICAgICBtaW5fdmFsdWUgPSBNSU4obWluX3ZhbHVlLGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIHNlY3Rpb25zCisKKyAgICAgICAgSUYgKCBtaW5fdmFsdWUgLkdULiAoMTAtTE9PUENPVU5UKSApVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBpbnRlZ2VyIE1JTiIKKyAgICAgICAgRU5EIElGCisKKworICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgaW50X2FycmF5KGkpID0gaQorICAgICAgICBFTkQgRE8KKworICAgICAgICBtYXhfdmFsdWUgPSAtMzI3NjgKKworISRvbXAgcGFyYWxsZWwgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihNQVg6bWF4X3ZhbHVlKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgbWF4X3ZhbHVlID0gTUFYKG1heF92YWx1ZSxpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDIsIGN1dDMKKyAgICAgICAgICBtYXhfdmFsdWUgPSBNQVgobWF4X3ZhbHVlLGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgbWF4X3ZhbHVlID0gTUFYKG1heF92YWx1ZSxpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworCisgICAgICAgIElGICggbWF4X3ZhbHVlIC5MVC4gTE9PUENPVU5UIClUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGludGVnZXIgTUFYIgorICAgICAgICBFTkQgSUYKKworIS4uLiB0ZXN0IGRvdWJsZSBtaW4sIG1heAorICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgZF9hcnJheShpKSA9IDEwIC0gaSpkdAorICAgICAgICBFTkQgRE8KKworICAgICAgICBkbWluID0gMioqMTAKKyAgICAgICAgZHQgPSAwLjUKKworISRvbXAgcGFyYWxsZWwgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihNSU46ZG1pbik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gMSwgY3V0MQorICAgICAgICAgIGRtaW49IE1JTihkbWluLGRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDIsIGN1dDMKKyAgICAgICAgICBkbWluPSBNSU4oZG1pbixkX2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQ0LCBMT09QQ09VTlQKKyAgICAgICAgICBkbWluPSBNSU4oZG1pbixkX2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKworICAgICAgICBJRiAoIGRtaW4gLkdULiAoMTAtZHQpIClUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGRvdWJsZSBNSU4iCisgICAgICAgIEVORCBJRgorCisKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgIGRfYXJyYXkoaSkgPSBpICogZHQKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgZG1heD0gLSAoMioqMTApCisKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oTUFYOmRtYXgpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IDEsIGN1dDEKKyAgICAgICAgICBkbWF4PSBNQVgoZG1heCxkX2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQyLCBjdXQzCisgICAgICAgICAgZG1heD0gTUFYKGRtYXgsZF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgZG1heD0gTUFYKGRtYXgsZF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIHNlY3Rpb25zCisKKyAgICAgICAgSUYgKCBkbWF4IC5sdC4gTE9PUENPVU5UKmR0IClUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIHdyaXRlKDEsKikgIkVycm9yIGluIGRvdWJsZSBNQVgiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIElGICggcmVzdWx0IC5FUS4gMCApIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gIDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAgMAorICAgICAgICBFTkQgSUYKKworICAgICAgICBDTE9TRSgyKQorCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9zZWN0aW9uX2ZpcnN0cHJpdmF0ZS5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vc2VjdGlvbl9maXJzdHByaXZhdGUuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzAwNThhCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vc2VjdGlvbl9maXJzdHByaXZhdGUuZgpAQCAtMCwwICsxLDQxIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBzZWN0aW9uIGZpcnN0cHJpdmF0ZSBkaXJlY3RpdmUgYnkgYWRkaW5nIGEgdmFyaWFibGUgd2hpY2ggaXMgZGVmaW5lZCBiZWZvcmUgdGhlIHBhcmFsbGVsIHJlZ2lvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGZpcnN0cHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPnNlY3Rpb25fZmlyc3Rwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIGtub3duX3N1bQorPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIHN1bSxzdW0wCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIHN1bSxzdW0wCis8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBzdW0gPSA3CisgICAgICAgIHN1bTAgPSAxMQorISRvbXAgcGFyYWxsZWwKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyEkb21wIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5maXJzdHByaXZhdGUoc3VtMCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPnByaXZhdGUoc3VtMCk8L29tcHRzOmNyb3NzY2hlY2s+CishJG9tcCBzZWN0aW9uCishJG9tcCBjcml0aWNhbAorICAgICAgICBzdW0gPSBzdW0gKyBzdW0wCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIHNlY3Rpb24KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHN1bSA9IHN1bSArIHN1bTAKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgc2VjdGlvbgorISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBlbmQgc2VjdGlvbnMKKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKyAgICAgICAga25vd25fc3VtID0gMTEqMys3CisgICAgICAgIElGICgga25vd25fc3VtIC5FUS4gc3VtKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vc2VjdGlvbl9sYXN0cHJpdmF0ZS5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vc2VjdGlvbl9sYXN0cHJpdmF0ZS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViYTcxNDgKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9zZWN0aW9uX2xhc3Rwcml2YXRlLmYKQEAgLTAsMCArMSw2MiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgc2VjdGlvbiBsYXN0cHJpdmF0ZSBkaXJlY3RpdmUuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBzZWN0aW9uIGxhc3Rwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+c2VjdGlvbl9sYXN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElOVEVHRVIga25vd25fc3VtCisKKyAgICAgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIGksIGkwLCBzdW0sIHN1bTAKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gaSxpMCxzdW0KKyAgICAgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgICAgICBzdW0gPSAwCisgICAgICAgIHN1bTAgPSAwCisgICAgICAgIGkwID0gLTEKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+bGFzdHByaXZhdGUoaTApPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz5wcml2YXRlKGkwKTwvb21wdHM6Y3Jvc3NjaGVjaz4gcHJpdmF0ZShpLHN1bTApCishJG9tcCBzZWN0aW9uCisgICAgICAgIHN1bTAgPSAwCisgICAgICAgIERPIGk9MSwgMzk5CisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpCisgICAgICAgICAgaTAgPSBpCisgICAgICAgIEVORCBETworISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBzZWN0aW9uCisgICAgICAgIHN1bTAgPSAwCisgICAgICAgIERPIGk9NDAwLCA2OTkKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGkKKyAgICAgICAgICBpMCA9IGkKKyAgICAgICAgRU5EIERPCishJG9tcCBjcml0aWNhbAorICAgICAgICBzdW0gPSBzdW0gKyBzdW0wCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIHNlY3Rpb24KKyAgICAgICAgc3VtMCA9IDAKKyAgICAgICAgRE8gaT03MDAsIDk5OQorICAgICAgICAgIHN1bTAgPSBzdW0wICsgaQorICAgICAgICAgIGkwID0gaQorICAgICAgICBFTkQgRE8KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHN1bSA9IHN1bSArIHN1bTAKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgZW5kIHNlY3Rpb25zCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIGtub3duX3N1bSA9ICg5OTkqMTAwMCkvMgorICAgICAgICBJRiAoIGtub3duX3N1bSAuRVEuIHN1bSAuQU5ELiBpMCAuRVEuIDk5OSApIFRIRU4KKyAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb210czp0ZXN0PgorCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3NlY3Rpb25fcHJpdmF0ZS5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vc2VjdGlvbl9wcml2YXRlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhiODA5MAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3NlY3Rpb25fcHJpdmF0ZS5mCkBAIC0wLDAgKzEsNTUgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgcGFyYWxsZWwgc2VjdGlvbiBwcml2YXRlIGNsYXVzZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIHNlY3Rpb24gcHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+c2VjdGlvbl9wcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIGtub3duX3N1bQorPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIHN1bSxzdW0wLGkKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gc3VtLHN1bTAsaQorPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgICAgICBzdW0gPSA3CisgICAgICAgIHN1bTAgPSAwCishJG9tcCBwYXJhbGxlbAorICAgICAgICA8b21wdHM6b3JwaGFuPgorISRvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnByaXZhdGUoc3VtMCxpKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+cHJpdmF0ZShpKTwvb21wdHM6Y3Jvc3NjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgc3VtMCA9IDAKKyAgICAgICAgRE8gaT0xLCAzOTkKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBjcml0aWNhbAorICAgICAgICBzdW0gPSBzdW0gKyBzdW0wCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIHNlY3Rpb24KKyAgICAgICAgc3VtMCA9IDAKKyAgICAgICAgRE8gaT00MDAsIDY5OQorICAgICAgICAgIHN1bTAgPSBzdW0wICsgaQorICAgICAgICBFTkQgRE8KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHN1bSA9IHN1bSArIHN1bTAKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgc2VjdGlvbgorICAgICAgICBzdW0wID0gMAorICAgICAgICBETyBpPTcwMCwgOTk5CisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpCisgICAgICAgIEVORCBETworISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBlbmQgc2VjdGlvbnMKKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKyAgICAgICAga25vd25fc3VtID0gKDk5OSoxMDAwKS8yKzcKKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLkVRLiBzdW0pIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9zZWN0aW9uX3JlZHVjdGlvbi5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vc2VjdGlvbl9yZWR1Y3Rpb24uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2U3MGY5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vc2VjdGlvbl9yZWR1Y3Rpb24uZgpAQCAtMCwwICsxLDc0MyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgc2VjdGlvbnMgcmVkdWN0aW9uIGRpcmVjdGl2ZSB3aXRoIGFsbCBpdHMgb3B0aW9ucy48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHNlY3Rpb25zIHJlZHVjdGlvbjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPnNlY3Rpb25fcmVkdWN0aW9uPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHN1bTIsIGtub3duX3N1bSwgaTIKKyAgICAgICAgSU5URUdFUiBrbm93bl9wcm9kdWN0LGludF9jb25zdAorICAgICAgICBJTlRFR0VSIE1BWF9GQUNUT1IKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBka25vd25fc3VtLGRwdAorICAgICAgICBJTlRFR0VSIHJlc3VsdAorICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisgICAgICAgIFBBUkFNRVRFUiAoaW50X2NvbnN0PTEwLGtub3duX3Byb2R1Y3Q9MzYyODgwMCkKKworICAgICAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgaSxkdW1teQorICAgICAgICBJTlRFR0VSIHN1bSwgZElGZgorICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIGR0CisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZHN1bSwgZGRJRmYKKyAgICAgICAgSU5URUdFUiBwcm9kdWN0CisgICAgICAgIExPR0lDQUwgbG9naWNzKExPT1BDT1VOVCkKKyAgICAgICAgSU5URUdFUiBpbnRfYXJyYXkoTE9PUENPVU5UKQorICAgICAgICBMT0dJQ0FMIGxvZ2ljX2FuZCwgbG9naWNfb3IsIGxvZ2ljX2Vxdixsb2dpY19uZXF2CisgICAgICAgIElOVEVHRVIgYml0X2FuZCwgYml0X29yCisgICAgICAgIElOVEVHRVIgZXhjbHVzaXZfYml0X29yCisgICAgICAgIElOVEVHRVIgbWluX3ZhbHVlLCBtYXhfdmFsdWUKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBkX2FycmF5KExPT1BDT1VOVCkKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBkbWluLCBkbWF4CisKKyAgICAgICAgSU5URUdFUiBET1VCTEVfRElHSVRTCisgICAgICAgIElOVEVHRVIgY3V0MSwgY3V0MiwgY3V0MywgY3V0NAorICAgICAgICBQQVJBTUVURVIgKERPVUJMRV9ESUdJVFM9MjAsTUFYX0ZBQ1RPUj0xMCkKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiByb3VuZGluZ19lcnJvcgorICAgICAgICBQQVJBTUVURVIgKHJvdW5kaW5nX2Vycm9yPTEuRS02KQorCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIGksc3VtLGRJRmYscHJvZHVjdCxkdCxkc3VtLGRkSUZmLGxvZ2ljX2FuZCwKKyAgICAgJiAgICBsb2dpY19vcixsb2dpY19lcXYsbG9naWNfbmVxdixsb2dpY3MsaW50X2FycmF5LGJpdF9hbmQsYml0X29yLAorICAgICAmICAgIGV4Y2x1c2l2X2JpdF9vcixtaW5fdmFsdWUsZG1pbixkbWF4LGRfYXJyYXksbWF4X3ZhbHVlCisgICAgICAgIAorICAgICAgICBjdXQxID0gTklOVChMT09QQ09VTlQgLyAzLjMpCisgICAgICAgIGN1dDIgPSBjdXQxICsgMQorICAgICAgICBjdXQzID0gY3V0MSAqIDIKKyAgICAgICAgY3V0NCA9IGN1dDMgKyAxCisKKyAgICAgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgICAgICBkdCA9IDEuLzMuCisgICAgICAgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMgorICAgICAgICBwcm9kdWN0ID0gMQorICAgICAgICBzdW0yID0gMAorICAgICAgICBzdW0gPSAwCisgICAgICAgIGRzdW0gPSAwLgorICAgICAgICByZXN1bHQgPTAgCisgICAgICAgIGxvZ2ljX2FuZCA9IC50cnVlLgorICAgICAgICBsb2dpY19vciA9IC5mYWxzZS4KKyAgICAgICAgYml0X2FuZCA9IDEKKyAgICAgICAgYml0X29yID0gMAorICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSAwCisgICAgICAgIGN1dDEgPSBOSU5UKExPT1BDT1VOVCAvIDMuMykKKyAgICAgICAgY3V0MiA9IGN1dDEgKyAxCisgICAgICAgIGN1dDMgPSBjdXQxICogMgorICAgICAgICBjdXQ0ID0gY3V0MyArIDEKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKzpzdW0pPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9MSwgY3V0MQorICAgICAgICAgIHN1bSA9IHN1bSArIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPWN1dDIsIGN1dDMKKyAgICAgICAgICBzdW0gPSBzdW0gKyBpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID1jdXQ0LCBMT09QQ09VTlQKKyAgICAgICAgICBzdW0gPSBzdW0gKyBpCisgICAgICAgIEVORCBETworISRvbXAgRU5EIHNlY3Rpb25zCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIEVORCBwYXJhbGxlbAorCisgICAgICAgIElGIChrbm93bl9zdW0gLk5FLiBzdW0pIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIHN1bSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICIsCisgICAgICYgICAgc3VtLCJpbnN0ZWFkIG9mICIsIGtub3duX3N1bQorICAgICAgICBFTkQgSUYKKworICAgICAgICBkSUZmID0ga25vd25fc3VtCisKKworCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24gKC06IGRJRmYpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9MSwgY3V0MQorICAgICAgICAgIGRJRmYgPSBkSUZmIC0gaQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9Y3V0MiwgY3V0MworICAgICAgICAgIGRJRmYgPSBkSUZmIC0gaQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9Y3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgZElGZiA9IGRJRmYgLSBpCisgICAgICAgIEVORCBETworISRvbXAgRU5EIHNlY3Rpb25zCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIEVORCBwYXJhbGxlbAorICAKKyAgICAgICAgSUYgKCBkSUZmIC5ORS4gMCApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGRJRmZlcmVuY2Ugd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgIHN1bSwiaW5zdGVhZCBvZiAwLiIKKyAgICAgICAgRU5EIElGCisKKyEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIQorISAgIFRlc3QgZm9yIERPdWJsZXMKKyEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIQorICAgICAgICBkc3VtID0gMC4KKyAgICAgICAgZHB0ID0gMQorCisgICAgICAgIERPIGk9MSwgRE9VQkxFX0RJR0lUUworICAgICAgICAgIGRwdD0gZHB0ICogZHQKKyAgICAgICAgRU5EIERPCisgICAgICAgIGRrbm93bl9zdW0gPSAoMS1kcHQpLygxLWR0KQorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKzpkc3VtKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9MCw2CisgICAgICAgICAgICAgIGRzdW0gPSBkc3VtICsgZHQqKmkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9NywxMgorICAgICAgICAgICAgICBkc3VtID0gZHN1bSArIGR0KippCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEzLERPVUJMRV9ESUdJVFMtMQorICAgICAgICAgICAgICBkc3VtID0gZHN1bSArIGR0KippCisgICAgICAgIEVORCBETworISRvbXAgRU5EIHNlY3Rpb25zCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIEVORCBwYXJhbGxlbAorCisgCisgICAgICAgIElGIChkc3VtIC5ORS4gZGtub3duX3N1bSAuQU5ELiAKKyAgICAgJiAgICBhYnMoZHN1bSAtIGRrbm93bl9zdW0pIC5HVC4gcm91bmRpbmdfZXJyb3IgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIHN1bSB3aXRoIERPdWJsZXM6IFJlc3VsdCB3YXMgIiwKKyAgICAgJiAgICAgIGRzdW0sImluc3RlYWQgb2YgIixka25vd25fc3VtLCIoRElGZmVyZW5jZTogIiwKKyAgICAgJiAgICAgIGRzdW0gLSBka25vd25fc3VtLCIpIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBkcHQgPSAxCisgICAgICAgIERPIGk9MSwgRE9VQkxFX0RJR0lUUworICAgICAgICAgIGRwdCA9IGRwdCpkdAorICAgICAgICBFTkQgRE8KKworICAgICAgICBkZElGZiA9ICggMS1kcHQpLygxLWR0KQorISRvbXAgcGFyYWxsZWwKKyEkb21wIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLTpkZElGZik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTAsIDYKKyAgICAgICAgICBkZElGZiA9IGRkSUZmIC0gZHQqKmkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9NywgMTIKKyAgICAgICAgICBkZElGZiA9IGRkSUZmIC0gZHQqKmkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9MTMsIERPVUJMRV9ESUdJVFMtMQorICAgICAgICAgIGRkSUZmID0gZGRJRmYgLSBkdCoqaQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworISRvbXAgRU5EIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBhYnMoZGRJRmYpIC5HVC4gcm91bmRpbmdfZXJyb3IgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIERJRmZlcmVuY2Ugd2l0aCBET3VibGVzOiBSZXN1bHQgd2FzICIsCisgICAgICYgICAgICBkZElGZiwiaW5zdGVhZCBvZiAwLjAiCisgICAgICAgIEVORCBJRgorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKjpwcm9kdWN0KTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9MSwzCisgICAgICAgICAgcHJvZHVjdCA9IHByb2R1Y3QgKiBpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTQsNgorICAgICAgICAgIHByb2R1Y3QgPSBwcm9kdWN0ICogaQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT03LDEwCisgICAgICAgICAgcHJvZHVjdCA9IHByb2R1Y3QgKiBpCisgICAgICAgIEVORCBETworISRvbXAgRU5EIHNlY3Rpb25zCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIEVORCBwYXJhbGxlbAorCisgICAgICAgIElGIChrbm93bl9wcm9kdWN0IC5ORS4gcHJvZHVjdCkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBQcm9kdWN0IHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgIiwKKyAgICAgJiAgICAgIHByb2R1Y3QsIiBpbnN0ZWFkIG9mIixrbm93bl9wcm9kdWN0IAorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgbG9naWNzKGkpID0gLlRSVUUuCisgICAgICAgIEVORCBETworCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLmFuZC46bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9MSxjdXQxCisgICAgICAgICAgbG9naWNfYW5kID0gbG9naWNfYW5kIC5BTkQuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQyLGN1dDMKKyAgICAgICAgICBsb2dpY19hbmQgPSBsb2dpY19hbmQgLkFORC4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDQsTE9PUENPVU5UCisgICAgICAgICAgbG9naWNfYW5kID0gbG9naWNfYW5kIC5BTkQuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAoLk5PVC4gbG9naWNfYW5kKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisKKyAgICAgICAgbG9naWNfYW5kID0gLlRSVUUuCisgICAgICAgIGxvZ2ljcyhMT09QQ09VTlQvMikgPSAuRkFMU0UuCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiguYW5kLjpsb2dpY19hbmQpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0xLGN1dDEKKyAgICAgICAgICBsb2dpY19hbmQgPSBsb2dpY19hbmQgLkFORC4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDIsY3V0MworICAgICAgICAgIGxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAuQU5ELiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0NCxMT09QQ09VTlQKKyAgICAgICAgICBsb2dpY19hbmQgPSBsb2dpY19hbmQgLkFORC4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgRU5EIHNlY3Rpb25zCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIEVORCBwYXJhbGxlbAorCisgICAgICAgIElGIChsb2dpY19hbmQpIFRIRU4KKyAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBBTkQgcGFzcyAyIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgbG9naWNzKGkpID0gLkZBTFNFLgorICAgICAgICBFTkQgRE8KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5vci46bG9naWNfb3IpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IDEsIGN1dDEKKyAgICAgICAgICAgbG9naWNfb3IgPSBsb2dpY19vciAuT1IuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDIsIGN1dDMKKyAgICAgICAgICAgbG9naWNfb3IgPSBsb2dpY19vciAuT1IuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDQsIExPT1BDT1VOVAorICAgICAgICAgICBsb2dpY19vciA9IGxvZ2ljX29yIC5PUi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgRU5EIHNlY3Rpb25zCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIEVORCBwYXJhbGxlbAorCisgICAgICAgIElGIChsb2dpY19vcikgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGxvZ2ljX29yID0gLkZBTFNFLgorICAgICAgICBsb2dpY3MoTE9PUENPVU5ULzIpID0gLlRSVUUuCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigub3IuOmxvZ2ljX29yKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9MSxjdXQxCisgICAgICAgICAgIGxvZ2ljX29yID0gbG9naWNfb3IgLk9SLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0MixjdXQzCisgICAgICAgICAgIGxvZ2ljX29yID0gbG9naWNfb3IgLk9SLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0NCxMT09QQ09VTlQKKyAgICAgICAgICAgbG9naWNfb3IgPSBsb2dpY19vciAuT1IuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIC5OT1QuIGxvZ2ljX29yICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCishLi4uIFRlc3QgbG9naWMgRVFWLCB1bmlxdWUgaW4gRm9ydHJhbgorICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgbG9naWNzKGkpID0gLlRSVUUuCisgICAgICAgIEVORCBETworCisgICAgICAgIGxvZ2ljX2VxdiA9IC5UUlVFLgorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLmVxdi46bG9naWNfZXF2KTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgIGxvZ2ljX2VxdiA9IGxvZ2ljX2VxdiAuRVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQyLCBjdXQzCisgICAgICAgICAgIGxvZ2ljX2VxdiA9IGxvZ2ljX2VxdiAuRVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQ0LCBMT09QQ09VTlQKKyAgICAgICAgICAgbG9naWNfZXF2ID0gbG9naWNfZXF2IC5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAoLk5PVC4gbG9naWNfZXF2KSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIEVRViBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGxvZ2ljX2VxdiA9IC5UUlVFLgorICAgICAgICBsb2dpY3MoTE9PUENPVU5ULzIpID0gLkZBTFNFLgorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLmVxdi46bG9naWNfZXF2KTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9MSxjdXQxCisgICAgICAgICAgIGxvZ2ljX2VxdiA9IGxvZ2ljX2VxdiAuRVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0MixjdXQzCisgICAgICAgICAgIGxvZ2ljX2VxdiA9IGxvZ2ljX2VxdiAuZXF2LiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0NCxMT09QQ09VTlQKKyAgICAgICAgICAgbG9naWNfZXF2ID0gbG9naWNfZXF2IC5lcXYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGxvZ2ljX2VxdiApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgRVFWIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyEuLi4gVGVzdCBsb2dpYyBORVFWLCB3aGljaCBpcyB1bmlxdWUgaW4gRm9ydHJhbgorICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgbG9naWNzKGkpID0gLmZhbHNlLgorICAgICAgICBFTkQgRE8KKworICAgICAgICBsb2dpY19uZXF2ID0gLmZhbHNlLgorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLm5lcXYuOmxvZ2ljX25lcXYpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IDEsIGN1dDEKKyAgICAgICAgICAgbG9naWNfbmVxdiA9IGxvZ2ljX25lcXYgLk5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDIsIGN1dDMKKyAgICAgICAgICAgbG9naWNfbmVxdiA9IGxvZ2ljX25lcXYgLk5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDQsIExPT1BDT1VOVAorICAgICAgICAgICBsb2dpY19uZXF2ID0gbG9naWNfbmVxdiAuTkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgRU5EIHNlY3Rpb25zCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIEVORCBwYXJhbGxlbAorCisgICAgICAgIElGIChsb2dpY19uZXF2KSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIE5FUVYgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBsb2dpY19uZXF2ID0gLkZBTFNFLgorICAgICAgICBsb2dpY3MoTE9PUENPVU5ULzIpID0gLlRSVUUuCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigubmVxdi46bG9naWNfbmVxdik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEsY3V0MQorICAgICAgICAgICBsb2dpY19uZXF2ID0gbG9naWNfbmVxdiAuTkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDIsY3V0MworICAgICAgICAgICBsb2dpY19uZXF2ID0gbG9naWNfbmVxdiAuTkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDQsTE9PUENPVU5UCisgICAgICAgICAgIGxvZ2ljX25lcXYgPSBsb2dpY19uZXF2IC5ORVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBFTkQgc2VjdGlvbnMKKzwvb21wdHM6b3JwaGFuPgorISRvbXAgRU5EIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCAuTk9ULiBsb2dpY19uZXF2ICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICB3cml0ZSgxLCopICJFcnJvciBpbiBsb2dpYyBORVFWIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICAgaW50X2FycmF5KGkpID0gMQorICAgICAgICBFTkQgRE8KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKGlhbmQ6Yml0X2FuZCk8L29tcHRzOmNoZWNrPgorIS4uLiBpYW5kKEksSik6IFJldHVybnMgdmFsdWUgcmVzdWx0aW5nIGZyb20gYm9vbGVhbiBBTkQgb2YKKyEuLi4gcGFpciBvZiBiaXRzIGluIGVhY2ggb2YgSSBhbmQgSi4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0xLCBjdXQxCisgICAgICAgICBiaXRfYW5kID0gaWFuZChiaXRfYW5kLGludF9hcnJheShpKSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0MiwgY3V0MworICAgICAgICAgYml0X2FuZCA9IGlhbmQoYml0X2FuZCxpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDQsIExPT1BDT1VOVAorICAgICAgICAgYml0X2FuZCA9IGlhbmQoYml0X2FuZCxpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgRU5EIHNlY3Rpb25zCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIEVORCBwYXJhbGxlbAorCisgICAgICAgIElGICggYml0X2FuZCAubHQuIDEgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIHdyaXRlKDEsKikgIkVycm9yIGluIElBTkQgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBiaXRfYW5kID0gMQorICAgICAgICBpbnRfYXJyYXkoTE9PUENPVU5ULzIpID0gMAorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oaWFuZDpiaXRfYW5kKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9MSwgY3V0MQorICAgICAgICAgIGJpdF9hbmQgPSBpYW5kICggYml0X2FuZCwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0MiwgY3V0MworICAgICAgICAgIGJpdF9hbmQgPSBpYW5kICggYml0X2FuZCwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgYml0X2FuZCA9IGlhbmQgKCBiaXRfYW5kLCBpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiggYml0X2FuZCAuR0UuIDEpIFRIRU4KKyAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIElBTkQgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgIGludF9hcnJheShpKSA9IDAKKyAgICAgICAgRU5EIERPCisKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKGlvcjpiaXRfb3IpPC9vbXB0czpjaGVjaz4KKyEuLi4gSW9yKEksSik6IFJldHVybnMgdmFsdWUgcmVzdWx0aW5nIGZyb20gYm9vbGVhbiBPUiBvZgorIS4uLiBwYWlyIG9mIGJpdHMgaW4gZWFjaCBvZiBJIGFuZCBKLgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEsIGN1dDEKKyAgICAgICAgICBiaXRfb3IgPSBpb3IoYml0X29yLCBpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQyLCBjdXQzCisgICAgICAgICAgYml0X29yID0gaW9yKGJpdF9vciwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgYml0X29yID0gaW9yKGJpdF9vciwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBFTkQgc2VjdGlvbnMKKzwvb21wdHM6b3JwaGFuPgorISRvbXAgRU5EIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBiaXRfb3IgLkdFLiAxKSBUSEVOCisgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJb3IgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworCisgICAgICAgIGJpdF9vciA9IDAKKyAgICAgICAgaW50X2FycmF5KExPT1BDT1VOVC8yKSA9IDEKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihpb3I6Yml0X29yKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9MSwgY3V0MQorICAgICAgICAgIGJpdF9vciA9IElvcihiaXRfb3IsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDIsIGN1dDMKKyAgICAgICAgICBiaXRfb3IgPSBJb3IoYml0X29yLCBpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQ0LCBMT09QQ09VTlQKKyAgICAgICAgICBiaXRfb3IgPSBJb3IoYml0X29yLCBpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGJpdF9vciAuTEUuIDApIFRIRU4KKyAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIElvciBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgaW50X2FycmF5KGkpID0gMAorICAgICAgICBFTkQgRE8KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKGllb3I6ZXhjbHVzaXZfYml0X29yKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBpZW9yKGV4Y2x1c2l2X2JpdF9vciwgaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDIsIGN1dDMKKyAgICAgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IGllb3IoZXhjbHVzaXZfYml0X29yLCBpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBpZW9yKGV4Y2x1c2l2X2JpdF9vciwgaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGV4Y2x1c2l2X2JpdF9vciAuR0UuIDEpIFRIRU4KKyAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJZW9yIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgZXhjbHVzaXZfYml0X29yID0gMAorICAgICAgICBpbnRfYXJyYXkoTE9PUENPVU5ULzIpID0gMQorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oaWVvcjpleGNsdXNpdl9iaXRfb3IpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IDEsIGN1dDEKKyAgICAgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IGllb3IoZXhjbHVzaXZfYml0X29yLCBpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0MiwgY3V0MworICAgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gaWVvcihleGNsdXNpdl9iaXRfb3IsIGludF9hcnJheShpKSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQ0LCBMT09QQ09VTlQKKyAgICAgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IGllb3IoZXhjbHVzaXZfYml0X29yLCBpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgRU5EIHNlY3Rpb25zCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIEVORCBwYXJhbGxlbAorCisgICAgICAgIElGICggZXhjbHVzaXZfYml0X29yIC5MRS4gMCkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJZW9yIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgICBpbnRfYXJyYXkoaSkgPSAxMCAtIGkKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgbWluX3ZhbHVlID0gNjU1MzUKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKG1pbjptaW5fdmFsdWUpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IDEsIGN1dDEKKyAgICAgICAgICAgIG1pbl92YWx1ZSA9IG1pbihtaW5fdmFsdWUsaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQyLCBjdXQzCisgICAgICAgICAgICBtaW5fdmFsdWUgPSBtaW4obWluX3ZhbHVlLGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgICBtaW5fdmFsdWUgPSBtaW4obWluX3ZhbHVlLGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgRU5EIHNlY3Rpb25zCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIEVORCBwYXJhbGxlbAorCisgICAgICAgIElGICggbWluX3ZhbHVlIC5HVC4gKDEwLUxPT1BDT1VOVCkgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGludGVnZXIgTUlOIgorICAgICAgICBFTkQgSUYKKworCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICAgaW50X2FycmF5KGkpID0gaQorICAgICAgICBFTkQgRE8KKworICAgICAgICBtYXhfdmFsdWUgPSAtMzI3NjgKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKG1heDptYXhfdmFsdWUpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IDEsIGN1dDEKKyAgICAgICAgICAgIG1heF92YWx1ZSA9IG1heChtYXhfdmFsdWUsaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQyLCBjdXQzCisgICAgICAgICAgICBtYXhfdmFsdWUgPSBtYXgobWF4X3ZhbHVlLGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgICBtYXhfdmFsdWUgPSBtYXgobWF4X3ZhbHVlLGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgRU5EIHNlY3Rpb25zCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIEVORCBwYXJhbGxlbAorCisgICAgICAgIElGICggbWF4X3ZhbHVlIC5MVC4gTE9PUENPVU5UICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBpbnRlZ2VyIE1BWCIKKyAgICAgICAgRU5EIElGCisKKyEuLi4gdGVzdCBET3VibGUgbWluLCBtYXgKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgICBkX2FycmF5KGkpID0gMTAgLSBpKmR0CisgICAgICAgIEVORCBETworCisgICAgICAgIGRtaW4gPSAyKioxMAorICAgICAgICBkdCA9IDAuNQorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24obWluOmRtaW4pPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IDEsIGN1dDEKKyAgICAgICAgICAgIGRtaW49IG1pbihkbWluLGRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDIsIGN1dDMKKyAgICAgICAgICAgIGRtaW49IG1pbihkbWluLGRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDQsIExPT1BDT1VOVAorICAgICAgICAgICAgZG1pbj0gbWluKGRtaW4sZF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgRU5EIHNlY3Rpb25zCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIEVORCBwYXJhbGxlbAorCisgICAgICAgIElGICggZG1pbiAuR1QuICgxMC1kdCkgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIERPdWJsZSBNSU4iCisgICAgICAgIEVORCBJRgorCisKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgICBkX2FycmF5KGkpID0gaSAqIGR0CisgICAgICAgIEVORCBETworCisgICAgICAgIGRtYXg9IC0gKDIqKjEwKQorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24obWF4OmRtYXgpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IDEsIGN1dDEKKyAgICAgICAgICAgIGRtYXg9IG1heChkbWF4LGRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDIsIGN1dDMKKyAgICAgICAgICAgIGRtYXg9IG1heChkbWF4LGRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDQsIExPT1BDT1VOVAorICAgICAgICAgICAgZG1heD0gbWF4KGRtYXgsZF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgRU5EIHNlY3Rpb25zCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIEVORCBwYXJhbGxlbAorCisgICAgICAgIElGICggZG1heCAuTFQuIExPT1BDT1VOVCpkdCApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gRE91YmxlIE1BWCIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgSUYgKCByZXN1bHQgLkVRLiAwICkgVEhFTgorICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gIDEKKyAgICAgICAgRUxTRQorICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gIDAKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgQ0xPU0UoMikKKworICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vc2luZ2xlX2NvcHlwcml2YXRlLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9zaW5nbGVfY29weXByaXZhdGUuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODc4YTY2Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vc2luZ2xlX2NvcHlwcml2YXRlLmYKQEAgLTAsMCArMSw0MSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgc2luZ2xlIGNvcHlwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHNpbmdsZSBjb3B5cHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBwYXJsbGVsLG9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+c2luZ2xlX2NvcHlwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIG9tcF9nZXRfdGhyZWFkX251bQorICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCis8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgaSxqLHRocmVhZCxucl9pdGVyYXRpb25zLHJlc3VsdAorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBucl9pdGVyYXRpb25zLHJlc3VsdAorPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgICAgICByZXN1bHQ9MAorICAgICAgICBucl9pdGVyYXRpb25zPTAKKworISRvbXAgcGFyYWxsZWwgcHJpdmF0ZShpLGosdGhyZWFkKQorICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICBETyBpPTAsTE9PUENPVU5ULTEKKyAgICAgICAgICB0aHJlYWQ9T01QX0dFVF9USFJFQURfTlVNKCkKKyEkb21wIHNpbmdsZSAKKyAgICAgICAgICBucl9pdGVyYXRpb25zPW5yX2l0ZXJhdGlvbnMrMQorICAgICAgICAgIGo9aQorISRvbXAgZW5kIHNpbmdsZSA8b21wdHM6Y2hlY2s+Y29weXByaXZhdGUoaik8L29tcHRzOmNoZWNrPgorISRvbXAgY3JpdGljYWwKKyAgICAgICAgICByZXN1bHQ9cmVzdWx0K2otaTsKKyEkb21wIGVuZCBjcml0aWNhbAorICAgICAgICBFTkQgRE8KKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKyAgICAgICAgSUYocmVzdWx0IC5FUS4gMCAuQU5ELiAKKyAgICAgJiAgICAgbnJfaXRlcmF0aW9ucyAuRVEuIExPT1BDT1VOVCkgVEhFTgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT49MQorICAgICAgICBFTFNFCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPj0wCisgICAgICAgIEVORCBJRgorICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vc2luZ2xlX25vd2FpdC5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vc2luZ2xlX25vd2FpdC5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NDRhZjUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9zaW5nbGVfbm93YWl0LmYKQEAgLTAsMCArMSw1MCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgc2luZ2xlIG5vd2FpdDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbCxvbXAgYXRvbWljPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5zaW5nbGVfbm93YWl0PC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHJlc3VsdCwgdG90YWxfaXRlcmF0aW9ucywgbXlfaXRlcmF0aW9ucyxpCisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKzxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBucl9pdGVyYXRpb25zCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIG5yX2l0ZXJhdGlvbnMKKzwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICAgICAgcmVzdWx0PTAKKyAgICAgICAgbnJfaXRlcmF0aW9ucz0wCisgICAgICAgIHRvdGFsX2l0ZXJhdGlvbnM9MAorICAgICAgICBteV9pdGVyYXRpb25zPTAKKworISRvbXAgcGFyYWxsZWwgcHJpdmF0ZShpKQorICAgICAgICBETyBpPTAsIExPT1BDT1VOVCAtMQorICAgICAgICA8b21wdHM6b3JwaGFuPgorPG9tcHRzOmNoZWNrPiEkb21wIHNpbmdsZTwvb21wdHM6Y2hlY2s+CishJG9tcCBhdG9taWMKKyAgICAgICAgICBucl9pdGVyYXRpb25zID0gbnJfaXRlcmF0aW9ucyArIDEKKzxvbXB0czpjaGVjaz4hJG9tcCBlbmQgc2luZ2xlIG5vd2FpdDwvb21wdHM6Y2hlY2s+CisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbAorISRvbXAgcGFyYWxsZWwgcHJpdmF0ZShpLG15X2l0ZXJhdGlvbnMpCisgICAgICAgIG15X2l0ZXJhdGlvbnMgPSAwCisgICAgICAgIERPIGk9MCwgTE9PUENPVU5UIC0xCis8b21wdHM6Y2hlY2s+ISRvbXAgc2luZ2xlPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICBteV9pdGVyYXRpb25zID0gbXlfaXRlcmF0aW9ucyArIDEKKzxvbXB0czpjaGVjaz4hJG9tcCBlbmQgc2luZ2xlIG5vd2FpdDwvb21wdHM6Y2hlY2s+CisgICAgICAgIEVORCBETworISRvbXAgY3JpdGljYWwKKyAgICAgICAgdG90YWxfaXRlcmF0aW9ucyA9IHRvdGFsX2l0ZXJhdGlvbnMgKyBteV9pdGVyYXRpb25zCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIGVuZCBwYXJhbGxlbAorICAgICAgICBJRiAoIG5yX2l0ZXJhdGlvbnMgLkVRLiBMT09QQ09VTlQgLkFORC4KKyAgICAgJiAgICAgdG90YWxfaXRlcmF0aW9ucyAuRVEuIExPT1BDT1VOVCApIFRIRU4KKyAgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vc2luZ2xlX3ByaXZhdGUuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3NpbmdsZV9wcml2YXRlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FkNGE2YQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3NpbmdsZV9wcml2YXRlLmYKQEAgLTAsMCArMSw1MSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgc2luZ2xlIHByaXZhdGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgc2luZ2VsIHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWwsb21wIGZsdXNoLG9tcCBzaW5nbGUgbm93YWl0PC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPnNpbmdsZV9wcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIG5yX2l0ZXJhdGlvbnMsIGkKKwkJPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIHJlc3VsdAorICAgICAgICBJTlRFR0VSIG5yX3RocmVhZHNfaW5fc2luZ2xlLCBteXJlc3VsdCwgbXlpdAorICAgICAgICBDT01NT04gL29ycGh2YXJzLyByZXN1bHQsbnJfaXRlcmF0aW9ucworCQk8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisgICAgICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlPTAKKyAgICAgICAgcmVzdWx0PTAKKyAgICAgICAgbXlyZXN1bHQ9MAorICAgICAgICBteWl0PTAKKyAgICAgICAgbnJfaXRlcmF0aW9ucz0wCishJG9tcCBwYXJhbGxlbCBwcml2YXRlKGksIG15cmVzdWx0LCBteWl0KQorPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgbXlyZXN1bHQgPSAwCisgICAgICAgIG15aXQgPSAwCisgICAgICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlPTAKKyEkb21wIGJhcnJpZXIKKyAgICAgICAgRE8gaT0wLCBMT09QQ09VTlQgLTEKKyEkb21wIHNpbmdsZSA8b21wdHM6Y2hlY2s+cHJpdmF0ZShucl90aHJlYWRzX2luX3NpbmdsZSk8L29tcHRzOmNoZWNrPgorICAgICAgICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlID0gMAorISRvbXAgZmx1c2gKKyAgICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZSA9IG5yX3RocmVhZHNfaW5fc2luZ2xlICsgMQorISRvbXAgZmx1c2gKKyAgICAgICAgICBteWl0ID0gbXlpdCArIDEKKyAgICAgICAgICBteXJlc3VsdCA9IG15cmVzdWx0ICsgbnJfdGhyZWFkc19pbl9zaW5nbGUKKyEkb21wIGVuZCBzaW5nbGUgbm93YWl0CisgICAgICAgIEVORCBETworISRvbXAgY3JpdGljYWwKKyAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgbnJfdGhyZWFkc19pbl9zaW5nbGUKKyAgICAgICAgbnJfaXRlcmF0aW9ucyA9IG5yX2l0ZXJhdGlvbnMgKyBteWl0CishJG9tcCBlbmQgY3JpdGljYWwKKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisgICAgICAgIFdSSVRFKDEsKikgInJlc3VsdCBpcyIscmVzdWx0LCJucl9pdCBpcyIsbnJfaXRlcmF0aW9ucworICAgICAgICBJRiAoIHJlc3VsdCAuRVEuIDAgLkFORC4gbnJfaXRlcmF0aW9ucyAuRVEuIExPT1BDT1VOVCkgVEhFTgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3Rlc3RsaXN0LWYudHh0IGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vdGVzdGxpc3QtZi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE3NjZlMAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3Rlc3RsaXN0LWYudHh0CkBAIC0wLDAgKzEsNDUgQEAKK2RvX2ZpcnN0cHJpdmF0ZS5mCitkb19sYXN0cHJpdmF0ZQorZG9fb3JkZXJlZAorZG9fcHJpdmF0ZQorZG9fcmVkdWN0aW9uCisjZG9fc2NoZWR1bGVfZHluYW1pYworI2RvX3NjaGVkdWxlX2d1aWRlZAorI2RvX3NjaGVkdWxlX3N0YXRpYworaGFzX29wZW5tcAorI29tcF9hdG9taWMKK29tcF9iYXJyaWVyCitvbXBfY29weWluCitvbXBfY3JpdGljYWwKKyNvbXBfZmx1c2gKK29tcF9nZXRfbnVtX3RocmVhZHMKK29tcF9pbl9wYXJhbGxlbAorb21wX2xvY2sKK29tcF9tYXN0ZXIKK29tcF9uZXN0X2xvY2sKK29tcF9uZXN0X3Rlc3Rsb2NrCitvbXBfbmVzdGVkCitvbXBfbnVtX3RocmVhZHMKK29tcF90ZXN0bG9jaworb21wX3Rlc3RzdWl0ZQorb21wX3RocmVhZHByaXZhdGUKKyNvbXBfdGlja3NfdGltZQorI29tcF93b3Jrc2hhcmUKKyNvbXBfd3RpbWUKKyNwYXJfZG9maXJzdHByaXZhdGUKKyNwYXJfZG9fbGFzdHByaXZhdGUKKyNwYXJfZG9fb3JkZXJlZAorI3Bhcl9kb19wcml2YXRlCisjcGFyX2RvX3JlZHVjdGlvbgorI3Bhcl9zZWN0aW9uaXJzdHByaXZhdGUuZgorI3Bhcl9zZWN0aW9uX2xhc3Rwcml2YXRlCisjcGFyX3NlY3Rpb25fcHJpdmF0ZQorI3Bhcl9zZWN0aW9uX3JlZHVjdGlvbgorI3NlY3Rpb25pcnN0cHJpdmF0ZS5mCisjc2VjdGlvbl9sYXN0cHJpdmF0ZQorI3NlY3Rpb25fcHJpdmF0ZQorI3NlY3Rpb25fcmVkdWN0aW9uCisjc2luZ2xlCisjc2luZ2xlX2NvcHlwcml2YXRlCisjc2luZ2xlX25vd2FpdAorI3NpbmdsZV9wcml2YXRlCmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvb21wX215X3NsZWVwLmYgYi9maW5hbC90ZXN0c3VpdGUvb21wX215X3NsZWVwLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNjYjA0YgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9vbXBfbXlfc2xlZXAuZgpAQCAtMCwwICsxLDI2IEBACishIFV0aWxpdHkgZnVuY3Rpb25zIHRvIGhhdmUgYSBzbGVlcCBmdW5jdGlvbiB3aXRoIGJldHRlciByZXNvbHV0aW9uIGFuZAorISB3aGljaCBvbmx5IHN0b3BzIG9uZSB0aHJlYWQuCisKKyAgICAgIHN1YnJvdXRpbmUgbXlfc2xlZXAoc2xlZXB0aW1lKQorICAgICAgICBpbXBsaWNpdCBub25lCisgICAgICAgIGRvdWJsZSBwcmVjaXNpb24gOjogc2xlZXB0aW1lCisgICAgICAgIGludGVnZXIgOjogdQorICAgICAgICBpbnRlZ2VyIDo6IHQoOCkKKyAgICAgICAgaW50ZWdlciA6OiBtczEsIG1zMgorICAgICAgICBpbnRlZ2VyIDo6IGNudAorCisgICAgICAgIHUgPSBzbGVlcHRpbWUgKiAxMDAwCisKKyAgICAgICAgY2FsbCBkYXRlX2FuZF90aW1lKHZhbHVlcz10KQorCisgICAgICAgICEgY2FsY3VsYXRlIHN0YXJ0IHRpbWUgaW4gbXMKKyAgICAgICAgbXMxID0gdCg4KSArIHQoNykqMTAwMCArIHQoNikqNjAwMDAgKyB0KDUpKjM2MDAwMDAKKworICAgICAgICBtczIgPSBtczEKKyAgICAgICAgY250ID0gMAorICAgICAgICBkbyB3aGlsZSAoIChtczIgLSBtczEpIDwgdSkKKyAgICAgICAgICAgIGNhbGwgZGF0ZV9hbmRfdGltZSh2YWx1ZXM9dCkKKyAgICAgICAgICAgIG1zMiA9IHQoOCkgKyB0KDcpKjEwMDAgKyB0KDYpKjYwMDAwICsgdCg1KSozNjAwMDAwCisgICAgICAgICAgICBjbnQgPSBjbnQrMQorICAgICAgICBlbmQgZG8KKyAgICAgIGVuZCBzdWJyb3V0aW5lCmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvb21wX215X3NsZWVwLmggYi9maW5hbC90ZXN0c3VpdGUvb21wX215X3NsZWVwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM5MGE1YgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9vbXBfbXlfc2xlZXAuaApAQCAtMCwwICsxLDM1IEBACisjaWZuZGVmIE1ZX1NMRUVQX0gKKyNkZWZpbmUgTVlfU0xFRVBfSAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlPHN0ZGxpYi5oPgorI2luY2x1ZGU8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxzeXMvdGltZXMuaD4gCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworLyohIFV0aWxpdHkgZnVuY3Rpb24gdG8gaGF2ZSBhIHNsZWVwIGZ1bmN0aW9uIHdpdGggYmV0dGVyIHJlc29sdXRpb24gYW5kIHdoaWNoIG9ubHkgc3RvcHMgb25lIHRocmVhZC4gKi8KKworc3RhdGljIHZvaWQgbXlfc2xlZXAoZG91YmxlIHNsZWVwdGltZSl7CisgIHN0cnVjdCB0aW1ldmFsIHR2OworICBzdHJ1Y3QgdGltZXpvbmUgdHpwOworICBkb3VibGUgc3RhcnQ7CisgIGRvdWJsZSByZWFsOworICBpZihnZXR0aW1lb2ZkYXkoJnR2LCZ0enApIT0wKSB7CisgICAgcGVycm9yKCJnZXRfdGltZTogIik7CisgICAgZXhpdCgtMSk7CisgIH0KKyAgc3RhcnQgPSAoZG91YmxlKXR2LnR2X3NlYyArICgoZG91YmxlKXR2LnR2X3VzZWMvMTAwMDAwMC4wKTsKKyAgcmVhbD1zdGFydDsKKyAgd2hpbGUoIChyZWFsLXN0YXJ0KTxzbGVlcHRpbWUpeworICAgIGlmKGdldHRpbWVvZmRheSgmdHYsJnR6cCkhPTApIHsKKyAgICAgIHBlcnJvcigiZ2V0X3RpbWU6ICIpOworICAgICAgZXhpdCgtMSk7CisgICAgfQorICAgIHJlYWwgPSAoZG91YmxlKXR2LnR2X3NlYyArICgoZG91YmxlKXR2LnR2X3VzZWMvMTAwMDAwMC4wKTsKKyAgfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9vbXBfdGVzdHN1aXRlLmYgYi9maW5hbC90ZXN0c3VpdGUvb21wX3Rlc3RzdWl0ZS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMzUzMTMKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvb21wX3Rlc3RzdWl0ZS5mCkBAIC0wLDAgKzEsMTQgQEAKKyAgICAgIElOVEVHRVIgTiAhVGhlIG51bWJlciBvZiB0aW1lcyBlYWNoIHRlc3QgaXMgcnVuCisgICAgICBQQVJBTUVURVIgKE49MSkKKyAgICAgIENIQVJBQ1RFUio4IE9NUFRTX1ZFUlNJT04KKyAgICAgIFBBUkFNRVRFUiAoT01QVFNfVkVSU0lPTj0iMy4wLmEiKQorICAgICAgSU5URUdFUiBMT09QQ09VTlQgIVRoZSBudW1iZXIgb2YgdGltZXMgZWFjaCBsb29wIGlzIHJ1bgorICAgICAgUEFSQU1FVEVSIChMT09QQ09VTlQ9MTAwMCkKKyAgICAgIERPVUJMRSBQUkVDSVNJT04gU0xFRVBUSU1FCisgICAgICBQQVJBTUVURVIgKFNMRUVQVElNRSA9IC4wMSkKKyAgICAgIERPVUJMRSBQUkVDSVNJT04gU0xFRVBUSU1FX0xPTkcKKyAgICAgIFBBUkFNRVRFUiAoU0xFRVBUSU1FX0xPTkcgPSAwLjUpCisgICAgICBJTlRFR0VSIE5VTV9UQVNLUworICAgICAgUEFSQU1FVEVSIChOVU1fVEFTS1M9MjUpCisgICAgICBJTlRFR0VSIE1BWF9UQVNLU19QRVJfVEhSRUFECisgICAgICBQQVJBTUVURVIgKE1BWF9UQVNLU19QRVJfVEhSRUFEPTUpCmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvb21wX3Rlc3RzdWl0ZS5oIGIvZmluYWwvdGVzdHN1aXRlL29tcF90ZXN0c3VpdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODA4ZDkyCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL29tcF90ZXN0c3VpdGUuaApAQCAtMCwwICsxLDE2NCBAQAorLyogR2xvYmFsIGhlYWRlcmZpbGUgb2YgdGhlIE9wZW5NUCBUZXN0c3VpdGUgKi8KKworLyogVGhpcyBmaWxlIHdhcyBjcmVhdGVkIHdpdGggdGhlIG9tcHRzX21ha2VIZWFkZXIucGwgc2NyaXB0IHVzaW5nIHRoZSBmb2xsb3dpbmcgb3Bpb25zOiAqLworLyogLWY9b21wdHMtYy5jb25mIC10PWMgICovCisKKworI2lmbmRlZiBPTVBfVEVTVFNVSVRFX0gKKyNkZWZpbmUgT01QX1RFU1RTVUlURV9ICisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9tcC5oPgorCisvKiBWZXJzaW9uIGluZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBPTVBUU19WRVJTSU9OICIzLjBhIgorCisvKiBHZW5lcmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBMT09QQ09VTlQgCTEwMDAKKyNkZWZpbmUgUkVQRVRJVElPTlMgCSAgMjAKKy8qIGZvbGxvd2luZyB0aW1lcyBhcmUgaW4gc2Vjb25kcyAqLworI2RlZmluZSBTTEVFUFRJTUUJIDAuMDEKKyNkZWZpbmUgU0xFRVBUSU1FX0xPTkcJIDAuNQorCisvKiBEZWZpbml0aW9ucyBmb3IgdGFza3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBOVU1fVEFTS1MgICAgICAgICAgICAgIDI1CisjZGVmaW5lIE1BWF9UQVNLU19QRVJfVEhSRUFEICAgIDUKK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9mb3Jfb3JkZXJlZChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgZm9yIG9yZGVyZWQgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX2Zvcl9vcmRlcmVkKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHBhcmFsbGVsIGZvciBvcmRlcmVkICovCitpbnQgdGVzdF9vbXBfdGFza19pbXBfZmlyc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCB0YXNrICovCitpbnQgY3Jvc3N0ZXN0X29tcF90YXNrX2ltcF9maXJzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgdGFzayAqLworaW50IHRlc3Rfb21wX3Rhc2t3YWl0KEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCB0YXNrd2FpdCAqLworaW50IGNyb3NzdGVzdF9vbXBfdGFza3dhaXQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgdGFza3dhaXQgKi8KK2ludCB0ZXN0X29tcF9iYXJyaWVyKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBiYXJyaWVyICovCitpbnQgY3Jvc3N0ZXN0X29tcF9iYXJyaWVyKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIGJhcnJpZXIgKi8KK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9mb3JfaWYoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIGZvciBpZiAqLworaW50IGNyb3NzdGVzdF9vbXBfcGFyYWxsZWxfZm9yX2lmKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHBhcmFsbGVsIGZvciBpZiAqLworaW50IHRlc3Rfb21wX2F0b21pYyhGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgYXRvbWljICovCitpbnQgY3Jvc3N0ZXN0X29tcF9hdG9taWMoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgYXRvbWljICovCitpbnQgdGVzdF9vbXBfZ2V0X251bV90aHJlYWRzKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcF9nZXRfbnVtX3RocmVhZHMgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2dldF9udW1fdGhyZWFkcyhGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcF9nZXRfbnVtX3RocmVhZHMgKi8KK2ludCB0ZXN0X29tcF9zZWN0aW9uX3ByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHNlY3Rpb24gcHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfc2VjdGlvbl9wcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHNlY3Rpb24gcHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX2lmKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBwYXJhbGxlbCBpZiAqLworaW50IGNyb3NzdGVzdF9vbXBfcGFyYWxsZWxfaWYoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgaWYgKi8KK2ludCB0ZXN0X29tcF9sb2NrKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcF9sb2NrICovCitpbnQgY3Jvc3N0ZXN0X29tcF9sb2NrKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wX2xvY2sgKi8KK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9zaGFyZWQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIHNoYXJlZCAqLworaW50IGNyb3NzdGVzdF9vbXBfcGFyYWxsZWxfc2hhcmVkKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHBhcmFsbGVsIHNoYXJlZCAqLworaW50IHRlc3Rfb21wX3Rhc2tfaW1wX3NoYXJlZChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgdGFzayAqLworaW50IGNyb3NzdGVzdF9vbXBfdGFza19pbXBfc2hhcmVkKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHRhc2sgKi8KK2ludCB0ZXN0X29tcF90YXNrX3ByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHRhc2sgcHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfdGFza19wcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHRhc2sgcHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX3NlY3Rpb25fbGFzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHNlY3Rpb24gbGFzdHByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3NlY3Rpb25fbGFzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgc2VjdGlvbiBsYXN0cHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX2ZpcnN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgZmlyc3Rwcml2YXRlICovCitpbnQgY3Jvc3N0ZXN0X29tcF9wYXJhbGxlbF9maXJzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgZmlyc3Rwcml2YXRlICovCitpbnQgdGVzdF9vbXBfZm9yX2F1dG8oRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGZvciBhdXRvICovCitpbnQgY3Jvc3N0ZXN0X29tcF9mb3JfYXV0byhGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBmb3IgYXV0byAqLworaW50IHRlc3Rfb21wX2Zvcl9zY2hlZHVsZV9zdGF0aWMoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGZvciBzY2hlZHVsZShzdGF0aWMpICovCitpbnQgY3Jvc3N0ZXN0X29tcF9mb3Jfc2NoZWR1bGVfc3RhdGljKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIGZvciBzY2hlZHVsZShzdGF0aWMpICovCitpbnQgdGVzdF9vbXBfdGhyZWFkcHJpdmF0ZV9mb3IoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHRocmVhZHByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3RocmVhZHByaXZhdGVfZm9yKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHRocmVhZHByaXZhdGUgKi8KK2ludCB0ZXN0X29tcF90YXNrX3VudGllZChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgdGFzayB1bnRpZWQgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3Rhc2tfdW50aWVkKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHRhc2sgdW50aWVkICovCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfcHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgcHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfcGFyYWxsZWxfcHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBwcml2YXRlICovCitpbnQgdGVzdF9vbXBfc2luZ2xlX25vd2FpdChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgc2luZ2xlIG5vd2FpdCAqLworaW50IGNyb3NzdGVzdF9vbXBfc2luZ2xlX25vd2FpdChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBzaW5nbGUgbm93YWl0ICovCitpbnQgdGVzdF9vbXBfY3JpdGljYWwoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGNyaXRpY2FsICovCitpbnQgY3Jvc3N0ZXN0X29tcF9jcml0aWNhbChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBjcml0aWNhbCAqLworaW50IHRlc3Rfb21wX2dldF93dGljayhGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXBfZ2V0X3d0aWNrICovCitpbnQgY3Jvc3N0ZXN0X29tcF9nZXRfd3RpY2soRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXBfZ2V0X3d0aWNrICovCitpbnQgdGVzdF9vbXBfc2luZ2xlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBzaW5nbGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3NpbmdsZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBzaW5nbGUgKi8KK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9zZWN0aW9uc19yZWR1Y3Rpb24oRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIHNlY3Rpb25zIHJlZHVjdGlvbiAqLworaW50IGNyb3NzdGVzdF9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfcmVkdWN0aW9uKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHBhcmFsbGVsIHNlY3Rpb25zIHJlZHVjdGlvbiAqLworaW50IHRlc3Rfb21wX3Rhc2t5aWVsZChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgdGFza3lpZWxkICovCitpbnQgY3Jvc3N0ZXN0X29tcF90YXNreWllbGQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgdGFza3lpZWxkICovCitpbnQgdGVzdF9oYXNfb3Blbm1wKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIF9PUEVOTVAgKi8KK2ludCBjcm9zc3Rlc3RfaGFzX29wZW5tcChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIF9PUEVOTVAgKi8KK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9mb3JfbGFzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIGZvciBsYXN0cHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfcGFyYWxsZWxfZm9yX2xhc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHBhcmFsbGVsIGZvciBsYXN0cHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX3NlY3Rpb25zX2xhc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBsYXN0cHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfbGFzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgbGFzdHByaXZhdGUgKi8KK2ludCB0ZXN0X29tcF9mb3JfbGFzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGZvciBsYXN0cHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfZm9yX2xhc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIGZvciBsYXN0cHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX3NlY3Rpb25zX2ZpcnN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgZmlyc3Rwcml2YXRlICovCitpbnQgY3Jvc3N0ZXN0X29tcF9wYXJhbGxlbF9zZWN0aW9uc19maXJzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgZmlyc3Rwcml2YXRlICovCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfZm9yX3JlZHVjdGlvbihGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgZm9yIHJlZHVjdGlvbiAqLworaW50IGNyb3NzdGVzdF9vbXBfcGFyYWxsZWxfZm9yX3JlZHVjdGlvbihGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBmb3IgcmVkdWN0aW9uICovCitpbnQgdGVzdF9vbXBfdGVzdF9sb2NrKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcF90ZXN0X2xvY2sgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3Rlc3RfbG9jayhGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcF90ZXN0X2xvY2sgKi8KK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9mb3JfZmlyc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBwYXJhbGxlbCBmb3IgZmlyc3Rwcml2YXRlICovCitpbnQgY3Jvc3N0ZXN0X29tcF9wYXJhbGxlbF9mb3JfZmlyc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHBhcmFsbGVsIGZvciBmaXJzdHByaXZhdGUgKi8KK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9zZWN0aW9uc19wcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlICovCitpbnQgY3Jvc3N0ZXN0X29tcF9wYXJhbGxlbF9zZWN0aW9uc19wcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUgKi8KK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9udW1fdGhyZWFkcyhGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyZWxsZWwgbnVtX3RocmVhZHMgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX251bV90aHJlYWRzKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHBhcmVsbGVsIG51bV90aHJlYWRzICovCitpbnQgdGVzdF9vbXBfZm9yX3JlZHVjdGlvbihGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgZm9yIHJlZHVjdGlvbiAqLworaW50IGNyb3NzdGVzdF9vbXBfZm9yX3JlZHVjdGlvbihGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBmb3IgcmVkdWN0aW9uICovCitpbnQgdGVzdF9vbXBfc2VjdGlvbnNfbm93YWl0KEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBub3dhaXQgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3NlY3Rpb25zX25vd2FpdChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBub3dhaXQgKi8KK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9yZWR1Y3Rpb24oRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIHJlZHVjdGlvbiAqLworaW50IGNyb3NzdGVzdF9vbXBfcGFyYWxsZWxfcmVkdWN0aW9uKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHBhcmFsbGVsIHJlZHVjdGlvbiAqLworaW50IHRlc3Rfb21wX25lc3RlZChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXBfbmVzdGVkICovCitpbnQgY3Jvc3N0ZXN0X29tcF9uZXN0ZWQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXBfbmVzdGVkICovCitpbnQgdGVzdF9vbXBfdGhyZWFkcHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgdGhyZWFkcHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfdGhyZWFkcHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCB0aHJlYWRwcml2YXRlICovCitpbnQgdGVzdF9vbXBfc2VjdGlvbnNfcmVkdWN0aW9uKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBzZWN0aW9ucyByZWR1Y3Rpb24gKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3NlY3Rpb25zX3JlZHVjdGlvbihGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBzZWN0aW9ucyByZWR1Y3Rpb24gKi8KK2ludCB0ZXN0X29tcF9mb3Jfc2NoZWR1bGVfZ3VpZGVkKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBmb3Igc2NoZWR1bGUoZ3VpZGVkKSAqLworaW50IGNyb3NzdGVzdF9vbXBfZm9yX3NjaGVkdWxlX2d1aWRlZChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBmb3Igc2NoZWR1bGUoZ3VpZGVkKSAqLworaW50IHRlc3Rfb21wX3Rhc2tfZmluYWwoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHRhc2sgZmluYWwgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3Rhc2tfZmluYWwoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgdGFzayBmaW5hbCAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX2Zvcl9wcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBwYXJhbGxlbCBmb3IgcHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfcGFyYWxsZWxfZm9yX3ByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgZm9yIHByaXZhdGUgKi8KK2ludCB0ZXN0X29tcF9mbHVzaChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgZmx1c2ggKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2ZsdXNoKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIGZsdXNoICovCitpbnQgdGVzdF9vbXBfZm9yX3ByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGZvciBwcml2YXRlICovCitpbnQgY3Jvc3N0ZXN0X29tcF9mb3JfcHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBmb3IgcHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX2Zvcl9vcmRlcmVkKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBmb3Igb3JkZXJlZCAqLworaW50IGNyb3NzdGVzdF9vbXBfZm9yX29yZGVyZWQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgZm9yIG9yZGVyZWQgKi8KK2ludCB0ZXN0X29tcF9zaW5nbGVfY29weXByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHNpbmdsZSBjb3B5cHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfc2luZ2xlX2NvcHlwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHNpbmdsZSBjb3B5cHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX3Rhc2tfaWYoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHRhc2sgaWYgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3Rhc2tfaWYoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgdGFzayBpZiAqLworaW50IHRlc3Rfb21wX3NlY3Rpb25fZmlyc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBmaXJzdHByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3NlY3Rpb25fZmlyc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIGZpcnN0cHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX2Zvcl9zY2hlZHVsZV9zdGF0aWNfMyhGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgZm9yIHNjaGVkdWxlKHN0YXRpYykgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2Zvcl9zY2hlZHVsZV9zdGF0aWNfMyhGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBmb3Igc2NoZWR1bGUoc3RhdGljKSAqLworaW50IHRlc3Rfb21wX3Rhc2tfZmlyc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCB0YXNrIGZpcnN0cHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfdGFza19maXJzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgdGFzayBmaXJzdHByaXZhdGUgKi8KK2ludCB0ZXN0X29tcF9mb3JfY29sbGFwc2UoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGZvciBjb2xsYXBzZSAqLworaW50IGNyb3NzdGVzdF9vbXBfZm9yX2NvbGxhcHNlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIGZvciBjb2xsYXBzZSAqLworaW50IHRlc3Rfb21wX2luX3BhcmFsbGVsKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcF9pbl9wYXJhbGxlbCAqLworaW50IGNyb3NzdGVzdF9vbXBfaW5fcGFyYWxsZWwoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXBfaW5fcGFyYWxsZWwgKi8KK2ludCB0ZXN0X29tcF9mb3Jfc2NoZWR1bGVfZHluYW1pYyhGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMpICovCitpbnQgY3Jvc3N0ZXN0X29tcF9mb3Jfc2NoZWR1bGVfZHluYW1pYyhGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYykgKi8KK2ludCB0ZXN0X29tcF9mb3JfZmlyc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBmb3IgZmlyc3Rwcml2YXRlICovCitpbnQgY3Jvc3N0ZXN0X29tcF9mb3JfZmlyc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIGZvciBmaXJzdHByaXZhdGUgKi8KK2ludCB0ZXN0X29tcF9tYXN0ZXIoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIG1hc3RlciAqLworaW50IGNyb3NzdGVzdF9vbXBfbWFzdGVyKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIG1hc3RlciAqLworaW50IHRlc3Rfb21wX3NpbmdsZV9wcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBzaW5nZWwgcHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfc2luZ2xlX3ByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgc2luZ2VsIHByaXZhdGUgKi8KK2ludCB0ZXN0X29tcF90YXNrKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCB0YXNrICovCitpbnQgY3Jvc3N0ZXN0X29tcF90YXNrKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHRhc2sgKi8KK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9kZWZhdWx0KEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBwYXJhbGxlbCBkZWZhdWx0ICovCitpbnQgY3Jvc3N0ZXN0X29tcF9wYXJhbGxlbF9kZWZhdWx0KEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHBhcmFsbGVsIGRlZmF1bHQgKi8KK2ludCB0ZXN0X29tcF9mb3Jfbm93YWl0KEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBwYXJhbGxlbCBmb3Igbm93YWl0ICovCitpbnQgY3Jvc3N0ZXN0X29tcF9mb3Jfbm93YWl0KEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHBhcmFsbGVsIGZvciBub3dhaXQgKi8KK2ludCB0ZXN0X29tcF90ZXN0X25lc3RfbG9jayhGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXBfdGVzdF9uZXN0X2xvY2sgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3Rlc3RfbmVzdF9sb2NrKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wX3Rlc3RfbmVzdF9sb2NrICovCitpbnQgdGVzdF9vbXBfbmVzdF9sb2NrKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcF9uZXN0X2xvY2sgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX25lc3RfbG9jayhGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcF9uZXN0X2xvY2sgKi8KK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9jb3B5aW4oRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIGNvcHlpbiAqLworaW50IGNyb3NzdGVzdF9vbXBfcGFyYWxsZWxfY29weWluKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHBhcmFsbGVsIGNvcHlpbiAqLworaW50IHRlc3Rfb21wX21hc3Rlcl8zKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBtYXN0ZXIgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX21hc3Rlcl8zKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIG1hc3RlciAqLworaW50IHRlc3Rfb21wX2dldF93dGltZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXBfZ2V0X3d0aW1lICovCitpbnQgY3Jvc3N0ZXN0X29tcF9nZXRfd3RpbWUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXBfZ2V0X3d0aW1lICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL29tcHRzLWMuY29uZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9vbXB0cy1jLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEwYjk1MAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9vbXB0cy1jLmNvbmYKQEAgLTAsMCArMSwxOSBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b21wLmg+CisKKy8qIFZlcnNpb24gaW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIE9NUFRTX1ZFUlNJT04gIjMuMGEiCisKKy8qIEdlbmVyYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIExPT1BDT1VOVCAJMTAwMAorI2RlZmluZSBSRVBFVElUSU9OUyAJICAyMAorLyogZm9sbG93aW5nIHRpbWVzIGFyZSBpbiBzZWNvbmRzICovCisjZGVmaW5lIFNMRUVQVElNRQkgMC4wMQorI2RlZmluZSBTTEVFUFRJTUVfTE9ORwkgMC41CisKKy8qIERlZmluaXRpb25zIGZvciB0YXNrcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIE5VTV9UQVNLUyAgICAgICAgICAgICAgMjUKKyNkZWZpbmUgTUFYX1RBU0tTX1BFUl9USFJFQUQgICAgNQpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL29tcHRzLWYuY29uZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9vbXB0cy1mLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI1YWYzMAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9vbXB0cy1mLmNvbmYKQEAgLTAsMCArMSBAQAorIUVtcHR5IGNvbmZpZyBmaWxlCmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvb21wdHMuY29uZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9vbXB0cy5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjMzMTM1YjUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvb21wdHMuY29uZgpAQCAtMCwwICsxLDI2IEBACis8Y29uZmlnPgorPGdsb2JhbGNvbmZpZz4KKzxsb2dmaWxlPm9tcHRzLmxvZzwvbG9nZmlsZT4KKzxzaW5nbGV0ZXN0dGltZW91dD4xMjA8L3NpbmdsZXRlc3R0aW1lb3V0PgorPGRpc3BsYXllcnJvcnM+MTwvZGlzcGxheWVycm9ycz4KKzxkaXNwbGF5d2FybmluZ3M+MDwvZGlzcGxheXdhcm5pbmdzPgorPGVudnNldHRocmVhZHNjb21tYW5kPk9NUF9OVU1fVEhSRUFEUz0lbjsgZXhwb3J0IE9NUF9OVU1fVEhSRUFEUzs8L2VudnNldHRocmVhZHNjb21tYW5kPgorPHJlc3VsdHNmaWxlPnJlc3VsdHMudHh0PC9yZXN1bHRzZmlsZT4KKzxudW10aHJlYWRzPjg8L251bXRocmVhZHM+Cis8L2dsb2JhbGNvbmZpZz4KKworPGxhbmd1YWdlcz4KKzxsYW5ndWFnZT4KKzxsYW5ndWFnZW5hbWU+YzwvbGFuZ3VhZ2VuYW1lPgorPGRpcj5jPC9kaXI+Cis8ZmlsZWV4dGVuc2lvbj5jPC9maWxlZXh0ZW5zaW9uPgorPHRlbXBsYXRlcGFyc2VybmFtZT50ZW1wbGF0ZV9wYXJzZXJfYy5wbDwvdGVtcGxhdGVwYXJzZXJuYW1lPgorPC9sYW5ndWFnZT4KKzxsYW5ndWFnZT4KKzxsYW5ndWFnZW5hbWU+Zm9ydHJhbjwvbGFuZ3VhZ2VuYW1lPgorPGRpcj5mb3J0cmFuPC9kaXI+Cis8ZmlsZWV4dGVuc2lvbj5mPC9maWxlZXh0ZW5zaW9uPgorPHRlbXBsYXRlcGFyc2VybmFtZT50ZW1wbGF0ZV9wYXJzZXJfZm9ydHJhbi5wbDwvdGVtcGxhdGVwYXJzZXJuYW1lPgorPC9sYW5ndWFnZT4KKzwvbGFuZ3VhZ2VzPgorPC9jb25maWc+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvb21wdHNfbWFrZUhlYWRlci5wbCBiL2ZpbmFsL3Rlc3RzdWl0ZS9vbXB0c19tYWtlSGVhZGVyLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjcyMTJjZWMKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvb21wdHNfbWFrZUhlYWRlci5wbApAQCAtMCwwICsxLDEwMSBAQAorIyEvdXNyL2Jpbi9wZXJsIC13CisKKyMgb21wdHNfbWFrZUhlYWRlciBbb3B0aW9uc10gLWY9TkFNRSAtdD1ESVIKKyMKKyMgQ3JlYXRzIHRoZSBoZWFkZXJmaWxlIGZvciB0aGUgT3Blbk1QLVRlc3RzdWl0ZSBvdXQgb2YgdGhlIHRlbXBsYXRlZmlsZXMgCisjIHdpdGNoIGFyZSBpbiB0aGUgZGVmYXVsdC9leHBsaWNpdGVseSBzcGVjaWZpZWQgZGlyIGFuZCB0aGUgc2V0dGluZ3MgaW4gdGhlCisjIGdpdmVuIGNvbmZpZyBmaWxlLiAKKyMgCisjIEFUVEVOVElPTjoKKyMJQXQgdGhlIG1vbWVudCBpdCBidWlsdHMgb25seSBhIGMtaGVhZGVyZmlsZSEKKyMKKyMgLWY9RklMRU5BTUU6IFVzaW5nIGZpbGUgRklMRU5BTUUgYXMgY29uZmlnZmlsZQorIyAtdD1ESVI6CURpcmVjdG9yeSBob2xkaW5nIHRoZSB0ZW1wbGF0ZSBmaWxlcworIyAKKyMgb3B0aW9ucworIyAtaT1GSUxFTkFNRTogSW5jbHVkZSBvdGhlciBIZWFkZXJmaWxlLiBUaGUgZmlsZXMgdG8gYmUgaW5jbHVkZWQgbXVzdCBiZSBzcGVjaWZpZWQKKyMgCWFmdGVyIHNldHRpbmcgdGhpcyBvcHRpb24uIChOb3QgaW1wbGVtZW50ZWQgeWV0LikKKyMgLW89RklMRU5BTUU6IG91dHB1dGZpbGVuYW1lIChkZWZhdWx0IGlzICJvbXBfdGVzdHN1aXRlLmgiKQorCiskaGVhZGVyZmlsZSA9ICJcL1wqIEdsb2JhbCBoZWFkZXJmaWxlIG9mIHRoZSBPcGVuTVAgVGVzdHN1aXRlIFwqXC9cblxuXC9cKiBUaGlzIGZpbGUgd2FzIGNyZWF0ZWQgd2l0aCB0aGUgb21wdHNfbWFrZUhlYWRlci5wbCBzY3JpcHQgdXNpbmcgdGhlIGZvbGxvd2luZyBvcGlvbnM6XCAqXC9cblwvXCogIjsKK2lmKEBBUkdWID4gMCkKK3sKKwlmb3JlYWNoICRvcHQgKEBBUkdWKQorCXsKKwkJJGhlYWRlcmZpbGUgLj0gIiRvcHQgIjsKKwl9Cit9CitlbHNlCit7CisJJGhlYWRlcmZpbGUgLj0gIk5vIG9wdGlvbnMgd2VyZSBzcGVjaWZpZWQiOworfQorJGhlYWRlcmZpbGUgLj0iIFwqXC9cblxuXG4iOworCit1c2UgR2V0b3B0OjpMb25nOworR2V0T3B0aW9ucygiLW89cyIgPT4gXCRvdXRmaWxlLCAiLWY9cyIgPT5cJGNvbmZpZ2ZpbGUsICItdD1zIiA9PiBcJHRlbXBsYXRlZGlyLCAiLWk9cyIgPT4gXCRpbmNsdWRlKTsKKworJGluY2x1ZGUgPSAiIjsKKworCisjIEdldHRpbmcgYW5kIHZlcmlmeWluZyB0aGUgbmVjZXNzYXJ5IG9wdGlvbnM6CitpZighJGNvbmZpZ2ZpbGUpIHsJCisJZGllICJDb25maWcgZmlsZSBuYW1lIGlzIG1pc3NpbmcuIjsKK30JCitlbHNlIHsKKyAgICBpZiAoISgtZSAkY29uZmlnZmlsZSkpIHsKKwkgIGRpZSAiQ291bGQgbm90IGZpbmQgY29uZmlnIGZpbGUgJGNvbmZpZ2ZpbGUuIjsKKwl9Cit9CisJCitpZighJHRlbXBsYXRlZGlyKSB7CQorCWRpZSAiRGlyZWN0b3J5bmFtZSBpcyBtaXNzaW5nLiI7Cit9CQorCitpZighJG91dGZpbGUpeworCSRvdXRmaWxlID0gIm9tcF90ZXN0c3VpdGUuaCI7CSMgc2V0dGluZyBkZWZhdWx0IHZhbHVlIGZvciB0aGUgaGVhZGVyZmlsZQorfQorCisKKworI0BpbmNsdWRlZmlsZXM7CQkJCQkjIGxpc3QgaG9saW5nIGV4dHJhIGluY2x1ZGVmaWxlcyBzcGVjaWZpZWQgYnkgdGhlIHVzZXIgCisKKworIyBnZW5lcmF0aW5nIHRoZSBoZWFkIG9mIHRoZSBpbmNsdWRlZ3VhcmQ6CiskaGVhZGVyZmlsZSAuPSAiXCNpZm5kZWYgT01QX1RFU1RTVUlURV9IXG5cI2RlZmluZSBPTVBfVEVTVFNVSVRFX0hcblxuIjsKKworIyBpbnNlcnRpbmcgZ2VuZXJhbCBzZXR0aW5ncyBvdXQgb2YgdGhlIGNvbmZpZ2ZpbGU6CitvcGVuKE9NUFRTX0NPTkYsJGNvbmZpZ2ZpbGUpIG9yIGRpZSAiQ291bGQgbm90IG9wZW4gdGhlIGdsb2JhbCBjb25maWcgZmlsZSAkY29uZmlnZmlsZS4iOword2hpbGUoPE9NUFRTX0NPTkY+KXsKKwkkaGVhZGVyZmlsZSAuPSAkXzsKK30KK2Nsb3NlKE9NUFRTX0NPTkYpOworCisjIHNlYXJjaGluZyB0aGUgdGVzdHM6CitvcGVuZGlyIFRFTVBMQVRFRElSLCAkdGVtcGxhdGVkaXIgb3IgZGllICJDb3VsZCBub3Qgb3BlbiBkaXIgJHRlbXBsYXRlZGlyLiI7CitAdGVtcGxhdGVzID0gZ3JlcCAvKC4qKVwuYy8sIHJlYWRkaXIgVEVNUExBVEVESVI7CitjbG9zZWRpciBURU1QTEFURURJUjsKKworIyBpbnNlcnRpbmcgdGhlIGZ1bmN0aW9uIGRlY2xhcmF0aW9uczoKK2ZvcmVhY2ggJHRlbXBsYXRlIChAdGVtcGxhdGVzKXsKKwkkc291cmNlID0gIiI7CisJb3BlbihURU1QTEFURSwkdGVtcGxhdGVkaXIuIi8iLiR0ZW1wbGF0ZSkgb3IgZGllICJDb3VsZCBub3Qgb3BlbiB0aGUgZm9sbG93aW5nIHNvdXJjZWZpbGU6ICIuJHRlbXBsYXRlZGlyLiIvIi4kdGVtcGxhdGU7CisJd2hpbGUoPFRFTVBMQVRFPil7CisJCSRzb3VyY2UgLj0gJF87CisJfQorCWNsb3NlKFRFTVBMQVRFKTsKKwkkc291cmNlID1+IC9cPG9tcHRzXDp0ZXN0Y29kZVw6ZnVuY3Rpb25uYW1lXD4oLiopXDxcL29tcHRzXDp0ZXN0Y29kZVw6ZnVuY3Rpb25uYW1lXD4vOworCSRmdW5jdGlvbm5hbWUgPSAkMS4iKEZJTEUgXCogbG9nZmlsZSk7IjsKKwkkc291cmNlID1+IC9cPG9tcHRzXDpkaXJlY3RpdmVcPiguKilcPFwvb21wdHNcOmRpcmVjdGl2ZVw+LzsKKwkkZGlyZWN0aXZlID0gJDE7CisJJGhlYWRlcmZpbGUgLj0gImludCB0ZXN0XyIuJGZ1bmN0aW9ubmFtZS4iICAvKiBUZXN0IGZvciAiLiRkaXJlY3RpdmUuIiAqL1xuIjsKKwkkaGVhZGVyZmlsZSAuPSAiaW50IGNyb3NzdGVzdF8iLiRmdW5jdGlvbm5hbWUuIiAgLyogQ3Jvc3N0ZXN0IGZvciAiLiRkaXJlY3RpdmUuIiAqL1xuIjsKK30KKworIyBpbnNlcnRpbmcgdGhlIGVuZCBvZiB0aGUgaW5jbHVkZWd1YXJkOgorJGhlYWRlcmZpbGUgLj0gIlxuI2VuZGlmIjsKKworIyBjcmFldGluZyB0aGUgaGVhZGVyZmlsZToKK29wZW4oT1VURklMRSwiPiIuJG91dGZpbGUpIG9yIGRpZSAiQ291bGQgbm90IGNyZWF0ZSB0aGUgaGFlZGFlcmZpbGUgKCRvdXRmaWxlKSI7CitwcmludCBPVVRGSUxFICRoZWFkZXJmaWxlLiJcbiI7CitjbG9zZShPVVRGSUxFKTsKKwpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL29tcHRzX3BhcnNlci5wbCBiL2ZpbmFsL3Rlc3RzdWl0ZS9vbXB0c19wYXJzZXIucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOThkNzI3MQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9vbXB0c19wYXJzZXIucGwKQEAgLTAsMCArMSwxNjcgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKworIyBvbXB0c19wYXJzZXIgW29wdGlvbl0gU09VUkNFRklMRQorIyAKKyMgQ3JlYXRzIHRoZSB0ZXN0cyBhbmQgdGhlIGNyb3NzdGVzdHMgZm9yIHRoZSBPcGVuTVAtVGVzdHN1aXRlIG91dCBvZiBhbiB0ZW1wbGF0ZWZpbGVzIHdoaWNoIGFyZSBnaXZlbiB0byB0aGUgcHJvZ3JhbW0uCisjIAorIyBPcHRpb25zOgorIyAtdGVzdDogCW1ha2UgdGVzdAorIyAtY3Jvc3N0ZXN0OiAJbWFrZSBjcm9zc3Rlc3QKKyMgLW9ycGhhbglpZiBwb3NzaWJsZSBnZW5lcmF0ZSB0ZXN0cyB1c2luZyBvcnBoYW4gcmVnaW9ucyAobm90IGltcGxlbWVudGVkIHlldCkKKyMgLWxhbmc9TEFORwlwcmVwcm9jZXNzaW5nIGZvciBsYW5ndWFnZSBMQU5HLCB3aGVyZSBMQU5HIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxhbmd1YWdlczoKKyMJCWMsIGZvcnRyYW4KKyMgLW89RklMRU5BTUUJb3V0cHV0ZmlsZSAob25seSB3aGVuIG9uZSB0ZW1wbGF0ZWZpbGUgaXMgc3BlY2lmaWVkKQorCisKKyMgVXNpbmcgR2V0b3B0Ojpsb25nIHRvIGV4dHJhY3QgdGhlIHByb2dyYW1tIG9wdGlvbnMKK3VzZSBHZXRvcHQ6Okxvbmc7CisjIFVzaW5nIGZ1bmN0aW9uczogU2V0IG9mIHN1YnJvdXRpbmVzIHRvIG1vZGlmeSB0aGUgdGVzdGNvZGUKK3VzZSBvbXB0c19wYXJzZXJGdW5jdGlvbnM7CisKKyMgR2V0dGluZyBnaXZlbiBvcHRpb25zCitHZXRPcHRpb25zKCItdGVzdCIgPT4gXCR0ZXN0LCItY3Jvc3N0ZXN0IiA9PiBcJGNyb3NzdGVzdCwgIi1vPXMiID0+IFwkb3V0cHV0ZmlsZSwgIi1vcnBoYW4iID0+IFwkb3JwaGFuLCAiLWYhIiwgIi1sYW5nPXMiID0+IFwkbGFuZ3VhZ2UpOworCisjIFJlbWFpbmluZyBhcmd1bWVudHMgYXJlIHRoZSB0ZW1wbGF0ZWZpbGVzLiAKKyMgQWRkaW5nIHRoZXNlIHRvIHRoZSBsaXN0IG9mIHRvIGJlIHBhcnNlZCBmaWxlcyBpZiB0aGV5IGV4aXN0LgorZm9yZWFjaCAkZmlsZShAQVJHVikKK3sKKwlpZigtZSAkZmlsZSl7IHB1c2goQHNvdXJjZWZpbGVzLCRmaWxlKTsgfQorCWVsc2UgeyBwcmludCAiRXJyb3I6IFVua25vd24gT3B0aW9uICRmaWxlXG4iOyB9Cit9CisJCisjIENoZWNraW5nIGlmIG9wdGlvbnMgd2VyZSB2YWxpZDoKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIHByZXBhcmF0aW9ucyBhbmQgY2hlY2tzIGZvciBzb3VyY2VmaWxlcworaWYoQHNvdXJjZWZpbGVzID09IDApe2RpZSAiTm8gZmlsZXMgdG8gcGFyc2UgYXJlIHNwZWNpZmllZCEiO30KK2lmKCRvdXRwdXRmaWxlICYmIChAc291cmNlZmlsZXMgIT0gMSB8fCAoJHRlc3QgJiYgJGNyb3NzdGVzdCkgKSApe2RpZSAiVGhlcmUgd2VyZSBtdWx0aXBsZSBmaWxlcyBmb3Igb25lIG91dHB1dGZpbGVzIHNwZWNpZmllZCEiO30gCisjIHByZXBhcmF0aW9ucyBmb3ByIG9ycGhhbiB0ZXN0cworaWYoJG9ycGhhbil7ICRvcnBoYW5wcmVmaXggPSAib3JwaGFuZWQiOyB9CitlbHNlIHsgJG9ycGhhbnByZWZpeCA9ICIiOyB9CisjIHByZXBhcmF0aW9ucyBmb3IgdGVzdCAvIGNyb3NzdGVzdAoraWYoJHRlc3Qpe3B1c2goQHRlc3R0eXBlcywidGVzdCIpOyAKKyMgJWNoZWNrc1sndGVzdCddPSJjaGVjayI7Cit9CitpZigkY3Jvc3N0ZXN0KXtwdXNoKEB0ZXN0dHlwZXMsImN0ZXN0Iik7CisjICVjaGVja3NbJ2Nyb3NzdGVzdCddPSJjcm9zc2NoZWNrIjsKK30KKyMgcHJlcGFyYXRpb25zIGFuZCBjaGVja3MgZm9yIGxhbmd1YWdlCitpZigkbGFuZ3VhZ2UgZXEiYyIpIHsgJGV4dGVuc2lvbiA9ICJjIjt9CitlbHNpZigkbGFuZ3VhZ2UgZXEgImZvcnRyYW4iIG9yICRsYW5ndWFnZSBlcSAiZiIpIHsgJGxhbmd1YWdlID0gImYiOyAkZXh0ZW5zaW9uID0gImYiO30KK2Vsc2UgeyBkaWUgIllvdSBtdXN0IHNwZWNpZnkgYSB2YWxpZCBsYW5ndWFnZSEiOyB9CisgICAgCisKKyMgUmVhZGluZyB0aGUgdGVtcGxhdGVzIGZvciB0aGUgdGVzdHMgaW50byBAc291cmNlcworZm9yZWFjaCAkc3JjZmlsZSAoQHNvdXJjZWZpbGVzKQoreworCSMgUmVhZGluZyB0aGUgY29udGVudCBvZiB0aGUgY3VycmVudCBzb3VyY2VmaWxlCWludG8gJHNyYworCW9wZW4oVEVTVCwkc3JjZmlsZSkgb3IgcHJpbnQgIkVycm9yOiBDb3VsZCBub3Qgb3BlbiB0ZW1wbGF0ZSAkc3JjZmlsZVxuIjsKKwl3aGlsZSg8VEVTVD4peyAkc3JjIC49ICRfOyB9CisJY2xvc2UoVEVTVCk7CisJIyBBZGRpbmcgdGhlIGNvbnRlbnQgJHNyYyB0byB0aGUgZW5kIG9mIHRoZSBsaXN0IEBzb3VyY2VzCisJcHVzaChAc291cmNlcywkc3JjKTsKK30KKworIyBFeHRyYWN0aW5nIHRoZSBzb3VyY2UgZm9yIHRoZSBtYWlucHJvZ3JhbW0gYW5kIHNhdmluZyBpdCBpbiAkbWFpbnByb2NzcmMKK2lmKCRsYW5ndWFnZSBlcSAiYyIpIHsgJG1haW5wcm9jc3JjID0gIm9tcHRzX3N0YW5kYWxvbmVQcm9jLmMiOyB9CitlbHNpZigkbGFuZ3VhZ2UgZXEgImYiKSB7ICRtYWlucHJvY3NyYyA9ICJvbXB0c19zdGFuZGFsb25lUHJvYy5mIjsgfSAKK29wZW4oTUFJTlBST0MsJG1haW5wcm9jc3JjKSBvciBkaWUgIkNvdWxkIG5vdCBvcGVuIHRoZSBzb3VyY2VmaWxlIGZvciB0aGUgbWFpbiBwcm9ncmFtICRtYWlucHJvY3NyYyI7Cit3aGlsZSg8TUFJTlBST0M+KXsKKwkkbWFpbnByb2MgLj0gJF87Cit9CisKK2ZvcmVhY2ggJHRlc3R0eXBlIChAdGVzdHR5cGVzKQoreworICBmb3JlYWNoICRzcmMoQHNvdXJjZXMpCisgIHsKKyMgU29tZSB0ZW1wb3JhcnkgdGVzdGluZm9ybWF0aW9uOgorICAgICgkZGVzY3JpcHRpb24pID0gZ2V0X3RhZ192YWx1ZXMoJ29tcHRzOnRlc3RkZXNjcmlwdGlvbicsJHNyYyk7CisgICAgKCRkaXJlY3RpdmUpID0gZ2V0X3RhZ192YWx1ZXMoJ29tcHRzOmRpcmVjdGl2ZScsJHNyYyk7CisgICAgKCRmdW5jdGlvbm5hbWUpID0gZ2V0X3RhZ192YWx1ZXMoJ29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZScsJHNyYyk7CisKKyAgICBvcGVuKE9VVEZJTEUsIj4iLiRsYW5ndWFnZS4kb3JwaGFucHJlZml4LiR0ZXN0dHlwZS4iXyIuJGZ1bmN0aW9ubmFtZS4iLiIuJGV4dGVuc2lvbikgb3IgZGllKCJDb3VsZCBub3QgY3JlYXRlIHRoZSBvdXRwdXQgZmlsZSBmb3IgJGRpcmVjdGl2ZSIpOworCisjIENyZWF0aW5nIHRoZSBzb3VyY2UgZm9yIHRoZSB0ZXN0OgorICAgICgkY29kZSkgPSBnZXRfdGFnX3ZhbHVlcygnb21wdHM6dGVzdGNvZGUnLCRzcmMpOworIyBQdXR0aW5nIHRvZ2V0aGVyIHRoZSBmdW5jdGlvbnMgYW5kIHRoZSBtYWlucHJvZ3JhbW06CisgICAgJGNvZGUgLj0gJG1haW5wcm9jOworICAgIAorIyBnZXQgdGhlIHBhcmFtZXRlcnMgPG9tcHRzOm9ycGhhbjpwYXJhbXM+IGJ5IGpvb24KKyMgdGhhbmtzIHRvIERyLiBZaW4gTWEgaW4gQWJzb2Z0CisgICAgKCRwYXJtcykgPSBnZXRfdGFnX3ZhbHVlcygnb21wdHM6b3JwaGFuOnBhcm1zJywkY29kZSk7CisgICAgKCRwYXJtcykgPSBsZWF2ZV9zaW5nbGVfc3BhY2UoJHBhcm1zKTsKKyMgdG8gcmVtb3ZlIHBhcmFtZXRlcnMgdGFnIGJldHdlZW4gJ29tcHRzOm9ycGhhbjpwYXJtcycgYnkgam9vbgorICAgICgkY29kZSkgPSByZXBsYWNlX3RhZ3MoJ29tcHRzOm9ycGhhbjpwYXJtcycsJycsJGNvZGUpOworICAgIAorIyBNYWtlIG1vZGlmaWNhdGlvbnMgZm9yIHRoZSBvcnBoYW5lZCB0ZXN0dmVyc2lvbiBpZiBuZWNlc3Nhcnk6CisgICAgaWYoJG9ycGhhbikKKyAgICB7CisjIEdldCB0aGUgZ2xvYmFsIHZhcmlhYmxlczoKKyAgICAgIEBkZWZzID0gZ2V0X3RhZ192YWx1ZXMoIm9tcHRzOm9ycGhhbjp2YXJzIiwkY29kZSk7CisgICAgICAkb3JwaHZhcnNkZWYgPSAiIjsKKyAgICAgIGZvcmVhY2ggJF8gKEBkZWZzKQorICAgICAgeworCSNwcmludCAkXzsKKwlpZihub3QgL15bIF0qJC9ncykgeyAkb3JwaHZhcnNkZWYgPSBqb2luKCJcbiIsJG9ycGh2YXJzZGVmLCRfKTsgfSAKKwkjcHJpbnQgIk9LXG4iLiRvcnBodmFyc2RlZjsgCisgICAgICB9CisgICAgICBpZigkbGFuZ3VhZ2UgZXEgImYiKQorICAgICAgeworIyBHZW5lcmF0ZSB0aGUgb3JwaGFuIHN1YnJvdXRpbmVzOgorCSRvcnBoZnVuY3MgPSBjcmVhdGVfb3JwaF9mb3J0cmFuZnVuY3Rpb25zKCIkdGVzdHR5cGVfIiwgJGNvZGUpOworIyBSZXBsYWNlIG9ycGhhbiByZWdpb25zIGJ5IGZ1bmN0aW9uY2FsbHM6CisJKCRjb2RlKSA9IG9ycGhhbl9yZWdpb25zMmZvcnRyYW5mdW5jdGlvbnMoICIkdGVzdHR5cGVfIiwgKCRjb2RlKSApOworCSgkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOm9ycGhhbjp2YXJzJywnJywnJywoJGNvZGUpKTsKKyAgICAoJGNvZGUpID0gZW5sYXJnZV90YWdzKCdvbXB0czpvcnBoYW46cGFybXMnLCcnLCcnLCgkY29kZSkpOworICAgICN0byBmaW5kIG9ycGhhbiBjYWxsIHN0YXRlbWV0biBhbmQgYWRkIHBhcmFtZXRlcnMKKyAgICAKKyMgUHV0IGFsbCB0b2dldGhlcjoKKwkkY29kZSA9ICRjb2RlIC4gJG9ycGhmdW5jczsKKyAgICAgIH0KKyAgICAgIGVsc2lmKCRsYW5ndWFnZSBlcSAiYyIpCisgICAgICB7CisjIEdlbmVyYXRlIHByZWRlY2xhcmF0aW9ucyBmb3Igb3JwYWhuIGZ1bmN0aW9uczoKKwkkb3JwaGZ1bmNzZGVmcyA9IG9ycGhfZnVuY3Rpb25zX2RlY2xhcmF0aW9ucygiJHRlc3R0eXBlXyIsJGNvZGUpOworIyBHZW5lcmF0ZSB0aGUgb3JwaGFuIGZ1bmN0aW9uczoKKwkkb3JwaGZ1bmNzID0gY3JlYXRlX29ycGhfY2Z1bmN0aW9ucygiJHRlc3R0eXBlXyIsJGNvZGUpOworIyBSZXBsYTplIG9ycGhhbiByZWdpb25zIGJ5IGZ1bmN0aW9uY2FsbHM6CisJKCRjb2RlKSA9IG9ycGhhbl9yZWdpb25zMmNmdW5jdGlvbnMoICIkdGVzdHR5cGVfIiwgKCRjb2RlKSApOworIyBEZWxldGluZyB0aGUgZm9ybWVyIGRlY2xhcmF0aW9ucyBvZiB0aGUgdmFyaWFibGVzIGluIHRoZSBvcnBoYW4gcmVnaW9uczoKKwkoJGNvZGUpID0gZGVsZXRlX3RhZ3MoJ29tcHRzOm9ycGhhbjp2YXJzJywoJGNvZGUpKTsKKyMgUHV0IGFsbCB0b2dldGhlcjoKKwkkY29kZSA9ICIjaW5jbHVkZSBcIm9tcF90ZXN0c3VpdGUuaFwiXG4iLiRvcnBodmFyc2RlZiAuICRvcnBoZnVuY3NkZWZzIC4gJGNvZGUgLiAkb3JwaGZ1bmNzOworICAgICAgfQorICAgICAgZWxzZSB7CisJcHJpbnQgIkFuIGVycm9yIG9jY3VycmVkISI7CisgICAgICB9CisgICAgfQorIyByZW1vdmUgcGFyYW1ldGVycyBiZXR3ZWVuIDxvbXB0czpvcnBoYW46cGFybXM+IHRhZ3MsIGFkZGVkIGJ5IGpvb24KKyAgICAoJGNvZGUpPSByZXBsYWNlX3RhZ3MoJ29tcHRzOm9ycGhhbjpwYXJtcycsJGNvZGUpOworICAgIAorIyBSZW1vdmUgdGhlIG1hcmtzIGZvciB0aGUgb3JwYWhuIHJlZ2lvbnMgYW5kIGl0cyB2YXJpYWJsZXM6CisgICAgKCRjb2RlKSA9IGVubGFyZ2VfdGFncygnb21wdHM6b3JwaGFuJywnJywnJywoJGNvZGUpKTsKKyAgICAoJGNvZGUpID0gZW5sYXJnZV90YWdzKCdvbXB0czpvcnBoYW46dmFycycsJycsJycsKCRjb2RlKSk7CisKKyMgcmVtb3ZlIHBhcmFtZXRlcnMgYmV0d2VlbiBmb3Igb3JwaGFuZWQgZGlyZWN0aXZlIHBhcmFtZXRlcywgYWRkZWQgYnkgam9vbgorICAgICgkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOm9ycGhhbjpwYXJtcycsJycsJycsKCRjb2RlKSk7CisgICAgCisgICAgaWYoJHRlc3R0eXBlIGVxICJ0ZXN0IikgeworIyBSZW1vdmUgdGhlIG1hcmtzIGZvciB0aGUgdGVzdGNvZGUgYW5kIHJlbW92ZSB0aGUgY29kZSBmb3IgdGhlIGNyb3NzdGVzdHM6IAorICAgICAgKCRjb2RlKSA9IGVubGFyZ2VfdGFncygnb21wdHM6Y2hlY2snLCcnLCcnLCgkY29kZSkpOworICAgICAgKCRjb2RlKSA9IGRlbGV0ZV90YWdzKCdvbXB0czpjcm9zc2NoZWNrJywoJGNvZGUpKTsJCQorICAgIH0KKyAgICBlbHNpZigkdGVzdHR5cGUgZXEgImN0ZXN0IikgeworIyBSZW1vdmUgdGhlIG1hcmtzIGZvciB0aGUgY3Jvc3N0ZXN0Y29kZSBhbmQgcmVtb3ZlIHRoZSBjb2RlIGZvciB0aGUgdGVzdHM6IAorICAgICAgKCRjb2RlKSA9IGVubGFyZ2VfdGFncygnb21wdHM6Y3Jvc3NjaGVjaycsJycsJycsKCRjb2RlKSk7CisgICAgICAoJGNvZGUpID0gZGVsZXRlX3RhZ3MoJ29tcHRzOmNoZWNrJywoJGNvZGUpKTsJCQorICAgIH0KKyMgTWFraW5nIHNvbWUgZmluYWwgbW9kaWZpY2F0aW9uczoKKyAgICAoJGNvZGUpID0gcmVwbGFjZV90YWdzKCd0ZXN0ZnVuY3Rpb25uYW1lJywkdGVzdHR5cGUuIl8iLiRmdW5jdGlvbm5hbWUsKCRjb2RlKSk7CisgICAgKCRjb2RlKSA9IHJlcGxhY2VfdGFncygnZGlyZWN0aXZlJywkZGlyZWN0aXZlLCgkY29kZSkpOworICAgICgkY29kZSkgPSByZXBsYWNlX3RhZ3MoJ2Rlc2NyaXB0aW9uJywkZGVzY3JpcHRpb24sKCRjb2RlKSk7CisgICAgKCRjb2RlKSA9IGVubGFyZ2VfdGFncygnb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lJywkdGVzdHR5cGUuIl8iLCcnLCgkY29kZSkgKTsKKyMJJGNvZGUgPSAgIlwjaW5jbHVkZSBcIm9tcF90ZXN0c3VpdGUuaFwiXG4iLiRjb2RlOworIyBXcml0ZSB0aGUgcmVzdWx0IGludG8gdGhlIGZpbGUgYW5kIGNsb3NlIGl0OgorICAgIHByaW50IE9VVEZJTEUgJGNvZGU7CisgICAgY2xvc2UoT1VURklMRSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9vbXB0c19wYXJzZXJGdW5jdGlvbnMucG0gYi9maW5hbC90ZXN0c3VpdGUvb21wdHNfcGFyc2VyRnVuY3Rpb25zLnBtCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM4Y2VkYjAKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvb21wdHNfcGFyc2VyRnVuY3Rpb25zLnBtCkBAIC0wLDAgKzEsMjgwIEBACisjIS91c3IvYmluL3BlcmwgLXcKKworIyBmdW5jdGlvbnMucG0KKyMgVGhpcyBwYWNrYWdlIGNvbnRhaW5zIGEgc2V0IG9mIHN1YnJvdXRpbmVzIHRvIG1vZGlmeSB0aGUgdGVtcGxhdGVzIGZvciB0aGUgb3Blbk1QIFRlc3R1aXRlLgorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIHN1YnJvdXRpbmVzIHRvIGV4dHJhY3QsIG1vZGlmeSBvciBkZWxldGUgdGFncyBmcm9tIHRoZSB0ZW1wbGF0ZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBMSVNUIGdldF90YWdfdmFsdWVzKCAkdGFnbmFtZSwgJHN0cmluZyApCisjIHN1YnJ1dGluZSB0byBnZXQgdGhlIHRleHQgZW5jbG9kZWQgYnkgYSB0YWcuCisjIFJldHVybnMgYSBsaXN0IGNvbnRhaW5pbmcgdGhlIGlubmVyIHRleHRzIG9mIHRoZSBmb3VuZCB0YWdzCitzdWIgZ2V0X3RhZ192YWx1ZXMKK3sKKwlteSAoICR0YWduYW1lLCAkc3RyaW5nICk7CisJKCAkdGFnbmFtZSwgJHN0cmluZyApID0gQF87CisJbXkgKEB0bXAsQHRtcDIpOworICAgCUB0bXAgPSBzcGxpdCgvXDwkdGFnbmFtZVw+Lywkc3RyaW5nKTsgCisJZm9yZWFjaCAkXyhAdG1wKXsKKwkJcHVzaChAdG1wMixzcGxpdCgvXDxcLyR0YWduYW1lXD4vKSk7CisJfQorCW15KEByZXN1bHQsJGkpOworCSRpPTE7ICMgY291dGVyIHRvIGdldCBvbmx5IGV2ZXJ5IHNlY29uZCBpdGVtCisJZm9yZWFjaCAkXyhAdG1wMil7CisJCWlmKCRpJTIgZXEgMCl7CisJCQlwdXNoKEByZXN1bHQsJF8pOworCQl9CisJCSRpKys7CisJfQorCXJldHVybiBAcmVzdWx0OworfQorCisjIExJU1QgcmVwbGFjZV90YWdzKCAkdGFnbmFtZSwgJHJlcGxhY2VzdHJpbmcsIEBsaXN0ICkKKyMgc3VicnV0aW5lIHRvIHJlcGxhY2UgdGFncyBieSBhIHJlcGxhY2VzdHJpbmcuIAorIyBSZXR1cm5zIGEgbGlzdCBvZiB0aGUgc3JpbmdzIGFmdGVyIGNvbnZlcnNpb24uCitzdWIgcmVwbGFjZV90YWdzCit7CisJbXkgKCR0YWduYW1lLCAkcmVwbGFjZXN0cmluZywgQHN0cmluZ2xpc3QsIEByZXN1bHQpOworCSgkdGFnbmFtZSwgJHJlcGxhY2VzdHJpbmcsIEBzdHJpbmdsaXN0KSA9IEBfOworCWZvcmVhY2ggJF8oQHN0cmluZ2xpc3QpIHsKKwkJcyNcPCR0YWduYW1lXD4oLio/KVw8XC8kdGFnbmFtZVw+IyRyZXBsYWNlc3RyaW5nI2dzOworCQlwdXNoKEByZXN1bHQsJF8pOworCX0KKwlyZXR1cm4gQHJlc3VsdDsKK30KKworIyBMSVNUIGVubGFyZ2VfdGFncyggJHRhZ25hbWUsICRiZWZvcmUsICRhZnRlciwgQGxpc3QgKQorIyBzdWJydXRpbmUgdG8gcmVwbGFjZSB0YWdzIGJ5IHRoZSB0YWdzIGFkZGVkIGJ5IGEgc3RyaW5nIGJlZm9yZSBhbmQgYWZ0ZXIuIAorIyBSZXR1cm5zIGEgbGlzdCBvZiB0aGUgc3JpbmdzIGFmdGVyIGNvbnZlcnNpb24uCitzdWIgZW5sYXJnZV90YWdzCit7CisJbXkgKCR0YWduYW1lLCAkYmVmb3JlLCAkYWZ0ZXIsIEBzdHJpbmdsaXN0LEByZXN1bHQpOworCSgkdGFnbmFtZSwgJGJlZm9yZSwgJGFmdGVyLCBAc3RyaW5nbGlzdCkgPSBAXzsKKwlmb3JlYWNoICRfKEBzdHJpbmdsaXN0KSB7CisJCXMjXDwkdGFnbmFtZVw+KC4qPylcPFwvJHRhZ25hbWVcPiMkYmVmb3JlJDEkYWZ0ZXIjZ3M7CisJCXB1c2goQHJlc3VsdCwkXyk7CisJfQorCXJldHVybiBAcmVzdWx0OworfQorCisjIExJU1QgZGVsZXRlX3RhZ3MoICR0YWduYW1lLCBAbGlzdCApCisjIHN1YnJ1dGluZSB0byBkZWxldGUgdGFncyBpbiBhIHN0cmluZy4gCisjIFJldHVybnMgYSBsaXN0IG9mIHRoZSBjbGVhcmVkIHN0cmluZ3MKK3N1YiBkZWxldGVfdGFncworeworCW15KCR0YWduYW1lLEBzdHJpbmdsaXN0KTsKKwkoJHRhZ25hbWUsIEBzdHJpbmdsaXN0KSA9IEBfOworCW15KEByZXN1bHQpOworCWZvcmVhY2ggJF8oQHN0cmluZ2xpc3QpIHsKKwkJcyNcPCR0YWduYW1lXD4oLio/KVw8XC8kdGFnbmFtZVw+IyNnczsKKwkJcHVzaChAcmVzdWx0LCRfKTsKKwl9CisJcmV0dXJuIEByZXN1bHQ7Cit9CisKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBzdWJyb3V0aW5lcyBmb3IgZ2VuZXJhdGluZyAib3JwYWhuZWQiIHRlc3RzIAkJCQkJCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIFNDQUxBUiBjcmVhdGVfb3JwaF9jZnVuY3Rpb25zKCAkcHJlZml4LCAkY29kZSApCisjIHJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgZGVmaW5pdGlvbnMgb2YgdGhlIGZ1bmN0aW9ucyBmb3IgdGhlIAorIyBvcnBoYW4gcmVnaW9ucy4KK3N1YiBjcmVhdGVfb3JwaF9jZnVuY3Rpb25zCit7CisJbXkgKCRjb2RlLEBkZWZzKTsKKwkoJGNvZGUpID0gQF87CisJQGRlZnMgPSBnZXRfdGFnX3ZhbHVlcygnb21wdHM6b3JwaGFuJywkY29kZSk7CisJKCRmdW5jdGlvbm5hbWUpID0gZ2V0X3RhZ192YWx1ZXMoJ29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZScsJGNvZGUpOworCW15ICggQHJlc3VsdCwkZnVuY3Rpb25zcmMsICRpKTsKKwkkZnVuY3Rpb25zcmMgPSAgIlxuLyogQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZGVmaW5pdGlvbnMgb2YgdGhlIG9ycGhhbiBmdW5jdGlvbnMgKi9cbiI7CisKKwkkaSA9IDE7CisJZm9yZWFjaCAoQGRlZnMpIHsKKwkJJGZ1bmN0aW9uc3JjIC49ICJcbnZvaWQgb3JwaCRpXF8kZnVuY3Rpb25uYW1lIChGSUxFICogbG9nRmlsZSkgeyI7CisJCSRmdW5jdGlvbnNyYyAuPSAkXzsKKwkJJGZ1bmN0aW9uc3JjIC49ICJcbn1cbiI7CisJCSRpKys7CisJfQorCSRmdW5jdGlvbnNyYyAuPSAiLyogRW5kIG9mIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGRlZmluaXRpb25zICovXG4iOworCXJldHVybiAkZnVuY3Rpb25zcmM7Cit9CisKKyMgU0NBTEFSIGNyZWF0ZV9vcnBoX2ZvcnRyYW5mdW5jdGlvbnMoICRwcmVmaXgsICRjb2RlICkKKyMgcmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIHRoZSBkZWZpbml0aW9ucyBvZiB0aGUgZnVuY3Rpb25zIGZvciB0aGUgCisjIG9ycGhhbiByZWdpb25zLgorc3ViIGNyZWF0ZV9vcnBoX2ZvcnRyYW5mdW5jdGlvbnMKK3sKKwlteSAoJHByZWZpeCwkY29kZSxAZGVmcywkb3JwaGFuX3Bhcm1zKTsKKwkoJHByZWZpeCwkY29kZSwkb3JwaGFuX3Bhcm1zKSA9IEBfOworCUBkZWZzID0gZ2V0X3RhZ192YWx1ZXMoJ29tcHRzOm9ycGhhbicsJGNvZGUpOworCisgICAgI3RvIHJlbW92ZSBzcGFjZSBhbmQgcHV0IGEgc2luZ2xlIHNwYWNlCisgICAgaWYoJG9ycGhhbl9wYXJtcyBuZSAiIikKKyAgICB7CisgICAgICAkb3JwaGFuX3Bhcm1zID1+IHMvWyBcdF0rLy9zZzsKKyAgICAgICRvcnBoYW5fcGFybXMgPX4gcy9bIFx0XStcbi9cbi9zZzsKKyAgICB9CisgICAgCisJKCRvcnBoYW52YXJzZGVmcykgPSBnZXRfdGFnX3ZhbHVlcygnb21wdHM6b3JwaGFuOnZhcnMnLCRjb2RlKTsKKwlmb3JlYWNoIChAdmFyc2RlZikgeworCQlpZiAobm90IC9bXiBcbiRdKi8peyAkb3JwaGFudmFyc2RlZnMgPSBqb2luKCJcbiIsJG9ycGhhbnZhcnNkZWYsJF8pO30KKwl9CisJKCRmdW5jdGlvbm5hbWUpID0gZ2V0X3RhZ192YWx1ZXMoJ29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZScsJGNvZGUpOworCW15ICggQHJlc3VsdCwkZnVuY3Rpb25zcmMsICRpKTsKKwkkZnVuY3Rpb25zcmMgPSAgIlxuISBEZWZpbml0aW9ucyBvZiB0aGUgb3JwaGFuIGZ1bmN0aW9uc1xuIjsKKwkkaSA9IDE7CisJZm9yZWFjaCAkXyhAZGVmcykKKwl7CisJCSRmdW5jdGlvbnNyYyAuPSAiXG4gICAgICBTVUJST1VUSU5FIG9ycGgkaVxfJHByZWZpeFxfJGZ1bmN0aW9ubmFtZVwoJG9ycGhhbl9wYXJtc1wpXG4gICAgICAiOworICAgICAgICAkZnVuY3Rpb25zcmMgLj0gIklOQ0xVREUgXCJvbXBfdGVzdHN1aXRlLmZcIlxuIjsKKwkJJGZ1bmN0aW9uc3JjIC49ICRvcnBoYW52YXJzZGVmcy4iXG4iOworCQkkZnVuY3Rpb25zcmMgLj0gJF87CisJCSRmdW5jdGlvbnNyYyAuPSAiXG4iOworCQkkZnVuY3Rpb25zcmMgLj0gIiAgICAgIEVORCBTVUJST1VUSU5FXG4hIEVuZCBvZiBkZWZpbml0aW9uXG5cbiI7CisJCSRpKys7CisJfQorCXJldHVybiAkZnVuY3Rpb25zcmM7Cit9CisKKyMgTElTVCBvcnBoYW5fcmVnaW9uczJjZnVuY3Rpb25zKCAkcHJlZml4LCBAY29kZSApCisjIHJlcGxhY2VzIG9ycGhhbiByZWdpb25zIGJ5IGZ1bmN0aW9uY2FsbHMgaW4gQy9DKysuCitzdWIgb3JwaGFuX3JlZ2lvbnMyY2Z1bmN0aW9ucworeworCW15ICgkY29kZSwgJGksICRmdW5jdGlvbm5hbWUpOworCSgkY29kZSkgPSBAXzsKKwkkaSA9IDE7CisJKCRmdW5jdGlvbm5hbWUpID0gZ2V0X3RhZ192YWx1ZXMoJ29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZScsJGNvZGUpOworICAgICAgICB3aGlsZSggL1w8b21wdHNcOm9ycGhhblw+KC4qKVw8XC9vbXB0c1w6b3JwaGFuXD4vcykgeworICAgICAgICAgICAgcyNcPG9tcHRzXDpvcnBoYW5cPiguKj8pXDxcL29tcHRzXDpvcnBoYW5cPiNvcnBoJGlcXyRmdW5jdGlvbm5hbWUgKGxvZ0ZpbGUpOyNzOworICAgICAgICAgICAgJGkrKzsKKyAgICAgICAgfQorCXJldHVybiAkY29kZTsKK30KKworIyBMSVNUIG9ycGhhbl9yZWdpb25zMmZvcnRyYW5mdW5jdGlvbnMoICRwcmVmaXgsIEBjb2RlICkKKyMgcmVwbGFjZXMgb3JwaGFuIHJlZ2lvbnMgYnkgZnVuY3Rpb25jYWxscyBpbiBmb3J0cmFuCitzdWIgb3JwaGFuX3JlZ2lvbnMyZm9ydHJhbmZ1bmN0aW9ucworeworCW15ICggJHByZWZpeCwgQGNvZGUsICRteV9wYXJtcywgJGksICRmdW5jdGlvbm5hbWUpOworCSgkcHJlZml4LCAoJGNvZGUpLCAkbXlfcGFybXMpID0gQF87CisJJGkgPSAxOworCSgkZnVuY3Rpb25uYW1lKSA9IGdldF90YWdfdmFsdWVzKCdvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWUnLCRjb2RlKTsKKwlmb3JlYWNoICRfKCgkY29kZSkpCisJeworCQl3aGlsZSggL1w8b21wdHNcOm9ycGhhblw+KC4qKVw8XC9vbXB0c1w6b3JwaGFuXD4vcykKKwkJeworCQkJcyNcPG9tcHRzXDpvcnBoYW5cPiguKj8pXDxcL29tcHRzXDpvcnBoYW5cPiMgICAgICBDQUxMIG9ycGgkaVxfJHByZWZpeFxfJGZ1bmN0aW9ubmFtZVwoJG15X3Bhcm1zXCk7I3M7CisJCQkkaSsrOworCQl9CisJfQorCXJldHVybiAoJGNvZGUpOworfQorCisjIFNDQUxBUiBvcnBoX2Z1bmN0aW9uc19kZWNsYXJhdGlvbnMoICRwcmVmaXgsICRjb2RlICkKKyMgcmV0dXJucyBhIHNyaW5nIGluY2x1ZGluZyB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIGZ1bmN0aW9ucyB1c2VkIAorIyBpbiB0aGUgb3JwaGFuIHJlZ2lvbnMuIFRoZSBmdW5jdGlvbiBuYW1lcyBhcmUgZ2VuZXJhdGVkIHVzaW5nIAorIyB0aGUgJHByZWZpeCBhcyBwcmVmaXggZm9yIHRoZSBmdW5jdGlvbm5hbWUuCitzdWIgb3JwaF9mdW5jdGlvbnNfZGVjbGFyYXRpb25zCit7CisJbXkgKCRwcmVmaXgsICRjb2RlKTsKKwkoJHByZWZpeCwgJGNvZGUpID0gQF87CisJbXkgKCBAZGVmcywgJHJlc3VsdCApOworCQorCSMgY3JlYXRpbmcgZGVjbGFyYXRpb25zIGZvciBsYXRlciB1c2VkIGZ1bmN0aW9ucworCSRyZXN1bHQgLj0gIlxuXG4vKiBEZWNsYXJhdGlvbiBvZiB0aGUgZnVuY3Rpb25zIGNvbnRhaW5pbmcgdGhlIGNvZGUgZm9yIHRoZSBvcnBoYW4gcmVnaW9ucyAqL1xuI2luY2x1ZGUgPHN0ZGlvLmg+XG4iOworCUBkZWZzID0gZ2V0X3RhZ192YWx1ZXMoJ29tcHRzOm9ycGhhbicsJGNvZGUpOworCW15ICgkZnVuY3Rpb25uYW1lLCRpKTsKKwkoJGZ1bmN0aW9ubmFtZSkgPSBnZXRfdGFnX3ZhbHVlcygnb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lJywkY29kZSk7CisJJGkgPSAxOworCWZvcmVhY2ggJF8oQGRlZnMpIHsKKwkJJHJlc3VsdCAuPSAiXG52b2lkIG9ycGgkaVxfJHByZWZpeFxfJGZ1bmN0aW9ubmFtZSAoIEZJTEUgKiBsb2dGaWxlICk7IjsKKwkJJGkrKzsKKwl9CisJJHJlc3VsdCAuPSAiXG5cbi8qIEVuZCBvZiBkZWNsYXJhdGlvbiAqL1xuXG4iOworCXJldHVybiAkcmVzdWx0OworfQorCisjIFNDQUxBUiBtYWtlX2dsb2JhbF92YXJzX2RlZmluaXRpb24oICRjb2RlICkKKyMgcmV0dXJucyBhIHNyaW5nIGluY2x1ZGluZyB0aGUgZGVjbGFyYXRpb24gZm9yIHRoZSB2YXJzIG5lZWRlZCB0bworIyBiZSBkZWNsYXJlZCBnbG9iYWwgZm9yIHRoZSBvcnBoYW4gcmVnaW9uLgorc3ViIG1ha2VfZ2xvYmFsX3ZhcnNfZGVmCit7CisJbXkgKCAkY29kZSApOworCSgkY29kZSkgPSBAXzsKKwlteSAoIEBkZWZzLCAkcmVzdWx0LCBAdG1wLCBAdG1wMiAsJHByZWRlZmluaXRpb25zKTsKKwkKKwkjIGNyZWF0aW5nIGdsb2JhbCBkZWNsYXJhdGlvbnMgZm9yIHRoZSB2YXJpYWJsZXMuCisJJHJlc3VsdCAgPSAiXG5cbi8qIERlY2xhcmF0aW9uIG9mIHRoZSB2YXJpYWJsZXMgdXNlZCBpbiB0aGUgb3JwaGFuIHJlZ2lvbi4gKi9cbiI7CisJCisJIyBnZXQgYWxsIHRhZ3MgY29udGFpbmluZyB0aGUgdmFyaWFibGUgZGVmaW5pdGlvbnMKKwlAZGVmcyA9IGdldF90YWdfdmFsdWVzKCdvbXB0czpvcnBoYW46dmFycycsJGNvZGUpOworCWZvcmVhY2ggJF8oQGRlZnMpCisJeworCQkjIGN1dHRpbmcgdGhlIGRpZmZlcmVudCBkZWNsYXJhdGlvbnMgaW4gdGhlIHNhbWUgdGFnIGJ5IHRoZSAnOycgYXMgY3V0dG1hcmsKKwkJQHRtcCA9IHNwbGl0KC87LywkXyk7CisJCWZvcmVhY2ggJF8oQHRtcCkKKwkJeworCQkJIyByZXBsYWNpbmcgbmV3bGluZXMgYW5kIGRvdWJsZSBzcGFjZXMKKwkJCXMvXG4vL2dzOworCQkJcy8gIC8vZ3M7CisJCQkjIHB1dCB0aGUgbmV3IGRlY2xhcmF0aW9uIGF0IHRoZSBlbmQgb2YgJHJlc3VsdAorCQkJaWYoJF8gbmUgIiIpeyAkcmVzdWx0IC49ICJcbiAkXzsiOyB9CisJCX0KKwl9CisJJHJlc3VsdCAuPSAiXG5cbi8qIEVuZCBvZiBkZWNsYXJhdGlvbi4gKi9cblxuIjsKKwlyZXR1cm4gJHJlc3VsdDsKK30KKworIyBTQ0FMQVIgZXh0ZXJuX3ZhcnNfZGVmaW5pdGlvbiggJGNvZGUgKQorIyByZXR1cm5zIGEgc3JpbmcgaW5jbHVkaW5nIHRoZSBkZWNsYXJhdGlvbiBmb3IgdGhlIHZhcnMgbmVlZGVkIHRvCisjIGJlIGRlY2xhcmVkIGV4dGVybiBmb3IgdGhlIG9ycGhhbiByZWdpb24uCitzdWIgZXh0ZXJuX3ZhcnNfZGVmCit7CisJbXkgKCAkY29kZSApOworCSgkY29kZSkgPSBAXzsKKwlteSAoIEBkZWZzLCAkcmVzdWx0LCBAdG1wLCBAdG1wMiAsJHByZWRlZmluaXRpb25zKTsKKwkKKwkjIGNyZWF0aW5nIGRlY2xhcmF0aW9ucyBmb3IgdGhlIGV4dGVybiB2YXJpYWJsZXMuCisJJHJlc3VsdCAgPSAiXG5cbi8qIERlY2xhcmF0aW9uIG9mIHRoZSBleHRlcm4gdmFyaWFibGVzIHVzZWQgaW4gdGhlIG9ycGhhbiByZWdpb24uICovXG4iOworCSMgJHJlc3VsdCAuPSAiXG4jaW5jbHVkZSA8c3RkaW8uaD5cbiNpbmNsdWRlIDxvbXAuaD5cbiI7CisJJHJlc3VsdCAuPSAiXG5leHRlcm4gRklMRSAqIGxvZ0ZpbGU7IjsKKwkKKwkjIGdldCBhbGwgdGFncyBjb250YWluaW5nIHRoZSB2YXJpYWJsZSBkZWZpbml0aW9ucworCUBkZWZzID0gZ2V0X3RhZ192YWx1ZXMoJ29tcHRzOm9ycGhhbjp2YXJzJywkY29kZSk7CisJZm9yZWFjaCAkXyhAZGVmcykKKwl7CisJCSMgY3V0dGluZyB0aGUgZGlmZmVyZW50IGRlY2xhcmF0aW9ucyBpbiB0aGUgc2FtZSB0YWcgYnkgdGhlICc7JyBhcyBjdXR0bWFyaworCQlAdG1wID0gc3BsaXQoLzsvLCRfKTsKKwkJZm9yZWFjaCAkXyhAdG1wKQorCQl7CisJCQkjIHJlcGxhY2luZyBuZXdsaW5lcyBhbmQgZG91YmxlIHNwYWNlcworCQkJcy9cbi8vZ3M7CisJCQlzLyAgLy9nczsKKwkJCSMgY3V0dGluZyBvZmYgZGVmaW5pdGlvbnMKKwkJCUB0bXAyID0gc3BsaXQoIj0iLCRfKTsKKwkJCSMgcHV0IHRoZSBuZXcgZGVjbGFyYXRpb24gYXQgdGhlIGVuZCBvZiAkcmVzdWx0CisJCQkkcmVzdWx0IC49ICJcbmV4dGVybiAkdG1wMlswXTsiOworCQl9CisJfQorCSRyZXN1bHQgLj0gIlxuXG4vKiBFbmQgb2YgZGVjbGFyYXRpb24uICovXG5cbiI7CisJcmV0dXJuICRyZXN1bHQ7Cit9CisKK3N1YiBsZWF2ZV9zaW5nbGVfc3BhY2UKK3sKKyAgbXkoJHN0cik7CisgICgkc3RyKT1AXzsKKyAgaWYoJHN0ciBuZSAiIikKKyAgeworICAgICRzdHIgPX4gcy9eWyBcdF0rLyAvOworICAgICRzdHIgPX4gcy9bIFx0XStcbiQvXG4vOworICAgICRzdHIgPX4gcy9bIFx0XSsvL2c7CisgIH0KKyAgcmV0dXJuICRzdHI7Cit9CisKK3JldHVybiAxOwpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL29tcHRzX3N0YW5kYWxvbmVQcm9jLmMgYi9maW5hbC90ZXN0c3VpdGUvb21wdHNfc3RhbmRhbG9uZVByb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTFiNTkzCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL29tcHRzX3N0YW5kYWxvbmVQcm9jLmMKQEAgLTAsMCArMSw1MSBAQAoraW50IG1haW4oKQoreworCWludCBpOwkJCS8qIExvb3AgaW5kZXggKi8KKwlpbnQgcmVzdWx0OwkJLyogcmV0dXJuIHZhbHVlIG9mIHRoZSBwcm9ncmFtICovCisJaW50IGZhaWxlZD0wOyAJCS8qIE51bWJlciBvZiBmYWlsZWQgdGVzdHMgKi8KKwlpbnQgc3VjY2Vzcz0wOwkJLyogbnVtYmVyIG9mIHN1Y2NlZWRlZCB0ZXN0cyAqLworCXN0YXRpYyBGSUxFICogbG9nRmlsZTsJLyogcG9pbnRlciBvbnRvIHRoZSBsb2dmaWxlICovCisJc3RhdGljIGNvbnN0IGNoYXIgKiBsb2dGaWxlTmFtZSA9ICI8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+LmxvZyI7CS8qIG5hbWUgb2YgdGhlIGxvZ2ZpbGUgKi8KKworCisJLyogT3BlbiBhIG5ldyBMb2dmaWxlIG9yIG92ZXJ3cml0ZSB0aGUgZXhpc3Rpbmcgb25lLiAqLworCWxvZ0ZpbGUgPSBmb3Blbihsb2dGaWxlTmFtZSwidysiKTsKKworCXByaW50ZigiIyMjIyMjIyMgT3Blbk1QIFZhbGlkYXRpb24gU3VpdGUgViAlcyAjIyMjIyNcbiIsIE9NUFRTX1ZFUlNJT04gKTsKKwlwcmludGYoIiMjIFJlcGV0aXRpb25zOiAlM2QgICAgICAgICAgICAgICAgICAgICAgICMjIyNcbiIsUkVQRVRJVElPTlMpOworCXByaW50ZigiIyMgTG9vcCBDb3VudCA6ICU2ZCAgICAgICAgICAgICAgICAgICAgIyMjI1xuIixMT09QQ09VTlQpOworCXByaW50ZigiIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuIik7CisJcHJpbnRmKCJUZXN0aW5nIDxkaXJlY3RpdmU+PC9kaXJlY3RpdmU+XG5cbiIpOworCisJZnByaW50Zihsb2dGaWxlLCIjIyMjIyMjIyBPcGVuTVAgVmFsaWRhdGlvbiBTdWl0ZSBWICVzICMjIyMjI1xuIiwgT01QVFNfVkVSU0lPTiApOworCWZwcmludGYobG9nRmlsZSwiIyMgUmVwZXRpdGlvbnM6ICUzZCAgICAgICAgICAgICAgICAgICAgICAgIyMjI1xuIixSRVBFVElUSU9OUyk7CisJZnByaW50Zihsb2dGaWxlLCIjIyBMb29wIENvdW50IDogJTZkICAgICAgICAgICAgICAgICAgICAjIyMjXG4iLExPT1BDT1VOVCk7CisJZnByaW50Zihsb2dGaWxlLCIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4iKTsKKwlmcHJpbnRmKGxvZ0ZpbGUsIlRlc3RpbmcgPGRpcmVjdGl2ZT48L2RpcmVjdGl2ZT5cblxuIik7CisKKwlmb3IgKCBpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKysgKSB7CisJCWZwcmludGYgKGxvZ0ZpbGUsICJcblxuJWQuIHJ1biBvZiA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+IG91dCBvZiAlZFxuXG4iLGkrMSxSRVBFVElUSU9OUyk7CisJCWlmKDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4obG9nRmlsZSkpeworCQkJZnByaW50Zihsb2dGaWxlLCJUZXN0IHN1Y2Nlc3NmdWwuXG4iKTsKKwkJCXN1Y2Nlc3MrKzsKKwkJfQorCQllbHNlIHsKKwkJCWZwcmludGYobG9nRmlsZSwiRXJyb3I6IFRlc3QgZmFpbGVkLlxuIik7CisJCQlwcmludGYoIkVycm9yOiBUZXN0IGZhaWxlZC5cbiIpOworCQkJZmFpbGVkKys7CisJCX0KKwl9CisKKyAgICBpZihmYWlsZWQ9PTApeworCQlmcHJpbnRmKGxvZ0ZpbGUsIlxuRGlyZWN0aXZlIHdvcmtlZCB3aXRob3V0IGVycm9ycy5cbiIpOworCQlwcmludGYoIkRpcmVjdGl2ZSB3b3JrZWQgd2l0aG91dCBlcnJvcnMuXG4iKTsKKwkJcmVzdWx0PTA7CisJfQorCWVsc2V7CisJCWZwcmludGYobG9nRmlsZSwiXG5EaXJlY3RpdmUgZmFpbGVkIHRoZSB0ZXN0ICVpIHRpbWVzIG91dCBvZiAlaS4gJWkgd2VyZSBzdWNjZXNzZnVsXG4iLGZhaWxlZCxSRVBFVElUSU9OUyxzdWNjZXNzKTsKKwkJcHJpbnRmKCJEaXJlY3RpdmUgZmFpbGVkIHRoZSB0ZXN0ICVpIHRpbWVzIG91dCBvZiAlaS5cbiVpIHRlc3Qocykgd2VyZSBzdWNjZXNzZnVsXG4iLGZhaWxlZCxSRVBFVElUSU9OUyxzdWNjZXNzKTsKKwkJcmVzdWx0ID0gKGludCkgKCgoZG91YmxlKSBmYWlsZWQgLyAoZG91YmxlKSBSRVBFVElUSU9OUyApICogMTAwICk7CisJfQorCXByaW50ZiAoIlJlc3VsdDogJWlcbiIsIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9vbXB0c19zdGFuZGFsb25lUHJvYy5mIGIvZmluYWwvdGVzdHN1aXRlL29tcHRzX3N0YW5kYWxvbmVQcm9jLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFmY2FiNgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9vbXB0c19zdGFuZGFsb25lUHJvYy5mCkBAIC0wLDAgKzEsNjggQEAKKyFUaGlzIGlzIHRoZSBtYWluIGRyaXZlciB0byBpbnZva2UgZGlmZmVyZW50IHRlc3QgZnVuY3Rpb25zCisgICAgICBQUk9HUkFNIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT5fbWFpbgorICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgSU5URUdFUiBmYWlsZWQsIHN1Y2Nlc3MgIU51bWJlciBvZiBmYWlsZWQvc3VjY2VlZGVkIHRlc3RzCisgICAgICBJTlRFR0VSIG51bV90ZXN0cyxjcm9zc2NoZWNrZWQsIGNyb3NzZmFpbGVkLCBqCisgICAgICBJTlRFR0VSIHRlbXAsdGVtcDEKKyAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKworICAgICAgSU5URUdFUiA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+CisKKworICAgICAgQ0hBUkFDVEVSKjUwIGxvZ2ZpbGVuYW1lICFQb2ludGVyIHRvIGxvZ2ZpbGUKKyAgICAgIElOVEVHRVIgcmVzdWx0IAorCisgICAgICBudW1fdGVzdHMgPSAwCisgICAgICBjcm9zc2NoZWNrZWQgPSAwCisgICAgICBjcm9zc2ZhaWxlZCA9IDAKKyAgICAgIHJlc3VsdCA9IDEKKyAgICAgIGZhaWxlZCA9IDAKKworICAgICAgIU9wZW4gYSBuZXcgbG9nZmlsZSBvciBvdmVyd3JpdGUgdGhlIGV4aXN0aW5nIG9uZS4KKyAgICAgIGxvZ2ZpbGVuYW1lID0gImJpbi9mb3J0cmFuLzx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4ubG9nIgorISAgICAgIFdSSVRFICgqLCopICJFbnRlciBsb2dGaWxlbmFtZToiIAorISAgICAgIFJFQUQgICgqLCopIGxvZ2ZpbGVuYW1lCisKKyAgICAgIE9QRU4gKDEsIEZJTEUgPSBsb2dmaWxlbmFtZSkKKyAKKyAgICAgIFdSSVRFICgqLCopICIjIyMjIyMjIyBPcGVuTVAgVmFsaWRhdGlvbiBTdWl0ZSBWIDMuMGEgIyMjIyMjIgorICAgICAgV1JJVEUgKCosKikgIiMjIFJlcGV0aXRpb25zOiIsIE4gCisgICAgICBXUklURSAoKiwqKSAiIyMgTG9vcCBDb3VudCA6IiwgTE9PUENPVU5UCisgICAgICBXUklURSAoKiwqKSAiIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyIKKyAgICAgIFdSSVRFICgqLCopCisKKyAgICAgIGNyb3NzZmFpbGVkPTAKKyAgICAgIHJlc3VsdD0xCisgICAgICBXUklURSAoMSwqKSAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisgICAgICBXUklURSAoMSwqKSAiVGVzdGluZyA8ZGlyZWN0aXZlPjwvZGlyZWN0aXZlPiIKKyAgICAgIFdSSVRFICgxLCopICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKyAgICAgIFdSSVRFICgxLCopIAorICAgICAgV1JJVEUgKDEsKikgInRlc3RuYW1lOiA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+IgorICAgICAgV1JJVEUgKDEsKikgIihDcm9zc3Rlc3RzIHNob3VsZCBmYWlsKSIKKyAgICAgIFdSSVRFICgxLCopCisgICAgICAKKyAgICAgIERPIGogPSAxLCBOCisgICAgICAgIHRlbXAgPSAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElGICh0ZW1wIC5FUS4gMSkgVEhFTgorICAgICAgICAgIFdSSVRFICgxLCopICBqLCAiLiB0ZXN0IHN1Y2Nlc3NmdWwuIgorICAgICAgICAgIHN1Y2Nlc3MgPSBzdWNjZXNzICsgMQorICAgICAgICBFTFNFCisgICAgICAgICAgV1JJVEUgKDEsKikgIkVycm9yOiAiLGosICIuIHRlc3QgZmFpbGVkLiIKKyAgICAgICAgICBmYWlsZWQgPSBmYWlsZWQgKyAxCisgICAgICAgIEVORElGCisgICAgICBFTkQgRE8KKworICAgICAgCisgICAgICBJRiAoZmFpbGVkIC5FUS4gMCkgVEhFTgorICAgICAgICBXUklURSAoMSwqKSAiRGlyZWN0aXZlIHdvcmtlZCB3aXRob3V0IGVycm9ycy4iCisgICAgICAgIFdSSVRFICgqLCopICJEaXJlY3RpdmUgd29ya2VkIHdpdGhvdXQgZXJyb3JzLiIKKyAgICAgICAgcmVzdWx0ID0gMAorICAgICAgICBXUklURSAoKiwqKSAiUmVzdWx0OiIscmVzdWx0CisgICAgICBFTFNFCisgICAgICAgIFdSSVRFICgxLCopICJEaXJlY3RpdmUgZmFpbGVkIHRoZSB0ZXN0ICIsIGZhaWxlZCwgIiB0aW1lcy4iCisgICAgICAgIFdSSVRFICgqLCopICJEaXJlY3RpdmUgZmFpbGVkIHRoZSB0ZXN0ICIsIGZhaWxlZCwgIiB0aW1lcy4iCisgICAgICAgIHJlc3VsdCA9IGZhaWxlZCAqIDEwMCAvIE4KKyAgICAgICAgV1JJVEUgKCosKikgIlJlc3VsdDoiLHJlc3VsdAorICAgICAgRU5ESUYKKyAgICAgIENBTEwgRVhJVCAocmVzdWx0KQorICAgICAgRU5EIFBST0dSQU0gCmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvcnVudGVzdC5wbCBiL2ZpbmFsL3Rlc3RzdWl0ZS9ydW50ZXN0LnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM0NzIzNTEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvcnVudGVzdC5wbApAQCAtMCwwICsxLDU5MiBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorCisjIHJ1bnRlc3QgW29wdGlvbnNdIEZJTEVOQU1FCisjCisjIFJlYWQgdGhlIGZpbGUgRklMRU5BTUUuIEVhY2ggbGluZSBjb250YWlucyBhIHRlc3QuCisjIENvbnZlcnQgdGVtcGxhdGUgdG8gdGVzdCBhbmQgY3Jvc3N0ZXN0LgorIyBJZiBwb3NzaWxibGUgZ2VuZXJhdGUgb3JwaGFuZWQgdGVzdHZlcnNpb25zLCB0b28uCisjIFVzZSBtYWtlIHRvIGNvbXBpbGUgdGhlIHRlc3QKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgR2xvYmFsIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIHJ1bnRlc3RzY3JpcHQgaXRzZWxmOgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBuYW1lIG9mIHRoZSBnbG9iYWwgY29uZmlndXJhdGlvbiBmaWxlIGZvciB0aGUgdGVzdHN1aXRlOgorJGNvbmZpZ19maWxlICAgID0gIm9tcHRzLmNvbmYiOworJGxvZ2ZpbGUgICAgICAgID0gIm9tcHRzLmxvZyI7ICMgb3ZlcndyaXRlYWJsZSBieSB2YWx1ZSBpbiBjb25maWcgZmlsZQorJGVudl9zZXRfdGhyZWFkc19jb21tYW5kID0gJ09NUF9OVU1fVEhSRUFEUz0lbjsgZXhwb3J0IE9NUF9OVU1fVEhSRUFEUzsnOworJGRlYnVnX21vZGUgICAgID0gMDsKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEFmdGVyIHRoaXMgbGluZSB0aGUgc2NyaXB0IHBhcnQgYmVnaW5zISBEbyBub3QgZWRpdCBhbml0aGluZyBiZWxvdworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworCisjIE5hbWVzcGFjZXM6Cit1c2UgR2V0b3B0OjpMb25nOworI3VzZSBVbml4OjpQSUQ7Cit1c2UgRGF0YTo6RHVtcGVyOwordXNlIG9tcHRzX3BhcnNlckZ1bmN0aW9uczsKKworIyBFeHRyYWN0aW5nIGdpdmVuIG9wdGlvbnMKK0dldE9wdGlvbnMoImhlbHAiLAorICAgICAgImxpc3RsYW5ndWFnZXMiLAorICAgICAgImxhbmc9cyIsCisgICAgICAibGlzdCIsCisgICAgICAidGVzdGluZm89cyIsCisgICAgICAibnVtdGhyZWFkcz1pIiwKKyAgICAgICJ0ZXN0PXMiLAorICAgICAgImNvbXBpbGUhIiwKKyAgICAgICJydW4hIiwKKyAgICAgICJvcnBoYW4hIiwKKyAgICAgICJyZXN1bHRmaWxlPXMiCisgICAgICApOworCisjIEdldCBnbG9iYWwgY29uZmlndXJhdGlubyBvcHRpb25zIGZyb20gY29uZmlnIGZpbGU6CitpZighIC1lICRjb25maWdfZmlsZSl7IGVycm9yICgiQ291bGQgbm90IGZpbmQgY29uZmlnIGZpbGUgJGNvbmZpZ19maWxlXG4iLCAxKTt9CitvcGVuIChDT05GSUcsICI8JGNvbmZpZ19maWxlIikgb3IgZXJyb3IgKCJDb3VsZCBub3Qgb3BlbiBjb25maWcgZmlsZSAkY29uZmlnX2ZpbGVcbiIsIDIpOword2hpbGUgKDxDT05GSUc+KSB7ICRjb25maWcgLj0gJF87IH0KK2Nsb3NlIChDT05GSUcpOworCisoJGxvZ2ZpbGUpID0gZ2V0X3RhZ192YWx1ZXMgKCJsb2dmaWxlIiwgJGNvbmZpZyk7CisoJHRpbWVvdXQpID0gZ2V0X3RhZ192YWx1ZXMgKCJzaW5nbGV0ZXN0dGltZW91dCIsICRjb25maWcpOworKCRkaXNwbGF5X2Vycm9ycykgPSBnZXRfdGFnX3ZhbHVlcygiZGlzcGxheWVycm9ycyIsICRjb25maWcpOworKCRkaXNwbGF5X3dhcm5pbmdzKSA9IGdldF90YWdfdmFsdWVzICgiZGlzcGxheXdhcm5pbmdzIiwgJGNvbmZpZyk7CisoJG51bXRocmVhZHMpID0gZ2V0X3RhZ192YWx1ZXMgKCJudW10aHJlYWRzIiwgJGNvbmZpZyk7CisoJGVudl9zZXRfdGhyZWFkc19jb21tYW5kKSA9IGdldF90YWdfdmFsdWVzKCJlbnZzZXR0aHJlYWRzY29tbWFuZCIsJGNvbmZpZyk7CiskZW52X3NldF90aHJlYWRzX2NvbW1hbmQgPX4gcy9cJW4vJG51bXRocmVhZHMvZzsKK0BsYW5ndWFnZXMgPSBnZXRfdGFnX3ZhbHVlcyAoImxhbmd1YWdlIiwgJGNvbmZpZyk7CisKK2lmICghZGVmaW5lZCgkb3B0X2NvbXBpbGUpKSB7JG9wdF9jb21waWxlID0gMTt9CitpZiAoIWRlZmluZWQoJG9wdF9ydW4pKSAgICAgeyRvcHRfcnVuID0gMTt9CitpZiAoIWRlZmluZWQoJG9wdF9vcnBoYW4pKSB7JG9wdF9vcnBoYW4gPSAxO30KK2lmICghZGVmaW5lZCgkb3B0X3Jlc3VsdHNmaWxlKSkgeygkb3B0X3Jlc3VsdHNmaWxlKSA9IGdldF90YWdfdmFsdWVzKCJyZXN1bHRzZmlsZSIsICRjb25maWcpO30KK2lmICggZGVmaW5lZCgkb3B0X251bXRocmVhZHMpICYmICgkb3B0X251bXRocmVhZHMgPiAwKSkgeyRudW10aHJlYWRzID0gJG9wdF9udW10aHJlYWRzO30KK2lmICgkZGVidWdfbW9kZSkgeworcHJpbnQgPDxFT0Y7CitUZXN0c3VpdGUgY29uZmlndXJhdGlvbjoKK0xvZ2ZpbGUgPSAkbG9nZmlsZQorVGltZW91dCA9ICR0aW1lb3V0IHNlY29uZHMKK0xhbmd1YWdlOiAgJG9wdF9sYW5nCitEaXNwbGF5IGVycm9yczogICAkZGlzcGxheV9lcnJvcnMKK0Rpc3BsYXkgd2FybmluZ3M6ICRkaXNwbGF5X3dhcm5pbmdzCitSZXN1bHRzZmlsZTogICAgICAkb3B0X3Jlc3VsdHNmaWxlCitOdW10aHJlYWRzOiAkbnVtdGhyZWFkcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFT0YKK30KKworJG51bV9jb25zdHJ1Y3MgICAgPSAwOworJG51bV90ZXN0cyAgICAgICAgPSAwOworJG51bV9mYWlsZWRfdGVzdHMgPSAwOworJG51bV9zdWNjZXNzZnVsX3Rlc3RzICAgPSAwOworJG51bV92ZXJpZmllZF90ZXN0cyAgICAgPSAwOworJG51bV9mYWlsZWRfY29tcGlsYXRpb24gPSAwOworCiskbnVtX25vcm1hbF90ZXN0c19mYWlsZWQgPSAwOworJG51bV9ub3JtYWxfdGVzdHNfY29tcGlsZV9lcnJvciA9IDA7CiskbnVtX25vcm1hbF90ZXN0c190aW1lZF9vdXQgPSAwOworJG51bV9ub3JtYWxfdGVzdHNfc3VjY2Vzc2Z1bCA9IDA7CiskbnVtX25vcm1hbF90ZXN0c192ZXJpZmllZCA9IDA7CisKKyRudW1fb3JwaGFuZWRfdGVzdHNfZmFpbGVkID0gMDsKKyRudW1fb3JwaGFuZWRfdGVzdHNfY29tcGlsZV9lcnJvciA9IDA7CiskbnVtX29ycGhhbmVkX3Rlc3RzX3RpbWVkX291dCA9IDA7CiskbnVtX29ycGhhbmVkX3Rlc3RzX3N1Y2Nlc3NmdWwgPSAwOworJG51bV9vcnBoYW5lZF90ZXN0c192ZXJpZmllZCA9IDA7CisKK2lmICgkb3B0X2hlbHApICAgICAgICAgeyBwcmludF9oZWxwX3RleHQgKCk7ICAgZXhpdCAwOyB9CitpZiAoJG9wdF9saXN0bGFuZ3VhZ2VzKXsgcHJpbnRfYXZhaWxfbGFuZ3MgKCk7IGV4aXQgMDsgfQoraWYgKCRvcHRfbGlzdCkgICAgIHsgcHJpbnRfYXZhaWxfdGVzdHMgKCk7ICAgZXhpdCAwOyB9CitpZiAoJG9wdF90ZXN0aW5mbykgeyBwcmludF90ZXN0aW5mbyAoKTsgICAgICBleGl0IDA7IH0KK2lmICgkb3B0X3Rlc3QpICAgICB7IHdyaXRlX3Jlc3VsdF9maWxlX2hlYWQoKTsKKyAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVfc2luZ2xlX3Rlc3QgKCk7IGV4aXQgMDsgfQoraWYgKC1lICRBUkdWWzBdKSAgIHsgd3JpdGVfcmVzdWx0X2ZpbGVfaGVhZCgpOworICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZV90ZXN0bGlzdCgkQVJHVlswXSk7IHByaW50X3Jlc3VsdHMoKTsKKyAgICAgICAgICAgICAgICAgICAgIHJlc3VsdF9zdW1tYXJ5KCk7IGV4aXQgMDt9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIHN1YiBmdW5jdGlvbiBkZWZpbml0aW9ucworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBGdW5jdGlvbiB3aGljaCBwcmludHMgdGhlIHJlc3VsdHMgZmlsZQorc3ViIHByaW50X3Jlc3VsdHMKK3sKKyAgICBzeXN0ZW0oImVjaG87IGNhdCAkb3B0X3Jlc3VsdHNmaWxlOyBlY2hvOyIpOworfQorCisjIEZ1bmN0aW9uIHdoaWNoIHByaW50cyBhIHN1bW1hcnkgb2YgYWxsIHRlc3QKK3N1YiByZXN1bHRfc3VtbWFyeQoreworICAgIG15ICRudW1fZGlyZWN0aXZlcyA9IEB0ZXN0X3Jlc3VsdHM7CisKKyAgICBwcmludCA8PEVPRjsKKworU3VtbWFyeToKK1MgTnVtYmVyIG9mIHRlc3RlZCBPcGVuIE1QIGNvbnN0cnVjdHM6ICRudW1fY29uc3RydWN0cworUyBOdW1iZXIgb2YgdXNlZCB0ZXN0czogICAgICAgICAgICAgICAgJG51bV90ZXN0cworUyBOdW1iZXIgb2YgZmFpbGVkIHRlc3RzOiAgICAgICAgICAgICAgJG51bV9mYWlsZWRfdGVzdHMKK1MgTnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdGVzdHM6ICAgICAgICAgICRudW1fc3VjY2Vzc2Z1bF90ZXN0cworUyArIGZyb20gdGhpcyB3ZXJlIHZlcmlmaWVkOiAgICAgICAgICAgJG51bV92ZXJpZmllZF90ZXN0cworCitOb3JtYWwgdGVzdHM6CitOIE51bWJlciBvZiBmYWlsZWQgdGVzdHM6ICAgICAgICAgICAgICAkbnVtX25vcm1hbF90ZXN0c19mYWlsZWQKK04gKyBmcm9tIHRoaXMgZmFpbCBjb21waWxhdGlvbjogICAgICAgICRudW1fbm9ybWFsX3Rlc3RzX2NvbXBpbGVfZXJyb3IKK04gKyBmcm9tIHRoaXMgdGltZWQgb3V0ICAgICAgICAgICAgICAgICRudW1fbm9ybWFsX3Rlc3RzX3RpbWVkX291dAorTiBOdW1iZXIgb2Ygc3VjY2Vzc2Z1bCB0ZXN0czogICAgICAgICAgJG51bV9ub3JtYWxfdGVzdHNfc3VjY2Vzc2Z1bAorTiArIGZyb20gdGhpcyB3ZXJlIHZlcmlmaWVkOiAgICAgICAgICAgJG51bV9ub3JtYWxfdGVzdHNfdmVyaWZpZWQKKworT3JwaGFuZWQgdGVzdHM6CitPIE51bWJlciBvZiBmYWlsZWQgdGVzdHM6ICAgICAgICAgICAgICAkbnVtX29ycGhhbmVkX3Rlc3RzX2ZhaWxlZAorTyArIGZyb20gdGhpcyBmYWlsIGNvbXBpbGF0aW9uOiAgICAgICAgJG51bV9vcnBoYW5lZF90ZXN0c19jb21waWxlX2Vycm9yCitPICsgZnJvbSB0aGlzIHRpbWVkIG91dCAgICAgICAgICAgICAgICAkbnVtX29ycGhhbmVkX3Rlc3RzX3RpbWVkX291dAorTyBOdW1iZXIgb2Ygc3VjY2Vzc2Z1bCB0ZXN0czogICAgICAgICAgJG51bV9vcnBoYW5lZF90ZXN0c19zdWNjZXNzZnVsCitPICsgZnJvbSB0aGlzIHdlcmUgdmVyaWZpZWQ6ICAgICAgICAgICAkbnVtX29ycGhhbmVkX3Rlc3RzX3ZlcmlmaWVkCitFT0YKKworfQorCisjIEZ1bmN0aW9uIHRoYXQgZXhlY3V0ZXN0IHRoZSB0ZXN0cyBzcGVjaWZpZWQgaW4gdGhlIGdpdmVuIGxpc3QKK3N1YiBleGVjdXRlX3Rlc3RsaXN0Cit7CisgICAgbXkgKCRmaWxlbmFtZSkgPSBAXzsKKyAgICAjIG9wZW5pbmcgdGVzdGxpc3QKKyAgICBvcGVuKFRFU1RTLCRmaWxlbmFtZSkgb3IgZXJyb3IgKCJDb3VsZCBub3Qgb3BlbiAgJGZpbGVuYW1lXG4iLCAxKTsKK1RFU1Q6IHdoaWxlICg8VEVTVFM+KSB7CisgICAgICAgIGlmICgvXlxzKiMvKSB7bmV4dCBURVNUO30KKyAgICAgICAgaWYgKC9eXHMqJC8pIHtuZXh0IFRFU1Q7fQorICAgICAgICAkb3B0X3Rlc3QgPSAkXzsKKyAgICAgICAgY2hvbXAgKCRvcHRfdGVzdCk7CisgICAgICAgIGV4ZWN1dGVfc2luZ2xlX3Rlc3QgKCk7CisgICAgfQorIyBwcmludCBEdW1wZXIoQHRlc3RfcmVzdWx0cyk7Cit9CisKKyMgRnVuY3Rpb24gdGhhdCBleGVjdXRlcyBhIHN5c3RlbSBjb21tYW5kIGJ1dCB0YWtlcyBjYXJlIG9mIHRoZSBnbG9iYWwgdGltZW91dAorIyBJZiBjb21tYW5kIGRpZCBub3QgZmluaXNoIGluYmV0d2VlbiByZXR1cm5zICctJyBvdGhlcndpc2UgdGhlIGV4aXQgc3RhdHVzIG9mCisjIHRoZSBzeXN0ZW0gY29tbWFuZAorc3ViIHRpbWVkX3N5c19jb21tYW5kCit7CisgICAgbXkgKCRjb21tYW5kKSA9IEBfOworICAgIG15ICRleGl0X3N0YXR1cyA9ICctJzsKKworIyBzZXQgdXAgdGhlIHRpbWVvdXQgZm9yIHRoZSBjb21tYW5kCisgICAgZXZhbCB7CisgICAgICAgIGxvY2FsICRTSUd7QUxSTX0gPSBzdWIge2RpZSAiYWxhcm1cbiJ9OworICAgICAgICBhbGFybSAkdGltZW91dDsKKyAgICAgICAgbG9nX21lc3NhZ2VfYWRkICgiU3RhcnRpbmcgY29tbWFuZCBcIiRjb21tYW5kXCIiKTsKKyAgICAgICAgJGV4aXRfc3RhdHVzID0gc3lzdGVtICgkY29tbWFuZCk7CisgICAgICAgIGFsYXJtIDA7CisgICAgfTsKKyMgY2hlY2sgaWYgY29tbWFuZCBmaW5pc2hlZCBkdXJpbmcgdGhlIG1heGltdW0gZXhlY3V0aW9uIHRpbWUKKyAgICBpZiAoJEAgZXEgImFsYXJtXG4iKSB7CisjIHRlc3QgdGltZWQgb3V0CisjCQlteSAkcGlkID0gVW5peDo6UElELT5uZXcoKTsKKyMJCSRwaWQtPmdldF9waWRvZigkY29tbWFuZCwgMSk7CisjCQkkcGlkLT5raWxsKCk7CisgICAgICAgIGlmICgkZGVidWdfbW9kZSkgeworCSAgICBsb2dfbWVzc2FnZV9hZGQgKCJDb21tYW5kIFwiJGNvbW1hbmRcIiByZWFjaGVkIG1heCBleGVjdXRpb24gdGltZS5cbiIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAiVE8iOworICAgIH0KKyMgdGVzdCBmaW5pc2hlZAorICAgIHJldHVybiAkZXhpdF9zdGF0dXM7Cit9CisKKyMgRnVuY3Rpb24gdGhhdCBydW5zIHRoZSB0ZXN0cyBnaXZlbiBhcyBhIGFycmF5IGNvbnRhaW5pbmcgdGhlIHRlc3RuYW1lcworIyBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHBlcmNlbnQgdmFsdWVzIG9mIHRoZSBwYXNzZWQgdGVzdHMgYW5kIHRoZQorIyBzdWNjZXNzZnVsIGNyb3NzdGVzdHMuCitzdWIgcnVuX3Rlc3QKK3sKKyAgICBteSAoJHRlc3RuYW1lLCAkb3JwaGFuKSA9IEBfOworICAgIG15ICRiaW5fbmFtZSwgJGNiaW5fbmFtZTsKKyAgICBteSAkY21kLCAkZXhpdF9zdGF0dXMsICRmYWlsZWQ7CisgICAgbXkgJHJlc3VsdHRlc3QsICRyZXN1bHRjdGVzdDsKKworIyBwYXRoIHRvIHRlc3QgYW5kIGNyb3NzdGVzdCBlaXRoZXIgaW4gbm9ybWFsIG9yIGluIG9ycGhhbmVkIHZlcnNpb24KKyAgICBpZiAoJG9ycGhhbikgeworICAgICAgICAkYmluX25hbWUgID0gImJpbi8kb3B0X2xhbmcvb3JwaF90ZXN0XyR0ZXN0bmFtZSI7CisgICAgICAgICRjYmluX25hbWUgPSAiYmluLyRvcHRfbGFuZy9vcnBoX2N0ZXN0XyR0ZXN0bmFtZSI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgJGJpbl9uYW1lICA9ICJiaW4vJG9wdF9sYW5nL3Rlc3RfJHRlc3RuYW1lIjsKKyAgICAgICAgJGNiaW5fbmFtZSA9ICJiaW4vJG9wdF9sYW5nL2N0ZXN0XyR0ZXN0bmFtZSI7CisgICAgfQorIyBDaGVjayBpZiBleGVjdXRhYmxlcyBleGlzdAorICAgIGlmICghIC1lICRiaW5fbmFtZSkgeworICAgICAgICB0ZXN0X2Vycm9yICgiQ291bGQgbm90IGZpbmQgZXhlY3V0YWJsZSBcIiRiaW5fbmFtZVwiLiIpOworICAgICAgICByZXR1cm4gKCd0ZXN0JyA9PiAnLScsICdjcm9zc3Rlc3QnID0+ICctJyk7CisgICAgfQorIyBydW4gdGhlIHRlc3QKKyAgICAkY21kID0gIiRlbnZfc2V0X3RocmVhZHNfY29tbWFuZCAuLyRiaW5fbmFtZSA+JGJpbl9uYW1lLm91dCI7CisgICAgcHJpbnQgIlJ1bm5pbmcgdGVzdCB3aXRoICRudW10aHJlYWRzIHRocmVhZHMgLiI7CisgICAgJGV4aXRfc3RhdHVzID0gdGltZWRfc3lzX2NvbW1hbmQgKCRjbWQpOworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENoZWNrIGlmIHRlc3QgZmluaXNoZWQgd2l0aGluIG1heCBleGVjdXRpb24gdGltZQorICAgIGlmICgkZXhpdF9zdGF0dXMgZXEgJ1RPJykgeworICAgICAgICBwcmludCAiLi4uLiBmYWlsZWQgKHRpbWVvdXQpXG4iOworICAgICAgICByZXR1cm4gKCd0ZXN0JyA9PiAnVE8nLCAnY3Jvc3N0ZXN0JyA9PiAnLScpCisgICAgfQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGNoZWNrIGlmIGFsbCB0ZXN0cyB3ZXJlIHN1Y2Nlc3NmdWwKKyAgICAkZmFpbGVkID0gJGV4aXRfc3RhdHVzID4+IDg7CisgICAgaWYgKCRmYWlsZWQgPCAwIG9yICRmYWlsZWQgPiAxMDApIHsgJGZhaWxlZCA9IDEwMDsgfQorICAgICRyZXN1bHR0ZXN0ID0gMTAwIC0gJGZhaWxlZDsKKyAgICBpZiAoJHJlc3VsdHRlc3QgZXEgMTAwKSB7CisgICAgICAgIHByaW50ICIuLi4uIHN1Y2Nlc3MgLi4uIjsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludCAiLi4uLiBmYWlsZWQgJGZhaWxlZFwlIG9mIHRoZSB0ZXN0c1xuIjsKKyAgICAgICAgcmV0dXJuICgndGVzdCcgPT4gJHJlc3VsdHRlc3QsICdjcm9zc3Rlc3QnID0+ICctJyk7CisgICAgfQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZG8gY3Jvc3N0ZXN0CisjIGNoZWNrIGlmIGV4ZWN1dGFibGUgZXhpc3QKKyAgICBpZiAoISAtZSAkY2Jpbl9uYW1lKSB7CisgICAgICAgIHRlc3RfZXJyb3IgKCJDb3VsZCBub3QgZmluZCBleGVjdXRhYmxlIFwiJGNiaW5fbmFtZVwiLiIpOworICAgICAgICBwcmludCAiLi4uIG5vdCB2ZXJpZmllZCAoY3Jvc3N0ZXN0IG1pc3NpbmcpXG4iOworICAgICAgICByZXR1cm4gKCd0ZXN0JyA9PiAkcmVzdWx0dGVzdCwgJ2Nyb3NzdGVzdCcgPT4gJy0nKTsKKyAgICB9CisjIHJ1biBjcm9zc3Rlc3QKKyMgVGVzdCB3YXMgc3VjY2Vzc2Z1bCwgc28gaXQgbWFrZXMgc2Vuc2UgdG8gcnVuIHRoZSBjcm9zc3Rlc3QKKyAgICAkY21kID0gIiRlbnZfc2V0X3RocmVhZHNfY29tbWFuZCAuLyRjYmluX25hbWUgPiAkY2Jpbl9uYW1lLm91dCI7CisgICAgJGV4aXRfc3RhdHVzID0gdGltZWRfc3lzX2NvbW1hbmQgKCRjbWQpOworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENoZWNrIGlmIGNyb3NzdGVzdCBmaW5pc2hlZCB3aXRoaW4gbWF4IGV4ZWN1dGlvbiB0aW1lCisgICAgaWYgKCRleGl0X3N0YXR1cyBlcSAnVE8nKSB7CisgICAgICAgIHByaW50ICIuLi4gbm90IHZlcmlmaWVkICh0aW1lb3V0KVxuIjsKKyAgICAgICAgcmV0dXJuICgndGVzdCcgPT4gJHJlc3VsdCwgJ2Nyb3NzdGVzdCcgPT4gJ1RPJyk7CisgICAgfQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIHRlc3QgaWYgY3Jvc3N0ZXN0cyBmYWlsZWQgYXMgZXhwZWN0ZWQKKyAgICAkcmVzdWx0Y3Rlc3QgPSAkZXhpdF9zdGF0dXMgPj4gODsKKyAgICBpZiAoJHJlc3VsdGN0ZXN0ID4gMCkgeworICAgICAgICBwcmludCAiLi4uIGFuZCB2ZXJpZmllZCB3aXRoICRyZXN1bHRjdGVzdFwlIGNlcnRhaW50eVxuIjsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludCAiLi4uIGJ1dCBtaWdodCBiZSBsdWNreVxuIjsKKyAgICB9CisgICAgcmV0dXJuICgndGVzdCcgPT4gJHJlc3VsdHRlc3QsICdjcm9zc3Rlc3QnID0+ICRyZXN1bHRjdGVzdCk7CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK30KKworIyBGdW5jdGlvbiB0aGF0IGdlbmVyYXRlcyB0aGUgdGVzdCBiaW5hcmllcyBvdXQgb2YgdGhlIHNvdXJjZWNvZGUKK3N1YiBjb21waWxlX3NyYworeworICAgIG15ICgkdGVzdG5hbWUsICRvcnBoYW4pID0gQF87CisgICAgcHJpbnQgIkNvbXBpbGluZyBzb3VyZXMgLi4uLi4uLi4uLi4uIjsKKyAgICBpZiAoJG9ycGhhbikgeworIyBNYWtlIG9ycGhhbmVkIHRlc3RzCisgICAgICAgICRleGVjX25hbWUgICAgID0gImJpbi8kb3B0X2xhbmcvb3JwaF90ZXN0XyR0ZXN0bmFtZSI7CisgICAgICAgICRjcm9zc2V4ZV9uYW1lID0gImJpbi8kb3B0X2xhbmcvb3JwaF9jdGVzdF8kdGVzdG5hbWUiOworICAgICAgICAkcmVzdWx0dGVzdCAgPSBzeXN0ZW0gKCJtYWtlICRleGVjX25hbWUgPiAkZXhlY19uYW1lXF9jb21waWxlLmxvZyIgKTsKKyAgICAgICAgJHJlc3VsdGN0ZXN0ID0gc3lzdGVtICgibWFrZSAkY3Jvc3NleGVfbmFtZSA+ICRjcm9zc2V4ZV9uYW1lXF9jb21waWxlLmxvZyIgKTsKKyAgICB9IGVsc2UgeworIyBNYWtlIHRlc3QKKyAgICAgICAgJGV4ZWNfbmFtZSAgICAgPSAiYmluLyRvcHRfbGFuZy90ZXN0XyR0ZXN0bmFtZSI7CisgICAgICAgICRjcm9zc2V4ZV9uYW1lID0gImJpbi8kb3B0X2xhbmcvY3Rlc3RfJHRlc3RuYW1lIjsKKyAgICAgICAgJHJlc3VsdHRlc3QgID0gc3lzdGVtICgibWFrZSAkZXhlY19uYW1lID4gJGV4ZWNfbmFtZVxfY29tcGlsZS5sb2ciICk7CisgICAgICAgICRyZXN1bHRjdGVzdCA9IHN5c3RlbSAoIm1ha2UgJGNyb3NzZXhlX25hbWUgPiAkY3Jvc3NleGVfbmFtZVxfY29tcGlsZS5sb2ciICk7CisgICAgfQorICAgIGlmICgkcmVzdWx0dGVzdCkgeyB0ZXN0X2Vycm9yICgiQ29tcGlsYXRpb24gb2YgdGhlIHRlc3QgZmFpbGVkLiIpOyB9CisgICAgaWYgKCRyZXN1bHRjdGVzdCl7IHRlc3RfZXJyb3IgKCJDb21waWxhdGlvbiBvZiB0aGUgY3Jvc3N0ZXN0IGZhaWxlZC4iKTsgfQorCisgICAgaWYgKCRyZXN1bHR0ZXN0IG9yICRyZXN1bHRjdGVzdCkgeworICAgICAgICBwcmludCAiLi4uLiBmYWlsZWRcbiI7CisgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ICIuLi4uIHN1Y2Nlc3NcbiI7CisgICAgICAgIHJldHVybiAxOworICAgIH0KK30KKworIyBGdW5jdGlvbiB3aGljaCBwcmVwYXJlIHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlOgorc3ViIGluaXRfZGlyZWN0b3J5X3N0cnVjdHVyZQoreworICAgIG15ICgkbGFuZ3VhZ2UpID0gQF87CisgICAgaWYgKC1lICJiaW4iICYmIC1kICJiaW4iKSB7IHdhcm5pbmcgKCJPbGQgYmluYXJ5IGRpcmVjdG9yeSBkZXRlY3RlZCEiKTt9CisgICAgZWxzZSB7IHN5c3RlbSAoIm1rZGlyIGJpbiIpOyB9CisgICAgaWYgKC1lICJiaW4vJGxhbmd1YWdlIiAmJiAtZCAiYmluLyRsYW5ndWFnZSIpIHsKKyAgICAgICAgd2FybmluZyAoIk9sZCBiaW5hcnkgZGlyZWN0b3J5IGZvciBsYW5ndWFnZSAkbGFuZ3VhZ2UgZm91bmQuIik7fQorICAgIGVsc2UgeyBzeXN0ZW0gKCJta2RpciBiaW4vJGxhbmd1YWdlIik7IH0KK30KKworIyBGdW5jdGlvbiB0aGF0IGdlbmVyYXRlcyB0aGUgc291cmNlY29kZSBmb3IgdGhlIGdpdmVuIHRlc3QKK3N1YiBtYWtlX3NyYworeworICAgIG15ICgkdGVzdG5hbWUsICRvcnBoYW4pID0gQF87CisgICAgbXkgJHRlbXBsYXRlX2ZpbGU7CisgICAgbXkgJHNyY19uYW1lOworCisgICAgJHRlbXBsYXRlX2ZpbGUgPSAiJGRpci8kdGVzdG5hbWUuJGV4dGVuc2lvbiI7CisgICAgaWYgKCEtZSAkdGVtcGxhdGVfZmlsZSkgeyB0ZXN0X2Vycm9yICgiQ291bGQgbm90IGZpbmQgdGVtcGxhdGUgZm9yIFwiJHRlc3RuYW1lXCIiKTsgfQorCisgICAgcHJpbnQgIkdlbmVyYXRpbmcgc291cmNlcyAuLi4uLi4uLi4uIjsKKyAgICBpZiAoJG9ycGhhbikgeworIyBNYWtlIG9ycGhhbmVkIHRlc3RzCisgICAgICAgICRzcmNfbmFtZSA9ICJiaW4vJG9wdF9sYW5nL29ycGhfdGVzdF8kdGVzdG5hbWUuJGV4dGVuc2lvbiI7CisgICAgICAgICRyZXN1bHR0ZXN0ID0gc3lzdGVtICgiLi8kdGVtcGxhdGVwYXJzZXJuYW1lIC0tdGVzdCAtLW9ycGhhbiAkdGVtcGxhdGVfZmlsZSAkc3JjX25hbWUiKTsKKyAgICAgICAgJHNyY19uYW1lID0gImJpbi8kb3B0X2xhbmcvb3JwaF9jdGVzdF8kdGVzdG5hbWUuJGV4dGVuc2lvbiI7CisgICAgICAgICRyZXN1bHRjdGVzdCA9IHN5c3RlbSAoIi4vJHRlbXBsYXRlcGFyc2VybmFtZSAtLWNyb3NzdGVzdCAtLW9ycGhhbiAkdGVtcGxhdGVfZmlsZSAkc3JjX25hbWUiKTsKKyAgICB9IGVsc2UgeworIyBNYWtlIHRlc3QKKyAgICAgICAgJHNyY19uYW1lID0gImJpbi8kb3B0X2xhbmcvdGVzdF8kdGVzdG5hbWUuJGV4dGVuc2lvbiI7CisgICAgICAgICRyZXN1bHR0ZXN0ID0gc3lzdGVtICgiLi8kdGVtcGxhdGVwYXJzZXJuYW1lIC0tdGVzdCAtLW5vb3JwaGFuICR0ZW1wbGF0ZV9maWxlICRzcmNfbmFtZSIpOworICAgICAgICAkc3JjX25hbWUgPSAiYmluLyRvcHRfbGFuZy9jdGVzdF8kdGVzdG5hbWUuJGV4dGVuc2lvbiI7CisgICAgICAgICRyZXN1bHRjdGVzdCA9IHN5c3RlbSAoIi4vJHRlbXBsYXRlcGFyc2VybmFtZSAtLWNyb3NzdGVzdCAtLW5vb3JwaGFuICR0ZW1wbGF0ZV9maWxlICRzcmNfbmFtZSIpOworICAgIH0KKyAgICBpZiAoJHJlc3VsdHRlc3QpIHsgdGVzdF9lcnJvciAoIkdlbmVyYXRpb24gb2Ygc291cmNlY29kZSBmb3IgdGhlIHRlc3QgZmFpbGVkLiIpOyB9CisgICAgaWYgKCRyZXN1bHRjdGVzdCl7IHRlc3RfZXJyb3IgKCJHZW5lcmF0aW9uIG9mIHNvdXJjZWNvZGUgZm9yIHRoZSBjcm9zc3Rlc3QgZmFpbGVkLiIpOyB9CisKKyAgICBpZiAoJHJlc3VsdHRlc3Qgb3IgJHJlc3VsdGN0ZXN0KSB7CisgICAgICAgIHByaW50ICIuLi4uIGZhaWxlZFxuIjsKKyAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgIHByaW50ICIuLi4uIHN1Y2Nlc3NcbiI7CisgICAgICAgcmV0dXJuIDE7CisgICAgfQorfQorCisjIEZ1bmN0aW9uIHdoaWNoIGNoZWNrcyBpZiBhIGdpdmVuIHRlc3QgaXMgb3JwaGFuYWJsZQorc3ViIHRlc3RfaXNfb3JwaGFuYWJsZQoreworICAgIG15ICgkdGVzdG5hbWUpID0gQF87CisgICAgbXkgJHNyYzsKKyAgICBteSAkZmlsZSA9ICIkZGlyLyR0ZXN0bmFtZS4kZXh0ZW5zaW9uIjsKKyAgICBpZighIC1lICRmaWxlKXsgdGVzdF9lcnJvciAoIkNvdWxkIG5vdCBmaW5kIHRlc3QgZmlsZSAkZmlsZVxuIik7fQorICAgIG9wZW4gKFRFU1QsICI8JGZpbGUiKSBvciB0ZXN0X2Vycm9yICgiQ291bGQgbm90IG9wZW4gdGVzdCBmaWxlICRmaWxlXG4iKTsKKyAgICB3aGlsZSAoPFRFU1Q+KSB7ICRzcmMgLj0gJF87IH0KKyAgICBjbG9zZSAoVEVTVCk7CisgICAgcmV0dXJuICRzcmMgPX4vb21wdHM6b3JwaGFuLzsKK30KKworc3ViIHdyaXRlX3Jlc3VsdF9maWxlX2hlYWQKK3sKKyAgICBvcGVuIChSRVNVTFRTLCAiPiRvcHRfcmVzdWx0c2ZpbGUiKSBvciBlcnJvciAoIkNvdWxkIG5vdCBvcGVuIGZpbGUgJyRvcHRfcmVzdWx0c2ZpbGUnIHRvIHdyaXRlIHJlc3VsdHMuIiwgMSk7CisgICAgJHJlc3VsdGxpbmUgPSBzcHJpbnRmICIlLTI1cyAlLXNcbiIsICIjVGVzdGVkIERpcmVjdGl2ZSIsICJcdHRcdGN0XHRvdFx0b2N0IjsKKyAgICBwcmludCBSRVNVTFRTICRyZXN1bHRsaW5lOworfQorCisjIEZ1bmN0aW9uIHdoaWNoIGFkZHMgYSByZXN1bHQgdG8gdGhlIGxpc3Qgb2YgcmVzdWx0cworc3ViIGFkZF9yZXN1bHQKK3sKKyAgICBteSAoJHRlc3RuYW1lLCAkcmVzdWx0KSA9IEBfOworIwlwcmludCBEdW1wZXIoQHskcmVzdWx0fSk7CisKKyAgICAkbnVtX2NvbnN0cnVjdHMrKzsKKworICAgIG9wZW4gKFJFU1VMVFMsICI+PiRvcHRfcmVzdWx0c2ZpbGUiKSBvciBlcnJvciAoIkNvdWxkIG5vdCBvcGVuIGZpbGUgJyRvcHRfcmVzdWx0c2ZpbGUnIHRvIHdyaXRlIHJlc3VsdHMuIiwgMSk7CisKKyAgICBpZiAoJHskcmVzdWx0fVswXVswXSkgeworCQkkbnVtX3Rlc3RzICsrO30KKworCWlmICgkb3B0X2NvbXBpbGUgYW5kICR7JHJlc3VsdH1bMF1bMV0gZXEgMCkgeworCQkkeyRyZXN1bHR9WzBdWzJde3Rlc3R9ICAgICAgPSAnY2UnOworCQkkeyRyZXN1bHR9WzBdWzJde2Nyb3NzdGVzdH0gPSAnLSc7CisJCSRudW1fbm9ybWFsX3Rlc3RzX2NvbXBpbGVfZXJyb3IrKzsKKwkgICAgJG51bV9ub3JtYWxfdGVzdHNfZmFpbGVkKys7CisJfQorCisgICAgaWYgKCRvcHRfcnVuIGFuZCAkeyRyZXN1bHR9WzBdWzJdIGFuZCAkeyRyZXN1bHR9WzBdWzJde3Rlc3R9IG5lICdjZScpIHsKKyAgICAgICAgaWYgKCR7JHJlc3VsdH1bMF1bMl17dGVzdH0gPT0gMTAwKSB7CisgICAgICAgICAgICAkbnVtX25vcm1hbF90ZXN0c19zdWNjZXNzZnVsKys7CisgICAgICAgICAgICBpZiAoJHskcmVzdWx0fVswXVsyXXtjcm9zc3Rlc3R9ID09IDEwMCl7CisJCQkJJG51bV9ub3JtYWxfdGVzdHNfdmVyaWZpZWQrKzt9CisJCX0gZWxzaWYgKCR7JHJlc3VsdH1bMF1bMl17dGVzdH0gZXEgJ1RPJyl7CisJCQkkbnVtX25vcm1hbF90ZXN0c190aW1lZF9vdXQrKzsKKwkJCSRudW1fbm9ybWFsX3Rlc3RzX2ZhaWxlZCsrOworCQl9IGVsc2UgeworCQkJJG51bV9ub3JtYWxfdGVzdHNfZmFpbGVkKys7CisJCX0KKyAgICB9CisgICAgJHJlc3VsdGxpbmUgPSAiJHskcmVzdWx0fVswXVsyXXt0ZXN0fVx0JHskcmVzdWx0fVswXVsyXXtjcm9zc3Rlc3R9XHQiOworCisgICAgaWYgKCR7JHJlc3VsdH1bMV1bMF0pIHsKKwkJJG51bV90ZXN0cyArKzt9CisgICAgZWxzZSB7ICRyZXN1bHRsaW5lIC49ICItXHQtXG4iOyB9CisKKyAgICBpZiAoJG9wdF9jb21waWxlIGFuZCAkeyRyZXN1bHR9WzFdWzFdIGVxIDApIHsKKwkJJHskcmVzdWx0fVsxXVsyXXt0ZXN0fSAgICAgID0gJ2NlJzsKKwkJJHskcmVzdWx0fVsxXVsyXXtjcm9zc3Rlc3R9ID0gJy0nOworCQkkbnVtX29ycGhhbmVkX3Rlc3RzX2NvbXBpbGVfZXJyb3IrKzsKKwkJJG51bV9vcnBoYW5lZF90ZXN0c19mYWlsZWQrKzsKKwl9CisKKyAgICBpZiAoJG9wdF9ydW4gYW5kICR7JHJlc3VsdH1bMV1bMl0gYW5kICR7JHJlc3VsdH1bMV1bMl17dGVzdH0gbmUgJ2NlJykgeworICAgICAgICBpZiAoJHskcmVzdWx0fVsxXVsyXXt0ZXN0fSA9PSAxMDApIHsKKyAgICAgICAgICAgICRudW1fb3JwaGFuZWRfdGVzdHNfc3VjY2Vzc2Z1bCsrOworICAgICAgICAgICAgaWYgKCR7JHJlc3VsdH1bMV1bMl17Y3Jvc3N0ZXN0fSA9PSAxMDApeworCQkJCSRudW1fb3JwaGFuZWRfdGVzdHNfdmVyaWZpZWQrKzt9CisJCX0gZWxzaWYgKCR7JHJlc3VsdH1bMV1bMl17dGVzdH0gZXEgJ1RPJyl7CisJCQkkbnVtX29ycGhhbmVkX3Rlc3RzX3RpbWVkX291dCsrOworCQkJJG51bV9vcnBoYW5lZF90ZXN0c19mYWlsZWQrKzsKKyAgICAgICAgfSBlbHNlIHsKKwkJCSRudW1fb3JwaGFuZWRfdGVzdHNfZmFpbGVkKys7CisJCX0KKyAgICB9CisgICAgJHJlc3VsdGxpbmUgLj0gIiR7JHJlc3VsdH1bMV1bMl17dGVzdH1cdCR7JHJlc3VsdH1bMV1bMl17Y3Jvc3N0ZXN0fVxuIjsKKworICAgICRudW1fZmFpbGVkX3Rlc3RzID0gJG51bV9ub3JtYWxfdGVzdHNfZmFpbGVkICsgJG51bV9vcnBoYW5lZF90ZXN0c19mYWlsZWQ7CisJJG51bV9mYWlsZWRfY29tcGlsYXRpb24gPSAkbnVtX25vcm1hbF90ZXN0c19jb21waWxlX2Vycm9yICsgJG51bV9vcnBoYW5lZF90ZXN0c19jb21waWxlX2Vycm9yOworCSRudW1fc3VjY2Vzc2Z1bF90ZXN0cyA9ICRudW1fbm9ybWFsX3Rlc3RzX3N1Y2Nlc3NmdWwgKyAkbnVtX29ycGhhbmVkX3Rlc3RzX3N1Y2Nlc3NmdWw7CisJJG51bV92ZXJpZmllZF90ZXN0cyA9ICRudW1fbm9ybWFsX3Rlc3RzX3ZlcmlmaWVkICsgJG51bV9vcnBoYW5lZF90ZXN0c192ZXJpZmllZDsKKworICAgICRyZXN1bHRsaW5lMiA9IHNwcmludGYgIiUtMjVzICUtcyIsICIkdGVzdG5hbWUiLCAiXHQkcmVzdWx0bGluZSI7CisgICAgcHJpbnQgUkVTVUxUUyAkcmVzdWx0bGluZTI7Cit9CisKKyMgRnVuY3Rpb24gd2hpY2ggZXhlY3V0ZXMgYSBzaW5nbGUgdGVzdAorc3ViIGV4ZWN1dGVfc2luZ2xlX3Rlc3QKK3sKKyAgICBteSBAcmVzdWx0OworICAgIGluaXRfbGFuZ3VhZ2Vfc2V0dGluZ3MgKCRvcHRfbGFuZyk7CisgICAgaW5pdF9kaXJlY3Rvcnlfc3RydWN0dXJlICgkb3B0X2xhbmcpOworICAgIGxvZ19tZXNzYWdlX2FkZCAoIlRlc3RpbmcgZm9yIFwiJG9wdF90ZXN0XCI6Iik7CisgICAgcHJpbnQgIlRlc3RpbmcgZm9yIFwiJG9wdF90ZXN0XCI6XG4iOworIyB0ZXN0cyBpbiBub3JtYWwgbW9kZQorICAgIGlmICgkb3B0X2NvbXBpbGUpeyAkcmVzdWx0WzBdWzBdID0gbWFrZV9zcmMgKCRvcHRfdGVzdCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHRbMF1bMV0gPSBjb21waWxlX3NyYyAoJG9wdF90ZXN0LCAwKTt9CisgICAgaWYgKCRvcHRfcnVuICYmICRyZXN1bHRbMF1bMV0gPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAkcmVzdWx0WzBdWzJdID0ge3J1bl90ZXN0ICgkb3B0X3Rlc3QsIDApfTt9CisjIHRlc3RzIGluIG9ycGhhbmVkIG1vZGUKKyAgICBpZiAoJG9wdF9vcnBoYW4gJiYgdGVzdF9pc19vcnBoYW5hYmxlKCRvcHRfdGVzdCkpeworICAgICAgICBsb2dfbWVzc2FnZV9hZGQgKCJUZXN0aW5nIGZvciBcIiRvcHRfdGVzdFwiIGluIG9ycGhhbmVkIG1vZGU6Iik7CisgICAgICAgIHByaW50ICIrIG9ycGhhbmVkIG1vZGU6XG4iOworICAgICAgICBpZiAoJG9wdF9jb21waWxlKSB7ICRyZXN1bHRbMV1bMF0gPSBtYWtlX3NyYyAoJG9wdF90ZXN0LCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVzdWx0WzFdWzFdID0gY29tcGlsZV9zcmMgKCRvcHRfdGVzdCwgMSk7fQorICAgICAgICBpZiAoJG9wdF9ydW4gJiYgJHJlc3VsdFsxXVsxXSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdFsxXVsyXSA9IHtydW5fdGVzdCAoJG9wdF90ZXN0LCAxKX07fQorICAgIH0KKyAgICBhZGRfcmVzdWx0KCRvcHRfdGVzdCwgXEByZXN1bHQpOworfQorCisjIEZ1bmN0aW9uIHRoYXQgcHJpbnRzIGluZm8gYWJvdXQgYSBnaXZlbiB0ZXN0CitzdWIgcHJpbnRfdGVzdGluZm8KK3sKKyAgICBpbml0X2xhbmd1YWdlX3NldHRpbmdzKCRvcHRfbGFuZyk7CisgICAgbXkgJGRvYyA9ICIiOworICAgIG15ICRmaWxlID0gJGRpci4iLyIuJG9wdF90ZXN0aW5mby4iLiIuJGV4dGVuc2lvbjsKKyAgICBpZiAoISAtZSAkZmlsZSkge2Vycm9yICgiQ291bGQgbm90IGZpbmQgdGVtcGxhdGUgZm9yIHRlc3QgJG9wdF90ZXN0aW5mbyIsIDUpO30KKyAgICBvcGVuIChURVNULCI8JGZpbGUiKSBvciBlcnJvciAoIkNvdWxkIG5vdCBvcGVuIHRlbXBsYXRlIGZpbGUgXCIkZmlsZVwiIGZvciB0ZXN0ICRvcHRfdGVzdGluZm8iLCA2KTsKKyAgICB3aGlsZSAoPFRFU1Q+KSB7JGRvYyAuPSAkXzt9CisgICAgY2xvc2UgKFRFU1QpOworCisgICAgKG15ICRvbXBfdmVyc2lvbikgPSBnZXRfdGFnX3ZhbHVlcyAoIm9tcHRzOm9tcHZlcnNpb24iLCAkZG9jKTsKKyAgICAobXkgJGRlcGVuZGVuY2VzKSA9IGdldF90YWdfdmFsdWVzICgib21wdHM6ZGVwZW5kZW5jZXMiLCAkZG9jKTsKKyAgICAobXkgJGRlc2NyaXB0aW9uKSA9IGdldF90YWdfdmFsdWVzICgib21wdHM6dGVzdGRlc2NyaXB0aW9uIiwgJGRvYyk7CisgICAgbXkgJG9ycGhhbmFibGUgPSAnbm8nOworICAgIGlmICgkZG9jID1+IC9vbXB0czpvcnBoYW4vKSB7JG9ycGhhbmFibGUgPSAneWVzJzt9CisgICAgcHJpbnQgPDxFT0Y7CitJbmZvIGZvciB0ZXN0ICRvcHRfdGVzdGluZm86CitPcGVuIE1QIHN0YW5kYXJkOiAkb21wX3ZlcnNpb24KK09ycGhhbmVkIG1vZGU6ICRvcnBoYW5hYmxlCitEZXBlbmRlbmNpZXM6ICAkZGVwZW5kZW5jZXMKK0Rlc2NyaXB0aW9uOiAgICRkZXNjcmlwdGlvbgorRU9GCit9CisKKyMgRnVuY3Rpb24gdGhhdCBpbml0aWFsaXplcyB0aGUgc2V0dGluZ3MgZm9yIHRoZSBnaXZlbiBsYW5ndWFnZQorc3ViIGluaXRfbGFuZ3VhZ2Vfc2V0dGluZ3MKK3sKKyAgICBteSAoJGxhbmd1YWdlKSA9IEBfOworICAgIGZvcmVhY2ggbXkgJGxhbmcgKEBsYW5ndWFnZXMpIHsKKyAgICAgICAgKG15ICRuYW1lKSA9IGdldF90YWdfdmFsdWVzICgibGFuZ3VhZ2VuYW1lIiwgJGxhbmcpOworICAgICAgICBpZiAoJG5hbWUgZXEgJGxhbmd1YWdlKSB7CisgICAgICAgICAgICAoJGV4dGVuc2lvbikgPSBnZXRfdGFnX3ZhbHVlcyAoImZpbGVleHRlbnNpb24iLCAkbGFuZyk7CisgICAgICAgICAgICAoJGRpcikgICAgICAgPSBnZXRfdGFnX3ZhbHVlcyAoImRpciIsICRsYW5nKTsKKyAgICAgICAgICAgICgkdGVtcGxhdGVwYXJzZXJuYW1lKSA9IGdldF90YWdfdmFsdWVzICgidGVtcGxhdGVwYXJzZXJuYW1lIiwgJGxhbmcpOworICAgICAgICAgICAgbGFzdDsKKyAgICAgICAgfQorICAgIH0KKyAgICAjIENoZWNrIGlmIHdlIGZvdW5kIHRoZSBzcGVjaWZpZWQgbGFuZ3VhZ2UgaW4gdGhlIGNvbmZpZyBmaWxlCisgICAgaWYgKCEkZXh0ZW5zaW9uIGFuZCAhJGRpcikgeworICAgICAgZXJyb3IgKCJMYW5ndWFnZSAkbGFuZ3VhZ2UgY291bGQgbm90IGJlIGZvdW5kLlxuIiwgMyk7CisgICAgfQorfQorCisKKworIyBGdW5jdGlvbiB0aGF0IHByaW50cyBhbGwgYXZhaWxhYmxlIHRlc3RzIGZvciB0aGUgZ2l2ZW4gbGFuZ3VhZ2UKK3N1YiBwcmludF9hdmFpbF90ZXN0cworeworICAgIGluaXRfbGFuZ3VhZ2Vfc2V0dGluZ3MoJG9wdF9sYW5nKTsKKyAgICBteSBAdGVzdHM7CisgICAgb3BlbmRpcihESVIsIiRkaXIiKSBvciBlcnJvciAoIkNvdWxkIG5vdCBvcGVuIGRpcmVjdG9yeSAkZGlyIiwgNCk7CisgICAgd2hpbGUoJF8gPSByZWFkZGlyKERJUikpIHsgaWYgKC9cLiRleHRlbnNpb24kLykge3MvXC4kZXh0ZW5zaW9uLy87IHB1c2ggKEB0ZXN0cywgJF8pO319CisgICAgY2xvc2VkaXIoRElSKTsKKyAgICBwcmludCAiRm91bmQgIi4oQHRlc3RzKS4iIHRlc3RzOlxuIi4gIi0iIHggMzAgLiAiXG4iOworICAgIGZvcmVhY2ggKEB0ZXN0cykgeyBwcmludCAkXy4iXG4iO30KK30KKworIyBGdW5jdGlvbiB0aGF0IHByaW50cyBhbGwgYXZhaWxhYmxlIHRlc3RzIGZvciB0aGUgZ2l2ZW4gbGFuZ3VhZ2UKK3N1YiBwcmludF9hdmFpbF9sYW5ncworeworICAgIGlmIChAbGFuZ3VhZ2VzID4gMCkgeworICAgICAgICBwcmludCAiQXZhaWxhYmxlIGxhbmd1YWdlczpcbiI7CisgICAgICAgIGZvcmVhY2ggKEBsYW5ndWFnZXMpIHsKKyAgICAgICAgICAgIChteSAkbmFtZSkgPSBnZXRfdGFnX3ZhbHVlcyAoImxhbmd1YWdlbmFtZSIsICRfKTsKKyAgICAgICAgICAgIHByaW50ICIkbmFtZVxuIjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ICJObyBsYW5ndWFnZXMgYXZhaWxhYmxlXG4iOworICAgIH0KK30KKworIyBGdW5jdGlvbiB0aGF0IHByaW50cyB0aGUgZXJyb3IgbWVzc2FnZQorc3ViIHByaW50X2hlbHBfdGV4dAoreworICAgIHByaW50IDw8RU9GOworcnVudGVzdC5wbCBbb3B0aW9uc10gW0ZJTEVdCisKK0V4ZWN1dGVzIHRoZSB0ZXN0cyBsaXN0ZWQgaW4gRklMRS4gRklMRSBoYXMgdG8gY29udGFpbiB0aGUgbmFtZXMgb2YgdGhlIHRlc3RzLAorb25lIHRlc3QgcGVyIGxpbmUuIExpbmVzIHN0YXJ0aW5nIHdpdGggJyMnIHdpbGwgYmUgaWdub3JlZC4KK0EgbGFuZ3VhZ2UgaGFzIHRvIGJlIHNwZWNpZmllZCBmb3IgYWxsIGNvbW1hbmRzIGV4Y2VwdCAtLWhlbHAgYW5kIC0tbGlzdGxhbmd1YWdlcy4KKworT3B0aW9uczoKKyAgLS1oZWxwICAgICAgICAgICAgZGlzcGxheXMgdGhpcyBoZWxwIG1lc3NhZ2UKKyAgLS1saXN0bGFuZ3VhZ2VzICAgbGlzdHMgYWxsIGF2YWlsYWJsZSBsYW5ndWFnZXMKKyAgLS1sYW5nPXMgICAgICAgICAgc2VsZWN0IGxhbmd1YWdlCisgIC0tbGlzdCAgICAgICAgICAgIGxpc3QgYXZhaWxhYmxlIHRlc3RzIGZvciBhIGxhbmd1YWdlCisgIC0tdGVzdGluZm89TkFNRSAgIHNob3cgaW5mbyBmb3IgdGVzdCBOQU1FCisgIC0tbnVtdGhyZWFkcz1OVU0gIHNldCBudW1iZXIgb2YgdGhyZWFkcyAob3ZlcndyaXRlcyBjb25maWcgZmlsZSBzZXR0aW5ncykKKyAgLS10ZXN0PU5BTUUgICAgICAgZXhlY3V0ZSBzaW5nbGUgdGVzdCBOQU1FCisgIC0tbm9jb21waWxlICAgICAgIGRvIG5vdCBjb21waWxlIHRlc3RzCisgIC0tbm9ydW4gICAgICAgICAgIGRvIG5vdCBydW4gdGVzdHMKKyAgLS1ub29ycGhhbiAgICAgICAgc3dpdGNoIG9mIG9ycGhhbmVkIHRlc3RzCisgIC0tcmVzdWx0ZmlsZT1OQU1FIHVzZSBOQU1FIGFzIHJlc3VsdGZpbGUgKG92ZXJ3cml0ZXMgY29uZmlnIGZpbGUgc2V0dGluZ3MpCitFT0YKK30KKworIyBGdW5jdGlvbiB0aGF0IHdyaXRlcyBhbiBlcnJvciBtZXNzYWdlIGZvciBhIGZhaWxlZCB0ZXN0IC8gcGFydCBvZiBhIHRlc3QKK3N1YiB0ZXN0X2Vycm9yCit7CisgICBteSAoJG1lc3NhZ2UpID0gQF87CisgICBsb2dfbWVzc2FnZV9hZGQgKCJFUlJPUjogJG1lc3NhZ2UiKTsKKyAgIGlmICgkZGlzcGxheV9lcnJvcnMgZXEgMSkgeyBwcmludCBTVERFUlIgIkVSUk9SOiAkbWVzc2FnZVxuIjsgfQorfQorCisjIEZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhbiB3YXJuaW5nIG1lc3NhZ2UKK3N1YiB3YXJuaW5nIHsKKyAgbXkgKCRtZXNzYWdlKSA9IEBfOworICBpZiAoJGRpc3BsYXlfd2FybmluZ3MgZXEgMSkgeyBwcmludCAiV2Fybmlvbmc6ICRtZXNzYWdlXG4iOyB9CisgIGxvZ19tZXNzYWdlX2FkZCAoIldhcm5pbmc6ICRtZXNzYWdlIik7Cit9CisKKyMgRnVuY3Rpb24gdGhhdCByZXR1cm5zIGFuIGVycm9yIG1lc3NhZ2UgYW5kIGV4aXRzIHdpdGggdGhlIHNwZWNpZmllZCBlcnJvciBjb2RlCitzdWIgZXJyb3IgeworICBteSAoJG1lc3NhZ2UsICRlcnJvcl9jb2RlKSA9IEBfOworICBpZiAoJGRpc3BsYXlfZXJyb3JzIGVxIDEpIHsgcHJpbnQgU1RERVJSICJFUlJPUjogJG1lc3NhZ2VcbiI7IH0KKyAgbG9nX21lc3NhZ2VfYWRkICgiRVJST1I6ICRtZXNzYWdlIik7CisgIGV4aXQgKCRlcnJvcl9jb2RlKTsKK30KKworIyBGdW5jdGlvbiB3aGljaCBhZGRzIGFuIG5ldyBlbnRyeSBpbnRvIHRoZSBsb2dmaWxlIHRvZ2V0aGVyIHdpdGggYSB0aW1lc3RhbXAKK3N1YiBsb2dfbWVzc2FnZV9hZGQKK3sKKyAgICAobXkgJG1lc3NhZ2UpID0gQF87CisgICAgKCRzZWMsJG1pbiwkaG91ciwkbWRheSwkbW9uLCR5ZWFyLCR3ZGF5LCR5ZGF0LCRpc2RzdCkgPSBsb2NhbHRpbWUoKTsKKyAgICBpZihsZW5ndGgoJGhvdXIpID09IDEpIHsgJGhvdXI9IjAkaG91ciI7IH0KKyAgICBpZihsZW5ndGgoJG1pbikgPT0gMSkgIHsgJG1pbj0iMCRtaW4iOyAgIH0KKyAgICBpZihsZW5ndGgoJHNlYykgPT0gMSkgIHsgJHNlYz0iMCRzZWMiOyAgIH0KKyAgICAkbW9uPSRtb24rMTsKKyAgICAkeWVhcj0keWVhcisxOTAwOworICAgIG9wZW4gKExPR0ZJTEUsIj4+JGxvZ2ZpbGUiKSBvciBkaWUgIkVSUk9SOiBDb3VsZCBub3QgY3JlYXRlICRsb2dmaWxlXG4iOworICAgIHByaW50IExPR0ZJTEUgIiRtZGF5LyRtb24vJHllYXIgJGhvdXIuJG1pbi4kc2VjOiAkbWVzc2FnZVxuIjsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS90ZW1wbGF0ZV9wYXJzZXJfYy5wbCBiL2ZpbmFsL3Rlc3RzdWl0ZS90ZW1wbGF0ZV9wYXJzZXJfYy5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zZDZmMzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL3RlbXBsYXRlX3BhcnNlcl9jLnBsCkBAIC0wLDAgKzEsMTE0IEBACisjIS91c3IvYmluL2VudiBwZXJsCisKKyMgb21wdHNfcGFyc2VyIFtvcHRpb25dIElORklMRSBPVVRGSUxFCisjIAorIyBDcmVhdHMgdGhlIHRlc3RzIGFuZCB0aGUgY3Jvc3N0ZXN0cyBmb3IgdGhlIE9wZW5NUC1UZXN0c3VpdGUgb3V0IG9mIGFuIHRlbXBsYXRlZmlsZXMgd2hpY2ggYXJlIGdpdmVuIHRvIHRoZSBwcm9ncmFtbS4KKyMgCisjIE9wdGlvbnM6CisjIC0tdGVzdDogCW1ha2UgdGVzdAorIyAtLWNyb3NzdGVzdDogCW1ha2UgY3Jvc3N0ZXN0CisjIC0tb3JwaGFuCWlmIHBvc3NpYmxlIGdlbmVyYXRlIHRlc3RzIHVzaW5nIG9ycGhhbiAKKyMKKyMgUmV0dXJuOgorIyAgICAgICBTdWNjZXM6ICAgICAgICAgICAgICAgICAwCisjICAgICAgIFRlbXBsYXRlIG5vdCBmb3VuZCAgICAgIC0xCisjCisKKyMgVXNpbmcgR2V0b3B0Ojpsb25nIHRvIGV4dHJhY3QgdGhlIHByb2dyYW1tIG9wdGlvbnMKK3VzZSBHZXRvcHQ6Okxvbmc7CisjIFVzaW5nIGZ1bmN0aW9uczogU2V0IG9mIHN1YnJvdXRpbmVzIHRvIG1vZGlmeSB0aGUgdGVzdGNvZGUKK3VzZSBvbXB0c19wYXJzZXJGdW5jdGlvbnM7CisKKyMgR2V0dGluZyBnaXZlbiBvcHRpb25zCitHZXRPcHRpb25zKCJ0ZXN0IiA9PiBcJHRlc3QsImNyb3NzdGVzdCIgPT4gXCRjcm9zc3Rlc3QsICJvcnBoYW4hIiA9PiBcJG9ycGhhbik7CisKKyMgUmVtYWluaW5nIGFyZ3VtZW50cyBhcmUgdGhlIHRlbXBsYXRlZmlsZXMuIAorIyBBZGRpbmcgdGhlc2UgdG8gdGhlIGxpc3Qgb2YgdG8gYmUgcGFyc2VkIGZpbGVzIGlmIHRoZXkgZXhpc3QuCisKK215ICR0ZW1wbGF0ZWZpbGU7CitteSAkc291cmNlZmlsZTsKK215ICRtYWlucHJvY3NyYyA9ICJvbXB0c19zdGFuZGFsb25lUHJvYy5jIjsgCisKKyR0ZW1wbGF0ZWZpbGUgPSAkQVJHVlswXTsKKyRvdXRmaWxlID0gJEFSR1ZbMV07CisKK2lmICghLWUgJHRlbXBsYXRlZmlsZSkgeworICAgIHByaW50ICJUZW1hcGx0ZSBmaWxlIG5vdCBmb3VuZCI7CisgICAgZXhpdCAtMTsKK30KKworCQorIyBDaGVja2luZyBpZiBvcHRpb25zIHdlcmUgdmFsaWQ6CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBwcmVwYXJhdGlvbnMgYW5kIGNoZWNrcyBmb3Igc291cmNlZmlsZXMKKworIyBSZWFkaW5nIHRoZSB0ZW1wbGF0ZSBmb3IgdGhlIHRlc3RzIAorb3BlbihURVNULCR0ZW1wbGF0ZWZpbGUpIG9yIGRpZSAiRXJyb3I6IENvdWxkIG5vdCBvcGVuIHRlbXBsYXRlICRzcmNmaWxlXG4iOword2hpbGUoPFRFU1Q+KXsgJHNyYyAuPSAkXzsgfQorY2xvc2UoVEVTVCk7CisKKyMgRXh0cmFjdGluZyB0aGUgc291cmNlIGZvciB0aGUgbWFpbnByb2dyYW1tIGFuZCBzYXZpbmcgaXQgaW4gJG1haW5wcm9jc3JjCitvcGVuKE1BSU5QUk9DLCRtYWlucHJvY3NyYykgb3IgZGllICJDb3VsZCBub3Qgb3BlbiB0aGUgc291cmNlZmlsZSBmb3IgdGhlIG1haW4gcHJvZ3JhbSAkbWFpbnByb2NzcmMiOword2hpbGUoPE1BSU5QUk9DPil7ICRtYWlucHJvYyAuPSAkXzsgfQorY2xvc2UgKE1BSU5QUk9DKTsKKworIyBTb21lIHRlbXBvcmFyeSB0ZXN0aW5mb3JtYXRpb246CitteSAoJGRlc2NyaXB0aW9uKSAgPSBnZXRfdGFnX3ZhbHVlcyAoJ29tcHRzOnRlc3RkZXNjcmlwdGlvbicsJHNyYyk7CitteSAoJGRpcmVjdGl2ZSkgICAgPSBnZXRfdGFnX3ZhbHVlcyAoJ29tcHRzOmRpcmVjdGl2ZScsJHNyYyk7CitteSAoJGZ1bmN0aW9ubmFtZSkgPSBnZXRfdGFnX3ZhbHVlcyAoJ29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZScsJHNyYyk7CisKK29wZW4gKE9VVEZJTEUsIj4kb3V0ZmlsZSIpIG9yIGRpZSAiQ291bGQgbm90IGNyZWF0ZSB0aGUgb3V0cHV0IGZpbGUgZm9yICRkaXJlY3RpdmUiOworCisjIENyZWF0aW5nIHRoZSBzb3VyY2UgZm9yIHRoZSB0ZXN0OgorbXkgKCRjb2RlKSA9IGdldF90YWdfdmFsdWVzKCdvbXB0czp0ZXN0Y29kZScsJHNyYyk7CisjIFB1dHRpbmcgdG9nZXRoZXIgdGhlIGZ1bmN0aW9ucyBhbmQgdGhlIG1haW5wcm9ncmFtbToKKyRjb2RlIC49ICRtYWlucHJvYzsKKworbXkgJHRlc3RwcmVmaXggPSAiIjsKKworIyBNYWtlIG1vZGlmaWNhdGlvbnMgZm9yIHRoZSBvcnBoYW5lZCB0ZXN0dmVyc2lvbiBpZiBuZWNlc3Nhcnk6CitpZiAoJG9ycGhhbikgeworIyBHZXQgdGhlIGdsb2JhbCB2YXJpYWJsZXM6CisgICAgQGRlZnMgPSBnZXRfdGFnX3ZhbHVlcygib21wdHM6b3JwaGFuOnZhcnMiLCRjb2RlKTsKKyAgICAkb3JwaHZhcnNkZWYgPSAiIjsKKyAgICBmb3JlYWNoIChAZGVmcykgeworICAgICAgICAkb3JwaHZhcnNkZWYgPSBqb2luKCJcbiIsJG9ycGh2YXJzZGVmLCRfKTsgCisgICAgfQorIyBHZW5lcmF0ZSBwcmVkZWNsYXJhdGlvbnMgZm9yIG9ycGFobiBmdW5jdGlvbnM6CisgICAgJG9ycGhmdW5jc2RlZnMgPSBvcnBoX2Z1bmN0aW9uc19kZWNsYXJhdGlvbnMoJGNvZGUpOworIyBHZW5lcmF0ZSB0aGUgb3JwaGFuIGZ1bmN0aW9uczoKKyAgICAkb3JwaGZ1bmNzID0gY3JlYXRlX29ycGhfY2Z1bmN0aW9ucygkY29kZSk7CisjIFJlcGxhOmUgb3JwaGFuIHJlZ2lvbnMgYnkgZnVuY3Rpb25jYWxsczoKKyAgICAkY29kZSA9IG9ycGhhbl9yZWdpb25zMmNmdW5jdGlvbnMoJGNvZGUpOworIyBEZWxldGluZyB0aGUgZm9ybWVyIGRlY2xhcmF0aW9ucyBvZiB0aGUgdmFyaWFibGVzIGluIHRoZSBvcnBoYW4gcmVnaW9uczoKKyAgICAoJGNvZGUpID0gZGVsZXRlX3RhZ3MoJ29tcHRzOm9ycGhhbjp2YXJzJywoJGNvZGUpKTsKKyMgUHV0IGFsbCB0b2dldGhlcjoKKyAgICAkY29kZSA9ICIjaW5jbHVkZSBcIm9tcF90ZXN0c3VpdGUuaFwiXG4iIC4gJG9ycGh2YXJzZGVmIC4gJG9ycGhmdW5jc2RlZnMgLiAkY29kZSAuICRvcnBoZnVuY3M7CisgICAgJHRlc3RwcmVmaXggLj0gIm9ycGhfIjsKK30KKworIyBSZW1vdmUgcmVtYWluaW5nIG1hcmtzIGZvciB0aGUgb3JwYWhuIHJlZ2lvbnMgYW5kIGl0cyB2YXJpYWJsZXM6CisoJGNvZGUpID0gZW5sYXJnZV90YWdzKCdvbXB0czpvcnBoYW4nLCcnLCcnLCgkY29kZSkpOworKCRjb2RlKSA9IGVubGFyZ2VfdGFncygnb21wdHM6b3JwaGFuOnZhcnMnLCcnLCcnLCgkY29kZSkpOworCitpZigkdGVzdCkgeworIyBSZW1vdmUgdGhlIG1hcmtzIGZvciB0aGUgdGVzdGNvZGUgYW5kIHJlbW92ZSB0aGUgY29kZSBmb3IgdGhlIGNyb3NzdGVzdHM6IAorICAgICgkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOmNoZWNrJywnJywnJywoJGNvZGUpKTsKKyAgICAoJGNvZGUpID0gZGVsZXRlX3RhZ3MoJ29tcHRzOmNyb3NzY2hlY2snLCgkY29kZSkpOwkJCisgICAgJHRlc3RwcmVmaXggLj0gInRlc3RfIjsKK30KK2Vsc2lmKCRjcm9zc3Rlc3QpIHsKKyMgUmVtb3ZlIHRoZSBtYXJrcyBmb3IgdGhlIGNyb3NzdGVzdGNvZGUgYW5kIHJlbW92ZSB0aGUgY29kZSBmb3IgdGhlIHRlc3RzOiAKKyAgICAoJGNvZGUpID0gZW5sYXJnZV90YWdzKCdvbXB0czpjcm9zc2NoZWNrJywnJywnJywoJGNvZGUpKTsKKyAgICAoJGNvZGUpID0gZGVsZXRlX3RhZ3MoJ29tcHRzOmNoZWNrJywoJGNvZGUpKTsJCQorICAgICR0ZXN0cHJlZml4IC49ICJjdGVzdF8iOworfQorIyBNYWtpbmcgc29tZSBmaW5hbCBtb2RpZmljYXRpb25zOgorKCRjb2RlKSA9IHJlcGxhY2VfdGFncygndGVzdGZ1bmN0aW9ubmFtZScsJHRlc3RwcmVmaXguJGZ1bmN0aW9ubmFtZSwoJGNvZGUpKTsKKygkY29kZSkgPSByZXBsYWNlX3RhZ3MoJ2RpcmVjdGl2ZScsJGRpcmVjdGl2ZSwoJGNvZGUpKTsKKygkY29kZSkgPSByZXBsYWNlX3RhZ3MoJ2Rlc2NyaXB0aW9uJywkZGVzY3JpcHRpb24sKCRjb2RlKSk7CisoJGNvZGUpID0gZW5sYXJnZV90YWdzKCdvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWUnLCR0ZXN0cHJlZml4LCcnLCgkY29kZSkgKTsKKyMJJGNvZGUgPSAgIlwjaW5jbHVkZSBcIm9tcF90ZXN0c3VpdGUuaFwiXG4iLiRjb2RlOworIyBXcml0ZSB0aGUgcmVzdWx0IGludG8gdGhlIGZpbGUgYW5kIGNsb3NlIGl0OgorcHJpbnQgT1VURklMRSAkY29kZTsKK2Nsb3NlKE9VVEZJTEUpOwpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL3RlbXBsYXRlX3BhcnNlcl9mb3J0cmFuLnBsIGIvZmluYWwvdGVzdHN1aXRlL3RlbXBsYXRlX3BhcnNlcl9mb3J0cmFuLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU3MGE0ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvdGVtcGxhdGVfcGFyc2VyX2ZvcnRyYW4ucGwKQEAgLTAsMCArMSwxMTUgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKworIyBvbXB0c19wYXJzZXIgW29wdGlvbl0gSU5GSUxFIE9VVEZJTEUKKyMgCisjIENyZWF0cyB0aGUgdGVzdHMgYW5kIHRoZSBjcm9zc3Rlc3RzIGZvciB0aGUgT3Blbk1QLVRlc3RzdWl0ZSBvdXQgb2YgYW4gdGVtcGxhdGVmaWxlcyB3aGljaCBhcmUgZ2l2ZW4gdG8gdGhlIHByb2dyYW1tLgorIyAKKyMgT3B0aW9uczoKKyMgLS10ZXN0OiAJbWFrZSB0ZXN0CisjIC0tY3Jvc3N0ZXN0OiAJbWFrZSBjcm9zc3Rlc3QKKyMgLS1vcnBoYW4JaWYgcG9zc2libGUgZ2VuZXJhdGUgdGVzdHMgdXNpbmcgb3JwaGFuIAorIworIyBSZXR1cm46CisjICAgICAgIFN1Y2NlczogICAgICAgICAgICAgICAgIDAKKyMgICAgICAgVGVtcGxhdGUgbm90IGZvdW5kICAgICAgLTEKKyMKKworIyBVc2luZyBHZXRvcHQ6OmxvbmcgdG8gZXh0cmFjdCB0aGUgcHJvZ3JhbW0gb3B0aW9ucwordXNlIEdldG9wdDo6TG9uZzsKKyMgVXNpbmcgZnVuY3Rpb25zOiBTZXQgb2Ygc3Vicm91dGluZXMgdG8gbW9kaWZ5IHRoZSB0ZXN0Y29kZQordXNlIG9tcHRzX3BhcnNlckZ1bmN0aW9uczsKKworIyBHZXR0aW5nIGdpdmVuIG9wdGlvbnMKK0dldE9wdGlvbnMoInRlc3QiID0+IFwkdGVzdCwiY3Jvc3N0ZXN0IiA9PiBcJGNyb3NzdGVzdCwgIm9ycGhhbiEiID0+IFwkb3JwaGFuKTsKKworIyBSZW1haW5pbmcgYXJndW1lbnRzIGFyZSB0aGUgdGVtcGxhdGVmaWxlcy4gCisjIEFkZGluZyB0aGVzZSB0byB0aGUgbGlzdCBvZiB0byBiZSBwYXJzZWQgZmlsZXMgaWYgdGhleSBleGlzdC4KKworbXkgJHRlbXBsYXRlZmlsZTsKK215ICRzb3VyY2VmaWxlOworbXkgJG1haW5wcm9jc3JjID0gIm9tcHRzX3N0YW5kYWxvbmVQcm9jLmYiOyAKKworJHRlbXBsYXRlZmlsZSA9ICRBUkdWWzBdOworJG91dGZpbGUgPSAkQVJHVlsxXTsKKworaWYgKCEtZSAkdGVtcGxhdGVmaWxlKSB7CisgICAgcHJpbnQgIlRlbWFwbHRlIGZpbGUgbm90IGZvdW5kIjsKKyAgICBleGl0IC0xOworfQorCisJCisjIENoZWNraW5nIGlmIG9wdGlvbnMgd2VyZSB2YWxpZDoKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIHByZXBhcmF0aW9ucyBhbmQgY2hlY2tzIGZvciBzb3VyY2VmaWxlcworCisjIFJlYWRpbmcgdGhlIHRlbXBsYXRlIGZvciB0aGUgdGVzdHMgCitvcGVuKFRFU1QsJHRlbXBsYXRlZmlsZSkgb3IgZGllICJFcnJvcjogQ291bGQgbm90IG9wZW4gdGVtcGxhdGUgJHNyY2ZpbGVcbiI7Cit3aGlsZSg8VEVTVD4peyAkc3JjIC49ICRfOyB9CitjbG9zZShURVNUKTsKKworIyBFeHRyYWN0aW5nIHRoZSBzb3VyY2UgZm9yIHRoZSBtYWlucHJvZ3JhbW0gYW5kIHNhdmluZyBpdCBpbiAkbWFpbnByb2NzcmMKK29wZW4oTUFJTlBST0MsJG1haW5wcm9jc3JjKSBvciBkaWUgIkNvdWxkIG5vdCBvcGVuIHRoZSBzb3VyY2VmaWxlIGZvciB0aGUgbWFpbiBwcm9ncmFtICRtYWlucHJvY3NyYyI7Cit3aGlsZSg8TUFJTlBST0M+KXsgJG1haW5wcm9jIC49ICRfOyB9CitjbG9zZSAoTUFJTlBST0MpOworCisjIFNvbWUgdGVtcG9yYXJ5IHRlc3RpbmZvcm1hdGlvbjoKKygkZGVzY3JpcHRpb24pICA9IGdldF90YWdfdmFsdWVzICgnb21wdHM6dGVzdGRlc2NyaXB0aW9uJywkc3JjKTsKKygkZGlyZWN0aXZlKSAgICA9IGdldF90YWdfdmFsdWVzICgnb21wdHM6ZGlyZWN0aXZlJywkc3JjKTsKKygkZnVuY3Rpb25uYW1lKSA9IGdldF90YWdfdmFsdWVzICgnb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lJywkc3JjKTsKKworb3BlbiAoT1VURklMRSwiPiRvdXRmaWxlIikgb3IgZGllICJDb3VsZCBub3QgY3JlYXRlIHRoZSBvdXRwdXQgZmlsZSBmb3IgJGRpcmVjdGl2ZSI7CisKKyMgQ3JlYXRpbmcgdGhlIHNvdXJjZSBmb3IgdGhlIHRlc3Q6CisoJGNvZGUpID0gZ2V0X3RhZ192YWx1ZXMoJ29tcHRzOnRlc3Rjb2RlJywkc3JjKTsKKyMgUHV0dGluZyB0b2dldGhlciB0aGUgZnVuY3Rpb25zIGFuZCB0aGUgbWFpbnByb2dyYW1tOgorJGNvZGUgLj0gJG1haW5wcm9jOworCisjdGhhbmtzIHRvIERyLiBZaW4gTWEgaW4gQWJzb2Z0LCBnZXQgdGhlIHBhcmFtZXRlcnMgPG9tcHRzOm9ycGhhbjpwYXJhbXM+IGJ5IGpvb24KKyAoJHBhcm1zKSA9IGdldF90YWdfdmFsdWVzKCdvbXB0czpvcnBoYW46cGFybXMnLCgkY29kZSkpOworICgkcGFybXMpID0gbGVhdmVfc2luZ2xlX3NwYWNlKCRwYXJtcyk7CisgKCRjb2RlKSA9IHJlcGxhY2VfdGFncygnb21wdHM6b3JwaGFuOnBhcm1zJywnJywkY29kZSk7CisKKyMgTWFrZSBtb2RpZmljYXRpb25zIGZvciB0aGUgb3JwaGFuZWQgdGVzdHZlcnNpb24gaWYgbmVjZXNzYXJ5OgoraWYgKCRvcnBoYW4pIHsKKyMgR2V0IHRoZSBnbG9iYWwgdmFyaWFibGVzOgorICAgIEBkZWZzID0gZ2V0X3RhZ192YWx1ZXMoIm9tcHRzOm9ycGhhbjp2YXJzIiwkY29kZSk7CisgICAgJG9ycGh2YXJzZGVmID0gIiI7CisgICAgZm9yZWFjaCAoQGRlZnMpIHsKKyAgICAgICAgaWYgKG5vdCAvXlsgXSokL2dzKSB7ICRvcnBodmFyc2RlZiA9IGpvaW4oIlxuIiwkb3JwaHZhcnNkZWYsJF8pOyB9IAorICAgIH0KKyMgR2VuZXJhdGUgdGhlIG9ycGhhbiBzdWJyb3V0aW5lczoKKyAgICAgICAgJG9ycGhmdW5jcyA9IGNyZWF0ZV9vcnBoX2ZvcnRyYW5mdW5jdGlvbnMgKCIiLCAoJGNvZGUpLCgkcGFybXMpKTsKKyMgUmVwbGFjZSBvcnBoYW4gcmVnaW9ucyBieSBmdW5jdGlvbmNhbGxzOgorICAgICAgICAoJGNvZGUpID0gb3JwaGFuX3JlZ2lvbnMyZm9ydHJhbmZ1bmN0aW9ucyAoIiIsICgkY29kZSksKCRwYXJtcykpOworICAgICAgICAoJGNvZGUpID0gZW5sYXJnZV90YWdzICgnb21wdHM6b3JwaGFuOnZhcnMnLCcnLCcnLCgkY29kZSkpOworIyB0byBmaW5kIG9ycGhhbiBjYWxsIHN0YXRlbWVudCBhbmQgYWRkIHBhcmFtZXRlcnMsIGJ5IGpvb24KKyAgICAgICAgKCRjb2RlKSA9IGVubGFyZ2VfdGFncygnb21wdHM6b3JwaGFuOnBhcm1zJywnJywnJywoJGNvZGUpKTsKKyMgUHV0IGFsbCB0b2dldGhlcjoKKyAgICAgICAgJGNvZGUgPSAkY29kZSAuICRvcnBoZnVuY3M7Cit9CisKKyMgUmVtb3ZlIHJlbWFpbmluZyBtYXJrcyBmb3IgdGhlIG9ycGFobiByZWdpb25zIGFuZCBpdHMgdmFyaWFibGVzOgorKCRjb2RlKSA9IGVubGFyZ2VfdGFncygnb21wdHM6b3JwaGFuJywnJywnJywoJGNvZGUpKTsKKygkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOm9ycGhhbjp2YXJzJywnJywnJywoJGNvZGUpKTsKKyMgcmVtb3ZlIHBhcmFtZXRlcnMgYmV0d2VlbiBmb3Igb3JwaGFuZWQgZGlyZWN0aXZlIHBhcmFtZXRlcywgYWRkZWQgYnlqb29uCisoJGNvZGUpID0gZW5sYXJnZV90YWdzKCdvbXB0czpvcnBoYW46cGFybXMnLCcnLCcnLCgkY29kZSkpOworCitpZigkdGVzdCkgeworIyBSZW1vdmUgdGhlIG1hcmtzIGZvciB0aGUgdGVzdGNvZGUgYW5kIHJlbW92ZSB0aGUgY29kZSBmb3IgdGhlIGNyb3NzdGVzdHM6IAorICAgICgkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOmNoZWNrJywnJywnJywoJGNvZGUpKTsKKyAgICAoJGNvZGUpID0gZGVsZXRlX3RhZ3MoJ29tcHRzOmNyb3NzY2hlY2snLCgkY29kZSkpOwkJCit9CitlbHNpZigkY3Jvc3N0ZXN0KSB7CisjIFJlbW92ZSB0aGUgbWFya3MgZm9yIHRoZSBjcm9zc3Rlc3Rjb2RlIGFuZCByZW1vdmUgdGhlIGNvZGUgZm9yIHRoZSB0ZXN0czogCisgICAgKCRjb2RlKSA9IGVubGFyZ2VfdGFncygnb21wdHM6Y3Jvc3NjaGVjaycsJycsJycsKCRjb2RlKSk7CisgICAgKCRjb2RlKSA9IGRlbGV0ZV90YWdzKCdvbXB0czpjaGVjaycsKCRjb2RlKSk7CQkKK30KKyMgTWFraW5nIHNvbWUgZmluYWwgbW9kaWZpY2F0aW9uczoKKygkY29kZSkgPSByZXBsYWNlX3RhZ3MoJ3Rlc3RmdW5jdGlvbm5hbWUnLCJ0ZXN0XyIuJGZ1bmN0aW9ubmFtZSwoJGNvZGUpKTsKKygkY29kZSkgPSByZXBsYWNlX3RhZ3MoJ2RpcmVjdGl2ZScsJGRpcmVjdGl2ZSwoJGNvZGUpKTsKKygkY29kZSkgPSByZXBsYWNlX3RhZ3MoJ2Rlc2NyaXB0aW9uJywkZGVzY3JpcHRpb24sKCRjb2RlKSk7CisoJGNvZGUpID0gZW5sYXJnZV90YWdzKCdvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWUnLCJ0ZXN0XyIsJycsKCRjb2RlKSApOworIwkkY29kZSA9ICAiXCNpbmNsdWRlIFwib21wX3Rlc3RzdWl0ZS5oXCJcbiIuJGNvZGU7CisjIFdyaXRlIHRoZSByZXN1bHQgaW50byB0aGUgZmlsZSBhbmQgY2xvc2UgaXQ6CitwcmludCBPVVRGSUxFICRjb2RlOworY2xvc2UoT1VURklMRSk7CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvdGVzdGxpc3QtYy50eHQgYi9maW5hbC90ZXN0c3VpdGUvdGVzdGxpc3QtYy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEzYTIxOAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS90ZXN0bGlzdC1jLnR4dApAQCAtMCwwICsxLDY4IEBACisjIExpc3QgY29udGFpbmluZyB0aGUgdGVzdHMgb2YgdGhlIE9wZW5NUFZhbGlkYWlvbiBTdWl0ZSBhdmFpbGFibGUgdG8gY2hlY2sKKyMgdGhlIGMgaW1wbGVtZW50YXRpb24uCitoYXNfb3Blbm1wCitvbXBfYXRvbWljCitvbXBfYmFycmllcgorb21wX2NyaXRpY2FsCitvbXBfZmx1c2gKK29tcF9mb3JfZmlyc3Rwcml2YXRlCitvbXBfZm9yX2xhc3Rwcml2YXRlCitvbXBfZm9yX29yZGVyZWQKK29tcF9mb3JfcHJpdmF0ZQorb21wX2Zvcl9yZWR1Y3Rpb24KK29tcF9mb3Jfc2NoZWR1bGVfZHluYW1pYworb21wX2Zvcl9zY2hlZHVsZV9ndWlkZWQKK29tcF9mb3Jfc2NoZWR1bGVfc3RhdGljCitvbXBfZm9yX25vd2FpdAorb21wX2dldF9udW1fdGhyZWFkcworb21wX2dldF93dGljaworb21wX2dldF93dGltZQorb21wX2luX3BhcmFsbGVsCitvbXBfbG9jaworb21wX21hc3Rlcgorb21wX25lc3RfbG9jaworb21wX3BhcmFsbGVsX2NvcHlpbgorb21wX3BhcmFsbGVsX2Zvcl9maXJzdHByaXZhdGUKK29tcF9wYXJhbGxlbF9mb3JfbGFzdHByaXZhdGUKK29tcF9wYXJhbGxlbF9mb3Jfb3JkZXJlZAorb21wX3BhcmFsbGVsX2Zvcl9wcml2YXRlCitvbXBfcGFyYWxsZWxfZm9yX3JlZHVjdGlvbgorb21wX3BhcmFsbGVsX251bV90aHJlYWRzCitvbXBfcGFyYWxsZWxfc2VjdGlvbnNfZmlyc3Rwcml2YXRlCitvbXBfcGFyYWxsZWxfc2VjdGlvbnNfbGFzdHByaXZhdGUKK29tcF9wYXJhbGxlbF9zZWN0aW9uc19wcml2YXRlCitvbXBfcGFyYWxsZWxfc2VjdGlvbnNfcmVkdWN0aW9uCitvbXBfc2VjdGlvbl9maXJzdHByaXZhdGUKK29tcF9zZWN0aW9uX2xhc3Rwcml2YXRlCitvbXBfc2VjdGlvbl9wcml2YXRlCitvbXBfc2VjdGlvbnNfcmVkdWN0aW9uCitvbXBfc2VjdGlvbnNfbm93YWl0CitvbXBfcGFyYWxsZWxfZm9yX2lmCitvbXBfc2luZ2xlX2NvcHlwcml2YXRlCitvbXBfc2luZ2xlX25vd2FpdAorb21wX3NpbmdsZV9wcml2YXRlCitvbXBfc2luZ2xlCitvbXBfdGVzdF9sb2NrCitvbXBfdGVzdF9uZXN0X2xvY2sKK29tcF90aHJlYWRwcml2YXRlCitvbXBfcGFyYWxsZWxfZGVmYXVsdAorb21wX3BhcmFsbGVsX3NoYXJlZAorb21wX3BhcmFsbGVsX3ByaXZhdGUKK29tcF9wYXJhbGxlbF9maXJzdHByaXZhdGUKK29tcF9wYXJhbGxlbF9pZgorb21wX3BhcmFsbGVsX3JlZHVjdGlvbgorCisjIE5ldyB0ZXN0cyBmb3IgT3Blbk1QIDMuMAorb21wX2Zvcl9jb2xsYXBzZQorb21wX21hc3Rlcl8zCitvbXBfdGFzaworb21wX3Rhc2tfaWYKK29tcF90YXNrX3VudGllZAorb21wX3Rhc2tfc2hhcmVkCitvbXBfdGFza19wcml2YXRlCitvbXBfdGFza19maXJzdHByaXZhdGUKK29tcF90YXNrd2FpdAorCisjIE5ldyB0ZXN0cyBmb3IgT3Blbk1QIDMuMQorb21wX3Rhc2t5aWVsZAorb21wX3Rhc2tfZmluYWwKZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS90ZXN0bGlzdC1mLnR4dCBiL2ZpbmFsL3Rlc3RzdWl0ZS90ZXN0bGlzdC1mLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTM4OWE1Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL3Rlc3RsaXN0LWYudHh0CkBAIC0wLDAgKzEsNjMgQEAKKyMgTGlzdCBjb250YWluaW5nIHRoZSB0ZXN0cyBvZiB0aGUgT3Blbk1QVmFsaWRhaW9uIFN1aXRlIGF2YWlsYWJsZSB0byBjaGVjaworIyB0aGUgZm9ydGFuIGltcGxlbWVudGF0aW9uLgorZG9fZmlyc3Rwcml2YXRlCitkb19sYXN0cHJpdmF0ZQorZG9fb3JkZXJlZAorZG9fcHJpdmF0ZQorZG9fcmVkdWN0aW9uCitkb19zY2hlZHVsZV9keW5hbWljCitkb19zY2hlZHVsZV9ndWlkZWQKK2RvX3NjaGVkdWxlX3N0YXRpYworaGFzX29wZW5tcAorb21wX2F0b21pYworb21wX2JhcnJpZXIKK29tcF9jb3B5aW4KK29tcF9jcml0aWNhbAorb21wX2ZsdXNoCitvbXBfZ2V0X251bV90aHJlYWRzCitvbXBfaW5fcGFyYWxsZWwKK29tcF9sb2NrCitvbXBfbWFzdGVyCitvbXBfbmVzdF9sb2NrCitvbXBfdGVzdF9uZXN0X2xvY2sKK29tcF9uZXN0ZWQKK29tcF9udW1fdGhyZWFkcworb21wX3Rlc3Rsb2NrCitvbXBfdGhyZWFkcHJpdmF0ZQorb21wX2dldF93dGlja3MKKyMjI29tcF93b3Jrc2hhcmVfZGVmYXVsdAorb21wX3dvcmtzaGFyZQorIyMjIEJyYXVjaHQgbWFuIGRlbiBvZGVyIG9iaWdlbiBlcndlaXRlcm4/CitvbXBfd3RpbWUKK3Bhcl9kb19maXJzdHByaXZhdGUKK3Bhcl9kb19sYXN0cHJpdmF0ZQorcGFyX2RvX29yZGVyZWQKK3Bhcl9kb19wcml2YXRlCitwYXJfZG9fcmVkdWN0aW9uCitwYXJfc2VjdGlvbl9maXJzdHByaXZhdGUKK3Bhcl9zZWN0aW9uX2xhc3Rwcml2YXRlCitwYXJfc2VjdGlvbl9wcml2YXRlCitwYXJfc2VjdGlvbl9yZWR1Y3QKK3NlY3Rpb25fZmlyc3Rwcml2YXRlCitzZWN0aW9uX2xhc3Rwcml2YXRlCitzZWN0aW9uX3ByaXZhdGUKK3NlY3Rpb25fcmVkdWN0aW9uCitvbXBfc2luZ2xlCitzaW5nbGVfY29weXByaXZhdGUKK3NpbmdsZV9ub3dhaXQKK3NpbmdsZV9wcml2YXRlCisKKyMgTmV3IHRlc3RzIGZvciBPcGVuTVAgMy4wCitkb19jb2xsYXBzZQorb21wX21hc3Rlcl8zCitvbXBfdGFzaworb21wX3Rhc2tfaWYKK29tcF90YXNrX3VudGllZAorb21wX3Rhc2tfc2hhcmVkCitvbXBfdGFza19wcml2YXRlCitvbXBfdGFza19maXJzdHByaXZhdGUKK29tcF90YXNrd2FpdAorCisjIE5ldyB0ZXN0cyBmb3IgT3Blbk1QIDMuMQorI29tcF90YXNreWllbGQKKyNvbXBfdGFza19maW5hbApkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL3Rlc3RzX3RvX2ludGVncmF0ZS9vbXBfc2V0X3Vuc2V0X2xvY2tfaGludGVkLmMgYi9maW5hbC90ZXN0c3VpdGUvdGVzdHNfdG9faW50ZWdyYXRlL29tcF9zZXRfdW5zZXRfbG9ja19oaW50ZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTAxNTM0Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL3Rlc3RzX3RvX2ludGVncmF0ZS9vbXBfc2V0X3Vuc2V0X2xvY2tfaGludGVkLmMKQEAgLTAsMCArMSw2NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAgRXh0ZW5kZWQgdmVyc2lvbiBvZiBvbXBfc2V0X3Vuc2V0X2xvY2suYyBmb3IgdGVzdGluZyBoaW50ZWQgbG9ja3MuCisgIENoZWNrIHRvIG1ha2Ugc3VyZSBPcGVuTVAgbG9ja3MgZ3VhcmFudGVlIG11dHVhbCAKKyAgZXhjbHVzaW9uIGZvciBtdWx0aXBsZSB0aHJlYWRzLgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG9tcC5oPgorCit2b2lkIGNzY2FsbChpbnQgaWQsIGludCBuWzEwMDBdLCBpbnQgKnBhc3NlZCwgb21wX2xvY2tfdCAqbG9jaykgeworICAgIGludCBpOworCisgICAgb21wX3NldF9sb2NrKCBsb2NrICk7CisgICAgZm9yIChpID0gMDsgaSA8IDEwMDA7IGkrKykgeworICAgICAgICBuW2ldID0gaWQ7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKKyAgICAgICAgaWYgKCBuW2ldICE9IGlkICkgeworICAgICAgICAgICAgKnBhc3NlZCA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgb21wX3Vuc2V0X2xvY2soIGxvY2sgKTsKK30KKworaW50IGhpbnRlZF9sb2NrKGttcF9sb2NrX2hpbnRfdCBoaW50KSB7CisgICAgaW50IHBhc3NlZCwgblsxMDAwXSwgaiwgaWQ7CisgICAgb21wX2xvY2tfdCBsb2NrOworICAgIAorICAgIHBhc3NlZCA9IDE7CisKKyAgICBrbXBfaW5pdF9sb2NrX2hpbnRlZCgmbG9jaywgaGludCk7CisKKyAgICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQobiwgcGFzc2VkLCBsb2NrKSBwcml2YXRlKGlkLCBqKQkKKyAgICB7CisgICAgICAgIGlkID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICAgIGZvciAoaiA9IDE7IGogPD0gMTAwMDA7IGorKykgeworICAgICAgICAgICAgY3NjYWxsKCBpZCwgbiwgJnBhc3NlZCwgJmxvY2sgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG9tcF9kZXN0cm95X2xvY2soJmxvY2spOworCisgICAgaWYgKHBhc3NlZCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9Cit9CisKK2ludCBtYWluKCkgeworICAgIGludCByZXQgPSAwOworICAgIHJldCArPSBoaW50ZWRfbG9jayhrbXBfbG9ja19oaW50X25vbmUpOworICAgIHJldCArPSBoaW50ZWRfbG9jayhrbXBfbG9ja19oaW50X2NvbnRlbmRlZCk7CisgICAgcmV0ICs9IGhpbnRlZF9sb2NrKGttcF9sb2NrX2hpbnRfdW5jb250ZW5kZWQpOworICAgIHJldCArPSBoaW50ZWRfbG9jayhrbXBfbG9ja19oaW50X25vbnNwZWN1bGF0aXZlKTsKKyAgICByZXQgKz0gaGludGVkX2xvY2soa21wX2xvY2tfaGludF9zcGVjdWxhdGl2ZSk7CisgICAgLy8gVGhpcyBvbmUgd2lsbCBlbWl0IFdhcm5pbmcgb24gbWFjaGluZXMgd2l0aCBubyBUU1guIAorICAgIHJldCArPSBoaW50ZWRfbG9jayhrbXBfbG9ja19oaW50X2FkYXB0aXZlKTsKKyAgICBpZiAocmV0KSB7CisgICAgICAgIHByaW50ZigiIFRlc3QgJXMgZmFpbGVkXG4iLCBfX0ZJTEVfXyk7CisgICAgICAgIHJldHVybiAxOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiIFRlc3QgJXMgcGFzc2VkXG4iLCBfX0ZJTEVfXyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS90ZXN0c190b19pbnRlZ3JhdGUvb21wX3NldF91bnNldF9sb2NrX2hpbnRlZC5mIGIvZmluYWwvdGVzdHN1aXRlL3Rlc3RzX3RvX2ludGVncmF0ZS9vbXBfc2V0X3Vuc2V0X2xvY2tfaGludGVkLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc0M2QzOAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS90ZXN0c190b19pbnRlZ3JhdGUvb21wX3NldF91bnNldF9sb2NrX2hpbnRlZC5mCkBAIC0wLDAgKzEsOTAgQEAKKyEKKyEgTW9kaWZpZWQgdmVyc2lvbiBvZiBvbXBfc2V0X3Vuc2V0X2xvY2suRiwgdXNpbmcgaGludGVkIGxvY2sgQVBJCishCisgICAgICBwcm9ncmFtIG9tcF9zZXRfdW5zZXRfbG9ja19oaW50ZWQKKworICAgICAgaW50ZWdlciByZXQKKyNpZiBkZWZpbmVkKF9PUEVOTVApCisgICAgICBpbmNsdWRlICdvbXBfbGliLmgnCisKKyAgICAgIHJldCA9IDAKKyAgICAgIGNhbGwgaGludGVkX2xvY2soa21wX2xvY2tfaGludF9ub25lLCByZXQpCisgICAgICBjYWxsIGhpbnRlZF9sb2NrKGttcF9sb2NrX2hpbnRfY29udGVuZGVkLCByZXQpCisgICAgICBjYWxsIGhpbnRlZF9sb2NrKGttcF9sb2NrX2hpbnRfdW5jb250ZW5kZWQsIHJldCkKKyAgICAgIGNhbGwgaGludGVkX2xvY2soa21wX2xvY2tfaGludF9ub25zcGVjdWxhdGl2ZSwgcmV0KQorICAgICAgY2FsbCBoaW50ZWRfbG9jayhrbXBfbG9ja19oaW50X3NwZWN1bGF0aXZlLCByZXQpCisgICAgICBjYWxsIGhpbnRlZF9sb2NrKGttcF9sb2NrX2hpbnRfYWRhcHRpdmUsIHJldCkKKyNlbHNlCisgICAgICByZXQgPSAwCisjZW5kaWYKKworICAgICAgaWYgKHJldCAuZXEuIDApIHRoZW4KKyAgICAgICAgICBwcmludCAqLCAnVGVzdCBvbXBfc2V0X3Vuc2V0X2xvY2tfaGludGVkLmYgcGFzc2VkJworICAgICAgZWxzZQorICAgICAgICAgIHByaW50ICosICdUZXN0IG9tcF9zZXRfdW5zZXRfbG9ja19oaW50ZWQuZiBmYWlsZWQnCisgICAgICBlbmRpZgorCisgICAgICBzdG9wCisgICAgICBlbmQKKworICAgICAgc3Vicm91dGluZSBoaW50ZWRfbG9jayhsb2NrX2hpbnQsIHJldCkKKyNpZiBkZWZpbmVkKF9PUEVOTVApCisgICAgICBpbmNsdWRlICdvbXBfbGliLmgnCisgICAgICBpbnRlZ2VyKG9tcF9sb2NrX2tpbmQpIGxvY2sKKyAgICAgIGludGVnZXIoa21wX2xvY2tfaGludF9raW5kKSBsb2NrX2hpbnQKKyNlbHNlCisgICAgICBpbnRlZ2VyIGxvY2sKKyAgICAgIGludGVnZXIgbG9ja19oaW50CisjZW5kaWYKKyAgICAgIGludGVnZXIgcmV0CisgICAgICBsb2dpY2FsIHBhc3NlZAorICAgICAgaW50ZWdlciBuKDEwMDApLCBqLCBpZAorICAgICAgCisgICAgICBwYXNzZWQgPSAuVFJVRS4KKworICAgICAgY2FsbCBrbXBfaW5pdF9sb2NrX2hpbnRlZChsb2NrLCBsb2NrX2hpbnQpCisKKyEkb21wICBwYXJhbGxlbAorISRvbXAmICAgICBzaGFyZWQgICAgICAgKG4scGFzc2VkLGxvY2spCishJG9tcCYgICAgIHByaXZhdGUgICAgICAoaWQsaikgICAgICAKKyNpZiBkZWZpbmVkKF9PUEVOTVApICYmICFkZWZpbmVkKF9BU1NVUkUpCisgICAgICBpZCA9IG9tcF9nZXRfdGhyZWFkX251bSgpCisjZWxzZQorICAgICAgaWQgPSAwCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9BU1NVUkUpCisgICAgICBkbyBqID0gMSwgMTAKKyNlbHNlCisgICAgICBkbyBqID0gMSwgMTAwMDAKKyNlbmRpZgorICAgICAgICAgIGNhbGwgY3NjYWxsKGlkLCBuLCBwYXNzZWQsIGxvY2spCisgICAgICBlbmRkbworISRvbXAgIGVuZCBwYXJhbGxlbAorCisgICAgICBjYWxsIG9tcF9kZXN0cm95X2xvY2sobG9jaykKKworICAgICAgaWYgKC5ub3QuIHBhc3NlZCkgdGhlbgorICAgICAgICAgIHJldCA9IHJldCArIDEKKyAgICAgIGVuZGlmCisKKyAgICAgIGVuZAorCisgICAgICBzdWJyb3V0aW5lIGNzY2FsbChpZCwgbiwgcGFzc2VkLCBsb2NrKQorI2lmIGRlZmluZWQoX09QRU5NUCkKKyAgICAgICAgaW5jbHVkZSAnb21wX2xpYi5oJworICAgICAgaW50ZWdlcihvbXBfbG9ja19raW5kKSBsb2NrCisjZWxzZQorICAgICAgaW50ZWdlciBsb2NrCisjZW5kaWYKKyAgICAgIGludGVnZXIgaWQsIGksIG4oMTAwMCkKKyAgICAgIGxvZ2ljYWwgcGFzc2VkCisKKyAgICAgIGNhbGwgb21wX3NldF9sb2NrKGxvY2spCisgICAgICBkbyBpID0gMSwxMDAwCisgICAgICAgICAgbihpKSA9IGlkCisgICAgICBlbmRkbworICAgICAgZG8gaSA9IDEsMTAwMAorICAgICAgICAgIGlmIChuKGkpIC5uZS4gaWQpIHBhc3NlZCA9IC5GQUxTRS4KKyAgICAgIGVuZGRvCisgICAgICBjYWxsIG9tcF91bnNldF9sb2NrKGxvY2spCisgICAgICBlbmQKZGlmZiAtLWdpdCBhL2ZpbmFsL3d3dy9SRUFETUUudHh0IGIvZmluYWwvd3d3L1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRkM2JkOQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3d3dy9SRUFETUUudHh0CkBAIC0wLDAgKzEsMTE1IEBACisKKyAgICAgICAgICAgICAgIFJFQURNRSBmb3IgdGhlIExMVk0qIE9wZW5NUCogUnVudGltZSBMaWJyYXJ5CisgICAgICAgICAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitIb3cgdG8gQnVpbGQgRG9jdW1lbnRhdGlvbgorPT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIG1haW4gZG9jdW1lbnRhdGlvbiBpcyBpbiBEb3h5Z2VuKiBmb3JtYXQsIGFuZCB0aGlzIGRpc3RyaWJ1dGlvbgorc2hvdWxkIGNvbWUgd2l0aCBwcmUtYnVpbHQgUERGIGRvY3VtZW50YXRpb24gaW4gZG9jL1JlZmVyZW5jZS5wZGYuICAKK0hvd2V2ZXIsIGFuIEhUTUwgdmVyc2lvbiBjYW4gYmUgYnVpbHQgYnkgZXhlY3V0aW5nOgorCislIGRveHlnZW4gZG9jL2RveHlnZW4vY29uZmlnIAorCitpbiB0aGUgcnVudGltZSBkaXJlY3RvcnkuCisKK1RoYXQgd2lsbCBwcm9kdWNlIEhUTUwgZG9jdW1lbnRhdGlvbiBpbiB0aGUgZG9jL2RveHlnZW4vZ2VuZXJhdGVkCitkaXJlY3RvcnksIHdoaWNoIGNhbiBiZSBhY2Nlc3NlZCBieSBwb2ludGluZyBhIHdlYiBicm93c2VyIGF0IHRoZQoraW5kZXguaHRtbCBmaWxlIHRoZXJlLgorCitJZiB5b3UgZG9uJ3QgaGF2ZSBEb3h5Z2VuIGluc3RhbGxlZCwgeW91IGNhbiBkb3dubG9hZCBpdCBmcm9tCit3d3cuZG94eWdlbi5vcmcuCisKKworSG93IHRvIEJ1aWxkIHRoZSBMTFZNKiBPcGVuTVAqIFJ1bnRpbWUgTGlicmFyeQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSW4tdHJlZSBidWlsZDoKKworJCBjZCB3aGVyZS15b3Utd2FudC10by1saXZlCitDaGVjayBvdXQgb3Blbm1wIGludG8gbGx2bS9wcm9qZWN0cworJCBjZCB3aGVyZS15b3Utd2FudC10by1idWlsZAorJCBta2RpciBidWlsZCAmJiBjZCBidWlsZAorJCBjbWFrZSBwYXRoL3RvL2xsdm0gLURDTUFLRV9DX0NPTVBJTEVSPTxDIGNvbXBpbGVyPiAtRENNQUtFX0NYWF9DT01QSUxFUj08QysrIGNvbXBpbGVyPgorJCBtYWtlIG9tcAorCitPdXQtb2YtdHJlZSBidWlsZDoKKworJCBjZCB3aGVyZS15b3Utd2FudC10by1saXZlCitDaGVjayBvdXQgb3Blbm1wCiskIGNkIHdoZXJlLXlvdS13YW50LXRvLWxpdmUvb3Blbm1wL3J1bnRpbWUKKyQgbWtkaXIgYnVpbGQgJiYgY2QgYnVpbGQKKyQgY21ha2UgcGF0aC90by9vcGVubXAgLURDTUFLRV9DX0NPTVBJTEVSPTxDIGNvbXBpbGVyPiAtRENNQUtFX0NYWF9DT01QSUxFUj08QysrIGNvbXBpbGVyPgorJCBtYWtlCisKK0ZvciBkZXRhaWxzIGFib3V0IGJ1aWxkaW5nLCBwbGVhc2UgbG9vayBhdCBCdWlsZF9XaXRoX0NNYWtlLnR4dAorCitBcmNoaXRlY3R1cmVzIFN1cHBvcnRlZAorPT09PT09PT09PT09PT09PT09PT09PT0KKyogSUEtMzIgYXJjaGl0ZWN0dXJlIAorKiBJbnRlbChSKSA2NCBhcmNoaXRlY3R1cmUKKyogSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlCisqIEFSTSogYXJjaGl0ZWN0dXJlCisqIEFhcmNoNjQgKDY0LWJpdCBBUk0pIGFyY2hpdGVjdHVyZQorKiBJQk0oUikgUG93ZXIgYXJjaGl0ZWN0dXJlIChiaWcgZW5kaWFuKQorKiBJQk0oUikgUG93ZXIgYXJjaGl0ZWN0dXJlIChsaXR0bGUgZW5kaWFuKQorCitTdXBwb3J0ZWQgUlRMIEJ1aWxkIENvbmZpZ3VyYXRpb25zCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1N1cHBvcnRlZCBBcmNoaXRlY3R1cmVzOiBJQS0zMiBhcmNoaXRlY3R1cmUsIEludGVsKFIpIDY0LCBhbmQgCitJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUKKworICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgIHwgICBpY2MvaWNsICAgICB8ICAgIGdjYyAgICAgIHwgICBjbGFuZyAgICAgIHwKKy0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfCBMaW51eCogT1MgICB8ICAgWWVzKDEsNSkgICAgfCAgWWVzKDIsNCkgICB8IFllcyg0LDYsNykgICB8Cit8IEZyZWVCU0QqICAgIHwgICBObyAgICAgICAgICB8ICBObyAgICAgICAgIHwgWWVzKDQsNiw3LDgpIHwKK3wgT1MgWCogICAgICAgfCAgIFllcygxLDMsNCkgIHwgIE5vICAgICAgICAgfCBZZXMoNCw2LDcpICAgfAorfCBXaW5kb3dzKiBPUyB8ICAgWWVzKDEsNCkgICAgfCAgTm8gICAgICAgICB8IE5vICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKDEpIE9uIElBLTMyIGFyY2hpdGVjdHVyZSBhbmQgSW50ZWwoUikgNjQsIGljYy9pY2wgdmVyc2lvbnMgMTIueCBhcmUgCisgICAgc3VwcG9ydGVkICgxMi4xIGlzIHJlY29tbWVuZGVkKS4KKygyKSBHQ0MqIHZlcnNpb24gNC43IGlzIHN1cHBvcnRlZC4KKygzKSBGb3IgaWNjIG9uIE9TIFgqLCBPUyBYKiB2ZXJzaW9uIDEwLjUuOCBpcyBzdXBwb3J0ZWQuCisoNCkgSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlIG5vdCBzdXBwb3J0ZWQuCisoNSkgT24gSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlLCBpY2MvaWNsIHZlcnNpb25zIDEzLjAgCisgICAgb3IgbGF0ZXIgYXJlIHJlcXVpcmVkLgorKDYpIENsYW5nKiB2ZXJzaW9uIDMuMyBpcyBzdXBwb3J0ZWQuCisoNykgQ2xhbmcqIGN1cnJlbnRseSBkb2VzIG5vdCBvZmZlciBhIHNvZnR3YXJlLWltcGxlbWVudGVkIDEyOCBiaXQgZXh0ZW5kZWQgCisgICAgcHJlY2lzaW9uIHR5cGUuICBUaHVzLCBhbGwgZW50cnkgcG9pbnRzIHJlbGlhbnQgb24gdGhpcyB0eXBlIGFyZSByZW1vdmVkCisgICAgZnJvbSB0aGUgbGlicmFyeSBhbmQgY2Fubm90IGJlIGNhbGxlZCBpbiB0aGUgdXNlciBwcm9ncmFtLiAgVGhlIGZvbGxvd2luZworICAgIGZ1bmN0aW9ucyBhcmUgbm90IGF2YWlsYWJsZToKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfKgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl8qCisgICAgX19rbXBjX2F0b21pY18qX2ZwCisoOCkgQ29tbXVuaXR5IGNvbnRyaWJ1dGlvbiBwcm92aWRlZCBBUyBJUywgbm90IHRlc3RlZCBieSBJbnRlbC4KKworU3VwcG9ydGVkIEFyY2hpdGVjdHVyZXM6IElCTShSKSBQb3dlciA3IGFuZCBQb3dlciA4CisKKyAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgfCAgIGdjYyAgICAgIHwgICBjbGFuZyAgICAgIHwKKy0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwKK3wgTGludXgqIE9TICAgfCAgWWVzKDEsMikgIHwgWWVzKDMsNCkgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKDEpIE9uIFBvd2VyIDcsIGdjYyB2ZXJzaW9uIDQuOC4yIGlzIHN1cHBvcnRlZC4KKygyKSBPbiBQb3dlciA4LCBnY2MgdmVyc2lvbiA0LjguMiBpcyBzdXBwb3J0ZWQuCisoMykgT24gUG93ZXIgNywgY2xhbmcgdmVyc2lvbiAzLjcgaXMgc3VwcG9ydGVkLgorKDQpIE9uIFBvd2VyIDgsIGNsYW5nIHZlcnNpb24gMy43IGlzIHN1cHBvcnRlZC4KKworCitGcm9udC1lbmQgQ29tcGlsZXJzIHRoYXQgd29yayB3aXRoIHRoaXMgUlRMCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBmb2xsb3dpbmcgY29tcGlsZXJzIGFyZSBrbm93biB0byBkbyBjb21wYXRpYmxlIGNvZGUgZ2VuZXJhdGlvbiBmb3IKK3RoaXMgUlRMOiBjbGFuZyAoZnJvbSB0aGUgT3Blbk1QIGRldmVsb3BtZW50IGJyYW5jaCBhdAoraHR0cDovL2NsYW5nLW9tcC5naXRodWIuaW8vICksIEludGVsIGNvbXBpbGVycywgR0NDLiAgU2VlIHRoZSBkb2N1bWVudGF0aW9uCitmb3IgbW9yZSBkZXRhaWxzLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOb3RpY2VzCis9PT09PT09CisKKypPdGhlciBuYW1lcyBhbmQgYnJhbmRzIG1heSBiZSBjbGFpbWVkIGFzIHRoZSBwcm9wZXJ0eSBvZiBvdGhlcnMuCmRpZmYgLS1naXQgYS9maW5hbC93d3cvUmVmZXJlbmNlLnBkZiBiL2ZpbmFsL3d3dy9SZWZlcmVuY2UucGRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5N2M0MGMKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC93d3cvUmVmZXJlbmNlLnBkZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9maW5hbC93d3cvY29udGVudC5jc3MgYi9maW5hbC93d3cvY29udGVudC5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNhNmEzMgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3d3dy9jb250ZW50LmNzcwpAQCAtMCwwICsxLDI3IEBACitodG1sIHsgbWFyZ2luOiAwcHg7IH0gYm9keSB7IG1hcmdpbjogOHB4OyB9CisKK2h0bWwsIGJvZHkgeworICBwYWRkaW5nOjBweDsKKyAgZm9udC1zaXplOnNtYWxsOyBmb250LWZhbWlseToiTHVjaWRhIEdyYW5kZSIsICJMdWNpZGEgU2FucyBVbmljb2RlIiwgQXJpYWwsIFZlcmRhbmEsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsgY29sb3I6ICMyMjI7CisgIGxpbmUtaGVpZ2h0OjEuNTsKK30KKworaDEsIGgyLCBoMywgdHQgeyBjb2xvcjogIzAwMCB9CisKK2gxIHsgcGFkZGluZy10b3A6MHB4OyBtYXJnaW4tdG9wOjBweDt9CitoMiB7IGNvbG9yOiMzMzMzMzM7IHBhZGRpbmctdG9wOjAuNWVtOyB9CitoMyB7IHBhZGRpbmctdG9wOiAwLjVlbTsgbWFyZ2luLWJvdHRvbTogLTAuMjVlbTsgY29sb3I6IzJkNThiN30KK2xpIHsgcGFkZGluZy1ib3R0b206IDAuNWVtOyB9Cit1bCB7IHBhZGRpbmctbGVmdDoxLjVlbTsgfQorCisvKiBTbGlkZXMgKi8KK0lNRy5pbWdfc2xpZGUgeworICAgIGRpc3BsYXk6IGJsb2NrOworICAgIG1hcmdpbi1sZWZ0OiBhdXRvOworICAgIG1hcmdpbi1yaWdodDogYXV0bworfQorCisuaXRlbVRpdGxlIHsgY29sb3I6IzJkNThiNyB9CisKKy8qIFRhYmxlcyAqLwordHIgeyB2ZXJ0aWNhbC1hbGlnbjp0b3AgfQpkaWZmIC0tZ2l0IGEvZmluYWwvd3d3L2luZGV4Lmh0bWwgYi9maW5hbC93d3cvaW5kZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDNhNGUwCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvd3d3L2luZGV4Lmh0bWwKQEAgLTAsMCArMSwyMzIgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxLy9FTiIKKyAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvc3RyaWN0LmR0ZCI+Cis8IS0tIE1hdGVyaWFsIHVzZWQgZnJvbTogSFRNTCA0LjAxIHNwZWNzOiBodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNDAxLyAtLT4KKzxodG1sPgorPGhlYWQ+CisgIDxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorICA8dGl0bGU+T3Blbk1QKiA6IFN1cHBvcnQgZm9yIHRoZSBPcGVuTVAgbGFuZ3VhZ2U8L3RpdGxlPgorICA8bGluayB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJtZW51LmNzcyI+CisgIDxsaW5rIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImNvbnRlbnQuY3NzIj4KKzwvaGVhZD4KKworPGJvZHk+Cis8ZGl2IGlkPSJtZW51Ij4KKyAgPGRpdj4KKyAgICA8YSBocmVmPSJodHRwOi8vbGx2bS5vcmcvIj5MTFZNIEhvbWU8L2E+CisgIDwvZGl2PgorCisgIDxkaXYgY2xhc3M9InN1Ym1lbnUiPgorICAgIDxsYWJlbD5PcGVuTVAgSW5mbzwvbGFiZWw+CisgICAgPGEgaHJlZj0iL2luZGV4Lmh0bWwiPkFib3V0PC9hPgorICA8L2Rpdj4KKworICA8ZGl2IGNsYXNzPSJzdWJtZW51Ij4KKyAgICA8bGFiZWw+UXVpY2sgTGlua3M8L2xhYmVsPgorICAgIDxhIGhyZWY9Imh0dHA6Ly9saXN0cy5sbHZtLm9yZy9tYWlsbWFuL2xpc3RpbmZvL29wZW5tcC1kZXYiPm9wZW5tcC1kZXY8L2E+CisgICAgPGEgaHJlZj0iaHR0cDovL2xpc3RzLmxsdm0ub3JnL21haWxtYW4vbGlzdGluZm8vb3Blbm1wLWNvbW1pdHMiPm9wZW5tcC1jb21taXRzPC9hPgorICAgIDxhIGhyZWY9Imh0dHA6Ly9sbHZtLm9yZy9idWdzLyI+QnVnIFJlcG9ydHM8L2E+CisgICAgPGEgaHJlZj0iaHR0cDovL2xsdm0ub3JnL3N2bi9sbHZtLXByb2plY3Qvb3Blbm1wL3RydW5rLyI+QnJvd3NlIFNWTjwvYT4KKyAgICA8YSBocmVmPSJodHRwOi8vbGx2bS5vcmcvdmlld3ZjL2xsdm0tcHJvamVjdC9vcGVubXAvdHJ1bmsvIj5Ccm93c2UgVmlld1ZDPC9hPgorICA8L2Rpdj4KKzwvZGl2PgorCis8ZGl2IGlkPSJjb250ZW50Ij4KKyAgPCEtLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi0tPgorICA8aDE+T3Blbk1QJnJlZzs6IFN1cHBvcnQgZm9yIHRoZSBPcGVuTVAgbGFuZ3VhZ2U8L2gxPgorICA8IS0tKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLS0+CisKKyAgPHA+VGhlIE9wZW5NUCBzdWJwcm9qZWN0IG9mIExMVk0gaXMgaW50ZW5kZWQgdG8gY29udGFpbiBhbGwgb2YgdGhlCisgICAgIGNvbXBvbmVudHMgcmVxdWlyZWQgdG8gYnVpbGQgYW4gZXhlY3V0aW5nIE9wZW5NUCBwcm9ncmFtIHRoYXQgYXJlCisgICAgIG91dHNpZGUgdGhlIGNvbXBpbGVyIGl0c2VsZi4KKyAgPC9wPgorCisgIDxwPkhlcmUgeW91IGNhbiBmaW5kIDotCisgICAgPHVsPgorICAgICAgPGxpPgorICAgICAgICB0aGUgY29kZSBmb3IgdGhlIHJ1bnRpbWUgbGlicmFyeSBhZ2FpbnN0IHdoaWNoCisgICAgICAgIGNvZGUgY29tcGlsZWQgYnkgdGhlIE9wZW5NUC9DbGFuZyBjb21waWxlciBtdXN0IGJlIGxpbmtlZCBiZWZvcmUgaXQKKyAgICAgICAgY2FuIHJ1bi4gVGhpcyBjb2RlIGlzIGFsc28gYXZhaWxhYmxlCisgICAgICAgIGF0IDxhIGhyZWY9Imh0dHA6Ly9vcGVubXBydGwub3JnLyI+b3Blbm1wcnRsLm9yZzwvYT47IHdlIGludGVuZCB0bworICAgICAgICBrZWVwIHRoZSBkaWZmZXJlbnQgc2l0ZXMgaW4gc3luYy4KKyAgICAgIDwvbGk+CisgICAgICA8bGk+CisgICAgICAgIHRoZSBsaWJyYXJ5IHRoYXQgc3VwcG9ydHMgb2ZmbG9hZCB0byB0YXJnZXQgZGV2aWNlcyAoaW4KKyAgICAgICAgIm9mZmxvYWQiKQorICAgICAgPC9saT4KKyAgICAgIDxsaT4KKyAgICAgICAgdGhlIE9wZW5VSCB0ZXN0LXN1aXRlIHdoaWNoIGlzIGJlaW5nIGludGVncmF0ZWQuCisgICAgICA8L2xpPgorICAgIDwvdWw+CisgIDwvcD4KKworICA8cD5TdXBwb3J0IGZvciB0aGUgcGFydHMgb2YgdGhlIE9wZW5NUCA0LjAgbGFuZ3VhZ2UgdGhhdCBhcmUgbm90CisgIGFzc29jaWF0ZWQgd2l0aCB0aGUgInRhcmdldCIgY29uc3RydWN0cyBhcmUgY29udGFpbmVkIGluIHRoZQorICAicnVudGltZSIgZGlyZWN0b3J5LiBTdXBwb3J0IGZvciBvZmZsb2FkaW5nIGNvbXB1dGF0aW9uIHZpYSB0aGUKKyAgInRhcmdldCIgZGlyZWN0aXZlIGlzIGluIHRoZSBzZXBhcmF0ZSAib2ZmbG9hZCIgZGlyZWN0b3J5LiBUaGF0CisgIGJ1aWxkcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBmb3IgdHJhbnNmZXJyaW5nIGNvZGUKKyAgYW5kIGRhdGEgdG8gYW4gYXR0YWNoZWQgY29tcHV0YXRpb25hbCBkZXZpY2UuIEluaXRpYWwgc3VwcG9ydCBoZXJlCisgIGlzIGZvciB0aGUgSW50ZWwmcmVnIFhlb24gUGhpJiMwMTUzIGNvcHJvY2Vzc29yLCBidXQgd29yayBpcworICBiZWdpbm5pbmcgdG8gc3VwcG9ydCBvdGhlciBhdHRhY2hlZCBjb21wdXRpbmcgZGV2aWNlcywgYW5kIHRoZQorICBkZXNpZ24gaXMgaW50ZW5kZWQgdG8gYmUgZ2VuZXJhbC4gVGhlIFJFQURNRS50eHQgaW4gdGhlICJvZmZsb2FkIgorICBkaXJlY3RvcnkgZGVzY3JpYmVzIGhvdyB0byBidWlsZCB0aGUgb2ZmbG9hZCBsaWJyYXJ5LgorICA8L3A+CisKKyAgPHA+QWxsIG9mIHRoZSBjb2RlIGhlcmUgaXMgPGEKKyAgICAgaHJlZj0iaHR0cDovL2xsdm0ub3JnL2RvY3MvRGV2ZWxvcGVyUG9saWN5Lmh0bWwjbGljZW5zZSI+ZHVhbCBsaWNlbnNlZDwvYT4KKyAgICAgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGFuZCB0aGUgVUlVQyBMaWNlbnNlIChhIEJTRC1saWtlIGxpY2Vuc2UpLgorICAgICBUaGUgTElDRU5TRS50eHQgZmlsZSBhdCB0aGUgdG9wIG9mIHRoZSBPcGVuTVAgcHJvamVjdCBjb250YWlucworICAgICB0aGUgbGljZW5zZSB0ZXh0IGFuZCBhc3NvY2lhdGVkIHBhdGVudCBncmFudHMuCisgIDwvcD4KKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDxoMiBpZD0iZ29hbHMiPkZlYXR1cmVzIGFuZCBHb2FsczwvaDI+CisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKworICAgIDx1bD4KKyAgICAgICAgPGxpPkNvcnJlY3RuZXNzIGFzIGRlZmluZWQgYnkgdGhlIAorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbm1wLm9yZy9tcC1kb2N1bWVudHMvT3Blbk1QMy4xLnBkZiI+T3Blbk1QCisgICAgICAgICAgMy4xIHN0YW5kYXJkIChQREYpPC9hPiBub3csIGFuZCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5tcC5vcmcvbXAtZG9jdW1lbnRzL09wZW5NUDQuMC4wLnBkZiI+T3Blbk1QCisgICAgICAgICAgNC4wIHN0YW5kYXJkIChQREYpPC9hPiBpbiB0aGUgZnV0dXJlLjwvbGk+CisgICAgICAgIDxsaT5IaWdoIHBlcmZvcm1hbmNlLjwvbGk+CisgICAgICAgIDxsaT5BQkkgY29tcGF0aWJpbGl0eSB3aXRoIDxhIGhyZWY9Imh0dHA6Ly9nY2MuZ251Lm9yZyI+R2NjPC9hPiBhbmQKKyAgICAgICAgPGEgaHJlZj0iaHR0cDovL3NvZnR3YXJlLmludGVsLmNvbS9lbi11cy9pbnRlbC1jb21waWxlcnMiPkludGVsJ3MKKyAgICAgICAgZXhpc3RpbmcgT3Blbk1QIGNvbXBpbGVycy48L2E+IAorICAgICAgICBXaXRoIHRoaXMgcmVsZWFzZSB3ZSBoYXZlIHJlc3RvcmVkIGNvbXBhdGliaWxpdHkgd2l0aCBPcGVuTVAKKyAgICAgICAgMy4xIGNvZGUgY29tcGlsZWQgYnkgZ2NjIDQuOSwgaG93ZXZlciB3ZSBkbyBub3QgaGF2ZSBzdXBwb3J0CisgICAgICAgIGZvciBPcGVuTVAgNC4wIGNvZGUgdGhhdCB1c2VzIHRhc2sgY2FuY2VsbGF0aW9uIHdoZW4gY29tcGlsZWQKKyAgICAgICAgYnkgZ2NjIDQuOS4gSG93IHdlIHdpbGwgc3VwcG9ydCBzdWNoIGNvZGUgcmVtYWlucyBhIHJlc2VhcmNoIGlzc3VlLgorICAgICAgICA8L2xpPgorICAgIDwvdWw+CisKKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorICA8aDIgaWQ9IndoeSI+V2h5IGhhdmUgdGhlIHJ1bnRpbWUgY29kZSBoZXJlPzwvaDI+CisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKworICA8cD5JdCBtYWtlcyBzZW5zZSB0byBoYXZlIHRoZSBydW50aW1lIHNvdXJjZXMgaW4gdGhlIHNhbWUgcGxhY2UKKyAgICAoYW5kIHdpdGggdGhlIHNhbWUgbGljZW5zZSkgYXMgdGhlIGNvbXBpbGVyLgorICA8L3A+CisKKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorICA8aDIgaWQ9InJlcXVpcmVtZW50cyI+UGxhdGZvcm0gU3VwcG9ydDwvaDI+CisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKworICA8cD5UaGUgT3Blbk1QIHJ1bnRpbWUgaXMga25vd24gdG8gd29yayBvbiAKKyAgICA8dWw+CisgICAgICA8bGk+QVJNJnJlZzsmbmJzcDsgYXJjaGl0ZWN0dXJlIHByb2Nlc3NvcnM8L2xpPgorICAgICAgPGxpPlBvd2VyUEMmdHJhZGU7Jm5ic3A7IHByb2Nlc3NvcnM8L2xpPgorICAgICAgPGxpPjMyIGFuZCA2NCBiaXQgWDg2CisgICAgICAgIHByb2Nlc3NvcnMgd2hlbiBjb21waWxlZCB3aXRoIGNsYW5nLCB3aXRoIHRoZSBJbnRlbCBjb21waWxlcgorICAgICAgICBvciB3aXRoIGdjYywgYW5kIGFsc28gdGhlIEludGVsJnJlZzsmbmJzcDtYZW9uIFBoaSZ0cmFkZTsgcHJvZHVjdCBmYW1pbHksIHdoZW4gY29tcGlsZWQgd2l0aAorICAgICAgICB0aGUgSW50ZWwgY29tcGlsZXIuCisgICAgICA8L2xpPgorICAgIDwvdWw+CisgICAgUG9ydHMgdG8gb3RoZXIgYXJjaGl0ZWN0dXJlcyBhbmQgb3BlcmF0aW5nIHN5c3RlbXMgYXJlIHdlbGNvbWUuCisgIDwvcD4KKyAgCisgIDxwPkEgZnVsbCBPUyBhbmQgYXJjaGllY3R1cmUgY29tcGF0aWJpbGl0eSBtYXRyaXggaXMgaW4gCisgICAgPGEgaHJlZj0iUkVBRE1FLnR4dCI+UkVBRE1FLnR4dDwvYT4KKyAgPC9wPgorCisKKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorICA8aDIgaWQ9ImRpci1zdHJ1Y3R1cmUiPlN0YXR1czwvaDI+CisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKworICAgPHA+VGhlIHJ1bnRpbWUgY2FuIGJlIGJ1aWx0IHdpdGggZ2NjLCBpY2Mgb3IgY2xhbmcuIEhvd2V2ZXIsIG5vdGUKKyAgIHRoYXQgYSBydW50aW1lIGJ1aWx0IHdpdGggY2xhbmcgY2Fubm90IGJlIGd1YXJhbnRlZWQgdG8gd29yayB3aXRoCisgICBPcGVuTVAgY29kZSBjb21waWxlZCBieSB0aGUgb3RoZXIgY29tcGlsZXJzLCBzaW5jZSBjbGFuZyBkb2VzIG5vdCBzdXBwb3J0CisgICBhIDEyOC1iaXQgZmxvYXQgdHlwZSwgYW5kIGNhbm5vdCB0aGVyZWZvcmUgZ2VuZXJhdGUgdGhlIGNvZGUgdXNlZAorICAgZm9yIHJlZHVjdGlvbnMgb2YgdGhhdCB0eXBlICh3aGljaCBtYXkgb2NjdXIgaW4gdXNlciBjb2RlIGNvbXBpbGVkCisgICBieSB0aGUgb3RoZXIgY29tcGlsZXJzKS4KKyAgIDwvcD4KKyAKKyAgIDxwPlRoZSBVbml2ZXJzaXR5IG9mIEhvdXN0b24gaGFzIGtpbmRseSBjb250cmlidXRlZCB0aGVpciB0ZXN0CisgICBzdWl0ZSAoaW4gdGhlICJ0ZXN0c3VpdGUiIGRpcmVjdG9yeSkuIEludGVncmF0aW9uIGFuZCB1c2Ugb2YgdGhpcworICAgZm9yIGF1dG9tYXRpYyB0ZXN0aW5nIGlzIGluIHByb2dyZXNzLgorICAgPC9wPgorCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPGgyPkdldCBpdCBhbmQgZ2V0IGludm9sdmVkITwvaDI+CisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKworICA8cD5GaXJzdCBwbGVhc2UgcmV2aWV3IG91cgorICAgICA8YSBocmVmPSJodHRwOi8vbGx2bS5vcmcvZG9jcy9EZXZlbG9wZXJQb2xpY3kuaHRtbCI+RGV2ZWxvcGVyJ3MgUG9saWN5PC9hPi4KKworICA8cD5UbyBjaGVjayBvdXQgdGhlIGNvZGUsIHVzZTo8L3A+CisKKyAgPHVsPgorICA8bGk+PGNvZGU+c3ZuIGNvIGh0dHA6Ly9sbHZtLm9yZy9zdm4vbGx2bS1wcm9qZWN0L29wZW5tcC90cnVuayBvcGVubXA8L2NvZGU+PC9saT4KKyAgPC91bD4KKworICA8cD4KKyAgICAgTm90ZSB0aGF0IGZvciBhbiBpbi10cmVlIGJ1aWxkLCB5b3Ugc2hvdWxkIGNoZWNrIG91dCBvcGVubXAgdG8gbGx2bS9wcm9qZWN0cy4KKyAgPC9wPgorCisgIDxwPkluLXRyZWUgYnVpbGQ6PC9wPgorICA8dWw+CisgICAgPGxpPjxjb2RlPmNkIHdoZXJlLXlvdS13YW50LXRvLWxpdmU8L2NvZGU+PC9saT4KKyAgICA8bGk+Q2hlY2sgb3V0IG9wZW5tcCBpbnRvIGxsdm0vcHJvamVjdHM8L2xpPgorICAgIDxsaT48Y29kZT5jZCB3aGVyZS15b3Utd2FudC10by1idWlsZDwvY29kZT48L2xpPgorICAgIDxsaT48Y29kZT5ta2RpciBidWlsZCAmYW1wOyZhbXA7IGNkIGJ1aWxkPC9jb2RlPjwvbGk+CisgICAgPGxpPjxjb2RlPmNtYWtlIHBhdGgvdG8vbGx2bSAtRENNQUtFX0NfQ09NUElMRVI9Jmx0O0MgY29tcGlsZXImZ3Q7IC1EQ01BS0VfQ1hYX0NPTVBJTEVSPSZsdDtDKysgY29tcGlsZXImZ3Q7PC9jb2RlPjwvbGk+CisgICAgPGxpPjxjb2RlPm1ha2Ugb21wPC9jb2RlPjwvbGk+CisgIDwvdWw+CisKKyAgPHA+T3V0LW9mLXRyZWUgYnVpbGQ6PC9wPgorICA8dWw+CisgICAgPGxpPjxjb2RlPmNkIHdoZXJlLXlvdS13YW50LXRvLWxpdmU8L2NvZGU+PC9saT4KKyAgICA8bGk+Q2hlY2sgb3V0IG9wZW5tcDwvbGk+CisgICAgPGxpPjxjb2RlPmNkIHdoZXJlLXlvdS13YW50LXRvLWxpdmUvb3Blbm1wL3J1bnRpbWU8L2NvZGU+PC9saT4KKyAgICA8bGk+PGNvZGU+bWtkaXIgYnVpbGQgJmFtcDsmYW1wOyBjZCBidWlsZDwvY29kZT48L2xpPgorICAgIDxsaT48Y29kZT5jbWFrZSBwYXRoL3RvL29wZW5tcCAtRENNQUtFX0NfQ09NUElMRVI9Jmx0O0MgY29tcGlsZXImZ3Q7IC1EQ01BS0VfQ1hYX0NPTVBJTEVSPSZsdDtDKysgY29tcGlsZXImZ3Q7PC9jb2RlPjwvbGk+CisgICAgPGxpPjxjb2RlPm1ha2U8L2NvZGU+PC9saT4KKyAgPC91bD4KKyAgCisgIDxwPkZ1bGwgZGV0YWlscyBvZiBob3cgdG8gYnVpbGQgYXJlIGluIHRoZQorICAgIDxhIGhyZWY9IlJFQURNRS50eHQiPlJFQURNRS50eHQ8L2E+IGFuZCBCdWlsZF9XaXRoX0NNYWtlLnR4dCAoaW5zaWRlIHRoZSBydW50aW1lLyBzdWJkaXJlY3RvcnkpCisgIDwvcD4KKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDxoMz5Ob3RlczwvaDM+CisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKworPHA+CisKKzwvcD4KKworICA8cD5TZW5kIGRpc2N1c3Npb25zIHRvIHRoZQorICAoPGEgaHJlZj0iaHR0cDovL2xpc3RzLmxsdm0ub3JnL21haWxtYW4vbGlzdGluZm8vb3Blbm1wLWRldiI+T3Blbk1QIG1haWxpbmcgbGlzdDwvYT4pLjwvcD4KKworCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPGgyPkRlc2lnbiBEb2N1bWVudHM8L2gyPgorICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisKKzx1bD4KKzxsaT48YSBocmVmPSJSZWZlcmVuY2UucGRmIj5SdW50aW1lIGRlc2lnbiAoUERGKTwvYT48L2xpPgorPC91bD4KKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDxoMj5Db3B5cmlnaHQgbm90aWNlczwvaDI+CisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKzx1bD4KKzxsaT4KKyAgVGhlIE9wZW5NUCBuYW1lIGFuZCB0aGUgT3Blbk1QIGxvZ28gYXJlIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiB0aGUKKyAgT3Blbk1QIEFyY2hpdGVjdHVyZSBSZXZpZXcgQm9hcmQuCis8L2xpPgorPGxpPgorICBJbnRlbCBpcyBhIHRyYWRlbWFyayBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBpbiB0aGUgVS5TLiBhbmQvb3Igb3RoZXIKKyAgY291bnRyaWVzLgorPC9saT4KKzxsaT4KKyAgUG93ZXJQQyBpcyBhIHRyYWRlbWFyayBvZiBJQk0gQ29ycG9yYXRpb24gaW4gdGhlIFUuUy4gYW5kL29yIG90aGVyCisgIGNvdW50cmllcy4KKzwvbGk+Cis8bGk+CisgIEFSTSBpcyBhIHRyYWRlbWFyayBvZiBBUk0gQ29ycG9yYXRpb24gaW4gdGhlIFUuUy4gYW5kL29yCisgIG90aGVyIGNvdW50cmllcy4KKzwvbGk+Cis8L3VsPgorPC9kaXY+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9maW5hbC93d3cvbWVudS5jc3MgYi9maW5hbC93d3cvbWVudS5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE4ODdiMQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3d3dy9tZW51LmNzcwpAQCAtMCwwICsxLDM5IEBACisvKioqKioqKioqKioqKioqLworLyogcGFnZSBsYXlvdXQgKi8KKy8qKioqKioqKioqKioqKiovCisKK1tpZD1tZW51XSB7CisJcG9zaXRpb246Zml4ZWQ7CisJd2lkdGg6MjVleDsKK30KK1tpZD1jb250ZW50XSB7CisJLyogKioqKiogIEVESVQgVEhJUyBWQUxVRSBJRiBDT05URU5UIE9WRVJMQVBTIE1FTlUgKioqKiogKi8KKwlwb3NpdGlvbjphYnNvbHV0ZTsKKyAgbGVmdDoyOWV4OworCXBhZGRpbmctcmlnaHQ6NGV4OworfQorCisvKioqKioqKioqKioqKiovCisvKiBtZW51IHN0eWxlICovCisvKioqKioqKioqKioqKiovCisKKyNtZW51IC5zdWJtZW51IHsKKwlwYWRkaW5nLXRvcDoxZW07CisJZGlzcGxheTpibG9jazsKK30KKworI21lbnUgbGFiZWwgeworCWRpc3BsYXk6YmxvY2s7CisJZm9udC13ZWlnaHQ6IGJvbGQ7CisJdGV4dC1hbGlnbjogY2VudGVyOworCWJhY2tncm91bmQtY29sb3I6IHJnYigxOTIsMTkyLDE5Mik7Cit9CisjbWVudSBhIHsKKwlwYWRkaW5nOjAgLjJlbTsKKwlkaXNwbGF5OmJsb2NrOworCXRleHQtYWxpZ246IGNlbnRlcjsKKwliYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjM1LDIzNSwyMzUpOworfQorI21lbnUgYTp2aXNpdGVkIHsKKwljb2xvcjpyZ2IoMTAwLDUwLDEwMCk7Cit9Cg==