ZGlmZiAtLWdpdCBhL2JvYXJkL2NlcmYyNTAvTWFrZWZpbGUgYi9ib2FyZC9jZXJmMjUwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhYjk3ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9jZXJmMjUwL01ha2VmaWxlCkBAIC0wLDAgKzEsNDcgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAwCisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSBsaWIkKEJPQVJEKS5hCisKK09CSlMJOj0gY2VyZjI1MC5vIGZsYXNoLm8KK1NPQkpTCTo9IG1lbXNldHVwLm8KKworJChMSUIpOgkkKE9CSlMpICQoU09CSlMpCisJJChBUikgY3J2ICRAICQoT0JKUykgJChTT0JKUykKKworY2xlYW46CisJcm0gLWYgJChTT0JKUykgJChPQkpTKQorCitkaXN0Y2xlYW46CWNsZWFuCisJcm0gLWYgJChMSUIpIGNvcmUgKi5iYWsgLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKy5kZXBlbmQ6CU1ha2VmaWxlICQoU09CSlM6Lm89LlMpICQoT0JKUzoubz0uYykKKwkJJChDQykgLU0gJChDUFBGTEFHUykgJChTT0JKUzoubz0uUykgJChPQkpTOi5vPS5jKSA+ICRACisKKy1pbmNsdWRlIC5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvYm9hcmQvY2VyZjI1MC9jZXJmMjUwLmMgYi9ib2FyZC9jZXJmMjUwL2NlcmYyNTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Mzc0NWI0Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvY2VyZjI1MC9jZXJmMjUwLmMKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogS3lsZSBIYXJyaXMsIE5leHVzIFRlY2hub2xvZ2llcywgSW5jLiBraGFycmlzQG5leHVzLXRlY2gubmV0CisgKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBTeXNnbyBSZWFsLVRpbWUgU29sdXRpb25zLCBHbWJIIDx3d3cuZWxpbm9zLmNvbT4KKyAqIE1hcml1cyBHcm9lZ2VyIDxtZ3JvZWdlckBzeXNnby5kZT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvKgorICogTWlzY2VsYW5lb3VzIHBsYXRmb3JtIGRlcGVuZGVudCBpbml0aWFsaXNhdGlvbnMKKyAqLworCitpbnQgYm9hcmRfaW5pdCAodm9pZCkKK3sKKwlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworCS8qIG1lbW9yeSBhbmQgY3B1LXNwZWVkIGFyZSBzZXR1cCBiZWZvcmUgcmVsb2NhdGlvbiAqLworCS8qIHNvIHdlIGRvIF9ub3RoaW5nXyBoZXJlICovCisKKwkvKiBhcmNoIG51bWJlciBvZiBjZXJmIFBYQSBCb2FyZCAqLworCWdkLT5iZC0+YmlfYXJjaF9udW1iZXIgPSAxMzk7CisKKwkvKiBhZHJlc3Mgb2YgYm9vdCBwYXJhbWV0ZXJzICovCisJZ2QtPmJkLT5iaV9ib290X3BhcmFtcyA9IDB4YTAwMDAxMDA7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGJvYXJkX2xhdGVfaW5pdCh2b2lkKQoreworCXNldGVudigic3Rkb3V0IiwgInNlcmlhbCIpOworCXNldGVudigic3RkZXJyIiwgInNlcmlhbCIpOworCXJldHVybiAwOworfQorCisKK2ludCBkcmFtX2luaXQgKHZvaWQpCit7CisJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKwlnZC0+YmQtPmJpX2RyYW1bMF0uc3RhcnQgPSBQSFlTX1NEUkFNXzE7CisJZ2QtPmJkLT5iaV9kcmFtWzBdLnNpemUgPSBQSFlTX1NEUkFNXzFfU0laRTsKKwlnZC0+YmQtPmJpX2RyYW1bMV0uc3RhcnQgPSBQSFlTX1NEUkFNXzI7CisJZ2QtPmJkLT5iaV9kcmFtWzFdLnNpemUgPSBQSFlTX1NEUkFNXzJfU0laRTsKKwlnZC0+YmQtPmJpX2RyYW1bMl0uc3RhcnQgPSBQSFlTX1NEUkFNXzM7CisJZ2QtPmJkLT5iaV9kcmFtWzJdLnNpemUgPSBQSFlTX1NEUkFNXzNfU0laRTsKKwlnZC0+YmQtPmJpX2RyYW1bM10uc3RhcnQgPSBQSFlTX1NEUkFNXzQ7CisJZ2QtPmJkLT5iaV9kcmFtWzNdLnNpemUgPSBQSFlTX1NEUkFNXzRfU0laRTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvY2VyZjI1MC9jb25maWcubWsgYi9ib2FyZC9jZXJmMjUwL2NvbmZpZy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTg2Y2M5Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvY2VyZjI1MC9jb25maWcubWsKQEAgLTAsMCArMSw1IEBACisjCisjIENlcmYgYm9hcmQgd2l0aCBQWEEyNTAgY3B1CisjCisjCitURVhUX0JBU0UgPSAweGEzMDgwMDAwCmRpZmYgLS1naXQgYS9ib2FyZC9jZXJmMjUwL2ZsYXNoLmMgYi9ib2FyZC9jZXJmMjUwL2ZsYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE4Mjg5MgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2NlcmYyNTAvZmxhc2guYwpAQCAtMCwwICsxLDQzMSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMQorICogS3lsZSBIYXJyaXMsIE5leHVzIFRlY2hub2xvZ2llcywgSW5jLiBraGFycmlzQG5leHVzLXRlY2gubmV0CisgKgorICogKEMpIENvcHlyaWdodCAyMDAxCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvc3dhYi5oPgorCisKK2ZsYXNoX2luZm9fdCBmbGFzaF9pbmZvW0NGR19NQVhfRkxBU0hfQkFOS1NdOwkvKiBpbmZvIGZvciBGTEFTSCBjaGlwcyAgICAqLworCisvKiBCb2FyZCBzdXBwb3J0IGZvciAxIG9yIDIgZmxhc2ggZGV2aWNlcyAqLworI2RlZmluZSBGTEFTSF9QT1JUX1dJRFRIMzIKKyN1bmRlZiBGTEFTSF9QT1JUX1dJRFRIMTYKKworI2lmZGVmIEZMQVNIX1BPUlRfV0lEVEgxNgorI2RlZmluZSBGTEFTSF9QT1JUX1dJRFRICQl1c2hvcnQKKyNkZWZpbmUgRkxBU0hfUE9SVF9XSURUSFYJCXZ1X3Nob3J0CisjZGVmaW5lIFNXQVAoeCkgICAgICAgICAgICAgICBfX3N3YWIxNih4KQorI2Vsc2UKKyNkZWZpbmUgRkxBU0hfUE9SVF9XSURUSAkJdWxvbmcKKyNkZWZpbmUgRkxBU0hfUE9SVF9XSURUSFYJCXZ1X2xvbmcKKyNkZWZpbmUgU1dBUCh4KSAgICAgICAgICAgICAgIF9fc3dhYjMyKHgpCisjZW5kaWYKKworI2RlZmluZSBGUFcJICAgRkxBU0hfUE9SVF9XSURUSAorI2RlZmluZSBGUFdWICAgRkxBU0hfUE9SVF9XSURUSFYKKworI2RlZmluZSBtYigpIF9fYXNtX18gX192b2xhdGlsZV9fICgiIiA6IDogOiAibWVtb3J5IikKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb25zCisgKi8KK3N0YXRpYyB1bG9uZyBmbGFzaF9nZXRfc2l6ZSAoRlBXICphZGRyLCBmbGFzaF9pbmZvX3QgKmluZm8pOworc3RhdGljIGludCB3cml0ZV9kYXRhIChmbGFzaF9pbmZvX3QgKmluZm8sIHVsb25nIGRlc3QsIEZQVyBkYXRhKTsKK3N0YXRpYyB2b2lkIGZsYXNoX2dldF9vZmZzZXRzICh1bG9uZyBiYXNlLCBmbGFzaF9pbmZvX3QgKmluZm8pOwordm9pZCBpbmxpbmUgc3Bpbl93aGVlbCAodm9pZCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCit1bnNpZ25lZCBsb25nIGZsYXNoX2luaXQgKHZvaWQpCit7CisJaW50IGk7CisJdWxvbmcgc2l6ZSA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgQ0ZHX01BWF9GTEFTSF9CQU5LUzsgaSsrKSB7CisJCXN3aXRjaCAoaSkgeworCQljYXNlIDA6CisJCQlmbGFzaF9nZXRfc2l6ZSAoKEZQVyAqKSBQSFlTX0ZMQVNIXzEsICZmbGFzaF9pbmZvW2ldKTsKKwkJCWZsYXNoX2dldF9vZmZzZXRzIChQSFlTX0ZMQVNIXzEsICZmbGFzaF9pbmZvW2ldKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlmbGFzaF9nZXRfc2l6ZSAoKEZQVyAqKSBQSFlTX0ZMQVNIXzIsICZmbGFzaF9pbmZvW2ldKTsKKwkJCWZsYXNoX2dldF9vZmZzZXRzIChQSFlTX0ZMQVNIXzIsICZmbGFzaF9pbmZvW2ldKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcGFuaWMgKCJjb25maWd1cmVkIHRvbyBtYW55IGZsYXNoIGJhbmtzIVxuIik7CisJCQlicmVhazsKKwkJfQorCQlzaXplICs9IGZsYXNoX2luZm9baV0uc2l6ZTsKKwl9CisKKwkvKiBQcm90ZWN0IG1vbml0b3IgYW5kIGVudmlyb25tZW50IHNlY3RvcnMKKwkgKi8KKwlmbGFzaF9wcm90ZWN0ICggRkxBR19QUk9URUNUX1NFVCwKKwkJCUNGR19GTEFTSF9CQVNFLAorCQkJQ0ZHX0ZMQVNIX0JBU0UgKyBtb25pdG9yX2ZsYXNoX2xlbiAtIDEsCisJCQkmZmxhc2hfaW5mb1swXSApOworCisJZmxhc2hfcHJvdGVjdCAoIEZMQUdfUFJPVEVDVF9TRVQsCisJCQlDRkdfRU5WX0FERFIsCisJCQlDRkdfRU5WX0FERFIgKyBDRkdfRU5WX1NJWkUgLSAxLCAmZmxhc2hfaW5mb1swXSApOworCisJcmV0dXJuIHNpemU7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RhdGljIHZvaWQgZmxhc2hfZ2V0X29mZnNldHMgKHVsb25nIGJhc2UsIGZsYXNoX2luZm9fdCAqaW5mbykKK3sKKwlpbnQgaTsKKworCWlmIChpbmZvLT5mbGFzaF9pZCA9PSBGTEFTSF9VTktOT1dOKSB7CisJCXJldHVybjsKKwl9CisKKwlpZiAoKGluZm8tPmZsYXNoX2lkICYgRkxBU0hfVkVORE1BU0spID09IEZMQVNIX01BTl9JTlRFTCkgeworCQlmb3IgKGkgPSAwOyBpIDwgaW5mby0+c2VjdG9yX2NvdW50OyBpKyspIHsKKwkJCWluZm8tPnN0YXJ0W2ldID0gYmFzZSArIChpICogUEhZU19GTEFTSF9TRUNUX1NJWkUpOworCQkJaW5mby0+cHJvdGVjdFtpXSA9IDA7CisJCX0KKwl9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwordm9pZCBmbGFzaF9wcmludF9pbmZvIChmbGFzaF9pbmZvX3QgKmluZm8pCit7CisJaW50IGk7CisKKwlpZiAoaW5mby0+Zmxhc2hfaWQgPT0gRkxBU0hfVU5LTk9XTikgeworCQlwcmludGYgKCJtaXNzaW5nIG9yIHVua25vd24gRkxBU0ggdHlwZVxuIik7CisJCXJldHVybjsKKwl9CisKKwlzd2l0Y2ggKGluZm8tPmZsYXNoX2lkICYgRkxBU0hfVkVORE1BU0spIHsKKwljYXNlIEZMQVNIX01BTl9JTlRFTDoKKwkJcHJpbnRmICgiSU5URUwgIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ZiAoIlVua25vd24gVmVuZG9yICIpOworCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKGluZm8tPmZsYXNoX2lkICYgRkxBU0hfVFlQRU1BU0spIHsKKwljYXNlIEZMQVNIXzI4RjEyOEozQToKKwkJcHJpbnRmICgiMjhGMTI4SjNBXG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRmICgiVW5rbm93biBDaGlwIFR5cGVcbiIpOworCQlicmVhazsKKwl9CisKKwlwcmludGYgKCIgIFNpemU6ICVsZCBNQiBpbiAlZCBTZWN0b3JzXG4iLAorCQkJaW5mby0+c2l6ZSA+PiAyMCwgaW5mby0+c2VjdG9yX2NvdW50KTsKKworCXByaW50ZiAoIiAgU2VjdG9yIFN0YXJ0IEFkZHJlc3NlczoiKTsKKwlmb3IgKGkgPSAwOyBpIDwgaW5mby0+c2VjdG9yX2NvdW50OyArK2kpIHsKKwkJaWYgKChpICUgNSkgPT0gMCkKKwkJCXByaW50ZiAoIlxuICAgIik7CisJCXByaW50ZiAoIiAlMDhsWCVzIiwKKwkJCWluZm8tPnN0YXJ0W2ldLAorCQkJaW5mby0+cHJvdGVjdFtpXSA/ICIgKFJPKSIgOiAiICAgICAiKTsKKwl9CisJcHJpbnRmICgiXG4iKTsKKwlyZXR1cm47Cit9CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGNvZGUgY2Fubm90IGJlIHJ1biBmcm9tIEZMQVNIIQorICovCitzdGF0aWMgdWxvbmcgZmxhc2hfZ2V0X3NpemUgKEZQVyAqYWRkciwgZmxhc2hfaW5mb190ICppbmZvKQoreworCXZvbGF0aWxlIEZQVyB2YWx1ZTsKKworCS8qIFdyaXRlIGF1dG8gc2VsZWN0IGNvbW1hbmQ6IHJlYWQgTWFudWZhY3R1cmVyIElEICovCisJYWRkclsweDU1NTVdID0gKEZQVykgMHgwMEFBMDBBQTsKKwlhZGRyWzB4MkFBQV0gPSAoRlBXKSAweDAwNTUwMDU1OworCWFkZHJbMHg1NTU1XSA9IChGUFcpIDB4MDA5MDAwOTA7CisKKwltYiAoKTsKKwl2YWx1ZSA9IGFkZHJbMF07CisKKwlzd2l0Y2ggKHZhbHVlKSB7CisKKwljYXNlIChGUFcpIElOVEVMX01BTlVGQUNUOgorCQlpbmZvLT5mbGFzaF9pZCA9IEZMQVNIX01BTl9JTlRFTDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlpbmZvLT5mbGFzaF9pZCA9IEZMQVNIX1VOS05PV047CisJCWluZm8tPnNlY3Rvcl9jb3VudCA9IDA7CisJCWluZm8tPnNpemUgPSAwOworCQlhZGRyWzBdID0gKEZQVykgMHgwMEZGMDBGRjsJLyogcmVzdG9yZSByZWFkIG1vZGUgKi8KKwkJcmV0dXJuICgwKTsJCQkvKiBubyBvciB1bmtub3duIGZsYXNoICAqLworCX0KKworCW1iICgpOworCXZhbHVlID0gYWRkclsxXTsJCQkvKiBkZXZpY2UgSUQgICAgICAgICovCisKKwlzd2l0Y2ggKHZhbHVlKSB7CisKKwljYXNlIChGUFcpIElOVEVMX0lEXzI4RjEyOEozQToKKwkJaW5mby0+Zmxhc2hfaWQgKz0gRkxBU0hfMjhGMTI4SjNBOworCQlpbmZvLT5zZWN0b3JfY291bnQgPSAxMjg7CisJCWluZm8tPnNpemUgPSAweDAyMDAwMDAwOworCQlicmVhazsJCQkJLyogPT4gMTYgTUIgICAgICovCisKKwlkZWZhdWx0OgorCQlpbmZvLT5mbGFzaF9pZCA9IEZMQVNIX1VOS05PV047CisJCWJyZWFrOworCX0KKworCWlmIChpbmZvLT5zZWN0b3JfY291bnQgPiBDRkdfTUFYX0ZMQVNIX1NFQ1QpIHsKKwkJcHJpbnRmICgiKiogRVJST1I6IHNlY3RvciBjb3VudCAlZCA+IG1heCAoJWQpICoqXG4iLAorCQkJaW5mby0+c2VjdG9yX2NvdW50LCBDRkdfTUFYX0ZMQVNIX1NFQ1QpOworCQlpbmZvLT5zZWN0b3JfY291bnQgPSBDRkdfTUFYX0ZMQVNIX1NFQ1Q7CisJfQorCisJYWRkclswXSA9IChGUFcpIDB4MDBGRjAwRkY7CQkvKiByZXN0b3JlIHJlYWQgbW9kZSAqLworCisJcmV0dXJuIChpbmZvLT5zaXplKTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworaW50IGZsYXNoX2VyYXNlIChmbGFzaF9pbmZvX3QgKmluZm8sIGludCBzX2ZpcnN0LCBpbnQgc19sYXN0KQoreworCWludCBmbGFnLCBwcm90LCBzZWN0OworCXVsb25nIHR5cGUsIHN0YXJ0LCBsYXN0OworCWludCByY29kZSA9IDA7CisKKwlpZiAoKHNfZmlyc3QgPCAwKSB8fCAoc19maXJzdCA+IHNfbGFzdCkpIHsKKwkJaWYgKGluZm8tPmZsYXNoX2lkID09IEZMQVNIX1VOS05PV04pIHsKKwkJCXByaW50ZiAoIi0gbWlzc2luZ1xuIik7CisJCX0gZWxzZSB7CisJCQlwcmludGYgKCItIG5vIHNlY3RvcnMgdG8gZXJhc2VcbiIpOworCQl9CisJCXJldHVybiAxOworCX0KKworCXR5cGUgPSAoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9WRU5ETUFTSyk7CisJaWYgKCh0eXBlICE9IEZMQVNIX01BTl9JTlRFTCkpIHsKKwkJcHJpbnRmICgiQ2FuJ3QgZXJhc2UgdW5rbm93biBmbGFzaCB0eXBlICUwOGx4IC0gYWJvcnRlZFxuIiwKKwkJCWluZm8tPmZsYXNoX2lkKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcHJvdCA9IDA7CisJZm9yIChzZWN0ID0gc19maXJzdDsgc2VjdCA8PSBzX2xhc3Q7ICsrc2VjdCkgeworCQlpZiAoaW5mby0+cHJvdGVjdFtzZWN0XSkgeworCQkJcHJvdCsrOworCQl9CisJfQorCisJaWYgKHByb3QpIHsKKwkJcHJpbnRmICgiLSBXYXJuaW5nOiAlZCBwcm90ZWN0ZWQgc2VjdG9ycyB3aWxsIG5vdCBiZSBlcmFzZWQhXG4iLAorCQkJcHJvdCk7CisJfSBlbHNlIHsKKwkJcHJpbnRmICgiXG4iKTsKKwl9CisKKwlzdGFydCA9IGdldF90aW1lciAoMCk7CisJbGFzdCA9IHN0YXJ0OworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIHdoaWNoIG1pZ2h0IGNhdXNlIGEgdGltZW91dCBoZXJlICovCisJZmxhZyA9IGRpc2FibGVfaW50ZXJydXB0cyAoKTsKKworCS8qIFN0YXJ0IGVyYXNlIG9uIHVucHJvdGVjdGVkIHNlY3RvcnMgKi8KKwlmb3IgKHNlY3QgPSBzX2ZpcnN0OyBzZWN0IDw9IHNfbGFzdDsgc2VjdCsrKSB7CisJCWlmIChpbmZvLT5wcm90ZWN0W3NlY3RdID09IDApIHsJLyogbm90IHByb3RlY3RlZCAqLworCQkJRlBXViAqYWRkciA9IChGUFdWICopIChpbmZvLT5zdGFydFtzZWN0XSk7CisJCQlGUFcgc3RhdHVzOworCisJCQlwcmludGYgKCJFcmFzaW5nIHNlY3RvciAlMmQgLi4uICIsIHNlY3QpOworCisJCQkvKiBhcm0gc2ltcGxlLCBub24gaW50ZXJydXB0IGRlcGVuZGVudCB0aW1lciAqLworCQkJcmVzZXRfdGltZXJfbWFza2VkICgpOworCisJCQkqYWRkciA9IChGUFcpIDB4MDA1MDAwNTA7CS8qIGNsZWFyIHN0YXR1cyByZWdpc3RlciAqLworCQkJKmFkZHIgPSAoRlBXKSAweDAwMjAwMDIwOwkvKiBlcmFzZSBzZXR1cCAqLworCQkJKmFkZHIgPSAoRlBXKSAweDAwRDAwMEQwOwkvKiBlcmFzZSBjb25maXJtICovCisKKwkJCXdoaWxlICgoKHN0YXR1cyA9ICphZGRyKSAmIChGUFcpIDB4MDA4MDAwODApICE9IChGUFcpIDB4MDA4MDAwODApIHsKKwkJCQlpZiAoZ2V0X3RpbWVyX21hc2tlZCAoKSA+IENGR19GTEFTSF9FUkFTRV9UT1VUKSB7CisJCQkJCXByaW50ZiAoIlRpbWVvdXRcbiIpOworCQkJCQkqYWRkciA9IChGUFcpIDB4MDBCMDAwQjA7CS8qIHN1c3BlbmQgZXJhc2UgICAgICovCisJCQkJCSphZGRyID0gKEZQVykgMHgwMEZGMDBGRjsJLyogcmVzZXQgdG8gcmVhZCBtb2RlICovCisJCQkJCXJjb2RlID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQkqYWRkciA9IDB4MDA1MDAwNTA7CS8qIGNsZWFyIHN0YXR1cyByZWdpc3RlciBjbWQuICAgKi8KKwkJCSphZGRyID0gMHgwMEZGMDBGRjsJLyogcmVzZXN0IHRvIHJlYWQgbW9kZSAgICAgICAgICAqLworCisJCQlwcmludGYgKCIgZG9uZVxuIik7CisJCX0KKwl9CisJcmV0dXJuIHJjb2RlOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5IG1lbW9yeSB0byBmbGFzaCwgcmV0dXJuczoKKyAqIDAgLSBPSworICogMSAtIHdyaXRlIHRpbWVvdXQKKyAqIDIgLSBGbGFzaCBub3QgZXJhc2VkCisgKiA0IC0gRmxhc2ggbm90IGlkZW50aWZpZWQKKyAqLworCitpbnQgd3JpdGVfYnVmZiAoZmxhc2hfaW5mb190ICppbmZvLCB1Y2hhciAqc3JjLCB1bG9uZyBhZGRyLCB1bG9uZyBjbnQpCit7CisJdWxvbmcgY3AsIHdwOworCUZQVyBkYXRhOworCWludCBjb3VudCwgaSwgbCwgcmMsIHBvcnRfd2lkdGg7CisKKwlpZiAoaW5mby0+Zmxhc2hfaWQgPT0gRkxBU0hfVU5LTk9XTikgeworCQlyZXR1cm4gNDsKKwl9CisvKiBnZXQgbG93ZXIgd29yZCBhbGlnbmVkIGFkZHJlc3MgKi8KKyNpZmRlZiBGTEFTSF9QT1JUX1dJRFRIMTYKKwl3cCA9IChhZGRyICYgfjEpOworCXBvcnRfd2lkdGggPSAyOworI2Vsc2UKKwl3cCA9IChhZGRyICYgfjMpOworCXBvcnRfd2lkdGggPSA0OworI2VuZGlmCisKKwkvKgorCSAqIGhhbmRsZSB1bmFsaWduZWQgc3RhcnQgYnl0ZXMKKwkgKi8KKwlpZiAoKGwgPSBhZGRyIC0gd3ApICE9IDApIHsKKwkJZGF0YSA9IDA7CisJCWZvciAoaSA9IDAsIGNwID0gd3A7IGkgPCBsOyArK2ksICsrY3ApIHsKKwkJCWRhdGEgPSAoZGF0YSA8PCA4KSB8ICgqKHVjaGFyICopIGNwKTsKKwkJfQorCQlmb3IgKDsgaSA8IHBvcnRfd2lkdGggJiYgY250ID4gMDsgKytpKSB7CisJCQlkYXRhID0gKGRhdGEgPDwgOCkgfCAqc3JjKys7CisJCQktLWNudDsKKwkJCSsrY3A7CisJCX0KKwkJZm9yICg7IGNudCA9PSAwICYmIGkgPCBwb3J0X3dpZHRoOyArK2ksICsrY3ApIHsKKwkJCWRhdGEgPSAoZGF0YSA8PCA4KSB8ICgqKHVjaGFyICopIGNwKTsKKwkJfQorCisJCWlmICgocmMgPSB3cml0ZV9kYXRhIChpbmZvLCB3cCwgU1dBUCAoZGF0YSkpKSAhPSAwKSB7CisJCQlyZXR1cm4gKHJjKTsKKwkJfQorCQl3cCArPSBwb3J0X3dpZHRoOworCX0KKworCS8qCisJICogaGFuZGxlIHdvcmQgYWxpZ25lZCBwYXJ0CisJICovCisJY291bnQgPSAwOworCXdoaWxlIChjbnQgPj0gcG9ydF93aWR0aCkgeworCQlkYXRhID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IHBvcnRfd2lkdGg7ICsraSkgeworCQkJZGF0YSA9IChkYXRhIDw8IDgpIHwgKnNyYysrOworCQl9CisJCWlmICgocmMgPSB3cml0ZV9kYXRhIChpbmZvLCB3cCwgU1dBUCAoZGF0YSkpKSAhPSAwKSB7CisJCQlyZXR1cm4gKHJjKTsKKwkJfQorCQl3cCArPSBwb3J0X3dpZHRoOworCQljbnQgLT0gcG9ydF93aWR0aDsKKwkJaWYgKGNvdW50KysgPiAweDgwMCkgeworCQkJc3Bpbl93aGVlbCAoKTsKKwkJCWNvdW50ID0gMDsKKwkJfQorCX0KKworCWlmIChjbnQgPT0gMCkgeworCQlyZXR1cm4gKDApOworCX0KKworCS8qCisJICogaGFuZGxlIHVuYWxpZ25lZCB0YWlsIGJ5dGVzCisJICovCisJZGF0YSA9IDA7CisJZm9yIChpID0gMCwgY3AgPSB3cDsgaSA8IHBvcnRfd2lkdGggJiYgY250ID4gMDsgKytpLCArK2NwKSB7CisJCWRhdGEgPSAoZGF0YSA8PCA4KSB8ICpzcmMrKzsKKwkJLS1jbnQ7CisJfQorCWZvciAoOyBpIDwgcG9ydF93aWR0aDsgKytpLCArK2NwKSB7CisJCWRhdGEgPSAoZGF0YSA8PCA4KSB8ICgqKHVjaGFyICopIGNwKTsKKwl9CisKKwlyZXR1cm4gKHdyaXRlX2RhdGEgKGluZm8sIHdwLCBTV0FQIChkYXRhKSkpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBXcml0ZSBhIHdvcmQgb3IgaGFsZndvcmQgdG8gRmxhc2gsIHJldHVybnM6CisgKiAwIC0gT0sKKyAqIDEgLSB3cml0ZSB0aW1lb3V0CisgKiAyIC0gRmxhc2ggbm90IGVyYXNlZAorICovCitzdGF0aWMgaW50IHdyaXRlX2RhdGEgKGZsYXNoX2luZm9fdCAqaW5mbywgdWxvbmcgZGVzdCwgRlBXIGRhdGEpCit7CisJRlBXViAqYWRkciA9IChGUFdWICopIGRlc3Q7CisJdWxvbmcgc3RhdHVzOworCWludCBmbGFnOworCisJLyogQ2hlY2sgaWYgRmxhc2ggaXMgKHN1ZmZpY2llbnRseSkgZXJhc2VkICovCisJaWYgKCgqYWRkciAmIGRhdGEpICE9IGRhdGEpIHsKKwkJcHJpbnRmICgibm90IGVyYXNlZCBhdCAlMDhseCAoJWx4KVxuIiwgKHVsb25nKSBhZGRyLCAqYWRkcik7CisJCXJldHVybiAoMik7CisJfQorCS8qIERpc2FibGUgaW50ZXJydXB0cyB3aGljaCBtaWdodCBjYXVzZSBhIHRpbWVvdXQgaGVyZSAqLworCWZsYWcgPSBkaXNhYmxlX2ludGVycnVwdHMgKCk7CisKKwkqYWRkciA9IChGUFcpIDB4MDA0MDAwNDA7CS8qIHdyaXRlIHNldHVwICovCisJKmFkZHIgPSBkYXRhOworCisJLyogYXJtIHNpbXBsZSwgbm9uIGludGVycnVwdCBkZXBlbmRlbnQgdGltZXIgKi8KKwlyZXNldF90aW1lcl9tYXNrZWQgKCk7CisKKwkvKiB3YWl0IHdoaWxlIHBvbGxpbmcgdGhlIHN0YXR1cyByZWdpc3RlciAqLworCXdoaWxlICgoKHN0YXR1cyA9ICphZGRyKSAmIChGUFcpIDB4MDA4MDAwODApICE9IChGUFcpIDB4MDA4MDAwODApIHsKKwkJaWYgKGdldF90aW1lcl9tYXNrZWQgKCkgPiBDRkdfRkxBU0hfV1JJVEVfVE9VVCkgeworCQkJKmFkZHIgPSAoRlBXKSAweDAwRkYwMEZGOwkvKiByZXN0b3JlIHJlYWQgbW9kZSAqLworCQkJcmV0dXJuICgxKTsKKwkJfQorCX0KKworCSphZGRyID0gKEZQVykgMHgwMEZGMDBGRjsJLyogcmVzdG9yZSByZWFkIG1vZGUgKi8KKworCXJldHVybiAoMCk7Cit9CisKK3ZvaWQgaW5saW5lIHNwaW5fd2hlZWwgKHZvaWQpCit7CisJc3RhdGljIGludCBwID0gMDsKKwlzdGF0aWMgY2hhciB3W10gPSAiXFwvLSI7CisKKwlwcmludGYgKCJcMDEwJWMiLCB3W3BdKTsKKwkoKytwID09IDMpID8gKHAgPSAwKSA6IDA7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9jZXJmMjUwL21lbXNldHVwLlMgYi9ib2FyZC9jZXJmMjUwL21lbXNldHVwLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNkMzczYQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2NlcmYyNTAvbWVtc2V0dXAuUwpAQCAtMCwwICsxLDQxMSBAQAorLyoKKyAqIE1vc3Qgb2YgdGhpcyB0YWtlbiBmcm9tIFJlZGJvb3QgaGFsX3BsYXRmb3JtX3NldHVwLmggd2l0aCBjbGVhbnVwCisgKgorICogTk9URTogSSBoYXZlbid0IGNsZWFuIHRoaXMgdXAgY29uc2lkZXJhYmx5LCBqdXN0IGVub3VnaCB0byBnZXQgaXQKKyAqIHJ1bm5pbmcuIFNlZSBoYWxfcGxhdGZvcm1fc2V0dXAuaCBmb3IgdGhlIHNvdXJjZS4gU2VlCisgKiBib2FyZC9jcmFkbGUvbWVtc2V0dXAuUyBmb3IgYW5vdGhlciBQWEEyNTAgc2V0dXAgdGhhdCBpcworICogbXVjaCBjbGVhbmVyLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDx2ZXJzaW9uLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcHhhLXJlZ3MuaD4KKworRFJBTV9TSVpFOiAgLmxvbmcgICBDRkdfRFJBTV9TSVpFCisKKy8qIHdhaXQgZm9yIGNvcHJvY2Vzc29yIHdyaXRlIGNvbXBsZXRlICovCisgICAubWFjcm8gQ1BXQUlUIHJlZworICAgbXJjICBwMTUsMCxccmVnLGMyLGMwLDAKKyAgIG1vdiAgXHJlZyxccmVnCisgICBzdWIgIHBjLHBjLCM0CisgICAuZW5kbQorCisKKy8qCisgKiAJTWVtb3J5IHNldHVwCisgKi8KKworLmdsb2JsIG1lbXNldHVwCittZW1zZXR1cDoKKworCS8qIFNldCB1cCBHUElPIHBpbnMgZmlyc3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCWxkcgkJcjAsCT1HUFNSMAorCWxkcgkJcjEsCT1DRkdfR1BTUjBfVkFMCisJc3RyCQlyMSwJW3IwXQorCisJbGRyCQlyMCwJPUdQU1IxCisJbGRyCQlyMSwJPUNGR19HUFNSMV9WQUwKKwlzdHIJCXIxLCAgW3IwXQorCisJbGRyCQlyMCwJPUdQU1IyCisJbGRyCQlyMSwJPUNGR19HUFNSMl9WQUwKKwlzdHIJCXIxLAlbcjBdCisKKwlsZHIJCXIwLAk9R1BDUjAKKwlsZHIJCXIxLAk9Q0ZHX0dQQ1IwX1ZBTAorCXN0cgkJcjEsCVtyMF0KKworCWxkcgkJcjAsCT1HUENSMQorCWxkcgkJcjEsCT1DRkdfR1BDUjFfVkFMCisJc3RyCQlyMSwJW3IwXQorCisJbGRyCQlyMCwJPUdQQ1IyCisJbGRyCQlyMSwJPUNGR19HUENSMl9WQUwKKwlzdHIJCXIxLAlbcjBdCisKKwlsZHIJCXIwLAk9R1BEUjAKKwlsZHIJCXIxLAk9Q0ZHX0dQRFIwX1ZBTAorCXN0cgkJcjEsCVtyMF0KKworCWxkcgkJcjAsCT1HUERSMQorCWxkcgkJcjEsCT1DRkdfR1BEUjFfVkFMCisJc3RyCQlyMSwJW3IwXQorCisJbGRyCQlyMCwJPUdQRFIyCisJbGRyCQlyMSwJPUNGR19HUERSMl9WQUwKKwlzdHIJCXIxLAlbcjBdCisKKwlsZHIJCXIwLAk9R0FGUjBfTAorCWxkcgkJcjEsCT1DRkdfR0FGUjBfTF9WQUwKKwlzdHIJCXIxLAlbcjBdCisKKwlsZHIJCXIwLAk9R0FGUjBfVQorCWxkcgkJcjEsCT1DRkdfR0FGUjBfVV9WQUwKKwlzdHIJCXIxLAlbcjBdCisKKwlsZHIJCXIwLAk9R0FGUjFfTAorCWxkcgkJcjEsCT1DRkdfR0FGUjFfTF9WQUwKKwlzdHIJCXIxLAlbcjBdCisKKwlsZHIJCXIwLAk9R0FGUjFfVQorCWxkcgkJcjEsCT1DRkdfR0FGUjFfVV9WQUwKKwlzdHIJCXIxLAlbcjBdCisKKwlsZHIJCXIwLAk9R0FGUjJfTAorCWxkcgkJcjEsCT1DRkdfR0FGUjJfTF9WQUwKKwlzdHIJCXIxLAlbcjBdCisKKwlsZHIJCXIwLAk9R0FGUjJfVQorCWxkcgkJcjEsCT1DRkdfR0FGUjJfVV9WQUwKKwlzdHIJCXIxLAlbcjBdCisKKwlsZHIJCXIwLAk9UFNTUgkJCQkvKiBlbmFibGUgR1BJTyBwaW5zICovCisJbGRyCQlyMSwJPUNGR19QU1NSX1ZBTAorCXN0cgkJcjEsCVtyMF0KKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvKiBFbmFibGUgbWVtb3J5IGludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCS8qIFRoZSBzZXF1ZW5jZSBiZWxvdyBpcyBiYXNlZCBvbiB0aGUgcmVjb21tZW5kZWQgaW5pdCBzdGVwcyAgICAgICAgKi8KKwkvKiBkZXRhaWxlZCBpbiB0aGUgSW50ZWwgUFhBMjUwIE9wZXJhdGluZyBTeXN0ZW1zIERldmVsb3BlcnMgR3VpZGUsICovCisJLyogQ2hhcHRlciAxMC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvKiBTdGVwIDE6IFdhaXQgZm9yIGF0IGxlYXN0IDIwMCBtaWNyb3NlZG9uZHMgdG8gYWxsb3cgaW50ZXJuYWwgICAgICovCisJLyogICAgICAgICBjbG9ja3MgdG8gc2V0dGxlLiBPbmx5IG5lY2Vzc2FyeSBhZnRlciBoYXJkIHJlc2V0Li4uICAgICAqLworCS8qICAgICAgICAgRklYTUU6IGNhbiBiZSBvcHRpbWl6ZWQgbGF0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwlsZHIJCXIzLAk9T1NDUgkJCS8qIHJlc2V0IHRoZSBPUyBUaW1lciBDb3VudCB0byB6ZXJvICovCisJbW92IAlyMiwJIzAKKwlzdHIgCXIyLAlbcjNdCisJbGRyIAlyNCwJPTB4MzAwCQkJCS8qIHJlYWxseSAweDJFMSBpcyBhYm91dCAyMDB1c2VjLCAgICovCisJCQkJCQkJLyogc28gMHgzMDAgc2hvdWxkIGJlIHBsZW50eSAgICAgICAgKi8KKzE6CisJbGRyIAlyMiwJW3IzXQorCWNtcCAJcjQsCXIyCisJYmd0IAkxYgorCittZW1faW5pdDoKKworCWxkciAgCXIxLAk9TUVNQ19CQVNFCQkvKiBnZXQgbWVtb3J5IGNvbnRyb2xsZXIgYmFzZSBhZGRyLiAqLworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS8qIFN0ZXAgMmE6IEluaXRpYWxpemUgQXN5bmNocm9ub3VzIHN0YXRpYyBtZW1vcnkgY29udHJvbGxlciAgICAgICAgKi8KKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkvKiBNU0MgcmVnaXN0ZXJzOiB0aW1pbmcsIGJ1cyB3aWR0aCwgbWVtIHR5cGUgICAgICAgICAgICAgICAgICAgICAgICovCisKKwkvKiBNU0MwOiBuQ1MoMCwxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJbGRyICAJcjIsCT1DRkdfTVNDMF9WQUwKKwlzdHIgIAlyMiwJW3IxLCAjTVNDMF9PRkZTRVRdCisJbGRyICAJcjIsCVtyMSwgI01TQzBfT0ZGU0VUXQkvKiByZWFkIGJhY2sgdG8gZW5zdXJlICAgICAgKi8KKwkJCQkJCS8qIHRoYXQgZGF0YSBsYXRjaGVzICAgICAgICAqLworCS8qIE1TQzE6IG5DUygyLDMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlsZHIgIAlyMiwJPUNGR19NU0MxX1ZBTAorCXN0ciAgCXIyLAlbcjEsICNNU0MxX09GRlNFVF0KKwlsZHIgIAlyMiwJW3IxLCAjTVNDMV9PRkZTRVRdCisKKwkvKiBNU0MyOiBuQ1MoNCw1KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJbGRyICAJcjIsCT1DRkdfTVNDMl9WQUwKKwlzdHIgIAlyMiwJW3IxLCAjTVNDMl9PRkZTRVRdCisJbGRyICAJcjIsCVtyMSwgI01TQzJfT0ZGU0VUXQorCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS8qIFN0ZXAgMmI6IEluaXRpYWxpemUgQ2FyZCBJbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkvKiBNRUNSOiBNZW1vcnkgRXhwYW5zaW9uIENhcmQgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJbGRyICAJcjIsCT1DRkdfTUVDUl9WQUwKKwlzdHIgIAlyMiwJW3IxLCAjTUVDUl9PRkZTRVRdCisJbGRyCSAJcjIsCVtyMSwgI01FQ1JfT0ZGU0VUXQorCisJLyogTUNNRU0wOiBDYXJkIEludGVyZmFjZSBzbG90IDAgdGltaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCWxkciAgCXIyLAk9Q0ZHX01DTUVNMF9WQUwKKwlzdHIgIAlyMiwJW3IxLCAjTUNNRU0wX09GRlNFVF0KKwlsZHIJIAlyMiwJW3IxLCAjTUNNRU0wX09GRlNFVF0KKworCS8qIE1DTUVNMTogQ2FyZCBJbnRlcmZhY2Ugc2xvdCAxIHRpbWluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlsZHIgIAlyMiwJPUNGR19NQ01FTTFfVkFMCisJc3RyICAJcjIsCVtyMSwgI01DTUVNMV9PRkZTRVRdCisJbGRyCSAJcjIsCVtyMSwgI01DTUVNMV9PRkZTRVRdCisKKwkvKiBNQ0FUVDA6IENhcmQgSW50ZXJmYWNlIEF0dHJpYnV0ZSBTcGFjZSBUaW1pbmcsIHNsb3QgMCAgICAgICAgICAgICovCisJbGRyICAJcjIsCT1DRkdfTUNBVFQwX1ZBTAorCXN0ciAgCXIyLAlbcjEsICNNQ0FUVDBfT0ZGU0VUXQorCWxkcgkgCXIyLAlbcjEsICNNQ0FUVDBfT0ZGU0VUXQorCisJLyogTUNBVFQxOiBDYXJkIEludGVyZmFjZSBBdHRyaWJ1dGUgU3BhY2UgVGltaW5nLCBzbG90IDEgICAgICAgICAgICAqLworCWxkciAgCXIyLCA9Q0ZHX01DQVRUMV9WQUwKKwlzdHIgIAlyMiwgW3IxLCAjTUNBVFQxX09GRlNFVF0KKwlsZHIJIAlyMiwJW3IxLCAjTUNBVFQxX09GRlNFVF0KKworCS8qIE1DSU8wOiBDYXJkIEludGVyZmFjZSBJL08gU3BhY2UgVGltaW5nLCBzbG90IDAgICAgICAgICAgICAgICAgICAgKi8KKwlsZHIgIAlyMiwgPUNGR19NQ0lPMF9WQUwKKwlzdHIgIAlyMiwgW3IxLCAjTUNJTzBfT0ZGU0VUXQorCWxkcgkgCXIyLAlbcjEsICNNQ0lPMF9PRkZTRVRdCisKKwkvKiBNQ0lPMTogQ2FyZCBJbnRlcmZhY2UgSS9PIFNwYWNlIFRpbWluZywgc2xvdCAxICAgICAgICAgICAgICAgICAgICovCisJbGRyICAJcjIsID1DRkdfTUNJTzFfVkFMCisJc3RyICAJcjIsIFtyMSwgI01DSU8xX09GRlNFVF0KKwlsZHIJIAlyMiwJW3IxLCAjTUNJTzFfT0ZGU0VUXQorCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS8qIFN0ZXAgMmM6IFdyaXRlIEZMWUNORkcgIEZJWE1FOiB3aGF0J3MgdGhhdD8/PyAgICAgICAgICAgICAgICAgICAgKi8KKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvKiBTdGVwIDJkOiBJbml0aWFsaXplIFRpbWluZyBmb3IgU3luYyBNZW1vcnkgKFNEQ0xLMCkgICAgICAgICAgICAgICovCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJLyogQmVmb3JlIGFjY2Vzc2luZyBNRFJFRlIgd2UgbmVlZCBhIHZhbGlkIERSSSBmaWVsZCwgc28gd2Ugc2V0ICAgICAqLworCS8qIHRoaXMgdG8gcG93ZXIgb24gZGVmYXVsdHMgKyBEUkkgZmllbGQsIHNldCBTRFJBTSBjbG9ja3MgZnJlZSBydW5uaW5nICovCisKKwlsZHIgIAlyMywgPUNGR19NRFJFRlJfVkFMCisJbGRyICAJcjIsID0weEZGRgorCWFuZCAgCXIzLCByMywgIHIyCisKKwlsZHIJIAlyMCwJW3IxLCAjTURSRUZSX09GRlNFVF0KKwliaWMJIAlyMCwgcjAsIHIyCisJYmljCSAJcjAsIHIwLCAjKE1EUkVGUl9LMEZSRUV8TURSRUZSX0sxRlJFRXxNRFJFRlJfSzJGUkVFKQorCW9ycgkgCXIwLCByMCwgcjMKKworCXN0cgkJcjAsCVtyMSwgI01EUkVGUl9PRkZTRVRdCS8qIHdyaXRlIGJhY2sgTURSRUZSICAgICAgICAqLworCisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLyogU3RlcCAzOiBJbml0aWFsaXplIFN5bmNocm9ub3VzIFN0YXRpYyBNZW1vcnkgKEZsYXNoL1BlcmlwaGVyYWxzKSAqLworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCS8qIEluaXRpYWxpemUgU1hDTkZHIHJlZ2lzdGVyLiBBc3NlcnQgdGhlIGVuYWJsZSBiaXRzICAgICAgICAgICAgICAgKi8KKworCS8qIFdyaXRlIFNYTVJTIHRvIGNhdXNlIGFuIE1SUyBjb21tYW5kIHRvIGFsbCBlbmFibGVkIGJhbmtzIG9mICAgICAgKi8KKwkvKiBzeW5jaHJvbm91cyBzdGF0aWMgbWVtb3J5LiBOb3RlIHRoYXQgU1hMQ1IgbmVlZCBub3QgYmUgd3JpdHRlbiAgICovCisJLyogYXQgdGhpcyB0aW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisJLyogRklYTUU6IHdlIHVzZSBhc3luYyBtb2RlIGZvciBub3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLyogU3RlcCA0OiBJbml0aWFsaXplIFNEUkFNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCS8qIHNldCBNRFJFRlIgYWNjb3JkaW5nIHRvIHVzZXIgZGVmaW5lIHdpdGggZXhjZXB0aW9uIG9mIGEgZmV3IGJpdHMgKi8KKworCWxkciAgICAgcjQsID1DRkdfTURSRUZSX1ZBTAorCWxkcgkJcjIsID0oTURSRUZSX0swUlVOfE1EUkVGUl9LMERCMnxNRFJFRlJfSzFSVU58TURSRUZSX0sxREIyfFwKKwkJCQkJTURSRUZSX0syUlVOIHxNRFJFRlJfSzJEQjIpCisJYW5kCQlyNCwgcjQsIHIyCisJYmljCQlyMCwJcjAsCXIyCisJb3JyCQlyMCwgcjAsIHI0CisKKwlzdHIgICAgIHIwLCBbcjEsICNNRFJFRlJfT0ZGU0VUXSAgICAvKiB3cml0ZSBiYWNrIE1EUkVGUiAgICAgICAgKi8KKwlsZHIgICAgIHIwLCBbcjEsICNNRFJFRlJfT0ZGU0VUXQorCisJLyogU3RlcCA0YjogZGUtYXNzZXJ0IE1EUkVGUjpTTEZSU0guICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisJYmljCQlyMCwgcjAsCSMoTURSRUZSX1NMRlJTSCkKKwlzdHIgICAgIHIwLCBbcjEsICNNRFJFRlJfT0ZGU0VUXSAgICAvKiB3cml0ZSBiYWNrIE1EUkVGUiAgICAgICAgKi8KKwlsZHIgICAgIHIwLCBbcjEsICNNRFJFRlJfT0ZGU0VUXQorCisKKwkvKiBTdGVwIDRjOiBhc3NlcnQgTURSRUZSOkUxUElOIGFuZCBFMFBJTyBhcyBkZXNpcmVkLCBzZXQgS1hGUkVFICAqLworCisJbGRyICAgICByNCwgPUNGR19NRFJFRlJfVkFMCisJbGRyCQlyMiwgPShNRFJFRlJfRTBQSU58TURSRUZSX0UxUElOfE1EUkVGUl9LMEZSRUV8IFwKKwkJCQkJTURSRUZSX0sxRlJFRSB8IE1EUkVGUl9LMkZSRUUpCisJYW5kCQlyNCwgcjQsIHIyCisJb3JyCQlyMCwgcjAsIHI0CisJc3RyICAgICByMCwgW3IxLCAjTURSRUZSX09GRlNFVF0gICAgLyogd3JpdGUgYmFjayBNRFJFRlIgICAgICAgICovCisJbGRyICAgICByMCwgW3IxLCAjTURSRUZSX09GRlNFVF0KKworCisJLyogU3RlcCA0ZDogd3JpdGUgTURDTkZHIHdpdGggTURDTkZHOkRFeCBkZWFzc2VydGVkIChzZXQgdG8gMCksIHRvICAqLworCS8qICAgICAgICAgIGNvbmZpZ3VyZSBidXQgbm90IGVuYWJsZSBlYWNoIFNEUkFNIHBhcnRpdGlvbiBwYWlyLiAgICAgKi8KKworCWxkcgkJcjQsCT1DRkdfTURDTkZHX1ZBTAorCWJpYwkJcjQsCXI0LAkjKE1EQ05GR19ERTB8TURDTkZHX0RFMSkKKwliaWMJCXI0LCByNCwJIyhNRENORkdfREUyfE1EQ05GR19ERTMpCisJc3RyICAgICByNCwgW3IxLCAjTURDTkZHX09GRlNFVF0JLyogd3JpdGUgYmFjayBNRENORkcgICAgICAgICovCisJbGRyICAgICByNCwgW3IxLCAjTURDTkZHX09GRlNFVF0KKworCisJLyogU3RlcCA0ZTogV2FpdCBmb3IgdGhlIGNsb2NrIHRvIHRoZSBTRFJBTXMgdG8gc3RhYmlsaXplLCAgICAgICAgICAqLworCS8qICAgICAgICAgIDEwMC4uMjAwILVzZWMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworCWxkciAJcjMsID1PU0NSCQkJLyogcmVzZXQgdGhlIE9TIFRpbWVyIENvdW50IHRvIHplcm8gKi8KKwltb3YgCXIyLCAjMAorCXN0ciAJcjIsIFtyM10KKwlsZHIgCXI0LCA9MHgzMDAJCQkvKiByZWFsbHkgMHgyRTEgaXMgYWJvdXQgMjAwdXNlYywgICAqLworCQkJCQkJLyogc28gMHgzMDAgc2hvdWxkIGJlIHBsZW50eSAgICAgICAgKi8KKzE6CisJbGRyIAlyMiwgW3IzXQorCWNtcCAJcjQsIHIyCisJYmd0IAkxYgorCisKKwkvKiBTdGVwIDRmOiBUcmlnZ2VyIGEgbnVtYmVyICh1c3VhbGx5IDgpIHJlZnJlc2ggY3ljbGVzIGJ5ICAgICAgICAgICovCisJLyogICAgICAgICAgYXR0ZW1wdGluZyBub24tYnVyc3QgcmVhZCBvciB3cml0ZSBhY2Nlc3NlcyB0byBkaXNhYmxlZCAqLworCS8qICAgICAgICAgIFNEUkFNLCBhcyBjb21tb25seSBzcGVjaWZpZWQgaW4gdGhlIHBvd2VyIHVwIHNlcXVlbmNlICAgKi8KKwkvKiAgICAgICAgICBkb2N1bWVudGVkIGluIFNEUkFNIGRhdGEgc2hlZXRzLiBUaGUgYWRkcmVzcyhlcykgdXNlZCAgICovCisJLyogICAgICAgICAgZm9yIHRoaXMgcHVycG9zZSBtdXN0IG5vdCBiZSBjYWNoZWFibGUuICAgICAgICAgICAgICAgICAqLworCisJbGRyCQlyMywJPUNGR19EUkFNX0JBU0UKKy5yZXB0IDgKKwlzdHIJCXIyLAlbcjNdCisuZW5kcgorCisJLyogU3RlcCA0ZzogV3JpdGUgTURDTkZHIHdpdGggZW5hYmxlIGJpdHMgYXNzZXJ0ZWQgICAgICAgICAgICAgICAgICAqLworCS8qICAgICAgICAgIChNRENORkc6REV4IHNldCB0byAxKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworCWxkciAgICAgcjMsIFtyMSwgI01EQ05GR19PRkZTRVRdCisJb3JyCXIzLAlyMywJIyhNRENORkdfREUwfE1EQ05GR19ERTEpCisJc3RyICAgICByMywgW3IxLCAjTURDTkZHX09GRlNFVF0KKworCS8qIFN0ZXAgNGg6IFdyaXRlIE1ETVJTLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworCWxkciAgICAgcjIsID1DRkdfTURNUlNfVkFMCisJc3RyICAgICByMiwgW3IxLCAjTURNUlNfT0ZGU0VUXQorCisKKwkvKiBXZSBhcmUgZmluaXNoZWQgd2l0aCBJbnRlbCdzIG1lbW9yeSBjb250cm9sbGVyIGluaXRpYWxpc2F0aW9uICAgICovCisKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvKiBEaXNhYmxlIChtYXNrKSBhbGwgaW50ZXJydXB0cyBhdCBpbnRlcnJ1cHQgY29udHJvbGxlciAgICAgICAgICAgICovCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitpbml0aXJxczoKKworCW1vdiAgICAgcjEsICMwCQkvKiBjbGVhciBpbnQuIGxldmVsIHJlZ2lzdGVyIChJUlEsIG5vdCBGSVEpICovCisJbGRyICAgICByMiwgPUlDTFIKKwlzdHIgICAgIHIxLCBbcjJdCisKKwlsZHIgICAgIHIyLCA9SUNNUgkvKiBtYXNrIGFsbCBpbnRlcnJ1cHRzIGF0IHRoZSBjb250cm9sbGVyICAgICovCisJc3RyICAgICByMSwgW3IyXQorCisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLyogQ2xvY2sgaW5pdGlhbGlzYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworaW5pdGNsa3M6CisKKwkvKiBEaXNhYmxlIHRoZSBwZXJpcGhlcmFsIGNsb2NrcywgYW5kIHNldCB0aGUgY29yZSBjbG9jayBmcmVxdWVuY3kgICovCisKKwkvKiBUdXJuIE9mZiBBTEwgb24tY2hpcCBwZXJpcGhlcmFsIGNsb2NrcyBmb3IgcmUtY29uZmlndXJhdGlvbiAgICAgICovCisJLyogTm90ZTogU2VlIGxhYmVsICdFTkFCTEVDTEtTJyBmb3IgdGhlIHJlLWVuYWJsaW5nICAgICAgICAgICAgICAgICAqLworCWxkciAgICAgcjEsID1DS0VOCisJbW92ICAgICByMiwgIzAKKwlzdHIgICAgIHIyLCBbcjFdCisKKworCS8qIGRlZmF1bHQgdmFsdWUgaW4gY2FzZSBubyB2YWxpZCByb3Rhcnkgc3dpdGNoIHNldHRpbmcgaXMgZm91bmQgICAgKi8KKwlsZHIgICAgIHIyLCA9KENDQ1JfTDI3fENDQ1JfTTJ8Q0NDUl9OMTApICAvKiBERUZBVUxUOiB7MjAwLzIwMC8xMDB9ICovCisKKwkvKiAuLi4gYW5kIHdyaXRlIHRoZSBjb3JlIGNsb2NrIGNvbmZpZyByZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICovCisJbGRyICAgICByMSwgPUNDQ1IKKwlzdHIgICAgIHIyLCBbcjFdCisKKyNpZmRlZiBSVEMKKwkvKiBlbmFibGUgdGhlIDMyS2h6IG9zY2lsbGF0b3IgZm9yIFJUQyBhbmQgUG93ZXJNYW5hZ2VyICAgICAgICAgICAgICovCisKKwlsZHIgICAgIHIxLCA9T1NDQworCW1vdiAgICAgcjIsICNPU0NDX09PTgorCXN0ciAgICAgcjIsIFtyMV0KKworCS8qIE5PVEU6ICBzcGluIGhlcmUgdW50aWwgT1NDQy5PT0sgZ2V0IHNldCwgbWVhbmluZyB0aGUgUExMICAgICAgICAgKi8KKwkvKiBoYXMgc2V0dGxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCis2MDoKKwlsZHIgICAgIHIyLCBbcjFdCisJYW5kcyAgICByMiwgcjIsICMxCisJYmVxICAgICA2MGIKKyNlbmRpZgorCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkvKiBTYXZlIFNEUkFNIHNpemUgKi8KKyAgICBsZHIgICAgIHIxLCA9RFJBTV9TSVpFCisJc3RyICAgCXI4LCBbcjFdCisKKwkvKiBJbnRlcnJ1cHQgaW5pdDogTWFzayBhbGwgaW50ZXJydXB0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgbGRyCQlyMCwJPUlDTVIgLyogZW5hYmxlIG5vIHNvdXJjZXMgKi8KKwltb3YgCXIxLAkjMAorICAgIHN0ciAJcjEsCVtyMF0KKworCS8qIEZJWE1FICovCisKKyNkZWZpbmUgTk9ERUJVRworI2lmZGVmIE5PREVCVUcKKwkvKkRpc2FibGUgc29mdHdhcmUgYW5kIGRhdGEgYnJlYWtwb2ludHMgKi8KKwltb3YJCXIwLCMwCisJbWNyCQlwMTUsMCxyMCxjMTQsYzgsMCAgLyogaWJjcjAgKi8KKwltY3IJCXAxNSwwLHIwLGMxNCxjOSwwICAvKiBpYmNyMSAqLworCW1jcgkJcDE1LDAscjAsYzE0LGM0LDAgIC8qIGRiY29uICovCisKKwkvKkVuYWJsZSBhbGwgZGVidWcgZnVuY3Rpb25hbGl0eSAqLworCW1vdgkJcjAsIzB4ODAwMDAwMDAKKwltY3IJCXAxNCwwLHIwLGMxMCxjMCwwICAvKiBkY3NyICovCisKKyNlbmRpZgorCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS8qIEVuZCBtZW1zZXR1cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2VuZG1lbXNldHVwOgorCisgICAgbW92ICAgICBwYywJbHIKZGlmZiAtLWdpdCBhL2JvYXJkL2NlcmYyNTAvdS1ib290LmxkcyBiL2JvYXJkL2NlcmYyNTAvdS1ib290LmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGMzNzFkCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvY2VyZjI1MC91LWJvb3QubGRzCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworT1VUUFVUX0ZPUk1BVCgiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iKQorT1VUUFVUX0FSQ0goYXJtKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKwkuID0gMHgwMDAwMDAwMDsKKworCS4gPSBBTElHTig0KTsKKwkudGV4dCAgICAgIDoKKwl7CisJICBjcHUvcHhhL3N0YXJ0Lm8JKC50ZXh0KQorCSAgKigudGV4dCkKKwl9CisKKwkuID0gQUxJR04oNCk7CisJLnJvZGF0YSA6IHsgKigucm9kYXRhKSB9CisKKwkuID0gQUxJR04oNCk7CisJLmRhdGEgOiB7ICooLmRhdGEpIH0KKworCS4gPSBBTElHTig0KTsKKwkuZ290IDogeyAqKC5nb3QpIH0KKworCV9fdV9ib290X2NtZF9zdGFydCA9IC47CisJLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KKwlfX3VfYm9vdF9jbWRfZW5kID0gLjsKKworCS4gPSBBTElHTig0KTsKKwlfX2Jzc19zdGFydCA9IC47CisJLmJzcyA6IHsgKiguYnNzKSB9CisJX2VuZCA9IC47Cit9Cg==