ZGlmZiAtLWdpdCBhL29wZW5nbC9pbmNsdWRlL0VHTC9lZ2wuaCBiL29wZW5nbC9pbmNsdWRlL0VHTC9lZ2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjY5OTc2Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2luY2x1ZGUvRUdML2VnbC5oCkBAIC0wLDAgKzEsMzMwIEBACisvKiAtKi0gbW9kZTogYzsgdGFiLXdpZHRoOiA4OyAtKi0gKi8KKy8qIHZpOiBzZXQgc3c9NCB0cz04OiAqLworLyogUmVmZXJlbmNlIHZlcnNpb24gb2YgZWdsLmggZm9yIEVHTCAxLjQuCisgKiAkUmV2aXNpb246IDcyNDQgJCBvbiAkRGF0ZTogMjAwOS0wMS0yMCAxNzowNjo1OSAtMDgwMCAoVHVlLCAyMCBKYW4gMjAwOSkgJAorICovCisKKy8qCisqKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisqKgorKiogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyoqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQvb3IgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyoqICJNYXRlcmlhbHMiKSwgdG8gZGVhbCBpbiB0aGUgTWF0ZXJpYWxzIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworKiogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorKiogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBNYXRlcmlhbHMsIGFuZCB0bworKiogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgTWF0ZXJpYWxzIGFyZSBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyoqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyoqCisqKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorKiogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgTWF0ZXJpYWxzLgorKioKKyoqIFRIRSBNQVRFUklBTFMgQVJFIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisqKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyoqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyoqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCisqKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorKiogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyoqIE1BVEVSSUFMUyBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBNQVRFUklBTFMuCisqLworCisjaWZuZGVmIF9fZWdsX2hfCisjZGVmaW5lIF9fZWdsX2hfCisKKy8qIEFsbCBwbGF0Zm9ybS1kZXBlbmRlbnQgdHlwZXMgYW5kIG1hY3JvIGJvaWxlcnBsYXRlIChzdWNoIGFzIEVHTEFQSQorICogYW5kIEVHTEFQSUVOVFJZKSBzaG91bGQgZ28gaW4gZWdscGxhdGZvcm0uaC4KKyAqLworI2luY2x1ZGUgPEVHTC9lZ2xwbGF0Zm9ybS5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEVHTCBUeXBlcyAqLworLyogRUdMaW50IGlzIGRlZmluZWQgaW4gZWdscGxhdGZvcm0uaCAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgRUdMQm9vbGVhbjsKK3R5cGVkZWYgdW5zaWduZWQgaW50IEVHTGVudW07Cit0eXBlZGVmIHZvaWQgKkVHTENvbmZpZzsKK3R5cGVkZWYgdm9pZCAqRUdMQ29udGV4dDsKK3R5cGVkZWYgdm9pZCAqRUdMRGlzcGxheTsKK3R5cGVkZWYgdm9pZCAqRUdMU3VyZmFjZTsKK3R5cGVkZWYgdm9pZCAqRUdMQ2xpZW50QnVmZmVyOworCisvKiBFR0wgVmVyc2lvbmluZyAqLworI2RlZmluZSBFR0xfVkVSU0lPTl8xXzAJCQkxCisjZGVmaW5lIEVHTF9WRVJTSU9OXzFfMQkJCTEKKyNkZWZpbmUgRUdMX1ZFUlNJT05fMV8yCQkJMQorI2RlZmluZSBFR0xfVkVSU0lPTl8xXzMJCQkxCisjZGVmaW5lIEVHTF9WRVJTSU9OXzFfNAkJCTEKKworLyogRUdMIEVudW1lcmFudHMuIEJpdG1hc2tzIGFuZCBvdGhlciBleGNlcHRpb25hbCBjYXNlcyBhc2lkZSwgbW9zdAorICogZW51bXMgYXJlIGFzc2lnbmVkIHVuaXF1ZSB2YWx1ZXMgc3RhcnRpbmcgYXQgMHgzMDAwLgorICovCisKKy8qIEVHTCBhbGlhc2VzICovCisjZGVmaW5lIEVHTF9GQUxTRQkJCTAKKyNkZWZpbmUgRUdMX1RSVUUJCQkxCisKKy8qIE91dC1vZi1iYW5kIGhhbmRsZSB2YWx1ZXMgKi8KKyNkZWZpbmUgRUdMX0RFRkFVTFRfRElTUExBWQkJKChFR0xOYXRpdmVEaXNwbGF5VHlwZSkwKQorI2RlZmluZSBFR0xfTk9fQ09OVEVYVAkJCSgoRUdMQ29udGV4dCkwKQorI2RlZmluZSBFR0xfTk9fRElTUExBWQkJCSgoRUdMRGlzcGxheSkwKQorI2RlZmluZSBFR0xfTk9fU1VSRkFDRQkJCSgoRUdMU3VyZmFjZSkwKQorCisvKiBPdXQtb2YtYmFuZCBhdHRyaWJ1dGUgdmFsdWUgKi8KKyNkZWZpbmUgRUdMX0RPTlRfQ0FSRQkJCSgoRUdMaW50KS0xKQorCisvKiBFcnJvcnMgLyBHZXRFcnJvciByZXR1cm4gdmFsdWVzICovCisjZGVmaW5lIEVHTF9TVUNDRVNTCQkJMHgzMDAwCisjZGVmaW5lIEVHTF9OT1RfSU5JVElBTElaRUQJCTB4MzAwMQorI2RlZmluZSBFR0xfQkFEX0FDQ0VTUwkJCTB4MzAwMgorI2RlZmluZSBFR0xfQkFEX0FMTE9DCQkJMHgzMDAzCisjZGVmaW5lIEVHTF9CQURfQVRUUklCVVRFCQkweDMwMDQKKyNkZWZpbmUgRUdMX0JBRF9DT05GSUcJCQkweDMwMDUKKyNkZWZpbmUgRUdMX0JBRF9DT05URVhUCQkJMHgzMDA2CisjZGVmaW5lIEVHTF9CQURfQ1VSUkVOVF9TVVJGQUNFCQkweDMwMDcKKyNkZWZpbmUgRUdMX0JBRF9ESVNQTEFZCQkJMHgzMDA4CisjZGVmaW5lIEVHTF9CQURfTUFUQ0gJCQkweDMwMDkKKyNkZWZpbmUgRUdMX0JBRF9OQVRJVkVfUElYTUFQCQkweDMwMEEKKyNkZWZpbmUgRUdMX0JBRF9OQVRJVkVfV0lORE9XCQkweDMwMEIKKyNkZWZpbmUgRUdMX0JBRF9QQVJBTUVURVIJCTB4MzAwQworI2RlZmluZSBFR0xfQkFEX1NVUkZBQ0UJCQkweDMwMEQKKyNkZWZpbmUgRUdMX0NPTlRFWFRfTE9TVAkJMHgzMDBFCS8qIEVHTCAxLjEgLSBJTUdfcG93ZXJfbWFuYWdlbWVudCAqLworCisvKiBSZXNlcnZlZCAweDMwMEYtMHgzMDFGIGZvciBhZGRpdGlvbmFsIGVycm9ycyAqLworCisvKiBDb25maWcgYXR0cmlidXRlcyAqLworI2RlZmluZSBFR0xfQlVGRkVSX1NJWkUJCQkweDMwMjAKKyNkZWZpbmUgRUdMX0FMUEhBX1NJWkUJCQkweDMwMjEKKyNkZWZpbmUgRUdMX0JMVUVfU0laRQkJCTB4MzAyMgorI2RlZmluZSBFR0xfR1JFRU5fU0laRQkJCTB4MzAyMworI2RlZmluZSBFR0xfUkVEX1NJWkUJCQkweDMwMjQKKyNkZWZpbmUgRUdMX0RFUFRIX1NJWkUJCQkweDMwMjUKKyNkZWZpbmUgRUdMX1NURU5DSUxfU0laRQkJMHgzMDI2CisjZGVmaW5lIEVHTF9DT05GSUdfQ0FWRUFUCQkweDMwMjcKKyNkZWZpbmUgRUdMX0NPTkZJR19JRAkJCTB4MzAyOAorI2RlZmluZSBFR0xfTEVWRUwJCQkweDMwMjkKKyNkZWZpbmUgRUdMX01BWF9QQlVGRkVSX0hFSUdIVAkJMHgzMDJBCisjZGVmaW5lIEVHTF9NQVhfUEJVRkZFUl9QSVhFTFMJCTB4MzAyQgorI2RlZmluZSBFR0xfTUFYX1BCVUZGRVJfV0lEVEgJCTB4MzAyQworI2RlZmluZSBFR0xfTkFUSVZFX1JFTkRFUkFCTEUJCTB4MzAyRAorI2RlZmluZSBFR0xfTkFUSVZFX1ZJU1VBTF9JRAkJMHgzMDJFCisjZGVmaW5lIEVHTF9OQVRJVkVfVklTVUFMX1RZUEUJCTB4MzAyRgorI2RlZmluZSBFR0xfUFJFU0VSVkVEX1JFU09VUkNFUwkJMHgzMDMwCisjZGVmaW5lIEVHTF9TQU1QTEVTCQkJMHgzMDMxCisjZGVmaW5lIEVHTF9TQU1QTEVfQlVGRkVSUwkJMHgzMDMyCisjZGVmaW5lIEVHTF9TVVJGQUNFX1RZUEUJCTB4MzAzMworI2RlZmluZSBFR0xfVFJBTlNQQVJFTlRfVFlQRQkJMHgzMDM0CisjZGVmaW5lIEVHTF9UUkFOU1BBUkVOVF9CTFVFX1ZBTFVFCTB4MzAzNQorI2RlZmluZSBFR0xfVFJBTlNQQVJFTlRfR1JFRU5fVkFMVUUJMHgzMDM2CisjZGVmaW5lIEVHTF9UUkFOU1BBUkVOVF9SRURfVkFMVUUJMHgzMDM3CisjZGVmaW5lIEVHTF9OT05FCQkJMHgzMDM4CS8qIEF0dHJpYiBsaXN0IHRlcm1pbmF0b3IgKi8KKyNkZWZpbmUgRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0IJCTB4MzAzOQorI2RlZmluZSBFR0xfQklORF9UT19URVhUVVJFX1JHQkEJMHgzMDNBCisjZGVmaW5lIEVHTF9NSU5fU1dBUF9JTlRFUlZBTAkJMHgzMDNCCisjZGVmaW5lIEVHTF9NQVhfU1dBUF9JTlRFUlZBTAkJMHgzMDNDCisjZGVmaW5lIEVHTF9MVU1JTkFOQ0VfU0laRQkJMHgzMDNECisjZGVmaW5lIEVHTF9BTFBIQV9NQVNLX1NJWkUJCTB4MzAzRQorI2RlZmluZSBFR0xfQ09MT1JfQlVGRkVSX1RZUEUJCTB4MzAzRgorI2RlZmluZSBFR0xfUkVOREVSQUJMRV9UWVBFCQkweDMwNDAKKyNkZWZpbmUgRUdMX01BVENIX05BVElWRV9QSVhNQVAJCTB4MzA0MQkvKiBQc2V1ZG8tYXR0cmlidXRlIChub3QgcXVlcnlhYmxlKSAqLworI2RlZmluZSBFR0xfQ09ORk9STUFOVAkJCTB4MzA0MgorCisvKiBSZXNlcnZlZCAweDMwNDEtMHgzMDRGIGZvciBhZGRpdGlvbmFsIGNvbmZpZyBhdHRyaWJ1dGVzICovCisKKy8qIENvbmZpZyBhdHRyaWJ1dGUgdmFsdWVzICovCisjZGVmaW5lIEVHTF9TTE9XX0NPTkZJRwkJCTB4MzA1MAkvKiBFR0xfQ09ORklHX0NBVkVBVCB2YWx1ZSAqLworI2RlZmluZSBFR0xfTk9OX0NPTkZPUk1BTlRfQ09ORklHCTB4MzA1MQkvKiBFR0xfQ09ORklHX0NBVkVBVCB2YWx1ZSAqLworI2RlZmluZSBFR0xfVFJBTlNQQVJFTlRfUkdCCQkweDMwNTIJLyogRUdMX1RSQU5TUEFSRU5UX1RZUEUgdmFsdWUgKi8KKyNkZWZpbmUgRUdMX1JHQl9CVUZGRVIJCQkweDMwOEUJLyogRUdMX0NPTE9SX0JVRkZFUl9UWVBFIHZhbHVlICovCisjZGVmaW5lIEVHTF9MVU1JTkFOQ0VfQlVGRkVSCQkweDMwOEYJLyogRUdMX0NPTE9SX0JVRkZFUl9UWVBFIHZhbHVlICovCisKKy8qIE1vcmUgY29uZmlnIGF0dHJpYnV0ZSB2YWx1ZXMsIGZvciBFR0xfVEVYVFVSRV9GT1JNQVQgKi8KKyNkZWZpbmUgRUdMX05PX1RFWFRVUkUJCQkweDMwNUMKKyNkZWZpbmUgRUdMX1RFWFRVUkVfUkdCCQkJMHgzMDVECisjZGVmaW5lIEVHTF9URVhUVVJFX1JHQkEJCTB4MzA1RQorI2RlZmluZSBFR0xfVEVYVFVSRV8yRAkJCTB4MzA1RgorCisvKiBDb25maWcgYXR0cmlidXRlIG1hc2sgYml0cyAqLworI2RlZmluZSBFR0xfUEJVRkZFUl9CSVQJCQkweDAwMDEJLyogRUdMX1NVUkZBQ0VfVFlQRSBtYXNrIGJpdHMgKi8KKyNkZWZpbmUgRUdMX1BJWE1BUF9CSVQJCQkweDAwMDIJLyogRUdMX1NVUkZBQ0VfVFlQRSBtYXNrIGJpdHMgKi8KKyNkZWZpbmUgRUdMX1dJTkRPV19CSVQJCQkweDAwMDQJLyogRUdMX1NVUkZBQ0VfVFlQRSBtYXNrIGJpdHMgKi8KKyNkZWZpbmUgRUdMX1ZHX0NPTE9SU1BBQ0VfTElORUFSX0JJVAkweDAwMjAJLyogRUdMX1NVUkZBQ0VfVFlQRSBtYXNrIGJpdHMgKi8KKyNkZWZpbmUgRUdMX1ZHX0FMUEhBX0ZPUk1BVF9QUkVfQklUCTB4MDA0MAkvKiBFR0xfU1VSRkFDRV9UWVBFIG1hc2sgYml0cyAqLworI2RlZmluZSBFR0xfTVVMVElTQU1QTEVfUkVTT0xWRV9CT1hfQklUIDB4MDIwMAkvKiBFR0xfU1VSRkFDRV9UWVBFIG1hc2sgYml0cyAqLworI2RlZmluZSBFR0xfU1dBUF9CRUhBVklPUl9QUkVTRVJWRURfQklUIDB4MDQwMAkvKiBFR0xfU1VSRkFDRV9UWVBFIG1hc2sgYml0cyAqLworCisjZGVmaW5lIEVHTF9PUEVOR0xfRVNfQklUCQkweDAwMDEJLyogRUdMX1JFTkRFUkFCTEVfVFlQRSBtYXNrIGJpdHMgKi8KKyNkZWZpbmUgRUdMX09QRU5WR19CSVQJCQkweDAwMDIJLyogRUdMX1JFTkRFUkFCTEVfVFlQRSBtYXNrIGJpdHMgKi8KKyNkZWZpbmUgRUdMX09QRU5HTF9FUzJfQklUCQkweDAwMDQJLyogRUdMX1JFTkRFUkFCTEVfVFlQRSBtYXNrIGJpdHMgKi8KKyNkZWZpbmUgRUdMX09QRU5HTF9CSVQJCQkweDAwMDgJLyogRUdMX1JFTkRFUkFCTEVfVFlQRSBtYXNrIGJpdHMgKi8KKworLyogUXVlcnlTdHJpbmcgdGFyZ2V0cyAqLworI2RlZmluZSBFR0xfVkVORE9SCQkJMHgzMDUzCisjZGVmaW5lIEVHTF9WRVJTSU9OCQkJMHgzMDU0CisjZGVmaW5lIEVHTF9FWFRFTlNJT05TCQkJMHgzMDU1CisjZGVmaW5lIEVHTF9DTElFTlRfQVBJUwkJCTB4MzA4RAorCisvKiBRdWVyeVN1cmZhY2UgLyBTdXJmYWNlQXR0cmliIC8gQ3JlYXRlUGJ1ZmZlclN1cmZhY2UgdGFyZ2V0cyAqLworI2RlZmluZSBFR0xfSEVJR0hUCQkJMHgzMDU2CisjZGVmaW5lIEVHTF9XSURUSAkJCTB4MzA1NworI2RlZmluZSBFR0xfTEFSR0VTVF9QQlVGRkVSCQkweDMwNTgKKyNkZWZpbmUgRUdMX1RFWFRVUkVfRk9STUFUCQkweDMwODAKKyNkZWZpbmUgRUdMX1RFWFRVUkVfVEFSR0VUCQkweDMwODEKKyNkZWZpbmUgRUdMX01JUE1BUF9URVhUVVJFCQkweDMwODIKKyNkZWZpbmUgRUdMX01JUE1BUF9MRVZFTAkJMHgzMDgzCisjZGVmaW5lIEVHTF9SRU5ERVJfQlVGRkVSCQkweDMwODYKKyNkZWZpbmUgRUdMX1ZHX0NPTE9SU1BBQ0UJCTB4MzA4NworI2RlZmluZSBFR0xfVkdfQUxQSEFfRk9STUFUCQkweDMwODgKKyNkZWZpbmUgRUdMX0hPUklaT05UQUxfUkVTT0xVVElPTgkweDMwOTAKKyNkZWZpbmUgRUdMX1ZFUlRJQ0FMX1JFU09MVVRJT04JCTB4MzA5MQorI2RlZmluZSBFR0xfUElYRUxfQVNQRUNUX1JBVElPCQkweDMwOTIKKyNkZWZpbmUgRUdMX1NXQVBfQkVIQVZJT1IJCTB4MzA5MworI2RlZmluZSBFR0xfTVVMVElTQU1QTEVfUkVTT0xWRQkJMHgzMDk5CisKKy8qIEVHTF9SRU5ERVJfQlVGRkVSIHZhbHVlcyAvIEJpbmRUZXhJbWFnZSAvIFJlbGVhc2VUZXhJbWFnZSBidWZmZXIgdGFyZ2V0cyAqLworI2RlZmluZSBFR0xfQkFDS19CVUZGRVIJCQkweDMwODQKKyNkZWZpbmUgRUdMX1NJTkdMRV9CVUZGRVIJCTB4MzA4NQorCisvKiBPcGVuVkcgY29sb3Igc3BhY2VzICovCisjZGVmaW5lIEVHTF9WR19DT0xPUlNQQUNFX3NSR0IJCTB4MzA4OQkvKiBFR0xfVkdfQ09MT1JTUEFDRSB2YWx1ZSAqLworI2RlZmluZSBFR0xfVkdfQ09MT1JTUEFDRV9MSU5FQVIJMHgzMDhBCS8qIEVHTF9WR19DT0xPUlNQQUNFIHZhbHVlICovCisKKy8qIE9wZW5WRyBhbHBoYSBmb3JtYXRzICovCisjZGVmaW5lIEVHTF9WR19BTFBIQV9GT1JNQVRfTk9OUFJFCTB4MzA4QgkvKiBFR0xfQUxQSEFfRk9STUFUIHZhbHVlICovCisjZGVmaW5lIEVHTF9WR19BTFBIQV9GT1JNQVRfUFJFCQkweDMwOEMJLyogRUdMX0FMUEhBX0ZPUk1BVCB2YWx1ZSAqLworCisvKiBDb25zdGFudCBzY2FsZSBmYWN0b3IgYnkgd2hpY2ggZnJhY3Rpb25hbCBkaXNwbGF5IHJlc29sdXRpb25zICYKKyAqIGFzcGVjdCByYXRpbyBhcmUgc2NhbGVkIHdoZW4gcXVlcmllZCBhcyBpbnRlZ2VyIHZhbHVlcy4KKyAqLworI2RlZmluZSBFR0xfRElTUExBWV9TQ0FMSU5HCQkxMDAwMAorCisvKiBVbmtub3duIGRpc3BsYXkgcmVzb2x1dGlvbi9hc3BlY3QgcmF0aW8gKi8KKyNkZWZpbmUgRUdMX1VOS05PV04JCQkoKEVHTGludCktMSkKKworLyogQmFjayBidWZmZXIgc3dhcCBiZWhhdmlvcnMgKi8KKyNkZWZpbmUgRUdMX0JVRkZFUl9QUkVTRVJWRUQJCTB4MzA5NAkvKiBFR0xfU1dBUF9CRUhBVklPUiB2YWx1ZSAqLworI2RlZmluZSBFR0xfQlVGRkVSX0RFU1RST1lFRAkJMHgzMDk1CS8qIEVHTF9TV0FQX0JFSEFWSU9SIHZhbHVlICovCisKKy8qIENyZWF0ZVBidWZmZXJGcm9tQ2xpZW50QnVmZmVyIGJ1ZmZlciB0eXBlcyAqLworI2RlZmluZSBFR0xfT1BFTlZHX0lNQUdFCQkweDMwOTYKKworLyogUXVlcnlDb250ZXh0IHRhcmdldHMgKi8KKyNkZWZpbmUgRUdMX0NPTlRFWFRfQ0xJRU5UX1RZUEUJCTB4MzA5NworCisvKiBDcmVhdGVDb250ZXh0IGF0dHJpYnV0ZXMgKi8KKyNkZWZpbmUgRUdMX0NPTlRFWFRfQ0xJRU5UX1ZFUlNJT04JMHgzMDk4CisKKy8qIE11bHRpc2FtcGxlIHJlc29sdXRpb24gYmVoYXZpb3JzICovCisjZGVmaW5lIEVHTF9NVUxUSVNBTVBMRV9SRVNPTFZFX0RFRkFVTFQgMHgzMDlBCS8qIEVHTF9NVUxUSVNBTVBMRV9SRVNPTFZFIHZhbHVlICovCisjZGVmaW5lIEVHTF9NVUxUSVNBTVBMRV9SRVNPTFZFX0JPWAkweDMwOUIJLyogRUdMX01VTFRJU0FNUExFX1JFU09MVkUgdmFsdWUgKi8KKworLyogQmluZEFQSS9RdWVyeUFQSSB0YXJnZXRzICovCisjZGVmaW5lIEVHTF9PUEVOR0xfRVNfQVBJCQkweDMwQTAKKyNkZWZpbmUgRUdMX09QRU5WR19BUEkJCQkweDMwQTEKKyNkZWZpbmUgRUdMX09QRU5HTF9BUEkJCQkweDMwQTIKKworLyogR2V0Q3VycmVudFN1cmZhY2UgdGFyZ2V0cyAqLworI2RlZmluZSBFR0xfRFJBVwkJCTB4MzA1OQorI2RlZmluZSBFR0xfUkVBRAkJCTB4MzA1QQorCisvKiBXYWl0TmF0aXZlIGVuZ2luZXMgKi8KKyNkZWZpbmUgRUdMX0NPUkVfTkFUSVZFX0VOR0lORQkJMHgzMDVCCisKKy8qIEVHTCAxLjIgdG9rZW5zIHJlbmFtZWQgZm9yIGNvbnNpc3RlbmN5IGluIEVHTCAxLjMgKi8KKyNkZWZpbmUgRUdMX0NPTE9SU1BBQ0UJCQlFR0xfVkdfQ09MT1JTUEFDRQorI2RlZmluZSBFR0xfQUxQSEFfRk9STUFUCQlFR0xfVkdfQUxQSEFfRk9STUFUCisjZGVmaW5lIEVHTF9DT0xPUlNQQUNFX3NSR0IJCUVHTF9WR19DT0xPUlNQQUNFX3NSR0IKKyNkZWZpbmUgRUdMX0NPTE9SU1BBQ0VfTElORUFSCQlFR0xfVkdfQ09MT1JTUEFDRV9MSU5FQVIKKyNkZWZpbmUgRUdMX0FMUEhBX0ZPUk1BVF9OT05QUkUJCUVHTF9WR19BTFBIQV9GT1JNQVRfTk9OUFJFCisjZGVmaW5lIEVHTF9BTFBIQV9GT1JNQVRfUFJFCQlFR0xfVkdfQUxQSEFfRk9STUFUX1BSRQorCisvKiBFR0wgZXh0ZW5zaW9ucyBtdXN0IHJlcXVlc3QgZW51bSBibG9ja3MgZnJvbSB0aGUgS2hyb25vcworICogQVBJIFJlZ2lzdHJhciwgd2hvIG1haW50YWlucyB0aGUgZW51bWVyYW50IHJlZ2lzdHJ5LiBTdWJtaXQKKyAqIGEgYnVnIGluIEtocm9ub3MgQnVnemlsbGEgYWdhaW5zdCB0YXNrICJSZWdpc3RyeSIuCisgKi8KKworCisKKy8qIEVHTCBGdW5jdGlvbnMgKi8KKworRUdMQVBJIEVHTGludCBFR0xBUElFTlRSWSBlZ2xHZXRFcnJvcih2b2lkKTsKKworRUdMQVBJIEVHTERpc3BsYXkgRUdMQVBJRU5UUlkgZWdsR2V0RGlzcGxheShFR0xOYXRpdmVEaXNwbGF5VHlwZSBkaXNwbGF5X2lkKTsKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbEluaXRpYWxpemUoRUdMRGlzcGxheSBkcHksIEVHTGludCAqbWFqb3IsIEVHTGludCAqbWlub3IpOworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsVGVybWluYXRlKEVHTERpc3BsYXkgZHB5KTsKKworRUdMQVBJIGNvbnN0IGNoYXIgKiBFR0xBUElFTlRSWSBlZ2xRdWVyeVN0cmluZyhFR0xEaXNwbGF5IGRweSwgRUdMaW50IG5hbWUpOworCitFR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xHZXRDb25maWdzKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgKmNvbmZpZ3MsCisJCQkgRUdMaW50IGNvbmZpZ19zaXplLCBFR0xpbnQgKm51bV9jb25maWcpOworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsQ2hvb3NlQ29uZmlnKEVHTERpc3BsYXkgZHB5LCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0LAorCQkJICAgRUdMQ29uZmlnICpjb25maWdzLCBFR0xpbnQgY29uZmlnX3NpemUsCisJCQkgICBFR0xpbnQgKm51bV9jb25maWcpOworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsR2V0Q29uZmlnQXR0cmliKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLAorCQkJICAgICAgRUdMaW50IGF0dHJpYnV0ZSwgRUdMaW50ICp2YWx1ZSk7CisKK0VHTEFQSSBFR0xTdXJmYWNlIEVHTEFQSUVOVFJZIGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsCisJCQkJICBFR0xOYXRpdmVXaW5kb3dUeXBlIHdpbiwKKwkJCQkgIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpOworRUdMQVBJIEVHTFN1cmZhY2UgRUdMQVBJRU5UUlkgZWdsQ3JlYXRlUGJ1ZmZlclN1cmZhY2UoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsCisJCQkJICAgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCk7CitFR0xBUEkgRUdMU3VyZmFjZSBFR0xBUElFTlRSWSBlZ2xDcmVhdGVQaXhtYXBTdXJmYWNlKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLAorCQkJCSAgRUdMTmF0aXZlUGl4bWFwVHlwZSBwaXhtYXAsCisJCQkJICBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KTsKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbERlc3Ryb3lTdXJmYWNlKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UpOworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsUXVlcnlTdXJmYWNlKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UsCisJCQkgICBFR0xpbnQgYXR0cmlidXRlLCBFR0xpbnQgKnZhbHVlKTsKKworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsQmluZEFQSShFR0xlbnVtIGFwaSk7CitFR0xBUEkgRUdMZW51bSBFR0xBUElFTlRSWSBlZ2xRdWVyeUFQSSh2b2lkKTsKKworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsV2FpdENsaWVudCh2b2lkKTsKKworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsUmVsZWFzZVRocmVhZCh2b2lkKTsKKworRUdMQVBJIEVHTFN1cmZhY2UgRUdMQVBJRU5UUlkgZWdsQ3JlYXRlUGJ1ZmZlckZyb21DbGllbnRCdWZmZXIoCisJICAgICAgRUdMRGlzcGxheSBkcHksIEVHTGVudW0gYnVmdHlwZSwgRUdMQ2xpZW50QnVmZmVyIGJ1ZmZlciwKKwkgICAgICBFR0xDb25maWcgY29uZmlnLCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KTsKKworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsU3VyZmFjZUF0dHJpYihFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmYWNlLAorCQkJICAgIEVHTGludCBhdHRyaWJ1dGUsIEVHTGludCB2YWx1ZSk7CitFR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xCaW5kVGV4SW1hZ2UoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyZmFjZSwgRUdMaW50IGJ1ZmZlcik7CitFR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xSZWxlYXNlVGV4SW1hZ2UoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyZmFjZSwgRUdMaW50IGJ1ZmZlcik7CisKKworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsU3dhcEludGVydmFsKEVHTERpc3BsYXkgZHB5LCBFR0xpbnQgaW50ZXJ2YWwpOworCisKK0VHTEFQSSBFR0xDb250ZXh0IEVHTEFQSUVOVFJZIGVnbENyZWF0ZUNvbnRleHQoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsCisJCQkgICAgRUdMQ29udGV4dCBzaGFyZV9jb250ZXh0LAorCQkJICAgIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpOworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsRGVzdHJveUNvbnRleHQoRUdMRGlzcGxheSBkcHksIEVHTENvbnRleHQgY3R4KTsKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbE1ha2VDdXJyZW50KEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIGRyYXcsCisJCQkgIEVHTFN1cmZhY2UgcmVhZCwgRUdMQ29udGV4dCBjdHgpOworCitFR0xBUEkgRUdMQ29udGV4dCBFR0xBUElFTlRSWSBlZ2xHZXRDdXJyZW50Q29udGV4dCh2b2lkKTsKK0VHTEFQSSBFR0xTdXJmYWNlIEVHTEFQSUVOVFJZIGVnbEdldEN1cnJlbnRTdXJmYWNlKEVHTGludCByZWFkZHJhdyk7CitFR0xBUEkgRUdMRGlzcGxheSBFR0xBUElFTlRSWSBlZ2xHZXRDdXJyZW50RGlzcGxheSh2b2lkKTsKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbFF1ZXJ5Q29udGV4dChFR0xEaXNwbGF5IGRweSwgRUdMQ29udGV4dCBjdHgsCisJCQkgICBFR0xpbnQgYXR0cmlidXRlLCBFR0xpbnQgKnZhbHVlKTsKKworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsV2FpdEdMKHZvaWQpOworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsV2FpdE5hdGl2ZShFR0xpbnQgZW5naW5lKTsKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbFN3YXBCdWZmZXJzKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UpOworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsQ29weUJ1ZmZlcnMoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyZmFjZSwKKwkJCSAgRUdMTmF0aXZlUGl4bWFwVHlwZSB0YXJnZXQpOworCisvKiBUaGlzIGlzIGEgZ2VuZXJpYyBmdW5jdGlvbiBwb2ludGVyIHR5cGUsIHdob3NlIG5hbWUgaW5kaWNhdGVzIGl0IG11c3QKKyAqIGJlIGNhc3QgdG8gdGhlIHByb3BlciB0eXBlICphbmQgY2FsbGluZyBjb252ZW50aW9uKiBiZWZvcmUgdXNlLgorICovCit0eXBlZGVmIHZvaWQgKCpfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKSh2b2lkKTsKKworLyogTm93LCBkZWZpbmUgZWdsR2V0UHJvY0FkZHJlc3MgdXNpbmcgdGhlIGdlbmVyaWMgZnVuY3Rpb24gcHRyLiB0eXBlICovCitFR0xBUEkgX19lZ2xNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSBFR0xBUElFTlRSWQorICAgICAgIGVnbEdldFByb2NBZGRyZXNzKGNvbnN0IGNoYXIgKnByb2NuYW1lKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fZWdsX2hfICovCmRpZmYgLS1naXQgYS9vcGVuZ2wvaW5jbHVkZS9FR0wvZWdsZXh0LmggYi9vcGVuZ2wvaW5jbHVkZS9FR0wvZWdsZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVjZmNiOAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC9pbmNsdWRlL0VHTC9lZ2xleHQuaApAQCAtMCwwICsxLDEzOCBAQAorI2lmbmRlZiBfX2VnbGV4dF9oXworI2RlZmluZSBfX2VnbGV4dF9oXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qCisqKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisqKgorKiogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyoqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQvb3IgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyoqICJNYXRlcmlhbHMiKSwgdG8gZGVhbCBpbiB0aGUgTWF0ZXJpYWxzIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworKiogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorKiogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBNYXRlcmlhbHMsIGFuZCB0bworKiogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgTWF0ZXJpYWxzIGFyZSBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyoqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyoqCisqKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorKiogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgTWF0ZXJpYWxzLgorKioKKyoqIFRIRSBNQVRFUklBTFMgQVJFIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisqKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyoqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyoqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCisqKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorKiogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyoqIE1BVEVSSUFMUyBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBNQVRFUklBTFMuCisqLworCisjaW5jbHVkZSA8RUdML2VnbHBsYXRmb3JtLmg+CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBIZWFkZXIgZmlsZSB2ZXJzaW9uIG51bWJlciAqLworLyogQ3VycmVudCB2ZXJzaW9uIGF0IGh0dHA6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvZWdsLyAqLworLyogJFJldmlzaW9uOiA3MjQ0ICQgb24gJERhdGU6IDIwMDktMDEtMjAgMTc6MDY6NTkgLTA4MDAgKFR1ZSwgMjAgSmFuIDIwMDkpICQgKi8KKyNkZWZpbmUgRUdMX0VHTEVYVF9WRVJTSU9OIDMKKworI2lmbmRlZiBFR0xfS0hSX2NvbmZpZ19hdHRyaWJzCisjZGVmaW5lIEVHTF9LSFJfY29uZmlnX2F0dHJpYnMgMQorI2RlZmluZSBFR0xfQ09ORk9STUFOVF9LSFIJCQkweDMwNDIJLyogRUdMQ29uZmlnIGF0dHJpYnV0ZSAqLworI2RlZmluZSBFR0xfVkdfQ09MT1JTUEFDRV9MSU5FQVJfQklUX0tIUgkweDAwMjAJLyogRUdMX1NVUkZBQ0VfVFlQRSBiaXRmaWVsZCAqLworI2RlZmluZSBFR0xfVkdfQUxQSEFfRk9STUFUX1BSRV9CSVRfS0hSCQkweDAwNDAJLyogRUdMX1NVUkZBQ0VfVFlQRSBiaXRmaWVsZCAqLworI2VuZGlmCisKKyNpZm5kZWYgRUdMX0tIUl9sb2NrX3N1cmZhY2UKKyNkZWZpbmUgRUdMX0tIUl9sb2NrX3N1cmZhY2UgMQorI2RlZmluZSBFR0xfUkVBRF9TVVJGQUNFX0JJVF9LSFIJCTB4MDAwMQkvKiBFR0xfTE9DS19VU0FHRV9ISU5UX0tIUiBiaXRmaWVsZCAqLworI2RlZmluZSBFR0xfV1JJVEVfU1VSRkFDRV9CSVRfS0hSCQkweDAwMDIJLyogRUdMX0xPQ0tfVVNBR0VfSElOVF9LSFIgYml0ZmllbGQgKi8KKyNkZWZpbmUgRUdMX0xPQ0tfU1VSRkFDRV9CSVRfS0hSCQkweDAwODAJLyogRUdMX1NVUkZBQ0VfVFlQRSBiaXRmaWVsZCAqLworI2RlZmluZSBFR0xfT1BUSU1BTF9GT1JNQVRfQklUX0tIUgkJMHgwMTAwCS8qIEVHTF9TVVJGQUNFX1RZUEUgYml0ZmllbGQgKi8KKyNkZWZpbmUgRUdMX01BVENIX0ZPUk1BVF9LSFIJCQkweDMwNDMJLyogRUdMQ29uZmlnIGF0dHJpYnV0ZSAqLworI2RlZmluZSBFR0xfRk9STUFUX1JHQl81NjVfRVhBQ1RfS0hSCQkweDMwQzAJLyogRUdMX01BVENIX0ZPUk1BVF9LSFIgdmFsdWUgKi8KKyNkZWZpbmUgRUdMX0ZPUk1BVF9SR0JfNTY1X0tIUgkJCTB4MzBDMQkvKiBFR0xfTUFUQ0hfRk9STUFUX0tIUiB2YWx1ZSAqLworI2RlZmluZSBFR0xfRk9STUFUX1JHQkFfODg4OF9FWEFDVF9LSFIJCTB4MzBDMgkvKiBFR0xfTUFUQ0hfRk9STUFUX0tIUiB2YWx1ZSAqLworI2RlZmluZSBFR0xfRk9STUFUX1JHQkFfODg4OF9LSFIJCTB4MzBDMwkvKiBFR0xfTUFUQ0hfRk9STUFUX0tIUiB2YWx1ZSAqLworI2RlZmluZSBFR0xfTUFQX1BSRVNFUlZFX1BJWEVMU19LSFIJCTB4MzBDNAkvKiBlZ2xMb2NrU3VyZmFjZUtIUiBhdHRyaWJ1dGUgKi8KKyNkZWZpbmUgRUdMX0xPQ0tfVVNBR0VfSElOVF9LSFIJCQkweDMwQzUJLyogZWdsTG9ja1N1cmZhY2VLSFIgYXR0cmlidXRlICovCisjZGVmaW5lIEVHTF9CSVRNQVBfUE9JTlRFUl9LSFIJCQkweDMwQzYJLyogZWdsUXVlcnlTdXJmYWNlIGF0dHJpYnV0ZSAqLworI2RlZmluZSBFR0xfQklUTUFQX1BJVENIX0tIUgkJCTB4MzBDNwkvKiBlZ2xRdWVyeVN1cmZhY2UgYXR0cmlidXRlICovCisjZGVmaW5lIEVHTF9CSVRNQVBfT1JJR0lOX0tIUgkJCTB4MzBDOAkvKiBlZ2xRdWVyeVN1cmZhY2UgYXR0cmlidXRlICovCisjZGVmaW5lIEVHTF9CSVRNQVBfUElYRUxfUkVEX09GRlNFVF9LSFIJCTB4MzBDOQkvKiBlZ2xRdWVyeVN1cmZhY2UgYXR0cmlidXRlICovCisjZGVmaW5lIEVHTF9CSVRNQVBfUElYRUxfR1JFRU5fT0ZGU0VUX0tIUgkweDMwQ0EJLyogZWdsUXVlcnlTdXJmYWNlIGF0dHJpYnV0ZSAqLworI2RlZmluZSBFR0xfQklUTUFQX1BJWEVMX0JMVUVfT0ZGU0VUX0tIUgkweDMwQ0IJLyogZWdsUXVlcnlTdXJmYWNlIGF0dHJpYnV0ZSAqLworI2RlZmluZSBFR0xfQklUTUFQX1BJWEVMX0FMUEhBX09GRlNFVF9LSFIJMHgzMENDCS8qIGVnbFF1ZXJ5U3VyZmFjZSBhdHRyaWJ1dGUgKi8KKyNkZWZpbmUgRUdMX0JJVE1BUF9QSVhFTF9MVU1JTkFOQ0VfT0ZGU0VUX0tIUgkweDMwQ0QJLyogZWdsUXVlcnlTdXJmYWNlIGF0dHJpYnV0ZSAqLworI2RlZmluZSBFR0xfTE9XRVJfTEVGVF9LSFIJCQkweDMwQ0UJLyogRUdMX0JJVE1BUF9PUklHSU5fS0hSIHZhbHVlICovCisjZGVmaW5lIEVHTF9VUFBFUl9MRUZUX0tIUgkJCTB4MzBDRgkvKiBFR0xfQklUTUFQX09SSUdJTl9LSFIgdmFsdWUgKi8KKyNpZmRlZiBFR0xfRUdMRVhUX1BST1RPVFlQRVMKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbExvY2tTdXJmYWNlS0hSIChFR0xEaXNwbGF5IGRpc3BsYXksIEVHTFN1cmZhY2Ugc3VyZmFjZSwgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCk7CitFR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xVbmxvY2tTdXJmYWNlS0hSIChFR0xEaXNwbGF5IGRpc3BsYXksIEVHTFN1cmZhY2Ugc3VyZmFjZSk7CisjZW5kaWYgLyogRUdMX0VHTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIEVHTEJvb2xlYW4gKEVHTEFQSUVOVFJZUCBQRk5FR0xMT0NLU1VSRkFDRUtIUlBST0MpIChFR0xEaXNwbGF5IGRpc3BsYXksIEVHTFN1cmZhY2Ugc3VyZmFjZSwgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCk7Cit0eXBlZGVmIEVHTEJvb2xlYW4gKEVHTEFQSUVOVFJZUCBQRk5FR0xVTkxPQ0tTVVJGQUNFS0hSUFJPQykgKEVHTERpc3BsYXkgZGlzcGxheSwgRUdMU3VyZmFjZSBzdXJmYWNlKTsKKyNlbmRpZgorCisjaWZuZGVmIEVHTF9LSFJfaW1hZ2UKKyNkZWZpbmUgRUdMX0tIUl9pbWFnZSAxCisjZGVmaW5lIEVHTF9OQVRJVkVfUElYTUFQX0tIUgkJCTB4MzBCMAkvKiBlZ2xDcmVhdGVJbWFnZUtIUiB0YXJnZXQgKi8KK3R5cGVkZWYgdm9pZCAqRUdMSW1hZ2VLSFI7CisjZGVmaW5lIEVHTF9OT19JTUFHRV9LSFIJCQkoKEVHTEltYWdlS0hSKTApCisjaWZkZWYgRUdMX0VHTEVYVF9QUk9UT1RZUEVTCitFR0xBUEkgRUdMSW1hZ2VLSFIgRUdMQVBJRU5UUlkgZWdsQ3JlYXRlSW1hZ2VLSFIgKEVHTERpc3BsYXkgZHB5LCBFR0xDb250ZXh0IGN0eCwgRUdMZW51bSB0YXJnZXQsIEVHTENsaWVudEJ1ZmZlciBidWZmZXIsIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpOworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsRGVzdHJveUltYWdlS0hSIChFR0xEaXNwbGF5IGRweSwgRUdMSW1hZ2VLSFIgaW1hZ2UpOworI2VuZGlmIC8qIEVHTF9FR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiBFR0xJbWFnZUtIUiAoRUdMQVBJRU5UUllQIFBGTkVHTENSRUFURUlNQUdFS0hSUFJPQykgKEVHTERpc3BsYXkgZHB5LCBFR0xDb250ZXh0IGN0eCwgRUdMZW51bSB0YXJnZXQsIEVHTENsaWVudEJ1ZmZlciBidWZmZXIsIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpOwordHlwZWRlZiBFR0xCb29sZWFuIChFR0xBUElFTlRSWVAgUEZORUdMREVTVFJPWUlNQUdFS0hSUFJPQykgKEVHTERpc3BsYXkgZHB5LCBFR0xJbWFnZUtIUiBpbWFnZSk7CisjZW5kaWYKKworI2lmbmRlZiBFR0xfS0hSX3ZnX3BhcmVudF9pbWFnZQorI2RlZmluZSBFR0xfS0hSX3ZnX3BhcmVudF9pbWFnZSAxCisjZGVmaW5lIEVHTF9WR19QQVJFTlRfSU1BR0VfS0hSCQkJMHgzMEJBCS8qIGVnbENyZWF0ZUltYWdlS0hSIHRhcmdldCAqLworI2VuZGlmCisKKyNpZm5kZWYgRUdMX0tIUl9nbF90ZXh0dXJlXzJEX2ltYWdlCisjZGVmaW5lIEVHTF9LSFJfZ2xfdGV4dHVyZV8yRF9pbWFnZSAxCisjZGVmaW5lIEVHTF9HTF9URVhUVVJFXzJEX0tIUgkJCTB4MzBCMQkvKiBlZ2xDcmVhdGVJbWFnZUtIUiB0YXJnZXQgKi8KKyNkZWZpbmUgRUdMX0dMX1RFWFRVUkVfTEVWRUxfS0hSCQkweDMwQkMJLyogZWdsQ3JlYXRlSW1hZ2VLSFIgYXR0cmlidXRlICovCisjZW5kaWYKKworI2lmbmRlZiBFR0xfS0hSX2dsX3RleHR1cmVfY3ViZW1hcF9pbWFnZQorI2RlZmluZSBFR0xfS0hSX2dsX3RleHR1cmVfY3ViZW1hcF9pbWFnZSAxCisjZGVmaW5lIEVHTF9HTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1hfS0hSCTB4MzBCMwkvKiBlZ2xDcmVhdGVJbWFnZUtIUiB0YXJnZXQgKi8KKyNkZWZpbmUgRUdMX0dMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWF9LSFIJMHgzMEI0CS8qIGVnbENyZWF0ZUltYWdlS0hSIHRhcmdldCAqLworI2RlZmluZSBFR0xfR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9ZX0tIUgkweDMwQjUJLyogZWdsQ3JlYXRlSW1hZ2VLSFIgdGFyZ2V0ICovCisjZGVmaW5lIEVHTF9HTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1lfS0hSCTB4MzBCNgkvKiBlZ2xDcmVhdGVJbWFnZUtIUiB0YXJnZXQgKi8KKyNkZWZpbmUgRUdMX0dMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWl9LSFIJMHgzMEI3CS8qIGVnbENyZWF0ZUltYWdlS0hSIHRhcmdldCAqLworI2RlZmluZSBFR0xfR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9aX0tIUgkweDMwQjgJLyogZWdsQ3JlYXRlSW1hZ2VLSFIgdGFyZ2V0ICovCisjZW5kaWYKKworI2lmbmRlZiBFR0xfS0hSX2dsX3RleHR1cmVfM0RfaW1hZ2UKKyNkZWZpbmUgRUdMX0tIUl9nbF90ZXh0dXJlXzNEX2ltYWdlIDEKKyNkZWZpbmUgRUdMX0dMX1RFWFRVUkVfM0RfS0hSCQkJMHgzMEIyCS8qIGVnbENyZWF0ZUltYWdlS0hSIHRhcmdldCAqLworI2RlZmluZSBFR0xfR0xfVEVYVFVSRV9aT0ZGU0VUX0tIUgkJMHgzMEJECS8qIGVnbENyZWF0ZUltYWdlS0hSIGF0dHJpYnV0ZSAqLworI2VuZGlmCisKKyNpZm5kZWYgRUdMX0tIUl9nbF9yZW5kZXJidWZmZXJfaW1hZ2UKKyNkZWZpbmUgRUdMX0tIUl9nbF9yZW5kZXJidWZmZXJfaW1hZ2UgMQorI2RlZmluZSBFR0xfR0xfUkVOREVSQlVGRkVSX0tIUgkJCTB4MzBCOQkvKiBlZ2xDcmVhdGVJbWFnZUtIUiB0YXJnZXQgKi8KKyNlbmRpZgorCisjaWZuZGVmIEVHTF9LSFJfaW1hZ2VfYmFzZQorI2RlZmluZSBFR0xfS0hSX2ltYWdlX2Jhc2UgMQorLyogTW9zdCBpbnRlcmZhY2VzIGRlZmluZWQgYnkgRUdMX0tIUl9pbWFnZV9waXhtYXAgYWJvdmUgKi8KKyNkZWZpbmUgRUdMX0lNQUdFX1BSRVNFUlZFRF9LSFIJCQkweDMwRDIJLyogZWdsQ3JlYXRlSW1hZ2VLSFIgYXR0cmlidXRlICovCisjZW5kaWYKKworI2lmbmRlZiBFR0xfS0hSX2ltYWdlX3BpeG1hcAorI2RlZmluZSBFR0xfS0hSX2ltYWdlX3BpeG1hcCAxCisvKiBJbnRlcmZhY2VzIGRlZmluZWQgYnkgRUdMX0tIUl9pbWFnZSBhYm92ZSAqLworI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmdsL2luY2x1ZGUvRUdML2VnbG5hdGl2ZXMuaCBiL29wZW5nbC9pbmNsdWRlL0VHTC9lZ2xuYXRpdmVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE2MjJkYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC9pbmNsdWRlL0VHTC9lZ2xuYXRpdmVzLmgKQEAgLTAsMCArMSwyNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfRUdMTkFUSVZFU19ICisjZGVmaW5lIEFORFJPSURfRUdMTkFUSVZFU19ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGZsYWdzIHJldHVybmVkIGZyb20gc3dhcEJ1ZmZlciAqLworI2RlZmluZSBFR0xfTkFUSVZFU19GTEFHX1NJWkVfQ0hBTkdFRCAgICAgICAweDAwMDAwMDAxCisKKy8qIHN1cmZhY2UgZmxhZ3MgKi8KKyNkZWZpbmUgRUdMX05BVElWRVNfRkxBR19ERVNUUk9ZX0JBQ0tCVUZGRVIgMHgwMDAwMDAwMQorCitlbnVtIG5hdGl2ZV9waXhlbF9mb3JtYXRfdAoreworICAgIE5BVElWRV9QSVhFTF9GT1JNQVRfUkdCQV84ODg4ICAgPSAxLAorICAgIE5BVElWRV9QSVhFTF9GT1JNQVRfUkdCXzU2NSAgICAgPSA0LAorICAgIE5BVElWRV9QSVhFTF9GT1JNQVRfQkdSQV84ODg4ICAgPSA1LAorICAgIE5BVElWRV9QSVhFTF9GT1JNQVRfUkdCQV81NTUxICAgPSA2LAorICAgIE5BVElWRV9QSVhFTF9GT1JNQVRfUkdCQV80NDQ0ICAgPSA3LAorICAgIE5BVElWRV9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIyX1NQPSAweDEwLAorICAgIE5BVElWRV9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIwX1NQPSAweDExLAorfTsKKworZW51bSBuYXRpdmVfbWVtb3J5X3R5cGVfdAoreworICAgIE5BVElWRV9NRU1PUllfVFlQRV9QTUVNICAgICAgICAgPSAwLAorICAgIE5BVElWRV9NRU1PUllfVFlQRV9HUFUgICAgICAgICAgPSAxLAorICAgIE5BVElWRV9NRU1PUllfVFlQRV9GQiAgICAgICAgICAgPSAyLAorICAgIE5BVElWRV9NRU1PUllfVFlQRV9IRUFQICAgICAgICAgPSAxMjgKK307CisKKworc3RydWN0IGVnbF9uYXRpdmVfd2luZG93X3QKK3sKKyAgICAvKgorICAgICAqIG1hZ2ljIG11c3QgYmUgc2V0IHRvIDB4NjAwOTEzCisgICAgICovCisgICAgdWludDMyX3QgICAgbWFnaWM7CisgICAgCisgICAgLyoKKyAgICAgKiBtdXN0IGJlIHNpemVvZihlZ2xfbmF0aXZlX3dpbmRvd190KQorICAgICAqLworICAgIHVpbnQzMl90ICAgIHZlcnNpb247CisKKyAgICAvKgorICAgICAqIGlkZW50IGlzIHJlc2VydmVkIGZvciB0aGUgQW5kcm9pZCBwbGF0Zm9ybQorICAgICAqLworICAgIHVpbnQzMl90ICAgIGlkZW50OworICAgIAorICAgIC8qCisgICAgICogd2lkdGgsIGhlaWdodCBhbmQgc3RyaWRlIG9mIHRoZSB3aW5kb3cgaW4gcGl4ZWxzCisgICAgICogQW55IG9mIHRoZXNlIHZhbHVlIGNhbiBiZSBudWwgaW4gd2hpY2ggY2FzZSBHTCBjb21tYW5kcyBhcmUKKyAgICAgKiBhY2NlcHRlZCBhbmQgcHJvY2Vzc2VkIGFzIHVzdWFsLCBidXQgbm90IHJlbmRlcmluZyBvY2N1cnMuCisgICAgICovCisgICAgaW50ICAgICAgICAgd2lkdGg7ICAgICAgLy8gdz1oPTAgaXMgbGVnYWwKKyAgICBpbnQgICAgICAgICBoZWlnaHQ7CisgICAgaW50ICAgICAgICAgc3RyaWRlOworCisgICAgLyoKKyAgICAgKiBmb3JtYXQgb2YgdGhlIG5hdGl2ZSB3aW5kb3cgKHNlZSB1aS9QaXhlbEZvcm1hdC5oKQorICAgICAqLworICAgIGludCAgICAgICAgIGZvcm1hdDsKKyAgICAKKyAgICAvKgorICAgICAqIE9mZnNldCBvZiB0aGUgYml0cyBpbiB0aGUgVlJBTQorICAgICAqLworICAgIGludHB0cl90ICAgIG9mZnNldDsKKyAgICAKKyAgICAvKgorICAgICAqIGZsYWdzIGRlc2NyaWJpbmcgc29tZSBhdHRyaWJ1dGVzIG9mIHRoaXMgc3VyZmFjZQorICAgICAqIEVHTF9OQVRJVkVTX0ZMQUdfREVTVFJPWV9CQUNLQlVGRkVSOiBiYWNrYnVmZmVyIG5vdCBwcmVzZXJ2ZWQgYWZ0ZXIgCisgICAgICogZWdsU3dhcEJ1ZmZlcnMKKyAgICAgKi8KKyAgICB1aW50MzJfdCAgICBmbGFnczsKKyAgICAKKyAgICAvKgorICAgICAqIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIHJlc29sdXRpb24gaW4gRFBJCisgICAgICovCisgICAgZmxvYXQgICAgICAgeGRwaTsKKyAgICBmbG9hdCAgICAgICB5ZHBpOworICAgIAorICAgIC8qCisgICAgICogcmVmcmVzaCByYXRlIGluIGZyYW1lcyBwZXIgc2Vjb25kIChIeikKKyAgICAgKi8KKyAgICBmbG9hdCAgICAgICBmcHM7CisgICAgCisgICAgCisgICAgLyoKKyAgICAgKiAgQmFzZSBtZW1vcnkgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBzdXJmYWNlIGluIHRoZSBDUFUgc2lkZQorICAgICAqLworICAgIGludHB0cl90ICAgIGJhc2U7CisgICAgCisgICAgLyoKKyAgICAgKiAgSGVhcCB0aGUgb2Zmc2V0IGFib3ZlIGlzIGJhc2VkIGZyb20KKyAgICAgKi8KKyAgICBpbnQgICAgICAgICBmZDsKKyAgICAKKyAgICAvKgorICAgICAqICBNZW1vcnkgdHlwZSB0aGUgc3VyZmFjZSByZXNpZGVzIGludG8KKyAgICAgKi8KKyAgICB1aW50OF90ICAgICBtZW1vcnlfdHlwZTsKKyAgICAKKyAgICAvKgorICAgICAqIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiBNVVNUIEJFIFpFUk8uCisgICAgICovCisgICAgdWludDhfdCAgICAgcmVzZXJ2ZWRfcGFkWzNdOworICAgIGludCAgICAgICAgIHJlc2VydmVkWzhdOworICAgIAorICAgIC8qCisgICAgICogVmVydGljYWwgc3RyaWRlIChvbmx5IHJlbGV2YW50IHdpdGggcGxhbmFyIGZvcm1hdHMpIAorICAgICAqLworICAgIAorICAgIGludCAgICAgICAgIHZzdHJpZGU7CisKKyAgICAvKgorICAgICAqIEhvb2sgY2FsbGVkIGJ5IEVHTCB0byBob2xkIGEgcmVmZXJlbmNlIG9uIHRoaXMgc3RydWN0dXJlCisgICAgICovCisgICAgdm9pZCAgICAgICAgKCppbmNSZWYpKHN0cnVjdCBlZ2xfbmF0aXZlX3dpbmRvd190KiB3aW5kb3cpOworCisgICAgLyoKKyAgICAgKiBIb29rIGNhbGxlZCBieSBFR0wgdG8gcmVsZWFzZSBhIHJlZmVyZW5jZSBvbiB0aGlzIHN0cnVjdHVyZQorICAgICAqLworICAgIHZvaWQgICAgICAgICgqZGVjUmVmKShzdHJ1Y3QgZWdsX25hdGl2ZV93aW5kb3dfdCogd2luZG93KTsKKworICAgIC8qCisgICAgICogSG9vayBjYWxsZWQgYnkgRUdMIHRvIHBlcmZvcm0gYSBwYWdlIGZsaXAuIFRoaXMgZnVuY3Rpb24KKyAgICAgKiBtYXkgdXBkYXRlIHRoZSBzaXplIGF0dHJpYnV0ZXMgYWJvdmUsIGluIHdoaWNoIGNhc2UgaXQgcmV0dXJucworICAgICAqIHRoZSBFR0xfTkFUSVZFU19GTEFHX1NJWkVfQ0hBTkdFRCBiaXQgc2V0LgorICAgICAqLworICAgIHVpbnQzMl90ICAgICgqc3dhcEJ1ZmZlcnMpKHN0cnVjdCBlZ2xfbmF0aXZlX3dpbmRvd190KiB3aW5kb3cpOworICAgIAorICAgIC8qCisgICAgICogUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuIE1VU1QgQkUgWkVSTy4KKyAgICAgKi8KKyAgICB2b2lkICAgICAgICAoKnJlc2VydmVkX3Byb2NfMCkodm9pZCk7CisKKyAgICAvKgorICAgICAqIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiBNVVNUIEJFIFpFUk8uCisgICAgICovCisgICAgdm9pZCAgICAgICAgKCpyZXNlcnZlZF9wcm9jXzEpKHZvaWQpOworICAgIAorICAgIC8qCisgICAgICogUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuIE1VU1QgQkUgWkVSTy4KKyAgICAgKi8KKyAgICB2b2lkICAgICAgICAoKnJlc2VydmVkX3Byb2NfMikodm9pZCk7CisKKyAgICAKKyAgICAvKgorICAgICAqIEhvb2sgY2FsbGVkIGJ5IEVHTCB3aGVuIHRoZSBuYXRpdmUgc3VyZmFjZSBpcyBhc3NvY2lhdGVkIHRvIEVHTAorICAgICAqIChlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKS4gQ2FuIGJlIE5VTEwuCisgICAgICovCisgICAgdm9pZCAgICAgICAgKCpjb25uZWN0KShzdHJ1Y3QgZWdsX25hdGl2ZV93aW5kb3dfdCogd2luZG93KTsKKworICAgIC8qCisgICAgICogSG9vayBjYWxsZWQgYnkgRUdMIHdoZW4gZWdsRGVzdHJveVN1cmZhY2UgaXMgY2FsbGVkLiAgQ2FuIGJlIE5VTEwuCisgICAgICovCisgICAgdm9pZCAgICAgICAgKCpkaXNjb25uZWN0KShzdHJ1Y3QgZWdsX25hdGl2ZV93aW5kb3dfdCogd2luZG93KTsKKyAgICAKKyAgICAvKgorICAgICAqIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiBNVVNUIEJFIFpFUk8uCisgICAgICovCisgICAgdm9pZCAgICAgICAgKCpyZXNlcnZlZF9wcm9jWzExXSkodm9pZCk7CisgICAgCisgICAgLyoKKyAgICAgKiAgU29tZSBzdG9yYWdlIHJlc2VydmVkIGZvciB0aGUgb2VtIGRyaXZlci4KKyAgICAgKi8KKyAgICBpbnRwdHJfdCAgICBvZW1bNF07Cit9OworCisKK3N0cnVjdCBlZ2xfbmF0aXZlX3BpeG1hcF90Cit7CisgICAgaW50MzJfdCAgICAgdmVyc2lvbjsgICAgLyogbXVzdCBiZSAzMiAqLworICAgIGludDMyX3QgICAgIHdpZHRoOworICAgIGludDMyX3QgICAgIGhlaWdodDsKKyAgICBpbnQzMl90ICAgICBzdHJpZGU7CisgICAgdWludDhfdCogICAgZGF0YTsKKyAgICB1aW50OF90ICAgICBmb3JtYXQ7CisgICAgdWludDhfdCAgICAgcmZ1WzNdOworICAgIHVuaW9uIHsKKyAgICAgICAgdWludDMyX3QgICAgY29tcHJlc3NlZEZvcm1hdDsKKyAgICAgICAgaW50MzJfdCAgICAgdnN0cmlkZTsKKyAgICB9OworICAgIGludDMyX3QgICAgIHJlc2VydmVkOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAKKyAqIFRoaXMgYSBjb252ZW5pZW5jZSBmdW5jdGlvbiB0byBjcmVhdGUgYSBOYXRpdmVXaW5kb3dUeXBlIHN1cmZhY2UKKyAqIHRoYXQgbWFwcyB0byB0aGUgd2hvbGUgc2NyZWVuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGFjdHVhbGx5IGltcGxlbWVudGVkIGluIGxpYnVpLnNvCisgKi8KKworc3RydWN0IGVnbF9uYXRpdmVfd2luZG93X3QqIGFuZHJvaWRfY3JlYXRlRGlzcGxheVN1cmZhY2UoKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qCisgKiBPRU0ncyBlZ2wncyBsaWJyYXJ5IChsaWJoZ2wuc28pIG11c3QgaW1sZW1lbnQgdGhlc2UgaG9va3MgdG8gYWxsb2NhdGUKKyAqIHRoZSBHUFUgbWVtb3J5IHRoZXkgbmVlZCAgCisgKi8KKworCit0eXBlZGVmIHN0cnVjdAoreworICAgIC8vIGZvciBpbnRlcm5hbCB1c2UKKyAgICB2b2lkKiAgIHVzZXI7CisgICAgLy8gdmlydHVhbCBhZGRyZXNzIG9mIHRoaXMgYXJlYQorICAgIHZvaWQqICAgYmFzZTsKKyAgICAvLyBzaXplIG9mIHRoaXMgYXJlYSBpbiBieXRlcworICAgIHNpemVfdCAgc2l6ZTsKKyAgICAvLyBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoaXMgYXJlYQorICAgIHZvaWQqICAgcGh5czsKKyAgICAvLyBvZmZzZXQgaW4gdGhpcyBhcmVhIGF2YWlsYWJsZSB0byB0aGUgR1BVCisgICAgc2l6ZV90ICBvZmZzZXQ7CisgICAgLy8gZmQgb2YgdGhpcyBhcmVhCisgICAgaW50ICAgICBmZDsKK30gZ3B1X2FyZWFfdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAvLyBhcmVhIHdoZXJlIEdQVSByZWdpc3RlcnMgYXJlIG1hcHBlZAorICAgIGdwdV9hcmVhX3QgcmVnczsKKyAgICAvLyBudW1iZXIgb2YgZXh0cmEgYXJlYXMgKGN1cnJlbnRseSBsaW1pdGVkIHRvIDIpCisgICAgaW50MzJfdCBjb3VudDsKKyAgICAvLyBleHRyYSBHUFUgYXJlYXMgKGN1cnJlbnRseSBsaW1pdGVkIHRvIDIpCisgICAgZ3B1X2FyZWFfdCBncHVbMl07Cit9IHJlcXVlc3RfZ3B1X3Q7CisKKwordHlwZWRlZiByZXF1ZXN0X2dwdV90KiAoKk9FTV9FR0xfYWNxdWlyZV9ncHVfdCkodm9pZCogdXNlcik7Cit0eXBlZGVmIGludCAoKk9FTV9FR0xfcmVsZWFzZV9ncHVfdCkodm9pZCogdXNlciwgcmVxdWVzdF9ncHVfdCogaGFuZGxlKTsKK3R5cGVkZWYgdm9pZCAoKnJlZ2lzdGVyX2dwdV90KQorICAgICAgICAodm9pZCogdXNlciwgT0VNX0VHTF9hY3F1aXJlX2dwdV90LCBPRU1fRUdMX3JlbGVhc2VfZ3B1X3QpOworCit2b2lkIG9lbV9yZWdpc3Rlcl9ncHUoCisgICAgICAgIHZvaWQqIHVzZXIsCisgICAgICAgIE9FTV9FR0xfYWNxdWlyZV9ncHVfdCBhY3F1aXJlLAorICAgICAgICBPRU1fRUdMX3JlbGVhc2VfZ3B1X3QgcmVsZWFzZSk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogQU5EUk9JRF9FR0xOQVRJVkVTX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5nbC9pbmNsdWRlL0VHTC9lZ2xwbGF0Zm9ybS5oIGIvb3BlbmdsL2luY2x1ZGUvRUdML2VnbHBsYXRmb3JtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMwMDkwMQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC9pbmNsdWRlL0VHTC9lZ2xwbGF0Zm9ybS5oCkBAIC0wLDAgKzEsMTE3IEBACisjaWZuZGVmIF9fZWdscGxhdGZvcm1faF8KKyNkZWZpbmUgX19lZ2xwbGF0Zm9ybV9oXworCisvKgorKiogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorKioKKyoqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisqKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kL29yIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisqKiAiTWF0ZXJpYWxzIiksIHRvIGRlYWwgaW4gdGhlIE1hdGVyaWFscyB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyoqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyoqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgTWF0ZXJpYWxzLCBhbmQgdG8KKyoqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIE1hdGVyaWFscyBhcmUgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisqKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisqKgorKiogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyoqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIE1hdGVyaWFscy4KKyoqCisqKiBUSEUgTUFURVJJQUxTIEFSRSBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorKiogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisqKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisqKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorKiogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyoqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisqKiBNQVRFUklBTFMgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgTUFURVJJQUxTLgorKi8KKworLyogUGxhdGZvcm0tc3BlY2lmaWMgdHlwZXMgYW5kIGRlZmluaXRpb25zIGZvciBlZ2wuaAorICogJFJldmlzaW9uOiA3MjQ0ICQgb24gJERhdGU6IDIwMDktMDEtMjAgMTc6MDY6NTkgLTA4MDAgKFR1ZSwgMjAgSmFuIDIwMDkpICQKKyAqCisgKiBBZG9wdGVycyBtYXkgbW9kaWZ5IGtocnBsYXRmb3JtLmggYW5kIHRoaXMgZmlsZSB0byBzdWl0IHRoZWlyIHBsYXRmb3JtLgorICogWW91IGFyZSBlbmNvdXJhZ2VkIHRvIHN1Ym1pdCBhbGwgbW9kaWZpY2F0aW9ucyB0byB0aGUgS2hyb25vcyBncm91cCBzbyB0aGF0CisgKiB0aGV5IGNhbiBiZSBpbmNsdWRlZCBpbiBmdXR1cmUgdmVyc2lvbnMgb2YgdGhpcyBmaWxlLiAgUGxlYXNlIHN1Ym1pdCBjaGFuZ2VzCisgKiBieSBzZW5kaW5nIHRoZW0gdG8gdGhlIHB1YmxpYyBLaHJvbm9zIEJ1Z3ppbGxhIChodHRwOi8va2hyb25vcy5vcmcvYnVnemlsbGEpCisgKiBieSBmaWxpbmcgYSBidWcgYWdhaW5zdCBwcm9kdWN0ICJFR0wiIGNvbXBvbmVudCAiUmVnaXN0cnkiLgorICovCisKKyNpbmNsdWRlIDxLSFIva2hycGxhdGZvcm0uaD4KKworLyogTWFjcm9zIHVzZWQgaW4gRUdMIGZ1bmN0aW9uIHByb3RvdHlwZSBkZWNsYXJhdGlvbnMuCisgKgorICogRUdMIGZ1bmN0aW9ucyBzaG91bGQgYmUgcHJvdG90eXBlZCBhczoKKyAqCisgKiBFR0xBUEkgcmV0dXJuLXR5cGUgRUdMQVBJRU5UUlkgZWdsRnVuY3Rpb24oYXJndW1lbnRzKTsKKyAqIHR5cGVkZWYgcmV0dXJuLXR5cGUgKEVYUEFQSUVOVFJZUCBQRk5FR0xGVU5DVElPTlBST0MpIChhcmd1bWVudHMpOworICoKKyAqIEtIUk9OT1NfQVBJQ0FMTCBhbmQgS0hST05PU19BUElFTlRSWSBhcmUgZGVmaW5lZCBpbiBLSFIva2hycGxhdGZvcm0uaAorICovCisKKyNpZm5kZWYgRUdMQVBJCisjZGVmaW5lIEVHTEFQSSBLSFJPTk9TX0FQSUNBTEwKKyNlbmRpZgorCisjZGVmaW5lIEVHTEFQSUVOVFJZICBLSFJPTk9TX0FQSUVOVFJZCisjZGVmaW5lIEVHTEFQSUVOVFJZUCBLSFJPTk9TX0FQSUVOVFJZKgorCisvKiBUaGUgdHlwZXMgTmF0aXZlRGlzcGxheVR5cGUsIE5hdGl2ZVdpbmRvd1R5cGUsIGFuZCBOYXRpdmVQaXhtYXBUeXBlCisgKiBhcmUgYWxpYXNlcyBvZiB3aW5kb3ctc3lzdGVtLWRlcGVuZGVudCB0eXBlcywgc3VjaCBhcyBYIERpc3BsYXkgKiBvcgorICogV2luZG93cyBEZXZpY2UgQ29udGV4dC4gVGhleSBtdXN0IGJlIGRlZmluZWQgaW4gcGxhdGZvcm0tc3BlY2lmaWMKKyAqIGNvZGUgYmVsb3cuIFRoZSBFR0wtcHJlZml4ZWQgdmVyc2lvbnMgb2YgTmF0aXZlKlR5cGUgYXJlIHRoZSBzYW1lCisgKiB0eXBlcywgcmVuYW1lZCBpbiBFR0wgMS4zIHNvIGFsbCB0eXBlcyBpbiB0aGUgQVBJIHN0YXJ0IHdpdGggIkVHTCIuCisgKi8KKworI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fVkMzMl9fKSAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKSAmJiAhZGVmaW5lZChfX1NDSVRFQ0hfU05BUF9fKSAvKiBXaW4zMiBhbmQgV2luQ0UgKi8KKyNpZm5kZWYgV0lOMzJfTEVBTl9BTkRfTUVBTgorI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOIDEKKyNlbmRpZgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKwordHlwZWRlZiBIREMgICAgIEVHTE5hdGl2ZURpc3BsYXlUeXBlOwordHlwZWRlZiBIQklUTUFQIEVHTE5hdGl2ZVBpeG1hcFR5cGU7Cit0eXBlZGVmIEhXTkQgICAgRUdMTmF0aXZlV2luZG93VHlwZTsKKworI2VsaWYgZGVmaW5lZChfX1dJTlNDV19fKSB8fCBkZWZpbmVkKF9fU1lNQklBTjMyX18pICAvKiBTeW1iaWFuICovCisKK3R5cGVkZWYgaW50ICAgRUdMTmF0aXZlRGlzcGxheVR5cGU7Cit0eXBlZGVmIHZvaWQgKkVHTE5hdGl2ZVdpbmRvd1R5cGU7Cit0eXBlZGVmIHZvaWQgKkVHTE5hdGl2ZVBpeG1hcFR5cGU7CisKKyNlbGlmIGRlZmluZWQoX191bml4X18pICYmICFkZWZpbmVkKEFORFJPSUQpCisKKy8qIFgxMSAodGVudGF0aXZlKSAgKi8KKyNpbmNsdWRlIDxYMTEvWGxpYi5oPgorI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgorCit0eXBlZGVmIERpc3BsYXkgKkVHTE5hdGl2ZURpc3BsYXlUeXBlOwordHlwZWRlZiBQaXhtYXAgICBFR0xOYXRpdmVQaXhtYXBUeXBlOwordHlwZWRlZiBXaW5kb3cgICBFR0xOYXRpdmVXaW5kb3dUeXBlOworCisKKyNlbGlmIGRlZmluZWQoQU5EUk9JRCkKKworI2luY2x1ZGUgPEVHTC9lZ2xuYXRpdmVzLmg+CisKK3R5cGVkZWYgc3RydWN0IGVnbF9uYXRpdmVfd2luZG93X3QqICAgICBFR0xOYXRpdmVXaW5kb3dUeXBlOwordHlwZWRlZiBzdHJ1Y3QgZWdsX25hdGl2ZV9waXhtYXBfdCogICAgIEVHTE5hdGl2ZVBpeG1hcFR5cGU7Cit0eXBlZGVmIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMTmF0aXZlRGlzcGxheVR5cGU7CisKKyNlbHNlCisjZXJyb3IgIlBsYXRmb3JtIG5vdCByZWNvZ25pemVkIgorI2VuZGlmCisKKy8qIEVHTCAxLjIgdHlwZXMsIHJlbmFtZWQgZm9yIGNvbnNpc3RlbmN5IGluIEVHTCAxLjMgKi8KK3R5cGVkZWYgRUdMTmF0aXZlRGlzcGxheVR5cGUgTmF0aXZlRGlzcGxheVR5cGU7Cit0eXBlZGVmIEVHTE5hdGl2ZVBpeG1hcFR5cGUgIE5hdGl2ZVBpeG1hcFR5cGU7Cit0eXBlZGVmIEVHTE5hdGl2ZVdpbmRvd1R5cGUgIE5hdGl2ZVdpbmRvd1R5cGU7CisKKworLyogRGVmaW5lIEVHTGludC4gVGhpcyBtdXN0IGJlIGEgc2lnbmVkIGludGVncmFsIHR5cGUgbGFyZ2UgZW5vdWdoIHRvIGNvbnRhaW4KKyAqIGFsbCBsZWdhbCBhdHRyaWJ1dGUgbmFtZXMgYW5kIHZhbHVlcyBwYXNzZWQgaW50byBhbmQgb3V0IG9mIEVHTCwgd2hldGhlcgorICogdGhlaXIgdHlwZSBpcyBib29sZWFuLCBiaXRtYXNrLCBlbnVtZXJhbnQgKHN5bWJvbGljIGNvbnN0YW50KSwgaW50ZWdlciwKKyAqIGhhbmRsZSwgb3Igb3RoZXIuICBXaGlsZSBpbiBnZW5lcmFsIGEgMzItYml0IGludGVnZXIgd2lsbCBzdWZmaWNlLCBpZgorICogaGFuZGxlcyBhcmUgNjQgYml0IHR5cGVzLCB0aGVuIEVHTGludCBzaG91bGQgYmUgZGVmaW5lZCBhcyBhIHNpZ25lZCA2NC1iaXQKKyAqIGludGVnZXIgdHlwZS4KKyAqLwordHlwZWRlZiBraHJvbm9zX2ludDMyX3QgRUdMaW50OworCisjZW5kaWYgLyogX19lZ2xwbGF0Zm9ybV9oICovCmRpZmYgLS1naXQgYS9vcGVuZ2wvaW5jbHVkZS9HTEVTL2VnbC5oIGIvb3BlbmdsL2luY2x1ZGUvR0xFUy9lZ2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Nzc4ZTAwCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2luY2x1ZGUvR0xFUy9lZ2wuaApAQCAtMCwwICsxLDE1IEBACisvKgorICogU2tlbGV0b24gZWdsLmggdG8gcHJvdmlkZSBjb21wYXRpYmlsaXR5IGZvciBlYXJseSBHTEVTIDEuMAorICogYXBwbGljYXRpb25zLiBTZXZlcmFsIGVhcmx5IGltcGxlbWVudGF0aW9ucyBpbmNsdWRlZCBnbC5oCisgKiBpbiBlZ2wuaCBsZWFkaW5nIGFwcGxpY2F0aW9ucyB0byBpbmNsdWRlIG9ubHkgZWdsLmgKKyAqCisgKiAkUmV2aXNpb246IDYyNTIgJCBvbiAkRGF0ZTo6IDIwMDgtMDgtMDYgMTY6MzU6MDggLTA3MDAgIyQKKyAqLworCisjaWZuZGVmIF9fbGVnYWN5X2VnbF9oXworI2RlZmluZSBfX2xlZ2FjeV9lZ2xfaF8KKworI2luY2x1ZGUgPEVHTC9lZ2wuaD4KKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisKKyNlbmRpZiAvKiBfX2xlZ2FjeV9lZ2xfaF8gKi8KZGlmZiAtLWdpdCBhL29wZW5nbC9pbmNsdWRlL0dMRVMvZ2wuaCBiL29wZW5nbC9pbmNsdWRlL0dMRVMvZ2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZThiOTcxCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2luY2x1ZGUvR0xFUy9nbC5oCkBAIC0wLDAgKzEsNzY5IEBACisjaWZuZGVmIF9fZ2xfaF8KKyNkZWZpbmUgX19nbF9oXworCisvKiAkUmV2aXNpb246IDcxNzIgJCBvbiAkRGF0ZTo6IDIwMDktMDEtMDkgMTE6MTc6NDEgLTA4MDAgIyQgKi8KKworI2luY2x1ZGUgPEdMRVMvZ2xwbGF0Zm9ybS5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qCisgKiBUaGlzIGRvY3VtZW50IGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBTR0kgRnJlZSBTb2Z0d2FyZSBCIExpY2Vuc2UgVmVyc2lvbgorICogMi4wLiBGb3IgZGV0YWlscywgc2VlIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9GcmVlQi8gLgorICovCisKK3R5cGVkZWYgdm9pZCAgICAgICAgICAgICBHTHZvaWQ7Cit0eXBlZGVmIHVuc2lnbmVkIGludCAgICAgR0xlbnVtOwordHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgIEdMYm9vbGVhbjsKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgICBHTGJpdGZpZWxkOwordHlwZWRlZiBraHJvbm9zX2ludDhfdCAgIEdMYnl0ZTsKK3R5cGVkZWYgc2hvcnQgICAgICAgICAgICBHTHNob3J0OwordHlwZWRlZiBpbnQgICAgICAgICAgICAgIEdMaW50OwordHlwZWRlZiBpbnQgICAgICAgICAgICAgIEdMc2l6ZWk7Cit0eXBlZGVmIGtocm9ub3NfdWludDhfdCAgR0x1Ynl0ZTsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgICBHTHVzaG9ydDsKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgICBHTHVpbnQ7Cit0eXBlZGVmIGtocm9ub3NfZmxvYXRfdCAgR0xmbG9hdDsKK3R5cGVkZWYga2hyb25vc19mbG9hdF90ICBHTGNsYW1wZjsKK3R5cGVkZWYga2hyb25vc19pbnQzMl90ICBHTGZpeGVkOwordHlwZWRlZiBraHJvbm9zX2ludDMyX3QgIEdMY2xhbXB4OworCit0eXBlZGVmIGtocm9ub3NfaW50cHRyX3QgR0xpbnRwdHI7Cit0eXBlZGVmIGtocm9ub3Nfc3NpemVfdCAgR0xzaXplaXB0cjsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogT3BlbkdMIEVTIGNvcmUgdmVyc2lvbnMgKi8KKyNkZWZpbmUgR0xfVkVSU0lPTl9FU19DTV8xXzAgICAgICAgICAgMQorI2RlZmluZSBHTF9WRVJTSU9OX0VTX0NMXzFfMCAgICAgICAgICAxCisjZGVmaW5lIEdMX1ZFUlNJT05fRVNfQ01fMV8xICAgICAgICAgIDEKKyNkZWZpbmUgR0xfVkVSU0lPTl9FU19DTF8xXzEgICAgICAgICAgMQorCisvKiBDbGVhckJ1ZmZlck1hc2sgKi8KKyNkZWZpbmUgR0xfREVQVEhfQlVGRkVSX0JJVCAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgR0xfU1RFTkNJTF9CVUZGRVJfQklUICAgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgR0xfQ09MT1JfQlVGRkVSX0JJVCAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKKworLyogQm9vbGVhbiAqLworI2RlZmluZSBHTF9GQUxTRSAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHTF9UUlVFICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorCisvKiBCZWdpbk1vZGUgKi8KKyNkZWZpbmUgR0xfUE9JTlRTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBHTF9MSU5FUyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIEdMX0xJTkVfTE9PUCAgICAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgR0xfTElORV9TVFJJUCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMworI2RlZmluZSBHTF9UUklBTkdMRVMgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIEdMX1RSSUFOR0xFX1NUUklQICAgICAgICAgICAgICAgICAweDAwMDUKKyNkZWZpbmUgR0xfVFJJQU5HTEVfRkFOICAgICAgICAgICAgICAgICAgIDB4MDAwNgorCisvKiBBbHBoYUZ1bmN0aW9uICovCisjZGVmaW5lIEdMX05FVkVSICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgR0xfTEVTUyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMQorI2RlZmluZSBHTF9FUVVBTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAyCisjZGVmaW5lIEdMX0xFUVVBTCAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDMKKyNkZWZpbmUgR0xfR1JFQVRFUiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwNAorI2RlZmluZSBHTF9OT1RFUVVBTCAgICAgICAgICAgICAgICAgICAgICAgMHgwMjA1CisjZGVmaW5lIEdMX0dFUVVBTCAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDYKKyNkZWZpbmUgR0xfQUxXQVlTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwNworCisvKiBCbGVuZGluZ0ZhY3RvckRlc3QgKi8KKyNkZWZpbmUgR0xfWkVSTyAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR0xfT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR0xfU1JDX0NPTE9SICAgICAgICAgICAgICAgICAgICAgIDB4MDMwMAorI2RlZmluZSBHTF9PTkVfTUlOVVNfU1JDX0NPTE9SICAgICAgICAgICAgMHgwMzAxCisjZGVmaW5lIEdMX1NSQ19BTFBIQSAgICAgICAgICAgICAgICAgICAgICAweDAzMDIKKyNkZWZpbmUgR0xfT05FX01JTlVTX1NSQ19BTFBIQSAgICAgICAgICAgIDB4MDMwMworI2RlZmluZSBHTF9EU1RfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgMHgwMzA0CisjZGVmaW5lIEdMX09ORV9NSU5VU19EU1RfQUxQSEEgICAgICAgICAgICAweDAzMDUKKworLyogQmxlbmRpbmdGYWN0b3JTcmMgKi8KKy8qICAgICAgR0xfWkVSTyAqLworLyogICAgICBHTF9PTkUgKi8KKyNkZWZpbmUgR0xfRFNUX0NPTE9SICAgICAgICAgICAgICAgICAgICAgIDB4MDMwNgorI2RlZmluZSBHTF9PTkVfTUlOVVNfRFNUX0NPTE9SICAgICAgICAgICAgMHgwMzA3CisjZGVmaW5lIEdMX1NSQ19BTFBIQV9TQVRVUkFURSAgICAgICAgICAgICAweDAzMDgKKy8qICAgICAgR0xfU1JDX0FMUEhBICovCisvKiAgICAgIEdMX09ORV9NSU5VU19TUkNfQUxQSEEgKi8KKy8qICAgICAgR0xfRFNUX0FMUEhBICovCisvKiAgICAgIEdMX09ORV9NSU5VU19EU1RfQUxQSEEgKi8KKworLyogQ2xpcFBsYW5lTmFtZSAqLworI2RlZmluZSBHTF9DTElQX1BMQU5FMCAgICAgICAgICAgICAgICAgICAgMHgzMDAwCisjZGVmaW5lIEdMX0NMSVBfUExBTkUxICAgICAgICAgICAgICAgICAgICAweDMwMDEKKyNkZWZpbmUgR0xfQ0xJUF9QTEFORTIgICAgICAgICAgICAgICAgICAgIDB4MzAwMgorI2RlZmluZSBHTF9DTElQX1BMQU5FMyAgICAgICAgICAgICAgICAgICAgMHgzMDAzCisjZGVmaW5lIEdMX0NMSVBfUExBTkU0ICAgICAgICAgICAgICAgICAgICAweDMwMDQKKyNkZWZpbmUgR0xfQ0xJUF9QTEFORTUgICAgICAgICAgICAgICAgICAgIDB4MzAwNQorCisvKiBDb2xvck1hdGVyaWFsRmFjZSAqLworLyogICAgICBHTF9GUk9OVF9BTkRfQkFDSyAqLworCisvKiBDb2xvck1hdGVyaWFsUGFyYW1ldGVyICovCisvKiAgICAgIEdMX0FNQklFTlRfQU5EX0RJRkZVU0UgKi8KKworLyogQ29sb3JQb2ludGVyVHlwZSAqLworLyogICAgICBHTF9VTlNJR05FRF9CWVRFICovCisvKiAgICAgIEdMX0ZMT0FUICovCisvKiAgICAgIEdMX0ZJWEVEICovCisKKy8qIEN1bGxGYWNlTW9kZSAqLworI2RlZmluZSBHTF9GUk9OVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDA0CisjZGVmaW5lIEdMX0JBQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDUKKyNkZWZpbmUgR0xfRlJPTlRfQU5EX0JBQ0sgICAgICAgICAgICAgICAgIDB4MDQwOAorCisvKiBEZXB0aEZ1bmN0aW9uICovCisvKiAgICAgIEdMX05FVkVSICovCisvKiAgICAgIEdMX0xFU1MgKi8KKy8qICAgICAgR0xfRVFVQUwgKi8KKy8qICAgICAgR0xfTEVRVUFMICovCisvKiAgICAgIEdMX0dSRUFURVIgKi8KKy8qICAgICAgR0xfTk9URVFVQUwgKi8KKy8qICAgICAgR0xfR0VRVUFMICovCisvKiAgICAgIEdMX0FMV0FZUyAqLworCisvKiBFbmFibGVDYXAgKi8KKyNkZWZpbmUgR0xfRk9HICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEI2MAorI2RlZmluZSBHTF9MSUdIVElORyAgICAgICAgICAgICAgICAgICAgICAgMHgwQjUwCisjZGVmaW5lIEdMX1RFWFRVUkVfMkQgICAgICAgICAgICAgICAgICAgICAweDBERTEKKyNkZWZpbmUgR0xfQ1VMTF9GQUNFICAgICAgICAgICAgICAgICAgICAgIDB4MEI0NAorI2RlZmluZSBHTF9BTFBIQV9URVNUICAgICAgICAgICAgICAgICAgICAgMHgwQkMwCisjZGVmaW5lIEdMX0JMRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAweDBCRTIKKyNkZWZpbmUgR0xfQ09MT1JfTE9HSUNfT1AgICAgICAgICAgICAgICAgIDB4MEJGMgorI2RlZmluZSBHTF9ESVRIRVIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQkQwCisjZGVmaW5lIEdMX1NURU5DSUxfVEVTVCAgICAgICAgICAgICAgICAgICAweDBCOTAKKyNkZWZpbmUgR0xfREVQVEhfVEVTVCAgICAgICAgICAgICAgICAgICAgIDB4MEI3MQorLyogICAgICBHTF9MSUdIVDAgKi8KKy8qICAgICAgR0xfTElHSFQxICovCisvKiAgICAgIEdMX0xJR0hUMiAqLworLyogICAgICBHTF9MSUdIVDMgKi8KKy8qICAgICAgR0xfTElHSFQ0ICovCisvKiAgICAgIEdMX0xJR0hUNSAqLworLyogICAgICBHTF9MSUdIVDYgKi8KKy8qICAgICAgR0xfTElHSFQ3ICovCisjZGVmaW5lIEdMX1BPSU5UX1NNT09USCAgICAgICAgICAgICAgICAgICAweDBCMTAKKyNkZWZpbmUgR0xfTElORV9TTU9PVEggICAgICAgICAgICAgICAgICAgIDB4MEIyMAorI2RlZmluZSBHTF9TQ0lTU09SX1RFU1QgICAgICAgICAgICAgICAgICAgMHgwQzExCisjZGVmaW5lIEdMX0NPTE9SX01BVEVSSUFMICAgICAgICAgICAgICAgICAweDBCNTcKKyNkZWZpbmUgR0xfTk9STUFMSVpFICAgICAgICAgICAgICAgICAgICAgIDB4MEJBMQorI2RlZmluZSBHTF9SRVNDQUxFX05PUk1BTCAgICAgICAgICAgICAgICAgMHg4MDNBCisjZGVmaW5lIEdMX1BPTFlHT05fT0ZGU0VUX0ZJTEwgICAgICAgICAgICAweDgwMzcKKyNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZICAgICAgICAgICAgICAgICAgIDB4ODA3NAorI2RlZmluZSBHTF9OT1JNQUxfQVJSQVkgICAgICAgICAgICAgICAgICAgMHg4MDc1CisjZGVmaW5lIEdMX0NPTE9SX0FSUkFZICAgICAgICAgICAgICAgICAgICAweDgwNzYKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT09SRF9BUlJBWSAgICAgICAgICAgIDB4ODA3OAorI2RlZmluZSBHTF9NVUxUSVNBTVBMRSAgICAgICAgICAgICAgICAgICAgMHg4MDlECisjZGVmaW5lIEdMX1NBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSAgICAgICAweDgwOUUKKyNkZWZpbmUgR0xfU0FNUExFX0FMUEhBX1RPX09ORSAgICAgICAgICAgIDB4ODA5RgorI2RlZmluZSBHTF9TQU1QTEVfQ09WRVJBR0UgICAgICAgICAgICAgICAgMHg4MEEwCisKKy8qIEVycm9yQ29kZSAqLworI2RlZmluZSBHTF9OT19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHTF9JTlZBTElEX0VOVU0gICAgICAgICAgICAgICAgICAgMHgwNTAwCisjZGVmaW5lIEdMX0lOVkFMSURfVkFMVUUgICAgICAgICAgICAgICAgICAweDA1MDEKKyNkZWZpbmUgR0xfSU5WQUxJRF9PUEVSQVRJT04gICAgICAgICAgICAgIDB4MDUwMgorI2RlZmluZSBHTF9TVEFDS19PVkVSRkxPVyAgICAgICAgICAgICAgICAgMHgwNTAzCisjZGVmaW5lIEdMX1NUQUNLX1VOREVSRkxPVyAgICAgICAgICAgICAgICAweDA1MDQKKyNkZWZpbmUgR0xfT1VUX09GX01FTU9SWSAgICAgICAgICAgICAgICAgIDB4MDUwNQorCisvKiBGb2dNb2RlICovCisvKiAgICAgIEdMX0xJTkVBUiAqLworI2RlZmluZSBHTF9FWFAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIEdMX0VYUDIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDEKKworLyogRm9nUGFyYW1ldGVyICovCisjZGVmaW5lIEdMX0ZPR19ERU5TSVRZICAgICAgICAgICAgICAgICAgICAweDBCNjIKKyNkZWZpbmUgR0xfRk9HX1NUQVJUICAgICAgICAgICAgICAgICAgICAgIDB4MEI2MworI2RlZmluZSBHTF9GT0dfRU5EICAgICAgICAgICAgICAgICAgICAgICAgMHgwQjY0CisjZGVmaW5lIEdMX0ZPR19NT0RFICAgICAgICAgICAgICAgICAgICAgICAweDBCNjUKKyNkZWZpbmUgR0xfRk9HX0NPTE9SICAgICAgICAgICAgICAgICAgICAgIDB4MEI2NgorCisvKiBGcm9udEZhY2VEaXJlY3Rpb24gKi8KKyNkZWZpbmUgR0xfQ1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDkwMAorI2RlZmluZSBHTF9DQ1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOTAxCisKKy8qIEdldFBOYW1lICovCisjZGVmaW5lIEdMX0NVUlJFTlRfQ09MT1IgICAgICAgICAgICAgICAgICAweDBCMDAKKyNkZWZpbmUgR0xfQ1VSUkVOVF9OT1JNQUwgICAgICAgICAgICAgICAgIDB4MEIwMgorI2RlZmluZSBHTF9DVVJSRU5UX1RFWFRVUkVfQ09PUkRTICAgICAgICAgMHgwQjAzCisjZGVmaW5lIEdMX1BPSU5UX1NJWkUgICAgICAgICAgICAgICAgICAgICAweDBCMTEKKyNkZWZpbmUgR0xfUE9JTlRfU0laRV9NSU4gICAgICAgICAgICAgICAgIDB4ODEyNgorI2RlZmluZSBHTF9QT0lOVF9TSVpFX01BWCAgICAgICAgICAgICAgICAgMHg4MTI3CisjZGVmaW5lIEdMX1BPSU5UX0ZBREVfVEhSRVNIT0xEX1NJWkUgICAgICAweDgxMjgKKyNkZWZpbmUgR0xfUE9JTlRfRElTVEFOQ0VfQVRURU5VQVRJT04gICAgIDB4ODEyOQorI2RlZmluZSBHTF9TTU9PVEhfUE9JTlRfU0laRV9SQU5HRSAgICAgICAgMHgwQjEyCisjZGVmaW5lIEdMX0xJTkVfV0lEVEggICAgICAgICAgICAgICAgICAgICAweDBCMjEKKyNkZWZpbmUgR0xfU01PT1RIX0xJTkVfV0lEVEhfUkFOR0UgICAgICAgIDB4MEIyMgorI2RlZmluZSBHTF9BTElBU0VEX1BPSU5UX1NJWkVfUkFOR0UgICAgICAgMHg4NDZECisjZGVmaW5lIEdMX0FMSUFTRURfTElORV9XSURUSF9SQU5HRSAgICAgICAweDg0NkUKKyNkZWZpbmUgR0xfQ1VMTF9GQUNFX01PREUgICAgICAgICAgICAgICAgIDB4MEI0NQorI2RlZmluZSBHTF9GUk9OVF9GQUNFICAgICAgICAgICAgICAgICAgICAgMHgwQjQ2CisjZGVmaW5lIEdMX1NIQURFX01PREVMICAgICAgICAgICAgICAgICAgICAweDBCNTQKKyNkZWZpbmUgR0xfREVQVEhfUkFOR0UgICAgICAgICAgICAgICAgICAgIDB4MEI3MAorI2RlZmluZSBHTF9ERVBUSF9XUklURU1BU0sgICAgICAgICAgICAgICAgMHgwQjcyCisjZGVmaW5lIEdMX0RFUFRIX0NMRUFSX1ZBTFVFICAgICAgICAgICAgICAweDBCNzMKKyNkZWZpbmUgR0xfREVQVEhfRlVOQyAgICAgICAgICAgICAgICAgICAgIDB4MEI3NAorI2RlZmluZSBHTF9TVEVOQ0lMX0NMRUFSX1ZBTFVFICAgICAgICAgICAgMHgwQjkxCisjZGVmaW5lIEdMX1NURU5DSUxfRlVOQyAgICAgICAgICAgICAgICAgICAweDBCOTIKKyNkZWZpbmUgR0xfU1RFTkNJTF9WQUxVRV9NQVNLICAgICAgICAgICAgIDB4MEI5MworI2RlZmluZSBHTF9TVEVOQ0lMX0ZBSUwgICAgICAgICAgICAgICAgICAgMHgwQjk0CisjZGVmaW5lIEdMX1NURU5DSUxfUEFTU19ERVBUSF9GQUlMICAgICAgICAweDBCOTUKKyNkZWZpbmUgR0xfU1RFTkNJTF9QQVNTX0RFUFRIX1BBU1MgICAgICAgIDB4MEI5NgorI2RlZmluZSBHTF9TVEVOQ0lMX1JFRiAgICAgICAgICAgICAgICAgICAgMHgwQjk3CisjZGVmaW5lIEdMX1NURU5DSUxfV1JJVEVNQVNLICAgICAgICAgICAgICAweDBCOTgKKyNkZWZpbmUgR0xfTUFUUklYX01PREUgICAgICAgICAgICAgICAgICAgIDB4MEJBMAorI2RlZmluZSBHTF9WSUVXUE9SVCAgICAgICAgICAgICAgICAgICAgICAgMHgwQkEyCisjZGVmaW5lIEdMX01PREVMVklFV19TVEFDS19ERVBUSCAgICAgICAgICAweDBCQTMKKyNkZWZpbmUgR0xfUFJPSkVDVElPTl9TVEFDS19ERVBUSCAgICAgICAgIDB4MEJBNAorI2RlZmluZSBHTF9URVhUVVJFX1NUQUNLX0RFUFRIICAgICAgICAgICAgMHgwQkE1CisjZGVmaW5lIEdMX01PREVMVklFV19NQVRSSVggICAgICAgICAgICAgICAweDBCQTYKKyNkZWZpbmUgR0xfUFJPSkVDVElPTl9NQVRSSVggICAgICAgICAgICAgIDB4MEJBNworI2RlZmluZSBHTF9URVhUVVJFX01BVFJJWCAgICAgICAgICAgICAgICAgMHgwQkE4CisjZGVmaW5lIEdMX0FMUEhBX1RFU1RfRlVOQyAgICAgICAgICAgICAgICAweDBCQzEKKyNkZWZpbmUgR0xfQUxQSEFfVEVTVF9SRUYgICAgICAgICAgICAgICAgIDB4MEJDMgorI2RlZmluZSBHTF9CTEVORF9EU1QgICAgICAgICAgICAgICAgICAgICAgMHgwQkUwCisjZGVmaW5lIEdMX0JMRU5EX1NSQyAgICAgICAgICAgICAgICAgICAgICAweDBCRTEKKyNkZWZpbmUgR0xfTE9HSUNfT1BfTU9ERSAgICAgICAgICAgICAgICAgIDB4MEJGMAorI2RlZmluZSBHTF9TQ0lTU09SX0JPWCAgICAgICAgICAgICAgICAgICAgMHgwQzEwCisjZGVmaW5lIEdMX1NDSVNTT1JfVEVTVCAgICAgICAgICAgICAgICAgICAweDBDMTEKKyNkZWZpbmUgR0xfQ09MT1JfQ0xFQVJfVkFMVUUgICAgICAgICAgICAgIDB4MEMyMgorI2RlZmluZSBHTF9DT0xPUl9XUklURU1BU0sgICAgICAgICAgICAgICAgMHgwQzIzCisjZGVmaW5lIEdMX1VOUEFDS19BTElHTk1FTlQgICAgICAgICAgICAgICAweDBDRjUKKyNkZWZpbmUgR0xfUEFDS19BTElHTk1FTlQgICAgICAgICAgICAgICAgIDB4MEQwNQorI2RlZmluZSBHTF9NQVhfTElHSFRTICAgICAgICAgICAgICAgICAgICAgMHgwRDMxCisjZGVmaW5lIEdMX01BWF9DTElQX1BMQU5FUyAgICAgICAgICAgICAgICAweDBEMzIKKyNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfU0laRSAgICAgICAgICAgICAgIDB4MEQzMworI2RlZmluZSBHTF9NQVhfTU9ERUxWSUVXX1NUQUNLX0RFUFRIICAgICAgMHgwRDM2CisjZGVmaW5lIEdMX01BWF9QUk9KRUNUSU9OX1NUQUNLX0RFUFRIICAgICAweDBEMzgKKyNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfU1RBQ0tfREVQVEggICAgICAgIDB4MEQzOQorI2RlZmluZSBHTF9NQVhfVklFV1BPUlRfRElNUyAgICAgICAgICAgICAgMHgwRDNBCisjZGVmaW5lIEdMX01BWF9URVhUVVJFX1VOSVRTICAgICAgICAgICAgICAweDg0RTIKKyNkZWZpbmUgR0xfU1VCUElYRUxfQklUUyAgICAgICAgICAgICAgICAgIDB4MEQ1MAorI2RlZmluZSBHTF9SRURfQklUUyAgICAgICAgICAgICAgICAgICAgICAgMHgwRDUyCisjZGVmaW5lIEdMX0dSRUVOX0JJVFMgICAgICAgICAgICAgICAgICAgICAweDBENTMKKyNkZWZpbmUgR0xfQkxVRV9CSVRTICAgICAgICAgICAgICAgICAgICAgIDB4MEQ1NAorI2RlZmluZSBHTF9BTFBIQV9CSVRTICAgICAgICAgICAgICAgICAgICAgMHgwRDU1CisjZGVmaW5lIEdMX0RFUFRIX0JJVFMgICAgICAgICAgICAgICAgICAgICAweDBENTYKKyNkZWZpbmUgR0xfU1RFTkNJTF9CSVRTICAgICAgICAgICAgICAgICAgIDB4MEQ1NworI2RlZmluZSBHTF9QT0xZR09OX09GRlNFVF9VTklUUyAgICAgICAgICAgMHgyQTAwCisjZGVmaW5lIEdMX1BPTFlHT05fT0ZGU0VUX0ZJTEwgICAgICAgICAgICAweDgwMzcKKyNkZWZpbmUgR0xfUE9MWUdPTl9PRkZTRVRfRkFDVE9SICAgICAgICAgIDB4ODAzOAorI2RlZmluZSBHTF9URVhUVVJFX0JJTkRJTkdfMkQgICAgICAgICAgICAgMHg4MDY5CisjZGVmaW5lIEdMX1ZFUlRFWF9BUlJBWV9TSVpFICAgICAgICAgICAgICAweDgwN0EKKyNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX1RZUEUgICAgICAgICAgICAgIDB4ODA3QgorI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfU1RSSURFICAgICAgICAgICAgMHg4MDdDCisjZGVmaW5lIEdMX05PUk1BTF9BUlJBWV9UWVBFICAgICAgICAgICAgICAweDgwN0UKKyNkZWZpbmUgR0xfTk9STUFMX0FSUkFZX1NUUklERSAgICAgICAgICAgIDB4ODA3RgorI2RlZmluZSBHTF9DT0xPUl9BUlJBWV9TSVpFICAgICAgICAgICAgICAgMHg4MDgxCisjZGVmaW5lIEdMX0NPTE9SX0FSUkFZX1RZUEUgICAgICAgICAgICAgICAweDgwODIKKyNkZWZpbmUgR0xfQ09MT1JfQVJSQVlfU1RSSURFICAgICAgICAgICAgIDB4ODA4MworI2RlZmluZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1NJWkUgICAgICAgMHg4MDg4CisjZGVmaW5lIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfVFlQRSAgICAgICAweDgwODkKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9TVFJJREUgICAgIDB4ODA4QQorI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfUE9JTlRFUiAgICAgICAgICAgMHg4MDhFCisjZGVmaW5lIEdMX05PUk1BTF9BUlJBWV9QT0lOVEVSICAgICAgICAgICAweDgwOEYKKyNkZWZpbmUgR0xfQ09MT1JfQVJSQVlfUE9JTlRFUiAgICAgICAgICAgIDB4ODA5MAorI2RlZmluZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1BPSU5URVIgICAgMHg4MDkyCisjZGVmaW5lIEdMX1NBTVBMRV9CVUZGRVJTICAgICAgICAgICAgICAgICAweDgwQTgKKyNkZWZpbmUgR0xfU0FNUExFUyAgICAgICAgICAgICAgICAgICAgICAgIDB4ODBBOQorI2RlZmluZSBHTF9TQU1QTEVfQ09WRVJBR0VfVkFMVUUgICAgICAgICAgMHg4MEFBCisjZGVmaW5lIEdMX1NBTVBMRV9DT1ZFUkFHRV9JTlZFUlQgICAgICAgICAweDgwQUIKKworLyogR2V0VGV4dHVyZVBhcmFtZXRlciAqLworLyogICAgICBHTF9URVhUVVJFX01BR19GSUxURVIgKi8KKy8qICAgICAgR0xfVEVYVFVSRV9NSU5fRklMVEVSICovCisvKiAgICAgIEdMX1RFWFRVUkVfV1JBUF9TICovCisvKiAgICAgIEdMX1RFWFRVUkVfV1JBUF9UICovCisKKyNkZWZpbmUgR0xfTlVNX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTIDB4ODZBMgorI2RlZmluZSBHTF9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUyAgICAgMHg4NkEzCisKKy8qIEhpbnRNb2RlICovCisjZGVmaW5lIEdMX0RPTlRfQ0FSRSAgICAgICAgICAgICAgICAgICAgICAweDExMDAKKyNkZWZpbmUgR0xfRkFTVEVTVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MTEwMQorI2RlZmluZSBHTF9OSUNFU1QgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMTAyCisKKy8qIEhpbnRUYXJnZXQgKi8KKyNkZWZpbmUgR0xfUEVSU1BFQ1RJVkVfQ09SUkVDVElPTl9ISU5UICAgIDB4MEM1MAorI2RlZmluZSBHTF9QT0lOVF9TTU9PVEhfSElOVCAgICAgICAgICAgICAgMHgwQzUxCisjZGVmaW5lIEdMX0xJTkVfU01PT1RIX0hJTlQgICAgICAgICAgICAgICAweDBDNTIKKyNkZWZpbmUgR0xfRk9HX0hJTlQgICAgICAgICAgICAgICAgICAgICAgIDB4MEM1NAorI2RlZmluZSBHTF9HRU5FUkFURV9NSVBNQVBfSElOVCAgICAgICAgICAgMHg4MTkyCisKKy8qIExpZ2h0TW9kZWxQYXJhbWV0ZXIgKi8KKyNkZWZpbmUgR0xfTElHSFRfTU9ERUxfQU1CSUVOVCAgICAgICAgICAgIDB4MEI1MworI2RlZmluZSBHTF9MSUdIVF9NT0RFTF9UV09fU0lERSAgICAgICAgICAgMHgwQjUyCisKKy8qIExpZ2h0UGFyYW1ldGVyICovCisjZGVmaW5lIEdMX0FNQklFTlQgICAgICAgICAgICAgICAgICAgICAgICAweDEyMDAKKyNkZWZpbmUgR0xfRElGRlVTRSAgICAgICAgICAgICAgICAgICAgICAgIDB4MTIwMQorI2RlZmluZSBHTF9TUEVDVUxBUiAgICAgICAgICAgICAgICAgICAgICAgMHgxMjAyCisjZGVmaW5lIEdMX1BPU0lUSU9OICAgICAgICAgICAgICAgICAgICAgICAweDEyMDMKKyNkZWZpbmUgR0xfU1BPVF9ESVJFQ1RJT04gICAgICAgICAgICAgICAgIDB4MTIwNAorI2RlZmluZSBHTF9TUE9UX0VYUE9ORU5UICAgICAgICAgICAgICAgICAgMHgxMjA1CisjZGVmaW5lIEdMX1NQT1RfQ1VUT0ZGICAgICAgICAgICAgICAgICAgICAweDEyMDYKKyNkZWZpbmUgR0xfQ09OU1RBTlRfQVRURU5VQVRJT04gICAgICAgICAgIDB4MTIwNworI2RlZmluZSBHTF9MSU5FQVJfQVRURU5VQVRJT04gICAgICAgICAgICAgMHgxMjA4CisjZGVmaW5lIEdMX1FVQURSQVRJQ19BVFRFTlVBVElPTiAgICAgICAgICAweDEyMDkKKworLyogRGF0YVR5cGUgKi8KKyNkZWZpbmUgR0xfQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQwMAorI2RlZmluZSBHTF9VTlNJR05FRF9CWVRFICAgICAgICAgICAgICAgICAgMHgxNDAxCisjZGVmaW5lIEdMX1NIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0MDIKKyNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlQgICAgICAgICAgICAgICAgIDB4MTQwMworI2RlZmluZSBHTF9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDA2CisjZGVmaW5lIEdMX0ZJWEVEICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0MEMKKworLyogTG9naWNPcCAqLworI2RlZmluZSBHTF9DTEVBUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTAwCisjZGVmaW5lIEdMX0FORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MDEKKyNkZWZpbmUgR0xfQU5EX1JFVkVSU0UgICAgICAgICAgICAgICAgICAgIDB4MTUwMgorI2RlZmluZSBHTF9DT1BZICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTAzCisjZGVmaW5lIEdMX0FORF9JTlZFUlRFRCAgICAgICAgICAgICAgICAgICAweDE1MDQKKyNkZWZpbmUgR0xfTk9PUCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwNQorI2RlZmluZSBHTF9YT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTA2CisjZGVmaW5lIEdMX09SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MDcKKyNkZWZpbmUgR0xfTk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwOAorI2RlZmluZSBHTF9FUVVJViAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTA5CisjZGVmaW5lIEdMX0lOVkVSVCAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MEEKKyNkZWZpbmUgR0xfT1JfUkVWRVJTRSAgICAgICAgICAgICAgICAgICAgIDB4MTUwQgorI2RlZmluZSBHTF9DT1BZX0lOVkVSVEVEICAgICAgICAgICAgICAgICAgMHgxNTBDCisjZGVmaW5lIEdMX09SX0lOVkVSVEVEICAgICAgICAgICAgICAgICAgICAweDE1MEQKKyNkZWZpbmUgR0xfTkFORCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwRQorI2RlZmluZSBHTF9TRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTBGCisKKy8qIE1hdGVyaWFsRmFjZSAqLworLyogICAgICBHTF9GUk9OVF9BTkRfQkFDSyAqLworCisvKiBNYXRlcmlhbFBhcmFtZXRlciAqLworI2RlZmluZSBHTF9FTUlTU0lPTiAgICAgICAgICAgICAgICAgICAgICAgMHgxNjAwCisjZGVmaW5lIEdMX1NISU5JTkVTUyAgICAgICAgICAgICAgICAgICAgICAweDE2MDEKKyNkZWZpbmUgR0xfQU1CSUVOVF9BTkRfRElGRlVTRSAgICAgICAgICAgIDB4MTYwMgorLyogICAgICBHTF9BTUJJRU5UICovCisvKiAgICAgIEdMX0RJRkZVU0UgKi8KKy8qICAgICAgR0xfU1BFQ1VMQVIgKi8KKworLyogTWF0cml4TW9kZSAqLworI2RlZmluZSBHTF9NT0RFTFZJRVcgICAgICAgICAgICAgICAgICAgICAgMHgxNzAwCisjZGVmaW5lIEdMX1BST0pFQ1RJT04gICAgICAgICAgICAgICAgICAgICAweDE3MDEKKyNkZWZpbmUgR0xfVEVYVFVSRSAgICAgICAgICAgICAgICAgICAgICAgIDB4MTcwMgorCisvKiBOb3JtYWxQb2ludGVyVHlwZSAqLworLyogICAgICBHTF9CWVRFICovCisvKiAgICAgIEdMX1NIT1JUICovCisvKiAgICAgIEdMX0ZMT0FUICovCisvKiAgICAgIEdMX0ZJWEVEICovCisKKy8qIFBpeGVsRm9ybWF0ICovCisjZGVmaW5lIEdMX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICAweDE5MDYKKyNkZWZpbmUgR0xfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTkwNworI2RlZmluZSBHTF9SR0JBICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxOTA4CisjZGVmaW5lIEdMX0xVTUlOQU5DRSAgICAgICAgICAgICAgICAgICAgICAweDE5MDkKKyNkZWZpbmUgR0xfTFVNSU5BTkNFX0FMUEhBICAgICAgICAgICAgICAgIDB4MTkwQQorCisvKiBQaXhlbFN0b3JlUGFyYW1ldGVyICovCisjZGVmaW5lIEdMX1VOUEFDS19BTElHTk1FTlQgICAgICAgICAgICAgICAweDBDRjUKKyNkZWZpbmUgR0xfUEFDS19BTElHTk1FTlQgICAgICAgICAgICAgICAgIDB4MEQwNQorCisvKiBQaXhlbFR5cGUgKi8KKy8qICAgICAgR0xfVU5TSUdORURfQllURSAqLworI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80ICAgICAgICAgMHg4MDMzCisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzVfNV81XzEgICAgICAgICAweDgwMzQKKyNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfNV82XzUgICAgICAgICAgIDB4ODM2MworCisvKiBTaGFkaW5nTW9kZWwgKi8KKyNkZWZpbmUgR0xfRkxBVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUQwMAorI2RlZmluZSBHTF9TTU9PVEggICAgICAgICAgICAgICAgICAgICAgICAgMHgxRDAxCisKKy8qIFN0ZW5jaWxGdW5jdGlvbiAqLworLyogICAgICBHTF9ORVZFUiAqLworLyogICAgICBHTF9MRVNTICovCisvKiAgICAgIEdMX0VRVUFMICovCisvKiAgICAgIEdMX0xFUVVBTCAqLworLyogICAgICBHTF9HUkVBVEVSICovCisvKiAgICAgIEdMX05PVEVRVUFMICovCisvKiAgICAgIEdMX0dFUVVBTCAqLworLyogICAgICBHTF9BTFdBWVMgKi8KKworLyogU3RlbmNpbE9wICovCisvKiAgICAgIEdMX1pFUk8gKi8KKyNkZWZpbmUgR0xfS0VFUCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUUwMAorI2RlZmluZSBHTF9SRVBMQUNFICAgICAgICAgICAgICAgICAgICAgICAgMHgxRTAxCisjZGVmaW5lIEdMX0lOQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFFMDIKKyNkZWZpbmUgR0xfREVDUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUUwMworLyogICAgICBHTF9JTlZFUlQgKi8KKworLyogU3RyaW5nTmFtZSAqLworI2RlZmluZSBHTF9WRU5ET1IgICAgICAgICAgICAgICAgICAgICAgICAgMHgxRjAwCisjZGVmaW5lIEdMX1JFTkRFUkVSICAgICAgICAgICAgICAgICAgICAgICAweDFGMDEKKyNkZWZpbmUgR0xfVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgIDB4MUYwMgorI2RlZmluZSBHTF9FWFRFTlNJT05TICAgICAgICAgICAgICAgICAgICAgMHgxRjAzCisKKy8qIFRleENvb3JkUG9pbnRlclR5cGUgKi8KKy8qICAgICAgR0xfU0hPUlQgKi8KKy8qICAgICAgR0xfRkxPQVQgKi8KKy8qICAgICAgR0xfRklYRUQgKi8KKy8qICAgICAgR0xfQllURSAqLworCisvKiBUZXh0dXJlRW52TW9kZSAqLworI2RlZmluZSBHTF9NT0RVTEFURSAgICAgICAgICAgICAgICAgICAgICAgMHgyMTAwCisjZGVmaW5lIEdMX0RFQ0FMICAgICAgICAgICAgICAgICAgICAgICAgICAweDIxMDEKKy8qICAgICAgR0xfQkxFTkQgKi8KKyNkZWZpbmUgR0xfQUREICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwNAorLyogICAgICBHTF9SRVBMQUNFICovCisKKy8qIFRleHR1cmVFbnZQYXJhbWV0ZXIgKi8KKyNkZWZpbmUgR0xfVEVYVFVSRV9FTlZfTU9ERSAgICAgICAgICAgICAgIDB4MjIwMAorI2RlZmluZSBHTF9URVhUVVJFX0VOVl9DT0xPUiAgICAgICAgICAgICAgMHgyMjAxCisKKy8qIFRleHR1cmVFbnZUYXJnZXQgKi8KKyNkZWZpbmUgR0xfVEVYVFVSRV9FTlYgICAgICAgICAgICAgICAgICAgIDB4MjMwMAorCisvKiBUZXh0dXJlTWFnRmlsdGVyICovCisjZGVmaW5lIEdMX05FQVJFU1QgICAgICAgICAgICAgICAgICAgICAgICAweDI2MDAKKyNkZWZpbmUgR0xfTElORUFSICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjYwMQorCisvKiBUZXh0dXJlTWluRmlsdGVyICovCisvKiAgICAgIEdMX05FQVJFU1QgKi8KKy8qICAgICAgR0xfTElORUFSICovCisjZGVmaW5lIEdMX05FQVJFU1RfTUlQTUFQX05FQVJFU1QgICAgICAgICAweDI3MDAKKyNkZWZpbmUgR0xfTElORUFSX01JUE1BUF9ORUFSRVNUICAgICAgICAgIDB4MjcwMQorI2RlZmluZSBHTF9ORUFSRVNUX01JUE1BUF9MSU5FQVIgICAgICAgICAgMHgyNzAyCisjZGVmaW5lIEdMX0xJTkVBUl9NSVBNQVBfTElORUFSICAgICAgICAgICAweDI3MDMKKworLyogVGV4dHVyZVBhcmFtZXRlck5hbWUgKi8KKyNkZWZpbmUgR0xfVEVYVFVSRV9NQUdfRklMVEVSICAgICAgICAgICAgIDB4MjgwMAorI2RlZmluZSBHTF9URVhUVVJFX01JTl9GSUxURVIgICAgICAgICAgICAgMHgyODAxCisjZGVmaW5lIEdMX1RFWFRVUkVfV1JBUF9TICAgICAgICAgICAgICAgICAweDI4MDIKKyNkZWZpbmUgR0xfVEVYVFVSRV9XUkFQX1QgICAgICAgICAgICAgICAgIDB4MjgwMworI2RlZmluZSBHTF9HRU5FUkFURV9NSVBNQVAgICAgICAgICAgICAgICAgMHg4MTkxCisKKy8qIFRleHR1cmVUYXJnZXQgKi8KKy8qICAgICAgR0xfVEVYVFVSRV8yRCAqLworCisvKiBUZXh0dXJlVW5pdCAqLworI2RlZmluZSBHTF9URVhUVVJFMCAgICAgICAgICAgICAgICAgICAgICAgMHg4NEMwCisjZGVmaW5lIEdMX1RFWFRVUkUxICAgICAgICAgICAgICAgICAgICAgICAweDg0QzEKKyNkZWZpbmUgR0xfVEVYVFVSRTIgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDMgorI2RlZmluZSBHTF9URVhUVVJFMyAgICAgICAgICAgICAgICAgICAgICAgMHg4NEMzCisjZGVmaW5lIEdMX1RFWFRVUkU0ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzQKKyNkZWZpbmUgR0xfVEVYVFVSRTUgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDNQorI2RlZmluZSBHTF9URVhUVVJFNiAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM2CisjZGVmaW5lIEdMX1RFWFRVUkU3ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzcKKyNkZWZpbmUgR0xfVEVYVFVSRTggICAgICAgICAgICAgICAgICAgICAgIDB4ODRDOAorI2RlZmluZSBHTF9URVhUVVJFOSAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM5CisjZGVmaW5lIEdMX1RFWFRVUkUxMCAgICAgICAgICAgICAgICAgICAgICAweDg0Q0EKKyNkZWZpbmUgR0xfVEVYVFVSRTExICAgICAgICAgICAgICAgICAgICAgIDB4ODRDQgorI2RlZmluZSBHTF9URVhUVVJFMTIgICAgICAgICAgICAgICAgICAgICAgMHg4NENDCisjZGVmaW5lIEdMX1RFWFRVUkUxMyAgICAgICAgICAgICAgICAgICAgICAweDg0Q0QKKyNkZWZpbmUgR0xfVEVYVFVSRTE0ICAgICAgICAgICAgICAgICAgICAgIDB4ODRDRQorI2RlZmluZSBHTF9URVhUVVJFMTUgICAgICAgICAgICAgICAgICAgICAgMHg4NENGCisjZGVmaW5lIEdMX1RFWFRVUkUxNiAgICAgICAgICAgICAgICAgICAgICAweDg0RDAKKyNkZWZpbmUgR0xfVEVYVFVSRTE3ICAgICAgICAgICAgICAgICAgICAgIDB4ODREMQorI2RlZmluZSBHTF9URVhUVVJFMTggICAgICAgICAgICAgICAgICAgICAgMHg4NEQyCisjZGVmaW5lIEdMX1RFWFRVUkUxOSAgICAgICAgICAgICAgICAgICAgICAweDg0RDMKKyNkZWZpbmUgR0xfVEVYVFVSRTIwICAgICAgICAgICAgICAgICAgICAgIDB4ODRENAorI2RlZmluZSBHTF9URVhUVVJFMjEgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ1CisjZGVmaW5lIEdMX1RFWFRVUkUyMiAgICAgICAgICAgICAgICAgICAgICAweDg0RDYKKyNkZWZpbmUgR0xfVEVYVFVSRTIzICAgICAgICAgICAgICAgICAgICAgIDB4ODRENworI2RlZmluZSBHTF9URVhUVVJFMjQgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ4CisjZGVmaW5lIEdMX1RFWFRVUkUyNSAgICAgICAgICAgICAgICAgICAgICAweDg0RDkKKyNkZWZpbmUgR0xfVEVYVFVSRTI2ICAgICAgICAgICAgICAgICAgICAgIDB4ODREQQorI2RlZmluZSBHTF9URVhUVVJFMjcgICAgICAgICAgICAgICAgICAgICAgMHg4NERCCisjZGVmaW5lIEdMX1RFWFRVUkUyOCAgICAgICAgICAgICAgICAgICAgICAweDg0REMKKyNkZWZpbmUgR0xfVEVYVFVSRTI5ICAgICAgICAgICAgICAgICAgICAgIDB4ODRERAorI2RlZmluZSBHTF9URVhUVVJFMzAgICAgICAgICAgICAgICAgICAgICAgMHg4NERFCisjZGVmaW5lIEdMX1RFWFRVUkUzMSAgICAgICAgICAgICAgICAgICAgICAweDg0REYKKyNkZWZpbmUgR0xfQUNUSVZFX1RFWFRVUkUgICAgICAgICAgICAgICAgIDB4ODRFMAorI2RlZmluZSBHTF9DTElFTlRfQUNUSVZFX1RFWFRVUkUgICAgICAgICAgMHg4NEUxCisKKy8qIFRleHR1cmVXcmFwTW9kZSAqLworI2RlZmluZSBHTF9SRVBFQVQgICAgICAgICAgICAgICAgICAgICAgICAgMHgyOTAxCisjZGVmaW5lIEdMX0NMQU1QX1RPX0VER0UgICAgICAgICAgICAgICAgICAweDgxMkYKKworLyogVmVydGV4UG9pbnRlclR5cGUgKi8KKy8qICAgICAgR0xfU0hPUlQgKi8KKy8qICAgICAgR0xfRkxPQVQgKi8KKy8qICAgICAgR0xfRklYRUQgKi8KKy8qICAgICAgR0xfQllURSAqLworCisvKiBMaWdodE5hbWUgKi8KKyNkZWZpbmUgR0xfTElHSFQwICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBHTF9MSUdIVDEgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAxCisjZGVmaW5lIEdMX0xJR0hUMiAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDIKKyNkZWZpbmUgR0xfTElHSFQzICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMworI2RlZmluZSBHTF9MSUdIVDQgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDA0CisjZGVmaW5lIEdMX0xJR0hUNSAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDUKKyNkZWZpbmUgR0xfTElHSFQ2ICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwNgorI2RlZmluZSBHTF9MSUdIVDcgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDA3CisKKy8qIEJ1ZmZlciBPYmplY3RzICovCisjZGVmaW5lIEdMX0FSUkFZX0JVRkZFUiAgICAgICAgICAgICAgICAgICAweDg4OTIKKyNkZWZpbmUgR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIgICAgICAgICAgIDB4ODg5MworCisjZGVmaW5lIEdMX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgICAgICAgICAgICAgMHg4ODk0CisjZGVmaW5lIEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSX0JJTkRJTkcgICAgICAgMHg4ODk1CisjZGVmaW5lIEdMX1ZFUlRFWF9BUlJBWV9CVUZGRVJfQklORElORyAgICAgICAgMHg4ODk2CisjZGVmaW5lIEdMX05PUk1BTF9BUlJBWV9CVUZGRVJfQklORElORyAgICAgICAgMHg4ODk3CisjZGVmaW5lIEdMX0NPTE9SX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgICAgICAgMHg4ODk4CisjZGVmaW5lIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfQlVGRkVSX0JJTkRJTkcgMHg4ODlBCisKKyNkZWZpbmUgR0xfU1RBVElDX0RSQVcgICAgICAgICAgICAgICAgICAgIDB4ODhFNAorI2RlZmluZSBHTF9EWU5BTUlDX0RSQVcgICAgICAgICAgICAgICAgICAgMHg4OEU4CisKKyNkZWZpbmUgR0xfQlVGRkVSX1NJWkUgICAgICAgICAgICAgICAgICAgIDB4ODc2NAorI2RlZmluZSBHTF9CVUZGRVJfVVNBR0UgICAgICAgICAgICAgICAgICAgMHg4NzY1CisKKy8qIFRleHR1cmUgY29tYmluZSArIGRvdDMgKi8KKyNkZWZpbmUgR0xfU1VCVFJBQ1QgICAgICAgICAgICAgICAgICAgICAgIDB4ODRFNworI2RlZmluZSBHTF9DT01CSU5FICAgICAgICAgICAgICAgICAgICAgICAgMHg4NTcwCisjZGVmaW5lIEdMX0NPTUJJTkVfUkdCICAgICAgICAgICAgICAgICAgICAweDg1NzEKKyNkZWZpbmUgR0xfQ09NQklORV9BTFBIQSAgICAgICAgICAgICAgICAgIDB4ODU3MgorI2RlZmluZSBHTF9SR0JfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgMHg4NTczCisjZGVmaW5lIEdMX0FERF9TSUdORUQgICAgICAgICAgICAgICAgICAgICAweDg1NzQKKyNkZWZpbmUgR0xfSU5URVJQT0xBVEUgICAgICAgICAgICAgICAgICAgIDB4ODU3NQorI2RlZmluZSBHTF9DT05TVEFOVCAgICAgICAgICAgICAgICAgICAgICAgMHg4NTc2CisjZGVmaW5lIEdMX1BSSU1BUllfQ09MT1IgICAgICAgICAgICAgICAgICAweDg1NzcKKyNkZWZpbmUgR0xfUFJFVklPVVMgICAgICAgICAgICAgICAgICAgICAgIDB4ODU3OAorI2RlZmluZSBHTF9PUEVSQU5EMF9SR0IgICAgICAgICAgICAgICAgICAgMHg4NTkwCisjZGVmaW5lIEdMX09QRVJBTkQxX1JHQiAgICAgICAgICAgICAgICAgICAweDg1OTEKKyNkZWZpbmUgR0xfT1BFUkFORDJfUkdCICAgICAgICAgICAgICAgICAgIDB4ODU5MgorI2RlZmluZSBHTF9PUEVSQU5EMF9BTFBIQSAgICAgICAgICAgICAgICAgMHg4NTk4CisjZGVmaW5lIEdMX09QRVJBTkQxX0FMUEhBICAgICAgICAgICAgICAgICAweDg1OTkKKyNkZWZpbmUgR0xfT1BFUkFORDJfQUxQSEEgICAgICAgICAgICAgICAgIDB4ODU5QQorCisjZGVmaW5lIEdMX0FMUEhBX1NDQUxFICAgICAgICAgICAgICAgICAgICAweDBEMUMKKworI2RlZmluZSBHTF9TUkMwX1JHQiAgICAgICAgICAgICAgICAgICAgICAgMHg4NTgwCisjZGVmaW5lIEdMX1NSQzFfUkdCICAgICAgICAgICAgICAgICAgICAgICAweDg1ODEKKyNkZWZpbmUgR0xfU1JDMl9SR0IgICAgICAgICAgICAgICAgICAgICAgIDB4ODU4MgorI2RlZmluZSBHTF9TUkMwX0FMUEhBICAgICAgICAgICAgICAgICAgICAgMHg4NTg4CisjZGVmaW5lIEdMX1NSQzFfQUxQSEEgICAgICAgICAgICAgICAgICAgICAweDg1ODkKKyNkZWZpbmUgR0xfU1JDMl9BTFBIQSAgICAgICAgICAgICAgICAgICAgIDB4ODU4QQorCisjZGVmaW5lIEdMX0RPVDNfUkdCICAgICAgICAgICAgICAgICAgICAgICAweDg2QUUKKyNkZWZpbmUgR0xfRE9UM19SR0JBICAgICAgICAgICAgICAgICAgICAgIDB4ODZBRgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAqIHJlcXVpcmVkIE9FUyBleHRlbnNpb24gdG9rZW5zCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIE9FU19yZWFkX2Zvcm1hdCAqLworI2lmbmRlZiBHTF9PRVNfcmVhZF9mb3JtYXQKKyNkZWZpbmUgR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9UWVBFX09FUyAgICAgICAgICAgICAgICAgICAweDhCOUEKKyNkZWZpbmUgR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVRfT0VTICAgICAgICAgICAgICAgICAweDhCOUIKKyNlbmRpZgorCisvKiBHTF9PRVNfY29tcHJlc3NlZF9wYWxldHRlZF90ZXh0dXJlICovCisjaWZuZGVmIEdMX09FU19jb21wcmVzc2VkX3BhbGV0dGVkX3RleHR1cmUKKyNkZWZpbmUgR0xfUEFMRVRURTRfUkdCOF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCOTAKKyNkZWZpbmUgR0xfUEFMRVRURTRfUkdCQThfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCOTEKKyNkZWZpbmUgR0xfUEFMRVRURTRfUjVfRzZfQjVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCOTIKKyNkZWZpbmUgR0xfUEFMRVRURTRfUkdCQTRfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCOTMKKyNkZWZpbmUgR0xfUEFMRVRURTRfUkdCNV9BMV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCOTQKKyNkZWZpbmUgR0xfUEFMRVRURThfUkdCOF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCOTUKKyNkZWZpbmUgR0xfUEFMRVRURThfUkdCQThfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCOTYKKyNkZWZpbmUgR0xfUEFMRVRURThfUjVfRzZfQjVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCOTcKKyNkZWZpbmUgR0xfUEFMRVRURThfUkdCQTRfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCOTgKKyNkZWZpbmUgR0xfUEFMRVRURThfUkdCNV9BMV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCOTkKKyNlbmRpZgorCisvKiBPRVNfcG9pbnRfc2l6ZV9hcnJheSAqLworI2lmbmRlZiBHTF9PRVNfcG9pbnRfc2l6ZV9hcnJheQorI2RlZmluZSBHTF9QT0lOVF9TSVpFX0FSUkFZX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEI5QworI2RlZmluZSBHTF9QT0lOVF9TSVpFX0FSUkFZX1RZUEVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODk4QQorI2RlZmluZSBHTF9QT0lOVF9TSVpFX0FSUkFZX1NUUklERV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODk4QgorI2RlZmluZSBHTF9QT0lOVF9TSVpFX0FSUkFZX1BPSU5URVJfT0VTICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODk4QworI2RlZmluZSBHTF9QT0lOVF9TSVpFX0FSUkFZX0JVRkZFUl9CSU5ESU5HX09FUyAgICAgICAgICAgICAgICAgIDB4OEI5RgorI2VuZGlmCisKKy8qIEdMX09FU19wb2ludF9zcHJpdGUgKi8KKyNpZm5kZWYgR0xfT0VTX3BvaW50X3Nwcml0ZQorI2RlZmluZSBHTF9QT0lOVF9TUFJJVEVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODg2MQorI2RlZmluZSBHTF9DT09SRF9SRVBMQUNFX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODg2MgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBBdmFpbGFibGUgb25seSBpbiBDb21tb24gcHJvZmlsZSAqLworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xBbHBoYUZ1bmMgKEdMZW51bSBmdW5jLCBHTGNsYW1wZiByZWYpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDbGVhckNvbG9yIChHTGNsYW1wZiByZWQsIEdMY2xhbXBmIGdyZWVuLCBHTGNsYW1wZiBibHVlLCBHTGNsYW1wZiBhbHBoYSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENsZWFyRGVwdGhmIChHTGNsYW1wZiBkZXB0aCk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENsaXBQbGFuZWYgKEdMZW51bSBwbGFuZSwgY29uc3QgR0xmbG9hdCAqZXF1YXRpb24pOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDb2xvcjRmIChHTGZsb2F0IHJlZCwgR0xmbG9hdCBncmVlbiwgR0xmbG9hdCBibHVlLCBHTGZsb2F0IGFscGhhKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRGVwdGhSYW5nZWYgKEdMY2xhbXBmIHpOZWFyLCBHTGNsYW1wZiB6RmFyKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRm9nZiAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRm9nZnYgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRnJ1c3R1bWYgKEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLCBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRDbGlwUGxhbmVmIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgZXFuWzRdKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0RmxvYXR2IChHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldExpZ2h0ZnYgKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRNYXRlcmlhbGZ2IChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRUZXhFbnZmdiAoR0xlbnVtIGVudiwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRUZXhQYXJhbWV0ZXJmdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xMaWdodE1vZGVsZiAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTGlnaHRNb2RlbGZ2IChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbExpZ2h0ZiAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xMaWdodGZ2IChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTGluZVdpZHRoIChHTGZsb2F0IHdpZHRoKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTG9hZE1hdHJpeGYgKGNvbnN0IEdMZmxvYXQgKm0pOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xNYXRlcmlhbGYgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xNYXRlcmlhbGZ2IChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xNdWx0TWF0cml4ZiAoY29uc3QgR0xmbG9hdCAqbSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0ZiAoR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgciwgR0xmbG9hdCBxKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTm9ybWFsM2YgKEdMZmxvYXQgbngsIEdMZmxvYXQgbnksIEdMZmxvYXQgbnopOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xPcnRob2YgKEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLCBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xQb2ludFBhcmFtZXRlcmYgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFBvaW50UGFyYW1ldGVyZnYgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsUG9pbnRTaXplIChHTGZsb2F0IHNpemUpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xQb2x5Z29uT2Zmc2V0IChHTGZsb2F0IGZhY3RvciwgR0xmbG9hdCB1bml0cyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFJvdGF0ZWYgKEdMZmxvYXQgYW5nbGUsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xTY2FsZWYgKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhFbnZmIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhFbnZmdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhQYXJhbWV0ZXJmIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhQYXJhbWV0ZXJmdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUcmFuc2xhdGVmIChHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKKworLyogQXZhaWxhYmxlIGluIGJvdGggQ29tbW9uIGFuZCBDb21tb24tTGl0ZSBwcm9maWxlcyAqLworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xBY3RpdmVUZXh0dXJlIChHTGVudW0gdGV4dHVyZSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEFscGhhRnVuY3ggKEdMZW51bSBmdW5jLCBHTGNsYW1weCByZWYpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xCaW5kQnVmZmVyIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgYnVmZmVyKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQmluZFRleHR1cmUgKEdMZW51bSB0YXJnZXQsIEdMdWludCB0ZXh0dXJlKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQmxlbmRGdW5jIChHTGVudW0gc2ZhY3RvciwgR0xlbnVtIGRmYWN0b3IpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xCdWZmZXJEYXRhIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSwgR0xlbnVtIHVzYWdlKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQnVmZmVyU3ViRGF0YSAoR0xlbnVtIHRhcmdldCwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENsZWFyIChHTGJpdGZpZWxkIG1hc2spOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDbGVhckNvbG9yeCAoR0xjbGFtcHggcmVkLCBHTGNsYW1weCBncmVlbiwgR0xjbGFtcHggYmx1ZSwgR0xjbGFtcHggYWxwaGEpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDbGVhckRlcHRoeCAoR0xjbGFtcHggZGVwdGgpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDbGVhclN0ZW5jaWwgKEdMaW50IHMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDbGllbnRBY3RpdmVUZXh0dXJlIChHTGVudW0gdGV4dHVyZSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENsaXBQbGFuZXggKEdMZW51bSBwbGFuZSwgY29uc3QgR0xmaXhlZCAqZXF1YXRpb24pOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDb2xvcjR1YiAoR0x1Ynl0ZSByZWQsIEdMdWJ5dGUgZ3JlZW4sIEdMdWJ5dGUgYmx1ZSwgR0x1Ynl0ZSBhbHBoYSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENvbG9yNHggKEdMZml4ZWQgcmVkLCBHTGZpeGVkIGdyZWVuLCBHTGZpeGVkIGJsdWUsIEdMZml4ZWQgYWxwaGEpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDb2xvck1hc2sgKEdMYm9vbGVhbiByZWQsIEdMYm9vbGVhbiBncmVlbiwgR0xib29sZWFuIGJsdWUsIEdMYm9vbGVhbiBhbHBoYSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENvbG9yUG9pbnRlciAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDb21wcmVzc2VkVGV4SW1hZ2UyRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENvbXByZXNzZWRUZXhTdWJJbWFnZTJEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDb3B5VGV4SW1hZ2UyRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlcik7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENvcHlUZXhTdWJJbWFnZTJEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDdWxsRmFjZSAoR0xlbnVtIG1vZGUpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xEZWxldGVCdWZmZXJzIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqYnVmZmVycyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERlbGV0ZVRleHR1cmVzIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqdGV4dHVyZXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xEZXB0aEZ1bmMgKEdMZW51bSBmdW5jKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRGVwdGhNYXNrIChHTGJvb2xlYW4gZmxhZyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERlcHRoUmFuZ2V4IChHTGNsYW1weCB6TmVhciwgR0xjbGFtcHggekZhcik7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERpc2FibGUgKEdMZW51bSBjYXApOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xEaXNhYmxlQ2xpZW50U3RhdGUgKEdMZW51bSBhcnJheSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERyYXdBcnJheXMgKEdMZW51bSBtb2RlLCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERyYXdFbGVtZW50cyAoR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmluZGljZXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xFbmFibGUgKEdMZW51bSBjYXApOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xFbmFibGVDbGllbnRTdGF0ZSAoR0xlbnVtIGFycmF5KTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRmluaXNoICh2b2lkKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRmx1c2ggKHZvaWQpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xGb2d4IChHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xGb2d4diAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xGcm9udEZhY2UgKEdMZW51bSBtb2RlKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRnJ1c3R1bXggKEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLCBHTGZpeGVkIHpOZWFyLCBHTGZpeGVkIHpGYXIpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRCb29sZWFudiAoR0xlbnVtIHBuYW1lLCBHTGJvb2xlYW4gKnBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldEJ1ZmZlclBhcmFtZXRlcml2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRDbGlwUGxhbmV4IChHTGVudW0gcG5hbWUsIEdMZml4ZWQgZXFuWzRdKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2VuQnVmZmVycyAoR0xzaXplaSBuLCBHTHVpbnQgKmJ1ZmZlcnMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZW5UZXh0dXJlcyAoR0xzaXplaSBuLCBHTHVpbnQgKnRleHR1cmVzKTsKK0dMX0FQSSBHTGVudW0gR0xfQVBJRU5UUlkgZ2xHZXRFcnJvciAodm9pZCk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldEZpeGVkdiAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRJbnRlZ2VydiAoR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0TGlnaHR4diAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldE1hdGVyaWFseHYgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldFBvaW50ZXJ2IChHTGVudW0gcG5hbWUsIHZvaWQgKipwYXJhbXMpOworR0xfQVBJIGNvbnN0IEdMdWJ5dGUgKiBHTF9BUElFTlRSWSBnbEdldFN0cmluZyAoR0xlbnVtIG5hbWUpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRUZXhFbnZpdiAoR0xlbnVtIGVudiwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0VGV4RW52eHYgKEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0VGV4UGFyYW1ldGVyaXYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldFRleFBhcmFtZXRlcnh2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEhpbnQgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBtb2RlKTsKK0dMX0FQSSBHTGJvb2xlYW4gR0xfQVBJRU5UUlkgZ2xJc0J1ZmZlciAoR0x1aW50IGJ1ZmZlcik7CitHTF9BUEkgR0xib29sZWFuIEdMX0FQSUVOVFJZIGdsSXNFbmFibGVkIChHTGVudW0gY2FwKTsKK0dMX0FQSSBHTGJvb2xlYW4gR0xfQVBJRU5UUlkgZ2xJc1RleHR1cmUgKEdMdWludCB0ZXh0dXJlKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTGlnaHRNb2RlbHggKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbExpZ2h0TW9kZWx4diAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xMaWdodHggKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTGlnaHR4diAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbExpbmVXaWR0aHggKEdMZml4ZWQgd2lkdGgpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xMb2FkSWRlbnRpdHkgKHZvaWQpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xMb2FkTWF0cml4eCAoY29uc3QgR0xmaXhlZCAqbSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbExvZ2ljT3AgKEdMZW51bSBvcGNvZGUpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xNYXRlcmlhbHggKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xNYXRlcmlhbHh2IChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xNYXRyaXhNb2RlIChHTGVudW0gbW9kZSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbE11bHRNYXRyaXh4IChjb25zdCBHTGZpeGVkICptKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDR4IChHTGVudW0gdGFyZ2V0LCBHTGZpeGVkIHMsIEdMZml4ZWQgdCwgR0xmaXhlZCByLCBHTGZpeGVkIHEpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xOb3JtYWwzeCAoR0xmaXhlZCBueCwgR0xmaXhlZCBueSwgR0xmaXhlZCBueik7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbE5vcm1hbFBvaW50ZXIgKEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsT3J0aG94IChHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsUGl4ZWxTdG9yZWkgKEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xQb2ludFBhcmFtZXRlcnggKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFBvaW50UGFyYW1ldGVyeHYgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsUG9pbnRTaXpleCAoR0xmaXhlZCBzaXplKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsUG9seWdvbk9mZnNldHggKEdMZml4ZWQgZmFjdG9yLCBHTGZpeGVkIHVuaXRzKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsUG9wTWF0cml4ICh2b2lkKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsUHVzaE1hdHJpeCAodm9pZCk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFJlYWRQaXhlbHMgKEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICpwaXhlbHMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xSb3RhdGV4IChHTGZpeGVkIGFuZ2xlLCBHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsU2FtcGxlQ292ZXJhZ2UgKEdMY2xhbXBmIHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsU2FtcGxlQ292ZXJhZ2V4IChHTGNsYW1weCB2YWx1ZSwgR0xib29sZWFuIGludmVydCk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFNjYWxleCAoR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeik7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFNjaXNzb3IgKEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsU2hhZGVNb2RlbCAoR0xlbnVtIG1vZGUpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xTdGVuY2lsRnVuYyAoR0xlbnVtIGZ1bmMsIEdMaW50IHJlZiwgR0x1aW50IG1hc2spOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xTdGVuY2lsTWFzayAoR0x1aW50IG1hc2spOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xTdGVuY2lsT3AgKEdMZW51bSBmYWlsLCBHTGVudW0gemZhaWwsIEdMZW51bSB6cGFzcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleENvb3JkUG9pbnRlciAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhFbnZpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4RW52eCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4RW52aXYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleEVudnh2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleEltYWdlMkQgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4UGFyYW1ldGVyaSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleFBhcmFtZXRlcnggKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleFBhcmFtZXRlcml2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhQYXJhbWV0ZXJ4diAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhTdWJJbWFnZTJEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRyYW5zbGF0ZXggKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xWZXJ0ZXhQb2ludGVyIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFZpZXdwb3J0IChHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICogUmVxdWlyZWQgT0VTIGV4dGVuc2lvbiBmdW5jdGlvbnMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogR0xfT0VTX3JlYWRfZm9ybWF0ICovCisjaWZuZGVmIEdMX09FU19yZWFkX2Zvcm1hdAorI2RlZmluZSBHTF9PRVNfcmVhZF9mb3JtYXQgMQorI2VuZGlmCisKKy8qIEdMX09FU19jb21wcmVzc2VkX3BhbGV0dGVkX3RleHR1cmUgKi8KKyNpZm5kZWYgR0xfT0VTX2NvbXByZXNzZWRfcGFsZXR0ZWRfdGV4dHVyZQorI2RlZmluZSBHTF9PRVNfY29tcHJlc3NlZF9wYWxldHRlZF90ZXh0dXJlIDEKKyNlbmRpZgorCisvKiBHTF9PRVNfcG9pbnRfc2l6ZV9hcnJheSAqLworI2lmbmRlZiBHTF9PRVNfcG9pbnRfc2l6ZV9hcnJheQorI2RlZmluZSBHTF9PRVNfcG9pbnRfc2l6ZV9hcnJheSAxCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFBvaW50U2l6ZVBvaW50ZXJPRVMgKEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKKyNlbmRpZgorCisvKiBHTF9PRVNfcG9pbnRfc3ByaXRlICovCisjaWZuZGVmIEdMX09FU19wb2ludF9zcHJpdGUKKyNkZWZpbmUgR0xfT0VTX3BvaW50X3Nwcml0ZSAxCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fZ2xfaF8gKi8KKwpkaWZmIC0tZ2l0IGEvb3BlbmdsL2luY2x1ZGUvR0xFUy9nbGV4dC5oIGIvb3BlbmdsL2luY2x1ZGUvR0xFUy9nbGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMDE4NzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvaW5jbHVkZS9HTEVTL2dsZXh0LmgKQEAgLTAsMCArMSw2MjIgQEAKKyNpZm5kZWYgX19nbGV4dF9oXworI2RlZmluZSBfX2dsZXh0X2hfCisKKy8qICRSZXZpc2lvbjogNzE3MiAkIG9uICREYXRlOjogMjAwOS0wMS0wOSAxMToxNzo0MSAtMDgwMCAjJCAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qCisgKiBUaGlzIGRvY3VtZW50IGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBTR0kgRnJlZSBTb2Z0d2FyZSBCIExpY2Vuc2UgVmVyc2lvbgorICogMi4wLiBGb3IgZGV0YWlscywgc2VlIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9GcmVlQi8gLgorICovCisKKyNpZm5kZWYgR0xfQVBJRU5UUllQCisjICAgZGVmaW5lIEdMX0FQSUVOVFJZUCBHTF9BUElFTlRSWSoKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAqIE9FUyBleHRlbnNpb24gdG9rZW5zCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEdMX09FU19ibGVuZF9lcXVhdGlvbl9zZXBhcmF0ZSAqLworI2lmbmRlZiBHTF9PRVNfYmxlbmRfZXF1YXRpb25fc2VwYXJhdGUKKy8qIEJMRU5EX0VRVUFUSU9OX1JHQl9PRVMgc2FtZSBhcyBCTEVORF9FUVVBVElPTl9PRVMgKi8KKyNkZWZpbmUgR0xfQkxFTkRfRVFVQVRJT05fUkdCX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDkKKyNkZWZpbmUgR0xfQkxFTkRfRVFVQVRJT05fQUxQSEFfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4M0QKKyNlbmRpZgorCisvKiBHTF9PRVNfYmxlbmRfZnVuY19zZXBhcmF0ZSAqLworI2lmbmRlZiBHTF9PRVNfYmxlbmRfZnVuY19zZXBhcmF0ZQorI2RlZmluZSBHTF9CTEVORF9EU1RfUkdCX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODBDOAorI2RlZmluZSBHTF9CTEVORF9TUkNfUkdCX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODBDOQorI2RlZmluZSBHTF9CTEVORF9EU1RfQUxQSEFfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODBDQQorI2RlZmluZSBHTF9CTEVORF9TUkNfQUxQSEFfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODBDQgorI2VuZGlmCisKKy8qIEdMX09FU19ibGVuZF9zdWJ0cmFjdCAqLworI2lmbmRlZiBHTF9PRVNfYmxlbmRfc3VidHJhY3QKKyNkZWZpbmUgR0xfQkxFTkRfRVFVQVRJT05fT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDkKKyNkZWZpbmUgR0xfRlVOQ19BRERfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDYKKyNkZWZpbmUgR0xfRlVOQ19TVUJUUkFDVF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMEEKKyNkZWZpbmUgR0xfRlVOQ19SRVZFUlNFX1NVQlRSQUNUX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMEIKKyNlbmRpZgorCisvKiBHTF9PRVNfY29tcHJlc3NlZF9FVEMxX1JHQjhfdGV4dHVyZSAqLworI2lmbmRlZiBHTF9PRVNfY29tcHJlc3NlZF9FVEMxX1JHQjhfdGV4dHVyZQorI2RlZmluZSBHTF9FVEMxX1JHQjhfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ2NAorI2VuZGlmCisKKy8qIEdMX09FU19kZXB0aDI0ICovCisjaWZuZGVmIEdMX09FU19kZXB0aDI0CisjZGVmaW5lIEdMX0RFUFRIX0NPTVBPTkVOVDI0X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MUE2CisjZW5kaWYKKworLyogR0xfT0VTX2RlcHRoMzIgKi8KKyNpZm5kZWYgR0xfT0VTX2RlcHRoMzIKKyNkZWZpbmUgR0xfREVQVEhfQ09NUE9ORU5UMzJfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgxQTcKKyNlbmRpZgorCisvKiBHTF9PRVNfZHJhd190ZXh0dXJlICovCisjaWZuZGVmIEdMX09FU19kcmF3X3RleHR1cmUKKyNkZWZpbmUgR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCOUQKKyNlbmRpZgorCisvKiBHTF9PRVNfRUdMX2ltYWdlICovCisjaWZuZGVmIEdMX09FU19FR0xfaW1hZ2UKK3R5cGVkZWYgdm9pZCogR0xlZ2xJbWFnZU9FUzsKKyNlbmRpZgorCisvKiBHTF9PRVNfZml4ZWRfcG9pbnQgKi8KKyNpZm5kZWYgR0xfT0VTX2ZpeGVkX3BvaW50CisjZGVmaW5lIEdMX0ZJWEVEX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDBDCisjZW5kaWYKKworLyogR0xfT0VTX2ZyYW1lYnVmZmVyX29iamVjdCAqLworI2lmbmRlZiBHTF9PRVNfZnJhbWVidWZmZXJfb2JqZWN0CisjZGVmaW5lIEdMX05PTkVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ0MAorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ0MQorI2RlZmluZSBHTF9SR0JBNF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODA1NgorI2RlZmluZSBHTF9SR0I1X0ExX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODA1NworI2RlZmluZSBHTF9SR0I1NjVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ2MgorI2RlZmluZSBHTF9ERVBUSF9DT01QT05FTlQxNl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODFBNQorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfV0lEVEhfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ0MgorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfSEVJR0hUX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ0MworI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfSU5URVJOQUxfRk9STUFUX09FUyAgICAgICAgICAgICAgICAgICAgIDB4OEQ0NAorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfUkVEX1NJWkVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ1MAorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfR1JFRU5fU0laRV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ1MQorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfQkxVRV9TSVpFX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ1MgorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfQUxQSEFfU0laRV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ1MworI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfREVQVEhfU0laRV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ1NAorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfU1RFTkNJTF9TSVpFX09FUyAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ1NQorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9UWVBFX09FUyAgICAgICAgICAgICAgIDB4OENEMAorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9OQU1FX09FUyAgICAgICAgICAgICAgIDB4OENEMQorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfTEVWRUxfT0VTICAgICAgICAgICAgIDB4OENEMgorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfQ1VCRV9NQVBfRkFDRV9PRVMgICAgIDB4OENEMworI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UMF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OENFMAorI2RlZmluZSBHTF9ERVBUSF9BVFRBQ0hNRU5UX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQwMAorI2RlZmluZSBHTF9TVEVOQ0lMX0FUVEFDSE1FTlRfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQyMAorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9DT01QTEVURV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OENENQorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0FUVEFDSE1FTlRfT0VTICAgICAgICAgICAgICAgIDB4OENENgorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX01JU1NJTkdfQVRUQUNITUVOVF9PRVMgICAgICAgIDB4OENENworI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RJTUVOU0lPTlNfT0VTICAgICAgICAgICAgICAgIDB4OENEOQorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0ZPUk1BVFNfT0VTICAgICAgICAgICAgICAgICAgIDB4OENEQQorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9VTlNVUFBPUlRFRF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OENERAorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9CSU5ESU5HX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OENBNgorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfQklORElOR19PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OENBNworI2RlZmluZSBHTF9NQVhfUkVOREVSQlVGRkVSX1NJWkVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODRFOAorI2RlZmluZSBHTF9JTlZBTElEX0ZSQU1FQlVGRkVSX09QRVJBVElPTl9PRVMgICAgICAgICAgICAgICAgICAgIDB4MDUwNgorI2VuZGlmCisKKy8qIEdMX09FU19tYXBidWZmZXIgKi8KKyNpZm5kZWYgR0xfT0VTX21hcGJ1ZmZlcgorI2RlZmluZSBHTF9XUklURV9PTkxZX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODhCOQorI2RlZmluZSBHTF9CVUZGRVJfQUNDRVNTX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODhCQgorI2RlZmluZSBHTF9CVUZGRVJfTUFQUEVEX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODhCQworI2RlZmluZSBHTF9CVUZGRVJfTUFQX1BPSU5URVJfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODhCRAorI2VuZGlmCisKKy8qIEdMX09FU19tYXRyaXhfZ2V0ICovCisjaWZuZGVmIEdMX09FU19tYXRyaXhfZ2V0CisjZGVmaW5lIEdMX01PREVMVklFV19NQVRSSVhfRkxPQVRfQVNfSU5UX0JJVFNfT0VTICAgICAgICAgICAgICAgMHg4OThECisjZGVmaW5lIEdMX1BST0pFQ1RJT05fTUFUUklYX0ZMT0FUX0FTX0lOVF9CSVRTX09FUyAgICAgICAgICAgICAgMHg4OThFCisjZGVmaW5lIEdMX1RFWFRVUkVfTUFUUklYX0ZMT0FUX0FTX0lOVF9CSVRTX09FUyAgICAgICAgICAgICAgICAgMHg4OThGCisjZW5kaWYKKworLyogR0xfT0VTX21hdHJpeF9wYWxldHRlICovCisjaWZuZGVmIEdMX09FU19tYXRyaXhfcGFsZXR0ZQorI2RlZmluZSBHTF9NQVhfVkVSVEVYX1VOSVRTX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODZBNAorI2RlZmluZSBHTF9NQVhfUEFMRVRURV9NQVRSSUNFU19PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODg0MgorI2RlZmluZSBHTF9NQVRSSVhfUEFMRVRURV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODg0MAorI2RlZmluZSBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODg0NAorI2RlZmluZSBHTF9XRUlHSFRfQVJSQVlfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODZBRAorI2RlZmluZSBHTF9DVVJSRU5UX1BBTEVUVEVfTUFUUklYX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODg0MworI2RlZmluZSBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfU0laRV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODg0NgorI2RlZmluZSBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfVFlQRV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODg0NworI2RlZmluZSBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfU1RSSURFX09FUyAgICAgICAgICAgICAgICAgICAgICAgIDB4ODg0OAorI2RlZmluZSBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfUE9JTlRFUl9PRVMgICAgICAgICAgICAgICAgICAgICAgIDB4ODg0OQorI2RlZmluZSBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfQlVGRkVSX0JJTkRJTkdfT0VTICAgICAgICAgICAgICAgIDB4OEI5RQorI2RlZmluZSBHTF9XRUlHSFRfQVJSQVlfU0laRV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODZBQgorI2RlZmluZSBHTF9XRUlHSFRfQVJSQVlfVFlQRV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODZBOQorI2RlZmluZSBHTF9XRUlHSFRfQVJSQVlfU1RSSURFX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODZBQQorI2RlZmluZSBHTF9XRUlHSFRfQVJSQVlfUE9JTlRFUl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODZBQworI2RlZmluZSBHTF9XRUlHSFRfQVJSQVlfQlVGRkVSX0JJTkRJTkdfT0VTICAgICAgICAgICAgICAgICAgICAgIDB4ODg5RQorI2VuZGlmCisKKy8qIEdMX09FU19wYWNrZWRfZGVwdGhfc3RlbmNpbCAqLworI2lmbmRlZiBHTF9PRVNfcGFja2VkX2RlcHRoX3N0ZW5jaWwKKyNkZWZpbmUgR0xfREVQVEhfU1RFTkNJTF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg0RjkKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UXzI0XzhfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg0RkEKKyNkZWZpbmUgR0xfREVQVEgyNF9TVEVOQ0lMOF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4RjAKKyNlbmRpZgorCisvKiBHTF9PRVNfcmdiOF9yZ2JhOCAqLworI2lmbmRlZiBHTF9PRVNfcmdiOF9yZ2JhOAorI2RlZmluZSBHTF9SR0I4X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODA1MQorI2RlZmluZSBHTF9SR0JBOF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODA1OAorI2VuZGlmCisKKy8qIEdMX09FU19zdGVuY2lsMSAqLworI2lmbmRlZiBHTF9PRVNfc3RlbmNpbDEKKyNkZWZpbmUgR0xfU1RFTkNJTF9JTkRFWDFfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhENDYKKyNlbmRpZgorCisvKiBHTF9PRVNfc3RlbmNpbDQgKi8KKyNpZm5kZWYgR0xfT0VTX3N0ZW5jaWw0CisjZGVmaW5lIEdMX1NURU5DSUxfSU5ERVg0X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDQ3CisjZW5kaWYKKworLyogR0xfT0VTX3N0ZW5jaWw4ICovCisjaWZuZGVmIEdMX09FU19zdGVuY2lsOAorI2RlZmluZSBHTF9TVEVOQ0lMX0lOREVYOF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ0OAorI2VuZGlmCisKKy8qIEdMX09FU19zdGVuY2lsX3dyYXAgKi8KKyNpZm5kZWYgR0xfT0VTX3N0ZW5jaWxfd3JhcAorI2RlZmluZSBHTF9JTkNSX1dSQVBfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODUwNworI2RlZmluZSBHTF9ERUNSX1dSQVBfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODUwOAorI2VuZGlmCisKKy8qIEdMX09FU190ZXh0dXJlX2N1YmVfbWFwICovCisjaWZuZGVmIEdMX09FU190ZXh0dXJlX2N1YmVfbWFwCisjZGVmaW5lIEdMX05PUk1BTF9NQVBfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4NTExCisjZGVmaW5lIEdMX1JFRkxFQ1RJT05fTUFQX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4NTEyCisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4NTEzCisjZGVmaW5lIEdMX1RFWFRVUkVfQklORElOR19DVUJFX01BUF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgMHg4NTE0CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWF9PRVMgICAgICAgICAgICAgICAgICAgICAgMHg4NTE1CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWF9PRVMgICAgICAgICAgICAgICAgICAgICAgMHg4NTE2CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWV9PRVMgICAgICAgICAgICAgICAgICAgICAgMHg4NTE3CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWV9PRVMgICAgICAgICAgICAgICAgICAgICAgMHg4NTE4CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWl9PRVMgICAgICAgICAgICAgICAgICAgICAgMHg4NTE5CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWl9PRVMgICAgICAgICAgICAgICAgICAgICAgMHg4NTFBCisjZGVmaW5lIEdMX01BWF9DVUJFX01BUF9URVhUVVJFX1NJWkVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgMHg4NTFDCisjZGVmaW5lIEdMX1RFWFRVUkVfR0VOX01PREVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyNTAwCisjZGVmaW5lIEdMX1RFWFRVUkVfR0VOX1NUUl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDYwCisjZW5kaWYKKworLyogR0xfT0VTX3RleHR1cmVfbWlycm9yZWRfcmVwZWF0ICovCisjaWZuZGVmIEdMX09FU190ZXh0dXJlX21pcnJvcmVkX3JlcGVhdAorI2RlZmluZSBHTF9NSVJST1JFRF9SRVBFQVRfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODM3MAorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICogQU1EIGV4dGVuc2lvbiB0b2tlbnMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogR0xfQU1EX2NvbXByZXNzZWRfM0RDX3RleHR1cmUgKi8KKyNpZm5kZWYgR0xfQU1EX2NvbXByZXNzZWRfM0RDX3RleHR1cmUKKyNkZWZpbmUgR0xfM0RDX1hfQU1EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg3RjkKKyNkZWZpbmUgR0xfM0RDX1hZX0FNRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg3RkEKKyNlbmRpZgorCisvKiBHTF9BTURfY29tcHJlc3NlZF9BVENfdGV4dHVyZSAqLworI2lmbmRlZiBHTF9BTURfY29tcHJlc3NlZF9BVENfdGV4dHVyZQorI2RlZmluZSBHTF9BVENfUkdCX0FNRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEM5MgorI2RlZmluZSBHTF9BVENfUkdCQV9FWFBMSUNJVF9BTFBIQV9BTUQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEM5MworI2RlZmluZSBHTF9BVENfUkdCQV9JTlRFUlBPTEFURURfQUxQSEFfQU1EICAgICAgICAgICAgICAgICAgICAgIDB4ODdFRQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICogRVhUIGV4dGVuc2lvbiB0b2tlbnMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogR0xfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljICovCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYworI2RlZmluZSBHTF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODRGRQorI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQgICAgICAgICAgICAgICAgICAgICAgIDB4ODRGRgorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICogT0VTIGV4dGVuc2lvbiBmdW5jdGlvbnMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogR0xfT0VTX2JsZW5kX2VxdWF0aW9uX3NlcGFyYXRlICovCisjaWZuZGVmIEdMX09FU19ibGVuZF9lcXVhdGlvbl9zZXBhcmF0ZQorI2RlZmluZSBHTF9PRVNfYmxlbmRfZXF1YXRpb25fc2VwYXJhdGUgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQmxlbmRFcXVhdGlvblNlcGFyYXRlT0VTIChHTGVudW0gbW9kZVJHQiwgR0xlbnVtIG1vZGVBbHBoYSk7CisjZW5kaWYKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQkxFTkRFUVVBVElPTlNFUEFSQVRFT0VTUFJPQykgKEdMZW51bSBtb2RlUkdCLCBHTGVudW0gbW9kZUFscGhhKTsKKyNlbmRpZgorCisvKiBHTF9PRVNfYmxlbmRfZnVuY19zZXBhcmF0ZSAqLworI2lmbmRlZiBHTF9PRVNfYmxlbmRfZnVuY19zZXBhcmF0ZQorI2RlZmluZSBHTF9PRVNfYmxlbmRfZnVuY19zZXBhcmF0ZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xCbGVuZEZ1bmNTZXBhcmF0ZU9FUyAoR0xlbnVtIHNyY1JHQiwgR0xlbnVtIGRzdFJHQiwgR0xlbnVtIHNyY0FscGhhLCBHTGVudW0gZHN0QWxwaGEpOworI2VuZGlmCit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEJMRU5ERlVOQ1NFUEFSQVRFT0VTUFJPQykgKEdMZW51bSBzcmNSR0IsIEdMZW51bSBkc3RSR0IsIEdMZW51bSBzcmNBbHBoYSwgR0xlbnVtIGRzdEFscGhhKTsKKyNlbmRpZgorCisvKiBHTF9PRVNfYmxlbmRfc3VidHJhY3QgKi8KKyNpZm5kZWYgR0xfT0VTX2JsZW5kX3N1YnRyYWN0CisjZGVmaW5lIEdMX09FU19ibGVuZF9zdWJ0cmFjdCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xCbGVuZEVxdWF0aW9uT0VTIChHTGVudW0gbW9kZSk7CisjZW5kaWYKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQkxFTkRFUVVBVElPTk9FU1BST0MpIChHTGVudW0gbW9kZSk7CisjZW5kaWYKKworLyogR0xfT0VTX2J5dGVfY29vcmRpbmF0ZXMgKi8KKyNpZm5kZWYgR0xfT0VTX2J5dGVfY29vcmRpbmF0ZXMKKyNkZWZpbmUgR0xfT0VTX2J5dGVfY29vcmRpbmF0ZXMgMQorI2VuZGlmCisKKy8qIEdMX09FU19jb21wcmVzc2VkX0VUQzFfUkdCOF90ZXh0dXJlICovCisjaWZuZGVmIEdMX09FU19jb21wcmVzc2VkX0VUQzFfUkdCOF90ZXh0dXJlCisjZGVmaW5lIEdMX09FU19jb21wcmVzc2VkX0VUQzFfUkdCOF90ZXh0dXJlIDEKKyNlbmRpZgorCisvKiBHTF9PRVNfZGVwdGgyNCAqLworI2lmbmRlZiBHTF9PRVNfZGVwdGgyNAorI2RlZmluZSBHTF9PRVNfZGVwdGgyNCAxCisjZW5kaWYKKworLyogR0xfT0VTX2RlcHRoMzIgKi8KKyNpZm5kZWYgR0xfT0VTX2RlcHRoMzIKKyNkZWZpbmUgR0xfT0VTX2RlcHRoMzIgMQorI2VuZGlmCisKKy8qIEdMX09FU19kcmF3X3RleHR1cmUgKi8KKyNpZm5kZWYgR0xfT0VTX2RyYXdfdGV4dHVyZQorI2RlZmluZSBHTF9PRVNfZHJhd190ZXh0dXJlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERyYXdUZXhzT0VTIChHTHNob3J0IHgsIEdMc2hvcnQgeSwgR0xzaG9ydCB6LCBHTHNob3J0IHdpZHRoLCBHTHNob3J0IGhlaWdodCk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERyYXdUZXhpT0VTIChHTGludCB4LCBHTGludCB5LCBHTGludCB6LCBHTGludCB3aWR0aCwgR0xpbnQgaGVpZ2h0KTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRHJhd1RleHhPRVMgKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHosIEdMZml4ZWQgd2lkdGgsIEdMZml4ZWQgaGVpZ2h0KTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRHJhd1RleHN2T0VTIChjb25zdCBHTHNob3J0ICpjb29yZHMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xEcmF3VGV4aXZPRVMgKGNvbnN0IEdMaW50ICpjb29yZHMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xEcmF3VGV4eHZPRVMgKGNvbnN0IEdMZml4ZWQgKmNvb3Jkcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERyYXdUZXhmT0VTIChHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHdpZHRoLCBHTGZsb2F0IGhlaWdodCk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERyYXdUZXhmdk9FUyAoY29uc3QgR0xmbG9hdCAqY29vcmRzKTsKKyNlbmRpZgordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xEUkFXVEVYU09FU1BST0MpIChHTHNob3J0IHgsIEdMc2hvcnQgeSwgR0xzaG9ydCB6LCBHTHNob3J0IHdpZHRoLCBHTHNob3J0IGhlaWdodCk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTERSQVdURVhJT0VTUFJPQykgKEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHdpZHRoLCBHTGludCBoZWlnaHQpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xEUkFXVEVYWE9FU1BST0MpIChHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6LCBHTGZpeGVkIHdpZHRoLCBHTGZpeGVkIGhlaWdodCk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTERSQVdURVhTVk9FU1BST0MpIChjb25zdCBHTHNob3J0ICpjb29yZHMpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xEUkFXVEVYSVZPRVNQUk9DKSAoY29uc3QgR0xpbnQgKmNvb3Jkcyk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTERSQVdURVhYVk9FU1BST0MpIChjb25zdCBHTGZpeGVkICpjb29yZHMpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xEUkFXVEVYRk9FU1BST0MpIChHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHdpZHRoLCBHTGZsb2F0IGhlaWdodCk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTERSQVdURVhGVk9FU1BST0MpIChjb25zdCBHTGZsb2F0ICpjb29yZHMpOworI2VuZGlmCisKKy8qIEdMX09FU19FR0xfaW1hZ2UgKi8KKyNpZm5kZWYgR0xfT0VTX0VHTF9pbWFnZQorI2RlZmluZSBHTF9PRVNfRUdMX2ltYWdlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEVHTEltYWdlVGFyZ2V0VGV4dHVyZTJET0VTIChHTGVudW0gdGFyZ2V0LCBHTGVnbEltYWdlT0VTIGltYWdlKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRUdMSW1hZ2VUYXJnZXRSZW5kZXJidWZmZXJTdG9yYWdlT0VTIChHTGVudW0gdGFyZ2V0LCBHTGVnbEltYWdlT0VTIGltYWdlKTsKKyNlbmRpZgordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xFR0xJTUFHRVRBUkdFVFRFWFRVUkUyRE9FU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVnbEltYWdlT0VTIGltYWdlKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRUdMSU1BR0VUQVJHRVRSRU5ERVJCVUZGRVJTVE9SQUdFT0VTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZWdsSW1hZ2VPRVMgaW1hZ2UpOworI2VuZGlmCisKKy8qIEdMX09FU19lbGVtZW50X2luZGV4X3VpbnQgKi8KKyNpZm5kZWYgR0xfT0VTX2VsZW1lbnRfaW5kZXhfdWludAorI2RlZmluZSBHTF9PRVNfZWxlbWVudF9pbmRleF91aW50IDEKKyNlbmRpZgorCisvKiBHTF9PRVNfZXh0ZW5kZWRfbWF0cml4X3BhbGV0dGUgKi8KKyNpZm5kZWYgR0xfT0VTX2V4dGVuZGVkX21hdHJpeF9wYWxldHRlCisjZGVmaW5lIEdMX09FU19leHRlbmRlZF9tYXRyaXhfcGFsZXR0ZSAxCisjZW5kaWYKKworLyogR0xfT0VTX2Zib19yZW5kZXJfbWlwbWFwICovCisjaWZuZGVmIEdMX09FU19mYm9fcmVuZGVyX21pcG1hcAorI2RlZmluZSBHTF9PRVNfZmJvX3JlbmRlcl9taXBtYXAgMQorI2VuZGlmCisKKy8qIEdMX09FU19maXhlZF9wb2ludCAqLworI2lmbmRlZiBHTF9PRVNfZml4ZWRfcG9pbnQKKyNkZWZpbmUgR0xfT0VTX2ZpeGVkX3BvaW50IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEFscGhhRnVuY3hPRVMgKEdMZW51bSBmdW5jLCBHTGNsYW1weCByZWYpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDbGVhckNvbG9yeE9FUyAoR0xjbGFtcHggcmVkLCBHTGNsYW1weCBncmVlbiwgR0xjbGFtcHggYmx1ZSwgR0xjbGFtcHggYWxwaGEpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDbGVhckRlcHRoeE9FUyAoR0xjbGFtcHggZGVwdGgpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDbGlwUGxhbmV4T0VTIChHTGVudW0gcGxhbmUsIGNvbnN0IEdMZml4ZWQgKmVxdWF0aW9uKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQ29sb3I0eE9FUyAoR0xmaXhlZCByZWQsIEdMZml4ZWQgZ3JlZW4sIEdMZml4ZWQgYmx1ZSwgR0xmaXhlZCBhbHBoYSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERlcHRoUmFuZ2V4T0VTIChHTGNsYW1weCB6TmVhciwgR0xjbGFtcHggekZhcik7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEZvZ3hPRVMgKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEZvZ3h2T0VTIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEZydXN0dW14T0VTIChHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0Q2xpcFBsYW5leE9FUyAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIGVxbls0XSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldEZpeGVkdk9FUyAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRMaWdodHh2T0VTIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0TWF0ZXJpYWx4dk9FUyAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0VGV4RW52eHZPRVMgKEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0VGV4UGFyYW1ldGVyeHZPRVMgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTGlnaHRNb2RlbHhPRVMgKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbExpZ2h0TW9kZWx4dk9FUyAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xMaWdodHhPRVMgKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTGlnaHR4dk9FUyAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbExpbmVXaWR0aHhPRVMgKEdMZml4ZWQgd2lkdGgpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xMb2FkTWF0cml4eE9FUyAoY29uc3QgR0xmaXhlZCAqbSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbE1hdGVyaWFseE9FUyAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbE1hdGVyaWFseHZPRVMgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbE11bHRNYXRyaXh4T0VTIChjb25zdCBHTGZpeGVkICptKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDR4T0VTIChHTGVudW0gdGFyZ2V0LCBHTGZpeGVkIHMsIEdMZml4ZWQgdCwgR0xmaXhlZCByLCBHTGZpeGVkIHEpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xOb3JtYWwzeE9FUyAoR0xmaXhlZCBueCwgR0xmaXhlZCBueSwgR0xmaXhlZCBueik7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbE9ydGhveE9FUyAoR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LCBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhcik7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFBvaW50UGFyYW1ldGVyeE9FUyAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsUG9pbnRQYXJhbWV0ZXJ4dk9FUyAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xQb2ludFNpemV4T0VTIChHTGZpeGVkIHNpemUpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xQb2x5Z29uT2Zmc2V0eE9FUyAoR0xmaXhlZCBmYWN0b3IsIEdMZml4ZWQgdW5pdHMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xSb3RhdGV4T0VTIChHTGZpeGVkIGFuZ2xlLCBHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsU2FtcGxlQ292ZXJhZ2V4T0VTIChHTGNsYW1weCB2YWx1ZSwgR0xib29sZWFuIGludmVydCk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFNjYWxleE9FUyAoR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeik7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleEVudnhPRVMgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleEVudnh2T0VTIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleFBhcmFtZXRlcnhPRVMgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleFBhcmFtZXRlcnh2T0VTIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRyYW5zbGF0ZXhPRVMgKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopOworI2VuZGlmCit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEFMUEhBRlVOQ1hPRVNQUk9DKSAoR0xlbnVtIGZ1bmMsIEdMY2xhbXB4IHJlZik7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTENMRUFSQ09MT1JYT0VTUFJPQykgKEdMY2xhbXB4IHJlZCwgR0xjbGFtcHggZ3JlZW4sIEdMY2xhbXB4IGJsdWUsIEdMY2xhbXB4IGFscGhhKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQ0xFQVJERVBUSFhPRVNQUk9DKSAoR0xjbGFtcHggZGVwdGgpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xDTElQUExBTkVYT0VTUFJPQykgKEdMZW51bSBwbGFuZSwgY29uc3QgR0xmaXhlZCAqZXF1YXRpb24pOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xDT0xPUjRYT0VTUFJPQykgKEdMZml4ZWQgcmVkLCBHTGZpeGVkIGdyZWVuLCBHTGZpeGVkIGJsdWUsIEdMZml4ZWQgYWxwaGEpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xERVBUSFJBTkdFWE9FU1BST0MpIChHTGNsYW1weCB6TmVhciwgR0xjbGFtcHggekZhcik7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEZPR1hPRVNQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRk9HWFZPRVNQUk9DKSAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xGUlVTVFVNWE9FU1BST0MpIChHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUQ0xJUFBMQU5FWE9FU1BST0MpIChHTGVudW0gcG5hbWUsIEdMZml4ZWQgZXFuWzRdKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VURklYRURWT0VTUFJPQykgKEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUTElHSFRYVk9FU1BST0MpIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUTUFURVJJQUxYVk9FU1BST0MpIChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRVRURVhFTlZYVk9FU1BST0MpIChHTGVudW0gZW52LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVFRFWFBBUkFNRVRFUlhWT0VTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMTElHSFRNT0RFTFhPRVNQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMTElHSFRNT0RFTFhWT0VTUFJPQykgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMTElHSFRYT0VTUFJPQykgKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMTElHSFRYVk9FU1BST0MpIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMTElORVdJRFRIWE9FU1BST0MpIChHTGZpeGVkIHdpZHRoKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMTE9BRE1BVFJJWFhPRVNQUk9DKSAoY29uc3QgR0xmaXhlZCAqbSk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTE1BVEVSSUFMWE9FU1BST0MpIChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMTUFURVJJQUxYVk9FU1BST0MpIChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xNVUxUTUFUUklYWE9FU1BST0MpIChjb25zdCBHTGZpeGVkICptKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDRYT0VTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZml4ZWQgcywgR0xmaXhlZCB0LCBHTGZpeGVkIHIsIEdMZml4ZWQgcSk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTE5PUk1BTDNYT0VTUFJPQykgKEdMZml4ZWQgbngsIEdMZml4ZWQgbnksIEdMZml4ZWQgbnopOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xPUlRIT1hPRVNQUk9DKSAoR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LCBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhcik7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFBPSU5UUEFSQU1FVEVSWE9FU1BST0MpIChHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xQT0lOVFBBUkFNRVRFUlhWT0VTUFJPQykgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMUE9JTlRTSVpFWE9FU1BST0MpIChHTGZpeGVkIHNpemUpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xQT0xZR09OT0ZGU0VUWE9FU1BST0MpIChHTGZpeGVkIGZhY3RvciwgR0xmaXhlZCB1bml0cyk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFJPVEFURVhPRVNQUk9DKSAoR0xmaXhlZCBhbmdsZSwgR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeik7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFNBTVBMRUNPVkVSQUdFWE9FU1BST0MpIChHTGNsYW1weCB2YWx1ZSwgR0xib29sZWFuIGludmVydCk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFNDQUxFWE9FU1BST0MpIChHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMVEVYRU5WWE9FU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xURVhFTlZYVk9FU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFRFWFBBUkFNRVRFUlhPRVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMVEVYUEFSQU1FVEVSWFZPRVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xUUkFOU0xBVEVYT0VTUFJPQykgKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopOworI2VuZGlmCisKKy8qIEdMX09FU19mcmFtZWJ1ZmZlcl9vYmplY3QgKi8KKyNpZm5kZWYgR0xfT0VTX2ZyYW1lYnVmZmVyX29iamVjdAorI2RlZmluZSBHTF9PRVNfZnJhbWVidWZmZXJfb2JqZWN0IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTF9BUEkgR0xib29sZWFuIEdMX0FQSUVOVFJZIGdsSXNSZW5kZXJidWZmZXJPRVMgKEdMdWludCByZW5kZXJidWZmZXIpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xCaW5kUmVuZGVyYnVmZmVyT0VTIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRGVsZXRlUmVuZGVyYnVmZmVyc09FUyAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIHJlbmRlcmJ1ZmZlcnMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZW5SZW5kZXJidWZmZXJzT0VTIChHTHNpemVpIG4sIEdMdWludCogcmVuZGVyYnVmZmVycyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VPRVMgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdk9FUyAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKTsKK0dMX0FQSSBHTGJvb2xlYW4gR0xfQVBJRU5UUlkgZ2xJc0ZyYW1lYnVmZmVyT0VTIChHTHVpbnQgZnJhbWVidWZmZXIpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xCaW5kRnJhbWVidWZmZXJPRVMgKEdMZW51bSB0YXJnZXQsIEdMdWludCBmcmFtZWJ1ZmZlcik7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERlbGV0ZUZyYW1lYnVmZmVyc09FUyAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIGZyYW1lYnVmZmVycyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdlbkZyYW1lYnVmZmVyc09FUyAoR0xzaXplaSBuLCBHTHVpbnQqIGZyYW1lYnVmZmVycyk7CitHTF9BUEkgR0xlbnVtIEdMX0FQSUVOVFJZIGdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1c09FUyAoR0xlbnVtIHRhcmdldCk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyT0VTIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHJlbmRlcmJ1ZmZlcnRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlcik7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEZyYW1lYnVmZmVyVGV4dHVyZTJET0VTIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHRleHRhcmdldCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXZPRVMgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZW5lcmF0ZU1pcG1hcE9FUyAoR0xlbnVtIHRhcmdldCk7CisjZW5kaWYKK3R5cGVkZWYgR0xib29sZWFuIChHTF9BUElFTlRSWVAgUEZOR0xJU1JFTkRFUkJVRkZFUk9FU1BST0MpIChHTHVpbnQgcmVuZGVyYnVmZmVyKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQklORFJFTkRFUkJVRkZFUk9FU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMREVMRVRFUkVOREVSQlVGRkVSU09FU1BST0MpIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCogcmVuZGVyYnVmZmVycyk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFTlJFTkRFUkJVRkZFUlNPRVNQUk9DKSAoR0xzaXplaSBuLCBHTHVpbnQqIHJlbmRlcmJ1ZmZlcnMpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xSRU5ERVJCVUZGRVJTVE9SQUdFT0VTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRVRSRU5ERVJCVUZGRVJQQVJBTUVURVJJVk9FU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpOwordHlwZWRlZiBHTGJvb2xlYW4gKEdMX0FQSUVOVFJZUCBQRk5HTElTRlJBTUVCVUZGRVJPRVNQUk9DKSAoR0x1aW50IGZyYW1lYnVmZmVyKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQklOREZSQU1FQlVGRkVST0VTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBmcmFtZWJ1ZmZlcik7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTERFTEVURUZSQU1FQlVGRkVSU09FU1BST0MpIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCogZnJhbWVidWZmZXJzKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VORlJBTUVCVUZGRVJTT0VTUFJPQykgKEdMc2l6ZWkgbiwgR0x1aW50KiBmcmFtZWJ1ZmZlcnMpOwordHlwZWRlZiBHTGVudW0gKEdMX0FQSUVOVFJZUCBQRk5HTENIRUNLRlJBTUVCVUZGRVJTVEFUVVNPRVNQUk9DKSAoR0xlbnVtIHRhcmdldCk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEZSQU1FQlVGRkVSUkVOREVSQlVGRkVST0VTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcmVuZGVyYnVmZmVydGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRlJBTUVCVUZGRVJURVhUVVJFMkRPRVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVEZSQU1FQlVGRkVSQVRUQUNITUVOVFBBUkFNRVRFUklWT0VTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRU5FUkFURU1JUE1BUE9FU1BST0MpIChHTGVudW0gdGFyZ2V0KTsKKyNlbmRpZgorCisvKiBHTF9PRVNfbWFwYnVmZmVyICovCisjaWZuZGVmIEdMX09FU19tYXBidWZmZXIKKyNkZWZpbmUgR0xfT0VTX21hcGJ1ZmZlciAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xfQVBJIHZvaWQqIEdMX0FQSUVOVFJZIGdsTWFwQnVmZmVyT0VTIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYWNjZXNzKTsKK0dMX0FQSSBHTGJvb2xlYW4gR0xfQVBJRU5UUlkgZ2xVbm1hcEJ1ZmZlck9FUyAoR0xlbnVtIHRhcmdldCk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldEJ1ZmZlclBvaW50ZXJ2T0VTIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIHZvaWQqKiBwYXJhbXMpOworI2VuZGlmCit0eXBlZGVmIHZvaWQqIChHTF9BUElFTlRSWVAgUEZOR0xNQVBCVUZGRVJPRVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGFjY2Vzcyk7Cit0eXBlZGVmIEdMYm9vbGVhbiAoR0xfQVBJRU5UUllQIFBGTkdMVU5NQVBCVUZGRVJPRVNQUk9DKSAoR0xlbnVtIHRhcmdldCk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVEJVRkZFUlBPSU5URVJWT0VTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgdm9pZCoqIHBhcmFtcyk7CisjZW5kaWYKKworLyogR0xfT0VTX21hdHJpeF9nZXQgKi8KKyNpZm5kZWYgR0xfT0VTX21hdHJpeF9nZXQKKyNkZWZpbmUgR0xfT0VTX21hdHJpeF9nZXQgMQorI2VuZGlmCisKKy8qIEdMX09FU19tYXRyaXhfcGFsZXR0ZSAqLworI2lmbmRlZiBHTF9PRVNfbWF0cml4X3BhbGV0dGUKKyNkZWZpbmUgR0xfT0VTX21hdHJpeF9wYWxldHRlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEN1cnJlbnRQYWxldHRlTWF0cml4T0VTIChHTHVpbnQgbWF0cml4cGFsZXR0ZWluZGV4KTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTG9hZFBhbGV0dGVGcm9tTW9kZWxWaWV3TWF0cml4T0VTICh2b2lkKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTWF0cml4SW5kZXhQb2ludGVyT0VTIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFdlaWdodFBvaW50ZXJPRVMgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKKyNlbmRpZgordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xDVVJSRU5UUEFMRVRURU1BVFJJWE9FU1BST0MpIChHTHVpbnQgbWF0cml4cGFsZXR0ZWluZGV4KTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMTE9BRFBBTEVUVEVGUk9NTU9ERUxWSUVXTUFUUklYT0VTUFJPQykgKHZvaWQpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xNQVRSSVhJTkRFWFBPSU5URVJPRVNQUk9DKSAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xXRUlHSFRQT0lOVEVST0VTUFJPQykgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKKyNlbmRpZgorCisvKiBHTF9PRVNfcGFja2VkX2RlcHRoX3N0ZW5jaWwgKi8KKyNpZm5kZWYgR0xfT0VTX3BhY2tlZF9kZXB0aF9zdGVuY2lsCisjZGVmaW5lIEdMX09FU19wYWNrZWRfZGVwdGhfc3RlbmNpbCAxCisjZW5kaWYKKworLyogR0xfT0VTX3F1ZXJ5X21hdHJpeCAqLworI2lmbmRlZiBHTF9PRVNfcXVlcnlfbWF0cml4CisjZGVmaW5lIEdMX09FU19xdWVyeV9tYXRyaXggMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMX0FQSSBHTGJpdGZpZWxkIEdMX0FQSUVOVFJZIGdsUXVlcnlNYXRyaXh4T0VTIChHTGZpeGVkIG1hbnRpc3NhWzE2XSwgR0xpbnQgZXhwb25lbnRbMTZdKTsKKyNlbmRpZgordHlwZWRlZiBHTGJpdGZpZWxkIChHTF9BUElFTlRSWVAgUEZOR0xRVUVSWU1BVFJJWFhPRVNQUk9DKSAoR0xmaXhlZCBtYW50aXNzYVsxNl0sIEdMaW50IGV4cG9uZW50WzE2XSk7CisjZW5kaWYKKworLyogR0xfT0VTX3JnYjhfcmdiYTggKi8KKyNpZm5kZWYgR0xfT0VTX3JnYjhfcmdiYTgKKyNkZWZpbmUgR0xfT0VTX3JnYjhfcmdiYTggMQorI2VuZGlmCisKKy8qIEdMX09FU19zaW5nbGVfcHJlY2lzaW9uICovCisjaWZuZGVmIEdMX09FU19zaW5nbGVfcHJlY2lzaW9uCisjZGVmaW5lIEdMX09FU19zaW5nbGVfcHJlY2lzaW9uIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERlcHRoUmFuZ2VmT0VTIChHTGNsYW1wZiB6TmVhciwgR0xjbGFtcGYgekZhcik7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEZydXN0dW1mT0VTIChHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsT3J0aG9mT0VTIChHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQ2xpcFBsYW5lZk9FUyAoR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZsb2F0ICplcXVhdGlvbik7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldENsaXBQbGFuZWZPRVMgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBlcW5bNF0pOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDbGVhckRlcHRoZk9FUyAoR0xjbGFtcGYgZGVwdGgpOworI2VuZGlmCit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTERFUFRIUkFOR0VGT0VTUFJPQykgKEdMY2xhbXBmIHpOZWFyLCBHTGNsYW1wZiB6RmFyKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRlJVU1RVTUZPRVNQUk9DKSAoR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhcik7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTE9SVEhPRk9FU1BST0MpIChHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQ0xJUFBMQU5FRk9FU1BST0MpIChHTGVudW0gcGxhbmUsIGNvbnN0IEdMZmxvYXQgKmVxdWF0aW9uKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUQ0xJUFBMQU5FRk9FU1BST0MpIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgZXFuWzRdKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQ0xFQVJERVBUSEZPRVNQUk9DKSAoR0xjbGFtcGYgZGVwdGgpOworI2VuZGlmCisKKy8qIEdMX09FU19zdGVuY2lsMSAqLworI2lmbmRlZiBHTF9PRVNfc3RlbmNpbDEKKyNkZWZpbmUgR0xfT0VTX3N0ZW5jaWwxIDEKKyNlbmRpZgorCisvKiBHTF9PRVNfc3RlbmNpbDQgKi8KKyNpZm5kZWYgR0xfT0VTX3N0ZW5jaWw0CisjZGVmaW5lIEdMX09FU19zdGVuY2lsNCAxCisjZW5kaWYKKworLyogR0xfT0VTX3N0ZW5jaWw4ICovCisjaWZuZGVmIEdMX09FU19zdGVuY2lsOAorI2RlZmluZSBHTF9PRVNfc3RlbmNpbDggMQorI2VuZGlmCisKKy8qIEdMX09FU19zdGVuY2lsX3dyYXAgKi8KKyNpZm5kZWYgR0xfT0VTX3N0ZW5jaWxfd3JhcAorI2RlZmluZSBHTF9PRVNfc3RlbmNpbF93cmFwIDEKKyNlbmRpZgorCisvKiBHTF9PRVNfdGV4dHVyZV9jdWJlX21hcCAqLworI2lmbmRlZiBHTF9PRVNfdGV4dHVyZV9jdWJlX21hcAorI2RlZmluZSBHTF9PRVNfdGV4dHVyZV9jdWJlX21hcCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhHZW5mT0VTIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleEdlbmZ2T0VTIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4R2VuaU9FUyAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4R2VuaXZPRVMgKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4R2VueE9FUyAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhHZW54dk9FUyAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldFRleEdlbmZ2T0VTIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0VGV4R2VuaXZPRVMgKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0VGV4R2VueHZPRVMgKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpOworI2VuZGlmCit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFRFWEdFTkZPRVNQUk9DKSAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xURVhHRU5GVk9FU1BST0MpIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMVEVYR0VOSU9FU1BST0MpIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xURVhHRU5JVk9FU1BST0MpIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFRFWEdFTlhPRVNQUk9DKSAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xURVhHRU5YVk9FU1BST0MpIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUVEVYR0VORlZPRVNQUk9DKSAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVFRFWEdFTklWT0VTUFJPQykgKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUVEVYR0VOWFZPRVNQUk9DKSAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyk7CisjZW5kaWYKKworLyogR0xfT0VTX3RleHR1cmVfZW52X2Nyb3NzYmFyICovCisjaWZuZGVmIEdMX09FU190ZXh0dXJlX2Vudl9jcm9zc2JhcgorI2RlZmluZSBHTF9PRVNfdGV4dHVyZV9lbnZfY3Jvc3NiYXIgMQorI2VuZGlmCisKKy8qIEdMX09FU190ZXh0dXJlX21pcnJvcmVkX3JlcGVhdCAqLworI2lmbmRlZiBHTF9PRVNfdGV4dHVyZV9taXJyb3JlZF9yZXBlYXQKKyNkZWZpbmUgR0xfT0VTX3RleHR1cmVfbWlycm9yZWRfcmVwZWF0IDEKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAqIEFNRCBleHRlbnNpb24gZnVuY3Rpb25zCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEdMX0FNRF9jb21wcmVzc2VkXzNEQ190ZXh0dXJlICovCisjaWZuZGVmIEdMX0FNRF9jb21wcmVzc2VkXzNEQ190ZXh0dXJlCisjZGVmaW5lIEdMX0FNRF9jb21wcmVzc2VkXzNEQ190ZXh0dXJlIDEKKyNlbmRpZgorCisvKiBHTF9BTURfY29tcHJlc3NlZF9BVENfdGV4dHVyZSAqLworI2lmbmRlZiBHTF9BTURfY29tcHJlc3NlZF9BVENfdGV4dHVyZQorI2RlZmluZSBHTF9BTURfY29tcHJlc3NlZF9BVENfdGV4dHVyZSAxCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgKiBFWFQgZXh0ZW5zaW9uIGZ1bmN0aW9ucworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBHTF9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMgKi8KKyNpZm5kZWYgR0xfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljCisjZGVmaW5lIEdMX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyAxCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgKiBkYWx2aWsgZXh0ZW5zaW9uIGZ1bmN0aW9ucworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIEFORFJPSUQKK3ZvaWQgZ2xDb2xvclBvaW50ZXJCb3VuZHMoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLAorICAgICAgICBjb25zdCBHTHZvaWQgKnB0ciwgR0xzaXplaSBjb3VudCk7Cit2b2lkIGdsTm9ybWFsUG9pbnRlckJvdW5kcyhHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsCisgICAgICAgIGNvbnN0IEdMdm9pZCAqcG9pbnRlciwgR0xzaXplaSBjb3VudCk7Cit2b2lkIGdsVGV4Q29vcmRQb2ludGVyQm91bmRzKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLAorICAgICAgICBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyLCBHTHNpemVpIGNvdW50KTsKK3ZvaWQgZ2xWZXJ0ZXhQb2ludGVyQm91bmRzKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLAorICAgICAgICBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyLCBHTHNpemVpIGNvdW50KTsKKyNlbmRpZgorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX2dsZXh0X2hfICovCisKZGlmZiAtLWdpdCBhL29wZW5nbC9pbmNsdWRlL0dMRVMvZ2xwbGF0Zm9ybS5oIGIvb3BlbmdsL2luY2x1ZGUvR0xFUy9nbHBsYXRmb3JtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkyNGNhZQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC9pbmNsdWRlL0dMRVMvZ2xwbGF0Zm9ybS5oCkBAIC0wLDAgKzEsMzkgQEAKKyNpZm5kZWYgX19nbHBsYXRmb3JtX2hfCisjZGVmaW5lIF9fZ2xwbGF0Zm9ybV9oXworCisvKiAkUmV2aXNpb246IDcxNzIgJCBvbiAkRGF0ZTo6IDIwMDktMDEtMDkgMTE6MTc6NDEgLTA4MDAgIyQgKi8KKworLyoKKyAqIFRoaXMgZG9jdW1lbnQgaXMgbGljZW5zZWQgdW5kZXIgdGhlIFNHSSBGcmVlIFNvZnR3YXJlIEIgTGljZW5zZSBWZXJzaW9uCisgKiAyLjAuIEZvciBkZXRhaWxzLCBzZWUgaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0ZyZWVCLyAuCisgKi8KKworLyogUGxhdGZvcm0tc3BlY2lmaWMgdHlwZXMgYW5kIGRlZmluaXRpb25zIGZvciBPcGVuR0wgRVMgMS5YICBnbC5oCisgKiBMYXN0IG1vZGlmaWVkIG9uIDIwMDgvMTIvMTkKKyAqCisgKiBBZG9wdGVycyBtYXkgbW9kaWZ5IGtocnBsYXRmb3JtLmggYW5kIHRoaXMgZmlsZSB0byBzdWl0IHRoZWlyIHBsYXRmb3JtLgorICogWW91IGFyZSBlbmNvdXJhZ2VkIHRvIHN1Ym1pdCBhbGwgbW9kaWZpY2F0aW9ucyB0byB0aGUgS2hyb25vcyBncm91cCBzbyB0aGF0CisgKiB0aGV5IGNhbiBiZSBpbmNsdWRlZCBpbiBmdXR1cmUgdmVyc2lvbnMgb2YgdGhpcyBmaWxlLiAgUGxlYXNlIHN1Ym1pdCBjaGFuZ2VzCisgKiBieSBzZW5kaW5nIHRoZW0gdG8gdGhlIHB1YmxpYyBLaHJvbm9zIEJ1Z3ppbGxhIChodHRwOi8va2hyb25vcy5vcmcvYnVnemlsbGEpCisgKiBieSBmaWxpbmcgYSBidWcgYWdhaW5zdCBwcm9kdWN0ICJPcGVuR0wtRVMiIGNvbXBvbmVudCAiUmVnaXN0cnkiLgorICovCisKKyNpbmNsdWRlIDxLSFIva2hycGxhdGZvcm0uaD4KKworI2lmbmRlZiBHTF9BUEkKKyNkZWZpbmUgR0xfQVBJICAgICAgS0hST05PU19BUElDQUxMCisjZW5kaWYKKworI2lmIGRlZmluZWQoQU5EUk9JRCkKKworI2RlZmluZSBHTF9BUElFTlRSWSBLSFJPTk9TX0FQSUVOVFJZCisKKy8vIFhYWDogdGhpcyBzaG91bGQgcHJvYmFibHkgbm90IGJlIGhlcmUKKyNkZWZpbmUgR0xfRElSRUNUX1RFWFRVUkVfMkRfUVVBTENPTU0gICAgICAgICAgICAgICAweDdFODAKKworLy8gWFhYOiBub3Qgc3VyZSBob3cgdGhpcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkCisjZGVmaW5lIEdMX0dMRVhUX1BST1RPVFlQRVMKKworI2VuZGlmCisKKyNlbmRpZiAvKiBfX2dscGxhdGZvcm1faF8gKi8KZGlmZiAtLWdpdCBhL29wZW5nbC9pbmNsdWRlL0tIUi9raHJwbGF0Zm9ybS5oIGIvb3BlbmdsL2luY2x1ZGUvS0hSL2tocnBsYXRmb3JtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNjMjdjNQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC9pbmNsdWRlL0tIUi9raHJwbGF0Zm9ybS5oCkBAIC0wLDAgKzEsMjQxIEBACisjaWZuZGVmIF9fa2hycGxhdGZvcm1faF8KKyNkZWZpbmUgX19raHJwbGF0Zm9ybV9oXworCisvKgorKiogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorKioKKyoqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisqKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kL29yIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisqKiAiTWF0ZXJpYWxzIiksIHRvIGRlYWwgaW4gdGhlIE1hdGVyaWFscyB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyoqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyoqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgTWF0ZXJpYWxzLCBhbmQgdG8KKyoqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIE1hdGVyaWFscyBhcmUgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisqKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisqKgorKiogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyoqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIE1hdGVyaWFscy4KKyoqCisqKiBUSEUgTUFURVJJQUxTIEFSRSBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorKiogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisqKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisqKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorKiogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyoqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisqKiBNQVRFUklBTFMgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgTUFURVJJQUxTLgorKi8KKworLyogUGxhdGZvcm0tc3BlY2lmaWMgdHlwZXMgYW5kIGRlZmluaXRpb25zLgorICogJFJldmlzaW9uOiA3MjQ0ICQgb24gJERhdGU6IDIwMDktMDEtMjAgMTc6MDY6NTkgLTA4MDAgKFR1ZSwgMjAgSmFuIDIwMDkpICQKKyAqIAorICogQWRvcHRlcnMgbWF5IG1vZGlmeSB0aGlzIGZpbGUgdG8gc3VpdCB0aGVpciBwbGF0Zm9ybS4gQWRvcHRlcnMgYXJlCisgKiBlbmNvdXJhZ2VkIHRvIHN1Ym1pdCBwbGF0Zm9ybSBzcGVjaWZpYyBtb2RpZmljYXRpb25zIHRvIHRoZSBLaHJvbm9zCisgKiBncm91cCBzbyB0aGF0IHRoZXkgY2FuIGJlIGluY2x1ZGVkIGluIGZ1dHVyZSB2ZXJzaW9ucyBvZiB0aGlzIGZpbGUuCisgKiBQbGVhc2Ugc3VibWl0IGNoYW5nZXMgYnkgc2VuZGluZyB0aGVtIHRvIHRoZSBwdWJsaWMgS2hyb25vcyBCdWd6aWxsYQorICogKGh0dHA6Ly9raHJvbm9zLm9yZy9idWd6aWxsYSkgYnkgZmlsaW5nIGEgYnVnIGFnYWluc3QgcHJvZHVjdAorICogIktocm9ub3MgKGdlbmVyYWwpIiBjb21wb25lbnQgIlJlZ2lzdHJ5Ii4KKyAqCisgKiBBIHByZWRlZmluZWQgdGVtcGxhdGUgd2hpY2ggZmlsbHMgaW4gc29tZSBvZiB0aGUgYnVnIGZpZWxkcyBjYW4gYmUKKyAqIHJlYWNoZWQgdXNpbmcgaHR0cDovL3Rpbnl1cmwuY29tL2tocnBsYXRmb3JtLWgtYnVncmVwb3J0LCBidXQgeW91CisgKiBtdXN0IGNyZWF0ZSBhIEJ1Z3ppbGxhIGxvZ2luIGZpcnN0LgorICogCisgKgorICogU2VlIHRoZSBJbXBsZW1lbnRlcidzIEd1aWRlbGluZXMgZm9yIGluZm9ybWF0aW9uIGFib3V0IHdoZXJlIHRoaXMgZmlsZQorICogc2hvdWxkIGJlIGxvY2F0ZWQgb24geW91ciBzeXN0ZW0uCisgKiAgICBodHRwOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L2ltcGxlbWVudGVyc19ndWlkZS5wZGYKKyAqCisgKiAKKyAqIFRoaXMgZmlsZSBzaG91bGQgYmUgaW5jbHVkZWQgYXMKKyAqICAgICAgICAjaW5jbHVkZSA8S0hSL2tocnBsYXRmb3JtLmg+CisgKiBieSB0aGUgS2hyb25vcyBBUEkgaGVhZGVyIGZpbGUgdGhhdCB1c2VzIGl0cyB0eXBlcyBhbmQgZGVmaW5lcy4KKyAqCisgKiBUaGUgdHlwZXMgaW4gdGhpcyBmaWxlIHNob3VsZCBvbmx5IGJlIHVzZWQgdG8gZGVmaW5lIEFQSS1zcGVjaWZpYyB0eXBlcy4KKyAqIFR5cGVzIGRlZmluZWQgaW4gdGhpcyBmaWxlOgorICogICAga2hyb25vc19pbnQ4X3QgICAgICAgICAgICAgIHNpZ25lZCAgIDggIGJpdAorICogICAga2hyb25vc191aW50OF90ICAgICAgICAgICAgIHVuc2lnbmVkIDggIGJpdAorICogICAga2hyb25vc19pbnQxNl90ICAgICAgICAgICAgIHNpZ25lZCAgIDE2IGJpdAorICogICAga2hyb25vc191aW50MTZfdCAgICAgICAgICAgIHVuc2lnbmVkIDE2IGJpdAorICogICAga2hyb25vc19pbnQzMl90ICAgICAgICAgICAgIHNpZ25lZCAgIDMyIGJpdAorICogICAga2hyb25vc191aW50MzJfdCAgICAgICAgICAgIHVuc2lnbmVkIDMyIGJpdAorICogICAga2hyb25vc19pbnQ2NF90ICAgICAgICAgICAgIHNpZ25lZCAgIDY0IGJpdAorICogICAga2hyb25vc191aW50NjRfdCAgICAgICAgICAgIHVuc2lnbmVkIDY0IGJpdAorICogICAga2hyb25vc19pbnRwdHJfdCAgICAgICAgICAgIHNpZ25lZCAgIHNhbWUgbnVtYmVyIG9mIGJpdHMgYXMgYSBwb2ludGVyCisgKiAgICBraHJvbm9zX3VpbnRwdHJfdCAgICAgICAgICAgdW5zaWduZWQgc2FtZSBudW1iZXIgb2YgYml0cyBhcyBhIHBvaW50ZXIKKyAqICAgIGtocm9ub3Nfc3NpemVfdCAgICAgICAgICAgICBzaWduZWQgICBzaXplCisgKiAgICBraHJvbm9zX3VzaXplX3QgICAgICAgICAgICAgdW5zaWduZWQgc2l6ZQorICogICAga2hyb25vc19mbG9hdF90ICAgICAgICAgICAgIHNpZ25lZCAgIDMyIGJpdCBmbG9hdGluZyBwb2ludAorICogICAga2hyb25vc190aW1lX25zX3QgICAgICAgICAgIHVuc2lnbmVkIDY0IGJpdCB0aW1lIGluIG5hbm9zZWNvbmRzCisgKiAgICBraHJvbm9zX3V0aW1lX25hbm9zZWNvbmRzX3QgdW5zaWduZWQgdGltZSBpbnRlcnZhbCBvciBhYnNvbHV0ZSB0aW1lIGluCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFub3NlY29uZHMKKyAqICAgIGtocm9ub3Nfc3RpbWVfbmFub3NlY29uZHNfdCBzaWduZWQgdGltZSBpbnRlcnZhbCBpbiBuYW5vc2Vjb25kcworICoKKyAqIEtIUk9OT1NfU1VQUE9SVF9JTlQ2NCBpcyAxIGlmIDY0IGJpdCBpbnRlZ2VycyBhcmUgc3VwcG9ydGVkOyBvdGhlcndpc2UgMC4KKyAqIEtIUk9OT1NfU1VQUE9SVF9GTE9BVCBpcyAxIGlmIGZsb2F0cyBhcmUgc3VwcG9ydGVkOyBvdGhlcndpc2UgMC4KKyAqIAorICoKKyAqIE1hY3JvcyBkZWZpbmVkIGluIHRoaXMgZmlsZToKKyAqICAgIEtIUk9OT1NfQVBJQ0FMTAorICogICAgS0hST05PU19BUElFTlRSWQorICogICAgS0hST05PU19BUElBVFRSSUJVVEVTCisgKiBUaGVzZSBtYXkgYmUgdXNlZCBpbiBmdW5jdGlvbiBwcm90b3R5cGVzIGFzOgorICogICAgICBLSFJPTk9TX0FQSUNBTEwgdm9pZCBLSFJPTk9TX0FQSUVOVFJZIGZ1bmNuYW1lKAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZzEsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJnMikgS0hST05PU19BUElBVFRSSUJVVEVTOworICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRGVmaW5pdGlvbiBvZiBLSFJPTk9TX0FQSUNBTEwKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVGhpcyBwcmVjZWRlcyB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIGZ1bmN0aW9uIGluIHRoZSBmdW5jdGlvbiBwcm90b3R5cGUuCisgKi8KKyNpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoX19TQ0lURUNIX1NOQVBfXykKKyMgICBkZWZpbmUgS0hST05PU19BUElDQUxMIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorI2VsaWYgZGVmaW5lZCAoX19TWU1CSUFOMzJfXykKKyMgICBkZWZpbmUgS0hST05PU19BUElDQUxMIElNUE9SVF9DCisjZWxzZQorIyAgIGRlZmluZSBLSFJPTk9TX0FQSUNBTEwKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIERlZmluaXRpb24gb2YgS0hST05PU19BUElFTlRSWQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUaGlzIGZvbGxvd3MgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBmdW5jdGlvbiAgYW5kIHByZWNlZGVzIHRoZSBmdW5jdGlvbgorICogbmFtZSBpbiB0aGUgZnVuY3Rpb24gcHJvdG90eXBlLgorICovCisjaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKF9XSU4zMl9XQ0UpICYmICFkZWZpbmVkKF9fU0NJVEVDSF9TTkFQX18pCisgICAgLyogV2luMzIgYnV0IG5vdCBXaW5DRSAqLworIyAgIGRlZmluZSBLSFJPTk9TX0FQSUVOVFJZIF9fc3RkY2FsbAorI2Vsc2UKKyMgICBkZWZpbmUgS0hST05PU19BUElFTlRSWQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRGVmaW5pdGlvbiBvZiBLSFJPTk9TX0FQSUFUVFJJQlVURVMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVGhpcyBmb2xsb3dzIHRoZSBjbG9zaW5nIHBhcmVudGhlc2lzIG9mIHRoZSBmdW5jdGlvbiBwcm90b3R5cGUgYXJndW1lbnRzLgorICovCisjaWYgZGVmaW5lZCAoX19BUk1DQ18yX18pCisjZGVmaW5lIEtIUk9OT1NfQVBJQVRUUklCVVRFUyBfX3NvZnRmcAorI2Vsc2UKKyNkZWZpbmUgS0hST05PU19BUElBVFRSSUJVVEVTCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBiYXNpYyB0eXBlIGRlZmluaXRpb25zCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiAoZGVmaW5lZChfX1NURENfVkVSU0lPTl9fKSAmJiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwpIHx8IGRlZmluZWQoX19HTlVDX18pIHx8IGRlZmluZWQoX19TQ09fXykgfHwgZGVmaW5lZChfX1VTTENfXykKKworCisvKgorICogVXNpbmcgPHN0ZGludC5oPgorICovCisjaW5jbHVkZSA8c3RkaW50Lmg+Cit0eXBlZGVmIGludDMyX3QgICAgICAgICAgICAgICAgIGtocm9ub3NfaW50MzJfdDsKK3R5cGVkZWYgdWludDMyX3QgICAgICAgICAgICAgICAga2hyb25vc191aW50MzJfdDsKK3R5cGVkZWYgaW50NjRfdCAgICAgICAgICAgICAgICAga2hyb25vc19pbnQ2NF90OwordHlwZWRlZiB1aW50NjRfdCAgICAgICAgICAgICAgICBraHJvbm9zX3VpbnQ2NF90OworI2RlZmluZSBLSFJPTk9TX1NVUFBPUlRfSU5UNjQgICAxCisjZGVmaW5lIEtIUk9OT1NfU1VQUE9SVF9GTE9BVCAgIDEKKworI2VsaWYgZGVmaW5lZChfX1ZNUyApIHx8IGRlZmluZWQoX19zZ2kpCisKKy8qCisgKiBVc2luZyA8aW50dHlwZXMuaD4KKyAqLworI2luY2x1ZGUgPGludHR5cGVzLmg+Cit0eXBlZGVmIGludDMyX3QgICAgICAgICAgICAgICAgIGtocm9ub3NfaW50MzJfdDsKK3R5cGVkZWYgdWludDMyX3QgICAgICAgICAgICAgICAga2hyb25vc191aW50MzJfdDsKK3R5cGVkZWYgaW50NjRfdCAgICAgICAgICAgICAgICAga2hyb25vc19pbnQ2NF90OwordHlwZWRlZiB1aW50NjRfdCAgICAgICAgICAgICAgICBraHJvbm9zX3VpbnQ2NF90OworI2RlZmluZSBLSFJPTk9TX1NVUFBPUlRfSU5UNjQgICAxCisjZGVmaW5lIEtIUk9OT1NfU1VQUE9SVF9GTE9BVCAgIDEKKworI2VsaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKF9fU0NJVEVDSF9TTkFQX18pCisKKy8qCisgKiBXaW4zMgorICovCit0eXBlZGVmIF9faW50MzIgICAgICAgICAgICAgICAgIGtocm9ub3NfaW50MzJfdDsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQzMiAgICAgICAga2hyb25vc191aW50MzJfdDsKK3R5cGVkZWYgX19pbnQ2NCAgICAgICAgICAgICAgICAga2hyb25vc19pbnQ2NF90OwordHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0ICAgICAgICBraHJvbm9zX3VpbnQ2NF90OworI2RlZmluZSBLSFJPTk9TX1NVUFBPUlRfSU5UNjQgICAxCisjZGVmaW5lIEtIUk9OT1NfU1VQUE9SVF9GTE9BVCAgIDEKKworI2VsaWYgZGVmaW5lZChfX3N1bl9fKSB8fCBkZWZpbmVkKF9fZGlnaXRhbF9fKQorCisvKgorICogU3VuIG9yIERpZ2l0YWwKKyAqLwordHlwZWRlZiBpbnQgICAgICAgICAgICAgICAgICAgICBraHJvbm9zX2ludDMyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludCAgICAgICAgICAgIGtocm9ub3NfdWludDMyX3Q7CisjaWYgZGVmaW5lZChfX2FyY2g2NF9fKSB8fCBkZWZpbmVkKF9MUDY0KQordHlwZWRlZiBsb25nIGludCAgICAgICAgICAgICAgICBraHJvbm9zX2ludDY0X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50ICAgICAgIGtocm9ub3NfdWludDY0X3Q7CisjZWxzZQordHlwZWRlZiBsb25nIGxvbmcgaW50ICAgICAgICAgICBraHJvbm9zX2ludDY0X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgIGtocm9ub3NfdWludDY0X3Q7CisjZW5kaWYgLyogX19hcmNoNjRfXyAqLworI2RlZmluZSBLSFJPTk9TX1NVUFBPUlRfSU5UNjQgICAxCisjZGVmaW5lIEtIUk9OT1NfU1VQUE9SVF9GTE9BVCAgIDEKKworI2VsaWYgMAorCisvKgorICogSHlwb3RoZXRpY2FsIHBsYXRmb3JtIHdpdGggbm8gZmxvYXQgb3IgaW50NjQgc3VwcG9ydAorICovCit0eXBlZGVmIGludCAgICAgICAgICAgICAgICAgICAgIGtocm9ub3NfaW50MzJfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgICAgICAgICAga2hyb25vc191aW50MzJfdDsKKyNkZWZpbmUgS0hST05PU19TVVBQT1JUX0lOVDY0ICAgMAorI2RlZmluZSBLSFJPTk9TX1NVUFBPUlRfRkxPQVQgICAwCisKKyNlbHNlCisKKy8qCisgKiBHZW5lcmljIGZhbGxiYWNrCisgKi8KKyNpbmNsdWRlIDxzdGRpbnQuaD4KK3R5cGVkZWYgaW50MzJfdCAgICAgICAgICAgICAgICAga2hyb25vc19pbnQzMl90OwordHlwZWRlZiB1aW50MzJfdCAgICAgICAgICAgICAgICBraHJvbm9zX3VpbnQzMl90OwordHlwZWRlZiBpbnQ2NF90ICAgICAgICAgICAgICAgICBraHJvbm9zX2ludDY0X3Q7Cit0eXBlZGVmIHVpbnQ2NF90ICAgICAgICAgICAgICAgIGtocm9ub3NfdWludDY0X3Q7CisjZGVmaW5lIEtIUk9OT1NfU1VQUE9SVF9JTlQ2NCAgIDEKKyNkZWZpbmUgS0hST05PU19TVVBQT1JUX0ZMT0FUICAgMQorCisjZW5kaWYKKworCisvKgorICogVHlwZXMgdGhhdCBhcmUgKHNvIGZhcikgdGhlIHNhbWUgb24gYWxsIHBsYXRmb3JtcworICovCit0eXBlZGVmIHNpZ25lZCAgIGNoYXIgICAgICAgICAga2hyb25vc19pbnQ4X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICAgICAgICAga2hyb25vc191aW50OF90OwordHlwZWRlZiBzaWduZWQgICBzaG9ydCBpbnQgICAgIGtocm9ub3NfaW50MTZfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50ICAgICBraHJvbm9zX3VpbnQxNl90OwordHlwZWRlZiBzaWduZWQgICBsb25nICBpbnQgICAgIGtocm9ub3NfaW50cHRyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgIGludCAgICAga2hyb25vc191aW50cHRyX3Q7Cit0eXBlZGVmIHNpZ25lZCAgIGxvbmcgIGludCAgICAga2hyb25vc19zc2l6ZV90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nICBpbnQgICAgIGtocm9ub3NfdXNpemVfdDsKKworI2lmIEtIUk9OT1NfU1VQUE9SVF9GTE9BVAorLyoKKyAqIEZsb2F0IHR5cGUKKyAqLwordHlwZWRlZiAgICAgICAgICBmbG9hdCAgICAgICAgIGtocm9ub3NfZmxvYXRfdDsKKyNlbmRpZgorCisjaWYgS0hST05PU19TVVBQT1JUX0lOVDY0CisvKiBUaW1lIHR5cGVzCisgKgorICogVGhlc2UgdHlwZXMgY2FuIGJlIHVzZWQgdG8gcmVwcmVzZW50IGEgdGltZSBpbnRlcnZhbCBpbiBuYW5vc2Vjb25kcyBvciAKKyAqIGFuIGFic29sdXRlIFVuYWRqdXN0ZWQgU3lzdGVtIFRpbWUuICBVbmFkanVzdGVkIFN5c3RlbSBUaW1lIGlzIHRoZSBudW1iZXIgCisgKiBvZiBuYW5vc2Vjb25kcyBzaW5jZSBzb21lIGFyYml0cmFyeSBzeXN0ZW0gZXZlbnQgKGUuZy4gc2luY2UgdGhlIGxhc3QgCisgKiB0aW1lIHRoZSBzeXN0ZW0gYm9vdGVkKS4gIFRoZSBVbmFkanVzdGVkIFN5c3RlbSBUaW1lIGlzIGFuIHVuc2lnbmVkIAorICogNjQgYml0IHZhbHVlIHRoYXQgd3JhcHMgYmFjayB0byAwIGV2ZXJ5IDU4NCB5ZWFycy4gIFRpbWUgaW50ZXJ2YWxzIAorICogbWF5IGJlIGVpdGhlciBzaWduZWQgb3IgdW5zaWduZWQuCisgKi8KK3R5cGVkZWYga2hyb25vc191aW50NjRfdCAgICAgICBraHJvbm9zX3V0aW1lX25hbm9zZWNvbmRzX3Q7Cit0eXBlZGVmIGtocm9ub3NfaW50NjRfdCAgICAgICAga2hyb25vc19zdGltZV9uYW5vc2Vjb25kc190OworI2VuZGlmCisKKworI2VuZGlmIC8qIF9fa2hycGxhdGZvcm1faF8gKi8KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvQW5kcm9pZC5tayBiL29wZW5nbC9saWJhZ2wvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWVmZTRjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2xpYmFnbC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzkgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCisjCisjIEJ1aWxkIHRoZSBzb2Z0d2FyZSBPcGVuR0wgRVMgbGlicmFyeQorIworCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gXAorCWVnbC5jcHAgICAgICAgICAgICAgICAgICAgICBcCisJc3RhdGUuY3BwCQkgICAgICAgICAgICBcCisJdGV4dHVyZS5jcHAJCSAgICAgICAgICAgIFwKKyAgICBUb2tlbml6ZXIuY3BwICAgICAgICAgICAgICAgXAorICAgIFRva2VuTWFuYWdlci5jcHAgICAgICAgICAgICBcCisgICAgVGV4dHVyZU9iamVjdE1hbmFnZXIuY3BwICAgIFwKKyAgICBCdWZmZXJPYmplY3RNYW5hZ2VyLmNwcCAgICAgXAorCWFycmF5LmNwcC5hcm0JCSAgICAgICAgXAorCWZwLmNwcC5hcm0JCSAgICAgICAgICAgIFwKKwlsaWdodC5jcHAuYXJtCQkgICAgICAgIFwKKwltYXRyaXguY3BwLmFybQkJICAgICAgICBcCisJbWlwbWFwLmNwcC5hcm0JCSAgICAgICAgXAorCXByaW1pdGl2ZXMuY3BwLmFybQkgICAgICAgIFwKKwl2ZXJ0ZXguY3BwLmFybQorCitpZmVxICgkKFRBUkdFVF9BUkNIKSxhcm0pCisJTE9DQUxfU1JDX0ZJTEVTICs9IGZpeGVkX2FzbS5TIGl0ZXJhdG9ycy5TCisJTE9DQUxfQ0ZMQUdTICs9IC1mc3RyaWN0LWFsaWFzaW5nCitlbmRpZgorCitpZm5lcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQorICAgICMgd2UgbmVlZCB0byBhY2Nlc3MgdGhlIHByaXZhdGUgQmlvbmljIGhlYWRlciA8YmlvbmljX3Rscy5oPgorICAgIExPQ0FMX0NGTEFHUyArPSAtSSQoTE9DQUxfUEFUSCkvLi4vLi4vLi4vLi4vYmlvbmljL2xpYmMvcHJpdmF0ZQorZW5kaWYKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdXRpbHMgbGlidXRpbHMgbGlicGl4ZWxmbGluZ2VyCitMT0NBTF9MRExJQlMgOj0gLWxwdGhyZWFkIC1sZGwKK0xPQ0FMX01PRFVMRTo9IGxpYmFnbAorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL0J1ZmZlck9iamVjdE1hbmFnZXIuY3BwIGIvb3BlbmdsL2xpYmFnbC9CdWZmZXJPYmplY3RNYW5hZ2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmYyOGVlCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2xpYmFnbC9CdWZmZXJPYmplY3RNYW5hZ2VyLmNwcApAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoqCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorICoqCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyAqKgorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8dXRpbHMvQXRvbWljLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisKKyNpbmNsdWRlICJCdWZmZXJPYmplY3RNYW5hZ2VyLmgiCisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyBuYW1lc3BhY2UgZ2w7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRUdMQnVmZmVyT2JqZWN0TWFuYWdlcjo6RUdMQnVmZmVyT2JqZWN0TWFuYWdlcigpIAorOiBUb2tlbk1hbmFnZXIoKSwgbUNvdW50KDApCit7Cit9CisKK0VHTEJ1ZmZlck9iamVjdE1hbmFnZXI6On5FR0xCdWZmZXJPYmplY3RNYW5hZ2VyKCkKK3sKKyAgICAvLyBkZXN0cm95IGFsbCB0aGUgYnVmZmVyIG9iamVjdHMgYW5kIHRoZWlyIHN0b3JhZ2UKKyAgICBHTHNpemVpIG4gPSBtQnVmZmVycy5zaXplKCk7CisgICAgZm9yIChHTHNpemVpIGk9MCA7IGk8biA7IGkrKykgeworICAgICAgICBidWZmZXJfdCogYm8gPSBtQnVmZmVycy52YWx1ZUF0KGkpOworICAgICAgICBmcmVlKGJvLT5kYXRhKTsKKyAgICAgICAgZGVsZXRlIGJvOworICAgIH0KK30KKworYnVmZmVyX3QgY29uc3QqIEVHTEJ1ZmZlck9iamVjdE1hbmFnZXI6OmJpbmQoR0x1aW50IGJ1ZmZlcikKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGludDMyX3QgaSA9IG1CdWZmZXJzLmluZGV4T2ZLZXkoYnVmZmVyKTsKKyAgICBpZiAoaSA+PSAwKSB7CisgICAgICAgIHJldHVybiBtQnVmZmVycy52YWx1ZUF0KGkpOworICAgIH0KKyAgICBidWZmZXJfdCogYm8gPSBuZXcgYnVmZmVyX3Q7CisgICAgYm8tPmRhdGEgPSAwOworICAgIGJvLT51c2FnZSA9IEdMX1NUQVRJQ19EUkFXOworICAgIGJvLT5zaXplID0gMDsKKyAgICBiby0+bmFtZSA9IGJ1ZmZlcjsKKyAgICBtQnVmZmVycy5hZGQoYnVmZmVyLCBibyk7CisgICAgcmV0dXJuIGJvOworfQorCitpbnQgRUdMQnVmZmVyT2JqZWN0TWFuYWdlcjo6YWxsb2NhdGVTdG9yZShidWZmZXJfdCogYm8sCisgICAgICAgIEdMc2l6ZWlwdHIgc2l6ZSwgR0xlbnVtIHVzYWdlKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKHNpemUgIT0gYm8tPnNpemUpIHsKKyAgICAgICB1aW50OF90KiBkYXRhID0gKHVpbnQ4X3QqKW1hbGxvYyhzaXplKTsKKyAgICAgICAgaWYgKGRhdGEgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgZnJlZShiby0+ZGF0YSk7CisgICAgICAgIGJvLT5kYXRhID0gZGF0YTsKKyAgICAgICAgYm8tPnNpemUgPSBzaXplOworICAgIH0KKyAgICBiby0+dXNhZ2UgPSB1c2FnZTsKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBFR0xCdWZmZXJPYmplY3RNYW5hZ2VyOjpkZWxldGVCdWZmZXJzKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiBidWZmZXJzKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgd2hpbGUgKG4tLSkgeworICAgICAgICBjb25zdCBHTHVpbnQgdCA9ICpidWZmZXJzKys7CisgICAgICAgIGlmICh0KSB7CisgICAgICAgICAgICBpbnQzMl90IGluZGV4ID0gbUJ1ZmZlcnMuaW5kZXhPZktleSh0KTsKKyAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyX3QqIGJvID0gbUJ1ZmZlcnMudmFsdWVBdChpbmRleCk7CisgICAgICAgICAgICAgICAgZnJlZShiby0+ZGF0YSk7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnMucmVtb3ZlSXRlbXNBdChpbmRleCk7CisgICAgICAgICAgICAgICAgZGVsZXRlIGJvOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYmFnbC9CdWZmZXJPYmplY3RNYW5hZ2VyLmggYi9vcGVuZ2wvbGliYWdsL0J1ZmZlck9iamVjdE1hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTkzNDBhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2xpYmFnbC9CdWZmZXJPYmplY3RNYW5hZ2VyLmgKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqKgorICoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKioKKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisgKioKKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorICoqCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfT1BFTkdMRVNfQlVGRkVSX09CSkVDVF9NQU5BR0VSX0gKKyNkZWZpbmUgQU5EUk9JRF9PUEVOR0xFU19CVUZGRVJfT0JKRUNUX01BTkFHRVJfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDx1dGlscy9BdG9taWMuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKworI2luY2x1ZGUgIlRva2VuaXplci5oIgorI2luY2x1ZGUgIlRva2VuTWFuYWdlci5oIgorCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCituYW1lc3BhY2UgZ2wgeworCitzdHJ1Y3QgYnVmZmVyX3QgeworICAgIEdMc2l6ZWlwdHIgICAgICBzaXplOworICAgIEdMZW51bSAgICAgICAgICB1c2FnZTsKKyAgICB1aW50OF90KiAgICAgICAgZGF0YTsKKyAgICB1aW50MzJfdCAgICAgICAgbmFtZTsKK307CisKK307CisKK2NsYXNzIEVHTEJ1ZmZlck9iamVjdE1hbmFnZXIgOiBwdWJsaWMgVG9rZW5NYW5hZ2VyCit7CitwdWJsaWM6CisgICAgRUdMQnVmZmVyT2JqZWN0TWFuYWdlcigpOworICAgIH5FR0xCdWZmZXJPYmplY3RNYW5hZ2VyKCk7CisKKyAgICAvLyBwcm90b2NvbCBmb3Igc3A8PgorICAgIGlubGluZSAgdm9pZCAgICBpbmNTdHJvbmcoY29uc3Qgdm9pZCogaWQpIGNvbnN0OworICAgIGlubGluZSAgdm9pZCAgICBkZWNTdHJvbmcoY29uc3Qgdm9pZCogaWQpIGNvbnN0OworICAgIHR5cGVkZWYgdm9pZCAgICB3ZWFrcmVmX3R5cGU7CisKKyAgICBnbDo6YnVmZmVyX3QgY29uc3QqIGJpbmQoR0x1aW50IGJ1ZmZlcik7CisgICAgaW50ICAgICAgICAgICAgICAgICBhbGxvY2F0ZVN0b3JlKGdsOjpidWZmZXJfdCogYm8sIEdMc2l6ZWlwdHIgc2l6ZSwgR0xlbnVtIHVzYWdlKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIGRlbGV0ZUJ1ZmZlcnMoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIGJ1ZmZlcnMpOworCitwcml2YXRlOgorICAgIG11dGFibGUgdm9sYXRpbGUgaW50MzJfdCAgICAgICAgICAgIG1Db3VudDsKKyAgICBtdXRhYmxlIE11dGV4ICAgICAgICAgICAgICAgICAgICAgICBtTG9jazsKKyAgICBLZXllZFZlY3RvcjxHTHVpbnQsIGdsOjpidWZmZXJfdCo+ICBtQnVmZmVyczsKK307CisKK3ZvaWQgRUdMQnVmZmVyT2JqZWN0TWFuYWdlcjo6aW5jU3Ryb25nKGNvbnN0IHZvaWQqIGlkKSBjb25zdCB7CisgICAgYW5kcm9pZF9hdG9taWNfaW5jKCZtQ291bnQpOworfQordm9pZCBFR0xCdWZmZXJPYmplY3RNYW5hZ2VyOjpkZWNTdHJvbmcoY29uc3Qgdm9pZCogaWQpIGNvbnN0IHsKKyAgICBpZiAoYW5kcm9pZF9hdG9taWNfZGVjKCZtQ291bnQpID09IDEpIHsKKyAgICAgICAgZGVsZXRlIHRoaXM7CisgICAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9PUEVOR0xFU19CVUZGRVJfT0JKRUNUX01BTkFHRVJfSAorCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL1RleHR1cmVPYmplY3RNYW5hZ2VyLmNwcCBiL29wZW5nbC9saWJhZ2wvVGV4dHVyZU9iamVjdE1hbmFnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMzE4NTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvbGliYWdsL1RleHR1cmVPYmplY3RNYW5hZ2VyLmNwcApAQCAtMCwwICsxLDMwOSBAQAorLyoKKyAqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoqCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorICoqCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyAqKgorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAiY29udGV4dC5oIgorI2luY2x1ZGUgIlRleHR1cmVPYmplY3RNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRUdMVGV4dHVyZU9iamVjdDo6RUdMVGV4dHVyZU9iamVjdCgpCisgICAgOiBtQ291bnQoMCksIG1TaXplKDApCit7CisgICAgaW5pdCgpOworfQorCitFR0xUZXh0dXJlT2JqZWN0Ojp+RUdMVGV4dHVyZU9iamVjdCgpCit7CisgICAgaWYgKCFkaXJlY3QpIHsKKyAgICAgICAgaWYgKG1TaXplICYmIHN1cmZhY2UuZGF0YSkKKyAgICAgICAgICAgIGZyZWUoc3VyZmFjZS5kYXRhKTsKKyAgICAgICAgaWYgKG1NaXBtYXBzKQorICAgICAgICAgICAgZnJlZU1pcG1hcHMoKTsKKyAgICB9Cit9CisKK3ZvaWQgRUdMVGV4dHVyZU9iamVjdDo6aW5pdCgpCit7CisgICAgbWVtc2V0KCZzdXJmYWNlLCAwLCBzaXplb2Yoc3VyZmFjZSkpOworICAgIHN1cmZhY2UudmVyc2lvbiA9IHNpemVvZihzdXJmYWNlKTsKKyAgICBtTWlwbWFwcyA9IDA7CisgICAgbU51bUV4dHJhTG9kID0gMDsKKyAgICBtSXNDb21wbGV0ZSA9IGZhbHNlOworICAgIHdyYXBzID0gR0xfUkVQRUFUOworICAgIHdyYXB0ID0gR0xfUkVQRUFUOworICAgIG1pbl9maWx0ZXIgPSBHTF9MSU5FQVI7CisgICAgbWFnX2ZpbHRlciA9IEdMX0xJTkVBUjsKKyAgICBpbnRlcm5hbGZvcm1hdCA9IDA7CisgICAgbWVtc2V0KGNyb3BfcmVjdCwgMCwgc2l6ZW9mKGNyb3BfcmVjdCkpOworICAgIGdlbmVyYXRlX21pcG1hcCA9IEdMX0ZBTFNFOworICAgIGRpcmVjdCA9IEdMX0ZBTFNFOworfQorCit2b2lkIEVHTFRleHR1cmVPYmplY3Q6OmNvcHlQYXJhbWV0ZXJzKGNvbnN0IHNwPEVHTFRleHR1cmVPYmplY3Q+JiBvbGQpCit7CisgICAgd3JhcHMgPSBvbGQtPndyYXBzOworICAgIHdyYXB0ID0gb2xkLT53cmFwdDsKKyAgICBtaW5fZmlsdGVyID0gb2xkLT5taW5fZmlsdGVyOworICAgIG1hZ19maWx0ZXIgPSBvbGQtPm1hZ19maWx0ZXI7CisgICAgbWVtY3B5KGNyb3BfcmVjdCwgb2xkLT5jcm9wX3JlY3QsIHNpemVvZihjcm9wX3JlY3QpKTsKKyAgICBnZW5lcmF0ZV9taXBtYXAgPSBvbGQtPmdlbmVyYXRlX21pcG1hcDsKKyAgICBkaXJlY3QgPSBvbGQtPmRpcmVjdDsKK30KKworc3RhdHVzX3QgRUdMVGV4dHVyZU9iamVjdDo6YWxsb2NhdGVNaXBtYXBzKCkKK3sKKyAgICAvLyBoZXJlLCBieSBjb25zdHJ1Y3Rpb24sIG1NaXBtYXBzPTAgJiYgbU51bUV4dHJhTG9kPTAKKworICAgIGlmICghc3VyZmFjZS5kYXRhKQorICAgICAgICByZXR1cm4gTk9fSU5JVDsKKworICAgIGludCB3ID0gc3VyZmFjZS53aWR0aDsKKyAgICBpbnQgaCA9IHN1cmZhY2UuaGVpZ2h0OworICAgIGNvbnN0IGludCBudW1Mb2RzID0gMzEgLSBnZ2xDbHoobWF4KHcsaCkpOworICAgIGlmIChudW1Mb2RzIDw9IDApCisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKworICAgIG1NaXBtYXBzID0gKEdHTFN1cmZhY2UqKW1hbGxvYyhudW1Mb2RzICogc2l6ZW9mKEdHTFN1cmZhY2UpKTsKKyAgICBpZiAoIW1NaXBtYXBzKQorICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworCisgICAgbWVtc2V0KG1NaXBtYXBzLCAwLCBudW1Mb2RzICogc2l6ZW9mKEdHTFN1cmZhY2UpKTsKKyAgICBtTnVtRXh0cmFMb2QgPSBudW1Mb2RzOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBFR0xUZXh0dXJlT2JqZWN0OjpmcmVlTWlwbWFwcygpCit7CisgICAgaWYgKG1NaXBtYXBzKSB7CisgICAgICAgIGZvciAoaW50IGk9MCA7IGk8bU51bUV4dHJhTG9kIDsgaSsrKSB7CisgICAgICAgICAgICBpZiAobU1pcG1hcHNbaV0uZGF0YSkgeworICAgICAgICAgICAgICAgIGZyZWUobU1pcG1hcHNbaV0uZGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZnJlZShtTWlwbWFwcyk7CisgICAgICAgIG1NaXBtYXBzID0gMDsKKyAgICAgICAgbU51bUV4dHJhTG9kID0gMDsKKyAgICB9Cit9CisKK2NvbnN0IEdHTFN1cmZhY2UmIEVHTFRleHR1cmVPYmplY3Q6Om1pcChpbnQgbG9kKSBjb25zdAoreworICAgIGlmIChsb2Q8PTAgfHwgIW1NaXBtYXBzKQorICAgICAgICByZXR1cm4gc3VyZmFjZTsKKyAgICBsb2QgPSBtaW4obG9kLTEsIG1OdW1FeHRyYUxvZC0xKTsKKyAgICByZXR1cm4gbU1pcG1hcHNbbG9kXTsKK30KKworR0dMU3VyZmFjZSYgRUdMVGV4dHVyZU9iamVjdDo6ZWRpdE1pcChpbnQgbG9kKQoreworICAgIHJldHVybiBjb25zdF9jYXN0PEdHTFN1cmZhY2UmPihtaXAobG9kKSk7Cit9CisKK3N0YXR1c190IEVHTFRleHR1cmVPYmplY3Q6OnNldFN1cmZhY2UoR0dMU3VyZmFjZSBjb25zdCogcykKK3sKKyAgICAvLyBYWFg6IGdsRmx1c2goKSBvbiAncycKKyAgICBpZiAobVNpemUgJiYgc3VyZmFjZS5kYXRhKSB7CisgICAgICAgIGZyZWUoc3VyZmFjZS5kYXRhKTsKKyAgICB9CisgICAgc3VyZmFjZSA9ICpzOworICAgIGludGVybmFsZm9ybWF0ID0gMDsKKworICAgIC8vIHdlIHNob3VsZCBrZWVwIHRoZSBjcm9wX3JlY3QsIGJ1dCBpdCdzIGRlbGljYXRlIGJlY2F1c2UKKyAgICAvLyB0aGUgbmV3IHNpemUgb2YgdGhlIHN1cmZhY2UgY291bGQgbWFrZSBpdCBpbnZhbGlkLgorICAgIC8vIHNvIGZvciBub3csIHdlIGp1c3QgbG9vc2UgaXQuCisgICAgbWVtc2V0KGNyb3BfcmVjdCwgMCwgc2l6ZW9mKGNyb3BfcmVjdCkpOworCisgICAgLy8gaXQgd291bGQgYmUgbmljZSBpZiB3ZSBjb3VsZCBrZWVwIHRoZSBnZW5lcmF0ZV9taXBtYXAgZmxhZywKKyAgICAvLyB3ZSB3b3VsZCBoYXZlIHRvIGdlbmVyYXRlIHRoZW0gcmlnaHQgbm93IHRob3VnaC4KKyAgICBnZW5lcmF0ZV9taXBtYXAgPSBHTF9GQUxTRTsKKworICAgIGRpcmVjdCA9IEdMX1RSVUU7CisgICAgbVNpemUgPSAwOyAgLy8gd2UgZG9uJ3Qgb3duIHRoaXMgc3VyZmFjZQorICAgIGlmIChtTWlwbWFwcykKKyAgICAgICAgZnJlZU1pcG1hcHMoKTsKKyAgICBtSXNDb21wbGV0ZSA9IHRydWU7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBFR0xUZXh0dXJlT2JqZWN0OjpyZWFsbG9jYXRlKAorICAgICAgICBHTGludCBsZXZlbCwgaW50IHcsIGludCBoLCBpbnQgcywKKyAgICAgICAgaW50IGZvcm1hdCwgaW50IGNvbXByZXNzZWRGb3JtYXQsIGludCBicHIpCit7CisgICAgY29uc3Qgc2l6ZV90IHNpemUgPSBoICogYnByOworICAgIGlmIChsZXZlbCA9PSAwKSAKKyAgICB7CisgICAgICAgIGlmIChzaXplIT1tU2l6ZSB8fCAhc3VyZmFjZS5kYXRhKSB7CisgICAgICAgICAgICBpZiAobVNpemUgJiYgc3VyZmFjZS5kYXRhKSB7CisgICAgICAgICAgICAgICAgZnJlZShzdXJmYWNlLmRhdGEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3VyZmFjZS5kYXRhID0gKEdHTHVieXRlKiltYWxsb2Moc2l6ZSk7CisgICAgICAgICAgICBpZiAoIXN1cmZhY2UuZGF0YSkgeworICAgICAgICAgICAgICAgIG1TaXplID0gMDsKKyAgICAgICAgICAgICAgICBtSXNDb21wbGV0ZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtU2l6ZSA9IHNpemU7CisgICAgICAgIH0KKyAgICAgICAgc3VyZmFjZS52ZXJzaW9uID0gc2l6ZW9mKEdHTFN1cmZhY2UpOworICAgICAgICBzdXJmYWNlLndpZHRoICA9IHc7CisgICAgICAgIHN1cmZhY2UuaGVpZ2h0ID0gaDsKKyAgICAgICAgc3VyZmFjZS5zdHJpZGUgPSBzOworICAgICAgICBzdXJmYWNlLmZvcm1hdCA9IGZvcm1hdDsKKyAgICAgICAgc3VyZmFjZS5jb21wcmVzc2VkRm9ybWF0ID0gY29tcHJlc3NlZEZvcm1hdDsKKyAgICAgICAgaWYgKG1NaXBtYXBzKQorICAgICAgICAgICAgZnJlZU1pcG1hcHMoKTsKKyAgICAgICAgbUlzQ29tcGxldGUgPSB0cnVlOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoIW1NaXBtYXBzKSB7CisgICAgICAgICAgICBpZiAoYWxsb2NhdGVNaXBtYXBzKCkgIT0gTk9fRVJST1IpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgfQorCisgICAgICAgIExPR1dfSUYobGV2ZWwtMSA+PSBtTnVtRXh0cmFMb2QsIAorICAgICAgICAgICAgICAgICJzcGVjaWZ5aW5nIG1pcG1hcCBsZXZlbCAlZCwgYnV0ICMgb2YgbGV2ZWwgaXMgJWQiLAorICAgICAgICAgICAgICAgIGxldmVsLCBtTnVtRXh0cmFMb2QrMSk7ICAgICAgICAKKworICAgICAgICBHR0xTdXJmYWNlJiBtaXBtYXAgPSBlZGl0TWlwKGxldmVsKTsKKyAgICAgICAgaWYgKG1pcG1hcC5kYXRhKQorICAgICAgICAgICAgZnJlZShtaXBtYXAuZGF0YSk7CisKKyAgICAgICAgbWlwbWFwLmRhdGEgPSAoR0dMdWJ5dGUqKW1hbGxvYyhzaXplKTsKKyAgICAgICAgaWYgKCFtaXBtYXAuZGF0YSkgeworICAgICAgICAgICAgbWVtc2V0KCZtaXBtYXAsIDAsIHNpemVvZihHR0xTdXJmYWNlKSk7CisgICAgICAgICAgICBtSXNDb21wbGV0ZSA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgfQorCisgICAgICAgIG1pcG1hcC52ZXJzaW9uID0gc2l6ZW9mKEdHTFN1cmZhY2UpOworICAgICAgICBtaXBtYXAud2lkdGggID0gdzsKKyAgICAgICAgbWlwbWFwLmhlaWdodCA9IGg7CisgICAgICAgIG1pcG1hcC5zdHJpZGUgPSBzOworICAgICAgICBtaXBtYXAuZm9ybWF0ID0gZm9ybWF0OworICAgICAgICBtaXBtYXAuY29tcHJlc3NlZEZvcm1hdCA9IGNvbXByZXNzZWRGb3JtYXQ7CisKKyAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHRleHR1cmUgaXMgY29tcGxldGUKKyAgICAgICAgbUlzQ29tcGxldGUgPSB0cnVlOworICAgICAgICBjb25zdCBHR0xTdXJmYWNlKiBwcmV2ID0gJnN1cmZhY2U7CisgICAgICAgIGZvciAoaW50IGk9MCA7IGk8bU51bUV4dHJhTG9kIDsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBHR0xTdXJmYWNlKiBjdXJyID0gbU1pcG1hcHMgKyBpOworICAgICAgICAgICAgaWYgKGN1cnItPmZvcm1hdCAhPSBzdXJmYWNlLmZvcm1hdCkgeworICAgICAgICAgICAgICAgIG1Jc0NvbXBsZXRlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVpbnQzMl90IHcgPSAocHJldi0+d2lkdGggID4+IDEpID8gOiAxOworICAgICAgICAgICAgdWludDMyX3QgaCA9IChwcmV2LT5oZWlnaHQgPj4gMSkgPyA6IDE7CisgICAgICAgICAgICBpZiAodyAhPSBjdXJyLT53aWR0aCB8fCBoICE9IGN1cnItPmhlaWdodCkgeworICAgICAgICAgICAgICAgIG1Jc0NvbXBsZXRlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmV2ID0gY3VycjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRUdMU3VyZmFjZU1hbmFnZXI6OkVHTFN1cmZhY2VNYW5hZ2VyKCkKKyAgICA6IFRva2VuTWFuYWdlcigpLCBtQ291bnQoMCkKK3sKK30KKworRUdMU3VyZmFjZU1hbmFnZXI6On5FR0xTdXJmYWNlTWFuYWdlcigpCit7CisgICAgLy8gZXZlcnl0aGluZyBnZXRzIGZyZWVkIGF1dG9tYXRpY2FsbHkgaGVyZS4uLgorfQorCitzcDxFR0xUZXh0dXJlT2JqZWN0PiBFR0xTdXJmYWNlTWFuYWdlcjo6Y3JlYXRlVGV4dHVyZShHTHVpbnQgbmFtZSkKK3sKKyAgICBzcDxFR0xUZXh0dXJlT2JqZWN0PiByZXN1bHQ7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtVGV4dHVyZXMuaW5kZXhPZktleShuYW1lKSA+PSAwKQorICAgICAgICByZXR1cm4gcmVzdWx0OyAvLyBhbHJlYWR5IGV4aXN0cyEKKworICAgIHJlc3VsdCA9IG5ldyBFR0xUZXh0dXJlT2JqZWN0KCk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBtVGV4dHVyZXMuYWRkKG5hbWUsIHJlc3VsdCk7CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIHJlc3VsdC5jbGVhcigpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3A8RUdMVGV4dHVyZU9iamVjdD4gRUdMU3VyZmFjZU1hbmFnZXI6OnJlbW92ZVRleHR1cmUoR0x1aW50IG5hbWUpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBjb25zdCBzc2l6ZV90IGluZGV4ID0gbVRleHR1cmVzLmluZGV4T2ZLZXkobmFtZSk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgc3A8RUdMVGV4dHVyZU9iamVjdD4gcmVzdWx0KG1UZXh0dXJlcy52YWx1ZUF0KGluZGV4KSk7CisgICAgICAgIG1UZXh0dXJlcy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3NwPEVHTFRleHR1cmVPYmplY3Q+IEVHTFN1cmZhY2VNYW5hZ2VyOjpyZXBsYWNlVGV4dHVyZShHTHVpbnQgbmFtZSkKK3sKKyAgICBzcDxFR0xUZXh0dXJlT2JqZWN0PiB0ZXg7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBjb25zdCBzc2l6ZV90IGluZGV4ID0gbVRleHR1cmVzLmluZGV4T2ZLZXkobmFtZSk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgY29uc3Qgc3A8RUdMVGV4dHVyZU9iamVjdD4mIG9sZCA9IG1UZXh0dXJlcy52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgY29uc3QgdWludDMyX3QgcmVmcyA9IG9sZC0+Z2V0U3Ryb25nQ291bnQoKTsKKyAgICAgICAgaWYgKGdnbF9saWtlbHkocmVmcyA9PSAxKSkgeworICAgICAgICAgICAgLy8gd2UncmUgdGhlIG9ubHkgb3duZXIKKyAgICAgICAgICAgIHRleCA9IG9sZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGtlZXAgdGhlIHRleHR1cmUncyBwYXJhbWV0ZXJzCisgICAgICAgICAgICB0ZXggPSBuZXcgRUdMVGV4dHVyZU9iamVjdCgpOworICAgICAgICAgICAgdGV4LT5jb3B5UGFyYW1ldGVycyhvbGQpOworICAgICAgICAgICAgbVRleHR1cmVzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOworICAgICAgICAgICAgbVRleHR1cmVzLmFkZChuYW1lLCB0ZXgpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0ZXg7Cit9CisKK3ZvaWQgRUdMU3VyZmFjZU1hbmFnZXI6OmRlbGV0ZVRleHR1cmVzKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICp0b2tlbnMpCit7CisgICAgLy8gZnJlZSBhbGwgdGV4dHVyZXMKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGZvciAoR0xzaXplaSBpPTAgOyBpPG4gOyBpKyspIHsKKyAgICAgICAgY29uc3QgR0x1aW50IHQoKnRva2VucysrKTsKKyAgICAgICAgaWYgKHQpIHsKKyAgICAgICAgICAgIG1UZXh0dXJlcy5yZW1vdmVJdGVtKHQpOworICAgICAgICB9CisgICAgfQorfQorCitzcDxFR0xUZXh0dXJlT2JqZWN0PiBFR0xTdXJmYWNlTWFuYWdlcjo6dGV4dHVyZShHTHVpbnQgbmFtZSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGNvbnN0IHNzaXplX3QgaW5kZXggPSBtVGV4dHVyZXMuaW5kZXhPZktleShuYW1lKTsKKyAgICBpZiAoaW5kZXggPj0gMCkKKyAgICAgICAgcmV0dXJuIG1UZXh0dXJlcy52YWx1ZUF0KGluZGV4KTsKKyAgICByZXR1cm4gMDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvVGV4dHVyZU9iamVjdE1hbmFnZXIuaCBiL29wZW5nbC9saWJhZ2wvVGV4dHVyZU9iamVjdE1hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGVkMWE0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2xpYmFnbC9UZXh0dXJlT2JqZWN0TWFuYWdlci5oCkBAIC0wLDAgKzEsMTQwIEBACisvKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2lmbmRlZiBBTkRST0lEX09QRU5HTEVTX1NVUkZBQ0VfSAorI2RlZmluZSBBTkRST0lEX09QRU5HTEVTX1NVUkZBQ0VfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDx1dGlscy9BdG9taWMuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKKyNpbmNsdWRlIDxwcml2YXRlL3BpeGVsZmxpbmdlci9nZ2xfY29udGV4dC5oPgorCisjaW5jbHVkZSA8R0xFUy9nbC5oPgorCisjaW5jbHVkZSAiVG9rZW5pemVyLmgiCisjaW5jbHVkZSAiVG9rZW5NYW5hZ2VyLmgiCisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIEVHTFRleHR1cmVPYmplY3QKK3sKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgRUdMVGV4dHVyZU9iamVjdCgpOworICAgICAgICAgICAgICAgICAgIH5FR0xUZXh0dXJlT2JqZWN0KCk7CisKKyAgICAvLyBwcm90b2NvbCBmb3Igc3A8PgorICAgIGlubGluZSAgdm9pZCAgICAgICAgaW5jU3Ryb25nKGNvbnN0IHZvaWQqIGlkKSBjb25zdDsKKyAgICBpbmxpbmUgIHZvaWQgICAgICAgIGRlY1N0cm9uZyhjb25zdCB2b2lkKiBpZCkgY29uc3Q7CisgICAgaW5saW5lICB1aW50MzJfdCAgICBnZXRTdHJvbmdDb3VudCgpIGNvbnN0OworCisgICAgc3RhdHVzX3QgICAgICAgICAgICBzZXRTdXJmYWNlKEdHTFN1cmZhY2UgY29uc3QqIHMpOworICAgIHN0YXR1c190ICAgICAgICAgICAgcmVhbGxvY2F0ZShHTGludCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGludCBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQsIGludCBjb21wcmVzc2VkRm9ybWF0LCBpbnQgYnByKTsKKyAgICBpbmxpbmUgIHNpemVfdCAgICAgIHNpemUoKSBjb25zdDsKKyAgICBjb25zdCBHR0xTdXJmYWNlJiAgIG1pcChpbnQgbG9kKSBjb25zdDsKKyAgICBHR0xTdXJmYWNlJiAgICAgICAgIGVkaXRNaXAoaW50IGxvZCk7CisgICAgYm9vbCAgICAgICAgICAgICAgICBoYXNNaXBtYXBzKCkgY29uc3QgeyByZXR1cm4gbU1pcG1hcHMhPTA7IH0KKyAgICBib29sICAgICAgICAgICAgICAgIGlzQ29tcGxldGUoKSBjb25zdCB7IHJldHVybiBtSXNDb21wbGV0ZTsgfQorICAgIHZvaWQgICAgICAgICAgICAgICAgY29weVBhcmFtZXRlcnMoY29uc3Qgc3A8RUdMVGV4dHVyZU9iamVjdD4mIG9sZCk7CisKK3ByaXZhdGU6CisgICAgICAgIHN0YXR1c190ICAgICAgICBhbGxvY2F0ZU1pcG1hcHMoKTsKKyAgICAgICAgICAgIHZvaWQgICAgICAgIGZyZWVNaXBtYXBzKCk7CisgICAgICAgICAgICB2b2lkICAgICAgICBpbml0KCk7CisgICAgbXV0YWJsZSBpbnQzMl90ICAgICBtQ291bnQ7CisgICAgc2l6ZV90ICAgICAgICAgICAgICBtU2l6ZTsKKyAgICBHR0xTdXJmYWNlICAgICAgICAgICptTWlwbWFwczsKKyAgICBpbnQgICAgICAgICAgICAgICAgIG1OdW1FeHRyYUxvZDsKKyAgICBib29sICAgICAgICAgICAgICAgIG1Jc0NvbXBsZXRlOworCitwdWJsaWM6CisgICAgR0dMU3VyZmFjZSAgICAgICAgICBzdXJmYWNlOworICAgIEdMZW51bSAgICAgICAgICAgICAgd3JhcHM7CisgICAgR0xlbnVtICAgICAgICAgICAgICB3cmFwdDsKKyAgICBHTGVudW0gICAgICAgICAgICAgIG1pbl9maWx0ZXI7CisgICAgR0xlbnVtICAgICAgICAgICAgICBtYWdfZmlsdGVyOworICAgIEdMZW51bSAgICAgICAgICAgICAgaW50ZXJuYWxmb3JtYXQ7CisgICAgR0xpbnQgICAgICAgICAgICAgICBjcm9wX3JlY3RbNF07CisgICAgR0xpbnQgICAgICAgICAgICAgICBnZW5lcmF0ZV9taXBtYXA7CisgICAgR0xpbnQgICAgICAgICAgICAgICBkaXJlY3Q7Cit9OworCit2b2lkIEVHTFRleHR1cmVPYmplY3Q6OmluY1N0cm9uZyhjb25zdCB2b2lkKiBpZCkgY29uc3QgeworICAgIGFuZHJvaWRfYXRvbWljX2luYygmbUNvdW50KTsKK30KK3ZvaWQgRUdMVGV4dHVyZU9iamVjdDo6ZGVjU3Ryb25nKGNvbnN0IHZvaWQqIGlkKSBjb25zdCB7CisgICAgaWYgKGFuZHJvaWRfYXRvbWljX2RlYygmbUNvdW50KSA9PSAxKSB7CisgICAgICAgIGRlbGV0ZSB0aGlzOworICAgIH0KK30KK3VpbnQzMl90IEVHTFRleHR1cmVPYmplY3Q6OmdldFN0cm9uZ0NvdW50KCkgY29uc3QgeworICAgIHJldHVybiBtQ291bnQ7Cit9CitzaXplX3QgRUdMVGV4dHVyZU9iamVjdDo6c2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVNpemU7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgRUdMU3VyZmFjZU1hbmFnZXIgOiBwdWJsaWMgVG9rZW5NYW5hZ2VyCit7CitwdWJsaWM6CisgICAgICAgICAgICAgICAgRUdMU3VyZmFjZU1hbmFnZXIoKTsKKyAgICAgICAgICAgICAgICB+RUdMU3VyZmFjZU1hbmFnZXIoKTsKKworICAgIC8vIHByb3RvY29sIGZvciBzcDw+CisgICAgaW5saW5lICB2b2lkICAgIGluY1N0cm9uZyhjb25zdCB2b2lkKiBpZCkgY29uc3Q7CisgICAgaW5saW5lICB2b2lkICAgIGRlY1N0cm9uZyhjb25zdCB2b2lkKiBpZCkgY29uc3Q7CisgICAgdHlwZWRlZiB2b2lkICAgIHdlYWtyZWZfdHlwZTsKKworICAgIHNwPEVHTFRleHR1cmVPYmplY3Q+ICAgIGNyZWF0ZVRleHR1cmUoR0x1aW50IG5hbWUpOworICAgIHNwPEVHTFRleHR1cmVPYmplY3Q+ICAgIHJlbW92ZVRleHR1cmUoR0x1aW50IG5hbWUpOworICAgIHNwPEVHTFRleHR1cmVPYmplY3Q+ICAgIHJlcGxhY2VUZXh0dXJlKEdMdWludCBuYW1lKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICBkZWxldGVUZXh0dXJlcyhHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqdG9rZW5zKTsKKyAgICBzcDxFR0xUZXh0dXJlT2JqZWN0PiAgICB0ZXh0dXJlKEdMdWludCBuYW1lKTsKKworcHJpdmF0ZToKKyAgICBtdXRhYmxlIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db3VudDsKKyAgICBtdXRhYmxlIE11dGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrOworICAgIEtleWVkVmVjdG9yPCBHTHVpbnQsIHNwPEVHTFRleHR1cmVPYmplY3Q+ID4gbVRleHR1cmVzOworfTsKKwordm9pZCBFR0xTdXJmYWNlTWFuYWdlcjo6aW5jU3Ryb25nKGNvbnN0IHZvaWQqIGlkKSBjb25zdCB7CisgICAgYW5kcm9pZF9hdG9taWNfaW5jKCZtQ291bnQpOworfQordm9pZCBFR0xTdXJmYWNlTWFuYWdlcjo6ZGVjU3Ryb25nKGNvbnN0IHZvaWQqIGlkKSBjb25zdCB7CisgICAgaWYgKGFuZHJvaWRfYXRvbWljX2RlYygmbUNvdW50KSA9PSAxKSB7CisgICAgICAgIGRlbGV0ZSB0aGlzOworICAgIH0KK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9PUEVOR0xFU19TVVJGQUNFX0gKKwpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYmFnbC9Ub2tlbk1hbmFnZXIuY3BwIGIvb3BlbmdsL2xpYmFnbC9Ub2tlbk1hbmFnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYTYwMjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvbGliYWdsL1Rva2VuTWFuYWdlci5jcHAKQEAgLTAsMCArMSw2MiBAQAorLyogbGlicy9vcGVuZ2xlcy9zdXJmYWNlLmNwcAorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgIlRva2VuTWFuYWdlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1Rva2VuTWFuYWdlcjo6VG9rZW5NYW5hZ2VyKCkKK3sKKyAgICAvLyB0b2tlbiAwIGlzIGFsd2F5cyByZXNlcnZlZAorICAgIG1Ub2tlbml6ZXIucmVzZXJ2ZSgwKTsKK30KKworVG9rZW5NYW5hZ2VyOjp+VG9rZW5NYW5hZ2VyKCkKK3sKK30KKworc3RhdHVzX3QgVG9rZW5NYW5hZ2VyOjpnZXRUb2tlbihHTHNpemVpIG4sIEdMdWludCAqdG9rZW5zKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgZm9yIChHTHNpemVpIGk9MCA7IGk8biA7IGkrKykKKyAgICAgICAgKnRva2VucysrID0gbVRva2VuaXplci5hY3F1aXJlKCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIFRva2VuTWFuYWdlcjo6cmVjeWNsZVRva2VucyhHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqdG9rZW5zKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgZm9yIChpbnQgaT0wIDsgaTxuIDsgaSsrKSB7CisgICAgICAgIGNvbnN0IEdMdWludCB0b2tlbiA9ICp0b2tlbnMrKzsKKyAgICAgICAgaWYgKHRva2VuKSB7CisgICAgICAgICAgICBtVG9rZW5pemVyLnJlbGVhc2UodG9rZW4pOworICAgICAgICB9CisgICAgfQorfQorCitib29sIFRva2VuTWFuYWdlcjo6aXNUb2tlblZhbGlkKEdMdWludCB0b2tlbikgY29uc3QKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtVG9rZW5pemVyLmlzQWNxdWlyZWQodG9rZW4pOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL1Rva2VuTWFuYWdlci5oIGIvb3BlbmdsL2xpYmFnbC9Ub2tlbk1hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWMxNDY5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2xpYmFnbC9Ub2tlbk1hbmFnZXIuaApAQCAtMCwwICsxLDUzIEBACisvKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2lmbmRlZiBBTkRST0lEX09QRU5HTEVTX1RPS0VOX01BTkFHRVJfSAorI2RlZmluZSBBTkRST0lEX09QRU5HTEVTX1RPS0VOX01BTkFHRVJfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisKKyNpbmNsdWRlICJUb2tlbml6ZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFRva2VuTWFuYWdlcgoreworcHVibGljOgorICAgICAgICAgICAgICAgIFRva2VuTWFuYWdlcigpOworICAgICAgICAgICAgICAgIH5Ub2tlbk1hbmFnZXIoKTsKKworICAgIHN0YXR1c190ICAgIGdldFRva2VuKEdMc2l6ZWkgbiwgR0x1aW50ICp0b2tlbnMpOworICAgIHZvaWQgICAgICAgIHJlY3ljbGVUb2tlbnMoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnRva2Vucyk7CisgICAgYm9vbCAgICAgICAgaXNUb2tlblZhbGlkKEdMdWludCB0b2tlbikgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgbXV0YWJsZSBNdXRleCAgIG1Mb2NrOworICAgIFRva2VuaXplciAgICAgICBtVG9rZW5pemVyOworfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfT1BFTkdMRVNfVE9LRU5fTUFOQUdFUl9ICisKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvVG9rZW5pemVyLmNwcCBiL29wZW5nbC9saWJhZ2wvVG9rZW5pemVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjNlYTFhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2xpYmFnbC9Ub2tlbml6ZXIuY3BwCkBAIC0wLDAgKzEsMTczIEBACisvKiBsaWJzL29wZW5nbGVzL1Rva2VuaXplci5jcHAKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgIlRva2VuaXplci5oIgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworQU5EUk9JRF9CQVNJQ19UWVBFU19UUkFJVFMoVG9rZW5pemVyOjpydW5fdCkKKworVG9rZW5pemVyOjpUb2tlbml6ZXIoKQoreworfQorCitUb2tlbml6ZXI6OlRva2VuaXplcihjb25zdCBUb2tlbml6ZXImIG90aGVyKQorICAgIDogbVJhbmdlcyhvdGhlci5tUmFuZ2VzKQoreworfQorCitUb2tlbml6ZXI6On5Ub2tlbml6ZXIoKQoreworfQorCit1aW50MzJfdCBUb2tlbml6ZXI6OmFjcXVpcmUoKQoreworICAgIGlmICghbVJhbmdlcy5zaXplKCkgfHwgbVJhbmdlc1swXS5maXJzdCkgeworICAgICAgICBfaW5zZXJ0VG9rZW5BdCgwLDApOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgCisgICAgLy8ganVzdCBleHRlbmQgdGhlIGZpcnN0IHJ1bgorICAgIGNvbnN0IHJ1bl90JiBydW4gPSBtUmFuZ2VzWzBdOworICAgIHVpbnQzMl90IHRva2VuID0gcnVuLmZpcnN0ICsgcnVuLmxlbmd0aDsKKyAgICBfaW5zZXJ0VG9rZW5BdCh0b2tlbiwgMSk7CisgICAgcmV0dXJuIHRva2VuOworfQorCitib29sIFRva2VuaXplcjo6aXNBY3F1aXJlZCh1aW50MzJfdCB0b2tlbikgY29uc3QKK3sKKyAgICByZXR1cm4gKF9pbmRleE9yZGVyT2YodG9rZW4pID49IDApOworfQorCitzdGF0dXNfdCBUb2tlbml6ZXI6OnJlc2VydmUodWludDMyX3QgdG9rZW4pCit7CisgICAgc2l6ZV90IG87CisgICAgY29uc3Qgc3NpemVfdCBpID0gX2luZGV4T3JkZXJPZih0b2tlbiwgJm8pOworICAgIGlmIChpID49IDApIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsgLy8gdGhpcyB0b2tlbiBpcyBhbHJlYWR5IHRha2VuCisgICAgfQorICAgIHNzaXplX3QgZXJyID0gX2luc2VydFRva2VuQXQodG9rZW4sIG8pOworICAgIHJldHVybiAoZXJyPDApID8gZXJyIDogc3RhdHVzX3QoTk9fRVJST1IpOworfQorCitzdGF0dXNfdCBUb2tlbml6ZXI6OnJlbGVhc2UodWludDMyX3QgdG9rZW4pCit7CisgICAgY29uc3Qgc3NpemVfdCBpID0gX2luZGV4T3JkZXJPZih0b2tlbik7CisgICAgaWYgKGkgPj0gMCkgeworICAgICAgICBjb25zdCBydW5fdCYgcnVuID0gbVJhbmdlc1tpXTsKKyAgICAgICAgaWYgKCh0b2tlbiA+PSBydW4uZmlyc3QpICYmICh0b2tlbiA8IHJ1bi5maXJzdCtydW4ubGVuZ3RoKSkgeworICAgICAgICAgICAgLy8gdG9rZW4gaW4gdGhpcyByYW5nZSwgd2UgbmVlZCB0byBzcGxpdAorICAgICAgICAgICAgcnVuX3QmIHJ1biA9IG1SYW5nZXMuZWRpdEl0ZW1BdChpKTsKKyAgICAgICAgICAgIGlmICgodG9rZW4gPT0gcnVuLmZpcnN0KSB8fCAodG9rZW4gPT0gcnVuLmZpcnN0K3J1bi5sZW5ndGgtMSkpIHsKKyAgICAgICAgICAgICAgICBpZiAodG9rZW4gPT0gcnVuLmZpcnN0KSB7CisgICAgICAgICAgICAgICAgICAgIHJ1bi5maXJzdCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBydW4ubGVuZ3RoIC09IDE7CisgICAgICAgICAgICAgICAgaWYgKHJ1bi5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBYWFg6IHNob3VsZCB3ZSBzeXN0ZW1hdGljYWxseSByZW1vdmUgYSBydW4gdGhhdCdzIGVtcHR5PworICAgICAgICAgICAgICAgICAgICBtUmFuZ2VzLnJlbW92ZUl0ZW1zQXQoaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBzcGxpdCB0aGUgcnVuCisgICAgICAgICAgICAgICAgcnVuX3QgbmV3X3J1bjsKKyAgICAgICAgICAgICAgICBuZXdfcnVuLmZpcnN0ID0gdG9rZW4rMTsKKyAgICAgICAgICAgICAgICBuZXdfcnVuLmxlbmd0aCA9IHJ1bi5maXJzdCtydW4ubGVuZ3RoIC0gbmV3X3J1bi5maXJzdDsKKyAgICAgICAgICAgICAgICBydW4ubGVuZ3RoID0gdG9rZW4gLSBydW4uZmlyc3Q7CisgICAgICAgICAgICAgICAgbVJhbmdlcy5pbnNlcnRBdChuZXdfcnVuLCBpKzEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKK30KKworc3NpemVfdCBUb2tlbml6ZXI6Ol9pbmRleE9yZGVyT2YodWludDMyX3QgdG9rZW4sIHNpemVfdCogb3JkZXIpIGNvbnN0Cit7CisgICAgLy8gYmluYXJ5IHNlYXJjaAorICAgIHNzaXplX3QgZXJyID0gTkFNRV9OT1RfRk9VTkQ7CisgICAgc3NpemVfdCBsID0gMDsKKyAgICBzc2l6ZV90IGggPSBtUmFuZ2VzLnNpemUoKS0xOworICAgIHNzaXplX3QgbWlkOworICAgIGNvbnN0IHJ1bl90KiBhID0gbVJhbmdlcy5hcnJheSgpOworICAgIHdoaWxlIChsIDw9IGgpIHsKKyAgICAgICAgbWlkID0gbCArIChoIC0gbCkvMjsKKyAgICAgICAgY29uc3QgcnVuX3QqIGNvbnN0IGN1cnIgPSBhICsgbWlkOworICAgICAgICBpbnQgYyA9IDA7CisgICAgICAgIGlmICh0b2tlbiA8IGN1cnItPmZpcnN0KSAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAxOworICAgICAgICBlbHNlIGlmICh0b2tlbiA+PSBjdXJyLT5maXJzdCtjdXJyLT5sZW5ndGgpICAgICBjID0gLTE7CisgICAgICAgIGlmIChjID09IDApIHsKKyAgICAgICAgICAgIGVyciA9IGwgPSBtaWQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmIChjIDwgMCkgeworICAgICAgICAgICAgbCA9IG1pZCArIDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBoID0gbWlkIC0gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAob3JkZXIpICpvcmRlciA9IGw7CisgICAgcmV0dXJuIGVycjsKK30KKworc3NpemVfdCBUb2tlbml6ZXI6Ol9pbnNlcnRUb2tlbkF0KHVpbnQzMl90IHRva2VuLCBzaXplX3QgaW5kZXgpCit7CisgICAgY29uc3Qgc2l6ZV90IGMgPSBtUmFuZ2VzLnNpemUoKTsKKworICAgIGlmIChpbmRleCA+PSAxKSB7CisgICAgICAgIC8vIGRvIHdlIG5lZWQgdG8gbWVyZ2Ugd2l0aCB0aGUgcHJldmlvdXMgcnVuPworICAgICAgICBydW5fdCYgcCA9IG1SYW5nZXMuZWRpdEl0ZW1BdChpbmRleC0xKTsKKyAgICAgICAgaWYgKHAuZmlyc3QrcC5sZW5ndGggPT0gdG9rZW4pIHsKKyAgICAgICAgICAgIHAubGVuZ3RoICs9IDE7CisgICAgICAgICAgICBpZiAoaW5kZXggPCBjKSB7CisgICAgICAgICAgICAgICAgY29uc3QgcnVuX3QmIG4gPSBtUmFuZ2VzW2luZGV4XTsKKyAgICAgICAgICAgICAgICBpZiAodG9rZW4rMSA9PSBuLmZpcnN0KSB7CisgICAgICAgICAgICAgICAgICAgIHAubGVuZ3RoICs9IG4ubGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBtUmFuZ2VzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBpbmRleDsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBpZiAoaW5kZXggPCBjKSB7CisgICAgICAgIC8vIGRvIHdlIG5lZWQgdG8gbWVyZ2Ugd2l0aCB0aGUgbmV4dCBydW4/CisgICAgICAgIHJ1bl90JiBuID0gbVJhbmdlcy5lZGl0SXRlbUF0KGluZGV4KTsKKyAgICAgICAgaWYgKHRva2VuKzEgPT0gbi5maXJzdCkgeworICAgICAgICAgICAgbi5maXJzdCAtPSAxOworICAgICAgICAgICAgbi5sZW5ndGggKz0gMTsKKyAgICAgICAgICAgIHJldHVybiBpbmRleDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBtUmFuZ2VzLmluc2VydEF0KHJ1bl90KHRva2VuLDEpLCBpbmRleCk7Cit9CisKK3ZvaWQgVG9rZW5pemVyOjpkdW1wKCkgY29uc3QKK3sKKyAgICBjb25zdCBydW5fdCogcmFuZ2VzID0gbVJhbmdlcy5hcnJheSgpOworICAgIGNvbnN0IHNpemVfdCBjID0gbVJhbmdlcy5zaXplKCk7CisgICAgTE9HRCgiVG9rZW5pemVyICglcCwgc2l6ZSA9ICV1KVxuIiwgdGhpcywgYyk7CisgICAgZm9yIChzaXplX3QgaT0wIDsgaTxjIDsgaSsrKSB7CisgICAgICAgIExPR0QoIiV1OiAoJXUsICV1KVxuIiwgaSwgcmFuZ2VzW2ldLmZpcnN0LCByYW5nZXNbaV0ubGVuZ3RoKTsKKyAgICB9Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvVG9rZW5pemVyLmggYi9vcGVuZ2wvbGliYWdsL1Rva2VuaXplci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNTU1Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvbGliYWdsL1Rva2VuaXplci5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qIGxpYnMvb3BlbmdsZXMvVG9rZW5pemVyLmgKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisKKyNpZm5kZWYgQU5EUk9JRF9PUEVOR0xFU19UT0tFTklaRVJfSAorI2RlZmluZSBBTkRST0lEX09QRU5HTEVTX1RPS0VOSVpFUl9ICisKKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFRva2VuaXplcgoreworcHVibGljOgorICAgICAgICAgICAgICAgIFRva2VuaXplcigpOworICAgICAgICAgICAgICAgIFRva2VuaXplcihjb25zdCBUb2tlbml6ZXImIG90aGVyKTsKKyAgICAgICAgICAgICAgICB+VG9rZW5pemVyKCk7CisKKyAgICB1aW50MzJfdCAgICBhY3F1aXJlKCk7CisgICAgc3RhdHVzX3QgICAgcmVzZXJ2ZSh1aW50MzJfdCB0b2tlbik7CisgICAgc3RhdHVzX3QgICAgcmVsZWFzZSh1aW50MzJfdCB0b2tlbik7CisgICAgYm9vbCAgICAgICAgaXNBY3F1aXJlZCh1aW50MzJfdCB0b2tlbikgY29uc3Q7CisKKyAgICB2b2lkIGR1bXAoKSBjb25zdDsKKworICAgIHN0cnVjdCBydW5fdCB7CisgICAgICAgIHJ1bl90KCkge307CisgICAgICAgIHJ1bl90KHVpbnQzMl90IGYsIHVpbnQzMl90IGwpIDogZmlyc3QoZiksIGxlbmd0aChsKSB7fQorICAgICAgICB1aW50MzJfdCAgICBmaXJzdDsKKyAgICAgICAgdWludDMyX3QgICAgbGVuZ3RoOworICAgIH07Citwcml2YXRlOgorICAgIHNzaXplX3QgX2luZGV4T3JkZXJPZih1aW50MzJfdCB0b2tlbiwgc2l6ZV90KiBvcmRlcj0wKSBjb25zdDsKKyAgICBzc2l6ZV90IF9pbnNlcnRUb2tlbkF0KHVpbnQzMl90IHRva2VuLCBzaXplX3QgaW5kZXgpOworICAgIFZlY3RvcjxydW5fdD4gICBtUmFuZ2VzOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZW5kaWYgLy8gQU5EUk9JRF9PUEVOR0xFU19UT0tFTklaRVJfSApkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYmFnbC9hcnJheS5jcHAgYi9vcGVuZ2wvbGliYWdsL2FycmF5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmE3NTY2Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2xpYmFnbC9hcnJheS5jcHAKQEAgLTAsMCArMSwxNTU3IEBACisvKiAKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiY29udGV4dC5oIgorI2luY2x1ZGUgImZwLmgiCisjaW5jbHVkZSAic3RhdGUuaCIKKyNpbmNsdWRlICJtYXRyaXguaCIKKyNpbmNsdWRlICJ2ZXJ0ZXguaCIKKyNpbmNsdWRlICJsaWdodC5oIgorI2luY2x1ZGUgInByaW1pdGl2ZXMuaCIKKyNpbmNsdWRlICJ0ZXh0dXJlLmgiCisjaW5jbHVkZSAiQnVmZmVyT2JqZWN0TWFuYWdlci5oIgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgVkNfQ0FDSEVfU1RBVElTVElDUyAgICAgMAorI2RlZmluZSBWQ19DQUNIRV9UWVBFX05PTkUgICAgICAwCisjZGVmaW5lIFZDX0NBQ0hFX1RZUEVfSU5ERVhFRCAgIDEKKyNkZWZpbmUgVkNfQ0FDSEVfVFlQRV9MUlUgICAgICAgMgorI2RlZmluZSBWQ19DQUNIRV9UWVBFICAgICAgICAgICBWQ19DQUNIRV9UWVBFX0lOREVYRUQKKworI2lmIFZDX0NBQ0hFX1NUQVRJU1RJQ1MKKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KKyNlbmRpZgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIHZvaWQgdmFsaWRhdGVfYXJyYXlzKG9nbGVzX2NvbnRleHRfdCogYywgR0xlbnVtIG1vZGUpOworCitzdGF0aWMgdm9pZCBjb21waWxlRWxlbWVudHNfX2dlbmVyaWMob2dsZXNfY29udGV4dF90KiwKKyAgICAgICAgdmVydGV4X3QqLCBHTGludCwgR0xzaXplaSk7CitzdGF0aWMgdm9pZCBjb21waWxlRWxlbWVudF9fZ2VuZXJpYyhvZ2xlc19jb250ZXh0X3QqLAorICAgICAgICB2ZXJ0ZXhfdCosIEdMaW50KTsKKworc3RhdGljIHZvaWQgZHJhd1ByaW1pdGl2ZXNQb2ludHMob2dsZXNfY29udGV4dF90KiwgR0xpbnQsIEdMc2l6ZWkpOworc3RhdGljIHZvaWQgZHJhd1ByaW1pdGl2ZXNMaW5lU3RyaXAob2dsZXNfY29udGV4dF90KiwgR0xpbnQsIEdMc2l6ZWkpOworc3RhdGljIHZvaWQgZHJhd1ByaW1pdGl2ZXNMaW5lTG9vcChvZ2xlc19jb250ZXh0X3QqLCBHTGludCwgR0xzaXplaSk7CitzdGF0aWMgdm9pZCBkcmF3UHJpbWl0aXZlc0xpbmVzKG9nbGVzX2NvbnRleHRfdCosIEdMaW50LCBHTHNpemVpKTsKK3N0YXRpYyB2b2lkIGRyYXdQcmltaXRpdmVzVHJpYW5nbGVTdHJpcChvZ2xlc19jb250ZXh0X3QqLCBHTGludCwgR0xzaXplaSk7CitzdGF0aWMgdm9pZCBkcmF3UHJpbWl0aXZlc1RyaWFuZ2xlRmFuKG9nbGVzX2NvbnRleHRfdCosIEdMaW50LCBHTHNpemVpKTsKK3N0YXRpYyB2b2lkIGRyYXdQcmltaXRpdmVzVHJpYW5nbGVzKG9nbGVzX2NvbnRleHRfdCosIEdMaW50LCBHTHNpemVpKTsKKworc3RhdGljIHZvaWQgZHJhd0luZGV4ZWRQcmltaXRpdmVzUG9pbnRzKG9nbGVzX2NvbnRleHRfdCosCisgICAgICAgIEdMc2l6ZWksIGNvbnN0IEdMdm9pZCopOworc3RhdGljIHZvaWQgZHJhd0luZGV4ZWRQcmltaXRpdmVzTGluZVN0cmlwKG9nbGVzX2NvbnRleHRfdCosCisgICAgICAgIEdMc2l6ZWksIGNvbnN0IEdMdm9pZCopOworc3RhdGljIHZvaWQgZHJhd0luZGV4ZWRQcmltaXRpdmVzTGluZUxvb3Aob2dsZXNfY29udGV4dF90KiwKKyAgICAgICAgR0xzaXplaSwgY29uc3QgR0x2b2lkKik7CitzdGF0aWMgdm9pZCBkcmF3SW5kZXhlZFByaW1pdGl2ZXNMaW5lcyhvZ2xlc19jb250ZXh0X3QqLAorICAgICAgICBHTHNpemVpLCBjb25zdCBHTHZvaWQqKTsKK3N0YXRpYyB2b2lkIGRyYXdJbmRleGVkUHJpbWl0aXZlc1RyaWFuZ2xlU3RyaXAob2dsZXNfY29udGV4dF90KiwKKyAgICAgICAgR0xzaXplaSwgY29uc3QgR0x2b2lkKik7CitzdGF0aWMgdm9pZCBkcmF3SW5kZXhlZFByaW1pdGl2ZXNUcmlhbmdsZUZhbihvZ2xlc19jb250ZXh0X3QqLAorICAgICAgICBHTHNpemVpLCBjb25zdCBHTHZvaWQqKTsKK3N0YXRpYyB2b2lkIGRyYXdJbmRleGVkUHJpbWl0aXZlc1RyaWFuZ2xlcyhvZ2xlc19jb250ZXh0X3QqLAorICAgICAgICBHTHNpemVpLCBjb25zdCBHTHZvaWQqKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHZvaWQgKCphcnJheXNfcHJpbXNfZmN0X3QpKG9nbGVzX2NvbnRleHRfdCosIEdMaW50LCBHTHNpemVpKTsKK3N0YXRpYyBjb25zdCBhcnJheXNfcHJpbXNfZmN0X3QgZHJhd0FycmF5c1ByaW1zW10gPSB7CisgICAgZHJhd1ByaW1pdGl2ZXNQb2ludHMsCisgICAgZHJhd1ByaW1pdGl2ZXNMaW5lcywKKyAgICBkcmF3UHJpbWl0aXZlc0xpbmVMb29wLAorICAgIGRyYXdQcmltaXRpdmVzTGluZVN0cmlwLAorICAgIGRyYXdQcmltaXRpdmVzVHJpYW5nbGVzLAorICAgIGRyYXdQcmltaXRpdmVzVHJpYW5nbGVTdHJpcCwKKyAgICBkcmF3UHJpbWl0aXZlc1RyaWFuZ2xlRmFuCit9OworCit0eXBlZGVmIHZvaWQgKCplbGVtZW50c19wcmltc19mY3RfdCkob2dsZXNfY29udGV4dF90KiwgR0xzaXplaSwgY29uc3QgR0x2b2lkKik7CitzdGF0aWMgY29uc3QgZWxlbWVudHNfcHJpbXNfZmN0X3QgZHJhd0VsZW1lbnRzUHJpbXNbXSA9IHsKKyAgICBkcmF3SW5kZXhlZFByaW1pdGl2ZXNQb2ludHMsCisgICAgZHJhd0luZGV4ZWRQcmltaXRpdmVzTGluZXMsCisgICAgZHJhd0luZGV4ZWRQcmltaXRpdmVzTGluZUxvb3AsCisgICAgZHJhd0luZGV4ZWRQcmltaXRpdmVzTGluZVN0cmlwLAorICAgIGRyYXdJbmRleGVkUHJpbWl0aXZlc1RyaWFuZ2xlcywKKyAgICBkcmF3SW5kZXhlZFByaW1pdGl2ZXNUcmlhbmdsZVN0cmlwLAorICAgIGRyYXdJbmRleGVkUHJpbWl0aXZlc1RyaWFuZ2xlRmFuCit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgMAorI3ByYWdtYSBtYXJrIC0KKyNlbmRpZgorCit2b2lkIG9nbGVzX2luaXRfYXJyYXkob2dsZXNfY29udGV4dF90KiBjKQoreworICAgIGMtPmFycmF5cy52ZXJ0ZXguc2l6ZSA9IDQ7CisgICAgYy0+YXJyYXlzLnZlcnRleC50eXBlID0gR0xfRkxPQVQ7CisgICAgYy0+YXJyYXlzLmNvbG9yLnNpemUgPSA0OworICAgIGMtPmFycmF5cy5jb2xvci50eXBlID0gR0xfRkxPQVQ7CisgICAgYy0+YXJyYXlzLm5vcm1hbC5zaXplID0gNDsKKyAgICBjLT5hcnJheXMubm9ybWFsLnR5cGUgPSBHTF9GTE9BVDsKKyAgICBmb3IgKGludCBpPTAgOyBpPEdHTF9URVhUVVJFX1VOSVRfQ09VTlQgOyBpKyspIHsKKyAgICAgICAgYy0+YXJyYXlzLnRleHR1cmVbaV0uc2l6ZSA9IDQ7CisgICAgICAgIGMtPmFycmF5cy50ZXh0dXJlW2ldLnR5cGUgPSBHTF9GTE9BVDsKKyAgICB9CisgICAgYy0+dmMuaW5pdCgpOworCisgICAgaWYgKCFjLT52Yy52QnVmZmVyKSB7CisgICAgICAgIC8vIHRoaXMgY291bGQgaGF2ZSBmYWlsZWQKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfT1VUX09GX01FTU9SWSk7CisgICAgfQorfQorCit2b2lkIG9nbGVzX3VuaW5pdF9hcnJheShvZ2xlc19jb250ZXh0X3QqIGMpCit7CisgICAgYy0+dmMudW5pbml0KCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZiAwCisjcHJhZ21hIG1hcmsgLQorI3ByYWdtYSBtYXJrIEFycmF5IGZldGNoZXJzCisjZW5kaWYKKworc3RhdGljIHZvaWQgY3VycmVudENvbG9yKG9nbGVzX2NvbnRleHRfdCogYywgR0xmaXhlZCogdiwgY29uc3QgR0x2b2lkKikgeworICAgIG1lbWNweSh2LCBjLT5jdXJyZW50LmNvbG9yLnYsIHNpemVvZih2ZWM0X3QpKTsKK30KK3N0YXRpYyB2b2lkIGN1cnJlbnRDb2xvcl9jbGFtcChvZ2xlc19jb250ZXh0X3QqIGMsIEdMZml4ZWQqIHYsIGNvbnN0IEdMdm9pZCopIHsKKyAgICBtZW1jcHkodiwgYy0+Y3VycmVudENvbG9yQ2xhbXBlZC52LCBzaXplb2YodmVjNF90KSk7Cit9CitzdGF0aWMgdm9pZCBjdXJyZW50Tm9ybWFsKG9nbGVzX2NvbnRleHRfdCogYywgR0xmaXhlZCogdiwgY29uc3QgR0x2b2lkKikgeworICAgIG1lbWNweSh2LCBjLT5jdXJyZW50Tm9ybWFsLnYsIHNpemVvZih2ZWMzX3QpKTsKK30KK3N0YXRpYyB2b2lkIGN1cnJlbnRUZXhDb29yZChvZ2xlc19jb250ZXh0X3QqIGMsIEdMZml4ZWQqIHYsIGNvbnN0IEdMdm9pZCopIHsKKyAgICBtZW1jcHkodiwgYy0+Y3VycmVudC50ZXh0dXJlW2MtPmFycmF5cy50bXVdLnYsIHNpemVvZih2ZWM0X3QpKTsKK30KKworCitzdGF0aWMgdm9pZCBmZXRjaE5vcChvZ2xlc19jb250ZXh0X3QqLCBHTGZpeGVkKiwgY29uc3QgR0x2b2lkKikgeworfQorc3RhdGljIHZvaWQgZmV0Y2gyYihvZ2xlc19jb250ZXh0X3QqLCBHTGZpeGVkKiB2LCBjb25zdCBHTGJ5dGUqIHApIHsKKyAgICB2WzBdID0gZ2dsSW50VG9GaXhlZChwWzBdKTsKKyAgICB2WzFdID0gZ2dsSW50VG9GaXhlZChwWzFdKTsKK30KK3N0YXRpYyB2b2lkIGZldGNoMnMob2dsZXNfY29udGV4dF90KiwgR0xmaXhlZCogdiwgY29uc3QgR0xzaG9ydCogcCkgeworICAgIHZbMF0gPSBnZ2xJbnRUb0ZpeGVkKHBbMF0pOworICAgIHZbMV0gPSBnZ2xJbnRUb0ZpeGVkKHBbMV0pOworfQorc3RhdGljIHZvaWQgZmV0Y2gyeChvZ2xlc19jb250ZXh0X3QqLCBHTGZpeGVkKiB2LCBjb25zdCBHTGZpeGVkKiBwKSB7CisgICAgbWVtY3B5KHYsIHAsIDIqc2l6ZW9mKEdMZml4ZWQpKTsKK30KK3N0YXRpYyB2b2lkIGZldGNoMmYob2dsZXNfY29udGV4dF90KiwgR0xmaXhlZCogdiwgY29uc3QgR0xmbG9hdCogcCkgeworICAgIHZbMF0gPSBnZ2xGbG9hdFRvRml4ZWQocFswXSk7CisgICAgdlsxXSA9IGdnbEZsb2F0VG9GaXhlZChwWzFdKTsKK30KK3N0YXRpYyB2b2lkIGZldGNoM2Iob2dsZXNfY29udGV4dF90KiwgR0xmaXhlZCogdiwgY29uc3QgR0xieXRlKiBwKSB7CisgICAgdlswXSA9IGdnbEludFRvRml4ZWQocFswXSk7CisgICAgdlsxXSA9IGdnbEludFRvRml4ZWQocFsxXSk7CisgICAgdlsyXSA9IGdnbEludFRvRml4ZWQocFsyXSk7Cit9CitzdGF0aWMgdm9pZCBmZXRjaDNzKG9nbGVzX2NvbnRleHRfdCosIEdMZml4ZWQqIHYsIGNvbnN0IEdMc2hvcnQqIHApIHsKKyAgICB2WzBdID0gZ2dsSW50VG9GaXhlZChwWzBdKTsKKyAgICB2WzFdID0gZ2dsSW50VG9GaXhlZChwWzFdKTsKKyAgICB2WzJdID0gZ2dsSW50VG9GaXhlZChwWzJdKTsKK30KK3N0YXRpYyB2b2lkIGZldGNoM3gob2dsZXNfY29udGV4dF90KiwgR0xmaXhlZCogdiwgY29uc3QgR0xmaXhlZCogcCkgeworICAgIG1lbWNweSh2LCBwLCAzKnNpemVvZihHTGZpeGVkKSk7Cit9CitzdGF0aWMgdm9pZCBmZXRjaDNmKG9nbGVzX2NvbnRleHRfdCosIEdMZml4ZWQqIHYsIGNvbnN0IEdMZmxvYXQqIHApIHsKKyAgICB2WzBdID0gZ2dsRmxvYXRUb0ZpeGVkKHBbMF0pOworICAgIHZbMV0gPSBnZ2xGbG9hdFRvRml4ZWQocFsxXSk7CisgICAgdlsyXSA9IGdnbEZsb2F0VG9GaXhlZChwWzJdKTsKK30KK3N0YXRpYyB2b2lkIGZldGNoNGIob2dsZXNfY29udGV4dF90KiwgR0xmaXhlZCogdiwgY29uc3QgR0xieXRlKiBwKSB7CisgICAgdlswXSA9IGdnbEludFRvRml4ZWQocFswXSk7CisgICAgdlsxXSA9IGdnbEludFRvRml4ZWQocFsxXSk7CisgICAgdlsyXSA9IGdnbEludFRvRml4ZWQocFsyXSk7CisgICAgdlszXSA9IGdnbEludFRvRml4ZWQocFszXSk7Cit9CitzdGF0aWMgdm9pZCBmZXRjaDRzKG9nbGVzX2NvbnRleHRfdCosIEdMZml4ZWQqIHYsIGNvbnN0IEdMc2hvcnQqIHApIHsKKyAgICB2WzBdID0gZ2dsSW50VG9GaXhlZChwWzBdKTsKKyAgICB2WzFdID0gZ2dsSW50VG9GaXhlZChwWzFdKTsKKyAgICB2WzJdID0gZ2dsSW50VG9GaXhlZChwWzJdKTsKKyAgICB2WzNdID0gZ2dsSW50VG9GaXhlZChwWzNdKTsKK30KK3N0YXRpYyB2b2lkIGZldGNoNHgob2dsZXNfY29udGV4dF90KiwgR0xmaXhlZCogdiwgY29uc3QgR0xmaXhlZCogcCkgeworICAgIG1lbWNweSh2LCBwLCA0KnNpemVvZihHTGZpeGVkKSk7Cit9CitzdGF0aWMgdm9pZCBmZXRjaDRmKG9nbGVzX2NvbnRleHRfdCosIEdMZml4ZWQqIHYsIGNvbnN0IEdMZmxvYXQqIHApIHsKKyAgICB2WzBdID0gZ2dsRmxvYXRUb0ZpeGVkKHBbMF0pOworICAgIHZbMV0gPSBnZ2xGbG9hdFRvRml4ZWQocFsxXSk7CisgICAgdlsyXSA9IGdnbEZsb2F0VG9GaXhlZChwWzJdKTsKKyAgICB2WzNdID0gZ2dsRmxvYXRUb0ZpeGVkKHBbM10pOworfQorc3RhdGljIHZvaWQgZmV0Y2hFeHBhbmQ0dWIob2dsZXNfY29udGV4dF90KiwgR0xmaXhlZCogdiwgY29uc3QgR0x1Ynl0ZSogcCkgeworICAgIHZbMF0gPSBHR0xfVUJfVE9fWChwWzBdKTsKKyAgICB2WzFdID0gR0dMX1VCX1RPX1gocFsxXSk7CisgICAgdlsyXSA9IEdHTF9VQl9UT19YKHBbMl0pOworICAgIHZbM10gPSBHR0xfVUJfVE9fWChwWzNdKTsKK30KK3N0YXRpYyB2b2lkIGZldGNoQ2xhbXA0eChvZ2xlc19jb250ZXh0X3QqLCBHTGZpeGVkKiB2LCBjb25zdCBHTGZpeGVkKiBwKSB7CisgICAgdlswXSA9IGdnbENsYW1weChwWzBdKTsKKyAgICB2WzFdID0gZ2dsQ2xhbXB4KHBbMV0pOworICAgIHZbMl0gPSBnZ2xDbGFtcHgocFsyXSk7CisgICAgdlszXSA9IGdnbENsYW1weChwWzNdKTsKK30KK3N0YXRpYyB2b2lkIGZldGNoQ2xhbXA0ZihvZ2xlc19jb250ZXh0X3QqLCBHTGZpeGVkKiB2LCBjb25zdCBHTGZsb2F0KiBwKSB7CisgICAgdlswXSA9IGdnbENsYW1weChnZ2xGbG9hdFRvRml4ZWQocFswXSkpOworICAgIHZbMV0gPSBnZ2xDbGFtcHgoZ2dsRmxvYXRUb0ZpeGVkKHBbMV0pKTsKKyAgICB2WzJdID0gZ2dsQ2xhbXB4KGdnbEZsb2F0VG9GaXhlZChwWzJdKSk7CisgICAgdlszXSA9IGdnbENsYW1weChnZ2xGbG9hdFRvRml4ZWQocFszXSkpOworfQorc3RhdGljIHZvaWQgZmV0Y2hFeHBhbmQzdWIob2dsZXNfY29udGV4dF90KiwgR0xmaXhlZCogdiwgY29uc3QgR0x1Ynl0ZSogcCkgeworICAgIHZbMF0gPSBHR0xfVUJfVE9fWChwWzBdKTsKKyAgICB2WzFdID0gR0dMX1VCX1RPX1gocFsxXSk7CisgICAgdlsyXSA9IEdHTF9VQl9UT19YKHBbMl0pOworICAgIHZbM10gPSAweDEwMDAwOworfQorc3RhdGljIHZvaWQgZmV0Y2hDbGFtcDN4KG9nbGVzX2NvbnRleHRfdCosIEdMZml4ZWQqIHYsIGNvbnN0IEdMZml4ZWQqIHApIHsKKyAgICB2WzBdID0gZ2dsQ2xhbXB4KHBbMF0pOworICAgIHZbMV0gPSBnZ2xDbGFtcHgocFsxXSk7CisgICAgdlsyXSA9IGdnbENsYW1weChwWzJdKTsKKyAgICB2WzNdID0gMHgxMDAwMDsKK30KK3N0YXRpYyB2b2lkIGZldGNoQ2xhbXAzZihvZ2xlc19jb250ZXh0X3QqLCBHTGZpeGVkKiB2LCBjb25zdCBHTGZsb2F0KiBwKSB7CisgICAgdlswXSA9IGdnbENsYW1weChnZ2xGbG9hdFRvRml4ZWQocFswXSkpOworICAgIHZbMV0gPSBnZ2xDbGFtcHgoZ2dsRmxvYXRUb0ZpeGVkKHBbMV0pKTsKKyAgICB2WzJdID0gZ2dsQ2xhbXB4KGdnbEZsb2F0VG9GaXhlZChwWzJdKSk7CisgICAgdlszXSA9IDB4MTAwMDA7Cit9CitzdGF0aWMgdm9pZCBmZXRjaEV4cGFuZDNiKG9nbGVzX2NvbnRleHRfdCosIEdMZml4ZWQqIHYsIGNvbnN0IEdMYnl0ZSogcCkgeworICAgIHZbMF0gPSBHR0xfQl9UT19YKHBbMF0pOworICAgIHZbMV0gPSBHR0xfQl9UT19YKHBbMV0pOworICAgIHZbMl0gPSBHR0xfQl9UT19YKHBbMl0pOworfQorc3RhdGljIHZvaWQgZmV0Y2hFeHBhbmQzcyhvZ2xlc19jb250ZXh0X3QqLCBHTGZpeGVkKiB2LCBjb25zdCBHTHNob3J0KiBwKSB7CisgICAgdlswXSA9IEdHTF9TX1RPX1gocFswXSk7CisgICAgdlsxXSA9IEdHTF9TX1RPX1gocFsxXSk7CisgICAgdlsyXSA9IEdHTF9TX1RPX1gocFsyXSk7Cit9CisKK3R5cGVkZWYgYXJyYXlfdDo6ZmV0Y2hlcl90IGZuX3Q7IAorCitzdGF0aWMgY29uc3QgZm5fdCBjb2xvcl9mY3RbMl1bMTZdID0geyAvLyBzaXplPXszLDR9LCB0eXBlPXt1YixmLHh9CisgICAgeyAwLCAoZm5fdClmZXRjaEV4cGFuZDN1YiwgMCwgMCwgMCwgMCwKKyAgICAgICAgIChmbl90KWZldGNoM2YsIDAsIDAsIDAsIDAsIDAsCisgICAgICAgICAoZm5fdClmZXRjaDN4IH0sCisgICAgeyAwLCAoZm5fdClmZXRjaEV4cGFuZDR1YiwgMCwgMCwgMCwgMCwKKyAgICAgICAgIChmbl90KWZldGNoNGYsIDAsIDAsIDAsIDAsIDAsCisgICAgICAgICAoZm5fdClmZXRjaDR4IH0sCit9Oworc3RhdGljIGNvbnN0IGZuX3QgY29sb3JfY2xhbXBfZmN0WzJdWzE2XSA9IHsgLy8gc2l6ZT17Myw0fSwgdHlwZT17dWIsZix4fQorICAgIHsgMCwgKGZuX3QpZmV0Y2hFeHBhbmQzdWIsIDAsIDAsIDAsIDAsCisgICAgICAgICAoZm5fdClmZXRjaENsYW1wM2YsIDAsIDAsIDAsIDAsIDAsCisgICAgICAgICAoZm5fdClmZXRjaENsYW1wM3ggfSwKKyAgICB7IDAsIChmbl90KWZldGNoRXhwYW5kNHViLCAwLCAwLCAwLCAwLAorICAgICAgICAgKGZuX3QpZmV0Y2hDbGFtcDRmLCAwLCAwLCAwLCAwLCAwLAorICAgICAgICAgKGZuX3QpZmV0Y2hDbGFtcDR4IH0sCit9Oworc3RhdGljIGNvbnN0IGZuX3Qgbm9ybWFsX2ZjdFsxXVsxNl0gPSB7IC8vIHNpemU9ezN9LCB0eXBlPXtiLHMsZix4fQorICAgIHsgKGZuX3QpZmV0Y2hFeHBhbmQzYiwgMCwKKyAgICAgIChmbl90KWZldGNoRXhwYW5kM3MsIDAsIDAsIDAsCisgICAgICAoZm5fdClmZXRjaDNmLCAwLCAwLCAwLCAwLCAwLAorICAgICAgKGZuX3QpZmV0Y2gzeCB9LAorfTsKK3N0YXRpYyBjb25zdCBmbl90IHZlcnRleF9mY3RbM11bMTZdID0geyAvLyBzaXplPXsyLDMsNH0sIHR5cGU9e2IscyxmLHh9CisgICAgeyAoZm5fdClmZXRjaDJiLCAwLAorICAgICAgKGZuX3QpZmV0Y2gycywgMCwgMCwgMCwKKyAgICAgIChmbl90KWZldGNoMmYsIDAsIDAsIDAsIDAsIDAsCisgICAgICAoZm5fdClmZXRjaDN4IH0sCisgICAgeyAoZm5fdClmZXRjaDNiLCAwLAorICAgICAgKGZuX3QpZmV0Y2gzcywgMCwgMCwgMCwKKyAgICAgIChmbl90KWZldGNoM2YsIDAsIDAsIDAsIDAsIDAsCisgICAgICAoZm5fdClmZXRjaDN4IH0sCisgICAgeyAoZm5fdClmZXRjaDRiLCAwLAorICAgICAgKGZuX3QpZmV0Y2g0cywgMCwgMCwgMCwKKyAgICAgIChmbl90KWZldGNoNGYsIDAsIDAsIDAsIDAsIDAsCisgICAgICAoZm5fdClmZXRjaDR4IH0KK307CitzdGF0aWMgY29uc3QgZm5fdCB0ZXh0dXJlX2ZjdFszXVsxNl0gPSB7IC8vIHNpemU9ezIsMyw0fSwgdHlwZT17YixzLGYseH0KKyAgICB7IChmbl90KWZldGNoMmIsIDAsCisgICAgICAoZm5fdClmZXRjaDJzLCAwLCAwLCAwLAorICAgICAgKGZuX3QpZmV0Y2gyZiwgMCwgMCwgMCwgMCwgMCwKKyAgICAgIChmbl90KWZldGNoMnggfSwKKyAgICB7IChmbl90KWZldGNoM2IsIDAsCisgICAgICAoZm5fdClmZXRjaDNzLCAwLCAwLCAwLAorICAgICAgKGZuX3QpZmV0Y2gzZiwgMCwgMCwgMCwgMCwgMCwKKyAgICAgIChmbl90KWZldGNoM3ggfSwKKyAgICB7IChmbl90KWZldGNoNGIsIDAsCisgICAgICAoZm5fdClmZXRjaDRzLCAwLCAwLCAwLAorICAgICAgKGZuX3QpZmV0Y2g0ZiwgMCwgMCwgMCwgMCwgMCwKKyAgICAgIChmbl90KWZldGNoNHggfQorfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIDAKKyNwcmFnbWEgbWFyayAtCisjcHJhZ21hIG1hcmsgYXJyYXlfdAorI2VuZGlmCisKK3ZvaWQgYXJyYXlfdDo6aW5pdCgKKyAgICAgICAgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLAorICAgICAgICBjb25zdCBHTHZvaWQgKnBvaW50ZXIsIGNvbnN0IGJ1ZmZlcl90KiBibywgR0xzaXplaSBjb3VudCkKK3sKKyAgICBpZiAoIXN0cmlkZSkgeworICAgICAgICBzdHJpZGUgPSBzaXplOworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBHTF9TSE9SVDoKKyAgICAgICAgY2FzZSBHTF9VTlNJR05FRF9TSE9SVDoKKyAgICAgICAgICAgIHN0cmlkZSAqPSAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR0xfRkxPQVQ6CisgICAgICAgIGNhc2UgR0xfRklYRUQ6CisgICAgICAgICAgICBzdHJpZGUgKj0gNDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHRoaXMtPnNpemUgPSBzaXplOworICAgIHRoaXMtPnR5cGUgPSB0eXBlOworICAgIHRoaXMtPnN0cmlkZSA9IHN0cmlkZTsKKyAgICB0aGlzLT5wb2ludGVyID0gcG9pbnRlcjsKKyAgICB0aGlzLT5ibyA9IGJvOworICAgIHRoaXMtPmJvdW5kcyA9IGNvdW50OworfQorCitpbmxpbmUgdm9pZCBhcnJheV90OjpyZXNvbHZlKCkgCit7CisgICAgcGh5c2ljYWxfcG9pbnRlciA9IChibykgPyAoYm8tPmRhdGEgKyB1aW50cHRyX3QocG9pbnRlcikpIDogcG9pbnRlcjsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIDAKKyNwcmFnbWEgbWFyayAtCisjcHJhZ21hIG1hcmsgdmVydGV4X2NhY2hlX3QKKyNlbmRpZgorCit2b2lkIHZlcnRleF9jYWNoZV90Ojppbml0KCkKK3sKKyAgICAvLyBtYWtlIHN1cmUgdGhlIHNpemUgb2YgdmVydGV4X3QgYWxsb3dzIGNhY2hlLWxpbmUgYWxpZ25tZW50CisgICAgQ1RBPChzaXplb2YodmVydGV4X3QpICYgMHgxRikgPT0gMD4gYXNzZXJ0QWxpZ25lZFNpemU7CisKKyAgICBjb25zdCBpbnQgYWxpZ24gPSAzMjsKKyAgICBjb25zdCBzaXplX3QgcyA9IFZFUlRFWF9CVUZGRVJfU0laRSArIFZFUlRFWF9DQUNIRV9TSVpFOworICAgIGNvbnN0IHNpemVfdCBzaXplID0gcypzaXplb2YodmVydGV4X3QpICsgYWxpZ247CisgICAgYmFzZSA9IG1hbGxvYyhzaXplKTsKKyAgICBpZiAoYmFzZSkgeworICAgICAgICBtZW1zZXQoYmFzZSwgMCwgc2l6ZSk7CisgICAgICAgIHZCdWZmZXIgPSAodmVydGV4X3QqKSgoc2l6ZV90KGJhc2UpICsgYWxpZ24gLSAxKSAmIH4oYWxpZ24tMSkpOworICAgICAgICB2Q2FjaGUgPSB2QnVmZmVyICsgVkVSVEVYX0JVRkZFUl9TSVpFOworICAgICAgICBzZXF1ZW5jZSA9IDA7CisgICAgfQorfQorCit2b2lkIHZlcnRleF9jYWNoZV90Ojp1bmluaXQoKQoreworICAgIGZyZWUoYmFzZSk7CisgICAgYmFzZSA9IHZCdWZmZXIgPSB2Q2FjaGUgPSAwOworfQorCit2b2lkIHZlcnRleF9jYWNoZV90OjpjbGVhcigpCit7CisjaWYgVkNfQ0FDSEVfU1RBVElTVElDUworICAgIHN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKKyAgICB0b3RhbCA9IDA7CisgICAgbWlzc2VzID0gMDsKKyNlbmRpZgorCisjaWYgVkNfQ0FDSEVfVFlQRSA9PSBWQ19DQUNIRV9UWVBFX0xSVQorICAgIHZlcnRleF90KiB2ID0gdkJ1ZmZlcjsKKyAgICBzaXplX3QgY291bnQgPSBWRVJURVhfQlVGRkVSX1NJWkUgKyBWRVJURVhfQ0FDSEVfU0laRTsKKyAgICBkbyB7CisgICAgICAgIHYtPm1ydSA9IDA7CisgICAgICAgIHYrKzsKKyAgICB9IHdoaWxlICgtLWNvdW50KTsKKyNlbmRpZgorCisgICAgc2VxdWVuY2UgKz0gSU5ERVhfU0VROworICAgIGlmIChzZXF1ZW5jZSA+PSAweDgwMDAwMDAwTFUpIHsKKyAgICAgICAgc2VxdWVuY2UgPSBJTkRFWF9TRVE7CisgICAgICAgIHZlcnRleF90KiB2ID0gdkJ1ZmZlcjsKKyAgICAgICAgc2l6ZV90IGNvdW50ID0gVkVSVEVYX0JVRkZFUl9TSVpFICsgVkVSVEVYX0NBQ0hFX1NJWkU7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHYtPmluZGV4ID0gMDsKKyAgICAgICAgICAgIHYrKzsKKyAgICAgICAgfSB3aGlsZSAoLS1jb3VudCk7CisgICAgfQorfQorCit2b2lkIHZlcnRleF9jYWNoZV90OjpkdW1wX3N0YXRzKEdMZW51bSBtb2RlKQoreworI2lmIFZDX0NBQ0hFX1NUQVRJU1RJQ1MKKyAgICBuc2Vjc190IHRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCkgLSBzdGFydFRpbWU7CisgICAgdWludDMyX3QgaGl0cyA9IHRvdGFsIC0gbWlzc2VzOworICAgIHVpbnQzMl90IHByaW1fY291bnQ7CisgICAgc3dpdGNoIChtb2RlKSB7CisgICAgY2FzZSBHTF9QT0lOVFM6ICAgICAgICAgICAgIHByaW1fY291bnQgPSB0b3RhbDsgICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX0xJTkVfU1RSSVA6ICAgICAgICAgcHJpbV9jb3VudCA9IHRvdGFsIC0gMTsgICAgIGJyZWFrOworICAgIGNhc2UgR0xfTElORV9MT09QOiAgICAgICAgICBwcmltX2NvdW50ID0gdG90YWwgLSAxOyAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9MSU5FUzogICAgICAgICAgICAgIHByaW1fY291bnQgPSB0b3RhbCAvIDI7ICAgICBicmVhazsKKyAgICBjYXNlIEdMX1RSSUFOR0xFX1NUUklQOiAgICAgcHJpbV9jb3VudCA9IHRvdGFsIC0gMjsgICAgIGJyZWFrOworICAgIGNhc2UgR0xfVFJJQU5HTEVfRkFOOiAgICAgICBwcmltX2NvdW50ID0gdG90YWwgLSAyOyAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9UUklBTkdMRVM6ICAgICAgICAgIHByaW1fY291bnQgPSB0b3RhbCAvIDM7ICAgICBicmVhazsKKyAgICBkZWZhdWx0OiAgICByZXR1cm47CisgICAgfQorICAgIHByaW50ZiggInRvdGFsPSU1dSwgaGl0cz0lNXUsIG1pc3M9JTV1LCBoaXRyYXRlPSUzdSUlLCIKKyAgICAgICAgICAgICIgcHJpbXM9JTV1LCB0aW1lPSU2dSB1cywgcHJpbXMvcz0lZCwgdi90PSVmXG4iLAorICAgICAgICAgICAgdG90YWwsIGhpdHMsIG1pc3NlcywgKGhpdHMqMTAwKS90b3RhbCwKKyAgICAgICAgICAgIHByaW1fY291bnQsIGludChuczJ1cyh0aW1lKSksIGludChwcmltX2NvdW50KmZsb2F0KHNlY29uZHMoMSkpL3RpbWUpLAorICAgICAgICAgICAgZmxvYXQobWlzc2VzKSAvIHByaW1fY291bnQpOworI2VuZGlmCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZiAwCisjcHJhZ21hIG1hcmsgLQorI2VuZGlmCisKK3N0YXRpYyBfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpCit2b2lkIGVuYWJsZURpc2FibGVDbGllbnRTdGF0ZShvZ2xlc19jb250ZXh0X3QqIGMsIEdMZW51bSBhcnJheSwgYm9vbCBlbmFibGUpCit7CisgICAgY29uc3QgaW50IHRtdSA9IGMtPmFycmF5cy5hY3RpdmVUZXh0dXJlOworICAgIGFycmF5X3QqIGE7CisgICAgc3dpdGNoIChhcnJheSkgeworICAgIGNhc2UgR0xfQ09MT1JfQVJSQVk6ICAgICAgICAgICAgYSA9ICZjLT5hcnJheXMuY29sb3I7ICAgICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX05PUk1BTF9BUlJBWTogICAgICAgICAgIGEgPSAmYy0+YXJyYXlzLm5vcm1hbDsgICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZOiAgICBhID0gJmMtPmFycmF5cy50ZXh0dXJlW3RtdV07ICAgIGJyZWFrOworICAgIGNhc2UgR0xfVkVSVEVYX0FSUkFZOiAgICAgICAgICAgYSA9ICZjLT5hcnJheXMudmVydGV4OyAgICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGEtPmVuYWJsZSA9IGVuYWJsZSA/IEdMX1RSVUUgOiBHTF9GQUxTRTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIDAKKyNwcmFnbWEgbWFyayAtCisjcHJhZ21hIG1hcmsgVmVydGV4IENhY2hlCisjZW5kaWYKKworc3RhdGljIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSkKK3ZlcnRleF90KiBjYWNoZV92ZXJ0ZXgob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogdiwgdWludDMyX3QgaW5kZXgpCit7CisgICAgI2lmIFZDX0NBQ0hFX1NUQVRJU1RJQ1MKKyAgICAgICAgYy0+dmMubWlzc2VzKys7CisgICAgI2VuZGlmCisgICAgaWYgKGdnbF91bmxpa2VseSh2LT5sb2NrZWQpKSB7CisgICAgICAgIC8vIHdlJ3JlIGp1c3QgbG9va2luZyBmb3IgYW4gZW50cnkgaW4gdGhlIGNhY2hlIHRoYXQgaXMgbm90IGxvY2tlZC4KKyAgICAgICAgLy8gYW5kIHdlIGtub3cgdGhhdCB0aGVyZSBjYW5ub3QgYmUgbW9yZSB0aGFuIDIgbG9ja2VkIGVudHJpZXMKKyAgICAgICAgLy8gYmVjYXVzZSBhIHRyaWFuZ2xlIG5lZWRzIGF0IG1vc3QgMyB2ZXJ0aWNlcy4KKyAgICAgICAgLy8gV2UgbmV2ZXIgdXNlIHRoZSBmaXJzdCBhbmQgc2Vjb25kIGVudHJpZXMgYmVjYXVzZSB0aGV5IG1pZ2h0IGJlIGluCisgICAgICAgIC8vIHVzZSBieSB0aGUgc3RyaXBlciBvciBmYW5lci4gQW55IG90aGVyIGVudHJ5IHdpbGwgZG8gYXMgbG9uZyBhcworICAgICAgICAvLyBpdCdzIG5vdCBsb2NrZWQuCisgICAgICAgIC8vIFdlIGNvbXB1dGUgZGlyZWN0bHkgdGhlIGluZGV4IG9mIGEgImZyZWUiIGVudHJ5IGZyb20gdGhlIGxvY2tlZAorICAgICAgICAvLyBzdGF0ZSBvZiB2WzJdIGFuZCB2WzNdLgorICAgICAgICB2ID0gYy0+dmMudkJ1ZmZlciArIDI7CisgICAgICAgIHYgKz0gdlswXS5sb2NrZWQgfCAodlsxXS5sb2NrZWQ8PDEpOyAgICAgICAKKyAgICB9CisgICAgLy8gbm90ZTogY29tcGlsZUVsZW1lbnQgY2xlYXJzIHYtPmZsYWdzCisgICAgYy0+YXJyYXlzLmNvbXBpbGVFbGVtZW50KGMsIHYsIGluZGV4KTsKKyAgICB2LT5sb2NrZWQgPSAxOworICAgIHJldHVybiB2OworfQorCitzdGF0aWMgX19hdHRyaWJ1dGVfXygobm9pbmxpbmUpKQordmVydGV4X3QqIGZldGNoX3ZlcnRleChvZ2xlc19jb250ZXh0X3QqIGMsIHNpemVfdCBpbmRleCkKK3sKKyAgICBpbmRleCB8PSBjLT52Yy5zZXF1ZW5jZTsKKworI2lmIFZDX0NBQ0hFX1RZUEUgPT0gVkNfQ0FDSEVfVFlQRV9JTkRFWEVECisKKyAgICB2ZXJ0ZXhfdCogY29uc3QgdiA9IGMtPnZjLnZDYWNoZSArIAorICAgICAgICAgICAgKGluZGV4ICYgKHZlcnRleF9jYWNoZV90OjpWRVJURVhfQ0FDSEVfU0laRS0xKSk7CisKKyAgICBpZiAoZ2dsX2xpa2VseSh2LT5pbmRleCA9PSBpbmRleCkpIHsKKyAgICAgICAgdi0+bG9ja2VkID0gMTsKKyAgICAgICAgcmV0dXJuIHY7CisgICAgfQorICAgIHJldHVybiBjYWNoZV92ZXJ0ZXgoYywgdiwgaW5kZXgpOworCisjZWxpZiBWQ19DQUNIRV9UWVBFID09IFZDX0NBQ0hFX1RZUEVfTFJVCisKKyAgICB2ZXJ0ZXhfdCogdiA9IGMtPnZjLnZDYWNoZSArIAorICAgICAgICAgICAgKGluZGV4ICYgKCh2ZXJ0ZXhfY2FjaGVfdDo6VkVSVEVYX0NBQ0hFX1NJWkUtMSk+PjEpKSoyOworCisgICAgLy8gYWx3YXlzIHJlY29yZCBMUlUgaW4gdlswXQorICAgIGlmIChnZ2xfbGlrZWx5KHZbMF0uaW5kZXggPT0gaW5kZXgpKSB7CisgICAgICAgIHZbMF0ubG9ja2VkID0gMTsKKyAgICAgICAgdlswXS5tcnUgPSAwOworICAgICAgICByZXR1cm4gJnZbMF07CisgICAgfQorCisgICAgaWYgKGdnbF9saWtlbHkodlsxXS5pbmRleCA9PSBpbmRleCkpIHsKKyAgICAgICAgdlsxXS5sb2NrZWQgPSAxOworICAgICAgICB2WzBdLm1ydSA9IDE7CisgICAgICAgIHJldHVybiAmdlsxXTsKKyAgICB9CisKKyAgICBjb25zdCBpbnQgbHJ1ID0gMSAtIHZbMF0ubXJ1OworICAgIHZbMF0ubXJ1ID0gbHJ1OworICAgIHJldHVybiBjYWNoZV92ZXJ0ZXgoYywgJnZbbHJ1XSwgaW5kZXgpOworCisjZWxpZiBWQ19DQUNIRV9UWVBFID09IFZDX0NBQ0hFX1RZUEVfTk9ORQorCisgICAgLy8ganVzdCBmb3IgZGVidWdnaW5nLi4uCisgICAgdmVydGV4X3QqIHYgPSBjLT52Yy52QnVmZmVyICsgMjsKKyAgICByZXR1cm4gY2FjaGVfdmVydGV4KGMsIHYsIGluZGV4KTsKKworI2VuZGlmCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZiAwCisjcHJhZ21hIG1hcmsgLQorI3ByYWdtYSBtYXJrIFByaW1pdGl2ZSBBc3NlbWJseQorI2VuZGlmCisKK3ZvaWQgZHJhd1ByaW1pdGl2ZXNQb2ludHMob2dsZXNfY29udGV4dF90KiBjLCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCkKK3sKKyAgICBpZiAoZ2dsX3VubGlrZWx5KGNvdW50IDwgMSkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIHZlcnRleCBjYWNoZSBzaXplIG11c3QgYmUgbXVsdGlwbGUgb2YgMQorICAgIGNvbnN0IEdMc2l6ZWkgdmNzID0gCisgICAgICAgICAgICAodmVydGV4X2NhY2hlX3Q6OlZFUlRFWF9CVUZGRVJfU0laRSArCisgICAgICAgICAgICAgdmVydGV4X2NhY2hlX3Q6OlZFUlRFWF9DQUNIRV9TSVpFKTsKKyAgICBkbyB7CisgICAgICAgIHZlcnRleF90KiB2ID0gYy0+dmMudkJ1ZmZlcjsKKyAgICAgICAgR0xzaXplaSBudW0gPSBjb3VudCA+IHZjcyA/IHZjcyA6IGNvdW50OyAKKyAgICAgICAgYy0+YXJyYXlzLmN1bGwgPSB2ZXJ0ZXhfdDo6Q0xJUF9BTEw7CisgICAgICAgIGMtPmFycmF5cy5jb21waWxlRWxlbWVudHMoYywgdiwgZmlyc3QsIG51bSk7CisgICAgICAgIGZpcnN0ICs9IG51bTsKKyAgICAgICAgY291bnQgLT0gbnVtOworICAgICAgICBpZiAoIWMtPmFycmF5cy5jdWxsKSB7CisgICAgICAgICAgICAvLyBxdWljay90cml2aWFsIHJlamVjdCBvZiB0aGUgd2hvbGUgYmF0Y2gKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBjYyA9IHZbMF0uZmxhZ3M7CisgICAgICAgICAgICAgICAgaWYgKGdnbF9saWtlbHkoIShjYyAmIHZlcnRleF90OjpDTElQX0FMTCkpKQorICAgICAgICAgICAgICAgICAgICBjLT5wcmltcy5yZW5kZXJQb2ludChjLCB2KTsKKyAgICAgICAgICAgICAgICB2Kys7CisgICAgICAgICAgICAgICAgbnVtLS07CisgICAgICAgICAgICB9IHdoaWxlIChudW0pOworICAgICAgICB9CisgICAgfSB3aGlsZSAoY291bnQpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgZHJhd1ByaW1pdGl2ZXNMaW5lU3RyaXAob2dsZXNfY29udGV4dF90KiBjLCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCkKK3sKKyAgICBpZiAoZ2dsX3VubGlrZWx5KGNvdW50IDwgMikpCisgICAgICAgIHJldHVybjsKKworICAgIHZlcnRleF90ICp2LCAqdjAsICp2MTsKKyAgICBjLT5hcnJheXMuY3VsbCA9IHZlcnRleF90OjpDTElQX0FMTDsKKyAgICBjLT5hcnJheXMuY29tcGlsZUVsZW1lbnQoYywgYy0+dmMudkJ1ZmZlciwgZmlyc3QpOworICAgIGZpcnN0ICs9IDE7CisgICAgY291bnQgLT0gMTsKKworICAgIC8vIHZlcnRleCBjYWNoZSBzaXplIG11c3QgYmUgbXVsdGlwbGUgb2YgMQorICAgIGNvbnN0IEdMc2l6ZWkgdmNzID0gCisgICAgICAgICh2ZXJ0ZXhfY2FjaGVfdDo6VkVSVEVYX0JVRkZFUl9TSVpFICsKKyAgICAgICAgIHZlcnRleF9jYWNoZV90OjpWRVJURVhfQ0FDSEVfU0laRSAtIDEpOworICAgIGRvIHsKKyAgICAgICAgdjAgPSBjLT52Yy52QnVmZmVyICsgMDsgCisgICAgICAgIHYgID0gYy0+dmMudkJ1ZmZlciArIDE7CisgICAgICAgIEdMc2l6ZWkgbnVtID0gY291bnQgPiB2Y3MgPyB2Y3MgOiBjb3VudDsgCisgICAgICAgIGMtPmFycmF5cy5jb21waWxlRWxlbWVudHMoYywgdiwgZmlyc3QsIG51bSk7CisgICAgICAgIGZpcnN0ICs9IG51bTsKKyAgICAgICAgY291bnQgLT0gbnVtOworICAgICAgICBpZiAoIWMtPmFycmF5cy5jdWxsKSB7CisgICAgICAgICAgICAvLyBxdWljay90cml2aWFsIHJlamVjdCBvZiB0aGUgd2hvbGUgYmF0Y2gKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICB2MSA9IHYrKzsKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBjYyA9IHYwLT5mbGFncyAmIHYxLT5mbGFnczsKKyAgICAgICAgICAgICAgICBpZiAoZ2dsX2xpa2VseSghKGNjICYgdmVydGV4X3Q6OkNMSVBfQUxMKSkpCisgICAgICAgICAgICAgICAgICAgIGMtPnByaW1zLnJlbmRlckxpbmUoYywgdjAsIHYxKTsKKyAgICAgICAgICAgICAgICB2MCA9IHYxOworICAgICAgICAgICAgICAgIG51bS0tOworICAgICAgICAgICAgfSB3aGlsZSAobnVtKTsKKyAgICAgICAgfQorICAgICAgICAvLyBjb3B5IGJhY2sgdGhlIGxhc3QgcHJvY2Vzc2VkIHZlcnRleAorICAgICAgICBjLT52Yy52QnVmZmVyWzBdID0gKnYwOworICAgICAgICBjLT5hcnJheXMuY3VsbCA9IHYwLT5mbGFncyAmIHZlcnRleF90OjpDTElQX0FMTDsKKyAgICB9IHdoaWxlIChjb3VudCk7Cit9CisKK3ZvaWQgZHJhd1ByaW1pdGl2ZXNMaW5lTG9vcChvZ2xlc19jb250ZXh0X3QqIGMsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50KQoreworICAgIGlmIChnZ2xfdW5saWtlbHkoY291bnQgPCAyKSkKKyAgICAgICAgcmV0dXJuOworICAgIGRyYXdQcmltaXRpdmVzTGluZVN0cmlwKGMsIGZpcnN0LCBjb3VudCk7CisgICAgaWYgKGdnbF9saWtlbHkoY291bnQgPj0gMykpIHsKKyAgICAgICAgdmVydGV4X3QqIHYwID0gYy0+dmMudkJ1ZmZlcjsgCisgICAgICAgIHZlcnRleF90KiB2MSA9IGMtPnZjLnZCdWZmZXIgKyAxOworICAgICAgICBjLT5hcnJheXMuY29tcGlsZUVsZW1lbnQoYywgdjEsIGZpcnN0KTsKKyAgICAgICAgY29uc3QgdWludDMyX3QgY2MgPSB2MC0+ZmxhZ3MgJiB2MS0+ZmxhZ3M7CisgICAgICAgIGlmIChnZ2xfbGlrZWx5KCEoY2MgJiB2ZXJ0ZXhfdDo6Q0xJUF9BTEwpKSkKKyAgICAgICAgICAgIGMtPnByaW1zLnJlbmRlckxpbmUoYywgdjAsIHYxKTsKKyAgICB9Cit9CisKK3ZvaWQgZHJhd1ByaW1pdGl2ZXNMaW5lcyhvZ2xlc19jb250ZXh0X3QqIGMsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50KQoreworICAgIGlmIChnZ2xfdW5saWtlbHkoY291bnQgPCAyKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gdmVydGV4IGNhY2hlIHNpemUgbXVzdCBiZSBtdWx0aXBsZSBvZiAyCisgICAgY29uc3QgR0xzaXplaSB2Y3MgPSAKKyAgICAgICAgKCh2ZXJ0ZXhfY2FjaGVfdDo6VkVSVEVYX0JVRkZFUl9TSVpFICsKKyAgICAgICAgdmVydGV4X2NhY2hlX3Q6OlZFUlRFWF9DQUNIRV9TSVpFKSAvIDIpICogMjsKKyAgICBkbyB7CisgICAgICAgIHZlcnRleF90KiB2ID0gYy0+dmMudkJ1ZmZlcjsKKyAgICAgICAgR0xzaXplaSBudW0gPSBjb3VudCA+IHZjcyA/IHZjcyA6IGNvdW50OyAKKyAgICAgICAgYy0+YXJyYXlzLmN1bGwgPSB2ZXJ0ZXhfdDo6Q0xJUF9BTEw7CisgICAgICAgIGMtPmFycmF5cy5jb21waWxlRWxlbWVudHMoYywgdiwgZmlyc3QsIG51bSk7CisgICAgICAgIGZpcnN0ICs9IG51bTsKKyAgICAgICAgY291bnQgLT0gbnVtOworICAgICAgICBpZiAoIWMtPmFycmF5cy5jdWxsKSB7CisgICAgICAgICAgICAvLyBxdWljay90cml2aWFsIHJlamVjdCBvZiB0aGUgd2hvbGUgYmF0Y2gKKyAgICAgICAgICAgIG51bSAtPSAyOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGNjID0gdlswXS5mbGFncyAmIHZbMV0uZmxhZ3M7CisgICAgICAgICAgICAgICAgaWYgKGdnbF9saWtlbHkoIShjYyAmIHZlcnRleF90OjpDTElQX0FMTCkpKQorICAgICAgICAgICAgICAgICAgICBjLT5wcmltcy5yZW5kZXJMaW5lKGMsIHYsIHYrMSk7CisgICAgICAgICAgICAgICAgdiArPSAyOworICAgICAgICAgICAgICAgIG51bSAtPSAyOworICAgICAgICAgICAgfSB3aGlsZSAobnVtID49IDApOworICAgICAgICB9CisgICAgfSB3aGlsZSAoY291bnQgPj0gMik7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgZHJhd1ByaW1pdGl2ZXNUcmlhbmdsZUZhbk9yU3RyaXAob2dsZXNfY29udGV4dF90KiBjLAorICAgICAgICBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCwgaW50IHdpbmRpbmcpCit7CisgICAgLy8gd2luZGluZyA9PSAyIDogZmFuCisgICAgLy8gd2luZGluZyA9PSAxIDogc3RyaXAKKworICAgIGlmIChnZ2xfdW5saWtlbHkoY291bnQgPCAzKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgdmVydGV4X3QgKnYsICp2MCwgKnYxLCAqdjI7CisgICAgYy0+YXJyYXlzLmN1bGwgPSB2ZXJ0ZXhfdDo6Q0xJUF9BTEw7CisgICAgYy0+YXJyYXlzLmNvbXBpbGVFbGVtZW50cyhjLCBjLT52Yy52QnVmZmVyLCBmaXJzdCwgMik7CisgICAgZmlyc3QgKz0gMjsKKyAgICBjb3VudCAtPSAyOworCisgICAgLy8gdmVydGV4IGNhY2hlIHNpemUgbXVzdCBiZSBtdWx0aXBsZSBvZiAyLiBUaGlzIGlzIGV4dHJlbWVseSBpbXBvcnRhbnQKKyAgICAvLyBiZWNhdXNlIGl0IGFsbG93cyB1cyB0byBwcmVzZXJ2ZSB0aGUgc2FtZSB3aW5kaW5nIHdoZW4gdGhlIHdob2xlCisgICAgLy8gYmF0Y2ggaXMgY3VsbGVkLiBXZSBhbHNvIG5lZWQgMiBleHRyYSB2ZXJ0aWNlcyBpbiB0aGUgYXJyYXksIGJlY2F1c2UKKyAgICAvLyB3ZSBhbHdheXMga2VlcCB0aGUgdHdvIGZpcnN0IG9uZXMuCisgICAgY29uc3QgR0xzaXplaSB2Y3MgPSAKKyAgICAgICAgKCh2ZXJ0ZXhfY2FjaGVfdDo6VkVSVEVYX0JVRkZFUl9TSVpFICsKKyAgICAgICAgICB2ZXJ0ZXhfY2FjaGVfdDo6VkVSVEVYX0NBQ0hFX1NJWkUgLSAyKSAvIDIpICogMjsKKyAgICBkbyB7CisgICAgICAgIHYwID0gYy0+dmMudkJ1ZmZlciArIDA7IAorICAgICAgICB2MSA9IGMtPnZjLnZCdWZmZXIgKyAxOyAKKyAgICAgICAgdiAgPSBjLT52Yy52QnVmZmVyICsgMjsKKyAgICAgICAgR0xzaXplaSBudW0gPSBjb3VudCA+IHZjcyA/IHZjcyA6IGNvdW50OyAKKyAgICAgICAgYy0+YXJyYXlzLmNvbXBpbGVFbGVtZW50cyhjLCB2LCBmaXJzdCwgbnVtKTsKKyAgICAgICAgZmlyc3QgKz0gbnVtOworICAgICAgICBjb3VudCAtPSBudW07CisgICAgICAgIGlmICghYy0+YXJyYXlzLmN1bGwpIHsKKyAgICAgICAgICAgIC8vIHF1aWNrL3RyaXZpYWwgcmVqZWN0IG9mIHRoZSB3aG9sZSBiYXRjaAorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIHYyID0gdisrOworICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGNjID0gdjAtPmZsYWdzICYgdjEtPmZsYWdzICYgdjItPmZsYWdzOworICAgICAgICAgICAgICAgIGlmIChnZ2xfbGlrZWx5KCEoY2MgJiB2ZXJ0ZXhfdDo6Q0xJUF9BTEwpKSkKKyAgICAgICAgICAgICAgICAgICAgYy0+cHJpbXMucmVuZGVyVHJpYW5nbGUoYywgdjAsIHYxLCB2Mik7CisgICAgICAgICAgICAgICAgc3dhcCgoKHdpbmRpbmdePTEpID8gdjEgOiB2MCksIHYyKTsKKyAgICAgICAgICAgICAgICBudW0tLTsKKyAgICAgICAgICAgIH0gd2hpbGUgKG51bSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvdW50KSB7CisgICAgICAgICAgICB2MCA9IGMtPnZjLnZCdWZmZXIgKyAyICsgbnVtIC0gMjsKKyAgICAgICAgICAgIHYxID0gYy0+dmMudkJ1ZmZlciArIDIgKyBudW0gLSAxOworICAgICAgICAgICAgaWYgKCh3aW5kaW5nJjIpID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBmb3Igc3RyaXBzIGNvcHkgYmFjayB0aGUgdHdvIGxhc3QgY29tcGlsZWQgdmVydGljZXMKKyAgICAgICAgICAgICAgICBjLT52Yy52QnVmZmVyWzBdID0gKnYwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYy0+dmMudkJ1ZmZlclsxXSA9ICp2MTsKKyAgICAgICAgICAgIGMtPmFycmF5cy5jdWxsID0gdjAtPmZsYWdzICYgdjEtPmZsYWdzICYgdmVydGV4X3Q6OkNMSVBfQUxMOworICAgICAgICB9CisgICAgfSB3aGlsZSAoY291bnQgPiAwKTsKK30KKwordm9pZCBkcmF3UHJpbWl0aXZlc1RyaWFuZ2xlU3RyaXAob2dsZXNfY29udGV4dF90KiBjLCAKKyAgICAgICAgR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQpIHsKKyAgICBkcmF3UHJpbWl0aXZlc1RyaWFuZ2xlRmFuT3JTdHJpcChjLCBmaXJzdCwgY291bnQsIDEpOworfQorCit2b2lkIGRyYXdQcmltaXRpdmVzVHJpYW5nbGVGYW4ob2dsZXNfY29udGV4dF90KiBjLAorICAgICAgICBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCkgeworICAgIGRyYXdQcmltaXRpdmVzVHJpYW5nbGVGYW5PclN0cmlwKGMsIGZpcnN0LCBjb3VudCwgMik7Cit9CisKK3ZvaWQgZHJhd1ByaW1pdGl2ZXNUcmlhbmdsZXMob2dsZXNfY29udGV4dF90KiBjLCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCkKK3sKKyAgICBpZiAoZ2dsX3VubGlrZWx5KGNvdW50IDwgMykpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIHZlcnRleCBjYWNoZSBzaXplIG11c3QgYmUgbXVsdGlwbGUgb2YgMworICAgIGNvbnN0IEdMc2l6ZWkgdmNzID0gCisgICAgICAgICgodmVydGV4X2NhY2hlX3Q6OlZFUlRFWF9CVUZGRVJfU0laRSArCisgICAgICAgIHZlcnRleF9jYWNoZV90OjpWRVJURVhfQ0FDSEVfU0laRSkgLyAzKSAqIDM7CisgICAgZG8geworICAgICAgICB2ZXJ0ZXhfdCogdiA9IGMtPnZjLnZCdWZmZXI7CisgICAgICAgIEdMc2l6ZWkgbnVtID0gY291bnQgPiB2Y3MgPyB2Y3MgOiBjb3VudDsgCisgICAgICAgIGMtPmFycmF5cy5jdWxsID0gdmVydGV4X3Q6OkNMSVBfQUxMOworICAgICAgICBjLT5hcnJheXMuY29tcGlsZUVsZW1lbnRzKGMsIHYsIGZpcnN0LCBudW0pOworICAgICAgICBmaXJzdCArPSBudW07CisgICAgICAgIGNvdW50IC09IG51bTsKKyAgICAgICAgaWYgKCFjLT5hcnJheXMuY3VsbCkgeworICAgICAgICAgICAgLy8gcXVpY2svdHJpdmlhbCByZWplY3Qgb2YgdGhlIHdob2xlIGJhdGNoCisgICAgICAgICAgICBudW0gLT0gMzsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBjYyA9IHZbMF0uZmxhZ3MgJiB2WzFdLmZsYWdzICYgdlsyXS5mbGFnczsKKyAgICAgICAgICAgICAgICBpZiAoZ2dsX2xpa2VseSghKGNjICYgdmVydGV4X3Q6OkNMSVBfQUxMKSkpCisgICAgICAgICAgICAgICAgICAgIGMtPnByaW1zLnJlbmRlclRyaWFuZ2xlKGMsIHYsIHYrMSwgdisyKTsKKyAgICAgICAgICAgICAgICB2ICs9IDM7CisgICAgICAgICAgICAgICAgbnVtIC09IDM7CisgICAgICAgICAgICB9IHdoaWxlIChudW0gPj0gMCk7CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChjb3VudCA+PSAzKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIDAKKyNwcmFnbWEgbWFyayAtCisjZW5kaWYKKworLy8gdGhpcyBsb29rcyBnb29meSwgYnV0IGdjYyBkb2VzIGEgZ3JlYXQgam9iIHdpdGggdGhpcy4uLgorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgcmVhZF9pbmRleChpbnQgdHlwZSwgY29uc3QgR0x2b2lkKiYgcCkgeworICAgIHVuc2lnbmVkIGludCByOworICAgIGlmICh0eXBlKSB7CisgICAgICAgIHIgPSAqKGNvbnN0IEdMdWJ5dGUqKXA7CisgICAgICAgIHAgPSAoY29uc3QgR0x1Ynl0ZSopcCArIDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgciA9ICooY29uc3QgR0x1c2hvcnQqKXA7CisgICAgICAgIHAgPSAoY29uc3QgR0x1c2hvcnQqKXAgKyAxOworICAgIH0KKyAgICByZXR1cm4gcjsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIGRyYXdJbmRleGVkUHJpbWl0aXZlc1BvaW50cyhvZ2xlc19jb250ZXh0X3QqIGMsCisgICAgICAgIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdm9pZCAqaW5kaWNlcykKK3sKKyAgICBpZiAoZ2dsX3VubGlrZWx5KGNvdW50IDwgMSkpCisgICAgICAgIHJldHVybjsKKyAgICBjb25zdCBpbnQgdHlwZSA9IChjLT5hcnJheXMuaW5kaWNlc1R5cGUgPT0gR0xfVU5TSUdORURfQllURSk7CisgICAgZG8geworICAgICAgICB2ZXJ0ZXhfdCAqIHYgPSBmZXRjaF92ZXJ0ZXgoYywgcmVhZF9pbmRleCh0eXBlLCBpbmRpY2VzKSk7CisgICAgICAgIGlmIChnZ2xfbGlrZWx5KCEodi0+ZmxhZ3MgJiB2ZXJ0ZXhfdDo6Q0xJUF9BTEwpKSkKKyAgICAgICAgICAgIGMtPnByaW1zLnJlbmRlclBvaW50KGMsIHYpOworICAgICAgICB2LT5sb2NrZWQgPSAwOworICAgICAgICBjb3VudC0tOworICAgIH0gd2hpbGUoY291bnQpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgZHJhd0luZGV4ZWRQcmltaXRpdmVzTGluZVN0cmlwKG9nbGVzX2NvbnRleHRfdCogYywKKyAgICAgICAgR0xzaXplaSBjb3VudCwgY29uc3QgR0x2b2lkICppbmRpY2VzKQoreworICAgIGlmIChnZ2xfdW5saWtlbHkoY291bnQgPCAyKSkKKyAgICAgICAgcmV0dXJuOworICAgIAorICAgIHZlcnRleF90ICogY29uc3QgdiA9IGMtPnZjLnZCdWZmZXI7CisgICAgdmVydGV4X3QqIHYwID0gdjsKKyAgICB2ZXJ0ZXhfdCogdjE7CisgICAgCisgICAgY29uc3QgaW50IHR5cGUgPSAoYy0+YXJyYXlzLmluZGljZXNUeXBlID09IEdMX1VOU0lHTkVEX0JZVEUpOworICAgIGMtPmFycmF5cy5jb21waWxlRWxlbWVudChjLCB2MCwgcmVhZF9pbmRleCh0eXBlLCBpbmRpY2VzKSk7CisgICAgY291bnQgLT0gMTsKKyAgICBkbyB7CisgICAgICAgIHYxID0gZmV0Y2hfdmVydGV4KGMsIHJlYWRfaW5kZXgodHlwZSwgaW5kaWNlcykpOworICAgICAgICBjb25zdCB1aW50MzJfdCBjYyA9IHYwLT5mbGFncyAmIHYxLT5mbGFnczsKKyAgICAgICAgaWYgKGdnbF9saWtlbHkoIShjYyAmIHZlcnRleF90OjpDTElQX0FMTCkpKQorICAgICAgICAgICAgYy0+cHJpbXMucmVuZGVyTGluZShjLCB2MCwgdjEpOworICAgICAgICB2MC0+bG9ja2VkID0gMDsKKyAgICAgICAgdjAgPSB2MTsKKyAgICAgICAgY291bnQtLTsKKyAgICB9IHdoaWxlIChjb3VudCk7CisgICAgdjEtPmxvY2tlZCA9IDA7Cit9CisKK3ZvaWQgZHJhd0luZGV4ZWRQcmltaXRpdmVzTGluZUxvb3Aob2dsZXNfY29udGV4dF90KiBjLAorICAgICAgICBHTHNpemVpIGNvdW50LCBjb25zdCBHTHZvaWQgKmluZGljZXMpCit7CisgICAgaWYgKGdnbF91bmxpa2VseShjb3VudCA8PSAyKSkgeworICAgICAgICBkcmF3SW5kZXhlZFByaW1pdGl2ZXNMaW5lcyhjLCBjb3VudCwgaW5kaWNlcyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgCisgICAgdmVydGV4X3QgKiBjb25zdCB2ID0gYy0+dmMudkJ1ZmZlcjsKKyAgICB2ZXJ0ZXhfdCogdjAgPSB2OworICAgIHZlcnRleF90KiB2MTsKKyAgICAKKyAgICBjb25zdCBpbnQgdHlwZSA9IChjLT5hcnJheXMuaW5kaWNlc1R5cGUgPT0gR0xfVU5TSUdORURfQllURSk7CisgICAgYy0+YXJyYXlzLmNvbXBpbGVFbGVtZW50KGMsIHYwLCByZWFkX2luZGV4KHR5cGUsIGluZGljZXMpKTsKKyAgICBjb3VudCAtPSAxOworICAgIGRvIHsKKyAgICAgICAgdjEgPSBmZXRjaF92ZXJ0ZXgoYywgcmVhZF9pbmRleCh0eXBlLCBpbmRpY2VzKSk7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IGNjID0gdjAtPmZsYWdzICYgdjEtPmZsYWdzOworICAgICAgICBpZiAoZ2dsX2xpa2VseSghKGNjICYgdmVydGV4X3Q6OkNMSVBfQUxMKSkpCisgICAgICAgICAgICBjLT5wcmltcy5yZW5kZXJMaW5lKGMsIHYwLCB2MSk7CisgICAgICAgIHYwLT5sb2NrZWQgPSAwOworICAgICAgICB2MCA9IHYxOworICAgICAgICBjb3VudC0tOworICAgIH0gd2hpbGUgKGNvdW50KTsKKyAgICB2MS0+bG9ja2VkID0gMDsKKworICAgIHYxID0gYy0+dmMudkJ1ZmZlcjsgCisgICAgY29uc3QgdWludDMyX3QgY2MgPSB2MC0+ZmxhZ3MgJiB2MS0+ZmxhZ3M7CisgICAgaWYgKGdnbF9saWtlbHkoIShjYyAmIHZlcnRleF90OjpDTElQX0FMTCkpKQorICAgICAgICBjLT5wcmltcy5yZW5kZXJMaW5lKGMsIHYwLCB2MSk7Cit9CisKK3ZvaWQgZHJhd0luZGV4ZWRQcmltaXRpdmVzTGluZXMob2dsZXNfY29udGV4dF90KiBjLAorICAgICAgICBHTHNpemVpIGNvdW50LCBjb25zdCBHTHZvaWQgKmluZGljZXMpCit7CisgICAgaWYgKGdnbF91bmxpa2VseShjb3VudCA8IDIpKQorICAgICAgICByZXR1cm47CisKKyAgICBjb3VudCAtPSAyOworICAgIGNvbnN0IGludCB0eXBlID0gKGMtPmFycmF5cy5pbmRpY2VzVHlwZSA9PSBHTF9VTlNJR05FRF9CWVRFKTsKKyAgICBkbyB7CisgICAgICAgIHZlcnRleF90KiBjb25zdCB2MCA9IGZldGNoX3ZlcnRleChjLCByZWFkX2luZGV4KHR5cGUsIGluZGljZXMpKTsKKyAgICAgICAgdmVydGV4X3QqIGNvbnN0IHYxID0gZmV0Y2hfdmVydGV4KGMsIHJlYWRfaW5kZXgodHlwZSwgaW5kaWNlcykpOworICAgICAgICBjb25zdCB1aW50MzJfdCBjYyA9IHYwLT5mbGFncyAmIHYxLT5mbGFnczsKKyAgICAgICAgaWYgKGdnbF9saWtlbHkoIShjYyAmIHZlcnRleF90OjpDTElQX0FMTCkpKQorICAgICAgICAgICAgYy0+cHJpbXMucmVuZGVyTGluZShjLCB2MCwgdjEpOworICAgICAgICB2MC0+bG9ja2VkID0gMDsKKyAgICAgICAgdjEtPmxvY2tlZCA9IDA7CisgICAgICAgIGNvdW50IC09IDI7CisgICAgfSB3aGlsZSAoY291bnQgPj0gMCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgZHJhd0luZGV4ZWRQcmltaXRpdmVzVHJpYW5nbGVGYW5PclN0cmlwKG9nbGVzX2NvbnRleHRfdCogYywKKyAgICAgICAgR0xzaXplaSBjb3VudCwgY29uc3QgR0x2b2lkICppbmRpY2VzLCBpbnQgd2luZGluZykKK3sKKyAgICAvLyB3aW5kaW5nID09IDIgOiBmYW4KKyAgICAvLyB3aW5kaW5nID09IDEgOiBzdHJpcAorCisgICAgaWYgKGdnbF91bmxpa2VseShjb3VudCA8IDMpKQorICAgICAgICByZXR1cm47CisgICAgCisgICAgdmVydGV4X3QgKiBjb25zdCB2ID0gYy0+dmMudkJ1ZmZlcjsKKyAgICB2ZXJ0ZXhfdCogdjAgPSB2OworICAgIHZlcnRleF90KiB2MSA9IHYrMTsKKyAgICB2ZXJ0ZXhfdCogdjI7CisKKyAgICBjb25zdCBpbnQgdHlwZSA9IChjLT5hcnJheXMuaW5kaWNlc1R5cGUgPT0gR0xfVU5TSUdORURfQllURSk7CisgICAgYy0+YXJyYXlzLmNvbXBpbGVFbGVtZW50KGMsIHYwLCByZWFkX2luZGV4KHR5cGUsIGluZGljZXMpKTsKKyAgICBjLT5hcnJheXMuY29tcGlsZUVsZW1lbnQoYywgdjEsIHJlYWRfaW5kZXgodHlwZSwgaW5kaWNlcykpOworICAgIGNvdW50IC09IDI7CisKKyAgICAvLyBub3RlOiBHQ0MgNC4xLjEgaGVyZSBtYWtlcyBhIHByZXR5IGludGVyZXN0aW5nIG9wdGltaXphdGlvbgorICAgIC8vIHdoZXJlIGl0IGR1cGxpY2F0ZXMgdGhlIGxvb3AgYmVsb3cgYmFzZWQgb24gYy0+YXJyYXlzLmluZGljZXNUeXBlCisKKyAgICBkbyB7CisgICAgICAgIHYyID0gZmV0Y2hfdmVydGV4KGMsIHJlYWRfaW5kZXgodHlwZSwgaW5kaWNlcykpOworICAgICAgICBjb25zdCB1aW50MzJfdCBjYyA9IHYwLT5mbGFncyAmIHYxLT5mbGFncyAmIHYyLT5mbGFnczsKKyAgICAgICAgaWYgKGdnbF9saWtlbHkoIShjYyAmIHZlcnRleF90OjpDTElQX0FMTCkpKQorICAgICAgICAgICAgYy0+cHJpbXMucmVuZGVyVHJpYW5nbGUoYywgdjAsIHYxLCB2Mik7CisgICAgICAgIHZlcnRleF90KiAmIGNvbnN1bWVkID0gKCh3aW5kaW5nXj0xKSA/IHYxIDogdjApOworICAgICAgICBjb25zdW1lZC0+bG9ja2VkID0gMDsKKyAgICAgICAgY29uc3VtZWQgPSB2MjsKKyAgICAgICAgY291bnQtLTsKKyAgICB9IHdoaWxlIChjb3VudCk7CisgICAgdjAtPmxvY2tlZCA9IHYxLT5sb2NrZWQgPSAwOworICAgIHYyLT5sb2NrZWQgPSAwOworfQorCit2b2lkIGRyYXdJbmRleGVkUHJpbWl0aXZlc1RyaWFuZ2xlU3RyaXAob2dsZXNfY29udGV4dF90KiBjLAorICAgICAgICBHTHNpemVpIGNvdW50LCBjb25zdCBHTHZvaWQgKmluZGljZXMpIHsKKyAgICBkcmF3SW5kZXhlZFByaW1pdGl2ZXNUcmlhbmdsZUZhbk9yU3RyaXAoYywgY291bnQsIGluZGljZXMsIDEpOworfQorCit2b2lkIGRyYXdJbmRleGVkUHJpbWl0aXZlc1RyaWFuZ2xlRmFuKG9nbGVzX2NvbnRleHRfdCogYywKKyAgICAgICAgR0xzaXplaSBjb3VudCwgY29uc3QgR0x2b2lkICppbmRpY2VzKSB7CisgICAgZHJhd0luZGV4ZWRQcmltaXRpdmVzVHJpYW5nbGVGYW5PclN0cmlwKGMsIGNvdW50LCBpbmRpY2VzLCAyKTsKK30KKwordm9pZCBkcmF3SW5kZXhlZFByaW1pdGl2ZXNUcmlhbmdsZXMob2dsZXNfY29udGV4dF90KiBjLAorICAgICAgICBHTHNpemVpIGNvdW50LCBjb25zdCBHTHZvaWQgKmluZGljZXMpCit7CisgICAgaWYgKGdnbF91bmxpa2VseShjb3VudCA8IDMpKQorICAgICAgICByZXR1cm47CisKKyAgICBjb3VudCAtPSAzOworICAgIGlmIChnZ2xfbGlrZWx5KGMtPmFycmF5cy5pbmRpY2VzVHlwZSA9PSBHTF9VTlNJR05FRF9TSE9SVCkpIHsKKyAgICAgICAgLy8gVGhpcyBjYXNlIGlzIHByb2JhYmx5IG91ciBtb3N0IGNvbW1vbiBjYXNlLi4uCisgICAgICAgIHVpbnQxNl90IGNvbnN0ICogcCA9ICh1aW50MTZfdCBjb25zdCAqKWluZGljZXM7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHZlcnRleF90KiBjb25zdCB2MCA9IGZldGNoX3ZlcnRleChjLCAqcCsrKTsKKyAgICAgICAgICAgIHZlcnRleF90KiBjb25zdCB2MSA9IGZldGNoX3ZlcnRleChjLCAqcCsrKTsKKyAgICAgICAgICAgIHZlcnRleF90KiBjb25zdCB2MiA9IGZldGNoX3ZlcnRleChjLCAqcCsrKTsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGNjID0gdjAtPmZsYWdzICYgdjEtPmZsYWdzICYgdjItPmZsYWdzOworICAgICAgICAgICAgaWYgKGdnbF9saWtlbHkoIShjYyAmIHZlcnRleF90OjpDTElQX0FMTCkpKQorICAgICAgICAgICAgICAgIGMtPnByaW1zLnJlbmRlclRyaWFuZ2xlKGMsIHYwLCB2MSwgdjIpOworICAgICAgICAgICAgdjAtPmxvY2tlZCA9IDA7CisgICAgICAgICAgICB2MS0+bG9ja2VkID0gMDsKKyAgICAgICAgICAgIHYyLT5sb2NrZWQgPSAwOworICAgICAgICAgICAgY291bnQgLT0gMzsKKyAgICAgICAgfSB3aGlsZSAoY291bnQgPj0gMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdWludDhfdCBjb25zdCAqIHAgPSAodWludDhfdCBjb25zdCAqKWluZGljZXM7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHZlcnRleF90KiBjb25zdCB2MCA9IGZldGNoX3ZlcnRleChjLCAqcCsrKTsKKyAgICAgICAgICAgIHZlcnRleF90KiBjb25zdCB2MSA9IGZldGNoX3ZlcnRleChjLCAqcCsrKTsKKyAgICAgICAgICAgIHZlcnRleF90KiBjb25zdCB2MiA9IGZldGNoX3ZlcnRleChjLCAqcCsrKTsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGNjID0gdjAtPmZsYWdzICYgdjEtPmZsYWdzICYgdjItPmZsYWdzOworICAgICAgICAgICAgaWYgKGdnbF9saWtlbHkoIShjYyAmIHZlcnRleF90OjpDTElQX0FMTCkpKQorICAgICAgICAgICAgICAgIGMtPnByaW1zLnJlbmRlclRyaWFuZ2xlKGMsIHYwLCB2MSwgdjIpOworICAgICAgICAgICAgdjAtPmxvY2tlZCA9IDA7CisgICAgICAgICAgICB2MS0+bG9ja2VkID0gMDsKKyAgICAgICAgICAgIHYyLT5sb2NrZWQgPSAwOworICAgICAgICAgICAgY291bnQgLT0gMzsKKyAgICAgICAgfSB3aGlsZSAoY291bnQgPj0gMCk7CisgICAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgMAorI3ByYWdtYSBtYXJrIC0KKyNwcmFnbWEgbWFyayBBcnJheSBjb21waWxlcnMKKyNlbmRpZgorCit2b2lkIGNvbXBpbGVFbGVtZW50X19nZW5lcmljKG9nbGVzX2NvbnRleHRfdCogYywKKyAgICAgICAgdmVydGV4X3QqIHYsIEdMaW50IGZpcnN0KQoreworICAgIHYtPmZsYWdzID0gMDsKKyAgICB2LT5pbmRleCA9IGZpcnN0OworICAgIGZpcnN0ICY9IHZlcnRleF9jYWNoZV90OjpJTkRFWF9NQVNLOworICAgIGNvbnN0IEdMdWJ5dGUqIHZwID0gYy0+YXJyYXlzLnZlcnRleC5lbGVtZW50KGZpcnN0KTsKKyAgICBjLT5hcnJheXMudmVydGV4LmZldGNoKGMsIHYtPm9iai52LCB2cCk7CisgICAgYy0+YXJyYXlzLm12cF90cmFuc2Zvcm0oJmMtPnRyYW5zZm9ybXMubXZwLCAmdi0+Y2xpcCwgJnYtPm9iaik7CisgICAgYy0+YXJyYXlzLnBlcnNwZWN0aXZlKGMsIHYpOworfQorCit2b2lkIGNvbXBpbGVFbGVtZW50c19fZ2VuZXJpYyhvZ2xlc19jb250ZXh0X3QqIGMsCisgICAgICAgIHZlcnRleF90KiB2LCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCkKK3sKKyAgICBjb25zdCBHTHVieXRlKiB2cCA9IGMtPmFycmF5cy52ZXJ0ZXguZWxlbWVudCgKKyAgICAgICAgICAgIGZpcnN0ICYgdmVydGV4X2NhY2hlX3Q6OklOREVYX01BU0spOworICAgIGNvbnN0IHNpemVfdCBzdHJpZGUgPSBjLT5hcnJheXMudmVydGV4LnN0cmlkZTsKKyAgICB0cmFuc2Zvcm1fdCBjb25zdCogY29uc3QgbXZwID0gJmMtPnRyYW5zZm9ybXMubXZwOworICAgIGRvIHsKKyAgICAgICAgdi0+ZmxhZ3MgPSAwOworICAgICAgICB2LT5pbmRleCA9IGZpcnN0Kys7CisgICAgICAgIGMtPmFycmF5cy52ZXJ0ZXguZmV0Y2goYywgdi0+b2JqLnYsIHZwKTsKKyAgICAgICAgYy0+YXJyYXlzLm12cF90cmFuc2Zvcm0obXZwLCAmdi0+Y2xpcCwgJnYtPm9iaik7CisgICAgICAgIGMtPmFycmF5cy5wZXJzcGVjdGl2ZShjLCB2KTsKKyAgICAgICAgdnAgKz0gc3RyaWRlOworICAgICAgICB2Kys7CisgICAgfSB3aGlsZSAoLS1jb3VudCk7Cit9CisKKy8qCit2b2lkIGNvbXBpbGVFbGVtZW50c19fM3hfZnVsbChvZ2xlc19jb250ZXh0X3QqIGMsCisgICAgICAgIHZlcnRleF90KiB2LCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCkKK3sKKyAgICBjb25zdCBHTGZpeGVkKiB2cCA9IChjb25zdCBHTGZpeGVkKiljLT5hcnJheXMudmVydGV4LmVsZW1lbnQoZmlyc3QpOworICAgIGNvbnN0IHNpemVfdCBzdHJpZGUgPSBjLT5hcnJheXMudmVydGV4LnN0cmlkZSAvIDQ7CisvLyAgICBjb25zdCBHTGZpeGVkKiBjb25zdCYgbSA9IGMtPnRyYW5zZm9ybXMubXZwLm1hdHJpeC5tOworICAgIAorICAgIEdMZml4ZWQgbVsxNl07CisgICAgbWVtY3B5KCZtLCBjLT50cmFuc2Zvcm1zLm12cC5tYXRyaXgubSwgc2l6ZW9mKG0pKTsKKyAgICAKKyAgICBkbyB7CisgICAgICAgIGNvbnN0IEdMZml4ZWQgcnggPSB2cFswXTsKKyAgICAgICAgY29uc3QgR0xmaXhlZCByeSA9IHZwWzFdOworICAgICAgICBjb25zdCBHTGZpeGVkIHJ6ID0gdnBbMl07CisgICAgICAgIHZwICs9IHN0cmlkZTsKKyAgICAgICAgdi0+aW5kZXggPSBmaXJzdCsrOworICAgICAgICB2LT5jbGlwLnggPSBtbGEzYShyeCwgbVsgMF0sIHJ5LCBtWyA0XSwgcnosIG1bIDhdLCBtWzEyXSk7IAorICAgICAgICB2LT5jbGlwLnkgPSBtbGEzYShyeCwgbVsgMV0sIHJ5LCBtWyA1XSwgcnosIG1bIDldLCBtWzEzXSk7CisgICAgICAgIHYtPmNsaXAueiA9IG1sYTNhKHJ4LCBtWyAyXSwgcnksIG1bIDZdLCByeiwgbVsxMF0sIG1bMTRdKTsKKyAgICAgICAgdi0+Y2xpcC53ID0gbWxhM2EocngsIG1bIDNdLCByeSwgbVsgN10sIHJ6LCBtWzExXSwgbVsxNV0pOworCisgICAgICAgIGNvbnN0IEdMZml4ZWQgdyA9IHYtPmNsaXAudzsKKyAgICAgICAgdWludDMyX3QgY2xpcCA9IDA7CisgICAgICAgIGlmICh2LT5jbGlwLnggPCAtdykgICBjbGlwIHw9IHZlcnRleF90OjpDTElQX0w7CisgICAgICAgIGlmICh2LT5jbGlwLnggPiAgdykgICBjbGlwIHw9IHZlcnRleF90OjpDTElQX1I7CisgICAgICAgIGlmICh2LT5jbGlwLnkgPCAtdykgICBjbGlwIHw9IHZlcnRleF90OjpDTElQX0I7CisgICAgICAgIGlmICh2LT5jbGlwLnkgPiAgdykgICBjbGlwIHw9IHZlcnRleF90OjpDTElQX1Q7CisgICAgICAgIGlmICh2LT5jbGlwLnogPCAtdykgICBjbGlwIHw9IHZlcnRleF90OjpDTElQX047CisgICAgICAgIGlmICh2LT5jbGlwLnogPiAgdykgICBjbGlwIHw9IHZlcnRleF90OjpDTElQX0Y7CisgICAgICAgIHYtPmZsYWdzID0gY2xpcDsKKyAgICAgICAgYy0+YXJyYXlzLmN1bGwgJj0gY2xpcDsKKworICAgICAgICAvL2MtPmFycmF5cy5wZXJzcGVjdGl2ZShjLCB2KTsKKyAgICAgICAgdisrOworICAgIH0gd2hpbGUgKC0tY291bnQpOworfQorKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIDAKKyNwcmFnbWEgbWFyayAtCisjcHJhZ21hIG1hcmsgY2xpcHBlcnMKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBjbGlwVmVjNCh2ZWM0X3QmIG52LCAKKyAgICAgICAgR0xmaXhlZCB0LCBjb25zdCB2ZWM0X3QmIHMsIGNvbnN0IHZlYzRfdCYgcCkKK3sKKyAgICBmb3IgKGludCBpPTA7IGk8NCA7IGkrKykKKyAgICAgICAgbnYudltpXSA9IGdnbE11bEFkZHgodCwgcy52W2ldIC0gcC52W2ldLCBwLnZbaV0sIDI4KTsKK30KKworc3RhdGljIHZvaWQgY2xpcFZlcnRleChvZ2xlc19jb250ZXh0X3QqIGMsIHZlcnRleF90KiBudiwKKyAgICAgICAgR0xmaXhlZCB0LCBjb25zdCB2ZXJ0ZXhfdCogcywgY29uc3QgdmVydGV4X3QqIHApCit7CisgICAgY2xpcFZlYzQobnYtPmNsaXAsIHQsIHMtPmNsaXAsIHAtPmNsaXApOworICAgIG52LT5mb2cgPSBnZ2xNdWxBZGR4KHQsIHMtPmZvZyAtIHAtPmZvZywgcC0+Zm9nLCAyOCk7CisgICAgb2dsZXNfdmVydGV4X3Byb2plY3QoYywgbnYpOworICAgIG52LT5mbGFncyB8PSAgdmVydGV4X3Q6OkxJVCB8IHZlcnRleF90OjpFWUUgfCB2ZXJ0ZXhfdDo6VFQ7CisgICAgbnYtPmZsYWdzICY9IH52ZXJ0ZXhfdDo6Q0xJUF9BTEw7Cit9CisKK3N0YXRpYyB2b2lkIGNsaXBWZXJ0ZXhDKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIG52LAorICAgICAgICBHTGZpeGVkIHQsIGNvbnN0IHZlcnRleF90KiBzLCBjb25zdCB2ZXJ0ZXhfdCogcCkKK3sKKyAgICBjbGlwVmVjNChudi0+Y29sb3IsIHQsIHMtPmNvbG9yLCBwLT5jb2xvcik7CisgICAgY2xpcFZlcnRleChjLCBudiwgdCwgcywgcCk7Cit9CisKK3N0YXRpYyB2b2lkIGNsaXBWZXJ0ZXhUKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIG52LAorICAgICAgICBHTGZpeGVkIHQsIGNvbnN0IHZlcnRleF90KiBzLCBjb25zdCB2ZXJ0ZXhfdCogcCkKK3sKKyAgICBmb3IgKGludCBpPTAgOyBpPEdHTF9URVhUVVJFX1VOSVRfQ09VTlQgOyBpKyspIHsKKyAgICAgICAgaWYgKGMtPnJhc3Rlcml6ZXIuc3RhdGUudGV4dHVyZVtpXS5lbmFibGUpCisgICAgICAgICAgICBjbGlwVmVjNChudi0+dGV4dHVyZVtpXSwgdCwgcy0+dGV4dHVyZVtpXSwgcC0+dGV4dHVyZVtpXSk7CisgICAgfQorICAgIGNsaXBWZXJ0ZXgoYywgbnYsIHQsIHMsIHApOworfQorCitzdGF0aWMgdm9pZCBjbGlwVmVydGV4QWxsKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIG52LAorICAgICAgICBHTGZpeGVkIHQsIGNvbnN0IHZlcnRleF90KiBzLCBjb25zdCB2ZXJ0ZXhfdCogcCkKK3sKKyAgICBjbGlwVmVjNChudi0+Y29sb3IsIHQsIHMtPmNvbG9yLCBwLT5jb2xvcik7CisgICAgY2xpcFZlcnRleFQoYywgbnYsIHQsIHMsIHApOworfQorCitzdGF0aWMgdm9pZCBjbGlwRXllKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIG52LAorICAgICAgICBHTGZpeGVkIHQsIGNvbnN0IHZlcnRleF90KiBzLCBjb25zdCB2ZXJ0ZXhfdCogcCkKK3sKKyAgICBudi0+Y2xlYXIoKTsKKyAgICBjLT5hcnJheXMuY2xpcFZlcnRleChjLCBudiwgdCwgcCwgcyk7CisgICAgY2xpcFZlYzQobnYtPmV5ZSwgdCwgcy0+ZXllLCBwLT5leWUpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgMAorI3ByYWdtYSBtYXJrIC0KKyNlbmRpZgorCit2b2lkIHZhbGlkYXRlX2FycmF5cyhvZ2xlc19jb250ZXh0X3QqIGMsIEdMZW51bSBtb2RlKQoreworICAgIHVpbnQzMl90IGVuYWJsZXMgPSBjLT5yYXN0ZXJpemVyLnN0YXRlLmVuYWJsZXM7CisKKyAgICAvLyBQZXJzcGVjdGl2ZSBjb3JyZWN0aW9uIGlzIG5vdCBuZWVkIGlmIE9ydGhvIHRyYW5zZm9ybSwgYnV0CisgICAgLy8gdGhlIHVzZXIgY2FuIHN0aWxsIHByb3ZpZGUgdGhlIHcgY29vcmRpbmF0ZSBtYW51YWxseSwgc28gd2UgY2FuJ3QKKyAgICAvLyBhdXRvbWF0aWNhbGx5IHR1cm4gaXQgb2ZmIChpbiBmYWN0IHdlIGNvdWxkIHdoZW4gdGhlIDR0aCBjb29yZGluYXRlCisgICAgLy8gaXMgbm90IHNwY2lmaWVkIGluIHRoZSB2ZXJ0ZXggYXJyYXkpLgorICAgIC8vIFcgaW50ZXJwb2xhdGlvbiBpcyBuZXZlciBuZWVkZWQgZm9yIHBvaW50cy4KKyAgICBHTGJvb2xlYW4gcGVyc3BlY3RpdmUgPSAKKyAgICAgICAgYy0+cGVyc3BlY3RpdmUgJiYgbW9kZSE9R0xfUE9JTlRTICYmIChlbmFibGVzICYgR0dMX0VOQUJMRV9UTVVTKTsKKyAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmVuYWJsZURpc2FibGUoYywgR0dMX1dfTEVSUCwgcGVyc3BlY3RpdmUpOworICAgIAorICAgIC8vIHNldCBhbnRpLWFsaWFzaW5nCisgICAgR0xib29sZWFuIHNtb290aCA9IEdMX0ZBTFNFOworICAgIHN3aXRjaCAobW9kZSkgeworICAgIGNhc2UgR0xfUE9JTlRTOgorICAgICAgICBzbW9vdGggPSBjLT5wb2ludC5zbW9vdGg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfTElORVM6CisgICAgY2FzZSBHTF9MSU5FX0xPT1A6CisgICAgY2FzZSBHTF9MSU5FX1NUUklQOgorICAgICAgICBzbW9vdGggPSBjLT5saW5lLnNtb290aDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICgoKGVuYWJsZXMgJiBHR0xfRU5BQkxFX0FBKT8xOjApICE9IHNtb290aCkKKyAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy5lbmFibGVEaXNhYmxlKGMsIEdHTF9BQSwgc21vb3RoKTsKKworICAgIC8vIHNldCB0aGUgc2hhZGUgbW9kZWwgZm9yIHRoaXMgcHJpbWl0aXZlCisgICAgYy0+cmFzdGVyaXplci5wcm9jcy5zaGFkZU1vZGVsKGMsCisgICAgICAgICAgICAobW9kZSA9PSBHTF9QT0lOVFMpID8gR0xfRkxBVCA6IGMtPmxpZ2h0aW5nLnNoYWRlTW9kZWwpOworCisgICAgLy8gY29tcHV0ZSBhbGwgdGhlIG1hdHJpY2VzIHdlJ2xsIG5lZWQuLi4KKyAgICB1aW50MzJfdCB3YW50ID0KKyAgICAgICAgICAgIHRyYW5zZm9ybV9zdGF0ZV90OjpNVlAgfAorICAgICAgICAgICAgdHJhbnNmb3JtX3N0YXRlX3Q6OlZJRVdQT1JUOworICAgIGlmIChjLT5saWdodGluZy5lbmFibGUpIHsgLy8gbmVlZHMgbm9ybWFsIHRyYW5zZm9ybXMgYW5kIGV5ZSBjb29yZHMKKyAgICAgICAgd2FudCB8PSB0cmFuc2Zvcm1fc3RhdGVfdDo6TVZVSTsKKyAgICAgICAgd2FudCB8PSB0cmFuc2Zvcm1fc3RhdGVfdDo6TU9ERUxWSUVXOworICAgIH0KKyAgICBpZiAoZW5hYmxlcyAmIEdHTF9FTkFCTEVfVE1VUykgeyAvLyBuZWVkcyB0ZXh0dXJlIHRyYW5zZm9ybXMKKyAgICAgICAgd2FudCB8PSB0cmFuc2Zvcm1fc3RhdGVfdDo6VEVYVFVSRTsKKyAgICB9CisgICAgaWYgKGMtPmNsaXBQbGFuZXMuZW5hYmxlIHx8IChlbmFibGVzICYgR0dMX0VOQUJMRV9GT0cpKSB7IAorICAgICAgICB3YW50IHw9IHRyYW5zZm9ybV9zdGF0ZV90OjpNT0RFTFZJRVc7IC8vIG5lZWRzIGV5ZSBjb29yZHMKKyAgICB9CisgICAgb2dsZXNfdmFsaWRhdGVfdHJhbnNmb3JtKGMsIHdhbnQpOworCisgICAgLy8gdGV4dHVyZXMuLi4KKyAgICBpZiAoZW5hYmxlcyAmIEdHTF9FTkFCTEVfVE1VUykKKyAgICAgICAgb2dsZXNfdmFsaWRhdGVfdGV4dHVyZShjKTsKKworICAgIC8vIHZlcnRleCBjb21waWxlcnMKKyAgICBjLT5hcnJheXMuY29tcGlsZUVsZW1lbnQgPSBjb21waWxlRWxlbWVudF9fZ2VuZXJpYzsKKyAgICBjLT5hcnJheXMuY29tcGlsZUVsZW1lbnRzID0gY29tcGlsZUVsZW1lbnRzX19nZW5lcmljOworCisgICAgLy8gdmVydGV4IHRyYW5zZm9ybQorICAgIGMtPmFycmF5cy5tdnBfdHJhbnNmb3JtID0KKyAgICAgICAgYy0+dHJhbnNmb3Jtcy5tdnAucG9pbnR2W2MtPmFycmF5cy52ZXJ0ZXguc2l6ZSAtIDJdOworCisgICAgYy0+YXJyYXlzLm12X3RyYW5zZm9ybSA9CisgICAgICAgIGMtPnRyYW5zZm9ybXMubW9kZWx2aWV3LnRyYW5zZm9ybS5wb2ludHZbYy0+YXJyYXlzLnZlcnRleC5zaXplIC0gMl07CisgICAgCisgICAgLyoKKyAgICAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqICBwaWNrIGZldGNoZXJzCisgICAgICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKi8KKyAgICAKKyAgICBhcnJheV9tYWNoaW5lX3QmIGFtID0gYy0+YXJyYXlzOworICAgIGFtLnZlcnRleC5mZXRjaCA9IGZldGNoTm9wOworICAgIGFtLm5vcm1hbC5mZXRjaCA9IGN1cnJlbnROb3JtYWw7CisgICAgYW0uY29sb3IuZmV0Y2ggPSBjdXJyZW50Q29sb3I7CisgICAgCisgICAgaWYgKGFtLnZlcnRleC5lbmFibGUpIHsKKyAgICAgICAgYW0udmVydGV4LnJlc29sdmUoKTsKKyAgICAgICAgaWYgKGFtLnZlcnRleC5ibyB8fCBhbS52ZXJ0ZXgucG9pbnRlcikgeworICAgICAgICAgICAgYW0udmVydGV4LmZldGNoID0gdmVydGV4X2ZjdFthbS52ZXJ0ZXguc2l6ZS0yXVthbS52ZXJ0ZXgudHlwZSAmIDB4Rl07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYW0ubm9ybWFsLmVuYWJsZSkgeworICAgICAgICBhbS5ub3JtYWwucmVzb2x2ZSgpOworICAgICAgICBpZiAoYW0ubm9ybWFsLmJvIHx8IGFtLm5vcm1hbC5wb2ludGVyKSB7CisgICAgICAgICAgICBhbS5ub3JtYWwuZmV0Y2ggPSBub3JtYWxfZmN0W2FtLm5vcm1hbC5zaXplLTNdW2FtLm5vcm1hbC50eXBlICYgMHhGXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChhbS5jb2xvci5lbmFibGUpIHsKKyAgICAgICAgYW0uY29sb3IucmVzb2x2ZSgpOworICAgICAgICBpZiAoYy0+bGlnaHRpbmcuZW5hYmxlKSB7CisgICAgICAgICAgICBpZiAoYW0uY29sb3IuYm8gfHwgYW0uY29sb3IucG9pbnRlcikgeworICAgICAgICAgICAgICAgIGFtLmNvbG9yLmZldGNoID0gY29sb3JfZmN0W2FtLmNvbG9yLnNpemUtM11bYW0uY29sb3IudHlwZSAmIDB4Rl07CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoYW0uY29sb3IuYm8gfHwgYW0uY29sb3IucG9pbnRlcikgeworICAgICAgICAgICAgICAgIGFtLmNvbG9yLmZldGNoID0gY29sb3JfY2xhbXBfZmN0W2FtLmNvbG9yLnNpemUtM11bYW0uY29sb3IudHlwZSAmIDB4Rl07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQgYWN0aXZlVG11Q291bnQgPSAwOworICAgIGZvciAoaW50IGk9MCA7IGk8R0dMX1RFWFRVUkVfVU5JVF9DT1VOVCA7IGkrKykgeworICAgICAgICBhbS50ZXh0dXJlW2ldLmZldGNoID0gY3VycmVudFRleENvb3JkOworICAgICAgICBpZiAoYy0+cmFzdGVyaXplci5zdGF0ZS50ZXh0dXJlW2ldLmVuYWJsZSkgeworCisgICAgICAgICAgICAvLyB0ZXh0dXJlIGZldGNoZXJzLi4uCisgICAgICAgICAgICBpZiAoYW0udGV4dHVyZVtpXS5lbmFibGUpIHsKKyAgICAgICAgICAgICAgICBhbS50ZXh0dXJlW2ldLnJlc29sdmUoKTsKKyAgICAgICAgICAgICAgICBpZiAoYW0udGV4dHVyZVtpXS5ibyB8fCBhbS50ZXh0dXJlW2ldLnBvaW50ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgYW0udGV4dHVyZVtpXS5mZXRjaCA9IHRleHR1cmVfZmN0W2FtLnRleHR1cmVbaV0uc2l6ZS0yXVthbS50ZXh0dXJlW2ldLnR5cGUgJiAweEZdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gdGV4dHVyZSB0cmFuc2Zvcm0uLi4KKyAgICAgICAgICAgIGNvbnN0IGludCBpbmRleCA9IGMtPmFycmF5cy50ZXh0dXJlW2ldLnNpemUgLSAyOworICAgICAgICAgICAgYy0+YXJyYXlzLnRleF90cmFuc2Zvcm1baV0gPQorICAgICAgICAgICAgICAgIGMtPnRyYW5zZm9ybXMudGV4dHVyZVtpXS50cmFuc2Zvcm0ucG9pbnR2W2luZGV4XTsKKworICAgICAgICAgICAgYW0udG11ID0gaTsKKyAgICAgICAgICAgIGFjdGl2ZVRtdUNvdW50Kys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBwaWNrIHRoZSB2ZXJ0ZXgtY2xpcHBlcgorICAgIHVpbnQzMl90IGNsaXBwZXIgPSAwOworICAgIC8vIHdlIG11c3QgcmVsb2FkICdlbmFibGVzJyBoZXJlCisgICAgZW5hYmxlcyA9IGMtPnJhc3Rlcml6ZXIuc3RhdGUuZW5hYmxlczsKKyAgICBpZiAoZW5hYmxlcyAmIEdHTF9FTkFCTEVfU01PT1RIKQorICAgICAgICBjbGlwcGVyIHw9IDE7ICAgLy8gd2UgbmVlZCB0byBpbnRlcnBvbGF0ZSBjb2xvcnMKKyAgICBpZiAoZW5hYmxlcyAmIEdHTF9FTkFCTEVfVE1VUykKKyAgICAgICAgY2xpcHBlciB8PSAyOyAgIC8vIHdlIG5lZWQgdG8gaW50ZXJwb2xhdGUgdGV4dHVyZXMKKyAgICBzd2l0Y2ggKGNsaXBwZXIpIHsKKyAgICBjYXNlIDA6IGMtPmFycmF5cy5jbGlwVmVydGV4ID0gY2xpcFZlcnRleDsgICAgICBicmVhazsKKyAgICBjYXNlIDE6IGMtPmFycmF5cy5jbGlwVmVydGV4ID0gY2xpcFZlcnRleEM7ICAgICBicmVhazsKKyAgICBjYXNlIDI6IGMtPmFycmF5cy5jbGlwVmVydGV4ID0gY2xpcFZlcnRleFQ7ICAgICBicmVhazsKKyAgICBjYXNlIDM6IGMtPmFycmF5cy5jbGlwVmVydGV4ID0gY2xpcFZlcnRleEFsbDsgICBicmVhazsKKyAgICB9CisgICAgYy0+YXJyYXlzLmNsaXBFeWUgPSBjbGlwRXllOworCisgICAgLy8gcGljayB0aGUgcHJpbWl0aXZlIHJhc3Rlcml6ZXIKKyAgICBvZ2xlc192YWxpZGF0ZV9wcmltaXRpdmVzKGMpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworI2lmIDAKKyNwcmFnbWEgbWFyayAtCisjcHJhZ21hIG1hcmsgYXJyYXkgQVBJCisjZW5kaWYKKwordm9pZCBnbFZlcnRleFBvaW50ZXIoCisgICAgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpCit7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBpZiAoc2l6ZTwyIHx8IHNpemU+NCB8fCBzdHJpZGU8MCkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEdMX0JZVEU6CisgICAgY2FzZSBHTF9TSE9SVDoKKyAgICBjYXNlIEdMX0ZJWEVEOgorICAgIGNhc2UgR0xfRkxPQVQ6CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYy0+YXJyYXlzLnZlcnRleC5pbml0KHNpemUsIHR5cGUsIHN0cmlkZSwgcG9pbnRlciwgYy0+YXJyYXlzLmFycmF5X2J1ZmZlciwgMCk7Cit9CisKK3ZvaWQgZ2xDb2xvclBvaW50ZXIoCisgICAgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpCit7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICAvLyBpbiB0aGVvcnkgb2dsZXMgZG9lc24ndCBhbGxvdyBjb2xvciBhcnJheXMgb2Ygc2l6ZSAzCisgICAgLy8gYnV0IGl0IGlzIHZlcnkgdXNlZnVsIHRvICd2aXN1YWxpemUnIHRoZSBub3JtYWwgYXJyYXkuCisgICAgaWYgKHNpemU8MyB8fCBzaXplPjQgfHwgc3RyaWRlPDApIHsKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBHTF9VTlNJR05FRF9CWVRFOgorICAgIGNhc2UgR0xfRklYRUQ6CisgICAgY2FzZSBHTF9GTE9BVDoKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjLT5hcnJheXMuY29sb3IuaW5pdChzaXplLCB0eXBlLCBzdHJpZGUsIHBvaW50ZXIsIGMtPmFycmF5cy5hcnJheV9idWZmZXIsIDApOworfQorCit2b2lkIGdsTm9ybWFsUG9pbnRlcigKKyAgICBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcikKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGlmIChzdHJpZGU8MCkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEdMX0JZVEU6CisgICAgY2FzZSBHTF9TSE9SVDoKKyAgICBjYXNlIEdMX0ZJWEVEOgorICAgIGNhc2UgR0xfRkxPQVQ6CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYy0+YXJyYXlzLm5vcm1hbC5pbml0KDMsIHR5cGUsIHN0cmlkZSwgcG9pbnRlciwgYy0+YXJyYXlzLmFycmF5X2J1ZmZlciwgMCk7Cit9CisKK3ZvaWQgZ2xUZXhDb29yZFBvaW50ZXIoCisgICAgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpCit7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBpZiAoc2l6ZTwyIHx8IHNpemU+NCB8fCBzdHJpZGU8MCkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEdMX0JZVEU6CisgICAgY2FzZSBHTF9TSE9SVDoKKyAgICBjYXNlIEdMX0ZJWEVEOgorICAgIGNhc2UgR0xfRkxPQVQ6CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY29uc3QgaW50IHRtdSA9IGMtPmFycmF5cy5hY3RpdmVUZXh0dXJlOworICAgIGMtPmFycmF5cy50ZXh0dXJlW3RtdV0uaW5pdChzaXplLCB0eXBlLCBzdHJpZGUsIHBvaW50ZXIsCisgICAgICAgICAgICBjLT5hcnJheXMuYXJyYXlfYnVmZmVyLCAwKTsKK30KKworCit2b2lkIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xlbnVtIGFycmF5KSB7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBlbmFibGVEaXNhYmxlQ2xpZW50U3RhdGUoYywgYXJyYXksIHRydWUpOworfQorCit2b2lkIGdsRGlzYWJsZUNsaWVudFN0YXRlKEdMZW51bSBhcnJheSkgeworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgZW5hYmxlRGlzYWJsZUNsaWVudFN0YXRlKGMsIGFycmF5LCBmYWxzZSk7Cit9CisKK3ZvaWQgZ2xDbGllbnRBY3RpdmVUZXh0dXJlKEdMZW51bSB0ZXh0dXJlKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgaWYgKHRleHR1cmU8R0xfVEVYVFVSRTAgfHwgdGV4dHVyZT49R0xfVEVYVFVSRTArR0dMX1RFWFRVUkVfVU5JVF9DT1VOVCkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGMtPmFycmF5cy5hY3RpdmVUZXh0dXJlID0gdGV4dHVyZSAtIEdMX1RFWFRVUkUwOworfQorCit2b2lkIGdsRHJhd0FycmF5cyhHTGVudW0gbW9kZSwgR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQpCit7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBpZiAoY291bnQ8MCkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICBjYXNlIEdMX1BPSU5UUzoKKyAgICBjYXNlIEdMX0xJTkVfU1RSSVA6CisgICAgY2FzZSBHTF9MSU5FX0xPT1A6CisgICAgY2FzZSBHTF9MSU5FUzoKKyAgICBjYXNlIEdMX1RSSUFOR0xFX1NUUklQOgorICAgIGNhc2UgR0xfVFJJQU5HTEVfRkFOOgorICAgIGNhc2UgR0xfVFJJQU5HTEVTOgorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGNvdW50ID09IDAgfHwgIWMtPmFycmF5cy52ZXJ0ZXguZW5hYmxlKQorICAgICAgICByZXR1cm47CisgICAgaWYgKChjLT5jdWxsLmVuYWJsZSkgJiYgKGMtPmN1bGwuY3VsbEZhY2UgPT0gR0xfRlJPTlRfQU5EX0JBQ0spKQorICAgICAgICByZXR1cm47IC8vIGFsbCB0cmlhbmdsZXMgYXJlIGN1bGxlZAorCisgICAgdmFsaWRhdGVfYXJyYXlzKGMsIG1vZGUpOworICAgIGRyYXdBcnJheXNQcmltc1ttb2RlXShjLCBmaXJzdCwgY291bnQpOworCisjaWYgVkNfQ0FDSEVfU1RBVElTVElDUworICAgIGMtPnZjLnRvdGFsID0gY291bnQ7CisgICAgYy0+dmMuZHVtcF9zdGF0cyhtb2RlKTsKKyNlbmRpZgorfQorCit2b2lkIGdsRHJhd0VsZW1lbnRzKAorICAgIEdMZW51bSBtb2RlLCBHTHNpemVpIGNvdW50LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICppbmRpY2VzKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgaWYgKGNvdW50PDApIHsKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3dpdGNoIChtb2RlKSB7CisgICAgY2FzZSBHTF9QT0lOVFM6CisgICAgY2FzZSBHTF9MSU5FX1NUUklQOgorICAgIGNhc2UgR0xfTElORV9MT09QOgorICAgIGNhc2UgR0xfTElORVM6CisgICAgY2FzZSBHTF9UUklBTkdMRV9TVFJJUDoKKyAgICBjYXNlIEdMX1RSSUFOR0xFX0ZBTjoKKyAgICBjYXNlIEdMX1RSSUFOR0xFUzoKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEdMX1VOU0lHTkVEX0JZVEU6CisgICAgY2FzZSBHTF9VTlNJR05FRF9TSE9SVDoKKyAgICAgICAgYy0+YXJyYXlzLmluZGljZXNUeXBlID0gdHlwZTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoY291bnQgPT0gMCB8fCAhYy0+YXJyYXlzLnZlcnRleC5lbmFibGUpCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoKGMtPmN1bGwuZW5hYmxlKSAmJiAoYy0+Y3VsbC5jdWxsRmFjZSA9PSBHTF9GUk9OVF9BTkRfQkFDSykpCisgICAgICAgIHJldHVybjsgLy8gYWxsIHRyaWFuZ2xlcyBhcmUgY3VsbGVkCisKKyAgICAvLyBjbGVhciB0aGUgdmVydGV4LWNhY2hlCisgICAgYy0+dmMuY2xlYXIoKTsKKyAgICB2YWxpZGF0ZV9hcnJheXMoYywgbW9kZSk7CisgICAgCisgICAgLy8gaWYgaW5kaWNlcyBhcmUgaW4gYSBidWZmZXIgb2JqZWN0LCB0aGUgcG9pbnRlciBpcyB0cmVhdGVkIGFzIGFuCisgICAgLy8gb2Zmc2V0IGluIHRoYXQgYnVmZmVyLgorICAgIGlmIChjLT5hcnJheXMuZWxlbWVudF9hcnJheV9idWZmZXIpIHsKKyAgICAgICAgaW5kaWNlcyA9IGMtPmFycmF5cy5lbGVtZW50X2FycmF5X2J1ZmZlci0+ZGF0YSArIHVpbnRwdHJfdChpbmRpY2VzKTsKKyAgICB9CisKKyAgICBkcmF3RWxlbWVudHNQcmltc1ttb2RlXShjLCBjb3VudCwgaW5kaWNlcyk7CisKKyNpZiBWQ19DQUNIRV9TVEFUSVNUSUNTCisgICAgYy0+dmMudG90YWwgPSBjb3VudDsKKyAgICBjLT52Yy5kdW1wX3N0YXRzKG1vZGUpOworI2VuZGlmCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGJ1ZmZlcnMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBnbEJpbmRCdWZmZXIoR0xlbnVtIHRhcmdldCwgR0x1aW50IGJ1ZmZlcikKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGlmICgodGFyZ2V0IT1HTF9BUlJBWV9CVUZGRVIpICYmICh0YXJnZXQhPUdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSKSkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIGNyZWF0ZSBhIGJ1ZmZlciBvYmplY3QsIG9yIGJpbmQgYW4gZXhpc3Rpbmcgb25lCisgICAgYnVmZmVyX3QgY29uc3QqIGJvID0gMDsKKyAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgIGJvID0gYy0+YnVmZmVyT2JqZWN0TWFuYWdlci0+YmluZChidWZmZXIpOworICAgICAgICBpZiAoIWJvKSB7CisgICAgICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9PVVRfT0ZfTUVNT1JZKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICAoKHRhcmdldCA9PSBHTF9BUlJBWV9CVUZGRVIpID8gCisgICAgICAgICAgICBjLT5hcnJheXMuYXJyYXlfYnVmZmVyIDogYy0+YXJyYXlzLmVsZW1lbnRfYXJyYXlfYnVmZmVyKSA9IGJvOworfQorCit2b2lkIGdsQnVmZmVyRGF0YShHTGVudW0gdGFyZ2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSwgR0xlbnVtIHVzYWdlKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgaWYgKCh0YXJnZXQhPUdMX0FSUkFZX0JVRkZFUikgJiYgKHRhcmdldCE9R0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIpKSB7CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHNpemU8MCkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoKHVzYWdlIT1HTF9TVEFUSUNfRFJBVykgJiYgKHVzYWdlIT1HTF9EWU5BTUlDX0RSQVcpKSB7CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYnVmZmVyX3QgY29uc3QqIGJvID0gKCh0YXJnZXQgPT0gR0xfQVJSQVlfQlVGRkVSKSA/IAorICAgICAgICAgICAgYy0+YXJyYXlzLmFycmF5X2J1ZmZlciA6IGMtPmFycmF5cy5lbGVtZW50X2FycmF5X2J1ZmZlcik7CisKKyAgICBpZiAoYm8gPT0gMCkgeworICAgICAgICAvLyBjYW4ndCBtb2RpZnkgYnVmZmVyIDAKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYnVmZmVyX3QqIGVkaXRfYm8gPSBjb25zdF9jYXN0PGJ1ZmZlcl90Kj4oYm8pOworICAgIGlmIChjLT5idWZmZXJPYmplY3RNYW5hZ2VyLT5hbGxvY2F0ZVN0b3JlKGVkaXRfYm8sIHNpemUsIHVzYWdlKSAhPSAwKSB7CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX09VVF9PRl9NRU1PUlkpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChkYXRhKSB7CisgICAgICAgIG1lbWNweShiby0+ZGF0YSwgZGF0YSwgc2l6ZSk7CisgICAgfQorfQorCit2b2lkIGdsQnVmZmVyU3ViRGF0YShHTGVudW0gdGFyZ2V0LCBHTGludHB0ciBvZmZzZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgY29uc3QgR0x2b2lkKiBkYXRhKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgaWYgKCh0YXJnZXQhPUdMX0FSUkFZX0JVRkZFUikgJiYgKHRhcmdldCE9R0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIpKSB7CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKG9mZnNldDwwIHx8IHNpemU8MCB8fCBkYXRhPT0wKSB7CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGJ1ZmZlcl90IGNvbnN0KiBibyA9ICgodGFyZ2V0ID09IEdMX0FSUkFZX0JVRkZFUikgPyAKKyAgICAgICAgICAgIGMtPmFycmF5cy5hcnJheV9idWZmZXIgOiBjLT5hcnJheXMuZWxlbWVudF9hcnJheV9idWZmZXIpOworCisgICAgaWYgKGJvID09IDApIHsKKyAgICAgICAgLy8gY2FuJ3QgbW9kaWZ5IGJ1ZmZlciAwCisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAob2Zmc2V0K3NpemUgPiBiby0+c2l6ZSkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtZW1jcHkoYm8tPmRhdGEgKyBvZmZzZXQsIGRhdGEsIHNpemUpOworfQorCit2b2lkIGdsRGVsZXRlQnVmZmVycyhHTHNpemVpIG4sIGNvbnN0IEdMdWludCogYnVmZmVycykKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGlmIChuPDApIHsKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKGludCBpPTAgOyBpPG4gOyBpKyspIHsKKyAgICAgICAgR0x1aW50IG5hbWUgPSBidWZmZXJzW2ldOworICAgICAgICBpZiAobmFtZSkgeworICAgICAgICAgICAgLy8gdW5iaW5kIGJvdW5kIGRlbGV0ZWQgYnVmZmVycy4uLgorICAgICAgICAgICAgaWYgKGMtPmFycmF5cy5lbGVtZW50X2FycmF5X2J1ZmZlci0+bmFtZSA9PSBuYW1lKSB7CisgICAgICAgICAgICAgICAgYy0+YXJyYXlzLmVsZW1lbnRfYXJyYXlfYnVmZmVyID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjLT5hcnJheXMuYXJyYXlfYnVmZmVyLT5uYW1lID09IG5hbWUpIHsKKyAgICAgICAgICAgICAgICBjLT5hcnJheXMuYXJyYXlfYnVmZmVyID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjLT5hcnJheXMudmVydGV4LmJvLT5uYW1lID09IG5hbWUpIHsKKyAgICAgICAgICAgICAgICBjLT5hcnJheXMudmVydGV4LmJvID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjLT5hcnJheXMubm9ybWFsLmJvLT5uYW1lID09IG5hbWUpIHsKKyAgICAgICAgICAgICAgICBjLT5hcnJheXMubm9ybWFsLmJvID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjLT5hcnJheXMuY29sb3IuYm8tPm5hbWUgPT0gbmFtZSkgeworICAgICAgICAgICAgICAgIGMtPmFycmF5cy5jb2xvci5ibyA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGludCB0PTAgOyB0PEdHTF9URVhUVVJFX1VOSVRfQ09VTlQgOyB0KyspIHsKKyAgICAgICAgICAgICAgICBpZiAoYy0+YXJyYXlzLnRleHR1cmVbdF0uYm8tPm5hbWUgPT0gbmFtZSkgeworICAgICAgICAgICAgICAgICAgICBjLT5hcnJheXMudGV4dHVyZVt0XS5ibyA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSAgICAKKyAgICBjLT5idWZmZXJPYmplY3RNYW5hZ2VyLT5kZWxldGVCdWZmZXJzKG4sIGJ1ZmZlcnMpOworICAgIGMtPmJ1ZmZlck9iamVjdE1hbmFnZXItPnJlY3ljbGVUb2tlbnMobiwgYnVmZmVycyk7Cit9CisKK3ZvaWQgZ2xHZW5CdWZmZXJzKEdMc2l6ZWkgbiwgR0x1aW50KiBidWZmZXJzKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgaWYgKG48MCkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjLT5idWZmZXJPYmplY3RNYW5hZ2VyLT5nZXRUb2tlbihuLCBidWZmZXJzKTsKK30KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvYXJyYXkuaCBiL29wZW5nbC9saWJhZ2wvYXJyYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTU2OTc4Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2xpYmFnbC9hcnJheS5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qIGxpYnMvb3BlbmdsZXMvYXJyYXkuaAorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpZm5kZWYgQU5EUk9JRF9PUEVOR0xFU19BUlJBWV9ICisjZGVmaW5lIEFORFJPSURfT1BFTkdMRVNfQVJSQVlfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIGdsIHsKK3N0cnVjdCBvZ2xlc19jb250ZXh0X3Q7Cit9OworCit2b2lkIG9nbGVzX2luaXRfYXJyYXkob2dsZXNfY29udGV4dF90KiBjKTsKK3ZvaWQgb2dsZXNfdW5pbml0X2FycmF5KG9nbGVzX2NvbnRleHRfdCogYyk7CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX09QRU5HTEVTX0FSUkFZX0gKKwpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYmFnbC9jb250ZXh0LmggYi9vcGVuZ2wvbGliYWdsL2NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjM2YjU2Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2xpYmFnbC9jb250ZXh0LmgKQEAgLTAsMCArMSwyMCBAQAorLyogbGlicy9vcGVuZ2xlcy9jb250ZXh0LmgKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaW5jbHVkZSA8cHJpdmF0ZS9vcGVuZ2xlcy9nbF9jb250ZXh0Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpnbDsKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvZHh0LmNwcCBiL29wZW5nbC9saWJhZ2wvZHh0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzhjODFmCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2xpYmFnbC9keHQuY3BwCkBAIC0wLDAgKzEsNjM2IEBACisvKiBsaWJzL29wZW5nbGVzL2R4dC5jcHAKKyoqCisqKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjZGVmaW5lIFRJTUlORyAwCisKKyNpZiBUSU1JTkcKKyNpbmNsdWRlIDxzeXMvdGltZS5oPiAvLyBmb3Igb3B0aW1pemF0aW9uIHRpbWluZworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNpbmNsdWRlIDx1dGlscy9FbmRpYW4uaD4KKworI2luY2x1ZGUgImNvbnRleHQuaCIKKworI2RlZmluZSBUSU1JTkcgMAorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyB1aW50OF90IGF2ZzIzdGFiWzY0KjY0XTsKK3N0YXRpYyB2b2xhdGlsZSBpbnQgdGFibGVzX2luaXRpYWxpemVkID0gMDsKKworLy8gRGVmaW5pdGlvbnMgYmVsb3cgYXJlIGVxdWl2YWxlbnQgdG8gdGhlc2Ugb3ZlciB0aGUgdmFsaWQgcmFuZ2Ugb2YgYXJndW1lbnRzCisvLyAgI2RlZmluZSBkaXY1KHgpICgoeCkvNSkKKy8vICAjZGVmaW5lIGRpdjcoeCkgKCh4KS83KQorCisvLyBVc2UgZml4ZWQtcG9pbnQgdG8gZGl2aWRlIGJ5IDUgYW5kIDcKKy8vIDMyNzcgPSAyXjE0LzUgKyAxCisvLyAyMzQxID0gMl4xNC83ICsgMQorI2RlZmluZSBkaXY1KHgpICgoKHgpKjMyNzcpID4+IDE0KQorI2RlZmluZSBkaXY3KHgpICgoKHgpKjIzNDEpID4+IDE0KQorCisvLyBUYWJsZSB3aXRoIGVudHJ5IFthIDw8IDYgfCBiXSA9ICgyKmEgKyBiKS8zIGZvciAwIDw9IGEsYiA8IDY0CisjZGVmaW5lIGF2ZzIzKHgwLHgxKSBhdmcyM3RhYlsoKHgwKSA8PCA2KSB8ICh4MSldCisKKy8vIEV4dHJhY3QgNS82LzUgUkdCCisjZGVmaW5lIHJlZCh4KSAgICgoKHgpID4+IDExKSAmIDB4MWYpCisjZGVmaW5lIGdyZWVuKHgpICgoKHgpID4+ICA1KSAmIDB4M2YpCisjZGVmaW5lIGJsdWUoeCkgICggKHgpICAgICAgICAmIDB4MWYpCisKKy8qCisgKiBDb252ZXJ0IDUvNi81IFJHQiAoYXMgMyBpbnRzKSB0byA4LzgvOAorICoKKyAqIE9wZXJhdGlvbiBjb3VudDogOCA8PCwgMCAmLCA1IHwKKyAqLworaW5saW5lIHN0YXRpYyBpbnQgcmdiNTY1U2VwVG84ODgoaW50IHIsIGludCBnLCBpbnQgYikKKworeworICAgIHJldHVybiAoKCgociA8PCAzKSB8IChyID4+IDIpKSA8PCAxNikgfAorICAgICAgICAgICAgKCgoZyA8PCAyKSB8IChnID4+IDQpKSA8PCAgOCkgfAorICAgICAgICAgICAgICgoYiA8PCAzKSB8IChiID4+IDIpKSk7Cit9CisKKy8qCisgKiBDb252ZXJ0IDUvNi81IFJHQiAoYXMgYSBzaW5nbGUgMTYtYml0IHdvcmQpIHRvIDgvOC84CisgKgorICogICAgICAgICAgICAgICAgICAgcjRyM3IycjEgcjBnNWc0ZzMgZzJnMWcwYjQgYjNiMmIxYjAgICByZ2IKKyAqICAgICAgICAgICAgcjRyM3IyIHIxcjBnNWc0IGczZzJnMWcwIGI0YjNiMmIxIGIwIDAgMCAwICAgcmdiIDw8IDMKKyAqIHI0cjNyMnIxIHIwcjRyM3IyIGc1ZzRnM2cyIGcxZzBnNWc0IGI0YjNiMmIxIGIwYjRiM2IyICAgZGVzaXJlZCByZXN1bHQKKyAqCisgKiBDb25zdHJ1Y3QgdGhlIDI0LWJpdCBSR0Igd29yZCBhczoKKyAqCisgKiByNHIzcjJyMSByMC0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLSAgKHJnYiA8PCA4KSAmIDB4ZjgwMDAwCisgKiAgICAgICAgICAgIHI0cjNyMiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLSAgKHJnYiA8PCAzKSAmIDB4MDcwMDAwCisgKiAgICAgICAgICAgICAgICAgICBnNWc0ZzNnMiBnMWcwLS0tLSAtLS0tLS0tLSAtLS0tLS0tLSAgKHJnYiA8PCA1KSAmIDB4MDBmYzAwCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZzVnNCAtLS0tLS0tLSAtLS0tLS0tLSAgKHJnYiA+PiAxKSAmIDB4MDAwMzAwCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiNGIzYjJiMSBiMC0tLS0tLSAgKHJnYiA8PCAzKSAmIDB4MDAwMGY4CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGI0YjNiMiAgKHJnYiA+PiAyKSAmIDB4MDAwMDA3CisgKgorICogT3BlcmF0aW9uIGNvdW50OiA1IDw8LCA2ICYsIDUgfCAobi5iLiByZ2IgPj4gMyBpcyB1c2VkIHR3aWNlKQorICovCitpbmxpbmUgc3RhdGljIGludCByZ2I1NjVUbzg4OChpbnQgcmdiKQorCit7CisgICAgaW50IHJnYjMgPSByZ2IgPj4gMzsKKyAgICByZXR1cm4gKCgocmdiIDw8IDgpICYgMHhmODAwMDApIHwKKyAgICAgICAgICAgICggcmdiMyAgICAgICYgMHgwNzAwMDApIHwKKyAgICAgICAgICAgICgocmdiIDw8IDUpICYgMHgwMGZjMDApIHwKKyAgICAgICAgICAgICgocmdiID4+IDEpICYgMHgwMDAzMDApIHwKKyAgICAgICAgICAgICggcmdiMyAgICAgICYgMHgwMDAwZjgpIHwKKyAgICAgICAgICAgICgocmdiID4+IDIpICYgMHgwMDAwMDcpKTsKK30KKworI2lmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KK3N0YXRpYyB1aW50MzJfdCBzd2FwKHVpbnQzMl90IHgpIHsKKyAgICBpbnQgYjAgPSAoeCA+PiAyNCkgJiAweGZmOworICAgIGludCBiMSA9ICh4ID4+IDE2KSAmIDB4ZmY7CisgICAgaW50IGIyID0gKHggPj4gIDgpICYgMHhmZjsKKyAgICBpbnQgYjMgPSAoeCAgICAgICkgJiAweGZmOworICAgIAorICAgIHJldHVybiAodWludDMyX3QpKChiMyA8PCAyNCkgfCAoYjIgPDwgMTYpIHwgKGIxIDw8IDgpIHwgYjApOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitpbml0X3RhYmxlcygpCit7CisgICAgaWYgKHRhYmxlc19pbml0aWFsaXplZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgNjQ7IGorKykgeworICAgICAgICAgICAgaW50IGF2ZyA9ICgyKmkgKyBqKS8zOworICAgICAgICAgICAgYXZnMjN0YWJbKGkgPDwgNikgfCBqXSA9IGF2ZzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGFzbSB2b2xhdGlsZSAoIiIgOiA6IDogIm1lbW9yeSIpOworICAgIHRhYmxlc19pbml0aWFsaXplZCA9IDE7Cit9CisKKy8qCisgKiBVdGlsaXR5IHRvIHNjYW4gYSBEWFQxIGNvbXByZXNzZWQgdGV4dHVyZSB0byBkZXRlcm1pbmUgd2hldGhlciBpdAorICogY29udGFpbnMgYSB0cmFuc3BhcmVudCBwaXhlbCAoY29sb3IwIDwgY29sb3IxLCBjb2RlID09IDMpLiAgVGhpcworICogbWF5IGJlIHVzZWZ1bCBpZiB0aGUgYXBwbGljYXRpb24gbGFja3MgaW5mb3JtYXRpb24gYXMgdG8gd2hldGhlcgorICogdGhlIHRydWUgZm9ybWF0IGlzIEdMX0NPTVBSRVNTRURfUkdCX1MzVENfRFhUMV9FWFQgb3IKKyAqIEdMX0NPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDFfRVhULgorICovCitib29sCitEWFQxSGFzQWxwaGEoY29uc3QgR0x2b2lkICpkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsgICAgCisjaWYgVElNSU5HCisgICAgc3RydWN0IHRpbWV2YWwgc3RhcnRfdCwgZW5kX3Q7CisgICAgc3RydWN0IHRpbWV6b25lIHR6OworICAgIAorICAgIGdldHRpbWVvZmRheSgmc3RhcnRfdCwgJnR6KTsKKyNlbmRpZgorCisgICAgYm9vbCBoYXNBbHBoYSA9IGZhbHNlOworCisgICAgaW50IHhibG9ja3MgPSAod2lkdGggKyAzKS80OworICAgIGludCB5YmxvY2tzID0gKGhlaWdodCArIDMpLzQ7CisgICAgaW50IG51bWJsb2NrcyA9IHhibG9ja3MqeWJsb2NrczsKKworICAgIHVpbnQzMl90IGNvbnN0ICpkMzIgPSAodWludDMyX3QgKilkYXRhOworICAgIGZvciAoaW50IGIgPSAwOyBiIDwgbnVtYmxvY2tzOyBiKyspIHsKKyAgICAgICAgdWludDMyX3QgY29sb3JzID0gKmQzMisrOworICAgICAgICAKKyNpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisgICAgICAgIGNvbG9ycyA9IHN3YXAoY29sb3JzKTsKKyNlbmRpZgorICAgICAgICAKKyAgICAgICAgdWludDE2X3QgY29sb3IwID0gY29sb3JzICYgMHhmZmZmOworICAgICAgICB1aW50MTZfdCBjb2xvcjEgPSBjb2xvcnMgPj4gMTY7CisgICAgICAgIAorICAgICAgICBpZiAoY29sb3IwIDwgY29sb3IxKSB7CisgICAgICAgICAgICAvLyBUaGVyZSdzIG5vIG5lZWQgdG8gZW5kaWFuLXN3YXAgd2l0aGluICdiaXRzJworICAgICAgICAgICAgLy8gc2luY2Ugd2UgZG9uJ3QgY2FyZSB3aGljaCBwaXhlbCBpcyB0aGUgdHJhbnNwYXJlbnQgb25lCisgICAgICAgICAgICB1aW50MzJfdCBiaXRzID0gKmQzMisrOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBEZXRlY3QgaWYgYW55IChvZGQsIGV2ZW4pIHBhaXIgb2YgYml0cyBhcmUgJzExJworICAgICAgICAgICAgLy8gICAgICBiaXRzOiBiMzEgYjMwIGIyOSAuLi4gYjMgYjIgYjEgYjAKKyAgICAgICAgICAgIC8vIGJpdHMgPj4gMTogYjMxIGIzMSBiMzAgLi4uIGI0IGIzIGIyIGIxCisgICAgICAgICAgICAvLyAgICAgICAgICY6IGIzMSAoYjMxICYgYjMwKSAoYjI5ICYgYjI4KSAuLi4gKGIyICYgYjEpIChiMSAmIGIwKQorICAgICAgICAgICAgLy8gICYgMHg1NS4uOiAgIDAgKGIzMSAmIGIzMCkgICAgICAgMCAgICAgLi4uICAgICAwICAgICAoYjEgJiBiMCkKKyAgICAgICAgICAgIGlmICgoKGJpdHMgJiAoYml0cyA+PiAxKSkgJiAweDU1NTU1NTU1KSAhPSAwKSB7CisgICAgICAgICAgICAgICAgaGFzQWxwaGEgPSB0cnVlOworICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFNraXAgNCBieXRlcworICAgICAgICAgICAgKytkMzI7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgZG9uZToKKyNpZiBUSU1JTkcKKyAgICBnZXR0aW1lb2ZkYXkoJmVuZF90LCAmdHopOworICAgIGxvbmcgdXNlYyA9IChlbmRfdC50dl9zZWMgLSBzdGFydF90LnR2X3NlYykqMTAwMDAwMCArCisgICAgICAgIChlbmRfdC50dl91c2VjIC0gc3RhcnRfdC50dl91c2VjKTsKKyAgICAKKyAgICBwcmludGYoIlNjYW5uZWQgdz0lZCBoPSVkIGluICVsZCB1c2VjXG4iLCB3aWR0aCwgaGVpZ2h0LCB1c2VjKTsKKyNlbmRpZgorICAgIAorICAgIHJldHVybiBoYXNBbHBoYTsKK30KKworc3RhdGljIHZvaWQKK2RlY29kZURYVDEoY29uc3QgR0x2b2lkICpkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgIHZvaWQgKnN1cmZhY2UsIGludCBzdHJpZGUsCisgICAgICAgICAgIGJvb2wgaGFzQWxwaGEpCisgICAgCit7CisgICAgaW5pdF90YWJsZXMoKTsKKyAgICAKKyAgICB1aW50MzJfdCBjb25zdCAqZDMyID0gKHVpbnQzMl90ICopZGF0YTsKKyAgICAKKyAgICAvLyBDb2xvciB0YWJsZSBmb3IgdGhlIGN1cnJlbnQgYmxvY2sKKyAgICB1aW50MTZfdCBjWzRdOworICAgIGNbMF0gPSBjWzFdID0gY1syXSA9IGNbM10gPSAwOworICAgIAorICAgIC8vIFNwZWNpZmllZCBjb2xvcnMgZnJvbSB0aGUgcHJldmlvdXMgYmxvY2sKKyAgICB1aW50MTZfdCBwcmV2X2NvbG9yMCA9IDB4MDAwMDsKKyAgICB1aW50MTZfdCBwcmV2X2NvbG9yMSA9IDB4MDAwMDsKKyAgICAKKyAgICB1aW50MTZfdCogcm93UHRyID0gKHVpbnQxNl90KilzdXJmYWNlOworICAgIGZvciAoaW50IGJhc2VfeSA9IDA7IGJhc2VfeSA8IGhlaWdodDsgYmFzZV95ICs9IDQsIHJvd1B0ciArPSA0KnN0cmlkZSkgeworICAgICAgICB1aW50MTZfdCAqYmxvY2tQdHIgPSByb3dQdHI7CisgICAgICAgIGZvciAoaW50IGJhc2VfeCA9IDA7IGJhc2VfeCA8IHdpZHRoOyBiYXNlX3ggKz0gNCwgYmxvY2tQdHIgKz0gNCkgeworICAgICAgICAgICAgdWludDMyX3QgY29sb3JzID0gKmQzMisrOworICAgICAgICAgICAgdWludDMyX3QgYml0cyA9ICpkMzIrKzsKKyAgICAgICAgICAgIAorI2lmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKyAgICAgICAgICAgIGNvbG9ycyA9IHN3YXAoY29sb3JzKTsKKyAgICAgICAgICAgIGJpdHMgPSBzd2FwKGJpdHMpOworI2VuZGlmCisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFJhdyBjb2xvcnMKKyAgICAgICAgICAgIHVpbnQxNl90IGNvbG9yMCA9IGNvbG9ycyAmIDB4ZmZmZjsKKyAgICAgICAgICAgIHVpbnQxNl90IGNvbG9yMSA9IGNvbG9ycyA+PiAxNjsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gSWYgdGhlIG5ldyBibG9jayBoYXMgdGhlIHNhbWUgYmFzZSBjb2xvcnMgYXMgdGhlCisgICAgICAgICAgICAvLyBwcmV2aW91cyBvbmUsIHdlIGRvbid0IG5lZWQgdG8gcmVjb21wdXRlIHRoZSBjb2xvcgorICAgICAgICAgICAgLy8gdGFibGUgY1tdCisgICAgICAgICAgICBpZiAoY29sb3IwICE9IHByZXZfY29sb3IwIHx8IGNvbG9yMSAhPSBwcmV2X2NvbG9yMSkgeworICAgICAgICAgICAgICAgIC8vIFN0b3JlIHJhdyBjb2xvcnMgZm9yIGNvbXBhcmlzb24gd2l0aCBuZXh0IGJsb2NrCisgICAgICAgICAgICAgICAgcHJldl9jb2xvcjAgPSBjb2xvcjA7CisgICAgICAgICAgICAgICAgcHJldl9jb2xvcjEgPSBjb2xvcjE7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaW50IHIwID0gICByZWQoY29sb3IwKTsKKyAgICAgICAgICAgICAgICBpbnQgZzAgPSBncmVlbihjb2xvcjApOworICAgICAgICAgICAgICAgIGludCBiMCA9ICBibHVlKGNvbG9yMCk7CisKKyAgICAgICAgICAgICAgICBpbnQgcjEgPSAgIHJlZChjb2xvcjEpOworICAgICAgICAgICAgICAgIGludCBnMSA9IGdyZWVuKGNvbG9yMSk7CisgICAgICAgICAgICAgICAgaW50IGIxID0gIGJsdWUoY29sb3IxKTsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKGhhc0FscGhhKSB7CisgICAgICAgICAgICAgICAgICAgIGNbMF0gPSAocjAgPDwgMTEpIHwgKChnMCA+PiAxKSA8PCA2KSB8IChiMCA8PCAxKSB8IDB4MTsKKyAgICAgICAgICAgICAgICAgICAgY1sxXSA9IChyMSA8PCAxMSkgfCAoKGcxID4+IDEpIDw8IDYpIHwgKGIxIDw8IDEpIHwgMHgxOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNbMF0gPSBjb2xvcjA7CisgICAgICAgICAgICAgICAgICAgIGNbMV0gPSBjb2xvcjE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGludCByMiwgZzIsIGIyLCByMywgZzMsIGIzLCBhMzsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpbnQgYmJpdHMgPSBiaXRzID4+IDE7CisgICAgICAgICAgICAgICAgYm9vbCBoYXMyID0gKChiYml0cyAmIH5iaXRzKSAmIDB4NTU1NTU1NTUpICE9IDA7CisgICAgICAgICAgICAgICAgYm9vbCBoYXMzID0gKChiYml0cyAmICBiaXRzKSAmIDB4NTU1NTU1NTUpICE9IDA7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKGhhczIgfHwgaGFzMykgeworICAgICAgICAgICAgICAgICAgICBpZiAoY29sb3IwID4gY29sb3IxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByMiA9IGF2ZzIzKHIwLCByMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBnMiA9IGF2ZzIzKGcwLCBnMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBiMiA9IGF2ZzIzKGIwLCBiMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIHIzID0gYXZnMjMocjEsIHIwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGczID0gYXZnMjMoZzEsIGcwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGIzID0gYXZnMjMoYjEsIGIwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGEzID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIyID0gKHIwICsgcjEpID4+IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBnMiA9IChnMCArIGcxKSA+PiAxOworICAgICAgICAgICAgICAgICAgICAgICAgYjIgPSAoYjAgKyBiMSkgPj4gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgcjMgPSBnMyA9IGIzID0gYTMgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChoYXNBbHBoYSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY1syXSA9IChyMiA8PCAxMSkgfCAoKGcyID4+IDEpIDw8IDYpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYjIgPDwgMSkgfCAweDE7CisgICAgICAgICAgICAgICAgICAgICAgICBjWzNdID0gKHIzIDw8IDExKSB8ICgoZzMgPj4gMSkgPDwgNikgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiMyA8PCAxKSB8IGEzOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgY1syXSA9IChyMiA8PCAxMSkgfCAoZzIgPDwgNSkgfCBiMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNbM10gPSAocjMgPDwgMTEpIHwgKGczIDw8IDUpIHwgYjM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHVpbnQxNl90KiBibG9ja1Jvd1B0ciA9IGJsb2NrUHRyOworICAgICAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCA0OyB5KyssIGJsb2NrUm93UHRyICs9IHN0cmlkZSkgeworICAgICAgICAgICAgICAgIC8vIERvbid0IHByb2Nlc3Mgcm93cyBwYXN0IHRoZSBib3RvbQorICAgICAgICAgICAgICAgIGlmIChiYXNlX3kgKyB5ID49IGhlaWdodCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaW50IHcgPSBtaW4od2lkdGggLSBiYXNlX3gsIDQpOworICAgICAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgdzsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBjb2RlID0gYml0cyAmIDB4MzsKKyAgICAgICAgICAgICAgICAgICAgYml0cyA+Pj0gMjsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGJsb2NrUm93UHRyW3hdID0gY1tjb2RlXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisgICAgCisvLyBPdXRwdXQgZGF0YSBhcyBpbnRlcm5hbGZvcm1hdD1HTF9SR0JBLCB0eXBlPUdMX1VOU0lHTkVEX0JZVEUKK3N0YXRpYyB2b2lkCitkZWNvZGVEWFQzKGNvbnN0IEdMdm9pZCAqZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICB2b2lkICpzdXJmYWNlLCBpbnQgc3RyaWRlKQorCit7CisgICAgaW5pdF90YWJsZXMoKTsKKyAgICAKKyAgICB1aW50MzJfdCBjb25zdCAqZDMyID0gKHVpbnQzMl90ICopZGF0YTsKKyAgICAKKyAgICAvLyBTcGVjaWZpZWQgY29sb3JzIGZyb20gdGhlIHByZXZpb3VzIGJsb2NrCisgICAgdWludDE2X3QgcHJldl9jb2xvcjAgPSAweDAwMDA7CisgICAgdWludDE2X3QgcHJldl9jb2xvcjEgPSAweDAwMDA7CisKKyAgICAvLyBDb2xvciB0YWJsZSBmb3IgdGhlIGN1cnJlbnQgYmxvY2sKKyAgICB1aW50MzJfdCBjWzRdOworICAgIGNbMF0gPSBjWzFdID0gY1syXSA9IGNbM10gPSAwOworCisgICAgdWludDMyX3QqIHJvd1B0ciA9ICh1aW50MzJfdCopc3VyZmFjZTsKKyAgICBmb3IgKGludCBiYXNlX3kgPSAwOyBiYXNlX3kgPCBoZWlnaHQ7IGJhc2VfeSArPSA0LCByb3dQdHIgKz0gNCpzdHJpZGUpIHsKKyAgICAgICAgdWludDMyX3QgKmJsb2NrUHRyID0gcm93UHRyOworICAgICAgICBmb3IgKGludCBiYXNlX3ggPSAwOyBiYXNlX3ggPCB3aWR0aDsgYmFzZV94ICs9IDQsIGJsb2NrUHRyICs9IDQpIHsKKyAgICAgICAgICAgIAorI2lmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKyAgICAgICAgICAgIHVpbnQzMl90IGFscGhhaGkgPSAqZDMyKys7CisgICAgICAgICAgICB1aW50MzJfdCBhbHBoYWxvID0gKmQzMisrOworICAgICAgICAgICAgYWxwaGFoaSA9IHN3YXAoYWxwaGFoaSk7CisgICAgICAgICAgICBhbHBoYWxvID0gc3dhcChhbHBoYWxvKTsKKyNlbHNlCisgICAgICAgICAgICB1aW50MzJfdCBhbHBoYWxvID0gKmQzMisrOworICAgICAgICAgICAgdWludDMyX3QgYWxwaGFoaSA9ICpkMzIrKzsKKyNlbmRpZgorCisgICAgICAgICAgICB1aW50MzJfdCBjb2xvcnMgPSAqZDMyKys7CisgICAgICAgICAgICB1aW50MzJfdCBiaXRzID0gKmQzMisrOworICAgICAgICAgICAgCisjaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorICAgICAgICAgICAgY29sb3JzID0gc3dhcChjb2xvcnMpOworICAgICAgICAgICAgYml0cyA9IHN3YXAoYml0cyk7CisjZW5kaWYKKyAgICAgICAgICAgIAorICAgICAgICAgICAgdWludDY0X3QgYWxwaGEgPSAoKHVpbnQ2NF90KWFscGhhaGkgPDwgMzIpIHwgYWxwaGFsbzsKKworICAgICAgICAgICAgLy8gUmF3IGNvbG9ycworICAgICAgICAgICAgdWludDE2X3QgY29sb3IwID0gY29sb3JzICYgMHhmZmZmOworICAgICAgICAgICAgdWludDE2X3QgY29sb3IxID0gY29sb3JzID4+IDE2OworCisgICAgICAgICAgICAvLyBJZiB0aGUgbmV3IGJsb2NrIGhhcyB0aGUgc2FtZSBiYXNlIGNvbG9ycyBhcyB0aGUKKyAgICAgICAgICAgIC8vIHByZXZpb3VzIG9uZSwgd2UgZG9uJ3QgbmVlZCB0byByZWNvbXB1dGUgdGhlIGNvbG9yCisgICAgICAgICAgICAvLyB0YWJsZSBjW10KKyAgICAgICAgICAgIGlmIChjb2xvcjAgIT0gcHJldl9jb2xvcjAgfHwgY29sb3IxICE9IHByZXZfY29sb3IxKSB7CisgICAgICAgICAgICAgICAgLy8gU3RvcmUgcmF3IGNvbG9ycyBmb3IgY29tcGFyaXNvbiB3aXRoIG5leHQgYmxvY2sKKyAgICAgICAgICAgICAgICBwcmV2X2NvbG9yMCA9IGNvbG9yMDsKKyAgICAgICAgICAgICAgICBwcmV2X2NvbG9yMSA9IGNvbG9yMTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpbnQgYmJpdHMgPSBiaXRzID4+IDE7CisgICAgICAgICAgICAgICAgYm9vbCBoYXMyID0gKChiYml0cyAmIH5iaXRzKSAmIDB4NTU1NTU1NTUpICE9IDA7CisgICAgICAgICAgICAgICAgYm9vbCBoYXMzID0gKChiYml0cyAmICBiaXRzKSAmIDB4NTU1NTU1NTUpICE9IDA7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKGhhczIgfHwgaGFzMykgeworICAgICAgICAgICAgICAgICAgICBpbnQgcjAgPSAgIHJlZChjb2xvcjApOworICAgICAgICAgICAgICAgICAgICBpbnQgZzAgPSBncmVlbihjb2xvcjApOworICAgICAgICAgICAgICAgICAgICBpbnQgYjAgPSAgYmx1ZShjb2xvcjApOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaW50IHIxID0gICByZWQoY29sb3IxKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGcxID0gZ3JlZW4oY29sb3IxKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGIxID0gIGJsdWUoY29sb3IxKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGludCByMiA9IGF2ZzIzKHIwLCByMSk7CisgICAgICAgICAgICAgICAgICAgIGludCBnMiA9IGF2ZzIzKGcwLCBnMSk7CisgICAgICAgICAgICAgICAgICAgIGludCBiMiA9IGF2ZzIzKGIwLCBiMSk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpbnQgcjMgPSBhdmcyMyhyMSwgcjApOworICAgICAgICAgICAgICAgICAgICBpbnQgZzMgPSBhdmcyMyhnMSwgZzApOworICAgICAgICAgICAgICAgICAgICBpbnQgYjMgPSBhdmcyMyhiMSwgYjApOworCisgICAgICAgICAgICAgICAgICAgIGNbMF0gPSByZ2I1NjVTZXBUbzg4OChyMCwgZzAsIGIwKTsKKyAgICAgICAgICAgICAgICAgICAgY1sxXSA9IHJnYjU2NVNlcFRvODg4KHIxLCBnMSwgYjEpOworICAgICAgICAgICAgICAgICAgICBjWzJdID0gcmdiNTY1U2VwVG84ODgocjIsIGcyLCBiMik7CisgICAgICAgICAgICAgICAgICAgIGNbM10gPSByZ2I1NjVTZXBUbzg4OChyMywgZzMsIGIzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IHRvIDggYml0cworICAgICAgICAgICAgICAgICAgICBjWzBdID0gcmdiNTY1VG84ODgoY29sb3IwKTsKKyAgICAgICAgICAgICAgICAgICAgY1sxXSA9IHJnYjU2NVRvODg4KGNvbG9yMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50MzJfdCogYmxvY2tSb3dQdHIgPSBibG9ja1B0cjsKKyAgICAgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgNDsgeSsrLCBibG9ja1Jvd1B0ciArPSBzdHJpZGUpIHsKKyAgICAgICAgICAgICAgICAvLyBEb24ndCBwcm9jZXNzIHJvd3MgcGFzdCB0aGUgYm90b20KKyAgICAgICAgICAgICAgICBpZiAoYmFzZV95ICsgeSA+PSBoZWlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGludCB3ID0gbWluKHdpZHRoIC0gYmFzZV94LCA0KTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICAgICAgICAgICAgICBpbnQgYSA9IGFscGhhICYgMHhmOworICAgICAgICAgICAgICAgICAgICBhbHBoYSA+Pj0gNDsKKworICAgICAgICAgICAgICAgICAgICBpbnQgY29kZSA9IGJpdHMgJiAweDM7CisgICAgICAgICAgICAgICAgICAgIGJpdHMgPj49IDI7CisKKyAgICAgICAgICAgICAgICAgICAgYmxvY2tSb3dQdHJbeF0gPSBjW2NvZGVdIHwgKGEgPDwgMjgpIHwgKGEgPDwgMjQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworLy8gT3V0cHV0IGRhdGEgYXMgaW50ZXJuYWxmb3JtYXQ9R0xfUkdCQSwgdHlwZT1HTF9VTlNJR05FRF9CWVRFCitzdGF0aWMgdm9pZAorZGVjb2RlRFhUNShjb25zdCBHTHZvaWQgKmRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgdm9pZCAqc3VyZmFjZSwgaW50IHN0cmlkZSkKKworeworICAgIGluaXRfdGFibGVzKCk7CisgICAgCisgICAgdWludDMyX3QgY29uc3QgKmQzMiA9ICh1aW50MzJfdCAqKWRhdGE7CisgICAgCisgICAgLy8gU3BlY2lmaWVkIGFscGhhcyBmcm9tIHRoZSBwcmV2aW91cyBibG9jaworICAgIHVpbnQ4X3QgcHJldl9hbHBoYTAgPSAweDAwOworICAgIHVpbnQ4X3QgcHJldl9hbHBoYTEgPSAweDAwOworCisgICAgLy8gU3BlY2lmaWVkIGNvbG9ycyBmcm9tIHRoZSBwcmV2aW91cyBibG9jaworICAgIHVpbnQxNl90IHByZXZfY29sb3IwID0gMHgwMDAwOworICAgICB1aW50MTZfdCBwcmV2X2NvbG9yMSA9IDB4MDAwMDsKKworICAgIC8vIEFscGhhIHRhYmxlIGZvciB0aGUgY3VycmVudCBibG9jaworICAgIHVpbnQ4X3QgYVs4XTsKKyAgICBhWzBdID0gYVsxXSA9IGFbMl0gPSBhWzNdID0gYVs0XSA9IGFbNV0gPSBhWzZdID0gYVs3XSA9IDA7CisKKyAgICAvLyBDb2xvciB0YWJsZSBmb3IgdGhlIGN1cnJlbnQgYmxvY2sKKyAgICB1aW50MzJfdCBjWzRdOworICAgIGNbMF0gPSBjWzFdID0gY1syXSA9IGNbM10gPSAwOworCisgICAgaW50IGdvb2RfYTUgPSAwOworICAgIGludCBiYWRfYTUgPSAwOworICAgIGludCBnb29kX2E2ID0gMDsKKyAgICBpbnQgYmFkX2E2ID0gMDsKKyAgICBpbnQgZ29vZF9hNyA9IDA7CisgICAgaW50IGJhZF9hNyA9IDA7CisKKyAgICB1aW50MzJfdCogcm93UHRyID0gKHVpbnQzMl90KilzdXJmYWNlOworICAgIGZvciAoaW50IGJhc2VfeSA9IDA7IGJhc2VfeSA8IGhlaWdodDsgYmFzZV95ICs9IDQsIHJvd1B0ciArPSA0KnN0cmlkZSkgeworICAgICAgICB1aW50MzJfdCAqYmxvY2tQdHIgPSByb3dQdHI7CisgICAgICAgIGZvciAoaW50IGJhc2VfeCA9IDA7IGJhc2VfeCA8IHdpZHRoOyBiYXNlX3ggKz0gNCwgYmxvY2tQdHIgKz0gNCkgeworICAgICAgICAgICAgCisjaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorICAgICAgICAgICAgdWludDMyX3QgYWxwaGFoaSA9ICpkMzIrKzsKKyAgICAgICAgICAgIHVpbnQzMl90IGFscGhhbG8gPSAqZDMyKys7CisgICAgICAgICAgICBhbHBoYWhpID0gc3dhcChhbHBoYWhpKTsKKyAgICAgICAgICAgIGFscGhhbG8gPSBzd2FwKGFscGhhbG8pOworI2Vsc2UKKyAgICAgICAgICAgICB1aW50MzJfdCBhbHBoYWxvID0gKmQzMisrOworICAgICAgICAgICAgIHVpbnQzMl90IGFscGhhaGkgPSAqZDMyKys7CisjZW5kaWYKKworICAgICAgICAgICAgdWludDMyX3QgY29sb3JzID0gKmQzMisrOworICAgICAgICAgICAgdWludDMyX3QgYml0cyA9ICpkMzIrKzsKKyAgICAgICAgICAgIAorI2lmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU54CisgICAgICAgICAgICBjb2xvcnMgPSBzd2FwKGNvbG9ycyk7CisgICAgICAgICAgICBiaXRzID0gc3dhcChiaXRzKTsKKyNlbmRpZgorICAgICAgICAgICAgCisgICAgICAgICAgICB1aW50NjRfdCBhbHBoYSA9ICgodWludDY0X3QpYWxwaGFoaSA8PCAzMikgfCBhbHBoYWxvOworICAgICAgICAgICAgdWludDY0X3QgYWxwaGEwID0gYWxwaGEgJiAweGZmOworICAgICAgICAgICAgYWxwaGEgPj49IDg7CisgICAgICAgICAgICB1aW50NjRfdCBhbHBoYTEgPSBhbHBoYSAmIDB4ZmY7CisgICAgICAgICAgICBhbHBoYSA+Pj0gODsKKworICAgICAgICAgICAgaWYgKGFscGhhMCAhPSBwcmV2X2FscGhhMCB8fCBhbHBoYTEgIT0gcHJldl9hbHBoYTEpIHsKKyAgICAgICAgICAgICAgICBwcmV2X2FscGhhMCA9IGFscGhhMDsKKyAgICAgICAgICAgICAgICBwcmV2X2FscGhhMSA9IGFscGhhMTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBhWzBdID0gYWxwaGEwOworICAgICAgICAgICAgICAgIGFbMV0gPSBhbHBoYTE7CisgICAgICAgICAgICAgICAgaW50IGEwMSA9IGFscGhhMCArIGFscGhhMSAtIDE7CisgICAgICAgICAgICAgICAgaWYgKGFscGhhMCA+IGFscGhhMSkgeworICAgICAgICAgICAgICAgICAgICBhWzJdID0gZGl2Nyg2KmFscGhhMCArICAgYWxwaGExKTsKKyAgICAgICAgICAgICAgICAgICAgYVs0XSA9IGRpdjcoNCphbHBoYTAgKyAzKmFscGhhMSk7CisgICAgICAgICAgICAgICAgICAgIGFbNl0gPSBkaXY3KDIqYWxwaGEwICsgNSphbHBoYTEpOworCisgICAgICAgICAgICAgICAgICAgIC8vIFVzZSBzeW1tZXRyeSB0byBkZXJpdmUgaGFsZiBvZiB0aGUgdmFsdWVzCisgICAgICAgICAgICAgICAgICAgIC8vIEEgZmV3IHZhbHVlcyB3aWxsIGJlIG9mZiBieSAxICh+LjUlKQorICAgICAgICAgICAgICAgICAgICAvLyBBbHRlcm5hdGUgd2hpY2ggdmFsdWVzIGFyZSBjb21wdXRlZCBkaXJlY3RseQorICAgICAgICAgICAgICAgICAgICAvLyBhbmQgd2hpY2ggYXJlIGRlcml2ZWQgdG8gdHJ5IHRvIHJlZHVjZSBiaWFzCisgICAgICAgICAgICAgICAgICAgIGFbM10gPSBhMDEgLSBhWzZdOworICAgICAgICAgICAgICAgICAgICBhWzVdID0gYTAxIC0gYVs0XTsKKyAgICAgICAgICAgICAgICAgICAgYVs3XSA9IGEwMSAtIGFbMl07CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYVsyXSA9IGRpdjUoNCphbHBoYTAgKyAgIGFscGhhMSk7CisgICAgICAgICAgICAgICAgICAgIGFbNF0gPSBkaXY1KDIqYWxwaGEwICsgMyphbHBoYTEpOworICAgICAgICAgICAgICAgICAgICBhWzNdID0gYTAxIC0gYVs0XTsKKyAgICAgICAgICAgICAgICAgICAgYVs1XSA9IGEwMSAtIGFbMl07CisgICAgICAgICAgICAgICAgICAgIGFbNl0gPSAweDAwOworICAgICAgICAgICAgICAgICAgICBhWzddID0gMHhmZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFJhdyBjb2xvcnMKKyAgICAgICAgICAgIHVpbnQxNl90IGNvbG9yMCA9IGNvbG9ycyAmIDB4ZmZmZjsKKyAgICAgICAgICAgIHVpbnQxNl90IGNvbG9yMSA9IGNvbG9ycyA+PiAxNjsKKworICAgICAgICAgICAgLy8gSWYgdGhlIG5ldyBibG9jayBoYXMgdGhlIHNhbWUgYmFzZSBjb2xvcnMgYXMgdGhlCisgICAgICAgICAgICAvLyBwcmV2aW91cyBvbmUsIHdlIGRvbid0IG5lZWQgdG8gcmVjb21wdXRlIHRoZSBjb2xvcgorICAgICAgICAgICAgLy8gdGFibGUgY1tdCisgICAgICAgICAgICBpZiAoY29sb3IwICE9IHByZXZfY29sb3IwIHx8IGNvbG9yMSAhPSBwcmV2X2NvbG9yMSkgeworICAgICAgICAgICAgICAgIC8vIFN0b3JlIHJhdyBjb2xvcnMgZm9yIGNvbXBhcmlzb24gd2l0aCBuZXh0IGJsb2NrCisgICAgICAgICAgICAgICAgcHJldl9jb2xvcjAgPSBjb2xvcjA7CisgICAgICAgICAgICAgICAgcHJldl9jb2xvcjEgPSBjb2xvcjE7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaW50IGJiaXRzID0gYml0cyA+PiAxOworICAgICAgICAgICAgICAgIGJvb2wgaGFzMiA9ICgoYmJpdHMgJiB+Yml0cykgJiAweDU1NTU1NTU1KSAhPSAwOworICAgICAgICAgICAgICAgIGJvb2wgaGFzMyA9ICgoYmJpdHMgJiAgYml0cykgJiAweDU1NTU1NTU1KSAhPSAwOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChoYXMyIHx8IGhhczMpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHIwID0gICByZWQoY29sb3IwKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGcwID0gZ3JlZW4oY29sb3IwKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGIwID0gIGJsdWUoY29sb3IwKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGludCByMSA9ICAgcmVkKGNvbG9yMSk7CisgICAgICAgICAgICAgICAgICAgIGludCBnMSA9IGdyZWVuKGNvbG9yMSk7CisgICAgICAgICAgICAgICAgICAgIGludCBiMSA9ICBibHVlKGNvbG9yMSk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGludCByMiA9IGF2ZzIzKHIwLCByMSk7CisgICAgICAgICAgICAgICAgICAgIGludCBnMiA9IGF2ZzIzKGcwLCBnMSk7CisgICAgICAgICAgICAgICAgICAgIGludCBiMiA9IGF2ZzIzKGIwLCBiMSk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpbnQgcjMgPSBhdmcyMyhyMSwgcjApOworICAgICAgICAgICAgICAgICAgICBpbnQgZzMgPSBhdmcyMyhnMSwgZzApOworICAgICAgICAgICAgICAgICAgICBpbnQgYjMgPSBhdmcyMyhiMSwgYjApOworCisgICAgICAgICAgICAgICAgICAgIGNbMF0gPSByZ2I1NjVTZXBUbzg4OChyMCwgZzAsIGIwKTsKKyAgICAgICAgICAgICAgICAgICAgY1sxXSA9IHJnYjU2NVNlcFRvODg4KHIxLCBnMSwgYjEpOworICAgICAgICAgICAgICAgICAgICBjWzJdID0gcmdiNTY1U2VwVG84ODgocjIsIGcyLCBiMik7CisgICAgICAgICAgICAgICAgICAgIGNbM10gPSByZ2I1NjVTZXBUbzg4OChyMywgZzMsIGIzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IHRvIDggYml0cworICAgICAgICAgICAgICAgICAgICBjWzBdID0gcmdiNTY1VG84ODgoY29sb3IwKTsKKyAgICAgICAgICAgICAgICAgICAgY1sxXSA9IHJnYjU2NVRvODg4KGNvbG9yMSk7CisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdWludDMyX3QqIGJsb2NrUm93UHRyID0gYmxvY2tQdHI7CisgICAgICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IDQ7IHkrKywgYmxvY2tSb3dQdHIgKz0gc3RyaWRlKSB7CisgICAgICAgICAgICAgICAgLy8gRG9uJ3QgcHJvY2VzcyByb3dzIHBhc3QgdGhlIGJvdG9tCisgICAgICAgICAgICAgICAgaWYgKGJhc2VfeSArIHkgPj0gaGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpbnQgdyA9IG1pbih3aWR0aCAtIGJhc2VfeCwgNCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGFjb2RlID0gYWxwaGEgJiAweDc7CisgICAgICAgICAgICAgICAgICAgIGFscGhhID4+PSAzOworCisgICAgICAgICAgICAgICAgICAgIGludCBjb2RlID0gYml0cyAmIDB4MzsKKyAgICAgICAgICAgICAgICAgICAgYml0cyA+Pj0gMjsKKworICAgICAgICAgICAgICAgICAgICBibG9ja1Jvd1B0clt4XSA9IGNbY29kZV0gfCAoYVthY29kZV0gPDwgMjQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKyAgIAorLyoKKyAqIERlY29kZSBhIERYVC1jb21wcmVzc2VkIHRleHR1cmUgaW50byBtZW1vcnkuICBEWFQgdGV4dHVyZXMgY29uc2lzdCBvZgorICogYSBzZXJpZXMgb2YgNHg0IHBpeGVsIGJsb2NrcyBpbiBsZWZ0LXRvLXJpZ2h0LCB0b3AtZG93biBvcmRlci4KKyAqIFRoZSBudW1iZXIgb2YgYmxvY2tzIGlzIGdpdmVuIGJ5IGNlaWwod2lkdGgvNCkqY2VpbChoZWlnaHQvNCkuCisgKgorICogJ2RhdGEnIHBvaW50cyB0byB0aGUgdGV4dHVyZSBkYXRhLiAnd2lkdGgnIGFuZCAnaGVpZ2h0JyBpbmRpY2F0ZSB0aGUKKyAqIGRpbWVuc2lvbnMgb2YgdGhlIHRleHR1cmUuICBXZSBhc3N1bWUgd2lkdGggYW5kIGhlaWdodCBhcmUgPj0gMCBidXQKKyAqIGRvIG5vdCByZXF1aXJlIHRoZW0gdG8gYmUgcG93ZXJzIG9mIDIgb3IgZGl2aXNpYmxlIGJ5IGFueSBmYWN0b3IuCisgKgorICogVGhlIG91dHB1dCBpcyB3cml0dGVuIHRvICdzdXJmYWNlJyB3aXRoIGVhY2ggc2NhbmxpbmUgc2VwYXJhdGVkIGJ5CisgKiAnc3RyaWRlJyAyLSBvciA0LWJ5dGUgd29yZHMuCisgKgorICogJ2Zvcm1hdCcgaW5kaWNhdGVzIHRoZSB0eXBlIG9mIGNvbXByZXNzaW9uIGFuZCBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorICoKKyAqICAgR0xfQ09NUFJFU1NFRF9SR0JfUzNUQ19EWFQxX0VYVDoKKyAqICAgICAgVGhlIG91dHB1dCBpcyB3cml0dGVuIGFzIDUvNi81IG9wYXF1ZSBSR0IgKDE2IGJpdCB3b3JkcykuCisgKiAgICAgIDggYnl0ZXMgYXJlIHJlYWQgZnJvbSAnZGF0YScgZm9yIGVhY2ggYmxvY2suCisgKgorICogICBHTF9DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQxX0VYVAorICogICAgICBUaGUgb3V0cHV0IGlzIHdyaXR0ZW4gYXMgNS81LzUvMSBSR0JBICgxNiBiaXQgd29yZHMpCisgKiAgICAgIDggYnl0ZXMgYXJlIHJlYWQgZnJvbSAnZGF0YScgZm9yIGVhY2ggYmxvY2suCisgKgorICogICBHTF9DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQzX0VYVAorICogICBHTF9DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQ1X0VYVAorICogICAgICBUaGUgb3V0cHV0IGlzIHdyaXR0ZW4gYXMgOC84LzgvOCBBUkdCICgzMiBiaXQgd29yZHMpCisgKiAgICAgIDE2IGJ5dGVzIGFyZSByZWFkIGZyb20gJ2RhdGEnIGZvciBlYWNoIGJsb2NrLgorICovCit2b2lkCitkZWNvZGVEWFQoY29uc3QgR0x2b2lkICpkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgdm9pZCAqc3VyZmFjZSwgaW50IHN0cmlkZSwgaW50IGZvcm1hdCkKK3sKKyNpZiBUSU1JTkcKKyAgICBzdHJ1Y3QgdGltZXZhbCBzdGFydF90LCBlbmRfdDsKKyAgICBzdHJ1Y3QgdGltZXpvbmUgdHo7CisgICAgCisgICAgZ2V0dGltZW9mZGF5KCZzdGFydF90LCAmdHopOworI2VuZGlmCisKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgIGNhc2UgR0xfQ09NUFJFU1NFRF9SR0JfUzNUQ19EWFQxX0VYVDoKKyAgICAgICAgZGVjb2RlRFhUMShkYXRhLCB3aWR0aCwgaGVpZ2h0LCBzdXJmYWNlLCBzdHJpZGUsIGZhbHNlKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIAorICAgIGNhc2UgR0xfQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQ6CisgICAgICAgIGRlY29kZURYVDEoZGF0YSwgd2lkdGgsIGhlaWdodCwgc3VyZmFjZSwgc3RyaWRlLCB0cnVlKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIAorICAgIGNhc2UgR0xfQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUM19FWFQ6CisgICAgICAgIGRlY29kZURYVDMoZGF0YSwgd2lkdGgsIGhlaWdodCwgc3VyZmFjZSwgc3RyaWRlKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIAorICAgIGNhc2UgR0xfQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUNV9FWFQ6CisgICAgICAgIGRlY29kZURYVDUoZGF0YSwgd2lkdGgsIGhlaWdodCwgc3VyZmFjZSwgc3RyaWRlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIAorI2lmIFRJTUlORworICAgIGdldHRpbWVvZmRheSgmZW5kX3QsICZ0eik7CisgICAgbG9uZyB1c2VjID0gKGVuZF90LnR2X3NlYyAtIHN0YXJ0X3QudHZfc2VjKSoxMDAwMDAwICsKKyAgICAgICAgKGVuZF90LnR2X3VzZWMgLSBzdGFydF90LnR2X3VzZWMpOworICAgIAorICAgIHByaW50ZigiTG9hZGVkIHc9JWQgaD0lZCBpbiAlbGQgdXNlY1xuIiwgd2lkdGgsIGhlaWdodCwgdXNlYyk7CisjZW5kaWYKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYmFnbC9keHQuaCBiL29wZW5nbC9saWJhZ2wvZHh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk1YTM2YwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC9saWJhZ2wvZHh0LmgKQEAgLTAsMCArMSwzMyBAQAorLyogbGlicy9vcGVuZ2xlcy9keHQuaAorKioKKyoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpZm5kZWYgQU5EUk9JRF9PUEVOR0xFU19URVhUVVJFX0gKKyNkZWZpbmUgQU5EUk9JRF9PUEVOR0xFU19URVhUVVJFX0gKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8R0xFUy9nbC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyAgYm9vbCBEWFQxSGFzQWxwaGEoY29uc3QgR0x2b2lkICpkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworICB2b2lkIGRlY29kZURYVChjb25zdCBHTHZvaWQgKmRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgdm9pZCAqc3VyZmFjZSwgaW50IHN0cmlkZSwgaW50IGZvcm1hdCk7CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfT1BFTkdMRVNfVEVYVFVSRV9ICmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL2VnbC5jcHAgYi9vcGVuZ2wvbGliYWdsL2VnbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI5MGJmMAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC9saWJhZ2wvZWdsLmNwcApAQCAtMCwwICsxLDE1NDMgQEAKKy8qIAorKioKKyoqIENvcHlyaWdodCAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNkZWZpbmUgTE9HX1RBRyAiRUdMIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKworI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KKyNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+CisKKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKKyNpbmNsdWRlIDxFR0wvZWdsLmg+CisjaW5jbHVkZSA8RUdML2VnbGV4dC5oPgorI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+CisKKyNpbmNsdWRlIDxwaXhlbGZsaW5nZXIvZm9ybWF0Lmg+CisjaW5jbHVkZSA8cGl4ZWxmbGluZ2VyL3BpeGVsZmxpbmdlci5oPgorCisjaW5jbHVkZSAiY29udGV4dC5oIgorI2luY2x1ZGUgInN0YXRlLmgiCisjaW5jbHVkZSAidGV4dHVyZS5oIgorI2luY2x1ZGUgIm1hdHJpeC5oIgorCisjdW5kZWYgTkVMRU0KKyNkZWZpbmUgTkVMRU0oeCkgKHNpemVvZih4KS9zaXplb2YoKih4KSkpCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK25hbWVzcGFjZSBhbmRyb2lkIHsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY29uc3QgdW5zaWduZWQgaW50IE5VTV9ESVNQTEFZUyA9IDE7CisKK3N0YXRpYyBwdGhyZWFkX211dGV4X3QgZ0luaXRNdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CitzdGF0aWMgcHRocmVhZF9tdXRleF90IGdFcnJvcktleU11dGV4ID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKK3N0YXRpYyBwdGhyZWFkX2tleV90IGdFR0xFcnJvcktleSA9IC0xOworI2lmbmRlZiBIQVZFX0FORFJPSURfT1MKK25hbWVzcGFjZSBnbCB7CitwdGhyZWFkX2tleV90IGdHTEtleSA9IC0xOworfTsgLy8gbmFtZXNwYWNlIGdsCisjZW5kaWYKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0YXRpYyBUIHNldEVycm9yKEdMaW50IGVycm9yLCBUIHJldHVyblZhbHVlKSB7CisgICAgaWYgKGdnbF91bmxpa2VseShnRUdMRXJyb3JLZXkgPT0gLTEpKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ0Vycm9yS2V5TXV0ZXgpOworICAgICAgICBpZiAoZ0VHTEVycm9yS2V5ID09IC0xKQorICAgICAgICAgICAgcHRocmVhZF9rZXlfY3JlYXRlKCZnRUdMRXJyb3JLZXksIE5VTEwpOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ0Vycm9yS2V5TXV0ZXgpOworICAgIH0KKyAgICBwdGhyZWFkX3NldHNwZWNpZmljKGdFR0xFcnJvcktleSwgKHZvaWQqKWVycm9yKTsKKyAgICByZXR1cm4gcmV0dXJuVmFsdWU7Cit9CisKK3N0YXRpYyBHTGludCBnZXRFcnJvcigpIHsKKyAgICBpZiAoZ2dsX3VubGlrZWx5KGdFR0xFcnJvcktleSA9PSAtMSkpCisgICAgICAgIHJldHVybiBFR0xfU1VDQ0VTUzsKKyAgICBHTGludCBlcnJvciA9IChHTGludClwdGhyZWFkX2dldHNwZWNpZmljKGdFR0xFcnJvcktleSk7CisgICAgcHRocmVhZF9zZXRzcGVjaWZpYyhnRUdMRXJyb3JLZXksICh2b2lkKilFR0xfU1VDQ0VTUyk7CisgICAgcmV0dXJuIGVycm9yOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0cnVjdCBlZ2xfZGlzcGxheV90Cit7CisgICAgZWdsX2Rpc3BsYXlfdCgpIDogdHlwZSgwKSwgaW5pdGlhbGl6ZWQoMCkgeyB9CisgICAgCisgICAgc3RhdGljIGVnbF9kaXNwbGF5X3QmIGdldF9kaXNwbGF5KEVHTERpc3BsYXkgZHB5KTsKKyAgICAKKyAgICBzdGF0aWMgRUdMQm9vbGVhbiBpc192YWxpZChFR0xEaXNwbGF5IGRweSkgeworICAgICAgICByZXR1cm4gKCh1aW50cHRyX3QoZHB5KS0xVSkgPj0gTlVNX0RJU1BMQVlTKSA/IEVHTF9GQUxTRSA6IEVHTF9UUlVFOworICAgIH0KKworICAgIE5hdGl2ZURpc3BsYXlUeXBlICAgdHlwZTsKKyAgICB2b2xhdGlsZSBpbnQzMl90ICAgIGluaXRpYWxpemVkOworfTsKKworc3RhdGljIGVnbF9kaXNwbGF5X3QgZ0Rpc3BsYXlzW05VTV9ESVNQTEFZU107CisKK2VnbF9kaXNwbGF5X3QmIGVnbF9kaXNwbGF5X3Q6OmdldF9kaXNwbGF5KEVHTERpc3BsYXkgZHB5KSB7CisgICAgcmV0dXJuIGdEaXNwbGF5c1t1aW50cHRyX3QoZHB5KS0xVV07Cit9CisKK3N0cnVjdCBlZ2xfY29udGV4dF90IHsKKyAgICBlbnVtIHsKKyAgICAgICAgSVNfQ1VSUkVOVCAgICAgID0gICAweDAwMDEwMDAwLAorICAgICAgICBORVZFUl9DVVJSRU5UICAgPSAgIDB4MDAwMjAwMDAKKyAgICB9OworICAgIHVpbnQzMl90ICAgICAgICAgICAgZmxhZ3M7CisgICAgRUdMRGlzcGxheSAgICAgICAgICBkcHk7CisgICAgRUdMQ29uZmlnICAgICAgICAgICBjb25maWc7CisgICAgRUdMU3VyZmFjZSAgICAgICAgICByZWFkOworICAgIEVHTFN1cmZhY2UgICAgICAgICAgZHJhdzsKKworICAgIHN0YXRpYyBpbmxpbmUgZWdsX2NvbnRleHRfdCogY29udGV4dChFR0xDb250ZXh0IGN0eCkgeworICAgICAgICBvZ2xlc19jb250ZXh0X3QqIGNvbnN0IGdsID0gc3RhdGljX2Nhc3Q8b2dsZXNfY29udGV4dF90Kj4oY3R4KTsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGVnbF9jb250ZXh0X3QqPihnbC0+cmFzdGVyaXplci5iYXNlKTsKKyAgICB9Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0cnVjdCBlZ2xfc3VyZmFjZV90Cit7CisgICAgZW51bSB7CisgICAgICAgIFBBR0VfRkxJUCA9IDB4MDAwMDAwMDEsCisgICAgICAgIE1BR0lDICAgICA9IDB4MzE0MTUyNjUKKyAgICB9OworCisgICAgdWludDMyX3QgICAgICAgICAgICBtYWdpYzsKKyAgICBFR0xEaXNwbGF5ICAgICAgICAgIGRweTsKKyAgICBFR0xDb25maWcgICAgICAgICAgIGNvbmZpZzsKKyAgICBFR0xDb250ZXh0ICAgICAgICAgIGN0eDsKKworICAgICAgICAgICAgICAgIGVnbF9zdXJmYWNlX3QoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsIGludDMyX3QgZGVwdGhGb3JtYXQpOworICAgIHZpcnR1YWwgICAgIH5lZ2xfc3VyZmFjZV90KCk7CisgICAgdmlydHVhbCAgICAgYm9vbCAgICBpc1ZhbGlkKCkgY29uc3QgPSAwOworICAgIAorICAgIHZpcnR1YWwgICAgIEVHTEJvb2xlYW4gIGJpbmREcmF3U3VyZmFjZShvZ2xlc19jb250ZXh0X3QqIGdsKSA9IDA7CisgICAgdmlydHVhbCAgICAgRUdMQm9vbGVhbiAgYmluZFJlYWRTdXJmYWNlKG9nbGVzX2NvbnRleHRfdCogZ2wpID0gMDsKKyAgICB2aXJ0dWFsICAgICBFR0xpbnQgICAgICBnZXRXaWR0aCgpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsICAgICBFR0xpbnQgICAgICBnZXRIZWlnaHQoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCAgICAgdm9pZCogICAgICAgZ2V0Qml0cygpIGNvbnN0ID0gMDsKKworICAgIHZpcnR1YWwgICAgIEVHTGludCAgICAgIGdldEhvcml6b250YWxSZXNvbHV0aW9uKCkgY29uc3Q7CisgICAgdmlydHVhbCAgICAgRUdMaW50ICAgICAgZ2V0VmVydGljYWxSZXNvbHV0aW9uKCkgY29uc3Q7CisgICAgdmlydHVhbCAgICAgRUdMaW50ICAgICAgZ2V0UmVmcmVzaFJhdGUoKSBjb25zdDsKKyAgICB2aXJ0dWFsICAgICBFR0xpbnQgICAgICBnZXRTd2FwQmVoYXZpb3IoKSBjb25zdDsKKyAgICB2aXJ0dWFsICAgICBFR0xCb29sZWFuICBzd2FwQnVmZmVycygpOworcHJvdGVjdGVkOgorICAgIEdHTFN1cmZhY2UgICAgICAgICAgICAgIGRlcHRoOworfTsKKworZWdsX3N1cmZhY2VfdDo6ZWdsX3N1cmZhY2VfdChFR0xEaXNwbGF5IGRweSwKKyAgICAgICAgRUdMQ29uZmlnIGNvbmZpZywKKyAgICAgICAgaW50MzJfdCBkZXB0aEZvcm1hdCkKKyAgICA6IG1hZ2ljKE1BR0lDKSwgZHB5KGRweSksIGNvbmZpZyhjb25maWcpLCBjdHgoMCkKK3sKKyAgICBkZXB0aC52ZXJzaW9uID0gc2l6ZW9mKEdHTFN1cmZhY2UpOworICAgIGRlcHRoLmRhdGEgPSAwOworICAgIGRlcHRoLmZvcm1hdCA9IGRlcHRoRm9ybWF0OworfQorZWdsX3N1cmZhY2VfdDo6fmVnbF9zdXJmYWNlX3QoKQoreworICAgIG1hZ2ljID0gMDsKKyAgICBmcmVlKGRlcHRoLmRhdGEpOworfQorRUdMQm9vbGVhbiBlZ2xfc3VyZmFjZV90Ojpzd2FwQnVmZmVycygpIHsKKyAgICByZXR1cm4gRUdMX0ZBTFNFOworfQorRUdMaW50IGVnbF9zdXJmYWNlX3Q6OmdldEhvcml6b250YWxSZXNvbHV0aW9uKCkgY29uc3QgeworICAgIHJldHVybiAoMCAqIEVHTF9ESVNQTEFZX1NDQUxJTkcpICogKDEuMGYgLyAyNS40Zik7Cit9CitFR0xpbnQgZWdsX3N1cmZhY2VfdDo6Z2V0VmVydGljYWxSZXNvbHV0aW9uKCkgY29uc3QgeworICAgIHJldHVybiAoMCAqIEVHTF9ESVNQTEFZX1NDQUxJTkcpICogKDEuMGYgLyAyNS40Zik7Cit9CitFR0xpbnQgZWdsX3N1cmZhY2VfdDo6Z2V0UmVmcmVzaFJhdGUoKSBjb25zdCB7CisgICAgcmV0dXJuICg2MCAqIEVHTF9ESVNQTEFZX1NDQUxJTkcpOworfQorRUdMaW50IGVnbF9zdXJmYWNlX3Q6OmdldFN3YXBCZWhhdmlvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gRUdMX0JVRkZFUl9QUkVTRVJWRUQ7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RydWN0IGVnbF93aW5kb3dfc3VyZmFjZV90IDogcHVibGljIGVnbF9zdXJmYWNlX3QKK3sKKyAgICBlZ2xfd2luZG93X3N1cmZhY2VfdCgKKyAgICAgICAgICAgIEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLAorICAgICAgICAgICAgaW50MzJfdCBkZXB0aEZvcm1hdCwKKyAgICAgICAgICAgIGVnbF9uYXRpdmVfd2luZG93X3QqIHdpbmRvdyk7CisKKyAgICAgfmVnbF93aW5kb3dfc3VyZmFjZV90KCk7CisKKyAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBpc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gbmF0aXZlV2luZG93LT5tYWdpYyA9PSAweDYwMDkxMzsgfSAgICAKKyAgICB2aXJ0dWFsICAgICBFR0xCb29sZWFuICBzd2FwQnVmZmVycygpOworICAgIHZpcnR1YWwgICAgIEVHTEJvb2xlYW4gIGJpbmREcmF3U3VyZmFjZShvZ2xlc19jb250ZXh0X3QqIGdsKTsKKyAgICB2aXJ0dWFsICAgICBFR0xCb29sZWFuICBiaW5kUmVhZFN1cmZhY2Uob2dsZXNfY29udGV4dF90KiBnbCk7CisgICAgdmlydHVhbCAgICAgRUdMaW50ICAgICAgZ2V0V2lkdGgoKSBjb25zdCAgICB7IHJldHVybiBuYXRpdmVXaW5kb3ctPndpZHRoOyAgfQorICAgIHZpcnR1YWwgICAgIEVHTGludCAgICAgIGdldEhlaWdodCgpIGNvbnN0ICAgeyByZXR1cm4gbmF0aXZlV2luZG93LT5oZWlnaHQ7IH0KKyAgICB2aXJ0dWFsICAgICB2b2lkKiAgICAgICBnZXRCaXRzKCkgY29uc3Q7CisgICAgdmlydHVhbCAgICAgRUdMaW50ICAgICAgZ2V0SG9yaXpvbnRhbFJlc29sdXRpb24oKSBjb25zdDsKKyAgICB2aXJ0dWFsICAgICBFR0xpbnQgICAgICBnZXRWZXJ0aWNhbFJlc29sdXRpb24oKSBjb25zdDsKKyAgICB2aXJ0dWFsICAgICBFR0xpbnQgICAgICBnZXRSZWZyZXNoUmF0ZSgpIGNvbnN0OworICAgIHZpcnR1YWwgICAgIEVHTGludCAgICAgIGdldFN3YXBCZWhhdmlvcigpIGNvbnN0OworcHJpdmF0ZToKKyAgICBlZ2xfbmF0aXZlX3dpbmRvd190KiAgICBuYXRpdmVXaW5kb3c7Cit9OworCitlZ2xfd2luZG93X3N1cmZhY2VfdDo6ZWdsX3dpbmRvd19zdXJmYWNlX3QoRUdMRGlzcGxheSBkcHksCisgICAgICAgIEVHTENvbmZpZyBjb25maWcsCisgICAgICAgIGludDMyX3QgZGVwdGhGb3JtYXQsCisgICAgICAgIGVnbF9uYXRpdmVfd2luZG93X3QqIHdpbmRvdykKKyAgICA6IGVnbF9zdXJmYWNlX3QoZHB5LCBjb25maWcsIGRlcHRoRm9ybWF0KSwgbmF0aXZlV2luZG93KHdpbmRvdykKK3sKKyAgICBpZiAoZGVwdGhGb3JtYXQpIHsKKyAgICAgICAgZGVwdGgud2lkdGggICA9IHdpbmRvdy0+d2lkdGg7CisgICAgICAgIGRlcHRoLmhlaWdodCAgPSB3aW5kb3ctPmhlaWdodDsKKyAgICAgICAgZGVwdGguc3RyaWRlICA9IGRlcHRoLndpZHRoOyAvLyB1c2UgdGhlIHdpZHRoIGhlcmUKKyAgICAgICAgZGVwdGguZGF0YSAgICA9IChHR0x1Ynl0ZSopbWFsbG9jKGRlcHRoLnN0cmlkZSpkZXB0aC5oZWlnaHQqMik7CisgICAgICAgIGlmIChkZXB0aC5kYXRhID09IDApIHsKKyAgICAgICAgICAgIHNldEVycm9yKEVHTF9CQURfQUxMT0MsIEVHTF9OT19TVVJGQUNFKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBuYXRpdmVXaW5kb3ctPmluY1JlZihuYXRpdmVXaW5kb3cpOworfQorZWdsX3dpbmRvd19zdXJmYWNlX3Q6On5lZ2xfd2luZG93X3N1cmZhY2VfdCgpIHsKKyAgICBuYXRpdmVXaW5kb3ctPmRlY1JlZihuYXRpdmVXaW5kb3cpOworfQorCitFR0xCb29sZWFuIGVnbF93aW5kb3dfc3VyZmFjZV90Ojpzd2FwQnVmZmVycygpCit7CisgICAgdWludDMyX3QgZmxhZ3MgPSBuYXRpdmVXaW5kb3ctPnN3YXBCdWZmZXJzKG5hdGl2ZVdpbmRvdyk7CisgICAgaWYgKGZsYWdzICYgRUdMX05BVElWRVNfRkxBR19TSVpFX0NIQU5HRUQpIHsKKyAgICAgICAgLy8gVE9ETzogd2UgcHJvYmFibHkgc2hvdWxkIHJlc2V0IHRoZSBzd2FwIHJlY3QgaGVyZQorICAgICAgICAvLyBpZiB0aGUgd2luZG93IHNpemUgaGFzIGNoYW5nZWQKKyAgICAgICAgaWYgKGRlcHRoLmRhdGEpIHsKKyAgICAgICAgICAgIGZyZWUoZGVwdGguZGF0YSk7CisgICAgICAgICAgICBkZXB0aC53aWR0aCAgID0gbmF0aXZlV2luZG93LT53aWR0aDsKKyAgICAgICAgICAgIGRlcHRoLmhlaWdodCAgPSBuYXRpdmVXaW5kb3ctPmhlaWdodDsKKyAgICAgICAgICAgIGRlcHRoLnN0cmlkZSAgPSBuYXRpdmVXaW5kb3ctPnN0cmlkZTsKKyAgICAgICAgICAgIGRlcHRoLmRhdGEgICAgPSAoR0dMdWJ5dGUqKW1hbGxvYyhkZXB0aC5zdHJpZGUqZGVwdGguaGVpZ2h0KjIpOworICAgICAgICAgICAgaWYgKGRlcHRoLmRhdGEgPT0gMCkgeworICAgICAgICAgICAgICAgIHNldEVycm9yKEVHTF9CQURfQUxMT0MsIEVHTF9OT19TVVJGQUNFKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRUdMX0ZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBFR0xfVFJVRTsKK30KKworRUdMQm9vbGVhbiBlZ2xfd2luZG93X3N1cmZhY2VfdDo6YmluZERyYXdTdXJmYWNlKG9nbGVzX2NvbnRleHRfdCogZ2wpCit7CisgICAgR0dMU3VyZmFjZSBidWZmZXI7CisgICAgYnVmZmVyLnZlcnNpb24gPSBzaXplb2YoR0dMU3VyZmFjZSk7CisgICAgYnVmZmVyLndpZHRoICAgPSBuYXRpdmVXaW5kb3ctPndpZHRoOworICAgIGJ1ZmZlci5oZWlnaHQgID0gbmF0aXZlV2luZG93LT5oZWlnaHQ7CisgICAgYnVmZmVyLnN0cmlkZSAgPSBuYXRpdmVXaW5kb3ctPnN0cmlkZTsKKyAgICBidWZmZXIuZGF0YSAgICA9IChHR0x1Ynl0ZSopbmF0aXZlV2luZG93LT5iYXNlICsgbmF0aXZlV2luZG93LT5vZmZzZXQ7CisgICAgYnVmZmVyLmZvcm1hdCAgPSBuYXRpdmVXaW5kb3ctPmZvcm1hdDsKKyAgICBnbC0+cmFzdGVyaXplci5wcm9jcy5jb2xvckJ1ZmZlcihnbCwgJmJ1ZmZlcik7CisgICAgaWYgKGRlcHRoLmRhdGEgIT0gZ2wtPnJhc3Rlcml6ZXIuc3RhdGUuYnVmZmVycy5kZXB0aC5kYXRhKQorICAgICAgICBnbC0+cmFzdGVyaXplci5wcm9jcy5kZXB0aEJ1ZmZlcihnbCwgJmRlcHRoKTsKKyAgICByZXR1cm4gRUdMX1RSVUU7Cit9CitFR0xCb29sZWFuIGVnbF93aW5kb3dfc3VyZmFjZV90OjpiaW5kUmVhZFN1cmZhY2Uob2dsZXNfY29udGV4dF90KiBnbCkKK3sKKyAgICBHR0xTdXJmYWNlIGJ1ZmZlcjsKKyAgICBidWZmZXIudmVyc2lvbiA9IHNpemVvZihHR0xTdXJmYWNlKTsKKyAgICBidWZmZXIud2lkdGggICA9IG5hdGl2ZVdpbmRvdy0+d2lkdGg7CisgICAgYnVmZmVyLmhlaWdodCAgPSBuYXRpdmVXaW5kb3ctPmhlaWdodDsKKyAgICBidWZmZXIuc3RyaWRlICA9IG5hdGl2ZVdpbmRvdy0+c3RyaWRlOworICAgIGJ1ZmZlci5kYXRhICAgID0gKEdHTHVieXRlKiluYXRpdmVXaW5kb3ctPmJhc2UgKyBuYXRpdmVXaW5kb3ctPm9mZnNldDsKKyAgICBidWZmZXIuZm9ybWF0ICA9IG5hdGl2ZVdpbmRvdy0+Zm9ybWF0OworICAgIGdsLT5yYXN0ZXJpemVyLnByb2NzLnJlYWRCdWZmZXIoZ2wsICZidWZmZXIpOworICAgIHJldHVybiBFR0xfVFJVRTsKK30KK3ZvaWQqIGVnbF93aW5kb3dfc3VyZmFjZV90OjpnZXRCaXRzKCkgY29uc3QgeworICAgIHJldHVybiAoR0dMdWJ5dGUqKW5hdGl2ZVdpbmRvdy0+YmFzZSArIG5hdGl2ZVdpbmRvdy0+b2Zmc2V0OworfQorRUdMaW50IGVnbF93aW5kb3dfc3VyZmFjZV90OjpnZXRIb3Jpem9udGFsUmVzb2x1dGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gKG5hdGl2ZVdpbmRvdy0+eGRwaSAqIEVHTF9ESVNQTEFZX1NDQUxJTkcpICogKDEuMGYgLyAyNS40Zik7Cit9CitFR0xpbnQgZWdsX3dpbmRvd19zdXJmYWNlX3Q6OmdldFZlcnRpY2FsUmVzb2x1dGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gKG5hdGl2ZVdpbmRvdy0+eWRwaSAqIEVHTF9ESVNQTEFZX1NDQUxJTkcpICogKDEuMGYgLyAyNS40Zik7Cit9CitFR0xpbnQgZWdsX3dpbmRvd19zdXJmYWNlX3Q6OmdldFJlZnJlc2hSYXRlKCkgY29uc3QgeworICAgIHJldHVybiAobmF0aXZlV2luZG93LT5mcHMgKiBFR0xfRElTUExBWV9TQ0FMSU5HKTsKK30KK0VHTGludCBlZ2xfd2luZG93X3N1cmZhY2VfdDo6Z2V0U3dhcEJlaGF2aW9yKCkgY29uc3QgeworICAgIHVpbnQzMl90IGZsYWdzID0gbmF0aXZlV2luZG93LT5mbGFnczsKKyAgICBpZiAoZmxhZ3MgJiBFR0xfTkFUSVZFU19GTEFHX0RFU1RST1lfQkFDS0JVRkZFUikKKyAgICAgICAgcmV0dXJuIEVHTF9CVUZGRVJfREVTVFJPWUVEOworICAgIHJldHVybiBFR0xfQlVGRkVSX1BSRVNFUlZFRDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdHJ1Y3QgZWdsX3BpeG1hcF9zdXJmYWNlX3QgOiBwdWJsaWMgZWdsX3N1cmZhY2VfdAoreworICAgIGVnbF9waXhtYXBfc3VyZmFjZV90KAorICAgICAgICAgICAgRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsCisgICAgICAgICAgICBpbnQzMl90IGRlcHRoRm9ybWF0LAorICAgICAgICAgICAgZWdsX25hdGl2ZV9waXhtYXBfdCBjb25zdCAqIHBpeG1hcCk7CisKKyAgICB2aXJ0dWFsIH5lZ2xfcGl4bWFwX3N1cmZhY2VfdCgpIHsgfQorCisgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgaXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIG5hdGl2ZVBpeG1hcC52ZXJzaW9uID09IHNpemVvZihlZ2xfbmF0aXZlX3BpeG1hcF90KTsgfSAgICAKKyAgICB2aXJ0dWFsICAgICBFR0xCb29sZWFuICBiaW5kRHJhd1N1cmZhY2Uob2dsZXNfY29udGV4dF90KiBnbCk7CisgICAgdmlydHVhbCAgICAgRUdMQm9vbGVhbiAgYmluZFJlYWRTdXJmYWNlKG9nbGVzX2NvbnRleHRfdCogZ2wpOworICAgIHZpcnR1YWwgICAgIEVHTGludCAgICAgIGdldFdpZHRoKCkgY29uc3QgICAgeyByZXR1cm4gbmF0aXZlUGl4bWFwLndpZHRoOyAgfQorICAgIHZpcnR1YWwgICAgIEVHTGludCAgICAgIGdldEhlaWdodCgpIGNvbnN0ICAgeyByZXR1cm4gbmF0aXZlUGl4bWFwLmhlaWdodDsgfQorICAgIHZpcnR1YWwgICAgIHZvaWQqICAgICAgIGdldEJpdHMoKSBjb25zdCAgICAgeyByZXR1cm4gbmF0aXZlUGl4bWFwLmRhdGE7IH0KK3ByaXZhdGU6CisgICAgZWdsX25hdGl2ZV9waXhtYXBfdCAgICAgbmF0aXZlUGl4bWFwOworfTsKKworZWdsX3BpeG1hcF9zdXJmYWNlX3Q6OmVnbF9waXhtYXBfc3VyZmFjZV90KEVHTERpc3BsYXkgZHB5LAorICAgICAgICBFR0xDb25maWcgY29uZmlnLAorICAgICAgICBpbnQzMl90IGRlcHRoRm9ybWF0LAorICAgICAgICBlZ2xfbmF0aXZlX3BpeG1hcF90IGNvbnN0ICogcGl4bWFwKQorICAgIDogZWdsX3N1cmZhY2VfdChkcHksIGNvbmZpZywgZGVwdGhGb3JtYXQpLCBuYXRpdmVQaXhtYXAoKnBpeG1hcCkKK3sKKyAgICBpZiAoZGVwdGhGb3JtYXQpIHsKKyAgICAgICAgZGVwdGgud2lkdGggICA9IHBpeG1hcC0+d2lkdGg7CisgICAgICAgIGRlcHRoLmhlaWdodCAgPSBwaXhtYXAtPmhlaWdodDsKKyAgICAgICAgZGVwdGguc3RyaWRlICA9IGRlcHRoLndpZHRoOyAvLyB1c2UgdGhlIHdpZHRoIGhlcmUKKyAgICAgICAgZGVwdGguZGF0YSAgICA9IChHR0x1Ynl0ZSopbWFsbG9jKGRlcHRoLnN0cmlkZSpkZXB0aC5oZWlnaHQqMik7CisgICAgICAgIGlmIChkZXB0aC5kYXRhID09IDApIHsKKyAgICAgICAgICAgIHNldEVycm9yKEVHTF9CQURfQUxMT0MsIEVHTF9OT19TVVJGQUNFKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KK0VHTEJvb2xlYW4gZWdsX3BpeG1hcF9zdXJmYWNlX3Q6OmJpbmREcmF3U3VyZmFjZShvZ2xlc19jb250ZXh0X3QqIGdsKQoreworICAgIEdHTFN1cmZhY2UgYnVmZmVyOworICAgIGJ1ZmZlci52ZXJzaW9uID0gc2l6ZW9mKEdHTFN1cmZhY2UpOworICAgIGJ1ZmZlci53aWR0aCAgID0gbmF0aXZlUGl4bWFwLndpZHRoOworICAgIGJ1ZmZlci5oZWlnaHQgID0gbmF0aXZlUGl4bWFwLmhlaWdodDsKKyAgICBidWZmZXIuc3RyaWRlICA9IG5hdGl2ZVBpeG1hcC5zdHJpZGU7CisgICAgYnVmZmVyLmRhdGEgICAgPSBuYXRpdmVQaXhtYXAuZGF0YTsKKyAgICBidWZmZXIuZm9ybWF0ICA9IG5hdGl2ZVBpeG1hcC5mb3JtYXQ7CisgICAgCisgICAgZ2wtPnJhc3Rlcml6ZXIucHJvY3MuY29sb3JCdWZmZXIoZ2wsICZidWZmZXIpOworICAgIGlmIChkZXB0aC5kYXRhICE9IGdsLT5yYXN0ZXJpemVyLnN0YXRlLmJ1ZmZlcnMuZGVwdGguZGF0YSkKKyAgICAgICAgZ2wtPnJhc3Rlcml6ZXIucHJvY3MuZGVwdGhCdWZmZXIoZ2wsICZkZXB0aCk7CisgICAgcmV0dXJuIEVHTF9UUlVFOworfQorRUdMQm9vbGVhbiBlZ2xfcGl4bWFwX3N1cmZhY2VfdDo6YmluZFJlYWRTdXJmYWNlKG9nbGVzX2NvbnRleHRfdCogZ2wpCit7CisgICAgR0dMU3VyZmFjZSBidWZmZXI7CisgICAgYnVmZmVyLnZlcnNpb24gPSBzaXplb2YoR0dMU3VyZmFjZSk7CisgICAgYnVmZmVyLndpZHRoICAgPSBuYXRpdmVQaXhtYXAud2lkdGg7CisgICAgYnVmZmVyLmhlaWdodCAgPSBuYXRpdmVQaXhtYXAuaGVpZ2h0OworICAgIGJ1ZmZlci5zdHJpZGUgID0gbmF0aXZlUGl4bWFwLnN0cmlkZTsKKyAgICBidWZmZXIuZGF0YSAgICA9IG5hdGl2ZVBpeG1hcC5kYXRhOworICAgIGJ1ZmZlci5mb3JtYXQgID0gbmF0aXZlUGl4bWFwLmZvcm1hdDsKKyAgICBnbC0+cmFzdGVyaXplci5wcm9jcy5yZWFkQnVmZmVyKGdsLCAmYnVmZmVyKTsKKyAgICByZXR1cm4gRUdMX1RSVUU7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RydWN0IGVnbF9wYnVmZmVyX3N1cmZhY2VfdCA6IHB1YmxpYyBlZ2xfc3VyZmFjZV90Cit7CisgICAgZWdsX3BidWZmZXJfc3VyZmFjZV90KAorICAgICAgICAgICAgRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsIGludDMyX3QgZGVwdGhGb3JtYXQsCisgICAgICAgICAgICBpbnQzMl90IHcsIGludDMyX3QgaCwgaW50MzJfdCBmKTsKKworICAgIHZpcnR1YWwgfmVnbF9wYnVmZmVyX3N1cmZhY2VfdCgpOworCisgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgaXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIHBidWZmZXIuZGF0YSAhPSAwOyB9ICAgIAorICAgIHZpcnR1YWwgICAgIEVHTEJvb2xlYW4gIGJpbmREcmF3U3VyZmFjZShvZ2xlc19jb250ZXh0X3QqIGdsKTsKKyAgICB2aXJ0dWFsICAgICBFR0xCb29sZWFuICBiaW5kUmVhZFN1cmZhY2Uob2dsZXNfY29udGV4dF90KiBnbCk7CisgICAgdmlydHVhbCAgICAgRUdMaW50ICAgICAgZ2V0V2lkdGgoKSBjb25zdCAgICB7IHJldHVybiBwYnVmZmVyLndpZHRoOyAgfQorICAgIHZpcnR1YWwgICAgIEVHTGludCAgICAgIGdldEhlaWdodCgpIGNvbnN0ICAgeyByZXR1cm4gcGJ1ZmZlci5oZWlnaHQ7IH0KKyAgICB2aXJ0dWFsICAgICB2b2lkKiAgICAgICBnZXRCaXRzKCkgY29uc3QgICAgIHsgcmV0dXJuIHBidWZmZXIuZGF0YTsgfQorcHJpdmF0ZToKKyAgICBHR0xTdXJmYWNlICBwYnVmZmVyOworfTsKKworZWdsX3BidWZmZXJfc3VyZmFjZV90OjplZ2xfcGJ1ZmZlcl9zdXJmYWNlX3QoRUdMRGlzcGxheSBkcHksCisgICAgICAgIEVHTENvbmZpZyBjb25maWcsIGludDMyX3QgZGVwdGhGb3JtYXQsCisgICAgICAgIGludDMyX3QgdywgaW50MzJfdCBoLCBpbnQzMl90IGYpCisgICAgOiBlZ2xfc3VyZmFjZV90KGRweSwgY29uZmlnLCBkZXB0aEZvcm1hdCkKK3sKKyAgICBzaXplX3Qgc2l6ZSA9IHcqaDsKKyAgICBzd2l0Y2ggKGYpIHsKKyAgICAgICAgY2FzZSBHR0xfUElYRUxfRk9STUFUX0FfODogICAgICAgICAgc2l6ZSAqPSAxOyBicmVhazsKKyAgICAgICAgY2FzZSBHR0xfUElYRUxfRk9STUFUX1JHQl81NjU6ICAgICAgc2l6ZSAqPSAyOyBicmVhazsKKyAgICAgICAgY2FzZSBHR0xfUElYRUxfRk9STUFUX1JHQkFfODg4ODogICAgc2l6ZSAqPSA0OyBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR0UoImluY29tcGF0aWJsZSBwaXhlbCBmb3JtYXQgZm9yIHBidWZmZXIgKGZvcm1hdD0lZCkiLCBmKTsKKyAgICAgICAgICAgIHBidWZmZXIuZGF0YSA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcGJ1ZmZlci52ZXJzaW9uID0gc2l6ZW9mKEdHTFN1cmZhY2UpOworICAgIHBidWZmZXIud2lkdGggICA9IHc7CisgICAgcGJ1ZmZlci5oZWlnaHQgID0gaDsKKyAgICBwYnVmZmVyLnN0cmlkZSAgPSB3OworICAgIHBidWZmZXIuZGF0YSAgICA9IChHR0x1Ynl0ZSopbWFsbG9jKHNpemUpOworICAgIHBidWZmZXIuZm9ybWF0ICA9IGY7CisgICAgCisgICAgaWYgKGRlcHRoRm9ybWF0KSB7CisgICAgICAgIGRlcHRoLndpZHRoICAgPSBwYnVmZmVyLndpZHRoOworICAgICAgICBkZXB0aC5oZWlnaHQgID0gcGJ1ZmZlci5oZWlnaHQ7CisgICAgICAgIGRlcHRoLnN0cmlkZSAgPSBkZXB0aC53aWR0aDsgLy8gdXNlIHRoZSB3aWR0aCBoZXJlCisgICAgICAgIGRlcHRoLmRhdGEgICAgPSAoR0dMdWJ5dGUqKW1hbGxvYyhkZXB0aC5zdHJpZGUqZGVwdGguaGVpZ2h0KjIpOworICAgICAgICBpZiAoZGVwdGguZGF0YSA9PSAwKSB7CisgICAgICAgICAgICBzZXRFcnJvcihFR0xfQkFEX0FMTE9DLCBFR0xfTk9fU1VSRkFDRSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9Cit9CitlZ2xfcGJ1ZmZlcl9zdXJmYWNlX3Q6On5lZ2xfcGJ1ZmZlcl9zdXJmYWNlX3QoKSB7CisgICAgZnJlZShwYnVmZmVyLmRhdGEpOworfQorRUdMQm9vbGVhbiBlZ2xfcGJ1ZmZlcl9zdXJmYWNlX3Q6OmJpbmREcmF3U3VyZmFjZShvZ2xlc19jb250ZXh0X3QqIGdsKQoreworICAgIGdsLT5yYXN0ZXJpemVyLnByb2NzLmNvbG9yQnVmZmVyKGdsLCAmcGJ1ZmZlcik7CisgICAgaWYgKGRlcHRoLmRhdGEgIT0gZ2wtPnJhc3Rlcml6ZXIuc3RhdGUuYnVmZmVycy5kZXB0aC5kYXRhKQorICAgICAgICBnbC0+cmFzdGVyaXplci5wcm9jcy5kZXB0aEJ1ZmZlcihnbCwgJmRlcHRoKTsKKyAgICByZXR1cm4gRUdMX1RSVUU7Cit9CitFR0xCb29sZWFuIGVnbF9wYnVmZmVyX3N1cmZhY2VfdDo6YmluZFJlYWRTdXJmYWNlKG9nbGVzX2NvbnRleHRfdCogZ2wpCit7CisgICAgZ2wtPnJhc3Rlcml6ZXIucHJvY3MucmVhZEJ1ZmZlcihnbCwgJnBidWZmZXIpOworICAgIHJldHVybiBFR0xfVFJVRTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdHJ1Y3QgY29uZmlnX3BhaXJfdCB7CisgICAgR0xpbnQga2V5OworICAgIEdMaW50IHZhbHVlOworfTsKKworc3RydWN0IGNvbmZpZ3NfdCB7CisgICAgY29uc3QgY29uZmlnX3BhaXJfdCogYXJyYXk7CisgICAgaW50ICAgICAgICAgICAgICAgICAgc2l6ZTsKK307CisKK3N0cnVjdCBjb25maWdfbWFuYWdlbWVudF90IHsKKyAgICBHTGludCBrZXk7CisgICAgYm9vbCAoKm1hdGNoKShHTGludCByZXFWYWx1ZSwgR0xpbnQgY29uZlZhbHVlKTsKKyAgICBzdGF0aWMgYm9vbCBhdExlYXN0KEdMaW50IHJlcVZhbHVlLCBHTGludCBjb25mVmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIChyZXFWYWx1ZSA9PSBFR0xfRE9OVF9DQVJFKSB8fCAoY29uZlZhbHVlID49IHJlcVZhbHVlKTsKKyAgICB9CisgICAgc3RhdGljIGJvb2wgZXhhY3QoR0xpbnQgcmVxVmFsdWUsIEdMaW50IGNvbmZWYWx1ZSkgeworICAgICAgICByZXR1cm4gKHJlcVZhbHVlID09IEVHTF9ET05UX0NBUkUpIHx8IChjb25mVmFsdWUgPT0gcmVxVmFsdWUpOworICAgIH0KKyAgICBzdGF0aWMgYm9vbCBtYXNrKEdMaW50IHJlcVZhbHVlLCBHTGludCBjb25mVmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIChjb25mVmFsdWUgJiByZXFWYWx1ZSkgPT0gcmVxVmFsdWU7CisgICAgfQorfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIFZFUlNJT05fTUFKT1IgMQorI2RlZmluZSBWRVJTSU9OX01JTk9SIDIKK3N0YXRpYyBjaGFyIGNvbnN0ICogY29uc3QgZ1ZlbmRvclN0cmluZyAgICAgPSAiR29vZ2xlIEluYy4iOworc3RhdGljIGNoYXIgY29uc3QgKiBjb25zdCBnVmVyc2lvblN0cmluZyAgICA9ICIxLjIgQW5kcm9pZCBEcml2ZXIiOworc3RhdGljIGNoYXIgY29uc3QgKiBjb25zdCBnQ2xpZW50QXBpU3RyaW5nICA9ICJPcGVuR0wgRVMiOworc3RhdGljIGNoYXIgY29uc3QgKiBjb25zdCBnRXh0ZW5zaW9uc1N0cmluZyA9ICIiOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0cnVjdCBleHRlbnRpb25fbWFwX3QgeworICAgIGNvbnN0IGNoYXIgKiBjb25zdCBuYW1lOworICAgIF9fZWdsTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUgYWRkcmVzczsKK307CisKK3N0YXRpYyBjb25zdCBleHRlbnRpb25fbWFwX3QgZ0V4dGVudGlvbk1hcFtdID0geworICAgIHsgImdsRHJhd1RleHNPRVMiLCAgICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xEcmF3VGV4c09FUyB9LAorICAgIHsgImdsRHJhd1RleGlPRVMiLCAgICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xEcmF3VGV4aU9FUyB9LAorICAgIHsgImdsRHJhd1RleGZPRVMiLCAgICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xEcmF3VGV4Zk9FUyB9LAorICAgIHsgImdsRHJhd1RleHhPRVMiLCAgICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xEcmF3VGV4eE9FUyB9LAorICAgIHsgImdsRHJhd1RleHN2T0VTIiwgICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xEcmF3VGV4c3ZPRVMgfSwKKyAgICB7ICJnbERyYXdUZXhpdk9FUyIsICAgICAgICAgICAgICh2b2lkKCopKCkpJmdsRHJhd1RleGl2T0VTIH0sCisgICAgeyAiZ2xEcmF3VGV4ZnZPRVMiLCAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbERyYXdUZXhmdk9FUyB9LAorICAgIHsgImdsRHJhd1RleHh2T0VTIiwgICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xEcmF3VGV4eHZPRVMgfSwKKyAgICB7ICJnbFF1ZXJ5TWF0cml4eE9FUyIsICAgICAgICAgICh2b2lkKCopKCkpJmdsUXVlcnlNYXRyaXh4T0VTIH0sCisgICAgeyAiZ2xDbGlwUGxhbmVmIiwgICAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbENsaXBQbGFuZWYgfSwKKyAgICB7ICJnbENsaXBQbGFuZXgiLCAgICAgICAgICAgICAgICh2b2lkKCopKCkpJmdsQ2xpcFBsYW5leCB9LAorICAgIHsgImdsQmluZEJ1ZmZlciIsICAgICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xCaW5kQnVmZmVyIH0sCisgICAgeyAiZ2xCdWZmZXJEYXRhIiwgICAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbEJ1ZmZlckRhdGEgfSwKKyAgICB7ICJnbEJ1ZmZlclN1YkRhdGEiLCAgICAgICAgICAgICh2b2lkKCopKCkpJmdsQnVmZmVyU3ViRGF0YSB9LAorICAgIHsgImdsRGVsZXRlQnVmZmVycyIsICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xEZWxldGVCdWZmZXJzIH0sCisgICAgeyAiZ2xHZW5CdWZmZXJzIiwgICAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbEdlbkJ1ZmZlcnMgfSwKK307CisKKy8qIAorICogSW4gdGhlIGxpc3RzIGJlbG93LCBhdHRyaWJ1dGVzIG5hbWVzIE1VU1QgYmUgc29ydGVkLgorICogQWRkaXRpb25hbGx5LCBhbGwgY29uZmlncyBtdXN0IGJlIHNvcnRlZCBhY2NvcmRpbmcgdG8KKyAqIHRoZSBFR0wgc3BlY2lmaWNhdGlvbi4KKyAqLworCitzdGF0aWMgY29uZmlnX3BhaXJfdCBjb25zdCBjb25maWdfYmFzZV9hdHRyaWJ1dGVfbGlzdFtdID0geworICAgICAgICB7IEVHTF9TVEVOQ0lMX1NJWkUsICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgIHsgRUdMX0NPTkZJR19DQVZFQVQsICAgICAgICAgICAgICBFR0xfU0xPV19DT05GSUcgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgeyBFR0xfTEVWRUwsICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICB7IEVHTF9NQVhfUEJVRkZFUl9IRUlHSFQsICAgICAgICAgR0dMX01BWF9WSUVXUE9SVF9ESU1TICAgICAgICAgICAgIH0sCisgICAgICAgIHsgRUdMX01BWF9QQlVGRkVSX1BJWEVMUywgICAgICAgICAKKyAgICAgICAgICAgICAgICBHR0xfTUFYX1ZJRVdQT1JUX0RJTVMqR0dMX01BWF9WSUVXUE9SVF9ESU1TICAgICAgICAgICAgICAgICB9LAorICAgICAgICB7IEVHTF9NQVhfUEJVRkZFUl9XSURUSCwgICAgICAgICAgR0dMX01BWF9WSUVXUE9SVF9ESU1TICAgICAgICAgICAgIH0sCisgICAgICAgIHsgRUdMX05BVElWRV9SRU5ERVJBQkxFLCAgICAgICAgICBFR0xfVFJVRSAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgeyBFR0xfTkFUSVZFX1ZJU1VBTF9JRCwgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICB7IEVHTF9OQVRJVkVfVklTVUFMX1RZUEUsICAgICAgICAgR0dMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1ICAgICAgICAgIH0sCisgICAgICAgIHsgRUdMX1NBTVBMRVMsICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgeyBFR0xfU0FNUExFX0JVRkZFUlMsICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICB7IEVHTF9UUkFOU1BBUkVOVF9UWVBFLCAgICAgICAgICAgRUdMX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgIHsgRUdMX1RSQU5TUEFSRU5UX0JMVUVfVkFMVUUsICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgeyBFR0xfVFJBTlNQQVJFTlRfR1JFRU5fVkFMVUUsICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICB7IEVHTF9UUkFOU1BBUkVOVF9SRURfVkFMVUUsICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgIHsgRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0JBLCAgICAgICBFR0xfRkFMU0UgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgeyBFR0xfQklORF9UT19URVhUVVJFX1JHQiwgICAgICAgIEVHTF9GQUxTRSAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICB7IEVHTF9NSU5fU1dBUF9JTlRFUlZBTCwgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgIHsgRUdMX01BWF9TV0FQX0lOVEVSVkFMLCAgICAgICAgICA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKK307CisKKy8vIFRoZXNlIGNvbmZpZ3MgY2FuIG92ZXJyaWRlIHRoZSBiYXNlIGF0dHJpYnV0ZSBsaXN0CisvLyBOT1RFOiB3aGVuIGFkZGluZyBhIGNvbmZpZyBoZXJlLCBkb24ndCBmb3JnZXQgdG8gdXBkYXRlIGVnbENyZWF0ZSpTdXJmYWNlKCkKKworc3RhdGljIGNvbmZpZ19wYWlyX3QgY29uc3QgY29uZmlnXzBfYXR0cmlidXRlX2xpc3RbXSA9IHsKKyAgICAgICAgeyBFR0xfQlVGRkVSX1NJWkUsICAgICAxNiB9LAorICAgICAgICB7IEVHTF9BTFBIQV9TSVpFLCAgICAgICAwIH0sCisgICAgICAgIHsgRUdMX0JMVUVfU0laRSwgICAgICAgIDUgfSwKKyAgICAgICAgeyBFR0xfR1JFRU5fU0laRSwgICAgICAgNiB9LAorICAgICAgICB7IEVHTF9SRURfU0laRSwgICAgICAgICA1IH0sCisgICAgICAgIHsgRUdMX0RFUFRIX1NJWkUsICAgICAgIDAgfSwKKyAgICAgICAgeyBFR0xfQ09ORklHX0lELCAgICAgICAgMCB9LAorICAgICAgICB7IEVHTF9TVVJGQUNFX1RZUEUsICAgICBFR0xfV0lORE9XX0JJVHxFR0xfUEJVRkZFUl9CSVR8RUdMX1BJWE1BUF9CSVQgfSwKK307CisKK3N0YXRpYyBjb25maWdfcGFpcl90IGNvbnN0IGNvbmZpZ18xX2F0dHJpYnV0ZV9saXN0W10gPSB7CisgICAgICAgIHsgRUdMX0JVRkZFUl9TSVpFLCAgICAgMTYgfSwKKyAgICAgICAgeyBFR0xfQUxQSEFfU0laRSwgICAgICAgMCB9LAorICAgICAgICB7IEVHTF9CTFVFX1NJWkUsICAgICAgICA1IH0sCisgICAgICAgIHsgRUdMX0dSRUVOX1NJWkUsICAgICAgIDYgfSwKKyAgICAgICAgeyBFR0xfUkVEX1NJWkUsICAgICAgICAgNSB9LAorICAgICAgICB7IEVHTF9ERVBUSF9TSVpFLCAgICAgIDE2IH0sCisgICAgICAgIHsgRUdMX0NPTkZJR19JRCwgICAgICAgIDEgfSwKKyAgICAgICAgeyBFR0xfU1VSRkFDRV9UWVBFLCAgICAgRUdMX1dJTkRPV19CSVR8RUdMX1BCVUZGRVJfQklUfEVHTF9QSVhNQVBfQklUIH0sCit9OworCitzdGF0aWMgY29uZmlnX3BhaXJfdCBjb25zdCBjb25maWdfMl9hdHRyaWJ1dGVfbGlzdFtdID0geworICAgICAgICB7IEVHTF9CVUZGRVJfU0laRSwgICAgIDMyIH0sCisgICAgICAgIHsgRUdMX0FMUEhBX1NJWkUsICAgICAgIDggfSwKKyAgICAgICAgeyBFR0xfQkxVRV9TSVpFLCAgICAgICAgOCB9LAorICAgICAgICB7IEVHTF9HUkVFTl9TSVpFLCAgICAgICA4IH0sCisgICAgICAgIHsgRUdMX1JFRF9TSVpFLCAgICAgICAgIDggfSwKKyAgICAgICAgeyBFR0xfREVQVEhfU0laRSwgICAgICAgMCB9LAorICAgICAgICB7IEVHTF9DT05GSUdfSUQsICAgICAgICAyIH0sCisgICAgICAgIHsgRUdMX1NVUkZBQ0VfVFlQRSwgICAgIEVHTF9XSU5ET1dfQklUfEVHTF9QQlVGRkVSX0JJVHxFR0xfUElYTUFQX0JJVCB9LAorfTsKKworc3RhdGljIGNvbmZpZ19wYWlyX3QgY29uc3QgY29uZmlnXzNfYXR0cmlidXRlX2xpc3RbXSA9IHsKKyAgICAgICAgeyBFR0xfQlVGRkVSX1NJWkUsICAgICAzMiB9LAorICAgICAgICB7IEVHTF9BTFBIQV9TSVpFLCAgICAgICA4IH0sCisgICAgICAgIHsgRUdMX0JMVUVfU0laRSwgICAgICAgIDggfSwKKyAgICAgICAgeyBFR0xfR1JFRU5fU0laRSwgICAgICAgOCB9LAorICAgICAgICB7IEVHTF9SRURfU0laRSwgICAgICAgICA4IH0sCisgICAgICAgIHsgRUdMX0RFUFRIX1NJWkUsICAgICAgMTYgfSwKKyAgICAgICAgeyBFR0xfQ09ORklHX0lELCAgICAgICAgMyB9LAorICAgICAgICB7IEVHTF9TVVJGQUNFX1RZUEUsICAgICBFR0xfV0lORE9XX0JJVHxFR0xfUEJVRkZFUl9CSVR8RUdMX1BJWE1BUF9CSVQgfSwKK307CisKK3N0YXRpYyBjb25maWdfcGFpcl90IGNvbnN0IGNvbmZpZ180X2F0dHJpYnV0ZV9saXN0W10gPSB7CisgICAgICAgIHsgRUdMX0JVRkZFUl9TSVpFLCAgICAgIDggfSwKKyAgICAgICAgeyBFR0xfQUxQSEFfU0laRSwgICAgICAgOCB9LAorICAgICAgICB7IEVHTF9CTFVFX1NJWkUsICAgICAgICAwIH0sCisgICAgICAgIHsgRUdMX0dSRUVOX1NJWkUsICAgICAgIDAgfSwKKyAgICAgICAgeyBFR0xfUkVEX1NJWkUsICAgICAgICAgMCB9LAorICAgICAgICB7IEVHTF9ERVBUSF9TSVpFLCAgICAgICAwIH0sCisgICAgICAgIHsgRUdMX0NPTkZJR19JRCwgICAgICAgIDQgfSwKKyAgICAgICAgeyBFR0xfU1VSRkFDRV9UWVBFLCAgICAgRUdMX1dJTkRPV19CSVR8RUdMX1BCVUZGRVJfQklUfEVHTF9QSVhNQVBfQklUIH0sCit9OworCitzdGF0aWMgY29uZmlnX3BhaXJfdCBjb25zdCBjb25maWdfNV9hdHRyaWJ1dGVfbGlzdFtdID0geworICAgICAgICB7IEVHTF9CVUZGRVJfU0laRSwgICAgICA4IH0sCisgICAgICAgIHsgRUdMX0FMUEhBX1NJWkUsICAgICAgIDggfSwKKyAgICAgICAgeyBFR0xfQkxVRV9TSVpFLCAgICAgICAgMCB9LAorICAgICAgICB7IEVHTF9HUkVFTl9TSVpFLCAgICAgICAwIH0sCisgICAgICAgIHsgRUdMX1JFRF9TSVpFLCAgICAgICAgIDAgfSwKKyAgICAgICAgeyBFR0xfREVQVEhfU0laRSwgICAgICAxNiB9LAorICAgICAgICB7IEVHTF9DT05GSUdfSUQsICAgICAgICA1IH0sCisgICAgICAgIHsgRUdMX1NVUkZBQ0VfVFlQRSwgICAgIEVHTF9XSU5ET1dfQklUfEVHTF9QQlVGRkVSX0JJVHxFR0xfUElYTUFQX0JJVCB9LAorfTsKKworc3RhdGljIGNvbmZpZ3NfdCBjb25zdCBnQ29uZmlnc1tdID0geworICAgICAgICB7IGNvbmZpZ18wX2F0dHJpYnV0ZV9saXN0LCBORUxFTShjb25maWdfMF9hdHRyaWJ1dGVfbGlzdCkgfSwKKyAgICAgICAgeyBjb25maWdfMV9hdHRyaWJ1dGVfbGlzdCwgTkVMRU0oY29uZmlnXzFfYXR0cmlidXRlX2xpc3QpIH0sCisgICAgICAgIHsgY29uZmlnXzJfYXR0cmlidXRlX2xpc3QsIE5FTEVNKGNvbmZpZ18yX2F0dHJpYnV0ZV9saXN0KSB9LAorICAgICAgICB7IGNvbmZpZ18zX2F0dHJpYnV0ZV9saXN0LCBORUxFTShjb25maWdfM19hdHRyaWJ1dGVfbGlzdCkgfSwKKyAgICAgICAgeyBjb25maWdfNF9hdHRyaWJ1dGVfbGlzdCwgTkVMRU0oY29uZmlnXzRfYXR0cmlidXRlX2xpc3QpIH0sCisgICAgICAgIHsgY29uZmlnXzVfYXR0cmlidXRlX2xpc3QsIE5FTEVNKGNvbmZpZ181X2F0dHJpYnV0ZV9saXN0KSB9LAorfTsKKworc3RhdGljIGNvbmZpZ19tYW5hZ2VtZW50X3QgY29uc3QgZ0NvbmZpZ01hbmFnZW1lbnRbXSA9IHsKKyAgICAgICAgeyBFR0xfQlVGRkVSX1NJWkUsICAgICAgICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmF0TGVhc3QgfSwKKyAgICAgICAgeyBFR0xfQUxQSEFfU0laRSwgICAgICAgICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmF0TGVhc3QgfSwKKyAgICAgICAgeyBFR0xfQkxVRV9TSVpFLCAgICAgICAgICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmF0TGVhc3QgfSwKKyAgICAgICAgeyBFR0xfR1JFRU5fU0laRSwgICAgICAgICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmF0TGVhc3QgfSwKKyAgICAgICAgeyBFR0xfUkVEX1NJWkUsICAgICAgICAgICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmF0TGVhc3QgfSwKKyAgICAgICAgeyBFR0xfREVQVEhfU0laRSwgICAgICAgICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmF0TGVhc3QgfSwKKyAgICAgICAgeyBFR0xfU1RFTkNJTF9TSVpFLCAgICAgICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmF0TGVhc3QgfSwKKyAgICAgICAgeyBFR0xfQ09ORklHX0NBVkVBVCwgICAgICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmV4YWN0ICAgfSwKKyAgICAgICAgeyBFR0xfQ09ORklHX0lELCAgICAgICAgICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmV4YWN0ICAgfSwKKyAgICAgICAgeyBFR0xfTEVWRUwsICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmV4YWN0ICAgfSwKKyAgICAgICAgeyBFR0xfTUFYX1BCVUZGRVJfSEVJR0hULCAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmV4YWN0ICAgfSwKKyAgICAgICAgeyBFR0xfTUFYX1BCVUZGRVJfUElYRUxTLCAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmV4YWN0ICAgfSwKKyAgICAgICAgeyBFR0xfTUFYX1BCVUZGRVJfV0lEVEgsICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmV4YWN0ICAgfSwKKyAgICAgICAgeyBFR0xfTkFUSVZFX1JFTkRFUkFCTEUsICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmV4YWN0ICAgfSwKKyAgICAgICAgeyBFR0xfTkFUSVZFX1ZJU1VBTF9JRCwgICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmV4YWN0ICAgfSwKKyAgICAgICAgeyBFR0xfTkFUSVZFX1ZJU1VBTF9UWVBFLCAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmV4YWN0ICAgfSwKKyAgICAgICAgeyBFR0xfU0FNUExFUywgICAgICAgICAgICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmV4YWN0ICAgfSwKKyAgICAgICAgeyBFR0xfU0FNUExFX0JVRkZFUlMsICAgICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmV4YWN0ICAgfSwKKyAgICAgICAgeyBFR0xfU1VSRkFDRV9UWVBFLCAgICAgICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6Om1hc2sgICAgfSwKKyAgICAgICAgeyBFR0xfVFJBTlNQQVJFTlRfVFlQRSwgICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmV4YWN0ICAgfSwKKyAgICAgICAgeyBFR0xfVFJBTlNQQVJFTlRfQkxVRV9WQUxVRSwgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmV4YWN0ICAgfSwKKyAgICAgICAgeyBFR0xfVFJBTlNQQVJFTlRfR1JFRU5fVkFMVUUsICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmV4YWN0ICAgfSwKKyAgICAgICAgeyBFR0xfVFJBTlNQQVJFTlRfUkVEX1ZBTFVFLCAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmV4YWN0ICAgfSwKKyAgICAgICAgeyBFR0xfQklORF9UT19URVhUVVJFX1JHQkEsICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmV4YWN0ICAgfSwKKyAgICAgICAgeyBFR0xfQklORF9UT19URVhUVVJFX1JHQiwgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmV4YWN0ICAgfSwKKyAgICAgICAgeyBFR0xfTUlOX1NXQVBfSU5URVJWQUwsICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmV4YWN0ICAgfSwKKyAgICAgICAgeyBFR0xfTUFYX1NXQVBfSU5URVJWQUwsICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmV4YWN0ICAgfSwKK307CisKK3N0YXRpYyBjb25maWdfcGFpcl90IGNvbnN0IGNvbmZpZ19kZWZhdWx0c1tdID0geworICAgICAgICB7IEVHTF9TVVJGQUNFX1RZUEUsICAgICAgICBFR0xfV0lORE9XX0JJVCB9LAorfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RhdGljIGludCBiaW5hcnlTZWFyY2goVCBjb25zdCBzb3J0ZWRBcnJheVtdLCBpbnQgZmlyc3QsIGludCBsYXN0LCBFR0xpbnQga2V5KQoreworICAgd2hpbGUgKGZpcnN0IDw9IGxhc3QpIHsKKyAgICAgICBpbnQgbWlkID0gKGZpcnN0ICsgbGFzdCkgLyAyOworICAgICAgIGlmIChrZXkgPiBzb3J0ZWRBcnJheVttaWRdLmtleSkgeyAKKyAgICAgICAgICAgZmlyc3QgPSBtaWQgKyAxOworICAgICAgIH0gZWxzZSBpZiAoa2V5IDwgc29ydGVkQXJyYXlbbWlkXS5rZXkpIHsgCisgICAgICAgICAgIGxhc3QgPSBtaWQgLSAxOworICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgIHJldHVybiBtaWQ7CisgICAgICAgfQorICAgfQorICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGlzQXR0cmlidXRlTWF0Y2hpbmcoaW50IGksIEVHTGludCBhdHRyLCBFR0xpbnQgdmFsKQoreworICAgIC8vIGxvb2sgZm9yIHRoZSBhdHRyaWJ1dGUgaW4gYWxsIG9mIG91ciBjb25maWdzCisgICAgY29uZmlnX3BhaXJfdCBjb25zdCogY29uZmlnRm91bmQgPSBnQ29uZmlnc1tpXS5hcnJheTsgCisgICAgaW50IGluZGV4ID0gYmluYXJ5U2VhcmNoPGNvbmZpZ19wYWlyX3Q+KAorICAgICAgICAgICAgZ0NvbmZpZ3NbaV0uYXJyYXksCisgICAgICAgICAgICAwLCBnQ29uZmlnc1tpXS5zaXplLTEsCisgICAgICAgICAgICBhdHRyKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIGNvbmZpZ0ZvdW5kID0gY29uZmlnX2Jhc2VfYXR0cmlidXRlX2xpc3Q7IAorICAgICAgICBpbmRleCA9IGJpbmFyeVNlYXJjaDxjb25maWdfcGFpcl90PigKKyAgICAgICAgICAgICAgICBjb25maWdfYmFzZV9hdHRyaWJ1dGVfbGlzdCwKKyAgICAgICAgICAgICAgICAwLCBORUxFTShjb25maWdfYmFzZV9hdHRyaWJ1dGVfbGlzdCktMSwKKyAgICAgICAgICAgICAgICBhdHRyKTsKKyAgICB9CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgLy8gYXR0cmlidXRlIGZvdW5kLCBjaGVjayBpZiB0aGlzIGNvbmZpZyBjb3VsZCBtYXRjaAorICAgICAgICBpbnQgY2ZnTWd0SW5kZXggPSBiaW5hcnlTZWFyY2g8Y29uZmlnX21hbmFnZW1lbnRfdD4oCisgICAgICAgICAgICAgICAgZ0NvbmZpZ01hbmFnZW1lbnQsCisgICAgICAgICAgICAgICAgMCwgTkVMRU0oZ0NvbmZpZ01hbmFnZW1lbnQpLTEsCisgICAgICAgICAgICAgICAgYXR0cik7CisgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICBib29sIG1hdGNoID0gZ0NvbmZpZ01hbmFnZW1lbnRbY2ZnTWd0SW5kZXhdLm1hdGNoKAorICAgICAgICAgICAgICAgICAgICB2YWwsIGNvbmZpZ0ZvdW5kW2luZGV4XS52YWx1ZSk7CisgICAgICAgICAgICBpZiAobWF0Y2gpIHsKKyAgICAgICAgICAgICAgICAvLyB0aGlzIGNvbmZpZyBtYXRjaGVzCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBhdHRyaWJ1dGUgbm90IGZvdW5kLiB0aGlzIHNob3VsZCBORVZFUiBoYXBwZW4uCisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBlcnJvciwgdGhpcyBhdHRyaWJ1dGUgZG9lc24ndCBleGlzdAorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYWtlQ3VycmVudChvZ2xlc19jb250ZXh0X3QqIGdsKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogY3VycmVudCA9IChvZ2xlc19jb250ZXh0X3QqKWdldEdsVGhyZWFkU3BlY2lmaWMoKTsKKyAgICBpZiAoZ2wpIHsKKyAgICAgICAgZWdsX2NvbnRleHRfdCogYyA9IGVnbF9jb250ZXh0X3Q6OmNvbnRleHQoZ2wpOworICAgICAgICBpZiAoYy0+ZmxhZ3MgJiBlZ2xfY29udGV4dF90OjpJU19DVVJSRU5UKSB7CisgICAgICAgICAgICBpZiAoY3VycmVudCAhPSBnbCkgeworICAgICAgICAgICAgICAgIC8vIGl0IGlzIGFuIGVycm9yIHRvIHNldCBhIGNvbnRleHQgY3VycmVudCwgaWYgaXQncyBhbHJlYWR5CisgICAgICAgICAgICAgICAgLy8gY3VycmVudCB0byBhbm90aGVyIHRocmVhZAorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChjdXJyZW50KSB7CisgICAgICAgICAgICAgICAgLy8gbWFyayB0aGUgY3VycmVudCBjb250ZXh0IGFzIG5vdCBjdXJyZW50LCBhbmQgZmx1c2gKKyAgICAgICAgICAgICAgICBnbEZsdXNoKCk7CisgICAgICAgICAgICAgICAgZWdsX2NvbnRleHRfdDo6Y29udGV4dChjdXJyZW50KS0+ZmxhZ3MgJj0gfmVnbF9jb250ZXh0X3Q6OklTX0NVUlJFTlQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEoYy0+ZmxhZ3MgJiBlZ2xfY29udGV4dF90OjpJU19DVVJSRU5UKSkgeworICAgICAgICAgICAgLy8gVGhlIGNvbnRleHQgaXMgbm90IGN1cnJlbnQsIG1ha2UgaXQgY3VycmVudCEKKyAgICAgICAgICAgIHNldEdsVGhyZWFkU3BlY2lmaWMoZ2wpOworICAgICAgICAgICAgYy0+ZmxhZ3MgfD0gZWdsX2NvbnRleHRfdDo6SVNfQ1VSUkVOVDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChjdXJyZW50KSB7CisgICAgICAgICAgICAvLyBtYXJrIHRoZSBjdXJyZW50IGNvbnRleHQgYXMgbm90IGN1cnJlbnQsIGFuZCBmbHVzaAorICAgICAgICAgICAgZ2xGbHVzaCgpOworICAgICAgICAgICAgZWdsX2NvbnRleHRfdDo6Y29udGV4dChjdXJyZW50KS0+ZmxhZ3MgJj0gfmVnbF9jb250ZXh0X3Q6OklTX0NVUlJFTlQ7CisgICAgICAgIH0KKyAgICAgICAgLy8gdGhpcyB0aHJlYWQgaGFzIG5vIGNvbnRleHQgYXR0YWNoZWQgdG8gaXQKKyAgICAgICAgc2V0R2xUaHJlYWRTcGVjaWZpYygwKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBFR0xCb29sZWFuIGdldENvbmZpZ0F0dHJpYihFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywKKyAgICAgICAgRUdMaW50IGF0dHJpYnV0ZSwgRUdMaW50ICp2YWx1ZSkKK3sKKyAgICBzaXplX3QgbnVtQ29uZmlncyA9ICBORUxFTShnQ29uZmlncyk7CisgICAgaW50IGluZGV4ID0gKGludCljb25maWc7CisgICAgaWYgKHVpbnQzMl90KGluZGV4KSA+PSBudW1Db25maWdzKQorICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9DT05GSUcsIEVHTF9GQUxTRSk7CisKKyAgICBpbnQgYXR0ckluZGV4OworICAgIGF0dHJJbmRleCA9IGJpbmFyeVNlYXJjaDxjb25maWdfcGFpcl90PigKKyAgICAgICAgICAgIGdDb25maWdzW2luZGV4XS5hcnJheSwKKyAgICAgICAgICAgIDAsIGdDb25maWdzW2luZGV4XS5zaXplLTEsCisgICAgICAgICAgICBhdHRyaWJ1dGUpOworICAgIGlmIChhdHRySW5kZXg+PTApIHsKKyAgICAgICAgKnZhbHVlID0gZ0NvbmZpZ3NbaW5kZXhdLmFycmF5W2F0dHJJbmRleF0udmFsdWU7CisgICAgICAgIHJldHVybiBFR0xfVFJVRTsKKyAgICB9CisKKyAgICBhdHRySW5kZXggPSBiaW5hcnlTZWFyY2g8Y29uZmlnX3BhaXJfdD4oCisgICAgICAgICAgICBjb25maWdfYmFzZV9hdHRyaWJ1dGVfbGlzdCwKKyAgICAgICAgICAgIDAsIE5FTEVNKGNvbmZpZ19iYXNlX2F0dHJpYnV0ZV9saXN0KS0xLAorICAgICAgICAgICAgYXR0cmlidXRlKTsKKyAgICBpZiAoYXR0ckluZGV4Pj0wKSB7CisgICAgICAgICp2YWx1ZSA9IGNvbmZpZ19iYXNlX2F0dHJpYnV0ZV9saXN0W2F0dHJJbmRleF0udmFsdWU7CisgICAgICAgIHJldHVybiBFR0xfVFJVRTsKKyAgICB9CisgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfQVRUUklCVVRFLCBFR0xfRkFMU0UpOworfQorCitzdGF0aWMgRUdMU3VyZmFjZSBjcmVhdGVXaW5kb3dTdXJmYWNlKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLAorICAgICAgICBOYXRpdmVXaW5kb3dUeXBlIHdpbmRvdywgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCkKK3sKKyAgICBpZiAoZWdsX2Rpc3BsYXlfdDo6aXNfdmFsaWQoZHB5KSA9PSBFR0xfRkFMU0UpCisgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9OT19TVVJGQUNFKTsKKyAgICBpZiAod2luZG93ID09IDApCisgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX01BVENILCBFR0xfTk9fU1VSRkFDRSk7CisKKyAgICBFR0xpbnQgc3VyZmFjZVR5cGU7CisgICAgaWYgKGdldENvbmZpZ0F0dHJpYihkcHksIGNvbmZpZywgRUdMX1NVUkZBQ0VfVFlQRSwgJnN1cmZhY2VUeXBlKSA9PSBFR0xfRkFMU0UpCisgICAgICAgIHJldHVybiBFR0xfRkFMU0U7CisKKyAgICBpZiAoIShzdXJmYWNlVHlwZSAmIEVHTF9XSU5ET1dfQklUKSkKKyAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfTUFUQ0gsIEVHTF9OT19TVVJGQUNFKTsKKworICAgIEVHTGludCBjb25maWdJRDsKKyAgICBpZiAoZ2V0Q29uZmlnQXR0cmliKGRweSwgY29uZmlnLCBFR0xfQ09ORklHX0lELCAmY29uZmlnSUQpID09IEVHTF9GQUxTRSkKKyAgICAgICAgcmV0dXJuIEVHTF9GQUxTRTsKKworICAgIGludDMyX3QgZGVwdGhGb3JtYXQ7CisgICAgaW50MzJfdCBwaXhlbEZvcm1hdDsKKyAgICBzd2l0Y2goY29uZmlnSUQpIHsKKyAgICBjYXNlIDA6IAorICAgICAgICBwaXhlbEZvcm1hdCA9IEdHTF9QSVhFTF9GT1JNQVRfUkdCXzU2NTsgCisgICAgICAgIGRlcHRoRm9ybWF0ID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBwaXhlbEZvcm1hdCA9IEdHTF9QSVhFTF9GT1JNQVRfUkdCXzU2NTsgCisgICAgICAgIGRlcHRoRm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9aXzE2OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIHBpeGVsRm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODg7IAorICAgICAgICBkZXB0aEZvcm1hdCA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgICAgcGl4ZWxGb3JtYXQgPSBHR0xfUElYRUxfRk9STUFUX1JHQkFfODg4ODsgCisgICAgICAgIGRlcHRoRm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9aXzE2OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICAgIHBpeGVsRm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9BXzg7IAorICAgICAgICBkZXB0aEZvcm1hdCA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNToKKyAgICAgICAgcGl4ZWxGb3JtYXQgPSBHR0xfUElYRUxfRk9STUFUX0FfODsgCisgICAgICAgIGRlcHRoRm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9aXzE2OworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9NQVRDSCwgRUdMX05PX1NVUkZBQ0UpOworICAgIH0KKworICAgIC8vIEZJWE1FOiB3ZSBkb24ndCBoYXZlIGFjY2VzcyB0byB0aGUgcGl4ZWxGb3JtYXQgaGVyZSBqdXN0IHlldC4KKyAgICAvLyAoaXQncyBwb3NzaWJsZSB0aGF0IHRoZSBzdXJmYWNlIGlzIG5vdCBmdWxseSBpbml0aWFsaXplZCkKKyAgICAvLyBtYXliZSB0aGlzIHNob3VsZCBiZSBkb25lIGFmdGVyIHRoZSBwYWdlLWZsaXAKKyAgICAvL2lmIChFR0xpbnQoaW5mby5mb3JtYXQpICE9IHBpeGVsRm9ybWF0KQorICAgIC8vICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX01BVENILCBFR0xfTk9fU1VSRkFDRSk7CisKKyAgICBlZ2xfc3VyZmFjZV90KiBzdXJmYWNlID0KKyAgICAgICAgbmV3IGVnbF93aW5kb3dfc3VyZmFjZV90KGRweSwgY29uZmlnLCBkZXB0aEZvcm1hdCwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxlZ2xfbmF0aXZlX3dpbmRvd190Kj4od2luZG93KSk7CisKKyAgICBpZiAoIXN1cmZhY2UtPmlzVmFsaWQoKSkgeworICAgICAgICAvLyB0aGVyZSB3YXMgYSBwcm9ibGVtIGluIHRoZSBjdG9yLCB0aGUgZXJyb3IKKyAgICAgICAgLy8gZmxhZyBoYXMgYmVlbiBzZXQuCisgICAgICAgIGRlbGV0ZSBzdXJmYWNlOworICAgICAgICBzdXJmYWNlID0gMDsKKyAgICB9CisgICAgcmV0dXJuIHN1cmZhY2U7Cit9CisKK3N0YXRpYyBFR0xTdXJmYWNlIGNyZWF0ZVBpeG1hcFN1cmZhY2UoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsCisgICAgICAgIE5hdGl2ZVBpeG1hcFR5cGUgcGl4bWFwLCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KQoreworICAgIGlmIChlZ2xfZGlzcGxheV90Ojppc192YWxpZChkcHkpID09IEVHTF9GQUxTRSkKKyAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgRUdMX05PX1NVUkZBQ0UpOworICAgIGlmIChwaXhtYXAgPT0gMCkKKyAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfTUFUQ0gsIEVHTF9OT19TVVJGQUNFKTsKKworICAgIEVHTGludCBzdXJmYWNlVHlwZTsKKyAgICBpZiAoZ2V0Q29uZmlnQXR0cmliKGRweSwgY29uZmlnLCBFR0xfU1VSRkFDRV9UWVBFLCAmc3VyZmFjZVR5cGUpID09IEVHTF9GQUxTRSkKKyAgICAgICAgcmV0dXJuIEVHTF9GQUxTRTsKKworICAgIGlmICghKHN1cmZhY2VUeXBlICYgRUdMX1BJWE1BUF9CSVQpKQorICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9NQVRDSCwgRUdMX05PX1NVUkZBQ0UpOworCisgICAgRUdMaW50IGNvbmZpZ0lEOworICAgIGlmIChnZXRDb25maWdBdHRyaWIoZHB5LCBjb25maWcsIEVHTF9DT05GSUdfSUQsICZjb25maWdJRCkgPT0gRUdMX0ZBTFNFKQorICAgICAgICByZXR1cm4gRUdMX0ZBTFNFOworCisgICAgaW50MzJfdCBkZXB0aEZvcm1hdDsKKyAgICBpbnQzMl90IHBpeGVsRm9ybWF0OworICAgIHN3aXRjaChjb25maWdJRCkgeworICAgIGNhc2UgMDogCisgICAgICAgIHBpeGVsRm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1OyAKKyAgICAgICAgZGVwdGhGb3JtYXQgPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIHBpeGVsRm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1OyAKKyAgICAgICAgZGVwdGhGb3JtYXQgPSBHR0xfUElYRUxfRk9STUFUX1pfMTY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgcGl4ZWxGb3JtYXQgPSBHR0xfUElYRUxfRk9STUFUX1JHQkFfODg4ODsgCisgICAgICAgIGRlcHRoRm9ybWF0ID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICBwaXhlbEZvcm1hdCA9IEdHTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4OyAKKyAgICAgICAgZGVwdGhGb3JtYXQgPSBHR0xfUElYRUxfRk9STUFUX1pfMTY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgICAgcGl4ZWxGb3JtYXQgPSBHR0xfUElYRUxfRk9STUFUX0FfODsgCisgICAgICAgIGRlcHRoRm9ybWF0ID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA1OgorICAgICAgICBwaXhlbEZvcm1hdCA9IEdHTF9QSVhFTF9GT1JNQVRfQV84OyAKKyAgICAgICAgZGVwdGhGb3JtYXQgPSBHR0xfUElYRUxfRk9STUFUX1pfMTY7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX01BVENILCBFR0xfTk9fU1VSRkFDRSk7CisgICAgfQorCisgICAgaWYgKHBpeG1hcC0+Zm9ybWF0ICE9IHBpeGVsRm9ybWF0KQorICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9NQVRDSCwgRUdMX05PX1NVUkZBQ0UpOworCisgICAgZWdsX3N1cmZhY2VfdCogc3VyZmFjZSA9CisgICAgICAgIG5ldyBlZ2xfcGl4bWFwX3N1cmZhY2VfdChkcHksIGNvbmZpZywgZGVwdGhGb3JtYXQsCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZWdsX25hdGl2ZV9waXhtYXBfdCo+KHBpeG1hcCkpOworCisgICAgaWYgKCFzdXJmYWNlLT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgLy8gdGhlcmUgd2FzIGEgcHJvYmxlbSBpbiB0aGUgY3RvciwgdGhlIGVycm9yCisgICAgICAgIC8vIGZsYWcgaGFzIGJlZW4gc2V0LgorICAgICAgICBkZWxldGUgc3VyZmFjZTsKKyAgICAgICAgc3VyZmFjZSA9IDA7CisgICAgfQorICAgIHJldHVybiBzdXJmYWNlOworfQorCitzdGF0aWMgRUdMU3VyZmFjZSBjcmVhdGVQYnVmZmVyU3VyZmFjZShFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywKKyAgICAgICAgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCkKK3sKKyAgICBpZiAoZWdsX2Rpc3BsYXlfdDo6aXNfdmFsaWQoZHB5KSA9PSBFR0xfRkFMU0UpCisgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9OT19TVVJGQUNFKTsKKworICAgIEVHTGludCBzdXJmYWNlVHlwZTsKKyAgICBpZiAoZ2V0Q29uZmlnQXR0cmliKGRweSwgY29uZmlnLCBFR0xfU1VSRkFDRV9UWVBFLCAmc3VyZmFjZVR5cGUpID09IEVHTF9GQUxTRSkKKyAgICAgICAgcmV0dXJuIEVHTF9GQUxTRTsKKyAgICAKKyAgICBpZiAoIShzdXJmYWNlVHlwZSAmIEVHTF9QQlVGRkVSX0JJVCkpCisgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX01BVENILCBFR0xfTk9fU1VSRkFDRSk7CisgICAgICAgIAorICAgIEVHTGludCBjb25maWdJRDsKKyAgICBpZiAoZ2V0Q29uZmlnQXR0cmliKGRweSwgY29uZmlnLCBFR0xfQ09ORklHX0lELCAmY29uZmlnSUQpID09IEVHTF9GQUxTRSkKKyAgICAgICAgcmV0dXJuIEVHTF9GQUxTRTsKKworICAgIGludDMyX3QgZGVwdGhGb3JtYXQ7CisgICAgaW50MzJfdCBwaXhlbEZvcm1hdDsKKyAgICBzd2l0Y2goY29uZmlnSUQpIHsKKyAgICBjYXNlIDA6IAorICAgICAgICBwaXhlbEZvcm1hdCA9IEdHTF9QSVhFTF9GT1JNQVRfUkdCXzU2NTsgCisgICAgICAgIGRlcHRoRm9ybWF0ID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBwaXhlbEZvcm1hdCA9IEdHTF9QSVhFTF9GT1JNQVRfUkdCXzU2NTsgCisgICAgICAgIGRlcHRoRm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9aXzE2OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIHBpeGVsRm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODg7IAorICAgICAgICBkZXB0aEZvcm1hdCA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgICAgcGl4ZWxGb3JtYXQgPSBHR0xfUElYRUxfRk9STUFUX1JHQkFfODg4ODsgCisgICAgICAgIGRlcHRoRm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9aXzE2OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICAgIHBpeGVsRm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9BXzg7IAorICAgICAgICBkZXB0aEZvcm1hdCA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNToKKyAgICAgICAgcGl4ZWxGb3JtYXQgPSBHR0xfUElYRUxfRk9STUFUX0FfODsgCisgICAgICAgIGRlcHRoRm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9aXzE2OworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9NQVRDSCwgRUdMX05PX1NVUkZBQ0UpOworICAgIH0KKworICAgIGludDMyX3QgdyA9IDA7CisgICAgaW50MzJfdCBoID0gMDsKKyAgICB3aGlsZSAoYXR0cmliX2xpc3RbMF0pIHsKKyAgICAgICAgaWYgKGF0dHJpYl9saXN0WzBdID09IEVHTF9XSURUSCkgIHcgPSBhdHRyaWJfbGlzdFsxXTsKKyAgICAgICAgaWYgKGF0dHJpYl9saXN0WzBdID09IEVHTF9IRUlHSFQpIGggPSBhdHRyaWJfbGlzdFsxXTsKKyAgICAgICAgYXR0cmliX2xpc3QrPTI7CisgICAgfQorCisgICAgZWdsX3N1cmZhY2VfdCogc3VyZmFjZSA9CisgICAgICAgIG5ldyBlZ2xfcGJ1ZmZlcl9zdXJmYWNlX3QoZHB5LCBjb25maWcsIGRlcHRoRm9ybWF0LCB3LCBoLCBwaXhlbEZvcm1hdCk7CisKKyAgICBpZiAoIXN1cmZhY2UtPmlzVmFsaWQoKSkgeworICAgICAgICAvLyB0aGVyZSB3YXMgYSBwcm9ibGVtIGluIHRoZSBjdG9yLCB0aGUgZXJyb3IKKyAgICAgICAgLy8gZmxhZyBoYXMgYmVlbiBzZXQuCisgICAgICAgIGRlbGV0ZSBzdXJmYWNlOworICAgICAgICBzdXJmYWNlID0gMDsKKyAgICB9CisgICAgcmV0dXJuIHN1cmZhY2U7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbml0aWFsaXphdGlvbgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFR0xEaXNwbGF5IGVnbEdldERpc3BsYXkoTmF0aXZlRGlzcGxheVR5cGUgZGlzcGxheSkKK3sKKyNpZm5kZWYgSEFWRV9BTkRST0lEX09TCisgICAgLy8gdGhpcyBqdXN0IG5lZWRzIHRvIGJlIGRvbmUgb25jZQorICAgIGlmIChnR0xLZXkgPT0gLTEpIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnSW5pdE11dGV4KTsKKyAgICAgICAgaWYgKGdHTEtleSA9PSAtMSkKKyAgICAgICAgICAgIHB0aHJlYWRfa2V5X2NyZWF0ZSgmZ0dMS2V5LCBOVUxMKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdJbml0TXV0ZXgpOworICAgIH0KKyNlbmRpZgorICAgIGlmIChkaXNwbGF5ID09IEVHTF9ERUZBVUxUX0RJU1BMQVkpIHsKKyAgICAgICAgRUdMRGlzcGxheSBkcHkgPSAoRUdMRGlzcGxheSkxOworICAgICAgICBlZ2xfZGlzcGxheV90JiBkID0gZWdsX2Rpc3BsYXlfdDo6Z2V0X2Rpc3BsYXkoZHB5KTsKKyAgICAgICAgZC50eXBlID0gZGlzcGxheTsKKyAgICAgICAgcmV0dXJuIGRweTsKKyAgICB9ICAgIAorICAgIHJldHVybiBFR0xfTk9fRElTUExBWTsKK30KKworRUdMQm9vbGVhbiBlZ2xJbml0aWFsaXplKEVHTERpc3BsYXkgZHB5LCBFR0xpbnQgKm1ham9yLCBFR0xpbnQgKm1pbm9yKQoreworICAgIGlmIChlZ2xfZGlzcGxheV90Ojppc192YWxpZChkcHkpID09IEVHTF9GQUxTRSkKKyAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgRUdMX0ZBTFNFKTsKKyAgICAKKyAgICBFR0xCb29sZWFuIHJlcyA9IEVHTF9UUlVFOworICAgIGVnbF9kaXNwbGF5X3QmIGQgPSBlZ2xfZGlzcGxheV90OjpnZXRfZGlzcGxheShkcHkpOworICAgIAorICAgIGlmIChhbmRyb2lkX2F0b21pY19pbmMoJmQuaW5pdGlhbGl6ZWQpID09IDApIHsKKyAgICAgICAgLy8gaW5pdGlhbGl6ZSBzdHVmZiBoZXJlIGlmIG5lZWRlZAorICAgICAgICAvL3B0aHJlYWRfbXV0ZXhfbG9jaygmZ0luaXRNdXRleCk7CisgICAgICAgIC8vcHRocmVhZF9tdXRleF91bmxvY2soJmdJbml0TXV0ZXgpOworICAgIH0KKworICAgIGlmIChyZXMgPT0gRUdMX1RSVUUpIHsKKyAgICAgICAgaWYgKG1ham9yICE9IE5VTEwpICptYWpvciA9IFZFUlNJT05fTUFKT1I7CisgICAgICAgIGlmIChtaW5vciAhPSBOVUxMKSAqbWlub3IgPSBWRVJTSU9OX01JTk9SOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCitFR0xCb29sZWFuIGVnbFRlcm1pbmF0ZShFR0xEaXNwbGF5IGRweSkKK3sKKyAgICBpZiAoZWdsX2Rpc3BsYXlfdDo6aXNfdmFsaWQoZHB5KSA9PSBFR0xfRkFMU0UpCisgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9GQUxTRSk7CisKKyAgICBFR0xCb29sZWFuIHJlcyA9IEVHTF9UUlVFOworICAgIGVnbF9kaXNwbGF5X3QmIGQgPSBlZ2xfZGlzcGxheV90OjpnZXRfZGlzcGxheShkcHkpOworICAgIGlmIChhbmRyb2lkX2F0b21pY19kZWMoJmQuaW5pdGlhbGl6ZWQpID09IDEpIHsKKyAgICAgICAgLy8gVE9ETzogZGVzdHJveSBhbGwgcmVzb3VyY2VzIChzdXJmYWNlcywgY29udGV4dHMsIGV0Yy4uLikKKyAgICAgICAgLy9wdGhyZWFkX211dGV4X2xvY2soJmdJbml0TXV0ZXgpOworICAgICAgICAvL3B0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnSW5pdE11dGV4KTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uZmlndXJhdGlvbgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFR0xCb29sZWFuIGVnbEdldENvbmZpZ3MoICAgRUdMRGlzcGxheSBkcHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMQ29uZmlnICpjb25maWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTGludCBjb25maWdfc2l6ZSwgRUdMaW50ICpudW1fY29uZmlnKQoreworICAgIGlmIChlZ2xfZGlzcGxheV90Ojppc192YWxpZChkcHkpID09IEVHTF9GQUxTRSkKKyAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgRUdMX0ZBTFNFKTsKKworICAgIEdMaW50IG51bUNvbmZpZ3MgPSBORUxFTShnQ29uZmlncyk7CisgICAgaWYgKCFjb25maWdzKSB7CisgICAgICAgICpudW1fY29uZmlnID0gbnVtQ29uZmlnczsKKyAgICAgICAgcmV0dXJuIEVHTF9UUlVFOworICAgIH0KKyAgICBHTGludCBpOworICAgIGZvciAoaT0wIDsgaTxudW1Db25maWdzICYmIGk8Y29uZmlnX3NpemUgOyBpKyspIHsKKyAgICAgICAgKmNvbmZpZ3MrKyA9IChFR0xDb25maWcpaTsKKyAgICB9CisgICAgKm51bV9jb25maWcgPSBpOworICAgIHJldHVybiBFR0xfVFJVRTsKK30KKworRUdMQm9vbGVhbiBlZ2xDaG9vc2VDb25maWcoIEVHTERpc3BsYXkgZHB5LCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTENvbmZpZyAqY29uZmlncywgRUdMaW50IGNvbmZpZ19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTGludCAqbnVtX2NvbmZpZykKK3sKKyAgICBpZiAoZWdsX2Rpc3BsYXlfdDo6aXNfdmFsaWQoZHB5KSA9PSBFR0xfRkFMU0UpCisgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9GQUxTRSk7CisKKyAgICBpZiAoZ2dsX3VubGlrZWx5KGNvbmZpZ3M9PTAgfHwgYXR0cmliX2xpc3Q9PTApKSB7CisgICAgICAgICpudW1fY29uZmlnID0gMDsKKyAgICAgICAgcmV0dXJuIEVHTF9UUlVFOworICAgIH0KKyAgICAKKyAgICBpbnQgbnVtQXR0cmlidXRlcyA9IDA7CisgICAgaW50IG51bUNvbmZpZ3MgPSAgTkVMRU0oZ0NvbmZpZ3MpOworICAgIHVpbnQzMl90IHBvc3NpYmxlTWF0Y2ggPSAoMTw8bnVtQ29uZmlncyktMTsKKyAgICB3aGlsZShwb3NzaWJsZU1hdGNoICYmICphdHRyaWJfbGlzdCAhPSBFR0xfTk9ORSkgeworICAgICAgICBudW1BdHRyaWJ1dGVzKys7CisgICAgICAgIEVHTGludCBhdHRyID0gKmF0dHJpYl9saXN0Kys7CisgICAgICAgIEVHTGludCB2YWwgID0gKmF0dHJpYl9saXN0Kys7CisgICAgICAgIGZvciAoaW50IGk9MCA7IGk8bnVtQ29uZmlncyA7IGkrKykgeworICAgICAgICAgICAgaWYgKCEocG9zc2libGVNYXRjaCAmICgxPDxpKSkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAoaXNBdHRyaWJ1dGVNYXRjaGluZyhpLCBhdHRyLCB2YWwpID09IDApIHsKKyAgICAgICAgICAgICAgICBwb3NzaWJsZU1hdGNoICY9IH4oMTw8aSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBub3csIGhhbmRsZSB0aGUgYXR0cmlidXRlcyB3aGljaCBoYXZlIGEgdXNlZnVsIGRlZmF1bHQgdmFsdWUKKyAgICBmb3IgKHNpemVfdCBqPTAgOyBqPE5FTEVNKGNvbmZpZ19kZWZhdWx0cykgOyBqKyspIHsKKyAgICAgICAgLy8gc2VlIGlmIHRoaXMgYXR0cmlidXRlIHdhcyBzcGVjaWZpZWQsIGlmIG5vdCBhcHBseSBpdHMKKyAgICAgICAgLy8gZGVmYXVsdCB2YWx1ZQorICAgICAgICBpZiAoYmluYXJ5U2VhcmNoPGNvbmZpZ19wYWlyX3Q+KAorICAgICAgICAgICAgICAgIChjb25maWdfcGFpcl90IGNvbnN0KilhdHRyaWJfbGlzdCwKKyAgICAgICAgICAgICAgICAwLCBudW1BdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgIGNvbmZpZ19kZWZhdWx0c1tqXS5rZXkpIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpbnQgaT0wIDsgaTxudW1Db25maWdzIDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKCEocG9zc2libGVNYXRjaCAmICgxPDxpKSkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGlmIChpc0F0dHJpYnV0ZU1hdGNoaW5nKGksCisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdfZGVmYXVsdHNbal0ua2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnX2RlZmF1bHRzW2pdLnZhbHVlKSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcG9zc2libGVNYXRjaCAmPSB+KDE8PGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHJldHVybiB0aGUgY29uZmlndXJhdGlvbnMgZm91bmQKKyAgICBpbnQgbj0wOworICAgIGlmIChwb3NzaWJsZU1hdGNoKSB7CisgICAgICAgIGZvciAoaW50IGk9MCA7IGNvbmZpZ19zaXplICYmIGk8bnVtQ29uZmlncyA7IGkrKykgeworICAgICAgICAgICAgaWYgKHBvc3NpYmxlTWF0Y2ggJiAoMTw8aSkpIHsKKyAgICAgICAgICAgICAgICpjb25maWdzKysgPSAoRUdMQ29uZmlnKWk7CisgICAgICAgICAgICAgICAgY29uZmlnX3NpemUtLTsKKyAgICAgICAgICAgICAgICBuKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgKm51bV9jb25maWcgPSBuOworICAgICByZXR1cm4gRUdMX1RSVUU7Cit9CisKK0VHTEJvb2xlYW4gZWdsR2V0Q29uZmlnQXR0cmliKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLAorICAgICAgICBFR0xpbnQgYXR0cmlidXRlLCBFR0xpbnQgKnZhbHVlKQoreworICAgIGlmIChlZ2xfZGlzcGxheV90Ojppc192YWxpZChkcHkpID09IEVHTF9GQUxTRSkKKyAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgRUdMX0ZBTFNFKTsKKworICAgIHJldHVybiBnZXRDb25maWdBdHRyaWIoZHB5LCBjb25maWcsIGF0dHJpYnV0ZSwgdmFsdWUpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBzdXJmYWNlcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFR0xTdXJmYWNlIGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoICBFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hdGl2ZVdpbmRvd1R5cGUgd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCkKK3sKKyAgICByZXR1cm4gY3JlYXRlV2luZG93U3VyZmFjZShkcHksIGNvbmZpZywgd2luZG93LCBhdHRyaWJfbGlzdCk7Cit9CisgICAgCitFR0xTdXJmYWNlIGVnbENyZWF0ZVBpeG1hcFN1cmZhY2UoICBFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hdGl2ZVBpeG1hcFR5cGUgcGl4bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCkKK3sKKyAgICByZXR1cm4gY3JlYXRlUGl4bWFwU3VyZmFjZShkcHksIGNvbmZpZywgcGl4bWFwLCBhdHRyaWJfbGlzdCk7Cit9CisKK0VHTFN1cmZhY2UgZWdsQ3JlYXRlUGJ1ZmZlclN1cmZhY2UoIEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCkKK3sKKyAgICByZXR1cm4gY3JlYXRlUGJ1ZmZlclN1cmZhY2UoZHB5LCBjb25maWcsIGF0dHJpYl9saXN0KTsKK30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorRUdMQm9vbGVhbiBlZ2xEZXN0cm95U3VyZmFjZShFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBlZ2xTdXJmYWNlKQoreworICAgIGlmIChlZ2xfZGlzcGxheV90Ojppc192YWxpZChkcHkpID09IEVHTF9GQUxTRSkKKyAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgRUdMX0ZBTFNFKTsKKyAgICBpZiAoZWdsU3VyZmFjZSAhPSBFR0xfTk9fU1VSRkFDRSkgeworICAgICAgICBlZ2xfc3VyZmFjZV90KiBzdXJmYWNlKCBzdGF0aWNfY2FzdDxlZ2xfc3VyZmFjZV90Kj4oZWdsU3VyZmFjZSkgKTsKKyAgICAgICAgaWYgKHN1cmZhY2UtPm1hZ2ljICE9IGVnbF9zdXJmYWNlX3Q6Ok1BR0lDKQorICAgICAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfU1VSRkFDRSwgRUdMX0ZBTFNFKTsKKyAgICAgICAgaWYgKHN1cmZhY2UtPmRweSAhPSBkcHkpCisgICAgICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOworICAgICAgICBkZWxldGUgc3VyZmFjZTsKKyAgICB9CisgICAgcmV0dXJuIEVHTF9UUlVFOworfQorCitFR0xCb29sZWFuIGVnbFF1ZXJ5U3VyZmFjZSggRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2UgZWdsU3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xpbnQgYXR0cmlidXRlLCBFR0xpbnQgKnZhbHVlKQoreworICAgIGlmIChlZ2xfZGlzcGxheV90Ojppc192YWxpZChkcHkpID09IEVHTF9GQUxTRSkKKyAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgRUdMX0ZBTFNFKTsKKyAgICBlZ2xfc3VyZmFjZV90KiBzdXJmYWNlID0gc3RhdGljX2Nhc3Q8ZWdsX3N1cmZhY2VfdCo+KGVnbFN1cmZhY2UpOworICAgIGlmIChzdXJmYWNlLT5kcHkgIT0gZHB5KQorICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOworCisgICAgRUdMQm9vbGVhbiByZXQgPSBFR0xfVFJVRTsKKyAgICBzd2l0Y2ggKGF0dHJpYnV0ZSkgeworICAgICAgICBjYXNlIEVHTF9DT05GSUdfSUQ6CisgICAgICAgICAgICByZXQgPSBnZXRDb25maWdBdHRyaWIoZHB5LCBzdXJmYWNlLT5jb25maWcsIEVHTF9DT05GSUdfSUQsIHZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVHTF9XSURUSDoKKyAgICAgICAgICAgICp2YWx1ZSA9IHN1cmZhY2UtPmdldFdpZHRoKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFR0xfSEVJR0hUOgorICAgICAgICAgICAgKnZhbHVlID0gc3VyZmFjZS0+Z2V0SGVpZ2h0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFR0xfTEFSR0VTVF9QQlVGRkVSOgorICAgICAgICAgICAgLy8gbm90IG1vZGlmaWVkIGZvciBhIHdpbmRvdyBvciBwaXhtYXAgc3VyZmFjZQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRUdMX1RFWFRVUkVfRk9STUFUOgorICAgICAgICAgICAgKnZhbHVlID0gRUdMX05PX1RFWFRVUkU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFR0xfVEVYVFVSRV9UQVJHRVQ6CisgICAgICAgICAgICAqdmFsdWUgPSBFR0xfTk9fVEVYVFVSRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVHTF9NSVBNQVBfVEVYVFVSRToKKyAgICAgICAgICAgICp2YWx1ZSA9IEVHTF9GQUxTRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVHTF9NSVBNQVBfTEVWRUw6CisgICAgICAgICAgICAqdmFsdWUgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRUdMX1JFTkRFUl9CVUZGRVI6CisgICAgICAgICAgICAvLyBUT0RPOiByZXR1cm4gdGhlIHJlYWwgUkVOREVSX0JVRkZFUiBoZXJlCisgICAgICAgICAgICAqdmFsdWUgPSBFR0xfQkFDS19CVUZGRVI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFR0xfSE9SSVpPTlRBTF9SRVNPTFVUSU9OOgorICAgICAgICAgICAgLy8gcGl4ZWwvbW0gKiBFR0xfRElTUExBWV9TQ0FMSU5HCisgICAgICAgICAgICAqdmFsdWUgPSBzdXJmYWNlLT5nZXRIb3Jpem9udGFsUmVzb2x1dGlvbigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRUdMX1ZFUlRJQ0FMX1JFU09MVVRJT046CisgICAgICAgICAgICAvLyBwaXhlbC9tbSAqIEVHTF9ESVNQTEFZX1NDQUxJTkcKKyAgICAgICAgICAgICp2YWx1ZSA9IHN1cmZhY2UtPmdldFZlcnRpY2FsUmVzb2x1dGlvbigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRUdMX1BJWEVMX0FTUEVDVF9SQVRJTzogeworICAgICAgICAgICAgLy8gdy9oICogRUdMX0RJU1BMQVlfU0NBTElORworICAgICAgICAgICAgaW50IHdyID0gc3VyZmFjZS0+Z2V0SG9yaXpvbnRhbFJlc29sdXRpb24oKTsKKyAgICAgICAgICAgIGludCBociA9IHN1cmZhY2UtPmdldFZlcnRpY2FsUmVzb2x1dGlvbigpOworICAgICAgICAgICAgKnZhbHVlID0gKHdyICogRUdMX0RJU1BMQVlfU0NBTElORykgLyBocjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFR0xfU1dBUF9CRUhBVklPUjoKKyAgICAgICAgICAgICp2YWx1ZSA9IHN1cmZhY2UtPmdldFN3YXBCZWhhdmlvcigpOyAKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0ID0gc2V0RXJyb3IoRUdMX0JBRF9BVFRSSUJVVEUsIEVHTF9GQUxTRSk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK0VHTENvbnRleHQgZWdsQ3JlYXRlQ29udGV4dChFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xDb250ZXh0IHNoYXJlX2xpc3QsIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpCit7CisgICAgaWYgKGVnbF9kaXNwbGF5X3Q6OmlzX3ZhbGlkKGRweSkgPT0gRUdMX0ZBTFNFKQorICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfTk9fU1VSRkFDRSk7CisKKyAgICBvZ2xlc19jb250ZXh0X3QqIGdsID0gb2dsZXNfaW5pdChzaXplb2YoZWdsX2NvbnRleHRfdCkpOworICAgIGlmICghZ2wpIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0FMTE9DLCBFR0xfTk9fQ09OVEVYVCk7CisKKyAgICBlZ2xfY29udGV4dF90KiBjID0gc3RhdGljX2Nhc3Q8ZWdsX2NvbnRleHRfdCo+KGdsLT5yYXN0ZXJpemVyLmJhc2UpOworICAgIGMtPmZsYWdzID0gZWdsX2NvbnRleHRfdDo6TkVWRVJfQ1VSUkVOVDsKKyAgICBjLT5kcHkgPSBkcHk7CisgICAgYy0+Y29uZmlnID0gY29uZmlnOworICAgIGMtPnJlYWQgPSAwOworICAgIGMtPmRyYXcgPSAwOworICAgIHJldHVybiAoRUdMQ29udGV4dClnbDsKK30KKworRUdMQm9vbGVhbiBlZ2xEZXN0cm95Q29udGV4dChFR0xEaXNwbGF5IGRweSwgRUdMQ29udGV4dCBjdHgpCit7CisgICAgaWYgKGVnbF9kaXNwbGF5X3Q6OmlzX3ZhbGlkKGRweSkgPT0gRUdMX0ZBTFNFKQorICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOworICAgIGVnbF9jb250ZXh0X3QqIGMgPSBlZ2xfY29udGV4dF90Ojpjb250ZXh0KGN0eCk7CisgICAgaWYgKGMtPmZsYWdzICYgZWdsX2NvbnRleHRfdDo6SVNfQ1VSUkVOVCkKKyAgICAgICAgc2V0R2xUaHJlYWRTcGVjaWZpYygwKTsKKyAgICBvZ2xlc191bmluaXQoKG9nbGVzX2NvbnRleHRfdCopY3R4KTsKKyAgICByZXR1cm4gRUdMX1RSVUU7Cit9CisKK0VHTEJvb2xlYW4gZWdsTWFrZUN1cnJlbnQoICBFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBkcmF3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTFN1cmZhY2UgcmVhZCwgRUdMQ29udGV4dCBjdHgpCit7CisgICAgaWYgKGVnbF9kaXNwbGF5X3Q6OmlzX3ZhbGlkKGRweSkgPT0gRUdMX0ZBTFNFKQorICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOworICAgIGlmIChkcmF3KSB7CisgICAgICAgIGVnbF9zdXJmYWNlX3QqIHMgPSAoZWdsX3N1cmZhY2VfdCopZHJhdzsKKyAgICAgICAgaWYgKHMtPmRweSAhPSBkcHkpCisgICAgICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOworICAgICAgICAvLyBUT0RPOiBjaGVjayB0aGF0IGRyYXcgYW5kIHJlYWQgYXJlIGNvbXBhdGlibGUgd2l0aCB0aGUgY29udGV4dAorICAgIH0KKworICAgIEVHTENvbnRleHQgY3VycmVudF9jdHggPSBFR0xfTk9fQ09OVEVYVDsKKyAgICAKKyAgICBpZiAoKHJlYWQgPT0gRUdMX05PX1NVUkZBQ0UgJiYgZHJhdyA9PSBFR0xfTk9fU1VSRkFDRSkgJiYgKGN0eCAhPSBFR0xfTk9fQ09OVEVYVCkpCisgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX01BVENILCBFR0xfRkFMU0UpOworCisgICAgaWYgKChyZWFkICE9IEVHTF9OT19TVVJGQUNFIHx8IGRyYXcgIT0gRUdMX05PX1NVUkZBQ0UpICYmIChjdHggPT0gRUdMX05PX0NPTlRFWFQpKQorICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9NQVRDSCwgRUdMX0ZBTFNFKTsKKworICAgIGlmIChjdHggPT0gRUdMX05PX0NPTlRFWFQpIHsKKyAgICAgICAgLy8gaWYgd2UncmUgZGV0YWNoaW5nLCB3ZSBuZWVkIHRoZSBjdXJyZW50IGNvbnRleHQKKyAgICAgICAgY3VycmVudF9jdHggPSAoRUdMQ29udGV4dClnZXRHbFRocmVhZFNwZWNpZmljKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZWdsX2NvbnRleHRfdCogYyA9IGVnbF9jb250ZXh0X3Q6OmNvbnRleHQoY3R4KTsKKyAgICAgICAgZWdsX3N1cmZhY2VfdCogZCA9IChlZ2xfc3VyZmFjZV90KilkcmF3OworICAgICAgICBlZ2xfc3VyZmFjZV90KiByID0gKGVnbF9zdXJmYWNlX3QqKXJlYWQ7CisgICAgICAgIGlmICgoZCAmJiBkLT5jdHggJiYgZC0+Y3R4ICE9IGN0eCkgfHwKKyAgICAgICAgICAgIChyICYmIHItPmN0eCAmJiByLT5jdHggIT0gY3R4KSkgeworICAgICAgICAgICAgLy8gb25jZSBvZiB0aGUgc3VyZmFjZSBpcyBib3VuZCB0byBhIGNvbnRleHQgaW4gYW5vdGhlciB0aHJlYWQKKyAgICAgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0FDQ0VTUywgRUdMX0ZBTFNFKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG9nbGVzX2NvbnRleHRfdCogZ2wgPSAob2dsZXNfY29udGV4dF90KiljdHg7CisgICAgaWYgKG1ha2VDdXJyZW50KGdsKSA9PSAwKSB7CisgICAgICAgIGlmIChjdHgpIHsKKyAgICAgICAgICAgIGVnbF9jb250ZXh0X3QqIGMgPSBlZ2xfY29udGV4dF90Ojpjb250ZXh0KGN0eCk7CisgICAgICAgICAgICBlZ2xfc3VyZmFjZV90KiBkID0gKGVnbF9zdXJmYWNlX3QqKWRyYXc7CisgICAgICAgICAgICBlZ2xfc3VyZmFjZV90KiByID0gKGVnbF9zdXJmYWNlX3QqKXJlYWQ7CisgICAgICAgICAgICBjLT5yZWFkID0gcmVhZDsKKyAgICAgICAgICAgIGMtPmRyYXcgPSBkcmF3OworICAgICAgICAgICAgaWYgKGMtPmZsYWdzICYgZWdsX2NvbnRleHRfdDo6TkVWRVJfQ1VSUkVOVCkgeworICAgICAgICAgICAgICAgIGMtPmZsYWdzICY9IH5lZ2xfY29udGV4dF90OjpORVZFUl9DVVJSRU5UOworICAgICAgICAgICAgICAgIEdMaW50IHcgPSAwOworICAgICAgICAgICAgICAgIEdMaW50IGggPSAwOworICAgICAgICAgICAgICAgIGlmIChkcmF3KSB7CisgICAgICAgICAgICAgICAgICAgIHcgPSBkLT5nZXRXaWR0aCgpOworICAgICAgICAgICAgICAgICAgICBoID0gZC0+Z2V0SGVpZ2h0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9nbGVzX3N1cmZhY2Vwb3J0KGdsLCAwLCAwKTsKKyAgICAgICAgICAgICAgICBvZ2xlc192aWV3cG9ydChnbCwgMCwgMCwgdywgaCk7CisgICAgICAgICAgICAgICAgb2dsZXNfc2Npc3NvcihnbCwgMCwgMCwgdywgaCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZCkgeworICAgICAgICAgICAgICAgIGQtPmN0eCA9IGN0eDsKKyAgICAgICAgICAgICAgICBkLT5iaW5kRHJhd1N1cmZhY2UoZ2wpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHIpIHsKKyAgICAgICAgICAgICAgICByLT5jdHggPSBjdHg7CisgICAgICAgICAgICAgICAgci0+YmluZFJlYWRTdXJmYWNlKGdsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGlmIHN1cmZhY2VzIHdlcmUgYm91bmQgdG8gdGhlIGNvbnRleHQgYm91bmQgdG8gdGhpcyB0aHJlYWQKKyAgICAgICAgICAgIC8vIG1hcmsgdGhlbiBhcyB1bmJvdW5kLgorICAgICAgICAgICAgaWYgKGN1cnJlbnRfY3R4KSB7CisgICAgICAgICAgICAgICAgZWdsX2NvbnRleHRfdCogYyA9IGVnbF9jb250ZXh0X3Q6OmNvbnRleHQoY3VycmVudF9jdHgpOworICAgICAgICAgICAgICAgIGVnbF9zdXJmYWNlX3QqIGQgPSAoZWdsX3N1cmZhY2VfdCopYy0+ZHJhdzsKKyAgICAgICAgICAgICAgICBlZ2xfc3VyZmFjZV90KiByID0gKGVnbF9zdXJmYWNlX3QqKWMtPnJlYWQ7CisgICAgICAgICAgICAgICAgaWYgKGQpIGQtPmN0eCA9IEVHTF9OT19DT05URVhUOworICAgICAgICAgICAgICAgIGlmIChyKSByLT5jdHggPSBFR0xfTk9fQ09OVEVYVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gRUdMX1RSVUU7CisgICAgfQorICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0FDQ0VTUywgRUdMX0ZBTFNFKTsKK30KKworRUdMQ29udGV4dCBlZ2xHZXRDdXJyZW50Q29udGV4dCh2b2lkKQoreworICAgIC8vIGVnbEdldEN1cnJlbnRDb250ZXh0IHJldHVybnMgdGhlIGN1cnJlbnQgRUdMIHJlbmRlcmluZyBjb250ZXh0LAorICAgIC8vIGFzIHNwZWNpZmllZCBieSBlZ2xNYWtlQ3VycmVudC4gSWYgbm8gY29udGV4dCBpcyBjdXJyZW50LAorICAgIC8vIEVHTF9OT19DT05URVhUIGlzIHJldHVybmVkLgorICAgIHJldHVybiAoRUdMQ29udGV4dClnZXRHbFRocmVhZFNwZWNpZmljKCk7Cit9CisKK0VHTFN1cmZhY2UgZWdsR2V0Q3VycmVudFN1cmZhY2UoRUdMaW50IHJlYWRkcmF3KQoreworICAgIC8vIGVnbEdldEN1cnJlbnRTdXJmYWNlIHJldHVybnMgdGhlIHJlYWQgb3IgZHJhdyBzdXJmYWNlIGF0dGFjaGVkCisgICAgLy8gdG8gdGhlIGN1cnJlbnQgRUdMIHJlbmRlcmluZyBjb250ZXh0LCBhcyBzcGVjaWZpZWQgYnkgZWdsTWFrZUN1cnJlbnQuCisgICAgLy8gSWYgbm8gY29udGV4dCBpcyBjdXJyZW50LCBFR0xfTk9fU1VSRkFDRSBpcyByZXR1cm5lZC4KKyAgICBFR0xDb250ZXh0IGN0eCA9IChFR0xDb250ZXh0KWdldEdsVGhyZWFkU3BlY2lmaWMoKTsKKyAgICBpZiAoY3R4ID09IEVHTF9OT19DT05URVhUKSByZXR1cm4gRUdMX05PX1NVUkZBQ0U7CisgICAgZWdsX2NvbnRleHRfdCogYyA9IGVnbF9jb250ZXh0X3Q6OmNvbnRleHQoY3R4KTsKKyAgICBpZiAocmVhZGRyYXcgPT0gRUdMX1JFQUQpIHsKKyAgICAgICAgcmV0dXJuIGMtPnJlYWQ7CisgICAgfSBlbHNlIGlmIChyZWFkZHJhdyA9PSBFR0xfRFJBVykgeworICAgICAgICByZXR1cm4gYy0+ZHJhdzsKKyAgICB9CisgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfQVRUUklCVVRFLCBFR0xfTk9fU1VSRkFDRSk7Cit9CisKK0VHTERpc3BsYXkgZWdsR2V0Q3VycmVudERpc3BsYXkodm9pZCkKK3sKKyAgICAvLyBlZ2xHZXRDdXJyZW50RGlzcGxheSByZXR1cm5zIHRoZSBjdXJyZW50IEVHTCBkaXNwbGF5IGNvbm5lY3Rpb24KKyAgICAvLyBmb3IgdGhlIGN1cnJlbnQgRUdMIHJlbmRlcmluZyBjb250ZXh0LCBhcyBzcGVjaWZpZWQgYnkgZWdsTWFrZUN1cnJlbnQuCisgICAgLy8gSWYgbm8gY29udGV4dCBpcyBjdXJyZW50LCBFR0xfTk9fRElTUExBWSBpcyByZXR1cm5lZC4KKyAgICBFR0xDb250ZXh0IGN0eCA9IChFR0xDb250ZXh0KWdldEdsVGhyZWFkU3BlY2lmaWMoKTsKKyAgICBpZiAoY3R4ID09IEVHTF9OT19DT05URVhUKSByZXR1cm4gRUdMX05PX0RJU1BMQVk7CisgICAgZWdsX2NvbnRleHRfdCogYyA9IGVnbF9jb250ZXh0X3Q6OmNvbnRleHQoY3R4KTsKKyAgICByZXR1cm4gYy0+ZHB5OworfQorCitFR0xCb29sZWFuIGVnbFF1ZXJ5Q29udGV4dCggRUdMRGlzcGxheSBkcHksIEVHTENvbnRleHQgY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTGludCBhdHRyaWJ1dGUsIEVHTGludCAqdmFsdWUpCit7CisgICAgaWYgKGVnbF9kaXNwbGF5X3Q6OmlzX3ZhbGlkKGRweSkgPT0gRUdMX0ZBTFNFKQorICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOworICAgIGVnbF9jb250ZXh0X3QqIGMgPSBlZ2xfY29udGV4dF90Ojpjb250ZXh0KGN0eCk7CisgICAgc3dpdGNoIChhdHRyaWJ1dGUpIHsKKyAgICAgICAgY2FzZSBFR0xfQ09ORklHX0lEOgorICAgICAgICAgICAgLy8gUmV0dXJucyB0aGUgSUQgb2YgdGhlIEVHTCBmcmFtZSBidWZmZXIgY29uZmlndXJhdGlvbiB3aXRoCisgICAgICAgICAgICAvLyByZXNwZWN0IHRvIHdoaWNoIHRoZSBjb250ZXh0IHdhcyBjcmVhdGVkCisgICAgICAgICAgICByZXR1cm4gZ2V0Q29uZmlnQXR0cmliKGRweSwgYy0+Y29uZmlnLCBFR0xfQ09ORklHX0lELCB2YWx1ZSk7CisgICAgfQorICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0FUVFJJQlVURSwgRUdMX0ZBTFNFKTsKK30KKworRUdMQm9vbGVhbiBlZ2xXYWl0R0wodm9pZCkKK3sKKyAgICByZXR1cm4gRUdMX1RSVUU7Cit9CisKK0VHTEJvb2xlYW4gZWdsV2FpdE5hdGl2ZShFR0xpbnQgZW5naW5lKQoreworICAgIHJldHVybiBFR0xfVFJVRTsKK30KKworRUdMQm9vbGVhbiBlZ2xTd2FwQnVmZmVycyhFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBkcmF3KQoreworICAgIGlmIChlZ2xfZGlzcGxheV90Ojppc192YWxpZChkcHkpID09IEVHTF9GQUxTRSkKKyAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgRUdMX0ZBTFNFKTsKKyAgICAKKyAgICBlZ2xfc3VyZmFjZV90KiBkID0gc3RhdGljX2Nhc3Q8ZWdsX3N1cmZhY2VfdCo+KGRyYXcpOworICAgIGlmIChkLT5kcHkgIT0gZHB5KQorICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOworCisgICAgLy8gcG9zdCB0aGUgc3VyZmFjZQorICAgIGQtPnN3YXBCdWZmZXJzKCk7CisKKyAgICAvLyBpZiBpdCdzIGJvdW5kIHRvIGEgY29udGV4dCwgdXBkYXRlIHRoZSBidWZmZXIKKyAgICBpZiAoZC0+Y3R4ICE9IEVHTF9OT19DT05URVhUKSB7CisgICAgICAgIGQtPmJpbmREcmF3U3VyZmFjZSgob2dsZXNfY29udGV4dF90KilkLT5jdHgpOworICAgICAgICAvLyBpZiB0aGlzIHN1cmZhY2UgaXMgYWxzbyB0aGUgcmVhZCBzdXJmYWNlIG9mIHRoZSBjb250ZXh0CisgICAgICAgIC8vIGl0IGlzIGJvdW5kIHRvLCBtYWtlIHN1cmUgdG8gdXBkYXRlIHRoZSByZWFkIGJ1ZmZlciBhcyB3ZWxsLgorICAgICAgICAvLyBUaGUgRUdMIHNwZWMgaXMgYSBsaXR0bGUgdW5jbGVhciBhYm91dCB0aGlzLgorICAgICAgICBlZ2xfY29udGV4dF90KiBjID0gZWdsX2NvbnRleHRfdDo6Y29udGV4dChkLT5jdHgpOworICAgICAgICBpZiAoYy0+cmVhZCA9PSBkcmF3KSB7CisgICAgICAgICAgICBkLT5iaW5kUmVhZFN1cmZhY2UoKG9nbGVzX2NvbnRleHRfdCopZC0+Y3R4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBFR0xfVFJVRTsKK30KKworRUdMQm9vbGVhbiBlZ2xDb3B5QnVmZmVycyggIEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmF0aXZlUGl4bWFwVHlwZSB0YXJnZXQpCit7CisgICAgaWYgKGVnbF9kaXNwbGF5X3Q6OmlzX3ZhbGlkKGRweSkgPT0gRUdMX0ZBTFNFKQorICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOworICAgIC8vIFRPRE86IGVnbENvcHlCdWZmZXJzKCkKKyAgICByZXR1cm4gRUdMX0ZBTFNFOworfQorCitFR0xpbnQgZWdsR2V0RXJyb3Iodm9pZCkKK3sKKyAgICByZXR1cm4gZ2V0RXJyb3IoKTsKK30KKworY29uc3QgY2hhciogZWdsUXVlcnlTdHJpbmcoRUdMRGlzcGxheSBkcHksIEVHTGludCBuYW1lKQoreworICAgIGlmIChlZ2xfZGlzcGxheV90Ojppc192YWxpZChkcHkpID09IEVHTF9GQUxTRSkKKyAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgKGNvbnN0IGNoYXIqKTApOworCisgICAgc3dpdGNoIChuYW1lKSB7CisgICAgICAgIGNhc2UgRUdMX1ZFTkRPUjoKKyAgICAgICAgICAgIHJldHVybiBnVmVuZG9yU3RyaW5nOworICAgICAgICBjYXNlIEVHTF9WRVJTSU9OOgorICAgICAgICAgICAgcmV0dXJuIGdWZXJzaW9uU3RyaW5nOworICAgICAgICBjYXNlIEVHTF9FWFRFTlNJT05TOgorICAgICAgICAgICAgcmV0dXJuIGdFeHRlbnNpb25zU3RyaW5nOworICAgICAgICBjYXNlIEVHTF9DTElFTlRfQVBJUzoKKyAgICAgICAgICAgIHJldHVybiBnQ2xpZW50QXBpU3RyaW5nOworICAgIH0KKyAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9QQVJBTUVURVIsIChjb25zdCBjaGFyICopMCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVHTCAxLjEKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRUdMQm9vbGVhbiBlZ2xTdXJmYWNlQXR0cmliKAorICAgICAgICBFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmYWNlLCBFR0xpbnQgYXR0cmlidXRlLCBFR0xpbnQgdmFsdWUpCit7CisgICAgaWYgKGVnbF9kaXNwbGF5X3Q6OmlzX3ZhbGlkKGRweSkgPT0gRUdMX0ZBTFNFKQorICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOworICAgIC8vIFRPRE86IGVnbFN1cmZhY2VBdHRyaWIoKQorICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX1BBUkFNRVRFUiwgRUdMX0ZBTFNFKTsKK30KKworRUdMQm9vbGVhbiBlZ2xCaW5kVGV4SW1hZ2UoCisgICAgICAgIEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UsIEVHTGludCBidWZmZXIpCit7CisgICAgaWYgKGVnbF9kaXNwbGF5X3Q6OmlzX3ZhbGlkKGRweSkgPT0gRUdMX0ZBTFNFKQorICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOworICAgIC8vIFRPRE86IGVnbEJpbmRUZXhJbWFnZSgpCisgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfUEFSQU1FVEVSLCBFR0xfRkFMU0UpOworfQorCitFR0xCb29sZWFuIGVnbFJlbGVhc2VUZXhJbWFnZSgKKyAgICAgICAgRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyZmFjZSwgRUdMaW50IGJ1ZmZlcikKK3sKKyAgICBpZiAoZWdsX2Rpc3BsYXlfdDo6aXNfdmFsaWQoZHB5KSA9PSBFR0xfRkFMU0UpCisgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9GQUxTRSk7CisgICAgLy8gVE9ETzogZWdsUmVsZWFzZVRleEltYWdlKCkKKyAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9QQVJBTUVURVIsIEVHTF9GQUxTRSk7Cit9CisKK0VHTEJvb2xlYW4gZWdsU3dhcEludGVydmFsKEVHTERpc3BsYXkgZHB5LCBFR0xpbnQgaW50ZXJ2YWwpCit7CisgICAgaWYgKGVnbF9kaXNwbGF5X3Q6OmlzX3ZhbGlkKGRweSkgPT0gRUdMX0ZBTFNFKQorICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOworICAgIC8vIFRPRE86IGVnbFN3YXBJbnRlcnZhbCgpCisgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfUEFSQU1FVEVSLCBFR0xfRkFMU0UpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFR0wgMS4yCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VHTEJvb2xlYW4gZWdsQmluZEFQSShFR0xlbnVtIGFwaSkKK3sKKyAgICBpZiAoYXBpICE9IEVHTF9PUEVOR0xfRVNfQVBJKQorICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9QQVJBTUVURVIsIEVHTF9GQUxTRSk7CisgICAgcmV0dXJuIEVHTF9UUlVFOworfQorCitFR0xlbnVtIGVnbFF1ZXJ5QVBJKHZvaWQpCit7CisgICAgcmV0dXJuIEVHTF9PUEVOR0xfRVNfQVBJOworfQorCitFR0xCb29sZWFuIGVnbFdhaXRDbGllbnQodm9pZCkKK3sKKyAgICBnbEZpbmlzaCgpOworICAgIHJldHVybiBFR0xfVFJVRTsKK30KKworRUdMQm9vbGVhbiBlZ2xSZWxlYXNlVGhyZWFkKHZvaWQpCit7CisgICAgLy8gVE9ETzogZWdsUmVsZWFzZVRocmVhZCgpCisgICAgcmV0dXJuIEVHTF9UUlVFOworfQorCitFR0xTdXJmYWNlIGVnbENyZWF0ZVBidWZmZXJGcm9tQ2xpZW50QnVmZmVyKAorICAgICAgICAgIEVHTERpc3BsYXkgZHB5LCBFR0xlbnVtIGJ1ZnR5cGUsIEVHTENsaWVudEJ1ZmZlciBidWZmZXIsCisgICAgICAgICAgRUdMQ29uZmlnIGNvbmZpZywgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCkKK3sKKyAgICBpZiAoZWdsX2Rpc3BsYXlfdDo6aXNfdmFsaWQoZHB5KSA9PSBFR0xfRkFMU0UpCisgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9OT19TVVJGQUNFKTsKKyAgICAvLyBUT0RPOiBlZ2xDcmVhdGVQYnVmZmVyRnJvbUNsaWVudEJ1ZmZlcigpCisgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfUEFSQU1FVEVSLCBFR0xfTk9fU1VSRkFDRSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEFuZHJvaWQgZXh0ZW5zaW9ucworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkICgqZWdsR2V0UHJvY0FkZHJlc3MgKGNvbnN0IGNoYXIgKnByb2NuYW1lKSkoKQoreworICAgIGV4dGVudGlvbl9tYXBfdCBjb25zdCAqIGNvbnN0IG1hcCA9IGdFeHRlbnRpb25NYXA7CisgICAgZm9yICh1aW50MzJfdCBpPTAgOyBpPE5FTEVNKGdFeHRlbnRpb25NYXApIDsgaSsrKSB7CisgICAgICAgIGlmICghc3RyY21wKHByb2NuYW1lLCBtYXBbaV0ubmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBtYXBbaV0uYWRkcmVzczsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvZml4ZWRfYXNtLlMgYi9vcGVuZ2wvbGliYWdsL2ZpeGVkX2FzbS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYmM1NmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvbGliYWdsL2ZpeGVkX2FzbS5TCkBAIC0wLDAgKzEsNjUgQEAKKy8qIGxpYnMvb3BlbmdsZXMvZml4ZWRfYXNtLlMKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisKKyAgICAudGV4dAorICAgIC5hbGlnbgorICAgIAorICAgIC5nbG9iYWwgZ2dsRmxvYXRUb0ZpeGVkCisgICAgLmdsb2JhbCBnZ2xGbG9hdFRvRml4ZWRGYXN0CisKKworLyoKKyAqIENvbnZlcnRzIGEgZmxvYXQgdG8gYSBzMTUuMTYgZml4ZWQtcG9pbnQgbnVtYmVyLgorICogdGhpcyBkb2Vzbid0IGhhbmRsZSBmbG9hdHMgb3V0IG9mIHRoZSBbLTMyNzY4LCArMzI3NjhbIHJhbmdlCisgKiBhbmQgZG9lc24ndCBwZXJmb3JtcyByb3VuZC10by1uZWFyZXN0LgorICogaG93ZXZlciwgaXQncyB2ZXJ5IGZhc3QgOi0pCisgKi8KKworZ2dsRmxvYXRUb0ZpeGVkRmFzdDoKKyAgICAgICAgbW92cyAgICByMSwgcjAsIGxzbCAjMSAgICAgICAgICAvKiByZW1vdmUgYml0IHNpZ24gKi8KKyAgICAgICAgbW92ICAgICByMiwgIzB4OEUgICAgICAgICAgICAgICAvKiAxMjcgKyAxNSAqLworICAgICAgICBzdWIgICAgIHIxLCByMiwgcjEsIGxzciAjMjQgICAgIC8qIGNvbXB1dGUgc2hpZnQgKi8KKyAgICAgICAgbW92ICAgICByMiwgcjAsIGxzbCAjOCAgICAgICAgICAvKiBtYW50aXNzYTw8OCAqLworICAgICAgICBvcnIgICAgIHIyLCByMiwgIzB4ODAwMDAwMDAgICAgIC8qIGFkZCB0aGUgbWlzc2luZyAxICovCisgICAgICAgIG1vdiAgICAgcjAsIHIyLCBsc3IgcjEgICAgICAgICAgLyogc2NhbGUgdG8gMTYuMTYgKi8KKyAgICAgICAgcnNiY3MgICByMCwgcjAsICMwICAgICAgICAgICAgICAvKiBuZWdhdGUgaWYgbmVlZGVkICovCisgICAgICAgIGJ4ICAgICAgbHIKKworLyoKKyAqIHRoaXMgdmVyc2lvbiByb3VuZHMtdG8tbmVhcmVzdCBhbmQgc2F0dXJhdGVzIG51bWJlcnMKKyAqIG91dHNpZGUgdGhlIHJhbmdlIChidXQgbm90IE5hTnMpLgorICovCisKK2dnbEZsb2F0VG9GaXhlZDoKKyAgICAgICAgbW92ICAgICByMSwgcjAsIGxzbCAjMSAgICAgICAgICAvKiByZW1vdmUgYml0IHNpZ24gKi8KKyAgICAgICAgbW92ICAgICByMiwgIzB4OEUgICAgICAgICAgICAgICAvKiAxMjcgKyAxNSAqLworICAgICAgICBzdWJzICAgIHIxLCByMiwgcjEsIGxzciAjMjQgICAgIC8qIGNvbXB1dGUgc2hpZnQgKi8KKyAgICAgICAgYmxzICAgICAwZiAgICAgICAgICAgICAgICAgICAgICAvKiB0b28gYmlnICovCisgICAgICAgIG1vdiAgICAgcjIsIHIwLCBsc2wgIzggICAgICAgICAgLyogbWFudGlzc2E8PDggKi8KKyAgICAgICAgb3JyICAgICByMiwgcjIsICMweDgwMDAwMDAwICAgICAvKiBhZGQgdGhlIG1pc3NpbmcgMSAqLworICAgICAgICBtb3YgICAgIHIzLCByMAorICAgICAgICBtb3ZzICAgIHIwLCByMiwgbHNyIHIxICAgICAgICAgIC8qIHNjYWxlIHRvIDE2LjE2ICovCisgICAgICAgIGFkZGNzICAgcjAsIHIwLCAjMSAgICAgICAgICAgICAgLyogcm91bmQtdG8tbmVhcmVzdCAqLworICAgICAgICB0c3QgICAgIHIzLCAjMHg4MDAwMDAwMCAgICAgICAgIC8qIG5lZ2F0aXZlPyAqLworICAgICAgICByc2JuZSAgIHIwLCByMCwgIzAgICAgICAgICAgICAgIC8qIG5lZ2F0ZSBpZiBuZWVkZWQgKi8KKyAgICAgICAgYnggICAgICBsciAKKyAKKzA6ICAgICAgYW5kcyAgICByMCwgcjAsICMweDgwMDAwMDAwICAgICAvKiBrZWVwIG9ubHkgdGhlIHNpZ24gYml0ICovCisgICAgICAgIG1vdmVxICAgcjAsICMweDdmZmZmZmZmICAgICAgICAgLyogcG9zaXRpdmUsIG1heGltdW0gdmFsdWUgKi8KKyAgICAgICAgYnggICAgICBscgorCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL2ZwLmNwcCBiL29wZW5nbC9saWJhZ2wvZnAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNWYxZmUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvbGliYWdsL2ZwLmNwcApAQCAtMCwwICsxLDg3IEBACisvKiBsaWJzL29wZW5nbGVzL2ZwLmNwcAorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpbmNsdWRlICJmcC5oIgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiAhZGVmaW5lZChfX2FybV9fKQorR0dMZml4ZWQgZ2dsRmxvYXRUb0ZpeGVkKGZsb2F0IHYpIHsgICAKKyAgICByZXR1cm4gR0dMZml4ZWQoZmxvb3JmKHYgKiA2NTUzNi4wZiArIDAuNWYpKTsKK30KKyNlbmRpZgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIGdsIHsKKworR0xmbG9hdCBmaXhlZFRvRmxvYXQoR0xmaXhlZCB4KQoreworI2lmIERFQlVHX1VTRV9GTE9BVFMKKyAgICByZXR1cm4geCAvIDY1NTM2LjBmOworI2Vsc2UKKyAgICBpZiAoIXgpIHJldHVybiAwOworICAgIGNvbnN0IHVpbnQzMl90IHMgPSB4ICYgMHg4MDAwMDAwMDsKKyAgICB1bmlvbiB7CisgICAgICAgIHVpbnQzMl90IGk7CisgICAgICAgIGZsb2F0IGY7CisgICAgfTsKKyAgICBpID0gcyA/IC14IDogeDsKKyAgICBjb25zdCBpbnQgYyA9IGdnbENseihpKSAtIDg7CisgICAgaSA9IChjPj0wKSA/IChpPDxjKSA6IChpPj4tYyk7CisgICAgY29uc3QgdWludDMyX3QgZSA9IDEzNCAtIGM7CisgICAgaSAmPSB+MHg4MDAwMDA7CisgICAgaSB8PSBlPDwyMzsKKyAgICBpIHw9IHM7CisgICAgcmV0dXJuIGY7CisjZW5kaWYKK30KKworZmxvYXQgc2luZWYoZmxvYXQgeCkKK3sKKyAgICBjb25zdCBmbG9hdCBBID0gICAxLjBmIC8gKDIuMGYqTV9QSSk7CisgICAgY29uc3QgZmxvYXQgQiA9IC0xNi4wZjsKKyAgICBjb25zdCBmbG9hdCBDID0gICA4LjBmOworCisgICAgLy8gc2NhbGUgYW5nbGUgZm9yIGVhc3kgYXJndW1lbnQgcmVkdWN0aW9uCisgICAgeCAqPSBBOworICAgIAorICAgIGlmIChmYWJzZih4KSA+PSAwLjVmKSB7CisgICAgICAgIC8vIEFyZ3VtZW50IHJlZHVjdGlvbgorICAgICAgICB4ID0geCAtIGNlaWxmKHggKyAwLjVmKSArIDEuMGY7IAorICAgIH0KKworICAgIGNvbnN0IGZsb2F0IHkgPSBCKngqZmFic2YoeCkgKyBDKng7CisgICAgcmV0dXJuIDAuMjIxNWYgKiAoeSpmYWJzZih5KSAtIHkpICsgeTsKK30KKworZmxvYXQgY29zaW5lZihmbG9hdCB4KQoreworICAgIHJldHVybiBzaW5lZih4ICsgZmxvYXQoTV9QSS8yKSk7Cit9CisKK3ZvaWQgc2luY29zZihHTGZsb2F0IGFuZ2xlLCBHTGZsb2F0KiBzLCBHTGZsb2F0KiBjKSB7CisgICAgKnMgPSBzaW5lZihhbmdsZSk7CisgICAgKmMgPSBjb3NpbmVmKGFuZ2xlKTsKK30KKworfTsgLy8gbmFtZXNwYWNlIGZwX3V0aWxzCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL2ZwLmggYi9vcGVuZ2wvbGliYWdsL2ZwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQwYzE4MwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC9saWJhZ2wvZnAuaApAQCAtMCwwICsxLDI0MyBAQAorLyogbGlicy9vcGVuZ2xlcy9mcC5oCisqKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2lmbmRlZiBBTkRST0lEX09QRU5HTEVTX0ZQX0gKKyNkZWZpbmUgQU5EUk9JRF9PUEVOR0xFU19GUF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlIDxwcml2YXRlL3BpeGVsZmxpbmdlci9nZ2xfY29udGV4dC5oPgorCisjaW5jbHVkZSA8R0xFUy9nbC5oPgorCisjZGVmaW5lIERFQlVHX1VTRV9GTE9BVFMgICAgICAwCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZXh0ZXJuICJDIiBHTGZpeGVkIGdnbEZsb2F0VG9GaXhlZChmbG9hdCBmKSBfX2F0dHJpYnV0ZV9fKChjb25zdCkpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSBnbCB7CisKKyAgICAgICAgR0xmbG9hdCBmaXhlZFRvRmxvYXQoR0xmaXhlZCkgQ09OU1Q7CisKKyAgICAgICAgdm9pZCAgICBzaW5jb3NmKEdMZmxvYXQgYW5nbGUsIEdMZmxvYXQqIHMsIEdMZmxvYXQqIGMpOworICAgICAgICBmbG9hdCAgIHNpbmVmKEdMZmxvYXQgeCkgQ09OU1Q7CisgICAgICAgIGZsb2F0ICAgY29zaW5lZihHTGZsb2F0IHgpIENPTlNUOworCitpbmxpbmUgYm9vbCAgICAgY21wZihHTGZsb2F0IGEsIEdMZmxvYXQgYikgQ09OU1Q7CitpbmxpbmUgYm9vbCAgICAgaXNaZXJvZihHTGZsb2F0KSBDT05TVDsKK2lubGluZSBib29sICAgICBpc09uZWYoR0xmbG9hdCkgQ09OU1Q7CisKK2lubGluZSBpbnQgICAgICBpc1plcm9Pck5lZ2F0aXZlZihHTGZsb2F0KSBDT05TVDsKKworaW5saW5lIGludCAgICAgIGV4cG9uZW50KEdMZmxvYXQpIENPTlNUOworaW5saW5lIGludDMyX3QgIG1hbnRpc3NhKEdMZmxvYXQpIENPTlNUOworaW5saW5lIEdMZmxvYXQgIGNsYW1wVG9aZXJvZihHTGZsb2F0KSBDT05TVDsKK2lubGluZSBHTGZsb2F0ICByZWNpcHJvY2FsZihHTGZsb2F0KSBDT05TVDsKK2lubGluZSBHTGZsb2F0ICByc3FydGYoR0xmbG9hdCkgQ09OU1Q7CitpbmxpbmUgR0xmbG9hdCAgc3FyZihHTGZsb2F0KSBDT05TVDsKK2lubGluZSBHTGZsb2F0ICBhZGRFeHBmKEdMZmxvYXQgdiwgaW50IGUpIENPTlNUOworaW5saW5lIEdMZmxvYXQgIG11bDJmKEdMZmxvYXQgdikgQ09OU1Q7CitpbmxpbmUgR0xmbG9hdCAgZGl2MmYoR0xmbG9hdCB2KSBDT05TVDsKK2lubGluZSBHTGZsb2F0ICBhYnNmKEdMZmxvYXQgdikgQ09OU1Q7CisKKworLyogCisgKiBmbG9hdCBmYXN0ZXhwZihmbG9hdCkgOiBhIGZhc3QgYXBwcm94aW1hdGlvbiBvZiBleHBmKHgpCisgKgkJZ2l2ZSBzb21ld2hhdCBhY2N1cmF0ZSByZXN1bHRzIGZvciAtODggPD0geCA8PSA4OAorICoKKyAqIGV4cCh4KSA9IDJeKHgvbG4oMikpCisgKiB3ZSB1c2UgdGhlIHByb3BlcnRpZXMgb2YgZmxvYXQgZW5jb2RpbmcKKyAqIHRvIGdldCBhIGZhc3QgMl4gYW5kIGxpbmVhciBpbnRlcnBvbGF0aW9uCisgKgorICovCisKK2lubGluZSBmbG9hdCBmYXN0ZXhwZihmbG9hdCB5KSBfX2F0dHJpYnV0ZV9fKChjb25zdCkpOworCitpbmxpbmUgZmxvYXQgZmFzdGV4cGYoZmxvYXQgeSkKK3sKKwl1bmlvbiB7CisJCWZsb2F0CXI7CisJCWludDMyX3QJaTsKKwl9IHU7CQorCisJLy8gMTI3KmxuKDIpID0gODgKKwlpZiAoeSA8IC04OC4wZikgeworCQl1LnIgPSAwLjBmOworCX0gZWxzZSBpZiAoeSA+IDg4LjBmKSB7CisJCXUuciA9IElORklOSVRZOworCX0gZWxzZSB7CisJCWNvbnN0IGZsb2F0IGtPbmVPdmVyTG9nVHdvID0gKDFMPDwyMykgLyBNX0xOMjsKKwkJY29uc3QgaW50MzJfdCBrRXhwb25lbnRCaWFzID0gMTI3TDw8MjM7CisJCWNvbnN0IGludDMyX3QgZSA9IGludDMyX3QoeSprT25lT3ZlckxvZ1R3byk7CisJCXUuaSA9IGUgKyBrRXhwb25lbnRCaWFzOworCX0KKwkKKwlyZXR1cm4gdS5yOworfQorCisKK2Jvb2wgY21wZihHTGZsb2F0IGEsIEdMZmxvYXQgYikgeworI2lmIERFQlVHX1VTRV9GTE9BVFMKKyAgICByZXR1cm4gYSA9PSBiOworI2Vsc2UKKyAgICB1bmlvbiB7CisgICAgICAgIGZsb2F0ICAgICAgIGY7CisgICAgICAgIHVpbnQzMl90ICAgIGk7CisgICAgfSB1YSwgdWI7CisgICAgdWEuZiA9IGE7CisgICAgdWIuZiA9IGI7CisgICAgcmV0dXJuIHVhLmkgPT0gdWIuaTsKKyNlbmRpZgorfSAKKworYm9vbCBpc1plcm9mKEdMZmxvYXQgdikgeworI2lmIERFQlVHX1VTRV9GTE9BVFMKKyAgICByZXR1cm4gdiA9PSAwOworI2Vsc2UKKyAgICB1bmlvbiB7CisgICAgICAgIGZsb2F0ICAgICAgIGY7CisgICAgICAgIGludDMyX3QgICAgIGk7CisgICAgfTsKKyAgICBmID0gdjsKKyAgICByZXR1cm4gKGk8PDEpID09IDA7CisjZW5kaWYKK30KKworYm9vbCBpc09uZWYoR0xmbG9hdCB2KSB7CisgICAgcmV0dXJuIGNtcGYodiwgMS4wZik7Cit9CisKK2ludCBpc1plcm9Pck5lZ2F0aXZlZihHTGZsb2F0IHYpIHsKKyNpZiBERUJVR19VU0VfRkxPQVRTCisgICAgcmV0dXJuIHYgPD0gMDsKKyNlbHNlCisgICAgdW5pb24geworICAgICAgICBmbG9hdCAgICAgICBmOworICAgICAgICBpbnQzMl90ICAgICBpOworICAgIH07CisgICAgZiA9IHY7CisgICAgcmV0dXJuIGlzWmVyb2YodikgfCAoaT4+MzEpOworI2VuZGlmCit9CisKK2ludCBleHBvbmVudChHTGZsb2F0IHYpIHsKKyAgICB1bmlvbiB7CisgICAgICAgIGZsb2F0ICAgIGY7CisgICAgICAgIHVpbnQzMl90IGk7CisgICAgfTsKKyAgICBmID0gdjsKKyAgICByZXR1cm4gKChpIDw8IDEpID4+IDI0KSAtIDEyNzsKK30KKworaW50MzJfdCBtYW50aXNzYShHTGZsb2F0IHYpIHsKKyAgICB1bmlvbiB7CisgICAgICAgIGZsb2F0ICAgIGY7CisgICAgICAgIHVpbnQzMl90IGk7CisgICAgfTsKKyAgICBmID0gdjsKKyAgICBpZiAoIShpJjB4N0Y4MDAwMDApKSByZXR1cm4gMDsKKyAgICBjb25zdCBpbnQgcyA9IGkgPj4gMzE7CisgICAgaSB8PSAoMUw8PDIzKTsKKyAgICBpICY9IH4weEZGMDAwMDAwOworICAgIHJldHVybiBzID8gLWkgOiBpOworfQorCitHTGZsb2F0IGNsYW1wVG9aZXJvZihHTGZsb2F0IHYpIHsKKyNpZiBERUJVR19VU0VfRkxPQVRTCisgICAgcmV0dXJuIHY8MCA/IDAgOiAodj4xID8gMSA6IHYpOworI2Vsc2UKKyAgICB1bmlvbiB7CisgICAgICAgIGZsb2F0ICAgICAgIGY7CisgICAgICAgIGludDMyX3QgICAgIGk7CisgICAgfTsKKyAgICBmID0gdjsKKyAgICBpICY9IH4oaT4+MzEpOworICAgIHJldHVybiBmOworI2VuZGlmCit9CisKK0dMZmxvYXQgcmVjaXByb2NhbGYoR0xmbG9hdCB2KSB7CisgICAgLy8gWFhYOiBkbyBiZXR0ZXIKKyAgICByZXR1cm4gMS4wZiAvIHY7Cit9CisKK0dMZmxvYXQgcnNxcnRmKEdMZmxvYXQgdikgeworICAgIC8vIFhYWDogZG8gYmV0dGVyCisgICAgcmV0dXJuIDEuMGYgLyBzcXJ0Zih2KTsKK30KKworR0xmbG9hdCBzcXJmKEdMZmxvYXQgdikgeworICAgIC8vIFhYWDogZG8gYmV0dGVyCisgICAgcmV0dXJuIHYqdjsKK30KKworR0xmbG9hdCBhZGRFeHBmKEdMZmxvYXQgdiwgaW50IGUpIHsKKyAgICB1bmlvbiB7CisgICAgICAgIGZsb2F0ICAgICAgIGY7CisgICAgICAgIGludDMyX3QgICAgIGk7CisgICAgfTsKKyAgICBmID0gdjsKKyAgICBpZiAoaTw8MSkgeyAvLyBYWFg6IGRlYWwgd2l0aCBvdmVyL3VuZGVyZmxvdwkKKyAgICAgICAgaSArPSBpbnQzMl90KGUpPDwyMzsKKyAgICB9CisgICAgcmV0dXJuIGY7Cit9CisKK0dMZmxvYXQgbXVsMmYoR0xmbG9hdCB2KSB7CisjaWYgREVCVUdfVVNFX0ZMT0FUUworICAgIHJldHVybiB2KjI7CisjZWxzZQorICAgIHJldHVybiBhZGRFeHBmKHYsIDEpOworI2VuZGlmCit9CisKK0dMZmxvYXQgZGl2MmYoR0xmbG9hdCB2KSB7CisjaWYgREVCVUdfVVNFX0ZMT0FUUworICAgIHJldHVybiB2KjAuNWY7CisjZWxzZQorICAgIHJldHVybiBhZGRFeHBmKHYsIC0xKTsKKyNlbmRpZgorfQorCitHTGZsb2F0ICBhYnNmKEdMZmxvYXQgdikgeworI2lmIERFQlVHX1VTRV9GTE9BVFMKKyAgICByZXR1cm4gdjwwID8gLXYgOiB2OworI2Vsc2UKKyAgICB1bmlvbiB7CisgICAgICAgIGZsb2F0ICAgICAgIGY7CisgICAgICAgIGludDMyX3QgICAgIGk7CisgICAgfTsKKyAgICBmID0gdjsKKyAgICBpICY9IH4weDgwMDAwMDAwOworICAgIHJldHVybiBmOworI2VuZGlmCit9CisKK307ICAvLyBuYW1lc3BhY2UgZ2wKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfT1BFTkdMRVNfRlBfSAorCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL2l0ZXJhdG9ycy5TIGIvb3BlbmdsL2xpYmFnbC9pdGVyYXRvcnMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWYyOTM3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2xpYmFnbC9pdGVyYXRvcnMuUwpAQCAtMCwwICsxLDg4IEBACisvKiBsaWJzL29wZW5nbGVzL2l0ZXJhdG9ycy5TCisqKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworCisgICAgLnRleHQKKyAgICAuYWxpZ24KKyAgICAuYXJtCisgICAgCisgICAgLmdsb2JhbCBpdGVyYXRvcnMwMDMyCisKKy8qCisgKiBpdGVyYXRvcnMwMDMyCisgKgorICogTVVTVCBCRSBDQUxMRUQgRlJPTSBBUk0gQ09ERQorICoKKyAqIHIwOiBjb25zdCBjb21wdXRlX2l0ZXJhdG9yc190KiAodGhpcykKKyAqICAgICAgcjAgKyAwOiBtX2R4MDEgCisgKiAgICAgIHIwICsgNDogbV9keTEwCisgKiAgICAgIHIwICsgODogbV9keDIwCisgKiAgICAgIHIwICsxMjogbV9keTAyCisgKiAgICAgIHIwICsxNjogbV94MAorICogICAgICByMCArMjA6IG1feTAKKyAqICAgICAgcjAgKzI0OiBtX2FyZWEKKyAqCQlyMCArMjg6IG1fc2NhbGUKKyAqCQlyMCArMjk6IG1fYXJlYV9zY2FsZTsKKyAqIHIxOiBpbnQzMl90KiAob3V0KQorICogICAgICByMSArIDA6IGMKKyAqICAgICAgcjEgKyA0OiBkY2R4CisgKiAgICAgIHIxICsgODogZGNkeQorICogICByMjogYzAKKyAqICAgcjM6IGMxCisgKiBbc3BdOiBjMgorICovCisgCitpdGVyYXRvcnMwMDMyOgorICAgICAgICBzdG1mZAlzcCEsIHtyNCwgcjUsIHI2LCByNywgcjgsIGxyfQorICAgICAgICBsZHIgICAgIHI0LCBbc3AsICM0KjZdCisKKyAgICAgICAgbGRyYiAgICByMTIsIFtyMCwgIzI5XQorICAgICAgICBzdWIgICAgIHIzLCByMywgcjIKKyAgICAgICAgc3ViICAgICByNCwgcjQsIHIyCisgICAgICAgIHN1YiAgICAgcjEyLCByMTIsICMxNgorICAgICAgICBtb3YgICAgIHIzLCByMywgYXNyIHIxMgorICAgICAgICBtb3YgICAgIHI0LCByNCwgYXNyIHIxMgorICAgICAgICAKKyAgICAgICAgbGRyICAgICByNSwgW3IwLCAjMF0KKyAgICAgICAgbGRyICAgICByMTIsIFtyMCwgIzRdCisgICAgICAgIHNtdWxsICAgcjgsIGxyLCByNCwgcjUKKyAgICAgICAgbGRyICAgICByNSwgW3IwLCAjOF0KKyAgICAgICAgc211bGwgICByNiwgcjcsIHI0LCByMTIKKyAgICAgICAgbGRyICAgICByMTIsIFtyMCwgIzEyXQorICAgICAgICBzbWxhbCAgIHI4LCBsciwgcjMsIHI1CisgICAgICAgIHNtbGFsICAgcjYsIHI3LCByMywgcjEyCisKKyAgICAgICAgbGRyICAgICByMywgW3IwLCAjMTZdICAgICAgICAvLyBtX3gwCisgICAgICAgIGxkciAgICAgcjQsIFtyMCwgIzIwXSAgICAgICAgLy8gbV94MQorICAgICAgICAKKyAgICAgICAgc3RyICAgICByNiwgW3IxLCAjNF0KKyAgICAgICAgc3RyICAgICByOCwgW3IxLCAjOF0KKworICAgICAgICB1bXVsbCAgIHI2LCByNSwgcjMsIHI2CisgICAgICAgIHVtdWxsICAgcjgsIHIwLCByNCwgcjgKKyAgICAgICAgbWxhICAgICByNywgcjMsIHI3LCByNQorICAgICAgICBtbGEgICAgIGxyLCByNCwgbHIsIHIwCisgICAgICAgIGFkZHMgICAgcjYsIHI2LCByOAorICAgICAgICBhZGMgICAgIHI3LCByNywgbHIKKworICAgICAgICBtb3ZzICAgIHI2LCByNiwgbHNyICM0CisgICAgICAgIGFkYyAgICAgcjYsIHI2LCByNywgbHNsICMyOAorICAgICAgICByc2IgICAgIHI2LCByNiwgcjIsIGxzbCAjMTYKKyAgICAgICAgc3RyICAgICByNiwgW3IxLCAjMF0KKworICAgICAgICBsZG1mZAlzcCEsIHtyNCwgcjUsIHI2LCByNywgcjgsIHBjfQorCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL2xpZ2h0LmNwcCBiL29wZW5nbC9saWJhZ2wvbGlnaHQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YzQxZDAKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvbGliYWdsL2xpZ2h0LmNwcApAQCAtMCwwICsxLDg1MiBAQAorLyogbGlicy9vcGVuZ2xlcy9saWdodC5jcHAKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjb250ZXh0LmgiCisjaW5jbHVkZSAiZnAuaCIKKyNpbmNsdWRlICJsaWdodC5oIgorI2luY2x1ZGUgInN0YXRlLmgiCisjaW5jbHVkZSAibWF0cml4LmgiCisKKworI2lmIGRlZmluZWQoX19hcm1fXykgJiYgZGVmaW5lZChfX3RodW1iX18pCisjd2FybmluZyAibGlnaHQuY3BwIHNob3VsZCBub3QgYmUgY29tcGlsZWQgaW4gdGh1bWIgb24gQVJNLiIKKyNlbmRpZgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgaW52YWxpZGF0ZV9saWdodGluZyhvZ2xlc19jb250ZXh0X3QqIGMpOworc3RhdGljIHZvaWQgbGlnaHRWZXJ0ZXhWYWxpZGF0ZShvZ2xlc19jb250ZXh0X3QqIGMsIHZlcnRleF90KiB2KTsKK3N0YXRpYyB2b2lkIGxpZ2h0VmVydGV4Tm9wKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYpOworc3RhdGljIHZvaWQgbGlnaHRWZXJ0ZXgob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogdik7CitzdGF0aWMgdm9pZCBsaWdodFZlcnRleE1hdGVyaWFsKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYpOworCitzdGF0aWMgaW5saW5lIHZvaWQgdnNjYWxlMyhHTGZpeGVkKiBkLCBjb25zdCBHTGZpeGVkKiBtLCBHTGZpeGVkIHMpOworc3RhdGljIGlubGluZSB2b2lkIHZzdWIzdyhHTGZpeGVkKiBkLCBjb25zdCBHTGZpeGVkKiBhLCBjb25zdCBHTGZpeGVkKiBiKTsKKworc3RhdGljIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSkKK3ZvaWQgdm5vcm0zKEdMZml4ZWQqIGQsIGNvbnN0IEdMZml4ZWQqIGEpOworCitzdGF0aWMgaW5saW5lIHZvaWQgdnNhMyhHTGZpeGVkKiBkLAorICAgIGNvbnN0IEdMZml4ZWQqIG0sIEdMZml4ZWQgcywgY29uc3QgR0xmaXhlZCogYSk7CitzdGF0aWMgaW5saW5lIHZvaWQgdm1sYTMoR0xmaXhlZCogZCwKKyAgICBjb25zdCBHTGZpeGVkKiBtMCwgY29uc3QgR0xmaXhlZCogbTEsIGNvbnN0IEdMZml4ZWQqIGEpOworc3RhdGljIGlubGluZSB2b2lkIHZtdWwzKEdMZml4ZWQqIGQsCisgICAgY29uc3QgR0xmaXhlZCogbTAsIGNvbnN0IEdMZml4ZWQqIG0xKTsKKworc3RhdGljIEdMZml4ZWQgZm9nX2xpbmVhcihvZ2xlc19jb250ZXh0X3QqIGMsIEdMZml4ZWQgeik7CitzdGF0aWMgR0xmaXhlZCBmb2dfZXhwKG9nbGVzX2NvbnRleHRfdCogYywgR0xmaXhlZCB6KTsKK3N0YXRpYyBHTGZpeGVkIGZvZ19leHAyKG9nbGVzX2NvbnRleHRfdCogYywgR0xmaXhlZCB6KTsKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIGluaXRfd2hpdGUodmVjNF90JiBjKSB7CisgICAgYy5yID0gYy5nID0gYy5iID0gYy5hID0gMHgxMDAwMDsKK30KKwordm9pZCBvZ2xlc19pbml0X2xpZ2h0KG9nbGVzX2NvbnRleHRfdCogYykKK3sKKyAgICBmb3IgKHVuc2lnbmVkIGludCBpPTAgOyBpPE9HTEVTX01BWF9MSUdIVFMgOyBpKyspIHsKKyAgICAgICAgYy0+bGlnaHRpbmcubGlnaHRzW2ldLmFtYmllbnQuYSA9IDB4MTAwMDA7CisgICAgICAgIGMtPmxpZ2h0aW5nLmxpZ2h0c1tpXS5wb3NpdGlvbi56ID0gMHgxMDAwMDsKKyAgICAgICAgYy0+bGlnaHRpbmcubGlnaHRzW2ldLnNwb3REaXIueiA9IC0weDEwMDAwOworICAgICAgICBjLT5saWdodGluZy5saWdodHNbaV0uc3BvdEN1dG9mZiA9IGdnbEludFRvRml4ZWQoMTgwKTsKKyAgICAgICAgYy0+bGlnaHRpbmcubGlnaHRzW2ldLmF0dGVudWF0aW9uWzBdID0gMHgxMDAwMDsKKyAgICB9CisgICAgaW5pdF93aGl0ZShjLT5saWdodGluZy5saWdodHNbMF0uZGlmZnVzZSk7CisgICAgaW5pdF93aGl0ZShjLT5saWdodGluZy5saWdodHNbMF0uc3BlY3VsYXIpOworCisgICAgYy0+bGlnaHRpbmcuZnJvbnQuYW1iaWVudC5yID0KKyAgICBjLT5saWdodGluZy5mcm9udC5hbWJpZW50LmcgPQorICAgIGMtPmxpZ2h0aW5nLmZyb250LmFtYmllbnQuYiA9IGdnbEZsb2F0VG9GaXhlZCgwLjJmKTsKKyAgICBjLT5saWdodGluZy5mcm9udC5hbWJpZW50LmEgPSAweDEwMDAwOworICAgIGMtPmxpZ2h0aW5nLmZyb250LmRpZmZ1c2UuciA9CisgICAgYy0+bGlnaHRpbmcuZnJvbnQuZGlmZnVzZS5nID0KKyAgICBjLT5saWdodGluZy5mcm9udC5kaWZmdXNlLmIgPSBnZ2xGbG9hdFRvRml4ZWQoMC44Zik7CisgICAgYy0+bGlnaHRpbmcuZnJvbnQuZGlmZnVzZS5hID0gMHgxMDAwMDsKKyAgICBjLT5saWdodGluZy5mcm9udC5zcGVjdWxhci5hID0gMHgxMDAwMDsKKyAgICBjLT5saWdodGluZy5mcm9udC5lbWlzc2lvbi5hID0gMHgxMDAwMDsKKworICAgIGMtPmxpZ2h0aW5nLmxpZ2h0TW9kZWwuYW1iaWVudC5yID0KKyAgICBjLT5saWdodGluZy5saWdodE1vZGVsLmFtYmllbnQuZyA9CisgICAgYy0+bGlnaHRpbmcubGlnaHRNb2RlbC5hbWJpZW50LmIgPSBnZ2xGbG9hdFRvRml4ZWQoMC4yZik7CisgICAgYy0+bGlnaHRpbmcubGlnaHRNb2RlbC5hbWJpZW50LmEgPSAweDEwMDAwOworCisgICAgYy0+bGlnaHRpbmcuY29sb3JNYXRlcmlhbC5mYWNlID0gR0xfRlJPTlRfQU5EX0JBQ0s7CisgICAgYy0+bGlnaHRpbmcuY29sb3JNYXRlcmlhbC5tb2RlID0gR0xfQU1CSUVOVF9BTkRfRElGRlVTRTsKKworICAgIGMtPmZvZy5tb2RlID0gR0xfRVhQOworICAgIGMtPmZvZy5mb2cgPSBmb2dfZXhwOworICAgIGMtPmZvZy5kZW5zaXR5ID0gMHgxMDAwMDsKKyAgICBjLT5mb2cuZW5kID0gMHgxMDAwMDsKKyAgICBjLT5mb2cuaW52RW5kTWludXNTdGFydCA9IDB4MTAwMDA7CisKKyAgICBpbnZhbGlkYXRlX2xpZ2h0aW5nKGMpOworICAgICAgIAorICAgIGMtPnJhc3Rlcml6ZXIucHJvY3Muc2hhZGVNb2RlbChjLCBHTF9TTU9PVEgpOworICAgIGMtPmxpZ2h0aW5nLnNoYWRlTW9kZWwgPSBHTF9TTU9PVEg7Cit9CisKK3ZvaWQgb2dsZXNfdW5pbml0X2xpZ2h0KG9nbGVzX2NvbnRleHRfdCogYykKK3sKK30KKworc3RhdGljIGlubGluZSBpbnQzMl90IGNsYW1wRihHTGZpeGVkIGYpIENPTlNUOworaW50MzJfdCBjbGFtcEYoR0xmaXhlZCBmKSB7CisgICAgZiA9IChmICYgfihmPj4zMSkpOworICAgIGlmIChmID49IDB4MTAwMDApCisgICAgICAgIGYgPSAweDEwMDAwOworICAgIHJldHVybiBmOworfQorCitzdGF0aWMgR0xmaXhlZCBmb2dfbGluZWFyKG9nbGVzX2NvbnRleHRfdCogYywgR0xmaXhlZCB6KSB7CisgICAgcmV0dXJuIGNsYW1wRihnZ2xNdWx4KChjLT5mb2cuZW5kIC0gKCh6PDApPy16OnopKSwgYy0+Zm9nLmludkVuZE1pbnVzU3RhcnQpKTsKK30KKworc3RhdGljIEdMZml4ZWQgZm9nX2V4cChvZ2xlc19jb250ZXh0X3QqIGMsIEdMZml4ZWQgeikgeworICAgIGNvbnN0IGZsb2F0IGUgPSBmaXhlZFRvRmxvYXQoZ2dsTXVseChjLT5mb2cuZGVuc2l0eSwgKCh6PDApPy16OnopKSk7CisgICAgcmV0dXJuIGNsYW1wRihnZ2xGbG9hdFRvRml4ZWQoZmFzdGV4cGYoLWUpKSk7Cit9CisKK3N0YXRpYyBHTGZpeGVkIGZvZ19leHAyKG9nbGVzX2NvbnRleHRfdCogYywgR0xmaXhlZCB6KSB7CisgICAgY29uc3QgZmxvYXQgZSA9IGZpeGVkVG9GbG9hdChnZ2xNdWx4KGMtPmZvZy5kZW5zaXR5LCB6KSk7CisgICAgcmV0dXJuIGNsYW1wRihnZ2xGbG9hdFRvRml4ZWQoZmFzdGV4cGYoLWUqZSkpKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIDAKKyNwcmFnbWEgbWFyayAtCisjcHJhZ21hIG1hcmsgbWF0aCBoZWxwZXJzCisjZW5kaWYKKworc3RhdGljIGlubGluZQordm9pZCB2c2NhbGUzKEdMZml4ZWQqIGQsIGNvbnN0IEdMZml4ZWQqIG0sIEdMZml4ZWQgcykgeworICAgIGRbMF0gPSBnZ2xNdWx4KG1bMF0sIHMpOworICAgIGRbMV0gPSBnZ2xNdWx4KG1bMV0sIHMpOworICAgIGRbMl0gPSBnZ2xNdWx4KG1bMl0sIHMpOworfQorCitzdGF0aWMgaW5saW5lCit2b2lkIHZzYTMoR0xmaXhlZCogZCwgY29uc3QgR0xmaXhlZCogbSwgR0xmaXhlZCBzLCBjb25zdCBHTGZpeGVkKiBhKSB7CisgICAgZFswXSA9IGdnbE11bEFkZHgobVswXSwgcywgYVswXSk7CisgICAgZFsxXSA9IGdnbE11bEFkZHgobVsxXSwgcywgYVsxXSk7CisgICAgZFsyXSA9IGdnbE11bEFkZHgobVsyXSwgcywgYVsyXSk7Cit9CisKK3N0YXRpYyBpbmxpbmUKK3ZvaWQgdnN1YjN3KEdMZml4ZWQqIGQsIGNvbnN0IEdMZml4ZWQqIGEsIGNvbnN0IEdMZml4ZWQqIGIpIHsKKyAgICBjb25zdCBHTGZpeGVkIHdhID0gYVszXTsKKyAgICBjb25zdCBHTGZpeGVkIHdiID0gYlszXTsKKyAgICBpZiAoZ2dsX2xpa2VseSh3YSA9PSB3YikpIHsKKyAgICAgICAgZFswXSA9IGFbMF0gLSBiWzBdOworICAgICAgICBkWzFdID0gYVsxXSAtIGJbMV07CisgICAgICAgIGRbMl0gPSBhWzJdIC0gYlsyXTsKKyAgICB9IGVsc2UgeworICAgICAgICBkWzBdID0gZ2dsTXVsU3VieChhWzBdLCB3YiwgZ2dsTXVseChiWzBdLCB3YSkpOworICAgICAgICBkWzFdID0gZ2dsTXVsU3VieChhWzFdLCB3YiwgZ2dsTXVseChiWzFdLCB3YSkpOworICAgICAgICBkWzJdID0gZ2dsTXVsU3VieChhWzJdLCB3YiwgZ2dsTXVseChiWzJdLCB3YSkpOworICAgIH0KK30KKworc3RhdGljIGlubGluZQordm9pZCB2bWxhMyhHTGZpeGVkKiBkLAorICAgICAgICBjb25zdCBHTGZpeGVkKiBtMCwgY29uc3QgR0xmaXhlZCogbTEsIGNvbnN0IEdMZml4ZWQqIGEpCit7CisgICAgZFswXSA9IGdnbE11bEFkZHgobTBbMF0sIG0xWzBdLCBhWzBdKTsKKyAgICBkWzFdID0gZ2dsTXVsQWRkeChtMFsxXSwgbTFbMV0sIGFbMV0pOworICAgIGRbMl0gPSBnZ2xNdWxBZGR4KG0wWzJdLCBtMVsyXSwgYVsyXSk7Cit9CisKK3N0YXRpYyBpbmxpbmUKK3ZvaWQgdm11bDMoR0xmaXhlZCogZCwgY29uc3QgR0xmaXhlZCogbTAsIGNvbnN0IEdMZml4ZWQqIG0xKSB7CisgICAgZFswXSA9IGdnbE11bHgobTBbMF0sIG0xWzBdKTsKKyAgICBkWzFdID0gZ2dsTXVseChtMFsxXSwgbTFbMV0pOworICAgIGRbMl0gPSBnZ2xNdWx4KG0wWzJdLCBtMVsyXSk7Cit9CisKK3ZvaWQgdm5vcm0zKEdMZml4ZWQqIGQsIGNvbnN0IEdMZml4ZWQqIGEpCit7CisgICAgLy8gd2UgbXVzdCB0YWtlIGNhcmUgb2Ygb3ZlcmZsb3dzIHdoZW4gbm9ybWFsaXppbmcgYSB2ZWN0b3IKKyAgICBHTGZpeGVkIG47CisgICAgaW50MzJfdCB4ID0gYVswXTsgICB4ID0geD49MCA/IHggOiAteDsKKyAgICBpbnQzMl90IHkgPSBhWzFdOyAgIHkgPSB5Pj0wID8geSA6IC15OworICAgIGludDMyX3QgeiA9IGFbMl07ICAgeiA9IHo+PTAgPyB6IDogLXo7CisgICAgaWYgKGdnbF9saWtlbHkoeDw9MHg2ODAwICYmIHk8PTB4NjgwMCAmJiB6PD0gMHg2ODAwKSkgeworICAgICAgICAvLyBpbiB0aGlzIGNhc2UgdGhpcyB3aWxsIGFsbCBmaXQgb24gMzIgYml0cworICAgICAgICBuID0geCp4ICsgeSp5ICsgeip6OworICAgICAgICBuID0gZ2dsU3FydFJlY2lweChuKTsKKyAgICAgICAgbiA8PD0gODsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBoZXJlIG5vcm1eMiBpcyBhdCBsZWFzdCAweDdFQzAwMDAwICg+PjMyID09IDAuNDk1MTE3KQorICAgICAgICBuID0gdnNxdWFyZTMoeCwgeSwgeik7CisgICAgICAgIG4gPSBnZ2xTcXJ0UmVjaXB4KG4pOworICAgIH0KKyAgICB2c2NhbGUzKGQsIGEsIG4pOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgMAorI3ByYWdtYSBtYXJrIC0KKyNwcmFnbWEgbWFyayBsaWdodGluZyBlcXVhdGlvbnMKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIHZvaWQgbGlnaHRfcGlja2VyKG9nbGVzX2NvbnRleHRfdCogYykKK3sKKyAgICBpZiAoZ2dsX2xpa2VseSghYy0+bGlnaHRpbmcuZW5hYmxlKSkgeworICAgICAgICBjLT5saWdodGluZy5saWdodFZlcnRleCA9IGxpZ2h0VmVydGV4Tm9wOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChjLT5saWdodGluZy5jb2xvck1hdGVyaWFsLmVuYWJsZSkgeworICAgICAgICBjLT5saWdodGluZy5saWdodFZlcnRleCA9IGxpZ2h0VmVydGV4TWF0ZXJpYWw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYy0+bGlnaHRpbmcubGlnaHRWZXJ0ZXggPSBsaWdodFZlcnRleDsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB2YWxpZGF0ZV9saWdodF9tdmkob2dsZXNfY29udGV4dF90KiBjKQoreworICAgIHVpbnQzMl90IGVuID0gYy0+bGlnaHRpbmcuZW5hYmxlZExpZ2h0czsKKyAgICB3aGlsZSAoZW4pIHsKKyAgICAgICAgY29uc3QgaW50IGkgPSAzMSAtIGdnbENseihlbik7CisgICAgICAgIGVuICY9IH4oMTw8aSk7CisgICAgICAgIGxpZ2h0X3QmIGwgPSBjLT5saWdodGluZy5saWdodHNbaV07CisgICAgICAgIGMtPnRyYW5zZm9ybXMubXZ1aS5wb2ludDMoJmMtPnRyYW5zZm9ybXMubXZ1aSwKKyAgICAgICAgICAgICAgICAmbC5vYmpQb3NpdGlvbiwgJmwucG9zaXRpb24pOworICAgICAgICB2bm9ybTMobC5ub3JtYWxpemVkT2JqUG9zaXRpb24udiwgbC5vYmpQb3NpdGlvbi52KTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB2YWxpZGF0ZV9saWdodChvZ2xlc19jb250ZXh0X3QqIGMpCit7CisgICAgLy8gaWYgY29sb3JNYXRlcmlhbCBpcyBlbmFibGVkLCB3ZSBnZXQgdGhlIGNvbG9yIGZyb20gdGhlIHZlcnRleAorICAgIGlmICghYy0+bGlnaHRpbmcuY29sb3JNYXRlcmlhbC5lbmFibGUpIHsKKyAgICAgICAgbWF0ZXJpYWxfdCYgbWF0ZXJpYWwgPSBjLT5saWdodGluZy5mcm9udDsKKyAgICAgICAgdWludDMyX3QgZW4gPSBjLT5saWdodGluZy5lbmFibGVkTGlnaHRzOworICAgICAgICB3aGlsZSAoZW4pIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBpID0gMzEgLSBnZ2xDbHooZW4pOworICAgICAgICAgICAgZW4gJj0gfigxPDxpKTsKKyAgICAgICAgICAgIGxpZ2h0X3QmIGwgPSBjLT5saWdodGluZy5saWdodHNbaV07CisgICAgICAgICAgICB2bXVsMyhsLmltcGxpY2l0QW1iaWVudC52LCAgbWF0ZXJpYWwuYW1iaWVudC52LCAgbC5hbWJpZW50LnYpOworICAgICAgICAgICAgdm11bDMobC5pbXBsaWNpdERpZmZ1c2UudiwgIG1hdGVyaWFsLmRpZmZ1c2UudiwgIGwuZGlmZnVzZS52KTsKKyAgICAgICAgICAgIHZtdWwzKGwuaW1wbGljaXRTcGVjdWxhci52LCBtYXRlcmlhbC5zcGVjdWxhci52LCBsLnNwZWN1bGFyLnYpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyB0aGlzIGlzIGp1c3QgYSBmbGFnIHRvIHRlbGwgaWYgd2UgaGF2ZSBhIHNwZWN1bGFyIGNvbXBvbmVudAorICAgICAgICAgICAgbC5pbXBsaWNpdFNwZWN1bGFyLnZbM10gPQorICAgICAgICAgICAgICAgICAgICBsLmltcGxpY2l0U3BlY3VsYXIuciB8CisgICAgICAgICAgICAgICAgICAgIGwuaW1wbGljaXRTcGVjdWxhci5nIHwKKyAgICAgICAgICAgICAgICAgICAgbC5pbXBsaWNpdFNwZWN1bGFyLmI7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGwuckNvbnN0QXR0ZW51YXRpb24gPSAobC5hdHRlbnVhdGlvblsxXSB8IGwuYXR0ZW51YXRpb25bMl0pPT0wOworICAgICAgICAgICAgaWYgKGwuckNvbnN0QXR0ZW51YXRpb24pCisgICAgICAgICAgICAgICAgbC5yQ29uc3RBdHRlbnVhdGlvbiA9IGdnbFJlY2lwRmFzdChsLmF0dGVudWF0aW9uWzBdKTsKKyAgICAgICAgfQorICAgICAgICAvLyBlbWlzc2lvbiBhbmQgYW1iaWVudCBmb3IgdGhlIHdob2xlIHNjZW5lCisgICAgICAgIHZtbGEzKCAgYy0+bGlnaHRpbmcuaW1wbGljaXRTY2VuZUVtaXNzaW9uQW5kQW1iaWVudC52LAorICAgICAgICAgICAgICAgIGMtPmxpZ2h0aW5nLmxpZ2h0TW9kZWwuYW1iaWVudC52LAorICAgICAgICAgICAgICAgIG1hdGVyaWFsLmFtYmllbnQudiwgCisgICAgICAgICAgICAgICAgbWF0ZXJpYWwuZW1pc3Npb24udik7CisgICAgICAgIGMtPmxpZ2h0aW5nLmltcGxpY2l0U2NlbmVFbWlzc2lvbkFuZEFtYmllbnQuYSA9IG1hdGVyaWFsLmRpZmZ1c2UuYTsKKyAgICB9CisgICAgdmFsaWRhdGVfbGlnaHRfbXZpKGMpOworfQorCit2b2lkIGludmFsaWRhdGVfbGlnaHRpbmcob2dsZXNfY29udGV4dF90KiBjKQoreworICAgIC8vIFRPRE86IHBpY2sgbGlnaHRWZXJ0ZXhWYWxpZGF0ZSBvciBsaWdodFZlcnRleFZhbGlkYXRlTVZJCisgICAgLy8gaW5zdGVhZCBvZiBzeXN0ZW1hdGljYWxseSB0aGUgaGVhdmllciBsaWdodFZlcnRleFZhbGlkYXRlKCkKKyAgICBjLT5saWdodGluZy5saWdodFZlcnRleCA9IGxpZ2h0VmVydGV4VmFsaWRhdGU7Cit9CisKK3ZvaWQgb2dsZXNfaW52YWxpZGF0ZV9saWdodGluZ19tdnVpKG9nbGVzX2NvbnRleHRfdCogYykKK3sKKyAgICBpbnZhbGlkYXRlX2xpZ2h0aW5nKGMpOworfQorCit2b2lkIGxpZ2h0VmVydGV4Tm9wKG9nbGVzX2NvbnRleHRfdCosIHZlcnRleF90KiB2KQoreworICAgIC8vIHdlIHNob3VsZCBuZXZlciBlbmQtdXAgaGVyZQorfQorCit2b2lkIGxpZ2h0VmVydGV4VmFsaWRhdGVNVkkob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogdikKK3sKKyAgICB2YWxpZGF0ZV9saWdodF9tdmkoYyk7CisgICAgbGlnaHRfcGlja2VyKGMpOworICAgIGMtPmxpZ2h0aW5nLmxpZ2h0VmVydGV4KGMsIHYpOworfQorCit2b2lkIGxpZ2h0VmVydGV4VmFsaWRhdGUob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogdikKK3sKKyAgICB2YWxpZGF0ZV9saWdodChjKTsKKyAgICBsaWdodF9waWNrZXIoYyk7CisgICAgYy0+bGlnaHRpbmcubGlnaHRWZXJ0ZXgoYywgdik7Cit9CisKK3ZvaWQgbGlnaHRWZXJ0ZXhNYXRlcmlhbChvZ2xlc19jb250ZXh0X3QqIGMsIHZlcnRleF90KiB2KQoreworICAgIC8vIGZldGNoIHRoZSBtYXRlcmlhbCBjb2xvcgorICAgIGNvbnN0IEdMdm9pZCogY3AgPSBjLT5hcnJheXMuY29sb3IuZWxlbWVudCgKKyAgICAgICAgICAgIHYtPmluZGV4ICYgdmVydGV4X2NhY2hlX3Q6OklOREVYX01BU0spOworICAgIGMtPmFycmF5cy5jb2xvci5mZXRjaChjLCB2LT5jb2xvci52LCBjcCk7CisKKyAgICAvLyBhY3F1aXJlIHRoZSBjb2xvci1tYXRlcmlhbCBmcm9tIHRoZSB2ZXJ0ZXgKKyAgICBtYXRlcmlhbF90JiBtYXRlcmlhbCA9IGMtPmxpZ2h0aW5nLmZyb250OworICAgIG1hdGVyaWFsLmFtYmllbnQgPQorICAgIG1hdGVyaWFsLmRpZmZ1c2UgPSB2LT5jb2xvcjsKKyAgICAvLyBpbXBsaWNpdCBhcmd1bWVudHMgbmVlZCB0byBiZSBjb21wdXRlZCBwZXIvdmVydGV4CisgICAgdWludDMyX3QgZW4gPSBjLT5saWdodGluZy5lbmFibGVkTGlnaHRzOworICAgIHdoaWxlIChlbikgeworICAgICAgICBjb25zdCBpbnQgaSA9IDMxIC0gZ2dsQ2x6KGVuKTsKKyAgICAgICAgZW4gJj0gfigxPDxpKTsKKyAgICAgICAgbGlnaHRfdCYgbCA9IGMtPmxpZ2h0aW5nLmxpZ2h0c1tpXTsKKyAgICAgICAgdm11bDMobC5pbXBsaWNpdEFtYmllbnQudiwgIG1hdGVyaWFsLmFtYmllbnQudiwgIGwuYW1iaWVudC52KTsKKyAgICAgICAgdm11bDMobC5pbXBsaWNpdERpZmZ1c2UudiwgIG1hdGVyaWFsLmRpZmZ1c2UudiwgIGwuZGlmZnVzZS52KTsKKyAgICAgICAgdm11bDMobC5pbXBsaWNpdFNwZWN1bGFyLnYsIG1hdGVyaWFsLnNwZWN1bGFyLnYsIGwuc3BlY3VsYXIudik7CisgICAgfQorICAgIC8vIGVtaXNzaW9uIGFuZCBhbWJpZW50IGZvciB0aGUgd2hvbGUgc2NlbmUKKyAgICB2bWxhMyggIGMtPmxpZ2h0aW5nLmltcGxpY2l0U2NlbmVFbWlzc2lvbkFuZEFtYmllbnQudiwKKyAgICAgICAgICAgIGMtPmxpZ2h0aW5nLmxpZ2h0TW9kZWwuYW1iaWVudC52LAorICAgICAgICAgICAgbWF0ZXJpYWwuYW1iaWVudC52LCAKKyAgICAgICAgICAgIG1hdGVyaWFsLmVtaXNzaW9uLnYpOworICAgIGMtPmxpZ2h0aW5nLmltcGxpY2l0U2NlbmVFbWlzc2lvbkFuZEFtYmllbnQuYSA9IG1hdGVyaWFsLmRpZmZ1c2UuYTsKKworICAgIC8vIG5vdyB3ZSBjYW4gbGlnaHQgb3VyIHZlcnRleCBhcyB1c3VhbAorICAgIGxpZ2h0VmVydGV4KGMsIHYpOworfQorCit2b2lkIGxpZ2h0VmVydGV4KG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYpCit7CisgICAgLy8gZW1pc3Npb24gYW5kIGFtYmllbnQgZm9yIHRoZSB3aG9sZSBzY2VuZQorICAgIHZlYzRfdCByID0gYy0+bGlnaHRpbmcuaW1wbGljaXRTY2VuZUVtaXNzaW9uQW5kQW1iaWVudDsKKworICAgIHVpbnQzMl90IGVuID0gYy0+bGlnaHRpbmcuZW5hYmxlZExpZ2h0czsKKyAgICBpZiAoZ2dsX2xpa2VseShlbikpIHsKKyAgICAgICAgLy8gc2luY2Ugd2UgZG8gdGhlIGxpZ2h0aW5nIGluIG9iamVjdC1zcGFjZSwgd2UgZG9uJ3QgbmVlZCB0bworICAgICAgICAvLyB0cmFuc2Zvcm0gZWFjaCBub3JtYWwuIEhvd2V2ZXIsIHdlIG1pZ2h0IHN0aWxsIGhhdmUgdG8gbm9ybWFsaXplCisgICAgICAgIC8vIGl0IGlmIEdMX05PUk1BTElaRSBpcyBlbmFibGVkLgorICAgICAgICB2ZWM0X3QgbjsKKyAgICAgICAgYy0+YXJyYXlzLm5vcm1hbC5mZXRjaChjLCBuLnYsCisgICAgICAgICAgICBjLT5hcnJheXMubm9ybWFsLmVsZW1lbnQodi0+aW5kZXggJiB2ZXJ0ZXhfY2FjaGVfdDo6SU5ERVhfTUFTSykpOworICAgICAgICBpZiAoYy0+dHJhbnNmb3Jtcy5yZXNjYWxlTm9ybWFscyA9PSBHTF9OT1JNQUxJWkUpCisgICAgICAgICAgICB2bm9ybTMobi52LCBuLnYpOworCisgICAgICAgIGNvbnN0IG1hdGVyaWFsX3QmIG1hdGVyaWFsID0gYy0+bGlnaHRpbmcuZnJvbnQ7CisgICAgICAgIGNvbnN0IGludCB0d29TaWRlID0gYy0+bGlnaHRpbmcubGlnaHRNb2RlbC50d29TaWRlOworCisgICAgICAgIHdoaWxlIChlbikgeworICAgICAgICAgICAgY29uc3QgaW50IGkgPSAzMSAtIGdnbENseihlbik7CisgICAgICAgICAgICBlbiAmPSB+KDE8PGkpOworICAgICAgICAgICAgY29uc3QgbGlnaHRfdCYgbCA9IGMtPmxpZ2h0aW5nLmxpZ2h0c1tpXTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgdmVjNF90IGQsIHQ7CisgICAgICAgICAgICBHTGZpeGVkIHM7CisgICAgICAgICAgICBHTGZpeGVkIHNxRGlzdCA9IDB4MTAwMDA7CisKKyAgICAgICAgICAgIC8vIGNvbXB1dGUgdmVydGV4LXRvLWxpZ2h0IHZlY3RvcgorICAgICAgICAgICAgaWYgKGdnbF91bmxpa2VseShsLnBvc2l0aW9uLncpKSB7CisgICAgICAgICAgICAgICAgdnN1YjN3KGQudiwgbC5vYmpQb3NpdGlvbi52LCB2LT5vYmoudik7CisgICAgICAgICAgICAgICAgc3FEaXN0ID0gZG90MyhkLnYsIGQudik7CisgICAgICAgICAgICAgICAgdnNjYWxlMyhkLnYsIGQudiwgZ2dsU3FydFJlY2lweChzcURpc3QpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogYXZvaWQgY29weSBoZXJlCisgICAgICAgICAgICAgICAgZCA9IGwubm9ybWFsaXplZE9ialBvc2l0aW9uOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBhbWJpZW50ICYgZGlmZnVzZQorICAgICAgICAgICAgcyA9IGRvdDMobi52LCBkLnYpOworICAgICAgICAgICAgcyA9IChzPDApID8gKHR3b1NpZGU/KC1zKTowKSA6IHM7CisgICAgICAgICAgICB2c2EzKHQudiwgbC5pbXBsaWNpdERpZmZ1c2UudiwgcywgbC5pbXBsaWNpdEFtYmllbnQudik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIHNwZWN1bGFyCisgICAgICAgICAgICBpZiAoZ2dsX3VubGlrZWx5KHMgJiYgbC5pbXBsaWNpdFNwZWN1bGFyLnZbM10pKSB7CisgICAgICAgICAgICAgICAgdmVjNF90IGg7CisgICAgICAgICAgICAgICAgaC54ID0gZC54OworICAgICAgICAgICAgICAgIGgueSA9IGQueTsKKyAgICAgICAgICAgICAgICBoLnogPSBkLnogKyAweDEwMDAwOworICAgICAgICAgICAgICAgIHZub3JtMyhoLnYsIGgudik7CisgICAgICAgICAgICAgICAgcyA9IGRvdDMobi52LCBoLnYpOworICAgICAgICAgICAgICAgIHMgPSAoczwwKSA/ICh0d29TaWRlPygtcyk6MCkgOiBzOworICAgICAgICAgICAgICAgIGlmIChzID4gMCkgeworICAgICAgICAgICAgICAgICAgICBzID0gZ2dsUG93eChzLCBtYXRlcmlhbC5zaGluaW5lc3MpOworICAgICAgICAgICAgICAgICAgICB2c2EzKHQudiwgbC5pbXBsaWNpdFNwZWN1bGFyLnYsIHMsIHQudik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzcG90CisgICAgICAgICAgICBpZiAoZ2dsX3VubGlrZWx5KGwuc3BvdEN1dG9mZiAhPSBnZ2xJbnRUb0ZpeGVkKDE4MCkpKSB7CisgICAgICAgICAgICAgICAgR0xmaXhlZCBzcG90QXR0ID0gLWRvdDMobC5ub3JtYWxpemVkU3BvdERpci52LCBkLnYpOworICAgICAgICAgICAgICAgIGlmIChzcG90QXR0ID49IGwuc3BvdEN1dG9mZkNvc2luZSkgeworICAgICAgICAgICAgICAgICAgICB2c2NhbGUzKHQudiwgdC52LCBnZ2xQb3d4KHNwb3RBdHQsIGwuc3BvdEV4cCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gYXR0ZW51YXRpb24KKyAgICAgICAgICAgIGlmIChnZ2xfdW5saWtlbHkobC5wb3NpdGlvbi53KSkgeworICAgICAgICAgICAgICAgIGlmIChsLnJDb25zdEF0dGVudWF0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIHMgPSBsLnJDb25zdEF0dGVudWF0aW9uOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHMgPSBnZ2xNdWxBZGR4KHNxRGlzdCwgbC5hdHRlbnVhdGlvblsyXSwgbC5hdHRlbnVhdGlvblswXSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChsLmF0dGVudWF0aW9uWzFdKQorICAgICAgICAgICAgICAgICAgICAgICAgcyA9IGdnbE11bEFkZHgoZ2dsU3FydHgoc3FEaXN0KSwgbC5hdHRlbnVhdGlvblsxXSwgcyk7CisgICAgICAgICAgICAgICAgICAgIHMgPSBnZ2xSZWNpcEZhc3Qocyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZzY2FsZTModC52LCB0LnYsIHMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByLnIgKz0gdC5yOworICAgICAgICAgICAgci5nICs9IHQuZzsKKyAgICAgICAgICAgIHIuYiArPSB0LmI7CisgICAgICAgIH0KKyAgICB9CisgICAgdi0+Y29sb3IuciA9IGdnbENsYW1weChyLnIpOworICAgIHYtPmNvbG9yLmcgPSBnZ2xDbGFtcHgoci5nKTsKKyAgICB2LT5jb2xvci5iID0gZ2dsQ2xhbXB4KHIuYik7CisgICAgdi0+Y29sb3IuYSA9IGdnbENsYW1weChyLmEpOworICAgIHYtPmZsYWdzIHw9IHZlcnRleF90OjpMSVQ7Cit9CisKK3N0YXRpYyB2b2lkIGxpZ2h0TW9kZWx4KEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSwgb2dsZXNfY29udGV4dF90KiBjKQoreworICAgIGlmIChnZ2xfdW5saWtlbHkocG5hbWUgIT0gR0xfTElHSFRfTU9ERUxfVFdPX1NJREUpKSB7CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYy0+bGlnaHRpbmcubGlnaHRNb2RlbC50d29TaWRlID0gcGFyYW0gPyBHTF9UUlVFIDogR0xfRkFMU0U7CisgICAgaW52YWxpZGF0ZV9saWdodGluZyhjKTsKK30KKworc3RhdGljIHZvaWQgbGlnaHR4KEdMZW51bSBpLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0sIG9nbGVzX2NvbnRleHRfdCogYykKK3sKKyAgICBpZiAoZ2dsX3VubGlrZWx5KHVpbnQzMl90KGktR0xfTElHSFQwKSA+PSBPR0xFU19NQVhfTElHSFRTKSkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbGlnaHRfdCYgbGlnaHQgPSBjLT5saWdodGluZy5saWdodHNbaS1HTF9MSUdIVDBdOworICAgIGNvbnN0IEdMZml4ZWQga0RlZ1RvUmFkID0gR0xmaXhlZCgoTV9QSSAqIGdnbEludFRvRml4ZWQoMSkpIC8gMTgwLjBmKTsKKyAgICBzd2l0Y2ggKHBuYW1lKSB7CisgICAgY2FzZSBHTF9TUE9UX0VYUE9ORU5UOgorICAgICAgICBpZiAoR0dMZml4ZWQocGFyYW0pID49IGdnbEludFRvRml4ZWQoMTI4KSkgeworICAgICAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbGlnaHQuc3BvdEV4cCA9IHBhcmFtOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX1NQT1RfQ1VUT0ZGOgorICAgICAgICBpZiAocGFyYW0hPWdnbEludFRvRml4ZWQoMTgwKSAmJiBHR0xmaXhlZChwYXJhbSk+PWdnbEludFRvRml4ZWQoOTApKSB7CisgICAgICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBsaWdodC5zcG90Q3V0b2ZmID0gcGFyYW07CisgICAgICAgIGxpZ2h0LnNwb3RDdXRvZmZDb3NpbmUgPSAKKyAgICAgICAgICAgICAgICBnZ2xGbG9hdFRvRml4ZWQoY29zaW5lZigoTV9QSS8oMTgwLjBmKjY1NTM2LjBmKSkqcGFyYW0pKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9DT05TVEFOVF9BVFRFTlVBVElPTjoKKyAgICAgICAgaWYgKHBhcmFtIDwgMCkgeworICAgICAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbGlnaHQuYXR0ZW51YXRpb25bMF0gPSBwYXJhbTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9MSU5FQVJfQVRURU5VQVRJT046CisgICAgICAgIGlmIChwYXJhbSA8IDApIHsKKyAgICAgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGxpZ2h0LmF0dGVudWF0aW9uWzFdID0gcGFyYW07CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfUVVBRFJBVElDX0FUVEVOVUFUSU9OOgorICAgICAgICBpZiAocGFyYW0gPCAwKSB7CisgICAgICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBsaWdodC5hdHRlbnVhdGlvblsyXSA9IHBhcmFtOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGludmFsaWRhdGVfbGlnaHRpbmcoYyk7Cit9CisKK3N0YXRpYyB2b2lkIGxpZ2h0eHYoR0xlbnVtIGksIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zLCBvZ2xlc19jb250ZXh0X3QqIGMpCit7CisgICAgaWYgKGdnbF91bmxpa2VseSh1aW50MzJfdChpLUdMX0xJR0hUMCkgPj0gT0dMRVNfTUFYX0xJR0hUUykpIHsKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEdMZml4ZWQqIHdoYXQ7CisgICAgbGlnaHRfdCYgbGlnaHQgPSBjLT5saWdodGluZy5saWdodHNbaS1HTF9MSUdIVDBdOworICAgIHN3aXRjaCAocG5hbWUpIHsKKyAgICBjYXNlIEdMX0FNQklFTlQ6CisgICAgICAgIHdoYXQgPSBsaWdodC5hbWJpZW50LnY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfRElGRlVTRToKKyAgICAgICAgd2hhdCA9IGxpZ2h0LmRpZmZ1c2UudjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9TUEVDVUxBUjoKKyAgICAgICAgd2hhdCA9IGxpZ2h0LnNwZWN1bGFyLnY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfUE9TSVRJT046IHsKKyAgICAgICAgb2dsZXNfdmFsaWRhdGVfdHJhbnNmb3JtKGMsIHRyYW5zZm9ybV9zdGF0ZV90OjpNT0RFTFZJRVcpOworICAgICAgICB0cmFuc2Zvcm1fdCYgbXYgPSBjLT50cmFuc2Zvcm1zLm1vZGVsdmlldy50cmFuc2Zvcm07CisgICAgICAgIG1lbWNweShsaWdodC5wb3NpdGlvbi52LCBwYXJhbXMsIHNpemVvZihsaWdodC5wb3NpdGlvbi52KSk7CisgICAgICAgIG12LnBvaW50NCgmbXYsICZsaWdodC5wb3NpdGlvbiwgJmxpZ2h0LnBvc2l0aW9uKTsKKyAgICAgICAgaW52YWxpZGF0ZV9saWdodGluZyhjKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYXNlIEdMX1NQT1RfRElSRUNUSU9OOiB7CisgICAgICAgIG9nbGVzX3ZhbGlkYXRlX3RyYW5zZm9ybShjLCB0cmFuc2Zvcm1fc3RhdGVfdDo6TVZVSSk7CisgICAgICAgIHRyYW5zZm9ybV90JiBtdnVpID0gYy0+dHJhbnNmb3Jtcy5tdnVpOworICAgICAgICBtdnVpLnBvaW50MygmbXZ1aSwgJmxpZ2h0LnNwb3REaXIsICh2ZWM0X3QqKXBhcmFtcyk7CisgICAgICAgIHZub3JtMyhsaWdodC5ub3JtYWxpemVkU3BvdERpci52LCBsaWdodC5zcG90RGlyLnYpOworICAgICAgICBpbnZhbGlkYXRlX2xpZ2h0aW5nKGMpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICAgIGxpZ2h0eChpLCBwbmFtZSwgcGFyYW1zWzBdLCBjKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB3aGF0WzBdID0gcGFyYW1zWzBdOworICAgIHdoYXRbMV0gPSBwYXJhbXNbMV07CisgICAgd2hhdFsyXSA9IHBhcmFtc1syXTsKKyAgICB3aGF0WzNdID0gcGFyYW1zWzNdOworICAgIGludmFsaWRhdGVfbGlnaHRpbmcoYyk7Cit9CisKK3N0YXRpYyB2b2lkIG1hdGVyaWFseChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtLCBvZ2xlc19jb250ZXh0X3QqIGMpCit7CisgICAgaWYgKGdnbF91bmxpa2VseShmYWNlICE9IEdMX0ZST05UX0FORF9CQUNLKSkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChnZ2xfdW5saWtlbHkocG5hbWUgIT0gR0xfU0hJTklORVNTKSkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGMtPmxpZ2h0aW5nLmZyb250LnNoaW5pbmVzcyA9IHBhcmFtOworICAgIGludmFsaWRhdGVfbGlnaHRpbmcoYyk7Cit9CisKK3N0YXRpYyB2b2lkIGZvZ3goR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtLCBvZ2xlc19jb250ZXh0X3QqIGMpCit7CisgICAgc3dpdGNoIChwbmFtZSkgeworICAgIGNhc2UgR0xfRk9HX0RFTlNJVFk6CisgICAgICAgIGlmIChwYXJhbSA+PSAwKSB7CisgICAgICAgICAgICBjLT5mb2cuZGVuc2l0eSA9IHBhcmFtOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfRk9HX1NUQVJUOgorICAgICAgICBjLT5mb2cuc3RhcnQgPSBwYXJhbTsKKyAgICAgICAgYy0+Zm9nLmludkVuZE1pbnVzU3RhcnQgPSBnZ2xSZWNpcChjLT5mb2cuZW5kIC0gYy0+Zm9nLnN0YXJ0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9GT0dfRU5EOgorICAgICAgICBjLT5mb2cuZW5kID0gcGFyYW07CisgICAgICAgIGMtPmZvZy5pbnZFbmRNaW51c1N0YXJ0ID0gZ2dsUmVjaXAoYy0+Zm9nLmVuZCAtIGMtPmZvZy5zdGFydCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfRk9HX01PREU6CisgICAgICAgIHN3aXRjaCAocGFyYW0pIHsKKyAgICAgICAgY2FzZSBHTF9MSU5FQVI6CisgICAgICAgICAgICBjLT5mb2cubW9kZSA9IHBhcmFtOworICAgICAgICAgICAgYy0+Zm9nLmZvZyA9IGZvZ19saW5lYXI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHTF9FWFA6CisgICAgICAgICAgICBjLT5mb2cubW9kZSA9IHBhcmFtOworICAgICAgICAgICAgYy0+Zm9nLmZvZyA9IGZvZ19leHA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHTF9FWFAyOgorICAgICAgICAgICAgYy0+Zm9nLm1vZGUgPSBwYXJhbTsKKyAgICAgICAgICAgIGMtPmZvZy5mb2cgPSBmb2dfZXhwMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKKyNpZiAwCisjcHJhZ21hIG1hcmsgLQorI3ByYWdtYSBtYXJrIGxpZ2h0aW5nIEFQSXMKKyNlbmRpZgorCit2b2lkIGdsU2hhZGVNb2RlbChHTGVudW0gbW9kZSkKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGlmIChnZ2xfdW5saWtlbHkobW9kZSAhPSBHTF9TTU9PVEggJiYgbW9kZSAhPSBHTF9GTEFUKSkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGMtPmxpZ2h0aW5nLnNoYWRlTW9kZWwgPSBtb2RlOworfQorCit2b2lkIGdsTGlnaHRNb2RlbGYoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgbGlnaHRNb2RlbHgocG5hbWUsIGdnbEZsb2F0VG9GaXhlZChwYXJhbSksIGMpOworfQorCit2b2lkIGdsTGlnaHRNb2RlbHgoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgbGlnaHRNb2RlbHgocG5hbWUsIHBhcmFtLCBjKTsKK30KKwordm9pZCBnbExpZ2h0TW9kZWxmdihHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGlmIChwbmFtZSA9PSBHTF9MSUdIVF9NT0RFTF9UV09fU0lERSkgeworICAgICAgICBsaWdodE1vZGVseChwbmFtZSwgZ2dsRmxvYXRUb0ZpeGVkKHBhcmFtc1swXSksIGMpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGdnbF91bmxpa2VseShwbmFtZSAhPSBHTF9MSUdIVF9NT0RFTF9BTUJJRU5UKSkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYy0+bGlnaHRpbmcubGlnaHRNb2RlbC5hbWJpZW50LnIgPSBnZ2xGbG9hdFRvRml4ZWQocGFyYW1zWzBdKTsKKyAgICBjLT5saWdodGluZy5saWdodE1vZGVsLmFtYmllbnQuZyA9IGdnbEZsb2F0VG9GaXhlZChwYXJhbXNbMV0pOworICAgIGMtPmxpZ2h0aW5nLmxpZ2h0TW9kZWwuYW1iaWVudC5iID0gZ2dsRmxvYXRUb0ZpeGVkKHBhcmFtc1syXSk7CisgICAgYy0+bGlnaHRpbmcubGlnaHRNb2RlbC5hbWJpZW50LmEgPSBnZ2xGbG9hdFRvRml4ZWQocGFyYW1zWzNdKTsKKyAgICBpbnZhbGlkYXRlX2xpZ2h0aW5nKGMpOworfQorCit2b2lkIGdsTGlnaHRNb2RlbHh2KEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgaWYgKHBuYW1lID09IEdMX0xJR0hUX01PREVMX1RXT19TSURFKSB7CisgICAgICAgIGxpZ2h0TW9kZWx4KHBuYW1lLCBwYXJhbXNbMF0sIGMpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGdnbF91bmxpa2VseShwbmFtZSAhPSBHTF9MSUdIVF9NT0RFTF9BTUJJRU5UKSkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYy0+bGlnaHRpbmcubGlnaHRNb2RlbC5hbWJpZW50LnIgPSBwYXJhbXNbMF07CisgICAgYy0+bGlnaHRpbmcubGlnaHRNb2RlbC5hbWJpZW50LmcgPSBwYXJhbXNbMV07CisgICAgYy0+bGlnaHRpbmcubGlnaHRNb2RlbC5hbWJpZW50LmIgPSBwYXJhbXNbMl07CisgICAgYy0+bGlnaHRpbmcubGlnaHRNb2RlbC5hbWJpZW50LmEgPSBwYXJhbXNbM107CisgICAgaW52YWxpZGF0ZV9saWdodGluZyhjKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIDAKKyNwcmFnbWEgbWFyayAtCisjZW5kaWYKKwordm9pZCBnbExpZ2h0ZihHTGVudW0gaSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgbGlnaHR4KGksIHBuYW1lLCBnZ2xGbG9hdFRvRml4ZWQocGFyYW0pLCBjKTsKK30KKwordm9pZCBnbExpZ2h0eChHTGVudW0gaSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgbGlnaHR4KGksIHBuYW1lLCBwYXJhbSwgYyk7Cit9CisKK3ZvaWQgZ2xMaWdodGZ2KEdMZW51bSBpLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIHN3aXRjaCAocG5hbWUpIHsKKyAgICBjYXNlIEdMX1NQT1RfRVhQT05FTlQ6CisgICAgY2FzZSBHTF9TUE9UX0NVVE9GRjoKKyAgICBjYXNlIEdMX0NPTlNUQU5UX0FUVEVOVUFUSU9OOgorICAgIGNhc2UgR0xfTElORUFSX0FUVEVOVUFUSU9OOgorICAgIGNhc2UgR0xfUVVBRFJBVElDX0FUVEVOVUFUSU9OOgorICAgICAgICBsaWdodHgoaSwgcG5hbWUsIGdnbEZsb2F0VG9GaXhlZChwYXJhbXNbMF0pLCBjKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEdMZml4ZWQgcGFyYW1zeFs0XTsKKyAgICBwYXJhbXN4WzBdID0gZ2dsRmxvYXRUb0ZpeGVkKHBhcmFtc1swXSk7CisgICAgcGFyYW1zeFsxXSA9IGdnbEZsb2F0VG9GaXhlZChwYXJhbXNbMV0pOworICAgIHBhcmFtc3hbMl0gPSBnZ2xGbG9hdFRvRml4ZWQocGFyYW1zWzJdKTsKKyAgICBpZiAocG5hbWUgIT0gR0xfU1BPVF9ESVJFQ1RJT04pCisgICAgICAgIHBhcmFtc3hbM10gPSBnZ2xGbG9hdFRvRml4ZWQocGFyYW1zWzNdKTsKKworICAgIGxpZ2h0eHYoaSwgcG5hbWUsIHBhcmFtc3gsIGMpOworfQorCit2b2lkIGdsTGlnaHR4dihHTGVudW0gaSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpCit7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBsaWdodHh2KGksIHBuYW1lLCBwYXJhbXMsIGMpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgMAorI3ByYWdtYSBtYXJrIC0KKyNlbmRpZgorCit2b2lkIGdsTWF0ZXJpYWxmKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pCit7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBtYXRlcmlhbHgoZmFjZSwgcG5hbWUsIGdnbEZsb2F0VG9GaXhlZChwYXJhbSksIGMpOworfQorCit2b2lkIGdsTWF0ZXJpYWx4KEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pCit7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBtYXRlcmlhbHgoZmFjZSwgcG5hbWUsIHBhcmFtLCBjKTsKK30KKwordm9pZCBnbE1hdGVyaWFsZnYoCisgICAgR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgaWYgKGdnbF91bmxpa2VseShmYWNlICE9IEdMX0ZST05UX0FORF9CQUNLKSkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEdMZml4ZWQqIHdoYXQ9MDsKKyAgICBHTGZpeGVkKiBvdGhlcj0wOworICAgIHN3aXRjaCAocG5hbWUpIHsKKyAgICBjYXNlIEdMX0FNQklFTlQ6ICAgIHdoYXQgPSBjLT5saWdodGluZy5mcm9udC5hbWJpZW50LnY7IGJyZWFrOworICAgIGNhc2UgR0xfRElGRlVTRTogICAgd2hhdCA9IGMtPmxpZ2h0aW5nLmZyb250LmRpZmZ1c2UudjsgYnJlYWs7CisgICAgY2FzZSBHTF9TUEVDVUxBUjogICB3aGF0ID0gYy0+bGlnaHRpbmcuZnJvbnQuc3BlY3VsYXIudjsgYnJlYWs7CisgICAgY2FzZSBHTF9FTUlTU0lPTjogICB3aGF0ID0gYy0+bGlnaHRpbmcuZnJvbnQuZW1pc3Npb24udjsgYnJlYWs7CisgICAgY2FzZSBHTF9BTUJJRU5UX0FORF9ESUZGVVNFOgorICAgICAgICB3aGF0ICA9IGMtPmxpZ2h0aW5nLmZyb250LmFtYmllbnQudjsgYnJlYWs7CisgICAgICAgIG90aGVyID0gYy0+bGlnaHRpbmcuZnJvbnQuZGlmZnVzZS52OyBicmVhazsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9TSElOSU5FU1M6CisgICAgICAgIGMtPmxpZ2h0aW5nLmZyb250LnNoaW5pbmVzcyA9IGdnbEZsb2F0VG9GaXhlZChwYXJhbXNbMF0pOworICAgICAgICBpbnZhbGlkYXRlX2xpZ2h0aW5nKGMpOworICAgICAgICByZXR1cm47CisgICAgZGVmYXVsdDoKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB3aGF0WzBdID0gZ2dsRmxvYXRUb0ZpeGVkKHBhcmFtc1swXSk7CisgICAgd2hhdFsxXSA9IGdnbEZsb2F0VG9GaXhlZChwYXJhbXNbMV0pOworICAgIHdoYXRbMl0gPSBnZ2xGbG9hdFRvRml4ZWQocGFyYW1zWzJdKTsKKyAgICB3aGF0WzNdID0gZ2dsRmxvYXRUb0ZpeGVkKHBhcmFtc1szXSk7CisgICAgaWYgKG90aGVyKSB7CisgICAgICAgIG90aGVyWzBdID0gd2hhdFswXTsKKyAgICAgICAgb3RoZXJbMV0gPSB3aGF0WzFdOworICAgICAgICBvdGhlclsyXSA9IHdoYXRbMl07CisgICAgICAgIG90aGVyWzNdID0gd2hhdFszXTsKKyAgICB9CisgICAgaW52YWxpZGF0ZV9saWdodGluZyhjKTsKK30KKwordm9pZCBnbE1hdGVyaWFseHYoCisgICAgR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgaWYgKGdnbF91bmxpa2VseShmYWNlICE9IEdMX0ZST05UX0FORF9CQUNLKSkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEdMZml4ZWQqIHdoYXQ9MDsKKyAgICBHTGZpeGVkKiBvdGhlcj0wOworICAgIHN3aXRjaCAocG5hbWUpIHsKKyAgICBjYXNlIEdMX0FNQklFTlQ6ICAgIHdoYXQgPSBjLT5saWdodGluZy5mcm9udC5hbWJpZW50LnY7IGJyZWFrOworICAgIGNhc2UgR0xfRElGRlVTRTogICAgd2hhdCA9IGMtPmxpZ2h0aW5nLmZyb250LmRpZmZ1c2UudjsgYnJlYWs7CisgICAgY2FzZSBHTF9TUEVDVUxBUjogICB3aGF0ID0gYy0+bGlnaHRpbmcuZnJvbnQuc3BlY3VsYXIudjsgYnJlYWs7CisgICAgY2FzZSBHTF9FTUlTU0lPTjogICB3aGF0ID0gYy0+bGlnaHRpbmcuZnJvbnQuZW1pc3Npb24udjsgYnJlYWs7CisgICAgY2FzZSBHTF9BTUJJRU5UX0FORF9ESUZGVVNFOgorICAgICAgICB3aGF0ID0gYy0+bGlnaHRpbmcuZnJvbnQuYW1iaWVudC52OyBicmVhazsKKyAgICAgICAgb3RoZXI9IGMtPmxpZ2h0aW5nLmZyb250LmRpZmZ1c2UudjsgYnJlYWs7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfU0hJTklORVNTOgorICAgICAgICBjLT5saWdodGluZy5mcm9udC5zaGluaW5lc3MgPSBnZ2xGbG9hdFRvRml4ZWQocGFyYW1zWzBdKTsKKyAgICAgICAgaW52YWxpZGF0ZV9saWdodGluZyhjKTsKKyAgICAgICAgcmV0dXJuOworICAgIGRlZmF1bHQ6CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgd2hhdFswXSA9IHBhcmFtc1swXTsKKyAgICB3aGF0WzFdID0gcGFyYW1zWzFdOworICAgIHdoYXRbMl0gPSBwYXJhbXNbMl07CisgICAgd2hhdFszXSA9IHBhcmFtc1szXTsKKyAgICBpZiAob3RoZXIpIHsKKyAgICAgICAgb3RoZXJbMF0gPSB3aGF0WzBdOworICAgICAgICBvdGhlclsxXSA9IHdoYXRbMV07CisgICAgICAgIG90aGVyWzJdID0gd2hhdFsyXTsKKyAgICAgICAgb3RoZXJbM10gPSB3aGF0WzNdOworICAgIH0KKyAgICBpbnZhbGlkYXRlX2xpZ2h0aW5nKGMpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgMAorI3ByYWdtYSBtYXJrIC0KKyNwcmFnbWEgbWFyayBmb2cKKyNlbmRpZgorCit2b2lkIGdsRm9nZihHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pIHsKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIEdMZml4ZWQgcGFyYW14ID0gKEdMZml4ZWQpcGFyYW07CisgICAgaWYgKHBuYW1lICE9IEdMX0ZPR19NT0RFKQorICAgICAgICBwYXJhbXggPSBnZ2xGbG9hdFRvRml4ZWQocGFyYW0pOworICAgIGZvZ3gocG5hbWUsIHBhcmFteCwgYyk7Cit9CisKK3ZvaWQgZ2xGb2d4KEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkgeworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgZm9neChwbmFtZSwgcGFyYW0sIGMpOworfQorCit2b2lkIGdsRm9nZnYoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpCit7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBpZiAocG5hbWUgIT0gR0xfRk9HX0NPTE9SKSB7CisgICAgICAgIEdMZml4ZWQgcGFyYW14ID0gKEdMZml4ZWQpcGFyYW1zWzBdOworICAgICAgICBpZiAocG5hbWUgIT0gR0xfRk9HX01PREUpCisgICAgICAgICAgICBwYXJhbXggPSBnZ2xGbG9hdFRvRml4ZWQocGFyYW1zWzBdKTsKKyAgICAgICAgZm9neChwbmFtZSwgcGFyYW14LCBjKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBHTGZpeGVkIHBhcmFtc3hbNF07CisgICAgcGFyYW1zeFswXSA9IGdnbEZsb2F0VG9GaXhlZChwYXJhbXNbMF0pOworICAgIHBhcmFtc3hbMV0gPSBnZ2xGbG9hdFRvRml4ZWQocGFyYW1zWzFdKTsKKyAgICBwYXJhbXN4WzJdID0gZ2dsRmxvYXRUb0ZpeGVkKHBhcmFtc1syXSk7CisgICAgcGFyYW1zeFszXSA9IGdnbEZsb2F0VG9GaXhlZChwYXJhbXNbM10pOworICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuZm9nQ29sb3IzeHYoYywgcGFyYW1zeCk7Cit9CisKK3ZvaWQgZ2xGb2d4dihHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGlmIChwbmFtZSAhPSBHTF9GT0dfQ09MT1IpIHsKKyAgICAgICAgZm9neChwbmFtZSwgcGFyYW1zWzBdLCBjKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmZvZ0NvbG9yM3h2KGMsIHBhcmFtcyk7Cit9CmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL2xpZ2h0LmggYi9vcGVuZ2wvbGliYWdsL2xpZ2h0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRhZTI1ZgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC9saWJhZ2wvbGlnaHQuaApAQCAtMCwwICsxLDM4IEBACisvKiBsaWJzL29wZW5nbGVzL2xpZ2h0LmgKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaWZuZGVmIEFORFJPSURfT1BFTkdMRVNfTElHSFRfSAorI2RlZmluZSBBTkRST0lEX09QRU5HTEVTX0xJR0hUX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSBnbCB7CitzdHJ1Y3Qgb2dsZXNfY29udGV4dF90OworfTsKKwordm9pZCBvZ2xlc19pbml0X2xpZ2h0KG9nbGVzX2NvbnRleHRfdCogYyk7Cit2b2lkIG9nbGVzX3VuaW5pdF9saWdodChvZ2xlc19jb250ZXh0X3QqIGMpOwordm9pZCBvZ2xlc19pbnZhbGlkYXRlX2xpZ2h0aW5nX212dWkob2dsZXNfY29udGV4dF90KiBjKTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfT1BFTkdMRVNfTElHSFRfSAorCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL21hdHJpeC5jcHAgYi9vcGVuZ2wvbGliYWdsL21hdHJpeC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE3NWNkYQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC9saWJhZ2wvbWF0cml4LmNwcApAQCAtMCwwICsxLDExNDUgQEAKKy8qIGxpYnMvb3BlbmdsZXMvbWF0cml4LmNwcAorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiY29udGV4dC5oIgorI2luY2x1ZGUgImZwLmgiCisjaW5jbHVkZSAic3RhdGUuaCIKKyNpbmNsdWRlICJtYXRyaXguaCIKKyNpbmNsdWRlICJ2ZXJ0ZXguaCIKKyNpbmNsdWRlICJsaWdodC5oIgorCisjaWYgZGVmaW5lZChfX2FybV9fKSAmJiBkZWZpbmVkKF9fdGh1bWJfXykKKyN3YXJuaW5nICJtYXRyaXguY3BwIHNob3VsZCBub3QgYmUgY29tcGlsZWQgaW4gdGh1bWIgb24gQVJNLiIKKyNlbmRpZgorCisjZGVmaW5lIEkoX2ksIF9qKSAoKF9qKSsgNCooX2kpKQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGNvbnN0IEdMZmxvYXQgZ0lkZW50aXR5ZlsxNl0gPSB7IDEsMCwwLDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwxLDAsMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLDAsMSwwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsMCwwLDEgfTsKKworc3RhdGljIGNvbnN0IG1hdHJpeHhfdCBnSWRlbnRpdHl4ID0geyAKKyAgICAgICAgICAgIHsgICAweDEwMDAwLDAsMCwwLAorICAgICAgICAgICAgICAgIDAsMHgxMDAwMCwwLDAsCisgICAgICAgICAgICAgICAgMCwwLDB4MTAwMDAsMCwKKyAgICAgICAgICAgICAgICAwLDAsMCwweDEwMDAwCisgICAgICAgICAgICB9CisgICAgICAgIH07CisKK3N0YXRpYyB2b2lkIHBvaW50Ml9fbm9wKHRyYW5zZm9ybV90IGNvbnN0KiwgdmVjNF90KiBjLCB2ZWM0X3QgY29uc3QqIG8pOworc3RhdGljIHZvaWQgcG9pbnQzX19ub3AodHJhbnNmb3JtX3QgY29uc3QqLCB2ZWM0X3QqIGMsIHZlYzRfdCBjb25zdCogbyk7CitzdGF0aWMgdm9pZCBwb2ludDRfX25vcCh0cmFuc2Zvcm1fdCBjb25zdCosIHZlYzRfdCogYywgdmVjNF90IGNvbnN0KiBvKTsKK3N0YXRpYyB2b2lkIG5vcm1hbF9fbm9wKHRyYW5zZm9ybV90IGNvbnN0KiwgdmVjNF90KiBjLCB2ZWM0X3QgY29uc3QqIG8pOworc3RhdGljIHZvaWQgcG9pbnQyX19nZW5lcmljKHRyYW5zZm9ybV90IGNvbnN0KiwgdmVjNF90KiBjLCB2ZWM0X3QgY29uc3QqIG8pOworc3RhdGljIHZvaWQgcG9pbnQzX19nZW5lcmljKHRyYW5zZm9ybV90IGNvbnN0KiwgdmVjNF90KiBjLCB2ZWM0X3QgY29uc3QqIG8pOworc3RhdGljIHZvaWQgcG9pbnQ0X19nZW5lcmljKHRyYW5zZm9ybV90IGNvbnN0KiwgdmVjNF90KiBjLCB2ZWM0X3QgY29uc3QqIG8pOworc3RhdGljIHZvaWQgbm9ybWFsX19nZW5lcmljKHRyYW5zZm9ybV90IGNvbnN0KiwgdmVjNF90KiBjLCB2ZWM0X3QgY29uc3QqIG8pOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgMAorI3ByYWdtYSBtYXJrIC0KKyNlbmRpZgorCit2b2lkIG9nbGVzX2luaXRfbWF0cml4KG9nbGVzX2NvbnRleHRfdCogYykKK3sKKyAgICBjLT50cmFuc2Zvcm1zLm1vZGVsdmlldy5pbml0KE9HTEVTX01PREVMVklFV19TVEFDS19ERVBUSCk7CisgICAgYy0+dHJhbnNmb3Jtcy5wcm9qZWN0aW9uLmluaXQoT0dMRVNfUFJPSkVDVElPTl9TVEFDS19ERVBUSCk7CisgICAgZm9yIChpbnQgaT0wOyBpPEdHTF9URVhUVVJFX1VOSVRfQ09VTlQgOyBpKyspCisgICAgICAgIGMtPnRyYW5zZm9ybXMudGV4dHVyZVtpXS5pbml0KE9HTEVTX1RFWFRVUkVfU1RBQ0tfREVQVEgpOworCisgICAgYy0+dHJhbnNmb3Jtcy5jdXJyZW50ID0gJmMtPnRyYW5zZm9ybXMubW9kZWx2aWV3OworICAgIGMtPnRyYW5zZm9ybXMubWF0cml4TW9kZSA9IEdMX01PREVMVklFVzsKKyAgICBjLT50cmFuc2Zvcm1zLmRpcnR5ID0gICB0cmFuc2Zvcm1fc3RhdGVfdDo6VklFV1BPUlQgfCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1fc3RhdGVfdDo6TVZVSSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtX3N0YXRlX3Q6Ok1WSVQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybV9zdGF0ZV90OjpNVlA7CisgICAgYy0+dHJhbnNmb3Jtcy5tdnAubG9hZElkZW50aXR5KCk7CisgICAgYy0+dHJhbnNmb3Jtcy5tdnA0LmxvYWRJZGVudGl0eSgpOworICAgIGMtPnRyYW5zZm9ybXMubXZpdDQubG9hZElkZW50aXR5KCk7CisgICAgYy0+dHJhbnNmb3Jtcy5tdnVpLmxvYWRJZGVudGl0eSgpOworICAgIGMtPnRyYW5zZm9ybXMudnB0LmxvYWRJZGVudGl0eSgpOworICAgIGMtPnRyYW5zZm9ybXMudnB0LnpOZWFyID0gMC4wZjsKKyAgICBjLT50cmFuc2Zvcm1zLnZwdC56RmFyICA9IDEuMGY7Cit9CisKK3ZvaWQgb2dsZXNfdW5pbml0X21hdHJpeChvZ2xlc19jb250ZXh0X3QqIGMpCit7CisgICAgYy0+dHJhbnNmb3Jtcy5tb2RlbHZpZXcudW5pbml0KCk7CisgICAgYy0+dHJhbnNmb3Jtcy5wcm9qZWN0aW9uLnVuaW5pdCgpOworICAgIGZvciAoaW50IGk9MDsgaTxHR0xfVEVYVFVSRV9VTklUX0NPVU5UIDsgaSsrKQorICAgICAgICBjLT50cmFuc2Zvcm1zLnRleHR1cmVbaV0udW5pbml0KCk7Cit9CisKK3N0YXRpYyB2b2lkIHZhbGlkYXRlX3BlcnNwZWN0aXZlKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYpCit7CisgICAgY29uc3QgdWludDMyX3QgZW5hYmxlcyA9IGMtPnJhc3Rlcml6ZXIuc3RhdGUuZW5hYmxlczsKKyAgICBjLT5hcnJheXMucGVyc3BlY3RpdmUgPSAoYy0+Y2xpcFBsYW5lcy5lbmFibGUpID8KKyAgICAgICAgb2dsZXNfdmVydGV4X2NsaXBBbGxQZXJzcGVjdGl2ZTNEIDogb2dsZXNfdmVydGV4X3BlcnNwZWN0aXZlM0Q7CisgICAgaWYgKGVuYWJsZXMgJiAoR0dMX0VOQUJMRV9ERVBUSF9URVNUfEdHTF9FTkFCTEVfRk9HKSkgeworICAgICAgICBjLT5hcnJheXMucGVyc3BlY3RpdmUgPSBvZ2xlc192ZXJ0ZXhfcGVyc3BlY3RpdmUzRFo7CisgICAgICAgIGlmIChjLT5jbGlwUGxhbmVzLmVuYWJsZSB8fCAoZW5hYmxlcyZHR0xfRU5BQkxFX0ZPRykpCisgICAgICAgICAgICBjLT5hcnJheXMucGVyc3BlY3RpdmUgPSBvZ2xlc192ZXJ0ZXhfY2xpcEFsbFBlcnNwZWN0aXZlM0RaOworICAgIH0KKyAgICBpZiAoKGMtPmFycmF5cy52ZXJ0ZXguc2l6ZSAhPSA0KSAmJgorICAgICAgICAoYy0+dHJhbnNmb3Jtcy5tdnA0LmZsYWdzICYgdHJhbnNmb3JtX3Q6OkZMQUdTXzJEX1BST0pFQ1RJT04pKSB7CisgICAgICAgIGMtPmFycmF5cy5wZXJzcGVjdGl2ZSA9IG9nbGVzX3ZlcnRleF9wZXJzcGVjdGl2ZTJEOworICAgIH0KKyAgICBjLT5hcnJheXMucGVyc3BlY3RpdmUoYywgdik7Cit9CisKK3ZvaWQgb2dsZXNfaW52YWxpZGF0ZV9wZXJzcGVjdGl2ZShvZ2xlc19jb250ZXh0X3QqIGMpCit7CisgICAgYy0+YXJyYXlzLnBlcnNwZWN0aXZlID0gdmFsaWRhdGVfcGVyc3BlY3RpdmU7Cit9CisKK3ZvaWQgb2dsZXNfdmFsaWRhdGVfdHJhbnNmb3JtX2ltcGwob2dsZXNfY29udGV4dF90KiBjLCB1aW50MzJfdCB3YW50KQoreworICAgIGludCBkaXJ0eSA9IGMtPnRyYW5zZm9ybXMuZGlydHkgJiB3YW50OworCisgICAgLy8gVmFsaWRhdGUgdGhlIG1vZGVsdmlldworICAgIGlmIChkaXJ0eSAmIHRyYW5zZm9ybV9zdGF0ZV90OjpNT0RFTFZJRVcpIHsKKyAgICAgICAgYy0+dHJhbnNmb3Jtcy5tb2RlbHZpZXcudmFsaWRhdGUoKTsKKyAgICB9CisKKyAgICAvLyBWYWxpZGF0ZSB0aGUgcHJvamVjdGlvbiBzdGFjayAoaW4gZmFjdCwgaXQncyBuZXZlciBuZWVkZWQpCisgICAgaWYgKGRpcnR5ICYgdHJhbnNmb3JtX3N0YXRlX3Q6OlBST0pFQ1RJT04pIHsKKyAgICAgICAgYy0+dHJhbnNmb3Jtcy5wcm9qZWN0aW9uLnZhbGlkYXRlKCk7CisgICAgfQorCisgICAgLy8gVmFsaWRhdGUgdGhlIHZpZXdwb3J0IHRyYW5zZm9ybWF0aW9uCisgICAgaWYgKGRpcnR5ICYgdHJhbnNmb3JtX3N0YXRlX3Q6OlZJRVdQT1JUKSB7CisgICAgICAgIHZwX3RyYW5zZm9ybV90JiB2cHQgPSBjLT50cmFuc2Zvcm1zLnZwdDsKKyAgICAgICAgdnB0LnRyYW5zZm9ybS5tYXRyaXgubG9hZCh2cHQubWF0cml4KTsKKyAgICAgICAgdnB0LnRyYW5zZm9ybS5waWNrZXIoKTsKKyAgICB9CisKKyAgICAvLyBXZSBuZWVkIHRvIHVwZGF0ZSB0aGUgbXZwICh1c2VkIHRvIHRyYW5zZm9ybSBlYWNoIHZlcnRleCkKKyAgICBpZiAoZGlydHkgJiB0cmFuc2Zvcm1fc3RhdGVfdDo6TVZQKSB7CisgICAgICAgIGMtPnRyYW5zZm9ybXMudXBkYXRlX212cCgpOworICAgICAgICAvLyBpbnZhbGlkYXRlIHBlcnNwZWN0aXZlIChkaXZpZGUgYnkgVykgYW5kIHZpZXcgdm9sdW1lIGNsaXBwaW5nCisgICAgICAgIG9nbGVzX2ludmFsaWRhdGVfcGVyc3BlY3RpdmUoYyk7CisgICAgfQorCisgICAgLy8gVmFsaWRhdGUgdGhlIG12dWkgKGZvciBub3JtYWwgdHJhbnNmb3JtYXRpb24pCisgICAgaWYgKGRpcnR5ICYgdHJhbnNmb3JtX3N0YXRlX3Q6Ok1WVUkpIHsKKyAgICAgICAgYy0+dHJhbnNmb3Jtcy51cGRhdGVfbXZ1aSgpOworICAgICAgICBvZ2xlc19pbnZhbGlkYXRlX2xpZ2h0aW5nX212dWkoYyk7CisgICAgfQorCisgICAgLy8gVmFsaWRhdGUgdGhlIHRleHR1cmUgc3RhY2sKKyAgICBpZiAoZGlydHkgJiB0cmFuc2Zvcm1fc3RhdGVfdDo6VEVYVFVSRSkgeworICAgICAgICBmb3IgKGludCBpPTA7IGk8R0dMX1RFWFRVUkVfVU5JVF9DT1VOVCA7IGkrKykKKyAgICAgICAgICAgIGMtPnRyYW5zZm9ybXMudGV4dHVyZVtpXS52YWxpZGF0ZSgpOworICAgIH0KKworICAgIC8vIFZhbGlkYXRlIHRoZSBtdml0NCAodXNlci1jbGlwIHBsYW5lcykKKyAgICBpZiAoZGlydHkgJiB0cmFuc2Zvcm1fc3RhdGVfdDo6TVZJVCkgeworICAgICAgICBjLT50cmFuc2Zvcm1zLnVwZGF0ZV9tdml0KCk7CisgICAgfQorCisgICAgYy0+dHJhbnNmb3Jtcy5kaXJ0eSAmPSB+d2FudDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIDAKKyNwcmFnbWEgbWFyayAtCisjcHJhZ21hIG1hcmsgdHJhbnNmb3JtX3QKKyNlbmRpZgorCit2b2lkIHRyYW5zZm9ybV90Ojpsb2FkSWRlbnRpdHkoKSB7CisgICAgbWF0cml4ID0gZ0lkZW50aXR5eDsKKyAgICBmbGFncyA9IDA7CisgICAgb3BzID0gT1BfSURFTlRJVFk7CisgICAgcG9pbnQyID0gcG9pbnQyX19ub3A7CisgICAgcG9pbnQzID0gcG9pbnQzX19ub3A7CisgICAgcG9pbnQ0ID0gcG9pbnQ0X19ub3A7Cit9CisKKworc3RhdGljIGlubGluZQoraW50IG5vdFplcm8oR0xmaXhlZCB2KSB7CisgICAgcmV0dXJuIGFicyh2KSAmIH4weDM7Cit9CisKK3N0YXRpYyBpbmxpbmUKK2ludCBub3RPbmUoR0xmaXhlZCB2KSB7CisgICAgcmV0dXJuIG5vdFplcm8odiAtIDB4MTAwMDApOworfQorCit2b2lkIHRyYW5zZm9ybV90OjpwaWNrZXIoKQoreworICAgIGNvbnN0IEdMZml4ZWQqIGNvbnN0IG0gPSBtYXRyaXgubTsKKworICAgIC8vIFhYWDogcGlja2VyIG5lZWRzIHRvIGJlIHNtYXJ0ZXIKKyAgICBmbGFncyA9IDA7CisgICAgb3BzID0gT1BfQUxMOworICAgIHBvaW50MiA9IHBvaW50Ml9fZ2VuZXJpYzsKKyAgICBwb2ludDMgPSBwb2ludDNfX2dlbmVyaWM7CisgICAgcG9pbnQ0ID0gcG9pbnQ0X19nZW5lcmljOworICAgIAorICAgIC8vIGZpbmQgb3V0IGlmIHRoaXMgaXMgYSAyRCBwcm9qZWN0aW9uCisgICAgaWYgKCEobm90WmVybyhtWzNdKSB8IG5vdFplcm8obVs3XSkgfCBub3RaZXJvKG1bMTFdKSB8IG5vdE9uZShtWzE1XSkpKSB7CisgICAgICAgIGZsYWdzIHw9IEZMQUdTXzJEX1BST0pFQ1RJT047CisgICAgfQorfQorCit2b2lkIG12dWlfdHJhbnNmb3JtX3Q6OnBpY2tlcigpCit7CisgICAgZmxhZ3MgPSAwOworICAgIG9wcyA9IE9QX0FMTDsKKyAgICBwb2ludDMgPSBub3JtYWxfX2dlbmVyaWM7Cit9CisKK3ZvaWQgdHJhbnNmb3JtX3Q6OmR1bXAoY29uc3QgY2hhciogd2hhdCkKK3sKKyAgICBHTGZpeGVkIGNvbnN0ICogY29uc3QgbSA9IG1hdHJpeC5tOworICAgIExPR0QoIiVzOiIsIHdoYXQpOworICAgIGZvciAoaW50IGk9MCA7IGk8NCA7IGkrKykKKyAgICAgICAgTE9HRCgiWyUwOHggJTA4eCAlMDh4ICUwOHhdIFslZiAlZiAlZiAlZl1cbiIsCisgICAgICAgICAgICBtW0koMCxpKV0sIG1bSSgxLGkpXSwgbVtJKDIsaSldLCBtW0koMyxpKV0sCisgICAgICAgICAgICBmaXhlZFRvRmxvYXQobVtJKDAsaSldKSwKKyAgICAgICAgICAgIGZpeGVkVG9GbG9hdChtW0koMSxpKV0pLCAKKyAgICAgICAgICAgIGZpeGVkVG9GbG9hdChtW0koMixpKV0pLAorICAgICAgICAgICAgZml4ZWRUb0Zsb2F0KG1bSSgzLGkpXSkpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgMAorI3ByYWdtYSBtYXJrIC0KKyNwcmFnbWEgbWFyayBtYXRyaXh4X3QKKyNlbmRpZgorCit2b2lkIG1hdHJpeHhfdDo6bG9hZChjb25zdCBtYXRyaXhmX3QmIHJocykgeworICAgIEdMZml4ZWQqIHhwID0gbTsKKyAgICBHTGZsb2F0IGNvbnN0KiBmcCA9IHJocy5lbGVtZW50cygpOworICAgIHVuc2lnbmVkIGludCBpID0gMTY7CisgICAgZG8geworICAgICAgICBjb25zdCBHTGZsb2F0IGYgPSAqZnArKzsKKyAgICAgICAgKnhwKysgPSBpc1plcm9mKGYpID8gMCA6IGdnbEZsb2F0VG9GaXhlZChmKTsKKyAgICB9IHdoaWxlICgtLWkpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgMAorI3ByYWdtYSBtYXJrIC0KKyNwcmFnbWEgbWFyayBtYXRyaXhmX3QKKyNlbmRpZgorCit2b2lkIG1hdHJpeGZfdDo6bXVsdGlwbHkobWF0cml4Zl90JiByLCBjb25zdCBtYXRyaXhmX3QmIGxocywgY29uc3QgbWF0cml4Zl90JiByaHMpCit7CisgICAgR0xmbG9hdCBjb25zdCogY29uc3QgbSA9IGxocy5tOworICAgIGZvciAoaW50IGk9MCA7IGk8NCA7IGkrKykgeworICAgICAgICByZWdpc3RlciBjb25zdCBmbG9hdCByaHNfaTAgPSByaHMubVsgSShpLDApIF07CisgICAgICAgIHJlZ2lzdGVyIGZsb2F0IHJpMCA9IG1bIEkoMCwwKSBdICogcmhzX2kwOworICAgICAgICByZWdpc3RlciBmbG9hdCByaTEgPSBtWyBJKDAsMSkgXSAqIHJoc19pMDsKKyAgICAgICAgcmVnaXN0ZXIgZmxvYXQgcmkyID0gbVsgSSgwLDIpIF0gKiByaHNfaTA7CisgICAgICAgIHJlZ2lzdGVyIGZsb2F0IHJpMyA9IG1bIEkoMCwzKSBdICogcmhzX2kwOworICAgICAgICBmb3IgKGludCBqPTEgOyBqPDQgOyBqKyspIHsKKyAgICAgICAgICAgIHJlZ2lzdGVyIGNvbnN0IGZsb2F0IHJoc19paiA9IHJocy5tWyBJKGksaikgXTsKKyAgICAgICAgICAgIHJpMCArPSBtWyBJKGosMCkgXSAqIHJoc19pajsKKyAgICAgICAgICAgIHJpMSArPSBtWyBJKGosMSkgXSAqIHJoc19pajsKKyAgICAgICAgICAgIHJpMiArPSBtWyBJKGosMikgXSAqIHJoc19pajsKKyAgICAgICAgICAgIHJpMyArPSBtWyBJKGosMykgXSAqIHJoc19pajsKKyAgICAgICAgfQorICAgICAgICByLm1bIEkoaSwwKSBdID0gcmkwOworICAgICAgICByLm1bIEkoaSwxKSBdID0gcmkxOworICAgICAgICByLm1bIEkoaSwyKSBdID0gcmkyOworICAgICAgICByLm1bIEkoaSwzKSBdID0gcmkzOworICAgIH0KK30KKwordm9pZCBtYXRyaXhmX3Q6OmR1bXAoY29uc3QgY2hhciogd2hhdCkgeworICAgIExPR0QoIiVzIiwgd2hhdCk7CisgICAgTE9HRCgiWyAlOWYgJTlmICU5ZiAlOWYgXSIsIG1bSSgwLDApXSwgbVtJKDEsMCldLCBtW0koMiwwKV0sIG1bSSgzLDApXSk7CisgICAgTE9HRCgiWyAlOWYgJTlmICU5ZiAlOWYgXSIsIG1bSSgwLDEpXSwgbVtJKDEsMSldLCBtW0koMiwxKV0sIG1bSSgzLDEpXSk7CisgICAgTE9HRCgiWyAlOWYgJTlmICU5ZiAlOWYgXSIsIG1bSSgwLDIpXSwgbVtJKDEsMildLCBtW0koMiwyKV0sIG1bSSgzLDIpXSk7CisgICAgTE9HRCgiWyAlOWYgJTlmICU5ZiAlOWYgXSIsIG1bSSgwLDMpXSwgbVtJKDEsMyldLCBtW0koMiwzKV0sIG1bSSgzLDMpXSk7Cit9CisKK3ZvaWQgbWF0cml4Zl90Ojpsb2FkSWRlbnRpdHkoKSB7CisgICAgbWVtY3B5KG0sIGdJZGVudGl0eWYsIHNpemVvZihtKSk7Cit9CisKK3ZvaWQgbWF0cml4Zl90OjpzZXQoY29uc3QgR0xmaXhlZCogcmhzKSB7CisgICAgbG9hZChyaHMpOworfQorCit2b2lkIG1hdHJpeGZfdDo6c2V0KGNvbnN0IEdMZmxvYXQqIHJocykgeworICAgIGxvYWQocmhzKTsKK30KKwordm9pZCBtYXRyaXhmX3Q6OmxvYWQoY29uc3QgR0xmaXhlZCogcmhzKSB7CisgICAgR0xmbG9hdCogZnAgPSBtOworICAgIHVuc2lnbmVkIGludCBpID0gMTY7CisgICAgZG8geworICAgICAgICAqZnArKyA9IGZpeGVkVG9GbG9hdCgqcmhzKyspOworICAgIH0gd2hpbGUgKC0taSk7Cit9CisKK3ZvaWQgbWF0cml4Zl90Ojpsb2FkKGNvbnN0IEdMZmxvYXQqIHJocykgeworICAgIG1lbWNweShtLCByaHMsIHNpemVvZihtKSk7Cit9CisKK3ZvaWQgbWF0cml4Zl90Ojpsb2FkKGNvbnN0IG1hdHJpeGZfdCYgcmhzKSB7CisgICAgb3BlcmF0b3IgPSAocmhzKTsKK30KKwordm9pZCBtYXRyaXhmX3Q6Om11bHRpcGx5KGNvbnN0IG1hdHJpeGZfdCYgcmhzKSB7CisgICAgbWF0cml4Zl90IHI7CisgICAgbXVsdGlwbHkociwgKnRoaXMsIHJocyk7CisgICAgb3BlcmF0b3IgPSAocik7Cit9CisKK3ZvaWQgbWF0cml4Zl90Ojp0cmFuc2xhdGUoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeikgeworICAgIGZvciAoaW50IGk9MCA7IGk8NCA7IGkrKykgeworICAgICAgICBtWzEyK2ldICs9IG1baV0qeCArIG1bNCtpXSp5ICsgbVs4K2ldKno7CisgICAgfQorfQorCit2b2lkIG1hdHJpeGZfdDo6c2NhbGUoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeikgeworICAgIGZvciAoaW50IGk9MCA7IGk8NCA7IGkrKykgeworICAgICAgICBtWyAgaV0gKj0geDsKKyAgICAgICAgbVs0K2ldICo9IHk7CisgICAgICAgIG1bOCtpXSAqPSB6OworICAgIH0KK30KKwordm9pZCBtYXRyaXhmX3Q6OnJvdGF0ZShHTGZsb2F0IGEsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopCit7CisgICAgbWF0cml4Zl90IHJvdGF0aW9uOworICAgIEdMZmxvYXQqIHIgPSByb3RhdGlvbi5tOworICAgIEdMZmxvYXQgYywgczsKKyAgICByWzNdID0gMDsgICByWzddID0gMDsgICByWzExXT0gMDsKKyAgICByWzEyXT0gMDsgICByWzEzXT0gMDsgICByWzE0XT0gMDsgICByWzE1XT0gMTsKKyAgICBhICo9IEdMZmxvYXQoTV9QSSAvIDE4MC4wZik7CisgICAgc2luY29zZihhLCAmcywgJmMpOworICAgIGlmIChpc09uZWYoeCkgJiYgaXNaZXJvZih5KSAmJiBpc1plcm9mKHopKSB7CisgICAgICAgIHJbNV0gPSBjOyAgIHJbMTBdPSBjOworICAgICAgICByWzZdID0gczsgICByWzldID0gLXM7CisgICAgICAgIHJbMV0gPSAwOyAgIHJbMl0gPSAwOworICAgICAgICByWzRdID0gMDsgICByWzhdID0gMDsKKyAgICAgICAgclswXSA9IDE7CisgICAgfSBlbHNlIGlmIChpc1plcm9mKHgpICYmIGlzT25lZih5KSAmJiBpc1plcm9mKHopKSB7CisgICAgICAgIHJbMF0gPSBjOyAgIHJbMTBdPSBjOworICAgICAgICByWzhdID0gczsgICByWzJdID0gLXM7CisgICAgICAgIHJbMV0gPSAwOyAgIHJbNF0gPSAwOworICAgICAgICByWzZdID0gMDsgICByWzldID0gMDsKKyAgICAgICAgcls1XSA9IDE7CisgICAgfSBlbHNlIGlmIChpc1plcm9mKHgpICYmIGlzWmVyb2YoeSkgJiYgaXNPbmVmKHopKSB7CisgICAgICAgIHJbMF0gPSBjOyAgIHJbNV0gPSBjOworICAgICAgICByWzFdID0gczsgICByWzRdID0gLXM7CisgICAgICAgIHJbMl0gPSAwOyAgIHJbNl0gPSAwOworICAgICAgICByWzhdID0gMDsgICByWzldID0gMDsKKyAgICAgICAgclsxMF09IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgR0xmbG9hdCBsZW4gPSBzcXJ0Zih4KnggKyB5KnkgKyB6KnopOworICAgICAgICBpZiAoIWlzT25lZihsZW4pKSB7CisgICAgICAgICAgICBjb25zdCBHTGZsb2F0IHJlY2lwTGVuID0gcmVjaXByb2NhbGYobGVuKTsKKyAgICAgICAgICAgIHggKj0gcmVjaXBMZW47CisgICAgICAgICAgICB5ICo9IHJlY2lwTGVuOworICAgICAgICAgICAgeiAqPSByZWNpcExlbjsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBHTGZsb2F0IG5jID0gMS4wZiAtIGM7CisgICAgICAgIGNvbnN0IEdMZmxvYXQgeHkgPSB4ICogeTsKKyAgICAgICAgY29uc3QgR0xmbG9hdCB5eiA9IHkgKiB6OworICAgICAgICBjb25zdCBHTGZsb2F0IHp4ID0geiAqIHg7CisgICAgICAgIGNvbnN0IEdMZmxvYXQgeHMgPSB4ICogczsKKyAgICAgICAgY29uc3QgR0xmbG9hdCB5cyA9IHkgKiBzOworICAgICAgICBjb25zdCBHTGZsb2F0IHpzID0geiAqIHM7CQkKKyAgICAgICAgclsgMF0gPSB4KngqbmMgKyAgYzsgICAgclsgNF0gPSAgeHkqbmMgLSB6czsgICAgclsgOF0gPSAgengqbmMgKyB5czsKKyAgICAgICAgclsgMV0gPSAgeHkqbmMgKyB6czsgICAgclsgNV0gPSB5KnkqbmMgKyAgYzsgICAgclsgOV0gPSAgeXoqbmMgLSB4czsKKyAgICAgICAgclsgMl0gPSAgengqbmMgLSB5czsgICAgclsgNl0gPSAgeXoqbmMgKyB4czsgICAgclsxMF0gPSB6KnoqbmMgKyAgYzsKKyAgICB9CisgICAgbXVsdGlwbHkocm90YXRpb24pOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgMAorI3ByYWdtYSBtYXJrIC0KKyNwcmFnbWEgbWFyayBtYXRyaXhfc3RhY2tfdAorI2VuZGlmCisKK3ZvaWQgbWF0cml4X3N0YWNrX3Q6OmluaXQoaW50IGRlcHRoKSB7CisgICAgc3RhY2sgPSBuZXcgbWF0cml4Zl90W2RlcHRoXTsKKyAgICBvcHMgPSBuZXcgdWludDhfdFtkZXB0aF07CisgICAgbWF4RGVwdGggPSBkZXB0aDsKKyAgICBkZXB0aCA9IDA7CisgICAgZGlydHkgPSAwOworICAgIGxvYWRJZGVudGl0eSgpOworfQorCit2b2lkIG1hdHJpeF9zdGFja190Ojp1bmluaXQoKSB7CisgICAgZGVsZXRlIFtdIHN0YWNrOworICAgIGRlbGV0ZSBbXSBvcHM7Cit9CisKK3ZvaWQgbWF0cml4X3N0YWNrX3Q6OmxvYWRJZGVudGl0eSgpIHsKKyAgICB0cmFuc2Zvcm0ubG9hZElkZW50aXR5KCk7CisgICAgc3RhY2tbZGVwdGhdLmxvYWRJZGVudGl0eSgpOworICAgIG9wc1tkZXB0aF0gPSBPUF9JREVOVElUWTsKK30KKwordm9pZCBtYXRyaXhfc3RhY2tfdDo6bG9hZChjb25zdCBHTGZpeGVkKiByaHMpCit7ICAgCisgICAgbWVtY3B5KHRyYW5zZm9ybS5tYXRyaXgubSwgcmhzLCBzaXplb2YodHJhbnNmb3JtLm1hdHJpeC5tKSk7CisgICAgc3RhY2tbZGVwdGhdLmxvYWQocmhzKTsKKyAgICBvcHNbZGVwdGhdID0gT1BfQUxMOyAgICAvLyBUT0RPOiB3ZSBzaG91bGQgbG9vayBhdCB0aGUgbWF0cml4Cit9CisKK3ZvaWQgbWF0cml4X3N0YWNrX3Q6OmxvYWQoY29uc3QgR0xmbG9hdCogcmhzKQoreworICAgIHN0YWNrW2RlcHRoXS5sb2FkKHJocyk7CisgICAgb3BzW2RlcHRoXSA9IE9QX0FMTDsgICAgLy8gVE9ETzogd2Ugc2hvdWxkIGxvb2sgYXQgdGhlIG1hdHJpeAorfQorCit2b2lkIG1hdHJpeF9zdGFja190OjptdWx0aXBseShjb25zdCBtYXRyaXhmX3QmIHJocykKK3sgICAgCisgICAgc3RhY2tbZGVwdGhdLm11bHRpcGx5KHJocyk7CisgICAgb3BzW2RlcHRoXSA9IE9QX0FMTDsgICAgLy8gVE9ETzogd2Ugc2hvdWxkIGxvb2sgYXQgdGhlIG1hdHJpeAorfQorCit2b2lkIG1hdHJpeF9zdGFja190Ojp0cmFuc2xhdGUoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeikKK3sKKyAgICBzdGFja1tkZXB0aF0udHJhbnNsYXRlKHgseSx6KTsKKyAgICBvcHNbZGVwdGhdIHw9IE9QX1RSQU5TTEFURTsKK30KKwordm9pZCBtYXRyaXhfc3RhY2tfdDo6c2NhbGUoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeikKK3sKKyAgICBzdGFja1tkZXB0aF0uc2NhbGUoeCx5LHopOworICAgIGlmICh4PT15ICYmIHk9PXopIHsKKyAgICAgICAgb3BzW2RlcHRoXSB8PSBPUF9VTklGT1JNX1NDQUxFOworICAgIH0gZWxzZSB7CisgICAgICAgIG9wc1tkZXB0aF0gfD0gT1BfU0NBTEU7CisgICAgfQorfQorCit2b2lkIG1hdHJpeF9zdGFja190Ojpyb3RhdGUoR0xmbG9hdCBhLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KQoreworICAgIHN0YWNrW2RlcHRoXS5yb3RhdGUoYSx4LHkseik7CisgICAgb3BzW2RlcHRoXSB8PSBPUF9ST1RBVEU7Cit9CisKK3ZvaWQgbWF0cml4X3N0YWNrX3Q6OnZhbGlkYXRlKCkKK3sKKyAgICBpZiAoZGlydHkgJiBET19GTE9BVF9UT19GSVhFRCkgeworICAgICAgICB0cmFuc2Zvcm0ubWF0cml4LmxvYWQodG9wKCkpOworICAgIH0KKyAgICBpZiAoZGlydHkgJiBET19QSUNLRVIpIHsKKyAgICAgICAgdHJhbnNmb3JtLnBpY2tlcigpOworICAgIH0KKyAgICBkaXJ0eSA9IDA7Cit9CisKK0dMaW50IG1hdHJpeF9zdGFja190OjpwdXNoKCkKK3sKKyAgICBpZiAoZGVwdGggPj0gKG1heERlcHRoLTEpKSB7CisgICAgICAgIHJldHVybiBHTF9TVEFDS19PVkVSRkxPVzsKKyAgICB9CisgICAgc3RhY2tbZGVwdGgrMV0gPSBzdGFja1tkZXB0aF07CisgICAgb3BzW2RlcHRoKzFdID0gb3BzW2RlcHRoXTsKKyAgICBkZXB0aCsrOworICAgIHJldHVybiAwOworfQorCitHTGludCBtYXRyaXhfc3RhY2tfdDo6cG9wKCkKK3sKKyAgICBpZiAoZGVwdGggPT0gMCkgeworICAgICAgICByZXR1cm4gR0xfU1RBQ0tfVU5ERVJGTE9XOworICAgIH0KKyAgICBkZXB0aC0tOworICAgIHJldHVybiAwOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgMAorI3ByYWdtYSBtYXJrIC0KKyNwcmFnbWEgbWFyayB2cF90cmFuc2Zvcm1fdAorI2VuZGlmCisKK3ZvaWQgdnBfdHJhbnNmb3JtX3Q6OmxvYWRJZGVudGl0eSgpIHsKKyAgICB0cmFuc2Zvcm0ubG9hZElkZW50aXR5KCk7CisgICAgbWF0cml4LmxvYWRJZGVudGl0eSgpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgMAorI3ByYWdtYSBtYXJrIC0KKyNwcmFnbWEgbWFyayB0cmFuc2Zvcm1fc3RhdGVfdAorI2VuZGlmCisKK3ZvaWQgdHJhbnNmb3JtX3N0YXRlX3Q6OmludmFsaWRhdGUoKQoreworICAgIHN3aXRjaCAobWF0cml4TW9kZSkgeworICAgIGNhc2UgR0xfTU9ERUxWSUVXOiAgZGlydHkgfD0gTU9ERUxWSUVXICB8IE1WUCB8IE1WVUkgfCBNVklUOyAgICBicmVhazsKKyAgICBjYXNlIEdMX1BST0pFQ1RJT046IGRpcnR5IHw9IFBST0pFQ1RJT04gfCBNVlA7ICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9URVhUVVJFOiAgICBkaXJ0eSB8PSBURVhUVVJFICAgIHwgTVZQOyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjdXJyZW50LT5kaXJ0eSA9ICAgIG1hdHJpeF9zdGFja190OjpET19QSUNLRVIgfAorICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4X3N0YWNrX3Q6OkRPX0ZMT0FUX1RPX0ZJWEVEOworfQorCit2b2lkIHRyYW5zZm9ybV9zdGF0ZV90Ojp1cGRhdGVfbXZwKCkKK3sKKyAgICBtYXRyaXhmX3QgdGVtcF9tdnA7CisgICAgbWF0cml4Zl90OjptdWx0aXBseSh0ZW1wX212cCwgcHJvamVjdGlvbi50b3AoKSwgbW9kZWx2aWV3LnRvcCgpKTsKKyAgICBtdnA0Lm1hdHJpeC5sb2FkKHRlbXBfbXZwKTsKKyAgICBtdnA0LnBpY2tlcigpOworCisgICAgaWYgKG12cDQuZmxhZ3MgJiB0cmFuc2Zvcm1fdDo6RkxBR1NfMkRfUFJPSkVDVElPTikgeworICAgICAgICAvLyB0aGUgbXZwIG1hdHJpeCBkb2Vzbid0IHRyYW5zZm9ybSBXLCBpbiB0aGlzIGNhc2Ugd2UgY2FuCisgICAgICAgIC8vIHByZW11bHRpcGx5IGl0IHdpdGggdGhlIHZpZXdwb3J0IHRyYW5zZm9ybWF0aW9uLiBJbiBhZGRpdGlvbiB0bworICAgICAgICAvLyBiZWluZyBtb3JlIGVmZmljaWVudCwgdGhpcyBpcyBhbHNvIG11Y2ggbW9yZSBhY2N1cmF0ZSBhbmQgaW4gZmFjdAorICAgICAgICAvLyBpcyBuZWVkZWQgZm9yIDJEIGRyYXdpbmcgd2l0aCBhIHJlc3VsdGluZyAxOjEgbWFwcGluZy4KKyAgICAgICAgbWF0cml4Zl90IG12cHY7CisgICAgICAgIG1hdHJpeGZfdDo6bXVsdGlwbHkobXZwdiwgdnB0Lm1hdHJpeCwgdGVtcF9tdnApOworICAgICAgICBtdnAubWF0cml4LmxvYWQobXZwdik7CisgICAgICAgIG12cC5waWNrZXIoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtdnAgPSBtdnA0OworICAgIH0KK30KKworc3RhdGljIGlubGluZSAKK0dMZmxvYXQgZGV0MjIoR0xmbG9hdCBhLCBHTGZsb2F0IGIsIEdMZmxvYXQgYywgR0xmbG9hdCBkKSB7CisgICAgcmV0dXJuIGEqZCAtIGIqYzsKK30KKworc3RhdGljIGlubGluZQorR0xmbG9hdCBuZGV0MjIoR0xmbG9hdCBhLCBHTGZsb2F0IGIsIEdMZmxvYXQgYywgR0xmbG9hdCBkKSB7CisgICAgcmV0dXJuIGIqYyAtIGEqZDsKK30KKworc3RhdGljIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSkKK3ZvaWQgaW52ZXJ0KEdMZmxvYXQqIGludmVyc2UsIGNvbnN0IEdMZmxvYXQqIHNyYykKK3sKKyAgICBkb3VibGUgdDsKKyAgICBpbnQgaSwgaiwgaywgc3dhcDsKKyAgICBHTGZsb2F0IHRtcFs0XVs0XTsKKyAgICAKKyAgICBtZW1jcHkoaW52ZXJzZSwgZ0lkZW50aXR5Ziwgc2l6ZW9mKGdJZGVudGl0eWYpKTsKKyAgICBtZW1jcHkodG1wLCBzcmMsIHNpemVvZihHTGZsb2F0KSoxNik7CisgICAgCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAvLyBsb29rIGZvciBsYXJnZXN0IGVsZW1lbnQgaW4gY29sdW1uCisgICAgICAgIHN3YXAgPSBpOworICAgICAgICBmb3IgKGogPSBpICsgMTsgaiA8IDQ7IGorKykgeworICAgICAgICAgICAgaWYgKGZhYnModG1wW2pdW2ldKSA+IGZhYnModG1wW2ldW2ldKSkgeworICAgICAgICAgICAgICAgIHN3YXAgPSBqOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoc3dhcCAhPSBpKSB7CisgICAgICAgICAgICAvKiBzd2FwIHJvd3MuICovCisgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgNDsgaysrKSB7CisgICAgICAgICAgICAgICAgdCA9IHRtcFtpXVtrXTsKKyAgICAgICAgICAgICAgICB0bXBbaV1ba10gPSB0bXBbc3dhcF1ba107CisgICAgICAgICAgICAgICAgdG1wW3N3YXBdW2tdID0gdDsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB0ID0gaW52ZXJzZVtpKjQra107CisgICAgICAgICAgICAgICAgaW52ZXJzZVtpKjQra10gPSBpbnZlcnNlW3N3YXAqNCtrXTsKKyAgICAgICAgICAgICAgICBpbnZlcnNlW3N3YXAqNCtrXSA9IHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHQgPSAxLjBmIC8gdG1wW2ldW2ldOworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgNDsgaysrKSB7CisgICAgICAgICAgICB0bXBbaV1ba10gKj0gdDsKKyAgICAgICAgICAgIGludmVyc2VbaSo0K2tdICo9IHQ7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykgeworICAgICAgICAgICAgaWYgKGogIT0gaSkgeworICAgICAgICAgICAgICAgIHQgPSB0bXBbal1baV07CisgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDQ7IGsrKykgeworICAgICAgICAgICAgICAgICAgICB0bXBbal1ba10gLT0gdG1wW2ldW2tdKnQ7CisgICAgICAgICAgICAgICAgICAgIGludmVyc2Vbaio0K2tdIC09IGludmVyc2VbaSo0K2tdKnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIHRyYW5zZm9ybV9zdGF0ZV90Ojp1cGRhdGVfbXZpdCgpCit7CisgICAgR0xmbG9hdCByWzE2XTsKKyAgICBjb25zdCBHTGZsb2F0KiBjb25zdCBtdiA9IG1vZGVsdmlldy50b3AoKS5lbGVtZW50cygpOworICAgIGludmVydChyLCBtdik7CisgICAgLy8gY29udmVydCB0byBmaXhlZC1wb2ludCBhbmQgdHJhbnNwb3NlCisgICAgR0xmaXhlZCogY29uc3QgeCA9IG12aXQ0Lm1hdHJpeC5tOworICAgIGZvciAoaW50IGk9MCA7IGk8NCA7IGkrKykKKyAgICAgICAgZm9yIChpbnQgaj0wIDsgajw0IDsgaisrKQorICAgICAgICAgICAgeFtJKGksaildID0gZ2dsRmxvYXRUb0ZpeGVkKHJbSShqLGkpXSk7CisgICAgbXZpdDQucGlja2VyKCk7Cit9CisKK3ZvaWQgdHJhbnNmb3JtX3N0YXRlX3Q6OnVwZGF0ZV9tdnVpKCkKK3sKKyAgICBjb25zdCBHTGZsb2F0KiBjb25zdCBtdiA9IG1vZGVsdmlldy50b3AoKS5lbGVtZW50cygpOworCisgICAgLyoKKyAgICBXaGVuIHRyYW5zZm9ybWluZyBub3JtYWxzLCB3ZSBjYW4gdXNlIHRoZSB1cHBlciAzeDMgbWF0cml4LCBzZWU6CisgICAgaHR0cDovL3d3dy5vcGVuZ2wub3JnL2RvY3VtZW50YXRpb24vc3BlY3MvdmVyc2lvbjEuMS9nbHNwZWMxLjEvbm9kZTI2Lmh0bWwKKyAgICAqLworICAgIAorICAgIC8vIEFsc28gbm90ZSB0aGF0OgorICAgIC8vICAgICAgbChvYmopID0gIHRyKE0pLmwoZXllKSBmb3IgaW5maW5pdGUgbGlnaHQKKyAgICAvLyAgICAgIGwob2JqKSA9IGludihNKS5sKGV5ZSkgZm9yIGxvY2FsIGxpZ2h0CisKKyAgICBjb25zdCB1aW50MzJfdCBvcHMgPSBtb2RlbHZpZXcudG9wX29wcygpICYgfk9QX1RSQU5TTEFURTsKKyAgICBpZiAoZ2dsX2xpa2VseSgoIShvcHMgJiB+T1BfUk9UQVRFKSkgfHwKKyAgICAgICAgKHJlc2NhbGVOb3JtYWxzICYmIG1vZGVsdmlldy5pc1JpZ2lkQm9keSgpKSkpIHsKKyAgICAgICAgLy8gaWYgdGhlIG1vZGVsdmlldyBtYXRyaXggaXMgYSByaWdpZCBib2R5IHRyYW5zZm9ybWF0aW9uCisgICAgICAgIC8vICh0cmFuc2xhdGlvbiwgcm90YXRpb24sIHVuaWZvcm0gc2NhbGluZyksIHRoZW4gd2UgY2FuIGJ5cGFzcworICAgICAgICAvLyB0aGUgaW52ZXJzZSBieSB0cmFuc3Bvc2luZyB0aGUgbWF0cml4LgorICAgICAgICBHTGZsb2F0IHJlc2NhbGUgPSAxLjBmOworICAgICAgICBpZiAocmVzY2FsZU5vcm1hbHMgPT0gR0xfUkVTQ0FMRV9OT1JNQUwpIHsKKyAgICAgICAgICAgIGlmICghKG9wcyAmIH5PUF9VTklGT1JNX1NDQUxFKSkgeworICAgICAgICAgICAgICAgIHJlc2NhbGUgPSByZWNpcHJvY2FsZihtdltJKDAsMCldKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVzY2FsZSA9IHJzcXJ0ZigKKyAgICAgICAgICAgICAgICAgICAgICAgIHNxcmYobXZbSSgyLDApXSkgKyBzcXJmKG12W0koMiwxKV0pICsgc3FyZihtdltJKDIsMildKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgR0xmaXhlZCogY29uc3QgeCA9IG12dWkubWF0cml4Lm07CisgICAgICAgIGZvciAoaW50IGk9MCA7IGk8MyA7IGkrKykgeworICAgICAgICAgICAgeFtJKGksMCldID0gZ2dsRmxvYXRUb0ZpeGVkKG12W0koMCxpKV0gKiByZXNjYWxlKTsKKyAgICAgICAgICAgIHhbSShpLDEpXSA9IGdnbEZsb2F0VG9GaXhlZChtdltJKDEsaSldICogcmVzY2FsZSk7CisgICAgICAgICAgICB4W0koaSwyKV0gPSBnZ2xGbG9hdFRvRml4ZWQobXZbSSgyLGkpXSAqIHJlc2NhbGUpOworICAgICAgICB9CisgICAgICAgIG12dWkucGlja2VyKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBHTGZsb2F0IHJbM11bM107CisgICAgclswXVswXSA9IGRldDIyKG12W0koMSwxKV0sIG12W0koMiwxKV0sIG12W0koMSwyKV0sIG12W0koMiwyKV0pOworICAgIHJbMF1bMV0gPW5kZXQyMihtdltJKDAsMSldLCBtdltJKDIsMSldLCBtdltJKDAsMildLCBtdltJKDIsMildKTsKKyAgICByWzBdWzJdID0gZGV0MjIobXZbSSgwLDEpXSwgbXZbSSgxLDEpXSwgbXZbSSgwLDIpXSwgbXZbSSgxLDIpXSk7CisgICAgclsxXVswXSA9bmRldDIyKG12W0koMSwwKV0sIG12W0koMiwwKV0sIG12W0koMSwyKV0sIG12W0koMiwyKV0pOworICAgIHJbMV1bMV0gPSBkZXQyMihtdltJKDAsMCldLCBtdltJKDIsMCldLCBtdltJKDAsMildLCBtdltJKDIsMildKTsKKyAgICByWzFdWzJdID1uZGV0MjIobXZbSSgwLDApXSwgbXZbSSgxLDApXSwgbXZbSSgwLDIpXSwgbXZbSSgxLDIpXSk7CisgICAgclsyXVswXSA9IGRldDIyKG12W0koMSwwKV0sIG12W0koMiwwKV0sIG12W0koMSwxKV0sIG12W0koMiwxKV0pOworICAgIHJbMl1bMV0gPW5kZXQyMihtdltJKDAsMCldLCBtdltJKDIsMCldLCBtdltJKDAsMSldLCBtdltJKDIsMSldKTsKKyAgICByWzJdWzJdID0gZGV0MjIobXZbSSgwLDApXSwgbXZbSSgxLDApXSwgbXZbSSgwLDEpXSwgbXZbSSgxLDEpXSk7ICAgICAgICAKKworICAgIEdMZmxvYXQgcmRldDsKKyAgICBpZiAocmVzY2FsZU5vcm1hbHMgPT0gR0xfUkVTQ0FMRV9OT1JNQUwpIHsKKyAgICAgICAgcmRldCA9IHJzcXJ0ZihzcXJmKHJbMF1bMl0pICsgc3FyZihyWzFdWzJdKSArIHNxcmYoclsyXVsyXSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJkZXQgPSByZWNpcHJvY2FsZiggCisgICAgICAgICAgICByWzBdWzBdKm12W0koMCwwKV0gKyByWzBdWzFdKm12W0koMSwwKV0gKyByWzBdWzJdKm12W0koMiwwKV0pOworICAgIH0KKworICAgIEdMZml4ZWQqIGNvbnN0IHggPSBtdnVpLm1hdHJpeC5tOworICAgIGZvciAoaW50IGk9MCA7IGk8MyA7IGkrKykgeworICAgICAgICB4W0koaSwwKV0gPSBnZ2xGbG9hdFRvRml4ZWQocltpXVswXSAqIHJkZXQpOworICAgICAgICB4W0koaSwxKV0gPSBnZ2xGbG9hdFRvRml4ZWQocltpXVsxXSAqIHJkZXQpOworICAgICAgICB4W0koaSwyKV0gPSBnZ2xGbG9hdFRvRml4ZWQocltpXVsyXSAqIHJkZXQpOworICAgIH0KKyAgICBtdnVpLnBpY2tlcigpOworfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHRyYW5zZm9ybWF0aW9uIGFuZCBtYXRyaWNlcyBBUEkKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZiAwCisjcHJhZ21hIG1hcmsgLQorI3ByYWdtYSBtYXJrIHRyYW5zZm9ybWF0aW9uIGFuZCBtYXRyaWNlcyBBUEkKKyNlbmRpZgorCitpbnQgb2dsZXNfc3VyZmFjZXBvcnQob2dsZXNfY29udGV4dF90KiBjLCBHTGludCB4LCBHTGludCB5KQoreworICAgIGMtPnZpZXdwb3J0LnN1cmZhY2Vwb3J0LnggPSB4OworICAgIGMtPnZpZXdwb3J0LnN1cmZhY2Vwb3J0LnkgPSB5OworCisgICAgb2dsZXNfdmlld3BvcnQoYywgCisgICAgICAgICAgICBjLT52aWV3cG9ydC54LAorICAgICAgICAgICAgYy0+dmlld3BvcnQueSwKKyAgICAgICAgICAgIGMtPnZpZXdwb3J0LncsCisgICAgICAgICAgICBjLT52aWV3cG9ydC5oKTsKKworICAgIG9nbGVzX3NjaXNzb3IoYywKKyAgICAgICAgICAgIGMtPnZpZXdwb3J0LnNjaXNzb3IueCwKKyAgICAgICAgICAgIGMtPnZpZXdwb3J0LnNjaXNzb3IueSwKKyAgICAgICAgICAgIGMtPnZpZXdwb3J0LnNjaXNzb3IudywKKyAgICAgICAgICAgIGMtPnZpZXdwb3J0LnNjaXNzb3IuaCk7CisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBvZ2xlc19zY2lzc29yKG9nbGVzX2NvbnRleHRfdCogYywgCisgICAgICAgIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgdywgR0xzaXplaSBoKQoreworICAgIGlmICgod3xoKSA8IDApIHsKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYy0+dmlld3BvcnQuc2Npc3Nvci54ID0geDsKKyAgICBjLT52aWV3cG9ydC5zY2lzc29yLnkgPSB5OworICAgIGMtPnZpZXdwb3J0LnNjaXNzb3IudyA9IHc7CisgICAgYy0+dmlld3BvcnQuc2Npc3Nvci5oID0gaDsKKyAgICAKKyAgICB4ICs9IGMtPnZpZXdwb3J0LnN1cmZhY2Vwb3J0Lng7CisgICAgeSArPSBjLT52aWV3cG9ydC5zdXJmYWNlcG9ydC55OworCisgICAgeSA9IGMtPnJhc3Rlcml6ZXIuc3RhdGUuYnVmZmVycy5jb2xvci5oZWlnaHQgLSAoeSArIGgpOworICAgIGMtPnJhc3Rlcml6ZXIucHJvY3Muc2Npc3NvcihjLCB4LCB5LCB3LCBoKTsKK30KKwordm9pZCBvZ2xlc192aWV3cG9ydChvZ2xlc19jb250ZXh0X3QqIGMsCisgICAgICAgIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgdywgR0xzaXplaSBoKQoreworICAgIGlmICgod3xoKTwwKSB7CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYy0+dmlld3BvcnQueCA9IHg7CisgICAgYy0+dmlld3BvcnQueSA9IHk7CisgICAgYy0+dmlld3BvcnQudyA9IHc7CisgICAgYy0+dmlld3BvcnQuaCA9IGg7CisKKyAgICB4ICs9IGMtPnZpZXdwb3J0LnN1cmZhY2Vwb3J0Lng7CisgICAgeSArPSBjLT52aWV3cG9ydC5zdXJmYWNlcG9ydC55OworCisgICAgR0xpbnQgSCA9IGMtPnJhc3Rlcml6ZXIuc3RhdGUuYnVmZmVycy5jb2xvci5oZWlnaHQ7CisgICAgR0xmbG9hdCBzeCA9IGRpdjJmKHcpOworICAgIEdMZmxvYXQgb3ggPSBzeCArIHg7CisgICAgR0xmbG9hdCBzeSA9IGRpdjJmKGgpOworICAgIEdMZmxvYXQgb3kgPSBzeSAtIHkgKyAoSCAtIGgpOworCisgICAgR0xmbG9hdCBuZWFyID0gYy0+dHJhbnNmb3Jtcy52cHQuek5lYXI7CisgICAgR0xmbG9hdCBmYXIgID0gYy0+dHJhbnNmb3Jtcy52cHQuekZhcjsKKyAgICBHTGZsb2F0IEEgPSBkaXYyZihmYXIgLSBuZWFyKTsKKyAgICBHTGZsb2F0IEIgPSBkaXYyZihmYXIgKyBuZWFyKTsKKworICAgIC8vIGNvbXB1dGUgdmlld3BvcnQgbWF0cml4CisgICAgR0xmbG9hdCogY29uc3QgZiA9IGMtPnRyYW5zZm9ybXMudnB0Lm1hdHJpeC5lZGl0RWxlbWVudHMoKTsKKyAgICBmWzBdID0gc3g7ICBmWzRdID0gMDsgICBmWyA4XSA9IDA7ICBmWzEyXSA9IG94OworICAgIGZbMV0gPSAwOyAgIGZbNV0gPS1zeTsgIGZbIDldID0gMDsgIGZbMTNdID0gb3k7CisgICAgZlsyXSA9IDA7ICAgZls2XSA9IDA7ICAgZlsxMF0gPSBBOyAgZlsxNF0gPSBCOworICAgIGZbM10gPSAwOyAgIGZbN10gPSAwOyAgIGZbMTFdID0gMDsgIGZbMTVdID0gMTsKKyAgICBjLT50cmFuc2Zvcm1zLmRpcnR5IHw9IHRyYW5zZm9ybV9zdGF0ZV90OjpWSUVXUE9SVDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIDAKKyNwcmFnbWEgbWFyayAtCisjcHJhZ21hIG1hcmsgbWF0cml4ICogdmVydGV4CisjZW5kaWYKKwordm9pZCBwb2ludDJfX2dlbmVyaWModHJhbnNmb3JtX3QgY29uc3QqIG14LCB2ZWM0X3QqIGxocywgdmVjNF90IGNvbnN0KiByaHMpIHsKKyAgICBjb25zdCBHTGZpeGVkKiBjb25zdCBtID0gbXgtPm1hdHJpeC5tOworICAgIGNvbnN0IEdMZml4ZWQgcnggPSByaHMtPng7CisgICAgY29uc3QgR0xmaXhlZCByeSA9IHJocy0+eTsKKyAgICBsaHMtPnggPSBtbGEyYShyeCwgbVsgMF0sIHJ5LCBtWyA0XSwgbVsxMl0pOyAKKyAgICBsaHMtPnkgPSBtbGEyYShyeCwgbVsgMV0sIHJ5LCBtWyA1XSwgbVsxM10pOworICAgIGxocy0+eiA9IG1sYTJhKHJ4LCBtWyAyXSwgcnksIG1bIDZdLCBtWzE0XSk7CisgICAgbGhzLT53ID0gbWxhMmEocngsIG1bIDNdLCByeSwgbVsgN10sIG1bMTVdKTsKK30KKwordm9pZCBwb2ludDNfX2dlbmVyaWModHJhbnNmb3JtX3QgY29uc3QqIG14LCB2ZWM0X3QqIGxocywgdmVjNF90IGNvbnN0KiByaHMpIHsKKyAgICBjb25zdCBHTGZpeGVkKiBjb25zdCBtID0gbXgtPm1hdHJpeC5tOworICAgIGNvbnN0IEdMZml4ZWQgcnggPSByaHMtPng7CisgICAgY29uc3QgR0xmaXhlZCByeSA9IHJocy0+eTsKKyAgICBjb25zdCBHTGZpeGVkIHJ6ID0gcmhzLT56OworICAgIGxocy0+eCA9IG1sYTNhKHJ4LCBtWyAwXSwgcnksIG1bIDRdLCByeiwgbVsgOF0sIG1bMTJdKTsgCisgICAgbGhzLT55ID0gbWxhM2EocngsIG1bIDFdLCByeSwgbVsgNV0sIHJ6LCBtWyA5XSwgbVsxM10pOworICAgIGxocy0+eiA9IG1sYTNhKHJ4LCBtWyAyXSwgcnksIG1bIDZdLCByeiwgbVsxMF0sIG1bMTRdKTsKKyAgICBsaHMtPncgPSBtbGEzYShyeCwgbVsgM10sIHJ5LCBtWyA3XSwgcnosIG1bMTFdLCBtWzE1XSk7Cit9CisKK3ZvaWQgcG9pbnQ0X19nZW5lcmljKHRyYW5zZm9ybV90IGNvbnN0KiBteCwgdmVjNF90KiBsaHMsIHZlYzRfdCBjb25zdCogcmhzKSB7CisgICAgY29uc3QgR0xmaXhlZCogY29uc3QgbSA9IG14LT5tYXRyaXgubTsKKyAgICBjb25zdCBHTGZpeGVkIHJ4ID0gcmhzLT54OworICAgIGNvbnN0IEdMZml4ZWQgcnkgPSByaHMtPnk7CisgICAgY29uc3QgR0xmaXhlZCByeiA9IHJocy0+ejsKKyAgICBjb25zdCBHTGZpeGVkIHJ3ID0gcmhzLT53OworICAgIGxocy0+eCA9IG1sYTQocngsIG1bIDBdLCByeSwgbVsgNF0sIHJ6LCBtWyA4XSwgcncsIG1bMTJdKTsgCisgICAgbGhzLT55ID0gbWxhNChyeCwgbVsgMV0sIHJ5LCBtWyA1XSwgcnosIG1bIDldLCBydywgbVsxM10pOworICAgIGxocy0+eiA9IG1sYTQocngsIG1bIDJdLCByeSwgbVsgNl0sIHJ6LCBtWzEwXSwgcncsIG1bMTRdKTsKKyAgICBsaHMtPncgPSBtbGE0KHJ4LCBtWyAzXSwgcnksIG1bIDddLCByeiwgbVsxMV0sIHJ3LCBtWzE1XSk7Cit9CisKK3ZvaWQgbm9ybWFsX19nZW5lcmljKHRyYW5zZm9ybV90IGNvbnN0KiBteCwgdmVjNF90KiBsaHMsIHZlYzRfdCBjb25zdCogcmhzKSB7CisgICAgY29uc3QgR0xmaXhlZCogY29uc3QgbSA9IG14LT5tYXRyaXgubTsKKyAgICBjb25zdCBHTGZpeGVkIHJ4ID0gcmhzLT54OworICAgIGNvbnN0IEdMZml4ZWQgcnkgPSByaHMtPnk7CisgICAgY29uc3QgR0xmaXhlZCByeiA9IHJocy0+ejsKKyAgICBsaHMtPnggPSBtbGEzKHJ4LCBtWyAwXSwgcnksIG1bIDRdLCByeiwgbVsgOF0pOyAKKyAgICBsaHMtPnkgPSBtbGEzKHJ4LCBtWyAxXSwgcnksIG1bIDVdLCByeiwgbVsgOV0pOworICAgIGxocy0+eiA9IG1sYTMocngsIG1bIDJdLCByeSwgbVsgNl0sIHJ6LCBtWzEwXSk7Cit9CisKKwordm9pZCBwb2ludDJfX25vcCh0cmFuc2Zvcm1fdCBjb25zdCosIHZlYzRfdCogbGhzLCB2ZWM0X3QgY29uc3QqIHJocykgeworICAgIGxocy0+eiA9IDA7CisgICAgbGhzLT53ID0gMHgxMDAwMDsKKyAgICBpZiAobGhzICE9IHJocykgeworICAgICAgICBsaHMtPnggPSByaHMtPng7CisgICAgICAgIGxocy0+eSA9IHJocy0+eTsKKyAgICB9Cit9CisKK3ZvaWQgcG9pbnQzX19ub3AodHJhbnNmb3JtX3QgY29uc3QqLCB2ZWM0X3QqIGxocywgdmVjNF90IGNvbnN0KiByaHMpIHsKKyAgICBsaHMtPncgPSAweDEwMDAwOworICAgIGlmIChsaHMgIT0gcmhzKSB7CisgICAgICAgIGxocy0+eCA9IHJocy0+eDsKKyAgICAgICAgbGhzLT55ID0gcmhzLT55OworICAgICAgICBsaHMtPnogPSByaHMtPno7CisgICAgfQorfQorCit2b2lkIHBvaW50NF9fbm9wKHRyYW5zZm9ybV90IGNvbnN0KiwgdmVjNF90KiBsaHMsIHZlYzRfdCBjb25zdCogcmhzKSB7CisgICAgaWYgKGxocyAhPSByaHMpCisgICAgICAgICpsaHMgPSAqcmhzOworfQorCisKK3N0YXRpYyB2b2lkIGZydXN0dW1mKAorICAgICAgICAgICAgR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCAKKyAgICAgICAgICAgIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwKKyAgICAgICAgICAgIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhciwKKyAgICAgICAgICAgIG9nbGVzX2NvbnRleHRfdCogYykKKyAgICB7CisgICAgaWYgKGNtcGYobGVmdCxyaWdodCkgfHwKKyAgICAgICAgY21wZih0b3AsIGJvdHRvbSkgfHwKKyAgICAgICAgY21wZih6TmVhciwgekZhcikgfHwKKyAgICAgICAgaXNaZXJvT3JOZWdhdGl2ZWYoek5lYXIpIHx8CisgICAgICAgIGlzWmVyb09yTmVnYXRpdmVmKHpGYXIpKQorICAgIHsKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY29uc3QgR0xmbG9hdCByX3dpZHRoICA9IHJlY2lwcm9jYWxmKHJpZ2h0IC0gbGVmdCk7CisgICAgY29uc3QgR0xmbG9hdCByX2hlaWdodCA9IHJlY2lwcm9jYWxmKHRvcCAtIGJvdHRvbSk7CisgICAgY29uc3QgR0xmbG9hdCByX2RlcHRoICA9IHJlY2lwcm9jYWxmKHpOZWFyIC0gekZhcik7CisgICAgY29uc3QgR0xmbG9hdCB4ID0gbXVsMmYoek5lYXIgKiByX3dpZHRoKTsKKyAgICBjb25zdCBHTGZsb2F0IHkgPSBtdWwyZih6TmVhciAqIHJfaGVpZ2h0KTsKKyAgICBjb25zdCBHTGZsb2F0IEEgPSBtdWwyZigocmlnaHQgKyBsZWZ0KSAqIHJfd2lkdGgpOworICAgIGNvbnN0IEdMZmxvYXQgQiA9ICh0b3AgKyBib3R0b20pICogcl9oZWlnaHQ7CisgICAgY29uc3QgR0xmbG9hdCBDID0gKHpGYXIgKyB6TmVhcikgKiByX2RlcHRoOworICAgIGNvbnN0IEdMZmxvYXQgRCA9IG11bDJmKHpGYXIgKiB6TmVhciAqIHJfZGVwdGgpOworICAgIEdMZmxvYXQgZlsxNl07CisgICAgZlsgMF0gPSB4OworICAgIGZbIDVdID0geTsKKyAgICBmWyA4XSA9IEE7CisgICAgZlsgOV0gPSBCOworICAgIGZbMTBdID0gQzsKKyAgICBmWzE0XSA9IEQ7CisgICAgZlsxMV0gPSAtMS4wZjsKKyAgICBmWyAxXSA9IGZbIDJdID0gZlsgM10gPQorICAgIGZbIDRdID0gZlsgNl0gPSBmWyA3XSA9CisgICAgZlsxMl0gPSBmWzEzXSA9IGZbMTVdID0gMC4wZjsKKworICAgIG1hdHJpeGZfdCByaHM7CisgICAgcmhzLnNldChmKTsKKyAgICBjLT50cmFuc2Zvcm1zLmN1cnJlbnQtPm11bHRpcGx5KHJocyk7CisgICAgYy0+dHJhbnNmb3Jtcy5pbnZhbGlkYXRlKCk7Cit9CisKK3N0YXRpYyB2b2lkIG9ydGhvZiggCisgICAgICAgIEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwgCisgICAgICAgIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwKKyAgICAgICAgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyLAorICAgICAgICBvZ2xlc19jb250ZXh0X3QqIGMpCit7CisgICAgaWYgKGNtcGYobGVmdCxyaWdodCkgfHwKKyAgICAgICAgY21wZih0b3AsIGJvdHRvbSkgfHwKKyAgICAgICAgY21wZih6TmVhciwgekZhcikpCisgICAgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjb25zdCBHTGZsb2F0IHJfd2lkdGggID0gcmVjaXByb2NhbGYocmlnaHQgLSBsZWZ0KTsKKyAgICBjb25zdCBHTGZsb2F0IHJfaGVpZ2h0ID0gcmVjaXByb2NhbGYodG9wIC0gYm90dG9tKTsKKyAgICBjb25zdCBHTGZsb2F0IHJfZGVwdGggID0gcmVjaXByb2NhbGYoekZhciAtIHpOZWFyKTsKKyAgICBjb25zdCBHTGZsb2F0IHggPSAgbXVsMmYocl93aWR0aCk7CisgICAgY29uc3QgR0xmbG9hdCB5ID0gIG11bDJmKHJfaGVpZ2h0KTsKKyAgICBjb25zdCBHTGZsb2F0IHogPSAtbXVsMmYocl9kZXB0aCk7CisgICAgY29uc3QgR0xmbG9hdCB0eCA9IC0ocmlnaHQgKyBsZWZ0KSAqIHJfd2lkdGg7CisgICAgY29uc3QgR0xmbG9hdCB0eSA9IC0odG9wICsgYm90dG9tKSAqIHJfaGVpZ2h0OworICAgIGNvbnN0IEdMZmxvYXQgdHogPSAtKHpGYXIgKyB6TmVhcikgKiByX2RlcHRoOworICAgIEdMZmxvYXQgZlsxNl07CisgICAgZlsgMF0gPSB4OworICAgIGZbIDVdID0geTsKKyAgICBmWzEwXSA9IHo7CisgICAgZlsxMl0gPSB0eDsKKyAgICBmWzEzXSA9IHR5OworICAgIGZbMTRdID0gdHo7CisgICAgZlsxNV0gPSAxLjBmOworICAgIGZbIDFdID0gZlsgMl0gPSBmWyAzXSA9CisgICAgZlsgNF0gPSBmWyA2XSA9IGZbIDddID0KKyAgICBmWyA4XSA9IGZbIDldID0gZlsxMV0gPSAwLjBmOworICAgIG1hdHJpeGZfdCByaHM7CisgICAgcmhzLnNldChmKTsKKyAgICBjLT50cmFuc2Zvcm1zLmN1cnJlbnQtPm11bHRpcGx5KHJocyk7CisgICAgYy0+dHJhbnNmb3Jtcy5pbnZhbGlkYXRlKCk7Cit9CisKK3N0YXRpYyB2b2lkIGRlcHRoUmFuZ2VmKEdMY2xhbXBmIHpOZWFyLCBHTGNsYW1wZiB6RmFyLCBvZ2xlc19jb250ZXh0X3QqIGMpCit7CisgICAgek5lYXIgPSBjbGFtcFRvWmVyb2Yoek5lYXIgPiAxID8gMSA6IHpOZWFyKTsKKyAgICB6RmFyICA9IGNsYW1wVG9aZXJvZih6RmFyICA+IDEgPyAxIDogekZhcik7CisgICAgR0xmbG9hdCogY29uc3QgZiA9IGMtPnRyYW5zZm9ybXMudnB0Lm1hdHJpeC5lZGl0RWxlbWVudHMoKTsKKyAgICBmWzEwXSA9IGRpdjJmKHpGYXIgLSB6TmVhcik7CisgICAgZlsxNF0gPSBkaXYyZih6RmFyICsgek5lYXIpOworICAgIGMtPnRyYW5zZm9ybXMuZGlydHkgfD0gdHJhbnNmb3JtX3N0YXRlX3Q6OlZJRVdQT1JUOworICAgIGMtPnRyYW5zZm9ybXMudnB0LnpOZWFyID0gek5lYXI7CisgICAgYy0+dHJhbnNmb3Jtcy52cHQuekZhciAgPSB6RmFyOworfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCit2b2lkIGdsTWF0cml4TW9kZShHTGVudW0gbW9kZSkKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIG1hdHJpeF9zdGFja190KiBzdGFjayA9IDA7CisgICAgc3dpdGNoIChtb2RlKSB7CisgICAgY2FzZSBHTF9NT0RFTFZJRVc6CisgICAgICAgIHN0YWNrID0gJmMtPnRyYW5zZm9ybXMubW9kZWx2aWV3OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX1BST0pFQ1RJT046CisgICAgICAgIHN0YWNrID0gJmMtPnRyYW5zZm9ybXMucHJvamVjdGlvbjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9URVhUVVJFOgorICAgICAgICBzdGFjayA9ICZjLT50cmFuc2Zvcm1zLnRleHR1cmVbYy0+dGV4dHVyZXMuYWN0aXZlXTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjLT50cmFuc2Zvcm1zLm1hdHJpeE1vZGUgPSBtb2RlOworICAgIGMtPnRyYW5zZm9ybXMuY3VycmVudCA9IHN0YWNrOworfQorCit2b2lkIGdsTG9hZElkZW50aXR5KCkKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGMtPnRyYW5zZm9ybXMuY3VycmVudC0+bG9hZElkZW50aXR5KCk7IC8vIGFsc28gbG9hZHMgdGhlIEdMZml4ZWQgdHJhbnNmb3JtCisgICAgYy0+dHJhbnNmb3Jtcy5pbnZhbGlkYXRlKCk7CisgICAgYy0+dHJhbnNmb3Jtcy5jdXJyZW50LT5kaXJ0eSA9IDA7Cit9CisKK3ZvaWQgZ2xMb2FkTWF0cml4Zihjb25zdCBHTGZsb2F0KiBtKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgYy0+dHJhbnNmb3Jtcy5jdXJyZW50LT5sb2FkKG0pOworICAgIGMtPnRyYW5zZm9ybXMuaW52YWxpZGF0ZSgpOworfQorCit2b2lkIGdsTG9hZE1hdHJpeHgoY29uc3QgR0xmaXhlZCogbSkKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGMtPnRyYW5zZm9ybXMuY3VycmVudC0+bG9hZChtKTsgLy8gYWxzbyBsb2FkcyB0aGUgR0xmaXhlZCB0cmFuc2Zvcm0KKyAgICBjLT50cmFuc2Zvcm1zLmludmFsaWRhdGUoKTsKKyAgICBjLT50cmFuc2Zvcm1zLmN1cnJlbnQtPmRpcnR5ICY9IH5tYXRyaXhfc3RhY2tfdDo6RE9fRkxPQVRfVE9fRklYRUQ7Cit9CisKK3ZvaWQgZ2xNdWx0TWF0cml4Zihjb25zdCBHTGZsb2F0KiBtKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgbWF0cml4Zl90IHJoczsKKyAgICByaHMuc2V0KG0pOworICAgIGMtPnRyYW5zZm9ybXMuY3VycmVudC0+bXVsdGlwbHkocmhzKTsKKyAgICBjLT50cmFuc2Zvcm1zLmludmFsaWRhdGUoKTsKK30KKwordm9pZCBnbE11bHRNYXRyaXh4KGNvbnN0IEdMZml4ZWQqIG0pCit7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBtYXRyaXhmX3QgcmhzOworICAgIHJocy5zZXQobSk7CisgICAgYy0+dHJhbnNmb3Jtcy5jdXJyZW50LT5tdWx0aXBseShyaHMpOworICAgIGMtPnRyYW5zZm9ybXMuaW52YWxpZGF0ZSgpOworfQorCit2b2lkIGdsUG9wTWF0cml4KCkKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIEdMaW50IGVyciA9IGMtPnRyYW5zZm9ybXMuY3VycmVudC0+cG9wKCk7CisgICAgaWYgKGdnbF91bmxpa2VseShlcnIpKSB7CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIGVycik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYy0+dHJhbnNmb3Jtcy5pbnZhbGlkYXRlKCk7Cit9CisKK3ZvaWQgZ2xQdXNoTWF0cml4KCkKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIEdMaW50IGVyciA9IGMtPnRyYW5zZm9ybXMuY3VycmVudC0+cHVzaCgpOworICAgIGlmIChnZ2xfdW5saWtlbHkoZXJyKSkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBlcnIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGMtPnRyYW5zZm9ybXMuaW52YWxpZGF0ZSgpOworfQorCit2b2lkIGdsRnJ1c3R1bWYoCisgICAgICAgIEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwgCisgICAgICAgIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwKKyAgICAgICAgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgZnJ1c3R1bWYobGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCB6TmVhciwgekZhciwgYyk7Cit9CisKK3ZvaWQgZ2xGcnVzdHVteCggCisgICAgICAgIEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwKKyAgICAgICAgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLAorICAgICAgICBHTGZpeGVkIHpOZWFyLCBHTGZpeGVkIHpGYXIpCit7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBmcnVzdHVtZiggZml4ZWRUb0Zsb2F0KGxlZnQpLCBmaXhlZFRvRmxvYXQocmlnaHQpLAorICAgICAgICAgICAgICBmaXhlZFRvRmxvYXQoYm90dG9tKSwgZml4ZWRUb0Zsb2F0KHRvcCksCisgICAgICAgICAgICAgIGZpeGVkVG9GbG9hdCh6TmVhciksIGZpeGVkVG9GbG9hdCh6RmFyKSwKKyAgICAgICAgICAgICAgYyk7Cit9CisKK3ZvaWQgZ2xPcnRob2YoIAorICAgICAgICBHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIAorICAgICAgICBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsCisgICAgICAgIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhcikKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIG9ydGhvZihsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIHpOZWFyLCB6RmFyLCBjKTsKK30KKwordm9pZCBnbE9ydGhveCgKKyAgICAgICAgR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LAorICAgICAgICBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsCisgICAgICAgIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhcikKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIG9ydGhvZiggZml4ZWRUb0Zsb2F0KGxlZnQpLCBmaXhlZFRvRmxvYXQocmlnaHQpLAorICAgICAgICAgICAgZml4ZWRUb0Zsb2F0KGJvdHRvbSksIGZpeGVkVG9GbG9hdCh0b3ApLAorICAgICAgICAgICAgZml4ZWRUb0Zsb2F0KHpOZWFyKSwgZml4ZWRUb0Zsb2F0KHpGYXIpLAorICAgICAgICAgICAgYyk7Cit9CisKK3ZvaWQgZ2xSb3RhdGVmKEdMZmxvYXQgYSwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeikKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGMtPnRyYW5zZm9ybXMuY3VycmVudC0+cm90YXRlKGEsIHgsIHksIHopOworICAgIGMtPnRyYW5zZm9ybXMuaW52YWxpZGF0ZSgpOworfQorCit2b2lkIGdsUm90YXRleChHTGZpeGVkIGEsIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopCit7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBjLT50cmFuc2Zvcm1zLmN1cnJlbnQtPnJvdGF0ZSggCisgICAgICAgICAgICBmaXhlZFRvRmxvYXQoYSksIGZpeGVkVG9GbG9hdCh4KSwKKyAgICAgICAgICAgIGZpeGVkVG9GbG9hdCh5KSwgZml4ZWRUb0Zsb2F0KHopKTsKKyAgICBjLT50cmFuc2Zvcm1zLmludmFsaWRhdGUoKTsKK30KKwordm9pZCBnbFNjYWxlZihHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgYy0+dHJhbnNmb3Jtcy5jdXJyZW50LT5zY2FsZSh4LCB5LCB6KTsKKyAgICBjLT50cmFuc2Zvcm1zLmludmFsaWRhdGUoKTsKK30KKwordm9pZCBnbFNjYWxleChHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgYy0+dHJhbnNmb3Jtcy5jdXJyZW50LT5zY2FsZSgKKyAgICAgICAgICAgIGZpeGVkVG9GbG9hdCh4KSwgZml4ZWRUb0Zsb2F0KHkpLCBmaXhlZFRvRmxvYXQoeikpOworICAgIGMtPnRyYW5zZm9ybXMuaW52YWxpZGF0ZSgpOworfQorCit2b2lkIGdsVHJhbnNsYXRlZihHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgYy0+dHJhbnNmb3Jtcy5jdXJyZW50LT50cmFuc2xhdGUoeCwgeSwgeik7CisgICAgYy0+dHJhbnNmb3Jtcy5pbnZhbGlkYXRlKCk7Cit9CisKK3ZvaWQgZ2xUcmFuc2xhdGV4KEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopCit7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBjLT50cmFuc2Zvcm1zLmN1cnJlbnQtPnRyYW5zbGF0ZSgKKyAgICAgICAgICAgIGZpeGVkVG9GbG9hdCh4KSwgZml4ZWRUb0Zsb2F0KHkpLCBmaXhlZFRvRmxvYXQoeikpOworICAgIGMtPnRyYW5zZm9ybXMuaW52YWxpZGF0ZSgpOworfQorCit2b2lkIGdsU2Npc3NvcihHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHcsIEdMc2l6ZWkgaCkKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIG9nbGVzX3NjaXNzb3IoYywgeCwgeSwgdywgaCk7Cit9CisKK3ZvaWQgZ2xWaWV3cG9ydChHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHcsIEdMc2l6ZWkgaCkKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIG9nbGVzX3ZpZXdwb3J0KGMsIHgsIHksIHcsIGgpOworfQorCit2b2lkIGdsRGVwdGhSYW5nZWYoR0xjbGFtcGYgek5lYXIsIEdMY2xhbXBmIHpGYXIpCit7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBkZXB0aFJhbmdlZih6TmVhciwgekZhciwgYyk7Cit9CisKK3ZvaWQgZ2xEZXB0aFJhbmdleChHTGNsYW1weCB6TmVhciwgR0xjbGFtcHggekZhcikKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGRlcHRoUmFuZ2VmKGZpeGVkVG9GbG9hdCh6TmVhciksIGZpeGVkVG9GbG9hdCh6RmFyKSwgYyk7Cit9CisKK3ZvaWQgZ2xQb2x5Z29uT2Zmc2V0eChHTGZpeGVkIGZhY3RvciwgR0xmaXhlZCB1bml0cykKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGMtPnBvbHlnb25PZmZzZXQuZmFjdG9yID0gZmFjdG9yOworICAgIGMtPnBvbHlnb25PZmZzZXQudW5pdHMgPSB1bml0czsKK30KKwordm9pZCBnbFBvbHlnb25PZmZzZXQoR0xmbG9hdCBmYWN0b3IsIEdMZmxvYXQgdW5pdHMpCit7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBjLT5wb2x5Z29uT2Zmc2V0LmZhY3RvciA9IGdnbEZsb2F0VG9GaXhlZChmYWN0b3IpOworICAgIGMtPnBvbHlnb25PZmZzZXQudW5pdHMgPSBnZ2xGbG9hdFRvRml4ZWQodW5pdHMpOworfQorCitHTGJpdGZpZWxkIGdsUXVlcnlNYXRyaXh4T0VTKEdMZml4ZWQqIG0sIEdMaW50KiBlKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgR0xiaXRmaWVsZCBzdGF0dXMgPSAwOworICAgIEdMZmxvYXQgY29uc3QqIGYgPSBjLT50cmFuc2Zvcm1zLmN1cnJlbnQtPnRvcCgpLmVsZW1lbnRzKCk7CisgICAgZm9yICAoaW50IGk9MCA7IGk8MTYgOyBpKyspIHsKKyAgICAgICAgaWYgKGlzbmFuKGZbaV0pIHx8IGlzaW5mKGZbaV0pKSB7CisgICAgICAgICAgICBzdGF0dXMgfD0gMTw8aTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGVbaV0gPSBleHBvbmVudChmW2ldKSAtIDc7CisgICAgICAgIG1baV0gPSBtYW50aXNzYShmW2ldKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvbWF0cml4LmggYi9vcGVuZ2wvbGliYWdsL21hdHJpeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YTM4YTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvbGliYWdsL21hdHJpeC5oCkBAIC0wLDAgKzEsMzU1IEBACisvKiBsaWJzL29wZW5nbGVzL21hdHJpeC5oCisqKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2lmbmRlZiBBTkRST0lEX09QRU5HTEVTX01BVFJJWF9ICisjZGVmaW5lIEFORFJPSURfT1BFTkdMRVNfTUFUUklYX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8cHJpdmF0ZS9waXhlbGZsaW5nZXIvZ2dsX2NvbnRleHQuaD4KKworI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdCBpbnQgT0dMRVNfTU9ERUxWSUVXX1NUQUNLX0RFUFRIICAgPSAxNjsKK2NvbnN0IGludCBPR0xFU19QUk9KRUNUSU9OX1NUQUNLX0RFUFRIICA9ICAyOworY29uc3QgaW50IE9HTEVTX1RFWFRVUkVfU1RBQ0tfREVQVEggICAgID0gIDI7CisKK3ZvaWQgb2dsZXNfaW5pdF9tYXRyaXgob2dsZXNfY29udGV4dF90Kik7Cit2b2lkIG9nbGVzX3VuaW5pdF9tYXRyaXgob2dsZXNfY29udGV4dF90Kik7Cit2b2lkIG9nbGVzX2ludmFsaWRhdGVfcGVyc3BlY3RpdmUob2dsZXNfY29udGV4dF90KiBjKTsKK3ZvaWQgb2dsZXNfdmFsaWRhdGVfdHJhbnNmb3JtX2ltcGwob2dsZXNfY29udGV4dF90KiBjLCB1aW50MzJfdCB3YW50KTsKKworaW50IG9nbGVzX3N1cmZhY2Vwb3J0KG9nbGVzX2NvbnRleHRfdCogYywgR0xpbnQgeCwgR0xpbnQgeSk7CisKK3ZvaWQgb2dsZXNfc2Npc3NvcihvZ2xlc19jb250ZXh0X3QqIGMsIAorICAgICAgICBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHcsIEdMc2l6ZWkgaCk7CisKK3ZvaWQgb2dsZXNfdmlld3BvcnQob2dsZXNfY29udGV4dF90KiBjLAorICAgICAgICBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHcsIEdMc2l6ZWkgaCk7CisKK2lubGluZSB2b2lkIG9nbGVzX3ZhbGlkYXRlX3RyYW5zZm9ybSgKKyAgICAgICAgb2dsZXNfY29udGV4dF90KiBjLCB1aW50MzJfdCB3YW50KQoreworICAgIGlmIChjLT50cmFuc2Zvcm1zLmRpcnR5ICYgd2FudCkKKyAgICAgICAgb2dsZXNfdmFsaWRhdGVfdHJhbnNmb3JtX2ltcGwoYywgd2FudCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW5saW5lCitHTGZpeGVkIHZzcXVhcmUzKEdMZml4ZWQgYSwgR0xmaXhlZCBiLCBHTGZpeGVkIGMpIAoreworI2lmIGRlZmluZWQoX19hcm1fXykgJiYgIWRlZmluZWQoX190aHVtYl9fKQorCisgICAgR0xmaXhlZCByOworICAgIGludDMyX3QgdDsKKyAgICBhc20oCisgICAgICAgICJzbXVsbCAlMCwgJTEsICUyLCAlMiAgICAgICBcbiIKKyAgICAgICAgInNtbGFsICUwLCAlMSwgJTMsICUzICAgICAgIFxuIgorICAgICAgICAic21sYWwgJTAsICUxLCAlNCwgJTQgICAgICAgXG4iCisgICAgICAgICJtb3ZzICAlMCwgJTAsIGxzciAjMTYgICAgICBcbiIKKyAgICAgICAgImFkYyAgICUwLCAlMCwgJTEsIGxzbCAjMTYgIFxuIgorICAgICAgICA6ICAgIj0mciIociksICI9JnIiKHQpIAorICAgICAgICA6ICAgIiVyIihhKSwgInIiKGIpLCAiciIoYykKKyAgICAgICAgOiAgICJjYyIKKyAgICAgICAgKTsgCisgICAgcmV0dXJuIHI7CisKKyNlbHNlCisKKyAgICByZXR1cm4gKCggICBpbnQ2NF90KGEpKmEgKworICAgICAgICAgICAgICAgIGludDY0X3QoYikqYiArCisgICAgICAgICAgICAgICAgaW50NjRfdChjKSpjICsgMHg4MDAwKT4+MTYpOworCisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSBHTGZpeGVkIG1sYTJhKCBHTGZpeGVkIGEwLCBHTGZpeGVkIGIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZml4ZWQgYTEsIEdMZml4ZWQgYjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xmaXhlZCBjKQoreworI2lmIGRlZmluZWQoX19hcm1fXykgJiYgIWRlZmluZWQoX190aHVtYl9fKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIEdMZml4ZWQgcjsKKyAgICBpbnQzMl90IHQ7CisgICAgYXNtKAorICAgICAgICAic211bGwgJTAsICUxLCAlMiwgJTMgICAgICAgXG4iCisgICAgICAgICJzbWxhbCAlMCwgJTEsICU0LCAlNSAgICAgICBcbiIKKyAgICAgICAgImFkZCAgICUwLCAlNiwgJTAsIGxzciAjMTYgIFxuIgorICAgICAgICAiYWRkICAgJTAsICUwLCAlMSwgbHNsICMxNiAgXG4iCisgICAgICAgIDogICAiPSZyIihyKSwgIj0mciIodCkgCisgICAgICAgIDogICAiJXIiKGEwKSwgInIiKGIwKSwgCisgICAgICAgICAgICAiJXIiKGExKSwgInIiKGIxKSwKKyAgICAgICAgICAgICJyIihjKQorICAgICAgICA6CisgICAgICAgICk7IAorICAgIHJldHVybiByOworICAgIAorI2Vsc2UKKworICAgIHJldHVybiAoKCAgIGludDY0X3QoYTApKmIwICsKKyAgICAgICAgICAgICAgICBpbnQ2NF90KGExKSpiMSk+PjE2KSArIGM7CisKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIEdMZml4ZWQgbWxhM2EoIEdMZml4ZWQgYTAsIEdMZml4ZWQgYjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZml4ZWQgYTEsIEdMZml4ZWQgYjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZml4ZWQgYTIsIEdMZml4ZWQgYjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZml4ZWQgYykKK3sKKyNpZiBkZWZpbmVkKF9fYXJtX18pICYmICFkZWZpbmVkKF9fdGh1bWJfXykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBHTGZpeGVkIHI7CisgICAgaW50MzJfdCB0OworICAgIGFzbSgKKyAgICAgICAgInNtdWxsICUwLCAlMSwgJTIsICUzICAgICAgIFxuIgorICAgICAgICAic21sYWwgJTAsICUxLCAlNCwgJTUgICAgICAgXG4iCisgICAgICAgICJzbWxhbCAlMCwgJTEsICU2LCAlNyAgICAgICBcbiIKKyAgICAgICAgImFkZCAgICUwLCAlOCwgJTAsIGxzciAjMTYgIFxuIgorICAgICAgICAiYWRkICAgJTAsICUwLCAlMSwgbHNsICMxNiAgXG4iCisgICAgICAgIDogICAiPSZyIihyKSwgIj0mciIodCkgCisgICAgICAgIDogICAiJXIiKGEwKSwgInIiKGIwKSwKKyAgICAgICAgICAgICIlciIoYTEpLCAiciIoYjEpLAorICAgICAgICAgICAgIiVyIihhMiksICJyIihiMiksCisgICAgICAgICAgICAiciIoYykKKyAgICAgICAgOgorICAgICAgICApOyAKKyAgICByZXR1cm4gcjsKKyAgICAKKyNlbHNlCisKKyAgICByZXR1cm4gKCggICBpbnQ2NF90KGEwKSpiMCArCisgICAgICAgICAgICAgICAgaW50NjRfdChhMSkqYjEgKworICAgICAgICAgICAgICAgIGludDY0X3QoYTIpKmIyKT4+MTYpICsgYzsKKworI2VuZGlmCit9CisKKy8vIGIwLCBiMSwgYjIgYXJlIHNpZ25lZCAxNi1iaXQgcXVhbml0aWVzCisvLyB0aGF0IGhhdmUgYmVlbiBzaGlmdGVkIHJpZ2h0IGJ5ICdzaGlmdCcgYml0cyByZWxhdGl2ZSB0byBub3JtYWwKKy8vIFMxNi4xNiBmaXhlZCBwb2ludAorc3RhdGljIGlubGluZSBHTGZpeGVkIG1sYTNhMTYoIEdMZml4ZWQgYTAsIGludDMyX3QgYjFiMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGZpeGVkIGExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZml4ZWQgYTIsIGludDMyX3QgYjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgc2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xmaXhlZCBjKQoreworI2lmIGRlZmluZWQoX19hcm1fXykgJiYgIWRlZmluZWQoX190aHVtYl9fKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIEdMZml4ZWQgcjsKKyAgICBhc20oCisgICAgICAgICJzbXVsd2IgJTAsICUxLCAlMiAgICAgICAgICBcbiIKKyAgICAgICAgInNtbGF3dCAlMCwgJTMsICUyLCAlMCAgICAgIFxuIiAKKyAgICAgICAgInNtbGF3YiAlMCwgJTQsICU1LCAlMCAgICAgIFxuIgorICAgICAgICAiYWRkICAgICUwLCAlNywgJTAsIGxzbCAlNiAgXG4iCisgICAgICAgIDogICAiPSZyIihyKQorICAgICAgICA6ICAgInIiKGEwKSwgInIiKGIxYjApLAorICAgICAgICAgICAgInIiKGExKSwKKyAgICAgICAgICAgICJyIihhMiksICJyIihiMiksCisgICAgICAgICAgICAiciIoc2hpZnQpLAorICAgICAgICAgICAgInIiKGMpCisgICAgICAgIDoKKyAgICAgICAgKTsgCisgICAgcmV0dXJuIHI7CisgICAgCisjZWxzZQorCisgICAgaW50MzJfdCBhY2N1bTsKKyAgICBpbnQxNl90IGIwID0gYjFiMCAmIDB4ZmZmZjsKKyAgICBpbnQxNl90IGIxID0gKGIxYjAgPj4gMTYpICYgMHhmZmZmOworICAgIGFjY3VtICA9IGludDY0X3QoYTApKmludDE2X3QoYjApID4+IDE2OworICAgIGFjY3VtICs9IGludDY0X3QoYTEpKmludDE2X3QoYjEpID4+IDE2OworICAgIGFjY3VtICs9IGludDY0X3QoYTIpKmludDE2X3QoYjIpID4+IDE2OworICAgIGFjY3VtID0gKGFjY3VtIDw8IHNoaWZ0KSArIGM7CisgICAgcmV0dXJuIGFjY3VtOworCisjZW5kaWYKK30KKworCitzdGF0aWMgaW5saW5lIEdMZml4ZWQgbWxhM2ExNl9idGIoIEdMZml4ZWQgYTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZml4ZWQgYTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZml4ZWQgYTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYjFiMCwgaW50MzJfdCB4eGIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCBzaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xmaXhlZCBjKQoreworI2lmIGRlZmluZWQoX19hcm1fXykgJiYgIWRlZmluZWQoX190aHVtYl9fKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIEdMZml4ZWQgcjsKKyAgICBhc20oCisgICAgICAgICJzbXVsd2IgJTAsICUxLCAlNCAgICAgICAgICBcbiIKKyAgICAgICAgInNtbGF3dCAlMCwgJTIsICU0LCAlMCAgICAgIFxuIiAKKyAgICAgICAgInNtbGF3YiAlMCwgJTMsICU1LCAlMCAgICAgIFxuIgorICAgICAgICAiYWRkICAgICUwLCAlNywgJTAsIGxzbCAlNiAgXG4iCisgICAgICAgIDogICAiPSZyIihyKQorICAgICAgICA6ICAgInIiKGEwKSwKKyAgICAgICAgICAgICJyIihhMSksCisgICAgICAgICAgICAiciIoYTIpLAorICAgICAgICAgICAgInIiKGIxYjApLCAiciIoeHhiMiksCisgICAgICAgICAgICAiciIoc2hpZnQpLAorICAgICAgICAgICAgInIiKGMpCisgICAgICAgIDoKKyAgICAgICAgKTsgCisgICAgcmV0dXJuIHI7CisgICAgCisjZWxzZQorCisgICAgaW50MzJfdCBhY2N1bTsKKyAgICBpbnQxNl90IGIwID0gIGIxYjAgICAgICAgICYgMHhmZmZmOworICAgIGludDE2X3QgYjEgPSAoYjFiMCA+PiAxNikgJiAweGZmZmY7CisgICAgaW50MTZfdCBiMiA9ICB4eGIyICAgICAgICAmIDB4ZmZmZjsKKyAgICBhY2N1bSAgPSBpbnQ2NF90KGEwKSppbnQxNl90KGIwKSA+PiAxNjsKKyAgICBhY2N1bSArPSBpbnQ2NF90KGExKSppbnQxNl90KGIxKSA+PiAxNjsKKyAgICBhY2N1bSArPSBpbnQ2NF90KGEyKSppbnQxNl90KGIyKSA+PiAxNjsKKyAgICBhY2N1bSA9IChhY2N1bSA8PCBzaGlmdCkgKyBjOworICAgIHJldHVybiBhY2N1bTsKKworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgR0xmaXhlZCBtbGEzYTE2X2J0dCggR0xmaXhlZCBhMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xmaXhlZCBhMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xmaXhlZCBhMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBiMWIwLCBpbnQzMl90IGIyeHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IHNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGZpeGVkIGMpCit7CisjaWYgZGVmaW5lZChfX2FybV9fKSAmJiAhZGVmaW5lZChfX3RodW1iX18pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgR0xmaXhlZCByOworICAgIGFzbSgKKyAgICAgICAgInNtdWx3YiAlMCwgJTEsICU0ICAgICAgICAgIFxuIgorICAgICAgICAic21sYXd0ICUwLCAlMiwgJTQsICUwICAgICAgXG4iIAorICAgICAgICAic21sYXd0ICUwLCAlMywgJTUsICUwICAgICAgXG4iCisgICAgICAgICJhZGQgICAgJTAsICU3LCAlMCwgbHNsICU2ICBcbiIKKyAgICAgICAgOiAgICI9JnIiKHIpCisgICAgICAgIDogICAiciIoYTApLAorICAgICAgICAgICAgInIiKGExKSwKKyAgICAgICAgICAgICJyIihhMiksCisgICAgICAgICAgICAiciIoYjFiMCksICJyIihiMnh4KSwKKyAgICAgICAgICAgICJyIihzaGlmdCksCisgICAgICAgICAgICAiciIoYykKKyAgICAgICAgOgorICAgICAgICApOyAKKyAgICByZXR1cm4gcjsKKyAgICAKKyNlbHNlCisKKyAgICBpbnQzMl90IGFjY3VtOworICAgIGludDE2X3QgYjAgPSAgYjFiMCAgICAgICAgJiAweGZmZmY7CisgICAgaW50MTZfdCBiMSA9IChiMWIwID4+IDE2KSAmIDB4ZmZmZjsKKyAgICBpbnQxNl90IGIyID0gKGIyeHggPj4gMTYpICYgMHhmZmZmOworICAgIGFjY3VtICA9IGludDY0X3QoYTApKmludDE2X3QoYjApID4+IDE2OworICAgIGFjY3VtICs9IGludDY0X3QoYTEpKmludDE2X3QoYjEpID4+IDE2OworICAgIGFjY3VtICs9IGludDY0X3QoYTIpKmludDE2X3QoYjIpID4+IDE2OworICAgIGFjY3VtID0gKGFjY3VtIDw8IHNoaWZ0KSArIGM7CisgICAgcmV0dXJuIGFjY3VtOworCisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSBHTGZpeGVkIG1sYTMoIEdMZml4ZWQgYTAsIEdMZml4ZWQgYjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xmaXhlZCBhMSwgR0xmaXhlZCBiMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGZpeGVkIGEyLCBHTGZpeGVkIGIyKQoreworI2lmIGRlZmluZWQoX19hcm1fXykgJiYgIWRlZmluZWQoX190aHVtYl9fKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIEdMZml4ZWQgcjsKKyAgICBpbnQzMl90IHQ7CisgICAgYXNtKAorICAgICAgICAic211bGwgJTAsICUxLCAlMiwgJTMgICAgICAgXG4iCisgICAgICAgICJzbWxhbCAlMCwgJTEsICU0LCAlNSAgICAgICBcbiIKKyAgICAgICAgInNtbGFsICUwLCAlMSwgJTYsICU3ICAgICAgIFxuIgorICAgICAgICAibW92cyAgJTAsICUwLCBsc3IgIzE2ICAgICAgXG4iCisgICAgICAgICJhZGMgICAlMCwgJTAsICUxLCBsc2wgIzE2ICBcbiIKKyAgICAgICAgOiAgICI9JnIiKHIpLCAiPSZyIih0KSAKKyAgICAgICAgOiAgICIlciIoYTApLCAiciIoYjApLAorICAgICAgICAgICAgIiVyIihhMSksICJyIihiMSksCisgICAgICAgICAgICAiJXIiKGEyKSwgInIiKGIyKQorICAgICAgICA6ICAgImNjIgorICAgICAgICApOyAKKyAgICByZXR1cm4gcjsKKyAgICAKKyNlbHNlCisKKyAgICByZXR1cm4gKCggICBpbnQ2NF90KGEwKSpiMCArCisgICAgICAgICAgICAgICAgaW50NjRfdChhMSkqYjEgKworICAgICAgICAgICAgICAgIGludDY0X3QoYTIpKmIyICsgMHg4MDAwKT4+MTYpOworCisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSBHTGZpeGVkIG1sYTQoIEdMZml4ZWQgYTAsIEdMZml4ZWQgYjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xmaXhlZCBhMSwgR0xmaXhlZCBiMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGZpeGVkIGEyLCBHTGZpeGVkIGIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZml4ZWQgYTMsIEdMZml4ZWQgYjMpCit7CisjaWYgZGVmaW5lZChfX2FybV9fKSAmJiAhZGVmaW5lZChfX3RodW1iX18pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgR0xmaXhlZCByOworICAgIGludDMyX3QgdDsKKyAgICBhc20oCisgICAgICAgICJzbXVsbCAlMCwgJTEsICUyLCAlMyAgICAgICBcbiIKKyAgICAgICAgInNtbGFsICUwLCAlMSwgJTQsICU1ICAgICAgIFxuIgorICAgICAgICAic21sYWwgJTAsICUxLCAlNiwgJTcgICAgICAgXG4iCisgICAgICAgICJzbWxhbCAlMCwgJTEsICU4LCAlOSAgICAgICBcbiIKKyAgICAgICAgIm1vdnMgICUwLCAlMCwgbHNyICMxNiAgICAgIFxuIgorICAgICAgICAiYWRjICAgJTAsICUwLCAlMSwgbHNsICMxNiAgXG4iCisgICAgICAgIDogICAiPSZyIihyKSwgIj0mciIodCkgCisgICAgICAgIDogICAiJXIiKGEwKSwgInIiKGIwKSwKKyAgICAgICAgICAgICIlciIoYTEpLCAiciIoYjEpLAorICAgICAgICAgICAgIiVyIihhMiksICJyIihiMiksCisgICAgICAgICAgICAiJXIiKGEzKSwgInIiKGIzKQorICAgICAgICA6ICAgImNjIgorICAgICAgICApOyAKKyAgICByZXR1cm4gcjsKKyAgICAKKyNlbHNlCisKKyAgICByZXR1cm4gKCggICBpbnQ2NF90KGEwKSpiMCArCisgICAgICAgICAgICAgICAgaW50NjRfdChhMSkqYjEgKworICAgICAgICAgICAgICAgIGludDY0X3QoYTIpKmIyICsKKyAgICAgICAgICAgICAgICBpbnQ2NF90KGEzKSpiMyArIDB4ODAwMCk+PjE2KTsKKworI2VuZGlmCit9CisKK2lubGluZQorR0xmaXhlZCBkb3Q0KGNvbnN0IEdMZml4ZWQqIGEsIGNvbnN0IEdMZml4ZWQqIGIpIAoreworICAgIHJldHVybiBtbGE0KGFbMF0sIGJbMF0sIGFbMV0sIGJbMV0sIGFbMl0sIGJbMl0sIGFbM10sIGJbM10pOworfQorCisKK2lubGluZQorR0xmaXhlZCBkb3QzKGNvbnN0IEdMZml4ZWQqIGEsIGNvbnN0IEdMZml4ZWQqIGIpIAoreworICAgIHJldHVybiBtbGEzKGFbMF0sIGJbMF0sIGFbMV0sIGJbMV0sIGFbMl0sIGJbMl0pOworfQorCisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX09QRU5HTEVTX01BVFJJWF9ICisKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvbWlwbWFwLmNwcCBiL29wZW5nbC9saWJhZ2wvbWlwbWFwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2Q3N2I3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2xpYmFnbC9taXBtYXAuY3BwCkBAIC0wLDAgKzEsMTkyIEBACisvKiBsaWJzL29wZW5nbGVzL21pcG1hcC5jcHAKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImNvbnRleHQuaCIKKyNpbmNsdWRlICJzdGF0ZS5oIgorI2luY2x1ZGUgInRleHR1cmUuaCIKKyNpbmNsdWRlICJUZXh0dXJlT2JqZWN0TWFuYWdlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdHVzX3QgYnVpbGRBUHlyYW1pZChvZ2xlc19jb250ZXh0X3QqIGMsIEVHTFRleHR1cmVPYmplY3QqIHRleCkKK3sKKyAgICBpbnQgbGV2ZWwgPSAwOworICAgIGNvbnN0IEdHTFN1cmZhY2UqIGJhc2UgPSAmdGV4LT5zdXJmYWNlOyAgICAKKyAgICBjb25zdCBHR0xGb3JtYXQmIHBpeGVsRm9ybWF0KGMtPnJhc3Rlcml6ZXIuZm9ybWF0c1tiYXNlLT5mb3JtYXRdKTsKKworICAgIGludCB3ID0gYmFzZS0+d2lkdGg7CisgICAgaW50IGggPSBiYXNlLT5oZWlnaHQ7CisgICAgaWYgKCh3JmgpID09IDEpCisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKworICAgIHcgPSAodz4+MSkgPyA6IDE7CisgICAgaCA9IChoPj4xKSA/IDogMTsKKworICAgIHdoaWxlKHRydWUpIHsKKyAgICAgICAgKytsZXZlbDsKKyAgICAgICAgY29uc3QgaW50IGJwciA9IHcgKiBwaXhlbEZvcm1hdC5zaXplOworICAgICAgICBpZiAodGV4LT5yZWFsbG9jYXRlKGxldmVsLCB3LCBoLCB3LAorICAgICAgICAgICAgICAgIGJhc2UtPmZvcm1hdCwgYmFzZS0+Y29tcHJlc3NlZEZvcm1hdCwgYnByKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgfQorICAgIAorICAgICAgICBpbnQgc3RyaWRlID0gdzsKKyAgICAgICAgaW50IGJzID0gYmFzZS0+c3RyaWRlOworICAgICAgICBHR0xTdXJmYWNlJiBjdXIgPSB0ZXgtPmVkaXRNaXAobGV2ZWwpOworCisgICAgICAgIGlmIChiYXNlLT5mb3JtYXQgPT0gR0dMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1KQorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBjb25zdCAqIHNyYyA9ICh1aW50MTZfdCBjb25zdCAqKWJhc2UtPmRhdGE7CisgICAgICAgICAgICB1aW50MTZfdCogZHN0ID0gKHVpbnQxNl90KiljdXIuZGF0YTsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IG1hc2sgPSAweDA3RTBGODFGOworICAgICAgICAgICAgZm9yIChpbnQgeT0wIDsgeTxoIDsgeSsrKSB7CisgICAgICAgICAgICAgICAgc2l6ZV90IG9mZnNldCA9ICh5KjIpICogYnM7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgeD0wIDsgeDx3IDsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHAwMCA9IHNyY1tvZmZzZXRdOworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwMTAgPSBzcmNbb2Zmc2V0KzFdOworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwMDEgPSBzcmNbb2Zmc2V0K2JzXTsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcDExID0gc3JjW29mZnNldCticysxXTsKKyAgICAgICAgICAgICAgICAgICAgcDAwID0gKHAwMCB8IChwMDAgPDwgMTYpKSAmIG1hc2s7CisgICAgICAgICAgICAgICAgICAgIHAwMSA9IChwMDEgfCAocDAxIDw8IDE2KSkgJiBtYXNrOworICAgICAgICAgICAgICAgICAgICBwMTAgPSAocDEwIHwgKHAxMCA8PCAxNikpICYgbWFzazsKKyAgICAgICAgICAgICAgICAgICAgcDExID0gKHAxMSB8IChwMTEgPDwgMTYpKSAmIG1hc2s7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGdyYiA9ICgocDAwICsgcDEwICsgcDAxICsgcDExKSA+PiAyKSAmIG1hc2s7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJnYiA9IChncmIgJiAweEZGRkYpIHwgKGdyYiA+PiAxNik7CisgICAgICAgICAgICAgICAgICAgIGRzdFt4ICsgeSpzdHJpZGVdID0gcmdiOworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYmFzZS0+Zm9ybWF0ID09IEdHTF9QSVhFTF9GT1JNQVRfUkdCQV81NTUxKQorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBjb25zdCAqIHNyYyA9ICh1aW50MTZfdCBjb25zdCAqKWJhc2UtPmRhdGE7CisgICAgICAgICAgICB1aW50MTZfdCogZHN0ID0gKHVpbnQxNl90KiljdXIuZGF0YTsKKyAgICAgICAgICAgIGZvciAoaW50IHk9MCA7IHk8aCA7IHkrKykgeworICAgICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQgPSAoeSoyKSAqIGJzOworICAgICAgICAgICAgICAgIGZvciAoaW50IHg9MCA7IHg8dyA7IHgrKykgeworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwMDAgPSBzcmNbb2Zmc2V0XTsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcDEwID0gc3JjW29mZnNldCsxXTsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcDAxID0gc3JjW29mZnNldCtic107CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHAxMSA9IHNyY1tvZmZzZXQrYnMrMV07CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHIgPSAoKHAwMD4+MTEpKyhwMTA+PjExKSsocDAxPj4xMSkrKHAxMT4+MTEpKzIpPj4yOworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnID0gKCgocDAwPj42KSsocDEwPj42KSsocDAxPj42KSsocDExPj42KSsyKT4+MikmMHgzRjsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYiA9ICgocDAwJjB4M0UpKyhwMTAmMHgzRSkrKHAwMSYweDNFKSsocDExJjB4M0UpKzQpPj4zOworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhID0gKChwMDAmMSkrKHAxMCYxKSsocDAxJjEpKyhwMTEmMSkrMik+PjI7CisgICAgICAgICAgICAgICAgICAgIGRzdFt4ICsgeSpzdHJpZGVdID0gKHI8PDExKXwoZzw8Nil8KGI8PDEpfGE7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChiYXNlLT5mb3JtYXQgPT0gR0dMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGNvbnN0ICogc3JjID0gKHVpbnQzMl90IGNvbnN0ICopYmFzZS0+ZGF0YTsKKyAgICAgICAgICAgIHVpbnQzMl90KiBkc3QgPSAodWludDMyX3QqKWN1ci5kYXRhOworICAgICAgICAgICAgZm9yIChpbnQgeT0wIDsgeTxoIDsgeSsrKSB7CisgICAgICAgICAgICAgICAgc2l6ZV90IG9mZnNldCA9ICh5KjIpICogYnM7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgeD0wIDsgeDx3IDsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHAwMCA9IHNyY1tvZmZzZXRdOworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwMTAgPSBzcmNbb2Zmc2V0KzFdOworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwMDEgPSBzcmNbb2Zmc2V0K2JzXTsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcDExID0gc3JjW29mZnNldCticysxXTsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmIwMCA9IHAwMCAmIDB4MDBGRjAwRkY7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJiMDEgPSBwMDEgJiAweDAwRkYwMEZGOworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByYjEwID0gcDEwICYgMHgwMEZGMDBGRjsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmIxMSA9IHAxMSAmIDB4MDBGRjAwRkY7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGdhMDAgPSAocDAwID4+IDgpICYgMHgwMEZGMDBGRjsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZ2EwMSA9IChwMDEgPj4gOCkgJiAweDAwRkYwMEZGOworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnYTEwID0gKHAxMCA+PiA4KSAmIDB4MDBGRjAwRkY7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGdhMTEgPSAocDExID4+IDgpICYgMHgwMEZGMDBGRjsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmIgPSAocmIwMCArIHJiMDEgKyByYjEwICsgcmIxMSk+PjI7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGdhID0gKGdhMDAgKyBnYTAxICsgZ2ExMCArIGdhMTEpPj4yOworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZ2JhID0gKHJiICYgMHgwMEZGMDBGRikgfCAoKGdhICYgMHgwMEZGMDBGRik8PDgpOworICAgICAgICAgICAgICAgICAgICBkc3RbeCArIHkqc3RyaWRlXSA9IHJnYmE7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoYmFzZS0+Zm9ybWF0ID09IEdHTF9QSVhFTF9GT1JNQVRfUkdCXzg4OCkgfHwKKyAgICAgICAgICAgICAgICAgKGJhc2UtPmZvcm1hdCA9PSBHR0xfUElYRUxfRk9STUFUX0xBXzg4KSB8fAorICAgICAgICAgICAgICAgICAoYmFzZS0+Zm9ybWF0ID09IEdHTF9QSVhFTF9GT1JNQVRfQV84KSB8fAorICAgICAgICAgICAgICAgICAoYmFzZS0+Zm9ybWF0ID09IEdHTF9QSVhFTF9GT1JNQVRfTF84KSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHNraXA7CisgICAgICAgICAgICBzd2l0Y2ggKGJhc2UtPmZvcm1hdCkgeworICAgICAgICAgICAgY2FzZSBHR0xfUElYRUxfRk9STUFUX1JHQl84ODg6ICBza2lwID0gMzsgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgR0dMX1BJWEVMX0ZPUk1BVF9MQV84ODogICAgc2tpcCA9IDI7ICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgPSAxOyAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdWludDhfdCBjb25zdCAqIHNyYyA9ICh1aW50OF90IGNvbnN0ICopYmFzZS0+ZGF0YTsKKyAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCA9ICh1aW50OF90KiljdXIuZGF0YTsgICAgICAgICAgICAKKyAgICAgICAgICAgIGJzICo9IHNraXA7CisgICAgICAgICAgICBzdHJpZGUgKj0gc2tpcDsKKyAgICAgICAgICAgIGZvciAoaW50IHk9MCA7IHk8aCA7IHkrKykgeworICAgICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQgPSAoeSoyKSAqIGJzOworICAgICAgICAgICAgICAgIGZvciAoaW50IHg9MCA7IHg8dyA7IHgrKykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBjPTAgOyBjPHNraXAgOyBjKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHAwMCA9IHNyY1tjK29mZnNldF07CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwMTAgPSBzcmNbYytvZmZzZXQrc2tpcF07CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwMDEgPSBzcmNbYytvZmZzZXQrYnNdOworICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcDExID0gc3JjW2Mrb2Zmc2V0K2JzK3NraXBdOworICAgICAgICAgICAgICAgICAgICAgICAgZHN0W3ggKyB5KnN0cmlkZSArIGNdID0gKHAwMCArIHAxMCArIHAwMSArIHAxMSkgPj4gMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMipza2lwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChiYXNlLT5mb3JtYXQgPT0gR0dMX1BJWEVMX0ZPUk1BVF9SR0JBXzQ0NDQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGNvbnN0ICogc3JjID0gKHVpbnQxNl90IGNvbnN0ICopYmFzZS0+ZGF0YTsKKyAgICAgICAgICAgIHVpbnQxNl90KiBkc3QgPSAodWludDE2X3QqKWN1ci5kYXRhOworICAgICAgICAgICAgZm9yIChpbnQgeT0wIDsgeTxoIDsgeSsrKSB7CisgICAgICAgICAgICAgICAgc2l6ZV90IG9mZnNldCA9ICh5KjIpICogYnM7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgeD0wIDsgeDx3IDsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHAwMCA9IHNyY1tvZmZzZXRdOworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwMTAgPSBzcmNbb2Zmc2V0KzFdOworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwMDEgPSBzcmNbb2Zmc2V0K2JzXTsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcDExID0gc3JjW29mZnNldCticysxXTsKKyAgICAgICAgICAgICAgICAgICAgcDAwID0gKChwMDAgPDwgMTIpICYgMHgwRjBGMDAwMCkgfCAocDAwICYgMHgwRjBGKTsKKyAgICAgICAgICAgICAgICAgICAgcDEwID0gKChwMTAgPDwgMTIpICYgMHgwRjBGMDAwMCkgfCAocDEwICYgMHgwRjBGKTsKKyAgICAgICAgICAgICAgICAgICAgcDAxID0gKChwMDEgPDwgMTIpICYgMHgwRjBGMDAwMCkgfCAocDAxICYgMHgwRjBGKTsKKyAgICAgICAgICAgICAgICAgICAgcDExID0gKChwMTEgPDwgMTIpICYgMHgwRjBGMDAwMCkgfCAocDExICYgMHgwRjBGKTsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmJnYSA9IChwMDAgKyBwMTAgKyBwMDEgKyBwMTEpID4+IDI7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJnYmEgPSAocmJnYSAmIDB4MEYwRikgfCAoKHJiZ2E+PjEyKSAmIDB4RjBGMCk7CisgICAgICAgICAgICAgICAgICAgIGRzdFt4ICsgeSpzdHJpZGVdID0gcmdiYTsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HRSgiVW5zdXBwb3J0ZWQgZm9ybWF0ICglZCkiLCBiYXNlLT5mb3JtYXQpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9UWVBFOworICAgICAgICB9CisKKyAgICAgICAgLy8gZXhpdCBjb25kaXRpb246IHdlIGp1c3QgcHJvY2Vzc2VkIHRoZSAxeDEgTE9EcworICAgICAgICBpZiAoKHcmaCkgPT0gMSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGJhc2UgPSAmY3VyOworICAgICAgICB3ID0gKHc+PjEpID8gOiAxOworICAgICAgICBoID0gKGg+PjEpID8gOiAxOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL3ByaW1pdGl2ZXMuY3BwIGIvb3BlbmdsL2xpYmFnbC9wcmltaXRpdmVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTY0YzAyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2xpYmFnbC9wcmltaXRpdmVzLmNwcApAQCAtMCwwICsxLDExMTEgQEAKKy8qIGxpYnMvb3BlbmdsZXMvcHJpbWl0aXZlcy5jcHAKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJjb250ZXh0LmgiCisjaW5jbHVkZSAicHJpbWl0aXZlcy5oIgorI2luY2x1ZGUgImxpZ2h0LmgiCisjaW5jbHVkZSAibWF0cml4LmgiCisjaW5jbHVkZSAidmVydGV4LmgiCisjaW5jbHVkZSAiZnAuaCIKKyNpbmNsdWRlICJUZXh0dXJlT2JqZWN0TWFuYWdlci5oIgorCitleHRlcm4gIkMiIHZvaWQgaXRlcmF0b3JzMDAzMihjb25zdCB2b2lkKiB0aGF0LAorICAgICAgICBpbnQzMl90KiBpdCwgaW50MzJfdCBjMCwgaW50MzJfdCBjMSwgaW50MzJfdCBjMik7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBwcmltaXRpdmVfcG9pbnQob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogdik7CitzdGF0aWMgdm9pZCBwcmltaXRpdmVfbGluZShvZ2xlc19jb250ZXh0X3QqIGMsIHZlcnRleF90KiB2MCwgdmVydGV4X3QqIHYxKTsKK3N0YXRpYyB2b2lkIHByaW1pdGl2ZV9jbGlwX3RyaWFuZ2xlKG9nbGVzX2NvbnRleHRfdCogYywKKyAgICAgICAgdmVydGV4X3QqIHYwLCB2ZXJ0ZXhfdCogdjEsIHZlcnRleF90KiB2Mik7CisKK3N0YXRpYyB2b2lkIHByaW1pdGl2ZV9ub3BfcG9pbnQob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogdik7CitzdGF0aWMgdm9pZCBwcmltaXRpdmVfbm9wX2xpbmUob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogdjAsIHZlcnRleF90KiB2MSk7CitzdGF0aWMgdm9pZCBwcmltaXRpdmVfbm9wX3RyaWFuZ2xlKG9nbGVzX2NvbnRleHRfdCogYywKKyAgICAgICAgdmVydGV4X3QqIHYwLCB2ZXJ0ZXhfdCogdjEsIHZlcnRleF90KiB2Mik7CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBjdWxsX3RyaWFuZ2xlKG9nbGVzX2NvbnRleHRfdCogYywKKyAgICAgICAgdmVydGV4X3QqIHYwLCB2ZXJ0ZXhfdCogdjEsIHZlcnRleF90KiB2Mik7CisKK3N0YXRpYyB2b2lkIGxlcnBfdHJpYW5nbGUob2dsZXNfY29udGV4dF90KiBjLAorICAgICAgICB2ZXJ0ZXhfdCogdjAsIHZlcnRleF90KiB2MSwgdmVydGV4X3QqIHYyKTsKKworc3RhdGljIHZvaWQgbGVycF90ZXhjb29yZHMob2dsZXNfY29udGV4dF90KiBjLAorICAgICAgICB2ZXJ0ZXhfdCogdjAsIHZlcnRleF90KiB2MSwgdmVydGV4X3QqIHYyKTsKKworc3RhdGljIHZvaWQgbGVycF90ZXhjb29yZHNfdyhvZ2xlc19jb250ZXh0X3QqIGMsCisgICAgICAgIHZlcnRleF90KiB2MCwgdmVydGV4X3QqIHYxLCB2ZXJ0ZXhfdCogdjIpOworCitzdGF0aWMgdm9pZCB0cmlhbmdsZShvZ2xlc19jb250ZXh0X3QqIGMsCisgICAgICAgIHZlcnRleF90KiB2MCwgdmVydGV4X3QqIHYxLCB2ZXJ0ZXhfdCogdjIpOworCitzdGF0aWMgdm9pZCBjbGlwX3RyaWFuZ2xlKG9nbGVzX2NvbnRleHRfdCogYywKKyAgICAgICAgdmVydGV4X3QqIHYwLCB2ZXJ0ZXhfdCogdjEsIHZlcnRleF90KiB2Mik7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY2xpcF9saW5lKG9nbGVzX2NvbnRleHRfdCogYywKKyAgICAgICAgdmVydGV4X3QqIHMsIHZlcnRleF90KiBwKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIDAKKyNwcmFnbWEgbWFyayAtCisjZW5kaWYKKworc3RhdGljIHZvaWQgbGlnaHRUcmlhbmdsZURhcmtTbW9vdGgob2dsZXNfY29udGV4dF90KiBjLAorICAgICAgICB2ZXJ0ZXhfdCogdjAsIHZlcnRleF90KiB2MSwgdmVydGV4X3QqIHYyKQoreworICAgIGlmICghKHYwLT5mbGFncyAmIHZlcnRleF90OjpMSVQpKSB7CisgICAgICAgIHYwLT5mbGFncyB8PSB2ZXJ0ZXhfdDo6TElUOworICAgICAgICBjb25zdCBHTHZvaWQqIGNwID0gYy0+YXJyYXlzLmNvbG9yLmVsZW1lbnQoCisgICAgICAgICAgICAgICAgdjAtPmluZGV4ICYgdmVydGV4X2NhY2hlX3Q6OklOREVYX01BU0spOworICAgICAgICBjLT5hcnJheXMuY29sb3IuZmV0Y2goYywgdjAtPmNvbG9yLnYsIGNwKTsKKyAgICB9CisgICAgaWYgKCEodjEtPmZsYWdzICYgdmVydGV4X3Q6OkxJVCkpIHsKKyAgICAgICAgdjEtPmZsYWdzIHw9IHZlcnRleF90OjpMSVQ7CisgICAgICAgIGNvbnN0IEdMdm9pZCogY3AgPSBjLT5hcnJheXMuY29sb3IuZWxlbWVudCgKKyAgICAgICAgICAgICAgICB2MS0+aW5kZXggJiB2ZXJ0ZXhfY2FjaGVfdDo6SU5ERVhfTUFTSyk7CisgICAgICAgIGMtPmFycmF5cy5jb2xvci5mZXRjaChjLCB2MS0+Y29sb3IudiwgY3ApOworICAgIH0KKyAgICBpZighKHYyLT5mbGFncyAmIHZlcnRleF90OjpMSVQpKSB7CisgICAgICAgIHYyLT5mbGFncyB8PSB2ZXJ0ZXhfdDo6TElUOworICAgICAgICBjb25zdCBHTHZvaWQqIGNwID0gYy0+YXJyYXlzLmNvbG9yLmVsZW1lbnQoCisgICAgICAgICAgICAgICAgdjItPmluZGV4ICYgdmVydGV4X2NhY2hlX3Q6OklOREVYX01BU0spOworICAgICAgICBjLT5hcnJheXMuY29sb3IuZmV0Y2goYywgdjItPmNvbG9yLnYsIGNwKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGxpZ2h0VHJpYW5nbGVEYXJrRmxhdChvZ2xlc19jb250ZXh0X3QqIGMsCisgICAgICAgIHZlcnRleF90KiB2MCwgdmVydGV4X3QqIHYxLCB2ZXJ0ZXhfdCogdjIpCit7CisgICAgaWYgKCEodjItPmZsYWdzICYgdmVydGV4X3Q6OkxJVCkpIHsKKyAgICAgICAgdjItPmZsYWdzIHw9IHZlcnRleF90OjpMSVQ7CisgICAgICAgIGNvbnN0IEdMdm9pZCogY3AgPSBjLT5hcnJheXMuY29sb3IuZWxlbWVudCgKKyAgICAgICAgICAgICAgICB2Mi0+aW5kZXggJiB2ZXJ0ZXhfY2FjaGVfdDo6SU5ERVhfTUFTSyk7CisgICAgICAgIGMtPmFycmF5cy5jb2xvci5mZXRjaChjLCB2Mi0+Y29sb3IudiwgY3ApOworICAgIH0KKyAgICAvLyBjb25maWd1cmUgdGhlIHJhc3Rlcml6ZXIgaGVyZSwgYmVmb3JlIHdlIGNsaXAKKyAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmNvbG9yNHh2KGMsIHYyLT5jb2xvci52KTsKK30KKworc3RhdGljIHZvaWQgbGlnaHRUcmlhbmdsZVNtb290aChvZ2xlc19jb250ZXh0X3QqIGMsCisgICAgICAgIHZlcnRleF90KiB2MCwgdmVydGV4X3QqIHYxLCB2ZXJ0ZXhfdCogdjIpCit7CisgICAgaWYgKCEodjAtPmZsYWdzICYgdmVydGV4X3Q6OkxJVCkpCisgICAgICAgIGMtPmxpZ2h0aW5nLmxpZ2h0VmVydGV4KGMsIHYwKTsKKyAgICBpZiAoISh2MS0+ZmxhZ3MgJiB2ZXJ0ZXhfdDo6TElUKSkKKyAgICAgICAgYy0+bGlnaHRpbmcubGlnaHRWZXJ0ZXgoYywgdjEpOworICAgIGlmKCEodjItPmZsYWdzICYgdmVydGV4X3Q6OkxJVCkpCisgICAgICAgIGMtPmxpZ2h0aW5nLmxpZ2h0VmVydGV4KGMsIHYyKTsKK30KKworc3RhdGljIHZvaWQgbGlnaHRUcmlhbmdsZUZsYXQob2dsZXNfY29udGV4dF90KiBjLAorICAgICAgICB2ZXJ0ZXhfdCogdjAsIHZlcnRleF90KiB2MSwgdmVydGV4X3QqIHYyKQoreworICAgIGlmICghKHYyLT5mbGFncyAmIHZlcnRleF90OjpMSVQpKQorICAgICAgICBjLT5saWdodGluZy5saWdodFZlcnRleChjLCB2Mik7CisgICAgLy8gY29uZmlndXJlIHRoZSByYXN0ZXJpemVyIGhlcmUsIGJlZm9yZSB3ZSBjbGlwCisgICAgYy0+cmFzdGVyaXplci5wcm9jcy5jb2xvcjR4dihjLCB2Mi0+Y29sb3Iudik7Cit9CisKKy8vIFRoZSBmb2cgdmVyc2lvbnMuLi4KKworc3RhdGljIGlubGluZQordm9pZCBsaWdodFZlcnRleERhcmtTbW9vdGhGb2cob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogdikKK3sKKyAgICBpZiAoISh2LT5mbGFncyAmIHZlcnRleF90OjpMSVQpKSB7CisgICAgICAgIHYtPmZsYWdzIHw9IHZlcnRleF90OjpMSVQ7CisgICAgICAgIHYtPmZvZyA9IGMtPmZvZy5mb2coYywgdi0+ZXllLnopOworICAgICAgICBjb25zdCBHTHZvaWQqIGNwID0gYy0+YXJyYXlzLmNvbG9yLmVsZW1lbnQoCisgICAgICAgICAgICAgICAgdi0+aW5kZXggJiB2ZXJ0ZXhfY2FjaGVfdDo6SU5ERVhfTUFTSyk7CisgICAgICAgIGMtPmFycmF5cy5jb2xvci5mZXRjaChjLCB2LT5jb2xvci52LCBjcCk7CisgICAgfQorfQorc3RhdGljIGlubGluZQordm9pZCBsaWdodFZlcnRleERhcmtGbGF0Rm9nKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYpCit7CisgICAgaWYgKCEodi0+ZmxhZ3MgJiB2ZXJ0ZXhfdDo6TElUKSkgeworICAgICAgICB2LT5mbGFncyB8PSB2ZXJ0ZXhfdDo6TElUOworICAgICAgICB2LT5mb2cgPSBjLT5mb2cuZm9nKGMsIHYtPmV5ZS56KTsKKyAgICB9Cit9CitzdGF0aWMgaW5saW5lCit2b2lkIGxpZ2h0VmVydGV4U21vb3RoRm9nKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYpCit7CisgICAgaWYgKCEodi0+ZmxhZ3MgJiB2ZXJ0ZXhfdDo6TElUKSkgeworICAgICAgICB2LT5mb2cgPSBjLT5mb2cuZm9nKGMsIHYtPmV5ZS56KTsKKyAgICAgICAgYy0+bGlnaHRpbmcubGlnaHRWZXJ0ZXgoYywgdik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBsaWdodFRyaWFuZ2xlRGFya1Ntb290aEZvZyhvZ2xlc19jb250ZXh0X3QqIGMsCisgICAgICAgIHZlcnRleF90KiB2MCwgdmVydGV4X3QqIHYxLCB2ZXJ0ZXhfdCogdjIpCit7CisgICAgbGlnaHRWZXJ0ZXhEYXJrU21vb3RoRm9nKGMsIHYwKTsKKyAgICBsaWdodFZlcnRleERhcmtTbW9vdGhGb2coYywgdjEpOworICAgIGxpZ2h0VmVydGV4RGFya1Ntb290aEZvZyhjLCB2Mik7Cit9CisKK3N0YXRpYyB2b2lkIGxpZ2h0VHJpYW5nbGVEYXJrRmxhdEZvZyhvZ2xlc19jb250ZXh0X3QqIGMsCisgICAgICAgIHZlcnRleF90KiB2MCwgdmVydGV4X3QqIHYxLCB2ZXJ0ZXhfdCogdjIpCit7CisgICAgbGlnaHRWZXJ0ZXhEYXJrRmxhdEZvZyhjLCB2MCk7CisgICAgbGlnaHRWZXJ0ZXhEYXJrRmxhdEZvZyhjLCB2MSk7CisgICAgbGlnaHRWZXJ0ZXhEYXJrU21vb3RoRm9nKGMsIHYyKTsKKyAgICAvLyBjb25maWd1cmUgdGhlIHJhc3Rlcml6ZXIgaGVyZSwgYmVmb3JlIHdlIGNsaXAKKyAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmNvbG9yNHh2KGMsIHYyLT5jb2xvci52KTsKK30KKworc3RhdGljIHZvaWQgbGlnaHRUcmlhbmdsZVNtb290aEZvZyhvZ2xlc19jb250ZXh0X3QqIGMsCisgICAgICAgIHZlcnRleF90KiB2MCwgdmVydGV4X3QqIHYxLCB2ZXJ0ZXhfdCogdjIpCit7CisgICAgbGlnaHRWZXJ0ZXhTbW9vdGhGb2coYywgdjApOworICAgIGxpZ2h0VmVydGV4U21vb3RoRm9nKGMsIHYxKTsKKyAgICBsaWdodFZlcnRleFNtb290aEZvZyhjLCB2Mik7Cit9CisKK3N0YXRpYyB2b2lkIGxpZ2h0VHJpYW5nbGVGbGF0Rm9nKG9nbGVzX2NvbnRleHRfdCogYywKKyAgICAgICAgdmVydGV4X3QqIHYwLCB2ZXJ0ZXhfdCogdjEsIHZlcnRleF90KiB2MikKK3sKKyAgICBsaWdodFZlcnRleERhcmtGbGF0Rm9nKGMsIHYwKTsKKyAgICBsaWdodFZlcnRleERhcmtGbGF0Rm9nKGMsIHYxKTsKKyAgICBsaWdodFZlcnRleFNtb290aEZvZyhjLCB2Mik7CisgICAgLy8gY29uZmlndXJlIHRoZSByYXN0ZXJpemVyIGhlcmUsIGJlZm9yZSB3ZSBjbGlwCisgICAgYy0+cmFzdGVyaXplci5wcm9jcy5jb2xvcjR4dihjLCB2Mi0+Y29sb3Iudik7Cit9CisKKworCit0eXBlZGVmIHZvaWQgKCpsaWdodF9wcmltaXRpdmVfdCkob2dsZXNfY29udGV4dF90KiwKKyAgICAgICAgdmVydGV4X3QqLCB2ZXJ0ZXhfdCosIHZlcnRleF90Kik7CisKKy8vIGZvZyAweDQsIGxpZ2h0IDB4Miwgc21vb3RoIDB4MQorc3RhdGljIGNvbnN0IGxpZ2h0X3ByaW1pdGl2ZV90IGxpZ2h0UHJpbWl0aXZlWzhdID0geworICAgIGxpZ2h0VHJpYW5nbGVEYXJrRmxhdCwgICAgICAgICAgLy8gbm8gZm9nIHwgZGFyayAgfCBmbGF0CisgICAgbGlnaHRUcmlhbmdsZURhcmtTbW9vdGgsICAgICAgICAvLyBubyBmb2cgfCBkYXJrICB8IHNtb290aAorICAgIGxpZ2h0VHJpYW5nbGVGbGF0LCAgICAgICAgICAgICAgLy8gbm8gZm9nIHwgbGlnaHQgfCBmbGF0CisgICAgbGlnaHRUcmlhbmdsZVNtb290aCwgICAgICAgICAgICAvLyBubyBmb2cgfCBsaWdodCB8IHNtb290aAorICAgIGxpZ2h0VHJpYW5nbGVEYXJrRmxhdEZvZywgICAgICAgLy8gZm9nICAgIHwgZGFyayAgfCBmbGF0CisgICAgbGlnaHRUcmlhbmdsZURhcmtTbW9vdGhGb2csICAgICAvLyBmb2cgICAgfCBkYXJrICB8IHNtb290aAorICAgIGxpZ2h0VHJpYW5nbGVGbGF0Rm9nLCAgICAgICAgICAgLy8gZm9nICAgIHwgbGlnaHQgfCBmbGF0CisgICAgbGlnaHRUcmlhbmdsZVNtb290aEZvZyAgICAgICAgICAvLyBmb2cgICAgfCBsaWdodCB8IHNtb290aAorfTsKKwordm9pZCBvZ2xlc192YWxpZGF0ZV9wcmltaXRpdmVzKG9nbGVzX2NvbnRleHRfdCogYykKK3sKKyAgICBjb25zdCB1aW50MzJfdCBlbmFibGVzID0gYy0+cmFzdGVyaXplci5zdGF0ZS5lbmFibGVzOworCisgICAgLy8gc2V0IHVwIHRoZSBsaWdodGluZy9zaGFkaW5nL3Ntb290aGluZy9mb2dnaW5nIGZ1bmN0aW9uCisgICAgaW50IGluZGV4ID0gZW5hYmxlcyAmIEdHTF9FTkFCTEVfU01PT1RIID8gMHgxIDogMDsKKyAgICBpbmRleCB8PSBjLT5saWdodGluZy5lbmFibGUgPyAweDIgOiAwOworICAgIGluZGV4IHw9IGVuYWJsZXMgJiBHR0xfRU5BQkxFX0ZPRyA/IDB4NCA6IDA7CisgICAgYy0+bGlnaHRpbmcubGlnaHRUcmlhbmdsZSA9IGxpZ2h0UHJpbWl0aXZlW2luZGV4XTsKKyAgICAKKyAgICAvLyBzZXQgdXAgdGhlIHByaW1pdGl2ZSByZW5kZXJlcnMKKyAgICBpZiAoZ2dsX2xpa2VseShjLT5hcnJheXMudmVydGV4LmVuYWJsZSkpIHsKKyAgICAgICAgYy0+cHJpbXMucmVuZGVyUG9pbnQgICAgPSBwcmltaXRpdmVfcG9pbnQ7CisgICAgICAgIGMtPnByaW1zLnJlbmRlckxpbmUgICAgID0gcHJpbWl0aXZlX2xpbmU7CisgICAgICAgIGMtPnByaW1zLnJlbmRlclRyaWFuZ2xlID0gcHJpbWl0aXZlX2NsaXBfdHJpYW5nbGU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYy0+cHJpbXMucmVuZGVyUG9pbnQgICAgPSBwcmltaXRpdmVfbm9wX3BvaW50OworICAgICAgICBjLT5wcmltcy5yZW5kZXJMaW5lICAgICA9IHByaW1pdGl2ZV9ub3BfbGluZTsKKyAgICAgICAgYy0+cHJpbXMucmVuZGVyVHJpYW5nbGUgPSBwcmltaXRpdmVfbm9wX3RyaWFuZ2xlOworICAgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIGNvbXB1dGVfaXRlcmF0b3JzX3Q6OmluaXRUcmlhbmdsZSgKKyAgICAgICAgdmVydGV4X3QgY29uc3QqIHYwLCB2ZXJ0ZXhfdCBjb25zdCogdjEsIHZlcnRleF90IGNvbnN0KiB2MikKK3sKKyAgICBtX2R4MDEgPSB2MS0+d2luZG93LnggLSB2MC0+d2luZG93Lng7CisgICAgbV9keTEwID0gdjAtPndpbmRvdy55IC0gdjEtPndpbmRvdy55OworICAgIG1fZHgyMCA9IHYwLT53aW5kb3cueCAtIHYyLT53aW5kb3cueDsKKyAgICBtX2R5MDIgPSB2Mi0+d2luZG93LnkgLSB2MC0+d2luZG93Lnk7CisgICAgbV9hcmVhID0gbV9keDAxKm1fZHkwMiArICgtbV9keTEwKSptX2R4MjA7Cit9CisKK3ZvaWQgY29tcHV0ZV9pdGVyYXRvcnNfdDo6aW5pdExpbmUoCisgICAgICAgIHZlcnRleF90IGNvbnN0KiB2MCwgdmVydGV4X3QgY29uc3QqIHYxKQoreworICAgIG1fZHgwMSA9IG1fZHkwMiA9IHYxLT53aW5kb3cueCAtIHYwLT53aW5kb3cueDsKKyAgICBtX2R5MTAgPSBtX2R4MjAgPSB2MC0+d2luZG93LnkgLSB2MS0+d2luZG93Lnk7CisgICAgbV9hcmVhID0gbV9keDAxKm1fZHkwMiArICgtbV9keTEwKSptX2R4MjA7Cit9CisKK3ZvaWQgY29tcHV0ZV9pdGVyYXRvcnNfdDo6aW5pdExlcnAodmVydGV4X3QgY29uc3QqIHYwLCB1aW50MzJfdCBlbmFibGVzKQoreworICAgIG1feDAgPSB2MC0+d2luZG93Lng7CisgICAgbV95MCA9IHYwLT53aW5kb3cueTsKKyAgICBjb25zdCBHR0xjb29yZCBhcmVhID0gKG1fYXJlYSArIFRSSV9IQUxGKSA+PiBUUklfRlJBQ1RJT05fQklUUzsKKyAgICBjb25zdCBHR0xjb29yZCBtaW5BcmVhID0gMjsgLy8gY2Fubm90IGJlIGludmVydGVkCisgICAgLy8gdHJpYW5nbGVzIHdpdGggYW4gYXJlYSBzbWFsbGVyIHRoYW4gMS4wIGFyZSBub3Qgc21vb3RoLXNoYWRlZAorCisgICAgaW50IHE9MCwgcz0wLCBkPTA7CisgICAgaWYgKGFicyhhcmVhKSA+PSBtaW5BcmVhKSB7CisgICAgICAgIC8vIEhlcmUgd2UgZG8gc29tZSB2b29kb28gbWFnaWMsIHRvIGNvbXB1dGUgYSBzdWl0YWJsZSBzY2FsZQorICAgICAgICAvLyBmYWN0b3IgZm9yIGRlbHRhcy9hcmVhOgorCisgICAgICAgIC8vIEZpcnN0IGNvbXB1dGUgdGhlIDEvYXJlYSB3aXRoIGZ1bGwgMzItYml0cyBwcmVjaXNpb24sCisgICAgICAgIC8vIGdnbFJlY2lwUU5vcm1hbGl6ZWQgcmV0dXJucyBhIG51bWJlciBbLTAuNSwgMC41WyBhbmQgYW4gZXhwb25lbnQuCisgICAgICAgIGQgPSBnZ2xSZWNpcFFOb3JtYWxpemVkKGFyZWEsICZxKTsKKworICAgICAgICAvLyBUaGVuIGNvbXB1dGUgdGhlIG1pbmltdW0gbGVmdC1zaGlmdCB0byBub3Qgb3ZlcmZsb3cgdGhlIG11bHMKKyAgICAgICAgLy8gYmVsb3cuIAorICAgICAgICBzID0gMzIgLSBnZ2xDbHooYWJzKG1fZHkwMil8YWJzKG1fZHkxMCl8YWJzKG1fZHgwMSl8YWJzKG1fZHgyMCkpOworCisgICAgICAgIC8vIFdlJ2xsIGtlZXAgMTYtYml0cyBvZiBwcmVjaXNpb24gZm9yIGRlbHRhcy9hcmVhLiBTbyB3ZSBuZWVkCisgICAgICAgIC8vIHRvIHNoaWZ0IGV2ZXJ5dGhpbmcgbGVmdCBhbiBleHRyYSAxNSBiaXRzLgorICAgICAgICBzICs9IDE1OworICAgICAgICAKKyAgICAgICAgLy8gbWFrZSBzdXJlIGFsbCBmaW5hbCBzaGlmdHMgYXJlIG5vdCA+IDMyLCBiZWNhdXNlIGdnbE11bHgKKyAgICAgICAgLy8gY2FuJ3QgaGFuZGxlIGl0LgorICAgICAgICBpZiAocyA8IHEpIHMgPSBxOworICAgICAgICBpZiAocyA+IDMyKSB7CisgICAgICAgICAgICBkID4+PSAzMi1zOworICAgICAgICAgICAgcyA9IDMyOworICAgICAgICB9CisgICAgfQorCisgICAgbV9keDAxID0gZ2dsTXVseChtX2R4MDEsIGQsIHMpOworICAgIG1fZHkxMCA9IGdnbE11bHgobV9keTEwLCBkLCBzKTsKKyAgICBtX2R4MjAgPSBnZ2xNdWx4KG1fZHgyMCwgZCwgcyk7CisgICAgbV9keTAyID0gZ2dsTXVseChtX2R5MDIsIGQsIHMpOworICAgIG1fYXJlYV9zY2FsZSA9IDMyICsgcSAtIHM7CisgICAgbV9zY2FsZSA9IDA7CisKKyAgICBpZiAoZW5hYmxlcyAmIEdHTF9FTkFCTEVfVE1VUykgeworICAgICAgICBjb25zdCBpbnQgQSA9IGdnbENseihhYnMobV9keTAyKXxhYnMobV9keTEwKXxhYnMobV9keDAxKXxhYnMobV9keDIwKSk7CisgICAgICAgIGNvbnN0IGludCBCID0gZ2dsQ2x6KGFicyhtX3gwKXxhYnMobV95MCkpOworICAgICAgICBtX3NjYWxlID0gbWF4KDAsIDMyIC0gKEEgKyAxNikpICsKKyAgICAgICAgICAgICAgICAgIG1heCgwLCAzMiAtIChCICsgVFJJX0ZSQUNUSU9OX0JJVFMpKSArIDE7CisgICAgfQorfQorCitpbnQgY29tcHV0ZV9pdGVyYXRvcnNfdDo6aXRlcmF0b3JzU2NhbGUoR0dMZml4ZWQqIGl0LAorICAgICAgICBpbnQzMl90IGMwLCBpbnQzMl90IGMxLCBpbnQzMl90IGMyKSBjb25zdAoreworICAgIGludDMyX3QgZGMwMSA9IGMxIC0gYzA7CisgICAgaW50MzJfdCBkYzAyID0gYzIgLSBjMDsKKyAgICBjb25zdCBpbnQgQSA9IGdnbENseihhYnMoYzApKTsKKyAgICBjb25zdCBpbnQgQiA9IGdnbENseihhYnMoZGMwMSl8YWJzKGRjMDIpKTsKKyAgICBjb25zdCBpbnQgc2NhbGUgPSBtaW4oQSwgQiAtIG1fc2NhbGUpIC0gMjsKKyAgICBpZiAoc2NhbGUgPj0gMCkgeworICAgICAgICBjMCAgIDw8PSBzY2FsZTsKKyAgICAgICAgZGMwMSA8PD0gc2NhbGU7CisgICAgICAgIGRjMDIgPDw9IHNjYWxlOworICAgIH0gZWxzZSB7CisgICAgICAgIGMwICAgPj49IC1zY2FsZTsKKyAgICAgICAgZGMwMSA+Pj0gLXNjYWxlOworICAgICAgICBkYzAyID4+PSAtc2NhbGU7CisgICAgfQorICAgIGNvbnN0IGludCBzID0gbV9hcmVhX3NjYWxlOworICAgIGludDMyX3QgZGNkeCA9IGdnbE11bEFkZHgoZGMwMSwgbV9keTAyLCBnZ2xNdWx4KGRjMDIsIG1fZHkxMCwgcyksIHMpOworICAgIGludDMyX3QgZGNkeSA9IGdnbE11bEFkZHgoZGMwMiwgbV9keDAxLCBnZ2xNdWx4KGRjMDEsIG1fZHgyMCwgcyksIHMpOworICAgIGludDMyX3QgYyA9IGMwIC0gKGdnbE11bEFkZHgoZGNkeCwgbV94MCwgCisgICAgICAgICAgICBnZ2xNdWx4KGRjZHksIG1feTAsIFRSSV9GUkFDVElPTl9CSVRTKSwgVFJJX0ZSQUNUSU9OX0JJVFMpKTsKKyAgICBpdFswXSA9IGM7CisgICAgaXRbMV0gPSBkY2R4OworICAgIGl0WzJdID0gZGNkeTsKKyAgICByZXR1cm4gc2NhbGU7Cit9CisKK3ZvaWQgY29tcHV0ZV9pdGVyYXRvcnNfdDo6aXRlcmF0b3JzMTYxNihHR0xmaXhlZCogaXQsCisgICAgICAgIEdHTGZpeGVkIGMwLCBHR0xmaXhlZCBjMSwgR0dMZml4ZWQgYzIpIGNvbnN0Cit7CisgICAgY29uc3QgR0dMZml4ZWQgZGMwMSA9IGMxIC0gYzA7CisgICAgY29uc3QgR0dMZml4ZWQgZGMwMiA9IGMyIC0gYzA7CisgICAgLy8gMTYuMTYgeCAxNi4xNiA9PSAzMi4zMiAtLT4gMTYuMTYKKyAgICBjb25zdCBpbnQgcyA9IG1fYXJlYV9zY2FsZTsKKyAgICBpbnQzMl90IGRjZHggPSBnZ2xNdWxBZGR4KGRjMDEsIG1fZHkwMiwgZ2dsTXVseChkYzAyLCBtX2R5MTAsIHMpLCBzKTsKKyAgICBpbnQzMl90IGRjZHkgPSBnZ2xNdWxBZGR4KGRjMDIsIG1fZHgwMSwgZ2dsTXVseChkYzAxLCBtX2R4MjAsIHMpLCBzKTsKKyAgICBpbnQzMl90IGMgPSBjMCAtIChnZ2xNdWxBZGR4KGRjZHgsIG1feDAsCisgICAgICAgICAgICBnZ2xNdWx4KGRjZHksIG1feTAsIFRSSV9GUkFDVElPTl9CSVRTKSwgVFJJX0ZSQUNUSU9OX0JJVFMpKTsKKyAgICBpdFswXSA9IGM7CisgICAgaXRbMV0gPSBkY2R4OworICAgIGl0WzJdID0gZGNkeTsKK30KKwordm9pZCBjb21wdXRlX2l0ZXJhdG9yc190OjppdGVyYXRvcnMwMDMyKGludDY0X3QqIGl0LAorICAgICAgICBpbnQzMl90IGMwLCBpbnQzMl90IGMxLCBpbnQzMl90IGMyKSBjb25zdAoreworICAgIGNvbnN0IGludCBzID0gbV9hcmVhX3NjYWxlIC0gMTY7CisgICAgaW50MzJfdCBkYzAxID0gKGMxIC0gYzApPj5zOworICAgIGludDMyX3QgZGMwMiA9IChjMiAtIGMwKT4+czsKKyAgICAvLyAxNi4xNiB4IDE2LjE2ID09IDMyLjMyCisgICAgaW50NjRfdCBkY2R4ID0gZ2dsTXVsaWkoZGMwMSwgbV9keTAyKSArIGdnbE11bGlpKGRjMDIsIG1fZHkxMCk7CisgICAgaW50NjRfdCBkY2R5ID0gZ2dsTXVsaWkoZGMwMiwgbV9keDAxKSArIGdnbE11bGlpKGRjMDEsIG1fZHgyMCk7CisgICAgaXRbIDBdID0gKGMwPDwxNikgLSAoKGRjZHgqbV94MCArIGRjZHkqbV95MCk+PjQpOworICAgIGl0WyAxXSA9IGRjZHg7CisgICAgaXRbIDJdID0gZGNkeTsKK30KKworI2lmIGRlZmluZWQoX19hcm1fXykgJiYgIWRlZmluZWQoX190aHVtYl9fKQoraW5saW5lIHZvaWQgY29tcHV0ZV9pdGVyYXRvcnNfdDo6aXRlcmF0b3JzMDAzMihpbnQzMl90KiBpdCwKKyAgICAgICAgaW50MzJfdCBjMCwgaW50MzJfdCBjMSwgaW50MzJfdCBjMikgY29uc3QKK3sKKyAgICA6Oml0ZXJhdG9yczAwMzIodGhpcywgaXQsIGMwLCBjMSwgYzIpOworfQorI2Vsc2UKK3ZvaWQgY29tcHV0ZV9pdGVyYXRvcnNfdDo6aXRlcmF0b3JzMDAzMihpbnQzMl90KiBpdCwKKyAgICAgICAgaW50MzJfdCBjMCwgaW50MzJfdCBjMSwgaW50MzJfdCBjMikgY29uc3QKK3sKKyAgICBpbnQ2NF90IGl0NjRbM107CisgICAgaXRlcmF0b3JzMDAzMihpdCwgYzAsIGMxLCBjMik7CisgICAgaXRbMF0gPSBpdDY0WzBdOworICAgIGl0WzFdID0gaXQ2NFsxXTsKKyAgICBpdFsyXSA9IGl0NjRbMl07Cit9CisjZW5kaWYKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW5saW5lIGludDMyX3QgY2xhbXBaKEdMZml4ZWQgeikgQ09OU1Q7CitpbnQzMl90IGNsYW1wWihHTGZpeGVkIHopIHsKKyAgICB6ID0gKHogJiB+KHo+PjMxKSk7CisgICAgaWYgKHogPj0gMHgxMDAwMCkKKyAgICAgICAgeiA9IDB4RkZGRjsKKyAgICByZXR1cm4gejsKK30KKworc3RhdGljIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSkKK3ZvaWQgZmV0Y2hfdGV4Y29vcmRfaW1wbChvZ2xlc19jb250ZXh0X3QqIGMsCisgICAgICAgIHZlcnRleF90KiB2MCwgdmVydGV4X3QqIHYxLCB2ZXJ0ZXhfdCogdjIpCit7CisgICAgdmVydGV4X3QqIGNvbnN0IHZ0eFszXSA9IHsgdjAsIHYxLCB2MiB9OworICAgIGFycmF5X3QgY29uc3QgKiBjb25zdCB0ZXhjb29yZEFycmF5ID0gYy0+YXJyYXlzLnRleHR1cmU7CisgICAgCisgICAgZm9yIChpbnQgaT0wIDsgaTxHR0xfVEVYVFVSRV9VTklUX0NPVU5UIDsgaSsrKSB7CisgICAgICAgIGlmICghKGMtPnJhc3Rlcml6ZXIuc3RhdGUudGV4dHVyZVtpXS5lbmFibGUpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIAorICAgICAgICBmb3IgKGludCBqPTAgOyBqPDMgOyBqKyspIHsKKyAgICAgICAgICAgIHZlcnRleF90KiBjb25zdCB2ID0gdnR4W2pdOworICAgICAgICAgICAgaWYgKHYtPmZsYWdzICYgdmVydGV4X3Q6OlRUKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAvLyBOT1RFOiBoZXJlIHdlIGNvdWxkIGNvbXB1dGUgYXV0b21hdGljIHRleGdlbgorICAgICAgICAgICAgLy8gc3VjaCBhcyBzcGhlcmUvY3ViZSBtYXBzLCBpbnN0ZWFkIG9mIGZldGNoaW5nIHRoZW0KKyAgICAgICAgICAgIC8vIGZyb20gdGhlIHRleHRjb29yZCBhcnJheS4KKworICAgICAgICAgICAgdmVjNF90JiBjb29yZHMgPSB2LT50ZXh0dXJlW2ldOworICAgICAgICAgICAgY29uc3QgR0x1Ynl0ZSogdHAgPSB0ZXhjb29yZEFycmF5W2ldLmVsZW1lbnQoCisgICAgICAgICAgICAgICAgICAgIHYtPmluZGV4ICYgdmVydGV4X2NhY2hlX3Q6OklOREVYX01BU0spOworICAgICAgICAgICAgdGV4Y29vcmRBcnJheVtpXS5mZXRjaChjLCBjb29yZHMudiwgdHApOworCisgICAgICAgICAgICAvLyB0cmFuc2Zvcm0gdGV4dHVyZSBjb29yZGluYXRlcy4uLgorICAgICAgICAgICAgY29vcmRzLlEgPSAweDEwMDAwOworICAgICAgICAgICAgY29uc3QgdHJhbnNmb3JtX3QmIHRyID0gYy0+dHJhbnNmb3Jtcy50ZXh0dXJlW2ldLnRyYW5zZm9ybTsgCisgICAgICAgICAgICBpZiAoZ2dsX3VubGlrZWx5KHRyLm9wcykpIHsKKyAgICAgICAgICAgICAgICBjLT5hcnJheXMudGV4X3RyYW5zZm9ybVtpXSgmdHIsICZjb29yZHMsICZjb29yZHMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBkaXZpZGUgYnkgUQorICAgICAgICAgICAgY29uc3QgR0dMZml4ZWQgcSA9IGNvb3Jkcy5ROworICAgICAgICAgICAgaWYgKGdnbF91bmxpa2VseShxICE9IDB4MTAwMDApKSB7CisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBxaW52ID0gZ2dsUmVjaXAyOChxKTsKKyAgICAgICAgICAgICAgICBjb29yZHMuUyA9IGdnbE11bHgoY29vcmRzLlMsIHFpbnYsIDI4KTsKKyAgICAgICAgICAgICAgICBjb29yZHMuVCA9IGdnbE11bHgoY29vcmRzLlQsIHFpbnYsIDI4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICB2MC0+ZmxhZ3MgfD0gdmVydGV4X3Q6OlRUOworICAgIHYxLT5mbGFncyB8PSB2ZXJ0ZXhfdDo6VFQ7CisgICAgdjItPmZsYWdzIHw9IHZlcnRleF90OjpUVDsKK30KKworaW5saW5lIHZvaWQgZmV0Y2hfdGV4Y29vcmQob2dsZXNfY29udGV4dF90KiBjLAorICAgICAgICB2ZXJ0ZXhfdCogdjAsIHZlcnRleF90KiB2MSwgdmVydGV4X3QqIHYyKQoreworICAgIGNvbnN0IHVpbnQzMl90IGVuYWJsZXMgPSBjLT5yYXN0ZXJpemVyLnN0YXRlLmVuYWJsZXM7CisgICAgaWYgKCEoZW5hYmxlcyAmIEdHTF9FTkFCTEVfVE1VUykpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIEZldGNoICYgdHJhbnNmb3JtIHRleHR1cmUgY29vcmRpbmF0ZXMuLi4KKyAgICBpZiAoZ2dsX2xpa2VseSh2MC0+ZmxhZ3MgJiB2MS0+ZmxhZ3MgJiB2Mi0+ZmxhZ3MgJiB2ZXJ0ZXhfdDo6VFQpKSB7CisgICAgICAgIC8vIGFscmVhZHkgZG9uZSBmb3IgYWxsIHRocmVlIHZlcnRpY2VzLCBiYWlsLi4uCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZmV0Y2hfdGV4Y29vcmRfaW1wbChjLCB2MCwgdjEsIHYyKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIDAKKyNwcmFnbWEgbWFyayAtCisjcHJhZ21hIG1hcmsgUG9pbnQKKyNlbmRpZgorCit2b2lkIHByaW1pdGl2ZV9ub3BfcG9pbnQob2dsZXNfY29udGV4dF90KiwgdmVydGV4X3QqKSB7Cit9CisKK3ZvaWQgcHJpbWl0aXZlX3BvaW50KG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYpCit7CisgICAgLy8gbGlnaHRpbmcgJiBjbGFtcGluZy4uLgorICAgIGNvbnN0IHVpbnQzMl90IGVuYWJsZXMgPSBjLT5yYXN0ZXJpemVyLnN0YXRlLmVuYWJsZXM7CisKKyAgICBpZiAoZ2dsX3VubGlrZWx5KCEodi0+ZmxhZ3MgJiB2ZXJ0ZXhfdDo6TElUKSkpIHsKKyAgICAgICAgaWYgKGMtPmxpZ2h0aW5nLmVuYWJsZSkgeworICAgICAgICAgICAgYy0+bGlnaHRpbmcubGlnaHRWZXJ0ZXgoYywgdik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2LT5mbGFncyB8PSB2ZXJ0ZXhfdDo6TElUOworICAgICAgICAgICAgY29uc3QgR0x2b2lkKiBjcCA9IGMtPmFycmF5cy5jb2xvci5lbGVtZW50KAorICAgICAgICAgICAgICAgICAgICB2LT5pbmRleCAmIHZlcnRleF9jYWNoZV90OjpJTkRFWF9NQVNLKTsKKyAgICAgICAgICAgIGMtPmFycmF5cy5jb2xvci5mZXRjaChjLCB2LT5jb2xvci52LCBjcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVuYWJsZXMgJiBHR0xfRU5BQkxFX0ZPRykgeworICAgICAgICAgICAgdi0+Zm9nID0gYy0+Zm9nLmZvZyhjLCB2LT5leWUueik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBYWFg6IHdlIGRvbid0IG5lZWQgdG8gZG8gdGhhdCBlYWNoLXRpbWUKKyAgICAvLyBpZiBjb2xvciBhcnJheSBhbmQgbGlnaHRpbmcgbm90IGVuYWJsZWQgCisgICAgYy0+cmFzdGVyaXplci5wcm9jcy5jb2xvcjR4dihjLCB2LT5jb2xvci52KTsKKworICAgIC8vIFhYWDogbG9vayBpbnRvIEVTIHBvaW50LXNwcml0ZSBleHRlbnNpb24KKyAgICBpZiAoZW5hYmxlcyAmIEdHTF9FTkFCTEVfVE1VUykgeworICAgICAgICBmZXRjaF90ZXhjb29yZChjLCB2LHYsdik7CisgICAgICAgIGZvciAoaW50IGk9MCA7IGk8R0dMX1RFWFRVUkVfVU5JVF9DT1VOVCA7IGkrKykgeworICAgICAgICAgICAgaWYgKCFjLT5yYXN0ZXJpemVyLnN0YXRlLnRleHR1cmVbaV0uZW5hYmxlKSAKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGludDMyX3QgaXR0WzhdOworICAgICAgICAgICAgaXR0WzFdID0gaXR0WzJdID0gaXR0WzRdID0gaXR0WzVdID0gMDsKKyAgICAgICAgICAgIGl0dFs2XSA9IGl0dFs3XSA9IDE2OyAvLyBYWFg6IGNoZWNrIHRoYXQKKyAgICAgICAgICAgIGlmIChjLT5yYXN0ZXJpemVyLnN0YXRlLnRleHR1cmVbaV0uc193cmFwID09IEdHTF9DTEFNUCkgeworICAgICAgICAgICAgICAgIGludCB3aWR0aCA9IGMtPnRleHR1cmVzLnRtdVtpXS50ZXh0dXJlLT5zdXJmYWNlLndpZHRoOworICAgICAgICAgICAgICAgIGl0dFswXSA9IHYtPnRleHR1cmVbaV0uUyAqIHdpZHRoOworICAgICAgICAgICAgICAgIGl0dFs2XSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYy0+cmFzdGVyaXplci5zdGF0ZS50ZXh0dXJlW2ldLnRfd3JhcCA9PSBHR0xfQ0xBTVApIHsKKyAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0ID0gYy0+dGV4dHVyZXMudG11W2ldLnRleHR1cmUtPnN1cmZhY2UuaGVpZ2h0OworICAgICAgICAgICAgICAgIGl0dFszXSA9IHYtPnRleHR1cmVbaV0uVCAqIGhlaWdodDsKKyAgICAgICAgICAgICAgICBpdHRbN10gPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy50ZXhDb29yZEdyYWRTY2FsZTh4dihjLCBpLCBpdHQpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIGlmIChlbmFibGVzICYgR0dMX0VOQUJMRV9ERVBUSF9URVNUKSB7CisgICAgICAgIGludDMyX3QgaXR6WzNdOworICAgICAgICBpdHpbMF0gPSBjbGFtcFoodi0+d2luZG93LnopICogMHgwMDAxMDAwMTsKKyAgICAgICAgaXR6WzFdID0gaXR6WzJdID0gMDsKKyAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy56R3JhZDN4dihjLCBpdHopOworICAgIH0KKworICAgIGlmIChlbmFibGVzICYgR0dMX0VOQUJMRV9GT0cpIHsKKyAgICAgICAgR0xmaXhlZCBpdGZbM107CisgICAgICAgIGl0ZlswXSA9IHYtPmZvZzsKKyAgICAgICAgaXRmWzFdID0gaXRmWzJdID0gMDsKKyAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy5mb2dHcmFkM3h2KGMsIGl0Zik7CisgICAgfQorCisgICAgLy8gUmVuZGVyIG91ciBwb2ludC4uLgorICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MucG9pbnR4KGMsIHYtPndpbmRvdy52LCBjLT5wb2ludC5zaXplKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIDAKKyNwcmFnbWEgbWFyayAtCisjcHJhZ21hIG1hcmsgTGluZQorI2VuZGlmCisKK3ZvaWQgcHJpbWl0aXZlX25vcF9saW5lKG9nbGVzX2NvbnRleHRfdCosIHZlcnRleF90KiwgdmVydGV4X3QqKSB7Cit9CisKK3ZvaWQgcHJpbWl0aXZlX2xpbmUob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogdjAsIHZlcnRleF90KiB2MSkKK3sKKyAgICAvLyBnZXQgdGV4dHVyZSBjb29yZGluYXRlcworICAgIGZldGNoX3RleGNvb3JkKGMsIHYwLCB2MSwgdjEpOworCisgICAgLy8gbGlnaHQvc2hhZGUgdGhlIHZlcnRpY2VzIGZpcnN0ICh0aGV5J3JlIGNvcGllZCBiZWxvdykKKyAgICBjLT5saWdodGluZy5saWdodFRyaWFuZ2xlKGMsIHYwLCB2MSwgdjEpOworCisgICAgLy8gY2xpcCB0aGUgbGluZSBpZiBuZWVkZWQKKyAgICBpZiAoZ2dsX3VubGlrZWx5KCh2MC0+ZmxhZ3MgfCB2MS0+ZmxhZ3MpICYgdmVydGV4X3Q6OkNMSVBfQUxMKSkgeworICAgICAgICB1bnNpZ25lZCBpbnQgY291bnQgPSBjbGlwX2xpbmUoYywgdjAsIHYxKTsKKyAgICAgICAgaWYgKGdnbF91bmxpa2VseShjb3VudCA9PSAwKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBjb21wdXRlIGl0ZXJhdG9ycy4uLgorICAgIGNvbnN0IHVpbnQzMl90IGVuYWJsZXMgPSBjLT5yYXN0ZXJpemVyLnN0YXRlLmVuYWJsZXM7CisgICAgY29uc3QgdWludDMyX3QgbWFzayA9ICAgR0dMX0VOQUJMRV9UTVVTIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHR0xfRU5BQkxFX1NNT09USCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0dMX0VOQUJMRV9XIHwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0dMX0VOQUJMRV9GT0cgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdHTF9FTkFCTEVfREVQVEhfVEVTVDsKKworICAgIGlmIChnZ2xfdW5saWtlbHkoZW5hYmxlcyAmIG1hc2spKSB7CisgICAgICAgIGMtPmxlcnAuaW5pdExpbmUodjAsIHYxKTsKKyAgICAgICAgbGVycF90cmlhbmdsZShjLCB2MCwgdjEsIHYwKTsKKyAgICB9CisKKyAgICAvLyByZW5kZXIgb3VyIGxpbmUKKyAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmxpbmV4KGMsIHYwLT53aW5kb3cudiwgdjEtPndpbmRvdy52LCBjLT5saW5lLndpZHRoKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIDAKKyNwcmFnbWEgbWFyayAtCisjcHJhZ21hIG1hcmsgVHJpYW5nbGUKKyNlbmRpZgorCit2b2lkIHByaW1pdGl2ZV9ub3BfdHJpYW5nbGUob2dsZXNfY29udGV4dF90KiBjLAorICAgICAgICB2ZXJ0ZXhfdCogdjAsIHZlcnRleF90KiB2MSwgdmVydGV4X3QqIHYyKSB7Cit9CisKK3ZvaWQgcHJpbWl0aXZlX2NsaXBfdHJpYW5nbGUob2dsZXNfY29udGV4dF90KiBjLAorICAgICAgICB2ZXJ0ZXhfdCogdjAsIHZlcnRleF90KiB2MSwgdmVydGV4X3QqIHYyKQoreworICAgIHVpbnQzMl90IGNjID0gKHYwLT5mbGFncyB8IHYxLT5mbGFncyB8IHYyLT5mbGFncykgJiB2ZXJ0ZXhfdDo6Q0xJUF9BTEw7CisgICAgaWYgKGdnbF9saWtlbHkoIWNjKSkgeworICAgICAgICAvLyBjb2RlIGJlbG93IG11c3QgYmUgYXMgb3B0aW1pemVkIGFzIHBvc3NpYmxlLCB0aGlzIGlzIHRoZQorICAgICAgICAvLyBjb21tb24gY29kZSBwYXRoLgorCisgICAgICAgIC8vIFRoaXMgdHJpYW5nbGUgaXMgbm90IGNsaXBwZWQsIHRlc3QgaWYgaXQncyBjdWxsZWQKKyAgICAgICAgLy8gdW5jbGlwcGVkIHRyaWFuZ2xlLi4uCisgICAgICAgIGMtPmxlcnAuaW5pdFRyaWFuZ2xlKHYwLCB2MSwgdjIpOworICAgICAgICBpZiAoY3VsbF90cmlhbmdsZShjLCB2MCwgdjEsIHYyKSkKKyAgICAgICAgICAgIHJldHVybjsgLy8gY3VsbGVkIQorCisgICAgICAgIC8vIEZldGNoIGFsbCB0ZXh0dXJlIGNvb3JkaW5hdGVzIGlmIG5lZWRlZAorICAgICAgICBmZXRjaF90ZXhjb29yZChjLCB2MCwgdjEsIHYyKTsKKworICAgICAgICAvLyBsaWdodCAob3Igc2hhZGUpIG91ciB0cmlhbmdsZSEKKyAgICAgICAgYy0+bGlnaHRpbmcubGlnaHRUcmlhbmdsZShjLCB2MCwgdjEsIHYyKTsKKworICAgICAgICB0cmlhbmdsZShjLCB2MCwgdjEsIHYyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFRoZSBhc3N1bXB0aW9uIGhlcmUgaXMgdGhhdCB3ZSdyZSBub3QgZ29pbmcgdG8gY2xpcCB2ZXJ5IG9mdGVuLAorICAgIC8vIGFuZCBldmVuIG1vcmUgcmFyZWx5IHdpbGwgd2UgY2xpcCBhIHRyaWFuZ2xlIHRoYXQgZW5kcyB1cAorICAgIC8vIGJlaW5nIGN1bGxlZCBvdXQuIFNvIGl0J3Mgb2theSB0byBsaWdodCB0aGUgdmVydGljZXMgaGVyZSwgZXZlbiB0aG91Z2gKKyAgICAvLyBpbiBhIGZldyBjYXNlcyB3ZSB3b24ndCByZW5kZXIgdGhlIHRyaWFuZ2xlIChpZiBjdWxsZWQpLgorCisgICAgLy8gRmV0Y2ggdGV4dHVyZSBjb29yZGluYXRlcy4uLgorICAgIGZldGNoX3RleGNvb3JkKGMsIHYwLCB2MSwgdjIpOworCisgICAgLy8gbGlnaHQgKG9yIHNoYWRlKSBvdXIgdHJpYW5nbGUhCisgICAgYy0+bGlnaHRpbmcubGlnaHRUcmlhbmdsZShjLCB2MCwgdjEsIHYyKTsKKworICAgIGNsaXBfdHJpYW5nbGUoYywgdjAsIHYxLCB2Mik7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgdHJpYW5nbGUob2dsZXNfY29udGV4dF90KiBjLAorICAgICAgICB2ZXJ0ZXhfdCogdjAsIHZlcnRleF90KiB2MSwgdmVydGV4X3QqIHYyKQoreworICAgIC8vIGNvbXB1dGUgaXRlcmF0b3JzLi4uCisgICAgY29uc3QgdWludDMyX3QgZW5hYmxlcyA9IGMtPnJhc3Rlcml6ZXIuc3RhdGUuZW5hYmxlczsKKyAgICBjb25zdCB1aW50MzJfdCBtYXNrID0gICBHR0xfRU5BQkxFX1RNVVMgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdHTF9FTkFCTEVfU01PT1RIIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHR0xfRU5BQkxFX1cgfCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHR0xfRU5BQkxFX0ZPRyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0dMX0VOQUJMRV9ERVBUSF9URVNUOworCisgICAgaWYgKGdnbF9saWtlbHkoZW5hYmxlcyAmIG1hc2spKQorICAgICAgICBsZXJwX3RyaWFuZ2xlKGMsIHYwLCB2MSwgdjIpOworCisgICAgYy0+cmFzdGVyaXplci5wcm9jcy50cmlhbmdsZXgoYywgdjAtPndpbmRvdy52LCB2MS0+d2luZG93LnYsIHYyLT53aW5kb3cudik7Cit9CisKK3ZvaWQgbGVycF90cmlhbmdsZShvZ2xlc19jb250ZXh0X3QqIGMsCisgICAgICAgIHZlcnRleF90KiB2MCwgdmVydGV4X3QqIHYxLCB2ZXJ0ZXhfdCogdjIpCit7CisgICAgY29uc3QgdWludDMyX3QgZW5hYmxlcyA9IGMtPnJhc3Rlcml6ZXIuc3RhdGUuZW5hYmxlczsKKyAgICBjLT5sZXJwLmluaXRMZXJwKHYwLCBlbmFibGVzKTsKKworICAgIC8vIHNldCB1cCB0ZXh0dXJlIGl0ZXJhdG9ycworICAgIGlmIChlbmFibGVzICYgR0dMX0VOQUJMRV9UTVVTKSB7CisgICAgICAgIGlmIChlbmFibGVzICYgR0dMX0VOQUJMRV9XKSB7CisgICAgICAgICAgICBsZXJwX3RleGNvb3Jkc193KGMsIHYwLCB2MSwgdjIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGVycF90ZXhjb29yZHMoYywgdjAsIHYxLCB2Mik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBzZXQgdXAgdGhlIGNvbG9yIGl0ZXJhdG9ycworICAgIGNvbnN0IGNvbXB1dGVfaXRlcmF0b3JzX3QmIGxlcnAgPSBjLT5sZXJwOworICAgIGlmIChlbmFibGVzICYgR0dMX0VOQUJMRV9TTU9PVEgpIHsKKyAgICAgICAgR0xmaXhlZCBpdGNbMTJdOworICAgICAgICBmb3IgKGludCBpPTAgOyBpPDQgOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IEdHTGNvbG9yIGMwID0gdjAtPmNvbG9yLnZbaV0gKiAyNTU7CisgICAgICAgICAgICBjb25zdCBHR0xjb2xvciBjMSA9IHYxLT5jb2xvci52W2ldICogMjU1OworICAgICAgICAgICAgY29uc3QgR0dMY29sb3IgYzIgPSB2Mi0+Y29sb3IudltpXSAqIDI1NTsKKyAgICAgICAgICAgIGxlcnAuaXRlcmF0b3JzMTYxNigmaXRjW2kqM10sIGMwLCBjMSwgYzIpOworICAgICAgICB9CisgICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuY29sb3JHcmFkMTJ4dihjLCBpdGMpOworICAgIH0KKworICAgIGlmIChlbmFibGVzICYgR0dMX0VOQUJMRV9ERVBUSF9URVNUKSB7CisgICAgICAgIGludDMyX3QgaXR6WzNdOworICAgICAgICBjb25zdCBpbnQzMl90IHYweiA9IGNsYW1wWih2MC0+d2luZG93LnopOworICAgICAgICBjb25zdCBpbnQzMl90IHYxeiA9IGNsYW1wWih2MS0+d2luZG93LnopOworICAgICAgICBjb25zdCBpbnQzMl90IHYyeiA9IGNsYW1wWih2Mi0+d2luZG93LnopOworICAgICAgICBpZiAoZ2dsX3VubGlrZWx5KGMtPnBvbHlnb25PZmZzZXQuZW5hYmxlKSkgeworICAgICAgICAgICAgY29uc3QgaW50MzJfdCB1bml0cyA9IChjLT5wb2x5Z29uT2Zmc2V0LnVuaXRzIDw8IDE2KTsKKyAgICAgICAgICAgIGNvbnN0IEdMZml4ZWQgZmFjdG9yID0gYy0+cG9seWdvbk9mZnNldC5mYWN0b3I7CisgICAgICAgICAgICBpZiAoZmFjdG9yKSB7CisgICAgICAgICAgICAgICAgaW50NjRfdCBpdHo2NFszXTsKKyAgICAgICAgICAgICAgICBsZXJwLml0ZXJhdG9yczAwMzIoaXR6NjQsIHYweiwgdjF6LCB2MnopOworICAgICAgICAgICAgICAgIGludDY0X3QgbWF4RGVwdGhTbG9wZSA9IG1heChpdHo2NFsxXSwgaXR6NjRbMl0pOworICAgICAgICAgICAgICAgIGl0elswXSA9IHVpbnQzMl90KGl0ejY0WzBdKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICsgdWludDMyX3QoKG1heERlcHRoU2xvcGUqZmFjdG9yKT4+MTYpICsgdW5pdHM7CisgICAgICAgICAgICAgICAgaXR6WzFdID0gdWludDMyX3QoaXR6NjRbMV0pOworICAgICAgICAgICAgICAgIGl0elsyXSA9IHVpbnQzMl90KGl0ejY0WzJdKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbGVycC5pdGVyYXRvcnMwMDMyKGl0eiwgdjB6LCB2MXosIHYyeik7CisgICAgICAgICAgICAgICAgaXR6WzBdICs9IHVuaXRzOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxlcnAuaXRlcmF0b3JzMDAzMihpdHosIHYweiwgdjF6LCB2MnopOworICAgICAgICB9CisgICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuekdyYWQzeHYoYywgaXR6KTsKKyAgICB9ICAgIAorCisgICAgaWYgKGdnbF91bmxpa2VseShlbmFibGVzICYgR0dMX0VOQUJMRV9GT0cpKSB7CisgICAgICAgIEdMZml4ZWQgaXRmWzNdOworICAgICAgICBsZXJwLml0ZXJhdG9yczE2MTYoaXRmLCB2MC0+Zm9nLCB2MS0+Zm9nLCB2Mi0+Zm9nKTsKKyAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy5mb2dHcmFkM3h2KGMsIGl0Zik7CisgICAgfQorfQorCisKK3N0YXRpYyBpbmxpbmUKK2ludCBjb21wdXRlX2xvZChvZ2xlc19jb250ZXh0X3QqIGMsIGludCBpLAorICAgICAgICBpbnQzMl90IHMwLCBpbnQzMl90IHQwLCBpbnQzMl90IHMxLCBpbnQzMl90IHQxLCBpbnQzMl90IHMyLCBpbnQzMl90IHQyKQoreworICAgIC8vIENvbXB1dGUgbWlwbWFwIGxldmVsIC8gcHJpbWl0aXZlCisgICAgLy8gcmhvID0gc3FydCggdGV4ZWxBcmVhIC8gYXJlYSApCisgICAgLy8gbG9kID0gbG9nMiggcmhvICkKKyAgICAvLyBsb2QgPSBsb2cyKCB0ZXhlbEFyZWEgLyBhcmVhICkgLyAyCisgICAgLy8gbG9kID0gKGxvZzIoIHRleGVsQXJlYSApIC0gbG9nMiggYXJlYSApKSAvIDIKKyAgICBjb25zdCBjb21wdXRlX2l0ZXJhdG9yc190JiBsZXJwID0gYy0+bGVycDsKKyAgICBjb25zdCBHR0xjb29yZCBhcmVhID0gYWJzKGxlcnAuYXJlYSgpKTsKKyAgICBjb25zdCBpbnQgdyA9IGMtPnRleHR1cmVzLnRtdVtpXS50ZXh0dXJlLT5zdXJmYWNlLndpZHRoOworICAgIGNvbnN0IGludCBoID0gYy0+dGV4dHVyZXMudG11W2ldLnRleHR1cmUtPnN1cmZhY2UuaGVpZ2h0OworICAgIGNvbnN0IGludCBzaGlmdCA9IDE2ICsgKDE2IC0gVFJJX0ZSQUNUSU9OX0JJVFMpOworICAgIGludDMyX3QgdGV4ZWxBcmVhID0gYWJzKCBnZ2xNdWx4KHMxLXMwLCB0Mi10MCwgc2hpZnQpIC0KKyAgICAgICAgICAgIGdnbE11bHgoczItczAsIHQxLXQwLCBzaGlmdCkgKSp3Kmg7CisgICAgaW50IGxvZzJUQXJlYSA9ICgzMi1UUklfRlJBQ1RJT05fQklUUyAgLTEpIC0gZ2dsQ2x6KHRleGVsQXJlYSk7CisgICAgaW50IGxvZzJBcmVhICA9ICgzMi1UUklfRlJBQ1RJT05fQklUUyoyLTEpIC0gZ2dsQ2x6KGFyZWEpOworICAgIGludCBsb2QgPSAobG9nMlRBcmVhIC0gbG9nMkFyZWEgKyAxKSA+PiAxOworICAgIHJldHVybiBsb2Q7Cit9CisKK3ZvaWQgbGVycF90ZXhjb29yZHMob2dsZXNfY29udGV4dF90KiBjLAorICAgICAgICB2ZXJ0ZXhfdCogdjAsIHZlcnRleF90KiB2MSwgdmVydGV4X3QqIHYyKQoreworICAgIGNvbnN0IGNvbXB1dGVfaXRlcmF0b3JzX3QmIGxlcnAgPSBjLT5sZXJwOworICAgIGludDMyX3QgaXR0WzhdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMTYpKSk7CisgICAgZm9yIChpbnQgaT0wIDsgaTxHR0xfVEVYVFVSRV9VTklUX0NPVU5UIDsgaSsrKSB7CisgICAgICAgIGNvbnN0IHRleHR1cmVfdCYgdG11ID0gYy0+cmFzdGVyaXplci5zdGF0ZS50ZXh0dXJlW2ldOworICAgICAgICBpZiAoIXRtdS5lbmFibGUpIAorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgLy8gY29tcHV0ZSB0aGUgamFjb2JpYW5zIHVzaW5nIGJsb2NrIGZsb2F0aW5nLXBvaW50CisgICAgICAgIGludDMyX3QgczAgPSB2MC0+dGV4dHVyZVtpXS5TOworICAgICAgICBpbnQzMl90IHQwID0gdjAtPnRleHR1cmVbaV0uVDsKKyAgICAgICAgaW50MzJfdCBzMSA9IHYxLT50ZXh0dXJlW2ldLlM7CisgICAgICAgIGludDMyX3QgdDEgPSB2MS0+dGV4dHVyZVtpXS5UOworICAgICAgICBpbnQzMl90IHMyID0gdjItPnRleHR1cmVbaV0uUzsKKyAgICAgICAgaW50MzJfdCB0MiA9IHYyLT50ZXh0dXJlW2ldLlQ7CisKKyAgICAgICAgY29uc3QgR0xlbnVtIG1pbl9maWx0ZXIgPSBjLT50ZXh0dXJlcy50bXVbaV0udGV4dHVyZS0+bWluX2ZpbHRlcjsKKyAgICAgICAgaWYgKGdnbF91bmxpa2VseShtaW5fZmlsdGVyID49IEdMX05FQVJFU1RfTUlQTUFQX05FQVJFU1QpKSB7CisgICAgICAgICAgICBpbnQgbG9kID0gY29tcHV0ZV9sb2QoYywgaSwgczAsIHQwLCBzMSwgdDEsIHMyLCB0Mik7CisgICAgICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmJpbmRUZXh0dXJlTG9kKGMsIGksCisgICAgICAgICAgICAgICAgICAgICZjLT50ZXh0dXJlcy50bXVbaV0udGV4dHVyZS0+bWlwKGxvZCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gcHJlbXVsdGlwbHkgKHMsdCkgd2hlbiBjbGFtcGxpbmcKKyAgICAgICAgaWYgKHRtdS5zX3dyYXAgPT0gR0dMX0NMQU1QKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgd2lkdGggPSB0bXUuc3VyZmFjZS53aWR0aDsKKyAgICAgICAgICAgIHMwICo9IHdpZHRoOworICAgICAgICAgICAgczEgKj0gd2lkdGg7CisgICAgICAgICAgICBzMiAqPSB3aWR0aDsKKyAgICAgICAgfQorICAgICAgICBpZiAodG11LnRfd3JhcCA9PSBHR0xfQ0xBTVApIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBoZWlnaHQgPSB0bXUuc3VyZmFjZS5oZWlnaHQ7CisgICAgICAgICAgICB0MCAqPSBoZWlnaHQ7CisgICAgICAgICAgICB0MSAqPSBoZWlnaHQ7CisgICAgICAgICAgICB0MiAqPSBoZWlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgaXR0WzZdID0gLWxlcnAuaXRlcmF0b3JzU2NhbGUoaXR0KzAsIHMwLCBzMSwgczIpOworICAgICAgICBpdHRbN10gPSAtbGVycC5pdGVyYXRvcnNTY2FsZShpdHQrMywgdDAsIHQxLCB0Mik7CisgICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MudGV4Q29vcmRHcmFkU2NhbGU4eHYoYywgaSwgaXR0KTsKKyAgICB9Cit9CisKK3ZvaWQgbGVycF90ZXhjb29yZHNfdyhvZ2xlc19jb250ZXh0X3QqIGMsCisgICAgICAgIHZlcnRleF90KiB2MCwgdmVydGV4X3QqIHYxLCB2ZXJ0ZXhfdCogdjIpCit7CisgICAgY29uc3QgY29tcHV0ZV9pdGVyYXRvcnNfdCYgbGVycCA9IGMtPmxlcnA7CisgICAgaW50MzJfdCBpdHRbOF0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgxNikpKTsKKyAgICBpbnQzMl90IGl0d1szXTsKKworICAgIC8vIGNvbXB1dGUgVydzIHNjYWxlIHRvIDIuMzAKKyAgICBpbnQzMl90IHcwID0gdjAtPndpbmRvdy53OworICAgIGludDMyX3QgdzEgPSB2MS0+d2luZG93Lnc7CisgICAgaW50MzJfdCB3MiA9IHYyLT53aW5kb3cudzsKKyAgICBpbnQgd3NjYWxlID0gMzIgLSBnZ2xDbHoodzB8dzF8dzIpOworCisgICAgLy8gY29tcHV0ZSB0aGUgamFjb2JpYW4gdXNpbmcgYmxvY2sgZmxvYXRpbmctcG9pbnQgICAgCisgICAgaW50IHNjID0gbGVycC5pdGVyYXRvcnNTY2FsZShpdHcsIHcwLCB3MSwgdzIpOworICAgIHNjICs9ICB3c2NhbGUgLSAxNjsKKyAgICBjLT5yYXN0ZXJpemVyLnByb2NzLndHcmFkM3h2KGMsIGl0dyk7CisKKyAgICBmb3IgKGludCBpPTAgOyBpPEdHTF9URVhUVVJFX1VOSVRfQ09VTlQgOyBpKyspIHsKKyAgICAgICAgY29uc3QgdGV4dHVyZV90JiB0bXUgPSBjLT5yYXN0ZXJpemVyLnN0YXRlLnRleHR1cmVbaV07CisgICAgICAgIGlmICghdG11LmVuYWJsZSkgCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAvLyBjb21wdXRlIHRoZSBqYWNvYmlhbnMgdXNpbmcgYmxvY2sgZmxvYXRpbmctcG9pbnQKKyAgICAgICAgaW50MzJfdCBzMCA9IHYwLT50ZXh0dXJlW2ldLlM7CisgICAgICAgIGludDMyX3QgdDAgPSB2MC0+dGV4dHVyZVtpXS5UOworICAgICAgICBpbnQzMl90IHMxID0gdjEtPnRleHR1cmVbaV0uUzsKKyAgICAgICAgaW50MzJfdCB0MSA9IHYxLT50ZXh0dXJlW2ldLlQ7CisgICAgICAgIGludDMyX3QgczIgPSB2Mi0+dGV4dHVyZVtpXS5TOworICAgICAgICBpbnQzMl90IHQyID0gdjItPnRleHR1cmVbaV0uVDsKKworICAgICAgICBjb25zdCBHTGVudW0gbWluX2ZpbHRlciA9IGMtPnRleHR1cmVzLnRtdVtpXS50ZXh0dXJlLT5taW5fZmlsdGVyOworICAgICAgICBpZiAoZ2dsX3VubGlrZWx5KG1pbl9maWx0ZXIgPj0gR0xfTkVBUkVTVF9NSVBNQVBfTkVBUkVTVCkpIHsKKyAgICAgICAgICAgIGludCBsb2QgPSBjb21wdXRlX2xvZChjLCBpLCBzMCwgdDAsIHMxLCB0MSwgczIsIHQyKTsKKyAgICAgICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuYmluZFRleHR1cmVMb2QoYywgaSwKKyAgICAgICAgICAgICAgICAgICAgJmMtPnRleHR1cmVzLnRtdVtpXS50ZXh0dXJlLT5taXAobG9kKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBwcmVtdWx0aXBseSAocyx0KSB3aGVuIGNsYW1wbGluZworICAgICAgICBpZiAodG11LnNfd3JhcCA9PSBHR0xfQ0xBTVApIHsKKyAgICAgICAgICAgIGNvbnN0IGludCB3aWR0aCA9IHRtdS5zdXJmYWNlLndpZHRoOworICAgICAgICAgICAgczAgKj0gd2lkdGg7CisgICAgICAgICAgICBzMSAqPSB3aWR0aDsKKyAgICAgICAgICAgIHMyICo9IHdpZHRoOworICAgICAgICB9CisgICAgICAgIGlmICh0bXUudF93cmFwID09IEdHTF9DTEFNUCkgeworICAgICAgICAgICAgY29uc3QgaW50IGhlaWdodCA9IHRtdS5zdXJmYWNlLmhlaWdodDsKKyAgICAgICAgICAgIHQwICo9IGhlaWdodDsKKyAgICAgICAgICAgIHQxICo9IGhlaWdodDsKKyAgICAgICAgICAgIHQyICo9IGhlaWdodDsKKyAgICAgICAgfQorCisgICAgICAgIHMwID0gZ2dsTXVseChzMCwgdzAsIHdzY2FsZSk7CisgICAgICAgIHQwID0gZ2dsTXVseCh0MCwgdzAsIHdzY2FsZSk7CisgICAgICAgIHMxID0gZ2dsTXVseChzMSwgdzEsIHdzY2FsZSk7CisgICAgICAgIHQxID0gZ2dsTXVseCh0MSwgdzEsIHdzY2FsZSk7CisgICAgICAgIHMyID0gZ2dsTXVseChzMiwgdzIsIHdzY2FsZSk7CisgICAgICAgIHQyID0gZ2dsTXVseCh0MiwgdzIsIHdzY2FsZSk7CisKKyAgICAgICAgaXR0WzZdID0gc2MgLSBsZXJwLml0ZXJhdG9yc1NjYWxlKGl0dCswLCBzMCwgczEsIHMyKTsKKyAgICAgICAgaXR0WzddID0gc2MgLSBsZXJwLml0ZXJhdG9yc1NjYWxlKGl0dCszLCB0MCwgdDEsIHQyKTsKKyAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy50ZXhDb29yZEdyYWRTY2FsZTh4dihjLCBpLCBpdHQpOworICAgIH0KK30KKworCitzdGF0aWMgaW5saW5lCitib29sIGN1bGxfdHJpYW5nbGUob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogdjAsIHZlcnRleF90KiB2MSwgdmVydGV4X3QqIHYyKQoreworICAgIGlmIChnZ2xfbGlrZWx5KGMtPmN1bGwuZW5hYmxlKSkgeworICAgICAgICBjb25zdCBHTGVudW0gd2luZGluZyA9IChjLT5sZXJwLmFyZWEoKSA+IDApID8gR0xfQ1cgOiBHTF9DQ1c7CisgICAgICAgIGNvbnN0IEdMZW51bSBmYWNlID0gKHdpbmRpbmcgPT0gYy0+Y3VsbC5mcm9udEZhY2UpID8gR0xfRlJPTlQgOiBHTF9CQUNLOworICAgICAgICBpZiAoZmFjZSA9PSBjLT5jdWxsLmN1bGxGYWNlKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIGN1bGxlZCEKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lCitHTGZpeGVkIGZydXN0dW1QbGFuZURpc3QoaW50IHBsYW5lLCBjb25zdCB2ZWM0X3QmIHMpCit7CisgICAgY29uc3QgR0xmaXhlZCBkID0gcy52WyBwbGFuZSA+PiAxIF07CisgICAgcmV0dXJuICAoKHBsYW5lICYgMSkgPyAocy53IC0gZCkgOiAocy53ICsgZCkpOyAKK30KKworc3RhdGljIGlubGluZQoraW50MzJfdCBjbGlwRGl2aWRlKEdMZml4ZWQgYSwgR0xmaXhlZCBiKSB7CisgICAgLy8gcmV0dXJucyBhIDQuMjggZml4ZWQtcG9pbnQKKyAgICByZXR1cm4gZ2dsTXVsRGl2aSgxTFU8PDI4LCBhLCBiKTsKK30gCisKK3ZvaWQgY2xpcF90cmlhbmdsZShvZ2xlc19jb250ZXh0X3QqIGMsCisgICAgICAgIHZlcnRleF90KiB2MCwgdmVydGV4X3QqIHYxLCB2ZXJ0ZXhfdCogdjIpCit7CisgICAgdWludDMyX3QgYWxsX2NjID0gKHYwLT5mbGFncyB8IHYxLT5mbGFncyB8IHYyLT5mbGFncykgJiB2ZXJ0ZXhfdDo6Q0xJUF9BTEw7CisKKyAgICB2ZXJ0ZXhfdCAqcDAsICpwMSwgKnAyOworICAgIGNvbnN0IGludCBNQVhfQ0xJUFBJTkdfUExBTkVTID0gNiArIE9HTEVTX01BWF9DTElQX1BMQU5FUzsKKyAgICBjb25zdCBpbnQgTUFYX1ZFUlRJQ0VTID0gMzsKKworICAgIC8vIFRlbXBvcmFyeSBidWZmZXIgdG8gaG9sZCB0aGUgbmV3IHZlcnRpY2VzLiBFYWNoIHBsYW5lIGNhbiBhZGQgdXAgdG8gCisgICAgLy8gdHdvIG5ldyB2ZXJ0aWNlcyAoYmVjYXVzZSB0aGUgcG9seWdvbiBpcyBjb252ZXgpLgorICAgIC8vIFdlIG5lZWQgb25lIGV4dHJhIGVsZW1lbnQsIHRvIGhhbmRsZSBhbiBvdmVyZmxvdyBjYXNlIHdoZW4KKyAgICAvLyB0aGUgcG9seWdvbiBkZWdlbmVyYXRlcyBpbnRvIHNvbWV0aGluZyBub24gY29udmV4LgorICAgIHZlcnRleF90IGJ1ZmZlcltNQVhfQ0xJUFBJTkdfUExBTkVTICogMiArIDFdOyAgIC8vIH4zS0IKKyAgICB2ZXJ0ZXhfdCogYnVmID0gYnVmZmVyOworCisgICAgLy8gb3JpZ2luYWwgbGlzdCBvZiB2ZXJ0aWNlcyAocG9seWdvbiB0byBjbGlwLCBpbiBmYWN0IHRoaXMKKyAgICAvLyBmdW5jdGlvbiB3b3JrcyB3aXRoIGFuIGFyYml0cmFyeSBwb2x5Z29uKS4KKyAgICB2ZXJ0ZXhfdCogaW5bM10gPSB7IHYwLCB2MSwgdjIgfTsKKyAgICAKKyAgICAvLyBvdXRwdXQgbGlzdHMgKHdlIG5lZWQgMiwgd2hpY2ggd2UgdXNlIGJhY2sgYW5kIGZvcnRoKQorICAgIC8vIChtYXhpbXVtIG91dHBvdXQgbGlzdCdzIHNpemUgaXMgTUFYX0NMSVBQSU5HX1BMQU5FUyArIE1BWF9WRVJUSUNFUykKKyAgICAvLyAyIG1vcmUgZWxlbWVudHMgZm9yIG92ZXJmbG93IHdoZW4gbm9uIGNvbnZleCBwb2x5Z29ucy4KKyAgICB2ZXJ0ZXhfdCogb3V0WzJdW01BWF9DTElQUElOR19QTEFORVMgKyBNQVhfVkVSVElDRVMgKyAyXTsKKyAgICB1bnNpZ25lZCBpbnQgb3V0aSA9IDA7CisgICAgCisgICAgLy8gY3VycmVudCBpbnB1dCBsaXN0CisgICAgdmVydGV4X3QqKiBpdmwgPSBpbjsKKworICAgIC8vIDMgaW5wdXQgdmVydGljZXMsIDAgaW4gdGhlIG91dHB1dCBsaXN0LCBmaXJzdCBwbGFuZQorICAgIHVuc2lnbmVkIGludCBpYyA9IDM7CisKKyAgICAvLyBVc2VyIGNsaXAtcGxhbmVzIGZpcnN0LCB0aGUgY2xpcHBpbmcgaXMgYWx3YXlzIGRvbmUgaW4gZXllLWNvb3JkaW5hdGUKKyAgICAvLyB0aGlzIGlzIGJhc2ljYWxseSB0aGUgc2FtZSBhbGdvcml0aG0gdGhhbiBmb3IgdGhlIHZpZXctdm9sdW1lCisgICAgLy8gY2xpcHBpbmcsIGV4Y2VwdCBmb3IgdGhlIGNvbXB1dGF0aW9uIG9mIHRoZSBkaXN0YW5jZSAodmVydGV4LCBwbGFuZSkKKyAgICAvLyBhbmQgdGhlIGZhY3QgdGhhdCB3ZSBuZWVkIHRvIGNvbXB1dGUgdGhlIGV5ZS1jb29yZGluYXRlcyBvZiBlYWNoCisgICAgLy8gbmV3IHZlcnRleCB3ZSBjcmVhdGUuCisgICAgCisgICAgaWYgKGdnbF91bmxpa2VseShhbGxfY2MgJiB2ZXJ0ZXhfdDo6VVNFUl9DTElQX0FMTCkpCisgICAgeworICAgICAgICB1bnNpZ25lZCBpbnQgcGxhbmUgPSAwOworICAgICAgICB1aW50MzJfdCBjYyA9IChhbGxfY2MgJiB2ZXJ0ZXhfdDo6VVNFUl9DTElQX0FMTCkgPj4gODsKKyAgICAgICAgZG8geworICAgICAgICAgICAgaWYgKGNjICYgMSkgeyAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gcG9pbnRlcnMgdG8gb3VyIG91dHB1dCBsaXN0IChoZWFkIGFuZCBjdXJyZW50KQorICAgICAgICAgICAgICAgIHZlcnRleF90KiogY29uc3Qgb3ZsID0gJm91dFtvdXRpXVswXTsKKyAgICAgICAgICAgICAgICB2ZXJ0ZXhfdCoqIG91dHB1dCA9IG92bDsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgb2MgPSAwOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzZW50aW5lbCA9IDA7CisgICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgdmVydGV4LCBjb21wdXRlIGRpc3RhbmNlIHRvIHRoZSBwbGFuZQorICAgICAgICAgICAgICAgIHZlcnRleF90KiBzID0gaXZsW2ljLTFdOworICAgICAgICAgICAgICAgIGNvbnN0IHZlYzRfdCYgZXF1YXRpb24gPSBjLT5jbGlwUGxhbmVzLnBsYW5lW3BsYW5lXS5lcXVhdGlvbjsKKyAgICAgICAgICAgICAgICBHTGZpeGVkIHNkID0gZG90NChlcXVhdGlvbi52LCBzLT5leWUudik7CisgICAgICAgICAgICAgICAgLy8gY2xpcCBlYWNoIHZlcnRleCBhZ2FpbnN0IHRoaXMgcGxhbmUuLi4KKyAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpPTAgOyBpPGljIDsgaSsrKSB7ICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHZlcnRleF90KiBwID0gaXZsW2ldOworICAgICAgICAgICAgICAgICAgICBjb25zdCBHTGZpeGVkIHBkID0gZG90NChlcXVhdGlvbi52LCBwLT5leWUudik7CisgICAgICAgICAgICAgICAgICAgIGlmIChzZCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGQgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvdGggaW5zaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm91dHB1dCsrID0gcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYysrOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzIGluc2lkZSwgcCBvdXRzaWRlIChleGl0aW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMZml4ZWQgdCA9IGNsaXBEaXZpZGUoc2QsIHNkLXBkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5hcnJheXMuY2xpcEV5ZShjLCBidWYsIHQsIHAsIHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvdXRwdXQrKyA9IGJ1ZisrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9jKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCsrc2VudGluZWwgPj0gMykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBub24tY29udmV4IHBvbHlnb24hCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGQgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHMgb3V0c2lkZSAoZW50ZXJpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMZml4ZWQgdCA9IGNsaXBEaXZpZGUocGQsIHBkLXNkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+YXJyYXlzLmNsaXBFeWUoYywgYnVmLCB0LCBzLCBwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm91dHB1dCsrID0gYnVmKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9jKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgrK3NlbnRpbmVsID49IDMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vIG5vbi1jb252ZXggcG9seWdvbiEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm91dHB1dCsrID0gcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYysrOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvdGggb3V0c2lkZQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHMgPSBwOworICAgICAgICAgICAgICAgICAgICBzZCA9IHBkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBvdXRwdXQgbGlzdCBiZWNvbWUgdGhlIG5ldyBpbnB1dCBsaXN0CisgICAgICAgICAgICAgICAgaWYgKG9jPDMpCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gbGVzcyB0aGFuIDMgdmVydGljZXMgbGVmdD8gd2UncmUgZG9uZSEKKyAgICAgICAgICAgICAgICBpdmwgPSBvdmw7CisgICAgICAgICAgICAgICAgaWMgPSBvYzsKKyAgICAgICAgICAgICAgICBvdXRpID0gMS1vdXRpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2MgPj49IDE7CisgICAgICAgICAgICBwbGFuZSsrOworICAgICAgICB9IHdoaWxlIChjYyk7CisgICAgfQorCisgICAgLy8gZnJ1c3R1bSBjbGlwLXBsYW5lcworICAgIGlmIChhbGxfY2MgJiB2ZXJ0ZXhfdDo6RlJVU1RVTV9DTElQX0FMTCkKKyAgICB7CisgICAgICAgIHVuc2lnbmVkIGludCBwbGFuZSA9IDA7CisgICAgICAgIHVpbnQzMl90IGNjID0gYWxsX2NjICYgdmVydGV4X3Q6OkZSVVNUVU1fQ0xJUF9BTEw7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGlmIChjYyAmIDEpIHsgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIHBvaW50ZXJzIHRvIG91ciBvdXRwdXQgbGlzdCAoaGVhZCBhbmQgY3VycmVudCkKKyAgICAgICAgICAgICAgICB2ZXJ0ZXhfdCoqIGNvbnN0IG92bCA9ICZvdXRbb3V0aV1bMF07CisgICAgICAgICAgICAgICAgdmVydGV4X3QqKiBvdXRwdXQgPSBvdmw7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG9jID0gMDsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2VudGluZWwgPSAwOworICAgICAgICAgICAgICAgIC8vIHByZXZpb3VzIHZlcnRleCwgY29tcHV0ZSBkaXN0YW5jZSB0byB0aGUgcGxhbmUKKyAgICAgICAgICAgICAgICB2ZXJ0ZXhfdCogcyA9IGl2bFtpYy0xXTsKKyAgICAgICAgICAgICAgICBHTGZpeGVkIHNkID0gZnJ1c3R1bVBsYW5lRGlzdChwbGFuZSwgcy0+Y2xpcCk7CisgICAgICAgICAgICAgICAgLy8gY2xpcCBlYWNoIHZlcnRleCBhZ2FpbnN0IHRoaXMgcGxhbmUuLi4KKyAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpPTAgOyBpPGljIDsgaSsrKSB7ICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHZlcnRleF90KiBwID0gaXZsW2ldOworICAgICAgICAgICAgICAgICAgICBjb25zdCBHTGZpeGVkIHBkID0gZnJ1c3R1bVBsYW5lRGlzdChwbGFuZSwgcC0+Y2xpcCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzZCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGQgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvdGggaW5zaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm91dHB1dCsrID0gcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYysrOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzIGluc2lkZSwgcCBvdXRzaWRlIChleGl0aW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMZml4ZWQgdCA9IGNsaXBEaXZpZGUoc2QsIHNkLXBkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5hcnJheXMuY2xpcFZlcnRleChjLCBidWYsIHQsIHAsIHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvdXRwdXQrKyA9IGJ1ZisrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9jKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCsrc2VudGluZWwgPj0gMykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBub24tY29udmV4IHBvbHlnb24hCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGQgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHMgb3V0c2lkZSAoZW50ZXJpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMZml4ZWQgdCA9IGNsaXBEaXZpZGUocGQsIHBkLXNkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+YXJyYXlzLmNsaXBWZXJ0ZXgoYywgYnVmLCB0LCBzLCBwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm91dHB1dCsrID0gYnVmKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9jKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgrK3NlbnRpbmVsID49IDMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vIG5vbi1jb252ZXggcG9seWdvbiEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm91dHB1dCsrID0gcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYysrOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvdGggb3V0c2lkZQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHMgPSBwOworICAgICAgICAgICAgICAgICAgICBzZCA9IHBkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBvdXRwdXQgbGlzdCBiZWNvbWUgdGhlIG5ldyBpbnB1dCBsaXN0CisgICAgICAgICAgICAgICAgaWYgKG9jPDMpCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gbGVzcyB0aGFuIDMgdmVydGljZXMgbGVmdD8gd2UncmUgZG9uZSEKKyAgICAgICAgICAgICAgICBpdmwgPSBvdmw7CisgICAgICAgICAgICAgICAgaWMgPSBvYzsKKyAgICAgICAgICAgICAgICBvdXRpID0gMS1vdXRpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2MgPj49IDE7CisgICAgICAgICAgICBwbGFuZSsrOworICAgICAgICB9IHdoaWxlIChjYyk7CisgICAgfQorICAgIAorICAgIC8vIGZpbmFsbHkgd2UgY2FuIHJlbmRlciBvdXIgdHJpYW5nbGVzLi4uCisgICAgcDAgPSBpdmxbMF07CisgICAgcDEgPSBpdmxbMV07CisgICAgZm9yICh1bnNpZ25lZCBpbnQgaT0yIDsgaTxpYyA7IGkrKykgeworICAgICAgICBwMiA9IGl2bFtpXTsKKyAgICAgICAgYy0+bGVycC5pbml0VHJpYW5nbGUocDAsIHAxLCBwMik7CisgICAgICAgIGlmIChjdWxsX3RyaWFuZ2xlKGMsIHAwLCBwMSwgcDIpKSB7CisgICAgICAgICAgICBwMSA9IHAyOworICAgICAgICAgICAgY29udGludWU7IC8vIGN1bGxlZCEKKyAgICAgICAgfQorICAgICAgICB0cmlhbmdsZShjLCBwMCwgcDEsIHAyKTsKKyAgICAgICAgcDEgPSBwMjsKKyAgICB9Cit9CisKK3Vuc2lnbmVkIGludCBjbGlwX2xpbmUob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogcywgdmVydGV4X3QqIHApCit7CisgICAgY29uc3QgdWludDMyX3QgYWxsX2NjID0gKHMtPmZsYWdzIHwgcC0+ZmxhZ3MpICYgdmVydGV4X3Q6OkNMSVBfQUxMOworCisgICAgaWYgKGdnbF91bmxpa2VseShhbGxfY2MgJiB2ZXJ0ZXhfdDo6VVNFUl9DTElQX0FMTCkpCisgICAgeworICAgICAgICB1bnNpZ25lZCBpbnQgcGxhbmUgPSAwOworICAgICAgICB1aW50MzJfdCBjYyA9IChhbGxfY2MgJiB2ZXJ0ZXhfdDo6VVNFUl9DTElQX0FMTCkgPj4gODsKKyAgICAgICAgZG8geworICAgICAgICAgICAgaWYgKGNjICYgMSkgeworICAgICAgICAgICAgICAgIGNvbnN0IHZlYzRfdCYgZXF1YXRpb24gPSBjLT5jbGlwUGxhbmVzLnBsYW5lW3BsYW5lXS5lcXVhdGlvbjsKKyAgICAgICAgICAgICAgICBjb25zdCBHTGZpeGVkIHNkID0gZG90NChlcXVhdGlvbi52LCBzLT5leWUudik7CisgICAgICAgICAgICAgICAgY29uc3QgR0xmaXhlZCBwZCA9IGRvdDQoZXF1YXRpb24udiwgcC0+ZXllLnYpOworICAgICAgICAgICAgICAgIGlmIChzZCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwZCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBib3RoIGluc2lkZQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcyBpbnNpZGUsIHAgb3V0c2lkZSAoZXhpdGluZykKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMZml4ZWQgdCA9IGNsaXBEaXZpZGUoc2QsIHNkLXBkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMtPmFycmF5cy5jbGlwRXllKGMsIHAsIHQsIHAsIHMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBkID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHMgb3V0c2lkZSAoZW50ZXJpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTGZpeGVkIHQgPSBjbGlwRGl2aWRlKHBkLCBwZC1zZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+YXJyYXlzLmNsaXBFeWUoYywgcywgdCwgcywgcCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvdGggb3V0c2lkZQorICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNjID4+PSAxOworICAgICAgICAgICAgcGxhbmUrKzsKKyAgICAgICAgfSB3aGlsZSAoY2MpOworICAgIH0KKworICAgIC8vIGZydXN0dW0gY2xpcC1wbGFuZXMKKyAgICBpZiAoYWxsX2NjICYgdmVydGV4X3Q6OkZSVVNUVU1fQ0xJUF9BTEwpCisgICAgeworICAgICAgICB1bnNpZ25lZCBpbnQgcGxhbmUgPSAwOworICAgICAgICB1aW50MzJfdCBjYyA9IGFsbF9jYyAmIHZlcnRleF90OjpGUlVTVFVNX0NMSVBfQUxMOworICAgICAgICBkbyB7CisgICAgICAgICAgICBpZiAoY2MgJiAxKSB7CisgICAgICAgICAgICAgICAgY29uc3QgR0xmaXhlZCBzZCA9IGZydXN0dW1QbGFuZURpc3QocGxhbmUsIHMtPmNsaXApOworICAgICAgICAgICAgICAgIGNvbnN0IEdMZml4ZWQgcGQgPSBmcnVzdHVtUGxhbmVEaXN0KHBsYW5lLCBwLT5jbGlwKTsKKyAgICAgICAgICAgICAgICBpZiAoc2QgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAocGQgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm90aCBpbnNpZGUKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHMgaW5zaWRlLCBwIG91dHNpZGUgKGV4aXRpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTGZpeGVkIHQgPSBjbGlwRGl2aWRlKHNkLCBzZC1wZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjLT5hcnJheXMuY2xpcFZlcnRleChjLCBwLCB0LCBwLCBzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwZCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzIG91dHNpZGUgKGVudGVyaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0xmaXhlZCB0ID0gY2xpcERpdmlkZShwZCwgcGQtc2QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmFycmF5cy5jbGlwVmVydGV4KGMsIHMsIHQsIHMsIHApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAvLyBib3RoIG91dHNpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYyA+Pj0gMTsKKyAgICAgICAgICAgIHBsYW5lKys7CisgICAgICAgIH0gd2hpbGUgKGNjKTsKKyAgICB9CisKKyAgICByZXR1cm4gMjsKK30KKworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYmFnbC9wcmltaXRpdmVzLmggYi9vcGVuZ2wvbGliYWdsL3ByaW1pdGl2ZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmVmNjA0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2xpYmFnbC9wcmltaXRpdmVzLmgKQEAgLTAsMCArMSwzNyBAQAorLyogbGlicy9vcGVuZ2xlcy9wcmltaXRpdmVzLmgKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaWZuZGVmIEFORFJPSURfT1BFTkdMRVNfUFJJTUlUSVZFU19ICisjZGVmaW5lIEFORFJPSURfT1BFTkdMRVNfUFJJTUlUSVZFU19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSBnbCB7CitzdHJ1Y3Qgb2dsZXNfY29udGV4dF90OworfTsKKwordm9pZCBvZ2xlc192YWxpZGF0ZV9wcmltaXRpdmVzKG9nbGVzX2NvbnRleHRfdCogYyk7CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX09QRU5HTEVTX1BSSU1JVElWRVNfSAorCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL3N0YXRlLmNwcCBiL29wZW5nbC9saWJhZ2wvc3RhdGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYmFiZWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvbGliYWdsL3N0YXRlLmNwcApAQCAtMCwwICsxLDU4NiBAQAorLyogbGlicy9vcGVuZ2xlcy9zdGF0ZS5jcHAKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJjb250ZXh0LmgiCisjaW5jbHVkZSAiZnAuaCIKKyNpbmNsdWRlICJzdGF0ZS5oIgorI2luY2x1ZGUgImFycmF5LmgiCisjaW5jbHVkZSAibWF0cml4LmgiCisjaW5jbHVkZSAidmVydGV4LmgiCisjaW5jbHVkZSAibGlnaHQuaCIKKyNpbmNsdWRlICJ0ZXh0dXJlLmgiCisjaW5jbHVkZSAiQnVmZmVyT2JqZWN0TWFuYWdlci5oIgorI2luY2x1ZGUgIlRleHR1cmVPYmplY3RNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgY2hhciBjb25zdCAqIGNvbnN0IGdWZW5kb3JTdHJpbmcgICAgID0gIkFuZHJvaWQiOworc3RhdGljIGNoYXIgY29uc3QgKiBjb25zdCBnUmVuZGVyZXJTdHJpbmcgICA9ICJBbmRyb2lkIFBpeGVsRmxpbmdlciAxLjAiOworc3RhdGljIGNoYXIgY29uc3QgKiBjb25zdCBnVmVyc2lvblN0cmluZyAgICA9ICJPcGVuR0wgRVMtQ00gMS4wIjsKK3N0YXRpYyBjaGFyIGNvbnN0ICogY29uc3QgZ0V4dGVuc2lvbnNTdHJpbmcgPQorICAgICJHTF9PRVNfYnl0ZV9jb29yZGluYXRlcyAiICAgICAgICAgICAgICAvLyBPSworICAgICJHTF9PRVNfZml4ZWRfcG9pbnQgIiAgICAgICAgICAgICAgICAgICAvLyBPSworICAgICJHTF9PRVNfc2luZ2xlX3ByZWNpc2lvbiAiICAgICAgICAgICAgICAvLyBPSworICAgICJHTF9PRVNfcmVhZF9mb3JtYXQgIiAgICAgICAgICAgICAgICAgICAvLyBPSworICAgICJHTF9PRVNfY29tcHJlc3NlZF9wYWxldHRlZF90ZXh0dXJlICIgICAvLyBPSworICAgICJHTF9PRVNfZHJhd190ZXh0dXJlICIgICAgICAgICAgICAgICAgICAvLyBPSworICAgICJHTF9PRVNfbWF0cml4X2dldCAiICAgICAgICAgICAgICAgICAgICAvLyBPSworICAgICJHTF9PRVNfcXVlcnlfbWF0cml4ICIgICAgICAgICAgICAgICAgICAvLyBPSworICAgIC8vICAgICAgICAiR0xfT0VTX3BvaW50X3NpemVfYXJyYXkgIiAgICAgICAgICAgICAgLy8gVE9ETworICAgIC8vICAgICAgICAiR0xfT0VTX3BvaW50X3Nwcml0ZSAiICAgICAgICAgICAgICAgICAgLy8gVE9ETworICAgICJHTF9BUkJfdGV4dHVyZV9jb21wcmVzc2lvbiAiICAgICAgICAgICAvLyBPSworICAgICJHTF9BUkJfdGV4dHVyZV9ub25fcG93ZXJfb2ZfdHdvICIgICAgICAvLyBPSworICAgICJHTF9BTkRST0lEX2RpcmVjdF90ZXh0dXJlICIgICAgICAgICAgICAvLyBPSworICAgICJHTF9BTkRST0lEX3VzZXJfY2xpcF9wbGFuZSAiICAgICAgICAgICAvLyBPSworICAgICJHTF9BTkRST0lEX3ZlcnRleF9idWZmZXJfb2JqZWN0ICIgICAgICAvLyBPSworICAgICJHTF9BTkRST0lEX2dlbmVyYXRlX21pcG1hcCAiICAgICAgICAgICAvLyBPSworICAgIDsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIDAKKyNwcmFnbWEgbWFyayAtCisjZW5kaWYKKworb2dsZXNfY29udGV4dF90ICpvZ2xlc19pbml0KHNpemVfdCBleHRyYSkKK3sKKyAgICB2b2lkKiBjb25zdCBiYXNlID0gbWFsbG9jKGV4dHJhICsgc2l6ZW9mKG9nbGVzX2NvbnRleHRfdCkgKyAzMik7CisJaWYgKCFiYXNlKSByZXR1cm4gMDsKKworICAgIG9nbGVzX2NvbnRleHRfdCAqYyA9CisgICAgICAgICAgICAob2dsZXNfY29udGV4dF90ICopKChwdHJkaWZmX3QoYmFzZSkgKyBleHRyYSArIDMxKSAmIH4weDFGTCk7CisgICAgbWVtc2V0KGMsIDAsIHNpemVvZihvZ2xlc19jb250ZXh0X3QpKTsKKyAgICBnZ2xfaW5pdF9jb250ZXh0KCYoYy0+cmFzdGVyaXplcikpOworICAgIAorICAgIC8vIFhYWDogdGhpcyBzaG91bGQgYmUgcGFzc2VkIGFzIGFuIGFyZ3VtZW50CisgICAgc3A8RUdMU3VyZmFjZU1hbmFnZXI+IHNtZ3IobmV3IEVHTFN1cmZhY2VNYW5hZ2VyKCkpOworICAgIGMtPnN1cmZhY2VNYW5hZ2VyID0gc21nci5nZXQoKTsKKyAgICBjLT5zdXJmYWNlTWFuYWdlci0+aW5jU3Ryb25nKGMpOworCisgICAgc3A8RUdMQnVmZmVyT2JqZWN0TWFuYWdlcj4gYm9tZ3IobmV3IEVHTEJ1ZmZlck9iamVjdE1hbmFnZXIoKSk7CisgICAgYy0+YnVmZmVyT2JqZWN0TWFuYWdlciA9IGJvbWdyLmdldCgpOworICAgIGMtPmJ1ZmZlck9iamVjdE1hbmFnZXItPmluY1N0cm9uZyhjKTsKKworICAgIG9nbGVzX2luaXRfYXJyYXkoYyk7CisgICAgb2dsZXNfaW5pdF9tYXRyaXgoYyk7CisgICAgb2dsZXNfaW5pdF92ZXJ0ZXgoYyk7CisgICAgb2dsZXNfaW5pdF9saWdodChjKTsKKyAgICBvZ2xlc19pbml0X3RleHR1cmUoYyk7CisKKyAgICBjLT5yYXN0ZXJpemVyLmJhc2UgPSBiYXNlOworICAgIGMtPnBvaW50LnNpemUgPSBUUklfT05FOworICAgIGMtPmxpbmUud2lkdGggPSBUUklfT05FOworICAgICAgICAgICAgCisgICAgLy8gaW4gT3BlbkdMLCB3cml0aW5nIHRvIHRoZSBkZXB0aCBidWZmZXIgaXMgZW5hYmxlZCBieSBkZWZhdWx0LgorICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuZGVwdGhNYXNrKGMsIDEpOworICAgIAorICAgIC8vIE9wZW5HTCBlbmFibGVzIGRpdGhlcmluZyBieSBkZWZhdWx0CisgICAgYy0+cmFzdGVyaXplci5wcm9jcy5lbmFibGUoYywgR0xfRElUSEVSKTsKKworICAgIHJldHVybiBjOworfQorCit2b2lkIG9nbGVzX3VuaW5pdChvZ2xlc19jb250ZXh0X3QqIGMpCit7CisgICAgb2dsZXNfdW5pbml0X2FycmF5KGMpOworICAgIG9nbGVzX3VuaW5pdF9tYXRyaXgoYyk7CisgICAgb2dsZXNfdW5pbml0X3ZlcnRleChjKTsKKyAgICBvZ2xlc191bmluaXRfbGlnaHQoYyk7CisgICAgb2dsZXNfdW5pbml0X3RleHR1cmUoYyk7CisgICAgYy0+c3VyZmFjZU1hbmFnZXItPmRlY1N0cm9uZyhjKTsKKyAgICBjLT5idWZmZXJPYmplY3RNYW5hZ2VyLT5kZWNTdHJvbmcoYyk7CisgICAgZ2dsX3VuaW5pdF9jb250ZXh0KCYoYy0+cmFzdGVyaXplcikpOworCWZyZWUoYy0+cmFzdGVyaXplci5iYXNlKTsKK30KKwordm9pZCBfb2dsZXNfZXJyb3Iob2dsZXNfY29udGV4dF90KiBjLCBHTGVudW0gZXJyb3IpCit7CisgICAgaWYgKGMtPmVycm9yID09IEdMX05PX0VSUk9SKQorICAgICAgICBjLT5lcnJvciA9IGVycm9yOworfQorCitzdGF0aWMgYm9vbCBzdGVuY2lsb3BfdmFsaWQoR0xlbnVtIG9wKSB7CisgICAgc3dpdGNoIChvcCkgeworICAgIGNhc2UgR0xfS0VFUDoKKyAgICBjYXNlIEdMX1pFUk86CisgICAgY2FzZSBHTF9SRVBMQUNFOgorICAgIGNhc2UgR0xfSU5DUjoKKyAgICBjYXNlIEdMX0RFQ1I6CisgICAgY2FzZSBHTF9JTlZFUlQ6CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIGVuYWJsZV9kaXNhYmxlKG9nbGVzX2NvbnRleHRfdCogYywgR0xlbnVtIGNhcCwgaW50IGVuYWJsZWQpCit7CisgICAgaWYgKChjYXAgPj0gR0xfTElHSFQwKSAmJiAoY2FwPEdMX0xJR0hUMCtPR0xFU19NQVhfTElHSFRTKSkgeworICAgICAgICBjLT5saWdodGluZy5saWdodHNbY2FwLUdMX0xJR0hUMF0uZW5hYmxlID0gZW5hYmxlZDsKKyAgICAgICAgYy0+bGlnaHRpbmcuZW5hYmxlZExpZ2h0cyAmPSB+KDE8PChjYXAtR0xfTElHSFQwKSk7CisgICAgICAgIGMtPmxpZ2h0aW5nLmVuYWJsZWRMaWdodHMgfD0gKGVuYWJsZWQ8PChjYXAtR0xfTElHSFQwKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGNhcCkgeworICAgIGNhc2UgR0xfUE9JTlRfU01PT1RIOgorICAgICAgICBjLT5wb2ludC5zbW9vdGggPSBlbmFibGVkOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX0xJTkVfU01PT1RIOgorICAgICAgICBjLT5saW5lLnNtb290aCA9IGVuYWJsZWQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfUE9MWUdPTl9PRkZTRVRfRklMTDoKKyAgICAgICAgYy0+cG9seWdvbk9mZnNldC5lbmFibGUgPSBlbmFibGVkOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX0NVTExfRkFDRToKKyAgICAgICAgYy0+Y3VsbC5lbmFibGUgPSBlbmFibGVkOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX0xJR0hUSU5HOgorICAgICAgICBjLT5saWdodGluZy5lbmFibGUgPSBlbmFibGVkOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX0NPTE9SX01BVEVSSUFMOgorICAgICAgICBjLT5saWdodGluZy5jb2xvck1hdGVyaWFsLmVuYWJsZSA9IGVuYWJsZWQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfTk9STUFMSVpFOgorICAgIGNhc2UgR0xfUkVTQ0FMRV9OT1JNQUw6CisgICAgICAgIGMtPnRyYW5zZm9ybXMucmVzY2FsZU5vcm1hbHMgPSBlbmFibGVkID8gY2FwIDogMDsKKyAgICAgICAgLy8gWFhYOiBpbnZhbGlkYXRlIG12aXQKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEdMX0NMSVBfUExBTkUwOgorICAgIGNhc2UgR0xfQ0xJUF9QTEFORTE6CisgICAgY2FzZSBHTF9DTElQX1BMQU5FMjoKKyAgICBjYXNlIEdMX0NMSVBfUExBTkUzOgorICAgIGNhc2UgR0xfQ0xJUF9QTEFORTQ6CisgICAgY2FzZSBHTF9DTElQX1BMQU5FNToKKyAgICAgICAgYy0+Y2xpcFBsYW5lcy5lbmFibGUgJj0gfigxPDwoY2FwLUdMX0NMSVBfUExBTkUwKSk7CisgICAgICAgIGMtPmNsaXBQbGFuZXMuZW5hYmxlIHw9IChlbmFibGVkPDwoY2FwLUdMX0NMSVBfUExBTkUwKSk7CisgICAgICAgIG9nbGVzX2ludmFsaWRhdGVfcGVyc3BlY3RpdmUoYyk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBHTF9GT0c6CisgICAgY2FzZSBHTF9ERVBUSF9URVNUOgorICAgICAgICBvZ2xlc19pbnZhbGlkYXRlX3BlcnNwZWN0aXZlKGMpOworICAgICAgICAvLyBmYWxsLXRocm91Z2guLi4KKyAgICBjYXNlIEdMX0JMRU5EOgorICAgIGNhc2UgR0xfU0NJU1NPUl9URVNUOgorICAgIGNhc2UgR0xfQUxQSEFfVEVTVDoKKyAgICBjYXNlIEdMX0NPTE9SX0xPR0lDX09QOgorICAgIGNhc2UgR0xfRElUSEVSOgorICAgIGNhc2UgR0xfU1RFTkNJTF9URVNUOgorICAgIGNhc2UgR0xfVEVYVFVSRV8yRDoKKyAgICAgICAgLy8gdGhlc2UgbmVlZCB0byBmYWxsIHRocm91Z2ggaW50byB0aGUgcmFzdGVyaXplcgorICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmVuYWJsZURpc2FibGUoYywgY2FwLCBlbmFibGVkKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIAorICAgIGNhc2UgR0xfTVVMVElTQU1QTEU6CisgICAgY2FzZSBHTF9TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0U6CisgICAgY2FzZSBHTF9TQU1QTEVfQUxQSEFfVE9fT05FOgorICAgIGNhc2UgR0xfU0FNUExFX0NPVkVSQUdFOgorICAgICAgICAvLyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgaW1wbGVtZW50YXRpb24KKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOworICAgICAgICByZXR1cm47CisgICAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKKyNpZiAwCisjcHJhZ21hIG1hcmsgLQorI2VuZGlmCisKKy8vIFRoZXNlIG9uZXMgYXJlIHN1cGVyLWVhc3ksIHdlJ3JlIG5vdCBzdXBwb3J0aW5nIHRob3NlIGZlYXR1cmVzIQordm9pZCBnbFNhbXBsZUNvdmVyYWdlKEdMY2xhbXBmIHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KSB7Cit9Cit2b2lkIGdsU2FtcGxlQ292ZXJhZ2V4KEdMY2xhbXB4IHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KSB7Cit9Cit2b2lkIGdsU3RlbmNpbEZ1bmMoR0xlbnVtIGZ1bmMsIEdMaW50IHJlZiwgR0x1aW50IG1hc2spIHsKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGlmIChmdW5jIDwgR0xfTkVWRVIgfHwgZnVuYyA+IEdMX0FMV0FZUykgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIGZyb20gT3BlbkdMfEVTIDEuMCBzZXBjaWZpY2F0aW9uOgorICAgIC8vIElmIHRoZXJlIGlzIG5vIHN0ZW5jaWwgYnVmZmVyLCBubyBzdGVuY2lsIG1vZGlmaWNhdGlvbiBjYW4gb2NjdXIKKyAgICAvLyBhbmQgaXQgaXMgYXMgaWYgdGhlIHN0ZW5jaWwgdGVzdCBhbHdheXMgcGFzc2VzLgorfQorCit2b2lkIGdsU3RlbmNpbE9wKEdMZW51bSBmYWlsLCBHTGVudW0gemZhaWwsIEdMZW51bSB6cGFzcykgeworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgaWYgKChzdGVuY2lsb3BfdmFsaWQoZmFpbCkgJgorICAgICAgICAgc3RlbmNpbG9wX3ZhbGlkKHpmYWlsKSAmCisgICAgICAgICBzdGVuY2lsb3BfdmFsaWQoenBhc3MpKSA9PSAwKSB7CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgIHJldHVybjsKKyAgICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBnbEFscGhhRnVuYyhHTGVudW0gZnVuYywgR0xjbGFtcGYgcmVmKQoreworICAgIGdsQWxwaGFGdW5jeChmdW5jLCBnZ2xGbG9hdFRvRml4ZWQocmVmKSk7Cit9CisKK3ZvaWQgZ2xDdWxsRmFjZShHTGVudW0gbW9kZSkKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIHN3aXRjaCAobW9kZSkgeworICAgIGNhc2UgR0xfRlJPTlQ6CisgICAgY2FzZSBHTF9CQUNLOgorICAgIGNhc2UgR0xfRlJPTlRfQU5EX0JBQ0s6CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7CisgICAgfQorICAgIGMtPmN1bGwuY3VsbEZhY2UgPSBtb2RlOworfQorCit2b2lkIGdsRnJvbnRGYWNlKEdMZW51bSBtb2RlKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgc3dpdGNoIChtb2RlKSB7CisgICAgY2FzZSBHTF9DVzoKKyAgICBjYXNlIEdMX0NDVzoKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjLT5jdWxsLmZyb250RmFjZSA9IG1vZGU7Cit9CisKK3ZvaWQgZ2xIaW50KEdMZW51bSB0YXJnZXQsIEdMZW51bSBtb2RlKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgc3dpdGNoICh0YXJnZXQpIHsKKyAgICBjYXNlIEdMX0ZPR19ISU5UOgorICAgIGNhc2UgR0xfR0VORVJBVEVfTUlQTUFQX0hJTlQ6CisgICAgY2FzZSBHTF9MSU5FX1NNT09USF9ISU5UOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX1BPSU5UX1NNT09USF9ISU5UOgorICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmVuYWJsZURpc2FibGUoYywgCisgICAgICAgICAgICAgICAgR0dMX1BPSU5UX1NNT09USF9OSUNFLCBtb2RlPT1HTF9OSUNFU1QpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX1BFUlNQRUNUSVZFX0NPUlJFQ1RJT05fSElOVDoKKyAgICAgICAgYy0+cGVyc3BlY3RpdmUgPSAobW9kZSA9PSBHTF9OSUNFU1QpID8gMSA6IDA7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7CisgICAgfQorfQorCit2b2lkIGdsRW5hYmxlKEdMZW51bSBjYXApIHsKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGVuYWJsZV9kaXNhYmxlKGMsIGNhcCwgMSk7Cit9Cit2b2lkIGdsRGlzYWJsZShHTGVudW0gY2FwKSB7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBlbmFibGVfZGlzYWJsZShjLCBjYXAsIDApOworfQorCit2b2lkIGdsRmluaXNoKCkKK3sgLy8gbm90aGluZyB0byBkbyBmb3Igb3VyIHNvZnR3YXJlIGltcGxlbWVudGF0aW9uCit9CisKK3ZvaWQgZ2xGbHVzaCgpCit7IC8vIG5vdGhpbmcgdG8gZG8gZm9yIG91ciBzb2Z0d2FyZSBpbXBsZW1lbnRhdGlvbgorfQorCitHTGVudW0gZ2xHZXRFcnJvcigpCit7CisgICAgLy8gRnJvbSBPcGVuR0x8RVMgMS4wIHNwZWNpZmljYXRpb246CisgICAgLy8gSWYgbW9yZSB0aGFuIG9uZSBmbGFnIGhhcyByZWNvcmRlZCBhbiBlcnJvciwgZ2xHZXRFcnJvciByZXR1cm5zCisgICAgLy8gYW5kIGNsZWFycyBhbiBhcmJpdHJhcnkgZXJyb3IgZmxhZyB2YWx1ZS4gVGh1cywgZ2xHZXRFcnJvciBzaG91bGQKKyAgICAvLyBhbHdheXMgYmUgY2FsbGVkIGluIGEgbG9vcCwgdW50aWwgaXQgcmV0dXJucyBHTF9OT19FUlJPUiwKKyAgICAvLyBpZiBhbGwgZXJyb3IgZmxhZ3MgYXJlIHRvIGJlIHJlc2V0LgorCisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBpZiAoYy0+ZXJyb3IpIHsKKyAgICAgICAgY29uc3QgR0xlbnVtIHJldChjLT5lcnJvcik7CisgICAgICAgIGMtPmVycm9yID0gMDsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgCisgICAgaWYgKGMtPnJhc3Rlcml6ZXIuZXJyb3IpIHsKKyAgICAgICAgY29uc3QgR0xlbnVtIHJldChjLT5yYXN0ZXJpemVyLmVycm9yKTsKKyAgICAgICAgYy0+cmFzdGVyaXplci5lcnJvciA9IDA7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcmV0dXJuIEdMX05PX0VSUk9SOworfQorCitjb25zdCBHTHVieXRlKiBnbEdldFN0cmluZyhHTGVudW0gc3RyaW5nKQoreworICAgIHN3aXRjaCAoc3RyaW5nKSB7CisgICAgY2FzZSBHTF9WRU5ET1I6ICAgICByZXR1cm4gKGNvbnN0IEdMdWJ5dGUqKWdWZW5kb3JTdHJpbmc7CisgICAgY2FzZSBHTF9SRU5ERVJFUjogICByZXR1cm4gKGNvbnN0IEdMdWJ5dGUqKWdSZW5kZXJlclN0cmluZzsKKyAgICBjYXNlIEdMX1ZFUlNJT046ICAgIHJldHVybiAoY29uc3QgR0x1Ynl0ZSopZ1ZlcnNpb25TdHJpbmc7CisgICAgY2FzZSBHTF9FWFRFTlNJT05TOiByZXR1cm4gKGNvbnN0IEdMdWJ5dGUqKWdFeHRlbnNpb25zU3RyaW5nOworICAgIH0KKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgZ2xHZXRJbnRlZ2VydihHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpCit7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBzd2l0Y2ggKHBuYW1lKSB7CisgICAgY2FzZSBHTF9BTElBU0VEX1BPSU5UX1NJWkVfUkFOR0U6CisgICAgICAgIHBhcmFtc1swXSA9IDA7CisgICAgICAgIHBhcmFtc1sxXSA9IEdHTF9NQVhfQUxJQVNFRF9QT0lOVF9TSVpFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX0FMSUFTRURfTElORV9XSURUSF9SQU5HRToKKyAgICAgICAgcGFyYW1zWzBdID0gMDsKKyAgICAgICAgcGFyYW1zWzFdID0gR0dMX01BWF9BTElBU0VEX1BPSU5UX1NJWkU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfQUxQSEFfQklUUzogeworICAgICAgICBpbnQgaW5kZXggPSBjLT5yYXN0ZXJpemVyLnN0YXRlLmJ1ZmZlcnMuY29sb3IuZm9ybWF0OworICAgICAgICBHR0xGb3JtYXQgY29uc3QgKiBmb3JtYXRzID0gZ2dsR2V0UGl4ZWxGb3JtYXRUYWJsZSgpOworICAgICAgICBwYXJhbXNbMF0gPSBmb3JtYXRzW2luZGV4XS5haCAtIGZvcm1hdHNbaW5kZXhdLmFsOworICAgICAgICBicmVhazsgCisgICAgICAgIH0KKyAgICBjYXNlIEdMX1JFRF9CSVRTOiB7CisgICAgICAgIGludCBpbmRleCA9IGMtPnJhc3Rlcml6ZXIuc3RhdGUuYnVmZmVycy5jb2xvci5mb3JtYXQ7CisgICAgICAgIEdHTEZvcm1hdCBjb25zdCAqIGZvcm1hdHMgPSBnZ2xHZXRQaXhlbEZvcm1hdFRhYmxlKCk7CisgICAgICAgIHBhcmFtc1swXSA9IGZvcm1hdHNbaW5kZXhdLnJoIC0gZm9ybWF0c1tpbmRleF0ucmw7CisgICAgICAgIGJyZWFrOyAKKyAgICAgICAgfQorICAgIGNhc2UgR0xfR1JFRU5fQklUUzogeworICAgICAgICBpbnQgaW5kZXggPSBjLT5yYXN0ZXJpemVyLnN0YXRlLmJ1ZmZlcnMuY29sb3IuZm9ybWF0OworICAgICAgICBHR0xGb3JtYXQgY29uc3QgKiBmb3JtYXRzID0gZ2dsR2V0UGl4ZWxGb3JtYXRUYWJsZSgpOworICAgICAgICBwYXJhbXNbMF0gPSBmb3JtYXRzW2luZGV4XS5naCAtIGZvcm1hdHNbaW5kZXhdLmdsOworICAgICAgICBicmVhazsgCisgICAgICAgIH0KKyAgICBjYXNlIEdMX0JMVUVfQklUUzogeworICAgICAgICBpbnQgaW5kZXggPSBjLT5yYXN0ZXJpemVyLnN0YXRlLmJ1ZmZlcnMuY29sb3IuZm9ybWF0OworICAgICAgICBHR0xGb3JtYXQgY29uc3QgKiBmb3JtYXRzID0gZ2dsR2V0UGl4ZWxGb3JtYXRUYWJsZSgpOworICAgICAgICBwYXJhbXNbMF0gPSBmb3JtYXRzW2luZGV4XS5iaCAtIGZvcm1hdHNbaW5kZXhdLmJsOworICAgICAgICBicmVhazsgCisgICAgICAgIH0KKyAgICBjYXNlIEdMX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTOgorICAgICAgICBwYXJhbXNbIDBdID0gR0xfUEFMRVRURTRfUkdCOF9PRVM7CisgICAgICAgIHBhcmFtc1sgMV0gPSBHTF9QQUxFVFRFNF9SR0JBOF9PRVM7CisgICAgICAgIHBhcmFtc1sgMl0gPSBHTF9QQUxFVFRFNF9SNV9HNl9CNV9PRVM7CisgICAgICAgIHBhcmFtc1sgM10gPSBHTF9QQUxFVFRFNF9SR0JBNF9PRVM7CisgICAgICAgIHBhcmFtc1sgNF0gPSBHTF9QQUxFVFRFNF9SR0I1X0ExX09FUzsKKyAgICAgICAgcGFyYW1zWyA1XSA9IEdMX1BBTEVUVEU4X1JHQjhfT0VTOworICAgICAgICBwYXJhbXNbIDZdID0gR0xfUEFMRVRURThfUkdCQThfT0VTOworICAgICAgICBwYXJhbXNbIDddID0gR0xfUEFMRVRURThfUjVfRzZfQjVfT0VTOworICAgICAgICBwYXJhbXNbIDhdID0gR0xfUEFMRVRURThfUkdCQTRfT0VTOworICAgICAgICBwYXJhbXNbIDldID0gR0xfUEFMRVRURThfUkdCNV9BMV9PRVM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfREVQVEhfQklUUzoKKyAgICAgICAgcGFyYW1zWzBdID0gYy0+cmFzdGVyaXplci5zdGF0ZS5idWZmZXJzLmRlcHRoLmZvcm1hdCA/IDAgOiAxNjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX0ZPUk1BVF9PRVM6CisgICAgICAgIHBhcmFtc1swXSA9IEdMX1JHQjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX1RZUEVfT0VTOgorICAgICAgICBwYXJhbXNbMF0gPSBHTF9VTlNJR05FRF9TSE9SVF81XzZfNTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9NQVhfTElHSFRTOgorICAgICAgICBwYXJhbXNbMF0gPSBPR0xFU19NQVhfTElHSFRTOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX01BWF9DTElQX1BMQU5FUzoKKyAgICAgICAgcGFyYW1zWzBdID0gT0dMRVNfTUFYX0NMSVBfUExBTkVTOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX01BWF9NT0RFTFZJRVdfU1RBQ0tfREVQVEg6CisgICAgICAgIHBhcmFtc1swXSA9IE9HTEVTX01PREVMVklFV19TVEFDS19ERVBUSDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9NQVhfUFJPSkVDVElPTl9TVEFDS19ERVBUSDoKKyAgICAgICAgcGFyYW1zWzBdID0gT0dMRVNfUFJPSkVDVElPTl9TVEFDS19ERVBUSDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9NQVhfVEVYVFVSRV9TVEFDS19ERVBUSDoKKyAgICAgICAgcGFyYW1zWzBdID0gT0dMRVNfVEVYVFVSRV9TVEFDS19ERVBUSDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9NQVhfVEVYVFVSRV9TSVpFOgorICAgICAgICBwYXJhbXNbMF0gPSBHR0xfTUFYX1RFWFRVUkVfU0laRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9NQVhfVEVYVFVSRV9VTklUUzoKKyAgICAgICAgcGFyYW1zWzBdID0gR0dMX1RFWFRVUkVfVU5JVF9DT1VOVDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9NQVhfVklFV1BPUlRfRElNUzoKKyAgICAgICAgcGFyYW1zWzBdID0gR0dMX01BWF9WSUVXUE9SVF9ESU1TOworICAgICAgICBwYXJhbXNbMV0gPSBHR0xfTUFYX1ZJRVdQT1JUX0RJTVM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfTlVNX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTOgorICAgICAgICBwYXJhbXNbMF0gPSBPR0xFU19OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfU01PT1RIX0xJTkVfV0lEVEhfUkFOR0U6CisgICAgICAgIHBhcmFtc1swXSA9IDA7CisgICAgICAgIHBhcmFtc1sxXSA9IEdHTF9NQVhfU01PT1RIX0xJTkVfV0lEVEg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfU01PT1RIX1BPSU5UX1NJWkVfUkFOR0U6CisgICAgICAgIHBhcmFtc1swXSA9IDA7CisgICAgICAgIHBhcmFtc1sxXSA9IEdHTF9NQVhfU01PT1RIX1BPSU5UX1NJWkU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfU1RFTkNJTF9CSVRTOgorICAgICAgICBwYXJhbXNbMF0gPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX1NVQlBJWEVMX0JJVFM6CisgICAgICAgIHBhcmFtc1swXSA9IEdHTF9TVUJQSVhFTF9CSVRTOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgR0xfTU9ERUxWSUVXX01BVFJJWF9GTE9BVF9BU19JTlRfQklUU19PRVM6CisgICAgICAgIG1lbWNweSggcGFyYW1zLAorICAgICAgICAgICAgICAgIGMtPnRyYW5zZm9ybXMubW9kZWx2aWV3LnRvcCgpLmVsZW1lbnRzKCksCisgICAgICAgICAgICAgICAgMTYqc2l6ZW9mKEdMaW50KSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfUFJPSkVDVElPTl9NQVRSSVhfRkxPQVRfQVNfSU5UX0JJVFNfT0VTOgorICAgICAgICBtZW1jcHkoIHBhcmFtcywKKyAgICAgICAgICAgICAgICBjLT50cmFuc2Zvcm1zLnByb2plY3Rpb24udG9wKCkuZWxlbWVudHMoKSwKKyAgICAgICAgICAgICAgICAxNipzaXplb2YoR0xpbnQpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9URVhUVVJFX01BVFJJWF9GTE9BVF9BU19JTlRfQklUU19PRVM6CisgICAgICAgIG1lbWNweSggcGFyYW1zLAorICAgICAgICAgICAgICAgIGMtPnRyYW5zZm9ybXMudGV4dHVyZVtjLT50ZXh0dXJlcy5hY3RpdmVdLnRvcCgpLmVsZW1lbnRzKCksCisgICAgICAgICAgICAgICAgMTYqc2l6ZW9mKEdMaW50KSk7CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgZ2xQb2ludFNpemUoR0xmbG9hdCBzaXplKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgaWYgKHNpemUgPD0gMCkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGMtPnBvaW50LnNpemUgPSBUUklfRlJPTV9GSVhFRChnZ2xGbG9hdFRvRml4ZWQoc2l6ZSkpOworfQorCit2b2lkIGdsUG9pbnRTaXpleChHTGZpeGVkIHNpemUpCit7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBpZiAoc2l6ZSA8PSAwKSB7CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYy0+cG9pbnQuc2l6ZSA9IFRSSV9GUk9NX0ZJWEVEKHNpemUpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgZ2xMaW5lV2lkdGgoR0xmbG9hdCB3aWR0aCkKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGlmICh3aWR0aCA8PSAwKSB7CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYy0+bGluZS53aWR0aCA9IFRSSV9GUk9NX0ZJWEVEKGdnbEZsb2F0VG9GaXhlZCh3aWR0aCkpOworfQorCit2b2lkIGdsTGluZVdpZHRoeChHTGZpeGVkIHdpZHRoKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgaWYgKHdpZHRoIDw9IDApIHsKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjLT5saW5lLndpZHRoID0gVFJJX0ZST01fRklYRUQod2lkdGgpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgZ2xDb2xvck1hc2soR0xib29sZWFuIHIsIEdMYm9vbGVhbiBnLCBHTGJvb2xlYW4gYiwgR0xib29sZWFuIGEpIHsKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuY29sb3JNYXNrKGMsIHIsIGcsIGIsIGEpOworfQorCit2b2lkIGdsRGVwdGhNYXNrKEdMYm9vbGVhbiBmbGFnKSB7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmRlcHRoTWFzayhjLCBmbGFnKTsKK30KKwordm9pZCBnbFN0ZW5jaWxNYXNrKEdMdWludCBtYXNrKSB7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBjLT5yYXN0ZXJpemVyLnByb2NzLnN0ZW5jaWxNYXNrKGMsIG1hc2spOworfQorCit2b2lkIGdsRGVwdGhGdW5jKEdMZW51bSBmdW5jKSB7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmRlcHRoRnVuYyhjLCBmdW5jKTsKK30KKwordm9pZCBnbExvZ2ljT3AoR0xlbnVtIG9wY29kZSkgeworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgYy0+cmFzdGVyaXplci5wcm9jcy5sb2dpY09wKGMsIG9wY29kZSk7Cit9CisKK3ZvaWQgZ2xBbHBoYUZ1bmN4KEdMZW51bSBmdW5jLCBHTGNsYW1weCByZWYpIHsKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuYWxwaGFGdW5jeChjLCBmdW5jLCByZWYpOworfQorCit2b2lkIGdsQmxlbmRGdW5jKEdMZW51bSBzZmFjdG9yLCBHTGVudW0gZGZhY3RvcikgeworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgYy0+cmFzdGVyaXplci5wcm9jcy5ibGVuZEZ1bmMoYywgc2ZhY3RvciwgZGZhY3Rvcik7Cit9CisKK3ZvaWQgZ2xDbGVhcihHTGJpdGZpZWxkIG1hc2spIHsKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuY2xlYXIoYywgbWFzayk7Cit9CisKK3ZvaWQgZ2xDbGVhckNvbG9yeChHTGNsYW1weCByZWQsIEdMY2xhbXB4IGdyZWVuLCBHTGNsYW1weCBibHVlLCBHTGNsYW1weCBhbHBoYSkgeworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgYy0+cmFzdGVyaXplci5wcm9jcy5jbGVhckNvbG9yeChjLCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Cit9CisKK3ZvaWQgZ2xDbGVhckNvbG9yKEdMY2xhbXBmIHIsIEdMY2xhbXBmIGcsIEdMY2xhbXBmIGIsIEdMY2xhbXBmIGEpCit7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmNsZWFyQ29sb3J4KGMsCisgICAgICAgICAgICAgICAgICAgIGdnbEZsb2F0VG9GaXhlZChyKSwKKyAgICAgICAgICAgICAgICAgICAgZ2dsRmxvYXRUb0ZpeGVkKGcpLAorICAgICAgICAgICAgICAgICAgICBnZ2xGbG9hdFRvRml4ZWQoYiksCisgICAgICAgICAgICAgICAgICAgIGdnbEZsb2F0VG9GaXhlZChhKSk7Cit9CisKK3ZvaWQgZ2xDbGVhckRlcHRoeChHTGNsYW1weCBkZXB0aCkgeworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgYy0+cmFzdGVyaXplci5wcm9jcy5jbGVhckRlcHRoeChjLCBkZXB0aCk7Cit9CisKK3ZvaWQgZ2xDbGVhckRlcHRoZihHTGNsYW1wZiBkZXB0aCkKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuY2xlYXJEZXB0aHgoYywgZ2dsRmxvYXRUb0ZpeGVkKGRlcHRoKSk7Cit9CisKK3ZvaWQgZ2xDbGVhclN0ZW5jaWwoR0xpbnQgcykgeworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgYy0+cmFzdGVyaXplci5wcm9jcy5jbGVhclN0ZW5jaWwoYywgcyk7Cit9CmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL3N0YXRlLmggYi9vcGVuZ2wvbGliYWdsL3N0YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVhNWNjYgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC9saWJhZ2wvc3RhdGUuaApAQCAtMCwwICsxLDU0IEBACisvKiBsaWJzL29wZW5nbGVzL3N0YXRlLmgKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaWZuZGVmIEFORFJPSURfT1BFTkdMRVNfU1RBVEVfSAorI2RlZmluZSBBTkRST0lEX09QRU5HTEVTX1NUQVRFX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8cHJpdmF0ZS9waXhlbGZsaW5nZXIvZ2dsX2NvbnRleHQuaD4KKworI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworb2dsZXNfY29udGV4dF90ICpvZ2xlc19pbml0KHNpemVfdCBleHRyYSk7Cit2b2lkIG9nbGVzX3VuaW5pdChvZ2xlc19jb250ZXh0X3QqIGMpOwordm9pZCBfb2dsZXNfZXJyb3Iob2dsZXNfY29udGV4dF90KiBjLCBHTGVudW0gZXJyb3IpOworCisjaWZuZGVmIFRSQUNFX0dMX0VSUk9SUworI2RlZmluZSBUUkFDRV9HTF9FUlJPUlMgMAorI2VuZGlmCisKKyNpZiBUUkFDRV9HTF9FUlJPUlMKKyNkZWZpbmUgb2dsZXNfZXJyb3IoYywgZXJyb3IpIFwKK2RvIHsgXAorICBwcmludGYoIm9nbGVzX2Vycm9yIGF0IGZpbGUgJXMgbGluZSAlZFxuIiwgX19GSUxFX18sIF9fTElORV9fKTsgXAorICBfb2dsZXNfZXJyb3IoYywgZXJyb3IpOyBcCit9IHdoaWxlICgwKQorI2Vsc2UgLyogIVRSQUNFX0dMX0VSUk9SUyAqLworI2RlZmluZSBvZ2xlc19lcnJvcihjLCBlcnJvcikgX29nbGVzX2Vycm9yKChjKSwgKGVycm9yKSkKKyNlbmRpZgorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9PUEVOR0xFU19TVEFURV9ICisKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvdGV4dHVyZS5jcHAgYi9vcGVuZ2wvbGliYWdsL3RleHR1cmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZjUzNGIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvbGliYWdsL3RleHR1cmUuY3BwCkBAIC0wLDAgKzEsMTQyMSBAQAorLyogbGlicy9vcGVuZ2xlcy90ZXh0dXJlLmNwcAorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImNvbnRleHQuaCIKKyNpbmNsdWRlICJmcC5oIgorI2luY2x1ZGUgInN0YXRlLmgiCisjaW5jbHVkZSAidGV4dHVyZS5oIgorI2luY2x1ZGUgIlRleHR1cmVPYmplY3RNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBiaW5kVGV4dHVyZVRtdSgKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMsIGludCB0bXUsIEdMdWludCB0ZXh0dXJlLCBjb25zdCBzcDxFR0xUZXh0dXJlT2JqZWN0PiYgdGV4KTsKKworc3RhdGljIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSkKK3ZvaWQgZ2VuZXJhdGVNaXBtYXAob2dsZXNfY29udGV4dF90KiBjLCBHTGludCBsZXZlbCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmIDAKKyNwcmFnbWEgbWFyayAtCisjcHJhZ21hIG1hcmsgSW5pdAorI2VuZGlmCisKK3ZvaWQgb2dsZXNfaW5pdF90ZXh0dXJlKG9nbGVzX2NvbnRleHRfdCogYykKK3sKKyAgICBjLT50ZXh0dXJlcy5wYWNrQWxpZ25tZW50ICAgPSA0OworICAgIGMtPnRleHR1cmVzLnVucGFja0FsaWdubWVudCA9IDQ7CisKKyAgICAvLyBlYWNoIGNvbnRleHQgaGFzIGEgZGVmYXVsdCBuYW1lZCAoMCkgdGV4dHVyZSAobm90IHNoYXJlZCkKKyAgICBjLT50ZXh0dXJlcy5kZWZhdWx0VGV4dHVyZSA9IG5ldyBFR0xUZXh0dXJlT2JqZWN0KCk7CisgICAgYy0+dGV4dHVyZXMuZGVmYXVsdFRleHR1cmUtPmluY1N0cm9uZyhjKTsKKyAgICAKKyAgICAvLyBiaW5kIHRoZSBkZWZhdWx0IHRleHR1cmUgdG8gZWFjaCB0ZXh0dXJlIHVuaXQKKyAgICBmb3IgKGludCBpPTA7IGk8R0dMX1RFWFRVUkVfVU5JVF9DT1VOVCA7IGkrKykgeworICAgICAgICBiaW5kVGV4dHVyZVRtdShjLCBpLCAwLCBjLT50ZXh0dXJlcy5kZWZhdWx0VGV4dHVyZSk7CisgICAgICAgIG1lbXNldChjLT5jdXJyZW50LnRleHR1cmVbaV0udiwgMCwgc2l6ZW9mKHZlYzRfdCkpOworICAgICAgICBjLT5jdXJyZW50LnRleHR1cmVbaV0uUSA9IDB4MTAwMDA7CisgICAgfQorfQorCit2b2lkIG9nbGVzX3VuaW5pdF90ZXh0dXJlKG9nbGVzX2NvbnRleHRfdCogYykKK3sKKyAgICBpZiAoYy0+dGV4dHVyZXMuZ2dsKQorICAgICAgICBnZ2xVbmluaXQoYy0+dGV4dHVyZXMuZ2dsKTsKKyAgICBjLT50ZXh0dXJlcy5kZWZhdWx0VGV4dHVyZS0+ZGVjU3Ryb25nKGMpOworICAgIGZvciAoaW50IGk9MDsgaTxHR0xfVEVYVFVSRV9VTklUX0NPVU5UIDsgaSsrKSB7CisgICAgICAgIGlmIChjLT50ZXh0dXJlcy50bXVbaV0udGV4dHVyZSkKKyAgICAgICAgICAgIGMtPnRleHR1cmVzLnRtdVtpXS50ZXh0dXJlLT5kZWNTdHJvbmcoYyk7CisgICAgfQorfQorCitzdGF0aWMgX19hdHRyaWJ1dGVfXygobm9pbmxpbmUpKQordm9pZCB2YWxpZGF0ZV90bXUob2dsZXNfY29udGV4dF90KiBjLCBpbnQgaSkKK3sKKyAgICB0ZXh0dXJlX3VuaXRfdCYgdShjLT50ZXh0dXJlcy50bXVbaV0pOworICAgIGlmICh1LmRpcnR5KSB7CisgICAgICAgIHUuZGlydHkgPSAwOworICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmFjdGl2ZVRleHR1cmUoYywgaSk7CisgICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuYmluZFRleHR1cmUoYywgJih1LnRleHR1cmUtPnN1cmZhY2UpKTsKKyAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy50ZXhHZW5pKGMsIEdHTF9TLAorICAgICAgICAgICAgICAgIEdHTF9URVhUVVJFX0dFTl9NT0RFLCBHR0xfQVVUT01BVElDKTsKKyAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy50ZXhHZW5pKGMsIEdHTF9ULAorICAgICAgICAgICAgICAgIEdHTF9URVhUVVJFX0dFTl9NT0RFLCBHR0xfQVVUT01BVElDKTsKKyAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy50ZXhQYXJhbWV0ZXJpKGMsIEdHTF9URVhUVVJFXzJELAorICAgICAgICAgICAgICAgIEdHTF9URVhUVVJFX1dSQVBfUywgdS50ZXh0dXJlLT53cmFwcyk7CisgICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MudGV4UGFyYW1ldGVyaShjLCBHR0xfVEVYVFVSRV8yRCwKKyAgICAgICAgICAgICAgICBHR0xfVEVYVFVSRV9XUkFQX1QsIHUudGV4dHVyZS0+d3JhcHQpOworICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLnRleFBhcmFtZXRlcmkoYywgR0dMX1RFWFRVUkVfMkQsCisgICAgICAgICAgICAgICAgR0dMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgdS50ZXh0dXJlLT5taW5fZmlsdGVyKTsKKyAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy50ZXhQYXJhbWV0ZXJpKGMsIEdHTF9URVhUVVJFXzJELAorICAgICAgICAgICAgICAgIEdHTF9URVhUVVJFX01BR19GSUxURVIsIHUudGV4dHVyZS0+bWFnX2ZpbHRlcik7CisKKyAgICAgICAgLy8gZGlzYWJsZSB0aGlzIHRleHR1cmUgdW5pdCBpZiBpdCdzIG5vdCBjb21wbGV0ZQorICAgICAgICBpZiAoIXUudGV4dHVyZS0+aXNDb21wbGV0ZSgpKSB7CisgICAgICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmRpc2FibGUoYywgR0dMX1RFWFRVUkVfMkQpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIG9nbGVzX3ZhbGlkYXRlX3RleHR1cmVfaW1wbChvZ2xlc19jb250ZXh0X3QqIGMpCit7CisgICAgZm9yIChpbnQgaT0wIDsgaTxHR0xfVEVYVFVSRV9VTklUX0NPVU5UIDsgaSsrKSB7CisgICAgICAgIGlmIChjLT5yYXN0ZXJpemVyLnN0YXRlLnRleHR1cmVbaV0uZW5hYmxlKQorICAgICAgICAgICAgdmFsaWRhdGVfdG11KGMsIGkpOworICAgIH0KKyAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmFjdGl2ZVRleHR1cmUoYywgYy0+dGV4dHVyZXMuYWN0aXZlKTsKK30KKworc3RhdGljCit2b2lkIGludmFsaWRhdGVfdGV4dHVyZShvZ2xlc19jb250ZXh0X3QqIGMsIGludCB0bXUsIHVpbnQ4X3QgZmxhZ3MgPSAweEZGKSB7CisgICAgYy0+dGV4dHVyZXMudG11W3RtdV0uZGlydHkgPSBmbGFnczsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIDAKKyNwcmFnbWEgbWFyayAtCisjcHJhZ21hIG1hcmsgRm9ybWF0IGNvbnZlcnNpb24KKyNlbmRpZgorCitzdGF0aWMgdWludDMyX3QgZ2wyZm9ybWF0X3RhYmxlWzZdWzRdID0geworICAgIC8vIEJZVEUsIDU2NSwgNDQ0NCwgNTU1MQorICAgIHsgR0dMX1BJWEVMX0ZPUk1BVF9BXzgsCisgICAgICAwLCAwLCAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgLy8gR0xfQUxQSEEKKyAgICB7IEdHTF9QSVhFTF9GT1JNQVRfUkdCXzg4OCwKKyAgICAgIEdHTF9QSVhFTF9GT1JNQVRfUkdCXzU2NSwKKyAgICAgIDAsIDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHTF9SR0IKKyAgICB7IEdHTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4LAorICAgICAgMCwKKyAgICAgIEdHTF9QSVhFTF9GT1JNQVRfUkdCQV80NDQ0LAorICAgICAgR0dMX1BJWEVMX0ZPUk1BVF9SR0JBXzU1NTEgfSwgICAgIC8vIEdMX1JHQkEKKyAgICB7IEdHTF9QSVhFTF9GT1JNQVRfTF84LAorICAgICAgMCwgMCwgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdMX0xVTUlOQU5DRQorICAgIHsgR0dMX1BJWEVMX0ZPUk1BVF9MQV84OCwKKyAgICAgIDAsIDAsIDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBHTF9MVU1JTkFOQ0VfQUxQSEEKK307CisKK3N0YXRpYyBpbnQzMl90IGNvbnZlcnRHTFBpeGVsRm9ybWF0KEdMaW50IGZvcm1hdCwgR0xlbnVtIHR5cGUpCit7CisgICAgaW50MzJfdCBmaSA9IC0xOworICAgIGludDMyX3QgdGkgPSAtMTsKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgIGNhc2UgR0xfQUxQSEE6ICAgICAgICAgICAgICBmaSA9IDA7ICAgICBicmVhazsKKyAgICBjYXNlIEdMX1JHQjogICAgICAgICAgICAgICAgZmkgPSAxOyAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9SR0JBOiAgICAgICAgICAgICAgIGZpID0gMjsgICAgIGJyZWFrOworICAgIGNhc2UgR0xfTFVNSU5BTkNFOiAgICAgICAgICBmaSA9IDM7ICAgICBicmVhazsKKyAgICBjYXNlIEdMX0xVTUlOQU5DRV9BTFBIQTogICAgZmkgPSA0OyAgICAgYnJlYWs7CisgICAgfQorICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgR0xfVU5TSUdORURfQllURTogICAgICAgICAgdGkgPSAwOyBicmVhazsKKyAgICBjYXNlIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81OiAgIHRpID0gMTsgYnJlYWs7CisgICAgY2FzZSBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80OiB0aSA9IDI7IGJyZWFrOworICAgIGNhc2UgR0xfVU5TSUdORURfU0hPUlRfNV81XzVfMTogdGkgPSAzOyBicmVhazsKKyAgICB9CisgICAgaWYgKGZpPT0tMSB8fCB0aT09LTEpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBnbDJmb3JtYXRfdGFibGVbZmldW3RpXTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgR0xlbnVtIHZhbGlkRm9ybWF0VHlwZShvZ2xlc19jb250ZXh0X3QqIGMsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlKQoreworICAgIEdMZW51bSBlcnJvciA9IDA7CisgICAgaWYgKGZvcm1hdDxHTF9BTFBIQSB8fCBmb3JtYXQ+R0xfTFVNSU5BTkNFX0FMUEhBKSB7CisgICAgICAgIGVycm9yID0gR0xfSU5WQUxJRF9FTlVNOworICAgIH0KKyAgICBpZiAodHlwZSAhPSBHTF9VTlNJR05FRF9CWVRFICYmIHR5cGUgIT0gR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNCAmJgorICAgICAgICB0eXBlICE9IEdMX1VOU0lHTkVEX1NIT1JUXzVfNV81XzEgJiYgdHlwZSAhPSBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSkgeworICAgICAgICBlcnJvciA9IEdMX0lOVkFMSURfRU5VTTsKKyAgICB9CisgICAgaWYgKHR5cGUgPT0gR0xfVU5TSUdORURfU0hPUlRfNV82XzUgJiYgZm9ybWF0ICE9IEdMX1JHQikgeworICAgICAgICBlcnJvciA9IEdMX0lOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBpZiAoKHR5cGUgPT0gR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNCB8fAorICAgICAgICAgdHlwZSA9PSBHTF9VTlNJR05FRF9TSE9SVF81XzVfNV8xKSAgJiYgZm9ybWF0ICE9IEdMX1JHQkEpIHsKKyAgICAgICAgZXJyb3IgPSBHTF9JTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgaWYgKGVycm9yKSB7CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIGVycm9yKTsKKyAgICB9CisgICAgcmV0dXJuIGVycm9yOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0dHTENvbnRleHQqIGdldFJhc3Rlcml6ZXIob2dsZXNfY29udGV4dF90KiBjKQoreworICAgIEdHTENvbnRleHQqIGdnbCA9IGMtPnRleHR1cmVzLmdnbDsKKyAgICBpZiAoZ2dsX3VubGlrZWx5KCFnZ2wpKSB7CisgICAgICAgIC8vIHRoaXMgaXMgcXVpdGUgaGVhdnkgdGhlIGZpcnN0IHRpbWUuLi4KKyAgICAgICAgZ2dsSW5pdCgmZ2dsKTsKKyAgICAgICAgaWYgKCFnZ2wpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIEdHTGZpeGVkIGNvbG9yc1s0XSA9IHsgMCwgMCwgMCwgMHgxMDAwMCB9OworICAgICAgICBjLT50ZXh0dXJlcy5nZ2wgPSBnZ2w7CisgICAgICAgIGdnbC0+YWN0aXZlVGV4dHVyZShnZ2wsIDApOworICAgICAgICBnZ2wtPmVuYWJsZShnZ2wsIEdHTF9URVhUVVJFXzJEKTsKKyAgICAgICAgZ2dsLT50ZXhFbnZpKGdnbCwgR0dMX1RFWFRVUkVfRU5WLCBHR0xfVEVYVFVSRV9FTlZfTU9ERSwgR0dMX1JFUExBQ0UpOworICAgICAgICBnZ2wtPmRpc2FibGUoZ2dsLCBHR0xfRElUSEVSKTsKKyAgICAgICAgZ2dsLT5zaGFkZU1vZGVsKGdnbCwgR0dMX0ZMQVQpOworICAgICAgICBnZ2wtPmNvbG9yNHh2KGdnbCwgY29sb3JzKTsKKyAgICB9CisgICAgcmV0dXJuIGdnbDsKK30KKworc3RhdGljIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSkKK2ludCBjb3B5UGl4ZWxzKAorICAgICAgICBvZ2xlc19jb250ZXh0X3QqIGMsCisgICAgICAgIGNvbnN0IEdHTFN1cmZhY2UmIGRzdCwKKyAgICAgICAgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwKKyAgICAgICAgY29uc3QgR0dMU3VyZmFjZSYgc3JjLAorICAgICAgICBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHcsIEdMc2l6ZWkgaCkKK3sKKyAgICBpZiAoKGRzdC5mb3JtYXQgPT0gc3JjLmZvcm1hdCkgJiYKKyAgICAgICAgKGRzdC5zdHJpZGUgPT0gc3JjLnN0cmlkZSkgJiYKKyAgICAgICAgKGRzdC53aWR0aCA9PSBzcmMud2lkdGgpICYmCisgICAgICAgIChkc3QuaGVpZ2h0ID09IHNyYy5oZWlnaHQpICYmCisgICAgICAgIChkc3Quc3RyaWRlID4gMCkgJiYKKyAgICAgICAgKCh4fHkpID09IDApICYmCisgICAgICAgICgoeG9mZnNldHx5b2Zmc2V0KSA9PSAwKSkKKyAgICB7CisgICAgICAgIC8vIHRoaXMgaXMgYSBjb21tb24gY2FzZS4uLgorICAgICAgICBjb25zdCBHR0xGb3JtYXQmIHBpeGVsRm9ybWF0KGMtPnJhc3Rlcml6ZXIuZm9ybWF0c1tzcmMuZm9ybWF0XSk7CisgICAgICAgIGNvbnN0IHNpemVfdCBzaXplID0gc3JjLmhlaWdodCAqIHNyYy5zdHJpZGUgKiBwaXhlbEZvcm1hdC5zaXplOworICAgICAgICBtZW1jcHkoZHN0LmRhdGEsIHNyYy5kYXRhLCBzaXplKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gdXNlIHBpeGVsLWZsaW5nZXIgdG8gaGFuZGxlIGFsbCB0aGUgY29udmVyc2lvbnMKKyAgICBHR0xDb250ZXh0KiBnZ2wgPSBnZXRSYXN0ZXJpemVyKGMpOworICAgIGlmICghZ2dsKSB7CisgICAgICAgIC8vIHRoZSBvbmx5IHJlYXNvbiB0aGlzIHdvdWxkIGZhaWwgaXMgYmVjYXVzZSB3ZSByYW4gb3V0IG9mIG1lbW9yeQorICAgICAgICByZXR1cm4gR0xfT1VUX09GX01FTU9SWTsKKyAgICB9CisKKyAgICBnZ2wtPmNvbG9yQnVmZmVyKGdnbCwgJmRzdCk7CisgICAgZ2dsLT5iaW5kVGV4dHVyZShnZ2wsICZzcmMpOworICAgIGdnbC0+dGV4Q29vcmQyaShnZ2wsIHgteG9mZnNldCwgeS15b2Zmc2V0KTsKKyAgICBnZ2wtPnJlY3RpKGdnbCwgeG9mZnNldCwgeW9mZnNldCwgeG9mZnNldCt3LCB5b2Zmc2V0K2gpOworICAgIHJldHVybiAwOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpCitzcDxFR0xUZXh0dXJlT2JqZWN0PiBnZXRBbmRCaW5kQWN0aXZlVGV4dHVyZU9iamVjdChvZ2xlc19jb250ZXh0X3QqIGMpCit7CisgICAgc3A8RUdMVGV4dHVyZU9iamVjdD4gdGV4OworICAgIGNvbnN0IGludCBhY3RpdmUgPSBjLT50ZXh0dXJlcy5hY3RpdmU7CisgICAgY29uc3QgR0x1aW50IG5hbWUgPSBjLT50ZXh0dXJlcy50bXVbYWN0aXZlXS5uYW1lOworCisgICAgLy8gZnJlZSB0aGUgcmVmZXJlbmNlIHRvIHRoZSBwcmV2aW91c2x5IGJvdW5kIG9iamVjdAorICAgIHRleHR1cmVfdW5pdF90JiB1KGMtPnRleHR1cmVzLnRtdVthY3RpdmVdKTsKKyAgICBpZiAodS50ZXh0dXJlKQorICAgICAgICB1LnRleHR1cmUtPmRlY1N0cm9uZyhjKTsKKworICAgIGlmIChuYW1lID09IDApIHsKKyAgICAgICAgLy8gMCBpcyBvdXIgbG9jYWwgdGV4dHVyZSBvYmplY3QsIG5vdCBzaGFyZWQgd2l0aCBhbnlvbmUuIAorICAgICAgICAvLyBCdXQgaXQgYWZmZWN0cyBhbGwgYm91bmQgVE1VcyBpbW1lZGlhdGVseS4KKyAgICAgICAgLy8gKHdlIG5lZWQgdG8gaW52YWxpZGF0ZSBhbGwgdW5pdHMgYm91bmQgdG8gdGhpcyB0ZXh0dXJlIG9iamVjdCkKKyAgICAgICAgdGV4ID0gYy0+dGV4dHVyZXMuZGVmYXVsdFRleHR1cmU7CisgICAgICAgIGZvciAoaW50IGk9MCA7IGk8R0dMX1RFWFRVUkVfVU5JVF9DT1VOVCA7IGkrKykgeworICAgICAgICAgICAgaWYgKGMtPnRleHR1cmVzLnRtdVtpXS50ZXh0dXJlID09IHRleC5nZXQoKSkKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlX3RleHR1cmUoYywgaSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBnZXQgYSBuZXcgdGV4dHVyZSBvYmplY3QgZm9yIHRoYXQgbmFtZQorICAgICAgICB0ZXggPSBjLT5zdXJmYWNlTWFuYWdlci0+cmVwbGFjZVRleHR1cmUobmFtZSk7CisgICAgfQorCisgICAgLy8gYmluZCB0aGlzIHRleHR1cmUgdG8gdGhlIGN1cnJlbnQgYWN0aXZlIHRleHR1cmUgdW5pdAorICAgIC8vIGFuZCBhZGQgYSByZWZlcmVuY2UgdG8gdGhpcyB0ZXh0dXJlIG9iamVjdAorICAgIHUudGV4dHVyZSA9IHRleC5nZXQoKTsKKyAgICB1LnRleHR1cmUtPmluY1N0cm9uZyhjKTsKKyAgICB1Lm5hbWUgPSBuYW1lOworICAgIGludmFsaWRhdGVfdGV4dHVyZShjLCBhY3RpdmUpOyAgICAKKyAgICByZXR1cm4gdGV4OworfQorCit2b2lkIGJpbmRUZXh0dXJlVG11KAorICAgIG9nbGVzX2NvbnRleHRfdCogYywgaW50IHRtdSwgR0x1aW50IHRleHR1cmUsIGNvbnN0IHNwPEVHTFRleHR1cmVPYmplY3Q+JiB0ZXgpCit7CisgICAgaWYgKHRleC5nZXQoKSA9PSBjLT50ZXh0dXJlcy50bXVbdG11XS50ZXh0dXJlKQorICAgICAgICByZXR1cm47CisgICAgCisgICAgLy8gZnJlZSB0aGUgcmVmZXJlbmNlIHRvIHRoZSBwcmV2aW91c2x5IGJvdW5kIG9iamVjdAorICAgIHRleHR1cmVfdW5pdF90JiB1KGMtPnRleHR1cmVzLnRtdVt0bXVdKTsKKyAgICBpZiAodS50ZXh0dXJlKQorICAgICAgICB1LnRleHR1cmUtPmRlY1N0cm9uZyhjKTsKKworICAgIC8vIGJpbmQgdGhpcyB0ZXh0dXJlIHRvIHRoZSBjdXJyZW50IGFjdGl2ZSB0ZXh0dXJlIHVuaXQKKyAgICAvLyBhbmQgYWRkIGEgcmVmZXJlbmNlIHRvIHRoaXMgdGV4dHVyZSBvYmplY3QKKyAgICB1LnRleHR1cmUgPSB0ZXguZ2V0KCk7CisgICAgdS50ZXh0dXJlLT5pbmNTdHJvbmcoYyk7CisgICAgdS5uYW1lID0gdGV4dHVyZTsKKyAgICBpbnZhbGlkYXRlX3RleHR1cmUoYywgdG11KTsKK30KKworaW50IGNyZWF0ZVRleHR1cmVTdXJmYWNlKG9nbGVzX2NvbnRleHRfdCogYywKKyAgICAgICAgR0dMU3VyZmFjZSoqIG91dFN1cmZhY2UsIGludDMyX3QqIG91dFNpemUsIEdMaW50IGxldmVsLAorICAgICAgICBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCisgICAgICAgIEdMZW51bSBjb21wcmVzc2VkRm9ybWF0ID0gMCkKK3sKKyAgICAvLyBmaW5kIG91dCB3aGljaCB0ZXh0dXJlIGlzIGJvdW5kIHRvIHRoZSBjdXJyZW50IHVuaXQKKyAgICBjb25zdCBpbnQgYWN0aXZlID0gYy0+dGV4dHVyZXMuYWN0aXZlOworICAgIGNvbnN0IEdMdWludCBuYW1lID0gYy0+dGV4dHVyZXMudG11W2FjdGl2ZV0ubmFtZTsKKworICAgIC8vIGNvbnZlcnQgdGhlIHBpeGVsZm9ybWF0IHRvIG9uZSB3ZSBjYW4gaGFuZGxlCisgICAgY29uc3QgaW50MzJfdCBmb3JtYXRJZHggPSBjb252ZXJ0R0xQaXhlbEZvcm1hdChmb3JtYXQsIHR5cGUpOworICAgIGlmIChmb3JtYXRJZHggPT0gMCkgeyAvLyB3ZSBkb24ndCBrbm93IHdoYXQgdG8gZG8gd2l0aCB0aGlzCisgICAgICAgIHJldHVybiBHTF9JTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgCisgICAgLy8gZmlndXJlIG91dCB0aGUgc2l6ZSB3ZSBuZWVkIGFzIHdlbGwgYXMgdGhlIHN0cmlkZQorICAgIGNvbnN0IEdHTEZvcm1hdCYgcGl4ZWxGb3JtYXQoYy0+cmFzdGVyaXplci5mb3JtYXRzW2Zvcm1hdElkeF0pOworICAgIGNvbnN0IGludDMyX3QgYWxpZ24gPSBjLT50ZXh0dXJlcy51bnBhY2tBbGlnbm1lbnQtMTsKKyAgICBjb25zdCBpbnQzMl90IGJwciA9ICgod2lkdGggKiBwaXhlbEZvcm1hdC5zaXplKSArIGFsaWduKSAmIH5hbGlnbjsKKyAgICBjb25zdCBzaXplX3Qgc2l6ZSA9IGJwciAqIGhlaWdodDsKKyAgICBjb25zdCBpbnQzMl90IHN0cmlkZSA9IGJwciAvIHBpeGVsRm9ybWF0LnNpemU7CisKKyAgICBpZiAobGV2ZWwgPiAwKSB7CisgICAgICAgIGNvbnN0IGludCBhY3RpdmUgPSBjLT50ZXh0dXJlcy5hY3RpdmU7CisgICAgICAgIEVHTFRleHR1cmVPYmplY3QqIHRleCA9IGMtPnRleHR1cmVzLnRtdVthY3RpdmVdLnRleHR1cmU7CisgICAgICAgIHN0YXR1c190IGVyciA9IHRleC0+cmVhbGxvY2F0ZShsZXZlbCwKKyAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIGZvcm1hdElkeCwgY29tcHJlc3NlZEZvcm1hdCwgYnByKTsKKyAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikKKyAgICAgICAgICAgIHJldHVybiBHTF9PVVRfT0ZfTUVNT1JZOworICAgICAgICBHR0xTdXJmYWNlJiBzdXJmYWNlID0gdGV4LT5lZGl0TWlwKGxldmVsKTsKKyAgICAgICAgKm91dFN1cmZhY2UgPSAmc3VyZmFjZTsKKyAgICAgICAgKm91dFNpemUgPSBzaXplOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBzcDxFR0xUZXh0dXJlT2JqZWN0PiB0ZXggPSBnZXRBbmRCaW5kQWN0aXZlVGV4dHVyZU9iamVjdChjKTsKKyAgICBzdGF0dXNfdCBlcnIgPSB0ZXgtPnJlYWxsb2NhdGUobGV2ZWwsCisgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIGZvcm1hdElkeCwgY29tcHJlc3NlZEZvcm1hdCwgYnByKTsKKyAgICBpZiAoZXJyICE9IE5PX0VSUk9SKQorICAgICAgICByZXR1cm4gR0xfT1VUX09GX01FTU9SWTsKKworICAgIHRleC0+aW50ZXJuYWxmb3JtYXQgPSBmb3JtYXQ7CisgICAgKm91dFN1cmZhY2UgPSAmdGV4LT5zdXJmYWNlOworICAgICpvdXRTaXplID0gc2l6ZTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGVjb2RlUGFsZXR0ZTQoY29uc3QgR0x2b2lkICpkYXRhLCBpbnQgbGV2ZWwsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnN1cmZhY2UsIGludCBzdHJpZGUsIGludCBmb3JtYXQpCisKK3sKKyAgICBpbnQgaW5kZXhCaXRzID0gODsKKyAgICBpbnQgZW50cnlTaXplID0gMDsKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgIGNhc2UgR0xfUEFMRVRURTRfUkdCOF9PRVM6CisgICAgICAgIGluZGV4Qml0cyA9IDQ7CisgICAgICAgIC8qIEZBTExUSFJPVUdIICovCisgICAgY2FzZSBHTF9QQUxFVFRFOF9SR0I4X09FUzoKKyAgICAgICAgZW50cnlTaXplID0gMzsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEdMX1BBTEVUVEU0X1JHQkE4X09FUzoKKyAgICAgICAgaW5kZXhCaXRzID0gNDsKKyAgICAgICAgLyogRkFMTFRIUk9VR0ggKi8KKyAgICBjYXNlIEdMX1BBTEVUVEU4X1JHQkE4X09FUzoKKyAgICAgICAgZW50cnlTaXplID0gNDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEdMX1BBTEVUVEU0X1I1X0c2X0I1X09FUzoKKyAgICBjYXNlIEdMX1BBTEVUVEU0X1JHQkE0X09FUzoKKyAgICBjYXNlIEdMX1BBTEVUVEU0X1JHQjVfQTFfT0VTOgorICAgICAgICBpbmRleEJpdHMgPSA0OworICAgICAgICAvKiBGQUxMVEhST1VHSCAqLworICAgIGNhc2UgR0xfUEFMRVRURThfUjVfRzZfQjVfT0VTOgorICAgIGNhc2UgR0xfUEFMRVRURThfUkdCQTRfT0VTOgorICAgIGNhc2UgR0xfUEFMRVRURThfUkdCNV9BMV9PRVM6CisgICAgICAgIGVudHJ5U2l6ZSA9IDI7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNvbnN0IGludCBwYWxldHRlU2l6ZSA9ICgxIDw8IGluZGV4Qml0cykgKiBlbnRyeVNpemU7CisgICAgdWludDhfdCBjb25zdCogcGl4ZWxzID0gKHVpbnQ4X3QgKilkYXRhICsgcGFsZXR0ZVNpemU7CisgICAgZm9yIChpbnQgaT0wIDsgaTxsZXZlbCA7IGkrKykgeworICAgICAgICBpbnQgdyA9ICh3aWR0aCAgPj4gaSkgPyA6IDE7CisgICAgICAgIGludCBoID0gKGhlaWdodCA+PiBpKSA/IDogMTsKKyAgICAgICAgcGl4ZWxzICs9IGggKiAoKHcgKiBpbmRleEJpdHMpIC8gOCk7CisgICAgfQorICAgIHdpZHRoICA9ICh3aWR0aCAgPj4gbGV2ZWwpID8gOiAxOworICAgIGhlaWdodCA9IChoZWlnaHQgPj4gbGV2ZWwpID8gOiAxOworCisgICAgaWYgKGVudHJ5U2l6ZSA9PSAyKSB7CisgICAgICAgIHVpbnQ4X3QgY29uc3QqIGNvbnN0IHBhbGV0dGUgPSAodWludDhfdCopZGF0YTsKKyAgICAgICAgZm9yIChpbnQgeT0wIDsgeTxoZWlnaHQgOyB5KyspIHsKKyAgICAgICAgICAgIHVpbnQ4X3QqIHAgPSAodWludDhfdCopc3VyZmFjZSArIHkqc3RyaWRlKjI7CisgICAgICAgICAgICBpZiAoaW5kZXhCaXRzID09IDgpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCB4PTAgOyB4PHdpZHRoIDsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IDIgKiAoKnBpeGVscysrKTsKKyAgICAgICAgICAgICAgICAgICAgKnArKyA9IHBhbGV0dGVbaW5kZXggKyAwXTsKKyAgICAgICAgICAgICAgICAgICAgKnArKyA9IHBhbGV0dGVbaW5kZXggKyAxXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoaW50IHg9MCA7IHg8d2lkdGggOyB4Kz0yKSB7CisgICAgICAgICAgICAgICAgICAgIGludCB2ID0gKnBpeGVscysrOworICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSAyICogKHYgPj4gNCk7CisgICAgICAgICAgICAgICAgICAgICpwKysgPSBwYWxldHRlW2luZGV4ICsgMF07CisgICAgICAgICAgICAgICAgICAgICpwKysgPSBwYWxldHRlW2luZGV4ICsgMV07CisgICAgICAgICAgICAgICAgICAgIGlmICh4KzEgPCB3aWR0aCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSAyICogKHYgJiAweEYpOworICAgICAgICAgICAgICAgICAgICAgICAgKnArKyA9IHBhbGV0dGVbaW5kZXggKyAwXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwKysgPSBwYWxldHRlW2luZGV4ICsgMV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGVudHJ5U2l6ZSA9PSAzKSB7CisgICAgICAgIHVpbnQ4X3QgY29uc3QqIGNvbnN0IHBhbGV0dGUgPSAodWludDhfdCopZGF0YTsKKyAgICAgICAgZm9yIChpbnQgeT0wIDsgeTxoZWlnaHQgOyB5KyspIHsKKyAgICAgICAgICAgIHVpbnQ4X3QqIHAgPSAodWludDhfdCopc3VyZmFjZSArIHkqc3RyaWRlKjM7CisgICAgICAgICAgICBpZiAoaW5kZXhCaXRzID09IDgpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCB4PTAgOyB4PHdpZHRoIDsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IDMgKiAoKnBpeGVscysrKTsKKyAgICAgICAgICAgICAgICAgICAgKnArKyA9IHBhbGV0dGVbaW5kZXggKyAwXTsKKyAgICAgICAgICAgICAgICAgICAgKnArKyA9IHBhbGV0dGVbaW5kZXggKyAxXTsKKyAgICAgICAgICAgICAgICAgICAgKnArKyA9IHBhbGV0dGVbaW5kZXggKyAyXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoaW50IHg9MCA7IHg8d2lkdGggOyB4Kz0yKSB7CisgICAgICAgICAgICAgICAgICAgIGludCB2ID0gKnBpeGVscysrOworICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSAzICogKHYgPj4gNCk7CisgICAgICAgICAgICAgICAgICAgICpwKysgPSBwYWxldHRlW2luZGV4ICsgMF07CisgICAgICAgICAgICAgICAgICAgICpwKysgPSBwYWxldHRlW2luZGV4ICsgMV07CisgICAgICAgICAgICAgICAgICAgICpwKysgPSBwYWxldHRlW2luZGV4ICsgMl07CisgICAgICAgICAgICAgICAgICAgIGlmICh4KzEgPCB3aWR0aCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSAzICogKHYgJiAweEYpOworICAgICAgICAgICAgICAgICAgICAgICAgKnArKyA9IHBhbGV0dGVbaW5kZXggKyAwXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwKysgPSBwYWxldHRlW2luZGV4ICsgMV07CisgICAgICAgICAgICAgICAgICAgICAgICAqcCsrID0gcGFsZXR0ZVtpbmRleCArIDJdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIGlmIChlbnRyeVNpemUgPT0gNCkgeworICAgICAgICB1aW50OF90IGNvbnN0KiBjb25zdCBwYWxldHRlID0gKHVpbnQ4X3QqKWRhdGE7CisgICAgICAgIGZvciAoaW50IHk9MCA7IHk8aGVpZ2h0IDsgeSsrKSB7CisgICAgICAgICAgICB1aW50OF90KiBwID0gKHVpbnQ4X3QqKXN1cmZhY2UgKyB5KnN0cmlkZSo0OworICAgICAgICAgICAgaWYgKGluZGV4Qml0cyA9PSA4KSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgeD0wIDsgeDx3aWR0aCA7IHgrKykgeworICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSA0ICogKCpwaXhlbHMrKyk7CisgICAgICAgICAgICAgICAgICAgICpwKysgPSBwYWxldHRlW2luZGV4ICsgMF07CisgICAgICAgICAgICAgICAgICAgICpwKysgPSBwYWxldHRlW2luZGV4ICsgMV07CisgICAgICAgICAgICAgICAgICAgICpwKysgPSBwYWxldHRlW2luZGV4ICsgMl07CisgICAgICAgICAgICAgICAgICAgICpwKysgPSBwYWxldHRlW2luZGV4ICsgM107CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCB4PTAgOyB4PHdpZHRoIDsgeCs9MikgeworICAgICAgICAgICAgICAgICAgICBpbnQgdiA9ICpwaXhlbHMrKzsKKyAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gNCAqICh2ID4+IDQpOworICAgICAgICAgICAgICAgICAgICAqcCsrID0gcGFsZXR0ZVtpbmRleCArIDBdOworICAgICAgICAgICAgICAgICAgICAqcCsrID0gcGFsZXR0ZVtpbmRleCArIDFdOworICAgICAgICAgICAgICAgICAgICAqcCsrID0gcGFsZXR0ZVtpbmRleCArIDJdOworICAgICAgICAgICAgICAgICAgICAqcCsrID0gcGFsZXR0ZVtpbmRleCArIDNdOworICAgICAgICAgICAgICAgICAgICBpZiAoeCsxIDwgd2lkdGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gNCAqICh2ICYgMHhGKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwKysgPSBwYWxldHRlW2luZGV4ICsgMF07CisgICAgICAgICAgICAgICAgICAgICAgICAqcCsrID0gcGFsZXR0ZVtpbmRleCArIDFdOworICAgICAgICAgICAgICAgICAgICAgICAgKnArKyA9IHBhbGV0dGVbaW5kZXggKyAyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwKysgPSBwYWxldHRlW2luZGV4ICsgM107CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKworCitzdGF0aWMgX19hdHRyaWJ1dGVfXygobm9pbmxpbmUpKQordm9pZCBzZXRfZGVwdGhfYW5kX2ZvZyhvZ2xlc19jb250ZXh0X3QqIGMsIEdMaW50IHopCit7CisgICAgY29uc3QgdWludDMyX3QgZW5hYmxlcyA9IGMtPnJhc3Rlcml6ZXIuc3RhdGUuZW5hYmxlczsKKyAgICAvLyB3ZSBuZWVkIHRvIGNvbXB1dGUgWncKKyAgICBpbnQzMl90IGl0ZXJhdG9yc1szXTsKKyAgICBpdGVyYXRvcnNbMV0gPSBpdGVyYXRvcnNbMl0gPSAwOworICAgIEdHTGZpeGVkIFp3OworICAgIEdHTGZpeGVkIG4gPSBnZ2xGbG9hdFRvRml4ZWQoYy0+dHJhbnNmb3Jtcy52cHQuek5lYXIpOworICAgIEdHTGZpeGVkIGYgPSBnZ2xGbG9hdFRvRml4ZWQoYy0+dHJhbnNmb3Jtcy52cHQuekZhcik7CisgICAgaWYgKHo8PTApICAgICAgIFp3ID0gbjsKKyAgICBlbHNlIGlmICh6Pj0xKSAgWncgPSBmOworICAgIGVsc2UgICAgICAgICAgICBadyA9IGdnbE11bEFkZHgoeiwgKGYtbiksIG4pOworICAgIGlmIChlbmFibGVzICYgR0dMX0VOQUJMRV9GT0cpIHsKKyAgICAgICAgLy8gc2V0IHVwIGZvZyBpZiBuZWVkZWQuLi4KKyAgICAgICAgaXRlcmF0b3JzWzBdID0gYy0+Zm9nLmZvZyhjLCBadyk7CisgICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuZm9nR3JhZDN4dihjLCBpdGVyYXRvcnMpOworICAgIH0KKyAgICBpZiAoZW5hYmxlcyAmIEdHTF9FTkFCTEVfREVQVEhfVEVTVCkgeworICAgICAgICAvLyBzZXQgdXAgei10ZXN0IGlmIG5lZWRlZC4uLgorICAgICAgICBpbnQzMl90IHogPSAoWncgJiB+KFp3Pj4zMSkpOworICAgICAgICBpZiAoeiA+PSAweDEwMDAwKQorICAgICAgICAgICAgeiA9IDB4RkZGRjsKKyAgICAgICAgaXRlcmF0b3JzWzBdID0gKHogPDwgMTYpIHwgejsKKyAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy56R3JhZDN4dihjLCBpdGVyYXRvcnMpOworICAgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIDAKKyNwcmFnbWEgbWFyayAtCisjcHJhZ21hIG1hcmsgR2VuZXJhdGUgbWltYXBzCisjZW5kaWYKKworZXh0ZXJuIHN0YXR1c190IGJ1aWxkQVB5cmFtaWQob2dsZXNfY29udGV4dF90KiBjLCBFR0xUZXh0dXJlT2JqZWN0KiB0ZXgpOworCit2b2lkIGdlbmVyYXRlTWlwbWFwKG9nbGVzX2NvbnRleHRfdCogYywgR0xpbnQgbGV2ZWwpCit7CisgICAgaWYgKGxldmVsID09IDApIHsKKyAgICAgICAgY29uc3QgaW50IGFjdGl2ZSA9IGMtPnRleHR1cmVzLmFjdGl2ZTsKKyAgICAgICAgRUdMVGV4dHVyZU9iamVjdCogdGV4ID0gYy0+dGV4dHVyZXMudG11W2FjdGl2ZV0udGV4dHVyZTsKKyAgICAgICAgaWYgKHRleC0+Z2VuZXJhdGVfbWlwbWFwKSB7CisgICAgICAgICAgICBpZiAoYnVpbGRBUHlyYW1pZChjLCB0ZXgpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfT1VUX09GX01FTU9SWSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkIHRleFBhcmFtZXRlcngoCisgICAgICAgIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSwgb2dsZXNfY29udGV4dF90KiBjKQoreworICAgIGlmICh0YXJnZXQgIT0gR0xfVEVYVFVSRV8yRCkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIEVHTFRleHR1cmVPYmplY3QqIHRleHR1cmVPYmplY3QgPSBjLT50ZXh0dXJlcy50bXVbYy0+dGV4dHVyZXMuYWN0aXZlXS50ZXh0dXJlOyAgICAKKyAgICBzd2l0Y2ggKHBuYW1lKSB7CisgICAgY2FzZSBHTF9URVhUVVJFX1dSQVBfUzoKKyAgICAgICAgaWYgKChwYXJhbSA9PSBHTF9SRVBFQVQpIHx8CisgICAgICAgICAgICAocGFyYW0gPT0gR0xfQ0xBTVBfVE9fRURHRSkpIHsKKyAgICAgICAgICAgIHRleHR1cmVPYmplY3QtPndyYXBzID0gcGFyYW07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnb3RvIGludmFsaWRfZW51bTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX1RFWFRVUkVfV1JBUF9UOgorICAgICAgICBpZiAoKHBhcmFtID09IEdMX1JFUEVBVCkgfHwKKyAgICAgICAgICAgIChwYXJhbSA9PSBHTF9DTEFNUF9UT19FREdFKSkgeworICAgICAgICAgICAgdGV4dHVyZU9iamVjdC0+d3JhcHQgPSBwYXJhbTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdvdG8gaW52YWxpZF9lbnVtOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfVEVYVFVSRV9NSU5fRklMVEVSOgorICAgICAgICBpZiAoKHBhcmFtID09IEdMX05FQVJFU1QpIHx8CisgICAgICAgICAgICAocGFyYW0gPT0gR0xfTElORUFSKSB8fAorICAgICAgICAgICAgKHBhcmFtID09IEdMX05FQVJFU1RfTUlQTUFQX05FQVJFU1QpIHx8CisgICAgICAgICAgICAocGFyYW0gPT0gR0xfTElORUFSX01JUE1BUF9ORUFSRVNUKSB8fAorICAgICAgICAgICAgKHBhcmFtID09IEdMX05FQVJFU1RfTUlQTUFQX0xJTkVBUikgfHwKKyAgICAgICAgICAgIChwYXJhbSA9PSBHTF9MSU5FQVJfTUlQTUFQX0xJTkVBUikpIHsKKyAgICAgICAgICAgIHRleHR1cmVPYmplY3QtPm1pbl9maWx0ZXIgPSBwYXJhbTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdvdG8gaW52YWxpZF9lbnVtOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfVEVYVFVSRV9NQUdfRklMVEVSOgorICAgICAgICBpZiAoKHBhcmFtID09IEdMX05FQVJFU1QpIHx8CisgICAgICAgICAgICAocGFyYW0gPT0gR0xfTElORUFSKSkgeworICAgICAgICAgICAgdGV4dHVyZU9iamVjdC0+bWFnX2ZpbHRlciA9IHBhcmFtOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ290byBpbnZhbGlkX2VudW07CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9HRU5FUkFURV9NSVBNQVA6CisgICAgICAgIHRleHR1cmVPYmplY3QtPmdlbmVyYXRlX21pcG1hcCA9IHBhcmFtOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgoraW52YWxpZF9lbnVtOgorICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGludmFsaWRhdGVfdGV4dHVyZShjLCBjLT50ZXh0dXJlcy5hY3RpdmUpOworfQorCisKK3N0YXRpYyB2b2lkIGRyYXdUZXh4T0VTKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHosIEdMZml4ZWQgdywgR0xmaXhlZCBoLAorICAgICAgICBvZ2xlc19jb250ZXh0X3QqIGMpCit7CisgICAgLy8gcXVpY2tseSByZWplY3QgZW1wdHkgcmVjdHMKKyAgICBpZiAoKHd8aCkgPD0gMCkKKyAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAKKworICAgIGNvbnN0IEdHTFN1cmZhY2UmIGNiU3VyZmFjZSA9IGMtPnJhc3Rlcml6ZXIuc3RhdGUuYnVmZmVycy5jb2xvci5zOworICAgIHkgPSBnZ2xJbnRUb0ZpeGVkKGNiU3VyZmFjZS5oZWlnaHQpIC0gKHkgKyBoKTsKKyAgICB3ID4+PSBGSVhFRF9CSVRTOworICAgIGggPj49IEZJWEVEX0JJVFM7CisKKyAgICAvLyBzZXQgdXAgYWxsIHRleHR1cmUgdW5pdHMKKyAgICBmb3IgKGludCBpPTAgOyBpPEdHTF9URVhUVVJFX1VOSVRfQ09VTlQgOyBpKyspIHsKKyAgICAgICAgaWYgKCFjLT5yYXN0ZXJpemVyLnN0YXRlLnRleHR1cmVbaV0uZW5hYmxlKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaW50MzJfdCB0ZXhjb29yZHNbOF07CisgICAgICAgIHRleHR1cmVfdW5pdF90JiB1KGMtPnRleHR1cmVzLnRtdVtpXSk7CisKKyAgICAgICAgLy8gdmFsaWRhdGUgdGhpcyB0bXUgKGJpbmQsIHdyYXAsIGZpbHRlcikKKyAgICAgICAgdmFsaWRhdGVfdG11KGMsIGkpOworICAgICAgICAvLyB3ZSBDTEFNUCBoZXJlLCB3aGljaCB3b3JrcyB3aXRoIHByZW11bHRpcGxpZWQgKHMsdCkKKyAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy50ZXhQYXJhbWV0ZXJpKGMsCisgICAgICAgICAgICAgICAgR0dMX1RFWFRVUkVfMkQsIEdHTF9URVhUVVJFX1dSQVBfUywgR0dMX0NMQU1QKTsKKyAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy50ZXhQYXJhbWV0ZXJpKGMsCisgICAgICAgICAgICAgICAgR0dMX1RFWFRVUkVfMkQsIEdHTF9URVhUVVJFX1dSQVBfVCwgR0dMX0NMQU1QKTsKKyAgICAgICAgdS5kaXJ0eSA9IDB4RkY7IC8vIFhYWDogc2hvdWxkIGJlIG1vcmUgc3VidGxlCisKKyAgICAgICAgRUdMVGV4dHVyZU9iamVjdCogdGV4dHVyZU9iamVjdCA9IHUudGV4dHVyZTsgIAorICAgICAgICBjb25zdCBHTGludCBVY3IgPSB0ZXh0dXJlT2JqZWN0LT5jcm9wX3JlY3RbMF0gPDwgMTY7CisgICAgICAgIGNvbnN0IEdMaW50IFZjciA9IHRleHR1cmVPYmplY3QtPmNyb3BfcmVjdFsxXSA8PCAxNjsKKyAgICAgICAgY29uc3QgR0xpbnQgV2NyID0gdGV4dHVyZU9iamVjdC0+Y3JvcF9yZWN0WzJdIDw8IDE2OworICAgICAgICBjb25zdCBHTGludCBIY3IgPSB0ZXh0dXJlT2JqZWN0LT5jcm9wX3JlY3RbM10gPDwgMTY7CisKKyAgICAgICAgLy8gY29tcHV0ZXMgdGV4dHVyZSBjb29yZGluYXRlcyAocHJlLW11bHRpcGxpZWQpCisgICAgICAgIGludDMyX3QgZHNkeCA9IFdjciAvIHc7ICAgLy8gZHNkeCA9ICAoKFdjci93KS9XdCkqV3QKKyAgICAgICAgaW50MzJfdCBkdGR5ID0tSGNyIC8gaDsgICAvLyBkdGR5ID0gLSgoSGNyL2gpL0h0KSpIdAorICAgICAgICBpbnQzMl90IHMwICAgPSBVY3IgICAgICAgLSBnZ2xNdWx4KGRzZHgsIHgpOyAvLyBzMCA9IFVjciAtIHggKiBkc2R4CisgICAgICAgIGludDMyX3QgdDAgICA9IChWY3IrSGNyKSAtIGdnbE11bHgoZHRkeSwgeSk7IC8vIHQwID0gKFZjcitIY3IpIC0geSpkdGR5CisgICAgICAgIHRleGNvb3Jkc1swXSA9IHMwOworICAgICAgICB0ZXhjb29yZHNbMV0gPSBkc2R4OworICAgICAgICB0ZXhjb29yZHNbMl0gPSAwOworICAgICAgICB0ZXhjb29yZHNbM10gPSB0MDsKKyAgICAgICAgdGV4Y29vcmRzWzRdID0gMDsKKyAgICAgICAgdGV4Y29vcmRzWzVdID0gZHRkeTsKKyAgICAgICAgdGV4Y29vcmRzWzZdID0gMDsKKyAgICAgICAgdGV4Y29vcmRzWzddID0gMDsKKyAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy50ZXhDb29yZEdyYWRTY2FsZTh4dihjLCBpLCB0ZXhjb29yZHMpOworICAgIH0KKworICAgIGNvbnN0IHVpbnQzMl90IGVuYWJsZXMgPSBjLT5yYXN0ZXJpemVyLnN0YXRlLmVuYWJsZXM7CisgICAgaWYgKGdnbF91bmxpa2VseShlbmFibGVzICYgKEdHTF9FTkFCTEVfREVQVEhfVEVTVHxHR0xfRU5BQkxFX0ZPRykpKQorICAgICAgICBzZXRfZGVwdGhfYW5kX2ZvZyhjLCB6KTsKKworICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuYWN0aXZlVGV4dHVyZShjLCBjLT50ZXh0dXJlcy5hY3RpdmUpOworICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuY29sb3I0eHYoYywgYy0+Y3VycmVudENvbG9yQ2xhbXBlZC52KTsKKyAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmRpc2FibGUoYywgR0dMX1dfTEVSUCk7CisgICAgYy0+cmFzdGVyaXplci5wcm9jcy5kaXNhYmxlKGMsIEdHTF9BQSk7CisgICAgYy0+cmFzdGVyaXplci5wcm9jcy5zaGFkZU1vZGVsKGMsIEdMX0ZMQVQpOworICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MucmVjdGkoYywgCisgICAgICAgICAgICBnZ2xGaXhlZFRvSW50Um91bmQoeCksCisgICAgICAgICAgICBnZ2xGaXhlZFRvSW50Um91bmQoeSksCisgICAgICAgICAgICBnZ2xGaXhlZFRvSW50Um91bmQoeCkrdywKKyAgICAgICAgICAgIGdnbEZpeGVkVG9JbnRSb3VuZCh5KStoKTsKK30KKworc3RhdGljIHZvaWQgZHJhd1RleGlPRVMoR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgdywgR0xpbnQgaCwgb2dsZXNfY29udGV4dF90KiBjKQoreworICAgIC8vIEFsbCBjb29yZGluYXRlcyBhcmUgaW50ZWdlciwgc28gaWYgd2UgaGF2ZSBvbmx5IG9uZQorICAgIC8vIHRleHR1cmUgdW5pdCBhY3RpdmUgYW5kIG5vIHNjYWxpbmcgaXMgcmVxdWlyZWQKKyAgICAvLyBUSEVOLCB3ZSBjYW4gdXNlIG91ciBzcGVjaWFsIDE6MSBtYXBwaW5nCisgICAgLy8gd2hpY2ggaXMgYSBsb3QgZmFzdGVyLgorCisgICAgaWYgKGdnbF9saWtlbHkoYy0+cmFzdGVyaXplci5zdGF0ZS5lbmFibGVkX3RtdSA9PSAxKSkgeworICAgICAgICBjb25zdCBpbnQgdG11ID0gMDsKKyAgICAgICAgdGV4dHVyZV91bml0X3QmIHUoYy0+dGV4dHVyZXMudG11W3RtdV0pOworICAgICAgICBFR0xUZXh0dXJlT2JqZWN0KiB0ZXh0dXJlT2JqZWN0ID0gdS50ZXh0dXJlOyAgCisgICAgICAgIGNvbnN0IEdMaW50IFdjciA9IHRleHR1cmVPYmplY3QtPmNyb3BfcmVjdFsyXTsKKyAgICAgICAgY29uc3QgR0xpbnQgSGNyID0gdGV4dHVyZU9iamVjdC0+Y3JvcF9yZWN0WzNdOworCisgICAgICAgIGlmICgodyA9PSBXY3IpICYmIChoID09IC1IY3IpKSB7CisgICAgICAgICAgICBpZiAoKHd8aCkgPD0gMCkgcmV0dXJuOyAvLyBxdWlja2x5IHJlamVjdCBlbXB0eSByZWN0cworCisgICAgICAgICAgICBpZiAodS5kaXJ0eSkgeworICAgICAgICAgICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuYWN0aXZlVGV4dHVyZShjLCB0bXUpOworICAgICAgICAgICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuYmluZFRleHR1cmUoYywgJih1LnRleHR1cmUtPnN1cmZhY2UpKTsKKyAgICAgICAgICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLnRleFBhcmFtZXRlcmkoYywgR0dMX1RFWFRVUkVfMkQsCisgICAgICAgICAgICAgICAgICAgICAgICBHR0xfVEVYVFVSRV9NSU5fRklMVEVSLCB1LnRleHR1cmUtPm1pbl9maWx0ZXIpOworICAgICAgICAgICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MudGV4UGFyYW1ldGVyaShjLCBHR0xfVEVYVFVSRV8yRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdHTF9URVhUVVJFX01BR19GSUxURVIsIHUudGV4dHVyZS0+bWFnX2ZpbHRlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLnRleEdlbmkoYywgR0dMX1MsCisgICAgICAgICAgICAgICAgICAgIEdHTF9URVhUVVJFX0dFTl9NT0RFLCBHR0xfT05FX1RPX09ORSk7CisgICAgICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLnRleEdlbmkoYywgR0dMX1QsCisgICAgICAgICAgICAgICAgICAgIEdHTF9URVhUVVJFX0dFTl9NT0RFLCBHR0xfT05FX1RPX09ORSk7CisgICAgICAgICAgICB1LmRpcnR5ID0gMHhGRjsgLy8gWFhYOiBzaG91bGQgYmUgbW9yZSBzdWJ0bGUKKyAgICAgICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuYWN0aXZlVGV4dHVyZShjLCBjLT50ZXh0dXJlcy5hY3RpdmUpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjb25zdCBHR0xTdXJmYWNlJiBjYlN1cmZhY2UgPSBjLT5yYXN0ZXJpemVyLnN0YXRlLmJ1ZmZlcnMuY29sb3IuczsKKyAgICAgICAgICAgIHkgPSBjYlN1cmZhY2UuaGVpZ2h0IC0gKHkgKyBoKTsKKyAgICAgICAgICAgIGNvbnN0IEdMaW50IFVjciA9IHRleHR1cmVPYmplY3QtPmNyb3BfcmVjdFswXTsKKyAgICAgICAgICAgIGNvbnN0IEdMaW50IFZjciA9IHRleHR1cmVPYmplY3QtPmNyb3BfcmVjdFsxXTsKKyAgICAgICAgICAgIGNvbnN0IEdMaW50IHMwICA9IFVjciAtIHg7CisgICAgICAgICAgICBjb25zdCBHTGludCB0MCAgPSAoVmNyICsgSGNyKSAtIHk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNvbnN0IEdMdWludCB0dyA9IHRleHR1cmVPYmplY3QtPnN1cmZhY2Uud2lkdGg7CisgICAgICAgICAgICBjb25zdCBHTHVpbnQgdGggPSB0ZXh0dXJlT2JqZWN0LT5zdXJmYWNlLmhlaWdodDsKKyAgICAgICAgICAgIGlmICgodWludDMyX3QoczAreCt3KSA+IHR3KSB8fCAodWludDMyX3QodDAreStoKSA+IHRoKSkgeworICAgICAgICAgICAgICAgIC8vIFRoZSBHTCBzcGVjIGlzIHVuY2xlYXIgYWJvdXQgd2hhdCBzaG91bGQgaGFwcGVuCisgICAgICAgICAgICAgICAgLy8gaW4gdGhpcyBjYXNlLCBzbyB3ZSBqdXN0IHVzZSB0aGUgc2xvdyBjYXNlLCB3aGljaAorICAgICAgICAgICAgICAgIC8vIGF0IGxlYXN0IHdvbid0IGNyYXNoCisgICAgICAgICAgICAgICAgZ290byBzbG93X2Nhc2U7CisgICAgICAgICAgICB9IAorCisgICAgICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLnRleENvb3JkMmkoYywgczAsIHQwKTsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGVuYWJsZXMgPSBjLT5yYXN0ZXJpemVyLnN0YXRlLmVuYWJsZXM7CisgICAgICAgICAgICBpZiAoZ2dsX3VubGlrZWx5KGVuYWJsZXMgJiAoR0dMX0VOQUJMRV9ERVBUSF9URVNUfEdHTF9FTkFCTEVfRk9HKSkpCisgICAgICAgICAgICAgICAgc2V0X2RlcHRoX2FuZF9mb2coYywgeik7CisKKyAgICAgICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuY29sb3I0eHYoYywgYy0+Y3VycmVudENvbG9yQ2xhbXBlZC52KTsKKyAgICAgICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuZGlzYWJsZShjLCBHR0xfV19MRVJQKTsKKyAgICAgICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuZGlzYWJsZShjLCBHR0xfQUEpOworICAgICAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy5zaGFkZU1vZGVsKGMsIEdMX0ZMQVQpOworICAgICAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy5yZWN0aShjLCB4LCB5LCB4K3csIHkraCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKK3Nsb3dfY2FzZToKKyAgICBkcmF3VGV4eE9FUygKKyAgICAgICAgICAgIGdnbEludFRvRml4ZWQoeCksIGdnbEludFRvRml4ZWQoeSksIGdnbEludFRvRml4ZWQoeiksCisgICAgICAgICAgICBnZ2xJbnRUb0ZpeGVkKHcpLCBnZ2xJbnRUb0ZpeGVkKGgpLAorICAgICAgICAgICAgYyk7Cit9CisKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKKworI2lmIDAKKyNwcmFnbWEgbWFyayAtCisjcHJhZ21hIG1hcmsgVGV4dHVyZSBBUEkKKyNlbmRpZgorCit2b2lkIGdsQWN0aXZlVGV4dHVyZShHTGVudW0gdGV4dHVyZSkKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGlmICh1aW50MzJfdCh0ZXh0dXJlLUdMX1RFWFRVUkUwKSA+IHVpbnQzMl90KEdHTF9URVhUVVJFX1VOSVRfQ09VTlQpKSB7CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYy0+dGV4dHVyZXMuYWN0aXZlID0gdGV4dHVyZSAtIEdMX1RFWFRVUkUwOworICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuYWN0aXZlVGV4dHVyZShjLCBjLT50ZXh0dXJlcy5hY3RpdmUpOworfQorCit2b2lkIGdsQmluZFRleHR1cmUoR0xlbnVtIHRhcmdldCwgR0x1aW50IHRleHR1cmUpCit7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBpZiAodGFyZ2V0ICE9IEdMX1RFWFRVUkVfMkQpIHsKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEJpbmQgb3IgY3JlYXRlIGEgdGV4dHVyZQorICAgIHNwPEVHTFRleHR1cmVPYmplY3Q+IHRleDsgICAgCisgICAgaWYgKHRleHR1cmUgPT0gMCkgeworICAgICAgICAvLyAwIGlzIG91ciBsb2NhbCB0ZXh0dXJlIG9iamVjdAorICAgICAgICB0ZXggPSBjLT50ZXh0dXJlcy5kZWZhdWx0VGV4dHVyZTsKKyAgICB9IGVsc2UgeworICAgICAgICB0ZXggPSBjLT5zdXJmYWNlTWFuYWdlci0+dGV4dHVyZSh0ZXh0dXJlKTsKKyAgICAgICAgaWYgKGdnbF91bmxpa2VseSh0ZXggPT0gMCkpIHsKKyAgICAgICAgICAgIHRleCA9IGMtPnN1cmZhY2VNYW5hZ2VyLT5jcmVhdGVUZXh0dXJlKHRleHR1cmUpOworICAgICAgICAgICAgaWYgKHRleCA9PSAwKSB7CisgICAgICAgICAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfT1VUX09GX01FTU9SWSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGJpbmRUZXh0dXJlVG11KGMsIGMtPnRleHR1cmVzLmFjdGl2ZSwgdGV4dHVyZSwgdGV4KTsKK30KKwordm9pZCBnbEdlblRleHR1cmVzKEdMc2l6ZWkgbiwgR0x1aW50ICp0ZXh0dXJlcykKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGlmIChuPDApIHsKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gZ2VuZXJhdGUgdW5pcXVlIChzaGFyZWQpIHRleHR1cmUgbmFtZXMKKyAgICBjLT5zdXJmYWNlTWFuYWdlci0+Z2V0VG9rZW4obiwgdGV4dHVyZXMpOworfQorCit2b2lkIGdsRGVsZXRlVGV4dHVyZXMoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnRleHR1cmVzKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgaWYgKG48MCkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIElmIGRlbGV0aW5nIGEgYm91bmQgdGV4dHVyZSwgYmluZCB0aGlzIHVuaXQgdG8gMAorICAgIGZvciAoaW50IHQ9MCA7IHQ8R0dMX1RFWFRVUkVfVU5JVF9DT1VOVCA7IHQrKykgeworICAgICAgICBpZiAoYy0+dGV4dHVyZXMudG11W3RdLm5hbWUgPT0gMCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBmb3IgKGludCBpPTAgOyBpPG4gOyBpKyspIHsKKyAgICAgICAgICAgIGlmICh0ZXh0dXJlc1tpXSAmJiAodGV4dHVyZXNbaV0gPT0gYy0+dGV4dHVyZXMudG11W3RdLm5hbWUpKSB7CisgICAgICAgICAgICAgICAgLy8gYmluZCB0aGlzIHRtdSB0byB0ZXh0dXJlIDAKKyAgICAgICAgICAgICAgICBzcDxFR0xUZXh0dXJlT2JqZWN0PiB0ZXgoYy0+dGV4dHVyZXMuZGVmYXVsdFRleHR1cmUpOworICAgICAgICAgICAgICAgIGJpbmRUZXh0dXJlVG11KGMsIHQsIDAsIHRleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgYy0+c3VyZmFjZU1hbmFnZXItPmRlbGV0ZVRleHR1cmVzKG4sIHRleHR1cmVzKTsKKyAgICBjLT5zdXJmYWNlTWFuYWdlci0+cmVjeWNsZVRva2VucyhuLCB0ZXh0dXJlcyk7Cit9CisKK3ZvaWQgZ2xNdWx0aVRleENvb3JkNGYoCisgICAgICAgIEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHIsIEdMZmxvYXQgcSkKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGlmICh1aW50MzJfdCh0YXJnZXQtR0xfVEVYVFVSRTApID4gdWludDMyX3QoR0dMX1RFWFRVUkVfVU5JVF9DT1VOVCkpIHsKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjb25zdCBpbnQgdG11ID0gdGFyZ2V0LUdMX1RFWFRVUkUwOworICAgIGMtPmN1cnJlbnQudGV4dHVyZVt0bXVdLlMgPSBnZ2xGbG9hdFRvRml4ZWQocyk7CisgICAgYy0+Y3VycmVudC50ZXh0dXJlW3RtdV0uVCA9IGdnbEZsb2F0VG9GaXhlZCh0KTsKKyAgICBjLT5jdXJyZW50LnRleHR1cmVbdG11XS5SID0gZ2dsRmxvYXRUb0ZpeGVkKHIpOworICAgIGMtPmN1cnJlbnQudGV4dHVyZVt0bXVdLlEgPSBnZ2xGbG9hdFRvRml4ZWQocSk7Cit9CisKK3ZvaWQgZ2xNdWx0aVRleENvb3JkNHgoCisgICAgICAgIEdMZW51bSB0YXJnZXQsIEdMZml4ZWQgcywgR0xmaXhlZCB0LCBHTGZpeGVkIHIsIEdMZml4ZWQgcSkKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGlmICh1aW50MzJfdCh0YXJnZXQtR0xfVEVYVFVSRTApID4gdWludDMyX3QoR0dMX1RFWFRVUkVfVU5JVF9DT1VOVCkpIHsKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjb25zdCBpbnQgdG11ID0gdGFyZ2V0LUdMX1RFWFRVUkUwOworICAgIGMtPmN1cnJlbnQudGV4dHVyZVt0bXVdLlMgPSBzOworICAgIGMtPmN1cnJlbnQudGV4dHVyZVt0bXVdLlQgPSB0OworICAgIGMtPmN1cnJlbnQudGV4dHVyZVt0bXVdLlIgPSByOworICAgIGMtPmN1cnJlbnQudGV4dHVyZVt0bXVdLlEgPSBxOworfQorCit2b2lkIGdsUGl4ZWxTdG9yZWkoR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSkKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGlmICgocG5hbWUgIT0gR0xfUEFDS19BTElHTk1FTlQpICYmIChwbmFtZSAhPSBHTF9VTlBBQ0tfQUxJR05NRU5UKSkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOworICAgICAgICByZXR1cm47CisgICAgfSAgICAKKyAgICBpZiAoKHBhcmFtPD0wIHx8IHBhcmFtPjgpIHx8IChwYXJhbSAmIChwYXJhbS0xKSkpIHsKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHBuYW1lID09IEdMX1BBQ0tfQUxJR05NRU5UKQorICAgICAgICBjLT50ZXh0dXJlcy5wYWNrQWxpZ25tZW50ID0gcGFyYW07CisgICAgaWYgKHBuYW1lID09IEdMX1VOUEFDS19BTElHTk1FTlQpCisgICAgICAgIGMtPnRleHR1cmVzLnVucGFja0FsaWdubWVudCA9IHBhcmFtOworfQorCit2b2lkIGdsVGV4RW52ZihHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pCit7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBjLT5yYXN0ZXJpemVyLnByb2NzLnRleEVudmkoYywgdGFyZ2V0LCBwbmFtZSwgR0xpbnQocGFyYW0pKTsKK30KKwordm9pZCBnbFRleEVudmZ2KAorICAgICAgICBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGlmIChwbmFtZSA9PSBHTF9URVhUVVJFX0VOVl9NT0RFKSB7CisgICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MudGV4RW52aShjLCB0YXJnZXQsIHBuYW1lLCBHTGludCgqcGFyYW1zKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHBuYW1lID09IEdMX1RFWFRVUkVfRU5WX0NPTE9SKSB7CisgICAgICAgIEdHTGZpeGVkIGZpeGVkWzRdOworICAgICAgICBmb3IgKGludCBpPTAgOyBpPDQgOyBpKyspCisgICAgICAgICAgICBmaXhlZFtpXSA9IGdnbEZsb2F0VG9GaXhlZChwYXJhbXNbaV0pOworICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLnRleEVudnh2KGMsIHRhcmdldCwgcG5hbWUsIGZpeGVkKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOworfQorCit2b2lkIGdsVGV4RW52eChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pCit7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBjLT5yYXN0ZXJpemVyLnByb2NzLnRleEVudmkoYywgdGFyZ2V0LCBwbmFtZSwgcGFyYW0pOworfQorCit2b2lkIGdsVGV4RW52eHYoCisgICAgICAgIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgYy0+cmFzdGVyaXplci5wcm9jcy50ZXhFbnZ4dihjLCB0YXJnZXQsIHBuYW1lLCBwYXJhbXMpOworfQorCit2b2lkIGdsVGV4UGFyYW1ldGVyaXYoCisgICAgICAgIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQqIHBhcmFtcykKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGlmICh0YXJnZXQgIT0gR0dMX1RFWFRVUkVfMkQpIHsKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEVHTFRleHR1cmVPYmplY3QqIHRleHR1cmVPYmplY3QgPSBjLT50ZXh0dXJlcy50bXVbYy0+dGV4dHVyZXMuYWN0aXZlXS50ZXh0dXJlOworICAgIHN3aXRjaCAocG5hbWUpIHsKKyAgICBjYXNlIEdMX1RFWFRVUkVfQ1JPUF9SRUNUX09FUzoKKyAgICAgICAgbWVtY3B5KHRleHR1cmVPYmplY3QtPmNyb3BfcmVjdCwgcGFyYW1zLCA0KnNpemVvZihHTGludCkpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOworICAgICAgICByZXR1cm47CisgICAgfQorfQorCit2b2lkIGdsVGV4UGFyYW1ldGVyZigKKyAgICAgICAgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgdGV4UGFyYW1ldGVyeCh0YXJnZXQsIHBuYW1lLCBHTGZpeGVkKHBhcmFtKSwgYyk7Cit9CisKK3ZvaWQgZ2xUZXhQYXJhbWV0ZXJ4KAorICAgICAgICBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pCit7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICB0ZXhQYXJhbWV0ZXJ4KHRhcmdldCwgcG5hbWUsIHBhcmFtLCBjKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIDAKKyNwcmFnbWEgbWFyayAtCisjZW5kaWYKKwordm9pZCBnbENvbXByZXNzZWRUZXhJbWFnZTJEKAorICAgICAgICBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LAorICAgICAgICBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLAorICAgICAgICBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgaWYgKHRhcmdldCAhPSBHTF9URVhUVVJFXzJEKSB7CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKChpbnRlcm5hbGZvcm1hdCA8IEdMX1BBTEVUVEU0X1JHQjhfT0VTIHx8CisgICAgICAgICBpbnRlcm5hbGZvcm1hdCA+IEdMX1BBTEVUVEU4X1JHQjVfQTFfT0VTKSkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICh3aWR0aDwwIHx8IGhlaWdodDwwIHx8IGJvcmRlciE9MCkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vICJ1bmNvbXByZXNzIiB0aGUgdGV4dHVyZSBzaW5jZSBwaXhlbGZsaW5nZXIgZG9lc24ndCBzdXBwb3J0CisgICAgLy8gYW55IGNvbXByZXNzZWQgdGV4dHVyZSBmb3JtYXQgbmF0aXZlbHkuIAorICAgIEdMZW51bSBmb3JtYXQ7CisgICAgR0xlbnVtIHR5cGU7CisgICAgc3dpdGNoIChpbnRlcm5hbGZvcm1hdCkgeworICAgIGNhc2UgR0xfUEFMRVRURThfUkdCOF9PRVM6CisgICAgY2FzZSBHTF9QQUxFVFRFNF9SR0I4X09FUzoKKyAgICAgICAgZm9ybWF0ICAgICAgPSBHTF9SR0I7CisgICAgICAgIHR5cGUgICAgICAgID0gR0xfVU5TSUdORURfQllURTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9QQUxFVFRFOF9SR0JBOF9PRVM6CisgICAgY2FzZSBHTF9QQUxFVFRFNF9SR0JBOF9PRVM6CisgICAgICAgIGZvcm1hdCAgICAgID0gR0xfUkdCQTsKKyAgICAgICAgdHlwZSAgICAgICAgPSBHTF9VTlNJR05FRF9CWVRFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX1BBTEVUVEU4X1I1X0c2X0I1X09FUzoKKyAgICBjYXNlIEdMX1BBTEVUVEU0X1I1X0c2X0I1X09FUzoKKyAgICAgICAgZm9ybWF0ICAgICAgPSBHTF9SR0I7CisgICAgICAgIHR5cGUgICAgICAgID0gR0xfVU5TSUdORURfU0hPUlRfNV82XzU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfUEFMRVRURThfUkdCQTRfT0VTOgorICAgIGNhc2UgR0xfUEFMRVRURTRfUkdCQTRfT0VTOgorICAgICAgICBmb3JtYXQgICAgICA9IEdMX1JHQkE7CisgICAgICAgIHR5cGUgICAgICAgID0gR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9QQUxFVFRFOF9SR0I1X0ExX09FUzoKKyAgICBjYXNlIEdMX1BBTEVUVEU0X1JHQjVfQTFfT0VTOgorICAgICAgICBmb3JtYXQgICAgICA9IEdMX1JHQkE7CisgICAgICAgIHR5cGUgICAgICAgID0gR0xfVU5TSUdORURfU0hPUlRfNV81XzVfMTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghZGF0YSB8fCAhd2lkdGggfHwgIWhlaWdodCkgeworICAgICAgICAvLyB1bmNsZWFyIGlmIHRoaXMgaXMgYW4gZXJyb3Igb3Igbm90Li4uCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQzMl90IHNpemU7CisgICAgR0dMU3VyZmFjZSogc3VyZmFjZTsKKyAgICAvLyBhbGwgbWlwbWFwIGxldmVscyBhcmUgc3BlY2lmaWVkIGF0IG9uY2UuCisgICAgY29uc3QgaW50IG51bUxldmVscyA9IGxldmVsPDAgPyAtbGV2ZWwgOiAxOworICAgIGZvciAoaW50IGk9MCA7IGk8bnVtTGV2ZWxzIDsgaSsrKSB7CisgICAgICAgIGludCBsb2RfdyA9ICh3aWR0aCAgPj4gaSkgPyA6IDE7CisgICAgICAgIGludCBsb2RfaCA9IChoZWlnaHQgPj4gaSkgPyA6IDE7CisgICAgICAgIGludCBlcnJvciA9IGNyZWF0ZVRleHR1cmVTdXJmYWNlKGMsICZzdXJmYWNlLCAmc2l6ZSwKKyAgICAgICAgICAgICAgICBpLCBmb3JtYXQsIHR5cGUsIGxvZF93LCBsb2RfaCk7CisgICAgICAgIGlmIChlcnJvcikgeworICAgICAgICAgICAgb2dsZXNfZXJyb3IoYywgZXJyb3IpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGRlY29kZVBhbGV0dGU0KGRhdGEsIGksIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgc3VyZmFjZS0+ZGF0YSwgc3VyZmFjZS0+c3RyaWRlLCBpbnRlcm5hbGZvcm1hdCk7CisgICAgfQorfQorCisKK3ZvaWQgZ2xUZXhJbWFnZTJEKAorICAgICAgICBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgaW50ZXJuYWxmb3JtYXQsCisgICAgICAgIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsCisgICAgICAgIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscykKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGlmICh0YXJnZXQgIT0gR0xfVEVYVFVSRV8yRCAmJiB0YXJnZXQgIT0gR0xfRElSRUNUX1RFWFRVUkVfMkRfUVVBTENPTU0pIHsKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAod2lkdGg8MCB8fCBoZWlnaHQ8MCB8fCBib3JkZXIhPTAgfHwgbGV2ZWwgPCAwKSB7CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChmb3JtYXQgIT0gaW50ZXJuYWxmb3JtYXQpIHsKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICh2YWxpZEZvcm1hdFR5cGUoYywgZm9ybWF0LCB0eXBlKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50MzJfdCBzaXplID0gMDsKKyAgICBHR0xTdXJmYWNlKiBzdXJmYWNlID0gMDsKKyAgICBpZiAodGFyZ2V0ICE9IEdMX0RJUkVDVF9URVhUVVJFXzJEX1FVQUxDT01NKSB7CisgICAgICAgIGludCBlcnJvciA9IGNyZWF0ZVRleHR1cmVTdXJmYWNlKGMsICZzdXJmYWNlLCAmc2l6ZSwKKyAgICAgICAgICAgICAgICBsZXZlbCwgZm9ybWF0LCB0eXBlLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgaWYgKGVycm9yKSB7CisgICAgICAgICAgICBvZ2xlc19lcnJvcihjLCBlcnJvcik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHBpeGVscyA9PSAwIHx8IGxldmVsICE9IDApIHsKKyAgICAgICAgLy8gcGl4ZWwgY2FuJ3QgYmUgbnVsbCBmb3IgZGlyZWN0IHRleHR1cmUKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHBpeGVscykgeworICAgICAgICBjb25zdCBpbnQzMl90IGZvcm1hdElkeCA9IGNvbnZlcnRHTFBpeGVsRm9ybWF0KGZvcm1hdCwgdHlwZSk7CisgICAgICAgIGNvbnN0IEdHTEZvcm1hdCYgcGl4ZWxGb3JtYXQoYy0+cmFzdGVyaXplci5mb3JtYXRzW2Zvcm1hdElkeF0pOworICAgICAgICBjb25zdCBpbnQzMl90IGFsaWduID0gYy0+dGV4dHVyZXMudW5wYWNrQWxpZ25tZW50LTE7CisgICAgICAgIGNvbnN0IGludDMyX3QgYnByID0gKCh3aWR0aCAqIHBpeGVsRm9ybWF0LnNpemUpICsgYWxpZ24pICYgfmFsaWduOworICAgICAgICBjb25zdCBzaXplX3Qgc2l6ZSA9IGJwciAqIGhlaWdodDsKKyAgICAgICAgY29uc3QgaW50MzJfdCBzdHJpZGUgPSBicHIgLyBwaXhlbEZvcm1hdC5zaXplOworCisgICAgICAgIEdHTFN1cmZhY2UgdXNlclN1cmZhY2U7CisgICAgICAgIHVzZXJTdXJmYWNlLnZlcnNpb24gPSBzaXplb2YodXNlclN1cmZhY2UpOworICAgICAgICB1c2VyU3VyZmFjZS53aWR0aCAgPSB3aWR0aDsKKyAgICAgICAgdXNlclN1cmZhY2UuaGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICB1c2VyU3VyZmFjZS5zdHJpZGUgPSBzdHJpZGU7CisgICAgICAgIHVzZXJTdXJmYWNlLmZvcm1hdCA9IGZvcm1hdElkeDsKKyAgICAgICAgdXNlclN1cmZhY2UuY29tcHJlc3NlZEZvcm1hdCA9IDA7CisgICAgICAgIHVzZXJTdXJmYWNlLmRhdGEgPSAoR0x1Ynl0ZSopcGl4ZWxzOworCisgICAgICAgIGlmICh0YXJnZXQgIT0gR0xfRElSRUNUX1RFWFRVUkVfMkRfUVVBTENPTU0pIHsKKyAgICAgICAgICAgIGludCBlcnIgPSBjb3B5UGl4ZWxzKGMsICpzdXJmYWNlLCAwLCAwLCB1c2VyU3VyZmFjZSwgMCwgMCwgd2lkdGgsIGhlaWdodCk7IAorICAgICAgICAgICAgaWYgKGVycikgeworICAgICAgICAgICAgICAgIG9nbGVzX2Vycm9yKGMsIGVycik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ2VuZXJhdGVNaXBtYXAoYywgbGV2ZWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gYmluZCBpdCB0byB0aGUgdGV4dHVyZSB1bml0CisgICAgICAgICAgICBzcDxFR0xUZXh0dXJlT2JqZWN0PiB0ZXggPSBnZXRBbmRCaW5kQWN0aXZlVGV4dHVyZU9iamVjdChjKTsKKyAgICAgICAgICAgIHRleC0+c2V0U3VyZmFjZSgmdXNlclN1cmZhY2UpOworICAgICAgICB9CisgICAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCgKKyAgICAgICAgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsCisgICAgICAgIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LAorICAgICAgICBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwKKyAgICAgICAgY29uc3QgR0x2b2lkICpkYXRhKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKK30KKwordm9pZCBnbFRleFN1YkltYWdlMkQoCisgICAgICAgIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LAorICAgICAgICBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwKKyAgICAgICAgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgaWYgKHRhcmdldCAhPSBHTF9URVhUVVJFXzJEKSB7CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHhvZmZzZXQ8MCB8fCB5b2Zmc2V0PDAgfHwgd2lkdGg8MCB8fCBoZWlnaHQ8MCB8fCBsZXZlbDwwKSB7CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICh2YWxpZEZvcm1hdFR5cGUoYywgZm9ybWF0LCB0eXBlKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gZmluZCBvdXQgd2hpY2ggdGV4dHVyZSBpcyBib3VuZCB0byB0aGUgY3VycmVudCB1bml0CisgICAgY29uc3QgaW50IGFjdGl2ZSA9IGMtPnRleHR1cmVzLmFjdGl2ZTsKKyAgICBFR0xUZXh0dXJlT2JqZWN0KiB0ZXggPSBjLT50ZXh0dXJlcy50bXVbYWN0aXZlXS50ZXh0dXJlOworICAgIGNvbnN0IEdHTFN1cmZhY2UmIHN1cmZhY2UodGV4LT5taXAobGV2ZWwpKTsKKworICAgIGlmICghdGV4LT5pbnRlcm5hbGZvcm1hdCB8fCB0ZXgtPmRpcmVjdCkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCh4b2Zmc2V0ICsgd2lkdGggID4gR0xzaXplaShzdXJmYWNlLndpZHRoKSkgfHwKKyAgICAgICAgKHlvZmZzZXQgKyBoZWlnaHQgPiBHTHNpemVpKHN1cmZhY2UuaGVpZ2h0KSkpIHsKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCF3aWR0aCB8fCAhaGVpZ2h0KSB7CisgICAgICAgIHJldHVybjsgLy8gb2theSwgYnV0IG5vLW9wLgorICAgIH0KKworICAgIC8vIGZpZ3VyZSBvdXQgdGhlIHNpemUgd2UgbmVlZCBhcyB3ZWxsIGFzIHRoZSBzdHJpZGUKKyAgICBjb25zdCBpbnQzMl90IGZvcm1hdElkeCA9IGNvbnZlcnRHTFBpeGVsRm9ybWF0KGZvcm1hdCwgdHlwZSk7CisgICAgaWYgKGZvcm1hdElkeCA9PSAwKSB7IC8vIHdlIGRvbid0IGtub3cgd2hhdCB0byBkbyB3aXRoIHRoaXMKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgR0dMRm9ybWF0JiBwaXhlbEZvcm1hdChjLT5yYXN0ZXJpemVyLmZvcm1hdHNbZm9ybWF0SWR4XSk7CisgICAgY29uc3QgaW50MzJfdCBhbGlnbiA9IGMtPnRleHR1cmVzLnVucGFja0FsaWdubWVudC0xOworICAgIGNvbnN0IGludDMyX3QgYnByID0gKCh3aWR0aCAqIHBpeGVsRm9ybWF0LnNpemUpICsgYWxpZ24pICYgfmFsaWduOworICAgIGNvbnN0IHNpemVfdCBzaXplID0gYnByICogaGVpZ2h0OworICAgIGNvbnN0IGludDMyX3Qgc3RyaWRlID0gYnByIC8gcGl4ZWxGb3JtYXQuc2l6ZTsKKyAgICBHR0xTdXJmYWNlIHVzZXJTdXJmYWNlOworICAgIHVzZXJTdXJmYWNlLnZlcnNpb24gPSBzaXplb2YodXNlclN1cmZhY2UpOworICAgIHVzZXJTdXJmYWNlLndpZHRoICA9IHdpZHRoOworICAgIHVzZXJTdXJmYWNlLmhlaWdodCA9IGhlaWdodDsKKyAgICB1c2VyU3VyZmFjZS5zdHJpZGUgPSBzdHJpZGU7CisgICAgdXNlclN1cmZhY2UuZm9ybWF0ID0gZm9ybWF0SWR4OworICAgIHVzZXJTdXJmYWNlLmNvbXByZXNzZWRGb3JtYXQgPSAwOworICAgIHVzZXJTdXJmYWNlLmRhdGEgPSAoR0x1Ynl0ZSopcGl4ZWxzOworCisgICAgaW50IGVyciA9IGNvcHlQaXhlbHMoYywKKyAgICAgICAgICAgIHN1cmZhY2UsIHhvZmZzZXQsIHlvZmZzZXQsCisgICAgICAgICAgICB1c2VyU3VyZmFjZSwgMCwgMCwgd2lkdGgsIGhlaWdodCk7IAorICAgIGlmIChlcnIpIHsKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgZXJyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGdlbmVyYXRlTWlwbWFwKGMsIGxldmVsKTsKKworICAgIC8vIHNpbmNlIHdlIG9ubHkgY2hhbmdlZCB0aGUgY29udGVudCBvZiB0aGUgdGV4dHVyZSwgd2UgZG9uJ3QgbmVlZAorICAgIC8vIHRvIGNhbGwgYmluZFRleHR1cmUgb24gdGhlIG1haW4gcmFzdGVyaXplci4KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIGdsQ29weVRleEltYWdlMkQoCisgICAgICAgIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsCisgICAgICAgIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LAorICAgICAgICBHTGludCBib3JkZXIpCit7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBpZiAodGFyZ2V0ICE9IEdMX1RFWFRVUkVfMkQpIHsKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoaW50ZXJuYWxmb3JtYXQ8R0xfQUxQSEEgfHwgaW50ZXJuYWxmb3JtYXQ+R0xfTFVNSU5BTkNFX0FMUEhBKSB7CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHdpZHRoPDAgfHwgaGVpZ2h0PDAgfHwgYm9yZGVyIT0wIHx8IGxldmVsPDApIHsKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBHTGVudW0gZm9ybWF0ID0gMDsKKyAgICBHTGVudW0gdHlwZSA9IEdMX1VOU0lHTkVEX0JZVEU7CisgICAgY29uc3QgR0dMU3VyZmFjZSYgY2JTdXJmYWNlID0gYy0+cmFzdGVyaXplci5zdGF0ZS5idWZmZXJzLmNvbG9yLnM7CisgICAgY29uc3QgaW50IGNiRm9ybWF0SWR4ID0gY2JTdXJmYWNlLmZvcm1hdDsKKyAgICBzd2l0Y2ggKGNiRm9ybWF0SWR4KSB7CisgICAgY2FzZSBHR0xfUElYRUxfRk9STUFUX1JHQl81NjU6CisgICAgICAgIHR5cGUgPSBHTF9VTlNJR05FRF9TSE9SVF81XzZfNTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHR0xfUElYRUxfRk9STUFUX1JHQkFfNTU1MToKKyAgICAgICAgdHlwZSA9IEdMX1VOU0lHTkVEX1NIT1JUXzVfNV81XzE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0dMX1BJWEVMX0ZPUk1BVF9SR0JBXzQ0NDQ6CisgICAgICAgIHR5cGUgPSBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80OworICAgICAgICBicmVhazsKKyAgICB9CisgICAgc3dpdGNoIChpbnRlcm5hbGZvcm1hdCkgeworICAgIGNhc2UgR0xfQUxQSEE6CisgICAgY2FzZSBHTF9MVU1JTkFOQ0VfQUxQSEE6CisgICAgY2FzZSBHTF9MVU1JTkFOQ0U6CisgICAgICAgIHR5cGUgPSBHTF9VTlNJR05FRF9CWVRFOworICAgICAgICBicmVhazsgICAgCisgICAgfQorCisgICAgLy8gZmlndXJlIG91dCB0aGUgZm9ybWF0IHRvIHVzZSBmb3IgdGhlIG5ldyB0ZXh0dXJlCisgICAgc3dpdGNoIChjYkZvcm1hdElkeCkgeworICAgIGNhc2UgR0dMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODg6CisgICAgY2FzZSBHR0xfUElYRUxfRk9STUFUX0FfODoKKyAgICBjYXNlIEdHTF9QSVhFTF9GT1JNQVRfUkdCQV81NTUxOgorICAgIGNhc2UgR0dMX1BJWEVMX0ZPUk1BVF9SR0JBXzQ0NDQ6CisgICAgICAgIGZvcm1hdCA9IGludGVybmFsZm9ybWF0OworICAgICAgICBicmVhazsgICAgCisgICAgY2FzZSBHR0xfUElYRUxfRk9STUFUX1JHQlhfODg4ODoKKyAgICBjYXNlIEdHTF9QSVhFTF9GT1JNQVRfUkdCXzg4ODoKKyAgICBjYXNlIEdHTF9QSVhFTF9GT1JNQVRfUkdCXzU2NToKKyAgICBjYXNlIEdHTF9QSVhFTF9GT1JNQVRfTF84OgorICAgICAgICBzd2l0Y2ggKGludGVybmFsZm9ybWF0KSB7CisgICAgICAgIGNhc2UgR0xfTFVNSU5BTkNFOgorICAgICAgICBjYXNlIEdMX1JHQjoKKyAgICAgICAgICAgIGZvcm1hdCA9IGludGVybmFsZm9ybWF0OworICAgICAgICAgICAgYnJlYWs7ICAgIAorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChmb3JtYXQgPT0gMCkgeworICAgICAgICAvLyBpbnZhbGlkIGNvbWJpbmF0aW9uCisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBjcmVhdGUgdGhlIG5ldyB0ZXh0dXJlLi4uCisgICAgaW50MzJfdCBzaXplOworICAgIEdHTFN1cmZhY2UqIHN1cmZhY2U7CisgICAgaW50IGVycm9yID0gY3JlYXRlVGV4dHVyZVN1cmZhY2UoYywgJnN1cmZhY2UsICZzaXplLAorICAgICAgICAgICAgbGV2ZWwsIGZvcm1hdCwgdHlwZSwgd2lkdGgsIGhlaWdodCk7CisgICAgaWYgKGVycm9yKSB7CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIGVycm9yKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICAvLyBUaGUgYm90dG9tIHJvdyBpcyBzdG9yZWQgZmlyc3QgaW4gdGV4dHVyZXMKKyAgICBHR0xTdXJmYWNlIHR4U3VyZmFjZSgqc3VyZmFjZSk7CisgICAgdHhTdXJmYWNlLnN0cmlkZSA9IC10eFN1cmZhY2Uuc3RyaWRlOworCisgICAgLy8gKHgseSkgaXMgdGhlIGxvd2VyLWxlZnQgY29ybmVyIG9mIGNvbG9yQnVmZmVyCisgICAgeSA9IGNiU3VyZmFjZS5oZWlnaHQgLSAoeSArIGhlaWdodCk7CisKKyAgICBpbnQgZXJyID0gY29weVBpeGVscyhjLAorICAgICAgICAgICAgdHhTdXJmYWNlLCAwLCAwLAorICAgICAgICAgICAgY2JTdXJmYWNlLCB4LCB5LCBjYlN1cmZhY2Uud2lkdGgsIGNiU3VyZmFjZS5oZWlnaHQpOyAgCisgICAgaWYgKGVycikgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBlcnIpOworICAgIH0KKworICAgIGdlbmVyYXRlTWlwbWFwKGMsIGxldmVsKTsKK30KKwordm9pZCBnbENvcHlUZXhTdWJJbWFnZTJEKAorICAgICAgICBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwKKyAgICAgICAgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpCit7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBpZiAodGFyZ2V0ICE9IEdMX1RFWFRVUkVfMkQpIHsKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoeG9mZnNldDwwIHx8IHlvZmZzZXQ8MCB8fCB3aWR0aDwwIHx8IGhlaWdodDwwIHx8IGxldmVsPDApIHsKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCF3aWR0aCB8fCAhaGVpZ2h0KSB7CisgICAgICAgIHJldHVybjsgLy8gb2theSwgYnV0IG5vLW9wLgorICAgIH0KKworICAgIC8vIGZpbmQgb3V0IHdoaWNoIHRleHR1cmUgaXMgYm91bmQgdG8gdGhlIGN1cnJlbnQgdW5pdAorICAgIGNvbnN0IGludCBhY3RpdmUgPSBjLT50ZXh0dXJlcy5hY3RpdmU7CisgICAgRUdMVGV4dHVyZU9iamVjdCogdGV4ID0gYy0+dGV4dHVyZXMudG11W2FjdGl2ZV0udGV4dHVyZTsKKyAgICBjb25zdCBHR0xTdXJmYWNlJiBzdXJmYWNlKHRleC0+bWlwKGxldmVsKSk7CisKKyAgICBpZiAoIXRleC0+aW50ZXJuYWxmb3JtYXQpIHsKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICgoeG9mZnNldCArIHdpZHRoICA+IEdMc2l6ZWkoc3VyZmFjZS53aWR0aCkpIHx8CisgICAgICAgICh5b2Zmc2V0ICsgaGVpZ2h0ID4gR0xzaXplaShzdXJmYWNlLmhlaWdodCkpKSB7CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gVGhlIGJvdHRvbSByb3cgaXMgc3RvcmVkIGZpcnN0IGluIHRleHR1cmVzCisgICAgR0dMU3VyZmFjZSB0eFN1cmZhY2Uoc3VyZmFjZSk7CisgICAgdHhTdXJmYWNlLnN0cmlkZSA9IC10eFN1cmZhY2Uuc3RyaWRlOworCisgICAgLy8gKHgseSkgaXMgdGhlIGxvd2VyLWxlZnQgY29ybmVyIG9mIGNvbG9yQnVmZmVyCisgICAgY29uc3QgR0dMU3VyZmFjZSYgY2JTdXJmYWNlID0gYy0+cmFzdGVyaXplci5zdGF0ZS5idWZmZXJzLmNvbG9yLnM7CisgICAgeSA9IGNiU3VyZmFjZS5oZWlnaHQgLSAoeSArIGhlaWdodCk7CisKKyAgICBpbnQgZXJyID0gY29weVBpeGVscyhjLAorICAgICAgICAgICAgc3VyZmFjZSwgeG9mZnNldCwgeW9mZnNldCwKKyAgICAgICAgICAgIGNiU3VyZmFjZSwgeCwgeSwgd2lkdGgsIGhlaWdodCk7ICAKKyAgICBpZiAoZXJyKSB7CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIGVycik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBnZW5lcmF0ZU1pcG1hcChjLCBsZXZlbCk7Cit9CisKK3ZvaWQgZ2xSZWFkUGl4ZWxzKAorICAgICAgICBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwKKyAgICAgICAgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqcGl4ZWxzKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgaWYgKChmb3JtYXQgIT0gR0xfUkdCQSkgJiYgKGZvcm1hdCAhPSBHTF9SR0IpKSB7CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCh0eXBlICE9IEdMX1VOU0lHTkVEX0JZVEUpICYmICh0eXBlICE9IEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81KSkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICh3aWR0aDwwIHx8IGhlaWdodDwwKSB7CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICh4PDAgfHwgeDwwKSB7CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50MzJfdCBmb3JtYXRJZHggPSBHR0xfUElYRUxfRk9STUFUX05PTkU7CisgICAgaWYgKChmb3JtYXQgPT0gR0xfUkdCQSkgJiYgKHR5cGUgPT0gR0xfVU5TSUdORURfQllURSkpIHsKKyAgICAgICAgZm9ybWF0SWR4ID0gR0dMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODg7CisgICAgfSBlbHNlIGlmICgoZm9ybWF0ID09IEdMX1JHQikgJiYgKHR5cGUgPT0gR0xfVU5TSUdORURfU0hPUlRfNV82XzUpKSB7CisgICAgICAgIGZvcm1hdElkeCA9IEdHTF9QSVhFTF9GT1JNQVRfUkdCXzU2NTsKKyAgICB9IGVsc2UgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBHR0xTdXJmYWNlJiByZWFkU3VyZmFjZSA9IGMtPnJhc3Rlcml6ZXIuc3RhdGUuYnVmZmVycy5yZWFkLnM7CisgICAgaWYgKCh4K3dpZHRoID4gR0xpbnQocmVhZFN1cmZhY2Uud2lkdGgpKSB8fAorICAgICAgICAgICAgKHkraGVpZ2h0ID4gR0xpbnQocmVhZFN1cmZhY2UuaGVpZ2h0KSkpIHsKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBHR0xGb3JtYXQmIHBpeGVsRm9ybWF0KGMtPnJhc3Rlcml6ZXIuZm9ybWF0c1tmb3JtYXRJZHhdKTsKKyAgICBjb25zdCBpbnQzMl90IGFsaWduID0gYy0+dGV4dHVyZXMucGFja0FsaWdubWVudC0xOworICAgIGNvbnN0IGludDMyX3QgYnByID0gKCh3aWR0aCAqIHBpeGVsRm9ybWF0LnNpemUpICsgYWxpZ24pICYgfmFsaWduOworICAgIGNvbnN0IGludDMyX3Qgc3RyaWRlID0gYnByIC8gcGl4ZWxGb3JtYXQuc2l6ZTsKKworICAgIEdHTFN1cmZhY2UgdXNlclN1cmZhY2U7CisgICAgdXNlclN1cmZhY2UudmVyc2lvbiA9IHNpemVvZih1c2VyU3VyZmFjZSk7CisgICAgdXNlclN1cmZhY2Uud2lkdGggID0gd2lkdGg7CisgICAgdXNlclN1cmZhY2UuaGVpZ2h0ID0gaGVpZ2h0OworICAgIHVzZXJTdXJmYWNlLnN0cmlkZSA9IC1zdHJpZGU7IC8vIGJvdHRvbSByb3cgaXMgdHJhbnNmZXJlZCBmaXJzdAorICAgIHVzZXJTdXJmYWNlLmZvcm1hdCA9IGZvcm1hdElkeDsKKyAgICB1c2VyU3VyZmFjZS5jb21wcmVzc2VkRm9ybWF0ID0gMDsKKyAgICB1c2VyU3VyZmFjZS5kYXRhID0gKEdMdWJ5dGUqKXBpeGVsczsKKworICAgIC8vIHVzZSBwaXhlbC1mbGluZ2VyIHRvIGhhbmRsZSBhbGwgdGhlIGNvbnZlcnNpb25zCisgICAgR0dMQ29udGV4dCogZ2dsID0gZ2V0UmFzdGVyaXplcihjKTsKKyAgICBpZiAoIWdnbCkgeworICAgICAgICAvLyB0aGUgb25seSByZWFzb24gdGhpcyB3b3VsZCBmYWlsIGlzIGJlY2F1c2Ugd2UgcmFuIG91dCBvZiBtZW1vcnkKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfT1VUX09GX01FTU9SWSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBnZ2wtPmNvbG9yQnVmZmVyKGdnbCwgJnVzZXJTdXJmYWNlKTsgIC8vIGRlc3RpbmF0aW9uIGlzIHVzZXIgYnVmZmVyIAorICAgIGdnbC0+YmluZFRleHR1cmUoZ2dsLCAmcmVhZFN1cmZhY2UpOyAgLy8gc291cmNlIGlzIHJlYWQtYnVmZmVyCisgICAgZ2dsLT50ZXhDb29yZDJpKGdnbCwgeCwgcmVhZFN1cmZhY2UuaGVpZ2h0IC0gKHkgKyBoZWlnaHQpKTsKKyAgICBnZ2wtPnJlY3RpKGdnbCwgMCwgMCwgd2lkdGgsIGhlaWdodCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZiAwCisjcHJhZ21hIG1hcmsgLQorI3ByYWdtYSBtYXJrIERyYXdUZXh0dXJlIEV4dGVuc2lvbgorI2VuZGlmCisKK3ZvaWQgZ2xEcmF3VGV4c3ZPRVMoY29uc3QgR0xzaG9ydCogY29vcmRzKSB7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBkcmF3VGV4aU9FUyhjb29yZHNbMF0sIGNvb3Jkc1sxXSwgY29vcmRzWzJdLCBjb29yZHNbM10sIGNvb3Jkc1s0XSwgYyk7Cit9Cit2b2lkIGdsRHJhd1RleGl2T0VTKGNvbnN0IEdMaW50KiBjb29yZHMpIHsKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGRyYXdUZXhpT0VTKGNvb3Jkc1swXSwgY29vcmRzWzFdLCBjb29yZHNbMl0sIGNvb3Jkc1szXSwgY29vcmRzWzRdLCBjKTsKK30KK3ZvaWQgZ2xEcmF3VGV4c09FUyhHTHNob3J0IHggLCBHTHNob3J0IHksIEdMc2hvcnQgeiwgR0xzaG9ydCB3LCBHTHNob3J0IGgpIHsKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGRyYXdUZXhpT0VTKHgsIHksIHosIHcsIGgsIGMpOworfQordm9pZCBnbERyYXdUZXhpT0VTKEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHcsIEdMaW50IGgpIHsKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGRyYXdUZXhpT0VTKHgsIHksIHosIHcsIGgsIGMpOworfQorCit2b2lkIGdsRHJhd1RleGZ2T0VTKGNvbnN0IEdMZmxvYXQqIGNvb3JkcykgeworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgZHJhd1RleHhPRVMoCisgICAgICAgICAgICBnZ2xGbG9hdFRvRml4ZWQoY29vcmRzWzBdKSwKKyAgICAgICAgICAgIGdnbEZsb2F0VG9GaXhlZChjb29yZHNbMV0pLAorICAgICAgICAgICAgZ2dsRmxvYXRUb0ZpeGVkKGNvb3Jkc1syXSksCisgICAgICAgICAgICBnZ2xGbG9hdFRvRml4ZWQoY29vcmRzWzNdKSwKKyAgICAgICAgICAgIGdnbEZsb2F0VG9GaXhlZChjb29yZHNbNF0pLAorICAgICAgICAgICAgYyk7Cit9Cit2b2lkIGdsRHJhd1RleHh2T0VTKGNvbnN0IEdMZml4ZWQqIGNvb3JkcykgeworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgZHJhd1RleHhPRVMoY29vcmRzWzBdLCBjb29yZHNbMV0sIGNvb3Jkc1syXSwgY29vcmRzWzNdLCBjb29yZHNbNF0sIGMpOworfQordm9pZCBnbERyYXdUZXhmT0VTKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgdywgR0xmbG9hdCBoKXsKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGRyYXdUZXh4T0VTKAorICAgICAgICAgICAgZ2dsRmxvYXRUb0ZpeGVkKHgpLCBnZ2xGbG9hdFRvRml4ZWQoeSksIGdnbEZsb2F0VG9GaXhlZCh6KSwKKyAgICAgICAgICAgIGdnbEZsb2F0VG9GaXhlZCh3KSwgZ2dsRmxvYXRUb0ZpeGVkKGgpLAorICAgICAgICAgICAgYyk7Cit9Cit2b2lkIGdsRHJhd1RleHhPRVMoR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeiwgR0xmaXhlZCB3LCBHTGZpeGVkIGgpIHsKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGRyYXdUZXh4T0VTKHgsIHksIHosIHcsIGgsIGMpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYmFnbC90ZXh0dXJlLmggYi9vcGVuZ2wvbGliYWdsL3RleHR1cmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzU3OTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2xpYmFnbC90ZXh0dXJlLmgKQEAgLTAsMCArMSw0NSBAQAorLyogbGlicy9vcGVuZ2xlcy90ZXh0dXJlLmgKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaWZuZGVmIEFORFJPSURfT1BFTkdMRVNfVEVYVFVSRV9ICisjZGVmaW5lIEFORFJPSURfT1BFTkdMRVNfVEVYVFVSRV9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPHByaXZhdGUvcGl4ZWxmbGluZ2VyL2dnbF9jb250ZXh0Lmg+CisKKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisKKyNpbmNsdWRlICJjb250ZXh0LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordm9pZCBvZ2xlc19pbml0X3RleHR1cmUob2dsZXNfY29udGV4dF90KiBjKTsKK3ZvaWQgb2dsZXNfdW5pbml0X3RleHR1cmUob2dsZXNfY29udGV4dF90KiBjKTsKK3ZvaWQgb2dsZXNfdmFsaWRhdGVfdGV4dHVyZV9pbXBsKG9nbGVzX2NvbnRleHRfdCogYyk7CisKK2lubGluZSB2b2lkIG9nbGVzX3ZhbGlkYXRlX3RleHR1cmUob2dsZXNfY29udGV4dF90KiBjKSB7CisgICAgaWYgKGMtPnJhc3Rlcml6ZXIuc3RhdGUuZW5hYmxlcyAmIEdHTF9FTkFCTEVfVE1VUykKKyAgICAgICAgb2dsZXNfdmFsaWRhdGVfdGV4dHVyZV9pbXBsKGMpOworfQorCisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX09QRU5HTEVTX1RFWFRVUkVfSApkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYmFnbC92ZXJ0ZXguY3BwIGIvb3BlbmdsL2xpYmFnbC92ZXJ0ZXguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZDA0ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvbGliYWdsL3ZlcnRleC5jcHAKQEAgLTAsMCArMSwyNDcgQEAKKy8qIGxpYnMvb3BlbmdsZXMvdmVydGV4LmNwcAorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImNvbnRleHQuaCIKKyNpbmNsdWRlICJmcC5oIgorI2luY2x1ZGUgInZlcnRleC5oIgorI2luY2x1ZGUgInN0YXRlLmgiCisjaW5jbHVkZSAibWF0cml4LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIG9nbGVzX2luaXRfdmVydGV4KG9nbGVzX2NvbnRleHRfdCogYykKK3sKKyAgICBjLT5jdWxsLmVuYWJsZSA9IEdMX0ZBTFNFOworICAgIGMtPmN1bGwuY3VsbEZhY2UgPSBHTF9CQUNLOworICAgIGMtPmN1bGwuZnJvbnRGYWNlID0gR0xfQ0NXOworCisgICAgYy0+Y3VycmVudC5jb2xvci5yID0gMHgxMDAwMDsKKyAgICBjLT5jdXJyZW50LmNvbG9yLmcgPSAweDEwMDAwOworICAgIGMtPmN1cnJlbnQuY29sb3IuYiA9IDB4MTAwMDA7CisgICAgYy0+Y3VycmVudC5jb2xvci5hID0gMHgxMDAwMDsKKworICAgIGMtPmN1cnJlbnROb3JtYWwueiA9IDB4MTAwMDA7Cit9CisKK3ZvaWQgb2dsZXNfdW5pbml0X3ZlcnRleChvZ2xlc19jb250ZXh0X3QqIGMpCit7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHZlcnRleCBwcm9jZXNzaW5nCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIERpdmlkZXMgYSB2ZXJ0ZXggY2xpcCBjb29yZGluYXRlcyBieSBXCitzdGF0aWMgaW5saW5lCit2b2lkIHBlcnNwZWN0aXZlKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYsIHVpbnQzMl90IGVuYWJsZXMpCit7CisgICAgLy8gW3gseSx6XXdpbmRvdyA9IHZwdCAqIChbeCx5LHpdY2xpcCAvIGNsaXAudykKKyAgICAvLyBbd113aW5kb3cgPSAxL3cKKworICAgIC8vIFdpdGggYSByZWd1bGFyIHByb2plY3Rpb24gZ2VuZXJhdGVkIGJ5IGdsRnJ1c3R1bSgpLAorICAgIC8vIHdlIGhhdmUgdz0teiwgdGhlcmVmb3JlLCB3IGlzIGluIFt6TmVhciwgekZhcl0uCisgICAgLy8gQWxzbywgek5lYXIgYW5kIHpGYXIgYXJlIHN0cmljbHkgcG9zaXRpdmUsCisgICAgLy8gYW5kIDEvdyAod2luZG93LncpIGlzIGluIFsxL3pGYXIsIDEvek5lYXJdLCB1c3VhbGx5IHRoaXMKKyAgICAvLyBtZWFucyBdMCwgK2luZlsgLS0gaG93ZXZlciwgaXQgaXMgYWx3YXlzIHJlY29tbWVuZGVkCisgICAgLy8gdG8gdXNlIGFzIGxhcmdlIHZhbHVlcyBhcyBwb3NzaWJsZSBmb3Igek5lYXIuCisgICAgLy8gQWxsIGluIGFsbCwgdyBpcyB1c3VhbGx5IHNtYWxsZXIgdGhhbiAxLjAgKGFzc3VtaW5nCisgICAgLy8gek5lYXIgaXMgYXQgbGVhc3QgMS4wKTsgYW5kIGV2ZW4gaWYgek5lYXIgaXMgc21hbGxlciB0aGFuIDEuMAorICAgIC8vIHZhbHVlcyBvZiB3IHdvbid0IGJlIHRvbyBiaWcuCisKKyAgICBjb25zdCBpbnQzMl90IHJ3ID0gZ2dsUmVjaXAyOCh2LT5jbGlwLncpOworICAgIGNvbnN0IEdMZml4ZWQqIGNvbnN0IG0gPSBjLT50cmFuc2Zvcm1zLnZwdC50cmFuc2Zvcm0ubWF0cml4Lm07CisgICAgdi0+d2luZG93LncgPSBydzsKKyAgICB2LT53aW5kb3cueCA9IGdnbE11bEFkZHgoZ2dsTXVseCh2LT5jbGlwLngsIHJ3LCAxNiksIG1bIDBdLCBtWzEyXSwgMjgpOyAKKyAgICB2LT53aW5kb3cueSA9IGdnbE11bEFkZHgoZ2dsTXVseCh2LT5jbGlwLnksIHJ3LCAxNiksIG1bIDVdLCBtWzEzXSwgMjgpOworICAgIHYtPndpbmRvdy54ID0gVFJJX0ZST01fRklYRUQodi0+d2luZG93LngpOworICAgIHYtPndpbmRvdy55ID0gVFJJX0ZST01fRklYRUQodi0+d2luZG93LnkpOworICAgIGlmIChlbmFibGVzICYgR0dMX0VOQUJMRV9ERVBUSF9URVNUKSB7CisgICAgICAgIHYtPndpbmRvdy56ID0gZ2dsTXVsQWRkeChnZ2xNdWx4KHYtPmNsaXAueiwgcncsIDE2KSwgbVsxMF0sIG1bMTRdLCAyOCk7CisgICAgfQorfQorCisvLyBmcnVzdHVtIGNsaXBwaW5nIGFuZCBXLWRpdmlkZQorc3RhdGljIGlubGluZQordm9pZCBjbGlwRnJ1c3R1bVBlcnNwZWN0aXZlKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYsIHVpbnQzMl90IGVuYWJsZXMpCit7CisgICAgLy8gbmRjID0gY2xpcCAvIFcKKyAgICAvLyB3aW5kb3cgPSBuY2QgKiB2aWV3cG9ydAorICAgIAorICAgIC8vIGNsaXAgdG8gdGhlIHZpZXctdm9sdW1lCisgICAgdWludDMyX3QgY2xpcCA9IHYtPmZsYWdzICYgdmVydGV4X3Q6OkNMSVBfQUxMOworICAgIGNvbnN0IEdMZml4ZWQgdyA9IHYtPmNsaXAudzsKKyAgICBpZiAodi0+Y2xpcC54IDwgLXcpICAgY2xpcCB8PSB2ZXJ0ZXhfdDo6Q0xJUF9MOworICAgIGlmICh2LT5jbGlwLnggPiAgdykgICBjbGlwIHw9IHZlcnRleF90OjpDTElQX1I7CisgICAgaWYgKHYtPmNsaXAueSA8IC13KSAgIGNsaXAgfD0gdmVydGV4X3Q6OkNMSVBfQjsKKyAgICBpZiAodi0+Y2xpcC55ID4gIHcpICAgY2xpcCB8PSB2ZXJ0ZXhfdDo6Q0xJUF9UOworICAgIGlmICh2LT5jbGlwLnogPCAtdykgICBjbGlwIHw9IHZlcnRleF90OjpDTElQX047CisgICAgaWYgKHYtPmNsaXAueiA+ICB3KSAgIGNsaXAgfD0gdmVydGV4X3Q6OkNMSVBfRjsKKworICAgIHYtPmZsYWdzIHw9IGNsaXA7CisgICAgYy0+YXJyYXlzLmN1bGwgJj0gY2xpcDsKKworICAgIGlmIChnZ2xfbGlrZWx5KCFjbGlwKSkgeworICAgICAgICAvLyBpZiB0aGUgdmVydGV4IGlzIGNsaXBwZWQsIHdlIGRvbid0IGRvIHRoZSBwZXJzcGVjdGl2ZQorICAgICAgICAvLyBkaXZpZGUsIHNpbmNlIHdlIGRvbid0IG5lZWQgaXRzIHdpbmRvdyBjb29yZGluYXRlcy4KKyAgICAgICAgcGVyc3BlY3RpdmUoYywgdiwgZW5hYmxlcyk7CisgICAgfQorfQorCisvLyBmcnVzdHVtIGNsaXBwaW5nLCB1c2VyIGNsaXBwaW5nIGFuZCBXLWRpdmlkZQorc3RhdGljIGlubGluZQordm9pZCBjbGlwQWxsUGVyc3BlY3RpdmUob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogdiwgdWludDMyX3QgZW5hYmxlcykKK3sKKyAgICAvLyBjb21wdXRlIGV5ZSBjb29yZGluYXRlcworICAgIGMtPmFycmF5cy5tdl90cmFuc2Zvcm0oCisgICAgICAgICAgICAmYy0+dHJhbnNmb3Jtcy5tb2RlbHZpZXcudHJhbnNmb3JtLCAmdi0+ZXllLCAmdi0+b2JqKTsKKyAgICB2LT5mbGFncyB8PSB2ZXJ0ZXhfdDo6RVlFOworCisgICAgLy8gY2xpcCB0aGlzIHZlcnRleCBhZ2FpbnN0IGVhY2ggdXNlciBjbGlwIHBsYW5lCisgICAgdWludDMyX3QgY2xpcCA9IDA7CisgICAgaW50IHBsYW5lcyA9IGMtPmNsaXBQbGFuZXMuZW5hYmxlOworICAgIHdoaWxlIChwbGFuZXMpIHsKKyAgICAgICAgY29uc3QgaW50IGkgPSAzMSAtIGdnbENseihwbGFuZXMpOworICAgICAgICBwbGFuZXMgJj0gfigxPDxpKTsKKyAgICAgICAgLy8gWFhYOiB3ZSBzaG91bGQgaGF2ZSBhIHNwZWNpYWwgZG90KCkgZm9yIDIsMyw0IGNvb3JkcyB2ZXJ0aWNlcworICAgICAgICBHTGZpeGVkIGQgPSBkb3Q0KGMtPmNsaXBQbGFuZXMucGxhbmVbaV0uZXF1YXRpb24udiwgdi0+ZXllLnYpOworICAgICAgICBpZiAoZCA8IDApIHsKKyAgICAgICAgICAgIGNsaXAgfD0gMHgxMDA8PGk7CisgICAgICAgIH0KKyAgICB9CisgICAgdi0+ZmxhZ3MgfD0gY2xpcDsKKworICAgIGNsaXBGcnVzdHVtUGVyc3BlY3RpdmUoYywgdiwgZW5hYmxlcyk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBvZ2xlc192ZXJ0ZXhfcHJvamVjdChvZ2xlc19jb250ZXh0X3QqIGMsIHZlcnRleF90KiB2KSB7CisgICAgcGVyc3BlY3RpdmUoYywgdiwgYy0+cmFzdGVyaXplci5zdGF0ZS5lbmFibGVzKTsKK30KKwordm9pZCBvZ2xlc192ZXJ0ZXhfcGVyc3BlY3RpdmUyRChvZ2xlc19jb250ZXh0X3QqIGMsIHZlcnRleF90KiB2KQoreworICAgIC8vIGhlcmUgd2UgYXNzdW1lIHc9MS4wIGFuZCB0aGUgdmlld3BvcnQgdHJhbnNmb3JtYXRpb24KKyAgICAvLyBoYXMgYmVlbiBhcHBsaWVkIGFscmVhZHkuCisgICAgYy0+YXJyYXlzLmN1bGwgPSAwOworICAgIHYtPndpbmRvdy54ID0gVFJJX0ZST01fRklYRUQodi0+Y2xpcC54KTsKKyAgICB2LT53aW5kb3cueSA9IFRSSV9GUk9NX0ZJWEVEKHYtPmNsaXAueSk7CisgICAgdi0+d2luZG93LnogPSB2LT5jbGlwLno7CisgICAgdi0+d2luZG93LncgPSB2LT5jbGlwLncgPDwgMTI7Cit9CisKK3ZvaWQgb2dsZXNfdmVydGV4X3BlcnNwZWN0aXZlM0RaKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYpIHsKKyAgICBjbGlwRnJ1c3R1bVBlcnNwZWN0aXZlKGMsIHYsIEdHTF9FTkFCTEVfREVQVEhfVEVTVCk7Cit9Cit2b2lkIG9nbGVzX3ZlcnRleF9wZXJzcGVjdGl2ZTNEKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYpIHsKKyAgICBjbGlwRnJ1c3R1bVBlcnNwZWN0aXZlKGMsIHYsIDApOworfQordm9pZCBvZ2xlc192ZXJ0ZXhfY2xpcEFsbFBlcnNwZWN0aXZlM0RaKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYpIHsKKyAgICBjbGlwQWxsUGVyc3BlY3RpdmUoYywgdiwgR0dMX0VOQUJMRV9ERVBUSF9URVNUKTsKK30KK3ZvaWQgb2dsZXNfdmVydGV4X2NsaXBBbGxQZXJzcGVjdGl2ZTNEKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYpIHsKKyAgICBjbGlwQWxsUGVyc3BlY3RpdmUoYywgdiwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGNsaXBQbGFuZXgoR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZpeGVkKiBlcXUsIG9nbGVzX2NvbnRleHRfdCogYykKK3sKKyAgICBjb25zdCBpbnQgcCA9IHBsYW5lIC0gR0xfQ0xJUF9QTEFORTA7CisgICAgaWYgKGdnbF91bmxpa2VseSh1aW50MzJfdChwKSA+IChHTF9DTElQX1BMQU5FNSAtIEdMX0NMSVBfUExBTkUwKSkpIHsKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHZlYzRfdCYgZXF1YXRpb24gPSBjLT5jbGlwUGxhbmVzLnBsYW5lW3BdLmVxdWF0aW9uOworICAgIG1lbWNweShlcXVhdGlvbi52LCBlcXUsIHNpemVvZih2ZWM0X3QpKTsKKworICAgIG9nbGVzX3ZhbGlkYXRlX3RyYW5zZm9ybShjLCB0cmFuc2Zvcm1fc3RhdGVfdDo6TVZJVCk7CisgICAgdHJhbnNmb3JtX3QmIG12aXQgPSBjLT50cmFuc2Zvcm1zLm12aXQ0OworICAgIG12aXQucG9pbnQ0KCZtdml0LCAmZXF1YXRpb24sICZlcXVhdGlvbik7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCisKK3ZvaWQgZ2xDb2xvcjRmKEdMZmxvYXQgciwgR0xmbG9hdCBnLCBHTGZsb2F0IGIsIEdMZmxvYXQgYSkKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGMtPmN1cnJlbnQuY29sb3IuciAgICAgICA9IGdnbEZsb2F0VG9GaXhlZChyKTsKKyAgICBjLT5jdXJyZW50Q29sb3JDbGFtcGVkLnIgPSBnZ2xDbGFtcHgoYy0+Y3VycmVudC5jb2xvci5yKTsKKyAgICBjLT5jdXJyZW50LmNvbG9yLmcgICAgICAgPSBnZ2xGbG9hdFRvRml4ZWQoZyk7CisgICAgYy0+Y3VycmVudENvbG9yQ2xhbXBlZC5nID0gZ2dsQ2xhbXB4KGMtPmN1cnJlbnQuY29sb3IuZyk7CisgICAgYy0+Y3VycmVudC5jb2xvci5iICAgICAgID0gZ2dsRmxvYXRUb0ZpeGVkKGIpOworICAgIGMtPmN1cnJlbnRDb2xvckNsYW1wZWQuYiA9IGdnbENsYW1weChjLT5jdXJyZW50LmNvbG9yLmIpOworICAgIGMtPmN1cnJlbnQuY29sb3IuYSAgICAgICA9IGdnbEZsb2F0VG9GaXhlZChhKTsKKyAgICBjLT5jdXJyZW50Q29sb3JDbGFtcGVkLmEgPSBnZ2xDbGFtcHgoYy0+Y3VycmVudC5jb2xvci5hKTsKK30KKwordm9pZCBnbENvbG9yNHgoR0xmaXhlZCByLCBHTGZpeGVkIGcsIEdMZml4ZWQgYiwgR0xmaXhlZCBhKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgYy0+Y3VycmVudC5jb2xvci5yID0gcjsKKyAgICBjLT5jdXJyZW50LmNvbG9yLmcgPSBnOworICAgIGMtPmN1cnJlbnQuY29sb3IuYiA9IGI7CisgICAgYy0+Y3VycmVudC5jb2xvci5hID0gYTsKKyAgICBjLT5jdXJyZW50Q29sb3JDbGFtcGVkLnIgPSBnZ2xDbGFtcHgocik7CisgICAgYy0+Y3VycmVudENvbG9yQ2xhbXBlZC5nID0gZ2dsQ2xhbXB4KGcpOworICAgIGMtPmN1cnJlbnRDb2xvckNsYW1wZWQuYiA9IGdnbENsYW1weChiKTsKKyAgICBjLT5jdXJyZW50Q29sb3JDbGFtcGVkLmEgPSBnZ2xDbGFtcHgoYSk7Cit9CisKK3ZvaWQgZ2xOb3JtYWwzZihHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgYy0+Y3VycmVudE5vcm1hbC54ID0gZ2dsRmxvYXRUb0ZpeGVkKHgpOworICAgIGMtPmN1cnJlbnROb3JtYWwueSA9IGdnbEZsb2F0VG9GaXhlZCh5KTsKKyAgICBjLT5jdXJyZW50Tm9ybWFsLnogPSBnZ2xGbG9hdFRvRml4ZWQoeik7Cit9CisKK3ZvaWQgZ2xOb3JtYWwzeChHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgYy0+Y3VycmVudE5vcm1hbC54ID0geDsKKyAgICBjLT5jdXJyZW50Tm9ybWFsLnkgPSB5OworICAgIGMtPmN1cnJlbnROb3JtYWwueiA9IHo7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBnbENsaXBQbGFuZWYoR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZsb2F0KiBlcXUpCit7CisgICAgY29uc3QgR0xmaXhlZCBlcXV4WzRdID0geworICAgICAgICAgICAgZ2dsRmxvYXRUb0ZpeGVkKGVxdVswXSksCisgICAgICAgICAgICBnZ2xGbG9hdFRvRml4ZWQoZXF1WzFdKSwKKyAgICAgICAgICAgIGdnbEZsb2F0VG9GaXhlZChlcXVbMl0pLAorICAgICAgICAgICAgZ2dsRmxvYXRUb0ZpeGVkKGVxdVszXSkKKyAgICB9OworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgY2xpcFBsYW5leChwbGFuZSwgZXF1eCwgYyk7Cit9CisKK3ZvaWQgZ2xDbGlwUGxhbmV4KEdMZW51bSBwbGFuZSwgY29uc3QgR0xmaXhlZCogZXF1KQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgY2xpcFBsYW5leChwbGFuZSwgZXF1LCBjKTsKK30KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvdmVydGV4LmggYi9vcGVuZ2wvbGliYWdsL3ZlcnRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ZTYyMTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvbGliYWdsL3ZlcnRleC5oCkBAIC0wLDAgKzEsNDggQEAKKy8qIGxpYnMvb3BlbmdsZXMvdmVydGV4LmgKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaWZuZGVmIEFORFJPSURfT1BFTkdMRVNfVkVSVEVYX0gKKyNkZWZpbmUgQU5EUk9JRF9PUEVOR0xFU19WRVJURVhfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIGdsIHsKK3N0cnVjdCB2ZXJ0ZXhfdDsKK3N0cnVjdCBvZ2xlc19jb250ZXh0X3Q7Cit9OworCit2b2lkIG9nbGVzX2luaXRfdmVydGV4KG9nbGVzX2NvbnRleHRfdCogYyk7Cit2b2lkIG9nbGVzX3VuaW5pdF92ZXJ0ZXgob2dsZXNfY29udGV4dF90KiBjKTsKKwordm9pZCBvZ2xlc192ZXJ0ZXhfcGVyc3BlY3RpdmUyRChvZ2xlc19jb250ZXh0X3QqLCB2ZXJ0ZXhfdCopOworCit2b2lkIG9nbGVzX3ZlcnRleF9wZXJzcGVjdGl2ZTNEKG9nbGVzX2NvbnRleHRfdCosIHZlcnRleF90Kik7Cit2b2lkIG9nbGVzX3ZlcnRleF9wZXJzcGVjdGl2ZTNEWihvZ2xlc19jb250ZXh0X3QqLCB2ZXJ0ZXhfdCopOwordm9pZCBvZ2xlc192ZXJ0ZXhfY2xpcEFsbFBlcnNwZWN0aXZlM0Qob2dsZXNfY29udGV4dF90KiwgdmVydGV4X3QqKTsKK3ZvaWQgb2dsZXNfdmVydGV4X2NsaXBBbGxQZXJzcGVjdGl2ZTNEWihvZ2xlc19jb250ZXh0X3QqLCB2ZXJ0ZXhfdCopOworCisKK3ZvaWQgb2dsZXNfdmVydGV4X3Byb2plY3Qob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCopOworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9PUEVOR0xFU19WRVJURVhfSAorCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGlicy9BbmRyb2lkLm1rIGIvb3BlbmdsL2xpYnMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWNjNzc2Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2xpYnMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDUzIEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworIworIyBCdWlsZCBNRVRBIEVHTCBsaWJyYXJ5CisjCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSAJXAorCUVHTC9lZ2wuY3BwIAkJXAorCUVHTC9ncHUuY3BwCQkJXAorIworCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmN1dGlscyBsaWJ1dGlscyBsaWJ1aQorTE9DQUxfTERMSUJTIDo9IC1scHRocmVhZCAtbGRsCitMT0NBTF9NT0RVTEU6PSBsaWJFR0wKKworIyBuZWVkZWQgb24gc2ltIGJ1aWxkIGJlY2F1c2Ugb2Ygd2VpcmQgbG9nZ2luZyBpc3N1ZXMKK2lmZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKK2Vsc2UKKyAgICBMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmRsCisgICAgIyB3ZSBuZWVkIHRvIGFjY2VzcyB0aGUgQmlvbmljIHByaXZhdGUgaGVhZGVyIDxiaW9uaWNfdGxzLmg+CisgICAgTE9DQUxfQ0ZMQUdTICs9IC1JJChMT0NBTF9QQVRIKS8uLi8uLi8uLi8uLi9iaW9uaWMvbGliYy9wcml2YXRlCitlbmRpZgorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKKworCisjCisjIEJ1aWxkIHRoZSB3cmFwcGVyIE9wZW5HTCBFUyBsaWJyYXJ5CisjCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSAJXAorCUdMRVNfQ00vZ2wuY3BwLmFybSAJCVwKKwlHTEVTX0NNL2dsX2xvZ2dlci5jcHAgCVwKKyMKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJjdXRpbHMgbGlidXRpbHMgbGlidWkgbGliRUdMCitMT0NBTF9MRExJQlMgOj0gLWxwdGhyZWFkIC1sZGwKK0xPQ0FMX01PRFVMRTo9IGxpYkdMRVN2MV9DTQorCisjIG5lZWRlZCBvbiBzaW0gYnVpbGQgYmVjYXVzZSBvZiB3ZWlyZCBsb2dnaW5nIGlzc3VlcworaWZlcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQorZWxzZQorICAgIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZGwKKyAgICAjIHdlIG5lZWQgdG8gYWNjZXNzIHRoZSBCaW9uaWMgcHJpdmF0ZSBoZWFkZXIgPGJpb25pY190bHMuaD4KKyAgICBMT0NBTF9DRkxBR1MgKz0gLUkkKExPQ0FMX1BBVEgpLy4uLy4uLy4uLy4uL2Jpb25pYy9saWJjL3ByaXZhdGUKK2VuZGlmCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL0VHTC9lZ2wuY3BwIGIvb3BlbmdsL2xpYnMvRUdML2VnbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg3YzhiYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC9saWJzL0VHTC9lZ2wuY3BwCkBAIC0wLDAgKzEsMTM2MyBAQAorLyogCisgKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqKgorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyAqKgorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisgKioKKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiR0xMb2dnZXIiCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZGxmY24uaD4KKworI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorCisjaWYgSEFWRV9BTkRST0lEX09TCisjaW5jbHVkZSA8bGludXgvYW5kcm9pZF9wbWVtLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPEVHTC9lZ2wuaD4KKyNpbmNsdWRlIDxFR0wvZWdsZXh0Lmg+CisjaW5jbHVkZSA8R0xFUy9nbC5oPgorI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KKworI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KKyNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbWVtb3J5Lmg+CisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKKyNpbmNsdWRlICJob29rcy5oIgorI2luY2x1ZGUgImVnbF9pbXBsLmgiCisKKworI2RlZmluZSBNQUtFX0NPTkZJRyhfaW1wbCwgX2luZGV4KSAgKChFR0xDb25maWcpKCgoX2ltcGwpPDwyNCkgfCAoX2luZGV4KSkpCisjZGVmaW5lIHNldEVycm9yKF9lLCBfcikgc2V0RXJyb3JFdGMoX19GVU5DVElPTl9fLCBfX0xJTkVfXywgX2UsIF9yKQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCituYW1lc3BhY2UgYW5kcm9pZCB7CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgVkVSU0lPTl9NQUpPUiAxCisjZGVmaW5lIFZFUlNJT05fTUlOT1IgNAorc3RhdGljIGNoYXIgY29uc3QgKiBjb25zdCBnVmVuZG9yU3RyaW5nICAgICA9ICJBbmRyb2lkIjsKK3N0YXRpYyBjaGFyIGNvbnN0ICogY29uc3QgZ1ZlcnNpb25TdHJpbmcgICAgPSAiMS4zMSBBbmRyb2lkIE1FVEEtRUdMIjsKK3N0YXRpYyBjaGFyIGNvbnN0ICogY29uc3QgZ0NsaWVudEFwaVN0cmluZyAgPSAiT3BlbkdMIEVTIjsKK3N0YXRpYyBjaGFyIGNvbnN0ICogY29uc3QgZ0V4dGVuc2lvblN0cmluZyAgPSAiIjsKKwordGVtcGxhdGUgPGludCBNQUdJQz4KK3N0cnVjdCBlZ2xfb2JqZWN0X3QKK3sKKyAgICBlZ2xfb2JqZWN0X3QoKSA6IG1hZ2ljKE1BR0lDKSB7IH0KKyAgICB+ZWdsX29iamVjdF90KCkgeyBtYWdpYyA9IDA7IH0KKyAgICBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiBtYWdpYyA9PSBNQUdJQzsgfQorcHJpdmF0ZToKKyAgICB1aW50MzJfdCAgICBtYWdpYzsKK307CisKK3N0cnVjdCBlZ2xfZGlzcGxheV90IDogcHVibGljIGVnbF9vYmplY3RfdDwnX2RweSc+Cit7CisgICAgRUdMRGlzcGxheSAgZHB5c1syXTsKKyAgICBFR0xDb25maWcqICBjb25maWdzWzJdOworICAgIEVHTGludCAgICAgIG51bUNvbmZpZ3NbMl07CisgICAgRUdMaW50ICAgICAgbnVtVG90YWxDb25maWdzOworICAgIGNoYXIgY29uc3QqIGV4dGVuc2lvbnNTdHJpbmc7CisgICAgdm9sYXRpbGUgaW50MzJfdCByZWZzOworICAgIHN0cnVjdCBzdHJpbmdzX3QgeworICAgICAgICBjaGFyIGNvbnN0ICogdmVuZG9yOworICAgICAgICBjaGFyIGNvbnN0ICogdmVyc2lvbjsKKyAgICAgICAgY2hhciBjb25zdCAqIGNsaWVudEFwaTsKKyAgICAgICAgY2hhciBjb25zdCAqIGV4dGVuc2lvbnM7CisgICAgfTsKKyAgICBzdHJpbmdzX3QgICBxdWVyeVN0cmluZ1syXTsKK307CisKK3N0cnVjdCBlZ2xfc3VyZmFjZV90IDogcHVibGljIGVnbF9vYmplY3RfdDwnX3NyZic+Cit7CisgICAgZWdsX3N1cmZhY2VfdChFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmYWNlLAorICAgICAgICAgICAgTmF0aXZlV2luZG93VHlwZSB3aW5kb3csIGludCBpbXBsLCBlZ2xfY29ubmVjdGlvbl90IGNvbnN0KiBjbngpIAorICAgIDogZHB5KGRweSksIHN1cmZhY2Uoc3VyZmFjZSksIHdpbmRvdyh3aW5kb3cpLCBpbXBsKGltcGwpLCBjbngoY254KQorICAgIHsKKyAgICAgICAgLy8gTk9URTogd2luZG93IG11c3QgYmUgaW5jUmVmJ2VkIGFuZCBjb25uZWN0ZWQgYWxyZWFkeQorICAgIH0KKyAgICB+ZWdsX3N1cmZhY2VfdCgpIHsKKyAgICAgICAgaWYgKHdpbmRvdykgeworICAgICAgICAgICAgaWYgKHdpbmRvdy0+ZGlzY29ubmVjdCkKKyAgICAgICAgICAgICAgICB3aW5kb3ctPmRpc2Nvbm5lY3Qod2luZG93KTsKKyAgICAgICAgICAgIHdpbmRvdy0+ZGVjUmVmKHdpbmRvdyk7CisgICAgICAgIH0KKyAgICB9CisgICAgRUdMRGlzcGxheSAgICAgICAgICAgICAgICAgIGRweTsKKyAgICBFR0xTdXJmYWNlICAgICAgICAgICAgICAgICAgc3VyZmFjZTsKKyAgICBOYXRpdmVXaW5kb3dUeXBlICAgICAgICAgICAgd2luZG93OworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsOworICAgIGVnbF9jb25uZWN0aW9uX3QgY29uc3QqICAgICBjbng7Cit9OworCitzdHJ1Y3QgZWdsX2NvbnRleHRfdCA6IHB1YmxpYyBlZ2xfb2JqZWN0X3Q8J19jdHgnPgoreworICAgIGVnbF9jb250ZXh0X3QoRUdMRGlzcGxheSBkcHksIEVHTENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgIGludCBpbXBsLCBlZ2xfY29ubmVjdGlvbl90IGNvbnN0KiBjbngpIAorICAgIDogZHB5KGRweSksIGNvbnRleHQoY29udGV4dCksIHJlYWQoMCksIGRyYXcoMCksIGltcGwoaW1wbCksIGNueChjbngpCisgICAgeworICAgIH0KKyAgICBFR0xEaXNwbGF5ICAgICAgICAgICAgICAgICAgZHB5OworICAgIEVHTENvbnRleHQgICAgICAgICAgICAgICAgICBjb250ZXh0OworICAgIEVHTFN1cmZhY2UgICAgICAgICAgICAgICAgICByZWFkOworICAgIEVHTFN1cmZhY2UgICAgICAgICAgICAgICAgICBkcmF3OworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsOworICAgIGVnbF9jb25uZWN0aW9uX3QgY29uc3QqICAgICBjbng7Cit9OworCitzdHJ1Y3QgdGxzX3QKK3sKKyAgICB0bHNfdCgpIDogZXJyb3IoRUdMX1NVQ0NFU1MpLCBjdHgoMCkgeyB9CisgICAgRUdMaW50ICAgICAgZXJyb3I7CisgICAgRUdMQ29udGV4dCAgY3R4OworfTsKKworc3RhdGljIHZvaWQgZ2xfdW5pbXBsZW1lbnRlZCgpIHsKKyAgICBMT0dFKCJjYWxsZWQgdW5pbXBsZW1lbnRlZCBPcGVuR0wgRVMgQVBJIik7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEdMIC8gRUdMIGhvb2tzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyN1bmRlZiBHTF9FTlRSWQorI3VuZGVmIEVHTF9FTlRSWQorI2RlZmluZSBHTF9FTlRSWShfciwgX2FwaSwgLi4uKSAjX2FwaSwKKyNkZWZpbmUgRUdMX0VOVFJZKF9yLCBfYXBpLCAuLi4pICNfYXBpLAorCitzdGF0aWMgY2hhciBjb25zdCAqIGNvbnN0IGdsX25hbWVzW10gPSB7CisgICAgI2luY2x1ZGUgImdsX2VudHJpZXMuaW4iCisgICAgTlVMTAorfTsKKworc3RhdGljIGNoYXIgY29uc3QgKiBjb25zdCBlZ2xfbmFtZXNbXSA9IHsKKyAgICAjaW5jbHVkZSAiZWdsX2VudHJpZXMuaW4iCisgICAgTlVMTAorfTsKKworI3VuZGVmIEdMX0VOVFJZCisjdW5kZWYgRUdMX0VOVFJZCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZWdsX2Nvbm5lY3Rpb25fdCBnRUdMSW1wbFsyXTsKK3N0YXRpYyBlZ2xfZGlzcGxheV90IGdEaXNwbGF5W05VTV9ESVNQTEFZU107CitzdGF0aWMgcHRocmVhZF9tdXRleF90IGdUaHJlYWRMb2NhbFN0b3JhZ2VLZXlNdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CitzdGF0aWMgcHRocmVhZF9rZXlfdCBnRUdMVGhyZWFkTG9jYWxTdG9yYWdlS2V5ID0gLTE7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZ2xfaG9va3NfdCBnSG9va3NbSU1QTF9OVU1fSU1QTEVNRU5UQVRJT05TXTsKK3B0aHJlYWRfa2V5X3QgZ0dMV3JhcHBlcktleSA9IC0xOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpCitjb25zdCBjaGFyICplZ2xfc3RyZXJyb3IoRUdMaW50IGVycikKK3sKKyAgICBzd2l0Y2ggKGVycil7CisgICAgICAgIGNhc2UgRUdMX1NVQ0NFU1M6ICAgICAgICAgICAgICAgcmV0dXJuICJFR0xfU1VDQ0VTUyI7CisgICAgICAgIGNhc2UgRUdMX05PVF9JTklUSUFMSVpFRDogICAgICAgcmV0dXJuICJFR0xfTk9UX0lOSVRJQUxJWkVEIjsKKyAgICAgICAgY2FzZSBFR0xfQkFEX0FDQ0VTUzogICAgICAgICAgICByZXR1cm4gIkVHTF9CQURfQUNDRVNTIjsKKyAgICAgICAgY2FzZSBFR0xfQkFEX0FMTE9DOiAgICAgICAgICAgICByZXR1cm4gIkVHTF9CQURfQUxMT0MiOworICAgICAgICBjYXNlIEVHTF9CQURfQVRUUklCVVRFOiAgICAgICAgIHJldHVybiAiRUdMX0JBRF9BVFRSSUJVVEUiOworICAgICAgICBjYXNlIEVHTF9CQURfQ09ORklHOiAgICAgICAgICAgIHJldHVybiAiRUdMX0JBRF9DT05GSUciOworICAgICAgICBjYXNlIEVHTF9CQURfQ09OVEVYVDogICAgICAgICAgIHJldHVybiAiRUdMX0JBRF9DT05URVhUIjsKKyAgICAgICAgY2FzZSBFR0xfQkFEX0NVUlJFTlRfU1VSRkFDRTogICByZXR1cm4gIkVHTF9CQURfQ1VSUkVOVF9TVVJGQUNFIjsKKyAgICAgICAgY2FzZSBFR0xfQkFEX0RJU1BMQVk6ICAgICAgICAgICByZXR1cm4gIkVHTF9CQURfRElTUExBWSI7CisgICAgICAgIGNhc2UgRUdMX0JBRF9NQVRDSDogICAgICAgICAgICAgcmV0dXJuICJFR0xfQkFEX01BVENIIjsKKyAgICAgICAgY2FzZSBFR0xfQkFEX05BVElWRV9QSVhNQVA6ICAgICByZXR1cm4gIkVHTF9CQURfTkFUSVZFX1BJWE1BUCI7CisgICAgICAgIGNhc2UgRUdMX0JBRF9OQVRJVkVfV0lORE9XOiAgICAgcmV0dXJuICJFR0xfQkFEX05BVElWRV9XSU5ET1ciOworICAgICAgICBjYXNlIEVHTF9CQURfUEFSQU1FVEVSOiAgICAgICAgIHJldHVybiAiRUdMX0JBRF9QQVJBTUVURVIiOworICAgICAgICBjYXNlIEVHTF9CQURfU1VSRkFDRTogICAgICAgICAgIHJldHVybiAiRUdMX0JBRF9TVVJGQUNFIjsKKyAgICAgICAgY2FzZSBFR0xfQ09OVEVYVF9MT1NUOiAgICAgICAgICByZXR1cm4gIkVHTF9DT05URVhUX0xPU1QiOworICAgICAgICBkZWZhdWx0OiByZXR1cm4gIlVOS05PV04iOworICAgIH0KK30KKworc3RhdGljIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSkKK3ZvaWQgY2xlYXJUTFMoKSB7CisgICAgaWYgKGdFR0xUaHJlYWRMb2NhbFN0b3JhZ2VLZXkgIT0gLTEpIHsKKyAgICAgICAgdGxzX3QqIHRscyA9ICh0bHNfdCopcHRocmVhZF9nZXRzcGVjaWZpYyhnRUdMVGhyZWFkTG9jYWxTdG9yYWdlS2V5KTsKKyAgICAgICAgaWYgKHRscykgeworICAgICAgICAgICAgZGVsZXRlIHRsczsKKyAgICAgICAgICAgIHB0aHJlYWRfc2V0c3BlY2lmaWMoZ0VHTFRocmVhZExvY2FsU3RvcmFnZUtleSwgMCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB0bHNfdCogZ2V0VExTKCkKK3sKKyAgICB0bHNfdCogdGxzID0gKHRsc190KilwdGhyZWFkX2dldHNwZWNpZmljKGdFR0xUaHJlYWRMb2NhbFN0b3JhZ2VLZXkpOworICAgIGlmICh0bHMgPT0gMCkgeworICAgICAgICB0bHMgPSBuZXcgdGxzX3Q7CisgICAgICAgIHB0aHJlYWRfc2V0c3BlY2lmaWMoZ0VHTFRocmVhZExvY2FsU3RvcmFnZUtleSwgdGxzKTsKKyAgICB9CisgICAgcmV0dXJuIHRsczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0YXRpYyBfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpCitUIHNldEVycm9yRXRjKGNvbnN0IGNoYXIqIGNhbGxlciwgaW50IGxpbmUsIEVHTGludCBlcnJvciwgVCByZXR1cm5WYWx1ZSkgeworICAgIGlmIChnRUdMVGhyZWFkTG9jYWxTdG9yYWdlS2V5ID09IC0xKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ1RocmVhZExvY2FsU3RvcmFnZUtleU11dGV4KTsKKyAgICAgICAgaWYgKGdFR0xUaHJlYWRMb2NhbFN0b3JhZ2VLZXkgPT0gLTEpCisgICAgICAgICAgICBwdGhyZWFkX2tleV9jcmVhdGUoJmdFR0xUaHJlYWRMb2NhbFN0b3JhZ2VLZXksIE5VTEwpOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ1RocmVhZExvY2FsU3RvcmFnZUtleU11dGV4KTsKKyAgICB9CisgICAgdGxzX3QqIHRscyA9IGdldFRMUygpOworICAgIGlmICh0bHMtPmVycm9yICE9IGVycm9yKSB7CisgICAgICAgIExPR0UoIiVzOiVkIGVycm9yICV4ICglcykiLCBjYWxsZXIsIGxpbmUsIGVycm9yLCBlZ2xfc3RyZXJyb3IoZXJyb3IpKTsKKyAgICAgICAgdGxzLT5lcnJvciA9IGVycm9yOworICAgIH0KKyAgICByZXR1cm4gcmV0dXJuVmFsdWU7Cit9CisKK3N0YXRpYyBfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpCitHTGludCBnZXRFcnJvcigpIHsKKyAgICBpZiAoZ0VHTFRocmVhZExvY2FsU3RvcmFnZUtleSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIEVHTF9TVUNDRVNTOworICAgIHRsc190KiB0bHMgPSAodGxzX3QqKXB0aHJlYWRfZ2V0c3BlY2lmaWMoZ0VHTFRocmVhZExvY2FsU3RvcmFnZUtleSk7CisgICAgaWYgKCF0bHMpIHJldHVybiBFR0xfU1VDQ0VTUzsKKyAgICBHTGludCBlcnJvciA9IHRscy0+ZXJyb3I7CisgICAgdGxzLT5lcnJvciA9IEVHTF9TVUNDRVNTOworICAgIHJldHVybiBlcnJvcjsKK30KKworc3RhdGljIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSkKK3ZvaWQgc2V0Q29udGV4dChFR0xDb250ZXh0IGN0eCkgeworICAgIGlmIChnRUdMVGhyZWFkTG9jYWxTdG9yYWdlS2V5ID09IC0xKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ1RocmVhZExvY2FsU3RvcmFnZUtleU11dGV4KTsKKyAgICAgICAgaWYgKGdFR0xUaHJlYWRMb2NhbFN0b3JhZ2VLZXkgPT0gLTEpCisgICAgICAgICAgICBwdGhyZWFkX2tleV9jcmVhdGUoJmdFR0xUaHJlYWRMb2NhbFN0b3JhZ2VLZXksIE5VTEwpOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ1RocmVhZExvY2FsU3RvcmFnZUtleU11dGV4KTsKKyAgICB9CisgICAgdGxzX3QqIHRscyA9IGdldFRMUygpOworICAgIHRscy0+Y3R4ID0gY3R4OworfQorCitzdGF0aWMgX19hdHRyaWJ1dGVfXygobm9pbmxpbmUpKQorRUdMQ29udGV4dCBnZXRDb250ZXh0KCkgeworICAgIGlmIChnRUdMVGhyZWFkTG9jYWxTdG9yYWdlS2V5ID09IC0xKQorICAgICAgICByZXR1cm4gRUdMX05PX0NPTlRFWFQ7CisgICAgdGxzX3QqIHRscyA9ICh0bHNfdCopcHRocmVhZF9nZXRzcGVjaWZpYyhnRUdMVGhyZWFkTG9jYWxTdG9yYWdlS2V5KTsKKyAgICBpZiAoIXRscykgcmV0dXJuIEVHTF9OT19DT05URVhUOworICAgIHJldHVybiB0bHMtPmN0eDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2NsYXNzIElTdXJmYWNlQ29tcG9zZXI7Citjb25zdCBzcDxJU3VyZmFjZUNvbXBvc2VyPiYgZ2V0U3VyZmFjZUZsaW5nZXIoKTsKK3JlcXVlc3RfZ3B1X3QqIGdwdV9hY3F1aXJlKHZvaWQqIHVzZXIpOworaW50IGdwdV9yZWxlYXNlKHZvaWQqLCByZXF1ZXN0X2dwdV90KiBncHUpOworCitzdGF0aWMgX19hdHRyaWJ1dGVfXygobm9pbmxpbmUpKQordm9pZCAqbG9hZF9kcml2ZXIoY29uc3QgY2hhciogZHJpdmVyLCBnbF9ob29rc190KiBob29rcykKK3sKKyAgICB2b2lkKiBkc28gPSBkbG9wZW4oZHJpdmVyLCBSVExEX05PVyB8IFJUTERfTE9DQUwpOworICAgIExPR0VfSUYoIWRzbywKKyAgICAgICAgICAgICJjb3VsZG4ndCBsb2FkIDwlcz4gbGlicmFyeSAoJXMpIiwKKyAgICAgICAgICAgIGRyaXZlciwgZGxlcnJvcigpKTsKKworICAgIGlmIChkc28pIHsKKyAgICAgICAgdm9pZCoqIGN1cnI7CisgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCAqIGFwaTsKKyAgICAgICAgZ2xfaG9va3NfdDo6Z2xfdCogZ2wgPSAmaG9va3MtPmdsOworICAgICAgICBjdXJyID0gKHZvaWQqKilnbDsKKyAgICAgICAgYXBpID0gZ2xfbmFtZXM7CisgICAgICAgIHdoaWxlICgqYXBpKSB7CisgICAgICAgICAgICB2b2lkKiBmID0gZGxzeW0oZHNvLCAqYXBpKTsKKyAgICAgICAgICAgIC8vTE9HRCgiPCVzPiBAIDB4JXAiLCAqYXBpLCBmKTsKKyAgICAgICAgICAgIGlmIChmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAvL0xPR1coIjwlcz4gbm90IGZvdW5kIGluICVzIiwgKmFwaSwgZHJpdmVyKTsKKyAgICAgICAgICAgICAgICBmID0gKHZvaWQqKWdsX3VuaW1wbGVtZW50ZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqY3VycisrID0gZjsKKyAgICAgICAgICAgIGFwaSsrOworICAgICAgICB9CisgICAgICAgIGdsX2hvb2tzX3Q6OmVnbF90KiBlZ2wgPSAmaG9va3MtPmVnbDsKKyAgICAgICAgY3VyciA9ICh2b2lkKiopZWdsOworICAgICAgICBhcGkgPSBlZ2xfbmFtZXM7CisgICAgICAgIHdoaWxlICgqYXBpKSB7CisgICAgICAgICAgICB2b2lkKiBmID0gZGxzeW0oZHNvLCAqYXBpKTsKKyAgICAgICAgICAgIGlmIChmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAvL0xPR1coIjwlcz4gbm90IGZvdW5kIGluICVzIiwgKmFwaSwgZHJpdmVyKTsKKyAgICAgICAgICAgICAgICBmID0gKHZvaWQqKTA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqY3VycisrID0gZjsKKyAgICAgICAgICAgIGFwaSsrOworICAgICAgICB9CisKKyAgICAgICAgLy8gaG9vayB0aGlzIGRyaXZlciB1cCB3aXRoIHN1cmZhY2VmbGluZ2VyIGlmIG5lZWRlZAorICAgICAgICByZWdpc3Rlcl9ncHVfdCByZWdpc3Rlcl9ncHUgPSAKKyAgICAgICAgICAgIChyZWdpc3Rlcl9ncHVfdClkbHN5bShkc28sICJvZW1fcmVnaXN0ZXJfZ3B1Iik7CisKKyAgICAgICAgaWYgKHJlZ2lzdGVyX2dwdSAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoZ2V0U3VyZmFjZUZsaW5nZXIoKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmVnaXN0ZXJfZ3B1KGRzbywgZ3B1X2FjcXVpcmUsIGdwdV9yZWxlYXNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZHNvOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RhdGljIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSkKK2ludCBiaW5hcnlTZWFyY2goCisgICAgICAgIFQgY29uc3Qgc29ydGVkQXJyYXlbXSwgaW50IGZpcnN0LCBpbnQgbGFzdCwgVCBrZXkpCit7CisgICAgd2hpbGUgKGZpcnN0IDw9IGxhc3QpIHsKKyAgICAgICAgaW50IG1pZCA9IChmaXJzdCArIGxhc3QpIC8gMjsKKyAgICAgICAgaWYgKGtleSA+IHNvcnRlZEFycmF5W21pZF0pIHsgCisgICAgICAgICAgICBmaXJzdCA9IG1pZCArIDE7CisgICAgICAgIH0gZWxzZSBpZiAoa2V5IDwgc29ydGVkQXJyYXlbbWlkXSkgeyAKKyAgICAgICAgICAgIGxhc3QgPSBtaWQgLSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG1pZDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBFR0xpbnQgY29uZmlnVG9VbmlxdWVJZChlZ2xfZGlzcGxheV90IGNvbnN0KiBkcCwgaW50IGksIGludCBpbmRleCkgCit7CisgICAgLy8gTk9URTogdGhpcyBtYXBwaW5nIHdvcmtzIG9ubHkgaWYgd2UgaGF2ZSBubyBtb3JlIHRoYW4gdHdvIEVHTGltcGwKKyAgICByZXR1cm4gKGk+MCA/IGRwLT5udW1Db25maWdzWzBdIDogMCkgKyBpbmRleDsKK30KKworc3RhdGljIHZvaWQgdW5pcXVlSWRUb0NvbmZpZyhlZ2xfZGlzcGxheV90IGNvbnN0KiBkcCwgRUdMaW50IGNvbmZpZ0lkLAorICAgICAgICBpbnQmIGksIGludCYgaW5kZXgpIAoreworICAgIC8vIE5PVEU6IHRoaXMgbWFwcGluZyB3b3JrcyBvbmx5IGlmIHdlIGhhdmUgbm8gbW9yZSB0aGFuIHR3byBFR0xpbXBsCisgICAgc2l6ZV90IG51bUNvbmZpZ3MgPSBkcC0+bnVtQ29uZmlnc1swXTsKKyAgICBpID0gY29uZmlnSWQgLyBudW1Db25maWdzOworICAgIGluZGV4ID0gY29uZmlnSWQgJSBudW1Db25maWdzOworfQorCitzdGF0aWMgaW50IGNtcF9jb25maWdzKGNvbnN0IHZvaWQqIGEsIGNvbnN0IHZvaWQgKmIpCit7CisgICAgRUdMQ29uZmlnIGMwID0gKihFR0xDb25maWcgY29uc3QgKilhOworICAgIEVHTENvbmZpZyBjMSA9ICooRUdMQ29uZmlnIGNvbnN0ICopYjsKKyAgICByZXR1cm4gYzA8YzEgPyAtMSA6IChjMD5jMSA/IDEgOiAwKTsKK30KKworc3RydWN0IGV4dGVudGlvbl9tYXBfdCB7CisgICAgY29uc3QgY2hhciogbmFtZTsKKyAgICBfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlIGFkZHJlc3M7Cit9OworCitzdGF0aWMgY29uc3QgZXh0ZW50aW9uX21hcF90IGdFeHRlbnRpb25NYXBbXSA9IHsKK307CisKK3N0YXRpYyBleHRlbnRpb25fbWFwX3QgZ0dMRXh0ZW50aW9uTWFwW01BWF9OVU1CRVJfT0ZfR0xfRVhURU5TSU9OU107CisKK3N0YXRpYyB2b2lkKCpmaW5kUHJvY0FkZHJlc3MoY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgY29uc3QgZXh0ZW50aW9uX21hcF90KiBtYXAsIHNpemVfdCBuKSkoKSAKK3sKKyAgICBmb3IgKHVpbnQzMl90IGk9MCA7IGk8biA7IGkrKykgeworICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCBtYXBbaV0ubmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBtYXBbaV0uYWRkcmVzczsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW50IGdsX2NvbnRleHRfbG9zdCgpIHsKKyAgICBzZXRHbFRocmVhZFNwZWNpZmljKCZnSG9va3NbSU1QTF9DT05URVhUX0xPU1RdKTsKKyAgICByZXR1cm4gMDsKK30KK3N0YXRpYyBpbnQgZWdsX2NvbnRleHRfbG9zdCgpIHsKKyAgICBzZXRHbFRocmVhZFNwZWNpZmljKCZnSG9va3NbSU1QTF9DT05URVhUX0xPU1RdKTsKKyAgICByZXR1cm4gRUdMX0ZBTFNFOworfQorc3RhdGljIEVHTEJvb2xlYW4gZWdsX2NvbnRleHRfbG9zdF9zd2FwX2J1ZmZlcnModm9pZCosIHZvaWQqKSB7CisgICAgdXNsZWVwKDEwMDAwMCk7IC8vIGRvbid0IHVzZSBhbGwgdGhlIENQVQorICAgIHNldEdsVGhyZWFkU3BlY2lmaWMoJmdIb29rc1tJTVBMX0NPTlRFWFRfTE9TVF0pOworICAgIHJldHVybiBFR0xfRkFMU0U7Cit9CitzdGF0aWMgR0xpbnQgZWdsX2NvbnRleHRfbG9zdF9nZXRfZXJyb3IoKSB7CisgICAgcmV0dXJuIEVHTF9DT05URVhUX0xPU1Q7Cit9CitzdGF0aWMgaW50IGV4dF9jb250ZXh0X2xvc3QoKSB7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdsX25vX2NvbnRleHQoKSB7CisgICAgTE9HRSgiY2FsbCB0byBPcGVuR0wgRVMgQVBJIHdpdGggbm8gY3VycmVudCBjb250ZXh0Iik7Cit9CitzdGF0aWMgdm9pZCBlYXJseV9lZ2xfaW5pdCh2b2lkKSAKK3sKKyNpZiAhVVNFX0ZBU1RfVExTX0tFWQorICAgIHB0aHJlYWRfa2V5X2NyZWF0ZSgmZ0dMV3JhcHBlcktleSwgTlVMTCk7CisjZW5kaWYKKyAgICB1aW50MzJfdCBhZGRyID0gKHVpbnQzMl90KSgodm9pZCopZ2xfbm9fY29udGV4dCk7CisgICAgYW5kcm9pZF9tZW1zZXQzMigKKyAgICAgICAgICAgICh1aW50MzJfdCopKHZvaWQqKSZnSG9va3NbSU1QTF9OT19DT05URVhUXSwgCisgICAgICAgICAgICBhZGRyLCAKKyAgICAgICAgICAgIHNpemVvZihnSG9va3NbSU1QTF9OT19DT05URVhUXSkpOworICAgIHNldEdsVGhyZWFkU3BlY2lmaWMoJmdIb29rc1tJTVBMX05PX0NPTlRFWFRdKTsKK30KKworc3RhdGljIHB0aHJlYWRfb25jZV90IG9uY2VfY29udHJvbCA9IFBUSFJFQURfT05DRV9JTklUOworc3RhdGljIGludCBzRWFybHlJbml0U3RhdGUgPSBwdGhyZWFkX29uY2UoJm9uY2VfY29udHJvbCwgJmVhcmx5X2VnbF9pbml0KTsKKworCitzdGF0aWMgaW5saW5lCitlZ2xfZGlzcGxheV90KiBnZXRfZGlzcGxheShFR0xEaXNwbGF5IGRweSkKK3sKKyAgICB1aW50cHRyX3QgaW5kZXggPSB1aW50cHRyX3QoZHB5KS0xVTsKKyAgICByZXR1cm4gKGluZGV4ID49IE5VTV9ESVNQTEFZUykgPyBOVUxMIDogJmdEaXNwbGF5W2luZGV4XTsKK30KKworc3RhdGljIGlubGluZQorZWdsX3N1cmZhY2VfdCogZ2V0X3N1cmZhY2UoRUdMU3VyZmFjZSBzdXJmYWNlKQoreworICAgIGVnbF9zdXJmYWNlX3QqIHMgPSAoZWdsX3N1cmZhY2VfdCAqKXN1cmZhY2U7CisgICAgcmV0dXJuIHM7Cit9CisKK3N0YXRpYyBpbmxpbmUKK2VnbF9jb250ZXh0X3QqIGdldF9jb250ZXh0KEVHTENvbnRleHQgY29udGV4dCkKK3sKKyAgICBlZ2xfY29udGV4dF90KiBjID0gKGVnbF9jb250ZXh0X3QgKiljb250ZXh0OworICAgIHJldHVybiBjOworfQorCitzdGF0aWMgZWdsX2Nvbm5lY3Rpb25fdCogdmFsaWRhdGVfZGlzcGxheV9jb25maWcoCisgICAgICAgIEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLAorICAgICAgICBlZ2xfZGlzcGxheV90IGNvbnN0KiYgZHAsIGludCYgaW1wbCwgaW50JiBpbmRleCkKK3sKKyAgICBkcCA9IGdldF9kaXNwbGF5KGRweSk7CisgICAgaWYgKCFkcCkgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgKGVnbF9jb25uZWN0aW9uX3QqKU5VTEwpOworCisgICAgaW1wbCA9IHVpbnRwdHJfdChjb25maWcpPj4yNDsKKyAgICBpZiAodWludDMyX3QoaW1wbCkgPj0gMikgeworICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9DT05GSUcsIChlZ2xfY29ubmVjdGlvbl90KilOVUxMKTsKKyAgICB9IAorICAgIGluZGV4ID0gdWludHB0cl90KGNvbmZpZykgJiAweEZGRkZGRjsKKyAgICBpZiAoaW5kZXggPj0gZHAtPm51bUNvbmZpZ3NbaW1wbF0pIHsKKyAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfQ09ORklHLCAoZWdsX2Nvbm5lY3Rpb25fdCopTlVMTCk7CisgICAgfQorICAgIGVnbF9jb25uZWN0aW9uX3QqIGNvbnN0IGNueCA9ICZnRUdMSW1wbFtpbXBsXTsKKyAgICBpZiAoY254LT5kc28gPT0gMCkgeworICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9DT05GSUcsIChlZ2xfY29ubmVjdGlvbl90KilOVUxMKTsKKyAgICB9CisgICAgcmV0dXJuIGNueDsKK30KKworc3RhdGljIEVHTEJvb2xlYW4gdmFsaWRhdGVfZGlzcGxheV9jb250ZXh0KEVHTERpc3BsYXkgZHB5LCBFR0xDb250ZXh0IGN0eCkKK3sKKyAgICBpZiAoKHVpbnRwdHJfdChkcHkpLTFVKSA+PSBOVU1fRElTUExBWVMpCisgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9GQUxTRSk7CisgICAgaWYgKCFnZXRfZGlzcGxheShkcHkpLT5pc1ZhbGlkKCkpCisgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9GQUxTRSk7CisgICAgaWYgKCFjdHgpIC8vIFRPRE86IG1ha2Ugc3VyZSBjb250ZXh0IGlzIGEgdmFsaWQgb2JqZWN0CisgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0NPTlRFWFQsIEVHTF9GQUxTRSk7CisgICAgaWYgKCFnZXRfY29udGV4dChjdHgpLT5pc1ZhbGlkKCkpCisgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0NPTlRFWFQsIEVHTF9GQUxTRSk7CisgICAgcmV0dXJuIEVHTF9UUlVFOworfQorCitzdGF0aWMgRUdMQm9vbGVhbiB2YWxpZGF0ZV9kaXNwbGF5X3N1cmZhY2UoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyZmFjZSkKK3sKKyAgICBpZiAoKHVpbnRwdHJfdChkcHkpLTFVKSA+PSBOVU1fRElTUExBWVMpCisgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9GQUxTRSk7CisgICAgaWYgKCFnZXRfZGlzcGxheShkcHkpLT5pc1ZhbGlkKCkpCisgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9GQUxTRSk7CisgICAgaWYgKCFzdXJmYWNlKSAvLyBUT0RPOiBtYWtlIHN1cmUgc3VyZmFjZSBpcyBhIHZhbGlkIG9iamVjdAorICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9TVVJGQUNFLCBFR0xfRkFMU0UpOworICAgIGlmICghZ2V0X3N1cmZhY2Uoc3VyZmFjZSktPmlzVmFsaWQoKSkKKyAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfU1VSRkFDRSwgRUdMX0ZBTFNFKTsKKyAgICByZXR1cm4gRUdMX1RSVUU7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitFR0xEaXNwbGF5IGVnbEdldERpc3BsYXkoTmF0aXZlRGlzcGxheVR5cGUgZGlzcGxheSkKK3sKKyAgICBpZiAoc0Vhcmx5SW5pdFN0YXRlKSB7CisgICAgICAgIHJldHVybiBFR0xfTk9fRElTUExBWTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBpbmRleCA9IHVpbnQzMl90KGRpc3BsYXkpOworICAgIGlmIChpbmRleCA+PSBOVU1fRElTUExBWVMpIHsKKyAgICAgICAgcmV0dXJuIEVHTF9OT19ESVNQTEFZOworICAgIH0KKyAgICAKKyAgICBFR0xEaXNwbGF5IGRweSA9IEVHTERpc3BsYXkodWludHB0cl90KGRpc3BsYXkpICsgMUxVKTsKKyAgICBlZ2xfZGlzcGxheV90KiBkID0gJmdEaXNwbGF5W2luZGV4XTsKKyAgICAgICAgCisgICAgLy8gZHluYW1pY2FsbHkgbG9hZCBhbGwgb3VyIEVHTCBpbXBsZW1lbnRhdGlvbnMgZm9yIHRoYXQgZGlzcGxheQorICAgIC8vIGFuZCBjYWxsIGludG8gdGhlIHJlYWwgZWdsR2V0R2lzcGxheSgpCisgICAgZWdsX2Nvbm5lY3Rpb25fdCogY254ID0gJmdFR0xJbXBsW0lNUExfU09GVFdBUkVdOworICAgIGlmIChjbngtPmRzbyA9PSAwKSB7CisgICAgICAgIGNueC0+aG9va3MgPSAmZ0hvb2tzW0lNUExfU09GVFdBUkVdOworICAgICAgICBjbngtPmRzbyA9IGxvYWRfZHJpdmVyKCJsaWJhZ2wuc28iLCBjbngtPmhvb2tzKTsKKyAgICB9CisgICAgaWYgKGNueC0+ZHNvICYmIGQtPmRweXNbSU1QTF9TT0ZUV0FSRV09PUVHTF9OT19ESVNQTEFZKSB7CisgICAgICAgIGQtPmRweXNbSU1QTF9TT0ZUV0FSRV0gPSBjbngtPmhvb2tzLT5lZ2wuZWdsR2V0RGlzcGxheShkaXNwbGF5KTsKKyAgICAgICAgTE9HRV9JRihkLT5kcHlzW0lNUExfU09GVFdBUkVdPT1FR0xfTk9fRElTUExBWSwKKyAgICAgICAgICAgICAgICAiTm8gRUdMRGlzcGxheSBmb3Igc29mdHdhcmUgRUdMISIpOworICAgIH0KKworICAgIGNueCA9ICZnRUdMSW1wbFtJTVBMX0hBUkRXQVJFXTsKKyAgICBpZiAoY254LT5kc28gPT0gMCAmJiBjbngtPnVuYXZhaWxhYmxlID09IDApIHsKKyAgICAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgICAgICBwcm9wZXJ0eV9nZXQoImRlYnVnLmVnbC5odyIsIHZhbHVlLCAiMSIpOworICAgICAgICBpZiAoYXRvaSh2YWx1ZSkgIT0gMCkgeworICAgICAgICAgICAgY254LT5ob29rcyA9ICZnSG9va3NbSU1QTF9IQVJEV0FSRV07CisgICAgICAgICAgICBjbngtPmRzbyA9IGxvYWRfZHJpdmVyKCJsaWJoZ2wuc28iLCBjbngtPmhvb2tzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0QoIjNEIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBpcyBkaXNhYmxlZCIpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChjbngtPmRzbyAmJiBkLT5kcHlzW0lNUExfSEFSRFdBUkVdPT1FR0xfTk9fRElTUExBWSkgeworICAgICAgICBhbmRyb2lkX21lbXNldDMyKAorICAgICAgICAgICAgICAgICh1aW50MzJfdCopKHZvaWQqKSZnSG9va3NbSU1QTF9DT05URVhUX0xPU1RdLmdsLAorICAgICAgICAgICAgICAgICh1aW50MzJfdCkoKHZvaWQqKWdsX2NvbnRleHRfbG9zdCksCisgICAgICAgICAgICAgICAgc2l6ZW9mKGdIb29rc1tJTVBMX0NPTlRFWFRfTE9TVF0uZ2wpKTsKKyAgICAgICAgYW5kcm9pZF9tZW1zZXQzMigKKyAgICAgICAgICAgICAgICAodWludDMyX3QqKSh2b2lkKikmZ0hvb2tzW0lNUExfQ09OVEVYVF9MT1NUXS5lZ2wsCisgICAgICAgICAgICAgICAgKHVpbnQzMl90KSgodm9pZCopZWdsX2NvbnRleHRfbG9zdCksCisgICAgICAgICAgICAgICAgc2l6ZW9mKGdIb29rc1tJTVBMX0NPTlRFWFRfTE9TVF0uZWdsKSk7CisgICAgICAgIGFuZHJvaWRfbWVtc2V0MzIoCisgICAgICAgICAgICAgICAgKHVpbnQzMl90Kikodm9pZCopJmdIb29rc1tJTVBMX0NPTlRFWFRfTE9TVF0uZXh0LAorICAgICAgICAgICAgICAgICh1aW50MzJfdCkoKHZvaWQqKWV4dF9jb250ZXh0X2xvc3QpLAorICAgICAgICAgICAgICAgIHNpemVvZihnSG9va3NbSU1QTF9DT05URVhUX0xPU1RdLmV4dCkpOworCisgICAgICAgIGdIb29rc1tJTVBMX0NPTlRFWFRfTE9TVF0uZWdsLmVnbFN3YXBCdWZmZXJzID0KKyAgICAgICAgICAgICAgICBlZ2xfY29udGV4dF9sb3N0X3N3YXBfYnVmZmVyczsKKyAgICAgICAgCisgICAgICAgIGdIb29rc1tJTVBMX0NPTlRFWFRfTE9TVF0uZWdsLmVnbEdldEVycm9yID0KKyAgICAgICAgICAgICAgICBlZ2xfY29udGV4dF9sb3N0X2dldF9lcnJvcjsKKworICAgICAgICBnSG9va3NbSU1QTF9DT05URVhUX0xPU1RdLmVnbC5lZ2xUZXJtaW5hdGUgPQorICAgICAgICAgICAgICAgIGdIb29rc1tJTVBMX0hBUkRXQVJFXS5lZ2wuZWdsVGVybWluYXRlOworICAgICAgICAKKyAgICAgICAgZC0+ZHB5c1tJTVBMX0hBUkRXQVJFXSA9IGNueC0+aG9va3MtPmVnbC5lZ2xHZXREaXNwbGF5KGRpc3BsYXkpOworICAgICAgICBpZiAoZC0+ZHB5c1tJTVBMX0hBUkRXQVJFXSA9PSBFR0xfTk9fRElTUExBWSkgeworICAgICAgICAgICAgTE9HRSgiaC93IGFjY2VsZXJhdGVkIGVnbEdldERpc3BsYXkoKSBmYWlsZWQgKCVzKSIsCisgICAgICAgICAgICAgICAgICAgIGVnbF9zdHJlcnJvcihjbngtPmhvb2tzLT5lZ2wuZWdsR2V0RXJyb3IoKSkpOworICAgICAgICAgICAgZGxjbG9zZSgodm9pZCopY254LT5kc28pOworICAgICAgICAgICAgY254LT5kc28gPSAwOworICAgICAgICAgICAgLy8gaW4gY2FzZSBvZiBmYWlsdXJlLCB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCB0cnkgYWdhaW4KKyAgICAgICAgICAgIC8vIGFzIGl0J3MgZXhwZW5zaXZlLgorICAgICAgICAgICAgY254LT51bmF2YWlsYWJsZSA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZHB5OworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbml0aWFsaXphdGlvbgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFR0xCb29sZWFuIGVnbEluaXRpYWxpemUoRUdMRGlzcGxheSBkcHksIEVHTGludCAqbWFqb3IsIEVHTGludCAqbWlub3IpCit7CisgICAgZWdsX2Rpc3BsYXlfdCAqIGNvbnN0IGRwID0gZ2V0X2Rpc3BsYXkoZHB5KTsKKyAgICBpZiAoIWRwKSByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOworCisgICAgaWYgKGFuZHJvaWRfYXRvbWljX2luYygmZHAtPnJlZnMpID4gMCkgeworICAgICAgICBpZiAobWFqb3IgIT0gTlVMTCkgKm1ham9yID0gVkVSU0lPTl9NQUpPUjsKKyAgICAgICAgaWYgKG1pbm9yICE9IE5VTEwpICptaW5vciA9IFZFUlNJT05fTUlOT1I7CisgICAgICAgIHJldHVybiBFR0xfVFJVRTsKKyAgICB9CisgICAgCisgICAgc2V0R2xUaHJlYWRTcGVjaWZpYygmZ0hvb2tzW0lNUExfTk9fQ09OVEVYVF0pOworICAgIAorICAgIC8vIGluaXRpYWxpemUgZWFjaCBFR0wgYW5kCisgICAgLy8gYnVpbGQgb3VyIG93biBleHRlbnNpb24gc3RyaW5nIGZpcnN0LCBiYXNlZCBvbiB0aGUgZXh0ZW5zaW9uIHdlIGtub3cKKyAgICAvLyBhbmQgdGhlIGV4dGVuc2lvbiBzdXBwb3J0ZWQgYnkgb3VyIGNsaWVudCBpbXBsZW1lbnRhdGlvbgorICAgIGRwLT5leHRlbnNpb25zU3RyaW5nID0gc3RyZHVwKGdFeHRlbnNpb25TdHJpbmcpOworICAgIGZvciAoaW50IGk9MCA7IGk8MiA7IGkrKykgeworICAgICAgICBlZ2xfY29ubmVjdGlvbl90KiBjb25zdCBjbnggPSAmZ0VHTEltcGxbaV07CisgICAgICAgIGNueC0+bWFqb3IgPSAtMTsKKyAgICAgICAgY254LT5taW5vciA9IC0xOworICAgICAgICBpZiAoIWNueC0+ZHNvKSAKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmIChjbngtPmhvb2tzLT5lZ2wuZWdsSW5pdGlhbGl6ZSgKKyAgICAgICAgICAgICAgICBkcC0+ZHB5c1tpXSwgJmNueC0+bWFqb3IsICZjbngtPm1pbm9yKSkgeworCisgICAgICAgICAgICAvL0xPR0QoImluaXRpYWxpemVkICVkIGRweT0lcCwgdmVyPSVkLiVkLCBjbng9JXAiLAorICAgICAgICAgICAgLy8gICAgICAgIGksIGRwLT5kcHlzW2ldLCBjbngtPm1ham9yLCBjbngtPm1pbm9yLCBjbngpOworCisgICAgICAgICAgICAvLyBnZXQgdGhlIHF1ZXJ5LXN0cmluZ3MgZm9yIHRoaXMgZGlzcGxheSBmb3IgZWFjaCBpbXBsZW1lbnRhdGlvbgorICAgICAgICAgICAgZHAtPnF1ZXJ5U3RyaW5nW2ldLnZlbmRvciA9CisgICAgICAgICAgICAgICAgY254LT5ob29rcy0+ZWdsLmVnbFF1ZXJ5U3RyaW5nKGRwLT5kcHlzW2ldLCBFR0xfVkVORE9SKTsKKyAgICAgICAgICAgIGRwLT5xdWVyeVN0cmluZ1tpXS52ZXJzaW9uID0KKyAgICAgICAgICAgICAgICBjbngtPmhvb2tzLT5lZ2wuZWdsUXVlcnlTdHJpbmcoZHAtPmRweXNbaV0sIEVHTF9WRVJTSU9OKTsKKyAgICAgICAgICAgIGRwLT5xdWVyeVN0cmluZ1tpXS5leHRlbnNpb25zID0gc3RyZHVwKAorICAgICAgICAgICAgICAgICAgICBjbngtPmhvb2tzLT5lZ2wuZWdsUXVlcnlTdHJpbmcoZHAtPmRweXNbaV0sIEVHTF9FWFRFTlNJT05TKSk7CisgICAgICAgICAgICBkcC0+cXVlcnlTdHJpbmdbaV0uY2xpZW50QXBpID0KKyAgICAgICAgICAgICAgICBjbngtPmhvb2tzLT5lZ2wuZWdsUXVlcnlTdHJpbmcoZHAtPmRweXNbaV0sIEVHTF9DTElFTlRfQVBJUyk7CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0QoIiVkOiBlZ2xJbml0aWFsaXplKCkgZmFpbGVkICglcykiLCAKKyAgICAgICAgICAgICAgICAgICAgaSwgZWdsX3N0cmVycm9yKGNueC0+aG9va3MtPmVnbC5lZ2xHZXRFcnJvcigpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBFR0xCb29sZWFuIHJlcyA9IEVHTF9GQUxTRTsKKyAgICBmb3IgKGludCBpPTAgOyBpPDIgOyBpKyspIHsKKyAgICAgICAgZWdsX2Nvbm5lY3Rpb25fdCogY29uc3QgY254ID0gJmdFR0xJbXBsW2ldOworICAgICAgICBpZiAoY254LT5kc28gJiYgY254LT5tYWpvcj49MCAmJiBjbngtPm1pbm9yPj0wKSB7CisgICAgICAgICAgICBFR0xpbnQgbjsKKyAgICAgICAgICAgIGlmIChjbngtPmhvb2tzLT5lZ2wuZWdsR2V0Q29uZmlncyhkcC0+ZHB5c1tpXSwgMCwgMCwgJm4pKSB7CisgICAgICAgICAgICAgICAgZHAtPmNvbmZpZ3NbaV0gPSAoRUdMQ29uZmlnKiltYWxsb2Moc2l6ZW9mKEVHTENvbmZpZykqbik7CisgICAgICAgICAgICAgICAgaWYgKGRwLT5jb25maWdzW2ldKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbngtPmhvb2tzLT5lZ2wuZWdsR2V0Q29uZmlncygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcC0+ZHB5c1tpXSwgZHAtPmNvbmZpZ3NbaV0sIG4sICZkcC0+bnVtQ29uZmlnc1tpXSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvcnQgdGhlIGNvbmZpZ3VyYXRpb25zIHNvIHdlIGNhbiBkbyBiaW5hcnkgc2VhcmNoZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIHFzb3J0KCAgZHAtPmNvbmZpZ3NbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwLT5udW1Db25maWdzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoRUdMQ29uZmlnKSwgY21wX2NvbmZpZ3MpOworCisgICAgICAgICAgICAgICAgICAgICAgICBkcC0+bnVtVG90YWxDb25maWdzICs9IG47CisgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBFR0xfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChyZXMgPT0gRUdMX1RSVUUpIHsKKyAgICAgICAgaWYgKG1ham9yICE9IE5VTEwpICptYWpvciA9IFZFUlNJT05fTUFKT1I7CisgICAgICAgIGlmIChtaW5vciAhPSBOVUxMKSAqbWlub3IgPSBWRVJTSU9OX01JTk9SOworICAgICAgICByZXR1cm4gRUdMX1RSVUU7CisgICAgfQorICAgIHJldHVybiBzZXRFcnJvcihFR0xfTk9UX0lOSVRJQUxJWkVELCBFR0xfRkFMU0UpOworfQorCitFR0xCb29sZWFuIGVnbFRlcm1pbmF0ZShFR0xEaXNwbGF5IGRweSkKK3sKKyAgICBlZ2xfZGlzcGxheV90KiBjb25zdCBkcCA9IGdldF9kaXNwbGF5KGRweSk7CisgICAgaWYgKCFkcCkgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgRUdMX0ZBTFNFKTsKKyAgICBpZiAoYW5kcm9pZF9hdG9taWNfZGVjKCZkcC0+cmVmcykgIT0gMSkKKyAgICAgICAgcmV0dXJuIEVHTF9UUlVFOworICAgICAgICAKKyAgICBFR0xCb29sZWFuIHJlcyA9IEVHTF9GQUxTRTsKKyAgICBmb3IgKGludCBpPTAgOyBpPDIgOyBpKyspIHsKKyAgICAgICAgZWdsX2Nvbm5lY3Rpb25fdCogY29uc3QgY254ID0gJmdFR0xJbXBsW2ldOworICAgICAgICBpZiAoY254LT5kc28pIHsKKyAgICAgICAgICAgIGNueC0+aG9va3MtPmVnbC5lZ2xUZXJtaW5hdGUoZHAtPmRweXNbaV0pOworICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBSRVZJU0lUOiBpdCdzIHVuY2xlYXIgd2hhdCB0byBkbyBpZiBlZ2xUZXJtaW5hdGUoKSBmYWlscywKKyAgICAgICAgICAgICAqIG9uIG9uZSBlbmQgd2Ugc2hvdWxkbid0IGNhcmUsIG9uIHRoZSBvdGhlciBlbmQgaWYgaXQgZmFpbHMKKyAgICAgICAgICAgICAqIGl0IG1pZ2h0IG5vdCBiZSBzYWZlIHRvIGNhbGwgZGxjbG9zZSgpICh0aGVyZSBjb3VsZCBiZSBzb21lCisgICAgICAgICAgICAgKiB0aHJlYWRzIGFyb3VuZCkuICovCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZyZWUoZHAtPmNvbmZpZ3NbaV0pOworICAgICAgICAgICAgZnJlZSgodm9pZCopZHAtPnF1ZXJ5U3RyaW5nW2ldLmV4dGVuc2lvbnMpOworICAgICAgICAgICAgZHAtPm51bUNvbmZpZ3NbaV0gPSAwOworICAgICAgICAgICAgZHAtPmRweXNbaV0gPSBFR0xfTk9fRElTUExBWTsKKyAgICAgICAgICAgIGRsY2xvc2UoKHZvaWQqKWNueC0+ZHNvKTsKKyAgICAgICAgICAgIGNueC0+ZHNvID0gMDsKKyAgICAgICAgICAgIHJlcyA9IEVHTF9UUlVFOworICAgICAgICB9CisgICAgfQorICAgIGZyZWUoKHZvaWQqKWRwLT5leHRlbnNpb25zU3RyaW5nKTsKKyAgICBkcC0+ZXh0ZW5zaW9uc1N0cmluZyA9IDA7CisgICAgZHAtPm51bVRvdGFsQ29uZmlncyA9IDA7CisgICAgY2xlYXJUTFMoKTsKKyAgICByZXR1cm4gcmVzOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25maWd1cmF0aW9uCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VHTEJvb2xlYW4gZWdsR2V0Q29uZmlncyggICBFR0xEaXNwbGF5IGRweSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xDb25maWcgKmNvbmZpZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMaW50IGNvbmZpZ19zaXplLCBFR0xpbnQgKm51bV9jb25maWcpCit7CisgICAgZWdsX2Rpc3BsYXlfdCBjb25zdCAqIGNvbnN0IGRwID0gZ2V0X2Rpc3BsYXkoZHB5KTsKKyAgICBpZiAoIWRwKSByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOworCisgICAgR0xpbnQgbnVtQ29uZmlncyA9IGRwLT5udW1Ub3RhbENvbmZpZ3M7CisgICAgaWYgKCFjb25maWdzKSB7CisgICAgICAgICpudW1fY29uZmlnID0gbnVtQ29uZmlnczsKKyAgICAgICAgcmV0dXJuIEVHTF9UUlVFOworICAgIH0KKyAgICBHTGludCBuID0gMDsKKyAgICBmb3IgKGludCBqPTAgOyBqPDIgOyBqKyspIHsKKyAgICAgICAgZm9yIChpbnQgaT0wIDsgaTxkcC0+bnVtQ29uZmlnc1tqXSAmJiBjb25maWdfc2l6ZSA7IGkrKykgeworICAgICAgICAgICAgKmNvbmZpZ3MrKyA9IE1BS0VfQ09ORklHKGosIGkpOworICAgICAgICAgICAgY29uZmlnX3NpemUtLTsKKyAgICAgICAgICAgIG4rKzsKKyAgICAgICAgfQorICAgIH0gICAgCisgICAgCisgICAgKm51bV9jb25maWcgPSBuOworICAgIHJldHVybiBFR0xfVFJVRTsKK30KKworRUdMQm9vbGVhbiBlZ2xDaG9vc2VDb25maWcoIEVHTERpc3BsYXkgZHB5LCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTENvbmZpZyAqY29uZmlncywgRUdMaW50IGNvbmZpZ19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTGludCAqbnVtX2NvbmZpZykKK3sKKyAgICBlZ2xfZGlzcGxheV90IGNvbnN0ICogY29uc3QgZHAgPSBnZXRfZGlzcGxheShkcHkpOworICAgIGlmICghZHApIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9GQUxTRSk7CisKKyAgICBpZiAoY29uZmlncyA9PSAwKSB7CisgICAgICAgICpudW1fY29uZmlnID0gMDsKKyAgICAgICAgcmV0dXJuIEVHTF9UUlVFOworICAgIH0KKworICAgIEVHTGludCBuOworICAgIEVHTEJvb2xlYW4gcmVzID0gRUdMX0ZBTFNFOworICAgICpudW1fY29uZmlnID0gMDsKKworICAgIAorICAgIC8vIEl0IGlzIHVuZm9ydHVuYXRlLCBidXQgd2UgbmVlZCB0byByZW1hcCB0aGUgRUdMX0NPTkZJR19JRHMsIAorICAgIC8vIHRvIGRvICB0aGlzLCB3ZSBoYXZlIHRvIGdvIHRocm91Z2ggdGhlIGF0dHJpYl9saXN0IGFycmF5IG9uY2UKKyAgICAvLyB0byBmaWd1cmUgb3V0IGJvdGggaXRzIHNpemUgYW5kIGlmIGl0IGNvbnRhaW5zIGFuIEVHTF9DT05GSUdfSUQKKyAgICAvLyBrZXkuIElmIHNvLCB0aGUgZnVsbCBhcnJheSBpcyBjb3BpZWQgYW5kIHBhdGNoZWQuCisgICAgLy8gTk9URTogd2UgYXNzdW1lIHRoYXQgdGhlcmUgY2FuIGJlIG9ubHkgb25lIG9jY3VycmVuY2UKKyAgICAvLyBvZiBFR0xfQ09ORklHX0lELgorICAgIAorICAgIEVHTGludCBwYXRjaF9pbmRleCA9IC0xOworICAgIEdMaW50IGF0dHI7CisgICAgc2l6ZV90IHNpemUgPSAwOworICAgIHdoaWxlICgoYXR0cj1hdHRyaWJfbGlzdFtzaXplXSkpIHsKKyAgICAgICAgaWYgKGF0dHIgPT0gRUdMX0NPTkZJR19JRCkKKyAgICAgICAgICAgIHBhdGNoX2luZGV4ID0gc2l6ZTsKKyAgICAgICAgc2l6ZSArPSAyOworICAgIH0KKyAgICBpZiAocGF0Y2hfaW5kZXggPj0gMCkgeworICAgICAgICBzaXplICs9IDI7IC8vIHdlIG5lZWQgY29weSB0aGUgc2VudGluZWwgYXMgd2VsbAorICAgICAgICBFR0xpbnQqIG5ld19saXN0ID0gKEVHTGludCopbWFsbG9jKHNpemUqc2l6ZW9mKEVHTGludCkpOworICAgICAgICBpZiAobmV3X2xpc3QgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0FMTE9DLCBFR0xfRkFMU0UpOworICAgICAgICBtZW1jcHkobmV3X2xpc3QsIGF0dHJpYl9saXN0LCBzaXplKnNpemVvZihFR0xpbnQpKTsKKworICAgICAgICAvLyBwYXRjaCB0aGUgcmVxdWVzdGVkIEVHTF9DT05GSUdfSUQKKyAgICAgICAgaW50IGksIGluZGV4OworICAgICAgICBFR0xpbnQmIGNvbmZpZ0lkKG5ld19saXN0W3BhdGNoX2luZGV4KzFdKTsKKyAgICAgICAgdW5pcXVlSWRUb0NvbmZpZyhkcCwgY29uZmlnSWQsIGksIGluZGV4KTsKKyAgICAgICAgCisgICAgICAgIGVnbF9jb25uZWN0aW9uX3QqIGNvbnN0IGNueCA9ICZnRUdMSW1wbFtpXTsKKyAgICAgICAgaWYgKGNueC0+ZHNvKSB7CisgICAgICAgICAgICBjbngtPmhvb2tzLT5lZ2wuZWdsR2V0Q29uZmlnQXR0cmliKAorICAgICAgICAgICAgICAgICAgICBkcC0+ZHB5c1tpXSwgZHAtPmNvbmZpZ3NbaV1baW5kZXhdLCAKKyAgICAgICAgICAgICAgICAgICAgRUdMX0NPTkZJR19JRCwgJmNvbmZpZ0lkKTsKKworICAgICAgICAgICAgLy8gYW5kIHN3aXRjaCB0byB0aGUgbmV3IGxpc3QKKyAgICAgICAgICAgIGF0dHJpYl9saXN0ID0gY29uc3RfY2FzdDxjb25zdCBFR0xpbnQgKj4obmV3X2xpc3QpOworCisgICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCB0aGUgb25seSBjb25maWd1cmF0aW9uIHRoYXQgY2FuIG1hdGNoIGlzCisgICAgICAgICAgICAvLyBkcC0+Y29uZmlnc1tpXVtpbmRleF0sIGhvd2V2ZXIsIHdlIGRvbid0IGtub3cgaWYgaXQgd291bGQgYmUKKyAgICAgICAgICAgIC8vIHJlamVjdGVkIGJlY2F1c2Ugb2YgdGhlIG90aGVyIGF0dHJpYnV0ZXMsIHNvIHdlIGRvIGhhdmUgdG8gY2FsbAorICAgICAgICAgICAgLy8gY254LT5ob29rcy0+ZWdsLmVnbENob29zZUNvbmZpZygpIC0tIGJ1dCB3ZSBkb24ndCBoYXZlIHRvIGxvb3AKKyAgICAgICAgICAgIC8vIHRocm91Z2ggYWxsIHRoZSBFR0xpbXBsW10uCisgICAgICAgICAgICAvLyBXZSBhbHNvIGtub3cgd2UgY2FuIG9ubHkgZ2V0IGEgc2luZ2xlIGNvbmZpZyBiYWNrLCBhbmQgd2Uga25vdworICAgICAgICAgICAgLy8gd2hpY2ggb25lLgorCisgICAgICAgICAgICByZXMgPSBjbngtPmhvb2tzLT5lZ2wuZWdsQ2hvb3NlQ29uZmlnKAorICAgICAgICAgICAgICAgICAgICBkcC0+ZHB5c1tpXSwgYXR0cmliX2xpc3QsIGNvbmZpZ3MsIGNvbmZpZ19zaXplLCAmbik7CisgICAgICAgICAgICBpZiAocmVzICYmIG4+MCkgeworICAgICAgICAgICAgICAgIC8vIG4gaGFzIHRvIGJlIDAgb3IgMSwgYnkgY29uc3RydWN0aW9uLCBhbmQgd2UgYWxyZWFkeSBrbm93CisgICAgICAgICAgICAgICAgLy8gd2hpY2ggY29uZmlnIGl0IHdpbGwgcmV0dXJuIChzaW5jZSB0aGVyZSBjYW4gYmUgb25seSBvbmUpLgorICAgICAgICAgICAgICAgIGNvbmZpZ3NbMF0gPSBNQUtFX0NPTkZJRyhpLCBpbmRleCk7CisgICAgICAgICAgICAgICAgKm51bV9jb25maWcgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZnJlZShjb25zdF9jYXN0PEVHTGludCAqPihhdHRyaWJfbGlzdCkpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGZvciAoaW50IGk9MCA7IGk8MiA7IGkrKykgeworICAgICAgICBlZ2xfY29ubmVjdGlvbl90KiBjb25zdCBjbnggPSAmZ0VHTEltcGxbaV07CisgICAgICAgIGlmIChjbngtPmRzbykgeworICAgICAgICAgICAgaWYgKGNueC0+aG9va3MtPmVnbC5lZ2xDaG9vc2VDb25maWcoCisgICAgICAgICAgICAgICAgICAgIGRwLT5kcHlzW2ldLCBhdHRyaWJfbGlzdCwgY29uZmlncywgY29uZmlnX3NpemUsICZuKSkgeworICAgICAgICAgICAgICAgIC8vIG5vdyB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhlc2UgY2xpZW50IEVHTENvbmZpZyB0byBvdXIKKyAgICAgICAgICAgICAgICAvLyBpbnRlcm5hbCBFR0xDb25maWcgZm9ybWF0LiBUaGlzIGlzIGRvbmUgaW4gTyhuIGxvZyBuKS4KKyAgICAgICAgICAgICAgICBmb3IgKGludCBqPTAgOyBqPG4gOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gYmluYXJ5U2VhcmNoPEVHTENvbmZpZz4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHAtPmNvbmZpZ3NbaV0sIDAsIGRwLT5udW1Db25maWdzW2ldLTEsIGNvbmZpZ3Nbal0pOworICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnc1tqXSA9IE1BS0VfQ09ORklHKGksIGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0NPTkZJRywgRUdMX0ZBTFNFKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb25maWdzICs9IG47CisgICAgICAgICAgICAgICAgY29uZmlnX3NpemUgLT0gbjsKKyAgICAgICAgICAgICAgICAqbnVtX2NvbmZpZyArPSBuOworICAgICAgICAgICAgICAgIHJlcyA9IEVHTF9UUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK0VHTEJvb2xlYW4gZWdsR2V0Q29uZmlnQXR0cmliKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLAorICAgICAgICBFR0xpbnQgYXR0cmlidXRlLCBFR0xpbnQgKnZhbHVlKQoreworICAgIGVnbF9kaXNwbGF5X3QgY29uc3QqIGRwID0gMDsKKyAgICBpbnQgaT0wLCBpbmRleD0wOworICAgIGVnbF9jb25uZWN0aW9uX3QqIGNueCA9IHZhbGlkYXRlX2Rpc3BsYXlfY29uZmlnKGRweSwgY29uZmlnLCBkcCwgaSwgaW5kZXgpOworICAgIGlmICghY254KSByZXR1cm4gRUdMX0ZBTFNFOworICAgIAorICAgIGlmIChhdHRyaWJ1dGUgPT0gRUdMX0NPTkZJR19JRCkgeworICAgICAgICAvLyBFR0xfQ09ORklHX0lEcyBtdXN0IGJlIHVuaXF1ZSwganVzdCB1c2UgdGhlIG9yZGVyIG9mIHRoZSBzZWxlY3RlZAorICAgICAgICAvLyBFR0xDb25maWcuCisgICAgICAgICp2YWx1ZSA9IGNvbmZpZ1RvVW5pcXVlSWQoZHAsIGksIGluZGV4KTsKKyAgICAgICAgcmV0dXJuIEVHTF9UUlVFOworICAgIH0KKyAgICByZXR1cm4gY254LT5ob29rcy0+ZWdsLmVnbEdldENvbmZpZ0F0dHJpYigKKyAgICAgICAgICAgIGRwLT5kcHlzW2ldLCBkcC0+Y29uZmlnc1tpXVtpbmRleF0sIGF0dHJpYnV0ZSwgdmFsdWUpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBzdXJmYWNlcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFR0xTdXJmYWNlIGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoICBFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hdGl2ZVdpbmRvd1R5cGUgd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCkKK3sKKyAgICBlZ2xfZGlzcGxheV90IGNvbnN0KiBkcCA9IDA7CisgICAgaW50IGk9MCwgaW5kZXg9MDsKKyAgICBlZ2xfY29ubmVjdGlvbl90KiBjbnggPSB2YWxpZGF0ZV9kaXNwbGF5X2NvbmZpZyhkcHksIGNvbmZpZywgZHAsIGksIGluZGV4KTsKKyAgICBpZiAoY254KSB7CisgICAgICAgIC8vIHdpbmRvdyBtdXN0IGJlIGNvbm5lY3RlZCB1cG9uIGNhbGxpbmcgdW5kZXJseWluZworICAgICAgICAvLyBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlCisgICAgICAgIGlmICh3aW5kb3cpIHsKKyAgICAgICAgICAgIHdpbmRvdy0+aW5jUmVmKHdpbmRvdyk7CisgICAgICAgICAgICBpZiAod2luZG93LT5jb25uZWN0KQorICAgICAgICAgICAgICAgIHdpbmRvdy0+Y29ubmVjdCh3aW5kb3cpOworICAgICAgICB9CisKKyAgICAgICAgRUdMU3VyZmFjZSBzdXJmYWNlID0gY254LT5ob29rcy0+ZWdsLmVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoCisgICAgICAgICAgICAgICAgZHAtPmRweXNbaV0sIGRwLT5jb25maWdzW2ldW2luZGV4XSwgd2luZG93LCBhdHRyaWJfbGlzdCk7ICAgICAgIAorICAgICAgICBpZiAoc3VyZmFjZSAhPSBFR0xfTk9fU1VSRkFDRSkgeworICAgICAgICAgICAgZWdsX3N1cmZhY2VfdCogcyA9IG5ldyBlZ2xfc3VyZmFjZV90KGRweSwgc3VyZmFjZSwgd2luZG93LCBpLCBjbngpOworICAgICAgICAgICAgcmV0dXJuIHM7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIHNvbWV0aGluZyB3ZW50IHdyb25nLCBkaXNjb25uZWN0IGFuZCBmcmVlIHdpbmRvdworICAgICAgICAvLyAod2lsbCBkaXNjb25uZWN0KCkgYXV0b21hdGljYWxseSkKKyAgICAgICAgaWYgKHdpbmRvdykgeworICAgICAgICAgICAgd2luZG93LT5kZWNSZWYod2luZG93KTsKKyAgICAgICAgfSAgICAgICAgCisgICAgfQorICAgIHJldHVybiBFR0xfTk9fU1VSRkFDRTsKK30KKworRUdMU3VyZmFjZSBlZ2xDcmVhdGVQaXhtYXBTdXJmYWNlKCAgRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYXRpdmVQaXhtYXBUeXBlIHBpeG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpCit7CisgICAgZWdsX2Rpc3BsYXlfdCBjb25zdCogZHAgPSAwOworICAgIGludCBpPTAsIGluZGV4PTA7CisgICAgZWdsX2Nvbm5lY3Rpb25fdCogY254ID0gdmFsaWRhdGVfZGlzcGxheV9jb25maWcoZHB5LCBjb25maWcsIGRwLCBpLCBpbmRleCk7CisgICAgaWYgKGNueCkgeworICAgICAgICBFR0xTdXJmYWNlIHN1cmZhY2UgPSBjbngtPmhvb2tzLT5lZ2wuZWdsQ3JlYXRlUGl4bWFwU3VyZmFjZSgKKyAgICAgICAgICAgICAgICBkcC0+ZHB5c1tpXSwgZHAtPmNvbmZpZ3NbaV1baW5kZXhdLCBwaXhtYXAsIGF0dHJpYl9saXN0KTsKKyAgICAgICAgaWYgKHN1cmZhY2UgIT0gRUdMX05PX1NVUkZBQ0UpIHsKKyAgICAgICAgICAgIGVnbF9zdXJmYWNlX3QqIHMgPSBuZXcgZWdsX3N1cmZhY2VfdChkcHksIHN1cmZhY2UsIE5VTEwsIGksIGNueCk7CisgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gRUdMX05PX1NVUkZBQ0U7Cit9CisKK0VHTFN1cmZhY2UgZWdsQ3JlYXRlUGJ1ZmZlclN1cmZhY2UoIEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCkKK3sKKyAgICBlZ2xfZGlzcGxheV90IGNvbnN0KiBkcCA9IDA7CisgICAgaW50IGk9MCwgaW5kZXg9MDsKKyAgICBlZ2xfY29ubmVjdGlvbl90KiBjbnggPSB2YWxpZGF0ZV9kaXNwbGF5X2NvbmZpZyhkcHksIGNvbmZpZywgZHAsIGksIGluZGV4KTsKKyAgICBpZiAoY254KSB7CisgICAgICAgIEVHTFN1cmZhY2Ugc3VyZmFjZSA9IGNueC0+aG9va3MtPmVnbC5lZ2xDcmVhdGVQYnVmZmVyU3VyZmFjZSgKKyAgICAgICAgICAgICAgICBkcC0+ZHB5c1tpXSwgZHAtPmNvbmZpZ3NbaV1baW5kZXhdLCBhdHRyaWJfbGlzdCk7CisgICAgICAgIGlmIChzdXJmYWNlICE9IEVHTF9OT19TVVJGQUNFKSB7CisgICAgICAgICAgICBlZ2xfc3VyZmFjZV90KiBzID0gbmV3IGVnbF9zdXJmYWNlX3QoZHB5LCBzdXJmYWNlLCBOVUxMLCBpLCBjbngpOworICAgICAgICAgICAgcmV0dXJuIHM7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEVHTF9OT19TVVJGQUNFOworfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitFR0xCb29sZWFuIGVnbERlc3Ryb3lTdXJmYWNlKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UpCit7CisgICAgaWYgKCF2YWxpZGF0ZV9kaXNwbGF5X3N1cmZhY2UoZHB5LCBzdXJmYWNlKSkKKyAgICAgICAgcmV0dXJuIEVHTF9GQUxTRTsgICAgCisgICAgZWdsX2Rpc3BsYXlfdCBjb25zdCAqIGNvbnN0IGRwID0gZ2V0X2Rpc3BsYXkoZHB5KTsKKyAgICBlZ2xfc3VyZmFjZV90IGNvbnN0ICogY29uc3QgcyA9IGdldF9zdXJmYWNlKHN1cmZhY2UpOworCisgICAgRUdMQm9vbGVhbiByZXN1bHQgPSBzLT5jbngtPmhvb2tzLT5lZ2wuZWdsRGVzdHJveVN1cmZhY2UoCisgICAgICAgICAgICBkcC0+ZHB5c1tzLT5pbXBsXSwgcy0+c3VyZmFjZSk7CisgICAgCisgICAgZGVsZXRlIHM7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworRUdMQm9vbGVhbiBlZ2xRdWVyeVN1cmZhY2UoIEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMaW50IGF0dHJpYnV0ZSwgRUdMaW50ICp2YWx1ZSkKK3sKKyAgICBpZiAoIXZhbGlkYXRlX2Rpc3BsYXlfc3VyZmFjZShkcHksIHN1cmZhY2UpKQorICAgICAgICByZXR1cm4gRUdMX0ZBTFNFOyAgICAKKyAgICBlZ2xfZGlzcGxheV90IGNvbnN0ICogY29uc3QgZHAgPSBnZXRfZGlzcGxheShkcHkpOworICAgIGVnbF9zdXJmYWNlX3QgY29uc3QgKiBjb25zdCBzID0gZ2V0X3N1cmZhY2Uoc3VyZmFjZSk7CisKKyAgICByZXR1cm4gcy0+Y254LT5ob29rcy0+ZWdsLmVnbFF1ZXJ5U3VyZmFjZSgKKyAgICAgICAgICAgIGRwLT5kcHlzW3MtPmltcGxdLCBzLT5zdXJmYWNlLCBhdHRyaWJ1dGUsIHZhbHVlKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29udGV4dGVzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VHTENvbnRleHQgZWdsQ3JlYXRlQ29udGV4dChFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xDb250ZXh0IHNoYXJlX2xpc3QsIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpCit7CisgICAgZWdsX2Rpc3BsYXlfdCBjb25zdCogZHAgPSAwOworICAgIGludCBpPTAsIGluZGV4PTA7CisgICAgZWdsX2Nvbm5lY3Rpb25fdCogY254ID0gdmFsaWRhdGVfZGlzcGxheV9jb25maWcoZHB5LCBjb25maWcsIGRwLCBpLCBpbmRleCk7CisgICAgaWYgKGNueCkgeworICAgICAgICBFR0xDb250ZXh0IGNvbnRleHQgPSBjbngtPmhvb2tzLT5lZ2wuZWdsQ3JlYXRlQ29udGV4dCgKKyAgICAgICAgICAgICAgICBkcC0+ZHB5c1tpXSwgZHAtPmNvbmZpZ3NbaV1baW5kZXhdLCBzaGFyZV9saXN0LCBhdHRyaWJfbGlzdCk7CisgICAgICAgIGlmIChjb250ZXh0ICE9IEVHTF9OT19DT05URVhUKSB7CisgICAgICAgICAgICBlZ2xfY29udGV4dF90KiBjID0gbmV3IGVnbF9jb250ZXh0X3QoZHB5LCBjb250ZXh0LCBpLCBjbngpOworICAgICAgICAgICAgcmV0dXJuIGM7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEVHTF9OT19DT05URVhUOworfQorCitFR0xCb29sZWFuIGVnbERlc3Ryb3lDb250ZXh0KEVHTERpc3BsYXkgZHB5LCBFR0xDb250ZXh0IGN0eCkKK3sKKyAgICBpZiAoIXZhbGlkYXRlX2Rpc3BsYXlfY29udGV4dChkcHksIGN0eCkpCisgICAgICAgIHJldHVybiBFR0xfRkFMU0U7CisgICAgZWdsX2Rpc3BsYXlfdCBjb25zdCAqIGNvbnN0IGRwID0gZ2V0X2Rpc3BsYXkoZHB5KTsKKyAgICBlZ2xfY29udGV4dF90ICogY29uc3QgYyA9IGdldF9jb250ZXh0KGN0eCk7CisgICAgRUdMQm9vbGVhbiByZXN1bHQgPSBjLT5jbngtPmhvb2tzLT5lZ2wuZWdsRGVzdHJveUNvbnRleHQoCisgICAgICAgICAgICBkcC0+ZHB5c1tjLT5pbXBsXSwgYy0+Y29udGV4dCk7CisgICAgZGVsZXRlIGM7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworRUdMQm9vbGVhbiBlZ2xNYWtlQ3VycmVudCggIEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIGRyYXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMU3VyZmFjZSByZWFkLCBFR0xDb250ZXh0IGN0eCkKK3sKKyAgICBlZ2xfZGlzcGxheV90IGNvbnN0ICogY29uc3QgZHAgPSBnZXRfZGlzcGxheShkcHkpOworICAgIGlmICghZHApIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9GQUxTRSk7CisKKyAgICBpZiAocmVhZCA9PSBFR0xfTk9fU1VSRkFDRSAmJiBkcmF3ICA9PSBFR0xfTk9fU1VSRkFDRSAmJgorICAgICAgICAgICAgY3R4ID09IEVHTF9OT19DT05URVhUKSAKKyAgICB7CisgICAgICAgIEVHTEJvb2xlYW4gcmVzdWx0ID0gRUdMX1RSVUU7CisgICAgICAgIGN0eCA9IGdldENvbnRleHQoKTsKKyAgICAgICAgaWYgKGN0eCkgeworICAgICAgICAgICAgZWdsX2NvbnRleHRfdCAqIGNvbnN0IGMgPSBnZXRfY29udGV4dChjdHgpOworICAgICAgICAgICAgcmVzdWx0ID0gYy0+Y254LT5ob29rcy0+ZWdsLmVnbE1ha2VDdXJyZW50KGRwLT5kcHlzW2MtPmltcGxdLCAwLCAwLCAwKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gRUdMX1RSVUUpIHsKKyAgICAgICAgICAgICAgICBzZXRHbFRocmVhZFNwZWNpZmljKCZnSG9va3NbSU1QTF9OT19DT05URVhUXSk7CisgICAgICAgICAgICAgICAgc2V0Q29udGV4dChFR0xfTk9fQ09OVEVYVCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBpZiAoIXZhbGlkYXRlX2Rpc3BsYXlfY29udGV4dChkcHksIGN0eCkpCisgICAgICAgIHJldHVybiBFR0xfRkFMU0U7ICAgIAorICAgIAorICAgIGVnbF9jb250ZXh0X3QgKiBjb25zdCBjID0gZ2V0X2NvbnRleHQoY3R4KTsKKyAgICBpZiAoZHJhdyAhPSBFR0xfTk9fU1VSRkFDRSkgeworICAgICAgICBlZ2xfc3VyZmFjZV90IGNvbnN0ICogZCA9IGdldF9zdXJmYWNlKGRyYXcpOworICAgICAgICBpZiAoIWQpIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX1NVUkZBQ0UsIEVHTF9GQUxTRSk7CisgICAgICAgIGlmIChkLT5pbXBsICE9IGMtPmltcGwpCisgICAgICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9NQVRDSCwgRUdMX0ZBTFNFKTsKKyAgICAgICAgZHJhdyA9IGQtPnN1cmZhY2U7CisgICAgfQorICAgIGlmIChyZWFkICE9IEVHTF9OT19TVVJGQUNFKSB7CisgICAgICAgIGVnbF9zdXJmYWNlX3QgY29uc3QgKiByID0gZ2V0X3N1cmZhY2UocmVhZCk7CisgICAgICAgIGlmICghcikgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfU1VSRkFDRSwgRUdMX0ZBTFNFKTsKKyAgICAgICAgaWYgKHItPmltcGwgIT0gYy0+aW1wbCkKKyAgICAgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX01BVENILCBFR0xfRkFMU0UpOworICAgICAgICByZWFkID0gci0+c3VyZmFjZTsKKyAgICB9CisgICAgRUdMQm9vbGVhbiByZXN1bHQgPSBjLT5jbngtPmhvb2tzLT5lZ2wuZWdsTWFrZUN1cnJlbnQoCisgICAgICAgICAgICBkcC0+ZHB5c1tjLT5pbXBsXSwgZHJhdywgcmVhZCwgYy0+Y29udGV4dCk7CisKKyAgICBpZiAocmVzdWx0ID09IEVHTF9UUlVFKSB7CisgICAgICAgIHNldEdsVGhyZWFkU3BlY2lmaWMoYy0+Y254LT5ob29rcyk7CisgICAgICAgIHNldENvbnRleHQoY3R4KTsKKyAgICAgICAgYy0+cmVhZCA9IHJlYWQ7CisgICAgICAgIGMtPmRyYXcgPSBkcmF3OworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK0VHTEJvb2xlYW4gZWdsUXVlcnlDb250ZXh0KCBFR0xEaXNwbGF5IGRweSwgRUdMQ29udGV4dCBjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMaW50IGF0dHJpYnV0ZSwgRUdMaW50ICp2YWx1ZSkKK3sKKyAgICBpZiAoIXZhbGlkYXRlX2Rpc3BsYXlfY29udGV4dChkcHksIGN0eCkpCisgICAgICAgIHJldHVybiBFR0xfRkFMU0U7ICAgIAorICAgIAorICAgIGVnbF9kaXNwbGF5X3QgY29uc3QgKiBjb25zdCBkcCA9IGdldF9kaXNwbGF5KGRweSk7CisgICAgZWdsX2NvbnRleHRfdCAqIGNvbnN0IGMgPSBnZXRfY29udGV4dChjdHgpOworCisgICAgcmV0dXJuIGMtPmNueC0+aG9va3MtPmVnbC5lZ2xRdWVyeUNvbnRleHQoCisgICAgICAgICAgICBkcC0+ZHB5c1tjLT5pbXBsXSwgYy0+Y29udGV4dCwgYXR0cmlidXRlLCB2YWx1ZSk7Cit9CisKK0VHTENvbnRleHQgZWdsR2V0Q3VycmVudENvbnRleHQodm9pZCkKK3sKKyAgICBFR0xDb250ZXh0IGN0eCA9IGdldENvbnRleHQoKTsKKyAgICByZXR1cm4gY3R4OworfQorCitFR0xTdXJmYWNlIGVnbEdldEN1cnJlbnRTdXJmYWNlKEVHTGludCByZWFkZHJhdykKK3sKKyAgICBFR0xDb250ZXh0IGN0eCA9IGdldENvbnRleHQoKTsKKyAgICBpZiAoY3R4KSB7CisgICAgICAgIGVnbF9jb250ZXh0X3QgY29uc3QgKiBjb25zdCBjID0gZ2V0X2NvbnRleHQoY3R4KTsKKyAgICAgICAgaWYgKCFjKSByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9DT05URVhULCBFR0xfTk9fU1VSRkFDRSk7CisgICAgICAgIHN3aXRjaCAocmVhZGRyYXcpIHsKKyAgICAgICAgICAgIGNhc2UgRUdMX1JFQUQ6IHJldHVybiBjLT5yZWFkOworICAgICAgICAgICAgY2FzZSBFR0xfRFJBVzogcmV0dXJuIGMtPmRyYXc7ICAgICAgICAgICAgCisgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9QQVJBTUVURVIsIEVHTF9OT19TVVJGQUNFKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gRUdMX05PX1NVUkZBQ0U7Cit9CisKK0VHTERpc3BsYXkgZWdsR2V0Q3VycmVudERpc3BsYXkodm9pZCkKK3sKKyAgICBFR0xDb250ZXh0IGN0eCA9IGdldENvbnRleHQoKTsKKyAgICBpZiAoY3R4KSB7CisgICAgICAgIGVnbF9jb250ZXh0X3QgY29uc3QgKiBjb25zdCBjID0gZ2V0X2NvbnRleHQoY3R4KTsKKyAgICAgICAgaWYgKCFjKSByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9DT05URVhULCBFR0xfTk9fU1VSRkFDRSk7CisgICAgICAgIHJldHVybiBjLT5kcHk7CisgICAgfQorICAgIHJldHVybiBFR0xfTk9fRElTUExBWTsKK30KKworRUdMQm9vbGVhbiBlZ2xXYWl0R0wodm9pZCkKK3sKKyAgICBFR0xCb29sZWFuIHJlcyA9IEVHTF9UUlVFOworICAgIEVHTENvbnRleHQgY3R4ID0gZ2V0Q29udGV4dCgpOworICAgIGlmIChjdHgpIHsKKyAgICAgICAgZWdsX2NvbnRleHRfdCBjb25zdCAqIGNvbnN0IGMgPSBnZXRfY29udGV4dChjdHgpOworICAgICAgICBpZiAoIWMpIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0NPTlRFWFQsIEVHTF9GQUxTRSk7CisgICAgICAgIGlmICh1aW50MzJfdChjLT5pbXBsKT49MikKKyAgICAgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0NPTlRFWFQsIEVHTF9GQUxTRSk7CisgICAgICAgIGVnbF9jb25uZWN0aW9uX3QqIGNvbnN0IGNueCA9ICZnRUdMSW1wbFtjLT5pbXBsXTsKKyAgICAgICAgaWYgKCFjbngtPmRzbykgCisgICAgICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9DT05URVhULCBFR0xfRkFMU0UpOworICAgICAgICByZXMgPSBjbngtPmhvb2tzLT5lZ2wuZWdsV2FpdEdMKCk7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK0VHTEJvb2xlYW4gZWdsV2FpdE5hdGl2ZShFR0xpbnQgZW5naW5lKQoreworICAgIEVHTEJvb2xlYW4gcmVzID0gRUdMX1RSVUU7CisgICAgRUdMQ29udGV4dCBjdHggPSBnZXRDb250ZXh0KCk7CisgICAgaWYgKGN0eCkgeworICAgICAgICBlZ2xfY29udGV4dF90IGNvbnN0ICogY29uc3QgYyA9IGdldF9jb250ZXh0KGN0eCk7CisgICAgICAgIGlmICghYykgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfQ09OVEVYVCwgRUdMX0ZBTFNFKTsKKyAgICAgICAgaWYgKHVpbnQzMl90KGMtPmltcGwpPj0yKQorICAgICAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfQ09OVEVYVCwgRUdMX0ZBTFNFKTsKKyAgICAgICAgZWdsX2Nvbm5lY3Rpb25fdCogY29uc3QgY254ID0gJmdFR0xJbXBsW2MtPmltcGxdOworICAgICAgICBpZiAoIWNueC0+ZHNvKSAKKyAgICAgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0NPTlRFWFQsIEVHTF9GQUxTRSk7CisgICAgICAgIHJlcyA9IGNueC0+aG9va3MtPmVnbC5lZ2xXYWl0TmF0aXZlKGVuZ2luZSk7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK0VHTGludCBlZ2xHZXRFcnJvcih2b2lkKQoreworICAgIEVHTGludCByZXN1bHQgPSBFR0xfU1VDQ0VTUzsKKyAgICBmb3IgKGludCBpPTAgOyBpPDIgOyBpKyspIHsKKyAgICAgICAgRUdMaW50IGVyciA9IEVHTF9TVUNDRVNTOworICAgICAgICBlZ2xfY29ubmVjdGlvbl90KiBjb25zdCBjbnggPSAmZ0VHTEltcGxbaV07CisgICAgICAgIGlmIChjbngtPmRzbykKKyAgICAgICAgICAgIGVyciA9IGNueC0+aG9va3MtPmVnbC5lZ2xHZXRFcnJvcigpOworICAgICAgICBpZiAoZXJyIT1FR0xfU1VDQ0VTUyAmJiByZXN1bHQ9PUVHTF9TVUNDRVNTKQorICAgICAgICAgICAgcmVzdWx0ID0gZXJyOworICAgIH0KKyAgICBpZiAocmVzdWx0ID09IEVHTF9TVUNDRVNTKQorICAgICAgICByZXN1bHQgPSBnZXRFcnJvcigpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgKCplZ2xHZXRQcm9jQWRkcmVzcyhjb25zdCBjaGFyICpwcm9jbmFtZSkpKCkKK3sKKyAgICBfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlIGFkZHI7CisgICAgYWRkciA9IGZpbmRQcm9jQWRkcmVzcyhwcm9jbmFtZSwgZ0V4dGVudGlvbk1hcCwgTkVMRU0oZ0V4dGVudGlvbk1hcCkpOworICAgIGlmIChhZGRyKSByZXR1cm4gYWRkcjsKKworICAgIHJldHVybiBOVUxMOyAvLyBUT0RPOiBmaW5pc2ggaW1wbGVtZW50YXRpb24gYmVsb3cKKworICAgIGFkZHIgPSBmaW5kUHJvY0FkZHJlc3MocHJvY25hbWUsIGdHTEV4dGVudGlvbk1hcCwgTkVMRU0oZ0dMRXh0ZW50aW9uTWFwKSk7CisgICAgaWYgKGFkZHIpIHJldHVybiBhZGRyOworICAgIAorICAgIGFkZHIgPSAwOworICAgIGludCBzbG90ID0gLTE7CisgICAgZm9yIChpbnQgaT0wIDsgaTwyIDsgaSsrKSB7CisgICAgICAgIGVnbF9jb25uZWN0aW9uX3QqIGNvbnN0IGNueCA9ICZnRUdMSW1wbFtpXTsKKyAgICAgICAgaWYgKGNueC0+ZHNvKSB7CisgICAgICAgICAgICBpZiAoY254LT5ob29rcy0+ZWdsLmVnbEdldFByb2NBZGRyZXNzKSB7CisgICAgICAgICAgICAgICAgYWRkciA9IGNueC0+aG9va3MtPmVnbC5lZ2xHZXRQcm9jQWRkcmVzcyhwcm9jbmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKGFkZHIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNsb3QgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNsb3QgPSAwOyAvLyBYWFg6IGZpbmQgZnJlZSBzbG90CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2xvdCA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNueC0+aG9va3MtPmV4dC5leHRlbnNpb25zW3Nsb3RdID0gYWRkcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgaWYgKHNsb3QgPj0gMCkgeworICAgICAgICBhZGRyID0gMDsgLy8gWFhYOiBhZGRyZXNzIG9mIHN0dWIgJ3Nsb3QnCisgICAgICAgIGdHTEV4dGVudGlvbk1hcFtzbG90XS5uYW1lID0gc3RyZHVwKHByb2NuYW1lKTsKKyAgICAgICAgZ0dMRXh0ZW50aW9uTWFwW3Nsb3RdLmFkZHJlc3MgPSBhZGRyOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gYWRkcjsKKworICAgIAorICAgIC8qCisgICAgICogIFRPRE86IEZvciBPcGVuR0wgRVMgZXh0ZW5zaW9ucywgd2UgbXVzdCBnZW5lcmF0ZSBhIHN0dWIKKyAgICAgKiAgdGhhdCBsb29rcyBsaWtlCisgICAgICogICAgICBtb3YgICAgIHIxMiwgIzB4RkZGRjBGRkYKKyAgICAgKiAgICAgIGxkciAgICAgcjEyLCBbcjEyLCAjLTE1XQorICAgICAqICAgICAgbGRyICAgICByMTIsIFtyMTIsICNUTFNfU0xPVF9PUEVOR0xfQVBJKjRdCisgICAgICogICAgICBtb3YgICAgIHIxMiwgW3IxMiwgI2FwaV9vZmZzZXRdCisgICAgICogICAgICBsZHJuZSAgIHBjLCByMTIKKyAgICAgKiAgICAgIG1vdiAgICAgcGMsICN1bnN1cHBvcnRlZF9leHRlbnNpb24KKyAgICAgKiAKKyAgICAgKiAgYW5kIHdyaXRlIHRoZSBhZGRyZXNzIG9mIHRoZSBleHRlbnNpb24gaW4gKmFsbCoKKyAgICAgKiAgZ2xfaG9va3NfdDo6Z2xfZXh0X3QgYXQgb2Zmc2V0ICJhcGlfb2Zmc2V0IiBmcm9tIGdsX2hvb2tzX3QKKyAgICAgKiAKKyAgICAgKi8KK30KKworRUdMQm9vbGVhbiBlZ2xTd2FwQnVmZmVycyhFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBkcmF3KQoreworICAgIGlmICghdmFsaWRhdGVfZGlzcGxheV9zdXJmYWNlKGRweSwgZHJhdykpCisgICAgICAgIHJldHVybiBFR0xfRkFMU0U7ICAgIAorICAgIGVnbF9kaXNwbGF5X3QgY29uc3QgKiBjb25zdCBkcCA9IGdldF9kaXNwbGF5KGRweSk7CisgICAgZWdsX3N1cmZhY2VfdCBjb25zdCAqIGNvbnN0IHMgPSBnZXRfc3VyZmFjZShkcmF3KTsKKyAgICByZXR1cm4gcy0+Y254LT5ob29rcy0+ZWdsLmVnbFN3YXBCdWZmZXJzKGRwLT5kcHlzW3MtPmltcGxdLCBzLT5zdXJmYWNlKTsKK30KKworRUdMQm9vbGVhbiBlZ2xDb3B5QnVmZmVycyggIEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmF0aXZlUGl4bWFwVHlwZSB0YXJnZXQpCit7CisgICAgaWYgKCF2YWxpZGF0ZV9kaXNwbGF5X3N1cmZhY2UoZHB5LCBzdXJmYWNlKSkKKyAgICAgICAgcmV0dXJuIEVHTF9GQUxTRTsgICAgCisgICAgZWdsX2Rpc3BsYXlfdCBjb25zdCAqIGNvbnN0IGRwID0gZ2V0X2Rpc3BsYXkoZHB5KTsKKyAgICBlZ2xfc3VyZmFjZV90IGNvbnN0ICogY29uc3QgcyA9IGdldF9zdXJmYWNlKHN1cmZhY2UpOworICAgIHJldHVybiBzLT5jbngtPmhvb2tzLT5lZ2wuZWdsQ29weUJ1ZmZlcnMoCisgICAgICAgICAgICBkcC0+ZHB5c1tzLT5pbXBsXSwgcy0+c3VyZmFjZSwgdGFyZ2V0KTsKK30KKworY29uc3QgY2hhciogZWdsUXVlcnlTdHJpbmcoRUdMRGlzcGxheSBkcHksIEVHTGludCBuYW1lKQoreworICAgIGVnbF9kaXNwbGF5X3QgY29uc3QgKiBjb25zdCBkcCA9IGdldF9kaXNwbGF5KGRweSk7CisgICAgc3dpdGNoIChuYW1lKSB7CisgICAgICAgIGNhc2UgRUdMX1ZFTkRPUjoKKyAgICAgICAgICAgIHJldHVybiBnVmVuZG9yU3RyaW5nOworICAgICAgICBjYXNlIEVHTF9WRVJTSU9OOgorICAgICAgICAgICAgcmV0dXJuIGdWZXJzaW9uU3RyaW5nOworICAgICAgICBjYXNlIEVHTF9FWFRFTlNJT05TOgorICAgICAgICAgICAgcmV0dXJuIGdFeHRlbnNpb25TdHJpbmc7CisgICAgICAgIGNhc2UgRUdMX0NMSUVOVF9BUElTOgorICAgICAgICAgICAgcmV0dXJuIGdDbGllbnRBcGlTdHJpbmc7CisgICAgfQorICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX1BBUkFNRVRFUiwgKGNvbnN0IGNoYXIgKikwKTsKK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFR0wgMS4xCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VHTEJvb2xlYW4gZWdsU3VyZmFjZUF0dHJpYigKKyAgICAgICAgRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyZmFjZSwgRUdMaW50IGF0dHJpYnV0ZSwgRUdMaW50IHZhbHVlKQoreworICAgIGlmICghdmFsaWRhdGVfZGlzcGxheV9zdXJmYWNlKGRweSwgc3VyZmFjZSkpCisgICAgICAgIHJldHVybiBFR0xfRkFMU0U7ICAgIAorICAgIGVnbF9kaXNwbGF5X3QgY29uc3QgKiBjb25zdCBkcCA9IGdldF9kaXNwbGF5KGRweSk7CisgICAgZWdsX3N1cmZhY2VfdCBjb25zdCAqIGNvbnN0IHMgPSBnZXRfc3VyZmFjZShzdXJmYWNlKTsKKyAgICBpZiAocy0+Y254LT5ob29rcy0+ZWdsLmVnbFN1cmZhY2VBdHRyaWIpIHsKKyAgICAgICAgcmV0dXJuIHMtPmNueC0+aG9va3MtPmVnbC5lZ2xTdXJmYWNlQXR0cmliKAorICAgICAgICAgICAgICAgIGRwLT5kcHlzW3MtPmltcGxdLCBzLT5zdXJmYWNlLCBhdHRyaWJ1dGUsIHZhbHVlKTsKKyAgICB9CisgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfU1VSRkFDRSwgRUdMX0ZBTFNFKTsKK30KKworRUdMQm9vbGVhbiBlZ2xCaW5kVGV4SW1hZ2UoCisgICAgICAgIEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UsIEVHTGludCBidWZmZXIpCit7CisgICAgaWYgKCF2YWxpZGF0ZV9kaXNwbGF5X3N1cmZhY2UoZHB5LCBzdXJmYWNlKSkKKyAgICAgICAgcmV0dXJuIEVHTF9GQUxTRTsgICAgCisgICAgZWdsX2Rpc3BsYXlfdCBjb25zdCAqIGNvbnN0IGRwID0gZ2V0X2Rpc3BsYXkoZHB5KTsKKyAgICBlZ2xfc3VyZmFjZV90IGNvbnN0ICogY29uc3QgcyA9IGdldF9zdXJmYWNlKHN1cmZhY2UpOworICAgIGlmIChzLT5jbngtPmhvb2tzLT5lZ2wuZWdsQmluZFRleEltYWdlKSB7CisgICAgICAgIHJldHVybiBzLT5jbngtPmhvb2tzLT5lZ2wuZWdsQmluZFRleEltYWdlKAorICAgICAgICAgICAgICAgIGRwLT5kcHlzW3MtPmltcGxdLCBzLT5zdXJmYWNlLCBidWZmZXIpOworICAgIH0KKyAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9TVVJGQUNFLCBFR0xfRkFMU0UpOworfQorCitFR0xCb29sZWFuIGVnbFJlbGVhc2VUZXhJbWFnZSgKKyAgICAgICAgRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyZmFjZSwgRUdMaW50IGJ1ZmZlcikKK3sKKyAgICBpZiAoIXZhbGlkYXRlX2Rpc3BsYXlfc3VyZmFjZShkcHksIHN1cmZhY2UpKQorICAgICAgICByZXR1cm4gRUdMX0ZBTFNFOyAgICAKKyAgICBlZ2xfZGlzcGxheV90IGNvbnN0ICogY29uc3QgZHAgPSBnZXRfZGlzcGxheShkcHkpOworICAgIGVnbF9zdXJmYWNlX3QgY29uc3QgKiBjb25zdCBzID0gZ2V0X3N1cmZhY2Uoc3VyZmFjZSk7CisgICAgaWYgKHMtPmNueC0+aG9va3MtPmVnbC5lZ2xSZWxlYXNlVGV4SW1hZ2UpIHsKKyAgICAgICAgcmV0dXJuIHMtPmNueC0+aG9va3MtPmVnbC5lZ2xSZWxlYXNlVGV4SW1hZ2UoCisgICAgICAgICAgICAgICAgZHAtPmRweXNbcy0+aW1wbF0sIHMtPnN1cmZhY2UsIGJ1ZmZlcik7CisgICAgfQorICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX1NVUkZBQ0UsIEVHTF9GQUxTRSk7Cit9CisKK0VHTEJvb2xlYW4gZWdsU3dhcEludGVydmFsKEVHTERpc3BsYXkgZHB5LCBFR0xpbnQgaW50ZXJ2YWwpCit7CisgICAgZWdsX2Rpc3BsYXlfdCAqIGNvbnN0IGRwID0gZ2V0X2Rpc3BsYXkoZHB5KTsKKyAgICBpZiAoIWRwKSByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOworCisgICAgRUdMQm9vbGVhbiByZXMgPSBFR0xfVFJVRTsKKyAgICBmb3IgKGludCBpPTAgOyBpPDIgOyBpKyspIHsKKyAgICAgICAgZWdsX2Nvbm5lY3Rpb25fdCogY29uc3QgY254ID0gJmdFR0xJbXBsW2ldOworICAgICAgICBpZiAoY254LT5kc28pIHsKKyAgICAgICAgICAgIGlmIChjbngtPmhvb2tzLT5lZ2wuZWdsU3dhcEludGVydmFsKSB7CisgICAgICAgICAgICAgICAgaWYgKGNueC0+aG9va3MtPmVnbC5lZ2xTd2FwSW50ZXJ2YWwoZHAtPmRweXNbaV0sIGludGVydmFsKSA9PSBFR0xfRkFMU0UpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gRUdMX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVHTCAxLjIKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRUdMQm9vbGVhbiBlZ2xXYWl0Q2xpZW50KHZvaWQpCit7CisgICAgRUdMQm9vbGVhbiByZXMgPSBFR0xfVFJVRTsKKyAgICBFR0xDb250ZXh0IGN0eCA9IGdldENvbnRleHQoKTsKKyAgICBpZiAoY3R4KSB7CisgICAgICAgIGVnbF9jb250ZXh0X3QgY29uc3QgKiBjb25zdCBjID0gZ2V0X2NvbnRleHQoY3R4KTsKKyAgICAgICAgaWYgKCFjKSByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9DT05URVhULCBFR0xfRkFMU0UpOworICAgICAgICBpZiAodWludDMyX3QoYy0+aW1wbCk+PTIpCisgICAgICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9DT05URVhULCBFR0xfRkFMU0UpOworICAgICAgICBlZ2xfY29ubmVjdGlvbl90KiBjb25zdCBjbnggPSAmZ0VHTEltcGxbYy0+aW1wbF07CisgICAgICAgIGlmICghY254LT5kc28pIAorICAgICAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfQ09OVEVYVCwgRUdMX0ZBTFNFKTsKKyAgICAgICAgaWYgKGNueC0+aG9va3MtPmVnbC5lZ2xXYWl0Q2xpZW50KSB7CisgICAgICAgICAgICByZXMgPSBjbngtPmhvb2tzLT5lZ2wuZWdsV2FpdENsaWVudCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzID0gY254LT5ob29rcy0+ZWdsLmVnbFdhaXRHTCgpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK0VHTEJvb2xlYW4gZWdsQmluZEFQSShFR0xlbnVtIGFwaSkKK3sKKyAgICAvLyBiaW5kIHRoaXMgQVBJIG9uIGFsbCBFR0xzCisgICAgRUdMQm9vbGVhbiByZXMgPSBFR0xfVFJVRTsKKyAgICBmb3IgKGludCBpPTAgOyBpPDIgOyBpKyspIHsKKyAgICAgICAgZWdsX2Nvbm5lY3Rpb25fdCogY29uc3QgY254ID0gJmdFR0xJbXBsW2ldOworICAgICAgICBpZiAoY254LT5kc28pIHsKKyAgICAgICAgICAgIGlmIChjbngtPmhvb2tzLT5lZ2wuZWdsQmluZEFQSSkgeworICAgICAgICAgICAgICAgIGlmIChjbngtPmhvb2tzLT5lZ2wuZWdsQmluZEFQSShhcGkpID09IEVHTF9GQUxTRSkgeworICAgICAgICAgICAgICAgICAgICByZXMgPSBFR0xfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK0VHTGVudW0gZWdsUXVlcnlBUEkodm9pZCkKK3sKKyAgICBmb3IgKGludCBpPTAgOyBpPDIgOyBpKyspIHsKKyAgICAgICAgZWdsX2Nvbm5lY3Rpb25fdCogY29uc3QgY254ID0gJmdFR0xJbXBsW2ldOworICAgICAgICBpZiAoY254LT5kc28pIHsKKyAgICAgICAgICAgIGlmIChjbngtPmhvb2tzLT5lZ2wuZWdsUXVlcnlBUEkpIHsKKyAgICAgICAgICAgICAgICAvLyB0aGUgZmlyc3Qgb25lIHdlIGZpbmQgaXMgb2theSwgYmVjYXVzZSB0aGV5IGFsbAorICAgICAgICAgICAgICAgIC8vIHNob3VsZCBiZSB0aGUgc2FtZQorICAgICAgICAgICAgICAgIHJldHVybiBjbngtPmhvb2tzLT5lZ2wuZWdsUXVlcnlBUEkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBvciwgaXQgY2FuIG9ubHkgYmUgT3BlbkdMIEVTCisgICAgcmV0dXJuIEVHTF9PUEVOR0xfRVNfQVBJOworfQorCitFR0xCb29sZWFuIGVnbFJlbGVhc2VUaHJlYWQodm9pZCkKK3sKKyAgICBmb3IgKGludCBpPTAgOyBpPDIgOyBpKyspIHsKKyAgICAgICAgZWdsX2Nvbm5lY3Rpb25fdCogY29uc3QgY254ID0gJmdFR0xJbXBsW2ldOworICAgICAgICBpZiAoY254LT5kc28pIHsKKyAgICAgICAgICAgIGlmIChjbngtPmhvb2tzLT5lZ2wuZWdsUmVsZWFzZVRocmVhZCkgeworICAgICAgICAgICAgICAgIGNueC0+aG9va3MtPmVnbC5lZ2xSZWxlYXNlVGhyZWFkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgY2xlYXJUTFMoKTsgICAgCisgICAgcmV0dXJuIEVHTF9UUlVFOworfQorCitFR0xTdXJmYWNlIGVnbENyZWF0ZVBidWZmZXJGcm9tQ2xpZW50QnVmZmVyKAorICAgICAgICAgIEVHTERpc3BsYXkgZHB5LCBFR0xlbnVtIGJ1ZnR5cGUsIEVHTENsaWVudEJ1ZmZlciBidWZmZXIsCisgICAgICAgICAgRUdMQ29uZmlnIGNvbmZpZywgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCkKK3sKKyAgICBlZ2xfZGlzcGxheV90IGNvbnN0KiBkcCA9IDA7CisgICAgaW50IGk9MCwgaW5kZXg9MDsKKyAgICBlZ2xfY29ubmVjdGlvbl90KiBjbnggPSB2YWxpZGF0ZV9kaXNwbGF5X2NvbmZpZyhkcHksIGNvbmZpZywgZHAsIGksIGluZGV4KTsKKyAgICBpZiAoIWNueCkgcmV0dXJuIEVHTF9GQUxTRTsKKyAgICBpZiAoY254LT5ob29rcy0+ZWdsLmVnbENyZWF0ZVBidWZmZXJGcm9tQ2xpZW50QnVmZmVyKSB7CisgICAgICAgIHJldHVybiBjbngtPmhvb2tzLT5lZ2wuZWdsQ3JlYXRlUGJ1ZmZlckZyb21DbGllbnRCdWZmZXIoCisgICAgICAgICAgICAgICAgZHAtPmRweXNbaV0sIGJ1ZnR5cGUsIGJ1ZmZlciwgZHAtPmNvbmZpZ3NbaV1baW5kZXhdLCBhdHRyaWJfbGlzdCk7CisgICAgfQorICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0NPTkZJRywgRUdMX05PX1NVUkZBQ0UpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvRUdML2dwdS5jcHAgYi9vcGVuZ2wvbGlicy9FR0wvZ3B1LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjlmZDYzCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2xpYnMvRUdML2dwdS5jcHAKQEAgLTAsMCArMSwyMTIgQEAKKy8qIAorICoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKioKKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisgKioKKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorICoqCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkVHTCIKKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorCisjaWYgSEFWRV9BTkRST0lEX09TCisjaW5jbHVkZSA8bGludXgvYW5kcm9pZF9wbWVtLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorCisjaW5jbHVkZSA8dXRpbHMvSU1lbW9yeS5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKyNpbmNsdWRlIDx1dGlscy9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPHV0aWxzL1BhcmNlbC5oPgorCisjaW5jbHVkZSA8dWkvRUdMRGlzcGxheVN1cmZhY2UuaD4KKyNpbmNsdWRlIDx1aS9JU3VyZmFjZUNvbXBvc2VyLmg+CisKKyNpbmNsdWRlICJob29rcy5oIgorI2luY2x1ZGUgImVnbF9pbXBsLmgiCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK25hbWVzcGFjZSBhbmRyb2lkIHsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoKKyAqIHdlIHByb3ZpZGUgb3VyIG93biBhbGxvY2F0b3JzIGZvciB0aGUgR1BVIHJlZ2lvbnMsIHRoZXNlCisgKiBhbGxvY2F0b3JzIGdvIHRocm91Z2ggc3VyZmFjZWZsaW5nZXIgCisgKi8KKworc3RhdGljIE11dGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdSZWdpb25zTG9jazsKK3N0YXRpYyByZXF1ZXN0X2dwdV90ICAgICAgICAgICAgICAgICAgICBnUmVnaW9uczsKK3N0YXRpYyBzcDxJU3VyZmFjZUNvbXBvc2VyPiAgICAgICAgICAgICBnU3VyZmFjZU1hbmFnZXI7CitJU3VyZmFjZUNvbXBvc2VyKiAgICAgICAgICAgICAgICAgICAgICAgR0xFU19sb2NhbFN1cmZhY2VNYW5hZ2VyID0gMDsKKworZXh0ZXJuIGVnbF9jb25uZWN0aW9uX3QgZ0VHTEltcGxbMl07CisKK2NvbnN0IHNwPElTdXJmYWNlQ29tcG9zZXI+JiBnZXRTdXJmYWNlRmxpbmdlcigpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdSZWdpb25zTG9jayk7CisKKyAgICAvKgorICAgICAqIFRoZXJlIGlzIGEgbGl0dGxlIGJpdCBvZiB2b29kb28gbWFnaWMgaGVyZS4gV2Ugd2FudCB0byBhY2Nlc3MKKyAgICAgKiBzdXJmYWNlZmxpbmdlciBmb3IgYWxsb2NhdGluZyBHUFUgcmVnaW9ucywgaG93ZXZlciwgd2hlbiB3ZSBhcmUKKyAgICAgKiBydW5uaW5nIGFzIHBhcnQgb2Ygc3VyZmFjZWZsaW5nZXIsIHdlIHdhbnQgdG8gYnlwYXNzIHRoZQorICAgICAqIHNlcnZpY2UgbWFuYWdlciBiZWNhdXNlIHN1cmZhY2VmbGluZ2VyIG1pZ2h0IG5vdCBiZSByZWdpc3RlcmVkIHlldC4KKyAgICAgKiBTdXJmYWNlRmxpbmdlciB3aWxsIHBvcHVsYXRlICJHTEVTX2xvY2FsU3VyZmFjZU1hbmFnZXIiIHdpdGggaXRzCisgICAgICogb3duIGFkZHJlc3MsIHNvIHdlIGNhbiBqdXN0IHVzZSB0aGF0LgorICAgICAqLworICAgIGlmIChnU3VyZmFjZU1hbmFnZXIgPT0gMCkgeworICAgICAgICBpZiAoR0xFU19sb2NhbFN1cmZhY2VNYW5hZ2VyKSB7CisgICAgICAgICAgICAvLyB3ZSdyZSBydW5uaW5nIGluIFN1cmZhY2VGbGluZ2VyJ3MgY29udGV4dAorICAgICAgICAgICAgZ1N1cmZhY2VNYW5hZ2VyID0gIEdMRVNfbG9jYWxTdXJmYWNlTWFuYWdlcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHdlJ3JlIGEgcmVtb3RlIHByb2Nlc3Mgb3Igbm90IHBhcnQgb2Ygc3VyZmFjZWZsaW5nZXIsCisgICAgICAgICAgICAvLyBnbyB0aHJvdWdoIHRoZSBzZXJ2aWNlIG1hbmFnZXIKKyAgICAgICAgICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKKyAgICAgICAgICAgIGlmIChzbSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gc20tPmdldFNlcnZpY2UoU3RyaW5nMTYoIlN1cmZhY2VGbGluZ2VyIikpOworICAgICAgICAgICAgICAgIGdTdXJmYWNlTWFuYWdlciA9IGludGVyZmFjZV9jYXN0PElTdXJmYWNlQ29tcG9zZXI+KGJpbmRlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGdTdXJmYWNlTWFuYWdlcjsKK30KKworY2xhc3MgR1BVUmV2b2tlUmVxdWVzdGVyIDogcHVibGljIEJuR1BVQ2FsbGJhY2sKK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgZ3B1TG9zdCgpIHsKKyAgICAgICAgTE9HRCgiQ09OVEVYVF9MT1NUOiBSZWxlYXNpbmcgR1BVIHVwb24gcmVxdWVzdCBmcm9tIFN1cmZhY2VGbGluZ2VyLiIpOworICAgICAgICBnRUdMSW1wbFtJTVBMX0hBUkRXQVJFXS5ob29rcyA9ICZnSG9va3NbSU1QTF9DT05URVhUX0xPU1RdOworICAgIH0KK307CisKK3N0YXRpYyBzcDxHUFVSZXZva2VSZXF1ZXN0ZXI+IGdSZXZva2VyQ2FsbGJhY2s7CisKKworcmVxdWVzdF9ncHVfdCogZ3B1X2FjcXVpcmUodm9pZCogdXNlcikKK3sKKyAgICBzcDxJU3VyZmFjZUNvbXBvc2VyPiBzZXJ2ZXIoIGdldFN1cmZhY2VGbGluZ2VyKCkgKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBfbChnUmVnaW9uc0xvY2spOworICAgIGlmIChzZXJ2ZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgCisgICAgSVN1cmZhY2VDb21wb3Nlcjo6Z3B1X2luZm9fdCBpbmZvOworICAgIAorICAgIGlmIChnUmV2b2tlckNhbGxiYWNrID09IDApCisgICAgICAgIGdSZXZva2VyQ2FsbGJhY2sgPSBuZXcgR1BVUmV2b2tlUmVxdWVzdGVyKCk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBzZXJ2ZXItPnJlcXVlc3RHUFUoZ1Jldm9rZXJDYWxsYmFjaywgJmluZm8pOworICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgTE9HRCgicmVxdWVzdEdQVSByZXR1cm5lZCAlZCIsIGVycik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisgICAgcmVxdWVzdF9ncHVfdCogZ3B1ID0gJmdSZWdpb25zOworICAgIG1lbXNldChncHUsIDAsIHNpemVvZigqZ3B1KSk7CisgICAgCisgICAgaWYgKGluZm8ucmVncyAhPSAwKSB7CisgICAgICAgIHNwPElNZW1vcnlIZWFwPiBoZWFwKGluZm8ucmVncy0+Z2V0TWVtb3J5KCkpOworICAgICAgICBpZiAoaGVhcCAhPSAwKSB7CisgICAgICAgICAgICBpbnQgZmQgPSBoZWFwLT5oZWFwSUQoKTsKKyAgICAgICAgICAgIGdwdS0+cmVncy5mZCA9IGZkOworICAgICAgICAgICAgZ3B1LT5yZWdzLmJhc2UgPSBpbmZvLnJlZ3MtPnBvaW50ZXIoKTsgCisgICAgICAgICAgICBncHUtPnJlZ3Muc2l6ZSA9IGluZm8ucmVncy0+c2l6ZSgpOyAKKyAgICAgICAgICAgIGdwdS0+cmVncy51c2VyID0gaW5mby5yZWdzLmdldCgpOworI2lmIEhBVkVfQU5EUk9JRF9PUworICAgICAgICAgICAgc3RydWN0IHBtZW1fcmVnaW9uIHJlZ2lvbjsKKyAgICAgICAgICAgIGlmIChpb2N0bChmZCwgUE1FTV9HRVRfUEhZUywgJnJlZ2lvbikgPj0gMCkKKyAgICAgICAgICAgICAgICBncHUtPnJlZ3MucGh5cyA9ICh2b2lkKilyZWdpb24ub2Zmc2V0OworI2VuZGlmCisgICAgICAgICAgICBpbmZvLnJlZ3MtPmluY1N0cm9uZyhncHUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HRSgiR1BVIHJlZ2lzdGVyIGhhbmRsZSAlcCBpcyBpbnZhbGlkISIsIGluZm8ucmVncy5nZXQoKSk7CisgICAgICAgICAgICBmYWlsZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaT0wIDsgaTxpbmZvLmNvdW50ICYmICFmYWlsZWQgOyBpKyspIHsKKyAgICAgICAgc3A8SU1lbW9yeT4mIHJlZ2lvbihpbmZvLnJlZ2lvbnNbaV0ucmVnaW9uKTsKKyAgICAgICAgaWYgKHJlZ2lvbiAhPSAwKSB7CisgICAgICAgICAgICBzcDxJTWVtb3J5SGVhcD4gaGVhcChyZWdpb24tPmdldE1lbW9yeSgpKTsKKyAgICAgICAgICAgIGlmIChoZWFwICE9IDApIHsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgZmQgPSBoZWFwLT5oZWFwSUQoKTsKKyAgICAgICAgICAgICAgICBncHUtPmdwdVtpXS5mZCA9IGZkOworICAgICAgICAgICAgICAgIGdwdS0+Z3B1W2ldLmJhc2UgPSByZWdpb24tPnBvaW50ZXIoKTsgCisgICAgICAgICAgICAgICAgZ3B1LT5ncHVbaV0uc2l6ZSA9IHJlZ2lvbi0+c2l6ZSgpOyAKKyAgICAgICAgICAgICAgICBncHUtPmdwdVtpXS51c2VyID0gcmVnaW9uLmdldCgpOworICAgICAgICAgICAgICAgIGdwdS0+Z3B1W2ldLm9mZnNldCA9IGluZm8ucmVnaW9uc1tpXS5yZXNlcnZlZDsKKyNpZiBIQVZFX0FORFJPSURfT1MKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgcG1lbV9yZWdpb24gcmVnOworICAgICAgICAgICAgICAgIGlmIChpb2N0bChmZCwgUE1FTV9HRVRfUEhZUywgJnJlZykgPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgZ3B1LT5ncHVbaV0ucGh5cyA9ICh2b2lkKilyZWcub2Zmc2V0OworI2VuZGlmCisgICAgICAgICAgICAgICAgcmVnaW9uLT5pbmNTdHJvbmcoZ3B1KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HRSgiR1BVIHJlZ2lvbiBoYW5kbGUgWyVkLCAlcF0gaXMgaW52YWxpZCEiLCBpLCByZWdpb24uZ2V0KCkpOworICAgICAgICAgICAgICAgIGZhaWxlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgaWYgKGZhaWxlZCkgeworICAgICAgICAvLyBzb21ldGhpbmcgd2VudCB3cm9uZywgY2xlYW4gdXAgZXZlcnl0aGluZyEKKyAgICAgICAgaWYgKGdwdS0+cmVncy51c2VyKSB7CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxJTWVtb3J5Kj4oZ3B1LT5yZWdzLnVzZXIpLT5kZWNTdHJvbmcoZ3B1KTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8aW5mby5jb3VudCA7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChncHUtPmdwdVtpXS51c2VyKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PElNZW1vcnkqPihncHUtPmdwdVtpXS51c2VyKS0+ZGVjU3Ryb25nKGdwdSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIGdwdS0+Y291bnQgPSBpbmZvLmNvdW50OworICAgIHJldHVybiBncHU7Cit9CisKK2ludCBncHVfcmVsZWFzZSh2b2lkKiwgcmVxdWVzdF9ncHVfdCogZ3B1KQoreworICAgIHNwPElNZW1vcnk+IHJlZ3M7CisKKyAgICB7IC8vIHNjb3BlIGZvciBsb2NrCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChnUmVnaW9uc0xvY2spOworICAgICAgICByZWdzID0gc3RhdGljX2Nhc3Q8SU1lbW9yeSo+KGdwdS0+cmVncy51c2VyKTsgICAKKyAgICAgICAgZ3B1LT5yZWdzLnVzZXIgPSAwOworICAgICAgICBpZiAocmVncyAhPSAwKSByZWdzLT5kZWNTdHJvbmcoZ3B1KTsKKyAgICAgICAgCisgICAgICAgIGZvciAoaW50IGk9MCA7IGk8Z3B1LT5jb3VudCA7IGkrKykgeworICAgICAgICAgICAgc3A8SU1lbW9yeT4gcihzdGF0aWNfY2FzdDxJTWVtb3J5Kj4oZ3B1LT5ncHVbaV0udXNlcikpOworICAgICAgICAgICAgZ3B1LT5ncHVbaV0udXNlciA9IDA7CisgICAgICAgICAgICBpZiAociAhPSAwKSByLT5kZWNTdHJvbmcoZ3B1KTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvLyB0aGVyZSBpcyBhIHNwZWNpYWwgdHJhbnNhY3Rpb24gdG8gcmVsaW5xdWlzaCB0aGUgR1BVCisgICAgLy8gKGl0IHdpbGwgaGFwcGVuIGF1dG9tYXRpY2FsbHkgYW55d2F5IGlmIHdlIGRvbid0IGRvIHRoaXMpCisgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgIC8vIE5PVEU6IHRoaXMgdHJhbnNhY3Rpb24gZG9lcyBub3QgcmVxdWlyZSBhbiBpbnRlcmZhY2UgdG9rZW4KKyAgICByZWdzLT5hc0JpbmRlcigpLT50cmFuc2FjdCgxMDAwLCBkYXRhLCAmcmVwbHkpOworICAgIHJldHVybiAxOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvR0xFU19DTS9nbC5jcHAgYi9vcGVuZ2wvbGlicy9HTEVTX0NNL2dsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjVjZjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2xpYnMvR0xFU19DTS9nbC5jcHAKQEAgLTAsMCArMSwxMTYgQEAKKy8qIAorICoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKioKKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisgKioKKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorICoqCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkdMRVNfQ00iCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKworI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKworI2luY2x1ZGUgImhvb2tzLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBleHRlbnNpb25zIGZvciB0aGUgZnJhbWV3b3JrCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgZ2xDb2xvclBvaW50ZXJCb3VuZHMoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLAorICAgICAgICBjb25zdCBHTHZvaWQgKnB0ciwgR0xzaXplaSBjb3VudCkgeworICAgIGdsQ29sb3JQb2ludGVyKHNpemUsIHR5cGUsIHN0cmlkZSwgcHRyKTsKK30KK3ZvaWQgZ2xOb3JtYWxQb2ludGVyQm91bmRzKEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwKKyAgICAgICAgY29uc3QgR0x2b2lkICpwb2ludGVyLCBHTHNpemVpIGNvdW50KSB7CisgICAgZ2xOb3JtYWxQb2ludGVyKHR5cGUsIHN0cmlkZSwgcG9pbnRlcik7Cit9Cit2b2lkIGdsVGV4Q29vcmRQb2ludGVyQm91bmRzKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLAorICAgICAgICBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyLCBHTHNpemVpIGNvdW50KSB7CisgICAgZ2xUZXhDb29yZFBvaW50ZXIoc2l6ZSwgdHlwZSwgc3RyaWRlLCBwb2ludGVyKTsKK30KK3ZvaWQgZ2xWZXJ0ZXhQb2ludGVyQm91bmRzKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLAorICAgICAgICBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyLCBHTHNpemVpIGNvdW50KSB7CisgICAgZ2xWZXJ0ZXhQb2ludGVyKHNpemUsIHR5cGUsIHN0cmlkZSwgcG9pbnRlcik7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEFjdHVhbCBHTCBlbnRyeS1wb2ludHMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmIEdMX0xPR0dFUgorIyAgIGluY2x1ZGUgImdsX2xvZ2dlci5oIgorIyAgIGRlZmluZSBHTF9MT0dHRVJfSU1QTChfeCkgX3gKKyNlbHNlCisjICAgZGVmaW5lIEdMX0xPR0dFUl9JTVBMKF94KQorI2VuZGlmCisKKyN1bmRlZiBBUElfRU5UUlkKKyN1bmRlZiBDQUxMX0dMX0FQSQorI3VuZGVmIENBTExfR0xfQVBJX1JFVFVSTgorCisjaWYgVVNFX0ZBU1RfVExTX0tFWQorCisgICAgI2RlZmluZSBBUElfRU5UUlkoX2FwaSkgX19hdHRyaWJ1dGVfXygobmFrZWQpKSBfYXBpCisKKyAgICAjZGVmaW5lIENBTExfR0xfQVBJKF9hcGksIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBhc20gdm9sYXRpbGUoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgIm1vdiAgIHIxMiwgIzB4RkZGRjBGRkYgICBcbiIgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICJsZHIgICByMTIsIFtyMTIsICMtMTVdICAgXG4iICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAibGRyICAgcjEyLCBbcjEyLCAlW3Rsc11dIFxuIiAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgImNtcCAgIHIxMiwgIzAgICAgICAgICAgICBcbiIgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICJsZHJuZSBwYywgIFtyMTIsICVbYXBpXV0gXG4iICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAiYnggICAgbHIgICAgICAgICAgICAgICAgIFxuIiAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIDogW3Rsc10gIkoiKFRMU19TTE9UX09QRU5HTF9BUEkqNCksICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIFthcGldICJKIihfX2J1aWx0aW5fb2Zmc2V0b2YoZ2xfaG9va3NfdCwgZ2wuX2FwaSkpICAgIFwKKyAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICApOworICAgIAorICAgICNkZWZpbmUgQ0FMTF9HTF9BUElfUkVUVVJOKF9hcGksIC4uLikgXAorICAgICAgICBDQUxMX0dMX0FQSShfYXBpLCBfX1ZBX0FSR1NfXykgXAorICAgICAgICByZXR1cm4gMDsgLy8gcGxhY2F0ZSBnY2MncyB3YXJuaW5ncy4gbmV2ZXIgcmVhY2hlZC4KKworI2Vsc2UKKworICAgICNkZWZpbmUgQVBJX0VOVFJZKF9hcGkpIF9hcGkKKworICAgICNkZWZpbmUgQ0FMTF9HTF9BUEkoX2FwaSwgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBnbF9ob29rc190OjpnbF90IGNvbnN0ICogY29uc3QgX2MgPSAmZ2V0R2xUaHJlYWRTcGVjaWZpYygpLT5nbDsgXAorICAgICAgICBHTF9MT0dHRVJfSU1QTCggbG9nXyMjX2FwaShfX1ZBX0FSR1NfXyk7ICkgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfYy0+X2FwaShfX1ZBX0FSR1NfXykKKyAgICAKKyAgICAjZGVmaW5lIENBTExfR0xfQVBJX1JFVFVSTihfYXBpLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZ2xfaG9va3NfdDo6Z2xfdCBjb25zdCAqIGNvbnN0IF9jID0gJmdldEdsVGhyZWFkU3BlY2lmaWMoKS0+Z2w7IFwKKyAgICAgICAgR0xfTE9HR0VSX0lNUEwoIGxvZ18jI19hcGkoX19WQV9BUkdTX18pOyApICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIF9jLT5fYXBpKF9fVkFfQVJHU19fKQorCisjZW5kaWYKKworZXh0ZXJuICJDIiB7CisjaW5jbHVkZSAiZ2xfYXBpLmluIgorfQorCisjdW5kZWYgQVBJX0VOVFJZCisjdW5kZWYgQ0FMTF9HTF9BUEkKKyN1bmRlZiBDQUxMX0dMX0FQSV9SRVRVUk4KKwpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvR0xFU19DTS9nbF9hcGkuaW4gYi9vcGVuZ2wvbGlicy9HTEVTX0NNL2dsX2FwaS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjM0ZWYyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2xpYnMvR0xFU19DTS9nbF9hcGkuaW4KQEAgLTAsMCArMSw2MDYgQEAKK3ZvaWQgQVBJX0VOVFJZKGdsQWN0aXZlVGV4dHVyZSkoR0xlbnVtIHRleHR1cmUpIHsKKyAgICBDQUxMX0dMX0FQSShnbEFjdGl2ZVRleHR1cmUsIHRleHR1cmUpOworfQorCit2b2lkIEFQSV9FTlRSWShnbEFscGhhRnVuYykoR0xlbnVtIGZ1bmMsIEdMY2xhbXBmIHJlZikgeworICAgIENBTExfR0xfQVBJKGdsQWxwaGFGdW5jLCBmdW5jLCByZWYpOworfQorCit2b2lkIEFQSV9FTlRSWShnbEFscGhhRnVuY3gpKEdMZW51bSBmdW5jLCBHTGNsYW1weCByZWYpIHsKKyAgICBDQUxMX0dMX0FQSShnbEFscGhhRnVuY3gsIGZ1bmMsIHJlZik7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsQmluZFRleHR1cmUpKEdMZW51bSB0YXJnZXQsIEdMdWludCB0ZXh0dXJlKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xCaW5kVGV4dHVyZSwgdGFyZ2V0LCB0ZXh0dXJlKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xCbGVuZEZ1bmMpKEdMZW51bSBzZmFjdG9yLCBHTGVudW0gZGZhY3RvcikgeworICAgIENBTExfR0xfQVBJKGdsQmxlbmRGdW5jLCBzZmFjdG9yLCBkZmFjdG9yKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xDbGVhcikoR0xiaXRmaWVsZCBtYXNrKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xDbGVhciwgbWFzayk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsQ2xlYXJDb2xvcikoR0xjbGFtcGYgcmVkLCBHTGNsYW1wZiBncmVlbiwgR0xjbGFtcGYgYmx1ZSwgR0xjbGFtcGYgYWxwaGEpIHsKKyAgICBDQUxMX0dMX0FQSShnbENsZWFyQ29sb3IsIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xDbGVhckNvbG9yeCkoR0xjbGFtcHggcmVkLCBHTGNsYW1weCBncmVlbiwgR0xjbGFtcHggYmx1ZSwgR0xjbGFtcHggYWxwaGEpIHsKKyAgICBDQUxMX0dMX0FQSShnbENsZWFyQ29sb3J4LCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsQ2xlYXJEZXB0aGYpKEdMY2xhbXBmIGRlcHRoKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xDbGVhckRlcHRoZiwgZGVwdGgpOworfQorCit2b2lkIEFQSV9FTlRSWShnbENsZWFyRGVwdGh4KShHTGNsYW1weCBkZXB0aCkgeworICAgIENBTExfR0xfQVBJKGdsQ2xlYXJEZXB0aHgsIGRlcHRoKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xDbGVhclN0ZW5jaWwpKEdMaW50IHMpIHsKKyAgICBDQUxMX0dMX0FQSShnbENsZWFyU3RlbmNpbCwgcyk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsQ2xpZW50QWN0aXZlVGV4dHVyZSkoR0xlbnVtIHRleHR1cmUpIHsKKyAgICBDQUxMX0dMX0FQSShnbENsaWVudEFjdGl2ZVRleHR1cmUsIHRleHR1cmUpOworfQorCit2b2lkIEFQSV9FTlRSWShnbENvbG9yNGYpKEdMZmxvYXQgcmVkLCBHTGZsb2F0IGdyZWVuLCBHTGZsb2F0IGJsdWUsIEdMZmxvYXQgYWxwaGEpIHsKKyAgICBDQUxMX0dMX0FQSShnbENvbG9yNGYsIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xDb2xvcjR4KShHTGZpeGVkIHJlZCwgR0xmaXhlZCBncmVlbiwgR0xmaXhlZCBibHVlLCBHTGZpeGVkIGFscGhhKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xDb2xvcjR4LCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsQ29sb3JNYXNrKShHTGJvb2xlYW4gciwgR0xib29sZWFuIGcsIEdMYm9vbGVhbiBiLCBHTGJvb2xlYW4gYSkgeworICAgIENBTExfR0xfQVBJKGdsQ29sb3JNYXNrLCByLCBnLCBiLCBhKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xDb2xvclBvaW50ZXIpKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwdHIpCit7CisgICAgQ0FMTF9HTF9BUEkoZ2xDb2xvclBvaW50ZXIsIHNpemUsIHR5cGUsIHN0cmlkZSwgcHRyKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xDb21wcmVzc2VkVGV4SW1hZ2UyRCkoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpIHsKKyAgICBDQUxMX0dMX0FQSShnbENvbXByZXNzZWRUZXhJbWFnZTJELCB0YXJnZXQsIGxldmVsLCBpbnRlcm5hbGZvcm1hdCwKKyAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGJvcmRlciwgaW1hZ2VTaXplLCBkYXRhKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCkoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMdm9pZCAqZGF0YSkgeworICAgIENBTExfR0xfQVBJKGdsQ29tcHJlc3NlZFRleFN1YkltYWdlMkQsIHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQsCisgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIGltYWdlU2l6ZSwgZGF0YSk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsQ29weVRleEltYWdlMkQpKCAgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgYm9yZGVyKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xDb3B5VGV4SW1hZ2UyRCwgdGFyZ2V0LCBsZXZlbCwgaW50ZXJuYWxmb3JtYXQsIHgsIHksCisgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBib3JkZXIpOworfQorCit2b2lkIEFQSV9FTlRSWShnbENvcHlUZXhTdWJJbWFnZTJEKSggICBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCB5b2Zmc2V0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgaGVpZ2h0KSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xDb3B5VGV4U3ViSW1hZ2UyRCwgdGFyZ2V0LCBsZXZlbCwgeG9mZnNldCwgeW9mZnNldCwgeCwgeSwKKyAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQpOworfQorCit2b2lkIEFQSV9FTlRSWShnbEN1bGxGYWNlKShHTGVudW0gbW9kZSkgeworICAgIENBTExfR0xfQVBJKGdsQ3VsbEZhY2UsIG1vZGUpOworfQorCit2b2lkIEFQSV9FTlRSWShnbERlbGV0ZVRleHR1cmVzKShHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqdGV4dHVyZXMpIHsKKyAgICBDQUxMX0dMX0FQSShnbERlbGV0ZVRleHR1cmVzLCBuLCB0ZXh0dXJlcyk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsRGVwdGhGdW5jKShHTGVudW0gZnVuYykgeworICAgIENBTExfR0xfQVBJKGdsRGVwdGhGdW5jLCBmdW5jKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xEZXB0aE1hc2spKEdMYm9vbGVhbiBmbGFnKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xEZXB0aE1hc2ssIGZsYWcpOworfQorCit2b2lkIEFQSV9FTlRSWShnbERlcHRoUmFuZ2VmKShHTGNsYW1wZiB6TmVhciwgR0xjbGFtcGYgekZhcikgeworICAgIENBTExfR0xfQVBJKGdsRGVwdGhSYW5nZWYsIHpOZWFyLCB6RmFyKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xEZXB0aFJhbmdleCkoR0xjbGFtcHggek5lYXIsIEdMY2xhbXB4IHpGYXIpIHsKKyAgICBDQUxMX0dMX0FQSShnbERlcHRoUmFuZ2V4LCB6TmVhciwgekZhcik7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsRGlzYWJsZSkoR0xlbnVtIGNhcCkgeworICAgIENBTExfR0xfQVBJKGdsRGlzYWJsZSwgY2FwKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xEaXNhYmxlQ2xpZW50U3RhdGUpKEdMZW51bSBhcnJheSkgeworICAgIENBTExfR0xfQVBJKGdsRGlzYWJsZUNsaWVudFN0YXRlLCBhcnJheSk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsRHJhd0FycmF5cykoR0xlbnVtIG1vZGUsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50KSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xEcmF3QXJyYXlzLCBtb2RlLCBmaXJzdCwgY291bnQpOworfQorCit2b2lkIEFQSV9FTlRSWShnbERyYXdFbGVtZW50cykoR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsCisgICAgICAgICAgICAgICAgICAgIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmluZGljZXMpIHsKKyAgICBDQUxMX0dMX0FQSShnbERyYXdFbGVtZW50cywgbW9kZSwgY291bnQsIHR5cGUsIGluZGljZXMpOworfQorCit2b2lkIEFQSV9FTlRSWShnbEVuYWJsZSkoR0xlbnVtIGNhcCkgeworICAgIENBTExfR0xfQVBJKGdsRW5hYmxlLCBjYXApOworfQorCit2b2lkIEFQSV9FTlRSWShnbEVuYWJsZUNsaWVudFN0YXRlKShHTGVudW0gYXJyYXkpIHsKKyAgICBDQUxMX0dMX0FQSShnbEVuYWJsZUNsaWVudFN0YXRlLCBhcnJheSk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsRmluaXNoKSh2b2lkKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xGaW5pc2gpOworfQorCit2b2lkIEFQSV9FTlRSWShnbEZsdXNoKSh2b2lkKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xGbHVzaCk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsRm9nZikoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xGb2dmLCBwbmFtZSwgcGFyYW0pOworfQorCit2b2lkIEFQSV9FTlRSWShnbEZvZ2Z2KShHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsRm9nZnYsIHBuYW1lLCBwYXJhbXMpOworfQorCit2b2lkIEFQSV9FTlRSWShnbEZvZ3gpKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkgeworICAgIENBTExfR0xfQVBJKGdsRm9neCwgcG5hbWUsIHBhcmFtKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xGb2d4dikoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpIHsKKyAgICBDQUxMX0dMX0FQSShnbEZvZ3h2LCBwbmFtZSwgcGFyYW1zKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xGcm9udEZhY2UpKEdMZW51bSBtb2RlKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xGcm9udEZhY2UsIG1vZGUpOworfQorCit2b2lkIEFQSV9FTlRSWShnbEZydXN0dW1mKShHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsCisgICAgICAgICAgICAgICAgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLAorICAgICAgICAgICAgICAgIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhcikgeworICAgIENBTExfR0xfQVBJKGdsRnJ1c3R1bWYsIGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgek5lYXIsIHpGYXIpOworfQorCit2b2lkIEFQSV9FTlRSWShnbEZydXN0dW14KShHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsCisgICAgICAgICAgICAgICAgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLAorICAgICAgICAgICAgICAgIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhcikgeworICAgIENBTExfR0xfQVBJKGdsRnJ1c3R1bXgsIGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgek5lYXIsIHpGYXIpOworfQorCit2b2lkIEFQSV9FTlRSWShnbEdlblRleHR1cmVzKShHTHNpemVpIG4sIEdMdWludCAqdGV4dHVyZXMpIHsKKyAgICBDQUxMX0dMX0FQSShnbEdlblRleHR1cmVzLCBuLCB0ZXh0dXJlcyk7Cit9CisKK0dMZW51bSBBUElfRU5UUlkoZ2xHZXRFcnJvcikodm9pZCkgeworICAgIENBTExfR0xfQVBJX1JFVFVSTihnbEdldEVycm9yKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xHZXRJbnRlZ2VydikoR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xHZXRJbnRlZ2VydiwgcG5hbWUsIHBhcmFtcyk7Cit9CisKK2NvbnN0IEdMdWJ5dGUgKiBBUElfRU5UUlkoZ2xHZXRTdHJpbmcpKEdMZW51bSBuYW1lKSB7CisgICAgQ0FMTF9HTF9BUElfUkVUVVJOKGdsR2V0U3RyaW5nLCBuYW1lKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xIaW50KShHTGVudW0gdGFyZ2V0LCBHTGVudW0gbW9kZSkgeworICAgIENBTExfR0xfQVBJKGdsSGludCwgdGFyZ2V0LCBtb2RlKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xMaWdodE1vZGVsZikoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xMaWdodE1vZGVsZiwgcG5hbWUsIHBhcmFtKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xMaWdodE1vZGVsZnYpKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xMaWdodE1vZGVsZnYsIHBuYW1lLCBwYXJhbXMpOworfQorCit2b2lkIEFQSV9FTlRSWShnbExpZ2h0TW9kZWx4KShHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pIHsKKyAgICBDQUxMX0dMX0FQSShnbExpZ2h0TW9kZWx4LCBwbmFtZSwgcGFyYW0pOworfQorCit2b2lkIEFQSV9FTlRSWShnbExpZ2h0TW9kZWx4dikoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpIHsKKyAgICBDQUxMX0dMX0FQSShnbExpZ2h0TW9kZWx4diwgcG5hbWUsIHBhcmFtcyk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsTGlnaHRmKShHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSkgeworICAgIENBTExfR0xfQVBJKGdsTGlnaHRmLCBsaWdodCwgcG5hbWUsIHBhcmFtKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xMaWdodGZ2KShHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xMaWdodGZ2LCBsaWdodCwgcG5hbWUsIHBhcmFtcyk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsTGlnaHR4KShHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkgeworICAgIENBTExfR0xfQVBJKGdsTGlnaHR4LCBsaWdodCwgcG5hbWUsIHBhcmFtKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xMaWdodHh2KShHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xMaWdodHh2LCBsaWdodCwgcG5hbWUsIHBhcmFtcyk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsTGluZVdpZHRoKShHTGZsb2F0IHdpZHRoKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xMaW5lV2lkdGgsIHdpZHRoKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xMaW5lV2lkdGh4KShHTGZpeGVkIHdpZHRoKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xMaW5lV2lkdGh4LCB3aWR0aCk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsTG9hZElkZW50aXR5KSh2b2lkKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xMb2FkSWRlbnRpdHkpOworfQorCit2b2lkIEFQSV9FTlRSWShnbExvYWRNYXRyaXhmKShjb25zdCBHTGZsb2F0ICptKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xMb2FkTWF0cml4ZiwgbSk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsTG9hZE1hdHJpeHgpKGNvbnN0IEdMZml4ZWQgKm0pIHsKKyAgICBDQUxMX0dMX0FQSShnbExvYWRNYXRyaXh4LCBtKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xMb2dpY09wKShHTGVudW0gb3Bjb2RlKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xMb2dpY09wLCBvcGNvZGUpOworfQorCit2b2lkIEFQSV9FTlRSWShnbE1hdGVyaWFsZikoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSkgeworICAgIENBTExfR0xfQVBJKGdsTWF0ZXJpYWxmLCBmYWNlLCBwbmFtZSwgcGFyYW0pOworfQorCit2b2lkIEFQSV9FTlRSWShnbE1hdGVyaWFsZnYpKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsTWF0ZXJpYWxmdiwgZmFjZSwgcG5hbWUsIHBhcmFtcyk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsTWF0ZXJpYWx4KShHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xNYXRlcmlhbHgsIGZhY2UsIHBuYW1lLCBwYXJhbSk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsTWF0ZXJpYWx4dikoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xNYXRlcmlhbHh2LCBmYWNlLCBwbmFtZSwgcGFyYW1zKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xNYXRyaXhNb2RlKShHTGVudW0gbW9kZSkgeworICAgIENBTExfR0xfQVBJKGdsTWF0cml4TW9kZSwgbW9kZSk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsTXVsdE1hdHJpeGYpKGNvbnN0IEdMZmxvYXQgKm0pIHsKKyAgICBDQUxMX0dMX0FQSShnbE11bHRNYXRyaXhmLCBtKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xNdWx0TWF0cml4eCkoY29uc3QgR0xmaXhlZCAqbSkgeworICAgIENBTExfR0xfQVBJKGdsTXVsdE1hdHJpeHgsIG0pOworfQorCit2b2lkIEFQSV9FTlRSWShnbE11bHRpVGV4Q29vcmQ0ZikoR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgciwgR0xmbG9hdCBxKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xNdWx0aVRleENvb3JkNGYsIHRhcmdldCwgcywgdCwgciwgcSk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsTXVsdGlUZXhDb29yZDR4KShHTGVudW0gdGFyZ2V0LCBHTGZpeGVkIHMsIEdMZml4ZWQgdCwgR0xmaXhlZCByLCBHTGZpeGVkIHEpIHsKKyAgICBDQUxMX0dMX0FQSShnbE11bHRpVGV4Q29vcmQ0eCwgdGFyZ2V0LCBzLCB0LCByLCBxKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xOb3JtYWwzZikoR0xmbG9hdCBueCwgR0xmbG9hdCBueSwgR0xmbG9hdCBueikgeworICAgIENBTExfR0xfQVBJKGdsTm9ybWFsM2YsIG54LCBueSwgbnopOworfQorCit2b2lkIEFQSV9FTlRSWShnbE5vcm1hbDN4KShHTGZpeGVkIG54LCBHTGZpeGVkIG55LCBHTGZpeGVkIG56KSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xOb3JtYWwzeCwgbngsIG55LCBueik7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsTm9ybWFsUG9pbnRlcikoR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpIHsKKyAgICBDQUxMX0dMX0FQSShnbE5vcm1hbFBvaW50ZXIsIHR5cGUsIHN0cmlkZSwgcG9pbnRlcik7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsT3J0aG9mKSggIEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwKKyAgICAgICAgICAgICAgICBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsCisgICAgICAgICAgICAgICAgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xPcnRob2YsIGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgek5lYXIsIHpGYXIpOworfQorCit2b2lkIEFQSV9FTlRSWShnbE9ydGhveCkoICBHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsCisgICAgICAgICAgICAgICAgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLAorICAgICAgICAgICAgICAgIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhcikgeworICAgIENBTExfR0xfQVBJKGdsT3J0aG94LCBsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIHpOZWFyLCB6RmFyKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xQaXhlbFN0b3JlaSkoR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSkgeworICAgIENBTExfR0xfQVBJKGdsUGl4ZWxTdG9yZWksIHBuYW1lLCBwYXJhbSk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsUG9pbnRTaXplKShHTGZsb2F0IHNpemUpIHsKKyAgICBDQUxMX0dMX0FQSShnbFBvaW50U2l6ZSwgc2l6ZSk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsUG9pbnRTaXpleCkoR0xmaXhlZCBzaXplKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xQb2ludFNpemV4LCBzaXplKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xQb2x5Z29uT2Zmc2V0KShHTGZsb2F0IGZhY3RvciwgR0xmbG9hdCB1bml0cykgeworICAgIENBTExfR0xfQVBJKGdsUG9seWdvbk9mZnNldCwgZmFjdG9yLCB1bml0cyk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsUG9seWdvbk9mZnNldHgpKEdMZml4ZWQgZmFjdG9yLCBHTGZpeGVkIHVuaXRzKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xQb2x5Z29uT2Zmc2V0eCwgZmFjdG9yLCB1bml0cyk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsUG9wTWF0cml4KSh2b2lkKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xQb3BNYXRyaXgpOworfQorCit2b2lkIEFQSV9FTlRSWShnbFB1c2hNYXRyaXgpKHZvaWQpIHsKKyAgICBDQUxMX0dMX0FQSShnbFB1c2hNYXRyaXgpOworfQorCit2b2lkIEFQSV9FTlRSWShnbFJlYWRQaXhlbHMpKCAgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKnBpeGVscykgeworICAgIENBTExfR0xfQVBJKGdsUmVhZFBpeGVscywgeCwgeSwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0eXBlLCBwaXhlbHMpOworfQorCit2b2lkIEFQSV9FTlRSWShnbFJvdGF0ZWYpKEdMZmxvYXQgYW5nbGUsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopIHsKKyAgICBDQUxMX0dMX0FQSShnbFJvdGF0ZWYsIGFuZ2xlLCB4LCB5LCB6KTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xSb3RhdGV4KShHTGZpeGVkIGFuZ2xlLCBHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xSb3RhdGV4LCBhbmdsZSwgeCwgeSwgeik7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsU2FtcGxlQ292ZXJhZ2UpKEdMY2xhbXBmIHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xTYW1wbGVDb3ZlcmFnZSwgdmFsdWUsIGludmVydCk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsU2FtcGxlQ292ZXJhZ2V4KShHTGNsYW1weCB2YWx1ZSwgR0xib29sZWFuIGludmVydCkgeworICAgIENBTExfR0xfQVBJKGdsU2FtcGxlQ292ZXJhZ2V4LCB2YWx1ZSwgaW52ZXJ0KTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xTY2FsZWYpKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopIHsKKyAgICBDQUxMX0dMX0FQSShnbFNjYWxlZiwgeCwgeSwgeik7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsU2NhbGV4KShHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xTY2FsZXgsIHgsIHksIHopOworfQorCit2b2lkIEFQSV9FTlRSWShnbFNjaXNzb3IpKEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xTY2lzc29yLCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xTaGFkZU1vZGVsKShHTGVudW0gbW9kZSkgeworICAgIENBTExfR0xfQVBJKGdsU2hhZGVNb2RlbCwgbW9kZSk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsU3RlbmNpbEZ1bmMpKEdMZW51bSBmdW5jLCBHTGludCByZWYsIEdMdWludCBtYXNrKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xTdGVuY2lsRnVuYywgZnVuYywgcmVmLCBtYXNrKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xTdGVuY2lsTWFzaykoR0x1aW50IG1hc2spIHsKKyAgICBDQUxMX0dMX0FQSShnbFN0ZW5jaWxNYXNrLCBtYXNrKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xTdGVuY2lsT3ApKEdMZW51bSBmYWlsLCBHTGVudW0gemZhaWwsIEdMZW51bSB6cGFzcykgeworICAgIENBTExfR0xfQVBJKGdsU3RlbmNpbE9wLCBmYWlsLCB6ZmFpbCwgenBhc3MpOworfQorCit2b2lkIEFQSV9FTlRSWShnbFRleENvb3JkUG9pbnRlcikoIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcikgeworICAgIENBTExfR0xfQVBJKGdsVGV4Q29vcmRQb2ludGVyLCBzaXplLCB0eXBlLCBzdHJpZGUsIHBvaW50ZXIpOworfQorCit2b2lkIEFQSV9FTlRSWShnbFRleEVudmYpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSkgeworICAgIENBTExfR0xfQVBJKGdsVGV4RW52ZiwgdGFyZ2V0LCBwbmFtZSwgcGFyYW0pOworfQorCit2b2lkIEFQSV9FTlRSWShnbFRleEVudmZ2KShHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsVGV4RW52ZnYsIHRhcmdldCwgcG5hbWUsIHBhcmFtcyk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsVGV4RW52eCkoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xUZXhFbnZ4LCB0YXJnZXQsIHBuYW1lLCBwYXJhbSk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsVGV4RW52eHYpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xUZXhFbnZ4diwgdGFyZ2V0LCBwbmFtZSwgcGFyYW1zKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xUZXhJbWFnZTJEKSggIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCBpbnRlcm5hbGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xUZXhJbWFnZTJELCB0YXJnZXQsIGxldmVsLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgIGJvcmRlciwgZm9ybWF0LCB0eXBlLCBwaXhlbHMpOworfQorCit2b2lkIEFQSV9FTlRSWShnbFRleFBhcmFtZXRlcmYpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSkgeworICAgIENBTExfR0xfQVBJKGdsVGV4UGFyYW1ldGVyZiwgdGFyZ2V0LCBwbmFtZSwgcGFyYW0pOworfQorCit2b2lkIEFQSV9FTlRSWShnbFRleFBhcmFtZXRlcngpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkgeworICAgIENBTExfR0xfQVBJKGdsVGV4UGFyYW1ldGVyeCwgdGFyZ2V0LCBwbmFtZSwgcGFyYW0pOworfQorCit2b2lkIEFQSV9FTlRSWShnbFRleFN1YkltYWdlMkQpKCAgIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpIHsKKyAgICBDQUxMX0dMX0FQSShnbFRleFN1YkltYWdlMkQsIHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQsCisgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIHBpeGVscyk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsVHJhbnNsYXRlZikoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeikgeworICAgIENBTExfR0xfQVBJKGdsVHJhbnNsYXRlZiwgeCwgeSwgeik7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsVHJhbnNsYXRleCkoR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeikgeworICAgIENBTExfR0xfQVBJKGdsVHJhbnNsYXRleCwgeCwgeSwgeik7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsVmVydGV4UG9pbnRlcikoICAgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xWZXJ0ZXhQb2ludGVyLCBzaXplLCB0eXBlLCBzdHJpZGUsIHBvaW50ZXIpOworfQorCit2b2lkIEFQSV9FTlRSWShnbFZpZXdwb3J0KShHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCkgeworICAgIENBTExfR0xfQVBJKGdsVmlld3BvcnQsIHgsIHksIHdpZHRoLCBoZWlnaHQpOworfQorCisvLyBFUyAxLjEKK3ZvaWQgQVBJX0VOVFJZKGdsQ2xpcFBsYW5lZikoR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZsb2F0ICplcXVhdGlvbikgeworICAgIENBTExfR0xfQVBJKGdsQ2xpcFBsYW5lZiwgcGxhbmUsIGVxdWF0aW9uKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsQ2xpcFBsYW5leCkoR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZpeGVkICplcXVhdGlvbikgeworICAgIENBTExfR0xfQVBJKGdsQ2xpcFBsYW5leCwgcGxhbmUsIGVxdWF0aW9uKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsQmluZEJ1ZmZlcikoR0xlbnVtIHRhcmdldCwgR0x1aW50IGJ1ZmZlcikgeworICAgIENBTExfR0xfQVBJKGdsQmluZEJ1ZmZlciwgdGFyZ2V0LCBidWZmZXIpOworfQordm9pZCBBUElfRU5UUlkoZ2xCdWZmZXJEYXRhKShHTGVudW0gdGFyZ2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSwgR0xlbnVtIHVzYWdlKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xCdWZmZXJEYXRhLCB0YXJnZXQsIHNpemUsIGRhdGEsIHVzYWdlKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsQnVmZmVyU3ViRGF0YSkoR0xlbnVtIHRhcmdldCwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSkgeworICAgIENBTExfR0xfQVBJKGdsQnVmZmVyU3ViRGF0YSwgdGFyZ2V0LCBvZmZzZXQsIHNpemUsIGRhdGEpOworfQordm9pZCBBUElfRU5UUlkoZ2xEZWxldGVCdWZmZXJzKShHTHNpemVpIG4sIGNvbnN0IEdMdWludCogYnVmZmVycykgeworICAgIENBTExfR0xfQVBJKGdsRGVsZXRlQnVmZmVycywgbiwgYnVmZmVycyk7Cit9Cit2b2lkIEFQSV9FTlRSWShnbEdlbkJ1ZmZlcnMpKEdMc2l6ZWkgbiwgR0x1aW50KiBidWZmZXJzKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xHZW5CdWZmZXJzLCBuLCBidWZmZXJzKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsR2V0Qm9vbGVhbnYpKEdMZW51bSBwbmFtZSwgR0xib29sZWFuICpwYXJhbXMpIHsKKyAgICBDQUxMX0dMX0FQSShnbEdldEJvb2xlYW52LCBwbmFtZSwgcGFyYW1zKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsR2V0Rml4ZWR2KShHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsR2V0Rml4ZWR2LCBwbmFtZSwgcGFyYW1zKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsR2V0RmxvYXR2KShHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsR2V0RmxvYXR2LCBwbmFtZSwgcGFyYW1zKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsR2V0UG9pbnRlcnYpKEdMZW51bSBwbmFtZSwgdm9pZCAqKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsR2V0UG9pbnRlcnYsIHBuYW1lLCBwYXJhbXMpOworfQordm9pZCBBUElfRU5UUlkoZ2xHZXRCdWZmZXJQYXJhbWV0ZXJpdikoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xHZXRCdWZmZXJQYXJhbWV0ZXJpdiwgdGFyZ2V0LCBwbmFtZSwgcGFyYW1zKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsR2V0Q2xpcFBsYW5lZikoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IGVxbls0XSkgeworICAgIENBTExfR0xfQVBJKGdsR2V0Q2xpcFBsYW5lZiwgcG5hbWUsIGVxbik7Cit9Cit2b2lkIEFQSV9FTlRSWShnbEdldENsaXBQbGFuZXgpKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBlcW5bNF0pIHsKKyAgICBDQUxMX0dMX0FQSShnbEdldENsaXBQbGFuZXgsIHBuYW1lLCBlcW4pOworfQordm9pZCBBUElfRU5UUlkoZ2xHZXRMaWdodHh2KShHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xHZXRMaWdodHh2LCBsaWdodCwgcG5hbWUsIHBhcmFtcyk7Cit9Cit2b2lkIEFQSV9FTlRSWShnbEdldExpZ2h0ZnYpKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpIHsKKyAgICBDQUxMX0dMX0FQSShnbEdldExpZ2h0ZnYsIGxpZ2h0LCBwbmFtZSwgcGFyYW1zKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsR2V0TWF0ZXJpYWx4dikoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xHZXRNYXRlcmlhbHh2LCBmYWNlLCBwbmFtZSwgcGFyYW1zKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsR2V0TWF0ZXJpYWxmdikoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xHZXRNYXRlcmlhbGZ2LCBmYWNlLCBwbmFtZSwgcGFyYW1zKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsR2V0VGV4RW52ZnYpKEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xHZXRUZXhFbnZmdiwgZW52LCBwbmFtZSwgcGFyYW1zKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsR2V0VGV4RW52aXYpKEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsR2V0VGV4RW52aXYsIGVudiwgcG5hbWUsIHBhcmFtcyk7Cit9Cit2b2lkIEFQSV9FTlRSWShnbEdldFRleEVudnh2KShHTGVudW0gZW52LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsR2V0VGV4RW52eHYsIGVudiwgcG5hbWUsIHBhcmFtcyk7Cit9Cit2b2lkIEFQSV9FTlRSWShnbEdldFRleFBhcmFtZXRlcmZ2KShHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsR2V0VGV4UGFyYW1ldGVyZnYsIHRhcmdldCwgcG5hbWUsIHBhcmFtcyk7Cit9Cit2b2lkIEFQSV9FTlRSWShnbEdldFRleFBhcmFtZXRlcml2KShHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpIHsKKyAgICBDQUxMX0dMX0FQSShnbEdldFRleFBhcmFtZXRlcml2LCB0YXJnZXQsIHBuYW1lLCBwYXJhbXMpOworfQordm9pZCBBUElfRU5UUlkoZ2xHZXRUZXhQYXJhbWV0ZXJ4dikoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpIHsKKyAgICBDQUxMX0dMX0FQSShnbEdldFRleFBhcmFtZXRlcnh2LCB0YXJnZXQsIHBuYW1lLCBwYXJhbXMpOworfQorR0xib29sZWFuIEFQSV9FTlRSWShnbElzQnVmZmVyKShHTHVpbnQgYnVmZmVyKSB7CisgICAgQ0FMTF9HTF9BUElfUkVUVVJOKGdsSXNCdWZmZXIsIGJ1ZmZlcik7Cit9CitHTGJvb2xlYW4gQVBJX0VOVFJZKGdsSXNFbmFibGVkKShHTGVudW0gY2FwKSB7CisgICAgQ0FMTF9HTF9BUElfUkVUVVJOKGdsSXNFbmFibGVkLCBjYXApOworfQorR0xib29sZWFuIEFQSV9FTlRSWShnbElzVGV4dHVyZSkoR0x1aW50IHRleHR1cmUpIHsKKyAgICBDQUxMX0dMX0FQSV9SRVRVUk4oZ2xJc1RleHR1cmUsIHRleHR1cmUpOworfQordm9pZCBBUElfRU5UUlkoZ2xQb2ludFBhcmFtZXRlcmYpKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSkgeworICAgIENBTExfR0xfQVBJKGdsUG9pbnRQYXJhbWV0ZXJmLCBwbmFtZSwgcGFyYW0pOworfQordm9pZCBBUElfRU5UUlkoZ2xQb2ludFBhcmFtZXRlcmZ2KShHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsUG9pbnRQYXJhbWV0ZXJmdiwgcG5hbWUsIHBhcmFtcyk7Cit9Cit2b2lkIEFQSV9FTlRSWShnbFBvaW50UGFyYW1ldGVyeCkoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xQb2ludFBhcmFtZXRlcngsIHBuYW1lLCBwYXJhbSk7Cit9Cit2b2lkIEFQSV9FTlRSWShnbFBvaW50UGFyYW1ldGVyeHYpKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xQb2ludFBhcmFtZXRlcnh2LCBwbmFtZSwgcGFyYW1zKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsQ29sb3I0dWIpKEdMdWJ5dGUgcmVkLCBHTHVieXRlIGdyZWVuLCBHTHVieXRlIGJsdWUsIEdMdWJ5dGUgYWxwaGEpIHsKKyAgICBDQUxMX0dMX0FQSShnbENvbG9yNHViLCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Cit9Cit2b2lkIEFQSV9FTlRSWShnbFRleEVudmkpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pIHsKKyAgICBDQUxMX0dMX0FQSShnbFRleEVudmksIHRhcmdldCwgcG5hbWUsIHBhcmFtKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsVGV4RW52aXYpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsVGV4RW52aXYsIHRhcmdldCwgcG5hbWUsIHBhcmFtcyk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsVGV4UGFyYW1ldGVyZnYpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xUZXhQYXJhbWV0ZXJmdiwgdGFyZ2V0LCBwbmFtZSwgcGFyYW1zKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xUZXhQYXJhbWV0ZXJpdikoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xUZXhQYXJhbWV0ZXJpdiwgdGFyZ2V0LCBwbmFtZSwgcGFyYW1zKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xUZXhQYXJhbWV0ZXJpKShHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xUZXhQYXJhbWV0ZXJpLCB0YXJnZXQsIHBuYW1lLCBwYXJhbSk7Cit9Cit2b2lkIEFQSV9FTlRSWShnbFRleFBhcmFtZXRlcnh2KShHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsVGV4UGFyYW1ldGVyeHYsIHRhcmdldCwgcG5hbWUsIHBhcmFtcyk7Cit9Cit2b2lkIEFQSV9FTlRSWShnbFBvaW50U2l6ZVBvaW50ZXJPRVMpKEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xQb2ludFNpemVQb2ludGVyT0VTLCB0eXBlLCBzdHJpZGUsIHBvaW50ZXIpOworfQorCisvLyBFeHRlbnNpb25zCit2b2lkIEFQSV9FTlRSWShnbERyYXdUZXhzT0VTKShHTHNob3J0IHggLCBHTHNob3J0IHksIEdMc2hvcnQgeiwgR0xzaG9ydCB3LCBHTHNob3J0IGgpIHsKKyAgICBDQUxMX0dMX0FQSShnbERyYXdUZXhzT0VTLCB4LCB5LCB6LCB3LCBoKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsRHJhd1RleGlPRVMpKEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHcsIEdMaW50IGgpIHsKKyAgICBDQUxMX0dMX0FQSShnbERyYXdUZXhpT0VTLCB4LCB5LCB6LCB3LCBoKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsRHJhd1RleGZPRVMpKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgdywgR0xmbG9hdCBoKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xEcmF3VGV4Zk9FUywgeCwgeSwgeiwgdywgaCk7Cit9Cit2b2lkIEFQSV9FTlRSWShnbERyYXdUZXh4T0VTKShHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6LCBHTGZpeGVkIHcsIEdMZml4ZWQgaCkgeworICAgIENBTExfR0xfQVBJKGdsRHJhd1RleHhPRVMsIHgsIHksIHosIHcsIGgpOworfQordm9pZCBBUElfRU5UUlkoZ2xEcmF3VGV4c3ZPRVMpKGNvbnN0IEdMc2hvcnQqIGNvb3JkcykgeworICAgIENBTExfR0xfQVBJKGdsRHJhd1RleHN2T0VTLCBjb29yZHMpOworfQordm9pZCBBUElfRU5UUlkoZ2xEcmF3VGV4aXZPRVMpKGNvbnN0IEdMaW50KiBjb29yZHMpIHsKKyAgICBDQUxMX0dMX0FQSShnbERyYXdUZXhpdk9FUywgY29vcmRzKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsRHJhd1RleGZ2T0VTKShjb25zdCBHTGZsb2F0KiBjb29yZHMpIHsKKyAgICBDQUxMX0dMX0FQSShnbERyYXdUZXhmdk9FUywgY29vcmRzKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsRHJhd1RleHh2T0VTKShjb25zdCBHTGZpeGVkKiBjb29yZHMpIHsKKyAgICBDQUxMX0dMX0FQSShnbERyYXdUZXh4dk9FUywgY29vcmRzKTsKK30KK0dMYml0ZmllbGQgQVBJX0VOVFJZKGdsUXVlcnlNYXRyaXh4T0VTKShHTGZpeGVkKiBtYW50aXNzYSwgR0xpbnQqIGV4cG9uZW50KSB7CisgICAgQ0FMTF9HTF9BUElfUkVUVVJOKGdsUXVlcnlNYXRyaXh4T0VTLCBtYW50aXNzYSwgZXhwb25lbnQpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvR0xFU19DTS9nbF9sb2dnZXIuY3BwIGIvb3BlbmdsL2xpYnMvR0xFU19DTS9nbF9sb2dnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YmU1YzkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvbGlicy9HTEVTX0NNL2dsX2xvZ2dlci5jcHAKQEAgLTAsMCArMSwxMDYwIEBACisvKgorICoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKioKKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKioKKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKioKKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJHTExvZ2dlciIKKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxkbGZjbi5oPgorCisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisKKyNpbmNsdWRlIDxFR0wvZWdsLmg+CisjaW5jbHVkZSA8RUdML2VnbGV4dC5oPgorI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisKKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKKyNpbmNsdWRlICJnbF9sb2dnZXIuaCIKKworI3VuZGVmIE5FTEVNCisjZGVmaW5lIE5FTEVNKHgpIChzaXplb2YoeCkvc2l6ZW9mKCooeCkpKQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCituYW1lc3BhY2UgYW5kcm9pZCB7CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGF0aWMgaW50IGJpbmFyeVNlYXJjaChUIGNvbnN0IHNvcnRlZEFycmF5W10sIGludCBmaXJzdCwgaW50IGxhc3QsIEVHTGludCBrZXkpCit7CisgICB3aGlsZSAoZmlyc3QgPD0gbGFzdCkgeworICAgICAgIGludCBtaWQgPSAoZmlyc3QgKyBsYXN0KSAvIDI7CisgICAgICAgaWYgKGtleSA+IHNvcnRlZEFycmF5W21pZF0ua2V5KSB7CisgICAgICAgICAgIGZpcnN0ID0gbWlkICsgMTsKKyAgICAgICB9IGVsc2UgaWYgKGtleSA8IHNvcnRlZEFycmF5W21pZF0ua2V5KSB7CisgICAgICAgICAgIGxhc3QgPSBtaWQgLSAxOworICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgIHJldHVybiBtaWQ7CisgICAgICAgfQorICAgfQorICAgcmV0dXJuIC0xOworfQorCitzdHJ1Y3QgcGFpcl90IHsKKyAgICBjb25zdCBjaGFyKiBuYW1lOworICAgIGludCAgICAgICAgIGtleTsKK307CisKK3N0YXRpYyBjb25zdCBwYWlyX3QgZ0VudW1NYXBbXSA9IHsKKyAgICAjZGVmaW5lIEdMRU5VTShOQU1FLCBWQUxVRSkgeyAjTkFNRSwgVkFMVUUgfSwKKyAgICAjaW5jbHVkZSAiZ2xfZW51bXMuaW4iCisgICAgI3VuZGVmIEdMRU5VTQorfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUWVBFPgorY2xhc3MgR0xMb2dWYWx1ZSB7CitwdWJsaWM6CisgICAgR0xMb2dWYWx1ZShUWVBFIHZhbHVlKSA6IG1WYWx1ZSh2YWx1ZSkgeyB9CisgICAgY29uc3QgVFlQRSYgZ2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiBtVmFsdWU7IH0KKyAgICBTdHJpbmc4IHRvU3RyaW5nKCkgY29uc3QgeworICAgICAgICByZXR1cm4gY29udmVydFRvU3RyaW5nKG1WYWx1ZSk7CisgICAgfQorcHJpdmF0ZToKKyAgICBjb25zdCBUWVBFJiBtVmFsdWU7CisgICAgU3RyaW5nOCBjb252ZXJ0VG9TdHJpbmcodW5zaWduZWQgaW50IHYpIGNvbnN0IHsKKyAgICAgICAgY2hhciBidWZbMTZdOworICAgICAgICBzbnByaW50ZihidWYsIDE2LCAiJXUiLCB2KTsKKyAgICAgICAgcmV0dXJuIFN0cmluZzgoYnVmKTsKKyAgICB9CisgICAgU3RyaW5nOCBjb252ZXJ0VG9TdHJpbmcodW5zaWduZWQgbG9uZyB2KSBjb25zdCB7CisgICAgICAgIGNoYXIgYnVmWzE2XTsKKyAgICAgICAgc25wcmludGYoYnVmLCAxNiwgIiVsdSIsIHYpOworICAgICAgICByZXR1cm4gU3RyaW5nOChidWYpOworICAgIH0KKyAgICBTdHJpbmc4IGNvbnZlcnRUb1N0cmluZyhpbnQgdikgY29uc3QgeworICAgICAgICBjaGFyIGJ1ZlsxNl07CisgICAgICAgIHNucHJpbnRmKGJ1ZiwgMTYsICIlZCIsIHYpOworICAgICAgICByZXR1cm4gU3RyaW5nOChidWYpOworICAgIH0KKyAgICBTdHJpbmc4IGNvbnZlcnRUb1N0cmluZyhsb25nIHYpIGNvbnN0IHsKKyAgICAgICAgY2hhciBidWZbMTZdOworICAgICAgICBzbnByaW50ZihidWYsIDE2LCAiJWxkIiwgdik7CisgICAgICAgIHJldHVybiBTdHJpbmc4KGJ1Zik7CisgICAgfQorICAgIFN0cmluZzggY29udmVydFRvU3RyaW5nKGZsb2F0IHYpIGNvbnN0IHsKKyAgICAgICAgY2hhciBidWZbMTZdOworICAgICAgICBzbnByaW50ZihidWYsIDE2LCAiJWYiLCB2KTsKKyAgICAgICAgcmV0dXJuIFN0cmluZzgoYnVmKTsKKyAgICB9CisgICAgU3RyaW5nOCBjb252ZXJ0VG9TdHJpbmcodm9pZCBjb25zdCogdikgY29uc3QgeworICAgICAgICBjaGFyIGJ1ZlsxNl07CisgICAgICAgIHNucHJpbnRmKGJ1ZiwgMTYsICIlcCIsIHYpOworICAgICAgICByZXR1cm4gU3RyaW5nOChidWYpOworICAgIH0KK307CisKK2NsYXNzIEdMTG9nRW51bSA6IHB1YmxpYyBHTExvZ1ZhbHVlPEdMZW51bT4geworcHVibGljOgorICAgIEdMTG9nRW51bShHTGVudW0gdikgOiBHTExvZ1ZhbHVlPEdMZW51bT4odikgeyB9CisgICAgU3RyaW5nOCB0b1N0cmluZygpIGNvbnN0IHsKKyAgICAgICAgR0xlbnVtIHYgPSBnZXRWYWx1ZSgpOworICAgICAgICBpbnQgaSA9IGJpbmFyeVNlYXJjaDxwYWlyX3Q+KGdFbnVtTWFwLCAwLCBORUxFTShnRW51bU1hcCktMSwgdik7CisgICAgICAgIGlmIChpID49IDApIHsKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmc4KGdFbnVtTWFwW2ldLm5hbWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2hhciBidWZbMTZdOworICAgICAgICAgICAgc25wcmludGYoYnVmLCAxNiwgIjB4JTA0eCIsIHYpOworICAgICAgICAgICAgcmV0dXJuIFN0cmluZzgoYnVmKTsKKyAgICAgICAgfQorICAgIH0KK307CisKK2NsYXNzIEdMTG9nQ2xlYXJCaXRmaWVsZCA6IHB1YmxpYyBHTExvZ1ZhbHVlPEdMYml0ZmllbGQ+IHsKK3B1YmxpYzoKKyAgICBHTExvZ0NsZWFyQml0ZmllbGQoR0xiaXRmaWVsZCB2KSA6IEdMTG9nVmFsdWU8R0xiaXRmaWVsZD4odikgeyB9CisgICAgU3RyaW5nOCB0b1N0cmluZygpIGNvbnN0IHsKKyAgICAgICAgY2hhciBidWZbMTZdOworICAgICAgICBzbnByaW50ZihidWYsIDE2LCAiMHglMDh4IiwgZ2V0VmFsdWUoKSk7CisgICAgICAgIHJldHVybiBTdHJpbmc4KGJ1Zik7CisgICAgfQorfTsKKworY2xhc3MgR0xMb2dCb29sIDogcHVibGljIEdMTG9nVmFsdWU8R0xib29sZWFuPiB7CitwdWJsaWM6CisgICAgR0xMb2dCb29sKEdMYm9vbGVhbiB2KSA6IEdMTG9nVmFsdWU8R0xib29sZWFuPih2KSB7IH0KKyAgICBTdHJpbmc4IHRvU3RyaW5nKCkgY29uc3QgeworICAgICAgICBHTGJvb2xlYW4gdiA9IGdldFZhbHVlKCk7CisgICAgICAgIGlmICh2ID09IEdMX1RSVUUpICAgcmV0dXJuIFN0cmluZzgoIkdMX1RSVUUiKTsKKyAgICAgICAgaWYgKHYgPT0gR0xfRkFMU0UpICByZXR1cm4gU3RyaW5nOCgiR0xfRkFMU0UiKTsKKyAgICAgICAgcmV0dXJuIEdMTG9nVmFsdWU8R0xib29sZWFuPjo6dG9TdHJpbmcoKTsKKyAgICB9Cit9OworCitjbGFzcyBHTExvZ0ZpeGVkIDogcHVibGljIEdMTG9nVmFsdWU8R0xmaXhlZD4geworcHVibGljOgorICAgIEdMTG9nRml4ZWQoR0xmaXhlZCB2KSA6IEdMTG9nVmFsdWU8R0xmaXhlZD4odikgeyB9CisgICAgU3RyaW5nOCB0b1N0cmluZygpIGNvbnN0IHsKKyAgICAgICAgY2hhciBidWZbMTZdOworICAgICAgICBzbnByaW50ZihidWYsIDE2LCAiMHglMDh4IiwgZ2V0VmFsdWUoKSk7CisgICAgICAgIHJldHVybiBTdHJpbmc4KGJ1Zik7CisgICAgfQorfTsKKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVFlQRT4KK2NsYXNzIEdMTG9nQnVmZmVyIDogcHVibGljIEdMTG9nVmFsdWU8VFlQRSAqPiB7CitwdWJsaWM6CisgICAgR0xMb2dCdWZmZXIoVFlQRSogYnVmZmVyLCBzaXplX3QgY291bnQgPSAtMSkKKyAgICAgICAgOiBHTExvZ1ZhbHVlPFRZUEUqPihidWZmZXIpCisgICAgeyAvLyBvdXRwdXQgYnVmZmVyCisgICAgfQorICAgIEdMTG9nQnVmZmVyKFRZUEUgY29uc3QqIGJ1ZmZlciwgc2l6ZV90IGNvdW50ID0gLTEpCisgICAgOiBHTExvZ1ZhbHVlPFRZUEUqPihjb25zdF9jYXN0PFRZUEUqPihidWZmZXIpKQorICAgIHsgLy8gaW5wdXQgYnVmZmVyCisgICAgfQorfTsKKworY2xhc3MgR0xMb2cKK3sKK3B1YmxpYzoKKyAgICBHTExvZyhjb25zdCBjaGFyKiBuYW1lKSA6IG1OdW1QYXJhbXMoMCkgeworICAgICAgICBtU3RyaW5nLmFwcGVuZChuYW1lKTsKKyAgICAgICAgbVN0cmluZy5hcHBlbmQoIigiKTsKKyAgICB9CisKKyAgICB+R0xMb2coKSB7CisgICAgICAgIExPR0QoIiVzKTsiLCBtU3RyaW5nLnN0cmluZygpKTsKKyAgICB9CisKKyAgICBHTExvZyYgb3BlcmF0b3IgPDwgKHVuc2lnbmVkIGNoYXIgdikgeworICAgICAgICByZXR1cm4gKnRoaXMgPDwgR0xMb2dWYWx1ZTx1bnNpZ25lZCBpbnQ+KHYpOworICAgIH0KKyAgICBHTExvZyYgb3BlcmF0b3IgPDwgKHNob3J0IHYpIHsKKyAgICAgICAgcmV0dXJuICp0aGlzIDw8IEdMTG9nVmFsdWU8dW5zaWduZWQgaW50Pih2KTsKKyAgICB9CisgICAgR0xMb2cmIG9wZXJhdG9yIDw8ICh1bnNpZ25lZCBpbnQgdikgeworICAgICAgICByZXR1cm4gKnRoaXMgPDwgR0xMb2dWYWx1ZTx1bnNpZ25lZCBpbnQ+KHYpOworICAgIH0KKyAgICBHTExvZyYgb3BlcmF0b3IgPDwgKGludCB2KSB7CisgICAgICAgIHJldHVybiAqdGhpcyA8PCBHTExvZ1ZhbHVlPGludD4odik7CisgICAgfQorICAgIEdMTG9nJiBvcGVyYXRvciA8PCAobG9uZyB2KSB7CisgICAgICAgIHJldHVybiAqdGhpcyA8PCBHTExvZ1ZhbHVlPGxvbmc+KHYpOworICAgIH0KKyAgICBHTExvZyYgb3BlcmF0b3IgPDwgKHVuc2lnbmVkIGxvbmcgdikgeworICAgICAgICByZXR1cm4gKnRoaXMgPDwgR0xMb2dWYWx1ZTx1bnNpZ25lZCBsb25nPih2KTsKKyAgICB9CisgICAgR0xMb2cmIG9wZXJhdG9yIDw8IChmbG9hdCB2KSB7CisgICAgICAgIHJldHVybiAqdGhpcyA8PCBHTExvZ1ZhbHVlPGZsb2F0Pih2KTsKKyAgICB9CisgICAgR0xMb2cmIG9wZXJhdG9yIDw8IChjb25zdCB2b2lkKiB2KSB7CisgICAgICAgIHJldHVybiAqdGhpcyA8PCBHTExvZ1ZhbHVlPGNvbnN0IHZvaWQqID4odik7CisgICAgfQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFRZUEU+CisgICAgR0xMb2cmIG9wZXJhdG9yIDw8IChjb25zdCBUWVBFJiByaHMpIHsKKyAgICAgICAgaWYgKG1OdW1QYXJhbXMgPiAwKQorICAgICAgICAgICAgbVN0cmluZy5hcHBlbmQoIiwgIik7CisgICAgICAgIG1TdHJpbmcuYXBwZW5kKHJocy50b1N0cmluZygpKTsKKyAgICAgICAgbU51bVBhcmFtcysrOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgY29uc3QgU3RyaW5nOCYgc3RyaW5nKCkgY29uc3QgeyByZXR1cm4gbVN0cmluZzsgfQorcHJpdmF0ZToKKyAgICBHTExvZyhjb25zdCBHTExvZyYpOworCisgICAgU3RyaW5nOCBtU3RyaW5nOworICAgIGludCBtTnVtUGFyYW1zOworfTsKKworI2RlZmluZSBBUElfRU5UUlkoYXBpKSAgICAgICAgICAgICAgICAgICAgICBsb2dfIyNhcGkKKyNkZWZpbmUgQ0FMTF9HTF9BUEkoX3gsIC4uLikKKyNkZWZpbmUgQ0FMTF9HTF9BUElfUkVUVVJOKF94LCAuLi4pICAgICAgICAgcmV0dXJuKDApOworCit2b2lkIEFQSV9FTlRSWShnbEFjdGl2ZVRleHR1cmUpKEdMZW51bSB0ZXh0dXJlKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xBY3RpdmVUZXh0dXJlLCB0ZXh0dXJlKTsKKyAgICBHTExvZygiZ2xBY3RpdmVUZXh0dXJlIikgPDwgR0xMb2dFbnVtKHRleHR1cmUpOworfQorCit2b2lkIEFQSV9FTlRSWShnbEFscGhhRnVuYykoR0xlbnVtIGZ1bmMsIEdMY2xhbXBmIHJlZikgeworICAgIENBTExfR0xfQVBJKGdsQWxwaGFGdW5jLCBmdW5jLCByZWYpOworICAgIEdMTG9nKCJnbEFscGhhRnVuYyIpIDw8IEdMTG9nRW51bShmdW5jKSA8PCByZWY7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsQWxwaGFGdW5jeCkoR0xlbnVtIGZ1bmMsIEdMY2xhbXB4IHJlZikgeworICAgIENBTExfR0xfQVBJKGdsQWxwaGFGdW5jeCwgZnVuYywgcmVmKTsKKyAgICBHTExvZygiZ2xBbHBoYUZ1bmN4IikgPDwgR0xMb2dFbnVtKGZ1bmMpIDw8IEdMTG9nRml4ZWQocmVmKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xCaW5kVGV4dHVyZSkoR0xlbnVtIHRhcmdldCwgR0x1aW50IHRleHR1cmUpIHsKKyAgICBDQUxMX0dMX0FQSShnbEJpbmRUZXh0dXJlLCB0YXJnZXQsIHRleHR1cmUpOworICAgIEdMTG9nKCJnbEJpbmRUZXh0dXJlIikgPDwgR0xMb2dFbnVtKHRhcmdldCkgPDwgdGV4dHVyZTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xCbGVuZEZ1bmMpKEdMZW51bSBzZmFjdG9yLCBHTGVudW0gZGZhY3RvcikgeworICAgIENBTExfR0xfQVBJKGdsQmxlbmRGdW5jLCBzZmFjdG9yLCBkZmFjdG9yKTsKKyAgICBHTExvZygiZ2xCbGVuZEZ1bmMiKSA8PCBHTExvZ0VudW0oc2ZhY3RvcikgPDwgR0xMb2dFbnVtKGRmYWN0b3IpOworfQorCit2b2lkIEFQSV9FTlRSWShnbENsZWFyKShHTGJpdGZpZWxkIG1hc2spIHsKKyAgICBDQUxMX0dMX0FQSShnbENsZWFyLCBtYXNrKTsKKyAgICBHTExvZygiZ2xDbGVhciIpIDw8IEdMTG9nQ2xlYXJCaXRmaWVsZChtYXNrKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xDbGVhckNvbG9yKShHTGNsYW1wZiByZWQsIEdMY2xhbXBmIGdyZWVuLCBHTGNsYW1wZiBibHVlLCBHTGNsYW1wZiBhbHBoYSkgeworICAgIENBTExfR0xfQVBJKGdsQ2xlYXJDb2xvciwgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOworICAgIEdMTG9nKCJnbENsZWFyQ29sb3IiKSA8PCByZWQgPDwgZ3JlZW4gPDwgYmx1ZSA8PCBhbHBoYTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xDbGVhckNvbG9yeCkoR0xjbGFtcHggcmVkLCBHTGNsYW1weCBncmVlbiwgR0xjbGFtcHggYmx1ZSwgR0xjbGFtcHggYWxwaGEpIHsKKyAgICBDQUxMX0dMX0FQSShnbENsZWFyQ29sb3J4LCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7CisgICAgR0xMb2coImdsQ2xlYXJDb2xvcngiKSA8PCBHTExvZ0ZpeGVkKHJlZCkgPDwgR0xMb2dGaXhlZChncmVlbikgPDwgR0xMb2dGaXhlZChibHVlKSA8PCBHTExvZ0ZpeGVkKGFscGhhKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xDbGVhckRlcHRoZikoR0xjbGFtcGYgZGVwdGgpIHsKKyAgICBDQUxMX0dMX0FQSShnbENsZWFyRGVwdGhmLCBkZXB0aCk7CisgICAgR0xMb2coImdsQ2xlYXJEZXB0aGYiKSA8PCBkZXB0aDsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xDbGVhckRlcHRoeCkoR0xjbGFtcHggZGVwdGgpIHsKKyAgICBDQUxMX0dMX0FQSShnbENsZWFyRGVwdGh4LCBkZXB0aCk7CisgICAgR0xMb2coImdsQ2xlYXJEZXB0aHgiKSA8PCBHTExvZ0ZpeGVkKGRlcHRoKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xDbGVhclN0ZW5jaWwpKEdMaW50IHMpIHsKKyAgICBDQUxMX0dMX0FQSShnbENsZWFyU3RlbmNpbCwgcyk7CisgICAgR0xMb2coImdsQ2xlYXJTdGVuY2lsIikgPDwgczsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xDbGllbnRBY3RpdmVUZXh0dXJlKShHTGVudW0gdGV4dHVyZSkgeworICAgIENBTExfR0xfQVBJKGdsQ2xpZW50QWN0aXZlVGV4dHVyZSwgdGV4dHVyZSk7CisgICAgR0xMb2coImdsQ2xpZW50QWN0aXZlVGV4dHVyZSIpIDw8IEdMTG9nRW51bSh0ZXh0dXJlKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xDb2xvcjRmKShHTGZsb2F0IHJlZCwgR0xmbG9hdCBncmVlbiwgR0xmbG9hdCBibHVlLCBHTGZsb2F0IGFscGhhKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xDb2xvcjRmLCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7CisgICAgR0xMb2coImdsQ29sb3I0ZiIpIDw8IHJlZCA8PCBncmVlbiA8PCBibHVlIDw8IGFscGhhOworfQorCit2b2lkIEFQSV9FTlRSWShnbENvbG9yNHgpKEdMZml4ZWQgcmVkLCBHTGZpeGVkIGdyZWVuLCBHTGZpeGVkIGJsdWUsIEdMZml4ZWQgYWxwaGEpIHsKKyAgICBDQUxMX0dMX0FQSShnbENvbG9yNHgsIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKKyAgICBHTExvZygiZ2xDb2xvcjR4IikgPDwgR0xMb2dGaXhlZChyZWQpIDw8IEdMTG9nRml4ZWQoZ3JlZW4pIDw8IEdMTG9nRml4ZWQoYmx1ZSkgPDwgR0xMb2dGaXhlZChhbHBoYSk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsQ29sb3JNYXNrKShHTGJvb2xlYW4gciwgR0xib29sZWFuIGcsIEdMYm9vbGVhbiBiLCBHTGJvb2xlYW4gYSkgeworICAgIENBTExfR0xfQVBJKGdsQ29sb3JNYXNrLCByLCBnLCBiLCBhKTsKKyAgICBHTExvZygiZ2xDb2xvck1hc2siKSA8PCBHTExvZ0Jvb2wocikgPDwgR0xMb2dCb29sKGcpIDw8IEdMTG9nQm9vbChiKSA8PCBHTExvZ0Jvb2woYSk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsQ29sb3JQb2ludGVyKShHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcHRyKQoreworICAgIENBTExfR0xfQVBJKGdsQ29sb3JQb2ludGVyLCBzaXplLCB0eXBlLCBzdHJpZGUsIHB0cik7CisgICAgR0xMb2coImdsQ29sb3JQb2ludGVyIikgPDwgc2l6ZSA8PCBHTExvZ0VudW0odHlwZSkgPDwgc3RyaWRlIDw8IHB0cjsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xDb21wcmVzc2VkVGV4SW1hZ2UyRCkoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpIHsKKyAgICBDQUxMX0dMX0FQSShnbENvbXByZXNzZWRUZXhJbWFnZTJELCB0YXJnZXQsIGxldmVsLCBpbnRlcm5hbGZvcm1hdCwKKyAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGJvcmRlciwgaW1hZ2VTaXplLCBkYXRhKTsKKyAgICBHTExvZygiZ2xDb21wcmVzc2VkVGV4SW1hZ2UyRCIpCisgICAgICAgICAgICAgICAgPDwgR0xMb2dFbnVtKHRhcmdldCkgPDwgbGV2ZWwgPDwgR0xMb2dFbnVtKGludGVybmFsZm9ybWF0KQorICAgICAgICAgICAgICAgIDw8IHdpZHRoIDw8IGhlaWdodCA8PCBib3JkZXIgPDwgaW1hZ2VTaXplIDw8IGRhdGE7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsQ29tcHJlc3NlZFRleFN1YkltYWdlMkQpKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTHZvaWQgKmRhdGEpIHsKKyAgICBDQUxMX0dMX0FQSShnbENvbXByZXNzZWRUZXhTdWJJbWFnZTJELCB0YXJnZXQsIGxldmVsLCB4b2Zmc2V0LCB5b2Zmc2V0LAorICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBpbWFnZVNpemUsIGRhdGEpOworICAgIEdMTG9nKCJnbENvbXByZXNzZWRUZXhTdWJJbWFnZTJEIikKKyAgICAgICAgICAgIDw8IEdMTG9nRW51bSh0YXJnZXQpIDw8IGxldmVsIDw8IHhvZmZzZXQgPDwgeW9mZnNldAorICAgICAgICAgICAgPDwgd2lkdGggPDwgaGVpZ2h0IDw8IEdMTG9nRW51bShmb3JtYXQpIDw8IGltYWdlU2l6ZSA8PCBkYXRhOworfQorCit2b2lkIEFQSV9FTlRSWShnbENvcHlUZXhJbWFnZTJEKSggIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IGJvcmRlcikgeworICAgIENBTExfR0xfQVBJKGdsQ29weVRleEltYWdlMkQsIHRhcmdldCwgbGV2ZWwsIGludGVybmFsZm9ybWF0LCB4LCB5LAorICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgYm9yZGVyKTsKKyAgICBHTExvZygiZ2xDb3B5VGV4SW1hZ2UyRCIpCisgICAgICAgICAgICA8PCBHTExvZ0VudW0odGFyZ2V0KSA8PCBsZXZlbCA8PCBHTExvZ0VudW0oaW50ZXJuYWxmb3JtYXQpCisgICAgICAgICAgICA8PCB4IDw8IHkgPDwgd2lkdGggPDwgaGVpZ2h0IDw8IGJvcmRlcjsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xDb3B5VGV4U3ViSW1hZ2UyRCkoICAgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgeW9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHNpemVpIGhlaWdodCkgeworICAgIENBTExfR0xfQVBJKGdsQ29weVRleFN1YkltYWdlMkQsIHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQsIHgsIHksCisgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0KTsKKyAgICBHTExvZygiZ2xDb3B5VGV4U3ViSW1hZ2UyRCIpCisgICAgICAgICAgICA8PCBHTExvZ0VudW0odGFyZ2V0KSA8PCBsZXZlbCA8PCB4b2Zmc2V0IDw8IHlvZmZzZXQKKyAgICAgICAgICAgIDw8IHggPDwgeSA8PCB3aWR0aCA8PCBoZWlnaHQ7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsQ3VsbEZhY2UpKEdMZW51bSBtb2RlKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xDdWxsRmFjZSwgbW9kZSk7CisgICAgR0xMb2coImdsQ3VsbEZhY2UiKSA8PCBHTExvZ0VudW0obW9kZSk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsRGVsZXRlVGV4dHVyZXMpKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICp0ZXh0dXJlcykgeworICAgIENBTExfR0xfQVBJKGdsRGVsZXRlVGV4dHVyZXMsIG4sIHRleHR1cmVzKTsKKyAgICBHTExvZygiZ2xEZWxldGVUZXh0dXJlcyIpIDw8IG4gPDwgR0xMb2dCdWZmZXI8R0x1aW50Pih0ZXh0dXJlcywgbik7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsRGVwdGhGdW5jKShHTGVudW0gZnVuYykgeworICAgIENBTExfR0xfQVBJKGdsRGVwdGhGdW5jLCBmdW5jKTsKKyAgICBHTExvZygiZ2xEZXB0aEZ1bmMiKSA8PCBHTExvZ0VudW0oZnVuYyk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsRGVwdGhNYXNrKShHTGJvb2xlYW4gZmxhZykgeworICAgIENBTExfR0xfQVBJKGdsRGVwdGhNYXNrLCBmbGFnKTsKKyAgICBHTExvZygiZ2xEZXB0aE1hc2siKSA8PCBHTExvZ0Jvb2woZmxhZyk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsRGVwdGhSYW5nZWYpKEdMY2xhbXBmIHpOZWFyLCBHTGNsYW1wZiB6RmFyKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xEZXB0aFJhbmdlZiwgek5lYXIsIHpGYXIpOworICAgIEdMTG9nKCJnbERlcHRoUmFuZ2VmIikgPDwgek5lYXIgPDwgekZhcjsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xEZXB0aFJhbmdleCkoR0xjbGFtcHggek5lYXIsIEdMY2xhbXB4IHpGYXIpIHsKKyAgICBDQUxMX0dMX0FQSShnbERlcHRoUmFuZ2V4LCB6TmVhciwgekZhcik7CisgICAgR0xMb2coImdsRGVwdGhSYW5nZXgiKSA8PCBHTExvZ0ZpeGVkKHpOZWFyKSA8PCBHTExvZ0ZpeGVkKHpGYXIpOworfQorCit2b2lkIEFQSV9FTlRSWShnbERpc2FibGUpKEdMZW51bSBjYXApIHsKKyAgICBDQUxMX0dMX0FQSShnbERpc2FibGUsIGNhcCk7CisgICAgR0xMb2coImdsRGlzYWJsZSIpIDw8IEdMTG9nRW51bShjYXApOworfQorCit2b2lkIEFQSV9FTlRSWShnbERpc2FibGVDbGllbnRTdGF0ZSkoR0xlbnVtIGFycmF5KSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xEaXNhYmxlQ2xpZW50U3RhdGUsIGFycmF5KTsKKyAgICBHTExvZygiZ2xEaXNhYmxlQ2xpZW50U3RhdGUiKSA8PCBHTExvZ0VudW0oYXJyYXkpOworfQorCit2b2lkIEFQSV9FTlRSWShnbERyYXdBcnJheXMpKEdMZW51bSBtb2RlLCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCkgeworICAgIENBTExfR0xfQVBJKGdsRHJhd0FycmF5cywgbW9kZSwgZmlyc3QsIGNvdW50KTsKKyAgICBHTExvZygiZ2xEcmF3QXJyYXlzIikgPDwgR0xMb2dFbnVtKG1vZGUpIDw8IGZpcnN0IDw8IGNvdW50OworfQorCit2b2lkIEFQSV9FTlRSWShnbERyYXdFbGVtZW50cykoR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsCisgICAgICAgICAgICAgICAgICAgIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmluZGljZXMpIHsKKyAgICBDQUxMX0dMX0FQSShnbERyYXdFbGVtZW50cywgbW9kZSwgY291bnQsIHR5cGUsIGluZGljZXMpOworICAgIEdMTG9nIGxvZygiZ2xEcmF3RWxlbWVudHMiKTsKKyAgICBsb2cgPDwgR0xMb2dFbnVtKG1vZGUpIDw8IGNvdW50IDw8IEdMTG9nRW51bSh0eXBlKTsKKyAgICBpZiAodHlwZSA9PSBHTF9VTlNJR05FRF9CWVRFKSB7CisgICAgICAgIGxvZyA8PCBHTExvZ0J1ZmZlcjxHTHVieXRlPihzdGF0aWNfY2FzdDxjb25zdCBHTHVieXRlKj4oaW5kaWNlcyksIGNvdW50KTsKKyAgICB9IGVsc2UgeworICAgICAgICBsb2cgPDwgR0xMb2dCdWZmZXI8R0x1c2hvcnQ+KHN0YXRpY19jYXN0PGNvbnN0IEdMdXNob3J0Kj4oaW5kaWNlcyksIGNvdW50KTsKKyAgICB9CisgICAgbG9nOworfQorCit2b2lkIEFQSV9FTlRSWShnbEVuYWJsZSkoR0xlbnVtIGNhcCkgeworICAgIENBTExfR0xfQVBJKGdsRW5hYmxlLCBjYXApOworICAgIEdMTG9nKCJnbEVuYWJsZSIpIDw8IEdMTG9nRW51bShjYXApOworfQorCit2b2lkIEFQSV9FTlRSWShnbEVuYWJsZUNsaWVudFN0YXRlKShHTGVudW0gYXJyYXkpIHsKKyAgICBDQUxMX0dMX0FQSShnbEVuYWJsZUNsaWVudFN0YXRlLCBhcnJheSk7CisgICAgR0xMb2coImdsRW5hYmxlQ2xpZW50U3RhdGUiKSA8PCBHTExvZ0VudW0oYXJyYXkpOworfQorCit2b2lkIEFQSV9FTlRSWShnbEZpbmlzaCkodm9pZCkgeworICAgIENBTExfR0xfQVBJKGdsRmluaXNoKTsKKyAgICBHTExvZygiZ2xGaW5pc2giKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xGbHVzaCkodm9pZCkgeworICAgIENBTExfR0xfQVBJKGdsRmx1c2gpOworICAgIEdMTG9nKCJnbEZsdXNoIik7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsRm9nZikoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xGb2dmLCBwbmFtZSwgcGFyYW0pOworICAgIEdMTG9nKCJnbEZvZ2YiKSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IHBhcmFtOworfQorCit2b2lkIEFQSV9FTlRSWShnbEZvZ2Z2KShHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsRm9nZnYsIHBuYW1lLCBwYXJhbXMpOworICAgIC8vIFhYWDogd2UgbmVlZCB0byBjb21wdXRlIHRoZSBzaXplIG9mIHRoaXMgYnVmZmVyCisgICAgR0xMb2coImdsRm9nZnYiKSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IEdMTG9nQnVmZmVyPEdMZmxvYXQ+KHBhcmFtcyk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsRm9neCkoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xGb2d4LCBwbmFtZSwgcGFyYW0pOworICAgIEdMTG9nKCJnbEZvZ3giKSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IEdMTG9nRml4ZWQocGFyYW0pOworfQorCit2b2lkIEFQSV9FTlRSWShnbEZvZ3h2KShHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsRm9neHYsIHBuYW1lLCBwYXJhbXMpOworICAgIC8vIFhYWDogd2UgbmVlZCB0byBjb21wdXRlIHRoZSBzaXplIG9mIHRoaXMgYnVmZmVyCisgICAgR0xMb2coImdsRm9nZngiKSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IEdMTG9nQnVmZmVyPEdMZml4ZWQ+KHBhcmFtcyk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsRnJvbnRGYWNlKShHTGVudW0gbW9kZSkgeworICAgIENBTExfR0xfQVBJKGdsRnJvbnRGYWNlLCBtb2RlKTsKKyAgICBHTExvZygiZ2xGcm9udEZhY2UiKSA8PCBHTExvZ0VudW0obW9kZSk7CisgfQorCit2b2lkIEFQSV9FTlRSWShnbEZydXN0dW1mKShHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsCisgICAgICAgICAgICAgICAgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLAorICAgICAgICAgICAgICAgIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhcikgeworICAgIENBTExfR0xfQVBJKGdsRnJ1c3R1bWYsIGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgek5lYXIsIHpGYXIpOworICAgIEdMTG9nKCJnbEZydXN0dW1mIikgPDwgbGVmdCA8PCByaWdodCA8PCBib3R0b20gPDwgdG9wIDw8IHpOZWFyIDw8IHpGYXI7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsRnJ1c3R1bXgpKEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwKKyAgICAgICAgICAgICAgICBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsCisgICAgICAgICAgICAgICAgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xGcnVzdHVteCwgbGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCB6TmVhciwgekZhcik7CisgICAgR0xMb2coImdsRnJ1c3R1bXgiKQorICAgICAgICAgICAgPDwgR0xMb2dGaXhlZChsZWZ0KSA8PCBHTExvZ0ZpeGVkKHJpZ2h0KQorICAgICAgICAgICAgPDwgR0xMb2dGaXhlZChib3R0b20pIDw8IEdMTG9nRml4ZWQodG9wKQorICAgICAgICAgICAgPDwgR0xMb2dGaXhlZCh6TmVhcikgPDwgR0xMb2dGaXhlZCh6RmFyKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xHZW5UZXh0dXJlcykoR0xzaXplaSBuLCBHTHVpbnQgKnRleHR1cmVzKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xHZW5UZXh0dXJlcywgbiwgdGV4dHVyZXMpOworICAgIEdMTG9nKCJnbEdlblRleHR1cmVzIikgPDwgbiA8PCBHTExvZ0J1ZmZlcjxHTHVpbnQ+KHRleHR1cmVzLCBuKTsKK30KKworR0xlbnVtIEFQSV9FTlRSWShnbEdldEVycm9yKSh2b2lkKSB7CisgICAgR0xMb2coImdsR2V0RXJyb3IiKTsKKyAgICBDQUxMX0dMX0FQSV9SRVRVUk4oZ2xHZXRFcnJvcik7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsR2V0SW50ZWdlcnYpKEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsR2V0SW50ZWdlcnYsIHBuYW1lLCBwYXJhbXMpOworICAgIC8vIFhYWDogd2UgbmVlZCB0byBjb21wdXRlIHRoZSBzaXplIG9mIHRoaXMgYnVmZmVyCisgICAgR0xMb2coImdsR2V0SW50ZWdlcnYiKSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IEdMTG9nQnVmZmVyPEdMaW50PihwYXJhbXMpOworfQorCitjb25zdCBHTHVieXRlICogQVBJX0VOVFJZKGdsR2V0U3RyaW5nKShHTGVudW0gbmFtZSkgeworICAgIEdMTG9nKCJnbEdldFN0cmluZyIpIDw8IEdMTG9nRW51bShuYW1lKTsKKyAgICBDQUxMX0dMX0FQSV9SRVRVUk4oZ2xHZXRTdHJpbmcsIG5hbWUpOworfQorCit2b2lkIEFQSV9FTlRSWShnbEhpbnQpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBtb2RlKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xIaW50LCB0YXJnZXQsIG1vZGUpOworICAgIEdMTG9nKCJHTGVudW0iKSA8PCBHTExvZ0VudW0odGFyZ2V0KSA8PCBHTExvZ0VudW0obW9kZSk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsTGlnaHRNb2RlbGYpKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSkgeworICAgIENBTExfR0xfQVBJKGdsTGlnaHRNb2RlbGYsIHBuYW1lLCBwYXJhbSk7CisgICAgR0xMb2coImdsTGlnaHRNb2RlbGYiKSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IHBhcmFtOworfQorCit2b2lkIEFQSV9FTlRSWShnbExpZ2h0TW9kZWxmdikoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpIHsKKyAgICBDQUxMX0dMX0FQSShnbExpZ2h0TW9kZWxmdiwgcG5hbWUsIHBhcmFtcyk7CisgICAgLy8gWFhYOiB3ZSBuZWVkIHRvIGNvbXB1dGUgdGhlIHNpemUgb2YgdGhpcyBidWZmZXIKKyAgICBHTExvZygiZ2xMaWdodE1vZGVsZnYiKSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IEdMTG9nQnVmZmVyPEdMZmxvYXQ+KHBhcmFtcyk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsTGlnaHRNb2RlbHgpKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkgeworICAgIENBTExfR0xfQVBJKGdsTGlnaHRNb2RlbHgsIHBuYW1lLCBwYXJhbSk7CisgICAgR0xMb2coImdsTGlnaHRNb2RlbHgiKSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IEdMTG9nRml4ZWQocGFyYW0pOworfQorCit2b2lkIEFQSV9FTlRSWShnbExpZ2h0TW9kZWx4dikoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpIHsKKyAgICBDQUxMX0dMX0FQSShnbExpZ2h0TW9kZWx4diwgcG5hbWUsIHBhcmFtcyk7CisgICAgLy8gWFhYOiB3ZSBuZWVkIHRvIGNvbXB1dGUgdGhlIHNpemUgb2YgdGhpcyBidWZmZXIKKyAgICBHTExvZygiZ2xMaWdodE1vZGVseHYiKSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IEdMTG9nQnVmZmVyPEdMZml4ZWQ+KHBhcmFtcyk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsTGlnaHRmKShHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSkgeworICAgIENBTExfR0xfQVBJKGdsTGlnaHRmLCBsaWdodCwgcG5hbWUsIHBhcmFtKTsKKyAgICBHTExvZygiZ2xMaWdodGYiKSA8PCBHTExvZ0VudW0obGlnaHQpIDw8IEdMTG9nRW51bShwbmFtZSkgPDwgcGFyYW07Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsTGlnaHRmdikoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsTGlnaHRmdiwgbGlnaHQsIHBuYW1lLCBwYXJhbXMpOworICAgIC8vIFhYWDogd2UgbmVlZCB0byBjb21wdXRlIHRoZSBzaXplIG9mIHRoaXMgYnVmZmVyCisgICAgR0xMb2coImdsTGlnaHRmdiIpIDw8IEdMTG9nRW51bShsaWdodCkgPDwgR0xMb2dFbnVtKHBuYW1lKSA8PCBHTExvZ0J1ZmZlcjxHTGZsb2F0PihwYXJhbXMpOworfQorCit2b2lkIEFQSV9FTlRSWShnbExpZ2h0eCkoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pIHsKKyAgIENBTExfR0xfQVBJKGdsTGlnaHR4LCBsaWdodCwgcG5hbWUsIHBhcmFtKTsKKyAgIEdMTG9nKCJnbExpZ2h0eCIpIDw8IEdMTG9nRW51bShsaWdodCkgPDwgR0xMb2dFbnVtKHBuYW1lKSA8PCBHTExvZ0ZpeGVkKHBhcmFtKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xMaWdodHh2KShHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xMaWdodHh2LCBsaWdodCwgcG5hbWUsIHBhcmFtcyk7CisgICAgLy8gWFhYOiB3ZSBuZWVkIHRvIGNvbXB1dGUgdGhlIHNpemUgb2YgdGhpcyBidWZmZXIKKyAgICBHTExvZygiZ2xMaWdodHh2IikgPDwgR0xMb2dFbnVtKGxpZ2h0KSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IEdMTG9nQnVmZmVyPEdMZml4ZWQ+KHBhcmFtcyk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsTGluZVdpZHRoKShHTGZsb2F0IHdpZHRoKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xMaW5lV2lkdGgsIHdpZHRoKTsKKyAgICBHTExvZygiZ2xMaW5lV2lkdGgiKSA8PCB3aWR0aDsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xMaW5lV2lkdGh4KShHTGZpeGVkIHdpZHRoKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xMaW5lV2lkdGh4LCB3aWR0aCk7CisgICAgR0xMb2coImdsTGluZVdpZHRoIikgPDwgR0xMb2dGaXhlZCh3aWR0aCk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsTG9hZElkZW50aXR5KSh2b2lkKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xMb2FkSWRlbnRpdHkpOworICAgIEdMTG9nKCJnbExvYWRJZGVudGl0eSIpOworfQorCit2b2lkIEFQSV9FTlRSWShnbExvYWRNYXRyaXhmKShjb25zdCBHTGZsb2F0ICptKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xMb2FkTWF0cml4ZiwgbSk7CisgICAgR0xMb2coImdsTG9hZE1hdHJpeGYiKSA8PCBHTExvZ0J1ZmZlcjxHTGZsb2F0PihtLCAxNik7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsTG9hZE1hdHJpeHgpKGNvbnN0IEdMZml4ZWQgKm0pIHsKKyAgICBDQUxMX0dMX0FQSShnbExvYWRNYXRyaXh4LCBtKTsKKyAgICBHTExvZygiZ2xMb2FkTWF0cml4eCIpIDw8IEdMTG9nQnVmZmVyPEdMZml4ZWQ+KG0sIDE2KTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xMb2dpY09wKShHTGVudW0gb3Bjb2RlKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xMb2dpY09wLCBvcGNvZGUpOworICAgIEdMTG9nKCJnbExvZ2ljT3AiKSA8PCBHTExvZ0VudW0ob3Bjb2RlKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xNYXRlcmlhbGYpKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pIHsKKyAgICBDQUxMX0dMX0FQSShnbE1hdGVyaWFsZiwgZmFjZSwgcG5hbWUsIHBhcmFtKTsKKyAgICBHTExvZygiZ2xNYXRlcmlhbGYiKSA8PCBHTExvZ0VudW0oZmFjZSkgPDwgR0xMb2dFbnVtKHBuYW1lKSA8PCBwYXJhbTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xNYXRlcmlhbGZ2KShHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpIHsKKyAgICBDQUxMX0dMX0FQSShnbE1hdGVyaWFsZnYsIGZhY2UsIHBuYW1lLCBwYXJhbXMpOworICAgIC8vIFhYWDogd2UgbmVlZCB0byBjb21wdXRlIHRoZSBzaXplIG9mIHRoaXMgYnVmZmVyCisgICAgR0xMb2coImdsTWF0ZXJpYWxmdiIpIDw8IEdMTG9nRW51bShmYWNlKSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IEdMTG9nQnVmZmVyPEdMZmxvYXQ+KHBhcmFtcyk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsTWF0ZXJpYWx4KShHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xNYXRlcmlhbHgsIGZhY2UsIHBuYW1lLCBwYXJhbSk7CisgICAgR0xMb2coImdsTWF0ZXJpYWx4IikgPDwgR0xMb2dFbnVtKGZhY2UpIDw8IEdMTG9nRW51bShwbmFtZSkgPDwgR0xMb2dGaXhlZChwYXJhbSk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsTWF0ZXJpYWx4dikoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xNYXRlcmlhbHh2LCBmYWNlLCBwbmFtZSwgcGFyYW1zKTsKKyAgICAvLyBYWFg6IHdlIG5lZWQgdG8gY29tcHV0ZSB0aGUgc2l6ZSBvZiB0aGlzIGJ1ZmZlcgorICAgIEdMTG9nKCJnbE1hdGVyaWFseHYiKSA8PCBHTExvZ0VudW0oZmFjZSkgPDwgR0xMb2dFbnVtKHBuYW1lKSA8PCBHTExvZ0J1ZmZlcjxHTGZpeGVkPihwYXJhbXMpOworfQorCit2b2lkIEFQSV9FTlRSWShnbE1hdHJpeE1vZGUpKEdMZW51bSBtb2RlKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xNYXRyaXhNb2RlLCBtb2RlKTsKKyAgICBHTExvZygiZ2xNYXRyaXhNb2RlIikgPDwgR0xMb2dFbnVtKG1vZGUpOworfQorCit2b2lkIEFQSV9FTlRSWShnbE11bHRNYXRyaXhmKShjb25zdCBHTGZsb2F0ICptKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xNdWx0TWF0cml4ZiwgbSk7CisgICAgR0xMb2coImdsTXVsdE1hdHJpeGYiKSA8PCBHTExvZ0J1ZmZlcjxHTGZsb2F0PihtLCAxNik7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsTXVsdE1hdHJpeHgpKGNvbnN0IEdMZml4ZWQgKm0pIHsKKyAgICBDQUxMX0dMX0FQSShnbE11bHRNYXRyaXh4LCBtKTsKKyAgICBHTExvZygiZ2xNdWx0TWF0cml4eCIpIDw8IEdMTG9nQnVmZmVyPEdMZml4ZWQ+KG0sIDE2KTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xNdWx0aVRleENvb3JkNGYpKEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHIsIEdMZmxvYXQgcSkgeworICAgIENBTExfR0xfQVBJKGdsTXVsdGlUZXhDb29yZDRmLCB0YXJnZXQsIHMsIHQsIHIsIHEpOworICAgIEdMTG9nKCJnbE11bHRpVGV4Q29vcmQ0ZiIpIDw8IEdMTG9nRW51bSh0YXJnZXQpIDw8IHMgPDwgdCA8PCByIDw8IHE7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsTXVsdGlUZXhDb29yZDR4KShHTGVudW0gdGFyZ2V0LCBHTGZpeGVkIHMsIEdMZml4ZWQgdCwgR0xmaXhlZCByLCBHTGZpeGVkIHEpIHsKKyAgICBDQUxMX0dMX0FQSShnbE11bHRpVGV4Q29vcmQ0eCwgdGFyZ2V0LCBzLCB0LCByLCBxKTsKKyAgICBHTExvZygiZ2xNdWx0aVRleENvb3JkNHgiKSA8PCBHTExvZ0VudW0odGFyZ2V0KQorICAgICAgICA8PCBHTExvZ0ZpeGVkKHMpIDw8IEdMTG9nRml4ZWQodCkgPDwgR0xMb2dGaXhlZChyKSA8PCBHTExvZ0ZpeGVkKHEpOworfQorCit2b2lkIEFQSV9FTlRSWShnbE5vcm1hbDNmKShHTGZsb2F0IG54LCBHTGZsb2F0IG55LCBHTGZsb2F0IG56KSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xOb3JtYWwzZiwgbngsIG55LCBueik7CisgICAgR0xMb2coImdsTm9ybWFsM2YiKSA8PCBueCA8PCBueSA8PCBuejsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xOb3JtYWwzeCkoR0xmaXhlZCBueCwgR0xmaXhlZCBueSwgR0xmaXhlZCBueikgeworICAgIENBTExfR0xfQVBJKGdsTm9ybWFsM3gsIG54LCBueSwgbnopOworICAgIEdMTG9nKCJnbE5vcm1hbDN4IikgPDwgR0xMb2dGaXhlZChueCkgPDwgR0xMb2dGaXhlZChueSkgPDwgR0xMb2dGaXhlZChueik7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsTm9ybWFsUG9pbnRlcikoR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpIHsKKyAgICBDQUxMX0dMX0FQSShnbE5vcm1hbFBvaW50ZXIsIHR5cGUsIHN0cmlkZSwgcG9pbnRlcik7CisgICAgR0xMb2coImdsTm9ybWFsUG9pbnRlciIpIDw8IEdMTG9nRW51bSh0eXBlKSA8PCBzdHJpZGUgPDwgcG9pbnRlcjsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xPcnRob2YpKCAgR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LAorICAgICAgICAgICAgICAgIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwKKyAgICAgICAgICAgICAgICBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIpIHsKKyAgICBDQUxMX0dMX0FQSShnbE9ydGhvZiwgbGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCB6TmVhciwgekZhcik7CisgICAgR0xMb2coImdsT3J0aG9mIikgPDwgbGVmdCA8PCByaWdodCA8PCBib3R0b20gPDwgdG9wIDw8IHpOZWFyIDw8IHpGYXI7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsT3J0aG94KSggIEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwKKyAgICAgICAgICAgICAgICBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsCisgICAgICAgICAgICAgICAgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xPcnRob3gsIGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgek5lYXIsIHpGYXIpOworICAgIEdMTG9nKCJnbE9ydGhveCIpIDw8IEdMTG9nRml4ZWQobGVmdCkgPDwgR0xMb2dGaXhlZChyaWdodCkKKyAgICAgICAgICAgIDw8IEdMTG9nRml4ZWQoYm90dG9tKSA8PCBHTExvZ0ZpeGVkKHRvcCkKKyAgICAgICAgICAgIDw8IEdMTG9nRml4ZWQoek5lYXIpIDw8IEdMTG9nRml4ZWQoekZhcik7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsUGl4ZWxTdG9yZWkpKEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pIHsKKyAgICBDQUxMX0dMX0FQSShnbFBpeGVsU3RvcmVpLCBwbmFtZSwgcGFyYW0pOworICAgIEdMTG9nKCJnbFBpeGVsU3RvcmVpIikgPDwgR0xMb2dFbnVtKHBuYW1lKSA8PCBwYXJhbTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xQb2ludFNpemUpKEdMZmxvYXQgc2l6ZSkgeworICAgIENBTExfR0xfQVBJKGdsUG9pbnRTaXplLCBzaXplKTsKKyAgICBHTExvZygiZ2xQb2ludFNpemUiKSA8PCBzaXplOworfQorCit2b2lkIEFQSV9FTlRSWShnbFBvaW50U2l6ZXgpKEdMZml4ZWQgc2l6ZSkgeworICAgIENBTExfR0xfQVBJKGdsUG9pbnRTaXpleCwgc2l6ZSk7CisgICAgR0xMb2coImdsUG9pbnRTaXpleCIpIDw8IEdMTG9nRml4ZWQoc2l6ZSk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsUG9seWdvbk9mZnNldCkoR0xmbG9hdCBmYWN0b3IsIEdMZmxvYXQgdW5pdHMpIHsKKyAgICBDQUxMX0dMX0FQSShnbFBvbHlnb25PZmZzZXQsIGZhY3RvciwgdW5pdHMpOworICAgIEdMTG9nKCJnbFBvbHlnb25PZmZzZXQiKSA8PCBmYWN0b3IgPDwgdW5pdHM7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsUG9seWdvbk9mZnNldHgpKEdMZml4ZWQgZmFjdG9yLCBHTGZpeGVkIHVuaXRzKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xQb2x5Z29uT2Zmc2V0eCwgZmFjdG9yLCB1bml0cyk7CisgICAgR0xMb2coImdsUG9seWdvbk9mZnNldHgiKSA8PCBHTExvZ0ZpeGVkKGZhY3RvcikgPDwgR0xMb2dGaXhlZCh1bml0cyk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsUG9wTWF0cml4KSh2b2lkKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xQb3BNYXRyaXgpOworICAgIEdMTG9nKCJnbFBvcE1hdHJpeCIpOworfQorCit2b2lkIEFQSV9FTlRSWShnbFB1c2hNYXRyaXgpKHZvaWQpIHsKKyAgICBDQUxMX0dMX0FQSShnbFB1c2hNYXRyaXgpOworICAgIEdMTG9nKCJnbFB1c2hNYXRyaXgiKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xSZWFkUGl4ZWxzKSggIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICpwaXhlbHMpIHsKKyAgICBDQUxMX0dMX0FQSShnbFJlYWRQaXhlbHMsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgcGl4ZWxzKTsKKyAgICAvLyBYWFg6IHdlIG5lZWQgdG8gY29tcHV0ZSB0aGUgc2l6ZSBvZiB0aGlzIGJ1ZmZlcgorICAgIEdMTG9nKCJnbFJlYWRQaXhlbHMiKSA8PCB4IDw8IHkgPDwgd2lkdGggPDwgaGVpZ2h0IDw8IEdMTG9nRW51bShmb3JtYXQpIDw8IEdMTG9nRW51bSh0eXBlKQorICAgICAgICAgICAgPDwgR0xMb2dCdWZmZXI8dW5zaWduZWQgY2hhcj4oc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhciAqPihwaXhlbHMpKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xSb3RhdGVmKShHTGZsb2F0IGFuZ2xlLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xSb3RhdGVmLCBhbmdsZSwgeCwgeSwgeik7CisgICAgR0xMb2coImdsUm90YXRlZiIpIDw8IGFuZ2xlIDw8IHggPDwgeSA8PCB6OworfQorCit2b2lkIEFQSV9FTlRSWShnbFJvdGF0ZXgpKEdMZml4ZWQgYW5nbGUsIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopIHsKKyAgICBDQUxMX0dMX0FQSShnbFJvdGF0ZXgsIGFuZ2xlLCB4LCB5LCB6KTsKKyAgICBHTExvZygiZ2xSb3RhdGV4IikgPDwgR0xMb2dGaXhlZChhbmdsZSkgPDwgR0xMb2dGaXhlZCh4KSA8PCBHTExvZ0ZpeGVkKHkpIDw8IEdMTG9nRml4ZWQoeik7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsU2FtcGxlQ292ZXJhZ2UpKEdMY2xhbXBmIHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xTYW1wbGVDb3ZlcmFnZSwgdmFsdWUsIGludmVydCk7CisgICAgR0xMb2coImdsU2FtcGxlQ292ZXJhZ2UiKSA8PCB2YWx1ZSA8PCBHTExvZ0Jvb2woaW52ZXJ0KTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xTYW1wbGVDb3ZlcmFnZXgpKEdMY2xhbXB4IHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xTYW1wbGVDb3ZlcmFnZXgsIHZhbHVlLCBpbnZlcnQpOworICAgIEdMTG9nKCJnbFNhbXBsZUNvdmVyYWdleCIpIDw8IEdMTG9nRml4ZWQodmFsdWUpIDw8IEdMTG9nQm9vbChpbnZlcnQpOworfQorCit2b2lkIEFQSV9FTlRSWShnbFNjYWxlZikoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeikgeworICAgIENBTExfR0xfQVBJKGdsU2NhbGVmLCB4LCB5LCB6KTsKKyAgICBHTExvZygiZ2xTY2FsZWYiKSA8PCB4IDw8IHkgPDwgejsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xTY2FsZXgpKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopIHsKKyAgICBDQUxMX0dMX0FQSShnbFNjYWxleCwgeCwgeSwgeik7CisgICAgR0xMb2coImdsU2NhbGV4IikgPDwgR0xMb2dGaXhlZCh4KSA8PCBHTExvZ0ZpeGVkKHkpIDw8IEdMTG9nRml4ZWQoeik7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsU2Npc3NvcikoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpIHsKKyAgICBDQUxMX0dMX0FQSShnbFNjaXNzb3IsIHgsIHksIHdpZHRoLCBoZWlnaHQpOworICAgIEdMTG9nKCJnbFNjaXNzb3IiKSA8PCB4IDw8IHkgPDwgd2lkdGggPDwgaGVpZ2h0OworfQorCit2b2lkIEFQSV9FTlRSWShnbFNoYWRlTW9kZWwpKEdMZW51bSBtb2RlKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xTaGFkZU1vZGVsLCBtb2RlKTsKKyAgICBHTExvZygiZ2xTaGFkZU1vZGVsIikgPDwgR0xMb2dFbnVtKG1vZGUpOworfQorCit2b2lkIEFQSV9FTlRSWShnbFN0ZW5jaWxGdW5jKShHTGVudW0gZnVuYywgR0xpbnQgcmVmLCBHTHVpbnQgbWFzaykgeworICAgIENBTExfR0xfQVBJKGdsU3RlbmNpbEZ1bmMsIGZ1bmMsIHJlZiwgbWFzayk7CisgICAgR0xMb2coImdsU3RlbmNpbEZ1bmMiKSA8PCBHTExvZ0VudW0oZnVuYykgPDwgcmVmIDw8IG1hc2s7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsU3RlbmNpbE1hc2spKEdMdWludCBtYXNrKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xTdGVuY2lsTWFzaywgbWFzayk7CisgICAgR0xMb2coImdsU3RlbmNpbE1hc2siKSA8PCBtYXNrOworfQorCit2b2lkIEFQSV9FTlRSWShnbFN0ZW5jaWxPcCkoR0xlbnVtIGZhaWwsIEdMZW51bSB6ZmFpbCwgR0xlbnVtIHpwYXNzKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xTdGVuY2lsT3AsIGZhaWwsIHpmYWlsLCB6cGFzcyk7CisgICAgR0xMb2coImdsU3RlbmNpbE9wIikgPDwgR0xMb2dFbnVtKGZhaWwpIDw8IEdMTG9nRW51bSh6ZmFpbCkgPDwgR0xMb2dFbnVtKHpwYXNzKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xUZXhDb29yZFBvaW50ZXIpKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpIHsKKyAgICBDQUxMX0dMX0FQSShnbFRleENvb3JkUG9pbnRlciwgc2l6ZSwgdHlwZSwgc3RyaWRlLCBwb2ludGVyKTsKKyAgICBHTExvZygiZ2xUZXhDb29yZFBvaW50ZXIiKSA8PCBzaXplIDw8IEdMTG9nRW51bSh0eXBlKSA8PCBzdHJpZGUgPDwgcG9pbnRlcjsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xUZXhFbnZmKShHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pIHsKKyAgICBDQUxMX0dMX0FQSShnbFRleEVudmYsIHRhcmdldCwgcG5hbWUsIHBhcmFtKTsKKyAgICBHTExvZygiZ2xUZXhFbnZmIikgPDwgR0xMb2dFbnVtKHRhcmdldCkgPDwgR0xMb2dFbnVtKHBuYW1lKSA8PCBwYXJhbTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xUZXhFbnZmdikoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpIHsKKyAgICBDQUxMX0dMX0FQSShnbFRleEVudmZ2LCB0YXJnZXQsIHBuYW1lLCBwYXJhbXMpOworICAgIC8vIFhYWDogd2UgbmVlZCB0byBjb21wdXRlIHRoZSBzaXplIG9mIHRoaXMgYnVmZmVyCisgICAgR0xMb2coImdsVGV4RW52eCIpIDw8IEdMTG9nRW51bSh0YXJnZXQpIDw8IEdMTG9nRW51bShwbmFtZSkgPDwgR0xMb2dCdWZmZXI8R0xmbG9hdD4ocGFyYW1zKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xUZXhFbnZ4KShHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pIHsKKyAgICBDQUxMX0dMX0FQSShnbFRleEVudngsIHRhcmdldCwgcG5hbWUsIHBhcmFtKTsKKyAgICBHTExvZygiZ2xUZXhFbnZ4IikgPDwgR0xMb2dFbnVtKHRhcmdldCkgPDwgR0xMb2dFbnVtKHBuYW1lKSA8PCBHTExvZ0ZpeGVkKHBhcmFtKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xUZXhFbnZ4dikoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpIHsKKyAgICBDQUxMX0dMX0FQSShnbFRleEVudnh2LCB0YXJnZXQsIHBuYW1lLCBwYXJhbXMpOworICAgIC8vIFhYWDogd2UgbmVlZCB0byBjb21wdXRlIHRoZSBzaXplIG9mIHRoaXMgYnVmZmVyCisgICAgR0xMb2coImdsVGV4RW52eHYiKSA8PCBHTExvZ0VudW0odGFyZ2V0KSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IEdMTG9nQnVmZmVyPEdMZml4ZWQ+KHBhcmFtcyk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsVGV4SW1hZ2UyRCkoICBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgaW50ZXJuYWxmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMZW51bSBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscykgeworICAgIENBTExfR0xfQVBJKGdsVGV4SW1hZ2UyRCwgdGFyZ2V0LCBsZXZlbCwgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICBib3JkZXIsIGZvcm1hdCwgdHlwZSwgcGl4ZWxzKTsKKyAgICBHTExvZygiZ2xUZXhJbWFnZTJEIikgPDwgR0xMb2dFbnVtKHRhcmdldCkgPDwgbGV2ZWwgPDwgR0xMb2dFbnVtKGludGVybmFsZm9ybWF0KQorICAgICAgICAgICAgPDwgd2lkdGggPDwgaGVpZ2h0IDw8IGJvcmRlciA8PCBHTExvZ0VudW0oZm9ybWF0KSA8PCBHTExvZ0VudW0odHlwZSkKKyAgICAgICAgICAgIDw8IEdMTG9nQnVmZmVyPHVuc2lnbmVkIGNoYXI+KCBzdGF0aWNfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyICo+KHBpeGVscykpOworfQorCit2b2lkIEFQSV9FTlRSWShnbFRleFBhcmFtZXRlcmYpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSkgeworICAgIENBTExfR0xfQVBJKGdsVGV4UGFyYW1ldGVyZiwgdGFyZ2V0LCBwbmFtZSwgcGFyYW0pOworICAgIEdMTG9nKCJnbFRleFBhcmFtZXRlcmYiKSA8PCBHTExvZ0VudW0odGFyZ2V0KSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IHBhcmFtOworfQorCit2b2lkIEFQSV9FTlRSWShnbFRleFBhcmFtZXRlcngpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkgeworICAgIENBTExfR0xfQVBJKGdsVGV4UGFyYW1ldGVyeCwgdGFyZ2V0LCBwbmFtZSwgcGFyYW0pOworICAgIEdMTG9nKCJnbFRleFBhcmFtZXRlcngiKSA8PCBHTExvZ0VudW0odGFyZ2V0KSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IEdMTG9nRml4ZWQocGFyYW0pOworfQorCit2b2lkIEFQSV9FTlRSWShnbFRleFN1YkltYWdlMkQpKCAgIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpIHsKKyAgICBDQUxMX0dMX0FQSShnbFRleFN1YkltYWdlMkQsIHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQsCisgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIHBpeGVscyk7CisgICAgR0xMb2coImdsVGV4U3ViSW1hZ2UyRCIpIDw8IEdMTG9nRW51bSh0YXJnZXQpIDw8IGxldmVsIDw8IHhvZmZzZXQgPDwgeW9mZnNldAorICAgICAgICAgICAgPDwgd2lkdGggPDwgaGVpZ2h0IDw8IEdMTG9nRW51bShmb3JtYXQpIDw8IEdMTG9nRW51bSh0eXBlKQorICAgICAgICAgICAgPDwgR0xMb2dCdWZmZXI8dW5zaWduZWQgY2hhcj4oIHN0YXRpY19jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIgKj4ocGl4ZWxzKSk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsVHJhbnNsYXRlZikoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeikgeworICAgIENBTExfR0xfQVBJKGdsVHJhbnNsYXRlZiwgeCwgeSwgeik7CisgICAgR0xMb2coImdsVHJhbnNsYXRlZiIpIDw8IHggPDwgeSA8PCB6OworfQorCit2b2lkIEFQSV9FTlRSWShnbFRyYW5zbGF0ZXgpKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopIHsKKyAgICBDQUxMX0dMX0FQSShnbFRyYW5zbGF0ZXgsIHgsIHksIHopOworICAgIEdMTG9nKCJnbFRyYW5zbGF0ZXgiKSA8PCBHTExvZ0ZpeGVkKHgpIDw8IEdMTG9nRml4ZWQoeSkgPDwgR0xMb2dGaXhlZCh6KTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xWZXJ0ZXhQb2ludGVyKSggICBHTGludCBzaXplLCBHTGVudW0gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpIHsKKyAgICBDQUxMX0dMX0FQSShnbFZlcnRleFBvaW50ZXIsIHNpemUsIHR5cGUsIHN0cmlkZSwgcG9pbnRlcik7CisgICAgR0xMb2coImdsVmVydGV4UG9pbnRlciIpIDw8IHNpemUgPDwgR0xMb2dFbnVtKHR5cGUpIDw8IHN0cmlkZSA8PCBwb2ludGVyOworfQorCit2b2lkIEFQSV9FTlRSWShnbFZpZXdwb3J0KShHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCkgeworICAgIENBTExfR0xfQVBJKGdsVmlld3BvcnQsIHgsIHksIHdpZHRoLCBoZWlnaHQpOworICAgIEdMTG9nKCJnbFZpZXdwb3J0IikgPDwgeCA8PCB5IDw8IHdpZHRoIDw8IGhlaWdodDsKK30KKworLy8gRVMgMS4xCit2b2lkIEFQSV9FTlRSWShnbENsaXBQbGFuZWYpKEdMZW51bSBwbGFuZSwgY29uc3QgR0xmbG9hdCAqZXF1YXRpb24pIHsKKyAgICBDQUxMX0dMX0FQSShnbENsaXBQbGFuZWYsIHBsYW5lLCBlcXVhdGlvbik7CisgICAgR0xMb2coImdsQ2xpcFBsYW5lZiIpIDw8IEdMTG9nRW51bShwbGFuZSkgPDwgR0xMb2dCdWZmZXI8R0xmbG9hdD4oZXF1YXRpb24sIDQpOworfQordm9pZCBBUElfRU5UUlkoZ2xDbGlwUGxhbmV4KShHTGVudW0gcGxhbmUsIGNvbnN0IEdMZml4ZWQgKmVxdWF0aW9uKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xDbGlwUGxhbmV4LCBwbGFuZSwgZXF1YXRpb24pOworICAgIEdMTG9nKCJnbENsaXBQbGFuZXgiKSA8PCBHTExvZ0VudW0ocGxhbmUpIDw8IEdMTG9nQnVmZmVyPEdMZml4ZWQ+KGVxdWF0aW9uLCA0KTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsQmluZEJ1ZmZlcikoR0xlbnVtIHRhcmdldCwgR0x1aW50IGJ1ZmZlcikgeworICAgIENBTExfR0xfQVBJKGdsQmluZEJ1ZmZlciwgdGFyZ2V0LCBidWZmZXIpOworICAgIEdMTG9nKCJnbEJpbmRCdWZmZXIiKSA8PCBHTExvZ0VudW0odGFyZ2V0KSA8PCBidWZmZXI7Cit9Cit2b2lkIEFQSV9FTlRSWShnbEJ1ZmZlckRhdGEpKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgY29uc3QgR0x2b2lkKiBkYXRhLCBHTGVudW0gdXNhZ2UpIHsKKyAgICBDQUxMX0dMX0FQSShnbEJ1ZmZlckRhdGEsIHRhcmdldCwgc2l6ZSwgZGF0YSwgdXNhZ2UpOworICAgIEdMTG9nKCJnbEJ1ZmZlckRhdGEiKSA8PCBHTExvZ0VudW0odGFyZ2V0KSA8PCBzaXplCisgICAgICAgIDw8IEdMTG9nQnVmZmVyPHVuc2lnbmVkIGNoYXI+KHN0YXRpY19jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPihkYXRhKSwgc2l6ZSk7Cit9Cit2b2lkIEFQSV9FTlRSWShnbEJ1ZmZlclN1YkRhdGEpKEdMZW51bSB0YXJnZXQsIEdMaW50cHRyIG9mZnNldCwgR0xzaXplaXB0ciBzaXplLCBjb25zdCBHTHZvaWQqIGRhdGEpIHsKKyAgICBDQUxMX0dMX0FQSShnbEJ1ZmZlclN1YkRhdGEsIHRhcmdldCwgb2Zmc2V0LCBzaXplLCBkYXRhKTsKKyAgICBHTExvZygiZ2xCdWZmZXJTdWJEYXRhIikgPDwgR0xMb2dFbnVtKHRhcmdldCkgPDwgb2Zmc2V0IDw8IHNpemUKKyAgICAgICAgPDwgR0xMb2dCdWZmZXI8dW5zaWduZWQgY2hhcj4oc3RhdGljX2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KGRhdGEpLCBzaXplKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsRGVsZXRlQnVmZmVycykoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIGJ1ZmZlcnMpIHsKKyAgICBDQUxMX0dMX0FQSShnbERlbGV0ZUJ1ZmZlcnMsIG4sIGJ1ZmZlcnMpOworICAgIEdMTG9nKCJnbERlbGV0ZUJ1ZmZlcnMiKSA8PCBuIDw8IEdMTG9nQnVmZmVyPEdMdWludD4oYnVmZmVycywgbik7Cit9Cit2b2lkIEFQSV9FTlRSWShnbEdlbkJ1ZmZlcnMpKEdMc2l6ZWkgbiwgR0x1aW50KiBidWZmZXJzKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xHZW5CdWZmZXJzLCBuLCBidWZmZXJzKTsKKyAgICBHTExvZygiZ2xHZW5CdWZmZXJzIikgPDwgbiA8PCBHTExvZ0J1ZmZlcjxHTHVpbnQ+KGJ1ZmZlcnMsIG4pOworfQordm9pZCBBUElfRU5UUlkoZ2xHZXRCb29sZWFudikoR0xlbnVtIHBuYW1lLCBHTGJvb2xlYW4gKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsR2V0Qm9vbGVhbnYsIHBuYW1lLCBwYXJhbXMpOworICAgIC8vIFhYWDogd2UgbmVlZCB0byBjb21wdXRlIHRoZSBzaXplIG9mIHRoaXMgYnVmZmVyCisgICAgR0xMb2coImdsR2V0Qm9vbGVhbnYiKSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IEdMTG9nQnVmZmVyPEdMYm9vbGVhbj4ocGFyYW1zKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsR2V0Rml4ZWR2KShHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsR2V0Rml4ZWR2LCBwbmFtZSwgcGFyYW1zKTsKKyAgICAvLyBYWFg6IHdlIG5lZWQgdG8gY29tcHV0ZSB0aGUgc2l6ZSBvZiB0aGlzIGJ1ZmZlcgorICAgIEdMTG9nKCJnbEdldEZpeGVkdiIpIDw8IEdMTG9nRW51bShwbmFtZSkgPDwgR0xMb2dCdWZmZXI8R0xmaXhlZD4ocGFyYW1zKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsR2V0RmxvYXR2KShHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsR2V0RmxvYXR2LCBwbmFtZSwgcGFyYW1zKTsKKyAgICAvLyBYWFg6IHdlIG5lZWQgdG8gY29tcHV0ZSB0aGUgc2l6ZSBvZiB0aGlzIGJ1ZmZlcgorICAgIEdMTG9nKCJnbEdldEZsb2F0diIpIDw8IEdMTG9nRW51bShwbmFtZSkgPDwgR0xMb2dCdWZmZXI8R0xmbG9hdD4ocGFyYW1zKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsR2V0UG9pbnRlcnYpKEdMZW51bSBwbmFtZSwgdm9pZCAqKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsR2V0UG9pbnRlcnYsIHBuYW1lLCBwYXJhbXMpOworICAgIC8vIFhYWDogd2UgbmVlZCB0byBjb21wdXRlIHRoZSBzaXplIG9mIHRoaXMgYnVmZmVyCisgICAgR0xMb2coImdsR2V0UG9pbnRlcnYiKSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IEdMTG9nQnVmZmVyPHZvaWQqPihwYXJhbXMpOworfQordm9pZCBBUElfRU5UUlkoZ2xHZXRCdWZmZXJQYXJhbWV0ZXJpdikoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKSB7CisgICAgLy8gWFhYOiB3ZSBuZWVkIHRvIGNvbXB1dGUgdGhlIHNpemUgb2YgdGhpcyBidWZmZXIKKyAgICBDQUxMX0dMX0FQSShnbEdldEJ1ZmZlclBhcmFtZXRlcml2LCB0YXJnZXQsIHBuYW1lLCBwYXJhbXMpOworICAgIEdMTG9nKCJnbEdldEJ1ZmZlclBhcmFtZXRlcml2IikgPDwgR0xMb2dFbnVtKHRhcmdldCkgPDwgR0xMb2dFbnVtKHBuYW1lKSA8PCBHTExvZ0J1ZmZlcjxHTGludD4ocGFyYW1zKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsR2V0Q2xpcFBsYW5lZikoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IGVxbls0XSkgeworICAgIENBTExfR0xfQVBJKGdsR2V0Q2xpcFBsYW5lZiwgcG5hbWUsIGVxbik7CisgICAgR0xMb2coImdsR2V0Q2xpcFBsYW5lZiIpIDw8IEdMTG9nRW51bShwbmFtZSkgPDwgR0xMb2dCdWZmZXI8R0xmbG9hdD4oZXFuLCA0KTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsR2V0Q2xpcFBsYW5leCkoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIGVxbls0XSkgeworICAgIENBTExfR0xfQVBJKGdsR2V0Q2xpcFBsYW5leCwgcG5hbWUsIGVxbik7CisgICAgR0xMb2coImdsR2V0Q2xpcFBsYW5leCIpIDw8IEdMTG9nRW51bShwbmFtZSkgPDwgR0xMb2dCdWZmZXI8R0xmaXhlZD4oZXFuLCA0KTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsR2V0TGlnaHR4dikoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsR2V0TGlnaHR4diwgbGlnaHQsIHBuYW1lLCBwYXJhbXMpOworICAgIC8vIFhYWDogd2UgbmVlZCB0byBjb21wdXRlIHRoZSBzaXplIG9mIHRoaXMgYnVmZmVyCisgICAgR0xMb2coImdsR2V0TGlnaHR4diIpIDw8IEdMTG9nRW51bShsaWdodCkgPDwgR0xMb2dFbnVtKHBuYW1lKSA8PCBHTExvZ0J1ZmZlcjxHTGZpeGVkPihwYXJhbXMpOworfQordm9pZCBBUElfRU5UUlkoZ2xHZXRMaWdodGZ2KShHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xHZXRMaWdodGZ2LCBsaWdodCwgcG5hbWUsIHBhcmFtcyk7CisgICAgLy8gWFhYOiB3ZSBuZWVkIHRvIGNvbXB1dGUgdGhlIHNpemUgb2YgdGhpcyBidWZmZXIKKyAgICBHTExvZygiZ2xHZXRMaWdodGZ2IikgPDwgR0xMb2dFbnVtKGxpZ2h0KSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IEdMTG9nQnVmZmVyPEdMZmxvYXQ+KHBhcmFtcyk7Cit9Cit2b2lkIEFQSV9FTlRSWShnbEdldE1hdGVyaWFseHYpKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsR2V0TWF0ZXJpYWx4diwgZmFjZSwgcG5hbWUsIHBhcmFtcyk7CisgICAgLy8gWFhYOiB3ZSBuZWVkIHRvIGNvbXB1dGUgdGhlIHNpemUgb2YgdGhpcyBidWZmZXIKKyAgICBHTExvZygiZ2xHZXRNYXRlcmlhbHh2IikgPDwgR0xMb2dFbnVtKGZhY2UpIDw8IEdMTG9nRW51bShwbmFtZSkgPDwgR0xMb2dCdWZmZXI8R0xmaXhlZD4ocGFyYW1zKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsR2V0TWF0ZXJpYWxmdikoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xHZXRNYXRlcmlhbGZ2LCBmYWNlLCBwbmFtZSwgcGFyYW1zKTsKKyAgICAvLyBYWFg6IHdlIG5lZWQgdG8gY29tcHV0ZSB0aGUgc2l6ZSBvZiB0aGlzIGJ1ZmZlcgorICAgIEdMTG9nKCJnbEdldE1hdGVyaWFsZnYiKSA8PCBHTExvZ0VudW0oZmFjZSkgPDwgR0xMb2dFbnVtKHBuYW1lKSA8PCBHTExvZ0J1ZmZlcjxHTGZsb2F0PihwYXJhbXMpOworfQordm9pZCBBUElfRU5UUlkoZ2xHZXRUZXhFbnZmdikoR0xlbnVtIGVudiwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpIHsKKyAgICBDQUxMX0dMX0FQSShnbEdldFRleEVudmZ2LCBlbnYsIHBuYW1lLCBwYXJhbXMpOworICAgIC8vIFhYWDogd2UgbmVlZCB0byBjb21wdXRlIHRoZSBzaXplIG9mIHRoaXMgYnVmZmVyCisgICAgR0xMb2coImdsR2V0VGV4RW52ZnYiKSA8PCBHTExvZ0VudW0oZW52KSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IEdMTG9nQnVmZmVyPEdMZmxvYXQ+KHBhcmFtcyk7Cit9Cit2b2lkIEFQSV9FTlRSWShnbEdldFRleEVudml2KShHTGVudW0gZW52LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpIHsKKyAgICBDQUxMX0dMX0FQSShnbEdldFRleEVudml2LCBlbnYsIHBuYW1lLCBwYXJhbXMpOworICAgIC8vIFhYWDogd2UgbmVlZCB0byBjb21wdXRlIHRoZSBzaXplIG9mIHRoaXMgYnVmZmVyCisgICAgR0xMb2coImdsR2V0VGV4RW52aXYiKSA8PCBHTExvZ0VudW0oZW52KSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IEdMTG9nQnVmZmVyPEdMaW50PihwYXJhbXMpOworfQordm9pZCBBUElfRU5UUlkoZ2xHZXRUZXhFbnZ4dikoR0xlbnVtIGVudiwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpIHsKKyAgICBDQUxMX0dMX0FQSShnbEdldFRleEVudnh2LCBlbnYsIHBuYW1lLCBwYXJhbXMpOworICAgIC8vIFhYWDogd2UgbmVlZCB0byBjb21wdXRlIHRoZSBzaXplIG9mIHRoaXMgYnVmZmVyCisgICAgR0xMb2coImdsR2V0VGV4RW52eHYiKSA8PCBHTExvZ0VudW0oZW52KSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IEdMTG9nQnVmZmVyPEdMZml4ZWQ+KHBhcmFtcyk7Cit9Cit2b2lkIEFQSV9FTlRSWShnbEdldFRleFBhcmFtZXRlcmZ2KShHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsR2V0VGV4UGFyYW1ldGVyZnYsIHRhcmdldCwgcG5hbWUsIHBhcmFtcyk7CisgICAgLy8gWFhYOiB3ZSBuZWVkIHRvIGNvbXB1dGUgdGhlIHNpemUgb2YgdGhpcyBidWZmZXIKKyAgICBHTExvZygiZ2xHZXRUZXhQYXJhbWV0ZXJmdiIpIDw8IEdMTG9nRW51bSh0YXJnZXQpIDw8IEdMTG9nRW51bShwbmFtZSkgPDwgR0xMb2dCdWZmZXI8R0xmbG9hdD4ocGFyYW1zKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsR2V0VGV4UGFyYW1ldGVyaXYpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsR2V0VGV4UGFyYW1ldGVyaXYsIHRhcmdldCwgcG5hbWUsIHBhcmFtcyk7CisgICAgLy8gWFhYOiB3ZSBuZWVkIHRvIGNvbXB1dGUgdGhlIHNpemUgb2YgdGhpcyBidWZmZXIKKyAgICBHTExvZygiZ2xHZXRUZXhQYXJhbWV0ZXJpdiIpIDw8IEdMTG9nRW51bSh0YXJnZXQpIDw8IEdMTG9nRW51bShwbmFtZSkgPDwgR0xMb2dCdWZmZXI8R0xpbnQ+KHBhcmFtcyk7Cit9Cit2b2lkIEFQSV9FTlRSWShnbEdldFRleFBhcmFtZXRlcnh2KShHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsR2V0VGV4UGFyYW1ldGVyeHYsIHRhcmdldCwgcG5hbWUsIHBhcmFtcyk7CisgICAgLy8gWFhYOiB3ZSBuZWVkIHRvIGNvbXB1dGUgdGhlIHNpemUgb2YgdGhpcyBidWZmZXIKKyAgICBHTExvZygiZ2xHZXRUZXhQYXJhbWV0ZXJ4diIpIDw8IEdMTG9nRW51bSh0YXJnZXQpIDw8IEdMTG9nRW51bShwbmFtZSkgPDwgR0xMb2dCdWZmZXI8R0xmaXhlZD4ocGFyYW1zKTsKK30KK0dMYm9vbGVhbiBBUElfRU5UUlkoZ2xJc0J1ZmZlcikoR0x1aW50IGJ1ZmZlcikgeworICAgIEdMTG9nKCJnbElzQnVmZmVyIikgPDwgYnVmZmVyOworICAgIENBTExfR0xfQVBJX1JFVFVSTihnbElzQnVmZmVyLCBidWZmZXIpOworfQorR0xib29sZWFuIEFQSV9FTlRSWShnbElzRW5hYmxlZCkoR0xlbnVtIGNhcCkgeworICAgIEdMTG9nKCJnbElzRW5hYmxlZCIpIDw8IEdMTG9nRW51bShjYXApOworICAgIENBTExfR0xfQVBJX1JFVFVSTihnbElzRW5hYmxlZCwgY2FwKTsKK30KK0dMYm9vbGVhbiBBUElfRU5UUlkoZ2xJc1RleHR1cmUpKEdMdWludCB0ZXh0dXJlKSB7CisgICAgR0xMb2coImdsSXNUZXh0dXJlIikgPDwgdGV4dHVyZTsKKyAgICBDQUxMX0dMX0FQSV9SRVRVUk4oZ2xJc1RleHR1cmUsIHRleHR1cmUpOworfQordm9pZCBBUElfRU5UUlkoZ2xQb2ludFBhcmFtZXRlcmYpKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSkgeworICAgIENBTExfR0xfQVBJKGdsUG9pbnRQYXJhbWV0ZXJmLCBwbmFtZSwgcGFyYW0pOworICAgIEdMTG9nKCJnbFBvaW50UGFyYW1ldGVyZiIpIDw8IEdMTG9nRW51bShwbmFtZSkgPDwgcGFyYW07Cit9Cit2b2lkIEFQSV9FTlRSWShnbFBvaW50UGFyYW1ldGVyZnYpKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xQb2ludFBhcmFtZXRlcmZ2LCBwbmFtZSwgcGFyYW1zKTsKKyAgICAvLyBYWFg6IHdlIG5lZWQgdG8gY29tcHV0ZSB0aGUgc2l6ZSBvZiB0aGlzIGJ1ZmZlcgorICAgIEdMTG9nKCJnbFBvaW50UGFyYW1ldGVyZnYiKSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IEdMTG9nQnVmZmVyPEdMZmxvYXQ+KHBhcmFtcyk7Cit9Cit2b2lkIEFQSV9FTlRSWShnbFBvaW50UGFyYW1ldGVyeCkoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xQb2ludFBhcmFtZXRlcngsIHBuYW1lLCBwYXJhbSk7CisgICAgR0xMb2coImdsUG9pbnRQYXJhbWV0ZXJ4IikgPDwgR0xMb2dFbnVtKHBuYW1lKSA8PCBHTExvZ0ZpeGVkKHBhcmFtKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsUG9pbnRQYXJhbWV0ZXJ4dikoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpIHsKKyAgICBDQUxMX0dMX0FQSShnbFBvaW50UGFyYW1ldGVyeHYsIHBuYW1lLCBwYXJhbXMpOworICAgIC8vIFhYWDogd2UgbmVlZCB0byBjb21wdXRlIHRoZSBzaXplIG9mIHRoaXMgYnVmZmVyCisgICAgR0xMb2coImdsUG9pbnRQYXJhbWV0ZXJ4diIpIDw8IEdMTG9nRW51bShwbmFtZSkgPDwgR0xMb2dCdWZmZXI8R0xmaXhlZD4ocGFyYW1zKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsQ29sb3I0dWIpKEdMdWJ5dGUgcmVkLCBHTHVieXRlIGdyZWVuLCBHTHVieXRlIGJsdWUsIEdMdWJ5dGUgYWxwaGEpIHsKKyAgICBDQUxMX0dMX0FQSShnbENvbG9yNHViLCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7CisgICAgR0xMb2coImdsQ29sb3I0dWIiKSA8PCByZWQgPDwgZ3JlZW4gPDwgYmx1ZSA8PCBhbHBoYTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsVGV4RW52aSkoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSkgeworICAgIENBTExfR0xfQVBJKGdsVGV4RW52aSwgdGFyZ2V0LCBwbmFtZSwgcGFyYW0pOworICAgIEdMTG9nKCJnbFRleEVudmkiKSA8PCBHTExvZ0VudW0odGFyZ2V0KSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IHBhcmFtOworfQordm9pZCBBUElfRU5UUlkoZ2xUZXhFbnZpdikoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xUZXhFbnZpdiwgdGFyZ2V0LCBwbmFtZSwgcGFyYW1zKTsKKyAgICAvLyBYWFg6IHdlIG5lZWQgdG8gY29tcHV0ZSB0aGUgc2l6ZSBvZiB0aGlzIGJ1ZmZlcgorICAgIEdMTG9nKCJnbFRleEVudml2IikgPDwgR0xMb2dFbnVtKHRhcmdldCkgPDwgR0xMb2dFbnVtKHBuYW1lKSA8PCBHTExvZ0J1ZmZlcjxHTGludD4ocGFyYW1zKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xUZXhQYXJhbWV0ZXJmdikoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpIHsKKyAgICBDQUxMX0dMX0FQSShnbFRleFBhcmFtZXRlcmZ2LCB0YXJnZXQsIHBuYW1lLCBwYXJhbXMpOworICAgIC8vIFhYWDogd2UgbmVlZCB0byBjb21wdXRlIHRoZSBzaXplIG9mIHRoaXMgYnVmZmVyCisgICAgR0xMb2coImdsVGV4UGFyYW1ldGVyZnYiKSA8PCBHTExvZ0VudW0odGFyZ2V0KSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IEdMTG9nQnVmZmVyPEdMZmxvYXQ+KHBhcmFtcyk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsVGV4UGFyYW1ldGVyaXYpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsVGV4UGFyYW1ldGVyaXYsIHRhcmdldCwgcG5hbWUsIHBhcmFtcyk7CisgICAgLy8gWFhYOiB3ZSBuZWVkIHRvIGNvbXB1dGUgdGhlIHNpemUgb2YgdGhpcyBidWZmZXIKKyAgICBHTExvZygiZ2xUZXhQYXJhbWV0ZXJpdiIpIDw8IEdMTG9nRW51bSh0YXJnZXQpIDw8IEdMTG9nRW51bShwbmFtZSkgPDwgR0xMb2dCdWZmZXI8R0xpbnQ+KHBhcmFtcyk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsVGV4UGFyYW1ldGVyaSkoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSkgeworICAgIENBTExfR0xfQVBJKGdsVGV4UGFyYW1ldGVyaSwgdGFyZ2V0LCBwbmFtZSwgcGFyYW0pOworICAgIEdMTG9nKCJnbFRleFBhcmFtZXRlcmkiKSA8PCBHTExvZ0VudW0odGFyZ2V0KSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IHBhcmFtOworfQordm9pZCBBUElfRU5UUlkoZ2xUZXhQYXJhbWV0ZXJ4dikoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpIHsKKyAgICBDQUxMX0dMX0FQSShnbFRleFBhcmFtZXRlcnh2LCB0YXJnZXQsIHBuYW1lLCBwYXJhbXMpOworICAgIC8vIFhYWDogd2UgbmVlZCB0byBjb21wdXRlIHRoZSBzaXplIG9mIHRoaXMgYnVmZmVyCisgICAgR0xMb2coImdsVGV4UGFyYW1ldGVyeHYiKSA8PCBHTExvZ0VudW0odGFyZ2V0KSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IEdMTG9nQnVmZmVyPEdMZml4ZWQ+KHBhcmFtcyk7Cit9Cit2b2lkIEFQSV9FTlRSWShnbFBvaW50U2l6ZVBvaW50ZXJPRVMpKEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xQb2ludFNpemVQb2ludGVyT0VTLCB0eXBlLCBzdHJpZGUsIHBvaW50ZXIpOworICAgIEdMTG9nKCJnbFBvaW50U2l6ZVBvaW50ZXJPRVMiKSA8PCBHTExvZ0VudW0odHlwZSkgPDwgc3RyaWRlIDw8IHBvaW50ZXI7Cit9CisKKy8vIEV4dGVuc2lvbnMKK3ZvaWQgQVBJX0VOVFJZKGdsRHJhd1RleHNPRVMpKEdMc2hvcnQgeCAsIEdMc2hvcnQgeSwgR0xzaG9ydCB6LCBHTHNob3J0IHcsIEdMc2hvcnQgaCkgeworICAgIENBTExfR0xfQVBJKGdsRHJhd1RleHNPRVMsIHgsIHksIHosIHcsIGgpOworICAgIEdMTG9nKCJnbERyYXdUZXhzT0VTIikgPDwgeCA8PCB5IDw8IHogPDwgdyA8PCBoOworfQordm9pZCBBUElfRU5UUlkoZ2xEcmF3VGV4aU9FUykoR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgdywgR0xpbnQgaCkgeworICAgIENBTExfR0xfQVBJKGdsRHJhd1RleGlPRVMsIHgsIHksIHosIHcsIGgpOworICAgIEdMTG9nKCJnbERyYXdUZXhpT0VTIikgPDwgeCA8PCB5IDw8IHogPDwgdyA8PCBoOworfQordm9pZCBBUElfRU5UUlkoZ2xEcmF3VGV4Zk9FUykoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3LCBHTGZsb2F0IGgpIHsKKyAgICBDQUxMX0dMX0FQSShnbERyYXdUZXhmT0VTLCB4LCB5LCB6LCB3LCBoKTsKKyAgICBHTExvZygiZ2xEcmF3VGV4Zk9FUyIpIDw8IHggPDwgeSA8PCB6IDw8IHcgPDwgaDsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsRHJhd1RleHhPRVMpKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHosIEdMZml4ZWQgdywgR0xmaXhlZCBoKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xEcmF3VGV4eE9FUywgeCwgeSwgeiwgdywgaCk7CisgICAgR0xMb2coImdsRHJhd1RleGZPRVMiKSA8PCBHTExvZ0ZpeGVkKHgpIDw8IEdMTG9nRml4ZWQoeSkgPDwgR0xMb2dGaXhlZCh6KSA8PCBHTExvZ0ZpeGVkKHcpIDw8IEdMTG9nRml4ZWQoaCk7Cit9Cit2b2lkIEFQSV9FTlRSWShnbERyYXdUZXhzdk9FUykoY29uc3QgR0xzaG9ydCogY29vcmRzKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xEcmF3VGV4c3ZPRVMsIGNvb3Jkcyk7CisgICAgR0xMb2coImdsRHJhd1RleHN2T0VTIikgPDwgR0xMb2dCdWZmZXI8R0xzaG9ydD4oY29vcmRzLCA1KTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsRHJhd1RleGl2T0VTKShjb25zdCBHTGludCogY29vcmRzKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xEcmF3VGV4aXZPRVMsIGNvb3Jkcyk7CisgICAgR0xMb2coImdsRHJhd1RleGl2T0VTIikgPDwgR0xMb2dCdWZmZXI8R0xpbnQ+KGNvb3JkcywgNSk7Cit9Cit2b2lkIEFQSV9FTlRSWShnbERyYXdUZXhmdk9FUykoY29uc3QgR0xmbG9hdCogY29vcmRzKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xEcmF3VGV4ZnZPRVMsIGNvb3Jkcyk7CisgICAgR0xMb2coImdsRHJhd1RleGZ2T0VTIikgPDwgR0xMb2dCdWZmZXI8R0xmbG9hdD4oY29vcmRzLCA1KTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsRHJhd1RleHh2T0VTKShjb25zdCBHTGZpeGVkKiBjb29yZHMpIHsKKyAgICBDQUxMX0dMX0FQSShnbERyYXdUZXh4dk9FUywgY29vcmRzKTsKKyAgICBHTExvZygiZ2xEcmF3VGV4eHZPRVMiKSA8PCBHTExvZ0J1ZmZlcjxHTGZpeGVkPihjb29yZHMsIDUpOworfQorR0xiaXRmaWVsZCBBUElfRU5UUlkoZ2xRdWVyeU1hdHJpeHhPRVMpKEdMZml4ZWQqIG1hbnRpc3NhLCBHTGludCogZXhwb25lbnQpIHsKKyAgICBHTExvZygiZ2xRdWVyeU1hdHJpeHhPRVMiKSA8PCBHTExvZ0J1ZmZlcjxHTGZpeGVkPihtYW50aXNzYSwgMTYpIDw8IEdMTG9nQnVmZmVyPEdMZml4ZWQ+KGV4cG9uZW50LCAxNik7CisgICAgQ0FMTF9HTF9BUElfUkVUVVJOKGdsUXVlcnlNYXRyaXh4T0VTLCBtYW50aXNzYSwgZXhwb25lbnQpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvZWdsX2VudHJpZXMuaW4gYi9vcGVuZ2wvbGlicy9lZ2xfZW50cmllcy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2I0YzY1Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2xpYnMvZWdsX2VudHJpZXMuaW4KQEAgLTAsMCArMSw0NSBAQAorRUdMX0VOVFJZKEVHTERpc3BsYXksIGVnbEdldERpc3BsYXksIE5hdGl2ZURpc3BsYXlUeXBlKQorRUdMX0VOVFJZKEVHTEJvb2xlYW4sIGVnbEluaXRpYWxpemUsIEVHTERpc3BsYXksIEVHTGludCosIEVHTGludCopCitFR0xfRU5UUlkoRUdMQm9vbGVhbiwgZWdsVGVybWluYXRlLCBFR0xEaXNwbGF5KQorRUdMX0VOVFJZKEVHTEJvb2xlYW4sIGVnbEdldENvbmZpZ3MsIEVHTERpc3BsYXksIEVHTENvbmZpZyosIEVHTGludCwgRUdMaW50KikKK0VHTF9FTlRSWShFR0xCb29sZWFuLCBlZ2xDaG9vc2VDb25maWcsIEVHTERpc3BsYXksIGNvbnN0IEVHTGludCAqLCBFR0xDb25maWcgKiwgRUdMaW50LCBFR0xpbnQgKikKKworRUdMX0VOVFJZKEVHTEJvb2xlYW4sIGVnbEdldENvbmZpZ0F0dHJpYiwgRUdMRGlzcGxheSwgRUdMQ29uZmlnLCBFR0xpbnQsIEVHTGludCAqKQorRUdMX0VOVFJZKEVHTFN1cmZhY2UsIGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UsIEVHTERpc3BsYXksIEVHTENvbmZpZywgTmF0aXZlV2luZG93VHlwZSwgY29uc3QgRUdMaW50ICopCitFR0xfRU5UUlkoRUdMU3VyZmFjZSwgZWdsQ3JlYXRlUGl4bWFwU3VyZmFjZSwgRUdMRGlzcGxheSwgRUdMQ29uZmlnLCBOYXRpdmVQaXhtYXBUeXBlLCBjb25zdCBFR0xpbnQgKikKK0VHTF9FTlRSWShFR0xTdXJmYWNlLCBlZ2xDcmVhdGVQYnVmZmVyU3VyZmFjZSwgIEVHTERpc3BsYXksIEVHTENvbmZpZywgY29uc3QgRUdMaW50ICopCitFR0xfRU5UUlkoRUdMQm9vbGVhbiwgZWdsRGVzdHJveVN1cmZhY2UsIEVHTERpc3BsYXksIEVHTFN1cmZhY2UpCitFR0xfRU5UUlkoRUdMQm9vbGVhbiwgZWdsUXVlcnlTdXJmYWNlLCAgRUdMRGlzcGxheSwgRUdMU3VyZmFjZSwgRUdMaW50LCBFR0xpbnQgKikKK0VHTF9FTlRSWShFR0xDb250ZXh0LCBlZ2xDcmVhdGVDb250ZXh0LCBFR0xEaXNwbGF5LCBFR0xDb25maWcsIEVHTENvbnRleHQsIGNvbnN0IEVHTGludCAqKQorRUdMX0VOVFJZKEVHTEJvb2xlYW4sIGVnbERlc3Ryb3lDb250ZXh0LCBFR0xEaXNwbGF5LCBFR0xDb250ZXh0KQorRUdMX0VOVFJZKEVHTEJvb2xlYW4sIGVnbE1ha2VDdXJyZW50LCBFR0xEaXNwbGF5LCBFR0xTdXJmYWNlLCBFR0xTdXJmYWNlLCBFR0xDb250ZXh0KQorRUdMX0VOVFJZKEVHTENvbnRleHQsIGVnbEdldEN1cnJlbnRDb250ZXh0LCB2b2lkKQorRUdMX0VOVFJZKEVHTFN1cmZhY2UsIGVnbEdldEN1cnJlbnRTdXJmYWNlLCBFR0xpbnQpCitFR0xfRU5UUlkoRUdMRGlzcGxheSwgZWdsR2V0Q3VycmVudERpc3BsYXksIHZvaWQpCitFR0xfRU5UUlkoRUdMQm9vbGVhbiwgZWdsUXVlcnlDb250ZXh0LCAgRUdMRGlzcGxheSwgRUdMQ29udGV4dCwgRUdMaW50LCBFR0xpbnQgKikKK0VHTF9FTlRSWShFR0xCb29sZWFuLCBlZ2xXYWl0R0wsIHZvaWQpCitFR0xfRU5UUlkoRUdMQm9vbGVhbiwgZWdsV2FpdE5hdGl2ZSwgRUdMaW50KQorRUdMX0VOVFJZKEVHTEJvb2xlYW4sIGVnbFN3YXBCdWZmZXJzLCBFR0xEaXNwbGF5LCBFR0xTdXJmYWNlKQorRUdMX0VOVFJZKEVHTEJvb2xlYW4sIGVnbENvcHlCdWZmZXJzLCBFR0xEaXNwbGF5LCBFR0xTdXJmYWNlLCBOYXRpdmVQaXhtYXBUeXBlKQorRUdMX0VOVFJZKEVHTGludCwgZWdsR2V0RXJyb3IsIHZvaWQpCitFR0xfRU5UUlkoY29uc3QgY2hhciosIGVnbFF1ZXJ5U3RyaW5nLCBFR0xEaXNwbGF5LCBFR0xpbnQpCitFR0xfRU5UUlkoX19lZ2xNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSwgZWdsR2V0UHJvY0FkZHJlc3MsIGNvbnN0IGNoYXIgKikKKworLyogRUdMIDEuMSAqLworCitFR0xfRU5UUlkoRUdMQm9vbGVhbiwgZWdsU3VyZmFjZUF0dHJpYiwgRUdMRGlzcGxheSwgRUdMU3VyZmFjZSwgRUdMaW50LCBFR0xpbnQpCitFR0xfRU5UUlkoRUdMQm9vbGVhbiwgZWdsQmluZFRleEltYWdlLCBFR0xEaXNwbGF5LCBFR0xTdXJmYWNlLCBFR0xpbnQpCitFR0xfRU5UUlkoRUdMQm9vbGVhbiwgZWdsUmVsZWFzZVRleEltYWdlLCBFR0xEaXNwbGF5LCBFR0xTdXJmYWNlLCBFR0xpbnQpCitFR0xfRU5UUlkoRUdMQm9vbGVhbiwgZWdsU3dhcEludGVydmFsLCBFR0xEaXNwbGF5LCBFR0xpbnQpCisKKy8qIEVHTCAxLjIgKi8KKworRUdMX0VOVFJZKEVHTEJvb2xlYW4sIGVnbEJpbmRBUEksIEVHTGVudW0pCitFR0xfRU5UUlkoRUdMZW51bSwgZWdsUXVlcnlBUEksIHZvaWQpCitFR0xfRU5UUlkoRUdMQm9vbGVhbiwgZWdsV2FpdENsaWVudCwgdm9pZCkKK0VHTF9FTlRSWShFR0xCb29sZWFuLCBlZ2xSZWxlYXNlVGhyZWFkLCB2b2lkKQorRUdMX0VOVFJZKEVHTFN1cmZhY2UsIGVnbENyZWF0ZVBidWZmZXJGcm9tQ2xpZW50QnVmZmVyLCBFR0xEaXNwbGF5LCBFR0xlbnVtLCBFR0xDbGllbnRCdWZmZXIsIEVHTENvbmZpZywgY29uc3QgRUdMaW50ICopCisKKy8qIEVHTCAxLjMgKi8KKworLyogRUdMIDEuNCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvZWdsX2ltcGwuaCBiL29wZW5nbC9saWJzL2VnbF9pbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJjZTNmYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC9saWJzL2VnbF9pbXBsLmgKQEAgLTAsMCArMSw0MyBAQAorLyogCisgKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqKgorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyAqKgorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisgKioKKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9FR0xfSU1QTF9ICisjZGVmaW5lIEFORFJPSURfRUdMX0lNUExfSAorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2luY2x1ZGUgPEVHTC9lZ2wuaD4KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbmFtZXNwYWNlIGFuZHJvaWQgeworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdHJ1Y3QgZ2xfaG9va3NfdDsKKworc3RydWN0IGVnbF9jb25uZWN0aW9uX3QKK3sKKyAgICB2b2lkIHZvbGF0aWxlICogICAgIGRzbzsKKyAgICBnbF9ob29rc190ICogICAgICAgIGhvb2tzOworICAgIEVHTGludCAgICAgICAgICAgICAgbWFqb3I7CisgICAgRUdMaW50ICAgICAgICAgICAgICBtaW5vcjsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHVuYXZhaWxhYmxlOworfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2VuZGlmIC8qIEFORFJPSURfRUdMX0lNUExfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvZ2xfZW50cmllcy5pbiBiL29wZW5nbC9saWJzL2dsX2VudHJpZXMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk3ZThmZQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC9saWJzL2dsX2VudHJpZXMuaW4KQEAgLTAsMCArMSwxNTkgQEAKK0dMX0VOVFJZKHZvaWQsIGdsQ29sb3I0ZiwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCkKK0dMX0VOVFJZKHZvaWQsIGdsQ29sb3I0eCwgR0xmaXhlZCwgR0xmaXhlZCwgR0xmaXhlZCwgR0xmaXhlZCkKK0dMX0VOVFJZKHZvaWQsIGdsTm9ybWFsM2YsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpCitHTF9FTlRSWSh2b2lkLCBnbE5vcm1hbDN4LCBHTGZpeGVkLCBHTGZpeGVkLCBHTGZpeGVkKQorR0xfRU5UUlkodm9pZCwgZ2xDdWxsRmFjZSwgR0xlbnVtKQorR0xfRU5UUlkodm9pZCwgZ2xGcm9udEZhY2UsIEdMZW51bSkKK0dMX0VOVFJZKHZvaWQsIGdsRGlzYWJsZSwgR0xlbnVtKQorR0xfRU5UUlkodm9pZCwgZ2xFbmFibGUsIEdMZW51bSkKK0dMX0VOVFJZKHZvaWQsIGdsRmluaXNoLCB2b2lkKQorR0xfRU5UUlkodm9pZCwgZ2xGbHVzaCwgdm9pZCkKK0dMX0VOVFJZKEdMZW51bSwgZ2xHZXRFcnJvciwgdm9pZCkKK0dMX0VOVFJZKGNvbnN0IEdMdWJ5dGUqLCBnbEdldFN0cmluZywgR0xlbnVtKQorR0xfRU5UUlkodm9pZCwgZ2xHZXRJbnRlZ2VydiwgR0xlbnVtLCBHTGludCAqKQorR0xfRU5UUlkodm9pZCwgZ2xDb2xvck1hc2ssIEdMYm9vbGVhbiwgR0xib29sZWFuLCBHTGJvb2xlYW4sIEdMYm9vbGVhbikKK0dMX0VOVFJZKHZvaWQsIGdsRGVwdGhNYXNrLCBHTGJvb2xlYW4pCitHTF9FTlRSWSh2b2lkLCBnbFN0ZW5jaWxNYXNrLCBHTHVpbnQpCitHTF9FTlRSWSh2b2lkLCBnbERlcHRoRnVuYywgR0xlbnVtKQorR0xfRU5UUlkodm9pZCwgZ2xEZXB0aFJhbmdlZiwgR0xjbGFtcGYgek5lYXIsIEdMY2xhbXBmIHpGYXIpCitHTF9FTlRSWSh2b2lkLCBnbERlcHRoUmFuZ2V4LCBHTGNsYW1weCB6TmVhciwgR0xjbGFtcHggekZhcikKK0dMX0VOVFJZKHZvaWQsIGdsUG9seWdvbk9mZnNldCwgR0xmbG9hdCBmYWN0b3IsIEdMZmxvYXQgdW5pdHMpCitHTF9FTlRSWSh2b2lkLCBnbFBvbHlnb25PZmZzZXR4LCBHTGZpeGVkIGZhY3RvciwgR0xmaXhlZCB1bml0cykKK0dMX0VOVFJZKHZvaWQsIGdsTG9naWNPcCwgR0xlbnVtIG9wY29kZSkKK0dMX0VOVFJZKHZvaWQsIGdsQWxwaGFGdW5jeCwgR0xlbnVtIGZ1bmMsIEdMY2xhbXB4IHJlZikKK0dMX0VOVFJZKHZvaWQsIGdsQWxwaGFGdW5jLCBHTGVudW0gZnVuYywgR0xjbGFtcGYgcmVmKQorR0xfRU5UUlkodm9pZCwgZ2xCbGVuZEZ1bmMsIEdMZW51bSBzZmFjdG9yLCBHTGVudW0gZGZhY3RvcikKK0dMX0VOVFJZKHZvaWQsIGdsQ2xlYXIsIEdMYml0ZmllbGQgbWFzaykKK0dMX0VOVFJZKHZvaWQsIGdsQ2xlYXJDb2xvciwgR0xjbGFtcGYgciwgR0xjbGFtcGYgZywgR0xjbGFtcGYgYiwgR0xjbGFtcGYgYSkKK0dMX0VOVFJZKHZvaWQsIGdsQ2xlYXJDb2xvcngsIEdMY2xhbXB4IHIsIEdMY2xhbXB4IGcsIEdMY2xhbXB4IGIsIEdMY2xhbXB4IGEpCitHTF9FTlRSWSh2b2lkLCBnbENsZWFyRGVwdGhmLCBHTGNsYW1wZiBkZXB0aCkKK0dMX0VOVFJZKHZvaWQsIGdsQ2xlYXJEZXB0aHgsIEdMY2xhbXB4IGRlcHRoKQorR0xfRU5UUlkodm9pZCwgZ2xDbGVhclN0ZW5jaWwsIEdMaW50IHMpCitHTF9FTlRSWSh2b2lkLCBnbFBvaW50U2l6ZSwgR0xmbG9hdCkKK0dMX0VOVFJZKHZvaWQsIGdsUG9pbnRTaXpleCwgR0xmaXhlZCkKK0dMX0VOVFJZKHZvaWQsIGdsU2FtcGxlQ292ZXJhZ2UsIEdMY2xhbXBmIHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KQorR0xfRU5UUlkodm9pZCwgZ2xTYW1wbGVDb3ZlcmFnZXgsIEdMY2xhbXB4IHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KQorR0xfRU5UUlkodm9pZCwgZ2xTdGVuY2lsRnVuYywgR0xlbnVtIGZ1bmMsIEdMaW50IHJlZiwgR0x1aW50IG1hc2spCitHTF9FTlRSWSh2b2lkLCBnbFN0ZW5jaWxPcCwgR0xlbnVtIGZhaWwsIEdMZW51bSB6ZmFpbCwgR0xlbnVtIHpwYXNzKQorR0xfRU5UUlkodm9pZCwgZ2xTY2lzc29yLCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCkKK0dMX0VOVFJZKHZvaWQsIGdsSGludCwgR0xlbnVtLCBHTGVudW0gbW9kZSkKK0dMX0VOVFJZKHZvaWQsIGdsTGluZVdpZHRoLCBHTGZsb2F0IHdpZHRoKQorR0xfRU5UUlkodm9pZCwgZ2xMaW5lV2lkdGh4LCBHTGZpeGVkIHdpZHRoKQorR0xfRU5UUlkodm9pZCwgZ2xTaGFkZU1vZGVsLCBHTGVudW0pCitHTF9FTlRSWSh2b2lkLCBnbExpZ2h0TW9kZWxmLCBHTGVudW0sIEdMZmxvYXQpCitHTF9FTlRSWSh2b2lkLCBnbExpZ2h0TW9kZWxmdiwgR0xlbnVtLCBjb25zdCBHTGZsb2F0ICopCitHTF9FTlRSWSh2b2lkLCBnbExpZ2h0TW9kZWx4LCBHTGVudW0sIEdMZml4ZWQpCitHTF9FTlRSWSh2b2lkLCBnbExpZ2h0TW9kZWx4diwgR0xlbnVtLCBjb25zdCBHTGZpeGVkICopCitHTF9FTlRSWSh2b2lkLCBnbExpZ2h0ZiwgR0xlbnVtLCBHTGVudW0sIEdMZmxvYXQpCitHTF9FTlRSWSh2b2lkLCBnbExpZ2h0ZnYsIEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTGZsb2F0ICopCitHTF9FTlRSWSh2b2lkLCBnbExpZ2h0eCwgR0xlbnVtLCBHTGVudW0sIEdMZml4ZWQpCitHTF9FTlRSWSh2b2lkLCBnbExpZ2h0eHYsIEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTGZpeGVkICopCitHTF9FTlRSWSh2b2lkLCBnbE1hdGVyaWFsZiwgR0xlbnVtLCBHTGVudW0sIEdMZmxvYXQpCitHTF9FTlRSWSh2b2lkLCBnbE1hdGVyaWFsZnYsIEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTGZsb2F0ICopCitHTF9FTlRSWSh2b2lkLCBnbE1hdGVyaWFseCwgR0xlbnVtLCBHTGVudW0sIEdMZml4ZWQpCitHTF9FTlRSWSh2b2lkLCBnbE1hdGVyaWFseHYsIEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTGZpeGVkICopCitHTF9FTlRSWSh2b2lkLCBnbEZvZ2YsIEdMZW51bSwgR0xmbG9hdCkKK0dMX0VOVFJZKHZvaWQsIGdsRm9nZnYsIEdMZW51bSwgY29uc3QgR0xmbG9hdCAqKQorR0xfRU5UUlkodm9pZCwgZ2xGb2d4LCBHTGVudW0sIEdMZml4ZWQpCitHTF9FTlRSWSh2b2lkLCBnbEZvZ3h2LCBHTGVudW0sIGNvbnN0IEdMZml4ZWQgKikKK0dMX0VOVFJZKHZvaWQsIGdsVmVydGV4UG9pbnRlciwgR0xpbnQsIEdMZW51bSwgR0xzaXplaSwgY29uc3QgR0x2b2lkICopCitHTF9FTlRSWSh2b2lkLCBnbENvbG9yUG9pbnRlciwgR0xpbnQsIEdMZW51bSwgR0xzaXplaSwgY29uc3QgR0x2b2lkICopCitHTF9FTlRSWSh2b2lkLCBnbE5vcm1hbFBvaW50ZXIsIEdMZW51bSwgR0xzaXplaSwgY29uc3QgR0x2b2lkICopCitHTF9FTlRSWSh2b2lkLCBnbFRleENvb3JkUG9pbnRlciwgR0xpbnQsIEdMZW51bSwgR0xzaXplaSwgY29uc3QgR0x2b2lkICopCitHTF9FTlRSWSh2b2lkLCBnbEVuYWJsZUNsaWVudFN0YXRlLCBHTGVudW0pCitHTF9FTlRSWSh2b2lkLCBnbERpc2FibGVDbGllbnRTdGF0ZSwgR0xlbnVtKQorR0xfRU5UUlkodm9pZCwgZ2xDbGllbnRBY3RpdmVUZXh0dXJlLCBHTGVudW0pCitHTF9FTlRSWSh2b2lkLCBnbERyYXdBcnJheXMsIEdMZW51bSwgR0xpbnQgZmlyc3QsIEdMc2l6ZWkpCitHTF9FTlRSWSh2b2lkLCBnbERyYXdFbGVtZW50cywgR0xlbnVtLCBHTHNpemVpLCBHTGVudW0sIGNvbnN0IEdMdm9pZCAqKQorR0xfRU5UUlkodm9pZCwgZ2xMb2FkSWRlbnRpdHksIHZvaWQpCitHTF9FTlRSWSh2b2lkLCBnbExvYWRNYXRyaXhmLCBjb25zdCBHTGZsb2F0KikKK0dMX0VOVFJZKHZvaWQsIGdsTG9hZE1hdHJpeHgsIGNvbnN0IEdMZml4ZWQqKQorR0xfRU5UUlkodm9pZCwgZ2xNYXRyaXhNb2RlLCBHTGVudW0gbW9kZSkKK0dMX0VOVFJZKHZvaWQsIGdsTXVsdE1hdHJpeGYsIGNvbnN0IEdMZmxvYXQqKQorR0xfRU5UUlkodm9pZCwgZ2xNdWx0TWF0cml4eCwgY29uc3QgR0xmaXhlZCopCitHTF9FTlRSWSh2b2lkLCBnbFBvcE1hdHJpeCwgdm9pZCkKK0dMX0VOVFJZKHZvaWQsIGdsUHVzaE1hdHJpeCwgdm9pZCkKK0dMX0VOVFJZKHZvaWQsIGdsRnJ1c3R1bWYsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpCitHTF9FTlRSWSh2b2lkLCBnbEZydXN0dW14LCBHTGZpeGVkLCBHTGZpeGVkLCBHTGZpeGVkLCBHTGZpeGVkLCBHTGZpeGVkLCBHTGZpeGVkKQorR0xfRU5UUlkodm9pZCwgZ2xPcnRob2YsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpCitHTF9FTlRSWSh2b2lkLCBnbE9ydGhveCwgR0xmaXhlZCwgR0xmaXhlZCwgR0xmaXhlZCwgR0xmaXhlZCwgR0xmaXhlZCwgR0xmaXhlZCkKK0dMX0VOVFJZKHZvaWQsIGdsUm90YXRlZiwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCkKK0dMX0VOVFJZKHZvaWQsIGdsUm90YXRleCwgR0xmaXhlZCwgR0xmaXhlZCwgR0xmaXhlZCwgR0xmaXhlZCkKK0dMX0VOVFJZKHZvaWQsIGdsU2NhbGVmLCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KQorR0xfRU5UUlkodm9pZCwgZ2xTY2FsZXgsIEdMZml4ZWQsIEdMZml4ZWQsIEdMZml4ZWQpCitHTF9FTlRSWSh2b2lkLCBnbFRyYW5zbGF0ZWYsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpCitHTF9FTlRSWSh2b2lkLCBnbFRyYW5zbGF0ZXgsIEdMZml4ZWQsIEdMZml4ZWQsIEdMZml4ZWQpCitHTF9FTlRSWSh2b2lkLCBnbFZpZXdwb3J0LCBHTGludCwgR0xpbnQsIEdMc2l6ZWksIEdMc2l6ZWkpCitHTF9FTlRSWSh2b2lkLCBnbEFjdGl2ZVRleHR1cmUsIEdMZW51bSkKK0dMX0VOVFJZKHZvaWQsIGdsQmluZFRleHR1cmUsIEdMZW51bSwgR0x1aW50KQorR0xfRU5UUlkodm9pZCwgZ2xHZW5UZXh0dXJlcywgR0xzaXplaSwgR0x1aW50KikKK0dMX0VOVFJZKHZvaWQsIGdsRGVsZXRlVGV4dHVyZXMsIEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICopCitHTF9FTlRSWSh2b2lkLCBnbE11bHRpVGV4Q29vcmQ0ZiwgR0xlbnVtLCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KQorR0xfRU5UUlkodm9pZCwgZ2xNdWx0aVRleENvb3JkNHgsIEdMZW51bSwgR0xmaXhlZCwgR0xmaXhlZCwgR0xmaXhlZCwgR0xmaXhlZCkKK0dMX0VOVFJZKHZvaWQsIGdsUGl4ZWxTdG9yZWksIEdMZW51bSwgR0xpbnQpCitHTF9FTlRSWSh2b2lkLCBnbFRleEVudmYsIEdMZW51bSwgR0xlbnVtLCBHTGZsb2F0KQorR0xfRU5UUlkodm9pZCwgZ2xUZXhFbnZmdiwgR0xlbnVtLCBHTGVudW0sIGNvbnN0IEdMZmxvYXQqKQorR0xfRU5UUlkodm9pZCwgZ2xUZXhFbnZ4LCBHTGVudW0sIEdMZW51bSwgR0xmaXhlZCkKK0dMX0VOVFJZKHZvaWQsIGdsVGV4RW52eHYsIEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTGZpeGVkKikKK0dMX0VOVFJZKHZvaWQsIGdsVGV4UGFyYW1ldGVyZiwgR0xlbnVtLCBHTGVudW0sIEdMZmxvYXQpCitHTF9FTlRSWSh2b2lkLCBnbFRleFBhcmFtZXRlcngsIEdMZW51bSwgR0xlbnVtLCBHTGZpeGVkKQorR0xfRU5UUlkodm9pZCwgZ2xDb21wcmVzc2VkVGV4SW1hZ2UyRCwgICAgR0xlbnVtLCBHTGludCwgR0xlbnVtLCBHTHNpemVpLCBHTHNpemVpLCBHTGludCwgR0xzaXplaSwgY29uc3QgR0x2b2lkKikKK0dMX0VOVFJZKHZvaWQsIGdsQ29tcHJlc3NlZFRleFN1YkltYWdlMkQsIEdMZW51bSwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xzaXplaSwgR0xzaXplaSwgR0xlbnVtLCBHTHNpemVpLCBjb25zdCBHTHZvaWQqKQorR0xfRU5UUlkodm9pZCwgZ2xDb3B5VGV4SW1hZ2UyRCwgR0xlbnVtLCBHTGludCwgR0xlbnVtLCBHTGludCwgR0xpbnQsIEdMc2l6ZWksIEdMc2l6ZWksIEdMaW50KQorR0xfRU5UUlkodm9pZCwgZ2xDb3B5VGV4U3ViSW1hZ2UyRCwgR0xlbnVtLCBHTGludCwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xpbnQsIEdMc2l6ZWksIEdMc2l6ZWkpCitHTF9FTlRSWSh2b2lkLCBnbFRleEltYWdlMkQsIEdMZW51bSwgR0xpbnQsIEdMaW50LCBHTHNpemVpLCBHTHNpemVpLCBHTGludCwgR0xlbnVtLCBHTGVudW0sIGNvbnN0IEdMdm9pZCopCitHTF9FTlRSWSh2b2lkLCBnbFRleFN1YkltYWdlMkQsIEdMZW51bSwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xzaXplaSwgR0xzaXplaSwgR0xlbnVtLCBHTGVudW0sIGNvbnN0IEdMdm9pZCopCitHTF9FTlRSWSh2b2lkLCBnbFJlYWRQaXhlbHMsIEdMaW50LCBHTGludCwgR0xzaXplaSwgR0xzaXplaSwgR0xlbnVtLCBHTGVudW0sIEdMdm9pZCAqKQorCisvLyAxLjEgYWRkaXRpb25zCitHTF9FTlRSWSh2b2lkLCBnbENsaXBQbGFuZWYsIEdMZW51bSBwbGFuZSwgY29uc3QgR0xmbG9hdCopCitHTF9FTlRSWSh2b2lkLCBnbENsaXBQbGFuZXgsIEdMZW51bSBwbGFuZSwgY29uc3QgR0xmaXhlZCopCitHTF9FTlRSWSh2b2lkLCBnbEJpbmRCdWZmZXIsIEdMZW51bSwgR0x1aW50KQorR0xfRU5UUlkodm9pZCwgZ2xCdWZmZXJEYXRhLCBHTGVudW0sIEdMc2l6ZWlwdHIsIGNvbnN0IEdMdm9pZCosIEdMZW51bSkKK0dMX0VOVFJZKHZvaWQsIGdsQnVmZmVyU3ViRGF0YSwgR0xlbnVtLCBHTGludHB0ciwgR0xzaXplaXB0ciwgY29uc3QgR0x2b2lkKikKK0dMX0VOVFJZKHZvaWQsIGdsRGVsZXRlQnVmZmVycywgR0xzaXplaSwgY29uc3QgR0x1aW50KikKK0dMX0VOVFJZKHZvaWQsIGdsR2VuQnVmZmVycywgR0xzaXplaSwgR0x1aW50KikKK0dMX0VOVFJZKHZvaWQsIGdsR2V0Qm9vbGVhbnYsIEdMZW51bSwgR0xib29sZWFuICopCitHTF9FTlRSWSh2b2lkLCBnbEdldEZpeGVkdiwgR0xlbnVtLCBHTGZpeGVkICopCitHTF9FTlRSWSh2b2lkLCBnbEdldEZsb2F0diwgR0xlbnVtLCBHTGZsb2F0ICopCitHTF9FTlRSWSh2b2lkLCBnbEdldFBvaW50ZXJ2LCBHTGVudW0sIHZvaWQgKiopCitHTF9FTlRSWSh2b2lkLCBnbEdldEJ1ZmZlclBhcmFtZXRlcml2LCBHTGVudW0sIEdMZW51bSwgR0xpbnQgKikKK0dMX0VOVFJZKHZvaWQsIGdsR2V0Q2xpcFBsYW5lZiwgR0xlbnVtLCBHTGZsb2F0WzRdKQorR0xfRU5UUlkodm9pZCwgZ2xHZXRDbGlwUGxhbmV4LCBHTGVudW0sIEdMZml4ZWRbNF0pCitHTF9FTlRSWSh2b2lkLCBnbEdldExpZ2h0eHYsIEdMZW51bSwgR0xlbnVtLCBHTGZpeGVkICopCitHTF9FTlRSWSh2b2lkLCBnbEdldExpZ2h0ZnYsIEdMZW51bSwgR0xlbnVtLCBHTGZsb2F0ICopCitHTF9FTlRSWSh2b2lkLCBnbEdldE1hdGVyaWFseHYsIEdMZW51bSwgR0xlbnVtLCBHTGZpeGVkICopCitHTF9FTlRSWSh2b2lkLCBnbEdldE1hdGVyaWFsZnYsIEdMZW51bSwgR0xlbnVtLCBHTGZsb2F0ICopCitHTF9FTlRSWSh2b2lkLCBnbEdldFRleEVudmZ2LCBHTGVudW0sIEdMZW51bSwgR0xmbG9hdCAqKQorR0xfRU5UUlkodm9pZCwgZ2xHZXRUZXhFbnZpdiwgR0xlbnVtLCBHTGVudW0sIEdMaW50ICopCitHTF9FTlRSWSh2b2lkLCBnbEdldFRleEVudnh2LCBHTGVudW0sIEdMZW51bSwgR0xmaXhlZCAqKQorR0xfRU5UUlkodm9pZCwgZ2xHZXRUZXhQYXJhbWV0ZXJmdiwgR0xlbnVtLCBHTGVudW0sIEdMZmxvYXQgKikKK0dMX0VOVFJZKHZvaWQsIGdsR2V0VGV4UGFyYW1ldGVyaXYsIEdMZW51bSwgR0xlbnVtLCBHTGludCAqKQorR0xfRU5UUlkodm9pZCwgZ2xHZXRUZXhQYXJhbWV0ZXJ4diwgR0xlbnVtLCBHTGVudW0sIEdMZml4ZWQgKikKK0dMX0VOVFJZKEdMYm9vbGVhbiwgZ2xJc0J1ZmZlciwgR0x1aW50KQorR0xfRU5UUlkoR0xib29sZWFuLCBnbElzRW5hYmxlZCwgR0xlbnVtKQorR0xfRU5UUlkoR0xib29sZWFuLCBnbElzVGV4dHVyZSwgR0x1aW50KQorR0xfRU5UUlkodm9pZCwgZ2xQb2ludFBhcmFtZXRlcmYsIEdMZW51bSwgR0xmbG9hdCkKK0dMX0VOVFJZKHZvaWQsIGdsUG9pbnRQYXJhbWV0ZXJmdiwgR0xlbnVtLCBjb25zdCBHTGZsb2F0ICopCitHTF9FTlRSWSh2b2lkLCBnbFBvaW50UGFyYW1ldGVyeCwgR0xlbnVtLCBHTGZpeGVkKQorR0xfRU5UUlkodm9pZCwgZ2xQb2ludFBhcmFtZXRlcnh2LCBHTGVudW0sIGNvbnN0IEdMZml4ZWQgKikKK0dMX0VOVFJZKHZvaWQsIGdsQ29sb3I0dWIsIEdMdWJ5dGUsIEdMdWJ5dGUsIEdMdWJ5dGUsIEdMdWJ5dGUpCitHTF9FTlRSWSh2b2lkLCBnbFRleEVudmksIEdMZW51bSwgR0xlbnVtLCBHTGludCkKK0dMX0VOVFJZKHZvaWQsIGdsVGV4RW52aXYsIEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTGludCAqKQorR0xfRU5UUlkodm9pZCwgZ2xUZXhQYXJhbWV0ZXJmdiwgR0xlbnVtLCBHTGVudW0sIGNvbnN0IEdMZmxvYXQgKikKK0dMX0VOVFJZKHZvaWQsIGdsVGV4UGFyYW1ldGVyaXYsIEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTGludCAqKQorR0xfRU5UUlkodm9pZCwgZ2xUZXhQYXJhbWV0ZXJpLCBHTGVudW0sIEdMZW51bSwgR0xpbnQpCitHTF9FTlRSWSh2b2lkLCBnbFRleFBhcmFtZXRlcnh2LCBHTGVudW0sIEdMZW51bSwgY29uc3QgR0xmaXhlZCAqKQorR0xfRU5UUlkodm9pZCwgZ2xQb2ludFNpemVQb2ludGVyT0VTLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCopCisKKy8vIEV4dGVuc2lvbnMKK0dMX0VOVFJZKHZvaWQsIGdsRHJhd1RleHNPRVMsIEdMc2hvcnQsIEdMc2hvcnQsIEdMc2hvcnQsIEdMc2hvcnQsIEdMc2hvcnQpCitHTF9FTlRSWSh2b2lkLCBnbERyYXdUZXhpT0VTLCBHTGludCwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xpbnQpCitHTF9FTlRSWSh2b2lkLCBnbERyYXdUZXhmT0VTLCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KQorR0xfRU5UUlkodm9pZCwgZ2xEcmF3VGV4eE9FUywgR0xmaXhlZCwgR0xmaXhlZCwgR0xmaXhlZCwgR0xmaXhlZCwgR0xmaXhlZCkKK0dMX0VOVFJZKHZvaWQsIGdsRHJhd1RleHN2T0VTLCBjb25zdCBHTHNob3J0KikKK0dMX0VOVFJZKHZvaWQsIGdsRHJhd1RleGl2T0VTLCBjb25zdCBHTGludCopCitHTF9FTlRSWSh2b2lkLCBnbERyYXdUZXhmdk9FUywgY29uc3QgR0xmbG9hdCopCitHTF9FTlRSWSh2b2lkLCBnbERyYXdUZXh4dk9FUywgY29uc3QgR0xmaXhlZCopCitHTF9FTlRSWShHTGJpdGZpZWxkLCBnbFF1ZXJ5TWF0cml4eE9FUywgR0xmaXhlZCogbWFudGlzc2EsIEdMaW50KiBleHBvbmVudCkKKwpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvZ2xfZW51bXMuaW4gYi9vcGVuZ2wvbGlicy9nbF9lbnVtcy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmMyZmFkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2xpYnMvZ2xfZW51bXMuaW4KQEAgLTAsMCArMSwyNjEgQEAKK0dMRU5VTShHTF9QT0lOVFMsIDB4MDAwMCkKK0dMRU5VTShHTF9MSU5FUywgMHgwMDAxKQorR0xFTlVNKEdMX0xJTkVfTE9PUCwgMHgwMDAyKQorR0xFTlVNKEdMX0xJTkVfU1RSSVAsIDB4MDAwMykKK0dMRU5VTShHTF9UUklBTkdMRVMsIDB4MDAwNCkKK0dMRU5VTShHTF9UUklBTkdMRV9TVFJJUCwgMHgwMDA1KQorR0xFTlVNKEdMX1RSSUFOR0xFX0ZBTiwgMHgwMDA2KQorR0xFTlVNKEdMX0FERCwgMHgwMTA0KQorR0xFTlVNKEdMX05FVkVSLCAweDAyMDApCitHTEVOVU0oR0xfTEVTUywgMHgwMjAxKQorR0xFTlVNKEdMX0VRVUFMLCAweDAyMDIpCitHTEVOVU0oR0xfTEVRVUFMLCAweDAyMDMpCitHTEVOVU0oR0xfR1JFQVRFUiwgMHgwMjA0KQorR0xFTlVNKEdMX05PVEVRVUFMLCAweDAyMDUpCitHTEVOVU0oR0xfR0VRVUFMLCAweDAyMDYpCitHTEVOVU0oR0xfQUxXQVlTLCAweDAyMDcpCitHTEVOVU0oR0xfU1JDX0NPTE9SLCAweDAzMDApCitHTEVOVU0oR0xfT05FX01JTlVTX1NSQ19DT0xPUiwgMHgwMzAxKQorR0xFTlVNKEdMX1NSQ19BTFBIQSwgMHgwMzAyKQorR0xFTlVNKEdMX09ORV9NSU5VU19TUkNfQUxQSEEsIDB4MDMwMykKK0dMRU5VTShHTF9EU1RfQUxQSEEsIDB4MDMwNCkKK0dMRU5VTShHTF9PTkVfTUlOVVNfRFNUX0FMUEhBLCAweDAzMDUpCitHTEVOVU0oR0xfRFNUX0NPTE9SLCAweDAzMDYpCitHTEVOVU0oR0xfT05FX01JTlVTX0RTVF9DT0xPUiwgMHgwMzA3KQorR0xFTlVNKEdMX1NSQ19BTFBIQV9TQVRVUkFURSwgMHgwMzA4KQorR0xFTlVNKEdMX0ZST05ULCAweDA0MDQpCitHTEVOVU0oR0xfQkFDSywgMHgwNDA1KQorR0xFTlVNKEdMX0ZST05UX0FORF9CQUNLLCAweDA0MDgpCitHTEVOVU0oR0xfSU5WQUxJRF9FTlVNLCAweDA1MDApCitHTEVOVU0oR0xfSU5WQUxJRF9WQUxVRSwgMHgwNTAxKQorR0xFTlVNKEdMX0lOVkFMSURfT1BFUkFUSU9OLCAweDA1MDIpCitHTEVOVU0oR0xfU1RBQ0tfT1ZFUkZMT1csIDB4MDUwMykKK0dMRU5VTShHTF9TVEFDS19VTkRFUkZMT1csIDB4MDUwNCkKK0dMRU5VTShHTF9PVVRfT0ZfTUVNT1JZLCAweDA1MDUpCitHTEVOVU0oR0xfRVhQLCAweDA4MDApCitHTEVOVU0oR0xfRVhQMiwgMHgwODAxKQorR0xFTlVNKEdMX0NXLCAweDA5MDApCitHTEVOVU0oR0xfQ0NXLCAweDA5MDEpCitHTEVOVU0oR0xfUE9JTlRfU01PT1RILCAweDBCMTApCitHTEVOVU0oR0xfU01PT1RIX1BPSU5UX1NJWkVfUkFOR0UsIDB4MEIxMikKK0dMRU5VTShHTF9MSU5FX1NNT09USCwgMHgwQjIwKQorR0xFTlVNKEdMX1NNT09USF9MSU5FX1dJRFRIX1JBTkdFLCAweDBCMjIpCitHTEVOVU0oR0xfQ1VMTF9GQUNFLCAweDBCNDQpCitHTEVOVU0oR0xfTElHSFRJTkcsIDB4MEI1MCkKK0dMRU5VTShHTF9MSUdIVF9NT0RFTF9UV09fU0lERSwgMHgwQjUyKQorR0xFTlVNKEdMX0xJR0hUX01PREVMX0FNQklFTlQsIDB4MEI1MykKK0dMRU5VTShHTF9DT0xPUl9NQVRFUklBTCwgMHgwQjU3KQorR0xFTlVNKEdMX0ZPRywgMHgwQjYwKQorR0xFTlVNKEdMX0ZPR19ERU5TSVRZLCAweDBCNjIpCitHTEVOVU0oR0xfRk9HX1NUQVJULCAweDBCNjMpCitHTEVOVU0oR0xfRk9HX0VORCwgMHgwQjY0KQorR0xFTlVNKEdMX0ZPR19NT0RFLCAweDBCNjUpCitHTEVOVU0oR0xfRk9HX0NPTE9SLCAweDBCNjYpCitHTEVOVU0oR0xfREVQVEhfVEVTVCwgMHgwQjcxKQorR0xFTlVNKEdMX1NURU5DSUxfVEVTVCwgMHgwQjkwKQorR0xFTlVNKEdMX05PUk1BTElaRSwgMHgwQkExKQorR0xFTlVNKEdMX0FMUEhBX1RFU1QsIDB4MEJDMCkKK0dMRU5VTShHTF9ESVRIRVIsIDB4MEJEMCkKK0dMRU5VTShHTF9CTEVORCwgMHgwQkUyKQorR0xFTlVNKEdMX0NPTE9SX0xPR0lDX09QLCAweDBCRjIpCitHTEVOVU0oR0xfU0NJU1NPUl9URVNULCAweDBDMTEpCitHTEVOVU0oR0xfUEVSU1BFQ1RJVkVfQ09SUkVDVElPTl9ISU5ULCAweDBDNTApCitHTEVOVU0oR0xfUE9JTlRfU01PT1RIX0hJTlQsIDB4MEM1MSkKK0dMRU5VTShHTF9MSU5FX1NNT09USF9ISU5ULCAweDBDNTIpCitHTEVOVU0oR0xfUE9MWUdPTl9TTU9PVEhfSElOVCwgMHgwQzUzKQorR0xFTlVNKEdMX0ZPR19ISU5ULCAweDBDNTQpCitHTEVOVU0oR0xfVU5QQUNLX0FMSUdOTUVOVCwgMHgwQ0Y1KQorR0xFTlVNKEdMX1BBQ0tfQUxJR05NRU5ULCAweDBEMDUpCitHTEVOVU0oR0xfTUFYX0xJR0hUUywgMHgwRDMxKQorR0xFTlVNKEdMX01BWF9DTElQX1BMQU5FUywgMHgwRDMyKQorR0xFTlVNKEdMX01BWF9URVhUVVJFX1NJWkUsIDB4MEQzMykKK0dMRU5VTShHTF9NQVhfTU9ERUxWSUVXX1NUQUNLX0RFUFRILCAweDBEMzYpCitHTEVOVU0oR0xfTUFYX1BST0pFQ1RJT05fU1RBQ0tfREVQVEgsIDB4MEQzOCkKK0dMRU5VTShHTF9NQVhfVEVYVFVSRV9TVEFDS19ERVBUSCwgMHgwRDM5KQorR0xFTlVNKEdMX01BWF9WSUVXUE9SVF9ESU1TLCAweDBEM0EpCitHTEVOVU0oR0xfUkVEX0JJVFMsIDB4MEQ1MikKK0dMRU5VTShHTF9HUkVFTl9CSVRTLCAweDBENTMpCitHTEVOVU0oR0xfQkxVRV9CSVRTLCAweDBENTQpCitHTEVOVU0oR0xfQUxQSEFfQklUUywgMHgwRDU1KQorR0xFTlVNKEdMX0RFUFRIX0JJVFMsIDB4MEQ1NikKK0dMRU5VTShHTF9TVEVOQ0lMX0JJVFMsIDB4MEQ1NykKK0dMRU5VTShHTF9URVhUVVJFXzJELCAweDBERTEpCitHTEVOVU0oR0xfRE9OVF9DQVJFLCAweDExMDApCitHTEVOVU0oR0xfRkFTVEVTVCwgMHgxMTAxKQorR0xFTlVNKEdMX05JQ0VTVCwgMHgxMTAyKQorR0xFTlVNKEdMX0FNQklFTlQsIDB4MTIwMCkKK0dMRU5VTShHTF9ESUZGVVNFLCAweDEyMDEpCitHTEVOVU0oR0xfU1BFQ1VMQVIsIDB4MTIwMikKK0dMRU5VTShHTF9QT1NJVElPTiwgMHgxMjAzKQorR0xFTlVNKEdMX1NQT1RfRElSRUNUSU9OLCAweDEyMDQpCitHTEVOVU0oR0xfU1BPVF9FWFBPTkVOVCwgMHgxMjA1KQorR0xFTlVNKEdMX1NQT1RfQ1VUT0ZGLCAweDEyMDYpCitHTEVOVU0oR0xfQ09OU1RBTlRfQVRURU5VQVRJT04sIDB4MTIwNykKK0dMRU5VTShHTF9MSU5FQVJfQVRURU5VQVRJT04sIDB4MTIwOCkKK0dMRU5VTShHTF9RVUFEUkFUSUNfQVRURU5VQVRJT04sIDB4MTIwOSkKK0dMRU5VTShHTF9CWVRFLCAweDE0MDApCitHTEVOVU0oR0xfVU5TSUdORURfQllURSwgMHgxNDAxKQorR0xFTlVNKEdMX1NIT1JULCAweDE0MDIpCitHTEVOVU0oR0xfVU5TSUdORURfU0hPUlQsIDB4MTQwMykKK0dMRU5VTShHTF9GTE9BVCwgMHgxNDA2KQorR0xFTlVNKEdMX0ZJWEVELCAweDE0MEMpCitHTEVOVU0oR0xfQ0xFQVIsIDB4MTUwMCkKK0dMRU5VTShHTF9BTkQsIDB4MTUwMSkKK0dMRU5VTShHTF9BTkRfUkVWRVJTRSwgMHgxNTAyKQorR0xFTlVNKEdMX0NPUFksIDB4MTUwMykKK0dMRU5VTShHTF9BTkRfSU5WRVJURUQsIDB4MTUwNCkKK0dMRU5VTShHTF9OT09QLCAweDE1MDUpCitHTEVOVU0oR0xfWE9SLCAweDE1MDYpCitHTEVOVU0oR0xfT1IsIDB4MTUwNykKK0dMRU5VTShHTF9OT1IsIDB4MTUwOCkKK0dMRU5VTShHTF9FUVVJViwgMHgxNTA5KQorR0xFTlVNKEdMX0lOVkVSVCwgMHgxNTBBKQorR0xFTlVNKEdMX09SX1JFVkVSU0UsIDB4MTUwQikKK0dMRU5VTShHTF9DT1BZX0lOVkVSVEVELCAweDE1MEMpCitHTEVOVU0oR0xfT1JfSU5WRVJURUQsIDB4MTUwRCkKK0dMRU5VTShHTF9OQU5ELCAweDE1MEUpCitHTEVOVU0oR0xfU0VULCAweDE1MEYpCitHTEVOVU0oR0xfRU1JU1NJT04sIDB4MTYwMCkKK0dMRU5VTShHTF9TSElOSU5FU1MsIDB4MTYwMSkKK0dMRU5VTShHTF9BTUJJRU5UX0FORF9ESUZGVVNFLCAweDE2MDIpCitHTEVOVU0oR0xfTU9ERUxWSUVXLCAweDE3MDApCitHTEVOVU0oR0xfUFJPSkVDVElPTiwgMHgxNzAxKQorR0xFTlVNKEdMX1RFWFRVUkUsIDB4MTcwMikKK0dMRU5VTShHTF9BTFBIQSwgMHgxOTA2KQorR0xFTlVNKEdMX1JHQiwgMHgxOTA3KQorR0xFTlVNKEdMX1JHQkEsIDB4MTkwOCkKK0dMRU5VTShHTF9MVU1JTkFOQ0UsIDB4MTkwOSkKK0dMRU5VTShHTF9MVU1JTkFOQ0VfQUxQSEEsIDB4MTkwQSkKK0dMRU5VTShHTF9GTEFULCAweDFEMDApCitHTEVOVU0oR0xfU01PT1RILCAweDFEMDEpCitHTEVOVU0oR0xfS0VFUCwgMHgxRTAwKQorR0xFTlVNKEdMX1JFUExBQ0UsIDB4MUUwMSkKK0dMRU5VTShHTF9SRVBMQUNFLCAweDFFMDEpCitHTEVOVU0oR0xfSU5DUiwgMHgxRTAyKQorR0xFTlVNKEdMX0RFQ1IsIDB4MUUwMykKK0dMRU5VTShHTF9WRU5ET1IsIDB4MUYwMCkKK0dMRU5VTShHTF9SRU5ERVJFUiwgMHgxRjAxKQorR0xFTlVNKEdMX1ZFUlNJT04sIDB4MUYwMikKK0dMRU5VTShHTF9FWFRFTlNJT05TLCAweDFGMDMpCitHTEVOVU0oR0xfTU9EVUxBVEUsIDB4MjEwMCkKK0dMRU5VTShHTF9ERUNBTCwgMHgyMTAxKQorR0xFTlVNKEdMX1RFWFRVUkVfRU5WX01PREUsIDB4MjIwMCkKK0dMRU5VTShHTF9URVhUVVJFX0VOVl9DT0xPUiwgMHgyMjAxKQorR0xFTlVNKEdMX1RFWFRVUkVfRU5WLCAweDIzMDApCitHTEVOVU0oR0xfTkVBUkVTVCwgMHgyNjAwKQorR0xFTlVNKEdMX0xJTkVBUiwgMHgyNjAxKQorR0xFTlVNKEdMX05FQVJFU1RfTUlQTUFQX05FQVJFU1QsIDB4MjcwMCkKK0dMRU5VTShHTF9MSU5FQVJfTUlQTUFQX05FQVJFU1QsIDB4MjcwMSkKK0dMRU5VTShHTF9ORUFSRVNUX01JUE1BUF9MSU5FQVIsIDB4MjcwMikKK0dMRU5VTShHTF9MSU5FQVJfTUlQTUFQX0xJTkVBUiwgMHgyNzAzKQorR0xFTlVNKEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgMHgyODAwKQorR0xFTlVNKEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgMHgyODAxKQorR0xFTlVNKEdMX1RFWFRVUkVfV1JBUF9TLCAweDI4MDIpCitHTEVOVU0oR0xfVEVYVFVSRV9XUkFQX1QsIDB4MjgwMykKK0dMRU5VTShHTF9DTEFNUCwgMHgyOTAwKQorR0xFTlVNKEdMX1JFUEVBVCwgMHgyOTAxKQorR0xFTlVNKEdMX0NMSVBfUExBTkUwLCAweDMwMDApCitHTEVOVU0oR0xfQ0xJUF9QTEFORTEsIDB4MzAwMSkKK0dMRU5VTShHTF9DTElQX1BMQU5FMiwgMHgzMDAyKQorR0xFTlVNKEdMX0NMSVBfUExBTkUzLCAweDMwMDMpCitHTEVOVU0oR0xfQ0xJUF9QTEFORTQsIDB4MzAwNCkKK0dMRU5VTShHTF9DTElQX1BMQU5FNSwgMHgzMDA1KQorR0xFTlVNKEdMX0xJR0hUMCwgMHg0MDAwKQorR0xFTlVNKEdMX0xJR0hUMSwgMHg0MDAxKQorR0xFTlVNKEdMX0xJR0hUMiwgMHg0MDAyKQorR0xFTlVNKEdMX0xJR0hUMywgMHg0MDAzKQorR0xFTlVNKEdMX0xJR0hUNCwgMHg0MDA0KQorR0xFTlVNKEdMX0xJR0hUNSwgMHg0MDA1KQorR0xFTlVNKEdMX0xJR0hUNiwgMHg0MDA2KQorR0xFTlVNKEdMX0xJR0hUNywgMHg0MDA3KQorR0xFTlVNKEdMX0RJUkVDVF9URVhUVVJFXzJEX1FVQUxDT01NLCAweDdFODApCitHTEVOVU0oR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNCwgMHg4MDMzKQorR0xFTlVNKEdMX1VOU0lHTkVEX1NIT1JUXzVfNV81XzEsIDB4ODAzNCkKK0dMRU5VTShHTF9QT0xZR09OX09GRlNFVF9GSUxMLCAweDgwMzcpCitHTEVOVU0oR0xfUkVTQ0FMRV9OT1JNQUwsIDB4ODAzQSkKK0dMRU5VTShHTF9WRVJURVhfQVJSQVksIDB4ODA3NCkKK0dMRU5VTShHTF9OT1JNQUxfQVJSQVksIDB4ODA3NSkKK0dMRU5VTShHTF9DT0xPUl9BUlJBWSwgMHg4MDc2KQorR0xFTlVNKEdMX1RFWFRVUkVfQ09PUkRfQVJSQVksIDB4ODA3OCkKK0dMRU5VTShHTF9NVUxUSVNBTVBMRSwgMHg4MDlEKQorR0xFTlVNKEdMX1NBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSwgMHg4MDlFKQorR0xFTlVNKEdMX1NBTVBMRV9BTFBIQV9UT19PTkUsIDB4ODA5RikKK0dMRU5VTShHTF9TQU1QTEVfQ09WRVJBR0UsIDB4ODBBMCkKK0dMRU5VTShHTF9NQVhfRUxFTUVOVFNfVkVSVElDRVMsIDB4ODBFOCkKK0dMRU5VTShHTF9NQVhfRUxFTUVOVFNfSU5ESUNFUywgMHg4MEU5KQorR0xFTlVNKEdMX0NMQU1QX1RPX0VER0UsIDB4ODEyRikKK0dMRU5VTShHTF9HRU5FUkFURV9NSVBNQVAsIDB4ODE5MSkKK0dMRU5VTShHTF9HRU5FUkFURV9NSVBNQVBfSElOVCwgMHg4MTkyKQorR0xFTlVNKEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81LCAweDgzNjMpCitHTEVOVU0oR0xfQUxJQVNFRF9QT0lOVF9TSVpFX1JBTkdFLCAweDg0NkQpCitHTEVOVU0oR0xfQUxJQVNFRF9MSU5FX1dJRFRIX1JBTkdFLCAweDg0NkUpCitHTEVOVU0oR0xfVEVYVFVSRTAsIDB4ODRDMCkKK0dMRU5VTShHTF9URVhUVVJFMSwgMHg4NEMxKQorR0xFTlVNKEdMX1RFWFRVUkUyLCAweDg0QzIpCitHTEVOVU0oR0xfVEVYVFVSRTMsIDB4ODRDMykKK0dMRU5VTShHTF9URVhUVVJFNCwgMHg4NEM0KQorR0xFTlVNKEdMX1RFWFRVUkU1LCAweDg0QzUpCitHTEVOVU0oR0xfVEVYVFVSRTYsIDB4ODRDNikKK0dMRU5VTShHTF9URVhUVVJFNywgMHg4NEM3KQorR0xFTlVNKEdMX1RFWFRVUkU4LCAweDg0QzgpCitHTEVOVU0oR0xfVEVYVFVSRTksIDB4ODRDOSkKK0dMRU5VTShHTF9URVhUVVJFMTAsIDB4ODRDQSkKK0dMRU5VTShHTF9URVhUVVJFMTEsIDB4ODRDQikKK0dMRU5VTShHTF9URVhUVVJFMTIsIDB4ODRDQykKK0dMRU5VTShHTF9URVhUVVJFMTMsIDB4ODRDRCkKK0dMRU5VTShHTF9URVhUVVJFMTQsIDB4ODRDRSkKK0dMRU5VTShHTF9URVhUVVJFMTUsIDB4ODRDRikKK0dMRU5VTShHTF9URVhUVVJFMTYsIDB4ODREMCkKK0dMRU5VTShHTF9URVhUVVJFMTcsIDB4ODREMSkKK0dMRU5VTShHTF9URVhUVVJFMTgsIDB4ODREMikKK0dMRU5VTShHTF9URVhUVVJFMTksIDB4ODREMykKK0dMRU5VTShHTF9URVhUVVJFMjAsIDB4ODRENCkKK0dMRU5VTShHTF9URVhUVVJFMjEsIDB4ODRENSkKK0dMRU5VTShHTF9URVhUVVJFMjIsIDB4ODRENikKK0dMRU5VTShHTF9URVhUVVJFMjMsIDB4ODRENykKK0dMRU5VTShHTF9URVhUVVJFMjQsIDB4ODREOCkKK0dMRU5VTShHTF9URVhUVVJFMjUsIDB4ODREOSkKK0dMRU5VTShHTF9URVhUVVJFMjYsIDB4ODREQSkKK0dMRU5VTShHTF9URVhUVVJFMjcsIDB4ODREQikKK0dMRU5VTShHTF9URVhUVVJFMjgsIDB4ODREQykKK0dMRU5VTShHTF9URVhUVVJFMjksIDB4ODRERCkKK0dMRU5VTShHTF9URVhUVVJFMzAsIDB4ODRERSkKK0dMRU5VTShHTF9URVhUVVJFMzEsIDB4ODRERikKK0dMRU5VTShHTF9NQVhfVEVYVFVSRV9VTklUUywgMHg4NEUyKQorR0xFTlVNKEdMX05VTV9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUywgMHg4NkEyKQorR0xFTlVNKEdMX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTLCAweDg2QTMpCitHTEVOVU0oR0xfQlVGRkVSX1NJWkUsIDB4ODc2NCkKK0dMRU5VTShHTF9CVUZGRVJfVVNBR0UsIDB4ODc2NSkKK0dMRU5VTShHTF9QT0lOVF9TUFJJVEVfT0VTLCAweDg4NjEpCitHTEVOVU0oR0xfQ09PUkRfUkVQTEFDRV9PRVMsIDB4ODg2MikKK0dMRU5VTShHTF9BUlJBWV9CVUZGRVIsIDB4ODg5MikKK0dMRU5VTShHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiwgMHg4ODkzKQorR0xFTlVNKEdMX0FSUkFZX0JVRkZFUl9CSU5ESU5HLCAweDg4OTQpCitHTEVOVU0oR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVJfQklORElORywgMHg4ODk1KQorR0xFTlVNKEdMX1ZFUlRFWF9BUlJBWV9CVUZGRVJfQklORElORywgMHg4ODk2KQorR0xFTlVNKEdMX05PUk1BTF9BUlJBWV9CVUZGRVJfQklORElORywgMHg4ODk3KQorR0xFTlVNKEdMX0NPTE9SX0FSUkFZX0JVRkZFUl9CSU5ESU5HLCAweDg4OTgpCitHTEVOVU0oR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9CVUZGRVJfQklORElORywgMHg4ODlBKQorR0xFTlVNKEdMX1NUQVRJQ19EUkFXLCAweDg4RTQpCitHTEVOVU0oR0xfRFlOQU1JQ19EUkFXLCAweDg4RTgpCitHTEVOVU0oR0xfUE9JTlRfU0laRV9BUlJBWV9UWVBFX09FUywgMHg4OThBKQorR0xFTlVNKEdMX1BPSU5UX1NJWkVfQVJSQVlfU1RSSURFX09FUywgMHg4OThCKQorR0xFTlVNKEdMX1BPSU5UX1NJWkVfQVJSQVlfUE9JTlRFUl9PRVMsIDB4ODk4QykKK0dMRU5VTShHTF9NT0RFTFZJRVdfTUFUUklYX0ZMT0FUX0FTX0lOVF9CSVRTX09FUywgMHg4OThEKQorR0xFTlVNKEdMX1BST0pFQ1RJT05fTUFUUklYX0ZMT0FUX0FTX0lOVF9CSVRTX09FUywgMHg4OThFKQorR0xFTlVNKEdMX1RFWFRVUkVfTUFUUklYX0ZMT0FUX0FTX0lOVF9CSVRTX09FUywgMHg4OThGKQorR0xFTlVNKEdMX1BBTEVUVEU0X1JHQjhfT0VTLCAweDhCOTApCitHTEVOVU0oR0xfUEFMRVRURTRfUkdCQThfT0VTLCAweDhCOTEpCitHTEVOVU0oR0xfUEFMRVRURTRfUjVfRzZfQjVfT0VTLCAweDhCOTIpCitHTEVOVU0oR0xfUEFMRVRURTRfUkdCQTRfT0VTLCAweDhCOTMpCitHTEVOVU0oR0xfUEFMRVRURTRfUkdCNV9BMV9PRVMsIDB4OEI5NCkKK0dMRU5VTShHTF9QQUxFVFRFOF9SR0I4X09FUywgMHg4Qjk1KQorR0xFTlVNKEdMX1BBTEVUVEU4X1JHQkE4X09FUywgMHg4Qjk2KQorR0xFTlVNKEdMX1BBTEVUVEU4X1I1X0c2X0I1X09FUywgMHg4Qjk3KQorR0xFTlVNKEdMX1BBTEVUVEU4X1JHQkE0X09FUywgMHg4Qjk4KQorR0xFTlVNKEdMX1BBTEVUVEU4X1JHQjVfQTFfT0VTLCAweDhCOTkpCitHTEVOVU0oR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9UWVBFX09FUywgMHg4QjlBKQorR0xFTlVNKEdMX0lNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfRk9STUFUX09FUywgMHg4QjlCKQorR0xFTlVNKEdMX1BPSU5UX1NJWkVfQVJSQVlfT0VTLCAweDhCOUMpCitHTEVOVU0oR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTLCAweDhCOUQpCitHTEVOVU0oR0xfUE9JTlRfU0laRV9BUlJBWV9CVUZGRVJfQklORElOR19PRVMsIDB4OEI5RikKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL2dsX2xvZ2dlci5oIGIvb3BlbmdsL2xpYnMvZ2xfbG9nZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U4NWRkMQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC9saWJzL2dsX2xvZ2dlci5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qIAorICoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKioKKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisgKioKKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorICoqCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfR0xfTE9HR0VSX0gKKyNkZWZpbmUgQU5EUk9JRF9HTF9MT0dHRVJfSAorCituYW1lc3BhY2UgYW5kcm9pZCB7CisjZGVmaW5lIEdMX0VOVFJZKHIsIGFwaSwgLi4uKSByIGxvZ18jI2FwaShfX1ZBX0FSR1NfXyk7CisjaW5jbHVkZSAiZ2xfZW50cmllcy5pbiIKKyN1bmRlZiBHTF9FTlRSWQorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8qIEFORFJPSURfR0xfTE9HR0VSX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL2hvb2tzLmggYi9vcGVuZ2wvbGlicy9ob29rcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZmIwMTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvbGlicy9ob29rcy5oCkBAIC0wLDAgKzEsMTM0IEBACisvKiAKKyAqKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoqCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorICoqCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyAqKgorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0dMRVNfQ01fSE9PS1NfSAorI2RlZmluZSBBTkRST0lEX0dMRVNfQ01fSE9PS1NfSAorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8RUdML2VnbC5oPgorI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKworI2RlZmluZSBHTF9MT0dHRVIgICAgICAgICAgICAgICAgICAgMAorI2lmICFkZWZpbmVkKF9fYXJtX18pCisjZGVmaW5lIFVTRV9TTE9XX0JJTkRJTkcgICAgICAgICAgICAxCisjZWxzZQorI2RlZmluZSBVU0VfU0xPV19CSU5ESU5HICAgICAgICAgICAgMAorI2VuZGlmCisjdW5kZWYgTkVMRU0KKyNkZWZpbmUgTkVMRU0oeCkgICAgICAgICAgICAgICAgICAgIChzaXplb2YoeCkvc2l6ZW9mKCooeCkpKQorI2RlZmluZSBNQVhfTlVNQkVSX09GX0dMX0VYVEVOU0lPTlMgMzIKKworCisjaWYgZGVmaW5lZChIQVZFX0FORFJPSURfT1MpICYmICFVU0VfU0xPV19CSU5ESU5HICYmICFHTF9MT0dHRVIgJiYgX19PUFRJTUlaRV9fCisjZGVmaW5lIFVTRV9GQVNUX1RMU19LRVkgICAgICAgICAgICAxCisjZWxzZQorI2RlZmluZSBVU0VfRkFTVF9UTFNfS0VZICAgICAgICAgICAgMAorI2VuZGlmCisKKyNpZiBVU0VfRkFTVF9UTFNfS0VZCisjICAgaW5jbHVkZSA8YmlvbmljX3Rscy5oPiAgLyogc3BlY2lhbCBwcml2YXRlIEMgbGlicmFyeSBoZWFkZXIgKi8KKyNlbmRpZgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCituYW1lc3BhY2UgYW5kcm9pZCB7CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vICBFR0xEaXNwbGF5IGFyZSBnbG9iYWwsIG5vdCBhdHRhY2hlZCB0byBhIGdpdmVuIHRocmVhZAorY29uc3QgdW5zaWduZWQgaW50IE5VTV9ESVNQTEFZUyA9IDE7CisKK2VudW0geworICAgIElNUExfSEFSRFdBUkUgPSAwLAorICAgIElNUExfU09GVFdBUkUsCisgICAgSU1QTF9DT05URVhUX0xPU1QsCisgICAgSU1QTF9OT19DT05URVhULAorICAgIAorICAgIElNUExfTlVNX0lNUExFTUVOVEFUSU9OUworfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBHTCAvIEVHTCBob29rcworCisjdW5kZWYgR0xfRU5UUlkKKyN1bmRlZiBFR0xfRU5UUlkKKyNkZWZpbmUgR0xfRU5UUlkoX3IsIF9hcGksIC4uLikgX3IgKCpfYXBpKShfX1ZBX0FSR1NfXyk7CisjZGVmaW5lIEVHTF9FTlRSWShfciwgX2FwaSwgLi4uKSBfciAoKl9hcGkpKF9fVkFfQVJHU19fKTsKKworc3RydWN0IGdsX2hvb2tzX3QgeworICAgIHN0cnVjdCBnbF90IHsKKyAgICAgICAgI2luY2x1ZGUgImdsX2VudHJpZXMuaW4iCisgICAgfSBnbDsKKyAgICBzdHJ1Y3QgZWdsX3QgeworICAgICAgICAjaW5jbHVkZSAiZWdsX2VudHJpZXMuaW4iCisgICAgfSBlZ2w7CisgICAgc3RydWN0IGdsX2V4dF90IHsKKyAgICAgICAgdm9pZCAoKmV4dGVuc2lvbnNbTUFYX05VTUJFUl9PRl9HTF9FWFRFTlNJT05TXSkodm9pZCk7CisgICAgfSBleHQ7Cit9OworI3VuZGVmIEdMX0VOVFJZCisjdW5kZWYgRUdMX0VOVFJZCisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitleHRlcm4gZ2xfaG9va3NfdCBnSG9va3NbSU1QTF9OVU1fSU1QTEVNRU5UQVRJT05TXTsKK2V4dGVybiBwdGhyZWFkX2tleV90IGdHTFdyYXBwZXJLZXk7CisKKyNpZiBVU0VfRkFTVF9UTFNfS0VZCisKKy8vIFdlIGhhdmUgYSBkZWRpY2F0ZWQgVExTIHNsb3QgaW4gYmlvbmljCitzdGF0aWMgaW5saW5lIGdsX2hvb2tzX3QgY29uc3QgKiB2b2xhdGlsZSAqIGdldF90bHNfaG9va3MoKSB7CisgICAgdm9sYXRpbGUgdm9pZCAqdGxzX2Jhc2UgPSBfX2dldF90bHMoKTsKKyAgICBnbF9ob29rc190IGNvbnN0ICogdm9sYXRpbGUgKiB0bHNfaG9va3MgPSAKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Z2xfaG9va3NfdCBjb25zdCAqIHZvbGF0aWxlICo+KHRsc19iYXNlKTsKKyAgICByZXR1cm4gdGxzX2hvb2tzOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0R2xUaHJlYWRTcGVjaWZpYyhnbF9ob29rc190IGNvbnN0ICp2YWx1ZSkgeworICAgIGdsX2hvb2tzX3QgY29uc3QgKiB2b2xhdGlsZSAqIHRsc19ob29rcyA9IGdldF90bHNfaG9va3MoKTsKKyAgICB0bHNfaG9va3NbVExTX1NMT1RfT1BFTkdMX0FQSV0gPSB2YWx1ZTsKK30KKworc3RhdGljIGdsX2hvb2tzX3QgY29uc3QqIGdldEdsVGhyZWFkU3BlY2lmaWMoKSB7CisgICAgZ2xfaG9va3NfdCBjb25zdCAqIHZvbGF0aWxlICogdGxzX2hvb2tzID0gZ2V0X3Rsc19ob29rcygpOworICAgIGdsX2hvb2tzX3QgY29uc3QqIGhvb2tzID0gdGxzX2hvb2tzW1RMU19TTE9UX09QRU5HTF9BUEldOworICAgIGlmIChob29rcykgcmV0dXJuIGhvb2tzOworICAgIHJldHVybiAmZ0hvb2tzW0lNUExfTk9fQ09OVEVYVF07Cit9CisKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRHbFRocmVhZFNwZWNpZmljKGdsX2hvb2tzX3QgY29uc3QgKnZhbHVlKSB7CisgICAgcHRocmVhZF9zZXRzcGVjaWZpYyhnR0xXcmFwcGVyS2V5LCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBnbF9ob29rc190IGNvbnN0KiBnZXRHbFRocmVhZFNwZWNpZmljKCkgeworICAgIGdsX2hvb2tzX3QgY29uc3QqIGhvb2tzID0gIHN0YXRpY19jYXN0PGdsX2hvb2tzX3QqPihwdGhyZWFkX2dldHNwZWNpZmljKGdHTFdyYXBwZXJLZXkpKTsKKyAgICBpZiAoaG9va3MpIHJldHVybiBob29rczsKKyAgICByZXR1cm4gJmdIb29rc1tJTVBMX05PX0NPTlRFWFRdOworfQorCisjZW5kaWYKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZW5kaWYgLyogQU5EUk9JRF9HTEVTX0NNX0hPT0tTX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL3Rvb2xzL2VudW1leHRyYWN0LnNoIGIvb3BlbmdsL2xpYnMvdG9vbHMvZW51bWV4dHJhY3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcwNzMwMgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC9saWJzL3Rvb2xzL2VudW1leHRyYWN0LnNoCkBAIC0wLDAgKzEsMzIgQEAKKyMhL2Jpbi9zaAorCithd2sgJworL14jZGVmaW5lIEdMXy8geworICAgIG5hbWVzW2NvdW50XSA9ICQyOworICAgIHZhbHVlc1tjb3VudF0gPSAkMzsKKyAgICBzb3J0W2NvdW50XSA9ICQzICsgMDsKKyAgICBjb3VudCsrOworfQorRU5EIHsKKyAgICBmb3IgKGkgPSAxOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7CisgICAgICAgICAgICBpZiAoc29ydFtpXSA8IHNvcnRbal0pIHsKKyAgICAgICAgICAgICAgICB0biA9IG5hbWVzW2ldOworICAgICAgICAgICAgICAgIHR2ID0gdmFsdWVzW2ldOworICAgICAgICAgICAgICAgIHRzID0gc29ydFtpXTsKKyAgICAgICAgICAgICAgICBuYW1lc1tpXSA9IG5hbWVzW2pdOworICAgICAgICAgICAgICAgIHZhbHVlc1tpXSA9IHZhbHVlc1tqXTsKKyAgICAgICAgICAgICAgICBzb3J0W2ldID0gc29ydFtqXTsKKyAgICAgICAgICAgICAgICBuYW1lc1tqXSA9IHRuOworICAgICAgICAgICAgICAgIHZhbHVlc1tqXSA9IHR2OworICAgICAgICAgICAgICAgIHNvcnRbal0gPSB0czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAKKyAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBwcmludGYoIkdMRU5VTSglcywgJXMpXG4iLCBuYW1lc1tpXSwgdmFsdWVzW2ldKTsKKyAgICB9Cit9CisnIDwgJDEKKwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL0FuZHJvaWQubWsgYi9vcGVuZ2wvdGVzdHMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDUzZTdkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL0FuZHJvaWQubWsKQEAgLTAsMCArMSBAQAoraW5jbHVkZSAkKGNhbGwgYWxsLXN1YmRpci1tYWtlZmlsZXMpCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9BbmRyb2lkLm1rIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Njk1OGQzCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDE3IEBACisjIENvcHlyaWdodCAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX1NSQ19GSUxFUzo9IGFwcC1saW51eC5jIGRlbW8uYy5hcm0KK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliRUdMIGxpYkdMRVN2MV9DTSBsaWJ1aQorTE9DQUxfTU9EVUxFOj0gYW5nZWxlcworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQorCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfU1JDX0ZJTEVTOj0gZ3B1c3RhdGUuYworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJFR0wgbGliR0xFU3YxX0NNCitMT0NBTF9NT0RVTEU6PSBncHVzdGF0ZQorTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvTU9EVUxFX0xJQ0VOU0VfQlNEX09SX0xHUEwgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9NT0RVTEVfTElDRU5TRV9CU0RfT1JfTEdQTApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvTU9EVUxFX0xJQ0VOU0VfQlNEX09SX0xHUEwKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL1JFQURNRS50eHQgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YjhhNGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9SRUFETUUudHh0CkBAIC0wLDAgKzEsNzcgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK1NhbiBBbmdlbGVzIE9ic2VydmF0aW9uIE9wZW5HTCBFUyB2ZXJzaW9uIGV4YW1wbGUNCitDb3B5cmlnaHQgMjAwNC0yMDA1IEpldHJvIExhdWhhDQorV2ViOiBodHRwOi8vaWtpLmZpL2pldHJvLw0KK1NlZSBmaWxlIGxpY2Vuc2UudHh0IGZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24uDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorVGhpcyBpcyBhbiBPcGVuR0wgRVMgcG9ydCBvZiB0aGUgc21hbGwgc2VsZi1ydW5uaW5nIGRlbW9uc3RyYXRpb24NCitjYWxsZWQgIlNhbiBBbmdlbGVzIE9ic2VydmF0aW9uIiwgd2hpY2ggd2FzIGZpcnN0IHByZXNlbnRlZCBpbiB0aGUNCitBc3NlbWJseScyMDA0IGV2ZW50LiBJdCB3b24gdGhlIGZpcnN0IHBsYWNlIGluIHRoZSA0IEtCIGludHJvDQorY29tcGV0aXRpb24gY2F0ZWdvcnkuDQorDQorVGhlIGRlbW9uc3RyYXRpb24gZmVhdHVyZXMgYSBzaWdodHNlZWluZyBvZiBhIGZ1dHVyaXN0aWMgY2l0eQ0KK2hhdmluZyBtYW55IGRpZmZlcmVudCBraW5kIG9mIGJ1aWxkaW5ncyBhbmQgaXRlbXMuIEV2ZXJ5dGhpbmcgaXMNCitmbGF0IHNoYWRlZCB3aXRoIHRocmVlIGRpZmZlcmVudCBsaWdodHMuDQorDQorVGhlIG9yaWdpbmFsIHZlcnNpb24gd2FzIG1hZGUgZm9yIGRlc2t0b3Agd2l0aCBPcGVuR0wuIEl0IHdhcw0KK25hdHVyYWxseSBoZWF2aWx5IHNpemUgb3B0aW1pemVkIGluIG9yZGVyIHRvIGZpdCBpdCBpbiB0aGUgc2l6ZQ0KK2xpbWl0LiBGb3IgdGhpcyBPcGVuR0wgRVMgdmVyc2lvbiBleGFtcGxlIG11Y2ggb2YgdGhlIGNvZGUgaXMNCitjbGVhbmVkIHVwIGFuZCB0aGUgc291bmQgaXMgcmVtb3ZlZC4gQWxzbyBkZXRhaWwgbGV2ZWwgaXMgbG93ZXJlZCwNCithbHRob3VnaCBpdCBzdGlsbCBjb250YWlucyBvdmVyIDYwMDAwIGZhY2VzLg0KKw0KK1RoZSBXaW4zMiAoMjAwMC9YUCkgYmluYXJ5IHBhY2thZ2Ugb2Ygb3JpZ2luYWwgdmVyc2lvbiBpcw0KK2F2YWlsYWJsZSBmcm9tIHRoaXMgYWRkcmVzczogaHR0cDovL2pldC5yby9maWxlcy9hbmdlbGVzLnppcA0KKw0KK0ZpcnN0IHZlcnNpb24gb2YgdGhpcyBPcGVuR0wgRVMgcG9ydCB3YXMgc3VibWl0dGVkIHRvIHRoZSBLaHJvbm9zDQorT3BlbkdMIEVTIENvZGluZyBDaGFsbGVuZ2UgaGVsZCBpbiAyMDA0LTIwMDUuDQorDQorQXMgYSBjb2RlIGV4YW1wbGUsIHRoaXMgc291cmNlIHNob3dzIHRoZSBmb2xsb3dpbmc6DQorICAqIEhvdyB0byBjcmVhdGUgYSBtaW5pbWFsIGFuZCBwb3J0YWJsZSBhZCBob2MgZnJhbWV3b3JrDQorICAgIGZvciBzbWFsbCB0ZXN0aW5nL2RlbW9uc3RyYXRpb24gcHJvZ3JhbXMuIFRoaXMgZnJhbWV3b3JrDQorICAgIGNvbXBpbGVzIGZvciBib3RoIGRlc2t0b3AgYW5kIFBvY2tldFBDIFdpbjMyIGVudmlyb25tZW50LA0KKyAgICBhbmQgYSBzZXBhcmF0ZSBzb3VyY2UgaXMgaW5jbHVkZWQgZm9yIExpbnV4IHdpdGggWDExLg0KKyAgKiBIb3cgdG8gZHluYW1pY2FsbHkgZmluZCBhbmQgdXNlIHRoZSBPcGVuR0wgRVMgRExMIG9yDQorICAgIHNoYXJlZCBvYmplY3QsIHNvIHRoYXQgdGhlIGxpYnJhcnkgaXMgbm90IG5lZWRlZCBhdA0KKyAgICB0aGUgY29tcGlsZS9saW5rIHN0YWdlLg0KKyAgKiBIb3cgdG8gdXNlIHRoZSBiYXNpYyBmZWF0dXJlcyBvZiBPcGVuR0wgRVMgMS4wLzEuMQ0KKyAgICBDb21tb24gTGl0ZSwgc3VjaCBhcyB2ZXJ0ZXggYXJyYXlzLCBjb2xvciBhcnJheXMgYW5kDQorICAgIGxpZ2h0aW5nLg0KKyAgKiBIb3cgdG8gY3JlYXRlIGEgc2VsZiBjb250YWluZWQgc21hbGwgZGVtb25zdHJhdGlvbg0KKyAgICBhcHBsaWNhdGlvbiB3aXRoIG9iamVjdHMgZ2VuZXJhdGVkIHVzaW5nIHByb2NlZHVyYWwNCisgICAgYWxnb3JpdGhtcy4NCisNCitBcyB0aGUgb3JpZ2luYWwgdmVyc2lvbiB3YXMgb3B0aW1pemVkIGZvciBzaXplIGluc3RlYWQgb2YNCitwZXJmb3JtYW5jZSwgdGhhdCBob2xkcyB0cnVlIGZvciB0aGlzIE9wZW5HTCBFUyB2ZXJzaW9uIGFzDQord2VsbC4gVGh1cyB0aGUgcGVyZm9ybWFuY2UgY291bGQgYmUgc2lnbmlmaWNhbnRseSBpbmNyZWFzZWQsDQorZm9yIGV4YW1wbGUgYnkgY2hhbmdpbmcgdGhlIGNvZGUgdG8gdXNlIGdsRHJhd0VsZW1lbnRzDQoraW5zdGVhZCBvZiBnbERyYXdBcnJheXMuIFRoZSBjb2RlIHVzZXMgb25seSBPcGVuR0wgRVMgMS4wDQorQ29tbW9uIExpdGUgLWxldmVsIGZ1bmN0aW9uIGNhbGxzIHdpdGhvdXQgYW55IGV4dGVuc2lvbnMuDQorDQorVGhlIHJlZmVyZW5jZSBPcGVuR0wgRVMgaW1wbGVtZW50YXRpb25zIHVzZWQgZm9yIHRoaXMgYXBwbGljYXRpb246DQorICAqIEh5YnJpZCdzIE9wZW5HTCBFUyBBUEkgSW1wbGVtZW50YXRpb24gKEdlcmJlcmEpIHZlcnNpb24gMi4wLjQNCisgICAgUHJlYnVpbHQgV2luMzIgUEMgZXhlY3V0YWJsZTogU2FuT0dMRVMtR2VyYmVyYS5leGUNCisgICogUG93ZXJWUiBNQlggU0RLLCBPcGVuR0wgRVMgV2luZG93cyBQQyBFbXVsYXRpb24gdmVyc2lvbiAxLjA0LjE0LjAxNzANCisgICAgUHJlYnVpbHQgV2luMzIgUEMgZXhlY3V0YWJsZTogU2FuT0dMRVMtUFZSU0RLLmV4ZQ0KKw0KK05vdGUgdGhhdCBESVNBQkxFX0lNUE9SVEdMIHByZXByb2Nlc3NvciBtYWNybyBjYW4gYmUgdXNlZA0KK3RvIHNwZWNpZnkgbm90IHRvIHVzZSBkeW5hbWljIHJ1bnRpbWUgYmluZGluZyBvZiB0aGUgbGlicmFyeS4NCitZb3UgYWxzbyBuZWVkIHRvIGRlZmluZSBwcmVwcm9jZXNzb3IgbWFjcm8gUFZSU0RLIHRvIGNvbXBpbGUNCit0aGUgc291cmNlIHdpdGggUG93ZXJWUiBPcGVuR0wgRVMgU0RLLg0KKw0KK1RoZSBkZW1vIGFwcGxpY2F0aW9uIGlzIGJyaWVmbHkgdGVzdGVkIHdpdGggYSBmZXcgb3RoZXIgT3BlbkdMIEVTDQoraW1wbGVtZW50YXRpb25zIGFzIHdlbGwgKGUuZy4gVmluY2VudCwgR0xFU29uR0wgb24gTGludXgsIERlbGwNCitBeGltIFg1MHYpLiBNb3N0IG9mIHRoZXNlIG90aGVyIGltcGxlbWVudGF0aW9ucyByZW5kZXJlZCB0aGUgZGVtbw0KK2Vycm9uZW91c2x5IGluIHNvbWUgYXNwZWN0LiBUaGlzIG1heSBpbmRpY2F0ZSB0aGF0IHRoZSBkZW1vIHNvdXJjZQ0KK2NvdWxkIHN0aWxsIGhhdmUgc29tZSB3b3JrIHRvIGRvIHdpdGggY29tcGF0aWJpbGl0eSBhbmQgY29ycmVjdA0KK0FQSSB1c2FnZSwgYWx0aG91Z2ggdGhlIG5vbi1jb25mb3JtaW5nIGltcGxlbWVudGF0aW9ucyBhcmUgbW9zdA0KK3Byb2JhYmx5IHVuZmluaXNoZWQgYXMgd2VsbC4NCisNCitUaGFua3MgYW5kIEFja25vd2xlZGdlbWVudHM6DQorDQorKiBUb25pIEz2bm5iZXJnICghQ3ViZSkgY3JlYXRlZCB0aGUgbXVzaWMgZm9yIG9yaWdpbmFsIHZlcnNpb24sIHdoaWNoDQorICBpcyBub3QgZmVhdHVyZWQgaW4gdGhpcyBPcGVuR0wgRVMgcG9ydC4NCisqIFNhcmEgS2FwbGkgKHN0IFJhbmEpIGZvciBhZGRpdGlvbmFsIGNhbWVyYSB3b3JrLg0KKyogUGF1bCBCb3Vya2UgZm9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdXBlcnNoYXBlcy4NCisNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9hcHAtbGludXguYyBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2FwcC1saW51eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMGQzMjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9hcHAtbGludXguYwpAQCAtMCwwICsxLDIyMyBAQAorLyogU2FuIEFuZ2VsZXMgT2JzZXJ2YXRpb24gT3BlbkdMIEVTIHZlcnNpb24gZXhhbXBsZQorICogQ29weXJpZ2h0IDIwMDQtMjAwNSBKZXRybyBMYXVoYQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFdlYjogaHR0cDovL2lraS5maS9qZXRyby8KKyAqCisgKiBUaGlzIHNvdXJjZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgRUlUSEVSOgorICogICAoMSkgVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIFRoZSB0ZXh0IG9mIHRoZSBHTlUgTGVzc2VyCisgKiAgICAgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4gdGhlCisgKiAgICAgICBmaWxlIExJQ0VOU0UtTEdQTC50eHQuCisgKiAgICgyKSBUaGUgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgc291cmNlIGluCisgKiAgICAgICB0aGUgZmlsZSBMSUNFTlNFLUJTRC50eHQuCisgKgorICogVGhpcyBzb3VyY2UgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgZmlsZXMKKyAqIExJQ0VOU0UtTEdQTC50eHQgYW5kIExJQ0VOU0UtQlNELnR4dCBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICRJZDogYXBwLWxpbnV4LmMsdiAxLjQgMjAwNS8wMi8wOCAxODo0Mjo0OCB0b25pYyBFeHAgJAorICogJFJldmlzaW9uOiAxLjQgJAorICoKKyAqIFBhcnRzIG9mIHRoaXMgc291cmNlIGZpbGUgaXMgYmFzZWQgb24gdGVzdC9leGFtcGxlIGNvZGUgZnJvbQorICogR0xFU29uR0wgaW1wbGVtZW50YXRpb24gYnkgRGF2aWQgQmx5dGhlLiBIZXJlIGlzIGNvcHkgb2YgdGhlCisgKiBsaWNlbnNlIG5vdGljZSBmcm9tIHRoYXQgc291cmNlOgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgRGF2aWQgQmx5dGhlICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIERBVklEIEJMWVRIRSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKKyNpbmNsdWRlIDxFR0wvZWdsLmg+CisjaW5jbHVkZSA8R0xFUy9nbC5oPgorCisjaW5jbHVkZSAiYXBwLmgiCisKKworaW50IGdBcHBBbGl2ZSA9IDE7CisKK3N0YXRpYyBjb25zdCBjaGFyIHNBcHBOYW1lW10gPQorICAgICJTYW4gQW5nZWxlcyBPYnNlcnZhdGlvbiBPcGVuR0wgRVMgdmVyc2lvbiBleGFtcGxlIChMaW51eCkiOworCitzdGF0aWMgaW50IHNXaW5kb3dXaWR0aCA9IFdJTkRPV19ERUZBVUxUX1dJRFRIOworc3RhdGljIGludCBzV2luZG93SGVpZ2h0ID0gV0lORE9XX0RFRkFVTFRfSEVJR0hUOworc3RhdGljIEVHTERpc3BsYXkgc0VnbERpc3BsYXkgPSBFR0xfTk9fRElTUExBWTsKK3N0YXRpYyBFR0xDb250ZXh0IHNFZ2xDb250ZXh0ID0gRUdMX05PX0NPTlRFWFQ7CitzdGF0aWMgRUdMU3VyZmFjZSBzRWdsU3VyZmFjZSA9IEVHTF9OT19TVVJGQUNFOworCitjb25zdCBjaGFyICplZ2xfc3RyZXJyb3IodW5zaWduZWQgZXJyKQoreworICAgIHN3aXRjaChlcnIpeworICAgIGNhc2UgRUdMX1NVQ0NFU1M6IHJldHVybiAiU1VDQ0VTUyI7CisgICAgY2FzZSBFR0xfTk9UX0lOSVRJQUxJWkVEOiByZXR1cm4gIk5PVCBJTklUSUFMSVpFRCI7CisgICAgY2FzZSBFR0xfQkFEX0FDQ0VTUzogcmV0dXJuICJCQUQgQUNDRVNTIjsKKyAgICBjYXNlIEVHTF9CQURfQUxMT0M6IHJldHVybiAiQkFEIEFMTE9DIjsKKyAgICBjYXNlIEVHTF9CQURfQVRUUklCVVRFOiByZXR1cm4gIkJBRF9BVFRSSUJVVEUiOworICAgIGNhc2UgRUdMX0JBRF9DT05GSUc6IHJldHVybiAiQkFEIENPTkZJRyI7CisgICAgY2FzZSBFR0xfQkFEX0NPTlRFWFQ6IHJldHVybiAiQkFEIENPTlRFWFQiOworICAgIGNhc2UgRUdMX0JBRF9DVVJSRU5UX1NVUkZBQ0U6IHJldHVybiAiQkFEIENVUlJFTlQgU1VSRkFDRSI7CisgICAgY2FzZSBFR0xfQkFEX0RJU1BMQVk6IHJldHVybiAiQkFEIERJU1BMQVkiOworICAgIGNhc2UgRUdMX0JBRF9NQVRDSDogcmV0dXJuICJCQUQgTUFUQ0giOworICAgIGNhc2UgRUdMX0JBRF9OQVRJVkVfUElYTUFQOiByZXR1cm4gIkJBRCBOQVRJVkUgUElYTUFQIjsKKyAgICBjYXNlIEVHTF9CQURfTkFUSVZFX1dJTkRPVzogcmV0dXJuICJCQUQgTkFUSVZFIFdJTkRPVyI7CisgICAgY2FzZSBFR0xfQkFEX1BBUkFNRVRFUjogcmV0dXJuICJCQUQgUEFSQU1FVEVSIjsKKyAgICBjYXNlIEVHTF9CQURfU1VSRkFDRTogcmV0dXJuICJCQURfU1VSRkFDRSI7CisvLyAgICBjYXNlIEVHTF9DT05URVhUX0xPU1Q6IHJldHVybiAiQ09OVEVYVCBMT1NUIjsKKyAgICBkZWZhdWx0OiByZXR1cm4gIlVOS05PV04iOworICAgIH0KK30KKwordm9pZCBlZ2xfZXJyb3IoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICB1bnNpZ25lZCBlcnIgPSBlZ2xHZXRFcnJvcigpOworICAgIGlmKGVyciAhPSBFR0xfU1VDQ0VTUykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwiJXMoKTogZWdsIGVycm9yIDB4JXggKCVzKVxuIiwgCisgICAgICAgICAgICAgICAgbmFtZSwgZXJyLCBlZ2xfc3RyZXJyb3IoZXJyKSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjaGVja0dMRXJyb3JzKCkKK3sKKyAgICBHTGVudW0gZXJyb3IgPSBnbEdldEVycm9yKCk7CisgICAgaWYgKGVycm9yICE9IEdMX05PX0VSUk9SKQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkdMIEVycm9yOiAweCUwNHhcbiIsIChpbnQpZXJyb3IpOworfQorCisKK3N0YXRpYyB2b2lkIGNoZWNrRUdMRXJyb3JzKCkKK3sKKyAgICBFR0xpbnQgZXJyb3IgPSBlZ2xHZXRFcnJvcigpOworICAgIC8vIEdMRVNvbkdMIHNlZW1zIHRvIGJlIHJldHVybmluZyAwIHdoZW4gdGhlcmUgaXMgbm8gZXJyb3JzPworICAgIGlmIChlcnJvciAmJiBlcnJvciAhPSBFR0xfU1VDQ0VTUykKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFR0wgRXJyb3I6IDB4JTA0eFxuIiwgKGludCllcnJvcik7Cit9CisKK3N0YXRpYyBpbnQgaW5pdEdyYXBoaWNzKCkKK3sKKyAgICBFR0xpbnQgc19jb25maWdBdHRyaWJzW10gPSB7CisgICAgICAgICBFR0xfUkVEX1NJWkUsICAgICAgIDUsCisgICAgICAgICBFR0xfR1JFRU5fU0laRSwgICAgIDYsCisgICAgICAgICBFR0xfQkxVRV9TSVpFLCAgICAgIDUsCisgI2lmIDEKKyAgICAgICAgIEVHTF9ERVBUSF9TSVpFLCAgICAgMTYsCisgICAgICAgICBFR0xfU1RFTkNJTF9TSVpFLCAgIDAsCisgI2Vsc2UKKyAgICAgICAgIEVHTF9BTFBIQV9TSVpFLCAgICAgRUdMX0RPTlRfQ0FSRSwKKyAgICAgICAgIEVHTF9ERVBUSF9TSVpFLCAgICAgRUdMX0RPTlRfQ0FSRSwKKyAgICAgICAgIEVHTF9TVEVOQ0lMX1NJWkUsICAgRUdMX0RPTlRfQ0FSRSwKKyAgICAgICAgIEVHTF9TVVJGQUNFX1RZUEUsICAgRUdMX0RPTlRfQ0FSRSwKKyAjZW5kaWYKKyAgICAgICAgIEVHTF9OT05FCisgICAgIH07CisgICAgIAorICAgICBFR0xpbnQgbnVtQ29uZmlncyA9IC0xOworICAgICBFR0xpbnQgbWFqb3JWZXJzaW9uOworICAgICBFR0xpbnQgbWlub3JWZXJzaW9uOworICAgICBFR0xDb25maWcgY29uZmlnOworICAgICBFR0xDb250ZXh0IGNvbnRleHQ7CisgICAgIEVHTFN1cmZhY2Ugc3VyZmFjZTsKKyAgICAgCisgICAgIEVHTERpc3BsYXkgZHB5OworCisgICAgIGRweSA9IGVnbEdldERpc3BsYXkoRUdMX0RFRkFVTFRfRElTUExBWSk7CisgICAgIGVnbF9lcnJvcigiZWdsR2V0RGlzcGxheSIpOworICAgICBmcHJpbnRmKHN0ZGVyciwiZHB5ID0gMHglMDh4XG4iLCAodW5zaWduZWQpIGRweSk7CisgICAgIAorICAgICBlZ2xJbml0aWFsaXplKGRweSwgJm1ham9yVmVyc2lvbiwgJm1pbm9yVmVyc2lvbik7CisgICAgIGVnbF9lcnJvcigiZWdsSW5pdGlhbGl6ZSIpOworCisgICAgIGVnbEdldENvbmZpZ3MoZHB5LCBOVUxMLCAwLCAmbnVtQ29uZmlncyk7CisgICAgIGVnbF9lcnJvcigiZWdsR2V0Q29uZmlncyIpOworICAgICBmcHJpbnRmKHN0ZGVyciwibnVtIGNvbmZpZ3MgJWRcbiIsIG51bUNvbmZpZ3MpOworICAgICAKKyAgICAgZWdsQ2hvb3NlQ29uZmlnKGRweSwgc19jb25maWdBdHRyaWJzLCAmY29uZmlnLCAxLCAmbnVtQ29uZmlncyk7CisgICAgIGVnbF9lcnJvcigiZWdsQ2hvb3NlQ29uZmlnIik7CisKKyAgICAgc3VyZmFjZSA9IGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoZHB5LCBjb25maWcsCisgICAgICAgICAgICAgYW5kcm9pZF9jcmVhdGVEaXNwbGF5U3VyZmFjZSgpLCBOVUxMKTsKKyAgICAgZWdsX2Vycm9yKCJlZ2xNYXBXaW5kb3dTdXJmYWNlIik7CisKKyAgICAgZnByaW50ZihzdGRlcnIsInN1cmZhY2UgPSAlcFxuIiwgc3VyZmFjZSk7CisKKyAgICAgY29udGV4dCA9IGVnbENyZWF0ZUNvbnRleHQoZHB5LCBjb25maWcsIE5VTEwsIE5VTEwpOworICAgICBlZ2xfZXJyb3IoImVnbENyZWF0ZUNvbnRleHQiKTsKKyAgICAgZnByaW50ZihzdGRlcnIsImNvbnRleHQgPSAlcFxuIiwgY29udGV4dCk7CisgICAgIAorICAgICBlZ2xNYWtlQ3VycmVudChkcHksIHN1cmZhY2UsIHN1cmZhY2UsIGNvbnRleHQpOyAgIAorICAgICBlZ2xfZXJyb3IoImVnbE1ha2VDdXJyZW50Iik7CisKKyAgICAgZWdsUXVlcnlTdXJmYWNlKGRweSwgc3VyZmFjZSwgRUdMX1dJRFRILCAmc1dpbmRvd1dpZHRoKTsKKyAgICAgZWdsUXVlcnlTdXJmYWNlKGRweSwgc3VyZmFjZSwgRUdMX0hFSUdIVCwgJnNXaW5kb3dIZWlnaHQpOworCisgICAgc0VnbERpc3BsYXkgPSBkcHk7CisgICAgc0VnbFN1cmZhY2UgPSBzdXJmYWNlOworICAgIHNFZ2xDb250ZXh0ID0gY29udGV4dDsKKworICAgIHJldHVybiBFR0xfVFJVRTsKK30KKworCitzdGF0aWMgdm9pZCBkZWluaXRHcmFwaGljcygpCit7CisgICAgZWdsTWFrZUN1cnJlbnQoc0VnbERpc3BsYXksIE5VTEwsIE5VTEwsIE5VTEwpOworICAgIGVnbERlc3Ryb3lDb250ZXh0KHNFZ2xEaXNwbGF5LCBzRWdsQ29udGV4dCk7CisgICAgZWdsRGVzdHJveVN1cmZhY2Uoc0VnbERpc3BsYXksIHNFZ2xTdXJmYWNlKTsKKyAgICBlZ2xUZXJtaW5hdGUoc0VnbERpc3BsYXkpOworfQorCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgLy8gbm90IHJlZmVyZW5jZWQ6CisgICAgYXJnYyA9IGFyZ2M7CisgICAgYXJndiA9IGFyZ3Y7CisKKyAgICBpZiAoIWluaXRHcmFwaGljcygpKQorICAgIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJHcmFwaGljcyBpbml0aWFsaXphdGlvbiBmYWlsZWQuXG4iKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisKKyAgICBhcHBJbml0KCk7CisgICAgCisgICAgd2hpbGUgKGdBcHBBbGl2ZSkKKyAgICB7CisgICAgICAgIHN0cnVjdCB0aW1ldmFsIHRpbWVOb3c7CisKKyAgICAgICAgaWYgKGdBcHBBbGl2ZSkKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0dGltZW9mZGF5KCZ0aW1lTm93LCBOVUxMKTsKKyAgICAgICAgICAgIGFwcFJlbmRlcih0aW1lTm93LnR2X3NlYyAqIDEwMDAgKyB0aW1lTm93LnR2X3VzZWMgLyAxMDAwLAorICAgICAgICAgICAgICAgICAgICAgIHNXaW5kb3dXaWR0aCwgc1dpbmRvd0hlaWdodCk7CisgICAgICAgICAgICBjaGVja0dMRXJyb3JzKCk7CisgICAgICAgICAgICBlZ2xTd2FwQnVmZmVycyhzRWdsRGlzcGxheSwgc0VnbFN1cmZhY2UpOworICAgICAgICAgICAgY2hlY2tFR0xFcnJvcnMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGFwcERlaW5pdCgpOworICAgIGRlaW5pdEdyYXBoaWNzKCk7CisKKyAgICByZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvYXBwLmggYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9hcHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGViZDM1Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvYXBwLmgKQEAgLTAsMCArMSw1NiBAQAorLyogU2FuIEFuZ2VsZXMgT2JzZXJ2YXRpb24gT3BlbkdMIEVTIHZlcnNpb24gZXhhbXBsZQorICogQ29weXJpZ2h0IDIwMDQtMjAwNSBKZXRybyBMYXVoYQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFdlYjogaHR0cDovL2lraS5maS9qZXRyby8KKyAqCisgKiBUaGlzIHNvdXJjZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgRUlUSEVSOgorICogICAoMSkgVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIFRoZSB0ZXh0IG9mIHRoZSBHTlUgTGVzc2VyCisgKiAgICAgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4gdGhlCisgKiAgICAgICBmaWxlIExJQ0VOU0UtTEdQTC50eHQuCisgKiAgICgyKSBUaGUgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgc291cmNlIGluCisgKiAgICAgICB0aGUgZmlsZSBMSUNFTlNFLUJTRC50eHQuCisgKgorICogVGhpcyBzb3VyY2UgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgZmlsZXMKKyAqIExJQ0VOU0UtTEdQTC50eHQgYW5kIExJQ0VOU0UtQlNELnR4dCBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICRJZDogYXBwLmgsdiAxLjE0IDIwMDUvMDIvMDYgMjE6MTM6NTQgdG9uaWMgRXhwICQKKyAqICRSZXZpc2lvbjogMS4xNCAkCisgKi8KKworI2lmbmRlZiBBUFBfSF9JTkNMVURFRAorI2RlZmluZSBBUFBfSF9JTkNMVURFRAorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisjZGVmaW5lIFdJTkRPV19ERUZBVUxUX1dJRFRIICAgIDY0MAorI2RlZmluZSBXSU5ET1dfREVGQVVMVF9IRUlHSFQgICA0ODAKKworI2RlZmluZSBXSU5ET1dfQlBQICAgICAgICAgICAgICAxNgorCisKKy8vIFRoZSBzaW1wbGUgZnJhbWV3b3JrIGV4cGVjdHMgdGhlIGFwcGxpY2F0aW9uIGNvZGUgdG8gZGVmaW5lIHRoZXNlIGZ1bmN0aW9ucy4KK2V4dGVybiB2b2lkIGFwcEluaXQoKTsKK2V4dGVybiB2b2lkIGFwcERlaW5pdCgpOworZXh0ZXJuIHZvaWQgYXBwUmVuZGVyKGxvbmcgdGljaywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKworLyogVmFsdWUgaXMgbm9uLXplcm8gd2hlbiBhcHBsaWNhdGlvbiBpcyBhbGl2ZSwgYW5kIDAgd2hlbiBpdCBpcyBjbG9zaW5nLgorICogRGVmaW5lZCBieSB0aGUgYXBwbGljYXRpb24gZnJhbWV3b3JrLgorICovCitleHRlcm4gaW50IGdBcHBBbGl2ZTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisKKyNlbmRpZiAvLyAhQVBQX0hfSU5DTFVERUQKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL2NhbXMuaCBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2NhbXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjFhY2IzCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvY2Ftcy5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qIFNhbiBBbmdlbGVzIE9ic2VydmF0aW9uIE9wZW5HTCBFUyB2ZXJzaW9uIGV4YW1wbGUKKyAqIENvcHlyaWdodCAyMDA0LTIwMDUgSmV0cm8gTGF1aGEKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBXZWI6IGh0dHA6Ly9pa2kuZmkvamV0cm8vCisgKgorICogVGhpcyBzb3VyY2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIEVJVEhFUjoKKyAqICAgKDEpIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiBUaGUgdGV4dCBvZiB0aGUgR05VIExlc3NlcgorICogICAgICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgc291cmNlIGluIHRoZQorICogICAgICAgZmlsZSBMSUNFTlNFLUxHUEwudHh0LgorICogICAoMikgVGhlIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIHNvdXJjZSBpbgorICogICAgICAgdGhlIGZpbGUgTElDRU5TRS1CU0QudHh0LgorICoKKyAqIFRoaXMgc291cmNlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIGZpbGVzCisgKiBMSUNFTlNFLUxHUEwudHh0IGFuZCBMSUNFTlNFLUJTRC50eHQgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAkSWQ6IGNhbXMuaCx2IDEuNyAyMDA1LzAxLzMxIDIyOjE1OjE1IHRvbmljIEV4cCAkCisgKiAkUmV2aXNpb246IDEuNyAkCisgKi8KKworI2lmbmRlZiBDQU1TX0hfSU5DTFVERUQKKyNkZWZpbmUgQ0FNU19IX0lOQ0xVREVECisKKworLyogTGVuZ3RoIGluIG1pbGxpc2Vjb25kcyBvZiBvbmUgY2FtZXJhIHRyYWNrIGJhc2UgdW5pdC4KKyAqIFRoZSB2YWx1ZSBvcmlnaW5hdGVzIGZyb20gdGhlIG11c2ljIHN5bmNocm9uaXphdGlvbi4KKyAqLworI2RlZmluZSBDQU1UUkFDS19MRU4gICAgNTQ0MgorCisKKy8vIENhbWVyYSB0cmFjayBkZWZpbml0aW9uIGZvciBvbmUgY2FtZXJhIHRydWNraW5nIHNob3QuCit0eXBlZGVmIHN0cnVjdAoreworICAgIC8qIEZpdmUgcGFyYW1ldGVycyBvZiBzcmNbNV0gYW5kIGRlc3RbNV06CisgICAgICogZXllWCwgZXllWSwgZXllWiwgdmlld0FuZ2xlLCB2aWV3SGVpZ2h0T2ZmcworICAgICAqLworICAgIHNob3J0IHNyY1s1XSwgZGVzdFs1XTsKKyAgICB1bnNpZ25lZCBjaGFyIGRpc3Q7ICAgICAvLyBpZiA+MCwgY2FtIHJvdGF0ZXMgYXJvdW5kIGV5ZSB4eSBvbiBkaXN0ICogMC4xCisgICAgdW5zaWduZWQgY2hhciBsZW47ICAgICAgLy8gbGVuZ3RoIG11bHRpcGxpZXIKK30gQ0FNVFJBQ0s7CisKK3N0YXRpYyBDQU1UUkFDSyBzQ2FtVHJhY2tzW10gPQoreworICAgIHsgeyA0NTAwLCAyNzAwLCAxMDAsIDcwLCAtMzAgfSwgeyA1MCwgNTAsIC05MCwgLTEwMCwgMCB9LCAyMCwgMSB9LAorICAgIHsgeyAtMTQ0OCwgNDI5NCwgMjUsIDM2MywgMCB9LCB7IC0xMzYsIDIwMiwgMTI1LCAtOTgsIDEwMCB9LCAwLCAxIH0sCisgICAgeyB7IDE0MzcsIDQ5MzAsIDIwMCwgLTI3NSwgLTIwIH0sIHsgMTY4NCwgMCwgMCwgOSwgMCB9LCAwLCAxIH0sCisgICAgeyB7IDE4MDAsIDM2MDksIDIwMCwgMCwgNjc1IH0sIHsgMCwgMCwgMCwgMzAwLCAwIH0sIDAsIDEgfSwKKyAgICB7IHsgOTIzLCA5OTYsIDUwLCAyMzM2LCAtODAgfSwgeyAwLCAtMjAsIC01MCwgMCwgMTcwIH0sIDAsIDEgfSwKKyAgICB7IHsgLTE2NjMsIC00MywgNjAwLCAyMTcwLCAwIH0sIHsgMjAsIDAsIC02MDAsIDAsIDEwMCB9LCAwLCAxIH0sCisgICAgeyB7IDEwNDksIC0xNDIwLCAxNzUsIDIxMTEsIC0xNyB9LCB7IDAsIDAsIDAsIC0zMzQsIDAgfSwgMCwgMiB9LAorICAgIHsgeyAwLCAwLCA1MCwgMzAwLCAyNSB9LCB7IDAsIDAsIDAsIDMwMCwgMCB9LCA3MCwgMiB9LAorICAgIHsgeyAtNDczLCAtOTUzLCAzNTAwLCAtMzUzLCAtMzUwIH0sIHsgMCwgMCwgLTI4MDAsIDAsIDAgfSwgMCwgMiB9LAorICAgIHsgeyAxOTEsIDE5MzgsIDM1LCAxMTM5LCAtMTcgfSwgeyAxMjA1LCAtMjkwOSwgMCwgMCwgMCB9LCAwLCAyIH0sCisgICAgeyB7IC0xNDQ5LCAtMjcwMCwgMTUwLCAwLCAwIH0sIHsgMCwgMjAwMCwgMCwgMCwgMCB9LCAwLCAyIH0sCisgICAgeyB7IDUyNzMsIDQ5OTIsIDY1MCwgMzczLCAtNTAgfSwgeyAtNDU5OCwgLTMwNzIsIDAsIDAsIDAgfSwgMCwgMiB9LAorICAgIHsgeyAzMjIzLCAtMzI4MiwgMTA3NSwgLTM5MywgLTI1IH0sIHsgMTY0OSwgLTE2NDksIDAsIDAsIDAgfSwgMCwgMiB9Cit9OworI2RlZmluZSBDQU1UUkFDS19DT1VOVCAoc2l6ZW9mKGNhbVRyYWNrcykgLyBzaXplb2YoY2FtVHJhY2tzWzBdKSkKKworCisjZW5kaWYgLy8gIUNBTVNfSF9JTkNMVURFRApkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvZGVtby5jIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvZGVtby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMmYzOTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9kZW1vLmMKQEAgLTAsMCArMSw3OTIgQEAKKy8qIFNhbiBBbmdlbGVzIE9ic2VydmF0aW9uIE9wZW5HTCBFUyB2ZXJzaW9uIGV4YW1wbGUKKyAqIENvcHlyaWdodCAyMDA0LTIwMDUgSmV0cm8gTGF1aGEKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBXZWI6IGh0dHA6Ly9pa2kuZmkvamV0cm8vCisgKgorICogVGhpcyBzb3VyY2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIEVJVEhFUjoKKyAqICAgKDEpIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiBUaGUgdGV4dCBvZiB0aGUgR05VIExlc3NlcgorICogICAgICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgc291cmNlIGluIHRoZQorICogICAgICAgZmlsZSBMSUNFTlNFLUxHUEwudHh0LgorICogICAoMikgVGhlIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIHNvdXJjZSBpbgorICogICAgICAgdGhlIGZpbGUgTElDRU5TRS1CU0QudHh0LgorICoKKyAqIFRoaXMgc291cmNlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIGZpbGVzCisgKiBMSUNFTlNFLUxHUEwudHh0IGFuZCBMSUNFTlNFLUJTRC50eHQgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAkSWQ6IGRlbW8uYyx2IDEuMTAgMjAwNS8wMi8wOCAyMDo1NDozOSB0b25pYyBFeHAgJAorICogJFJldmlzaW9uOiAxLjEwICQKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPGZsb2F0Lmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisKKyNpbmNsdWRlICJhcHAuaCIKKyNpbmNsdWRlICJzaGFwZXMuaCIKKyNpbmNsdWRlICJjYW1zLmgiCisKKworLy8gVG90YWwgcnVuIGxlbmd0aCBpcyAyMCAqIGNhbWVyYSB0cmFjayBiYXNlIHVuaXQgbGVuZ3RoIChzZWUgY2Ftcy5oKS4KKyNkZWZpbmUgUlVOX0xFTkdUSCAgKDIwICogQ0FNVFJBQ0tfTEVOKQorI3VuZGVmIFBJCisjZGVmaW5lIFBJIDMuMTQxNTkyNjUzNTg5NzkzMmYKKyNkZWZpbmUgUkFORE9NX1VJTlRfTUFYIDY1NTM1CisKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgc1JhbmRvbVNlZWQgPSAwOworCitzdGF0aWMgdm9pZCBzZWVkUmFuZG9tKHVuc2lnbmVkIGxvbmcgc2VlZCkKK3sKKyAgICBzUmFuZG9tU2VlZCA9IHNlZWQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJhbmRvbVVJbnQoKQoreworICAgIHNSYW5kb21TZWVkID0gc1JhbmRvbVNlZWQgKiAweDM0M2ZkICsgMHgyNjllYzM7CisgICAgcmV0dXJuIHNSYW5kb21TZWVkID4+IDE2OworfQorCisKKy8vIENhcHBlZCBjb252ZXJzaW9uIGZyb20gZmxvYXQgdG8gZml4ZWQuCitzdGF0aWMgbG9uZyBmbG9hdFRvRml4ZWQoZmxvYXQgdmFsdWUpCit7CisgICAgaWYgKHZhbHVlIDwgLTMyNzY4KSB2YWx1ZSA9IC0zMjc2ODsKKyAgICBpZiAodmFsdWUgPiAzMjc2NykgdmFsdWUgPSAzMjc2NzsKKyAgICByZXR1cm4gKGxvbmcpKHZhbHVlICogNjU1MzYpOworfQorCisjZGVmaW5lIEZJWEVEKHZhbHVlKSBmbG9hdFRvRml4ZWQodmFsdWUpCisKKworLy8gRGVmaW5pdGlvbiBvZiBvbmUgR0wgb2JqZWN0IGluIHRoaXMgZGVtby4KK3R5cGVkZWYgc3RydWN0IHsKKyAgICAvKiBWZXJ0ZXggYXJyYXkgYW5kIGNvbG9yIGFycmF5IGFyZSBlbmFibGVkIGZvciBhbGwgb2JqZWN0cywgc28gdGhlaXIKKyAgICAgKiBwb2ludGVycyBtdXN0IGFsd2F5cyBiZSB2YWxpZCBhbmQgbm9uLU5VTEwuIE5vcm1hbCBhcnJheSBpcyBub3QKKyAgICAgKiB1c2VkIGJ5IHRoZSBncm91bmQgcGxhbmUsIHNvIHdoZW4gaXRzIHBvaW50ZXIgaXMgTlVMTCB0aGVuIG5vcm1hbAorICAgICAqIGFycmF5IHVzYWdlIGlzIGRpc2FibGVkLgorICAgICAqCisgICAgICogVmVydGV4IGFycmF5IGlzIHN1cHBvc2VkIHRvIHVzZSBHTF9GSVhFRCBkYXRhdHlwZSBhbmQgc3RyaWRlIDAKKyAgICAgKiAoaS5lLiB0aWdodGx5IHBhY2tlZCBhcnJheSkuIENvbG9yIGFycmF5IGlzIHN1cHBvc2VkIHRvIGhhdmUgNAorICAgICAqIGNvbXBvbmVudHMgcGVyIGNvbG9yIHdpdGggR0xfVU5TSUdORURfQllURSBkYXRhdHlwZSBhbmQgc3RyaWRlIDAuCisgICAgICogTm9ybWFsIGFycmF5IGlzIHN1cHBvc2VkIHRvIHVzZSBHTF9GSVhFRCBkYXRhdHlwZSBhbmQgc3RyaWRlIDAuCisgICAgICovCisgICAgR0xmaXhlZCAqdmVydGV4QXJyYXk7CisgICAgR0x1Ynl0ZSAqY29sb3JBcnJheTsKKyAgICBHTGZpeGVkICpub3JtYWxBcnJheTsKKyAgICBHTGludCB2ZXJ0ZXhDb21wb25lbnRzOworICAgIEdMc2l6ZWkgY291bnQ7Cit9IEdMT0JKRUNUOworCisKK3N0YXRpYyBsb25nIHNTdGFydFRpY2sgPSAwOworc3RhdGljIGxvbmcgc1RpY2sgPSAwOworCitzdGF0aWMgaW50IHNDdXJyZW50Q2FtVHJhY2sgPSAwOworc3RhdGljIGxvbmcgc0N1cnJlbnRDYW1UcmFja1N0YXJ0VGljayA9IDA7CitzdGF0aWMgbG9uZyBzTmV4dENhbVRyYWNrU3RhcnRUaWNrID0gMHg3ZmZmZmZmZjsKKworc3RhdGljIEdMT0JKRUNUICpzU3VwZXJTaGFwZU9iamVjdHNbU1VQRVJTSEFQRV9DT1VOVF0gPSB7IE5VTEwgfTsKK3N0YXRpYyBHTE9CSkVDVCAqc0dyb3VuZFBsYW5lID0gTlVMTDsKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgZmxvYXQgeCwgeSwgejsKK30gVkVDVE9SMzsKKworCitzdGF0aWMgdm9pZCBmcmVlR0xPYmplY3QoR0xPQkpFQ1QgKm9iamVjdCkKK3sKKyAgICBpZiAob2JqZWN0ID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBmcmVlKG9iamVjdC0+bm9ybWFsQXJyYXkpOworICAgIGZyZWUob2JqZWN0LT5jb2xvckFycmF5KTsKKyAgICBmcmVlKG9iamVjdC0+dmVydGV4QXJyYXkpOworICAgIGZyZWUob2JqZWN0KTsKK30KKworCitzdGF0aWMgR0xPQkpFQ1QgKiBuZXdHTE9iamVjdChsb25nIHZlcnRpY2VzLCBpbnQgdmVydGV4Q29tcG9uZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1c2VOb3JtYWxBcnJheSkKK3sKKyAgICBHTE9CSkVDVCAqcmVzdWx0OworICAgIHJlc3VsdCA9IChHTE9CSkVDVCAqKW1hbGxvYyhzaXplb2YoR0xPQkpFQ1QpKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlc3VsdC0+Y291bnQgPSB2ZXJ0aWNlczsKKyAgICByZXN1bHQtPnZlcnRleENvbXBvbmVudHMgPSB2ZXJ0ZXhDb21wb25lbnRzOworICAgIHJlc3VsdC0+dmVydGV4QXJyYXkgPSAoR0xmaXhlZCAqKW1hbGxvYyh2ZXJ0aWNlcyAqIHZlcnRleENvbXBvbmVudHMgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoR0xmaXhlZCkpOworICAgIHJlc3VsdC0+Y29sb3JBcnJheSA9IChHTHVieXRlICopbWFsbG9jKHZlcnRpY2VzICogNCAqIHNpemVvZihHTHVieXRlKSk7CisgICAgaWYgKHVzZU5vcm1hbEFycmF5KQorICAgIHsKKyAgICAgICAgcmVzdWx0LT5ub3JtYWxBcnJheSA9IChHTGZpeGVkICopbWFsbG9jKHZlcnRpY2VzICogMyAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoR0xmaXhlZCkpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJlc3VsdC0+bm9ybWFsQXJyYXkgPSBOVUxMOworICAgIGlmIChyZXN1bHQtPnZlcnRleEFycmF5ID09IE5VTEwgfHwKKyAgICAgICAgcmVzdWx0LT5jb2xvckFycmF5ID09IE5VTEwgfHwKKyAgICAgICAgKHVzZU5vcm1hbEFycmF5ICYmIHJlc3VsdC0+bm9ybWFsQXJyYXkgPT0gTlVMTCkpCisgICAgeworICAgICAgICBmcmVlR0xPYmplY3QocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljIHZvaWQgZHJhd0dMT2JqZWN0KEdMT0JKRUNUICpvYmplY3QpCit7CisgICAgYXNzZXJ0KG9iamVjdCAhPSBOVUxMKTsKKworICAgIGdsVmVydGV4UG9pbnRlcihvYmplY3QtPnZlcnRleENvbXBvbmVudHMsIEdMX0ZJWEVELAorICAgICAgICAgICAgICAgICAgICAwLCBvYmplY3QtPnZlcnRleEFycmF5KTsKKyAgICBnbENvbG9yUG9pbnRlcig0LCBHTF9VTlNJR05FRF9CWVRFLCAwLCBvYmplY3QtPmNvbG9yQXJyYXkpOworCisgICAgLy8gQWxyZWFkeSBkb25lIGluIGluaXRpYWxpemF0aW9uOgorICAgIC8vZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9WRVJURVhfQVJSQVkpOworICAgIC8vZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9DT0xPUl9BUlJBWSk7CisKKyAgICBpZiAob2JqZWN0LT5ub3JtYWxBcnJheSkKKyAgICB7CisgICAgICAgIGdsTm9ybWFsUG9pbnRlcihHTF9GSVhFRCwgMCwgb2JqZWN0LT5ub3JtYWxBcnJheSk7CisgICAgICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfTk9STUFMX0FSUkFZKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBnbERpc2FibGVDbGllbnRTdGF0ZShHTF9OT1JNQUxfQVJSQVkpOworICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRVMsIDAsIG9iamVjdC0+Y291bnQpOworfQorCisKK3N0YXRpYyB2b2lkIHZlY3RvcjNTdWIoVkVDVE9SMyAqZGVzdCwgVkVDVE9SMyAqdjEsIFZFQ1RPUjMgKnYyKQoreworICAgIGRlc3QtPnggPSB2MS0+eCAtIHYyLT54OworICAgIGRlc3QtPnkgPSB2MS0+eSAtIHYyLT55OworICAgIGRlc3QtPnogPSB2MS0+eiAtIHYyLT56OworfQorCisKK3N0YXRpYyB2b2lkIHN1cGVyU2hhcGVNYXAoVkVDVE9SMyAqcG9pbnQsIGZsb2F0IHIxLCBmbG9hdCByMiwgZmxvYXQgdCwgZmxvYXQgcCkKK3sKKyAgICAvLyBzcGhlcmUtbWFwcGluZyBvZiBzdXBlcnNoYXBlIHBhcmFtZXRlcnMKKyAgICBwb2ludC0+eCA9IChmbG9hdCkoY29zKHQpICogY29zKHApIC8gcjEgLyByMik7CisgICAgcG9pbnQtPnkgPSAoZmxvYXQpKHNpbih0KSAqIGNvcyhwKSAvIHIxIC8gcjIpOworICAgIHBvaW50LT56ID0gKGZsb2F0KShzaW4ocCkgLyByMik7Cit9CisKKworc3RhdGljIGZsb2F0IHNzRnVuYyhjb25zdCBmbG9hdCB0LCBjb25zdCBmbG9hdCAqcCkKK3sKKyAgICByZXR1cm4gKGZsb2F0KShwb3cocG93KGZhYnMoY29zKHBbMF0gKiB0IC8gNCkpIC8gcFsxXSwgcFs0XSkgKworICAgICAgICAgICAgICAgICAgICAgICBwb3coZmFicyhzaW4ocFswXSAqIHQgLyA0KSkgLyBwWzJdLCBwWzVdKSwgMSAvIHBbM10pKTsKK30KKworCisvLyBDcmVhdGVzIGFuZCByZXR1cm5zIGEgc3VwZXJzaGFwZSBvYmplY3QuCisvLyBCYXNlZCBvbiBQYXVsIEJvdXJrZSdzIFBPVi1SYXkgaW1wbGVtZW50YXRpb24uCisvLyBodHRwOi8vYXN0cm9ub215LnN3aW4uZWR1LmF1L35wYm91cmtlL3BvdnJheS9zdXBlcnNoYXBlLworc3RhdGljIEdMT0JKRUNUICogY3JlYXRlU3VwZXJTaGFwZShjb25zdCBmbG9hdCAqcGFyYW1zKQoreworICAgIGNvbnN0IGludCByZXNvbDEgPSAoaW50KXBhcmFtc1tTVVBFUlNIQVBFX1BBUkFNUyAtIDNdOworICAgIGNvbnN0IGludCByZXNvbDIgPSAoaW50KXBhcmFtc1tTVVBFUlNIQVBFX1BBUkFNUyAtIDJdOworICAgIC8vIGxhdGl0dWRlIDAgdG8gcGkvMiBmb3Igbm8gbWlycm9yZWQgYm90dG9tCisgICAgLy8gKGxhdGl0dWRlQmVnaW49PTAgZm9yIC1waS8yIHRvIHBpLzIgb3JpZ2luYWxseSkKKyAgICBjb25zdCBpbnQgbGF0aXR1ZGVCZWdpbiA9IHJlc29sMiAvIDQ7CisgICAgY29uc3QgaW50IGxhdGl0dWRlRW5kID0gcmVzb2wyIC8gMjsgICAgLy8gbm9uLWluY2x1c2l2ZQorICAgIGNvbnN0IGludCBsb25naXR1ZGVDb3VudCA9IHJlc29sMTsKKyAgICBjb25zdCBpbnQgbGF0aXR1ZGVDb3VudCA9IGxhdGl0dWRlRW5kIC0gbGF0aXR1ZGVCZWdpbjsKKyAgICBjb25zdCBsb25nIHRyaWFuZ2xlQ291bnQgPSBsb25naXR1ZGVDb3VudCAqIGxhdGl0dWRlQ291bnQgKiAyOworICAgIGNvbnN0IGxvbmcgdmVydGljZXMgPSB0cmlhbmdsZUNvdW50ICogMzsKKyAgICBHTE9CSkVDVCAqcmVzdWx0OworICAgIGZsb2F0IGJhc2VDb2xvclszXTsKKyAgICBpbnQgYSwgbG9uZ2l0dWRlLCBsYXRpdHVkZTsKKyAgICBsb25nIGN1cnJlbnRWZXJ0ZXgsIGN1cnJlbnRRdWFkOworCisgICAgcmVzdWx0ID0gbmV3R0xPYmplY3QodmVydGljZXMsIDMsIDEpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBmb3IgKGEgPSAwOyBhIDwgMzsgKythKQorICAgICAgICBiYXNlQ29sb3JbYV0gPSAoKHJhbmRvbVVJbnQoKSAlIDE1NSkgKyAxMDApIC8gMjU1LmY7CisKKyAgICBjdXJyZW50UXVhZCA9IDA7CisgICAgY3VycmVudFZlcnRleCA9IDA7CisKKyAgICAvLyBsb25naXR1ZGUgLXBpIHRvIHBpCisgICAgZm9yIChsb25naXR1ZGUgPSAwOyBsb25naXR1ZGUgPCBsb25naXR1ZGVDb3VudDsgKytsb25naXR1ZGUpCisgICAgeworCisgICAgICAgIC8vIGxhdGl0dWRlIDAgdG8gcGkvMgorICAgICAgICBmb3IgKGxhdGl0dWRlID0gbGF0aXR1ZGVCZWdpbjsgbGF0aXR1ZGUgPCBsYXRpdHVkZUVuZDsgKytsYXRpdHVkZSkKKyAgICAgICAgeworICAgICAgICAgICAgZmxvYXQgdDEgPSAtUEkgKyBsb25naXR1ZGUgKiAyICogUEkgLyByZXNvbDE7CisgICAgICAgICAgICBmbG9hdCB0MiA9IC1QSSArIChsb25naXR1ZGUgKyAxKSAqIDIgKiBQSSAvIHJlc29sMTsKKyAgICAgICAgICAgIGZsb2F0IHAxID0gLVBJIC8gMiArIGxhdGl0dWRlICogMiAqIFBJIC8gcmVzb2wyOworICAgICAgICAgICAgZmxvYXQgcDIgPSAtUEkgLyAyICsgKGxhdGl0dWRlICsgMSkgKiAyICogUEkgLyByZXNvbDI7CisgICAgICAgICAgICBmbG9hdCByMCwgcjEsIHIyLCByMzsKKworICAgICAgICAgICAgcjAgPSBzc0Z1bmModDEsIHBhcmFtcyk7CisgICAgICAgICAgICByMSA9IHNzRnVuYyhwMSwgJnBhcmFtc1s2XSk7CisgICAgICAgICAgICByMiA9IHNzRnVuYyh0MiwgcGFyYW1zKTsKKyAgICAgICAgICAgIHIzID0gc3NGdW5jKHAyLCAmcGFyYW1zWzZdKTsKKworICAgICAgICAgICAgaWYgKHIwICE9IDAgJiYgcjEgIT0gMCAmJiByMiAhPSAwICYmIHIzICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVkVDVE9SMyBwYSwgcGIsIHBjLCBwZDsKKyAgICAgICAgICAgICAgICBWRUNUT1IzIHYxLCB2MiwgbjsKKyAgICAgICAgICAgICAgICBmbG9hdCBjYTsKKyAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICAvL2Zsb2F0IGxlblNxLCBpbnZMZW5TcTsKKworICAgICAgICAgICAgICAgIHN1cGVyU2hhcGVNYXAoJnBhLCByMCwgcjEsIHQxLCBwMSk7CisgICAgICAgICAgICAgICAgc3VwZXJTaGFwZU1hcCgmcGIsIHIyLCByMSwgdDIsIHAxKTsKKyAgICAgICAgICAgICAgICBzdXBlclNoYXBlTWFwKCZwYywgcjIsIHIzLCB0MiwgcDIpOworICAgICAgICAgICAgICAgIHN1cGVyU2hhcGVNYXAoJnBkLCByMCwgcjMsIHQxLCBwMik7CisKKyAgICAgICAgICAgICAgICAvLyBrbHVkZ2UgdG8gc2V0IGxvd2VyIGVkZ2Ugb2YgdGhlIG9iamVjdCB0byBmaXhlZCBsZXZlbAorICAgICAgICAgICAgICAgIGlmIChsYXRpdHVkZSA9PSBsYXRpdHVkZUJlZ2luICsgMSkKKyAgICAgICAgICAgICAgICAgICAgcGEueiA9IHBiLnogPSAwOworCisgICAgICAgICAgICAgICAgdmVjdG9yM1N1YigmdjEsICZwYiwgJnBhKTsKKyAgICAgICAgICAgICAgICB2ZWN0b3IzU3ViKCZ2MiwgJnBkLCAmcGEpOworCisgICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIG5vcm1hbCB3aXRoIGNyb3NzIHByb2R1Y3QuCisgICAgICAgICAgICAgICAgLyogICBpICAgIGogICAgayAgICAgIGkgICAgagorICAgICAgICAgICAgICAgICAqIHYxLnggdjEueSB2MS56IHwgdjEueCB2MS55CisgICAgICAgICAgICAgICAgICogdjIueCB2Mi55IHYyLnogfCB2Mi54IHYyLnkKKyAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgIG4ueCA9IHYxLnkgKiB2Mi56IC0gdjEueiAqIHYyLnk7CisgICAgICAgICAgICAgICAgbi55ID0gdjEueiAqIHYyLnggLSB2MS54ICogdjIuejsKKyAgICAgICAgICAgICAgICBuLnogPSB2MS54ICogdjIueSAtIHYxLnkgKiB2Mi54OworCisgICAgICAgICAgICAgICAgLyogUHJlLW5vcm1hbGl6YXRpb24gb2YgdGhlIG5vcm1hbHMgaXMgZGlzYWJsZWQgaGVyZSBiZWNhdXNlCisgICAgICAgICAgICAgICAgICogdGhleSB3aWxsIGJlIG5vcm1hbGl6ZWQgYW55d2F5IGxhdGVyIGR1ZSB0byBhdXRvbWF0aWMKKyAgICAgICAgICAgICAgICAgKiBub3JtYWxpemF0aW9uIChHTF9OT1JNQUxJWkUpLiBJdCBpcyBlbmFibGVkIGJlY2F1c2UgdGhlCisgICAgICAgICAgICAgICAgICogb2JqZWN0cyBhcmUgc2NhbGVkIHdpdGggZ2xTY2FsZS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgIGxlblNxID0gbi54ICogbi54ICsgbi55ICogbi55ICsgbi56ICogbi56OworICAgICAgICAgICAgICAgIGludkxlblNxID0gKGZsb2F0KSgxIC8gc3FydChsZW5TcSkpOworICAgICAgICAgICAgICAgIG4ueCAqPSBpbnZMZW5TcTsKKyAgICAgICAgICAgICAgICBuLnkgKj0gaW52TGVuU3E7CisgICAgICAgICAgICAgICAgbi56ICo9IGludkxlblNxOworICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICBjYSA9IHBhLnogKyAwLjVmOworCisgICAgICAgICAgICAgICAgZm9yIChpID0gY3VycmVudFZlcnRleCAqIDM7CisgICAgICAgICAgICAgICAgICAgICBpIDwgKGN1cnJlbnRWZXJ0ZXggKyA2KSAqIDM7CisgICAgICAgICAgICAgICAgICAgICBpICs9IDMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQtPm5vcm1hbEFycmF5W2ldID0gRklYRUQobi54KTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LT5ub3JtYWxBcnJheVtpICsgMV0gPSBGSVhFRChuLnkpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQtPm5vcm1hbEFycmF5W2kgKyAyXSA9IEZJWEVEKG4ueik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoaSA9IGN1cnJlbnRWZXJ0ZXggKiA0OworICAgICAgICAgICAgICAgICAgICAgaSA8IChjdXJyZW50VmVydGV4ICsgNikgKiA0OworICAgICAgICAgICAgICAgICAgICAgaSArPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGEsIGNvbG9yWzNdOworICAgICAgICAgICAgICAgICAgICBmb3IgKGEgPSAwOyBhIDwgMzsgKythKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2xvclthXSA9IChpbnQpKGNhICogYmFzZUNvbG9yW2FdICogMjU1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2xvclthXSA+IDI1NSkgY29sb3JbYV0gPSAyNTU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LT5jb2xvckFycmF5W2ldID0gKEdMdWJ5dGUpY29sb3JbMF07CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC0+Y29sb3JBcnJheVtpICsgMV0gPSAoR0x1Ynl0ZSljb2xvclsxXTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LT5jb2xvckFycmF5W2kgKyAyXSA9IChHTHVieXRlKWNvbG9yWzJdOworICAgICAgICAgICAgICAgICAgICByZXN1bHQtPmNvbG9yQXJyYXlbaSArIDNdID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogM10gPSBGSVhFRChwYS54KTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMV0gPSBGSVhFRChwYS55KTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMl0gPSBGSVhFRChwYS56KTsKKyAgICAgICAgICAgICAgICArK2N1cnJlbnRWZXJ0ZXg7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogM10gPSBGSVhFRChwYi54KTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMV0gPSBGSVhFRChwYi55KTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMl0gPSBGSVhFRChwYi56KTsKKyAgICAgICAgICAgICAgICArK2N1cnJlbnRWZXJ0ZXg7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogM10gPSBGSVhFRChwZC54KTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMV0gPSBGSVhFRChwZC55KTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMl0gPSBGSVhFRChwZC56KTsKKyAgICAgICAgICAgICAgICArK2N1cnJlbnRWZXJ0ZXg7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogM10gPSBGSVhFRChwYi54KTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMV0gPSBGSVhFRChwYi55KTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMl0gPSBGSVhFRChwYi56KTsKKyAgICAgICAgICAgICAgICArK2N1cnJlbnRWZXJ0ZXg7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogM10gPSBGSVhFRChwYy54KTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMV0gPSBGSVhFRChwYy55KTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMl0gPSBGSVhFRChwYy56KTsKKyAgICAgICAgICAgICAgICArK2N1cnJlbnRWZXJ0ZXg7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogM10gPSBGSVhFRChwZC54KTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMV0gPSBGSVhFRChwZC55KTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMl0gPSBGSVhFRChwZC56KTsKKyAgICAgICAgICAgICAgICArK2N1cnJlbnRWZXJ0ZXg7CisgICAgICAgICAgICB9IC8vIHIwICYmIHIxICYmIHIyICYmIHIzCisgICAgICAgICAgICArK2N1cnJlbnRRdWFkOworICAgICAgICB9IC8vIGxhdGl0dWRlCisgICAgfSAvLyBsb25naXR1ZGUKKworICAgIC8vIFNldCBudW1iZXIgb2YgdmVydGljZXMgaW4gb2JqZWN0IHRvIHRoZSBhY3R1YWwgYW1vdW50IGNyZWF0ZWQuCisgICAgcmVzdWx0LT5jb3VudCA9IGN1cnJlbnRWZXJ0ZXg7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYyBHTE9CSkVDVCAqIGNyZWF0ZUdyb3VuZFBsYW5lKCkKK3sKKyAgICBjb25zdCBpbnQgc2NhbGUgPSA0OworICAgIGNvbnN0IGludCB5QmVnaW4gPSAtMTUsIHlFbmQgPSAxNTsgICAgLy8gZW5kcyBhcmUgbm9uLWluY2x1c2l2ZQorICAgIGNvbnN0IGludCB4QmVnaW4gPSAtMTUsIHhFbmQgPSAxNTsKKyAgICBjb25zdCBsb25nIHRyaWFuZ2xlQ291bnQgPSAoeUVuZCAtIHlCZWdpbikgKiAoeEVuZCAtIHhCZWdpbikgKiAyOworICAgIGNvbnN0IGxvbmcgdmVydGljZXMgPSB0cmlhbmdsZUNvdW50ICogMzsKKyAgICBHTE9CSkVDVCAqcmVzdWx0OworICAgIGludCB4LCB5OworICAgIGxvbmcgY3VycmVudFZlcnRleCwgY3VycmVudFF1YWQ7CisKKyAgICByZXN1bHQgPSBuZXdHTE9iamVjdCh2ZXJ0aWNlcywgMiwgMCk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGN1cnJlbnRRdWFkID0gMDsKKyAgICBjdXJyZW50VmVydGV4ID0gMDsKKworICAgIGZvciAoeSA9IHlCZWdpbjsgeSA8IHlFbmQ7ICsreSkKKyAgICB7CisgICAgICAgIGZvciAoeCA9IHhCZWdpbjsgeCA8IHhFbmQ7ICsreCkKKyAgICAgICAgeworICAgICAgICAgICAgR0x1Ynl0ZSBjb2xvcjsKKyAgICAgICAgICAgIGludCBpLCBhOworICAgICAgICAgICAgY29sb3IgPSAoR0x1Ynl0ZSkoKHJhbmRvbVVJbnQoKSAmIDB4NWYpICsgODEpOyAgLy8gMTAxIDExMTEKKyAgICAgICAgICAgIGZvciAoaSA9IGN1cnJlbnRWZXJ0ZXggKiA0OyBpIDwgKGN1cnJlbnRWZXJ0ZXggKyA2KSAqIDQ7IGkgKz0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXN1bHQtPmNvbG9yQXJyYXlbaV0gPSBjb2xvcjsKKyAgICAgICAgICAgICAgICByZXN1bHQtPmNvbG9yQXJyYXlbaSArIDFdID0gY29sb3I7CisgICAgICAgICAgICAgICAgcmVzdWx0LT5jb2xvckFycmF5W2kgKyAyXSA9IGNvbG9yOworICAgICAgICAgICAgICAgIHJlc3VsdC0+Y29sb3JBcnJheVtpICsgM10gPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBBeGlzIGJpdHMgZm9yIHF1YWQgdHJpYW5nbGVzOgorICAgICAgICAgICAgLy8geDogMDExMTAwICgweDFjKSwgeTogMTEwMDAxICgweDMxKSAgKGNsb2Nrd2lzZSkKKyAgICAgICAgICAgIC8vIHg6IDAwMTExMCAoMHgwZSksIHk6IDEwMDAxMSAoMHgyMykgIChjb3VudGVyLWNsb2Nrd2lzZSkKKyAgICAgICAgICAgIGZvciAoYSA9IDA7IGEgPCA2OyArK2EpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IHhtID0geCArICgoMHgxYyA+PiBhKSAmIDEpOworICAgICAgICAgICAgICAgIGNvbnN0IGludCB5bSA9IHkgKyAoKDB4MzEgPj4gYSkgJiAxKTsKKyAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCBtID0gKGZsb2F0KShjb3MoeG0gKiAyKSAqIHNpbih5bSAqIDQpICogMC43NWYpOworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDJdID0KKyAgICAgICAgICAgICAgICAgICAgRklYRUQoeG0gKiBzY2FsZSArIG0pOworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDIgKyAxXSA9CisgICAgICAgICAgICAgICAgICAgIEZJWEVEKHltICogc2NhbGUgKyBtKTsKKyAgICAgICAgICAgICAgICArK2N1cnJlbnRWZXJ0ZXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK2N1cnJlbnRRdWFkOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljIHZvaWQgZHJhd0dyb3VuZFBsYW5lKCkKK3sKKyAgICBnbERpc2FibGUoR0xfQ1VMTF9GQUNFKTsKKyAgICBnbERpc2FibGUoR0xfREVQVEhfVEVTVCk7CisgICAgZ2xFbmFibGUoR0xfQkxFTkQpOworICAgIGdsQmxlbmRGdW5jKEdMX1pFUk8sIEdMX1NSQ19DT0xPUik7CisgICAgZ2xEaXNhYmxlKEdMX0xJR0hUSU5HKTsKKworICAgIGRyYXdHTE9iamVjdChzR3JvdW5kUGxhbmUpOworCisgICAgZ2xFbmFibGUoR0xfTElHSFRJTkcpOworICAgIGdsRGlzYWJsZShHTF9CTEVORCk7CisgICAgZ2xFbmFibGUoR0xfREVQVEhfVEVTVCk7Cit9CisKKworc3RhdGljIHZvaWQgZHJhd0ZhZGVRdWFkKCkKK3sKKyAgICBzdGF0aWMgY29uc3QgR0xmaXhlZCBxdWFkVmVydGljZXNbXSA9IHsKKyAgICAgICAgLTB4MTAwMDAsIC0weDEwMDAwLAorICAgICAgICAgMHgxMDAwMCwgLTB4MTAwMDAsCisgICAgICAgIC0weDEwMDAwLCAgMHgxMDAwMCwKKyAgICAgICAgIDB4MTAwMDAsIC0weDEwMDAwLAorICAgICAgICAgMHgxMDAwMCwgIDB4MTAwMDAsCisgICAgICAgIC0weDEwMDAwLCAgMHgxMDAwMAorICAgIH07CisKKyAgICBjb25zdCBpbnQgYmVnaW5GYWRlID0gc1RpY2sgLSBzQ3VycmVudENhbVRyYWNrU3RhcnRUaWNrOworICAgIGNvbnN0IGludCBlbmRGYWRlID0gc05leHRDYW1UcmFja1N0YXJ0VGljayAtIHNUaWNrOworICAgIGNvbnN0IGludCBtaW5GYWRlID0gYmVnaW5GYWRlIDwgZW5kRmFkZSA/IGJlZ2luRmFkZSA6IGVuZEZhZGU7CisKKyAgICBpZiAobWluRmFkZSA8IDEwMjQpCisgICAgeworICAgICAgICBjb25zdCBHTGZpeGVkIGZhZGVDb2xvciA9IG1pbkZhZGUgPDwgNjsKKyAgICAgICAgZ2xDb2xvcjR4KGZhZGVDb2xvciwgZmFkZUNvbG9yLCBmYWRlQ29sb3IsIDApOworCisgICAgICAgIGdsRGlzYWJsZShHTF9ERVBUSF9URVNUKTsKKyAgICAgICAgZ2xFbmFibGUoR0xfQkxFTkQpOworICAgICAgICBnbEJsZW5kRnVuYyhHTF9aRVJPLCBHTF9TUkNfQ09MT1IpOworICAgICAgICBnbERpc2FibGUoR0xfTElHSFRJTkcpOworCisgICAgICAgIGdsTWF0cml4TW9kZShHTF9NT0RFTFZJRVcpOworICAgICAgICBnbExvYWRJZGVudGl0eSgpOworCisgICAgICAgIGdsTWF0cml4TW9kZShHTF9QUk9KRUNUSU9OKTsKKyAgICAgICAgZ2xMb2FkSWRlbnRpdHkoKTsKKworICAgICAgICBnbERpc2FibGVDbGllbnRTdGF0ZShHTF9DT0xPUl9BUlJBWSk7CisgICAgICAgIGdsRGlzYWJsZUNsaWVudFN0YXRlKEdMX05PUk1BTF9BUlJBWSk7CisgICAgICAgIGdsVmVydGV4UG9pbnRlcigyLCBHTF9GSVhFRCwgMCwgcXVhZFZlcnRpY2VzKTsKKyAgICAgICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFUywgMCwgNik7CisKKyAgICAgICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9DT0xPUl9BUlJBWSk7CisKKyAgICAgICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7CisKKyAgICAgICAgZ2xFbmFibGUoR0xfTElHSFRJTkcpOworICAgICAgICBnbERpc2FibGUoR0xfQkxFTkQpOworICAgICAgICBnbEVuYWJsZShHTF9ERVBUSF9URVNUKTsKKyAgICB9Cit9CisKKworLy8gQ2FsbGVkIGZyb20gdGhlIGFwcCBmcmFtZXdvcmsuCit2b2lkIGFwcEluaXQoKQoreworICAgIGludCBhOworCisgICAgZ2xFbmFibGUoR0xfTk9STUFMSVpFKTsKKyAgICBnbEVuYWJsZShHTF9ERVBUSF9URVNUKTsKKyAgICBnbERpc2FibGUoR0xfQ1VMTF9GQUNFKTsKKyAgICBnbFNoYWRlTW9kZWwoR0xfRkxBVCk7CisKKyAgICBnbEVuYWJsZShHTF9MSUdIVElORyk7CisgICAgZ2xFbmFibGUoR0xfTElHSFQwKTsKKyAgICBnbEVuYWJsZShHTF9MSUdIVDEpOworICAgIGdsRW5hYmxlKEdMX0xJR0hUMik7CisKKyAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX1ZFUlRFWF9BUlJBWSk7CisgICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9DT0xPUl9BUlJBWSk7CisKKyAgICBzZWVkUmFuZG9tKDE1KTsKKworICAgIGZvciAoYSA9IDA7IGEgPCBTVVBFUlNIQVBFX0NPVU5UOyArK2EpCisgICAgeworICAgICAgICBzU3VwZXJTaGFwZU9iamVjdHNbYV0gPSBjcmVhdGVTdXBlclNoYXBlKHNTdXBlclNoYXBlUGFyYW1zW2FdKTsKKyAgICAgICAgYXNzZXJ0KHNTdXBlclNoYXBlT2JqZWN0c1thXSAhPSBOVUxMKTsKKyAgICB9CisgICAgc0dyb3VuZFBsYW5lID0gY3JlYXRlR3JvdW5kUGxhbmUoKTsKKyAgICBhc3NlcnQoc0dyb3VuZFBsYW5lICE9IE5VTEwpOworfQorCisKKy8vIENhbGxlZCBmcm9tIHRoZSBhcHAgZnJhbWV3b3JrLgordm9pZCBhcHBEZWluaXQoKQoreworICAgIGludCBhOworICAgIGZvciAoYSA9IDA7IGEgPCBTVVBFUlNIQVBFX0NPVU5UOyArK2EpCisgICAgICAgIGZyZWVHTE9iamVjdChzU3VwZXJTaGFwZU9iamVjdHNbYV0pOworICAgIGZyZWVHTE9iamVjdChzR3JvdW5kUGxhbmUpOworfQorCisKK3N0YXRpYyB2b2lkIGdsdVBlcnNwZWN0aXZlKEdMZmxvYXQgZm92eSwgR0xmbG9hdCBhc3BlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIpCit7CisgICAgR0xmbG9hdCB4bWluLCB4bWF4LCB5bWluLCB5bWF4OworCisgICAgeW1heCA9IHpOZWFyICogKEdMZmxvYXQpdGFuKGZvdnkgKiBQSSAvIDM2MCk7CisgICAgeW1pbiA9IC15bWF4OworICAgIHhtaW4gPSB5bWluICogYXNwZWN0OworICAgIHhtYXggPSB5bWF4ICogYXNwZWN0OworCisgICAgZ2xGcnVzdHVteCgoR0xmaXhlZCkoeG1pbiAqIDY1NTM2KSwgKEdMZml4ZWQpKHhtYXggKiA2NTUzNiksCisgICAgICAgICAgICAgICAoR0xmaXhlZCkoeW1pbiAqIDY1NTM2KSwgKEdMZml4ZWQpKHltYXggKiA2NTUzNiksCisgICAgICAgICAgICAgICAoR0xmaXhlZCkoek5lYXIgKiA2NTUzNiksIChHTGZpeGVkKSh6RmFyICogNjU1MzYpKTsKK30KKworCitzdGF0aWMgdm9pZCBwcmVwYXJlRnJhbWUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgIGdsVmlld3BvcnQoMCwgMCwgd2lkdGgsIGhlaWdodCk7CisKKyAgICBnbENsZWFyQ29sb3J4KChHTGZpeGVkKSgwLjFmICogNjU1MzYpLAorICAgICAgICAgICAgICAgICAgKEdMZml4ZWQpKDAuMmYgKiA2NTUzNiksCisgICAgICAgICAgICAgICAgICAoR0xmaXhlZCkoMC4zZiAqIDY1NTM2KSwgMHgxMDAwMCk7CisgICAgZ2xDbGVhcihHTF9ERVBUSF9CVUZGRVJfQklUIHwgR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisKKyAgICBnbE1hdHJpeE1vZGUoR0xfUFJPSkVDVElPTik7CisgICAgZ2xMb2FkSWRlbnRpdHkoKTsKKyAgICBnbHVQZXJzcGVjdGl2ZSg0NSwgKGZsb2F0KXdpZHRoIC8gaGVpZ2h0LCAwLjVmLCAxNTApOworCisgICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7CisKKyAgICBnbExvYWRJZGVudGl0eSgpOworfQorCisKK3N0YXRpYyB2b2lkIGNvbmZpZ3VyZUxpZ2h0QW5kTWF0ZXJpYWwoKQoreworICAgIHN0YXRpYyBHTGZpeGVkIGxpZ2h0MFBvc2l0aW9uW10gPSB7IC0weDQwMDAwLCAweDEwMDAwLCAweDEwMDAwLCAwIH07CisgICAgc3RhdGljIEdMZml4ZWQgbGlnaHQwRGlmZnVzZVtdID0geyAweDEwMDAwLCAweDY2NjYsIDAsIDB4MTAwMDAgfTsKKyAgICBzdGF0aWMgR0xmaXhlZCBsaWdodDFQb3NpdGlvbltdID0geyAweDEwMDAwLCAtMHgyMDAwMCwgLTB4MTAwMDAsIDAgfTsKKyAgICBzdGF0aWMgR0xmaXhlZCBsaWdodDFEaWZmdXNlW10gPSB7IDB4MTFlYiwgMHgyM2Q3LCAweDU5OTksIDB4MTAwMDAgfTsKKyAgICBzdGF0aWMgR0xmaXhlZCBsaWdodDJQb3NpdGlvbltdID0geyAtMHgxMDAwMCwgMCwgLTB4NDAwMDAsIDAgfTsKKyAgICBzdGF0aWMgR0xmaXhlZCBsaWdodDJEaWZmdXNlW10gPSB7IDB4MTFlYiwgMHgyYjg1LCAweDIzZDcsIDB4MTAwMDAgfTsKKyAgICBzdGF0aWMgR0xmaXhlZCBtYXRlcmlhbFNwZWN1bGFyW10gPSB7IDB4MTAwMDAsIDB4MTAwMDAsIDB4MTAwMDAsIDB4MTAwMDAgfTsKKworICAgIGdsTGlnaHR4dihHTF9MSUdIVDAsIEdMX1BPU0lUSU9OLCBsaWdodDBQb3NpdGlvbik7CisgICAgZ2xMaWdodHh2KEdMX0xJR0hUMCwgR0xfRElGRlVTRSwgbGlnaHQwRGlmZnVzZSk7CisgICAgZ2xMaWdodHh2KEdMX0xJR0hUMSwgR0xfUE9TSVRJT04sIGxpZ2h0MVBvc2l0aW9uKTsKKyAgICBnbExpZ2h0eHYoR0xfTElHSFQxLCBHTF9ESUZGVVNFLCBsaWdodDFEaWZmdXNlKTsKKyAgICBnbExpZ2h0eHYoR0xfTElHSFQyLCBHTF9QT1NJVElPTiwgbGlnaHQyUG9zaXRpb24pOworICAgIGdsTGlnaHR4dihHTF9MSUdIVDIsIEdMX0RJRkZVU0UsIGxpZ2h0MkRpZmZ1c2UpOworICAgIGdsTWF0ZXJpYWx4dihHTF9GUk9OVF9BTkRfQkFDSywgR0xfU1BFQ1VMQVIsIG1hdGVyaWFsU3BlY3VsYXIpOworCisgICAgZ2xNYXRlcmlhbHgoR0xfRlJPTlRfQU5EX0JBQ0ssIEdMX1NISU5JTkVTUywgNjAgPDwgMTYpOworICAgIGdsRW5hYmxlKEdMX0NPTE9SX01BVEVSSUFMKTsKK30KKworCitzdGF0aWMgdm9pZCBkcmF3TW9kZWxzKGZsb2F0IHpTY2FsZSkKK3sKKyAgICBjb25zdCBpbnQgdHJhbnNsYXRpb25TY2FsZSA9IDk7CisgICAgaW50IHgsIHk7CisKKyAgICBzZWVkUmFuZG9tKDkpOworCisgICAgZ2xTY2FsZXgoMSA8PCAxNiwgMSA8PCAxNiwgKEdMZml4ZWQpKHpTY2FsZSAqIDY1NTM2KSk7CisKKyAgICBmb3IgKHkgPSAtNTsgeSA8PSA1OyArK3kpCisgICAgeworICAgICAgICBmb3IgKHggPSAtNTsgeCA8PSA1OyArK3gpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsb2F0IGJ1aWxkaW5nU2NhbGU7CisgICAgICAgICAgICBHTGZpeGVkIGZpeGVkU2NhbGU7CisKKyAgICAgICAgICAgIGludCBjdXJTaGFwZSA9IHJhbmRvbVVJbnQoKSAlIFNVUEVSU0hBUEVfQ09VTlQ7CisgICAgICAgICAgICBidWlsZGluZ1NjYWxlID0gc1N1cGVyU2hhcGVQYXJhbXNbY3VyU2hhcGVdW1NVUEVSU0hBUEVfUEFSQU1TIC0gMV07CisgICAgICAgICAgICBmaXhlZFNjYWxlID0gKEdMZml4ZWQpKGJ1aWxkaW5nU2NhbGUgKiA2NTUzNik7CisKKyAgICAgICAgICAgIGdsUHVzaE1hdHJpeCgpOworICAgICAgICAgICAgZ2xUcmFuc2xhdGV4KCh4ICogdHJhbnNsYXRpb25TY2FsZSkgKiA2NTUzNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoeSAqIHRyYW5zbGF0aW9uU2NhbGUpICogNjU1MzYsCisgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICBnbFJvdGF0ZXgoKEdMZml4ZWQpKChyYW5kb21VSW50KCkgJSAzNjApIDw8IDE2KSwgMCwgMCwgMSA8PCAxNik7CisgICAgICAgICAgICBnbFNjYWxleChmaXhlZFNjYWxlLCBmaXhlZFNjYWxlLCBmaXhlZFNjYWxlKTsKKworICAgICAgICAgICAgZHJhd0dMT2JqZWN0KHNTdXBlclNoYXBlT2JqZWN0c1tjdXJTaGFwZV0pOworICAgICAgICAgICAgZ2xQb3BNYXRyaXgoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoeCA9IC0yOyB4IDw9IDI7ICsreCkKKyAgICB7CisgICAgICAgIGNvbnN0IGludCBzaGlwU2NhbGUxMDAgPSB0cmFuc2xhdGlvblNjYWxlICogNTAwOworICAgICAgICBjb25zdCBpbnQgb2ZmczEwMCA9IHggKiBzaGlwU2NhbGUxMDAgKyAoc1RpY2sgJSBzaGlwU2NhbGUxMDApOworICAgICAgICBmbG9hdCBvZmZzID0gb2ZmczEwMCAqIDAuMDFmOworICAgICAgICBHTGZpeGVkIGZpeGVkT2ZmcyA9IChHTGZpeGVkKShvZmZzICogNjU1MzYpOworICAgICAgICBnbFB1c2hNYXRyaXgoKTsKKyAgICAgICAgZ2xUcmFuc2xhdGV4KGZpeGVkT2ZmcywgLTQgKiA2NTUzNiwgMiA8PCAxNik7CisgICAgICAgIGRyYXdHTE9iamVjdChzU3VwZXJTaGFwZU9iamVjdHNbU1VQRVJTSEFQRV9DT1VOVCAtIDFdKTsKKyAgICAgICAgZ2xQb3BNYXRyaXgoKTsKKyAgICAgICAgZ2xQdXNoTWF0cml4KCk7CisgICAgICAgIGdsVHJhbnNsYXRleCgtNCAqIDY1NTM2LCBmaXhlZE9mZnMsIDQgPDwgMTYpOworICAgICAgICBnbFJvdGF0ZXgoOTAgPDwgMTYsIDAsIDAsIDEgPDwgMTYpOworICAgICAgICBkcmF3R0xPYmplY3Qoc1N1cGVyU2hhcGVPYmplY3RzW1NVUEVSU0hBUEVfQ09VTlQgLSAxXSk7CisgICAgICAgIGdsUG9wTWF0cml4KCk7CisgICAgfQorfQorCisKKy8qIEZvbGxvd2luZyBnbHVMb29rQXQgaW1wbGVtZW50YXRpb24gaXMgYWRhcHRlZCBmcm9tIHRoZQorICogTWVzYSAzRCBHcmFwaGljcyBsaWJyYXJ5LiBodHRwOi8vd3d3Lm1lc2EzZC5vcmcKKyAqLworc3RhdGljIHZvaWQgZ2x1TG9va0F0KEdMZmxvYXQgZXlleCwgR0xmbG9hdCBleWV5LCBHTGZsb2F0IGV5ZXosCisJICAgICAgICAgICAgICBHTGZsb2F0IGNlbnRlcngsIEdMZmxvYXQgY2VudGVyeSwgR0xmbG9hdCBjZW50ZXJ6LAorCSAgICAgICAgICAgICAgR0xmbG9hdCB1cHgsIEdMZmxvYXQgdXB5LCBHTGZsb2F0IHVweikKK3sKKyAgICBHTGZsb2F0IG1bMTZdOworICAgIEdMZmxvYXQgeFszXSwgeVszXSwgelszXTsKKyAgICBHTGZsb2F0IG1hZzsKKworICAgIC8qIE1ha2Ugcm90YXRpb24gbWF0cml4ICovCisKKyAgICAvKiBaIHZlY3RvciAqLworICAgIHpbMF0gPSBleWV4IC0gY2VudGVyeDsKKyAgICB6WzFdID0gZXlleSAtIGNlbnRlcnk7CisgICAgelsyXSA9IGV5ZXogLSBjZW50ZXJ6OworICAgIG1hZyA9IChmbG9hdClzcXJ0KHpbMF0gKiB6WzBdICsgelsxXSAqIHpbMV0gKyB6WzJdICogelsyXSk7CisgICAgaWYgKG1hZykgewkJCS8qIG1waWNobGVyLCAxOTk1MDUxNSAqLworICAgICAgICB6WzBdIC89IG1hZzsKKyAgICAgICAgelsxXSAvPSBtYWc7CisgICAgICAgIHpbMl0gLz0gbWFnOworICAgIH0KKworICAgIC8qIFkgdmVjdG9yICovCisgICAgeVswXSA9IHVweDsKKyAgICB5WzFdID0gdXB5OworICAgIHlbMl0gPSB1cHo7CisKKyAgICAvKiBYIHZlY3RvciA9IFkgY3Jvc3MgWiAqLworICAgIHhbMF0gPSB5WzFdICogelsyXSAtIHlbMl0gKiB6WzFdOworICAgIHhbMV0gPSAteVswXSAqIHpbMl0gKyB5WzJdICogelswXTsKKyAgICB4WzJdID0geVswXSAqIHpbMV0gLSB5WzFdICogelswXTsKKworICAgIC8qIFJlY29tcHV0ZSBZID0gWiBjcm9zcyBYICovCisgICAgeVswXSA9IHpbMV0gKiB4WzJdIC0gelsyXSAqIHhbMV07CisgICAgeVsxXSA9IC16WzBdICogeFsyXSArIHpbMl0gKiB4WzBdOworICAgIHlbMl0gPSB6WzBdICogeFsxXSAtIHpbMV0gKiB4WzBdOworCisgICAgLyogbXBpY2hsZXIsIDE5OTUwNTE1ICovCisgICAgLyogY3Jvc3MgcHJvZHVjdCBnaXZlcyBhcmVhIG9mIHBhcmFsbGVsb2dyYW0sIHdoaWNoIGlzIDwgMS4wIGZvcgorICAgICAqIG5vbi1wZXJwZW5kaWN1bGFyIHVuaXQtbGVuZ3RoIHZlY3RvcnM7IHNvIG5vcm1hbGl6ZSB4LCB5IGhlcmUKKyAgICAgKi8KKworICAgIG1hZyA9IChmbG9hdClzcXJ0KHhbMF0gKiB4WzBdICsgeFsxXSAqIHhbMV0gKyB4WzJdICogeFsyXSk7CisgICAgaWYgKG1hZykgeworICAgICAgICB4WzBdIC89IG1hZzsKKyAgICAgICAgeFsxXSAvPSBtYWc7CisgICAgICAgIHhbMl0gLz0gbWFnOworICAgIH0KKworICAgIG1hZyA9IChmbG9hdClzcXJ0KHlbMF0gKiB5WzBdICsgeVsxXSAqIHlbMV0gKyB5WzJdICogeVsyXSk7CisgICAgaWYgKG1hZykgeworICAgICAgICB5WzBdIC89IG1hZzsKKyAgICAgICAgeVsxXSAvPSBtYWc7CisgICAgICAgIHlbMl0gLz0gbWFnOworICAgIH0KKworI2RlZmluZSBNKHJvdyxjb2wpICBtW2NvbCo0K3Jvd10KKyAgICBNKDAsIDApID0geFswXTsKKyAgICBNKDAsIDEpID0geFsxXTsKKyAgICBNKDAsIDIpID0geFsyXTsKKyAgICBNKDAsIDMpID0gMC4wOworICAgIE0oMSwgMCkgPSB5WzBdOworICAgIE0oMSwgMSkgPSB5WzFdOworICAgIE0oMSwgMikgPSB5WzJdOworICAgIE0oMSwgMykgPSAwLjA7CisgICAgTSgyLCAwKSA9IHpbMF07CisgICAgTSgyLCAxKSA9IHpbMV07CisgICAgTSgyLCAyKSA9IHpbMl07CisgICAgTSgyLCAzKSA9IDAuMDsKKyAgICBNKDMsIDApID0gMC4wOworICAgIE0oMywgMSkgPSAwLjA7CisgICAgTSgzLCAyKSA9IDAuMDsKKyAgICBNKDMsIDMpID0gMS4wOworI3VuZGVmIE0KKyAgICB7CisgICAgICAgIGludCBhOworICAgICAgICBHTGZpeGVkIGZpeGVkTVsxNl07CisgICAgICAgIGZvciAoYSA9IDA7IGEgPCAxNjsgKythKQorICAgICAgICAgICAgZml4ZWRNW2FdID0gKEdMZml4ZWQpKG1bYV0gKiA2NTUzNik7CisgICAgICAgIGdsTXVsdE1hdHJpeHgoZml4ZWRNKTsKKyAgICB9CisKKyAgICAvKiBUcmFuc2xhdGUgRXllIHRvIE9yaWdpbiAqLworICAgIGdsVHJhbnNsYXRleCgoR0xmaXhlZCkoLWV5ZXggKiA2NTUzNiksCisgICAgICAgICAgICAgICAgIChHTGZpeGVkKSgtZXlleSAqIDY1NTM2KSwKKyAgICAgICAgICAgICAgICAgKEdMZml4ZWQpKC1leWV6ICogNjU1MzYpKTsKK30KKworCitzdGF0aWMgdm9pZCBjYW1UcmFjaygpCit7CisgICAgZmxvYXQgbGVycFs1XTsKKyAgICBmbG9hdCBlWCwgZVksIGVaLCBjWCwgY1ksIGNaOworICAgIGZsb2F0IHRyYWNrUG9zOworICAgIENBTVRSQUNLICpjYW07CisgICAgbG9uZyBjdXJyZW50Q2FtVGljazsKKyAgICBpbnQgYTsKKworICAgIGlmIChzTmV4dENhbVRyYWNrU3RhcnRUaWNrIDw9IHNUaWNrKQorICAgIHsKKyAgICAgICAgKytzQ3VycmVudENhbVRyYWNrOworICAgICAgICBzQ3VycmVudENhbVRyYWNrU3RhcnRUaWNrID0gc05leHRDYW1UcmFja1N0YXJ0VGljazsKKyAgICB9CisgICAgc05leHRDYW1UcmFja1N0YXJ0VGljayA9IHNDdXJyZW50Q2FtVHJhY2tTdGFydFRpY2sgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQ2FtVHJhY2tzW3NDdXJyZW50Q2FtVHJhY2tdLmxlbiAqIENBTVRSQUNLX0xFTjsKKworICAgIGNhbSA9ICZzQ2FtVHJhY2tzW3NDdXJyZW50Q2FtVHJhY2tdOworICAgIGN1cnJlbnRDYW1UaWNrID0gc1RpY2sgLSBzQ3VycmVudENhbVRyYWNrU3RhcnRUaWNrOworICAgIHRyYWNrUG9zID0gKGZsb2F0KWN1cnJlbnRDYW1UaWNrIC8gKENBTVRSQUNLX0xFTiAqIGNhbS0+bGVuKTsKKworICAgIGZvciAoYSA9IDA7IGEgPCA1OyArK2EpCisgICAgICAgIGxlcnBbYV0gPSAoY2FtLT5zcmNbYV0gKyBjYW0tPmRlc3RbYV0gKiB0cmFja1BvcykgKiAwLjAxZjsKKworICAgIGlmIChjYW0tPmRpc3QpCisgICAgeworICAgICAgICBmbG9hdCBkaXN0ID0gY2FtLT5kaXN0ICogMC4xZjsKKyAgICAgICAgY1ggPSBsZXJwWzBdOworICAgICAgICBjWSA9IGxlcnBbMV07CisgICAgICAgIGNaID0gbGVycFsyXTsKKyAgICAgICAgZVggPSBjWCAtIChmbG9hdCljb3MobGVycFszXSkgKiBkaXN0OworICAgICAgICBlWSA9IGNZIC0gKGZsb2F0KXNpbihsZXJwWzNdKSAqIGRpc3Q7CisgICAgICAgIGVaID0gY1ogLSBsZXJwWzRdOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBlWCA9IGxlcnBbMF07CisgICAgICAgIGVZID0gbGVycFsxXTsKKyAgICAgICAgZVogPSBsZXJwWzJdOworICAgICAgICBjWCA9IGVYICsgKGZsb2F0KWNvcyhsZXJwWzNdKTsKKyAgICAgICAgY1kgPSBlWSArIChmbG9hdClzaW4obGVycFszXSk7CisgICAgICAgIGNaID0gZVogKyBsZXJwWzRdOworICAgIH0KKyAgICBnbHVMb29rQXQoZVgsIGVZLCBlWiwgY1gsIGNZLCBjWiwgMCwgMCwgMSk7Cit9CisKKworLy8gQ2FsbGVkIGZyb20gdGhlIGFwcCBmcmFtZXdvcmsuCisvKiBUaGUgdGljayBpcyBjdXJyZW50IHRpbWUgaW4gbWlsbGlzZWNvbmRzLCB3aWR0aCBhbmQgaGVpZ2h0CisgKiBhcmUgdGhlIGltYWdlIGRpbWVuc2lvbnMgdG8gYmUgcmVuZGVyZWQuCisgKi8KK3ZvaWQgYXBwUmVuZGVyKGxvbmcgdGljaywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgIGlmIChzU3RhcnRUaWNrID09IDApCisgICAgICAgIHNTdGFydFRpY2sgPSB0aWNrOworICAgIGlmICghZ0FwcEFsaXZlKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBBY3R1YWwgdGljayB2YWx1ZSBpcyAiYmx1cnJlZCIgYSBsaXR0bGUgYml0LgorICAgIHNUaWNrID0gKHNUaWNrICsgdGljayAtIHNTdGFydFRpY2spID4+IDE7CisKKyAgICAvLyBUZXJtaW5hdGUgYXBwbGljYXRpb24gYWZ0ZXIgcnVubmluZyB0aHJvdWdoIHRoZSBkZW1vbnN0cmF0aW9uIG9uY2UuCisgICAgaWYgKHNUaWNrID49IFJVTl9MRU5HVEgpCisgICAgeworICAgICAgICBnQXBwQWxpdmUgPSAwOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gUHJlcGFyZSBPcGVuR0wgRVMgZm9yIHJlbmRlcmluZyBvZiB0aGUgZnJhbWUuCisgICAgcHJlcGFyZUZyYW1lKHdpZHRoLCBoZWlnaHQpOworCisgICAgLy8gVXBkYXRlIHRoZSBjYW1lcmEgcG9zaXRpb24gYW5kIHNldCB0aGUgbG9va2F0LgorICAgIGNhbVRyYWNrKCk7CisKKyAgICAvLyBDb25maWd1cmUgZW52aXJvbm1lbnQuCisgICAgY29uZmlndXJlTGlnaHRBbmRNYXRlcmlhbCgpOworCisgICAgLy8gRHJhdyB0aGUgcmVmbGVjdGlvbiBieSBkcmF3aW5nIG1vZGVscyB3aXRoIG5lZ2F0ZWQgWi1heGlzLgorICAgIGdsUHVzaE1hdHJpeCgpOworICAgIGRyYXdNb2RlbHMoLTEpOworICAgIGdsUG9wTWF0cml4KCk7CisKKyAgICAvLyBCbGVuZCB0aGUgZ3JvdW5kIHBsYW5lIHRvIHRoZSB3aW5kb3cuCisgICAgZHJhd0dyb3VuZFBsYW5lKCk7CisKKyAgICAvLyBEcmF3IGFsbCB0aGUgbW9kZWxzIG5vcm1hbGx5LgorICAgIGRyYXdNb2RlbHMoMSk7CisKKyAgICAvLyBEcmF3IGZhZGUgcXVhZCBvdmVyIHdob2xlIHdpbmRvdyAod2hlbiBjaGFuZ2luZyBjYW1lcmFzKS4KKyAgICBkcmF3RmFkZVF1YWQoKTsKK30KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL2dwdXN0YXRlLmMgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9ncHVzdGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNTQwYzkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9ncHVzdGF0ZS5jCkBAIC0wLDAgKzEsMzkgQEAKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCitzdGF0aWMgdm9pZCAqbWFwX21lbW9yeShjb25zdCBjaGFyICpmbiwgdW5zaWduZWQgYmFzZSwgdW5zaWduZWQgc2l6ZSkKK3sKKyAgICBpbnQgZmQ7CisgICAgdm9pZCAqcHRyOworICAgIAorICAgIGZkID0gb3BlbihmbiwgT19SRFdSIHwgT19TWU5DKTsKKyAgICBpZihmZCA8IDApIHsKKyAgICAgICAgcGVycm9yKCJjYW5ub3Qgb3BlbiAlcyBmb3IgbWFwcGluZyIpOworICAgICAgICByZXR1cm4gTUFQX0ZBSUxFRDsKKyAgICB9CisKKyAgICBwdHIgPSBtbWFwKDAsIHNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisgICAgICAgICAgICAgICBNQVBfU0hBUkVELCBmZCwgYmFzZSk7CisgICAgY2xvc2UoZmQpOworICAgIAorICAgIGlmKHB0ciA9PSBNQVBfRkFJTEVEKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCJjYW5ub3QgbWFwICVzIChAJTA4eCwlMDh4KVxuIiwgZm4sIGJhc2UsIHNpemUpOworICAgIH0KKyAgICByZXR1cm4gcHRyOyAgICAKK30KKworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisgICAgdm9pZCAqZ3JwX3JlZ3MgPSBtYXBfbWVtb3J5KCIvZGV2L2h3M2QiLCAwLCAxMDI0ICogMTAyNCk7CisgICAgcHJpbnRmKCJHUFUgYmFzZSBtYXBwZWQgYXQgJXBcbiIsIGdycF9yZWdzKTsKKyAgICBpbnQgc3RhdGVfb2Zmc2V0ID0gMHgxMDE0MDsKKyAgICBwcmludGYoIkdQVSBzdGF0ZSA9ICUwOGx4XG4iLAorICAgICAgICAgICAgKigobG9uZyopKChjaGFyKilncnBfcmVncyArIHN0YXRlX29mZnNldCkpICApOworCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9pbmNsdWRlL0dMRVMvZWdsLmggYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9pbmNsdWRlL0dMRVMvZWdsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RmODQxMAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2luY2x1ZGUvR0xFUy9lZ2wuaApAQCAtMCwwICsxLDIyOSBAQAorI2lmbmRlZiBfX2VnbF9oXworI2RlZmluZSBfX2VnbF9oXworCisvKgorKiogTGljZW5zZSBBcHBsaWNhYmlsaXR5LiBFeGNlcHQgdG8gdGhlIGV4dGVudCBwb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlCisqKiBtYWRlIHN1YmplY3QgdG8gYW4gYWx0ZXJuYXRpdmUgbGljZW5zZSBhcyBwZXJtaXR0ZWQgaW4gdGhlIFNHSSBGcmVlCisqKiBTb2Z0d2FyZSBMaWNlbnNlIEIsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMKKyoqIGZpbGUgYXJlIHN1YmplY3Qgb25seSB0byB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgTGljZW5zZS4gWW91IG1heSBub3QgdXNlCisqKiB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5CisqKiBvZiB0aGUgTGljZW5zZSBhdCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCBhdHRuOiBMZWdhbCBTZXJ2aWNlcywgMTYwMAorKiogQW1waGl0aGVhdHJlIFBhcmt3YXksIE1vdW50YWluIFZpZXcsIENBIDk0MDQzLTEzNTEsIG9yIGF0OgorKioKKyoqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9GcmVlQgorKioKKyoqIE5vdGUgdGhhdCwgYXMgcHJvdmlkZWQgaW4gdGhlIExpY2Vuc2UsIHRoZSBTb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiogIkFTIElTIiBiYXNpcywgd2l0aCBBTEwgRVhQUkVTUyBBTkQgSU1QTElFRCBXQVJSQU5USUVTIEFORCBDT05ESVRJT05TCisqKiBESVNDTEFJTUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIElNUExJRUQgV0FSUkFOVElFUyBBTkQKKyoqIENPTkRJVElPTlMgT0YgTUVSQ0hBTlRBQklMSVRZLCBTQVRJU0ZBQ1RPUlkgUVVBTElUWSwgRklUTkVTUyBGT1IgQQorKiogUEFSVElDVUxBUiBQVVJQT1NFLCBBTkQgTk9OLUlORlJJTkdFTUVOVC4KKyoqCisqKiBPcmlnaW5hbCBDb2RlLiBUaGUgT3JpZ2luYWwgQ29kZSBpczogT3BlbkdMIFNhbXBsZSBJbXBsZW1lbnRhdGlvbiwKKyoqIFZlcnNpb24gMS4yLjEsIHJlbGVhc2VkIEphbnVhcnkgMjYsIDIwMDAsIGRldmVsb3BlZCBieSBTaWxpY29uIEdyYXBoaWNzLAorKiogSW5jLiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKGMpIDE5OTEtMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisqKiBDb3B5cmlnaHQgaW4gYW55IHBvcnRpb25zIGNyZWF0ZWQgYnkgdGhpcmQgcGFydGllcyBpcyBhcyBpbmRpY2F0ZWQKKyoqIGVsc2V3aGVyZSBoZXJlaW4uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqKgorKiogQWRkaXRpb25hbCBOb3RpY2UgUHJvdmlzaW9uczogVGhlIGFwcGxpY2F0aW9uIHByb2dyYW1taW5nIGludGVyZmFjZXMKKyoqIGVzdGFibGlzaGVkIGJ5IFNHSSBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBPcmlnaW5hbCBDb2RlIGFyZSBUaGUKKyoqIE9wZW5HTChSKSBHcmFwaGljcyBTeXN0ZW06IEEgU3BlY2lmaWNhdGlvbiAoVmVyc2lvbiAxLjIuMSksIHJlbGVhc2VkCisqKiBBcHJpbCAxLCAxOTk5OyBUaGUgT3BlbkdMKFIpIEdyYXBoaWNzIFN5c3RlbSBVdGlsaXR5IExpYnJhcnkgKFZlcnNpb24KKyoqIDEuMyksIHJlbGVhc2VkIE5vdmVtYmVyIDQsIDE5OTg7IGFuZCBPcGVuR0woUikgR3JhcGhpY3Mgd2l0aCB0aGUgWAorKiogV2luZG93IFN5c3RlbShSKSAoVmVyc2lvbiAxLjMpLCByZWxlYXNlZCBPY3RvYmVyIDE5LCAxOTk4LiBUaGlzIHNvZnR3YXJlCisqKiB3YXMgY3JlYXRlZCB1c2luZyB0aGUgT3BlbkdMKFIpIHZlcnNpb24gMS4yLjEgU2FtcGxlIEltcGxlbWVudGF0aW9uCisqKiBwdWJsaXNoZWQgYnkgU0dJLCBidXQgaGFzIG5vdCBiZWVuIGluZGVwZW5kZW50bHkgdmVyaWZpZWQgYXMgYmVpbmcKKyoqIGNvbXBsaWFudCB3aXRoIHRoZSBPcGVuR0woUikgdmVyc2lvbiAxLjIuMSBTcGVjaWZpY2F0aW9uLgorKi8KKworI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNpbmNsdWRlIDxHTEVTL2VnbHR5cGVzLmg+CisKKy8qCisqKiBlZ2x0eXBlcy5oIGlzIHBsYXRmb3JtIGRlcGVuZGVudC4gSXQgZGVmaW5lczoKKyoqCisqKiAgICAgLSBFR0wgdHlwZXMgYW5kIHJlc291cmNlcworKiogICAgIC0gTmF0aXZlIHR5cGVzCisqKiAgICAgLSBFR0wgYW5kIG5hdGl2ZSBoYW5kbGUgdmFsdWVzCisqKgorKiogRUdMIHR5cGVzIGFuZCByZXNvdXJjZXMgYXJlIHRvIGJlIHR5cGVkZWYnZWQgd2l0aCBhcHByb3ByaWF0ZSBwbGF0Zm9ybQorKiogZGVwZW5kZW50IHJlc291cmNlIGhhbmRsZSB0eXBlcy4gRUdMaW50IG11c3QgYmUgYW4gaW50ZWdlciBvZiBhdCBsZWFzdAorKiogMzItYml0LgorKioKKyoqIE5hdGl2ZURpc3BsYXlUeXBlLCBOYXRpdmVXaW5kb3dUeXBlIGFuZCBOYXRpdmVQaXhtYXBUeXBlIGFyZSB0byBiZQorKiogcmVwbGFjZWQgd2l0aCBjb3JyZXNwb25kaW5nIHR5cGVzIG9mIHRoZSBuYXRpdmUgd2luZG93IHN5c3RlbSBpbiBlZ2wuaC4KKyoqCisqKiBFR0wgYW5kIG5hdGl2ZSBoYW5kbGUgdmFsdWVzIG11c3QgbWF0Y2ggdGhlaXIgdHlwZXMuCisqKgorKiogRXhhbXBsZSBlZ2x0eXBlcy5oOgorKi8KKworI2lmIDAKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPG5hdGl2ZV93aW5kb3dfc3lzdGVtLmg+CisKKy8qCisqKiBUeXBlcyBhbmQgcmVzb3VyY2VzCisqLwordHlwZWRlZiBpbnQgRUdMQm9vbGVhbjsKK3R5cGVkZWYgaW50MzJfdCBFR0xpbnQ7Cit0eXBlZGVmIHZvaWQgKkVHTERpc3BsYXk7Cit0eXBlZGVmIHZvaWQgKkVHTENvbmZpZzsKK3R5cGVkZWYgdm9pZCAqRUdMU3VyZmFjZTsKK3R5cGVkZWYgdm9pZCAqRUdMQ29udGV4dDsKKworLyoKKyoqIEVHTCBhbmQgbmF0aXZlIGhhbmRsZSB2YWx1ZXMKKyovCisjZGVmaW5lIEVHTF9ERUZBVUxUX0RJU1BMQVkgKChOYXRpdmVEaXNwbGF5VHlwZSkwKQorI2RlZmluZSBFR0xfTk9fQ09OVEVYVCAoKEVHTENvbnRleHQpMCkKKyNkZWZpbmUgRUdMX05PX0RJU1BMQVkgKChFR0xEaXNwbGF5KTApCisjZGVmaW5lIEVHTF9OT19TVVJGQUNFICgoRUdMU3VyZmFjZSkwKQorCisjZW5kaWYKKworLyoKKyoqIFZlcnNpb25pbmcgYW5kIGV4dGVuc2lvbnMKKyovCisjZGVmaW5lIEVHTF9WRVJTSU9OXzFfMAkJICAgICAgIDEKKworLyoKKyoqIEJvb2xlYW4KKyovCisjZGVmaW5lIEVHTF9GQUxTRQkJICAgICAgIDAKKyNkZWZpbmUgRUdMX1RSVUUJCSAgICAgICAxCisKKy8qCisqKiBFcnJvcnMKKyovCisjZGVmaW5lIEVHTF9TVUNDRVNTCQkgICAgICAgMHgzMDAwCisjZGVmaW5lIEVHTF9OT1RfSU5JVElBTElaRUQJICAgICAgIDB4MzAwMQorI2RlZmluZSBFR0xfQkFEX0FDQ0VTUwkJICAgICAgIDB4MzAwMgorI2RlZmluZSBFR0xfQkFEX0FMTE9DCQkgICAgICAgMHgzMDAzCisjZGVmaW5lIEVHTF9CQURfQVRUUklCVVRFCSAgICAgICAweDMwMDQKKyNkZWZpbmUgRUdMX0JBRF9DT05GSUcJCSAgICAgICAweDMwMDUKKyNkZWZpbmUgRUdMX0JBRF9DT05URVhUCQkgICAgICAgMHgzMDA2CisjZGVmaW5lIEVHTF9CQURfQ1VSUkVOVF9TVVJGQUNFICAgICAgICAweDMwMDcKKyNkZWZpbmUgRUdMX0JBRF9ESVNQTEFZCQkgICAgICAgMHgzMDA4CisjZGVmaW5lIEVHTF9CQURfTUFUQ0gJCSAgICAgICAweDMwMDkKKyNkZWZpbmUgRUdMX0JBRF9OQVRJVkVfUElYTUFQCSAgICAgICAweDMwMEEKKyNkZWZpbmUgRUdMX0JBRF9OQVRJVkVfV0lORE9XCSAgICAgICAweDMwMEIKKyNkZWZpbmUgRUdMX0JBRF9QQVJBTUVURVIJICAgICAgIDB4MzAwQworI2RlZmluZSBFR0xfQkFEX1NVUkZBQ0UJCSAgICAgICAweDMwMEQKKy8qIDB4MzAwRSAtIDB4MzAxRiByZXNlcnZlZCBmb3IgYWRkaXRpb25hbCBlcnJvcnMuICovCisKKy8qCisqKiBDb25maWcgYXR0cmlidXRlcworKi8KKyNkZWZpbmUgRUdMX0JVRkZFUl9TSVpFCQkgICAgICAgMHgzMDIwCisjZGVmaW5lIEVHTF9BTFBIQV9TSVpFCQkgICAgICAgMHgzMDIxCisjZGVmaW5lIEVHTF9CTFVFX1NJWkUJCSAgICAgICAweDMwMjIKKyNkZWZpbmUgRUdMX0dSRUVOX1NJWkUJCSAgICAgICAweDMwMjMKKyNkZWZpbmUgRUdMX1JFRF9TSVpFCQkgICAgICAgMHgzMDI0CisjZGVmaW5lIEVHTF9ERVBUSF9TSVpFCQkgICAgICAgMHgzMDI1CisjZGVmaW5lIEVHTF9TVEVOQ0lMX1NJWkUJICAgICAgIDB4MzAyNgorI2RlZmluZSBFR0xfQ09ORklHX0NBVkVBVAkgICAgICAgMHgzMDI3CisjZGVmaW5lIEVHTF9DT05GSUdfSUQJCSAgICAgICAweDMwMjgKKyNkZWZpbmUgRUdMX0xFVkVMCQkgICAgICAgMHgzMDI5CisjZGVmaW5lIEVHTF9NQVhfUEJVRkZFUl9IRUlHSFQJICAgICAgIDB4MzAyQQorI2RlZmluZSBFR0xfTUFYX1BCVUZGRVJfUElYRUxTCSAgICAgICAweDMwMkIKKyNkZWZpbmUgRUdMX01BWF9QQlVGRkVSX1dJRFRICSAgICAgICAweDMwMkMKKyNkZWZpbmUgRUdMX05BVElWRV9SRU5ERVJBQkxFCSAgICAgICAweDMwMkQKKyNkZWZpbmUgRUdMX05BVElWRV9WSVNVQUxfSUQJICAgICAgIDB4MzAyRQorI2RlZmluZSBFR0xfTkFUSVZFX1ZJU1VBTF9UWVBFCSAgICAgICAweDMwMkYKKy8qI2RlZmluZSBFR0xfUFJFU0VSVkVEX1JFU09VUkNFUwkgMHgzMDMwKi8KKyNkZWZpbmUgRUdMX1NBTVBMRVMJCSAgICAgICAweDMwMzEKKyNkZWZpbmUgRUdMX1NBTVBMRV9CVUZGRVJTCSAgICAgICAweDMwMzIKKyNkZWZpbmUgRUdMX1NVUkZBQ0VfVFlQRQkgICAgICAgMHgzMDMzCisjZGVmaW5lIEVHTF9UUkFOU1BBUkVOVF9UWVBFCSAgICAgICAweDMwMzQKKyNkZWZpbmUgRUdMX1RSQU5TUEFSRU5UX0JMVUVfVkFMVUUgICAgIDB4MzAzNQorI2RlZmluZSBFR0xfVFJBTlNQQVJFTlRfR1JFRU5fVkFMVUUgICAgMHgzMDM2CisjZGVmaW5lIEVHTF9UUkFOU1BBUkVOVF9SRURfVkFMVUUgICAgICAweDMwMzcKKworLyoKKyoqIENvbmZpZyBhdHRyaWJ1dGUgYW5kIHZhbHVlCisqLworI2RlZmluZSBFR0xfTk9ORQkJICAgICAgIDB4MzAzOAorLyogMHgzMDM5IC0gMHgzMDRGIHJlc2VydmVkIGZvciBhZGRpdGlvbmFsIGNvbmZpZyBhdHRyaWJ1dGVzLiAqLworCisvKgorKiogQ29uZmlnIHZhbHVlcworKi8KKyNkZWZpbmUgRUdMX0RPTlRfQ0FSRQkJICAgICAgICgoRUdMaW50KSAtMSkKKyNkZWZpbmUgRUdMX1BCVUZGRVJfQklUCQkgICAgICAgMHgwMQorI2RlZmluZSBFR0xfUElYTUFQX0JJVAkJICAgICAgIDB4MDIKKyNkZWZpbmUgRUdMX1dJTkRPV19CSVQJCSAgICAgICAweDA0CisjZGVmaW5lIEVHTF9TTE9XX0NPTkZJRwkJICAgICAgIDB4MzA1MAorI2RlZmluZSBFR0xfTk9OX0NPTkZPUk1BTlRfQ09ORklHICAgICAgMHgzMDUxCisjZGVmaW5lIEVHTF9UUkFOU1BBUkVOVF9SR0IJICAgICAgIDB4MzA1MgorCisvKgorKiogU3RyaW5nIG5hbWVzCisqLworI2RlZmluZSBFR0xfVkVORE9SCQkgICAgICAgMHgzMDUzCisjZGVmaW5lIEVHTF9WRVJTSU9OCQkgICAgICAgMHgzMDU0CisjZGVmaW5lIEVHTF9FWFRFTlNJT05TCQkgICAgICAgMHgzMDU1CisKKy8qCisqKiBTdXJmYWNlIGF0dHJpYnV0ZXMKKyovCisjZGVmaW5lIEVHTF9IRUlHSFQJCSAgICAgICAweDMwNTYKKyNkZWZpbmUgRUdMX1dJRFRICQkgICAgICAgMHgzMDU3CisjZGVmaW5lIEVHTF9MQVJHRVNUX1BCVUZGRVIJICAgICAgIDB4MzA1OAorCisvKgorKiogQ3VycmVudCBzdXJmYWNlcworKi8KKyNkZWZpbmUgRUdMX0RSQVcJCSAgICAgICAweDMwNTkKKyNkZWZpbmUgRUdMX1JFQUQJCSAgICAgICAweDMwNUEKKworLyoKKyoqIEVuZ2luZXMKKyovCisjZGVmaW5lIEVHTF9DT1JFX05BVElWRV9FTkdJTkUJICAgICAgIDB4MzA1QgorCisvKiAweDMwNUMtMHgzRkZGRiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqLworCisvKgorKiogRnVuY3Rpb25zCisqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitHTEFQSSBFR0xpbnQgQVBJRU5UUlkgZWdsR2V0RXJyb3IgKHZvaWQpOworCitHTEFQSSBFR0xEaXNwbGF5IEFQSUVOVFJZIGVnbEdldERpc3BsYXkgKE5hdGl2ZURpc3BsYXlUeXBlIGRpc3BsYXkpOworR0xBUEkgRUdMQm9vbGVhbiBBUElFTlRSWSBlZ2xJbml0aWFsaXplIChFR0xEaXNwbGF5IGRweSwgRUdMaW50ICptYWpvciwgRUdMaW50ICptaW5vcik7CitHTEFQSSBFR0xCb29sZWFuIEFQSUVOVFJZIGVnbFRlcm1pbmF0ZSAoRUdMRGlzcGxheSBkcHkpOworR0xBUEkgY29uc3QgY2hhciAqIEFQSUVOVFJZIGVnbFF1ZXJ5U3RyaW5nIChFR0xEaXNwbGF5IGRweSwgRUdMaW50IG5hbWUpOworR0xBUEkgdm9pZCAoKiBBUElFTlRSWSBlZ2xHZXRQcm9jQWRkcmVzcyAoY29uc3QgY2hhciAqcHJvY25hbWUpKSgpOworCitHTEFQSSBFR0xCb29sZWFuIEFQSUVOVFJZIGVnbEdldENvbmZpZ3MgKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgKmNvbmZpZ3MsIEVHTGludCBjb25maWdfc2l6ZSwgRUdMaW50ICpudW1fY29uZmlnKTsKK0dMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsQ2hvb3NlQ29uZmlnIChFR0xEaXNwbGF5IGRweSwgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCwgRUdMQ29uZmlnICpjb25maWdzLCBFR0xpbnQgY29uZmlnX3NpemUsIEVHTGludCAqbnVtX2NvbmZpZyk7CitHTEFQSSBFR0xCb29sZWFuIEFQSUVOVFJZIGVnbEdldENvbmZpZ0F0dHJpYiAoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsIEVHTGludCBhdHRyaWJ1dGUsIEVHTGludCAqdmFsdWUpOworCitHTEFQSSBFR0xTdXJmYWNlIEFQSUVOVFJZIGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UgKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLCBOYXRpdmVXaW5kb3dUeXBlIHdpbmRvdywgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCk7CitHTEFQSSBFR0xTdXJmYWNlIEFQSUVOVFJZIGVnbENyZWF0ZVBpeG1hcFN1cmZhY2UgKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLCBOYXRpdmVQaXhtYXBUeXBlIHBpeG1hcCwgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCk7CitHTEFQSSBFR0xTdXJmYWNlIEFQSUVOVFJZIGVnbENyZWF0ZVBidWZmZXJTdXJmYWNlIChFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCk7CitHTEFQSSBFR0xCb29sZWFuIEFQSUVOVFJZIGVnbERlc3Ryb3lTdXJmYWNlIChFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmYWNlKTsKK0dMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsUXVlcnlTdXJmYWNlIChFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmYWNlLCBFR0xpbnQgYXR0cmlidXRlLCBFR0xpbnQgKnZhbHVlKTsKKworR0xBUEkgRUdMQ29udGV4dCBBUElFTlRSWSBlZ2xDcmVhdGVDb250ZXh0IChFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywgRUdMQ29udGV4dCBzaGFyZV9saXN0LCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KTsKK0dMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsRGVzdHJveUNvbnRleHQgKEVHTERpc3BsYXkgZHB5LCBFR0xDb250ZXh0IGN0eCk7CitHTEFQSSBFR0xCb29sZWFuIEFQSUVOVFJZIGVnbE1ha2VDdXJyZW50IChFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBkcmF3LCBFR0xTdXJmYWNlIHJlYWQsIEVHTENvbnRleHQgY3R4KTsKK0dMQVBJIEVHTENvbnRleHQgQVBJRU5UUlkgZWdsR2V0Q3VycmVudENvbnRleHQgKHZvaWQpOworR0xBUEkgRUdMU3VyZmFjZSBBUElFTlRSWSBlZ2xHZXRDdXJyZW50U3VyZmFjZSAoRUdMaW50IHJlYWRkcmF3KTsKK0dMQVBJIEVHTERpc3BsYXkgQVBJRU5UUlkgZWdsR2V0Q3VycmVudERpc3BsYXkgKHZvaWQpOworR0xBUEkgRUdMQm9vbGVhbiBBUElFTlRSWSBlZ2xRdWVyeUNvbnRleHQgKEVHTERpc3BsYXkgZHB5LCBFR0xDb250ZXh0IGN0eCwgRUdMaW50IGF0dHJpYnV0ZSwgRUdMaW50ICp2YWx1ZSk7CisKK0dMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsV2FpdEdMICh2b2lkKTsKK0dMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsV2FpdE5hdGl2ZSAoRUdMaW50IGVuZ2luZSk7CitHTEFQSSBFR0xCb29sZWFuIEFQSUVOVFJZIGVnbFN3YXBCdWZmZXJzIChFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBkcmF3KTsKK0dMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsQ29weUJ1ZmZlcnMgKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UsIE5hdGl2ZVBpeG1hcFR5cGUgdGFyZ2V0KTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fX2VnbF9oXyAqLwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvaW5jbHVkZS9HTEVTL2VnbHR5cGVzLmggYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9pbmNsdWRlL0dMRVMvZWdsdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGIzNmM5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvaW5jbHVkZS9HTEVTL2VnbHR5cGVzLmgKQEAgLTAsMCArMSwyMCBAQAorLyoKKyoqIFR5cGVzIGFuZCByZXNvdXJjZXMKKyovCit0eXBlZGVmIGludCBFR0xCb29sZWFuOwordHlwZWRlZiBsb25nIEVHTGludDsKK3R5cGVkZWYgdm9pZCAqRUdMRGlzcGxheTsKK3R5cGVkZWYgdm9pZCAqRUdMQ29uZmlnOwordHlwZWRlZiB2b2lkICpFR0xTdXJmYWNlOwordHlwZWRlZiB2b2lkICpFR0xDb250ZXh0OwordHlwZWRlZiB2b2lkICpOYXRpdmVEaXNwbGF5VHlwZTsKK3R5cGVkZWYgdm9pZCAqTmF0aXZlV2luZG93VHlwZTsKK3R5cGVkZWYgdm9pZCAqTmF0aXZlUGl4bWFwVHlwZTsKKworLyoKKyoqIEVHTCBhbmQgbmF0aXZlIGhhbmRsZSB2YWx1ZXMKKyovCisjZGVmaW5lIEVHTF9ERUZBVUxUX0RJU1BMQVkgKChOYXRpdmVEaXNwbGF5VHlwZSkwKQorI2RlZmluZSBFR0xfTk9fQ09OVEVYVCAoKEVHTENvbnRleHQpMCkKKyNkZWZpbmUgRUdMX05PX0RJU1BMQVkgKChFR0xEaXNwbGF5KTApCisjZGVmaW5lIEVHTF9OT19TVVJGQUNFICgoRUdMU3VyZmFjZSkwKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvaW5jbHVkZS9HTEVTL2dsLmggYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9pbmNsdWRlL0dMRVMvZ2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTU0ODIyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvaW5jbHVkZS9HTEVTL2dsLmgKQEAgLTAsMCArMSw1ODQgQEAKKyNpZm5kZWYgX19nbF9oXworI2RlZmluZSBfX2dsX2hfCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoKKyoqIExpY2Vuc2UgQXBwbGljYWJpbGl0eS4gRXhjZXB0IHRvIHRoZSBleHRlbnQgcG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZQorKiogbWFkZSBzdWJqZWN0IHRvIGFuIGFsdGVybmF0aXZlIGxpY2Vuc2UgYXMgcGVybWl0dGVkIGluIHRoZSBTR0kgRnJlZQorKiogU29mdHdhcmUgTGljZW5zZSBCLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIiksIHRoZSBjb250ZW50cyBvZiB0aGlzCisqKiBmaWxlIGFyZSBzdWJqZWN0IG9ubHkgdG8gdGhlIHByb3Zpc2lvbnMgb2YgdGhlIExpY2Vuc2UuIFlvdSBtYXkgbm90IHVzZQorKiogdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weQorKiogb2YgdGhlIExpY2Vuc2UgYXQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgYXR0bjogTGVnYWwgU2VydmljZXMsIDE2MDAKKyoqIEFtcGhpdGhlYXRyZSBQYXJrd2F5LCBNb3VudGFpbiBWaWV3LCBDQSA5NDA0My0xMzUxLCBvciBhdDoKKyoqIAorKiogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0ZyZWVCCisqKiAKKyoqIE5vdGUgdGhhdCwgYXMgcHJvdmlkZWQgaW4gdGhlIExpY2Vuc2UsIHRoZSBTb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiogIkFTIElTIiBiYXNpcywgd2l0aCBBTEwgRVhQUkVTUyBBTkQgSU1QTElFRCBXQVJSQU5USUVTIEFORCBDT05ESVRJT05TCisqKiBESVNDTEFJTUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIElNUExJRUQgV0FSUkFOVElFUyBBTkQKKyoqIENPTkRJVElPTlMgT0YgTUVSQ0hBTlRBQklMSVRZLCBTQVRJU0ZBQ1RPUlkgUVVBTElUWSwgRklUTkVTUyBGT1IgQQorKiogUEFSVElDVUxBUiBQVVJQT1NFLCBBTkQgTk9OLUlORlJJTkdFTUVOVC4KKyoqIAorKiogT3JpZ2luYWwgQ29kZS4gVGhlIE9yaWdpbmFsIENvZGUgaXM6IE9wZW5HTCBTYW1wbGUgSW1wbGVtZW50YXRpb24sCisqKiBWZXJzaW9uIDEuMi4xLCByZWxlYXNlZCBKYW51YXJ5IDI2LCAyMDAwLCBkZXZlbG9wZWQgYnkgU2lsaWNvbiBHcmFwaGljcywKKyoqIEluYy4gVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChjKSAxOTkxLTIwMDAgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorKiogQ29weXJpZ2h0IGluIGFueSBwb3J0aW9ucyBjcmVhdGVkIGJ5IHRoaXJkIHBhcnRpZXMgaXMgYXMgaW5kaWNhdGVkCisqKiBlbHNld2hlcmUgaGVyZWluLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorKiogCisqKiBBZGRpdGlvbmFsIE5vdGljZSBQcm92aXNpb25zOiBUaGUgYXBwbGljYXRpb24gcHJvZ3JhbW1pbmcgaW50ZXJmYWNlcworKiogZXN0YWJsaXNoZWQgYnkgU0dJIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIE9yaWdpbmFsIENvZGUgYXJlIFRoZQorKiogT3BlbkdMKFIpIEdyYXBoaWNzIFN5c3RlbTogQSBTcGVjaWZpY2F0aW9uIChWZXJzaW9uIDEuMi4xKSwgcmVsZWFzZWQKKyoqIEFwcmlsIDEsIDE5OTk7IFRoZSBPcGVuR0woUikgR3JhcGhpY3MgU3lzdGVtIFV0aWxpdHkgTGlicmFyeSAoVmVyc2lvbgorKiogMS4zKSwgcmVsZWFzZWQgTm92ZW1iZXIgNCwgMTk5ODsgYW5kIE9wZW5HTChSKSBHcmFwaGljcyB3aXRoIHRoZSBYCisqKiBXaW5kb3cgU3lzdGVtKFIpIChWZXJzaW9uIDEuMyksIHJlbGVhc2VkIE9jdG9iZXIgMTksIDE5OTguIFRoaXMgc29mdHdhcmUKKyoqIHdhcyBjcmVhdGVkIHVzaW5nIHRoZSBPcGVuR0woUikgdmVyc2lvbiAxLjIuMSBTYW1wbGUgSW1wbGVtZW50YXRpb24KKyoqIHB1Ymxpc2hlZCBieSBTR0ksIGJ1dCBoYXMgbm90IGJlZW4gaW5kZXBlbmRlbnRseSB2ZXJpZmllZCBhcyBiZWluZworKiogY29tcGxpYW50IHdpdGggdGhlIE9wZW5HTChSKSB2ZXJzaW9uIDEuMi4xIFNwZWNpZmljYXRpb24uCisqLworCisjaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKEFQSUVOVFJZKSAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKQorI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOIDEKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZW5kaWYKKworI2lmbmRlZiBBUElFTlRSWQorI2RlZmluZSBBUElFTlRSWQorI2VuZGlmCisjaWZuZGVmIEdMQVBJCisjZGVmaW5lIEdMQVBJIGV4dGVybgorI2VuZGlmCisKK3R5cGVkZWYgdW5zaWduZWQgaW50IEdMZW51bTsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBHTGJvb2xlYW47Cit0eXBlZGVmIHVuc2lnbmVkIGludCBHTGJpdGZpZWxkOwordHlwZWRlZiBzaWduZWQgY2hhciBHTGJ5dGU7Cit0eXBlZGVmIHNob3J0IEdMc2hvcnQ7Cit0eXBlZGVmIGludCBHTGludDsKK3R5cGVkZWYgaW50IEdMc2l6ZWk7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgR0x1Ynl0ZTsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgR0x1c2hvcnQ7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBHTHVpbnQ7Cit0eXBlZGVmIGZsb2F0IEdMZmxvYXQ7Cit0eXBlZGVmIGZsb2F0IEdMY2xhbXBmOwordHlwZWRlZiB2b2lkIEdMdm9pZDsKK3R5cGVkZWYgaW50IEdMaW50cHRyQVJCOwordHlwZWRlZiBpbnQgR0xzaXplaXB0ckFSQjsKK3R5cGVkZWYgaW50IEdMZml4ZWQ7Cit0eXBlZGVmIGludCBHTGNsYW1weDsKKy8qIEludGVybmFsIGNvbnZlbmllbmNlIHR5cGVkZWZzICovCit0eXBlZGVmIHZvaWQgKCpfR0xmdW5jcHRyKSgpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRXh0ZW5zaW9ucyAqLworI2RlZmluZSBHTF9PRVNfVkVSU0lPTl8xXzAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHTF9PRVNfcmVhZF9mb3JtYXQgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHTF9PRVNfY29tcHJlc3NlZF9wYWxldHRlZF90ZXh0dXJlIDEKKworLyogQ2xlYXJCdWZmZXJNYXNrICovCisjZGVmaW5lIEdMX0RFUFRIX0JVRkZFUl9CSVQgICAgICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIEdMX1NURU5DSUxfQlVGRkVSX0JJVCAgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIEdMX0NPTE9SX0JVRkZFUl9CSVQgICAgICAgICAgICAgICAweDAwMDA0MDAwCisKKy8qIEJvb2xlYW4gKi8KKyNkZWZpbmUgR0xfRkFMU0UgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR0xfVFJVRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKworLyogQmVnaW5Nb2RlICovCisjZGVmaW5lIEdMX1BPSU5UUyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgR0xfTElORVMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBHTF9MSU5FX0xPT1AgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIEdMX0xJTkVfU1RSSVAgICAgICAgICAgICAgICAgICAgICAweDAwMDMKKyNkZWZpbmUgR0xfVFJJQU5HTEVTICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBHTF9UUklBTkdMRV9TVFJJUCAgICAgICAgICAgICAgICAgMHgwMDA1CisjZGVmaW5lIEdMX1RSSUFOR0xFX0ZBTiAgICAgICAgICAgICAgICAgICAweDAwMDYKKworLyogQWxwaGFGdW5jdGlvbiAqLworI2RlZmluZSBHTF9ORVZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lIEdMX0xFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDEKKyNkZWZpbmUgR0xfRVFVQUwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMgorI2RlZmluZSBHTF9MRVFVQUwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAzCisjZGVmaW5lIEdMX0dSRUFURVIgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDQKKyNkZWZpbmUgR0xfTk9URVFVQUwgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwNQorI2RlZmluZSBHTF9HRVFVQUwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjA2CisjZGVmaW5lIEdMX0FMV0FZUyAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDcKKworLyogQmxlbmRpbmdGYWN0b3JEZXN0ICovCisjZGVmaW5lIEdMX1pFUk8gICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdMX09ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdMX1NSQ19DT0xPUiAgICAgICAgICAgICAgICAgICAgICAweDAzMDAKKyNkZWZpbmUgR0xfT05FX01JTlVTX1NSQ19DT0xPUiAgICAgICAgICAgIDB4MDMwMQorI2RlZmluZSBHTF9TUkNfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgMHgwMzAyCisjZGVmaW5lIEdMX09ORV9NSU5VU19TUkNfQUxQSEEgICAgICAgICAgICAweDAzMDMKKyNkZWZpbmUgR0xfRFNUX0FMUEhBICAgICAgICAgICAgICAgICAgICAgIDB4MDMwNAorI2RlZmluZSBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBICAgICAgICAgICAgMHgwMzA1CisKKy8qIEJsZW5kaW5nRmFjdG9yU3JjICovCisvKiAgICAgIEdMX1pFUk8gKi8KKy8qICAgICAgR0xfT05FICovCisjZGVmaW5lIEdMX0RTVF9DT0xPUiAgICAgICAgICAgICAgICAgICAgICAweDAzMDYKKyNkZWZpbmUgR0xfT05FX01JTlVTX0RTVF9DT0xPUiAgICAgICAgICAgIDB4MDMwNworI2RlZmluZSBHTF9TUkNfQUxQSEFfU0FUVVJBVEUgICAgICAgICAgICAgMHgwMzA4CisvKiAgICAgIEdMX1NSQ19BTFBIQSAqLworLyogICAgICBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBICovCisvKiAgICAgIEdMX0RTVF9BTFBIQSAqLworLyogICAgICBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBICovCisKKy8qIENvbG9yTWF0ZXJpYWxGYWNlICovCisvKiAgICAgIEdMX0ZST05UX0FORF9CQUNLICovCisKKy8qIENvbG9yTWF0ZXJpYWxQYXJhbWV0ZXIgKi8KKy8qICAgICAgR0xfQU1CSUVOVF9BTkRfRElGRlVTRSAqLworCisvKiBDb2xvclBvaW50ZXJUeXBlICovCisvKiAgICAgIEdMX1VOU0lHTkVEX0JZVEUgKi8KKy8qICAgICAgR0xfRkxPQVQgKi8KKy8qICAgICAgR0xfRklYRUQgKi8KKworLyogQ3VsbEZhY2VNb2RlICovCisjZGVmaW5lIEdMX0ZST05UICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDQKKyNkZWZpbmUgR0xfQkFDSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwNQorI2RlZmluZSBHTF9GUk9OVF9BTkRfQkFDSyAgICAgICAgICAgICAgICAgMHgwNDA4CisKKy8qIERlcHRoRnVuY3Rpb24gKi8KKy8qICAgICAgR0xfTkVWRVIgKi8KKy8qICAgICAgR0xfTEVTUyAqLworLyogICAgICBHTF9FUVVBTCAqLworLyogICAgICBHTF9MRVFVQUwgKi8KKy8qICAgICAgR0xfR1JFQVRFUiAqLworLyogICAgICBHTF9OT1RFUVVBTCAqLworLyogICAgICBHTF9HRVFVQUwgKi8KKy8qICAgICAgR0xfQUxXQVlTICovCisKKy8qIEVuYWJsZUNhcCAqLworI2RlZmluZSBHTF9GT0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQjYwCisjZGVmaW5lIEdMX0xJR0hUSU5HICAgICAgICAgICAgICAgICAgICAgICAweDBCNTAKKyNkZWZpbmUgR0xfVEVYVFVSRV8yRCAgICAgICAgICAgICAgICAgICAgIDB4MERFMQorI2RlZmluZSBHTF9DVUxMX0ZBQ0UgICAgICAgICAgICAgICAgICAgICAgMHgwQjQ0CisjZGVmaW5lIEdMX0FMUEhBX1RFU1QgICAgICAgICAgICAgICAgICAgICAweDBCQzAKKyNkZWZpbmUgR0xfQkxFTkQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEJFMgorI2RlZmluZSBHTF9DT0xPUl9MT0dJQ19PUCAgICAgICAgICAgICAgICAgMHgwQkYyCisjZGVmaW5lIEdMX0RJVEhFUiAgICAgICAgICAgICAgICAgICAgICAgICAweDBCRDAKKyNkZWZpbmUgR0xfU1RFTkNJTF9URVNUICAgICAgICAgICAgICAgICAgIDB4MEI5MAorI2RlZmluZSBHTF9ERVBUSF9URVNUICAgICAgICAgICAgICAgICAgICAgMHgwQjcxCisvKiAgICAgIEdMX0xJR0hUMCAqLworLyogICAgICBHTF9MSUdIVDEgKi8KKy8qICAgICAgR0xfTElHSFQyICovCisvKiAgICAgIEdMX0xJR0hUMyAqLworLyogICAgICBHTF9MSUdIVDQgKi8KKy8qICAgICAgR0xfTElHSFQ1ICovCisvKiAgICAgIEdMX0xJR0hUNiAqLworLyogICAgICBHTF9MSUdIVDcgKi8KKyNkZWZpbmUgR0xfUE9JTlRfU01PT1RIICAgICAgICAgICAgICAgICAgIDB4MEIxMAorI2RlZmluZSBHTF9MSU5FX1NNT09USCAgICAgICAgICAgICAgICAgICAgMHgwQjIwCisjZGVmaW5lIEdMX1NDSVNTT1JfVEVTVCAgICAgICAgICAgICAgICAgICAweDBDMTEKKyNkZWZpbmUgR0xfQ09MT1JfTUFURVJJQUwgICAgICAgICAgICAgICAgIDB4MEI1NworI2RlZmluZSBHTF9OT1JNQUxJWkUgICAgICAgICAgICAgICAgICAgICAgMHgwQkExCisjZGVmaW5lIEdMX1JFU0NBTEVfTk9STUFMICAgICAgICAgICAgICAgICAweDgwM0EKKyNkZWZpbmUgR0xfUE9MWUdPTl9PRkZTRVRfRklMTCAgICAgICAgICAgIDB4ODAzNworI2RlZmluZSBHTF9WRVJURVhfQVJSQVkgICAgICAgICAgICAgICAgICAgMHg4MDc0CisjZGVmaW5lIEdMX05PUk1BTF9BUlJBWSAgICAgICAgICAgICAgICAgICAweDgwNzUKKyNkZWZpbmUgR0xfQ09MT1JfQVJSQVkgICAgICAgICAgICAgICAgICAgIDB4ODA3NgorI2RlZmluZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZICAgICAgICAgICAgMHg4MDc4CisjZGVmaW5lIEdMX01VTFRJU0FNUExFICAgICAgICAgICAgICAgICAgICAweDgwOUQKKyNkZWZpbmUgR0xfU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFICAgICAgIDB4ODA5RQorI2RlZmluZSBHTF9TQU1QTEVfQUxQSEFfVE9fT05FICAgICAgICAgICAgMHg4MDlGCisjZGVmaW5lIEdMX1NBTVBMRV9DT1ZFUkFHRSAgICAgICAgICAgICAgICAweDgwQTAKKworLyogRXJyb3JDb2RlICovCisjZGVmaW5lIEdMX05PX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdMX0lOVkFMSURfRU5VTSAgICAgICAgICAgICAgICAgICAweDA1MDAKKyNkZWZpbmUgR0xfSU5WQUxJRF9WQUxVRSAgICAgICAgICAgICAgICAgIDB4MDUwMQorI2RlZmluZSBHTF9JTlZBTElEX09QRVJBVElPTiAgICAgICAgICAgICAgMHgwNTAyCisjZGVmaW5lIEdMX1NUQUNLX09WRVJGTE9XICAgICAgICAgICAgICAgICAweDA1MDMKKyNkZWZpbmUgR0xfU1RBQ0tfVU5ERVJGTE9XICAgICAgICAgICAgICAgIDB4MDUwNAorI2RlZmluZSBHTF9PVVRfT0ZfTUVNT1JZICAgICAgICAgICAgICAgICAgMHgwNTA1CisKKy8qIEZvZ01vZGUgKi8KKy8qICAgICAgR0xfTElORUFSICovCisjZGVmaW5lIEdMX0VYUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgR0xfRVhQMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMQorCisvKiBGb2dQYXJhbWV0ZXIgKi8KKyNkZWZpbmUgR0xfRk9HX0RFTlNJVFkgICAgICAgICAgICAgICAgICAgIDB4MEI2MgorI2RlZmluZSBHTF9GT0dfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgMHgwQjYzCisjZGVmaW5lIEdMX0ZPR19FTkQgICAgICAgICAgICAgICAgICAgICAgICAweDBCNjQKKyNkZWZpbmUgR0xfRk9HX01PREUgICAgICAgICAgICAgICAgICAgICAgIDB4MEI2NQorI2RlZmluZSBHTF9GT0dfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgMHgwQjY2CisKKy8qIEZyb250RmFjZURpcmVjdGlvbiAqLworI2RlZmluZSBHTF9DVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOTAwCisjZGVmaW5lIEdMX0NDVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5MDEKKworLyogR2V0UE5hbWUgKi8KKyNkZWZpbmUgR0xfU01PT1RIX1BPSU5UX1NJWkVfUkFOR0UgICAgICAgIDB4MEIxMgorI2RlZmluZSBHTF9TTU9PVEhfTElORV9XSURUSF9SQU5HRSAgICAgICAgMHgwQjIyCisjZGVmaW5lIEdMX0FMSUFTRURfUE9JTlRfU0laRV9SQU5HRSAgICAgICAweDg0NkQKKyNkZWZpbmUgR0xfQUxJQVNFRF9MSU5FX1dJRFRIX1JBTkdFICAgICAgIDB4ODQ2RQorI2RlZmluZSBHTF9JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX1RZUEVfT0VTIDB4OEI5QQorI2RlZmluZSBHTF9JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX0ZPUk1BVF9PRVMgMHg4QjlCCisjZGVmaW5lIEdMX01BWF9MSUdIVFMgICAgICAgICAgICAgICAgICAgICAweDBEMzEKKyNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfU0laRSAgICAgICAgICAgICAgIDB4MEQzMworI2RlZmluZSBHTF9NQVhfTU9ERUxWSUVXX1NUQUNLX0RFUFRIICAgICAgMHgwRDM2CisjZGVmaW5lIEdMX01BWF9QUk9KRUNUSU9OX1NUQUNLX0RFUFRIICAgICAweDBEMzgKKyNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfU1RBQ0tfREVQVEggICAgICAgIDB4MEQzOQorI2RlZmluZSBHTF9NQVhfVklFV1BPUlRfRElNUyAgICAgICAgICAgICAgMHgwRDNBCisjZGVmaW5lIEdMX01BWF9FTEVNRU5UU19WRVJUSUNFUyAgICAgICAgICAweDgwRTgKKyNkZWZpbmUgR0xfTUFYX0VMRU1FTlRTX0lORElDRVMgICAgICAgICAgIDB4ODBFOQorI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9VTklUUyAgICAgICAgICAgICAgMHg4NEUyCisjZGVmaW5lIEdMX05VTV9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUyAweDg2QTIKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMgICAgIDB4ODZBMworI2RlZmluZSBHTF9TVUJQSVhFTF9CSVRTICAgICAgICAgICAgICAgICAgMHgwRDUwCisjZGVmaW5lIEdMX1JFRF9CSVRTICAgICAgICAgICAgICAgICAgICAgICAweDBENTIKKyNkZWZpbmUgR0xfR1JFRU5fQklUUyAgICAgICAgICAgICAgICAgICAgIDB4MEQ1MworI2RlZmluZSBHTF9CTFVFX0JJVFMgICAgICAgICAgICAgICAgICAgICAgMHgwRDU0CisjZGVmaW5lIEdMX0FMUEhBX0JJVFMgICAgICAgICAgICAgICAgICAgICAweDBENTUKKyNkZWZpbmUgR0xfREVQVEhfQklUUyAgICAgICAgICAgICAgICAgICAgIDB4MEQ1NgorI2RlZmluZSBHTF9TVEVOQ0lMX0JJVFMgICAgICAgICAgICAgICAgICAgMHgwRDU3CisKKy8qIEhpbnRNb2RlICovCisjZGVmaW5lIEdMX0RPTlRfQ0FSRSAgICAgICAgICAgICAgICAgICAgICAweDExMDAKKyNkZWZpbmUgR0xfRkFTVEVTVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MTEwMQorI2RlZmluZSBHTF9OSUNFU1QgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMTAyCisKKy8qIEhpbnRUYXJnZXQgKi8KKyNkZWZpbmUgR0xfUEVSU1BFQ1RJVkVfQ09SUkVDVElPTl9ISU5UICAgIDB4MEM1MAorI2RlZmluZSBHTF9QT0lOVF9TTU9PVEhfSElOVCAgICAgICAgICAgICAgMHgwQzUxCisjZGVmaW5lIEdMX0xJTkVfU01PT1RIX0hJTlQgICAgICAgICAgICAgICAweDBDNTIKKyNkZWZpbmUgR0xfUE9MWUdPTl9TTU9PVEhfSElOVCAgICAgICAgICAgIDB4MEM1MworI2RlZmluZSBHTF9GT0dfSElOVCAgICAgICAgICAgICAgICAgICAgICAgMHgwQzU0CisKKy8qIExpZ2h0TW9kZWxQYXJhbWV0ZXIgKi8KKyNkZWZpbmUgR0xfTElHSFRfTU9ERUxfQU1CSUVOVCAgICAgICAgICAgIDB4MEI1MworI2RlZmluZSBHTF9MSUdIVF9NT0RFTF9UV09fU0lERSAgICAgICAgICAgMHgwQjUyCisKKy8qIExpZ2h0UGFyYW1ldGVyICovCisjZGVmaW5lIEdMX0FNQklFTlQgICAgICAgICAgICAgICAgICAgICAgICAweDEyMDAKKyNkZWZpbmUgR0xfRElGRlVTRSAgICAgICAgICAgICAgICAgICAgICAgIDB4MTIwMQorI2RlZmluZSBHTF9TUEVDVUxBUiAgICAgICAgICAgICAgICAgICAgICAgMHgxMjAyCisjZGVmaW5lIEdMX1BPU0lUSU9OICAgICAgICAgICAgICAgICAgICAgICAweDEyMDMKKyNkZWZpbmUgR0xfU1BPVF9ESVJFQ1RJT04gICAgICAgICAgICAgICAgIDB4MTIwNAorI2RlZmluZSBHTF9TUE9UX0VYUE9ORU5UICAgICAgICAgICAgICAgICAgMHgxMjA1CisjZGVmaW5lIEdMX1NQT1RfQ1VUT0ZGICAgICAgICAgICAgICAgICAgICAweDEyMDYKKyNkZWZpbmUgR0xfQ09OU1RBTlRfQVRURU5VQVRJT04gICAgICAgICAgIDB4MTIwNworI2RlZmluZSBHTF9MSU5FQVJfQVRURU5VQVRJT04gICAgICAgICAgICAgMHgxMjA4CisjZGVmaW5lIEdMX1FVQURSQVRJQ19BVFRFTlVBVElPTiAgICAgICAgICAweDEyMDkKKworLyogRGF0YVR5cGUgKi8KKyNkZWZpbmUgR0xfQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQwMAorI2RlZmluZSBHTF9VTlNJR05FRF9CWVRFICAgICAgICAgICAgICAgICAgMHgxNDAxCisjZGVmaW5lIEdMX1NIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0MDIKKyNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlQgICAgICAgICAgICAgICAgIDB4MTQwMworI2RlZmluZSBHTF9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDA2CisjZGVmaW5lIEdMX0ZJWEVEICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0MEMKKworLyogTG9naWNPcCAqLworI2RlZmluZSBHTF9DTEVBUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTAwCisjZGVmaW5lIEdMX0FORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MDEKKyNkZWZpbmUgR0xfQU5EX1JFVkVSU0UgICAgICAgICAgICAgICAgICAgIDB4MTUwMgorI2RlZmluZSBHTF9DT1BZICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTAzCisjZGVmaW5lIEdMX0FORF9JTlZFUlRFRCAgICAgICAgICAgICAgICAgICAweDE1MDQKKyNkZWZpbmUgR0xfTk9PUCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwNQorI2RlZmluZSBHTF9YT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTA2CisjZGVmaW5lIEdMX09SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MDcKKyNkZWZpbmUgR0xfTk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwOAorI2RlZmluZSBHTF9FUVVJViAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTA5CisjZGVmaW5lIEdMX0lOVkVSVCAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MEEKKyNkZWZpbmUgR0xfT1JfUkVWRVJTRSAgICAgICAgICAgICAgICAgICAgIDB4MTUwQgorI2RlZmluZSBHTF9DT1BZX0lOVkVSVEVEICAgICAgICAgICAgICAgICAgMHgxNTBDCisjZGVmaW5lIEdMX09SX0lOVkVSVEVEICAgICAgICAgICAgICAgICAgICAweDE1MEQKKyNkZWZpbmUgR0xfTkFORCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwRQorI2RlZmluZSBHTF9TRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTBGCisKKy8qIE1hdGVyaWFsRmFjZSAqLworLyogICAgICBHTF9GUk9OVF9BTkRfQkFDSyAqLworCisvKiBNYXRlcmlhbFBhcmFtZXRlciAqLworI2RlZmluZSBHTF9FTUlTU0lPTiAgICAgICAgICAgICAgICAgICAgICAgMHgxNjAwCisjZGVmaW5lIEdMX1NISU5JTkVTUyAgICAgICAgICAgICAgICAgICAgICAweDE2MDEKKyNkZWZpbmUgR0xfQU1CSUVOVF9BTkRfRElGRlVTRSAgICAgICAgICAgIDB4MTYwMgorLyogICAgICBHTF9BTUJJRU5UICovCisvKiAgICAgIEdMX0RJRkZVU0UgKi8KKy8qICAgICAgR0xfU1BFQ1VMQVIgKi8KKworLyogTWF0cml4TW9kZSAqLworI2RlZmluZSBHTF9NT0RFTFZJRVcgICAgICAgICAgICAgICAgICAgICAgMHgxNzAwCisjZGVmaW5lIEdMX1BST0pFQ1RJT04gICAgICAgICAgICAgICAgICAgICAweDE3MDEKKyNkZWZpbmUgR0xfVEVYVFVSRSAgICAgICAgICAgICAgICAgICAgICAgIDB4MTcwMgorCisvKiBOb3JtYWxQb2ludGVyVHlwZSAqLworLyogICAgICBHTF9CWVRFICovCisvKiAgICAgIEdMX1NIT1JUICovCisvKiAgICAgIEdMX0ZMT0FUICovCisvKiAgICAgIEdMX0ZJWEVEICovCisKKy8qIFBpeGVsRm9ybWF0ICovCisjZGVmaW5lIEdMX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICAweDE5MDYKKyNkZWZpbmUgR0xfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTkwNworI2RlZmluZSBHTF9SR0JBICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxOTA4CisjZGVmaW5lIEdMX0xVTUlOQU5DRSAgICAgICAgICAgICAgICAgICAgICAweDE5MDkKKyNkZWZpbmUgR0xfTFVNSU5BTkNFX0FMUEhBICAgICAgICAgICAgICAgIDB4MTkwQQorCisvKiBQaXhlbFN0b3JlUGFyYW1ldGVyICovCisjZGVmaW5lIEdMX1VOUEFDS19BTElHTk1FTlQgICAgICAgICAgICAgICAweDBDRjUKKyNkZWZpbmUgR0xfUEFDS19BTElHTk1FTlQgICAgICAgICAgICAgICAgIDB4MEQwNQorCisvKiBQaXhlbFR5cGUgKi8KKy8qICAgICAgR0xfVU5TSUdORURfQllURSAqLworI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80ICAgICAgICAgMHg4MDMzCisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzVfNV81XzEgICAgICAgICAweDgwMzQKKyNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfNV82XzUgICAgICAgICAgIDB4ODM2MworCisvKiBTaGFkaW5nTW9kZWwgKi8KKyNkZWZpbmUgR0xfRkxBVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUQwMAorI2RlZmluZSBHTF9TTU9PVEggICAgICAgICAgICAgICAgICAgICAgICAgMHgxRDAxCisKKy8qIFN0ZW5jaWxGdW5jdGlvbiAqLworLyogICAgICBHTF9ORVZFUiAqLworLyogICAgICBHTF9MRVNTICovCisvKiAgICAgIEdMX0VRVUFMICovCisvKiAgICAgIEdMX0xFUVVBTCAqLworLyogICAgICBHTF9HUkVBVEVSICovCisvKiAgICAgIEdMX05PVEVRVUFMICovCisvKiAgICAgIEdMX0dFUVVBTCAqLworLyogICAgICBHTF9BTFdBWVMgKi8KKworLyogU3RlbmNpbE9wICovCisvKiAgICAgIEdMX1pFUk8gKi8KKyNkZWZpbmUgR0xfS0VFUCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUUwMAorI2RlZmluZSBHTF9SRVBMQUNFICAgICAgICAgICAgICAgICAgICAgICAgMHgxRTAxCisjZGVmaW5lIEdMX0lOQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFFMDIKKyNkZWZpbmUgR0xfREVDUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUUwMworLyogICAgICBHTF9JTlZFUlQgKi8KKworLyogU3RyaW5nTmFtZSAqLworI2RlZmluZSBHTF9WRU5ET1IgICAgICAgICAgICAgICAgICAgICAgICAgMHgxRjAwCisjZGVmaW5lIEdMX1JFTkRFUkVSICAgICAgICAgICAgICAgICAgICAgICAweDFGMDEKKyNkZWZpbmUgR0xfVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgIDB4MUYwMgorI2RlZmluZSBHTF9FWFRFTlNJT05TICAgICAgICAgICAgICAgICAgICAgMHgxRjAzCisKKy8qIFRleENvb3JkUG9pbnRlclR5cGUgKi8KKy8qICAgICAgR0xfU0hPUlQgKi8KKy8qICAgICAgR0xfRkxPQVQgKi8KKy8qICAgICAgR0xfRklYRUQgKi8KKy8qICAgICAgR0xfQllURSAqLworCisvKiBUZXh0dXJlRW52TW9kZSAqLworI2RlZmluZSBHTF9NT0RVTEFURSAgICAgICAgICAgICAgICAgICAgICAgMHgyMTAwCisjZGVmaW5lIEdMX0RFQ0FMICAgICAgICAgICAgICAgICAgICAgICAgICAweDIxMDEKKy8qICAgICAgR0xfQkxFTkQgKi8KKyNkZWZpbmUgR0xfQUREICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwNAorLyogICAgICBHTF9SRVBMQUNFICovCisKKy8qIFRleHR1cmVFbnZQYXJhbWV0ZXIgKi8KKyNkZWZpbmUgR0xfVEVYVFVSRV9FTlZfTU9ERSAgICAgICAgICAgICAgIDB4MjIwMAorI2RlZmluZSBHTF9URVhUVVJFX0VOVl9DT0xPUiAgICAgICAgICAgICAgMHgyMjAxCisKKy8qIFRleHR1cmVFbnZUYXJnZXQgKi8KKyNkZWZpbmUgR0xfVEVYVFVSRV9FTlYgICAgICAgICAgICAgICAgICAgIDB4MjMwMAorCisvKiBUZXh0dXJlTWFnRmlsdGVyICovCisjZGVmaW5lIEdMX05FQVJFU1QgICAgICAgICAgICAgICAgICAgICAgICAweDI2MDAKKyNkZWZpbmUgR0xfTElORUFSICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjYwMQorCisvKiBUZXh0dXJlTWluRmlsdGVyICovCisvKiAgICAgIEdMX05FQVJFU1QgKi8KKy8qICAgICAgR0xfTElORUFSICovCisjZGVmaW5lIEdMX05FQVJFU1RfTUlQTUFQX05FQVJFU1QgICAgICAgICAweDI3MDAKKyNkZWZpbmUgR0xfTElORUFSX01JUE1BUF9ORUFSRVNUICAgICAgICAgIDB4MjcwMQorI2RlZmluZSBHTF9ORUFSRVNUX01JUE1BUF9MSU5FQVIgICAgICAgICAgMHgyNzAyCisjZGVmaW5lIEdMX0xJTkVBUl9NSVBNQVBfTElORUFSICAgICAgICAgICAweDI3MDMKKworLyogVGV4dHVyZVBhcmFtZXRlck5hbWUgKi8KKyNkZWZpbmUgR0xfVEVYVFVSRV9NQUdfRklMVEVSICAgICAgICAgICAgIDB4MjgwMAorI2RlZmluZSBHTF9URVhUVVJFX01JTl9GSUxURVIgICAgICAgICAgICAgMHgyODAxCisjZGVmaW5lIEdMX1RFWFRVUkVfV1JBUF9TICAgICAgICAgICAgICAgICAweDI4MDIKKyNkZWZpbmUgR0xfVEVYVFVSRV9XUkFQX1QgICAgICAgICAgICAgICAgIDB4MjgwMworCisvKiBUZXh0dXJlVGFyZ2V0ICovCisvKiAgICAgIEdMX1RFWFRVUkVfMkQgKi8KKworLyogVGV4dHVyZVVuaXQgKi8KKyNkZWZpbmUgR0xfVEVYVFVSRTAgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDMAorI2RlZmluZSBHTF9URVhUVVJFMSAgICAgICAgICAgICAgICAgICAgICAgMHg4NEMxCisjZGVmaW5lIEdMX1RFWFRVUkUyICAgICAgICAgICAgICAgICAgICAgICAweDg0QzIKKyNkZWZpbmUgR0xfVEVYVFVSRTMgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDMworI2RlZmluZSBHTF9URVhUVVJFNCAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM0CisjZGVmaW5lIEdMX1RFWFRVUkU1ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzUKKyNkZWZpbmUgR0xfVEVYVFVSRTYgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDNgorI2RlZmluZSBHTF9URVhUVVJFNyAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM3CisjZGVmaW5lIEdMX1RFWFRVUkU4ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzgKKyNkZWZpbmUgR0xfVEVYVFVSRTkgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDOQorI2RlZmluZSBHTF9URVhUVVJFMTAgICAgICAgICAgICAgICAgICAgICAgMHg4NENBCisjZGVmaW5lIEdMX1RFWFRVUkUxMSAgICAgICAgICAgICAgICAgICAgICAweDg0Q0IKKyNkZWZpbmUgR0xfVEVYVFVSRTEyICAgICAgICAgICAgICAgICAgICAgIDB4ODRDQworI2RlZmluZSBHTF9URVhUVVJFMTMgICAgICAgICAgICAgICAgICAgICAgMHg4NENECisjZGVmaW5lIEdMX1RFWFRVUkUxNCAgICAgICAgICAgICAgICAgICAgICAweDg0Q0UKKyNkZWZpbmUgR0xfVEVYVFVSRTE1ICAgICAgICAgICAgICAgICAgICAgIDB4ODRDRgorI2RlZmluZSBHTF9URVhUVVJFMTYgICAgICAgICAgICAgICAgICAgICAgMHg4NEQwCisjZGVmaW5lIEdMX1RFWFRVUkUxNyAgICAgICAgICAgICAgICAgICAgICAweDg0RDEKKyNkZWZpbmUgR0xfVEVYVFVSRTE4ICAgICAgICAgICAgICAgICAgICAgIDB4ODREMgorI2RlZmluZSBHTF9URVhUVVJFMTkgICAgICAgICAgICAgICAgICAgICAgMHg4NEQzCisjZGVmaW5lIEdMX1RFWFRVUkUyMCAgICAgICAgICAgICAgICAgICAgICAweDg0RDQKKyNkZWZpbmUgR0xfVEVYVFVSRTIxICAgICAgICAgICAgICAgICAgICAgIDB4ODRENQorI2RlZmluZSBHTF9URVhUVVJFMjIgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ2CisjZGVmaW5lIEdMX1RFWFRVUkUyMyAgICAgICAgICAgICAgICAgICAgICAweDg0RDcKKyNkZWZpbmUgR0xfVEVYVFVSRTI0ICAgICAgICAgICAgICAgICAgICAgIDB4ODREOAorI2RlZmluZSBHTF9URVhUVVJFMjUgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ5CisjZGVmaW5lIEdMX1RFWFRVUkUyNiAgICAgICAgICAgICAgICAgICAgICAweDg0REEKKyNkZWZpbmUgR0xfVEVYVFVSRTI3ICAgICAgICAgICAgICAgICAgICAgIDB4ODREQgorI2RlZmluZSBHTF9URVhUVVJFMjggICAgICAgICAgICAgICAgICAgICAgMHg4NERDCisjZGVmaW5lIEdMX1RFWFRVUkUyOSAgICAgICAgICAgICAgICAgICAgICAweDg0REQKKyNkZWZpbmUgR0xfVEVYVFVSRTMwICAgICAgICAgICAgICAgICAgICAgIDB4ODRERQorI2RlZmluZSBHTF9URVhUVVJFMzEgICAgICAgICAgICAgICAgICAgICAgMHg4NERGCisKKy8qIFRleHR1cmVXcmFwTW9kZSAqLworI2RlZmluZSBHTF9SRVBFQVQgICAgICAgICAgICAgICAgICAgICAgICAgMHgyOTAxCisjZGVmaW5lIEdMX0NMQU1QX1RPX0VER0UgICAgICAgICAgICAgICAgICAweDgxMkYKKworLyogUGl4ZWxJbnRlcm5hbEZvcm1hdCAqLworI2RlZmluZSBHTF9QQUxFVFRFNF9SR0I4X09FUyAgICAgICAgICAgICAgMHg4QjkwCisjZGVmaW5lIEdMX1BBTEVUVEU0X1JHQkE4X09FUyAgICAgICAgICAgICAweDhCOTEKKyNkZWZpbmUgR0xfUEFMRVRURTRfUjVfRzZfQjVfT0VTICAgICAgICAgIDB4OEI5MgorI2RlZmluZSBHTF9QQUxFVFRFNF9SR0JBNF9PRVMgICAgICAgICAgICAgMHg4QjkzCisjZGVmaW5lIEdMX1BBTEVUVEU0X1JHQjVfQTFfT0VTICAgICAgICAgICAweDhCOTQKKyNkZWZpbmUgR0xfUEFMRVRURThfUkdCOF9PRVMgICAgICAgICAgICAgIDB4OEI5NQorI2RlZmluZSBHTF9QQUxFVFRFOF9SR0JBOF9PRVMgICAgICAgICAgICAgMHg4Qjk2CisjZGVmaW5lIEdMX1BBTEVUVEU4X1I1X0c2X0I1X09FUyAgICAgICAgICAweDhCOTcKKyNkZWZpbmUgR0xfUEFMRVRURThfUkdCQTRfT0VTICAgICAgICAgICAgIDB4OEI5OAorI2RlZmluZSBHTF9QQUxFVFRFOF9SR0I1X0ExX09FUyAgICAgICAgICAgMHg4Qjk5CisKKy8qIFZlcnRleFBvaW50ZXJUeXBlICovCisvKiAgICAgIEdMX1NIT1JUICovCisvKiAgICAgIEdMX0ZMT0FUICovCisvKiAgICAgIEdMX0ZJWEVEICovCisvKiAgICAgIEdMX0JZVEUgKi8KKworLyogTGlnaHROYW1lICovCisjZGVmaW5lIEdMX0xJR0hUMCAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgR0xfTElHSFQxICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMQorI2RlZmluZSBHTF9MSUdIVDIgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAyCisjZGVmaW5lIEdMX0xJR0hUMyAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDMKKyNkZWZpbmUgR0xfTElHSFQ0ICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwNAorI2RlZmluZSBHTF9MSUdIVDUgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDA1CisjZGVmaW5lIEdMX0xJR0hUNiAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDYKKyNkZWZpbmUgR0xfTElHSFQ3ICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwNworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQWN0aXZlVGV4dHVyZSAoR0xlbnVtIHRleHR1cmUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEFscGhhRnVuYyAoR0xlbnVtIGZ1bmMsIEdMY2xhbXBmIHJlZik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQWxwaGFGdW5jeCAoR0xlbnVtIGZ1bmMsIEdMY2xhbXB4IHJlZik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmluZFRleHR1cmUgKEdMZW51bSB0YXJnZXQsIEdMdWludCB0ZXh0dXJlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCbGVuZEZ1bmMgKEdMZW51bSBzZmFjdG9yLCBHTGVudW0gZGZhY3Rvcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ2xlYXIgKEdMYml0ZmllbGQgbWFzayk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ2xlYXJDb2xvciAoR0xjbGFtcGYgcmVkLCBHTGNsYW1wZiBncmVlbiwgR0xjbGFtcGYgYmx1ZSwgR0xjbGFtcGYgYWxwaGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENsZWFyQ29sb3J4IChHTGNsYW1weCByZWQsIEdMY2xhbXB4IGdyZWVuLCBHTGNsYW1weCBibHVlLCBHTGNsYW1weCBhbHBoYSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ2xlYXJEZXB0aGYgKEdMY2xhbXBmIGRlcHRoKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDbGVhckRlcHRoeCAoR0xjbGFtcHggZGVwdGgpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENsZWFyU3RlbmNpbCAoR0xpbnQgcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ2xpZW50QWN0aXZlVGV4dHVyZSAoR0xlbnVtIHRleHR1cmUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yNGYgKEdMZmxvYXQgcmVkLCBHTGZsb2F0IGdyZWVuLCBHTGZsb2F0IGJsdWUsIEdMZmxvYXQgYWxwaGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yNHggKEdMZml4ZWQgcmVkLCBHTGZpeGVkIGdyZWVuLCBHTGZpeGVkIGJsdWUsIEdMZml4ZWQgYWxwaGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yTWFzayAoR0xib29sZWFuIHJlZCwgR0xib29sZWFuIGdyZWVuLCBHTGJvb2xlYW4gYmx1ZSwgR0xib29sZWFuIGFscGhhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvclBvaW50ZXIgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21wcmVzc2VkVGV4SW1hZ2UyRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tcHJlc3NlZFRleFN1YkltYWdlMkQgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29weVRleEltYWdlMkQgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvcHlUZXhTdWJJbWFnZTJEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEN1bGxGYWNlIChHTGVudW0gbW9kZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVsZXRlVGV4dHVyZXMgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICp0ZXh0dXJlcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVwdGhGdW5jIChHTGVudW0gZnVuYyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVwdGhNYXNrIChHTGJvb2xlYW4gZmxhZyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVwdGhSYW5nZWYgKEdMY2xhbXBmIHpOZWFyLCBHTGNsYW1wZiB6RmFyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZXB0aFJhbmdleCAoR0xjbGFtcHggek5lYXIsIEdMY2xhbXB4IHpGYXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERpc2FibGUgKEdMZW51bSBjYXApOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERpc2FibGVDbGllbnRTdGF0ZSAoR0xlbnVtIGFycmF5KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEcmF3QXJyYXlzIChHTGVudW0gbW9kZSwgR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERyYXdFbGVtZW50cyAoR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmluZGljZXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEVuYWJsZSAoR0xlbnVtIGNhcCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRW5hYmxlQ2xpZW50U3RhdGUgKEdMZW51bSBhcnJheSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRmluaXNoICh2b2lkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGbHVzaCAodm9pZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRm9nZiAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGb2dmdiAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZvZ3ggKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRm9neHYgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcm9udEZhY2UgKEdMZW51bSBtb2RlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcnVzdHVtZiAoR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJ1c3R1bXggKEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLCBHTGZpeGVkIHpOZWFyLCBHTGZpeGVkIHpGYXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdlblRleHR1cmVzIChHTHNpemVpIG4sIEdMdWludCAqdGV4dHVyZXMpOworR0xBUEkgR0xlbnVtIEFQSUVOVFJZIGdsR2V0RXJyb3IgKHZvaWQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEludGVnZXJ2IChHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgY29uc3QgR0x1Ynl0ZSAqIEFQSUVOVFJZIGdsR2V0U3RyaW5nIChHTGVudW0gbmFtZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsSGludCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIG1vZGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExpZ2h0TW9kZWxmIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExpZ2h0TW9kZWxmdiAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExpZ2h0TW9kZWx4IChHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExpZ2h0TW9kZWx4diAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExpZ2h0ZiAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExpZ2h0ZnYgKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExpZ2h0eCAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExpZ2h0eHYgKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExpbmVXaWR0aCAoR0xmbG9hdCB3aWR0aCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTGluZVdpZHRoeCAoR0xmaXhlZCB3aWR0aCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTG9hZElkZW50aXR5ICh2b2lkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMb2FkTWF0cml4ZiAoY29uc3QgR0xmbG9hdCAqbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTG9hZE1hdHJpeHggKGNvbnN0IEdMZml4ZWQgKm0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExvZ2ljT3AgKEdMZW51bSBvcGNvZGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1hdGVyaWFsZiAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWF0ZXJpYWxmdiAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNYXRlcmlhbHggKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1hdGVyaWFseHYgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWF0cml4TW9kZSAoR0xlbnVtIG1vZGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRNYXRyaXhmIChjb25zdCBHTGZsb2F0ICptKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0TWF0cml4eCAoY29uc3QgR0xmaXhlZCAqbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDRmIChHTGVudW0gdGFyZ2V0LCBHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0xmbG9hdCByLCBHTGZsb2F0IHEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0eCAoR0xlbnVtIHRhcmdldCwgR0xmaXhlZCBzLCBHTGZpeGVkIHQsIEdMZml4ZWQgciwgR0xmaXhlZCBxKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOb3JtYWwzZiAoR0xmbG9hdCBueCwgR0xmbG9hdCBueSwgR0xmbG9hdCBueik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsM3ggKEdMZml4ZWQgbngsIEdMZml4ZWQgbnksIEdMZml4ZWQgbnopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE5vcm1hbFBvaW50ZXIgKEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xPcnRob2YgKEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLCBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE9ydGhveCAoR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LCBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUGl4ZWxTdG9yZWkgKEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBvaW50U2l6ZSAoR0xmbG9hdCBzaXplKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQb2ludFNpemV4IChHTGZpeGVkIHNpemUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBvbHlnb25PZmZzZXQgKEdMZmxvYXQgZmFjdG9yLCBHTGZsb2F0IHVuaXRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQb2x5Z29uT2Zmc2V0eCAoR0xmaXhlZCBmYWN0b3IsIEdMZml4ZWQgdW5pdHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBvcE1hdHJpeCAodm9pZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHVzaE1hdHJpeCAodm9pZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUmVhZFBpeGVscyAoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKnBpeGVscyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUm90YXRlZiAoR0xmbG9hdCBhbmdsZSwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUm90YXRleCAoR0xmaXhlZCBhbmdsZSwgR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2FtcGxlQ292ZXJhZ2UgKEdMY2xhbXBmIHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTYW1wbGVDb3ZlcmFnZXggKEdMY2xhbXB4IHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTY2FsZWYgKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNjYWxleCAoR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Npc3NvciAoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNoYWRlTW9kZWwgKEdMZW51bSBtb2RlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTdGVuY2lsRnVuYyAoR0xlbnVtIGZ1bmMsIEdMaW50IHJlZiwgR0x1aW50IG1hc2spOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFN0ZW5jaWxNYXNrIChHTHVpbnQgbWFzayk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU3RlbmNpbE9wIChHTGVudW0gZmFpbCwgR0xlbnVtIHpmYWlsLCBHTGVudW0genBhc3MpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleENvb3JkUG9pbnRlciAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleEVudmYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4RW52ZnYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhFbnZ4IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleEVudnh2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4SW1hZ2UyRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleFBhcmFtZXRlcmYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4UGFyYW1ldGVyeCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhTdWJJbWFnZTJEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVHJhbnNsYXRlZiAoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVHJhbnNsYXRleCAoR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4UG9pbnRlciAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZpZXdwb3J0IChHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX2dsX2hfICovCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9saWNlbnNlLUJTRC50eHQgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9saWNlbnNlLUJTRC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkyNGUzYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2xpY2Vuc2UtQlNELnR4dApAQCAtMCwwICsxLDM0IEBACitUaGlzIGlzIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3IgdGhlICJTYW4gQW5nZWxlcyBPYnNlcnZhdGlvbiINCitPcGVuR0wgRVMgdmVyc2lvbiBleGFtcGxlIHNvdXJjZSBjb2RlDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorU2FuIEFuZ2VsZXMgT2JzZXJ2YXRpb24gT3BlbkdMIEVTIHZlcnNpb24gZXhhbXBsZQ0KK0NvcHlyaWdodCAoYykgMjAwNC0yMDA1LCBKZXRybyBMYXVoYQ0KK0FsbCByaWdodHMgcmVzZXJ2ZWQuDQorDQorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zDQorYXJlIG1ldDoNCisNCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKyAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodA0KKyAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbg0KKyAgICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCisgICAgICBkaXN0cmlidXRpb24uDQorICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgc29mdHdhcmUgcHJvZHVjdCdzIGNvcHlyaWdodCBvd25lciBub3INCisgICAgICB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUNCisgICAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4NCisgICAgICBwZXJtaXNzaW9uLg0KKw0KK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KK0xJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KK0EgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEDQorVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUg0KK1BST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YNCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORw0KK05FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUw0KK1NPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL2xpY2Vuc2UtTEdQTC50eHQgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9saWNlbnNlLUxHUEwudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZTNmNWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9saWNlbnNlLUxHUEwudHh0CkBAIC0wLDAgKzEsNTA0IEBACisJCSAgR05VIExFU1NFUiBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisJCSAgICAgICBWZXJzaW9uIDIuMSwgRmVicnVhcnkgMTk5OQorCisgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgICA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCisgb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCisKK1tUaGlzIGlzIHRoZSBmaXJzdCByZWxlYXNlZCB2ZXJzaW9uIG9mIHRoZSBMZXNzZXIgR1BMLiAgSXQgYWxzbyBjb3VudHMKKyBhcyB0aGUgc3VjY2Vzc29yIG9mIHRoZSBHTlUgTGlicmFyeSBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBoZW5jZQorIHRoZSB2ZXJzaW9uIG51bWJlciAyLjEuXQorCisJCQkgICAgUHJlYW1ibGUKKworICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCitmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZXMgYXJlIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZQorZnJlZSBzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLgorCisgIFRoaXMgbGljZW5zZSwgdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhcHBsaWVzIHRvIHNvbWUKK3NwZWNpYWxseSBkZXNpZ25hdGVkIHNvZnR3YXJlIHBhY2thZ2VzLS10eXBpY2FsbHkgbGlicmFyaWVzLS1vZiB0aGUKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgb3RoZXIgYXV0aG9ycyB3aG8gZGVjaWRlIHRvIHVzZSBpdC4gIFlvdQorY2FuIHVzZSBpdCB0b28sIGJ1dCB3ZSBzdWdnZXN0IHlvdSBmaXJzdCB0aGluayBjYXJlZnVsbHkgYWJvdXQgd2hldGhlcgordGhpcyBsaWNlbnNlIG9yIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIHRoZSBiZXR0ZXIKK3N0cmF0ZWd5IHRvIHVzZSBpbiBhbnkgcGFydGljdWxhciBjYXNlLCBiYXNlZCBvbiB0aGUgZXhwbGFuYXRpb25zIGJlbG93LgorCisgIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tIG9mIHVzZSwKK25vdCBwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQKK3lvdSBoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UKK2ZvciB0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpOyB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQKK2l0IGlmIHlvdSB3YW50IGl0OyB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBhbmQgdXNlIHBpZWNlcyBvZgoraXQgaW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBhcmUgaW5mb3JtZWQgdGhhdCB5b3UgY2FuIGRvCit0aGVzZSB0aGluZ3MuCisKKyAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAorZGlzdHJpYnV0b3JzIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGVzZQorcmlnaHRzLiAgVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yCit5b3UgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBsaWJyYXJ5IG9yIGlmIHlvdSBtb2RpZnkgaXQuCisKKyAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSwgd2hldGhlciBncmF0aXMKK29yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0IHdlIGdhdmUKK3lvdS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZSBzb3VyY2UKK2NvZGUuICBJZiB5b3UgbGluayBvdGhlciBjb2RlIHdpdGggdGhlIGxpYnJhcnksIHlvdSBtdXN0IHByb3ZpZGUKK2NvbXBsZXRlIG9iamVjdCBmaWxlcyB0byB0aGUgcmVjaXBpZW50cywgc28gdGhhdCB0aGV5IGNhbiByZWxpbmsgdGhlbQord2l0aCB0aGUgbGlicmFyeSBhZnRlciBtYWtpbmcgY2hhbmdlcyB0byB0aGUgbGlicmFyeSBhbmQgcmVjb21waWxpbmcKK2l0LiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIgcmlnaHRzLgorCisgIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCBhIHR3by1zdGVwIG1ldGhvZDogKDEpIHdlIGNvcHlyaWdodCB0aGUKK2xpYnJhcnksIGFuZCAoMikgd2Ugb2ZmZXIgeW91IHRoaXMgbGljZW5zZSwgd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsCitwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgbGlicmFyeS4KKworICBUbyBwcm90ZWN0IGVhY2ggZGlzdHJpYnV0b3IsIHdlIHdhbnQgdG8gbWFrZSBpdCB2ZXJ5IGNsZWFyIHRoYXQKK3RoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGUgZnJlZSBsaWJyYXJ5LiAgQWxzbywgaWYgdGhlIGxpYnJhcnkgaXMKK21vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB0aGUgcmVjaXBpZW50cyBzaG91bGQga25vdwordGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsIHZlcnNpb24sIHNvIHRoYXQgdGhlIG9yaWdpbmFsCithdXRob3IncyByZXB1dGF0aW9uIHdpbGwgbm90IGJlIGFmZmVjdGVkIGJ5IHByb2JsZW1zIHRoYXQgbWlnaHQgYmUKK2ludHJvZHVjZWQgYnkgb3RoZXJzLgorDAorICBGaW5hbGx5LCBzb2Z0d2FyZSBwYXRlbnRzIHBvc2UgYSBjb25zdGFudCB0aHJlYXQgdG8gdGhlIGV4aXN0ZW5jZSBvZgorYW55IGZyZWUgcHJvZ3JhbS4gIFdlIHdpc2ggdG8gbWFrZSBzdXJlIHRoYXQgYSBjb21wYW55IGNhbm5vdAorZWZmZWN0aXZlbHkgcmVzdHJpY3QgdGhlIHVzZXJzIG9mIGEgZnJlZSBwcm9ncmFtIGJ5IG9idGFpbmluZyBhCityZXN0cmljdGl2ZSBsaWNlbnNlIGZyb20gYSBwYXRlbnQgaG9sZGVyLiAgVGhlcmVmb3JlLCB3ZSBpbnNpc3QgdGhhdAorYW55IHBhdGVudCBsaWNlbnNlIG9idGFpbmVkIGZvciBhIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgbXVzdCBiZQorY29uc2lzdGVudCB3aXRoIHRoZSBmdWxsIGZyZWVkb20gb2YgdXNlIHNwZWNpZmllZCBpbiB0aGlzIGxpY2Vuc2UuCisKKyAgTW9zdCBHTlUgc29mdHdhcmUsIGluY2x1ZGluZyBzb21lIGxpYnJhcmllcywgaXMgY292ZXJlZCBieSB0aGUKK29yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhpcyBsaWNlbnNlLCB0aGUgR05VIExlc3NlcgorR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBjZXJ0YWluIGRlc2lnbmF0ZWQgbGlicmFyaWVzLCBhbmQKK2lzIHF1aXRlIGRpZmZlcmVudCBmcm9tIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgV2UgdXNlCit0aGlzIGxpY2Vuc2UgZm9yIGNlcnRhaW4gbGlicmFyaWVzIGluIG9yZGVyIHRvIHBlcm1pdCBsaW5raW5nIHRob3NlCitsaWJyYXJpZXMgaW50byBub24tZnJlZSBwcm9ncmFtcy4KKworICBXaGVuIGEgcHJvZ3JhbSBpcyBsaW5rZWQgd2l0aCBhIGxpYnJhcnksIHdoZXRoZXIgc3RhdGljYWxseSBvciB1c2luZworYSBzaGFyZWQgbGlicmFyeSwgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSB0d28gaXMgbGVnYWxseSBzcGVha2luZyBhCitjb21iaW5lZCB3b3JrLCBhIGRlcml2YXRpdmUgb2YgdGhlIG9yaWdpbmFsIGxpYnJhcnkuICBUaGUgb3JkaW5hcnkKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgdGhlcmVmb3JlIHBlcm1pdHMgc3VjaCBsaW5raW5nIG9ubHkgaWYgdGhlCitlbnRpcmUgY29tYmluYXRpb24gZml0cyBpdHMgY3JpdGVyaWEgb2YgZnJlZWRvbS4gIFRoZSBMZXNzZXIgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgcGVybWl0cyBtb3JlIGxheCBjcml0ZXJpYSBmb3IgbGlua2luZyBvdGhlciBjb2RlIHdpdGgKK3RoZSBsaWJyYXJ5LgorCisgIFdlIGNhbGwgdGhpcyBsaWNlbnNlIHRoZSAiTGVzc2VyIiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGJlY2F1c2UgaXQKK2RvZXMgTGVzcyB0byBwcm90ZWN0IHRoZSB1c2VyJ3MgZnJlZWRvbSB0aGFuIHRoZSBvcmRpbmFyeSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZS4gIEl0IGFsc28gcHJvdmlkZXMgb3RoZXIgZnJlZSBzb2Z0d2FyZSBkZXZlbG9wZXJzIExlc3MKK29mIGFuIGFkdmFudGFnZSBvdmVyIGNvbXBldGluZyBub24tZnJlZSBwcm9ncmFtcy4gIFRoZXNlIGRpc2FkdmFudGFnZXMKK2FyZSB0aGUgcmVhc29uIHdlIHVzZSB0aGUgb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbWFueQorbGlicmFyaWVzLiAgSG93ZXZlciwgdGhlIExlc3NlciBsaWNlbnNlIHByb3ZpZGVzIGFkdmFudGFnZXMgaW4gY2VydGFpbgorc3BlY2lhbCBjaXJjdW1zdGFuY2VzLgorCisgIEZvciBleGFtcGxlLCBvbiByYXJlIG9jY2FzaW9ucywgdGhlcmUgbWF5IGJlIGEgc3BlY2lhbCBuZWVkIHRvCitlbmNvdXJhZ2UgdGhlIHdpZGVzdCBwb3NzaWJsZSB1c2Ugb2YgYSBjZXJ0YWluIGxpYnJhcnksIHNvIHRoYXQgaXQgYmVjb21lcworYSBkZS1mYWN0byBzdGFuZGFyZC4gIFRvIGFjaGlldmUgdGhpcywgbm9uLWZyZWUgcHJvZ3JhbXMgbXVzdCBiZQorYWxsb3dlZCB0byB1c2UgdGhlIGxpYnJhcnkuICBBIG1vcmUgZnJlcXVlbnQgY2FzZSBpcyB0aGF0IGEgZnJlZQorbGlicmFyeSBkb2VzIHRoZSBzYW1lIGpvYiBhcyB3aWRlbHkgdXNlZCBub24tZnJlZSBsaWJyYXJpZXMuICBJbiB0aGlzCitjYXNlLCB0aGVyZSBpcyBsaXR0bGUgdG8gZ2FpbiBieSBsaW1pdGluZyB0aGUgZnJlZSBsaWJyYXJ5IHRvIGZyZWUKK3NvZnR3YXJlIG9ubHksIHNvIHdlIHVzZSB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisKKyAgSW4gb3RoZXIgY2FzZXMsIHBlcm1pc3Npb24gdG8gdXNlIGEgcGFydGljdWxhciBsaWJyYXJ5IGluIG5vbi1mcmVlCitwcm9ncmFtcyBlbmFibGVzIGEgZ3JlYXRlciBudW1iZXIgb2YgcGVvcGxlIHRvIHVzZSBhIGxhcmdlIGJvZHkgb2YKK2ZyZWUgc29mdHdhcmUuICBGb3IgZXhhbXBsZSwgcGVybWlzc2lvbiB0byB1c2UgdGhlIEdOVSBDIExpYnJhcnkgaW4KK25vbi1mcmVlIHByb2dyYW1zIGVuYWJsZXMgbWFueSBtb3JlIHBlb3BsZSB0byB1c2UgdGhlIHdob2xlIEdOVQorb3BlcmF0aW5nIHN5c3RlbSwgYXMgd2VsbCBhcyBpdHMgdmFyaWFudCwgdGhlIEdOVS9MaW51eCBvcGVyYXRpbmcKK3N5c3RlbS4KKworICBBbHRob3VnaCB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgTGVzcyBwcm90ZWN0aXZlIG9mIHRoZQordXNlcnMnIGZyZWVkb20sIGl0IGRvZXMgZW5zdXJlIHRoYXQgdGhlIHVzZXIgb2YgYSBwcm9ncmFtIHRoYXQgaXMKK2xpbmtlZCB3aXRoIHRoZSBMaWJyYXJ5IGhhcyB0aGUgZnJlZWRvbSBhbmQgdGhlIHdoZXJld2l0aGFsIHRvIHJ1bgordGhhdCBwcm9ncmFtIHVzaW5nIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgTGlicmFyeS4KKworICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4gIFBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhCisid29yayBiYXNlZCBvbiB0aGUgbGlicmFyeSIgYW5kIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBsaWJyYXJ5Ii4gIFRoZQorZm9ybWVyIGNvbnRhaW5zIGNvZGUgZGVyaXZlZCBmcm9tIHRoZSBsaWJyYXJ5LCB3aGVyZWFzIHRoZSBsYXR0ZXIgbXVzdAorYmUgY29tYmluZWQgd2l0aCB0aGUgbGlicmFyeSBpbiBvcmRlciB0byBydW4uCisMCisJCSAgR05VIExFU1NFUiBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KKworICAwLiBUaGlzIExpY2Vuc2UgQWdyZWVtZW50IGFwcGxpZXMgdG8gYW55IHNvZnR3YXJlIGxpYnJhcnkgb3Igb3RoZXIKK3Byb2dyYW0gd2hpY2ggY29udGFpbnMgYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIG9yCitvdGhlciBhdXRob3JpemVkIHBhcnR5IHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mCit0aGlzIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChhbHNvIGNhbGxlZCAidGhpcyBMaWNlbnNlIikuCitFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KKworICBBICJsaWJyYXJ5IiBtZWFucyBhIGNvbGxlY3Rpb24gb2Ygc29mdHdhcmUgZnVuY3Rpb25zIGFuZC9vciBkYXRhCitwcmVwYXJlZCBzbyBhcyB0byBiZSBjb252ZW5pZW50bHkgbGlua2VkIHdpdGggYXBwbGljYXRpb24gcHJvZ3JhbXMKKyh3aGljaCB1c2Ugc29tZSBvZiB0aG9zZSBmdW5jdGlvbnMgYW5kIGRhdGEpIHRvIGZvcm0gZXhlY3V0YWJsZXMuCisKKyAgVGhlICJMaWJyYXJ5IiwgYmVsb3csIHJlZmVycyB0byBhbnkgc3VjaCBzb2Z0d2FyZSBsaWJyYXJ5IG9yIHdvcmsKK3doaWNoIGhhcyBiZWVuIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZXNlIHRlcm1zLiAgQSAid29yayBiYXNlZCBvbiB0aGUKK0xpYnJhcnkiIG1lYW5zIGVpdGhlciB0aGUgTGlicmFyeSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyCitjb3B5cmlnaHQgbGF3OiB0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIExpYnJhcnkgb3IgYQorcG9ydGlvbiBvZiBpdCwgZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZAorc3RyYWlnaHRmb3J3YXJkbHkgaW50byBhbm90aGVyIGxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcworaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluIHRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikKKworICAiU291cmNlIGNvZGUiIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgorbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYSBsaWJyYXJ5LCBjb21wbGV0ZSBzb3VyY2UgY29kZSBtZWFucworYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55IGFzc29jaWF0ZWQKK2ludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8gY29udHJvbCBjb21waWxhdGlvbgorYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgbGlicmFyeS4KKworICBBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAorY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgorcnVubmluZyBhIHByb2dyYW0gdXNpbmcgdGhlIExpYnJhcnkgaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCBvdXRwdXQgZnJvbQorc3VjaCBhIHByb2dyYW0gaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZAorb24gdGhlIExpYnJhcnkgKGluZGVwZW5kZW50IG9mIHRoZSB1c2Ugb2YgdGhlIExpYnJhcnkgaW4gYSB0b29sIGZvcgord3JpdGluZyBpdCkuICBXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIExpYnJhcnkgZG9lcworYW5kIHdoYXQgdGhlIHByb2dyYW0gdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IGRvZXMuCisgIAorICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBMaWJyYXJ5J3MKK2NvbXBsZXRlIHNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0Cit5b3UgY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbgorYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QKK2FsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55Cit3YXJyYW50eTsgYW5kIGRpc3RyaWJ1dGUgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZQorTGlicmFyeS4KKworICBZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LAorYW5kIHlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYQorZmVlLgorDAorICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBMaWJyYXJ5IG9yIGFueSBwb3J0aW9uCitvZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSwgYW5kIGNvcHkgYW5kCitkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKK2Fib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CisKKyAgICBhKSBUaGUgbW9kaWZpZWQgd29yayBtdXN0IGl0c2VsZiBiZSBhIHNvZnR3YXJlIGxpYnJhcnkuCisKKyAgICBiKSBZb3UgbXVzdCBjYXVzZSB0aGUgZmlsZXMgbW9kaWZpZWQgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgorCisgICAgYykgWW91IG11c3QgY2F1c2UgdGhlIHdob2xlIG9mIHRoZSB3b3JrIHRvIGJlIGxpY2Vuc2VkIGF0IG5vCisgICAgY2hhcmdlIHRvIGFsbCB0aGlyZCBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgICBkKSBJZiBhIGZhY2lsaXR5IGluIHRoZSBtb2RpZmllZCBMaWJyYXJ5IHJlZmVycyB0byBhIGZ1bmN0aW9uIG9yIGEKKyAgICB0YWJsZSBvZiBkYXRhIHRvIGJlIHN1cHBsaWVkIGJ5IGFuIGFwcGxpY2F0aW9uIHByb2dyYW0gdGhhdCB1c2VzCisgICAgdGhlIGZhY2lsaXR5LCBvdGhlciB0aGFuIGFzIGFuIGFyZ3VtZW50IHBhc3NlZCB3aGVuIHRoZSBmYWNpbGl0eQorICAgIGlzIGludm9rZWQsIHRoZW4geW91IG11c3QgbWFrZSBhIGdvb2QgZmFpdGggZWZmb3J0IHRvIGVuc3VyZSB0aGF0LAorICAgIGluIHRoZSBldmVudCBhbiBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgc3VjaCBmdW5jdGlvbiBvcgorICAgIHRhYmxlLCB0aGUgZmFjaWxpdHkgc3RpbGwgb3BlcmF0ZXMsIGFuZCBwZXJmb3JtcyB3aGF0ZXZlciBwYXJ0IG9mCisgICAgaXRzIHB1cnBvc2UgcmVtYWlucyBtZWFuaW5nZnVsLgorCisgICAgKEZvciBleGFtcGxlLCBhIGZ1bmN0aW9uIGluIGEgbGlicmFyeSB0byBjb21wdXRlIHNxdWFyZSByb290cyBoYXMKKyAgICBhIHB1cnBvc2UgdGhhdCBpcyBlbnRpcmVseSB3ZWxsLWRlZmluZWQgaW5kZXBlbmRlbnQgb2YgdGhlCisgICAgYXBwbGljYXRpb24uICBUaGVyZWZvcmUsIFN1YnNlY3Rpb24gMmQgcmVxdWlyZXMgdGhhdCBhbnkKKyAgICBhcHBsaWNhdGlvbi1zdXBwbGllZCBmdW5jdGlvbiBvciB0YWJsZSB1c2VkIGJ5IHRoaXMgZnVuY3Rpb24gbXVzdAorICAgIGJlIG9wdGlvbmFsOiBpZiB0aGUgYXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcGx5IGl0LCB0aGUgc3F1YXJlCisgICAgcm9vdCBmdW5jdGlvbiBtdXN0IHN0aWxsIGNvbXB1dGUgc3F1YXJlIHJvb3RzLikKKworVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgoraWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgTGlicmFyeSwKK2FuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgordGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQorc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91CitkaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKK29uIHRoZSBMaWJyYXJ5LCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgordGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKK2VudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZQoraXQuCisKK1RodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoreW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCitleGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKK2NvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIExpYnJhcnkuCisKK0luIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIExpYnJhcnkKK3dpdGggdGhlIExpYnJhcnkgKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5KSBvbiBhIHZvbHVtZSBvZgorYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKK3RoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMy4gWW91IG1heSBvcHQgdG8gYXBwbHkgdGhlIHRlcm1zIG9mIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UgdG8gYSBnaXZlbiBjb3B5IG9mIHRoZSBMaWJyYXJ5LiAgVG8gZG8KK3RoaXMsIHlvdSBtdXN0IGFsdGVyIGFsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSwgc28KK3RoYXQgdGhleSByZWZlciB0byB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwKK2luc3RlYWQgb2YgdG8gdGhpcyBMaWNlbnNlLiAgKElmIGEgbmV3ZXIgdmVyc2lvbiB0aGFuIHZlcnNpb24gMiBvZiB0aGUKK29yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGhhcyBhcHBlYXJlZCwgdGhlbiB5b3UgY2FuIHNwZWNpZnkKK3RoYXQgdmVyc2lvbiBpbnN0ZWFkIGlmIHlvdSB3aXNoLikgIERvIG5vdCBtYWtlIGFueSBvdGhlciBjaGFuZ2UgaW4KK3RoZXNlIG5vdGljZXMuCisMCisgIE9uY2UgdGhpcyBjaGFuZ2UgaXMgbWFkZSBpbiBhIGdpdmVuIGNvcHksIGl0IGlzIGlycmV2ZXJzaWJsZSBmb3IKK3RoYXQgY29weSwgc28gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gYWxsCitzdWJzZXF1ZW50IGNvcGllcyBhbmQgZGVyaXZhdGl2ZSB3b3JrcyBtYWRlIGZyb20gdGhhdCBjb3B5LgorCisgIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCB3aGVuIHlvdSB3aXNoIHRvIGNvcHkgcGFydCBvZiB0aGUgY29kZSBvZgordGhlIExpYnJhcnkgaW50byBhIHByb2dyYW0gdGhhdCBpcyBub3QgYSBsaWJyYXJ5LgorCisgIDQuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYSBwb3J0aW9uIG9yCitkZXJpdmF0aXZlIG9mIGl0LCB1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybQordW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWNjb21wYW55CitpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUsIHdoaWNoCittdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEKK21lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZS4KKworICBJZiBkaXN0cmlidXRpb24gb2Ygb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQorZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUKK3NvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2Ugc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudCB0bworZGlzdHJpYnV0ZSB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAorY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KKworICA1LiBBIHByb2dyYW0gdGhhdCBjb250YWlucyBubyBkZXJpdmF0aXZlIG9mIGFueSBwb3J0aW9uIG9mIHRoZQorTGlicmFyeSwgYnV0IGlzIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCB0aGUgTGlicmFyeSBieSBiZWluZyBjb21waWxlZCBvcgorbGlua2VkIHdpdGggaXQsIGlzIGNhbGxlZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIuICBTdWNoIGEKK3dvcmssIGluIGlzb2xhdGlvbiwgaXMgbm90IGEgZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5LCBhbmQKK3RoZXJlZm9yZSBmYWxscyBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgSG93ZXZlciwgbGlua2luZyBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeQorY3JlYXRlcyBhbiBleGVjdXRhYmxlIHRoYXQgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBMaWJyYXJ5IChiZWNhdXNlIGl0Citjb250YWlucyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSksIHJhdGhlciB0aGFuIGEgIndvcmsgdGhhdCB1c2VzIHRoZQorbGlicmFyeSIuICBUaGUgZXhlY3V0YWJsZSBpcyB0aGVyZWZvcmUgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UuCitTZWN0aW9uIDYgc3RhdGVzIHRlcm1zIGZvciBkaXN0cmlidXRpb24gb2Ygc3VjaCBleGVjdXRhYmxlcy4KKworICBXaGVuIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB1c2VzIG1hdGVyaWFsIGZyb20gYSBoZWFkZXIgZmlsZQordGhhdCBpcyBwYXJ0IG9mIHRoZSBMaWJyYXJ5LCB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIG1heSBiZSBhCitkZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnkgZXZlbiB0aG91Z2ggdGhlIHNvdXJjZSBjb2RlIGlzIG5vdC4KK1doZXRoZXIgdGhpcyBpcyB0cnVlIGlzIGVzcGVjaWFsbHkgc2lnbmlmaWNhbnQgaWYgdGhlIHdvcmsgY2FuIGJlCitsaW5rZWQgd2l0aG91dCB0aGUgTGlicmFyeSwgb3IgaWYgdGhlIHdvcmsgaXMgaXRzZWxmIGEgbGlicmFyeS4gIFRoZQordGhyZXNob2xkIGZvciB0aGlzIHRvIGJlIHRydWUgaXMgbm90IHByZWNpc2VseSBkZWZpbmVkIGJ5IGxhdy4KKworICBJZiBzdWNoIGFuIG9iamVjdCBmaWxlIHVzZXMgb25seSBudW1lcmljYWwgcGFyYW1ldGVycywgZGF0YQorc3RydWN0dXJlIGxheW91dHMgYW5kIGFjY2Vzc29ycywgYW5kIHNtYWxsIG1hY3JvcyBhbmQgc21hbGwgaW5saW5lCitmdW5jdGlvbnMgKHRlbiBsaW5lcyBvciBsZXNzIGluIGxlbmd0aCksIHRoZW4gdGhlIHVzZSBvZiB0aGUgb2JqZWN0CitmaWxlIGlzIHVucmVzdHJpY3RlZCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGlzIGxlZ2FsbHkgYSBkZXJpdmF0aXZlCit3b3JrLiAgKEV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhpcyBvYmplY3QgY29kZSBwbHVzIHBvcnRpb25zIG9mIHRoZQorTGlicmFyeSB3aWxsIHN0aWxsIGZhbGwgdW5kZXIgU2VjdGlvbiA2LikKKworICBPdGhlcndpc2UsIGlmIHRoZSB3b3JrIGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSwgeW91IG1heQorZGlzdHJpYnV0ZSB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDYuCitBbnkgZXhlY3V0YWJsZXMgY29udGFpbmluZyB0aGF0IHdvcmsgYWxzbyBmYWxsIHVuZGVyIFNlY3Rpb24gNiwKK3doZXRoZXIgb3Igbm90IHRoZXkgYXJlIGxpbmtlZCBkaXJlY3RseSB3aXRoIHRoZSBMaWJyYXJ5IGl0c2VsZi4KKwwKKyAgNi4gQXMgYW4gZXhjZXB0aW9uIHRvIHRoZSBTZWN0aW9ucyBhYm92ZSwgeW91IG1heSBhbHNvIGNvbWJpbmUgb3IKK2xpbmsgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHdpdGggdGhlIExpYnJhcnkgdG8gcHJvZHVjZSBhCit3b3JrIGNvbnRhaW5pbmcgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnksIGFuZCBkaXN0cmlidXRlIHRoYXQgd29yawordW5kZXIgdGVybXMgb2YgeW91ciBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgdGhlIHRlcm1zIHBlcm1pdAorbW9kaWZpY2F0aW9uIG9mIHRoZSB3b3JrIGZvciB0aGUgY3VzdG9tZXIncyBvd24gdXNlIGFuZCByZXZlcnNlCitlbmdpbmVlcmluZyBmb3IgZGVidWdnaW5nIHN1Y2ggbW9kaWZpY2F0aW9ucy4KKworICBZb3UgbXVzdCBnaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCBlYWNoIGNvcHkgb2YgdGhlIHdvcmsgdGhhdCB0aGUKK0xpYnJhcnkgaXMgdXNlZCBpbiBpdCBhbmQgdGhhdCB0aGUgTGlicmFyeSBhbmQgaXRzIHVzZSBhcmUgY292ZXJlZCBieQordGhpcyBMaWNlbnNlLiAgWW91IG11c3Qgc3VwcGx5IGEgY29weSBvZiB0aGlzIExpY2Vuc2UuICBJZiB0aGUgd29yaworZHVyaW5nIGV4ZWN1dGlvbiBkaXNwbGF5cyBjb3B5cmlnaHQgbm90aWNlcywgeW91IG11c3QgaW5jbHVkZSB0aGUKK2NvcHlyaWdodCBub3RpY2UgZm9yIHRoZSBMaWJyYXJ5IGFtb25nIHRoZW0sIGFzIHdlbGwgYXMgYSByZWZlcmVuY2UKK2RpcmVjdGluZyB0aGUgdXNlciB0byB0aGUgY29weSBvZiB0aGlzIExpY2Vuc2UuICBBbHNvLCB5b3UgbXVzdCBkbyBvbmUKK29mIHRoZXNlIHRoaW5nczoKKworICAgIGEpIEFjY29tcGFueSB0aGUgd29yayB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nCisgICAgbWFjaGluZS1yZWFkYWJsZSBzb3VyY2UgY29kZSBmb3IgdGhlIExpYnJhcnkgaW5jbHVkaW5nIHdoYXRldmVyCisgICAgY2hhbmdlcyB3ZXJlIHVzZWQgaW4gdGhlIHdvcmsgKHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIKKyAgICBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlKTsgYW5kLCBpZiB0aGUgd29yayBpcyBhbiBleGVjdXRhYmxlIGxpbmtlZAorICAgIHdpdGggdGhlIExpYnJhcnksIHdpdGggdGhlIGNvbXBsZXRlIG1hY2hpbmUtcmVhZGFibGUgIndvcmsgdGhhdAorICAgIHVzZXMgdGhlIExpYnJhcnkiLCBhcyBvYmplY3QgY29kZSBhbmQvb3Igc291cmNlIGNvZGUsIHNvIHRoYXQgdGhlCisgICAgdXNlciBjYW4gbW9kaWZ5IHRoZSBMaWJyYXJ5IGFuZCB0aGVuIHJlbGluayB0byBwcm9kdWNlIGEgbW9kaWZpZWQKKyAgICBleGVjdXRhYmxlIGNvbnRhaW5pbmcgdGhlIG1vZGlmaWVkIExpYnJhcnkuICAoSXQgaXMgdW5kZXJzdG9vZAorICAgIHRoYXQgdGhlIHVzZXIgd2hvIGNoYW5nZXMgdGhlIGNvbnRlbnRzIG9mIGRlZmluaXRpb25zIGZpbGVzIGluIHRoZQorICAgIExpYnJhcnkgd2lsbCBub3QgbmVjZXNzYXJpbHkgYmUgYWJsZSB0byByZWNvbXBpbGUgdGhlIGFwcGxpY2F0aW9uCisgICAgdG8gdXNlIHRoZSBtb2RpZmllZCBkZWZpbml0aW9ucy4pCisKKyAgICBiKSBVc2UgYSBzdWl0YWJsZSBzaGFyZWQgbGlicmFyeSBtZWNoYW5pc20gZm9yIGxpbmtpbmcgd2l0aCB0aGUKKyAgICBMaWJyYXJ5LiAgQSBzdWl0YWJsZSBtZWNoYW5pc20gaXMgb25lIHRoYXQgKDEpIHVzZXMgYXQgcnVuIHRpbWUgYQorICAgIGNvcHkgb2YgdGhlIGxpYnJhcnkgYWxyZWFkeSBwcmVzZW50IG9uIHRoZSB1c2VyJ3MgY29tcHV0ZXIgc3lzdGVtLAorICAgIHJhdGhlciB0aGFuIGNvcHlpbmcgbGlicmFyeSBmdW5jdGlvbnMgaW50byB0aGUgZXhlY3V0YWJsZSwgYW5kICgyKQorICAgIHdpbGwgb3BlcmF0ZSBwcm9wZXJseSB3aXRoIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgaWYKKyAgICB0aGUgdXNlciBpbnN0YWxscyBvbmUsIGFzIGxvbmcgYXMgdGhlIG1vZGlmaWVkIHZlcnNpb24gaXMKKyAgICBpbnRlcmZhY2UtY29tcGF0aWJsZSB3aXRoIHRoZSB2ZXJzaW9uIHRoYXQgdGhlIHdvcmsgd2FzIG1hZGUgd2l0aC4KKworICAgIGMpIEFjY29tcGFueSB0aGUgd29yayB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0CisgICAgbGVhc3QgdGhyZWUgeWVhcnMsIHRvIGdpdmUgdGhlIHNhbWUgdXNlciB0aGUgbWF0ZXJpYWxzCisgICAgc3BlY2lmaWVkIGluIFN1YnNlY3Rpb24gNmEsIGFib3ZlLCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZQorICAgIHRoYW4gdGhlIGNvc3Qgb2YgcGVyZm9ybWluZyB0aGlzIGRpc3RyaWJ1dGlvbi4KKworICAgIGQpIElmIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd29yayBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcyB0byBjb3B5CisgICAgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIG9mZmVyIGVxdWl2YWxlbnQgYWNjZXNzIHRvIGNvcHkgdGhlIGFib3ZlCisgICAgc3BlY2lmaWVkIG1hdGVyaWFscyBmcm9tIHRoZSBzYW1lIHBsYWNlLgorCisgICAgZSkgVmVyaWZ5IHRoYXQgdGhlIHVzZXIgaGFzIGFscmVhZHkgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZXNlCisgICAgbWF0ZXJpYWxzIG9yIHRoYXQgeW91IGhhdmUgYWxyZWFkeSBzZW50IHRoaXMgdXNlciBhIGNvcHkuCisKKyAgRm9yIGFuIGV4ZWN1dGFibGUsIHRoZSByZXF1aXJlZCBmb3JtIG9mIHRoZSAid29yayB0aGF0IHVzZXMgdGhlCitMaWJyYXJ5IiBtdXN0IGluY2x1ZGUgYW55IGRhdGEgYW5kIHV0aWxpdHkgcHJvZ3JhbXMgbmVlZGVkIGZvcgorcmVwcm9kdWNpbmcgdGhlIGV4ZWN1dGFibGUgZnJvbSBpdC4gIEhvd2V2ZXIsIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sCit0aGUgbWF0ZXJpYWxzIHRvIGJlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUgYW55dGhpbmcgdGhhdCBpcworbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5IGZvcm0pIHdpdGggdGhlIG1ham9yCitjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIG9uCit3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQgaXRzZWxmIGFjY29tcGFuaWVzCit0aGUgZXhlY3V0YWJsZS4KKworICBJdCBtYXkgaGFwcGVuIHRoYXQgdGhpcyByZXF1aXJlbWVudCBjb250cmFkaWN0cyB0aGUgbGljZW5zZQorcmVzdHJpY3Rpb25zIG9mIG90aGVyIHByb3ByaWV0YXJ5IGxpYnJhcmllcyB0aGF0IGRvIG5vdCBub3JtYWxseQorYWNjb21wYW55IHRoZSBvcGVyYXRpbmcgc3lzdGVtLiAgU3VjaCBhIGNvbnRyYWRpY3Rpb24gbWVhbnMgeW91IGNhbm5vdAordXNlIGJvdGggdGhlbSBhbmQgdGhlIExpYnJhcnkgdG9nZXRoZXIgaW4gYW4gZXhlY3V0YWJsZSB0aGF0IHlvdQorZGlzdHJpYnV0ZS4KKwwKKyAgNy4gWW91IG1heSBwbGFjZSBsaWJyYXJ5IGZhY2lsaXRpZXMgdGhhdCBhcmUgYSB3b3JrIGJhc2VkIG9uIHRoZQorTGlicmFyeSBzaWRlLWJ5LXNpZGUgaW4gYSBzaW5nbGUgbGlicmFyeSB0b2dldGhlciB3aXRoIG90aGVyIGxpYnJhcnkKK2ZhY2lsaXRpZXMgbm90IGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSBzdWNoIGEgY29tYmluZWQKK2xpYnJhcnksIHByb3ZpZGVkIHRoYXQgdGhlIHNlcGFyYXRlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd29yayBiYXNlZCBvbgordGhlIExpYnJhcnkgYW5kIG9mIHRoZSBvdGhlciBsaWJyYXJ5IGZhY2lsaXRpZXMgaXMgb3RoZXJ3aXNlCitwZXJtaXR0ZWQsIGFuZCBwcm92aWRlZCB0aGF0IHlvdSBkbyB0aGVzZSB0d28gdGhpbmdzOgorCisgICAgYSkgQWNjb21wYW55IHRoZSBjb21iaW5lZCBsaWJyYXJ5IHdpdGggYSBjb3B5IG9mIHRoZSBzYW1lIHdvcmsKKyAgICBiYXNlZCBvbiB0aGUgTGlicmFyeSwgdW5jb21iaW5lZCB3aXRoIGFueSBvdGhlciBsaWJyYXJ5CisgICAgZmFjaWxpdGllcy4gIFRoaXMgbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgICAgU2VjdGlvbnMgYWJvdmUuCisKKyAgICBiKSBHaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCB0aGUgY29tYmluZWQgbGlicmFyeSBvZiB0aGUgZmFjdAorICAgIHRoYXQgcGFydCBvZiBpdCBpcyBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIGFuZCBleHBsYWluaW5nCisgICAgd2hlcmUgdG8gZmluZCB0aGUgYWNjb21wYW55aW5nIHVuY29tYmluZWQgZm9ybSBvZiB0aGUgc2FtZSB3b3JrLgorCisgIDguIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgbGluayB3aXRoLCBvciBkaXN0cmlidXRlCit0aGUgTGlicmFyeSBleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueQorYXR0ZW1wdCBvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBsaW5rIHdpdGgsIG9yCitkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGlzIHZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIKK3JpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuICBIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywKK29yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIgdGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMKK3Rlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoIHBhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KKworICA5LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKK3NpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCitkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKK3Byb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKK21vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIExpYnJhcnkgKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorTGlicmFyeSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKK2FsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKK3RoZSBMaWJyYXJ5IG9yIHdvcmtzIGJhc2VkIG9uIGl0LgorCisgIDEwLiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitMaWJyYXJ5KSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQorb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSwgbGluayB3aXRoIG9yIG1vZGlmeSB0aGUgTGlicmFyeQorc3ViamVjdCB0byB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgorcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgorWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgd2l0aAordGhpcyBMaWNlbnNlLgorDAorICAxMS4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAoraW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKK2NvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKK290aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKK2V4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90CitkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCitMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91CittYXkgbm90IGRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50CitsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5IGJ5CithbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KK3RoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KK3JlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIExpYnJhcnkuCisKK0lmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhbnkKK3BhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBhcHBseSwKK2FuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyIGNpcmN1bXN0YW5jZXMuCisKK0l0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKK3BhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55CitzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCitpbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSB3aGljaCBpcworaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCitnZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCit0aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAorc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwordG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90CitpbXBvc2UgdGhhdCBjaG9pY2UuCisKK1RoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bworYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMTIuIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgTGlicmFyeSBpcyByZXN0cmljdGVkIGluCitjZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKK29yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgTGlicmFyeSB1bmRlciB0aGlzIExpY2Vuc2UgbWF5IGFkZAorYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZyB0aG9zZSBjb3VudHJpZXMsCitzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZyBjb3VudHJpZXMgbm90IHRodXMKK2V4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzIHRoZSBsaW1pdGF0aW9uIGFzIGlmCit3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KKworICAxMy4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcKK3ZlcnNpb25zIG9mIHRoZSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4KK1N1Y2ggbmV3IHZlcnNpb25zIHdpbGwgYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwKK2J1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0byBhZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KKworRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgTGlicmFyeQorc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kCisiYW55IGxhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kCitjb25kaXRpb25zIGVpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIExpYnJhcnkgZG9lcyBub3Qgc3BlY2lmeSBhCitsaWNlbnNlIHZlcnNpb24gbnVtYmVyLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKwwKKyAgMTQuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBMaWJyYXJ5IGludG8gb3RoZXIgZnJlZQorcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGluY29tcGF0aWJsZSB3aXRoIHRoZXNlLAord3JpdGUgdG8gdGhlIGF1dGhvciB0byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMKK2NvcHlyaWdodGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMgbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyCitkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzIG9mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzCitvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kIG9mIHByb21vdGluZyB0aGUgc2hhcmluZworYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KKworCQkJICAgIE5PIFdBUlJBTlRZCisKKyAgMTUuIEJFQ0FVU0UgVEhFIExJQlJBUlkgSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PCitXQVJSQU5UWSBGT1IgVEhFIExJQlJBUlksIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLgorRVhDRVBUIFdIRU4gT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IKK09USEVSIFBBUlRJRVMgUFJPVklERSBUSEUgTElCUkFSWSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZCitLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKK0lNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFCitMSUJSQVJZIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRSBMSUJSQVJZIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRQorVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLgorCisgIDE2LiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOCitXUklUSU5HIFdJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWQorQU5EL09SIFJFRElTVFJJQlVURSBUSEUgTElCUkFSWSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UKK0ZPUiBEQU1BR0VTLCBJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IKK0NPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFCitMSUJSQVJZIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HCitSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkgWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQQorRkFJTFVSRSBPRiBUSEUgTElCUkFSWSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSIFNPRlRXQVJFKSwgRVZFTiBJRgorU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorREFNQUdFUy4KKworCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworDAorICAgICAgICAgICBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgTGlicmFyaWVzCisKKyAgSWYgeW91IGRldmVsb3AgYSBuZXcgbGlicmFyeSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAorcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHdlIHJlY29tbWVuZCBtYWtpbmcgaXQgZnJlZSBzb2Z0d2FyZSB0aGF0CitldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UuICBZb3UgY2FuIGRvIHNvIGJ5IHBlcm1pdHRpbmcKK3JlZGlzdHJpYnV0aW9uIHVuZGVyIHRoZXNlIHRlcm1zIChvciwgYWx0ZXJuYXRpdmVseSwgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSkuCisKKyAgVG8gYXBwbHkgdGhlc2UgdGVybXMsIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIGxpYnJhcnkuICBJdCBpcworc2FmZXN0IHRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKK2NvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0IHRoZQorImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KKworICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBsaWJyYXJ5J3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+CisgICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCitBbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KKworWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKK3NjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIGxpYnJhcnksIGlmCituZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6CisKKyAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUKKyAgbGlicmFyeSBgRnJvYicgKGEgbGlicmFyeSBmb3IgdHdlYWtpbmcga25vYnMpIHdyaXR0ZW4gYnkgSmFtZXMgUmFuZG9tIEhhY2tlci4KKworICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5OTAKKyAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKKworVGhhdCdzIGFsbCB0aGVyZSBpcyB0byBpdCEKKworCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9saWNlbnNlLnR4dCBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2xpY2Vuc2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMDg0MWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9saWNlbnNlLnR4dApAQCAtMCwwICsxLDE5IEBACitTYW4gQW5nZWxlcyBPYnNlcnZhdGlvbiBPcGVuR0wgRVMgdmVyc2lvbiBleGFtcGxlDQorQ29weXJpZ2h0IDIwMDQtMjAwNSBKZXRybyBMYXVoYQ0KK0FsbCByaWdodHMgcmVzZXJ2ZWQuDQorV2ViOiBodHRwOi8vaWtpLmZpL2pldHJvLw0KKw0KK1RoaXMgc291cmNlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcg0KK21vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgRUlUSEVSOg0KKyAgKDEpIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlDQorICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQNCisgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIFRoZSB0ZXh0IG9mIHRoZSBHTlUgTGVzc2VyDQorICAgICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgc291cmNlIGluIHRoZQ0KKyAgICAgIGZpbGUgTElDRU5TRS1MR1BMLnR4dC4NCisgICgyKSBUaGUgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgc291cmNlIGluDQorICAgICAgdGhlIGZpbGUgTElDRU5TRS1CU0QudHh0Lg0KKw0KK1RoaXMgc291cmNlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgZmlsZXMNCitMSUNFTlNFLUxHUEwudHh0IGFuZCBMSUNFTlNFLUJTRC50eHQgZm9yIG1vcmUgZGV0YWlscy4NCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9zaGFwZXMuaCBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL3NoYXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZmZhZTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9zaGFwZXMuaApAQCAtMCwwICsxLDU5IEBACisvKiBTYW4gQW5nZWxlcyBPYnNlcnZhdGlvbiBPcGVuR0wgRVMgdmVyc2lvbiBleGFtcGxlCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA1IEpldHJvIExhdWhhCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogV2ViOiBodHRwOi8vaWtpLmZpL2pldHJvLworICoKKyAqIFRoaXMgc291cmNlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBFSVRIRVI6CisgKiAgICgxKSBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gVGhlIHRleHQgb2YgdGhlIEdOVSBMZXNzZXIKKyAqICAgICAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIHNvdXJjZSBpbiB0aGUKKyAqICAgICAgIGZpbGUgTElDRU5TRS1MR1BMLnR4dC4KKyAqICAgKDIpIFRoZSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4KKyAqICAgICAgIHRoZSBmaWxlIExJQ0VOU0UtQlNELnR4dC4KKyAqCisgKiBUaGlzIHNvdXJjZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBmaWxlcworICogTElDRU5TRS1MR1BMLnR4dCBhbmQgTElDRU5TRS1CU0QudHh0IGZvciBtb3JlIGRldGFpbHMuCisgKgorICogJElkOiBzaGFwZXMuaCx2IDEuNiAyMDA1LzAxLzMxIDIyOjE1OjMwIHRvbmljIEV4cCAkCisgKiAkUmV2aXNpb246IDEuNiAkCisgKi8KKworI2lmbmRlZiBTSEFQRVNfSF9JTkNMVURFRAorI2RlZmluZSBTSEFQRVNfSF9JTkNMVURFRAorCisKKyNkZWZpbmUgU1VQRVJTSEFQRV9QQVJBTVMgMTUKKworc3RhdGljIGNvbnN0IGZsb2F0IHNTdXBlclNoYXBlUGFyYW1zW11bU1VQRVJTSEFQRV9QQVJBTVNdID0KK3sKKyAgICAvLyBtICBhICAgICBiICAgICBuMSAgICAgIG4yICAgICBuMyAgICAgbSAgICAgYSAgICAgYiAgICAgbjEgICAgIG4yICAgICAgbjMgICByZXMxIHJlczIgc2NhbGUgIChvcmcucmVzMSxyZXMyKQorICAgIHsgMTAsIDEsICAgIDIsICAgIDkwLCAgICAgIDEsICAgLTQ1LCAgICA4LCAgICAxLCAgICAxLCAgICAtMSwgICAgIDEsICAtMC40ZiwgICAyMCwgIDMwLCAyIH0sIC8vIDQwLCA2MAorICAgIHsgMTAsIDEsICAgIDIsICAgIDkwLCAgICAgIDEsICAgLTQ1LCAgICA0LCAgICAxLCAgICAxLCAgICAxMCwgICAgIDEsICAtMC40ZiwgICAyMCwgIDIwLCA0IH0sIC8vIDQwLCA0MAorICAgIHsgMTAsIDEsICAgIDIsICAgIDYwLCAgICAgIDEsICAgLTEwLCAgICA0LCAgICAxLCAgICAxLCAgICAtMSwgICAgLTIsICAtMC40ZiwgICA0MSwgIDQxLCAxIH0sIC8vIDgyLCA4MgorICAgIHsgIDYsIDEsICAgIDEsICAgIDYwLCAgICAgIDEsICAgLTcwLCAgICA4LCAgICAxLCAgICAxLCAgMC40ZiwgICAgIDMsICAwLjI1ZiwgICAyMCwgIDIwLCAxIH0sIC8vIDQwLCA0MAorICAgIHsgIDQsIDEsICAgIDEsICAgIDMwLCAgICAgIDEsICAgIDIwLCAgIDEyLCAgICAxLCAgICAxLCAgMC40ZiwgICAgIDMsICAwLjI1ZiwgICAxMCwgIDMwLCAxIH0sIC8vIDIwLCA2MAorICAgIHsgIDgsIDEsICAgIDEsICAgIDMwLCAgICAgIDEsICAgIC00LCAgICA4LCAgICAyLCAgICAxLCAgICAtMSwgICAgIDUsICAgMC41ZiwgICAyNSwgIDI2LCAxIH0sIC8vIDYwLCA2MAorICAgIHsgMTMsIDEsICAgIDEsICAgIDMwLCAgICAgIDEsICAgIC00LCAgIDEzLCAgICAxLCAgICAxLCAgICAgMSwgICAgIDUsICAgICAgMSwgICAzMCwgIDMwLCA2IH0sIC8vIDYwLCA2MAorICAgIHsgMTAsIDEsIDEuMWYsIC0wLjVmLCAgIDAuMWYsICAgIDcwLCAgIDYwLCAgICAxLCAgICAxLCAgIC05MCwgICAgIDAsIC0wLjI1ZiwgICAyMCwgIDYwLCA4IH0sIC8vIDYwLCAxODAKKyAgICB7ICA3LCAxLCAgICAxLCAgICAyMCwgIC0wLjNmLCAtMy41ZiwgICAgNiwgICAgMSwgICAgMSwgICAgLTEsICA0LjVmLCAgIDAuNWYsICAgMTAsICAyMCwgNCB9LCAvLyA2MCwgODAKKyAgICB7ICA0LCAxLCAgICAxLCAgICAxMCwgICAgIDEwLCAgICAxMCwgICAgNCwgICAgMSwgICAgMSwgICAgMTAsICAgIDEwLCAgICAgMTAsICAgMTAsICAyMCwgMSB9LCAvLyAyMCwgNDAKKyAgICB7ICA0LCAxLCAgICAxLCAgICAgMSwgICAgICAxLCAgICAgMSwgICAgNCwgICAgMSwgICAgMSwgICAgIDEsICAgICAxLCAgICAgIDEsICAgMTAsICAxMCwgMiB9LCAvLyAxMCwgMTAKKyAgICB7ICAxLCAxLCAgICAxLCAgICAzOCwgLTAuMjVmLCAgICAxOSwgICAgNCwgICAgMSwgICAgMSwgICAgMTAsICAgIDEwLCAgICAgMTAsICAgMTAsICAxNSwgMiB9LCAvLyAyMCwgNDAKKyAgICB7ICAyLCAxLCAgICAxLCAgMC43ZiwgICAwLjNmLCAgMC4yZiwgICAgMywgICAgMSwgICAgMSwgICAxMDAsICAgMTAwLCAgICAxMDAsICAgMTAsICAyNSwgMiB9LCAvLyAyMCwgNTAKKyAgICB7ICA2LCAxLCAgICAxLCAgICAgMSwgICAgICAxLCAgICAgMSwgICAgMywgICAgMSwgICAgMSwgICAgIDEsICAgICAxLCAgICAgIDEsICAgMzAsICAzMCwgMiB9LCAvLyA2MCwgNjAKKyAgICB7ICAzLCAxLCAgICAxLCAgICAgMSwgICAgICAxLCAgICAgMSwgICAgNiwgICAgMSwgICAgMSwgICAgIDIsICAgICAxLCAgICAgIDEsICAgMTAsICAyMCwgMiB9LCAvLyAyMCwgNDAKKyAgICB7ICA2LCAxLCAgICAxLCAgICAgNiwgICA1LjVmLCAgIDEwMCwgICAgNiwgICAgMSwgICAgMSwgICAgMjUsICAgIDEwLCAgICAgMTAsICAgMzAsICAyMCwgMiB9LCAvLyA2MCwgNDAKKyAgICB7ICAzLCAxLCAgICAxLCAgMC41ZiwgICAxLjdmLCAgMS43ZiwgICAgMiwgICAgMSwgICAgMSwgICAgMTAsICAgIDEwLCAgICAgMTAsICAgMjAsICAyMCwgMiB9LCAvLyA0MCwgNDAKKyAgICB7ICA1LCAxLCAgICAxLCAgMC4xZiwgICAxLjdmLCAgMS43ZiwgICAgMSwgICAgMSwgICAgMSwgIDAuM2YsICAwLjVmLCAgIDAuNWYsICAgMjAsICAyMCwgNCB9LCAvLyA0MCwgNDAKKyAgICB7ICAyLCAxLCAgICAxLCAgICAgNiwgICA1LjVmLCAgIDEwMCwgICAgNiwgICAgMSwgICAgMSwgICAgIDQsICAgIDEwLCAgICAgMTAsICAgMTAsICAyMiwgMSB9LCAvLyA0MCwgNDAKKyAgICB7ICA2LCAxLCAgICAxLCAgICAtMSwgICAgIDcwLCAgMC4xZiwgICAgOSwgICAgMSwgMC41ZiwgICAtOTgsIDAuMDVmLCAgICAtNDUsICAgMjAsICAzMCwgNCB9LCAvLyA2MCwgOTEKKyAgICB7ICA2LCAxLCAgICAxLCAgICAtMSwgICAgIDkwLCAtMC4xZiwgICAgNywgICAgMSwgICAgMSwgICAgOTAsICAxLjNmLCAgICAgMzQsICAgMTMsICAxNiwgMSB9LCAvLyAzMiwgNjAKK307CisjZGVmaW5lIFNVUEVSU0hBUEVfQ09VTlQgKHNpemVvZihzU3VwZXJTaGFwZVBhcmFtcykgLyBzaXplb2Yoc1N1cGVyU2hhcGVQYXJhbXNbMF0pKQorCisKKyNlbmRpZiAvLyAhU0hBUEVTX0hfSU5DTFVERUQKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9maWx0ZXIvQW5kcm9pZC5tayBiL29wZW5nbC90ZXN0cy9maWx0ZXIvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDQ4ZjBkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2ZpbHRlci9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTcgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9IFwKKwlmaWx0ZXIuYworCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKwlsaWJjdXRpbHMgXAorICAgIGxpYkVHTCBcCisgICAgbGliR0xFU3YxX0NNIFwKKyAgICBsaWJ1aQorCitMT0NBTF9NT0RVTEU6PSB0ZXN0LW9wZW5nbC1maWx0ZXIKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZmlsdGVyL2ZpbHRlci5jIGIvb3BlbmdsL3Rlc3RzL2ZpbHRlci9maWx0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTk3MTE5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2ZpbHRlci9maWx0ZXIuYwpAQCAtMCwwICsxLDEzMCBAQAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxFR0wvZWdsLmg+CisjaW5jbHVkZSA8R0xFUy9nbC5oPgorI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworICAgIGlmIChhcmdjIT0yICYmIGFyZ2MhPTMpIHsKKyAgICAgICAgcHJpbnRmKCJ1c2FnZTogJXMgPDAtNj4gW3BidWZmZXJdXG4iLCBhcmd2WzBdKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIAorICAgIGNvbnN0IGludCB0ZXN0ID0gYXRvaShhcmd2WzFdKTsKKyAgICBpbnQgdXNlUGJ1ZmZlciA9IGFyZ2M9PTMgJiYgIXN0cmNtcChhcmd2WzJdLCAicGJ1ZmZlciIpOworICAgIEVHTGludCBzX2NvbmZpZ0F0dHJpYnNbXSA9IHsKKyAgICAgICAgIEVHTF9TVVJGQUNFX1RZUEUsIEVHTF9QQlVGRkVSX0JJVHxFR0xfV0lORE9XX0JJVCwKKyAgICAgICAgIEVHTF9SRURfU0laRSwgICAgICAgNSwKKyAgICAgICAgIEVHTF9HUkVFTl9TSVpFLCAgICAgNiwKKyAgICAgICAgIEVHTF9CTFVFX1NJWkUsICAgICAgNSwKKyAgICAgICAgIEVHTF9OT05FCisgICAgIH07CisgICAgIAorICAgICBFR0xpbnQgbnVtQ29uZmlncyA9IC0xOworICAgICBFR0xpbnQgbWFqb3JWZXJzaW9uOworICAgICBFR0xpbnQgbWlub3JWZXJzaW9uOworICAgICBFR0xDb25maWcgY29uZmlnOworICAgICBFR0xDb250ZXh0IGNvbnRleHQ7CisgICAgIEVHTFN1cmZhY2Ugc3VyZmFjZTsKKyAgICAgRUdMaW50IHcsIGg7CisgICAgIAorICAgICBFR0xEaXNwbGF5IGRweTsKKworICAgICBkcHkgPSBlZ2xHZXREaXNwbGF5KEVHTF9ERUZBVUxUX0RJU1BMQVkpOworICAgICBlZ2xJbml0aWFsaXplKGRweSwgJm1ham9yVmVyc2lvbiwgJm1pbm9yVmVyc2lvbik7CisgICAgIGVnbENob29zZUNvbmZpZyhkcHksIHNfY29uZmlnQXR0cmlicywgJmNvbmZpZywgMSwgJm51bUNvbmZpZ3MpOworICAgICBpZiAoIXVzZVBidWZmZXIpIHsKKyAgICAgICAgIHN1cmZhY2UgPSBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKGRweSwgY29uZmlnLAorICAgICAgICAgICAgICAgICBhbmRyb2lkX2NyZWF0ZURpc3BsYXlTdXJmYWNlKCksIE5VTEwpOworICAgICB9IGVsc2UgeworICAgICAgICAgcHJpbnRmKCJ1c2luZyBwYnVmZmVyXG4iKTsKKyAgICAgICAgIEVHTGludCBhdHRyaWJzW10gPSB7IEVHTF9XSURUSCwgMzIwLCBFR0xfSEVJR0hULCA0ODAsIEVHTF9OT05FIH07CisgICAgICAgICBzdXJmYWNlID0gZWdsQ3JlYXRlUGJ1ZmZlclN1cmZhY2UoZHB5LCBjb25maWcsIGF0dHJpYnMpOworICAgICAgICAgaWYgKHN1cmZhY2UgPT0gRUdMX05PX1NVUkZBQ0UpIHsKKyAgICAgICAgICAgICBwcmludGYoImVnbENyZWF0ZVBidWZmZXJTdXJmYWNlIGVycm9yICV4XG4iLCBlZ2xHZXRFcnJvcigpKTsKKyAgICAgICAgIH0KKyAgICAgfQorICAgICBjb250ZXh0ID0gZWdsQ3JlYXRlQ29udGV4dChkcHksIGNvbmZpZywgTlVMTCwgTlVMTCk7CisgICAgIGVnbE1ha2VDdXJyZW50KGRweSwgc3VyZmFjZSwgc3VyZmFjZSwgY29udGV4dCk7ICAgCisgICAgIGVnbFF1ZXJ5U3VyZmFjZShkcHksIHN1cmZhY2UsIEVHTF9XSURUSCwgJncpOworICAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfSEVJR0hULCAmaCk7CisgICAgIEdMaW50IGRpbSA9IHc8aCA/IHcgOiBoOworCisgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisKKyAgICAgR0xpbnQgY3JvcFs0XSA9IHsgMCwgNCwgNCwgLTQgfTsKKyAgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCAwKTsKKyAgICAgZ2xUZXhQYXJhbWV0ZXJpdihHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX0NST1BfUkVDVF9PRVMsIGNyb3ApOworICAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpOworICAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9MSU5FQVIpOworICAgICBnbFRleEVudngoR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX01PREUsIEdMX1JFUExBQ0UpOworICAgICBnbEVuYWJsZShHTF9URVhUVVJFXzJEKTsKKyAgICAgZ2xDb2xvcjRmKDEsMSwxLDEpOworCisgICAgIC8vIHBhY2tpbmcgaXMgYWx3YXlzIDQKKyAgICAgdWludDhfdCB0OFtdICA9IHsgCisgICAgICAgICAgICAgMHgwMCwgMHg1NSwgMHgwMCwgMHg1NSwgCisgICAgICAgICAgICAgMHhBQSwgMHhGRiwgMHhBQSwgMHhGRiwKKyAgICAgICAgICAgICAweDAwLCAweDU1LCAweDAwLCAweDU1LCAKKyAgICAgICAgICAgICAweEFBLCAweEZGLCAweEFBLCAweEZGICB9OworCisgICAgIHVpbnQxNl90IHQxNltdICA9IHsgCisgICAgICAgICAgICAgMHgwMDAwLCAweDU1NTUsIDB4MDAwMCwgMHg1NTU1LCAKKyAgICAgICAgICAgICAweEFBQUEsIDB4RkZGRiwgMHhBQUFBLCAweEZGRkYsCisgICAgICAgICAgICAgMHgwMDAwLCAweDU1NTUsIDB4MDAwMCwgMHg1NTU1LCAKKyAgICAgICAgICAgICAweEFBQUEsIDB4RkZGRiwgMHhBQUFBLCAweEZGRkYgIH07CisKKyAgICAgdWludDE2X3QgdDU1NTFbXSAgPSB7IAorICAgICAgICAgICAgIDB4MDAwMCwgMHhGRkZGLCAweDAwMDAsIDB4RkZGRiwgCisgICAgICAgICAgICAgMHhGRkZGLCAweDAwMDAsIDB4RkZGRiwgMHgwMDAwLAorICAgICAgICAgICAgIDB4MDAwMCwgMHhGRkZGLCAweDAwMDAsIDB4RkZGRiwgCisgICAgICAgICAgICAgMHhGRkZGLCAweDAwMDAsIDB4RkZGRiwgMHgwMDAwICB9OworCisgICAgIHVpbnQzMl90IHQzMltdICA9IHsgCisgICAgICAgICAgICAgMHhGRjAwMDAwMCwgMHhGRjAwMDBGRiwgMHhGRjAwRkYwMCwgMHhGRkZGMDAwMCwgCisgICAgICAgICAgICAgMHhGRjAwRkYwMCwgMHhGRkZGMDAwMCwgMHhGRjAwMDAwMCwgMHhGRjAwMDBGRiwgCisgICAgICAgICAgICAgMHhGRjAwRkZGRiwgMHhGRjAwRkYwMCwgMHgwMEZGMDBGRiwgMHhGRkZGRkYwMCwgCisgICAgICAgICAgICAgMHhGRjAwMDAwMCwgMHhGRkZGMDBGRiwgMHhGRjAwRkZGRiwgMHhGRkZGRkZGRgorICAgICB9OworCisgICAgIHN3aXRjaCh0ZXN0KSAKKyAgICAgeworICAgICBjYXNlIDE6CisgICAgICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfTFVNSU5BTkNFLAorICAgICAgICAgICAgICAgICA0LCA0LCAwLCBHTF9MVU1JTkFOQ0UsIEdMX1VOU0lHTkVEX0JZVEUsIHQ4KTsKKyAgICAgICAgIGJyZWFrOworICAgICBjYXNlIDI6CisgICAgICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCLAorICAgICAgICAgICAgICAgICA0LCA0LCAwLCBHTF9SR0IsIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81LCB0MTYpOworICAgICAgICAgYnJlYWs7CisgICAgIGNhc2UgMzoKKyAgICAgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLAorICAgICAgICAgICAgICAgICA0LCA0LCAwLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80LCB0MTYpOworICAgICAgICAgYnJlYWs7CisgICAgIGNhc2UgNDoKKyAgICAgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9MVU1JTkFOQ0VfQUxQSEEsCisgICAgICAgICAgICAgICAgIDQsIDQsIDAsIEdMX0xVTUlOQU5DRV9BTFBIQSwgR0xfVU5TSUdORURfQllURSwgdDE2KTsKKyAgICAgICAgIGJyZWFrOworICAgICBjYXNlIDU6CisgICAgICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCQSwKKyAgICAgICAgICAgICAgICAgNCwgNCwgMCwgR0xfUkdCQSwgR0xfVU5TSUdORURfU0hPUlRfNV81XzVfMSwgdDU1NTEpOworICAgICAgICAgYnJlYWs7CisgICAgIGNhc2UgNjoKKyAgICAgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLAorICAgICAgICAgICAgICAgICA0LCA0LCAwLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCB0MzIpOworICAgICAgICAgYnJlYWs7CisgICAgIH0KKworICAgICBnbERyYXdUZXhpT0VTKDAsIDAsIDAsIGRpbSwgZGltKTsKKworICAgICBpZiAoIXVzZVBidWZmZXIpIHsKKyAgICAgICAgIGVnbFN3YXBCdWZmZXJzKGRweSwgc3VyZmFjZSk7CisgICAgIH0gZWxzZSB7CisgICAgICAgICBnbEZpbmlzaCgpOworICAgICB9CisgICAgIAorICAgICBlZ2xUZXJtaW5hdGUoZHB5KTsKKyAgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZmluaXNoL0FuZHJvaWQubWsgYi9vcGVuZ2wvdGVzdHMvZmluaXNoL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY4MzZjMQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9maW5pc2gvQW5kcm9pZC5tawpAQCAtMCwwICsxLDE3IEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSBcCisJZmluaXNoLmMKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisJbGliY3V0aWxzIFwKKyAgICBsaWJFR0wgXAorICAgIGxpYkdMRVN2MV9DTSBcCisgICAgbGlidWkKKworTE9DQUxfTU9EVUxFOj0gdGVzdC1vcGVuZ2wtZmluaXNoCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2ZpbmlzaC9maW5pc2guYyBiL29wZW5nbC90ZXN0cy9maW5pc2gvZmluaXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVmYzc1OAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9maW5pc2gvZmluaXNoLmMKQEAgLTAsMCArMSwyMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c2NoZWQuaD4KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKworI2luY2x1ZGUgPEVHTC9lZ2wuaD4KKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisjaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgorCisKK2xvbmcgbG9uZyBzeXN0ZW1UaW1lKCkKK3sKKyAgICBzdHJ1Y3QgdGltZXNwZWMgdDsKKyAgICB0LnR2X3NlYyA9IHQudHZfbnNlYyA9IDA7CisgICAgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZ0KTsKKyAgICByZXR1cm4gKGxvbmcgbG9uZykodC50dl9zZWMpKjEwMDAwMDAwMDBMTCArIHQudHZfbnNlYzsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworICAgIEVHTGludCBzX2NvbmZpZ0F0dHJpYnNbXSA9IHsKKyAgICAgICAgIEVHTF9SRURfU0laRSwgICAgICAgNSwKKyAgICAgICAgIEVHTF9HUkVFTl9TSVpFLCAgICAgNiwKKyAgICAgICAgIEVHTF9CTFVFX1NJWkUsICAgICAgNSwKKyAgICAgICAgIEVHTF9OT05FCisgICAgIH07CisgICAgIAorICAgICBFR0xpbnQgbnVtQ29uZmlncyA9IC0xOworICAgICBFR0xpbnQgbWFqb3JWZXJzaW9uOworICAgICBFR0xpbnQgbWlub3JWZXJzaW9uOworICAgICBFR0xDb25maWcgY29uZmlnOworICAgICBFR0xDb250ZXh0IGNvbnRleHQ7CisgICAgIEVHTFN1cmZhY2Ugc3VyZmFjZTsKKyAgICAgRUdMaW50IHcsIGg7CisgICAgIAorICAgICBFR0xEaXNwbGF5IGRweTsKKworICAgICBkcHkgPSBlZ2xHZXREaXNwbGF5KEVHTF9ERUZBVUxUX0RJU1BMQVkpOworICAgICBlZ2xJbml0aWFsaXplKGRweSwgJm1ham9yVmVyc2lvbiwgJm1pbm9yVmVyc2lvbik7CisgICAgIGVnbENob29zZUNvbmZpZyhkcHksIHNfY29uZmlnQXR0cmlicywgJmNvbmZpZywgMSwgJm51bUNvbmZpZ3MpOworICAgICBzdXJmYWNlID0gZWdsQ3JlYXRlV2luZG93U3VyZmFjZShkcHksIGNvbmZpZywgCisgICAgICAgICAgICAgYW5kcm9pZF9jcmVhdGVEaXNwbGF5U3VyZmFjZSgpLCBOVUxMKTsKKyAgICAgY29udGV4dCA9IGVnbENyZWF0ZUNvbnRleHQoZHB5LCBjb25maWcsIE5VTEwsIE5VTEwpOworICAgICBlZ2xNYWtlQ3VycmVudChkcHksIHN1cmZhY2UsIHN1cmZhY2UsIGNvbnRleHQpOyAgIAorICAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfV0lEVEgsICZ3KTsKKyAgICAgZWdsUXVlcnlTdXJmYWNlKGRweSwgc3VyZmFjZSwgRUdMX0hFSUdIVCwgJmgpOworICAgICBHTGludCBkaW0gPSB3PGggPyB3IDogaDsKKworICAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIDApOworICAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9ORUFSRVNUKTsKKyAgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTkVBUkVTVCk7CisgICAgIGdsVGV4RW52eChHTF9URVhUVVJFX0VOViwgR0xfVEVYVFVSRV9FTlZfTU9ERSwgR0xfUkVQTEFDRSk7CisgICAgIGdsRW5hYmxlKEdMX1RFWFRVUkVfMkQpOworICAgICBnbENvbG9yNGYoMSwxLDEsMSk7CisgICAgIGdsRGlzYWJsZShHTF9ESVRIRVIpOworICAgICBnbFNoYWRlTW9kZWwoR0xfRkxBVCk7CisKKyAgICAgbG9uZyBsb25nIG5vdywgdDsKKyAgICAgaW50IGk7CisKKyAgICAgY2hhciogdGV4ZWxzID0gbWFsbG9jKDUxMio1MTIqMik7CisgICAgIG1lbXNldCh0ZXhlbHMsMHhGRiw1MTIqNTEyKjIpOworICAgICAKKyAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQiwKKyAgICAgICAgICAgICA1MTIsIDUxMiwgMCwgR0xfUkdCLCBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSwgdGV4ZWxzKTsKKworICAgICBjaGFyKiBkc3QgPSBtYWxsb2MoMzIwKjQ4MCoyKTsKKyAgICAgbWVtc2V0KGRzdCwgMCwgMzIwKjQ4MCoyKTsKKyAgICAgcHJpbnRmKCIzMDcyMDAgYnl0ZXMgbWVtY3B5XG4iKTsKKyAgICAgZm9yIChpPTAgOyBpPDQgOyBpKyspIHsKKyAgICAgICAgIG5vdyA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgIG1lbWNweShkc3QsIHRleGVscywgMzIwKjQ4MCoyKTsKKyAgICAgICAgIHQgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICBwcmludGYoIm1lbWNweSgpIHRpbWUgPSAlbGx1IHVzXG4iLCAodC1ub3cpLzEwMDApOworICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgIH0KKyAgICAgZnJlZShkc3QpOworCisgICAgIGZyZWUodGV4ZWxzKTsKKworICAgICBzZXRwcmlvcml0eShQUklPX1BST0NFU1MsIDAsIC0yMCk7CisgICAgIAorICAgICBwcmludGYoIjUxMng1MTIgdW5tb2RpZmllZCB0ZXh0dXJlLCA1MTJ4NTEyIGJsaXQ6XG4iKTsKKyAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICAgZm9yIChpPTAgOyBpPDQgOyBpKyspIHsKKyAgICAgICAgIEdMaW50IGNyb3BbNF0gPSB7IDAsIDUxMiwgNTEyLCAtNTEyIH07CisgICAgICAgICBnbFRleFBhcmFtZXRlcml2KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfQ1JPUF9SRUNUX09FUywgY3JvcCk7CisgICAgICAgICBub3cgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICBnbERyYXdUZXhpT0VTKDAsIDAsIDAsIDUxMiwgNTEyKTsKKyAgICAgICAgIGdsRmluaXNoKCk7CisgICAgICAgICB0ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgcHJpbnRmKCJnbEZpbmlzaCgpIHRpbWUgPSAlbGx1IHVzXG4iLCAodC1ub3cpLzEwMDApOworICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgICAgICBlZ2xTd2FwQnVmZmVycyhkcHksIHN1cmZhY2UpOworICAgICB9CisgICAgIAorICAgICBwcmludGYoIjUxMng1MTIgdW5tb2RpZmllZCB0ZXh0dXJlLCAxeDEgYmxpdDpcbiIpOworICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOworICAgICBmb3IgKGk9MCA7IGk8NCA7IGkrKykgeworICAgICAgICAgR0xpbnQgY3JvcFs0XSA9IHsgMCwgMSwgMSwgLTEgfTsKKyAgICAgICAgIGdsVGV4UGFyYW1ldGVyaXYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTLCBjcm9wKTsKKyAgICAgICAgIG5vdyA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgIGdsRHJhd1RleGlPRVMoMCwgMCwgMCwgMSwgMSk7CisgICAgICAgICBnbEZpbmlzaCgpOworICAgICAgICAgdCA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgIHByaW50ZigiZ2xGaW5pc2goKSB0aW1lID0gJWxsdSB1c1xuIiwgKHQtbm93KS8xMDAwKTsKKyAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKKyAgICAgfQorICAgICAKKyAgICAgcHJpbnRmKCI1MTJ4NTEyIHVubW9kaWZpZWQgdGV4dHVyZSwgNTEyeDUxMiBibGl0ICh4Mik6XG4iKTsKKyAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICAgZm9yIChpPTAgOyBpPDQgOyBpKyspIHsKKyAgICAgICAgIEdMaW50IGNyb3BbNF0gPSB7IDAsIDUxMiwgNTEyLCAtNTEyIH07CisgICAgICAgICBnbFRleFBhcmFtZXRlcml2KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfQ1JPUF9SRUNUX09FUywgY3JvcCk7CisgICAgICAgICBub3cgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICBnbERyYXdUZXhpT0VTKDAsIDAsIDAsIDUxMiwgNTEyKTsKKyAgICAgICAgIGdsRHJhd1RleGlPRVMoMCwgMCwgMCwgNTEyLCA1MTIpOworICAgICAgICAgZ2xGaW5pc2goKTsKKyAgICAgICAgIHQgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICBwcmludGYoImdsRmluaXNoKCkgdGltZSA9ICVsbHUgdXNcbiIsICh0LW5vdykvMTAwMCk7CisgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgIGVnbFN3YXBCdWZmZXJzKGRweSwgc3VyZmFjZSk7CisgICAgIH0KKworICAgICBwcmludGYoIjUxMng1MTIgdW5tb2RpZmllZCB0ZXh0dXJlLCAxeDEgYmxpdCAoeDIpOlxuIik7CisgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgIGZvciAoaT0wIDsgaTw0IDsgaSsrKSB7CisgICAgICAgICBHTGludCBjcm9wWzRdID0geyAwLCAxLCAxLCAtMSB9OworICAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpdihHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX0NST1BfUkVDVF9PRVMsIGNyb3ApOworICAgICAgICAgbm93ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgZ2xEcmF3VGV4aU9FUygwLCAwLCAwLCAxLCAxKTsKKyAgICAgICAgIGdsRHJhd1RleGlPRVMoMCwgMCwgMCwgMSwgMSk7CisgICAgICAgICBnbEZpbmlzaCgpOworICAgICAgICAgdCA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgIHByaW50ZigiZ2xGaW5pc2goKSB0aW1lID0gJWxsdSB1c1xuIiwgKHQtbm93KS8xMDAwKTsKKyAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKKyAgICAgfQorCisgICAgIAorICAgICBwcmludGYoIjUxMng1MTIgKDF4MSB0ZXhlbCBNT0RJRklFRCB0ZXh0dXJlKSwgNTEyeDUxMiBibGl0OlxuIik7CisgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgIGZvciAoaT0wIDsgaTw0IDsgaSsrKSB7CisgICAgICAgICB1aW50MTZfdCBncmVlbiA9IDB4N0UwOworICAgICAgICAgR0xpbnQgY3JvcFs0XSA9IHsgMCwgNTEyLCA1MTIsIC01MTIgfTsKKyAgICAgICAgIGdsVGV4UGFyYW1ldGVyaXYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTLCBjcm9wKTsKKyAgICAgICAgIGdsVGV4U3ViSW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCAwLCAwLCAxLCAxLCBHTF9SR0IsIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81LCAmZ3JlZW4pOworICAgICAgICAgbm93ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgZ2xEcmF3VGV4aU9FUygwLCAwLCAwLCA1MTIsIDUxMik7CisgICAgICAgICBnbEZpbmlzaCgpOworICAgICAgICAgdCA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgIHByaW50ZigiZ2xGaW5pc2goKSB0aW1lID0gJWxsdSB1c1xuIiwgKHQtbm93KS8xMDAwKTsKKyAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKKyAgICAgfQorCisKKyAgICAgaW50MTZfdCB0ZXhlbCA9IDB4RjgwMDsKKyAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQiwKKyAgICAgICAgICAgICAxLCAxLCAwLCBHTF9SR0IsIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81LCAmdGV4ZWwpOworCisgICAgIHByaW50ZigiMXgxIHVubW9kaWZpZWQgdGV4dHVyZSwgMXgxIGJsaXQ6XG4iKTsKKyAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICAgZm9yIChpPTAgOyBpPDQgOyBpKyspIHsKKyAgICAgICAgIEdMaW50IGNyb3BbNF0gPSB7IDAsIDEsIDEsIC0xIH07CisgICAgICAgICBnbFRleFBhcmFtZXRlcml2KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfQ1JPUF9SRUNUX09FUywgY3JvcCk7CisgICAgICAgICBub3cgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICBnbERyYXdUZXhpT0VTKDAsIDAsIDAsIDEsIDEpOworICAgICAgICAgZ2xGaW5pc2goKTsKKyAgICAgICAgIHQgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICBwcmludGYoImdsRmluaXNoKCkgdGltZSA9ICVsbHUgdXNcbiIsICh0LW5vdykvMTAwMCk7CisgICAgICAgICBlZ2xTd2FwQnVmZmVycyhkcHksIHN1cmZhY2UpOworICAgICB9CisKKyAgICAgcHJpbnRmKCIxeDEgdW5tb2RpZmllZCB0ZXh0dXJlLCA1MTJ4NTEyIGJsaXQ6XG4iKTsKKyAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICAgZm9yIChpPTAgOyBpPDQgOyBpKyspIHsKKyAgICAgICAgIEdMaW50IGNyb3BbNF0gPSB7IDAsIDEsIDEsIC0xIH07CisgICAgICAgICBnbFRleFBhcmFtZXRlcml2KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfQ1JPUF9SRUNUX09FUywgY3JvcCk7CisgICAgICAgICBub3cgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICBnbERyYXdUZXhpT0VTKDAsIDAsIDAsIDUxMiwgNTEyKTsKKyAgICAgICAgIGdsRmluaXNoKCk7CisgICAgICAgICB0ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgcHJpbnRmKCJnbEZpbmlzaCgpIHRpbWUgPSAlbGx1IHVzXG4iLCAodC1ub3cpLzEwMDApOworICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgICAgICBlZ2xTd2FwQnVmZmVycyhkcHksIHN1cmZhY2UpOworICAgICB9CisKKyAgICAgcHJpbnRmKCIxeDEgKDF4MSB0ZXhlbCBNT0RJRklFRCB0ZXh0dXJlKSwgNTEyeDUxMiBibGl0OlxuIik7CisgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgIGZvciAoaT0wIDsgaTw0IDsgaSsrKSB7CisgICAgICAgICB1aW50MTZfdCBncmVlbiA9IDB4N0UwOworICAgICAgICAgR0xpbnQgY3JvcFs0XSA9IHsgMCwgMSwgMSwgLTEgfTsKKyAgICAgICAgIGdsVGV4UGFyYW1ldGVyaXYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTLCBjcm9wKTsKKyAgICAgICAgIGdsVGV4U3ViSW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCAwLCAwLCAxLCAxLCBHTF9SR0IsIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81LCAmZ3JlZW4pOworICAgICAgICAgbm93ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgZ2xEcmF3VGV4aU9FUygwLCAwLCAwLCAxLCAxKTsKKyAgICAgICAgIGdsRmluaXNoKCk7CisgICAgICAgICB0ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgcHJpbnRmKCJnbEZpbmlzaCgpIHRpbWUgPSAlbGx1IHVzXG4iLCAodC1ub3cpLzEwMDApOworICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgICAgICBlZ2xTd2FwQnVmZmVycyhkcHksIHN1cmZhY2UpOworICAgICB9CisKKyAgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdGV4dHVyZXMvQW5kcm9pZC5tayBiL29wZW5nbC90ZXN0cy90ZXh0dXJlcy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4YzYyMjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvdGV4dHVyZXMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDE3IEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSBcCisJdGV4dHVyZXMuYworCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKwlsaWJjdXRpbHMgXAorICAgIGxpYkVHTCBcCisgICAgbGliR0xFU3YxX0NNIFwKKyAgICBsaWJ1aQorCitMT0NBTF9NT0RVTEU6PSB0ZXN0LW9wZW5nbC10ZXh0dXJlcworCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXh0dXJlcy90ZXh0dXJlcy5jIGIvb3BlbmdsL3Rlc3RzL3RleHR1cmVzL3RleHR1cmVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE0MjkxYgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy90ZXh0dXJlcy90ZXh0dXJlcy5jCkBAIC0wLDAgKzEsMTA5IEBACisvKgorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8RUdML2VnbC5oPgorI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKyAgICBFR0xpbnQgc19jb25maWdBdHRyaWJzW10gPSB7CisgICAgICAgICBFR0xfUkVEX1NJWkUsICAgICAgIDUsCisgICAgICAgICBFR0xfR1JFRU5fU0laRSwgICAgIDYsCisgICAgICAgICBFR0xfQkxVRV9TSVpFLCAgICAgIDUsCisgICAgICAgICBFR0xfTk9ORQorICAgICB9OworICAgICAKKyAgICAgRUdMaW50IG51bUNvbmZpZ3MgPSAtMTsKKyAgICAgRUdMaW50IG1ham9yVmVyc2lvbjsKKyAgICAgRUdMaW50IG1pbm9yVmVyc2lvbjsKKyAgICAgRUdMQ29uZmlnIGNvbmZpZzsKKyAgICAgRUdMQ29udGV4dCBjb250ZXh0OworICAgICBFR0xTdXJmYWNlIHN1cmZhY2U7CisgICAgIEVHTGludCB3LCBoOworICAgICAKKyAgICAgRUdMRGlzcGxheSBkcHk7CisKKyAgICAgZHB5ID0gZWdsR2V0RGlzcGxheShFR0xfREVGQVVMVF9ESVNQTEFZKTsKKyAgICAgZWdsSW5pdGlhbGl6ZShkcHksICZtYWpvclZlcnNpb24sICZtaW5vclZlcnNpb24pOworICAgICBlZ2xDaG9vc2VDb25maWcoZHB5LCBzX2NvbmZpZ0F0dHJpYnMsICZjb25maWcsIDEsICZudW1Db25maWdzKTsKKyAgICAgc3VyZmFjZSA9IGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoZHB5LCBjb25maWcsCisgICAgICAgICAgICAgYW5kcm9pZF9jcmVhdGVEaXNwbGF5U3VyZmFjZSgpLCBOVUxMKTsKKyAgICAgY29udGV4dCA9IGVnbENyZWF0ZUNvbnRleHQoZHB5LCBjb25maWcsIE5VTEwsIE5VTEwpOworICAgICBlZ2xNYWtlQ3VycmVudChkcHksIHN1cmZhY2UsIHN1cmZhY2UsIGNvbnRleHQpOyAgIAorICAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfV0lEVEgsICZ3KTsKKyAgICAgZWdsUXVlcnlTdXJmYWNlKGRweSwgc3VyZmFjZSwgRUdMX0hFSUdIVCwgJmgpOworICAgICBHTGludCBkaW0gPSB3PGggPyB3IDogaDsKKworCisgICAgIEdMaW50IGNyb3BbNF0gPSB7IDAsIDQsIDQsIC00IH07CisgICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgMCk7CisgICAgIGdsVGV4UGFyYW1ldGVyaXYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTLCBjcm9wKTsKKyAgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTElORUFSKTsKKyAgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTElORUFSKTsKKyAgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9DTEFNUF9UT19FREdFKTsKKyAgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9DTEFNUF9UT19FREdFKTsKKyAgICAgZ2xUZXhFbnZ4KEdMX1RFWFRVUkVfRU5WLCBHTF9URVhUVVJFX0VOVl9NT0RFLCBHTF9SRVBMQUNFKTsKKyAgICAgZ2xFbmFibGUoR0xfVEVYVFVSRV8yRCk7CisgICAgIGdsQ29sb3I0ZigxLDEsMSwxKTsKKworICAgICAvLyBwYWNraW5nIGlzIGFsd2F5cyA0CisgICAgIHVpbnQ4X3QgdDhbXSAgPSB7IAorICAgICAgICAgICAgIDB4MDAsIDB4NTUsIDB4MDAsIDB4NTUsIAorICAgICAgICAgICAgIDB4QUEsIDB4RkYsIDB4QUEsIDB4RkYsCisgICAgICAgICAgICAgMHgwMCwgMHg1NSwgMHgwMCwgMHg1NSwgCisgICAgICAgICAgICAgMHhBQSwgMHhGRiwgMHhBQSwgMHhGRiAgfTsKKworICAgICB1aW50MTZfdCB0MTZbXSAgPSB7IAorICAgICAgICAgICAgIDB4MDAwMCwgMHg1NTU1LCAweDAwMDAsIDB4NTU1NSwgCisgICAgICAgICAgICAgMHhBQUFBLCAweEZGRkYsIDB4QUFBQSwgMHhGRkZGLAorICAgICAgICAgICAgIDB4MDAwMCwgMHg1NTU1LCAweDAwMDAsIDB4NTU1NSwgCisgICAgICAgICAgICAgMHhBQUFBLCAweEZGRkYsIDB4QUFBQSwgMHhGRkZGICB9OworCisgICAgIHVpbnQxNl90IHQ1NTUxW10gID0geyAKKyAgICAgICAgICAgICAweDAwMDAsIDB4RkZGRiwgMHgwMDAwLCAweEZGRkYsIAorICAgICAgICAgICAgIDB4RkZGRiwgMHgwMDAwLCAweEZGRkYsIDB4MDAwMCwKKyAgICAgICAgICAgICAweDAwMDAsIDB4RkZGRiwgMHgwMDAwLCAweEZGRkYsIAorICAgICAgICAgICAgIDB4RkZGRiwgMHgwMDAwLCAweEZGRkYsIDB4MDAwMCAgfTsKKworICAgICB1aW50MzJfdCB0MzJbXSAgPSB7IAorICAgICAgICAgICAgIDB4RkYwMDAwMDAsIDB4RkYwMDAwRkYsIDB4RkYwMEZGMDAsIDB4RkZGRjAwMDAsIAorICAgICAgICAgICAgIDB4RkYwMEZGMDAsIDB4RkZGRjAwMDAsIDB4RkYwMDAwMDAsIDB4RkYwMDAwRkYsIAorICAgICAgICAgICAgIDB4RkYwMEZGRkYsIDB4RkYwMEZGMDAsIDB4MDBGRjAwRkYsIDB4RkZGRkZGMDAsIAorICAgICAgICAgICAgIDB4RkYwMDAwMDAsIDB4RkZGRjAwRkYsIDB4RkYwMEZGRkYsIDB4RkZGRkZGRkYKKyAgICAgfTsKKworCisgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9MVU1JTkFOQ0UsIDQsIDQsIDAsIEdMX0xVTUlOQU5DRSwgR0xfVU5TSUdORURfQllURSwgdDgpOworICAgICBnbERyYXdUZXhpT0VTKDAsIDAsIDAsIGRpbS8yLCBkaW0vMik7CisKKyAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQiwgNCwgNCwgMCwgR0xfUkdCLCBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSwgdDE2KTsKKyAgICAgZ2xEcmF3VGV4aU9FUyhkaW0vMiwgMCwgMCwgZGltLzIsIGRpbS8yKTsKKworICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCQSwgNCwgNCwgMCwgR0xfUkdCQSwgR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNCwgdDE2KTsKKyAgICAgZ2xEcmF3VGV4aU9FUygwLCBkaW0vMiwgMCwgZGltLzIsIGRpbS8yKTsKKworICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCQSwgNCwgNCwgMCwgR0xfUkdCQSwgR0xfVU5TSUdORURfQllURSwgdDMyKTsKKyAgICAgZ2xEcmF3VGV4aU9FUyhkaW0vMiwgZGltLzIsIDAsIGRpbS8yLCBkaW0vMik7CisKKyAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKKyAgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdHJpdGV4L0FuZHJvaWQubWsgYi9vcGVuZ2wvdGVzdHMvdHJpdGV4L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNkMWYwNAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy90cml0ZXgvQW5kcm9pZC5tawpAQCAtMCwwICsxLDE3IEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSBcCisJdHJpdGV4LmMKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisJbGliY3V0aWxzIFwKKyAgICBsaWJFR0wgXAorICAgIGxpYkdMRVN2MV9DTSBcCisgICAgbGlidWkKKworTE9DQUxfTU9EVUxFOj0gdGVzdC1vcGVuZ2wtdHJpdGV4CisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3RyaXRleC90cml0ZXguYyBiL29wZW5nbC90ZXN0cy90cml0ZXgvdHJpdGV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBhN2ZlYgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy90cml0ZXgvdHJpdGV4LmMKQEAgLTAsMCArMSwyNzMgQEAKKy8vIENhbGxzIGdsRHJhd0VsZW1lbnRzKCkgdGhlIG51bWJlciBvZiB0aW1lcyBzcGVjaWZpZWQgYnkKKy8vIElURVJBVElPTlMuIFNob3VsZCBkcmF3IGEgY2hlY2tlcmJvYXJkIG9uIHRoZSBzY3JlZW4gYWZ0ZXIKKy8vIGEgZmV3IHNlY29uZHMuCisvLworLy8gUG9ydGVkIGZyb20gYSBKYXZhIHZlcnNpb24gYnkgR29vZ2xlLgorCisjaW5jbHVkZSA8RUdML2VnbC5oPg0KKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPg0KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisNCitFR0xEaXNwbGF5IGVnbERpc3BsYXk7DQorRUdMU3VyZmFjZSBlZ2xTdXJmYWNlOw0KK0VHTENvbnRleHQgZWdsQ29udGV4dDsNCitHTHVpbnQgdGV4dHVyZTsNCisNCisjZGVmaW5lIEZJWEVEX09ORSAweDEwMDAwCisjZGVmaW5lIElURVJBVElPTlMgNTANCisNCitpbnQgaW5pdF9nbF9zdXJmYWNlKHZvaWQpOw0KK3ZvaWQgZnJlZV9nbF9zdXJmYWNlKHZvaWQpOw0KK3ZvaWQgaW5pdF9zY2VuZSh2b2lkKTsNCit2b2lkIHJlbmRlcihpbnQgcXVhZHMpOw0KK3ZvaWQgY3JlYXRlX3RleHR1cmUodm9pZCk7CitpbnQgcmVhZFRpbWVyKHZvaWQpOw0KKworc3RhdGljIHZvaWQgZ2x1TG9va0F0KGZsb2F0IGV5ZVgsIGZsb2F0IGV5ZVksIGZsb2F0IGV5ZVosCisgICAgICAgIGZsb2F0IGNlbnRlclgsIGZsb2F0IGNlbnRlclksIGZsb2F0IGNlbnRlclosIGZsb2F0IHVwWCwgZmxvYXQgdXBZLAorICAgICAgICBmbG9hdCB1cFopCit7CisgICAgLy8gU2VlIHRoZSBPcGVuR0wgR0xVVCBkb2N1bWVudGF0aW9uIGZvciBnbHVMb29rQXQgZm9yIGEgZGVzY3JpcHRpb24KKyAgICAvLyBvZiB0aGUgYWxnb3JpdGhtLiBXZSBpbXBsZW1lbnQgaXQgaW4gYSBzdHJhaWdodGZvcndhcmQgd2F5OgorCisgICAgZmxvYXQgZnggPSBjZW50ZXJYIC0gZXllWDsKKyAgICBmbG9hdCBmeSA9IGNlbnRlclkgLSBleWVZOworICAgIGZsb2F0IGZ6ID0gY2VudGVyWiAtIGV5ZVo7CisKKyAgICAvLyBOb3JtYWxpemUgZgorICAgIGZsb2F0IHJsZiA9IDEuMGYgLyBzcXJ0ZihmeCpmeCArIGZ5KmZ5ICsgZnoqZnopOworICAgIGZ4ICo9IHJsZjsKKyAgICBmeSAqPSBybGY7CisgICAgZnogKj0gcmxmOworCisgICAgLy8gTm9ybWFsaXplIHVwCisgICAgZmxvYXQgcmx1cCA9IDEuMGYgLyBzcXJ0Zih1cFgqdXBYICsgdXBZKnVwWSArIHVwWip1cFopOworICAgIHVwWCAqPSBybHVwOworICAgIHVwWSAqPSBybHVwOworICAgIHVwWiAqPSBybHVwOworCisgICAgLy8gY29tcHV0ZSBzID0gZiB4IHVwICh4IG1lYW5zICJjcm9zcyBwcm9kdWN0IikKKworICAgIGZsb2F0IHN4ID0gZnkgKiB1cFogLSBmeiAqIHVwWTsKKyAgICBmbG9hdCBzeSA9IGZ6ICogdXBYIC0gZnggKiB1cFo7CisgICAgZmxvYXQgc3ogPSBmeCAqIHVwWSAtIGZ5ICogdXBYOworCisgICAgLy8gY29tcHV0ZSB1ID0gcyB4IGYKKyAgICBmbG9hdCB1eCA9IHN5ICogZnogLSBzeiAqIGZ5OworICAgIGZsb2F0IHV5ID0gc3ogKiBmeCAtIHN4ICogZno7CisgICAgZmxvYXQgdXogPSBzeCAqIGZ5IC0gc3kgKiBmeDsKKworICAgIGZsb2F0IG1bMTZdIDsKKyAgICBtWzBdID0gc3g7CisgICAgbVsxXSA9IHV4OworICAgIG1bMl0gPSAtZng7CisgICAgbVszXSA9IDAuMGY7CisKKyAgICBtWzRdID0gc3k7CisgICAgbVs1XSA9IHV5OworICAgIG1bNl0gPSAtZnk7CisgICAgbVs3XSA9IDAuMGY7CisKKyAgICBtWzhdID0gc3o7CisgICAgbVs5XSA9IHV6OworICAgIG1bMTBdID0gLWZ6OworICAgIG1bMTFdID0gMC4wZjsKKworICAgIG1bMTJdID0gMC4wZjsKKyAgICBtWzEzXSA9IDAuMGY7CisgICAgbVsxNF0gPSAwLjBmOworICAgIG1bMTVdID0gMS4wZjsKKworICAgIGdsTXVsdE1hdHJpeGYobSk7CisgICAgZ2xUcmFuc2xhdGVmKC1leWVYLCAtZXllWSwgLWV5ZVopOworfQorDQoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQ0KK3sNCisgICAgaW50IHE7CisgICAgaW50IHN0YXJ0LCBlbmQ7DQorCisgICAgcHJpbnRmKCJJbml0aWFsaXppbmcgRUdMLi4uXG4iKTsKKw0KKyAgICBpZighaW5pdF9nbF9zdXJmYWNlKCkpDQorICAgIHsNCisgICAgICAgIHByaW50ZigiR0wgaW5pdGlhbGlzYXRpb24gZmFpbGVkIC0gZXhpdGluZ1xuIik7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKw0KKyAgICBpbml0X3NjZW5lKCk7DQorDQorICAgIGNyZWF0ZV90ZXh0dXJlKCk7DQorDQorICAgIHByaW50ZigiU3RhcnQgdGVzdC4uLlxuIik7CisKKyAgICByZW5kZXIoYXJnYz09MiA/IGF0b2koYXJndlsxXSkgOiBJVEVSQVRJT05TKTsNCisNCisgICAgZnJlZV9nbF9zdXJmYWNlKCk7DQorDQorICAgIHJldHVybiAwOw0KK30NCisNCitpbnQgaW5pdF9nbF9zdXJmYWNlKHZvaWQpDQorew0KKyAgICBFR0xpbnQgbnVtQ29uZmlncyA9IDE7DQorICAgIEVHTENvbmZpZyBteUNvbmZpZyA9IHswfTsNCisgICAgRUdMaW50IGF0dHJpYltdID0NCisgICAgew0KKyAgICAgICAgICAgIEVHTF9ERVBUSF9TSVpFLCAgICAgMTYsDQorICAgICAgICAgICAgRUdMX05PTkUNCisgICAgfTsNCisNCisgICAgaWYgKCAoZWdsRGlzcGxheSA9IGVnbEdldERpc3BsYXkoRUdMX0RFRkFVTFRfRElTUExBWSkpID09IEVHTF9OT19ESVNQTEFZICkNCisgICAgew0KKyAgICAgICAgcHJpbnRmKCJlZ2xHZXREaXNwbGF5IGZhaWxlZFxuIik7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKw0KKyAgICBpZiAoIGVnbEluaXRpYWxpemUoZWdsRGlzcGxheSwgTlVMTCwgTlVMTCkgIT0gRUdMX1RSVUUgKQ0KKyAgICB7DQorICAgICAgICBwcmludGYoImVnbEluaXRpYWxpemUgZmFpbGVkXG4iKTsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorDQorICAgIGlmICggZWdsQ2hvb3NlQ29uZmlnKGVnbERpc3BsYXksIGF0dHJpYiwgJm15Q29uZmlnLCAxLCAmbnVtQ29uZmlncykgIT0gRUdMX1RSVUUgKQ0KKyAgICB7DQorICAgICAgICBwcmludGYoImVnbENob29zZUNvbmZpZyBmYWlsZWRcbiIpOw0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisNCisgICAgaWYgKCAoZWdsU3VyZmFjZSA9IGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoZWdsRGlzcGxheSwgbXlDb25maWcsCisgICAgICAgICAgICBhbmRyb2lkX2NyZWF0ZURpc3BsYXlTdXJmYWNlKCksIDApKSA9PSBFR0xfTk9fU1VSRkFDRSApDQorICAgIHsNCisgICAgICAgIHByaW50ZigiZWdsQ3JlYXRlV2luZG93U3VyZmFjZSBmYWlsZWRcbiIpOw0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisNCisgICAgaWYgKCAoZWdsQ29udGV4dCA9IGVnbENyZWF0ZUNvbnRleHQoZWdsRGlzcGxheSwgbXlDb25maWcsIDAsIDApKSA9PSBFR0xfTk9fQ09OVEVYVCApDQorICAgIHsNCisgICAgICAgIHByaW50ZigiZWdsQ3JlYXRlQ29udGV4dCBmYWlsZWRcbiIpOw0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisNCisgICAgaWYgKCBlZ2xNYWtlQ3VycmVudChlZ2xEaXNwbGF5LCBlZ2xTdXJmYWNlLCBlZ2xTdXJmYWNlLCBlZ2xDb250ZXh0KSAhPSBFR0xfVFJVRSApDQorICAgIHsNCisgICAgICAgIHByaW50ZigiZWdsTWFrZUN1cnJlbnQgZmFpbGVkXG4iKTsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorDQorICAgIHJldHVybiAxOw0KK30NCisNCit2b2lkIGZyZWVfZ2xfc3VyZmFjZSh2b2lkKQ0KK3sNCisgICAgaWYgKGVnbERpc3BsYXkgIT0gRUdMX05PX0RJU1BMQVkpDQorICAgIHsNCisgICAgICAgIGVnbE1ha2VDdXJyZW50KCBFR0xfTk9fRElTUExBWSwgRUdMX05PX1NVUkZBQ0UsDQorICAgICAgICAgICAgICAgIEVHTF9OT19TVVJGQUNFLCBFR0xfTk9fQ09OVEVYVCApOw0KKyAgICAgICAgZWdsRGVzdHJveUNvbnRleHQoIGVnbERpc3BsYXksIGVnbENvbnRleHQgKTsNCisgICAgICAgIGVnbERlc3Ryb3lTdXJmYWNlKCBlZ2xEaXNwbGF5LCBlZ2xTdXJmYWNlICk7DQorICAgICAgICBlZ2xUZXJtaW5hdGUoIGVnbERpc3BsYXkgKTsNCisgICAgICAgIGVnbERpc3BsYXkgPSBFR0xfTk9fRElTUExBWTsNCisgICAgfQ0KK30NCisNCit2b2lkIGluaXRfc2NlbmUodm9pZCkNCit7DQorICAgIGdsRGlzYWJsZShHTF9ESVRIRVIpOworICAgIGdsRW5hYmxlKEdMX0NVTExfRkFDRSk7CisKKyAgICBmbG9hdCByYXRpbyA9IDMyMC4wZiAvIDQ4MC4wZjsKKyAgICBnbFZpZXdwb3J0KDAsIDAsIDMyMCwgNDgwKTsKKworICAgIGdsTWF0cml4TW9kZShHTF9QUk9KRUNUSU9OKTsKKyAgICBnbExvYWRJZGVudGl0eSgpOworICAgIGdsRnJ1c3R1bWYoLXJhdGlvLCByYXRpbywgLTEsIDEsIDEsIDEwKTsKKworICAgIGdsTWF0cml4TW9kZShHTF9NT0RFTFZJRVcpOw0KKyAgICBnbExvYWRJZGVudGl0eSgpOworICAgIGdsdUxvb2tBdCgKKyAgICAgICAgICAgIDAsIDAsIDMsICAvLyBleWUKKyAgICAgICAgICAgIDAsIDAsIDAsICAvLyBjZW50ZXIKKyAgICAgICAgICAgIDAsIDEsIDApOyAvLyB1cAorDQorICAgIGdsRW5hYmxlKEdMX1RFWFRVUkVfMkQpOw0KKyAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX1ZFUlRFWF9BUlJBWSk7DQorICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfVEVYVFVSRV9DT09SRF9BUlJBWSk7Cit9DQorDQordm9pZCBjcmVhdGVfdGV4dHVyZSh2b2lkKQ0KK3sNCisgICAgY29uc3QgdW5zaWduZWQgaW50IG9uID0gMHhmZjAwMDBmZjsKKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgb2ZmID0gMHhmZmZmZmZmZjsKKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgcGl4ZWxzW10gPQorICAgIHsKKyAgICAgICAgICAgIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsCisgICAgICAgICAgICBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLAorICAgICAgICAgICAgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwKKyAgICAgICAgICAgIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sCisgICAgICAgICAgICBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLAorICAgICAgICAgICAgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwKKyAgICAgICAgICAgIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsCisgICAgICAgICAgICBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLAorICAgIH07DQorICAgIGdsR2VuVGV4dHVyZXMoMSwgJnRleHR1cmUpOw0KKyAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIHRleHR1cmUpOw0KKyAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCQSwgOCwgOCwgMCwgR0xfUkdCQSwgR0xfVU5TSUdORURfQllURSwgcGl4ZWxzKTsNCisgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTkVBUkVTVCk7DQorICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX05FQVJFU1QpOw0KKyAgICBnbFRleEVudngoR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX01PREUsIEdMX1JFUExBQ0UpOw0KK30NCisNCit2b2lkIHJlbmRlcihpbnQgcXVhZHMpDQorew0KKyAgICBpbnQgaSwgajsNCisNCisgICAgY29uc3QgR0xmbG9hdCB2ZXJ0aWNlc1tdID0gew0KKyAgICAgICAgICAgIC0xLCAgLTEsICAwLA0KKyAgICAgICAgICAgICAxLCAgLTEsICAwLA0KKyAgICAgICAgICAgICAxLCAgIDEsICAwLA0KKyAgICAgICAgICAgIC0xLCAgIDEsICAwDQorICAgIH07DQorDQorICAgIGNvbnN0IEdMZml4ZWQgdGV4Q29vcmRzW10gPSB7DQorICAgICAgICAgICAgMCwgICAgICAgICAgICAwLA0KKyAgICAgICAgICAgIEZJWEVEX09ORSwgICAgMCwNCisgICAgICAgICAgICBGSVhFRF9PTkUsICAgIEZJWEVEX09ORSwNCisgICAgICAgICAgICAwLCAgICAgICAgICAgIEZJWEVEX09ORQ0KKyAgICB9Ow0KKw0KKyAgICBjb25zdCBHTHVzaG9ydCB0ZW1wbGF0ZVtdID0geyAwLCAxLCAyLCAgMCwgMiwgMyB9OworCisKKyAgICBHTHVzaG9ydCogaW5kaWNlcyA9IChHTHVzaG9ydCopbWFsbG9jKHF1YWRzKnNpemVvZih0ZW1wbGF0ZSkpOworICAgIGZvciAoaT0wIDsgaTxxdWFkcyA7IGkrKykKKyAgICAgICAgbWVtY3B5KGluZGljZXMrKHNpemVvZih0ZW1wbGF0ZSkvc2l6ZW9mKGluZGljZXNbMF0pKSppLCB0ZW1wbGF0ZSwgc2l6ZW9mKHRlbXBsYXRlKSk7CisNCisgICAgZ2xWZXJ0ZXhQb2ludGVyKDMsIEdMX0ZMT0FULCAwLCB2ZXJ0aWNlcyk7DQorICAgIGdsVGV4Q29vcmRQb2ludGVyKDIsIEdMX0ZJWEVELCAwLCB0ZXhDb29yZHMpOworCisgICAgLy8gbWFrZSBzdXJlIHRvIGRvIGEgY291cGxlIGVnbFN3YXBCdWZmZXJzIHRvIG1ha2Ugc3VyZSB0aGVyZSBhcmUKKyAgICAvLyBubyBwcm9ibGVtcyB3aXRoIHRoZSB2ZXJ5IGZpcnN0IG9uZXMgKHdobyBrbm93cykKKyAgICBnbENsZWFyQ29sb3IoMC40LCAwLjQsIDAuNCwgMC40KTsKKyAgICBnbENsZWFyKEdMX0RFUFRIX0JVRkZFUl9CSVQgfCBHTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICBlZ2xTd2FwQnVmZmVycyhlZ2xEaXNwbGF5LCBlZ2xTdXJmYWNlKTsKKyAgICBnbENsZWFyQ29sb3IoMC42LCAwLjYsIDAuNiwgMC42KTsKKyAgICBnbENsZWFyKEdMX0RFUFRIX0JVRkZFUl9CSVQgfCBHTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICBlZ2xTd2FwQnVmZmVycyhlZ2xEaXNwbGF5LCBlZ2xTdXJmYWNlKTsKKyAgICBnbENsZWFyQ29sb3IoMS4wLCAxLjAsIDEuMCwgMS4wKTsKKworICAgIGZvciAoaj0wIDsgajwxMCA7IGorKykgeworICAgICAgICBwcmludGYoImxvb3AgJWQgLyAxMCAoJWQgcXVhZHMgLyBsb29wKVxuIiwgaiwgcXVhZHMpOworCisgICAgICAgIGludCBuZWxlbSA9IHNpemVvZih0ZW1wbGF0ZSkvc2l6ZW9mKHRlbXBsYXRlWzBdKTsKKyAgICAgICAgZ2xDbGVhcihHTF9ERVBUSF9CVUZGRVJfQklUIHwgR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgICAgIGdsRHJhd0VsZW1lbnRzKEdMX1RSSUFOR0xFUywgbmVsZW0qcXVhZHMsIEdMX1VOU0lHTkVEX1NIT1JULCBpbmRpY2VzKTsKKyAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZWdsRGlzcGxheSwgZWdsU3VyZmFjZSk7CisgICAgfQorCisgICAgZnJlZShpbmRpY2VzKTsNCit9DQorCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2VuIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL2dlbgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xYzQ5ODYxCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL2dlbgpAQCAtMCwwICsxLDk5IEBACisjIS9iaW4vc2gKK3JtIC1yZiBvdXQgZ2VuZXJhdGVkCisKK21rZGlyIG91dAorbWtkaXIgLXAgb3V0L2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzCitta2RpciAtcCBvdXQvY29tL2dvb2dsZS9hbmRyb2lkL2dsZXNfam5pCitta2RpciAtcCBvdXQvYW5kcm9pZC9ncmFwaGljcworCitlY2hvICJwYWNrYWdlIGFuZHJvaWQuZ3JhcGhpY3M7IiA+IG91dC9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5qYXZhCitlY2hvICJwdWJsaWMgaW50ZXJmYWNlIENhbnZhcyB7fSIgPj4gb3V0L2FuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzLmphdmEKKworR0xGSUxFPW91dC9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTC5qYXZhCitjcCBzdHVicy9HTEhlYWRlci5qYXZhLWlmICRHTEZJTEUKKworR0xHRU5fRklMRVM9IkNGdW5jLmphdmEgQ1R5cGUuamF2YSBDb2RlRW1pdHRlci5qYXZhIEdlbmVyYXRlR0wuamF2YSBKRnVuYy5qYXZhIEpUeXBlLmphdmEgSm5pQ29kZUVtaXR0ZXIuamF2YSBQYXJhbWV0ZXJDaGVja2VyLmphdmEiCisKK3B1c2hkIHNyYyA+IC9kZXYvbnVsbAoramF2YWMgJHtHTEdFTl9GSUxFU30KK3BvcGQgPiAvZGV2L251bGwKK2phdmEgLWNsYXNzcGF0aCBzcmMgR2VuZXJhdGVHTCAtYyBnbHNwZWMtMS4wIGdsc3BlYy0xLjBleHQgZ2xzcGVjLTEuMSBnbHNwZWMtMS4xZXh0IGdsc3BlYy0xLjFleHRwYWNrIGdsc3BlYy1jaGVja3MKKworcHVzaGQgb3V0ID4gL2Rldi9udWxsCitta2RpciBjbGFzc2VzCitqYXZhYyAtZCBjbGFzc2VzIGNvbS9nb29nbGUvYW5kcm9pZC9nbGVzX2puaS9HTEltcGwuamF2YSBqYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDEwLmphdmEgamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMEV4dC5qYXZhIGphdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTEuamF2YSBqYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDExRXh0LmphdmEgamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMUV4dGVuc2lvblBhY2suamF2YQorcG9wZCA+IC9kZXYvbnVsbAorCitybSAtcmYgZ2VuZXJhdGVkCitta2RpciAtcCBnZW5lcmF0ZWQvQworY3Agb3V0L2NvbV9nb29nbGVfYW5kcm9pZF9nbGVzX2puaV9HTEltcGwuY3BwIGdlbmVyYXRlZC9DCitjcCAtciBvdXQvY29tIGdlbmVyYXRlZAorY3AgLXIgb3V0L2phdmF4IGdlbmVyYXRlZAorCitybSAtcmYgb3V0CisKKyMgY29tX2dvb2dsZV9hbmRyb2lkX2dsZXNfam5pX0dMSW1wbC5jcHAKK2lmIGNtcCAuLi8uLi8uLi9mcmFtZXdvcmtzL2Jhc2UvY29yZS9qbmkvY29tX2dvb2dsZV9hbmRyb2lkX2dsZXNfam5pX0dMSW1wbC5jcHAgZ2VuZXJhdGVkL0MvY29tX2dvb2dsZV9hbmRyb2lkX2dsZXNfam5pX0dMSW1wbC5jcHAgOyB0aGVuCitlY2hvIGNvbV9nb29nbGVfYW5kcm9pZF9nbGVzX2puaV9HTEltcGwuY3BwIHVuY2hhbmdlZAorZWxzZQorZWNobyBQbGVhc2UgZWRpdCAuLi8uLi8uLi9mcmFtZXdvcmtzL2Jhc2UvY29yZS9qbmkvY29tX2dvb2dsZV9hbmRyb2lkX2dsZXNfam5pX0dMSW1wbC5jcHAKK2VjaG8gUGxlYXNlIGNwIGdlbmVyYXRlZC9DL2NvbV9nb29nbGVfYW5kcm9pZF9nbGVzX2puaV9HTEltcGwuY3BwIC4uLy4uLy4uL2ZyYW1ld29ya3MvYmFzZS9jb3JlL2puaQorZmkKKworIyBHTEltcGwuamF2YQoraWYgY21wIC4uLy4uL2phdmEvY29tL2dvb2dsZS9hbmRyb2lkL2dsZXNfam5pL0dMSW1wbC5qYXZhIGdlbmVyYXRlZC9jb20vZ29vZ2xlL2FuZHJvaWQvZ2xlc19qbmkvR0xJbXBsLmphdmEgOyB0aGVuCitlY2hvIEdMSW1wbC5qYXZhIHVuY2hhbmdlZAorZWxzZQorZWNobyBQbGVhc2UgZWRpdCAuLi8uLi9qYXZhL2NvbS9nb29nbGUvYW5kcm9pZC9nbGVzX2puaS9HTEltcGwuamF2YQorZWNobyBQbGVhc2UgY3AgZ2VuZXJhdGVkL2NvbS9nb29nbGUvYW5kcm9pZC9nbGVzX2puaS9HTEltcGwuamF2YSAuLi8uLi9qYXZhL2NvbS9nb29nbGUvYW5kcm9pZC9nbGVzX2puaQorZmkKKworIyBHTC5qYXZhCitpZiBjbXAgLi4vLi4vamF2YS9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTC5qYXZhIGdlbmVyYXRlZC9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTC5qYXZhIDsgdGhlbgorZWNobyBHTC5qYXZhIHVuY2hhbmdlZAorZWxzZQorZWNobyBQbGVhc2UgZWRpdCAuLi8uLi9qYXZhL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMLmphdmEKK2VjaG8gUGxlYXNlIGNwIGdlbmVyYXRlZC9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTC5qYXZhIC4uLy4uL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wuamF2YQorZmkKKworIyBHTDEwLmphdmEKK2lmIGNtcCAuLi8uLi9qYXZhL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTAuamF2YSBnZW5lcmF0ZWQvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMC5qYXZhIDsgdGhlbgorZWNobyBHTDEwLmphdmEgdW5jaGFuZ2VkCitlbHNlCitlY2hvIFBsZWFzZSBlZGl0IC4uLy4uL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMC5qYXZhCitlY2hvIFBsZWFzZSBjcCBnZW5lcmF0ZWQvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMC5qYXZhIC4uLy4uL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMC5qYXZhCitmaQorCisjIEdMMTBFeHQuamF2YQoraWYgY21wIC4uLy4uL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMEV4dC5qYXZhIGdlbmVyYXRlZC9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDEwRXh0LmphdmEgOyB0aGVuCitlY2hvIEdMMTBFeHQuamF2YSB1bmNoYW5nZWQKK2Vsc2UKK2VjaG8gUGxlYXNlIGVkaXQgLi4vLi4vamF2YS9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDEwRXh0LmphdmEKK2VjaG8gUGxlYXNlIGNwIGdlbmVyYXRlZC9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDEwRXh0LmphdmEgLi4vLi4vamF2YS9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDEwRXh0LmphdmEKK2ZpCisKKyMgR0wxMS5qYXZhCitpZiBjbXAgLi4vLi4vamF2YS9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDExLmphdmEgZ2VuZXJhdGVkL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTEuamF2YSA7IHRoZW4KK2VjaG8gR0wxMS5qYXZhIHVuY2hhbmdlZAorZWxzZQorZWNobyBQbGVhc2UgZWRpdCAuLi8uLi9qYXZhL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTEuamF2YQorZWNobyBQbGVhc2UgY3AgZ2VuZXJhdGVkL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTEuamF2YSAuLi8uLi9qYXZhL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTEuamF2YQorZmkKKworIyBHTDExRXh0LmphdmEKK2lmIGNtcCAuLi8uLi9qYXZhL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTFFeHQuamF2YSBnZW5lcmF0ZWQvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMUV4dC5qYXZhIDsgdGhlbgorZWNobyBHTDExRXh0LmphdmEgdW5jaGFuZ2VkCitlbHNlCitlY2hvIFBsZWFzZSBlZGl0IC4uLy4uL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMUV4dC5qYXZhCitlY2hvIFBsZWFzZSBjcCBnZW5lcmF0ZWQvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMUV4dC5qYXZhIC4uLy4uL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMUV4dC5qYXZhCitmaQorCisjIEdMMTFFeHRlbnNpb25QYWNrLmphdmEKK2lmIGNtcCAuLi8uLi9qYXZhL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTFFeHRlbnNpb25QYWNrLmphdmEgZ2VuZXJhdGVkL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTFFeHRlbnNpb25QYWNrLmphdmEgOyB0aGVuCitlY2hvIEdMMTFFeHRlbnNpb25QYWNrLmphdmEgdW5jaGFuZ2VkCitlbHNlCitlY2hvIFBsZWFzZSBlZGl0IC4uLy4uL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMUV4dGVuc2lvblBhY2suamF2YQorZWNobyBQbGVhc2UgY3AgZ2VuZXJhdGVkL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTFFeHRlbnNpb25QYWNrLmphdmEgLi4vLi4vamF2YS9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDExRXh0ZW5zaW9uUGFjay5qYXZhCitmaQorCitybSAtcmYgZ2VuZXJhdGVkCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2xzcGVjLTEuMCBiL29wZW5nbC90b29scy9nbGdlbi9nbHNwZWMtMS4wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NDIzMjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2xzcGVjLTEuMApAQCAtMCwwICsxLDEwNiBAQAordm9pZCBnbEFjdGl2ZVRleHR1cmUgKCBHTGVudW0gdGV4dHVyZSApDQordm9pZCBnbEFscGhhRnVuYyAoIEdMZW51bSBmdW5jLCBHTGNsYW1wZiByZWYgKQ0KK3ZvaWQgZ2xBbHBoYUZ1bmN4ICggR0xlbnVtIGZ1bmMsIEdMY2xhbXB4IHJlZiApDQordm9pZCBnbEJpbmRUZXh0dXJlICggR0xlbnVtIHRhcmdldCwgR0x1aW50IHRleHR1cmUgKQ0KK3ZvaWQgZ2xCbGVuZEZ1bmMgKCBHTGVudW0gc2ZhY3RvciwgR0xlbnVtIGRmYWN0b3IgKQ0KK3ZvaWQgZ2xDbGVhciAoIEdMYml0ZmllbGQgbWFzayApDQordm9pZCBnbENsZWFyQ29sb3IgKCBHTGNsYW1wZiByZWQsIEdMY2xhbXBmIGdyZWVuLCBHTGNsYW1wZiBibHVlLCBHTGNsYW1wZiBhbHBoYSApDQordm9pZCBnbENsZWFyQ29sb3J4ICggR0xjbGFtcHggcmVkLCBHTGNsYW1weCBncmVlbiwgR0xjbGFtcHggYmx1ZSwgR0xjbGFtcHggYWxwaGEgKQ0KK3ZvaWQgZ2xDbGVhckRlcHRoZiAoIEdMY2xhbXBmIGRlcHRoICkNCit2b2lkIGdsQ2xlYXJEZXB0aHggKCBHTGNsYW1weCBkZXB0aCApDQordm9pZCBnbENsZWFyU3RlbmNpbCAoIEdMaW50IHMgKQ0KK3ZvaWQgZ2xDbGllbnRBY3RpdmVUZXh0dXJlICggR0xlbnVtIHRleHR1cmUgKQ0KK3ZvaWQgZ2xDb2xvcjRmICggR0xmbG9hdCByZWQsIEdMZmxvYXQgZ3JlZW4sIEdMZmxvYXQgYmx1ZSwgR0xmbG9hdCBhbHBoYSApDQordm9pZCBnbENvbG9yNHggKCBHTGZpeGVkIHJlZCwgR0xmaXhlZCBncmVlbiwgR0xmaXhlZCBibHVlLCBHTGZpeGVkIGFscGhhICkNCit2b2lkIGdsQ29sb3JNYXNrICggR0xib29sZWFuIHJlZCwgR0xib29sZWFuIGdyZWVuLCBHTGJvb2xlYW4gYmx1ZSwgR0xib29sZWFuIGFscGhhICkNCit2b2lkIGdsQ29sb3JQb2ludGVyICggR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIgKQ0KK3ZvaWQgZ2xDb21wcmVzc2VkVGV4SW1hZ2UyRCAoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEgKQ0KK3ZvaWQgZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCAoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSApDQordm9pZCBnbENvcHlUZXhJbWFnZTJEICggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciApDQordm9pZCBnbENvcHlUZXhTdWJJbWFnZTJEICggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0ICkNCit2b2lkIGdsQ3VsbEZhY2UgKCBHTGVudW0gbW9kZSApDQordm9pZCBnbERlbGV0ZVRleHR1cmVzICggR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnRleHR1cmVzICkNCit2b2lkIGdsRGVwdGhGdW5jICggR0xlbnVtIGZ1bmMgKQ0KK3ZvaWQgZ2xEZXB0aE1hc2sgKCBHTGJvb2xlYW4gZmxhZyApDQordm9pZCBnbERlcHRoUmFuZ2VmICggR0xjbGFtcGYgek5lYXIsIEdMY2xhbXBmIHpGYXIgKQ0KK3ZvaWQgZ2xEZXB0aFJhbmdleCAoIEdMY2xhbXB4IHpOZWFyLCBHTGNsYW1weCB6RmFyICkNCit2b2lkIGdsRGlzYWJsZSAoIEdMZW51bSBjYXAgKQ0KK3ZvaWQgZ2xEaXNhYmxlQ2xpZW50U3RhdGUgKCBHTGVudW0gYXJyYXkgKQ0KK3ZvaWQgZ2xEcmF3QXJyYXlzICggR0xlbnVtIG1vZGUsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50ICkNCit2b2lkIGdsRHJhd0VsZW1lbnRzICggR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmluZGljZXMgKQ0KK3ZvaWQgZ2xFbmFibGUgKCBHTGVudW0gY2FwICkNCit2b2lkIGdsRW5hYmxlQ2xpZW50U3RhdGUgKCBHTGVudW0gYXJyYXkgKQ0KK3ZvaWQgZ2xGaW5pc2ggKCB2b2lkICkNCit2b2lkIGdsRmx1c2ggKCB2b2lkICkNCit2b2lkIGdsRm9nZiAoIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSApDQordm9pZCBnbEZvZ2Z2ICggR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMgKQ0KK3ZvaWQgZ2xGb2d4ICggR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtICkNCit2b2lkIGdsRm9neHYgKCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyApDQordm9pZCBnbEZyb250RmFjZSAoIEdMZW51bSBtb2RlICkNCit2b2lkIGdsRnJ1c3R1bWYgKCBHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyICkNCit2b2lkIGdsRnJ1c3R1bXggKCBHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyICkNCit2b2lkIGdsR2VuVGV4dHVyZXMgKCBHTHNpemVpIG4sIEdMdWludCAqdGV4dHVyZXMgKQ0KK0dMZW51bSBnbEdldEVycm9yICggdm9pZCApDQordm9pZCBnbEdldEludGVnZXJ2ICggR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zICkNCitjb25zdCBHTHVieXRlICogZ2xHZXRTdHJpbmcgKCBHTGVudW0gbmFtZSApDQordm9pZCBnbEhpbnQgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gbW9kZSApDQordm9pZCBnbExpZ2h0TW9kZWxmICggR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtICkNCit2b2lkIGdsTGlnaHRNb2RlbGZ2ICggR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMgKQ0KK3ZvaWQgZ2xMaWdodE1vZGVseCAoIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSApDQordm9pZCBnbExpZ2h0TW9kZWx4diAoIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zICkNCit2b2lkIGdsTGlnaHRmICggR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0gKQ0KK3ZvaWQgZ2xMaWdodGZ2ICggR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyApDQordm9pZCBnbExpZ2h0eCAoIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtICkNCit2b2lkIGdsTGlnaHR4diAoIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMgKQ0KK3ZvaWQgZ2xMaW5lV2lkdGggKCBHTGZsb2F0IHdpZHRoICkNCit2b2lkIGdsTGluZVdpZHRoeCAoIEdMZml4ZWQgd2lkdGggKQ0KK3ZvaWQgZ2xMb2FkSWRlbnRpdHkgKCB2b2lkICkNCit2b2lkIGdsTG9hZE1hdHJpeGYgKCBjb25zdCBHTGZsb2F0ICptICkNCit2b2lkIGdsTG9hZE1hdHJpeHggKCBjb25zdCBHTGZpeGVkICptICkNCit2b2lkIGdsTG9naWNPcCAoIEdMZW51bSBvcGNvZGUgKQ0KK3ZvaWQgZ2xNYXRlcmlhbGYgKCBHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtICkNCit2b2lkIGdsTWF0ZXJpYWxmdiAoIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyApDQordm9pZCBnbE1hdGVyaWFseCAoIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0gKQ0KK3ZvaWQgZ2xNYXRlcmlhbHh2ICggR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zICkNCit2b2lkIGdsTWF0cml4TW9kZSAoIEdMZW51bSBtb2RlICkNCit2b2lkIGdsTXVsdE1hdHJpeGYgKCBjb25zdCBHTGZsb2F0ICptICkNCit2b2lkIGdsTXVsdE1hdHJpeHggKCBjb25zdCBHTGZpeGVkICptICkNCit2b2lkIGdsTXVsdGlUZXhDb29yZDRmICggR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgciwgR0xmbG9hdCBxICkNCit2b2lkIGdsTXVsdGlUZXhDb29yZDR4ICggR0xlbnVtIHRhcmdldCwgR0xmaXhlZCBzLCBHTGZpeGVkIHQsIEdMZml4ZWQgciwgR0xmaXhlZCBxICkNCit2b2lkIGdsTm9ybWFsM2YgKCBHTGZsb2F0IG54LCBHTGZsb2F0IG55LCBHTGZsb2F0IG56ICkNCit2b2lkIGdsTm9ybWFsM3ggKCBHTGZpeGVkIG54LCBHTGZpeGVkIG55LCBHTGZpeGVkIG56ICkNCit2b2lkIGdsTm9ybWFsUG9pbnRlciAoIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyICkNCit2b2lkIGdsT3J0aG9mICggR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhciApDQordm9pZCBnbE9ydGhveCAoIEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLCBHTGZpeGVkIHpOZWFyLCBHTGZpeGVkIHpGYXIgKQ0KK3ZvaWQgZ2xQaXhlbFN0b3JlaSAoIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0gKQ0KK3ZvaWQgZ2xQb2ludFNpemUgKCBHTGZsb2F0IHNpemUgKQ0KK3ZvaWQgZ2xQb2ludFNpemV4ICggR0xmaXhlZCBzaXplICkNCit2b2lkIGdsUG9seWdvbk9mZnNldCAoIEdMZmxvYXQgZmFjdG9yLCBHTGZsb2F0IHVuaXRzICkNCit2b2lkIGdsUG9seWdvbk9mZnNldHggKCBHTGZpeGVkIGZhY3RvciwgR0xmaXhlZCB1bml0cyApDQordm9pZCBnbFBvcE1hdHJpeCAoIHZvaWQgKQ0KK3ZvaWQgZ2xQdXNoTWF0cml4ICggdm9pZCApDQordm9pZCBnbFJlYWRQaXhlbHMgKCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqcGl4ZWxzICkNCit2b2lkIGdsUm90YXRlZiAoIEdMZmxvYXQgYW5nbGUsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHogKQ0KK3ZvaWQgZ2xSb3RhdGV4ICggR0xmaXhlZCBhbmdsZSwgR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeiApDQordm9pZCBnbFNhbXBsZUNvdmVyYWdlICggR0xjbGFtcGYgdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQgKQ0KK3ZvaWQgZ2xTYW1wbGVDb3ZlcmFnZXggKCBHTGNsYW1weCB2YWx1ZSwgR0xib29sZWFuIGludmVydCApDQordm9pZCBnbFNjYWxlZiAoIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHogKQ0KK3ZvaWQgZ2xTY2FsZXggKCBHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6ICkNCit2b2lkIGdsU2Npc3NvciAoIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0ICkNCit2b2lkIGdsU2hhZGVNb2RlbCAoIEdMZW51bSBtb2RlICkNCit2b2lkIGdsU3RlbmNpbEZ1bmMgKCBHTGVudW0gZnVuYywgR0xpbnQgcmVmLCBHTHVpbnQgbWFzayApDQordm9pZCBnbFN0ZW5jaWxNYXNrICggR0x1aW50IG1hc2sgKQ0KK3ZvaWQgZ2xTdGVuY2lsT3AgKCBHTGVudW0gZmFpbCwgR0xlbnVtIHpmYWlsLCBHTGVudW0genBhc3MgKQ0KK3ZvaWQgZ2xUZXhDb29yZFBvaW50ZXIgKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciApDQordm9pZCBnbFRleEVudmYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0gKQ0KK3ZvaWQgZ2xUZXhFbnZmdiAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zICkNCit2b2lkIGdsVGV4RW52eCAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSApDQordm9pZCBnbFRleEVudnh2ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMgKQ0KK3ZvaWQgZ2xUZXhJbWFnZTJEICggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMgKQ0KK3ZvaWQgZ2xUZXhQYXJhbWV0ZXJmICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtICkNCit2b2lkIGdsVGV4UGFyYW1ldGVyeCAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSApDQordm9pZCBnbFRleFN1YkltYWdlMkQgKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyApDQordm9pZCBnbFRyYW5zbGF0ZWYgKCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6ICkNCit2b2lkIGdsVHJhbnNsYXRleCAoIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHogKQ0KK3ZvaWQgZ2xWZXJ0ZXhQb2ludGVyICggR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIgKQ0KK3ZvaWQgZ2xWaWV3cG9ydCAoIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0ICkNCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2xzcGVjLTEuMGV4dCBiL29wZW5nbC90b29scy9nbGdlbi9nbHNwZWMtMS4wZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMTk3NTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2xzcGVjLTEuMGV4dApAQCAtMCwwICsxIEBACitHTGJpdGZpZWxkIGdsUXVlcnlNYXRyaXh4T0VTICggR0xmaXhlZCAqbWFudGlzc2EsIEdMaW50ICpleHBvbmVudCApDQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL2dsc3BlYy0xLjEgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2xzcGVjLTEuMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTQ5YTdmCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL2dsc3BlYy0xLjEKQEAgLTAsMCArMSw0MiBAQAordm9pZCBnbEJpbmRCdWZmZXIgKCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgYnVmZmVyICkNCit2b2lkIGdsQnVmZmVyRGF0YSAoIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhLCBHTGVudW0gdXNhZ2UgKQ0KK3ZvaWQgZ2xCdWZmZXJTdWJEYXRhICggR0xlbnVtIHRhcmdldCwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSApDQordm9pZCBnbENsaXBQbGFuZWYgKCBHTGVudW0gcGxhbmUsIGNvbnN0IEdMZmxvYXQgKmVxdWF0aW9uICkNCit2b2lkIGdsQ2xpcFBsYW5leCAoIEdMZW51bSBwbGFuZSwgY29uc3QgR0xmaXhlZCAqZXF1YXRpb24gKQ0KK3ZvaWQgZ2xDb2xvcjR1YiAoIEdMdWJ5dGUgcmVkLCBHTHVieXRlIGdyZWVuLCBHTHVieXRlIGJsdWUsIEdMdWJ5dGUgYWxwaGEgKQ0KK3ZvaWQgZ2xDb2xvclBvaW50ZXIgKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMaW50IG9mZnNldCApDQordm9pZCBnbERlbGV0ZUJ1ZmZlcnMgKCBHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqYnVmZmVycyApDQordm9pZCBnbERyYXdFbGVtZW50cyAoIEdMZW51bSBtb2RlLCBHTHNpemVpIGNvdW50LCBHTGVudW0gdHlwZSwgR0xpbnQgb2Zmc2V0ICkNCit2b2lkIGdsR2VuQnVmZmVycyAoIEdMc2l6ZWkgbiwgR0x1aW50ICpidWZmZXJzICkNCit2b2lkIGdsR2V0Qm9vbGVhbnYgKCBHTGVudW0gcG5hbWUsIEdMYm9vbGVhbiAqcGFyYW1zICkNCit2b2lkIGdsR2V0QnVmZmVyUGFyYW1ldGVyaXYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMgKQ0KK3ZvaWQgZ2xHZXRDbGlwUGxhbmVmICggR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICplcW4gKQ0KK3ZvaWQgZ2xHZXRDbGlwUGxhbmV4ICggR0xlbnVtIHBuYW1lLCBHTGZpeGVkICplcW4gKQ0KK3ZvaWQgZ2xHZXRGaXhlZHYgKCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyApDQordm9pZCBnbEdldEZsb2F0diAoIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zICkNCit2b2lkIGdsR2V0TGlnaHRmdiAoIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMgKQ0KK3ZvaWQgZ2xHZXRMaWdodHh2ICggR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyApDQordm9pZCBnbEdldE1hdGVyaWFsZnYgKCBHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMgKQ0KK3ZvaWQgZ2xHZXRNYXRlcmlhbHh2ICggR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zICkNCit2b2lkIGdsR2V0VGV4RW52aXYgKCBHTGVudW0gZW52LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMgKQ0KK3ZvaWQgZ2xHZXRUZXhFbnZ4diAoIEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zICkNCit2b2lkIGdsR2V0VGV4UGFyYW1ldGVyZnYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyApDQordm9pZCBnbEdldFRleFBhcmFtZXRlcml2ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zICkNCit2b2lkIGdsR2V0VGV4UGFyYW1ldGVyeHYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyApDQorR0xib29sZWFuIGdsSXNCdWZmZXIgKCBHTHVpbnQgYnVmZmVyICkNCitHTGJvb2xlYW4gZ2xJc0VuYWJsZWQgKCBHTGVudW0gY2FwICkNCitHTGJvb2xlYW4gZ2xJc1RleHR1cmUgKCBHTHVpbnQgdGV4dHVyZSApDQordm9pZCBnbE5vcm1hbFBvaW50ZXIgKCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMaW50IG9mZnNldCApDQordm9pZCBnbFBvaW50UGFyYW1ldGVyZiAoIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSApDQordm9pZCBnbFBvaW50UGFyYW1ldGVyZnYgKCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyApDQordm9pZCBnbFBvaW50UGFyYW1ldGVyeCAoIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSApDQordm9pZCBnbFBvaW50UGFyYW1ldGVyeHYgKCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyApDQordm9pZCBnbFBvaW50U2l6ZVBvaW50ZXJPRVMgKCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciApDQordm9pZCBnbFRleENvb3JkUG9pbnRlciAoIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgR0xpbnQgb2Zmc2V0ICkNCit2b2lkIGdsVGV4RW52aSAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0gKQ0KK3ZvaWQgZ2xUZXhFbnZpdiAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyApDQordm9pZCBnbFRleFBhcmFtZXRlcmZ2ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMgKQ0KK3ZvaWQgZ2xUZXhQYXJhbWV0ZXJpICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSApDQordm9pZCBnbFRleFBhcmFtZXRlcml2ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zICkNCit2b2lkIGdsVGV4UGFyYW1ldGVyeHYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyApDQordm9pZCBnbFZlcnRleFBvaW50ZXIgKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMaW50IG9mZnNldCApDQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL2dsc3BlYy0xLjFleHQgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2xzcGVjLTEuMWV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzA4YzczCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL2dsc3BlYy0xLjFleHQKQEAgLTAsMCArMSwxNiBAQAordm9pZCBnbEN1cnJlbnRQYWxldHRlTWF0cml4T0VTICggR0x1aW50IG1hdHJpeHBhbGV0dGVpbmRleCApDQordm9pZCBnbERyYXdUZXhmT0VTICggR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3aWR0aCwgR0xmbG9hdCBoZWlnaHQgKQ0KK3ZvaWQgZ2xEcmF3VGV4ZnZPRVMgKCBjb25zdCBHTGZsb2F0ICpjb29yZHMgKQ0KK3ZvaWQgZ2xEcmF3VGV4aU9FUyAoIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHdpZHRoLCBHTGludCBoZWlnaHQgKQ0KK3ZvaWQgZ2xEcmF3VGV4aXZPRVMgKCBjb25zdCBHTGludCAqY29vcmRzICkNCit2b2lkIGdsRHJhd1RleHNPRVMgKCBHTHNob3J0IHgsIEdMc2hvcnQgeSwgR0xzaG9ydCB6LCBHTHNob3J0IHdpZHRoLCBHTHNob3J0IGhlaWdodCApDQordm9pZCBnbERyYXdUZXhzdk9FUyAoIGNvbnN0IEdMc2hvcnQgKmNvb3JkcyApDQordm9pZCBnbERyYXdUZXh4T0VTICggR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeiwgR0xmaXhlZCB3aWR0aCwgR0xmaXhlZCBoZWlnaHQgKQ0KK3ZvaWQgZ2xEcmF3VGV4eHZPRVMgKCBjb25zdCBHTGZpeGVkICpjb29yZHMgKQ0KK3ZvaWQgZ2xFbmFibGUgKCBHTGVudW0gY2FwICkNCit2b2lkIGdsRW5hYmxlQ2xpZW50U3RhdGUgKCBHTGVudW0gYXJyYXkgKQ0KK3ZvaWQgZ2xMb2FkUGFsZXR0ZUZyb21Nb2RlbFZpZXdNYXRyaXhPRVMgKCB2b2lkICkNCit2b2lkIGdsTWF0cml4SW5kZXhQb2ludGVyT0VTICggR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIgKQ0KK3ZvaWQgZ2xNYXRyaXhJbmRleFBvaW50ZXJPRVMgKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMaW50IG9mZnNldCApDQordm9pZCBnbFdlaWdodFBvaW50ZXJPRVMgKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciApDQordm9pZCBnbFdlaWdodFBvaW50ZXJPRVMgKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMaW50IG9mZnNldCApDQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL2dsc3BlYy0xLjFleHRwYWNrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL2dsc3BlYy0xLjFleHRwYWNrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhOWU2ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2xzcGVjLTEuMWV4dHBhY2sKQEAgLTAsMCArMSwzOCBAQAordm9pZCBnbEJpbmRGcmFtZWJ1ZmZlck9FUyAoIEdMaW50IHRhcmdldCwgR0xpbnQgZnJhbWVidWZmZXIgKQordm9pZCBnbEJpbmRSZW5kZXJidWZmZXJPRVMgKCBHTGludCB0YXJnZXQsIEdMaW50IHJlbmRlcmJ1ZmZlciApCit2b2lkIGdsQmluZFRleHR1cmUgKCBHTGludCB0YXJnZXQsIEdMaW50IHRleHR1cmUgKQordm9pZCBnbEJsZW5kRXF1YXRpb24gKCBHTGludCBtb2RlICkKK3ZvaWQgZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGUgKCBHTGludCBtb2RlUkdCLCBHTGludCBtb2RlQWxwaGEgKQordm9pZCBnbEJsZW5kRnVuY1NlcGFyYXRlICggR0xpbnQgc3JjUkdCLCBHTGludCBkc3RSR0IsIEdMaW50IHNyY0FscGhhLCBHTGludCBkc3RBbHBoYSApCitHTGludCBnbENoZWNrRnJhbWVidWZmZXJTdGF0dXNPRVMgKCBHTGludCB0YXJnZXQgKQordm9pZCBnbENvbXByZXNzZWRUZXhJbWFnZTJEICggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSApCit2b2lkIGdsQ29weVRleEltYWdlMkQgKCBHTGludCB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgd2lkdGgsIEdMaW50IGhlaWdodCwgR0xpbnQgYm9yZGVyICkKK3ZvaWQgZ2xEZWxldGVGcmFtZWJ1ZmZlcnNPRVMgKCBHTGludCBuLCBHTGludCAqZnJhbWVidWZmZXJzICkKK3ZvaWQgZ2xEZWxldGVSZW5kZXJidWZmZXJzT0VTICggR0xpbnQgbiwgR0xpbnQgKnJlbmRlcmJ1ZmZlcnMgKQordm9pZCBnbEVuYWJsZSAoIEdMaW50IGNhcCApCit2b2lkIGdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJPRVMgKCBHTGludCB0YXJnZXQsIEdMaW50IGF0dGFjaG1lbnQsIEdMaW50IHJlbmRlcmJ1ZmZlcnRhcmdldCwgR0xpbnQgcmVuZGVyYnVmZmVyICkKK3ZvaWQgZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE9FUyAoIEdMaW50IHRhcmdldCwgR0xpbnQgYXR0YWNobWVudCwgR0xpbnQgdGV4dGFyZ2V0LCBHTGludCB0ZXh0dXJlLCBHTGludCBsZXZlbCApCit2b2lkIGdsR2VuZXJhdGVNaXBtYXBPRVMgKCBHTGludCB0YXJnZXQgKQordm9pZCBnbEdlbkZyYW1lYnVmZmVyc09FUyAoIEdMaW50IG4sIEdMaW50ICpmcmFtZWJ1ZmZlcnMgKQordm9pZCBnbEdlblJlbmRlcmJ1ZmZlcnNPRVMgKCBHTGludCBuLCBHTGludCAqcmVuZGVyYnVmZmVycyApCit2b2lkIGdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXZPRVMgKCBHTGludCB0YXJnZXQsIEdMaW50IGF0dGFjaG1lbnQsIEdMaW50IHBuYW1lLCBHTGludCAqcGFyYW1zICkKK3ZvaWQgZ2xHZXRJbnRlZ2VydiAoIEdMaW50IHBuYW1lLCBHTGludCAqcGFyYW1zICkKK3ZvaWQgZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdk9FUyAoIEdMaW50IHRhcmdldCwgR0xpbnQgcG5hbWUsIEdMaW50ICpwYXJhbXMgKQordm9pZCBnbEdldFRleEdlbmZ2ICggR0xpbnQgY29vcmQsIEdMaW50IHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMgKQordm9pZCBnbEdldFRleEdlbml2ICggR0xpbnQgY29vcmQsIEdMaW50IHBuYW1lLCBHTGludCAqcGFyYW1zICkKK3ZvaWQgZ2xHZXRUZXhHZW54diAoIEdMaW50IGNvb3JkLCBHTGludCBwbmFtZSwgR0xpbnQgKnBhcmFtcyApCitHTGJvb2xlYW4gZ2xJc0ZyYW1lYnVmZmVyT0VTICggR0xpbnQgZnJhbWVidWZmZXIgKQorR0xib29sZWFuIGdsSXNSZW5kZXJidWZmZXJPRVMgKCBHTGludCByZW5kZXJidWZmZXIgKQordm9pZCBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VPRVMgKCBHTGludCB0YXJnZXQsIEdMaW50IGludGVybmFsZm9ybWF0LCBHTGludCB3aWR0aCwgR0xpbnQgaGVpZ2h0ICkKK3ZvaWQgZ2xTdGVuY2lsT3AgKCBHTGludCBmYWlsLCBHTGludCB6ZmFpbCwgR0xpbnQgenBhc3MgKQordm9pZCBnbFRleEVudmYgKCBHTGludCB0YXJnZXQsIEdMaW50IHBuYW1lLCBHTGZsb2F0IHBhcmFtICkKK3ZvaWQgZ2xUZXhFbnZmdiAoIEdMaW50IHRhcmdldCwgR0xpbnQgcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyApCit2b2lkIGdsVGV4RW52eCAoIEdMaW50IHRhcmdldCwgR0xpbnQgcG5hbWUsIEdMaW50IHBhcmFtICkKK3ZvaWQgZ2xUZXhFbnZ4diAoIEdMaW50IHRhcmdldCwgR0xpbnQgcG5hbWUsIEdMaW50ICpwYXJhbXMgKQordm9pZCBnbFRleEdlbmYgKCBHTGludCBjb29yZCwgR0xpbnQgcG5hbWUsIEdMZmxvYXQgcGFyYW0gKQordm9pZCBnbFRleEdlbmZ2ICggR0xpbnQgY29vcmQsIEdMaW50IHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMgKQordm9pZCBnbFRleEdlbmkgKCBHTGludCBjb29yZCwgR0xpbnQgcG5hbWUsIEdMaW50IHBhcmFtICkKK3ZvaWQgZ2xUZXhHZW5pdiAoIEdMaW50IGNvb3JkLCBHTGludCBwbmFtZSwgR0xpbnQgKnBhcmFtcyApCit2b2lkIGdsVGV4R2VueCAoIEdMaW50IGNvb3JkLCBHTGludCBwbmFtZSwgR0xpbnQgcGFyYW0gKQordm9pZCBnbFRleEdlbnh2ICggR0xpbnQgY29vcmQsIEdMaW50IHBuYW1lLCBHTGludCAqcGFyYW1zICkKK3ZvaWQgZ2xUZXhQYXJhbWV0ZXJmICggR0xpbnQgdGFyZ2V0LCBHTGludCBwbmFtZSwgR0xmbG9hdCBwYXJhbSApCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2xzcGVjLWNoZWNrcyBiL29wZW5nbC90b29scy9nbGdlbi9nbHNwZWMtY2hlY2tzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NGVkNjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2xzcGVjLWNoZWNrcwpAQCAtMCwwICsxLDU5IEBACitnbENsaXBQbGFuZWYgY2hlY2sgZXF1YXRpb24gNA0KK2dsQ2xpcFBsYW5leCBjaGVjayBlcXVhdGlvbiA0DQorZ2xEZWxldGVCdWZmZXJzIGNoZWNrIGJ1ZmZlcnMgbiANCitnbERlbGV0ZVRleHR1cmVzIGNoZWNrIHRleHR1cmVzIG4NCitnbERyYXdFbGVtZW50cyBjaGVja19BSU9PQkUgaW5kaWNlcyBjb3VudA0KK2dsRm9nIGlmY2hlY2sgcGFyYW1zIDEgcG5hbWUgR0xfRk9HX01PREUsR0xfRk9HX0RFTlNJVFksR0xfRk9HX1NUQVJULEdMX0ZPR19FTkQgaWZjaGVjayBwYXJhbXMgNCBwbmFtZSBHTF9GT0dfQ09MT1INCitnbEdlbkJ1ZmZlcnMgY2hlY2sgYnVmZmVycyBuDQorZ2xHZW5UZXh0dXJlcyBjaGVjayB0ZXh0dXJlcyBuDQorZ2xHZXRDbGlwUGxhbmUgY2hlY2sgZXFuIDQNCitnbEdldEludGVnZXJ2IGlmY2hlY2sgcGFyYW1zIDEgcG5hbWUgR0xfQUxQSEFfQklUUyxHTF9BTFBIQV9URVNUX0ZVTkMsR0xfQUxQSEFfVEVTVF9SRUYsR0xfQkxFTkRfRFNULEdMX0JMVUVfQklUUyxHTF9DT0xPUl9BUlJBWV9CVUZGRVJfQklORElORyxHTF9DT0xPUl9BUlJBWV9TSVpFLEdMX0NPTE9SX0FSUkFZX1NUUklERSxHTF9DT0xPUl9BUlJBWV9UWVBFLEdMX0NVTExfRkFDRSxHTF9ERVBUSF9CSVRTLEdMX0RFUFRIX0NMRUFSX1ZBTFVFLEdMX0RFUFRIX0ZVTkMsR0xfREVQVEhfV1JJVEVNQVNLLEdMX0ZPR19ERU5TSVRZLEdMX0ZPR19FTkQsR0xfRk9HX01PREUsR0xfRk9HX1NUQVJULEdMX0ZST05UX0ZBQ0UsR0xfR1JFRU5fQklUUyxHTF9JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX0ZPUk1BVF9PRVMsR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9UWVBFX09FUyxHTF9MSUdIVF9NT0RFTF9UV09fU0lERSxHTF9MSU5FX1NNT09USF9ISU5ULEdMX0xJTkVfV0lEVEgsR0xfTE9HSUNfT1BfTU9ERSxHTF9NQVRSSVhfSU5ERVhfQVJSQVlfQlVGRkVSX0JJTkRJTkdfT0VTLEdMX01BVFJJWF9JTkRFWF9BUlJBWV9TSVpFX09FUyxHTF9NQVRSSVhfSU5ERVhfQVJSQVlfU1RSSURFX09FUyxHTF9NQVRSSVhfSU5ERVhfQVJSQVlfVFlQRV9PRVMsR0xfTUFUUklYX01PREUsR0xfTUFYX0NMSVBfUExBTkVTLEdMX01BWF9FTEVNRU5UU19JTkRJQ0VTLEdMX01BWF9FTEVNRU5UU19WRVJUSUNFUyxHTF9NQVhfTElHSFRTLEdMX01BWF9NT0RFTFZJRVdfU1RBQ0tfREVQVEgsR0xfTUFYX1BBTEVUVEVfTUFUUklDRVNfT0VTLEdMX01BWF9QUk9KRUNUSU9OX1NUQUNLX0RFUFRILEdMX01BWF9URVhUVVJFX1NJWkUsR0xfTUFYX1RFWFRVUkVfU1RBQ0tfREVQVEgsR0xfTUFYX1RFWFRVUkVfVU5JVFMsR0xfTUFYX1ZFUlRFWF9VTklUU19PRVMsR0xfTU9ERUxWSUVXX1NUQUNLX0RFUFRILEdMX05PUk1BTF9BUlJBWV9CVUZGRVJfQklORElORyxHTF9OT1JNQUxfQVJSQVlfU1RSSURFLEdMX05PUk1BTF9BUlJBWV9UWVBFLEdMX05VTV9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUyxHTF9QQUNLX0FMSUdOTUVOVCxHTF9QRVJTUEVDVElWRV9DT1JSRUNUSU9OX0hJTlQsR0xfUE9JTlRfU0laRSxHTF9QT0lOVF9TSVpFX0FSUkFZX0JVRkZFUl9CSU5ESU5HX09FUyxHTF9QT0lOVF9TSVpFX0FSUkFZX1NUUklERV9PRVMsR0xfUE9JTlRfU0laRV9BUlJBWV9UWVBFX09FUyxHTF9QT0lOVF9TTU9PVEhfSElOVCxHTF9QT0xZR09OX09GRlNFVF9GQUNUT1IsR0xfUE9MWUdPTl9PRkZTRVRfVU5JVFMsR0xfUFJPSkVDVElPTl9TVEFDS19ERVBUSCxHTF9SRURfQklUUyxHTF9TSEFERV9NT0RFTCxHTF9TVEVOQ0lMX0JJVFMsR0xfU1RFTkNJTF9DTEVBUl9WQUxVRSxHTF9TVEVOQ0lMX0ZBSUwsR0xfU1RFTkNJTF9GVU5DLEdMX1NURU5DSUxfUEFTU19ERVBUSF9GQUlMLEdMX1NURU5DSUxfUEFTU19ERVBUSF9QQVNTLEdMX1NURU5DSUxfUkVGLEdMX1NURU5DSUxfVkFMVUVfTUFTSyxHTF9TVEVOQ0lMX1dSSVRFTUFTSyxHTF9TVUJQSVhFTF9CSVRTLEdMX1RFWFRVUkVfQklORElOR18yRCxHTF9URVhUVVJFX0NPT1JEX0FSUkFZX0JVRkZFUl9CSU5ESU5HLEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfU0laRSxHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1NUUklERSxHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1RZUEUsR0xfVEVYVFVSRV9TVEFDS19ERVBUSCxHTF9VTlBBQ0tfQUxJR05NRU5ULEdMX1ZFUlRFWF9BUlJBWV9CVUZGRVJfQklORElORyxHTF9WRVJURVhfQVJSQVlfU0laRSxHTF9WRVJURVhfQVJSQVlfU1RSSURFLEdMX1ZFUlRFWF9BUlJBWV9UWVBFLEdMX1dFSUdIVF9BUlJBWV9CVUZGRVJfQklORElOR19PRVMsR0xfV0VJR0hUX0FSUkFZX1NJWkVfT0VTLEdMX1dFSUdIVF9BUlJBWV9TVFJJREVfT0VTLEdMX1dFSUdIVF9BUlJBWV9UWVBFX09FUyBpZmNoZWNrIHBhcmFtcyAyIHBuYW1lIEdMX0FMSUFTRURfUE9JTlRfU0laRV9SQU5HRSxHTF9BTElBU0VEX0xJTkVfV0lEVEhfUkFOR0UsR0xfREVQVEhfUkFOR0UsR0xfTUFYX1ZJRVdQT1JUX0RJTVMsR0xfU01PT1RIX0xJTkVfV0lEVEhfUkFOR0UsR0xfU01PT1RIX1BPSU5UX1NJWkVfUkFOR0UgaWZjaGVjayBwYXJhbXMgNCBwbmFtZSBHTF9DT0xPUl9DTEVBUl9WQUxVRSxHTF9DT0xPUl9XUklURU1BU0ssR0xfU0NJU1NPUl9CT1gsR0xfVklFV1BPUlQgaWZjaGVjayBwYXJhbXMgMTYgcG5hbWUgR0xfTU9ERUxWSUVXX01BVFJJWCxHTF9NT0RFTFZJRVdfTUFUUklYX0ZMT0FUX0FTX0lOVF9CSVRTX09FUyxHTF9QUk9KRUNUSU9OX01BVFJJWCxHTF9QUk9KRUNUSU9OX01BVFJJWF9GTE9BVF9BU19JTlRfQklUU19PRVMsR0xfVEVYVFVSRV9NQVRSSVgsR0xfVEVYVFVSRV9NQVRSSVhfRkxPQVRfQVNfSU5UX0JJVFNfT0VTIGlmY2hlY2sgcGFyYW1zIF9OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMgcG5hbWUgR0xfQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMsR0xfRk9HX0NPTE9SLEdMX0xJR0hUX01PREVMX0FNQklFTlQNCitnbEdldExpZ2h0IGlmY2hlY2sgcGFyYW1zIDEgcG5hbWUgR0xfU1BPVF9FWFBPTkVOVCxHTF9TUE9UX0NVVE9GRixHTF9DT05TVEFOVF9BVFRFTlVBVElPTixHTF9MSU5FQVJfQVRURU5VQVRJT04sR0xfUVVBRFJBVElDX0FUVEVOVUFUSU9OIGlmY2hlY2sgcGFyYW1zIDMgcG5hbWUgR0xfU1BPVF9ESVJFQ1RJT04gaWZjaGVjayBwYXJhbXMgNCBwbmFtZSBHTF9BTUJJRU5ULEdMX0RJRkZVU0UsR0xfU1BFQ1VMQVIsR0xfRU1JU1NJT04NCitnbEdldE1hdGVyaWFsIGlmY2hlY2sgcGFyYW1zIDEgcG5hbWUgR0xfU0hJTklORVNTIGlmY2hlY2sgcGFyYW1zIDQgcG5hbWUgR0xfQU1CSUVOVCxHTF9ESUZGVVNFLEdMX1NQRUNVTEFSLEdMX0VNSVNTSU9OLEdMX0FNQklFTlRfQU5EX0RJRkZVU0UNCitnbEdldFRleEVudiBpZmNoZWNrIHBhcmFtcyAxIHBuYW1lIEdMX1RFWFRVUkVfRU5WX01PREUsR0xfQ09NQklORV9SR0IsR0xfQ09NQklORV9BTFBIQSBpZmNoZWNrIHBhcmFtcyA0IHBuYW1lIEdMX1RFWFRVUkVfRU5WX0NPTE9SDQorZ2xHZXRUZXhQYXJhbWV0ZXIgY2hlY2sgcGFyYW1zIDENCitnbExpZ2h0TW9kZWwgaWZjaGVjayBwYXJhbXMgMSBwbmFtZSBHTF9MSUdIVF9NT0RFTF9UV09fU0lERSBpZmNoZWNrIHBhcmFtcyA0IHBuYW1lIEdMX0xJR0hUX01PREVMX0FNQklFTlQNCitnbExpZ2h0IGlmY2hlY2sgcGFyYW1zIDEgcG5hbWUgR0xfU1BPVF9FWFBPTkVOVCxHTF9TUE9UX0NVVE9GRixHTF9DT05TVEFOVF9BVFRFTlVBVElPTixHTF9MSU5FQVJfQVRURU5VQVRJT04sR0xfUVVBRFJBVElDX0FUVEVOVUFUSU9OIGlmY2hlY2sgcGFyYW1zIDMgcG5hbWUgR0xfU1BPVF9ESVJFQ1RJT04gaWZjaGVjayBwYXJhbXMgNCBwbmFtZSBHTF9BTUJJRU5ULEdMX0RJRkZVU0UsR0xfU1BFQ1VMQVIsR0xfRU1JU1NJT04NCitnbExvYWRNYXRyaXggY2hlY2sgbSAxNg0KK2dsTWF0ZXJpYWwgaWZjaGVjayBwYXJhbXMgMSBwbmFtZSBHTF9TSElOSU5FU1MgaWZjaGVjayBwYXJhbXMgNCBwbmFtZSBHTF9BTUJJRU5ULEdMX0RJRkZVU0UsR0xfU1BFQ1VMQVIsR0xfRU1JU1NJT04sR0xfQU1CSUVOVF9BTkRfRElGRlVTRQ0KK2dsTXVsdE1hdHJpeCBjaGVjayBtIDE2DQorZ2xQb2ludFBhcmFtZXRlciBjaGVjayBwYXJhbXMgMQ0KK2dsVGV4RW52IGlmY2hlY2sgcGFyYW1zIDEgcG5hbWUgR0xfVEVYVFVSRV9FTlZfTU9ERSxHTF9DT01CSU5FX1JHQixHTF9DT01CSU5FX0FMUEhBIGlmY2hlY2sgcGFyYW1zIDQgcG5hbWUgR0xfVEVYVFVSRV9FTlZfQ09MT1INCitnbFRleEltYWdlMkQgbnVsbEFsbG93ZWQNCitnbFRleFN1YkltYWdlMkQgbnVsbEFsbG93ZWQNCitnbEJ1ZmZlckRhdGEgbnVsbEFsbG93ZWQNCitnbFRleFBhcmFtZXRlciBjaGVjayBwYXJhbXMgMQ0KK2dsUXVlcnlNYXRyaXh4T0VTIGNoZWNrIG1hbnRpc3NhIDE2IGNoZWNrIGV4cG9uZW50IDE2IHJldHVybiAtMQ0KK2dsRHJhd1RleGZ2T0VTIGNoZWNrIGNvb3JkcyA1DQorZ2xEcmF3VGV4aXZPRVMgY2hlY2sgY29vcmRzIDUNCitnbERyYXdUZXhzdk9FUyBjaGVjayBjb29yZHMgNQ0KK2dsRHJhd1RleHh2T0VTIGNoZWNrIGNvb3JkcyA1DQorZ2xCaW5kRnJhbWVidWZmZXJPRVMgdW5zdXBwb3J0ZWQNCitnbEJpbmRSZW5kZXJidWZmZXJPRVMgdW5zdXBwb3J0ZWQNCitnbEJsZW5kRXF1YXRpb24gdW5zdXBwb3J0ZWQNCitnbEJsZW5kRXF1YXRpb25TZXBhcmF0ZSB1bnN1cHBvcnRlZA0KK2dsQmxlbmRGdW5jU2VwYXJhdGUgdW5zdXBwb3J0ZWQNCitnbENoZWNrRnJhbWVidWZmZXJTdGF0dXNPRVMgdW5zdXBwb3J0ZWQgcmV0dXJuIDANCitnbEN1cnJlbnRQYWxldHRlTWF0cml4T0VTIHVuc3VwcG9ydGVkDQorZ2xEZWxldGVGcmFtZWJ1ZmZlcnNPRVMgdW5zdXBwb3J0ZWQNCitnbERlbGV0ZVJlbmRlcmJ1ZmZlcnNPRVMgdW5zdXBwb3J0ZWQNCitnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyT0VTIHVuc3VwcG9ydGVkDQorZ2xGcmFtZWJ1ZmZlclN0b3JhZ2VPRVMgdW5zdXBwb3J0ZWQNCitnbEZyYW1lYnVmZmVyVGV4dHVyZTJET0VTIHVuc3VwcG9ydGVkDQorZ2xHZW5GcmFtZWJ1ZmZlcnNPRVMgdW5zdXBwb3J0ZWQNCitnbEdlblJlbmRlcmJ1ZmZlcnNPRVMgdW5zdXBwb3J0ZWQNCitnbEdlbmVyYXRlTWlwbWFwT0VTIHVuc3VwcG9ydGVkDQorZ2xHZXRCdWZmZXJQYXJhbWV0ZXIgdW5zdXBwb3J0ZWQNCitnbEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2T0VTIHVuc3VwcG9ydGVkDQorZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdk9FUyB1bnN1cHBvcnRlZA0KK2dsR2V0VGV4R2VuIHVuc3VwcG9ydGVkDQorZ2xJc0ZyYW1lYnVmZmVyT0VTIHVuc3VwcG9ydGVkIHJldHVybiBKTklfRkFMU0UNCitnbElzUmVuZGVyYnVmZmVyT0VTIHVuc3VwcG9ydGVkIHJldHVybiBKTklfRkFMU0UNCitnbExvYWRQYWxldHRlRnJvbU1vZGVsVmlld01hdHJpeE9FUyB1bnN1cHBvcnRlZA0KK2dsTWF0cml4SW5kZXhQb2ludGVyT0VTIHVuc3VwcG9ydGVkDQorZ2xSZW5kZXJidWZmZXJTdG9yYWdlT0VTIHVuc3VwcG9ydGVkIHJldHVybiBmYWxzZQ0KK2dsVGV4R2VuIHVuc3VwcG9ydGVkDQorZ2xUZXhHZW5mIHVuc3VwcG9ydGVkDQorZ2xUZXhHZW5pIHVuc3VwcG9ydGVkDQorZ2xUZXhHZW54IHVuc3VwcG9ydGVkDQorZ2xXZWlnaHRQb2ludGVyT0VTIHVuc3VwcG9ydGVkDQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9DRnVuYy5qYXZhIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9DRnVuYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3OTRmNDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0NGdW5jLmphdmEKQEAgLTAsMCArMSwxNTUgQEAKKw0KK2ltcG9ydCBqYXZhLnV0aWwuKjsNCisNCitwdWJsaWMgY2xhc3MgQ0Z1bmMgew0KKw0KKyAgICBTdHJpbmcgb3JpZ2luYWw7DQorDQorICAgIENUeXBlIGZ0eXBlOw0KKyAgICBTdHJpbmcgZm5hbWU7DQorDQorICAgIExpc3Q8U3RyaW5nPiBhcmdOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KKyAgICBMaXN0PENUeXBlPiBhcmdUeXBlcyA9IG5ldyBBcnJheUxpc3Q8Q1R5cGU+KCk7DQorDQorICAgIGJvb2xlYW4gaGFzUG9pbnRlckFyZyA9IGZhbHNlOw0KKyAgICBib29sZWFuIGhhc1R5cGVkUG9pbnRlckFyZyA9IGZhbHNlOw0KKw0KKyAgICBwdWJsaWMgQ0Z1bmMoU3RyaW5nIG9yaWdpbmFsKSB7DQorICAgICAgICB0aGlzLm9yaWdpbmFsID0gb3JpZ2luYWw7DQorICAgIH0NCisNCisgICAgcHVibGljIFN0cmluZyBnZXRPcmlnaW5hbCgpIHsNCisgICAgICAgIHJldHVybiBvcmlnaW5hbDsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBmbmFtZSkgew0KKyAgICAgICAgdGhpcy5mbmFtZSA9IGZuYW1lOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsNCisgICAgICAgIHJldHVybiBmbmFtZTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKENUeXBlIGZ0eXBlKSB7DQorICAgICAgICB0aGlzLmZ0eXBlID0gZnR5cGU7DQorICAgIH0NCisNCisgICAgcHVibGljIENUeXBlIGdldFR5cGUoKSB7DQorICAgICAgICByZXR1cm4gZnR5cGU7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgYWRkQXJndW1lbnQoU3RyaW5nIGFyZ05hbWUsIENUeXBlIGFyZ1R5cGUpIHsNCisgICAgICAgIGFyZ05hbWVzLmFkZChhcmdOYW1lKTsNCisgICAgICAgIGFyZ1R5cGVzLmFkZChhcmdUeXBlKTsNCisNCisgICAgICAgIGlmIChhcmdUeXBlLmlzUG9pbnRlcigpKSB7DQorICAgICAgICAgICAgaGFzUG9pbnRlckFyZyA9IHRydWU7DQorICAgICAgICB9DQorICAgICAgICBpZiAoYXJnVHlwZS5pc1R5cGVkUG9pbnRlcigpKSB7DQorICAgICAgICAgICAgaGFzVHlwZWRQb2ludGVyQXJnID0gdHJ1ZTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgaW50IGdldE51bUFyZ3MoKSB7DQorICAgICAgICByZXR1cm4gYXJnTmFtZXMuc2l6ZSgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBpbnQgZ2V0QXJnSW5kZXgoU3RyaW5nIG5hbWUpIHsNCisgICAgICAgIGludCBsZW4gPSBhcmdOYW1lcy5zaXplKCk7DQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7DQorICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKGFyZ05hbWVzLmdldChpKSkpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIGk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIC0xOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXJnTmFtZShpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiBhcmdOYW1lcy5nZXQoaW5kZXgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBDVHlwZSBnZXRBcmdUeXBlKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIGFyZ1R5cGVzLmdldChpbmRleCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gaGFzUG9pbnRlckFyZygpIHsNCisgICAgICAgIHJldHVybiBoYXNQb2ludGVyQXJnOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGhhc1R5cGVkUG9pbnRlckFyZygpIHsNCisgICAgICAgIHJldHVybiBoYXNUeXBlZFBvaW50ZXJBcmc7DQorICAgIH0NCisNCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCisgICAgICAgIFN0cmluZyBzID0gICJGdW5jdGlvbiAiICsgZm5hbWUgKyAiIHJldHVybnMgIiArIGZ0eXBlICsgIjogIjsNCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJnTmFtZXMuc2l6ZSgpOyBpKyspIHsNCisgICAgICAgICAgICBpZiAoaSA+IDApIHsNCisgICAgICAgICAgICAgICAgcyArPSAiLCAiOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBzICs9IGFyZ1R5cGVzLmdldChpKSArICIgIiArIGFyZ05hbWVzLmdldChpKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBzOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBzdGF0aWMgQ0Z1bmMgcGFyc2VDRnVuYyhTdHJpbmcgcykgew0KKyAgICAgICAgQ0Z1bmMgY2Z1bmMgPSBuZXcgQ0Z1bmMocyk7DQorICAgICAgICBTdHJpbmdbXSB0b2tlbnMgPSBzLnNwbGl0KCJcXHMiKTsNCisNCisgICAgICAgIGludCBpID0gMDsNCisgICAgICAgIENUeXBlIGZ0eXBlID0gbmV3IENUeXBlKCk7DQorICAgICAgICBTdHJpbmcgZnR5cGVOYW1lID0gdG9rZW5zW2krK107DQorICAgICAgICBpZiAoZnR5cGVOYW1lLmVxdWFscygiY29uc3QiKSkgew0KKyAgICAgICAgICAgIGZ0eXBlLnNldElzQ29uc3QodHJ1ZSk7DQorICAgICAgICAgICAgZnR5cGVOYW1lID0gdG9rZW5zW2krK107DQorICAgICAgICB9DQorICAgICAgICBmdHlwZS5zZXRCYXNlVHlwZShmdHlwZU5hbWUpOw0KKw0KKyAgICAgICAgU3RyaW5nIGZuYW1lID0gdG9rZW5zW2krK107DQorICAgICAgICBpZiAoZm5hbWUuZXF1YWxzKCIqIikpIHsNCisgICAgICAgICAgICBmdHlwZS5zZXRJc1BvaW50ZXIodHJ1ZSk7DQorICAgICAgICAgICAgZm5hbWUgPSB0b2tlbnNbaSsrXTsNCisgICAgICAgIH0NCisJDQorICAgICAgICBjZnVuYy5zZXROYW1lKGZuYW1lKTsNCisgICAgICAgIGNmdW5jLnNldFR5cGUoZnR5cGUpOw0KKwkNCisgICAgICAgIHdoaWxlIChpIDwgdG9rZW5zLmxlbmd0aCkgew0KKyAgICAgICAgICAgIFN0cmluZyB0b2sgPSB0b2tlbnNbaSsrXTsNCisJICAgIA0KKyAgICAgICAgICAgIGlmICh0b2suZXF1YWxzKCIoIikpIHsNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmICh0b2suZXF1YWxzKCIpIikpIHsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIENUeXBlIGFyZ1R5cGUgPSBuZXcgQ1R5cGUoKTsNCisJICAgIA0KKyAgICAgICAgICAgIFN0cmluZyBhcmdUeXBlTmFtZSA9IHRvazsNCisgICAgICAgICAgICBTdHJpbmcgYXJnTmFtZSA9ICIiOw0KKwkgICAgDQorICAgICAgICAgICAgaWYgKGFyZ1R5cGVOYW1lLmVxdWFscygiY29uc3QiKSkgew0KKyAgICAgICAgICAgICAgICBhcmdUeXBlLnNldElzQ29uc3QodHJ1ZSk7DQorICAgICAgICAgICAgICAgIGFyZ1R5cGVOYW1lID0gdG9rZW5zW2krK107DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGFyZ1R5cGUuc2V0QmFzZVR5cGUoYXJnVHlwZU5hbWUpOw0KKw0KKyAgICAgICAgICAgIGlmIChhcmdUeXBlTmFtZS5lcXVhbHMoInZvaWQiKSkgew0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorCSAgICANCisgICAgICAgICAgICBhcmdOYW1lID0gdG9rZW5zW2krK107DQorICAgICAgICAgICAgaWYgKGFyZ05hbWUuc3RhcnRzV2l0aCgiKiIpKSB7DQorICAgICAgICAgICAgICAgIGFyZ1R5cGUuc2V0SXNQb2ludGVyKHRydWUpOw0KKyAgICAgICAgICAgICAgICBhcmdOYW1lID0gYXJnTmFtZS5zdWJzdHJpbmcoMSwgYXJnTmFtZS5sZW5ndGgoKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChhcmdOYW1lLmVuZHNXaXRoKCIsIikpIHsNCisgICAgICAgICAgICAgICAgYXJnTmFtZSA9IGFyZ05hbWUuc3Vic3RyaW5nKDAsIGFyZ05hbWUubGVuZ3RoKCkgLSAxKTsNCisgICAgICAgICAgICB9DQorCSAgICANCisgICAgICAgICAgICBjZnVuYy5hZGRBcmd1bWVudChhcmdOYW1lLCBhcmdUeXBlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHJldHVybiBjZnVuYzsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0NUeXBlLmphdmEgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0NUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMxZWM2MgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9zcmMvQ1R5cGUuamF2YQpAQCAtMCwwICsxLDg1IEBACisNCitwdWJsaWMgY2xhc3MgQ1R5cGUgew0KKw0KKyAgICBTdHJpbmcgYmFzZVR5cGU7DQorICAgIGJvb2xlYW4gaXNDb25zdDsNCisgICAgYm9vbGVhbiBpc1BvaW50ZXI7DQorDQorICAgIHB1YmxpYyBDVHlwZSgpIHsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgQ1R5cGUoU3RyaW5nIGJhc2VUeXBlKSB7DQorCXNldEJhc2VUeXBlKGJhc2VUeXBlKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgQ1R5cGUoU3RyaW5nIGJhc2VUeXBlLCBib29sZWFuIGlzQ29uc3QsIGJvb2xlYW4gaXNQb2ludGVyKSB7DQorCXNldEJhc2VUeXBlKGJhc2VUeXBlKTsNCisJc2V0SXNDb25zdChpc0NvbnN0KTsNCisJc2V0SXNQb2ludGVyKGlzUG9pbnRlcik7DQorICAgIH0NCisNCisgICAgcHVibGljIFN0cmluZyBnZXREZWNsYXJhdGlvbigpIHsNCisJcmV0dXJuIGJhc2VUeXBlICsgKGlzUG9pbnRlciA/ICIgKiIgOiAiIik7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyB2b2lkIHNldElzQ29uc3QoYm9vbGVhbiBpc0NvbnN0KSB7DQorCXRoaXMuaXNDb25zdCA9IGlzQ29uc3Q7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gaXNDb25zdCgpIHsNCisJcmV0dXJuIGlzQ29uc3Q7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgc2V0SXNQb2ludGVyKGJvb2xlYW4gaXNQb2ludGVyKSB7DQorCXRoaXMuaXNQb2ludGVyID0gaXNQb2ludGVyOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGlzUG9pbnRlcigpIHsNCisJcmV0dXJuIGlzUG9pbnRlcjsNCisgICAgfQ0KKw0KKyAgICBib29sZWFuIGlzVm9pZCgpIHsNCisJU3RyaW5nIGJhc2VUeXBlID0gZ2V0QmFzZVR5cGUoKTsNCisJcmV0dXJuIGJhc2VUeXBlLmVxdWFscygiR0x2b2lkIikgfHwNCisJICAgIGJhc2VUeXBlLmVxdWFscygidm9pZCIpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGlzVHlwZWRQb2ludGVyKCkgew0KKwlyZXR1cm4gaXNQb2ludGVyKCkgJiYgIWlzVm9pZCgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldEJhc2VUeXBlKFN0cmluZyBiYXNlVHlwZSkgew0KKwl0aGlzLmJhc2VUeXBlID0gYmFzZVR5cGU7DQorICAgIH0NCisNCisgICAgcHVibGljIFN0cmluZyBnZXRCYXNlVHlwZSgpIHsNCisJcmV0dXJuIGJhc2VUeXBlOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQorCVN0cmluZyBzID0gIiI7DQorCWlmIChpc0NvbnN0KCkpIHsNCisJICAgIHMgKz0gImNvbnN0ICI7DQorCX0NCisJcyArPSBiYXNlVHlwZTsNCisJaWYgKGlzUG9pbnRlcigpKSB7DQorCSAgICBzICs9ICIqIjsNCisJfQ0KKw0KKwlyZXR1cm4gczsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgew0KKwlyZXR1cm4gYmFzZVR5cGUuaGFzaENvZGUoKSBeIChpc1BvaW50ZXIgPyAyIDogMCkgXiAoaXNDb25zdCA/IDEgOiAwKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsNCisJaWYgKG8gIT0gbnVsbCAmJiBvIGluc3RhbmNlb2YgQ1R5cGUpIHsNCisJICAgIENUeXBlIGMgPSAoQ1R5cGUpbzsNCisJICAgIHJldHVybiBiYXNlVHlwZS5lcXVhbHMoYy5iYXNlVHlwZSkgJiYNCisJCWlzUG9pbnRlcigpID09IGMuaXNQb2ludGVyKCkgJiYNCisJCWlzQ29uc3QoKSA9PSBjLmlzQ29uc3QoKTsNCisJfQ0KKwlyZXR1cm4gZmFsc2U7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9Db2RlRW1pdHRlci5qYXZhIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9Db2RlRW1pdHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlOWI5MGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0NvZGVFbWl0dGVyLmphdmEKQEAgLTAsMCArMSw4IEBACisNCitwdWJsaWMgaW50ZXJmYWNlIENvZGVFbWl0dGVyIHsNCisNCisgICAgdm9pZCBzZXRWZXJzaW9uKGludCB2ZXJzaW9uLCBib29sZWFuIGV4dCwgYm9vbGVhbiBwYWNrKTsNCisgICAgdm9pZCBlbWl0Q29kZShDRnVuYyBjZnVuYywgU3RyaW5nIG9yaWdpbmFsKTsNCisgICAgdm9pZCBhZGROYXRpdmVSZWdpc3RyYXRpb24oU3RyaW5nIGZuYW1lKTsNCisgICAgdm9pZCBlbWl0TmF0aXZlUmVnaXN0cmF0aW9uKCk7DQorfQ0KZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zcmMvR2VuZXJhdGVHTC5qYXZhIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9HZW5lcmF0ZUdMLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU3ZWU2ZQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9zcmMvR2VuZXJhdGVHTC5qYXZhCkBAIC0wLDAgKzEsMTY0IEBACisNCitpbXBvcnQgamF2YS5pby4qOw0KK2ltcG9ydCBqYXZhLnV0aWwuKjsNCisNCitwdWJsaWMgY2xhc3MgR2VuZXJhdGVHTCB7DQorDQorICAgIHN0YXRpYyB2b2lkIGNvcHkoU3RyaW5nIGZpbGVuYW1lLCBQcmludFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICBCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihmaWxlbmFtZSkpOw0KKyAgICAgICAgU3RyaW5nIHM7DQorICAgICAgICB3aGlsZSAoKHMgPSBici5yZWFkTGluZSgpKSAhPSBudWxsKSB7DQorICAgICAgICAgICAgb3V0LnByaW50bG4ocyk7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBlbWl0KGludCB2ZXJzaW9uLCBib29sZWFuIGV4dCwgYm9vbGVhbiBwYWNrLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUVtaXR0ZXIgZW1pdHRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHNwZWNSZWFkZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFN0cmVhbSBnbFN0cmVhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50U3RyZWFtIGdsSW1wbFN0cmVhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50U3RyZWFtIGNTdHJlYW0pIHRocm93cyBFeGNlcHRpb24gew0KKyAgICAgICAgU3RyaW5nIHMgPSBudWxsOw0KKyAgICAgICAgaW50IGNvdW50ZXIgPSAwOw0KKyAgICAgICAgd2hpbGUgKChzID0gc3BlY1JlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaWYgKHMudHJpbSgpLnN0YXJ0c1dpdGgoIi8vIikpIHsNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIENGdW5jIGNmdW5jID0gQ0Z1bmMucGFyc2VDRnVuYyhzKTsNCisNCisgICAgICAgICAgICBTdHJpbmcgZm5hbWUgPSBjZnVuYy5nZXROYW1lKCk7DQorICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoInN0dWJzLyIgKyBmbmFtZSArDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi5qYXZhLTEiICsgdmVyc2lvbiArICItaWYiKTsNCisgICAgICAgICAgICBpZiAoZi5leGlzdHMoKSkgew0KKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNwZWNpYWwtY2FzaW5nIGZ1bmN0aW9uICIgKyBmbmFtZSk7DQorICAgICAgICAgICAgICAgIGNvcHkoInN0dWJzLyIgKyBmbmFtZSArDQorICAgICAgICAgICAgICAgICAgICAgIi5qYXZhLTEiICsgdmVyc2lvbiArICItaWYiLCBnbFN0cmVhbSk7DQorICAgICAgICAgICAgICAgIGNvcHkoInN0dWJzLyIgKyBmbmFtZSArICIuamF2YS1pbXBsIiwgZ2xJbXBsU3RyZWFtKTsNCisgICAgICAgICAgICAgICAgY29weSgic3R1YnMvIiArIGZuYW1lICsgIi5jcHAiLCBjU3RyZWFtKTsNCisNCisgICAgICAgICAgICAgICAgLy8gUmVnaXN0ZXIgbmF0aXZlIGZ1bmN0aW9uIG5hbWVzDQorICAgICAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIGJlIGltcHJvdmVkIHRvIHJlcXVpcmUgZmV3ZXIgZGlzY3JldGUgZmlsZXMNCisgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gInN0dWJzLyIgKyBmbmFtZSArICIubmF0aXZlUmVnIjsNCisgICAgICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgYnIgPQ0KKyAgICAgICAgICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGZpbGVuYW1lKSk7DQorICAgICAgICAgICAgICAgIFN0cmluZyBuZnVuYzsNCisgICAgICAgICAgICAgICAgd2hpbGUgKChuZnVuYyA9IGJyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICAgIGVtaXR0ZXIuYWRkTmF0aXZlUmVnaXN0cmF0aW9uKG5mdW5jKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGVtaXR0ZXIuc2V0VmVyc2lvbih2ZXJzaW9uLCBleHQsIHBhY2spOw0KKyAgICAgICAgICAgICAgICBlbWl0dGVyLmVtaXRDb2RlKGNmdW5jLCBzKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7DQorICAgICAgICBTdHJpbmcgY2xhc3NQYXRoTmFtZSA9ICJjb20vZ29vZ2xlL2FuZHJvaWQvZ2xlc19qbmkvR0xJbXBsIjsNCisgICAgICAgIGJvb2xlYW4gdXNlQ29udGV4dFBvaW50ZXIgPSB0cnVlOw0KKw0KKyAgICAgICAgaW50IGFpZHggPSAwOw0KKyAgICAgICAgd2hpbGUgKGFyZ3NbYWlkeF0uY2hhckF0KDApID09ICctJykgew0KKyAgICAgICAgICAgIHN3aXRjaCAoYXJnc1thaWR4XS5jaGFyQXQoMSkpIHsNCisgICAgICAgICAgICBjYXNlICdjJzoNCisgICAgICAgICAgICAgICAgdXNlQ29udGV4dFBvaW50ZXIgPSBmYWxzZTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJVbmtub3duIGZsYWc6ICIgKyBhcmdzW2FpZHhdKTsNCisgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGFpZHgrKzsNCisgICAgICAgIH0NCisNCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidXNlQ29udGV4dFBvaW50ZXIgPSAiICsgdXNlQ29udGV4dFBvaW50ZXIpOw0KKw0KKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgc3BlYzEwUmVhZGVyID0NCisgICAgICAgICAgICBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoYXJnc1thaWR4KytdKSk7DQorICAgICAgICBCdWZmZXJlZFJlYWRlciBzcGVjMTBFeHRSZWFkZXIgPQ0KKyAgICAgICAgICAgIG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihhcmdzW2FpZHgrK10pKTsNCisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHNwZWMxMVJlYWRlciA9DQorICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGFyZ3NbYWlkeCsrXSkpOw0KKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgc3BlYzExRXh0UmVhZGVyID0NCisgICAgICAgICAgICBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoYXJnc1thaWR4KytdKSk7DQorICAgICAgICBCdWZmZXJlZFJlYWRlciBzcGVjMTFFeHRQYWNrUmVhZGVyID0NCisgICAgICAgICAgICBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoYXJnc1thaWR4KytdKSk7DQorICAgICAgICBCdWZmZXJlZFJlYWRlciBjaGVja3NSZWFkZXIgPQ0KKyAgICAgICAgICAgIG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihhcmdzW2FpZHgrK10pKTsNCisNCisgICAgICAgIFN0cmluZyBnbDEwRmlsZW5hbWUgPSAiamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMC5qYXZhIjsNCisgICAgICAgIFN0cmluZyBnbDEwRXh0RmlsZW5hbWUgPQ0KKyAgICAgICAgICAgICJqYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDEwRXh0LmphdmEiOw0KKyAgICAgICAgU3RyaW5nIGdsMTFGaWxlbmFtZSA9ICJqYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDExLmphdmEiOw0KKyAgICAgICAgU3RyaW5nIGdsMTFFeHRGaWxlbmFtZSA9DQorICAgICAgICAgICAgImphdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTFFeHQuamF2YSI7DQorICAgICAgICBTdHJpbmcgZ2wxMUV4dFBhY2tGaWxlbmFtZSA9DQorICAgICAgICAgICAgImphdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTFFeHRlbnNpb25QYWNrLmphdmEiOw0KKyAgICAgICAgU3RyaW5nIGdsSW1wbEZpbGVuYW1lID0gImNvbS9nb29nbGUvYW5kcm9pZC9nbGVzX2puaS9HTEltcGwuamF2YSI7DQorICAgICAgICBTdHJpbmcgY0ZpbGVuYW1lID0gImNvbV9nb29nbGVfYW5kcm9pZF9nbGVzX2puaV9HTEltcGwuY3BwIjsNCisNCisgICAgICAgIFByaW50U3RyZWFtIGdsMTBTdHJlYW0gPQ0KKyAgICAgICAgICAgIG5ldyBQcmludFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSgib3V0LyIgKyBnbDEwRmlsZW5hbWUpKTsNCisgICAgICAgIFByaW50U3RyZWFtIGdsMTBFeHRTdHJlYW0gPQ0KKyAgICAgICAgICAgIG5ldyBQcmludFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSgib3V0LyIgKyBnbDEwRXh0RmlsZW5hbWUpKTsNCisgICAgICAgIFByaW50U3RyZWFtIGdsMTFTdHJlYW0gPQ0KKyAgICAgICAgICAgIG5ldyBQcmludFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSgib3V0LyIgKyBnbDExRmlsZW5hbWUpKTsNCisgICAgICAgIFByaW50U3RyZWFtIGdsMTFFeHRTdHJlYW0gPQ0KKyAgICAgICAgICAgIG5ldyBQcmludFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSgib3V0LyIgKyBnbDExRXh0RmlsZW5hbWUpKTsNCisgICAgICAgIFByaW50U3RyZWFtIGdsMTFFeHRQYWNrU3RyZWFtID0NCisgICAgICAgICAgICBuZXcgUHJpbnRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oIm91dC8iICsgZ2wxMUV4dFBhY2tGaWxlbmFtZSkpOw0KKyAgICAgICAgUHJpbnRTdHJlYW0gZ2xJbXBsU3RyZWFtID0NCisgICAgICAgICAgICBuZXcgUHJpbnRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oIm91dC8iICsgZ2xJbXBsRmlsZW5hbWUpKTsNCisgICAgICAgIFByaW50U3RyZWFtIGNTdHJlYW0gPQ0KKyAgICAgICAgICAgIG5ldyBQcmludFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSgib3V0LyIgKyBjRmlsZW5hbWUpKTsNCisNCisgICAgICAgIFBhcmFtZXRlckNoZWNrZXIgY2hlY2tlciA9IG5ldyBQYXJhbWV0ZXJDaGVja2VyKGNoZWNrc1JlYWRlcik7DQorDQorICAgICAgICBDb2RlRW1pdHRlciBlbWl0dGVyID0NCisgICAgICAgICAgICBuZXcgSm5pQ29kZUVtaXR0ZXIoY2xhc3NQYXRoTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2wxMFN0cmVhbSwgZ2wxMEV4dFN0cmVhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2wxMVN0cmVhbSwgZ2wxMUV4dFN0cmVhbSwgZ2wxMUV4dFBhY2tTdHJlYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsSW1wbFN0cmVhbSwgY1N0cmVhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlQ29udGV4dFBvaW50ZXIpOw0KKw0KKyAgICAgICAgZ2wxMFN0cmVhbS5wcmludGxuKCIvKiAvL2RldmljZS9qYXZhL2FuZHJvaWQvIiArIGdsMTBGaWxlbmFtZSk7DQorICAgICAgICBnbDEwRXh0U3RyZWFtLnByaW50bG4oIi8qIC8vZGV2aWNlL2phdmEvYW5kcm9pZC8iICsgZ2wxMEV4dEZpbGVuYW1lKTsNCisgICAgICAgIGdsMTFTdHJlYW0ucHJpbnRsbigiLyogLy9kZXZpY2UvamF2YS9hbmRyb2lkLyIgKyBnbDExRmlsZW5hbWUpOw0KKyAgICAgICAgZ2wxMUV4dFN0cmVhbS5wcmludGxuKCIvKiAvL2RldmljZS9qYXZhL2FuZHJvaWQvIiArIGdsMTFFeHRGaWxlbmFtZSk7DQorICAgICAgICBnbDExRXh0UGFja1N0cmVhbS5wcmludGxuKCIvKiAvL2RldmljZS9qYXZhL2FuZHJvaWQvIiArDQorICAgICAgICAgICAgZ2wxMUV4dFBhY2tGaWxlbmFtZSk7DQorICAgICAgICBnbEltcGxTdHJlYW0ucHJpbnRsbigiLyogLy9kZXZpY2UvamF2YS9hbmRyb2lkLyIgKyBnbEltcGxGaWxlbmFtZSk7DQorICAgICAgICBjU3RyZWFtLnByaW50bG4oIi8qIC8vZGV2aWNlL2xpYnMvYW5kcm9pZF9ydW50aW1lLyIgKyBjRmlsZW5hbWUpOw0KKw0KKyAgICAgICAgY29weSgic3R1YnMvR0wxMEhlYWRlci5qYXZhLWlmIiwgZ2wxMFN0cmVhbSk7DQorICAgICAgICBjb3B5KCJzdHVicy9HTDEwRXh0SGVhZGVyLmphdmEtaWYiLCBnbDEwRXh0U3RyZWFtKTsNCisgICAgICAgIGNvcHkoInN0dWJzL0dMMTFIZWFkZXIuamF2YS1pZiIsIGdsMTFTdHJlYW0pOw0KKyAgICAgICAgY29weSgic3R1YnMvR0wxMUV4dEhlYWRlci5qYXZhLWlmIiwgZ2wxMUV4dFN0cmVhbSk7DQorICAgICAgICBjb3B5KCJzdHVicy9HTDExRXh0ZW5zaW9uUGFja0hlYWRlci5qYXZhLWlmIiwgZ2wxMUV4dFBhY2tTdHJlYW0pOw0KKyAgICAgICAgY29weSgic3R1YnMvR0xJbXBsSGVhZGVyLmphdmEtaW1wbCIsIGdsSW1wbFN0cmVhbSk7DQorICAgICAgICBjb3B5KCJzdHVicy9HTENIZWFkZXIuY3BwIiwgY1N0cmVhbSk7DQorDQorICAgICAgICBlbWl0KDAsIGZhbHNlLCBmYWxzZSwNCisgICAgICAgICAgICAgZW1pdHRlciwgc3BlYzEwUmVhZGVyLCBnbDEwU3RyZWFtLCBnbEltcGxTdHJlYW0sIGNTdHJlYW0pOw0KKyAgICAgICAgZW1pdCgwLCB0cnVlLCBmYWxzZSwNCisgICAgICAgICAgICAgZW1pdHRlciwgc3BlYzEwRXh0UmVhZGVyLCBnbDEwRXh0U3RyZWFtLCBnbEltcGxTdHJlYW0sIGNTdHJlYW0pOw0KKyAgICAgICAgZW1pdCgxLCBmYWxzZSwgZmFsc2UsDQorICAgICAgICAgICAgIGVtaXR0ZXIsIHNwZWMxMVJlYWRlciwgZ2wxMVN0cmVhbSwgZ2xJbXBsU3RyZWFtLCBjU3RyZWFtKTsNCisgICAgICAgIGVtaXQoMSwgdHJ1ZSwgZmFsc2UsDQorICAgICAgICAgICAgIGVtaXR0ZXIsIHNwZWMxMUV4dFJlYWRlciwgZ2wxMUV4dFN0cmVhbSwgZ2xJbXBsU3RyZWFtLCBjU3RyZWFtKTsNCisgICAgICAgIGVtaXQoMSwgdHJ1ZSwgdHJ1ZSwNCisgICAgICAgICAgICAgZW1pdHRlciwgc3BlYzExRXh0UGFja1JlYWRlciwgZ2wxMUV4dFBhY2tTdHJlYW0sIGdsSW1wbFN0cmVhbSwNCisgICAgICAgICAgICAgY1N0cmVhbSk7DQorDQorICAgICAgICBlbWl0dGVyLmVtaXROYXRpdmVSZWdpc3RyYXRpb24oKTsNCisNCisgICAgICAgIGdsMTBTdHJlYW0ucHJpbnRsbigifSIpOw0KKyAgICAgICAgZ2wxMEV4dFN0cmVhbS5wcmludGxuKCJ9Iik7DQorICAgICAgICBnbDExU3RyZWFtLnByaW50bG4oIn0iKTsNCisgICAgICAgIGdsMTFFeHRTdHJlYW0ucHJpbnRsbigifSIpOw0KKyAgICAgICAgZ2wxMUV4dFBhY2tTdHJlYW0ucHJpbnRsbigifSIpOw0KKyAgICAgICAgZ2xJbXBsU3RyZWFtLnByaW50bG4oIn0iKTsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0pGdW5jLmphdmEgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0pGdW5jLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJkNDY2YwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9zcmMvSkZ1bmMuamF2YQpAQCAtMCwwICsxLDE0OCBAQAorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK3B1YmxpYyBjbGFzcyBKRnVuYyB7DQorDQorICAgIFN0cmluZyBjbGFzc05hbWUgPSAiY29tLmdvb2dsZS5hbmRyb2lkLmdsZXNfam5pLkdMMTFJbXBsIjsNCisNCisgICAgQ0Z1bmMgY2Z1bmM7DQorICAgIEpUeXBlIGZ0eXBlOw0KKyAgICBTdHJpbmcgZm5hbWU7DQorDQorICAgIExpc3Q8U3RyaW5nPiBhcmdOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KKyAgICBMaXN0PEpUeXBlPiBhcmdUeXBlcyA9IG5ldyBBcnJheUxpc3Q8SlR5cGU+KCk7DQorICAgIExpc3Q8SW50ZWdlcj4gYXJnQ0luZGljZXMgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7DQorDQorICAgIGJvb2xlYW4gaGFzQnVmZmVyQXJnID0gZmFsc2U7DQorICAgIGJvb2xlYW4gaGFzVHlwZWRCdWZmZXJBcmcgPSBmYWxzZTsNCisgICAgQXJyYXlMaXN0PFN0cmluZz4gYnVmZmVyQXJnTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCisNCisgICAgcHVibGljIEpGdW5jKENGdW5jIGNmdW5jKSB7DQorICAgICAgICB0aGlzLmNmdW5jID0gY2Z1bmM7DQorICAgIH0NCisNCisgICAgcHVibGljIENGdW5jIGdldENGdW5jKCkgew0KKyAgICAgICAgcmV0dXJuIGNmdW5jOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIGZuYW1lKSB7DQorICAgICAgICB0aGlzLmZuYW1lID0gZm5hbWU7DQorICAgIH0NCisNCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgew0KKyAgICAgICAgcmV0dXJuIGZuYW1lOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoSlR5cGUgZnR5cGUpIHsNCisgICAgICAgIHRoaXMuZnR5cGUgPSBmdHlwZTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgSlR5cGUgZ2V0VHlwZSgpIHsNCisgICAgICAgIHJldHVybiBmdHlwZTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgew0KKyAgICAgICAgdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7DQorICAgIH0NCisNCisgICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7DQorICAgICAgICByZXR1cm4gY2xhc3NOYW1lOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNCdWZmZXJBcmcoKSB7DQorICAgICAgICByZXR1cm4gaGFzQnVmZmVyQXJnOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGhhc1R5cGVkQnVmZmVyQXJnKCkgew0KKyAgICAgICAgcmV0dXJuIGhhc1R5cGVkQnVmZmVyQXJnOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QnVmZmVyQXJnTmFtZShpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiBidWZmZXJBcmdOYW1lcy5nZXQoaW5kZXgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIGFkZEFyZ3VtZW50KFN0cmluZyBhcmdOYW1lLCBKVHlwZSBhcmdUeXBlLCBpbnQgY2luZGV4KSB7DQorICAgICAgICBhcmdOYW1lcy5hZGQoYXJnTmFtZSk7DQorICAgICAgICBhcmdUeXBlcy5hZGQoYXJnVHlwZSk7DQorICAgICAgICBhcmdDSW5kaWNlcy5hZGQobmV3IEludGVnZXIoY2luZGV4KSk7DQorDQorICAgICAgICBpZiAoYXJnVHlwZS5pc0J1ZmZlcigpKSB7DQorICAgICAgICAgICAgaGFzQnVmZmVyQXJnID0gdHJ1ZTsNCisgICAgICAgICAgICBidWZmZXJBcmdOYW1lcy5hZGQoYXJnTmFtZSk7DQorICAgICAgICB9DQorICAgICAgICBpZiAoYXJnVHlwZS5pc1R5cGVkQnVmZmVyKCkpIHsNCisgICAgICAgICAgICBoYXNUeXBlZEJ1ZmZlckFyZyA9IHRydWU7DQorICAgICAgICAgICAgYnVmZmVyQXJnTmFtZXMuYWRkKGFyZ05hbWUpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHB1YmxpYyBpbnQgZ2V0TnVtQXJncygpIHsNCisgICAgICAgIHJldHVybiBhcmdOYW1lcy5zaXplKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGludCBnZXRBcmdJbmRleChTdHJpbmcgbmFtZSkgew0KKyAgICAgICAgaW50IGxlbiA9IGFyZ05hbWVzLnNpemUoKTsNCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsNCisgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoYXJnTmFtZXMuZ2V0KGkpKSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gaTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gLTE7DQorICAgIH0NCisNCisgICAgcHVibGljIFN0cmluZyBnZXRBcmdOYW1lKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIGFyZ05hbWVzLmdldChpbmRleCk7DQorICAgIH0NCisNCisgICAgcHVibGljIEpUeXBlIGdldEFyZ1R5cGUoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gYXJnVHlwZXMuZ2V0KGluZGV4KTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgaW50IGdldEFyZ0NJbmRleChpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiBhcmdDSW5kaWNlcy5nZXQoaW5kZXgpLmludFZhbHVlKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIHN0YXRpYyBKRnVuYyBjb252ZXJ0KENGdW5jIGNmdW5jLCBib29sZWFuIHVzZUFycmF5KSB7DQorICAgICAgICBKRnVuYyBqZnVuYyA9IG5ldyBKRnVuYyhjZnVuYyk7DQorICAgICAgICBqZnVuYy5zZXROYW1lKGNmdW5jLmdldE5hbWUoKSk7DQorICAgICAgICBqZnVuYy5zZXRUeXBlKEpUeXBlLmNvbnZlcnQoY2Z1bmMuZ2V0VHlwZSgpLCBmYWxzZSkpOw0KKwkNCisgICAgICAgIGludCBudW1BcmdzID0gY2Z1bmMuZ2V0TnVtQXJncygpOw0KKyAgICAgICAgaW50IG51bU9mZnNldHMgPSAwOw0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1BcmdzOyBpKyspIHsNCisgICAgICAgICAgICBDVHlwZSBjQXJnVHlwZSA9IGNmdW5jLmdldEFyZ1R5cGUoaSk7DQorICAgICAgICAgICAgaWYgKGNBcmdUeXBlLmlzVHlwZWRQb2ludGVyKCkgJiYgdXNlQXJyYXkpIHsNCisgICAgICAgICAgICAgICAgKytudW1PZmZzZXRzOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQXJnczsgaSsrKSB7DQorICAgICAgICAgICAgU3RyaW5nIGNBcmdOYW1lID0gY2Z1bmMuZ2V0QXJnTmFtZShpKTsNCisgICAgICAgICAgICBDVHlwZSBjQXJnVHlwZSA9IGNmdW5jLmdldEFyZ1R5cGUoaSk7DQorDQorICAgICAgICAgICAgamZ1bmMuYWRkQXJndW1lbnQoY0FyZ05hbWUsIEpUeXBlLmNvbnZlcnQoY0FyZ1R5cGUsIHVzZUFycmF5KSwgaSk7DQorICAgICAgICAgICAgaWYgKGNBcmdUeXBlLmlzVHlwZWRQb2ludGVyKCkgJiYgdXNlQXJyYXkpIHsNCisgICAgICAgICAgICAgICAgaWYgKG51bU9mZnNldHMgPiAxKSB7DQorICAgICAgICAgICAgICAgICAgICBqZnVuYy5hZGRBcmd1bWVudChjQXJnTmFtZSArICJPZmZzZXQiLCBuZXcgSlR5cGUoImludCIpLCBpKTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIGpmdW5jLmFkZEFyZ3VtZW50KCJvZmZzZXQiLCBuZXcgSlR5cGUoImludCIpLCBpKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHJldHVybiBqZnVuYzsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KKyAgICAgICAgU3RyaW5nIHMgPSAgIkZ1bmN0aW9uICIgKyBmbmFtZSArICIgcmV0dXJucyAiICsgZnR5cGUgKyAiOiAiOw0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdOYW1lcy5zaXplKCk7IGkrKykgew0KKyAgICAgICAgICAgIGlmIChpID4gMCkgew0KKyAgICAgICAgICAgICAgICBzICs9ICIsICI7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHMgKz0gYXJnVHlwZXMuZ2V0KGkpICsgIiAiICsgYXJnTmFtZXMuZ2V0KGkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHM7DQorICAgIH0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9KVHlwZS5qYXZhIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9KVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNmQ0NDAKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0pUeXBlLmphdmEKQEAgLTAsMCArMSwxMzkgQEAKKw0KK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCisNCitwdWJsaWMgY2xhc3MgSlR5cGUgew0KKyAgICANCisgICAgU3RyaW5nIGJhc2VUeXBlOw0KKyAgICBib29sZWFuIGlzQXJyYXk7DQorICAgIGJvb2xlYW4gaXNDbGFzczsNCisNCisgICAgc3RhdGljIEhhc2hNYXA8Q1R5cGUsSlR5cGU+IHR5cGVNYXBwaW5nID0gbmV3IEhhc2hNYXA8Q1R5cGUsSlR5cGU+KCk7DQorICAgIHN0YXRpYyBIYXNoTWFwPENUeXBlLEpUeXBlPiBhcnJheVR5cGVNYXBwaW5nID0gbmV3IEhhc2hNYXA8Q1R5cGUsSlR5cGU+KCk7DQorDQorICAgIHN0YXRpYyB7DQorCS8vIFByaW1pdGl2ZSB0eXBlcw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGJpdGZpZWxkIiksIG5ldyBKVHlwZSgiaW50IikpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGJvb2xlYW4iKSwgbmV3IEpUeXBlKCJib29sZWFuIikpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGNsYW1wZiIpLCBuZXcgSlR5cGUoImZsb2F0IikpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGNsYW1weCIpLCBuZXcgSlR5cGUoImludCIpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xlbnVtIiksIG5ldyBKVHlwZSgiaW50IikpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGZsb2F0IiksIG5ldyBKVHlwZSgiZmxvYXQiKSk7DQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMZml4ZWQiKSwgbmV3IEpUeXBlKCJpbnQiKSk7DQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMaW50IiksIG5ldyBKVHlwZSgiaW50IikpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGludHB0ciIpLCBuZXcgSlR5cGUoImludCIpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xzaG9ydCIpLCBuZXcgSlR5cGUoInNob3J0IikpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTHNpemVpIiksIG5ldyBKVHlwZSgiaW50IikpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTHNpemVpcHRyIiksIG5ldyBKVHlwZSgiaW50IikpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTHVieXRlIiksIG5ldyBKVHlwZSgiYnl0ZSIpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0x1aW50IiksIG5ldyBKVHlwZSgiaW50IikpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJ2b2lkIiksIG5ldyBKVHlwZSgidm9pZCIpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0x1Ynl0ZSIsIHRydWUsIHRydWUpLCBuZXcgSlR5cGUoIlN0cmluZyIpKTsNCisNCisJLy8gVW50eXBlZCBwb2ludGVycyBtYXAgdG8gdW50eXBlZCBCdWZmZXJzDQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMdm9pZCIsIHRydWUsIHRydWUpLA0KKwkJCW5ldyBKVHlwZSgiamF2YS5uaW8uQnVmZmVyIiwgdHJ1ZSwgZmFsc2UpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0x2b2lkIiwgZmFsc2UsIHRydWUpLA0KKwkJCW5ldyBKVHlwZSgiamF2YS5uaW8uQnVmZmVyIiwgdHJ1ZSwgZmFsc2UpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgidm9pZCIsIGZhbHNlLCB0cnVlKSwNCisJCQluZXcgSlR5cGUoImphdmEubmlvLkJ1ZmZlciIsIHRydWUsIGZhbHNlKSk7DQorDQorCS8vIFR5cGVkIHBvaW50ZXJzIG1hcCB0byB0eXBlZCBCdWZmZXJzDQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMYm9vbGVhbiIsIGZhbHNlLCB0cnVlKSwNCisJCQluZXcgSlR5cGUoImphdmEubmlvLkludEJ1ZmZlciIsIHRydWUsIGZhbHNlKSk7DQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMZml4ZWQiLCBmYWxzZSwgdHJ1ZSksDQorCQkJbmV3IEpUeXBlKCJqYXZhLm5pby5JbnRCdWZmZXIiLCB0cnVlLCBmYWxzZSkpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGZpeGVkIiwgdHJ1ZSwgdHJ1ZSksDQorCQkJbmV3IEpUeXBlKCJqYXZhLm5pby5JbnRCdWZmZXIiLCB0cnVlLCBmYWxzZSkpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGZsb2F0IiwgZmFsc2UsIHRydWUpLA0KKwkJCW5ldyBKVHlwZSgiamF2YS5uaW8uRmxvYXRCdWZmZXIiLCB0cnVlLCBmYWxzZSkpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGZsb2F0IiwgdHJ1ZSwgdHJ1ZSksDQorCQkJbmV3IEpUeXBlKCJqYXZhLm5pby5GbG9hdEJ1ZmZlciIsIHRydWUsIGZhbHNlKSk7DQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMaW50IiwgZmFsc2UsIHRydWUpLA0KKwkJCW5ldyBKVHlwZSgiamF2YS5uaW8uSW50QnVmZmVyIiwgdHJ1ZSwgZmFsc2UpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xpbnQiLCB0cnVlLCB0cnVlKSwNCisJCQluZXcgSlR5cGUoImphdmEubmlvLkludEJ1ZmZlciIsIHRydWUsIGZhbHNlKSk7DQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMdWludCIsIGZhbHNlLCB0cnVlKSwNCisJCQluZXcgSlR5cGUoImphdmEubmlvLkludEJ1ZmZlciIsIHRydWUsIGZhbHNlKSk7DQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMdWludCIsIHRydWUsIHRydWUpLA0KKwkJCW5ldyBKVHlwZSgiamF2YS5uaW8uSW50QnVmZmVyIiwgdHJ1ZSwgZmFsc2UpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xzaG9ydCIsIHRydWUsIHRydWUpLA0KKwkJCW5ldyBKVHlwZSgiamF2YS5uaW8uU2hvcnRCdWZmZXIiLCB0cnVlLCBmYWxzZSkpOw0KKw0KKwkvLyBUeXBlZCBwb2ludGVycyBtYXAgdG8gYXJyYXlzICsgb2Zmc2V0cw0KKwlhcnJheVR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMYm9vbGVhbiIsIGZhbHNlLCB0cnVlKSwNCisJCQkgICAgIG5ldyBKVHlwZSgiYm9vbGVhbiIsIGZhbHNlLCB0cnVlKSk7DQorCWFycmF5VHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xmaXhlZCIsIHRydWUsIHRydWUpLCBuZXcgSlR5cGUoImludCIsIGZhbHNlLCB0cnVlKSk7DQorCWFycmF5VHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xmaXhlZCIsIGZhbHNlLCB0cnVlKSwgbmV3IEpUeXBlKCJpbnQiLCBmYWxzZSwgdHJ1ZSkpOw0KKwlhcnJheVR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMZmxvYXQiLCBmYWxzZSwgdHJ1ZSksIG5ldyBKVHlwZSgiZmxvYXQiLCBmYWxzZSwgdHJ1ZSkpOw0KKwlhcnJheVR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMZmxvYXQiLCB0cnVlLCB0cnVlKSwgbmV3IEpUeXBlKCJmbG9hdCIsIGZhbHNlLCB0cnVlKSk7DQorCWFycmF5VHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xpbnQiLCBmYWxzZSwgdHJ1ZSksIG5ldyBKVHlwZSgiaW50IiwgZmFsc2UsIHRydWUpKTsNCisJYXJyYXlUeXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGludCIsIHRydWUsIHRydWUpLCBuZXcgSlR5cGUoImludCIsIGZhbHNlLCB0cnVlKSk7DQorCWFycmF5VHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xzaG9ydCIsIHRydWUsIHRydWUpLCBuZXcgSlR5cGUoInNob3J0IiwgZmFsc2UsIHRydWUpKTsNCisJYXJyYXlUeXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTHVpbnQiLCBmYWxzZSwgdHJ1ZSksIG5ldyBKVHlwZSgiaW50IiwgZmFsc2UsIHRydWUpKTsNCisJYXJyYXlUeXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTHVpbnQiLCB0cnVlLCB0cnVlKSwgbmV3IEpUeXBlKCJpbnQiLCBmYWxzZSwgdHJ1ZSkpOw0KKwlhcnJheVR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMaW50cHRyIiksIG5ldyBKVHlwZSgiaW50IiwgZmFsc2UsIHRydWUpKTsNCisJYXJyYXlUeXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTHNpemVpcHRyIiksIG5ldyBKVHlwZSgiaW50IiwgZmFsc2UsIHRydWUpKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgSlR5cGUoKSB7DQorICAgIH0NCisNCisgICAgcHVibGljIEpUeXBlKFN0cmluZyBwcmltaXRpdmVUeXBlTmFtZSkgew0KKwl0aGlzLmJhc2VUeXBlID0gcHJpbWl0aXZlVHlwZU5hbWU7DQorCXRoaXMuaXNDbGFzcyA9IGZhbHNlOw0KKwl0aGlzLmlzQXJyYXkgPSBmYWxzZTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgSlR5cGUoU3RyaW5nIHByaW1pdGl2ZVR5cGVOYW1lLCBib29sZWFuIGlzQ2xhc3MsIGJvb2xlYW4gaXNBcnJheSkgew0KKwl0aGlzLmJhc2VUeXBlID0gcHJpbWl0aXZlVHlwZU5hbWU7DQorCXRoaXMuaXNDbGFzcyA9IGlzQ2xhc3M7DQorCXRoaXMuaXNBcnJheSA9IGlzQXJyYXk7DQorICAgIH0NCisNCisgICAgcHVibGljIFN0cmluZyBnZXRCYXNlVHlwZSgpIHsNCisJcmV0dXJuIGJhc2VUeXBlOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQorCXJldHVybiBiYXNlVHlwZSArIChpc0FycmF5ID8gIltdIiA6ICIiKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FycmF5KCkgew0KKwlyZXR1cm4gaXNBcnJheTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NsYXNzKCkgew0KKwlyZXR1cm4gaXNDbGFzczsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpIHsNCisJcmV0dXJuICFpc0NsYXNzKCkgJiYgIWlzQXJyYXkoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ZvaWQoKSB7DQorCXJldHVybiBiYXNlVHlwZS5lcXVhbHMoInZvaWQiKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0J1ZmZlcigpIHsNCisJcmV0dXJuIGJhc2VUeXBlLmluZGV4T2YoIkJ1ZmZlciIpICE9IC0xOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGlzVHlwZWRCdWZmZXIoKSB7DQorCXJldHVybiAhYmFzZVR5cGUuZXF1YWxzKCJqYXZhLm5pby5CdWZmZXIiKSAmJg0KKwkgICAgKGJhc2VUeXBlLmluZGV4T2YoIkJ1ZmZlciIpICE9IC0xKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgc3RhdGljIEpUeXBlIGNvbnZlcnQoQ1R5cGUgY3R5cGUsIGJvb2xlYW4gdXNlQXJyYXkpIHsNCisgCUpUeXBlIGphdmFUeXBlID0gbnVsbDsNCisgCWlmICh1c2VBcnJheSkgew0KKyAJICAgIGphdmFUeXBlID0gYXJyYXlUeXBlTWFwcGluZy5nZXQoY3R5cGUpOw0KKyAJfQ0KKyAJaWYgKGphdmFUeXBlID09IG51bGwpIHsNCisgCSAgICBqYXZhVHlwZSA9IHR5cGVNYXBwaW5nLmdldChjdHlwZSk7DQorIAl9DQorIAlpZiAoamF2YVR5cGUgPT0gbnVsbCkgew0KKyAJICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBDIHR5cGU6ICIgKyBjdHlwZSk7DQorIAl9DQorIAlyZXR1cm4gamF2YVR5cGU7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9KbmlDb2RlRW1pdHRlci5qYXZhIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9KbmlDb2RlRW1pdHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzYjlhM2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0puaUNvZGVFbWl0dGVyLmphdmEKQEAgLTAsMCArMSwxMDg2IEBACitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogRW1pdHMgYSBKYXZhIGludGVyZmFjZSBhbmQgSmF2YSAmIEMgaW1wbGVtZW50YXRpb24gZm9yIGEgQyBmdW5jdGlvbi4KKyAqCisgKiA8cD4gVGhlIEphdmEgaW50ZXJmYWNlIHdpbGwgaGF2ZSBCdWZmZXIgYW5kIGFycmF5IHZhcmlhbnRzIGZvciBmdW5jdGlvbnMgdGhhdAorICogaGF2ZSBhIHR5cGVkIHBvaW50ZXIgYXJndW1lbnQuICBUaGUgYXJyYXkgdmFyaWFudCB3aWxsIGNvbnZlcnQgYSBzaW5nbGUgIjx0eXBlPiAqZGF0YSIKKyAqIGFyZ3VtZW50IHRvIGEgcGFpciBvZiBhcmd1bWVudHMgIjx0eXBlPltdIGRhdGEsIGludCBvZmZzZXQiLgorICovCitwdWJsaWMgY2xhc3MgSm5pQ29kZUVtaXR0ZXIgaW1wbGVtZW50cyBDb2RlRW1pdHRlciB7CisKKyAgICAvLyBJZiB0cnVlLCB1c2UgQysrIHN0eWxlIGZvciBjYWxsaW5nIHRocm91Z2ggYSBKTklFbnYgKjoKKyAgICAvLyBlbnYtPkZ1bmMoLi4uKQorICAgIC8vIElmIGZhbHNlLCB1c2UgQyBzdHlsZToKKyAgICAvLyAoKmVudiktPkZ1bmMoZW52LCAuLi4pCisgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gbVVzZUNQbHVzUGx1cyA9IHRydWU7CisKKyAgICBib29sZWFuIG1Vc2VDb250ZXh0UG9pbnRlciA9IHRydWU7CisKKyAgICBTdHJpbmcgbUNsYXNzUGF0aE5hbWU7CisgICAgCisgICAgUGFyYW1ldGVyQ2hlY2tlciBtQ2hlY2tlcjsKKyAgICBQcmludFN0cmVhbSBtSmF2YTEwSW50ZXJmYWNlU3RyZWFtOworICAgIFByaW50U3RyZWFtIG1KYXZhMTBFeHRJbnRlcmZhY2VTdHJlYW07CisgICAgUHJpbnRTdHJlYW0gbUphdmExMUludGVyZmFjZVN0cmVhbTsKKyAgICBQcmludFN0cmVhbSBtSmF2YTExRXh0SW50ZXJmYWNlU3RyZWFtOworICAgIFByaW50U3RyZWFtIG1KYXZhMTFFeHRQYWNrSW50ZXJmYWNlU3RyZWFtOworICAgIFByaW50U3RyZWFtIG1KYXZhSW1wbFN0cmVhbTsKKyAgICBQcmludFN0cmVhbSBtQ1N0cmVhbTsKKworICAgIFByaW50U3RyZWFtIG1KYXZhSW50ZXJmYWNlU3RyZWFtOworCisgICAgTGlzdDxTdHJpbmc+IG5hdGl2ZVJlZ2lzdHJhdGlvbnMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKworICAgIGJvb2xlYW4gbmVlZHNFeGl0OworCisgICAgc3RhdGljIFN0cmluZyBpbmRlbnQgPSAiICAgICI7CisKKyAgICBIYXNoU2V0PFN0cmluZz4gbUZ1bmN0aW9uc0VtaXR0ZWQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gamF2YTEwSW50ZXJmYWNlU3RyZWFtIHRoZSBQcmludFN0cmVhbSB0byB3aGljaCB0byBlbWl0IHRoZSBKYXZhIGludGVyZmFjZSBmb3IgR0wgMS4wIGZ1bmN0aW9ucworICAgICAqIEBwYXJhbSBqYXZhMTBFeHRJbnRlcmZhY2VTdHJlYW0gdGhlIFByaW50U3RyZWFtIHRvIHdoaWNoIHRvIGVtaXQgdGhlIEphdmEgaW50ZXJmYWNlIGZvciBHTCAxLjAgZXh0ZW5zaW9uIGZ1bmN0aW9ucworICAgICAqIEBwYXJhbSBqYXZhMTFJbnRlcmZhY2VTdHJlYW0gdGhlIFByaW50U3RyZWFtIHRvIHdoaWNoIHRvIGVtaXQgdGhlIEphdmEgaW50ZXJmYWNlIGZvciBHTCAxLjEgZnVuY3Rpb25zIAorICAgICAqIEBwYXJhbSBqYXZhMTFFeHRJbnRlcmZhY2VTdHJlYW0gdGhlIFByaW50U3RyZWFtIHRvIHdoaWNoIHRvIGVtaXQgdGhlIEphdmEgaW50ZXJmYWNlIGZvciBHTCAxLjEgRXh0ZW5zaW9uIGZ1bmN0aW9ucworICAgICAqIEBwYXJhbSBqYXZhMTFFeHRQYWNrSW50ZXJmYWNlU3RyZWFtIHRoZSBQcmludFN0cmVhbSB0byB3aGljaCB0byBlbWl0IHRoZSBKYXZhIGludGVyZmFjZSBmb3IgR0wgMS4xIEV4dGVuc2lvbiBQYWNrIGZ1bmN0aW9ucworICAgICAqIEBwYXJhbSBqYXZhSW1wbFN0cmVhbSB0aGUgUHJpbnRTdHJlYW0gdG8gd2hpY2ggdG8gZW1pdCB0aGUgSmF2YSBpbXBsZW1lbnRhdGlvbgorICAgICAqIEBwYXJhbSBjU3RyZWFtIHRoZSBQcmludFN0cmVhbSB0byB3aGljaCB0byBlbWl0IHRoZSBDIGltcGxlbWVudGF0aW9uCisgICAgICovCisgICAgcHVibGljIEpuaUNvZGVFbWl0dGVyKFN0cmluZyBjbGFzc1BhdGhOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJDaGVja2VyIGNoZWNrZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50U3RyZWFtIGphdmExMEludGVyZmFjZVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRTdHJlYW0gamF2YTEwRXh0SW50ZXJmYWNlU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFN0cmVhbSBqYXZhMTFJbnRlcmZhY2VTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50U3RyZWFtIGphdmExMUV4dEludGVyZmFjZVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRTdHJlYW0gamF2YTExRXh0UGFja0ludGVyZmFjZVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRTdHJlYW0gamF2YUltcGxTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50U3RyZWFtIGNTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdXNlQ29udGV4dFBvaW50ZXIpIHsKKyAgICAgICAgbUNsYXNzUGF0aE5hbWUgPSBjbGFzc1BhdGhOYW1lOworICAgICAgICBtQ2hlY2tlciA9IGNoZWNrZXI7CisgICAgICAgIG1KYXZhMTBJbnRlcmZhY2VTdHJlYW0gPSBqYXZhMTBJbnRlcmZhY2VTdHJlYW07CisgICAgICAgIG1KYXZhMTBFeHRJbnRlcmZhY2VTdHJlYW0gPSBqYXZhMTBFeHRJbnRlcmZhY2VTdHJlYW07CisgICAgICAgIG1KYXZhMTFJbnRlcmZhY2VTdHJlYW0gPSBqYXZhMTFJbnRlcmZhY2VTdHJlYW07CisgICAgICAgIG1KYXZhMTFFeHRJbnRlcmZhY2VTdHJlYW0gPSBqYXZhMTFFeHRJbnRlcmZhY2VTdHJlYW07CisgICAgICAgIG1KYXZhMTFFeHRQYWNrSW50ZXJmYWNlU3RyZWFtID0gamF2YTExRXh0UGFja0ludGVyZmFjZVN0cmVhbTsKKyAgICAgICAgbUphdmFJbXBsU3RyZWFtID0gamF2YUltcGxTdHJlYW07CisgICAgICAgIG1DU3RyZWFtID0gY1N0cmVhbTsKKyAgICAgICAgbVVzZUNvbnRleHRQb2ludGVyID0gdXNlQ29udGV4dFBvaW50ZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VmVyc2lvbihpbnQgdmVyc2lvbiwgYm9vbGVhbiBleHQsIGJvb2xlYW4gcGFjaykgeworICAgICAgICBpZiAodmVyc2lvbiA9PSAwKSB7CisgICAgICAgICAgICBtSmF2YUludGVyZmFjZVN0cmVhbSA9IGV4dCA/IG1KYXZhMTBFeHRJbnRlcmZhY2VTdHJlYW0gOgorICAgICAgICAgICAgICAgIG1KYXZhMTBJbnRlcmZhY2VTdHJlYW07CisgICAgICAgIH0gZWxzZSBpZiAodmVyc2lvbiA9PSAxKSB7CisgICAgICAgICAgICBtSmF2YUludGVyZmFjZVN0cmVhbSA9IGV4dCA/CisgICAgICAgICAgICAgICAgKHBhY2sgPyBtSmF2YTExRXh0UGFja0ludGVyZmFjZVN0cmVhbSA6CisgICAgICAgICAgICAgICAgIG1KYXZhMTFFeHRJbnRlcmZhY2VTdHJlYW0pIDoKKyAgICAgICAgICAgICAgICBtSmF2YTExSW50ZXJmYWNlU3RyZWFtOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkJhZCB2ZXJzaW9uOiAiICsgdmVyc2lvbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBlbWl0Q29kZShDRnVuYyBjZnVuYywgU3RyaW5nIG9yaWdpbmFsKSB7CisgICAgICAgIEpGdW5jIGpmdW5jOworICAgICAgICBTdHJpbmcgc2lnbmF0dXJlOworICAgICAgICBib29sZWFuIGR1cGxpY2F0ZTsKKyAgICAgICAgCisgICAgICAgIGlmIChjZnVuYy5oYXNUeXBlZFBvaW50ZXJBcmcoKSkgeworICAgICAgICAgICAgamZ1bmMgPSBKRnVuYy5jb252ZXJ0KGNmdW5jLCB0cnVlKTsKKworICAgICAgICAgICAgLy8gRG9uJ3QgZW1pdCBkdXBsaWNhdGUgZnVuY3Rpb25zCisgICAgICAgICAgICAvLyBUaGVzZSBtYXkgYXBwZWFyIGJlY2F1c2UgdGhleSBhcmUgZGVmaW5lZCBpbiBtdWx0aXBsZQorICAgICAgICAgICAgLy8gSmF2YSBpbnRlcmZhY2VzIChlLmcuLCBHTDExL0dMMTFFeHRlbnNpb25QYWNrKQorICAgICAgICAgICAgc2lnbmF0dXJlID0gamZ1bmMudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGR1cGxpY2F0ZSA9IGZhbHNlOworICAgICAgICAgICAgaWYgKG1GdW5jdGlvbnNFbWl0dGVkLmNvbnRhaW5zKHNpZ25hdHVyZSkpIHsKKyAgICAgICAgICAgICAgICBkdXBsaWNhdGUgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtRnVuY3Rpb25zRW1pdHRlZC5hZGQoc2lnbmF0dXJlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFkdXBsaWNhdGUpIHsKKyAgICAgICAgICAgICAgICBlbWl0TmF0aXZlRGVjbGFyYXRpb24oamZ1bmMsIG1KYXZhSW1wbFN0cmVhbSk7CisgICAgICAgICAgICAgICAgZW1pdEphdmFDb2RlKGpmdW5jLCBtSmF2YUltcGxTdHJlYW0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZW1pdEphdmFJbnRlcmZhY2VDb2RlKGpmdW5jLCBtSmF2YUludGVyZmFjZVN0cmVhbSk7CisgICAgICAgICAgICBpZiAoIWR1cGxpY2F0ZSkgeworICAgICAgICAgICAgICAgIGVtaXRKbmlDb2RlKGpmdW5jLCBtQ1N0cmVhbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBqZnVuYyA9IEpGdW5jLmNvbnZlcnQoY2Z1bmMsIGZhbHNlKTsKKworICAgICAgICBzaWduYXR1cmUgPSBqZnVuYy50b1N0cmluZygpOworICAgICAgICBkdXBsaWNhdGUgPSBmYWxzZTsKKyAgICAgICAgaWYgKG1GdW5jdGlvbnNFbWl0dGVkLmNvbnRhaW5zKHNpZ25hdHVyZSkpIHsKKyAgICAgICAgICAgIGR1cGxpY2F0ZSA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtRnVuY3Rpb25zRW1pdHRlZC5hZGQoc2lnbmF0dXJlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghZHVwbGljYXRlKSB7CisgICAgICAgICAgICBlbWl0TmF0aXZlRGVjbGFyYXRpb24oamZ1bmMsIG1KYXZhSW1wbFN0cmVhbSk7CisgICAgICAgIH0KKyAgICAgICAgZW1pdEphdmFJbnRlcmZhY2VDb2RlKGpmdW5jLCBtSmF2YUludGVyZmFjZVN0cmVhbSk7CisgICAgICAgIGlmICghZHVwbGljYXRlKSB7CisgICAgICAgICAgICBlbWl0SmF2YUNvZGUoamZ1bmMsIG1KYXZhSW1wbFN0cmVhbSk7CisgICAgICAgICAgICBlbWl0Sm5pQ29kZShqZnVuYywgbUNTdHJlYW0pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZW1pdE5hdGl2ZURlY2xhcmF0aW9uKEpGdW5jIGpmdW5jLCBQcmludFN0cmVhbSBvdXQpIHsKKyAgICAgICAgb3V0LnByaW50bG4oIiAgICAvLyBDIGZ1bmN0aW9uICIgKyBqZnVuYy5nZXRDRnVuYygpLmdldE9yaWdpbmFsKCkpOworICAgICAgICBvdXQucHJpbnRsbigpOworCisgICAgICAgIGVtaXRGdW5jdGlvbihqZnVuYywgb3V0LCB0cnVlLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZW1pdEphdmFJbnRlcmZhY2VDb2RlKEpGdW5jIGpmdW5jLCBQcmludFN0cmVhbSBvdXQpIHsKKyAgICAgICAgZW1pdEZ1bmN0aW9uKGpmdW5jLCBvdXQsIGZhbHNlLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBlbWl0SmF2YUNvZGUoSkZ1bmMgamZ1bmMsIFByaW50U3RyZWFtIG91dCkgeworICAgICAgICBlbWl0RnVuY3Rpb24oamZ1bmMsIG91dCwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisgICAgCisgICAgdm9pZCBlbWl0RnVuY3Rpb25DYWxsKEpGdW5jIGpmdW5jLCBQcmludFN0cmVhbSBvdXQsIFN0cmluZyBpaWksIGJvb2xlYW4gZ3JhYkFycmF5ICkgeworICAgICAgICBib29sZWFuIGlzVm9pZCA9IGpmdW5jLmdldFR5cGUoKS5pc1ZvaWQoKTsKKyAgICAgICAgYm9vbGVhbiBpc1BvaW50ZXJGdW5jID0gamZ1bmMuZ2V0TmFtZSgpLmVuZHNXaXRoKCJQb2ludGVyIikgJiYKKyAgICAgICAgICAgIGpmdW5jLmdldENGdW5jKCkuaGFzUG9pbnRlckFyZygpOworCisgICAgICAgIGlmICghaXNWb2lkKSB7CisgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKworICAgICAgICAgICAgICAgICAgICAgICAgamZ1bmMuZ2V0VHlwZSgpICsgIiBfcmV0dXJuVmFsdWU7Iik7CisgICAgICAgIH0KKyAgICAgICAgb3V0LnByaW50bG4oaWlpICsKKyAgICAgICAgICAgICAgICAgICAgKGlzVm9pZCA/ICIiIDogIl9yZXR1cm5WYWx1ZSA9ICIpICsKKyAgICAgICAgICAgICAgICAgICAgamZ1bmMuZ2V0TmFtZSgpICsKKyAgICAgICAgICAgICAgICAgICAgKGlzUG9pbnRlckZ1bmMgPyAiQm91bmRzIiA6ICIiICkgKworICAgICAgICAgICAgICAgICAgICAiKCIpOworCQorICAgICAgICBpbnQgbnVtQXJncyA9IGpmdW5jLmdldE51bUFyZ3MoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1BcmdzOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyBhcmdOYW1lID0gamZ1bmMuZ2V0QXJnTmFtZShpKTsKKyAgICAgICAgICAgIEpUeXBlIGFyZ1R5cGUgPSBqZnVuYy5nZXRBcmdUeXBlKGkpOworCisgICAgICAgICAgICBpZiAoZ3JhYkFycmF5ICYmIGFyZ1R5cGUuaXNUeXBlZEJ1ZmZlcigpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHR5cGVOYW1lID0gYXJnVHlwZS5nZXRCYXNlVHlwZSgpOworICAgICAgICAgICAgICAgIHR5cGVOYW1lID0gdHlwZU5hbWUuc3Vic3RyaW5nKDksIHR5cGVOYW1lLmxlbmd0aCgpIC0gNik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgaW5kZW50ICsgImdldCIgKyB0eXBlTmFtZSArICJBcnJheSgiICsgYXJnTmFtZSArICIpLCIpOworICAgICAgICAgICAgICAgIG91dC5wcmludChpaWkgKyBpbmRlbnQgKyAiZ2V0T2Zmc2V0KCIgKyBhcmdOYW1lICsgIikiKTsgCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG91dC5wcmludChpaWkgKyBpbmRlbnQgKyBhcmdOYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpID09IG51bUFyZ3MgLSAxKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzUG9pbnRlckZ1bmMpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIiwiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgaW5kZW50ICsgYXJnTmFtZSArICIucmVtYWluaW5nKCkiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIiwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCQorICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiKTsiKTsKKyAgICB9CisKKyAgICB2b2lkIHByaW50SWZjaGVja1Bvc3RhbWJsZShQcmludFN0cmVhbSBvdXQsIGJvb2xlYW4gaXNCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBlbWl0RXhjZXB0aW9uQ2hlY2ssIFN0cmluZyBpaWkpIHsKKyAgICAgICAgcHJpbnRJZmNoZWNrUG9zdGFtYmxlKG91dCwgaXNCdWZmZXIsIGVtaXRFeGNlcHRpb25DaGVjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvZmZzZXQiLCAiX3JlbWFpbmluZyIsIGlpaSk7CisgICAgfQorCisgICAgdm9pZCBwcmludElmY2hlY2tQb3N0YW1ibGUoUHJpbnRTdHJlYW0gb3V0LCBib29sZWFuIGlzQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZW1pdEV4Y2VwdGlvbkNoZWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvZmZzZXQsIFN0cmluZyByZW1haW5pbmcsIFN0cmluZyBpaWkpIHsKKyAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICBkZWZhdWx0OiIpOworICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAgICBfbmVlZGVkID0gMDsiKTsKKyAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgICAgYnJlYWs7Iik7CisgICAgICAgIG91dC5wcmludGxuKGlpaSArICJ9Iik7CisKKyAgICAgICAgb3V0LnByaW50bG4oaWlpICsgImlmICgiICsgcmVtYWluaW5nICsgIiA8IF9uZWVkZWQpIHsiKTsKKyAgICAgICAgaWYgKGVtaXRFeGNlcHRpb25DaGVjaykgeworICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgaW5kZW50ICsgIl9leGNlcHRpb24gPSAxOyIpOworICAgICAgICB9CisgICAgICAgIG91dC5wcmludGxuKGlpaSArIGluZGVudCArCisgICAgICAgICAgICAgICAgICAgIChtVXNlQ1BsdXNQbHVzID8gIl9lbnYiIDogIigqX2VudikiKSArCisgICAgICAgICAgICAgICAgICAgICItPlRocm93TmV3KCIgKworICAgICAgICAgICAgICAgICAgICAobVVzZUNQbHVzUGx1cyA/ICIiIDogIl9lbnYsICIpICsKKyAgICAgICAgICAgICAgICAgICAgIklBRUNsYXNzLCAiICsKKyAgICAgICAgICAgICAgICAgICAgIlwiIiArCisgICAgICAgICAgICAgICAgICAgIChpc0J1ZmZlciA/IAorICAgICAgICAgICAgICAgICAgICAgInJlbWFpbmluZygpIiA6ICJsZW5ndGggLSAiICsgb2Zmc2V0KSArCisgICAgICAgICAgICAgICAgICAgICIgPCBuZWVkZWRcIik7Iik7CisgICAgICAgIG91dC5wcmludGxuKGlpaSArIGluZGVudCArICJnb3RvIGV4aXQ7Iik7CisgICAgICAgIG5lZWRzRXhpdCA9IHRydWU7CisgICAgICAgIG91dC5wcmludGxuKGlpaSArICJ9Iik7CisgICAgfQorCisgICAgYm9vbGVhbiBpc051bGxBbGxvd2VkKENGdW5jIGNmdW5jKSB7CisgICAgICAgIFN0cmluZ1tdIGNoZWNrcyA9IG1DaGVja2VyLmdldENoZWNrcyhjZnVuYy5nZXROYW1lKCkpOworICAgICAgICBpbnQgaW5kZXggPSAxOworICAgICAgICBpZiAoY2hlY2tzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IGNoZWNrcy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBpZiAoY2hlY2tzW2luZGV4XS5lcXVhbHMoInJldHVybiIpKSB7CisgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDI7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLnN0YXJ0c1dpdGgoImNoZWNrIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrc1tpbmRleF0uZXF1YWxzKCJpZmNoZWNrIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gNTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrc1tpbmRleF0uZXF1YWxzKCJ1bnN1cHBvcnRlZCIpKSB7CisgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLmVxdWFscygibnVsbEFsbG93ZWQiKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yOiB1bmtub3duIGtleXdvcmQgXCIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrc1tpbmRleF0gKyAiXCIiKTsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBTdHJpbmcgZ2V0RXJyb3JSZXR1cm5WYWx1ZShDRnVuYyBjZnVuYykgeworICAgICAgICBDVHlwZSByZXR1cm5UeXBlID0gY2Z1bmMuZ2V0VHlwZSgpOworICAgICAgICBib29sZWFuIGlzVm9pZCA9IHJldHVyblR5cGUuaXNWb2lkKCk7CisgICAgICAgIGlmIChpc1ZvaWQpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nW10gY2hlY2tzID0gbUNoZWNrZXIuZ2V0Q2hlY2tzKGNmdW5jLmdldE5hbWUoKSk7CisKKyAgICAgICAgaW50IGluZGV4ID0gMTsKKyAgICAgICAgaWYgKGNoZWNrcyAhPSBudWxsKSB7CisgICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBjaGVja3MubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgaWYgKGNoZWNrc1tpbmRleF0uZXF1YWxzKCJyZXR1cm4iKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2hlY2tzW2luZGV4ICsgMV07CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLnN0YXJ0c1dpdGgoImNoZWNrIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrc1tpbmRleF0uZXF1YWxzKCJpZmNoZWNrIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gNTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrc1tpbmRleF0uZXF1YWxzKCJ1bnN1cHBvcnRlZCIpKSB7CisgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLmVxdWFscygibnVsbEFsbG93ZWQiKSkgeworICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAxOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3I6IHVua25vd24ga2V5d29yZCBcIiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tzW2luZGV4XSArICJcIiIpOworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBib29sZWFuIGlzVW5zdXBwb3J0ZWRGdW5jKENGdW5jIGNmdW5jKSB7CisgICAgICAgIFN0cmluZ1tdIGNoZWNrcyA9IG1DaGVja2VyLmdldENoZWNrcyhjZnVuYy5nZXROYW1lKCkpOworICAgICAgICBpbnQgaW5kZXggPSAxOworICAgICAgICBpZiAoY2hlY2tzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IGNoZWNrcy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBpZiAoY2hlY2tzW2luZGV4XS5lcXVhbHMoInVuc3VwcG9ydGVkIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLmVxdWFscygicmV0dXJuIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrc1tpbmRleF0uc3RhcnRzV2l0aCgiY2hlY2siKSkgeworICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAzOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tzW2luZGV4XS5lcXVhbHMoImlmY2hlY2siKSkgeworICAgICAgICAgICAgICAgICAgICBpbmRleCArPSA1OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tzW2luZGV4XS5lcXVhbHMoIm51bGxBbGxvd2VkIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yOiB1bmtub3duIGtleXdvcmQgXCIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrc1tpbmRleF0gKyAiXCIiKTsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2b2lkIGVtaXROYXRpdmVCb3VuZHNDaGVja3MoQ0Z1bmMgY2Z1bmMsIFN0cmluZyBjbmFtZSwgUHJpbnRTdHJlYW0gb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzQnVmZmVyLCBib29sZWFuIGVtaXRFeGNlcHRpb25DaGVjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG9mZnNldCwgU3RyaW5nIHJlbWFpbmluZywgU3RyaW5nIGlpaSkgeworICAgICAgICBDVHlwZSByZXR1cm5UeXBlID0gY2Z1bmMuZ2V0VHlwZSgpOworICAgICAgICBib29sZWFuIGlzVm9pZCA9IHJldHVyblR5cGUuaXNWb2lkKCk7CisKKyAgICAgICAgU3RyaW5nW10gY2hlY2tzID0gbUNoZWNrZXIuZ2V0Q2hlY2tzKGNmdW5jLmdldE5hbWUoKSk7CisgICAgICAgIFN0cmluZyBjaGVja1ZhcjsKKyAgICAgICAgU3RyaW5nIHJldHZhbCA9IGdldEVycm9yUmV0dXJuVmFsdWUoY2Z1bmMpOworCisgICAgICAgIGJvb2xlYW4gbGFzdFdhc0lmY2hlY2sgPSBmYWxzZTsKKworICAgICAgICBpbnQgaW5kZXggPSAxOworICAgICAgICBpZiAoY2hlY2tzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gcmVtYWluaW5nRGVjbGFyZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGJvb2xlYW4gbnVsbENoZWNrRGVjbGFyZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGJvb2xlYW4gb2Zmc2V0Q2hlY2tlZCA9IGZhbHNlOworICAgICAgICAgICAgd2hpbGUgKGluZGV4IDwgY2hlY2tzLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIGlmIChjaGVja3NbaW5kZXhdLnN0YXJ0c1dpdGgoImNoZWNrIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RXYXNJZmNoZWNrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludElmY2hlY2tQb3N0YW1ibGUob3V0LCBpc0J1ZmZlciwgZW1pdEV4Y2VwdGlvbkNoZWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwgcmVtYWluaW5nLCBpaWkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGxhc3RXYXNJZmNoZWNrID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbmFtZSAhPSBudWxsICYmICFjbmFtZS5lcXVhbHMoY2hlY2tzW2luZGV4ICsgMV0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAzOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgImlmICgiICsgcmVtYWluaW5nICsgIiA8ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja3NbaW5kZXggKyAyXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpIHsiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVtaXRFeGNlcHRpb25DaGVjaykgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgaW5kZW50ICsgIl9leGNlcHRpb24gPSAxOyIpOworICAgICAgICAgICAgICAgICAgICB9CisJCSAgICBTdHJpbmcgZXhjZXB0aW9uQ2xhc3NOYW1lID0gIklBRUNsYXNzIjsKKwkJICAgIC8vIElmIHRoZSAiY2hlY2siIGtleXdvcmQgd2FzIG9mIHRoZSBmb3JtCisJCSAgICAvLyAiY2hlY2tfPGNsYXNzIG5hbWU+IiwgdXNlIHRoZSBjbGFzcyBuYW1lIGluIHRoZQorCQkgICAgLy8gZXhjZXB0aW9uIHRvIGJlIHRocm93bgorCQkgICAgaW50IHVuZGVyc2NvcmUgPSBjaGVja3NbaW5kZXhdLmluZGV4T2YoJ18nKTsKKwkJICAgIGlmICh1bmRlcnNjb3JlID49IDApIHsKKwkJCWV4Y2VwdGlvbkNsYXNzTmFtZSA9IGNoZWNrc1tpbmRleF0uc3Vic3RyaW5nKHVuZGVyc2NvcmUgKyAxKSArICJDbGFzcyI7CisJCSAgICB9CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArIGluZGVudCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtVXNlQ1BsdXNQbHVzID8gIl9lbnYiIDogIigqX2VudikiKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItPlRocm93TmV3KCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVVzZUNQbHVzUGx1cyA/ICIiIDogIl9lbnYsICIpICsKKwkJCQlleGNlcHRpb25DbGFzc05hbWUgKyAiLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpc0J1ZmZlciA/IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbWFpbmluZygpIiA6ICJsZW5ndGggLSAiICsgb2Zmc2V0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgPCAiICsgY2hlY2tzW2luZGV4ICsgMl0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIpOyIpOworCisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArIGluZGVudCArICJnb3RvIGV4aXQ7Iik7CisgICAgICAgICAgICAgICAgICAgIG5lZWRzRXhpdCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICJ9Iik7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDM7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLmVxdWFscygiaWZjaGVjayIpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIG1hdGNoZXMgPSBjaGVja3NbaW5kZXggKyA0XS5zcGxpdCgiLCIpOworCisgICAgICAgICAgICAgICAgICAgIGlmICghbGFzdFdhc0lmY2hlY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICJpbnQgX25lZWRlZDsiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3dpdGNoICgiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrc1tpbmRleCArIDNdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpIHsiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXRjaGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiI2lmIGRlZmluZWQoIiArIG1hdGNoZXNbaV0gKyAiKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgY2FzZSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXNbaV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjoiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIjZW5kaWYgLy8gZGVmaW5lZCgiICsgbWF0Y2hlc1tpXSArICIpIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgX25lZWRlZCA9ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja3NbaW5kZXggKyAyXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI7Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgIGJyZWFrOyIpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBsYXN0V2FzSWZjaGVjayA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLmVxdWFscygicmV0dXJuIikpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDI7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLmVxdWFscygidW5zdXBwb3J0ZWQiKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrc1tpbmRleF0uZXF1YWxzKCJudWxsQWxsb3dlZCIpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAxOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3I6IHVua25vd24ga2V5d29yZCBcIiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tzW2luZGV4XSArICJcIiIpOworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobGFzdFdhc0lmY2hlY2spIHsKKyAgICAgICAgICAgIHByaW50SWZjaGVja1Bvc3RhbWJsZShvdXQsIGlzQnVmZmVyLCBlbWl0RXhjZXB0aW9uQ2hlY2ssIGlpaSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sZWFuIGhhc05vbkNvbnN0QXJnKEpGdW5jIGpmdW5jLCBDRnVuYyBjZnVuYywKKyAgICAgICAgTGlzdDxJbnRlZ2VyPiBub25QcmltaXRpdmVBcmdzKSB7CisgICAgICAgIGlmIChub25QcmltaXRpdmVBcmdzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBub25QcmltaXRpdmVBcmdzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgaW50IGlkeCA9IG5vblByaW1pdGl2ZUFyZ3MuZ2V0KGkpLmludFZhbHVlKCk7CisgICAgICAgICAgICAgICAgaW50IGNJbmRleCA9IGpmdW5jLmdldEFyZ0NJbmRleChpZHgpOworICAgICAgICAgICAgICAgIGlmIChqZnVuYy5nZXRBcmdUeXBlKGlkeCkuaXNBcnJheSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghY2Z1bmMuZ2V0QXJnVHlwZShjSW5kZXgpLmlzQ29uc3QoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGpmdW5jLmdldEFyZ1R5cGUoaWR4KS5pc0J1ZmZlcigpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghY2Z1bmMuZ2V0QXJnVHlwZShjSW5kZXgpLmlzQ29uc3QoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEVtaXQgYSBmdW5jdGlvbiBpbiBzZXZlcmFsIHZhcmlhbnRzOgorICAgICAqCisgICAgICogaWYgbmF0aXZlRGVjbDogcHVibGljIG5hdGl2ZSA8cmV0dXJudHlwZT4gZnVuYyhhcmdzKTsKKyAgICAgKgorICAgICAqIGlmICFuYXRpdmVEZWNsOgorICAgICAqICAgaWYgaW50ZXJmYWNlRGVjbDogIHB1YmxpYyA8cmV0dXJudHlwZT4gZnVuYyhhcmdzKTsKKyAgICAgKiAgIGlmICFpbnRlcmZhY2VEZWNsOiBwdWJsaWMgPHJldHVybnR5cGU+IGZ1bmMoYXJncykgeyBib2R5IH0KKyAgICAgKi8KKyAgICB2b2lkIGVtaXRGdW5jdGlvbihKRnVuYyBqZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICBQcmludFN0cmVhbSBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBuYXRpdmVEZWNsLCBib29sZWFuIGludGVyZmFjZURlY2wpIHsKKyAgICAgICAgYm9vbGVhbiBpc1BvaW50ZXJGdW5jID0KKyAgICAgICAgICAgIGpmdW5jLmdldE5hbWUoKS5lbmRzV2l0aCgiUG9pbnRlciIpICYmCisgICAgICAgICAgICBqZnVuYy5nZXRDRnVuYygpLmhhc1BvaW50ZXJBcmcoKTsKKworICAgICAgICBpZiAoIW5hdGl2ZURlY2wgJiYgIWludGVyZmFjZURlY2wgJiYgIWlzUG9pbnRlckZ1bmMpIHsKKyAgICAgICAgICAgIC8vIElmIGl0J3Mgbm90IGEgcG9pbnRlciBmdW5jdGlvbiwgd2UndmUgYWxyZWFkeSBlbWl0dGVkIGl0CisgICAgICAgICAgICAvLyB3aXRoIG5hdGl2ZURlY2wgPT0gdHJ1ZQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzUG9pbnRlckZ1bmMpIHsKKyAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArCisgICAgICAgICAgICAgICAgICAgICAgICAobmF0aXZlRGVjbCA/ICJwcml2YXRlIG5hdGl2ZSAiIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAoaW50ZXJmYWNlRGVjbCA/ICIiIDogInB1YmxpYyAiKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgamZ1bmMuZ2V0VHlwZSgpICsgIiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGpmdW5jLmdldE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAobmF0aXZlRGVjbCA/ICJCb3VuZHMiIDogIiIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIoIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKworICAgICAgICAgICAgICAgICAgICAgICAgKG5hdGl2ZURlY2wgPyAicHVibGljIG5hdGl2ZSAiIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAoaW50ZXJmYWNlRGVjbCA/ICIiIDogInB1YmxpYyAiKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgamZ1bmMuZ2V0VHlwZSgpICsgIiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGpmdW5jLmdldE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiKCIpOworICAgICAgICB9CisJCisgICAgICAgIGludCBudW1BcmdzID0gamZ1bmMuZ2V0TnVtQXJncygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUFyZ3M7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIGFyZ05hbWUgPSBqZnVuYy5nZXRBcmdOYW1lKGkpOworICAgICAgICAgICAgSlR5cGUgYXJnVHlwZSA9IGpmdW5jLmdldEFyZ1R5cGUoaSk7CisJICAgIAorICAgICAgICAgICAgb3V0LnByaW50KGluZGVudCArIGluZGVudCArIGFyZ1R5cGUgKyAiICIgKyBhcmdOYW1lKTsKKyAgICAgICAgICAgIGlmIChpID09IG51bUFyZ3MgLSAxKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzUG9pbnRlckZ1bmMgJiYgbmF0aXZlRGVjbCkgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiLCIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyBpbmRlbnQgKyAiaW50IHJlbWFpbmluZyIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiLCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG5hdGl2ZURlY2wgfHwgaW50ZXJmYWNlRGVjbCkgeworICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIik7Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiKSB7Iik7CisKKyAgICAgICAgICAgIFN0cmluZyBpaWkgPSBpbmRlbnQgKyBpbmRlbnQ7CisKKyAgICAgICAgICAgIFN0cmluZyBmbmFtZSA9IGpmdW5jLmdldE5hbWUoKTsKKyAgICAgICAgICAgIGlmIChpc1BvaW50ZXJGdW5jKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETyAtIGRlYWwgd2l0aCBWQk8gdmFyaWFudHMKKyAgICAgICAgICAgICAgICBpZiAoZm5hbWUuZXF1YWxzKCJnbENvbG9yUG9pbnRlciIpKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICJpZiAoKHNpemUgPT0gNCkgJiYiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAoKHR5cGUgPT0gR0xfRkxPQVQpIHx8Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgICh0eXBlID09IEdMX1VOU0lHTkVEX0JZVEUpIHx8Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgICh0eXBlID09IEdMX0ZJWEVEKSkgJiYiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAoc3RyaWRlID49IDApKSB7Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArIGluZGVudCArICJfY29sb3JQb2ludGVyID0gcG9pbnRlcjsiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIn0iKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZuYW1lLmVxdWFscygiZ2xOb3JtYWxQb2ludGVyIikpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgImlmICgoKHR5cGUgPT0gR0xfRkxPQVQpIHx8Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgICh0eXBlID09IEdMX0JZVEUpIHx8Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgICh0eXBlID09IEdMX1NIT1JUKSB8fCIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAodHlwZSA9PSBHTF9GSVhFRCkpICYmIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgKHN0cmlkZSA+PSAwKSkgeyIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyBpbmRlbnQgKyAiX25vcm1hbFBvaW50ZXIgPSBwb2ludGVyOyIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAifSIpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZm5hbWUuZXF1YWxzKCJnbFRleENvb3JkUG9pbnRlciIpKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICJpZiAoKChzaXplID09IDIpIHx8Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgIChzaXplID09IDMpIHx8Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgIChzaXplID09IDQpKSAmJiIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICgodHlwZSA9PSBHTF9GTE9BVCkgfHwiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgKHR5cGUgPT0gR0xfQllURSkgfHwiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgKHR5cGUgPT0gR0xfU0hPUlQpIHx8Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgICh0eXBlID09IEdMX0ZJWEVEKSkgJiYiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAoc3RyaWRlID49IDApKSB7Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArIGluZGVudCArICJfdGV4Q29vcmRQb2ludGVyID0gcG9pbnRlcjsiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIn0iKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZuYW1lLmVxdWFscygiZ2xWZXJ0ZXhQb2ludGVyIikpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgImlmICgoKHNpemUgPT0gMikgfHwiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgKHNpemUgPT0gMykgfHwiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgKHNpemUgPT0gNCkpICYmIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgKCh0eXBlID09IEdMX0ZMT0FUKSB8fCIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAodHlwZSA9PSBHTF9CWVRFKSB8fCIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAodHlwZSA9PSBHTF9TSE9SVCkgfHwiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgKHR5cGUgPT0gR0xfRklYRUQpKSAmJiIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgIChzdHJpZGUgPj0gMCkpIHsiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgaW5kZW50ICsgIl92ZXJ0ZXhQb2ludGVyID0gcG9pbnRlcjsiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIn0iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGVtaXRCb3VuZHNDaGVja3MoamZ1bmMsIG91dCwgaWlpKTsKKyAgICAgICAgICAgIGVtaXRGdW5jdGlvbkNhbGwoamZ1bmMsIG91dCwgaWlpLCBmYWxzZSk7CisKKyAgICAgICAgICAgIGJvb2xlYW4gaXNWb2lkID0gamZ1bmMuZ2V0VHlwZSgpLmlzVm9pZCgpOworCisgICAgICAgICAgICBpZiAoIWlzVm9pZCkgeworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArIGluZGVudCArICJyZXR1cm4gX3JldHVyblZhbHVlOyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIn0iKTsKKyAgICAgICAgfQorICAgICAgICBvdXQucHJpbnRsbigpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEpuaU5hbWUoSlR5cGUgalR5cGUpIHsKKyAgICAgICAgU3RyaW5nIGpuaU5hbWUgPSAiIjsKKyAgICAgICAgaWYgKGpUeXBlLmlzQ2xhc3MoKSkgeworICAgICAgICAgICAgcmV0dXJuICJMIiArIGpUeXBlLmdldEJhc2VUeXBlKCkgKyAiOyI7CisgICAgICAgIH0gZWxzZSBpZiAoalR5cGUuaXNBcnJheSgpKSB7CisgICAgICAgICAgICBqbmlOYW1lID0gIlsiOworICAgICAgICB9CisJCisgICAgICAgIFN0cmluZyBiYXNlVHlwZSA9IGpUeXBlLmdldEJhc2VUeXBlKCk7CisgICAgICAgIGlmIChiYXNlVHlwZS5lcXVhbHMoImludCIpKSB7CisgICAgICAgICAgICBqbmlOYW1lICs9ICJJIjsKKyAgICAgICAgfSBlbHNlIGlmIChiYXNlVHlwZS5lcXVhbHMoImZsb2F0IikpIHsKKyAgICAgICAgICAgIGpuaU5hbWUgKz0gIkYiOworICAgICAgICB9IGVsc2UgaWYgKGJhc2VUeXBlLmVxdWFscygiYm9vbGVhbiIpKSB7CisgICAgICAgICAgICBqbmlOYW1lICs9ICJaIjsKKyAgICAgICAgfSBlbHNlIGlmIChiYXNlVHlwZS5lcXVhbHMoInNob3J0IikpIHsKKyAgICAgICAgICAgIGpuaU5hbWUgKz0gIlMiOworICAgICAgICB9IGVsc2UgaWYgKGJhc2VUeXBlLmVxdWFscygibG9uZyIpKSB7CisgICAgICAgICAgICBqbmlOYW1lICs9ICJMIjsKKyAgICAgICAgfSBlbHNlIGlmIChiYXNlVHlwZS5lcXVhbHMoImJ5dGUiKSkgeworICAgICAgICAgICAgam5pTmFtZSArPSAiQiI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGpuaU5hbWU7CisgICAgfQorCisgICAgU3RyaW5nIGdldEpuaVR5cGUoSlR5cGUgalR5cGUpIHsKKyAgICAgICAgaWYgKGpUeXBlLmlzVm9pZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gInZvaWQiOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGJhc2VUeXBlID0galR5cGUuZ2V0QmFzZVR5cGUoKTsKKyAgICAgICAgaWYgKGpUeXBlLmlzUHJpbWl0aXZlKCkpIHsKKyAgICAgICAgICAgIGlmIChiYXNlVHlwZS5lcXVhbHMoIlN0cmluZyIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJqc3RyaW5nIjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJqIiArIGJhc2VUeXBlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGpUeXBlLmlzQXJyYXkoKSkgeworICAgICAgICAgICAgcmV0dXJuICJqIiArIGJhc2VUeXBlICsgIkFycmF5IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAiam9iamVjdCI7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgU3RyaW5nIGdldEpuaU1hbmdsZWROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2VBbGwoIl8iLCAiXzEiKTsKKyAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZUFsbCgiOyIsICJfMiIpOworICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlQWxsKCJcXFsiLCAiXzMiKTsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZW1pdEpuaUNvZGUoSkZ1bmMgamZ1bmMsIFByaW50U3RyZWFtIG91dCkgeworICAgICAgICBDRnVuYyBjZnVuYyA9IGpmdW5jLmdldENGdW5jKCk7CisJCisgICAgICAgIC8vIEVtaXQgY29tbWVudCBpZGVudGlmeWluZyBvcmlnaW5hbCBDIGZ1bmN0aW9uCisgICAgICAgIC8vCisgICAgICAgIC8vIEV4YW1wbGU6CisgICAgICAgIC8vCisgICAgICAgIC8vIC8qIHZvaWQgZ2xDbGlwUGxhbmVmICggR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZsb2F0ICplcXVhdGlvbiApICovCisgICAgICAgIC8vCisgICAgICAgIG91dC5wcmludGxuKCIvKiAiICsgY2Z1bmMuZ2V0T3JpZ2luYWwoKSArICIgKi8iKTsKKworICAgICAgICAvLyBFbWl0IEpOSSBzaWduYXR1cmUgKG5hbWUpCisgICAgICAgIC8vCisgICAgICAgIC8vIEV4YW1wbGU6CisgICAgICAgIC8vCisgICAgICAgIC8vIHZvaWQKKyAgICAgICAgLy8gYW5kcm9pZF9nbENsaXBQbGFuZWZfX0lfM0ZJCisgICAgICAgIC8vCisKKyAgICAgICAgU3RyaW5nIG91dE5hbWUgPSAiYW5kcm9pZF8iICsgamZ1bmMuZ2V0TmFtZSgpOworICAgICAgICBib29sZWFuIGlzUG9pbnRlckZ1bmMgPSBvdXROYW1lLmVuZHNXaXRoKCJQb2ludGVyIikgJiYKKyAgICAgICAgICAgIGpmdW5jLmdldENGdW5jKCkuaGFzUG9pbnRlckFyZygpOworICAgICAgICBib29sZWFuIGlzVkJPUG9pbnRlckZ1bmMgPSAob3V0TmFtZS5lbmRzV2l0aCgiUG9pbnRlciIpIHx8CisgICAgICAgICAgICBvdXROYW1lLmVuZHNXaXRoKCJEcmF3RWxlbWVudHMiKSkgJiYKKyAgICAgICAgICAgICFqZnVuYy5nZXRDRnVuYygpLmhhc1BvaW50ZXJBcmcoKTsKKyAgICAgICAgaWYgKGlzUG9pbnRlckZ1bmMpIHsKKyAgICAgICAgICAgIG91dE5hbWUgKz0gIkJvdW5kcyI7CisgICAgICAgIH0KKworICAgICAgICBvdXQucHJpbnQoInN0YXRpYyAiKTsKKyAgICAgICAgb3V0LnByaW50bG4oZ2V0Sm5pVHlwZShqZnVuYy5nZXRUeXBlKCkpKTsKKyAgICAgICAgb3V0LnByaW50KG91dE5hbWUpOworCisgICAgICAgIFN0cmluZyByc2lnbmF0dXJlID0gZ2V0Sm5pTmFtZShqZnVuYy5nZXRUeXBlKCkpOworCisgICAgICAgIFN0cmluZyBzaWduYXR1cmUgPSAiIjsKKyAgICAgICAgaW50IG51bUFyZ3MgPSBqZnVuYy5nZXROdW1BcmdzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQXJnczsgaSsrKSB7CisgICAgICAgICAgICBKVHlwZSBhcmdUeXBlID0gamZ1bmMuZ2V0QXJnVHlwZShpKTsKKyAgICAgICAgICAgIHNpZ25hdHVyZSArPSBnZXRKbmlOYW1lKGFyZ1R5cGUpOworICAgICAgICB9CisgICAgICAgIGlmIChpc1BvaW50ZXJGdW5jKSB7CisgICAgICAgICAgICBzaWduYXR1cmUgKz0gIkkiOworICAgICAgICB9CisKKyAgICAgICAgLy8gQXBwZW5kIHNpZ25hdHVyZSB0byBmdW5jdGlvbiBuYW1lCisgICAgICAgIFN0cmluZyBzaWcgPSBnZXRKbmlNYW5nbGVkTmFtZShzaWduYXR1cmUpLnJlcGxhY2UoJy4nLCAnXycpOyAgICAgICAgCisgICAgICAgIG91dC5wcmludCgiX18iICsgc2lnKTsKKyAgICAgICAgb3V0TmFtZSArPSAiX18iICsgc2lnOworCQorICAgICAgICBzaWduYXR1cmUgPSBzaWduYXR1cmUucmVwbGFjZSgnLicsICcvJyk7CisgICAgICAgIHJzaWduYXR1cmUgPSByc2lnbmF0dXJlLnJlcGxhY2UoJy4nLCAnLycpOworCQorICAgICAgICBvdXQucHJpbnRsbigpOworICAgICAgICBpZiAocnNpZ25hdHVyZS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICByc2lnbmF0dXJlID0gIlYiOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHMgPSAie1wiIiArCisgICAgICAgICAgICBqZnVuYy5nZXROYW1lKCkgKworICAgICAgICAgICAgKGlzUG9pbnRlckZ1bmMgPyAiQm91bmRzIiA6ICIiKSArCisgICAgICAgICAgICAiXCIsIFwiKCIgKyBzaWduYXR1cmUgKyIpIiArCisgICAgICAgICAgICByc2lnbmF0dXJlICsKKyAgICAgICAgICAgICJcIiwgKHZvaWQgKikgIiArCisgICAgICAgICAgICBvdXROYW1lICsKKyAgICAgICAgICAgICIgfSwiOworICAgICAgICBuYXRpdmVSZWdpc3RyYXRpb25zLmFkZChzKTsKKworICAgICAgICBMaXN0PEludGVnZXI+IG5vblByaW1pdGl2ZUFyZ3MgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7CisgICAgICAgIGludCBudW1CdWZmZXJBcmdzID0gMDsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGJ1ZmZlckFyZ05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisKKyAgICAgICAgLy8gRW1pdCBKTkkgc2lnbmF0dXJlIChhcmd1bWVudHMpCisgICAgICAgIC8vCisgICAgICAgIC8vIEV4YW1wbGU6CisgICAgICAgIC8vCisgICAgICAgIC8vIChKTklFbnYgKl9lbnYsIGpvYmplY3QgdGhpcywgamludCBwbGFuZSwgamZsb2F0QXJyYXkgZXF1YXRpb25fcmVmLCBqaW50IG9mZnNldCkgeworICAgICAgICAvLworICAgICAgICBvdXQucHJpbnQoIiAgKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcyIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUFyZ3M7IGkrKykgeworICAgICAgICAgICAgb3V0LnByaW50KCIsICIpOworICAgICAgICAgICAgSlR5cGUgYXJnVHlwZSA9IGpmdW5jLmdldEFyZ1R5cGUoaSk7CisgICAgICAgICAgICBTdHJpbmcgc3VmZml4OworICAgICAgICAgICAgaWYgKCFhcmdUeXBlLmlzUHJpbWl0aXZlKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoYXJnVHlwZS5pc0FycmF5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gIl9yZWYiOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9ICJfYnVmIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbm9uUHJpbWl0aXZlQXJncy5hZGQobmV3IEludGVnZXIoaSkpOworICAgICAgICAgICAgICAgIGlmIChqZnVuYy5nZXRBcmdUeXBlKGkpLmlzQnVmZmVyKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNJbmRleCA9IGpmdW5jLmdldEFyZ0NJbmRleChpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNuYW1lID0gY2Z1bmMuZ2V0QXJnTmFtZShjSW5kZXgpOworICAgICAgICAgICAgICAgICAgICBidWZmZXJBcmdOYW1lcy5hZGQoY25hbWUpOworICAgICAgICAgICAgICAgICAgICBudW1CdWZmZXJBcmdzKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdWZmaXggPSAiIjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3V0LnByaW50KGdldEpuaVR5cGUoYXJnVHlwZSkgKyAiICIgKyBqZnVuYy5nZXRBcmdOYW1lKGkpICsgc3VmZml4KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNQb2ludGVyRnVuYykgeworICAgICAgICAgICAgb3V0LnByaW50KCIsIGppbnQgcmVtYWluaW5nIik7CisgICAgICAgIH0KKyAgICAgICAgb3V0LnByaW50bG4oIikgeyIpOworCQorICAgICAgICBpbnQgbnVtQXJyYXlzID0gMDsKKyAgICAgICAgaW50IG51bUJ1ZmZlcnMgPSAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vblByaW1pdGl2ZUFyZ3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGludCBpZHggPSBub25QcmltaXRpdmVBcmdzLmdldChpKS5pbnRWYWx1ZSgpOworICAgICAgICAgICAgaW50IGNJbmRleCA9IGpmdW5jLmdldEFyZ0NJbmRleChpZHgpOworICAgICAgICAgICAgU3RyaW5nIGNuYW1lID0gY2Z1bmMuZ2V0QXJnTmFtZShjSW5kZXgpOworICAgICAgICAgICAgaWYgKGpmdW5jLmdldEFyZ1R5cGUoaWR4KS5pc0FycmF5KCkpIHsKKyAgICAgICAgICAgICAgICArK251bUFycmF5czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChqZnVuYy5nZXRBcmdUeXBlKGlkeCkuaXNCdWZmZXIoKSkgeworICAgICAgICAgICAgICAgICsrbnVtQnVmZmVyczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEVtaXQgbWV0aG9kIGJvZHkKKworICAgICAgICAvLyBFbWl0IGxvY2FsIHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBmb3IgX2V4Y2VwdGlvbiBhbmQgX3JldHVyblZhbHVlCisgICAgICAgIC8vCisgICAgICAgIC8vIEV4YW1wbGU6CisgICAgICAgIC8vCisgICAgICAgIC8vIGFuZHJvaWQ6OmdsOjpvZ2xlc19jb250ZXh0X3QgKmN0eDsKKyAgICAgICAgLy8gCisgICAgICAgIC8vIGppbnQgX2V4Y2VwdGlvbjsKKyAgICAgICAgLy8gR0xlbnVtIF9yZXR1cm5WYWx1ZTsKKyAgICAgICAgLy8KKyAgICAgICAgQ1R5cGUgcmV0dXJuVHlwZSA9IGNmdW5jLmdldFR5cGUoKTsKKyAgICAgICAgYm9vbGVhbiBpc1ZvaWQgPSByZXR1cm5UeXBlLmlzVm9pZCgpOworCisgICAgICAgIGJvb2xlYW4gaXNVbnN1cHBvcnRlZCA9IGlzVW5zdXBwb3J0ZWRGdW5jKGNmdW5jKTsKKyAgICAgICAgaWYgKGlzVW5zdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArCisgICAgICAgICAgICAgICAgICAgICAgICAiX2Vudi0+VGhyb3dOZXcoVU9FQ2xhc3MsIik7CisgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKworICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBcIiIgKyBjZnVuYy5nZXROYW1lKCkgKyAiXCIpOyIpOworICAgICAgICAgICAgaWYgKCFpc1ZvaWQpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcmV0dmFsID0gZ2V0RXJyb3JSZXR1cm5WYWx1ZShjZnVuYyk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgInJldHVybiAiICsgcmV0dmFsICsgIjsiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dC5wcmludGxuKCJ9Iik7CisgICAgICAgICAgICBvdXQucHJpbnRsbigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1Vc2VDb250ZXh0UG9pbnRlcikgeworICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsKKyAgICAgICAgICAgICAgICAiYW5kcm9pZDo6Z2w6Om9nbGVzX2NvbnRleHRfdCAqY3R4ID0gZ2V0Q29udGV4dChfZW52LCBfdGhpcyk7Iik7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGVtaXRFeGNlcHRpb25DaGVjayA9IChudW1BcnJheXMgPiAwIHx8IG51bUJ1ZmZlcnMgPiAwKSAmJgorICAgICAgICAgICAgaGFzTm9uQ29uc3RBcmcoamZ1bmMsIGNmdW5jLCBub25QcmltaXRpdmVBcmdzKTsKKyAgICAgICAgLy8gbUNoZWNrZXIuZ2V0Q2hlY2tzKGNmdW5jLmdldE5hbWUoKSkgIT0gbnVsbAorCisgICAgICAgIC8vIEVtaXQgYW4gX2V4ZXB0aW9uIHZhcmlhYmxlIGlmIHRoZXJlIHdpbGwgYmUgZXJyb3IgY2hlY2tzCisgICAgICAgIGlmIChlbWl0RXhjZXB0aW9uQ2hlY2spIHsKKyAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICJqaW50IF9leGNlcHRpb24gPSAwOyIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRW1pdCBhIHNpbmdsZSBfYXJyYXkgb3IgbXVsdGlwbGUgX1hYWEFycmF5IHZhcmlhYmxlcworICAgICAgICBpZiAobnVtQnVmZmVyQXJncyA9PSAxKSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgImphcnJheSBfYXJyYXkgPSAoamFycmF5KSAwOyIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1CdWZmZXJBcmdzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiamFycmF5IF8iICsgYnVmZmVyQXJnTmFtZXMuZ2V0KGkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXJyYXkgPSAoamFycmF5KSAwOyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghaXNWb2lkKSB7CisgICAgICAgICAgICBTdHJpbmcgcmV0dmFsID0gZ2V0RXJyb3JSZXR1cm5WYWx1ZShjZnVuYyk7CisgICAgICAgICAgICBpZiAocmV0dmFsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyByZXR1cm5UeXBlLmdldERlY2xhcmF0aW9uKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgX3JldHVyblZhbHVlID0gIiArIHJldHZhbCArICI7Iik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArIHJldHVyblR5cGUuZ2V0RGVjbGFyYXRpb24oKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBfcmV0dXJuVmFsdWU7Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBFbWl0IGxvY2FsIHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBmb3IgcG9pbnRlciBhcmd1bWVudHMKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRXhhbXBsZToKKyAgICAgICAgLy8KKyAgICAgICAgLy8gR0xmaXhlZCAqZXFuX2Jhc2U7CisgICAgICAgIC8vIEdMZml4ZWQgKmVxbjsKKyAgICAgICAgLy8KKyAgICAgICAgU3RyaW5nIG9mZnNldCA9ICJvZmZzZXQiOworICAgICAgICBTdHJpbmcgcmVtYWluaW5nID0gIl9yZW1haW5pbmciOworICAgICAgICBpZiAobm9uUHJpbWl0aXZlQXJncy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vblByaW1pdGl2ZUFyZ3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgaWR4ID0gbm9uUHJpbWl0aXZlQXJncy5nZXQoaSkuaW50VmFsdWUoKTsKKyAgICAgICAgICAgICAgICBpbnQgY0luZGV4ID0gamZ1bmMuZ2V0QXJnQ0luZGV4KGlkeCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGNuYW1lID0gY2Z1bmMuZ2V0QXJnTmFtZShjSW5kZXgpOworCisgICAgICAgICAgICAgICAgQ1R5cGUgdHlwZSA9IGNmdW5jLmdldEFyZ1R5cGUoamZ1bmMuZ2V0QXJnQ0luZGV4KGlkeCkpOworICAgICAgICAgICAgICAgIFN0cmluZyBkZWNsID0gdHlwZS5nZXREZWNsYXJhdGlvbigpOworICAgICAgICAgICAgICAgIGlmIChqZnVuYy5nZXRBcmdUeXBlKGlkeCkuaXNBcnJheSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2wgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVjbC5lbmRzV2l0aCgiKiIpID8gIiIgOiAiICIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamZ1bmMuZ2V0QXJnTmFtZShpZHgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9iYXNlID0gKCIgKyBkZWNsICsgIikgMDsiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVtYWluaW5nID0gKG51bUFycmF5cyA8PSAxICYmIG51bUJ1ZmZlcnMgPD0gMSkgPyAiX3JlbWFpbmluZyIgOgorICAgICAgICAgICAgICAgICAgICAiXyIgKyBjbmFtZSArICJSZW1haW5pbmciOworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImppbnQgIiArIHJlbWFpbmluZyArICI7Iik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVjbC5lbmRzV2l0aCgiKiIpID8gIiIgOiAiICIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZnVuYy5nZXRBcmdOYW1lKGlkeCkgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiID0gKCIgKyBkZWNsICsgIikgMDsiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3V0LnByaW50bG4oKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyByZXR2YWwgPSBpc1ZvaWQgPyAiIiA6ICIgX3JldHVyblZhbHVlIjsKKworICAgICAgICAvLyBFbWl0ICdHZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsJyBmb3IgYXJyYXlzCisgICAgICAgIC8vIEVtaXQgJ0dldFBvaW50ZXInIGNhbGxzIGZvciBCdWZmZXIgcG9pbnRlcnMKKyAgICAgICAgaW50IGJ1ZkFyZ0lkeCA9IDA7CisgICAgICAgIGlmIChub25QcmltaXRpdmVBcmdzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9uUHJpbWl0aXZlQXJncy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGludCBpZHggPSBub25QcmltaXRpdmVBcmdzLmdldChpKS5pbnRWYWx1ZSgpOworICAgICAgICAgICAgICAgIGludCBjSW5kZXggPSBqZnVuYy5nZXRBcmdDSW5kZXgoaWR4KTsKKwkJCisgICAgICAgICAgICAgICAgU3RyaW5nIGNuYW1lID0gY2Z1bmMuZ2V0QXJnTmFtZShjSW5kZXgpOworICAgICAgICAgICAgICAgIG9mZnNldCA9IG51bUFycmF5cyA8PSAxID8gIm9mZnNldCIgOgorICAgICAgICAgICAgICAgICAgICBjbmFtZSArICJPZmZzZXQiOworICAgICAgICAgICAgICAgIHJlbWFpbmluZyA9IChudW1BcnJheXMgPD0gMSAmJiBudW1CdWZmZXJzIDw9IDEpID8gIl9yZW1haW5pbmciIDoKKyAgICAgICAgICAgICAgICAgICAgIl8iICsgY25hbWUgKyAiUmVtYWluaW5nIjsKKworICAgICAgICAgICAgICAgIGlmIChqZnVuYy5nZXRBcmdUeXBlKGlkeCkuaXNBcnJheSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZiAoISIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY25hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX3JlZikgeyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoZW1pdEV4Y2VwdGlvbkNoZWNrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyBpbmRlbnQgKyAiX2V4Y2VwdGlvbiA9IDE7Iik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIiAgICAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1Vc2VDUGx1c1BsdXMgPyAiX2VudiIgOiAiKCpfZW52KSIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0+VGhyb3dOZXcoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtVXNlQ1BsdXNQbHVzID8gIiIgOiAiX2VudiwgIikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSUFFQ2xhc3MsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiICsgY25hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiID09IG51bGxcIik7Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICIgICAgZ290byBleGl0OyIpOworICAgICAgICAgICAgICAgICAgICBuZWVkc0V4aXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAifSIpOworCisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICJpZiAoIiArIG9mZnNldCArICIgPCAwKSB7Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbWl0RXhjZXB0aW9uQ2hlY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArIGluZGVudCArICJfZXhjZXB0aW9uID0gMTsiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiICAgICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVVzZUNQbHVzUGx1cyA/ICJfZW52IiA6ICIoKl9lbnYpIikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLT5UaHJvd05ldygiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1Vc2VDUGx1c1BsdXMgPyAiIiA6ICJfZW52LCAiKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJQUVDbGFzcywgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIgKyBvZmZzZXQgKyAiIDwgMFwiKTsiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIiAgICBnb3RvIGV4aXQ7Iik7CisgICAgICAgICAgICAgICAgICAgIG5lZWRzRXhpdCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICJ9Iik7CisKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgcmVtYWluaW5nICsgIiA9ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1Vc2VDUGx1c1BsdXMgPyAiX2VudiIgOiAiKCpfZW52KSIpICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLT5HZXRBcnJheUxlbmd0aCgiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtVXNlQ1BsdXNQbHVzID8gIiIgOiAiX2VudiwgIikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY25hbWUgKyAiX3JlZikgLSAiICsgb2Zmc2V0ICsgIjsiKTsKKworICAgICAgICAgICAgICAgICAgICBlbWl0TmF0aXZlQm91bmRzQ2hlY2tzKGNmdW5jLCBjbmFtZSwgb3V0LCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0RXhjZXB0aW9uQ2hlY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LCByZW1haW5pbmcsICIgICAgIik7CisKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY25hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX2Jhc2UgPSAoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmdW5jLmdldEFyZ1R5cGUoY0luZGV4KS5nZXREZWNsYXJhdGlvbigpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIiAgICAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1Vc2VDUGx1c1BsdXMgPyAiX2VudiIgOiAiKCpfZW52KSIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbCgiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1Vc2VDUGx1c1BsdXMgPyAiIiA6ICJfZW52LCAiKSArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZnVuYy5nZXRBcmdOYW1lKGlkeCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX3JlZiwgKGpib29sZWFuICopMCk7Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNuYW1lICsgIiA9ICIgKyBjbmFtZSArICJfYmFzZSArICIgKyBvZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOyIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhcnJheSA9IG51bUJ1ZmZlckFyZ3MgPD0gMSA/ICJfYXJyYXkiIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICJfIiArIGJ1ZmZlckFyZ05hbWVzLmdldChidWZBcmdJZHgrKykgKyAiQXJyYXkiOworCisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbnVsbEFsbG93ZWQgPSBpc051bGxBbGxvd2VkKGNmdW5jKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG51bGxBbGxvd2VkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiaWYgKCIgKyBjbmFtZSArICJfYnVmKSB7Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoaW5kZW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY25hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiID0gKCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZnVuYy5nZXRBcmdUeXBlKGNJbmRleCkuZ2V0RGVjbGFyYXRpb24oKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpZ2V0UG9pbnRlcihfZW52LCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY25hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX2J1ZiwgJiIgKyBhcnJheSArICIsICYiICsgcmVtYWluaW5nICsgIik7Iik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG51bGxBbGxvd2VkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAifSIpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZW1pdE5hdGl2ZUJvdW5kc0NoZWNrcyhjZnVuYywgY25hbWUsIG91dCwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0RXhjZXB0aW9uQ2hlY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LCByZW1haW5pbmcsICIgICAgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFpc1ZvaWQpIHsKKyAgICAgICAgICAgIG91dC5wcmludChpbmRlbnQgKyAiX3JldHVyblZhbHVlID0gIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXQucHJpbnQoaW5kZW50KTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgbmFtZSA9IGNmdW5jLmdldE5hbWUoKTsKKworICAgICAgICBpZiAobVVzZUNvbnRleHRQb2ludGVyKSB7CisgICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMiwgbmFtZS5sZW5ndGgoKSk7IC8vIFN0cmlwIG9mZiAnZ2wnIHByZWZpeAorICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIDEpLnRvTG93ZXJDYXNlKCkgKworICAgICAgICAgICAgICAgIG5hbWUuc3Vic3RyaW5nKDEsIG5hbWUubGVuZ3RoKCkpOworICAgICAgICAgICAgb3V0LnByaW50KCJjdHgtPnByb2NzLiIpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBvdXQucHJpbnQobmFtZSArIChpc1BvaW50ZXJGdW5jID8gIkJvdW5kcyIgOiAiIikgKyAiKCIpOworCisgICAgICAgIG51bUFyZ3MgPSBjZnVuYy5nZXROdW1BcmdzKCk7ICAgIAorICAgICAgICBpZiAobnVtQXJncyA9PSAwKSB7CisgICAgICAgICAgICBpZiAobVVzZUNvbnRleHRQb2ludGVyKSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oImN0eCk7Iik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIpOyIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG1Vc2VDb250ZXh0UG9pbnRlcikgeworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJjdHgsIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUFyZ3M7IGkrKykgeworICAgICAgICAgICAgICAgIFN0cmluZyB0eXBlY2FzdDsKKyAgICAgICAgICAgICAgICBpZiAoaSA9PSBudW1BcmdzIC0gMSAmJiBpc1ZCT1BvaW50ZXJGdW5jKSB7CisgICAgICAgICAgICAgICAgICAgIHR5cGVjYXN0ID0gImNvbnN0IEdMdm9pZCAqIjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0eXBlY2FzdCA9IGNmdW5jLmdldEFyZ1R5cGUoaSkuZ2V0RGVjbGFyYXRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0LnByaW50KGluZGVudCArIGluZGVudCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICIoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVjYXN0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIikiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2Z1bmMuZ2V0QXJnTmFtZShpKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoaSA9PSBudW1BcmdzIC0gMSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaXNQb2ludGVyRnVuYykgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIiwiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArIGluZGVudCArICIoR0xzaXplaSlyZW1haW5pbmciKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiLCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICIpOyIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5lZWRzRXhpdCkgeworICAgICAgICAgICAgb3V0LnByaW50bG4oKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCJleGl0OiIpOworICAgICAgICAgICAgbmVlZHNFeGl0ID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBidWZBcmdJZHggPSAwOworICAgICAgICBpZiAobm9uUHJpbWl0aXZlQXJncy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gbm9uUHJpbWl0aXZlQXJncy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgICAgIGludCBpZHggPSBub25QcmltaXRpdmVBcmdzLmdldChpKS5pbnRWYWx1ZSgpOworCisgICAgICAgICAgICAgICAgaW50IGNJbmRleCA9IGpmdW5jLmdldEFyZ0NJbmRleChpZHgpOworICAgICAgICAgICAgICAgIGlmIChqZnVuYy5nZXRBcmdUeXBlKGlkeCkuaXNBcnJheSgpKSB7CisJCSAgICAKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGFyZ3VtZW50IGlzICdjb25zdCcsIEdMIHdpbGwgbm90IHdyaXRlIHRvIGl0LgorICAgICAgICAgICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHdlIGNhbiB1c2UgdGhlICdKTklfQUJPUlQnIGZsYWcgdG8gYXZvaWQKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG5lZWQgdG8gd3JpdGUgYmFjayB0byB0aGUgSmF2YSBhcnJheQorICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWYgKCIgKyBqZnVuYy5nZXRBcmdOYW1lKGlkeCkgKyAiX2Jhc2UpIHsiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgaW5kZW50ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1Vc2VDUGx1c1BsdXMgPyAiX2VudiIgOiAiKCpfZW52KSIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtVXNlQ1BsdXNQbHVzID8gIiIgOiAiX2VudiwgIikgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamZ1bmMuZ2V0QXJnTmFtZShpZHgpICsgIl9yZWYsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZnVuYy5nZXRBcmdOYW1lKGNJbmRleCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX2Jhc2UsIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArIGluZGVudCArIGluZGVudCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjZnVuYy5nZXRBcmdUeXBlKGNJbmRleCkuaXNDb25zdCgpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKTklfQUJPUlQiIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfZXhjZXB0aW9uID8gSk5JX0FCT1JUOiAwIikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIn0iKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGpmdW5jLmdldEFyZ1R5cGUoaWR4KS5pc0J1ZmZlcigpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhcnJheSA9IG51bUJ1ZmZlckFyZ3MgPD0gMSA/ICJfYXJyYXkiIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICJfIiArIGJ1ZmZlckFyZ05hbWVzLmdldChidWZBcmdJZHgrKykgKyAiQXJyYXkiOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiaWYgKCIgKyBhcnJheSArICIpIHsiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgaW5kZW50ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbGVhc2VQb2ludGVyKF9lbnYsICIgKyBhcnJheSArICIsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZnVuYy5nZXRBcmdOYW1lKGNJbmRleCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNmdW5jLmdldEFyZ1R5cGUoY0luZGV4KS5pc0NvbnN0KCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkpOSV9GQUxTRSIgOiAiX2V4Y2VwdGlvbiA/IEpOSV9GQUxTRSA6IEpOSV9UUlVFIikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIn0iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWlzVm9pZCkgeworICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgInJldHVybiBfcmV0dXJuVmFsdWU7Iik7CisgICAgICAgIH0KKworICAgICAgICBvdXQucHJpbnRsbigifSIpOworICAgICAgICBvdXQucHJpbnRsbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZE5hdGl2ZVJlZ2lzdHJhdGlvbihTdHJpbmcgcykgeworICAgICAgICBuYXRpdmVSZWdpc3RyYXRpb25zLmFkZChzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBlbWl0TmF0aXZlUmVnaXN0cmF0aW9uKCkgeworICAgICAgICBtQ1N0cmVhbS5wcmludGxuKCJzdGF0aWMgY29uc3QgY2hhciAqY2xhc3NQYXRoTmFtZSA9IFwiIiArCisgICAgICAgICAgICAgICAgICAgICAgICBtQ2xhc3NQYXRoTmFtZSArCisgICAgICAgICAgICAgICAgICAgICAgICAiXCI7Iik7CisgICAgICAgIG1DU3RyZWFtLnByaW50bG4oKTsKKworICAgICAgICBtQ1N0cmVhbS5wcmludGxuKCJzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIG1ldGhvZHNbXSA9IHsiKTsKKworICAgICAgICBtQ1N0cmVhbS5wcmludGxuKCJ7XCJfbmF0aXZlQ2xhc3NJbml0XCIsIFwiKClWXCIsICh2b2lkKiluYXRpdmVDbGFzc0luaXQgfSwiKTsKKworICAgICAgICBJdGVyYXRvcjxTdHJpbmc+IGkgPSBuYXRpdmVSZWdpc3RyYXRpb25zLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgeworICAgICAgICAgICAgbUNTdHJlYW0ucHJpbnRsbihpLm5leHQoKSk7CisgICAgICAgIH0KKworICAgICAgICBtQ1N0cmVhbS5wcmludGxuKCJ9OyIpOworICAgICAgICBtQ1N0cmVhbS5wcmludGxuKCk7CisgICAgCisKKyAgICAgICAgbUNTdHJlYW0ucHJpbnRsbigiaW50IHJlZ2lzdGVyX2NvbV9nb29nbGVfYW5kcm9pZF9nbGVzX2puaV9HTEltcGwoSk5JRW52ICpfZW52KSIpOworICAgICAgICBtQ1N0cmVhbS5wcmludGxuKCJ7Iik7CisgICAgICAgIG1DU3RyZWFtLnByaW50bG4oaW5kZW50ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbnQgZXJyOyIpOworCisgICAgICAgIG1DU3RyZWFtLnByaW50bG4oaW5kZW50ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJlcnIgPSBhbmRyb2lkOjpBbmRyb2lkUnVudGltZTo6cmVnaXN0ZXJOYXRpdmVNZXRob2RzKF9lbnYsIGNsYXNzUGF0aE5hbWUsIG1ldGhvZHMsIE5FTEVNKG1ldGhvZHMpKTsiKTsKKworICAgICAgICBtQ1N0cmVhbS5wcmludGxuKGluZGVudCArICJyZXR1cm4gZXJyOyIpOworICAgICAgICBtQ1N0cmVhbS5wcmludGxuKCJ9Iik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9QYXJhbWV0ZXJDaGVja2VyLmphdmEgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL1BhcmFtZXRlckNoZWNrZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjI2YWNkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9QYXJhbWV0ZXJDaGVja2VyLmphdmEKQEAgLTAsMCArMSwyOCBAQAorCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworcHVibGljIGNsYXNzIFBhcmFtZXRlckNoZWNrZXIgeworCisgICAgSGFzaE1hcDxTdHJpbmcsU3RyaW5nW10+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZyxTdHJpbmdbXT4oKTsKKworICAgIHB1YmxpYyBQYXJhbWV0ZXJDaGVja2VyKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBzOworICAgICAgICB3aGlsZSAoKHMgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nW10gdG9rZW5zID0gcy5zcGxpdCgiXFxzIik7CisgICAgICAgICAgICBtYXAucHV0KHRva2Vuc1swXSwgdG9rZW5zKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRDaGVja3MoU3RyaW5nIGZ1bmN0aW9uTmFtZSkgeworICAgICAgICBTdHJpbmdbXSBjaGVja3MgPSBtYXAuZ2V0KGZ1bmN0aW9uTmFtZSk7CisgICAgICAgIGlmIChjaGVja3MgPT0gbnVsbCAmJgorICAgICAgICAgICAgKGZ1bmN0aW9uTmFtZS5lbmRzV2l0aCgiZnYiKSB8fAorICAgICAgICAgICAgIGZ1bmN0aW9uTmFtZS5lbmRzV2l0aCgieHYiKSB8fAorICAgICAgICAgICAgIGZ1bmN0aW9uTmFtZS5lbmRzV2l0aCgiaXYiKSkpIHsKKyAgICAgICAgICAgIGZ1bmN0aW9uTmFtZSA9IGZ1bmN0aW9uTmFtZS5zdWJzdHJpbmcoMCwgZnVuY3Rpb25OYW1lLmxlbmd0aCgpIC0gMik7CisgICAgICAgICAgICBjaGVja3MgPSBtYXAuZ2V0KGZ1bmN0aW9uTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNoZWNrczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0wxMEV4dEhlYWRlci5qYXZhLWlmIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMMTBFeHRIZWFkZXIuamF2YS1pZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDk5OWMyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMMTBFeHRIZWFkZXIuamF2YS1pZgpAQCAtMCwwICsxLDIyIEBACisqKgorKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLy8gVGhpcyBzb3VyY2UgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAorCitwYWNrYWdlIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzOworCitwdWJsaWMgaW50ZXJmYWNlIEdMMTBFeHQgZXh0ZW5kcyBHTCB7CisKZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTDEwSGVhZGVyLmphdmEtaWYgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0wxMEhlYWRlci5qYXZhLWlmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzOTI4MjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0wxMEhlYWRlci5qYXZhLWlmCkBAIC0wLDAgKzEsMjU5IEBACisqKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLy8gVGhpcyBzb3VyY2UgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAorCitwYWNrYWdlIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzOworCitwdWJsaWMgaW50ZXJmYWNlIEdMMTAgZXh0ZW5kcyBHTCB7CisgICAgaW50IEdMX0FERCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAxMDQ7CisgICAgaW50IEdMX0FMSUFTRURfTElORV9XSURUSF9SQU5HRSAgICAgICAgICAgICAgPSAweDg0NkU7CisgICAgaW50IEdMX0FMSUFTRURfUE9JTlRfU0laRV9SQU5HRSAgICAgICAgICAgICAgPSAweDg0NkQ7CisgICAgaW50IEdMX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE5MDY7CisgICAgaW50IEdMX0FMUEhBX0JJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBENTU7CisgICAgaW50IEdMX0FMUEhBX1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCQzA7CisgICAgaW50IEdMX0FMV0FZUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAyMDc7CisgICAgaW50IEdMX0FNQklFTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDEyMDA7CisgICAgaW50IEdMX0FNQklFTlRfQU5EX0RJRkZVU0UgICAgICAgICAgICAgICAgICAgPSAweDE2MDI7CisgICAgaW50IEdMX0FORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MDE7CisgICAgaW50IEdMX0FORF9JTlZFUlRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MDQ7CisgICAgaW50IEdMX0FORF9SRVZFUlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MDI7CisgICAgaW50IEdMX0JBQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDA0MDU7CisgICAgaW50IEdMX0JMRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCRTI7CisgICAgaW50IEdMX0JMVUVfQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBENTQ7CisgICAgaW50IEdMX0JZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE0MDA7CisgICAgaW50IEdMX0NDVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDA5MDE7CisgICAgaW50IEdMX0NMQU1QX1RPX0VER0UgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgxMkY7CisgICAgaW50IEdMX0NMRUFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MDA7CisgICAgaW50IEdMX0NPTE9SX0FSUkFZICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwNzY7CisgICAgaW50IEdMX0NPTE9SX0JVRkZFUl9CSVQgICAgICAgICAgICAgICAgICAgICAgPSAweDQwMDA7CisgICAgaW50IEdMX0NPTE9SX0xPR0lDX09QICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCRjI7CisgICAgaW50IEdMX0NPTE9SX01BVEVSSUFMICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNTc7CisgICAgaW50IEdMX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTICAgICAgICAgICAgPSAweDg2QTM7CisgICAgaW50IEdMX0NPTlNUQU5UX0FUVEVOVUFUSU9OICAgICAgICAgICAgICAgICAgPSAweDEyMDc7CisgICAgaW50IEdMX0NPUFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MDM7CisgICAgaW50IEdMX0NPUFlfSU5WRVJURUQgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MEM7CisgICAgaW50IEdMX0NVTExfRkFDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNDQ7CisgICAgaW50IEdMX0NXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDA5MDA7CisgICAgaW50IEdMX0RFQ0FMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDIxMDE7CisgICAgaW50IEdMX0RFQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDFFMDM7CisgICAgaW50IEdMX0RFUFRIX0JJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBENTY7CisgICAgaW50IEdMX0RFUFRIX0JVRkZFUl9CSVQgICAgICAgICAgICAgICAgICAgICAgPSAweDAxMDA7CisgICAgaW50IEdMX0RFUFRIX1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNzE7CisgICAgaW50IEdMX0RJRkZVU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDEyMDE7CisgICAgaW50IEdMX0RJVEhFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCRDA7CisgICAgaW50IEdMX0RPTlRfQ0FSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDExMDA7CisgICAgaW50IEdMX0RTVF9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAzMDQ7CisgICAgaW50IEdMX0RTVF9DT0xPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAzMDY7CisgICAgaW50IEdMX0VNSVNTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE2MDA7CisgICAgaW50IEdMX0VRVUFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAyMDI7CisgICAgaW50IEdMX0VRVUlWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MDk7CisgICAgaW50IEdMX0VYUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDA4MDA7CisgICAgaW50IEdMX0VYUDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDA4MDE7CisgICAgaW50IEdMX0VYVEVOU0lPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDFGMDM7CisgICAgaW50IEdMX0ZBTFNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwOworICAgIGludCBHTF9GQVNURVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMTAxOworICAgIGludCBHTF9GSVhFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNDBDOworICAgIGludCBHTF9GTEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRDAwOworICAgIGludCBHTF9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNDA2OworICAgIGludCBHTF9GT0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjYwOworICAgIGludCBHTF9GT0dfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjY2OworICAgIGludCBHTF9GT0dfREVOU0lUWSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjYyOworICAgIGludCBHTF9GT0dfRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjY0OworICAgIGludCBHTF9GT0dfSElOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQzU0OworICAgIGludCBHTF9GT0dfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjY1OworICAgIGludCBHTF9GT0dfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjYzOworICAgIGludCBHTF9GUk9OVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNDA0OworICAgIGludCBHTF9GUk9OVF9BTkRfQkFDSyAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNDA4OworICAgIGludCBHTF9HRVFVQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMjA2OworICAgIGludCBHTF9HUkVBVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMjA0OworICAgIGludCBHTF9HUkVFTl9CSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDUzOworICAgIGludCBHTF9JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX0ZPUk1BVF9PRVMgID0gMHg4QjlCOworICAgIGludCBHTF9JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX1RZUEVfT0VTICAgID0gMHg4QjlBOworICAgIGludCBHTF9JTkNSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRTAyOworICAgIGludCBHTF9JTlZBTElEX0VOVU0gICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNTAwOworICAgIGludCBHTF9JTlZBTElEX09QRVJBVElPTiAgICAgICAgICAgICAgICAgICAgID0gMHgwNTAyOworICAgIGludCBHTF9JTlZBTElEX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNTAxOworICAgIGludCBHTF9JTlZFUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTBBOworICAgIGludCBHTF9LRUVQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRTAwOworICAgIGludCBHTF9MRVFVQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMjAzOworICAgIGludCBHTF9MRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMjAxOworICAgIGludCBHTF9MSUdIVF9NT0RFTF9BTUJJRU5UICAgICAgICAgICAgICAgICAgID0gMHgwQjUzOworICAgIGludCBHTF9MSUdIVF9NT0RFTF9UV09fU0lERSAgICAgICAgICAgICAgICAgID0gMHgwQjUyOworICAgIGludCBHTF9MSUdIVDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MDAwOworICAgIGludCBHTF9MSUdIVDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MDAxOworICAgIGludCBHTF9MSUdIVDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MDAyOworICAgIGludCBHTF9MSUdIVDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MDAzOworICAgIGludCBHTF9MSUdIVDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MDA0OworICAgIGludCBHTF9MSUdIVDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MDA1OworICAgIGludCBHTF9MSUdIVDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MDA2OworICAgIGludCBHTF9MSUdIVDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MDA3OworICAgIGludCBHTF9MSUdIVElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjUwOworICAgIGludCBHTF9MSU5FX0xPT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAyOworICAgIGludCBHTF9MSU5FX1NNT09USCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjIwOworICAgIGludCBHTF9MSU5FX1NNT09USF9ISU5UICAgICAgICAgICAgICAgICAgICAgID0gMHgwQzUyOworICAgIGludCBHTF9MSU5FX1NUUklQICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAzOworICAgIGludCBHTF9MSU5FQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyNjAxOworICAgIGludCBHTF9MSU5FQVJfQVRURU5VQVRJT04gICAgICAgICAgICAgICAgICAgID0gMHgxMjA4OworICAgIGludCBHTF9MSU5FQVJfTUlQTUFQX0xJTkVBUiAgICAgICAgICAgICAgICAgID0gMHgyNzAzOworICAgIGludCBHTF9MSU5FQVJfTUlQTUFQX05FQVJFU1QgICAgICAgICAgICAgICAgID0gMHgyNzAxOworICAgIGludCBHTF9MSU5FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAxOworICAgIGludCBHTF9MVU1JTkFOQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxOTA5OworICAgIGludCBHTF9MVU1JTkFOQ0VfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgID0gMHgxOTBBOworICAgIGludCBHTF9NQVhfRUxFTUVOVFNfSU5ESUNFUyAgICAgICAgICAgICAgICAgID0gMHg4MEU5OworICAgIGludCBHTF9NQVhfRUxFTUVOVFNfVkVSVElDRVMgICAgICAgICAgICAgICAgID0gMHg4MEU4OworICAgIGludCBHTF9NQVhfTElHSFRTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDMxOworICAgIGludCBHTF9NQVhfTU9ERUxWSUVXX1NUQUNLX0RFUFRIICAgICAgICAgICAgID0gMHgwRDM2OworICAgIGludCBHTF9NQVhfUFJPSkVDVElPTl9TVEFDS19ERVBUSCAgICAgICAgICAgID0gMHgwRDM4OworICAgIGludCBHTF9NQVhfVEVYVFVSRV9TSVpFICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDMzOworICAgIGludCBHTF9NQVhfVEVYVFVSRV9TVEFDS19ERVBUSCAgICAgICAgICAgICAgID0gMHgwRDM5OworICAgIGludCBHTF9NQVhfVEVYVFVSRV9VTklUUyAgICAgICAgICAgICAgICAgICAgID0gMHg4NEUyOworICAgIGludCBHTF9NQVhfVklFV1BPUlRfRElNUyAgICAgICAgICAgICAgICAgICAgID0gMHgwRDNBOworICAgIGludCBHTF9NT0RFTFZJRVcgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNzAwOworICAgIGludCBHTF9NT0RVTEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyMTAwOworICAgIGludCBHTF9NVUxUSVNBTVBMRSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDlEOworICAgIGludCBHTF9OQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTBFOworICAgIGludCBHTF9ORUFSRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyNjAwOworICAgIGludCBHTF9ORUFSRVNUX01JUE1BUF9MSU5FQVIgICAgICAgICAgICAgICAgID0gMHgyNzAyOworICAgIGludCBHTF9ORUFSRVNUX01JUE1BUF9ORUFSRVNUICAgICAgICAgICAgICAgID0gMHgyNzAwOworICAgIGludCBHTF9ORVZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMjAwOworICAgIGludCBHTF9OSUNFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMTAyOworICAgIGludCBHTF9OT19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMDsKKyAgICBpbnQgR0xfTk9PUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTUwNTsKKyAgICBpbnQgR0xfTk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTUwODsKKyAgICBpbnQgR0xfTk9STUFMX0FSUkFZICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA3NTsKKyAgICBpbnQgR0xfTk9STUFMSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJBMTsKKyAgICBpbnQgR0xfTk9URVFVQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDIwNTsKKyAgICBpbnQgR0xfTlVNX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTICAgICAgICA9IDB4ODZBMjsKKyAgICBpbnQgR0xfT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE7CisgICAgaW50IEdMX09ORV9NSU5VU19EU1RfQUxQSEEgICAgICAgICAgICAgICAgICAgPSAweDAzMDU7CisgICAgaW50IEdMX09ORV9NSU5VU19EU1RfQ09MT1IgICAgICAgICAgICAgICAgICAgPSAweDAzMDc7CisgICAgaW50IEdMX09ORV9NSU5VU19TUkNfQUxQSEEgICAgICAgICAgICAgICAgICAgPSAweDAzMDM7CisgICAgaW50IEdMX09ORV9NSU5VU19TUkNfQ09MT1IgICAgICAgICAgICAgICAgICAgPSAweDAzMDE7CisgICAgaW50IEdMX09SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MDc7CisgICAgaW50IEdMX09SX0lOVkVSVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MEQ7CisgICAgaW50IEdMX09SX1JFVkVSU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MEI7CisgICAgaW50IEdMX09VVF9PRl9NRU1PUlkgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDA1MDU7CisgICAgaW50IEdMX1BBQ0tfQUxJR05NRU5UICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBEMDU7CisgICAgaW50IEdMX1BBTEVUVEU0X1I1X0c2X0I1X09FUyAgICAgICAgICAgICAgICAgPSAweDhCOTI7CisgICAgaW50IEdMX1BBTEVUVEU0X1JHQjVfQTFfT0VTICAgICAgICAgICAgICAgICAgPSAweDhCOTQ7CisgICAgaW50IEdMX1BBTEVUVEU0X1JHQjhfT0VTICAgICAgICAgICAgICAgICAgICAgPSAweDhCOTA7CisgICAgaW50IEdMX1BBTEVUVEU0X1JHQkE0X09FUyAgICAgICAgICAgICAgICAgICAgPSAweDhCOTM7CisgICAgaW50IEdMX1BBTEVUVEU0X1JHQkE4X09FUyAgICAgICAgICAgICAgICAgICAgPSAweDhCOTE7CisgICAgaW50IEdMX1BBTEVUVEU4X1I1X0c2X0I1X09FUyAgICAgICAgICAgICAgICAgPSAweDhCOTc7CisgICAgaW50IEdMX1BBTEVUVEU4X1JHQjVfQTFfT0VTICAgICAgICAgICAgICAgICAgPSAweDhCOTk7CisgICAgaW50IEdMX1BBTEVUVEU4X1JHQjhfT0VTICAgICAgICAgICAgICAgICAgICAgPSAweDhCOTU7CisgICAgaW50IEdMX1BBTEVUVEU4X1JHQkE0X09FUyAgICAgICAgICAgICAgICAgICAgPSAweDhCOTg7CisgICAgaW50IEdMX1BBTEVUVEU4X1JHQkE4X09FUyAgICAgICAgICAgICAgICAgICAgPSAweDhCOTY7CisgICAgaW50IEdMX1BFUlNQRUNUSVZFX0NPUlJFQ1RJT05fSElOVCAgICAgICAgICAgPSAweDBDNTA7CisgICAgaW50IEdMX1BPSU5UX1NNT09USCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCMTA7CisgICAgaW50IEdMX1BPSU5UX1NNT09USF9ISU5UICAgICAgICAgICAgICAgICAgICAgPSAweDBDNTE7CisgICAgaW50IEdMX1BPSU5UUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDA7CisgICAgaW50IEdMX1BPSU5UX0ZBREVfVEhSRVNIT0xEX1NJWkUgICAgICAgICAgICAgPSAweDgxMjg7CisgICAgaW50IEdMX1BPSU5UX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCMTE7CisgICAgaW50IEdMX1BPTFlHT05fT0ZGU0VUX0ZJTEwgICAgICAgICAgICAgICAgICAgPSAweDgwMzc7CisgICAgaW50IEdMX1BPTFlHT05fU01PT1RIX0hJTlQgICAgICAgICAgICAgICAgICAgPSAweDBDNTM7CisgICAgaW50IEdMX1BPU0lUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDEyMDM7CisgICAgaW50IEdMX1BST0pFQ1RJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE3MDE7CisgICAgaW50IEdMX1FVQURSQVRJQ19BVFRFTlVBVElPTiAgICAgICAgICAgICAgICAgPSAweDEyMDk7CisgICAgaW50IEdMX1JFRF9CSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBENTI7CisgICAgaW50IEdMX1JFTkRFUkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDFGMDE7CisgICAgaW50IEdMX1JFUEVBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDI5MDE7CisgICAgaW50IEdMX1JFUExBQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDFFMDE7CisgICAgaW50IEdMX1JFU0NBTEVfTk9STUFMICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwM0E7CisgICAgaW50IEdMX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE5MDc7CisgICAgaW50IEdMX1JHQkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE5MDg7CisgICAgaW50IEdMX1NBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSAgICAgICAgICAgICAgPSAweDgwOUU7CisgICAgaW50IEdMX1NBTVBMRV9BTFBIQV9UT19PTkUgICAgICAgICAgICAgICAgICAgPSAweDgwOUY7CisgICAgaW50IEdMX1NBTVBMRV9DT1ZFUkFHRSAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwQTA7CisgICAgaW50IEdMX1NDSVNTT1JfVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBDMTE7CisgICAgaW50IEdMX1NFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MEY7CisgICAgaW50IEdMX1NISU5JTkVTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE2MDE7CisgICAgaW50IEdMX1NIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE0MDI7CisgICAgaW50IEdMX1NNT09USCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDFEMDE7CisgICAgaW50IEdMX1NNT09USF9MSU5FX1dJRFRIX1JBTkdFICAgICAgICAgICAgICAgPSAweDBCMjI7CisgICAgaW50IEdMX1NNT09USF9QT0lOVF9TSVpFX1JBTkdFICAgICAgICAgICAgICAgPSAweDBCMTI7CisgICAgaW50IEdMX1NQRUNVTEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDEyMDI7CisgICAgaW50IEdMX1NQT1RfQ1VUT0ZGICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDEyMDY7CisgICAgaW50IEdMX1NQT1RfRElSRUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgPSAweDEyMDQ7CisgICAgaW50IEdMX1NQT1RfRVhQT05FTlQgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDEyMDU7CisgICAgaW50IEdMX1NSQ19BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAzMDI7CisgICAgaW50IEdMX1NSQ19BTFBIQV9TQVRVUkFURSAgICAgICAgICAgICAgICAgICAgPSAweDAzMDg7CisgICAgaW50IEdMX1NSQ19DT0xPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAzMDA7CisgICAgaW50IEdMX1NUQUNLX09WRVJGTE9XICAgICAgICAgICAgICAgICAgICAgICAgPSAweDA1MDM7CisgICAgaW50IEdMX1NUQUNLX1VOREVSRkxPVyAgICAgICAgICAgICAgICAgICAgICAgPSAweDA1MDQ7CisgICAgaW50IEdMX1NURU5DSUxfQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBENTc7CisgICAgaW50IEdMX1NURU5DSUxfQlVGRkVSX0JJVCAgICAgICAgICAgICAgICAgICAgPSAweDA0MDA7CisgICAgaW50IEdMX1NURU5DSUxfVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCOTA7CisgICAgaW50IEdMX1NVQlBJWEVMX0JJVFMgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBENTA7CisgICAgaW50IEdMX1RFWFRVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE3MDI7CisgICAgaW50IEdMX1RFWFRVUkVfMkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBERTE7CisgICAgaW50IEdMX1RFWFRVUkVfQ09PUkRfQVJSQVkgICAgICAgICAgICAgICAgICAgPSAweDgwNzg7CisgICAgaW50IEdMX1RFWFRVUkVfRU5WICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDIzMDA7CisgICAgaW50IEdMX1RFWFRVUkVfRU5WX0NPTE9SICAgICAgICAgICAgICAgICAgICAgPSAweDIyMDE7CisgICAgaW50IEdMX1RFWFRVUkVfRU5WX01PREUgICAgICAgICAgICAgICAgICAgICAgPSAweDIyMDA7CisgICAgaW50IEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiAgICAgICAgICAgICAgICAgICAgPSAweDI4MDA7CisgICAgaW50IEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiAgICAgICAgICAgICAgICAgICAgPSAweDI4MDE7CisgICAgaW50IEdMX1RFWFRVUkVfV1JBUF9TICAgICAgICAgICAgICAgICAgICAgICAgPSAweDI4MDI7CisgICAgaW50IEdMX1RFWFRVUkVfV1JBUF9UICAgICAgICAgICAgICAgICAgICAgICAgPSAweDI4MDM7CisgICAgaW50IEdMX1RFWFRVUkUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0QzA7CisgICAgaW50IEdMX1RFWFRVUkUxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0QzE7CisgICAgaW50IEdMX1RFWFRVUkUyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0QzI7CisgICAgaW50IEdMX1RFWFRVUkUzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0QzM7CisgICAgaW50IEdMX1RFWFRVUkU0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0QzQ7CisgICAgaW50IEdMX1RFWFRVUkU1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0QzU7CisgICAgaW50IEdMX1RFWFRVUkU2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0QzY7CisgICAgaW50IEdMX1RFWFRVUkU3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0Qzc7CisgICAgaW50IEdMX1RFWFRVUkU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0Qzg7CisgICAgaW50IEdMX1RFWFRVUkU5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0Qzk7CisgICAgaW50IEdMX1RFWFRVUkUxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0Q0E7CisgICAgaW50IEdMX1RFWFRVUkUxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0Q0I7CisgICAgaW50IEdMX1RFWFRVUkUxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0Q0M7CisgICAgaW50IEdMX1RFWFRVUkUxMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0Q0Q7CisgICAgaW50IEdMX1RFWFRVUkUxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0Q0U7CisgICAgaW50IEdMX1RFWFRVUkUxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0Q0Y7CisgICAgaW50IEdMX1RFWFRVUkUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDA7CisgICAgaW50IEdMX1RFWFRVUkUxNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDE7CisgICAgaW50IEdMX1RFWFRVUkUxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDI7CisgICAgaW50IEdMX1RFWFRVUkUxOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDM7CisgICAgaW50IEdMX1RFWFRVUkUyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDQ7CisgICAgaW50IEdMX1RFWFRVUkUyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDU7CisgICAgaW50IEdMX1RFWFRVUkUyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDY7CisgICAgaW50IEdMX1RFWFRVUkUyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDc7CisgICAgaW50IEdMX1RFWFRVUkUyNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDg7CisgICAgaW50IEdMX1RFWFRVUkUyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDk7CisgICAgaW50IEdMX1RFWFRVUkUyNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0REE7CisgICAgaW50IEdMX1RFWFRVUkUyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0REI7CisgICAgaW50IEdMX1RFWFRVUkUyOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0REM7CisgICAgaW50IEdMX1RFWFRVUkUyOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0REQ7CisgICAgaW50IEdMX1RFWFRVUkUzMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0REU7CisgICAgaW50IEdMX1RFWFRVUkUzMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0REY7CisgICAgaW50IEdMX1RSSUFOR0xFX0ZBTiAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDY7CisgICAgaW50IEdMX1RSSUFOR0xFX1NUUklQICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDU7CisgICAgaW50IEdMX1RSSUFOR0xFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDQ7CisgICAgaW50IEdMX1RSVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOworICAgIGludCBHTF9VTlBBQ0tfQUxJR05NRU5UICAgICAgICAgICAgICAgICAgICAgID0gMHgwQ0Y1OworICAgIGludCBHTF9VTlNJR05FRF9CWVRFICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNDAxOworICAgIGludCBHTF9VTlNJR05FRF9TSE9SVCAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNDAzOworICAgIGludCBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80ICAgICAgICAgICAgICAgID0gMHg4MDMzOworICAgIGludCBHTF9VTlNJR05FRF9TSE9SVF81XzVfNV8xICAgICAgICAgICAgICAgID0gMHg4MDM0OworICAgIGludCBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSAgICAgICAgICAgICAgICAgID0gMHg4MzYzOworICAgIGludCBHTF9WRU5ET1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRjAwOworICAgIGludCBHTF9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRjAyOworICAgIGludCBHTF9WRVJURVhfQVJSQVkgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDc0OworICAgIGludCBHTF9YT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTA2OworICAgIGludCBHTF9aRVJPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMDsKKwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMMTFFeHRIZWFkZXIuamF2YS1pZiBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTDExRXh0SGVhZGVyLmphdmEtaWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JlMjE2NAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTDExRXh0SGVhZGVyLmphdmEtaWYKQEAgLTAsMCArMSw0MCBAQAorKioKKyoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8vIFRoaXMgc291cmNlIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKKworcGFja2FnZSBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlczsKKworcHVibGljIGludGVyZmFjZSBHTDExRXh0IGV4dGVuZHMgR0wgeworICAgIGludCBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfQlVGRkVSX0JJTkRJTkdfT0VTID0gMHg4QjlFOworICAgIGludCBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfT0VTICAgICAgICAgICAgICAgID0gMHg4ODQ0OworICAgIGludCBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfUE9JTlRFUl9PRVMgICAgICAgID0gMHg4ODQ5OworICAgIGludCBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfU0laRV9PRVMgICAgICAgICAgID0gMHg4ODQ2OworICAgIGludCBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfU1RSSURFX09FUyAgICAgICAgID0gMHg4ODQ4OworICAgIGludCBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfVFlQRV9PRVMgICAgICAgICAgID0gMHg4ODQ3OworICAgIGludCBHTF9NQVRSSVhfUEFMRVRURV9PRVMgICAgICAgICAgICAgICAgICAgID0gMHg4ODQwOworICAgIGludCBHTF9NQVhfUEFMRVRURV9NQVRSSUNFU19PRVMgICAgICAgICAgICAgID0gMHg4ODQyOworICAgIGludCBHTF9NQVhfVkVSVEVYX1VOSVRTX09FUyAgICAgICAgICAgICAgICAgID0gMHg4NkE0OworICAgIGludCBHTF9URVhUVVJFX0NST1BfUkVDVF9PRVMgICAgICAgICAgICAgICAgID0gMHg4QjlEOworICAgIGludCBHTF9XRUlHSFRfQVJSQVlfQlVGRkVSX0JJTkRJTkdfT0VTICAgICAgID0gMHg4ODlFOworICAgIGludCBHTF9XRUlHSFRfQVJSQVlfT0VTICAgICAgICAgICAgICAgICAgICAgID0gMHg4NkFEOworICAgIGludCBHTF9XRUlHSFRfQVJSQVlfUE9JTlRFUl9PRVMgICAgICAgICAgICAgID0gMHg4NkFDOworICAgIGludCBHTF9XRUlHSFRfQVJSQVlfU0laRV9PRVMgICAgICAgICAgICAgICAgID0gMHg4NkFCOworICAgIGludCBHTF9XRUlHSFRfQVJSQVlfU1RSSURFX09FUyAgICAgICAgICAgICAgID0gMHg4NkFBOworICAgIGludCBHTF9XRUlHSFRfQVJSQVlfVFlQRV9PRVMgICAgICAgICAgICAgICAgID0gMHg4NkE5OworCisgICAgdm9pZCBnbFRleFBhcmFtZXRlcmZ2KGludCB0YXJnZXQsIGludCBwbmFtZSwgZmxvYXRbXSBwYXJhbSwgaW50IG9mZnNldCk7CisKZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTDExRXh0ZW5zaW9uUGFja0hlYWRlci5qYXZhLWlmIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMMTFFeHRlbnNpb25QYWNrSGVhZGVyLmphdmEtaWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgwMDE5MQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTDExRXh0ZW5zaW9uUGFja0hlYWRlci5qYXZhLWlmCkBAIC0wLDAgKzEsMTA4IEBACisqKgorKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLy8gVGhpcyBzb3VyY2UgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAorCitwYWNrYWdlIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzOworCitwdWJsaWMgaW50ZXJmYWNlIEdMMTFFeHRlbnNpb25QYWNrIGV4dGVuZHMgR0wgeworICAgIGludCBHTF9CTEVORF9EU1RfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwQ0E7CisgICAgaW50IEdMX0JMRU5EX0RTVF9SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODBDODsKKyAgICBpbnQgR0xfQkxFTkRfRVFVQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDA5OworICAgIGludCBHTF9CTEVORF9FUVVBVElPTl9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg4M0Q7CisgICAgaW50IEdMX0JMRU5EX0VRVUFUSU9OX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODAwOTsKKyAgICBpbnQgR0xfQkxFTkRfU1JDX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MENCOworICAgIGludCBHTF9CTEVORF9TUkNfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwQzk7CisgICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQwX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFMDsKKyAgICBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDFfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0UxOworICAgIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UMl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDRTI7CisgICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQzX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFMzsKKyAgICBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDRfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0U0OworICAgIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UNV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDRTU7CisgICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQ2X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFNjsKKyAgICBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDdfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0U3OworICAgIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UOF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDRTg7CisgICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQ5X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFOTsKKyAgICBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDEwX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0VBOworICAgIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UMTFfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDRUI7CisgICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQxMl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFQzsKKyAgICBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDEzX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0VEOworICAgIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UMTRfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDRUU7CisgICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQxNV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFRjsKKyAgICBpbnQgR0xfREVDUl9XUkFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTA4OworICAgIGludCBHTF9ERVBUSF9BVFRBQ0hNRU5UX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhEMDA7CisgICAgaW50IEdMX0RFUFRIX0NPTVBPTkVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTkwMjsKKyAgICBpbnQgR0xfREVQVEhfQ09NUE9ORU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MUE1OworICAgIGludCBHTF9ERVBUSF9DT01QT05FTlQyNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgxQTY7CisgICAgaW50IEdMX0RFUFRIX0NPTVBPTkVOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODFBNzsKKyAgICBpbnQgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfTkFNRV9PRVMgICAgICAgICAgID0gMHg4Q0QxOworICAgIGludCBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9UWVBFX09FUyAgICAgICAgICAgPSAweDhDRDA7CisgICAgaW50IEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9DVUJFX01BUF9GQUNFX09FUyA9IDB4OENEMzsKKyAgICBpbnQgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0xFVkVMX09FUyAgICAgICAgID0gMHg4Q0QyOworICAgIGludCBHTF9GUkFNRUJVRkZFUl9CSU5ESU5HX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDQTY7CisgICAgaW50IEdMX0ZSQU1FQlVGRkVSX0NPTVBMRVRFX09FUyAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENENTsKKyAgICBpbnQgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9BVFRBQ0hNRU5UX09FUyAgICAgICAgICAgID0gMHg4Q0Q2OworICAgIGludCBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RJTUVOU0lPTlNfT0VTICAgICAgICAgICAgPSAweDhDRDk7CisgICAgaW50IEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRFJBV19CVUZGRVJfT0VTICAgICAgICAgICA9IDB4OENEQjsKKyAgICBpbnQgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9GT1JNQVRTX09FUyAgICAgICAgICAgICAgID0gMHg4Q0RBOworICAgIGludCBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX01JU1NJTkdfQVRUQUNITUVOVF9PRVMgICAgPSAweDhDRDc7CisgICAgaW50IEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfUkVBRF9CVUZGRVJfT0VTICAgICAgICAgICA9IDB4OENEQzsKKyAgICBpbnQgR0xfRlJBTUVCVUZGRVJfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDQwOworICAgIGludCBHTF9GUkFNRUJVRkZFUl9VTlNVUFBPUlRFRF9PRVMgICAgICAgICAgICAgICAgICAgICAgPSAweDhDREQ7CisgICAgaW50IEdMX0ZVTkNfQUREICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODAwNjsKKyAgICBpbnQgR0xfRlVOQ19SRVZFUlNFX1NVQlRSQUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDBCOworICAgIGludCBHTF9GVU5DX1NVQlRSQUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwMEE7CisgICAgaW50IEdMX0lOQ1JfV1JBUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUwNzsKKyAgICBpbnQgR0xfSU5WQUxJRF9GUkFNRUJVRkZFUl9PUEVSQVRJT05fT0VTICAgICAgICAgICAgICAgID0gMHgwNTA2OworICAgIGludCBHTF9NQVhfQ09MT1JfQVRUQUNITUVOVFNfT0VTICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDREY7CisgICAgaW50IEdMX01BWF9DVUJFX01BUF9URVhUVVJFX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUxQzsKKyAgICBpbnQgR0xfTUFYX1JFTkRFUkJVRkZFUl9TSVpFX09FUyAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEU4OworICAgIGludCBHTF9NSVJST1JFRF9SRVBFQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgzNzA7CisgICAgaW50IEdMX05PUk1BTF9NQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUxMTsKKyAgICBpbnQgR0xfUkVGTEVDVElPTl9NQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTEyOworICAgIGludCBHTF9SRU5ERVJCVUZGRVJfQUxQSEFfU0laRV9PRVMgICAgICAgICAgICAgICAgICAgICAgPSAweDhENTM7CisgICAgaW50IEdMX1JFTkRFUkJVRkZFUl9CSU5ESU5HX09FUyAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENBNzsKKyAgICBpbnQgR0xfUkVOREVSQlVGRkVSX0JMVUVfU0laRV9PRVMgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDUyOworICAgIGludCBHTF9SRU5ERVJCVUZGRVJfREVQVEhfU0laRV9PRVMgICAgICAgICAgICAgICAgICAgICAgPSAweDhENTQ7CisgICAgaW50IEdMX1JFTkRFUkJVRkZFUl9HUkVFTl9TSVpFX09FUyAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ1MTsKKyAgICBpbnQgR0xfUkVOREVSQlVGRkVSX0hFSUdIVF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDQzOworICAgIGludCBHTF9SRU5ERVJCVUZGRVJfSU5URVJOQUxfRk9STUFUX09FUyAgICAgICAgICAgICAgICAgPSAweDhENDQ7CisgICAgaW50IEdMX1JFTkRFUkJVRkZFUl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ0MTsKKyAgICBpbnQgR0xfUkVOREVSQlVGRkVSX1JFRF9TSVpFX09FUyAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDUwOworICAgIGludCBHTF9SRU5ERVJCVUZGRVJfU1RFTkNJTF9TSVpFX09FUyAgICAgICAgICAgICAgICAgICAgPSAweDhENTU7CisgICAgaW50IEdMX1JFTkRFUkJVRkZFUl9XSURUSF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ0MjsKKyAgICBpbnQgR0xfUkdCNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDU3OworICAgIGludCBHTF9SR0I1NjVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhENjI7CisgICAgaW50IEdMX1JHQjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA1MTsKKyAgICBpbnQgR0xfUkdCQTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDU2OworICAgIGludCBHTF9SR0JBOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwNTg7CisgICAgaW50IEdMX1NURU5DSUxfQVRUQUNITUVOVF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQyMDsKKyAgICBpbnQgR0xfU1RFTkNJTF9JTkRFWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxOTAxOworICAgIGludCBHTF9TVEVOQ0lMX0lOREVYMV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhENDY7CisgICAgaW50IEdMX1NURU5DSUxfSU5ERVg0X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ0NzsKKyAgICBpbnQgR0xfU1RFTkNJTF9JTkRFWDhfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDQ4OworICAgIGludCBHTF9TVFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAtMTsKKyAgICBpbnQgR0xfVEVYVFVSRV9CSU5ESU5HX0NVQkVfTUFQICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTE0OworICAgIGludCBHTF9URVhUVVJFX0NVQkVfTUFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1MTM7CisgICAgaW50IEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWCAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUxNjsKKyAgICBpbnQgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9ZICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTE4OworICAgIGludCBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1ogICAgICAgICAgICAgICAgICAgICAgPSAweDg1MUE7CisgICAgaW50IEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUxNTsKKyAgICBpbnQgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9ZICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTE3OworICAgIGludCBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ogICAgICAgICAgICAgICAgICAgICAgPSAweDg1MTk7CisgICAgaW50IEdMX1RFWFRVUkVfR0VOX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MjUwMDsKKyAgICBpbnQgR0xfVEVYVFVSRV9HRU5fU1RSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDYwOworCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0wxMUhlYWRlci5qYXZhLWlmIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMMTFIZWFkZXIuamF2YS1pZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGU1YTZiCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMMTFIZWFkZXIuamF2YS1pZgpAQCAtMCwwICsxLDE0NSBAQAorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8vIFRoaXMgc291cmNlIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKKworcGFja2FnZSBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlczsKKworcHVibGljIGludGVyZmFjZSBHTDExIGV4dGVuZHMgR0wxMCB7CisgICAgaW50IEdMX0FDVElWRV9URVhUVVJFICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRFMDsKKyAgICBpbnQgR0xfQUREX1NJR05FRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTc0OworICAgIGludCBHTF9BTFBIQV9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBEMUM7CisgICAgaW50IEdMX0FMUEhBX1RFU1RfRlVOQyAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJDMTsKKyAgICBpbnQgR0xfQUxQSEFfVEVTVF9SRUYgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkMyOworICAgIGludCBHTF9BUlJBWV9CVUZGRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg4OTI7CisgICAgaW50IEdMX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgICAgICAgICAgICAgICAgICA9IDB4ODg5NDsKKyAgICBpbnQgR0xfQkxFTkRfRFNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkUwOworICAgIGludCBHTF9CTEVORF9TUkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCRTE7CisgICAgaW50IEdMX0JVRkZFUl9BQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODhCQjsKKyAgICBpbnQgR0xfQlVGRkVSX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NzY0OworICAgIGludCBHTF9CVUZGRVJfVVNBR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg3NjU7CisgICAgaW50IEdMX0NMSUVOVF9BQ1RJVkVfVEVYVFVSRSAgICAgICAgICAgICAgICAgICA9IDB4ODRFMTsKKyAgICBpbnQgR0xfQ0xJUF9QTEFORTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgzMDAwOworICAgIGludCBHTF9DTElQX1BMQU5FMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDMwMDE7CisgICAgaW50IEdMX0NMSVBfUExBTkUyICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MzAwMjsKKyAgICBpbnQgR0xfQ0xJUF9QTEFORTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgzMDAzOworICAgIGludCBHTF9DTElQX1BMQU5FNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDMwMDQ7CisgICAgaW50IEdMX0NMSVBfUExBTkU1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MzAwNTsKKyAgICBpbnQgR0xfQ09MT1JfQVJSQVlfQlVGRkVSX0JJTkRJTkcgICAgICAgICAgICAgID0gMHg4ODk4OworICAgIGludCBHTF9DT0xPUl9BUlJBWV9QT0lOVEVSICAgICAgICAgICAgICAgICAgICAgPSAweDgwOTA7CisgICAgaW50IEdMX0NPTE9SX0FSUkFZX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA4MTsKKyAgICBpbnQgR0xfQ09MT1JfQVJSQVlfU1RSSURFICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDgzOworICAgIGludCBHTF9DT0xPUl9BUlJBWV9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwODI7CisgICAgaW50IEdMX0NPTE9SX0NMRUFSX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEMyMjsKKyAgICBpbnQgR0xfQ09MT1JfV1JJVEVNQVNLICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQzIzOworICAgIGludCBHTF9DT01CSU5FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1NzA7CisgICAgaW50IEdMX0NPTUJJTkVfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU3MjsKKyAgICBpbnQgR0xfQ09NQklORV9SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTcxOworICAgIGludCBHTF9DT05TVEFOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1NzY7CisgICAgaW50IEdMX0NPT1JEX1JFUExBQ0VfT0VTICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODg2MjsKKyAgICBpbnQgR0xfQ1VMTF9GQUNFX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjQ1OworICAgIGludCBHTF9DVVJSRU5UX0NPTE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCMDA7CisgICAgaW50IEdMX0NVUlJFTlRfTk9STUFMICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEIwMjsKKyAgICBpbnQgR0xfQ1VSUkVOVF9URVhUVVJFX0NPT1JEUyAgICAgICAgICAgICAgICAgID0gMHgwQjAzOworICAgIGludCBHTF9ERVBUSF9DTEVBUl9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNzM7CisgICAgaW50IEdMX0RFUFRIX0ZVTkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI3NDsKKyAgICBpbnQgR0xfREVQVEhfUkFOR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjcwOworICAgIGludCBHTF9ERVBUSF9XUklURU1BU0sgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNzI7CisgICAgaW50IEdMX0RPVDNfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODZBRTsKKyAgICBpbnQgR0xfRE9UM19SR0JBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NkFGOworICAgIGludCBHTF9EWU5BTUlDX0RSQVcgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg4RTg7CisgICAgaW50IEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSICAgICAgICAgICAgICAgICAgICA9IDB4ODg5MzsKKyAgICBpbnQgR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVJfQklORElORyAgICAgICAgICAgID0gMHg4ODk1OworICAgIGludCBHTF9GUk9OVF9GQUNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNDY7CisgICAgaW50IEdMX0dFTkVSQVRFX01JUE1BUCAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODE5MTsKKyAgICBpbnQgR0xfR0VORVJBVEVfTUlQTUFQX0hJTlQgICAgICAgICAgICAgICAgICAgID0gMHg4MTkyOworICAgIGludCBHTF9JTlRFUlBPTEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1NzU7CisgICAgaW50IEdMX0xJTkVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEIyMTsKKyAgICBpbnQgR0xfTE9HSUNfT1BfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkYwOworICAgIGludCBHTF9NQVRSSVhfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCQTA7CisgICAgaW50IEdMX01BWF9DTElQX1BMQU5FUyAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEQzMjsKKyAgICBpbnQgR0xfTU9ERUxWSUVXX01BVFJJWCAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkE2OworICAgIGludCBHTF9NT0RFTFZJRVdfTUFUUklYX0ZMT0FUX0FTX0lOVF9CSVRTX09FUyAgPSAweDg5OEQ7CisgICAgaW50IEdMX01PREVMVklFV19TVEFDS19ERVBUSCAgICAgICAgICAgICAgICAgICA9IDB4MEJBMzsKKyAgICBpbnQgR0xfTk9STUFMX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgICAgICAgICAgID0gMHg4ODk3OworICAgIGludCBHTF9OT1JNQUxfQVJSQVlfUE9JTlRFUiAgICAgICAgICAgICAgICAgICAgPSAweDgwOEY7CisgICAgaW50IEdMX05PUk1BTF9BUlJBWV9TVFJJREUgICAgICAgICAgICAgICAgICAgICA9IDB4ODA3RjsKKyAgICBpbnQgR0xfTk9STUFMX0FSUkFZX1RZUEUgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDdFOworICAgIGludCBHTF9PUEVSQU5EMF9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1OTg7CisgICAgaW50IEdMX09QRVJBTkQwX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU5MDsKKyAgICBpbnQgR0xfT1BFUkFORDFfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTk5OworICAgIGludCBHTF9PUEVSQU5EMV9SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1OTE7CisgICAgaW50IEdMX09QRVJBTkQyX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU5QTsKKyAgICBpbnQgR0xfT1BFUkFORDJfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTkyOworICAgIGludCBHTF9QT0lOVF9ESVNUQU5DRV9BVFRFTlVBVElPTiAgICAgICAgICAgICAgPSAweDgxMjk7CisgICAgaW50IEdMX1BPSU5UX0ZBREVfVEhSRVNIT0xEX1NJWkUgICAgICAgICAgICAgICA9IDB4ODEyODsKKyAgICBpbnQgR0xfUE9JTlRfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjExOworICAgIGludCBHTF9QT0lOVF9TSVpFX0FSUkFZX0JVRkZFUl9CSU5ESU5HX09FUyAgICAgPSAweDhCOUY7CisgICAgaW50IEdMX1BPSU5UX1NJWkVfQVJSQVlfT0VTICAgICAgICAgICAgICAgICAgICA9IDB4OEI5QzsKKyAgICBpbnQgR0xfUE9JTlRfU0laRV9BUlJBWV9QT0lOVEVSX09FUyAgICAgICAgICAgID0gMHg4OThDOworICAgIGludCBHTF9QT0lOVF9TSVpFX0FSUkFZX1NUUklERV9PRVMgICAgICAgICAgICAgPSAweDg5OEI7CisgICAgaW50IEdMX1BPSU5UX1NJWkVfQVJSQVlfVFlQRV9PRVMgICAgICAgICAgICAgICA9IDB4ODk4QTsKKyAgICBpbnQgR0xfUE9JTlRfU0laRV9NQVggICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MTI3OworICAgIGludCBHTF9QT0lOVF9TSVpFX01JTiAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgxMjY7CisgICAgaW50IEdMX1BPSU5UX1NQUklURV9PRVMgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODg2MTsKKyAgICBpbnQgR0xfUE9MWUdPTl9PRkZTRVRfRkFDVE9SICAgICAgICAgICAgICAgICAgID0gMHg4MDM4OworICAgIGludCBHTF9QT0xZR09OX09GRlNFVF9VTklUUyAgICAgICAgICAgICAgICAgICAgPSAweDJBMDA7CisgICAgaW50IEdMX1BSRVZJT1VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU3ODsKKyAgICBpbnQgR0xfUFJJTUFSWV9DT0xPUiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTc3OworICAgIGludCBHTF9QUk9KRUNUSU9OX01BVFJJWCAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCQTc7CisgICAgaW50IEdMX1BST0pFQ1RJT05fTUFUUklYX0ZMT0FUX0FTX0lOVF9CSVRTX09FUyA9IDB4ODk4RTsKKyAgICBpbnQgR0xfUFJPSkVDVElPTl9TVEFDS19ERVBUSCAgICAgICAgICAgICAgICAgID0gMHgwQkE0OworICAgIGludCBHTF9SR0JfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1NzM7CisgICAgaW50IEdMX1NBTVBMRV9CVUZGRVJTICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODBBODsKKyAgICBpbnQgR0xfU0FNUExFX0NPVkVSQUdFX0lOVkVSVCAgICAgICAgICAgICAgICAgID0gMHg4MEFCOworICAgIGludCBHTF9TQU1QTEVfQ09WRVJBR0VfVkFMVUUgICAgICAgICAgICAgICAgICAgPSAweDgwQUE7CisgICAgaW50IEdMX1NBTVBMRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODBBOTsKKyAgICBpbnQgR0xfU0NJU1NPUl9CT1ggICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQzEwOworICAgIGludCBHTF9TSEFERV9NT0RFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNTQ7CisgICAgaW50IEdMX1NSQzBfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU4ODsKKyAgICBpbnQgR0xfU1JDMF9SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTgwOworICAgIGludCBHTF9TUkMxX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1ODk7CisgICAgaW50IEdMX1NSQzFfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU4MTsKKyAgICBpbnQgR0xfU1JDMl9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NThBOworICAgIGludCBHTF9TUkMyX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1ODI7CisgICAgaW50IEdMX1NUQVRJQ19EUkFXICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODhFNDsKKyAgICBpbnQgR0xfU1RFTkNJTF9DTEVBUl9WQUxVRSAgICAgICAgICAgICAgICAgICAgID0gMHgwQjkxOworICAgIGludCBHTF9TVEVOQ0lMX0ZBSUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCOTQ7CisgICAgaW50IEdMX1NURU5DSUxfRlVOQyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI5MjsKKyAgICBpbnQgR0xfU1RFTkNJTF9QQVNTX0RFUFRIX0ZBSUwgICAgICAgICAgICAgICAgID0gMHgwQjk1OworICAgIGludCBHTF9TVEVOQ0lMX1BBU1NfREVQVEhfUEFTUyAgICAgICAgICAgICAgICAgPSAweDBCOTY7CisgICAgaW50IEdMX1NURU5DSUxfUkVGICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI5NzsKKyAgICBpbnQgR0xfU1RFTkNJTF9WQUxVRV9NQVNLICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjkzOworICAgIGludCBHTF9TVEVOQ0lMX1dSSVRFTUFTSyAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCOTg7CisgICAgaW50IEdMX1NVQlRSQUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRFNzsKKyAgICBpbnQgR0xfVEVYVFVSRV9CSU5ESU5HXzJEICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDY5OworICAgIGludCBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgICAgPSAweDg4OUE7CisgICAgaW50IEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfUE9JTlRFUiAgICAgICAgICAgICA9IDB4ODA5MjsKKyAgICBpbnQgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9TSVpFICAgICAgICAgICAgICAgID0gMHg4MDg4OworICAgIGludCBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1NUUklERSAgICAgICAgICAgICAgPSAweDgwOEE7CisgICAgaW50IEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfVFlQRSAgICAgICAgICAgICAgICA9IDB4ODA4OTsKKyAgICBpbnQgR0xfVEVYVFVSRV9NQVRSSVggICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkE4OworICAgIGludCBHTF9URVhUVVJFX01BVFJJWF9GTE9BVF9BU19JTlRfQklUU19PRVMgICAgPSAweDg5OEY7CisgICAgaW50IEdMX1RFWFRVUkVfU1RBQ0tfREVQVEggICAgICAgICAgICAgICAgICAgICA9IDB4MEJBNTsKKyAgICBpbnQgR0xfVkVSVEVYX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgICAgICAgICAgID0gMHg4ODk2OworICAgIGludCBHTF9WRVJURVhfQVJSQVlfUE9JTlRFUiAgICAgICAgICAgICAgICAgICAgPSAweDgwOEU7CisgICAgaW50IEdMX1ZFUlRFWF9BUlJBWV9TSVpFICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA3QTsKKyAgICBpbnQgR0xfVkVSVEVYX0FSUkFZX1NUUklERSAgICAgICAgICAgICAgICAgICAgID0gMHg4MDdDOworICAgIGludCBHTF9WRVJURVhfQVJSQVlfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwN0I7CisgICAgaW50IEdMX1ZJRVdQT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJBMjsKKyAgICBpbnQgR0xfV1JJVEVfT05MWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4OEI5OworCisgICAgdm9pZCBnbEdldFBvaW50ZXJ2KGludCBwbmFtZSwgamF2YS5uaW8uQnVmZmVyW10gcGFyYW1zKTsKZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTDExSW1wbEhlYWRlci5qYXZhLWltcGwgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0wxMUltcGxIZWFkZXIuamF2YS1pbXBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMWJlNjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0wxMUltcGxIZWFkZXIuamF2YS1pbXBsCkBAIC0wLDAgKzEsMzAgQEAKKy8vIENvcHlyaWdodCAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworLy8gVGhpcyBzb3VyY2UgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAorCitwYWNrYWdlIGNvbS5nb29nbGUuYW5kcm9pZC5nbGVzX2puaTsKKworaW1wb3J0IGphdmEubmlvLkJ1ZmZlcjsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDExOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworCitwdWJsaWMgY2xhc3MgR0wxMUltcGwgaW1wbGVtZW50cyBHTDExIHsKKworICAgIC8vIFByaXZhdGUgYWNjZXNzb3JzIGZvciBuYXRpdmUgY29kZQorCisgICAgbmF0aXZlIHByaXZhdGUgc3RhdGljIHZvaWQgX25hdGl2ZUNsYXNzSW5pdCgpOworICAgIHN0YXRpYyB7CisJX25hdGl2ZUNsYXNzSW5pdCgpOworICAgIH0KKworICAgIEJ1ZmZlciBfY29sb3JQb2ludGVyID0gbnVsbDsKKyAgICBCdWZmZXIgX25vcm1hbFBvaW50ZXIgPSBudWxsOworICAgIEJ1ZmZlciBfdGV4Q29vcmRQb2ludGVyID0gbnVsbDsKKyAgICBCdWZmZXIgX3ZlcnRleFBvaW50ZXIgPSBudWxsOworCisgICAgcHVibGljIEdMMTFJbXBsKCkgeworICAgIH0KKworCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0xDSGVhZGVyLmNwcCBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTENIZWFkZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0OTU2ODYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0xDSGVhZGVyLmNwcApAQCAtMCwwICsxLDEyOSBAQAorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8vIFRoaXMgc291cmNlIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKKworI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oPgorI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKworI2luY2x1ZGUgPHByaXZhdGUvb3BlbmdsZXMvZ2xfY29udGV4dC5oPgorCisjZGVmaW5lIF9OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMgXAorICAgICAgICAoOjphbmRyb2lkOjpPR0xFU19OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMpCisKK3N0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOworCitzdGF0aWMgamNsYXNzIG5pb0FjY2Vzc0NsYXNzOworc3RhdGljIGpjbGFzcyBidWZmZXJDbGFzczsKK3N0YXRpYyBqY2xhc3MgT09NRUNsYXNzOworc3RhdGljIGpjbGFzcyBVT0VDbGFzczsKK3N0YXRpYyBqY2xhc3MgSUFFQ2xhc3M7CitzdGF0aWMgamNsYXNzIEFJT09CRUNsYXNzOworc3RhdGljIGptZXRob2RJRCBnZXRCYXNlUG9pbnRlcklEOworc3RhdGljIGptZXRob2RJRCBnZXRCYXNlQXJyYXlJRDsKK3N0YXRpYyBqbWV0aG9kSUQgZ2V0QmFzZUFycmF5T2Zmc2V0SUQ7CitzdGF0aWMgamZpZWxkSUQgcG9zaXRpb25JRDsKK3N0YXRpYyBqZmllbGRJRCBsaW1pdElEOworc3RhdGljIGpmaWVsZElEIGVsZW1lbnRTaXplU2hpZnRJRDsKKworLyogQ2FjaGUgbWV0aG9kIElEcyBlYWNoIHRpbWUgdGhlIGNsYXNzIGlzIGxvYWRlZC4gKi8KKwordm9pZAorbmF0aXZlQ2xhc3NJbml0QnVmZmVyKEpOSUVudiAqX2VudikKK3sKKyAgICBqY2xhc3MgbmlvQWNjZXNzQ2xhc3NMb2NhbCA9IF9lbnYtPkZpbmRDbGFzcygiamF2YS9uaW8vTklPQWNjZXNzIik7CisgICAgbmlvQWNjZXNzQ2xhc3MgPSAoamNsYXNzKSBfZW52LT5OZXdHbG9iYWxSZWYobmlvQWNjZXNzQ2xhc3NMb2NhbCk7CisKKyAgICBqY2xhc3MgYnVmZmVyQ2xhc3NMb2NhbCA9IF9lbnYtPkZpbmRDbGFzcygiamF2YS9uaW8vQnVmZmVyIik7CisgICAgYnVmZmVyQ2xhc3MgPSAoamNsYXNzKSBfZW52LT5OZXdHbG9iYWxSZWYoYnVmZmVyQ2xhc3NMb2NhbCk7CisKKyAgICBnZXRCYXNlUG9pbnRlcklEID0gX2Vudi0+R2V0U3RhdGljTWV0aG9kSUQobmlvQWNjZXNzQ2xhc3MsCisgICAgICAgICAgICAiZ2V0QmFzZVBvaW50ZXIiLCAiKExqYXZhL25pby9CdWZmZXI7KUoiKTsKKyAgICBnZXRCYXNlQXJyYXlJRCA9IF9lbnYtPkdldFN0YXRpY01ldGhvZElEKG5pb0FjY2Vzc0NsYXNzLAorICAgICAgICAgICAgImdldEJhc2VBcnJheSIsICIoTGphdmEvbmlvL0J1ZmZlcjspTGphdmEvbGFuZy9PYmplY3Q7Iik7CisgICAgZ2V0QmFzZUFycmF5T2Zmc2V0SUQgPSBfZW52LT5HZXRTdGF0aWNNZXRob2RJRChuaW9BY2Nlc3NDbGFzcywKKyAgICAgICAgICAgICJnZXRCYXNlQXJyYXlPZmZzZXQiLCAiKExqYXZhL25pby9CdWZmZXI7KUkiKTsKKworICAgIHBvc2l0aW9uSUQgPSBfZW52LT5HZXRGaWVsZElEKGJ1ZmZlckNsYXNzLCAicG9zaXRpb24iLCAiSSIpOworICAgIGxpbWl0SUQgPSBfZW52LT5HZXRGaWVsZElEKGJ1ZmZlckNsYXNzLCAibGltaXQiLCAiSSIpOworICAgIGVsZW1lbnRTaXplU2hpZnRJRCA9CisgICAgICAgIF9lbnYtPkdldEZpZWxkSUQoYnVmZmVyQ2xhc3MsICJfZWxlbWVudFNpemVTaGlmdCIsICJJIik7Cit9CisKKworc3RhdGljIHZvaWQKK25hdGl2ZUNsYXNzSW5pdChKTklFbnYgKl9lbnYsIGpjbGFzcyBnbEltcGxDbGFzcykKK3sKKyAgICBuYXRpdmVDbGFzc0luaXRCdWZmZXIoX2Vudik7CisKKyAgICBqY2xhc3MgSUFFQ2xhc3NMb2NhbCA9CisgICAgICAgIF9lbnYtPkZpbmRDbGFzcygiamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpOworICAgIGpjbGFzcyBPT01FQ2xhc3NMb2NhbCA9CisgICAgICAgICBfZW52LT5GaW5kQ2xhc3MoImphdmEvbGFuZy9PdXRPZk1lbW9yeUVycm9yIik7CisgICAgamNsYXNzIFVPRUNsYXNzTG9jYWwgPQorICAgICAgICAgX2Vudi0+RmluZENsYXNzKCJqYXZhL2xhbmcvVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24iKTsKKyAgICBqY2xhc3MgQUlPT0JFQ2xhc3NMb2NhbCA9CisgICAgICAgICBfZW52LT5GaW5kQ2xhc3MoImphdmEvbGFuZy9BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iKTsKKworICAgIElBRUNsYXNzID0gKGpjbGFzcykgX2Vudi0+TmV3R2xvYmFsUmVmKElBRUNsYXNzTG9jYWwpOworICAgIE9PTUVDbGFzcyA9IChqY2xhc3MpIF9lbnYtPk5ld0dsb2JhbFJlZihPT01FQ2xhc3NMb2NhbCk7CisgICAgVU9FQ2xhc3MgPSAoamNsYXNzKSBfZW52LT5OZXdHbG9iYWxSZWYoVU9FQ2xhc3NMb2NhbCk7CisgICAgQUlPT0JFQ2xhc3MgPSAoamNsYXNzKSBfZW52LT5OZXdHbG9iYWxSZWYoQUlPT0JFQ2xhc3NMb2NhbCk7Cit9CisKK3N0YXRpYyB2b2lkICoKK2dldFBvaW50ZXIoSk5JRW52ICpfZW52LCBqb2JqZWN0IGJ1ZmZlciwgamFycmF5ICphcnJheSwgamludCAqcmVtYWluaW5nKQoreworICAgIGppbnQgcG9zaXRpb247CisgICAgamludCBsaW1pdDsKKyAgICBqaW50IGVsZW1lbnRTaXplU2hpZnQ7CisgICAgamxvbmcgcG9pbnRlcjsKKyAgICBqaW50IG9mZnNldDsKKyAgICB2b2lkICpkYXRhOworCisgICAgcG9zaXRpb24gPSBfZW52LT5HZXRJbnRGaWVsZChidWZmZXIsIHBvc2l0aW9uSUQpOworICAgIGxpbWl0ID0gX2Vudi0+R2V0SW50RmllbGQoYnVmZmVyLCBsaW1pdElEKTsKKyAgICBlbGVtZW50U2l6ZVNoaWZ0ID0gX2Vudi0+R2V0SW50RmllbGQoYnVmZmVyLCBlbGVtZW50U2l6ZVNoaWZ0SUQpOworICAgICpyZW1haW5pbmcgPSAobGltaXQgLSBwb3NpdGlvbikgPDwgZWxlbWVudFNpemVTaGlmdDsKKyAgICBwb2ludGVyID0gX2Vudi0+Q2FsbFN0YXRpY0xvbmdNZXRob2QobmlvQWNjZXNzQ2xhc3MsCisgICAgICAgICAgICBnZXRCYXNlUG9pbnRlcklELCBidWZmZXIpOworICAgIGlmIChwb2ludGVyICE9IDBMKSB7CisgICAgICAgICphcnJheSA9IE5VTEw7CisgICAgICAgIHJldHVybiAodm9pZCAqKSAoamludCkgcG9pbnRlcjsKKyAgICB9CisgICAgCisgICAgKmFycmF5ID0gKGphcnJheSkgX2Vudi0+Q2FsbFN0YXRpY09iamVjdE1ldGhvZChuaW9BY2Nlc3NDbGFzcywKKyAgICAgICAgICAgIGdldEJhc2VBcnJheUlELCBidWZmZXIpOworICAgIG9mZnNldCA9IF9lbnYtPkNhbGxTdGF0aWNJbnRNZXRob2QobmlvQWNjZXNzQ2xhc3MsCisgICAgICAgICAgICBnZXRCYXNlQXJyYXlPZmZzZXRJRCwgYnVmZmVyKTsKKyAgICBkYXRhID0gX2Vudi0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbCgqYXJyYXksIChqYm9vbGVhbiAqKSAwKTsKKyAgICAKKyAgICByZXR1cm4gKHZvaWQgKikgKChjaGFyICopIGRhdGEgKyBvZmZzZXQpOworfQorCisKK3N0YXRpYyB2b2lkCityZWxlYXNlUG9pbnRlcihKTklFbnYgKl9lbnYsIGphcnJheSBhcnJheSwgdm9pZCAqZGF0YSwgamJvb2xlYW4gY29tbWl0KQoreworICAgIF9lbnYtPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGFycmF5LCBkYXRhLAorCQkJCQkgICBjb21taXQgPyAwIDogSk5JX0FCT1JUKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMSGVhZGVyLmphdmEtaWYgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0xIZWFkZXIuamF2YS1pZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjc4ZjNkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMSGVhZGVyLmphdmEtaWYKQEAgLTAsMCArMSwyMiBAQAorLyogLy9kZXZpY2UvamF2YS9hbmRyb2lkL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMLmphdmEKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwYWNrYWdlIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzOworCitwdWJsaWMgaW50ZXJmYWNlIEdMIHsKK30KKwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMSW1wbEhlYWRlci5qYXZhLWltcGwgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0xJbXBsSGVhZGVyLmphdmEtaW1wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjNhNDFjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMSW1wbEhlYWRlci5qYXZhLWltcGwKQEAgLTAsMCArMSw0OCBAQAorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8vIFRoaXMgc291cmNlIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKKworcGFja2FnZSBjb20uZ29vZ2xlLmFuZHJvaWQuZ2xlc19qbmk7CisKK2ltcG9ydCBqYXZhLm5pby5CdWZmZXI7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMDsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDEwRXh0OworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTE7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMUV4dDsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDExRXh0ZW5zaW9uUGFjazsKKworcHVibGljIGNsYXNzIEdMSW1wbCBpbXBsZW1lbnRzIEdMMTAsIEdMMTBFeHQsIEdMMTEsIEdMMTFFeHQsIEdMMTFFeHRlbnNpb25QYWNrIHsKKworICAgIC8vIFByaXZhdGUgYWNjZXNzb3JzIGZvciBuYXRpdmUgY29kZQorCisgICAgbmF0aXZlIHByaXZhdGUgc3RhdGljIHZvaWQgX25hdGl2ZUNsYXNzSW5pdCgpOworICAgIHN0YXRpYyB7CisJX25hdGl2ZUNsYXNzSW5pdCgpOworICAgIH0KKworICAgIEJ1ZmZlciBfY29sb3JQb2ludGVyID0gbnVsbDsKKyAgICBCdWZmZXIgX25vcm1hbFBvaW50ZXIgPSBudWxsOworICAgIEJ1ZmZlciBfdGV4Q29vcmRQb2ludGVyID0gbnVsbDsKKyAgICBCdWZmZXIgX3ZlcnRleFBvaW50ZXIgPSBudWxsOworCisgICAgcHVibGljIEdMSW1wbCgpIHsKKyAgICB9CisKKyAgICAgcHVibGljIHZvaWQgZ2xHZXRQb2ludGVydihpbnQgcG5hbWUsIGphdmEubmlvLkJ1ZmZlcltdIHBhcmFtcykgeworICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJnbEdldFBvaW50ZXJ2Iik7CisgICAgIH0KKwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsR2V0U3RyaW5nLmNwcCBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbEdldFN0cmluZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJlMTI5NwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbEdldFN0cmluZy5jcHAKQEAgLTAsMCArMSwxMCBAQAorI2luY2x1ZGUgPHN0cmluZy5oPg0KKw0KKy8qIGNvbnN0IEdMdWJ5dGUgKiBnbEdldFN0cmluZyAoIEdMZW51bSBuYW1lICkgKi8NCitqc3RyaW5nDQorYW5kcm9pZF9nbEdldFN0cmluZw0KKyAgKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBuYW1lKSB7DQorICAgIGNvbnN0IGNoYXIgKiBjaGFycyA9IChjb25zdCBjaGFyICopZ2xHZXRTdHJpbmcoKEdMZW51bSluYW1lKTsNCisgICAganN0cmluZyBvdXRwdXQgPSBfZW52LT5OZXdTdHJpbmdVVEYoY2hhcnMpOw0KKyAgICByZXR1cm4gb3V0cHV0Ow0KK30NCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xHZXRTdHJpbmcuamF2YS0xMC1pZiBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbEdldFN0cmluZy5qYXZhLTEwLWlmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5OGZhYmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xHZXRTdHJpbmcuamF2YS0xMC1pZgpAQCAtMCwwICsxLDQgQEAKKyAgICBwdWJsaWMgU3RyaW5nIGdsR2V0U3RyaW5nKA0KKyAgICAgICAgaW50IG5hbWUNCisgICAgKTsNCisNCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xHZXRTdHJpbmcuamF2YS1pZiBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbEdldFN0cmluZy5qYXZhLWlmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5OGZhYmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xHZXRTdHJpbmcuamF2YS1pZgpAQCAtMCwwICsxLDQgQEAKKyAgICBwdWJsaWMgU3RyaW5nIGdsR2V0U3RyaW5nKA0KKyAgICAgICAgaW50IG5hbWUNCisgICAgKTsNCisNCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xHZXRTdHJpbmcuamF2YS1pbXBsIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsR2V0U3RyaW5nLmphdmEtaW1wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Yzc4ODFjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsR2V0U3RyaW5nLmphdmEtaW1wbApAQCAtMCwwICsxLDE2IEBACisgICAgLy8gQyBmdW5jdGlvbiBjb25zdCBHTHVieXRlICogZ2xHZXRTdHJpbmcgKCBHTGVudW0gbmFtZSApDQorDQorICAgIHB1YmxpYyBuYXRpdmUgU3RyaW5nIF9nbEdldFN0cmluZygNCisgICAgICAgIGludCBuYW1lDQorICAgICk7DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2xHZXRTdHJpbmcoDQorICAgICAgICBpbnQgbmFtZQ0KKyAgICApIHsNCisgICAgICAgIFN0cmluZyByZXR1cm5WYWx1ZTsNCisgICAgICAgIHJldHVyblZhbHVlID0gX2dsR2V0U3RyaW5nKA0KKyAgICAgICAgICAgIG5hbWUNCisgICAgICAgICk7DQorICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7DQorICAgIH0NCisNCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xHZXRTdHJpbmcubmF0aXZlUmVnIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsR2V0U3RyaW5nLm5hdGl2ZVJlZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjQxODdjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsR2V0U3RyaW5nLm5hdGl2ZVJlZwpAQCAtMCwwICsxIEBACit7Il9nbEdldFN0cmluZyIsICIoSSlMamF2YS9sYW5nL1N0cmluZzsiLCAodm9pZCAqKSBhbmRyb2lkX2dsR2V0U3RyaW5nIH0sDQo=